diff --git a/.circleci/config.yml b/.circleci/config.yml
index 751ca95b1..4fcc8c618 100644
--- a/.circleci/config.yml
+++ b/.circleci/config.yml
@@ -1,8 +1,8 @@
version: 2.1
orbs:
- ruby: circleci/ruby@1.2.0
- node: circleci/node@4.7.0
+ ruby: circleci/ruby@1.4.0
+ node: circleci/node@5.0.1
executors:
default:
@@ -23,7 +23,7 @@ executors:
environment:
POSTGRES_USER: root
POSTGRES_HOST_AUTH_METHOD: trust
- - image: circleci/redis:6-alpine
+ - image: cimg/redis:6.2
commands:
install-system-dependencies:
@@ -32,7 +32,7 @@ commands:
name: Install system dependencies
command: |
sudo apt-get update
- sudo apt-get install -y libicu-dev libidn11-dev libprotobuf-dev protobuf-compiler
+ sudo apt-get install -y libicu-dev libidn11-dev
install-ruby-dependencies:
parameters:
ruby-version:
@@ -45,7 +45,7 @@ commands:
bundle config without 'development production'
name: Set bundler settings
- ruby/install-deps:
- bundler-version: '2.2.31'
+ bundler-version: '2.3.8'
key: ruby<< parameters.ruby-version >>-gems-v1
wait-db:
steps:
@@ -127,9 +127,18 @@ jobs:
- run:
command: ./bin/rails tests:migrations:populate_v2
name: Populate database with test data
+ - run:
+ command: ./bin/rails db:migrate VERSION=20180514140000
+ name: Run migrations up to v2.4.0
+ - run:
+ command: ./bin/rails tests:migrations:populate_v2_4
+ name: Populate database with test data
- run:
command: ./bin/rails db:migrate
name: Run all remaining migrations
+ - run:
+ command: ./bin/rails tests:migrations:check_database
+ name: Check migration result
test-two-step-migrations:
executor:
@@ -150,14 +159,25 @@ jobs:
- run:
command: ./bin/rails tests:migrations:populate_v2
name: Populate database with test data
+ - run:
+ command: ./bin/rails db:migrate VERSION=20180514140000
+ name: Run pre-deployment migrations up to v2.4.0
+ environment:
+ SKIP_POST_DEPLOYMENT_MIGRATIONS: true
+ - run:
+ command: ./bin/rails tests:migrations:populate_v2_4
+ name: Populate database with test data
- run:
command: ./bin/rails db:migrate
name: Run all pre-deployment migrations
- evironment:
+ environment:
SKIP_POST_DEPLOYMENT_MIGRATIONS: true
- run:
command: ./bin/rails db:migrate
name: Run all post-deployment remaining migrations
+ - run:
+ command: ./bin/rails tests:migrations:check_database
+ name: Check migration result
workflows:
version: 2
diff --git a/.codeclimate.yml b/.codeclimate.yml
index c253bd95a..ee9022cda 100644
--- a/.codeclimate.yml
+++ b/.codeclimate.yml
@@ -1,4 +1,4 @@
-version: "2"
+version: '2'
checks:
argument-count:
enabled: false
@@ -34,8 +34,8 @@ plugins:
sass-lint:
enabled: true
exclude_patterns:
-- spec/
-- vendor/asset/
+ - spec/
+ - vendor/asset/
-- app/javascript/mastodon/locales/**/*.json
-- config/locales/**/*.yml
+ - app/javascript/mastodon/locales/**/*.json
+ - config/locales/**/*.yml
diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile
new file mode 100644
index 000000000..ac495e1c9
--- /dev/null
+++ b/.devcontainer/Dockerfile
@@ -0,0 +1,24 @@
+# [Choice] Ruby version (use -bullseye variants on local arm64/Apple Silicon): 3, 3.1, 3.0, 2, 2.7, 2.6, 3-bullseye, 3.1-bullseye, 3.0-bullseye, 2-bullseye, 2.7-bullseye, 2.6-bullseye, 3-buster, 3.1-buster, 3.0-buster, 2-buster, 2.7-buster, 2.6-buster
+ARG VARIANT=3.1-bullseye
+FROM mcr.microsoft.com/vscode/devcontainers/ruby:${VARIANT}
+
+# Install Rails
+# RUN gem install rails webdrivers
+
+# Default value to allow debug server to serve content over GitHub Codespace's port forwarding service
+# The value is a comma-separated list of allowed domains
+ENV RAILS_DEVELOPMENT_HOSTS=".githubpreview.dev"
+
+# [Choice] Node.js version: lts/*, 16, 14, 12, 10
+ARG NODE_VERSION="lts/*"
+RUN su vscode -c "source /usr/local/share/nvm/nvm.sh && nvm install ${NODE_VERSION} 2>&1"
+
+# [Optional] Uncomment this section to install additional OS packages.
+RUN apt-get update && export DEBIAN_FRONTEND=noninteractive \
+ && apt-get -y install --no-install-recommends libicu-dev libidn11-dev ffmpeg imagemagick libpam-dev
+
+# [Optional] Uncomment this line to install additional gems.
+RUN gem install foreman
+
+# [Optional] Uncomment this line to install global node packages.
+RUN su vscode -c "source /usr/local/share/nvm/nvm.sh && npm install -g yarn" 2>&1
diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json
new file mode 100644
index 000000000..628efc8ec
--- /dev/null
+++ b/.devcontainer/devcontainer.json
@@ -0,0 +1,26 @@
+{
+ "name": "Mastodon",
+ "dockerComposeFile": "docker-compose.yml",
+ "service": "app",
+ "workspaceFolder": "/workspaces/mastodon",
+
+ // Set *default* container specific settings.json values on container create.
+ "settings": {},
+
+ // Add the IDs of extensions you want installed when the container is created.
+ "extensions": [
+ "EditorConfig.EditorConfig",
+ "dbaeumer.vscode-eslint",
+ "rebornix.Ruby"
+ ],
+
+ // Use 'forwardPorts' to make a list of ports inside the container available locally.
+ // This can be used to network with other containers or the host.
+ "forwardPorts": [3000, 4000],
+
+ // Use 'postCreateCommand' to run commands after the container is created.
+ "postCreateCommand": "bundle install --path vendor/bundle && yarn install && ./bin/rails db:setup",
+
+ // Comment out to connect as root instead. More info: https://aka.ms/vscode-remote/containers/non-root.
+ "remoteUser": "vscode"
+}
diff --git a/.devcontainer/docker-compose.yml b/.devcontainer/docker-compose.yml
new file mode 100644
index 000000000..538f6cccd
--- /dev/null
+++ b/.devcontainer/docker-compose.yml
@@ -0,0 +1,83 @@
+version: '3'
+
+services:
+ app:
+ build:
+ context: .
+ dockerfile: Dockerfile
+ args:
+ # Update 'VARIANT' to pick a version of Ruby: 3, 3.1, 3.0, 2, 2.7, 2.6
+ # Append -bullseye or -buster to pin to an OS version.
+ # Use -bullseye variants on local arm64/Apple Silicon.
+ VARIANT: '3.0-bullseye'
+ # Optional Node.js version to install
+ NODE_VERSION: '14'
+ volumes:
+ - ..:/workspaces/mastodon:cached
+ environment:
+ RAILS_ENV: development
+ NODE_ENV: development
+
+ REDIS_HOST: redis
+ REDIS_PORT: '6379'
+ DB_HOST: db
+ DB_USER: postgres
+ DB_PASS: postgres
+ DB_PORT: '5432'
+ ES_ENABLED: 'true'
+ ES_HOST: es
+ ES_PORT: '9200'
+ # Overrides default command so things don't shut down after the process ends.
+ command: sleep infinity
+ networks:
+ - external_network
+ - internal_network
+ user: vscode
+
+ db:
+ image: postgres:14-alpine
+ restart: unless-stopped
+ volumes:
+ - postgres-data:/var/lib/postgresql/data
+ environment:
+ POSTGRES_USER: postgres
+ POSTGRES_DB: postgres
+ POSTGRES_PASSWORD: postgres
+ POSTGRES_HOST_AUTH_METHOD: trust
+ networks:
+ - internal_network
+
+ redis:
+ image: redis:6-alpine
+ restart: unless-stopped
+ volumes:
+ - redis-data:/data
+ networks:
+ - internal_network
+
+ es:
+ image: docker.elastic.co/elasticsearch/elasticsearch-oss:7.10.2
+ restart: unless-stopped
+ environment:
+ ES_JAVA_OPTS: -Xms512m -Xmx512m
+ cluster.name: es-mastodon
+ discovery.type: single-node
+ bootstrap.memory_lock: 'true'
+ volumes:
+ - es-data:/usr/share/elasticsearch/data
+ networks:
+ - internal_network
+ ulimits:
+ memlock:
+ soft: -1
+ hard: -1
+
+volumes:
+ postgres-data:
+ redis-data:
+ es-data:
+
+networks:
+ external_network:
+ internal_network:
+ internal: true
diff --git a/.env.production.sample b/.env.production.sample
index 7de5e00f4..0df0a8778 100644
--- a/.env.production.sample
+++ b/.env.production.sample
@@ -107,7 +107,7 @@ SMTP_SERVER=smtp.mailgun.org
SMTP_PORT=587
SMTP_LOGIN=
SMTP_PASSWORD=
-SMTP_FROM_ADDRESS=notificatons@example.com
+SMTP_FROM_ADDRESS=notifications@example.com
# File storage (optional)
diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS
deleted file mode 100644
index fd6f74689..000000000
--- a/.github/CODEOWNERS
+++ /dev/null
@@ -1,32 +0,0 @@
-# CODEOWNERS for mastodon/mastodon
-
-# Translators
-# To add translator, copy these lines, replace `fr` with appropriate language code and replace `@żelipapą` with user's GitHub nickname preceded by `@` sign or e-mail address.
-# /app/javascript/mastodon/locales/fr.json @żelipapą
-# /app/views/user_mailer/*.fr.html.erb @żelipapą
-# /app/views/user_mailer/*.fr.text.erb @żelipapą
-# /config/locales/*.fr.yml @żelipapą
-# /config/locales/fr.yml @żelipapą
-
-# Polish
-/app/javascript/mastodon/locales/pl.json @m4sk1n
-/app/views/user_mailer/*.pl.html.erb @m4sk1n
-/app/views/user_mailer/*.pl.text.erb @m4sk1n
-/config/locales/*.pl.yml @m4sk1n
-/config/locales/pl.yml @m4sk1n
-
-# French
-/app/javascript/mastodon/locales/fr.json @aldarone
-/app/javascript/mastodon/locales/whitelist_fr.json @aldarone
-/app/views/user_mailer/*.fr.html.erb @aldarone
-/app/views/user_mailer/*.fr.text.erb @aldarone
-/config/locales/*.fr.yml @aldarone
-/config/locales/fr.yml @aldarone
-
-# Dutch
-/app/javascript/mastodon/locales/nl.json @jeroenpraat
-/app/javascript/mastodon/locales/whitelist_nl.json @jeroenpraat
-/app/views/user_mailer/*.nl.html.erb @jeroenpraat
-/app/views/user_mailer/*.nl.text.erb @jeroenpraat
-/config/locales/*.nl.yml @jeroenpraat
-/config/locales/nl.yml @jeroenpraat
diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml
index 9526e17db..be750a5e4 100644
--- a/.github/FUNDING.yml
+++ b/.github/FUNDING.yml
@@ -1,3 +1,3 @@
patreon: mastodon
open_collective: mastodon
-github: [Gargron]
+custom: https://sponsor.joinmastodon.org
diff --git a/.github/ISSUE_TEMPLATE/2.feature_request.yml b/.github/ISSUE_TEMPLATE/2.feature_request.yml
index 00aad1341..6626c2876 100644
--- a/.github/ISSUE_TEMPLATE/2.feature_request.yml
+++ b/.github/ISSUE_TEMPLATE/2.feature_request.yml
@@ -1,5 +1,6 @@
name: Feature Request
description: I have a suggestion
+labels: suggestion
body:
- type: markdown
attributes:
diff --git a/.github/ISSUE_TEMPLATE/3.support.md b/.github/ISSUE_TEMPLATE/3.support.md
deleted file mode 100644
index e2217da8b..000000000
--- a/.github/ISSUE_TEMPLATE/3.support.md
+++ /dev/null
@@ -1,10 +0,0 @@
----
-name: Support
-about: Ask for help with your deployment
-title: DO NOT CREATE THIS ISSUE
----
-
-We primarily use GitHub as a bug and feature tracker. For usage questions, troubleshooting of deployments and other individual technical assistance, please use one of the resources below:
-
-- https://discourse.joinmastodon.org
-- #mastodon on irc.freenode.net
diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml
index 768868516..7c0dbaf67 100644
--- a/.github/ISSUE_TEMPLATE/config.yml
+++ b/.github/ISSUE_TEMPLATE/config.yml
@@ -1,5 +1,8 @@
blank_issues_enabled: false
contact_links:
- - name: Mastodon Meta Discussion Board
- url: https://discourse.joinmastodon.org/
+ - name: GitHub Discussions
+ url: https://github.com/mastodon/mastodon/discussions
about: Please ask and answer questions here.
+ - name: Bug Bounty Program
+ url: https://app.intigriti.com/programs/mastodon/mastodonio/detail
+ about: Please report security vulnerabilities here.
diff --git a/.github/workflows/build-image.yml b/.github/workflows/build-image.yml
index 58f2813d3..880fdfac9 100644
--- a/.github/workflows/build-image.yml
+++ b/.github/workflows/build-image.yml
@@ -3,32 +3,41 @@ on:
workflow_dispatch:
push:
branches:
- - "main"
+ - 'main'
tags:
- - "*"
+ - '*'
+ pull_request:
+ paths:
+ - .github/workflows/build-image.yml
+ - Dockerfile
jobs:
build-image:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
+ - uses: docker/setup-qemu-action@v1
- uses: docker/setup-buildx-action@v1
- uses: docker/login-action@v1
with:
- username: ${{ secrets.DOCKERHUB_USERNAME }}
- password: ${{ secrets.DOCKERHUB_TOKEN }}
+ registry: ghcr.io
+ username: ${{ github.repository_owner }}
+ password: ${{ secrets.GITHUB_TOKEN }}
+ if: github.event_name != 'pull_request'
- uses: docker/metadata-action@v3
id: meta
with:
- images: tootsuite/mastodon
+ images: ghcr.io/${{ github.repository_owner }}/mastodon
flavor: |
- latest=auto
+ latest=true
tags: |
type=edge,branch=main
- type=semver,pattern={{ raw }}
+ type=match,pattern=v(.*),group=0
+ type=ref,event=pr
- uses: docker/build-push-action@v2
with:
context: .
- push: true
+ platforms: linux/amd64,linux/arm64
+ push: ${{ github.event_name != 'pull_request' }}
tags: ${{ steps.meta.outputs.tags }}
- cache-from: type=registry,ref=tootsuite/mastodon:latest
+ cache-from: type=registry,ref=ghcr.io/${{ github.repository_owner }}/mastodon:latest
cache-to: type=inline
diff --git a/.github/workflows/check-i18n.yml b/.github/workflows/check-i18n.yml
index 2e8f230f3..be38a096d 100644
--- a/.github/workflows/check-i18n.yml
+++ b/.github/workflows/check-i18n.yml
@@ -2,9 +2,9 @@ name: Check i18n
on:
push:
- branches: [ main ]
+ branches: [main]
pull_request:
- branches: [ main ]
+ branches: [main]
env:
RAILS_ENV: test
@@ -14,21 +14,21 @@ jobs:
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v2
- - name: Install system dependencies
- run: |
- sudo apt-get update
- sudo apt-get install -y libicu-dev libidn11-dev libprotobuf-dev protobuf-compiler
- - name: Set up Ruby
- uses: ruby/setup-ruby@v1
- with:
- ruby-version: '3.0'
- bundler-cache: true
- - name: Check locale file normalization
- run: bundle exec i18n-tasks check-normalized
- - name: Check for unused strings
- run: bundle exec i18n-tasks unused -l en
- - name: Check for wrong string interpolations
- run: bundle exec i18n-tasks check-consistent-interpolations
- - name: Check that all required locale files exist
- run: bundle exec rake repo:check_locales_files
+ - uses: actions/checkout@v2
+ - name: Install system dependencies
+ run: |
+ sudo apt-get update
+ sudo apt-get install -y libicu-dev libidn11-dev
+ - name: Set up Ruby
+ uses: ruby/setup-ruby@v1
+ with:
+ ruby-version: '3.0'
+ bundler-cache: true
+ - name: Check locale file normalization
+ run: bundle exec i18n-tasks check-normalized
+ - name: Check for unused strings
+ run: bundle exec i18n-tasks unused -l en
+ - name: Check for wrong string interpolations
+ run: bundle exec i18n-tasks check-consistent-interpolations
+ - name: Check that all required locale files exist
+ run: bundle exec rake repo:check_locales_files
diff --git a/.prettierignore b/.prettierignore
new file mode 100644
index 000000000..de7673eb6
--- /dev/null
+++ b/.prettierignore
@@ -0,0 +1,78 @@
+# See https://help.github.com/articles/ignoring-files for more about ignoring files.
+#
+# If you find yourself ignoring temporary files generated by your text editor
+# or operating system, you probably want to add a global ignore instead:
+# git config --global core.excludesfile '~/.gitignore_global'
+
+# Ignore bundler config and downloaded libraries.
+/.bundle
+/vendor/bundle
+
+# Ignore the default SQLite database.
+/db/*.sqlite3
+/db/*.sqlite3-journal
+
+# Ignore all logfiles and tempfiles.
+.eslintcache
+/log/*
+!/log/.keep
+/tmp
+/coverage
+/public/system
+/public/assets
+/public/packs
+/public/packs-test
+.env
+.env.production
+.env.development
+/node_modules/
+/build/
+
+# Ignore Vagrant files
+.vagrant/
+
+# Ignore Capistrano customizations
+/config/deploy/*
+
+# Ignore IDE files
+.vscode/
+.idea/
+
+# Ignore postgres + redis + elasticsearch volume optionally created by docker-compose
+/postgres
+/postgres14
+/redis
+/elasticsearch
+
+# ignore Helm dependency charts
+/chart/charts/*.tgz
+
+# Ignore Apple files
+.DS_Store
+
+# Ignore vim files
+*~
+*.swp
+
+# Ignore npm debug log
+npm-debug.log
+
+# Ignore yarn log files
+yarn-error.log
+yarn-debug.log
+
+# Ignore vagrant log files
+*-cloudimg-console.log
+
+# Ignore Docker option files
+docker-compose.override.yml
+
+# Ignore Helm files
+/chart
+
+# Ignore emoji map file
+/app/javascript/mastodon/features/emoji/emoji_map.json
+
+# Ignore locale files
+/app/javascript/mastodon/locales
+/config/locales
diff --git a/.prettierrc.js b/.prettierrc.js
new file mode 100644
index 000000000..1d70813d5
--- /dev/null
+++ b/.prettierrc.js
@@ -0,0 +1,3 @@
+module.exports = {
+ singleQuote: true
+}
diff --git a/.rubocop.yml b/.rubocop.yml
index cb7c73ec7..a76937426 100644
--- a/.rubocop.yml
+++ b/.rubocop.yml
@@ -14,8 +14,8 @@ AllCops:
- 'node_modules/**/*'
- 'Vagrantfile'
- 'vendor/**/*'
- - 'lib/json_ld/*'
- - 'lib/templates/**/*'
+ - 'lib/json_ld/*'
+ - 'lib/templates/**/*'
Bundler/OrderedGems:
Enabled: false
@@ -29,13 +29,17 @@ Layout/EmptyLineAfterMagicComment:
Layout/EmptyLineAfterGuardClause:
Enabled: false
+Layout/EmptyLineBetweenDefs:
+ AllowAdjacentOneLineDefs: true
+
Layout/EmptyLinesAroundAttributeAccessor:
Enabled: true
+Layout/FirstHashElementIndentation:
+ EnforcedStyle: consistent
+
Layout/HashAlignment:
Enabled: false
- # EnforcedHashRocketStyle: table
- # EnforcedColonStyle: table
Layout/SpaceAroundMethodCallOperator:
Enabled: true
diff --git a/AUTHORS.md b/AUTHORS.md
index 596451737..9fc5f44f1 100644
--- a/AUTHORS.md
+++ b/AUTHORS.md
@@ -12,31 +12,32 @@ and provided thanks to the work of the following contributors:
* [akihikodaki](https://github.com/akihikodaki)
* [mjankowski](https://github.com/mjankowski)
* [unarist](https://github.com/unarist)
+* [noellabo](https://github.com/noellabo)
* [abcang](https://github.com/abcang)
* [yiskah](https://github.com/yiskah)
-* [noellabo](https://github.com/noellabo)
-* [nolanlawson](https://github.com/nolanlawson)
* [mayaeh](https://github.com/mayaeh)
+* [nolanlawson](https://github.com/nolanlawson)
* [ysksn](https://github.com/ysksn)
+* [tribela](https://github.com/tribela)
* [sorin-davidoi](https://github.com/sorin-davidoi)
* [lynlynlynx](https://github.com/lynlynlynx)
* [m4sk1n](mailto:me@m4sk.in)
* [Marcin Mikołajczak](mailto:me@m4sk.in)
-* [tribela](https://github.com/tribela)
* [renatolond](https://github.com/renatolond)
+* [shleeable](https://github.com/shleeable)
* [alpaca-tc](https://github.com/alpaca-tc)
* [zunda](https://github.com/zunda)
* [nclm](https://github.com/nclm)
* [ineffyble](https://github.com/ineffyble)
-* [shleeable](https://github.com/shleeable)
+* [ariasuni](https://github.com/ariasuni)
* [Masoud Abkenar](mailto:ampbox@gmail.com)
* [blackle](https://github.com/blackle)
* [Quent-in](https://github.com/Quent-in)
* [JantsoP](https://github.com/JantsoP)
-* [ariasuni](https://github.com/ariasuni)
+* [Brawaru](https://github.com/Brawaru)
* [nullkal](https://github.com/nullkal)
* [yookoala](https://github.com/yookoala)
-* [Brawaru](https://github.com/Brawaru)
+* [dunn](https://github.com/dunn)
* [Aditoo17](https://github.com/Aditoo17)
* [Quenty31](https://github.com/Quenty31)
* [marek-lach](https://github.com/marek-lach)
@@ -46,10 +47,9 @@ and provided thanks to the work of the following contributors:
* [eramdam](https://github.com/eramdam)
* [Jeroen](mailto:jeroenpraat@users.noreply.github.com)
* [takayamaki](https://github.com/takayamaki)
-* [dunn](https://github.com/dunn)
* [masarakki](https://github.com/masarakki)
-* [ticky](https://github.com/ticky)
* [trwnh](https://github.com/trwnh)
+* [ticky](https://github.com/ticky)
* [ThisIsMissEm](https://github.com/ThisIsMissEm)
* [hinaloe](https://github.com/hinaloe)
* [hcmiya](https://github.com/hcmiya)
@@ -73,13 +73,13 @@ and provided thanks to the work of the following contributors:
* [MaciekBaron](https://github.com/MaciekBaron)
* [SerCom_KC](mailto:sercom-kc@users.noreply.github.com)
* [Sylvhem](https://github.com/Sylvhem)
+* [koyuawsmbrtn](https://github.com/koyuawsmbrtn)
* [MitarashiDango](https://github.com/MitarashiDango)
* [rinsuki](https://github.com/rinsuki)
* [angristan](https://github.com/angristan)
* [JeanGauthier](https://github.com/JeanGauthier)
* [kschaper](https://github.com/kschaper)
* [beatrix-bitrot](https://github.com/beatrix-bitrot)
-* [koyuawsmbrtn](https://github.com/koyuawsmbrtn)
* [BenLubar](https://github.com/BenLubar)
* [mkljczk](https://github.com/mkljczk)
* [adbelle](https://github.com/adbelle)
@@ -89,11 +89,12 @@ and provided thanks to the work of the following contributors:
* [yhirano55](https://github.com/yhirano55)
* [devkral](https://github.com/devkral)
* [camponez](https://github.com/camponez)
-* [hugogameiro](https://github.com/hugogameiro)
+* [Hugo Gameiro](mailto:hmgameiro@gmail.com)
* [SerCom_KC](mailto:szescxz@gmail.com)
* [aschmitz](https://github.com/aschmitz)
* [mfmfuyu](https://github.com/mfmfuyu)
* [kedamaDQ](https://github.com/kedamaDQ)
+* [mashirozx](https://github.com/mashirozx)
* [fpiesche](https://github.com/fpiesche)
* [gandaro](https://github.com/gandaro)
* [johnsudaar](https://github.com/johnsudaar)
@@ -115,41 +116,41 @@ and provided thanks to the work of the following contributors:
* [pfm-eyesightjp](https://github.com/pfm-eyesightjp)
* [fakenine](https://github.com/fakenine)
* [tsuwatch](https://github.com/tsuwatch)
+* [progval](https://github.com/progval)
* [victorhck](https://github.com/victorhck)
-* [manuelviens](https://github.com/manuelviens)
+* [manuelviens](mailto:manuelviens@users.noreply.github.com)
* [tateisu](https://github.com/tateisu)
* [fvh-P](https://github.com/fvh-P)
+* [lfuelling](https://github.com/lfuelling)
* [rtucker](https://github.com/rtucker)
* [Anna e só](mailto:contraexemplos@gmail.com)
* [dariusk](https://github.com/dariusk)
* [kazu9su](https://github.com/kazu9su)
-* [Komic](https://github.com/Komic)
+* [komic](https://github.com/komic)
* [lmorchard](https://github.com/lmorchard)
* [diomed](https://github.com/diomed)
* [Neetshin](mailto:neetshin@neetsh.in)
* [rainyday](https://github.com/rainyday)
* [tcitworld](https://github.com/tcitworld)
-* [ProgVal](https://github.com/ProgVal)
* [valentin2105](https://github.com/valentin2105)
* [yuntan](https://github.com/yuntan)
* [goofy-bz](mailto:goofy@babelzilla.org)
* [kadiix](https://github.com/kadiix)
* [kodacs](https://github.com/kodacs)
* [marcin mikołajczak](mailto:me@m4sk.in)
+* [berkes](https://github.com/berkes)
* [KScl](https://github.com/KScl)
* [sterdev](https://github.com/sterdev)
-* [mashirozx](https://github.com/mashirozx)
* [TheKinrar](https://github.com/TheKinrar)
-* [007lva](https://github.com/007lva)
* [AA4ch1](https://github.com/AA4ch1)
* [alexgleason](https://github.com/alexgleason)
-* [Bèr Kessels](mailto:ber@berk.es)
* [cpytel](https://github.com/cpytel)
* [northerner](https://github.com/northerner)
+* [weex](https://github.com/weex)
* [fhemberger](https://github.com/fhemberger)
* [Gomasy](https://github.com/Gomasy)
* [greysteil](https://github.com/greysteil)
-* [hendotcat](https://github.com/hendotcat)
+* [henrycatalinismith](https://github.com/henrycatalinismith)
* [d6rkaiz](https://github.com/d6rkaiz)
* [ladyisatis](https://github.com/ladyisatis)
* [JMendyk](https://github.com/JMendyk)
@@ -160,6 +161,8 @@ and provided thanks to the work of the following contributors:
* [pawelngei](https://github.com/pawelngei)
* [reneklacan](https://github.com/reneklacan)
* [ekiru](https://github.com/ekiru)
+* [Izorkin](https://github.com/Izorkin)
+* [unasuke](https://github.com/unasuke)
* [geta6](https://github.com/geta6)
* [happycoloredbanana](https://github.com/happycoloredbanana)
* [joenepraat](https://github.com/joenepraat)
@@ -168,11 +171,11 @@ and provided thanks to the work of the following contributors:
* [spla](mailto:sp@mastodont.cat)
* [tomfhowe](https://github.com/tomfhowe)
* [noraworld](https://github.com/noraworld)
-* [lfuelling](https://github.com/lfuelling)
* [aji-su](https://github.com/aji-su)
+* [ikuradon](https://github.com/ikuradon)
* [nzws](https://github.com/nzws)
* [duxovni](https://github.com/duxovni)
-* [smorimoto](https://github.com/smorimoto)
+* [SuperSandro2000](https://github.com/SuperSandro2000)
* [178inaba](https://github.com/178inaba)
* [acid-chicken](https://github.com/acid-chicken)
* [xgess](https://github.com/xgess)
@@ -194,37 +197,37 @@ and provided thanks to the work of the following contributors:
* [Dar13](https://github.com/Dar13)
* [nevillepark](https://github.com/nevillepark)
* [ornithocoder](https://github.com/ornithocoder)
-* [pwoolcoc](https://github.com/pwoolcoc)
+* [Paul Woolcock](mailto:paul@woolcock.us)
* [pierreozoux](https://github.com/pierreozoux)
* [qguv](https://github.com/qguv)
* [Ram Lmn](mailto:ramlmn@users.noreply.github.com)
+* [rgroothuijsen](https://github.com/rgroothuijsen)
* [Sascha](mailto:sascha@serenitylabs.cloud)
* [harukasan](https://github.com/harukasan)
* [stamak](https://github.com/stamak)
* [Technowix](https://github.com/Technowix)
* [Zoeille](https://github.com/Zoeille)
-* [Thor Harald Johansen](mailto:thj@thj.no)
+* [Thorwegian](https://github.com/Thorwegian)
* [0x70b1a5](https://github.com/0x70b1a5)
* [gled-rs](https://github.com/gled-rs)
* [Valentin_NC](mailto:valentin.ouvrard@nautile.sarl)
* [R0ckweb](https://github.com/R0ckweb)
-* [Izorkin](https://github.com/Izorkin)
-* [unasuke](https://github.com/unasuke)
* [caasi](https://github.com/caasi)
+* [chandrn7](https://github.com/chandrn7)
* [chr-1x](https://github.com/chr-1x)
* [esetomo](https://github.com/esetomo)
* [foxiehkins](https://github.com/foxiehkins)
* [highemerly](https://github.com/highemerly)
* [hoodie](mailto:hoodiekitten@outlook.com)
* [kaiyou](https://github.com/kaiyou)
+* [007lva](https://github.com/007lva)
* [luzi82](https://github.com/luzi82)
* [slice](https://github.com/slice)
* [tmm576](https://github.com/tmm576)
* [unsmell](mailto:unsmell@users.noreply.github.com)
* [valerauko](https://github.com/valerauko)
+* [Grawl](https://github.com/Grawl)
* [chriswmartin](https://github.com/chriswmartin)
-* [SuperSandro2000](https://github.com/SuperSandro2000)
-* [ikuradon](https://github.com/ikuradon)
* [AndreLewin](https://github.com/AndreLewin)
* [0xflotus](https://github.com/0xflotus)
* [redtachyons](https://github.com/redtachyons)
@@ -234,18 +237,21 @@ and provided thanks to the work of the following contributors:
* [Andrew](mailto:andrewlchronister@gmail.com)
* [arielrodrigues](https://github.com/arielrodrigues)
* [aurelien-reeves](https://github.com/aurelien-reeves)
+* [BSKY](mailto:git@bsky.moe)
* [elegaanz](https://github.com/elegaanz)
* [estuans](https://github.com/estuans)
* [dissolve](https://github.com/dissolve)
* [PurpleBooth](https://github.com/PurpleBooth)
* [bradurani](https://github.com/bradurani)
* [wavebeem](https://github.com/wavebeem)
-* [bruwalfas](https://github.com/bruwalfas)
+* [thermosflasche](https://github.com/thermosflasche)
* [LottieVixen](https://github.com/LottieVixen)
* [wchristian](https://github.com/wchristian)
* [muffinista](https://github.com/muffinista)
* [cdutson](https://github.com/cdutson)
* [farlistener](https://github.com/farlistener)
+* [baby-gnu](https://github.com/baby-gnu)
+* [danieljakots](https://github.com/danieljakots)
* [divergentdave](https://github.com/divergentdave)
* [DavidLibeau](https://github.com/DavidLibeau)
* [dmerejkowsky](https://github.com/dmerejkowsky)
@@ -256,8 +262,10 @@ and provided thanks to the work of the following contributors:
* [unstabler](https://github.com/unstabler)
* [potato4d](https://github.com/potato4d)
* [h-izumi](https://github.com/h-izumi)
+* [HolgerHuo](https://github.com/HolgerHuo)
* [ErikXXon](https://github.com/ErikXXon)
* [ian-kelling](https://github.com/ian-kelling)
+* [eltociear](https://github.com/eltociear)
* [immae](https://github.com/immae)
* [J0WI](https://github.com/J0WI)
* [vahnj](https://github.com/vahnj)
@@ -283,10 +291,12 @@ and provided thanks to the work of the following contributors:
* [Nathaniel Suchy](mailto:me@lunorian.is)
* [ndarville](https://github.com/ndarville)
* [NimaBoscarino](https://github.com/NimaBoscarino)
+* [aquarla](https://github.com/aquarla)
* [Abzol](https://github.com/Abzol)
* [PatOnTheBack](https://github.com/PatOnTheBack)
* [xPaw](https://github.com/xPaw)
* [petzah](https://github.com/petzah)
+* [PeterDaveHello](https://github.com/PeterDaveHello)
* [ignisf](https://github.com/ignisf)
* [lumenwrites](https://github.com/lumenwrites)
* [remram44](https://github.com/remram44)
@@ -310,25 +320,30 @@ and provided thanks to the work of the following contributors:
* [yannicka](https://github.com/yannicka)
* [ikasoumen](https://github.com/ikasoumen)
* [zacanger](https://github.com/zacanger)
+* [l2dy](https://github.com/l2dy)
* [amazedkoumei](https://github.com/amazedkoumei)
* [anon5r](https://github.com/anon5r)
* [aus-social](https://github.com/aus-social)
+* [bsky](mailto:git@bsky.moe)
* [bsky](mailto:me@imbsky.net)
-* [chandrn7](https://github.com/chandrn7)
* [codl](https://github.com/codl)
* [cpsdqs](https://github.com/cpsdqs)
* [barzamin](https://github.com/barzamin)
* [gol-cha](https://github.com/gol-cha)
+* [gunchleoc](https://github.com/gunchleoc)
* [fhalna](https://github.com/fhalna)
* [haoyayoi](https://github.com/haoyayoi)
* [ik11235](https://github.com/ik11235)
* [kawax](https://github.com/kawax)
* [shrft](https://github.com/shrft)
+* [luigi](mailto:lvargas@rankia.com)
+* [luzpaz](https://github.com/luzpaz)
* [mbajur](https://github.com/mbajur)
* [matsurai25](https://github.com/matsurai25)
* [mecab](https://github.com/mecab)
* [nicobz25](https://github.com/nicobz25)
* [niwatori24](https://github.com/niwatori24)
+* [noiob](https://github.com/noiob)
* [oliverkeeble](https://github.com/oliverkeeble)
* [partev](https://github.com/partev)
* [pinfort](https://github.com/pinfort)
@@ -341,7 +356,6 @@ and provided thanks to the work of the following contributors:
* [vidarlee](https://github.com/vidarlee)
* [vjackson725](https://github.com/vjackson725)
* [wxcafe](https://github.com/wxcafe)
-* [Grawl](https://github.com/Grawl)
* [新都心(Neet Shin)](mailto:nucx@dio-vox.com)
* [clarfonthey](https://github.com/clarfonthey)
* [cygnan](https://github.com/cygnan)
@@ -390,7 +404,6 @@ and provided thanks to the work of the following contributors:
* [Brad Janke](mailto:brad.janke@gmail.com)
* [bclindner](https://github.com/bclindner)
* [brycied00d](https://github.com/brycied00d)
-* [berkes](https://github.com/berkes)
* [carlosjs23](https://github.com/carlosjs23)
* [cgxxx](https://github.com/cgxxx)
* [kibitan](https://github.com/kibitan)
@@ -411,7 +424,6 @@ and provided thanks to the work of the following contributors:
* [dalehenries](https://github.com/dalehenries)
* [daprice](https://github.com/daprice)
* [da2x](https://github.com/da2x)
-* [danieljakots](https://github.com/danieljakots)
* [codesections](https://github.com/codesections)
* [dar5hak](https://github.com/dar5hak)
* [kant](https://github.com/kant)
@@ -420,7 +432,7 @@ and provided thanks to the work of the following contributors:
* [caldwell](https://github.com/caldwell)
* [davidcelis](https://github.com/davidcelis)
* [davefp](https://github.com/davefp)
-* [yipdw](https://github.com/yipdw)
+* [hannahwhy](https://github.com/hannahwhy)
* [debanshuk](https://github.com/debanshuk)
* [mascali33](https://github.com/mascali33)
* [DerekNonGeneric](https://github.com/DerekNonGeneric)
@@ -445,20 +457,20 @@ and provided thanks to the work of the following contributors:
* [GenbuHase](https://github.com/GenbuHase)
* [nilsding](https://github.com/nilsding)
* [hattori6789](https://github.com/hattori6789)
-* [algernon](https://github.com/algernon)
-* [Fastbyte01](https://github.com/Fastbyte01)
-* [unrelentingtech](https://github.com/unrelentingtech)
-* [gfaivre](https://github.com/gfaivre)
-* [Fiaxhs](https://github.com/Fiaxhs)
-* [rasjonell](https://github.com/rasjonell)
-* [reedcourty](https://github.com/reedcourty)
-* [anneau](https://github.com/anneau)
-* [lanodan](https://github.com/lanodan)
-* [Harmon758](https://github.com/Harmon758)
-* [HellPie](https://github.com/HellPie)
-* [Habu-Kagumba](https://github.com/Habu-Kagumba)
-* [suzukaze](https://github.com/suzukaze)
-* [Hiromi-Kai](https://github.com/Hiromi-Kai)
+* [Gergely Nagy](mailto:algernon@users.noreply.github.com)
+* [Giuseppe Pignataro](mailto:rogepix@gmail.com)
+* [Greg V](mailto:greg@unrelenting.technology)
+* [Guewen FAIVRE](mailto:guewen.faivre@elao.com)
+* [Guillaume Lo Re](mailto:lowreg@gmail.com)
+* [Gurgen Hayrapetyan](mailto:info.gurgen@gmail.com)
+* [György Nádudvari](mailto:reedcourty@users.noreply.github.com)
+* [HIKARU KOBORI](mailto:hk.uec.univ@gmail.com)
+* [Haelwenn Monnier](mailto:lanodan@users.noreply.github.com)
+* [Harmon](mailto:harmon758@gmail.com)
+* [HellPie](mailto:hellpie@users.noreply.github.com)
+* [Herbert Kagumba](mailto:habukagumba@gmail.com)
+* [Hiroe Jun](mailto:jun.hiroe@gmail.com)
+* [Hiromi Kai](mailto:pie05041008@gmail.com)
* [Hisham Muhammad](mailto:hisham@gobolinux.org)
* [Hugo "Slaynash" Flores](mailto:hugoflores@hotmail.fr)
* [INAGAKI Hiroshi](mailto:musashino205@users.noreply.github.com)
@@ -466,7 +478,6 @@ and provided thanks to the work of the following contributors:
* [Ian McCowan](mailto:imccowan@gmail.com)
* [Ian McDowell](mailto:me@ianmcdowell.net)
* [Iijima Yasushi](mailto:kurage.cc@gmail.com)
-* [Ikko Ashimine](mailto:eltociear@gmail.com)
* [Ingo Blechschmidt](mailto:iblech@web.de)
* [J Yeary](mailto:usbsnowcrash@users.noreply.github.com)
* [Jack Michaud](mailto:jack-michaud@users.noreply.github.com)
@@ -486,6 +497,7 @@ and provided thanks to the work of the following contributors:
* [Jordan Guerder](mailto:jguerder@fr.pulseheberg.net)
* [Joseph Mingrone](mailto:jehops@users.noreply.github.com)
* [Josh Leeb-du Toit](mailto:mail@joshleeb.com)
+* [Josh Soref](mailto:2119212+jsoref@users.noreply.github.com)
* [Joshua Wood](mailto:josh@joshuawood.net)
* [Julien](mailto:tiwy57@users.noreply.github.com)
* [Julien Deswaef](mailto:juego@requiem4tv.com)
@@ -502,6 +514,7 @@ and provided thanks to the work of the following contributors:
* [Leo Wzukw](mailto:leowzukw@users.noreply.github.com)
* [Leonie](mailto:62470640+bubblineyuri@users.noreply.github.com)
* [Lex Alexander](mailto:l.alexander10@gmail.com)
+* [LinAGKar](mailto:linus.kardell@gmail.com)
* [Lorenz Diener](mailto:lorenzd@gmail.com)
* [Luc Didry](mailto:ldidry@users.noreply.github.com)
* [Lukas Burk](mailto:jemus42@users.noreply.github.com)
@@ -534,6 +547,7 @@ and provided thanks to the work of the following contributors:
* [Milton Mazzarri](mailto:milmazz@gmail.com)
* [Minku Lee](mailto:premist@me.com)
* [Minori Hiraoka](mailto:mnkai@users.noreply.github.com)
+* [MitarashiDango](mailto:mitarashi_dango@mail.matcha-soft.com)
* [Mitchell Hentges](mailto:mitch9654@gmail.com)
* [Mostafa Ahangarha](mailto:ahangarha@users.noreply.github.com)
* [Mouse Reeve](mailto:mousereeve@riseup.net)
@@ -553,7 +567,6 @@ and provided thanks to the work of the following contributors:
* [Norayr Chilingarian](mailto:norayr@arnet.am)
* [Noëlle Anthony](mailto:noelle.d.anthony@gmail.com)
* [N氏](mailto:uenok.htc@gmail.com)
-* [OSAMU SATO](mailto:satosamu@gmail.com)
* [Olivier Nicole](mailto:olivierthnicole@gmail.com)
* [Oskari Noppa](mailto:noppa@users.noreply.github.com)
* [Otakan](mailto:otakan951@gmail.com)
@@ -566,6 +579,7 @@ and provided thanks to the work of the following contributors:
* [Ratmir Karabut](mailto:rkarabut@sfmodern.ru)
* [Reto Kromer](mailto:retokromer@users.noreply.github.com)
* [Rob Watson](mailto:rfwatson@users.noreply.github.com)
+* [Rohan Sharma](mailto:i.am.lone.survivor@protonmail.com)
* [Ryan Freebern](mailto:ryan@freebern.org)
* [Ryan Wade](mailto:ryan.wade@protonmail.com)
* [Ryo Kajiwara](mailto:kfe-fecn6.prussian@s01.info)
@@ -595,6 +609,8 @@ and provided thanks to the work of the following contributors:
* [StefOfficiel](mailto:pichard.stephane@free.fr)
* [Steven Tappert](mailto:admin@dark-it.net)
* [Stéphane Guillou](mailto:stephane.guillou@member.fsf.org)
+* [Su Yang](mailto:soulteary@users.noreply.github.com)
+* [Sumak](mailto:44816995+kawsay@users.noreply.github.com)
* [Svetlozar Todorov](mailto:svetlik@users.noreply.github.com)
* [Sébastien Santoro](mailto:dereckson@espace-win.org)
* [Tad Thorley](mailto:phaedryx@users.noreply.github.com)
@@ -611,6 +627,7 @@ and provided thanks to the work of the following contributors:
* [Tomonori Murakami](mailto:crosslife777@gmail.com)
* [TomoyaShibata](mailto:wind.of.hometown@gmail.com)
* [Treyssat-Vincent Nino](mailto:treyssatvincent@users.noreply.github.com)
+* [Truong Nguyen](mailto:truongnmt.dev@gmail.com)
* [Udo Kramer](mailto:optik@fluffel.io)
* [Una](mailto:una@unascribed.com)
* [Ushitora Anqou](mailto:ushitora@anqou.net)
@@ -621,6 +638,7 @@ and provided thanks to the work of the following contributors:
* [Wenceslao Páez Chávez](mailto:wcpaez@gmail.com)
* [Wesley Ellis](mailto:tahnok@gmail.com)
* [Wiktor](mailto:wiktor@metacode.biz)
+* [Wonderfall](mailto:wonderfall@protonmail.com)
* [Wonderfall](mailto:wonderfall@schrodinger.io)
* [Y.Yamashiro](mailto:shukukei@mojizuri.jp)
* [YDrogen](mailto:ydrogen45@gmail.com)
@@ -634,11 +652,13 @@ and provided thanks to the work of the following contributors:
* [Yeechan Lu](mailto:wz.bluesnow@gmail.com)
* [Your Name](mailto:lorenzd@gmail.com)
* [Yusuke Abe](mailto:moonset20@gmail.com)
+* [Zach Neill](mailto:neillz@berea.edu)
* [Zachary Spector](mailto:logicaldash@gmail.com)
* [ZiiX](mailto:ziix@users.noreply.github.com)
* [asria-jp](mailto:is@alicematic.com)
* [ava](mailto:vladooku@users.noreply.github.com)
* [benklop](mailto:benklop@gmail.com)
+* [bobbyd0g](mailto:93697464+bobbyd0g@users.noreply.github.com)
* [bsky](mailto:git@imbsky.net)
* [caesarologia](mailto:lopesgemelli.1@gmail.com)
* [cbayerlein](mailto:c.bayerlein@gmail.com)
@@ -646,6 +666,7 @@ and provided thanks to the work of the following contributors:
* [chrolis](mailto:chrolis@users.noreply.github.com)
* [cormo](mailto:cormorant2+github@gmail.com)
* [d0p1](mailto:dopi-sama@hush.com)
+* [dogelover911](mailto:84288771+dogelover911@users.noreply.github.com)
* [dxwc](mailto:dxwc@users.noreply.github.com)
* [evilny0](mailto:evilny0@moomoocamp.net)
* [febrezo](mailto:felixbrezo@gmail.com)
@@ -656,6 +677,8 @@ and provided thanks to the work of the following contributors:
* [guigeekz](mailto:pattusg@gmail.com)
* [hakoai](mailto:hk--76@qa2.so-net.ne.jp)
* [haosbvnker](mailto:github@chaosbunker.com)
+* [heguro](mailto:65112898+heguro@users.noreply.github.com)
+* [helloworldstack](mailto:66512512+helloworldstack@users.noreply.github.com)
* [ichi_i](mailto:51489410+ichi-i@users.noreply.github.com)
* [isati](mailto:phil@juchnowi.cz)
* [jacob](mailto:jacobherringtondeveloper@gmail.com)
@@ -671,7 +694,7 @@ and provided thanks to the work of the following contributors:
* [kedama](mailto:32974885+kedamadq@users.noreply.github.com)
* [kuro5hin](mailto:rusty@kuro5hin.org)
* [leo60228](mailto:leo@60228.dev)
-* [luzpaz](mailto:luzpaz@users.noreply.github.com)
+* [matildepark](mailto:matilde.park@pm.me)
* [maxypy](mailto:maxime@mpigou.fr)
* [mhe](mailto:mail@marcus-herrmann.com)
* [mike castleman](mailto:m@mlcastle.net)
@@ -681,14 +704,15 @@ and provided thanks to the work of the following contributors:
* [muan](mailto:muan@github.com)
* [namelessGonbai](mailto:43787036+namelessgonbai@users.noreply.github.com)
* [neetshin](mailto:neetshin@neetsh.in)
-* [noiob](mailto:8197071+noiob@users.noreply.github.com)
* [notozeki](mailto:notozeki@users.noreply.github.com)
* [ntl-purism](mailto:57806346+ntl-purism@users.noreply.github.com)
* [nzws](mailto:git-yuzu@svk.jp)
+* [potpro](mailto:pptppctt@gmail.com)
* [proxy](mailto:51172302+3n-k1@users.noreply.github.com)
* [rch850](mailto:rich850@gmail.com)
* [roikale](mailto:roikale@users.noreply.github.com)
* [rysiekpl](mailto:rysiek@hackerspace.pl)
+* [sasanquaneuf](mailto:sasanquaneuf@gmail.com)
* [saturday06](mailto:dyob@lunaport.net)
* [scd31](mailto:57571338+scd31@users.noreply.github.com)
* [scriptjunkie](mailto:scriptjunkie@scriptjunkie.us)
@@ -698,6 +722,7 @@ and provided thanks to the work of the following contributors:
* [syui](mailto:syui@users.noreply.github.com)
* [tackeyy](mailto:mailto.takita.yusuke@gmail.com)
* [taicv](mailto:chuvantai@gmail.com)
+* [tkr](mailto:account@kgtkr.net)
* [tmyt](mailto:shigure@refy.net)
* [trevDev()](mailto:trev@trevdev.ca)
* [tsia](mailto:github@tsia.de)
@@ -707,6 +732,7 @@ and provided thanks to the work of the following contributors:
* [y-temp4](mailto:y.temp4@gmail.com)
* [ymmtmdk](mailto:ymmtmdk@gmail.com)
* [yoshipc](mailto:yoooo@yoshipc.net)
+* [zunda](mailto:zundan@gmail.com)
* [Özcan Zafer AYAN](mailto:ozcanzaferayan@gmail.com)
* [ばん](mailto:detteiu0321@gmail.com)
* [ふるふる](mailto:frfs@users.noreply.github.com)
@@ -726,107 +752,126 @@ This document is provided for informational purposes only. Since it is only upda
Following people have contributed to translation of Mastodon:
- GunChleoc (*Scottish Gaelic*)
-- ᛤᚤᛠᛥⴲ 👽 (KNTRO) (*Spanish, Argentina*)
-- adrmzz (*Sardinian*)
-- Hồ Nhất Duy (kantcer) (*Vietnamese*)
-- Zoltán Gera (gerazo) (*Hungarian*)
+- ケインツロ 👾 (KNTRO) (*Spanish, Argentina*)
- Sveinn í Felli (sveinki) (*Icelandic*)
-- qezwan (*Persian, Sorani (Kurdish)*)
-- NCAA (*Danish*)
-- Ramdziana F Y (rafeyu) (*Indonesian*)
-- taicv (*Vietnamese*)
-- ButterflyOfFire (BoFFire) (*French, Arabic, Kabyle*)
+- Hồ Nhất Duy (honhatduy) (*Vietnamese*)
+- Zoltán Gera (gerazo) (*Hungarian*)
+- Kristaps_M (*Latvian*)
+- NCAA (*French, Danish*)
+- adrmzz (*Sardinian*)
- Xosé M. (XoseM) (*Spanish, Galician*)
-- Evert Prants (IcyDiamond) (*Estonian*)
-- Besnik_b (*Albanian*)
+- Ramdziana F Y (rafeyu) (*Indonesian*)
+- Jeong Arm (Kjwon15) (*Spanish, Japanese, Korean, Esperanto*)
- Emanuel Pina (emanuelpina) (*Portuguese*)
-- Jeong Arm (Kjwon15) (*Japanese, Korean, Esperanto*)
-- Alix Rossi (palindromordnilap) (*French, Esperanto, Corsican*)
+- qezwan (*Persian, Sorani (Kurdish)*)
+- Besnik_b (*Albanian*)
+- ButterflyOfFire (BoFFire) (*French, Arabic, Kabyle*)
- Thai Localization (thl10n) (*Thai*)
+- Cyax (Cyaxares) (*Kurmanji (Kurdish)*)
+- taicv (*Vietnamese*)
- Daniele Lira Mereb (danilmereb) (*Portuguese, Brazilian*)
-- Joene (joenepraat) (*Dutch*)
-- Kristijan Tkalec (lapor) (*Slovenian*)
-- stan ionut (stanionut12) (*Romanian*)
- spla (*Spanish, Catalan*)
-- мачко (ma4ko) (*Bulgarian*)
-- 奈卜拉 (nebula_moe) (*Chinese Simplified*)
-- kamee (*Armenian*)
-- AJ-عجائب البرمجة (Esmail_Hazem) (*Arabic*)
-- Michal Stanke (mstanke) (*Czech*)
-- Danial Behzadi (danialbehzadi) (*Persian*)
-- borys_sh (*Ukrainian*)
-- Asier Iturralde Sarasola (aldatsa) (*Basque*)
-- Imre Kristoffer Eilertsen (DandelionSprout) (*Norwegian*)
+- Evert Prants (IcyDiamond) (*Estonian*)
- koyu (*German*)
+- Alix Rossi (palindromordnilap) (*French, Esperanto, Corsican*)
+- Joene (joenepraat) (*Dutch*)
+- stan ionut (stanionut12) (*Romanian*)
+- Mastodon 中文译者 (mastodon-linguist) (*Chinese Simplified*)
+- Kristijan Tkalec (lapor) (*Slovenian*)
+- Danial Behzadi (danialbehzadi) (*Persian*)
+- Asier Iturralde Sarasola (aldatsa) (*Basque*)
+- ManeraKai (*Arabic*)
+- мачко (ma4ko) (*Bulgarian*)
+- Roboron (*Spanish*)
+- Alessandro Levati (Oct326) (*Italian*)
+- xatier (*Chinese Traditional, Chinese Traditional, Hong Kong*)
+- Ondřej Pokorný (unextro) (*Czech*)
+- Alexander Sorokin (Brawaru) (*French, Catalan, Danish, German, Greek, Hungarian, Armenian, Korean, Portuguese, Russian, Albanian, Swedish, Ukrainian, Vietnamese, Galician*)
+- kamee (*Armenian*)
+- Michal Stanke (mstanke) (*Czech*)
+- borys_sh (*Ukrainian*)
+- Imre Kristoffer Eilertsen (DandelionSprout) (*Norwegian*)
- yeft (*Chinese Traditional, Chinese Traditional, Hong Kong*)
- Miguel Mayol (mitcoes) (*Spanish, Catalan*)
-- Sasha Sorokin (Brawaru) (*French, Catalan, Danish, German, Greek, Hungarian, Armenian, Korean, Russian, Albanian, Swedish, Ukrainian, Vietnamese, Galician*)
-- Roboron (*Spanish*)
+- Marek Ľach (mareklach) (*Polish, Slovak*)
+- Manuel Viens (manuelviens) (*French*)
+- Kimmo Kujansuu (mrkujansuu) (*Finnish*)
- Koala Yeung (yookoala) (*Chinese Traditional, Hong Kong*)
-- Ondřej Pokorný (unextro) (*Czech*)
+- enolp (*Asturian*)
- Osoitz (*Basque*)
- Peterandre (*Norwegian, Norwegian Nynorsk*)
- tzium (*Sardinian*)
-- Mélanie Chauvel (ariasuni) (*French, Arabic, Czech, German, Greek, Hungarian, Slovenian, Ukrainian, Chinese Simplified, Portuguese, Brazilian, Persian, Norwegian Nynorsk, Esperanto, Breton, Corsican, Sardinian, Kabyle*)
-- Iváns (Ivans_translator) (*Galician*)
- Maya Minatsuki (mayaeh) (*Japanese*)
-- Manuel Viens (manuelviens) (*French*)
-- Alessandro Levati (Oct326) (*Italian*)
+- Mélanie Chauvel (ariasuni) (*French, Arabic, Czech, German, Greek, Hungarian, Slovenian, Ukrainian, Chinese Simplified, Portuguese, Brazilian, Persian, Norwegian Nynorsk, Esperanto, Breton, Corsican, Sardinian, Kabyle*)
+- T. E. Kalaycı (tekrei) (*Turkish*)
+- Takeçi (polygoat) (*French, Italian*)
+- Galician Translator (Galician_translator) (*Galician*)
- lamnatos (*Greek*)
- Sean Young (assanges) (*Chinese Traditional*)
- tolstoevsky (*Russian*)
-- enolp (*Asturian*)
+- Ihor Hordiichuk (ihor_ck) (*Ukrainian*)
+- Ali Demirtaş (alidemirtas) (*Turkish*)
- Jasmine Cam Andrever (gourmas) (*Cornish*)
+- coxde (*Chinese Simplified*)
- gagik_ (*Armenian*)
- Masoud Abkenar (mabkenar) (*Persian*)
- arshat (*Kazakh*)
- Marcin Mikołajczak (mkljczkk) (*Czech, Polish, Russian*)
-- Marek Ľach (mareklach) (*Polish, Slovak*)
-- Ali Demirtaş (alidemirtas) (*Turkish*)
+- Jeff Huang (s8321414) (*Chinese Traditional*)
- Blak Ouille (BlakOuille16) (*French*)
+- e (diveedd) (*Kurmanji (Kurdish)*)
- Em St Cenydd (cancennau) (*Welsh*)
- Diluns (*Occitan*)
-- Muha Aliss (muhaaliss) (*Turkish*)
+- Nurul Azeera Hidayah @ Muhammad Nur Hidayat Yasuyoshi (MNH48.moe) (mnh48) (*Malay*)
+- Tagomago (tagomago) (*French, Spanish*)
- Jurica (ahjk) (*Croatian*)
- Aditoo17 (*Czech*)
+- Tigran (tigransimonyan) (*Armenian*)
- vishnuvaratharajan (*Tamil*)
- pulmonarycosignerkindness (*Swedish*)
+- calypsoopenmail (*French*)
- cybergene (cyber-gene) (*Japanese*)
-- Takeçi (polygoat) (*French, Italian*)
-- xatier (*Chinese Traditional*)
-- Ihor Hordiichuk (ihor_ck) (*Ukrainian*)
+- Bran_Ruz (*Breton*)
+- Gearguy (*Finnish*)
+- GiorgioHerbie (*Italian*)
+- Balázs Meskó (mesko.balazs) (*Czech, Hungarian*)
+- Martin (miles) (*Slovenian*)
- regulartranslator (*Portuguese, Brazilian*)
+- Saederup92 (*Danish*)
- ozzii (*French, Serbian (Cyrillic)*)
- Irfan (Irfan_Radz) (*Malay*)
-- Saederup92 (*Danish*)
-- Akarshan Biswas (biswasab) (*Bengali, Sanskrit*)
- Yi-Jyun Pan (pan93412) (*Chinese Traditional*)
+- ClearlyClaire (*French, Icelandic*)
+- Akarshan Biswas (biswasab) (*Bengali, Sanskrit*)
+- Kristoffer Grundström (Umeaboy) (*Swedish*)
- Rafael H L Moretti (Moretti) (*Portuguese, Brazilian*)
- d5Ziif3K (*Ukrainian*)
-- GiorgioHerbie (*Italian*)
+- හෙළබස (HelaBasa) (*Sinhala*)
+- xpil (*Polish*)
+- Rojdayek (*Kurmanji (Kurdish)*)
- christalleras (*Norwegian Nynorsk*)
+- Allen Zhong (AstroProfundis) (*Chinese Simplified*)
- Taloran (*Norwegian Nynorsk*)
-- ThibG (*French, Icelandic*)
+- Sokratis Alichanidis (alichani) (*Greek*)
+- Catalina (catalina.st) (*Romanian*)
- otrapersona (*Spanish, Spanish, Mexico*)
-- Store (HelaBasa) (*Sinhala*)
+- Ryo (DrRyo) (*Korean*)
- Mauzi (*German, Swedish*)
- atarashiako (*Chinese Simplified*)
-- 101010 (101010pl) (*Polish*)
- erictapen (*German*)
-- Tagomago (tagomago) (*French, Spanish*)
+- 101010 (101010pl) (*Polish*)
- Jaz-Michael King (jazmichaelking) (*Welsh*)
-- coxde (*Chinese Simplified*)
-- T. E. Kalaycı (tekrei) (*Turkish*)
+- axi (*Finnish*)
- silkevicious (*Italian*)
- Floxu (fredrikdim1) (*Norwegian Nynorsk*)
-- Ryo (DrRyo) (*Korean*)
+- NadieAishi (*Spanish, Spanish, Mexico*)
- Bertil Hedkvist (Berrahed) (*Swedish*)
- William(ѕ)ⁿ (wmlgr) (*Spanish*)
+- Eshagh (eshagh79) (*Persian*)
+- LNDDYL (*Chinese Traditional*)
- norayr (*Armenian*)
- Satnam S Virdi (pika10singh) (*Punjabi*)
- Tiago Epifânio (tfve) (*Portuguese*)
-- Balázs Meskó (mesko.balazs) (*Hungarian*)
-- Sokratis Alichanidis (alichani) (*Greek*)
- Mentor Gashi (mentorgashi.com) (*Albanian*)
- carolinagiorno (*Portuguese, Brazilian*)
- Hayk Khachatryan (brutusromanus123) (*Armenian*)
@@ -834,394 +879,472 @@ Following people have contributed to translation of Mastodon:
- Bharat Kumar (Marwari) (*Hindi*)
- Austra Muizniece (aus_m) (*Latvian*)
- ThonyVezbe (*Breton*)
+- Just Spanish (7_7) (*Spanish, Mexico*)
- v4vachan (*Malayalam*)
+- bilfri (*Danish*)
- dkdarshan760 (*Sanskrit*)
-- tykayn (*French*)
-- axi (*Finnish*)
-- Selyan Slimane AMIRI (SelyanKab) (*Kabyle*)
- Timur Seber (seber) (*Tatar*)
+- Slimane Selyan AMIRI (SelyanKab) (*Kabyle*)
+- VaiTon (*Italian*)
+- Vik (ViktorOn) (*Danish, Russian*)
+- tykayn (*French*)
+- GCardo (*Portuguese, Brazilian*)
- taoxvx (*Danish*)
- Hrach Mkrtchyan (mhrach87) (*Armenian*)
- sabri (thetomatoisavegetable) (*Spanish, Spanish, Argentina*)
- Dewi (Unkorneg) (*French, Breton*)
- CoelacanthusHex (*Chinese Simplified*)
-- syncopams (*Chinese Simplified, Chinese Traditional, Chinese Traditional, Hong Kong*)
- Rhys Harrison (rhedders) (*Esperanto*)
-- Hakim Oubouali (zenata1) (*Standard Moroccan Tamazight*)
+- syncopams (*Chinese Simplified, Chinese Traditional, Chinese Traditional, Hong Kong*)
- SteinarK (*Norwegian Nynorsk*)
+- Maxine B. Vågnes (vagnes) (*Norwegian, Norwegian Nynorsk*)
+- Hakim Oubouali (zenata1) (*Standard Moroccan Tamazight*)
+- ahangarha (*Persian*)
- Lalo Tafolla (lalotafo) (*Spanish, Spanish, Mexico*)
-- Mathias B. Vagnes (vagnes) (*Norwegian*)
- dashersyed (*Urdu (Pakistan)*)
-- Acolyte (666noob404) (*Ukrainian*)
- Conight Wang (xfddwhh) (*Chinese Simplified*)
- liffon (*Swedish*)
- Damjan Dimitrioski (gnud) (*Macedonian*)
+- Rikard Linde (rikardlinde) (*Swedish*)
+- rondnunes (*Portuguese, Brazilian*)
+- strubbl (*German*)
- PPNplus (*Thai*)
+- Frontier Translation Ltd. (frontier-translation) (*Chinese Simplified*)
- shioko (*Chinese Simplified*)
+- Kahina Mess (K_hina) (*Kabyle*)
- ZiriSut (*Kabyle*)
-- Evgeny Petrov (kondra007) (*Russian*)
+- Groosha (groosha) (*Russian*)
+- Hexandcube (hexandcube) (*Polish*)
- Gwenn (Belvar) (*Breton*)
+- 游荡 (MamaShip) (*Chinese Simplified*)
- StanleyFrew (*French*)
+- mynameismonkey (*Welsh*)
+- Edward Navarro (EdwardNavarro) (*Spanish*)
- Nikita Epifanov (Nikets) (*Russian*)
- jaranta (*Finnish*)
- Slobodan Simić (Слободан Симић) (slsimic) (*Serbian (Cyrillic)*)
+- retiolus (*Catalan*)
+- iVampireSP (*Chinese Simplified, Chinese Traditional*)
- Felicia Jongleur (midsommar) (*Swedish*)
- Denys (dector) (*Ukrainian*)
-- iVampireSP (*Chinese Simplified, Chinese Traditional*)
-- Pukima (pukimaaa) (*German*)
-- 游荡 (MamaShip) (*Chinese Simplified*)
+- Mo_der Steven (SakuraPuare) (*Chinese Simplified*)
- Vanege (*Esperanto*)
-- Rikard Linde (rikardlinde) (*Swedish*)
- Jess Rafn (therealyez) (*Danish*)
-- strubbl (*German*)
- Stasiek Michalski (hellcp) (*Polish*)
- dxwc (*Bengali*)
-- jmontane (*Catalan*)
+- Filbert Salim (gamesbert6) (*Indonesian*)
- Liboide (*Spanish*)
-- Hexandcube (hexandcube) (*Polish*)
+- jmontane (*Catalan*)
- Chris Kay (chriskarasoulis) (*Greek*)
- Johan Schiff (schyffel) (*Swedish*)
+- Rex_sa (rex07) (*Arabic*)
- Arunmozhi (tecoholic) (*Tamil*)
- zer0-x (ZER0-X) (*Arabic*)
- kat (katktv) (*Russian, Ukrainian*)
- Lauren Liberda (selfisekai) (*Polish*)
-- mynameismonkey (*Welsh*)
- oti4500 (*Hungarian, Ukrainian*)
+- Delta (Delta-Time) (*Japanese*)
+- Michael Zeevi (maze88) (*Hebrew*)
+- SarfarazAhmed (*Urdu (Pakistan)*)
- Mats Gunnar Ahlqvist (goqbi) (*Swedish*)
- diazepan (*Spanish, Spanish, Argentina*)
- marzuquccen (*Kabyle*)
+- atriix (*Swedish*)
- VictorCorreia (victorcorreia1984) (*Afrikaans*)
-- Tigran (tigransimonyan) (*Armenian*)
+- Remito (remitocat) (*Japanese*)
+- AlexKoala (alexkoala) (*Korean*)
- Juan José Salvador Piedra (JuanjoSalvador) (*Spanish*)
- BurekzFinezt (*Serbian (Cyrillic)*)
+- 森の子リスのミーコの大冒険 (Phroneris) (*Japanese*)
+- asnomgtu (*Hungarian*)
- SHeija (*Finnish*)
-- Gearguy (*Finnish*)
-- atriix (*Swedish*)
+- Врабац (Slovorad) (*Serbian (Cyrillic)*)
+- Dženan (Dzenan) (*Swedish*)
- Jack R (isaac.97_WT) (*Spanish*)
- antonyho (*Chinese Traditional, Hong Kong*)
-- asnomgtu (*Hungarian*)
-- ahangarha (*Persian*)
+- FreddyG (*Esperanto*)
- andruhov (*Russian, Ukrainian*)
- phena109 (*Chinese Traditional, Hong Kong*)
- Aryamik Sharma (Aryamik) (*Swedish, Hindi*)
- Unmual (*Spanish*)
-- 森の子リスのミーコの大冒険 (Phroneris) (*Japanese*)
+- Adrián Graña (alaris83) (*Spanish*)
+- cruz2020 (*Portuguese*)
+- vpei (*Chinese Simplified*)
- るいーね (ruine) (*Japanese*)
- Sam Tux (imahbub) (*Bengali*)
-- Kristoffer Grundström (Umeaboy) (*Swedish*)
- igordrozniak (*Polish*)
+- Michał Sidor (michcioperz) (*Polish*)
- Isaac Huang (caasih) (*Chinese Traditional*)
- AW Unad (awcodify) (*Indonesian*)
-- Allen Zhong (AstroProfundis) (*Chinese Simplified*)
+- 1Alino (*Slovak*)
- Cutls (cutls) (*Japanese*)
-- Falling Snowdin (tghgg) (*Vietnamese*)
-- Ray (Ipsumry) (*Spanish*)
-- Gianfranco Fronteddu (gianfro.gianfro) (*Sardinian*)
-- Rasmus Lindroth (RasmusLindroth) (*Swedish*)
-- Andrea Lo Iacono (niels0n) (*Italian*)
+- Goudarz Jafari (Goudarz) (*Persian*)
- Parodper (*Galician*)
+- 1 (Ipsumry) (*Spanish*)
+- Falling Snowdin (tghgg) (*Vietnamese*)
+- Rasmus Lindroth (RasmusLindroth) (*Swedish*)
+- Gianfranco Fronteddu (gianfro.gianfro) (*Sardinian*)
+- Andrea Lo Iacono (niels0n) (*Italian*)
- fucsia (*Italian*)
-- NadieAishi (*Spanish, Spanish, Mexico*)
+- Vedran Serbu (SerenoXGen) (*Croatian*)
- Kinshuk Sunil (kinshuksunil) (*Hindi*)
- Ullas Joseph (ullasjoseph) (*Malayalam*)
-- Goudarz Jafari (Goudarz) (*Persian*)
+- al_._ (*German, Russian*)
+- Matthías Páll Gissurarson (icetritlo) (*Icelandic*)
+- Percy (kecrily) (*Chinese Simplified*)
- Yu-Pai Liu (tedliou) (*Chinese Traditional*)
+- KcKcZi (*Chinese Simplified*)
- Amarin Cemthong (acitmaster) (*Thai*)
- Johannes Nilsson (nlssn) (*Swedish*)
- juanda097 (juanda-097) (*Spanish*)
+- xsml (*Chinese Simplified*)
- Anunnakey (*Macedonian*)
- erikkemp (*Dutch*)
- erikstl (*Esperanto*)
-- bobchao (*Chinese Traditional*)
- twpenguin (*Chinese Traditional*)
-- MadeInSteak (*Finnish*)
+- Po-chiang Chao (bobchao) (*Chinese Traditional*)
+- Marcus Myge (mygg-priv) (*Norwegian*)
- Esther (esthermations) (*Portuguese*)
+- MadeInSteak (*Finnish*)
- t_aus_m (*German*)
+- serapolis (*Japanese, Chinese Simplified, Chinese Traditional, Chinese Traditional, Hong Kong*)
- Heimen Stoffels (Vistaus) (*Dutch*)
- Rajarshi Guha (rajarshiguha) (*Bengali*)
-- Mo_der Steven (SakuraPuare) (*Chinese Simplified*)
- Gopal Sharma (gopalvirat) (*Hindi*)
-- arethsu (*Swedish*)
-- Carlos Solís (csolisr) (*Esperanto*)
+- Linnéa (lesbian_subnet) (*Swedish*)
+- 北䑓如法 (Nyoho) (*Japanese*)
+- abidin toumi (Zet24) (*Arabic*)
- Tofiq Abdula (Xwla) (*Sorani (Kurdish)*)
+- Carlos Solís (csolisr) (*Esperanto*)
+- Yamagishi Kazutoshi (ykzts) (*Japanese, Vietnamese, Icelandic, Sorani (Kurdish)*)
- Parthan S Ramanujam (parthan) (*Tamil*)
- Kasper Nymand (KasperNymand) (*Danish*)
-- Jeff Huang (s8321414) (*Chinese Traditional*)
-- TS (morte) (*Finnish*)
- subram (*Turkish*)
+- TS (morte) (*Finnish*)
- SensDeViata (*Ukrainian*)
- Ptrcmd (ptrcmd) (*Chinese Traditional*)
+- megaleo (*Portuguese, Brazilian*)
- SergioFMiranda (*Portuguese, Brazilian*)
-- Percy (scvoet) (*Chinese Simplified*)
-- Vivek K J (Vivekkj) (*Malayalam*)
- hiroTS (*Chinese Traditional*)
+- Vivek K J (Vivekkj) (*Malayalam*)
+- arielcostas3 (*Galician*)
- johne32rus23 (*Russian*)
- AzureNya (*Chinese Simplified*)
- OctolinGamer (octolingamer) (*Portuguese, Brazilian*)
+- filippodb (*Italian*)
- Ram varma (ram4varma) (*Tamil*)
-- 北䑓如法 (Nyoho) (*Japanese*)
+- sanser (*Russian*)
+- Y.Yamashiro (uist1idrju3i) (*Japanese*)
- Pukima (Pukimaa) (*German*)
- diorama (*Italian*)
-- Daniel Dimitrov (daniel.dimitrov) (*Bulgarian*)
- frumble (*German*)
+- Daniel Dimitrov (daniel.dimitrov) (*Bulgarian*)
- kekkepikkuni (*Tamil*)
+- MODcraft (*Chinese Simplified*)
- oorsutri (*Tamil*)
- Neo_Chen (NeoChen1024) (*Chinese Traditional*)
- Nithin V (Nithin896) (*Tamil*)
-- Marcus Myge (mygg-priv) (*Norwegian*)
- Miro Rauhala (mirorauhala) (*Finnish*)
-- AlexKoala (alexkoala) (*Korean*)
+- Oymate (*Bengali*)
- ಚಿರಾಗ್ ನಟರಾಜ್ (chiraag-nataraj) (*Kannada*)
-- Aswin C (officialcjunior) (*Malayalam*)
- Guillaume Turchini (orion78fr) (*French*)
+- Aswin C (officialcjunior) (*Malayalam*)
- Ganesh D (auntgd) (*Marathi*)
+- Yuval Nehemia (yuvalne) (*Hebrew*)
- mawoka-myblock (mawoka) (*German*)
- dragnucs2 (*Arabic*)
- Ryan Ho (koungho) (*Chinese Traditional*)
-- Pedro Henrique (exploronauta) (*Portuguese, Brazilian*)
- Tejas Harad (h_tejas) (*Marathi*)
+- Pedro Henrique (exploronauta) (*Portuguese, Brazilian*)
+- Amir Reza (ElAmir) (*Persian*)
+- Tatsuto "Laminne" Yamamoto (laminne) (*Japanese*)
- Vasanthan (vasanthan) (*Tamil*)
- 硫酸鶏 (acid_chicken) (*Japanese*)
-- clarmin b8 (clarminb8) (*Sorani (Kurdish)*)
- programizer (*German*)
+- clarmin b8 (clarminb8) (*Sorani (Kurdish)*)
- manukp (*Malayalam*)
-- earth dweller (sanethoughtyt) (*Marathi*)
- psymyn (*Hebrew*)
+- earth dweller (sanethoughtyt) (*Marathi*)
+- Marek Ľach (marek-lach) (*Slovak*)
- meijerivoi (toilet) (*Finnish*)
- essaar (*Tamil*)
+- Nemuj (Dentrado) (*Japanese, Esperanto*)
- serubeena (*Swedish*)
- Rintan (*Japanese*)
- Karol Kosek (krkkPL) (*Polish*)
-- Khó͘ Tiat-lêng (khotiatleng) (*Chinese Traditional, Taigi*)
-- Hernik (hernik27) (*Czech*)
+- Khó͘ Tiatlêng (khotiatleng) (*Chinese Traditional, Taigi*)
- valarivan (*Tamil*)
-- kuchengrab (*German*)
+- Hernik (hernik27) (*Czech*)
+- revarioba (*Spanish*)
- friedbeans (*Croatian*)
+- kuchengrab (*German*)
- Abi Turi (abi123) (*Georgian*)
- Hinaloe (hinaloe) (*Japanese*)
- Sebastián Andil (Selrond) (*Slovak*)
-- KEINOS (*Japanese*)
-- filippodb (*Italian*)
+- Ifnuth (*German*)
- Asbjørn Olling (a2) (*Danish*)
+- KEINOS (*Japanese*)
- Balázs Meskó (meskobalazs) (*Hungarian*)
+- Artem Mikhalitsin (artemmikhalitsin) (*Russian*)
+- Algustionesa Yoshi (algustionesa) (*Indonesian*)
- Bottle (suryasalem2010) (*Tamil*)
- Wrya ali (John12) (*Sorani (Kurdish)*)
- JzshAC (*Chinese Simplified*)
+- siamano (*Thai, Esperanto*)
+- gnu-ewm (*Polish*)
- Antillion (antillion99) (*Spanish*)
- Steven Tappert (sammy8806) (*German*)
- Reg3xp (*Persian*)
- Wassim EL BOUHAMIDI (elbouhamidiw) (*Arabic*)
+- Maciej Błędkowski (mble) (*Polish*)
- gowthamanb (*Tamil*)
- hiphipvargas (*Portuguese*)
-- Ch. (sftblw) (*Korean*)
+- tunisiano187 (*French*)
- Arttu Ylhävuori (arttu.ylhavuori) (*Finnish*)
-- tctovsli (*Norwegian Nynorsk*)
-- Timo Tijhof (Krinkle) (*Dutch*)
+- Ch. (sftblw) (*Korean*)
+- eorn (*Breton*)
+- Jona (88wcJoWl) (*Spanish*)
- Mikkel B. Goldschmidt (mikkelbjoern) (*Danish*)
+- Timo Tijhof (Krinkle) (*Dutch*)
+- Ka2n (kaanmetu) (*Turkish*)
+- tctovsli (*Norwegian Nynorsk*)
- mecqor labi (mecqorlabi) (*Persian*)
- Odyssey346 (alexader612) (*Norwegian*)
-- Yamagishi Kazutoshi (ykzts) (*Japanese, Icelandic, Sorani (Kurdish)*)
-- Eban (ebanDev) (*French, Esperanto*)
- vjasiegd (*Polish*)
+- Eban (ebanDev) (*French, Esperanto*)
- SamitiMed (samiti3d) (*Thai*)
- Nícolas Lavinicki (nclavinicki) (*Portuguese, Brazilian*)
-- snatcher (*Portuguese, Brazilian*)
- Rekan Adl (rekan-adl1) (*Sorani (Kurdish)*)
+- Antara2Cinta (Se7enTime) (*Indonesian*)
+- Yassine Aït-El-Mouden (yaitelmouden) (*Standard Moroccan Tamazight*)
- VSx86 (*Russian*)
- umelard (*Hebrew*)
-- Antara2Cinta (Se7enTime) (*Indonesian*)
- parnikkapore (*Thai*)
+- Lagash (lagash) (*Esperanto*)
- Sherwan Othman (sherwanothman11) (*Sorani (Kurdish)*)
-- Yassine Aït-El-Mouden (yaitelmouden) (*Standard Moroccan Tamazight*)
- SKELET (*Danish*)
+- Exbu (*Dutch*)
+- Chine Sebastien (chine.sebastien) (*French*)
- Fei Yang (Fei1Yang) (*Chinese Traditional*)
+- A A (sebastien.chine) (*French*)
- Ğani (freegnu) (*Tatar*)
-- Renato "Lond" Cerqueira (renatolond) (*Portuguese, Brazilian*)
- enipra (*Armenian*)
-- ALEM FARID (faridatcemlulaqbayli) (*Kabyle*)
+- Renato "Lond" Cerqueira (renatolond) (*Portuguese, Brazilian*)
- musix (*Persian*)
- ギャラ (gyara) (*Japanese, Chinese Simplified*)
+- ALEM FARID (faridatcemlulaqbayli) (*Kabyle*)
- Hougo (hougo) (*French*)
-- ybardapurkar (*Marathi*)
-- 亜緯丹穂 (ayiniho) (*Japanese*)
-- Adrián Lattes (haztecaso) (*Spanish*)
- Mordi Sacks (MordiSacks) (*Hebrew*)
- Trinsec (*Dutch*)
+- Adrián Lattes (haztecaso) (*Spanish*)
- Tigran's Tips (tigrank08) (*Armenian*)
-- TracyJacks (*Chinese Simplified*)
+- 亜緯丹穂 (ayiniho) (*Japanese*)
+- ybardapurkar (*Marathi*)
- Szabolcs Gál (galszabolcs810624) (*Hungarian*)
- Vladislav Săcrieriu (vladislavs14) (*Romanian*)
-- danreznik (*Hebrew*)
+- TracyJacks (*Chinese Simplified*)
- rasheedgm (*Kannada*)
-- omquylzu (*Latvian*)
-- c6ristian (*German*)
-- Belkacem Mohammed (belkacem77) (*Kabyle*)
+- danreznik (*Hebrew*)
+- Cirelli (cirelli94) (*Italian*)
+- Siddharastro Doraku (sidharastro) (*Spanish, Mexico*)
- lexxai (*Ukrainian*)
+- omquylzu (*Latvian*)
- Navjot Singh (nspeaks) (*Hindi*)
+- mkljczk (*Polish*)
+- Belkacem Mohammed (belkacem77) (*Kabyle*)
+- c6ristian (*German*)
+- damascene (*Arabic*)
- Ozai (*German*)
- Sahak Petrosyan (petrosyan) (*Armenian*)
-- Oymate (*Bengali*)
- Viorel-Cătălin Răpițeanu (rapiteanu) (*Romanian*)
-- siamano (*Thai, Esperanto*)
- Siddhartha Sarathi Basu (quinoa_biryani) (*Bengali*)
- Pachara Chantawong (pachara2202) (*Thai*)
-- Zijian Zhao (jobs2512821228) (*Chinese Simplified*)
- Skew (noan.perrot) (*French*)
-- mkljczk (*Polish*)
+- Zijian Zhao (jobs2512821228) (*Chinese Simplified*)
+- Overflow Cat (OverflowCat) (*Chinese Simplified, Chinese Traditional*)
+- dbeaver (*German*)
+- zordsdavini (*Lithuanian*)
- Guru Prasath Anandapadmanaban (guruprasath) (*Tamil*)
- turtle836 (*German*)
- Marcepanek_ (thekingmarcepan) (*Polish*)
-- Lamin (laminne) (*Japanese*)
-- Yann Aguettaz (yann-a) (*French*)
- Feruz Oripov (FeruzOripov) (*Russian*)
-- serapolis (*Chinese Simplified, Chinese Traditional*)
+- Yann Aguettaz (yann-a) (*French*)
- Mick Onio (xgc.redes) (*Asturian*)
- Malik Mann (dermalikmann) (*German*)
+- padulafacundo (*Spanish*)
- dadosch (*German*)
-- r3dsp1 (*Chinese Traditional, Hong Kong*)
- hg6 (*Hindi*)
- Tianqi Zhang (tina.zhang040609) (*Chinese Simplified*)
-- padulafacundo (*Spanish*)
+- r3dsp1 (*Chinese Traditional, Hong Kong*)
- johannes hove-henriksen (J0hsHH) (*Norwegian*)
- Orlando Murcio (Atos20) (*Spanish, Mexico*)
-- Padraic Calpin (padraic-padraic) (*Slovenian*)
- cenegd (*Chinese Simplified*)
-- piupiupiudiu (*Chinese Simplified*)
+- Youngeon Lee (YoungeonLee) (*Korean*)
- shdy (*German*)
+- Umi (mtrumi) (*Chinese Simplified, Chinese Traditional, Hong Kong*)
+- Padraic Calpin (padraic-padraic) (*Slovenian*)
- Ильзира Рахматуллина (rahmatullinailzira53) (*Tatar*)
-- Hugh Liu (youloveonlymeh) (*Chinese Simplified*)
+- piupiupiudiu (*Chinese Simplified*)
- Pixelcode (realpixelcode) (*German*)
+- Dennis Reimund (reimunddennis7) (*German*)
- Yogesh K S (yogi) (*Kannada*)
- Adithya K (adithyak04) (*Malayalam*)
-- Dennis Reimund (reimunddennis7) (*German*)
+- DAI JIE (daijie) (*Chinese Simplified*)
+- Hugh Liu (youloveonlymeh) (*Chinese Simplified*)
- Rakino (rakino) (*Chinese Simplified*)
-- Michał Sidor (michcioperz) (*Polish*)
-- AmazighNM (*Kabyle*)
-- Miquel Sabaté Solà (mssola) (*Catalan*)
+- ZQYD (*Chinese Simplified*)
+- X.M (kimonoki) (*Chinese Simplified*)
+- boni777 (*Chinese Simplified*)
- Jothipazhani Nagarajan (jothipazhani.n) (*Tamil*)
-- hallomaurits (*Dutch*)
+- Miquel Sabaté Solà (mssola) (*Catalan*)
+- Stanisław Jelnicki (JelNiSlaw) (*Polish*)
+- AmazighNM (*Kabyle*)
- alnd hezh (alndhezh) (*Sorani (Kurdish)*)
+- CloudSet (*Chinese Simplified*)
- Clash Clans (KURD12345) (*Sorani (Kurdish)*)
-- Solid Rhino (SolidRhino) (*Dutch*)
- Metehan Özyürek (MetehanOzyurek) (*Turkish*)
+- Paula SIMON (EncoreEutIlFalluQueJeLeSusse) (*French*)
+- Solid Rhino (SolidRhino) (*Dutch*)
+- nua_kr (*Korean*)
+- hallomaurits (*Dutch*)
- 林水溶 (shuiRong) (*Chinese Simplified*)
-- Sébastien Feugère (smonff) (*French*)
-- Y.Yamashiro (uist1idrju3i) (*Japanese*)
+- rikrise (*Swedish*)
- Takeshi Umeda (noellabo) (*Japanese*)
- k_taka (peaceroad) (*Japanese*)
-- hussama (*Portuguese, Brazilian*)
+- Sébastien Feugère (smonff) (*French*)
- Hallo Abdullah (hallo_hamza12) (*Sorani (Kurdish)*)
-- Ashok314 (ashok314) (*Hindi*)
-- PifyZ (*French*)
-- OminousCry (*Russian*)
+- hussama (*Portuguese, Brazilian*)
+- EzigboOmenana (*Cornish*)
- Robert Yano (throwcalmbobaway) (*Spanish, Mexico*)
-- Tom_ (*Czech*)
-- Tagada (Tagadda) (*French*)
-- shafouz (*Portuguese, Brazilian*)
- Yasin İsa YILDIRIM (redsfyre) (*Turkish*)
+- PifyZ (*French*)
+- Tagada (Tagadda) (*French*)
- eichkat3r (*German*)
+- Ashok314 (ashok314) (*Hindi*)
+- Zlr- (cZeler) (*French*)
- SnDer (*Dutch*)
-- Kahina Mess (K_hina) (*Kabyle*)
-- Swati Sani (swatisani) (*Urdu (Pakistan)*)
-- Kk (kishorkumara3) (*Kannada*)
-- Daniel M. (daniconil) (*Catalan*)
+- OminousCry (*Russian*)
+- Adam Sapiński (Adamos9898) (*Polish*)
+- Tom_ (*Czech*)
+- shafouz (*Portuguese, Brazilian*)
- Shrinivasan T (tshrinivasan) (*Tamil*)
-- 夜楓Yoka (Yoka2627) (*Chinese Simplified*)
-- Nathaël Noguès (NatNgs) (*French*)
+- Kk (kishorkumara3) (*Kannada*)
+- Swati Sani (swatisani) (*Urdu (Pakistan)*)
+- papayaisnotafood (*Chinese Traditional*)
- さっかりんにーさん (saccharin23) (*Japanese*)
-- Rex_sa (rex07) (*Arabic*)
+- Daniel M. (daniconil) (*Catalan*)
+- César Daniel Cavanzo Quintero (LeinadCQ) (*Esperanto*)
+- Nathaël Noguès (NatNgs) (*French*)
+- 夜楓Yoka (Yoka2627) (*Chinese Simplified*)
+- Mt Front (mtfront) (*Chinese Simplified*)
+- Artem (Artem4ik) (*Russian*)
- Robin van der Vliet (RobinvanderVliet) (*Esperanto*)
-- Vikatakavi (*Kannada*)
- Tradjincal (tradjincal) (*French*)
-- pullopen (*Chinese Simplified*)
- SusVersiva (*Catalan*)
-- Marvin (magicmarvman) (*German*)
- Zinkokooo (*Basque*)
-- Livingston Samuel (livingston) (*Tamil*)
-- CyberAmoeba (pseudoobscura) (*Chinese Simplified*)
-- tsundoker (*Malayalam*)
-- eorn (*Breton*)
-- prabhjot (*Hindi*)
-- mmokhi (*Persian*)
+- Marvin (magicmarvman) (*German*)
+- Vikatakavi (*Kannada*)
+- pullopen (*Chinese Simplified*)
- sergioaraujo1 (*Portuguese, Brazilian*)
+- prabhjot (*Hindi*)
+- CyberAmoeba (pseudoobscura) (*Chinese Simplified*)
+- mmokhi (*Persian*)
- Entelekheia-ousia (*Chinese Simplified*)
-- Pierre Morvan (Iriep) (*Breton*)
-- oscfd (*Spanish*)
+- Livingston Samuel (livingston) (*Tamil*)
+- tsundoker (*Malayalam*)
- skaaarrr (*German*)
-- mkljczk (mykylyjczyk) (*Polish*)
-- fedot (*Russian*)
+- Pierre Morvan (Iriep) (*Breton*)
- Paz Galindo (paz.almendra.g) (*Spanish*)
+- fedot (*Russian*)
+- mkljczk (mykylyjczyk) (*Polish*)
- Ricardo Colin (rysard) (*Spanish*)
- Philipp Fischbeck (PFischbeck) (*German*)
+- oscfd (*Spanish*)
- Zoé Bőle (zoe1337) (*German*)
-- EzigboOmenana (*Cornish*)
- GaggiX (*Italian*)
-- Lukas Fülling (lfuelling) (*German*)
- JackXu (Merman-Jack) (*Chinese Simplified*)
+- Lukas Fülling (lfuelling) (*German*)
- ralozkolya (*Georgian*)
-- Apple (blackteaovo) (*Chinese Simplified*)
-- asala4544 (*Basque*)
-- Xurxo Guerra (xguerrap) (*Galician*)
-- qwerty287 (*German*)
-- Anoop (anoopp) (*Malayalam*)
-- pezcurrel (*Italian*)
-- Samir Tighzert (samir_t7) (*Kabyle*)
+- Jason Gibson (barberpike606) (*Slovenian, Chinese Simplified*)
- Dremski (*Bulgarian*)
-- Dennis Reimund (reimund_dennis) (*German*)
-- ru_mactunnag (*Scottish Gaelic*)
-- Nocta (*French*)
+- Kaede (kaedech) (*Japanese*)
- Aymeric (AymBroussier) (*French*)
- mashirozx (*Chinese Simplified*)
+- María José Vera (mjverap) (*Spanish*)
+- asala4544 (*Basque*)
+- ronee (*Kurmanji (Kurdish)*)
+- qwerty287 (*German*)
+- pezcurrel (*Italian*)
+- Anoop (anoopp) (*Malayalam*)
+- Apple (blackteaovo) (*Chinese Simplified*)
+- Lilian Nabati (Lilounab49) (*French*)
+- ru_mactunnag (*Scottish Gaelic*)
+- Nocta (*French*)
+- Tangcuyu (*Chinese Simplified*)
+- Dennis Reimund (reimund_dennis) (*German*)
- Albatroz Jeremias (albjeremias) (*Portuguese*)
-- Matias Lavik (matiaslavik) (*Norwegian Nynorsk*)
-- Amith Raj Shetty (amithraj1989) (*Kannada*)
-- abidin toumi (Zet24) (*Arabic*)
-- mikel (mikelalas) (*Spanish*)
-- OpenAlgeria (*Arabic*)
-- random_person (*Spanish*)
-- Sais Lakshmanan (Saislakshmanan) (*Tamil*)
-- Trond Boksasp (boksasp) (*Norwegian*)
-- xpac1985 (xpac) (*German*)
-- Zlr- (cZeler) (*French*)
-- Mohammad Adnan Mahmood (adnanmig) (*Arabic*)
-- mimikun (*Japanese*)
-- smedvedev (*Russian*)
-- asretro (*Chinese Traditional, Hong Kong*)
+- Xurxo Guerra (xguerrap) (*Galician*)
+- Samir Tighzert (samir_t7) (*Kabyle*)
+- lokalisoija (*Finnish*)
+- codl (*French*)
+- thisdudeisvegan (braydofficial) (*German*)
- tamaina (*Japanese*)
+- Matias Lavik (matiaslavik) (*Norwegian Nynorsk*)
- Aman Alam (aalam) (*Punjabi*)
+- Holger Huo (holgerhuo) (*Chinese Simplified*)
+- Amith Raj Shetty (amithraj1989) (*Kannada*)
+- mimikun (*Japanese*)
+- Ragnars Eggerts (rmegg1933) (*Latvian*)
- ÀŘǾŚ PÀŚĦÀÍ (arospashai) (*Sorani (Kurdish)*)
-- Kaede (kaedech) (*Japanese*)
+- smedvedev (*Russian*)
+- Sais Lakshmanan (Saislakshmanan) (*Tamil*)
+- Mohammad Adnan Mahmood (adnanmig) (*Arabic*)
+- OpenAlgeria (*Arabic*)
+- Trond Boksasp (boksasp) (*Norwegian*)
- Doug (douglasalvespe) (*Portuguese, Brazilian*)
+- Mohd Bilal (mdb571) (*Malayalam*)
- Fleva (*Sardinian*)
-- Abijeet Patro (Abijeet) (*Basque*)
-- SamOak (*Portuguese, Brazilian*)
-- Aries (orlea) (*Japanese*)
-- Bartek Fijałkowski (brateq) (*Polish*)
-- NeverMine17 (*Russian*)
-- Brodi (brodi1) (*Dutch*)
-- Ács Zoltán (zoli111) (*Hungarian*)
-- capiscuas (*Spanish*)
-- Benjamin Cobb (benjamincobb) (*German*)
-- djoerd (*Dutch*)
-- waweic (*German*)
-- Amir Kurdo (kuraking202) (*Sorani (Kurdish)*)
-- dobrado (*Portuguese, Brazilian*)
-- Baban Abdulrahman (baban.abdulrehman) (*Sorani (Kurdish)*)
-- dcapillae (*Spanish*)
-- Azad ahmad (dashty) (*Sorani (Kurdish)*)
-- Salh_haji6 (*Sorani (Kurdish)*)
-- Ranj A Abdulqadir (RanjAhmed) (*Sorani (Kurdish)*)
-- tateisu (*Japanese*)
-- Savarín Electrográfico Marmota Intergalactica (herrero.maty) (*Spanish*)
-- ebrezhoneg (*Breton*)
-- 于晚霞 (xissshawww) (*Chinese Simplified*)
-- silverscat_3 (SilversCat) (*Japanese*)
-- centumix (*Japanese*)
-- umonaca (*Chinese Simplified*)
-- Ni Futchi (futchitwo) (*Japanese*)
-- おさ (osapon) (*Japanese*)
-- kavitha129 (*Tamil*)
-- Hannah (Aniqueper1) (*Chinese Simplified*)
-- Jiniux (*Italian*)
-- Jari Ronkainen (ronchaine) (*Finnish*)
+- xpac1985 (xpac) (*German*)
+- mikel (mikelalas) (*Spanish*)
+- random_person (*Spanish*)
+- asretro (*Chinese Traditional, Hong Kong*)
+- Arĝentakato (argxentakato) (*Japanese*)
- Nithya Mary (nithyamary25) (*Tamil*)
+- Azad ahmad (dashty) (*Sorani (Kurdish)*)
+- Bartek Fijałkowski (brateq) (*Polish*)
+- ebrezhoneg (*Breton*)
+- maksutheam (*Finnish*)
+- majorblazr (*Danish*)
+- Jill H. (kokakiwi) (*French*)
+- Patrice Boivin (patriceboivin58) (*French*)
+- centumix (*Japanese*)
+- 江尚寒 (jiangshanghan) (*Chinese Simplified*)
+- hud5634j (*Spanish*)
+- おさ (osapon) (*Japanese*)
+- Jiniux (*Italian*)
+- Hannah (Aniqueper1) (*Chinese Simplified*)
+- Ni Futchi (futchitwo) (*Japanese*)
+- dobrado (*Portuguese, Brazilian*)
+- dcapillae (*Spanish*)
+- Ranj A Abdulqadir (RanjAhmed) (*Sorani (Kurdish)*)
+- Kurdish Translator (Kurdish.boy) (*Sorani (Kurdish)*)
+- Amir Kurdo (kuraking202) (*Sorani (Kurdish)*)
+- umonaca (*Chinese Simplified*)
+- Jari Ronkainen (ronchaine) (*Finnish*)
+- djoerd (*Dutch*)
+- Savarín Electrográfico Marmota Intergalactica (herrero.maty) (*Spanish*)
+- 于晚霞 (xissshawww) (*Chinese Simplified*)
+- tateisu (*Japanese*)
+- NeverMine17 (*Russian*)
+- soheilkhanalipur (*Persian*)
+- SamOak (*Portuguese, Brazilian*)
+- kavitha129 (*Tamil*)
+- Salh_haji6 (*Sorani (Kurdish)*)
+- Brodi (brodi1) (*Dutch*)
+- capiscuas (*Spanish*)
+- HSD Channel (kvdbve34) (*Russian*)
+- Abijeet Patro (Abijeet) (*Basque*)
+- Ács Zoltán (zoli111) (*Hungarian*)
+- Benjamin Cobb (benjamincobb) (*German*)
+- waweic (*German*)
+- Aries (orlea) (*Japanese*)
diff --git a/Aptfile b/Aptfile
index b2cbad714..9235141ad 100644
--- a/Aptfile
+++ b/Aptfile
@@ -4,10 +4,8 @@ libicu-dev
libidn11
libidn11-dev
libpq-dev
-libprotobuf-dev
libxdamage1
libxfixes3
-protobuf-compiler
zlib1g-dev
libcairo2
libcroco3
diff --git a/CHANGELOG.md b/CHANGELOG.md
index c2eff7fa3..52a62a213 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -3,12 +3,202 @@ Changelog
All notable changes to this project will be documented in this file.
+## Unreleased
+### Added
+
+- **Add support for incoming edited posts** ([Gargron](https://github.com/mastodon/mastodon/pull/16697), [Gargron](https://github.com/mastodon/mastodon/pull/17727), [Gargron](https://github.com/mastodon/mastodon/pull/17728), [Gargron](https://github.com/mastodon/mastodon/pull/17320), [Gargron](https://github.com/mastodon/mastodon/pull/17404), [Gargron](https://github.com/mastodon/mastodon/pull/17390), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/17335), [Gargron](https://github.com/mastodon/mastodon/pull/17696), [Gargron](https://github.com/mastodon/mastodon/pull/17745), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/17740), [Gargron](https://github.com/mastodon/mastodon/pull/17697), [Gargron](https://github.com/mastodon/mastodon/pull/17648), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/17531), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/17499), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/17498), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/17380), [Gargron](https://github.com/mastodon/mastodon/pull/17373), [Gargron](https://github.com/mastodon/mastodon/pull/17334), [Gargron](https://github.com/mastodon/mastodon/pull/17333), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/17699), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/17748))
+ - Previous versions remain available for perusal and comparison
+ - People who reblogged a post are notified when it's edited
+ - New REST APIs:
+ - `PUT /api/v1/statuses/:id`
+ - `GET /api/v1/statuses/:id/history`
+ - `GET /api/v1/statuses/:id/source`
+ - New streaming API event:
+ - `status.update`
+- **Add appeals for moderator decisions** ([Gargron](https://github.com/mastodon/mastodon/pull/17364), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/17725), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/17566), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/17652), [Gargron](https://github.com/mastodon/mastodon/pull/17616), [Gargron](https://github.com/mastodon/mastodon/pull/17615), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/17554), [Gargron](https://github.com/mastodon/mastodon/pull/17523))
+ - All default moderator decisions now notify the affected user by e-mail
+ - They now link to an appeal page instead of suggesting replying to the e-mail
+ - They can now be found in account settings and not just e-mail
+ - Users can submit one appeal within 20 days of the decision
+ - Moderators can approve or reject the appeal
+- **Add notifications for posts deleted by moderators** ([Gargron](https://github.com/mastodon/mastodon/pull/17204), [Gargron](https://github.com/mastodon/mastodon/pull/17668), [Gargron](https://github.com/mastodon/mastodon/pull/17746), [Gargron](https://github.com/mastodon/mastodon/pull/17679), [Gargron](https://github.com/mastodon/mastodon/pull/17487))
+ - New, redesigned report view in admin UI
+ - Common report actions now only take one click to complete
+ - Deleting posts or marking as sensitive from report now notifies user
+ - Reports can be categorized by reason and specific rules violated
+ - The reasons are automatically cited in the notifications, except for spam
+ - Marking posts as sensitive now federates using post editing
+- **Add explore page with trending posts and links** ([Gargron](https://github.com/mastodon/mastodon/pull/17123), [Gargron](https://github.com/mastodon/mastodon/pull/17431), [Gargron](https://github.com/mastodon/mastodon/pull/16917), [Gargron](https://github.com/mastodon/mastodon/pull/17677), [Gargron](https://github.com/mastodon/mastodon/pull/16938), [Gargron](https://github.com/mastodon/mastodon/pull/17044), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/16978), [Gargron](https://github.com/mastodon/mastodon/pull/16979), [tribela](https://github.com/mastodon/mastodon/pull/17066), [Gargron](https://github.com/mastodon/mastodon/pull/17072), [Gargron](https://github.com/mastodon/mastodon/pull/17403), [noiob](https://github.com/mastodon/mastodon/pull/17624), [mayaeh](https://github.com/mastodon/mastodon/pull/17755), [mayaeh](https://github.com/mastodon/mastodon/pull/17757), [Gargron](https://github.com/mastodon/mastodon/pull/17760), [mayaeh](https://github.com/mastodon/mastodon/pull/17762))
+ - Hashtag trends algorithm is extended to work for posts and links
+ - Links are only considered if they have an adequate preview card
+ - Preview card generation has been improved to support structured data
+ - Links can only trend if the publisher (domain) has been approved
+ - Posts can only trend if the author has been approved
+ - Individual approval and rejection for posts and links is also available
+ - Moderators are notified about pending trends at most once every 2 hours
+ - Posts and link trends are language-specific
+ - Search page is redesigned into explore page in web UI
+ - Discovery tab is coming soon in official iOS and Android apps
+ - New REST APIs:
+ - `GET /api/v1/trends/links`
+ - `GET /api/v1/trends/statuses`
+ - `GET /api/v1/trends/tags` (alias of `GET /api/v1/trends`)
+ - `GET /api/v1/admin/trends/links`
+ - `GET /api/v1/admin/trends/statuses`
+ - `GET /api/v1/admin/trends/tags`
+- **Add graphs and retention metrics to admin dashboard** ([Gargron](https://github.com/mastodon/mastodon/pull/16829), [Gargron](https://github.com/mastodon/mastodon/pull/17617), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/17570), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/16910), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/16909), [mashirozx](https://github.com/mastodon/mastodon/pull/16884), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/16854))
+ - Dashboard shows more numbers with development over time
+ - Other data such as most used interface languages and sign-up sources
+ - User retention graph shows how many new users stick around
+ - New REST APIs:
+ - `POST /api/v1/admin/measures`
+ - `POST /api/v1/admin/dimensions`
+ - `POST /api/v1/admin/retention`
+- Add `GET /api/v1/accounts/familiar_followers` to REST API ([Gargron](https://github.com/mastodon/mastodon/pull/17700))
+- Add `POST /api/v1/accounts/:id/remove_from_followers` to REST API ([noellabo](https://github.com/mastodon/mastodon/pull/16864))
+- Add `category` and `rule_ids` params to `POST /api/v1/reports` IN REST API ([Gargron](https://github.com/mastodon/mastodon/pull/17492), [Gargron](https://github.com/mastodon/mastodon/pull/17682), [Gargron](https://github.com/mastodon/mastodon/pull/17713))
+ - `category` can be one of: `spam`, `violation`, `other` (default)
+ - `rule_ids` must reference `rules` returned in `GET /api/v1/instance`
+- Add global `lang` param to REST API ([Gargron](https://github.com/mastodon/mastodon/pull/17464), [Gargron](https://github.com/mastodon/mastodon/pull/17592))
+- Add `types` param to `GET /api/v1/notifications` in REST API ([Gargron](https://github.com/mastodon/mastodon/pull/17767))
+- **Add notifications for moderators about new sign-ups** ([Gargron](https://github.com/mastodon/mastodon/pull/16953), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/17629))
+ - When a new user confirms e-mail, moderators receive a notification
+ - New notification type:
+ - `admin.sign_up`
+- Add authentication history ([Gargron](https://github.com/mastodon/mastodon/pull/16408), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/16428), [baby-gnu](https://github.com/mastodon/mastodon/pull/16654))
+- Add ability to automatically delete old posts ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/16529), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/17691), [tribela](https://github.com/mastodon/mastodon/pull/16653))
+- Add ability to pin private posts ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/16954), [tribela](https://github.com/mastodon/mastodon/pull/17326), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/17304), [MitarashiDango](https://github.com/mastodon/mastodon/pull/17647))
+- Add ability to filter search results by author using `from:` syntax ([tribela](https://github.com/mastodon/mastodon/pull/16526))
+- Add ability to delete canonical email blocks in admin UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/16644))
+- Add ability to purge undeliverable domains in admin UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/16686), [tribela](https://github.com/mastodon/mastodon/pull/17210), [tribela](https://github.com/mastodon/mastodon/pull/17741), [tribela](https://github.com/mastodon/mastodon/pull/17209))
+- Add ability to disable e-mail token authentication for specific users in admin UI ([Gargron](https://github.com/mastodon/mastodon/pull/16427))
+- **Add ability to suspend accounts in batches in admin UI** ([Gargron](https://github.com/mastodon/mastodon/pull/17009), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/17301), [Gargron](https://github.com/mastodon/mastodon/pull/17444))
+ - New, redesigned accounts list in admin UI
+ - Batch suspensions are meant to help clean up spam and bot accounts
+ - They do not generate notifications
+- Add ability to filter reports by origin of target account in admin UI ([Gargron](https://github.com/mastodon/mastodon/pull/16487))
+- Add support for login through OpenID Connect ([chandrn7](https://github.com/mastodon/mastodon/pull/16221))
+- Add lazy loading for emoji picker in web UI ([mashirozx](https://github.com/mastodon/mastodon/pull/16907), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/17011))
+- Add single option votes tooltip in polls in web UI ([Brawaru](https://github.com/mastodon/mastodon/pull/16849))
+- Add confirmation modal when closing media edit modal with unsaved changes in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/16518))
+- Add support for fetching Create and Announce activities by URI in ActivityPub ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/16383))
+- Add `S3_FORCE_SINGLE_REQUEST` environment variable ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/16866))
+- Add `OMNIAUTH_ONLY` environment variable ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/17288), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/17345))
+- Add `ES_USER` and `ES_PASS` environment variables for Elasticsearch authentication ([tribela](https://github.com/mastodon/mastodon/pull/16890))
+- Add `CAS_SECURITY_ASSUME_EMAIL_IS_VERIFIED` environment variable ([baby-gnu](https://github.com/mastodon/mastodon/pull/16655))
+- Add ability to pass specific domains to `tootctl accounts cull` ([tribela](https://github.com/mastodon/mastodon/pull/16511))
+- Add `--by-uri` option to `tootctl domains purge` ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/16434))
+- Add `--batch-size` option to `tootctl search deploy` ([aquarla](https://github.com/mastodon/mastodon/pull/17049))
+- Add `--remove-orphans` option to `tootctl statuses remove` ([noellabo](https://github.com/mastodon/mastodon/pull/17067))
+
+### Changed
+
+- Change design of federation pages in admin UI ([Gargron](https://github.com/mastodon/mastodon/pull/17704), [noellabo](https://github.com/mastodon/mastodon/pull/17735), [Gargron](https://github.com/mastodon/mastodon/pull/17765))
+- Change design of account cards in web UI ([Gargron](https://github.com/mastodon/mastodon/pull/17689))
+- Change `follow` scope to be covered by `read` and `write` scopes in REST API ([Gargron](https://github.com/mastodon/mastodon/pull/17678))
+- Change design of authorized applications page ([Gargron](https://github.com/mastodon/mastodon/pull/17656), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/17686))
+- Change e-mail domain blocks to block IPs dynamically ([Gargron](https://github.com/mastodon/mastodon/pull/17635), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/17650), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/17649))
+- Change report modal to include category selection in web UI ([Gargron](https://github.com/mastodon/mastodon/pull/17565), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/17734), [Gargron](https://github.com/mastodon/mastodon/pull/17654), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/17632))
+- Change reblogs to not count towards hashtag trends anymore ([Gargron](https://github.com/mastodon/mastodon/pull/17501))
+- Change languages to be listed under standard instead of native name in admin UI ([Gargron](https://github.com/mastodon/mastodon/pull/17485))
+- Change routing paths to use usernames in web UI ([Gargron](https://github.com/mastodon/mastodon/pull/16171), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/16772), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/16773), [mashirozx](https://github.com/mastodon/mastodon/pull/16793), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/17060))
+- Change list title input design in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/17092))
+- Change "Opt-in to profile directory" preference to be general discoverability preference ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/16637))
+- Change API rate limits to use /64 masking on IPv6 addresses ([tribela](https://github.com/mastodon/mastodon/pull/17588), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/17600), [zunda](https://github.com/mastodon/mastodon/pull/17590))
+- Change allowed formats for locally uploaded custom emojis to include GIF ([rgroothuijsen](https://github.com/mastodon/mastodon/pull/17706), [Gargron](https://github.com/mastodon/mastodon/pull/17759))
+- Change error message when chosen password is too long ([rgroothuijsen](https://github.com/mastodon/mastodon/pull/17082))
+- Change minimum required Elasticsearch version from 6 to 7 ([noellabo](https://github.com/mastodon/mastodon/pull/16915))
+
+### Removed
+
+- Remove profile directory link from main navigation panel in web UI ([Gargron](https://github.com/mastodon/mastodon/pull/17688))
+- **Remove language detection through cld3** ([Gargron](https://github.com/mastodon/mastodon/pull/17478), [ykzts](https://github.com/mastodon/mastodon/pull/17539), [Gargron](https://github.com/mastodon/mastodon/pull/17496), [Gargron](https://github.com/mastodon/mastodon/pull/17722))
+ - cld3 is very inaccurate on short-form content even with unique alphabets
+ - Post language can be overriden individually using `language` param
+ - Otherwise, it defaults to the user's interface language
+- Remove support for `OAUTH_REDIRECT_AT_SIGN_IN` ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/17287))
+ - Use `OMNIAUTH_ONLY` instead
+- Remove Keybase integration ([Gargron](https://github.com/mastodon/mastodon/pull/17045))
+- Remove old columns and indexes ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/17245), [Gargron](https://github.com/mastodon/mastodon/pull/16409), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/17191))
+- Remove shortcodes from newly-created media attachments ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/16730), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/16763))
+
+### Deprecated
+
+- `GET /api/v1/trends` → `GET /api/v1/trends/tags`
+- OAuth `follow` scope → `read` and/or `write`
+- `text` attribute on `DELETE /api/v1/statuses/:id` → `GET /api/v1/statuses/:id/source`
+
+### Fixed
+
+- Fix web manifest not permitting PWA usage from alternate domains ([HolgerHuo](https://github.com/mastodon/mastodon/pull/16714))
+- Fix not being able to edit media attachments for scheduled posts ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/17690))
+- Fix subscribed relay activities being recorded as boosts ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/17571))
+- Fix streaming API server error messages when JSON parsing fails not specifying the source ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/17559))
+- Fix browsers autofilling new password field with old password ([mashirozx](https://github.com/mastodon/mastodon/pull/17702))
+- Fix text being invisible before fonts load in web UI ([tribela](https://github.com/mastodon/mastodon/pull/16330))
+- Fix public profile pages of unconfirmed users being accessible ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/17385), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/17457))
+- Fix nil error when trying to fetch key for signature verification ([Gargron](https://github.com/mastodon/mastodon/pull/17747))
+- Fix null values being included in some indexes ([Gargron](https://github.com/mastodon/mastodon/pull/17711))
+- Fix `POST /api/v1/emails/confirmations` not being available after sign-up ([Gargron](https://github.com/mastodon/mastodon/pull/17743))
+- Fix rare race condition when reblogged post is deleted ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/17693), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/17730))
+- Fix being able to add more than 4 hashtags to hashtag column in web UI ([Gargron](https://github.com/mastodon/mastodon/pull/17729))
+- Fix data integrity of featured tags ([Gargron](https://github.com/mastodon/mastodon/pull/17712))
+- Fix performance of account timelines ([Gargron](https://github.com/mastodon/mastodon/pull/17709))
+- Fix returning empty `
` tag for blank account `note` in REST API ([Gargron](https://github.com/mastodon/mastodon/pull/17687))
+- Fix leak of existence of otherwise inaccessible posts in REST API ([Gargron](https://github.com/mastodon/mastodon/pull/17684))
+- Fix not showing loading indicator when searching in web UI ([Gargron](https://github.com/mastodon/mastodon/pull/17655))
+- Fix media modal footer's “external link” not being a link ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/17561))
+- Fix reply button on media modal not giving focus to compose form ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/17626))
+- Fix some media attachments being converted with too high framerates ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/17619))
+- Fix sign in token and warning emails failing to send when contact e-mail address is malformed ([helloworldstack](https://github.com/mastodon/mastodon/pull/17589))
+- Fix opening the emoji picker scrolling the single-column view to the top ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/17579))
+- Fix edge case where settings/admin page sidebar would be incorrectly hidden ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/17580))
+- Fix performance of server-side filtering ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/17575))
+- Fix privacy policy link not being visible on small screens ([Gargron](https://github.com/mastodon/mastodon/pull/17533))
+- Fix duplicate accounts when searching by IP range in admin UI ([Gargron](https://github.com/mastodon/mastodon/pull/17524), [tribela](https://github.com/mastodon/mastodon/pull/17150))
+- Fix error when performing a batch action on posts in admin UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/17532))
+- Fix deletes not being signed in authorized fetch mode ([Gargron](https://github.com/mastodon/mastodon/pull/17484))
+- Fix Undo Announce sometimes inlining the originally Announced status ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/17516))
+- Fix localization of cold-start follow recommendations ([Gargron](https://github.com/mastodon/mastodon/pull/17479), [Gargron](https://github.com/mastodon/mastodon/pull/17486))
+- Fix replies collection incorrectly looping ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/17462))
+- Fix errors when multiple Delete are received for a given actor ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/17460))
+- Fixed prototype pollution bug and only allow trusted origin ([r0hanSH](https://github.com/mastodon/mastodon/pull/17420))
+- Fix text being incorrectly pre-selected in composer textarea on /share ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/17339))
+- Fix SMTP_ENABLE_STARTTLS_AUTO/SMTP_TLS/SMTP_SSL environment variables don't work ([kgtkr](https://github.com/mastodon/mastodon/pull/17216))
+- Fix media upload specific rate limits only being applied to v1 endpoint in REST API ([tribela](https://github.com/mastodon/mastodon/pull/17272))
+- Fix media descriptions not being used for client-side filtering ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/17206))
+- Fix cold-start follow recommendation favouring older accounts due to wrong sorting ([noellabo](https://github.com/mastodon/mastodon/pull/17126))
+- Fix not redirect to the right page after authenticating with WebAuthn ([heguro](https://github.com/mastodon/mastodon/pull/17098))
+- Fix searching for additional hashtags in hashtag column ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/17054))
+- Fix color of hashtag column settings inputs ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/17058))
+- Fix performance of `tootctl statuses remove` ([noellabo](https://github.com/mastodon/mastodon/pull/17052))
+- Fix `tootctl accounts cull` not excluding domains on timeouts and certificate issues ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/16433))
+- Fix 404 error when filtering admin action logs by non-existent target account ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/16643))
+- Fix error when accessing streaming API without any OAuth scopes ([Brawaru](https://github.com/mastodon/mastodon/pull/16823))
+- Fix follow request count not updating when new follow requests arrive over streaming API in web UI ([matildepark](https://github.com/mastodon/mastodon/pull/16652))
+- Fix error when unsuspending a local account ([HolgerHuo](https://github.com/mastodon/mastodon/pull/16605))
+- Fix crash when a notification contains a not yet processed media attachment in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/16573))
+- Fix wrong color of download button in audio player in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/16572))
+- Fix notes for others accounts not being deleted when an account is deleted ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/16579))
+- Fix error when logging occurrence of unsupported video file ([noellabo](https://github.com/mastodon/mastodon/pull/16581))
+- Fix wrong elements in trends widget being hidden on smaller screens in web UI ([tribela](https://github.com/mastodon/mastodon/pull/16570))
+- Fix link to about page being displayed in limited federation mode ([weex](https://github.com/mastodon/mastodon/pull/16432))
+- Fix styling of boost button in media modal not reflecting ability to boost ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/16387))
+- Fix OCR failure when erroneous lang data is in cache ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/16386))
+- Fix downloading media from blocked domains in `tootctl media refresh` ([tribela](https://github.com/mastodon/mastodon/pull/16914))
+- Fix login form being displayed on landing page when already logged in ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/17348))
+- Fix polling for media processing status too frequently in web UI ([tribela](https://github.com/mastodon/mastodon/pull/17271))
+- Fix hashtag autocomplete overriding user-typed case ([weex](https://github.com/mastodon/mastodon/pull/16460))
+- Fix WebAuthn authentication setup to not prompt for PIN ([truongnmt](https://github.com/mastodon/mastodon/pull/16545))
+
## [3.4.6] - 2022-02-03
### Fixed
+
- Fix `mastodon:webpush:generate_vapid_key` task requiring a functional environment ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/17338))
- Fix spurious errors when receiving an Add activity for a private post ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/17425))
### Security
+
- Fix error-prone SQL queries ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/15828))
- Fix not compacting incoming signed JSON-LD activities ([puckipedia](https://github.com/mastodon/mastodon/pull/17426), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/17428)) (CVE-2022-24307)
- Fix insufficient sanitization of report comments ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/17430))
@@ -17,10 +207,12 @@ All notable changes to this project will be documented in this file.
## [3.4.5] - 2022-01-31
### Added
+
- Add more advanced migration tests ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/17393))
- Add github workflow to build Docker images ([unasuke](https://github.com/mastodon/mastodon/pull/16973), [Gargron](https://github.com/mastodon/mastodon/pull/16980), [Gargron](https://github.com/mastodon/mastodon/pull/17000))
### Fixed
+
- Fix some old migrations failing when skipping releases ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/17394))
- Fix migrations script failing in certain edge cases ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/17398))
- Fix Docker build ([tribela](https://github.com/mastodon/mastodon/pull/17188))
@@ -83,7 +275,7 @@ All notable changes to this project will be documented in this file.
- Fix suspended accounts statuses being merged back into timelines ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/16628))
- Fix crash when encountering invalid account fields ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/16598))
- Fix invalid blurhash handling for remote activities ([noellabo](https://github.com/mastodon/mastodon/pull/16583))
-- Fix newlines being added to accout notes when an account moves ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/16415), [noellabo](https://github.com/mastodon/mastodon/pull/16576))
+- Fix newlines being added to account notes when an account moves ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/16415), [noellabo](https://github.com/mastodon/mastodon/pull/16576))
- Fix crash when creating an announcement with links ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/16941))
- Fix logging out from one browser logging out all other sessions ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/16943))
@@ -416,7 +608,7 @@ All notable changes to this project will be documented in this file.
- Fix inefficiency when fetching bookmarks ([akihikodaki](https://github.com/mastodon/mastodon/pull/14674))
- Fix inefficiency when fetching favourites ([akihikodaki](https://github.com/mastodon/mastodon/pull/14673))
- Fix inefficiency when fetching media-only account timeline ([akihikodaki](https://github.com/mastodon/mastodon/pull/14675))
-- Fix inefficieny when deleting accounts ([Gargron](https://github.com/mastodon/mastodon/pull/15387), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/15409), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/15407), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/15408), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/15402), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/15416), [Gargron](https://github.com/mastodon/mastodon/pull/15421))
+- Fix inefficiency when deleting accounts ([Gargron](https://github.com/mastodon/mastodon/pull/15387), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/15409), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/15407), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/15408), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/15402), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/15416), [Gargron](https://github.com/mastodon/mastodon/pull/15421))
- Fix redundant query when processing batch actions on custom emojis ([niwatori24](https://github.com/mastodon/mastodon/pull/14534))
- Fix slow distinct queries where grouped queries are faster ([Gargron](https://github.com/mastodon/mastodon/pull/15287))
- Fix performance on instances list in admin UI ([Gargron](https://github.com/mastodon/mastodon/pull/15282))
@@ -503,7 +695,7 @@ All notable changes to this project will be documented in this file.
- Add blurhash to link previews ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13984), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/14143), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/13985), [Sasha-Sorokin](https://github.com/mastodon/mastodon/pull/14267), [Sasha-Sorokin](https://github.com/mastodon/mastodon/pull/14278), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/14126), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/14261), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/14260))
- In web UI, toots cannot be marked as sensitive unless there is media attached
- However, it's possible to do via API or ActivityPub
- - Thumnails of link previews of such posts now use blurhash in web UI
+ - Thumbnails of link previews of such posts now use blurhash in web UI
- The Card entity in REST API has a new `blurhash` attribute
- Add support for `summary` field for media description in ActivityPub ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13763))
- Add hints about incomplete remote content to web UI ([Gargron](https://github.com/mastodon/mastodon/pull/14031), [noellabo](https://github.com/mastodon/mastodon/pull/14195))
@@ -526,7 +718,7 @@ All notable changes to this project will be documented in this file.
- The `meta` attribute on the Media Attachment entity in REST API can now have a `colors` attribute which in turn contains three hex colors: `background`, `foreground`, and `accent`
- The background color is chosen from the most dominant color around the edges of the thumbnail
- The foreground and accent colors are chosen from the colors that are the most different from the background color using the CIEDE2000 algorithm
- - The most satured color of the two is designated as the accent color
+ - The most saturated color of the two is designated as the accent color
- The one with the highest W3C contrast is designated as the foreground color
- If there are not enough colors in the thumbnail, new ones are generated using a monochrome pattern
- Add a visibility indicator to toots in web UI ([noellabo](https://github.com/mastodon/mastodon/pull/14123), [highemerly](https://github.com/mastodon/mastodon/pull/14292))
@@ -552,7 +744,7 @@ All notable changes to this project will be documented in this file.
- Change boost button to no longer serve as visibility indicator in web UI ([noellabo](https://github.com/mastodon/mastodon/pull/14132), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/14373))
- Change contrast of flash messages ([cchoi12](https://github.com/mastodon/mastodon/pull/13892))
- Change wording from "Hide media" to "Hide image/images" in web UI ([ariasuni](https://github.com/mastodon/mastodon/pull/13834))
-- Change appearence of settings pages to be more consistent ([ariasuni](https://github.com/mastodon/mastodon/pull/13938))
+- Change appearance of settings pages to be more consistent ([ariasuni](https://github.com/mastodon/mastodon/pull/13938))
- Change "Add media" tooltip to not include long list of formats in web UI ([ariasuni](https://github.com/mastodon/mastodon/pull/13954))
- Change how badly contrasting emoji are rendered in web UI ([leo60228](https://github.com/mastodon/mastodon/pull/13773), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/13772), [mfmfuyu](https://github.com/mastodon/mastodon/pull/14020), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/14015))
- Change structure of unavailable content section on about page ([ariasuni](https://github.com/mastodon/mastodon/pull/13930))
@@ -568,14 +760,14 @@ All notable changes to this project will be documented in this file.
- `EMAIL_DOMAIN_WHITELIST` → `EMAIL_DOMAIN_ALLOWLIST`
- CLI option changed:
- `tootctl domains purge --whitelist-mode` → `tootctl domains purge --limited-federation-mode`
-- Remove some unnecessary database indices ([lfuelling](https://github.com/mastodon/mastodon/pull/13695), [noellabo](https://github.com/mastodon/mastodon/pull/14259))
+- Remove some unnecessary database indexes ([lfuelling](https://github.com/mastodon/mastodon/pull/13695), [noellabo](https://github.com/mastodon/mastodon/pull/14259))
- Remove unnecessary Node.js version upper bound ([ykzts](https://github.com/mastodon/mastodon/pull/14139))
### Fixed
- Fix `following` param not working when exact match is found in account search ([noellabo](https://github.com/mastodon/mastodon/pull/14394))
-- Fix sometimes occuring duplicate mention notifications ([noellabo](https://github.com/mastodon/mastodon/pull/14378))
-- Fix RSS feeds not being cachable ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/14368))
+- Fix sometimes occurring duplicate mention notifications ([noellabo](https://github.com/mastodon/mastodon/pull/14378))
+- Fix RSS feeds not being cacheable ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/14368))
- Fix lack of locking around processing of Announce activities in ActivityPub ([noellabo](https://github.com/mastodon/mastodon/pull/14365))
- Fix boosted toots from blocked account not being retroactively removed from TL ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/14339))
- Fix large shortened numbers (like 1.2K) using incorrect pluralization ([Sasha-Sorokin](https://github.com/mastodon/mastodon/pull/14061))
@@ -587,7 +779,7 @@ All notable changes to this project will be documented in this file.
- Fix new posts pushing down origin of opened dropdown in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/14271), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/14348))
- Fix timeline markers not being saved sometimes ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13887), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/13889), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/14155))
- Fix CSV uploads being rejected ([noellabo](https://github.com/mastodon/mastodon/pull/13835))
-- Fix incompatibility with ElasticSearch 7.x ([noellabo](https://github.com/mastodon/mastodon/pull/13828))
+- Fix incompatibility with Elasticsearch 7.x ([noellabo](https://github.com/mastodon/mastodon/pull/13828))
- Fix being able to search posts where you're in the target audience but not actively mentioned ([noellabo](https://github.com/mastodon/mastodon/pull/13829))
- Fix non-local posts appearing on local-only hashtag timelines in web UI ([noellabo](https://github.com/mastodon/mastodon/pull/13827))
- Fix `tootctl media remove-orphans` choking on unknown files in storage ([Gargron](https://github.com/mastodon/mastodon/pull/13765))
@@ -702,7 +894,7 @@ All notable changes to this project will be documented in this file.
- Fix poll refresh button not being debounced in web UI ([rasjonell](https://github.com/mastodon/mastodon/pull/13485), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/13490))
- Fix confusing error when failing to add an alias to an unknown account ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13480))
- Fix "Email changed" notification sometimes having wrong e-mail ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13475))
-- Fix varioues issues on the account aliases page ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13452))
+- Fix various issues on the account aliases page ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13452))
- Fix API footer link in web UI ([bubblineyuri](https://github.com/mastodon/mastodon/pull/13441))
- Fix pagination of following, followers, follow requests, blocks and mutes lists in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13445))
- Fix styling of polls in JS-less fallback on public pages ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13436))
@@ -1191,7 +1383,7 @@ All notable changes to this project will be documented in this file.
- Fix URLs appearing twice in errors of ActivityPub::DeliveryWorker ([Gargron](https://github.com/mastodon/mastodon/pull/11231))
- Fix support for HTTP proxies ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/11245))
- Fix HTTP requests to IPv6 hosts ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/11240))
-- Fix error in ElasticSearch index import ([mayaeh](https://github.com/mastodon/mastodon/pull/11192))
+- Fix error in Elasticsearch index import ([mayaeh](https://github.com/mastodon/mastodon/pull/11192))
- Fix duplicate account error when seeding development database ([ysksn](https://github.com/mastodon/mastodon/pull/11366))
- Fix performance of session clean-up scheduler ([abcang](https://github.com/mastodon/mastodon/pull/11871))
- Fix older migrations not running ([zunda](https://github.com/mastodon/mastodon/pull/11377))
@@ -1201,8 +1393,8 @@ All notable changes to this project will be documented in this file.
- Fix muted text color not applying to all text ([trwnh](https://github.com/mastodon/mastodon/pull/11996))
- Fix follower/following lists resetting on back-navigation in web UI ([Gargron](https://github.com/mastodon/mastodon/pull/11986))
- Fix n+1 query when approving multiple follow requests ([abcang](https://github.com/mastodon/mastodon/pull/12004))
-- Fix records not being indexed into ElasticSearch sometimes ([Gargron](https://github.com/mastodon/mastodon/pull/12024))
-- Fix needlessly indexing unsearchable statuses into ElasticSearch ([Gargron](https://github.com/mastodon/mastodon/pull/12041))
+- Fix records not being indexed into Elasticsearch sometimes ([Gargron](https://github.com/mastodon/mastodon/pull/12024))
+- Fix needlessly indexing unsearchable statuses into Elasticsearch ([Gargron](https://github.com/mastodon/mastodon/pull/12041))
- Fix new user bootstrapping crashing when to-be-followed accounts are invalid ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/12037))
- Fix featured hashtag URL being interpreted as media or replies tab ([Gargron](https://github.com/mastodon/mastodon/pull/12048))
- Fix account counters being overwritten by parallel writes ([Gargron](https://github.com/mastodon/mastodon/pull/12045))
@@ -1492,7 +1684,7 @@ All notable changes to this project will be documented in this file.
- Change Docker image to use Ubuntu with jemalloc ([Sir-Boops](https://github.com/mastodon/mastodon/pull/10100), [BenLubar](https://github.com/mastodon/mastodon/pull/10212))
- Change public pages to be cacheable by proxies ([BenLubar](https://github.com/mastodon/mastodon/pull/9059))
- Change the 410 gone response for suspended accounts to be cacheable by proxies ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/10339))
-- Change web UI to not not empty timeline of blocked users on block ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/10359))
+- Change web UI to not empty timeline of blocked users on block ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/10359))
- Change JSON serializer to remove unused `@context` values ([Gargron](https://github.com/mastodon/mastodon/pull/10378))
- Change GIFV file size limit to be the same as for other videos ([rinsuki](https://github.com/mastodon/mastodon/pull/9924))
- Change Webpack to not use @babel/preset-env to compile node_modules ([ykzts](https://github.com/mastodon/mastodon/pull/10289))
@@ -1669,7 +1861,7 @@ All notable changes to this project will be documented in this file.
- Limit maximum visibility of local silenced users to unlisted ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/9583))
- Change API error message for unconfirmed accounts ([noellabo](https://github.com/mastodon/mastodon/pull/9625))
- Change the icon to "reply-all" when it's a reply to other accounts ([mayaeh](https://github.com/mastodon/mastodon/pull/9378))
-- Do not ignore federated reports targetting already-reported accounts ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/9534))
+- Do not ignore federated reports targeting already-reported accounts ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/9534))
- Upgrade default Ruby version to 2.6.0 ([Gargron](https://github.com/mastodon/mastodon/pull/9688))
- Change e-mail digest frequency ([Gargron](https://github.com/mastodon/mastodon/pull/9689))
- Change Docker images for Tor support in docker-compose.yml ([Sir-Boops](https://github.com/mastodon/mastodon/pull/9438))
diff --git a/Dockerfile b/Dockerfile
index c6287b5a7..2073cbebf 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -5,7 +5,7 @@ SHELL ["/bin/bash", "-c"]
RUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections
# Install Node v16 (LTS)
-ENV NODE_VER="16.13.2"
+ENV NODE_VER="16.14.2"
RUN ARCH= && \
dpkgArch="$(dpkg --print-architecture)" && \
case "${dpkgArch##*-}" in \
@@ -51,7 +51,7 @@ RUN npm install -g npm@latest && \
gem install bundler && \
apt-get update && \
apt-get install -y --no-install-recommends git libicu-dev libidn11-dev \
- libpq-dev libprotobuf-dev protobuf-compiler shared-mime-info
+ libpq-dev shared-mime-info
COPY Gemfile* package.json yarn.lock /opt/mastodon/
@@ -88,7 +88,7 @@ RUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selectio
RUN apt-get update && \
apt-get -y --no-install-recommends install \
libssl1.1 libpq5 imagemagick ffmpeg libjemalloc2 \
- libicu66 libprotobuf17 libidn11 libyaml-0-2 \
+ libicu66 libidn11 libyaml-0-2 \
file ca-certificates tzdata libreadline8 gcc tini apt-utils && \
ln -s /opt/mastodon /mastodon && \
gem install bundler && \
diff --git a/Gemfile b/Gemfile
index 1ddb6f383..8bb361f49 100644
--- a/Gemfile
+++ b/Gemfile
@@ -6,8 +6,8 @@ ruby '>= 2.5.0', '< 3.1.0'
gem 'pkg-config', '~> 1.4'
gem 'rexml', '~> 3.2'
-gem 'puma', '~> 5.5'
-gem 'rails', '~> 6.1.4'
+gem 'puma', '~> 5.6'
+gem 'rails', '~> 6.1.5'
gem 'sprockets', '~> 3.7.2'
gem 'thor', '~> 1.2'
gem 'rack', '~> 2.2.3'
@@ -18,20 +18,18 @@ gem 'makara', '~> 0.5'
gem 'pghero', '~> 2.8'
gem 'dotenv-rails', '~> 2.7'
-gem 'aws-sdk-s3', '~> 1.111', require: false
+gem 'aws-sdk-s3', '~> 1.113', require: false
gem 'fog-core', '<= 2.1.0'
gem 'fog-openstack', '~> 0.3', require: false
-gem 'kt-paperclip', '~> 7.0'
+gem 'kt-paperclip', '~> 7.1'
gem 'blurhash', '~> 0.1'
gem 'active_model_serializers', '~> 0.10'
gem 'addressable', '~> 2.8'
-gem 'bootsnap', '~> 1.10.2', require: false
+gem 'bootsnap', '~> 1.10.3', require: false
gem 'browser'
gem 'charlock_holmes', '~> 0.7.7'
-gem 'iso-639'
gem 'chewy', '~> 7.2'
-gem 'cld3', '~> 3.4.4'
gem 'devise', '~> 4.8'
gem 'devise-two-factor', '~> 4.0'
@@ -42,6 +40,7 @@ end
gem 'net-ldap', '~> 0.17'
gem 'omniauth-cas', '~> 2.0'
gem 'omniauth-saml', '~> 1.10'
+gem 'gitlab-omniauth-openid-connect', '~>0.5.0', require: 'omniauth_openid_connect'
gem 'omniauth', '~> 1.9'
gem 'omniauth-rails_csrf_protection', '~> 0.1'
@@ -67,9 +66,9 @@ gem 'oj', '~> 3.13'
gem 'ox', '~> 2.14'
gem 'parslet'
gem 'posix-spawn'
-gem 'pundit', '~> 2.1'
+gem 'pundit', '~> 2.2'
gem 'premailer-rails'
-gem 'rack-attack', '~> 6.5'
+gem 'rack-attack', '~> 6.6'
gem 'rack-cors', '~> 1.1', require: 'rack/cors'
gem 'rails-i18n', '~> 6.0'
gem 'rails-settings-cached', '~> 0.6'
@@ -78,7 +77,7 @@ gem 'mario-redis-lock', '~> 1.2', require: 'redis_lock'
gem 'rqrcode', '~> 2.1'
gem 'ruby-progressbar', '~> 1.11'
gem 'sanitize', '~> 6.0'
-gem 'scenic', '~> 1.5'
+gem 'scenic', '~> 1.6'
gem 'sidekiq', '~> 6.4'
gem 'sidekiq-scheduler', '~> 3.1'
gem 'sidekiq-unique-jobs', '~> 7.1'
@@ -90,7 +89,7 @@ gem 'stoplight', '~> 2.2.1'
gem 'strong_migrations', '~> 0.7'
gem 'tty-prompt', '~> 0.23', require: false
gem 'twitter-text', '~> 3.1.0'
-gem 'tzinfo-data', '~> 1.2021'
+gem 'tzinfo-data', '~> 1.2022'
gem 'webpacker', '~> 5.4'
gem 'webpush', '~> 0.3'
gem 'webauthn', '~> 3.0.0.alpha1'
@@ -102,12 +101,12 @@ gem 'rdf-normalize', '~> 0.5'
gem 'redcarpet', '~> 3.5'
group :development, :test do
- gem 'fabrication', '~> 2.24'
+ gem 'fabrication', '~> 2.27'
gem 'fuubar', '~> 2.5'
gem 'i18n-tasks', '~> 0.9', require: false
gem 'pry-byebug', '~> 3.9'
gem 'pry-rails', '~> 0.3'
- gem 'rspec-rails', '~> 5.0'
+ gem 'rspec-rails', '~> 5.1'
end
group :production, :test do
@@ -117,7 +116,7 @@ end
group :test do
gem 'capybara', '~> 3.36'
gem 'climate_control', '~> 0.2'
- gem 'faker', '~> 2.19'
+ gem 'faker', '~> 2.20'
gem 'microformats', '~> 4.2'
gem 'rails-controller-testing', '~> 1.0'
gem 'rspec-sidekiq', '~> 3.1'
@@ -128,15 +127,15 @@ end
group :development do
gem 'active_record_query_trace', '~> 1.8'
- gem 'annotate', '~> 3.1'
+ gem 'annotate', '~> 3.2'
gem 'better_errors', '~> 2.9'
gem 'binding_of_caller', '~> 1.0'
gem 'bullet', '~> 7.0'
- gem 'letter_opener', '~> 1.7'
+ gem 'letter_opener', '~> 1.8'
gem 'letter_opener_web', '~> 2.0'
gem 'memory_profiler'
- gem 'rubocop', '~> 1.25', require: false
- gem 'rubocop-rails', '~> 2.13', require: false
+ gem 'rubocop', '~> 1.26', require: false
+ gem 'rubocop-rails', '~> 2.14', require: false
gem 'brakeman', '~> 5.2', require: false
gem 'bundler-audit', '~> 0.9', require: false
diff --git a/Gemfile.lock b/Gemfile.lock
index 550a79c87..5ee2b9c26 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -1,40 +1,40 @@
GEM
remote: https://rubygems.org/
specs:
- actioncable (6.1.4.4)
- actionpack (= 6.1.4.4)
- activesupport (= 6.1.4.4)
+ actioncable (6.1.5)
+ actionpack (= 6.1.5)
+ activesupport (= 6.1.5)
nio4r (~> 2.0)
websocket-driver (>= 0.6.1)
- actionmailbox (6.1.4.4)
- actionpack (= 6.1.4.4)
- activejob (= 6.1.4.4)
- activerecord (= 6.1.4.4)
- activestorage (= 6.1.4.4)
- activesupport (= 6.1.4.4)
+ actionmailbox (6.1.5)
+ actionpack (= 6.1.5)
+ activejob (= 6.1.5)
+ activerecord (= 6.1.5)
+ activestorage (= 6.1.5)
+ activesupport (= 6.1.5)
mail (>= 2.7.1)
- actionmailer (6.1.4.4)
- actionpack (= 6.1.4.4)
- actionview (= 6.1.4.4)
- activejob (= 6.1.4.4)
- activesupport (= 6.1.4.4)
+ actionmailer (6.1.5)
+ actionpack (= 6.1.5)
+ actionview (= 6.1.5)
+ activejob (= 6.1.5)
+ activesupport (= 6.1.5)
mail (~> 2.5, >= 2.5.4)
rails-dom-testing (~> 2.0)
- actionpack (6.1.4.4)
- actionview (= 6.1.4.4)
- activesupport (= 6.1.4.4)
+ actionpack (6.1.5)
+ actionview (= 6.1.5)
+ activesupport (= 6.1.5)
rack (~> 2.0, >= 2.0.9)
rack-test (>= 0.6.3)
rails-dom-testing (~> 2.0)
rails-html-sanitizer (~> 1.0, >= 1.2.0)
- actiontext (6.1.4.4)
- actionpack (= 6.1.4.4)
- activerecord (= 6.1.4.4)
- activestorage (= 6.1.4.4)
- activesupport (= 6.1.4.4)
+ actiontext (6.1.5)
+ actionpack (= 6.1.5)
+ activerecord (= 6.1.5)
+ activestorage (= 6.1.5)
+ activesupport (= 6.1.5)
nokogiri (>= 1.8.5)
- actionview (6.1.4.4)
- activesupport (= 6.1.4.4)
+ actionview (6.1.5)
+ activesupport (= 6.1.5)
builder (~> 3.1)
erubi (~> 1.4)
rails-dom-testing (~> 2.0)
@@ -45,22 +45,22 @@ GEM
case_transform (>= 0.2)
jsonapi-renderer (>= 0.1.1.beta1, < 0.3)
active_record_query_trace (1.8)
- activejob (6.1.4.4)
- activesupport (= 6.1.4.4)
+ activejob (6.1.5)
+ activesupport (= 6.1.5)
globalid (>= 0.3.6)
- activemodel (6.1.4.4)
- activesupport (= 6.1.4.4)
- activerecord (6.1.4.4)
- activemodel (= 6.1.4.4)
- activesupport (= 6.1.4.4)
- activestorage (6.1.4.4)
- actionpack (= 6.1.4.4)
- activejob (= 6.1.4.4)
- activerecord (= 6.1.4.4)
- activesupport (= 6.1.4.4)
- marcel (~> 1.0.0)
+ activemodel (6.1.5)
+ activesupport (= 6.1.5)
+ activerecord (6.1.5)
+ activemodel (= 6.1.5)
+ activesupport (= 6.1.5)
+ activestorage (6.1.5)
+ actionpack (= 6.1.5)
+ activejob (= 6.1.5)
+ activerecord (= 6.1.5)
+ activesupport (= 6.1.5)
+ marcel (~> 1.0)
mini_mime (>= 1.1.0)
- activesupport (6.1.4.4)
+ activesupport (6.1.5)
concurrent-ruby (~> 1.0, >= 1.0.2)
i18n (>= 1.6, < 2)
minitest (>= 5.1)
@@ -68,28 +68,30 @@ GEM
zeitwerk (~> 2.3)
addressable (2.8.0)
public_suffix (>= 2.0.2, < 5.0)
+ aes_key_wrap (1.1.0)
airbrussh (1.4.0)
sshkit (>= 1.6.1, != 1.7.0)
android_key_attestation (0.3.0)
- annotate (3.1.1)
- activerecord (>= 3.2, < 7.0)
+ annotate (3.2.0)
+ activerecord (>= 3.2, < 8.0)
rake (>= 10.4, < 14.0)
ast (2.4.2)
attr_encrypted (3.1.0)
encryptor (~> 3.0.0)
+ attr_required (1.0.1)
awrence (1.1.1)
aws-eventstream (1.2.0)
- aws-partitions (1.549.0)
- aws-sdk-core (3.125.5)
+ aws-partitions (1.558.0)
+ aws-sdk-core (3.127.0)
aws-eventstream (~> 1, >= 1.0.2)
aws-partitions (~> 1, >= 1.525.0)
aws-sigv4 (~> 1.1)
jmespath (~> 1.0)
- aws-sdk-kms (1.53.0)
- aws-sdk-core (~> 3, >= 3.125.0)
+ aws-sdk-kms (1.55.0)
+ aws-sdk-core (~> 3, >= 3.127.0)
aws-sigv4 (~> 1.1)
- aws-sdk-s3 (1.111.3)
- aws-sdk-core (~> 3, >= 3.125.0)
+ aws-sdk-s3 (1.113.0)
+ aws-sdk-core (~> 3, >= 3.127.0)
aws-sdk-kms (~> 1)
aws-sigv4 (~> 1.4)
aws-sigv4 (1.4.0)
@@ -102,11 +104,11 @@ GEM
bindata (2.4.10)
binding_of_caller (1.0.0)
debug_inspector (>= 0.0.1)
- blurhash (0.1.5)
+ blurhash (0.1.6)
ffi (~> 1.14)
- bootsnap (1.10.2)
+ bootsnap (1.10.3)
msgpack (~> 1.2)
- brakeman (5.2.0)
+ brakeman (5.2.1)
browser (4.2.0)
brpoplpush-redis_script (0.1.2)
concurrent-ruby (~> 1.0, >= 1.0.5)
@@ -126,7 +128,7 @@ GEM
sshkit (>= 1.9.0)
capistrano-bundler (2.0.1)
capistrano (~> 3.1)
- capistrano-rails (1.6.1)
+ capistrano-rails (1.6.2)
capistrano (~> 3.1)
capistrano-bundler (>= 1.1, < 3)
capistrano-rbenv (2.2.0)
@@ -147,13 +149,11 @@ GEM
activesupport
cbor (0.5.9.6)
charlock_holmes (0.7.7)
- chewy (7.2.3)
+ chewy (7.2.4)
activesupport (>= 5.2)
elasticsearch (>= 7.12.0, < 7.14.0)
elasticsearch-dsl
chunky_png (1.4.0)
- cld3 (3.4.4)
- ffi (>= 1.1.0, < 1.16.0)
climate_control (0.2.0)
coderay (1.1.3)
color_diff (0.1)
@@ -183,7 +183,7 @@ GEM
devise_pam_authenticatable2 (9.2.0)
devise (>= 4.0.0)
rpam2 (~> 4.0)
- diff-lcs (1.4.4)
+ diff-lcs (1.5.0)
discard (1.2.1)
activerecord (>= 4.2, < 8)
docile (1.3.4)
@@ -208,31 +208,35 @@ GEM
multi_json
encryptor (3.0.0)
erubi (1.10.0)
- et-orbi (1.2.4)
+ et-orbi (1.2.6)
tzinfo
excon (0.76.0)
- fabrication (2.24.0)
- faker (2.19.0)
- i18n (>= 1.6, < 2)
- faraday (1.8.0)
+ fabrication (2.27.0)
+ faker (2.20.0)
+ i18n (>= 1.8.11, < 2)
+ faraday (1.9.3)
faraday-em_http (~> 1.0)
faraday-em_synchrony (~> 1.0)
faraday-excon (~> 1.1)
- faraday-httpclient (~> 1.0.1)
+ faraday-httpclient (~> 1.0)
+ faraday-multipart (~> 1.0)
faraday-net_http (~> 1.0)
- faraday-net_http_persistent (~> 1.1)
+ faraday-net_http_persistent (~> 1.0)
faraday-patron (~> 1.0)
faraday-rack (~> 1.0)
- multipart-post (>= 1.2, < 3)
+ faraday-retry (~> 1.0)
ruby2_keywords (>= 0.0.4)
faraday-em_http (1.0.0)
faraday-em_synchrony (1.0.0)
faraday-excon (1.1.0)
faraday-httpclient (1.0.1)
+ faraday-multipart (1.0.3)
+ multipart-post (>= 1.2, < 3)
faraday-net_http (1.0.1)
faraday-net_http_persistent (1.2.0)
faraday-patron (1.0.0)
faraday-rack (1.0.0)
+ faraday-retry (1.0.3)
fast_blank (1.0.1)
fastimage (2.2.6)
ffi (1.15.5)
@@ -252,12 +256,16 @@ GEM
fog-json (>= 1.0)
ipaddress (>= 0.8)
formatador (0.2.5)
- fugit (1.4.5)
+ fugit (1.5.2)
et-orbi (~> 1.1, >= 1.1.8)
raabro (~> 1.4)
fuubar (2.5.1)
rspec-core (~> 3.0)
ruby-progressbar (~> 1.4)
+ gitlab-omniauth-openid-connect (0.5.0)
+ addressable (~> 2.7)
+ omniauth (~> 1.9)
+ openid_connect (~> 1.2)
globalid (1.0.0)
activesupport (>= 5.0)
hamlit (2.13.0)
@@ -286,10 +294,11 @@ GEM
domain_name (~> 0.5)
http-form_data (2.3.0)
http_accept_language (2.1.1)
+ httpclient (2.8.3)
httplog (1.5.0)
rack (>= 1.0)
rainbow (>= 2.0.0)
- i18n (1.8.11)
+ i18n (1.10.0)
concurrent-ruby (~> 1.0)
i18n-tasks (0.9.37)
activesupport (>= 4.0.2)
@@ -303,10 +312,13 @@ GEM
terminal-table (>= 1.5.1)
idn-ruby (0.1.4)
ipaddress (0.8.3)
- iso-639 (0.3.5)
- jmespath (1.5.0)
+ jmespath (1.6.0)
json (2.5.1)
json-canonicalization (0.3.0)
+ json-jwt (1.13.0)
+ activesupport (>= 4.2)
+ aes_key_wrap
+ bindata
json-ld (3.2.0)
htmlentities (~> 4.3)
json-canonicalization (~> 0.3)
@@ -331,7 +343,7 @@ GEM
activerecord
kaminari-core (= 1.2.2)
kaminari-core (1.2.2)
- kt-paperclip (7.0.1)
+ kt-paperclip (7.1.1)
activemodel (>= 4.2.0)
activesupport (>= 4.2.0)
marcel (~> 1.0.1)
@@ -339,8 +351,8 @@ GEM
terrapin (~> 0.6.0)
launchy (2.5.0)
addressable (~> 2.7)
- letter_opener (1.7.0)
- launchy (~> 2.2)
+ letter_opener (1.8.1)
+ launchy (>= 2.2, < 3)
letter_opener_web (2.0.0)
actionmailer (>= 5.2)
letter_opener (~> 1.7)
@@ -355,14 +367,14 @@ GEM
activesupport (>= 4)
railties (>= 4)
request_store (~> 1.0)
- loofah (2.13.0)
+ loofah (2.15.0)
crass (~> 1.0.2)
nokogiri (>= 1.5.9)
mail (2.7.1)
mini_mime (>= 0.1.1)
makara (0.5.1)
activerecord (>= 5.2.0)
- marcel (1.0.1)
+ marcel (1.0.2)
mario-redis-lock (1.2.1)
redis (>= 3.0.5)
matrix (0.4.2)
@@ -373,9 +385,9 @@ GEM
nokogiri (~> 1.10)
mime-types (3.4.1)
mime-types-data (~> 3.2015)
- mime-types-data (3.2021.1115)
+ mime-types-data (3.2022.0105)
mini_mime (1.1.2)
- mini_portile2 (2.7.1)
+ mini_portile2 (2.8.0)
minitest (5.15.0)
msgpack (1.4.4)
multi_json (1.15.0)
@@ -385,8 +397,8 @@ GEM
net-ssh (>= 2.6.5, < 7.0.0)
net-ssh (6.1.0)
nio4r (2.5.8)
- nokogiri (1.13.1)
- mini_portile2 (~> 2.7.0)
+ nokogiri (1.13.3)
+ mini_portile2 (~> 2.8.0)
racc (~> 1.4)
nsa (0.2.8)
activesupport (>= 4.2, < 7)
@@ -407,17 +419,27 @@ GEM
omniauth-saml (1.10.3)
omniauth (~> 1.3, >= 1.3.2)
ruby-saml (~> 1.9)
+ openid_connect (1.2.0)
+ activemodel
+ attr_required (>= 1.0.0)
+ json-jwt (>= 1.5.0)
+ rack-oauth2 (>= 1.6.1)
+ swd (>= 1.0.0)
+ tzinfo
+ validate_email
+ validate_url
+ webfinger (>= 1.0.1)
openssl (2.2.0)
openssl-signature_algorithm (0.4.0)
orm_adapter (0.5.0)
- ox (2.14.6)
- parallel (1.21.0)
- parser (3.1.0.0)
+ ox (2.14.10)
+ parallel (1.22.0)
+ parser (3.1.1.0)
ast (~> 2.4.1)
parslet (2.0.0)
pastel (0.8.0)
tty-color (~> 0.5)
- pg (1.3.0)
+ pg (1.3.4)
pghero (2.8.2)
activerecord (>= 5)
pkg-config (1.4.7)
@@ -439,35 +461,41 @@ GEM
pry-rails (0.3.9)
pry (>= 0.10.4)
public_suffix (4.0.6)
- puma (5.5.2)
+ puma (5.6.2)
nio4r (~> 2.0)
- pundit (2.1.1)
+ pundit (2.2.0)
activesupport (>= 3.0.0)
raabro (1.4.0)
racc (1.6.0)
rack (2.2.3)
- rack-attack (6.5.0)
+ rack-attack (6.6.0)
rack (>= 1.0, < 3)
rack-cors (1.1.1)
rack (>= 2.0.0)
+ rack-oauth2 (1.16.0)
+ activesupport
+ attr_required
+ httpclient
+ json-jwt (>= 1.11.0)
+ rack (>= 2.1.0)
rack-proxy (0.7.0)
rack
rack-test (1.1.0)
rack (>= 1.0, < 3)
- rails (6.1.4.4)
- actioncable (= 6.1.4.4)
- actionmailbox (= 6.1.4.4)
- actionmailer (= 6.1.4.4)
- actionpack (= 6.1.4.4)
- actiontext (= 6.1.4.4)
- actionview (= 6.1.4.4)
- activejob (= 6.1.4.4)
- activemodel (= 6.1.4.4)
- activerecord (= 6.1.4.4)
- activestorage (= 6.1.4.4)
- activesupport (= 6.1.4.4)
+ rails (6.1.5)
+ actioncable (= 6.1.5)
+ actionmailbox (= 6.1.5)
+ actionmailer (= 6.1.5)
+ actionpack (= 6.1.5)
+ actiontext (= 6.1.5)
+ actionview (= 6.1.5)
+ activejob (= 6.1.5)
+ activemodel (= 6.1.5)
+ activerecord (= 6.1.5)
+ activestorage (= 6.1.5)
+ activesupport (= 6.1.5)
bundler (>= 1.15.0)
- railties (= 6.1.4.4)
+ railties (= 6.1.5)
sprockets-rails (>= 2.0.0)
rails-controller-testing (1.0.5)
actionpack (>= 5.0.1.rc1)
@@ -483,11 +511,11 @@ GEM
railties (>= 6.0.0, < 7)
rails-settings-cached (0.6.6)
rails (>= 4.2.0)
- railties (6.1.4.4)
- actionpack (= 6.1.4.4)
- activesupport (= 6.1.4.4)
+ railties (6.1.5)
+ actionpack (= 6.1.5)
+ activesupport (= 6.1.5)
method_source
- rake (>= 0.13)
+ rake (>= 12.2)
thor (~> 1.0)
rainbow (3.1.1)
rake (13.0.6)
@@ -497,9 +525,9 @@ GEM
rdf (~> 3.2)
redcarpet (3.5.1)
redis (4.5.1)
- redis-namespace (1.8.1)
+ redis-namespace (1.8.2)
redis (>= 3.0.4)
- regexp_parser (2.2.0)
+ regexp_parser (2.2.1)
request_store (1.5.0)
rack (>= 1.4)
responders (3.0.1)
@@ -508,19 +536,19 @@ GEM
rexml (3.2.5)
rotp (6.2.0)
rpam2 (4.0.2)
- rqrcode (2.1.0)
+ rqrcode (2.1.1)
chunky_png (~> 1.0)
rqrcode_core (~> 1.0)
rqrcode_core (1.2.0)
- rspec-core (3.10.1)
- rspec-support (~> 3.10.0)
- rspec-expectations (3.10.1)
+ rspec-core (3.11.0)
+ rspec-support (~> 3.11.0)
+ rspec-expectations (3.11.0)
diff-lcs (>= 1.2.0, < 2.0)
- rspec-support (~> 3.10.0)
- rspec-mocks (3.10.2)
+ rspec-support (~> 3.11.0)
+ rspec-mocks (3.11.0)
diff-lcs (>= 1.2.0, < 2.0)
- rspec-support (~> 3.10.0)
- rspec-rails (5.0.2)
+ rspec-support (~> 3.11.0)
+ rspec-rails (5.1.1)
actionpack (>= 5.2)
activesupport (>= 5.2)
railties (>= 5.2)
@@ -531,21 +559,21 @@ GEM
rspec-sidekiq (3.1.0)
rspec-core (~> 3.0, >= 3.0.0)
sidekiq (>= 2.4.0)
- rspec-support (3.10.3)
+ rspec-support (3.11.0)
rspec_junit_formatter (0.5.1)
rspec-core (>= 2, < 4, != 2.12.0)
- rubocop (1.25.0)
+ rubocop (1.26.0)
parallel (~> 1.10)
parser (>= 3.1.0.0)
rainbow (>= 2.2.2, < 4.0)
regexp_parser (>= 1.8, < 3.0)
rexml
- rubocop-ast (>= 1.15.1, < 2.0)
+ rubocop-ast (>= 1.16.0, < 2.0)
ruby-progressbar (~> 1.7)
unicode-display_width (>= 1.4.0, < 3.0)
- rubocop-ast (1.15.1)
- parser (>= 3.0.1.1)
- rubocop-rails (2.13.2)
+ rubocop-ast (1.16.0)
+ parser (>= 3.1.1.0)
+ rubocop-rails (2.14.2)
activesupport (>= 4.2.0)
rack (>= 1.1)
rubocop (>= 1.7.0, < 2.0)
@@ -554,32 +582,32 @@ GEM
nokogiri (>= 1.10.5)
rexml
ruby2_keywords (0.0.5)
- rufus-scheduler (3.7.0)
+ rufus-scheduler (3.8.1)
fugit (~> 1.1, >= 1.1.6)
safety_net_attestation (0.4.0)
jwt (~> 2.0)
sanitize (6.0.0)
crass (~> 1.0.2)
nokogiri (>= 1.12.0)
- scenic (1.5.5)
+ scenic (1.6.0)
activerecord (>= 4.0.0)
railties (>= 4.0.0)
securecompare (1.0.0)
semantic_range (3.0.0)
- sidekiq (6.4.0)
+ sidekiq (6.4.1)
connection_pool (>= 2.2.2)
rack (~> 2.0)
redis (>= 4.2.0)
sidekiq-bulk (0.2.0)
sidekiq
- sidekiq-scheduler (3.1.0)
+ sidekiq-scheduler (3.1.1)
e2mmap
redis (>= 3, < 5)
rufus-scheduler (~> 3.2)
sidekiq (>= 3)
thwait
tilt (>= 1.4.0)
- sidekiq-unique-jobs (7.1.12)
+ sidekiq-unique-jobs (7.1.15)
brpoplpush-redis_script (> 0.1.1, <= 2.0.0)
concurrent-ruby (~> 1.0, >= 1.0.5)
sidekiq (>= 5.0, < 8.0)
@@ -605,11 +633,15 @@ GEM
sshkit (1.21.2)
net-scp (>= 1.1.2)
net-ssh (>= 2.8.0)
- stackprof (0.2.17)
+ stackprof (0.2.19)
statsd-ruby (1.5.0)
stoplight (2.2.1)
strong_migrations (0.7.9)
activerecord (>= 5)
+ swd (1.2.0)
+ activesupport (>= 3)
+ attr_required (>= 0.0.5)
+ httpclient (>= 2.4)
temple (0.8.2)
terminal-table (3.0.2)
unicode-display_width (>= 1.1.1, < 3)
@@ -637,13 +669,19 @@ GEM
unf (~> 0.1.0)
tzinfo (2.0.4)
concurrent-ruby (~> 1.0)
- tzinfo-data (1.2021.5)
+ tzinfo-data (1.2022.1)
tzinfo (>= 1.0.0)
unf (0.1.4)
unf_ext
unf_ext (0.0.8)
unicode-display_width (2.1.0)
uniform_notifier (1.14.2)
+ validate_email (0.1.6)
+ activemodel (>= 3.0)
+ mail (>= 2.2.5)
+ validate_url (1.0.13)
+ activemodel (>= 3.0.0)
+ public_suffix
warden (1.2.9)
rack (>= 2.0.9)
webauthn (3.0.0.alpha1)
@@ -656,6 +694,9 @@ GEM
safety_net_attestation (~> 0.4.0)
securecompare (~> 1.0)
tpm-key_attestation (~> 0.9.0)
+ webfinger (1.1.0)
+ activesupport
+ httpclient (>= 2.4)
webmock (3.14.0)
addressable (>= 2.8.0)
crack (>= 0.3.2)
@@ -675,7 +716,7 @@ GEM
xorcist (1.1.2)
xpath (3.2.0)
nokogiri (~> 1.8)
- zeitwerk (2.5.3)
+ zeitwerk (2.5.4)
PLATFORMS
ruby
@@ -684,12 +725,12 @@ DEPENDENCIES
active_model_serializers (~> 0.10)
active_record_query_trace (~> 1.8)
addressable (~> 2.8)
- annotate (~> 3.1)
- aws-sdk-s3 (~> 1.111)
+ annotate (~> 3.2)
+ aws-sdk-s3 (~> 1.113)
better_errors (~> 2.9)
binding_of_caller (~> 1.0)
blurhash (~> 0.1)
- bootsnap (~> 1.10.2)
+ bootsnap (~> 1.10.3)
brakeman (~> 5.2)
browser
bullet (~> 7.0)
@@ -701,7 +742,6 @@ DEPENDENCIES
capybara (~> 3.36)
charlock_holmes (~> 0.7.7)
chewy (~> 7.2)
- cld3 (~> 3.4.4)
climate_control (~> 0.2)
color_diff (~> 0.1)
concurrent-ruby
@@ -713,13 +753,14 @@ DEPENDENCIES
doorkeeper (~> 5.5)
dotenv-rails (~> 2.7)
ed25519 (~> 1.3)
- fabrication (~> 2.24)
- faker (~> 2.19)
+ fabrication (~> 2.27)
+ faker (~> 2.20)
fast_blank (~> 1.0)
fastimage
fog-core (<= 2.1.0)
fog-openstack (~> 0.3)
fuubar (~> 2.5)
+ gitlab-omniauth-openid-connect (~> 0.5.0)
hamlit-rails (~> 0.2)
hcaptcha (~> 7.1)
hiredis (~> 0.6)
@@ -729,12 +770,11 @@ DEPENDENCIES
httplog (~> 1.5.0)
i18n-tasks (~> 0.9)
idn-ruby
- iso-639
json-ld
json-ld-preloaded (~> 3.2)
kaminari (~> 1.2)
- kt-paperclip (~> 7.0)
- letter_opener (~> 1.7)
+ kt-paperclip (~> 7.1)
+ letter_opener (~> 1.8)
letter_opener_web (~> 2.0)
link_header (~> 0.0)
lograge (~> 0.11)
@@ -761,12 +801,12 @@ DEPENDENCIES
private_address_check (~> 0.5)
pry-byebug (~> 3.9)
pry-rails (~> 0.3)
- puma (~> 5.5)
- pundit (~> 2.1)
+ puma (~> 5.6)
+ pundit (~> 2.2)
rack (~> 2.2.3)
- rack-attack (~> 6.5)
+ rack-attack (~> 6.6)
rack-cors (~> 1.1)
- rails (~> 6.1.4)
+ rails (~> 6.1.5)
rails-controller-testing (~> 1.0)
rails-i18n (~> 6.0)
rails-settings-cached (~> 0.6)
@@ -776,14 +816,14 @@ DEPENDENCIES
redis-namespace (~> 1.8)
rexml (~> 3.2)
rqrcode (~> 2.1)
- rspec-rails (~> 5.0)
+ rspec-rails (~> 5.1)
rspec-sidekiq (~> 3.1)
rspec_junit_formatter (~> 0.5)
- rubocop (~> 1.25)
- rubocop-rails (~> 2.13)
+ rubocop (~> 1.26)
+ rubocop-rails (~> 2.14)
ruby-progressbar (~> 1.11)
sanitize (~> 6.0)
- scenic (~> 1.5)
+ scenic (~> 1.6)
sidekiq (~> 6.4)
sidekiq-bulk (~> 0.2.0)
sidekiq-scheduler (~> 3.1)
@@ -799,7 +839,7 @@ DEPENDENCIES
thor (~> 1.2)
tty-prompt (~> 0.23)
twitter-text (~> 3.1.0)
- tzinfo-data (~> 1.2021)
+ tzinfo-data (~> 1.2022)
webauthn (~> 3.0.0.alpha1)
webmock (~> 3.14)
webpacker (~> 5.4)
diff --git a/SECURITY.md b/SECURITY.md
index 9d351fce6..5531a306e 100644
--- a/SECURITY.md
+++ b/SECURITY.md
@@ -1,13 +1,19 @@
# Security Policy
+If you believe you've identified a security vulnerability in Mastodon (a bug that allows something to happen that shouldn't be possible), you should submit the report through our [Bug Bounty Program][bug-bounty]. Alternatively, you can reach us at .
+
+You should *not* report such issues on GitHub or in other public spaces to give us time to publish a fix for the issue without exposing Mastodon's users to increased risk.
+
+## Scope
+
+A "vulnerability in Mastodon" is a vulnerability in the code distributed through our main source code repository on GitHub. Vulnerabilities that are specific to a given installation (e.g. misconfiguration) should be reported to the owner of that installation and not us.
+
## Supported Versions
| Version | Supported |
| ------- | ------------------ |
-| 3.4.x | :white_check_mark: |
-| 3.3.x | :white_check_mark: |
-| < 3.3 | :x: |
+| 3.4.x | Yes |
+| 3.3.x | Yes |
+| < 3.3 | No |
-## Reporting a Vulnerability
-
-hello@joinmastodon.org
+[bug-bounty]: https://app.intigriti.com/programs/mastodon/mastodonio/detail
diff --git a/Vagrantfile b/Vagrantfile
index aeff2f233..0d44b4d23 100644
--- a/Vagrantfile
+++ b/Vagrantfile
@@ -33,11 +33,9 @@ sudo apt-get install \
redis-tools \
postgresql \
postgresql-contrib \
- protobuf-compiler \
yarn \
libicu-dev \
libidn11-dev \
- libprotobuf-dev \
libreadline-dev \
libpam0g-dev \
-y
diff --git a/app.json b/app.json
index 6b4365383..c694908c5 100644
--- a/app.json
+++ b/app.json
@@ -95,8 +95,5 @@
"scripts": {
"postdeploy": "bundle exec rails db:migrate && bundle exec rails db:seed"
},
- "addons": [
- "heroku-postgresql",
- "heroku-redis"
- ]
+ "addons": ["heroku-postgresql", "heroku-redis"]
}
diff --git a/app/chewy/statuses_index.rb b/app/chewy/statuses_index.rb
index 1903c2ea3..65cbb6fcd 100644
--- a/app/chewy/statuses_index.rb
+++ b/app/chewy/statuses_index.rb
@@ -57,7 +57,7 @@ class StatusesIndex < Chewy::Index
field :id, type: 'long'
field :account_id, type: 'long'
- field :text, type: 'text', value: ->(status) { [status.spoiler_text, Formatter.instance.plaintext(status)].concat(status.media_attachments.map(&:description)).concat(status.preloadable_poll ? status.preloadable_poll.options : []).join("\n\n") } do
+ field :text, type: 'text', value: ->(status) { [status.spoiler_text, Formatter.instance.plaintext(status)].concat(status.ordered_media_attachments.map(&:description)).concat(status.preloadable_poll ? status.preloadable_poll.options : []).join("\n\n") } do
field :stemmed, type: 'text', analyzer: 'content'
end
diff --git a/app/controllers/activitypub/base_controller.rb b/app/controllers/activitypub/base_controller.rb
index 4cbc3ab8f..196d85a32 100644
--- a/app/controllers/activitypub/base_controller.rb
+++ b/app/controllers/activitypub/base_controller.rb
@@ -2,6 +2,7 @@
class ActivityPub::BaseController < Api::BaseController
skip_before_action :require_authenticated_user!
+ skip_around_action :set_locale
private
diff --git a/app/controllers/activitypub/outboxes_controller.rb b/app/controllers/activitypub/outboxes_controller.rb
index b2aab56a5..cd3992502 100644
--- a/app/controllers/activitypub/outboxes_controller.rb
+++ b/app/controllers/activitypub/outboxes_controller.rb
@@ -62,7 +62,7 @@ class ActivityPub::OutboxesController < ActivityPub::BaseController
return unless page_requested?
@statuses = cache_collection_paginated_by_id(
- @account.statuses.permitted_for(@account, signed_request_account),
+ AccountStatusesFilter.new(@account, signed_request_account).results,
Status,
LIMIT,
params_slice(:max_id, :min_id, :since_id)
diff --git a/app/controllers/activitypub/replies_controller.rb b/app/controllers/activitypub/replies_controller.rb
index fde6c861f..4ff7cfa08 100644
--- a/app/controllers/activitypub/replies_controller.rb
+++ b/app/controllers/activitypub/replies_controller.rb
@@ -63,15 +63,29 @@ class ActivityPub::RepliesController < ActivityPub::BaseController
end
def next_page
- only_other_accounts = !(@replies&.last&.account_id == @account.id && @replies.size == DESCENDANTS_LIMIT)
+ if only_other_accounts?
+ # Only consider remote accounts
+ return nil if @replies.size < DESCENDANTS_LIMIT
- account_status_replies_url(
- @account,
- @status,
- page: true,
- min_id: only_other_accounts && !only_other_accounts? ? nil : @replies&.last&.id,
- only_other_accounts: only_other_accounts
- )
+ account_status_replies_url(
+ @account,
+ @status,
+ page: true,
+ min_id: @replies&.last&.id,
+ only_other_accounts: true
+ )
+ else
+ # For now, we're serving only self-replies, but next page might be other accounts
+ next_only_other_accounts = @replies&.last&.account_id != @account.id || @replies.size < DESCENDANTS_LIMIT
+
+ account_status_replies_url(
+ @account,
+ @status,
+ page: true,
+ min_id: next_only_other_accounts ? nil : @replies&.last&.id,
+ only_other_accounts: next_only_other_accounts
+ )
+ end
end
def page_params
diff --git a/app/controllers/admin/accounts_controller.rb b/app/controllers/admin/accounts_controller.rb
index e7f56e243..e0ae71b9f 100644
--- a/app/controllers/admin/accounts_controller.rb
+++ b/app/controllers/admin/accounts_controller.rb
@@ -28,7 +28,7 @@ module Admin
@deletion_request = @account.deletion_request
@account_moderation_note = current_account.account_moderation_notes.new(target_account: @account)
@moderation_notes = @account.targeted_moderation_notes.latest
- @warnings = @account.strikes.custom.latest
+ @warnings = @account.strikes.includes(:target_account, :account, :appeal).latest
@domain_block = DomainBlock.rule_for(@account.domain)
end
@@ -146,7 +146,7 @@ module Admin
end
def filter_params
- params.slice(*AccountFilter::KEYS).permit(*AccountFilter::KEYS)
+ params.slice(:page, *AccountFilter::KEYS).permit(:page, *AccountFilter::KEYS)
end
def form_account_batch_params
diff --git a/app/controllers/admin/custom_emojis_controller.rb b/app/controllers/admin/custom_emojis_controller.rb
index 71efb543e..47138bf6c 100644
--- a/app/controllers/admin/custom_emojis_controller.rb
+++ b/app/controllers/admin/custom_emojis_controller.rb
@@ -35,6 +35,9 @@ module Admin
flash[:alert] = I18n.t('admin.accounts.no_account_selected')
rescue Mastodon::NotPermittedError
flash[:alert] = I18n.t('admin.custom_emojis.not_permitted')
+ rescue ActiveRecord::RecordInvalid => e
+ error_message = action_from_button == 'copy' ? 'admin.custom_emojis.batch_copy_error' : 'admin.custom_emojis.batch_error'
+ flash[:alert] = I18n.t(error_message, message: e.message)
ensure
redirect_to admin_custom_emojis_path(filter_params)
end
diff --git a/app/controllers/admin/dashboard_controller.rb b/app/controllers/admin/dashboard_controller.rb
index f0a935411..e376baab2 100644
--- a/app/controllers/admin/dashboard_controller.rb
+++ b/app/controllers/admin/dashboard_controller.rb
@@ -8,6 +8,7 @@ module Admin
@pending_users_count = User.pending.count
@pending_reports_count = Report.unresolved.count
@pending_tags_count = Tag.pending_review.count
+ @pending_appeals_count = Appeal.pending.count
end
private
diff --git a/app/controllers/admin/disputes/appeals_controller.rb b/app/controllers/admin/disputes/appeals_controller.rb
new file mode 100644
index 000000000..32e5e2f6f
--- /dev/null
+++ b/app/controllers/admin/disputes/appeals_controller.rb
@@ -0,0 +1,40 @@
+# frozen_string_literal: true
+
+class Admin::Disputes::AppealsController < Admin::BaseController
+ before_action :set_appeal, except: :index
+
+ def index
+ authorize :appeal, :index?
+
+ @appeals = filtered_appeals.page(params[:page])
+ end
+
+ def approve
+ authorize @appeal, :approve?
+ log_action :approve, @appeal
+ ApproveAppealService.new.call(@appeal, current_account)
+ redirect_to disputes_strike_path(@appeal.strike)
+ end
+
+ def reject
+ authorize @appeal, :approve?
+ log_action :reject, @appeal
+ @appeal.reject!(current_account)
+ UserMailer.appeal_rejected(@appeal.account.user, @appeal)
+ redirect_to disputes_strike_path(@appeal.strike)
+ end
+
+ private
+
+ def filtered_appeals
+ Admin::AppealFilter.new(filter_params.with_defaults(status: 'pending')).results.includes(strike: :account)
+ end
+
+ def filter_params
+ params.slice(:page, *Admin::AppealFilter::KEYS).permit(:page, *Admin::AppealFilter::KEYS)
+ end
+
+ def set_appeal
+ @appeal = Appeal.find(params[:id])
+ end
+end
diff --git a/app/controllers/admin/domain_blocks_controller.rb b/app/controllers/admin/domain_blocks_controller.rb
index b140c454c..16defc1ea 100644
--- a/app/controllers/admin/domain_blocks_controller.rb
+++ b/app/controllers/admin/domain_blocks_controller.rb
@@ -56,10 +56,6 @@ module Admin
end
end
- def show
- authorize @domain_block, :show?
- end
-
def destroy
authorize @domain_block, :destroy?
UnblockDomainService.new.call(@domain_block)
diff --git a/app/controllers/admin/email_domain_blocks_controller.rb b/app/controllers/admin/email_domain_blocks_controller.rb
index f7bdfb0c5..a4bbbba5b 100644
--- a/app/controllers/admin/email_domain_blocks_controller.rb
+++ b/app/controllers/admin/email_domain_blocks_controller.rb
@@ -6,7 +6,20 @@ module Admin
def index
authorize :email_domain_block, :index?
+
@email_domain_blocks = EmailDomainBlock.where(parent_id: nil).includes(:children).order(id: :desc).page(params[:page])
+ @form = Form::EmailDomainBlockBatch.new
+ end
+
+ def batch
+ @form = Form::EmailDomainBlockBatch.new(form_email_domain_block_batch_params.merge(current_account: current_account, action: action_from_button))
+ @form.save
+ rescue ActionController::ParameterMissing
+ flash[:alert] = I18n.t('admin.email_domain_blocks.no_email_domain_block_selected')
+ rescue Mastodon::NotPermittedError
+ flash[:alert] = I18n.t('admin.custom_emojis.not_permitted')
+ ensure
+ redirect_to admin_email_domain_blocks_path
end
def new
@@ -19,41 +32,27 @@ module Admin
@email_domain_block = EmailDomainBlock.new(resource_params)
- if @email_domain_block.save
- log_action :create, @email_domain_block
+ if action_from_button == 'save'
+ EmailDomainBlock.transaction do
+ @email_domain_block.save!
+ log_action :create, @email_domain_block
- if @email_domain_block.with_dns_records?
- hostnames = []
- ips = []
+ (@email_domain_block.other_domains || []).uniq.each do |domain|
+ next if EmailDomainBlock.where(domain: domain).exists?
- Resolv::DNS.open do |dns|
- dns.timeouts = 5
-
- hostnames = dns.getresources(@email_domain_block.domain, Resolv::DNS::Resource::IN::MX).to_a.map { |e| e.exchange.to_s }
-
- ([@email_domain_block.domain] + hostnames).uniq.each do |hostname|
- ips.concat(dns.getresources(hostname, Resolv::DNS::Resource::IN::A).to_a.map { |e| e.address.to_s })
- ips.concat(dns.getresources(hostname, Resolv::DNS::Resource::IN::AAAA).to_a.map { |e| e.address.to_s })
- end
- end
-
- (hostnames + ips).each do |hostname|
- another_email_domain_block = EmailDomainBlock.new(domain: hostname, parent: @email_domain_block)
- log_action :create, another_email_domain_block if another_email_domain_block.save
+ other_email_domain_block = EmailDomainBlock.create!(domain: domain, parent: @email_domain_block)
+ log_action :create, other_email_domain_block
end
end
redirect_to admin_email_domain_blocks_path, notice: I18n.t('admin.email_domain_blocks.created_msg')
else
+ set_resolved_records
render :new
end
- end
-
- def destroy
- authorize @email_domain_block, :destroy?
- @email_domain_block.destroy!
- log_action :destroy, @email_domain_block
- redirect_to admin_email_domain_blocks_path, notice: I18n.t('admin.email_domain_blocks.destroyed_msg')
+ rescue ActiveRecord::RecordInvalid
+ set_resolved_records
+ render :new
end
private
@@ -62,8 +61,27 @@ module Admin
@email_domain_block = EmailDomainBlock.find(params[:id])
end
+ def set_resolved_records
+ Resolv::DNS.open do |dns|
+ dns.timeouts = 5
+ @resolved_records = dns.getresources(@email_domain_block.domain, Resolv::DNS::Resource::IN::MX).to_a
+ end
+ end
+
def resource_params
- params.require(:email_domain_block).permit(:domain, :with_dns_records)
+ params.require(:email_domain_block).permit(:domain, other_domains: [])
+ end
+
+ def form_email_domain_block_batch_params
+ params.require(:form_email_domain_block_batch).permit(email_domain_block_ids: [])
+ end
+
+ def action_from_button
+ if params[:delete]
+ 'delete'
+ elsif params[:save]
+ 'save'
+ end
end
end
end
diff --git a/app/controllers/admin/instances_controller.rb b/app/controllers/admin/instances_controller.rb
index 306ec1f53..5c82331de 100644
--- a/app/controllers/admin/instances_controller.rb
+++ b/app/controllers/admin/instances_controller.rb
@@ -4,28 +4,26 @@ module Admin
class InstancesController < BaseController
before_action :set_instances, only: :index
before_action :set_instance, except: :index
- before_action :set_exhausted_deliveries_days, only: :show
def index
authorize :instance, :index?
+ preload_delivery_failures!
end
def show
authorize :instance, :show?
+ @time_period = (6.days.ago.to_date...Time.now.utc.to_date)
end
def destroy
authorize :instance, :destroy?
-
Admin::DomainPurgeWorker.perform_async(@instance.domain)
-
log_action :destroy, @instance
redirect_to admin_instances_path, notice: I18n.t('admin.instances.destroyed_msg', domain: @instance.domain)
end
def clear_delivery_errors
authorize :delivery, :clear_delivery_errors?
-
@instance.delivery_failure_tracker.clear_failures!
redirect_to admin_instance_path(@instance.domain)
end
@@ -33,11 +31,9 @@ module Admin
def restart_delivery
authorize :delivery, :restart_delivery?
- last_unavailable_domain = unavailable_domain
-
- if last_unavailable_domain.present?
+ if @instance.unavailable?
@instance.delivery_failure_tracker.track_success!
- log_action :destroy, last_unavailable_domain
+ log_action :destroy, @instance.unavailable_domain
end
redirect_to admin_instance_path(@instance.domain)
@@ -45,8 +41,7 @@ module Admin
def stop_delivery
authorize :delivery, :stop_delivery?
-
- UnavailableDomain.create(domain: @instance.domain)
+ unavailable_domain = UnavailableDomain.create!(domain: @instance.domain)
log_action :create, unavailable_domain
redirect_to admin_instance_path(@instance.domain)
end
@@ -57,12 +52,11 @@ module Admin
@instance = Instance.find(params[:id])
end
- def set_exhausted_deliveries_days
- @exhausted_deliveries_days = @instance.delivery_failure_tracker.exhausted_deliveries_days
- end
-
def set_instances
@instances = filtered_instances.page(params[:page])
+ end
+
+ def preload_delivery_failures!
warning_domains_map = DeliveryFailureTracker.warning_domains_map
@instances.each do |instance|
@@ -70,10 +64,6 @@ module Admin
end
end
- def unavailable_domain
- UnavailableDomain.find_by(domain: @instance.domain)
- end
-
def filtered_instances
InstanceFilter.new(whitelist_mode? ? { allowed: true } : filter_params).results
end
diff --git a/app/controllers/admin/relationships_controller.rb b/app/controllers/admin/relationships_controller.rb
index f8a95cfc8..085ded21c 100644
--- a/app/controllers/admin/relationships_controller.rb
+++ b/app/controllers/admin/relationships_controller.rb
@@ -9,7 +9,8 @@ module Admin
def index
authorize :account, :index?
- @accounts = RelationshipFilter.new(@account, filter_params).results.page(params[:page]).per(PER_PAGE)
+ @accounts = RelationshipFilter.new(@account, filter_params).results.includes(:account_stat, user: [:ips, :invite_request]).page(params[:page]).per(PER_PAGE)
+ @form = Form::AccountBatch.new
end
private
diff --git a/app/controllers/admin/reports/actions_controller.rb b/app/controllers/admin/reports/actions_controller.rb
new file mode 100644
index 000000000..5cb5c744f
--- /dev/null
+++ b/app/controllers/admin/reports/actions_controller.rb
@@ -0,0 +1,52 @@
+# frozen_string_literal: true
+
+class Admin::Reports::ActionsController < Admin::BaseController
+ before_action :set_report
+
+ def create
+ authorize @report, :show?
+
+ case action_from_button
+ when 'delete', 'mark_as_sensitive'
+ status_batch_action = Admin::StatusBatchAction.new(
+ type: action_from_button,
+ status_ids: @report.status_ids,
+ current_account: current_account,
+ report_id: @report.id,
+ send_email_notification: !@report.spam?
+ )
+
+ status_batch_action.save!
+ when 'silence', 'suspend'
+ account_action = Admin::AccountAction.new(
+ type: action_from_button,
+ report_id: @report.id,
+ target_account: @report.target_account,
+ current_account: current_account,
+ send_email_notification: !@report.spam?
+ )
+
+ account_action.save!
+ end
+
+ redirect_to admin_reports_path
+ end
+
+ private
+
+ def set_report
+ @report = Report.find(params[:report_id])
+ end
+
+ def action_from_button
+ if params[:delete]
+ 'delete'
+ elsif params[:mark_as_sensitive]
+ 'mark_as_sensitive'
+ elsif params[:silence]
+ 'silence'
+ elsif params[:suspend]
+ 'suspend'
+ end
+ end
+end
diff --git a/app/controllers/admin/statuses_controller.rb b/app/controllers/admin/statuses_controller.rb
index 8d039b281..817c0caa9 100644
--- a/app/controllers/admin/statuses_controller.rb
+++ b/app/controllers/admin/statuses_controller.rb
@@ -29,8 +29,9 @@ module Admin
end
def after_create_redirect_path
- if @status_batch_action.report_id.present?
- admin_report_path(@status_batch_action.report_id)
+ report_id = @status_batch_action&.report_id || params[:report_id]
+ if report_id.present?
+ admin_report_path(report_id)
else
admin_account_statuses_path(params[:account_id], current_params)
end
@@ -48,6 +49,10 @@ module Admin
params.slice(*Admin::StatusFilter::KEYS).permit(*Admin::StatusFilter::KEYS)
end
+ def current_params
+ params.slice(:media, :page).permit(:media, :page)
+ end
+
def action_from_button
if params[:report]
'report'
diff --git a/app/controllers/admin/trends/links/preview_card_providers_controller.rb b/app/controllers/admin/trends/links/preview_card_providers_controller.rb
index 2c26e03f3..40a466cd6 100644
--- a/app/controllers/admin/trends/links/preview_card_providers_controller.rb
+++ b/app/controllers/admin/trends/links/preview_card_providers_controller.rb
@@ -5,11 +5,11 @@ class Admin::Trends::Links::PreviewCardProvidersController < Admin::BaseControll
authorize :preview_card_provider, :index?
@preview_card_providers = filtered_preview_card_providers.page(params[:page])
- @form = Form::PreviewCardProviderBatch.new
+ @form = Trends::PreviewCardProviderBatch.new
end
def batch
- @form = Form::PreviewCardProviderBatch.new(form_preview_card_provider_batch_params.merge(current_account: current_account, action: action_from_button))
+ @form = Trends::PreviewCardProviderBatch.new(trends_preview_card_provider_batch_params.merge(current_account: current_account, action: action_from_button))
@form.save
rescue ActionController::ParameterMissing
flash[:alert] = I18n.t('admin.accounts.no_account_selected')
@@ -20,15 +20,15 @@ class Admin::Trends::Links::PreviewCardProvidersController < Admin::BaseControll
private
def filtered_preview_card_providers
- PreviewCardProviderFilter.new(filter_params).results
+ Trends::PreviewCardProviderFilter.new(filter_params).results
end
def filter_params
- params.slice(:page, *PreviewCardProviderFilter::KEYS).permit(:page, *PreviewCardProviderFilter::KEYS)
+ params.slice(:page, *Trends::PreviewCardProviderFilter::KEYS).permit(:page, *Trends::PreviewCardProviderFilter::KEYS)
end
- def form_preview_card_provider_batch_params
- params.require(:form_preview_card_provider_batch).permit(:action, preview_card_provider_ids: [])
+ def trends_preview_card_provider_batch_params
+ params.require(:trends_preview_card_provider_batch).permit(:action, preview_card_provider_ids: [])
end
def action_from_button
diff --git a/app/controllers/admin/trends/links_controller.rb b/app/controllers/admin/trends/links_controller.rb
index 619b37deb..434eec5fe 100644
--- a/app/controllers/admin/trends/links_controller.rb
+++ b/app/controllers/admin/trends/links_controller.rb
@@ -5,11 +5,11 @@ class Admin::Trends::LinksController < Admin::BaseController
authorize :preview_card, :index?
@preview_cards = filtered_preview_cards.page(params[:page])
- @form = Form::PreviewCardBatch.new
+ @form = Trends::PreviewCardBatch.new
end
def batch
- @form = Form::PreviewCardBatch.new(form_preview_card_batch_params.merge(current_account: current_account, action: action_from_button))
+ @form = Trends::PreviewCardBatch.new(trends_preview_card_batch_params.merge(current_account: current_account, action: action_from_button))
@form.save
rescue ActionController::ParameterMissing
flash[:alert] = I18n.t('admin.accounts.no_account_selected')
@@ -20,26 +20,26 @@ class Admin::Trends::LinksController < Admin::BaseController
private
def filtered_preview_cards
- PreviewCardFilter.new(filter_params.with_defaults(trending: 'all')).results
+ Trends::PreviewCardFilter.new(filter_params.with_defaults(trending: 'all')).results
end
def filter_params
- params.slice(:page, *PreviewCardFilter::KEYS).permit(:page, *PreviewCardFilter::KEYS)
+ params.slice(:page, *Trends::PreviewCardFilter::KEYS).permit(:page, *Trends::PreviewCardFilter::KEYS)
end
- def form_preview_card_batch_params
- params.require(:form_preview_card_batch).permit(:action, preview_card_ids: [])
+ def trends_preview_card_batch_params
+ params.require(:trends_preview_card_batch).permit(:action, preview_card_ids: [])
end
def action_from_button
if params[:approve]
'approve'
- elsif params[:approve_all]
- 'approve_all'
+ elsif params[:approve_providers]
+ 'approve_providers'
elsif params[:reject]
'reject'
- elsif params[:reject_all]
- 'reject_all'
+ elsif params[:reject_providers]
+ 'reject_providers'
end
end
end
diff --git a/app/controllers/admin/trends/statuses_controller.rb b/app/controllers/admin/trends/statuses_controller.rb
new file mode 100644
index 000000000..766242738
--- /dev/null
+++ b/app/controllers/admin/trends/statuses_controller.rb
@@ -0,0 +1,45 @@
+# frozen_string_literal: true
+
+class Admin::Trends::StatusesController < Admin::BaseController
+ def index
+ authorize :status, :index?
+
+ @statuses = filtered_statuses.page(params[:page])
+ @form = Trends::StatusBatch.new
+ end
+
+ def batch
+ @form = Trends::StatusBatch.new(trends_status_batch_params.merge(current_account: current_account, action: action_from_button))
+ @form.save
+ rescue ActionController::ParameterMissing
+ flash[:alert] = I18n.t('admin.accounts.no_account_selected')
+ ensure
+ redirect_to admin_trends_statuses_path(filter_params)
+ end
+
+ private
+
+ def filtered_statuses
+ Trends::StatusFilter.new(filter_params.with_defaults(trending: 'all')).results.includes(:account, :media_attachments, :active_mentions)
+ end
+
+ def filter_params
+ params.slice(:page, *Trends::StatusFilter::KEYS).permit(:page, *Trends::StatusFilter::KEYS)
+ end
+
+ def trends_status_batch_params
+ params.require(:trends_status_batch).permit(:action, status_ids: [])
+ end
+
+ def action_from_button
+ if params[:approve]
+ 'approve'
+ elsif params[:approve_accounts]
+ 'approve_accounts'
+ elsif params[:reject]
+ 'reject'
+ elsif params[:reject_accounts]
+ 'reject_accounts'
+ end
+ end
+end
diff --git a/app/controllers/admin/trends/tags_controller.rb b/app/controllers/admin/trends/tags_controller.rb
index 91ff33d40..f4d1ec0d1 100644
--- a/app/controllers/admin/trends/tags_controller.rb
+++ b/app/controllers/admin/trends/tags_controller.rb
@@ -5,11 +5,11 @@ class Admin::Trends::TagsController < Admin::BaseController
authorize :tag, :index?
@tags = filtered_tags.page(params[:page])
- @form = Form::TagBatch.new
+ @form = Trends::TagBatch.new
end
def batch
- @form = Form::TagBatch.new(form_tag_batch_params.merge(current_account: current_account, action: action_from_button))
+ @form = Trends::TagBatch.new(trends_tag_batch_params.merge(current_account: current_account, action: action_from_button))
@form.save
rescue ActionController::ParameterMissing
flash[:alert] = I18n.t('admin.accounts.no_account_selected')
@@ -20,15 +20,15 @@ class Admin::Trends::TagsController < Admin::BaseController
private
def filtered_tags
- TagFilter.new(filter_params).results
+ Trends::TagFilter.new(filter_params).results
end
def filter_params
- params.slice(:page, *TagFilter::KEYS).permit(:page, *TagFilter::KEYS)
+ params.slice(:page, *Trends::TagFilter::KEYS).permit(:page, *Trends::TagFilter::KEYS)
end
- def form_tag_batch_params
- params.require(:form_tag_batch).permit(:action, tag_ids: [])
+ def trends_tag_batch_params
+ params.require(:trends_tag_batch).permit(:action, tag_ids: [])
end
def action_from_button
diff --git a/app/controllers/api/base_controller.rb b/app/controllers/api/base_controller.rb
index b863d8643..d96285b44 100644
--- a/app/controllers/api/base_controller.rb
+++ b/app/controllers/api/base_controller.rb
@@ -5,6 +5,7 @@ class Api::BaseController < ApplicationController
DEFAULT_ACCOUNTS_LIMIT = 40
include RateLimitHeaders
+ include AccessTokenTrackingConcern
skip_before_action :store_current_location
skip_before_action :require_functional!, unless: :whitelist_mode?
@@ -14,8 +15,6 @@ class Api::BaseController < ApplicationController
protect_from_forgery with: :null_session
- skip_around_action :set_locale
-
rescue_from ActiveRecord::RecordInvalid, Mastodon::ValidationError do |e|
render json: { error: e.to_s }, status: 422
end
diff --git a/app/controllers/api/v1/accounts/familiar_followers_controller.rb b/app/controllers/api/v1/accounts/familiar_followers_controller.rb
new file mode 100644
index 000000000..b0bd8018a
--- /dev/null
+++ b/app/controllers/api/v1/accounts/familiar_followers_controller.rb
@@ -0,0 +1,25 @@
+# frozen_string_literal: true
+
+class Api::V1::Accounts::FamiliarFollowersController < Api::BaseController
+ before_action -> { doorkeeper_authorize! :read, :'read:follows' }
+ before_action :require_user!
+ before_action :set_accounts
+
+ def index
+ render json: familiar_followers.accounts, each_serializer: REST::FamiliarFollowersSerializer
+ end
+
+ private
+
+ def set_accounts
+ @accounts = Account.without_suspended.where(id: account_ids).select('id, hide_collections').index_by(&:id).values_at(*account_ids).compact
+ end
+
+ def familiar_followers
+ FamiliarFollowersPresenter.new(@accounts, current_user.account_id)
+ end
+
+ def account_ids
+ Array(params[:id]).map(&:to_i)
+ end
+end
diff --git a/app/controllers/api/v1/accounts/statuses_controller.rb b/app/controllers/api/v1/accounts/statuses_controller.rb
index 2c027ea76..38c9f5a20 100644
--- a/app/controllers/api/v1/accounts/statuses_controller.rb
+++ b/app/controllers/api/v1/accounts/statuses_controller.rb
@@ -22,53 +22,16 @@ class Api::V1::Accounts::StatusesController < Api::BaseController
end
def cached_account_statuses
- statuses = truthy_param?(:pinned) ? pinned_scope : permitted_account_statuses
-
- statuses.merge!(only_media_scope) if truthy_param?(:only_media)
- statuses.merge!(no_replies_scope) if truthy_param?(:exclude_replies)
- statuses.merge!(no_reblogs_scope) if truthy_param?(:exclude_reblogs)
- statuses.merge!(hashtag_scope) if params[:tagged].present?
-
cache_collection_paginated_by_id(
- statuses,
+ AccountStatusesFilter.new(@account, current_account, params).results,
Status,
limit_param(DEFAULT_STATUSES_LIMIT),
params_slice(:max_id, :since_id, :min_id)
)
end
- def permitted_account_statuses
- @account.statuses.permitted_for(@account, current_account)
- end
-
- def only_media_scope
- Status.joins(:media_attachments).merge(@account.media_attachments.reorder(nil)).group(:id)
- end
-
- def pinned_scope
- @account.pinned_statuses.permitted_for(@account, current_account)
- end
-
- def no_replies_scope
- Status.without_replies
- end
-
- def no_reblogs_scope
- Status.without_reblogs
- end
-
- def hashtag_scope
- tag = Tag.find_normalized(params[:tagged])
-
- if tag
- Status.tagged_with(tag.id)
- else
- Status.none
- end
- end
-
def pagination_params(core_params)
- params.slice(:limit, :only_media, :exclude_replies).permit(:limit, :only_media, :exclude_replies).merge(core_params)
+ params.slice(:limit, *AccountStatusesFilter::KEYS).permit(:limit, *AccountStatusesFilter::KEYS).merge(core_params)
end
def insert_pagination_headers
diff --git a/app/controllers/api/v1/accounts_controller.rb b/app/controllers/api/v1/accounts_controller.rb
index 5c47158e0..5134bfb94 100644
--- a/app/controllers/api/v1/accounts_controller.rb
+++ b/app/controllers/api/v1/accounts_controller.rb
@@ -2,9 +2,9 @@
class Api::V1::AccountsController < Api::BaseController
before_action -> { authorize_if_got_token! :read, :'read:accounts' }, except: [:create, :follow, :unfollow, :remove_from_followers, :block, :unblock, :mute, :unmute]
- before_action -> { doorkeeper_authorize! :follow, :'write:follows' }, only: [:follow, :unfollow, :remove_from_followers]
- before_action -> { doorkeeper_authorize! :follow, :'write:mutes' }, only: [:mute, :unmute]
- before_action -> { doorkeeper_authorize! :follow, :'write:blocks' }, only: [:block, :unblock]
+ before_action -> { doorkeeper_authorize! :follow, :write, :'write:follows' }, only: [:follow, :unfollow, :remove_from_followers]
+ before_action -> { doorkeeper_authorize! :follow, :write, :'write:mutes' }, only: [:mute, :unmute]
+ before_action -> { doorkeeper_authorize! :follow, :write, :'write:blocks' }, only: [:block, :unblock]
before_action -> { doorkeeper_authorize! :write, :'write:accounts' }, only: [:create]
before_action :require_user!, except: [:show, :create]
diff --git a/app/controllers/api/v1/admin/trends/links_controller.rb b/app/controllers/api/v1/admin/trends/links_controller.rb
new file mode 100644
index 000000000..63b3d9358
--- /dev/null
+++ b/app/controllers/api/v1/admin/trends/links_controller.rb
@@ -0,0 +1,19 @@
+# frozen_string_literal: true
+
+class Api::V1::Admin::Trends::LinksController < Api::BaseController
+ protect_from_forgery with: :exception
+
+ before_action -> { authorize_if_got_token! :'admin:read' }
+ before_action :require_staff!
+ before_action :set_links
+
+ def index
+ render json: @links, each_serializer: REST::Trends::LinkSerializer
+ end
+
+ private
+
+ def set_links
+ @links = Trends.links.query.limit(limit_param(10))
+ end
+end
diff --git a/app/controllers/api/v1/admin/trends/statuses_controller.rb b/app/controllers/api/v1/admin/trends/statuses_controller.rb
new file mode 100644
index 000000000..86633cc74
--- /dev/null
+++ b/app/controllers/api/v1/admin/trends/statuses_controller.rb
@@ -0,0 +1,19 @@
+# frozen_string_literal: true
+
+class Api::V1::Admin::Trends::StatusesController < Api::BaseController
+ protect_from_forgery with: :exception
+
+ before_action -> { authorize_if_got_token! :'admin:read' }
+ before_action :require_staff!
+ before_action :set_statuses
+
+ def index
+ render json: @statuses, each_serializer: REST::StatusSerializer
+ end
+
+ private
+
+ def set_statuses
+ @statuses = cache_collection(Trends.statuses.query.limit(limit_param(DEFAULT_STATUSES_LIMIT)), Status)
+ end
+end
diff --git a/app/controllers/api/v1/admin/trends/tags_controller.rb b/app/controllers/api/v1/admin/trends/tags_controller.rb
index 4815af31e..5cc4c269d 100644
--- a/app/controllers/api/v1/admin/trends/tags_controller.rb
+++ b/app/controllers/api/v1/admin/trends/tags_controller.rb
@@ -14,6 +14,6 @@ class Api::V1::Admin::Trends::TagsController < Api::BaseController
private
def set_tags
- @tags = Trends.tags.get(false, limit_param(10))
+ @tags = Trends.tags.query.limit(limit_param(10))
end
end
diff --git a/app/controllers/api/v1/blocks_controller.rb b/app/controllers/api/v1/blocks_controller.rb
index 586cdfca9..a65e762c9 100644
--- a/app/controllers/api/v1/blocks_controller.rb
+++ b/app/controllers/api/v1/blocks_controller.rb
@@ -1,7 +1,7 @@
# frozen_string_literal: true
class Api::V1::BlocksController < Api::BaseController
- before_action -> { doorkeeper_authorize! :follow, :'read:blocks' }
+ before_action -> { doorkeeper_authorize! :follow, :read, :'read:blocks' }
before_action :require_user!
after_action :insert_pagination_headers
diff --git a/app/controllers/api/v1/domain_blocks_controller.rb b/app/controllers/api/v1/domain_blocks_controller.rb
index 5bb02d834..1891261b9 100644
--- a/app/controllers/api/v1/domain_blocks_controller.rb
+++ b/app/controllers/api/v1/domain_blocks_controller.rb
@@ -3,8 +3,8 @@
class Api::V1::DomainBlocksController < Api::BaseController
BLOCK_LIMIT = 100
- before_action -> { doorkeeper_authorize! :follow, :'read:blocks' }, only: :show
- before_action -> { doorkeeper_authorize! :follow, :'write:blocks' }, except: :show
+ before_action -> { doorkeeper_authorize! :follow, :read, :'read:blocks' }, only: :show
+ before_action -> { doorkeeper_authorize! :follow, :write, :'write:blocks' }, except: :show
before_action :require_user!
after_action :insert_pagination_headers, only: :show
diff --git a/app/controllers/api/v1/emails/confirmations_controller.rb b/app/controllers/api/v1/emails/confirmations_controller.rb
index f1d9954d0..3faaea2fb 100644
--- a/app/controllers/api/v1/emails/confirmations_controller.rb
+++ b/app/controllers/api/v1/emails/confirmations_controller.rb
@@ -1,7 +1,7 @@
# frozen_string_literal: true
class Api::V1::Emails::ConfirmationsController < Api::BaseController
- before_action :doorkeeper_authorize!
+ before_action -> { doorkeeper_authorize! :write, :'write:accounts' }
before_action :require_user_owned_by_application!
before_action :require_user_not_confirmed!
@@ -19,6 +19,6 @@ class Api::V1::Emails::ConfirmationsController < Api::BaseController
end
def require_user_not_confirmed!
- render json: { error: 'This method is only available while the e-mail is awaiting confirmation' }, status: :forbidden if current_user.confirmed? || current_user.unconfirmed_email.blank?
+ render json: { error: 'This method is only available while the e-mail is awaiting confirmation' }, status: :forbidden unless !current_user.confirmed? || current_user.unconfirmed_email.present?
end
end
diff --git a/app/controllers/api/v1/follow_requests_controller.rb b/app/controllers/api/v1/follow_requests_controller.rb
index f4b2a74d0..54ff0e11d 100644
--- a/app/controllers/api/v1/follow_requests_controller.rb
+++ b/app/controllers/api/v1/follow_requests_controller.rb
@@ -1,8 +1,8 @@
# frozen_string_literal: true
class Api::V1::FollowRequestsController < Api::BaseController
- before_action -> { doorkeeper_authorize! :follow, :'read:follows' }, only: :index
- before_action -> { doorkeeper_authorize! :follow, :'write:follows' }, except: :index
+ before_action -> { doorkeeper_authorize! :follow, :read, :'read:follows' }, only: :index
+ before_action -> { doorkeeper_authorize! :follow, :write, :'write:follows' }, except: :index
before_action :require_user!
after_action :insert_pagination_headers, only: :index
@@ -13,7 +13,7 @@ class Api::V1::FollowRequestsController < Api::BaseController
def authorize
AuthorizeFollowService.new.call(account, current_account)
- NotifyService.new.call(current_account, :follow, Follow.find_by(account: account, target_account: current_account))
+ LocalNotificationWorker.perform_async(current_account.id, Follow.find_by(account: account, target_account: current_account).id, 'Follow', 'follow')
render json: account, serializer: REST::RelationshipSerializer, relationships: relationships
end
diff --git a/app/controllers/api/v1/media_controller.rb b/app/controllers/api/v1/media_controller.rb
index a2a919a3e..f9c935bf3 100644
--- a/app/controllers/api/v1/media_controller.rb
+++ b/app/controllers/api/v1/media_controller.rb
@@ -20,7 +20,7 @@ class Api::V1::MediaController < Api::BaseController
end
def update
- @media_attachment.update!(media_attachment_params)
+ @media_attachment.update!(updateable_media_attachment_params)
render json: @media_attachment, serializer: REST::MediaAttachmentSerializer, status: status_code_for_media_attachment
end
@@ -31,7 +31,7 @@ class Api::V1::MediaController < Api::BaseController
end
def set_media_attachment
- @media_attachment = current_account.media_attachments.unattached.find(params[:id])
+ @media_attachment = current_account.media_attachments.where(status_id: nil).find(params[:id])
end
def check_processing
@@ -42,6 +42,10 @@ class Api::V1::MediaController < Api::BaseController
params.permit(:file, :thumbnail, :description, :focus)
end
+ def updateable_media_attachment_params
+ params.permit(:thumbnail, :description, :focus)
+ end
+
def file_type_error
{ error: 'File type of uploaded media could not be verified' }
end
diff --git a/app/controllers/api/v1/mutes_controller.rb b/app/controllers/api/v1/mutes_controller.rb
index fd52511d7..6cde53a2a 100644
--- a/app/controllers/api/v1/mutes_controller.rb
+++ b/app/controllers/api/v1/mutes_controller.rb
@@ -1,7 +1,7 @@
# frozen_string_literal: true
class Api::V1::MutesController < Api::BaseController
- before_action -> { doorkeeper_authorize! :follow, :'read:mutes' }
+ before_action -> { doorkeeper_authorize! :follow, :read, :'read:mutes' }
before_action :require_user!
after_action :insert_pagination_headers
diff --git a/app/controllers/api/v1/notifications_controller.rb b/app/controllers/api/v1/notifications_controller.rb
index eefd28d45..c47d6ccfd 100644
--- a/app/controllers/api/v1/notifications_controller.rb
+++ b/app/controllers/api/v1/notifications_controller.rb
@@ -44,13 +44,18 @@ class Api::V1::NotificationsController < Api::BaseController
limit_param(DEFAULT_NOTIFICATIONS_LIMIT),
params_slice(:max_id, :since_id, :min_id)
)
+
Notification.preload_cache_collection_target_statuses(notifications) do |target_statuses|
cache_collection(target_statuses, Status)
end
end
def browserable_account_notifications
- current_account.notifications.without_suspended.browserable(exclude_types, from_account)
+ current_account.notifications.without_suspended.browserable(
+ types: Array(browserable_params[:types]),
+ exclude_types: Array(browserable_params[:exclude_types]),
+ from_account_id: browserable_params[:account_id]
+ )
end
def target_statuses_from_notifications
@@ -81,17 +86,11 @@ class Api::V1::NotificationsController < Api::BaseController
@notifications.first.id
end
- def exclude_types
- val = params.permit(exclude_types: [])[:exclude_types] || []
- val = [val] unless val.is_a?(Enumerable)
- val
- end
-
- def from_account
- params[:account_id]
+ def browserable_params
+ params.permit(:account_id, types: [], exclude_types: [])
end
def pagination_params(core_params)
- params.slice(:limit, :exclude_types).permit(:limit, exclude_types: []).merge(core_params)
+ params.slice(:limit, :account_id, :types, :exclude_types).permit(:limit, :account_id, types: [], exclude_types: []).merge(core_params)
end
end
diff --git a/app/controllers/api/v1/reports_controller.rb b/app/controllers/api/v1/reports_controller.rb
index e10083d45..8ff6c8fe5 100644
--- a/app/controllers/api/v1/reports_controller.rb
+++ b/app/controllers/api/v1/reports_controller.rb
@@ -10,9 +10,7 @@ class Api::V1::ReportsController < Api::BaseController
@report = ReportService.new.call(
current_account,
reported_account,
- status_ids: reported_status_ids,
- comment: report_params[:comment],
- forward: report_params[:forward]
+ report_params
)
render json: @report, serializer: REST::ReportSerializer
@@ -20,19 +18,11 @@ class Api::V1::ReportsController < Api::BaseController
private
- def reported_status_ids
- reported_account.statuses.with_discarded.find(status_ids).pluck(:id)
- end
-
- def status_ids
- Array(report_params[:status_ids])
- end
-
def reported_account
Account.find(report_params[:account_id])
end
def report_params
- params.permit(:account_id, :comment, :forward, status_ids: [])
+ params.permit(:account_id, :comment, :category, :forward, status_ids: [], rule_ids: [])
end
end
diff --git a/app/controllers/api/v1/statuses/histories_controller.rb b/app/controllers/api/v1/statuses/histories_controller.rb
index c2c1fac5d..7fe73a6f5 100644
--- a/app/controllers/api/v1/statuses/histories_controller.rb
+++ b/app/controllers/api/v1/statuses/histories_controller.rb
@@ -7,7 +7,7 @@ class Api::V1::Statuses::HistoriesController < Api::BaseController
before_action :set_status
def show
- render json: @status.edits, each_serializer: REST::StatusEditSerializer
+ render json: @status.edits.includes(:account, status: [:account]), each_serializer: REST::StatusEditSerializer
end
private
diff --git a/app/controllers/api/v1/statuses_controller.rb b/app/controllers/api/v1/statuses_controller.rb
index b1390ae48..7de446ac4 100644
--- a/app/controllers/api/v1/statuses_controller.rb
+++ b/app/controllers/api/v1/statuses_controller.rb
@@ -3,13 +3,14 @@
class Api::V1::StatusesController < Api::BaseController
include Authorization
- before_action -> { authorize_if_got_token! :read, :'read:statuses' }, except: [:create, :destroy]
- before_action -> { doorkeeper_authorize! :write, :'write:statuses' }, only: [:create, :destroy]
+ before_action -> { authorize_if_got_token! :read, :'read:statuses' }, except: [:create, :update, :destroy]
+ before_action -> { doorkeeper_authorize! :write, :'write:statuses' }, only: [:create, :update, :destroy]
before_action :require_user!, except: [:show, :context]
before_action :set_status, only: [:show, :context]
before_action :set_thread, only: [:create]
override_rate_limit_headers :create, family: :statuses
+ override_rate_limit_headers :update, family: :statuses
# This API was originally unlimited, pagination cannot be introduced without
# breaking backwards-compatibility. Arbitrarily high number to cover most
@@ -35,25 +36,46 @@ class Api::V1::StatusesController < Api::BaseController
end
def create
- @status = PostStatusService.new.call(current_user.account,
- text: status_params[:status],
- thread: @thread,
- media_ids: status_params[:media_ids],
- sensitive: status_params[:sensitive],
- spoiler_text: status_params[:spoiler_text],
- visibility: status_params[:visibility],
- scheduled_at: status_params[:scheduled_at],
- application: doorkeeper_token.application,
- poll: status_params[:poll],
- content_type: status_params[:content_type],
- idempotency: request.headers['Idempotency-Key'],
- with_rate_limit: true)
+ @status = PostStatusService.new.call(
+ current_user.account,
+ text: status_params[:status],
+ thread: @thread,
+ media_ids: status_params[:media_ids],
+ sensitive: status_params[:sensitive],
+ spoiler_text: status_params[:spoiler_text],
+ visibility: status_params[:visibility],
+ language: status_params[:language],
+ scheduled_at: status_params[:scheduled_at],
+ application: doorkeeper_token.application,
+ poll: status_params[:poll],
+ content_type: status_params[:content_type],
+ idempotency: request.headers['Idempotency-Key'],
+ with_rate_limit: true
+ )
render json: @status, serializer: @status.is_a?(ScheduledStatus) ? REST::ScheduledStatusSerializer : REST::StatusSerializer
end
+ def update
+ @status = Status.where(account: current_account).find(params[:id])
+ authorize @status, :update?
+
+ UpdateStatusService.new.call(
+ @status,
+ current_account.id,
+ text: status_params[:status],
+ media_ids: status_params[:media_ids],
+ sensitive: status_params[:sensitive],
+ spoiler_text: status_params[:spoiler_text],
+ poll: status_params[:poll],
+ content_type: status_params[:content_type]
+ )
+
+ render json: @status, serializer: REST::StatusSerializer
+ end
+
def destroy
- @status = Status.where(account_id: current_user.account).find(params[:id])
+ @status = Status.where(account: current_account).find(params[:id])
authorize @status, :destroy?
@status.discard
@@ -73,8 +95,9 @@ class Api::V1::StatusesController < Api::BaseController
end
def set_thread
- @thread = status_params[:in_reply_to_id].blank? ? nil : Status.find(status_params[:in_reply_to_id])
- rescue ActiveRecord::RecordNotFound
+ @thread = Status.find(status_params[:in_reply_to_id]) if status_params[:in_reply_to_id].present?
+ authorize(@thread, :show?) if @thread.present?
+ rescue ActiveRecord::RecordNotFound, Mastodon::NotPermittedError
render json: { error: I18n.t('statuses.errors.in_reply_not_found') }, status: 404
end
@@ -85,6 +108,7 @@ class Api::V1::StatusesController < Api::BaseController
:sensitive,
:spoiler_text,
:visibility,
+ :language,
:scheduled_at,
:content_type,
media_ids: [],
diff --git a/app/controllers/api/v1/trends/links_controller.rb b/app/controllers/api/v1/trends/links_controller.rb
index 1c3ab1e1c..ad20e7f8b 100644
--- a/app/controllers/api/v1/trends/links_controller.rb
+++ b/app/controllers/api/v1/trends/links_controller.rb
@@ -12,10 +12,14 @@ class Api::V1::Trends::LinksController < Api::BaseController
def set_links
@links = begin
if Setting.trends
- Trends.links.get(true, limit_param(10))
+ links_from_trends
else
[]
end
end
end
+
+ def links_from_trends
+ Trends.links.query.allowed.in_locale(content_locale).limit(limit_param(10))
+ end
end
diff --git a/app/controllers/api/v1/trends/statuses_controller.rb b/app/controllers/api/v1/trends/statuses_controller.rb
new file mode 100644
index 000000000..d4ec97ae5
--- /dev/null
+++ b/app/controllers/api/v1/trends/statuses_controller.rb
@@ -0,0 +1,27 @@
+# frozen_string_literal: true
+
+class Api::V1::Trends::StatusesController < Api::BaseController
+ before_action :set_statuses
+
+ def index
+ render json: @statuses, each_serializer: REST::StatusSerializer
+ end
+
+ private
+
+ def set_statuses
+ @statuses = begin
+ if Setting.trends
+ cache_collection(statuses_from_trends, Status)
+ else
+ []
+ end
+ end
+ end
+
+ def statuses_from_trends
+ scope = Trends.statuses.query.allowed.in_locale(content_locale)
+ scope = scope.filtered_for(current_account) if user_signed_in?
+ scope.limit(limit_param(DEFAULT_STATUSES_LIMIT))
+ end
+end
diff --git a/app/controllers/api/v1/trends/tags_controller.rb b/app/controllers/api/v1/trends/tags_controller.rb
index 947b53de2..1334b72d2 100644
--- a/app/controllers/api/v1/trends/tags_controller.rb
+++ b/app/controllers/api/v1/trends/tags_controller.rb
@@ -12,7 +12,7 @@ class Api::V1::Trends::TagsController < Api::BaseController
def set_tags
@tags = begin
if Setting.trends
- Trends.tags.get(true, limit_param(10))
+ Trends.tags.query.allowed.limit(limit_param(10))
else
[]
end
diff --git a/app/controllers/api/web/push_subscriptions_controller.rb b/app/controllers/api/web/push_subscriptions_controller.rb
index bed57fc54..5167928e9 100644
--- a/app/controllers/api/web/push_subscriptions_controller.rb
+++ b/app/controllers/api/web/push_subscriptions_controller.rb
@@ -17,16 +17,7 @@ class Api::Web::PushSubscriptionsController < Api::Web::BaseController
data = {
policy: 'all',
-
- alerts: {
- follow: alerts_enabled,
- follow_request: alerts_enabled,
- favourite: alerts_enabled,
- reblog: alerts_enabled,
- mention: alerts_enabled,
- poll: alerts_enabled,
- status: alerts_enabled,
- },
+ alerts: Notification::TYPES.index_with { alerts_enabled },
}
data.deep_merge!(data_params) if params[:data]
@@ -61,6 +52,6 @@ class Api::Web::PushSubscriptionsController < Api::Web::BaseController
end
def data_params
- @data_params ||= params.require(:data).permit(:policy, alerts: [:follow, :follow_request, :favourite, :reblog, :mention, :poll, :status])
+ @data_params ||= params.require(:data).permit(:policy, alerts: Notification::TYPES)
end
end
diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb
index 08cca0734..0f948ff5f 100644
--- a/app/controllers/application_controller.rb
+++ b/app/controllers/application_controller.rb
@@ -136,16 +136,6 @@ class ApplicationController < ActionController::Base
@current_session = SessionActivation.find_by(session_id: cookies.signed['_session_id']) if cookies.signed['_session_id'].present?
end
- def current_flavour
- return Setting.flavour unless Themes.instance.flavours.include? current_user&.setting_flavour
- current_user.setting_flavour
- end
-
- def current_skin
- return Setting.skin unless Themes.instance.skins_for(current_flavour).include? current_user&.setting_skin
- current_user.setting_skin
- end
-
def respond_with_error(code)
respond_to do |format|
format.any do
diff --git a/app/controllers/auth/omniauth_callbacks_controller.rb b/app/controllers/auth/omniauth_callbacks_controller.rb
index 991a50b03..f9cf6d655 100644
--- a/app/controllers/auth/omniauth_callbacks_controller.rb
+++ b/app/controllers/auth/omniauth_callbacks_controller.rb
@@ -4,8 +4,6 @@ class Auth::OmniauthCallbacksController < Devise::OmniauthCallbacksController
skip_before_action :verify_authenticity_token
def self.provides_callback_for(provider)
- provider_id = provider.to_s.chomp '_oauth2'
-
define_method provider do
@user = User.find_for_oauth(request.env['omniauth.auth'], current_user)
@@ -20,7 +18,7 @@ class Auth::OmniauthCallbacksController < Devise::OmniauthCallbacksController
)
sign_in_and_redirect @user, event: :authentication
- set_flash_message(:notice, :success, kind: provider_id.capitalize) if is_navigational_format?
+ set_flash_message(:notice, :success, kind: Devise.omniauth_configs[provider].strategy.display_name.capitalize) if is_navigational_format?
else
session["devise.#{provider}_data"] = request.env['omniauth.auth']
redirect_to new_user_registration_url
@@ -33,7 +31,7 @@ class Auth::OmniauthCallbacksController < Devise::OmniauthCallbacksController
end
def after_sign_in_path_for(resource)
- if resource.email_verified?
+ if resource.email_present?
root_path
else
auth_setup_path(missing_email: '1')
diff --git a/app/controllers/auth/registrations_controller.rb b/app/controllers/auth/registrations_controller.rb
index 6b1f3fa82..1c0f360a9 100644
--- a/app/controllers/auth/registrations_controller.rb
+++ b/app/controllers/auth/registrations_controller.rb
@@ -10,6 +10,7 @@ class Auth::RegistrationsController < Devise::RegistrationsController
before_action :configure_sign_up_params, only: [:create]
before_action :set_pack
before_action :set_sessions, only: [:edit, :update]
+ before_action :set_strikes, only: [:edit, :update]
before_action :set_instance_presenter, only: [:new, :create, :update]
before_action :set_body_classes, only: [:new, :create, :edit, :update]
before_action :require_not_suspended!, only: [:update]
@@ -116,8 +117,10 @@ class Auth::RegistrationsController < Devise::RegistrationsController
end
def set_invite
- invite = invite_code.present? ? Invite.find_by(code: invite_code) : nil
- @invite = invite&.valid_for_use? ? invite : nil
+ @invite = begin
+ invite = Invite.find_by(code: invite_code) if invite_code.present?
+ invite if invite&.valid_for_use?
+ end
end
def determine_layout
@@ -128,6 +131,10 @@ class Auth::RegistrationsController < Devise::RegistrationsController
@sessions = current_user.session_activations
end
+ def set_strikes
+ @strikes = current_account.strikes.recent.latest
+ end
+
def require_not_suspended!
forbidden if current_account.suspended?
end
diff --git a/app/controllers/concerns/access_token_tracking_concern.rb b/app/controllers/concerns/access_token_tracking_concern.rb
new file mode 100644
index 000000000..cf60cfb99
--- /dev/null
+++ b/app/controllers/concerns/access_token_tracking_concern.rb
@@ -0,0 +1,21 @@
+# frozen_string_literal: true
+
+module AccessTokenTrackingConcern
+ extend ActiveSupport::Concern
+
+ ACCESS_TOKEN_UPDATE_FREQUENCY = 24.hours.freeze
+
+ included do
+ before_action :update_access_token_last_used
+ end
+
+ private
+
+ def update_access_token_last_used
+ doorkeeper_token.update_last_used(request) if access_token_needs_update?
+ end
+
+ def access_token_needs_update?
+ doorkeeper_token.present? && (doorkeeper_token.last_used_at.nil? || doorkeeper_token.last_used_at < ACCESS_TOKEN_UPDATE_FREQUENCY.ago)
+ end
+end
diff --git a/app/controllers/concerns/authorization.rb b/app/controllers/concerns/authorization.rb
index 95a37e379..05260cc8b 100644
--- a/app/controllers/concerns/authorization.rb
+++ b/app/controllers/concerns/authorization.rb
@@ -3,7 +3,7 @@
module Authorization
extend ActiveSupport::Concern
- include Pundit
+ include Pundit::Authorization
def pundit_user
current_account
diff --git a/app/controllers/concerns/localized.rb b/app/controllers/concerns/localized.rb
index fe1142f34..ede299d5a 100644
--- a/app/controllers/concerns/localized.rb
+++ b/app/controllers/concerns/localized.rb
@@ -7,27 +7,28 @@ module Localized
around_action :set_locale
end
- def set_locale
- locale = current_user.locale if respond_to?(:user_signed_in?) && user_signed_in?
- locale ||= session[:locale] ||= default_locale
- locale = default_locale unless I18n.available_locales.include?(locale.to_sym)
-
- I18n.with_locale(locale) do
- yield
- end
+ def set_locale(&block)
+ I18n.with_locale(requested_locale || I18n.default_locale, &block)
end
private
- def default_locale
- if ENV['DEFAULT_LOCALE'].present?
- I18n.default_locale
- else
- request_locale || I18n.default_locale
- end
+ def requested_locale
+ requested_locale_name = available_locale_or_nil(params[:lang])
+ requested_locale_name ||= available_locale_or_nil(current_user.locale) if respond_to?(:user_signed_in?) && user_signed_in?
+ requested_locale_name ||= http_accept_language if ENV['DEFAULT_LOCALE'].blank?
+ requested_locale_name
end
- def request_locale
- http_accept_language.language_region_compatible_from(I18n.available_locales)
+ def http_accept_language
+ HttpAcceptLanguage::Parser.new(request.headers.fetch('Accept-Language')).language_region_compatible_from(I18n.available_locales) if request.headers.key?('Accept-Language')
+ end
+
+ def available_locale_or_nil(locale_name)
+ locale_name.to_sym if locale_name.present? && I18n.available_locales.include?(locale_name.to_sym)
+ end
+
+ def content_locale
+ @content_locale ||= I18n.locale.to_s.split(/[_-]/).first
end
end
diff --git a/app/controllers/concerns/session_tracking_concern.rb b/app/controllers/concerns/session_tracking_concern.rb
index 45361b019..eaaa4ac59 100644
--- a/app/controllers/concerns/session_tracking_concern.rb
+++ b/app/controllers/concerns/session_tracking_concern.rb
@@ -3,7 +3,7 @@
module SessionTrackingConcern
extend ActiveSupport::Concern
- UPDATE_SIGN_IN_HOURS = 24
+ SESSION_UPDATE_FREQUENCY = 24.hours.freeze
included do
before_action :set_session_activity
@@ -17,6 +17,6 @@ module SessionTrackingConcern
end
def session_needs_update?
- !current_session.nil? && current_session.updated_at < UPDATE_SIGN_IN_HOURS.hours.ago
+ !current_session.nil? && current_session.updated_at < SESSION_UPDATE_FREQUENCY.ago
end
end
diff --git a/app/controllers/concerns/theming_concern.rb b/app/controllers/concerns/theming_concern.rb
index 1ee3256c0..f993a81d7 100644
--- a/app/controllers/concerns/theming_concern.rb
+++ b/app/controllers/concerns/theming_concern.rb
@@ -10,8 +10,17 @@ module ThemingConcern
private
+ def current_flavour
+ [current_user&.setting_flavour, Setting.flavour, 'glitch', 'vanilla'].find { |flavour| Themes.instance.flavours.include?(flavour) }
+ end
+
+ def current_skin
+ skins = Themes.instance.skins_for(current_flavour)
+ [current_user&.setting_skin, Setting.skin, 'default'].find { |skin| skins.include?(skin) }
+ end
+
def valid_pack_data?(data, pack_name)
- data['pack'].is_a?(Hash) && [String, Hash].any? { |c| data['pack'][pack_name].is_a?(c) }
+ data['pack'].is_a?(Hash) && data['pack'][pack_name].present?
end
def nil_pack(data)
diff --git a/app/controllers/concerns/user_tracking_concern.rb b/app/controllers/concerns/user_tracking_concern.rb
index 45f3aab0d..e960cce53 100644
--- a/app/controllers/concerns/user_tracking_concern.rb
+++ b/app/controllers/concerns/user_tracking_concern.rb
@@ -3,7 +3,7 @@
module UserTrackingConcern
extend ActiveSupport::Concern
- UPDATE_SIGN_IN_FREQUENCY = 24.hours.freeze
+ SIGN_IN_UPDATE_FREQUENCY = 24.hours.freeze
included do
before_action :update_user_sign_in
@@ -16,6 +16,6 @@ module UserTrackingConcern
end
def user_needs_sign_in_update?
- user_signed_in? && (current_user.current_sign_in_at.nil? || current_user.current_sign_in_at < UPDATE_SIGN_IN_FREQUENCY.ago)
+ user_signed_in? && (current_user.current_sign_in_at.nil? || current_user.current_sign_in_at < SIGN_IN_UPDATE_FREQUENCY.ago)
end
end
diff --git a/app/controllers/disputes/appeals_controller.rb b/app/controllers/disputes/appeals_controller.rb
new file mode 100644
index 000000000..eefd92b5a
--- /dev/null
+++ b/app/controllers/disputes/appeals_controller.rb
@@ -0,0 +1,26 @@
+# frozen_string_literal: true
+
+class Disputes::AppealsController < Disputes::BaseController
+ before_action :set_strike
+
+ def create
+ authorize @strike, :appeal?
+
+ @appeal = AppealService.new.call(@strike, appeal_params[:text])
+
+ redirect_to disputes_strike_path(@strike), notice: I18n.t('disputes.strikes.appealed_msg')
+ rescue ActiveRecord::RecordInvalid => e
+ @appeal = e.record
+ render template: 'disputes/strikes/show'
+ end
+
+ private
+
+ def set_strike
+ @strike = current_account.strikes.find(params[:strike_id])
+ end
+
+ def appeal_params
+ params.require(:appeal).permit(:text)
+ end
+end
diff --git a/app/controllers/disputes/base_controller.rb b/app/controllers/disputes/base_controller.rb
new file mode 100644
index 000000000..7830c5524
--- /dev/null
+++ b/app/controllers/disputes/base_controller.rb
@@ -0,0 +1,23 @@
+# frozen_string_literal: true
+
+class Disputes::BaseController < ApplicationController
+ include Authorization
+
+ layout 'admin'
+
+ skip_before_action :require_functional!
+
+ before_action :set_body_classes
+ before_action :authenticate_user!
+ before_action :set_pack
+
+ private
+
+ def set_pack
+ use_pack 'admin'
+ end
+
+ def set_body_classes
+ @body_classes = 'admin'
+ end
+end
diff --git a/app/controllers/disputes/strikes_controller.rb b/app/controllers/disputes/strikes_controller.rb
new file mode 100644
index 000000000..d85dcb4d5
--- /dev/null
+++ b/app/controllers/disputes/strikes_controller.rb
@@ -0,0 +1,21 @@
+# frozen_string_literal: true
+
+class Disputes::StrikesController < Disputes::BaseController
+ before_action :set_strike, only: [:show]
+
+ def index
+ @strikes = current_account.strikes.latest
+ end
+
+ def show
+ authorize @strike, :show?
+
+ @appeal = @strike.appeal || @strike.build_appeal
+ end
+
+ private
+
+ def set_strike
+ @strike = AccountWarning.find(params[:id])
+ end
+end
diff --git a/app/controllers/follower_accounts_controller.rb b/app/controllers/follower_accounts_controller.rb
index d519138cd..f898994ac 100644
--- a/app/controllers/follower_accounts_controller.rb
+++ b/app/controllers/follower_accounts_controller.rb
@@ -16,13 +16,13 @@ class FollowerAccountsController < ApplicationController
use_pack 'public'
expires_in 0, public: true unless user_signed_in?
- next if @account.user_hides_network?
+ next if @account.hide_collections?
follows
end
format.json do
- raise Mastodon::NotPermittedError if page_requested? && @account.user_hides_network?
+ raise Mastodon::NotPermittedError if page_requested? && @account.hide_collections?
expires_in(page_requested? ? 0 : 3.minutes, public: public_fetch_mode?)
@@ -83,7 +83,7 @@ class FollowerAccountsController < ApplicationController
end
def restrict_fields_to
- if page_requested? || !@account.user_hides_network?
+ if page_requested? || !@account.hide_collections?
# Return all fields
else
%i(id type total_items)
diff --git a/app/controllers/following_accounts_controller.rb b/app/controllers/following_accounts_controller.rb
index 4b4978fb9..bc291c962 100644
--- a/app/controllers/following_accounts_controller.rb
+++ b/app/controllers/following_accounts_controller.rb
@@ -16,13 +16,13 @@ class FollowingAccountsController < ApplicationController
use_pack 'public'
expires_in 0, public: true unless user_signed_in?
- next if @account.user_hides_network?
+ next if @account.hide_collections?
follows
end
format.json do
- raise Mastodon::NotPermittedError if page_requested? && @account.user_hides_network?
+ raise Mastodon::NotPermittedError if page_requested? && @account.hide_collections?
expires_in(page_requested? ? 0 : 3.minutes, public: public_fetch_mode?)
@@ -83,7 +83,7 @@ class FollowingAccountsController < ApplicationController
end
def restrict_fields_to
- if page_requested? || !@account.user_hides_network?
+ if page_requested? || !@account.hide_collections?
# Return all fields
else
%i(id type total_items)
diff --git a/app/controllers/instance_actors_controller.rb b/app/controllers/instance_actors_controller.rb
index b3b5476e2..0853897f2 100644
--- a/app/controllers/instance_actors_controller.rb
+++ b/app/controllers/instance_actors_controller.rb
@@ -3,6 +3,7 @@
class InstanceActorsController < ApplicationController
include AccountControllerConcern
+ skip_before_action :check_account_confirmation
skip_around_action :set_locale
def show
diff --git a/app/controllers/settings/preferences_controller.rb b/app/controllers/settings/preferences_controller.rb
index d05ceb53f..1fddd087b 100644
--- a/app/controllers/settings/preferences_controller.rb
+++ b/app/controllers/settings/preferences_controller.rb
@@ -48,7 +48,6 @@ class Settings::PreferencesController < Settings::BaseController
:setting_system_font_ui,
:setting_system_emoji_font,
:setting_noindex,
- :setting_hide_network,
:setting_hide_followers_count,
:setting_aggregate_reblogs,
:setting_show_application,
@@ -58,7 +57,7 @@ class Settings::PreferencesController < Settings::BaseController
:setting_use_pending_items,
:setting_trends,
:setting_crop_images,
- notification_emails: %i(follow follow_request reblog favourite mention digest report pending_account trending_tag),
+ notification_emails: %i(follow follow_request reblog favourite mention digest report pending_account trending_tag trending_link trending_status),
interactions: %i(must_be_follower must_be_following must_be_following_dm)
)
end
diff --git a/app/controllers/settings/profiles_controller.rb b/app/controllers/settings/profiles_controller.rb
index 0c15447a6..be5b4f302 100644
--- a/app/controllers/settings/profiles_controller.rb
+++ b/app/controllers/settings/profiles_controller.rb
@@ -20,7 +20,7 @@ class Settings::ProfilesController < Settings::BaseController
private
def account_params
- params.require(:account).permit(:display_name, :note, :avatar, :header, :locked, :bot, :discoverable, fields_attributes: [:name, :value])
+ params.require(:account).permit(:display_name, :note, :avatar, :header, :locked, :bot, :discoverable, :hide_collections, fields_attributes: [:name, :value])
end
def set_account
diff --git a/app/helpers/admin/account_moderation_notes_helper.rb b/app/helpers/admin/account_moderation_notes_helper.rb
index 40b2a5289..2f08538ca 100644
--- a/app/helpers/admin/account_moderation_notes_helper.rb
+++ b/app/helpers/admin/account_moderation_notes_helper.rb
@@ -1,10 +1,10 @@
# frozen_string_literal: true
module Admin::AccountModerationNotesHelper
- def admin_account_link_to(account)
+ def admin_account_link_to(account, path: nil)
return if account.nil?
- link_to admin_account_path(account.id), class: name_tag_classes(account), title: account.acct do
+ link_to path || admin_account_path(account.id), class: name_tag_classes(account), title: account.acct do
safe_join([
image_tag(account.avatar.url, width: 15, height: 15, alt: display_name(account), class: 'avatar'),
content_tag(:span, account.acct, class: 'username'),
diff --git a/app/helpers/admin/action_logs_helper.rb b/app/helpers/admin/action_logs_helper.rb
index f3aa4be4f..47eeeaac3 100644
--- a/app/helpers/admin/action_logs_helper.rb
+++ b/app/helpers/admin/action_logs_helper.rb
@@ -33,6 +33,8 @@ module Admin::ActionLogsHelper
"#{record.ip}/#{record.ip.prefix} (#{I18n.t("simple_form.labels.ip_block.severities.#{record.severity}")})"
when 'Instance'
record.domain
+ when 'Appeal'
+ link_to record.account.acct, disputes_strike_path(record.strike)
end
end
diff --git a/app/helpers/admin/filter_helper.rb b/app/helpers/admin/filter_helper.rb
index 907529b37..140fc73ed 100644
--- a/app/helpers/admin/filter_helper.rb
+++ b/app/helpers/admin/filter_helper.rb
@@ -5,9 +5,10 @@ module Admin::FilterHelper
AccountFilter::KEYS,
CustomEmojiFilter::KEYS,
ReportFilter::KEYS,
- TagFilter::KEYS,
- PreviewCardProviderFilter::KEYS,
- PreviewCardFilter::KEYS,
+ Trends::TagFilter::KEYS,
+ Trends::PreviewCardProviderFilter::KEYS,
+ Trends::PreviewCardFilter::KEYS,
+ Trends::StatusFilter::KEYS,
InstanceFilter::KEYS,
InviteFilter::KEYS,
RelationshipFilter::KEYS,
diff --git a/app/helpers/admin/trends/statuses_helper.rb b/app/helpers/admin/trends/statuses_helper.rb
new file mode 100644
index 000000000..d16e3dd12
--- /dev/null
+++ b/app/helpers/admin/trends/statuses_helper.rb
@@ -0,0 +1,20 @@
+# frozen_string_literal: true
+
+module Admin::Trends::StatusesHelper
+ def one_line_preview(status)
+ text = begin
+ if status.local?
+ status.text.split("\n").first
+ else
+ Nokogiri::HTML(status.text).css('html > body > *').first&.text
+ end
+ end
+
+ return '' if text.blank?
+
+ html = Formatter.instance.send(:encode, text)
+ html = Formatter.instance.send(:encode_custom_emojis, html, status.emojis, prefers_autoplay?)
+
+ html.html_safe # rubocop:disable Rails/OutputSafety
+ end
+end
diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb
index 8b41033a5..eace78af6 100644
--- a/app/helpers/application_helper.rb
+++ b/app/helpers/application_helper.rb
@@ -9,9 +9,9 @@ module ApplicationHelper
RTL_LOCALES = %i(
ar
+ ckb
fa
he
- ku
).freeze
def friendly_number_to_human(number, **options)
@@ -225,4 +225,19 @@ module ApplicationHelper
content_tag(:script, json_escape(json).html_safe, id: 'initial-state', type: 'application/json')
# rubocop:enable Rails/OutputSafety
end
+
+ def grouped_scopes(scopes)
+ scope_parser = ScopeParser.new
+ scope_transformer = ScopeTransformer.new
+
+ scopes.each_with_object({}) do |str, h|
+ scope = scope_transformer.apply(scope_parser.parse(str))
+
+ if h[scope.key]
+ h[scope.key].merge!(scope)
+ else
+ h[scope.key] = scope
+ end
+ end.values
+ end
end
diff --git a/app/helpers/jsonld_helper.rb b/app/helpers/jsonld_helper.rb
index c6557817d..102e4b132 100644
--- a/app/helpers/jsonld_helper.rb
+++ b/app/helpers/jsonld_helper.rb
@@ -15,6 +15,14 @@ module JsonLdHelper
value.is_a?(Array) ? value.first : value
end
+ def uri_from_bearcap(str)
+ if str&.start_with?('bear:')
+ Addressable::URI.parse(str).query_values['u']
+ else
+ str
+ end
+ end
+
# The url attribute can be a string, an array of strings, or an array of objects.
# The objects could include a mimeType. Not-included mimeType means it's text/html.
def url_to_href(value, preferred_type = nil)
@@ -54,7 +62,7 @@ module JsonLdHelper
end
def unsupported_uri_scheme?(uri)
- !uri.start_with?('http://', 'https://')
+ uri.nil? || !uri.start_with?('http://', 'https://')
end
def invalid_origin?(url)
diff --git a/app/helpers/languages_helper.rb b/app/helpers/languages_helper.rb
index 730724208..d39bb6c93 100644
--- a/app/helpers/languages_helper.rb
+++ b/app/helpers/languages_helper.rb
@@ -1,94 +1,257 @@
# frozen_string_literal: true
module LanguagesHelper
- HUMAN_LOCALES = {
- af: 'Afrikaans',
- ar: 'العربية',
- ast: 'Asturianu',
- bg: 'Български',
- bn: 'বাংলা',
- br: 'Breton',
- ca: 'Català',
- co: 'Corsu',
- cs: 'Čeština',
- cy: 'Cymraeg',
- da: 'Dansk',
- de: 'Deutsch',
- el: 'Ελληνικά',
- en: 'English',
- eo: 'Esperanto',
+ ISO_639_1 = {
+ aa: ['Afar', 'Afaraf'].freeze,
+ ab: ['Abkhaz', 'аҧсуа бызшәа'].freeze,
+ ae: ['Avestan', 'avesta'].freeze,
+ af: ['Afrikaans', 'Afrikaans'].freeze,
+ ak: ['Akan', 'Akan'].freeze,
+ am: ['Amharic', 'አማርኛ'].freeze,
+ an: ['Aragonese', 'aragonés'].freeze,
+ ar: ['Arabic', 'اللغة العربية'].freeze,
+ as: ['Assamese', 'অসমীয়া'].freeze,
+ av: ['Avaric', 'авар мацӀ'].freeze,
+ ay: ['Aymara', 'aymar aru'].freeze,
+ az: ['Azerbaijani', 'azərbaycan dili'].freeze,
+ ba: ['Bashkir', 'башҡорт теле'].freeze,
+ be: ['Belarusian', 'беларуская мова'].freeze,
+ bg: ['Bulgarian', 'български език'].freeze,
+ bh: ['Bihari', 'भोजपुरी'].freeze,
+ bi: ['Bislama', 'Bislama'].freeze,
+ bm: ['Bambara', 'bamanankan'].freeze,
+ bn: ['Bengali', 'বাংলা'].freeze,
+ bo: ['Tibetan', 'བོད་ཡིག'].freeze,
+ br: ['Breton', 'brezhoneg'].freeze,
+ bs: ['Bosnian', 'bosanski jezik'].freeze,
+ ca: ['Catalan', 'Català'].freeze,
+ ce: ['Chechen', 'нохчийн мотт'].freeze,
+ ch: ['Chamorro', 'Chamoru'].freeze,
+ co: ['Corsican', 'corsu'].freeze,
+ cr: ['Cree', 'ᓀᐦᐃᔭᐍᐏᐣ'].freeze,
+ cs: ['Czech', 'čeština'].freeze,
+ cu: ['Old Church Slavonic', 'ѩзыкъ словѣньскъ'].freeze,
+ cv: ['Chuvash', 'чӑваш чӗлхи'].freeze,
+ cy: ['Welsh', 'Cymraeg'].freeze,
+ da: ['Danish', 'dansk'].freeze,
+ de: ['German', 'Deutsch'].freeze,
+ dv: ['Divehi', 'Dhivehi'].freeze,
+ dz: ['Dzongkha', 'རྫོང་ཁ'].freeze,
+ ee: ['Ewe', 'Eʋegbe'].freeze,
+ el: ['Greek', 'Ελληνικά'].freeze,
+ en: ['English', 'English'].freeze,
+ eo: ['Esperanto', 'Esperanto'].freeze,
+ es: ['Spanish', 'Español'].freeze,
+ et: ['Estonian', 'eesti'].freeze,
+ eu: ['Basque', 'euskara'].freeze,
+ fa: ['Persian', 'فارسی'].freeze,
+ ff: ['Fula', 'Fulfulde'].freeze,
+ fi: ['Finnish', 'suomi'].freeze,
+ fj: ['Fijian', 'Vakaviti'].freeze,
+ fo: ['Faroese', 'føroyskt'].freeze,
+ fr: ['French', 'Français'].freeze,
+ fy: ['Western Frisian', 'Frysk'].freeze,
+ ga: ['Irish', 'Gaeilge'].freeze,
+ gd: ['Scottish Gaelic', 'Gàidhlig'].freeze,
+ gl: ['Galician', 'galego'].freeze,
+ gu: ['Gujarati', 'ગુજરાતી'].freeze,
+ gv: ['Manx', 'Gaelg'].freeze,
+ ha: ['Hausa', 'هَوُسَ'].freeze,
+ he: ['Hebrew', 'עברית'].freeze,
+ hi: ['Hindi', 'हिन्दी'].freeze,
+ ho: ['Hiri Motu', 'Hiri Motu'].freeze,
+ hr: ['Croatian', 'Hrvatski'].freeze,
+ ht: ['Haitian', 'Kreyòl ayisyen'].freeze,
+ hu: ['Hungarian', 'magyar'].freeze,
+ hy: ['Armenian', 'Հայերեն'].freeze,
+ hz: ['Herero', 'Otjiherero'].freeze,
+ ia: ['Interlingua', 'Interlingua'].freeze,
+ id: ['Indonesian', 'Bahasa Indonesia'].freeze,
+ ie: ['Interlingue', 'Interlingue'].freeze,
+ ig: ['Igbo', 'Asụsụ Igbo'].freeze,
+ ii: ['Nuosu', 'ꆈꌠ꒿ Nuosuhxop'].freeze,
+ ik: ['Inupiaq', 'Iñupiaq'].freeze,
+ io: ['Ido', 'Ido'].freeze,
+ is: ['Icelandic', 'Íslenska'].freeze,
+ it: ['Italian', 'Italiano'].freeze,
+ iu: ['Inuktitut', 'ᐃᓄᒃᑎᑐᑦ'].freeze,
+ ja: ['Japanese', '日本語'].freeze,
+ jv: ['Javanese', 'basa Jawa'].freeze,
+ ka: ['Georgian', 'ქართული'].freeze,
+ kg: ['Kongo', 'Kikongo'].freeze,
+ ki: ['Kikuyu', 'Gĩkũyũ'].freeze,
+ kj: ['Kwanyama', 'Kuanyama'].freeze,
+ kk: ['Kazakh', 'қазақ тілі'].freeze,
+ kl: ['Kalaallisut', 'kalaallisut'].freeze,
+ km: ['Khmer', 'ខេមរភាសា'].freeze,
+ kn: ['Kannada', 'ಕನ್ನಡ'].freeze,
+ ko: ['Korean', '한국어'].freeze,
+ kr: ['Kanuri', 'Kanuri'].freeze,
+ ks: ['Kashmiri', 'कश्मीरी'].freeze,
+ ku: ['Kurmanji (Kurdish)', 'Kurmancî'].freeze,
+ kv: ['Komi', 'коми кыв'].freeze,
+ kw: ['Cornish', 'Kernewek'].freeze,
+ ky: ['Kyrgyz', 'Кыргызча'].freeze,
+ la: ['Latin', 'latine'].freeze,
+ lb: ['Luxembourgish', 'Lëtzebuergesch'].freeze,
+ lg: ['Ganda', 'Luganda'].freeze,
+ li: ['Limburgish', 'Limburgs'].freeze,
+ ln: ['Lingala', 'Lingála'].freeze,
+ lo: ['Lao', 'ພາສາ'].freeze,
+ lt: ['Lithuanian', 'lietuvių kalba'].freeze,
+ lu: ['Luba-Katanga', 'Tshiluba'].freeze,
+ lv: ['Latvian', 'latviešu valoda'].freeze,
+ mg: ['Malagasy', 'fiteny malagasy'].freeze,
+ mh: ['Marshallese', 'Kajin M̧ajeļ'].freeze,
+ mi: ['Māori', 'te reo Māori'].freeze,
+ mk: ['Macedonian', 'македонски јазик'].freeze,
+ ml: ['Malayalam', 'മലയാളം'].freeze,
+ mn: ['Mongolian', 'Монгол хэл'].freeze,
+ mr: ['Marathi', 'मराठी'].freeze,
+ ms: ['Malay', 'Bahasa Melayu'].freeze,
+ mt: ['Maltese', 'Malti'].freeze,
+ my: ['Burmese', 'ဗမာစာ'].freeze,
+ na: ['Nauru', 'Ekakairũ Naoero'].freeze,
+ nb: ['Norwegian Bokmål', 'Norsk bokmål'].freeze,
+ nd: ['Northern Ndebele', 'isiNdebele'].freeze,
+ ne: ['Nepali', 'नेपाली'].freeze,
+ ng: ['Ndonga', 'Owambo'].freeze,
+ nl: ['Dutch', 'Nederlands'].freeze,
+ nn: ['Norwegian Nynorsk', 'Norsk Nynorsk'].freeze,
+ no: ['Norwegian', 'Norsk'].freeze,
+ nr: ['Southern Ndebele', 'isiNdebele'].freeze,
+ nv: ['Navajo', 'Diné bizaad'].freeze,
+ ny: ['Chichewa', 'chiCheŵa'].freeze,
+ oc: ['Occitan', 'occitan'].freeze,
+ oj: ['Ojibwe', 'ᐊᓂᔑᓈᐯᒧᐎᓐ'].freeze,
+ om: ['Oromo', 'Afaan Oromoo'].freeze,
+ or: ['Oriya', 'ଓଡ଼ିଆ'].freeze,
+ os: ['Ossetian', 'ирон æвзаг'].freeze,
+ pa: ['Panjabi', 'ਪੰਜਾਬੀ'].freeze,
+ pi: ['Pāli', 'पाऴि'].freeze,
+ pl: ['Polish', 'Polski'].freeze,
+ ps: ['Pashto', 'پښتو'].freeze,
+ pt: ['Portuguese', 'Português'].freeze,
+ qu: ['Quechua', 'Runa Simi'].freeze,
+ rm: ['Romansh', 'rumantsch grischun'].freeze,
+ rn: ['Kirundi', 'Ikirundi'].freeze,
+ ro: ['Romanian', 'Română'].freeze,
+ ru: ['Russian', 'Русский'].freeze,
+ rw: ['Kinyarwanda', 'Ikinyarwanda'].freeze,
+ sa: ['Sanskrit', 'संस्कृतम्'].freeze,
+ sc: ['Sardinian', 'sardu'].freeze,
+ sd: ['Sindhi', 'सिन्धी'].freeze,
+ se: ['Northern Sami', 'Davvisámegiella'].freeze,
+ sg: ['Sango', 'yângâ tî sängö'].freeze,
+ si: ['Sinhala', 'සිංහල'].freeze,
+ sk: ['Slovak', 'slovenčina'].freeze,
+ sl: ['Slovenian', 'slovenščina'].freeze,
+ sn: ['Shona', 'chiShona'].freeze,
+ so: ['Somali', 'Soomaaliga'].freeze,
+ sq: ['Albanian', 'Shqip'].freeze,
+ sr: ['Serbian', 'српски језик'].freeze,
+ ss: ['Swati', 'SiSwati'].freeze,
+ st: ['Southern Sotho', 'Sesotho'].freeze,
+ su: ['Sundanese', 'Basa Sunda'].freeze,
+ sv: ['Swedish', 'Svenska'].freeze,
+ sw: ['Swahili', 'Kiswahili'].freeze,
+ ta: ['Tamil', 'தமிழ்'].freeze,
+ te: ['Telugu', 'తెలుగు'].freeze,
+ tg: ['Tajik', 'тоҷикӣ'].freeze,
+ th: ['Thai', 'ไทย'].freeze,
+ ti: ['Tigrinya', 'ትግርኛ'].freeze,
+ tk: ['Turkmen', 'Türkmen'].freeze,
+ tl: ['Tagalog', 'Wikang Tagalog'].freeze,
+ tn: ['Tswana', 'Setswana'].freeze,
+ to: ['Tonga', 'faka Tonga'].freeze,
+ tr: ['Turkish', 'Türkçe'].freeze,
+ ts: ['Tsonga', 'Xitsonga'].freeze,
+ tt: ['Tatar', 'татар теле'].freeze,
+ tw: ['Twi', 'Twi'].freeze,
+ ty: ['Tahitian', 'Reo Tahiti'].freeze,
+ ug: ['Uyghur', 'ئۇيغۇرچە'].freeze,
+ uk: ['Ukrainian', 'Українська'].freeze,
+ ur: ['Urdu', 'اردو'].freeze,
+ uz: ['Uzbek', 'Ўзбек'].freeze,
+ ve: ['Venda', 'Tshivenḓa'].freeze,
+ vi: ['Vietnamese', 'Tiếng Việt'].freeze,
+ vo: ['Volapük', 'Volapük'].freeze,
+ wa: ['Walloon', 'walon'].freeze,
+ wo: ['Wolof', 'Wollof'].freeze,
+ xh: ['Xhosa', 'isiXhosa'].freeze,
+ yi: ['Yiddish', 'ייִדיש'].freeze,
+ yo: ['Yoruba', 'Yorùbá'].freeze,
+ za: ['Zhuang', 'Saɯ cueŋƅ'].freeze,
+ zh: ['Chinese', '中文'].freeze,
+ zu: ['Zulu', 'isiZulu'].freeze,
+ }.freeze
+
+ ISO_639_3 = {
+ ast: ['Asturian', 'Asturianu'].freeze,
+ ckb: ['Sorani (Kurdish)', 'سۆرانی'].freeze,
+ kab: ['Kabyle', 'Taqbaylit'].freeze,
+ kmr: ['Kurmanji (Kurdish)', 'Kurmancî'].freeze,
+ zgh: ['Standard Moroccan Tamazight', 'ⵜⴰⵎⴰⵣⵉⵖⵜ'].freeze,
+ }.freeze
+
+ SUPPORTED_LOCALES = {}.merge(ISO_639_1).merge(ISO_639_3).freeze
+
+ # For ISO-639-1 and ISO-639-3 language codes, we have their official
+ # names, but for some translations, we need the names of the
+ # regional variants specifically
+ REGIONAL_LOCALE_NAMES = {
'es-AR': 'Español (Argentina)',
'es-MX': 'Español (México)',
- es: 'Español',
- et: 'Eesti',
- eu: 'Euskara',
- fa: 'فارسی',
- fi: 'Suomi',
- fr: 'Français',
- ga: 'Gaeilge',
- gd: 'Gàidhlig',
- gl: 'Galego',
- he: 'עברית',
- hi: 'हिन्दी',
- hr: 'Hrvatski',
- hu: 'Magyar',
- hy: 'Հայերեն',
- id: 'Bahasa Indonesia',
- io: 'Ido',
- is: 'Íslenska',
- it: 'Italiano',
- ja: '日本語',
- ka: 'ქართული',
- kab: 'Taqbaylit',
- kk: 'Қазақша',
- kmr: 'Kurmancî',
- kn: 'ಕನ್ನಡ',
- ko: '한국어',
- ku: 'سۆرانی',
- lt: 'Lietuvių',
- lv: 'Latviešu',
- mk: 'Македонски',
- ml: 'മലയാളം',
- mr: 'मराठी',
- ms: 'Bahasa Melayu',
- nl: 'Nederlands',
- nn: 'Nynorsk',
- no: 'Norsk',
- oc: 'Occitan',
- pl: 'Polski',
'pt-BR': 'Português (Brasil)',
'pt-PT': 'Português (Portugal)',
- pt: 'Português',
- ro: 'Română',
- ru: 'Русский',
- sa: 'संस्कृतम्',
- sc: 'Sardu',
- si: 'සිංහල',
- sk: 'Slovenčina',
- sl: 'Slovenščina',
- sq: 'Shqip',
'sr-Latn': 'Srpski (latinica)',
- sr: 'Српски',
- sv: 'Svenska',
- ta: 'தமிழ்',
- te: 'తెలుగు',
- th: 'ไทย',
- tr: 'Türkçe',
- uk: 'Українська',
- ur: 'اُردُو',
- vi: 'Tiếng Việt',
- zgh: 'ⵜⴰⵎⴰⵣⵉⵖⵜ',
'zh-CN': '简体中文',
'zh-HK': '繁體中文(香港)',
'zh-TW': '繁體中文(臺灣)',
- zh: '中文',
}.freeze
- def human_locale(locale)
- if locale == 'und'
+ def native_locale_name(locale)
+ if locale.blank? || locale == 'und'
I18n.t('generic.none')
+ elsif (supported_locale = SUPPORTED_LOCALES[locale.to_sym])
+ supported_locale[1]
+ elsif (regional_locale = REGIONAL_LOCALE_NAMES[locale.to_sym])
+ regional_locale
else
- HUMAN_LOCALES[locale.to_sym] || locale
+ locale
end
end
+
+ def standard_locale_name(locale)
+ if locale.blank?
+ I18n.t('generic.none')
+ elsif (supported_locale = SUPPORTED_LOCALES[locale.to_sym])
+ supported_locale[0]
+ else
+ locale
+ end
+ end
+
+ def valid_locale_or_nil(str)
+ return if str.blank?
+
+ code, = str.to_s.split(/[_-]/) # Strip out the region from e.g. en_US or ja-JP
+
+ return unless valid_locale?(code)
+
+ code
+ end
+
+ def valid_locale_cascade(*arr)
+ arr.each do |str|
+ locale = valid_locale_or_nil(str)
+ return locale if locale.present?
+ end
+
+ nil
+ end
+
+ def valid_locale?(locale)
+ locale.present? && SUPPORTED_LOCALES.key?(locale.to_sym)
+ end
end
diff --git a/app/helpers/settings_helper.rb b/app/helpers/settings_helper.rb
index 23739d1cd..3d5592867 100644
--- a/app/helpers/settings_helper.rb
+++ b/app/helpers/settings_helper.rb
@@ -2,7 +2,7 @@
module SettingsHelper
def filterable_languages
- LanguageDetector.instance.language_names.select(&LanguagesHelper::HUMAN_LOCALES.method(:key?))
+ LanguagesHelper::SUPPORTED_LOCALES.keys
end
def hash_to_object(hash)
diff --git a/app/helpers/statuses_helper.rb b/app/helpers/statuses_helper.rb
index 25f079e9d..d328f89b7 100644
--- a/app/helpers/statuses_helper.rb
+++ b/app/helpers/statuses_helper.rb
@@ -132,7 +132,7 @@ module StatusesHelper
end
def render_video_component(status, **options)
- video = status.media_attachments.first
+ video = status.ordered_media_attachments.first
meta = video.file.meta || {}
@@ -150,12 +150,12 @@ module StatusesHelper
}.merge(**options)
react_component :video, component_params do
- render partial: 'statuses/attachment_list', locals: { attachments: status.media_attachments }
+ render partial: 'statuses/attachment_list', locals: { attachments: status.ordered_media_attachments }
end
end
def render_audio_component(status, **options)
- audio = status.media_attachments.first
+ audio = status.ordered_media_attachments.first
meta = audio.file.meta || {}
@@ -170,7 +170,7 @@ module StatusesHelper
}.merge(**options)
react_component :audio, component_params do
- render partial: 'statuses/attachment_list', locals: { attachments: status.media_attachments }
+ render partial: 'statuses/attachment_list', locals: { attachments: status.ordered_media_attachments }
end
end
@@ -178,11 +178,11 @@ module StatusesHelper
component_params = {
sensitive: sensitized?(status, current_account),
autoplay: prefers_autoplay?,
- media: status.media_attachments.map { |a| ActiveModelSerializers::SerializableResource.new(a, serializer: REST::MediaAttachmentSerializer).as_json },
+ media: status.ordered_media_attachments.map { |a| ActiveModelSerializers::SerializableResource.new(a, serializer: REST::MediaAttachmentSerializer).as_json },
}.merge(**options)
react_component :media_gallery, component_params do
- render partial: 'statuses/attachment_list', locals: { attachments: status.media_attachments }
+ render partial: 'statuses/attachment_list', locals: { attachments: status.ordered_media_attachments }
end
end
diff --git a/app/javascript/flavours/glitch/actions/compose.js b/app/javascript/flavours/glitch/actions/compose.js
index 261c72b2a..baa98e98f 100644
--- a/app/javascript/flavours/glitch/actions/compose.js
+++ b/app/javascript/flavours/glitch/actions/compose.js
@@ -75,6 +75,8 @@ export const INIT_MEDIA_EDIT_MODAL = 'INIT_MEDIA_EDIT_MODAL';
export const COMPOSE_CHANGE_MEDIA_DESCRIPTION = 'COMPOSE_CHANGE_MEDIA_DESCRIPTION';
export const COMPOSE_CHANGE_MEDIA_FOCUS = 'COMPOSE_CHANGE_MEDIA_FOCUS';
+export const COMPOSE_SET_STATUS = 'COMPOSE_SET_STATUS';
+
const messages = defineMessages({
uploadErrorLimit: { id: 'upload_error.limit', defaultMessage: 'File upload limit exceeded.' },
uploadErrorPoll: { id: 'upload_error.poll', defaultMessage: 'File upload not allowed with polls.' },
@@ -88,6 +90,15 @@ export const ensureComposeIsVisible = (getState, routerHistory) => {
}
};
+export function setComposeToStatus(status, text, spoiler_text) {
+ return{
+ type: COMPOSE_SET_STATUS,
+ status,
+ text,
+ spoiler_text,
+ };
+};
+
export function changeCompose(text) {
return {
type: COMPOSE_CHANGE,
@@ -150,8 +161,9 @@ export function directCompose(account, routerHistory) {
export function submitCompose(routerHistory) {
return function (dispatch, getState) {
- let status = getState().getIn(['compose', 'text'], '');
- let media = getState().getIn(['compose', 'media_attachments']);
+ let status = getState().getIn(['compose', 'text'], '');
+ const media = getState().getIn(['compose', 'media_attachments']);
+ const statusId = getState().getIn(['compose', 'id'], null);
const spoilers = getState().getIn(['compose', 'spoiler']) || getState().getIn(['local_settings', 'always_show_spoilers_field']);
let spoilerText = spoilers ? getState().getIn(['compose', 'spoiler_text'], '') : '';
@@ -159,20 +171,25 @@ export function submitCompose(routerHistory) {
return;
}
- dispatch(submitComposeRequest());
if (getState().getIn(['compose', 'advanced_options', 'do_not_federate'])) {
status = status + ' 👁️';
}
- api(getState).post('/api/v1/statuses', {
- status,
- content_type: getState().getIn(['compose', 'content_type']),
- in_reply_to_id: getState().getIn(['compose', 'in_reply_to'], null),
- media_ids: media.map(item => item.get('id')),
- sensitive: getState().getIn(['compose', 'sensitive']) || (spoilerText.length > 0 && media.size !== 0),
- spoiler_text: spoilerText,
- visibility: getState().getIn(['compose', 'privacy']),
- poll: getState().getIn(['compose', 'poll'], null),
- }, {
+
+ dispatch(submitComposeRequest());
+
+ api(getState).request({
+ url: statusId === null ? '/api/v1/statuses' : `/api/v1/statuses/${statusId}`,
+ method: statusId === null ? 'post' : 'put',
+ data: {
+ status,
+ content_type: getState().getIn(['compose', 'content_type']),
+ in_reply_to_id: getState().getIn(['compose', 'in_reply_to'], null),
+ media_ids: media.map(item => item.get('id')),
+ sensitive: getState().getIn(['compose', 'sensitive']) || (spoilerText.length > 0 && media.size !== 0),
+ spoiler_text: spoilerText,
+ visibility: getState().getIn(['compose', 'privacy']),
+ poll: getState().getIn(['compose', 'poll'], null),
+ },
headers: {
'Idempotency-Key': getState().getIn(['compose', 'idempotencyKey']),
},
@@ -202,14 +219,16 @@ export function submitCompose(routerHistory) {
}
};
- insertIfOnline('home');
+ if (statusId === null) {
+ insertIfOnline('home');
+ }
- if (response.data.in_reply_to_id === null && response.data.visibility === 'public') {
+ if (statusId === null && response.data.in_reply_to_id === null && response.data.visibility === 'public') {
insertIfOnline('community');
if (!response.data.local_only) {
insertIfOnline('public');
}
- } else if (response.data.visibility === 'direct') {
+ } else if (statusId === null && response.data.visibility === 'direct') {
insertIfOnline('direct');
}
}).catch(function (error) {
diff --git a/app/javascript/flavours/glitch/actions/history.js b/app/javascript/flavours/glitch/actions/history.js
new file mode 100644
index 000000000..c47057261
--- /dev/null
+++ b/app/javascript/flavours/glitch/actions/history.js
@@ -0,0 +1,37 @@
+import api from 'flavours/glitch/util/api';
+import { importFetchedAccounts } from './importer';
+
+export const HISTORY_FETCH_REQUEST = 'HISTORY_FETCH_REQUEST';
+export const HISTORY_FETCH_SUCCESS = 'HISTORY_FETCH_SUCCESS';
+export const HISTORY_FETCH_FAIL = 'HISTORY_FETCH_FAIL';
+
+export const fetchHistory = statusId => (dispatch, getState) => {
+ const loading = getState().getIn(['history', statusId, 'loading']);
+
+ if (loading) {
+ return;
+ }
+
+ dispatch(fetchHistoryRequest(statusId));
+
+ api(getState).get(`/api/v1/statuses/${statusId}/history`).then(({ data }) => {
+ dispatch(importFetchedAccounts(data.map(x => x.account)));
+ dispatch(fetchHistorySuccess(statusId, data));
+ }).catch(error => dispatch(fetchHistoryFail(error)));
+};
+
+export const fetchHistoryRequest = statusId => ({
+ type: HISTORY_FETCH_REQUEST,
+ statusId,
+});
+
+export const fetchHistorySuccess = (statusId, history) => ({
+ type: HISTORY_FETCH_SUCCESS,
+ statusId,
+ history,
+});
+
+export const fetchHistoryFail = error => ({
+ type: HISTORY_FETCH_FAIL,
+ error,
+});
diff --git a/app/javascript/flavours/glitch/actions/modal.js b/app/javascript/flavours/glitch/actions/modal.js
index 3d0299db5..3e576fab8 100644
--- a/app/javascript/flavours/glitch/actions/modal.js
+++ b/app/javascript/flavours/glitch/actions/modal.js
@@ -9,9 +9,10 @@ export function openModal(type, props) {
};
};
-export function closeModal(type) {
+export function closeModal(type, options = { ignoreFocus: false }) {
return {
type: MODAL_CLOSE,
modalType: type,
+ ignoreFocus: options.ignoreFocus,
};
};
diff --git a/app/javascript/flavours/glitch/actions/notifications.js b/app/javascript/flavours/glitch/actions/notifications.js
index 4b00ea632..42ad39efa 100644
--- a/app/javascript/flavours/glitch/actions/notifications.js
+++ b/app/javascript/flavours/glitch/actions/notifications.js
@@ -47,7 +47,6 @@ export const NOTIFICATIONS_UNMOUNT = 'NOTIFICATIONS_UNMOUNT';
export const NOTIFICATIONS_SET_VISIBILITY = 'NOTIFICATIONS_SET_VISIBILITY';
-
export const NOTIFICATIONS_MARK_AS_READ = 'NOTIFICATIONS_MARK_AS_READ';
export const NOTIFICATIONS_SET_BROWSER_SUPPORT = 'NOTIFICATIONS_SET_BROWSER_SUPPORT';
@@ -58,7 +57,7 @@ defineMessages({
});
const fetchRelatedRelationships = (dispatch, notifications) => {
- const accountIds = notifications.filter(item => item.type === 'follow').map(item => item.account.id);
+ const accountIds = notifications.filter(item => ['follow', 'follow_request', 'admin.sign_up'].indexOf(item.type) !== -1).map(item => item.account.id);
if (accountIds > 0) {
dispatch(fetchRelationships(accountIds));
@@ -136,7 +135,18 @@ const excludeTypesFromSettings = state => state.getIn(['settings', 'notification
const excludeTypesFromFilter = filter => {
- const allTypes = ImmutableList(['follow', 'follow_request', 'favourite', 'reblog', 'mention', 'poll']);
+ const allTypes = ImmutableList([
+ 'follow',
+ 'follow_request',
+ 'favourite',
+ 'reblog',
+ 'mention',
+ 'poll',
+ 'status',
+ 'update',
+ 'admin.sign_up',
+ ]);
+
return allTypes.filterNot(item => item === filter).toJS();
};
diff --git a/app/javascript/flavours/glitch/actions/reports.js b/app/javascript/flavours/glitch/actions/reports.js
index 80c3b3280..333bc71f4 100644
--- a/app/javascript/flavours/glitch/actions/reports.js
+++ b/app/javascript/flavours/glitch/actions/reports.js
@@ -1,89 +1,38 @@
import api from 'flavours/glitch/util/api';
-import { openModal, closeModal } from './modal';
-
-export const REPORT_INIT = 'REPORT_INIT';
-export const REPORT_CANCEL = 'REPORT_CANCEL';
+import { openModal } from './modal';
export const REPORT_SUBMIT_REQUEST = 'REPORT_SUBMIT_REQUEST';
export const REPORT_SUBMIT_SUCCESS = 'REPORT_SUBMIT_SUCCESS';
export const REPORT_SUBMIT_FAIL = 'REPORT_SUBMIT_FAIL';
-export const REPORT_STATUS_TOGGLE = 'REPORT_STATUS_TOGGLE';
-export const REPORT_COMMENT_CHANGE = 'REPORT_COMMENT_CHANGE';
-export const REPORT_FORWARD_CHANGE = 'REPORT_FORWARD_CHANGE';
+export const initReport = (account, status) => dispatch =>
+ dispatch(openModal('REPORT', {
+ accountId: account.get('id'),
+ statusId: status?.get('id'),
+ }));
-export function initReport(account, status) {
- return dispatch => {
- dispatch({
- type: REPORT_INIT,
- account,
- status,
- });
+export const submitReport = (params, onSuccess, onFail) => (dispatch, getState) => {
+ dispatch(submitReportRequest());
- dispatch(openModal('REPORT'));
- };
+ api(getState).post('/api/v1/reports', params).then(response => {
+ dispatch(submitReportSuccess(response.data));
+ if (onSuccess) onSuccess();
+ }).catch(error => {
+ dispatch(submitReportFail(error));
+ if (onFail) onFail();
+ });
};
-export function cancelReport() {
- return {
- type: REPORT_CANCEL,
- };
-};
+export const submitReportRequest = () => ({
+ type: REPORT_SUBMIT_REQUEST,
+});
-export function toggleStatusReport(statusId, checked) {
- return {
- type: REPORT_STATUS_TOGGLE,
- statusId,
- checked,
- };
-};
+export const submitReportSuccess = report => ({
+ type: REPORT_SUBMIT_SUCCESS,
+ report,
+});
-export function submitReport() {
- return (dispatch, getState) => {
- dispatch(submitReportRequest());
-
- api(getState).post('/api/v1/reports', {
- account_id: getState().getIn(['reports', 'new', 'account_id']),
- status_ids: getState().getIn(['reports', 'new', 'status_ids']),
- comment: getState().getIn(['reports', 'new', 'comment']),
- forward: getState().getIn(['reports', 'new', 'forward']),
- }).then(response => {
- dispatch(closeModal());
- dispatch(submitReportSuccess(response.data));
- }).catch(error => dispatch(submitReportFail(error)));
- };
-};
-
-export function submitReportRequest() {
- return {
- type: REPORT_SUBMIT_REQUEST,
- };
-};
-
-export function submitReportSuccess(report) {
- return {
- type: REPORT_SUBMIT_SUCCESS,
- report,
- };
-};
-
-export function submitReportFail(error) {
- return {
- type: REPORT_SUBMIT_FAIL,
- error,
- };
-};
-
-export function changeReportComment(comment) {
- return {
- type: REPORT_COMMENT_CHANGE,
- comment,
- };
-};
-
-export function changeReportForward(forward) {
- return {
- type: REPORT_FORWARD_CHANGE,
- forward,
- };
-};
+export const submitReportFail = error => ({
+ type: REPORT_SUBMIT_FAIL,
+ error,
+});
diff --git a/app/javascript/flavours/glitch/actions/rules.js b/app/javascript/flavours/glitch/actions/rules.js
new file mode 100644
index 000000000..b95045e81
--- /dev/null
+++ b/app/javascript/flavours/glitch/actions/rules.js
@@ -0,0 +1,27 @@
+import api from 'flavours/glitch/util/api';
+
+export const RULES_FETCH_REQUEST = 'RULES_FETCH_REQUEST';
+export const RULES_FETCH_SUCCESS = 'RULES_FETCH_SUCCESS';
+export const RULES_FETCH_FAIL = 'RULES_FETCH_FAIL';
+
+export const fetchRules = () => (dispatch, getState) => {
+ dispatch(fetchRulesRequest());
+
+ api(getState)
+ .get('/api/v1/instance').then(({ data }) => dispatch(fetchRulesSuccess(data.rules)))
+ .catch(err => dispatch(fetchRulesFail(err)));
+};
+
+const fetchRulesRequest = () => ({
+ type: RULES_FETCH_REQUEST,
+});
+
+const fetchRulesSuccess = rules => ({
+ type: RULES_FETCH_SUCCESS,
+ rules,
+});
+
+const fetchRulesFail = error => ({
+ type: RULES_FETCH_FAIL,
+ error,
+});
diff --git a/app/javascript/flavours/glitch/actions/statuses.js b/app/javascript/flavours/glitch/actions/statuses.js
index 7db357df1..6ffcf181d 100644
--- a/app/javascript/flavours/glitch/actions/statuses.js
+++ b/app/javascript/flavours/glitch/actions/statuses.js
@@ -2,7 +2,7 @@ import api from 'flavours/glitch/util/api';
import { deleteFromTimelines } from './timelines';
import { importFetchedStatus, importFetchedStatuses } from './importer';
-import { ensureComposeIsVisible } from './compose';
+import { ensureComposeIsVisible, setComposeToStatus } from './compose';
export const STATUS_FETCH_REQUEST = 'STATUS_FETCH_REQUEST';
export const STATUS_FETCH_SUCCESS = 'STATUS_FETCH_SUCCESS';
@@ -26,6 +26,10 @@ export const STATUS_UNMUTE_FAIL = 'STATUS_UNMUTE_FAIL';
export const REDRAFT = 'REDRAFT';
+export const STATUS_FETCH_SOURCE_REQUEST = 'STATUS_FETCH_SOURCE_REQUEST';
+export const STATUS_FETCH_SOURCE_SUCCESS = 'STATUS_FETCH_SOURCE_SUCCESS';
+export const STATUS_FETCH_SOURCE_FAIL = 'STATUS_FETCH_SOURCE_FAIL';
+
export function fetchStatusRequest(id, skipLoading) {
return {
type: STATUS_FETCH_REQUEST,
@@ -81,6 +85,37 @@ export function redraft(status, raw_text, content_type) {
};
};
+export const editStatus = (id, routerHistory) => (dispatch, getState) => {
+ let status = getState().getIn(['statuses', id]);
+
+ if (status.get('poll')) {
+ status = status.set('poll', getState().getIn(['polls', status.get('poll')]));
+ }
+
+ dispatch(fetchStatusSourceRequest());
+
+ api(getState).get(`/api/v1/statuses/${id}/source`).then(response => {
+ dispatch(fetchStatusSourceSuccess());
+ ensureComposeIsVisible(getState, routerHistory);
+ dispatch(setComposeToStatus(status, response.data.text, response.data.spoiler_text));
+ }).catch(error => {
+ dispatch(fetchStatusSourceFail(error));
+ });
+};
+
+export const fetchStatusSourceRequest = () => ({
+ type: STATUS_FETCH_SOURCE_REQUEST,
+});
+
+export const fetchStatusSourceSuccess = () => ({
+ type: STATUS_FETCH_SOURCE_SUCCESS,
+});
+
+export const fetchStatusSourceFail = error => ({
+ type: STATUS_FETCH_SOURCE_FAIL,
+ error,
+});
+
export function deleteStatus(id, routerHistory, withRedraft = false) {
return (dispatch, getState) => {
let status = getState().getIn(['statuses', id]);
diff --git a/app/javascript/flavours/glitch/components/admin/Counter.js b/app/javascript/flavours/glitch/components/admin/Counter.js
index 2bc9ce482..ecb242950 100644
--- a/app/javascript/flavours/glitch/components/admin/Counter.js
+++ b/app/javascript/flavours/glitch/components/admin/Counter.js
@@ -68,12 +68,12 @@ export default class Counter extends React.PureComponent {
);
} else {
const measure = data[0];
- const percentChange = percIncrease(measure.previous_total * 1, measure.total * 1);
+ const percentChange = measure.previous_total && percIncrease(measure.previous_total * 1, measure.total * 1);
content = (
-
- 0, negative: percentChange < 0 })}>{percentChange > 0 && '+'}
+ {measure.human_value || }
+ {measure.previous_total && ( 0, negative: percentChange < 0 })}>{percentChange > 0 && '+'} )}
);
}
diff --git a/app/javascript/flavours/glitch/components/check.js b/app/javascript/flavours/glitch/components/check.js
new file mode 100644
index 000000000..ee2ef1595
--- /dev/null
+++ b/app/javascript/flavours/glitch/components/check.js
@@ -0,0 +1,9 @@
+import React from 'react';
+
+const Check = () => (
+
+
+
+);
+
+export default Check;
diff --git a/app/javascript/flavours/glitch/components/dropdown_menu.js b/app/javascript/flavours/glitch/components/dropdown_menu.js
index 023fecb9a..bd6bc4ffd 100644
--- a/app/javascript/flavours/glitch/components/dropdown_menu.js
+++ b/app/javascript/flavours/glitch/components/dropdown_menu.js
@@ -6,6 +6,8 @@ import Overlay from 'react-overlays/lib/Overlay';
import Motion from 'flavours/glitch/util/optional_motion';
import spring from 'react-motion/lib/spring';
import { supportsPassiveEvents } from 'detect-passive-events';
+import classNames from 'classnames';
+import { CircularProgress } from 'mastodon/components/loading_indicator';
const listenerOptions = supportsPassiveEvents ? { passive: true } : false;
let id = 0;
@@ -17,13 +19,18 @@ class DropdownMenu extends React.PureComponent {
};
static propTypes = {
- items: PropTypes.array.isRequired,
+ items: PropTypes.oneOfType([PropTypes.array, ImmutablePropTypes.list]).isRequired,
+ loading: PropTypes.bool,
+ scrollable: PropTypes.bool,
onClose: PropTypes.func.isRequired,
style: PropTypes.object,
placement: PropTypes.string,
arrowOffsetLeft: PropTypes.string,
arrowOffsetTop: PropTypes.string,
openedViaKeyboard: PropTypes.bool,
+ renderItem: PropTypes.func,
+ renderHeader: PropTypes.func,
+ onItemClick: PropTypes.func.isRequired,
};
static defaultProps = {
@@ -45,9 +52,11 @@ class DropdownMenu extends React.PureComponent {
document.addEventListener('click', this.handleDocumentClick, false);
document.addEventListener('keydown', this.handleKeyDown, false);
document.addEventListener('touchend', this.handleDocumentClick, listenerOptions);
+
if (this.focusedItem && this.props.openedViaKeyboard) {
this.focusedItem.focus({ preventScroll: true });
}
+
this.setState({ mounted: true });
}
@@ -66,7 +75,7 @@ class DropdownMenu extends React.PureComponent {
}
handleKeyDown = e => {
- const items = Array.from(this.node.getElementsByTagName('a'));
+ const items = Array.from(this.node.querySelectorAll('a, button'));
const index = items.indexOf(document.activeElement);
let element = null;
@@ -109,30 +118,20 @@ class DropdownMenu extends React.PureComponent {
}
handleClick = e => {
- const i = Number(e.currentTarget.getAttribute('data-index'));
- const { action, to } = this.props.items[i];
-
- this.props.onClose();
-
- if (typeof action === 'function') {
- e.preventDefault();
- action();
- } else if (to) {
- e.preventDefault();
- this.context.router.history.push(to);
- }
+ const { onItemClick } = this.props;
+ onItemClick(e);
}
- renderItem (option, i) {
+ renderItem = (option, i) => {
if (option === null) {
return ;
}
- const { text, href = '#' } = option;
+ const { text, href = '#', target = '_blank', method } = option;
return (
-
+
{text}
@@ -140,21 +139,37 @@ class DropdownMenu extends React.PureComponent {
}
render () {
- const { items, style, placement, arrowOffsetLeft, arrowOffsetTop } = this.props;
+ const { items, style, placement, arrowOffsetLeft, arrowOffsetTop, scrollable, renderHeader, loading } = this.props;
const { mounted } = this.state;
+ let renderItem = this.props.renderItem || this.renderItem;
+
return (
{({ opacity, scaleX, scaleY }) => (
// It should not be transformed when mounting because the resulting
// size will be used to determine the coordinate of the menu by
// react-overlays
-
+
-
- {items.map((option, i) => this.renderItem(option, i))}
-
+
+ {loading && (
+
+ )}
+
+ {!loading && renderHeader && (
+
+ {renderHeader(items)}
+
+ )}
+
+ {!loading && (
+
+ {items.map((option, i) => renderItem(option, i, { onClick: this.handleClick, onKeyPress: this.handleItemKeyPress }))}
+
+ )}
+
)}
@@ -170,11 +185,14 @@ export default class Dropdown extends React.PureComponent {
};
static propTypes = {
- icon: PropTypes.string.isRequired,
- items: PropTypes.array.isRequired,
- size: PropTypes.number.isRequired,
+ children: PropTypes.node,
+ icon: PropTypes.string,
+ items: PropTypes.oneOfType([PropTypes.array, ImmutablePropTypes.list]).isRequired,
+ loading: PropTypes.bool,
+ size: PropTypes.number,
title: PropTypes.string,
disabled: PropTypes.bool,
+ scrollable: PropTypes.bool,
status: ImmutablePropTypes.map,
isUserTouching: PropTypes.func,
onOpen: PropTypes.func.isRequired,
@@ -182,6 +200,9 @@ export default class Dropdown extends React.PureComponent {
dropdownPlacement: PropTypes.string,
openDropdownId: PropTypes.number,
openedViaKeyboard: PropTypes.bool,
+ renderItem: PropTypes.func,
+ renderHeader: PropTypes.func,
+ onItemClick: PropTypes.func,
};
static defaultProps = {
@@ -236,17 +257,22 @@ export default class Dropdown extends React.PureComponent {
}
}
- handleItemClick = (i, e) => {
- const { action, to } = this.props.items[i];
+ handleItemClick = e => {
+ const { onItemClick } = this.props;
+ const i = Number(e.currentTarget.getAttribute('data-index'));
+ const item = this.props.items[i];
this.handleClose();
- if (typeof action === 'function') {
+ if (typeof onItemClick === 'function') {
e.preventDefault();
- action();
- } else if (to) {
+ onItemClick(item, i);
+ } else if (item && typeof item.action === 'function') {
e.preventDefault();
- this.context.router.history.push(to);
+ item.action();
+ } else if (item && item.to) {
+ e.preventDefault();
+ this.context.router.history.push(item.to);
}
}
@@ -264,29 +290,67 @@ export default class Dropdown extends React.PureComponent {
}
}
+ close = () => {
+ this.handleClose();
+ }
+
render () {
- const { icon, items, size, title, disabled, dropdownPlacement, openDropdownId, openedViaKeyboard } = this.props;
+ const {
+ icon,
+ items,
+ size,
+ title,
+ disabled,
+ loading,
+ scrollable,
+ dropdownPlacement,
+ openDropdownId,
+ openedViaKeyboard,
+ children,
+ renderItem,
+ renderHeader,
+ } = this.props;
+
const open = this.state.id === openDropdownId;
+ const button = children ? React.cloneElement(React.Children.only(children), {
+ ref: this.setTargetRef,
+ onClick: this.handleClick,
+ onMouseDown: this.handleMouseDown,
+ onKeyDown: this.handleButtonKeyDown,
+ onKeyPress: this.handleKeyPress,
+ }) : (
+
+ );
+
return (
-
-
+
+ {button}
-
+
-
+
);
}
diff --git a/app/javascript/flavours/glitch/components/edited_timestamp/containers/dropdown_menu_container.js b/app/javascript/flavours/glitch/components/edited_timestamp/containers/dropdown_menu_container.js
new file mode 100644
index 000000000..8b73663d4
--- /dev/null
+++ b/app/javascript/flavours/glitch/components/edited_timestamp/containers/dropdown_menu_container.js
@@ -0,0 +1,27 @@
+import { connect } from 'react-redux';
+import { openDropdownMenu, closeDropdownMenu } from 'flavours/glitch/actions/dropdown_menu';
+import { fetchHistory } from 'flavours/glitch/actions/history';
+import DropdownMenu from 'flavours/glitch/components/dropdown_menu';
+
+const mapStateToProps = (state, { statusId }) => ({
+ dropdownPlacement: state.getIn(['dropdown_menu', 'placement']),
+ openDropdownId: state.getIn(['dropdown_menu', 'openId']),
+ openedViaKeyboard: state.getIn(['dropdown_menu', 'keyboard']),
+ items: state.getIn(['history', statusId, 'items']),
+ loading: state.getIn(['history', statusId, 'loading']),
+});
+
+const mapDispatchToProps = (dispatch, { statusId }) => ({
+
+ onOpen (id, onItemClick, dropdownPlacement, keyboard) {
+ dispatch(fetchHistory(statusId));
+ dispatch(openDropdownMenu(id, dropdownPlacement, keyboard));
+ },
+
+ onClose (id) {
+ dispatch(closeDropdownMenu(id));
+ },
+
+});
+
+export default connect(mapStateToProps, mapDispatchToProps)(DropdownMenu);
diff --git a/app/javascript/flavours/glitch/components/edited_timestamp/index.js b/app/javascript/flavours/glitch/components/edited_timestamp/index.js
new file mode 100644
index 000000000..9648133af
--- /dev/null
+++ b/app/javascript/flavours/glitch/components/edited_timestamp/index.js
@@ -0,0 +1,70 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import { FormattedMessage, injectIntl } from 'react-intl';
+import Icon from 'flavours/glitch/components/icon';
+import DropdownMenu from './containers/dropdown_menu_container';
+import { connect } from 'react-redux';
+import { openModal } from 'flavours/glitch/actions/modal';
+import RelativeTimestamp from 'flavours/glitch/components/relative_timestamp';
+import InlineAccount from 'flavours/glitch/components/inline_account';
+
+const mapDispatchToProps = (dispatch, { statusId }) => ({
+
+ onItemClick (index) {
+ dispatch(openModal('COMPARE_HISTORY', { index, statusId }));
+ },
+
+});
+
+export default @connect(null, mapDispatchToProps)
+@injectIntl
+class EditedTimestamp extends React.PureComponent {
+
+ static propTypes = {
+ statusId: PropTypes.string.isRequired,
+ timestamp: PropTypes.string.isRequired,
+ intl: PropTypes.object.isRequired,
+ onItemClick: PropTypes.func.isRequired,
+ };
+
+ handleItemClick = (item, i) => {
+ const { onItemClick } = this.props;
+ onItemClick(i);
+ };
+
+ renderHeader = items => {
+ return (
+
+ );
+ }
+
+ renderItem = (item, index, { onClick, onKeyPress }) => {
+ const formattedDate =
;
+ const formattedName =
;
+
+ const label = item.get('original') ? (
+
+ ) : (
+
+ );
+
+ return (
+
+ {label}
+
+ );
+ }
+
+ render () {
+ const { timestamp, intl, statusId } = this.props;
+
+ return (
+
+
+
+
+
+ );
+ }
+
+}
diff --git a/app/javascript/flavours/glitch/components/icon_button.js b/app/javascript/flavours/glitch/components/icon_button.js
index 58d3568dd..3999409cd 100644
--- a/app/javascript/flavours/glitch/components/icon_button.js
+++ b/app/javascript/flavours/glitch/components/icon_button.js
@@ -30,6 +30,7 @@ export default class IconButton extends React.PureComponent {
label: PropTypes.string,
counter: PropTypes.number,
obfuscateCount: PropTypes.bool,
+ href: PropTypes.string,
};
static defaultProps = {
@@ -109,6 +110,7 @@ export default class IconButton extends React.PureComponent {
title,
counter,
obfuscateCount,
+ href,
} = this.props;
const {
@@ -130,6 +132,21 @@ export default class IconButton extends React.PureComponent {
style.width = 'auto';
}
+ let contents = (
+
+ {typeof counter !== 'undefined' && }
+ {this.props.label}
+
+ );
+
+ if (href) {
+ contents = (
+
+ {contents}
+
+ );
+ }
+
return (
- {typeof counter !== 'undefined' && }
- {this.props.label}
+ {contents}
);
}
diff --git a/app/javascript/flavours/glitch/components/inline_account.js b/app/javascript/flavours/glitch/components/inline_account.js
new file mode 100644
index 000000000..2ef1f52cc
--- /dev/null
+++ b/app/javascript/flavours/glitch/components/inline_account.js
@@ -0,0 +1,34 @@
+import React from 'react';
+import ImmutablePropTypes from 'react-immutable-proptypes';
+import { connect } from 'react-redux';
+import { makeGetAccount } from 'flavours/glitch/selectors';
+import Avatar from 'flavours/glitch/components/avatar';
+
+const makeMapStateToProps = () => {
+ const getAccount = makeGetAccount();
+
+ const mapStateToProps = (state, { accountId }) => ({
+ account: getAccount(state, accountId),
+ });
+
+ return mapStateToProps;
+};
+
+export default @connect(makeMapStateToProps)
+class InlineAccount extends React.PureComponent {
+
+ static propTypes = {
+ account: ImmutablePropTypes.map.isRequired,
+ };
+
+ render () {
+ const { account } = this.props;
+
+ return (
+
+ {account.get('username')}
+
+ );
+ }
+
+}
diff --git a/app/javascript/flavours/glitch/components/loading_indicator.js b/app/javascript/flavours/glitch/components/loading_indicator.js
index d6a5adb6f..59f721c50 100644
--- a/app/javascript/flavours/glitch/components/loading_indicator.js
+++ b/app/javascript/flavours/glitch/components/loading_indicator.js
@@ -1,10 +1,31 @@
import React from 'react';
-import { FormattedMessage } from 'react-intl';
+import PropTypes from 'prop-types';
+
+export const CircularProgress = ({ size, strokeWidth }) => {
+ const viewBox = `0 0 ${size} ${size}`;
+ const radius = (size - strokeWidth) / 2;
+
+ return (
+
+
+
+ );
+};
+
+CircularProgress.propTypes = {
+ size: PropTypes.number.isRequired,
+ strokeWidth: PropTypes.number.isRequired,
+};
const LoadingIndicator = () => (
);
diff --git a/app/javascript/flavours/glitch/components/media_attachments.js b/app/javascript/flavours/glitch/components/media_attachments.js
new file mode 100644
index 000000000..c8d133f09
--- /dev/null
+++ b/app/javascript/flavours/glitch/components/media_attachments.js
@@ -0,0 +1,119 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import ImmutablePropTypes from 'react-immutable-proptypes';
+import ImmutablePureComponent from 'react-immutable-pure-component';
+import { MediaGallery, Video, Audio } from 'flavours/glitch/util/async-components';
+import Bundle from 'flavours/glitch/features/ui/components/bundle';
+import noop from 'lodash/noop';
+
+export default class MediaAttachments extends ImmutablePureComponent {
+
+ static propTypes = {
+ status: ImmutablePropTypes.map.isRequired,
+ height: PropTypes.number,
+ width: PropTypes.number,
+ revealed: PropTypes.bool,
+ };
+
+ static defaultProps = {
+ height: 110,
+ width: 239,
+ };
+
+ updateOnProps = [
+ 'status',
+ ];
+
+ renderLoadingMediaGallery = () => {
+ const { height, width } = this.props;
+
+ return (
+
+ );
+ }
+
+ renderLoadingVideoPlayer = () => {
+ const { height, width } = this.props;
+
+ return (
+
+ );
+ }
+
+ renderLoadingAudioPlayer = () => {
+ const { height, width } = this.props;
+
+ return (
+
+ );
+ }
+
+ render () {
+ const { status, width, height, revealed } = this.props;
+ const mediaAttachments = status.get('media_attachments');
+
+ if (mediaAttachments.size === 0) {
+ return null;
+ }
+
+ if (mediaAttachments.getIn([0, 'type']) === 'audio') {
+ const audio = mediaAttachments.get(0);
+
+ return (
+
+ {Component => (
+
+ )}
+
+ );
+ } else if (mediaAttachments.getIn([0, 'type']) === 'video') {
+ const video = mediaAttachments.get(0);
+
+ return (
+
+ {Component => (
+
+ )}
+
+ );
+ } else {
+ return (
+
+ {Component => (
+
+ )}
+
+ );
+ }
+ }
+
+}
diff --git a/app/javascript/flavours/glitch/components/modal_root.js b/app/javascript/flavours/glitch/components/modal_root.js
index 7b5a630e5..0595f6a0e 100644
--- a/app/javascript/flavours/glitch/components/modal_root.js
+++ b/app/javascript/flavours/glitch/components/modal_root.js
@@ -18,6 +18,7 @@ export default class ModalRoot extends React.PureComponent {
b: PropTypes.number,
}),
noEsc: PropTypes.bool,
+ ignoreFocus: PropTypes.bool,
};
activeElement = this.props.children ? document.activeElement : null;
@@ -72,7 +73,9 @@ export default class ModalRoot extends React.PureComponent {
// immediately selectable, we have to wait for observers to run, as
// described in https://github.com/WICG/inert#performance-and-gotchas
Promise.resolve().then(() => {
- this.activeElement.focus({ preventScroll: true });
+ if (!this.props.ignoreFocus) {
+ this.activeElement.focus({ preventScroll: true });
+ }
this.activeElement = null;
}).catch(console.error);
diff --git a/app/javascript/flavours/glitch/components/relative_timestamp.js b/app/javascript/flavours/glitch/components/relative_timestamp.js
index 711181dcd..512480339 100644
--- a/app/javascript/flavours/glitch/components/relative_timestamp.js
+++ b/app/javascript/flavours/glitch/components/relative_timestamp.js
@@ -5,10 +5,15 @@ import PropTypes from 'prop-types';
const messages = defineMessages({
today: { id: 'relative_time.today', defaultMessage: 'today' },
just_now: { id: 'relative_time.just_now', defaultMessage: 'now' },
+ just_now_full: { id: 'relative_time.full.just_now', defaultMessage: 'just now' },
seconds: { id: 'relative_time.seconds', defaultMessage: '{number}s' },
+ seconds_full: { id: 'relative_time.full.seconds', defaultMessage: '{number, plural, one {# second} other {# seconds}} ago' },
minutes: { id: 'relative_time.minutes', defaultMessage: '{number}m' },
+ minutes_full: { id: 'relative_time.full.minutes', defaultMessage: '{number, plural, one {# minute} other {# minutes}} ago' },
hours: { id: 'relative_time.hours', defaultMessage: '{number}h' },
+ hours_full: { id: 'relative_time.full.hours', defaultMessage: '{number, plural, one {# hour} other {# hours}} ago' },
days: { id: 'relative_time.days', defaultMessage: '{number}d' },
+ days_full: { id: 'relative_time.full.days', defaultMessage: '{number, plural, one {# day} other {# days}} ago' },
moments_remaining: { id: 'time_remaining.moments', defaultMessage: 'Moments remaining' },
seconds_remaining: { id: 'time_remaining.seconds', defaultMessage: '{number, plural, one {# second} other {# seconds}} left' },
minutes_remaining: { id: 'time_remaining.minutes', defaultMessage: '{number, plural, one {# minute} other {# minutes}} left' },
@@ -66,7 +71,7 @@ const getUnitDelay = units => {
}
};
-export const timeAgoString = (intl, date, now, year, timeGiven = true) => {
+export const timeAgoString = (intl, date, now, year, timeGiven, short) => {
const delta = now - date.getTime();
let relativeTime;
@@ -74,16 +79,16 @@ export const timeAgoString = (intl, date, now, year, timeGiven = true) => {
if (delta < DAY && !timeGiven) {
relativeTime = intl.formatMessage(messages.today);
} else if (delta < 10 * SECOND) {
- relativeTime = intl.formatMessage(messages.just_now);
+ relativeTime = intl.formatMessage(short ? messages.just_now : messages.just_now_full);
} else if (delta < 7 * DAY) {
if (delta < MINUTE) {
- relativeTime = intl.formatMessage(messages.seconds, { number: Math.floor(delta / SECOND) });
+ relativeTime = intl.formatMessage(short ? messages.seconds : messages.seconds_full, { number: Math.floor(delta / SECOND) });
} else if (delta < HOUR) {
- relativeTime = intl.formatMessage(messages.minutes, { number: Math.floor(delta / MINUTE) });
+ relativeTime = intl.formatMessage(short ? messages.minutes : messages.minutes_full, { number: Math.floor(delta / MINUTE) });
} else if (delta < DAY) {
- relativeTime = intl.formatMessage(messages.hours, { number: Math.floor(delta / HOUR) });
+ relativeTime = intl.formatMessage(short ? messages.hours : messages.hours_full, { number: Math.floor(delta / HOUR) });
} else {
- relativeTime = intl.formatMessage(messages.days, { number: Math.floor(delta / DAY) });
+ relativeTime = intl.formatMessage(short ? messages.days : messages.days_full, { number: Math.floor(delta / DAY) });
}
} else if (date.getFullYear() === year) {
relativeTime = intl.formatDate(date, shortDateFormatOptions);
@@ -124,6 +129,7 @@ class RelativeTimestamp extends React.Component {
timestamp: PropTypes.string.isRequired,
year: PropTypes.number.isRequired,
futureDate: PropTypes.bool,
+ short: PropTypes.bool,
};
state = {
@@ -132,6 +138,7 @@ class RelativeTimestamp extends React.Component {
static defaultProps = {
year: (new Date()).getFullYear(),
+ short: true,
};
shouldComponentUpdate (nextProps, nextState) {
@@ -176,11 +183,11 @@ class RelativeTimestamp extends React.Component {
}
render () {
- const { timestamp, intl, year, futureDate } = this.props;
+ const { timestamp, intl, year, futureDate, short } = this.props;
const timeGiven = timestamp.includes('T');
const date = new Date(timestamp);
- const relativeTime = futureDate ? timeRemainingString(intl, date, this.state.now, timeGiven) : timeAgoString(intl, date, this.state.now, year, timeGiven);
+ const relativeTime = futureDate ? timeRemainingString(intl, date, this.state.now, timeGiven) : timeAgoString(intl, date, this.state.now, year, timeGiven, short);
return (
diff --git a/app/javascript/flavours/glitch/components/scrollable_list.js b/app/javascript/flavours/glitch/components/scrollable_list.js
index 16f13afa4..50bfacc6a 100644
--- a/app/javascript/flavours/glitch/components/scrollable_list.js
+++ b/app/javascript/flavours/glitch/components/scrollable_list.js
@@ -144,7 +144,7 @@ class ScrollableList extends PureComponent {
this.attachIntersectionObserver();
attachFullscreenListener(this.onFullScreenChange);
- // Handle initial scroll posiiton
+ // Handle initial scroll position
this.handleScroll();
}
diff --git a/app/javascript/flavours/glitch/components/status_action_bar.js b/app/javascript/flavours/glitch/components/status_action_bar.js
index ae67c6116..68d93cd67 100644
--- a/app/javascript/flavours/glitch/components/status_action_bar.js
+++ b/app/javascript/flavours/glitch/components/status_action_bar.js
@@ -13,6 +13,7 @@ import classNames from 'classnames';
const messages = defineMessages({
delete: { id: 'status.delete', defaultMessage: 'Delete' },
redraft: { id: 'status.redraft', defaultMessage: 'Delete & re-draft' },
+ edit: { id: 'status.edit', defaultMessage: 'Edit' },
direct: { id: 'status.direct', defaultMessage: 'Direct message @{name}' },
mention: { id: 'status.mention', defaultMessage: 'Mention @{name}' },
mute: { id: 'account.mute', defaultMessage: 'Mute @{name}' },
@@ -126,6 +127,10 @@ class StatusActionBar extends ImmutablePureComponent {
this.props.onDelete(this.props.status, this.context.router.history, true);
}
+ handleEditClick = () => {
+ this.props.onEdit(this.props.status, this.context.router.history);
+ }
+
handlePinClick = () => {
this.props.onPin(this.props.status);
}
@@ -225,6 +230,7 @@ class StatusActionBar extends ImmutablePureComponent {
}
if (writtenByMe) {
+ // menu.push({ text: intl.formatMessage(messages.edit), action: this.handleEditClick });
menu.push({ text: intl.formatMessage(messages.delete), action: this.handleDeleteClick });
menu.push({ text: intl.formatMessage(messages.redraft), action: this.handleRedraftClick });
} else {
diff --git a/app/javascript/flavours/glitch/components/status_prepend.js b/app/javascript/flavours/glitch/components/status_prepend.js
index 5a00f232e..1661ca8f5 100644
--- a/app/javascript/flavours/glitch/components/status_prepend.js
+++ b/app/javascript/flavours/glitch/components/status_prepend.js
@@ -88,6 +88,14 @@ export default class StatusPrepend extends React.PureComponent {
/>
);
}
+ case 'update':
+ return (
+
+ );
}
return null;
}
@@ -115,6 +123,9 @@ export default class StatusPrepend extends React.PureComponent {
case 'status':
iconId = 'bell';
break;
+ case 'update':
+ iconId = 'pencil';
+ break;
};
return !type ? null : (
diff --git a/app/javascript/flavours/glitch/containers/dropdown_menu_container.js b/app/javascript/flavours/glitch/containers/dropdown_menu_container.js
index 1c0385b74..0c4a2b50f 100644
--- a/app/javascript/flavours/glitch/containers/dropdown_menu_container.js
+++ b/app/javascript/flavours/glitch/containers/dropdown_menu_container.js
@@ -14,15 +14,11 @@ const mapDispatchToProps = (dispatch, { status, items, scrollKey }) => ({
onOpen(id, onItemClick, dropdownPlacement, keyboard) {
dispatch(isUserTouching() ? openModal('ACTIONS', {
status,
- actions: items.map(
- (item, i) => item ? {
- ...item,
- name: `${item.text}-${i}`,
- onClick: item.action ? ((e) => { return onItemClick(i, e) }) : null,
- } : null
- ),
+ actions: items,
+ onClick: onItemClick,
}) : openDropdownMenu(id, dropdownPlacement, keyboard, scrollKey));
},
+
onClose(id) {
dispatch(closeModal('ACTIONS'));
dispatch(closeDropdownMenu(id));
diff --git a/app/javascript/flavours/glitch/containers/media_container.js b/app/javascript/flavours/glitch/containers/media_container.js
index 1ddbc706b..11c15d7c6 100644
--- a/app/javascript/flavours/glitch/containers/media_container.js
+++ b/app/javascript/flavours/glitch/containers/media_container.js
@@ -43,7 +43,7 @@ export default class MediaContainer extends PureComponent {
handleOpenVideo = (options) => {
const { components } = this.props;
- const { media } = JSON.parse(components[options.componetIndex].getAttribute('data-props'));
+ const { media } = JSON.parse(components[options.componentIndex].getAttribute('data-props'));
const mediaList = fromJS(media);
document.body.classList.add('with-modals--active');
@@ -87,7 +87,7 @@ export default class MediaContainer extends PureComponent {
...(hashtag ? { hashtag: fromJS(hashtag) } : {}),
...(componentName === 'Video' ? {
- componetIndex: i,
+ componentIndex: i,
onOpenVideo: this.handleOpenVideo,
} : {
onOpenMedia: this.handleOpenMedia,
diff --git a/app/javascript/flavours/glitch/containers/status_container.js b/app/javascript/flavours/glitch/containers/status_container.js
index bc3c43d85..358b89ab9 100644
--- a/app/javascript/flavours/glitch/containers/status_container.js
+++ b/app/javascript/flavours/glitch/containers/status_container.js
@@ -17,7 +17,7 @@ import {
pin,
unpin,
} from 'flavours/glitch/actions/interactions';
-import { muteStatus, unmuteStatus, deleteStatus } from 'flavours/glitch/actions/statuses';
+import { muteStatus, unmuteStatus, deleteStatus, editStatus } from 'flavours/glitch/actions/statuses';
import { initMuteModal } from 'flavours/glitch/actions/mutes';
import { initBlockModal } from 'flavours/glitch/actions/blocks';
import { initReport } from 'flavours/glitch/actions/reports';
@@ -169,6 +169,10 @@ const mapDispatchToProps = (dispatch, { intl, contextType }) => ({
}
},
+ onEdit (status, history) {
+ dispatch(editStatus(status.get('id'), history));
+ },
+
onDirect (account, router) {
dispatch(directCompose(account, router));
},
diff --git a/app/javascript/flavours/glitch/features/compose/components/compose_form.js b/app/javascript/flavours/glitch/features/compose/components/compose_form.js
index 5dfc119c1..b03bc34b8 100644
--- a/app/javascript/flavours/glitch/features/compose/components/compose_form.js
+++ b/app/javascript/flavours/glitch/features/compose/components/compose_form.js
@@ -47,6 +47,7 @@ class ComposeForm extends ImmutablePureComponent {
preselectDate: PropTypes.instanceOf(Date),
isSubmitting: PropTypes.bool,
isChangingUpload: PropTypes.bool,
+ isEditing: PropTypes.bool,
isUploading: PropTypes.bool,
onChange: PropTypes.func,
onSubmit: PropTypes.func,
@@ -245,9 +246,14 @@ class ComposeForm extends ImmutablePureComponent {
selectionStart = selectionEnd = text.length;
}
if (textarea) {
- textarea.setSelectionRange(selectionStart, selectionEnd);
- textarea.focus();
- if (!singleColumn) textarea.scrollIntoView();
+ // Because of the wicg-inert polyfill, the activeElement may not be
+ // immediately selectable, we have to wait for observers to run, as
+ // described in https://github.com/WICG/inert#performance-and-gotchas
+ Promise.resolve().then(() => {
+ textarea.setSelectionRange(selectionStart, selectionEnd);
+ textarea.focus();
+ if (!singleColumn) textarea.scrollIntoView();
+ }).catch(console.error);
}
// Refocuses the textarea after submitting.
@@ -293,6 +299,7 @@ class ComposeForm extends ImmutablePureComponent {
spoilerText,
suggestions,
spoilersAlwaysOn,
+ isEditing,
} = this.props;
const countText = this.getFulltextForCharacterCounting();
@@ -353,6 +360,7 @@ class ComposeForm extends ImmutablePureComponent {
onToggleSpoiler={spoilersAlwaysOn ? null : onChangeSpoilerness}
onUpload={onPaste}
privacy={privacy}
+ isEditing={isEditing}
sensitive={sensitive || (spoilersAlwaysOn && spoilerText && spoilerText.length > 0)}
spoiler={spoilersAlwaysOn ? (spoilerText && spoilerText.length > 0) : spoiler}
/>
@@ -364,6 +372,7 @@ class ComposeForm extends ImmutablePureComponent {
{
- const { onModalOpen, noModal } = this.props;
+ const { onModalOpen } = this.props;
const { open } = this.state;
- if (!noModal && isUserTouching()) {
+ if (isUserTouching()) {
if (this.state.open) {
this.props.onModalClose();
} else {
@@ -107,9 +110,25 @@ export default class ComposerOptionsDropdown extends React.PureComponent {
this.setState({ open: false });
}
+ handleItemClick = (e) => {
+ const {
+ items,
+ onChange,
+ onModalClose,
+ closeOnChange,
+ } = this.props;
+
+ const i = Number(e.currentTarget.getAttribute('data-index'));
+
+ const { name } = items[i];
+
+ e.preventDefault(); // Prevents focus from changing
+ if (closeOnChange) onModalClose();
+ onChange(name);
+ };
+
// Creates an action modal object.
handleMakeModal = () => {
- const component = this;
const {
items,
onChange,
@@ -125,6 +144,8 @@ export default class ComposerOptionsDropdown extends React.PureComponent {
// The object.
return {
+ renderItemContents: this.props.renderItemContents,
+ onClick: this.handleItemClick,
actions: items.map(
({
name,
@@ -133,48 +154,11 @@ export default class ComposerOptionsDropdown extends React.PureComponent {
...rest,
active: value && name === value,
name,
- onClick (e) {
- e.preventDefault(); // Prevents focus from changing
- onModalClose();
- onChange(name);
- },
- onPassiveClick (e) {
- e.preventDefault(); // Prevents focus from changing
- onChange(name);
- component.setState({ needsModalUpdate: true });
- },
})
),
};
}
- // If our modal is open and our props update, we need to also update
- // the modal.
- handleUpdate = () => {
- const { onModalOpen } = this.props;
- const { needsModalUpdate } = this.state;
-
- // Gets our modal object.
- const modal = this.handleMakeModal();
-
- // Reopens the modal with the new object.
- if (needsModalUpdate && modal && onModalOpen) {
- onModalOpen(modal);
- }
- }
-
- // Updates our modal as necessary.
- componentDidUpdate (prevProps) {
- const { items } = this.props;
- const { needsModalUpdate } = this.state;
- if (needsModalUpdate && items.find(
- (item, i) => item.on !== prevProps.items[i].on
- )) {
- this.handleUpdate();
- this.setState({ needsModalUpdate: false });
- }
- }
-
// Rendering.
render () {
const {
@@ -186,6 +170,8 @@ export default class ComposerOptionsDropdown extends React.PureComponent {
onChange,
value,
container,
+ renderItemContents,
+ closeOnChange,
} = this.props;
const { open, placement } = this.state;
const computedClass = classNames('composer--options--dropdown', {
@@ -226,10 +212,12 @@ export default class ComposerOptionsDropdown extends React.PureComponent {
>
diff --git a/app/javascript/flavours/glitch/features/compose/components/dropdown_menu.js b/app/javascript/flavours/glitch/features/compose/components/dropdown_menu.js
index bee06e64c..0649fe1ca 100644
--- a/app/javascript/flavours/glitch/features/compose/components/dropdown_menu.js
+++ b/app/javascript/flavours/glitch/features/compose/components/dropdown_menu.js
@@ -2,7 +2,6 @@
import PropTypes from 'prop-types';
import React from 'react';
import spring from 'react-motion/lib/spring';
-import Toggle from 'react-toggle';
import ImmutablePureComponent from 'react-immutable-pure-component';
import classNames from 'classnames';
@@ -28,18 +27,20 @@ export default class ComposerOptionsDropdownContent extends React.PureComponent
icon: PropTypes.string,
meta: PropTypes.node,
name: PropTypes.string.isRequired,
- on: PropTypes.bool,
text: PropTypes.node,
})),
onChange: PropTypes.func.isRequired,
onClose: PropTypes.func.isRequired,
style: PropTypes.object,
value: PropTypes.string,
+ renderItemContents: PropTypes.func,
openedViaKeyboard: PropTypes.bool,
+ closeOnChange: PropTypes.bool,
};
static defaultProps = {
style: {},
+ closeOnChange: true,
};
state = {
@@ -77,16 +78,19 @@ export default class ComposerOptionsDropdownContent extends React.PureComponent
document.removeEventListener('touchend', this.handleDocumentClick, withPassive);
}
- handleClick = (name, e) => {
+ handleClick = (e) => {
+ const i = Number(e.currentTarget.getAttribute('data-index'));
+
const {
onChange,
onClose,
+ closeOnChange,
items,
} = this.props;
- const { on } = this.props.items.find(item => item.name === name);
+ const { name } = this.props.items[i];
e.preventDefault(); // Prevents change in focus on click
- if ((on === null || typeof on === 'undefined')) {
+ if (closeOnChange) {
onClose();
}
onChange(name);
@@ -101,11 +105,9 @@ export default class ComposerOptionsDropdownContent extends React.PureComponent
}
}
- handleKeyDown = (name, e) => {
+ handleKeyDown = (e) => {
+ const index = Number(e.currentTarget.getAttribute('data-index'));
const { items } = this.props;
- const index = items.findIndex(item => {
- return (item.name === name);
- });
let element = null;
switch(e.key) {
@@ -139,7 +141,7 @@ export default class ComposerOptionsDropdownContent extends React.PureComponent
if (element) {
element.focus();
- this.handleChange(element.getAttribute('data-index'));
+ this.handleChange(this.props.items[Number(element.getAttribute('data-index'))].name);
e.preventDefault();
e.stopPropagation();
}
@@ -149,44 +151,40 @@ export default class ComposerOptionsDropdownContent extends React.PureComponent
this.focusedItem = c;
}
- renderItem = (item) => {
- const { name, icon, meta, on, text } = item;
+ renderItem = (item, i) => {
+ const { name, icon, meta, text } = item;
const active = (name === (this.props.value || this.state.value));
- const computedClass = classNames('composer--options--dropdown--content--item', {
- active,
- lengthy: meta,
- 'toggled-off': !on && on !== null && typeof on !== 'undefined',
- 'toggled-on': on,
- 'with-icon': icon,
- });
+ const computedClass = classNames('composer--options--dropdown--content--item', { active });
- let prefix = null;
+ let contents = this.props.renderItemContents && this.props.renderItemContents(item, i);
- if (on !== null && typeof on !== 'undefined') {
- prefix = ;
- } else if (icon) {
- prefix =
+ if (!contents) {
+ contents = (
+
+ {icon && }
+
+
+ {text}
+ {meta}
+
+
+ );
}
return (
- {prefix}
-
-
- {text}
- {meta}
-
+ {contents}
);
}
@@ -229,7 +227,7 @@ export default class ComposerOptionsDropdownContent extends React.PureComponent
transform: mounted ? `scale(${scaleX}, ${scaleY})` : null,
}}
>
- {!!items && items.map(item => this.renderItem(item))}
+ {!!items && items.map((item, i) => this.renderItem(item, i))}
)}
diff --git a/app/javascript/flavours/glitch/features/compose/components/header.js b/app/javascript/flavours/glitch/features/compose/components/header.js
index c6e4cc36b..95add2027 100644
--- a/app/javascript/flavours/glitch/features/compose/components/header.js
+++ b/app/javascript/flavours/glitch/features/compose/components/header.js
@@ -119,7 +119,7 @@ class Header extends ImmutablePureComponent {
({ checked: state.getIn(['compose', 'advanced_options', name]) }))
+class ToggleOption extends ImmutablePureComponent {
+
+ static propTypes = {
+ name: PropTypes.string.isRequired,
+ checked: PropTypes.bool,
+ onChangeAdvancedOption: PropTypes.func.isRequired,
+ };
+
+ handleChange = () => {
+ this.props.onChangeAdvancedOption(this.props.name);
+ };
+
+ render() {
+ const { meta, text, checked } = this.props;
+
+ return (
+
+
+
+
+ {text}
+ {meta}
+
+
+ );
+ }
+
+}
+
export default @injectIntl
class ComposerOptions extends ImmutablePureComponent {
@@ -106,6 +138,7 @@ class ComposerOptions extends ImmutablePureComponent {
resetFileKey: PropTypes.number,
spoiler: PropTypes.bool,
showContentTypeChoice: PropTypes.bool,
+ isEditing: PropTypes.bool,
};
// Handles file selection.
@@ -141,6 +174,13 @@ class ComposerOptions extends ImmutablePureComponent {
this.fileElement = fileElement;
}
+ renderToggleItemContents = (item) => {
+ const { onChangeAdvancedOption } = this.props;
+ const { name, meta, text } = item;
+
+ return ;
+ };
+
// Rendering.
render () {
const {
@@ -152,7 +192,6 @@ class ComposerOptions extends ImmutablePureComponent {
hasMedia,
allowPoll,
hasPoll,
- intl,
onChangeAdvancedOption,
onChangeContentType,
onChangeVisibility,
@@ -164,23 +203,25 @@ class ComposerOptions extends ImmutablePureComponent {
resetFileKey,
spoiler,
showContentTypeChoice,
+ isEditing,
+ intl: { formatMessage },
} = this.props;
const contentTypeItems = {
plain: {
icon: 'file-text',
name: 'text/plain',
- text: ,
+ text: formatMessage(messages.plain),
},
html: {
icon: 'code',
name: 'text/html',
- text: ,
+ text: formatMessage(messages.html),
},
markdown: {
icon: 'arrow-circle-down',
name: 'text/markdown',
- text: ,
+ text: formatMessage(messages.markdown),
},
};
@@ -204,18 +245,18 @@ class ComposerOptions extends ImmutablePureComponent {
{
icon: 'cloud-upload',
name: 'upload',
- text: ,
+ text: formatMessage(messages.upload),
},
{
icon: 'paint-brush',
name: 'doodle',
- text: ,
+ text: formatMessage(messages.doodle),
},
]}
onChange={this.handleClickAttach}
onModalClose={onModalClose}
onModalOpen={onModalOpen}
- title={intl.formatMessage(messages.attach)}
+ title={formatMessage(messages.attach)}
/>
{!!pollLimits && (
)}
)}
@@ -262,31 +303,31 @@ class ComposerOptions extends ImmutablePureComponent {
ariaControls='glitch.composer.spoiler.input'
label='CW'
onClick={onToggleSpoiler}
- title={intl.formatMessage(messages.spoiler)}
+ title={formatMessage(messages.spoiler)}
/>
)}
!!value)}
- disabled={disabled}
+ disabled={disabled || isEditing}
icon='ellipsis-h'
items={advancedOptions ? [
{
- meta: ,
+ meta: formatMessage(messages.local_only_long),
name: 'do_not_federate',
- on: advancedOptions.get('do_not_federate'),
- text: ,
+ text: formatMessage(messages.local_only_short),
},
{
- meta: ,
+ meta: formatMessage(messages.threaded_mode_long),
name: 'threaded_mode',
- on: advancedOptions.get('threaded_mode'),
- text: ,
+ text: formatMessage(messages.threaded_mode_short),
},
] : null}
onChange={onChangeAdvancedOption}
+ renderItemContents={this.renderToggleItemContents}
onModalClose={onModalClose}
onModalOpen={onModalOpen}
- title={intl.formatMessage(messages.advanced_options_icon_title)}
+ title={formatMessage(messages.advanced_options_icon_title)}
+ closeOnChange={false}
/>
);
diff --git a/app/javascript/flavours/glitch/features/compose/components/privacy_dropdown.js b/app/javascript/flavours/glitch/features/compose/components/privacy_dropdown.js
index 39f7c7bd1..c8e783d22 100644
--- a/app/javascript/flavours/glitch/features/compose/components/privacy_dropdown.js
+++ b/app/javascript/flavours/glitch/features/compose/components/privacy_dropdown.js
@@ -1,46 +1,19 @@
import PropTypes from 'prop-types';
import React from 'react';
import ImmutablePropTypes from 'react-immutable-proptypes';
-import { FormattedMessage, defineMessages, injectIntl } from 'react-intl';
+import { defineMessages, injectIntl } from 'react-intl';
import Dropdown from './dropdown';
const messages = defineMessages({
- change_privacy: {
- defaultMessage: 'Adjust status privacy',
- id: 'privacy.change',
- },
- direct_long: {
- defaultMessage: 'Visible for mentioned users only',
- id: 'privacy.direct.long',
- },
- direct_short: {
- defaultMessage: 'Direct',
- id: 'privacy.direct.short',
- },
- private_long: {
- defaultMessage: 'Visible for followers only',
- id: 'privacy.private.long',
- },
- private_short: {
- defaultMessage: 'Followers-only',
- id: 'privacy.private.short',
- },
- public_long: {
- defaultMessage: 'Visible for all, shown in public timelines',
- id: 'privacy.public.long',
- },
- public_short: {
- defaultMessage: 'Public',
- id: 'privacy.public.short',
- },
- unlisted_long: {
- defaultMessage: 'Visible for all, but not in public timelines',
- id: 'privacy.unlisted.long',
- },
- unlisted_short: {
- defaultMessage: 'Unlisted',
- id: 'privacy.unlisted.short',
- },
+ public_short: { id: 'privacy.public.short', defaultMessage: 'Public' },
+ public_long: { id: 'privacy.public.long', defaultMessage: 'Visible for all, shown in public timelines' },
+ unlisted_short: { id: 'privacy.unlisted.short', defaultMessage: 'Unlisted' },
+ unlisted_long: { id: 'privacy.unlisted.long', defaultMessage: 'Visible for all, but not in public timelines' },
+ private_short: { id: 'privacy.private.short', defaultMessage: 'Followers-only' },
+ private_long: { id: 'privacy.private.long', defaultMessage: 'Visible for followers only' },
+ direct_short: { id: 'privacy.direct.short', defaultMessage: 'Direct' },
+ direct_long: { id: 'privacy.direct.long', defaultMessage: 'Visible for mentioned users only' },
+ change_privacy: { id: 'privacy.change', defaultMessage: 'Adjust status privacy' },
});
export default @injectIntl
@@ -53,40 +26,40 @@ class PrivacyDropdown extends React.PureComponent {
value: PropTypes.string.isRequired,
onChange: PropTypes.func.isRequired,
noDirect: PropTypes.bool,
- noModal: PropTypes.bool,
container: PropTypes.func,
+ disabled: PropTypes.bool,
intl: PropTypes.object.isRequired,
};
render () {
- const { value, onChange, onModalOpen, onModalClose, disabled, noDirect, noModal, container, intl } = this.props;
+ const { value, onChange, onModalOpen, onModalClose, disabled, noDirect, container, intl: { formatMessage } } = this.props;
// We predefine our privacy items so that we can easily pick the
// dropdown icon later.
const privacyItems = {
direct: {
icon: 'envelope',
- meta: ,
+ meta: formatMessage(messages.direct_long),
name: 'direct',
- text: ,
+ text: formatMessage(messages.direct_short),
},
private: {
icon: 'lock',
- meta: ,
+ meta: formatMessage(messages.private_long),
name: 'private',
- text: ,
+ text: formatMessage(messages.private_short),
},
public: {
icon: 'globe',
- meta: ,
+ meta: formatMessage(messages.public_long),
name: 'public',
- text: ,
+ text: formatMessage(messages.public_short),
},
unlisted: {
icon: 'unlock',
- meta: ,
+ meta: formatMessage(messages.unlisted_long),
name: 'unlisted',
- text: ,
+ text: formatMessage(messages.unlisted_short),
},
};
@@ -104,9 +77,8 @@ class PrivacyDropdown extends React.PureComponent {
onChange={onChange}
onModalClose={onModalClose}
onModalOpen={onModalOpen}
- title={intl.formatMessage(messages.change_privacy)}
+ title={formatMessage(messages.change_privacy)}
container={container}
- noModal={noModal}
value={value}
/>
);
diff --git a/app/javascript/flavours/glitch/features/compose/components/publisher.js b/app/javascript/flavours/glitch/features/compose/components/publisher.js
index 1531dcaa9..9a8c0f510 100644
--- a/app/javascript/flavours/glitch/features/compose/components/publisher.js
+++ b/app/javascript/flavours/glitch/features/compose/components/publisher.js
@@ -2,7 +2,7 @@
import classNames from 'classnames';
import PropTypes from 'prop-types';
import React from 'react';
-import { defineMessages, FormattedMessage, injectIntl } from 'react-intl';
+import { defineMessages, injectIntl } from 'react-intl';
import { length } from 'stringz';
import ImmutablePureComponent from 'react-immutable-pure-component';
@@ -23,6 +23,7 @@ const messages = defineMessages({
defaultMessage: '{publish}!',
id: 'compose_form.publish_loud',
},
+ saveChanges: { id: 'compose_form.save_changes', defaultMessage: 'Save changes' },
});
export default @injectIntl
@@ -36,6 +37,7 @@ class Publisher extends ImmutablePureComponent {
onSubmit: PropTypes.func,
privacy: PropTypes.oneOf(['direct', 'private', 'unlisted', 'public']),
sideArm: PropTypes.oneOf(['none', 'direct', 'private', 'unlisted', 'public']),
+ isEditing: PropTypes.bool,
};
handleSubmit = () => {
@@ -43,7 +45,7 @@ class Publisher extends ImmutablePureComponent {
};
render () {
- const { countText, disabled, intl, onSecondarySubmit, privacy, sideArm } = this.props;
+ const { countText, disabled, intl, onSecondarySubmit, privacy, sideArm, isEditing } = this.props;
const diff = maxChars - length(countText || '');
const computedClass = classNames('composer--publisher', {
@@ -51,63 +53,37 @@ class Publisher extends ImmutablePureComponent {
over: diff < 0,
});
+ const privacyIcons = { direct: 'envelope', private: 'lock', public: 'globe', unlisted: 'unlock' };
+
+ let publishText;
+ if (isEditing) {
+ publishText = intl.formatMessage(messages.saveChanges);
+ } else if (privacy === 'private' || privacy === 'direct') {
+ const iconId = privacyIcons[privacy];
+ publishText = (
+
+ {intl.formatMessage(messages.publish)}
+
+ );
+ } else {
+ publishText = privacy !== 'unlisted' ? intl.formatMessage(messages.publishLoud, { publish: intl.formatMessage(messages.publish) }) : intl.formatMessage(messages.publish);
+ }
+
return (
- {sideArm && sideArm !== 'none' ? (
+ {sideArm && !isEditing && sideArm !== 'none' ? (
-
-
- }
+ text={ }
title={`${intl.formatMessage(messages.publish)}: ${intl.formatMessage({ id: `privacy.${sideArm}.short` })}`}
/>
) : null}
-
- {' '}
-
-
- );
- case privacy === 'public':
- return (
-
- }}
- />
-
- );
- default:
- return ;
- }
- }()}
+ text={publishText}
title={`${intl.formatMessage(messages.publish)}: ${intl.formatMessage({ id: `privacy.${privacy}.short` })}`}
onClick={this.handleSubmit}
disabled={disabled}
diff --git a/app/javascript/flavours/glitch/features/compose/components/upload.js b/app/javascript/flavours/glitch/features/compose/components/upload.js
index 425b0fe5e..963b95c87 100644
--- a/app/javascript/flavours/glitch/features/compose/components/upload.js
+++ b/app/javascript/flavours/glitch/features/compose/components/upload.js
@@ -5,7 +5,6 @@ import Motion from 'flavours/glitch/util/optional_motion';
import spring from 'react-motion/lib/spring';
import ImmutablePureComponent from 'react-immutable-pure-component';
import { FormattedMessage } from 'react-intl';
-import classNames from 'classnames';
import Icon from 'flavours/glitch/components/icon';
import { isUserTouching } from 'flavours/glitch/util/is_mobile';
@@ -19,6 +18,7 @@ export default class Upload extends ImmutablePureComponent {
media: ImmutablePropTypes.map.isRequired,
onUndo: PropTypes.func.isRequired,
onOpenFocalPoint: PropTypes.func.isRequired,
+ isEditingStatus: PropTypes.func.isRequired,
};
handleUndoClick = e => {
@@ -32,7 +32,7 @@ export default class Upload extends ImmutablePureComponent {
}
render () {
- const { intl, media } = this.props;
+ const { intl, media, isEditingStatus } = this.props;
const focusX = media.getIn(['meta', 'focus', 'x']);
const focusY = media.getIn(['meta', 'focus', 'y']);
const x = ((focusX / 2) + .5) * 100;
@@ -43,10 +43,16 @@ export default class Upload extends ImmutablePureComponent {
{({ scale }) => (
-
+
-
+ {!isEditingStatus && ( )}
+
+ {(media.get('description') || '').length === 0 && (
+
+
+
+ )}
)}
diff --git a/app/javascript/flavours/glitch/features/compose/containers/compose_form_container.js b/app/javascript/flavours/glitch/features/compose/containers/compose_form_container.js
index 8eff8a36b..a037bbbcc 100644
--- a/app/javascript/flavours/glitch/features/compose/containers/compose_form_container.js
+++ b/app/javascript/flavours/glitch/features/compose/containers/compose_form_container.js
@@ -51,6 +51,7 @@ function mapStateToProps (state) {
focusDate: state.getIn(['compose', 'focusDate']),
caretPosition: state.getIn(['compose', 'caretPosition']),
isSubmitting: state.getIn(['compose', 'is_submitting']),
+ isEditing: state.getIn(['compose', 'id']) !== null,
isChangingUpload: state.getIn(['compose', 'is_changing_upload']),
isUploading: state.getIn(['compose', 'is_uploading']),
layout: state.getIn(['local_settings', 'layout']),
diff --git a/app/javascript/flavours/glitch/features/compose/containers/reply_indicator_container.js b/app/javascript/flavours/glitch/features/compose/containers/reply_indicator_container.js
index 395a9aa5b..dd6899be4 100644
--- a/app/javascript/flavours/glitch/features/compose/containers/reply_indicator_container.js
+++ b/app/javascript/flavours/glitch/features/compose/containers/reply_indicator_container.js
@@ -1,14 +1,24 @@
import { connect } from 'react-redux';
import { cancelReplyCompose } from 'flavours/glitch/actions/compose';
-import { makeGetStatus } from 'flavours/glitch/selectors';
import ReplyIndicator from '../components/reply_indicator';
-function makeMapStateToProps (state) {
- const inReplyTo = state.getIn(['compose', 'in_reply_to']);
+const makeMapStateToProps = () => {
+ const mapStateToProps = state => {
+ let statusId = state.getIn(['compose', 'id'], null);
+ let editing = true;
- return {
- status: inReplyTo ? state.getIn(['statuses', inReplyTo]) : null,
+ if (statusId === null) {
+ statusId = state.getIn(['compose', 'in_reply_to']);
+ editing = false;
+ }
+
+ return {
+ status: state.getIn(['statuses', statusId]),
+ editing,
+ };
};
+
+ return mapStateToProps;
};
const mapDispatchToProps = dispatch => ({
diff --git a/app/javascript/flavours/glitch/features/compose/containers/upload_container.js b/app/javascript/flavours/glitch/features/compose/containers/upload_container.js
index f3ca4ce7b..d6256fe96 100644
--- a/app/javascript/flavours/glitch/features/compose/containers/upload_container.js
+++ b/app/javascript/flavours/glitch/features/compose/containers/upload_container.js
@@ -5,6 +5,7 @@ import { submitCompose } from 'flavours/glitch/actions/compose';
const mapStateToProps = (state, { id }) => ({
media: state.getIn(['compose', 'media_attachments']).find(item => item.get('id') === id),
+ isEditingStatus: state.getIn(['compose', 'id']) !== null,
});
const mapDispatchToProps = dispatch => ({
diff --git a/app/javascript/flavours/glitch/features/directory/components/account_card.js b/app/javascript/flavours/glitch/features/directory/components/account_card.js
index 2a3fd1ecf..c9ef5850c 100644
--- a/app/javascript/flavours/glitch/features/directory/components/account_card.js
+++ b/app/javascript/flavours/glitch/features/directory/components/account_card.js
@@ -7,31 +7,28 @@ import { makeGetAccount } from 'flavours/glitch/selectors';
import Avatar from 'flavours/glitch/components/avatar';
import DisplayName from 'flavours/glitch/components/display_name';
import Permalink from 'flavours/glitch/components/permalink';
-import RelativeTimestamp from 'flavours/glitch/components/relative_timestamp';
-import IconButton from 'flavours/glitch/components/icon_button';
+import Button from 'flavours/glitch/components/button';
import { FormattedMessage, injectIntl, defineMessages } from 'react-intl';
import { autoPlayGif, me, unfollowModal } from 'flavours/glitch/util/initial_state';
import ShortNumber from 'flavours/glitch/components/short_number';
import {
followAccount,
unfollowAccount,
- blockAccount,
unblockAccount,
unmuteAccount,
} from 'flavours/glitch/actions/accounts';
import { openModal } from 'flavours/glitch/actions/modal';
-import { initMuteModal } from 'flavours/glitch/actions/mutes';
+import classNames from 'classnames';
const messages = defineMessages({
- follow: { id: 'account.follow', defaultMessage: 'Follow' },
unfollow: { id: 'account.unfollow', defaultMessage: 'Unfollow' },
- requested: { id: 'account.requested', defaultMessage: 'Awaiting approval' },
- unblock: { id: 'account.unblock', defaultMessage: 'Unblock @{name}' },
- unmute: { id: 'account.unmute', defaultMessage: 'Unmute @{name}' },
- unfollowConfirm: {
- id: 'confirmations.unfollow.confirm',
- defaultMessage: 'Unfollow',
- },
+ follow: { id: 'account.follow', defaultMessage: 'Follow' },
+ cancel_follow_request: { id: 'account.cancel_follow_request', defaultMessage: 'Cancel follow request' },
+ requested: { id: 'account.requested', defaultMessage: 'Awaiting approval. Click to cancel follow request' },
+ unblock: { id: 'account.unblock_short', defaultMessage: 'Unblock' },
+ unmute: { id: 'account.unmute_short', defaultMessage: 'Unmute' },
+ unfollowConfirm: { id: 'confirmations.unfollow.confirm', defaultMessage: 'Unfollow' },
+ edit_profile: { id: 'account.edit_profile', defaultMessage: 'Edit profile' },
});
const makeMapStateToProps = () => {
@@ -75,18 +72,15 @@ const mapDispatchToProps = (dispatch, { intl }) => ({
onBlock(account) {
if (account.getIn(['relationship', 'blocking'])) {
dispatch(unblockAccount(account.get('id')));
- } else {
- dispatch(blockAccount(account.get('id')));
}
},
onMute(account) {
if (account.getIn(['relationship', 'muting'])) {
dispatch(unmuteAccount(account.get('id')));
- } else {
- dispatch(initMuteModal(account));
}
},
+
});
export default
@@ -138,130 +132,92 @@ class AccountCard extends ImmutablePureComponent {
handleMute = () => {
this.props.onMute(this.props.account);
- };
+ }
+
+ handleEditProfile = () => {
+ window.open('/settings/profile', '_blank');
+ }
render() {
const { account, intl } = this.props;
- let buttons;
+ let actionBtn;
- if (
- account.get('id') !== me &&
- account.get('relationship', null) !== null
- ) {
- const following = account.getIn(['relationship', 'following']);
- const requested = account.getIn(['relationship', 'requested']);
- const blocking = account.getIn(['relationship', 'blocking']);
- const muting = account.getIn(['relationship', 'muting']);
-
- if (requested) {
- buttons = (
-
- );
- } else if (blocking) {
- buttons = (
-
- );
- } else if (muting) {
- buttons = (
-
- );
- } else if (!account.get('moved') || following) {
- buttons = (
-
- );
+ if (me !== account.get('id')) {
+ if (!account.get('relationship')) { // Wait until the relationship is loaded
+ actionBtn = '';
+ } else if (account.getIn(['relationship', 'requested'])) {
+ actionBtn =
;
+ } else if (account.getIn(['relationship', 'muting'])) {
+ actionBtn =
;
+ } else if (!account.getIn(['relationship', 'blocking'])) {
+ actionBtn =
;
+ } else if (account.getIn(['relationship', 'blocking'])) {
+ actionBtn =
;
}
+ } else {
+ actionBtn =
;
}
return (
-
-
-
-
-
-
-
-
-
-
-
-
- {buttons}
+
+
+
+
-
-
+
+
+
+ {account.get('note').length > 0 && (
-
+ )}
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+ {account.get('followers_count') < 0 ? '-' : }{' '}
+
+
+
+
+
+
+ {' '}
+
+
+
+
-
- {account.get('followers_count') < 0 ? '-' : }{' '}
-
-
-
-
-
- {account.get('last_status_at') === null ? (
-
- ) : (
-
- )}{' '}
-
-
-
+
+
+ {actionBtn}
diff --git a/app/javascript/flavours/glitch/features/directory/index.js b/app/javascript/flavours/glitch/features/directory/index.js
index cde5926e0..87d9b3625 100644
--- a/app/javascript/flavours/glitch/features/directory/index.js
+++ b/app/javascript/flavours/glitch/features/directory/index.js
@@ -10,9 +10,9 @@ import { fetchDirectory, expandDirectory } from 'flavours/glitch/actions/directo
import { List as ImmutableList } from 'immutable';
import AccountCard from './components/account_card';
import RadioButton from 'flavours/glitch/components/radio_button';
-import classNames from 'classnames';
import LoadMore from 'flavours/glitch/components/load_more';
import ScrollContainer from 'flavours/glitch/containers/scroll_container';
+import LoadingIndicator from 'flavours/glitch/components/loading_indicator';
const messages = defineMessages({
title: { id: 'column.directory', defaultMessage: 'Browse profiles' },
@@ -129,7 +129,7 @@ class Directory extends React.PureComponent {
const pinned = !!columnId;
const scrollableArea = (
-
+
@@ -142,8 +142,10 @@ class Directory extends React.PureComponent {
-
- {accountIds.map(accountId =>
)}
+
+ {isLoading ?
: accountIds.map(accountId => (
+
+ ))}
diff --git a/app/javascript/flavours/glitch/features/emoji_picker/index.js b/app/javascript/flavours/glitch/features/emoji_picker/index.js
index 78f691c98..5de9fe107 100644
--- a/app/javascript/flavours/glitch/features/emoji_picker/index.js
+++ b/app/javascript/flavours/glitch/features/emoji_picker/index.js
@@ -250,7 +250,7 @@ class EmojiPickerMenu extends React.PureComponent {
state = {
modifierOpen: false,
- placement: null,
+ readyToFocus: false,
};
handleDocumentClick = e => {
@@ -262,6 +262,16 @@ class EmojiPickerMenu extends React.PureComponent {
componentDidMount () {
document.addEventListener('click', this.handleDocumentClick, false);
document.addEventListener('touchend', this.handleDocumentClick, listenerOptions);
+
+ // Because of https://github.com/react-bootstrap/react-bootstrap/issues/2614 we need
+ // to wait for a frame before focusing
+ requestAnimationFrame(() => {
+ this.setState({ readyToFocus: true });
+ if (this.node) {
+ const element = this.node.querySelector('input[type="search"]');
+ if (element) element.focus();
+ }
+ });
}
componentWillUnmount () {
@@ -361,7 +371,7 @@ class EmojiPickerMenu extends React.PureComponent {
showSkinTones={false}
backgroundImageFn={backgroundImageFn}
notFound={notFoundFn}
- autoFocus
+ autoFocus={this.state.readyToFocus}
emojiTooltip
native={useSystemEmojiFont}
/>
@@ -396,6 +406,7 @@ class EmojiPickerDropdown extends React.PureComponent {
state = {
active: false,
loading: false,
+ placement: null,
};
setRef = (c) => {
diff --git a/app/javascript/flavours/glitch/features/hashtag_timeline/components/column_settings.js b/app/javascript/flavours/glitch/features/hashtag_timeline/components/column_settings.js
index 142118cef..ede8907e5 100644
--- a/app/javascript/flavours/glitch/features/hashtag_timeline/components/column_settings.js
+++ b/app/javascript/flavours/glitch/features/hashtag_timeline/components/column_settings.js
@@ -40,7 +40,17 @@ class ColumnSettings extends React.PureComponent {
}
};
- onSelect = mode => value => this.props.onChange(['tags', mode], value);
+ onSelect = mode => value => {
+ const oldValue = this.tags(mode);
+
+ // Prevent changes that add more than 4 tags, but allow removing
+ // tags that were already added before
+ if ((value.length > 4) && !(value < oldValue)) {
+ return;
+ }
+
+ this.props.onChange(['tags', mode], value);
+ };
onToggle = () => {
if (this.state.open && this.hasTags()) {
diff --git a/app/javascript/flavours/glitch/features/notifications/components/admin_signup.js b/app/javascript/flavours/glitch/features/notifications/components/admin_signup.js
new file mode 100644
index 000000000..355ebef94
--- /dev/null
+++ b/app/javascript/flavours/glitch/features/notifications/components/admin_signup.js
@@ -0,0 +1,101 @@
+// Package imports.
+import React from 'react';
+import ImmutablePropTypes from 'react-immutable-proptypes';
+import PropTypes from 'prop-types';
+import { FormattedMessage } from 'react-intl';
+import ImmutablePureComponent from 'react-immutable-pure-component';
+import { HotKeys } from 'react-hotkeys';
+import classNames from 'classnames';
+
+// Our imports.
+import Permalink from 'flavours/glitch/components/permalink';
+import AccountContainer from 'flavours/glitch/containers/account_container';
+import NotificationOverlayContainer from '../containers/overlay_container';
+import Icon from 'flavours/glitch/components/icon';
+
+export default class NotificationFollow extends ImmutablePureComponent {
+
+ static propTypes = {
+ hidden: PropTypes.bool,
+ id: PropTypes.string.isRequired,
+ account: ImmutablePropTypes.map.isRequired,
+ notification: ImmutablePropTypes.map.isRequired,
+ unread: PropTypes.bool,
+ };
+
+ handleMoveUp = () => {
+ const { notification, onMoveUp } = this.props;
+ onMoveUp(notification.get('id'));
+ }
+
+ handleMoveDown = () => {
+ const { notification, onMoveDown } = this.props;
+ onMoveDown(notification.get('id'));
+ }
+
+ handleOpen = () => {
+ this.handleOpenProfile();
+ }
+
+ handleOpenProfile = () => {
+ const { notification } = this.props;
+ this.context.router.history.push(`/@${notification.getIn(['account', 'acct'])}`);
+ }
+
+ handleMention = e => {
+ e.preventDefault();
+
+ const { notification, onMention } = this.props;
+ onMention(notification.get('account'), this.context.router.history);
+ }
+
+ getHandlers () {
+ return {
+ moveUp: this.handleMoveUp,
+ moveDown: this.handleMoveDown,
+ open: this.handleOpen,
+ openProfile: this.handleOpenProfile,
+ mention: this.handleMention,
+ reply: this.handleMention,
+ };
+ }
+
+ render () {
+ const { account, notification, hidden, unread } = this.props;
+
+ // Links to the display name.
+ const displayName = account.get('display_name_html') || account.get('username');
+ const link = (
+
+ );
+
+ // Renders.
+ return (
+
+
+
+ );
+ }
+
+}
diff --git a/app/javascript/flavours/glitch/features/notifications/components/column_settings.js b/app/javascript/flavours/glitch/features/notifications/components/column_settings.js
index 95250c6ed..0dad079ad 100644
--- a/app/javascript/flavours/glitch/features/notifications/components/column_settings.js
+++ b/app/javascript/flavours/glitch/features/notifications/components/column_settings.js
@@ -6,6 +6,7 @@ import ClearColumnButton from './clear_column_button';
import GrantPermissionButton from './grant_permission_button';
import SettingToggle from './setting_toggle';
import PillBarButton from './pill_bar_button';
+import { isStaff } from 'flavours/glitch/util/initial_state';
export default class ColumnSettings extends React.PureComponent {
@@ -154,6 +155,30 @@ export default class ColumnSettings extends React.PureComponent {
+
+
+
+
+
+
+ {showPushSettings &&
}
+
+
+
+
+
+ {isStaff && (
+
+
+
+
+
+ {showPushSettings &&
}
+
+
+
+
+ )}
);
}
diff --git a/app/javascript/flavours/glitch/features/notifications/components/notification.js b/app/javascript/flavours/glitch/features/notifications/components/notification.js
index e1d9fbd0a..e0cd3c7a6 100644
--- a/app/javascript/flavours/glitch/features/notifications/components/notification.js
+++ b/app/javascript/flavours/glitch/features/notifications/components/notification.js
@@ -8,6 +8,7 @@ import ImmutablePureComponent from 'react-immutable-pure-component';
import StatusContainer from 'flavours/glitch/containers/status_container';
import NotificationFollow from './follow';
import NotificationFollowRequestContainer from '../containers/follow_request_container';
+import NotificationAdminSignup from './admin_signup';
export default class Notification extends ImmutablePureComponent {
@@ -63,6 +64,19 @@ export default class Notification extends ImmutablePureComponent {
unread={this.props.unread}
/>
);
+ case 'admin.sign_up':
+ return (
+
+ );
case 'mention':
return (
);
+ case 'update':
+ return (
+
+ );
default:
return null;
}
diff --git a/app/javascript/flavours/glitch/features/picture_in_picture/components/footer.js b/app/javascript/flavours/glitch/features/picture_in_picture/components/footer.js
index e01d277a1..0408105ae 100644
--- a/app/javascript/flavours/glitch/features/picture_in_picture/components/footer.js
+++ b/app/javascript/flavours/glitch/features/picture_in_picture/components/footer.js
@@ -62,7 +62,7 @@ class Footer extends ImmutablePureComponent {
const { router } = this.context;
if (onClose) {
- onClose();
+ onClose(true);
}
dispatch(replyCompose(status, router.history));
@@ -181,7 +181,7 @@ class Footer extends ImmutablePureComponent {
{replyButton}
- {withOpenButton &&
}
+ {withOpenButton &&
}
);
}
diff --git a/app/javascript/flavours/glitch/features/report/category.js b/app/javascript/flavours/glitch/features/report/category.js
new file mode 100644
index 000000000..cf63533d0
--- /dev/null
+++ b/app/javascript/flavours/glitch/features/report/category.js
@@ -0,0 +1,93 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import { defineMessages, injectIntl, FormattedMessage } from 'react-intl';
+import Button from 'flavours/glitch/components/button';
+import Option from './components/option';
+
+const messages = defineMessages({
+ dislike: { id: 'report.reasons.dislike', defaultMessage: 'I don\'t like it' },
+ dislike_description: { id: 'report.reasons.dislike_description', defaultMessage: 'It is not something you want to see' },
+ spam: { id: 'report.reasons.spam', defaultMessage: 'It\'s spam' },
+ spam_description: { id: 'report.reasons.spam_description', defaultMessage: 'Malicious links, fake engagement, or repetitive replies' },
+ violation: { id: 'report.reasons.violation', defaultMessage: 'It violates server rules' },
+ violation_description: { id: 'report.reasons.violation_description', defaultMessage: 'You are aware that it breaks specific rules' },
+ other: { id: 'report.reasons.other', defaultMessage: 'It\'s something else' },
+ other_description: { id: 'report.reasons.other_description', defaultMessage: 'The issue does not fit into other categories' },
+ status: { id: 'report.category.title_status', defaultMessage: 'post' },
+ account: { id: 'report.category.title_account', defaultMessage: 'profile' },
+});
+
+export default @injectIntl
+class Category extends React.PureComponent {
+
+ static propTypes = {
+ onNextStep: PropTypes.func.isRequired,
+ category: PropTypes.string,
+ onChangeCategory: PropTypes.func.isRequired,
+ startedFrom: PropTypes.oneOf(['status', 'account']),
+ intl: PropTypes.object.isRequired,
+ };
+
+ handleNextClick = () => {
+ const { onNextStep, category } = this.props;
+
+ switch(category) {
+ case 'dislike':
+ onNextStep('thanks');
+ break;
+ case 'violation':
+ onNextStep('rules');
+ break;
+ default:
+ onNextStep('statuses');
+ break;
+ }
+ };
+
+ handleCategoryToggle = (value, checked) => {
+ const { onChangeCategory } = this.props;
+
+ if (checked) {
+ onChangeCategory(value);
+ }
+ };
+
+ render () {
+ const { category, startedFrom, intl } = this.props;
+
+ const options = [
+ 'dislike',
+ 'spam',
+ 'violation',
+ 'other',
+ ];
+
+ return (
+
+
+
+
+
+ {options.map(item => (
+
+ ))}
+
+
+
+
+
+
+
+
+ );
+ }
+
+}
diff --git a/app/javascript/flavours/glitch/features/report/comment.js b/app/javascript/flavours/glitch/features/report/comment.js
new file mode 100644
index 000000000..ec261afcb
--- /dev/null
+++ b/app/javascript/flavours/glitch/features/report/comment.js
@@ -0,0 +1,83 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import { injectIntl, defineMessages, FormattedMessage } from 'react-intl';
+import Button from 'flavours/glitch/components/button';
+import Toggle from 'react-toggle';
+
+const messages = defineMessages({
+ placeholder: { id: 'report.placeholder', defaultMessage: 'Type or paste additional comments' },
+});
+
+export default @injectIntl
+class Comment extends React.PureComponent {
+
+ static propTypes = {
+ onSubmit: PropTypes.func.isRequired,
+ comment: PropTypes.string.isRequired,
+ onChangeComment: PropTypes.func.isRequired,
+ intl: PropTypes.object.isRequired,
+ isSubmitting: PropTypes.bool,
+ forward: PropTypes.bool,
+ isRemote: PropTypes.bool,
+ domain: PropTypes.string,
+ onChangeForward: PropTypes.func.isRequired,
+ };
+
+ handleClick = () => {
+ const { onSubmit } = this.props;
+ onSubmit();
+ };
+
+ handleChange = e => {
+ const { onChangeComment } = this.props;
+ onChangeComment(e.target.value);
+ };
+
+ handleKeyDown = e => {
+ if (e.keyCode === 13 && (e.ctrlKey || e.metaKey)) {
+ this.handleClick();
+ }
+ };
+
+ handleForwardChange = e => {
+ const { onChangeForward } = this.props;
+ onChangeForward(e.target.checked);
+ };
+
+ render () {
+ const { comment, isRemote, forward, domain, isSubmitting, intl } = this.props;
+
+ return (
+
+
+
+
+
+ {isRemote && (
+
+
+
+
+
+
+
+
+ )}
+
+
+
+
+
+
+
+ );
+ }
+
+}
diff --git a/app/javascript/flavours/glitch/features/report/components/option.js b/app/javascript/flavours/glitch/features/report/components/option.js
new file mode 100644
index 000000000..7e94f0654
--- /dev/null
+++ b/app/javascript/flavours/glitch/features/report/components/option.js
@@ -0,0 +1,60 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import classNames from 'classnames';
+import Check from 'flavours/glitch/components/check';
+
+export default class Option extends React.PureComponent {
+
+ static propTypes = {
+ name: PropTypes.string.isRequired,
+ value: PropTypes.string.isRequired,
+ checked: PropTypes.bool,
+ label: PropTypes.node,
+ description: PropTypes.node,
+ onToggle: PropTypes.func,
+ multiple: PropTypes.bool,
+ labelComponent: PropTypes.node,
+ };
+
+ handleKeyPress = e => {
+ const { value, checked, onToggle } = this.props;
+
+ if (e.key === 'Enter' || e.key === ' ') {
+ e.stopPropagation();
+ e.preventDefault();
+ onToggle(value, !checked);
+ }
+ }
+
+ handleChange = e => {
+ const { value, onToggle } = this.props;
+ onToggle(value, e.target.checked);
+ }
+
+ render () {
+ const { name, value, checked, label, labelComponent, description, multiple } = this.props;
+
+ return (
+
+
+
+ {checked && }
+
+ {labelComponent ? labelComponent : (
+
+ {label}
+ {description}
+
+ )}
+
+ );
+ }
+
+}
diff --git a/app/javascript/flavours/glitch/features/report/components/status_check_box.js b/app/javascript/flavours/glitch/features/report/components/status_check_box.js
index cc49042fc..76bf0eb85 100644
--- a/app/javascript/flavours/glitch/features/report/components/status_check_box.js
+++ b/app/javascript/flavours/glitch/features/report/components/status_check_box.js
@@ -1,75 +1,58 @@
import React from 'react';
import PropTypes from 'prop-types';
import ImmutablePropTypes from 'react-immutable-proptypes';
-import Toggle from 'react-toggle';
-import noop from 'lodash/noop';
import StatusContent from 'flavours/glitch/components/status_content';
-import { MediaGallery, Video } from 'flavours/glitch/util/async-components';
-import Bundle from 'flavours/glitch/features/ui/components/bundle';
+import Avatar from 'flavours/glitch/components/avatar';
+import DisplayName from 'flavours/glitch/components/display_name';
+import RelativeTimestamp from 'flavours/glitch/components/relative_timestamp';
+import Option from './option';
+import MediaAttachments from 'flavours/glitch/components/media_attachments';
export default class StatusCheckBox extends React.PureComponent {
static propTypes = {
+ id: PropTypes.string.isRequired,
status: ImmutablePropTypes.map.isRequired,
checked: PropTypes.bool,
onToggle: PropTypes.func.isRequired,
- disabled: PropTypes.bool,
+ };
+
+ handleStatusesToggle = (value, checked) => {
+ const { onToggle } = this.props;
+ onToggle(value, checked);
};
render () {
- const { status, checked, onToggle, disabled } = this.props;
- let media = null;
+ const { status, checked } = this.props;
if (status.get('reblog')) {
return null;
}
- if (status.get('media_attachments').size > 0) {
- if (status.get('media_attachments').some(item => item.get('type') === 'unknown')) {
+ const labelComponent = (
+
+
+
- } else if (status.getIn(['media_attachments', 0, 'type']) === 'video') {
- const video = status.getIn(['media_attachments', 0]);
+
·
+
- media = (
-
- {Component => (
-
- )}
-
- );
- } else {
- media = (
-
- {Component => }
-
- );
- }
- }
+
} />
+
+ );
return (
-
+
);
}
diff --git a/app/javascript/flavours/glitch/features/report/containers/status_check_box_container.js b/app/javascript/flavours/glitch/features/report/containers/status_check_box_container.js
index 9bfd41ffc..aa34b3efd 100644
--- a/app/javascript/flavours/glitch/features/report/containers/status_check_box_container.js
+++ b/app/javascript/flavours/glitch/features/report/containers/status_check_box_container.js
@@ -1,19 +1,15 @@
import { connect } from 'react-redux';
import StatusCheckBox from '../components/status_check_box';
-import { toggleStatusReport } from 'flavours/glitch/actions/reports';
-import { Set as ImmutableSet } from 'immutable';
+import { makeGetStatus } from 'flavours/glitch/selectors';
-const mapStateToProps = (state, { id }) => ({
- status: state.getIn(['statuses', id]),
- checked: state.getIn(['reports', 'new', 'status_ids'], ImmutableSet()).includes(id),
-});
+const makeMapStateToProps = () => {
+ const getStatus = makeGetStatus();
-const mapDispatchToProps = (dispatch, { id }) => ({
+ const mapStateToProps = (state, { id }) => ({
+ status: getStatus(state, { id }),
+ });
- onToggle (e) {
- dispatch(toggleStatusReport(id, e.target.checked));
- },
+ return mapStateToProps;
+};
-});
-
-export default connect(mapStateToProps, mapDispatchToProps)(StatusCheckBox);
+export default connect(makeMapStateToProps)(StatusCheckBox);
diff --git a/app/javascript/flavours/glitch/features/report/rules.js b/app/javascript/flavours/glitch/features/report/rules.js
new file mode 100644
index 000000000..4772e04a2
--- /dev/null
+++ b/app/javascript/flavours/glitch/features/report/rules.js
@@ -0,0 +1,64 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import ImmutablePropTypes from 'react-immutable-proptypes';
+import { connect } from 'react-redux';
+import { FormattedMessage } from 'react-intl';
+import Button from 'flavours/glitch/components/button';
+import Option from './components/option';
+
+const mapStateToProps = state => ({
+ rules: state.get('rules'),
+});
+
+export default @connect(mapStateToProps)
+class Rules extends React.PureComponent {
+
+ static propTypes = {
+ onNextStep: PropTypes.func.isRequired,
+ rules: ImmutablePropTypes.list,
+ selectedRuleIds: ImmutablePropTypes.set.isRequired,
+ onToggle: PropTypes.func.isRequired,
+ };
+
+ handleNextClick = () => {
+ const { onNextStep } = this.props;
+ onNextStep('statuses');
+ };
+
+ handleRulesToggle = (value, checked) => {
+ const { onToggle } = this.props;
+ onToggle(value, checked);
+ };
+
+ render () {
+ const { rules, selectedRuleIds } = this.props;
+
+ return (
+
+
+
+
+
+ {rules.map(item => (
+
+ ))}
+
+
+
+
+
+
+
+
+ );
+ }
+
+}
diff --git a/app/javascript/flavours/glitch/features/report/statuses.js b/app/javascript/flavours/glitch/features/report/statuses.js
new file mode 100644
index 000000000..47d5ee863
--- /dev/null
+++ b/app/javascript/flavours/glitch/features/report/statuses.js
@@ -0,0 +1,61 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import ImmutablePropTypes from 'react-immutable-proptypes';
+import { connect } from 'react-redux';
+import StatusCheckBox from 'flavours/glitch/features/report/containers/status_check_box_container';
+import { OrderedSet } from 'immutable';
+import { FormattedMessage } from 'react-intl';
+import Button from 'flavours/glitch/components/button';
+import LoadingIndicator from 'flavours/glitch/components/loading_indicator';
+
+const mapStateToProps = (state, { accountId }) => ({
+ availableStatusIds: OrderedSet(state.getIn(['timelines', `account:${accountId}:with_replies`, 'items'])),
+ isLoading: state.getIn(['timelines', `account:${accountId}:with_replies`, 'isLoading']),
+});
+
+export default @connect(mapStateToProps)
+class Statuses extends React.PureComponent {
+
+ static propTypes = {
+ onNextStep: PropTypes.func.isRequired,
+ accountId: PropTypes.string.isRequired,
+ availableStatusIds: ImmutablePropTypes.set.isRequired,
+ selectedStatusIds: ImmutablePropTypes.set.isRequired,
+ isLoading: PropTypes.bool,
+ onToggle: PropTypes.func.isRequired,
+ };
+
+ handleNextClick = () => {
+ const { onNextStep } = this.props;
+ onNextStep('comment');
+ };
+
+ render () {
+ const { availableStatusIds, selectedStatusIds, onToggle, isLoading } = this.props;
+
+ return (
+
+
+
+
+
+ {isLoading ? : availableStatusIds.union(selectedStatusIds).map(statusId => (
+
+ ))}
+
+
+
+
+
+
+
+
+ );
+ }
+
+}
diff --git a/app/javascript/flavours/glitch/features/report/thanks.js b/app/javascript/flavours/glitch/features/report/thanks.js
new file mode 100644
index 000000000..9c41baa7f
--- /dev/null
+++ b/app/javascript/flavours/glitch/features/report/thanks.js
@@ -0,0 +1,84 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import ImmutablePropTypes from 'react-immutable-proptypes';
+import { FormattedMessage } from 'react-intl';
+import Button from 'flavours/glitch/components/button';
+import { connect } from 'react-redux';
+import {
+ unfollowAccount,
+ muteAccount,
+ blockAccount,
+} from 'mastodon/actions/accounts';
+
+const mapStateToProps = () => ({});
+
+export default @connect(mapStateToProps)
+class Thanks extends React.PureComponent {
+
+ static propTypes = {
+ submitted: PropTypes.bool,
+ onClose: PropTypes.func.isRequired,
+ account: ImmutablePropTypes.map.isRequired,
+ dispatch: PropTypes.func.isRequired,
+ };
+
+ handleCloseClick = () => {
+ const { onClose } = this.props;
+ onClose();
+ };
+
+ handleUnfollowClick = () => {
+ const { dispatch, account, onClose } = this.props;
+ dispatch(unfollowAccount(account.get('id')));
+ onClose();
+ };
+
+ handleMuteClick = () => {
+ const { dispatch, account, onClose } = this.props;
+ dispatch(muteAccount(account.get('id')));
+ onClose();
+ };
+
+ handleBlockClick = () => {
+ const { dispatch, account, onClose } = this.props;
+ dispatch(blockAccount(account.get('id')));
+ onClose();
+ };
+
+ render () {
+ const { account, submitted } = this.props;
+
+ return (
+
+ {submitted ? : }
+ {submitted ? : }
+
+ {account.getIn(['relationship', 'following']) && (
+
+
+
+
+
+
+ )}
+
+
+
+ {!account.getIn(['relationship', 'muting']) ? : }
+
+
+
+
+
+ {!account.getIn(['relationship', 'blocking']) ? : }
+
+
+
+
+
+
+
+ );
+ }
+
+}
diff --git a/app/javascript/flavours/glitch/features/status/components/action_bar.js b/app/javascript/flavours/glitch/features/status/components/action_bar.js
index eb4583026..a67a045da 100644
--- a/app/javascript/flavours/glitch/features/status/components/action_bar.js
+++ b/app/javascript/flavours/glitch/features/status/components/action_bar.js
@@ -11,6 +11,7 @@ import classNames from 'classnames';
const messages = defineMessages({
delete: { id: 'status.delete', defaultMessage: 'Delete' },
redraft: { id: 'status.redraft', defaultMessage: 'Delete & re-draft' },
+ edit: { id: 'status.edit', defaultMessage: 'Edit' },
direct: { id: 'status.direct', defaultMessage: 'Direct message @{name}' },
mention: { id: 'status.mention', defaultMessage: 'Mention @{name}' },
reply: { id: 'status.reply', defaultMessage: 'Reply' },
@@ -52,6 +53,7 @@ class ActionBar extends React.PureComponent {
onMuteConversation: PropTypes.func,
onBlock: PropTypes.func,
onDelete: PropTypes.func.isRequired,
+ onEdit: PropTypes.func.isRequired,
onDirect: PropTypes.func.isRequired,
onMention: PropTypes.func.isRequired,
onReport: PropTypes.func,
@@ -84,6 +86,10 @@ class ActionBar extends React.PureComponent {
this.props.onDelete(this.props.status, this.context.router.history, true);
}
+ handleEditClick = () => {
+ this.props.onEdit(this.props.status, this.context.router.history);
+ }
+
handleDirectClick = () => {
this.props.onDirect(this.props.status.get('account'), this.context.router.history);
}
@@ -166,6 +172,7 @@ class ActionBar extends React.PureComponent {
menu.push({ text: intl.formatMessage(mutingConversation ? messages.unmuteConversation : messages.muteConversation), action: this.handleConversationMuteClick });
menu.push(null);
+ // menu.push({ text: intl.formatMessage(messages.edit), action: this.handleEditClick });
menu.push({ text: intl.formatMessage(messages.delete), action: this.handleDeleteClick });
menu.push({ text: intl.formatMessage(messages.redraft), action: this.handleRedraftClick });
} else {
diff --git a/app/javascript/flavours/glitch/features/status/components/detailed_status.js b/app/javascript/flavours/glitch/features/status/components/detailed_status.js
index 4b3a6aaaa..528d2eb73 100644
--- a/app/javascript/flavours/glitch/features/status/components/detailed_status.js
+++ b/app/javascript/flavours/glitch/features/status/components/detailed_status.js
@@ -7,7 +7,7 @@ import StatusContent from 'flavours/glitch/components/status_content';
import MediaGallery from 'flavours/glitch/components/media_gallery';
import AttachmentList from 'flavours/glitch/components/attachment_list';
import { Link } from 'react-router-dom';
-import { injectIntl, FormattedDate, FormattedMessage } from 'react-intl';
+import { injectIntl, FormattedDate } from 'react-intl';
import Card from './card';
import ImmutablePureComponent from 'react-immutable-pure-component';
import Video from 'flavours/glitch/features/video';
@@ -19,6 +19,7 @@ import PollContainer from 'flavours/glitch/containers/poll_container';
import Icon from 'flavours/glitch/components/icon';
import AnimatedNumber from 'flavours/glitch/components/animated_number';
import PictureInPicturePlaceholder from 'flavours/glitch/components/picture_in_picture_placeholder';
+import EditedTimestamp from 'flavours/glitch/components/edited_timestamp';
export default @injectIntl
class DetailedStatus extends ImmutablePureComponent {
@@ -265,7 +266,7 @@ class DetailedStatus extends ImmutablePureComponent {
edited = (
·
-
+
);
}
diff --git a/app/javascript/flavours/glitch/features/status/index.js b/app/javascript/flavours/glitch/features/status/index.js
index 12ea407ad..653fabeae 100644
--- a/app/javascript/flavours/glitch/features/status/index.js
+++ b/app/javascript/flavours/glitch/features/status/index.js
@@ -26,7 +26,7 @@ import {
directCompose,
} from 'flavours/glitch/actions/compose';
import { changeLocalSetting } from 'flavours/glitch/actions/local_settings';
-import { muteStatus, unmuteStatus, deleteStatus } from 'flavours/glitch/actions/statuses';
+import { muteStatus, unmuteStatus, deleteStatus, editStatus } from 'flavours/glitch/actions/statuses';
import { initMuteModal } from 'flavours/glitch/actions/mutes';
import { initBlockModal } from 'flavours/glitch/actions/blocks';
import { initReport } from 'flavours/glitch/actions/reports';
@@ -307,6 +307,10 @@ class Status extends ImmutablePureComponent {
}
}
+ handleEditClick = (status, history) => {
+ this.props.dispatch(editStatus(status.get('id'), history));
+ }
+
handleDirectClick = (account, router) => {
this.props.dispatch(directCompose(account, router));
}
@@ -585,6 +589,7 @@ class Status extends ImmutablePureComponent {
onReblog={this.handleReblogClick}
onBookmark={this.handleBookmarkClick}
onDelete={this.handleDeleteClick}
+ onEdit={this.handleEditClick}
onDirect={this.handleDirectClick}
onMention={this.handleMentionClick}
onMute={this.handleMuteClick}
diff --git a/app/javascript/flavours/glitch/features/ui/components/actions_modal.js b/app/javascript/flavours/glitch/features/ui/components/actions_modal.js
index 24169036c..aae2e4426 100644
--- a/app/javascript/flavours/glitch/features/ui/components/actions_modal.js
+++ b/app/javascript/flavours/glitch/features/ui/components/actions_modal.js
@@ -7,24 +7,22 @@ import Avatar from 'flavours/glitch/components/avatar';
import RelativeTimestamp from 'flavours/glitch/components/relative_timestamp';
import DisplayName from 'flavours/glitch/components/display_name';
import classNames from 'classnames';
-import Icon from 'flavours/glitch/components/icon';
-import Link from 'flavours/glitch/components/link';
-import Toggle from 'react-toggle';
+import IconButton from 'flavours/glitch/components/icon_button';
export default class ActionsModal extends ImmutablePureComponent {
static propTypes = {
status: ImmutablePropTypes.map,
+ onClick: PropTypes.func,
actions: PropTypes.arrayOf(PropTypes.shape({
active: PropTypes.bool,
href: PropTypes.string,
icon: PropTypes.string,
- meta: PropTypes.node,
+ meta: PropTypes.string,
name: PropTypes.string,
- on: PropTypes.bool,
- onPassiveClick: PropTypes.func,
- text: PropTypes.node,
+ text: PropTypes.string,
})),
+ renderItemContents: PropTypes.func,
};
renderAction = (action, i) => {
@@ -32,57 +30,26 @@ export default class ActionsModal extends ImmutablePureComponent {
return
;
}
- const {
- active,
- href,
- icon,
- meta,
- name,
- on,
- onClick,
- onPassiveClick,
- text,
- } = action;
+ const { icon = null, text, meta = null, active = false, href = '#' } = action;
+ let contents = this.props.renderItemContents && this.props.renderItemContents(action, i);
+
+ if (!contents) {
+ contents = (
+
+ {icon && }
+
+
+ );
+ }
return (
-
-
- {function () {
-
- // We render a `` if we were provided an `on`
- // property, and otherwise show an `` if available.
- switch (true) {
- case on !== null && typeof on !== 'undefined':
- return (
-
- );
- case !!icon:
- return (
-
- );
- default:
- return null;
- }
- }()}
- {meta ? (
-
- {text}
- {meta}
-
- ) : {text}
}
-
+
+
+ {contents}
+
);
}
diff --git a/app/javascript/flavours/glitch/features/ui/components/compare_history_modal.js b/app/javascript/flavours/glitch/features/ui/components/compare_history_modal.js
new file mode 100644
index 000000000..8fd528da0
--- /dev/null
+++ b/app/javascript/flavours/glitch/features/ui/components/compare_history_modal.js
@@ -0,0 +1,99 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import ImmutablePropTypes from 'react-immutable-proptypes';
+import { connect } from 'react-redux';
+import { FormattedMessage } from 'react-intl';
+import { closeModal } from 'flavours/glitch/actions/modal';
+import emojify from 'flavours/glitch/util/emoji';
+import escapeTextContentForBrowser from 'escape-html';
+import InlineAccount from 'flavours/glitch/components/inline_account';
+import IconButton from 'flavours/glitch/components/icon_button';
+import RelativeTimestamp from 'flavours/glitch/components/relative_timestamp';
+import MediaAttachments from 'flavours/glitch/components/media_attachments';
+
+const mapStateToProps = (state, { statusId }) => ({
+ versions: state.getIn(['history', statusId, 'items']),
+});
+
+const mapDispatchToProps = dispatch => ({
+
+ onClose() {
+ dispatch(closeModal());
+ },
+
+});
+
+export default @connect(mapStateToProps, mapDispatchToProps)
+class CompareHistoryModal extends React.PureComponent {
+
+ static propTypes = {
+ onClose: PropTypes.func.isRequired,
+ index: PropTypes.number.isRequired,
+ statusId: PropTypes.string.isRequired,
+ versions: ImmutablePropTypes.list.isRequired,
+ };
+
+ render () {
+ const { index, versions, onClose } = this.props;
+ const currentVersion = versions.get(index);
+
+ const emojiMap = currentVersion.get('emojis').reduce((obj, emoji) => {
+ obj[`:${emoji.get('shortcode')}:`] = emoji.toJS();
+ return obj;
+ }, {});
+
+ const content = { __html: emojify(currentVersion.get('content'), emojiMap) };
+ const spoilerContent = { __html: emojify(escapeTextContentForBrowser(currentVersion.get('spoiler_text')), emojiMap) };
+
+ const formattedDate = ;
+ const formattedName = ;
+
+ const label = currentVersion.get('original') ? (
+
+ ) : (
+
+ );
+
+ return (
+
+
+
+ {label}
+
+
+
+
+ {currentVersion.get('spoiler_text').length > 0 && (
+
+
+
+
+ )}
+
+
+
+ {!!currentVersion.get('poll') && (
+
+
+ {currentVersion.getIn(['poll', 'options']).map(option => (
+
+
+
+
+
+ ))}
+
+
+ )}
+
+
+
+
+
+ );
+ }
+
+}
diff --git a/app/javascript/flavours/glitch/features/ui/components/modal_root.js b/app/javascript/flavours/glitch/features/ui/components/modal_root.js
index 62bb167a0..a975c4013 100644
--- a/app/javascript/flavours/glitch/features/ui/components/modal_root.js
+++ b/app/javascript/flavours/glitch/features/ui/components/modal_root.js
@@ -24,6 +24,7 @@ import {
ListEditor,
ListAdder,
PinnedAccountsEditor,
+ CompareHistoryModal,
} from 'flavours/glitch/util/async-components';
const MODAL_COMPONENTS = {
@@ -42,9 +43,10 @@ const MODAL_COMPONENTS = {
'ACTIONS': () => Promise.resolve({ default: ActionsModal }),
'EMBED': EmbedModal,
'LIST_EDITOR': ListEditor,
- 'LIST_ADDER':ListAdder,
'FOCAL_POINT': () => Promise.resolve({ default: FocalPointModal }),
+ 'LIST_ADDER': ListAdder,
'PINNED_ACCOUNTS_EDITOR': PinnedAccountsEditor,
+ 'COMPARE_HISTORY': CompareHistoryModal,
};
export default class ModalRoot extends React.PureComponent {
@@ -53,6 +55,7 @@ export default class ModalRoot extends React.PureComponent {
type: PropTypes.string,
props: PropTypes.object,
onClose: PropTypes.func.isRequired,
+ ignoreFocus: PropTypes.bool,
};
state = {
@@ -83,7 +86,7 @@ export default class ModalRoot extends React.PureComponent {
return ;
}
- handleClose = () => {
+ handleClose = (ignoreFocus = false) => {
const { onClose } = this.props;
let message = null;
try {
@@ -93,7 +96,7 @@ export default class ModalRoot extends React.PureComponent {
// isn't set.
// This would be much smoother with react-intl 3+ and `forwardRef`.
}
- onClose(message);
+ onClose(message, ignoreFocus);
}
setModalRef = (c) => {
@@ -101,12 +104,12 @@ export default class ModalRoot extends React.PureComponent {
}
render () {
- const { type, props } = this.props;
+ const { type, props, ignoreFocus } = this.props;
const { backgroundColor } = this.state;
const visible = !!type;
return (
-
+
{visible && (
{(SpecificComponent) => }
diff --git a/app/javascript/flavours/glitch/features/ui/components/report_modal.js b/app/javascript/flavours/glitch/features/ui/components/report_modal.js
index 5cb7c5d07..dcbe94929 100644
--- a/app/javascript/flavours/glitch/features/ui/components/report_modal.js
+++ b/app/javascript/flavours/glitch/features/ui/components/report_modal.js
@@ -1,38 +1,32 @@
import React from 'react';
import { connect } from 'react-redux';
-import { changeReportComment, changeReportForward, submitReport } from 'flavours/glitch/actions/reports';
+import { submitReport } from 'flavours/glitch/actions/reports';
import { expandAccountTimeline } from 'flavours/glitch/actions/timelines';
+import { fetchRules } from 'flavours/glitch/actions/rules';
+import { fetchRelationships } from 'flavours/glitch/actions/accounts';
import PropTypes from 'prop-types';
import ImmutablePropTypes from 'react-immutable-proptypes';
import { makeGetAccount } from 'flavours/glitch/selectors';
import { defineMessages, FormattedMessage, injectIntl } from 'react-intl';
-import StatusCheckBox from 'flavours/glitch/features/report/containers/status_check_box_container';
import { OrderedSet } from 'immutable';
import ImmutablePureComponent from 'react-immutable-pure-component';
-import Button from 'flavours/glitch/components/button';
-import Toggle from 'react-toggle';
-import IconButton from '../../../components/icon_button';
+import IconButton from 'flavours/glitch/components/icon_button';
+import Category from 'flavours/glitch/features/report/category';
+import Statuses from 'flavours/glitch/features/report/statuses';
+import Rules from 'flavours/glitch/features/report/rules';
+import Comment from 'flavours/glitch/features/report/comment';
+import Thanks from 'flavours/glitch/features/report/thanks';
const messages = defineMessages({
close: { id: 'lightbox.close', defaultMessage: 'Close' },
- placeholder: { id: 'report.placeholder', defaultMessage: 'Additional comments' },
- submit: { id: 'report.submit', defaultMessage: 'Submit' },
});
const makeMapStateToProps = () => {
const getAccount = makeGetAccount();
- const mapStateToProps = state => {
- const accountId = state.getIn(['reports', 'new', 'account_id']);
-
- return {
- isSubmitting: state.getIn(['reports', 'new', 'isSubmitting']),
- account: getAccount(state, accountId),
- comment: state.getIn(['reports', 'new', 'comment']),
- forward: state.getIn(['reports', 'new', 'forward']),
- statusIds: OrderedSet(state.getIn(['timelines', `account:${accountId}:with_replies`, 'items'])).union(state.getIn(['reports', 'new', 'status_ids'])),
- };
- };
+ const mapStateToProps = (state, { accountId }) => ({
+ account: getAccount(state, accountId),
+ });
return mapStateToProps;
};
@@ -42,92 +36,183 @@ export default @connect(makeMapStateToProps)
class ReportModal extends ImmutablePureComponent {
static propTypes = {
- isSubmitting: PropTypes.bool,
- account: ImmutablePropTypes.map,
- statusIds: ImmutablePropTypes.orderedSet.isRequired,
- comment: PropTypes.string.isRequired,
- forward: PropTypes.bool,
+ accountId: PropTypes.string.isRequired,
+ statusId: PropTypes.string,
dispatch: PropTypes.func.isRequired,
intl: PropTypes.object.isRequired,
+ account: ImmutablePropTypes.map.isRequired,
};
- handleCommentChange = e => {
- this.props.dispatch(changeReportComment(e.target.value));
- }
-
- handleForwardChange = e => {
- this.props.dispatch(changeReportForward(e.target.checked));
- }
+ state = {
+ step: 'category',
+ selectedStatusIds: OrderedSet(this.props.statusId ? [this.props.statusId] : []),
+ comment: '',
+ category: null,
+ selectedRuleIds: OrderedSet(),
+ forward: true,
+ isSubmitting: false,
+ isSubmitted: false,
+ };
handleSubmit = () => {
- this.props.dispatch(submitReport());
- }
+ const { dispatch, accountId } = this.props;
+ const { selectedStatusIds, comment, category, selectedRuleIds, forward } = this.state;
- handleKeyDown = e => {
- if (e.keyCode === 13 && (e.ctrlKey || e.metaKey)) {
- this.handleSubmit();
+ this.setState({ isSubmitting: true });
+
+ dispatch(submitReport({
+ account_id: accountId,
+ status_ids: selectedStatusIds.toArray(),
+ comment,
+ forward,
+ category,
+ rule_ids: selectedRuleIds.toArray(),
+ }, this.handleSuccess, this.handleFail));
+ };
+
+ handleSuccess = () => {
+ this.setState({ isSubmitting: false, isSubmitted: true, step: 'thanks' });
+ };
+
+ handleFail = () => {
+ this.setState({ isSubmitting: false });
+ };
+
+ handleStatusToggle = (statusId, checked) => {
+ const { selectedStatusIds } = this.state;
+
+ if (checked) {
+ this.setState({ selectedStatusIds: selectedStatusIds.add(statusId) });
+ } else {
+ this.setState({ selectedStatusIds: selectedStatusIds.remove(statusId) });
+ }
+ };
+
+ handleRuleToggle = (ruleId, checked) => {
+ const { selectedRuleIds } = this.state;
+
+ if (checked) {
+ this.setState({ selectedRuleIds: selectedRuleIds.add(ruleId) });
+ } else {
+ this.setState({ selectedRuleIds: selectedRuleIds.remove(ruleId) });
}
}
+ handleChangeCategory = category => {
+ this.setState({ category });
+ };
+
+ handleChangeComment = comment => {
+ this.setState({ comment });
+ };
+
+ handleChangeForward = forward => {
+ this.setState({ forward });
+ };
+
+ handleNextStep = step => {
+ this.setState({ step });
+ };
+
componentDidMount () {
- this.props.dispatch(expandAccountTimeline(this.props.account.get('id'), { withReplies: true }));
- }
+ const { dispatch, accountId } = this.props;
- componentWillReceiveProps (nextProps) {
- if (this.props.account !== nextProps.account && nextProps.account) {
- this.props.dispatch(expandAccountTimeline(nextProps.account.get('id'), { withReplies: true }));
- }
+ dispatch(fetchRelationships([accountId]));
+ dispatch(expandAccountTimeline(accountId, { withReplies: true }));
+ dispatch(fetchRules());
}
render () {
- const { account, comment, intl, statusIds, isSubmitting, forward, onClose } = this.props;
+ const {
+ accountId,
+ account,
+ intl,
+ onClose,
+ } = this.props;
if (!account) {
return null;
}
- const domain = account.get('acct').split('@')[1];
+ const {
+ step,
+ selectedStatusIds,
+ selectedRuleIds,
+ comment,
+ forward,
+ category,
+ isSubmitting,
+ isSubmitted,
+ } = this.state;
+
+ const domain = account.get('acct').split('@')[1];
+ const isRemote = !!domain;
+
+ let stepComponent;
+
+ switch(step) {
+ case 'category':
+ stepComponent = (
+
+ );
+ break;
+ case 'rules':
+ stepComponent = (
+
+ );
+ break;
+ case 'statuses':
+ stepComponent = (
+
+ );
+ break;
+ case 'comment':
+ stepComponent = (
+
+ );
+ break;
+ case 'thanks':
+ stepComponent = (
+
+ );
+ }
return (
-
+
{account.get('acct')} }} />
-
-
-
-
-
-
- {domain && (
-
- )}
-
-
-
-
-
-
- {statusIds.map(statusId => )}
-
-
+
+ {stepComponent}
);
diff --git a/app/javascript/flavours/glitch/features/ui/containers/modal_container.js b/app/javascript/flavours/glitch/features/ui/containers/modal_container.js
index 039aabd8a..560c34f01 100644
--- a/app/javascript/flavours/glitch/features/ui/containers/modal_container.js
+++ b/app/javascript/flavours/glitch/features/ui/containers/modal_container.js
@@ -3,22 +3,23 @@ import { openModal, closeModal } from 'flavours/glitch/actions/modal';
import ModalRoot from '../components/modal_root';
const mapStateToProps = state => ({
- type: state.getIn(['modal', 0, 'modalType'], null),
- props: state.getIn(['modal', 0, 'modalProps'], {}),
+ ignoreFocus: state.getIn(['modal', 'ignoreFocus']),
+ type: state.getIn(['modal', 'stack', 0, 'modalType'], null),
+ props: state.getIn(['modal', 'stack', 0, 'modalProps'], {}),
});
const mapDispatchToProps = dispatch => ({
- onClose (confirmationMessage) {
+ onClose (confirmationMessage, ignoreFocus = false) {
if (confirmationMessage) {
dispatch(
openModal('CONFIRM', {
message: confirmationMessage.message,
confirm: confirmationMessage.confirm,
- onConfirm: () => dispatch(closeModal()),
+ onConfirm: () => dispatch(closeModal(undefined, { ignoreFocus })),
}),
);
} else {
- dispatch(closeModal());
+ dispatch(closeModal(undefined, { ignoreFocus }));
}
},
});
diff --git a/app/javascript/flavours/glitch/features/video/index.js b/app/javascript/flavours/glitch/features/video/index.js
index fcbf07ce2..53e3dfda3 100644
--- a/app/javascript/flavours/glitch/features/video/index.js
+++ b/app/javascript/flavours/glitch/features/video/index.js
@@ -123,7 +123,7 @@ class Video extends React.PureComponent {
autoPlay: PropTypes.bool,
volume: PropTypes.number,
muted: PropTypes.bool,
- componetIndex: PropTypes.number,
+ componentIndex: PropTypes.number,
};
static defaultProps = {
@@ -516,7 +516,7 @@ class Video extends React.PureComponent {
startTime: this.video.currentTime,
autoPlay: !this.state.paused,
defaultVolume: this.state.volume,
- componetIndex: this.props.componetIndex,
+ componentIndex: this.props.componentIndex,
});
}
diff --git a/app/javascript/flavours/glitch/locales/af.js b/app/javascript/flavours/glitch/locales/af.js
new file mode 100644
index 000000000..4c97b644a
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/af.js
@@ -0,0 +1,7 @@
+import inherited from 'mastodon/locales/af.json';
+
+const messages = {
+ // No translations available.
+};
+
+export default Object.assign({}, inherited, messages);
diff --git a/app/javascript/flavours/glitch/locales/ckb.js b/app/javascript/flavours/glitch/locales/ckb.js
new file mode 100644
index 000000000..c2e177d5f
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/ckb.js
@@ -0,0 +1,7 @@
+import inherited from 'mastodon/locales/ckb.json';
+
+const messages = {
+ // No translations available.
+};
+
+export default Object.assign({}, inherited, messages);
diff --git a/app/javascript/flavours/glitch/locales/es-MX.js b/app/javascript/flavours/glitch/locales/es-MX.js
new file mode 100644
index 000000000..eaefa20ef
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/es-MX.js
@@ -0,0 +1,7 @@
+import inherited from 'mastodon/locales/es-MX.json';
+
+const messages = {
+ // No translations available.
+};
+
+export default Object.assign({}, inherited, messages);
diff --git a/app/javascript/flavours/glitch/locales/gd.js b/app/javascript/flavours/glitch/locales/gd.js
new file mode 100644
index 000000000..604ee86dc
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/gd.js
@@ -0,0 +1,7 @@
+import inherited from 'mastodon/locales/gd.json';
+
+const messages = {
+ // No translations available.
+};
+
+export default Object.assign({}, inherited, messages);
diff --git a/app/javascript/flavours/glitch/locales/kw.js b/app/javascript/flavours/glitch/locales/kw.js
new file mode 100644
index 000000000..1325ca825
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/kw.js
@@ -0,0 +1,7 @@
+import inherited from 'mastodon/locales/kw.json';
+
+const messages = {
+ // No translations available.
+};
+
+export default Object.assign({}, inherited, messages);
diff --git a/app/javascript/flavours/glitch/locales/pa.js b/app/javascript/flavours/glitch/locales/pa.js
new file mode 100644
index 000000000..c3e0e2b84
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/pa.js
@@ -0,0 +1,7 @@
+import inherited from 'mastodon/locales/pa.json';
+
+const messages = {
+ // No translations available.
+};
+
+export default Object.assign({}, inherited, messages);
diff --git a/app/javascript/flavours/glitch/locales/si.js b/app/javascript/flavours/glitch/locales/si.js
new file mode 100644
index 000000000..d43266254
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/si.js
@@ -0,0 +1,7 @@
+import inherited from 'mastodon/locales/si.json';
+
+const messages = {
+ // No translations available.
+};
+
+export default Object.assign({}, inherited, messages);
diff --git a/app/javascript/flavours/glitch/locales/szl.js b/app/javascript/flavours/glitch/locales/szl.js
new file mode 100644
index 000000000..0b50afe45
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/szl.js
@@ -0,0 +1,7 @@
+import inherited from 'mastodon/locales/szl.json';
+
+const messages = {
+ // No translations available.
+};
+
+export default Object.assign({}, inherited, messages);
diff --git a/app/javascript/flavours/glitch/locales/tai.js b/app/javascript/flavours/glitch/locales/tai.js
new file mode 100644
index 000000000..f26cec5bd
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/tai.js
@@ -0,0 +1,7 @@
+import inherited from 'mastodon/locales/tai.json';
+
+const messages = {
+ // No translations available.
+};
+
+export default Object.assign({}, inherited, messages);
diff --git a/app/javascript/flavours/glitch/locales/tt.js b/app/javascript/flavours/glitch/locales/tt.js
new file mode 100644
index 000000000..ff74f6c29
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/tt.js
@@ -0,0 +1,7 @@
+import inherited from 'mastodon/locales/tt.json';
+
+const messages = {
+ // No translations available.
+};
+
+export default Object.assign({}, inherited, messages);
diff --git a/app/javascript/flavours/glitch/locales/ug.js b/app/javascript/flavours/glitch/locales/ug.js
new file mode 100644
index 000000000..ab7ee0761
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/ug.js
@@ -0,0 +1,7 @@
+import inherited from 'mastodon/locales/ug.json';
+
+const messages = {
+ // No translations available.
+};
+
+export default Object.assign({}, inherited, messages);
diff --git a/app/javascript/flavours/glitch/packs/admin.js b/app/javascript/flavours/glitch/packs/admin.js
index b26df932c..4c09ddb05 100644
--- a/app/javascript/flavours/glitch/packs/admin.js
+++ b/app/javascript/flavours/glitch/packs/admin.js
@@ -1,48 +1,24 @@
import 'packs/public-path';
-import loadPolyfills from 'flavours/glitch/util/load_polyfills';
import ready from 'flavours/glitch/util/ready';
-import loadKeyboardExtensions from 'flavours/glitch/util/load_keyboard_extensions';
-function main() {
- const { delegate } = require('@rails/ujs');
+ready(() => {
+ const React = require('react');
+ const ReactDOM = require('react-dom');
- ready(() => {
- const React = require('react');
- const ReactDOM = require('react-dom');
+ [].forEach.call(document.querySelectorAll('[data-admin-component]'), element => {
+ const componentName = element.getAttribute('data-admin-component');
+ const { locale, ...componentProps } = JSON.parse(element.getAttribute('data-props'));
- [].forEach.call(document.querySelectorAll('[data-admin-component]'), element => {
- const componentName = element.getAttribute('data-admin-component');
- const { locale, ...componentProps } = JSON.parse(element.getAttribute('data-props'));
-
- import('flavours/glitch/containers/admin_component').then(({ default: AdminComponent }) => {
- return import('flavours/glitch/components/admin/' + componentName).then(({ default: Component }) => {
- ReactDOM.render((
-
-
-
- ), element);
- });
- }).catch(error => {
- console.error(error);
+ import('flavours/glitch/containers/admin_component').then(({ default: AdminComponent }) => {
+ return import('flavours/glitch/components/admin/' + componentName).then(({ default: Component }) => {
+ ReactDOM.render((
+
+
+
+ ), element);
});
+ }).catch(error => {
+ console.error(error);
});
});
-
- delegate(document, '.sidebar__toggle__icon', 'click', () => {
- const target = document.querySelector('.sidebar ul');
-
- if (target.style.display === 'block') {
- target.style.display = 'none';
- } else {
- target.style.display = 'block';
- }
- });
-}
-
-loadPolyfills()
- .then(main)
- .then(loadKeyboardExtensions)
- .catch(error => {
- console.error(error);
-
- });
+});
diff --git a/app/javascript/flavours/glitch/packs/public.js b/app/javascript/flavours/glitch/packs/public.js
index a92f3d5a8..84ec9fce7 100644
--- a/app/javascript/flavours/glitch/packs/public.js
+++ b/app/javascript/flavours/glitch/packs/public.js
@@ -147,13 +147,7 @@ function main() {
});
delegate(document, '.sidebar__toggle__icon', 'click', () => {
- const target = document.querySelector('.sidebar ul');
-
- if (target.style.display === 'block') {
- target.style.display = 'none';
- } else {
- target.style.display = 'block';
- }
+ document.querySelector('.sidebar ul').classList.toggle('visible');
});
// Empty the honeypot fields in JS in case something like an extension
diff --git a/app/javascript/flavours/glitch/packs/settings.js b/app/javascript/flavours/glitch/packs/settings.js
index 9c4d119c1..0a53e1c25 100644
--- a/app/javascript/flavours/glitch/packs/settings.js
+++ b/app/javascript/flavours/glitch/packs/settings.js
@@ -7,13 +7,7 @@ function main() {
const { delegate } = require('@rails/ujs');
delegate(document, '.sidebar__toggle__icon', 'click', () => {
- const target = document.querySelector('.sidebar ul');
-
- if (target.style.display === 'block') {
- target.style.display = 'none';
- } else {
- target.style.display = 'block';
- }
+ document.querySelector('.sidebar ul').classList.toggle('visible');
});
}
diff --git a/app/javascript/flavours/glitch/reducers/compose.js b/app/javascript/flavours/glitch/reducers/compose.js
index d2ea0a924..f97c799e7 100644
--- a/app/javascript/flavours/glitch/reducers/compose.js
+++ b/app/javascript/flavours/glitch/reducers/compose.js
@@ -46,6 +46,7 @@ import {
INIT_MEDIA_EDIT_MODAL,
COMPOSE_CHANGE_MEDIA_DESCRIPTION,
COMPOSE_CHANGE_MEDIA_FOCUS,
+ COMPOSE_SET_STATUS,
} from 'flavours/glitch/actions/compose';
import { TIMELINE_DELETE } from 'flavours/glitch/actions/timelines';
import { STORE_HYDRATE } from 'flavours/glitch/actions/store';
@@ -75,6 +76,7 @@ const initialState = ImmutableMap({
spoiler: false,
spoiler_text: '',
privacy: null,
+ id: null,
content_type: defaultContentType || 'text/plain',
text: '',
focusDate: null,
@@ -160,6 +162,7 @@ function apiStatusToTextHashtags (state, status) {
function clearAll(state) {
return state.withMutations(map => {
+ map.set('id', null);
map.set('text', '');
if (defaultContentType) map.set('content_type', defaultContentType);
map.set('spoiler', false);
@@ -400,6 +403,7 @@ export default function compose(state = initialState, action) {
.set('elefriend', (state.get('elefriend') + 1) % totalElefriends);
case COMPOSE_REPLY:
return state.withMutations(map => {
+ map.set('id', null);
map.set('in_reply_to', action.status.get('id'));
map.set('text', statusToTextMentions(state, action.status));
map.set('privacy', privacyPreference(action.status.get('visibility'), state.get('default_privacy')));
@@ -434,6 +438,7 @@ export default function compose(state = initialState, action) {
map.set('spoiler', false);
map.set('spoiler_text', '');
map.set('privacy', state.get('default_privacy'));
+ map.set('id', null);
map.set('poll', null);
map.update(
'advanced_options',
@@ -565,6 +570,34 @@ export default function compose(state = initialState, action) {
map.set('spoiler_text', '');
}
+ if (action.status.get('poll')) {
+ map.set('poll', ImmutableMap({
+ options: action.status.getIn(['poll', 'options']).map(x => x.get('title')),
+ multiple: action.status.getIn(['poll', 'multiple']),
+ expires_in: expiresInFromExpiresAt(action.status.getIn(['poll', 'expires_at'])),
+ }));
+ }
+ });
+ case COMPOSE_SET_STATUS:
+ return state.withMutations(map => {
+ map.set('id', action.status.get('id'));
+ map.set('text', action.text);
+ map.set('in_reply_to', action.status.get('in_reply_to_id'));
+ map.set('privacy', action.status.get('visibility'));
+ map.set('media_attachments', action.status.get('media_attachments'));
+ map.set('focusDate', new Date());
+ map.set('caretPosition', null);
+ map.set('idempotencyKey', uuid());
+ map.set('sensitive', action.status.get('sensitive'));
+
+ if (action.spoiler_text.length > 0) {
+ map.set('spoiler', true);
+ map.set('spoiler_text', action.spoiler_text);
+ } else {
+ map.set('spoiler', false);
+ map.set('spoiler_text', '');
+ }
+
if (action.status.get('poll')) {
map.set('poll', ImmutableMap({
options: action.status.getIn(['poll', 'options']).map(x => x.get('title')),
diff --git a/app/javascript/flavours/glitch/reducers/history.js b/app/javascript/flavours/glitch/reducers/history.js
new file mode 100644
index 000000000..04f5f2fd1
--- /dev/null
+++ b/app/javascript/flavours/glitch/reducers/history.js
@@ -0,0 +1,28 @@
+import { HISTORY_FETCH_REQUEST, HISTORY_FETCH_SUCCESS, HISTORY_FETCH_FAIL } from 'flavours/glitch/actions/history';
+import { Map as ImmutableMap, List as ImmutableList, fromJS } from 'immutable';
+
+const initialHistory = ImmutableMap({
+ loading: false,
+ items: ImmutableList(),
+});
+
+const initialState = ImmutableMap();
+
+export default function history(state = initialState, action) {
+ switch(action.type) {
+ case HISTORY_FETCH_REQUEST:
+ return state.update(action.statusId, initialHistory, history => history.withMutations(map => {
+ map.set('loading', true);
+ map.set('items', ImmutableList());
+ }));
+ case HISTORY_FETCH_SUCCESS:
+ return state.update(action.statusId, initialHistory, history => history.withMutations(map => {
+ map.set('loading', false);
+ map.set('items', fromJS(action.history.map((x, i) => ({ ...x, account: x.account.id, original: i === 0 })).reverse()));
+ }));
+ case HISTORY_FETCH_FAIL:
+ return state.update(action.statusId, initialHistory, history => history.set('loading', false));
+ default:
+ return state;
+ }
+}
diff --git a/app/javascript/flavours/glitch/reducers/index.js b/app/javascript/flavours/glitch/reducers/index.js
index 7d7fe6fd3..92348c0c5 100644
--- a/app/javascript/flavours/glitch/reducers/index.js
+++ b/app/javascript/flavours/glitch/reducers/index.js
@@ -17,7 +17,7 @@ import push_notifications from './push_notifications';
import status_lists from './status_lists';
import mutes from './mutes';
import blocks from './blocks';
-import reports from './reports';
+import rules from './rules';
import boosts from './boosts';
import contexts from './contexts';
import compose from './compose';
@@ -41,6 +41,7 @@ import markers from './markers';
import account_notes from './account_notes';
import picture_in_picture from './picture_in_picture';
import accounts_map from './accounts_map';
+import history from './history';
const reducers = {
announcements,
@@ -63,7 +64,7 @@ const reducers = {
push_notifications,
mutes,
blocks,
- reports,
+ rules,
boosts,
contexts,
compose,
@@ -85,6 +86,7 @@ const reducers = {
markers,
account_notes,
picture_in_picture,
+ history,
};
export default combineReducers(reducers);
diff --git a/app/javascript/flavours/glitch/reducers/modal.js b/app/javascript/flavours/glitch/reducers/modal.js
index ae205c6d5..2ef0aef24 100644
--- a/app/javascript/flavours/glitch/reducers/modal.js
+++ b/app/javascript/flavours/glitch/reducers/modal.js
@@ -3,16 +3,36 @@ import { TIMELINE_DELETE } from 'flavours/glitch/actions/timelines';
import { COMPOSE_UPLOAD_CHANGE_SUCCESS } from 'flavours/glitch/actions/compose';
import { Stack as ImmutableStack, Map as ImmutableMap } from 'immutable';
-export default function modal(state = ImmutableStack(), action) {
+const initialState = ImmutableMap({
+ ignoreFocus: false,
+ stack: ImmutableStack(),
+});
+
+const popModal = (state, { modalType, ignoreFocus }) => {
+ if (modalType === undefined || modalType === state.getIn(['stack', 0, 'modalType'])) {
+ return state.set('ignoreFocus', !!ignoreFocus).update('stack', stack => stack.shift());
+ } else {
+ return state;
+ }
+};
+
+const pushModal = (state, modalType, modalProps) => {
+ return state.withMutations(map => {
+ map.set('ignoreFocus', false);
+ map.update('stack', stack => stack.unshift(ImmutableMap({ modalType, modalProps })));
+ });
+};
+
+export default function modal(state = initialState, action) {
switch(action.type) {
case MODAL_OPEN:
- return state.unshift(ImmutableMap({ modalType: action.modalType, modalProps: action.modalProps }));
+ return pushModal(state, action.modalType, action.modalProps);
case MODAL_CLOSE:
- return (action.modalType === undefined || action.modalType === state.getIn([0, 'modalType'])) ? state.shift() : state;
+ return popModal(state, action);
case COMPOSE_UPLOAD_CHANGE_SUCCESS:
- return state.getIn([0, 'modalType']) === 'FOCAL_POINT' ? state.shift() : state;
+ return popModal(state, { modalType: 'FOCAL_POINT', ignoreFocus: false });
case TIMELINE_DELETE:
- return state.filterNot((modal) => modal.get('modalProps').statusId === action.id);
+ return state.update('stack', stack => stack.filterNot((modal) => modal.get('modalProps').statusId === action.id));
default:
return state;
}
diff --git a/app/javascript/flavours/glitch/reducers/reports.js b/app/javascript/flavours/glitch/reducers/reports.js
deleted file mode 100644
index 1f7f3f273..000000000
--- a/app/javascript/flavours/glitch/reducers/reports.js
+++ /dev/null
@@ -1,77 +0,0 @@
-import {
- REPORT_INIT,
- REPORT_SUBMIT_REQUEST,
- REPORT_SUBMIT_SUCCESS,
- REPORT_SUBMIT_FAIL,
- REPORT_CANCEL,
- REPORT_STATUS_TOGGLE,
- REPORT_COMMENT_CHANGE,
- REPORT_FORWARD_CHANGE,
-} from 'flavours/glitch/actions/reports';
-import {
- TIMELINE_DELETE,
-} from 'flavours/glitch/actions/timelines';
-import { Map as ImmutableMap, Set as ImmutableSet } from 'immutable';
-
-const initialState = ImmutableMap({
- new: ImmutableMap({
- isSubmitting: false,
- account_id: null,
- status_ids: ImmutableSet(),
- comment: '',
- forward: false,
- }),
-});
-
-const deleteStatus = (state, id, references) => {
- references.forEach(ref => {
- state = deleteStatus(state, ref[0], []);
- });
-
- return state.updateIn(['new', 'status_ids'], ImmutableSet(), set => set.remove(id));
-};
-
-export default function reports(state = initialState, action) {
- switch(action.type) {
- case REPORT_INIT:
- return state.withMutations(map => {
- map.setIn(['new', 'isSubmitting'], false);
- map.setIn(['new', 'account_id'], action.account.get('id'));
-
- if (state.getIn(['new', 'account_id']) !== action.account.get('id')) {
- map.setIn(['new', 'status_ids'], action.status ? ImmutableSet([action.status.getIn(['reblog', 'id'], action.status.get('id'))]) : ImmutableSet());
- map.setIn(['new', 'comment'], '');
- } else if (action.status) {
- map.updateIn(['new', 'status_ids'], ImmutableSet(), set => set.add(action.status.getIn(['reblog', 'id'], action.status.get('id'))));
- }
- });
- case REPORT_STATUS_TOGGLE:
- return state.updateIn(['new', 'status_ids'], ImmutableSet(), set => {
- if (action.checked) {
- return set.add(action.statusId);
- }
-
- return set.remove(action.statusId);
- });
- case REPORT_COMMENT_CHANGE:
- return state.setIn(['new', 'comment'], action.comment);
- case REPORT_FORWARD_CHANGE:
- return state.setIn(['new', 'forward'], action.forward);
- case REPORT_SUBMIT_REQUEST:
- return state.setIn(['new', 'isSubmitting'], true);
- case REPORT_SUBMIT_FAIL:
- return state.setIn(['new', 'isSubmitting'], false);
- case REPORT_CANCEL:
- case REPORT_SUBMIT_SUCCESS:
- return state.withMutations(map => {
- map.setIn(['new', 'account_id'], null);
- map.setIn(['new', 'status_ids'], ImmutableSet());
- map.setIn(['new', 'comment'], '');
- map.setIn(['new', 'isSubmitting'], false);
- });
- case TIMELINE_DELETE:
- return deleteStatus(state, action.id, action.references);
- default:
- return state;
- }
-};
diff --git a/app/javascript/flavours/glitch/reducers/rules.js b/app/javascript/flavours/glitch/reducers/rules.js
new file mode 100644
index 000000000..6cc2230bc
--- /dev/null
+++ b/app/javascript/flavours/glitch/reducers/rules.js
@@ -0,0 +1,13 @@
+import { RULES_FETCH_SUCCESS } from 'flavours/glitch/actions/rules';
+import { List as ImmutableList, fromJS } from 'immutable';
+
+const initialState = ImmutableList();
+
+export default function rules(state = initialState, action) {
+ switch (action.type) {
+ case RULES_FETCH_SUCCESS:
+ return fromJS(action.rules);
+ default:
+ return state;
+ }
+}
diff --git a/app/javascript/flavours/glitch/reducers/settings.js b/app/javascript/flavours/glitch/reducers/settings.js
index a53d34a83..676a1ccc1 100644
--- a/app/javascript/flavours/glitch/reducers/settings.js
+++ b/app/javascript/flavours/glitch/reducers/settings.js
@@ -40,6 +40,8 @@ const initialState = ImmutableMap({
mention: false,
poll: false,
status: false,
+ update: false,
+ 'admin.sign_up': false,
}),
quickFilter: ImmutableMap({
@@ -59,6 +61,8 @@ const initialState = ImmutableMap({
mention: true,
poll: true,
status: true,
+ update: true,
+ 'admin.sign_up': true,
}),
sounds: ImmutableMap({
@@ -69,6 +73,8 @@ const initialState = ImmutableMap({
mention: true,
poll: true,
status: true,
+ update: true,
+ 'admin.sign_up': true,
}),
}),
diff --git a/app/javascript/flavours/glitch/styles/accounts.scss b/app/javascript/flavours/glitch/styles/accounts.scss
index 56b143fe6..a3bfb0507 100644
--- a/app/javascript/flavours/glitch/styles/accounts.scss
+++ b/app/javascript/flavours/glitch/styles/accounts.scss
@@ -333,7 +333,8 @@
}
.batch-table__row--muted .pending-account__header,
-.batch-table__row--muted .accounts-table {
+.batch-table__row--muted .accounts-table,
+.batch-table__row--muted .name-tag {
&,
a,
strong {
@@ -341,6 +342,10 @@
}
}
+.batch-table__row--muted .name-tag .avatar {
+ opacity: 0.5;
+}
+
.batch-table__row--muted .accounts-table {
tbody td.accounts-table__extra,
&__count,
@@ -354,7 +359,8 @@
}
.batch-table__row--attention .pending-account__header,
-.batch-table__row--attention .accounts-table {
+.batch-table__row--attention .accounts-table,
+.batch-table__row--attention .name-tag {
&,
a,
strong {
diff --git a/app/javascript/flavours/glitch/styles/admin.scss b/app/javascript/flavours/glitch/styles/admin.scss
index 92061585a..27be22f1b 100644
--- a/app/javascript/flavours/glitch/styles/admin.scss
+++ b/app/javascript/flavours/glitch/styles/admin.scss
@@ -322,6 +322,10 @@ $content-width: 840px;
& > ul {
display: none;
+
+ &.visible {
+ display: block;
+ }
}
ul a,
@@ -363,6 +367,21 @@ body,
}
}
+ .positive-hint,
+ .negative-hint,
+ .neutral-hint {
+ a {
+ color: inherit;
+ text-decoration: underline;
+
+ &:focus,
+ &:hover,
+ &:active {
+ text-decoration: none;
+ }
+ }
+ }
+
.positive-hint {
color: $valid-value-color;
font-weight: 500;
@@ -594,12 +613,16 @@ body,
}
.log-entry {
+ display: block;
line-height: 20px;
padding: 15px;
padding-left: 15px * 2 + 40px;
background: $ui-base-color;
border-bottom: 1px solid darken($ui-base-color, 8%);
position: relative;
+ text-decoration: none;
+ color: $darker-text-color;
+ font-size: 14px;
&:first-child {
border-top-left-radius: 4px;
@@ -612,15 +635,12 @@ body,
border-bottom: 0;
}
- &:hover {
+ &:hover,
+ &:focus,
+ &:active {
background: lighten($ui-base-color, 4%);
}
- &__header {
- color: $darker-text-color;
- font-size: 14px;
- }
-
&__avatar {
position: absolute;
left: 15px;
@@ -899,6 +919,14 @@ a.name-tag,
text-align: center;
}
+.applications-list__item {
+ padding: 15px 0;
+ background: $ui-base-color;
+ border: 1px solid lighten($ui-base-color, 4%);
+ border-radius: 4px;
+ margin-top: 15px;
+}
+
.announcements-list {
border: 1px solid lighten($ui-base-color, 4%);
border-radius: 4px;
@@ -918,6 +946,12 @@ a.name-tag,
text-decoration: none;
margin-bottom: 10px;
+ .account-role {
+ vertical-align: middle;
+ }
+ }
+
+ a.announcements-list__item__title {
&:hover,
&:focus,
&:active {
@@ -936,6 +970,10 @@ a.name-tag,
align-items: center;
}
+ &__permissions {
+ margin-top: 10px;
+ }
+
&:last-child {
border-bottom: 0;
}
@@ -1203,12 +1241,21 @@ a.sparkline {
}
}
}
+
+ @media screen and (max-width: 930px) {
+ grid-template-columns: minmax(0, 1fr);
+ }
}
.account-card {
background: $ui-base-color;
border-radius: 4px;
+ &__permalink {
+ color: inherit;
+ text-decoration: none;
+ }
+
&__header {
padding: 4px;
border-radius: 4px;
@@ -1225,20 +1272,22 @@ a.sparkline {
}
&__title {
- margin-top: -25px;
+ margin-top: -(15px + 8px);
display: flex;
align-items: flex-end;
&__avatar {
- padding: 15px;
+ padding: 14px;
- img {
+ img,
+ .account__avatar {
display: block;
margin: 0;
width: 56px;
height: 56px;
- background: darken($ui-base-color, 8%);
+ background-color: darken($ui-base-color, 8%);
border-radius: 8px;
+ border: 1px solid $ui-base-color;
}
}
@@ -1246,44 +1295,77 @@ a.sparkline {
color: $darker-text-color;
padding-bottom: 15px;
font-size: 15px;
+ line-height: 20px;
bdi {
display: block;
color: $primary-text-color;
- font-weight: 500;
+ font-weight: 700;
}
}
}
&__bio {
padding: 0 15px;
+ margin: 8px 0;
overflow: hidden;
text-overflow: ellipsis;
word-wrap: break-word;
- max-height: 18px * 2;
+ max-height: 21px * 2;
position: relative;
+ font-size: 15px;
+ line-height: 21px;
&::after {
display: block;
content: "";
width: 50px;
- height: 18px;
+ height: 21px;
position: absolute;
bottom: 0;
right: 15px;
background: linear-gradient(to left, $ui-base-color, transparent);
pointer-events: none;
}
+
+ a {
+ color: $secondary-text-color;
+ text-decoration: none;
+ unicode-bidi: isolate;
+
+ &:hover {
+ text-decoration: underline;
+ }
+
+ &.mention {
+ &:hover {
+ text-decoration: none;
+
+ span {
+ text-decoration: underline;
+ }
+ }
+ }
+ }
}
&__actions {
display: flex;
+ justify-content: space-between;
align-items: center;
- padding-top: 10px;
&__button {
- flex: 0 0 auto;
+ flex-shrink: 1;
padding: 0 15px;
+ overflow: hidden;
+
+ .button {
+ min-width: 0;
+ white-space: nowrap;
+ text-overflow: ellipsis;
+ overflow: hidden;
+ max-width: 100%;
+ }
}
}
@@ -1292,19 +1374,23 @@ a.sparkline {
display: grid;
grid-auto-columns: minmax(0, 1fr);
grid-auto-flow: column;
+ max-width: 340px;
+ min-width: 65px * 3;
&__item {
- padding: 15px;
+ padding: 15px 0;
text-align: center;
color: $primary-text-color;
font-weight: 600;
font-size: 15px;
+ line-height: 21px;
small {
display: block;
color: $darker-text-color;
font-weight: 400;
font-size: 13px;
+ line-height: 18px;
}
}
}
@@ -1350,16 +1436,20 @@ a.sparkline {
line-height: 20px;
margin-bottom: 4px;
- .username a {
+ .username {
color: $primary-text-color;
font-weight: 500;
- text-decoration: none;
margin-right: 5px;
- &:hover,
- &:focus,
- &:active {
- text-decoration: underline;
+ a {
+ color: inherit;
+ text-decoration: none;
+
+ &:hover,
+ &:focus,
+ &:active {
+ text-decoration: underline;
+ }
}
}
@@ -1410,8 +1500,9 @@ a.sparkline {
}
&__button {
+ box-sizing: border-box;
flex: 0 0 auto;
- width: 100px;
+ width: 200px;
padding: 15px;
padding-right: 0;
@@ -1427,4 +1518,147 @@ a.sparkline {
color: $dark-text-color;
}
}
+
+ @media screen and (max-width: 800px) {
+ border: 0;
+
+ &__item {
+ flex-direction: column;
+ border: 0;
+
+ &__button {
+ width: 100%;
+ padding: 15px 0;
+ }
+
+ &__description {
+ padding: 0;
+ padding-bottom: 15px;
+ }
+ }
+ }
+}
+
+.section-skip-link {
+ float: right;
+
+ a {
+ color: $ui-highlight-color;
+ text-decoration: none;
+
+ &:hover,
+ &:focus,
+ &:active {
+ text-decoration: underline;
+ }
+ }
+}
+
+.strike-card {
+ padding: 15px;
+ border-radius: 4px;
+ background: $ui-base-color;
+ font-size: 15px;
+ line-height: 20px;
+ word-wrap: break-word;
+ font-weight: 400;
+ color: $primary-text-color;
+ box-sizing: border-box;
+ min-height: 100%;
+
+ p {
+ margin-bottom: 20px;
+ unicode-bidi: plaintext;
+
+ &:last-child {
+ margin-bottom: 0;
+ }
+
+ strong {
+ font-weight: 700;
+ }
+ }
+
+ &__rules {
+ list-style: disc;
+ padding-left: 15px;
+ margin-bottom: 20px;
+ color: $darker-text-color;
+
+ &:last-child {
+ margin-bottom: 0;
+ }
+
+ &__text {
+ color: $primary-text-color;
+ }
+ }
+
+ &__statuses-list {
+ border-radius: 4px;
+ border: 1px solid darken($ui-base-color, 8%);
+ font-size: 13px;
+ line-height: 18px;
+ overflow: hidden;
+
+ &__item {
+ padding: 16px;
+ background: lighten($ui-base-color, 2%);
+ border-bottom: 1px solid darken($ui-base-color, 8%);
+
+ &:last-child {
+ border-bottom: 0;
+ }
+
+ &__meta {
+ color: $darker-text-color;
+ }
+
+ a {
+ color: inherit;
+ text-decoration: none;
+
+ &:hover,
+ &:focus,
+ &:active {
+ text-decoration: underline;
+ }
+ }
+ }
+ }
+}
+
+.availability-indicator {
+ display: flex;
+ align-items: center;
+ margin-bottom: 30px;
+ font-size: 14px;
+ line-height: 21px;
+
+ &__hint {
+ padding: 0 15px;
+ }
+
+ &__graphic {
+ display: flex;
+ margin: 0 -2px;
+
+ &__item {
+ display: block;
+ flex: 0 0 auto;
+ width: 4px;
+ height: 21px;
+ background: lighten($ui-base-color, 8%);
+ margin: 0 2px;
+ border-radius: 2px;
+
+ &.positive {
+ background: $valid-value-color;
+ }
+
+ &.negative {
+ background: $error-value-color;
+ }
+ }
+ }
}
diff --git a/app/javascript/flavours/glitch/styles/components/composer.scss b/app/javascript/flavours/glitch/styles/components/composer.scss
index fd62bb651..96ea096e1 100644
--- a/app/javascript/flavours/glitch/styles/components/composer.scss
+++ b/app/javascript/flavours/glitch/styles/components/composer.scss
@@ -425,54 +425,12 @@
background-repeat: no-repeat;
overflow: hidden;
- textarea {
- display: block;
- position: absolute;
- box-sizing: border-box;
- bottom: 0;
- left: 0;
- margin: 0;
- border: 0;
- padding: 10px;
- width: 100%;
- color: $secondary-text-color;
- background: linear-gradient(0deg, rgba($base-shadow-color, 0.8) 0, rgba($base-shadow-color, 0.35) 80%, transparent);
- font-size: 14px;
- font-family: inherit;
- font-weight: 500;
- opacity: 0;
- z-index: 2;
- transition: opacity .1s ease;
-
- &:focus { color: $white }
-
- &::placeholder {
- opacity: 0.54;
- color: $secondary-text-color;
- }
- }
-
& > .close { mix-blend-mode: difference }
}
- &.active {
- & > div {
- textarea { opacity: 1 }
- }
- }
-}
-
-.composer--upload_form--actions {
- background: linear-gradient(180deg, rgba($base-shadow-color, 0.8) 0, rgba($base-shadow-color, 0.35) 80%, transparent);
- display: flex;
- align-items: flex-start;
- justify-content: space-between;
- opacity: 0;
- transition: opacity .1s ease;
-
.icon-button {
flex: 0 1 auto;
- color: $ui-secondary-color;
+ color: $secondary-text-color;
font-size: 14px;
font-weight: 500;
padding: 10px;
@@ -481,15 +439,28 @@
&:hover,
&:focus,
&:active {
- color: lighten($ui-secondary-color, 4%);
+ color: lighten($secondary-text-color, 7%);
}
}
- &.active {
- opacity: 1;
+ &__warning {
+ position: absolute;
+ z-index: 2;
+ bottom: 0;
+ left: 0;
+ right: 0;
+ box-sizing: border-box;
+ background: linear-gradient(0deg, rgba($base-shadow-color, 0.8) 0, rgba($base-shadow-color, 0.35) 80%, transparent);
}
}
+.composer--upload_form--actions {
+ background: linear-gradient(180deg, rgba($base-shadow-color, 0.8) 0, rgba($base-shadow-color, 0.35) 80%, transparent);
+ display: flex;
+ align-items: flex-start;
+ justify-content: space-between;
+}
+
.composer--upload_form--progress {
display: flex;
padding: 10px;
@@ -652,14 +623,14 @@
& > .primary {
display: inline-block;
margin: 0;
- padding: 0 10px;
+ padding: 7px 10px;
text-align: center;
}
& > .side_arm {
display: inline-block;
margin: 0 2px;
- padding: 0;
+ padding: 7px 0;
width: 36px;
text-align: center;
}
diff --git a/app/javascript/flavours/glitch/styles/components/directory.scss b/app/javascript/flavours/glitch/styles/components/directory.scss
index b0ad5a88a..b48c6c102 100644
--- a/app/javascript/flavours/glitch/styles/components/directory.scss
+++ b/app/javascript/flavours/glitch/styles/components/directory.scss
@@ -1,133 +1,17 @@
-.directory {
- &__list {
- width: 100%;
- margin: 10px 0;
- transition: opacity 100ms ease-in;
+.scrollable .account-card {
+ margin: 10px;
+ background: lighten($ui-base-color, 8%);
+}
- &.loading {
- opacity: 0.7;
- }
-
- @media screen and (max-width: $no-gap-breakpoint) {
- margin: 0;
- }
+.scrollable .account-card__title__avatar {
+ img,
+ .account__avatar {
+ border-color: lighten($ui-base-color, 8%);
}
+}
- &__card {
- box-sizing: border-box;
- margin-bottom: 10px;
-
- &__img {
- height: 125px;
- position: relative;
- background: darken($ui-base-color, 12%);
- overflow: hidden;
-
- img {
- display: block;
- width: 100%;
- height: 100%;
- margin: 0;
- object-fit: cover;
- }
- }
-
- &__bar {
- display: flex;
- align-items: center;
- background: lighten($ui-base-color, 4%);
- padding: 10px;
-
- &__name {
- flex: 1 1 auto;
- display: flex;
- align-items: center;
- text-decoration: none;
- overflow: hidden;
- }
-
- &__relationship {
- width: 23px;
- min-height: 1px;
- flex: 0 0 auto;
- }
-
- .avatar {
- flex: 0 0 auto;
- width: 48px;
- height: 48px;
- padding-top: 2px;
-
- img {
- width: 100%;
- height: 100%;
- display: block;
- margin: 0;
- border-radius: 4px;
- background: darken($ui-base-color, 8%);
- object-fit: cover;
- }
- }
-
- .display-name {
- margin-left: 15px;
- text-align: left;
-
- strong {
- font-size: 15px;
- color: $primary-text-color;
- font-weight: 500;
- overflow: hidden;
- text-overflow: ellipsis;
- }
-
- span {
- display: block;
- font-size: 14px;
- color: $darker-text-color;
- font-weight: 400;
- overflow: hidden;
- text-overflow: ellipsis;
- }
- }
- }
-
- &__extra {
- background: $ui-base-color;
- display: flex;
- align-items: center;
- justify-content: center;
-
- .accounts-table__count {
- width: 33.33%;
- flex: 0 0 auto;
- padding: 15px 0;
- }
-
- .account__header__content {
- box-sizing: border-box;
- padding: 15px 10px;
- border-bottom: 1px solid lighten($ui-base-color, 8%);
- width: 100%;
- min-height: 18px + 30px;
- white-space: nowrap;
- overflow: hidden;
- text-overflow: ellipsis;
-
- p {
- display: none;
-
- &:first-child {
- display: inline;
- }
- }
-
- br {
- display: none;
- }
- }
- }
- }
+.scrollable .account-card__bio::after {
+ background: linear-gradient(to left, lighten($ui-base-color, 8%), transparent);
}
.filter-form {
@@ -135,6 +19,7 @@
&__column {
padding: 10px 15px;
+ padding-bottom: 0;
}
.radio-button {
diff --git a/app/javascript/flavours/glitch/styles/components/index.scss b/app/javascript/flavours/glitch/styles/components/index.scss
index 2656890d7..016e31c63 100644
--- a/app/javascript/flavours/glitch/styles/components/index.scss
+++ b/app/javascript/flavours/glitch/styles/components/index.scss
@@ -41,16 +41,14 @@
cursor: pointer;
display: inline-block;
font-family: inherit;
- font-size: 14px;
+ font-size: 15px;
font-weight: 500;
- height: 36px;
letter-spacing: 0;
- line-height: 36px;
+ line-height: 22px;
overflow: hidden;
- padding: 0 16px;
+ padding: 7px 18px;
position: relative;
text-align: center;
- text-transform: uppercase;
text-decoration: none;
text-overflow: ellipsis;
transition: all 100ms ease-in;
@@ -82,17 +80,6 @@
cursor: default;
}
- &.button-primary,
- &.button-alternative,
- &.button-secondary,
- &.button-alternative-2 {
- font-size: 16px;
- line-height: 36px;
- height: auto;
- text-transform: none;
- padding: 4px 16px;
- }
-
&.button-alternative {
color: $inverted-text-color;
background: $ui-primary-color;
@@ -121,8 +108,7 @@
color: $darker-text-color;
text-transform: none;
background: transparent;
- padding: 3px 15px;
- border-radius: 4px;
+ padding: 6px 17px;
border: 1px solid $ui-primary-color;
&:active,
@@ -160,6 +146,11 @@
transition-property: background-color, color;
text-decoration: none;
+ a {
+ color: inherit;
+ text-decoration: none;
+ }
+
&:hover,
&:active,
&:focus {
@@ -500,8 +491,47 @@
box-shadow: 2px 4px 15px rgba($base-shadow-color, 0.4);
z-index: 9999;
- ul {
- list-style: none;
+ &__text-button {
+ display: inline;
+ color: inherit;
+ background: transparent;
+ border: 0;
+ margin: 0;
+ padding: 0;
+ font-family: inherit;
+ font-size: inherit;
+ line-height: inherit;
+
+ &:focus {
+ outline: 1px dotted;
+ }
+ }
+
+ &__container {
+ &__header {
+ border-bottom: 1px solid darken($ui-secondary-color, 8%);
+ padding: 4px 14px;
+ padding-bottom: 8px;
+ font-size: 13px;
+ line-height: 18px;
+ color: $inverted-text-color;
+ }
+
+ &__list {
+ list-style: none;
+
+ &--scrollable {
+ max-height: 300px;
+ overflow-y: scroll;
+ }
+ }
+
+ &--loading {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ padding: 30px 45px;
+ }
}
}
@@ -541,18 +571,29 @@
}
.dropdown-menu__item {
- a {
- font-size: 13px;
- line-height: 18px;
+ font-size: 13px;
+ line-height: 18px;
+ display: block;
+ color: $inverted-text-color;
+
+ a,
+ button {
+ font-family: inherit;
+ font-size: inherit;
+ line-height: inherit;
display: block;
+ width: 100%;
padding: 4px 14px;
+ border: 0;
+ margin: 0;
box-sizing: border-box;
text-decoration: none;
background: $ui-secondary-color;
- color: $inverted-text-color;
+ color: inherit;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
+ text-align: inherit;
&:focus,
&:hover,
@@ -564,6 +605,42 @@
}
}
+.dropdown-menu__item--text {
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ padding: 4px 14px;
+}
+
+.dropdown-menu__item.edited-timestamp__history__item {
+ border-bottom: 1px solid darken($ui-secondary-color, 8%);
+
+ &:last-child {
+ border-bottom: 0;
+ }
+
+ &.dropdown-menu__item--text,
+ a,
+ button {
+ padding: 8px 14px;
+ }
+}
+
+.inline-account {
+ display: inline-flex;
+ align-items: center;
+ vertical-align: top;
+
+ .account__avatar {
+ margin-right: 5px;
+ border-radius: 50%;
+ }
+
+ strong {
+ font-weight: 600;
+ }
+}
+
.dropdown--active .dropdown__content {
display: block;
line-height: 18px;
@@ -1229,36 +1306,48 @@ button.icon-button.active i.fa-retweet {
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
+ display: flex;
+ align-items: center;
+ justify-content: center;
+}
- span {
- display: block;
- float: left;
- transform: translateX(-50%);
- margin: 82px 0 0 50%;
- white-space: nowrap;
+.circular-progress {
+ color: lighten($ui-base-color, 26%);
+ animation: 1.4s linear 0s infinite normal none running simple-rotate;
+
+ circle {
+ stroke: currentColor;
+ stroke-dasharray: 80px, 200px;
+ stroke-dashoffset: 0;
+ animation: circular-progress 1.4s ease-in-out infinite;
}
}
-.loading-indicator__figure {
- position: absolute;
- top: 50%;
- left: 50%;
- transform: translate(-50%, -50%);
- width: 42px;
- height: 42px;
- box-sizing: border-box;
- background-color: transparent;
- border: 0 solid lighten($ui-base-color, 26%);
- border-width: 6px;
- border-radius: 50%;
+@keyframes circular-progress {
+ 0% {
+ stroke-dasharray: 1px, 200px;
+ stroke-dashoffset: 0;
+ }
+
+ 50% {
+ stroke-dasharray: 100px, 200px;
+ stroke-dashoffset: -15px;
+ }
+
+ 100% {
+ stroke-dasharray: 100px, 200px;
+ stroke-dashoffset: -125px;
+ }
}
-.no-reduce-motion .loading-indicator span {
- animation: loader-label 1.15s infinite cubic-bezier(0.215, 0.610, 0.355, 1.000);
-}
+@keyframes simple-rotate {
+ 0% {
+ transform: rotate(0deg);
+ }
-.no-reduce-motion .loading-indicator__figure {
- animation: loader-figure 1.15s infinite cubic-bezier(0.215, 0.610, 0.355, 1.000);
+ 100% {
+ transform: rotate(360deg);
+ }
}
@keyframes spring-rotate-in {
@@ -1305,40 +1394,6 @@ button.icon-button.active i.fa-retweet {
}
}
-@keyframes loader-figure {
- 0% {
- width: 0;
- height: 0;
- background-color: lighten($ui-base-color, 26%);
- }
-
- 29% {
- background-color: lighten($ui-base-color, 26%);
- }
-
- 30% {
- width: 42px;
- height: 42px;
- background-color: transparent;
- border-width: 21px;
- opacity: 1;
- }
-
- 100% {
- width: 42px;
- height: 42px;
- border-width: 0;
- opacity: 0;
- background-color: transparent;
- }
-}
-
-@keyframes loader-label {
- 0% { opacity: 0.25; }
- 30% { opacity: 1; }
- 100% { opacity: 0.25; }
-}
-
.spoiler-button {
top: 0;
left: 0;
diff --git a/app/javascript/flavours/glitch/styles/components/modal.scss b/app/javascript/flavours/glitch/styles/components/modal.scss
index cb776e88f..61c292b19 100644
--- a/app/javascript/flavours/glitch/styles/components/modal.scss
+++ b/app/javascript/flavours/glitch/styles/components/modal.scss
@@ -420,7 +420,8 @@
.report-modal,
.actions-modal,
.mute-modal,
-.block-modal {
+.block-modal,
+.compare-history-modal {
background: lighten($ui-secondary-color, 8%);
color: $inverted-text-color;
border-radius: 8px;
@@ -536,6 +537,201 @@
max-width: 700px;
}
+.report-dialog-modal {
+ max-width: 90vw;
+ width: 480px;
+ height: 80vh;
+ background: lighten($ui-secondary-color, 8%);
+ color: $inverted-text-color;
+ border-radius: 8px;
+ overflow: hidden;
+ position: relative;
+ flex-direction: column;
+ display: flex;
+
+ &__container {
+ box-sizing: border-box;
+ border-top: 1px solid $ui-secondary-color;
+ padding: 20px;
+ flex-grow: 1;
+ display: flex;
+ flex-direction: column;
+ min-height: 0;
+ overflow: auto;
+ }
+
+ &__title {
+ font-size: 28px;
+ line-height: 33px;
+ font-weight: 700;
+ margin-bottom: 15px;
+
+ @media screen and (max-height: 800px) {
+ font-size: 22px;
+ }
+ }
+
+ &__subtitle {
+ font-size: 17px;
+ font-weight: 600;
+ line-height: 22px;
+ margin-bottom: 4px;
+ }
+
+ &__lead {
+ font-size: 17px;
+ line-height: 22px;
+ color: lighten($inverted-text-color, 16%);
+ margin-bottom: 30px;
+ }
+
+ &__actions {
+ margin-top: 30px;
+ display: flex;
+
+ .button {
+ flex: 1 1 auto;
+ }
+ }
+
+ &__statuses {
+ flex-grow: 1;
+ min-height: 0;
+ overflow: auto;
+ }
+
+ .status__content a {
+ color: $highlight-text-color;
+ }
+
+ .status__content,
+ .status__content p {
+ color: $inverted-text-color;
+ }
+
+ .status__content__spoiler-link {
+ color: $primary-text-color;
+ background: $ui-primary-color;
+
+ &:hover {
+ background: lighten($ui-primary-color, 8%);
+ }
+ }
+
+ .dialog-option .poll__input {
+ border-color: $inverted-text-color;
+ color: $ui-secondary-color;
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+
+ svg {
+ width: 8px;
+ height: auto;
+ }
+
+ &:active,
+ &:focus,
+ &:hover {
+ border-color: lighten($inverted-text-color, 15%);
+ border-width: 4px;
+ }
+
+ &.active {
+ border-color: $inverted-text-color;
+ background: $inverted-text-color;
+ }
+ }
+
+ .poll__option.dialog-option {
+ padding: 15px 0;
+ flex: 0 0 auto;
+ border-bottom: 1px solid $ui-secondary-color;
+
+ &:last-child {
+ border-bottom: 0;
+ }
+
+ & > .poll__option__text {
+ font-size: 13px;
+ color: lighten($inverted-text-color, 16%);
+
+ strong {
+ font-size: 17px;
+ font-weight: 500;
+ line-height: 22px;
+ color: $inverted-text-color;
+ display: block;
+ margin-bottom: 4px;
+
+ &:last-child {
+ margin-bottom: 0;
+ }
+ }
+ }
+ }
+
+ .flex-spacer {
+ background: transparent;
+ }
+
+ &__textarea {
+ display: block;
+ box-sizing: border-box;
+ width: 100%;
+ margin: 0;
+ color: $inverted-text-color;
+ background: $simple-background-color;
+ padding: 10px;
+ font-family: inherit;
+ font-size: 17px;
+ line-height: 22px;
+ resize: vertical;
+ border: 0;
+ outline: 0;
+ border-radius: 4px;
+ margin: 20px 0;
+
+ &::placeholder {
+ color: $dark-text-color;
+ }
+
+ &:focus {
+ outline: 0;
+ }
+ }
+
+ &__toggle {
+ display: flex;
+ align-items: center;
+
+ & > span {
+ font-size: 17px;
+ font-weight: 500;
+ margin-left: 10px;
+ }
+ }
+
+ .button.button-secondary {
+ border-color: $inverted-text-color;
+ color: $inverted-text-color;
+ flex: 0 0 auto;
+
+ &:hover,
+ &:focus,
+ &:active {
+ border-color: lighten($inverted-text-color, 15%);
+ color: lighten($inverted-text-color, 15%);
+ }
+ }
+
+ hr {
+ border: 0;
+ background: transparent;
+ margin: 15px 0;
+ }
+}
+
.report-modal__container {
display: flex;
border-top: 1px solid $ui-secondary-color;
@@ -854,6 +1050,47 @@
}
}
+.compare-history-modal {
+ .report-modal__target {
+ border-bottom: 1px solid $ui-secondary-color;
+ }
+
+ &__container {
+ padding: 30px;
+ pointer-events: all;
+ }
+
+ .status__content {
+ color: $inverted-text-color;
+ font-size: 19px;
+ line-height: 24px;
+
+ .emojione {
+ width: 24px;
+ height: 24px;
+ margin: -1px 0 0;
+ }
+
+ a {
+ color: $highlight-text-color;
+ }
+
+ hr {
+ height: 0.25rem;
+ padding: 0;
+ background-color: $ui-secondary-color;
+ border: 0;
+ margin: 20px 0;
+ }
+ }
+
+ .media-gallery,
+ .audio-player,
+ .video-player {
+ margin-top: 15px;
+ }
+}
+
.embed-modal {
width: auto;
max-width: 80vw;
diff --git a/app/javascript/flavours/glitch/styles/components/single_column.scss b/app/javascript/flavours/glitch/styles/components/single_column.scss
index edf705b5f..db510f1f4 100644
--- a/app/javascript/flavours/glitch/styles/components/single_column.scss
+++ b/app/javascript/flavours/glitch/styles/components/single_column.scss
@@ -94,17 +94,7 @@
padding: 0;
}
- .directory__list {
- display: grid;
- grid-gap: 10px;
- grid-template-columns: minmax(0, 50%) minmax(0, 50%);
-
- @media screen and (max-width: $no-gap-breakpoint) {
- display: block;
- }
- }
-
- .directory__card {
+ .account-card {
margin-bottom: 0;
}
diff --git a/app/javascript/flavours/glitch/styles/components/status.scss b/app/javascript/flavours/glitch/styles/components/status.scss
index 013b1bd25..0d7dfd64d 100644
--- a/app/javascript/flavours/glitch/styles/components/status.scss
+++ b/app/javascript/flavours/glitch/styles/components/status.scss
@@ -198,7 +198,8 @@
.status__content__spoiler-link {
background: lighten($ui-base-color, 30%);
- &:hover {
+ &:hover,
+ &:focus {
background: lighten($ui-base-color, 33%);
text-decoration: none;
}
@@ -222,13 +223,13 @@
background: lighten($ui-base-color, 30%);
border: 0;
color: $inverted-text-color;
- font-weight: 500;
+ font-weight: 700;
font-size: 11px;
padding: 0 5px;
text-transform: uppercase;
line-height: inherit;
cursor: pointer;
- vertical-align: bottom;
+ vertical-align: top;
&:hover {
background: lighten($ui-base-color, 33%);
@@ -517,42 +518,39 @@
justify-content: flex-start;
}
-.status-check-box {
- border-bottom: 1px solid $ui-secondary-color;
- display: flex;
+.status-check-box__status {
+ display: block;
+ box-sizing: border-box;
+ width: 100%;
+ padding: 0 10px;
- .status-check-box__status {
- margin: 10px 0 10px 10px;
- flex: 1;
- overflow: hidden;
+ .detailed-status__display-name {
+ color: lighten($inverted-text-color, 16%);
- .media-gallery {
- max-width: 250px;
+ span {
+ display: inline;
}
- .status__content {
- padding: 0;
- white-space: normal;
- }
-
- .video-player,
- .audio-player {
- margin-top: 8px;
- max-width: 250px;
- }
-
- .media-gallery__item-thumbnail {
- cursor: default;
+ &:hover strong {
+ text-decoration: none;
}
}
-}
-.status-check-box-toggle {
- align-items: center;
- display: flex;
- flex: 0 0 auto;
- justify-content: center;
- padding: 10px;
+ .media-gallery,
+ .audio-player,
+ .video-player {
+ margin-top: 15px;
+ max-width: 250px;
+ }
+
+ .status__content {
+ padding: 0;
+ white-space: normal;
+ }
+
+ .media-gallery__item-thumbnail {
+ cursor: default;
+ }
}
.status__prepend {
@@ -763,7 +761,8 @@ a.status__display-name,
background: $ui-base-lighter-color;
color: $inverted-text-color;
- &:hover {
+ &:hover,
+ &:focus {
background: lighten($ui-base-color, 29%);
text-decoration: none;
}
diff --git a/app/javascript/flavours/glitch/styles/containers.scss b/app/javascript/flavours/glitch/styles/containers.scss
index eb72eab28..98a1288eb 100644
--- a/app/javascript/flavours/glitch/styles/containers.scss
+++ b/app/javascript/flavours/glitch/styles/containers.scss
@@ -1,7 +1,6 @@
.container-alt {
width: 700px;
margin: 0 auto;
- margin-top: 40px;
@media screen and (max-width: 740px) {
width: 100%;
@@ -67,23 +66,21 @@
line-height: 18px;
box-sizing: border-box;
padding: 20px 0;
- padding-bottom: 0;
- margin-bottom: -30px;
margin-top: 40px;
+ margin-bottom: 10px;
+ border-bottom: 1px solid $ui-base-color;
@media screen and (max-width: 440px) {
width: 100%;
margin: 0;
- margin-bottom: 10px;
padding: 20px;
- padding-bottom: 0;
}
.avatar {
width: 40px;
height: 40px;
@include avatar-size(40px);
- margin-right: 8px;
+ margin-right: 10px;
img {
width: 100%;
@@ -98,7 +95,7 @@
.name {
flex: 1 1 auto;
color: $secondary-text-color;
- width: calc(100% - 88px);
+ width: calc(100% - 90px);
.username {
display: block;
@@ -112,7 +109,7 @@
display: block;
font-size: 32px;
line-height: 40px;
- margin-left: 8px;
+ margin-left: 10px;
}
}
@@ -414,14 +411,6 @@
}
}
- .directory__card {
- border-radius: 4px;
-
- @media screen and (max-width: $no-gap-breakpoint) {
- border-radius: 0;
- }
- }
-
.page-header {
@media screen and (max-width: $no-gap-breakpoint) {
border-bottom: 0;
@@ -844,19 +833,21 @@
grid-gap: 10px;
grid-template-columns: minmax(0, 50%) minmax(0, 50%);
+ .account-card {
+ display: flex;
+ flex-direction: column;
+ }
+
@media screen and (max-width: $no-gap-breakpoint) {
display: block;
- }
- .icon-button {
- font-size: 18px;
+ .account-card {
+ margin-bottom: 10px;
+ display: block;
+ }
}
}
- .directory__card {
- margin-bottom: 0;
- }
-
.card-grid {
display: flex;
flex-wrap: wrap;
diff --git a/app/javascript/flavours/glitch/styles/footer.scss b/app/javascript/flavours/glitch/styles/footer.scss
index 00d290883..073ebda7e 100644
--- a/app/javascript/flavours/glitch/styles/footer.scss
+++ b/app/javascript/flavours/glitch/styles/footer.scss
@@ -90,6 +90,20 @@
.column-4 {
display: none;
}
+
+ .column-2 h4 {
+ display: none;
+ }
+ }
+ }
+
+ .legal-xs {
+ display: none;
+ text-align: center;
+ padding-top: 20px;
+
+ @media screen and (max-width: $no-gap-breakpoint) {
+ display: block;
}
}
@@ -105,7 +119,8 @@
}
}
- ul a {
+ ul a,
+ .legal-xs a {
text-decoration: none;
color: lighten($ui-base-color, 34%);
diff --git a/app/javascript/flavours/glitch/styles/forms.scss b/app/javascript/flavours/glitch/styles/forms.scss
index 64d441fb2..e36fab8fa 100644
--- a/app/javascript/flavours/glitch/styles/forms.scss
+++ b/app/javascript/flavours/glitch/styles/forms.scss
@@ -791,9 +791,41 @@ code {
}
}
}
+}
- @media screen and (max-width: 740px) and (min-width: 441px) {
- margin-top: 40px;
+.oauth-prompt {
+ h3 {
+ color: $ui-secondary-color;
+ font-size: 17px;
+ line-height: 22px;
+ font-weight: 500;
+ margin-bottom: 30px;
+ }
+
+ p {
+ font-size: 14px;
+ line-height: 18px;
+ margin-bottom: 30px;
+ }
+
+ .permissions-list {
+ border: 1px solid $ui-base-color;
+ border-radius: 4px;
+ background: darken($ui-base-color, 4%);
+ margin-bottom: 30px;
+ }
+
+ .actions {
+ margin: 0 -10px;
+ display: flex;
+
+ form {
+ box-sizing: border-box;
+ padding: 0 10px;
+ flex: 1 1 auto;
+ min-height: 1px;
+ width: 50%;
+ }
}
}
@@ -1062,3 +1094,39 @@ code {
.simple_form .h-captcha {
text-align: center;
}
+
+.permissions-list {
+ &__item {
+ padding: 15px;
+ color: $ui-secondary-color;
+ border-bottom: 1px solid lighten($ui-base-color, 4%);
+ display: flex;
+ align-items: center;
+
+ &__text {
+ flex: 1 1 auto;
+
+ &__title {
+ font-weight: 500;
+ }
+
+ &__type {
+ color: $darker-text-color;
+ }
+ }
+
+ &__icon {
+ flex: 0 0 auto;
+ font-size: 18px;
+ width: 30px;
+ color: $valid-value-color;
+ display: flex;
+ align-items: center;
+ }
+
+ &:last-child {
+ border-bottom: 0;
+ padding-bottom: 0;
+ }
+ }
+}
diff --git a/app/javascript/flavours/glitch/styles/mastodon-light/diff.scss b/app/javascript/flavours/glitch/styles/mastodon-light/diff.scss
index 8f5309f2b..bb91abdac 100644
--- a/app/javascript/flavours/glitch/styles/mastodon-light/diff.scss
+++ b/app/javascript/flavours/glitch/styles/mastodon-light/diff.scss
@@ -116,7 +116,8 @@
}
.dropdown-menu__item {
- a {
+ a,
+ button {
background: $ui-base-color;
color: $ui-secondary-color;
}
@@ -164,15 +165,15 @@
}
}
-.composer--upload_form--item > div input {
- color: lighten($white, 7%);
-
- &::placeholder {
- color: lighten($white, 10%);
- }
+.dropdown-menu__separator,
+.dropdown-menu__item.edited-timestamp__history__item,
+.dropdown-menu__container__header,
+.compare-history-modal .report-modal__target,
+.report-dialog-modal .poll__option.dialog-option {
+ border-bottom-color: lighten($ui-base-color, 12%);
}
-.dropdown-menu__separator {
+.report-dialog-modal__container {
border-bottom-color: lighten($ui-base-color, 12%);
}
@@ -229,15 +230,22 @@
.mute-modal,
.block-modal,
.report-modal,
+.report-dialog-modal,
.embed-modal,
.error-modal,
.onboarding-modal,
+.compare-history-modal,
.report-modal__comment .setting-text__wrapper,
-.report-modal__comment .setting-text {
+.report-modal__comment .setting-text,
+.report-dialog-modal__textarea {
background: $white;
border: 1px solid lighten($ui-base-color, 8%);
}
+.report-dialog-modal .dialog-option .poll__input {
+ color: $white;
+}
+
.report-modal__comment {
border-right-color: lighten($ui-base-color, 8%);
}
diff --git a/app/javascript/flavours/glitch/styles/polls.scss b/app/javascript/flavours/glitch/styles/polls.scss
index a2cdecf06..0847c8f4c 100644
--- a/app/javascript/flavours/glitch/styles/polls.scss
+++ b/app/javascript/flavours/glitch/styles/polls.scss
@@ -75,7 +75,7 @@
display: none;
}
- .autossugest-input {
+ .autosuggest-input {
flex: 1 1 auto;
}
diff --git a/app/javascript/flavours/glitch/styles/rtl.scss b/app/javascript/flavours/glitch/styles/rtl.scss
index afa05d93e..d0153c9f9 100644
--- a/app/javascript/flavours/glitch/styles/rtl.scss
+++ b/app/javascript/flavours/glitch/styles/rtl.scss
@@ -12,11 +12,6 @@ body.rtl {
margin-left: 10px;
}
- .directory__card__bar .display-name {
- margin-left: 0;
- margin-right: 15px;
- }
-
.display-name {
text-align: right;
}
diff --git a/app/javascript/flavours/glitch/styles/tables.scss b/app/javascript/flavours/glitch/styles/tables.scss
index 12c84a6c9..598c67034 100644
--- a/app/javascript/flavours/glitch/styles/tables.scss
+++ b/app/javascript/flavours/glitch/styles/tables.scss
@@ -65,6 +65,24 @@
}
}
+ &.horizontal-table {
+ border-collapse: collapse;
+ border-style: hidden;
+
+ & > tbody > tr > th,
+ & > tbody > tr > td {
+ padding: 11px 10px;
+ background: transparent;
+ border: 1px solid lighten($ui-base-color, 8%);
+ color: $secondary-text-color;
+ }
+
+ & > tbody > tr > th {
+ color: $darker-text-color;
+ font-weight: 600;
+ }
+ }
+
&.batch-table {
& > thead > tr > th {
background: $ui-base-color;
@@ -210,6 +228,7 @@ a.table-action-link {
&__content {
padding-top: 12px;
padding-bottom: 16px;
+ overflow: hidden;
&--unpadded {
padding: 0;
@@ -292,3 +311,9 @@ a.table-action-link {
}
}
}
+
+.one-liner {
+ white-space: nowrap;
+ overflow: hidden;
+ text-overflow: ellipsis;
+}
diff --git a/app/javascript/flavours/glitch/theme.yml b/app/javascript/flavours/glitch/theme.yml
index ee2b699b2..f3c7fac7e 100644
--- a/app/javascript/flavours/glitch/theme.yml
+++ b/app/javascript/flavours/glitch/theme.yml
@@ -1,7 +1,9 @@
# (REQUIRED) The location of the pack files.
pack:
about: packs/about.js
- admin: packs/admin.js
+ admin:
+ - packs/admin.js
+ - packs/public.js
auth: packs/public.js
common:
filename: packs/common.js
diff --git a/app/javascript/flavours/glitch/util/async-components.js b/app/javascript/flavours/glitch/util/async-components.js
index a6c6ab0ab..8c9630eea 100644
--- a/app/javascript/flavours/glitch/util/async-components.js
+++ b/app/javascript/flavours/glitch/util/async-components.js
@@ -173,3 +173,7 @@ export function Directory () {
export function FollowRecommendations () {
return import(/* webpackChunkName: "features/glitch/async/follow_recommendations" */'flavours/glitch/features/follow_recommendations');
}
+
+export function CompareHistoryModal () {
+ return import(/*webpackChunkName: "flavours/glitch/async/compare_history_modal" */'flavours/glitch/features/ui/components/compare_history_modal');
+}
diff --git a/app/javascript/flavours/vanilla/theme.yml b/app/javascript/flavours/vanilla/theme.yml
index 3263fd7d4..9173d4ec9 100644
--- a/app/javascript/flavours/vanilla/theme.yml
+++ b/app/javascript/flavours/vanilla/theme.yml
@@ -1,7 +1,9 @@
# (REQUIRED) The location of the pack files inside `pack_directory`.
pack:
about: about.js
- admin: admin.js
+ admin:
+ - admin.js
+ - public.js
auth: public.js
common:
filename: common.js
diff --git a/app/javascript/mastodon/actions/compose.js b/app/javascript/mastodon/actions/compose.js
index 7c3bbcbd8..f3129f8d9 100644
--- a/app/javascript/mastodon/actions/compose.js
+++ b/app/javascript/mastodon/actions/compose.js
@@ -70,6 +70,8 @@ export const INIT_MEDIA_EDIT_MODAL = 'INIT_MEDIA_EDIT_MODAL';
export const COMPOSE_CHANGE_MEDIA_DESCRIPTION = 'COMPOSE_CHANGE_MEDIA_DESCRIPTION';
export const COMPOSE_CHANGE_MEDIA_FOCUS = 'COMPOSE_CHANGE_MEDIA_FOCUS';
+export const COMPOSE_SET_STATUS = 'COMPOSE_SET_STATUS';
+
const messages = defineMessages({
uploadErrorLimit: { id: 'upload_error.limit', defaultMessage: 'File upload limit exceeded.' },
uploadErrorPoll: { id: 'upload_error.poll', defaultMessage: 'File upload not allowed with polls.' },
@@ -83,6 +85,15 @@ export const ensureComposeIsVisible = (getState, routerHistory) => {
}
};
+export function setComposeToStatus(status, text, spoiler_text) {
+ return{
+ type: COMPOSE_SET_STATUS,
+ status,
+ text,
+ spoiler_text,
+ };
+};
+
export function changeCompose(text) {
return {
type: COMPOSE_CHANGE,
@@ -137,8 +148,9 @@ export function directCompose(account, routerHistory) {
export function submitCompose(routerHistory) {
return function (dispatch, getState) {
- const status = getState().getIn(['compose', 'text'], '');
- const media = getState().getIn(['compose', 'media_attachments']);
+ const status = getState().getIn(['compose', 'text'], '');
+ const media = getState().getIn(['compose', 'media_attachments']);
+ const statusId = getState().getIn(['compose', 'id'], null);
if ((!status || !status.length) && media.size === 0) {
return;
@@ -146,15 +158,18 @@ export function submitCompose(routerHistory) {
dispatch(submitComposeRequest());
- api(getState).post('/api/v1/statuses', {
- status,
- in_reply_to_id: getState().getIn(['compose', 'in_reply_to'], null),
- media_ids: media.map(item => item.get('id')),
- sensitive: getState().getIn(['compose', 'sensitive']),
- spoiler_text: getState().getIn(['compose', 'spoiler']) ? getState().getIn(['compose', 'spoiler_text'], '') : '',
- visibility: getState().getIn(['compose', 'privacy']),
- poll: getState().getIn(['compose', 'poll'], null),
- }, {
+ api(getState).request({
+ url: statusId === null ? '/api/v1/statuses' : `/api/v1/statuses/${statusId}`,
+ method: statusId === null ? 'post' : 'put',
+ data: {
+ status,
+ in_reply_to_id: getState().getIn(['compose', 'in_reply_to'], null),
+ media_ids: media.map(item => item.get('id')),
+ sensitive: getState().getIn(['compose', 'sensitive']),
+ spoiler_text: getState().getIn(['compose', 'spoiler']) ? getState().getIn(['compose', 'spoiler_text'], '') : '',
+ visibility: getState().getIn(['compose', 'privacy']),
+ poll: getState().getIn(['compose', 'poll'], null),
+ },
headers: {
'Idempotency-Key': getState().getIn(['compose', 'idempotencyKey']),
},
@@ -176,11 +191,11 @@ export function submitCompose(routerHistory) {
}
};
- if (response.data.visibility !== 'direct') {
+ if (statusId === null && response.data.visibility !== 'direct') {
insertIfOnline('home');
}
- if (response.data.in_reply_to_id === null && response.data.visibility === 'public') {
+ if (statusId === null && response.data.in_reply_to_id === null && response.data.visibility === 'public') {
insertIfOnline('community');
if (!response.data.local_only) {
insertIfOnline('public');
diff --git a/app/javascript/mastodon/actions/history.js b/app/javascript/mastodon/actions/history.js
new file mode 100644
index 000000000..c142aaf61
--- /dev/null
+++ b/app/javascript/mastodon/actions/history.js
@@ -0,0 +1,37 @@
+import api from '../api';
+import { importFetchedAccounts } from './importer';
+
+export const HISTORY_FETCH_REQUEST = 'HISTORY_FETCH_REQUEST';
+export const HISTORY_FETCH_SUCCESS = 'HISTORY_FETCH_SUCCESS';
+export const HISTORY_FETCH_FAIL = 'HISTORY_FETCH_FAIL';
+
+export const fetchHistory = statusId => (dispatch, getState) => {
+ const loading = getState().getIn(['history', statusId, 'loading']);
+
+ if (loading) {
+ return;
+ }
+
+ dispatch(fetchHistoryRequest(statusId));
+
+ api(getState).get(`/api/v1/statuses/${statusId}/history`).then(({ data }) => {
+ dispatch(importFetchedAccounts(data.map(x => x.account)));
+ dispatch(fetchHistorySuccess(statusId, data));
+ }).catch(error => dispatch(fetchHistoryFail(error)));
+};
+
+export const fetchHistoryRequest = statusId => ({
+ type: HISTORY_FETCH_REQUEST,
+ statusId,
+});
+
+export const fetchHistorySuccess = (statusId, history) => ({
+ type: HISTORY_FETCH_SUCCESS,
+ statusId,
+ history,
+});
+
+export const fetchHistoryFail = error => ({
+ type: HISTORY_FETCH_FAIL,
+ error,
+});
diff --git a/app/javascript/mastodon/actions/modal.js b/app/javascript/mastodon/actions/modal.js
index 3d0299db5..3e576fab8 100644
--- a/app/javascript/mastodon/actions/modal.js
+++ b/app/javascript/mastodon/actions/modal.js
@@ -9,9 +9,10 @@ export function openModal(type, props) {
};
};
-export function closeModal(type) {
+export function closeModal(type, options = { ignoreFocus: false }) {
return {
type: MODAL_CLOSE,
modalType: type,
+ ignoreFocus: options.ignoreFocus,
};
};
diff --git a/app/javascript/mastodon/actions/notifications.js b/app/javascript/mastodon/actions/notifications.js
index 663cf21e3..00e8d74d7 100644
--- a/app/javascript/mastodon/actions/notifications.js
+++ b/app/javascript/mastodon/actions/notifications.js
@@ -34,7 +34,6 @@ export const NOTIFICATIONS_LOAD_PENDING = 'NOTIFICATIONS_LOAD_PENDING';
export const NOTIFICATIONS_MOUNT = 'NOTIFICATIONS_MOUNT';
export const NOTIFICATIONS_UNMOUNT = 'NOTIFICATIONS_UNMOUNT';
-
export const NOTIFICATIONS_MARK_AS_READ = 'NOTIFICATIONS_MARK_AS_READ';
export const NOTIFICATIONS_SET_BROWSER_SUPPORT = 'NOTIFICATIONS_SET_BROWSER_SUPPORT';
@@ -46,7 +45,7 @@ defineMessages({
});
const fetchRelatedRelationships = (dispatch, notifications) => {
- const accountIds = notifications.filter(item => item.type === 'follow').map(item => item.account.id);
+ const accountIds = notifications.filter(item => ['follow', 'follow_request', 'admin.sign_up'].indexOf(item.type) !== -1).map(item => item.account.id);
if (accountIds.length > 0) {
dispatch(fetchRelationships(accountIds));
@@ -124,7 +123,18 @@ export function updateNotifications(notification, intlMessages, intlLocale) {
const excludeTypesFromSettings = state => state.getIn(['settings', 'notifications', 'shows']).filter(enabled => !enabled).keySeq().toJS();
const excludeTypesFromFilter = filter => {
- const allTypes = ImmutableList(['follow', 'follow_request', 'favourite', 'reblog', 'mention', 'poll']);
+ const allTypes = ImmutableList([
+ 'follow',
+ 'follow_request',
+ 'favourite',
+ 'reblog',
+ 'mention',
+ 'poll',
+ 'status',
+ 'update',
+ 'admin.sign_up',
+ ]);
+
return allTypes.filterNot(item => item === filter).toJS();
};
diff --git a/app/javascript/mastodon/actions/reports.js b/app/javascript/mastodon/actions/reports.js
index afa0c3412..fbe5b3791 100644
--- a/app/javascript/mastodon/actions/reports.js
+++ b/app/javascript/mastodon/actions/reports.js
@@ -1,89 +1,38 @@
import api from '../api';
-import { openModal, closeModal } from './modal';
-
-export const REPORT_INIT = 'REPORT_INIT';
-export const REPORT_CANCEL = 'REPORT_CANCEL';
+import { openModal } from './modal';
export const REPORT_SUBMIT_REQUEST = 'REPORT_SUBMIT_REQUEST';
export const REPORT_SUBMIT_SUCCESS = 'REPORT_SUBMIT_SUCCESS';
export const REPORT_SUBMIT_FAIL = 'REPORT_SUBMIT_FAIL';
-export const REPORT_STATUS_TOGGLE = 'REPORT_STATUS_TOGGLE';
-export const REPORT_COMMENT_CHANGE = 'REPORT_COMMENT_CHANGE';
-export const REPORT_FORWARD_CHANGE = 'REPORT_FORWARD_CHANGE';
+export const initReport = (account, status) => dispatch =>
+ dispatch(openModal('REPORT', {
+ accountId: account.get('id'),
+ statusId: status?.get('id'),
+ }));
-export function initReport(account, status) {
- return dispatch => {
- dispatch({
- type: REPORT_INIT,
- account,
- status,
- });
+export const submitReport = (params, onSuccess, onFail) => (dispatch, getState) => {
+ dispatch(submitReportRequest());
- dispatch(openModal('REPORT'));
- };
+ api(getState).post('/api/v1/reports', params).then(response => {
+ dispatch(submitReportSuccess(response.data));
+ if (onSuccess) onSuccess();
+ }).catch(error => {
+ dispatch(submitReportFail(error));
+ if (onFail) onFail();
+ });
};
-export function cancelReport() {
- return {
- type: REPORT_CANCEL,
- };
-};
+export const submitReportRequest = () => ({
+ type: REPORT_SUBMIT_REQUEST,
+});
-export function toggleStatusReport(statusId, checked) {
- return {
- type: REPORT_STATUS_TOGGLE,
- statusId,
- checked,
- };
-};
+export const submitReportSuccess = report => ({
+ type: REPORT_SUBMIT_SUCCESS,
+ report,
+});
-export function submitReport() {
- return (dispatch, getState) => {
- dispatch(submitReportRequest());
-
- api(getState).post('/api/v1/reports', {
- account_id: getState().getIn(['reports', 'new', 'account_id']),
- status_ids: getState().getIn(['reports', 'new', 'status_ids']),
- comment: getState().getIn(['reports', 'new', 'comment']),
- forward: getState().getIn(['reports', 'new', 'forward']),
- }).then(response => {
- dispatch(closeModal());
- dispatch(submitReportSuccess(response.data));
- }).catch(error => dispatch(submitReportFail(error)));
- };
-};
-
-export function submitReportRequest() {
- return {
- type: REPORT_SUBMIT_REQUEST,
- };
-};
-
-export function submitReportSuccess(report) {
- return {
- type: REPORT_SUBMIT_SUCCESS,
- report,
- };
-};
-
-export function submitReportFail(error) {
- return {
- type: REPORT_SUBMIT_FAIL,
- error,
- };
-};
-
-export function changeReportComment(comment) {
- return {
- type: REPORT_COMMENT_CHANGE,
- comment,
- };
-};
-
-export function changeReportForward(forward) {
- return {
- type: REPORT_FORWARD_CHANGE,
- forward,
- };
-};
+export const submitReportFail = error => ({
+ type: REPORT_SUBMIT_FAIL,
+ error,
+});
diff --git a/app/javascript/mastodon/actions/rules.js b/app/javascript/mastodon/actions/rules.js
new file mode 100644
index 000000000..34e60a121
--- /dev/null
+++ b/app/javascript/mastodon/actions/rules.js
@@ -0,0 +1,27 @@
+import api from '../api';
+
+export const RULES_FETCH_REQUEST = 'RULES_FETCH_REQUEST';
+export const RULES_FETCH_SUCCESS = 'RULES_FETCH_SUCCESS';
+export const RULES_FETCH_FAIL = 'RULES_FETCH_FAIL';
+
+export const fetchRules = () => (dispatch, getState) => {
+ dispatch(fetchRulesRequest());
+
+ api(getState)
+ .get('/api/v1/instance').then(({ data }) => dispatch(fetchRulesSuccess(data.rules)))
+ .catch(err => dispatch(fetchRulesFail(err)));
+};
+
+const fetchRulesRequest = () => ({
+ type: RULES_FETCH_REQUEST,
+});
+
+const fetchRulesSuccess = rules => ({
+ type: RULES_FETCH_SUCCESS,
+ rules,
+});
+
+const fetchRulesFail = error => ({
+ type: RULES_FETCH_FAIL,
+ error,
+});
diff --git a/app/javascript/mastodon/actions/statuses.js b/app/javascript/mastodon/actions/statuses.js
index cd0373544..aa6520fe2 100644
--- a/app/javascript/mastodon/actions/statuses.js
+++ b/app/javascript/mastodon/actions/statuses.js
@@ -2,7 +2,7 @@ import api from '../api';
import { deleteFromTimelines } from './timelines';
import { importFetchedStatus, importFetchedStatuses, importFetchedAccount } from './importer';
-import { ensureComposeIsVisible } from './compose';
+import { ensureComposeIsVisible, setComposeToStatus } from './compose';
export const STATUS_FETCH_REQUEST = 'STATUS_FETCH_REQUEST';
export const STATUS_FETCH_SUCCESS = 'STATUS_FETCH_SUCCESS';
@@ -31,6 +31,10 @@ export const STATUS_HIDE = 'STATUS_HIDE';
export const REDRAFT = 'REDRAFT';
+export const STATUS_FETCH_SOURCE_REQUEST = 'STATUS_FETCH_SOURCE_REQUEST';
+export const STATUS_FETCH_SOURCE_SUCCESS = 'STATUS_FETCH_SOURCE_SUCCESS';
+export const STATUS_FETCH_SOURCE_FAIL = 'STATUS_FETCH_SOURCE_FAIL';
+
export function fetchStatusRequest(id, skipLoading) {
return {
type: STATUS_FETCH_REQUEST,
@@ -85,6 +89,37 @@ export function redraft(status, raw_text) {
};
}
+export const editStatus = (id, routerHistory) => (dispatch, getState) => {
+ let status = getState().getIn(['statuses', id]);
+
+ if (status.get('poll')) {
+ status = status.set('poll', getState().getIn(['polls', status.get('poll')]));
+ }
+
+ dispatch(fetchStatusSourceRequest());
+
+ api(getState).get(`/api/v1/statuses/${id}/source`).then(response => {
+ dispatch(fetchStatusSourceSuccess());
+ ensureComposeIsVisible(getState, routerHistory);
+ dispatch(setComposeToStatus(status, response.data.text, response.data.spoiler_text));
+ }).catch(error => {
+ dispatch(fetchStatusSourceFail(error));
+ });
+};
+
+export const fetchStatusSourceRequest = () => ({
+ type: STATUS_FETCH_SOURCE_REQUEST,
+});
+
+export const fetchStatusSourceSuccess = () => ({
+ type: STATUS_FETCH_SOURCE_SUCCESS,
+});
+
+export const fetchStatusSourceFail = error => ({
+ type: STATUS_FETCH_SOURCE_FAIL,
+ error,
+});
+
export function deleteStatus(id, routerHistory, withRedraft = false) {
return (dispatch, getState) => {
let status = getState().getIn(['statuses', id]);
diff --git a/app/javascript/mastodon/actions/trends.js b/app/javascript/mastodon/actions/trends.js
index 853e4f60a..304bbebef 100644
--- a/app/javascript/mastodon/actions/trends.js
+++ b/app/javascript/mastodon/actions/trends.js
@@ -1,31 +1,94 @@
import api from '../api';
+import { importFetchedStatuses } from './importer';
-export const TRENDS_FETCH_REQUEST = 'TRENDS_FETCH_REQUEST';
-export const TRENDS_FETCH_SUCCESS = 'TRENDS_FETCH_SUCCESS';
-export const TRENDS_FETCH_FAIL = 'TRENDS_FETCH_FAIL';
+export const TRENDS_TAGS_FETCH_REQUEST = 'TRENDS_TAGS_FETCH_REQUEST';
+export const TRENDS_TAGS_FETCH_SUCCESS = 'TRENDS_TAGS_FETCH_SUCCESS';
+export const TRENDS_TAGS_FETCH_FAIL = 'TRENDS_TAGS_FETCH_FAIL';
-export const fetchTrends = () => (dispatch, getState) => {
- dispatch(fetchTrendsRequest());
+export const TRENDS_LINKS_FETCH_REQUEST = 'TRENDS_LINKS_FETCH_REQUEST';
+export const TRENDS_LINKS_FETCH_SUCCESS = 'TRENDS_LINKS_FETCH_SUCCESS';
+export const TRENDS_LINKS_FETCH_FAIL = 'TRENDS_LINKS_FETCH_FAIL';
+
+export const TRENDS_STATUSES_FETCH_REQUEST = 'TRENDS_STATUSES_FETCH_REQUEST';
+export const TRENDS_STATUSES_FETCH_SUCCESS = 'TRENDS_STATUSES_FETCH_SUCCESS';
+export const TRENDS_STATUSES_FETCH_FAIL = 'TRENDS_STATUSES_FETCH_FAIL';
+
+export const fetchTrendingHashtags = () => (dispatch, getState) => {
+ dispatch(fetchTrendingHashtagsRequest());
api(getState)
- .get('/api/v1/trends')
- .then(({ data }) => dispatch(fetchTrendsSuccess(data)))
- .catch(err => dispatch(fetchTrendsFail(err)));
+ .get('/api/v1/trends/tags')
+ .then(({ data }) => dispatch(fetchTrendingHashtagsSuccess(data)))
+ .catch(err => dispatch(fetchTrendingHashtagsFail(err)));
};
-export const fetchTrendsRequest = () => ({
- type: TRENDS_FETCH_REQUEST,
+export const fetchTrendingHashtagsRequest = () => ({
+ type: TRENDS_TAGS_FETCH_REQUEST,
skipLoading: true,
});
-export const fetchTrendsSuccess = trends => ({
- type: TRENDS_FETCH_SUCCESS,
+export const fetchTrendingHashtagsSuccess = trends => ({
+ type: TRENDS_TAGS_FETCH_SUCCESS,
trends,
skipLoading: true,
});
-export const fetchTrendsFail = error => ({
- type: TRENDS_FETCH_FAIL,
+export const fetchTrendingHashtagsFail = error => ({
+ type: TRENDS_TAGS_FETCH_FAIL,
+ error,
+ skipLoading: true,
+ skipAlert: true,
+});
+
+export const fetchTrendingLinks = () => (dispatch, getState) => {
+ dispatch(fetchTrendingLinksRequest());
+
+ api(getState)
+ .get('/api/v1/trends/links')
+ .then(({ data }) => dispatch(fetchTrendingLinksSuccess(data)))
+ .catch(err => dispatch(fetchTrendingLinksFail(err)));
+};
+
+export const fetchTrendingLinksRequest = () => ({
+ type: TRENDS_LINKS_FETCH_REQUEST,
+ skipLoading: true,
+});
+
+export const fetchTrendingLinksSuccess = trends => ({
+ type: TRENDS_LINKS_FETCH_SUCCESS,
+ trends,
+ skipLoading: true,
+});
+
+export const fetchTrendingLinksFail = error => ({
+ type: TRENDS_LINKS_FETCH_FAIL,
+ error,
+ skipLoading: true,
+ skipAlert: true,
+});
+
+export const fetchTrendingStatuses = () => (dispatch, getState) => {
+ dispatch(fetchTrendingStatusesRequest());
+
+ api(getState).get('/api/v1/trends/statuses').then(({ data }) => {
+ dispatch(importFetchedStatuses(data));
+ dispatch(fetchTrendingStatusesSuccess(data));
+ }).catch(err => dispatch(fetchTrendingStatusesFail(err)));
+};
+
+export const fetchTrendingStatusesRequest = () => ({
+ type: TRENDS_STATUSES_FETCH_REQUEST,
+ skipLoading: true,
+});
+
+export const fetchTrendingStatusesSuccess = statuses => ({
+ type: TRENDS_STATUSES_FETCH_SUCCESS,
+ statuses,
+ skipLoading: true,
+});
+
+export const fetchTrendingStatusesFail = error => ({
+ type: TRENDS_STATUSES_FETCH_FAIL,
error,
skipLoading: true,
skipAlert: true,
diff --git a/app/javascript/mastodon/components/admin/Counter.js b/app/javascript/mastodon/components/admin/Counter.js
index 047e864b2..6edb7bcfc 100644
--- a/app/javascript/mastodon/components/admin/Counter.js
+++ b/app/javascript/mastodon/components/admin/Counter.js
@@ -68,12 +68,12 @@ export default class Counter extends React.PureComponent {
);
} else {
const measure = data[0];
- const percentChange = percIncrease(measure.previous_total * 1, measure.total * 1);
+ const percentChange = measure.previous_total && percIncrease(measure.previous_total * 1, measure.total * 1);
content = (
-
- 0, negative: percentChange < 0 })}>{percentChange > 0 && '+'}
+ {measure.human_value || }
+ {measure.previous_total && ( 0, negative: percentChange < 0 })}>{percentChange > 0 && '+'} )}
);
}
diff --git a/app/javascript/mastodon/components/check.js b/app/javascript/mastodon/components/check.js
new file mode 100644
index 000000000..ee2ef1595
--- /dev/null
+++ b/app/javascript/mastodon/components/check.js
@@ -0,0 +1,9 @@
+import React from 'react';
+
+const Check = () => (
+
+
+
+);
+
+export default Check;
diff --git a/app/javascript/mastodon/components/dropdown_menu.js b/app/javascript/mastodon/components/dropdown_menu.js
index 18994e7ee..4427bdda5 100644
--- a/app/javascript/mastodon/components/dropdown_menu.js
+++ b/app/javascript/mastodon/components/dropdown_menu.js
@@ -6,6 +6,8 @@ import Overlay from 'react-overlays/lib/Overlay';
import Motion from '../features/ui/util/optional_motion';
import spring from 'react-motion/lib/spring';
import { supportsPassiveEvents } from 'detect-passive-events';
+import classNames from 'classnames';
+import { CircularProgress } from 'mastodon/components/loading_indicator';
const listenerOptions = supportsPassiveEvents ? { passive: true } : false;
let id = 0;
@@ -17,13 +19,18 @@ class DropdownMenu extends React.PureComponent {
};
static propTypes = {
- items: PropTypes.array.isRequired,
+ items: PropTypes.oneOfType([PropTypes.array, ImmutablePropTypes.list]).isRequired,
+ loading: PropTypes.bool,
+ scrollable: PropTypes.bool,
onClose: PropTypes.func.isRequired,
style: PropTypes.object,
placement: PropTypes.string,
arrowOffsetLeft: PropTypes.string,
arrowOffsetTop: PropTypes.string,
openedViaKeyboard: PropTypes.bool,
+ renderItem: PropTypes.func,
+ renderHeader: PropTypes.func,
+ onItemClick: PropTypes.func.isRequired,
};
static defaultProps = {
@@ -45,9 +52,11 @@ class DropdownMenu extends React.PureComponent {
document.addEventListener('click', this.handleDocumentClick, false);
document.addEventListener('keydown', this.handleKeyDown, false);
document.addEventListener('touchend', this.handleDocumentClick, listenerOptions);
+
if (this.focusedItem && this.props.openedViaKeyboard) {
this.focusedItem.focus({ preventScroll: true });
}
+
this.setState({ mounted: true });
}
@@ -66,7 +75,7 @@ class DropdownMenu extends React.PureComponent {
}
handleKeyDown = e => {
- const items = Array.from(this.node.getElementsByTagName('a'));
+ const items = Array.from(this.node.querySelectorAll('a, button'));
const index = items.indexOf(document.activeElement);
let element = null;
@@ -109,21 +118,11 @@ class DropdownMenu extends React.PureComponent {
}
handleClick = e => {
- const i = Number(e.currentTarget.getAttribute('data-index'));
- const { action, to } = this.props.items[i];
-
- this.props.onClose();
-
- if (typeof action === 'function') {
- e.preventDefault();
- action(e);
- } else if (to) {
- e.preventDefault();
- this.context.router.history.push(to);
- }
+ const { onItemClick } = this.props;
+ onItemClick(e);
}
- renderItem (option, i) {
+ renderItem = (option, i) => {
if (option === null) {
return
;
}
@@ -142,9 +141,11 @@ class DropdownMenu extends React.PureComponent {
}
render () {
- const { items, style, placement, arrowOffsetLeft, arrowOffsetTop } = this.props;
+ const { items, style, placement, arrowOffsetLeft, arrowOffsetTop, scrollable, renderHeader, loading } = this.props;
const { mounted } = this.state;
+ let renderItem = this.props.renderItem || this.renderItem;
+
return (
{({ opacity, scaleX, scaleY }) => (
@@ -154,9 +155,23 @@ class DropdownMenu extends React.PureComponent {
-
- {items.map((option, i) => this.renderItem(option, i))}
-
+
+ {loading && (
+
+ )}
+
+ {!loading && renderHeader && (
+
+ {renderHeader(items)}
+
+ )}
+
+ {!loading && (
+
+ {items.map((option, i) => renderItem(option, i, { onClick: this.handleClick, onKeyPress: this.handleItemKeyPress }))}
+
+ )}
+
)}
@@ -172,11 +187,14 @@ export default class Dropdown extends React.PureComponent {
};
static propTypes = {
- icon: PropTypes.string.isRequired,
- items: PropTypes.array.isRequired,
- size: PropTypes.number.isRequired,
+ children: PropTypes.node,
+ icon: PropTypes.string,
+ items: PropTypes.oneOfType([PropTypes.array, ImmutablePropTypes.list]).isRequired,
+ loading: PropTypes.bool,
+ size: PropTypes.number,
title: PropTypes.string,
disabled: PropTypes.bool,
+ scrollable: PropTypes.bool,
status: ImmutablePropTypes.map,
isUserTouching: PropTypes.func,
onOpen: PropTypes.func.isRequired,
@@ -184,6 +202,9 @@ export default class Dropdown extends React.PureComponent {
dropdownPlacement: PropTypes.string,
openDropdownId: PropTypes.number,
openedViaKeyboard: PropTypes.bool,
+ renderItem: PropTypes.func,
+ renderHeader: PropTypes.func,
+ onItemClick: PropTypes.func,
};
static defaultProps = {
@@ -239,17 +260,21 @@ export default class Dropdown extends React.PureComponent {
}
handleItemClick = e => {
+ const { onItemClick } = this.props;
const i = Number(e.currentTarget.getAttribute('data-index'));
- const { action, to } = this.props.items[i];
+ const item = this.props.items[i];
this.handleClose();
- if (typeof action === 'function') {
+ if (typeof onItemClick === 'function') {
e.preventDefault();
- action();
- } else if (to) {
+ onItemClick(item, i);
+ } else if (item && typeof item.action === 'function') {
e.preventDefault();
- this.context.router.history.push(to);
+ item.action();
+ } else if (item && item.to) {
+ e.preventDefault();
+ this.context.router.history.push(item.to);
}
}
@@ -267,29 +292,67 @@ export default class Dropdown extends React.PureComponent {
}
}
+ close = () => {
+ this.handleClose();
+ }
+
render () {
- const { icon, items, size, title, disabled, dropdownPlacement, openDropdownId, openedViaKeyboard } = this.props;
+ const {
+ icon,
+ items,
+ size,
+ title,
+ disabled,
+ loading,
+ scrollable,
+ dropdownPlacement,
+ openDropdownId,
+ openedViaKeyboard,
+ children,
+ renderItem,
+ renderHeader,
+ } = this.props;
+
const open = this.state.id === openDropdownId;
+ const button = children ? React.cloneElement(React.Children.only(children), {
+ ref: this.setTargetRef,
+ onClick: this.handleClick,
+ onMouseDown: this.handleMouseDown,
+ onKeyDown: this.handleButtonKeyDown,
+ onKeyPress: this.handleKeyPress,
+ }) : (
+
+ );
+
return (
-
-
+
+ {button}
-
+
-
+
);
}
diff --git a/app/javascript/mastodon/components/edited_timestamp/containers/dropdown_menu_container.js b/app/javascript/mastodon/components/edited_timestamp/containers/dropdown_menu_container.js
new file mode 100644
index 000000000..e30c18372
--- /dev/null
+++ b/app/javascript/mastodon/components/edited_timestamp/containers/dropdown_menu_container.js
@@ -0,0 +1,27 @@
+import { connect } from 'react-redux';
+import { openDropdownMenu, closeDropdownMenu } from 'mastodon/actions/dropdown_menu';
+import { fetchHistory } from 'mastodon/actions/history';
+import DropdownMenu from 'mastodon/components/dropdown_menu';
+
+const mapStateToProps = (state, { statusId }) => ({
+ dropdownPlacement: state.getIn(['dropdown_menu', 'placement']),
+ openDropdownId: state.getIn(['dropdown_menu', 'openId']),
+ openedViaKeyboard: state.getIn(['dropdown_menu', 'keyboard']),
+ items: state.getIn(['history', statusId, 'items']),
+ loading: state.getIn(['history', statusId, 'loading']),
+});
+
+const mapDispatchToProps = (dispatch, { statusId }) => ({
+
+ onOpen (id, onItemClick, dropdownPlacement, keyboard) {
+ dispatch(fetchHistory(statusId));
+ dispatch(openDropdownMenu(id, dropdownPlacement, keyboard));
+ },
+
+ onClose (id) {
+ dispatch(closeDropdownMenu(id));
+ },
+
+});
+
+export default connect(mapStateToProps, mapDispatchToProps)(DropdownMenu);
diff --git a/app/javascript/mastodon/components/edited_timestamp/index.js b/app/javascript/mastodon/components/edited_timestamp/index.js
new file mode 100644
index 000000000..bebf93886
--- /dev/null
+++ b/app/javascript/mastodon/components/edited_timestamp/index.js
@@ -0,0 +1,70 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import { FormattedMessage, injectIntl } from 'react-intl';
+import Icon from 'mastodon/components/icon';
+import DropdownMenu from './containers/dropdown_menu_container';
+import { connect } from 'react-redux';
+import { openModal } from 'mastodon/actions/modal';
+import RelativeTimestamp from 'mastodon/components/relative_timestamp';
+import InlineAccount from 'mastodon/components/inline_account';
+
+const mapDispatchToProps = (dispatch, { statusId }) => ({
+
+ onItemClick (index) {
+ dispatch(openModal('COMPARE_HISTORY', { index, statusId }));
+ },
+
+});
+
+export default @connect(null, mapDispatchToProps)
+@injectIntl
+class EditedTimestamp extends React.PureComponent {
+
+ static propTypes = {
+ statusId: PropTypes.string.isRequired,
+ timestamp: PropTypes.string.isRequired,
+ intl: PropTypes.object.isRequired,
+ onItemClick: PropTypes.func.isRequired,
+ };
+
+ handleItemClick = (item, i) => {
+ const { onItemClick } = this.props;
+ onItemClick(i);
+ };
+
+ renderHeader = items => {
+ return (
+
+ );
+ }
+
+ renderItem = (item, index, { onClick, onKeyPress }) => {
+ const formattedDate =
;
+ const formattedName =
;
+
+ const label = item.get('original') ? (
+
+ ) : (
+
+ );
+
+ return (
+
+ {label}
+
+ );
+ }
+
+ render () {
+ const { timestamp, intl, statusId } = this.props;
+
+ return (
+
+
+
+
+
+ );
+ }
+
+}
diff --git a/app/javascript/mastodon/components/hashtag.js b/app/javascript/mastodon/components/hashtag.js
index a793a32f5..7f442d189 100644
--- a/app/javascript/mastodon/components/hashtag.js
+++ b/app/javascript/mastodon/components/hashtag.js
@@ -38,7 +38,7 @@ class SilentErrorBoundary extends React.Component {
*
* @type {(displayNumber: JSX.Element, pluralReady: number) => JSX.Element}
*/
-const accountsCountRenderer = (displayNumber, pluralReady) => (
+export const accountsCountRenderer = (displayNumber, pluralReady) => (
+ {typeof counter !== 'undefined' && }
+
+ );
+
+ if (href) {
+ contents = (
+
+ {contents}
+
+ );
+ }
+
return (
- {typeof counter !== 'undefined' && }
+ {contents}
);
}
diff --git a/app/javascript/mastodon/components/inline_account.js b/app/javascript/mastodon/components/inline_account.js
new file mode 100644
index 000000000..a1b495590
--- /dev/null
+++ b/app/javascript/mastodon/components/inline_account.js
@@ -0,0 +1,34 @@
+import React from 'react';
+import ImmutablePropTypes from 'react-immutable-proptypes';
+import { connect } from 'react-redux';
+import { makeGetAccount } from 'mastodon/selectors';
+import Avatar from 'mastodon/components/avatar';
+
+const makeMapStateToProps = () => {
+ const getAccount = makeGetAccount();
+
+ const mapStateToProps = (state, { accountId }) => ({
+ account: getAccount(state, accountId),
+ });
+
+ return mapStateToProps;
+};
+
+export default @connect(makeMapStateToProps)
+class InlineAccount extends React.PureComponent {
+
+ static propTypes = {
+ account: ImmutablePropTypes.map.isRequired,
+ };
+
+ render () {
+ const { account } = this.props;
+
+ return (
+
+ {account.get('username')}
+
+ );
+ }
+
+}
diff --git a/app/javascript/mastodon/components/loading_indicator.js b/app/javascript/mastodon/components/loading_indicator.js
index d6a5adb6f..33c59d94c 100644
--- a/app/javascript/mastodon/components/loading_indicator.js
+++ b/app/javascript/mastodon/components/loading_indicator.js
@@ -1,10 +1,31 @@
import React from 'react';
-import { FormattedMessage } from 'react-intl';
+import PropTypes from 'prop-types';
+
+export const CircularProgress = ({ size, strokeWidth }) => {
+ const viewBox = `0 0 ${size} ${size}`;
+ const radius = (size - strokeWidth) / 2;
+
+ return (
+
+
+
+ );
+};
+
+CircularProgress.propTypes = {
+ size: PropTypes.number.isRequired,
+ strokeWidth: PropTypes.number.isRequired,
+};
const LoadingIndicator = () => (
);
diff --git a/app/javascript/mastodon/components/media_attachments.js b/app/javascript/mastodon/components/media_attachments.js
new file mode 100644
index 000000000..d27720de4
--- /dev/null
+++ b/app/javascript/mastodon/components/media_attachments.js
@@ -0,0 +1,116 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import ImmutablePropTypes from 'react-immutable-proptypes';
+import ImmutablePureComponent from 'react-immutable-pure-component';
+import { MediaGallery, Video, Audio } from 'mastodon/features/ui/util/async-components';
+import Bundle from 'mastodon/features/ui/components/bundle';
+import noop from 'lodash/noop';
+
+export default class MediaAttachments extends ImmutablePureComponent {
+
+ static propTypes = {
+ status: ImmutablePropTypes.map.isRequired,
+ height: PropTypes.number,
+ width: PropTypes.number,
+ };
+
+ static defaultProps = {
+ height: 110,
+ width: 239,
+ };
+
+ updateOnProps = [
+ 'status',
+ ];
+
+ renderLoadingMediaGallery = () => {
+ const { height, width } = this.props;
+
+ return (
+
+ );
+ }
+
+ renderLoadingVideoPlayer = () => {
+ const { height, width } = this.props;
+
+ return (
+
+ );
+ }
+
+ renderLoadingAudioPlayer = () => {
+ const { height, width } = this.props;
+
+ return (
+
+ );
+ }
+
+ render () {
+ const { status, width, height } = this.props;
+ const mediaAttachments = status.get('media_attachments');
+
+ if (mediaAttachments.size === 0) {
+ return null;
+ }
+
+ if (mediaAttachments.getIn([0, 'type']) === 'audio') {
+ const audio = mediaAttachments.get(0);
+
+ return (
+
+ {Component => (
+
+ )}
+
+ );
+ } else if (mediaAttachments.getIn([0, 'type']) === 'video') {
+ const video = mediaAttachments.get(0);
+
+ return (
+
+ {Component => (
+
+ )}
+
+ );
+ } else {
+ return (
+
+ {Component => (
+
+ )}
+
+ );
+ }
+ }
+
+}
diff --git a/app/javascript/mastodon/components/modal_root.js b/app/javascript/mastodon/components/modal_root.js
index 755c46fd6..b894aeaf9 100644
--- a/app/javascript/mastodon/components/modal_root.js
+++ b/app/javascript/mastodon/components/modal_root.js
@@ -18,6 +18,7 @@ export default class ModalRoot extends React.PureComponent {
g: PropTypes.number,
b: PropTypes.number,
}),
+ ignoreFocus: PropTypes.bool,
};
activeElement = this.props.children ? document.activeElement : null;
@@ -72,7 +73,9 @@ export default class ModalRoot extends React.PureComponent {
// immediately selectable, we have to wait for observers to run, as
// described in https://github.com/WICG/inert#performance-and-gotchas
Promise.resolve().then(() => {
- this.activeElement.focus({ preventScroll: true });
+ if (!this.props.ignoreFocus) {
+ this.activeElement.focus({ preventScroll: true });
+ }
this.activeElement = null;
}).catch(console.error);
diff --git a/app/javascript/mastodon/components/relative_timestamp.js b/app/javascript/mastodon/components/relative_timestamp.js
index 711181dcd..512480339 100644
--- a/app/javascript/mastodon/components/relative_timestamp.js
+++ b/app/javascript/mastodon/components/relative_timestamp.js
@@ -5,10 +5,15 @@ import PropTypes from 'prop-types';
const messages = defineMessages({
today: { id: 'relative_time.today', defaultMessage: 'today' },
just_now: { id: 'relative_time.just_now', defaultMessage: 'now' },
+ just_now_full: { id: 'relative_time.full.just_now', defaultMessage: 'just now' },
seconds: { id: 'relative_time.seconds', defaultMessage: '{number}s' },
+ seconds_full: { id: 'relative_time.full.seconds', defaultMessage: '{number, plural, one {# second} other {# seconds}} ago' },
minutes: { id: 'relative_time.minutes', defaultMessage: '{number}m' },
+ minutes_full: { id: 'relative_time.full.minutes', defaultMessage: '{number, plural, one {# minute} other {# minutes}} ago' },
hours: { id: 'relative_time.hours', defaultMessage: '{number}h' },
+ hours_full: { id: 'relative_time.full.hours', defaultMessage: '{number, plural, one {# hour} other {# hours}} ago' },
days: { id: 'relative_time.days', defaultMessage: '{number}d' },
+ days_full: { id: 'relative_time.full.days', defaultMessage: '{number, plural, one {# day} other {# days}} ago' },
moments_remaining: { id: 'time_remaining.moments', defaultMessage: 'Moments remaining' },
seconds_remaining: { id: 'time_remaining.seconds', defaultMessage: '{number, plural, one {# second} other {# seconds}} left' },
minutes_remaining: { id: 'time_remaining.minutes', defaultMessage: '{number, plural, one {# minute} other {# minutes}} left' },
@@ -66,7 +71,7 @@ const getUnitDelay = units => {
}
};
-export const timeAgoString = (intl, date, now, year, timeGiven = true) => {
+export const timeAgoString = (intl, date, now, year, timeGiven, short) => {
const delta = now - date.getTime();
let relativeTime;
@@ -74,16 +79,16 @@ export const timeAgoString = (intl, date, now, year, timeGiven = true) => {
if (delta < DAY && !timeGiven) {
relativeTime = intl.formatMessage(messages.today);
} else if (delta < 10 * SECOND) {
- relativeTime = intl.formatMessage(messages.just_now);
+ relativeTime = intl.formatMessage(short ? messages.just_now : messages.just_now_full);
} else if (delta < 7 * DAY) {
if (delta < MINUTE) {
- relativeTime = intl.formatMessage(messages.seconds, { number: Math.floor(delta / SECOND) });
+ relativeTime = intl.formatMessage(short ? messages.seconds : messages.seconds_full, { number: Math.floor(delta / SECOND) });
} else if (delta < HOUR) {
- relativeTime = intl.formatMessage(messages.minutes, { number: Math.floor(delta / MINUTE) });
+ relativeTime = intl.formatMessage(short ? messages.minutes : messages.minutes_full, { number: Math.floor(delta / MINUTE) });
} else if (delta < DAY) {
- relativeTime = intl.formatMessage(messages.hours, { number: Math.floor(delta / HOUR) });
+ relativeTime = intl.formatMessage(short ? messages.hours : messages.hours_full, { number: Math.floor(delta / HOUR) });
} else {
- relativeTime = intl.formatMessage(messages.days, { number: Math.floor(delta / DAY) });
+ relativeTime = intl.formatMessage(short ? messages.days : messages.days_full, { number: Math.floor(delta / DAY) });
}
} else if (date.getFullYear() === year) {
relativeTime = intl.formatDate(date, shortDateFormatOptions);
@@ -124,6 +129,7 @@ class RelativeTimestamp extends React.Component {
timestamp: PropTypes.string.isRequired,
year: PropTypes.number.isRequired,
futureDate: PropTypes.bool,
+ short: PropTypes.bool,
};
state = {
@@ -132,6 +138,7 @@ class RelativeTimestamp extends React.Component {
static defaultProps = {
year: (new Date()).getFullYear(),
+ short: true,
};
shouldComponentUpdate (nextProps, nextState) {
@@ -176,11 +183,11 @@ class RelativeTimestamp extends React.Component {
}
render () {
- const { timestamp, intl, year, futureDate } = this.props;
+ const { timestamp, intl, year, futureDate, short } = this.props;
const timeGiven = timestamp.includes('T');
const date = new Date(timestamp);
- const relativeTime = futureDate ? timeRemainingString(intl, date, this.state.now, timeGiven) : timeAgoString(intl, date, this.state.now, year, timeGiven);
+ const relativeTime = futureDate ? timeRemainingString(intl, date, this.state.now, timeGiven) : timeAgoString(intl, date, this.state.now, year, timeGiven, short);
return (
diff --git a/app/javascript/mastodon/components/scrollable_list.js b/app/javascript/mastodon/components/scrollable_list.js
index 72de5a128..4a6ffb149 100644
--- a/app/javascript/mastodon/components/scrollable_list.js
+++ b/app/javascript/mastodon/components/scrollable_list.js
@@ -151,7 +151,7 @@ class ScrollableList extends PureComponent {
attachFullscreenListener(this.onFullScreenChange);
- // Handle initial scroll posiiton
+ // Handle initial scroll position
this.handleScroll();
}
diff --git a/app/javascript/mastodon/components/status_action_bar.js b/app/javascript/mastodon/components/status_action_bar.js
index 4e19cc0e4..1d8fe23da 100644
--- a/app/javascript/mastodon/components/status_action_bar.js
+++ b/app/javascript/mastodon/components/status_action_bar.js
@@ -12,6 +12,7 @@ import classNames from 'classnames';
const messages = defineMessages({
delete: { id: 'status.delete', defaultMessage: 'Delete' },
redraft: { id: 'status.redraft', defaultMessage: 'Delete & re-draft' },
+ edit: { id: 'status.edit', defaultMessage: 'Edit' },
direct: { id: 'status.direct', defaultMessage: 'Direct message @{name}' },
mention: { id: 'status.mention', defaultMessage: 'Mention @{name}' },
mute: { id: 'account.mute', defaultMessage: 'Mute @{name}' },
@@ -76,6 +77,7 @@ class StatusActionBar extends ImmutablePureComponent {
onPin: PropTypes.func,
onBookmark: PropTypes.func,
withDismiss: PropTypes.bool,
+ withCounters: PropTypes.bool,
scrollKey: PropTypes.string,
intl: PropTypes.object.isRequired,
};
@@ -137,6 +139,10 @@ class StatusActionBar extends ImmutablePureComponent {
this.props.onDelete(this.props.status, this.context.router.history, true);
}
+ handleEditClick = () => {
+ this.props.onEdit(this.props.status, this.context.router.history);
+ }
+
handlePinClick = () => {
this.props.onPin(this.props.status);
}
@@ -221,7 +227,7 @@ class StatusActionBar extends ImmutablePureComponent {
}
render () {
- const { status, relationship, intl, withDismiss, scrollKey } = this.props;
+ const { status, relationship, intl, withDismiss, withCounters, scrollKey } = this.props;
const anonymousAccess = !me;
const publicStatus = ['public', 'unlisted'].includes(status.get('visibility'));
@@ -255,6 +261,7 @@ class StatusActionBar extends ImmutablePureComponent {
}
if (writtenByMe) {
+ // menu.push({ text: intl.formatMessage(messages.edit), action: this.handleEditClick });
menu.push({ text: intl.formatMessage(messages.delete), action: this.handleDeleteClick });
menu.push({ text: intl.formatMessage(messages.redraft), action: this.handleRedraftClick });
} else {
@@ -325,8 +332,8 @@ class StatusActionBar extends ImmutablePureComponent {
return (
-
-
+
+
{shareButton}
diff --git a/app/javascript/mastodon/components/status_list.js b/app/javascript/mastodon/components/status_list.js
index eaaffcc3a..35e5749a3 100644
--- a/app/javascript/mastodon/components/status_list.js
+++ b/app/javascript/mastodon/components/status_list.js
@@ -24,6 +24,7 @@ export default class StatusList extends ImmutablePureComponent {
prepend: PropTypes.node,
emptyMessage: PropTypes.node,
alwaysPrepend: PropTypes.bool,
+ withCounters: PropTypes.bool,
timelineId: PropTypes.string,
};
@@ -100,6 +101,7 @@ export default class StatusList extends ImmutablePureComponent {
contextType={timelineId}
scrollKey={this.props.scrollKey}
showThread
+ withCounters={this.props.withCounters}
/>
))
) : null;
@@ -114,6 +116,7 @@ export default class StatusList extends ImmutablePureComponent {
onMoveDown={this.handleMoveDown}
contextType={timelineId}
showThread
+ withCounters={this.props.withCounters}
/>
)).concat(scrollableContent);
}
diff --git a/app/javascript/mastodon/containers/media_container.js b/app/javascript/mastodon/containers/media_container.js
index 098e7a594..6ee1f0bd8 100644
--- a/app/javascript/mastodon/containers/media_container.js
+++ b/app/javascript/mastodon/containers/media_container.js
@@ -1,7 +1,7 @@
-import React, { Fragment, PureComponent } from 'react';
+import React, { PureComponent, Fragment } from 'react';
import ReactDOM from 'react-dom';
import PropTypes from 'prop-types';
-import { addLocaleData, IntlProvider } from 'react-intl';
+import { IntlProvider, addLocaleData } from 'react-intl';
import { fromJS } from 'immutable';
import { getLocale } from 'mastodon/locales';
import { getScrollbarWidth } from 'mastodon/utils/scrollbar';
@@ -27,11 +27,11 @@ export default class MediaContainer extends PureComponent {
};
state = {
- media : null,
- index : null,
- time : null,
+ media: null,
+ index: null,
+ time: null,
backgroundColor: null,
- options : null,
+ options: null,
};
handleOpenMedia = (media, index) => {
@@ -39,29 +39,29 @@ export default class MediaContainer extends PureComponent {
document.documentElement.style.marginRight = `${getScrollbarWidth()}px`;
this.setState({ media, index });
- };
+ }
handleOpenVideo = (options) => {
const { components } = this.props;
- const { media } = JSON.parse(components[options.componetIndex].getAttribute('data-props'));
+ const { media } = JSON.parse(components[options.componentIndex].getAttribute('data-props'));
const mediaList = fromJS(media);
document.body.classList.add('with-modals--active');
document.documentElement.style.marginRight = `${getScrollbarWidth()}px`;
this.setState({ media: mediaList, options });
- };
+ }
handleCloseMedia = () => {
document.body.classList.remove('with-modals--active');
document.documentElement.style.marginRight = 0;
this.setState({
- media : null,
- index : null,
- time : null,
+ media: null,
+ index: null,
+ time: null,
backgroundColor: null,
- options : null,
+ options: null,
});
}
@@ -87,8 +87,8 @@ export default class MediaContainer extends PureComponent {
...(hashtag ? { hashtag: fromJS(hashtag) } : {}),
...(componentName === 'Video' ? {
- componetIndex: i,
- onOpenVideo : this.handleOpenVideo,
+ componentIndex: i,
+ onOpenVideo: this.handleOpenVideo,
} : {
onOpenMedia: this.handleOpenMedia,
}),
diff --git a/app/javascript/mastodon/containers/status_container.js b/app/javascript/mastodon/containers/status_container.js
index 9abdec138..ef0aca13a 100644
--- a/app/javascript/mastodon/containers/status_container.js
+++ b/app/javascript/mastodon/containers/status_container.js
@@ -24,6 +24,7 @@ import {
hideStatus,
revealStatus,
toggleStatusCollapse,
+ editStatus,
} from '../actions/statuses';
import {
unmuteAccount,
@@ -142,6 +143,10 @@ const mapDispatchToProps = (dispatch, { intl }) => ({
}
},
+ onEdit (status, history) {
+ dispatch(editStatus(status.get('id'), history));
+ },
+
onDirect (account, router) {
dispatch(directCompose(account, router));
},
diff --git a/app/javascript/mastodon/features/compose/components/compose_form.js b/app/javascript/mastodon/features/compose/components/compose_form.js
index 647d0fba2..826d9f504 100644
--- a/app/javascript/mastodon/features/compose/components/compose_form.js
+++ b/app/javascript/mastodon/features/compose/components/compose_form.js
@@ -29,6 +29,7 @@ const messages = defineMessages({
spoiler_placeholder: { id: 'compose_form.spoiler_placeholder', defaultMessage: 'Write your warning here' },
publish: { id: 'compose_form.publish', defaultMessage: 'Toot' },
publishLoud: { id: 'compose_form.publish_loud', defaultMessage: '{publish}!' },
+ saveChanges: { id: 'compose_form.save_changes', defaultMessage: 'Save changes' },
});
export default @injectIntl
@@ -50,6 +51,7 @@ class ComposeForm extends ImmutablePureComponent {
preselectDate: PropTypes.instanceOf(Date),
isSubmitting: PropTypes.bool,
isChangingUpload: PropTypes.bool,
+ isEditing: PropTypes.bool,
isUploading: PropTypes.bool,
onChange: PropTypes.func.isRequired,
onSubmit: PropTypes.func.isRequired,
@@ -162,8 +164,13 @@ class ComposeForm extends ImmutablePureComponent {
selectionStart = selectionEnd;
}
- this.autosuggestTextarea.textarea.setSelectionRange(selectionStart, selectionEnd);
- this.autosuggestTextarea.textarea.focus();
+ // Because of the wicg-inert polyfill, the activeElement may not be
+ // immediately selectable, we have to wait for observers to run, as
+ // described in https://github.com/WICG/inert#performance-and-gotchas
+ Promise.resolve().then(() => {
+ this.autosuggestTextarea.textarea.setSelectionRange(selectionStart, selectionEnd);
+ this.autosuggestTextarea.textarea.focus();
+ }).catch(console.error);
} else if(prevProps.isSubmitting && !this.props.isSubmitting) {
this.autosuggestTextarea.textarea.focus();
} else if (this.props.spoiler !== prevProps.spoiler) {
@@ -200,7 +207,9 @@ class ComposeForm extends ImmutablePureComponent {
const disabled = this.props.isSubmitting;
let publishText = '';
- if (this.props.privacy === 'private' || this.props.privacy === 'direct') {
+ if (this.props.isEditing) {
+ publishText = intl.formatMessage(messages.saveChanges);
+ } else if (this.props.privacy === 'private' || this.props.privacy === 'direct') {
publishText =
{intl.formatMessage(messages.publish)};
} else {
publishText = this.props.privacy !== 'unlisted' ? intl.formatMessage(messages.publishLoud, { publish: intl.formatMessage(messages.publish) }) : intl.formatMessage(messages.publish);
@@ -256,7 +265,7 @@ class ComposeForm extends ImmutablePureComponent {
diff --git a/app/javascript/mastodon/features/compose/components/emoji_picker_dropdown.js b/app/javascript/mastodon/features/compose/components/emoji_picker_dropdown.js
index 4a87714e6..f433e4de9 100644
--- a/app/javascript/mastodon/features/compose/components/emoji_picker_dropdown.js
+++ b/app/javascript/mastodon/features/compose/components/emoji_picker_dropdown.js
@@ -170,7 +170,7 @@ class EmojiPickerMenu extends React.PureComponent {
state = {
modifierOpen: false,
- placement: null,
+ readyToFocus: false,
};
handleDocumentClick = e => {
@@ -182,6 +182,16 @@ class EmojiPickerMenu extends React.PureComponent {
componentDidMount () {
document.addEventListener('click', this.handleDocumentClick, false);
document.addEventListener('touchend', this.handleDocumentClick, listenerOptions);
+
+ // Because of https://github.com/react-bootstrap/react-bootstrap/issues/2614 we need
+ // to wait for a frame before focusing
+ requestAnimationFrame(() => {
+ this.setState({ readyToFocus: true });
+ if (this.node) {
+ const element = this.node.querySelector('input[type="search"]');
+ if (element) element.focus();
+ }
+ });
}
componentWillUnmount () {
@@ -281,7 +291,7 @@ class EmojiPickerMenu extends React.PureComponent {
showSkinTones={false}
backgroundImageFn={backgroundImageFn}
notFound={notFoundFn}
- autoFocus
+ autoFocus={this.state.readyToFocus}
emojiTooltip
/>
@@ -314,6 +324,7 @@ class EmojiPickerDropdown extends React.PureComponent {
state = {
active: false,
loading: false,
+ placement: null,
};
setRef = (c) => {
diff --git a/app/javascript/mastodon/features/compose/components/privacy_dropdown.js b/app/javascript/mastodon/features/compose/components/privacy_dropdown.js
index df59f46b3..599467cdb 100644
--- a/app/javascript/mastodon/features/compose/components/privacy_dropdown.js
+++ b/app/javascript/mastodon/features/compose/components/privacy_dropdown.js
@@ -159,6 +159,7 @@ class PrivacyDropdown extends React.PureComponent {
onChange: PropTypes.func.isRequired,
noDirect: PropTypes.bool,
container: PropTypes.func,
+ disabled: PropTypes.bool,
intl: PropTypes.object.isRequired,
};
@@ -247,7 +248,7 @@ class PrivacyDropdown extends React.PureComponent {
}
render () {
- const { value, container, intl } = this.props;
+ const { value, container, disabled, intl } = this.props;
const { open, placement } = this.state;
const valueOption = this.options.find(item => item.value === value);
@@ -267,6 +268,7 @@ class PrivacyDropdown extends React.PureComponent {
onMouseDown={this.handleMouseDown}
onKeyDown={this.handleButtonKeyDown}
style={{ height: null, lineHeight: '27px' }}
+ disabled={disabled}
/>
diff --git a/app/javascript/mastodon/features/compose/components/upload.js b/app/javascript/mastodon/features/compose/components/upload.js
index b9f0fbe3a..706824dc7 100644
--- a/app/javascript/mastodon/features/compose/components/upload.js
+++ b/app/javascript/mastodon/features/compose/components/upload.js
@@ -5,7 +5,6 @@ import Motion from '../../ui/util/optional_motion';
import spring from 'react-motion/lib/spring';
import ImmutablePureComponent from 'react-immutable-pure-component';
import { FormattedMessage } from 'react-intl';
-import classNames from 'classnames';
import Icon from 'mastodon/components/icon';
export default class Upload extends ImmutablePureComponent {
@@ -18,6 +17,7 @@ export default class Upload extends ImmutablePureComponent {
media: ImmutablePropTypes.map.isRequired,
onUndo: PropTypes.func.isRequired,
onOpenFocalPoint: PropTypes.func.isRequired,
+ isEditingStatus: PropTypes.func.isRequired,
};
handleUndoClick = e => {
@@ -31,7 +31,7 @@ export default class Upload extends ImmutablePureComponent {
}
render () {
- const { media } = this.props;
+ const { media, isEditingStatus } = this.props;
const focusX = media.getIn(['meta', 'focus', 'x']);
const focusY = media.getIn(['meta', 'focus', 'y']);
const x = ((focusX / 2) + .5) * 100;
@@ -42,10 +42,16 @@ export default class Upload extends ImmutablePureComponent {
{({ scale }) => (
-
+
-
+ {!isEditingStatus && ( )}
+
+ {(media.get('description') || '').length === 0 && (
+
+
+
+ )}
)}
diff --git a/app/javascript/mastodon/features/compose/containers/compose_form_container.js b/app/javascript/mastodon/features/compose/containers/compose_form_container.js
index c44850294..1be7633cc 100644
--- a/app/javascript/mastodon/features/compose/containers/compose_form_container.js
+++ b/app/javascript/mastodon/features/compose/containers/compose_form_container.js
@@ -21,6 +21,7 @@ const mapStateToProps = state => ({
caretPosition: state.getIn(['compose', 'caretPosition']),
preselectDate: state.getIn(['compose', 'preselectDate']),
isSubmitting: state.getIn(['compose', 'is_submitting']),
+ isEditing: state.getIn(['compose', 'id']) !== null,
isChangingUpload: state.getIn(['compose', 'is_changing_upload']),
isUploading: state.getIn(['compose', 'is_uploading']),
showSearch: state.getIn(['search', 'submitted']) && !state.getIn(['search', 'hidden']),
diff --git a/app/javascript/mastodon/features/compose/containers/reply_indicator_container.js b/app/javascript/mastodon/features/compose/containers/reply_indicator_container.js
index 5eb1eb72a..a1302b2d4 100644
--- a/app/javascript/mastodon/features/compose/containers/reply_indicator_container.js
+++ b/app/javascript/mastodon/features/compose/containers/reply_indicator_container.js
@@ -6,9 +6,20 @@ import ReplyIndicator from '../components/reply_indicator';
const makeMapStateToProps = () => {
const getStatus = makeGetStatus();
- const mapStateToProps = state => ({
- status: getStatus(state, { id: state.getIn(['compose', 'in_reply_to']) }),
- });
+ const mapStateToProps = state => {
+ let statusId = state.getIn(['compose', 'id'], null);
+ let editing = true;
+
+ if (statusId === null) {
+ statusId = state.getIn(['compose', 'in_reply_to']);
+ editing = false;
+ }
+
+ return {
+ status: getStatus(state, { id: statusId }),
+ editing,
+ };
+ };
return mapStateToProps;
};
diff --git a/app/javascript/mastodon/features/compose/containers/upload_container.js b/app/javascript/mastodon/features/compose/containers/upload_container.js
index 05cd2ecc1..1108aec30 100644
--- a/app/javascript/mastodon/features/compose/containers/upload_container.js
+++ b/app/javascript/mastodon/features/compose/containers/upload_container.js
@@ -5,6 +5,7 @@ import { submitCompose } from '../../../actions/compose';
const mapStateToProps = (state, { id }) => ({
media: state.getIn(['compose', 'media_attachments']).find(item => item.get('id') === id),
+ isEditingStatus: state.getIn(['compose', 'id']) !== null,
});
const mapDispatchToProps = dispatch => ({
diff --git a/app/javascript/mastodon/features/directory/components/account_card.js b/app/javascript/mastodon/features/directory/components/account_card.js
index 30fb640c4..31f59cd84 100644
--- a/app/javascript/mastodon/features/directory/components/account_card.js
+++ b/app/javascript/mastodon/features/directory/components/account_card.js
@@ -7,31 +7,28 @@ import { makeGetAccount } from 'mastodon/selectors';
import Avatar from 'mastodon/components/avatar';
import DisplayName from 'mastodon/components/display_name';
import Permalink from 'mastodon/components/permalink';
-import RelativeTimestamp from 'mastodon/components/relative_timestamp';
-import IconButton from 'mastodon/components/icon_button';
-import { defineMessages, FormattedMessage, injectIntl } from 'react-intl';
+import Button from 'mastodon/components/button';
+import { FormattedMessage, injectIntl, defineMessages } from 'react-intl';
import { autoPlayGif, me, unfollowModal } from 'mastodon/initial_state';
import ShortNumber from 'mastodon/components/short_number';
import {
- blockAccount,
followAccount,
- unblockAccount,
unfollowAccount,
+ unblockAccount,
unmuteAccount,
} from 'mastodon/actions/accounts';
import { openModal } from 'mastodon/actions/modal';
-import { initMuteModal } from 'mastodon/actions/mutes';
+import classNames from 'classnames';
const messages = defineMessages({
- follow : { id: 'account.follow', defaultMessage: 'Follow' },
- unfollow : { id: 'account.unfollow', defaultMessage: 'Unfollow' },
- requested : { id: 'account.requested', defaultMessage: 'Awaiting approval' },
- unblock : { id: 'account.unblock', defaultMessage: 'Unblock @{name}' },
- unmute : { id: 'account.unmute', defaultMessage: 'Unmute @{name}' },
- unfollowConfirm: {
- id : 'confirmations.unfollow.confirm',
- defaultMessage: 'Unfollow',
- },
+ unfollow: { id: 'account.unfollow', defaultMessage: 'Unfollow' },
+ follow: { id: 'account.follow', defaultMessage: 'Follow' },
+ cancel_follow_request: { id: 'account.cancel_follow_request', defaultMessage: 'Cancel follow request' },
+ requested: { id: 'account.requested', defaultMessage: 'Awaiting approval. Click to cancel follow request' },
+ unblock: { id: 'account.unblock_short', defaultMessage: 'Unblock' },
+ unmute: { id: 'account.unmute_short', defaultMessage: 'Unmute' },
+ unfollowConfirm: { id: 'confirmations.unfollow.confirm', defaultMessage: 'Unfollow' },
+ edit_profile: { id: 'account.edit_profile', defaultMessage: 'Edit profile' },
});
const makeMapStateToProps = () => {
@@ -53,14 +50,14 @@ const mapDispatchToProps = (dispatch, { intl }) => ({
if (unfollowModal) {
dispatch(
openModal('CONFIRM', {
- message : (
+ message: (
@{account.get('acct')} }}
+ values={{ name: @{account.get('acct')} }}
/>
),
- confirm : intl.formatMessage(messages.unfollowConfirm),
+ confirm: intl.formatMessage(messages.unfollowConfirm),
onConfirm: () => dispatch(unfollowAccount(account.get('id'))),
}),
);
@@ -75,30 +72,28 @@ const mapDispatchToProps = (dispatch, { intl }) => ({
onBlock(account) {
if (account.getIn(['relationship', 'blocking'])) {
dispatch(unblockAccount(account.get('id')));
- } else {
- dispatch(blockAccount(account.get('id')));
}
},
onMute(account) {
if (account.getIn(['relationship', 'muting'])) {
dispatch(unmuteAccount(account.get('id')));
- } else {
- dispatch(initMuteModal(account));
}
},
+
});
-export default @injectIntl
+export default
+@injectIntl
@connect(makeMapStateToProps, mapDispatchToProps)
class AccountCard extends ImmutablePureComponent {
static propTypes = {
- account : ImmutablePropTypes.map.isRequired,
- intl : PropTypes.object.isRequired,
+ account: ImmutablePropTypes.map.isRequired,
+ intl: PropTypes.object.isRequired,
onFollow: PropTypes.func.isRequired,
- onBlock : PropTypes.func.isRequired,
- onMute : PropTypes.func.isRequired,
+ onBlock: PropTypes.func.isRequired,
+ onMute: PropTypes.func.isRequired,
};
handleMouseEnter = ({ currentTarget }) => {
@@ -112,7 +107,7 @@ class AccountCard extends ImmutablePureComponent {
let emoji = emojis[i];
emoji.src = emoji.getAttribute('data-original');
}
- };
+ }
handleMouseLeave = ({ currentTarget }) => {
if (autoPlayGif) {
@@ -125,7 +120,7 @@ class AccountCard extends ImmutablePureComponent {
let emoji = emojis[i];
emoji.src = emoji.getAttribute('data-static');
}
- };
+ }
handleFollow = () => {
this.props.onFollow(this.props.account);
@@ -137,140 +132,95 @@ class AccountCard extends ImmutablePureComponent {
handleMute = () => {
this.props.onMute(this.props.account);
- };
+ }
+
+ handleEditProfile = () => {
+ window.open('/settings/profile', '_blank');
+ }
render() {
const { account, intl } = this.props;
- let buttons;
+ let actionBtn;
- if (
- account.get('id') !== me &&
- account.get('relationship', null) !== null
- ) {
- const following = account.getIn(['relationship', 'following']);
- const requested = account.getIn(['relationship', 'requested']);
- const blocking = account.getIn(['relationship', 'blocking']);
- const muting = account.getIn(['relationship', 'muting']);
-
- if (requested) {
- buttons = (
-
- );
- } else if (blocking) {
- buttons = (
-
- );
- } else if (muting) {
- buttons = (
-
- );
- } else if (!account.get('moved') || following) {
- buttons = (
-
- );
+ if (me !== account.get('id')) {
+ if (!account.get('relationship')) { // Wait until the relationship is loaded
+ actionBtn = '';
+ } else if (account.getIn(['relationship', 'requested'])) {
+ actionBtn = ;
+ } else if (account.getIn(['relationship', 'muting'])) {
+ actionBtn = ;
+ } else if (!account.getIn(['relationship', 'blocking'])) {
+ actionBtn = ;
+ } else if (account.getIn(['relationship', 'blocking'])) {
+ actionBtn = ;
}
+ } else {
+ actionBtn = ;
}
return (
-
-
-
-
+
+
+
+
+
-
-
-
+
+
-
- {buttons}
-
-
+ {account.get('note').length > 0 && (
+
+ )}
-
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
- {' '}
-
-
-
-
-
- {account.get('last_status_at') === null ? (
-
- ) : (
-
- )}{' '}
-
-
-
-
-
-
+
+ {' '}
+
+
+
+
+
+
+ {' '}
+
+
+
+
+
+
+
+ {actionBtn}
+
+
+
);
}
diff --git a/app/javascript/mastodon/features/directory/index.js b/app/javascript/mastodon/features/directory/index.js
index 88f20d330..94d7d1a9c 100644
--- a/app/javascript/mastodon/features/directory/index.js
+++ b/app/javascript/mastodon/features/directory/index.js
@@ -10,9 +10,9 @@ import { fetchDirectory, expandDirectory } from 'mastodon/actions/directory';
import { List as ImmutableList } from 'immutable';
import AccountCard from './components/account_card';
import RadioButton from 'mastodon/components/radio_button';
-import classNames from 'classnames';
import LoadMore from 'mastodon/components/load_more';
import ScrollContainer from 'mastodon/containers/scroll_container';
+import LoadingIndicator from 'mastodon/components/loading_indicator';
const messages = defineMessages({
title: { id: 'column.directory', defaultMessage: 'Browse profiles' },
@@ -129,7 +129,7 @@ class Directory extends React.PureComponent {
const pinned = !!columnId;
const scrollableArea = (
-
+
@@ -142,8 +142,10 @@ class Directory extends React.PureComponent {
-
- {accountIds.map(accountId =>
)}
+
+ {isLoading ?
: accountIds.map(accountId => (
+
+ ))}
diff --git a/app/javascript/mastodon/features/emoji/emoji_compressed.js b/app/javascript/mastodon/features/emoji/emoji_compressed.js
index 74b53ce5c..6a402f2d4 100644
--- a/app/javascript/mastodon/features/emoji/emoji_compressed.js
+++ b/app/javascript/mastodon/features/emoji/emoji_compressed.js
@@ -90,7 +90,7 @@ Object.keys(emojiIndex.emojis).forEach(key => {
let { short_names, search, unified } = emojiMartData.emojis[key];
if (short_names[0] !== key) {
- throw new Error('The compresser expects the first short_code to be the ' +
+ throw new Error('The compressor expects the first short_code to be the ' +
'key. It may need to be rewritten if the emoji change such that this ' +
'is no longer the case.');
}
diff --git a/app/javascript/mastodon/features/explore/components/story.js b/app/javascript/mastodon/features/explore/components/story.js
new file mode 100644
index 000000000..563128029
--- /dev/null
+++ b/app/javascript/mastodon/features/explore/components/story.js
@@ -0,0 +1,51 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import Blurhash from 'mastodon/components/blurhash';
+import { accountsCountRenderer } from 'mastodon/components/hashtag';
+import ShortNumber from 'mastodon/components/short_number';
+import Skeleton from 'mastodon/components/skeleton';
+import classNames from 'classnames';
+
+export default class Story extends React.PureComponent {
+
+ static propTypes = {
+ url: PropTypes.string,
+ title: PropTypes.string,
+ publisher: PropTypes.string,
+ sharedTimes: PropTypes.number,
+ thumbnail: PropTypes.string,
+ blurhash: PropTypes.string,
+ };
+
+ state = {
+ thumbnailLoaded: false,
+ };
+
+ handleImageLoad = () => this.setState({ thumbnailLoaded: true });
+
+ render () {
+ const { url, title, publisher, sharedTimes, thumbnail, blurhash } = this.props;
+
+ const { thumbnailLoaded } = this.state;
+
+ return (
+
+
+
{publisher ? publisher : }
+
{title ? title : }
+
{typeof sharedTimes === 'number' ? : }
+
+
+
+ {thumbnail ? (
+
+
+
+
+ ) :
}
+
+
+ );
+ }
+
+}
diff --git a/app/javascript/mastodon/features/explore/index.js b/app/javascript/mastodon/features/explore/index.js
new file mode 100644
index 000000000..8082f2d99
--- /dev/null
+++ b/app/javascript/mastodon/features/explore/index.js
@@ -0,0 +1,91 @@
+import React from 'react';
+import { defineMessages, injectIntl, FormattedMessage } from 'react-intl';
+import { connect } from 'react-redux';
+import PropTypes from 'prop-types';
+import Column from 'mastodon/components/column';
+import ColumnHeader from 'mastodon/components/column_header';
+import { NavLink, Switch, Route } from 'react-router-dom';
+import Links from './links';
+import Tags from './tags';
+import Statuses from './statuses';
+import Suggestions from './suggestions';
+import Search from 'mastodon/features/compose/containers/search_container';
+import SearchResults from './results';
+
+const messages = defineMessages({
+ title: { id: 'explore.title', defaultMessage: 'Explore' },
+ searchResults: { id: 'explore.search_results', defaultMessage: 'Search results' },
+});
+
+const mapStateToProps = state => ({
+ layout: state.getIn(['meta', 'layout']),
+ isSearching: state.getIn(['search', 'submitted']),
+});
+
+export default @connect(mapStateToProps)
+@injectIntl
+class Explore extends React.PureComponent {
+
+ static contextTypes = {
+ router: PropTypes.object,
+ };
+
+ static propTypes = {
+ intl: PropTypes.object.isRequired,
+ multiColumn: PropTypes.bool,
+ isSearching: PropTypes.bool,
+ layout: PropTypes.string,
+ };
+
+ handleHeaderClick = () => {
+ this.column.scrollTop();
+ }
+
+ setRef = c => {
+ this.column = c;
+ }
+
+ render () {
+ const { intl, multiColumn, isSearching, layout } = this.props;
+
+ return (
+
+ {layout === 'mobile' ? (
+
+
+
+ ) : (
+
+ )}
+
+
+ {isSearching ? (
+
+ ) : (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ )}
+
+
+ );
+ }
+
+}
diff --git a/app/javascript/mastodon/features/explore/links.js b/app/javascript/mastodon/features/explore/links.js
new file mode 100644
index 000000000..6649fb6e4
--- /dev/null
+++ b/app/javascript/mastodon/features/explore/links.js
@@ -0,0 +1,48 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import ImmutablePropTypes from 'react-immutable-proptypes';
+import Story from './components/story';
+import LoadingIndicator from 'mastodon/components/loading_indicator';
+import { connect } from 'react-redux';
+import { fetchTrendingLinks } from 'mastodon/actions/trends';
+
+const mapStateToProps = state => ({
+ links: state.getIn(['trends', 'links', 'items']),
+ isLoading: state.getIn(['trends', 'links', 'isLoading']),
+});
+
+export default @connect(mapStateToProps)
+class Links extends React.PureComponent {
+
+ static propTypes = {
+ links: ImmutablePropTypes.list,
+ isLoading: PropTypes.bool,
+ dispatch: PropTypes.func.isRequired,
+ };
+
+ componentDidMount () {
+ const { dispatch } = this.props;
+ dispatch(fetchTrendingLinks());
+ }
+
+ render () {
+ const { isLoading, links } = this.props;
+
+ return (
+
+ {isLoading ? ( ) : links.map(link => (
+
+ ))}
+
+ );
+ }
+
+}
diff --git a/app/javascript/mastodon/features/explore/results.js b/app/javascript/mastodon/features/explore/results.js
new file mode 100644
index 000000000..339f883c5
--- /dev/null
+++ b/app/javascript/mastodon/features/explore/results.js
@@ -0,0 +1,113 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import ImmutablePropTypes from 'react-immutable-proptypes';
+import { FormattedMessage } from 'react-intl';
+import { connect } from 'react-redux';
+import { expandSearch } from 'mastodon/actions/search';
+import Account from 'mastodon/containers/account_container';
+import Status from 'mastodon/containers/status_container';
+import { ImmutableHashtag as Hashtag } from 'mastodon/components/hashtag';
+import { List as ImmutableList } from 'immutable';
+import LoadMore from 'mastodon/components/load_more';
+import LoadingIndicator from 'mastodon/components/loading_indicator';
+
+const mapStateToProps = state => ({
+ isLoading: state.getIn(['search', 'isLoading']),
+ results: state.getIn(['search', 'results']),
+});
+
+const appendLoadMore = (id, list, onLoadMore) => {
+ if (list.size >= 5) {
+ return list.push(
);
+ } else {
+ return list;
+ }
+};
+
+const renderAccounts = (results, onLoadMore) => appendLoadMore('accounts', results.get('accounts', ImmutableList()).map(item => (
+
+)), onLoadMore);
+
+const renderHashtags = (results, onLoadMore) => appendLoadMore('hashtags', results.get('hashtags', ImmutableList()).map(item => (
+
+)), onLoadMore);
+
+const renderStatuses = (results, onLoadMore) => appendLoadMore('statuses', results.get('statuses', ImmutableList()).map(item => (
+
+)), onLoadMore);
+
+export default @connect(mapStateToProps)
+class Results extends React.PureComponent {
+
+ static propTypes = {
+ results: ImmutablePropTypes.map,
+ isLoading: PropTypes.bool,
+ multiColumn: PropTypes.bool,
+ dispatch: PropTypes.func.isRequired,
+ };
+
+ state = {
+ type: 'all',
+ };
+
+ handleSelectAll = () => this.setState({ type: 'all' });
+ handleSelectAccounts = () => this.setState({ type: 'accounts' });
+ handleSelectHashtags = () => this.setState({ type: 'hashtags' });
+ handleSelectStatuses = () => this.setState({ type: 'statuses' });
+ handleLoadMoreAccounts = () => this.loadMore('accounts');
+ handleLoadMoreStatuses = () => this.loadMore('statuses');
+ handleLoadMoreHashtags = () => this.loadMore('hashtags');
+
+ loadMore (type) {
+ const { dispatch } = this.props;
+ dispatch(expandSearch(type));
+ }
+
+ render () {
+ const { isLoading, results } = this.props;
+ const { type } = this.state;
+
+ let filteredResults = ImmutableList();
+
+ if (!isLoading) {
+ switch(type) {
+ case 'all':
+ filteredResults = filteredResults.concat(renderAccounts(results, this.handleLoadMoreAccounts), renderHashtags(results, this.handleLoadMoreHashtags), renderStatuses(results, this.handleLoadMoreStatuses));
+ break;
+ case 'accounts':
+ filteredResults = filteredResults.concat(renderAccounts(results, this.handleLoadMoreAccounts));
+ break;
+ case 'hashtags':
+ filteredResults = filteredResults.concat(renderHashtags(results, this.handleLoadMoreHashtags));
+ break;
+ case 'statuses':
+ filteredResults = filteredResults.concat(renderStatuses(results, this.handleLoadMoreStatuses));
+ break;
+ }
+
+ if (filteredResults.size === 0) {
+ filteredResults = (
+
+
+
+ );
+ }
+ }
+
+ return (
+
+
+
+
+
+
+
+
+
+ {isLoading ? : filteredResults}
+
+
+ );
+ }
+
+}
diff --git a/app/javascript/mastodon/features/explore/statuses.js b/app/javascript/mastodon/features/explore/statuses.js
new file mode 100644
index 000000000..4e5530d84
--- /dev/null
+++ b/app/javascript/mastodon/features/explore/statuses.js
@@ -0,0 +1,48 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import ImmutablePropTypes from 'react-immutable-proptypes';
+import StatusList from 'mastodon/components/status_list';
+import { FormattedMessage } from 'react-intl';
+import { connect } from 'react-redux';
+import { fetchTrendingStatuses } from 'mastodon/actions/trends';
+
+const mapStateToProps = state => ({
+ statusIds: state.getIn(['status_lists', 'trending', 'items']),
+ isLoading: state.getIn(['status_lists', 'trending', 'isLoading'], true),
+});
+
+export default @connect(mapStateToProps)
+class Statuses extends React.PureComponent {
+
+ static propTypes = {
+ statusIds: ImmutablePropTypes.list,
+ isLoading: PropTypes.bool,
+ multiColumn: PropTypes.bool,
+ dispatch: PropTypes.func.isRequired,
+ };
+
+ componentDidMount () {
+ const { dispatch } = this.props;
+ dispatch(fetchTrendingStatuses());
+ }
+
+ render () {
+ const { isLoading, statusIds, multiColumn } = this.props;
+
+ const emptyMessage =
;
+
+ return (
+
+ );
+ }
+
+}
diff --git a/app/javascript/mastodon/features/explore/suggestions.js b/app/javascript/mastodon/features/explore/suggestions.js
new file mode 100644
index 000000000..0c6a7ef8a
--- /dev/null
+++ b/app/javascript/mastodon/features/explore/suggestions.js
@@ -0,0 +1,40 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import ImmutablePropTypes from 'react-immutable-proptypes';
+import AccountCard from 'mastodon/features/directory/components/account_card';
+import LoadingIndicator from 'mastodon/components/loading_indicator';
+import { connect } from 'react-redux';
+import { fetchSuggestions } from 'mastodon/actions/suggestions';
+
+const mapStateToProps = state => ({
+ suggestions: state.getIn(['suggestions', 'items']),
+ isLoading: state.getIn(['suggestions', 'isLoading']),
+});
+
+export default @connect(mapStateToProps)
+class Suggestions extends React.PureComponent {
+
+ static propTypes = {
+ isLoading: PropTypes.bool,
+ suggestions: ImmutablePropTypes.list,
+ dispatch: PropTypes.func.isRequired,
+ };
+
+ componentDidMount () {
+ const { dispatch } = this.props;
+ dispatch(fetchSuggestions(true));
+ }
+
+ render () {
+ const { isLoading, suggestions } = this.props;
+
+ return (
+
+ {isLoading ?
: suggestions.map(suggestion => (
+
+ ))}
+
+ );
+ }
+
+}
diff --git a/app/javascript/mastodon/features/explore/tags.js b/app/javascript/mastodon/features/explore/tags.js
new file mode 100644
index 000000000..c0ad9fc6e
--- /dev/null
+++ b/app/javascript/mastodon/features/explore/tags.js
@@ -0,0 +1,40 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import ImmutablePropTypes from 'react-immutable-proptypes';
+import { ImmutableHashtag as Hashtag } from 'mastodon/components/hashtag';
+import LoadingIndicator from 'mastodon/components/loading_indicator';
+import { connect } from 'react-redux';
+import { fetchTrendingHashtags } from 'mastodon/actions/trends';
+
+const mapStateToProps = state => ({
+ hashtags: state.getIn(['trends', 'tags', 'items']),
+ isLoadingHashtags: state.getIn(['trends', 'tags', 'isLoading']),
+});
+
+export default @connect(mapStateToProps)
+class Tags extends React.PureComponent {
+
+ static propTypes = {
+ hashtags: ImmutablePropTypes.list,
+ isLoading: PropTypes.bool,
+ dispatch: PropTypes.func.isRequired,
+ };
+
+ componentDidMount () {
+ const { dispatch } = this.props;
+ dispatch(fetchTrendingHashtags());
+ }
+
+ render () {
+ const { isLoading, hashtags } = this.props;
+
+ return (
+
+ {isLoading ? ( ) : hashtags.map(hashtag => (
+
+ ))}
+
+ );
+ }
+
+}
diff --git a/app/javascript/mastodon/features/getting_started/containers/trends_container.js b/app/javascript/mastodon/features/getting_started/containers/trends_container.js
index 7a5268780..a73832db7 100644
--- a/app/javascript/mastodon/features/getting_started/containers/trends_container.js
+++ b/app/javascript/mastodon/features/getting_started/containers/trends_container.js
@@ -1,13 +1,13 @@
import { connect } from 'react-redux';
-import { fetchTrends } from 'mastodon/actions/trends';
+import { fetchTrendingHashtags } from 'mastodon/actions/trends';
import Trends from '../components/trends';
const mapStateToProps = state => ({
- trends: state.getIn(['trends', 'items']),
+ trends: state.getIn(['trends', 'tags', 'items']),
});
const mapDispatchToProps = dispatch => ({
- fetchTrends: () => dispatch(fetchTrends()),
+ fetchTrends: () => dispatch(fetchTrendingHashtags()),
});
export default connect(mapStateToProps, mapDispatchToProps)(Trends);
diff --git a/app/javascript/mastodon/features/getting_started/index.js b/app/javascript/mastodon/features/getting_started/index.js
index 5508adb80..a9000a3d9 100644
--- a/app/javascript/mastodon/features/getting_started/index.js
+++ b/app/javascript/mastodon/features/getting_started/index.js
@@ -7,7 +7,7 @@ import { connect } from 'react-redux';
import PropTypes from 'prop-types';
import ImmutablePropTypes from 'react-immutable-proptypes';
import ImmutablePureComponent from 'react-immutable-pure-component';
-import { me, profile_directory, showTrends } from '../../initial_state';
+import { me, showTrends } from '../../initial_state';
import { fetchFollowRequests } from 'mastodon/actions/accounts';
import { List as ImmutableList } from 'immutable';
import NavigationContainer from '../compose/containers/navigation_container';
@@ -21,6 +21,7 @@ const messages = defineMessages({
public_timeline: { id: 'navigation_bar.public_timeline', defaultMessage: 'Federated timeline' },
settings_subheading: { id: 'column_subheading.settings', defaultMessage: 'Settings' },
community_timeline: { id: 'navigation_bar.community_timeline', defaultMessage: 'Local timeline' },
+ explore: { id: 'navigation_bar.explore', defaultMessage: 'Explore' },
direct: { id: 'navigation_bar.direct', defaultMessage: 'Direct messages' },
bookmarks: { id: 'navigation_bar.bookmarks', defaultMessage: 'Bookmarks' },
preferences: { id: 'navigation_bar.preferences', defaultMessage: 'Preferences' },
@@ -35,7 +36,6 @@ const messages = defineMessages({
personal: { id: 'navigation_bar.personal', defaultMessage: 'Personal' },
security: { id: 'navigation_bar.security', defaultMessage: 'Security' },
menu: { id: 'getting_started.heading', defaultMessage: 'Getting started' },
- profile_directory: { id: 'getting_started.directory', defaultMessage: 'Profile directory' },
});
const mapStateToProps = state => ({
@@ -98,31 +98,28 @@ class GettingStarted extends ImmutablePureComponent {
if (multiColumn) {
navItems.push(
,
+ );
+ height += 34;
+ }
+
+ navItems.push(
+
,
+ );
+ height += 48;
+
+ if (multiColumn) {
+ navItems.push(
,
,
);
- height += 34 + 48*2;
-
- if (profile_directory) {
- navItems.push(
-
,
- );
-
- height += 48;
- }
+ height += 48*2;
navItems.push(
,
);
height += 34;
- } else if (profile_directory) {
- navItems.push(
-
,
- );
-
- height += 48;
}
if (multiColumn && !columns.find(item => item.get('id') === 'HOME')) {
diff --git a/app/javascript/mastodon/features/hashtag_timeline/components/column_settings.js b/app/javascript/mastodon/features/hashtag_timeline/components/column_settings.js
index 142118cef..ede8907e5 100644
--- a/app/javascript/mastodon/features/hashtag_timeline/components/column_settings.js
+++ b/app/javascript/mastodon/features/hashtag_timeline/components/column_settings.js
@@ -40,7 +40,17 @@ class ColumnSettings extends React.PureComponent {
}
};
- onSelect = mode => value => this.props.onChange(['tags', mode], value);
+ onSelect = mode => value => {
+ const oldValue = this.tags(mode);
+
+ // Prevent changes that add more than 4 tags, but allow removing
+ // tags that were already added before
+ if ((value.length > 4) && !(value < oldValue)) {
+ return;
+ }
+
+ this.props.onChange(['tags', mode], value);
+ };
onToggle = () => {
if (this.state.open && this.hasTags()) {
diff --git a/app/javascript/mastodon/features/notifications/components/column_settings.js b/app/javascript/mastodon/features/notifications/components/column_settings.js
index 005f5afda..84db04430 100644
--- a/app/javascript/mastodon/features/notifications/components/column_settings.js
+++ b/app/javascript/mastodon/features/notifications/components/column_settings.js
@@ -5,6 +5,7 @@ import { FormattedMessage } from 'react-intl';
import ClearColumnButton from './clear_column_button';
import GrantPermissionButton from './grant_permission_button';
import SettingToggle from './setting_toggle';
+import { isStaff } from 'mastodon/initial_state';
export default class ColumnSettings extends React.PureComponent {
@@ -153,6 +154,30 @@ export default class ColumnSettings extends React.PureComponent {
+
+
+
+
+
+
+ {showPushSettings && }
+
+
+
+
+
+ {isStaff && (
+
+
+
+
+
+ {showPushSettings && }
+
+
+
+
+ )}
);
}
diff --git a/app/javascript/mastodon/features/notifications/components/notification.js b/app/javascript/mastodon/features/notifications/components/notification.js
index f9f8a87f2..9198e9c9d 100644
--- a/app/javascript/mastodon/features/notifications/components/notification.js
+++ b/app/javascript/mastodon/features/notifications/components/notification.js
@@ -19,6 +19,8 @@ const messages = defineMessages({
poll: { id: 'notification.poll', defaultMessage: 'A poll you have voted in has ended' },
reblog: { id: 'notification.reblog', defaultMessage: '{name} boosted your status' },
status: { id: 'notification.status', defaultMessage: '{name} just posted' },
+ update: { id: 'notification.update', defaultMessage: '{name} edited a post' },
+ adminSignUp: { id: 'notification.admin.sign_up', defaultMessage: '{name} signed up' },
});
const notificationForScreenReader = (intl, message, timestamp) => {
@@ -273,6 +275,38 @@ class Notification extends ImmutablePureComponent {
);
}
+ renderUpdate (notification, link) {
+ const { intl, unread } = this.props;
+
+ return (
+
+
+
+ );
+ }
+
renderPoll (notification, account) {
const { intl, unread } = this.props;
const ownPoll = me === account.get('id');
@@ -311,6 +345,28 @@ class Notification extends ImmutablePureComponent {
);
}
+ renderAdminSignUp (notification, account, link) {
+ const { intl, unread } = this.props;
+
+ return (
+
+
+
+ );
+ }
+
render () {
const { notification } = this.props;
const account = notification.get('account');
@@ -330,8 +386,12 @@ class Notification extends ImmutablePureComponent {
return this.renderReblog(notification, link);
case 'status':
return this.renderStatus(notification, link);
+ case 'update':
+ return this.renderUpdate(notification, link);
case 'poll':
return this.renderPoll(notification, account);
+ case 'admin.sign_up':
+ return this.renderAdminSignUp(notification, account, link);
}
return null;
diff --git a/app/javascript/mastodon/features/picture_in_picture/components/footer.js b/app/javascript/mastodon/features/picture_in_picture/components/footer.js
index f5ce50ac8..c3f3e0058 100644
--- a/app/javascript/mastodon/features/picture_in_picture/components/footer.js
+++ b/app/javascript/mastodon/features/picture_in_picture/components/footer.js
@@ -60,7 +60,7 @@ class Footer extends ImmutablePureComponent {
const { router } = this.context;
if (onClose) {
- onClose();
+ onClose(true);
}
dispatch(replyCompose(status, router.history));
@@ -156,7 +156,7 @@ class Footer extends ImmutablePureComponent {
- {withOpenButton && }
+ {withOpenButton && }
);
}
diff --git a/app/javascript/mastodon/features/report/category.js b/app/javascript/mastodon/features/report/category.js
new file mode 100644
index 000000000..a36dc81b1
--- /dev/null
+++ b/app/javascript/mastodon/features/report/category.js
@@ -0,0 +1,93 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import { defineMessages, injectIntl, FormattedMessage } from 'react-intl';
+import Button from 'mastodon/components/button';
+import Option from './components/option';
+
+const messages = defineMessages({
+ dislike: { id: 'report.reasons.dislike', defaultMessage: 'I don\'t like it' },
+ dislike_description: { id: 'report.reasons.dislike_description', defaultMessage: 'It is not something you want to see' },
+ spam: { id: 'report.reasons.spam', defaultMessage: 'It\'s spam' },
+ spam_description: { id: 'report.reasons.spam_description', defaultMessage: 'Malicious links, fake engagement, or repetitive replies' },
+ violation: { id: 'report.reasons.violation', defaultMessage: 'It violates server rules' },
+ violation_description: { id: 'report.reasons.violation_description', defaultMessage: 'You are aware that it breaks specific rules' },
+ other: { id: 'report.reasons.other', defaultMessage: 'It\'s something else' },
+ other_description: { id: 'report.reasons.other_description', defaultMessage: 'The issue does not fit into other categories' },
+ status: { id: 'report.category.title_status', defaultMessage: 'post' },
+ account: { id: 'report.category.title_account', defaultMessage: 'profile' },
+});
+
+export default @injectIntl
+class Category extends React.PureComponent {
+
+ static propTypes = {
+ onNextStep: PropTypes.func.isRequired,
+ category: PropTypes.string,
+ onChangeCategory: PropTypes.func.isRequired,
+ startedFrom: PropTypes.oneOf(['status', 'account']),
+ intl: PropTypes.object.isRequired,
+ };
+
+ handleNextClick = () => {
+ const { onNextStep, category } = this.props;
+
+ switch(category) {
+ case 'dislike':
+ onNextStep('thanks');
+ break;
+ case 'violation':
+ onNextStep('rules');
+ break;
+ default:
+ onNextStep('statuses');
+ break;
+ }
+ };
+
+ handleCategoryToggle = (value, checked) => {
+ const { onChangeCategory } = this.props;
+
+ if (checked) {
+ onChangeCategory(value);
+ }
+ };
+
+ render () {
+ const { category, startedFrom, intl } = this.props;
+
+ const options = [
+ 'dislike',
+ 'spam',
+ 'violation',
+ 'other',
+ ];
+
+ return (
+
+
+
+
+
+ {options.map(item => (
+
+ ))}
+
+
+
+
+
+
+
+
+ );
+ }
+
+}
diff --git a/app/javascript/mastodon/features/report/comment.js b/app/javascript/mastodon/features/report/comment.js
new file mode 100644
index 000000000..cde156415
--- /dev/null
+++ b/app/javascript/mastodon/features/report/comment.js
@@ -0,0 +1,83 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import { injectIntl, defineMessages, FormattedMessage } from 'react-intl';
+import Button from 'mastodon/components/button';
+import Toggle from 'react-toggle';
+
+const messages = defineMessages({
+ placeholder: { id: 'report.placeholder', defaultMessage: 'Type or paste additional comments' },
+});
+
+export default @injectIntl
+class Comment extends React.PureComponent {
+
+ static propTypes = {
+ onSubmit: PropTypes.func.isRequired,
+ comment: PropTypes.string.isRequired,
+ onChangeComment: PropTypes.func.isRequired,
+ intl: PropTypes.object.isRequired,
+ isSubmitting: PropTypes.bool,
+ forward: PropTypes.bool,
+ isRemote: PropTypes.bool,
+ domain: PropTypes.string,
+ onChangeForward: PropTypes.func.isRequired,
+ };
+
+ handleClick = () => {
+ const { onSubmit } = this.props;
+ onSubmit();
+ };
+
+ handleChange = e => {
+ const { onChangeComment } = this.props;
+ onChangeComment(e.target.value);
+ };
+
+ handleKeyDown = e => {
+ if (e.keyCode === 13 && (e.ctrlKey || e.metaKey)) {
+ this.handleClick();
+ }
+ };
+
+ handleForwardChange = e => {
+ const { onChangeForward } = this.props;
+ onChangeForward(e.target.checked);
+ };
+
+ render () {
+ const { comment, isRemote, forward, domain, isSubmitting, intl } = this.props;
+
+ return (
+
+
+
+
+
+ {isRemote && (
+
+
+
+
+
+
+
+
+ )}
+
+
+
+
+
+
+
+ );
+ }
+
+}
diff --git a/app/javascript/mastodon/features/report/components/option.js b/app/javascript/mastodon/features/report/components/option.js
new file mode 100644
index 000000000..744d85268
--- /dev/null
+++ b/app/javascript/mastodon/features/report/components/option.js
@@ -0,0 +1,60 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import classNames from 'classnames';
+import Check from 'mastodon/components/check';
+
+export default class Option extends React.PureComponent {
+
+ static propTypes = {
+ name: PropTypes.string.isRequired,
+ value: PropTypes.string.isRequired,
+ checked: PropTypes.bool,
+ label: PropTypes.node,
+ description: PropTypes.node,
+ onToggle: PropTypes.func,
+ multiple: PropTypes.bool,
+ labelComponent: PropTypes.node,
+ };
+
+ handleKeyPress = e => {
+ const { value, checked, onToggle } = this.props;
+
+ if (e.key === 'Enter' || e.key === ' ') {
+ e.stopPropagation();
+ e.preventDefault();
+ onToggle(value, !checked);
+ }
+ }
+
+ handleChange = e => {
+ const { value, onToggle } = this.props;
+ onToggle(value, e.target.checked);
+ }
+
+ render () {
+ const { name, value, checked, label, labelComponent, description, multiple } = this.props;
+
+ return (
+
+
+
+ {checked && }
+
+ {labelComponent ? labelComponent : (
+
+ {label}
+ {description}
+
+ )}
+
+ );
+ }
+
+}
diff --git a/app/javascript/mastodon/features/report/components/status_check_box.js b/app/javascript/mastodon/features/report/components/status_check_box.js
index c29e517da..373c60e21 100644
--- a/app/javascript/mastodon/features/report/components/status_check_box.js
+++ b/app/javascript/mastodon/features/report/components/status_check_box.js
@@ -1,72 +1,61 @@
import React from 'react';
import PropTypes from 'prop-types';
import ImmutablePropTypes from 'react-immutable-proptypes';
-import Toggle from 'react-toggle';
-import noop from 'lodash/noop';
-import StatusContent from '../../../components/status_content';
-import { MediaGallery, Video } from '../../ui/util/async-components';
-import Bundle from '../../ui/components/bundle';
+import StatusContent from 'mastodon/components/status_content';
+import Avatar from 'mastodon/components/avatar';
+import DisplayName from 'mastodon/components/display_name';
+import RelativeTimestamp from 'mastodon/components/relative_timestamp';
+import Option from './option';
+import MediaAttachments from 'mastodon/components/media_attachments';
export default class StatusCheckBox extends React.PureComponent {
static propTypes = {
+ id: PropTypes.string.isRequired,
status: ImmutablePropTypes.map.isRequired,
checked: PropTypes.bool,
onToggle: PropTypes.func.isRequired,
- disabled: PropTypes.bool,
+ };
+
+ handleStatusesToggle = (value, checked) => {
+ const { onToggle } = this.props;
+ onToggle(value, checked);
};
render () {
- const { status, checked, onToggle, disabled } = this.props;
- let media = null;
+ const { status, checked } = this.props;
if (status.get('reblog')) {
return null;
}
- if (status.get('media_attachments').size > 0) {
- if (status.get('media_attachments').some(item => item.get('type') === 'unknown')) {
+ const labelComponent = (
+
+
+
- } else if (status.getIn(['media_attachments', 0, 'type']) === 'video') {
- const video = status.getIn(['media_attachments', 0]);
+
+ ·
+
+
- media = (
-
- {Component => (
-
- )}
-
- );
- } else {
- media = (
-
- {Component => }
-
- );
- }
- }
+
+
+
+ );
return (
-
-
-
- {media}
-
-
-
-
-
-
+
);
}
diff --git a/app/javascript/mastodon/features/report/containers/status_check_box_container.js b/app/javascript/mastodon/features/report/containers/status_check_box_container.js
index 48cd0319b..65a7c11fd 100644
--- a/app/javascript/mastodon/features/report/containers/status_check_box_container.js
+++ b/app/javascript/mastodon/features/report/containers/status_check_box_container.js
@@ -1,19 +1,15 @@
import { connect } from 'react-redux';
import StatusCheckBox from '../components/status_check_box';
-import { toggleStatusReport } from '../../../actions/reports';
-import { Set as ImmutableSet } from 'immutable';
+import { makeGetStatus } from 'mastodon/selectors';
-const mapStateToProps = (state, { id }) => ({
- status: state.getIn(['statuses', id]),
- checked: state.getIn(['reports', 'new', 'status_ids'], ImmutableSet()).includes(id),
-});
+const makeMapStateToProps = () => {
+ const getStatus = makeGetStatus();
-const mapDispatchToProps = (dispatch, { id }) => ({
+ const mapStateToProps = (state, { id }) => ({
+ status: getStatus(state, { id }),
+ });
- onToggle (e) {
- dispatch(toggleStatusReport(id, e.target.checked));
- },
+ return mapStateToProps;
+};
-});
-
-export default connect(mapStateToProps, mapDispatchToProps)(StatusCheckBox);
+export default connect(makeMapStateToProps)(StatusCheckBox);
diff --git a/app/javascript/mastodon/features/report/rules.js b/app/javascript/mastodon/features/report/rules.js
new file mode 100644
index 000000000..f2db0d9e4
--- /dev/null
+++ b/app/javascript/mastodon/features/report/rules.js
@@ -0,0 +1,64 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import ImmutablePropTypes from 'react-immutable-proptypes';
+import { connect } from 'react-redux';
+import { FormattedMessage } from 'react-intl';
+import Button from 'mastodon/components/button';
+import Option from './components/option';
+
+const mapStateToProps = state => ({
+ rules: state.get('rules'),
+});
+
+export default @connect(mapStateToProps)
+class Rules extends React.PureComponent {
+
+ static propTypes = {
+ onNextStep: PropTypes.func.isRequired,
+ rules: ImmutablePropTypes.list,
+ selectedRuleIds: ImmutablePropTypes.set.isRequired,
+ onToggle: PropTypes.func.isRequired,
+ };
+
+ handleNextClick = () => {
+ const { onNextStep } = this.props;
+ onNextStep('statuses');
+ };
+
+ handleRulesToggle = (value, checked) => {
+ const { onToggle } = this.props;
+ onToggle(value, checked);
+ };
+
+ render () {
+ const { rules, selectedRuleIds } = this.props;
+
+ return (
+
+
+
+
+
+ {rules.map(item => (
+
+ ))}
+
+
+
+
+
+
+
+
+ );
+ }
+
+}
diff --git a/app/javascript/mastodon/features/report/statuses.js b/app/javascript/mastodon/features/report/statuses.js
new file mode 100644
index 000000000..d5d86034f
--- /dev/null
+++ b/app/javascript/mastodon/features/report/statuses.js
@@ -0,0 +1,61 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import ImmutablePropTypes from 'react-immutable-proptypes';
+import { connect } from 'react-redux';
+import StatusCheckBox from 'mastodon/features/report/containers/status_check_box_container';
+import { OrderedSet } from 'immutable';
+import { FormattedMessage } from 'react-intl';
+import Button from 'mastodon/components/button';
+import LoadingIndicator from 'mastodon/components/loading_indicator';
+
+const mapStateToProps = (state, { accountId }) => ({
+ availableStatusIds: OrderedSet(state.getIn(['timelines', `account:${accountId}:with_replies`, 'items'])),
+ isLoading: state.getIn(['timelines', `account:${accountId}:with_replies`, 'isLoading']),
+});
+
+export default @connect(mapStateToProps)
+class Statuses extends React.PureComponent {
+
+ static propTypes = {
+ onNextStep: PropTypes.func.isRequired,
+ accountId: PropTypes.string.isRequired,
+ availableStatusIds: ImmutablePropTypes.set.isRequired,
+ selectedStatusIds: ImmutablePropTypes.set.isRequired,
+ isLoading: PropTypes.bool,
+ onToggle: PropTypes.func.isRequired,
+ };
+
+ handleNextClick = () => {
+ const { onNextStep } = this.props;
+ onNextStep('comment');
+ };
+
+ render () {
+ const { availableStatusIds, selectedStatusIds, onToggle, isLoading } = this.props;
+
+ return (
+
+
+
+
+
+ {isLoading ? : availableStatusIds.union(selectedStatusIds).map(statusId => (
+
+ ))}
+
+
+
+
+
+
+
+
+ );
+ }
+
+}
diff --git a/app/javascript/mastodon/features/report/thanks.js b/app/javascript/mastodon/features/report/thanks.js
new file mode 100644
index 000000000..d169b1e32
--- /dev/null
+++ b/app/javascript/mastodon/features/report/thanks.js
@@ -0,0 +1,84 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import ImmutablePropTypes from 'react-immutable-proptypes';
+import { FormattedMessage } from 'react-intl';
+import Button from 'mastodon/components/button';
+import { connect } from 'react-redux';
+import {
+ unfollowAccount,
+ muteAccount,
+ blockAccount,
+} from 'mastodon/actions/accounts';
+
+const mapStateToProps = () => ({});
+
+export default @connect(mapStateToProps)
+class Thanks extends React.PureComponent {
+
+ static propTypes = {
+ submitted: PropTypes.bool,
+ onClose: PropTypes.func.isRequired,
+ account: ImmutablePropTypes.map.isRequired,
+ dispatch: PropTypes.func.isRequired,
+ };
+
+ handleCloseClick = () => {
+ const { onClose } = this.props;
+ onClose();
+ };
+
+ handleUnfollowClick = () => {
+ const { dispatch, account, onClose } = this.props;
+ dispatch(unfollowAccount(account.get('id')));
+ onClose();
+ };
+
+ handleMuteClick = () => {
+ const { dispatch, account, onClose } = this.props;
+ dispatch(muteAccount(account.get('id')));
+ onClose();
+ };
+
+ handleBlockClick = () => {
+ const { dispatch, account, onClose } = this.props;
+ dispatch(blockAccount(account.get('id')));
+ onClose();
+ };
+
+ render () {
+ const { account, submitted } = this.props;
+
+ return (
+
+ {submitted ? : }
+ {submitted ? : }
+
+ {account.getIn(['relationship', 'following']) && (
+
+
+
+
+
+
+ )}
+
+
+
+ {!account.getIn(['relationship', 'muting']) ? : }
+
+
+
+
+
+ {!account.getIn(['relationship', 'blocking']) ? : }
+
+
+
+
+
+
+
+ );
+ }
+
+}
diff --git a/app/javascript/mastodon/features/search/index.js b/app/javascript/mastodon/features/search/index.js
deleted file mode 100644
index 76bf70d4b..000000000
--- a/app/javascript/mastodon/features/search/index.js
+++ /dev/null
@@ -1,17 +0,0 @@
-import React from 'react';
-import SearchContainer from 'mastodon/features/compose/containers/search_container';
-import SearchResultsContainer from 'mastodon/features/compose/containers/search_results_container';
-
-const Search = () => (
-
-);
-
-export default Search;
diff --git a/app/javascript/mastodon/features/status/components/action_bar.js b/app/javascript/mastodon/features/status/components/action_bar.js
index 898d95c11..06b7f490b 100644
--- a/app/javascript/mastodon/features/status/components/action_bar.js
+++ b/app/javascript/mastodon/features/status/components/action_bar.js
@@ -11,6 +11,7 @@ import classNames from 'classnames';
const messages = defineMessages({
delete: { id: 'status.delete', defaultMessage: 'Delete' },
redraft: { id: 'status.redraft', defaultMessage: 'Delete & re-draft' },
+ edit: { id: 'status.edit', defaultMessage: 'Edit' },
direct: { id: 'status.direct', defaultMessage: 'Direct message @{name}' },
mention: { id: 'status.mention', defaultMessage: 'Mention @{name}' },
reply: { id: 'status.reply', defaultMessage: 'Reply' },
@@ -59,6 +60,7 @@ class ActionBar extends React.PureComponent {
onFavourite: PropTypes.func.isRequired,
onBookmark: PropTypes.func.isRequired,
onDelete: PropTypes.func.isRequired,
+ onEdit: PropTypes.func.isRequired,
onDirect: PropTypes.func.isRequired,
onMention: PropTypes.func.isRequired,
onMute: PropTypes.func,
@@ -98,6 +100,10 @@ class ActionBar extends React.PureComponent {
this.props.onDelete(this.props.status, this.context.router.history, true);
}
+ handleEditClick = () => {
+ this.props.onEdit(this.props.status, this.context.router.history);
+ }
+
handleDirectClick = () => {
this.props.onDirect(this.props.status.get('account'), this.context.router.history);
}
@@ -209,6 +215,7 @@ class ActionBar extends React.PureComponent {
menu.push({ text: intl.formatMessage(mutingConversation ? messages.unmuteConversation : messages.muteConversation), action: this.handleConversationMuteClick });
menu.push(null);
+ // menu.push({ text: intl.formatMessage(messages.edit), action: this.handleEditClick });
menu.push({ text: intl.formatMessage(messages.delete), action: this.handleDeleteClick });
menu.push({ text: intl.formatMessage(messages.redraft), action: this.handleRedraftClick });
} else {
diff --git a/app/javascript/mastodon/features/status/components/detailed_status.js b/app/javascript/mastodon/features/status/components/detailed_status.js
index ee4a6b989..c99e01f73 100644
--- a/app/javascript/mastodon/features/status/components/detailed_status.js
+++ b/app/javascript/mastodon/features/status/components/detailed_status.js
@@ -6,7 +6,7 @@ import DisplayName from '../../../components/display_name';
import StatusContent from '../../../components/status_content';
import MediaGallery from '../../../components/media_gallery';
import { Link } from 'react-router-dom';
-import { injectIntl, defineMessages, FormattedDate, FormattedMessage } from 'react-intl';
+import { injectIntl, defineMessages, FormattedDate } from 'react-intl';
import Card from './card';
import ImmutablePureComponent from 'react-immutable-pure-component';
import Video from '../../video';
@@ -16,6 +16,7 @@ import classNames from 'classnames';
import Icon from 'mastodon/components/icon';
import AnimatedNumber from 'mastodon/components/animated_number';
import PictureInPicturePlaceholder from 'mastodon/components/picture_in_picture_placeholder';
+import EditedTimestamp from 'mastodon/components/edited_timestamp';
const messages = defineMessages({
public_short: { id: 'privacy.public.short', defaultMessage: 'Public' },
@@ -242,7 +243,7 @@ class DetailedStatus extends ImmutablePureComponent {
edited = (
·
-
+
);
}
diff --git a/app/javascript/mastodon/features/status/index.js b/app/javascript/mastodon/features/status/index.js
index f342a3641..4d7f24834 100644
--- a/app/javascript/mastodon/features/status/index.js
+++ b/app/javascript/mastodon/features/status/index.js
@@ -29,6 +29,7 @@ import {
muteStatus,
unmuteStatus,
deleteStatus,
+ editStatus,
hideStatus,
revealStatus,
} from '../../actions/statuses';
@@ -273,6 +274,10 @@ class Status extends ImmutablePureComponent {
}
}
+ handleEditClick = (status, history) => {
+ this.props.dispatch(editStatus(status.get('id'), history));
+ }
+
handleDirectClick = (account, router) => {
this.props.dispatch(directCompose(account, router));
}
@@ -567,6 +572,7 @@ class Status extends ImmutablePureComponent {
onReblog={this.handleReblogClick}
onBookmark={this.handleBookmarkClick}
onDelete={this.handleDeleteClick}
+ onEdit={this.handleEditClick}
onDirect={this.handleDirectClick}
onMention={this.handleMentionClick}
onMute={this.handleMuteClick}
diff --git a/app/javascript/mastodon/features/ui/components/columns_area.js b/app/javascript/mastodon/features/ui/components/columns_area.js
index 193637113..db047f5f0 100644
--- a/app/javascript/mastodon/features/ui/components/columns_area.js
+++ b/app/javascript/mastodon/features/ui/components/columns_area.js
@@ -53,7 +53,7 @@ const messages = defineMessages({
publish: { id: 'compose_form.publish', defaultMessage: 'Toot' },
});
-const shouldHideFAB = path => path.match(/^\/statuses\/|^\/@[^/]+\/\d+|^\/publish|^\/search|^\/getting-started|^\/start/);
+const shouldHideFAB = path => path.match(/^\/statuses\/|^\/@[^/]+\/\d+|^\/publish|^\/explore|^\/getting-started|^\/start/);
export default @(component => injectIntl(component, { withRef: true }))
class ColumnsArea extends ImmutablePureComponent {
diff --git a/app/javascript/mastodon/features/ui/components/compare_history_modal.js b/app/javascript/mastodon/features/ui/components/compare_history_modal.js
new file mode 100644
index 000000000..ecccc8f7d
--- /dev/null
+++ b/app/javascript/mastodon/features/ui/components/compare_history_modal.js
@@ -0,0 +1,99 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import ImmutablePropTypes from 'react-immutable-proptypes';
+import { connect } from 'react-redux';
+import { FormattedMessage } from 'react-intl';
+import { closeModal } from 'mastodon/actions/modal';
+import emojify from 'mastodon/features/emoji/emoji';
+import escapeTextContentForBrowser from 'escape-html';
+import InlineAccount from 'mastodon/components/inline_account';
+import IconButton from 'mastodon/components/icon_button';
+import RelativeTimestamp from 'mastodon/components/relative_timestamp';
+import MediaAttachments from 'mastodon/components/media_attachments';
+
+const mapStateToProps = (state, { statusId }) => ({
+ versions: state.getIn(['history', statusId, 'items']),
+});
+
+const mapDispatchToProps = dispatch => ({
+
+ onClose() {
+ dispatch(closeModal());
+ },
+
+});
+
+export default @connect(mapStateToProps, mapDispatchToProps)
+class CompareHistoryModal extends React.PureComponent {
+
+ static propTypes = {
+ onClose: PropTypes.func.isRequired,
+ index: PropTypes.number.isRequired,
+ statusId: PropTypes.string.isRequired,
+ versions: ImmutablePropTypes.list.isRequired,
+ };
+
+ render () {
+ const { index, versions, onClose } = this.props;
+ const currentVersion = versions.get(index);
+
+ const emojiMap = currentVersion.get('emojis').reduce((obj, emoji) => {
+ obj[`:${emoji.get('shortcode')}:`] = emoji.toJS();
+ return obj;
+ }, {});
+
+ const content = { __html: emojify(currentVersion.get('content'), emojiMap) };
+ const spoilerContent = { __html: emojify(escapeTextContentForBrowser(currentVersion.get('spoiler_text')), emojiMap) };
+
+ const formattedDate = ;
+ const formattedName = ;
+
+ const label = currentVersion.get('original') ? (
+
+ ) : (
+
+ );
+
+ return (
+
+
+
+ {label}
+
+
+
+
+ {currentVersion.get('spoiler_text').length > 0 && (
+
+
+
+
+ )}
+
+
+
+ {!!currentVersion.get('poll') && (
+
+
+ {currentVersion.getIn(['poll', 'options']).map(option => (
+
+
+
+
+
+ ))}
+
+
+ )}
+
+
+
+
+
+ );
+ }
+
+}
diff --git a/app/javascript/mastodon/features/ui/components/link_footer.js b/app/javascript/mastodon/features/ui/components/link_footer.js
index bc74aa8b1..edf1104c4 100644
--- a/app/javascript/mastodon/features/ui/components/link_footer.js
+++ b/app/javascript/mastodon/features/ui/components/link_footer.js
@@ -2,11 +2,10 @@ import { connect } from 'react-redux';
import React from 'react';
import PropTypes from 'prop-types';
import { FormattedMessage, defineMessages, injectIntl } from 'react-intl';
-import { Link , NavLink } from 'react-router-dom';
-import { invitesEnabled, limitedFederationMode, version, repository, source_url } from 'mastodon/initial_state';
+import { Link } from 'react-router-dom';
+import { invitesEnabled, limitedFederationMode, version, repository, source_url, profile_directory as profileDirectory } from 'mastodon/initial_state';
import { logOut } from 'mastodon/utils/log_out';
import { openModal } from 'mastodon/actions/modal';
-import { isStaff } from '../../../initial_state';
const messages = defineMessages({
logoutMessage: { id: 'confirmations.logout.message', defaultMessage: 'Are you sure you want to log out?' },
@@ -14,7 +13,7 @@ const messages = defineMessages({
});
const mapDispatchToProps = (dispatch, { intl }) => ({
- onLogout() {
+ onLogout () {
dispatch(openModal('CONFIRM', {
message: intl.formatMessage(messages.logoutMessage),
confirm: intl.formatMessage(messages.logoutConfirm),
@@ -24,29 +23,14 @@ const mapDispatchToProps = (dispatch, { intl }) => ({
},
});
-// const themeIsDark = true;
-const displayMoreLinks = false;
export default @injectIntl
@connect(null, mapDispatchToProps)
class LinkFooter extends React.PureComponent {
static propTypes = {
- displayMoreLinks : PropTypes.bool,
- enableChristmasSnow : PropTypes.bool,
- minimumWeekToShowSnow: PropTypes.number,
- snowActive : PropTypes.bool,
- withHotkeys : PropTypes.bool,
- snow : PropTypes.func,
- themeIsDark : PropTypes.bool,
- theme : PropTypes.string,
- onLogout : PropTypes.func.isRequired,
- intl : PropTypes.object.isRequired,
- };
- static defaultProps = {
- displayMoreLinks : displayMoreLinks,
- enableChristmasSnow : false,
- themeIsDark : true,
- minimumWeekToShowSnow: 52,
+ withHotkeys: PropTypes.bool,
+ onLogout: PropTypes.func.isRequired,
+ intl: PropTypes.object.isRequired,
};
handleLogoutClick = e => {
@@ -56,241 +40,33 @@ class LinkFooter extends React.PureComponent {
this.props.onLogout();
return false;
- };
-
- constructor(props) {
- super(props);
- Date.prototype.getWeek = function () {
- var onejan = new Date(this.getFullYear(), 0, 1);
- return Math.ceil((((this - onejan) / 86400000) + onejan.getDay() + 1) / 7);
- };
-
- var weekNumber = (new Date()).getWeek();
- console.log('we are the week number weekNumber', weekNumber);
- // display snow during the last two weeks of the year
- const shouldWeDisplaySnow = (weekNumber > props.minimumWeekToShowSnow) && props.enableChristmasSnow;
-
- this.state = {
- displayMoreLinks : props.displayMoreLinks,
- enableChristmasSnow: shouldWeDisplaySnow,
- theme : props.theme,
- };
-
- // make snow effect
- if (shouldWeDisplaySnow) {
- import('../../../utils/snowstorm-min')
- .then((snowstorm) => {
- Window.snowstorm = snowstorm.default;
- this.state.snow = Window.snowstorm;
- // snowstorm.start();
- this.state.snowActive = true;
- })
- .catch((err) => console.error(err));
- }
-
}
- toggleMoreLinks = () => {
- this.setState({ displayMoreLinks: !this.state.displayMoreLinks });
- console.log('this.state.displayMoreLinks', this.state.displayMoreLinks);
- };
-
- toggleSnow = () => {
- if (this.state.snow) {
- if (this.state.snowActive) {
- this.state.snow.stop();
- this.state.enableChristmasSnow = false;
- } else {
- this.state.snow.start();
- this.state.enableChristmasSnow = true;
- }
- }
- };
-
- changeTheme(newTheme) {
- console.log('change theme en ', newTheme);
- }
-
- render() {
- const HashTagNavlinks = ['Mastoart', 'OpenStreetMaps', 'Ironèmes', 'vélo'];
+ render () {
const { withHotkeys } = this.props;
- var snowClasses = this.props.enableChristmasSnow ? 'snow-button active' : 'snow-button ';
- const navToTags = HashTagNavlinks.map(element => {
- return (
-
-
-
- #{element}
-
-
- );
- });
return (
- {/*custom cipherbliss links*/}
-
-
- contactez l'admin
-
-
- Supportez
- Cipherbliss
-
-
- {this.state.enableChristmasSnow && (
-
-
-
-
-
Joyeuses fêtes!
-
-
- )}
- {isStaff && (
-
-
-
-
- Trending hashtags
-
-
-
- Comptes
-
-
- )}
-
-
-
- {this.state.displayMoreLinks && (
-
-
-
-
-
-
- ·
-
- ·
-
- ·
-
- ·
-
- ·
-
- ·
-
-
-
-
- {repository} (v{version}),
- }}
- />
-
-
-
- )}
-
-
-
-
- {/*regular links */}
-
{invitesEnabled && · }
{withHotkeys && · }
·
{!limitedFederationMode && · }
+ {profileDirectory && · }
·
·
·
·
+
+
+ {repository} (v{version}) }}
+ />
+
);
}
diff --git a/app/javascript/mastodon/features/ui/components/modal_root.js b/app/javascript/mastodon/features/ui/components/modal_root.js
index 377cccda5..3fc235849 100644
--- a/app/javascript/mastodon/features/ui/components/modal_root.js
+++ b/app/javascript/mastodon/features/ui/components/modal_root.js
@@ -19,7 +19,8 @@ import {
EmbedModal,
ListEditor,
ListAdder,
-} from '../../../features/ui/util/async-components';
+ CompareHistoryModal,
+} from 'mastodon/features/ui/util/async-components';
const MODAL_COMPONENTS = {
'MEDIA': () => Promise.resolve({ default: MediaModal }),
@@ -34,7 +35,8 @@ const MODAL_COMPONENTS = {
'EMBED': EmbedModal,
'LIST_EDITOR': ListEditor,
'FOCAL_POINT': () => Promise.resolve({ default: FocalPointModal }),
- 'LIST_ADDER':ListAdder,
+ 'LIST_ADDER': ListAdder,
+ 'COMPARE_HISTORY': CompareHistoryModal,
};
export default class ModalRoot extends React.PureComponent {
@@ -43,6 +45,7 @@ export default class ModalRoot extends React.PureComponent {
type: PropTypes.string,
props: PropTypes.object,
onClose: PropTypes.func.isRequired,
+ ignoreFocus: PropTypes.bool,
};
state = {
@@ -77,7 +80,7 @@ export default class ModalRoot extends React.PureComponent {
return ;
}
- handleClose = () => {
+ handleClose = (ignoreFocus = false) => {
const { onClose } = this.props;
let message = null;
try {
@@ -87,7 +90,7 @@ export default class ModalRoot extends React.PureComponent {
// isn't set.
// This would be much smoother with react-intl 3+ and `forwardRef`.
}
- onClose(message);
+ onClose(message, ignoreFocus);
}
setModalRef = (c) => {
@@ -95,12 +98,12 @@ export default class ModalRoot extends React.PureComponent {
}
render () {
- const { type, props } = this.props;
+ const { type, props, ignoreFocus } = this.props;
const { backgroundColor } = this.state;
const visible = !!type;
return (
-
+
{visible && (
{(SpecificComponent) => }
diff --git a/app/javascript/mastodon/features/ui/components/navigation_panel.js b/app/javascript/mastodon/features/ui/components/navigation_panel.js
index 901dbdfcb..eb42115b7 100644
--- a/app/javascript/mastodon/features/ui/components/navigation_panel.js
+++ b/app/javascript/mastodon/features/ui/components/navigation_panel.js
@@ -2,7 +2,7 @@ import React from 'react';
import { NavLink, withRouter } from 'react-router-dom';
import { FormattedMessage } from 'react-intl';
import Icon from 'mastodon/components/icon';
-import { profile_directory, showTrends } from 'mastodon/initial_state';
+import { showTrends } from 'mastodon/initial_state';
import NotificationsCounterIcon from './notifications_counter_icon';
import FollowRequestsNavLink from './follow_requests_nav_link';
import ListPanel from './list_panel';
@@ -13,13 +13,13 @@ const NavigationPanel = () => (
+
- {profile_directory && }
diff --git a/app/javascript/mastodon/features/ui/components/report_modal.js b/app/javascript/mastodon/features/ui/components/report_modal.js
index f4f0a3884..744dd248b 100644
--- a/app/javascript/mastodon/features/ui/components/report_modal.js
+++ b/app/javascript/mastodon/features/ui/components/report_modal.js
@@ -1,38 +1,31 @@
import React from 'react';
import { connect } from 'react-redux';
-import { changeReportComment, changeReportForward, submitReport } from '../../../actions/reports';
-import { expandAccountTimeline } from '../../../actions/timelines';
+import { submitReport } from 'mastodon/actions/reports';
+import { expandAccountTimeline } from 'mastodon/actions/timelines';
+import { fetchRules } from 'mastodon/actions/rules';
import PropTypes from 'prop-types';
import ImmutablePropTypes from 'react-immutable-proptypes';
-import { makeGetAccount } from '../../../selectors';
+import { makeGetAccount } from 'mastodon/selectors';
import { defineMessages, FormattedMessage, injectIntl } from 'react-intl';
-import StatusCheckBox from '../../report/containers/status_check_box_container';
import { OrderedSet } from 'immutable';
import ImmutablePureComponent from 'react-immutable-pure-component';
-import Button from '../../../components/button';
-import Toggle from 'react-toggle';
-import IconButton from '../../../components/icon_button';
+import IconButton from 'mastodon/components/icon_button';
+import Category from 'mastodon/features/report/category';
+import Statuses from 'mastodon/features/report/statuses';
+import Rules from 'mastodon/features/report/rules';
+import Comment from 'mastodon/features/report/comment';
+import Thanks from 'mastodon/features/report/thanks';
const messages = defineMessages({
close: { id: 'lightbox.close', defaultMessage: 'Close' },
- placeholder: { id: 'report.placeholder', defaultMessage: 'Additional comments' },
- submit: { id: 'report.submit', defaultMessage: 'Submit' },
});
const makeMapStateToProps = () => {
const getAccount = makeGetAccount();
- const mapStateToProps = state => {
- const accountId = state.getIn(['reports', 'new', 'account_id']);
-
- return {
- isSubmitting: state.getIn(['reports', 'new', 'isSubmitting']),
- account: getAccount(state, accountId),
- comment: state.getIn(['reports', 'new', 'comment']),
- forward: state.getIn(['reports', 'new', 'forward']),
- statusIds: OrderedSet(state.getIn(['timelines', `account:${accountId}:with_replies`, 'items'])).union(state.getIn(['reports', 'new', 'status_ids'])),
- };
- };
+ const mapStateToProps = (state, { accountId }) => ({
+ account: getAccount(state, accountId),
+ });
return mapStateToProps;
};
@@ -42,92 +35,182 @@ export default @connect(makeMapStateToProps)
class ReportModal extends ImmutablePureComponent {
static propTypes = {
- isSubmitting: PropTypes.bool,
- account: ImmutablePropTypes.map,
- statusIds: ImmutablePropTypes.orderedSet.isRequired,
- comment: PropTypes.string.isRequired,
- forward: PropTypes.bool,
+ accountId: PropTypes.string.isRequired,
+ statusId: PropTypes.string,
dispatch: PropTypes.func.isRequired,
intl: PropTypes.object.isRequired,
+ account: ImmutablePropTypes.map.isRequired,
};
- handleCommentChange = e => {
- this.props.dispatch(changeReportComment(e.target.value));
- }
-
- handleForwardChange = e => {
- this.props.dispatch(changeReportForward(e.target.checked));
- }
+ state = {
+ step: 'category',
+ selectedStatusIds: OrderedSet(this.props.statusId ? [this.props.statusId] : []),
+ comment: '',
+ category: null,
+ selectedRuleIds: OrderedSet(),
+ forward: true,
+ isSubmitting: false,
+ isSubmitted: false,
+ };
handleSubmit = () => {
- this.props.dispatch(submitReport());
- }
+ const { dispatch, accountId } = this.props;
+ const { selectedStatusIds, comment, category, selectedRuleIds, forward } = this.state;
- handleKeyDown = e => {
- if (e.keyCode === 13 && (e.ctrlKey || e.metaKey)) {
- this.handleSubmit();
+ this.setState({ isSubmitting: true });
+
+ dispatch(submitReport({
+ account_id: accountId,
+ status_ids: selectedStatusIds.toArray(),
+ comment,
+ forward,
+ category,
+ rule_ids: selectedRuleIds.toArray(),
+ }, this.handleSuccess, this.handleFail));
+ };
+
+ handleSuccess = () => {
+ this.setState({ isSubmitting: false, isSubmitted: true, step: 'thanks' });
+ };
+
+ handleFail = () => {
+ this.setState({ isSubmitting: false });
+ };
+
+ handleStatusToggle = (statusId, checked) => {
+ const { selectedStatusIds } = this.state;
+
+ if (checked) {
+ this.setState({ selectedStatusIds: selectedStatusIds.add(statusId) });
+ } else {
+ this.setState({ selectedStatusIds: selectedStatusIds.remove(statusId) });
+ }
+ };
+
+ handleRuleToggle = (ruleId, checked) => {
+ const { selectedRuleIds } = this.state;
+
+ if (checked) {
+ this.setState({ selectedRuleIds: selectedRuleIds.add(ruleId) });
+ } else {
+ this.setState({ selectedRuleIds: selectedRuleIds.remove(ruleId) });
}
}
+ handleChangeCategory = category => {
+ this.setState({ category });
+ };
+
+ handleChangeComment = comment => {
+ this.setState({ comment });
+ };
+
+ handleChangeForward = forward => {
+ this.setState({ forward });
+ };
+
+ handleNextStep = step => {
+ this.setState({ step });
+ };
+
componentDidMount () {
- this.props.dispatch(expandAccountTimeline(this.props.account.get('id'), { withReplies: true }));
- }
+ const { dispatch, accountId } = this.props;
- componentWillReceiveProps (nextProps) {
- if (this.props.account !== nextProps.account && nextProps.account) {
- this.props.dispatch(expandAccountTimeline(nextProps.account.get('id'), { withReplies: true }));
- }
+ dispatch(expandAccountTimeline(accountId, { withReplies: true }));
+ dispatch(fetchRules());
}
render () {
- const { account, comment, intl, statusIds, isSubmitting, forward, onClose } = this.props;
+ const {
+ accountId,
+ account,
+ intl,
+ onClose,
+ } = this.props;
if (!account) {
return null;
}
- const domain = account.get('acct').split('@')[1];
+ const {
+ step,
+ selectedStatusIds,
+ selectedRuleIds,
+ comment,
+ forward,
+ category,
+ isSubmitting,
+ isSubmitted,
+ } = this.state;
+
+ const domain = account.get('acct').split('@')[1];
+ const isRemote = !!domain;
+
+ let stepComponent;
+
+ switch(step) {
+ case 'category':
+ stepComponent = (
+
+ );
+ break;
+ case 'rules':
+ stepComponent = (
+
+ );
+ break;
+ case 'statuses':
+ stepComponent = (
+
+ );
+ break;
+ case 'comment':
+ stepComponent = (
+
+ );
+ break;
+ case 'thanks':
+ stepComponent = (
+
+ );
+ }
return (
-
+
{account.get('acct')} }} />
-
-
-
-
-
-
- {domain && (
-
- )}
-
-
-
-
-
-
- {statusIds.map(statusId => )}
-
-
+
+ {stepComponent}
);
diff --git a/app/javascript/mastodon/features/ui/components/tabs_bar.js b/app/javascript/mastodon/features/ui/components/tabs_bar.js
index 2d37c5e3b..987452c78 100644
--- a/app/javascript/mastodon/features/ui/components/tabs_bar.js
+++ b/app/javascript/mastodon/features/ui/components/tabs_bar.js
@@ -12,7 +12,7 @@ export const links = [
,
,
,
-
,
+
,
,
];
diff --git a/app/javascript/mastodon/features/ui/containers/modal_container.js b/app/javascript/mastodon/features/ui/containers/modal_container.js
index 34fec8206..35be26222 100644
--- a/app/javascript/mastodon/features/ui/containers/modal_container.js
+++ b/app/javascript/mastodon/features/ui/containers/modal_container.js
@@ -3,22 +3,23 @@ import { openModal, closeModal } from '../../../actions/modal';
import ModalRoot from '../components/modal_root';
const mapStateToProps = state => ({
- type: state.getIn(['modal', 0, 'modalType'], null),
- props: state.getIn(['modal', 0, 'modalProps'], {}),
+ ignoreFocus: state.getIn(['modal', 'ignoreFocus']),
+ type: state.getIn(['modal', 'stack', 0, 'modalType'], null),
+ props: state.getIn(['modal', 'stack', 0, 'modalProps'], {}),
});
const mapDispatchToProps = dispatch => ({
- onClose (confirmationMessage) {
+ onClose (confirmationMessage, ignoreFocus = false) {
if (confirmationMessage) {
dispatch(
openModal('CONFIRM', {
message: confirmationMessage.message,
confirm: confirmationMessage.confirm,
- onConfirm: () => dispatch(closeModal()),
+ onConfirm: () => dispatch(closeModal(undefined, { ignoreFocus })),
}),
);
} else {
- dispatch(closeModal());
+ dispatch(closeModal(undefined, { ignoreFocus }));
}
},
});
diff --git a/app/javascript/mastodon/features/ui/index.js b/app/javascript/mastodon/features/ui/index.js
index 6fb88050f..2d0136992 100644
--- a/app/javascript/mastodon/features/ui/index.js
+++ b/app/javascript/mastodon/features/ui/index.js
@@ -49,8 +49,8 @@ import {
Mutes,
PinnedStatuses,
Lists,
- Search,
Directory,
+ Explore,
FollowRecommendations,
} from './util/async-components';
import { me } from '../../initial_state';
@@ -145,7 +145,7 @@ class SwitchingColumnsArea extends React.PureComponent {
render () {
const { children, mobile } = this.props;
- const redirect = mobile ?
:
;
+ const redirect = mobile ?
:
;
return (
@@ -153,33 +153,40 @@ class SwitchingColumnsArea extends React.PureComponent {
{redirect}
-
-
-
-
-
-
+
+
+
+
+
+
+
-
+
+
-
+
+
+
+
+
+
+
+
+
+ {/* Legacy routes, cannot be easily factored with other routes because they share a param name */}
+
+
-
-
-
-
-
-
@@ -453,7 +460,7 @@ class UI extends React.PureComponent {
}
handleHotkeyGoToHome = () => {
- this.context.router.history.push('/timelines/home');
+ this.context.router.history.push('/home');
}
handleHotkeyGoToNotifications = () => {
@@ -461,15 +468,15 @@ class UI extends React.PureComponent {
}
handleHotkeyGoToLocal = () => {
- this.context.router.history.push('/timelines/public/local');
+ this.context.router.history.push('/public/local');
}
handleHotkeyGoToFederated = () => {
- this.context.router.history.push('/timelines/public');
+ this.context.router.history.push('/public');
}
handleHotkeyGoToDirect = () => {
- this.context.router.history.push('/timelines/direct');
+ this.context.router.history.push('/conversations');
}
handleHotkeyGoToStart = () => {
@@ -485,7 +492,7 @@ class UI extends React.PureComponent {
}
handleHotkeyGoToProfile = () => {
- this.context.router.history.push(`/accounts/${me}`);
+ this.context.router.history.push(`/@${this.props.username}`);
}
handleHotkeyGoToBlocked = () => {
diff --git a/app/javascript/mastodon/features/ui/util/async-components.js b/app/javascript/mastodon/features/ui/util/async-components.js
index aa90b226a..92c683e2f 100644
--- a/app/javascript/mastodon/features/ui/util/async-components.js
+++ b/app/javascript/mastodon/features/ui/util/async-components.js
@@ -138,10 +138,6 @@ export function ListAdder () {
return import(/*webpackChunkName: "features/list_adder" */'../../list_adder');
}
-export function Search () {
- return import(/*webpackChunkName: "features/search" */'../../search');
-}
-
export function Tesseract () {
return import(/*webpackChunkName: "tesseract" */'tesseract.js');
}
@@ -157,3 +153,11 @@ export function Directory () {
export function FollowRecommendations () {
return import(/* webpackChunkName: "features/follow_recommendations" */'../../follow_recommendations');
}
+
+export function CompareHistoryModal () {
+ return import(/*webpackChunkName: "modals/compare_history_modal" */'../components/compare_history_modal');
+}
+
+export function Explore () {
+ return import(/* webpackChunkName: "features/explore" */'../../explore');
+}
diff --git a/app/javascript/mastodon/features/video/index.js b/app/javascript/mastodon/features/video/index.js
index dc6c77114..8d47e479a 100644
--- a/app/javascript/mastodon/features/video/index.js
+++ b/app/javascript/mastodon/features/video/index.js
@@ -1,10 +1,10 @@
import React from 'react';
import PropTypes from 'prop-types';
-import { defineMessages, FormattedMessage, injectIntl } from 'react-intl';
+import { defineMessages, injectIntl, FormattedMessage } from 'react-intl';
import { is } from 'immutable';
-import { debounce, throttle } from 'lodash';
+import { throttle, debounce } from 'lodash';
import classNames from 'classnames';
-import { exitFullscreen, isFullscreen, requestFullscreen } from '../ui/util/fullscreen';
+import { isFullscreen, requestFullscreen, exitFullscreen } from '../ui/util/fullscreen';
import { displayMedia, useBlurhash } from '../../initial_state';
import Icon from 'mastodon/components/icon';
import Blurhash from 'mastodon/components/blurhash';
@@ -101,27 +101,27 @@ class Video extends React.PureComponent {
preview: PropTypes.string,
frameRate: PropTypes.string,
src: PropTypes.string.isRequired,
- alt : PropTypes.string,
- width : PropTypes.number,
- height : PropTypes.number,
- sensitive : PropTypes.bool,
- currentTime : PropTypes.number,
- onOpenVideo : PropTypes.func,
- onCloseVideo : PropTypes.func,
- detailed : PropTypes.bool,
- inline : PropTypes.bool,
- editable : PropTypes.bool,
- alwaysVisible : PropTypes.bool,
- cacheWidth : PropTypes.func,
- visible : PropTypes.bool,
- onToggleVisibility : PropTypes.func,
+ alt: PropTypes.string,
+ width: PropTypes.number,
+ height: PropTypes.number,
+ sensitive: PropTypes.bool,
+ currentTime: PropTypes.number,
+ onOpenVideo: PropTypes.func,
+ onCloseVideo: PropTypes.func,
+ detailed: PropTypes.bool,
+ inline: PropTypes.bool,
+ editable: PropTypes.bool,
+ alwaysVisible: PropTypes.bool,
+ cacheWidth: PropTypes.func,
+ visible: PropTypes.bool,
+ onToggleVisibility: PropTypes.func,
deployPictureInPicture: PropTypes.func,
- intl : PropTypes.object.isRequired,
- blurhash : PropTypes.string,
- autoPlay : PropTypes.bool,
- volume : PropTypes.number,
- muted : PropTypes.bool,
- componetIndex : PropTypes.number,
+ intl: PropTypes.object.isRequired,
+ blurhash: PropTypes.string,
+ autoPlay: PropTypes.bool,
+ volume: PropTypes.number,
+ muted: PropTypes.bool,
+ componentIndex: PropTypes.number,
};
static defaultProps = {
@@ -499,10 +499,10 @@ class Video extends React.PureComponent {
this.video.pause();
this.props.onOpenVideo({
- startTime : this.video.currentTime,
- autoPlay : !this.state.paused,
+ startTime: this.video.currentTime,
+ autoPlay: !this.state.paused,
defaultVolume: this.state.volume,
- componetIndex: this.props.componetIndex,
+ componentIndex: this.props.componentIndex,
});
}
diff --git a/app/javascript/mastodon/locales/af.json b/app/javascript/mastodon/locales/af.json
index eca4765c4..088b5ff36 100644
--- a/app/javascript/mastodon/locales/af.json
+++ b/app/javascript/mastodon/locales/af.json
@@ -18,12 +18,12 @@
"account.followers": "Followers",
"account.followers.empty": "No one follows this user yet.",
"account.followers_counter": "{count, plural, one {{counter} Follower} other {{counter} Followers}}",
+ "account.following": "Following",
"account.following_counter": "{count, plural, one {{counter} Following} other {{counter} Following}}",
"account.follows.empty": "This user doesn't follow anyone yet.",
"account.follows_you": "Follows you",
"account.hide_reblogs": "Hide boosts from @{name}",
"account.joined": "Joined {date}",
- "account.last_status": "Last active",
"account.link_verified_on": "Ownership of this link was checked on {date}",
"account.locked_info": "This account privacy status is set to locked. The owner manually reviews who can follow them.",
"account.media": "Media",
@@ -32,7 +32,6 @@
"account.mute": "Mute @{name}",
"account.mute_notifications": "Mute notifications from @{name}",
"account.muted": "Muted",
- "account.never_active": "Never",
"account.posts": "Toots",
"account.posts_with_replies": "Toots and replies",
"account.report": "Report @{name}",
@@ -42,12 +41,15 @@
"account.statuses_counter": "{count, plural, one {{counter} Toot} other {{counter} Toots}}",
"account.unblock": "Unblock @{name}",
"account.unblock_domain": "Unblock domain {domain}",
+ "account.unblock_short": "Unblock",
"account.unendorse": "Don't feature on profile",
"account.unfollow": "Unfollow",
"account.unmute": "Unmute @{name}",
"account.unmute_notifications": "Unmute notifications from @{name}",
+ "account.unmute_short": "Unmute",
"account_note.placeholder": "Click to add a note",
- "admin.dashboard.retention": "Retention",
+ "admin.dashboard.daily_retention": "User retention rate by day after sign-up",
+ "admin.dashboard.monthly_retention": "User retention rate by month after sign-up",
"admin.dashboard.retention.average": "Average",
"admin.dashboard.retention.cohort": "Sign-up month",
"admin.dashboard.retention.cohort_size": "New users",
@@ -104,6 +106,7 @@
"compose_form.poll.switch_to_single": "Change poll to allow for a single choice",
"compose_form.publish": "Toot",
"compose_form.publish_loud": "{publish}!",
+ "compose_form.save_changes": "Save changes",
"compose_form.sensitive.hide": "{count, plural, one {Mark media as sensitive} other {Mark media as sensitive}}",
"compose_form.sensitive.marked": "{count, plural, one {Media is marked as sensitive} other {Media is marked as sensitive}}",
"compose_form.sensitive.unmarked": "{count, plural, one {Media is not marked as sensitive} other {Media is not marked as sensitive}}",
@@ -165,6 +168,7 @@
"empty_column.community": "The local timeline is empty. Write something publicly to get the ball rolling!",
"empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.",
"empty_column.domain_blocks": "There are no blocked domains yet.",
+ "empty_column.explore_statuses": "Nothing is trending right now. Check back later!",
"empty_column.favourited_statuses": "You don't have any favourite toots yet. When you favourite one, it will show up here.",
"empty_column.favourites": "No one has favourited this toot yet. When someone does, they will show up here.",
"empty_column.follow_recommendations": "Looks like no suggestions could be generated for you. You can try using search to look for people you might know or explore trending hashtags.",
@@ -183,6 +187,12 @@
"error.unexpected_crash.next_steps_addons": "Try disabling them and refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
"errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard",
"errors.unexpected_crash.report_issue": "Report issue",
+ "explore.search_results": "Search results",
+ "explore.suggested_follows": "For you",
+ "explore.title": "Explore",
+ "explore.trending_links": "News",
+ "explore.trending_statuses": "Posts",
+ "explore.trending_tags": "Hashtags",
"follow_recommendations.done": "Done",
"follow_recommendations.heading": "Follow people you'd like to see posts from! Here are some suggestions.",
"follow_recommendations.lead": "Posts from people you follow will show up in chronological order on your home feed. Don't be afraid to make mistakes, you can unfollow people just as easily any time!",
@@ -284,6 +294,7 @@
"navigation_bar.discover": "Discover",
"navigation_bar.domain_blocks": "Hidden domains",
"navigation_bar.edit_profile": "Edit profile",
+ "navigation_bar.explore": "Explore",
"navigation_bar.favourites": "Favourites",
"navigation_bar.filters": "Muted words",
"navigation_bar.follow_requests": "Follow requests",
@@ -298,6 +309,7 @@
"navigation_bar.preferences": "Preferences",
"navigation_bar.public_timeline": "Federated timeline",
"navigation_bar.security": "Security",
+ "notification.admin.sign_up": "{name} signed up",
"notification.favourite": "{name} favourited your status",
"notification.follow": "{name} followed you",
"notification.follow_request": "{name} has requested to follow you",
@@ -306,13 +318,15 @@
"notification.poll": "A poll you have voted in has ended",
"notification.reblog": "{name} boosted your status",
"notification.status": "{name} just posted",
+ "notification.update": "{name} edited a post",
"notifications.clear": "Clear notifications",
"notifications.clear_confirmation": "Are you sure you want to permanently clear all your notifications?",
+ "notifications.column_settings.admin.sign_up": "New sign-ups:",
"notifications.column_settings.alert": "Desktop notifications",
"notifications.column_settings.favourite": "Favourites:",
"notifications.column_settings.filter_bar.advanced": "Display all categories",
"notifications.column_settings.filter_bar.category": "Quick filter bar",
- "notifications.column_settings.filter_bar.show": "Show",
+ "notifications.column_settings.filter_bar.show_bar": "Show filter bar",
"notifications.column_settings.follow": "New followers:",
"notifications.column_settings.follow_request": "New follow requests:",
"notifications.column_settings.mention": "Mentions:",
@@ -322,7 +336,9 @@
"notifications.column_settings.show": "Show in column",
"notifications.column_settings.sound": "Play sound",
"notifications.column_settings.status": "New toots:",
- "notifications.column_settings.unread_markers.category": "Unread notification markers",
+ "notifications.column_settings.unread_notifications.category": "Unread notifications",
+ "notifications.column_settings.unread_notifications.highlight": "Highlight unread notifications",
+ "notifications.column_settings.update": "Edits:",
"notifications.filter.all": "All",
"notifications.filter.boosts": "Boosts",
"notifications.filter.favourites": "Favourites",
@@ -362,18 +378,54 @@
"regeneration_indicator.label": "Loading…",
"regeneration_indicator.sublabel": "Your home feed is being prepared!",
"relative_time.days": "{number}d",
+ "relative_time.full.days": "{number, plural, one {# day} other {# days}} ago",
+ "relative_time.full.hours": "{number, plural, one {# hour} other {# hours}} ago",
+ "relative_time.full.just_now": "just now",
+ "relative_time.full.minutes": "{number, plural, one {# minute} other {# minutes}} ago",
+ "relative_time.full.seconds": "{number, plural, one {# second} other {# seconds}} ago",
"relative_time.hours": "{number}h",
"relative_time.just_now": "now",
"relative_time.minutes": "{number}m",
"relative_time.seconds": "{number}s",
"relative_time.today": "today",
"reply_indicator.cancel": "Cancel",
+ "report.block": "Block",
+ "report.block_explanation": "You will not see their posts. They will not be able to see your posts or follow you. They will be able to tell that they are blocked.",
+ "report.categories.other": "Other",
+ "report.categories.spam": "Spam",
+ "report.categories.violation": "Content violates one or more server rules",
+ "report.category.subtitle": "Choose the best match",
+ "report.category.title": "Tell us what's going on with this {type}",
+ "report.category.title_account": "profile",
+ "report.category.title_status": "post",
+ "report.close": "Done",
+ "report.comment.title": "Is there anything else you think we should know?",
"report.forward": "Forward to {target}",
"report.forward_hint": "The account is from another server. Send an anonymized copy of the report there as well?",
- "report.hint": "The report will be sent to your server moderators. You can provide an explanation of why you are reporting this account below:",
- "report.placeholder": "Additional comments",
- "report.submit": "Submit",
+ "report.mute": "Mute",
+ "report.mute_explanation": "You will not see their posts. They can still follow you and see your posts and will not know that they are muted.",
+ "report.next": "Next",
+ "report.placeholder": "Type or paste additional comments",
+ "report.reasons.dislike": "I don't like it",
+ "report.reasons.dislike_description": "It is not something you want to see",
+ "report.reasons.other": "It's something else",
+ "report.reasons.other_description": "The issue does not fit into other categories",
+ "report.reasons.spam": "It's spam",
+ "report.reasons.spam_description": "Malicious links, fake engagement, or repetitive replies",
+ "report.reasons.violation": "It violates server rules",
+ "report.reasons.violation_description": "You are aware that it breaks specific rules",
+ "report.rules.subtitle": "Select all that apply",
+ "report.rules.title": "Which rules are being violated?",
+ "report.statuses.subtitle": "Select all that apply",
+ "report.statuses.title": "Are there any posts that back up this report?",
+ "report.submit": "Submit report",
"report.target": "Report {target}",
+ "report.thanks.take_action": "Here are your options for controlling what you see on Mastodon:",
+ "report.thanks.take_action_actionable": "While we review this, you can take action against @{name}:",
+ "report.thanks.title": "Don't want to see this?",
+ "report.thanks.title_actionable": "Thanks for reporting, we'll look into this.",
+ "report.unfollow": "Unfollow @{name}",
+ "report.unfollow_explanation": "You are following this account. To not see their posts in your home feed anymore, unfollow them.",
"search.placeholder": "Search",
"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.",
@@ -382,7 +434,9 @@
"search_popout.tips.text": "Simple text returns matching display names, usernames and hashtags",
"search_popout.tips.user": "user",
"search_results.accounts": "People",
+ "search_results.all": "All",
"search_results.hashtags": "Hashtags",
+ "search_results.nothing_found": "Could not find anything for these search terms",
"search_results.statuses": "Toots",
"search_results.statuses_fts_disabled": "Searching toots by their content is not enabled on this Mastodon server.",
"search_results.total": "{count, number} {count, plural, one {result} other {results}}",
@@ -396,9 +450,14 @@
"status.delete": "Delete",
"status.detailed_status": "Detailed conversation view",
"status.direct": "Direct message @{name}",
+ "status.edit": "Edit",
+ "status.edited": "Edited {date}",
+ "status.edited_x_times": "Edited {count, plural, one {{count} time} other {{count} times}}",
"status.embed": "Embed",
"status.favourite": "Favourite",
"status.filtered": "Filtered",
+ "status.history.created": "{name} created {date}",
+ "status.history.edited": "{name} edited {date}",
"status.load_more": "Load more",
"status.media_hidden": "Media hidden",
"status.mention": "Mention @{name}",
diff --git a/app/javascript/mastodon/locales/ar.json b/app/javascript/mastodon/locales/ar.json
index 0992394a2..6580f5d44 100644
--- a/app/javascript/mastodon/locales/ar.json
+++ b/app/javascript/mastodon/locales/ar.json
@@ -18,12 +18,12 @@
"account.followers": "المُتابِعون",
"account.followers.empty": "لا أحدَ يُتابع هذا المُستخدم حتى الآن.",
"account.followers_counter": "{count, plural, zero{لا مُتابع} one {مُتابعٌ واحِد} two{مُتابعانِ اِثنان} few{{counter} مُتابِعين} many{{counter} مُتابِعًا} other {{counter} مُتابع}}",
+ "account.following": "Following",
"account.following_counter": "{count, plural, zero{لا يُتابِع} one {يُتابِعُ واحد} two{يُتابِعُ اِثنان} few{يُتابِعُ {counter}} many{يُتابِعُ {counter}} other {يُتابِعُ {counter}}}",
"account.follows.empty": "لا يُتابع هذا المُستخدمُ أيَّ أحدٍ حتى الآن.",
"account.follows_you": "يُتابِعُك",
- "account.hide_reblogs": "إخفاء تعزيزات @{name}",
+ "account.hide_reblogs": "إخفاء مشاركات @{name}",
"account.joined": "انضم في {date}",
- "account.last_status": "آخر نشاط",
"account.link_verified_on": "تمَّ التَّحقق مِن مِلْكيّة هذا الرابط بتاريخ {date}",
"account.locked_info": "تمَّ تعيين حالة خصوصية هذا الحساب إلى مُقفَل. يُراجع المالك يدويًا من يمكنه متابعته.",
"account.media": "وسائط",
@@ -32,33 +32,35 @@
"account.mute": "كَتم @{name}",
"account.mute_notifications": "كَتم الإشعارات من @{name}",
"account.muted": "مَكتوم",
- "account.never_active": "أبدًا",
- "account.posts": "تبويقات",
- "account.posts_with_replies": "التَّبويقات والرُدود",
+ "account.posts": "منشورات",
+ "account.posts_with_replies": "المنشورات والرُدود",
"account.report": "الإبلاغ عن @{name}",
"account.requested": "في اِنتظر القُبول. اِنقُر لإلغاء طلب المُتابعة",
"account.share": "مُشاركة الملف الشخصي لـ @{name}",
- "account.show_reblogs": "عرض تعزيزات @{name}",
+ "account.show_reblogs": "عرض مشاركات @{name}",
"account.statuses_counter": "{count, plural, zero {لَا تَبويقات} one {تَبويقةٌ واحدة} two {تَبويقَتانِ اِثنتان} few {{counter} تَبويقات} many {{counter} تَبويقتًا} other {{counter} تَبويقة}}",
"account.unblock": "إلغاء الحَظر عن @{name}",
"account.unblock_domain": "إلغاء الحَظر عن النِّطاق {domain}",
+ "account.unblock_short": "Unblock",
"account.unendorse": "لا تُرَوِّج لهُ في الملف الشخصي",
"account.unfollow": "إلغاء المُتابعة",
"account.unmute": "إلغاء الكَتم عن @{name}",
"account.unmute_notifications": "إلغاء كَتم الإشعارات عن @{name}",
- "account_note.placeholder": "اِنقُر لإضافة مُلاحظة",
- "admin.dashboard.retention": "Retention",
- "admin.dashboard.retention.average": "Average",
- "admin.dashboard.retention.cohort": "Sign-up month",
- "admin.dashboard.retention.cohort_size": "New users",
+ "account.unmute_short": "Unmute",
+ "account_note.placeholder": "اضغط لإضافة مُلاحظة",
+ "admin.dashboard.daily_retention": "User retention rate by day after sign-up",
+ "admin.dashboard.monthly_retention": "User retention rate by month after sign-up",
+ "admin.dashboard.retention.average": "المعدل",
+ "admin.dashboard.retention.cohort": "شهر التسجيل",
+ "admin.dashboard.retention.cohort_size": "المستخدمون الجدد",
"alert.rate_limited.message": "يُرجى إعادة المحاولة بعد {retry_time, time, medium}.",
"alert.rate_limited.title": "المُعَدَّل مَحدود",
"alert.unexpected.message": "لقد طرأ خطأ غير متوقّع.",
"alert.unexpected.title": "المعذرة!",
"announcement.announcement": "إعلان",
- "attachments_list.unprocessed": "(unprocessed)",
+ "attachments_list.unprocessed": "(غير معالَج)",
"autosuggest_hashtag.per_week": "{count} في الأسبوع",
- "boost_modal.combo": "يُمكنك الضّغط على {combo} لتخطي هذا في المرة المُقبِلَة",
+ "boost_modal.combo": "يُمكنك الضّغط على {combo} لتخطي هذا في المرة المُقبلة",
"bundle_column_error.body": "لقد حدث خطأ ما أثناء تحميل هذا العنصر.",
"bundle_column_error.retry": "إعادة المُحاولة",
"bundle_column_error.title": "خطأ في الشبكة",
@@ -66,18 +68,18 @@
"bundle_modal_error.message": "لقد حدث خطأ ما أثناء تحميل هذا العنصر.",
"bundle_modal_error.retry": "إعادة المُحاولة",
"column.blocks": "المُستَخدِمون المَحظورون",
- "column.bookmarks": "العَلاماتُ المَرجعيَّة",
- "column.community": "الخَطُّ الزَّمَنِيُّ المَحَلِّيّ",
- "column.direct": "الرَّسَائِلُ المُبَاشِرَة",
- "column.directory": "تَصَفُّحُ المَلَفَّاتِ الشَّخصِيَّة",
+ "column.bookmarks": "الفواصل المرجعية",
+ "column.community": "الخيط الزمني المحلي",
+ "column.direct": "الرسائل المباشرة",
+ "column.directory": "تَصَفُّحُ المَلفات الشخصية",
"column.domain_blocks": "النِّطاقَاتُ المَحظُورَة",
"column.favourites": "المُفَضَّلَة",
"column.follow_requests": "طَلَبَاتُ المُتَابَعَة",
- "column.home": "الرَّئِيسَة",
- "column.lists": "القَوائِم",
+ "column.home": "الرئيسية",
+ "column.lists": "القوائم",
"column.mutes": "المُستَخدِمون المَكتومون",
"column.notifications": "الإشعارَات",
- "column.pins": "التَّبويقاتُ المُثَبَّتَة",
+ "column.pins": "المنشورات المُثَبَّتَة",
"column.public": "الخَطُّ الزَّمَنِيُّ المُوَحَّد",
"column_back_button.label": "العودة",
"column_header.hide_settings": "إخفاء الإعدادات",
@@ -86,13 +88,13 @@
"column_header.pin": "تثبيت",
"column_header.show_settings": "إظهار الإعدادات",
"column_header.unpin": "إلغاء التَّثبيت",
- "column_subheading.settings": "الإعدَادَات",
+ "column_subheading.settings": "الإعدادات",
"community.column_settings.local_only": "المحلي فقط",
"community.column_settings.media_only": "الوسائط فقط",
"community.column_settings.remote_only": "عن بُعد فقط",
"compose_form.direct_message_warning": "سوف تُرسَل هذه التَّبويقة فقط للمُستَخدِمين المَذكورين.",
"compose_form.direct_message_warning_learn_more": "تَعَلَّم المَزيد",
- "compose_form.hashtag_warning": "لن تُدرَج هذه التبويقة تحت أي وسم بما أنَّها غير مُدرَجة. فقط التبويقات العامة يُمكن البحث عنها بواسطة الوسم.",
+ "compose_form.hashtag_warning": "لن يُدرَج هذا المنشور تحت أي وسم بما أنَّه غير مُدرَج. فقط المنشورات العامة يُمكن البحث عنها بواسطة الوسم.",
"compose_form.lock_disclaimer": "حسابُك غير {locked}. يُمكن لأي شخص مُتابعتك لرؤية (منشورات المتابعين فقط).",
"compose_form.lock_disclaimer.lock": "مُقفَل",
"compose_form.placeholder": "فِيمَ تُفكِّر؟",
@@ -104,10 +106,11 @@
"compose_form.poll.switch_to_single": "تغيِير الاستطلاع للسماح باِخيار واحد فقط",
"compose_form.publish": "تبويق",
"compose_form.publish_loud": "{publish}!",
+ "compose_form.save_changes": "احفظ التعديلات",
"compose_form.sensitive.hide": "{count, plural, one {الإشارة إلى الوَسط كمُحتوى حسّاس} two{الإشارة إلى الوسطان كمُحتويان حسّاسان} other {الإشارة إلى الوسائط كمُحتويات حسّاسة}}",
"compose_form.sensitive.marked": "{count, plural, one {تمَّ الإشارة إلى الوسط كمُحتوى حسّاس} two{تمَّ الإشارة إلى الوسطان كمُحتويان حسّاسان} other {تمَّ الإشارة إلى الوسائط كمُحتويات حسّاسة}}",
"compose_form.sensitive.unmarked": "{count, plural, one {لم تَتِمّ الإشارة إلى الوسط كمُحتوى حسّاس} two{لم تَتِمّ الإشارة إلى الوسطان كمُحتويان حسّاسان} other {لم تَتِمّ الإشارة إلى الوسائط كمُحتويات حسّاسة}}",
- "compose_form.spoiler.marked": "إنّ النص مخفي وراء تحذير",
+ "compose_form.spoiler.marked": "إزالة تحذير المحتوى",
"compose_form.spoiler.unmarked": "إنَّ النص غير مخفي",
"compose_form.spoiler_placeholder": "اُكتُب تحذيركَ هُنا",
"confirmation_modal.cancel": "إلغاء",
@@ -118,8 +121,8 @@
"confirmations.delete.message": "هل أنتَ مُتأكدٌ أنك تُريدُ حَذفَ هذا المنشور؟",
"confirmations.delete_list.confirm": "حذف",
"confirmations.delete_list.message": "هل أنتَ مُتأكدٌ أنكَ تُريدُ حَذفَ هذِهِ القائمةَ بشكلٍ دائم؟",
- "confirmations.discard_edit_media.confirm": "Discard",
- "confirmations.discard_edit_media.message": "You have unsaved changes to the media description or preview, discard them anyway?",
+ "confirmations.discard_edit_media.confirm": "تجاهل",
+ "confirmations.discard_edit_media.message": "لديك تغييرات غير محفوظة لوصف الوسائط أو معاينتها، تجاهلها على أي حال؟",
"confirmations.domain_block.confirm": "حظر اِسم النِّطاق بشكلٍ كامل",
"confirmations.domain_block.message": "متأكد من أنك تود حظر اسم النطاق {domain} بالكامل ؟ في غالب الأحيان يُستَحسَن كتم أو حظر بعض الحسابات بدلا من حظر نطاق بالكامل.\nلن تتمكن مِن رؤية محتوى هذا النطاق لا على خيوطك العمومية و لا في إشعاراتك. سوف يتم كذلك إزالة كافة متابعيك المنتمين إلى هذا النطاق.",
"confirmations.logout.confirm": "خروج",
@@ -158,21 +161,22 @@
"emoji_button.symbols": "رموز",
"emoji_button.travel": "الأماكن والسفر",
"empty_column.account_suspended": "حساب معلق",
- "empty_column.account_timeline": "ليس هناك تبويقات!",
+ "empty_column.account_timeline": "لا توجد منشورات هنا!",
"empty_column.account_unavailable": "الملف التعريفي غير متوفر",
"empty_column.blocks": "لم تقم بحظر أي مستخدِم بعد.",
- "empty_column.bookmarked_statuses": "ليس لديك أية تبويقات في الفواصل المرجعية بعد. عندما ستقوم بإضافة البعض منها، ستظهر هنا.",
+ "empty_column.bookmarked_statuses": "ليس لديك أية منشورات في الفواصل المرجعية بعد. عندما ستقوم بإضافة البعض منها، ستظهر هنا.",
"empty_column.community": "الخط العام المحلي فارغ. أكتب شيئا ما للعامة كبداية!",
"empty_column.direct": "لم تتلق أية رسالة خاصة مباشِرة بعد. سوف يتم عرض الرسائل المباشرة هنا إن قمت بإرسال واحدة أو تلقيت البعض منها.",
"empty_column.domain_blocks": "ليس هناك نطاقات مخفية بعد.",
- "empty_column.favourited_statuses": "ليس لديك أية تبويقات مفضلة بعد. عندما ستقوم بالإعجاب بواحد، سيظهر هنا.",
- "empty_column.favourites": "لم يقم أي أحد بالإعجاب بهذا التبويق بعد. عندما يقوم أحدهم بذلك سوف يظهر هنا.",
+ "empty_column.explore_statuses": "Nothing is trending right now. Check back later!",
+ "empty_column.favourited_statuses": "ليس لديك أية منشورات مفضلة بعد. عندما ستقوم بالإعجاب بواحدة، ستظهر هنا.",
+ "empty_column.favourites": "لم يقم أي أحد بالإعجاب بهذا المنشور بعد. عندما يقوم أحدهم بذلك سوف يظهر هنا.",
"empty_column.follow_recommendations": "يبدو أنه لا يمكن إنشاء أي اقتراحات لك. يمكنك البحث عن أشخاص قد تعرفهم أو استكشاف الوسوم الرائجة.",
"empty_column.follow_requests": "ليس عندك أي طلب للمتابعة بعد. سوف تظهر طلباتك هنا إن قمت بتلقي البعض منها.",
"empty_column.hashtag": "ليس هناك بعدُ أي محتوى ذو علاقة بهذا الوسم.",
"empty_column.home": "إنّ الخيط الزمني لصفحتك الرئيسية فارغ. قم بزيارة {public} أو استخدم حقل البحث لكي تكتشف مستخدمين آخرين.",
"empty_column.home.suggestions": "شاهد بعض الاقتراحات",
- "empty_column.list": "هذه القائمة فارغة مؤقتا و لكن سوف تمتلئ تدريجيا عندما يبدأ الأعضاء المُنتَمين إليها بنشر تبويقات.",
+ "empty_column.list": "هذه القائمة فارغة مؤقتا و لكن سوف تمتلئ تدريجيا عندما يبدأ الأعضاء المُنتَمين إليها بنشر منشورات.",
"empty_column.lists": "ليس عندك أية قائمة بعد. سوف تظهر قائمتك هنا إن قمت بإنشاء واحدة.",
"empty_column.mutes": "لم تقم بكتم أي مستخدم بعد.",
"empty_column.notifications": "لم تتلق أي إشعار بعدُ. تفاعل مع المستخدمين الآخرين لإنشاء محادثة.",
@@ -183,9 +187,15 @@
"error.unexpected_crash.next_steps_addons": "حاول تعطيلهم وإنعاش الصفحة. إن لم ينجح ذلك، يمكنك دائمًا استخدام ماستدون عبر متصفح آخر أو تطبيق أصلي.",
"errors.unexpected_crash.copy_stacktrace": "انسخ تتبع الارتباطات إلى الحافظة",
"errors.unexpected_crash.report_issue": "الإبلاغ عن خلل",
+ "explore.search_results": "نتائج البحث",
+ "explore.suggested_follows": "لك",
+ "explore.title": "استكشف",
+ "explore.trending_links": "الأخبار",
+ "explore.trending_statuses": "المنشورات",
+ "explore.trending_tags": "الوسوم",
"follow_recommendations.done": "تم",
"follow_recommendations.heading": "تابع الأشخاص الذين ترغب في رؤية منشوراتهم! إليك بعض الاقتراحات.",
- "follow_recommendations.lead": "ستظهر المنشورات من الأشخاص الذين تُتابعتهم بترتيب تسلسلي زمني على صفحتك الرئيسية. لا تخف إذا ارتكبت أي أخطاء، تستطيع إلغاء متابعة أي شخص في أي وقت تريد!",
+ "follow_recommendations.lead": "ستظهر منشورات الأشخاص الذين تُتابعتهم بترتيب تسلسلي زمني على صفحتك الرئيسية. لا تخف إذا ارتكبت أي أخطاء، تستطيع إلغاء متابعة أي شخص في أي وقت تريد!",
"follow_request.authorize": "ترخيص",
"follow_request.reject": "رفض",
"follow_requests.unlocked_explanation": "على الرغم من أن حسابك غير مقفل، فإن موظفين الـ{domain} ظنوا أنك قد ترغب في مراجعة طلبات المتابعة من هذه الحسابات يدوياً.",
@@ -237,7 +247,7 @@
"keyboard_shortcuts.my_profile": "لفتح ملفك التعريفي",
"keyboard_shortcuts.notifications": "لفتح عمود الإشعارات",
"keyboard_shortcuts.open_media": "لفتح الوسائط",
- "keyboard_shortcuts.pinned": "لفتح قائمة التبويقات المدبسة",
+ "keyboard_shortcuts.pinned": "لفتح قائمة المنشورات المثبتة",
"keyboard_shortcuts.profile": "لفتح الملف التعريفي للناشر",
"keyboard_shortcuts.reply": "للردّ",
"keyboard_shortcuts.requests": "لفتح قائمة طلبات المتابعة",
@@ -246,7 +256,7 @@
"keyboard_shortcuts.start": "لفتح عمود \"هيا نبدأ\"",
"keyboard_shortcuts.toggle_hidden": "لعرض أو إخفاء النص مِن وراء التحذير",
"keyboard_shortcuts.toggle_sensitivity": "لعرض/إخفاء الوسائط",
- "keyboard_shortcuts.toot": "لتحرير تبويق جديد",
+ "keyboard_shortcuts.toot": "للشروع في تحرير منشور جديد",
"keyboard_shortcuts.unfocus": "لإلغاء التركيز على حقل النص أو نافذة البحث",
"keyboard_shortcuts.up": "للانتقال إلى أعلى القائمة",
"lightbox.close": "إغلاق",
@@ -279,11 +289,12 @@
"navigation_bar.blocks": "الحسابات المحجوبة",
"navigation_bar.bookmarks": "الفواصل المرجعية",
"navigation_bar.community_timeline": "الخيط العام المحلي",
- "navigation_bar.compose": "تحرير تبويق جديد",
+ "navigation_bar.compose": "لتحرير منشور جديد",
"navigation_bar.direct": "الرسائل المباشِرة",
"navigation_bar.discover": "اكتشف",
"navigation_bar.domain_blocks": "النطاقات المخفية",
"navigation_bar.edit_profile": "عدّل الملف التعريفي",
+ "navigation_bar.explore": "Explore",
"navigation_bar.favourites": "المفضلة",
"navigation_bar.filters": "الكلمات المكتومة",
"navigation_bar.follow_requests": "طلبات المتابعة",
@@ -294,25 +305,28 @@
"navigation_bar.logout": "خروج",
"navigation_bar.mutes": "الحسابات المكتومة",
"navigation_bar.personal": "شخصي",
- "navigation_bar.pins": "التبويقات المثبتة",
+ "navigation_bar.pins": "المنشورات المُثَبَّتَة",
"navigation_bar.preferences": "التفضيلات",
"navigation_bar.public_timeline": "الخيط العام الموحد",
"navigation_bar.security": "الأمان",
+ "notification.admin.sign_up": "{name} signed up",
"notification.favourite": "أُعجِب {name} بمنشورك",
"notification.follow": "{name} يتابعك",
"notification.follow_request": "لقد طلب {name} متابعتك",
"notification.mention": "{name} ذكرك",
"notification.own_poll": "انتهى استطلاعك للرأي",
"notification.poll": "لقد إنتها تصويت شاركت فيه",
- "notification.reblog": "{name} قام بترقية تبويقك",
+ "notification.reblog": "قام {name} بمشاركة منشورك",
"notification.status": "{name} نشر للتو",
+ "notification.update": "{name} edited a post",
"notifications.clear": "امسح الإخطارات",
"notifications.clear_confirmation": "أمتأكد من أنك تود مسح جل الإخطارات الخاصة بك و المتلقاة إلى حد الآن ؟",
+ "notifications.column_settings.admin.sign_up": "التسجيلات الجديدة:",
"notifications.column_settings.alert": "إشعارات سطح المكتب",
"notifications.column_settings.favourite": "المُفَضَّلة:",
"notifications.column_settings.filter_bar.advanced": "اعرض كافة الفئات",
"notifications.column_settings.filter_bar.category": "شريط الفلترة السريعة",
- "notifications.column_settings.filter_bar.show": "اظهِره",
+ "notifications.column_settings.filter_bar.show_bar": "إظهار شريط التصفية",
"notifications.column_settings.follow": "متابعُون جُدُد:",
"notifications.column_settings.follow_request": "الطلبات الجديد لِمتابَعتك:",
"notifications.column_settings.mention": "الإشارات:",
@@ -321,8 +335,10 @@
"notifications.column_settings.reblog": "الترقيّات:",
"notifications.column_settings.show": "اعرِضها في عمود",
"notifications.column_settings.sound": "أصدر صوتا",
- "notifications.column_settings.status": "تبويقات جديدة:",
- "notifications.column_settings.unread_markers.category": "علامات إشعار غير مقروءة",
+ "notifications.column_settings.status": "منشورات جديدة:",
+ "notifications.column_settings.unread_notifications.category": "إشعارات غير مقروءة",
+ "notifications.column_settings.unread_notifications.highlight": "علّم الإشعارات غير المقرؤة",
+ "notifications.column_settings.update": "التعديلات:",
"notifications.filter.all": "الكل",
"notifications.filter.boosts": "الترقيات",
"notifications.filter.favourites": "المفضلة",
@@ -346,7 +362,7 @@
"poll.total_votes": "{count, plural, one {# صوت} other {# أصوات}}",
"poll.vote": "صَوّت",
"poll.voted": "لقد صوّتت على هذه الإجابة",
- "poll.votes": "{votes, plural, one {# vote} other {# votes}}",
+ "poll.votes": "{votes, plural, one {# صوت} other {# أصوات}}",
"poll_button.add_poll": "إضافة استطلاع للرأي",
"poll_button.remove_poll": "إزالة استطلاع الرأي",
"privacy.change": "اضبط خصوصية المنشور",
@@ -362,18 +378,54 @@
"regeneration_indicator.label": "جارٍ التحميل…",
"regeneration_indicator.sublabel": "جارٍ تجهيز تغذية صفحتك الرئيسية!",
"relative_time.days": "{number}ي",
+ "relative_time.full.days": "منذ {number, plural, zero {} one {# يوم} two {# يومين} few {# أيام} many {# أيام} other {# يوم}}",
+ "relative_time.full.hours": "منذ {number, plural, zero {} one {# ساعة واحدة} two {# ساعتين} few {# ساعات} many {# ساعات} other {# ساعة}}",
+ "relative_time.full.just_now": "الآن",
+ "relative_time.full.minutes": "منذ {number, plural, zero {} one {# دقيقة واحدة} two {# دقيقتين} few {# دقائق} many {# دقيقة} other {# دقائق}}",
+ "relative_time.full.seconds": "منذ {number, plural, zero {} one {# ثانية واحدة} two {# ثانيتين} few {# ثوانٍ} many {# ثوانٍ} other {# ثانية}}",
"relative_time.hours": "{number}سا",
"relative_time.just_now": "الآن",
"relative_time.minutes": "{number}د",
"relative_time.seconds": "{number}ثا",
"relative_time.today": "اليوم",
"reply_indicator.cancel": "إلغاء",
+ "report.block": "حظر",
+ "report.block_explanation": "لن ترى مشاركاتهم ولن يمكنهم متابعتك أو رؤية مشاركاتك، سيكون بديهيا لهم أنهم مكتمون.",
+ "report.categories.other": "أخرى",
+ "report.categories.spam": "مزعج",
+ "report.categories.violation": "المحتوى ينتهك شرطا أو عدة شروط استخدام للخادم",
+ "report.category.subtitle": "Choose the best match",
+ "report.category.title": "Tell us what's going on with this {type}",
+ "report.category.title_account": "ملف تعريفي",
+ "report.category.title_status": "منشور",
+ "report.close": "تم",
+ "report.comment.title": "هل لديك شيء آخر لتخبرنا به؟",
"report.forward": "التحويل إلى {target}",
"report.forward_hint": "هذا الحساب ينتمي إلى خادوم آخَر. هل تودّ إرسال نسخة مجهولة مِن التقرير إلى هنالك أيضًا؟",
- "report.hint": "سوف يتم إرسال التقرير إلى المُشرِفين على خادومكم. بإمكانكم الإدلاء بشرح عن سبب الإبلاغ عن الحساب أسفله:",
+ "report.mute": "كتم",
+ "report.mute_explanation": "لن ترى مشاركاتهم. لكن سيبقى بإمكانهم متابعتك ورؤية مشاركاتك دون أن يعرفوا أنهم مكتمون.",
+ "report.next": "التالي",
"report.placeholder": "تعليقات إضافية",
+ "report.reasons.dislike": "لايعجبني",
+ "report.reasons.dislike_description": "ألا ترغب برؤيته",
+ "report.reasons.other": "It's something else",
+ "report.reasons.other_description": "The issue does not fit into other categories",
+ "report.reasons.spam": "It's spam",
+ "report.reasons.spam_description": "Malicious links, fake engagement, or repetitive replies",
+ "report.reasons.violation": "ينتهك قواعد الخادم",
+ "report.reasons.violation_description": "You are aware that it breaks specific rules",
+ "report.rules.subtitle": "Select all that apply",
+ "report.rules.title": "ما هي القواعد المنتهكة؟",
+ "report.statuses.subtitle": "Select all that apply",
+ "report.statuses.title": "هل توجد مشاركات تدعم صحة هذا البلاغ؟",
"report.submit": "إرسال",
"report.target": "ابلغ عن {target}",
+ "report.thanks.take_action": "Here are your options for controlling what you see on Mastodon:",
+ "report.thanks.take_action_actionable": "في أثناء مراجعتنا للبلاغ، يمكنك اتخاذ إجراء ضد @{name}:",
+ "report.thanks.title": "هل ترغب في مشاهدة هذا؟",
+ "report.thanks.title_actionable": "شُكرًا لَكَ على الإبلاغ، سَوفَ نَنظُرُ فِي هَذَا الأمر.",
+ "report.unfollow": "إلغاء متابعة @{name}",
+ "report.unfollow_explanation": "أنت تتابع هذا الحساب، لإزالة مَنشوراته من تغذيَتِكَ الرئيسة ألغ متابعته.",
"search.placeholder": "ابحث",
"search_popout.search_format": "نمط البحث المتقدم",
"search_popout.tips.full_text": "النص البسيط يقوم بعرض المنشورات التي كتبتها أو قمت بإرسالها أو ترقيتها أو تمت الإشارة إليك فيها من طرف آخرين ، بالإضافة إلى مطابقة أسماء المستخدمين وأسماء العرض وعلامات التصنيف.",
@@ -382,9 +434,11 @@
"search_popout.tips.text": "جملة قصيرة تُمكّنُك من عرض أسماء و حسابات و كلمات رمزية",
"search_popout.tips.user": "مستخدِم",
"search_results.accounts": "أشخاص",
+ "search_results.all": "الكل",
"search_results.hashtags": "الوُسوم",
- "search_results.statuses": "التبويقات",
- "search_results.statuses_fts_disabled": "البحث في التبويقات عن طريق المحتوى ليس مفعل في خادم ماستدون هذا.",
+ "search_results.nothing_found": "تعذر العثور على نتائج تتضمن هذه المصطلحات",
+ "search_results.statuses": "المنشورات",
+ "search_results.statuses_fts_disabled": "البحث عن المنشورات عن طريق المحتوى ليس مفعل في خادم ماستدون هذا.",
"search_results.total": "{count, number} {count, plural, zero {} one {نتيجة} two {نتيجتين} few {نتائج} many {نتائج} other {نتائج}}",
"status.admin_account": "افتح الواجهة الإدارية لـ @{name}",
"status.admin_status": "افتح هذا المنشور على واجهة الإشراف",
@@ -396,9 +450,14 @@
"status.delete": "احذف",
"status.detailed_status": "تفاصيل المحادثة",
"status.direct": "رسالة خاصة إلى @{name}",
+ "status.edit": "تعديل",
+ "status.edited": "عُدّل في {date}",
+ "status.edited_x_times": "عُدّل {count, plural, zero {} one {{count} مرة} two {{count} مرتين} few {{count} مرات} many {{count} مرات} other {{count} مرة}}",
"status.embed": "إدماج",
"status.favourite": "أضف إلى المفضلة",
"status.filtered": "مُصفّى",
+ "status.history.created": "{name} created {date}",
+ "status.history.edited": "{name} edited {date}",
"status.load_more": "حمّل المزيد",
"status.media_hidden": "الصورة مستترة",
"status.mention": "أذكُر @{name}",
@@ -407,12 +466,12 @@
"status.mute_conversation": "كتم المحادثة",
"status.open": "وسع هذه المشاركة",
"status.pin": "دبّسه على الصفحة التعريفية",
- "status.pinned": "تبويق مثبَّت",
+ "status.pinned": "منشور مثبَّت",
"status.read_more": "اقرأ المزيد",
"status.reblog": "رَقِّي",
"status.reblog_private": "القيام بالترقية إلى الجمهور الأصلي",
"status.reblogged_by": "رقّاه {name}",
- "status.reblogs.empty": "لم يقم أي أحد بترقية هذا التبويق بعد. عندما يقوم أحدهم بذلك سوف تظهر هنا.",
+ "status.reblogs.empty": "لم يقم أي أحد بمشاركة هذا المنشور بعد. عندما يقوم أحدهم بذلك سوف يظهر هنا.",
"status.redraft": "إزالة و إعادة الصياغة",
"status.remove_bookmark": "احذفه مِن الفواصل المرجعية",
"status.reply": "ردّ",
@@ -443,7 +502,7 @@
"timeline_hint.remote_resource_not_displayed": "{resource} من الخوادم الأخرى لا يتم عرضها.",
"timeline_hint.resources.followers": "المتابِعون",
"timeline_hint.resources.follows": "المتابَعون",
- "timeline_hint.resources.statuses": "التبويقات القديمة",
+ "timeline_hint.resources.statuses": "المنشورات القديمة",
"trends.counter_by_accounts": "{count,plural,zero{} one{{counter} شخص} two{{counter} شخصين} few{{counter} أشخاص } many{{counter} شخص} other{{counter} شخص}}",
"trends.trending_now": "المتداولة الآن",
"ui.beforeunload": "سوف تفقد مسودتك إن تركت ماستدون.",
@@ -462,7 +521,7 @@
"upload_form.video_description": "وصف للمعاقين بصريا أو لِذي قِصر السمع",
"upload_modal.analyzing_picture": "جارٍ فحص الصورة…",
"upload_modal.apply": "طبّق",
- "upload_modal.applying": "Applying…",
+ "upload_modal.applying": "جارٍ التطبيق…",
"upload_modal.choose_image": "اختر صورة",
"upload_modal.description_placeholder": "نصٌّ حكيمٌ لهُ سِرٌّ قاطِعٌ وَذُو شَأنٍ عَظيمٍ مكتوبٌ على ثوبٍ أخضرَ ومُغلفٌ بجلدٍ أزرق",
"upload_modal.detect_text": "اكتشف النص مِن الصورة",
diff --git a/app/javascript/mastodon/locales/ast.json b/app/javascript/mastodon/locales/ast.json
index 89a13246c..14e46e458 100644
--- a/app/javascript/mastodon/locales/ast.json
+++ b/app/javascript/mastodon/locales/ast.json
@@ -18,12 +18,12 @@
"account.followers": "Siguidores",
"account.followers.empty": "Naide sigue a esti usuariu entá.",
"account.followers_counter": "{count, plural, one {{counter} Follower} other {{counter} Followers}}",
+ "account.following": "Following",
"account.following_counter": "{count, plural, one {{counter} Following} other {{counter} Following}}",
"account.follows.empty": "Esti usuariu entá nun sigue a naide.",
"account.follows_you": "Síguete",
"account.hide_reblogs": "Anubrir les comparticiones de @{name}",
"account.joined": "Joined {date}",
- "account.last_status": "Cabera actividá",
"account.link_verified_on": "La propiedá d'esti enllaz foi comprobada'l {date}",
"account.locked_info": "This account privacy status is set to locked. The owner manually reviews who can follow them.",
"account.media": "Media",
@@ -32,31 +32,33 @@
"account.mute": "Silenciar a @{name}",
"account.mute_notifications": "Mute notifications from @{name}",
"account.muted": "Muted",
- "account.never_active": "Enxamás",
"account.posts": "Barritos",
"account.posts_with_replies": "Barritos y rempuestes",
"account.report": "Report @{name}",
"account.requested": "Esperando pola aprobación. Calca pa encaboxar la solicitú de siguimientu",
"account.share": "Share @{name}'s profile",
"account.show_reblogs": "Amosar les comparticiones de @{name}",
- "account.statuses_counter": "{count, plural, one {{counter} Toot} other {{counter} Toots}}",
+ "account.statuses_counter": "{count, plural, one {{counter} artículu} other {{counter} artículos}}",
"account.unblock": "Desbloquiar a @{name}",
"account.unblock_domain": "Amosar {domain}",
+ "account.unblock_short": "Unblock",
"account.unendorse": "Nun destacar nel perfil",
"account.unfollow": "Dexar de siguir",
"account.unmute": "Unmute @{name}",
"account.unmute_notifications": "Unmute notifications from @{name}",
+ "account.unmute_short": "Unmute",
"account_note.placeholder": "Click to add a note",
- "admin.dashboard.retention": "Retention",
+ "admin.dashboard.daily_retention": "User retention rate by day after sign-up",
+ "admin.dashboard.monthly_retention": "User retention rate by month after sign-up",
"admin.dashboard.retention.average": "Average",
"admin.dashboard.retention.cohort": "Sign-up month",
- "admin.dashboard.retention.cohort_size": "New users",
- "alert.rate_limited.message": "Please retry after {retry_time, time, medium}.",
+ "admin.dashboard.retention.cohort_size": "Usuarios nuevos",
+ "alert.rate_limited.message": "Volvi tentalo dempués de la hora: {retry_time, time, medium}.",
"alert.rate_limited.title": "Rate limited",
"alert.unexpected.message": "Asocedió un fallu inesperáu.",
"alert.unexpected.title": "¡Meca!",
"announcement.announcement": "Anunciu",
- "attachments_list.unprocessed": "(unprocessed)",
+ "attachments_list.unprocessed": "(ensin procesar)",
"autosuggest_hashtag.per_week": "{count} per selmana",
"boost_modal.combo": "Pues primir {combo} pa saltar esto la próxima vegada",
"bundle_column_error.body": "Asocedió daqué malo mentanto se cargaba esti componente.",
@@ -91,7 +93,7 @@
"community.column_settings.media_only": "Namái multimedia",
"community.column_settings.remote_only": "Remote only",
"compose_form.direct_message_warning": "Esti barritu namái va unviase a los usuarios mentaos.",
- "compose_form.direct_message_warning_learn_more": "Learn more",
+ "compose_form.direct_message_warning_learn_more": "Saber más",
"compose_form.hashtag_warning": "This toot won't be listed under any hashtag as it is unlisted. Only public toots can be searched by hashtag.",
"compose_form.lock_disclaimer": "Your account is not {locked}. Anyone can follow you to view your follower-only posts.",
"compose_form.lock_disclaimer.lock": "locked",
@@ -104,6 +106,7 @@
"compose_form.poll.switch_to_single": "Change poll to allow for a single choice",
"compose_form.publish": "Barritar",
"compose_form.publish_loud": "{publish}!",
+ "compose_form.save_changes": "Save changes",
"compose_form.sensitive.hide": "{count, plural, one {Mark media as sensitive} other {Mark media as sensitive}}",
"compose_form.sensitive.marked": "{count, plural, one {Media is marked as sensitive} other {Media is marked as sensitive}}",
"compose_form.sensitive.unmarked": "{count, plural, one {Media is not marked as sensitive} other {Media is not marked as sensitive}}",
@@ -151,20 +154,21 @@
"emoji_button.nature": "Natura",
"emoji_button.not_found": "¡Nun hai fustaxes! (╯°□°)╯︵ ┻━┻",
"emoji_button.objects": "Oxetos",
- "emoji_button.people": "Xente",
+ "emoji_button.people": "Persones",
"emoji_button.recent": "Úsase davezu",
- "emoji_button.search": "Guetar…",
+ "emoji_button.search": "Buscar…",
"emoji_button.search_results": "Search results",
"emoji_button.symbols": "Símbolos",
"emoji_button.travel": "Viaxes y llugares",
"empty_column.account_suspended": "Account suspended",
"empty_column.account_timeline": "¡Equí nun hai barritos!",
"empty_column.account_unavailable": "Profile unavailable",
- "empty_column.blocks": "Entá nun bloquiesti a nunengún usuariu.",
+ "empty_column.blocks": "Entá nun bloquiesti a nengún usuariu.",
"empty_column.bookmarked_statuses": "Entá nun tienes nengún barritu en Marcadores. Cuando amiestes unu, va amosase equí.",
"empty_column.community": "The local timeline is empty. Write something publicly to get the ball rolling!",
- "empty_column.direct": "Entá nun tienes nunengún mensaxe direutu. Cuando unvies o recibas dalgún, va apaecer equí.",
+ "empty_column.direct": "Entá nun tienes nuengún mensaxe direutu. Cuando unvies o recibas dalgún, va apaecer equí.",
"empty_column.domain_blocks": "Entá nun hai dominios anubríos.",
+ "empty_column.explore_statuses": "Nothing is trending right now. Check back later!",
"empty_column.favourited_statuses": "Entá nun tienes nengún barritu en Favoritos. Cuando amiestes unu, va amosase equí.",
"empty_column.favourites": "No one has favourited this toot yet. When someone does, they will show up here.",
"empty_column.follow_recommendations": "Looks like no suggestions could be generated for you. You can try using search to look for people you might know or explore trending hashtags.",
@@ -177,12 +181,18 @@
"empty_column.mutes": "Entá nun silenciesti a nunengún usuariu.",
"empty_column.notifications": "Entá nun tienes nunengún avisu. Interactúa con otros p'aniciar la conversación.",
"empty_column.public": "¡Equí nun hai nada! Escribi daqué público o sigui a usuarios d'otros sirvidores pa rellenar esto",
- "error.unexpected_crash.explanation": "Pola mor d'un fallu nel códigu o un problema de compatibilidá del restolador, esta páxina nun pudo amosase correutamente.",
- "error.unexpected_crash.explanation_addons": "This page could not be displayed correctly. This error is likely caused by a browser add-on or automatic translation tools.",
+ "error.unexpected_crash.explanation": "Pola mor d'un fallu nel códigu o un problema de compatibilidá del restolador, esta páxina nun se pudo amosar correutamente.",
+ "error.unexpected_crash.explanation_addons": "Esta páxina nun se pudo amosar correutamente. Ye probable que dalgún complementu del restolador o dalguna ferramienta de traducción automática produxere esti fallu.",
"error.unexpected_crash.next_steps": "Try refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
"error.unexpected_crash.next_steps_addons": "Try disabling them and refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
"errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard",
"errors.unexpected_crash.report_issue": "Report issue",
+ "explore.search_results": "Search results",
+ "explore.suggested_follows": "Pa ti",
+ "explore.title": "Explore",
+ "explore.trending_links": "Noticies",
+ "explore.trending_statuses": "Posts",
+ "explore.trending_tags": "Etiquetes",
"follow_recommendations.done": "Done",
"follow_recommendations.heading": "Follow people you'd like to see posts from! Here are some suggestions.",
"follow_recommendations.lead": "Posts from people you follow will show up in chronological order on your home feed. Don't be afraid to make mistakes, you can unfollow people just as easily any time!",
@@ -208,7 +218,7 @@
"hashtag.column_settings.tag_mode.none": "Nenguna d'estes",
"hashtag.column_settings.tag_toggle": "Incluyir les etiquetes adicionales d'esta columna",
"home.column_settings.basic": "Basic",
- "home.column_settings.show_reblogs": "Amosar toots compartíos",
+ "home.column_settings.show_reblogs": "Show boosts",
"home.column_settings.show_replies": "Amosar rempuestes",
"home.hide_announcements": "Hide announcements",
"home.show_announcements": "Show announcements",
@@ -216,38 +226,38 @@
"intervals.full.hours": "{number, plural, one {# hora} other {# hores}}",
"intervals.full.minutes": "{number, plural, one {# minutu} other {# minutos}}",
"keyboard_shortcuts.back": "pa dir p'atrás",
- "keyboard_shortcuts.blocked": "p'abrir la llista d'usuarios bloquiaos",
+ "keyboard_shortcuts.blocked": "Abrir la llista d'usuarios bloquiaos",
"keyboard_shortcuts.boost": "pa compartir un toot",
"keyboard_shortcuts.column": "to focus a status in one of the columns",
- "keyboard_shortcuts.compose": "pa enfocar l'área de composición",
+ "keyboard_shortcuts.compose": "Enfocar l'área de composición",
"keyboard_shortcuts.description": "Descripción",
- "keyboard_shortcuts.direct": "p'abrir la columna de los mensaxes direutos",
+ "keyboard_shortcuts.direct": "Abrir la columna de los mensaxes direutos",
"keyboard_shortcuts.down": "pa baxar na llista",
"keyboard_shortcuts.enter": "p'abrir estaos",
"keyboard_shortcuts.favourite": "p'amestar a Favoritos",
- "keyboard_shortcuts.favourites": "p'abrir la llista de favoritos",
- "keyboard_shortcuts.federated": "p'abrir la llinia temporal federada",
+ "keyboard_shortcuts.favourites": "Abrir la llista de favoritos",
+ "keyboard_shortcuts.federated": "Abrir la llinia temporal federada",
"keyboard_shortcuts.heading": "Atayos del tecláu",
"keyboard_shortcuts.home": "p'abrir la llinia temporal d'aniciu",
"keyboard_shortcuts.hotkey": "Atayu",
"keyboard_shortcuts.legend": "p'amosar esta lleenda",
"keyboard_shortcuts.local": "p'abrir la llinia temporal llocal",
"keyboard_shortcuts.mention": "pa mentar al autor",
- "keyboard_shortcuts.muted": "p'abrir la llista d'usuarios silenciaos",
+ "keyboard_shortcuts.muted": "Abrir la llista d'usuarios colos avisos desactivaos",
"keyboard_shortcuts.my_profile": "p'abrir el to perfil",
- "keyboard_shortcuts.notifications": "p'abrir la columna d'avisos",
+ "keyboard_shortcuts.notifications": "Abrir la columna d'avisos",
"keyboard_shortcuts.open_media": "to open media",
- "keyboard_shortcuts.pinned": "p'abrir la llista de barritos fixaos",
- "keyboard_shortcuts.profile": "p'abrir el perfil del autor",
+ "keyboard_shortcuts.pinned": "Abrir la llista d'artículos fixaos",
+ "keyboard_shortcuts.profile": "Abrir el perfil del autor/a",
"keyboard_shortcuts.reply": "pa responder",
- "keyboard_shortcuts.requests": "p'abrir la llista de solicitúes de siguimientu",
- "keyboard_shortcuts.search": "pa enfocar la gueta",
+ "keyboard_shortcuts.requests": "Abrir la llista de solicitúes de siguimientu",
+ "keyboard_shortcuts.search": "Enfocar la barra de busca",
"keyboard_shortcuts.spoilers": "to show/hide CW field",
- "keyboard_shortcuts.start": "p'abrir la columna «entamar»",
+ "keyboard_shortcuts.start": "Abrir la columna «Entamar»",
"keyboard_shortcuts.toggle_hidden": "to show/hide text behind CW",
"keyboard_shortcuts.toggle_sensitivity": "to show/hide media",
"keyboard_shortcuts.toot": "p'apenzar un barritu nuevu",
- "keyboard_shortcuts.unfocus": "pa desenfocar l'área de composición/gueta",
+ "keyboard_shortcuts.unfocus": "Desenfocar l'área de composición/busca",
"keyboard_shortcuts.up": "pa xubir na llista",
"lightbox.close": "Close",
"lightbox.compress": "Compress image view box",
@@ -265,14 +275,14 @@
"lists.replies_policy.list": "Members of the list",
"lists.replies_policy.none": "No one",
"lists.replies_policy.title": "Show replies to:",
- "lists.search": "Guetar ente la xente que sigues",
+ "lists.search": "Buscar ente la xente que sigues",
"lists.subheading": "Les tos llistes",
"load_pending": "{count, plural, one {# elementu nuevu} other {# elementos nuevos}}",
"loading_indicator.label": "Cargando…",
"media_gallery.toggle_visible": "Alternar la visibilidá",
- "missing_indicator.label": "Nun s'alcontró",
- "missing_indicator.sublabel": "Esti recursu nun pudo alcontrase",
- "mute_modal.duration": "Duration",
+ "missing_indicator.label": "Nun s'atopó",
+ "missing_indicator.sublabel": "Nun se pudo atopar esti recursu",
+ "mute_modal.duration": "Duración",
"mute_modal.hide_notifications": "¿Anubrir los avisos d'esti usuariu?",
"mute_modal.indefinite": "Indefinite",
"navigation_bar.apps": "Aplicaciones pa móviles",
@@ -284,6 +294,7 @@
"navigation_bar.discover": "Discover",
"navigation_bar.domain_blocks": "Dominios anubríos",
"navigation_bar.edit_profile": "Editar el perfil",
+ "navigation_bar.explore": "Explore",
"navigation_bar.favourites": "Favoritos",
"navigation_bar.filters": "Pallabres silenciaes",
"navigation_bar.follow_requests": "Solicitúes de siguimientu",
@@ -298,6 +309,7 @@
"navigation_bar.preferences": "Preferencies",
"navigation_bar.public_timeline": "Llinia temporal federada",
"navigation_bar.security": "Seguranza",
+ "notification.admin.sign_up": "{name} signed up",
"notification.favourite": "{name} favourited your status",
"notification.follow": "{name} siguióte",
"notification.follow_request": "{name} solicitó siguite",
@@ -305,14 +317,16 @@
"notification.own_poll": "Your poll has ended",
"notification.poll": "Finó una encuesta na que votesti",
"notification.reblog": "{name} compartió'l to estáu",
- "notification.status": "{name} just posted",
+ "notification.status": "{name} ta acabante d'espublizar",
+ "notification.update": "{name} editó l'artículu",
"notifications.clear": "Llimpiar avisos",
"notifications.clear_confirmation": "¿De xuru que quies llimpiar dafechu tolos avisos?",
+ "notifications.column_settings.admin.sign_up": "New sign-ups:",
"notifications.column_settings.alert": "Avisos d'escritoriu",
"notifications.column_settings.favourite": "Favoritos:",
"notifications.column_settings.filter_bar.advanced": "Amosar toles estayes",
"notifications.column_settings.filter_bar.category": "Barra de peñera rápida",
- "notifications.column_settings.filter_bar.show": "Amosar",
+ "notifications.column_settings.filter_bar.show_bar": "Show filter bar",
"notifications.column_settings.follow": "Siguidores nuevos:",
"notifications.column_settings.follow_request": "Solicitúes de siguimientu nueves:",
"notifications.column_settings.mention": "Menciones:",
@@ -322,7 +336,9 @@
"notifications.column_settings.show": "Amosar en columna",
"notifications.column_settings.sound": "Reproducir un soníu",
"notifications.column_settings.status": "New toots:",
- "notifications.column_settings.unread_markers.category": "Unread notification markers",
+ "notifications.column_settings.unread_notifications.category": "Avisos ensin lleer",
+ "notifications.column_settings.unread_notifications.highlight": "Highlight unread notifications",
+ "notifications.column_settings.update": "Edits:",
"notifications.filter.all": "Too",
"notifications.filter.boosts": "Boosts",
"notifications.filter.favourites": "Favourites",
@@ -335,9 +351,9 @@
"notifications.mark_as_read": "Mark every notification as read",
"notifications.permission_denied": "Desktop notifications are unavailable due to previously denied browser permissions request",
"notifications.permission_denied_alert": "Desktop notifications can't be enabled, as browser permission has been denied before",
- "notifications.permission_required": "Desktop notifications are unavailable because the required permission has not been granted.",
- "notifications_permission_banner.enable": "Enable desktop notifications",
- "notifications_permission_banner.how_to_control": "To receive notifications when Mastodon isn't open, enable desktop notifications. You can control precisely which types of interactions generate desktop notifications through the {icon} button above once they're enabled.",
+ "notifications.permission_required": "Los avisos d'escritoriu nun tán disponibles porque nun se concedió'l permisu riquíu.",
+ "notifications_permission_banner.enable": "Activar los avisos d'escritoriu",
+ "notifications_permission_banner.how_to_control": "Pa recibir avisos cuando Mastodon nun tea abiertu, activa los avisos del escritoriu. Pues controlar al milímetru qué tipu d'interaiciones xeneren avisos namás que s'activen, pente'l botón {icon} d'arriba.",
"notifications_permission_banner.title": "Never miss a thing",
"picture_in_picture.restore": "Put it back",
"poll.closed": "Acabó",
@@ -346,35 +362,71 @@
"poll.total_votes": "{count, plural, one {# votu} other {# votos}}",
"poll.vote": "Vote",
"poll.voted": "You voted for this answer",
- "poll.votes": "{votes, plural, one {# vote} other {# votes}}",
+ "poll.votes": "{votes, plural, one {# votu} other {# votos}}",
"poll_button.add_poll": "Amestar una encuesta",
- "poll_button.remove_poll": "Desaniciar la encuesta",
+ "poll_button.remove_poll": "Quitar la encuesta",
"privacy.change": "Adjust status privacy",
"privacy.direct.long": "Post to mentioned users only",
"privacy.direct.short": "Direct",
"privacy.private.long": "Post to followers only",
"privacy.private.short": "Namái siguidores",
- "privacy.public.long": "Post to public timelines",
+ "privacy.public.long": "Visible for all, shown in public timelines",
"privacy.public.short": "Public",
"privacy.unlisted.long": "Nun apaez nes llinies temporales públiques",
"privacy.unlisted.short": "Nun llistar",
"refresh": "Refresh",
"regeneration_indicator.label": "Cargando…",
"regeneration_indicator.sublabel": "¡Tamos tresnando'l feed d'Aniciu!",
- "relative_time.days": "{number}d",
- "relative_time.hours": "{number}h",
+ "relative_time.days": "{number} d",
+ "relative_time.full.days": "{number, plural, one {# day} other {# days}} ago",
+ "relative_time.full.hours": "{number, plural, one {# hour} other {# hours}} ago",
+ "relative_time.full.just_now": "puramente agora",
+ "relative_time.full.minutes": "{number, plural, one {# minute} other {# minutes}} ago",
+ "relative_time.full.seconds": "{number, plural, one {# second} other {# seconds}} ago",
+ "relative_time.hours": "{number} h",
"relative_time.just_now": "agora",
- "relative_time.minutes": "{number}m",
- "relative_time.seconds": "{number}s",
+ "relative_time.minutes": "{number} m",
+ "relative_time.seconds": "{number} s",
"relative_time.today": "güei",
"reply_indicator.cancel": "Encaboxar",
+ "report.block": "Block",
+ "report.block_explanation": "You will not see their posts. They will not be able to see your posts or follow you. They will be able to tell that they are blocked.",
+ "report.categories.other": "Other",
+ "report.categories.spam": "Spam",
+ "report.categories.violation": "Content violates one or more server rules",
+ "report.category.subtitle": "Choose the best match",
+ "report.category.title": "Tell us what's going on with this {type}",
+ "report.category.title_account": "profile",
+ "report.category.title_status": "post",
+ "report.close": "Done",
+ "report.comment.title": "Is there anything else you think we should know?",
"report.forward": "Forward to {target}",
- "report.forward_hint": "The account is from another server. Send an anonymized copy of the report there as well?",
- "report.hint": "L'informe va unviase a los llendadores del to sirvidor. Embaxo, pues desplicar por qué informes d'esta cuenta:",
+ "report.forward_hint": "La cuenta ye d'otru sirvidor. ¿Quies unviar ellí tamién una copia anónima del informe?",
+ "report.mute": "Mute",
+ "report.mute_explanation": "You will not see their posts. They can still follow you and see your posts and will not know that they are muted.",
+ "report.next": "Next",
"report.placeholder": "Comentarios adicionales",
+ "report.reasons.dislike": "I don't like it",
+ "report.reasons.dislike_description": "It is not something you want to see",
+ "report.reasons.other": "It's something else",
+ "report.reasons.other_description": "The issue does not fit into other categories",
+ "report.reasons.spam": "It's spam",
+ "report.reasons.spam_description": "Malicious links, fake engagement, or repetitive replies",
+ "report.reasons.violation": "It violates server rules",
+ "report.reasons.violation_description": "You are aware that it breaks specific rules",
+ "report.rules.subtitle": "Select all that apply",
+ "report.rules.title": "Which rules are being violated?",
+ "report.statuses.subtitle": "Select all that apply",
+ "report.statuses.title": "Are there any posts that back up this report?",
"report.submit": "Unviar",
"report.target": "Report {target}",
- "search.placeholder": "Guetar",
+ "report.thanks.take_action": "Here are your options for controlling what you see on Mastodon:",
+ "report.thanks.take_action_actionable": "While we review this, you can take action against @{name}:",
+ "report.thanks.title": "Don't want to see this?",
+ "report.thanks.title_actionable": "Thanks for reporting, we'll look into this.",
+ "report.unfollow": "Unfollow @{name}",
+ "report.unfollow_explanation": "You are following this account. To not see their posts in your home feed anymore, unfollow them.",
+ "search.placeholder": "Buscar",
"search_popout.search_format": "Formatu de gueta avanzada",
"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": "etiqueta",
@@ -382,7 +434,9 @@
"search_popout.tips.text": "Simple text returns matching display names, usernames and hashtags",
"search_popout.tips.user": "usuariu",
"search_results.accounts": "Xente",
+ "search_results.all": "All",
"search_results.hashtags": "Etiquetes",
+ "search_results.nothing_found": "Nun se pudo atopar nada con esos términos de busca",
"search_results.statuses": "Barritos",
"search_results.statuses_fts_disabled": "Esti sirvidor de Mastodon tien activada la gueta de barritos pol so conteníu.",
"search_results.total": "{count, number} {count, plural, one {resultáu} other {resultaos}}",
@@ -391,14 +445,19 @@
"status.block": "Bloquiar a @{name}",
"status.bookmark": "Amestar a Marcadores",
"status.cancel_reblog_private": "Dexar de compartir",
- "status.cannot_reblog": "Esti artículu nun pue compartise",
+ "status.cannot_reblog": "Esti artículu nun se pue compartir",
"status.copy": "Copiar l'enllaz al estáu",
"status.delete": "Desaniciar",
"status.detailed_status": "Detailed conversation view",
"status.direct": "Unviar un mensaxe direutu a @{name}",
+ "status.edit": "Edit",
+ "status.edited": "Edited {date}",
+ "status.edited_x_times": "Edited {count, plural, one {{count} time} other {{count} times}}",
"status.embed": "Empotrar",
"status.favourite": "Favourite",
"status.filtered": "Filtered",
+ "status.history.created": "{name} created {date}",
+ "status.history.edited": "{name} edited {date}",
"status.load_more": "Cargar más",
"status.media_hidden": "Multimedia anubrida",
"status.mention": "Mentar a @{name}",
@@ -408,7 +467,7 @@
"status.open": "Espander esti estáu",
"status.pin": "Fixar nel perfil",
"status.pinned": "Barritu fixáu",
- "status.read_more": "Read more",
+ "status.read_more": "Lleer más",
"status.reblog": "Compartir",
"status.reblog_private": "Compartir cola audiencia orixinal",
"status.reblogged_by": "{name} compartió",
@@ -436,10 +495,10 @@
"tabs_bar.notifications": "Avisos",
"tabs_bar.search": "Search",
"time_remaining.days": "{number, plural, one {Queda # día} other {Queden # díes}}",
- "time_remaining.hours": "{number, plural, one {# hora restante} other {# hores restantes}}",
- "time_remaining.minutes": "{number, plural, one {# minutu restante} other {# minutos restantes}}",
+ "time_remaining.hours": "{number, plural, one {Queda # hora} other {Queden # hores}}",
+ "time_remaining.minutes": "{number, plural, one {Queda # minutu} other {Queden # minutos}}",
"time_remaining.moments": "Moments remaining",
- "time_remaining.seconds": "{number, plural, one {# segundu restante} other {# segundos restantes}}",
+ "time_remaining.seconds": "{number, plural, one {Queda # segundu} other {Queden # segundos}}",
"timeline_hint.remote_resource_not_displayed": "{resource} from other servers are not displayed.",
"timeline_hint.resources.followers": "Followers",
"timeline_hint.resources.follows": "Follows",
@@ -447,9 +506,9 @@
"trends.counter_by_accounts": "{count, plural, one {{counter} person} other {{counter} people}} talking",
"trends.trending_now": "Trending now",
"ui.beforeunload": "El borrador va perdese si coles de Mastodon.",
- "units.short.billion": "{count}B",
- "units.short.million": "{count}M",
- "units.short.thousand": "{count}K",
+ "units.short.billion": "{count} B",
+ "units.short.million": "{count} M",
+ "units.short.thousand": "{count} K",
"upload_area.title": "Arrastra y suelta pa xubir",
"upload_button.label": "Add images, a video or an audio file",
"upload_error.limit": "File upload limit exceeded.",
@@ -462,10 +521,10 @@
"upload_form.video_description": "Descripción pa persones con perda auditiva o discapacidá visual",
"upload_modal.analyzing_picture": "Analizando la semeya…",
"upload_modal.apply": "Aplicar",
- "upload_modal.applying": "Applying…",
+ "upload_modal.applying": "Aplicando…",
"upload_modal.choose_image": "Choose image",
"upload_modal.description_placeholder": "A quick brown fox jumps over the lazy dog",
- "upload_modal.detect_text": "Deteutar el testu de la semeya",
+ "upload_modal.detect_text": "Detectar el testu de la semeya",
"upload_modal.edit_media": "Edición",
"upload_modal.hint": "Calca o arrastra'l círculu de la previsualización pa escoyer el puntu d'enfoque que va amosase siempres en toles miniatures.",
"upload_modal.preparing_ocr": "Preparing OCR…",
@@ -477,8 +536,8 @@
"video.expand": "Espander el videu",
"video.fullscreen": "Pantalla completa",
"video.hide": "Anubrir el videu",
- "video.mute": "Silenciar el soníu",
+ "video.mute": "Desactivar el soníu",
"video.pause": "Posar",
"video.play": "Reproducir",
- "video.unmute": "Unmute sound"
+ "video.unmute": "Activar el soníu"
}
diff --git a/app/javascript/mastodon/locales/bg.json b/app/javascript/mastodon/locales/bg.json
index 8e3848f54..e65681394 100644
--- a/app/javascript/mastodon/locales/bg.json
+++ b/app/javascript/mastodon/locales/bg.json
@@ -18,12 +18,12 @@
"account.followers": "Последователи",
"account.followers.empty": "Все още никой не следва този потребител.",
"account.followers_counter": "{count, plural, one {{counter} Последовател} other {{counter} Последователи}}",
+ "account.following": "Following",
"account.following_counter": "{count, plural, one {{counter} Последван} other {{counter} Последвани}}",
"account.follows.empty": "Този потребител все още не следва никого.",
"account.follows_you": "Твой последовател",
"account.hide_reblogs": "Скриване на споделяния от @{name}",
"account.joined": "Joined {date}",
- "account.last_status": "Последно активен/а",
"account.link_verified_on": "Собствеността върху тази връзка е проверена на {date}",
"account.locked_info": "Този акаунт е поверително заключен. Собственикът преглежда ръчно кой може да го следва.",
"account.media": "Мултимедия",
@@ -32,7 +32,6 @@
"account.mute": "Заглушаване на @{name}",
"account.mute_notifications": "Заглушаване на известия от @{name}",
"account.muted": "Заглушено",
- "account.never_active": "Никога",
"account.posts": "Публикации",
"account.posts_with_replies": "Toots with replies",
"account.report": "Докладване на @{name}",
@@ -42,12 +41,15 @@
"account.statuses_counter": "{count, plural, one {{counter} Публикация} other {{counter} Публикации}}",
"account.unblock": "Не блокирай",
"account.unblock_domain": "Unhide {domain}",
+ "account.unblock_short": "Unblock",
"account.unendorse": "Не включвайте в профила",
"account.unfollow": "Не следвай",
"account.unmute": "Раззаглушаване на @{name}",
"account.unmute_notifications": "Раззаглушаване на известия от @{name}",
+ "account.unmute_short": "Unmute",
"account_note.placeholder": "Click to add a note",
- "admin.dashboard.retention": "Retention",
+ "admin.dashboard.daily_retention": "User retention rate by day after sign-up",
+ "admin.dashboard.monthly_retention": "User retention rate by month after sign-up",
"admin.dashboard.retention.average": "Average",
"admin.dashboard.retention.cohort": "Sign-up month",
"admin.dashboard.retention.cohort_size": "New users",
@@ -104,6 +106,7 @@
"compose_form.poll.switch_to_single": "Промяна на анкетата, за да се позволи един възможен избор",
"compose_form.publish": "Раздумай",
"compose_form.publish_loud": "{publish}!",
+ "compose_form.save_changes": "Save changes",
"compose_form.sensitive.hide": "{count, plural, one {Маркиране на мултимедията като деликатна} other {Маркиране на мултимедиите като деликатни}}",
"compose_form.sensitive.marked": "{count, plural, one {Мултимедията е маркирана като деликатна} other {Мултимедиите са маркирани като деликатни}}",
"compose_form.sensitive.unmarked": "{count, plural, one {Мултимедията не е маркирана като деликатна} other {Мултимедиите не са маркирани като деликатни}}",
@@ -165,6 +168,7 @@
"empty_column.community": "Локалната емисия е празна. Напишете нещо публично, за да започнете!",
"empty_column.direct": "Все още нямате директни съобщения. Когато изпратите или получите някое, то ще се покаже тук.",
"empty_column.domain_blocks": "There are no hidden domains yet.",
+ "empty_column.explore_statuses": "Nothing is trending right now. Check back later!",
"empty_column.favourited_statuses": "Все още нямате любими публикации. Когато поставите някоя в любими, тя ще се покаже тук.",
"empty_column.favourites": "Все още никой не е поставил тази публикация в любими. Когато някой го направи, ще се покаже тук.",
"empty_column.follow_recommendations": "Looks like no suggestions could be generated for you. You can try using search to look for people you might know or explore trending hashtags.",
@@ -183,6 +187,12 @@
"error.unexpected_crash.next_steps_addons": "Опитайте да ги деактивирате и да опресните страницата. Ако това не помогне, може все още да използвате Mastodon чрез различен браузър или приложение.",
"errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard",
"errors.unexpected_crash.report_issue": "Сигнал за проблем",
+ "explore.search_results": "Search results",
+ "explore.suggested_follows": "For you",
+ "explore.title": "Explore",
+ "explore.trending_links": "News",
+ "explore.trending_statuses": "Posts",
+ "explore.trending_tags": "Hashtags",
"follow_recommendations.done": "Done",
"follow_recommendations.heading": "Следвайте хора, които харесвате, за да виждате техните съобщения! Ето някои предложения.",
"follow_recommendations.lead": "Съобщения от хора, които следвате, ще се показват в хронологичен ред на вашата главна страница. Не се страхувайте, че ще сгрешите, по всяко време много лесно можете да спрете да ги следвате!",
@@ -284,6 +294,7 @@
"navigation_bar.discover": "Откриване",
"navigation_bar.domain_blocks": "Hidden domains",
"navigation_bar.edit_profile": "Редактирай профил",
+ "navigation_bar.explore": "Explore",
"navigation_bar.favourites": "Любими",
"navigation_bar.filters": "Заглушени думи",
"navigation_bar.follow_requests": "Заявки за последване",
@@ -298,6 +309,7 @@
"navigation_bar.preferences": "Предпочитания",
"navigation_bar.public_timeline": "Публичен канал",
"navigation_bar.security": "Сигурност",
+ "notification.admin.sign_up": "{name} signed up",
"notification.favourite": "{name} хареса твоята публикация",
"notification.follow": "{name} те последва",
"notification.follow_request": "{name} поиска да ви последва",
@@ -306,13 +318,15 @@
"notification.poll": "Анкета, в която сте гласували, приключи",
"notification.reblog": "{name} сподели твоята публикация",
"notification.status": "{name} току-що публикува",
+ "notification.update": "{name} edited a post",
"notifications.clear": "Изчистване на известия",
"notifications.clear_confirmation": "Сигурни ли сте, че искате да изчистите окончателно всичките си известия?",
+ "notifications.column_settings.admin.sign_up": "New sign-ups:",
"notifications.column_settings.alert": "Десктоп известия",
"notifications.column_settings.favourite": "Предпочитани:",
"notifications.column_settings.filter_bar.advanced": "Показване на всички категории",
"notifications.column_settings.filter_bar.category": "Лента за бърз филтър",
- "notifications.column_settings.filter_bar.show": "Показване",
+ "notifications.column_settings.filter_bar.show_bar": "Show filter bar",
"notifications.column_settings.follow": "Нови последователи:",
"notifications.column_settings.follow_request": "Нови заявки за последване:",
"notifications.column_settings.mention": "Споменавания:",
@@ -322,7 +336,9 @@
"notifications.column_settings.show": "Покажи в колона",
"notifications.column_settings.sound": "Пускане на звук",
"notifications.column_settings.status": "Нови публикации:",
- "notifications.column_settings.unread_markers.category": "отметки за непрочетени известия",
+ "notifications.column_settings.unread_notifications.category": "Unread notifications",
+ "notifications.column_settings.unread_notifications.highlight": "Highlight unread notifications",
+ "notifications.column_settings.update": "Edits:",
"notifications.filter.all": "Всичко",
"notifications.filter.boosts": "Споделяния",
"notifications.filter.favourites": "Любими",
@@ -362,18 +378,54 @@
"regeneration_indicator.label": "Зареждане…",
"regeneration_indicator.sublabel": "Вашата начална емисия се подготвя!",
"relative_time.days": "{number}д",
+ "relative_time.full.days": "{number, plural, one {# day} other {# days}} ago",
+ "relative_time.full.hours": "{number, plural, one {# hour} other {# hours}} ago",
+ "relative_time.full.just_now": "just now",
+ "relative_time.full.minutes": "{number, plural, one {# minute} other {# minutes}} ago",
+ "relative_time.full.seconds": "{number, plural, one {# second} other {# seconds}} ago",
"relative_time.hours": "{number}ч",
"relative_time.just_now": "сега",
"relative_time.minutes": "{number}м",
"relative_time.seconds": "{number}с",
"relative_time.today": "днес",
"reply_indicator.cancel": "Отказ",
+ "report.block": "Block",
+ "report.block_explanation": "You will not see their posts. They will not be able to see your posts or follow you. They will be able to tell that they are blocked.",
+ "report.categories.other": "Other",
+ "report.categories.spam": "Spam",
+ "report.categories.violation": "Content violates one or more server rules",
+ "report.category.subtitle": "Choose the best match",
+ "report.category.title": "Tell us what's going on with this {type}",
+ "report.category.title_account": "profile",
+ "report.category.title_status": "post",
+ "report.close": "Done",
+ "report.comment.title": "Is there anything else you think we should know?",
"report.forward": "Препращане към {target}",
"report.forward_hint": "Акаунтът е от друг сървър. Изпращане на анонимно копие на доклада и там?",
- "report.hint": "The report will be sent to your instance moderators. You can provide an explanation of why you are reporting this account below:",
+ "report.mute": "Mute",
+ "report.mute_explanation": "You will not see their posts. They can still follow you and see your posts and will not know that they are muted.",
+ "report.next": "Next",
"report.placeholder": "Допълнителни коментари",
+ "report.reasons.dislike": "I don't like it",
+ "report.reasons.dislike_description": "It is not something you want to see",
+ "report.reasons.other": "It's something else",
+ "report.reasons.other_description": "The issue does not fit into other categories",
+ "report.reasons.spam": "It's spam",
+ "report.reasons.spam_description": "Malicious links, fake engagement, or repetitive replies",
+ "report.reasons.violation": "It violates server rules",
+ "report.reasons.violation_description": "You are aware that it breaks specific rules",
+ "report.rules.subtitle": "Select all that apply",
+ "report.rules.title": "Which rules are being violated?",
+ "report.statuses.subtitle": "Select all that apply",
+ "report.statuses.title": "Are there any posts that back up this report?",
"report.submit": "Подаване",
"report.target": "Reporting",
+ "report.thanks.take_action": "Here are your options for controlling what you see on Mastodon:",
+ "report.thanks.take_action_actionable": "While we review this, you can take action against @{name}:",
+ "report.thanks.title": "Don't want to see this?",
+ "report.thanks.title_actionable": "Thanks for reporting, we'll look into this.",
+ "report.unfollow": "Unfollow @{name}",
+ "report.unfollow_explanation": "You are following this account. To not see their posts in your home feed anymore, unfollow them.",
"search.placeholder": "Търсене",
"search_popout.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.",
@@ -382,7 +434,9 @@
"search_popout.tips.text": "Обикновеният текст връща съответстващи показвани имена, потребителски имена и хаштагове",
"search_popout.tips.user": "потребител",
"search_results.accounts": "Хора",
+ "search_results.all": "All",
"search_results.hashtags": "Хаштагове",
+ "search_results.nothing_found": "Could not find anything for these search terms",
"search_results.statuses": "Публикации",
"search_results.statuses_fts_disabled": "Търсенето на публикации по тяхното съдържание не е активирано за този Mastodon сървър.",
"search_results.total": "{count, number} {count, plural, one {резултат} other {резултата}}",
@@ -396,9 +450,14 @@
"status.delete": "Изтриване",
"status.detailed_status": "Подробен изглед на разговор",
"status.direct": "Директно съобщение към @{name}",
+ "status.edit": "Edit",
+ "status.edited": "Edited {date}",
+ "status.edited_x_times": "Edited {count, plural, one {{count} time} other {{count} times}}",
"status.embed": "Вграждане",
"status.favourite": "Предпочитани",
"status.filtered": "Филтрирано",
+ "status.history.created": "{name} created {date}",
+ "status.history.edited": "{name} edited {date}",
"status.load_more": "Зареждане на още",
"status.media_hidden": "Мултимедията е скрита",
"status.mention": "Споменаване",
diff --git a/app/javascript/mastodon/locales/bn.json b/app/javascript/mastodon/locales/bn.json
index f28e8b110..3542c4e46 100644
--- a/app/javascript/mastodon/locales/bn.json
+++ b/app/javascript/mastodon/locales/bn.json
@@ -18,12 +18,12 @@
"account.followers": "অনুসরণকারী",
"account.followers.empty": "এই ব্যক্তিকে এখনো কেউ অনুসরণ করে না।",
"account.followers_counter": "{count, plural,one {{counter} জন অনুসরণকারী } other {{counter} জন অনুসরণকারী}}",
+ "account.following": "Following",
"account.following_counter": "{count, plural,one {{counter} জনকে অনুসরণ} other {{counter} জনকে অনুসরণ}}",
"account.follows.empty": "এই সদস্য কাওকে এখনো অনুসরণ করেন না.",
"account.follows_you": "তোমাকে অনুসরণ করে",
"account.hide_reblogs": "@{name}'র সমর্থনগুলি লুকিয়ে ফেলুন",
"account.joined": "Joined {date}",
- "account.last_status": "শেষ সক্রিয় ছিল",
"account.link_verified_on": "এই লিংকের মালিকানা চেক করা হয়েছে {date} তারিখে",
"account.locked_info": "এই নিবন্ধনের গোপনীয়তার ক্ষেত্র তালা দেওয়া আছে। নিবন্ধনকারী অনুসরণ করার অনুমতি যাদেরকে দেবেন, শুধু তারাই অনুসরণ করতে পারবেন।",
"account.media": "মিডিয়া",
@@ -32,7 +32,6 @@
"account.mute": "@{name} কে নিঃশব্দ করুন",
"account.mute_notifications": "@{name} র প্রজ্ঞাপন আপনার কাছে নিঃশব্দ করুন",
"account.muted": "নিঃশব্দ",
- "account.never_active": "কখনও নয়",
"account.posts": "টুট",
"account.posts_with_replies": "টুট এবং মতামত",
"account.report": "@{name} কে রিপোর্ট করুন",
@@ -42,12 +41,15 @@
"account.statuses_counter": "{count, plural,one {{counter} টুট} other {{counter} টুট}}",
"account.unblock": "@{name} র কার্যকলাপ দেখুন",
"account.unblock_domain": "{domain} কে আবার দেখুন",
+ "account.unblock_short": "Unblock",
"account.unendorse": "আপনার নিজের পাতায় এটা দেখবেন না",
"account.unfollow": "অনুসরণ করো না",
"account.unmute": "@{name} র কার্যকলাপ আবার দেখুন",
"account.unmute_notifications": "@{name} র প্রজ্ঞাপন দেখুন",
+ "account.unmute_short": "Unmute",
"account_note.placeholder": "নোট যোগ করতে ক্লিক করুন",
- "admin.dashboard.retention": "Retention",
+ "admin.dashboard.daily_retention": "User retention rate by day after sign-up",
+ "admin.dashboard.monthly_retention": "User retention rate by month after sign-up",
"admin.dashboard.retention.average": "Average",
"admin.dashboard.retention.cohort": "Sign-up month",
"admin.dashboard.retention.cohort_size": "New users",
@@ -104,6 +106,7 @@
"compose_form.poll.switch_to_single": "একটি একক পছন্দের অনুমতি দেওয়ার জন্য পোল পরিবর্তন করুন",
"compose_form.publish": "টুট",
"compose_form.publish_loud": "{publish}!",
+ "compose_form.save_changes": "Save changes",
"compose_form.sensitive.hide": "এই ছবি বা ভিডিওটি সংবেদনশীল হিসেবে চিহ্নিত করতে",
"compose_form.sensitive.marked": "এই ছবি বা ভিডিওটি সংবেদনশীল হিসেবে চিহ্নিত করা হয়েছে",
"compose_form.sensitive.unmarked": "এই ছবি বা ভিডিওটি সংবেদনশীল হিসেবে চিহ্নিত করা হয়নি",
@@ -165,6 +168,7 @@
"empty_column.community": "স্থানীয় সময়রেখাতে কিছু নেই। প্রকাশ্যভাবে কিছু লিখে লেখালেখির উদ্বোধন করে ফেলুন!",
"empty_column.direct": "আপনার কাছে সরাসরি পাঠানো কোনো লেখা নেই। যদি কেও পাঠায়, সেটা এখানে দেখা যাবে।",
"empty_column.domain_blocks": "এখনও কোনও লুকানো ডোমেন নেই।",
+ "empty_column.explore_statuses": "Nothing is trending right now. Check back later!",
"empty_column.favourited_statuses": "আপনার পছন্দের কোনো টুট এখনো নেই। আপনি কোনো লেখা পছন্দের হিসেবে চিহ্নিত করলে এখানে পাওয়া যাবে।",
"empty_column.favourites": "কেও এখনো এটাকে পছন্দের টুট হিসেবে চিহ্নিত করেনি। যদি করে, তখন তাদের এখানে পাওয়া যাবে।",
"empty_column.follow_recommendations": "Looks like no suggestions could be generated for you. You can try using search to look for people you might know or explore trending hashtags.",
@@ -183,6 +187,12 @@
"error.unexpected_crash.next_steps_addons": "Try disabling them and refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
"errors.unexpected_crash.copy_stacktrace": "স্টেকট্রেস ক্লিপবোর্ডে কপি করুন",
"errors.unexpected_crash.report_issue": "সমস্যার প্রতিবেদন করুন",
+ "explore.search_results": "Search results",
+ "explore.suggested_follows": "For you",
+ "explore.title": "Explore",
+ "explore.trending_links": "News",
+ "explore.trending_statuses": "Posts",
+ "explore.trending_tags": "Hashtags",
"follow_recommendations.done": "সম্পন্ন",
"follow_recommendations.heading": "Follow people you'd like to see posts from! Here are some suggestions.",
"follow_recommendations.lead": "Posts from people you follow will show up in chronological order on your home feed. Don't be afraid to make mistakes, you can unfollow people just as easily any time!",
@@ -284,6 +294,7 @@
"navigation_bar.discover": "ঘুরে দেখুন",
"navigation_bar.domain_blocks": "লুকানো ডোমেনগুলি",
"navigation_bar.edit_profile": "নিজের পাতা সম্পাদনা করতে",
+ "navigation_bar.explore": "Explore",
"navigation_bar.favourites": "পছন্দের",
"navigation_bar.filters": "বন্ধ করা শব্দ",
"navigation_bar.follow_requests": "অনুসরণের অনুরোধগুলি",
@@ -298,6 +309,7 @@
"navigation_bar.preferences": "পছন্দসমূহ",
"navigation_bar.public_timeline": "যুক্তবিশ্বের সময়রেখা",
"navigation_bar.security": "নিরাপত্তা",
+ "notification.admin.sign_up": "{name} signed up",
"notification.favourite": "{name} আপনার কার্যক্রম পছন্দ করেছেন",
"notification.follow": "{name} আপনাকে অনুসরণ করেছেন",
"notification.follow_request": "{name} আপনাকে অনুসরণ করার জন্য অনুরধ করেছে",
@@ -306,13 +318,15 @@
"notification.poll": "আপনি ভোট দিয়েছিলেন এমন এক নির্বাচনের ভোটের সময় শেষ হয়েছে",
"notification.reblog": "{name} আপনার কার্যক্রমে সমর্থন দেখিয়েছেন",
"notification.status": "{name} just posted",
+ "notification.update": "{name} edited a post",
"notifications.clear": "প্রজ্ঞাপনগুলো মুছে ফেলতে",
"notifications.clear_confirmation": "আপনি কি নির্চিত প্রজ্ঞাপনগুলো মুছে ফেলতে চান ?",
+ "notifications.column_settings.admin.sign_up": "New sign-ups:",
"notifications.column_settings.alert": "কম্পিউটারে প্রজ্ঞাপনগুলি",
"notifications.column_settings.favourite": "পছন্দের:",
"notifications.column_settings.filter_bar.advanced": "সব শ্রেণীগুলো দেখানো",
"notifications.column_settings.filter_bar.category": "সংক্ষিপ্ত ছাঁকনি অংশ",
- "notifications.column_settings.filter_bar.show": "দেখানো",
+ "notifications.column_settings.filter_bar.show_bar": "Show filter bar",
"notifications.column_settings.follow": "নতুন অনুসরণকারীরা:",
"notifications.column_settings.follow_request": "অনুসরণের অনুরোধগুলি:",
"notifications.column_settings.mention": "প্রজ্ঞাপনগুলো:",
@@ -322,7 +336,9 @@
"notifications.column_settings.show": "কলামে দেখানো",
"notifications.column_settings.sound": "শব্দ বাজানো",
"notifications.column_settings.status": "New toots:",
- "notifications.column_settings.unread_markers.category": "Unread notification markers",
+ "notifications.column_settings.unread_notifications.category": "Unread notifications",
+ "notifications.column_settings.unread_notifications.highlight": "Highlight unread notifications",
+ "notifications.column_settings.update": "Edits:",
"notifications.filter.all": "সব",
"notifications.filter.boosts": "সমর্থনগুলো",
"notifications.filter.favourites": "পছন্দের গুলো",
@@ -362,18 +378,54 @@
"regeneration_indicator.label": "আসছে…",
"regeneration_indicator.sublabel": "আপনার বাড়ির-সময়রেখা প্রস্তূত করা হচ্ছে!",
"relative_time.days": "{number} দিন",
+ "relative_time.full.days": "{number, plural, one {# day} other {# days}} ago",
+ "relative_time.full.hours": "{number, plural, one {# hour} other {# hours}} ago",
+ "relative_time.full.just_now": "just now",
+ "relative_time.full.minutes": "{number, plural, one {# minute} other {# minutes}} ago",
+ "relative_time.full.seconds": "{number, plural, one {# second} other {# seconds}} ago",
"relative_time.hours": "{number} ঘন্টা",
"relative_time.just_now": "এখন",
"relative_time.minutes": "{number}মিঃ",
"relative_time.seconds": "{number} সেকেন্ড",
"relative_time.today": "আজ",
"reply_indicator.cancel": "বাতিল করতে",
+ "report.block": "Block",
+ "report.block_explanation": "You will not see their posts. They will not be able to see your posts or follow you. They will be able to tell that they are blocked.",
+ "report.categories.other": "Other",
+ "report.categories.spam": "Spam",
+ "report.categories.violation": "Content violates one or more server rules",
+ "report.category.subtitle": "Choose the best match",
+ "report.category.title": "Tell us what's going on with this {type}",
+ "report.category.title_account": "profile",
+ "report.category.title_status": "post",
+ "report.close": "Done",
+ "report.comment.title": "Is there anything else you think we should know?",
"report.forward": "এটা আরো পাঠান {target} তে",
"report.forward_hint": "এই নিবন্ধনটি অন্য একটি সার্ভারে। অপ্রকাশিতনামাভাবে রিপোর্টের কপি সেখানেও কি পাঠাতে চান ?",
- "report.hint": "রিপোর্টটি আপনার সার্ভারের পরিচালকের কাছে পাঠানো হবে। রিপোর্ট পাঠানোর কারণ নিচে বিস্তারিত লিখতে পারেন:",
+ "report.mute": "Mute",
+ "report.mute_explanation": "You will not see their posts. They can still follow you and see your posts and will not know that they are muted.",
+ "report.next": "Next",
"report.placeholder": "অন্য কোনো মন্তব্য",
+ "report.reasons.dislike": "I don't like it",
+ "report.reasons.dislike_description": "It is not something you want to see",
+ "report.reasons.other": "It's something else",
+ "report.reasons.other_description": "The issue does not fit into other categories",
+ "report.reasons.spam": "It's spam",
+ "report.reasons.spam_description": "Malicious links, fake engagement, or repetitive replies",
+ "report.reasons.violation": "It violates server rules",
+ "report.reasons.violation_description": "You are aware that it breaks specific rules",
+ "report.rules.subtitle": "Select all that apply",
+ "report.rules.title": "Which rules are being violated?",
+ "report.statuses.subtitle": "Select all that apply",
+ "report.statuses.title": "Are there any posts that back up this report?",
"report.submit": "জমা দিন",
"report.target": "{target} রিপোর্ট করুন",
+ "report.thanks.take_action": "Here are your options for controlling what you see on Mastodon:",
+ "report.thanks.take_action_actionable": "While we review this, you can take action against @{name}:",
+ "report.thanks.title": "Don't want to see this?",
+ "report.thanks.title_actionable": "Thanks for reporting, we'll look into this.",
+ "report.unfollow": "Unfollow @{name}",
+ "report.unfollow_explanation": "You are following this account. To not see their posts in your home feed anymore, unfollow them.",
"search.placeholder": "অনুসন্ধান",
"search_popout.search_format": "বিস্তারিতভাবে খোঁজার পদ্ধতি",
"search_popout.tips.full_text": "সাধারণ লেখা দিয়ে খুঁজলে বের হবে সেরকম আপনার লেখা, পছন্দের লেখা, সমর্থন করা লেখা, আপনাকে উল্লেখকরা কোনো লেখা, যা খুঁজছেন সেরকম কোনো ব্যবহারকারীর নাম বা কোনো হ্যাশট্যাগগুলো।",
@@ -382,7 +434,9 @@
"search_popout.tips.text": "সাধারণ লেখা দিয়ে খুঁজলে বের হবে সেরকম ব্যবহারকারীর নাম বা কোনো হ্যাশট্যাগগুলো",
"search_popout.tips.user": "ব্যবহারকারী",
"search_results.accounts": "মানুষ",
+ "search_results.all": "All",
"search_results.hashtags": "হ্যাশট্যাগগুলি",
+ "search_results.nothing_found": "Could not find anything for these search terms",
"search_results.statuses": "টুট",
"search_results.statuses_fts_disabled": "তাদের সামগ্রী দ্বারা টুটগুলি অনুসন্ধান এই মস্তোডন সার্ভারে সক্ষম নয়।",
"search_results.total": "{count, number} {count, plural, one {ফলাফল} other {ফলাফল}}",
@@ -396,9 +450,14 @@
"status.delete": "মুছে ফেলতে",
"status.detailed_status": "বিস্তারিত কথোপকথনের হিসেবে দেখতে",
"status.direct": "@{name} কে সরাসরি লেখা পাঠাতে",
+ "status.edit": "Edit",
+ "status.edited": "Edited {date}",
+ "status.edited_x_times": "Edited {count, plural, one {{count} time} other {{count} times}}",
"status.embed": "এমবেড করতে",
"status.favourite": "পছন্দের করতে",
"status.filtered": "ছাঁকনিদিত",
+ "status.history.created": "{name} created {date}",
+ "status.history.edited": "{name} edited {date}",
"status.load_more": "আরো দেখুন",
"status.media_hidden": "মিডিয়া লুকানো আছে",
"status.mention": "@{name}কে উল্লেখ করতে",
diff --git a/app/javascript/mastodon/locales/br.json b/app/javascript/mastodon/locales/br.json
index 06fc32095..51b78f777 100644
--- a/app/javascript/mastodon/locales/br.json
+++ b/app/javascript/mastodon/locales/br.json
@@ -6,9 +6,9 @@
"account.block": "Berzañ @{name}",
"account.block_domain": "Berzañ pep tra eus {domain}",
"account.blocked": "Stanket",
- "account.browse_more_on_origin_server": "Browse more on the original profile",
+ "account.browse_more_on_origin_server": "Furchal muioc'h war ar profil kentañ",
"account.cancel_follow_request": "Nullañ ar bedadenn heuliañ",
- "account.direct": "Kas ur gemennadenn da @{name}",
+ "account.direct": "Kas ur gemennadenn prevez da @{name}",
"account.disable_notifications": "Paouez d'am c'hemenn pa vez toudet gant @{name}",
"account.domain_blocked": "Domani berzet",
"account.edit_profile": "Aozañ ar profil",
@@ -18,45 +18,47 @@
"account.followers": "Heulier·ezed·ien",
"account.followers.empty": "Den na heul an implijer-mañ c'hoazh.",
"account.followers_counter": "{count, plural, other{{counter} Heulier}}",
+ "account.following": "Following",
"account.following_counter": "{count, plural, other {{counter} Heuliañ}}",
"account.follows.empty": "An implijer·ez-mañ na heul den ebet.",
"account.follows_you": "Ho heul",
"account.hide_reblogs": "Kuzh toudoù rannet gant @{name}",
"account.joined": "Amañ abaoe {date}",
- "account.last_status": "Oberiantiz zivezhañ",
"account.link_verified_on": "Gwiriet eo bet perc'hennidigezh al liamm d'an deiziad-mañ : {date}",
- "account.locked_info": "Prennet eo ar gon-mañ. Dibab a ra ar perc'henn ar re a c'hall heuliañ anezhi pe anezhañ.",
+ "account.locked_info": "Prennet eo ar gont-mañ. Dibab a ra ar perc'henn ar re a c'hall heuliañ anezhi pe anezhañ.",
"account.media": "Media",
"account.mention": "Menegiñ @{name}",
"account.moved_to": "Dilojet en·he deus {name} da :",
"account.mute": "Kuzhat @{name}",
"account.mute_notifications": "Kuzh kemennoù eus @{name}",
"account.muted": "Kuzhet",
- "account.never_active": "Birviken",
"account.posts": "a doudoù",
"account.posts_with_replies": "Toudoù ha respontoù",
"account.report": "Disklêriañ @{name}",
"account.requested": "O c'hortoz an asant. Klikit evit nullañ ar goulenn heuliañ",
"account.share": "Skignañ profil @{name}",
"account.show_reblogs": "Diskouez skignadennoù @{name}",
- "account.statuses_counter": "{count, plural, one {{counter} Toot} other {{counter} Toots}}",
+ "account.statuses_counter": "{count, plural, one {{counter} Toud} other {{counter} Toud}}",
"account.unblock": "Diverzañ @{name}",
"account.unblock_domain": "Diverzañ an domani {domain}",
+ "account.unblock_short": "Unblock",
"account.unendorse": "Paouez da lakaat war-wel war ar profil",
"account.unfollow": "Diheuliañ",
"account.unmute": "Diguzhat @{name}",
"account.unmute_notifications": "Diguzhat kemennoù a @{name}",
+ "account.unmute_short": "Unmute",
"account_note.placeholder": "Klikit evit ouzhpenniñ un notenn",
- "admin.dashboard.retention": "Retention",
- "admin.dashboard.retention.average": "Average",
- "admin.dashboard.retention.cohort": "Sign-up month",
- "admin.dashboard.retention.cohort_size": "New users",
+ "admin.dashboard.daily_retention": "User retention rate by day after sign-up",
+ "admin.dashboard.monthly_retention": "User retention rate by month after sign-up",
+ "admin.dashboard.retention.average": "Keidenn",
+ "admin.dashboard.retention.cohort": "Miz an enrolladur",
+ "admin.dashboard.retention.cohort_size": "Implijerien.erezed nevez",
"alert.rate_limited.message": "Klaskit en-dro a-benn {retry_time, time, medium}.",
"alert.rate_limited.title": "Feur bevennet",
"alert.unexpected.message": "Ur fazi dic'hortozet zo degouezhet.",
"alert.unexpected.title": "Hopala!",
"announcement.announcement": "Kemenn",
- "attachments_list.unprocessed": "(unprocessed)",
+ "attachments_list.unprocessed": "(ket meret)",
"autosuggest_hashtag.per_week": "{count} bep sizhun",
"boost_modal.combo": "Ar wezh kentañ e c'halliot gwaskañ war {combo} evit tremen hebiou",
"bundle_column_error.body": "Degouezhet ez eus bet ur fazi en ur gargañ an elfenn-mañ.",
@@ -104,6 +106,7 @@
"compose_form.poll.switch_to_single": "Kemmañ ar sontadeg evit aotren un dibab hepken",
"compose_form.publish": "Toudañ",
"compose_form.publish_loud": "{publish} !",
+ "compose_form.save_changes": "Save changes",
"compose_form.sensitive.hide": "Merkañ ar media evel kizidik",
"compose_form.sensitive.marked": "Merket eo ar media evel kizidik",
"compose_form.sensitive.unmarked": "N'eo ket merket ar media evel kizidik",
@@ -118,8 +121,8 @@
"confirmations.delete.message": "Ha sur oc'h e fell deoc'h dilemel an toud-mañ ?",
"confirmations.delete_list.confirm": "Dilemel",
"confirmations.delete_list.message": "Ha sur eo hoc'h eus c'hoant da zilemel ar roll-mañ da vat ?",
- "confirmations.discard_edit_media.confirm": "Discard",
- "confirmations.discard_edit_media.message": "You have unsaved changes to the media description or preview, discard them anyway?",
+ "confirmations.discard_edit_media.confirm": "Nac'hañ",
+ "confirmations.discard_edit_media.message": "Bez ez eus kemmoù n'int ket enrollet e deskrivadur ar media pe ar rakwel, nullañ anezho evelato?",
"confirmations.domain_block.confirm": "Berzañ an domani a-bezh",
"confirmations.domain_block.message": "Ha sur oc'h e fell deoc'h berzañ an {domain} a-bezh? Peurvuiañ eo trawalc'h berzañ pe mudañ un nebeud implijer·ezed·ien. Ne welot danvez ebet o tont eus an domani-mañ. Dilamet e vo ar c'houmanantoù war an domani-mañ.",
"confirmations.logout.confirm": "Digevreañ",
@@ -157,7 +160,7 @@
"emoji_button.search_results": "Disoc'hoù an enklask",
"emoji_button.symbols": "Arouezioù",
"emoji_button.travel": "Lec'hioù ha Beajoù",
- "empty_column.account_suspended": "Account suspended",
+ "empty_column.account_suspended": "Kont ehanet",
"empty_column.account_timeline": "Toud ebet amañ!",
"empty_column.account_unavailable": "Profil dihegerz",
"empty_column.blocks": "N'eus ket bet berzet implijer·ez ganeoc'h c'hoazh.",
@@ -165,30 +168,37 @@
"empty_column.community": "Goulo eo ar red-amzer lec'hel. Skrivit'ta un dra evit lakaat tan dezhi !",
"empty_column.direct": "N'ho peus kemennad prevez ebet c'hoazh. Pa vo resevet pe kaset unan ganeoc'h e teuio war wel amañ.",
"empty_column.domain_blocks": "N'eus domani kuzh ebet c'hoazh.",
+ "empty_column.explore_statuses": "Nothing is trending right now. Check back later!",
"empty_column.favourited_statuses": "N'ho peus toud muiañ-karet ebet c'hoazh. Pa vo lakaet unan ganeoc'h e vo diskouezet amañ.",
"empty_column.favourites": "Den ebet n'eus lakaet an toud-mañ en e reoù muiañ-karet. Pa vo graet gant unan bennak e vo diskouezet amañ.",
- "empty_column.follow_recommendations": "Looks like no suggestions could be generated for you. You can try using search to look for people you might know or explore trending hashtags.",
+ "empty_column.follow_recommendations": "Seblant a ra ne vez ket genelet damvenegoù evidoc'h. Gallout a rit implijout un enklask evit klask tud hag a vefe anavezet ganeoc'h pe ergerzhout gerioù-klik diouzh ar c'hiz.",
"empty_column.follow_requests": "N'ho peus goulenn heuliañ ebet c'hoazh. Pa resevot reoù e vo diskouezet amañ.",
"empty_column.hashtag": "N'eus netra er ger-klik-mañ c'hoazh.",
"empty_column.home": "Goullo eo ho red-amzer degemer! Kit da weladenniñ {public} pe implijit ar c'hlask evit kregiñ ganti ha kejañ gant implijer·ien·ezed all.",
- "empty_column.home.suggestions": "See some suggestions",
+ "empty_column.home.suggestions": "Gwellout damvenegoù",
"empty_column.list": "Goullo eo ar roll-mañ evit ar poent. Pa vo toudet gant e izili e vo diskouezet amañ.",
"empty_column.lists": "N'ho peus roll ebet c'hoazh. Pa vo krouet unan ganeoc'h e vo diskouezet amañ.",
"empty_column.mutes": "N'ho peus kuzhet implijer ebet c'hoazh.",
"empty_column.notifications": "N'ho peus kemenn ebet c'hoazh. Grit gant implijer·ezed·ien all evit loc'hañ ar gomz.",
"empty_column.public": "N'eus netra amañ! Skrivit un dra bennak foran pe heuilhit implijer·ien·ezed eus dafariadoù all evit leuniañ",
"error.unexpected_crash.explanation": "Abalamour d'ur beug en hor c'hod pe d'ur gudenn geverlec'hded n'hallomp ket skrammañ ar bajenn-mañ en un doare dereat.",
- "error.unexpected_crash.explanation_addons": "This page could not be displayed correctly. This error is likely caused by a browser add-on or automatic translation tools.",
+ "error.unexpected_crash.explanation_addons": "Ar bajenn-mañ ne c'hell ket bezañ skrammet mat. Ar fazi-se a zo kaoz d'un astenn pe d'un ostilh troidigezh emgefreek war ho merdeer.",
"error.unexpected_crash.next_steps": "Klaskit azbevaat ar bajenn. Ma n'a ket en-dro e c'hallit klask ober gant Mastodon dre ur merdeer disheñvel pe dre an arload genidik.",
- "error.unexpected_crash.next_steps_addons": "Try disabling them and refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
+ "error.unexpected_crash.next_steps_addons": "Klaskit azbevaat ar bajenn. Ma n'ez a ket en-dro e c'hallit klask ober gant Mastodon dre ur merdeer disheñvel pe dre an arload genidik.",
"errors.unexpected_crash.copy_stacktrace": "Eilañ ar roudoù diveugañ er golver",
"errors.unexpected_crash.report_issue": "Danevellañ ur fazi",
+ "explore.search_results": "Search results",
+ "explore.suggested_follows": "For you",
+ "explore.title": "Explore",
+ "explore.trending_links": "News",
+ "explore.trending_statuses": "Posts",
+ "explore.trending_tags": "Hashtags",
"follow_recommendations.done": "Graet",
- "follow_recommendations.heading": "Follow people you'd like to see posts from! Here are some suggestions.",
- "follow_recommendations.lead": "Posts from people you follow will show up in chronological order on your home feed. Don't be afraid to make mistakes, you can unfollow people just as easily any time!",
+ "follow_recommendations.heading": "Heuliit tud e plijfe deoc'h lenn toudoù! Setu un tamm alioù.",
+ "follow_recommendations.lead": "Toudoù eus tud heuliet ganeoc'h a zeuio war wel en un urzh amzeroniezhel war ho red degemer. N'ho peus ket aon ober fazioù, gallout a rit paouez heuliañ tud ken aes n'eus forzh pegoulz!",
"follow_request.authorize": "Aotren",
"follow_request.reject": "Nac'hañ",
- "follow_requests.unlocked_explanation": "Even though your account is not locked, the {domain} staff thought you might want to review follow requests from these accounts manually.",
+ "follow_requests.unlocked_explanation": "Daoust ma n'eo ket ho kont prennet, skipailh {domain} a soñj e fellfe deoc'h gwiriekaat pedadennoù heuliañ deus ar c'hontoù-se diwar-zorn.",
"generic.saved": "Enrollet",
"getting_started.developers": "Diorroerien",
"getting_started.directory": "Roll ar profiloù",
@@ -215,43 +225,43 @@
"intervals.full.days": "{number, plural, one {# devezh} other{# a zevezhioù}}",
"intervals.full.hours": "{number, plural, one {# eurvezh} other{# eurvezh}}",
"intervals.full.minutes": "{number, plural, one {# munut} other{# a vunutoù}}",
- "keyboard_shortcuts.back": "to navigate back",
- "keyboard_shortcuts.blocked": "to open blocked users list",
+ "keyboard_shortcuts.back": "Distreiñ",
+ "keyboard_shortcuts.blocked": "Digeriñ roll an implijer.ezed.rien stanket",
"keyboard_shortcuts.boost": "da skignañ",
- "keyboard_shortcuts.column": "to focus a status in one of the columns",
- "keyboard_shortcuts.compose": "to focus the compose textarea",
+ "keyboard_shortcuts.column": "Fokus ar bann",
+ "keyboard_shortcuts.compose": "Fokus an takad testenn",
"keyboard_shortcuts.description": "Deskrivadur",
- "keyboard_shortcuts.direct": "to open direct messages column",
- "keyboard_shortcuts.down": "to move down in the list",
+ "keyboard_shortcuts.direct": "Digeriñ bann ar c'hemennadennoù prevez",
+ "keyboard_shortcuts.down": "Diskennañ er roll",
"keyboard_shortcuts.enter": "evit digeriñ un toud",
- "keyboard_shortcuts.favourite": "to favourite",
- "keyboard_shortcuts.favourites": "to open favourites list",
- "keyboard_shortcuts.federated": "to open federated timeline",
- "keyboard_shortcuts.heading": "Keyboard Shortcuts",
- "keyboard_shortcuts.home": "to open home timeline",
+ "keyboard_shortcuts.favourite": "Lakaat an toud evel muiañ-karet",
+ "keyboard_shortcuts.favourites": "Digeriñ roll an toudoù muiañ-karet",
+ "keyboard_shortcuts.federated": "Digeriñ ar red-amzer kevreet",
+ "keyboard_shortcuts.heading": "Berradennoù klavier",
+ "keyboard_shortcuts.home": "Digeriñ ho red-amzer degemer",
"keyboard_shortcuts.hotkey": "Berradur",
- "keyboard_shortcuts.legend": "to display this legend",
- "keyboard_shortcuts.local": "to open local timeline",
- "keyboard_shortcuts.mention": "to mention author",
- "keyboard_shortcuts.muted": "to open muted users list",
- "keyboard_shortcuts.my_profile": "to open your profile",
- "keyboard_shortcuts.notifications": "to open notifications column",
- "keyboard_shortcuts.open_media": "to open media",
- "keyboard_shortcuts.pinned": "to open pinned toots list",
- "keyboard_shortcuts.profile": "to open author's profile",
+ "keyboard_shortcuts.legend": "Skrammañ ar skrid-se",
+ "keyboard_shortcuts.local": "Digeriñ red-amzer lec'hel",
+ "keyboard_shortcuts.mention": "Menegiñ an aozer.ez",
+ "keyboard_shortcuts.muted": "Digeriñ roll an implijer.ezed.ien kuzhet",
+ "keyboard_shortcuts.my_profile": "Digeriñ ho profil",
+ "keyboard_shortcuts.notifications": "Digeriñ bann kemennoù",
+ "keyboard_shortcuts.open_media": "Digeriñ ar media",
+ "keyboard_shortcuts.pinned": "Digeriñ roll an toudoù spilhennet",
+ "keyboard_shortcuts.profile": "Digeriñ profil an aozer.ez",
"keyboard_shortcuts.reply": "da respont",
- "keyboard_shortcuts.requests": "to open follow requests list",
- "keyboard_shortcuts.search": "to focus search",
- "keyboard_shortcuts.spoilers": "to show/hide CW field",
- "keyboard_shortcuts.start": "to open \"get started\" column",
- "keyboard_shortcuts.toggle_hidden": "to show/hide text behind CW",
+ "keyboard_shortcuts.requests": "Digeriñ roll goulennoù heuliañ",
+ "keyboard_shortcuts.search": "Fokus barenn klask",
+ "keyboard_shortcuts.spoilers": "da guzhat/ziguzhat tachenn CW",
+ "keyboard_shortcuts.start": "Digeriñ bann \"Kregiñ\"",
+ "keyboard_shortcuts.toggle_hidden": "da guzhat/ziguzhat an desten a-dreñv CW",
"keyboard_shortcuts.toggle_sensitivity": "da guzhat/ziguzhat ur media",
"keyboard_shortcuts.toot": "da gregiñ gant un toud nevez-flamm",
- "keyboard_shortcuts.unfocus": "to un-focus compose textarea/search",
- "keyboard_shortcuts.up": "to move up in the list",
+ "keyboard_shortcuts.unfocus": "Difokus an dachenn testenn/klask",
+ "keyboard_shortcuts.up": "Pignat er roll",
"lightbox.close": "Serriñ",
- "lightbox.compress": "Compress image view box",
- "lightbox.expand": "Expand image view box",
+ "lightbox.compress": "Bihanaat boest hewel ar skeudenn",
+ "lightbox.expand": "Ledanaat boest hewel ar skeudenn",
"lightbox.next": "Da-heul",
"lightbox.previous": "A-raok",
"lists.account.add": "Ouzhpennañ d'al listenn",
@@ -261,20 +271,20 @@
"lists.edit.submit": "Cheñch an titl",
"lists.new.create": "Ouzhpennañ ul listenn",
"lists.new.title_placeholder": "Titl nevez al listenn",
- "lists.replies_policy.followed": "Any followed user",
+ "lists.replies_policy.followed": "Pep implijer.ez heuliet",
"lists.replies_policy.list": "Izili ar roll",
"lists.replies_policy.none": "Den ebet",
"lists.replies_policy.title": "Diskouez ar respontoù:",
"lists.search": "Klask e-touez tud heuliet ganeoc'h",
"lists.subheading": "Ho listennoù",
- "load_pending": "{count, plural, one {# new item} other {# new items}}",
+ "load_pending": "{count, plural, one {# dra nevez} other {# dra nevez}}",
"loading_indicator.label": "O kargañ...",
- "media_gallery.toggle_visible": "Toggle visibility",
+ "media_gallery.toggle_visible": "{number, plural, one {Kuzhat ar skeudenn} other {Kuzhat ar skeudenn}}",
"missing_indicator.label": "Digavet",
- "missing_indicator.sublabel": "This resource could not be found",
+ "missing_indicator.sublabel": "An danvez-se ne vez ket kavet",
"mute_modal.duration": "Padelezh",
"mute_modal.hide_notifications": "Kuzhat kemenadennoù eus an implijer-se ?",
- "mute_modal.indefinite": "Indefinite",
+ "mute_modal.indefinite": "Amstrizh",
"navigation_bar.apps": "Arloadoù pellgomz",
"navigation_bar.blocks": "Implijer·ezed·ien berzet",
"navigation_bar.bookmarks": "Sinedoù",
@@ -284,10 +294,11 @@
"navigation_bar.discover": "Dizoleiñ",
"navigation_bar.domain_blocks": "Domanioù kuzhet",
"navigation_bar.edit_profile": "Aozañ ar profil",
+ "navigation_bar.explore": "Explore",
"navigation_bar.favourites": "Ar re vuiañ-karet",
"navigation_bar.filters": "Gerioù kuzhet",
"navigation_bar.follow_requests": "Pedadoù heuliañ",
- "navigation_bar.follows_and_followers": "Follows and followers",
+ "navigation_bar.follows_and_followers": "Heuliadennoù ha heulier·ezed·ien",
"navigation_bar.info": "Diwar-benn an dafariad-mañ",
"navigation_bar.keyboard_shortcuts": "Berradurioù",
"navigation_bar.lists": "Listennoù",
@@ -298,55 +309,60 @@
"navigation_bar.preferences": "Gwellvezioù",
"navigation_bar.public_timeline": "Red-amzer kevreet",
"navigation_bar.security": "Diogelroez",
- "notification.favourite": "{name} favourited your status",
+ "notification.admin.sign_up": "{name} signed up",
+ "notification.favourite": "{name} en/he deus lakaet ho toud en e/he muiañ-karet",
"notification.follow": "heuliañ a ra {name} ac'hanoc'h",
- "notification.follow_request": "{name} has requested to follow you",
+ "notification.follow_request": "{name} en/he deus goulennet da heuliañ ac'hanoc'h",
"notification.mention": "{name} en/he deus meneget ac'hanoc'h",
"notification.own_poll": "Echu eo ho sontadeg",
"notification.poll": "Ur sontadeg ho deus mouezhet warnañ a zo echuet",
- "notification.reblog": "{name} boosted your status",
- "notification.status": "{name} just posted",
+ "notification.reblog": "{name} skignet ho toud",
+ "notification.status": "{name} en/he deus toudet",
+ "notification.update": "{name} edited a post",
"notifications.clear": "Skarzhañ ar c'hemennoù",
- "notifications.clear_confirmation": "Are you sure you want to permanently clear all your notifications?",
+ "notifications.clear_confirmation": "Ha sur oc'h e fell deoc'h skarzhañ ho kemennoù penn-da-benn?",
+ "notifications.column_settings.admin.sign_up": "New sign-ups:",
"notifications.column_settings.alert": "Kemennoù war ar burev",
"notifications.column_settings.favourite": "Ar re vuiañ-karet:",
"notifications.column_settings.filter_bar.advanced": "Skrammañ an-holl rummadoù",
"notifications.column_settings.filter_bar.category": "Barrenn siloù prim",
- "notifications.column_settings.filter_bar.show": "Diskouez",
+ "notifications.column_settings.filter_bar.show_bar": "Diskouezh barrenn siloù",
"notifications.column_settings.follow": "Heulierien nevez:",
- "notifications.column_settings.follow_request": "New follow requests:",
+ "notifications.column_settings.follow_request": "Pedadoù heuliañ nevez :",
"notifications.column_settings.mention": "Menegoù:",
"notifications.column_settings.poll": "Disoc'hoù ar sontadeg:",
- "notifications.column_settings.push": "Push notifications",
+ "notifications.column_settings.push": "Kemennoù push",
"notifications.column_settings.reblog": "Skignadennoù:",
"notifications.column_settings.show": "Diskouez er bann",
"notifications.column_settings.sound": "Seniñ",
- "notifications.column_settings.status": "New toots:",
- "notifications.column_settings.unread_markers.category": "Unread notification markers",
+ "notifications.column_settings.status": "Toudoù nevez:",
+ "notifications.column_settings.unread_notifications.category": "Kemennoù n'int ket lennet",
+ "notifications.column_settings.unread_notifications.highlight": "Usskediñ kemennoù nevez",
+ "notifications.column_settings.update": "Edits:",
"notifications.filter.all": "Pep tra",
"notifications.filter.boosts": "Skignadennoù",
"notifications.filter.favourites": "Muiañ-karet",
"notifications.filter.follows": "Heuliañ",
"notifications.filter.mentions": "Menegoù",
"notifications.filter.polls": "Disoc'hoù ar sontadegoù",
- "notifications.filter.statuses": "Updates from people you follow",
- "notifications.grant_permission": "Grant permission.",
+ "notifications.filter.statuses": "Hizivadurioù eus tud heuliet ganeoc'h",
+ "notifications.grant_permission": "Reiñ aotre.",
"notifications.group": "{count} a gemennoù",
- "notifications.mark_as_read": "Mark every notification as read",
- "notifications.permission_denied": "Desktop notifications are unavailable due to previously denied browser permissions request",
- "notifications.permission_denied_alert": "Desktop notifications can't be enabled, as browser permission has been denied before",
- "notifications.permission_required": "Desktop notifications are unavailable because the required permission has not been granted.",
- "notifications_permission_banner.enable": "Enable desktop notifications",
- "notifications_permission_banner.how_to_control": "To receive notifications when Mastodon isn't open, enable desktop notifications. You can control precisely which types of interactions generate desktop notifications through the {icon} button above once they're enabled.",
- "notifications_permission_banner.title": "Never miss a thing",
- "picture_in_picture.restore": "Put it back",
+ "notifications.mark_as_read": "Merkañ an holl kemennoù evel bezañ lennet",
+ "notifications.permission_denied": "Kemennoù war ar burev n'int ket hegerz rak pedadenn aotren ar merdeer a zo bet nullet araok",
+ "notifications.permission_denied_alert": "Kemennoù wa ar burev na c'hellont ket bezañ lezelet, rak aotre ar merdeer a zo bet nac'het a-raok",
+ "notifications.permission_required": "Kemennoù war ar burev n'int ket hegerz abalamour d'an aotre rekis n'eo ket bet roet.",
+ "notifications_permission_banner.enable": "Lezel kemennoù war ar burev",
+ "notifications_permission_banner.how_to_control": "Evit reseviñ kemennoù pa ne vez ket digoret Mastodon, lezelit kemennoù war ar burev. Gallout a rit kontrollañ peseurt eskemmoù a c'henel kemennoù war ar burev gant ar {icon} nozelenn a-us kentre ma'z int lezelet.",
+ "notifications_permission_banner.title": "Na vankit netra morse",
+ "picture_in_picture.restore": "Adlakaat",
"poll.closed": "Serret",
"poll.refresh": "Azbevaat",
- "poll.total_people": "{count, plural, one {# person} other {# people}}",
- "poll.total_votes": "{count, plural, one {# vote} other {# votes}}",
+ "poll.total_people": "{count, plural, one {# den} other {# a zen}}",
+ "poll.total_votes": "{count, plural, one {# votadenn} other {# votadenn}}",
"poll.vote": "Mouezhiañ",
"poll.voted": "Mouezhiet ho peus evit ar respont-mañ",
- "poll.votes": "{votes, plural, one {# vote} other {# votes}}",
+ "poll.votes": "{votes, plural,one {#votadenn} other {# votadenn}}",
"poll_button.add_poll": "Ouzhpennañ ur sontadeg",
"poll_button.remove_poll": "Dilemel ar sontadeg",
"privacy.change": "Kemmañ gwelidigezh ar statud",
@@ -362,43 +378,86 @@
"regeneration_indicator.label": "O kargañ…",
"regeneration_indicator.sublabel": "War brientiñ emañ ho red degemer!",
"relative_time.days": "{number}d",
+ "relative_time.full.days": "{number, plural, one {# day} other {# days}} ago",
+ "relative_time.full.hours": "{number, plural, one {# hour} other {# hours}} ago",
+ "relative_time.full.just_now": "bremañ",
+ "relative_time.full.minutes": "{number, plural, one {# minute} other {# minutes}} ago",
+ "relative_time.full.seconds": "{number, plural, one {# second} other {# seconds}} ago",
"relative_time.hours": "{number}e",
"relative_time.just_now": "bremañ",
"relative_time.minutes": "{number}m",
"relative_time.seconds": "{number}eil",
"relative_time.today": "hiziv",
"reply_indicator.cancel": "Nullañ",
+ "report.block": "Block",
+ "report.block_explanation": "You will not see their posts. They will not be able to see your posts or follow you. They will be able to tell that they are blocked.",
+ "report.categories.other": "Other",
+ "report.categories.spam": "Spam",
+ "report.categories.violation": "Content violates one or more server rules",
+ "report.category.subtitle": "Choose the best match",
+ "report.category.title": "Tell us what's going on with this {type}",
+ "report.category.title_account": "profile",
+ "report.category.title_status": "post",
+ "report.close": "Done",
+ "report.comment.title": "Is there anything else you think we should know?",
"report.forward": "Treuzkas da: {target}",
- "report.forward_hint": "The account is from another server. Send an anonymized copy of the report there as well?",
- "report.hint": "The report will be sent to your server moderators. You can provide an explanation of why you are reporting this account below:",
+ "report.forward_hint": "War ur servijer all emañ ar c'hont-se. Kas dezhañ un adskrid disanv eus an danevell ivez?",
+ "report.mute": "Mute",
+ "report.mute_explanation": "You will not see their posts. They can still follow you and see your posts and will not know that they are muted.",
+ "report.next": "Next",
"report.placeholder": "Askelennoù ouzhpenn",
+ "report.reasons.dislike": "I don't like it",
+ "report.reasons.dislike_description": "It is not something you want to see",
+ "report.reasons.other": "It's something else",
+ "report.reasons.other_description": "The issue does not fit into other categories",
+ "report.reasons.spam": "It's spam",
+ "report.reasons.spam_description": "Malicious links, fake engagement, or repetitive replies",
+ "report.reasons.violation": "It violates server rules",
+ "report.reasons.violation_description": "You are aware that it breaks specific rules",
+ "report.rules.subtitle": "Select all that apply",
+ "report.rules.title": "Which rules are being violated?",
+ "report.statuses.subtitle": "Select all that apply",
+ "report.statuses.title": "Are there any posts that back up this report?",
"report.submit": "Kinnig",
- "report.target": "Report {target}",
+ "report.target": "O tisklêriañ {target}",
+ "report.thanks.take_action": "Here are your options for controlling what you see on Mastodon:",
+ "report.thanks.take_action_actionable": "While we review this, you can take action against @{name}:",
+ "report.thanks.title": "Don't want to see this?",
+ "report.thanks.title_actionable": "Thanks for reporting, we'll look into this.",
+ "report.unfollow": "Unfollow @{name}",
+ "report.unfollow_explanation": "You are following this account. To not see their posts in your home feed anymore, unfollow them.",
"search.placeholder": "Klask",
- "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.search_format": "Framm klask araokaet",
+ "search_popout.tips.full_text": "Testenn simpl a adkas toudoù skrivet ganeoc'h, merket ganeoc'h evel miuañ-karet, toudoù skignet, pe e-lec'h oc'h bet meneget, met ivez anvioù skrammañ, anvioù implijer ha gêrioù-klik hag a glot.",
"search_popout.tips.hashtag": "ger-klik",
- "search_popout.tips.status": "statud",
- "search_popout.tips.text": "Simple text returns matching display names, usernames and hashtags",
+ "search_popout.tips.status": "toud",
+ "search_popout.tips.text": "Testenn simpl a adkas anvioù skrammañ, anvioù implijer ha gêrioù-klik hag a glot",
"search_popout.tips.user": "implijer·ez",
"search_results.accounts": "Tud",
+ "search_results.all": "All",
"search_results.hashtags": "Gerioù-klik",
+ "search_results.nothing_found": "Could not find anything for these search terms",
"search_results.statuses": "a doudoù",
- "search_results.statuses_fts_disabled": "Searching toots by their content is not enabled on this Mastodon server.",
- "search_results.total": "{count, number} {count, plural, one {result} other {results}}",
- "status.admin_account": "Open moderation interface for @{name}",
- "status.admin_status": "Open this status in the moderation interface",
+ "search_results.statuses_fts_disabled": "Klask toudoù dre oc'h endalc'h n'eo ket aotreet war ar servijer-mañ.",
+ "search_results.total": "{count, number} {count, plural, one {disoc'h} other {a zisoc'h}}",
+ "status.admin_account": "Digeriñ etrefas evezherezh evit @{name}",
+ "status.admin_status": "Digeriñ an toud e-barzh an etrefas evezherezh",
"status.block": "Berzañ @{name}",
"status.bookmark": "Ouzhpennañ d'ar sinedoù",
- "status.cancel_reblog_private": "Unboost",
- "status.cannot_reblog": "This post cannot be boosted",
+ "status.cancel_reblog_private": "Nac'hañ ar skignadenn",
+ "status.cannot_reblog": "An toud-se ne c'hall ket bezañ skignet",
"status.copy": "Eilañ liamm an toud",
"status.delete": "Dilemel",
- "status.detailed_status": "Detailed conversation view",
- "status.direct": "Kas ur c'hemennad da @{name}",
+ "status.detailed_status": "Gwel kaozeadenn munudek",
+ "status.direct": "Kas ur c'hemennad prevez da @{name}",
+ "status.edit": "Edit",
+ "status.edited": "Edited {date}",
+ "status.edited_x_times": "Edited {count, plural, one {{count} time} other {{count} times}}",
"status.embed": "Enframmañ",
"status.favourite": "Muiañ-karet",
"status.filtered": "Silet",
+ "status.history.created": "{name} created {date}",
+ "status.history.edited": "{name} edited {date}",
"status.load_more": "Kargañ muioc'h",
"status.media_hidden": "Media kuzhet",
"status.mention": "Menegiñ @{name}",
@@ -410,75 +469,75 @@
"status.pinned": "Toud spilhennet",
"status.read_more": "Lenn muioc'h",
"status.reblog": "Skignañ",
- "status.reblog_private": "Boost with original visibility",
- "status.reblogged_by": "{name} boosted",
- "status.reblogs.empty": "No one has boosted this toot yet. When someone does, they will show up here.",
- "status.redraft": "Delete & re-draft",
+ "status.reblog_private": "Skignañ gant ar weledenn gentañ",
+ "status.reblogged_by": "{name} en/he deus skignet",
+ "status.reblogs.empty": "Den ebet n'eus skignet an toud-mañ c'hoazh. Pa vo graet gant unan bennak e vo diskouezet amañ.",
+ "status.redraft": "Diverkañ ha skrivañ en-dro",
"status.remove_bookmark": "Dilemel ar sined",
"status.reply": "Respont",
"status.replyAll": "Respont d'ar gaozeadenn",
"status.report": "Disklêriañ @{name}",
- "status.sensitive_warning": "Sensitive content",
+ "status.sensitive_warning": "Dalc'had kizidik",
"status.share": "Rannañ",
"status.show_less": "Diskouez nebeutoc'h",
- "status.show_less_all": "Show less for all",
+ "status.show_less_all": "Diskouez nebeutoc'h evit an holl",
"status.show_more": "Diskouez muioc'h",
"status.show_more_all": "Diskouez miuoc'h evit an holl",
"status.show_thread": "Diskouez ar gaozeadenn",
"status.uncached_media_warning": "Dihegerz",
"status.unmute_conversation": "Diguzhat ar gaozeadenn",
"status.unpin": "Dispilhennañ eus ar profil",
- "suggestions.dismiss": "Dismiss suggestion",
+ "suggestions.dismiss": "Dilezel damvenegoù",
"suggestions.header": "Marteze e vefec'h dedenet gant…",
"tabs_bar.federated_timeline": "Kevredet",
"tabs_bar.home": "Degemer",
"tabs_bar.local_timeline": "Lec'hel",
"tabs_bar.notifications": "Kemennoù",
"tabs_bar.search": "Klask",
- "time_remaining.days": "{number, plural,one {# devezh} other {# a zevezhioù}} a chom",
+ "time_remaining.days": "{number, plural,one {# devezh} other {# a zevezh}} a chom",
"time_remaining.hours": "{number, plural, one {# eurvezh} other{# eurvezh}} a chom",
- "time_remaining.minutes": "{number, plural, one {# munut} other{# a vunutoù}} a chom",
- "time_remaining.moments": "Moments remaining",
+ "time_remaining.minutes": "{number, plural, one {# munut} other{# a vunut}} a chom",
+ "time_remaining.moments": "Pennadoù a-zilerc'h",
"time_remaining.seconds": "{number, plural, one {# eilenn} other{# eilenn}} a chom",
- "timeline_hint.remote_resource_not_displayed": "{resource} eus servijerien all n'int ket diskouezet.",
+ "timeline_hint.remote_resource_not_displayed": "{resource} eus servijerien all n'int ket skrammet.",
"timeline_hint.resources.followers": "Heulier·ezed·ien",
"timeline_hint.resources.follows": "Heuliañ",
"timeline_hint.resources.statuses": "Toudoù koshoc'h",
"trends.counter_by_accounts": "{count, plural, one {{counter} den} other {{counter} a zud}} a zo o komz",
"trends.trending_now": "Luskad ar mare",
"ui.beforeunload": "Kollet e vo ho prell ma kuitit Mastodon.",
- "units.short.billion": "{count}B",
- "units.short.million": "{count}M",
- "units.short.thousand": "{count}K",
- "upload_area.title": "Drag & drop to upload",
+ "units.short.billion": "{count}miliard",
+ "units.short.million": "{count}milion",
+ "units.short.thousand": "{count}mil",
+ "upload_area.title": "Tennañ ha leuskel evit pellgargañ",
"upload_button.label": "Ouzhpennañ ur media",
- "upload_error.limit": "File upload limit exceeded.",
- "upload_error.poll": "File upload not allowed with polls.",
+ "upload_error.limit": "Bevenn evit pellgargañ restroù a zo distremenet.",
+ "upload_error.poll": "Pellgargañ restroù n'eo ket aotreet gant sontadegoù.",
"upload_form.audio_description": "Diskrivañ evit tud a zo kollet o c'hlev",
"upload_form.description": "Diskrivañ evit tud a zo kollet o gweled",
"upload_form.edit": "Aozañ",
"upload_form.thumbnail": "Kemmañ ar velvenn",
"upload_form.undo": "Dilemel",
"upload_form.video_description": "Diskrivañ evit tud a zo kollet o gweled pe o c'hlev",
- "upload_modal.analyzing_picture": "Analyzing picture…",
+ "upload_modal.analyzing_picture": "O tielfennañ ar skeudenn…",
"upload_modal.apply": "Arloañ",
- "upload_modal.applying": "Applying…",
+ "upload_modal.applying": "Oc'h arloañ…",
"upload_modal.choose_image": "Dibab ur skeudenn",
- "upload_modal.description_placeholder": "A quick brown fox jumps over the lazy dog",
+ "upload_modal.description_placeholder": "Ul louarn gell mibin a zo o lammat a-zioc'h ar c'hi lezirek",
"upload_modal.detect_text": "Dinoiñ testenn diouzh ar skeudenn",
"upload_modal.edit_media": "Embann ar media",
- "upload_modal.hint": "Click or drag the circle on the preview to choose the focal point which will always be in view on all thumbnails.",
- "upload_modal.preparing_ocr": "Preparing OCR…",
+ "upload_modal.hint": "Klikit pe tennit ar c'helc'h war ar rakwel evit dibab al lerc'h kengreizel a vo gwelet atav war an holl melvennoù.",
+ "upload_modal.preparing_ocr": "Oc'h aozañ OCR…",
"upload_modal.preview_label": "Rakwel ({ratio})",
"upload_progress.label": "O pellgargañ...",
"video.close": "Serriñ ar video",
"video.download": "Pellgargañ ar restr",
"video.exit_fullscreen": "Kuitaat ar mod skramm leun",
- "video.expand": "Expand video",
+ "video.expand": "Ledanaat ar video",
"video.fullscreen": "Skramm a-bezh",
"video.hide": "Kuzhat ar video",
"video.mute": "Paouez gant ar son",
- "video.pause": "Pause",
+ "video.pause": "Paouez",
"video.play": "Lenn",
"video.unmute": "Lakaat ar son en-dro"
}
diff --git a/app/javascript/mastodon/locales/ca.json b/app/javascript/mastodon/locales/ca.json
index 9434dbcc3..055732cfd 100644
--- a/app/javascript/mastodon/locales/ca.json
+++ b/app/javascript/mastodon/locales/ca.json
@@ -9,54 +9,56 @@
"account.browse_more_on_origin_server": "Navega més en el perfil original",
"account.cancel_follow_request": "Anul·la la sol·licitud de seguiment",
"account.direct": "Missatge directe @{name}",
- "account.disable_notifications": "Deixa de notificar-me els tuts de @{name}",
- "account.domain_blocked": "Domini ocult",
+ "account.disable_notifications": "Deixa de notificar-me les publicacions de @{name}",
+ "account.domain_blocked": "Domini bloquejat",
"account.edit_profile": "Edita el perfil",
- "account.enable_notifications": "Notifica’m els tuts de @{name}",
+ "account.enable_notifications": "Notifica’m les publicacions de @{name}",
"account.endorse": "Recomana en el teu perfil",
"account.follow": "Segueix",
"account.followers": "Seguidors",
"account.followers.empty": "Encara ningú no segueix aquest usuari.",
"account.followers_counter": "{count, plural, one {{counter} Seguidor} other {{counter} Seguidors}}",
+ "account.following": "Seguint",
"account.following_counter": "{count, plural, other {{counter} Seguint}}",
"account.follows.empty": "Aquest usuari encara no segueix a ningú.",
"account.follows_you": "Et segueix",
"account.hide_reblogs": "Amaga els impulsos de @{name}",
"account.joined": "Unit des de {date}",
- "account.last_status": "Darrer actiu",
"account.link_verified_on": "La propietat d'aquest enllaç es va verificar el dia {date}",
"account.locked_info": "Aquest estat de privadesa del compte està definit com a bloquejat. El propietari revisa manualment qui pot seguir-lo.",
"account.media": "Mèdia",
- "account.mention": "Esmentar @{name}",
+ "account.mention": "Esmenta @{name}",
"account.moved_to": "{name} s'ha mogut a:",
"account.mute": "Silencia @{name}",
- "account.mute_notifications": "Notificacions desactivades de @{name}",
+ "account.mute_notifications": "Notificacions silenciades de @{name}",
"account.muted": "Silenciat",
- "account.never_active": "Mai",
- "account.posts": "Tuts",
- "account.posts_with_replies": "Tuts i respostes",
+ "account.posts": "Publicacions",
+ "account.posts_with_replies": "Publicacions i respostes",
"account.report": "Informar sobre @{name}",
"account.requested": "Esperant aprovació. Clic per a cancel·lar la petició de seguiment",
"account.share": "Comparteix el perfil de @{name}",
"account.show_reblogs": "Mostra els impulsos de @{name}",
"account.statuses_counter": "{count, plural, one {{counter} Tut} other {{counter} Tuts}}",
"account.unblock": "Desbloqueja @{name}",
- "account.unblock_domain": "Mostra {domain}",
+ "account.unblock_domain": "Desbloqueja el domini {domain}",
+ "account.unblock_short": "Desbloqueja",
"account.unendorse": "No recomanar en el perfil",
"account.unfollow": "Deixa de seguir",
"account.unmute": "Treure silenci de @{name}",
"account.unmute_notifications": "Activar notificacions de @{name}",
+ "account.unmute_short": "Deixa de silenciar",
"account_note.placeholder": "Fes clic per afegir una nota",
- "admin.dashboard.retention": "Retention",
- "admin.dashboard.retention.average": "Average",
- "admin.dashboard.retention.cohort": "Sign-up month",
- "admin.dashboard.retention.cohort_size": "New users",
- "alert.rate_limited.message": "Si us plau torna-ho a provar després de {retry_time, time, medium}.",
+ "admin.dashboard.daily_retention": "Ràtio de retenció per dia després del registre",
+ "admin.dashboard.monthly_retention": "Ràtio de retenció per mes després del registre",
+ "admin.dashboard.retention.average": "Mitjana",
+ "admin.dashboard.retention.cohort": "Registres mes",
+ "admin.dashboard.retention.cohort_size": "Nous usuaris",
+ "alert.rate_limited.message": "Si us plau prova-ho després de {retry_time, time, medium}.",
"alert.rate_limited.title": "Límit de freqüència",
"alert.unexpected.message": "S'ha produït un error inesperat.",
"alert.unexpected.title": "Vaja!",
"announcement.announcement": "Anunci",
- "attachments_list.unprocessed": "(unprocessed)",
+ "attachments_list.unprocessed": "(sense processar)",
"autosuggest_hashtag.per_week": "{count} per setmana",
"boost_modal.combo": "Pots prémer {combo} per saltar-te això el proper cop",
"bundle_column_error.body": "S'ha produït un error en carregar aquest component.",
@@ -70,14 +72,14 @@
"column.community": "Línia de temps local",
"column.direct": "Missatges directes",
"column.directory": "Navega els perfils",
- "column.domain_blocks": "Dominis ocults",
+ "column.domain_blocks": "Dominis bloquejats",
"column.favourites": "Favorits",
- "column.follow_requests": "Peticions per seguir-te",
+ "column.follow_requests": "Peticions per a seguir-te",
"column.home": "Inici",
"column.lists": "Llistes",
"column.mutes": "Usuaris silenciats",
"column.notifications": "Notificacions",
- "column.pins": "Tuts fixats",
+ "column.pins": "Publicacions fixades",
"column.public": "Línia de temps federada",
"column_back_button.label": "Enrere",
"column_header.hide_settings": "Amaga la configuració",
@@ -90,37 +92,38 @@
"community.column_settings.local_only": "Només local",
"community.column_settings.media_only": "Només multimèdia",
"community.column_settings.remote_only": "Només remot",
- "compose_form.direct_message_warning": "Aquest tut només serà enviat als usuaris esmentats.",
+ "compose_form.direct_message_warning": "Aquesta publicació només serà enviat als usuaris esmentats.",
"compose_form.direct_message_warning_learn_more": "Aprèn més",
- "compose_form.hashtag_warning": "Aquesta tut no es mostrarà en cap etiqueta ja que no està llistat. Només els tuts públics poden ser cercats per etiqueta.",
- "compose_form.lock_disclaimer": "El teu compte no està bloquejat {locked}. Tothom pot seguir-te i veure els teus missatges a seguidors.",
+ "compose_form.hashtag_warning": "Aquesta publicació no es mostrarà en cap etiqueta ja que no està llistada. Només les publicacions públiques poden ser cercades per etiqueta.",
+ "compose_form.lock_disclaimer": "El teu compte no està bloquejat {locked}. Tothom pot seguir-te i veure els teus missatges només a seguidors.",
"compose_form.lock_disclaimer.lock": "bloquejat",
"compose_form.placeholder": "En què penses?",
- "compose_form.poll.add_option": "Afegeix una opció",
+ "compose_form.poll.add_option": "Afegir una opció",
"compose_form.poll.duration": "Durada de l'enquesta",
"compose_form.poll.option_placeholder": "Opció {number}",
"compose_form.poll.remove_option": "Elimina aquesta opció",
"compose_form.poll.switch_to_multiple": "Canvia l’enquesta per a permetre diverses opcions",
"compose_form.poll.switch_to_single": "Canvia l’enquesta per a permetre una única opció",
- "compose_form.publish": "Tut",
+ "compose_form.publish": "Publicar",
"compose_form.publish_loud": "{publish}!",
- "compose_form.sensitive.hide": "Marcar mèdia com a sensible",
- "compose_form.sensitive.marked": "Mèdia marcat com a sensible",
- "compose_form.sensitive.unmarked": "Mèdia no està marcat com a sensible",
- "compose_form.spoiler.marked": "Text es ocult sota l'avís",
- "compose_form.spoiler.unmarked": "Text no ocult",
+ "compose_form.save_changes": "Desa els canvis",
+ "compose_form.sensitive.hide": "{count, plural, one {Marca mèdia com a sensible} other {Marca mèdia com a sensible}}",
+ "compose_form.sensitive.marked": "{count, plural, one {Mèdia està marcat com a sensible} other {Mèdia estan marcats com a sensible}}",
+ "compose_form.sensitive.unmarked": "{count, plural, one {Mèdia no està marcada com a sensible} other {Mèdia no estan marcats com a sensibles}}",
+ "compose_form.spoiler.marked": "Treu l'avís de contingut",
+ "compose_form.spoiler.unmarked": "Afegeix avís de contingut",
"compose_form.spoiler_placeholder": "Escriu l'avís aquí",
"confirmation_modal.cancel": "Cancel·la",
- "confirmations.block.block_and_report": "Bloquejar i informar",
+ "confirmations.block.block_and_report": "Bloqueja i informa",
"confirmations.block.confirm": "Bloqueja",
"confirmations.block.message": "Estàs segur que vols bloquejar a {name}?",
"confirmations.delete.confirm": "Suprimeix",
- "confirmations.delete.message": "Estàs segur que vols suprimir aquest tut?",
+ "confirmations.delete.message": "Estàs segur que vols suprimir aquesta publicació?",
"confirmations.delete_list.confirm": "Suprimeix",
"confirmations.delete_list.message": "Estàs segur que vols suprimir permanentment aquesta llista?",
- "confirmations.discard_edit_media.confirm": "Discard",
- "confirmations.discard_edit_media.message": "You have unsaved changes to the media description or preview, discard them anyway?",
- "confirmations.domain_block.confirm": "Amaga tot el domini",
+ "confirmations.discard_edit_media.confirm": "Descarta",
+ "confirmations.discard_edit_media.message": "Tens canvis no desats de la descripciò de mèdia o previsualització, els vols descartar?",
+ "confirmations.domain_block.confirm": "Bloqueja el domini sencer",
"confirmations.domain_block.message": "Estàs segur, realment segur que vols bloquejar totalment {domain}? En la majoria dels casos bloquejar o silenciar uns pocs objectius és suficient i preferible. No veuràs contingut d’aquest domini en cap de les línies de temps ni en les notificacions. Els teus seguidors d’aquest domini seran eliminats.",
"confirmations.logout.confirm": "Tancar sessió",
"confirmations.logout.message": "Segur que vols tancar la sessió?",
@@ -128,7 +131,7 @@
"confirmations.mute.explanation": "Això amagarà les seves publicacions i les que els mencionen però encara els permetrà veure les teves i seguir-te.",
"confirmations.mute.message": "Estàs segur que vols silenciar {name}?",
"confirmations.redraft.confirm": "Esborrar i refer",
- "confirmations.redraft.message": "Estàs segur que vols esborrar aquest tut i tornar a redactar-lo? Perdràs tots els impulsos i favorits, i les respostes al tut original es quedaran orfes.",
+ "confirmations.redraft.message": "Estàs segur que vols esborrar aquesta publicació i tornar a redactar-la? Perdràs tots els impulsos i favorits, i les respostes a la publicació original es quedaran orfes.",
"confirmations.reply.confirm": "Respon",
"confirmations.reply.message": "Responen ara es sobreescriurà el missatge que estàs editant. Estàs segur que vols continuar?",
"confirmations.unfollow.confirm": "Deixa de seguir",
@@ -142,14 +145,14 @@
"directory.new_arrivals": "Arribades noves",
"directory.recently_active": "Recentment actius",
"embed.instructions": "Incrusta aquest tut al lloc web copiant el codi a continuació.",
- "embed.preview": "Aquí tenim quin aspecte tindrà:",
+ "embed.preview": "Aquí està quin aspecte tindrà:",
"emoji_button.activity": "Activitat",
"emoji_button.custom": "Personalitzat",
"emoji_button.flags": "Banderes",
"emoji_button.food": "Menjar i beure",
"emoji_button.label": "Insereix un emoji",
"emoji_button.nature": "Natura",
- "emoji_button.not_found": "Emojis no!! (╯°□°)╯︵ ┻━┻",
+ "emoji_button.not_found": "No s'han trobat emojis coincidents",
"emoji_button.objects": "Objectes",
"emoji_button.people": "Gent",
"emoji_button.recent": "Usats freqüentment",
@@ -158,45 +161,52 @@
"emoji_button.symbols": "Símbols",
"emoji_button.travel": "Viatges i Llocs",
"empty_column.account_suspended": "Compte suspès",
- "empty_column.account_timeline": "No hi ha tuts aquí!",
+ "empty_column.account_timeline": "No hi ha publicacions aquí!",
"empty_column.account_unavailable": "Perfil no disponible",
"empty_column.blocks": "Encara no has bloquejat cap usuari.",
- "empty_column.bookmarked_statuses": "Encara no tens marcat cap tut. Quan marquis un apareixerà aquí.",
+ "empty_column.bookmarked_statuses": "Encara no tens desada a marcadors cap publicació. Quan desis una apareixerà aquí.",
"empty_column.community": "La línia de temps local és buida. Escriu alguna cosa públicament per a fer rodar la pilota!",
"empty_column.direct": "Encara no tens missatges directes. Quan enviïs o rebis un, es mostrarà aquí.",
- "empty_column.domain_blocks": "Encara no hi ha dominis ocults.",
- "empty_column.favourited_statuses": "Encara no has marcat com a favorit cap tut. Quan en facis, apareixerà aquí.",
- "empty_column.favourites": "Ningú no ha marcat aquest tut com a preferit encara. Quan algú ho faci, apareixerà aquí.",
+ "empty_column.domain_blocks": "Encara no hi ha dominis bloquejats.",
+ "empty_column.explore_statuses": "No hi ha res en tendència ara mateix. Verifica-ho més tard!",
+ "empty_column.favourited_statuses": "Encara no has afavorit cap publicació. Quan ho facis, apareixerà aquí.",
+ "empty_column.favourites": "Ningú no ha afavorit aquesta publicació encara. Quan algú ho faci, apareixerà aquí.",
"empty_column.follow_recommendations": "Sembla que no es poden generar sugerencies per a tu. Pots provar d'emprar la cerca per a trobar gent que voldries conèixer o explorar les etiquetes en tendència.",
- "empty_column.follow_requests": "Encara no tens cap petició de seguiment. Quan rebis una, apareixerà aquí.",
+ "empty_column.follow_requests": "Encara no tens cap petició de seguiment. Quan en rebis una, apareixerà aquí.",
"empty_column.hashtag": "Encara no hi ha res en aquesta etiqueta.",
- "empty_column.home": "Encara no segueixes ningú. Visita {public} o fes cerca per començar i conèixer altres usuaris.",
+ "empty_column.home": "La teva línia de temps és buida! Segueix més gent per a emplenar-la. {suggestions}",
"empty_column.home.suggestions": "Mira algunes sugerencies",
- "empty_column.list": "Encara no hi ha res en aquesta llista. Quan els membres d'aquesta llista publiquin nous tuts, apareixeran aquí.",
+ "empty_column.list": "Encara no hi ha res en aquesta llista. Quan els membres d'aquesta llista publiquin noves publicacions, apareixeran aquí.",
"empty_column.lists": "Encara no tens cap llista. Quan en facis una, apareixerà aquí.",
"empty_column.mutes": "Encara no has silenciat cap usuari.",
- "empty_column.notifications": "Encara no tens notificacions. Interactua amb altres per iniciar la conversa.",
- "empty_column.public": "No hi ha res aquí! Escriu públicament alguna cosa o manualment segueix usuaris d'altres servidors per omplir-ho",
+ "empty_column.notifications": "Encara no tens notificacions. Quan altre gent interactuï amb tu, les veuràs aquí.",
+ "empty_column.public": "No hi ha res aquí! Escriu públicament alguna cosa o manualment segueix usuaris d'altres servidors per a omplir-ho",
"error.unexpected_crash.explanation": "A causa d'un bug en el nostre codi o un problema de compatibilitat del navegador, aquesta pàgina podria no ser mostrada correctament.",
"error.unexpected_crash.explanation_addons": "Aquesta pàgina podria no mostrar-se correctament. Aquest error és possiblement causat per una extensió del navegador o per eienes automàtiques de traducció.",
"error.unexpected_crash.next_steps": "Prova recarregant la pàgina. Si això no ajuda, encara podries ser capaç d'utilitzar Mastodon a través d'un navegador diferent o amb una aplicació nativa.",
"error.unexpected_crash.next_steps_addons": "Prova de desactivar-les i refrescant la pàgina. Si això no ajuda, encara pots ser capaç d’utilitzar Mastodon amb un altre navegador o aplicació nativa.",
"errors.unexpected_crash.copy_stacktrace": "Còpia stacktrace al porta-retalls",
"errors.unexpected_crash.report_issue": "Informa d'un problema",
+ "explore.search_results": "Resultats de la cerca",
+ "explore.suggested_follows": "Per a tu",
+ "explore.title": "Explora",
+ "explore.trending_links": "Notícies",
+ "explore.trending_statuses": "Publicacions",
+ "explore.trending_tags": "Etiquetes",
"follow_recommendations.done": "Fet",
- "follow_recommendations.heading": "Segueix a la gent de la que t'agradaria veure els seus tuts! Aquí hi ha algunes recomanacions.",
- "follow_recommendations.lead": "Els tuts del usuaris que segueixes es mostraran en ordre cronològic en la teva línia de temps Inici. No tinguis por en cometre errors, pots fàcilment deixar de seguir-los en qualsevol moment!",
- "follow_request.authorize": "Autoritzar",
- "follow_request.reject": "Rebutjar",
+ "follow_recommendations.heading": "Segueix a la gent de la que t'agradaria veure les seves publicacions! Aquí hi ha algunes recomanacions.",
+ "follow_recommendations.lead": "Les publicacions del usuaris que segueixes es mostraran en ordre cronològic en la teva línia de temps Inici. No tinguis por en cometre errors, pots fàcilment deixar de seguir-los en qualsevol moment!",
+ "follow_request.authorize": "Autoritza",
+ "follow_request.reject": "Rebutja",
"follow_requests.unlocked_explanation": "Tot i que el teu compte no està bloquejat, el personal de {domain} ha pensat que és possible que vulguis revisar les sol·licituds de seguiment d’aquests comptes de forma manual.",
- "generic.saved": "Guardat",
+ "generic.saved": "Desat",
"getting_started.developers": "Desenvolupadors",
"getting_started.directory": "Directori de perfils",
"getting_started.documentation": "Documentació",
- "getting_started.heading": "Començant",
+ "getting_started.heading": "Primeres passes",
"getting_started.invite": "Convida gent",
"getting_started.open_source_notice": "Mastodon és un programari de codi obert. Pots contribuir-hi o informar de problemes a GitHub a {github}.",
- "getting_started.security": "Seguretat",
+ "getting_started.security": "Configuració del compte",
"getting_started.terms": "Termes del servei",
"hashtag.column_header.tag_mode.all": "i {additional}",
"hashtag.column_header.tag_mode.any": "o {additional}",
@@ -215,41 +225,41 @@
"intervals.full.days": "{number, plural, one {# dia} other {# dies}}",
"intervals.full.hours": "{number, plural, one {# hora} other {# hores}}",
"intervals.full.minutes": "{number, plural, one {# minut} other {# minuts}}",
- "keyboard_shortcuts.back": "navegar enrere",
- "keyboard_shortcuts.blocked": "per obrir la llista d'usuaris bloquejats",
- "keyboard_shortcuts.boost": "impulsar",
- "keyboard_shortcuts.column": "per a centrar un tut en una de les columnes",
- "keyboard_shortcuts.compose": "per centrar l'àrea de composició de text",
+ "keyboard_shortcuts.back": "Navegar enrere",
+ "keyboard_shortcuts.blocked": "Obre la llista d'usuaris bloquejats",
+ "keyboard_shortcuts.boost": "Impulsa publicació",
+ "keyboard_shortcuts.column": "Centra columna",
+ "keyboard_shortcuts.compose": "Centra l'àrea de composició de text",
"keyboard_shortcuts.description": "Descripció",
- "keyboard_shortcuts.direct": "per obrir la columna de missatges directes",
- "keyboard_shortcuts.down": "per baixar en la llista",
- "keyboard_shortcuts.enter": "per a obrir el tut",
- "keyboard_shortcuts.favourite": "afavorir",
- "keyboard_shortcuts.favourites": "per obrir la llista de favorits",
- "keyboard_shortcuts.federated": "per obrir la línia de temps federada",
+ "keyboard_shortcuts.direct": "Obre la columna de missatges directes",
+ "keyboard_shortcuts.down": "Baixar en la llista",
+ "keyboard_shortcuts.enter": "Obre publicació",
+ "keyboard_shortcuts.favourite": "Afavorir publicació",
+ "keyboard_shortcuts.favourites": "Obre la llista de favorits",
+ "keyboard_shortcuts.federated": "Obre la línia de temps federada",
"keyboard_shortcuts.heading": "Dreceres de teclat",
- "keyboard_shortcuts.home": "per a obrir la línia de temps Inici",
+ "keyboard_shortcuts.home": "Obre la línia de temps Inici",
"keyboard_shortcuts.hotkey": "Tecla d'accés directe",
- "keyboard_shortcuts.legend": "per a mostrar aquesta llegenda",
- "keyboard_shortcuts.local": "per a obrir la línia de temps local",
- "keyboard_shortcuts.mention": "per a esmentar l'autor",
- "keyboard_shortcuts.muted": "per a obrir la llista d'usuaris silenciats",
- "keyboard_shortcuts.my_profile": "per a obrir el teu perfil",
- "keyboard_shortcuts.notifications": "per a obrir la columna de notificacions",
- "keyboard_shortcuts.open_media": "obrir mèdia",
- "keyboard_shortcuts.pinned": "per a obrir la llista de tuts fixats",
- "keyboard_shortcuts.profile": "per a obrir el perfil de l'autor",
- "keyboard_shortcuts.reply": "respondre",
- "keyboard_shortcuts.requests": "per a obrir la llista de sol·licituds de seguiment",
- "keyboard_shortcuts.search": "per a centrar la cerca",
- "keyboard_shortcuts.spoilers": "mostrar/amagar el camp CW",
- "keyboard_shortcuts.start": "per a obrir la columna \"Començar\"",
- "keyboard_shortcuts.toggle_hidden": "per a mostrar o amagar text sota CW",
- "keyboard_shortcuts.toggle_sensitivity": "per a mostrar o amagar contingut multimèdia",
+ "keyboard_shortcuts.legend": "Mostra aquesta llegenda",
+ "keyboard_shortcuts.local": "Obre la línia de temps local",
+ "keyboard_shortcuts.mention": "Esmenta l'autor",
+ "keyboard_shortcuts.muted": "Obre la llista d'usuaris silenciats",
+ "keyboard_shortcuts.my_profile": "Obre el teu perfil",
+ "keyboard_shortcuts.notifications": "Obre la columna de notificacions",
+ "keyboard_shortcuts.open_media": "Obre mèdia",
+ "keyboard_shortcuts.pinned": "Obre la llista de publicacions fixades",
+ "keyboard_shortcuts.profile": "Obre el perfil de l'autor",
+ "keyboard_shortcuts.reply": "Respon publicació",
+ "keyboard_shortcuts.requests": "Obre la llista de sol·licituds de seguiment",
+ "keyboard_shortcuts.search": "Centra la barra de cerca",
+ "keyboard_shortcuts.spoilers": "Mostra/amaga el camp CW",
+ "keyboard_shortcuts.start": "Obre la columna \"Primeres passes\"",
+ "keyboard_shortcuts.toggle_hidden": "Mostra/oculta el text marcat com a sensible",
+ "keyboard_shortcuts.toggle_sensitivity": "Mostra/amaga contingut multimèdia",
"keyboard_shortcuts.toot": "per a començar un tut nou de trinca",
- "keyboard_shortcuts.unfocus": "descentrar l'àrea de composició de text/cerca",
- "keyboard_shortcuts.up": "moure amunt en la llista",
- "lightbox.close": "Tancar",
+ "keyboard_shortcuts.unfocus": "Descentra l'àrea de composició de text/cerca",
+ "keyboard_shortcuts.up": "Moure amunt en la llista",
+ "lightbox.close": "Tanca",
"lightbox.compress": "Quadre de visualització d’imatge comprimida",
"lightbox.expand": "Amplia el quadre de visualització de l’imatge",
"lightbox.next": "Següent",
@@ -260,7 +270,7 @@
"lists.edit": "Editar llista",
"lists.edit.submit": "Canvi de títol",
"lists.new.create": "Afegir llista",
- "lists.new.title_placeholder": "Nova llista",
+ "lists.new.title_placeholder": "Nou títol de llista",
"lists.replies_policy.followed": "Qualsevol usuari seguit",
"lists.replies_policy.list": "Membres de la llista",
"lists.replies_policy.none": "Ningú",
@@ -269,36 +279,38 @@
"lists.subheading": "Les teves llistes",
"load_pending": "{count, plural, one {# element nou} other {# elements nous}}",
"loading_indicator.label": "Carregant...",
- "media_gallery.toggle_visible": "Alternar visibilitat",
+ "media_gallery.toggle_visible": "{number, plural, one {Amaga imatge} other {Amaga imatges}}",
"missing_indicator.label": "No trobat",
"missing_indicator.sublabel": "Aquest recurs no pot ser trobat",
"mute_modal.duration": "Durada",
"mute_modal.hide_notifications": "Amagar notificacions d'aquest usuari?",
"mute_modal.indefinite": "Indefinit",
- "navigation_bar.apps": "Apps mòbils",
+ "navigation_bar.apps": "Aplicacions mòbils",
"navigation_bar.blocks": "Usuaris bloquejats",
"navigation_bar.bookmarks": "Marcadors",
"navigation_bar.community_timeline": "Línia de temps Local",
- "navigation_bar.compose": "Redacta un nou tut",
+ "navigation_bar.compose": "Redacta una nova publicació",
"navigation_bar.direct": "Missatges directes",
- "navigation_bar.discover": "Descobreix",
- "navigation_bar.domain_blocks": "Dominis ocults",
+ "navigation_bar.discover": "Descobrir",
+ "navigation_bar.domain_blocks": "Dominis bloquejats",
"navigation_bar.edit_profile": "Editar perfil",
- "navigation_bar.favourites": "Preferits",
+ "navigation_bar.explore": "Explora",
+ "navigation_bar.favourites": "Favorits",
"navigation_bar.filters": "Paraules silenciades",
"navigation_bar.follow_requests": "Sol·licituds de seguiment",
"navigation_bar.follows_and_followers": "Seguits i seguidors",
- "navigation_bar.info": "Sobre aquest servidor",
+ "navigation_bar.info": "Quant a aquest servidor",
"navigation_bar.keyboard_shortcuts": "Dreceres de teclat",
"navigation_bar.lists": "Llistes",
"navigation_bar.logout": "Tancar sessió",
"navigation_bar.mutes": "Usuaris silenciats",
"navigation_bar.personal": "Personal",
- "navigation_bar.pins": "Tuts fixats",
+ "navigation_bar.pins": "Publicacions fixades",
"navigation_bar.preferences": "Preferències",
"navigation_bar.public_timeline": "Línia de temps federada",
"navigation_bar.security": "Seguretat",
- "notification.favourite": "{name} ha afavorit el teu estat",
+ "notification.admin.sign_up": "{name} s'ha registrat",
+ "notification.favourite": "{name} ha afavorit la teva publicació",
"notification.follow": "{name} et segueix",
"notification.follow_request": "{name} ha sol·licitat seguir-te",
"notification.mention": "{name} t'ha esmentat",
@@ -306,23 +318,27 @@
"notification.poll": "Ha finalitzat una enquesta en la que has votat",
"notification.reblog": "{name} ha impulsat el teu estat",
"notification.status": "ha publicat {name}",
+ "notification.update": "{name} ha editat una publicació",
"notifications.clear": "Netejar notificacions",
"notifications.clear_confirmation": "Estàs segur que vols esborrar permanentment totes les teves notificacions?",
+ "notifications.column_settings.admin.sign_up": "Nous registres:",
"notifications.column_settings.alert": "Notificacions d'escriptori",
"notifications.column_settings.favourite": "Preferits:",
"notifications.column_settings.filter_bar.advanced": "Mostra totes les categories",
"notifications.column_settings.filter_bar.category": "Barra ràpida de filtres",
- "notifications.column_settings.filter_bar.show": "Mostra",
+ "notifications.column_settings.filter_bar.show_bar": "Mostra la barra de filtres",
"notifications.column_settings.follow": "Nous seguidors:",
- "notifications.column_settings.follow_request": "Nova sol·licitud de seguiment:",
+ "notifications.column_settings.follow_request": "Noves sol·licituts de seguiment:",
"notifications.column_settings.mention": "Mencions:",
"notifications.column_settings.poll": "Resultats de l’enquesta:",
"notifications.column_settings.push": "Notificacions push",
"notifications.column_settings.reblog": "Impulsos:",
"notifications.column_settings.show": "Mostra en la columna",
"notifications.column_settings.sound": "Reproduir so",
- "notifications.column_settings.status": "Nous tuts:",
- "notifications.column_settings.unread_markers.category": "Marcadors de notificacions no llegides",
+ "notifications.column_settings.status": "Noves publicacions:",
+ "notifications.column_settings.unread_notifications.category": "Notificacions no llegides",
+ "notifications.column_settings.unread_notifications.highlight": "Destaca notificacions no llegides",
+ "notifications.column_settings.update": "Edicions:",
"notifications.filter.all": "Tots",
"notifications.filter.boosts": "Impulsos",
"notifications.filter.favourites": "Favorits",
@@ -333,11 +349,11 @@
"notifications.grant_permission": "Concedir permís.",
"notifications.group": "{count} notificacions",
"notifications.mark_as_read": "Marca cada notificació com a llegida",
- "notifications.permission_denied": "No s’ha pogut activar les notificacions d’escriptori perquè s’ha denegat el permís.",
+ "notifications.permission_denied": "Les notificacions d’escriptori no estan disponibles perquè prèviament s’ha denegat el permís al navegador",
"notifications.permission_denied_alert": "No es poden activar les notificacions del escriptori perquè el permís del navegador ha estat denegat abans",
"notifications.permission_required": "Les notificacions d'escriptori no estan disponibles perquè el permís requerit no ha estat concedit.",
"notifications_permission_banner.enable": "Activar les notificacions d’escriptori",
- "notifications_permission_banner.how_to_control": "Per a rebre notificacions quan Mastodon no està obert cal activar les notificacions d’escriptori. Pots controlar amb precisió quins tipus d’interaccions generen notificacions d’escriptori després d’activar el botó {icon} de dalt.",
+ "notifications_permission_banner.how_to_control": "Per a rebre notificacions quan Mastodon no és obert cal activar les notificacions d’escriptori. Pots controlar amb precisió quins tipus d’interaccions generen notificacions d’escriptori després d’activar el botó {icon} de dalt.",
"notifications_permission_banner.title": "Mai et perdis res",
"picture_in_picture.restore": "Retorna’l",
"poll.closed": "Finalitzada",
@@ -346,59 +362,102 @@
"poll.total_votes": "{count, plural, one {# vot} other {# vots}}",
"poll.vote": "Vota",
"poll.voted": "Vas votar per aquesta resposta",
- "poll.votes": "{votes, plural, one {# vote} other {# votes}}",
- "poll_button.add_poll": "Afegeix una enquesta",
+ "poll.votes": "{votes, plural, one {# vot} other {# vots}}",
+ "poll_button.add_poll": "Afegir una enquesta",
"poll_button.remove_poll": "Elimina l'enquesta",
- "privacy.change": "Ajusta l'estat de privacitat",
- "privacy.direct.long": "Publicar només per als usuaris esmentats",
+ "privacy.change": "Ajustar la privacitat de la publicació",
+ "privacy.direct.long": "Visible només per als usuaris esmentats",
"privacy.direct.short": "Directe",
- "privacy.private.long": "Publicar només a seguidors",
+ "privacy.private.long": "Visible només pels seguidors",
"privacy.private.short": "Només seguidors",
- "privacy.public.long": "Publicar en línies de temps públiques",
+ "privacy.public.long": "Visible per a tothom, mostrat en línies de temps públiques",
"privacy.public.short": "Públic",
- "privacy.unlisted.long": "No publicar en línies de temps públiques",
+ "privacy.unlisted.long": "Visible per a tothom però no en les línies de temps públiques",
"privacy.unlisted.short": "No llistat",
"refresh": "Actualitza",
"regeneration_indicator.label": "Carregant…",
- "regeneration_indicator.sublabel": "S'està preparant la línia de temps Inici!",
+ "regeneration_indicator.sublabel": "S'està preparant la teva línia de temps Inici!",
"relative_time.days": "fa {number} dies",
+ "relative_time.full.days": "fa {number, plural, one {# dia} other {# dies}}",
+ "relative_time.full.hours": "fa {number, plural, one {# hora} other {# hores}}",
+ "relative_time.full.just_now": "ara mateix",
+ "relative_time.full.minutes": "fa {number, plural, one {# minut} other {# minuts}}",
+ "relative_time.full.seconds": "fa {number, plural, one {# segon} other {# segons}}",
"relative_time.hours": "fa {number} hores",
"relative_time.just_now": "ara",
"relative_time.minutes": "fa {number} minuts",
"relative_time.seconds": "fa {number} segons",
"relative_time.today": "avui",
"reply_indicator.cancel": "Cancel·lar",
+ "report.block": "Bloqueja",
+ "report.block_explanation": "No veuràs les seves publicacions. Ell no podran veure les teves publicacions ni seguir-te. Ells podran dir que estan bloquejats.",
+ "report.categories.other": "Altres",
+ "report.categories.spam": "Contingut brossa",
+ "report.categories.violation": "El contingut viola una o més regles del servidor",
+ "report.category.subtitle": "Tria la millor coincidència",
+ "report.category.title": "Digue'ns què està passant amb aquest {type}",
+ "report.category.title_account": "perfil",
+ "report.category.title_status": "publicació",
+ "report.close": "Fet",
+ "report.comment.title": "Hi ha res més que penses hauriem de saber?",
"report.forward": "Reenvia a {target}",
"report.forward_hint": "Aquest compte és d'un altre servidor. Enviar-hi també una copia anònima del informe?",
- "report.hint": "El informe s'enviarà als moderadors del teu servidor. Pots explicar perquè vols informar d'aquest compte aquí:",
+ "report.mute": "Silencia",
+ "report.mute_explanation": "No veuràs les seves publicacions. Ells encara poden seguir-te i veure les teves publicacions però no sabran que han estat silenciats.",
+ "report.next": "Següent",
"report.placeholder": "Comentaris addicionals",
+ "report.reasons.dislike": "No m'agrada",
+ "report.reasons.dislike_description": "Això no és quelcom que vulguis veure",
+ "report.reasons.other": "Això és una altre cosa",
+ "report.reasons.other_description": "El problema no encaixa en altres categories",
+ "report.reasons.spam": "Això és contingut brossa",
+ "report.reasons.spam_description": "Enllaços maliciosos, compromís falç o respostes repetitives",
+ "report.reasons.violation": "Viola les regles del servidor",
+ "report.reasons.violation_description": "Ets conscient que trenca regles especifiques",
+ "report.rules.subtitle": "Selecciona totes les aplicables",
+ "report.rules.title": "Quines regles han estat violades?",
+ "report.statuses.subtitle": "Selecciona tots els aplicables",
+ "report.statuses.title": "Hi ha alguna publicació que recolzi aquest informe?",
"report.submit": "Enviar",
"report.target": "Informes {target}",
+ "report.thanks.take_action": "Aquestes son les teves opcions per a controlar el que veus a Mastodon:",
+ "report.thanks.take_action_actionable": "Mentre ho revisem, pots pendre mesures contra @{name}:",
+ "report.thanks.title": "No vols veure això?",
+ "report.thanks.title_actionable": "Gràcies per informar, ho investigarem.",
+ "report.unfollow": "Deixar de seguir @{name}",
+ "report.unfollow_explanation": "Estàs seguint aquest compte. Per a no veure més les seves publicacions en la teva línia de temps Inici, deixa de seguir-lo.",
"search.placeholder": "Cercar",
"search_popout.search_format": "Format de cerca avançada",
- "search_popout.tips.full_text": "Text simple recupera publicacions que has escrit, les marcades com a preferides, les impulsades o en les que has estat esmentat, així com usuaris, noms d'usuari i etiquetes.",
+ "search_popout.tips.full_text": "Text simple recupera publicacions que has escrit, les afavorides, les impulsades o en les que has estat esmentat, així com usuaris, noms d'usuari i etiquetes.",
"search_popout.tips.hashtag": "etiqueta",
- "search_popout.tips.status": "tut",
+ "search_popout.tips.status": "publicació",
"search_popout.tips.text": "El text simple retorna coincidències amb els noms de visualització, els noms d'usuari i les etiquetes",
"search_popout.tips.user": "usuari",
"search_results.accounts": "Gent",
+ "search_results.all": "Tots",
"search_results.hashtags": "Etiquetes",
- "search_results.statuses": "Tuts",
- "search_results.statuses_fts_disabled": "La cerca de tuts pel seu contingut no està habilitada en aquest servidor Mastodon.",
+ "search_results.nothing_found": "No s'ha pogut trobar res per a aquests termes de cerca",
+ "search_results.statuses": "Publicacions",
+ "search_results.statuses_fts_disabled": "La cerca de publicacions pel seu contingut no està habilitada en aquest servidor Mastodon.",
"search_results.total": "{count, number} {count, plural, one {resultat} other {resultats}}",
"status.admin_account": "Obre l'interfície de moderació per a @{name}",
- "status.admin_status": "Obre aquest tut a la interfície de moderació",
+ "status.admin_status": "Obre aquesta publicació a la interfície de moderació",
"status.block": "Bloqueja @{name}",
"status.bookmark": "Marcador",
"status.cancel_reblog_private": "Desfer l'impuls",
"status.cannot_reblog": "Aquesta publicació no pot ser impulsada",
"status.copy": "Copia l'enllaç a l'estat",
- "status.delete": "Esborrar",
+ "status.delete": "Esborra",
"status.detailed_status": "Visualització detallada de la conversa",
"status.direct": "Missatge directe @{name}",
- "status.embed": "Incrustar",
+ "status.edit": "Edita",
+ "status.edited": "Editat {date}",
+ "status.edited_x_times": "Editat {count, plural, one {{count} vegada} other {{count} vegades}}",
+ "status.embed": "Incrustat",
"status.favourite": "Favorit",
"status.filtered": "Filtrat",
+ "status.history.created": "{name} ha creat {date}",
+ "status.history.edited": "{name} ha editat {date}",
"status.load_more": "Carrega més",
"status.media_hidden": "Multimèdia amagat",
"status.mention": "Esmentar @{name}",
@@ -406,17 +465,17 @@
"status.mute": "Silenciar @{name}",
"status.mute_conversation": "Silenciar conversació",
"status.open": "Ampliar aquest estat",
- "status.pin": "Fixat en el perfil",
- "status.pinned": "Tut fixat",
+ "status.pin": "Fixa en el perfil",
+ "status.pinned": "Publicació fixada",
"status.read_more": "Llegir més",
"status.reblog": "Impuls",
- "status.reblog_private": "Impulsar a l'audiència original",
+ "status.reblog_private": "Impulsar amb la visibilitat original",
"status.reblogged_by": "{name} ha impulsat",
- "status.reblogs.empty": "Encara ningú no ha impulsat aquest tut. Quan algú ho faci, apareixeran aquí.",
+ "status.reblogs.empty": "Encara ningú no ha impulsat aquesta publicació. Quan algú ho faci, apareixeran aquí.",
"status.redraft": "Esborrar i reescriure",
"status.remove_bookmark": "Suprimeix el marcador",
"status.reply": "Respondre",
- "status.replyAll": "Respondre al tema",
+ "status.replyAll": "Respondre al fil",
"status.report": "Informar sobre @{name}",
"status.sensitive_warning": "Contingut sensible",
"status.share": "Compartir",
@@ -430,7 +489,7 @@
"status.unpin": "Deslliga del perfil",
"suggestions.dismiss": "Descartar suggeriment",
"suggestions.header": "És possible que estiguis interessat en…",
- "tabs_bar.federated_timeline": "Federada",
+ "tabs_bar.federated_timeline": "Federat",
"tabs_bar.home": "Inici",
"tabs_bar.local_timeline": "Local",
"tabs_bar.notifications": "Notificacions",
@@ -451,20 +510,20 @@
"units.short.million": "{count}M",
"units.short.thousand": "{count}K",
"upload_area.title": "Arrossega i deixa anar per a carregar",
- "upload_button.label": "Afegir multimèdia (JPEG, PNG, GIF, WebM, MP4, MOV)",
+ "upload_button.label": "Afegir mèdia, un vídeo o un fitxer d'audio",
"upload_error.limit": "S'ha superat el límit de càrrega d'arxius.",
"upload_error.poll": "No es permet l'enviament de fitxers en les enquestes.",
"upload_form.audio_description": "Descriviu per a les persones amb pèrdua auditiva",
- "upload_form.description": "Descriure els problemes visuals",
+ "upload_form.description": "Descriure per els que tenen problemes visuals",
"upload_form.edit": "Edita",
"upload_form.thumbnail": "Canvia la miniatura",
"upload_form.undo": "Esborra",
"upload_form.video_description": "Descriu per a les persones amb pèrdua auditiva o deficiència visual",
"upload_modal.analyzing_picture": "Analitzant imatge…",
"upload_modal.apply": "Aplica",
- "upload_modal.applying": "Applying…",
+ "upload_modal.applying": "Aplicant…",
"upload_modal.choose_image": "Tria imatge",
- "upload_modal.description_placeholder": "Jove xef, porti whisky amb quinze glaçons d’hidrogen, coi!",
+ "upload_modal.description_placeholder": "Una ràpida guineu marró salta sobre el gos mandrós",
"upload_modal.detect_text": "Detecta el text de l'imatge",
"upload_modal.edit_media": "Editar multimèdia",
"upload_modal.hint": "Fes clic o arrossega el cercle en la previsualització per escollir el punt focal que sempre serà visible de totes les miniatures.",
diff --git a/app/javascript/mastodon/locales/ckb.json b/app/javascript/mastodon/locales/ckb.json
new file mode 100644
index 000000000..7209633ad
--- /dev/null
+++ b/app/javascript/mastodon/locales/ckb.json
@@ -0,0 +1,543 @@
+{
+ "account.account_note_header": "تێبینی ",
+ "account.add_or_remove_from_list": "زیادکردن یان سڕینەوە لە پێرستەکان",
+ "account.badges.bot": "بوت",
+ "account.badges.group": "گرووپ",
+ "account.block": "بلۆکی @{name}",
+ "account.block_domain": "بلۆکی هەموو شتێک لە {domain}",
+ "account.blocked": "بلۆککرا",
+ "account.browse_more_on_origin_server": "گەڕانی فرەتر لە سەر پرۆفایلی سەرەکی",
+ "account.cancel_follow_request": "بەتاڵکردنی داوای شوێنکەوتن",
+ "account.direct": "پەیامی تایبەت بە @{name}",
+ "account.disable_notifications": "ئاگانامە مەنێرە بۆم کاتێک @{name} پۆست دەکرێت",
+ "account.domain_blocked": "دۆمەین قەپاتکرا",
+ "account.edit_profile": "دەستکاری پرۆفایل",
+ "account.enable_notifications": "ئاگادارم بکەوە کاتێک @{name} بابەتەکان",
+ "account.endorse": "ناساندن لە پرۆفایل",
+ "account.follow": "شوێنکەوتن",
+ "account.followers": "شوێنکەوتووان",
+ "account.followers.empty": "کەسێک شوێن ئەم بەکارهێنەرە نەکەوتووە",
+ "account.followers_counter": "{count, plural, one {{counter} شوێنکەوتوو} other {{counter} شوێنکەوتوو}}",
+ "account.following": "Following",
+ "account.following_counter": "{count, plural, one {{counter} Following} other {{counter} Following}}",
+ "account.follows.empty": "ئەم بەکارهێنەرە تا ئێستا شوێن کەس نەکەوتووە.",
+ "account.follows_you": "شوێنکەوتووەکانت",
+ "account.hide_reblogs": "داشاردنی بووستەکان لە @{name}",
+ "account.joined": "Joined {date}",
+ "account.link_verified_on": "خاوەنداریەتی ئەم لینکە لە {date} چێک کراوە",
+ "account.locked_info": "تایبەتمەندی ئەم هەژمارەیە ڕیکخراوە بۆ قوفڵدراوە. خاوەنەکە بە دەستی پێداچوونەوە دەکات کە کێ دەتوانێت شوێنیان بکەوێت.",
+ "account.media": "میدیا",
+ "account.mention": "ئاماژە @{name}",
+ "account.moved_to": "{name} گواسترایەوە بۆ:",
+ "account.mute": "بێدەنگکردن @{name}",
+ "account.mute_notifications": "هۆشیارکەرەوەکان لاببە لە @{name}",
+ "account.muted": "بێ دەنگ",
+ "account.posts": "توتس",
+ "account.posts_with_replies": "توتس و وەڵامەکان",
+ "account.report": "گوزارشت @{name}",
+ "account.requested": "چاوەڕێی ڕەزامەندین. کرتە بکە بۆ هەڵوەشاندنەوەی داواکاری شوێنکەوتن",
+ "account.share": "پرۆفایلی @{name} هاوبەش بکە",
+ "account.show_reblogs": "پیشاندانی بەرزکردنەوەکان لە @{name}",
+ "account.statuses_counter": "{count, plural, one {{counter} Following} other {{counter} Following}}",
+ "account.unblock": "@{name} لاببە",
+ "account.unblock_domain": "کردنەوەی دۆمەینی {domain}",
+ "account.unblock_short": "Unblock",
+ "account.unendorse": "تایبەتمەندی لەسەر پرۆفایلەکە نیە",
+ "account.unfollow": "بەدوادانەچو",
+ "account.unmute": "بێدەنگکردنی @{name}",
+ "account.unmute_notifications": "بێدەنگکردنی هۆشیارییەکان لە @{name}",
+ "account.unmute_short": "Unmute",
+ "account_note.placeholder": "کرتەبکە بۆ زیادکردنی تێبینی",
+ "admin.dashboard.daily_retention": "User retention rate by day after sign-up",
+ "admin.dashboard.monthly_retention": "User retention rate by month after sign-up",
+ "admin.dashboard.retention.average": "Average",
+ "admin.dashboard.retention.cohort": "Sign-up month",
+ "admin.dashboard.retention.cohort_size": "New users",
+ "alert.rate_limited.message": "تکایە هەوڵبدەرەوە دوای {retry_time, time, medium}.",
+ "alert.rate_limited.title": "ڕێژەی سنووردار",
+ "alert.unexpected.message": "هەڵەیەکی چاوەڕوان نەکراو ڕوویدا.",
+ "alert.unexpected.title": "تەححح!",
+ "announcement.announcement": "بانگەواز",
+ "attachments_list.unprocessed": "(unprocessed)",
+ "autosuggest_hashtag.per_week": "{count} هەرهەفتە",
+ "boost_modal.combo": "دەتوانیت دەست بنێی بە سەر {combo} بۆ بازدان لە جاری داهاتوو",
+ "bundle_column_error.body": "هەڵەیەک ڕوویدا لەکاتی بارکردنی ئەم پێکهاتەیە.",
+ "bundle_column_error.retry": "دووبارە هەوڵبدە",
+ "bundle_column_error.title": "هەڵيی تۆڕ",
+ "bundle_modal_error.close": "داخستن",
+ "bundle_modal_error.message": "هەڵەیەک ڕوویدا لەکاتی بارکردنی ئەم پێکهاتەیە.",
+ "bundle_modal_error.retry": "دووبارە تاقی بکەوە",
+ "column.blocks": "بەکارهێنەرە بلۆککراوەکان",
+ "column.bookmarks": "نیشانەکان",
+ "column.community": "هێڵی کاتی ناوخۆیی",
+ "column.direct": "نامە ڕاستەوخۆکان",
+ "column.directory": "گەڕان لە پرۆفایلەکان",
+ "column.domain_blocks": "دۆمەینە داخراوەکان",
+ "column.favourites": "دڵخوازترینەکان",
+ "column.follow_requests": "بەدواداچوی داواکاریەکان بکە",
+ "column.home": "سەرەتا",
+ "column.lists": "پێرست",
+ "column.mutes": "بێدەنگکردنی بەکارهێنەران",
+ "column.notifications": "ئاگادارییەکان",
+ "column.pins": "تووتسی چەسپاو",
+ "column.public": "نووسراوەکانی هەمووشوێنێک",
+ "column_back_button.label": "دواوە",
+ "column_header.hide_settings": "شاردنەوەی ڕێکخستنەکان",
+ "column_header.moveLeft_settings": "ستوون بگوێزەرەوە بۆ لای چەپ",
+ "column_header.moveRight_settings": "جوولاندنی ئەستوون بۆ لای ڕاست",
+ "column_header.pin": "سنجاق",
+ "column_header.show_settings": "نیشاندانی رێکخستنەکان",
+ "column_header.unpin": "سنجاق نەکردن",
+ "column_subheading.settings": "رێکخستنەکان",
+ "community.column_settings.local_only": "تەنها خۆماڵی",
+ "community.column_settings.media_only": "تەنها میدیا",
+ "community.column_settings.remote_only": "تەنها بۆ دوور",
+ "compose_form.direct_message_warning": "ئەم توتە تەنیا بۆ بەکارهێنەرانی ناوبراو دەنێردرێت.",
+ "compose_form.direct_message_warning_learn_more": "زیاتر فێربه",
+ "compose_form.hashtag_warning": "ئەم توتە لە ژێر هیچ هاشتاگییەک دا ناکرێت وەک ئەوەی لە لیستەکەدا نەریزراوە. تەنها توتی گشتی دەتوانرێت بە هاشتاگی بگەڕێت.",
+ "compose_form.lock_disclaimer": "هەژمێرەکەی لە حاڵەتی {locked}. هەر کەسێک دەتوانێت شوێنت بکەوێت بۆ پیشاندانی بابەتەکانی تەنها دوایخۆی.",
+ "compose_form.lock_disclaimer.lock": "قفڵ دراوە",
+ "compose_form.placeholder": "چی لە مێشکتدایە?",
+ "compose_form.poll.add_option": "زیادکردنی هەڵبژاردەیەک",
+ "compose_form.poll.duration": "ماوەی ڕاپرسی",
+ "compose_form.poll.option_placeholder": "هەڵبژاردن {number}",
+ "compose_form.poll.remove_option": "لابردنی ئەم هەڵبژاردەیە",
+ "compose_form.poll.switch_to_multiple": "ڕاپرسی بگۆڕە بۆ ڕێگەدان بە چەند هەڵبژاردنێک",
+ "compose_form.poll.switch_to_single": "گۆڕینی ڕاپرسی بۆ ڕێگەدان بە تاکە هەڵبژاردنێک",
+ "compose_form.publish": "توت",
+ "compose_form.publish_loud": "{publish}!",
+ "compose_form.save_changes": "Save changes",
+ "compose_form.sensitive.hide": "نیشانکردنی میدیا وەک هەستیار",
+ "compose_form.sensitive.marked": "وادەی کۆتایی",
+ "compose_form.sensitive.unmarked": "میدیا وەک هەستیار نیشان نەکراوە",
+ "compose_form.spoiler.marked": "دەق لە پشت ئاگاداریدا شاراوەتەوە",
+ "compose_form.spoiler.unmarked": "دەق شاراوە نییە",
+ "compose_form.spoiler_placeholder": "ئاگاداریەکەت لێرە بنووسە",
+ "confirmation_modal.cancel": "هەڵوەشاندنەوه",
+ "confirmations.block.block_and_report": "بلۆک & گوزارشت",
+ "confirmations.block.confirm": "بلۆک",
+ "confirmations.block.message": "ئایا دڵنیایت لەوەی دەتەوێت {name} بلۆک بکەیت?",
+ "confirmations.delete.confirm": "سڕینەوە",
+ "confirmations.delete.message": "ئایا دڵنیایت لەوەی دەتەوێت ئەم توتە بسڕیتەوە?",
+ "confirmations.delete_list.confirm": "سڕینەوە",
+ "confirmations.delete_list.message": "ئایا دڵنیایت لەوەی دەتەوێت بە هەمیشەیی ئەم لیستە بسڕیتەوە?",
+ "confirmations.discard_edit_media.confirm": "Discard",
+ "confirmations.discard_edit_media.message": "You have unsaved changes to the media description or preview, discard them anyway?",
+ "confirmations.domain_block.confirm": "بلۆککردنی هەموو دۆمەینەکە",
+ "confirmations.domain_block.message": "ئایا بەڕاستی، بەڕاستی تۆ دەتەوێت هەموو {domain} بلۆک بکەیت؟ لە زۆربەی حاڵەتەکاندا چەند بلۆکێکی ئامانجدار یان بێدەنگەکان پێویست و پەسەندن. تۆ ناوەڕۆک ێک نابینیت لە دۆمەینەکە لە هیچ هێڵی کاتی گشتی یان ئاگانامەکانت. شوێنکەوتوانی تۆ لەو دۆمەینەوە لادەبرێن.",
+ "confirmations.logout.confirm": "چوونە دەرەوە",
+ "confirmations.logout.message": "ئایا دڵنیایت لەوەی دەتەوێت بچیتە دەرەوە?",
+ "confirmations.mute.confirm": "بێدەنگ",
+ "confirmations.mute.explanation": "ئەمەش دەبێتە هۆی شاردنەوەی پۆستەکان یان ئەو بابەتانەی کە ئاماژەیان پێ دەکات ، بەڵام هێشتا ڕێگەیان پێ دەدات کە پۆستەکانتان ببینن و شوێنتان بکەون.",
+ "confirmations.mute.message": "ئایا دڵنیایت لەوەی دەتەوێت بیلێیت {name}?",
+ "confirmations.redraft.confirm": "سڕینەوە & دووبارە ڕەشکردنەوە",
+ "confirmations.redraft.message": "ئایا دڵنیایت لەوەی دەتەوێت ئەم توتە بسڕیتەوە و دووبارە دایبنووسیتەوە؟ دڵخوازەکان و بەرزکردنەوەکان وون دەبن، و وەڵامەکان بۆ پۆستە ڕەسەنەکە هەتیو دەبن.",
+ "confirmations.reply.confirm": "وەڵام",
+ "confirmations.reply.message": "وەڵامدانەوە ئێستا ئەو نامەیە ی کە تۆ ئێستا دایڕشتووە، دەنووسێتەوە. ئایا دڵنیایت کە دەتەوێت بەردەوام بیت?",
+ "confirmations.unfollow.confirm": "بەدوادانەچو",
+ "confirmations.unfollow.message": "ئایا دڵنیایت لەوەی دەتەوێت پەیڕەوی {name}?",
+ "conversation.delete": "سڕینەوەی گفتوگۆ",
+ "conversation.mark_as_read": "نیشانەکردن وەک خوێندراوە",
+ "conversation.open": "نیشاندان گفتوگۆ",
+ "conversation.with": "لەگەڵ{names}",
+ "directory.federated": "لە ڕاژەکانی ناسراو",
+ "directory.local": "تەنها لە {domain}",
+ "directory.new_arrivals": "تازە گەیشتنەکان",
+ "directory.recently_active": "بەم دواییانە چالاکە",
+ "embed.instructions": "ئەم توتە بنچین بکە لەسەر وێب سایتەکەت بە کۆپیکردنی کۆدەکەی خوارەوە.",
+ "embed.preview": "ئەمە ئەو شتەیە کە لە شێوەی خۆی دەچێت:",
+ "emoji_button.activity": "چالاکی",
+ "emoji_button.custom": "ئاسایی",
+ "emoji_button.flags": "ئاڵاکان",
+ "emoji_button.food": "خواردن& خواردنەوە",
+ "emoji_button.label": "ئیمۆجی بکەنێو",
+ "emoji_button.nature": "سروشت",
+ "emoji_button.not_found": "بێ ئیمۆجی! (╯°□°)╯( ┻━┻",
+ "emoji_button.objects": "ئامانجەکان",
+ "emoji_button.people": "خەڵک",
+ "emoji_button.recent": "زۆرجار بەکارهێنراوە",
+ "emoji_button.search": "گەڕان...",
+ "emoji_button.search_results": "ئەنجامەکانی گەڕان",
+ "emoji_button.symbols": "هێماکان",
+ "emoji_button.travel": "گەشت & شوێنەکان",
+ "empty_column.account_suspended": "Account suspended",
+ "empty_column.account_timeline": "لێرە هیچ توتەک نییە!",
+ "empty_column.account_unavailable": "پرۆفایل بەردەست نیە",
+ "empty_column.blocks": "تۆ هێشتا هیچ بەکارهێنەرێکت بلۆک نەکردووە.",
+ "empty_column.bookmarked_statuses": "تۆ هێشتا هیچ توتێکی دیاریکراوت نیە کاتێک نیشانەیەک نیشان دەکەیت، لێرە دەرئەکەویت.",
+ "empty_column.community": "هێڵی کاتی ناوخۆیی بەتاڵە. شتێک بە ئاشکرا بنووسە بۆ ئەوەی تۆپەکە بسووڕێت!",
+ "empty_column.direct": "تۆ هیچ نامەی ڕاستەوخۆت نیە تا ئێستا. کاتێک دانەیەک دەنێریت یان وەرت دەگرێت، لێرە پیشان دەدات.",
+ "empty_column.domain_blocks": "هێشتا هیچ دۆمەینێکی بلۆک کراو نییە.",
+ "empty_column.explore_statuses": "Nothing is trending right now. Check back later!",
+ "empty_column.favourited_statuses": "تۆ هێشتا هیچ توتێکی دڵخوازت نییە، کاتێک حەزت لە دانەیەکی باشە، لێرە دەرئەکەویت.",
+ "empty_column.favourites": "کەس ئەم توتەی دڵخواز نەکردووە،کاتێک کەسێک وا بکات، لێرە دەرئەکەون.",
+ "empty_column.follow_recommendations": "Looks like no suggestions could be generated for you. You can try using search to look for people you might know or explore trending hashtags.",
+ "empty_column.follow_requests": "تۆ هێشتا هیچ داواکارییەکی بەدواداچووت نیە. کاتێک یەکێکت بۆ هات، لێرە دەرئەکەویت.",
+ "empty_column.hashtag": "هێشتا هیچ شتێک لەم هاشتاگەدا نییە.",
+ "empty_column.home": "تایم لاینی ماڵەوەت بەتاڵە! سەردانی {public} بکە یان گەڕان بەکاربێنە بۆ دەستپێکردن و بینینی بەکارهێنەرانی تر.",
+ "empty_column.home.suggestions": "See some suggestions",
+ "empty_column.list": "هێشتا هیچ شتێک لەم لیستەدا نییە. کاتێک ئەندامانی ئەم لیستە دەنگی نوێ بڵاودەکەن، لێرە دەردەکەون.",
+ "empty_column.lists": "تۆ هێشتا هیچ لیستت دروست نەکردووە، کاتێک دانەیەک دروست دەکەیت، لێرە پیشان دەدرێت.",
+ "empty_column.mutes": "تۆ هێشتا هیچ بەکارهێنەرێکت بێدەنگ نەکردووە.",
+ "empty_column.notifications": "تۆ هێشتا هیچ ئاگانامێکت نیە. چالاکی لەگەڵ کەسانی دیکە بکە بۆ دەستپێکردنی گفتوگۆکە.",
+ "empty_column.public": "لێرە هیچ نییە! شتێک بە ئاشکرا بنووسە(بەگشتی)، یان بە دەستی شوێن بەکارهێنەران بکەوە لە ڕاژەکانی ترەوە بۆ پڕکردنەوەی",
+ "error.unexpected_crash.explanation": "بەهۆی بوونی کێشە لە کۆدەکەمان یان کێشەی گونجانی وێبگەڕەکە، ئەم لاپەڕەیە بە دروستی پیشان نادرێت.",
+ "error.unexpected_crash.explanation_addons": "ئەم لاپەڕەیە ناتوانرێت بە دروستی پیشان بدرێت. ئەم هەڵەیە لەوانەیە بەهۆی ئامێری وەرگێڕانی خۆکار یان زیادکراوی وێبگەڕەوە بێت.",
+ "error.unexpected_crash.next_steps": "هەوڵدە لاپەڕەکە تازە بکەوە. ئەگەر ئەمە یارمەتیدەر نەبوو، لەوانەیە هێشتا بتوانیت ماستۆدۆن بەکاربێنیت لە ڕێگەی وێبگەڕەکەیان کاربەرنامەی ڕەسەن.",
+ "error.unexpected_crash.next_steps_addons": "هەوڵدە لەکاریان بخەیت و لاپەڕەکە تازە بکەوە. ئەگەر ئەمە یارمەتیدەر نەبوو، لەوانەیە هێشتا بتوانیت ماستۆدۆن بەکاربێنیت لە ڕێگەی وێبگەڕەکانی دیکە یان نەرمەکالاکانی ئەسڵی.",
+ "errors.unexpected_crash.copy_stacktrace": "کۆپیکردنی ستێکتراسی بۆ کلیپ بۆرد",
+ "errors.unexpected_crash.report_issue": "کێشەی گوزارشت",
+ "explore.search_results": "Search results",
+ "explore.suggested_follows": "For you",
+ "explore.title": "Explore",
+ "explore.trending_links": "News",
+ "explore.trending_statuses": "Posts",
+ "explore.trending_tags": "Hashtags",
+ "follow_recommendations.done": "Done",
+ "follow_recommendations.heading": "Follow people you'd like to see posts from! Here are some suggestions.",
+ "follow_recommendations.lead": "Posts from people you follow will show up in chronological order on your home feed. Don't be afraid to make mistakes, you can unfollow people just as easily any time!",
+ "follow_request.authorize": "دهسهڵاتپێدراو",
+ "follow_request.reject": "ڕەتکردنەوە",
+ "follow_requests.unlocked_explanation": "هەرچەندە هەژمارەکەت داخراو نییە، ستافی {domain} وا بیریان کردەوە کە لەوانەیە بتانەوێت پێداچوونەوە بە داواکاریەکانی ئەم هەژمارەدا بکەن بە دەستی.",
+ "generic.saved": "پاشکەوتکرا",
+ "getting_started.developers": "پەرەپێدەران",
+ "getting_started.directory": "پەڕەی پرۆفایل",
+ "getting_started.documentation": "بەڵگەنامە",
+ "getting_started.heading": "دەست پێکردن",
+ "getting_started.invite": "بانگهێشتکردنی خەڵک",
+ "getting_started.open_source_notice": "ماستۆدۆن نەرمەکالایەکی سەرچاوەی کراوەیە. دەتوانیت بەشداری بکەیت یان گوزارشت بکەیت لەسەر کێشەکانی لە پەڕەی گیتهاب {github}.",
+ "getting_started.security": "ڕێکخستنەکانی هەژمارە",
+ "getting_started.terms": "مەرجەکانی خزمەتگوزاری",
+ "hashtag.column_header.tag_mode.all": "و {additional}",
+ "hashtag.column_header.tag_mode.any": "یا {additional}",
+ "hashtag.column_header.tag_mode.none": "بەبێ {additional}",
+ "hashtag.column_settings.select.no_options_message": "هیچ پێشنیارێک نەدۆزرایەوە",
+ "hashtag.column_settings.select.placeholder": "هاشتاگی تێبنووسە…",
+ "hashtag.column_settings.tag_mode.all": "هەموو ئەمانە",
+ "hashtag.column_settings.tag_mode.any": "هەر کام لەمانە",
+ "hashtag.column_settings.tag_mode.none": "هیچ کام لەمانە",
+ "hashtag.column_settings.tag_toggle": "تاگی زیادە ی ئەم ستوونە لەخۆ بنووسە",
+ "home.column_settings.basic": "بنەڕەتی",
+ "home.column_settings.show_reblogs": "پیشاندانی بەهێزکردن",
+ "home.column_settings.show_replies": "وەڵامدانەوەکان پیشان بدە",
+ "home.hide_announcements": "شاردنەوەی راگەیەنراوەکان",
+ "home.show_announcements": "پیشاندانی راگەیەنراوەکان",
+ "intervals.full.days": "{number, plural, one {# ڕۆژ} other {# ڕۆژەک}}",
+ "intervals.full.hours": "{number, plural, one {# کات} other {# کات}}",
+ "intervals.full.minutes": "{number, plural, one {# خولەک} other {# خولەک}}",
+ "keyboard_shortcuts.back": "بۆ گەڕانەوە",
+ "keyboard_shortcuts.blocked": "بۆ کردنەوەی لیستی بەکارهێنەرە بلۆککراوەکان",
+ "keyboard_shortcuts.boost": "بۆ بەهێزکردن",
+ "keyboard_shortcuts.column": "بۆ ئەوەی تیشک بخاتە سەر توتێک لە یەکێک لە ستوونەکان",
+ "keyboard_shortcuts.compose": "بۆ سەرنجدان بە نووسینی ناوچەی دەق",
+ "keyboard_shortcuts.description": "وهسف",
+ "keyboard_shortcuts.direct": "بۆ کردنەوەی ستوونی نامە ڕاستەوخۆکان",
+ "keyboard_shortcuts.down": "بۆ چوونە خوارەوە لە لیستەکەدا",
+ "keyboard_shortcuts.enter": "بۆ کردنەوەی توت",
+ "keyboard_shortcuts.favourite": "بۆ دڵخواز",
+ "keyboard_shortcuts.favourites": "بۆ کردنەوەی لیستی دڵخوازەکان",
+ "keyboard_shortcuts.federated": "بۆ کردنەوەی نووسراوەکانی هەمووشوێن",
+ "keyboard_shortcuts.heading": "قهدبڕەکانی تەختەکلیل",
+ "keyboard_shortcuts.home": "بۆ کردنەوەی هێڵی کاتی ماڵەوە",
+ "keyboard_shortcuts.hotkey": "هۆتکەی",
+ "keyboard_shortcuts.legend": "بۆ نیشاندانی ئەم نیشانە",
+ "keyboard_shortcuts.local": "بۆ کردنەوەی نووسراوەکانی خۆماڵی",
+ "keyboard_shortcuts.mention": "نۆ ناوبردن لە نووسەر",
+ "keyboard_shortcuts.muted": "بۆ کردنەوەی پێرستی بەکارهێنەرانی بێدەنگ",
+ "keyboard_shortcuts.my_profile": "بۆ کردنەوەی پرۆفایڵ",
+ "keyboard_shortcuts.notifications": "بۆ کردنەوەی ستوونی ئاگانامەکان",
+ "keyboard_shortcuts.open_media": "بۆ کردنەوەی میدیا",
+ "keyboard_shortcuts.pinned": "بۆ کردنەوەی لیستی توتەکانی چەسپێنراو",
+ "keyboard_shortcuts.profile": "بۆ کردنەوەی پرۆفایڵی نووسەر",
+ "keyboard_shortcuts.reply": "بۆ وەڵامدانەوە",
+ "keyboard_shortcuts.requests": "بۆ کردنەوەی لیستی داواکاریەکانی بەدوادا",
+ "keyboard_shortcuts.search": "بۆ جەختکردن لەسەر گەڕان",
+ "keyboard_shortcuts.spoilers": "بۆ پیشاندان/شاردنەوەی خانەی CW",
+ "keyboard_shortcuts.start": "بۆ کردنەوەی ستوونی \"دەست پێبکە\"",
+ "keyboard_shortcuts.toggle_hidden": "بۆ پیشاندان/شاردنەوەی دەق لە پشت CW",
+ "keyboard_shortcuts.toggle_sensitivity": "بۆ پیشاندان/شاردنەوەی میدیا",
+ "keyboard_shortcuts.toot": "بۆ دەست کردن بە براندێکی تازە",
+ "keyboard_shortcuts.unfocus": "بۆ دروستکردنی ناوچەی دەق/گەڕان",
+ "keyboard_shortcuts.up": "بۆ ئەوەی لە لیستەکەدا بڕۆیت",
+ "lightbox.close": "دابخە",
+ "lightbox.compress": "سندوقی نیشاندانی وێنە بپەستێنە",
+ "lightbox.expand": "فراوانکردنی سندوقی بینینی وێنە",
+ "lightbox.next": "داهاتوو",
+ "lightbox.previous": "پێشوو",
+ "lists.account.add": "زیادکردن بۆ لیست",
+ "lists.account.remove": "لابردن لە لیست",
+ "lists.delete": "سڕینەوەی لیست",
+ "lists.edit": "دەستکاری لیست",
+ "lists.edit.submit": "گۆڕینی ناونیشان",
+ "lists.new.create": "زیادکردنی لیست",
+ "lists.new.title_placeholder": "ناونیشانی لیستی نوێ",
+ "lists.replies_policy.followed": "Any followed user",
+ "lists.replies_policy.list": "Members of the list",
+ "lists.replies_policy.none": "No one",
+ "lists.replies_policy.title": "پیشاندانی وەڵامەکان بۆ:",
+ "lists.search": "بگەڕێ لەناو ئەو کەسانەی کە شوێنیان کەوتویت",
+ "lists.subheading": "لیستەکانت",
+ "load_pending": "{count, plural, one {# new item} other {# new items}}",
+ "loading_indicator.label": "بارکردن...",
+ "media_gallery.toggle_visible": "شاردنەوەی {number, plural, one {image} other {images}}",
+ "missing_indicator.label": "نەدۆزرایەوە",
+ "missing_indicator.sublabel": "ئەو سەرچاوەیە نادۆزرێتەوە",
+ "mute_modal.duration": "ماوە",
+ "mute_modal.hide_notifications": "شاردنەوەی ئاگانامەکان لەم بەکارهێنەرە؟ ",
+ "mute_modal.indefinite": "نادیار",
+ "navigation_bar.apps": "بەرنامەی مۆبایل",
+ "navigation_bar.blocks": "بەکارهێنەرە بلۆککراوەکان",
+ "navigation_bar.bookmarks": "نیشانکراوەکان",
+ "navigation_bar.community_timeline": "دەمنامەی ناوخۆیی",
+ "navigation_bar.compose": "نووسینی توتی نوێ",
+ "navigation_bar.direct": "نامە ڕاستەوخۆکان",
+ "navigation_bar.discover": "دۆزینەوە",
+ "navigation_bar.domain_blocks": "دۆمەینە بلۆک کراوەکان",
+ "navigation_bar.edit_profile": "دەستکاری پرۆفایل بکە",
+ "navigation_bar.explore": "Explore",
+ "navigation_bar.favourites": "دڵخوازەکان",
+ "navigation_bar.filters": "وشە کپەکان",
+ "navigation_bar.follow_requests": "بەدواداچوی داواکاریەکان بکە",
+ "navigation_bar.follows_and_followers": "شوێنکەوتوو و شوێنکەوتوان",
+ "navigation_bar.info": "دەربارەی ئەم ڕاژە",
+ "navigation_bar.keyboard_shortcuts": "هۆتکەی",
+ "navigation_bar.lists": "لیستەکان",
+ "navigation_bar.logout": "دەرچوون",
+ "navigation_bar.mutes": "کپکردنی بەکارهێنەران",
+ "navigation_bar.personal": "کەسی",
+ "navigation_bar.pins": "توتی چەسپاو",
+ "navigation_bar.preferences": "پەسەندەکان",
+ "navigation_bar.public_timeline": "نووسراوەکانی هەمووشوێنێک",
+ "navigation_bar.security": "ئاسایش",
+ "notification.admin.sign_up": "{name} signed up",
+ "notification.favourite": "{name} نووسراوەکەتی پەسەند کرد",
+ "notification.follow": "{name} دوای تۆ کەوت",
+ "notification.follow_request": "{name} داوای کردووە کە شوێنت بکەوێت",
+ "notification.mention": "{name} باسی ئێوەی کرد",
+ "notification.own_poll": "ڕاپرسیەکەت کۆتایی هات",
+ "notification.poll": "ڕاپرسییەک کە دەنگی پێداویت کۆتایی هات",
+ "notification.reblog": "{name} نووسراوەکەتی دووبارە توتاند",
+ "notification.status": "{name} تازە بڵاوکرایەوە",
+ "notification.update": "{name} edited a post",
+ "notifications.clear": "ئاگانامەکان بسڕیەوە",
+ "notifications.clear_confirmation": "ئایا دڵنیایت لەوەی دەتەوێت بە هەمیشەیی هەموو ئاگانامەکانت بسڕیتەوە?",
+ "notifications.column_settings.admin.sign_up": "New sign-ups:",
+ "notifications.column_settings.alert": "ئاگانامەکانی پیشانگەرر ڕومێزی",
+ "notifications.column_settings.favourite": "دڵخوازترین:",
+ "notifications.column_settings.filter_bar.advanced": "هەموو پۆلەکان پیشان بدە",
+ "notifications.column_settings.filter_bar.category": "شریتی پاڵێوەری خێرا",
+ "notifications.column_settings.filter_bar.show_bar": "Show filter bar",
+ "notifications.column_settings.follow": "شوێنکەوتوانی نوێ:",
+ "notifications.column_settings.follow_request": "شوینکەوتنی داواکاری نوێ:",
+ "notifications.column_settings.mention": "ئاماژەکان:",
+ "notifications.column_settings.poll": "ئەنجامەکانی ڕاپرسی:",
+ "notifications.column_settings.push": "ئاگانامەکان پاڵ بنێ",
+ "notifications.column_settings.reblog": "دووبارەتوتەکان:",
+ "notifications.column_settings.show": "لە ستووندا پیشان بدە",
+ "notifications.column_settings.sound": "لێدانی دەنگ",
+ "notifications.column_settings.status": "توتەکانی نوێ:",
+ "notifications.column_settings.unread_notifications.category": "Unread notifications",
+ "notifications.column_settings.unread_notifications.highlight": "Highlight unread notifications",
+ "notifications.column_settings.update": "Edits:",
+ "notifications.filter.all": "هەموو",
+ "notifications.filter.boosts": "دووبارەتوتەکان",
+ "notifications.filter.favourites": "دڵخوازەکان",
+ "notifications.filter.follows": "شوێنکەوتن",
+ "notifications.filter.mentions": "ئاماژەکان",
+ "notifications.filter.polls": "ئەنجامەکانی ڕاپرسی",
+ "notifications.filter.statuses": "نوێکردنەوەکان ئەو کەسانەی کە پەیڕەوی دەکەیت",
+ "notifications.grant_permission": "Grant permission.",
+ "notifications.group": "{count} ئاگانامە",
+ "notifications.mark_as_read": "هەموو ئاگانامەکان وەک خوێندراوەتەوە نیشان بکە",
+ "notifications.permission_denied": "ناتوانرێت ئاگانامەکانی دێسکتۆپ چالاک بکرێت وەک ڕێپێدان ڕەتکرایەوە.",
+ "notifications.permission_denied_alert": "ناتوانرێت ئاگانامەکانی دێسکتۆپ چالاک بکرێت، چونکە پێشتر مۆڵەتی وێبگەڕ ڕەتکرایەوە",
+ "notifications.permission_required": "Desktop notifications are unavailable because the required permission has not been granted.",
+ "notifications_permission_banner.enable": "چالاککردنی ئاگانامەکانی دێسکتۆپ",
+ "notifications_permission_banner.how_to_control": "بۆ وەرگرتنی ئاگانامەکان کاتێک ماستۆدۆن نەکراوەیە، ئاگانامەکانی دێسکتۆپ چالاک بکە. دەتوانیت بە وردی کۆنترۆڵی جۆری کارلێکەکان بکەیت کە ئاگانامەکانی دێسکتۆپ دروست دەکەن لە ڕێگەی دوگمەی {icon} لەسەرەوە کاتێک چالاک دەکرێن.",
+ "notifications_permission_banner.title": "هەرگیز شتێک لە دەست مەدە",
+ "picture_in_picture.restore": "بیگەڕێنەوە",
+ "poll.closed": "دابخە",
+ "poll.refresh": "نوێکردنەوە",
+ "poll.total_people": "{count, plural, one {# خەڵک} other {# خەڵک}}",
+ "poll.total_votes": "{count, plural, one {# دەنگ} other {# دەنگ}}\n",
+ "poll.vote": "دەنگ",
+ "poll.voted": "تۆ دەنگت بەو وەڵامە دا",
+ "poll.votes": "{votes, plural, one {# vote} other {# votes}}",
+ "poll_button.add_poll": "ڕاپرسییەک زیاد بکە",
+ "poll_button.remove_poll": "دهنگدان بسڕهوه",
+ "privacy.change": "ڕێکخستنی تایبەتمەندی توت",
+ "privacy.direct.long": "تەنیا بۆ بەکارهێنەرانی ناوبراو",
+ "privacy.direct.short": "ڕاستەوخۆ",
+ "privacy.private.long": "بینراو تەنها بۆ شوێنکەوتوان",
+ "privacy.private.short": "تەنها بۆ شوێنکەوتوان",
+ "privacy.public.long": "بۆ هەمووان دیاربێت، لە هێڵی کاتی گشتی دا نیشان دەدرێت",
+ "privacy.public.short": "گشتی",
+ "privacy.unlisted.long": "بۆ هەمووان دیارە، بەڵام لە هێڵی کاتی گشتیدا نا",
+ "privacy.unlisted.short": "لە لیست نەکراو",
+ "refresh": "نوێکردنەوە",
+ "regeneration_indicator.label": "بارکردن…",
+ "regeneration_indicator.sublabel": "ڕاگەیەنەری ماڵەوەت ئامادە دەکرێت!",
+ "relative_time.days": "{number}ڕۆژ",
+ "relative_time.full.days": "{number, plural, one {# day} other {# days}} ago",
+ "relative_time.full.hours": "{number, plural, one {# hour} other {# hours}} ago",
+ "relative_time.full.just_now": "just now",
+ "relative_time.full.minutes": "{number, plural, one {# minute} other {# minutes}} ago",
+ "relative_time.full.seconds": "{number, plural, one {# second} other {# seconds}} ago",
+ "relative_time.hours": "{number}کات",
+ "relative_time.just_now": "ئێستا",
+ "relative_time.minutes": "{number}کات",
+ "relative_time.seconds": "{number}کات",
+ "relative_time.today": "ئیمڕۆ",
+ "reply_indicator.cancel": "هەڵوەشاندنەوه",
+ "report.block": "Block",
+ "report.block_explanation": "You will not see their posts. They will not be able to see your posts or follow you. They will be able to tell that they are blocked.",
+ "report.categories.other": "Other",
+ "report.categories.spam": "Spam",
+ "report.categories.violation": "Content violates one or more server rules",
+ "report.category.subtitle": "Choose the best match",
+ "report.category.title": "Tell us what's going on with this {type}",
+ "report.category.title_account": "profile",
+ "report.category.title_status": "post",
+ "report.close": "Done",
+ "report.comment.title": "Is there anything else you think we should know?",
+ "report.forward": "ناردن بۆ {target}",
+ "report.forward_hint": "هەژمارەکە لە ڕاژەیەکی ترە. ڕونووسێکی نەناسراو بنێرە بۆ گوزارشت لەوێ?",
+ "report.mute": "Mute",
+ "report.mute_explanation": "You will not see their posts. They can still follow you and see your posts and will not know that they are muted.",
+ "report.next": "Next",
+ "report.placeholder": "سەرنجەکانی زیاتر",
+ "report.reasons.dislike": "I don't like it",
+ "report.reasons.dislike_description": "It is not something you want to see",
+ "report.reasons.other": "It's something else",
+ "report.reasons.other_description": "The issue does not fit into other categories",
+ "report.reasons.spam": "It's spam",
+ "report.reasons.spam_description": "Malicious links, fake engagement, or repetitive replies",
+ "report.reasons.violation": "It violates server rules",
+ "report.reasons.violation_description": "You are aware that it breaks specific rules",
+ "report.rules.subtitle": "Select all that apply",
+ "report.rules.title": "Which rules are being violated?",
+ "report.statuses.subtitle": "Select all that apply",
+ "report.statuses.title": "Are there any posts that back up this report?",
+ "report.submit": "ناردن",
+ "report.target": "گوزارشتکردنی{target}",
+ "report.thanks.take_action": "Here are your options for controlling what you see on Mastodon:",
+ "report.thanks.take_action_actionable": "While we review this, you can take action against @{name}:",
+ "report.thanks.title": "Don't want to see this?",
+ "report.thanks.title_actionable": "Thanks for reporting, we'll look into this.",
+ "report.unfollow": "Unfollow @{name}",
+ "report.unfollow_explanation": "You are following this account. To not see their posts in your home feed anymore, unfollow them.",
+ "search.placeholder": "گەڕان",
+ "search_popout.search_format": "شێوەی گەڕانی پێشکەوتوو",
+ "search_popout.tips.full_text": "گەڕانێکی دەقی سادە دەتوانێت توتەکانی ئێوە کە، نووسیوتانە،پەسەنتان کردووە، دووبارەتانکردووە، یان ئەو توتانە کە باسی ئێوەی تێدا کراوە پەیدا دەکا. هەروەها ناوی بەکارهێنەران، ناوی پیشاندراو و هەشتەگەکانیش لە خۆ دەگرێت.",
+ "search_popout.tips.hashtag": "هەشتاگ",
+ "search_popout.tips.status": "توت",
+ "search_popout.tips.text": "دەقی سادە هەڵدەسێ بە گەڕاندنەوەی هاوتایی ناوی پیشاندان، ناوی بەکارهێنەر و هاشتاگەکان",
+ "search_popout.tips.user": "بەکارهێنەر",
+ "search_results.accounts": "خەڵک",
+ "search_results.all": "All",
+ "search_results.hashtags": "هەشتاگ",
+ "search_results.nothing_found": "Could not find anything for these search terms",
+ "search_results.statuses": "توتەکان",
+ "search_results.statuses_fts_disabled": "گەڕانی توتەکان بە ناوەڕۆکیان لەسەر ئەم ڕاژەی ماستۆدۆن چالاک نەکراوە.",
+ "search_results.total": "{count, number} {count, plural, one {دەرئەنجام} other {دەرئەنجام}}",
+ "status.admin_account": "کردنەوەی میانڕەوی بەڕێوەبەر بۆ @{name}",
+ "status.admin_status": "ئەم توتە بکەوە لە ناو ڕووکاری بەڕیوەبەر",
+ "status.block": "بلۆکی @{name}",
+ "status.bookmark": "نیشانه",
+ "status.cancel_reblog_private": "بێبەهێزکردن",
+ "status.cannot_reblog": "ئەم بابەتە ناتوانرێت بەرزبکرێتەوە",
+ "status.copy": "ڕوونووسی بەستەر بۆ توت",
+ "status.delete": "سڕینەوە",
+ "status.detailed_status": "ڕوانگەی گفتوگۆ بە وردەکاری",
+ "status.direct": "پەیامی ڕاستەوخۆ @{name}",
+ "status.edit": "Edit",
+ "status.edited": "Edited {date}",
+ "status.edited_x_times": "Edited {count, plural, one {{count} time} other {{count} times}}",
+ "status.embed": "نیشتەجێ بکە",
+ "status.favourite": "دڵخواز",
+ "status.filtered": "پاڵاوتن",
+ "status.history.created": "{name} created {date}",
+ "status.history.edited": "{name} edited {date}",
+ "status.load_more": "بارکردنی زیاتر",
+ "status.media_hidden": "میدیای شاراوە",
+ "status.mention": "ناوبنێ @{name}",
+ "status.more": "زیاتر",
+ "status.mute": "بێدەنگکردن @{name}",
+ "status.mute_conversation": "گفتوگۆی بێدەنگ",
+ "status.open": "ئەم توتە فراوان بکە",
+ "status.pin": "لکاندن لەسەر پرۆفایل",
+ "status.pinned": "توتی چەسپکراو",
+ "status.read_more": "زیاتر بخوێنەوە",
+ "status.reblog": "بەهێزکردن",
+ "status.reblog_private": "بەهێزکردن بۆ بینەرانی سەرەتایی",
+ "status.reblogged_by": "{name} توتی کردەوە",
+ "status.reblogs.empty": "کەس ئەم توتەی دووبارە نەتوتاندوە ،کاتێک کەسێک وا بکات، لێرە دەرئەکەون.",
+ "status.redraft": "سڕینەوەی و دووبارە ڕەشنووس",
+ "status.remove_bookmark": "لابردنی نیشانه",
+ "status.reply": "وەڵام",
+ "status.replyAll": "بە نووسراوە وەڵام بدەوە",
+ "status.report": "گوزارشت @{name}",
+ "status.sensitive_warning": "ناوەڕۆکی هەستیار",
+ "status.share": "هاوبەش کردن",
+ "status.show_less": "کەمتر نیشان بدە",
+ "status.show_less_all": "کەمتر نیشان بدە بۆ هەمووی",
+ "status.show_more": "زیاتر پیشان بدە",
+ "status.show_more_all": "زیاتر نیشان بدە بۆ هەمووی",
+ "status.show_thread": "نیشاندانی گفتوگۆ",
+ "status.uncached_media_warning": "بەردەست نیە",
+ "status.unmute_conversation": "گفتوگۆی بێدەنگ",
+ "status.unpin": "لابردن لە پرۆفایل",
+ "suggestions.dismiss": "ڕەتکردنەوەی پێشنیار",
+ "suggestions.header": "لەوانەیە حەزت لەمەش بێت…",
+ "tabs_bar.federated_timeline": "گشتی",
+ "tabs_bar.home": "سەرەتا",
+ "tabs_bar.local_timeline": "ناوخۆیی",
+ "tabs_bar.notifications": "ئاگادارییەکان",
+ "tabs_bar.search": "گەڕان",
+ "time_remaining.days": "{number, plural, one {# ڕۆژ} other {# ڕۆژ}} ماوە",
+ "time_remaining.hours": "{number, plural, one {# کات} other {# کات}} ماوە",
+ "time_remaining.minutes": "{number, plural, one {# خۆلەک} other {# خولەک}} ماوە",
+ "time_remaining.moments": "ئەو ساتانەی ماونەتەوە",
+ "time_remaining.seconds": "{number, plural, one {# چرکە} other {# چرکە}} ماوە",
+ "timeline_hint.remote_resource_not_displayed": "{resource} لە ڕاژەکانی ترەوە پیشان نادرێت.",
+ "timeline_hint.resources.followers": "شوێنکەوتووان",
+ "timeline_hint.resources.follows": "شوێنکەوتن",
+ "timeline_hint.resources.statuses": "توتی کۆن",
+ "trends.counter_by_accounts": "{count, plural, one {{counter} کەس} other {{counter} کەس}} گفتوگۆ دەکا",
+ "trends.trending_now": "گۆگران",
+ "ui.beforeunload": "ڕەشنووسەکەت لە دەست دەچێت ئەگەر لە ماستۆدۆن بڕۆیت.",
+ "units.short.billion": "{count}ملیار",
+ "units.short.million": "{count}ملیۆن",
+ "units.short.thousand": "{count}هەزار",
+ "upload_area.title": "ڕاکێشان & دانان بۆ بارکردن",
+ "upload_button.label": "زیادکردنی وێنەکان، ڤیدیۆیەک یان فایلێکی دەنگی",
+ "upload_error.limit": "سنووری بارکردنی فایل تێپەڕیوە.",
+ "upload_error.poll": "پەڕگەکە ڕێی پێنەدراوە بە ڕاپرسی باربکرێت.",
+ "upload_form.audio_description": "بۆ ئەو کەسانەی کە گوێ بیستیان هەیە وەسف دەکات",
+ "upload_form.description": "وەسف بکە بۆ کەمبینایان",
+ "upload_form.edit": "دەستکاری",
+ "upload_form.thumbnail": "گۆڕانی وینۆچکە",
+ "upload_form.undo": "سڕینەوە",
+ "upload_form.video_description": "بۆ کەم بینایان و کەم بیستان وەسفی بکە",
+ "upload_modal.analyzing_picture": "شیکردنەوەی وێنە…",
+ "upload_modal.apply": "جێبەجێ کردن",
+ "upload_modal.applying": "Applying…",
+ "upload_modal.choose_image": "وێنە هەڵبژێرە",
+ "upload_modal.description_placeholder": "بە دڵ کەین با بە نەشئەی مەی غوباری میحنەتی دونیا",
+ "upload_modal.detect_text": "دەقی وێنەکە بدۆزیەوە",
+ "upload_modal.edit_media": "دەستکاریکردنی میدیا",
+ "upload_modal.hint": "گەر وێنە چکۆلە یان بڕاوەبێت، خاڵی ناوەندی دیار دەکەوێت. خاڵی ناوەندی وێنە بە کرتە یان جێبەجیکردنی رێکبخەن.",
+ "upload_modal.preparing_ocr": "ئامادەکردنی OCR…",
+ "upload_modal.preview_label": "پێشبینی ({ratio})",
+ "upload_progress.label": "بارکردن...",
+ "video.close": "داخستنی ڤیدیۆ",
+ "video.download": "داگرتنی فایل",
+ "video.exit_fullscreen": "دەرچوون لە پڕ شاشە",
+ "video.expand": "ڤیدیۆفراوان بکە",
+ "video.fullscreen": "پڕپیشانگەر",
+ "video.hide": "شاردنەوەی ڤیدیۆ",
+ "video.mute": "دەنگی کپ",
+ "video.pause": "وەستان",
+ "video.play": "پەخشکردن",
+ "video.unmute": "دەنگ لابدە"
+}
diff --git a/app/javascript/mastodon/locales/co.json b/app/javascript/mastodon/locales/co.json
index b8ac9281d..21240bc3b 100644
--- a/app/javascript/mastodon/locales/co.json
+++ b/app/javascript/mastodon/locales/co.json
@@ -18,12 +18,12 @@
"account.followers": "Abbunati",
"account.followers.empty": "Nisunu hè abbunatu à st'utilizatore.",
"account.followers_counter": "{count, plural, one {{counter} Abbunatu} other {{counter} Abbunati}}",
+ "account.following": "Following",
"account.following_counter": "{count, plural, one {{counter} Abbunamentu} other {{counter} Abbunamenti}}",
"account.follows.empty": "St'utilizatore ùn seguita nisunu.",
"account.follows_you": "Vi seguita",
"account.hide_reblogs": "Piattà spartere da @{name}",
"account.joined": "Quì dapoi {date}",
- "account.last_status": "Ultima attività",
"account.link_verified_on": "A prupietà di stu ligame hè stata verificata u {date}",
"account.locked_info": "U statutu di vita privata di u contu hè chjosu. U pruprietariu esamina manualmente e dumande d'abbunamentu.",
"account.media": "Media",
@@ -32,7 +32,6 @@
"account.mute": "Piattà @{name}",
"account.mute_notifications": "Piattà nutificazione da @{name}",
"account.muted": "Piattatu",
- "account.never_active": "Mai",
"account.posts": "Statuti",
"account.posts_with_replies": "Statuti è risposte",
"account.report": "Palisà @{name}",
@@ -42,12 +41,15 @@
"account.statuses_counter": "{count, plural, one {{counter} Statutu} other {{counter} Statuti}}",
"account.unblock": "Sbluccà @{name}",
"account.unblock_domain": "Ùn piattà più {domain}",
+ "account.unblock_short": "Unblock",
"account.unendorse": "Ùn fà figurà nant'à u prufilu",
"account.unfollow": "Ùn siguità più",
"account.unmute": "Ùn piattà più @{name}",
"account.unmute_notifications": "Ùn piattà più nutificazione da @{name}",
+ "account.unmute_short": "Unmute",
"account_note.placeholder": "Senza cummentariu",
- "admin.dashboard.retention": "Retention",
+ "admin.dashboard.daily_retention": "User retention rate by day after sign-up",
+ "admin.dashboard.monthly_retention": "User retention rate by month after sign-up",
"admin.dashboard.retention.average": "Average",
"admin.dashboard.retention.cohort": "Sign-up month",
"admin.dashboard.retention.cohort_size": "New users",
@@ -56,7 +58,7 @@
"alert.unexpected.message": "Un prublemu inaspettatu hè accadutu.",
"alert.unexpected.title": "Uups!",
"announcement.announcement": "Annunziu",
- "attachments_list.unprocessed": "(unprocessed)",
+ "attachments_list.unprocessed": "(micca trattata)",
"autosuggest_hashtag.per_week": "{count} per settimana",
"boost_modal.combo": "Pudete appughjà nant'à {combo} per saltà quessa a prussima volta",
"bundle_column_error.body": "C'hè statu un prublemu caricandu st'elementu.",
@@ -104,6 +106,7 @@
"compose_form.poll.switch_to_single": "Cambià u scandagliu per ùn accittà ch'una scelta",
"compose_form.publish": "Toot",
"compose_form.publish_loud": "{publish}!",
+ "compose_form.save_changes": "Save changes",
"compose_form.sensitive.hide": "{count, plural, one {Indicà u media cum'è sensibile} other {Indicà i media cum'è sensibili}}",
"compose_form.sensitive.marked": "{count, plural, one {Media indicatu cum'è sensibile} other {Media indicati cum'è sensibili}}",
"compose_form.sensitive.unmarked": "{count, plural, one {Media micca indicatu cum'è sensibile} other {Media micca indicati cum'è sensibili}}",
@@ -118,7 +121,7 @@
"confirmations.delete.message": "Site sicuru·a che vulete sguassà stu statutu?",
"confirmations.delete_list.confirm": "Toglie",
"confirmations.delete_list.message": "Site sicuru·a che vulete toglie sta lista?",
- "confirmations.discard_edit_media.confirm": "Discard",
+ "confirmations.discard_edit_media.confirm": "Scartà",
"confirmations.discard_edit_media.message": "You have unsaved changes to the media description or preview, discard them anyway?",
"confirmations.domain_block.confirm": "Piattà tuttu u duminiu",
"confirmations.domain_block.message": "Site veramente sicuru·a che vulete piattà tuttu à {domain}? Saria forse abbastanza di bluccà ò piattà alcuni conti da quallà. Ùn viderete più nunda da quallà indè e linee pubbliche o e nutificazione. I vostri abbunati da stu duminiu saranu tolti.",
@@ -165,6 +168,7 @@
"empty_column.community": "Ùn c'hè nunda indè a linea lucale. Scrivete puru qualcosa!",
"empty_column.direct": "Ùn avete ancu nisun missaghju direttu. S'è voi mandate o ricevete unu, u vidarete quì.",
"empty_column.domain_blocks": "Ùn c'hè manc'un duminiu bluccatu avà.",
+ "empty_column.explore_statuses": "Nothing is trending right now. Check back later!",
"empty_column.favourited_statuses": "Ùn avete manc'unu statutu favuritu. Quandu aghjunghjerate unu à i vostri favuriti, sarà mustratu quì.",
"empty_column.favourites": "Nisunu hà aghjuntu stu statutu à i so favuriti. Quandu qualch'unu farà quessa, u so contu sarà mustratu quì.",
"empty_column.follow_recommendations": "Si pare ch'ùn s'hè micca pussutu generà e ricumandazione per voi. Pudete sempre pruvà d'utilizà a ricerca per truvà ghjente chì cunnuscete, o splurà l'hashtag in tindenza.",
@@ -183,6 +187,12 @@
"error.unexpected_crash.next_steps_addons": "Pruvate di disattivà quelli è poi attualizà sta pagina. S'ellu persiste u prublemu, pudete forse sempre accede à Mastodon dapoi un'alltru navigatore o applicazione.",
"errors.unexpected_crash.copy_stacktrace": "Cupià stacktrace nant'à u fermacarta",
"errors.unexpected_crash.report_issue": "Palisà prublemu",
+ "explore.search_results": "Search results",
+ "explore.suggested_follows": "For you",
+ "explore.title": "Explore",
+ "explore.trending_links": "News",
+ "explore.trending_statuses": "Posts",
+ "explore.trending_tags": "Hashtags",
"follow_recommendations.done": "Fatta",
"follow_recommendations.heading": "Siguitate a ghjente da quelli vulete vede i missaghji! Eccu qualchì ricumandazione.",
"follow_recommendations.lead": "I missaghji da a ghjente che voi siguitate figureranu in ordine crunulogicu nant'a vostra pagina d'accolta. Ùn timite micca di fà un sbagliu, pudete sempre disabbunavvi d'un contu à ogni mumentu!",
@@ -284,6 +294,7 @@
"navigation_bar.discover": "Scopre",
"navigation_bar.domain_blocks": "Duminii piattati",
"navigation_bar.edit_profile": "Mudificà u prufile",
+ "navigation_bar.explore": "Explore",
"navigation_bar.favourites": "Favuriti",
"navigation_bar.filters": "Parolle silenzate",
"navigation_bar.follow_requests": "Dumande d'abbunamentu",
@@ -298,6 +309,7 @@
"navigation_bar.preferences": "Preferenze",
"navigation_bar.public_timeline": "Linea pubblica glubale",
"navigation_bar.security": "Sicurità",
+ "notification.admin.sign_up": "{name} signed up",
"notification.favourite": "{name} hà aghjuntu u vostru statutu à i so favuriti",
"notification.follow": "{name} v'hà seguitatu",
"notification.follow_request": "{name} vole abbunassi à u vostru contu",
@@ -306,13 +318,15 @@
"notification.poll": "Un scandagliu induve avete vutatu hè finitu",
"notification.reblog": "{name} hà spartutu u vostru statutu",
"notification.status": "{name} hà appena pubblicatu",
+ "notification.update": "{name} edited a post",
"notifications.clear": "Purgà e nutificazione",
"notifications.clear_confirmation": "Site sicuru·a che vulete toglie tutte ste nutificazione?",
+ "notifications.column_settings.admin.sign_up": "New sign-ups:",
"notifications.column_settings.alert": "Nutificazione nant'à l'urdinatore",
"notifications.column_settings.favourite": "Favuriti:",
"notifications.column_settings.filter_bar.advanced": "Affissà tutte e categurie",
"notifications.column_settings.filter_bar.category": "Barra di ricerca pronta",
- "notifications.column_settings.filter_bar.show": "Mustrà",
+ "notifications.column_settings.filter_bar.show_bar": "Show filter bar",
"notifications.column_settings.follow": "Abbunati novi:",
"notifications.column_settings.follow_request": "Nove dumande d'abbunamentu:",
"notifications.column_settings.mention": "Minzione:",
@@ -322,7 +336,9 @@
"notifications.column_settings.show": "Mustrà indè a colonna",
"notifications.column_settings.sound": "Sunà",
"notifications.column_settings.status": "Statuti novi:",
- "notifications.column_settings.unread_markers.category": "Marcatori di nutificazione micca lette",
+ "notifications.column_settings.unread_notifications.category": "Unread notifications",
+ "notifications.column_settings.unread_notifications.highlight": "Highlight unread notifications",
+ "notifications.column_settings.update": "Edits:",
"notifications.filter.all": "Tuttu",
"notifications.filter.boosts": "Spartere",
"notifications.filter.favourites": "Favuriti",
@@ -346,7 +362,7 @@
"poll.total_votes": "{count, plural, one {# votu} other {# voti}}",
"poll.vote": "Vutà",
"poll.voted": "Avete vutatu per sta risposta",
- "poll.votes": "{votes, plural, one {# vote} other {# votes}}",
+ "poll.votes": "{votes, plural, one {# votu} other {# voti}}",
"poll_button.add_poll": "Aghjunghje",
"poll_button.remove_poll": "Toglie u scandagliu",
"privacy.change": "Mudificà a cunfidenzialità di u statutu",
@@ -362,18 +378,54 @@
"regeneration_indicator.label": "Caricamentu…",
"regeneration_indicator.sublabel": "Priparazione di a vostra pagina d'accolta!",
"relative_time.days": "{number}ghj",
+ "relative_time.full.days": "{number, plural, one {# day} other {# days}} ago",
+ "relative_time.full.hours": "{number, plural, one {# hour} other {# hours}} ago",
+ "relative_time.full.just_now": "just now",
+ "relative_time.full.minutes": "{number, plural, one {# minute} other {# minutes}} ago",
+ "relative_time.full.seconds": "{number, plural, one {# second} other {# seconds}} ago",
"relative_time.hours": "{number}o",
"relative_time.just_now": "avà",
"relative_time.minutes": "{number}m",
"relative_time.seconds": "{number}s",
"relative_time.today": "oghji",
"reply_indicator.cancel": "Annullà",
+ "report.block": "Block",
+ "report.block_explanation": "You will not see their posts. They will not be able to see your posts or follow you. They will be able to tell that they are blocked.",
+ "report.categories.other": "Other",
+ "report.categories.spam": "Spam",
+ "report.categories.violation": "Content violates one or more server rules",
+ "report.category.subtitle": "Choose the best match",
+ "report.category.title": "Tell us what's going on with this {type}",
+ "report.category.title_account": "profile",
+ "report.category.title_status": "post",
+ "report.close": "Done",
+ "report.comment.title": "Is there anything else you think we should know?",
"report.forward": "Trasferisce à {target}",
"report.forward_hint": "U contu hè nant'à un'altru servore. Vulete ancu mandà una copia anonima di u signalamentu quallà?",
- "report.hint": "U signalamentu sarà mandatu à i muderatori di u servore. Pudete spiegà perchè avete palisatu stu contu quì sottu:",
+ "report.mute": "Mute",
+ "report.mute_explanation": "You will not see their posts. They can still follow you and see your posts and will not know that they are muted.",
+ "report.next": "Next",
"report.placeholder": "Altri cummenti",
+ "report.reasons.dislike": "I don't like it",
+ "report.reasons.dislike_description": "It is not something you want to see",
+ "report.reasons.other": "It's something else",
+ "report.reasons.other_description": "The issue does not fit into other categories",
+ "report.reasons.spam": "It's spam",
+ "report.reasons.spam_description": "Malicious links, fake engagement, or repetitive replies",
+ "report.reasons.violation": "It violates server rules",
+ "report.reasons.violation_description": "You are aware that it breaks specific rules",
+ "report.rules.subtitle": "Select all that apply",
+ "report.rules.title": "Which rules are being violated?",
+ "report.statuses.subtitle": "Select all that apply",
+ "report.statuses.title": "Are there any posts that back up this report?",
"report.submit": "Mandà",
"report.target": "Signalamentu di {target}",
+ "report.thanks.take_action": "Here are your options for controlling what you see on Mastodon:",
+ "report.thanks.take_action_actionable": "While we review this, you can take action against @{name}:",
+ "report.thanks.title": "Don't want to see this?",
+ "report.thanks.title_actionable": "Thanks for reporting, we'll look into this.",
+ "report.unfollow": "Unfollow @{name}",
+ "report.unfollow_explanation": "You are following this account. To not see their posts in your home feed anymore, unfollow them.",
"search.placeholder": "Circà",
"search_popout.search_format": "Ricerca avanzata",
"search_popout.tips.full_text": "I testi simplici rimandanu i statuti ch'avete scritti, aghjunti à i vostri favuriti, spartuti o induve quelli site mintuvatu·a, è ancu i cugnomi, nomi pubblichi è hashtag chì currispondenu.",
@@ -382,7 +434,9 @@
"search_popout.tips.text": "Un testu simplice rimanda i nomi pubblichi, cugnomi è hashtag",
"search_popout.tips.user": "utilizatore",
"search_results.accounts": "Ghjente",
+ "search_results.all": "All",
"search_results.hashtags": "Hashtag",
+ "search_results.nothing_found": "Could not find anything for these search terms",
"search_results.statuses": "Statuti",
"search_results.statuses_fts_disabled": "A ricerca di i cuntinuti di i statuti ùn hè micca attivata nant'à stu servore Mastodon.",
"search_results.total": "{count, number} {count, plural, one {risultatu} other {risultati}}",
@@ -396,9 +450,14 @@
"status.delete": "Toglie",
"status.detailed_status": "Vista in ditagliu di a cunversazione",
"status.direct": "Mandà un missaghju @{name}",
+ "status.edit": "Edit",
+ "status.edited": "Edited {date}",
+ "status.edited_x_times": "Edited {count, plural, one {{count} time} other {{count} times}}",
"status.embed": "Integrà",
"status.favourite": "Aghjunghje à i favuriti",
"status.filtered": "Filtratu",
+ "status.history.created": "{name} created {date}",
+ "status.history.edited": "{name} edited {date}",
"status.load_more": "Vede di più",
"status.media_hidden": "Media piattata",
"status.mention": "Mintuvà @{name}",
@@ -462,7 +521,7 @@
"upload_form.video_description": "Discrizzione per i ciochi o cechi",
"upload_modal.analyzing_picture": "Analisi di u ritrattu…",
"upload_modal.apply": "Affettà",
- "upload_modal.applying": "Applying…",
+ "upload_modal.applying": "Appiegazione…",
"upload_modal.choose_image": "Cambià ritrattu",
"upload_modal.description_placeholder": "Chì tempi brevi ziu, quandu solfeghji",
"upload_modal.detect_text": "Ditettà testu da u ritrattu",
diff --git a/app/javascript/mastodon/locales/cs.json b/app/javascript/mastodon/locales/cs.json
index 636fbd4ea..d48780042 100644
--- a/app/javascript/mastodon/locales/cs.json
+++ b/app/javascript/mastodon/locales/cs.json
@@ -12,18 +12,18 @@
"account.disable_notifications": "Zrušit upozorňování na příspěvky @{name}",
"account.domain_blocked": "Doména blokována",
"account.edit_profile": "Upravit profil",
- "account.enable_notifications": "Oznámit mě na příspěvky @{name}",
+ "account.enable_notifications": "Oznamovat mi příspěvky @{name}",
"account.endorse": "Zvýraznit na profilu",
"account.follow": "Sledovat",
"account.followers": "Sledující",
"account.followers.empty": "Tohoto uživatele ještě nikdo nesleduje.",
"account.followers_counter": "{count, plural, one {{counter} Sledující} few {{counter} Sledující} many {{counter} Sledujících} other {{counter} Sledujících}}",
+ "account.following": "Following",
"account.following_counter": "{count, plural, one {{counter} Sledovaný} few {{counter} Sledovaní} many {{counter} Sledovaných} other {{counter} Sledovaných}}",
"account.follows.empty": "Tento uživatel ještě nikoho nesleduje.",
"account.follows_you": "Sleduje vás",
"account.hide_reblogs": "Skrýt boosty od @{name}",
"account.joined": "Založen {date}",
- "account.last_status": "Naposledy aktivní",
"account.link_verified_on": "Vlastnictví tohoto odkazu bylo zkontrolováno {date}",
"account.locked_info": "Stav soukromí tohoto účtu je nastaven na zamčeno. Jeho vlastník ručně posuzuje, kdo ho může sledovat.",
"account.media": "Média",
@@ -32,7 +32,6 @@
"account.mute": "Skrýt @{name}",
"account.mute_notifications": "Skrýt oznámení od @{name}",
"account.muted": "Skryt",
- "account.never_active": "Nikdy",
"account.posts": "Příspěvky",
"account.posts_with_replies": "Příspěvky a odpovědi",
"account.report": "Nahlásit @{name}",
@@ -42,21 +41,24 @@
"account.statuses_counter": "{count, plural, one {{counter} Příspěvek} few {{counter} Příspěvky} many {{counter} Příspěvků} other {{counter} Příspěvků}}",
"account.unblock": "Odblokovat @{name}",
"account.unblock_domain": "Odblokovat doménu {domain}",
+ "account.unblock_short": "Unblock",
"account.unendorse": "Nezvýrazňovat na profilu",
"account.unfollow": "Přestat sledovat",
"account.unmute": "Zrušit skrytí @{name}",
"account.unmute_notifications": "Zrušit skrytí oznámení od @{name}",
+ "account.unmute_short": "Unmute",
"account_note.placeholder": "Klikněte pro přidání poznámky",
- "admin.dashboard.retention": "Retention",
- "admin.dashboard.retention.average": "Average",
- "admin.dashboard.retention.cohort": "Sign-up month",
- "admin.dashboard.retention.cohort_size": "New users",
+ "admin.dashboard.daily_retention": "User retention rate by day after sign-up",
+ "admin.dashboard.monthly_retention": "User retention rate by month after sign-up",
+ "admin.dashboard.retention.average": "Průměr",
+ "admin.dashboard.retention.cohort": "Měsíc registrace",
+ "admin.dashboard.retention.cohort_size": "Noví uživatelé",
"alert.rate_limited.message": "Zkuste to prosím znovu za {retry_time, time, medium}.",
"alert.rate_limited.title": "Spojení omezena",
"alert.unexpected.message": "Objevila se neočekávaná chyba.",
"alert.unexpected.title": "Jejda!",
"announcement.announcement": "Oznámení",
- "attachments_list.unprocessed": "(unprocessed)",
+ "attachments_list.unprocessed": "(nezpracováno)",
"autosuggest_hashtag.per_week": "{count} za týden",
"boost_modal.combo": "Příště můžete pro přeskočení stisknout {combo}",
"bundle_column_error.body": "Při načítání této komponenty se něco pokazilo.",
@@ -104,6 +106,7 @@
"compose_form.poll.switch_to_single": "Povolit u ankety výběr jediné možnosti",
"compose_form.publish": "Odeslat",
"compose_form.publish_loud": "{publish}!",
+ "compose_form.save_changes": "Save changes",
"compose_form.sensitive.hide": "{count, plural, one {Označit média za citlivá} few {Označit média za citlivá} many {Označit média za citlivá} other {Označit média za citlivá}}",
"compose_form.sensitive.marked": "{count, plural, one {Média jsou označena za citlivá} few {Média jsou označena za citlivá} many {Média jsou označena za citlivá} other {Média jsou označena za citlivá}}",
"compose_form.sensitive.unmarked": "{count, plural, one {Média nejsou označena za citlivá} few {Média nejsou označena za citlivá} many {Média nejsou označena za citlivá} other {Média nejsou označena za citlivá}}",
@@ -118,8 +121,8 @@
"confirmations.delete.message": "Opravdu chcete smazat tento příspěvek?",
"confirmations.delete_list.confirm": "Smazat",
"confirmations.delete_list.message": "Opravdu chcete tento seznam navždy smazat?",
- "confirmations.discard_edit_media.confirm": "Discard",
- "confirmations.discard_edit_media.message": "You have unsaved changes to the media description or preview, discard them anyway?",
+ "confirmations.discard_edit_media.confirm": "Zahodit",
+ "confirmations.discard_edit_media.message": "Máte neuložené změny popisku médií nebo náhledu, přesto je zahodit?",
"confirmations.domain_block.confirm": "Blokovat celou doménu",
"confirmations.domain_block.message": "Opravdu chcete blokovat celou doménu {domain}? Ve většině případů stačí zablokovat nebo skrýt pár konkrétních uživatelů, což také doporučujeme. Z této domény neuvidíte obsah v žádné veřejné časové ose ani v oznámeních. Vaši sledující z této domény budou odstraněni.",
"confirmations.logout.confirm": "Odhlásit",
@@ -165,6 +168,7 @@
"empty_column.community": "Místní časová osa je prázdná. Napište něco veřejně a rozhýbejte to tu!",
"empty_column.direct": "Ještě nemáte žádné přímé zprávy. Pokud nějakou pošlete nebo dostanete, zobrazí se zde.",
"empty_column.domain_blocks": "Ještě nemáte žádné blokované domény.",
+ "empty_column.explore_statuses": "Nothing is trending right now. Check back later!",
"empty_column.favourited_statuses": "Ještě nemáte žádné oblíbené příspěvky. Pokud si nějaký oblíbíte, zobrazí se zde.",
"empty_column.favourites": "Tento příspěvek si ještě nikdo neoblíbil. Pokud to někdo udělá, zobrazí se zde.",
"empty_column.follow_recommendations": "Zdá se, že pro vás nelze vygenerovat žádné návrhy. Můžete zkusit přes vyhledávání naleznout lidi, které znáte, nebo prozkoumat populární hashtagy.",
@@ -183,6 +187,12 @@
"error.unexpected_crash.next_steps_addons": "Zkuste je vypnout a stránku obnovit. Pokud to nepomůže, zkuste otevřít Mastodon v jiném prohlížeči nebo nativní aplikaci.",
"errors.unexpected_crash.copy_stacktrace": "Zkopírovat stacktrace do schránky",
"errors.unexpected_crash.report_issue": "Nahlásit problém",
+ "explore.search_results": "Search results",
+ "explore.suggested_follows": "For you",
+ "explore.title": "Explore",
+ "explore.trending_links": "News",
+ "explore.trending_statuses": "Posts",
+ "explore.trending_tags": "Hashtags",
"follow_recommendations.done": "Hotovo",
"follow_recommendations.heading": "Sledujte lidi, jejichž příspěvky chcete vidět! Tady jsou nějaké návrhy.",
"follow_recommendations.lead": "Příspěvky od lidí, které sledujete, se budou objevovat v chronologickém pořadí ve vaší domovské ose. Nebojte se, že uděláte chybu, můžete lidi stejně snadno kdykoliv přestat sledovat!",
@@ -284,6 +294,7 @@
"navigation_bar.discover": "Objevujte",
"navigation_bar.domain_blocks": "Blokované domény",
"navigation_bar.edit_profile": "Upravit profil",
+ "navigation_bar.explore": "Explore",
"navigation_bar.favourites": "Oblíbené",
"navigation_bar.filters": "Skrytá slova",
"navigation_bar.follow_requests": "Žádosti o sledování",
@@ -298,6 +309,7 @@
"navigation_bar.preferences": "Předvolby",
"navigation_bar.public_timeline": "Federovaná časová osa",
"navigation_bar.security": "Zabezpečení",
+ "notification.admin.sign_up": "{name} signed up",
"notification.favourite": "Uživatel {name} si oblíbil váš příspěvek",
"notification.follow": "Uživatel {name} vás začal sledovat",
"notification.follow_request": "Uživatel {name} požádal o povolení vás sledovat",
@@ -306,13 +318,15 @@
"notification.poll": "Anketa, ve které jste hlasovali, skončila",
"notification.reblog": "Uživatel {name} boostnul váš příspěvek",
"notification.status": "Nový příspěvek od {name}",
+ "notification.update": "{name} edited a post",
"notifications.clear": "Smazat oznámení",
"notifications.clear_confirmation": "Opravdu chcete trvale smazat všechna vaše oznámení?",
+ "notifications.column_settings.admin.sign_up": "New sign-ups:",
"notifications.column_settings.alert": "Oznámení na počítači",
"notifications.column_settings.favourite": "Oblíbení:",
"notifications.column_settings.filter_bar.advanced": "Zobrazit všechny kategorie",
"notifications.column_settings.filter_bar.category": "Panel rychlého filtrování",
- "notifications.column_settings.filter_bar.show": "Zobrazit",
+ "notifications.column_settings.filter_bar.show_bar": "Zobrazit panel filtrů",
"notifications.column_settings.follow": "Noví sledující:",
"notifications.column_settings.follow_request": "Nové žádosti o sledování:",
"notifications.column_settings.mention": "Zmínky:",
@@ -322,7 +336,9 @@
"notifications.column_settings.show": "Zobrazit ve sloupci",
"notifications.column_settings.sound": "Přehrát zvuk",
"notifications.column_settings.status": "Nové příspěvky:",
- "notifications.column_settings.unread_markers.category": "Značky nepřečtených oznámení",
+ "notifications.column_settings.unread_notifications.category": "Nepřečtená oznámení",
+ "notifications.column_settings.unread_notifications.highlight": "Zvýraznit nepřečtená oznámení",
+ "notifications.column_settings.update": "Edits:",
"notifications.filter.all": "Vše",
"notifications.filter.boosts": "Boosty",
"notifications.filter.favourites": "Oblíbení",
@@ -346,7 +362,7 @@
"poll.total_votes": "{count, plural, one {# hlas} few {# hlasy} many {# hlasů} other {# hlasů}}",
"poll.vote": "Hlasovat",
"poll.voted": "Pro tuto odpověď jste hlasovali",
- "poll.votes": "{votes, plural, one {# vote} other {# votes}}",
+ "poll.votes": "{votes, plural, one {# hlas} few {# hlasy} many {# hlasů} other {# hlasů}}",
"poll_button.add_poll": "Přidat anketu",
"poll_button.remove_poll": "Odstranit anketu",
"privacy.change": "Změnit soukromí příspěvku",
@@ -362,18 +378,54 @@
"regeneration_indicator.label": "Načítání…",
"regeneration_indicator.sublabel": "Váš domovský kanál se připravuje!",
"relative_time.days": "{number} d",
+ "relative_time.full.days": "{number, plural, one {# day} other {# days}} ago",
+ "relative_time.full.hours": "{number, plural, one {# hour} other {# hours}} ago",
+ "relative_time.full.just_now": "just now",
+ "relative_time.full.minutes": "{number, plural, one {# minute} other {# minutes}} ago",
+ "relative_time.full.seconds": "{number, plural, one {# second} other {# seconds}} ago",
"relative_time.hours": "{number} h",
"relative_time.just_now": "teď",
"relative_time.minutes": "{number} m",
"relative_time.seconds": "{number} s",
"relative_time.today": "dnes",
"reply_indicator.cancel": "Zrušit",
+ "report.block": "Block",
+ "report.block_explanation": "You will not see their posts. They will not be able to see your posts or follow you. They will be able to tell that they are blocked.",
+ "report.categories.other": "Other",
+ "report.categories.spam": "Spam",
+ "report.categories.violation": "Content violates one or more server rules",
+ "report.category.subtitle": "Choose the best match",
+ "report.category.title": "Tell us what's going on with this {type}",
+ "report.category.title_account": "profile",
+ "report.category.title_status": "post",
+ "report.close": "Done",
+ "report.comment.title": "Is there anything else you think we should know?",
"report.forward": "Přeposlat na {target}",
"report.forward_hint": "Tento účet je z jiného serveru. Chcete na něj také poslat anonymizovanou kopii hlášení?",
- "report.hint": "Hlášení bude zasláno moderátorům vašeho serveru. Níže můžete uvést, proč tento účet nahlašujete:",
+ "report.mute": "Mute",
+ "report.mute_explanation": "You will not see their posts. They can still follow you and see your posts and will not know that they are muted.",
+ "report.next": "Next",
"report.placeholder": "Dodatečné komentáře",
+ "report.reasons.dislike": "I don't like it",
+ "report.reasons.dislike_description": "It is not something you want to see",
+ "report.reasons.other": "It's something else",
+ "report.reasons.other_description": "The issue does not fit into other categories",
+ "report.reasons.spam": "It's spam",
+ "report.reasons.spam_description": "Malicious links, fake engagement, or repetitive replies",
+ "report.reasons.violation": "It violates server rules",
+ "report.reasons.violation_description": "You are aware that it breaks specific rules",
+ "report.rules.subtitle": "Select all that apply",
+ "report.rules.title": "Which rules are being violated?",
+ "report.statuses.subtitle": "Select all that apply",
+ "report.statuses.title": "Are there any posts that back up this report?",
"report.submit": "Odeslat",
"report.target": "Nahlášení uživatele {target}",
+ "report.thanks.take_action": "Here are your options for controlling what you see on Mastodon:",
+ "report.thanks.take_action_actionable": "While we review this, you can take action against @{name}:",
+ "report.thanks.title": "Don't want to see this?",
+ "report.thanks.title_actionable": "Thanks for reporting, we'll look into this.",
+ "report.unfollow": "Unfollow @{name}",
+ "report.unfollow_explanation": "You are following this account. To not see their posts in your home feed anymore, unfollow them.",
"search.placeholder": "Hledat",
"search_popout.search_format": "Pokročilé hledání",
"search_popout.tips.full_text": "Jednoduchý text vrací příspěvky, které jste napsali, oblíbili si, boostnuli, nebo vás v nich někdo zmínil, a také odpovídající přezdívky, zobrazovaná jména a hashtagy.",
@@ -382,7 +434,9 @@
"search_popout.tips.text": "Jednoduchý text vrací odpovídající zobrazovaná jména, přezdívky a hashtagy",
"search_popout.tips.user": "uživatel",
"search_results.accounts": "Lidé",
+ "search_results.all": "All",
"search_results.hashtags": "Hashtagy",
+ "search_results.nothing_found": "Could not find anything for these search terms",
"search_results.statuses": "Příspěvky",
"search_results.statuses_fts_disabled": "Vyhledávání příspěvků podle jejich obsahu není na tomto Mastodon serveru povoleno.",
"search_results.total": "{count, number} {count, plural, one {výsledek} few {výsledky} many {výsledků} other {výsledků}}",
@@ -396,9 +450,14 @@
"status.delete": "Smazat",
"status.detailed_status": "Podrobné zobrazení konverzace",
"status.direct": "Poslat @{name} přímou zprávu",
+ "status.edit": "Edit",
+ "status.edited": "Edited {date}",
+ "status.edited_x_times": "Edited {count, plural, one {{count} time} other {{count} times}}",
"status.embed": "Vložit na web",
"status.favourite": "Oblíbit",
"status.filtered": "Filtrováno",
+ "status.history.created": "{name} created {date}",
+ "status.history.edited": "{name} edited {date}",
"status.load_more": "Zobrazit více",
"status.media_hidden": "Média skryta",
"status.mention": "Zmínit @{name}",
@@ -461,8 +520,8 @@
"upload_form.undo": "Smazat",
"upload_form.video_description": "Popis pro sluchově či zrakově postižené",
"upload_modal.analyzing_picture": "Analyzuji obrázek…",
- "upload_modal.apply": "Použít",
- "upload_modal.applying": "Applying…",
+ "upload_modal.apply": "Aplikovat",
+ "upload_modal.applying": "Aplikuji…",
"upload_modal.choose_image": "Vybrat obrázek",
"upload_modal.description_placeholder": "Příliš žluťoučký kůň úpěl ďábelské ódy",
"upload_modal.detect_text": "Detekovat text z obrázku",
diff --git a/app/javascript/mastodon/locales/cy.json b/app/javascript/mastodon/locales/cy.json
index 2f8c09014..d3ac8d806 100644
--- a/app/javascript/mastodon/locales/cy.json
+++ b/app/javascript/mastodon/locales/cy.json
@@ -18,12 +18,12 @@
"account.followers": "Dilynwyr",
"account.followers.empty": "Nid oes neb yn dilyn y defnyddiwr hwn eto.",
"account.followers_counter": "{count, plural, one {{counter} Ddilynwr} other {{counter} o Ddilynwyr}}",
+ "account.following": "Following",
"account.following_counter": "{count, plural, one {{counter} yn Dilyn} other {{counter} yn Dilyn}}",
"account.follows.empty": "Nid yw'r defnyddiwr hwn yn dilyn unrhyw un eto.",
"account.follows_you": "Yn eich dilyn chi",
"account.hide_reblogs": "Cuddio bwstiau o @{name}",
"account.joined": "Joined {date}",
- "account.last_status": "Gweithredol olaf",
"account.link_verified_on": "Gwiriwyd perchnogaeth y ddolen yma ar {date}",
"account.locked_info": "Mae'r statws preifatrwydd cyfrif hwn wedi'i osod i gloi. Mae'r perchennog yn adolygu'r sawl sy'n gallu eu dilyn.",
"account.media": "Cyfryngau",
@@ -32,7 +32,6 @@
"account.mute": "Tawelu @{name}",
"account.mute_notifications": "Cuddio hysbysiadau o @{name}",
"account.muted": "Distewyd",
- "account.never_active": "Byth",
"account.posts": "Tŵtiau",
"account.posts_with_replies": "Tŵtiau ac atebion",
"account.report": "Adrodd @{name}",
@@ -42,15 +41,18 @@
"account.statuses_counter": "{count, plural, one {{counter} Dŵt} other {{counter} o Dŵtiau}}",
"account.unblock": "Dadflocio @{name}",
"account.unblock_domain": "Dadguddio {domain}",
+ "account.unblock_short": "Unblock",
"account.unendorse": "Peidio a'i arddangos ar fy mhroffil",
"account.unfollow": "Dad-ddilyn",
"account.unmute": "Dad-dawelu @{name}",
"account.unmute_notifications": "Dad-dawelu hysbysiadau o @{name}",
+ "account.unmute_short": "Unmute",
"account_note.placeholder": "Clicio i ychwanegu nodyn",
- "admin.dashboard.retention": "Retention",
+ "admin.dashboard.daily_retention": "User retention rate by day after sign-up",
+ "admin.dashboard.monthly_retention": "User retention rate by month after sign-up",
"admin.dashboard.retention.average": "Average",
"admin.dashboard.retention.cohort": "Sign-up month",
- "admin.dashboard.retention.cohort_size": "New users",
+ "admin.dashboard.retention.cohort_size": "Defnyddwyr newydd",
"alert.rate_limited.message": "Ceisiwch eto ar ôl {retry_time, time, medium}.",
"alert.rate_limited.title": "Cyfradd gyfyngedig",
"alert.unexpected.message": "Digwyddodd gwall annisgwyl.",
@@ -104,6 +106,7 @@
"compose_form.poll.switch_to_single": "Newid pleidlais i gyfyngu i un dewis",
"compose_form.publish": "Tŵt",
"compose_form.publish_loud": "{publish}!",
+ "compose_form.save_changes": "Save changes",
"compose_form.sensitive.hide": "Marcio cyfryngau fel eu bod yn sensitif",
"compose_form.sensitive.marked": "Cyfryngau wedi'u marcio'n sensitif",
"compose_form.sensitive.unmarked": "Nid yw'r cyfryngau wedi'u marcio'n sensitif",
@@ -165,6 +168,7 @@
"empty_column.community": "Mae'r ffrwd lleol yn wag. Ysgrifenwch rhywbeth yn gyhoeddus i gael dechrau arni!",
"empty_column.direct": "Nid oes gennych unrhyw negeseuon preifat eto. Pan y byddwch yn anfon neu derbyn un, mi fydd yn ymddangos yma.",
"empty_column.domain_blocks": "Nid oes yna unrhyw barthau cuddiedig eto.",
+ "empty_column.explore_statuses": "Nothing is trending right now. Check back later!",
"empty_column.favourited_statuses": "Nid oes gennych unrhyw hoff dwtiau eto. Pan y byddwch yn hoffi un, mi fydd yn ymddangos yma.",
"empty_column.favourites": "Nid oes neb wedi hoffi'r tŵt yma eto. Pan bydd rhywun yn ei hoffi, byddent yn ymddangos yma.",
"empty_column.follow_recommendations": "Looks like no suggestions could be generated for you. You can try using search to look for people you might know or explore trending hashtags.",
@@ -183,7 +187,13 @@
"error.unexpected_crash.next_steps_addons": "Try disabling them and refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
"errors.unexpected_crash.copy_stacktrace": "Copïo'r olrhain stac i'r clipfwrdd",
"errors.unexpected_crash.report_issue": "Rhoi gwybod am broblem",
- "follow_recommendations.done": "Done",
+ "explore.search_results": "Search results",
+ "explore.suggested_follows": "For you",
+ "explore.title": "Explore",
+ "explore.trending_links": "News",
+ "explore.trending_statuses": "Posts",
+ "explore.trending_tags": "Hashtags",
+ "follow_recommendations.done": "Wedi gorffen",
"follow_recommendations.heading": "Follow people you'd like to see posts from! Here are some suggestions.",
"follow_recommendations.lead": "Posts from people you follow will show up in chronological order on your home feed. Don't be afraid to make mistakes, you can unfollow people just as easily any time!",
"follow_request.authorize": "Caniatau",
@@ -250,8 +260,8 @@
"keyboard_shortcuts.unfocus": "i ddad-ffocysu ardal cyfansoddi testun/chwilio",
"keyboard_shortcuts.up": "i symud yn uwch yn y rhestr",
"lightbox.close": "Cau",
- "lightbox.compress": "Compress image view box",
- "lightbox.expand": "Expand image view box",
+ "lightbox.compress": "Cywasgu blwch gweld delwedd",
+ "lightbox.expand": "Ehangu blwch gweld delwedd",
"lightbox.next": "Nesaf",
"lightbox.previous": "Blaenorol",
"lists.account.add": "Ychwanegwch at restr",
@@ -261,10 +271,10 @@
"lists.edit.submit": "Newid teitl",
"lists.new.create": "Ychwanegu rhestr",
"lists.new.title_placeholder": "Teitl rhestr newydd",
- "lists.replies_policy.followed": "Any followed user",
- "lists.replies_policy.list": "Members of the list",
+ "lists.replies_policy.followed": "Unrhyw ddefnyddiwr a ddilynir",
+ "lists.replies_policy.list": "Aelodau'r rhestr",
"lists.replies_policy.none": "Neb",
- "lists.replies_policy.title": "Show replies to:",
+ "lists.replies_policy.title": "Dangos ymatebion i:",
"lists.search": "Chwilio ymysg pobl yr ydych yn ei ddilyn",
"lists.subheading": "Eich rhestrau",
"load_pending": "{count, plural, one {# eitem newydd} other {# eitemau newydd}}",
@@ -284,6 +294,7 @@
"navigation_bar.discover": "Darganfod",
"navigation_bar.domain_blocks": "Parthau cuddiedig",
"navigation_bar.edit_profile": "Golygu proffil",
+ "navigation_bar.explore": "Explore",
"navigation_bar.favourites": "Ffefrynnau",
"navigation_bar.filters": "Geiriau a dawelwyd",
"navigation_bar.follow_requests": "Ceisiadau dilyn",
@@ -298,6 +309,7 @@
"navigation_bar.preferences": "Dewisiadau",
"navigation_bar.public_timeline": "Ffrwd y ffederasiwn",
"navigation_bar.security": "Diogelwch",
+ "notification.admin.sign_up": "{name} signed up",
"notification.favourite": "hoffodd {name} eich tŵt",
"notification.follow": "dilynodd {name} chi",
"notification.follow_request": "Mae {name} wedi gwneud cais i'ch dilyn",
@@ -305,14 +317,16 @@
"notification.own_poll": "Mae eich pôl wedi diweddu",
"notification.poll": "Mae pleidlais rydych wedi pleidleisio ynddi wedi dod i ben",
"notification.reblog": "Hysbysebodd {name} eich tŵt",
- "notification.status": "{name} just posted",
+ "notification.status": "{name} newydd ei bostio",
+ "notification.update": "{name} edited a post",
"notifications.clear": "Clirio hysbysiadau",
"notifications.clear_confirmation": "Ydych chi'n sicr eich bod am glirio'ch holl hysbysiadau am byth?",
+ "notifications.column_settings.admin.sign_up": "New sign-ups:",
"notifications.column_settings.alert": "Hysbysiadau bwrdd gwaith",
"notifications.column_settings.favourite": "Ffefrynnau:",
"notifications.column_settings.filter_bar.advanced": "Dangos pob categori",
"notifications.column_settings.filter_bar.category": "Bar hidlo",
- "notifications.column_settings.filter_bar.show": "Dangos",
+ "notifications.column_settings.filter_bar.show_bar": "Show filter bar",
"notifications.column_settings.follow": "Dilynwyr newydd:",
"notifications.column_settings.follow_request": "Ceisiadau dilyn newydd:",
"notifications.column_settings.mention": "Crybwylliadau:",
@@ -322,24 +336,26 @@
"notifications.column_settings.show": "Dangos yn y golofn",
"notifications.column_settings.sound": "Chwarae sain",
"notifications.column_settings.status": "New toots:",
- "notifications.column_settings.unread_markers.category": "Unread notification markers",
+ "notifications.column_settings.unread_notifications.category": "Unread notifications",
+ "notifications.column_settings.unread_notifications.highlight": "Highlight unread notifications",
+ "notifications.column_settings.update": "Edits:",
"notifications.filter.all": "Pob",
"notifications.filter.boosts": "Hybiadau",
"notifications.filter.favourites": "Ffefrynnau",
"notifications.filter.follows": "Yn dilyn",
"notifications.filter.mentions": "Crybwylliadau",
"notifications.filter.polls": "Canlyniadau pleidlais",
- "notifications.filter.statuses": "Updates from people you follow",
- "notifications.grant_permission": "Grant permission.",
+ "notifications.filter.statuses": "Diweddariadau gan bobl rydych chi'n eu dilyn",
+ "notifications.grant_permission": "Caniatáu.",
"notifications.group": "{count} o hysbysiadau",
- "notifications.mark_as_read": "Mark every notification as read",
- "notifications.permission_denied": "Desktop notifications are unavailable due to previously denied browser permissions request",
- "notifications.permission_denied_alert": "Desktop notifications can't be enabled, as browser permission has been denied before",
- "notifications.permission_required": "Desktop notifications are unavailable because the required permission has not been granted.",
+ "notifications.mark_as_read": "Marciwch bob hysbysiad fel y'i darllenwyd",
+ "notifications.permission_denied": "Nid oes hysbysiadau bwrdd gwaith ar gael oherwydd cais am ganiatâd porwr a wrthodwyd yn flaenorol",
+ "notifications.permission_denied_alert": "Ni ellir galluogi hysbysiadau bwrdd gwaith, gan fod caniatâd porwr wedi'i wrthod o'r blaen",
+ "notifications.permission_required": "Nid oes hysbysiadau bwrdd gwaith ar gael oherwydd na roddwyd y caniatâd gofynnol.",
"notifications_permission_banner.enable": "Galluogi hysbysiadau bwrdd gwaith",
- "notifications_permission_banner.how_to_control": "To receive notifications when Mastodon isn't open, enable desktop notifications. You can control precisely which types of interactions generate desktop notifications through the {icon} button above once they're enabled.",
- "notifications_permission_banner.title": "Never miss a thing",
- "picture_in_picture.restore": "Put it back",
+ "notifications_permission_banner.how_to_control": "I dderbyn hysbysiadau pan nad yw Mastodon ar agor, galluogi hysbysiadau bwrdd gwaith. Gallwch reoli'n union pa fathau o ryngweithio sy'n cynhyrchu hysbysiadau bwrdd gwaith trwy'r botwm {icon} uchod unwaith y byddant wedi'u galluogi.",
+ "notifications_permission_banner.title": "Peidiwch byth â cholli peth",
+ "picture_in_picture.restore": "Rhowch ef yn ôl",
"poll.closed": "Ar gau",
"poll.refresh": "Adnewyddu",
"poll.total_people": "{count, plural, one {# berson} other {# o bobl}}",
@@ -362,18 +378,54 @@
"regeneration_indicator.label": "Llwytho…",
"regeneration_indicator.sublabel": "Mae eich ffrwd cartref yn cael ei baratoi!",
"relative_time.days": "{number}dydd",
+ "relative_time.full.days": "{number, plural, one {# day} other {# days}} ago",
+ "relative_time.full.hours": "{number, plural, one {# hour} other {# hours}} ago",
+ "relative_time.full.just_now": "just now",
+ "relative_time.full.minutes": "{number, plural, one {# minute} other {# minutes}} ago",
+ "relative_time.full.seconds": "{number, plural, one {# second} other {# seconds}} ago",
"relative_time.hours": "{number}awr",
"relative_time.just_now": "nawr",
"relative_time.minutes": "{number}munud",
"relative_time.seconds": "{number}eiliad",
"relative_time.today": "heddiw",
"reply_indicator.cancel": "Canslo",
+ "report.block": "Block",
+ "report.block_explanation": "You will not see their posts. They will not be able to see your posts or follow you. They will be able to tell that they are blocked.",
+ "report.categories.other": "Arall",
+ "report.categories.spam": "Sbam",
+ "report.categories.violation": "Content violates one or more server rules",
+ "report.category.subtitle": "Choose the best match",
+ "report.category.title": "Tell us what's going on with this {type}",
+ "report.category.title_account": "profile",
+ "report.category.title_status": "post",
+ "report.close": "Done",
+ "report.comment.title": "Is there anything else you think we should know?",
"report.forward": "Ymlaen i {target}",
"report.forward_hint": "Mae'r cyfrif o weinydd arall. Anfon copi anhysbys o'r adroddiad yno hefyd?",
- "report.hint": "Bydd yr adroddiad yn cael ei anfon i arolygydd eich achos. Mae modd darparu esboniad o pam yr ydych yn cwyno am y cyfrif hwn isod:",
+ "report.mute": "Mute",
+ "report.mute_explanation": "You will not see their posts. They can still follow you and see your posts and will not know that they are muted.",
+ "report.next": "Next",
"report.placeholder": "Sylwadau ychwanegol",
+ "report.reasons.dislike": "I don't like it",
+ "report.reasons.dislike_description": "It is not something you want to see",
+ "report.reasons.other": "It's something else",
+ "report.reasons.other_description": "The issue does not fit into other categories",
+ "report.reasons.spam": "It's spam",
+ "report.reasons.spam_description": "Malicious links, fake engagement, or repetitive replies",
+ "report.reasons.violation": "It violates server rules",
+ "report.reasons.violation_description": "You are aware that it breaks specific rules",
+ "report.rules.subtitle": "Select all that apply",
+ "report.rules.title": "Which rules are being violated?",
+ "report.statuses.subtitle": "Select all that apply",
+ "report.statuses.title": "Are there any posts that back up this report?",
"report.submit": "Cyflwyno",
"report.target": "Cwyno am {target}",
+ "report.thanks.take_action": "Here are your options for controlling what you see on Mastodon:",
+ "report.thanks.take_action_actionable": "While we review this, you can take action against @{name}:",
+ "report.thanks.title": "Don't want to see this?",
+ "report.thanks.title_actionable": "Thanks for reporting, we'll look into this.",
+ "report.unfollow": "Unfollow @{name}",
+ "report.unfollow_explanation": "You are following this account. To not see their posts in your home feed anymore, unfollow them.",
"search.placeholder": "Chwilio",
"search_popout.search_format": "Fformat chwilio uwch",
"search_popout.tips.full_text": "Mae testun syml yn dychwelyd tŵtiau yr ydych wedi ysgrifennu, hoffi, wedi'u bŵstio, neu wedi'ch crybwyll ynddynt, ynghyd a chyfateb a enwau defnyddwyr, enwau arddangos ac hashnodau.",
@@ -382,7 +434,9 @@
"search_popout.tips.text": "Mae testun syml yn dychwelyd enwau arddangos, enwau defnyddwyr a hashnodau sy'n cyfateb",
"search_popout.tips.user": "defnyddiwr",
"search_results.accounts": "Pobl",
+ "search_results.all": "All",
"search_results.hashtags": "Hanshnodau",
+ "search_results.nothing_found": "Could not find anything for these search terms",
"search_results.statuses": "Tŵtiau",
"search_results.statuses_fts_disabled": "Nid yw chwilio Tŵtiau yn ôl eu cynnwys wedi'i alluogi ar y gweinydd Mastodon hwn.",
"search_results.total": "{count, number} {count, plural, one {result} other {results}}",
@@ -396,9 +450,14 @@
"status.delete": "Dileu",
"status.detailed_status": "Golwg manwl o'r sgwrs",
"status.direct": "Neges breifat @{name}",
+ "status.edit": "Edit",
+ "status.edited": "Edited {date}",
+ "status.edited_x_times": "Edited {count, plural, one {{count} time} other {{count} times}}",
"status.embed": "Plannu",
"status.favourite": "Hoffi",
"status.filtered": "Wedi'i hidlo",
+ "status.history.created": "{name} created {date}",
+ "status.history.edited": "{name} edited {date}",
"status.load_more": "Llwythwch mwy",
"status.media_hidden": "Cyfryngau wedi'u cuddio",
"status.mention": "Crybwyll @{name}",
diff --git a/app/javascript/mastodon/locales/da.json b/app/javascript/mastodon/locales/da.json
index 9db5da3eb..12023bfb0 100644
--- a/app/javascript/mastodon/locales/da.json
+++ b/app/javascript/mastodon/locales/da.json
@@ -6,57 +6,59 @@
"account.block": "Blokér @{name}",
"account.block_domain": "Blokér domænet {domain}",
"account.blocked": "Blokeret",
- "account.browse_more_on_origin_server": "Gennemse mere på den oprindelige profil",
- "account.cancel_follow_request": "Annullér følgeranmodning",
+ "account.browse_more_on_origin_server": "Tjek mere ud på den oprindelige profil",
+ "account.cancel_follow_request": "Annullér følgeanmodning",
"account.direct": "Direkte besked til @{name}",
"account.disable_notifications": "Advisér mig ikke længere, når @{name} poster",
"account.domain_blocked": "Domæne blokeret",
- "account.edit_profile": "Redigere profil",
+ "account.edit_profile": "Redigér profil",
"account.enable_notifications": "Advisér mig, når @{name} poster",
"account.endorse": "Fremhæv på profil",
"account.follow": "Følg",
"account.followers": "Følgere",
"account.followers.empty": "Ingen følger denne bruger endnu.",
"account.followers_counter": "{count, plural, one {{counter} Følger} other {{counter} Følgere}}",
- "account.following_counter": "{count, plural, one {{counter} Følger} other {{counter} Følgere}}",
- "account.follows.empty": "Denne bruger følger endnu ikke nogen.",
+ "account.following": "Følger",
+ "account.following_counter": "{count, plural, one {{counter} Følges} other {{counter} Følges}}",
+ "account.follows.empty": "Denne bruger følger ikke nogen endnu.",
"account.follows_you": "Følger dig",
- "account.hide_reblogs": "Skjul fremhævelserne fra @{name}",
+ "account.hide_reblogs": "Skjul boosts fra @{name}",
"account.joined": "Tilmeldt {date}",
- "account.last_status": "Senest aktiv",
"account.link_verified_on": "Ejerskab af dette link blev tjekket {date}",
"account.locked_info": "Denne kontos fortrolighedsstatus er sat til låst. Ejeren bedømmer manuelt, hvem der kan følge vedkommende.",
- "account.media": "Medie",
+ "account.media": "Medier",
"account.mention": "Nævn @{name}",
"account.moved_to": "{name} er flyttet til:",
- "account.mute": "Tavsgør @{name}",
- "account.mute_notifications": "Tavsgør notifikationer fra @{name}",
- "account.muted": "Tavsgjort",
- "account.never_active": "Aldrig",
- "account.posts": "Trut",
- "account.posts_with_replies": "Trut og svar",
+ "account.mute": "Skjul @{name}",
+ "account.mute_notifications": "Skjul notifikationer fra @{name}",
+ "account.muted": "Tystnet",
+ "account.posts": "Indlæg",
+ "account.posts_with_replies": "Indlæg og svar",
"account.report": "Anmeld @{name}",
"account.requested": "Afventer godkendelse. Tryk for at annullere følgeanmodning",
"account.share": "Del @{name}s profil",
- "account.show_reblogs": "Vis fremhævelserne fra @{name}",
- "account.statuses_counter": "{count, plural, one {{counter} Trut} other {{counter} Trut}}",
- "account.unblock": "Fjern blokeringen af @{name}",
+ "account.show_reblogs": "Vis fremhævelser fra @{name}",
+ "account.statuses_counter": "{count, plural, one {{counter} Indlæg} other {{counter} Indlæg}}",
+ "account.unblock": "Afblokér @{name}",
"account.unblock_domain": "Afblokér domænet {domain}",
- "account.unendorse": "Fremhæv ikke på profil",
+ "account.unblock_short": "Afblokér",
+ "account.unendorse": "Fjern visning på din profil",
"account.unfollow": "Følg ikke længere",
- "account.unmute": "Fjern tavsgjort for @{name}",
- "account.unmute_notifications": "Fjern tavsgjort for notifikationer fra @{name}",
+ "account.unmute": "Fjern tavsgørelsen af @{name}",
+ "account.unmute_notifications": "Fjern tavsgørelsen af notifikationer fra @{name}",
+ "account.unmute_short": "Fjern tavsgørelse",
"account_note.placeholder": "Klik for at tilføje notat",
- "admin.dashboard.retention": "Retention",
- "admin.dashboard.retention.average": "Average",
- "admin.dashboard.retention.cohort": "Sign-up month",
- "admin.dashboard.retention.cohort_size": "New users",
+ "admin.dashboard.daily_retention": "Brugerfastholdelsesrate efter dag efter tilmelding",
+ "admin.dashboard.monthly_retention": "Brugerfastholdelsesrate efter måned efter tilmelding",
+ "admin.dashboard.retention.average": "Gennemsnitlig",
+ "admin.dashboard.retention.cohort": "Tilmeldingsmåned",
+ "admin.dashboard.retention.cohort_size": "Nye brugere",
"alert.rate_limited.message": "Forsøg igen efter {retry_time, time, medium}.",
- "alert.rate_limited.title": "Gradsbegrænset",
+ "alert.rate_limited.title": "Hastighedsbegrænset",
"alert.unexpected.message": "En uventet fejl opstod.",
"alert.unexpected.title": "Ups!",
"announcement.announcement": "Bekendtgørelse",
- "attachments_list.unprocessed": "(unprocessed)",
+ "attachments_list.unprocessed": "(ubehandlet)",
"autosuggest_hashtag.per_week": "{count} pr. uge",
"boost_modal.combo": "Du kan trykke på {combo} for at overspringe dette næste gang",
"bundle_column_error.body": "Noget gik galt under indlæsningen af denne komponent.",
@@ -69,16 +71,16 @@
"column.bookmarks": "Bogmærker",
"column.community": "Lokal tidslinje",
"column.direct": "Direkte beskeder",
- "column.directory": "Gennemse profiler",
+ "column.directory": "Tjek profiler",
"column.domain_blocks": "Blokerede domæner",
"column.favourites": "Favoritter",
- "column.follow_requests": "Følg-anmodninger",
+ "column.follow_requests": "Følgeanmodninger",
"column.home": "Hjem",
"column.lists": "Lister",
"column.mutes": "Tavsgjorte brugere",
"column.notifications": "Notifikationer",
- "column.pins": "Fastgjorte trut",
- "column.public": "Forenede tidslinje",
+ "column.pins": "Fastgjorte indlæg",
+ "column.public": "Fælles tidslinje",
"column_back_button.label": "Tilbage",
"column_header.hide_settings": "Skjul indstillinger",
"column_header.moveLeft_settings": "Flyt kolonne til venstre",
@@ -88,68 +90,69 @@
"column_header.unpin": "Løsgør",
"column_subheading.settings": "Indstillinger",
"community.column_settings.local_only": "Kun lokalt",
- "community.column_settings.media_only": "Kun medie",
- "community.column_settings.remote_only": "Kun fjernt",
- "compose_form.direct_message_warning": "Dette trut sendes kun til de nævnte brugere.",
+ "community.column_settings.media_only": "Kun medier",
+ "community.column_settings.remote_only": "Kun udefra",
+ "compose_form.direct_message_warning": "Indlægget sendes kun til de nævnte brugere.",
"compose_form.direct_message_warning_learn_more": "Få mere at vide",
- "compose_form.hashtag_warning": "Dette trut vises ikke under noget hashtag, da det ikke er listet. Kun offentlige trut kan søges via hashtags.",
- "compose_form.lock_disclaimer": "Din konto er ikke {locked}. Alle kan følge dig for at se dine kun-følger poster.",
+ "compose_form.hashtag_warning": "Da indlægget ikke er offentligt, vises det ikke under noget hashtag, idet kun offentlige indlæg kan søges via hashtags.",
+ "compose_form.lock_disclaimer": "Din konto er ikke {locked}. Enhver kan følge dig og se indlæg kun beregnet for følgere.",
"compose_form.lock_disclaimer.lock": "låst",
"compose_form.placeholder": "Hvad tænker du på?",
"compose_form.poll.add_option": "Tilføj valgmulighed",
- "compose_form.poll.duration": "Afstemningsvarighed",
+ "compose_form.poll.duration": "Afstemningens varighed",
"compose_form.poll.option_placeholder": "Valgmulighed {number}",
"compose_form.poll.remove_option": "Fjern denne valgmulighed",
"compose_form.poll.switch_to_multiple": "Ændr afstemning til flervalgstype",
"compose_form.poll.switch_to_single": "Ændr afstemning til enkeltvalgstype",
- "compose_form.publish": "Toot",
+ "compose_form.publish": "Udgiv",
"compose_form.publish_loud": "{publish}!",
+ "compose_form.save_changes": "Gem ændringer",
"compose_form.sensitive.hide": "{count, plural, one {Markér medie som følsomt} other {Markér medier som følsomme}}",
"compose_form.sensitive.marked": "{count, plural, one {Medie er markeret som sensitivt} other {Medier er markerede som sensitive}}",
- "compose_form.sensitive.unmarked": "Intet medie market som sensitivt",
- "compose_form.spoiler.marked": "Tekst skjult bag advarsel",
- "compose_form.spoiler.unmarked": "Teksten er ikke skjult",
+ "compose_form.sensitive.unmarked": "{count, plural, one {Medie er ikke market som sensitivt} other {Medier er ikke markerede som sensitive}}",
+ "compose_form.spoiler.marked": "Fjern indholdsadvarsel",
+ "compose_form.spoiler.unmarked": "Tilføj indholdsadvarsel",
"compose_form.spoiler_placeholder": "Skriv din advarsel hér",
"confirmation_modal.cancel": "Afbryd",
"confirmations.block.block_and_report": "Blokér og Anmeld",
"confirmations.block.confirm": "Blokér",
"confirmations.block.message": "Sikker på, at du vil blokere {name}?",
"confirmations.delete.confirm": "Slet",
- "confirmations.delete.message": "Sikker på, at du vil slette dette trut?",
+ "confirmations.delete.message": "Sikker på, at du vil slette dette indlæg?",
"confirmations.delete_list.confirm": "Slet",
"confirmations.delete_list.message": "Sikker på, at du vil slette denne liste permanent?",
- "confirmations.discard_edit_media.confirm": "Discard",
- "confirmations.discard_edit_media.message": "You have unsaved changes to the media description or preview, discard them anyway?",
- "confirmations.domain_block.confirm": "Skjul hele domænet",
- "confirmations.domain_block.message": "Helt sikker på, at du vil blokere hele {domain}-domænet? Oftest vil få, specifikke blokeringer eller tavsgørelser være nok og at fortrække. Du vil ikke se indhold fra domænet på offentlige tidslinjer eller i dine notifikationer. Dine følgere fra domænet fjernes.",
+ "confirmations.discard_edit_media.confirm": "Kassér",
+ "confirmations.discard_edit_media.message": "Der er ugemte ændringer i mediebeskrivelsen eller forhåndsvisningen, kassér dem alligevel?",
+ "confirmations.domain_block.confirm": "Blokér hele domænet",
+ "confirmations.domain_block.message": "Fuldstændig sikker på, at du vil blokere hele {domain}-domænet? Oftest vil nogle få målrettede blokeringer eller tavsgørelser være tilstrækkelige og at foretrække. Du vil ikke se indhold fra dette domæne i nogle offentlige tidslinjer eller i dine notifikationer, og dine følgere herfra fjernes ligeledes.",
"confirmations.logout.confirm": "Log ud",
"confirmations.logout.message": "Log ud, sikker?",
- "confirmations.mute.confirm": "Tavsgøre",
- "confirmations.mute.explanation": "Dette skjuler indlæg fra dem (og om) dem, men det vil lade dem at se dine indlæg og følge dig.",
- "confirmations.mute.message": "Sikker på, du vil tavsgøre {name}?",
- "confirmations.redraft.confirm": "Slet og omskriv",
- "confirmations.redraft.message": "Sikker på, at du vil slette dette trut og omskrive det? Favoritter og fremhævelser går tabt og svar til det oprindelige indlæg afassocieres.",
- "confirmations.reply.confirm": "Besvar",
- "confirmations.reply.message": "Besvarelse nu vil overskrive den besked, du er ved at skrive. Fortsæt alligevel?",
+ "confirmations.mute.confirm": "Tavsgør",
+ "confirmations.mute.explanation": "Dette skjuler indlæg fra (og om) dem, men lader dem fortsat se dine indlæg og følge dig.",
+ "confirmations.mute.message": "Er du sikker på, du vil skjule {name}?",
+ "confirmations.redraft.confirm": "Slet og omformulér",
+ "confirmations.redraft.message": "Sikker på, at du vil slette dette indlæg for at omskrive det? Favoritter og boosts går tabt, og svar til det oprindelige indlæg afassocieres.",
+ "confirmations.reply.confirm": "Svar",
+ "confirmations.reply.message": "At svare nu vil overskrive den besked, du er ved at skrive. Fortsæt alligevel?",
"confirmations.unfollow.confirm": "Følg ikke længere",
"confirmations.unfollow.message": "Sikker på, at du ikke længere vil følge {name}?",
- "conversation.delete": "Slet konversation",
+ "conversation.delete": "Slet samtale",
"conversation.mark_as_read": "Markér som læst",
"conversation.open": "Vis konversation",
"conversation.with": "Med {names}",
"directory.federated": "Fra kendt fedivers",
"directory.local": "Kun fra {domain}",
"directory.new_arrivals": "Nye ankomster",
- "directory.recently_active": "Senest aktiv",
- "embed.instructions": "Indlejr dette trut på din side ved at kopiere koden nedenfor.",
+ "directory.recently_active": "Nyligt aktive",
+ "embed.instructions": "Indlejr dette indlæg på dit websted ved at kopiere nedenstående kode.",
"embed.preview": "Sådan kommer det til at se ud:",
"emoji_button.activity": "Aktivitet",
"emoji_button.custom": "Tilpasset",
"emoji_button.flags": "Flag",
"emoji_button.food": "Mad og drikke",
- "emoji_button.label": "Indsæt humørikon",
+ "emoji_button.label": "Indsæt emoji",
"emoji_button.nature": "Natur",
- "emoji_button.not_found": "Ingen emojos!! (╯°□°)╯︵ ┻━┻",
+ "emoji_button.not_found": "Ingen matchende emojis fundet",
"emoji_button.objects": "Objekter",
"emoji_button.people": "Personer",
"emoji_button.recent": "Oftest brugt",
@@ -158,44 +161,51 @@
"emoji_button.symbols": "Symboler",
"emoji_button.travel": "Rejser og steder",
"empty_column.account_suspended": "Konto suspenderet",
- "empty_column.account_timeline": "Ingen trut her!",
+ "empty_column.account_timeline": "Ingen indlæg hér!",
"empty_column.account_unavailable": "Profil utilgængelig",
- "empty_column.blocks": "Du har ikke blokeret nogle brugere endnu.",
- "empty_column.bookmarked_statuses": "Du har ingen bogmærkede trut endnu. Når du bogmærker ét, vil det dukke op hér.",
+ "empty_column.blocks": "Ingen brugere blokeret endnu.",
+ "empty_column.bookmarked_statuses": "Du har ingen bogmærkede indlæg endnu. Når du bogmærker ét, vil det dukke op hér.",
"empty_column.community": "Den lokale tidslinje er tom. Skriv noget offentligt for at sætte tingene i gang!",
- "empty_column.direct": "Du har endnu ingen direkte beskeder. Når du sender eller modtager en, vil den vises hér.",
- "empty_column.domain_blocks": "Der er endnu ingen skjulte domæner.",
- "empty_column.favourited_statuses": "Du har endnu ingen favorit-trut. Når du favoriserer ét, vil det blive vist hér.",
- "empty_column.favourites": "Ingen har endnu favoriseret dette trut. Når nogen anden gør vil det blive vist hér.",
+ "empty_column.direct": "Du har endnu ingen direkte beskeder. Når du sender eller modtager én, vil den dukke op hér.",
+ "empty_column.domain_blocks": "Ingen blokerede domæner endnu.",
+ "empty_column.explore_statuses": "Ingen nye tendensen pt. Tjek igen senere!",
+ "empty_column.favourited_statuses": "Du har endnu ingen favoritindlæg. Når du favoritmarkerer ét, vil det dukke op hér.",
+ "empty_column.favourites": "Ingen har endnu gjort dette indlæg til favorit. Når nogen gør dét, vil det dukke op hér.",
"empty_column.follow_recommendations": "Ser ud til, at der ikke kunne genereres forslag til dig. Du kan prøve med Søg for at lede efter personer, du måske kender, eller udforske hashtags.",
- "empty_column.follow_requests": "Du har endnu ingen følgeranmodninger. Når du modtager én, vil den fremgå hér.",
- "empty_column.hashtag": "Intet indhold i dette hashtag endnu.",
- "empty_column.home": "Din hjemmetidslinje er tom! Besøg {public} eller brug søgningen for at komme igang og møde andre brugere.",
- "empty_column.home.suggestions": "Se nogle foreslag",
- "empty_column.list": "Der er endnu intet i denne liste. Når medlemmer af denne liste poster nye trut, vil de fremgå hér.",
+ "empty_column.follow_requests": "Du har endnu ingen følgeanmodninger. Når du modtager én, vil den dukke op hér.",
+ "empty_column.hashtag": "Der er intet med dette hashtag endnu.",
+ "empty_column.home": "Din hjemmetidslinje er tom! Følg nogle personer, for at udfylde den. {suggestions}",
+ "empty_column.home.suggestions": "Se nogle forslag",
+ "empty_column.list": "Der er ikke noget på denne liste endnu. Når medlemmer af listen udgiver nye indlæg vil de fremgå hér.",
"empty_column.lists": "Du har endnu ingen lister. Når du opretter én, vil den fremgå hér.",
- "empty_column.mutes": "Du har endnu ikke tavsgjort nogle brugere.",
- "empty_column.notifications": "Du har endnu ingen notifikationer. Interagér med andre for at starte konversationen.",
+ "empty_column.mutes": "Du har endnu ikke tystnet nogle brugere.",
+ "empty_column.notifications": "Du har endnu ingen notifikationer. Når andre interagerer med dig, vil det fremgå hér.",
"empty_column.public": "Der er intet hér! Skriv noget offentligt eller følg manuelt brugere fra andre servere for at se indhold",
"error.unexpected_crash.explanation": "Grundet en fejl i vores kode, eller en browser-kompatibilitetsfejl, kunne siden ikke vises korrekt.",
"error.unexpected_crash.explanation_addons": "Denne side kunne ikke vises korrekt. Fejlen skyldes sandsynligvis en browsertilføjelse eller automatiske oversættelsesværktøjer.",
"error.unexpected_crash.next_steps": "Prøv at opfriske siden. Hjælper dette ikke, kan Mastodon muligvis stadig bruges via en anden browser eller app.",
- "error.unexpected_crash.next_steps_addons": "Prøv at deaktivere dem og opfriske siden. Hjælper dette ikke, kan Mastodon muligvis stadig bruges via en anden browser eller app.",
+ "error.unexpected_crash.next_steps_addons": "Prøv at deaktivere dem og genindlæse siden. Hvis det ikke hjælper, kan Mastodon muligvis stadig bruges via en anden browser eller app.",
"errors.unexpected_crash.copy_stacktrace": "Kopiér stacktrace til udklipsholderen",
"errors.unexpected_crash.report_issue": "Anmeld problem",
+ "explore.search_results": "Søgeresultater",
+ "explore.suggested_follows": "Til dig",
+ "explore.title": "Udforsk",
+ "explore.trending_links": "Nyheder",
+ "explore.trending_statuses": "Indlæg",
+ "explore.trending_tags": "Hashtags",
"follow_recommendations.done": "Udført",
"follow_recommendations.heading": "Følg personer du gerne vil se indlæg fra! Her er nogle forslag.",
- "follow_recommendations.lead": "Indlæg, fra personer du følger, vises i kronologisk rækkefølge i dit hjemmefeed. Vær ikke bange for at begå fejl, du kan vælge \"følg ikke\" personer lige så nemt til enhver tid!",
+ "follow_recommendations.lead": "Indlæg, fra personer du følger, vil fremgå kronologisk ordnet i dit hjemmefeed. Vær ikke bange for at begå fejl, da du altid og meget nemt kan ændre dit valg!",
"follow_request.authorize": "Godkend",
"follow_request.reject": "Afvis",
"follow_requests.unlocked_explanation": "Selvom din konto ikke er låst, antog {domain}-personalet, at du måske vil gennemgå dine anmodninger manuelt.",
"generic.saved": "Gemt",
"getting_started.developers": "Udviklere",
- "getting_started.directory": "Profilliste",
+ "getting_started.directory": "Profilmappe",
"getting_started.documentation": "Dokumentation",
- "getting_started.heading": "Komme i gang",
+ "getting_started.heading": "Startmenu",
"getting_started.invite": "Invitér folk",
- "getting_started.open_source_notice": "Mastodon er en open-source software. Du kan bidrage eller anmelde fejl via GitHub {github}.",
+ "getting_started.open_source_notice": "Mastodon er open-source software. Du kan bidrage eller anmelde fejl via GitHub {github}.",
"getting_started.security": "Kontoindstillinger",
"getting_started.terms": "Tjenestevilkår",
"hashtag.column_header.tag_mode.all": "og {additional}",
@@ -208,47 +218,47 @@
"hashtag.column_settings.tag_mode.none": "Ingen af disse",
"hashtag.column_settings.tag_toggle": "Inkludér ekstra tags for denne kolonne",
"home.column_settings.basic": "Grundlæggende",
- "home.column_settings.show_reblogs": "Vis fremhævelser",
+ "home.column_settings.show_reblogs": "Vis boosts",
"home.column_settings.show_replies": "Vis svar",
"home.hide_announcements": "Skjul bekendtgørelser",
"home.show_announcements": "Vis bekendtgørelser",
"intervals.full.days": "{number, plural, one {# dag} other {# dage}}",
"intervals.full.hours": "{number, plural, one {# time} other {# timer}}",
"intervals.full.minutes": "{number, plural, one {# minut} other {# minutter}}",
- "keyboard_shortcuts.back": "for at navigere tilbage",
- "keyboard_shortcuts.blocked": "for at åbne listen over blokerede brugere",
- "keyboard_shortcuts.boost": "for at fremhæve",
- "keyboard_shortcuts.column": "for at fokusere et trut i en af kolonnerne",
- "keyboard_shortcuts.compose": "for at fokusere på skriveområdet",
+ "keyboard_shortcuts.back": "Gå tilbage",
+ "keyboard_shortcuts.blocked": "Åbn Blokerede brugere-listen",
+ "keyboard_shortcuts.boost": "Boost indlæg",
+ "keyboard_shortcuts.column": "Fokusér kolonne",
+ "keyboard_shortcuts.compose": "Fokusér skriveområdet",
"keyboard_shortcuts.description": "Beskrivelse",
- "keyboard_shortcuts.direct": "for at åbne direkte besked-kolonnen",
- "keyboard_shortcuts.down": "for at rykke nedad på listen",
- "keyboard_shortcuts.enter": "for at åbne trut",
- "keyboard_shortcuts.favourite": "for at favorisere",
- "keyboard_shortcuts.favourites": "for at åbne favoritlisten",
- "keyboard_shortcuts.federated": "for at åbne den forenede tidslinje",
+ "keyboard_shortcuts.direct": "Åbn Direkte beskeder-kolonnen",
+ "keyboard_shortcuts.down": "Flyt nedad på listen",
+ "keyboard_shortcuts.enter": "Åbn indlæg",
+ "keyboard_shortcuts.favourite": "Favoritmarkér indlæg",
+ "keyboard_shortcuts.favourites": "Åbn favoritlisten",
+ "keyboard_shortcuts.federated": "Åbn fælles tidslinje",
"keyboard_shortcuts.heading": "Tastaturgenveje",
- "keyboard_shortcuts.home": "for at åbne hjemmetidslinjen",
+ "keyboard_shortcuts.home": "Åbn hjemmetidslinje",
"keyboard_shortcuts.hotkey": "Hurtigtast",
- "keyboard_shortcuts.legend": "for at vise dette symbol",
- "keyboard_shortcuts.local": "for at åbne den lokale tidslinje",
- "keyboard_shortcuts.mention": "for at nævne forfatteren",
- "keyboard_shortcuts.muted": "for at åbne listen over tavsgjorte brugere",
- "keyboard_shortcuts.my_profile": "for at åbne din profil",
+ "keyboard_shortcuts.legend": "Vis dette symbol",
+ "keyboard_shortcuts.local": "Åbn lokal tidslinje",
+ "keyboard_shortcuts.mention": "Nævn forfatter",
+ "keyboard_shortcuts.muted": "Åbn listen over tavsgjorte brugere",
+ "keyboard_shortcuts.my_profile": "Åbn din profil",
"keyboard_shortcuts.notifications": "for at åbne notifikationskolonnen",
- "keyboard_shortcuts.open_media": "for at åbne medier",
- "keyboard_shortcuts.pinned": "for at åbne listen over fastgjorte trut",
- "keyboard_shortcuts.profile": "for at åbne forfatterens profil",
- "keyboard_shortcuts.reply": "for at besvare",
- "keyboard_shortcuts.requests": "for at åbne følganmodningslisten",
- "keyboard_shortcuts.search": "for at fokusere søgningen",
- "keyboard_shortcuts.spoilers": "for at vise/skjule CW-felt",
- "keyboard_shortcuts.start": "for at åbne \"komme i gang\"-kolonnen",
- "keyboard_shortcuts.toggle_hidden": "for at vise/skjule tekst bag CW",
- "keyboard_shortcuts.toggle_sensitivity": "for at vise/skjule medier",
- "keyboard_shortcuts.toot": "for at påbegynde et helt nyt indlæg",
- "keyboard_shortcuts.unfocus": "for at fjerne fokus fra skriveområde/søgning",
- "keyboard_shortcuts.up": "for at bevæge sig opad på listen",
+ "keyboard_shortcuts.open_media": "Åbn medier",
+ "keyboard_shortcuts.pinned": "Åbn liste over fastgjorte indlæg",
+ "keyboard_shortcuts.profile": "Åbn forfatters profil",
+ "keyboard_shortcuts.reply": "Besvar indlægget",
+ "keyboard_shortcuts.requests": "Åbn liste over følgeanmodninger",
+ "keyboard_shortcuts.search": "Fokusér søgebjælke",
+ "keyboard_shortcuts.spoilers": "Vis/skjul CW-felt",
+ "keyboard_shortcuts.start": "Åbn \"komme i gang\"-kolonne",
+ "keyboard_shortcuts.toggle_hidden": "Vis/skjul tekst bag CW",
+ "keyboard_shortcuts.toggle_sensitivity": "Vis/skjul medier",
+ "keyboard_shortcuts.toot": "Påbegynd nyt indlæg",
+ "keyboard_shortcuts.unfocus": "Fjern fokus fra teksskrivningsområde/søgning",
+ "keyboard_shortcuts.up": "Flyt opad på listen",
"lightbox.close": "Luk",
"lightbox.compress": "Komprimér billedvisningsfelt",
"lightbox.expand": "Udvid billedevisningsfelt",
@@ -261,70 +271,76 @@
"lists.edit.submit": "Skift titel",
"lists.new.create": "Tilføj liste",
"lists.new.title_placeholder": "Ny listetitel",
- "lists.replies_policy.followed": "Enhver fulgt bruger",
- "lists.replies_policy.list": "Medlemmer af listen",
+ "lists.replies_policy.followed": "Enhver bruger, der følges",
+ "lists.replies_policy.list": "Listemedlemmer",
"lists.replies_policy.none": "Ingen",
"lists.replies_policy.title": "Vis svar til:",
- "lists.search": "Søg blandt personer, du følger",
+ "lists.search": "Søg blandt personer, som følges",
"lists.subheading": "Dine lister",
- "load_pending": "{count, plural, one {# nyt punkt} other {# nye punkter}}",
+ "load_pending": "{count, plural, one {# nyt emne} other {# nye emner}}",
"loading_indicator.label": "Indlæser...",
- "media_gallery.toggle_visible": "Skjul {number, plural, one {billede} other {billeder}}",
+ "media_gallery.toggle_visible": "{number, plural, one {Skjul billede} other {Skjul billeder}}",
"missing_indicator.label": "Ikke fundet",
"missing_indicator.sublabel": "Denne ressource kunne ikke findes",
"mute_modal.duration": "Varighed",
"mute_modal.hide_notifications": "Skjul notifikationer fra denne bruger?",
- "mute_modal.indefinite": "Uendeligt",
+ "mute_modal.indefinite": "Tidsubegrænset",
"navigation_bar.apps": "Mobil-apps",
"navigation_bar.blocks": "Blokerede brugere",
"navigation_bar.bookmarks": "Bogmærker",
"navigation_bar.community_timeline": "Lokal tidslinje",
- "navigation_bar.compose": "Skriv nyt trut",
+ "navigation_bar.compose": "Skriv nyt indlæg",
"navigation_bar.direct": "Direkte beskeder",
"navigation_bar.discover": "Opdag",
"navigation_bar.domain_blocks": "Blokerede domæner",
"navigation_bar.edit_profile": "Redigér profil",
+ "navigation_bar.explore": "Udforsk",
"navigation_bar.favourites": "Favoritter",
"navigation_bar.filters": "Tavsgjorte ord",
- "navigation_bar.follow_requests": "Følganmodninger",
- "navigation_bar.follows_and_followers": "Følger og følgere",
+ "navigation_bar.follow_requests": "Følgeanmodninger",
+ "navigation_bar.follows_and_followers": "Følges og følgere",
"navigation_bar.info": "Om denne server",
- "navigation_bar.keyboard_shortcuts": "Hurtigtaster",
+ "navigation_bar.keyboard_shortcuts": "Genvejstaster",
"navigation_bar.lists": "Lister",
- "navigation_bar.logout": "Log ud",
+ "navigation_bar.logout": "Log af",
"navigation_bar.mutes": "Tavsgjorte brugere",
"navigation_bar.personal": "Personlig",
- "navigation_bar.pins": "Fastgjorte trut",
+ "navigation_bar.pins": "Fastgjorte indlæg",
"navigation_bar.preferences": "Præferencer",
- "navigation_bar.public_timeline": "Forenet tidslinje",
+ "navigation_bar.public_timeline": "Fælles tidslinje",
"navigation_bar.security": "Sikkerhed",
- "notification.favourite": "{name} favoriserede dit trut",
- "notification.follow": "{name} fulgte dig",
+ "notification.admin.sign_up": "{name} tilmeldte sig",
+ "notification.favourite": "{name} favoritmarkerede dit indlæg",
+ "notification.follow": "{name} begyndte at følge dig",
"notification.follow_request": "{name} har anmodet om at følge dig",
"notification.mention": "{name} nævnte dig",
"notification.own_poll": "Din afstemning er afsluttet",
"notification.poll": "En afstemning, hvori du stemte, er slut",
- "notification.reblog": "{name} fremhævede din trut",
+ "notification.reblog": "{name} boostede dit indlæg",
"notification.status": "{name} har netop postet",
+ "notification.update": "{name} redigerede et indlæg",
"notifications.clear": "Ryd notifikationer",
"notifications.clear_confirmation": "Sikker på, at du vil rydde alle dine notifikationer permanent?",
- "notifications.column_settings.alert": "Skrivebordsnotifikationer",
+ "notifications.column_settings.admin.sign_up": "Nye tilmeldinger:",
+ "notifications.column_settings.alert": "Computernotifikationer",
"notifications.column_settings.favourite": "Favoritter:",
"notifications.column_settings.filter_bar.advanced": "Vis alle kategorier",
"notifications.column_settings.filter_bar.category": "Hurtigfilterbjælke",
- "notifications.column_settings.filter_bar.show": "Vis",
+ "notifications.column_settings.filter_bar.show_bar": "Vis filterbjælke",
"notifications.column_settings.follow": "Nye følgere:",
- "notifications.column_settings.follow_request": "Nye følganmodninger:",
+ "notifications.column_settings.follow_request": "Nye følgeanmodninger:",
"notifications.column_settings.mention": "Omtaler:",
"notifications.column_settings.poll": "Afstemningsresultater:",
- "notifications.column_settings.push": "Pushnotifikationer",
- "notifications.column_settings.reblog": "Fremhævelser:",
+ "notifications.column_settings.push": "Push-notifikationer",
+ "notifications.column_settings.reblog": "Boosts:",
"notifications.column_settings.show": "Vis i kolonne",
"notifications.column_settings.sound": "Afspil lyd",
"notifications.column_settings.status": "Nye indlæg:",
- "notifications.column_settings.unread_markers.category": "Ulæste notifkationer-markører",
+ "notifications.column_settings.unread_notifications.category": "Ulæste notifikationer",
+ "notifications.column_settings.unread_notifications.highlight": "Fremhæv ulæste notifikationer",
+ "notifications.column_settings.update": "Redigeringer:",
"notifications.filter.all": "Alle",
- "notifications.filter.boosts": "Fremhævelser",
+ "notifications.filter.boosts": "Boosts",
"notifications.filter.favourites": "Favoritter",
"notifications.filter.follows": "Følger",
"notifications.filter.mentions": "Omtaler",
@@ -333,92 +349,135 @@
"notifications.grant_permission": "Tildel tilladelse.",
"notifications.group": "{count} notifikationer",
"notifications.mark_as_read": "Markér alle notifikationer som læst",
- "notifications.permission_denied": "Skrivebordsnotifikationer er utilgængelige grundet tidligere afvist browsertilladelsesanmodning",
- "notifications.permission_denied_alert": "Skrivebordsnotifikationer kan ikke aktiveres, da browsertilladelse er blevet nægtet før",
- "notifications.permission_required": "Skrivebordsnotifikationer er utilgængelige, da den krævede tilladelse ikke er tildelt.",
- "notifications_permission_banner.enable": "Aktivér skrivebordsnotifikationer",
- "notifications_permission_banner.how_to_control": "Aktivér skrivebordsnotifikationer for at modtage notifikationer, når Mastodon ikke er åben. Du kan styre, præcist hvilke typer af interaktioner, som genererer skrivebordsnotifikationer via knappen {icon} ovenfor, når de er aktiveret.",
+ "notifications.permission_denied": "Computernotifikationer er utilgængelige grundet tidligere afvist browsertilladelsesanmodning",
+ "notifications.permission_denied_alert": "Computernotifikationer kan ikke aktiveres, da browsertilladelse tidligere blev nægtet",
+ "notifications.permission_required": "Computernotifikationer er utilgængelige, da den krævede tilladelse ikke er tildelt.",
+ "notifications_permission_banner.enable": "Aktivér computernotifikationer",
+ "notifications_permission_banner.how_to_control": "Aktivér computernotifikationer for at få besked, når Mastodon ikke er åben. Når de er aktiveret, kan man via knappen {icon} ovenfor præcist styre, hvilke typer af interaktioner, som genererer computernotifikationer.",
"notifications_permission_banner.title": "Gå aldrig glip af noget",
- "picture_in_picture.restore": "Sæt det tilbage",
+ "picture_in_picture.restore": "Indsæt det igen",
"poll.closed": "Lukket",
- "poll.refresh": "Opfrisk",
+ "poll.refresh": "Opdatér",
"poll.total_people": "{count, plural, one {# person} other {# personer}}",
"poll.total_votes": "{count, plural, one {# stemme} other {# stemmer}}",
"poll.vote": "Stem",
- "poll.voted": "Du stemte for dette svar",
- "poll.votes": "{votes, plural, one {# vote} other {# votes}}",
+ "poll.voted": "Du stemte på dette svar",
+ "poll.votes": "{votes, plural, one {# stemme} other {# stemmer}}",
"poll_button.add_poll": "Tilføj en afstemning",
"poll_button.remove_poll": "Fjern afstemning",
- "privacy.change": "Justér trutfortrolighed",
+ "privacy.change": "Justér indlægsfortrolighed",
"privacy.direct.long": "Kun synlig for nævnte brugere",
"privacy.direct.short": "Direkte",
"privacy.private.long": "Kun synlig for følgere",
"privacy.private.short": "Kun for følgere",
- "privacy.public.long": "Synlig for alle på offentlige tidslinjer",
+ "privacy.public.long": "Synlig for alle, fremgår på offentlige tidslinjer",
"privacy.public.short": "Offentlig",
- "privacy.unlisted.long": "Synlig for alle, men på offentlige tidslinjer",
- "privacy.unlisted.short": "Ulistet",
- "refresh": "Opfrisk",
+ "privacy.unlisted.long": "Synlig for alle, fremgår ikke på offentlige tidslinjer",
+ "privacy.unlisted.short": "Diskret",
+ "refresh": "Genindlæs",
"regeneration_indicator.label": "Indlæser…",
- "regeneration_indicator.sublabel": "Din hjemmefeed klargøres!",
+ "regeneration_indicator.sublabel": "Din hjemmetidslinje klargøres!",
"relative_time.days": "{number}d",
+ "relative_time.full.days": "{number, plural, one {# dag} other {# dage}} diden",
+ "relative_time.full.hours": "{number, plural, one {# time} other {# timer}} siden",
+ "relative_time.full.just_now": "netop nu",
+ "relative_time.full.minutes": "{number, plural, one {# minut} other {# minutter}} siden",
+ "relative_time.full.seconds": "{number, plural, one {# sekund} other {# sekunder}} siden",
"relative_time.hours": "{number}t",
"relative_time.just_now": "nu",
"relative_time.minutes": "{number}m",
"relative_time.seconds": "{number}s",
"relative_time.today": "i dag",
"reply_indicator.cancel": "Afbryd",
+ "report.block": "Blokér",
+ "report.block_explanation": "Du vil ikke se vedkommendes indlæg, og vedkommende vil ikke kunne se dine eller følge dig. Vedkommende vil være bekendt med blokeringen.",
+ "report.categories.other": "Andre",
+ "report.categories.spam": "Spam",
+ "report.categories.violation": "Indhold overtræder en eller flere serverregler",
+ "report.category.subtitle": "Vælg den bedste match",
+ "report.category.title": "Fortæl os, hvad der foregår med denne {type}",
+ "report.category.title_account": "profil",
+ "report.category.title_status": "indlæg",
+ "report.close": "Udført",
+ "report.comment.title": "Er der andet, som vi bør vide?",
"report.forward": "Videresend til {target}",
- "report.forward_hint": "Kontoen er fra en anden server. Sende en anonymiseret anmeldelseskopi dertil også?",
- "report.hint": "Anmeldelsen sendes til din serverordstyrerer. Du kan oplyse nærmere om kontoanmeldelsen nedennfor:",
+ "report.forward_hint": "Kontoen er fra en anden server. Send også en anonymiseret anmeldelseskopi dertil?",
+ "report.mute": "Tavsgør",
+ "report.mute_explanation": "Du vil ikke se vedkommendes indlæg, men vedkommende kan stadig se dine og følge dig. Vedkommende vil ikke være bekendt med tavsgørelsen.",
+ "report.next": "Næste",
"report.placeholder": "Yderligere kommentarer",
+ "report.reasons.dislike": "Synes ikke om den/dem",
+ "report.reasons.dislike_description": "Det er ikke noget, man ønsker at se",
+ "report.reasons.other": "Det er noget andet",
+ "report.reasons.other_description": "Problemet passer ikke ind i andre kategorier",
+ "report.reasons.spam": "Det er spam",
+ "report.reasons.spam_description": "Ondsindede links, falsk engagement eller repetitive svar",
+ "report.reasons.violation": "Overtræder serverregler",
+ "report.reasons.violation_description": "Det står klart, at det bryder bestemte regler",
+ "report.rules.subtitle": "Vælg alle relevante",
+ "report.rules.title": "Hvilke regler overtrædes?",
+ "report.statuses.subtitle": "Vælg alle relevante",
+ "report.statuses.title": "Er der indlæg, som kan bekræfte denne anmeldelse?",
"report.submit": "Indsend",
"report.target": "Anmelder {target}",
+ "report.thanks.take_action": "Dette er mulighederne for styring af, hvad man ses på Mastodon:",
+ "report.thanks.take_action_actionable": "Mens dette gennemgås, kan der skrides til handling mod @{name}:",
+ "report.thanks.title": "Ønsker ikke at se dette?",
+ "report.thanks.title_actionable": "Tak for anmeldelsen, der vil blive set nærmere på dette.",
+ "report.unfollow": "Følg ikke længere @{name}",
+ "report.unfollow_explanation": "Denne konto følges. For at ophøre med at se vedkommendes indlæg på hjemmetidslinjen, vælg Følg ikke længere.",
"search.placeholder": "Søg",
"search_popout.search_format": "Avanceret søgeformat",
- "search_popout.tips.full_text": "Simpel tekst returnerer trut, du har skrevet, favoriseret, fremhævede eller som er nævnt i/matcher bruger- og profilnavne samt hashtags.",
+ "search_popout.tips.full_text": "Simpel tekst returnerer indlæg, du har skrevet, favoritmarkeret, boostet eller som er nævnt i/matcher bruger- og profilnavne samt hashtags.",
"search_popout.tips.hashtag": "hashtag",
- "search_popout.tips.status": "trut",
+ "search_popout.tips.status": "indlæg",
"search_popout.tips.text": "Simpel tekst returnerer matchende visnings- og brugernavne samt hashtags",
"search_popout.tips.user": "bruger",
"search_results.accounts": "Personer",
+ "search_results.all": "Alle",
"search_results.hashtags": "Hashtags",
- "search_results.statuses": "Trut",
- "search_results.statuses_fts_disabled": "På denne Mastodon-server er trutsøgning efter deres indhold ikke aktiveret.",
+ "search_results.nothing_found": "Ingen resultater for disse søgeord",
+ "search_results.statuses": "Indlæg",
+ "search_results.statuses_fts_disabled": "Søgning på indlæg efter deres indhold ikke aktiveret på denne Mastodon-server.",
"search_results.total": "{count, number} {count, plural, one {resultat} other {resultater}}",
"status.admin_account": "Åbn modereringsbrugerflade for @{name}",
- "status.admin_status": "Åbn dette trut i modereringsbrugerflade",
+ "status.admin_status": "Åbn dette indlæg i modereringsbrugerfladen",
"status.block": "Blokér @{name}",
- "status.bookmark": "Bogmærke",
+ "status.bookmark": "Bogmærk",
"status.cancel_reblog_private": "Fjern fremhævning",
- "status.cannot_reblog": "Dette indlæg kan ikke fremhæves",
- "status.copy": "Kopiér link til trut",
+ "status.cannot_reblog": "Dette indlæg kan ikke boostes",
+ "status.copy": "Kopiér link til indlæg",
"status.delete": "Slet",
- "status.detailed_status": "Detaljeret konversationsvisning",
+ "status.detailed_status": "Detaljeret samtalevisning",
"status.direct": "Direkte besked til @{name}",
+ "status.edit": "Redigér",
+ "status.edited": "Redigeret {date}",
+ "status.edited_x_times": "Redigeret {count, plural, one {{count} gang} other {{count} gange}}",
"status.embed": "Indlejr",
"status.favourite": "Favorit",
"status.filtered": "Filtreret",
+ "status.history.created": "{name} oprettet {date}",
+ "status.history.edited": "{name} redigeret {date}",
"status.load_more": "Indlæs mere",
"status.media_hidden": "Medie skjult",
"status.mention": "Nævn @{name}",
"status.more": "Mere",
- "status.mute": "Tavsgør @{name}",
- "status.mute_conversation": "Tavsgør konversation",
- "status.open": "Udvid dette trut",
+ "status.mute": "Tystn @{name}",
+ "status.mute_conversation": "Tystn samtale",
+ "status.open": "Udvid dette indlæg",
"status.pin": "Fastgør til profil",
- "status.pinned": "Fastgjort trut",
+ "status.pinned": "Fastgjort indlæg",
"status.read_more": "Læs mere",
"status.reblog": "Fremhæv",
- "status.reblog_private": "Fremhæv med oprindelig synlighed",
- "status.reblogged_by": "{name} fremhævet",
- "status.reblogs.empty": "Ingen har endnu fremhævet dette trut. Når nogen gør, vil det fremgå hér.",
- "status.redraft": "Slet og omskriv",
+ "status.reblog_private": "Boost med oprindelig synlighed",
+ "status.reblogged_by": "{name} boostede",
+ "status.reblogs.empty": "Ingen har endnu boostet dette indlæg. Når nogen gør, vil det fremgå hér.",
+ "status.redraft": "Slet og omformulér",
"status.remove_bookmark": "Fjern bogmærke",
"status.reply": "Besvar",
- "status.replyAll": "Besvar til tråd",
+ "status.replyAll": "Besvar alle",
"status.report": "Anmeld @{name}",
- "status.sensitive_warning": "Sensitivt indhold",
+ "status.sensitive_warning": "Følsomt indhold",
"status.share": "Del",
"status.show_less": "Vis mindre",
"status.show_less_all": "Vis mindre for alle",
@@ -426,11 +485,11 @@
"status.show_more_all": "Vis mere for alle",
"status.show_thread": "Vis tråd",
"status.uncached_media_warning": "Utilgængelig",
- "status.unmute_conversation": "Genaktivér konversation",
+ "status.unmute_conversation": "Genaktivér samtale",
"status.unpin": "Frigør fra profil",
"suggestions.dismiss": "Afvis foreslag",
"suggestions.header": "Du er måske interesseret i…",
- "tabs_bar.federated_timeline": "Forenede",
+ "tabs_bar.federated_timeline": "Fælles",
"tabs_bar.home": "Hjem",
"tabs_bar.local_timeline": "Lokal",
"tabs_bar.notifications": "Notifikationer",
@@ -446,23 +505,23 @@
"timeline_hint.resources.statuses": "Ældre indlæg",
"trends.counter_by_accounts": "{count, plural, one {{counter} person} other {{counter} personer}} taler",
"trends.trending_now": "Hot lige nu",
- "ui.beforeunload": "Dit udkast går tabt, hvis du forlader Mastodon.",
- "units.short.billion": "{count}MI",
- "units.short.million": "{count}M",
- "units.short.thousand": "{count}K",
+ "ui.beforeunload": "Dit udkast går tabt, hvis du lukker Mastodon.",
+ "units.short.billion": "{count} MIA",
+ "units.short.million": "{count} M",
+ "units.short.thousand": "{count} K",
"upload_area.title": "Træk og slip for at uploade",
- "upload_button.label": "Tilføj billeder, en video- eller lydfil",
- "upload_error.limit": "Filuploadgrænse nået.",
+ "upload_button.label": "Tilføj billed-, video- eller lydfil(er)",
+ "upload_error.limit": "Grænse for filupload nået.",
"upload_error.poll": "Filupload ikke tilladt for afstemninger.",
"upload_form.audio_description": "Beskrivelse til hørehæmmede",
"upload_form.description": "Beskrivelse til svagtseende",
"upload_form.edit": "Redigér",
- "upload_form.thumbnail": "Skift miniaturer",
+ "upload_form.thumbnail": "Skift miniature",
"upload_form.undo": "Slet",
"upload_form.video_description": "Beskrivelse for hørehæmmede eller synshandicappede personer",
"upload_modal.analyzing_picture": "Analyserer billede…",
"upload_modal.apply": "Anvend",
- "upload_modal.applying": "Applying…",
+ "upload_modal.applying": "Effektuerer…",
"upload_modal.choose_image": "Vælg billede",
"upload_modal.description_placeholder": "En hurtig brun ræv hopper over den dovne hund",
"upload_modal.detect_text": "Detektér tekst i billede",
@@ -478,7 +537,7 @@
"video.fullscreen": "Fuldskærm",
"video.hide": "Skjul video",
"video.mute": "Tavsgør lyd",
- "video.pause": "Sæt på pause",
+ "video.pause": "Pausér",
"video.play": "Afspil",
"video.unmute": "Fjern lydtavsgørelse"
}
diff --git a/app/javascript/mastodon/locales/de.json b/app/javascript/mastodon/locales/de.json
index edc456992..72c723e2e 100644
--- a/app/javascript/mastodon/locales/de.json
+++ b/app/javascript/mastodon/locales/de.json
@@ -18,12 +18,12 @@
"account.followers": "Follower",
"account.followers.empty": "Diesem Profil folgt noch niemand.",
"account.followers_counter": "{count, plural, one {{counter} Follower} other {{counter} Follower}}",
+ "account.following": "Folgt",
"account.following_counter": "{count, plural, one {{counter} Folgender} other {{counter} Folgende}}",
"account.follows.empty": "Dieses Profil folgt noch niemandem.",
"account.follows_you": "Folgt dir",
"account.hide_reblogs": "Geteilte Beiträge von @{name} verbergen",
"account.joined": "Beigetreten am {date}",
- "account.last_status": "Zuletzt aktiv",
"account.link_verified_on": "Besitz dieses Links wurde geprüft am {date}",
"account.locked_info": "Der Privatsphärenstatus dieses Accounts wurde auf gesperrt gesetzt. Die Person bestimmt manuell wer ihm/ihr folgen darf.",
"account.media": "Medien",
@@ -32,7 +32,6 @@
"account.mute": "@{name} stummschalten",
"account.mute_notifications": "Benachrichtigungen von @{name} stummschalten",
"account.muted": "Stummgeschaltet",
- "account.never_active": "Nie",
"account.posts": "Beiträge",
"account.posts_with_replies": "Beiträge und Antworten",
"account.report": "@{name} melden",
@@ -42,21 +41,24 @@
"account.statuses_counter": "{count, plural, one {{counter} Beitrag} other {{counter} Beiträge}}",
"account.unblock": "@{name} entblocken",
"account.unblock_domain": "{domain} wieder anzeigen",
+ "account.unblock_short": "Blockierung aufheben",
"account.unendorse": "Nicht auf Profil hervorheben",
"account.unfollow": "Entfolgen",
"account.unmute": "@{name} nicht mehr stummschalten",
"account.unmute_notifications": "Benachrichtigungen von @{name} einschalten",
+ "account.unmute_short": "Nicht mehr stummschalten",
"account_note.placeholder": "Notiz durch Klicken hinzufügen",
- "admin.dashboard.retention": "Retention",
- "admin.dashboard.retention.average": "Average",
- "admin.dashboard.retention.cohort": "Sign-up month",
- "admin.dashboard.retention.cohort_size": "New users",
+ "admin.dashboard.daily_retention": "Benutzerverbleibrate nach Tag nach Anmeldung",
+ "admin.dashboard.monthly_retention": "Benutzerverbleibrate nach Monat nach Anmeldung",
+ "admin.dashboard.retention.average": "Durchschnitt",
+ "admin.dashboard.retention.cohort": "Anmeldemonat",
+ "admin.dashboard.retention.cohort_size": "Neue Benutzer",
"alert.rate_limited.message": "Bitte versuche es nach {retry_time, time, medium}.",
"alert.rate_limited.title": "Anfragelimit überschritten",
"alert.unexpected.message": "Ein unerwarteter Fehler ist aufgetreten.",
"alert.unexpected.title": "Hoppla!",
"announcement.announcement": "Ankündigung",
- "attachments_list.unprocessed": "(unprocessed)",
+ "attachments_list.unprocessed": "(unverarbeitet)",
"autosuggest_hashtag.per_week": "{count} pro Woche",
"boost_modal.combo": "Drücke {combo}, um dieses Fenster zu überspringen",
"bundle_column_error.body": "Etwas ist beim Laden schiefgelaufen.",
@@ -104,6 +106,7 @@
"compose_form.poll.switch_to_single": "Umfrage ändern, um eine einzige Wahl zu erlauben",
"compose_form.publish": "Tröt",
"compose_form.publish_loud": "{publish}!",
+ "compose_form.save_changes": "Änderungen speichern",
"compose_form.sensitive.hide": "Medien als NSFW markieren",
"compose_form.sensitive.marked": "Medien sind als NSFW markiert",
"compose_form.sensitive.unmarked": "Medien sind nicht als NSFW markiert",
@@ -118,8 +121,8 @@
"confirmations.delete.message": "Bist du dir sicher, dass du diesen Beitrag löschen möchtest?",
"confirmations.delete_list.confirm": "Löschen",
"confirmations.delete_list.message": "Bist du dir sicher, dass du diese Liste permanent löschen möchtest?",
- "confirmations.discard_edit_media.confirm": "Discard",
- "confirmations.discard_edit_media.message": "You have unsaved changes to the media description or preview, discard them anyway?",
+ "confirmations.discard_edit_media.confirm": "Verwerfen",
+ "confirmations.discard_edit_media.message": "Du hast ungespeicherte Änderungen an der Medienbeschreibung oder der Medienvorschau. Trotzdem verwerfen?",
"confirmations.domain_block.confirm": "Die ganze Domain blockieren",
"confirmations.domain_block.message": "Bist du dir wirklich sicher, dass du die ganze Domain {domain} blockieren willst? In den meisten Fällen reichen ein paar gezielte Blockierungen oder Stummschaltungen aus. Du wirst den Inhalt von dieser Domain nicht in irgendwelchen öffentlichen Timelines oder den Benachrichtigungen finden. Deine Folgenden von dieser Domain werden entfernt.",
"confirmations.logout.confirm": "Abmelden",
@@ -165,6 +168,7 @@
"empty_column.community": "Die lokale Zeitleiste ist leer. Schreibe einen öffentlichen Beitrag, um den Ball ins Rollen zu bringen!",
"empty_column.direct": "Du hast noch keine Direktnachrichten erhalten. Wenn du eine sendest oder empfängst, wird sie hier zu sehen sein.",
"empty_column.domain_blocks": "Es sind noch keine Domains versteckt.",
+ "empty_column.explore_statuses": "Momentan ist nichts im Trend. Schau später wieder!",
"empty_column.favourited_statuses": "Du hast noch keine favorisierten Tröts. Wenn du einen favorisierst, wird er hier erscheinen.",
"empty_column.favourites": "Noch niemand hat diesen Beitrag favorisiert. Sobald es jemand tut, wird das hier angezeigt.",
"empty_column.follow_recommendations": "Es sieht so aus, als könnten keine Vorschläge für dich generiert werden. Du kannst versuchen nach Leuten zu suchen, die du vielleicht kennst oder du kannst angesagte Hashtags erkunden.",
@@ -183,6 +187,12 @@
"error.unexpected_crash.next_steps_addons": "Versuche sie zu deaktivieren und lade dann die Seite neu. Wenn das Problem weiterhin besteht, solltest du Mastodon über einen anderen Browser oder eine native App nutzen.",
"errors.unexpected_crash.copy_stacktrace": "Fehlerlog in die Zwischenablage kopieren",
"errors.unexpected_crash.report_issue": "Problem melden",
+ "explore.search_results": "Suchergebnisse",
+ "explore.suggested_follows": "Für dich",
+ "explore.title": "Entdecken",
+ "explore.trending_links": "Nachrichten",
+ "explore.trending_statuses": "Beiträge",
+ "explore.trending_tags": "Hashtags",
"follow_recommendations.done": "Fertig",
"follow_recommendations.heading": "Folge Leuten, von denen du Beiträge sehen möchtest! Hier sind einige Vorschläge.",
"follow_recommendations.lead": "Beiträge von Personen, denen du folgst, werden in chronologischer Reihenfolge auf deiner Startseite angezeigt. Hab keine Angst, Fehler zu machen, du kannst den Leuten jederzeit wieder entfolgen!",
@@ -284,6 +294,7 @@
"navigation_bar.discover": "Entdecken",
"navigation_bar.domain_blocks": "Versteckte Domains",
"navigation_bar.edit_profile": "Profil bearbeiten",
+ "navigation_bar.explore": "Entdecken",
"navigation_bar.favourites": "Favoriten",
"navigation_bar.filters": "Stummgeschaltene Wörter",
"navigation_bar.follow_requests": "Folgeanfragen",
@@ -298,6 +309,7 @@
"navigation_bar.preferences": "Einstellungen",
"navigation_bar.public_timeline": "Föderierte Zeitleiste",
"navigation_bar.security": "Sicherheit",
+ "notification.admin.sign_up": "{name} hat sich registriert",
"notification.favourite": "{name} hat deinen Beitrag favorisiert",
"notification.follow": "{name} folgt dir",
"notification.follow_request": "{name} möchte dir folgen",
@@ -306,13 +318,15 @@
"notification.poll": "Eine Umfrage in der du abgestimmt hast ist vorbei",
"notification.reblog": "{name} hat deinen Beitrag geteilt",
"notification.status": "{name} hat gerade etwas gepostet",
+ "notification.update": "{name} bearbeitete einen Beitrag",
"notifications.clear": "Mitteilungen löschen",
"notifications.clear_confirmation": "Bist du dir sicher, dass du alle Mitteilungen löschen möchtest?",
+ "notifications.column_settings.admin.sign_up": "Neue Anmeldungen:",
"notifications.column_settings.alert": "Desktop-Benachrichtigungen",
"notifications.column_settings.favourite": "Favorisierungen:",
"notifications.column_settings.filter_bar.advanced": "Zeige alle Kategorien an",
"notifications.column_settings.filter_bar.category": "Schnellfilterleiste",
- "notifications.column_settings.filter_bar.show": "Anzeigen",
+ "notifications.column_settings.filter_bar.show_bar": "Filterleiste anzeigen",
"notifications.column_settings.follow": "Neue Folgende:",
"notifications.column_settings.follow_request": "Neue Folgeanfragen:",
"notifications.column_settings.mention": "Erwähnungen:",
@@ -322,7 +336,9 @@
"notifications.column_settings.show": "In der Spalte anzeigen",
"notifications.column_settings.sound": "Ton abspielen",
"notifications.column_settings.status": "Neue Beiträge:",
- "notifications.column_settings.unread_markers.category": "Ungelesene Benachrichtigungsmarkierungen",
+ "notifications.column_settings.unread_notifications.category": "Ungelesene Benachrichtigungen",
+ "notifications.column_settings.unread_notifications.highlight": "Ungelesene Benachrichtigungen hervorheben",
+ "notifications.column_settings.update": "Bearbeitungen:",
"notifications.filter.all": "Alle",
"notifications.filter.boosts": "Geteilte Beiträge",
"notifications.filter.favourites": "Favorisierungen",
@@ -346,7 +362,7 @@
"poll.total_votes": "{count, plural, one {# Stimme} other {# Stimmen}}",
"poll.vote": "Abstimmen",
"poll.voted": "Du hast dafür gestimmt",
- "poll.votes": "{votes, plural, one {# vote} other {# votes}}",
+ "poll.votes": "{votes, plural, one {# Stimme} other {# Stimmen}}",
"poll_button.add_poll": "Eine Umfrage erstellen",
"poll_button.remove_poll": "Umfrage entfernen",
"privacy.change": "Sichtbarkeit des Beitrags anpassen",
@@ -362,18 +378,54 @@
"regeneration_indicator.label": "Laden…",
"regeneration_indicator.sublabel": "Deine Startseite wird gerade vorbereitet!",
"relative_time.days": "{number}d",
+ "relative_time.full.days": "vor {number, plural, one {# Tag} other {# Tagen}}",
+ "relative_time.full.hours": "vor {number, plural, one {# Stunde} other {# Stunden}}",
+ "relative_time.full.just_now": "gerade eben",
+ "relative_time.full.minutes": "vor {number, plural, one {# Minute} other {# Minuten}}",
+ "relative_time.full.seconds": "vor {number, plural, one {1 Sekunde} other {# Sekunden}}",
"relative_time.hours": "{number}h",
"relative_time.just_now": "jetzt",
"relative_time.minutes": "{number}m",
"relative_time.seconds": "{number}s",
"relative_time.today": "heute",
"reply_indicator.cancel": "Abbrechen",
+ "report.block": "Blockieren",
+ "report.block_explanation": "Du wirst die Beiträge von diesem Konto nicht sehen. Das Konto wird nicht in der Lage sein, deine Beiträge zu sehen oder dir zu folgen. Die Person hinter dem Konto wird wissen, dass du das Konto blockiert hast.",
+ "report.categories.other": "Andere",
+ "report.categories.spam": "Spam",
+ "report.categories.violation": "Inhalt verletzt ein oder mehrere Server-Regeln",
+ "report.category.subtitle": "Wähle die beste Zugehörigkeit",
+ "report.category.title": "Sag uns, was mit diesem {type} vor sich geht",
+ "report.category.title_account": "Profil",
+ "report.category.title_status": "Beitrag",
+ "report.close": "Fertig",
+ "report.comment.title": "Gibt es etwas anderes, was wir wissen sollten?",
"report.forward": "An {target} weiterleiten",
"report.forward_hint": "Dieses Konto ist von einem anderen Server. Soll eine anonymisierte Kopie des Berichts auch dorthin geschickt werden?",
- "report.hint": "Der Bericht wird an die Moderatoren des Servers geschickt. Du kannst hier eine Erklärung angeben, warum du dieses Konto meldest:",
+ "report.mute": "Stummschalten",
+ "report.mute_explanation": "Du wirst die Beiträge vom Konto nicht mehr sehen. Das Konto kann dir immernoch folgen und die Person hinter dem Konto wird deine Beiträge sehen können und nicht wissen, dass du sie stumm geschaltet hast.",
+ "report.next": "Weiter",
"report.placeholder": "Zusätzliche Kommentare",
+ "report.reasons.dislike": "Das gefällt mir nicht",
+ "report.reasons.dislike_description": "Das ist nicht etwas, was ihr nicht sehen wollt",
+ "report.reasons.other": "Da ist was anderes",
+ "report.reasons.other_description": "Das Problem passt nicht in eine der Kategorien",
+ "report.reasons.spam": "Das ist Spam",
+ "report.reasons.spam_description": "Bösartige Links, gefälschtes Engagement oder wiederholte Antworten",
+ "report.reasons.violation": "Es verstößt gegen Serverregeln",
+ "report.reasons.violation_description": "Du weißt, welche Regeln verletzt werden",
+ "report.rules.subtitle": "Alles Zutreffende auswählen",
+ "report.rules.title": "Welche Regeln werden verletzt?",
+ "report.statuses.subtitle": "Alles Zutreffende auswählen",
+ "report.statuses.title": "Gibt es Beiträge, die diesen Bericht unterstützen?",
"report.submit": "Absenden",
"report.target": "{target} melden",
+ "report.thanks.take_action": "Hier sind deine Optionen, die es dir erlauben zu kontrollieren, was du auf Mastodon sehen möchtest:",
+ "report.thanks.take_action_actionable": "Während wir dies überprüfen, kannst du gegen @{name} vorgehen:",
+ "report.thanks.title": "Möchtest du das nicht sehen?",
+ "report.thanks.title_actionable": "Vielen Dank für die Berichterstattung, wir werden uns damit befassen.",
+ "report.unfollow": "@{name} entfolgen",
+ "report.unfollow_explanation": "Du folgst diesem Konto. Um die Beiträge nicht mehr auf deiner Startseite zu sehen, entfolge dem Konto.",
"search.placeholder": "Suche",
"search_popout.search_format": "Fortgeschrittenes Suchformat",
"search_popout.tips.full_text": "Einfache Texteingabe gibt Beiträge, die du geschrieben, favorisiert und geteilt hast zurück. Außerdem auch Beiträge in denen du erwähnt wurdest, aber auch passende Nutzernamen, Anzeigenamen oder Hashtags.",
@@ -382,7 +434,9 @@
"search_popout.tips.text": "Einfache Texteingabe gibt Anzeigenamen, Benutzernamen und Hashtags zurück",
"search_popout.tips.user": "Nutzer",
"search_results.accounts": "Personen",
+ "search_results.all": "Alle",
"search_results.hashtags": "Hashtags",
+ "search_results.nothing_found": "Nichts für diese Suchbegriffe gefunden",
"search_results.statuses": "Beiträge",
"search_results.statuses_fts_disabled": "Die Suche für Beiträge nach ihrem Inhalt ist auf diesem Mastodon-Server deaktiviert.",
"search_results.total": "{count, number} {count, plural, one {Ergebnis} other {Ergebnisse}}",
@@ -396,9 +450,14 @@
"status.delete": "Löschen",
"status.detailed_status": "Detaillierte Ansicht der Konversation",
"status.direct": "Direktnachricht @{name}",
+ "status.edit": "Bearbeiten",
+ "status.edited": "Bearbeitet {date}",
+ "status.edited_x_times": "{count, plural, one {{count} mal} other {{count} mal}} bearbeitet",
"status.embed": "Einbetten",
"status.favourite": "Favorisieren",
"status.filtered": "Gefiltert",
+ "status.history.created": "{name} erstellte {date}",
+ "status.history.edited": "{name} bearbeitete {date}",
"status.load_more": "Weitere laden",
"status.media_hidden": "Medien versteckt",
"status.mention": "@{name} erwähnen",
@@ -462,7 +521,7 @@
"upload_form.video_description": "Beschreibe das Video für Menschen mit einer Hör- oder Sehbehinderung",
"upload_modal.analyzing_picture": "Analysiere Bild…",
"upload_modal.apply": "Übernehmen",
- "upload_modal.applying": "Applying…",
+ "upload_modal.applying": "Anwenden…",
"upload_modal.choose_image": "Bild auswählen",
"upload_modal.description_placeholder": "Die heiße Zypernsonne quälte Max und Victoria ja böse auf dem Weg bis zur Küste",
"upload_modal.detect_text": "Text aus Bild erkennen",
diff --git a/app/javascript/mastodon/locales/defaultMessages.json b/app/javascript/mastodon/locales/defaultMessages.json
index 2c5f5fc74..ff69a8c51 100644
--- a/app/javascript/mastodon/locales/defaultMessages.json
+++ b/app/javascript/mastodon/locales/defaultMessages.json
@@ -79,6 +79,23 @@
],
"path": "app/javascript/mastodon/components/account.json"
},
+ {
+ "descriptors": [
+ {
+ "defaultMessage": "Other",
+ "id": "report.categories.other"
+ },
+ {
+ "defaultMessage": "Spam",
+ "id": "report.categories.spam"
+ },
+ {
+ "defaultMessage": "Content violates one or more server rules",
+ "id": "report.categories.violation"
+ }
+ ],
+ "path": "app/javascript/mastodon/components/admin/ReportReasonSelector.json"
+ },
{
"descriptors": [
{
@@ -98,8 +115,12 @@
"id": "admin.dashboard.retention.average"
},
{
- "defaultMessage": "Retention",
- "id": "admin.dashboard.retention"
+ "defaultMessage": "User retention rate by day after sign-up",
+ "id": "admin.dashboard.daily_retention"
+ },
+ {
+ "defaultMessage": "User retention rate by month after sign-up",
+ "id": "admin.dashboard.monthly_retention"
}
],
"path": "app/javascript/mastodon/components/admin/Retention.json"
@@ -208,6 +229,27 @@
],
"path": "app/javascript/mastodon/components/domain.json"
},
+ {
+ "descriptors": [
+ {
+ "defaultMessage": "Edited {count, plural, one {{count} time} other {{count} times}}",
+ "id": "status.edited_x_times"
+ },
+ {
+ "defaultMessage": "{name} created {date}",
+ "id": "status.history.created"
+ },
+ {
+ "defaultMessage": "{name} edited {date}",
+ "id": "status.history.edited"
+ },
+ {
+ "defaultMessage": "Edited {date}",
+ "id": "status.edited"
+ }
+ ],
+ "path": "app/javascript/mastodon/components/edited_timestamp/index.json"
+ },
{
"descriptors": [
{
@@ -273,15 +315,6 @@
],
"path": "app/javascript/mastodon/components/load_pending.json"
},
- {
- "descriptors": [
- {
- "defaultMessage": "Loading...",
- "id": "loading_indicator.label"
- }
- ],
- "path": "app/javascript/mastodon/components/loading_indicator.json"
- },
{
"descriptors": [
{
@@ -381,22 +414,42 @@
"defaultMessage": "now",
"id": "relative_time.just_now"
},
+ {
+ "defaultMessage": "just now",
+ "id": "relative_time.full.just_now"
+ },
{
"defaultMessage": "{number}s",
"id": "relative_time.seconds"
},
+ {
+ "defaultMessage": "{number, plural, one {# second} other {# seconds}} ago",
+ "id": "relative_time.full.seconds"
+ },
{
"defaultMessage": "{number}m",
"id": "relative_time.minutes"
},
+ {
+ "defaultMessage": "{number, plural, one {# minute} other {# minutes}} ago",
+ "id": "relative_time.full.minutes"
+ },
{
"defaultMessage": "{number}h",
"id": "relative_time.hours"
},
+ {
+ "defaultMessage": "{number, plural, one {# hour} other {# hours}} ago",
+ "id": "relative_time.full.hours"
+ },
{
"defaultMessage": "{number}d",
"id": "relative_time.days"
},
+ {
+ "defaultMessage": "{number, plural, one {# day} other {# days}} ago",
+ "id": "relative_time.full.days"
+ },
{
"defaultMessage": "Moments remaining",
"id": "time_remaining.moments"
@@ -447,6 +500,10 @@
"defaultMessage": "Delete & re-draft",
"id": "status.redraft"
},
+ {
+ "defaultMessage": "Edit",
+ "id": "status.edit"
+ },
{
"defaultMessage": "Direct message @{name}",
"id": "status.direct"
@@ -605,6 +662,10 @@
"defaultMessage": "Direct",
"id": "privacy.direct.short"
},
+ {
+ "defaultMessage": "Edited {date}",
+ "id": "status.edited"
+ },
{
"defaultMessage": "Filtered",
"id": "status.filtered"
@@ -1106,6 +1167,10 @@
{
"defaultMessage": "{publish}!",
"id": "compose_form.publish_loud"
+ },
+ {
+ "defaultMessage": "Save changes",
+ "id": "compose_form.save_changes"
}
],
"path": "app/javascript/mastodon/features/compose/components/compose_form.json"
@@ -1559,30 +1624,38 @@
},
{
"descriptors": [
- {
- "defaultMessage": "Follow",
- "id": "account.follow"
- },
{
"defaultMessage": "Unfollow",
"id": "account.unfollow"
},
{
- "defaultMessage": "Awaiting approval",
+ "defaultMessage": "Follow",
+ "id": "account.follow"
+ },
+ {
+ "defaultMessage": "Cancel follow request",
+ "id": "account.cancel_follow_request"
+ },
+ {
+ "defaultMessage": "Awaiting approval. Click to cancel follow request",
"id": "account.requested"
},
{
- "defaultMessage": "Unblock @{name}",
- "id": "account.unblock"
+ "defaultMessage": "Unblock",
+ "id": "account.unblock_short"
},
{
- "defaultMessage": "Unmute @{name}",
- "id": "account.unmute"
+ "defaultMessage": "Unmute",
+ "id": "account.unmute_short"
},
{
"defaultMessage": "Unfollow",
"id": "confirmations.unfollow.confirm"
},
+ {
+ "defaultMessage": "Edit profile",
+ "id": "account.edit_profile"
+ },
{
"defaultMessage": "Are you sure you want to unfollow {name}?",
"id": "confirmations.unfollow.message"
@@ -1596,12 +1669,8 @@
"id": "account.followers"
},
{
- "defaultMessage": "Never",
- "id": "account.never_active"
- },
- {
- "defaultMessage": "Last active",
- "id": "account.last_status"
+ "defaultMessage": "Following",
+ "id": "account.following"
}
],
"path": "app/javascript/mastodon/features/directory/components/account_card.json"
@@ -1648,6 +1717,69 @@
],
"path": "app/javascript/mastodon/features/domain_blocks/index.json"
},
+ {
+ "descriptors": [
+ {
+ "defaultMessage": "Explore",
+ "id": "explore.title"
+ },
+ {
+ "defaultMessage": "Search results",
+ "id": "explore.search_results"
+ },
+ {
+ "defaultMessage": "Posts",
+ "id": "explore.trending_statuses"
+ },
+ {
+ "defaultMessage": "Hashtags",
+ "id": "explore.trending_tags"
+ },
+ {
+ "defaultMessage": "News",
+ "id": "explore.trending_links"
+ },
+ {
+ "defaultMessage": "For you",
+ "id": "explore.suggested_follows"
+ }
+ ],
+ "path": "app/javascript/mastodon/features/explore/index.json"
+ },
+ {
+ "descriptors": [
+ {
+ "defaultMessage": "Could not find anything for these search terms",
+ "id": "search_results.nothing_found"
+ },
+ {
+ "defaultMessage": "All",
+ "id": "search_results.all"
+ },
+ {
+ "defaultMessage": "People",
+ "id": "search_results.accounts"
+ },
+ {
+ "defaultMessage": "Hashtags",
+ "id": "search_results.hashtags"
+ },
+ {
+ "defaultMessage": "Toots",
+ "id": "search_results.statuses"
+ }
+ ],
+ "path": "app/javascript/mastodon/features/explore/results.json"
+ },
+ {
+ "descriptors": [
+ {
+ "defaultMessage": "Nothing is trending right now. Check back later!",
+ "id": "empty_column.explore_statuses"
+ }
+ ],
+ "path": "app/javascript/mastodon/features/explore/statuses.json"
+ },
{
"descriptors": [
{
@@ -1824,6 +1956,10 @@
"defaultMessage": "Local timeline",
"id": "navigation_bar.community_timeline"
},
+ {
+ "defaultMessage": "Explore",
+ "id": "navigation_bar.explore"
+ },
{
"defaultMessage": "Direct messages",
"id": "navigation_bar.direct"
@@ -1879,10 +2015,6 @@
{
"defaultMessage": "Getting started",
"id": "getting_started.heading"
- },
- {
- "defaultMessage": "Profile directory",
- "id": "getting_started.directory"
}
],
"path": "app/javascript/mastodon/features/getting_started/index.json"
@@ -2334,6 +2466,14 @@
{
"defaultMessage": "New toots:",
"id": "notifications.column_settings.status"
+ },
+ {
+ "defaultMessage": "Edits:",
+ "id": "notifications.column_settings.update"
+ },
+ {
+ "defaultMessage": "New sign-ups:",
+ "id": "notifications.column_settings.admin.sign_up"
}
],
"path": "app/javascript/mastodon/features/notifications/components/column_settings.json"
@@ -2419,6 +2559,14 @@
"defaultMessage": "{name} just posted",
"id": "notification.status"
},
+ {
+ "defaultMessage": "{name} edited a post",
+ "id": "notification.update"
+ },
+ {
+ "defaultMessage": "{name} signed up",
+ "id": "notification.admin.sign_up"
+ },
{
"defaultMessage": "{name} has requested to follow you",
"id": "notification.follow_request"
@@ -2583,6 +2731,191 @@
],
"path": "app/javascript/mastodon/features/reblogs/index.json"
},
+ {
+ "descriptors": [
+ {
+ "defaultMessage": "I don't like it",
+ "id": "report.reasons.dislike"
+ },
+ {
+ "defaultMessage": "It is not something you want to see",
+ "id": "report.reasons.dislike_description"
+ },
+ {
+ "defaultMessage": "It's spam",
+ "id": "report.reasons.spam"
+ },
+ {
+ "defaultMessage": "Malicious links, fake engagement, or repetitive replies",
+ "id": "report.reasons.spam_description"
+ },
+ {
+ "defaultMessage": "It violates server rules",
+ "id": "report.reasons.violation"
+ },
+ {
+ "defaultMessage": "You are aware that it breaks specific rules",
+ "id": "report.reasons.violation_description"
+ },
+ {
+ "defaultMessage": "It's something else",
+ "id": "report.reasons.other"
+ },
+ {
+ "defaultMessage": "The issue does not fit into other categories",
+ "id": "report.reasons.other_description"
+ },
+ {
+ "defaultMessage": "post",
+ "id": "report.category.title_status"
+ },
+ {
+ "defaultMessage": "profile",
+ "id": "report.category.title_account"
+ },
+ {
+ "defaultMessage": "Tell us what's going on with this {type}",
+ "id": "report.category.title"
+ },
+ {
+ "defaultMessage": "Choose the best match",
+ "id": "report.category.subtitle"
+ },
+ {
+ "defaultMessage": "Next",
+ "id": "report.next"
+ }
+ ],
+ "path": "app/javascript/mastodon/features/report/category.json"
+ },
+ {
+ "descriptors": [
+ {
+ "defaultMessage": "Type or paste additional comments",
+ "id": "report.placeholder"
+ },
+ {
+ "defaultMessage": "Is there anything else you think we should know?",
+ "id": "report.comment.title"
+ },
+ {
+ "defaultMessage": "The account is from another server. Send an anonymized copy of the report there as well?",
+ "id": "report.forward_hint"
+ },
+ {
+ "defaultMessage": "Forward to {target}",
+ "id": "report.forward"
+ },
+ {
+ "defaultMessage": "Submit report",
+ "id": "report.submit"
+ }
+ ],
+ "path": "app/javascript/mastodon/features/report/comment.json"
+ },
+ {
+ "descriptors": [
+ {
+ "defaultMessage": "Which rules are being violated?",
+ "id": "report.rules.title"
+ },
+ {
+ "defaultMessage": "Select all that apply",
+ "id": "report.rules.subtitle"
+ },
+ {
+ "defaultMessage": "Next",
+ "id": "report.next"
+ }
+ ],
+ "path": "app/javascript/mastodon/features/report/rules.json"
+ },
+ {
+ "descriptors": [
+ {
+ "defaultMessage": "Are there any posts that back up this report?",
+ "id": "report.statuses.title"
+ },
+ {
+ "defaultMessage": "Select all that apply",
+ "id": "report.statuses.subtitle"
+ },
+ {
+ "defaultMessage": "Next",
+ "id": "report.next"
+ }
+ ],
+ "path": "app/javascript/mastodon/features/report/statuses.json"
+ },
+ {
+ "descriptors": [
+ {
+ "defaultMessage": "Thanks for reporting, we'll look into this.",
+ "id": "report.thanks.title_actionable"
+ },
+ {
+ "defaultMessage": "Don't want to see this?",
+ "id": "report.thanks.title"
+ },
+ {
+ "defaultMessage": "While we review this, you can take action against @{name}:",
+ "id": "report.thanks.take_action_actionable"
+ },
+ {
+ "defaultMessage": "Here are your options for controlling what you see on Mastodon:",
+ "id": "report.thanks.take_action"
+ },
+ {
+ "defaultMessage": "Unfollow @{name}",
+ "id": "report.unfollow"
+ },
+ {
+ "defaultMessage": "You are following this account. To not see their posts in your home feed anymore, unfollow them.",
+ "id": "report.unfollow_explanation"
+ },
+ {
+ "defaultMessage": "Unfollow",
+ "id": "account.unfollow"
+ },
+ {
+ "defaultMessage": "Mute @{name}",
+ "id": "account.mute"
+ },
+ {
+ "defaultMessage": "You will not see their posts. They can still follow you and see your posts and will not know that they are muted.",
+ "id": "report.mute_explanation"
+ },
+ {
+ "defaultMessage": "Mute",
+ "id": "report.mute"
+ },
+ {
+ "defaultMessage": "Muted",
+ "id": "account.muted"
+ },
+ {
+ "defaultMessage": "Block @{name}",
+ "id": "account.block"
+ },
+ {
+ "defaultMessage": "You will not see their posts. They will not be able to see your posts or follow you. They will be able to tell that they are blocked.",
+ "id": "report.block_explanation"
+ },
+ {
+ "defaultMessage": "Block",
+ "id": "report.block"
+ },
+ {
+ "defaultMessage": "Blocked",
+ "id": "account.blocked"
+ },
+ {
+ "defaultMessage": "Done",
+ "id": "report.close"
+ }
+ ],
+ "path": "app/javascript/mastodon/features/report/thanks.json"
+ },
{
"descriptors": [
{
@@ -2593,6 +2926,10 @@
"defaultMessage": "Delete & re-draft",
"id": "status.redraft"
},
+ {
+ "defaultMessage": "Edit",
+ "id": "status.edit"
+ },
{
"defaultMessage": "Direct message @{name}",
"id": "status.direct"
@@ -2918,6 +3255,19 @@
],
"path": "app/javascript/mastodon/features/ui/components/columns_area.json"
},
+ {
+ "descriptors": [
+ {
+ "defaultMessage": "{name} created {date}",
+ "id": "status.history.created"
+ },
+ {
+ "defaultMessage": "{name} edited {date}",
+ "id": "status.history.edited"
+ }
+ ],
+ "path": "app/javascript/mastodon/features/ui/components/compare_history_modal.json"
+ },
{
"descriptors": [
{
@@ -3056,6 +3406,10 @@
"defaultMessage": "About this server",
"id": "navigation_bar.info"
},
+ {
+ "defaultMessage": "Profile directory",
+ "id": "getting_started.directory"
+ },
{
"defaultMessage": "Mobile apps",
"id": "navigation_bar.apps"
@@ -3155,6 +3509,10 @@
"defaultMessage": "Notifications",
"id": "tabs_bar.notifications"
},
+ {
+ "defaultMessage": "Explore",
+ "id": "explore.title"
+ },
{
"defaultMessage": "Local",
"id": "tabs_bar.local_timeline"
@@ -3179,10 +3537,6 @@
"defaultMessage": "Lists",
"id": "navigation_bar.lists"
},
- {
- "defaultMessage": "Profile directory",
- "id": "getting_started.directory"
- },
{
"defaultMessage": "Preferences",
"id": "navigation_bar.preferences"
@@ -3200,29 +3554,9 @@
"defaultMessage": "Close",
"id": "lightbox.close"
},
- {
- "defaultMessage": "Additional comments",
- "id": "report.placeholder"
- },
- {
- "defaultMessage": "Submit",
- "id": "report.submit"
- },
{
"defaultMessage": "Report {target}",
"id": "report.target"
- },
- {
- "defaultMessage": "The report will be sent to your server moderators. You can provide an explanation of why you are reporting this account below:",
- "id": "report.hint"
- },
- {
- "defaultMessage": "The account is from another server. Send an anonymized copy of the report there as well?",
- "id": "report.forward_hint"
- },
- {
- "defaultMessage": "Forward to {target}",
- "id": "report.forward"
}
],
"path": "app/javascript/mastodon/features/ui/components/report_modal.json"
diff --git a/app/javascript/mastodon/locales/el.json b/app/javascript/mastodon/locales/el.json
index 10e08cf97..3c797d47d 100644
--- a/app/javascript/mastodon/locales/el.json
+++ b/app/javascript/mastodon/locales/el.json
@@ -18,12 +18,12 @@
"account.followers": "Ακόλουθοι",
"account.followers.empty": "Κανείς δεν ακολουθεί αυτό τον χρήστη ακόμα.",
"account.followers_counter": "{count, plural, one {{counter} Ακόλουθος} other {{counter} Ακόλουθοι}}",
+ "account.following": "Following",
"account.following_counter": "{count, plural, other {{counter} Ακολουθεί}}",
"account.follows.empty": "Αυτός ο χρήστης δεν ακολουθεί κανέναν ακόμα.",
"account.follows_you": "Σε ακολουθεί",
"account.hide_reblogs": "Απόκρυψη προωθήσεων από @{name}",
"account.joined": "Μέλος από τις {date}",
- "account.last_status": "Τελευταία δραστηριότητα",
"account.link_verified_on": "Η ιδιοκτησία αυτού του συνδέσμου ελέχθηκε την {date}",
"account.locked_info": "Η κατάσταση απορρήτου αυτού του λογαριασμού είναι κλειδωμένη. Ο ιδιοκτήτης επιβεβαιώνει χειροκίνητα ποιος μπορεί να τον ακολουθήσει.",
"account.media": "Πολυμέσα",
@@ -32,7 +32,6 @@
"account.mute": "Σώπασε @{name}",
"account.mute_notifications": "Σώπασε τις ειδοποιήσεις από @{name}",
"account.muted": "Αποσιωπημένος/η",
- "account.never_active": "Ποτέ",
"account.posts": "Τουτ",
"account.posts_with_replies": "Τουτ και απαντήσεις",
"account.report": "Κατάγγειλε @{name}",
@@ -42,21 +41,24 @@
"account.statuses_counter": "{count, plural, one {{counter} Τουτ} other {{counter} Τουτ}}",
"account.unblock": "Ξεμπλόκαρε @{name}",
"account.unblock_domain": "Αποκάλυψε το {domain}",
+ "account.unblock_short": "Ξεμπλοκάρισμα",
"account.unendorse": "Άνευ προβολής στο προφίλ",
"account.unfollow": "Διακοπή παρακολούθησης",
"account.unmute": "Διακοπή αποσιώπησης @{name}",
"account.unmute_notifications": "Διακοπή αποσιώπησης ειδοποιήσεων του/της @{name}",
+ "account.unmute_short": "Κατάργηση σίγασης",
"account_note.placeholder": "Κλικ για να βάλεις σημείωση",
- "admin.dashboard.retention": "Retention",
+ "admin.dashboard.daily_retention": "User retention rate by day after sign-up",
+ "admin.dashboard.monthly_retention": "User retention rate by month after sign-up",
"admin.dashboard.retention.average": "Average",
- "admin.dashboard.retention.cohort": "Sign-up month",
- "admin.dashboard.retention.cohort_size": "New users",
+ "admin.dashboard.retention.cohort": "Μήνας εγγραφής",
+ "admin.dashboard.retention.cohort_size": "Νέοι χρήστες",
"alert.rate_limited.message": "Παρακαλούμε δοκίμασε ξανά αφού περάσει η {retry_time, time, medium}.",
"alert.rate_limited.title": "Περιορισμός συχνότητας",
"alert.unexpected.message": "Προέκυψε απροσδόκητο σφάλμα.",
"alert.unexpected.title": "Εεπ!",
"announcement.announcement": "Ανακοίνωση",
- "attachments_list.unprocessed": "(unprocessed)",
+ "attachments_list.unprocessed": "(μη επεξεργασμένο)",
"autosuggest_hashtag.per_week": "{count} ανα εβδομάδα",
"boost_modal.combo": "Μπορείς να πατήσεις {combo} για να το προσπεράσεις αυτό την επόμενη φορά",
"bundle_column_error.body": "Κάτι πήγε στραβά ενώ φορτωνόταν αυτό το στοιχείο.",
@@ -104,6 +106,7 @@
"compose_form.poll.switch_to_single": "Ενημέρωση δημοσκόπησης με μοναδική επιλογή",
"compose_form.publish": "Τουτ",
"compose_form.publish_loud": "{publish}!",
+ "compose_form.save_changes": "Αποθήκευση αλλαγών",
"compose_form.sensitive.hide": "Σημείωσε τα πολυμέσα ως ευαίσθητα",
"compose_form.sensitive.marked": "Το πολυμέσο έχει σημειωθεί ως ευαίσθητο",
"compose_form.sensitive.unmarked": "Το πολυμέσο δεν έχει σημειωθεί ως ευαίσθητο",
@@ -118,8 +121,8 @@
"confirmations.delete.message": "Σίγουρα θες να διαγράψεις αυτή τη δημοσίευση;",
"confirmations.delete_list.confirm": "Διέγραψε",
"confirmations.delete_list.message": "Σίγουρα θες να διαγράψεις οριστικά αυτή τη λίστα;",
- "confirmations.discard_edit_media.confirm": "Discard",
- "confirmations.discard_edit_media.message": "You have unsaved changes to the media description or preview, discard them anyway?",
+ "confirmations.discard_edit_media.confirm": "Απόρριψη",
+ "confirmations.discard_edit_media.message": "Έχετε μη αποθηκευμένες αλλαγές στην περιγραφή πολυμέσων ή στην προεπισκόπηση, απορρίψτε τις ούτως ή άλλως;",
"confirmations.domain_block.confirm": "Απόκρυψη ολόκληρου του τομέα",
"confirmations.domain_block.message": "Σίγουρα θες να μπλοκάρεις ολόκληρο το {domain}; Συνήθως μερικά εστιασμένα μπλοκ ή αποσιωπήσεις επαρκούν και προτιμούνται. Δεν θα βλέπεις περιεχόμενο από αυτό τον κόμβο σε καμία δημόσια ροή, ούτε στις ειδοποιήσεις σου. Όσους ακόλουθους έχεις αυτό αυτό τον κόμβο θα αφαιρεθούν.",
"confirmations.logout.confirm": "Αποσύνδεση",
@@ -165,6 +168,7 @@
"empty_column.community": "Η τοπική ροή είναι κενή. Γράψε κάτι δημόσιο παραμύθι ν' αρχινίσει!",
"empty_column.direct": "Δεν έχεις προσωπικά μηνύματα ακόμα. Όταν στείλεις ή λάβεις κανένα, θα εμφανιστεί εδώ.",
"empty_column.domain_blocks": "Δεν υπάρχουν αποκλεισμένοι τομείς ακόμα.",
+ "empty_column.explore_statuses": "Nothing is trending right now. Check back later!",
"empty_column.favourited_statuses": "Δεν έχεις κανένα αγαπημένο τουτ ακόμα. Μόλις αγαπήσεις κάποιο, θα εμφανιστεί εδώ.",
"empty_column.favourites": "Κανείς δεν έχει αγαπήσει αυτό το τουτ ακόμα. Μόλις το κάνει κάποια, θα εμφανιστούν εδώ.",
"empty_column.follow_recommendations": "Looks like no suggestions could be generated for you. You can try using search to look for people you might know or explore trending hashtags.",
@@ -183,6 +187,12 @@
"error.unexpected_crash.next_steps_addons": "Δοκίμασε να τα απενεργοποιήσεις και ανανέωσε τη σελίδα. Αν αυτό δεν βοηθήσει, ίσως να μπορέσεις να χρησιμοποιήσεις το Mastodon μέσω διαφορετικού φυλλομετρητή ή κάποιας εφαρμογής.",
"errors.unexpected_crash.copy_stacktrace": "Αντιγραφή μηνυμάτων κώδικα στο πρόχειρο",
"errors.unexpected_crash.report_issue": "Αναφορά προβλήματος",
+ "explore.search_results": "Search results",
+ "explore.suggested_follows": "Για σένα",
+ "explore.title": "Εξερεύνηση",
+ "explore.trending_links": "Νέα",
+ "explore.trending_statuses": "Αναρτήσεις",
+ "explore.trending_tags": "Ετικέτες",
"follow_recommendations.done": "Ολοκληρώθηκε",
"follow_recommendations.heading": "Ακολουθήστε άτομα από τα οποία θα θέλατε να βλέπετε δημοσιεύσεις! Ορίστε μερικές προτάσεις.",
"follow_recommendations.lead": "Οι αναρτήσεις των ατόμων που ακολουθείτε θα εμφανίζονται με χρονολογική σειρά στη ροή σας. Μη φοβάστε να κάνετε λάθη, καθώς μπορείτε πολύ εύκολα να σταματήσετε να ακολουθείτε άλλα άτομα οποιαδήποτε στιγμή!",
@@ -284,6 +294,7 @@
"navigation_bar.discover": "Ανακάλυψη",
"navigation_bar.domain_blocks": "Κρυμμένοι τομείς",
"navigation_bar.edit_profile": "Επεξεργασία προφίλ",
+ "navigation_bar.explore": "Εξερεύνηση",
"navigation_bar.favourites": "Αγαπημένα",
"navigation_bar.filters": "Αποσιωπημένες λέξεις",
"navigation_bar.follow_requests": "Αιτήματα ακολούθησης",
@@ -298,6 +309,7 @@
"navigation_bar.preferences": "Προτιμήσεις",
"navigation_bar.public_timeline": "Ομοσπονδιακή ροή",
"navigation_bar.security": "Ασφάλεια",
+ "notification.admin.sign_up": "{name} έχει εγγραφεί",
"notification.favourite": "Ο/Η {name} σημείωσε ως αγαπημένη την κατάστασή σου",
"notification.follow": "Ο/Η {name} σε ακολούθησε",
"notification.follow_request": "Ο/H {name} ζήτησε να σε παρακολουθεί",
@@ -306,13 +318,15 @@
"notification.poll": "Τελείωσε μια από τις ψηφοφορίες που συμμετείχες",
"notification.reblog": "Ο/Η {name} προώθησε την κατάστασή σου",
"notification.status": "Ο/Η {name} μόλις έγραψε κάτι",
+ "notification.update": "{name} επεξεργάστηκε μια δημοσίευση",
"notifications.clear": "Καθαρισμός ειδοποιήσεων",
"notifications.clear_confirmation": "Σίγουρα θέλεις να καθαρίσεις όλες τις ειδοποιήσεις σου;",
+ "notifications.column_settings.admin.sign_up": "Νέες εγγραφές:",
"notifications.column_settings.alert": "Ειδοποιήσεις επιφάνειας εργασίας",
"notifications.column_settings.favourite": "Αγαπημένα:",
"notifications.column_settings.filter_bar.advanced": "Εμφάνιση όλων των κατηγοριών",
"notifications.column_settings.filter_bar.category": "Μπάρα γρήγορου φίλτρου",
- "notifications.column_settings.filter_bar.show": "Εμφάνιση",
+ "notifications.column_settings.filter_bar.show_bar": "Εμφάνιση μπάρας φίλτρου",
"notifications.column_settings.follow": "Νέοι ακόλουθοι:",
"notifications.column_settings.follow_request": "Νέο αίτημα παρακολούθησης:",
"notifications.column_settings.mention": "Αναφορές:",
@@ -322,7 +336,9 @@
"notifications.column_settings.show": "Εμφάνισε σε στήλη",
"notifications.column_settings.sound": "Ηχητική ειδοποίηση",
"notifications.column_settings.status": "Νέα τουτ:",
- "notifications.column_settings.unread_markers.category": "Δείκτες μη αναγνωσμένων ειδοποιήσεων",
+ "notifications.column_settings.unread_notifications.category": "Μη αναγνωσμένες ειδοποιήσεις",
+ "notifications.column_settings.unread_notifications.highlight": "Επισήμανση μη αναγνωσμένων ειδοποιήσεων",
+ "notifications.column_settings.update": "Επεξεργασίες:",
"notifications.filter.all": "Όλες",
"notifications.filter.boosts": "Προωθήσεις",
"notifications.filter.favourites": "Αγαπημένα",
@@ -346,7 +362,7 @@
"poll.total_votes": "{count, plural, one {# ψήφος} other {# ψήφοι}}",
"poll.vote": "Ψήφισε",
"poll.voted": "Ψηφίσατε αυτήν την απάντηση",
- "poll.votes": "{votes, plural, one {# vote} other {# votes}}",
+ "poll.votes": "{votes, plural, one {# ψήφος} other {# ψήφοι}}",
"poll_button.add_poll": "Προσθήκη δημοσκόπησης",
"poll_button.remove_poll": "Αφαίρεση δημοσκόπησης",
"privacy.change": "Προσαρμογή ιδιωτικότητας δημοσίευσης",
@@ -362,18 +378,54 @@
"regeneration_indicator.label": "Φορτώνει…",
"regeneration_indicator.sublabel": "Η αρχική σου ροή ετοιμάζεται!",
"relative_time.days": "{number}η",
+ "relative_time.full.days": "{number, plural, one {# day} other {# days}} ago",
+ "relative_time.full.hours": "{number, plural, one {# hour} other {# hours}} ago",
+ "relative_time.full.just_now": "μόλις τώρα",
+ "relative_time.full.minutes": "{number, plural, one {# minute} other {# minutes}} ago",
+ "relative_time.full.seconds": "{number, plural, one {# second} other {# seconds}} ago",
"relative_time.hours": "{number}ω",
"relative_time.just_now": "τώρα",
"relative_time.minutes": "{number}λ",
"relative_time.seconds": "{number}δ",
"relative_time.today": "σήμερα",
"reply_indicator.cancel": "Άκυρο",
+ "report.block": "Αποκλεισμός",
+ "report.block_explanation": "You will not see their posts. They will not be able to see your posts or follow you. They will be able to tell that they are blocked.",
+ "report.categories.other": "Άλλες",
+ "report.categories.spam": "Ανεπιθύμητα",
+ "report.categories.violation": "Το περιεχόμενο παραβιάζει έναν ή περισσότερους κανόνες διακομιστή",
+ "report.category.subtitle": "Choose the best match",
+ "report.category.title": "Tell us what's going on with this {type}",
+ "report.category.title_account": "προφίλ",
+ "report.category.title_status": "ανάρτηση",
+ "report.close": "Τέλος",
+ "report.comment.title": "Υπάρχει κάτι άλλο που νομίζετε ότι θα πρέπει να γνωρίζουμε;",
"report.forward": "Προώθηση προς {target}",
"report.forward_hint": "Ο λογαριασμός είναι από διαφορετικό διακομιστή. Να σταλεί ανώνυμο αντίγραφο της καταγγελίας κι εκεί;",
- "report.hint": "Η καταγγελία θα σταλεί στους διαχειριστές του κόμβου σου. Μπορείς να περιγράψεις γιατί καταγγέλεις αυτόν το λογαριασμό παρακάτω:",
+ "report.mute": "Σίγαση",
+ "report.mute_explanation": "You will not see their posts. They can still follow you and see your posts and will not know that they are muted.",
+ "report.next": "Επόμενη",
"report.placeholder": "Επιπλέον σχόλια",
+ "report.reasons.dislike": "Δεν μου αρέσει",
+ "report.reasons.dislike_description": "It is not something you want to see",
+ "report.reasons.other": "It's something else",
+ "report.reasons.other_description": "The issue does not fit into other categories",
+ "report.reasons.spam": "It's spam",
+ "report.reasons.spam_description": "Malicious links, fake engagement, or repetitive replies",
+ "report.reasons.violation": "It violates server rules",
+ "report.reasons.violation_description": "You are aware that it breaks specific rules",
+ "report.rules.subtitle": "Select all that apply",
+ "report.rules.title": "Which rules are being violated?",
+ "report.statuses.subtitle": "Select all that apply",
+ "report.statuses.title": "Are there any posts that back up this report?",
"report.submit": "Υποβολή",
"report.target": "Καταγγελία {target}",
+ "report.thanks.take_action": "Here are your options for controlling what you see on Mastodon:",
+ "report.thanks.take_action_actionable": "While we review this, you can take action against @{name}:",
+ "report.thanks.title": "Don't want to see this?",
+ "report.thanks.title_actionable": "Thanks for reporting, we'll look into this.",
+ "report.unfollow": "Unfollow @{name}",
+ "report.unfollow_explanation": "You are following this account. To not see their posts in your home feed anymore, unfollow them.",
"search.placeholder": "Αναζήτηση",
"search_popout.search_format": "Προχωρημένη αναζήτηση",
"search_popout.tips.full_text": "Απλό κείμενο που επιστρέφει καταστάσεις που έχεις γράψει, έχεις σημειώσει ως αγαπημένες, έχεις προωθήσει ή έχεις αναφερθεί σε αυτές, καθώς και όσα ονόματα χρηστών και ετικέτες ταιριάζουν.",
@@ -382,7 +434,9 @@
"search_popout.tips.text": "Απλό κείμενο που επιστρέφει ονόματα και ετικέτες που ταιριάζουν",
"search_popout.tips.user": "χρήστης",
"search_results.accounts": "Άνθρωποι",
+ "search_results.all": "Όλα",
"search_results.hashtags": "Ετικέτες",
+ "search_results.nothing_found": "Could not find anything for these search terms",
"search_results.statuses": "Τουτ",
"search_results.statuses_fts_disabled": "Η αναζήτηση τουτ βάσει του περιεχόμενού τους δεν είναι ενεργοποιημένη σε αυτό τον κόμβο.",
"search_results.total": "{count, number} {count, plural, zero {αποτελέσματα} one {αποτέλεσμα} other {αποτελέσματα}}",
@@ -396,9 +450,14 @@
"status.delete": "Διαγραφή",
"status.detailed_status": "Προβολή λεπτομερειών συζήτησης",
"status.direct": "Προσωπικό μήνυμα προς @{name}",
+ "status.edit": "Επεξεργασία",
+ "status.edited": "Επεξεργάστηκε στις {date}",
+ "status.edited_x_times": "Edited {count, plural, one {{count} time} other {{count} times}}",
"status.embed": "Ενσωμάτωσε",
"status.favourite": "Σημείωσε ως αγαπημένο",
"status.filtered": "Φιλτραρισμένα",
+ "status.history.created": "{name} created {date}",
+ "status.history.edited": "{name} edited {date}",
"status.load_more": "Φόρτωσε περισσότερα",
"status.media_hidden": "Κρυμμένο πολυμέσο",
"status.mention": "Ανέφερε τον/την @{name}",
@@ -462,7 +521,7 @@
"upload_form.video_description": "Περιγραφή για άτομα με προβλήματα ακοής ή όρασης",
"upload_modal.analyzing_picture": "Ανάλυση εικόνας…",
"upload_modal.apply": "Εφαρμογή",
- "upload_modal.applying": "Applying…",
+ "upload_modal.applying": "Εφαρμογή…",
"upload_modal.choose_image": "Επιλογή εικόνας",
"upload_modal.description_placeholder": "Λύκος μαύρος και ισχνός του πατέρα του καημός",
"upload_modal.detect_text": "Αναγνώριση κειμένου από την εικόνα",
diff --git a/app/javascript/mastodon/locales/en.json b/app/javascript/mastodon/locales/en.json
index 9b18659dc..30acb054e 100644
--- a/app/javascript/mastodon/locales/en.json
+++ b/app/javascript/mastodon/locales/en.json
@@ -18,12 +18,12 @@
"account.followers": "Followers",
"account.followers.empty": "No one follows this user yet.",
"account.followers_counter": "{count, plural, one {{counter} Follower} other {{counter} Followers}}",
+ "account.following": "Following",
"account.following_counter": "{count, plural, one {{counter} Following} other {{counter} Following}}",
"account.follows.empty": "This user doesn't follow anyone yet.",
"account.follows_you": "Follows you",
"account.hide_reblogs": "Hide boosts from @{name}",
"account.joined": "Joined {date}",
- "account.last_status": "Last active",
"account.link_verified_on": "Ownership of this link was checked on {date}",
"account.locked_info": "This account privacy status is set to locked. The owner manually reviews who can follow them.",
"account.media": "Media",
@@ -32,7 +32,6 @@
"account.mute": "Mute @{name}",
"account.mute_notifications": "Mute notifications from @{name}",
"account.muted": "Muted",
- "account.never_active": "Never",
"account.posts": "Posts",
"account.posts_with_replies": "Posts and replies",
"account.report": "Report @{name}",
@@ -42,12 +41,15 @@
"account.statuses_counter": "{count, plural, one {{counter} Post} other {{counter} Posts}}",
"account.unblock": "Unblock @{name}",
"account.unblock_domain": "Unblock domain {domain}",
+ "account.unblock_short": "Unblock",
"account.unendorse": "Don't feature on profile",
"account.unfollow": "Unfollow",
"account.unmute": "Unmute @{name}",
"account.unmute_notifications": "Unmute notifications from @{name}",
+ "account.unmute_short": "Unmute",
"account_note.placeholder": "Click to add note",
- "admin.dashboard.retention": "Retention",
+ "admin.dashboard.daily_retention": "User retention rate by day after sign-up",
+ "admin.dashboard.monthly_retention": "User retention rate by month after sign-up",
"admin.dashboard.retention.average": "Average",
"admin.dashboard.retention.cohort": "Sign-up month",
"admin.dashboard.retention.cohort_size": "New users",
@@ -108,6 +110,7 @@
"compose_form.poll.switch_to_single": "Change poll to allow for a single choice",
"compose_form.publish": "Toot",
"compose_form.publish_loud": "{publish}!",
+ "compose_form.save_changes": "Save changes",
"compose_form.sensitive.hide": "{count, plural, one {Mark media as sensitive} other {Mark media as sensitive}}",
"compose_form.sensitive.marked": "{count, plural, one {Media is marked as sensitive} other {Media is marked as sensitive}}",
"compose_form.sensitive.unmarked": "{count, plural, one {Media is not marked as sensitive} other {Media is not marked as sensitive}}",
@@ -169,6 +172,7 @@
"empty_column.community": "The local timeline is empty. Write something publicly to get the ball rolling!",
"empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.",
"empty_column.domain_blocks": "There are no blocked domains yet.",
+ "empty_column.explore_statuses": "Nothing is trending right now. Check back later!",
"empty_column.favourited_statuses": "You don't have any favourite posts yet. When you favourite one, it will show up here.",
"empty_column.favourites": "No one has favourited this post yet. When someone does, they will show up here.",
"empty_column.follow_recommendations": "Looks like no suggestions could be generated for you. You can try using search to look for people you might know or explore trending hashtags.",
@@ -187,6 +191,12 @@
"error.unexpected_crash.next_steps_addons": "Try disabling them and refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
"errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard",
"errors.unexpected_crash.report_issue": "Report issue",
+ "explore.search_results": "Search results",
+ "explore.suggested_follows": "For you",
+ "explore.title": "Explore",
+ "explore.trending_links": "News",
+ "explore.trending_statuses": "Posts",
+ "explore.trending_tags": "Hashtags",
"follow_recommendations.done": "Done",
"follow_recommendations.heading": "Follow people you'd like to see posts from! Here are some suggestions.",
"follow_recommendations.lead": "Posts from people you follow will show up in chronological order on your home feed. Don't be afraid to make mistakes, you can unfollow people just as easily any time!",
@@ -288,6 +298,7 @@
"navigation_bar.discover": "Discover",
"navigation_bar.domain_blocks": "Blocked domains",
"navigation_bar.edit_profile": "Edit profile",
+ "navigation_bar.explore": "Explore",
"navigation_bar.favourites": "Favourites",
"navigation_bar.filters": "Muted words",
"navigation_bar.follow_requests": "Follow requests",
@@ -303,6 +314,7 @@
"navigation_bar.preferences": "Preferences",
"navigation_bar.public_timeline": "Federated timeline",
"navigation_bar.security": "Security",
+ "notification.admin.sign_up": "{name} signed up",
"notification.favourite": "{name} favourited your post",
"notification.follow": "{name} followed you",
"notification.follow_request": "{name} has requested to follow you",
@@ -311,8 +323,10 @@
"notification.poll": "A poll you have voted in has ended",
"notification.reblog": "{name} boosted your post",
"notification.status": "{name} just posted",
+ "notification.update": "{name} edited a post",
"notifications.clear": "Clear notifications",
"notifications.clear_confirmation": "Are you sure you want to permanently clear all your notifications?",
+ "notifications.column_settings.admin.sign_up": "New sign-ups:",
"notifications.column_settings.alert": "Desktop notifications",
"notifications.column_settings.favourite": "Favourites:",
"notifications.column_settings.filter_bar.advanced": "Display all categories",
@@ -329,6 +343,7 @@
"notifications.column_settings.status": "New posts:",
"notifications.column_settings.unread_notifications.category": "Unread notifications",
"notifications.column_settings.unread_notifications.highlight": "Highlight unread notifications",
+ "notifications.column_settings.update": "Edits:",
"notifications.filter.all": "All",
"notifications.filter.boosts": "Boosts",
"notifications.filter.favourites": "Favourites",
@@ -368,18 +383,54 @@
"regeneration_indicator.label": "Loading…",
"regeneration_indicator.sublabel": "Your home feed is being prepared!",
"relative_time.days": "{number}d",
+ "relative_time.full.days": "{number, plural, one {# day} other {# days}} ago",
+ "relative_time.full.hours": "{number, plural, one {# hour} other {# hours}} ago",
+ "relative_time.full.just_now": "just now",
+ "relative_time.full.minutes": "{number, plural, one {# minute} other {# minutes}} ago",
+ "relative_time.full.seconds": "{number, plural, one {# second} other {# seconds}} ago",
"relative_time.hours": "{number}h",
"relative_time.just_now": "now",
"relative_time.minutes": "{number}m",
"relative_time.seconds": "{number}s",
"relative_time.today": "today",
"reply_indicator.cancel": "Cancel",
+ "report.block": "Block",
+ "report.block_explanation": "You will not see their posts. They will not be able to see your posts or follow you. They will be able to tell that they are blocked.",
+ "report.categories.other": "Other",
+ "report.categories.spam": "Spam",
+ "report.categories.violation": "Content violates one or more server rules",
+ "report.category.subtitle": "Choose the best match",
+ "report.category.title": "Tell us what's going on with this {type}",
+ "report.category.title_account": "profile",
+ "report.category.title_status": "post",
+ "report.close": "Done",
+ "report.comment.title": "Is there anything else you think we should know?",
"report.forward": "Forward to {target}",
"report.forward_hint": "The account is from another server. Send an anonymized copy of the report there as well?",
- "report.hint": "The report will be sent to your server moderators. You can provide an explanation of why you are reporting this account below:",
+ "report.mute": "Mute",
+ "report.mute_explanation": "You will not see their posts. They can still follow you and see your posts and will not know that they are muted.",
+ "report.next": "Next",
"report.placeholder": "Additional comments",
+ "report.reasons.dislike": "I don't like it",
+ "report.reasons.dislike_description": "It is not something you want to see",
+ "report.reasons.other": "It's something else",
+ "report.reasons.other_description": "The issue does not fit into other categories",
+ "report.reasons.spam": "It's spam",
+ "report.reasons.spam_description": "Malicious links, fake engagement, or repetitive replies",
+ "report.reasons.violation": "It violates server rules",
+ "report.reasons.violation_description": "You are aware that it breaks specific rules",
+ "report.rules.subtitle": "Select all that apply",
+ "report.rules.title": "Which rules are being violated?",
+ "report.statuses.subtitle": "Select all that apply",
+ "report.statuses.title": "Are there any posts that back up this report?",
"report.submit": "Submit",
"report.target": "Reporting {target}",
+ "report.thanks.take_action": "Here are your options for controlling what you see on Mastodon:",
+ "report.thanks.take_action_actionable": "While we review this, you can take action against @{name}:",
+ "report.thanks.title": "Don't want to see this?",
+ "report.thanks.title_actionable": "Thanks for reporting, we'll look into this.",
+ "report.unfollow": "Unfollow @{name}",
+ "report.unfollow_explanation": "You are following this account. To not see their posts in your home feed anymore, unfollow them.",
"search.placeholder": "Search",
"search_popout.search_format": "Advanced search format",
"search_popout.tips.full_text": "Simple text returns posts you have written, favourited, boosted, or have been mentioned in, as well as matching usernames, display names, and hashtags.",
@@ -388,7 +439,9 @@
"search_popout.tips.text": "Simple text returns matching display names, usernames and hashtags",
"search_popout.tips.user": "user",
"search_results.accounts": "People",
+ "search_results.all": "All",
"search_results.hashtags": "Hashtags",
+ "search_results.nothing_found": "Could not find anything for these search terms",
"search_results.statuses": "Posts",
"search_results.statuses_fts_disabled": "Searching posts by their content is not enabled on this Mastodon server.",
"search_results.total": "{count, number} {count, plural, one {result} other {results}}",
@@ -402,9 +455,14 @@
"status.delete": "Delete",
"status.detailed_status": "Detailed conversation view",
"status.direct": "Direct message @{name}",
+ "status.edit": "Edit",
+ "status.edited": "Edited {date}",
+ "status.edited_x_times": "Edited {count, plural, one {{count} time} other {{count} times}}",
"status.embed": "Embed",
"status.favourite": "Favourite",
"status.filtered": "Filtered",
+ "status.history.created": "{name} created {date}",
+ "status.history.edited": "{name} edited {date}",
"status.load_more": "Load more",
"status.media_hidden": "Media hidden",
"status.mention": "Mention @{name}",
diff --git a/app/javascript/mastodon/locales/eo.json b/app/javascript/mastodon/locales/eo.json
index ac1f195b4..7f999c34f 100644
--- a/app/javascript/mastodon/locales/eo.json
+++ b/app/javascript/mastodon/locales/eo.json
@@ -18,21 +18,20 @@
"account.followers": "Sekvantoj",
"account.followers.empty": "Ankoraŭ neniu sekvas tiun uzanton.",
"account.followers_counter": "{count, plural, one{{counter} Sekvanto} other {{counter} Sekvantoj}}",
+ "account.following": "Following",
"account.following_counter": "{count, plural, one {{counter} Sekvato} other {{counter} Sekvatoj}}",
"account.follows.empty": "Tiu uzanto ankoraŭ ne sekvas iun.",
"account.follows_you": "Sekvas vin",
"account.hide_reblogs": "Kaŝi diskonigojn de @{name}",
"account.joined": "Kuniĝis {date}",
- "account.last_status": "Laste aktiva",
"account.link_verified_on": "La posedanto de tiu ligilo estis kontrolita je {date}",
"account.locked_info": "La privateco de tiu konto estas elektita kiel fermita. La posedanto povas mane akcepti tiun, kiu povas sekvi rin.",
- "account.media": "Amaskomunikiloj",
+ "account.media": "Aŭdovidaĵoj",
"account.mention": "Mencii @{name}",
"account.moved_to": "{name} moviĝis al:",
"account.mute": "Silentigi @{name}",
"account.mute_notifications": "Silentigi sciigojn de @{name}",
"account.muted": "Silentigita",
- "account.never_active": "Neniam",
"account.posts": "Mesaĝoj",
"account.posts_with_replies": "Kun respondoj",
"account.report": "Signali @{name}",
@@ -42,21 +41,24 @@
"account.statuses_counter": "{count, plural, one {{counter} Mesaĝo} other {{counter} Mesaĝoj}}",
"account.unblock": "Malbloki @{name}",
"account.unblock_domain": "Malbloki {domain}",
+ "account.unblock_short": "Malbloki",
"account.unendorse": "Ne montri en profilo",
"account.unfollow": "Ne plu sekvi",
"account.unmute": "Malsilentigi @{name}",
"account.unmute_notifications": "Malsilentigi sciigojn de @{name}",
+ "account.unmute_short": "Malsilentigi",
"account_note.placeholder": "Alklaku por aldoni noton",
- "admin.dashboard.retention": "Retention",
- "admin.dashboard.retention.average": "Average",
- "admin.dashboard.retention.cohort": "Sign-up month",
- "admin.dashboard.retention.cohort_size": "New users",
+ "admin.dashboard.daily_retention": "User retention rate by day after sign-up",
+ "admin.dashboard.monthly_retention": "User retention rate by month after sign-up",
+ "admin.dashboard.retention.average": "Averaĝa",
+ "admin.dashboard.retention.cohort": "Registriĝo monato",
+ "admin.dashboard.retention.cohort_size": "Novaj uzantoj",
"alert.rate_limited.message": "Bonvolu reprovi post {retry_time, time, medium}.",
"alert.rate_limited.title": "Mesaĝkvante limigita",
"alert.unexpected.message": "Neatendita eraro okazis.",
"alert.unexpected.title": "Ups!",
"announcement.announcement": "Anonco",
- "attachments_list.unprocessed": "(unprocessed)",
+ "attachments_list.unprocessed": "(neprilaborita)",
"autosuggest_hashtag.per_week": "{count} semajne",
"boost_modal.combo": "Vi povas premi {combo} por preterpasi sekvafoje",
"bundle_column_error.body": "Io misfunkciis en la ŝargado de ĉi tiu elemento.",
@@ -104,6 +106,7 @@
"compose_form.poll.switch_to_single": "Ŝanĝi la balotenketon por permesi unu solan elekton",
"compose_form.publish": "Hup",
"compose_form.publish_loud": "{publish}!",
+ "compose_form.save_changes": "Konservi ŝanĝojn",
"compose_form.sensitive.hide": "Marki la aŭdovidaĵojn kiel tiklaj",
"compose_form.sensitive.marked": "Aŭdovidaĵo markita tikla",
"compose_form.sensitive.unmarked": "Aŭdovidaĵo ne markita tikla",
@@ -118,12 +121,12 @@
"confirmations.delete.message": "Ĉu vi certas, ke vi volas forigi ĉi tiun mesaĝon?",
"confirmations.delete_list.confirm": "Forigi",
"confirmations.delete_list.message": "Ĉu vi certas, ke vi volas porĉiame forigi ĉi tiun liston?",
- "confirmations.discard_edit_media.confirm": "Discard",
+ "confirmations.discard_edit_media.confirm": "Ne konservi",
"confirmations.discard_edit_media.message": "You have unsaved changes to the media description or preview, discard them anyway?",
"confirmations.domain_block.confirm": "Bloki la tutan domajnon",
"confirmations.domain_block.message": "Ĉu vi vere, vere certas, ke vi volas tute bloki {domain}? Plej ofte, trafa blokado kaj silentigado sufiĉas kaj preferindas. Vi ne vidos enhavon de tiu domajno en publika templinio aŭ en viaj sciigoj. Viaj sekvantoj de tiu domajno estos forigitaj.",
- "confirmations.logout.confirm": "Elsaluti",
- "confirmations.logout.message": "Ĉu vi certas ke vi volas elsaluti?",
+ "confirmations.logout.confirm": "Adiaŭi",
+ "confirmations.logout.message": "Ĉu vi certas ke vi volas adiaŭi?",
"confirmations.mute.confirm": "Silentigi",
"confirmations.mute.explanation": "Ĉi-tio kaŝos mesaĝojn el ili kaj mesaĝojn kiuj mencias ilin, sed ili ankoraŭ rajtos vidi viajn mesaĝojn kaj sekvi vin.",
"confirmations.mute.message": "Ĉu vi certas, ke vi volas silentigi {name}?",
@@ -165,6 +168,7 @@
"empty_column.community": "La loka templinio estas malplena. Skribu ion por plenigi ĝin!",
"empty_column.direct": "Vi ankoraŭ ne havas rektan mesaĝon. Kiam vi sendos aŭ ricevos iun, ĝi aperos ĉi tie.",
"empty_column.domain_blocks": "Ankoraŭ neniu domajno estas blokita.",
+ "empty_column.explore_statuses": "Nothing is trending right now. Check back later!",
"empty_column.favourited_statuses": "Vi ankoraŭ ne stelumis mesaĝon. Kiam vi stelumos iun, tiu aperos ĉi tie.",
"empty_column.favourites": "Ankoraŭ neniu stelumis tiun mesaĝon. Kiam iu faros tion, tiu aperos ĉi tie.",
"empty_column.follow_recommendations": "Looks like no suggestions could be generated for you. You can try using search to look for people you might know or explore trending hashtags.",
@@ -183,6 +187,12 @@
"error.unexpected_crash.next_steps_addons": "Provu malaktivigi ilin kaj tiam refreŝigi la paĝon. Se tio ne helpas, vi ankoraŭ povus uzi Mastodon per malsama retumilo aŭ operaciuma aplikajo.",
"errors.unexpected_crash.copy_stacktrace": "Kopii stakspuron en tondujo",
"errors.unexpected_crash.report_issue": "Raporti problemon",
+ "explore.search_results": "Serĉaj rezultoj",
+ "explore.suggested_follows": "Por vi",
+ "explore.title": "Esplori",
+ "explore.trending_links": "Novaĵoj",
+ "explore.trending_statuses": "Afiŝoj",
+ "explore.trending_tags": "Kradvortoj",
"follow_recommendations.done": "Farita",
"follow_recommendations.heading": "Follow people you'd like to see posts from! Here are some suggestions.",
"follow_recommendations.lead": "Posts from people you follow will show up in chronological order on your home feed. Don't be afraid to make mistakes, you can unfollow people just as easily any time!",
@@ -284,6 +294,7 @@
"navigation_bar.discover": "Esplori",
"navigation_bar.domain_blocks": "Blokitaj domajnoj",
"navigation_bar.edit_profile": "Redakti profilon",
+ "navigation_bar.explore": "Explore",
"navigation_bar.favourites": "Stelumoj",
"navigation_bar.filters": "Silentigitaj vortoj",
"navigation_bar.follow_requests": "Petoj de sekvado",
@@ -291,13 +302,14 @@
"navigation_bar.info": "Pri ĉi tiu servilo",
"navigation_bar.keyboard_shortcuts": "Rapidklavoj",
"navigation_bar.lists": "Listoj",
- "navigation_bar.logout": "Elsaluti",
+ "navigation_bar.logout": "Adiaŭi",
"navigation_bar.mutes": "Silentigitaj uzantoj",
"navigation_bar.personal": "Persone",
"navigation_bar.pins": "Alpinglitaj mesaĝoj",
"navigation_bar.preferences": "Preferoj",
"navigation_bar.public_timeline": "Fratara templinio",
"navigation_bar.security": "Sekureco",
+ "notification.admin.sign_up": "{name} registris",
"notification.favourite": "{name} stelumis vian mesaĝon",
"notification.follow": "{name} eksekvis vin",
"notification.follow_request": "{name} petis sekvi vin",
@@ -306,13 +318,15 @@
"notification.poll": "Partoprenita balotenketo finiĝis",
"notification.reblog": "{name} diskonigis vian mesaĝon",
"notification.status": "{name} ĵus afiŝita",
+ "notification.update": "{name} redaktis afiŝon",
"notifications.clear": "Forviŝi sciigojn",
"notifications.clear_confirmation": "Ĉu vi certas, ke vi volas porĉiame forviŝi ĉiujn viajn sciigojn?",
+ "notifications.column_settings.admin.sign_up": "New sign-ups:",
"notifications.column_settings.alert": "Retumilaj sciigoj",
"notifications.column_settings.favourite": "Stelumoj:",
"notifications.column_settings.filter_bar.advanced": "Montri ĉiujn kategoriojn",
"notifications.column_settings.filter_bar.category": "Rapida filtra breto",
- "notifications.column_settings.filter_bar.show": "Montri",
+ "notifications.column_settings.filter_bar.show_bar": "Show filter bar",
"notifications.column_settings.follow": "Novaj sekvantoj:",
"notifications.column_settings.follow_request": "Novaj petoj de sekvado:",
"notifications.column_settings.mention": "Mencioj:",
@@ -322,7 +336,9 @@
"notifications.column_settings.show": "Montri en kolumno",
"notifications.column_settings.sound": "Eligi sonon",
"notifications.column_settings.status": "Novaj mesaĝoj:",
- "notifications.column_settings.unread_markers.category": "Unread notification markers",
+ "notifications.column_settings.unread_notifications.category": "Nelegitaj sciigoj",
+ "notifications.column_settings.unread_notifications.highlight": "Highlight unread notifications",
+ "notifications.column_settings.update": "Redaktoj:",
"notifications.filter.all": "Ĉiuj",
"notifications.filter.boosts": "Diskonigoj",
"notifications.filter.favourites": "Stelumoj",
@@ -346,7 +362,7 @@
"poll.total_votes": "{count, plural, one {# voĉdono} other {# voĉdonoj}}",
"poll.vote": "Voĉdoni",
"poll.voted": "Vi elektis por ĉi tiu respondo",
- "poll.votes": "{votes, plural, one {# vote} other {# votes}}",
+ "poll.votes": "{votes, plural, one {# voĉdono} other {# voĉdonoj}}",
"poll_button.add_poll": "Aldoni balotenketon",
"poll_button.remove_poll": "Forigi balotenketon",
"privacy.change": "Agordi mesaĝan privatecon",
@@ -362,18 +378,54 @@
"regeneration_indicator.label": "Ŝargado…",
"regeneration_indicator.sublabel": "Via hejma fluo pretiĝas!",
"relative_time.days": "{number}t",
+ "relative_time.full.days": "{number, plural, one {# day} other {# days}} ago",
+ "relative_time.full.hours": "{number, plural, one {# hour} other {# hours}} ago",
+ "relative_time.full.just_now": "ĵus nun",
+ "relative_time.full.minutes": "{number, plural, one {# minute} other {# minutes}} ago",
+ "relative_time.full.seconds": "{number, plural, one {# second} other {# seconds}} ago",
"relative_time.hours": "{number}h",
"relative_time.just_now": "nun",
"relative_time.minutes": "{number}m",
"relative_time.seconds": "{number}s",
"relative_time.today": "hodiaŭ",
"reply_indicator.cancel": "Nuligi",
+ "report.block": "Bloki",
+ "report.block_explanation": "You will not see their posts. They will not be able to see your posts or follow you. They will be able to tell that they are blocked.",
+ "report.categories.other": "Aliaj",
+ "report.categories.spam": "Spamo",
+ "report.categories.violation": "Content violates one or more server rules",
+ "report.category.subtitle": "Choose the best match",
+ "report.category.title": "Tell us what's going on with this {type}",
+ "report.category.title_account": "profilo",
+ "report.category.title_status": "afiŝo",
+ "report.close": "Farita",
+ "report.comment.title": "Is there anything else you think we should know?",
"report.forward": "Plusendi al {target}",
"report.forward_hint": "La konto estas en alia servilo. Ĉu sendi sennomigitan kopion de la signalo ankaŭ tien?",
- "report.hint": "La signalo estos sendita al la kontrolantoj de via servilo. Vi povas doni klarigon pri kial vi signalas ĉi tiun konton sube:",
+ "report.mute": "Silentigi",
+ "report.mute_explanation": "You will not see their posts. They can still follow you and see your posts and will not know that they are muted.",
+ "report.next": "Sekva",
"report.placeholder": "Pliaj komentoj",
+ "report.reasons.dislike": "Mi ne ŝatas ĝin",
+ "report.reasons.dislike_description": "It is not something you want to see",
+ "report.reasons.other": "It's something else",
+ "report.reasons.other_description": "The issue does not fit into other categories",
+ "report.reasons.spam": "It's spam",
+ "report.reasons.spam_description": "Malicious links, fake engagement, or repetitive replies",
+ "report.reasons.violation": "Ĝi malrespektas servilajn regulojn",
+ "report.reasons.violation_description": "You are aware that it breaks specific rules",
+ "report.rules.subtitle": "Select all that apply",
+ "report.rules.title": "Which rules are being violated?",
+ "report.statuses.subtitle": "Select all that apply",
+ "report.statuses.title": "Are there any posts that back up this report?",
"report.submit": "Sendi",
"report.target": "Signali {target}",
+ "report.thanks.take_action": "Here are your options for controlling what you see on Mastodon:",
+ "report.thanks.take_action_actionable": "While we review this, you can take action against @{name}:",
+ "report.thanks.title": "Don't want to see this?",
+ "report.thanks.title_actionable": "Thanks for reporting, we'll look into this.",
+ "report.unfollow": "Malsekvi @{name}",
+ "report.unfollow_explanation": "You are following this account. To not see their posts in your home feed anymore, unfollow them.",
"search.placeholder": "Serĉi",
"search_popout.search_format": "Detala serĉo",
"search_popout.tips.full_text": "Simplaj tekstoj montras la mesaĝojn, kiujn vi skribis, stelumis, diskonigis, aŭ en kiuj vi estis menciita, sed ankaŭ kongruajn uzantnomojn, montratajn nomojn, kaj kradvortojn.",
@@ -382,7 +434,9 @@
"search_popout.tips.text": "Simpla teksto montras la kongruajn afiŝitajn nomojn, uzantnomojn kaj kradvortojn",
"search_popout.tips.user": "uzanto",
"search_results.accounts": "Homoj",
+ "search_results.all": "Ĉiuj",
"search_results.hashtags": "Kradvortoj",
+ "search_results.nothing_found": "Could not find anything for these search terms",
"search_results.statuses": "Mesaĝoj",
"search_results.statuses_fts_disabled": "Serĉi mesaĝojn laŭ enhavo ne estas ebligita en ĉi tiu Mastodon-servilo.",
"search_results.total": "{count, number} {count, plural, one {rezulto} other {rezultoj}}",
@@ -396,9 +450,14 @@
"status.delete": "Forigi",
"status.detailed_status": "Detala konversacia vido",
"status.direct": "Rekte mesaĝi @{name}",
+ "status.edit": "Redakti",
+ "status.edited": "Redaktita {date}",
+ "status.edited_x_times": "Redactita {count, plural, one {{count} fojon} other {{count} fojojn}}",
"status.embed": "Enkorpigi",
"status.favourite": "Stelumi",
"status.filtered": "Filtrita",
+ "status.history.created": "{name} kreis {date}",
+ "status.history.edited": "{name} redaktis {date}",
"status.load_more": "Ŝargi pli",
"status.media_hidden": "Aŭdovidaĵo kaŝita",
"status.mention": "Mencii @{name}",
@@ -462,7 +521,7 @@
"upload_form.video_description": "Priskribi por homoj kiuj malfacile aŭdi aŭ vidi",
"upload_modal.analyzing_picture": "Bilda analizado…",
"upload_modal.apply": "Apliki",
- "upload_modal.applying": "Applying…",
+ "upload_modal.applying": "Apliki…",
"upload_modal.choose_image": "Elekti bildon",
"upload_modal.description_placeholder": "Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj",
"upload_modal.detect_text": "Detekti tekston de la bildo",
diff --git a/app/javascript/mastodon/locales/es-AR.json b/app/javascript/mastodon/locales/es-AR.json
index 08e9564da..b239c69e6 100644
--- a/app/javascript/mastodon/locales/es-AR.json
+++ b/app/javascript/mastodon/locales/es-AR.json
@@ -18,12 +18,12 @@
"account.followers": "Seguidores",
"account.followers.empty": "Todavía nadie sigue a este usuario.",
"account.followers_counter": "{count, plural, one {{counter} Seguidor} other {{counter} Seguidores}}",
+ "account.following": "Siguiendo",
"account.following_counter": "{count, plural, other {{counter} Siguiendo}}",
"account.follows.empty": "Todavía este usuario no sigue a nadie.",
"account.follows_you": "Te sigue",
"account.hide_reblogs": "Ocultar adhesiones de @{name}",
"account.joined": "En este servidor desde {date}",
- "account.last_status": "Última actividad",
"account.link_verified_on": "La propiedad de este enlace fue verificada el {date}",
"account.locked_info": "Esta cuenta es privada. El propietario manualmente revisa quién puede seguirle.",
"account.media": "Medios",
@@ -32,9 +32,8 @@
"account.mute": "Silenciar a @{name}",
"account.mute_notifications": "Silenciar notificaciones de @{name}",
"account.muted": "Silenciado",
- "account.never_active": "Nunca",
"account.posts": "Mensajes",
- "account.posts_with_replies": "Mensajes y respuestas",
+ "account.posts_with_replies": "Mensajes y respuestas públicas",
"account.report": "Denunciar a @{name}",
"account.requested": "Esperando aprobación. Hacé clic para cancelar la solicitud de seguimiento",
"account.share": "Compartir el perfil de @{name}",
@@ -42,21 +41,24 @@
"account.statuses_counter": "{count, plural, one {{counter} Mensaje} other {{counter} Mensajes}}",
"account.unblock": "Desbloquear a @{name}",
"account.unblock_domain": "Desbloquear dominio {domain}",
+ "account.unblock_short": "Desbloquear",
"account.unendorse": "No destacar en el perfil",
"account.unfollow": "Dejar de seguir",
"account.unmute": "Dejar de silenciar a @{name}",
"account.unmute_notifications": "Dejar de silenciar las notificaciones de @{name}",
+ "account.unmute_short": "Dejar de silenciar",
"account_note.placeholder": "Hacé clic par agregar una nota",
- "admin.dashboard.retention": "Retention",
- "admin.dashboard.retention.average": "Average",
- "admin.dashboard.retention.cohort": "Sign-up month",
- "admin.dashboard.retention.cohort_size": "New users",
+ "admin.dashboard.daily_retention": "Tasa de retención de usuarios por día, después del registro",
+ "admin.dashboard.monthly_retention": "Tasa de retención de usuarios por mes, después del registro",
+ "admin.dashboard.retention.average": "Promedio",
+ "admin.dashboard.retention.cohort": "Mes de registro",
+ "admin.dashboard.retention.cohort_size": "Nuevos usuarios",
"alert.rate_limited.message": "Por favor, reintentá después de las {retry_time, time, medium}.",
"alert.rate_limited.title": "Acción limitada",
"alert.unexpected.message": "Ocurrió un error.",
"alert.unexpected.title": "¡Epa!",
"announcement.announcement": "Anuncio",
- "attachments_list.unprocessed": "(unprocessed)",
+ "attachments_list.unprocessed": "[sin procesar]",
"autosuggest_hashtag.per_week": "{count} por semana",
"boost_modal.combo": "Podés hacer clic en {combo} para saltar esto la próxima vez",
"bundle_column_error.body": "Algo salió mal al cargar este componente.",
@@ -104,6 +106,7 @@
"compose_form.poll.switch_to_single": "Cambiar encuesta para permitir una sola opción",
"compose_form.publish": "Enviar",
"compose_form.publish_loud": "¡{publish}!",
+ "compose_form.save_changes": "Guardar cambios",
"compose_form.sensitive.hide": "Marcar medio como sensible",
"compose_form.sensitive.marked": "{count, plural, one {El medio está marcado como sensible} other {Los medios están marcados como sensibles}}",
"compose_form.sensitive.unmarked": "El medio no está marcado como sensible",
@@ -118,8 +121,8 @@
"confirmations.delete.message": "¿Estás seguro que querés eliminar este mensaje?",
"confirmations.delete_list.confirm": "Eliminar",
"confirmations.delete_list.message": "¿Estás seguro que querés eliminar permanentemente esta lista?",
- "confirmations.discard_edit_media.confirm": "Discard",
- "confirmations.discard_edit_media.message": "You have unsaved changes to the media description or preview, discard them anyway?",
+ "confirmations.discard_edit_media.confirm": "Descartar",
+ "confirmations.discard_edit_media.message": "Tenés cambios sin guardar en la descripción de medios o en la vista previa, ¿querés descartarlos de todos modos?",
"confirmations.domain_block.confirm": "Bloquear dominio entero",
"confirmations.domain_block.message": "¿Estás completamente seguro que querés bloquear el {domain} entero? En la mayoría de los casos, unos cuantos bloqueos y silenciados puntuales son suficientes y preferibles. No vas a ver contenido de ese dominio en ninguna de tus líneas temporales o en tus notificaciones. Tus seguidores de ese dominio serán quitados.",
"confirmations.logout.confirm": "Cerrar sesión",
@@ -165,6 +168,7 @@
"empty_column.community": "La línea temporal local está vacía. ¡Escribí algo en modo público para que se empiece a correr la bola!",
"empty_column.direct": "Todavía no tenés ningún mensaje directo. Cuando enviés o recibás uno, se mostrará acá.",
"empty_column.domain_blocks": "Todavía no hay dominios bloqueados.",
+ "empty_column.explore_statuses": "No hay nada en tendencia ahora mismo. ¡Volvé a revisar más tarde!",
"empty_column.favourited_statuses": "Todavía no tenés mensajes favoritos. Cuando marqués uno como favorito, se mostrará acá.",
"empty_column.favourites": "Todavía nadie marcó este mensaje como favorito. Cuando alguien lo haga, se mostrará acá.",
"empty_column.follow_recommendations": "Parece que no se pudieron generar sugerencias para vos. Podés intentar buscar gente que conozcas o explorar las tendencias de las etiquetas.",
@@ -183,6 +187,12 @@
"error.unexpected_crash.next_steps_addons": "Intentá deshabilitarlos y recargá la página. Si eso no ayuda, podés usar Mastodon a través de un navegador web diferente o aplicación nativa.",
"errors.unexpected_crash.copy_stacktrace": "Copiar stacktrace al portapapeles",
"errors.unexpected_crash.report_issue": "Informar problema",
+ "explore.search_results": "Resultados de búsqueda",
+ "explore.suggested_follows": "Para vos",
+ "explore.title": "Explorá",
+ "explore.trending_links": "Noticias",
+ "explore.trending_statuses": "Mensajes",
+ "explore.trending_tags": "Etiquetas",
"follow_recommendations.done": "Listo",
"follow_recommendations.heading": "¡Seguí cuentas cuyos mensajes te gustaría ver! Acá tenés algunas sugerencias.",
"follow_recommendations.lead": "Los mensajes de las cuentas que seguís aparecerán en orden cronológico en la columna \"Inicio\". No tengás miedo de meter la pata, ¡podés dejar de seguir cuentas fácilmente en cualquier momento!",
@@ -267,7 +277,7 @@
"lists.replies_policy.title": "Mostrar respuestas a:",
"lists.search": "Buscar entre la gente que seguís",
"lists.subheading": "Tus listas",
- "load_pending": "{count, plural, one {# nuevo elemento} other {# nuevos elementos}}",
+ "load_pending": "{count, plural, one {# elemento nuevo} other {# elementos nuevos}}",
"loading_indicator.label": "Cargando...",
"media_gallery.toggle_visible": "Ocultar {number, plural, one {imagen} other {imágenes}}",
"missing_indicator.label": "No se encontró",
@@ -284,6 +294,7 @@
"navigation_bar.discover": "Descubrir",
"navigation_bar.domain_blocks": "Dominios bloqueados",
"navigation_bar.edit_profile": "Editar perfil",
+ "navigation_bar.explore": "Explorá",
"navigation_bar.favourites": "Favoritos",
"navigation_bar.filters": "Palabras silenciadas",
"navigation_bar.follow_requests": "Solicitudes de seguimiento",
@@ -298,6 +309,7 @@
"navigation_bar.preferences": "Configuración",
"navigation_bar.public_timeline": "Línea temporal federada",
"navigation_bar.security": "Seguridad",
+ "notification.admin.sign_up": "Se registró {name}",
"notification.favourite": "{name} marcó tu mensaje como favorito",
"notification.follow": "{name} te empezó a seguir",
"notification.follow_request": "{name} solicitó seguirte",
@@ -306,13 +318,15 @@
"notification.poll": "Finalizó una encuesta en la que votaste",
"notification.reblog": "{name} adhirió a tu mensaje",
"notification.status": "{name} acaba de enviar un mensaje",
+ "notification.update": "{name} editó un mensaje",
"notifications.clear": "Limpiar notificaciones",
"notifications.clear_confirmation": "¿Estás seguro que querés limpiar todas tus notificaciones permanentemente?",
+ "notifications.column_settings.admin.sign_up": "Nuevos registros:",
"notifications.column_settings.alert": "Notificaciones de escritorio",
"notifications.column_settings.favourite": "Favoritos:",
"notifications.column_settings.filter_bar.advanced": "Mostrar todas las categorías",
"notifications.column_settings.filter_bar.category": "Barra de filtrado rápido",
- "notifications.column_settings.filter_bar.show": "Mostrar",
+ "notifications.column_settings.filter_bar.show_bar": "Mostrar barra de filtros",
"notifications.column_settings.follow": "Nuevos seguidores:",
"notifications.column_settings.follow_request": "Nuevas solicitudes de seguimiento:",
"notifications.column_settings.mention": "Menciones:",
@@ -322,7 +336,9 @@
"notifications.column_settings.show": "Mostrar en columna",
"notifications.column_settings.sound": "Reproducir sonido",
"notifications.column_settings.status": "Nuevos mensajes:",
- "notifications.column_settings.unread_markers.category": "Indicadores de notificaciones no leídas",
+ "notifications.column_settings.unread_notifications.category": "Notificaciones sin leer",
+ "notifications.column_settings.unread_notifications.highlight": "Resaltar notificaciones no leídas",
+ "notifications.column_settings.update": "Ediciones:",
"notifications.filter.all": "Todas",
"notifications.filter.boosts": "Adhesiones",
"notifications.filter.favourites": "Favoritos",
@@ -346,7 +362,7 @@
"poll.total_votes": "{count, plural, one {# voto} other {# votos}}",
"poll.vote": "Votar",
"poll.voted": "Votaste esta opción",
- "poll.votes": "{votes, plural, one {# vote} other {# votes}}",
+ "poll.votes": "{votes, plural, one {# voto} other {# votos}}",
"poll_button.add_poll": "Agregar encuesta",
"poll_button.remove_poll": "Quitar encuesta",
"privacy.change": "Configurar privacidad del mensaje",
@@ -362,18 +378,54 @@
"regeneration_indicator.label": "Cargando…",
"regeneration_indicator.sublabel": "¡Se está preparando tu línea temporal principal!",
"relative_time.days": "{number}d",
+ "relative_time.full.days": "{number, plural,one {hace # día} other {hace # días}}",
+ "relative_time.full.hours": "{number, plural,one {hace # hora} other {hace # horas}}",
+ "relative_time.full.just_now": "recién",
+ "relative_time.full.minutes": "{number, plural,one {hace # minuto} other {hace # minutos}}",
+ "relative_time.full.seconds": "{number, plural,one {hace # segundo} other {hace # segundos}}",
"relative_time.hours": "{number}h",
"relative_time.just_now": "ahora",
"relative_time.minutes": "{number}m",
"relative_time.seconds": "{number}s",
"relative_time.today": "hoy",
"reply_indicator.cancel": "Cancelar",
+ "report.block": "Bloquear",
+ "report.block_explanation": "No verás sus mensajes. No podrán ver tus mensajes ni seguirte. Se van a dar cuentra de que están bloqueados.",
+ "report.categories.other": "Otra",
+ "report.categories.spam": "Spam",
+ "report.categories.violation": "El contenido viola una o más reglas del servidor",
+ "report.category.subtitle": "Elegí la mejor coincidencia",
+ "report.category.title": "Contanos lo que pasa con este {type}",
+ "report.category.title_account": "perfil",
+ "report.category.title_status": "mensaje",
+ "report.close": "Listo",
+ "report.comment.title": "¿Hay algo más que creés que deberíamos saber?",
"report.forward": "Reenviar a {target}",
"report.forward_hint": "La cuenta es de otro servidor. ¿Querés enviar una copia anonimizada del informe también ahí?",
- "report.hint": "La denuncia se enviará a los moderadores de tu servidor. A continuación, podés proporcionar una explicación de por qué estás denunciando esta cuenta:",
+ "report.mute": "Silenciar",
+ "report.mute_explanation": "No verás sus mensajes. Todavía pueden seguirte y ver tus mensajes y no sabrán que están silenciados.",
+ "report.next": "Siguiente",
"report.placeholder": "Comentarios adicionales",
+ "report.reasons.dislike": "No me gusta",
+ "report.reasons.dislike_description": "No es algo que querés ver",
+ "report.reasons.other": "Es otra cosa",
+ "report.reasons.other_description": "El problema no aplica en otras categorías",
+ "report.reasons.spam": "Es spam",
+ "report.reasons.spam_description": "Enlaces maliciosos, interacciones falsas o respuestas repetitivas",
+ "report.reasons.violation": "Viola las reglas del servidor",
+ "report.reasons.violation_description": "Sos consciente de que infringe normas específicas",
+ "report.rules.subtitle": "Seleccioná todo lo que corresponda",
+ "report.rules.title": "¿Qué reglas se están violando?",
+ "report.statuses.subtitle": "Seleccioná todo lo que corresponda",
+ "report.statuses.title": "¿Hay algún mensaje que respalde esta denuncia?",
"report.submit": "Enviar",
"report.target": "Denunciando a {target}",
+ "report.thanks.take_action": "Acá están tus opciones para controlar lo que ves en Mastodon:",
+ "report.thanks.take_action_actionable": "Mientras revisamos esto, podés tomar medidas contra @{name}:",
+ "report.thanks.title": "¿No querés ver esto?",
+ "report.thanks.title_actionable": "Gracias por tu denuncia, vamos a revisarla.",
+ "report.unfollow": "Dejar de seguir a @{name}",
+ "report.unfollow_explanation": "Estás siguiendo a esta cuenta. Para no ver sus mensajes en tu línea temporal principal, dejá de seguirla.",
"search.placeholder": "Buscar",
"search_popout.search_format": "Formato de búsqueda avanzada",
"search_popout.tips.full_text": "Las búsquedas de texto simple devuelven los mensajes que escribiste, los marcados como favoritos, los adheridos o en los que te mencionaron, así como nombres de usuarios, nombres mostrados y etiquetas.",
@@ -382,7 +434,9 @@
"search_popout.tips.text": "Las búsquedas de texto simple devuelven nombres de usuarios, nombres mostrados y etiquetas que coincidan",
"search_popout.tips.user": "usuario",
"search_results.accounts": "Gente",
+ "search_results.all": "Todos",
"search_results.hashtags": "Etiquetas",
+ "search_results.nothing_found": "No se pudo encontrar nada para estos términos de búsqueda",
"search_results.statuses": "Mensajes",
"search_results.statuses_fts_disabled": "No se pueden buscar mensajes por contenido en este servidor de Mastodon.",
"search_results.total": "{count, number} {count, plural, one {resultado} other {resultados}}",
@@ -396,9 +450,14 @@
"status.delete": "Eliminar",
"status.detailed_status": "Vista de conversación detallada",
"status.direct": "Mensaje directo para @{name}",
+ "status.edit": "Editar",
+ "status.edited": "Editado {date}",
+ "status.edited_x_times": "Editado {count, plural, one {{count} vez} other {{count} veces}}",
"status.embed": "Insertar",
"status.favourite": "Marcar como favorito",
"status.filtered": "Filtrado",
+ "status.history.created": "Creado por {name} el {date}",
+ "status.history.edited": "Editado por {name} el {date}",
"status.load_more": "Cargar más",
"status.media_hidden": "Medios ocultos",
"status.mention": "Mencionar a @{name}",
@@ -462,7 +521,7 @@
"upload_form.video_description": "Agregá una descripción para personas con dificultades auditivas o visuales",
"upload_modal.analyzing_picture": "Analizando imagen…",
"upload_modal.apply": "Aplicar",
- "upload_modal.applying": "Applying…",
+ "upload_modal.applying": "Aplicando…",
"upload_modal.choose_image": "Elegir imagen",
"upload_modal.description_placeholder": "El veloz murciélago hindú comía feliz cardillo y kiwi. La cigüeña tocaba el saxofón detrás del palenque de paja.",
"upload_modal.detect_text": "Detectar texto de la imagen",
diff --git a/app/javascript/mastodon/locales/es-MX.json b/app/javascript/mastodon/locales/es-MX.json
index ffd159c02..ccdca8d9c 100644
--- a/app/javascript/mastodon/locales/es-MX.json
+++ b/app/javascript/mastodon/locales/es-MX.json
@@ -1,10 +1,10 @@
{
"account.account_note_header": "Nota",
- "account.add_or_remove_from_list": "Agregar o eliminar de listas",
+ "account.add_or_remove_from_list": "Agregar o eliminar de las listas",
"account.badges.bot": "Bot",
"account.badges.group": "Grupo",
"account.block": "Bloquear a @{name}",
- "account.block_domain": "Ocultar todo de {domain}",
+ "account.block_domain": "Bloquear dominio {domain}",
"account.blocked": "Bloqueado",
"account.browse_more_on_origin_server": "Ver más en el perfil original",
"account.cancel_follow_request": "Cancelar la solicitud de seguimiento",
@@ -13,50 +13,52 @@
"account.domain_blocked": "Dominio oculto",
"account.edit_profile": "Editar perfil",
"account.enable_notifications": "Notificarme cuando @{name} publique algo",
- "account.endorse": "Mostrar en perfil",
+ "account.endorse": "Destacar en mi perfil",
"account.follow": "Seguir",
"account.followers": "Seguidores",
"account.followers.empty": "Todavía nadie sigue a este usuario.",
"account.followers_counter": "{count, plural, one {{counter} Seguidor} other {{counter} Seguidores}}",
+ "account.following": "Siguiendo",
"account.following_counter": "{count, plural, other {{counter} Siguiendo}}",
"account.follows.empty": "Este usuario todavía no sigue a nadie.",
"account.follows_you": "Te sigue",
"account.hide_reblogs": "Ocultar retoots de @{name}",
"account.joined": "Se unió el {date}",
- "account.last_status": "Última actividad",
"account.link_verified_on": "El proprietario de este link fue comprobado el {date}",
"account.locked_info": "El estado de privacidad de esta cuenta està configurado como bloqueado. El proprietario debe revisar manualmente quien puede seguirle.",
"account.media": "Multimedia",
- "account.mention": "Mencionar a @{name}",
+ "account.mention": "Mencionar @{name}",
"account.moved_to": "{name} se ha mudado a:",
"account.mute": "Silenciar a @{name}",
"account.mute_notifications": "Silenciar notificaciones de @{name}",
"account.muted": "Silenciado",
- "account.never_active": "Nunca",
- "account.posts": "Toots",
- "account.posts_with_replies": "Toots con respuestas",
+ "account.posts": "Publicaciones",
+ "account.posts_with_replies": "Publicaciones y respuestas",
"account.report": "Reportar a @{name}",
- "account.requested": "Esperando aprobación",
+ "account.requested": "Esperando aprobación. Haga clic para cancelar la solicitud de seguimiento",
"account.share": "Compartir el perfil de @{name}",
"account.show_reblogs": "Mostrar retoots de @{name}",
"account.statuses_counter": "{count, plural, one {{counter} Toot} other {{counter} Toots}}",
"account.unblock": "Desbloquear a @{name}",
"account.unblock_domain": "Mostrar a {domain}",
+ "account.unblock_short": "Desbloquear",
"account.unendorse": "No mostrar en el perfil",
"account.unfollow": "Dejar de seguir",
"account.unmute": "Dejar de silenciar a @{name}",
"account.unmute_notifications": "Dejar de silenciar las notificaciones de @{name}",
+ "account.unmute_short": "Desmutear",
"account_note.placeholder": "Clic para añadir nota",
- "admin.dashboard.retention": "Retention",
- "admin.dashboard.retention.average": "Average",
- "admin.dashboard.retention.cohort": "Sign-up month",
- "admin.dashboard.retention.cohort_size": "New users",
+ "admin.dashboard.daily_retention": "Tasa de retención de usuarios por día después de unirse",
+ "admin.dashboard.monthly_retention": "Tasa de retención de usuarios por mes después de unirse",
+ "admin.dashboard.retention.average": "Promedio",
+ "admin.dashboard.retention.cohort": "Mes de registro",
+ "admin.dashboard.retention.cohort_size": "Nuevos usuarios",
"alert.rate_limited.message": "Por favor reintente después de {retry_time, time, medium}.",
"alert.rate_limited.title": "Tarifa limitada",
"alert.unexpected.message": "Hubo un error inesperado.",
"alert.unexpected.title": "¡Ups!",
"announcement.announcement": "Anuncio",
- "attachments_list.unprocessed": "(unprocessed)",
+ "attachments_list.unprocessed": "(sin procesar)",
"autosuggest_hashtag.per_week": "{count} por semana",
"boost_modal.combo": "Puedes hacer clic en {combo} para saltar este aviso la próxima vez",
"bundle_column_error.body": "Algo salió mal al cargar este componente.",
@@ -104,6 +106,7 @@
"compose_form.poll.switch_to_single": "Modificar encuesta para permitir una única opción",
"compose_form.publish": "Tootear",
"compose_form.publish_loud": "¡{publish}!",
+ "compose_form.save_changes": "Guardar cambios",
"compose_form.sensitive.hide": "Marcar multimedia como sensible",
"compose_form.sensitive.marked": "Material marcado como sensible",
"compose_form.sensitive.unmarked": "Material no marcado como sensible",
@@ -118,8 +121,8 @@
"confirmations.delete.message": "¿Estás seguro de que quieres borrar este toot?",
"confirmations.delete_list.confirm": "Eliminar",
"confirmations.delete_list.message": "¿Seguro que quieres borrar esta lista permanentemente?",
- "confirmations.discard_edit_media.confirm": "Discard",
- "confirmations.discard_edit_media.message": "You have unsaved changes to the media description or preview, discard them anyway?",
+ "confirmations.discard_edit_media.confirm": "Descartar",
+ "confirmations.discard_edit_media.message": "Tienes cambios sin guardar en la descripción o vista previa del archivo, ¿deseas descartarlos de cualquier manera?",
"confirmations.domain_block.confirm": "Ocultar dominio entero",
"confirmations.domain_block.message": "¿Seguro de que quieres bloquear al dominio {domain} entero? En general unos cuantos bloqueos y silenciados concretos es suficiente y preferible.",
"confirmations.logout.confirm": "Cerrar sesión",
@@ -165,6 +168,7 @@
"empty_column.community": "La línea de tiempo local está vacía. ¡Escribe algo para empezar la fiesta!",
"empty_column.direct": "Aún no tienes ningún mensaje directo. Cuando envíes o recibas uno, se mostrará aquí.",
"empty_column.domain_blocks": "Todavía no hay dominios ocultos.",
+ "empty_column.explore_statuses": "Nada es tendencia en este momento. ¡Revisa más tarde!",
"empty_column.favourited_statuses": "Aún no tienes toots preferidos. Cuando marques uno como favorito, aparecerá aquí.",
"empty_column.favourites": "Nadie ha marcado este toot como preferido. Cuando alguien lo haga, aparecerá aquí.",
"empty_column.follow_recommendations": "Parece que no se ha podido generar ninguna sugerencia para ti. Puedes probar a buscar a gente que quizá conozcas o explorar los hashtags que están en tendencia.",
@@ -183,6 +187,12 @@
"error.unexpected_crash.next_steps_addons": "Intenta deshabilitarlos y recarga la página. Si eso no ayuda, podrías usar Mastodon a través de un navegador web diferente o aplicación nativa.",
"errors.unexpected_crash.copy_stacktrace": "Copiar el seguimiento de pila en el portapapeles",
"errors.unexpected_crash.report_issue": "Informar de un problema/error",
+ "explore.search_results": "Resultados de búsqueda",
+ "explore.suggested_follows": "Para ti",
+ "explore.title": "Descubrir",
+ "explore.trending_links": "Noticias",
+ "explore.trending_statuses": "Publicaciones",
+ "explore.trending_tags": "Hashtags",
"follow_recommendations.done": "Hecho",
"follow_recommendations.heading": "¡Sigue a gente que publique cosas que te gusten! Aquí tienes algunas sugerencias.",
"follow_recommendations.lead": "Las publicaciones de la gente a la que sigas aparecerán ordenadas cronológicamente en Inicio. No tengas miedo de cometer errores, ¡puedes dejarles de seguir en cualquier momento con la misma facilidad!",
@@ -284,6 +294,7 @@
"navigation_bar.discover": "Descubrir",
"navigation_bar.domain_blocks": "Dominios ocultos",
"navigation_bar.edit_profile": "Editar perfil",
+ "navigation_bar.explore": "Explorar",
"navigation_bar.favourites": "Favoritos",
"navigation_bar.filters": "Palabras silenciadas",
"navigation_bar.follow_requests": "Solicitudes para seguirte",
@@ -298,6 +309,7 @@
"navigation_bar.preferences": "Preferencias",
"navigation_bar.public_timeline": "Historia federada",
"navigation_bar.security": "Seguridad",
+ "notification.admin.sign_up": "{name} se unio",
"notification.favourite": "{name} marcó tu estado como favorito",
"notification.follow": "{name} te empezó a seguir",
"notification.follow_request": "{name} ha solicitado seguirte",
@@ -306,13 +318,15 @@
"notification.poll": "Una encuesta en la que has votado ha terminado",
"notification.reblog": "{name} ha retooteado tu estado",
"notification.status": "{name} acaba de publicar",
+ "notification.update": "{name} editó una publicación",
"notifications.clear": "Limpiar notificaciones",
"notifications.clear_confirmation": "¿Seguro que quieres limpiar permanentemente todas tus notificaciones?",
+ "notifications.column_settings.admin.sign_up": "Registros nuevos:",
"notifications.column_settings.alert": "Notificaciones de escritorio",
"notifications.column_settings.favourite": "Favoritos:",
"notifications.column_settings.filter_bar.advanced": "Mostrar todas las categorías",
"notifications.column_settings.filter_bar.category": "Barra de filtrado rápido",
- "notifications.column_settings.filter_bar.show": "Mostrar",
+ "notifications.column_settings.filter_bar.show_bar": "Mostrar barra de filtros",
"notifications.column_settings.follow": "Nuevos seguidores:",
"notifications.column_settings.follow_request": "Nuevas solicitudes de seguimiento:",
"notifications.column_settings.mention": "Menciones:",
@@ -322,7 +336,9 @@
"notifications.column_settings.show": "Mostrar en columna",
"notifications.column_settings.sound": "Reproducir sonido",
"notifications.column_settings.status": "Nuevos toots:",
- "notifications.column_settings.unread_markers.category": "Indicadores de notificaciones no leídas",
+ "notifications.column_settings.unread_notifications.category": "Notificaciones sin leer",
+ "notifications.column_settings.unread_notifications.highlight": "Destacar notificaciones no leídas",
+ "notifications.column_settings.update": "Ediciones:",
"notifications.filter.all": "Todos",
"notifications.filter.boosts": "Retoots",
"notifications.filter.favourites": "Favoritos",
@@ -346,7 +362,7 @@
"poll.total_votes": "{count, plural, one {# voto} other {# votos}}",
"poll.vote": "Votar",
"poll.voted": "Has votado a favor de esta respuesta",
- "poll.votes": "{votes, plural, one {# vote} other {# votes}}",
+ "poll.votes": "{votes, plural, one {# voto} other {# votes}}",
"poll_button.add_poll": "Añadir una encuesta",
"poll_button.remove_poll": "Eliminar encuesta",
"privacy.change": "Ajustar privacidad",
@@ -362,18 +378,54 @@
"regeneration_indicator.label": "Cargando…",
"regeneration_indicator.sublabel": "¡Tu historia de inicio se está preparando!",
"relative_time.days": "{number} d",
+ "relative_time.full.days": "{number, plural, one {# día} other {# días hace}}",
+ "relative_time.full.hours": "{number, plural, one {# hora} other {# horas}} hace",
+ "relative_time.full.just_now": "justo ahora",
+ "relative_time.full.minutes": "Hace {number, plural, one {# minute} other {# minutos}}",
+ "relative_time.full.seconds": "Hace {number, plural, one {# second} other {# segundos}}",
"relative_time.hours": "{number} h",
"relative_time.just_now": "ahora",
"relative_time.minutes": "{number} m",
"relative_time.seconds": "{number} s",
"relative_time.today": "hoy",
"reply_indicator.cancel": "Cancelar",
+ "report.block": "Bloquear",
+ "report.block_explanation": "No veras sus publicaciones. No podrán ver tus publicaciones ni seguirte. Podrán saber que están bloqueados.",
+ "report.categories.other": "Otro",
+ "report.categories.spam": "Spam",
+ "report.categories.violation": "El contenido viola una o más reglas del servidor",
+ "report.category.subtitle": "Selecciona la mejor coincidencia",
+ "report.category.title": "Cuéntanos lo que sucede con este {type}",
+ "report.category.title_account": "perfil",
+ "report.category.title_status": "publicación",
+ "report.close": "Realizado",
+ "report.comment.title": "¿Hay algo más que usted cree que debamos saber?",
"report.forward": "Reenviar a {target}",
"report.forward_hint": "Esta cuenta es de otro servidor. ¿Enviar una copia anonimizada del informe allí también?",
- "report.hint": "El informe se enviará a los moderadores de tu instancia. Puedes proporcionar una explicación de por qué informas sobre esta cuenta a continuación:",
+ "report.mute": "Silenciar",
+ "report.mute_explanation": "No veras sus publiaciones. Todavía pueden seguirte y ver tus publicaciones y no sabrán que están silenciados.",
+ "report.next": "Siguiente",
"report.placeholder": "Comentarios adicionales",
+ "report.reasons.dislike": "No me gusta",
+ "report.reasons.dislike_description": "No es algo que desee ver",
+ "report.reasons.other": "Es algo más",
+ "report.reasons.other_description": "El problema no encaja en otras categorías",
+ "report.reasons.spam": "Es spam",
+ "report.reasons.spam_description": "Enlaces maliciosos, Interacciones falsas, o respuestas repetitivas",
+ "report.reasons.violation": "Viola las reglas del servidor",
+ "report.reasons.violation_description": "Es consciente de que infringe normas específicas",
+ "report.rules.subtitle": "Selecciona todos los que apliquen",
+ "report.rules.title": "¿Qué reglas se están violando?",
+ "report.statuses.subtitle": "Seleccione todos lo que aplican",
+ "report.statuses.title": "¿Hay alguna publicación que respalde este informe?",
"report.submit": "Publicar",
"report.target": "Reportando",
+ "report.thanks.take_action": "Aqui hay algunas opciones para controlar lo que ves en Mastodon:",
+ "report.thanks.take_action_actionable": "Mientras revisamos esto, puedes tomar medidas contra @{name}:",
+ "report.thanks.title": "¿No quieres ver esto?",
+ "report.thanks.title_actionable": "Gracias por informar, estudiaremos esto.",
+ "report.unfollow": "Dejar de seguir @{name}",
+ "report.unfollow_explanation": "Estás siguiendo esta cuenta. Para no ver sus publicaciones en tu sección de noticias, deja de seguirlo.",
"search.placeholder": "Buscar",
"search_popout.search_format": "Formato de búsqueda avanzada",
"search_popout.tips.full_text": "Búsquedas de texto recuperan posts que has escrito, marcado como favoritos, retooteado o en los que has sido mencionado, así como usuarios, nombres y hashtags.",
@@ -382,7 +434,9 @@
"search_popout.tips.text": "El texto simple devuelve correspondencias de nombre, usuario y hashtag",
"search_popout.tips.user": "usuario",
"search_results.accounts": "Gente",
+ "search_results.all": "Todos",
"search_results.hashtags": "Etiquetas",
+ "search_results.nothing_found": "No se pudo encontrar nada para estos términos de busqueda",
"search_results.statuses": "Toots",
"search_results.statuses_fts_disabled": "Buscar toots por su contenido no está disponible en este servidor de Mastodon.",
"search_results.total": "{count, number} {count, plural, one {resultado} other {resultados}}",
@@ -396,9 +450,14 @@
"status.delete": "Borrar",
"status.detailed_status": "Vista de conversación detallada",
"status.direct": "Mensaje directo a @{name}",
+ "status.edit": "Editar",
+ "status.edited": "Editado {date}",
+ "status.edited_x_times": "Editado {count, plural, one {{count} time} other {{count} veces}}",
"status.embed": "Incrustado",
"status.favourite": "Favorito",
"status.filtered": "Filtrado",
+ "status.history.created": "{name} creó {date}",
+ "status.history.edited": "{name} editado {date}",
"status.load_more": "Cargar más",
"status.media_hidden": "Contenido multimedia oculto",
"status.mention": "Mencionar",
@@ -462,7 +521,7 @@
"upload_form.video_description": "Describir para personas con problemas auditivos o visuales",
"upload_modal.analyzing_picture": "Analizando imagen…",
"upload_modal.apply": "Aplicar",
- "upload_modal.applying": "Applying…",
+ "upload_modal.applying": "Aplicando…",
"upload_modal.choose_image": "Elegir imagen",
"upload_modal.description_placeholder": "Un rápido zorro marrón salta sobre el perro perezoso",
"upload_modal.detect_text": "Detectar texto de la imagen",
diff --git a/app/javascript/mastodon/locales/es.json b/app/javascript/mastodon/locales/es.json
index 058d6f977..ba33d8a6c 100644
--- a/app/javascript/mastodon/locales/es.json
+++ b/app/javascript/mastodon/locales/es.json
@@ -18,12 +18,12 @@
"account.followers": "Seguidores",
"account.followers.empty": "Todavía nadie sigue a este usuario.",
"account.followers_counter": "{count, plural, one {{counter} Seguidor} other {{counter} Seguidores}}",
+ "account.following": "Siguiendo",
"account.following_counter": "{count, plural, other {{counter} Siguiendo}}",
"account.follows.empty": "Este usuario todavía no sigue a nadie.",
"account.follows_you": "Te sigue",
"account.hide_reblogs": "Ocultar retoots de @{name}",
"account.joined": "Se unió el {date}",
- "account.last_status": "Última actividad",
"account.link_verified_on": "El proprietario de este link fue comprobado el {date}",
"account.locked_info": "El estado de privacidad de esta cuenta està configurado como bloqueado. El proprietario debe revisar manualmente quien puede seguirle.",
"account.media": "Multimedia",
@@ -32,7 +32,6 @@
"account.mute": "Silenciar a @{name}",
"account.mute_notifications": "Silenciar notificaciones de @{name}",
"account.muted": "Silenciado",
- "account.never_active": "Nunca",
"account.posts": "Publicaciones",
"account.posts_with_replies": "Publicaciones y respuestas",
"account.report": "Reportar a @{name}",
@@ -42,21 +41,24 @@
"account.statuses_counter": "{count, plural, one {{counter} Publicación} other {{counter} Publicaciones}}",
"account.unblock": "Desbloquear a @{name}",
"account.unblock_domain": "Mostrar a {domain}",
+ "account.unblock_short": "Desbloquear",
"account.unendorse": "No mostrar en el perfil",
"account.unfollow": "Dejar de seguir",
"account.unmute": "Dejar de silenciar a @{name}",
"account.unmute_notifications": "Dejar de silenciar las notificaciones de @{name}",
+ "account.unmute_short": "Dejar de silenciar",
"account_note.placeholder": "Clic para añadir nota",
- "admin.dashboard.retention": "Retention",
- "admin.dashboard.retention.average": "Average",
- "admin.dashboard.retention.cohort": "Sign-up month",
- "admin.dashboard.retention.cohort_size": "New users",
+ "admin.dashboard.daily_retention": "Tasa de retención de usuarios por día después del registro",
+ "admin.dashboard.monthly_retention": "Tasa de retención de usuarios por mes después del registro",
+ "admin.dashboard.retention.average": "Media",
+ "admin.dashboard.retention.cohort": "Mes de registro",
+ "admin.dashboard.retention.cohort_size": "Nuevos usuarios",
"alert.rate_limited.message": "Por favor reintente después de {retry_time, time, medium}.",
"alert.rate_limited.title": "Tarifa limitada",
"alert.unexpected.message": "Hubo un error inesperado.",
"alert.unexpected.title": "¡Ups!",
"announcement.announcement": "Anuncio",
- "attachments_list.unprocessed": "(unprocessed)",
+ "attachments_list.unprocessed": "(sin procesar)",
"autosuggest_hashtag.per_week": "{count} por semana",
"boost_modal.combo": "Puedes hacer clic en {combo} para saltar este aviso la próxima vez",
"bundle_column_error.body": "Algo salió mal al cargar este componente.",
@@ -104,6 +106,7 @@
"compose_form.poll.switch_to_single": "Modificar encuesta para permitir una única opción",
"compose_form.publish": "Tootear",
"compose_form.publish_loud": "{publish}!",
+ "compose_form.save_changes": "Guardar cambios",
"compose_form.sensitive.hide": "{count, plural, one {Marcar material como sensible} other {Marcar material como sensible}}",
"compose_form.sensitive.marked": "{count, plural, one {Material marcado como sensible} other {Material marcado como sensible}}",
"compose_form.sensitive.unmarked": "{count, plural, one {Material no marcado como sensible} other {Material no marcado como sensible}}",
@@ -118,8 +121,8 @@
"confirmations.delete.message": "¿Estás seguro de que quieres borrar esta publicación?",
"confirmations.delete_list.confirm": "Eliminar",
"confirmations.delete_list.message": "¿Seguro que quieres borrar esta lista permanentemente?",
- "confirmations.discard_edit_media.confirm": "Discard",
- "confirmations.discard_edit_media.message": "You have unsaved changes to the media description or preview, discard them anyway?",
+ "confirmations.discard_edit_media.confirm": "Descartar",
+ "confirmations.discard_edit_media.message": "Tienes cambios sin guardar en la descripción o vista previa del archivo audiovisual, ¿descartarlos de todos modos?",
"confirmations.domain_block.confirm": "Ocultar dominio entero",
"confirmations.domain_block.message": "¿Seguro de que quieres bloquear al dominio {domain} entero? En general unos cuantos bloqueos y silenciados concretos es suficiente y preferible.",
"confirmations.logout.confirm": "Cerrar sesión",
@@ -165,12 +168,13 @@
"empty_column.community": "La línea de tiempo local está vacía. ¡Escribe algo para empezar la fiesta!",
"empty_column.direct": "Aún no tienes ningún mensaje directo. Cuando envíes o recibas uno, se mostrará aquí.",
"empty_column.domain_blocks": "Todavía no hay dominios ocultos.",
+ "empty_column.explore_statuses": "Nada está en tendencia en este momento. ¡Revisa más tarde!",
"empty_column.favourited_statuses": "Aún no tienes publicaciones favoritas. Cuando marques una como favorita, aparecerá aquí.",
"empty_column.favourites": "Nadie ha marcado esta publicación como favorita. Cuando alguien lo haga, aparecerá aquí.",
"empty_column.follow_recommendations": "Parece que no se ha podido generar ninguna sugerencia para ti. Puedes probar a buscar a gente que quizá conozcas o explorar los hashtags que están en tendencia.",
"empty_column.follow_requests": "No tienes ninguna petición de seguidor. Cuando recibas una, se mostrará aquí.",
"empty_column.hashtag": "No hay nada en este hashtag aún.",
- "empty_column.home": "¡Tu línea temporal está vacía! Sigue a más personas para rellenarla. {suggestions}",
+ "empty_column.home": "¡Tu línea de tiempo está vacía! Sigue a más personas para rellenarla. {suggestions}",
"empty_column.home.suggestions": "Ver algunas sugerencias",
"empty_column.list": "No hay nada en esta lista aún. Cuando miembros de esta lista publiquen nuevos estatus, estos aparecerán qui.",
"empty_column.lists": "No tienes ninguna lista. cuando crees una, se mostrará aquí.",
@@ -183,6 +187,12 @@
"error.unexpected_crash.next_steps_addons": "Intenta deshabilitarlos y recarga la página. Si eso no ayuda, podrías usar Mastodon a través de un navegador web diferente o aplicación nativa.",
"errors.unexpected_crash.copy_stacktrace": "Copiar el seguimiento de pila en el portapapeles",
"errors.unexpected_crash.report_issue": "Informar de un problema/error",
+ "explore.search_results": "Resultados de búsqueda",
+ "explore.suggested_follows": "Para ti",
+ "explore.title": "Explorar",
+ "explore.trending_links": "Noticias",
+ "explore.trending_statuses": "Publicaciones",
+ "explore.trending_tags": "Etiquetas",
"follow_recommendations.done": "Hecho",
"follow_recommendations.heading": "¡Sigue a gente que publique cosas que te gusten! Aquí tienes algunas sugerencias.",
"follow_recommendations.lead": "Las publicaciones de la gente a la que sigas aparecerán ordenadas cronológicamente en Inicio. No tengas miedo de cometer errores, ¡puedes dejarles de seguir en cualquier momento con la misma facilidad!",
@@ -226,12 +236,12 @@
"keyboard_shortcuts.enter": "abrir estado",
"keyboard_shortcuts.favourite": "añadir a favoritos",
"keyboard_shortcuts.favourites": "abrir la lista de favoritos",
- "keyboard_shortcuts.federated": "abrir el timeline federado",
+ "keyboard_shortcuts.federated": "Abrir la línea de tiempo federada",
"keyboard_shortcuts.heading": "Keyboard Shortcuts",
- "keyboard_shortcuts.home": "abrir el timeline propio",
+ "keyboard_shortcuts.home": "Abrir línea de tiempo",
"keyboard_shortcuts.hotkey": "Tecla caliente",
"keyboard_shortcuts.legend": "para mostrar esta leyenda",
- "keyboard_shortcuts.local": "abrir el timeline local",
+ "keyboard_shortcuts.local": "Abrir línea de tiempo local",
"keyboard_shortcuts.mention": "para mencionar al autor",
"keyboard_shortcuts.muted": "abrir la lista de usuarios silenciados",
"keyboard_shortcuts.my_profile": "abrir tu perfil",
@@ -278,12 +288,13 @@
"navigation_bar.apps": "Aplicaciones móviles",
"navigation_bar.blocks": "Usuarios bloqueados",
"navigation_bar.bookmarks": "Marcadores",
- "navigation_bar.community_timeline": "Historia local",
+ "navigation_bar.community_timeline": "Línea de tiempo local",
"navigation_bar.compose": "Escribir nueva publicación",
"navigation_bar.direct": "Mensajes directos",
"navigation_bar.discover": "Descubrir",
"navigation_bar.domain_blocks": "Dominios ocultos",
"navigation_bar.edit_profile": "Editar perfil",
+ "navigation_bar.explore": "Explorar",
"navigation_bar.favourites": "Favoritos",
"navigation_bar.filters": "Palabras silenciadas",
"navigation_bar.follow_requests": "Solicitudes para seguirte",
@@ -296,8 +307,9 @@
"navigation_bar.personal": "Personal",
"navigation_bar.pins": "Publicaciones fijadas",
"navigation_bar.preferences": "Preferencias",
- "navigation_bar.public_timeline": "Historia federada",
+ "navigation_bar.public_timeline": "Línea de tiempo federada",
"navigation_bar.security": "Seguridad",
+ "notification.admin.sign_up": "{name} se registró",
"notification.favourite": "{name} marcó tu estado como favorito",
"notification.follow": "{name} te empezó a seguir",
"notification.follow_request": "{name} ha solicitado seguirte",
@@ -306,13 +318,15 @@
"notification.poll": "Una encuesta en la que has votado ha terminado",
"notification.reblog": "{name} ha retooteado tu publicación",
"notification.status": "{name} acaba de publicar",
+ "notification.update": "{name} editó una publicación",
"notifications.clear": "Limpiar notificaciones",
"notifications.clear_confirmation": "¿Seguro que quieres limpiar permanentemente todas tus notificaciones?",
+ "notifications.column_settings.admin.sign_up": "Nuevos registros:",
"notifications.column_settings.alert": "Notificaciones de escritorio",
"notifications.column_settings.favourite": "Favoritos:",
"notifications.column_settings.filter_bar.advanced": "Mostrar todas las categorías",
"notifications.column_settings.filter_bar.category": "Barra de filtrado rápido",
- "notifications.column_settings.filter_bar.show": "Mostrar",
+ "notifications.column_settings.filter_bar.show_bar": "Mostrar barra de filtros",
"notifications.column_settings.follow": "Nuevos seguidores:",
"notifications.column_settings.follow_request": "Nuevas solicitudes de seguimiento:",
"notifications.column_settings.mention": "Menciones:",
@@ -322,7 +336,9 @@
"notifications.column_settings.show": "Mostrar en columna",
"notifications.column_settings.sound": "Reproducir sonido",
"notifications.column_settings.status": "Nuevas publicaciones:",
- "notifications.column_settings.unread_markers.category": "Indicadores de notificaciones no leídas",
+ "notifications.column_settings.unread_notifications.category": "Notificaciones sin leer",
+ "notifications.column_settings.unread_notifications.highlight": "Destacar notificaciones no leídas",
+ "notifications.column_settings.update": "Ediciones:",
"notifications.filter.all": "Todos",
"notifications.filter.boosts": "Retoots",
"notifications.filter.favourites": "Favoritos",
@@ -346,7 +362,7 @@
"poll.total_votes": "{count, plural, one {# voto} other {# votos}}",
"poll.vote": "Votar",
"poll.voted": "Has votado a favor de esta respuesta",
- "poll.votes": "{votes, plural, one {# vote} other {# votes}}",
+ "poll.votes": "{votes, plural, one {# voto} other {# votos}}",
"poll_button.add_poll": "Añadir una encuesta",
"poll_button.remove_poll": "Eliminar encuesta",
"privacy.change": "Ajustar privacidad",
@@ -362,18 +378,54 @@
"regeneration_indicator.label": "Cargando…",
"regeneration_indicator.sublabel": "¡Tu historia de inicio se está preparando!",
"relative_time.days": "{number} d",
+ "relative_time.full.days": "hace {number, plural, one {# día} other {# días}}",
+ "relative_time.full.hours": "hace {number, plural, one {# hora} other {# horas}}",
+ "relative_time.full.just_now": "justo ahora",
+ "relative_time.full.minutes": "hace {number, plural, one {# minuto} other {# minutos}}",
+ "relative_time.full.seconds": "hace {number, plural, one {# segundo} other {# segundos}}",
"relative_time.hours": "{number} h",
"relative_time.just_now": "ahora",
"relative_time.minutes": "{number} m",
"relative_time.seconds": "{number} s",
"relative_time.today": "hoy",
"reply_indicator.cancel": "Cancelar",
+ "report.block": "Bloquear",
+ "report.block_explanation": "No verás sus publicaciones. No podrán ver tus publicaciones ni seguirte. Podrán saber que están bloqueados.",
+ "report.categories.other": "Otros",
+ "report.categories.spam": "Spam",
+ "report.categories.violation": "El contenido viola una o más reglas del servidor",
+ "report.category.subtitle": "Elige la mejor coincidencia",
+ "report.category.title": "Cuéntanos lo que está pasando con este {type}",
+ "report.category.title_account": "perfil",
+ "report.category.title_status": "publicacion",
+ "report.close": "Hecho",
+ "report.comment.title": "¿Hay algo más que creas que deberíamos saber?",
"report.forward": "Reenviar a {target}",
"report.forward_hint": "Esta cuenta es de otro servidor. ¿Enviar una copia anonimizada del informe allí también?",
- "report.hint": "El informe se enviará a los moderadores de tu instancia. Puedes proporcionar una explicación de por qué informas sobre esta cuenta a continuación:",
+ "report.mute": "Silenciar",
+ "report.mute_explanation": "No verás sus publicaciones. Todavía pueden seguirte y ver tus mensajes y no sabrán que están silenciados.",
+ "report.next": "Siguiente",
"report.placeholder": "Comentarios adicionales",
+ "report.reasons.dislike": "No me gusta",
+ "report.reasons.dislike_description": "No es algo que quieras ver",
+ "report.reasons.other": "Es otra cosa",
+ "report.reasons.other_description": "El problema no encaja en otras categorías",
+ "report.reasons.spam": "Es spam",
+ "report.reasons.spam_description": "Enlaces maliciosos, interacciones falsas o respuestas repetitivas",
+ "report.reasons.violation": "Viola las reglas del servidor",
+ "report.reasons.violation_description": "Eres consciente de que infringe las normas específicas",
+ "report.rules.subtitle": "Selecciona todos los que correspondan",
+ "report.rules.title": "¿Qué normas se están violando?",
+ "report.statuses.subtitle": "Selecciona todos los que correspondan",
+ "report.statuses.title": "¿Hay alguna publicación que respalde este informe?",
"report.submit": "Publicar",
"report.target": "Reportando",
+ "report.thanks.take_action": "Aquí están tus opciones para controlar lo que ves en Mastodon:",
+ "report.thanks.take_action_actionable": "Mientras revisamos esto, puedes tomar medidas contra @{name}:",
+ "report.thanks.title": "¿No quieres esto?",
+ "report.thanks.title_actionable": "Gracias por informar, estudiaremos esto.",
+ "report.unfollow": "Dejar de seguir a @{name}",
+ "report.unfollow_explanation": "Estás siguiendo esta cuenta. Para no ver sus publicaciones en tu muro de inicio, deja de seguirla.",
"search.placeholder": "Buscar",
"search_popout.search_format": "Formato de búsqueda avanzada",
"search_popout.tips.full_text": "Las búsquedas de texto recuperan publicaciones que has escrito, marcado como favoritas, retooteado o en los que has sido mencionado, así como usuarios, nombres y hashtags.",
@@ -382,7 +434,9 @@
"search_popout.tips.text": "El texto simple devuelve correspondencias de nombre, usuario y hashtag",
"search_popout.tips.user": "usuario",
"search_results.accounts": "Gente",
+ "search_results.all": "Todos",
"search_results.hashtags": "Etiquetas",
+ "search_results.nothing_found": "No se pudo encontrar nada para estos términos de búsqueda",
"search_results.statuses": "Publicaciones",
"search_results.statuses_fts_disabled": "Buscar publicaciones por su contenido no está disponible en este servidor de Mastodon.",
"search_results.total": "{count, number} {count, plural, one {resultado} other {resultados}}",
@@ -396,9 +450,14 @@
"status.delete": "Borrar",
"status.detailed_status": "Vista de conversación detallada",
"status.direct": "Mensaje directo a @{name}",
+ "status.edit": "Editar",
+ "status.edited": "Editado {date}",
+ "status.edited_x_times": "Editado {count, plural, one {{count} vez} other {{count} veces}}",
"status.embed": "Incrustado",
"status.favourite": "Favorito",
"status.filtered": "Filtrado",
+ "status.history.created": "{name} creó {date}",
+ "status.history.edited": "{name} editó {date}",
"status.load_more": "Cargar más",
"status.media_hidden": "Contenido multimedia oculto",
"status.mention": "Mencionar",
@@ -430,7 +489,7 @@
"status.unpin": "Dejar de fijar",
"suggestions.dismiss": "Descartar sugerencia",
"suggestions.header": "Es posible que te interese…",
- "tabs_bar.federated_timeline": "Federado",
+ "tabs_bar.federated_timeline": "Federada",
"tabs_bar.home": "Inicio",
"tabs_bar.local_timeline": "Local",
"tabs_bar.notifications": "Notificaciones",
@@ -462,7 +521,7 @@
"upload_form.video_description": "Describir para personas con problemas auditivos o visuales",
"upload_modal.analyzing_picture": "Analizando imagen…",
"upload_modal.apply": "Aplicar",
- "upload_modal.applying": "Applying…",
+ "upload_modal.applying": "Aplicando…",
"upload_modal.choose_image": "Elegir imagen",
"upload_modal.description_placeholder": "Un rápido zorro marrón salta sobre el perro perezoso",
"upload_modal.detect_text": "Detectar texto de la imagen",
diff --git a/app/javascript/mastodon/locales/et.json b/app/javascript/mastodon/locales/et.json
index e71e56dee..e3bcdb521 100644
--- a/app/javascript/mastodon/locales/et.json
+++ b/app/javascript/mastodon/locales/et.json
@@ -18,12 +18,12 @@
"account.followers": "Jälgijad",
"account.followers.empty": "Keegi ei jälgi seda kasutajat veel.",
"account.followers_counter": "{count, plural, one {{counter} Follower} other {{counter} Followers}}",
+ "account.following": "Following",
"account.following_counter": "{count, plural, one {{counter} Following} other {{counter} Following}}",
"account.follows.empty": "See kasutaja ei jälgi veel kedagi.",
"account.follows_you": "Jälgib Teid",
"account.hide_reblogs": "Peida upitused kasutajalt @{name}",
"account.joined": "Joined {date}",
- "account.last_status": "Viimati aktiivne",
"account.link_verified_on": "Selle lingi autorsust kontrolliti {date}",
"account.locked_info": "Selle konto privaatsussätteks on lukustatud. Omanik vaatab manuaalselt üle, kes teda jägida saab.",
"account.media": "Meedia",
@@ -32,7 +32,6 @@
"account.mute": "Vaigista @{name}",
"account.mute_notifications": "Vaigista teated kasutajalt @{name}",
"account.muted": "Vaigistatud",
- "account.never_active": "Mitte kunagi",
"account.posts": "Tuututused",
"account.posts_with_replies": "Tuututused ja vastused",
"account.report": "Raporteeri @{name}",
@@ -42,12 +41,15 @@
"account.statuses_counter": "{count, plural, one {{counter} Toot} other {{counter} Toots}}",
"account.unblock": "Eemalda blokeering @{name}",
"account.unblock_domain": "Tee {domain} nähtavaks",
+ "account.unblock_short": "Unblock",
"account.unendorse": "Ära kuva profiilil",
"account.unfollow": "Ära jälgi",
"account.unmute": "Ära vaigista @{name}",
"account.unmute_notifications": "Ära vaigista teateid kasutajalt @{name}",
+ "account.unmute_short": "Unmute",
"account_note.placeholder": "Click to add a note",
- "admin.dashboard.retention": "Retention",
+ "admin.dashboard.daily_retention": "User retention rate by day after sign-up",
+ "admin.dashboard.monthly_retention": "User retention rate by month after sign-up",
"admin.dashboard.retention.average": "Average",
"admin.dashboard.retention.cohort": "Sign-up month",
"admin.dashboard.retention.cohort_size": "New users",
@@ -104,6 +106,7 @@
"compose_form.poll.switch_to_single": "Muuda küsitlust lubamaks ainult ühte valikut",
"compose_form.publish": "Tuut",
"compose_form.publish_loud": "{publish}!",
+ "compose_form.save_changes": "Save changes",
"compose_form.sensitive.hide": "Märgista meedia tundlikuks",
"compose_form.sensitive.marked": "Meedia on sensitiivseks märgitud",
"compose_form.sensitive.unmarked": "Meedia ei ole sensitiivseks märgitud",
@@ -165,6 +168,7 @@
"empty_column.community": "Kohalik ajajoon on tühi. Kirjutage midagi avalikult, et pall veerema ajada!",
"empty_column.direct": "Teil ei ole veel otsesõnumeid. Kui saadate või võtate mõne vastu, ilmuvad nad siia.",
"empty_column.domain_blocks": "Siin ei ole veel peidetud domeene.",
+ "empty_column.explore_statuses": "Nothing is trending right now. Check back later!",
"empty_column.favourited_statuses": "Teil pole veel lemmikuid tuute. Kui märgite mõne, näete neid siin.",
"empty_column.favourites": "Keegi pole veel seda tuuti lemmikuks märkinud. Kui seegi seda teeb, näed seda siin.",
"empty_column.follow_recommendations": "Looks like no suggestions could be generated for you. You can try using search to look for people you might know or explore trending hashtags.",
@@ -183,6 +187,12 @@
"error.unexpected_crash.next_steps_addons": "Try disabling them and refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
"errors.unexpected_crash.copy_stacktrace": "Kopeeri stacktrace lõikelauale",
"errors.unexpected_crash.report_issue": "Teavita veast",
+ "explore.search_results": "Search results",
+ "explore.suggested_follows": "For you",
+ "explore.title": "Explore",
+ "explore.trending_links": "News",
+ "explore.trending_statuses": "Posts",
+ "explore.trending_tags": "Hashtags",
"follow_recommendations.done": "Done",
"follow_recommendations.heading": "Follow people you'd like to see posts from! Here are some suggestions.",
"follow_recommendations.lead": "Posts from people you follow will show up in chronological order on your home feed. Don't be afraid to make mistakes, you can unfollow people just as easily any time!",
@@ -284,6 +294,7 @@
"navigation_bar.discover": "Avasta",
"navigation_bar.domain_blocks": "Peidetud domeenid",
"navigation_bar.edit_profile": "Muuda profiili",
+ "navigation_bar.explore": "Explore",
"navigation_bar.favourites": "Lemmikud",
"navigation_bar.filters": "Vaigistatud sõnad",
"navigation_bar.follow_requests": "Jälgimistaotlused",
@@ -298,6 +309,7 @@
"navigation_bar.preferences": "Eelistused",
"navigation_bar.public_timeline": "Föderatiivne ajajoon",
"navigation_bar.security": "Turvalisus",
+ "notification.admin.sign_up": "{name} signed up",
"notification.favourite": "{name} märkis Teie staatuse lemmikuks",
"notification.follow": "{name} jälgib nüüd Teid",
"notification.follow_request": "{name} soovib Teid jälgida",
@@ -306,13 +318,15 @@
"notification.poll": "Küsitlus, milles osalesite, on lõppenud",
"notification.reblog": "{name} upitas Teie staatust",
"notification.status": "{name} just posted",
+ "notification.update": "{name} edited a post",
"notifications.clear": "Puhasta teated",
"notifications.clear_confirmation": "Olete kindel, et soovite püsivalt kõik oma teated eemaldada?",
+ "notifications.column_settings.admin.sign_up": "New sign-ups:",
"notifications.column_settings.alert": "Töölauateated",
"notifications.column_settings.favourite": "Lemmikud:",
"notifications.column_settings.filter_bar.advanced": "Kuva kõik kategooriad",
"notifications.column_settings.filter_bar.category": "Kiirfiltri riba",
- "notifications.column_settings.filter_bar.show": "Kuva",
+ "notifications.column_settings.filter_bar.show_bar": "Show filter bar",
"notifications.column_settings.follow": "Uued jälgijad:",
"notifications.column_settings.follow_request": "Uued jälgimistaotlused:",
"notifications.column_settings.mention": "Mainimised:",
@@ -322,7 +336,9 @@
"notifications.column_settings.show": "Kuva tulbas",
"notifications.column_settings.sound": "Mängi heli",
"notifications.column_settings.status": "New toots:",
- "notifications.column_settings.unread_markers.category": "Unread notification markers",
+ "notifications.column_settings.unread_notifications.category": "Unread notifications",
+ "notifications.column_settings.unread_notifications.highlight": "Highlight unread notifications",
+ "notifications.column_settings.update": "Edits:",
"notifications.filter.all": "Kõik",
"notifications.filter.boosts": "Upitused",
"notifications.filter.favourites": "Lemmikud",
@@ -362,18 +378,54 @@
"regeneration_indicator.label": "Laeb…",
"regeneration_indicator.sublabel": "Teie kodu voog on ettevalmistamisel!",
"relative_time.days": "{number}p",
+ "relative_time.full.days": "{number, plural, one {# day} other {# days}} ago",
+ "relative_time.full.hours": "{number, plural, one {# hour} other {# hours}} ago",
+ "relative_time.full.just_now": "just now",
+ "relative_time.full.minutes": "{number, plural, one {# minute} other {# minutes}} ago",
+ "relative_time.full.seconds": "{number, plural, one {# second} other {# seconds}} ago",
"relative_time.hours": "{number}t",
"relative_time.just_now": "nüüd",
"relative_time.minutes": "{number}m",
"relative_time.seconds": "{number}s",
"relative_time.today": "täna",
"reply_indicator.cancel": "Tühista",
+ "report.block": "Block",
+ "report.block_explanation": "You will not see their posts. They will not be able to see your posts or follow you. They will be able to tell that they are blocked.",
+ "report.categories.other": "Other",
+ "report.categories.spam": "Spam",
+ "report.categories.violation": "Content violates one or more server rules",
+ "report.category.subtitle": "Choose the best match",
+ "report.category.title": "Tell us what's going on with this {type}",
+ "report.category.title_account": "profile",
+ "report.category.title_status": "post",
+ "report.close": "Done",
+ "report.comment.title": "Is there anything else you think we should know?",
"report.forward": "Edasta kasutajale {target}",
"report.forward_hint": "See kasutaja on teisest serverist. Kas saadan anonümiseeritud koopia sellest teatest sinna ka?",
- "report.hint": "See teade saadetakse Teie serveri moderaatoritele. Te saate lisada selgituse selle kohta, miks selle kasutaja kohta teate esitasite, siin:",
+ "report.mute": "Mute",
+ "report.mute_explanation": "You will not see their posts. They can still follow you and see your posts and will not know that they are muted.",
+ "report.next": "Next",
"report.placeholder": "Lisaks kommentaarid",
+ "report.reasons.dislike": "I don't like it",
+ "report.reasons.dislike_description": "It is not something you want to see",
+ "report.reasons.other": "It's something else",
+ "report.reasons.other_description": "The issue does not fit into other categories",
+ "report.reasons.spam": "It's spam",
+ "report.reasons.spam_description": "Malicious links, fake engagement, or repetitive replies",
+ "report.reasons.violation": "It violates server rules",
+ "report.reasons.violation_description": "You are aware that it breaks specific rules",
+ "report.rules.subtitle": "Select all that apply",
+ "report.rules.title": "Which rules are being violated?",
+ "report.statuses.subtitle": "Select all that apply",
+ "report.statuses.title": "Are there any posts that back up this report?",
"report.submit": "Saada",
"report.target": "Teatamine {target} kohta",
+ "report.thanks.take_action": "Here are your options for controlling what you see on Mastodon:",
+ "report.thanks.take_action_actionable": "While we review this, you can take action against @{name}:",
+ "report.thanks.title": "Don't want to see this?",
+ "report.thanks.title_actionable": "Thanks for reporting, we'll look into this.",
+ "report.unfollow": "Unfollow @{name}",
+ "report.unfollow_explanation": "You are following this account. To not see their posts in your home feed anymore, unfollow them.",
"search.placeholder": "Otsi",
"search_popout.search_format": "Täiustatud otsiformaat",
"search_popout.tips.full_text": "Lihtne tekst toob esile staatused mida olete kirjutanud, lisanud lemmikuks, upitanud või olete seal mainitud, ning lisaks veel kattuvad kasutajanimed, kuvanimed ja sildid.",
@@ -382,7 +434,9 @@
"search_popout.tips.text": "Lihtne tekst toob esile kattuvad kuvanimed, kasutajanimed ning sildid",
"search_popout.tips.user": "kasutaja",
"search_results.accounts": "Inimesed",
+ "search_results.all": "All",
"search_results.hashtags": "Sildid",
+ "search_results.nothing_found": "Could not find anything for these search terms",
"search_results.statuses": "Tuudid",
"search_results.statuses_fts_disabled": "Tuutsude otsimine nende sisu järgi ei ole sellel Mastodoni serveril sisse lülitatud.",
"search_results.total": "{count, number} {count, plural, one {tulemus} other {tulemust}}",
@@ -396,9 +450,14 @@
"status.delete": "Kustuta",
"status.detailed_status": "Detailne vestluskuva",
"status.direct": "Otsesõnum @{name}",
+ "status.edit": "Edit",
+ "status.edited": "Edited {date}",
+ "status.edited_x_times": "Edited {count, plural, one {{count} time} other {{count} times}}",
"status.embed": "Sängita",
"status.favourite": "Lemmik",
"status.filtered": "Filtreeritud",
+ "status.history.created": "{name} created {date}",
+ "status.history.edited": "{name} edited {date}",
"status.load_more": "Lae veel",
"status.media_hidden": "Meedia peidetud",
"status.mention": "Mainimine @{name}",
diff --git a/app/javascript/mastodon/locales/eu.json b/app/javascript/mastodon/locales/eu.json
index b457b7d45..a5cbf5128 100644
--- a/app/javascript/mastodon/locales/eu.json
+++ b/app/javascript/mastodon/locales/eu.json
@@ -18,12 +18,12 @@
"account.followers": "Jarraitzaileak",
"account.followers.empty": "Ez du inork erabiltzaile hau jarraitzen oraindik.",
"account.followers_counter": "{count, plural, one {Jarraitzaile {counter}} other {{counter} jarraitzaile}}",
+ "account.following": "Jarraitzen",
"account.following_counter": "{count, plural, one {{counter} jarraitzen} other {{counter} jarraitzen}}",
"account.follows.empty": "Erabiltzaile honek ez du inor jarraitzen oraindik.",
"account.follows_you": "Jarraitzen dizu",
"account.hide_reblogs": "Ezkutatu @{name}(r)en bultzadak",
"account.joined": "{date}(e)an elkartua",
- "account.last_status": "Azkenekoz aktiboa",
"account.link_verified_on": "Esteka honen jabetzaren egiaztaketa data: {date}",
"account.locked_info": "Kontu honen pribatutasun egoera blokeatuta gisa ezarri da. Jabeak eskuz erabakitzen du nork jarraitu diezaioken.",
"account.media": "Multimedia",
@@ -32,7 +32,6 @@
"account.mute": "Mututu @{name}",
"account.mute_notifications": "Mututu @{name}(r)en jakinarazpenak",
"account.muted": "Mutututa",
- "account.never_active": "Inoiz ez",
"account.posts": "Bidalketa",
"account.posts_with_replies": "Bidalketak eta erantzunak",
"account.report": "Salatu @{name}",
@@ -42,21 +41,24 @@
"account.statuses_counter": "{count, plural, one {Bidalketa {counter}} other {{counter} bidalketa}}",
"account.unblock": "Desblokeatu @{name}",
"account.unblock_domain": "Berriz erakutsi {domain}",
+ "account.unblock_short": "Desblokeatu",
"account.unendorse": "Ez nabarmendu profilean",
"account.unfollow": "Utzi jarraitzeari",
"account.unmute": "Desmututu @{name}",
"account.unmute_notifications": "Desmututu @{name}(r)en jakinarazpenak",
+ "account.unmute_short": "Desmututu",
"account_note.placeholder": "Click to add a note",
- "admin.dashboard.retention": "Retention",
- "admin.dashboard.retention.average": "Average",
- "admin.dashboard.retention.cohort": "Sign-up month",
- "admin.dashboard.retention.cohort_size": "New users",
+ "admin.dashboard.daily_retention": "Erabiltzaile atxikitze-tasa izena eman ondorengo eguneko",
+ "admin.dashboard.monthly_retention": "Erabiltzaile atxikitze-tasa izena eman ondorengo hilabeteko",
+ "admin.dashboard.retention.average": "Batezbestekoa",
+ "admin.dashboard.retention.cohort": "Izen emate hilean",
+ "admin.dashboard.retention.cohort_size": "Erabiltzaile berriak",
"alert.rate_limited.message": "Saiatu {retry_time, time, medium} barru.",
"alert.rate_limited.title": "Abiadura mugatua",
"alert.unexpected.message": "Ustekabeko errore bat gertatu da.",
"alert.unexpected.title": "Ene!",
"announcement.announcement": "Iragarpena",
- "attachments_list.unprocessed": "(unprocessed)",
+ "attachments_list.unprocessed": "(prozesatu gabe)",
"autosuggest_hashtag.per_week": "{count} asteko",
"boost_modal.combo": "{combo} sakatu dezakezu hurrengoan hau saltatzeko",
"bundle_column_error.body": "Zerbait okerra gertatu da osagai hau kargatzean.",
@@ -104,6 +106,7 @@
"compose_form.poll.switch_to_single": "Aldatu inkesta aukera bakarra onartzeko",
"compose_form.publish": "Toot",
"compose_form.publish_loud": "{publish}!",
+ "compose_form.save_changes": "Gorde aldaketak",
"compose_form.sensitive.hide": "Markatu multimedia hunkigarri gisa",
"compose_form.sensitive.marked": "Multimedia edukia hunkigarri gisa markatu da",
"compose_form.sensitive.unmarked": "Multimedia edukia ez da hunkigarri gisa markatu",
@@ -118,8 +121,8 @@
"confirmations.delete.message": "Ziur bidalketa hau ezabatu nahi duzula?",
"confirmations.delete_list.confirm": "Ezabatu",
"confirmations.delete_list.message": "Ziur behin betiko ezabatu nahi duzula zerrenda hau?",
- "confirmations.discard_edit_media.confirm": "Discard",
- "confirmations.discard_edit_media.message": "You have unsaved changes to the media description or preview, discard them anyway?",
+ "confirmations.discard_edit_media.confirm": "Baztertu",
+ "confirmations.discard_edit_media.message": "Multimediaren deskribapen edo aurrebistan gorde gabeko aldaketak daude, baztertu nahi dituzu?",
"confirmations.domain_block.confirm": "Ezkutatu domeinu osoa",
"confirmations.domain_block.message": "Ziur, erabat ziur, {domain} domeinu osoa blokeatu nahi duzula? Gehienetan gutxi batzuk blokeatu edo mututzearekin nahikoa da. Ez duzu domeinu horretako edukirik ikusiko denbora lerroetan edo jakinarazpenetan. Domeinu horretako zure jarraitzaileak kenduko dira ere.",
"confirmations.logout.confirm": "Amaitu saioa",
@@ -165,6 +168,7 @@
"empty_column.community": "Denbora-lerro lokala hutsik dago. Idatzi zerbait publikoki pilota biraka jartzeko!",
"empty_column.direct": "Ez duzu mezu zuzenik oraindik. Baten bat bidali edo jasotzen duzunean, hemen agertuko da.",
"empty_column.domain_blocks": "Ez dago ezkutatutako domeinurik oraindik.",
+ "empty_column.explore_statuses": "Ez dago joerarik une honetan. Begiratu beranduago!",
"empty_column.favourited_statuses": "Ez duzu gogokorik oraindik. Gogokoren bat duzunean hemen agertuko da.",
"empty_column.favourites": "Ez du inork gogokoetara gehitu bidalketa hau oraindik. Inork egiten duenean, hemen agertuko dira.",
"empty_column.follow_recommendations": "Dirudienez ezin izan da zuretzako proposamenik sortu. Bilaketa erabili dezakezu ezagutzen duzun jendea aurkitzeko edo traolen joerak arakatu.",
@@ -183,6 +187,12 @@
"error.unexpected_crash.next_steps_addons": "Saiatu desgaitu eta orria berritzen. Horrek ez badu laguntzen, agian Mastodon erabiltzeko aukera duzu oraindik ere beste nabigatzaile bat edo aplikazio natibo bat erabilita.",
"errors.unexpected_crash.copy_stacktrace": "Kopiatu irteera arbelera",
"errors.unexpected_crash.report_issue": "Eman arazoaren berri",
+ "explore.search_results": "Bilaketaren emaitzak",
+ "explore.suggested_follows": "Zuretzat",
+ "explore.title": "Arakatu",
+ "explore.trending_links": "Berriak",
+ "explore.trending_statuses": "Bidalketak",
+ "explore.trending_tags": "Traolak",
"follow_recommendations.done": "Egina",
"follow_recommendations.heading": "Jarraitu jendea beren bidalketak ikusteko! Hemen dituzu iradokizun batzuk.",
"follow_recommendations.lead": "Jarraitzen duzun jendearen bidalketak ordena kronologikoan agertuko dira zure hasierako jarioan. Ez izan akatsak egiteko beldurrik, jendea jarraitzeari uztea erraza da!",
@@ -284,6 +294,7 @@
"navigation_bar.discover": "Aurkitu",
"navigation_bar.domain_blocks": "Ezkutatutako domeinuak",
"navigation_bar.edit_profile": "Aldatu profila",
+ "navigation_bar.explore": "Arakatu",
"navigation_bar.favourites": "Gogokoak",
"navigation_bar.filters": "Mutututako hitzak",
"navigation_bar.follow_requests": "Jarraitzeko eskariak",
@@ -298,6 +309,7 @@
"navigation_bar.preferences": "Hobespenak",
"navigation_bar.public_timeline": "Federatutako denbora-lerroa",
"navigation_bar.security": "Segurtasuna",
+ "notification.admin.sign_up": "{name} erabiltzailea erregistratu da",
"notification.favourite": "{name}(e)k zure bidalketa gogoko du",
"notification.follow": "{name}(e)k jarraitzen zaitu",
"notification.follow_request": "{name}(e)k zu jarraitzeko eskaera egin du",
@@ -306,13 +318,15 @@
"notification.poll": "Zuk erantzun duzun inkesta bat bukatu da",
"notification.reblog": "{name}(e)k bultzada eman dio zure bidalketari",
"notification.status": "{name} erabiltzaileak bidalketa egin berri du",
+ "notification.update": "{name} erabiltzaileak bidalketa bat editatu du",
"notifications.clear": "Garbitu jakinarazpenak",
"notifications.clear_confirmation": "Ziur zure jakinarazpen guztiak behin betirako garbitu nahi dituzula?",
+ "notifications.column_settings.admin.sign_up": "Izen-emate berriak:",
"notifications.column_settings.alert": "Mahaigaineko jakinarazpenak",
"notifications.column_settings.favourite": "Gogokoak:",
"notifications.column_settings.filter_bar.advanced": "Erakutsi kategoria guztiak",
"notifications.column_settings.filter_bar.category": "Iragazki azkarraren barra",
- "notifications.column_settings.filter_bar.show": "Erakutsi",
+ "notifications.column_settings.filter_bar.show_bar": "Erakutsi iragazki-barra",
"notifications.column_settings.follow": "Jarraitzaile berriak:",
"notifications.column_settings.follow_request": "Jarraitzeko eskaera berriak:",
"notifications.column_settings.mention": "Aipamenak:",
@@ -322,7 +336,9 @@
"notifications.column_settings.show": "Erakutsi zutabean",
"notifications.column_settings.sound": "Jo soinua",
"notifications.column_settings.status": "Bidalketa berriak:",
- "notifications.column_settings.unread_markers.category": "Irakurri gabeko jakinarazpenen markatzaileak",
+ "notifications.column_settings.unread_notifications.category": "Irakurri gabeko jakinarazpenak",
+ "notifications.column_settings.unread_notifications.highlight": "Nabarmendu irakurri gabeko jakinarazpenak",
+ "notifications.column_settings.update": "Edizioak:",
"notifications.filter.all": "Denak",
"notifications.filter.boosts": "Bultzadak",
"notifications.filter.favourites": "Gogokoak",
@@ -346,7 +362,7 @@
"poll.total_votes": "{count, plural, one {boto #} other {# boto}}",
"poll.vote": "Bozkatu",
"poll.voted": "Erantzun honi eman diozu botoa",
- "poll.votes": "{votes, plural, one {# vote} other {# votes}}",
+ "poll.votes": "{votes, plural, one {boto #} other {# boto}}",
"poll_button.add_poll": "Gehitu inkesta bat",
"poll_button.remove_poll": "Kendu inkesta",
"privacy.change": "Aldatu bidalketaren pribatutasuna",
@@ -362,18 +378,54 @@
"regeneration_indicator.label": "Kargatzen…",
"regeneration_indicator.sublabel": "Zure hasiera-jarioa prestatzen ari da!",
"relative_time.days": "{number}e",
+ "relative_time.full.days": "Duela {number, plural, one {egun #} other {# egun}}",
+ "relative_time.full.hours": "Duela {number, plural, one {ordu #} other {# ordu}}",
+ "relative_time.full.just_now": "oraintxe",
+ "relative_time.full.minutes": "Duela {number, plural, one {minutu #} other {# minutu}}",
+ "relative_time.full.seconds": "Duela {number, plural, one {segundo #} other {# segundo}}",
"relative_time.hours": "{number}h",
"relative_time.just_now": "orain",
"relative_time.minutes": "{number}m",
"relative_time.seconds": "{number}s",
"relative_time.today": "gaur",
"reply_indicator.cancel": "Utzi",
+ "report.block": "Blokeatu",
+ "report.block_explanation": "Ez dituzu bere bidalketak ikusiko. Ezingo dituzte zure bidalketak ikusi eta ez jarraitu. Blokeatu dituzula jakin dezakete.",
+ "report.categories.other": "Bestelakoak",
+ "report.categories.spam": "Spam",
+ "report.categories.violation": "Edukiak zerbitzariko arau bat edo gehiago urratzen ditu",
+ "report.category.subtitle": "Aukeratu egokiena",
+ "report.category.title": "Kontaiguzu zer gertatzen den {type} honekin",
+ "report.category.title_account": "profil",
+ "report.category.title_status": "bidalketa",
+ "report.close": "Egina",
+ "report.comment.title": "Beste zerbait jakin beharko genuke?",
"report.forward": "Birbidali hona: {target}",
"report.forward_hint": "Kontu hau beste zerbitzari batekoa da. Bidali txostenaren kopia anonimo hara ere?",
- "report.hint": "Txostena zure zerbitzariaren moderatzaileei bidaliko zaie. Kontu hau zergatik salatzen duzun behean azaldu dezakezu:",
+ "report.mute": "Mututu",
+ "report.mute_explanation": "Ez dituzu bere bidalketak ikusiko. Zu jarraitu eta zure bidalketak ikusteko aukera izango dute eta ezingo dute jakin mututu dituzula.",
+ "report.next": "Hurrengoa",
"report.placeholder": "Iruzkin gehigarriak",
+ "report.reasons.dislike": "Ez dut gustukoa",
+ "report.reasons.dislike_description": "Ikusi nahi ez dudan zerbait da",
+ "report.reasons.other": "Beste zerbait da",
+ "report.reasons.other_description": "Arazoa ezin da beste kategorietan sailkatu",
+ "report.reasons.spam": "Spama da",
+ "report.reasons.spam_description": "Esteka maltzurrak, gezurrezko elkarrekintzak edo erantzun errepikakorrak",
+ "report.reasons.violation": "Zerbitzariaren arauak hausten ditu",
+ "report.reasons.violation_description": "Arau zehatzak urratzen dituela badakizu",
+ "report.rules.subtitle": "Hautatu dagozkion guztiak",
+ "report.rules.title": "Ze arau hautsi ditu?",
+ "report.statuses.subtitle": "Hautatu dagozkion guztiak",
+ "report.statuses.title": "Salaketa hau babesten duen bidalketarik badago?",
"report.submit": "Bidali",
"report.target": "{target} salatzen",
+ "report.thanks.take_action": "Hemen dituzu Mastodonen ikusiko duzuna kontrolatzeko aukerak:",
+ "report.thanks.take_action_actionable": "Hau berrikusten dugun bitartean, @{name} erabiltzailearen aurkako neurriak hartu ditzakezu:",
+ "report.thanks.title": "Ez duzu hau ikusi nahi?",
+ "report.thanks.title_actionable": "Mila esker salaketagatik, berrikusiko dugu.",
+ "report.unfollow": "@{name} jarraitzeari utzi",
+ "report.unfollow_explanation": "Kontu hau jarraitzen ari zara. Zure denbora-lerro nagusian bere bidalketak ez ikusteko, jarraitzeari utzi.",
"search.placeholder": "Bilatu",
"search_popout.search_format": "Bilaketa aurreratuaren formatua",
"search_popout.tips.full_text": "Testu hutsarekin zuk idatzitako bidalketak, gogokoak, bultzadak edo aipamenak aurkitu ditzakezu, bat datozen erabiltzaile-izenak, pantaila-izenak, eta traolak.",
@@ -382,7 +434,9 @@
"search_popout.tips.text": "Testu hutsak pantaila-izenak, erabiltzaile-izenak eta traolak bilatzen ditu",
"search_popout.tips.user": "erabiltzailea",
"search_results.accounts": "Jendea",
+ "search_results.all": "Guztiak",
"search_results.hashtags": "Traolak",
+ "search_results.nothing_found": "Ez da emaitzarik aurkitu bilaketa-termino horientzat",
"search_results.statuses": "Bidalketak",
"search_results.statuses_fts_disabled": "Mastodon zerbitzari honek ez du bidalketen edukiaren bilaketa gaitu.",
"search_results.total": "{count, number} {count, plural, one {emaitza} other {emaitza}}",
@@ -396,9 +450,14 @@
"status.delete": "Ezabatu",
"status.detailed_status": "Elkarrizketaren ikuspegi xehetsua",
"status.direct": "Mezu zuzena @{name}(r)i",
+ "status.edit": "Editatu",
+ "status.edited": "Editatua {date}",
+ "status.edited_x_times": "{count, plural, one {behin} other {{count} aldiz}} editatua",
"status.embed": "Txertatu",
"status.favourite": "Gogokoa",
"status.filtered": "Iragazita",
+ "status.history.created": "{name} erabiltzaileak sortua {date}",
+ "status.history.edited": "{name} erabiltzaileak editatua {date}",
"status.load_more": "Kargatu gehiago",
"status.media_hidden": "Multimedia ezkutatua",
"status.mention": "Aipatu @{name}",
@@ -462,7 +521,7 @@
"upload_form.video_description": "Deskribatu entzumen galera edo ikusmen urritasuna duten pertsonentzat",
"upload_modal.analyzing_picture": "Irudia aztertzen…",
"upload_modal.apply": "Aplikatu",
- "upload_modal.applying": "Applying…",
+ "upload_modal.applying": "Aplikatzen…",
"upload_modal.choose_image": "Aukeratu irudia",
"upload_modal.description_placeholder": "Vaudeville itxurako filmean yogi ñaño bat jipoitzen dute Quebec-en whiski truk",
"upload_modal.detect_text": "Antzeman testua iruditik",
diff --git a/app/javascript/mastodon/locales/fa.json b/app/javascript/mastodon/locales/fa.json
index c0582da74..820b90640 100644
--- a/app/javascript/mastodon/locales/fa.json
+++ b/app/javascript/mastodon/locales/fa.json
@@ -1,11 +1,11 @@
{
"account.account_note_header": "یادداشت",
- "account.add_or_remove_from_list": "افزودن یا برداشتن از فهرستها",
- "account.badges.bot": "ربات",
+ "account.add_or_remove_from_list": "افزودن یا برداشتن از سیاههها",
+ "account.badges.bot": "روبات",
"account.badges.group": "گروه",
"account.block": "مسدود کردن @{name}",
"account.block_domain": "مسدود کردن دامنهٔ {domain}",
- "account.blocked": "مسدود شده",
+ "account.blocked": "مسدود",
"account.browse_more_on_origin_server": "مرور بیشتر روی نمایهٔ اصلی",
"account.cancel_follow_request": "لغو درخواست پیگیری",
"account.direct": "پیام مستقیم به @{name}",
@@ -18,12 +18,12 @@
"account.followers": "پیگیرندگان",
"account.followers.empty": "هنوز کسی این کاربر را پیگیری نمیکند.",
"account.followers_counter": "{count, plural, one {{counter} پیگیرنده} other {{counter} پیگیرنده}}",
+ "account.following": "پی میگیرید",
"account.following_counter": "{count, plural, one {{counter} پیگرفته} other {{counter} پیگرفته}}",
"account.follows.empty": "این کاربر هنوز پیگیر کسی نیست.",
- "account.follows_you": "پیگیر شماست",
+ "account.follows_you": "پی میگیردتان",
"account.hide_reblogs": "نهفتن تقویتهای @{name}",
"account.joined": "پیوسته از {date}",
- "account.last_status": "آخرین فعّالیت",
"account.link_verified_on": "مالکیت این پیوند در {date} بررسی شد",
"account.locked_info": "این حساب خصوصی است. صاحبش تصمیم میگیرد که چه کسی پیگیرش باشد.",
"account.media": "رسانه",
@@ -32,7 +32,6 @@
"account.mute": "خموشاندن @{name}",
"account.mute_notifications": "خموشاندن آگاهیها از @{name}",
"account.muted": "خموش",
- "account.never_active": "هرگز",
"account.posts": "فرسته",
"account.posts_with_replies": "فرستهها و پاسخها",
"account.report": "گزارش @{name}",
@@ -42,28 +41,31 @@
"account.statuses_counter": "{count, plural, one {{counter} فرسته} other {{counter} فرسته}}",
"account.unblock": "رفع مسدودیت @{name}",
"account.unblock_domain": "رفع مسدودیت دامنهٔ {domain}",
+ "account.unblock_short": "رفع مسدودیت",
"account.unendorse": "معرّفی نکردن در نمایه",
"account.unfollow": "ناپیگیری",
"account.unmute": "ناخموشی @{name}",
"account.unmute_notifications": "ناخموشی آگاهیها از @{name}",
+ "account.unmute_short": "ناخموشی",
"account_note.placeholder": "برای افزودن یادداشت کلیک کنید",
- "admin.dashboard.retention": "Retention",
- "admin.dashboard.retention.average": "Average",
- "admin.dashboard.retention.cohort": "Sign-up month",
- "admin.dashboard.retention.cohort_size": "New users",
+ "admin.dashboard.daily_retention": "User retention rate by day after sign-up",
+ "admin.dashboard.monthly_retention": "User retention rate by month after sign-up",
+ "admin.dashboard.retention.average": "میانگین",
+ "admin.dashboard.retention.cohort": "ماه ثبتنام",
+ "admin.dashboard.retention.cohort_size": "کاربران جدید",
"alert.rate_limited.message": "لطفاً پس از {retry_time, time, medium} دوباره بیازمایید.",
"alert.rate_limited.title": "محدودیت تعداد",
"alert.unexpected.message": "خطایی غیرمنتظره رخ داد.",
"alert.unexpected.title": "ای وای!",
"announcement.announcement": "اعلامیه",
- "attachments_list.unprocessed": "(unprocessed)",
+ "attachments_list.unprocessed": "(پردازش نشده)",
"autosuggest_hashtag.per_week": "{count} در هفته",
"boost_modal.combo": "دکمهٔ {combo} را بزنید تا دیگر این را نبینید",
- "bundle_column_error.body": "هنگام بارگزاری این بخش خطایی رخ داد.",
+ "bundle_column_error.body": "هنگام بار کردن این مولفه، اشتباهی رخ داد.",
"bundle_column_error.retry": "تلاش دوباره",
"bundle_column_error.title": "خطای شبکه",
"bundle_modal_error.close": "بستن",
- "bundle_modal_error.message": "هنگام بارگزاری این بخش خطایی رخ داد.",
+ "bundle_modal_error.message": "هنگام بار کردن این مولفه، اشتباهی رخ داد.",
"bundle_modal_error.retry": "تلاش دوباره",
"column.blocks": "کاربران مسدود شده",
"column.bookmarks": "نشانکها",
@@ -74,7 +76,7 @@
"column.favourites": "پسندیدهها",
"column.follow_requests": "درخواستهای پیگیری",
"column.home": "خانه",
- "column.lists": "فهرستها",
+ "column.lists": "سیاههها",
"column.mutes": "کاربران خموش",
"column.notifications": "آگاهیها",
"column.pins": "فرستههای سنجاقشده",
@@ -104,6 +106,7 @@
"compose_form.poll.switch_to_single": "تبدیل به نظرسنجی تکگزینهای",
"compose_form.publish": "بوق",
"compose_form.publish_loud": "{publish}!",
+ "compose_form.save_changes": "ذخیرهٔ تغییرات",
"compose_form.sensitive.hide": "{count, plural, one {علامتگذاری رسانه به عنوان حساس} other {علامتگذاری رسانهها به عنوان حساس}}",
"compose_form.sensitive.marked": "{count, plural, one {رسانه به عنوان حساس علامتگذاری شد} other {رسانهها به عنوان حساس علامتگذاری شدند}}",
"compose_form.sensitive.unmarked": "{count, plural, one {رسانه به عنوان حساس علامتگذاری نشد} other {رسانهها به عنوان حساس علامتگذاری نشدند}}",
@@ -117,9 +120,9 @@
"confirmations.delete.confirm": "حذف",
"confirmations.delete.message": "آیا مطمئنید که میخواهید این فرسته را حذف کنید؟",
"confirmations.delete_list.confirm": "حذف",
- "confirmations.delete_list.message": "مطمئنید میخواهید این فهرست را برای همیشه حذف کنید؟",
- "confirmations.discard_edit_media.confirm": "Discard",
- "confirmations.discard_edit_media.message": "You have unsaved changes to the media description or preview, discard them anyway?",
+ "confirmations.delete_list.message": "مطمئنید میخواهید این سیاهه را برای همیشه حذف کنید؟",
+ "confirmations.discard_edit_media.confirm": "دور انداختن",
+ "confirmations.discard_edit_media.message": "تغییرات ذخیره نشدهای در توضیحات یا پیشنمایش رسانه دارید. همگی نادیده گرفته شوند؟",
"confirmations.domain_block.confirm": "مسدود کردن تمام دامنه",
"confirmations.domain_block.message": "آیا جدی جدی میخواهید تمام دامنهٔ {domain} را مسدود کنید؟ در بیشتر موارد مسدود کردن یا خموشاندن چند حساب خاص کافی است و توصیه میشود. پس از این کار شما هیچ محتوایی را از این دامنه در خط زمانی عمومی یا آگاهیهایتان نخواهید دید. پیگیرانتان از این دامنه هم برداشته خواهند شد.",
"confirmations.logout.confirm": "خروج از حساب",
@@ -165,17 +168,18 @@
"empty_column.community": "خط زمانی محلّی خالی است. چیزی بنویسید تا چرخش بچرخد!",
"empty_column.direct": "هنوز هیچ پیام مستقیمی ندارید. هنگامی که چنین پیامی بگیرید یا بفرستید اینجا نشان داده خواهد شد.",
"empty_column.domain_blocks": "هنوز هیچ دامنهای مسدود نشده است.",
+ "empty_column.explore_statuses": "Nothing is trending right now. Check back later!",
"empty_column.favourited_statuses": "شما هنوز هیچ فرستهای را نپسندیدهاید. هنگامی که فرستهای را بپسندید، اینجا نشان داده خواهد شد.",
"empty_column.favourites": "هنوز هیچ کسی این فرسته را نپسندیده است. هنگامی که کسی آن را بپسندد، اینجا نشان داده خواهد شد.",
"empty_column.follow_recommendations": "ظاهرا هیچ پیشنهادی برای شما نمیتوانیم تولید کنیم. میتوانید از امکان جستوجو برای یافتن افرادی که ممکن است بشناسید و یا کاوش میان برچسبهای داغ استفاده کنید.",
"empty_column.follow_requests": "شما هنوز هیچ درخواست پیگیریای ندارید. هنگامی که چنین درخواستی بگیرید، اینجا نشان داده خواهد شد.",
"empty_column.hashtag": "هنوز هیچ چیزی در این برچسب نیست.",
- "empty_column.home": "خط زمانی خانگی شما خالی است! افراد بیشتری را پیگیری کنید تا پُر شود. {suggestions}",
+ "empty_column.home": "خط زمانی خانگیتان خالی است! برای پر کردنش، افراد بیشتری را پی بگیرید. {suggestions}",
"empty_column.home.suggestions": "چند پیشنهاد را ببینید",
- "empty_column.list": "در این فهرست هنوز چیزی نیست. هنگامی که اعضای این فهرست چیزی بفرستند، اینجا ظاهر خواهد شد.",
- "empty_column.lists": "هنوز هیچ فهرستی ندارید. هنگامی که فهرستی بسازید، اینجا نشان داده خواهد شد.",
+ "empty_column.list": "هنوز چیزی در این سیاهه نیست. هنگامی که اعضایش فرستههای جدیدی بفرستند، اینجا ظاهر خواهند شد.",
+ "empty_column.lists": "هنوز هیچ سیاههای ندارید. هنگامی که یکی بسازید، اینجا نشان داده خواهد شد.",
"empty_column.mutes": "هنوز هیچ کاربری را خموش نکردهاید.",
- "empty_column.notifications": "هنوز هیچ اعلانی ندارید. به دیگران واکنش نشان دهید تا گفتگو آغاز شود.",
+ "empty_column.notifications": "هنوز هیچ آگاهیآی ندارید. هنگامی که دیگران با شما برهمکنش داشته باشند،اینحا خواهید دیدش.",
"empty_column.public": "اینجا هنوز چیزی نیست! خودتان چیزی بنویسید یا کاربران کارسازهای دیگر را پیگیری کنید تا اینجا پُر شود",
"error.unexpected_crash.explanation": "به خاطر اشکالی در کدهای ما یا ناسازگاری با مرورگر شما، این صفحه به درستی نمایش نیافت.",
"error.unexpected_crash.explanation_addons": "این صفحه نمیتواند درست نشان داده شود. احتمالاً این خطا ناشی از یک افزونهٔ مرورگر یا ابزار ترجمهٔ خودکار است.",
@@ -183,6 +187,12 @@
"error.unexpected_crash.next_steps_addons": "لطفاً از کارشان انداخته و صفحه را نوسازی کنید. اگر کمکی نکرد، شاید همچنان بتوانید با مرورگری دیگر یا با کارهای بومی از ماستودون استفاده کنید.",
"errors.unexpected_crash.copy_stacktrace": "رونوشت از جزئیات اشکال",
"errors.unexpected_crash.report_issue": "گزارش مشکل",
+ "explore.search_results": "نتایج جستوجو",
+ "explore.suggested_follows": "برای شما",
+ "explore.title": "کاوش",
+ "explore.trending_links": "اخبار",
+ "explore.trending_statuses": "فرستهها",
+ "explore.trending_tags": "هشتگها",
"follow_recommendations.done": "انجام شد",
"follow_recommendations.heading": "افرادی را که میخواهید فرستههایشان را ببینید پیگیری کنید! اینها تعدادی پیشنهاد هستند.",
"follow_recommendations.lead": "فرستههای افرادی که دنبال میکنید به ترتیب زمانی در خوراک خانهتان نشان داده خواهد شد. از اشتباه کردن نترسید. میتوانید به همین سادگی در هر زمانی از دنبال کردن افراد دست بکشید!",
@@ -216,16 +226,16 @@
"intervals.full.hours": "{number, plural, one {# ساعت} other {# ساعت}}",
"intervals.full.minutes": "{number, plural, one {# دقیقه} other {# دقیقه}}",
"keyboard_shortcuts.back": "بازگشت",
- "keyboard_shortcuts.blocked": "گشودن فهرست کاربران مسدود شده",
+ "keyboard_shortcuts.blocked": "گشودن سیاههٔ کاربران مسدود",
"keyboard_shortcuts.boost": "تقویت فرسته",
"keyboard_shortcuts.column": "برای تمرکز روی یک فرسته در یکی از ستونها",
"keyboard_shortcuts.compose": "تمرکز روی محیط نوشتن",
"keyboard_shortcuts.description": "توضیح",
"keyboard_shortcuts.direct": "گشودن ستون پیامهای مستقیم",
- "keyboard_shortcuts.down": "پایین رفتن در فهرست",
+ "keyboard_shortcuts.down": "پایین بردن در سیاهه",
"keyboard_shortcuts.enter": "گشودن فرسته",
"keyboard_shortcuts.favourite": "پسندیدن فرسته",
- "keyboard_shortcuts.favourites": "گشودن فهرست پسندیدهها",
+ "keyboard_shortcuts.favourites": "گشودن سیاههٔ برگزیدهها",
"keyboard_shortcuts.federated": "گشودن خط زمانی همگانی",
"keyboard_shortcuts.heading": "میانبرهای صفحهکلید",
"keyboard_shortcuts.home": "گشودن خط زمانی خانگی",
@@ -237,10 +247,10 @@
"keyboard_shortcuts.my_profile": "گشودن نمایهتان",
"keyboard_shortcuts.notifications": "گشودن ستون آگاهیها",
"keyboard_shortcuts.open_media": "گشودن رسانه",
- "keyboard_shortcuts.pinned": "گشودن فهرست فرستههای سنجاقشده",
+ "keyboard_shortcuts.pinned": "گشودن سیاههٔ فرستههای سنجاق شده",
"keyboard_shortcuts.profile": "گشودن نمایهٔ نویسنده",
"keyboard_shortcuts.reply": "پاسخ به فرسته",
- "keyboard_shortcuts.requests": "گشودن فهرست درخواستهای پیگیری",
+ "keyboard_shortcuts.requests": "گشودن سیاههٔ درخواستهای پیگیری",
"keyboard_shortcuts.search": "تمرکز روی جستوجو",
"keyboard_shortcuts.spoilers": "نمایش/نهفتن زمینهٔ هشدار محتوا",
"keyboard_shortcuts.start": "گشودن ستون «آغاز کنید»",
@@ -248,32 +258,32 @@
"keyboard_shortcuts.toggle_sensitivity": "نمایش/نهفتن رسانه",
"keyboard_shortcuts.toot": "شروع یک فرستهٔ جدید",
"keyboard_shortcuts.unfocus": "برداشتن تمرکز از نوشتن/جستوجو",
- "keyboard_shortcuts.up": "بالا رفتن در فهرست",
+ "keyboard_shortcuts.up": "بالا بردن در سیاهه",
"lightbox.close": "بستن",
"lightbox.compress": "فشردهسازی جعبهٔ نمایش تصویر",
"lightbox.expand": "گسترش جعبهٔ نمایش تصویر",
"lightbox.next": "بعدی",
"lightbox.previous": "قبلی",
- "lists.account.add": "افزودن به فهرست",
- "lists.account.remove": "برداشتن از فهرست",
- "lists.delete": "حذف فهرست",
- "lists.edit": "ویرایش فهرست",
+ "lists.account.add": "افزودن به سیاهه",
+ "lists.account.remove": "برداشتن از سیاهه",
+ "lists.delete": "حذف سیاهه",
+ "lists.edit": "ویرایش سیاهه",
"lists.edit.submit": "تغییر عنوان",
- "lists.new.create": "افزودن فهرست",
- "lists.new.title_placeholder": "عنوان فهرست جدید",
+ "lists.new.create": "افزودن سیاهه",
+ "lists.new.title_placeholder": "عنوان سیاههٔ جدید",
"lists.replies_policy.followed": "هر کاربر پیگرفته",
- "lists.replies_policy.list": "اعضای فهرست",
+ "lists.replies_policy.list": "اعضای سیاهه",
"lists.replies_policy.none": "هیچ کدام",
"lists.replies_policy.title": "نمایش پاسخها به:",
"lists.search": "جستوجو بین کسانی که پیگرفتهاید",
- "lists.subheading": "فهرستهای شما",
+ "lists.subheading": "سیاهههایتان",
"load_pending": "{count, plural, one {# مورد جدید} other {# مورد جدید}}",
- "loading_indicator.label": "بارگزاری...",
+ "loading_indicator.label": "بار کردن…",
"media_gallery.toggle_visible": "{number, plural, one {نهفتن تصویر} other {نهفتن تصاویر}}",
"missing_indicator.label": "پیدا نشد",
"missing_indicator.sublabel": "این منبع پیدا نشد",
"mute_modal.duration": "مدت زمان",
- "mute_modal.hide_notifications": "اعلانهای این کاربر پنهان شود؟",
+ "mute_modal.hide_notifications": "نهفتن آگاهیها از این کاربر؟",
"mute_modal.indefinite": "نامعلوم",
"navigation_bar.apps": "برنامههای تلفن همراه",
"navigation_bar.blocks": "کاربران مسدود شده",
@@ -284,13 +294,14 @@
"navigation_bar.discover": "گشت و گذار",
"navigation_bar.domain_blocks": "دامنههای مسدود شده",
"navigation_bar.edit_profile": "ویرایش نمایه",
+ "navigation_bar.explore": "کاوش",
"navigation_bar.favourites": "پسندیدهها",
"navigation_bar.filters": "واژههای خموش",
"navigation_bar.follow_requests": "درخواستهای پیگیری",
"navigation_bar.follows_and_followers": "پیگرفتگان و پیگیرندگان",
"navigation_bar.info": "دربارهٔ این کارساز",
"navigation_bar.keyboard_shortcuts": "میانبرها",
- "navigation_bar.lists": "فهرستها",
+ "navigation_bar.lists": "سیاههها",
"navigation_bar.logout": "خروج",
"navigation_bar.mutes": "کاربران خموشانده",
"navigation_bar.personal": "شخصی",
@@ -298,6 +309,7 @@
"navigation_bar.preferences": "ترجیحات",
"navigation_bar.public_timeline": "خط زمانی همگانی",
"navigation_bar.security": "امنیت",
+ "notification.admin.sign_up": "{name} ثبت نام کرد",
"notification.favourite": "{name} فرستهتان را پسندید",
"notification.follow": "{name} پیگیرتان شد",
"notification.follow_request": "{name} میخواهد پیگیر شما باشد",
@@ -306,23 +318,27 @@
"notification.poll": "نظرسنجیای که در آن رأی دادید به پایان رسیده است",
"notification.reblog": "{name} فرستهتان را تقویت کرد",
"notification.status": "{name} چیزی فرستاد",
- "notifications.clear": "پاککردن آگاهیها",
+ "notification.update": "{name} فرستهای را ویرایش کرد",
+ "notifications.clear": "پاکسازی آگاهیها",
"notifications.clear_confirmation": "مطمئنید میخواهید همهٔ آگاهیهایتان را برای همیشه پاک کنید؟",
+ "notifications.column_settings.admin.sign_up": "ثبت نامهای جدید:",
"notifications.column_settings.alert": "آگاهیهای میزکار",
"notifications.column_settings.favourite": "پسندیدهها:",
"notifications.column_settings.filter_bar.advanced": "نمایش همۀ دستهها",
"notifications.column_settings.filter_bar.category": "نوار پالایش سریع",
- "notifications.column_settings.filter_bar.show": "نمایش",
+ "notifications.column_settings.filter_bar.show_bar": "نمایش نوار پالایه",
"notifications.column_settings.follow": "پیگیرندگان جدید:",
"notifications.column_settings.follow_request": "درخواستهای جدید پیگیری:",
"notifications.column_settings.mention": "نامبردنها:",
"notifications.column_settings.poll": "نتایج نظرسنجی:",
- "notifications.column_settings.push": "اعلانها از سمت سرور",
+ "notifications.column_settings.push": "آگاهیهای ارسالی",
"notifications.column_settings.reblog": "تقویتها:",
"notifications.column_settings.show": "نمایش در ستون",
"notifications.column_settings.sound": "پخش صدا",
"notifications.column_settings.status": "فرستههای جدید:",
- "notifications.column_settings.unread_markers.category": "نشانهگذارهای آگاهیهای خواندهنشده",
+ "notifications.column_settings.unread_notifications.category": "آگاهیهای خوانده نشده",
+ "notifications.column_settings.unread_notifications.highlight": "پررنگ کردن آگاهیهای خوانده نشده",
+ "notifications.column_settings.update": "ویرایشها:",
"notifications.filter.all": "همه",
"notifications.filter.boosts": "تقویتها",
"notifications.filter.favourites": "پسندها",
@@ -335,9 +351,9 @@
"notifications.mark_as_read": "نشانهگذاری تمام آگاهیها به خواندهشده",
"notifications.permission_denied": "آگاهیهای میزکار به دلیل رد کردن درخواست اجازهٔ پیشین مرورگر، در دسترس نیستند",
"notifications.permission_denied_alert": "از آنجا که پیش از این اجازهٔ مرورگر رد شده است، آگاهیهای میزکار نمیتوانند به کار بیفتند",
- "notifications.permission_required": "اعلانهای میزکار در دسترس نیستند زیرا نیازمند مجوزی هستند که اعطا نشده است.",
+ "notifications.permission_required": "آگاهیهای میزکار در دسترس نیستند زیرا اجازههای لازم، اعطا نشده.",
"notifications_permission_banner.enable": "به کار انداختن آگاهیهای میزکار",
- "notifications_permission_banner.how_to_control": "اگر میخواهید حتی زمانی که ماستودون باز نیست اعلانها نمایش یابند، اعلانهای میزکار را فعال کنید. به محض فعال شدن از طریق دکمه {icon} بالا میتوانید به دقت کنترل کنید که چه نوع از تعاملها باعث صادر شدن اعلانها شوند.",
+ "notifications_permission_banner.how_to_control": "برای دریافت آگاهیها هنگام باز نبودن ماستودون، آگاهیهای میزکار را به کار بیندازید. پس از به کار افتادنشان میتوانید گونههای دقیق برهمکنشهایی که آگاهیهای میزکار تولید میکنند را از {icon} بالا واپایید.",
"notifications_permission_banner.title": "هرگز چیزی را از دست ندهید",
"picture_in_picture.restore": "برگرداندن",
"poll.closed": "پایانیافته",
@@ -346,7 +362,7 @@
"poll.total_votes": "{count, plural, one {# رأی} other {# رأی}}",
"poll.vote": "رأی",
"poll.voted": "شما به این جواب رأی دادید",
- "poll.votes": "{votes, plural, one {# vote} other {# votes}}",
+ "poll.votes": "# رأی",
"poll_button.add_poll": "افزودن نظرسنجی",
"poll_button.remove_poll": "برداشتن نظرسنجی",
"privacy.change": "تغییر محرمانگی فرسته",
@@ -357,23 +373,59 @@
"privacy.public.long": "نمایان برای همه، در خطهای زمانی همگانی نمایش داده خواهد شد",
"privacy.public.short": "عمومی",
"privacy.unlisted.long": "نمایان برای همه، ولی در خطهای زمانی همگانی نمایش داده نخواهد شد",
- "privacy.unlisted.short": "فهرستنشده",
+ "privacy.unlisted.short": "فهرست نشده",
"refresh": "نوسازی",
"regeneration_indicator.label": "در حال بار شدن…",
- "regeneration_indicator.sublabel": "این فهرست دارد آماده میشود!",
+ "regeneration_indicator.sublabel": "خوراک خانگیان دارد آماده میشود!",
"relative_time.days": "{number} روز",
+ "relative_time.full.days": "{number, plural, one {# روز} other {# روز}} پیش",
+ "relative_time.full.hours": "{number, plural, one {# ساعت} other {# ساعت}} پیش",
+ "relative_time.full.just_now": "همين آلان",
+ "relative_time.full.minutes": "{number, plural, one {# دقیقه} other {# دقیقه}} پیش",
+ "relative_time.full.seconds": "{number, plural, one {# ثانیه} other {# ثانیه}} پیش",
"relative_time.hours": "{number} ساعت",
"relative_time.just_now": "حالا",
"relative_time.minutes": "{number} دقیقه",
"relative_time.seconds": "{number} ثانیه",
"relative_time.today": "امروز",
"reply_indicator.cancel": "لغو",
+ "report.block": "مسدود کردن",
+ "report.block_explanation": "شما فرستههایشان را نخواهید دید. آنها نمیتوانند فرستههایتان را ببینند یا شما را پیبگیرند. آنها میتوانند بگویند که مسدود شدهاند.",
+ "report.categories.other": "غیره",
+ "report.categories.spam": "Spam",
+ "report.categories.violation": "Content violates one or more server rules",
+ "report.category.subtitle": "Choose the best match",
+ "report.category.title": "Tell us what's going on with this {type}",
+ "report.category.title_account": "profile",
+ "report.category.title_status": "post",
+ "report.close": "Done",
+ "report.comment.title": "Is there anything else you think we should know?",
"report.forward": "فرستادن به {target}",
"report.forward_hint": "این حساب در کارساز دیگری ثبت شده. آیا میخواهید رونوشتی ناشناس از این گزارش به آنجا هم فرستاده شود؟",
- "report.hint": "این گزارش به مدیران کارسازتان فرستاده خواهد شد. میتوانید دلیل گزارش این حساب را در ادامه بنویسید:",
+ "report.mute": "Mute",
+ "report.mute_explanation": "You will not see their posts. They can still follow you and see your posts and will not know that they are muted.",
+ "report.next": "Next",
"report.placeholder": "توضیحات اضافه",
+ "report.reasons.dislike": "I don't like it",
+ "report.reasons.dislike_description": "It is not something you want to see",
+ "report.reasons.other": "It's something else",
+ "report.reasons.other_description": "The issue does not fit into other categories",
+ "report.reasons.spam": "It's spam",
+ "report.reasons.spam_description": "Malicious links, fake engagement, or repetitive replies",
+ "report.reasons.violation": "It violates server rules",
+ "report.reasons.violation_description": "You are aware that it breaks specific rules",
+ "report.rules.subtitle": "Select all that apply",
+ "report.rules.title": "Which rules are being violated?",
+ "report.statuses.subtitle": "Select all that apply",
+ "report.statuses.title": "Are there any posts that back up this report?",
"report.submit": "فرستادن",
"report.target": "در حال گزارش {target}",
+ "report.thanks.take_action": "Here are your options for controlling what you see on Mastodon:",
+ "report.thanks.take_action_actionable": "While we review this, you can take action against @{name}:",
+ "report.thanks.title": "Don't want to see this?",
+ "report.thanks.title_actionable": "Thanks for reporting, we'll look into this.",
+ "report.unfollow": "Unfollow @{name}",
+ "report.unfollow_explanation": "You are following this account. To not see their posts in your home feed anymore, unfollow them.",
"search.placeholder": "جستوجو",
"search_popout.search_format": "راهنمای جستوجوی پیشرفته",
"search_popout.tips.full_text": "جستوجوی متنی ساده فرستههایی که نوشته، پسندیده، تقویتکرده یا در آنها نامبرده شدهاید را به علاوهٔ نامهای کاربری، نامهای نمایشی و برچسبها برمیگرداند.",
@@ -382,7 +434,9 @@
"search_popout.tips.text": "جستوجوی متنی ساده برای نامها، نامهای کاربری، و برچسبها",
"search_popout.tips.user": "کاربر",
"search_results.accounts": "افراد",
+ "search_results.all": "All",
"search_results.hashtags": "برچسبها",
+ "search_results.nothing_found": "Could not find anything for these search terms",
"search_results.statuses": "فرستهها",
"search_results.statuses_fts_disabled": "جستوجوی محتوای فرستهها در این کارساز ماستودون فعال نشده است.",
"search_results.total": "{count, number} {count, plural, one {نتیجه} other {نتیجه}}",
@@ -396,10 +450,15 @@
"status.delete": "حذف",
"status.detailed_status": "نمایش کامل گفتگو",
"status.direct": "پیام مستقیم به @{name}",
+ "status.edit": "Edit",
+ "status.edited": "Edited {date}",
+ "status.edited_x_times": "Edited {count, plural, one {{count} time} other {{count} times}}",
"status.embed": "جاگذاری",
"status.favourite": "پسندیدن",
- "status.filtered": "پالایششده",
- "status.load_more": "بارگزاری بیشتر",
+ "status.filtered": "پالوده",
+ "status.history.created": "{name} created {date}",
+ "status.history.edited": "{name} edited {date}",
+ "status.load_more": "بار کردن بیشتر",
"status.media_hidden": "رسانهٔ نهفته",
"status.mention": "نامبردن از @{name}",
"status.more": "بیشتر",
@@ -462,7 +521,7 @@
"upload_form.video_description": "برای کمبینایان یا ناشنوایان توصیفش کنید",
"upload_modal.analyzing_picture": "در حال پردازش تصویر…",
"upload_modal.apply": "اعمال",
- "upload_modal.applying": "Applying…",
+ "upload_modal.applying": "اعمال کردن…",
"upload_modal.choose_image": "گزینش تصویر",
"upload_modal.description_placeholder": "الا یا ایّها الساقی، ادر کأساً و ناولها",
"upload_modal.detect_text": "تشخیص متن درون عکس",
diff --git a/app/javascript/mastodon/locales/fi.json b/app/javascript/mastodon/locales/fi.json
index a5c2d2da3..39df81770 100644
--- a/app/javascript/mastodon/locales/fi.json
+++ b/app/javascript/mastodon/locales/fi.json
@@ -9,21 +9,21 @@
"account.browse_more_on_origin_server": "Selaile lisää alkuperäisellä palvelimella",
"account.cancel_follow_request": "Peruuta seurauspyyntö",
"account.direct": "Pikaviesti käyttäjälle @{name}",
- "account.disable_notifications": "Lopeta ilmoittamasta minulle, kun @{name} viestii",
+ "account.disable_notifications": "Lopeta @{name}:n julkaisuista ilmoittaminen",
"account.domain_blocked": "Verkko-osoite piilotettu",
"account.edit_profile": "Muokkaa profiilia",
- "account.enable_notifications": "Ilmoita minulle, kun @{name} viestii",
+ "account.enable_notifications": "Ilmoita @{name}:n julkaisuista",
"account.endorse": "Suosittele profiilissasi",
"account.follow": "Seuraa",
"account.followers": "Seuraajat",
"account.followers.empty": "Kukaan ei seuraa tätä käyttäjää vielä.",
"account.followers_counter": "{count, plural, one {{counter} seuraaja} other {{counter} seuraajat}}",
+ "account.following": "Following",
"account.following_counter": "{count, plural, one {{counter} seuraa} other {{counter} seuraa}}",
"account.follows.empty": "Tämä käyttäjä ei vielä seuraa ketään.",
"account.follows_you": "Seuraa sinua",
"account.hide_reblogs": "Piilota buustaukset käyttäjältä @{name}",
"account.joined": "Liittynyt {date}",
- "account.last_status": "Aktiivinen viimeksi",
"account.link_verified_on": "Tämän linkin omistaja tarkistettiin {date}",
"account.locked_info": "Tämän tilin yksityisyyden tila on asetettu lukituksi. Omistaja arvioi manuaalisesti, kuka voi seurata niitä.",
"account.media": "Media",
@@ -32,7 +32,6 @@
"account.mute": "Mykistä @{name}",
"account.mute_notifications": "Mykistä ilmoitukset käyttäjältä @{name}",
"account.muted": "Mykistetty",
- "account.never_active": "Ei koskaan",
"account.posts": "Viestit",
"account.posts_with_replies": "Viestit ja vastaukset",
"account.report": "Raportoi @{name}",
@@ -42,21 +41,24 @@
"account.statuses_counter": "{count, plural, one {{counter} Toot} other {{counter} Toots}}",
"account.unblock": "Salli @{name}",
"account.unblock_domain": "Salli {domain}",
+ "account.unblock_short": "Unblock",
"account.unendorse": "Poista suosittelu profiilistasi",
- "account.unfollow": "Lakkaa seuraamasta",
+ "account.unfollow": "Lopeta seuraaminen",
"account.unmute": "Poista käyttäjän @{name} mykistys",
"account.unmute_notifications": "Poista mykistys käyttäjän @{name} ilmoituksilta",
+ "account.unmute_short": "Unmute",
"account_note.placeholder": "Lisää muistiinpano napsauttamalla",
- "admin.dashboard.retention": "Retention",
- "admin.dashboard.retention.average": "Average",
- "admin.dashboard.retention.cohort": "Sign-up month",
- "admin.dashboard.retention.cohort_size": "New users",
+ "admin.dashboard.daily_retention": "Käyttäjän säilyminen rekisteröitymisen jälkeiseen päivään mennessä",
+ "admin.dashboard.monthly_retention": "Käyttäjän säilyminen rekisteröitymisen jälkeiseen kuukauteen mennessä",
+ "admin.dashboard.retention.average": "Keskimäärin",
+ "admin.dashboard.retention.cohort": "Kirjautumiset",
+ "admin.dashboard.retention.cohort_size": "Uudet käyttäjät",
"alert.rate_limited.message": "Yritä uudestaan {retry_time, time, medium} jälkeen.",
"alert.rate_limited.title": "Määrää rajoitettu",
"alert.unexpected.message": "Tapahtui odottamaton virhe.",
"alert.unexpected.title": "Hups!",
"announcement.announcement": "Ilmoitus",
- "attachments_list.unprocessed": "(unprocessed)",
+ "attachments_list.unprocessed": "(käsittelemätön)",
"autosuggest_hashtag.per_week": "{count} viikossa",
"boost_modal.combo": "Ensi kerralla voit ohittaa tämän painamalla {combo}",
"bundle_column_error.body": "Jokin meni vikaan komponenttia ladattaessa.",
@@ -77,7 +79,7 @@
"column.lists": "Listat",
"column.mutes": "Mykistetyt käyttäjät",
"column.notifications": "Ilmoitukset",
- "column.pins": "Kiinnitetyt tuuttaukset",
+ "column.pins": "Kiinnitetyt julkaisut",
"column.public": "Yleinen aikajana",
"column_back_button.label": "Takaisin",
"column_header.hide_settings": "Piilota asetukset",
@@ -92,7 +94,7 @@
"community.column_settings.remote_only": "Vain etäkäyttö",
"compose_form.direct_message_warning": "Tämä viesti näkyy vain mainituille käyttäjille.",
"compose_form.direct_message_warning_learn_more": "Lisätietoja",
- "compose_form.hashtag_warning": "Tämä tuuttaus ei näy hashtag-hauissa, koska se on listaamaton. Hashtagien avulla voi hakea vain julkisia tuuttauksia.",
+ "compose_form.hashtag_warning": "Tätä julkaisua listata minkään hastagin alle, koska se on listaamaton. Ainoastaan julkisia julkaisuja etsiä hastageilla.",
"compose_form.lock_disclaimer": "Tilisi ei ole {locked}. Kuka tahansa voi seurata tiliäsi ja nähdä vain seuraajille rajaamasi julkaisut.",
"compose_form.lock_disclaimer.lock": "lukittu",
"compose_form.placeholder": "Mitä sinulla on mielessäsi?",
@@ -104,6 +106,7 @@
"compose_form.poll.switch_to_single": "Muuta kysely sallimaan vain yksi valinta",
"compose_form.publish": "Lähetä viesti",
"compose_form.publish_loud": "{publish}!",
+ "compose_form.save_changes": "Tallenna muutokset",
"compose_form.sensitive.hide": "{count, plural, one {Merkitse media arkaluontoiseksi} other {Merkitse media arkaluontoiseksi}}",
"compose_form.sensitive.marked": "{count, plural, one {Media on merkitty arkaluontoiseksi} other {Media on merkitty arkaluontoiseksi}}",
"compose_form.sensitive.unmarked": "{count, plural, one {Mediaa ei ole merkitty arkaluontoiseksi} other {Mediaa ei ole merkitty arkaluontoiseksi}}",
@@ -115,23 +118,23 @@
"confirmations.block.confirm": "Estä",
"confirmations.block.message": "Haluatko varmasti estää käyttäjän {name}?",
"confirmations.delete.confirm": "Poista",
- "confirmations.delete.message": "Haluatko varmasti poistaa tämän tilapäivityksen?",
+ "confirmations.delete.message": "Haluatko varmasti poistaa tämän julkaisun?",
"confirmations.delete_list.confirm": "Poista",
"confirmations.delete_list.message": "Haluatko varmasti poistaa tämän listan kokonaan?",
- "confirmations.discard_edit_media.confirm": "Discard",
- "confirmations.discard_edit_media.message": "You have unsaved changes to the media description or preview, discard them anyway?",
+ "confirmations.discard_edit_media.confirm": "Hylkää",
+ "confirmations.discard_edit_media.message": "Onko sinulla tallentamattomia muutoksia kuvaukseen tai esikatseluun, hylätäänkö ne silti?",
"confirmations.domain_block.confirm": "Piilota koko verkko-osoite",
"confirmations.domain_block.message": "Oletko todella varma, että haluat estää koko {domain}? Useimmissa tapauksissa muutama kohdennettu lohko tai mykistys on riittävä ja parempi. Et näe kyseisen verkkotunnuksen sisältöä missään julkisessa aikajanassa tai ilmoituksissa. Seuraajasi tältä verkkotunnukselta poistetaan.",
"confirmations.logout.confirm": "Kirjaudu ulos",
"confirmations.logout.message": "Oletko varma, että haluat kirjautua ulos?",
"confirmations.mute.confirm": "Mykistä",
- "confirmations.mute.explanation": "Tämä piilottaa päivitykset heiltä ja päivitykset, joissa hänet mainitaan, mutta sallii silti heidän nähdä sinun päivityksesi ja seurata sinua.",
+ "confirmations.mute.explanation": "Tämä piilottaa heidän julkaisut ja julkaisut, joissa heidät mainitaan, mutta sallii edelleen heidän nähdä julkaisusi ja seurata sinua.",
"confirmations.mute.message": "Haluatko varmasti mykistää käyttäjän {name}?",
"confirmations.redraft.confirm": "Poista & palauta muokattavaksi",
- "confirmations.redraft.message": "Are you sure you want to delete this status and re-draft it? You will lose all replies, boosts and favourites to it.",
+ "confirmations.redraft.message": "Oletko varma että haluat poistaa tämän julkaisun ja tehdä siitä uuden luonnoksen? Suosikit ja buustaukset menetään, alkuperäisen julkaisusi vastaukset jäävät orvoiksi.",
"confirmations.reply.confirm": "Vastaa",
"confirmations.reply.message": "Jos vastaat nyt, vastaus korvaa tällä hetkellä työstämäsi viestin. Oletko varma, että haluat jatkaa?",
- "confirmations.unfollow.confirm": "Lakkaa seuraamasta",
+ "confirmations.unfollow.confirm": "Lopeta seuraaminen",
"confirmations.unfollow.message": "Haluatko varmasti lakata seuraamasta käyttäjää {name}?",
"conversation.delete": "Poista keskustelu",
"conversation.mark_as_read": "Merkitse luetuksi",
@@ -141,7 +144,7 @@
"directory.local": "Vain palvelimelta {domain}",
"directory.new_arrivals": "Äskettäin saapuneet",
"directory.recently_active": "Hiljattain aktiiviset",
- "embed.instructions": "Upota statuspäivitys sivullesi kopioimalla alla oleva koodi.",
+ "embed.instructions": "Upota julkaisu verkkosivullesi kopioimalla alla oleva koodi.",
"embed.preview": "Se tulee näyttämään tältä:",
"emoji_button.activity": "Aktiviteetit",
"emoji_button.custom": "Mukautetut",
@@ -165,6 +168,7 @@
"empty_column.community": "Paikallinen aikajana on tyhjä. Kirjoita jotain julkista, niin homma lähtee käyntiin!",
"empty_column.direct": "Sinulla ei ole vielä yhtään viestiä yksittäiselle käyttäjälle. Kun lähetät tai vastaanotat sellaisen, se näkyy täällä.",
"empty_column.domain_blocks": "Yhtään verkko-osoitetta ei ole vielä estetty.",
+ "empty_column.explore_statuses": "Mikään ei ole nyt trendi. Tarkista myöhemmin!",
"empty_column.favourited_statuses": "Et ole vielä lisännyt viestejä kirjanmerkkeihisi. Kun lisäät yhden, se näkyy tässä.",
"empty_column.favourites": "Kukaan ei ole vielä lisännyt tätä viestiä suosikkeihinsa. Kun joku tekee niin, näkyy kyseinen henkilö tässä.",
"empty_column.follow_recommendations": "Näyttää siltä, että sinulle ei voi luoda ehdotuksia. Voit yrittää etsiä ihmisiä, jotka saatat tuntea tai tutkia trendaavia aihesanoja.",
@@ -183,9 +187,15 @@
"error.unexpected_crash.next_steps_addons": "Yritä poistaa ne käytöstä ja päivittää sivu. Jos se ei auta, voit silti käyttää Mastodonia eri selaimen tai sovelluksen kautta.",
"errors.unexpected_crash.copy_stacktrace": "Kopioi pinon jäljitys leikepöydälle",
"errors.unexpected_crash.report_issue": "Ilmoita ongelmasta",
+ "explore.search_results": "Hakutulokset",
+ "explore.suggested_follows": "Sinulle",
+ "explore.title": "Selaa",
+ "explore.trending_links": "Uutiset",
+ "explore.trending_statuses": "Viestit",
+ "explore.trending_tags": "Aihetunnisteet",
"follow_recommendations.done": "Valmis",
- "follow_recommendations.heading": "Seuraa ihmisiä, joilta haluaisit nähdä viestejä! Tässä on muutamia ehdotuksia.",
- "follow_recommendations.lead": "Viestit seuraamiltasi henkilöiltä näkyvät aikajärjestyksessä kotinäytön syötteessä. Älä pelkää seurata vahingossa, voit lopettaa seuraaminen yhtä helposti milloin tahansa!",
+ "follow_recommendations.heading": "Seuraa ihmisiä, joilta haluaisit nähdä julkaisuja! Tässä on muutamia ehdotuksia.",
+ "follow_recommendations.lead": "Seuraamiesi julkaisut näkyvät aikajärjestyksessä kotisyötteessä. Älä pelkää seurata vahingossa, voit lopettaa seuraamisen yhtä helposti!",
"follow_request.authorize": "Valtuuta",
"follow_request.reject": "Hylkää",
"follow_requests.unlocked_explanation": "Vaikka tiliäsi ei ole lukittu, {domain}:n ylläpitäjien mielestä saatat haluta tarkistaa nämä seurauspyynnöt manuaalisesti.",
@@ -223,7 +233,7 @@
"keyboard_shortcuts.description": "Kuvaus",
"keyboard_shortcuts.direct": "Avaa pikaviestisarake",
"keyboard_shortcuts.down": "Siirry listassa alaspäin",
- "keyboard_shortcuts.enter": "Avaa viesti",
+ "keyboard_shortcuts.enter": "Avaa julkaisu",
"keyboard_shortcuts.favourite": "Lisää suosikkeihin",
"keyboard_shortcuts.favourites": "Avaa lista suosikeista",
"keyboard_shortcuts.federated": "Avaa yleinen aikajana",
@@ -284,12 +294,13 @@
"navigation_bar.discover": "Löydä uutta",
"navigation_bar.domain_blocks": "Estetyt verkkotunnukset",
"navigation_bar.edit_profile": "Muokkaa profiilia",
+ "navigation_bar.explore": "Explore",
"navigation_bar.favourites": "Suosikit",
"navigation_bar.filters": "Mykistetyt sanat",
"navigation_bar.follow_requests": "Seuraamispyynnöt",
"navigation_bar.follows_and_followers": "Seurattavat ja seuraajat",
"navigation_bar.info": "Tietoa tästä palvelimesta",
- "navigation_bar.keyboard_shortcuts": "Näppäinkomennot",
+ "navigation_bar.keyboard_shortcuts": "Pikanäppäimet",
"navigation_bar.lists": "Listat",
"navigation_bar.logout": "Kirjaudu ulos",
"navigation_bar.mutes": "Mykistetyt käyttäjät",
@@ -298,21 +309,24 @@
"navigation_bar.preferences": "Asetukset",
"navigation_bar.public_timeline": "Yleinen aikajana",
"navigation_bar.security": "Turvallisuus",
+ "notification.admin.sign_up": "{name} rekisteröitynyt",
"notification.favourite": "{name} tykkäsi viestistäsi",
"notification.follow": "{name} seurasi sinua",
"notification.follow_request": "{name} haluaa seurata sinua",
"notification.mention": "{name} mainitsi sinut",
"notification.own_poll": "Kyselysi on päättynyt",
"notification.poll": "Kysely, johon osallistuit, on päättynyt",
- "notification.reblog": "{name} buustasi tilaasi",
- "notification.status": "{name} juuri lähetetty",
+ "notification.reblog": "{name} buustasi julkaisusi",
+ "notification.status": "{name} julkaisi juuri",
+ "notification.update": "{name} muokkasi viestiä",
"notifications.clear": "Tyhjennä ilmoitukset",
"notifications.clear_confirmation": "Haluatko varmasti poistaa kaikki ilmoitukset pysyvästi?",
+ "notifications.column_settings.admin.sign_up": "Uudet kirjautumiset:",
"notifications.column_settings.alert": "Työpöytäilmoitukset",
"notifications.column_settings.favourite": "Tykkäykset:",
"notifications.column_settings.filter_bar.advanced": "Näytä kaikki kategoriat",
"notifications.column_settings.filter_bar.category": "Pikasuodatuspalkki",
- "notifications.column_settings.filter_bar.show": "Näytä",
+ "notifications.column_settings.filter_bar.show_bar": "Näytä suodatinpalkki",
"notifications.column_settings.follow": "Uudet seuraajat:",
"notifications.column_settings.follow_request": "Uudet seuraamispyynnöt:",
"notifications.column_settings.mention": "Maininnat:",
@@ -321,8 +335,10 @@
"notifications.column_settings.reblog": "Buustit:",
"notifications.column_settings.show": "Näytä sarakkeessa",
"notifications.column_settings.sound": "Äänimerkki",
- "notifications.column_settings.status": "New toots:",
- "notifications.column_settings.unread_markers.category": "Lukemattomat ilmoitusmerkit",
+ "notifications.column_settings.status": "Uudet julkaisut:",
+ "notifications.column_settings.unread_notifications.category": "Lukemattomat ilmoitukset",
+ "notifications.column_settings.unread_notifications.highlight": "Korosta lukemattomat ilmoitukset",
+ "notifications.column_settings.update": "Muokkaukset:",
"notifications.filter.all": "Kaikki",
"notifications.filter.boosts": "Buustit",
"notifications.filter.favourites": "Suosikit",
@@ -346,10 +362,10 @@
"poll.total_votes": "{count, plural, one {# ääni} other {# ääntä}}",
"poll.vote": "Äänestä",
"poll.voted": "Äänestit tätä vastausta",
- "poll.votes": "{votes, plural, one {# vote} other {# votes}}",
+ "poll.votes": "{votes, plural, one {# ääni} other {# ääntä}}",
"poll_button.add_poll": "Lisää kysely",
"poll_button.remove_poll": "Poista kysely",
- "privacy.change": "Säädä tuuttauksen näkyvyyttä",
+ "privacy.change": "Muuta julkaisun näkyvyyttä",
"privacy.direct.long": "Julkaise vain mainituille käyttäjille",
"privacy.direct.short": "Suora viesti",
"privacy.private.long": "Julkaise vain seuraajille",
@@ -362,50 +378,93 @@
"regeneration_indicator.label": "Ladataan…",
"regeneration_indicator.sublabel": "Kotinäkymääsi valmistellaan!",
"relative_time.days": "{number} pv",
+ "relative_time.full.days": "{number, plural, one {# päivä} other {# päivää}} sitten",
+ "relative_time.full.hours": "{number, plural, one {# tunti} other {# tuntia}} sitten",
+ "relative_time.full.just_now": "juuri nyt",
+ "relative_time.full.minutes": "{number, plural, one {# minuutti} other {# minuuttia}} sitten",
+ "relative_time.full.seconds": "{number, plural, one {# sekunti} other {# sekuntia}} sitten",
"relative_time.hours": "{number} tuntia",
"relative_time.just_now": "nyt",
"relative_time.minutes": "{number} min",
"relative_time.seconds": "{number} sek",
"relative_time.today": "tänään",
"reply_indicator.cancel": "Peruuta",
+ "report.block": "Estä",
+ "report.block_explanation": "Et näe heidän viestejään. He eivät voi nähdä viestejäsi tai seurata sinua. He voivat kertoa, että heidät on estetty.",
+ "report.categories.other": "Muu",
+ "report.categories.spam": "Roskaposti",
+ "report.categories.violation": "Sisältö rikkoo yhden tai useamman palvelimen sääntöjä",
+ "report.category.subtitle": "Valitse paras osuma",
+ "report.category.title": "Kerro meille mitä tämän {type} kanssa tapahtuu",
+ "report.category.title_account": "profiili",
+ "report.category.title_status": "viesti",
+ "report.close": "Valmis",
+ "report.comment.title": "Pitäisikö meidän tietää jotain muuta?",
"report.forward": "Välitä kohteeseen {target}",
"report.forward_hint": "Tämä tili on toisella palvelimella. Haluatko lähettää nimettömän raportin myös sinne?",
- "report.hint": "Raportti lähetetään oman palvelimesi moderaattoreille. Voit kertoa alla, miksi raportoit tästä tilistä:",
+ "report.mute": "Mykistä",
+ "report.mute_explanation": "Et näe heidän viestejään. He voivat silti seurata sinua ja nähdä viestisi eivätkä tiedä, että heidät on mykistetty.",
+ "report.next": "Seuraava",
"report.placeholder": "Lisäkommentit",
+ "report.reasons.dislike": "En pidä siitä",
+ "report.reasons.dislike_description": "Et halua nähdä sitä",
+ "report.reasons.other": "Se on jotain muuta",
+ "report.reasons.other_description": "Ongelma ei sovi muihin kategorioihin",
+ "report.reasons.spam": "Se on roskapostia",
+ "report.reasons.spam_description": "Haitalliset linkit, väärennetyt sitoutumiset tai toistuvat vastaukset",
+ "report.reasons.violation": "Se rikkoo palvelimen sääntöjä",
+ "report.reasons.violation_description": "Tiedät, että se rikkoo tiettyjä sääntöjä",
+ "report.rules.subtitle": "Valitse kaikki jotka sopivat",
+ "report.rules.title": "Mitä sääntöjä rikotaan?",
+ "report.statuses.subtitle": "Valitse kaikki jotka sopivat",
+ "report.statuses.title": "Onko olemassa yhtään viestiä, jotka tukevat tätä raporttia?",
"report.submit": "Lähetä",
"report.target": "Raportoidaan {target}",
+ "report.thanks.take_action": "Tässä on vaihtoehtosi hallita näkemääsi Mastodonissa:",
+ "report.thanks.take_action_actionable": "Kun tarkistamme tämän, voit ryhtyä toimiin @{name} vastaan:",
+ "report.thanks.title": "Etkö halua nähdä tätä?",
+ "report.thanks.title_actionable": "Kiitos raportista, tutkimme asiaa.",
+ "report.unfollow": "Lopeta seuraaminen @{name}",
+ "report.unfollow_explanation": "Seuraat tätä tiliä. Jotta et enää näkisi heidän kirjoituksiaan, lopeta niiden seuraaminen.",
"search.placeholder": "Hae",
"search_popout.search_format": "Tarkennettu haku",
"search_popout.tips.full_text": "Tekstihaku listaa tilapäivitykset, jotka olet kirjoittanut, lisännyt suosikkeihisi, boostannut tai joissa sinut mainitaan, sekä tekstin sisältävät käyttäjänimet, nimimerkit ja hastagit.",
"search_popout.tips.hashtag": "aihetunnisteet",
- "search_popout.tips.status": "tila",
+ "search_popout.tips.status": "julkaisu",
"search_popout.tips.text": "Tekstihaku listaa hakua vastaavat nimimerkit, käyttäjänimet ja hastagit",
"search_popout.tips.user": "käyttäjä",
"search_results.accounts": "Ihmiset",
+ "search_results.all": "Kaikki",
"search_results.hashtags": "Aihetunnisteet",
+ "search_results.nothing_found": "Näille hakusanoille ei löytynyt mitään",
"search_results.statuses": "Viestit",
"search_results.statuses_fts_disabled": "Viestien haku sisällön perusteella ei ole käytössä tällä Mastodon-palvelimella.",
"search_results.total": "{count, number} {count, plural, one {tulos} other {tulokset}}",
"status.admin_account": "Avaa moderaattorinäkymä tilistä @{name}",
- "status.admin_status": "Avaa tämä viesti moderointinäkymässä",
+ "status.admin_status": "Avaa julkaisu moderointinäkymässä",
"status.block": "Estä @{name}",
"status.bookmark": "Tallenna kirjanmerkki",
"status.cancel_reblog_private": "Peru buustaus",
"status.cannot_reblog": "Tätä viestiä ei voi buustata",
- "status.copy": "Kopioi linkki tilapäivitykseen",
+ "status.copy": "Kopioi linkki julkaisuun",
"status.delete": "Poista",
"status.detailed_status": "Yksityiskohtainen keskustelunäkymä",
"status.direct": "Pikaviesti käyttäjälle @{name}",
+ "status.edit": "Muokkaa",
+ "status.edited": "Muokattu {date}",
+ "status.edited_x_times": "Muokattu {count, plural, one {{count} aika} other {{count} kertaa}}",
"status.embed": "Upota",
"status.favourite": "Tykkää",
"status.filtered": "Suodatettu",
+ "status.history.created": "{name} luotu {date}",
+ "status.history.edited": "{name} muokkasi {date}",
"status.load_more": "Lataa lisää",
"status.media_hidden": "Media piilotettu",
"status.mention": "Mainitse @{name}",
"status.more": "Lisää",
"status.mute": "Mykistä @{name}",
"status.mute_conversation": "Mykistä keskustelu",
- "status.open": "Laajenna viestit",
+ "status.open": "Laajenna julkaisu",
"status.pin": "Kiinnitä profiiliin",
"status.pinned": "Kiinnitetty viesti",
"status.read_more": "Näytä enemmän",
@@ -443,13 +502,13 @@
"timeline_hint.remote_resource_not_displayed": "{resource} muilta palvelimilta ei näytetä.",
"timeline_hint.resources.followers": "Seuraajat",
"timeline_hint.resources.follows": "Seuraa",
- "timeline_hint.resources.statuses": "Vanhemmat tuuttaukset",
+ "timeline_hint.resources.statuses": "Vanhemmat julkaisut",
"trends.counter_by_accounts": "{count, plural, one {{counter} henkilö} other {{counter} henkilöä}} puhuu",
"trends.trending_now": "Suosittua nyt",
"ui.beforeunload": "Luonnos häviää, jos poistut Mastodonista.",
- "units.short.billion": "{count} miljardia",
- "units.short.million": "{count} miljoonaa",
- "units.short.thousand": "{count} tuhatta",
+ "units.short.billion": "{count} mrd.",
+ "units.short.million": "{count} milj.",
+ "units.short.thousand": "{count} t.",
"upload_area.title": "Lataa raahaamalla ja pudottamalla tähän",
"upload_button.label": "Lisää mediaa",
"upload_error.limit": "Tiedostolatauksien raja ylitetty.",
@@ -462,7 +521,7 @@
"upload_form.video_description": "Kuvaile kuulo- tai näkövammaisille",
"upload_modal.analyzing_picture": "Analysoidaan kuvaa…",
"upload_modal.apply": "Käytä",
- "upload_modal.applying": "Applying…",
+ "upload_modal.applying": "Asetetaan…",
"upload_modal.choose_image": "Valitse kuva",
"upload_modal.description_placeholder": "Nopea ruskea kettu hyppää laiskan koiran yli",
"upload_modal.detect_text": "Tunnista teksti kuvasta",
diff --git a/app/javascript/mastodon/locales/fr.json b/app/javascript/mastodon/locales/fr.json
index 5b6d337a1..65d3c6ea1 100644
--- a/app/javascript/mastodon/locales/fr.json
+++ b/app/javascript/mastodon/locales/fr.json
@@ -13,28 +13,27 @@
"account.domain_blocked": "Domaine bloqué",
"account.edit_profile": "Modifier le profil",
"account.enable_notifications": "Me notifier quand @{name} publie",
- "account.endorse": "Recommander sur le profil",
+ "account.endorse": "Recommander sur votre profil",
"account.follow": "Suivre",
"account.followers": "Abonnés",
- "account.followers.empty": "Personne ne suit cet utilisateur pour l’instant.",
- "account.followers_counter": "{count, plural, one {{counter} Abonné} other {{counter} Abonnés}}",
+ "account.followers.empty": "Personne ne suit cet·te utilisateur·rice pour l’instant.",
+ "account.followers_counter": "{count, plural, one {{counter} Abonné·e} other {{counter} Abonné·e·s}}",
+ "account.following": "Abonnements",
"account.following_counter": "{count, plural, other {{counter} Abonnements}}",
- "account.follows.empty": "Cet utilisateur ne suit personne pour l’instant.",
+ "account.follows.empty": "Cet·te utilisateur·rice ne suit personne pour l’instant.",
"account.follows_you": "Vous suit",
"account.hide_reblogs": "Masquer les partages de @{name}",
"account.joined": "Ici depuis {date}",
- "account.last_status": "Dernière activité",
"account.link_verified_on": "La propriété de ce lien a été vérifiée le {date}",
- "account.locked_info": "Ce compte est privé. Son propriétaire approuve manuellement qui peut le suivre.",
+ "account.locked_info": "Ce compte est privé. Son ou sa propriétaire approuve manuellement qui peut le suivre.",
"account.media": "Médias",
"account.mention": "Mentionner @{name}",
"account.moved_to": "{name} a déménagé vers :",
"account.mute": "Masquer @{name}",
"account.mute_notifications": "Ignorer les notifications de @{name}",
"account.muted": "Masqué·e",
- "account.never_active": "Jamais",
"account.posts": "Messages",
- "account.posts_with_replies": "Partages et réponses",
+ "account.posts_with_replies": "Messages et réponses",
"account.report": "Signaler @{name}",
"account.requested": "En attente d’approbation. Cliquez pour annuler la requête",
"account.share": "Partager le profil de @{name}",
@@ -42,21 +41,24 @@
"account.statuses_counter": "{count, plural, one {{counter} Message} other {{counter} Messages}}",
"account.unblock": "Débloquer @{name}",
"account.unblock_domain": "Débloquer le domaine {domain}",
+ "account.unblock_short": "Débloquer",
"account.unendorse": "Ne plus recommander sur le profil",
"account.unfollow": "Ne plus suivre",
"account.unmute": "Ne plus masquer @{name}",
"account.unmute_notifications": "Ne plus masquer les notifications de @{name}",
+ "account.unmute_short": "Ne plus masquer",
"account_note.placeholder": "Cliquez pour ajouter une note",
- "admin.dashboard.retention": "Retention",
- "admin.dashboard.retention.average": "Average",
- "admin.dashboard.retention.cohort": "Sign-up month",
- "admin.dashboard.retention.cohort_size": "New users",
+ "admin.dashboard.daily_retention": "Taux de maintien des utilisateur·rice·s par jour après inscription",
+ "admin.dashboard.monthly_retention": "Brugerfastholdelsesrate efter måned efter tilmelding",
+ "admin.dashboard.retention.average": "Moyenne",
+ "admin.dashboard.retention.cohort": "Mois d'inscription",
+ "admin.dashboard.retention.cohort_size": "Nouveaux utilisateurs",
"alert.rate_limited.message": "Veuillez réessayer après {retry_time, time, medium}.",
"alert.rate_limited.title": "Débit limité",
"alert.unexpected.message": "Une erreur inattendue s’est produite.",
"alert.unexpected.title": "Oups !",
"announcement.announcement": "Annonce",
- "attachments_list.unprocessed": "(unprocessed)",
+ "attachments_list.unprocessed": "(non traité)",
"autosuggest_hashtag.per_week": "{count} par semaine",
"boost_modal.combo": "Vous pouvez appuyer sur {combo} pour passer ceci la prochaine fois",
"bundle_column_error.body": "Une erreur s’est produite lors du chargement de ce composant.",
@@ -104,6 +106,7 @@
"compose_form.poll.switch_to_single": "Changer le sondage pour autoriser qu'un seul choix",
"compose_form.publish": "Pouet",
"compose_form.publish_loud": "{publish} !",
+ "compose_form.save_changes": "Enregistrer les modifications",
"compose_form.sensitive.hide": "Marquer le média comme sensible",
"compose_form.sensitive.marked": "{count, plural, one {Le média est marqué comme sensible} other {Les médias sont marqués comme sensibles}}",
"compose_form.sensitive.unmarked": "Le média n’est pas marqué comme sensible",
@@ -118,21 +121,21 @@
"confirmations.delete.message": "Voulez-vous vraiment supprimer ce message ?",
"confirmations.delete_list.confirm": "Supprimer",
"confirmations.delete_list.message": "Voulez-vous vraiment supprimer définitivement cette liste ?",
- "confirmations.discard_edit_media.confirm": "Discard",
- "confirmations.discard_edit_media.message": "You have unsaved changes to the media description or preview, discard them anyway?",
+ "confirmations.discard_edit_media.confirm": "Rejeter",
+ "confirmations.discard_edit_media.message": "Vous avez des modifications non enregistrées de la description ou de l'aperçu du média, les supprimer quand même ?",
"confirmations.domain_block.confirm": "Bloquer tout le domaine",
- "confirmations.domain_block.message": "Voulez-vous vraiment, vraiment bloquer {domain} en entier ? Dans la plupart des cas, quelques blocages ou masquages ciblés sont suffisants et préférables. Vous ne verrez plus de contenu provenant de ce domaine, ni dans fils publics, ni dans vos notifications. Vos abonnés utilisant ce domaine seront retirés.",
+ "confirmations.domain_block.message": "Voulez-vous vraiment, vraiment bloquer {domain} en entier ? Dans la plupart des cas, quelques blocages ou masquages ciblés sont suffisants et préférables. Vous ne verrez plus de contenu provenant de ce domaine, ni dans vos fils publics, ni dans vos notifications. Vos abonné·e·s utilisant ce domaine seront retiré·e·s.",
"confirmations.logout.confirm": "Se déconnecter",
"confirmations.logout.message": "Voulez-vous vraiment vous déconnecter ?",
"confirmations.mute.confirm": "Masquer",
"confirmations.mute.explanation": "Cela masquera ses messages et les messages le ou la mentionnant, mais cela lui permettra quand même de voir vos messages et de vous suivre.",
"confirmations.mute.message": "Voulez-vous vraiment masquer {name} ?",
"confirmations.redraft.confirm": "Supprimer et ré-écrire",
- "confirmations.redraft.message": "Êtes-vous sûr de vouloir effacer ce statut pour le récrire ? Ses partages ainsi que ses mises en favori seront perdus et ses réponses seront orphelines.",
+ "confirmations.redraft.message": "Êtes-vous sûr·e de vouloir effacer ce statut pour le réécrire ? Ses partages ainsi que ses mises en favori seront perdus et ses réponses seront orphelines.",
"confirmations.reply.confirm": "Répondre",
"confirmations.reply.message": "Répondre maintenant écrasera le message que vous rédigez actuellement. Voulez-vous vraiment continuer ?",
"confirmations.unfollow.confirm": "Ne plus suivre",
- "confirmations.unfollow.message": "Voulez-vous vraiment arrêter de suivre {name} ?",
+ "confirmations.unfollow.message": "Voulez-vous vraiment vous désabonner de {name} ?",
"conversation.delete": "Supprimer la conversation",
"conversation.mark_as_read": "Marquer comme lu",
"conversation.open": "Afficher la conversation",
@@ -149,7 +152,7 @@
"emoji_button.food": "Nourriture & Boisson",
"emoji_button.label": "Insérer un émoji",
"emoji_button.nature": "Nature",
- "emoji_button.not_found": "Aucune correspondance d'émoji trouvée",
+ "emoji_button.not_found": "Aucun émoji correspondant n'a été trouvé",
"emoji_button.objects": "Objets",
"emoji_button.people": "Personnes",
"emoji_button.recent": "Fréquemment utilisés",
@@ -160,11 +163,12 @@
"empty_column.account_suspended": "Compte suspendu",
"empty_column.account_timeline": "Aucun message ici !",
"empty_column.account_unavailable": "Profil non disponible",
- "empty_column.blocks": "Vous n’avez bloqué aucun utilisateur pour le moment.",
+ "empty_column.blocks": "Vous n’avez bloqué aucun compte pour le moment.",
"empty_column.bookmarked_statuses": "Vous n'avez pas de message en marque-page. Lorsque vous en ajouterez un, il apparaîtra ici.",
"empty_column.community": "Le fil public local est vide. Écrivez donc quelque chose pour le remplir !",
"empty_column.direct": "Vous n’avez pas encore de messages directs. Lorsque vous en enverrez ou recevrez un, il s’affichera ici.",
"empty_column.domain_blocks": "Il n’y a aucun domaine bloqué pour le moment.",
+ "empty_column.explore_statuses": "Rien n'est en tendance pour le moment. Revenez plus tard !",
"empty_column.favourited_statuses": "Vous n’avez pas encore de message en favori. Lorsque vous en ajouterez un, il apparaîtra ici.",
"empty_column.favourites": "Personne n’a encore ajouté ce message à ses favoris. Lorsque quelqu’un le fera, il apparaîtra ici.",
"empty_column.follow_recommendations": "Il semble qu’aucune suggestion n’ait pu être générée pour vous. Vous pouvez essayer d’utiliser la recherche pour découvrir des personnes que vous pourriez connaître ou explorer les hashtags tendance.",
@@ -174,7 +178,7 @@
"empty_column.home.suggestions": "Voir quelques suggestions",
"empty_column.list": "Il n’y a rien dans cette liste pour l’instant. Quand des membres de cette liste publieront de nouveaux messages, ils apparaîtront ici.",
"empty_column.lists": "Vous n’avez pas encore de liste. Lorsque vous en créerez une, elle apparaîtra ici.",
- "empty_column.mutes": "Vous n’avez masqué aucun utilisateur pour le moment.",
+ "empty_column.mutes": "Vous n’avez masqué aucun compte pour le moment.",
"empty_column.notifications": "Vous n’avez pas encore de notification. Interagissez avec d’autres personnes pour débuter la conversation.",
"empty_column.public": "Il n’y a rien ici ! Écrivez quelque chose publiquement, ou bien suivez manuellement des personnes d’autres serveurs pour remplir le fil public",
"error.unexpected_crash.explanation": "En raison d’un bug dans notre code ou d’un problème de compatibilité avec votre navigateur, cette page n’a pas pu être affichée correctement.",
@@ -183,6 +187,12 @@
"error.unexpected_crash.next_steps_addons": "Essayez de les désactiver et de rafraîchir la page. Si cela ne vous aide pas, vous pouvez toujours utiliser Mastodon via un autre navigateur ou une application native.",
"errors.unexpected_crash.copy_stacktrace": "Copier la trace d'appels dans le presse-papier",
"errors.unexpected_crash.report_issue": "Signaler le problème",
+ "explore.search_results": "Résultats de la recherche",
+ "explore.suggested_follows": "Pour vous",
+ "explore.title": "Explorer",
+ "explore.trending_links": "Actualité",
+ "explore.trending_statuses": "Messages",
+ "explore.trending_tags": "Hashtags",
"follow_recommendations.done": "Terminé",
"follow_recommendations.heading": "Suivez les personnes dont vous aimeriez voir les messages ! Voici quelques suggestions.",
"follow_recommendations.lead": "Les messages des personnes que vous suivez apparaîtront par ordre chronologique sur votre fil d'accueil. Ne craignez pas de faire des erreurs, vous pouvez arrêter de suivre les gens aussi facilement à tout moment !",
@@ -232,13 +242,13 @@
"keyboard_shortcuts.hotkey": "Raccourci clavier",
"keyboard_shortcuts.legend": "Afficher cet aide-mémoire",
"keyboard_shortcuts.local": "Ouvrir le fil public local",
- "keyboard_shortcuts.mention": "Mentionner l’auteur",
+ "keyboard_shortcuts.mention": "Mentionner l’auteur·rice",
"keyboard_shortcuts.muted": "Ouvrir la liste des comptes masqués",
"keyboard_shortcuts.my_profile": "Ouvrir votre profil",
"keyboard_shortcuts.notifications": "Ouvrir la colonne de notifications",
"keyboard_shortcuts.open_media": "ouvrir le média",
"keyboard_shortcuts.pinned": "Ouvrir la liste des messages épinglés",
- "keyboard_shortcuts.profile": "Ouvrir le profil de l’auteur",
+ "keyboard_shortcuts.profile": "Ouvrir le profil de l’auteur·rice",
"keyboard_shortcuts.reply": "Répondre au message",
"keyboard_shortcuts.requests": "Ouvrir la liste de demandes d’abonnement",
"keyboard_shortcuts.search": "Se placer dans le champ de recherche",
@@ -261,7 +271,7 @@
"lists.edit.submit": "Modifier le titre",
"lists.new.create": "Ajouter une liste",
"lists.new.title_placeholder": "Titre de la nouvelle liste",
- "lists.replies_policy.followed": "N'importe quel utilisateur suivi",
+ "lists.replies_policy.followed": "N'importe quel compte suivi",
"lists.replies_policy.list": "Membres de la liste",
"lists.replies_policy.none": "Personne",
"lists.replies_policy.title": "Afficher les réponses à :",
@@ -284,9 +294,10 @@
"navigation_bar.discover": "Découvrir",
"navigation_bar.domain_blocks": "Domaines bloqués",
"navigation_bar.edit_profile": "Modifier le profil",
+ "navigation_bar.explore": "Explorer",
"navigation_bar.favourites": "Favoris",
"navigation_bar.filters": "Mots masqués",
- "navigation_bar.follow_requests": "Demandes de suivi",
+ "navigation_bar.follow_requests": "Demandes d’abonnement",
"navigation_bar.follows_and_followers": "Abonnements et abonné⋅e·s",
"navigation_bar.info": "À propos de ce serveur",
"navigation_bar.keyboard_shortcuts": "Raccourcis clavier",
@@ -298,22 +309,25 @@
"navigation_bar.preferences": "Préférences",
"navigation_bar.public_timeline": "Fil public global",
"navigation_bar.security": "Sécurité",
+ "notification.admin.sign_up": "{name} s'est inscrit·e",
"notification.favourite": "{name} a ajouté le message à ses favoris",
"notification.follow": "{name} vous suit",
"notification.follow_request": "{name} a demandé à vous suivre",
- "notification.mention": "{name} vous a mentionné·",
+ "notification.mention": "{name} vous a mentionné·e :",
"notification.own_poll": "Votre sondage est terminé",
"notification.poll": "Un sondage auquel vous avez participé vient de se terminer",
"notification.reblog": "{name} a partagé votre message",
"notification.status": "{name} vient de publier",
+ "notification.update": "{name} a modifié un message",
"notifications.clear": "Effacer les notifications",
"notifications.clear_confirmation": "Voulez-vous vraiment effacer toutes vos notifications ?",
+ "notifications.column_settings.admin.sign_up": "Nouvelles inscriptions :",
"notifications.column_settings.alert": "Notifications du navigateur",
"notifications.column_settings.favourite": "Favoris :",
"notifications.column_settings.filter_bar.advanced": "Afficher toutes les catégories",
"notifications.column_settings.filter_bar.category": "Barre de filtrage rapide",
- "notifications.column_settings.filter_bar.show": "Afficher",
- "notifications.column_settings.follow": "Nouveaux abonnés :",
+ "notifications.column_settings.filter_bar.show_bar": "Afficher la barre de filtre",
+ "notifications.column_settings.follow": "Nouveaux·elles abonné·e·s :",
"notifications.column_settings.follow_request": "Nouvelles demandes d’abonnement :",
"notifications.column_settings.mention": "Mentions :",
"notifications.column_settings.poll": "Résultats des sondage :",
@@ -322,7 +336,9 @@
"notifications.column_settings.show": "Afficher dans la colonne",
"notifications.column_settings.sound": "Jouer un son",
"notifications.column_settings.status": "Nouveaux messages :",
- "notifications.column_settings.unread_markers.category": "Marqueurs de notifications non lues",
+ "notifications.column_settings.unread_notifications.category": "Notifications non lues",
+ "notifications.column_settings.unread_notifications.highlight": "Surligner les notifications non lues",
+ "notifications.column_settings.update": "Modifications :",
"notifications.filter.all": "Tout",
"notifications.filter.boosts": "Partages",
"notifications.filter.favourites": "Favoris",
@@ -353,36 +369,74 @@
"privacy.direct.long": "Visible uniquement par les comptes mentionnés",
"privacy.direct.short": "Direct",
"privacy.private.long": "Visible uniquement par vos abonné·e·s",
- "privacy.private.short": "Abonnés uniquement",
- "privacy.public.long": "Visible par tous, affiché dans les fils publics",
+ "privacy.private.short": "Abonné·e·s uniquement",
+ "privacy.public.long": "Visible par tou·te·s, affiché dans les fils publics",
"privacy.public.short": "Public",
- "privacy.unlisted.long": "Visible par tous, mais pas dans les fils publics",
+ "privacy.unlisted.long": "Visible par tou·te·s, mais pas dans les fils publics",
"privacy.unlisted.short": "Non listé",
"refresh": "Actualiser",
"regeneration_indicator.label": "Chargement…",
"regeneration_indicator.sublabel": "Votre fil principal est en cours de préparation !",
"relative_time.days": "{number} j",
+ "relative_time.full.days": "il y a {number, plural, one {# jour} other {# jours}}",
+ "relative_time.full.hours": "il y a {number, plural, one {# heure} other {# heures}}",
+ "relative_time.full.just_now": "à l’instant",
+ "relative_time.full.minutes": "il y a {number, plural, one {# minute} other {# minutes}}",
+ "relative_time.full.seconds": "il y a {number, plural, one {# second} other {# seconds}}",
"relative_time.hours": "{number} h",
"relative_time.just_now": "à l’instant",
"relative_time.minutes": "{number} min",
"relative_time.seconds": "{number} s",
"relative_time.today": "aujourd’hui",
"reply_indicator.cancel": "Annuler",
+ "report.block": "Bloquer",
+ "report.block_explanation": "Vous ne verrez plus les messages de ce profil, et il ne pourra ni vous suivre ni voir vos messages. Il pourra savoir qu'il a été bloqué.",
+ "report.categories.other": "Autre",
+ "report.categories.spam": "Spam",
+ "report.categories.violation": "Le contenu enfreint une ou plusieurs règles du serveur",
+ "report.category.subtitle": "Sélctionnez ce qui correspond le mieux",
+ "report.category.title": "Dites-nous ce qu'il se passe avec {type}",
+ "report.category.title_account": "ce profil",
+ "report.category.title_status": "ce message",
+ "report.close": "Terminé",
+ "report.comment.title": "Y a-t-il autre chose que nous devrions savoir ?",
"report.forward": "Transférer à {target}",
"report.forward_hint": "Le compte provient d’un autre serveur. Envoyer également une copie anonyme du rapport ?",
- "report.hint": "Le rapport sera envoyé aux modérateurs de votre instance. Vous pouvez expliquer pourquoi vous signalez le compte ci-dessous :",
+ "report.mute": "Masquer",
+ "report.mute_explanation": "Vous ne verrez plus les messages de ce compte, mais il pourra toujours vous suivre et voir vos messages. Il ne pourra pas savoir qu'il a été masqué.",
+ "report.next": "Suivant",
"report.placeholder": "Commentaires additionnels",
+ "report.reasons.dislike": "Cela ne me plaît pas",
+ "report.reasons.dislike_description": "Ce n'est pas quelque chose que vous voulez voir",
+ "report.reasons.other": "Pour une autre raison",
+ "report.reasons.other_description": "Le problème ne correspond pas aux autres catégories",
+ "report.reasons.spam": "C'est du spam",
+ "report.reasons.spam_description": "Liens malveillants, faux engagement ou réponses répétitives",
+ "report.reasons.violation": "Infraction des règles du serveur",
+ "report.reasons.violation_description": "Vous savez que des règles précises sont enfreintes",
+ "report.rules.subtitle": "Sélectionnez toutes les réponses appropriées",
+ "report.rules.title": "Quelles règles sont enfreintes ?",
+ "report.statuses.subtitle": "Sélectionnez toutes les réponses appropriées",
+ "report.statuses.title": "Existe-t-il des messages pour étayer ce rapport ?",
"report.submit": "Envoyer",
"report.target": "Signalement de {target}",
+ "report.thanks.take_action": "Voici les possibilités que vous avez pour contrôler ce que vous voyez sur Mastodon :",
+ "report.thanks.take_action_actionable": "Pendant que nous étudions votre requête, vous pouvez prendre des mesures contre @{name} :",
+ "report.thanks.title": "Vous ne voulez pas voir cela ?",
+ "report.thanks.title_actionable": "Merci pour votre signalement, nous allons investiguer.",
+ "report.unfollow": "Ne plus suivre @{name}",
+ "report.unfollow_explanation": "Vous suivez ce compte. Désabonnez-vous pour ne plus en voir les messages sur votre fil principal.",
"search.placeholder": "Rechercher",
"search_popout.search_format": "Recherche avancée",
"search_popout.tips.full_text": "Un texte normal retourne les messages que vous avez écrits, ajoutés à vos favoris, partagés, ou vous mentionnant, ainsi que les identifiants, les noms affichés, et les hashtags des personnes et messages correspondants.",
"search_popout.tips.hashtag": "hashtag",
- "search_popout.tips.status": "statuts",
+ "search_popout.tips.status": "message",
"search_popout.tips.text": "Un texte simple renvoie les noms affichés, les identifiants et les hashtags correspondants",
"search_popout.tips.user": "utilisateur·ice",
"search_results.accounts": "Comptes",
+ "search_results.all": "Tous les résultats",
"search_results.hashtags": "Hashtags",
+ "search_results.nothing_found": "Aucun résultat avec ces mots-clefs",
"search_results.statuses": "Messages",
"search_results.statuses_fts_disabled": "La recherche de messages par leur contenu n'est pas activée sur ce serveur Mastodon.",
"search_results.total": "{count, number} {count, plural, one {résultat} other {résultats}}",
@@ -396,9 +450,14 @@
"status.delete": "Supprimer",
"status.detailed_status": "Vue détaillée de la conversation",
"status.direct": "Envoyer un message direct à @{name}",
+ "status.edit": "Éditer",
+ "status.edited": "Édité le {date}",
+ "status.edited_x_times": "Edité {count, plural, one {{count} fois} other {{count} fois}}",
"status.embed": "Intégrer",
"status.favourite": "Ajouter aux favoris",
"status.filtered": "Filtré",
+ "status.history.created": "créé par {name} {date}",
+ "status.history.edited": "édité par {name} {date}",
"status.load_more": "Charger plus",
"status.media_hidden": "Média caché",
"status.mention": "Mentionner @{name}",
@@ -413,7 +472,7 @@
"status.reblog_private": "Partager à l’audience originale",
"status.reblogged_by": "{name} a partagé",
"status.reblogs.empty": "Personne n’a encore partagé ce message. Lorsque quelqu’un le fera, il apparaîtra ici.",
- "status.redraft": "Supprimer et récrire",
+ "status.redraft": "Supprimer et réécrire",
"status.remove_bookmark": "Retirer des marque-pages",
"status.reply": "Répondre",
"status.replyAll": "Répondre au fil",
@@ -429,7 +488,7 @@
"status.unmute_conversation": "Ne plus masquer la conversation",
"status.unpin": "Retirer du profil",
"suggestions.dismiss": "Rejeter la suggestion",
- "suggestions.header": "Vous pourriez être intéressé par…",
+ "suggestions.header": "Vous pourriez être intéressé·e par…",
"tabs_bar.federated_timeline": "Fil public global",
"tabs_bar.home": "Accueil",
"tabs_bar.local_timeline": "Fil public local",
@@ -455,14 +514,14 @@
"upload_error.limit": "Taille maximale d'envoi de fichier dépassée.",
"upload_error.poll": "L’envoi de fichiers n’est pas autorisé avec les sondages.",
"upload_form.audio_description": "Décrire pour les personnes ayant des difficultés d’audition",
- "upload_form.description": "Décrire pour les malvoyants",
+ "upload_form.description": "Décrire pour les malvoyant·e·s",
"upload_form.edit": "Modifier",
"upload_form.thumbnail": "Changer la vignette",
"upload_form.undo": "Supprimer",
"upload_form.video_description": "Décrire pour les personnes ayant des problèmes d’audition ou de vision",
"upload_modal.analyzing_picture": "Analyse de l’image en cours…",
"upload_modal.apply": "Appliquer",
- "upload_modal.applying": "Applying…",
+ "upload_modal.applying": "Application en cours…",
"upload_modal.choose_image": "Choisir une image",
"upload_modal.description_placeholder": "Buvez de ce whisky que le patron juge fameux",
"upload_modal.detect_text": "Détecter le texte de l’image",
diff --git a/app/javascript/mastodon/locales/ga.json b/app/javascript/mastodon/locales/ga.json
index 9c94c61aa..5bf1681a8 100644
--- a/app/javascript/mastodon/locales/ga.json
+++ b/app/javascript/mastodon/locales/ga.json
@@ -18,12 +18,12 @@
"account.followers": "Followers",
"account.followers.empty": "No one follows this user yet.",
"account.followers_counter": "{count, plural, one {{counter} Follower} other {{counter} Followers}}",
+ "account.following": "Following",
"account.following_counter": "{count, plural, one {{counter} Following} other {{counter} Following}}",
"account.follows.empty": "This user doesn't follow anyone yet.",
"account.follows_you": "Follows you",
"account.hide_reblogs": "Hide boosts from @{name}",
"account.joined": "Joined {date}",
- "account.last_status": "Last active",
"account.link_verified_on": "Ownership of this link was checked on {date}",
"account.locked_info": "This account privacy status is set to locked. The owner manually reviews who can follow them.",
"account.media": "Media",
@@ -32,7 +32,6 @@
"account.mute": "Mute @{name}",
"account.mute_notifications": "Mute notifications from @{name}",
"account.muted": "Muted",
- "account.never_active": "Never",
"account.posts": "Toots",
"account.posts_with_replies": "Toots and replies",
"account.report": "Report @{name}",
@@ -42,12 +41,15 @@
"account.statuses_counter": "{count, plural, one {{counter} Toot} other {{counter} Toots}}",
"account.unblock": "Unblock @{name}",
"account.unblock_domain": "Unhide {domain}",
+ "account.unblock_short": "Unblock",
"account.unendorse": "Don't feature on profile",
"account.unfollow": "Unfollow",
"account.unmute": "Unmute @{name}",
"account.unmute_notifications": "Unmute notifications from @{name}",
+ "account.unmute_short": "Unmute",
"account_note.placeholder": "No comment provided",
- "admin.dashboard.retention": "Retention",
+ "admin.dashboard.daily_retention": "User retention rate by day after sign-up",
+ "admin.dashboard.monthly_retention": "User retention rate by month after sign-up",
"admin.dashboard.retention.average": "Average",
"admin.dashboard.retention.cohort": "Sign-up month",
"admin.dashboard.retention.cohort_size": "New users",
@@ -104,6 +106,7 @@
"compose_form.poll.switch_to_single": "Change poll to allow for a single choice",
"compose_form.publish": "Toot",
"compose_form.publish_loud": "{publish}!",
+ "compose_form.save_changes": "Save changes",
"compose_form.sensitive.hide": "{count, plural, one {Mark media as sensitive} other {Mark media as sensitive}}",
"compose_form.sensitive.marked": "{count, plural, one {Media is marked as sensitive} other {Media is marked as sensitive}}",
"compose_form.sensitive.unmarked": "{count, plural, one {Media is not marked as sensitive} other {Media is not marked as sensitive}}",
@@ -165,6 +168,7 @@
"empty_column.community": "The local timeline is empty. Write something publicly to get the ball rolling!",
"empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.",
"empty_column.domain_blocks": "There are no hidden domains yet.",
+ "empty_column.explore_statuses": "Nothing is trending right now. Check back later!",
"empty_column.favourited_statuses": "You don't have any favourite toots yet. When you favourite one, it will show up here.",
"empty_column.favourites": "No one has favourited this toot yet. When someone does, they will show up here.",
"empty_column.follow_recommendations": "Looks like no suggestions could be generated for you. You can try using search to look for people you might know or explore trending hashtags.",
@@ -183,6 +187,12 @@
"error.unexpected_crash.next_steps_addons": "Try disabling them and refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
"errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard",
"errors.unexpected_crash.report_issue": "Report issue",
+ "explore.search_results": "Search results",
+ "explore.suggested_follows": "For you",
+ "explore.title": "Explore",
+ "explore.trending_links": "News",
+ "explore.trending_statuses": "Posts",
+ "explore.trending_tags": "Hashtags",
"follow_recommendations.done": "Done",
"follow_recommendations.heading": "Follow people you'd like to see posts from! Here are some suggestions.",
"follow_recommendations.lead": "Posts from people you follow will show up in chronological order on your home feed. Don't be afraid to make mistakes, you can unfollow people just as easily any time!",
@@ -284,6 +294,7 @@
"navigation_bar.discover": "Discover",
"navigation_bar.domain_blocks": "Hidden domains",
"navigation_bar.edit_profile": "Edit profile",
+ "navigation_bar.explore": "Explore",
"navigation_bar.favourites": "Favourites",
"navigation_bar.filters": "Muted words",
"navigation_bar.follow_requests": "Follow requests",
@@ -298,6 +309,7 @@
"navigation_bar.preferences": "Preferences",
"navigation_bar.public_timeline": "Federated timeline",
"navigation_bar.security": "Security",
+ "notification.admin.sign_up": "{name} signed up",
"notification.favourite": "{name} favourited your status",
"notification.follow": "{name} followed you",
"notification.follow_request": "{name} has requested to follow you",
@@ -306,13 +318,15 @@
"notification.poll": "A poll you have voted in has ended",
"notification.reblog": "{name} boosted your status",
"notification.status": "{name} just posted",
+ "notification.update": "{name} edited a post",
"notifications.clear": "Clear notifications",
"notifications.clear_confirmation": "Are you sure you want to permanently clear all your notifications?",
+ "notifications.column_settings.admin.sign_up": "New sign-ups:",
"notifications.column_settings.alert": "Desktop notifications",
"notifications.column_settings.favourite": "Favourites:",
"notifications.column_settings.filter_bar.advanced": "Display all categories",
"notifications.column_settings.filter_bar.category": "Quick filter bar",
- "notifications.column_settings.filter_bar.show": "Show",
+ "notifications.column_settings.filter_bar.show_bar": "Show filter bar",
"notifications.column_settings.follow": "New followers:",
"notifications.column_settings.follow_request": "New follow requests:",
"notifications.column_settings.mention": "Mentions:",
@@ -322,7 +336,9 @@
"notifications.column_settings.show": "Show in column",
"notifications.column_settings.sound": "Play sound",
"notifications.column_settings.status": "New toots:",
- "notifications.column_settings.unread_markers.category": "Unread notification markers",
+ "notifications.column_settings.unread_notifications.category": "Unread notifications",
+ "notifications.column_settings.unread_notifications.highlight": "Highlight unread notifications",
+ "notifications.column_settings.update": "Edits:",
"notifications.filter.all": "All",
"notifications.filter.boosts": "Boosts",
"notifications.filter.favourites": "Favourites",
@@ -362,18 +378,54 @@
"regeneration_indicator.label": "Loading…",
"regeneration_indicator.sublabel": "Your home feed is being prepared!",
"relative_time.days": "{number}d",
+ "relative_time.full.days": "{number, plural, one {# day} other {# days}} ago",
+ "relative_time.full.hours": "{number, plural, one {# hour} other {# hours}} ago",
+ "relative_time.full.just_now": "just now",
+ "relative_time.full.minutes": "{number, plural, one {# minute} other {# minutes}} ago",
+ "relative_time.full.seconds": "{number, plural, one {# second} other {# seconds}} ago",
"relative_time.hours": "{number}h",
"relative_time.just_now": "now",
"relative_time.minutes": "{number}m",
"relative_time.seconds": "{number}s",
"relative_time.today": "today",
"reply_indicator.cancel": "Cancel",
+ "report.block": "Block",
+ "report.block_explanation": "You will not see their posts. They will not be able to see your posts or follow you. They will be able to tell that they are blocked.",
+ "report.categories.other": "Other",
+ "report.categories.spam": "Spam",
+ "report.categories.violation": "Content violates one or more server rules",
+ "report.category.subtitle": "Choose the best match",
+ "report.category.title": "Tell us what's going on with this {type}",
+ "report.category.title_account": "profile",
+ "report.category.title_status": "post",
+ "report.close": "Done",
+ "report.comment.title": "Is there anything else you think we should know?",
"report.forward": "Forward to {target}",
"report.forward_hint": "The account is from another server. Send an anonymized copy of the report there as well?",
- "report.hint": "The report will be sent to your server moderators. You can provide an explanation of why you are reporting this account below:",
+ "report.mute": "Mute",
+ "report.mute_explanation": "You will not see their posts. They can still follow you and see your posts and will not know that they are muted.",
+ "report.next": "Next",
"report.placeholder": "Additional comments",
+ "report.reasons.dislike": "I don't like it",
+ "report.reasons.dislike_description": "It is not something you want to see",
+ "report.reasons.other": "It's something else",
+ "report.reasons.other_description": "The issue does not fit into other categories",
+ "report.reasons.spam": "It's spam",
+ "report.reasons.spam_description": "Malicious links, fake engagement, or repetetive replies",
+ "report.reasons.violation": "It violates server rules",
+ "report.reasons.violation_description": "You are aware that it breaks specific rules",
+ "report.rules.subtitle": "Select all that apply",
+ "report.rules.title": "Which rules are being violated?",
+ "report.statuses.subtitle": "Select all that apply",
+ "report.statuses.title": "Are there any posts that back up this report?",
"report.submit": "Submit",
"report.target": "Report {target}",
+ "report.thanks.take_action": "Here are your options for controlling what you see on Mastodon:",
+ "report.thanks.take_action_actionable": "While we review this, you can take action against @{name}:",
+ "report.thanks.title": "Don't want to see this?",
+ "report.thanks.title_actionable": "Thanks for reporting, we'll look into this.",
+ "report.unfollow": "Unfollow @{name}",
+ "report.unfollow_explanation": "You are following this account. To not see their posts in your home feed anymore, unfollow them.",
"search.placeholder": "Search",
"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.",
@@ -382,7 +434,9 @@
"search_popout.tips.text": "Simple text returns matching display names, usernames and hashtags",
"search_popout.tips.user": "user",
"search_results.accounts": "People",
+ "search_results.all": "All",
"search_results.hashtags": "Hashtags",
+ "search_results.nothing_found": "Could not find anything for these search terms",
"search_results.statuses": "Toots",
"search_results.statuses_fts_disabled": "Searching toots by their content is not enabled on this Mastodon server.",
"search_results.total": "{count, number} {count, plural, one {result} other {results}}",
@@ -396,9 +450,14 @@
"status.delete": "Delete",
"status.detailed_status": "Detailed conversation view",
"status.direct": "Direct message @{name}",
+ "status.edit": "Edit",
+ "status.edited": "Edited {date}",
+ "status.edited_x_times": "Edited {count, plural, one {{count} time} other {{count} times}}",
"status.embed": "Embed",
"status.favourite": "Favourite",
"status.filtered": "Filtered",
+ "status.history.created": "{name} created {date}",
+ "status.history.edited": "{name} edited {date}",
"status.load_more": "Load more",
"status.media_hidden": "Media hidden",
"status.mention": "Mention @{name}",
diff --git a/app/javascript/mastodon/locales/gd.json b/app/javascript/mastodon/locales/gd.json
index 023ee3ecb..aae73a23e 100644
--- a/app/javascript/mastodon/locales/gd.json
+++ b/app/javascript/mastodon/locales/gd.json
@@ -18,12 +18,12 @@
"account.followers": "Luchd-leantainn",
"account.followers.empty": "Chan eil neach sam bith a’ leantainn air a’ chleachdaiche seo fhathast.",
"account.followers_counter": "{count, plural, one {{counter} neach-leantainn} two {{counter} neach-leantainn} few {{counter} luchd-leantainn} other {{counter} luchd-leantainn}}",
+ "account.following": "Following",
"account.following_counter": "{count, plural, one {A’ leantainn air {counter}} two {A’ leantainn air {counter}} few {A’ leantainn air {counter}} other {A’ leantainn air {counter}}}",
"account.follows.empty": "Chan eil an cleachdaiche seo a’ leantainn air neach sam bith fhathast.",
"account.follows_you": "’Gad leantainn",
"account.hide_reblogs": "Falaich na brosnachaidhean o @{name}",
"account.joined": "Air ballrachd fhaighinn {date}",
- "account.last_status": "An gnìomh mu dheireadh",
"account.link_verified_on": "Chaidh dearbhadh cò leis a tha an ceangal seo {date}",
"account.locked_info": "Tha prìobhaideachd ghlaiste aig a’ chunntais seo. Nì an sealbhadair lèirmheas a làimh air cò dh’fhaodas leantainn orra.",
"account.media": "Meadhanan",
@@ -32,7 +32,6 @@
"account.mute": "Mùch @{name}",
"account.mute_notifications": "Mùch na brathan o @{name}",
"account.muted": "’Ga mhùchadh",
- "account.never_active": "Chan ann idir",
"account.posts": "Postaichean",
"account.posts_with_replies": "Postaichean ’s freagairtean",
"account.report": "Dèan gearan mu @{name}",
@@ -42,21 +41,24 @@
"account.statuses_counter": "{count, plural, one {{counter} phost} two {{counter} phost} few {{counter} postaichean} other {{counter} post}}",
"account.unblock": "Dì-bhac @{name}",
"account.unblock_domain": "Dì-bhac an àrainn {domain}",
+ "account.unblock_short": "Unblock",
"account.unendorse": "Na brosnaich air a’ phròifil",
"account.unfollow": "Na lean tuilleadh",
"account.unmute": "Dì-mhùch @{name}",
"account.unmute_notifications": "Dì-mhùch na brathan o @{name}",
+ "account.unmute_short": "Unmute",
"account_note.placeholder": "Briog airson nòta a chur ris",
- "admin.dashboard.retention": "Retention",
- "admin.dashboard.retention.average": "Average",
- "admin.dashboard.retention.cohort": "Sign-up month",
- "admin.dashboard.retention.cohort_size": "New users",
+ "admin.dashboard.daily_retention": "Reat glèidheadh nan cleachdaichean às dèidh an clàradh a-rèir latha",
+ "admin.dashboard.monthly_retention": "Reat glèidheadh nan cleachdaichean às dèidh an clàradh a-rèir mìos",
+ "admin.dashboard.retention.average": "Cuibheasach",
+ "admin.dashboard.retention.cohort": "Mìos a’ chlàraidh",
+ "admin.dashboard.retention.cohort_size": "Cleachdaichean ùra",
"alert.rate_limited.message": "Feuch ris a-rithist às dèidh {retry_time, time, medium}.",
"alert.rate_limited.title": "Cuingeachadh ùine",
"alert.unexpected.message": "Thachair mearachd ris nach robh dùil.",
"alert.unexpected.title": "Oich!",
"announcement.announcement": "Brath-fios",
- "attachments_list.unprocessed": "(unprocessed)",
+ "attachments_list.unprocessed": "(gun phròiseasadh)",
"autosuggest_hashtag.per_week": "{count} gach seachdain",
"boost_modal.combo": "Brùth air {combo} nam b’ fheàrr leat leum a ghearradh thar seo an ath-thuras",
"bundle_column_error.body": "Chaidh rudeigin cearr nuair a dh’fheuch sinn ris a’ cho-phàirt seo a luchdadh.",
@@ -104,6 +106,7 @@
"compose_form.poll.switch_to_single": "Atharraich an cunntas-bheachd gus nach gabh ach aon roghainn a thaghadh",
"compose_form.publish": "Postaich",
"compose_form.publish_loud": "{publish}!",
+ "compose_form.save_changes": "Sàbhail na h-atharraichean",
"compose_form.sensitive.hide": "{count, plural, one {Cuir comharra gu bheil am meadhan frionasach} two {Cuir comharra gu bheil na meadhanan frionasach} few {Cuir comharra gu bheil na meadhanan frionasach} other {Cuir comharra gu bheil na meadhanan frionasach}}",
"compose_form.sensitive.marked": "{count, plural, one {Tha comharra ris a’ mheadhan gu bheil e frionasach} two {Tha comharra ris na meadhanan gu bheil iad frionasach} few {Tha comharra ris na meadhanan gu bheil iad frionasach} other {Tha comharra ris na meadhanan gu bheil iad frionasach}}",
"compose_form.sensitive.unmarked": "{count, plural, one {Chan eil comharra ris a’ mheadhan gun robh e frionasach} two {Chan eil comharra ris na meadhanan gun robh iad frionasach} few {Chan eil comharra ris na meadhanan gun robh iad frionasach} other {Chan eil comharra ris na meadhanan gun robh iad frionasach}}",
@@ -118,8 +121,8 @@
"confirmations.delete.message": "A bheil thu cinnteach gu bheil thu airson am post seo a sguabadh às?",
"confirmations.delete_list.confirm": "Sguab às",
"confirmations.delete_list.message": "A bheil thu cinnteach gu bheil thu airson an liosta seo a sguabadh às gu buan?",
- "confirmations.discard_edit_media.confirm": "Discard",
- "confirmations.discard_edit_media.message": "You have unsaved changes to the media description or preview, discard them anyway?",
+ "confirmations.discard_edit_media.confirm": "Tilg air falbh",
+ "confirmations.discard_edit_media.message": "Tha atharraichean gun sàbhaladh agad ann an tuairisgeul no ro-shealladh a’ mheadhain, a bheil thu airson an tilgeil air falbh co-dhiù?",
"confirmations.domain_block.confirm": "Bac an àrainn uile gu lèir",
"confirmations.domain_block.message": "A bheil thu cinnteach dha-rìribh gu bheil thu airson an àrainn {domain} a bhacadh uile gu lèir? Mar as trice, foghnaidh gun dèan thu bacadh no mùchadh no dhà gu sònraichte agus bhiod sin na b’ fheàrr. Chan fhaic thu susbaint on àrainn ud air loidhne-ama phoblach sam bith no am measg nam brathan agad. Thèid an luchd-leantainn agad on àrainn ud a thoirt air falbh.",
"confirmations.logout.confirm": "Clàraich a-mach",
@@ -165,6 +168,7 @@
"empty_column.community": "Tha an loidhne-ama ionadail falamh. Sgrìobh rudeigin gu poblach airson toiseach-tòiseachaidh a dhèanamh!",
"empty_column.direct": "Chan eil teachdaireachd dhìreach agad fhathast. Nuair a chuireas no a gheibh thu tè, nochdaidh i an-seo.",
"empty_column.domain_blocks": "Cha deach àrainn sam bith a bhacadh fhathast.",
+ "empty_column.explore_statuses": "Chan eil dad a’ treandadh an-dràsta fhèin. Thoir sùil a-rithist an ceann greis!",
"empty_column.favourited_statuses": "Chan eil annsachd air post agad fhathast. Nuair a nì thu annsachd de dh’fhear, nochdaidh e an-seo.",
"empty_column.favourites": "Chan eil am post seo ’na annsachd aig duine sam bith fhathast. Nuair a nì daoine annsachd dheth, nochdaidh iad an-seo.",
"empty_column.follow_recommendations": "Chan urrainn dhuinn dad a mholadh dhut. Cleachd gleus an luirg feuch an lorg thu daoine air a bheil thu eòlach no rùraich na tagaichean-hais a tha a’ treandadh.",
@@ -183,6 +187,12 @@
"error.unexpected_crash.next_steps_addons": "Feuch an cuir thu à comas iad ’s gun ath-nuadhaich thu an duilleag seo. Mura cuidich sin, dh’fhaoidte gur urrainn dhut Mastodon a chleachdadh fhathast le brabhsair eile no le aplacaid thùsail.",
"errors.unexpected_crash.copy_stacktrace": "Cuir lethbhreac dhen stacktrace air an stòr-bhòrd",
"errors.unexpected_crash.report_issue": "Dèan aithris air an duilgheadas",
+ "explore.search_results": "Toraidhean an luirg",
+ "explore.suggested_follows": "Dhut-sa",
+ "explore.title": "Rùraich",
+ "explore.trending_links": "Naidheachdan",
+ "explore.trending_statuses": "Postaichean",
+ "explore.trending_tags": "Tagaichean hais",
"follow_recommendations.done": "Deiseil",
"follow_recommendations.heading": "Lean air daoine ma tha thu airson nam postaichean aca fhaicinn! Seo moladh no dà dhut.",
"follow_recommendations.lead": "Nochdaidh na postaichean aig na daoine air a leanas tu a-rèir an ama air inbhir na dachaighe agad. Bi dàna on as urrainn dhut sgur de leantainn air daoine cuideachd uair sam bith!",
@@ -284,6 +294,7 @@
"navigation_bar.discover": "Fidir",
"navigation_bar.domain_blocks": "Àrainnean bacte",
"navigation_bar.edit_profile": "Deasaich a’ phròifil",
+ "navigation_bar.explore": "Explore",
"navigation_bar.favourites": "Na h-annsachdan",
"navigation_bar.filters": "Faclan mùchte",
"navigation_bar.follow_requests": "Iarrtasan leantainn",
@@ -298,6 +309,7 @@
"navigation_bar.preferences": "Roghainnean",
"navigation_bar.public_timeline": "Loidhne-ama cho-naisgte",
"navigation_bar.security": "Tèarainteachd",
+ "notification.admin.sign_up": "Chlàraich {name}",
"notification.favourite": "Is annsa le {name} am post agad",
"notification.follow": "Tha {name} a’ leantainn ort a-nis",
"notification.follow_request": "Dh’iarr {name} leantainn ort",
@@ -306,13 +318,15 @@
"notification.poll": "Thàinig cunntas-bheachd sa bhòt thu gu crìoch",
"notification.reblog": "Bhrosnaich {name} am post agad",
"notification.status": "Tha {name} air rud a phostadh",
+ "notification.update": "Dheasaich {name} post",
"notifications.clear": "Falamhaich na brathan",
"notifications.clear_confirmation": "A bheil thu cinnteach gu bheil thu airson na brathan uile agad fhalamhachadh gu buan?",
+ "notifications.column_settings.admin.sign_up": "Clàraidhean ùra:",
"notifications.column_settings.alert": "Brathan deasga",
"notifications.column_settings.favourite": "Na h-annsachdan:",
"notifications.column_settings.filter_bar.advanced": "Seall a h-uile roinn-seòrsa",
"notifications.column_settings.filter_bar.category": "Bàr-criathraidh luath",
- "notifications.column_settings.filter_bar.show": "Seall",
+ "notifications.column_settings.filter_bar.show_bar": "Seall am bàr-criathraidh",
"notifications.column_settings.follow": "Luchd-leantainn ùr:",
"notifications.column_settings.follow_request": "Iarrtasan leantainn ùra:",
"notifications.column_settings.mention": "Iomraidhean:",
@@ -322,7 +336,9 @@
"notifications.column_settings.show": "Seall sa cholbh",
"notifications.column_settings.sound": "Cluich fuaim",
"notifications.column_settings.status": "Postaichean ùra:",
- "notifications.column_settings.unread_markers.category": "Comharran nach deach brath a leughadh",
+ "notifications.column_settings.unread_notifications.category": "Brathan nach deach a leughadh",
+ "notifications.column_settings.unread_notifications.highlight": "Soillsich na brathan nach deach a leughadh",
+ "notifications.column_settings.update": "Deasachaidhean:",
"notifications.filter.all": "Na h-uile",
"notifications.filter.boosts": "Brosnachaidhean",
"notifications.filter.favourites": "Na h-annsachdan",
@@ -346,7 +362,7 @@
"poll.total_votes": "{count, plural, one {# bhòt} two {# bhòt} few {# bhòtaichean} other {# bhòt}}",
"poll.vote": "Bhòt",
"poll.voted": "Bhòt thu dhan fhreagairt seo",
- "poll.votes": "{votes, plural, one {# vote} other {# votes}}",
+ "poll.votes": "{votes, plural, one {# bhòt} two {# bhòt} few {# bhòtaichean} other {# bhòt}}",
"poll_button.add_poll": "Cuir cunntas-bheachd ris",
"poll_button.remove_poll": "Thoir air falbh an cunntas-bheachd",
"privacy.change": "Cuir gleus air prìobhaideachd a’ phuist",
@@ -362,18 +378,54 @@
"regeneration_indicator.label": "’Ga luchdadh…",
"regeneration_indicator.sublabel": "Tha inbhir na dachaigh agad ’ga ullachadh!",
"relative_time.days": "{number}l",
+ "relative_time.full.days": "{count, plural, one {# latha} two {# latha} few {# làithean} other {# latha}} air ais",
+ "relative_time.full.hours": "{count, plural, one {# uair a thìde} two {# uair a thìde} few {# uairean a thìde} other {# uair a thìde}} air ais",
+ "relative_time.full.just_now": "an-dràsta fhèin",
+ "relative_time.full.minutes": "{count, plural, one {# mhionaid} two {# mhionaid} few {# mionaidean} other {# mionaid}} air ais",
+ "relative_time.full.seconds": "{count, plural, one {# diog} two {# dhiog} few {# diogan} other {# diog}} air ais",
"relative_time.hours": "{number}u",
"relative_time.just_now": "an-dràsta",
"relative_time.minutes": "{number}m",
"relative_time.seconds": "{number}d",
"relative_time.today": "an-diugh",
"reply_indicator.cancel": "Sguir dheth",
+ "report.block": "Bac",
+ "report.block_explanation": "Chan fhaic thu na postaichean aca. Chan fhaic iad na postaichean agad is chan urrainn dhaibh leantainn ort. Mothaichidh iad gun deach am bacadh.",
+ "report.categories.other": "Eile",
+ "report.categories.spam": "Spama",
+ "report.categories.violation": "Tha an t-susbaint a’ briseadh riaghailt no dhà an fhrithealaiche",
+ "report.category.subtitle": "Tagh an roghainn as iomchaidhe",
+ "report.category.title": "Innis dhuinn dè tha a’ dol leis a’ {type}",
+ "report.category.title_account": "phròifil",
+ "report.category.title_status": "phost",
+ "report.close": "Deiseil",
+ "report.comment.title": "A bheil rud sam bith eile a bu toigh leat innse dhuinn?",
"report.forward": "Sìn air adhart gu {target}",
"report.forward_hint": "Chaidh an cunntas a chlàradh air frithealaiche eile. A bheil thu airson lethbhreac dhen ghearan a chur dha-san gun ainm cuideachd?",
- "report.hint": "Thèid do ghearan a chur gu maoir an fhrithealaiche agad. ’S urrainn dhut mìneachadh a sholar air carson a tha thu a’ gearan mun chunntas gu h-ìosal:",
+ "report.mute": "Mùch",
+ "report.mute_explanation": "Chan fhaic thu na postaichean aca. Chì iad na postaichean agad agus ’s urrainn dhaibh leantainn ort fhathast. Cha bhi fios aca gun deach am mùchadh.",
+ "report.next": "Air adhart",
"report.placeholder": "Beachdan a bharrachd",
+ "report.reasons.dislike": "Cha toigh leam e",
+ "report.reasons.dislike_description": "Chan eil thu airson seo fhaicinn",
+ "report.reasons.other": "Adhbhar eile",
+ "report.reasons.other_description": "Chan eil na roinnean-seòrsa eile iomchaidh dhan chùis",
+ "report.reasons.spam": "’S e spama a th’ ann",
+ "report.reasons.spam_description": "Ceanglaichean droch-rùnach, conaltradh fuadain no an dearbh fhreagairt a-rithist ’s a-rithist",
+ "report.reasons.violation": "Tha e a’ briseadh riaghailtean an fhrithealaiche",
+ "report.reasons.violation_description": "Mhothaich thu gu bheil e a’ briseadh riaghailtean sònraichte",
+ "report.rules.subtitle": "Tagh a h-uile gin a tha iomchaidh",
+ "report.rules.title": "Dè na riaghailtean a tha ’gam briseadh?",
+ "report.statuses.subtitle": "Tagh a h-uile gin a tha iomchaidh",
+ "report.statuses.title": "A bheil postaichean sam bith ann a tha ’nam fianais dhan ghearan seo?",
"report.submit": "Cuir a-null",
"report.target": "A’ gearan mu {target}",
+ "report.thanks.take_action": "Seo na roghainnean a th’ agad airson stiùireadh na chì thu air Mastodon:",
+ "report.thanks.take_action_actionable": "Fhad ’s a bhios sinn a’ toirt sùil air, seo nas urrainn dhut dèanamh an aghaidh @{name}:",
+ "report.thanks.title": "Nach eil thu airson seo fhaicinn?",
+ "report.thanks.title_actionable": "Mòran taing airson a’ ghearain, bheir sinn sùil air.",
+ "report.unfollow": "Na lean air @{name} tuilleadh",
+ "report.unfollow_explanation": "Tha thu a’ leantainn air a’ chunntas seo. Sgur de leantainn orra ach nach fhaic thu na puist aca air inbhir na dachaigh agad.",
"search.placeholder": "Lorg",
"search_popout.search_format": "Fòrmat adhartach an luirg",
"search_popout.tips.full_text": "Bheir teacsa sìmplidh dhut na postaichean a sgrìobh thu, a tha nan annsachdan dhut, a bhrosnaich thu no san deach iomradh a thoirt ort cho math ri ainmean-cleachdaiche, ainmean taisbeanaidh agus tagaichean hais a mhaidsicheas.",
@@ -382,7 +434,9 @@
"search_popout.tips.text": "Bheir teacsa sìmplidh dhut na h-ainmean-cleachdaiche, ainmean taisbeanaidh agus tagaichean hais a mhaidsicheas",
"search_popout.tips.user": "cleachdaiche",
"search_results.accounts": "Daoine",
+ "search_results.all": "Na h-uile",
"search_results.hashtags": "Tagaichean hais",
+ "search_results.nothing_found": "Cha do lorg sinn dad dha na h-abairtean-luirg seo",
"search_results.statuses": "Postaichean",
"search_results.statuses_fts_disabled": "Chan eil lorg phostaichean a-rèir an susbaint an comas air an fhrithealaiche Mastodon seo.",
"search_results.total": "{count, number} {count, plural, one {toradh} two {thoradh} few {toraidhean} other {toradh}}",
@@ -396,9 +450,14 @@
"status.delete": "Sguab às",
"status.detailed_status": "Mion-shealladh a’ chòmhraidh",
"status.direct": "Cuir teachdaireachd dhìreach gu @{name}",
+ "status.edit": "Deasaich",
+ "status.edited": "Air a dheasachadh {date}",
+ "status.edited_x_times": "Chaidh a dheasachadh {count, plural, one {{counter} turas} two {{counter} thuras} few {{counter} tursan} other {{counter} turas}}",
"status.embed": "Leabaich",
"status.favourite": "Cuir ris na h-annsachdan",
"status.filtered": "Criathraichte",
+ "status.history.created": "Chruthaich {name} {date} e",
+ "status.history.edited": "Dheasaich {name} {date} e",
"status.load_more": "Luchdaich barrachd dheth",
"status.media_hidden": "Meadhanan falaichte",
"status.mention": "Thoir iomradh air @{name}",
@@ -462,7 +521,7 @@
"upload_form.video_description": "Mìnich e dhan fheadhainn le èisteachd bheag no cion-lèirsinne",
"upload_modal.analyzing_picture": "A’ sgrùdadh an deilbh…",
"upload_modal.apply": "Cuir an sàs",
- "upload_modal.applying": "Applying…",
+ "upload_modal.applying": "’Ga chur an sàs…",
"upload_modal.choose_image": "Tagh dealbh",
"upload_modal.description_placeholder": "Lorg Sìm fiù bò, cè ⁊ neup ’ad àth",
"upload_modal.detect_text": "Mothaich dhan teacsa on dealbh",
diff --git a/app/javascript/mastodon/locales/gl.json b/app/javascript/mastodon/locales/gl.json
index d85fd97bf..56fd5ca7f 100644
--- a/app/javascript/mastodon/locales/gl.json
+++ b/app/javascript/mastodon/locales/gl.json
@@ -18,12 +18,12 @@
"account.followers": "Seguidoras",
"account.followers.empty": "Aínda ninguén segue esta usuaria.",
"account.followers_counter": "{count, plural, one {{counter} Seguidora} other {{counter} Seguidoras}}",
+ "account.following": "Seguindo",
"account.following_counter": "{count, plural, one {{counter} Seguindo} other {{counter} Seguindo}}",
"account.follows.empty": "Esta usuaria aínda non segue a ninguén.",
"account.follows_you": "Séguete",
"account.hide_reblogs": "Agochar repeticións de @{name}",
"account.joined": "Uníuse {date}",
- "account.last_status": "Última actividade",
"account.link_verified_on": "A propiedade desta ligazón foi verificada o {date}",
"account.locked_info": "Esta é unha conta privada. A propietaria revisa de xeito manual quen pode seguila.",
"account.media": "Multimedia",
@@ -32,31 +32,33 @@
"account.mute": "Acalar @{name}",
"account.mute_notifications": "Acalar as notificacións de @{name}",
"account.muted": "Acalada",
- "account.never_active": "Nunca",
"account.posts": "Publicacións",
"account.posts_with_replies": "Publicacións e respostas",
"account.report": "Informar sobre @{name}",
- "account.requested": "Agardando aprovación. Preme para desbotar a solicitude de seguimento",
+ "account.requested": "Agardando aprobación. Preme para desbotar a solicitude",
"account.share": "Compartir o perfil de @{name}",
"account.show_reblogs": "Amosar compartidos de @{name}",
"account.statuses_counter": "{count, plural, one {{counter} Publicación} other {{counter} Publicacións}}",
"account.unblock": "Desbloquear @{name}",
"account.unblock_domain": "Amosar {domain}",
+ "account.unblock_short": "Desbloquear",
"account.unendorse": "Non amosar no perfil",
"account.unfollow": "Deixar de seguir",
"account.unmute": "Deixar de silenciar a @{name}",
"account.unmute_notifications": "Deixar de silenciar as notificacións de @{name}",
+ "account.unmute_short": "Non silenciar",
"account_note.placeholder": "Preme para engadir nota",
- "admin.dashboard.retention": "Retention",
- "admin.dashboard.retention.average": "Average",
- "admin.dashboard.retention.cohort": "Sign-up month",
- "admin.dashboard.retention.cohort_size": "New users",
+ "admin.dashboard.daily_retention": "Ratio de retención de usuarias após rexistrarse",
+ "admin.dashboard.monthly_retention": "Ratio de retención de usuarias após un mes do rexistro",
+ "admin.dashboard.retention.average": "Media",
+ "admin.dashboard.retention.cohort": "Mes de rexistro",
+ "admin.dashboard.retention.cohort_size": "Novas usuarias",
"alert.rate_limited.message": "Téntao novamente após {retry_time, time, medium}.",
"alert.rate_limited.title": "Límite de intentos",
"alert.unexpected.message": "Aconteceu un fallo non agardado.",
"alert.unexpected.title": "Vaites!",
"announcement.announcement": "Anuncio",
- "attachments_list.unprocessed": "(unprocessed)",
+ "attachments_list.unprocessed": "(sen procesar)",
"autosuggest_hashtag.per_week": "{count} por semana",
"boost_modal.combo": "Preme {combo} para ignorar isto na seguinte vez",
"bundle_column_error.body": "Ocorreu un erro ó cargar este compoñente.",
@@ -104,13 +106,14 @@
"compose_form.poll.switch_to_single": "Mudar a enquisa para permitir unha soa escolla",
"compose_form.publish": "Toot",
"compose_form.publish_loud": "{publish}!",
+ "compose_form.save_changes": "Gardar cambios",
"compose_form.sensitive.hide": "{count, plural, one {Marca multimedia como sensible} other {Marca multimedia como sensibles}}",
"compose_form.sensitive.marked": "{count, plural, one {Multimedia marcado como sensible} other {Multimedia marcados como sensibles}}",
"compose_form.sensitive.unmarked": "{count, plural, one {Multimedia non marcado como sensible} other {Multimedia non marcado como sensible}}",
"compose_form.spoiler.marked": "Retirar o aviso sobre o contido",
"compose_form.spoiler.unmarked": "Engadir aviso sobre o contido",
"compose_form.spoiler_placeholder": "Escribe o teu aviso aquí",
- "confirmation_modal.cancel": "Desbotar",
+ "confirmation_modal.cancel": "Cancelar",
"confirmations.block.block_and_report": "Bloquear e denunciar",
"confirmations.block.confirm": "Bloquear",
"confirmations.block.message": "Tes a certeza de querer bloquear a {name}?",
@@ -118,8 +121,8 @@
"confirmations.delete.message": "Tes a certeza de querer eliminar esta publicación?",
"confirmations.delete_list.confirm": "Eliminar",
"confirmations.delete_list.message": "Tes a certeza de querer eliminar de xeito permanente esta listaxe?",
- "confirmations.discard_edit_media.confirm": "Discard",
- "confirmations.discard_edit_media.message": "You have unsaved changes to the media description or preview, discard them anyway?",
+ "confirmations.discard_edit_media.confirm": "Descartar",
+ "confirmations.discard_edit_media.message": "Tes cambios sen gardar para a vista previa ou descrición do multimedia, descartamos os cambios?",
"confirmations.domain_block.confirm": "Agochar dominio enteiro",
"confirmations.domain_block.message": "Tes a certeza de querer bloquear todo de {domain}? Na meirande parte dos casos uns bloqueos ou silenciados específicos son suficientes. Non verás máis o contido deste dominio en ningunha cronoloxía pública ou nas túas notificacións. As túas seguidoras deste dominio serán eliminadas.",
"confirmations.logout.confirm": "Pechar sesión",
@@ -165,6 +168,7 @@
"empty_column.community": "A cronoloxía local está baleira. Escribe algo de xeito público para espallalo!",
"empty_column.direct": "Aínda non tes mensaxes directas. Cando envíes ou recibas unha, amosarase aquí.",
"empty_column.domain_blocks": "Aínda non hai dominios agochados.",
+ "empty_column.explore_statuses": "Non hai temas en voga. Volve máis tarde!",
"empty_column.favourited_statuses": "Aínda non tes publicacións favoritas. Cando che guste algunha, aparecerá aquí.",
"empty_column.favourites": "A ninguén lle gustou esta publicación polo momento. Cando a alguén lle guste, aparecerá aquí.",
"empty_column.follow_recommendations": "Semella que non temos suxestións para ti. Podes utilizar a busca para atopar persoas que coñezas ou explorar os cancelos en voga.",
@@ -183,6 +187,12 @@
"error.unexpected_crash.next_steps_addons": "Intenta desactivalas e actualiza a páxina. Se isto non funciona, podes seguir usando Mastodon nun navegador diferente ou aplicación nativa.",
"errors.unexpected_crash.copy_stacktrace": "Copiar trazas (stacktrace) ó portapapeis",
"errors.unexpected_crash.report_issue": "Informar sobre un problema",
+ "explore.search_results": "Resultados da busca",
+ "explore.suggested_follows": "Para ti",
+ "explore.title": "Descubrir",
+ "explore.trending_links": "Novas",
+ "explore.trending_statuses": "Publicacións",
+ "explore.trending_tags": "Cancelos",
"follow_recommendations.done": "Feito",
"follow_recommendations.heading": "Segue a persoas das que queiras ler publicacións! Aqui tes unhas suxestións.",
"follow_recommendations.lead": "As publicacións das persoas que segues aparecerán na túa cronoloxía de inicio ordenadas temporalmente. Non teñas medo a equivocarte, podes deixar de seguirlas igual de fácil en calquera momento!",
@@ -284,6 +294,7 @@
"navigation_bar.discover": "Descubrir",
"navigation_bar.domain_blocks": "Dominios agochados",
"navigation_bar.edit_profile": "Editar perfil",
+ "navigation_bar.explore": "Descubrir",
"navigation_bar.favourites": "Favoritos",
"navigation_bar.filters": "Palabras silenciadas",
"navigation_bar.follow_requests": "Peticións de seguimento",
@@ -298,6 +309,7 @@
"navigation_bar.preferences": "Preferencias",
"navigation_bar.public_timeline": "Cronoloxía federada",
"navigation_bar.security": "Seguranza",
+ "notification.admin.sign_up": "{name} rexistrouse",
"notification.favourite": "{name} marcou a túa publicación como favorita",
"notification.follow": "{name} comezou a seguirte",
"notification.follow_request": "{name} solicitou seguirte",
@@ -306,13 +318,15 @@
"notification.poll": "Unha enquisa na que votaches rematou",
"notification.reblog": "{name} compartiu a túa publicación",
"notification.status": "{name} publicou",
+ "notification.update": "{name} editou unha publicación",
"notifications.clear": "Limpar notificacións",
"notifications.clear_confirmation": "Tes a certeza de querer limpar de xeito permanente todas as túas notificacións?",
+ "notifications.column_settings.admin.sign_up": "Novas usuarias:",
"notifications.column_settings.alert": "Notificacións de escritorio",
"notifications.column_settings.favourite": "Favoritos:",
"notifications.column_settings.filter_bar.advanced": "Amosar todas as categorías",
"notifications.column_settings.filter_bar.category": "Barra de filtrado rápido",
- "notifications.column_settings.filter_bar.show": "Amosar",
+ "notifications.column_settings.filter_bar.show_bar": "Amosar barra de filtros",
"notifications.column_settings.follow": "Novas seguidoras:",
"notifications.column_settings.follow_request": "Novas peticións de seguimento:",
"notifications.column_settings.mention": "Mencións:",
@@ -322,7 +336,9 @@
"notifications.column_settings.show": "Amosar en columna",
"notifications.column_settings.sound": "Reproducir son",
"notifications.column_settings.status": "Novas publicacións:",
- "notifications.column_settings.unread_markers.category": "Indicadores de notificacións non lidas",
+ "notifications.column_settings.unread_notifications.category": "Notificacións non lidas",
+ "notifications.column_settings.unread_notifications.highlight": "Resaltar notificacións non lidas",
+ "notifications.column_settings.update": "Edicións:",
"notifications.filter.all": "Todo",
"notifications.filter.boosts": "Compartidos",
"notifications.filter.favourites": "Favoritos",
@@ -346,7 +362,7 @@
"poll.total_votes": "{count, plural, one {# voto} other {# votos}}",
"poll.vote": "Votar",
"poll.voted": "Votaches por esta opción",
- "poll.votes": "{votes, plural, one {# vote} other {# votes}}",
+ "poll.votes": "{votes, plural, one {# voto} other {# votos}}",
"poll_button.add_poll": "Engadir unha enquisa",
"poll_button.remove_poll": "Eliminar enquisa",
"privacy.change": "Axustar privacidade",
@@ -362,18 +378,54 @@
"regeneration_indicator.label": "Estase a cargar…",
"regeneration_indicator.sublabel": "Estase a preparar a túa cronoloxía de inicio!",
"relative_time.days": "{number}d",
+ "relative_time.full.days": "fai {number, plural, one {# día} other {# días}}",
+ "relative_time.full.hours": "fai {number, plural, one {# hora} other {# horas}} ago",
+ "relative_time.full.just_now": "xusto agora",
+ "relative_time.full.minutes": "fai {number, plural, one {# minuto} other {# minutos}}",
+ "relative_time.full.seconds": "fai {number, plural, one {# segundo} other {# segundos}}",
"relative_time.hours": "{number}h",
"relative_time.just_now": "agora",
"relative_time.minutes": "{number}m",
"relative_time.seconds": "{number}s",
"relative_time.today": "hoxe",
"reply_indicator.cancel": "Desbotar",
+ "report.block": "Bloquear",
+ "report.block_explanation": "Non vas ver as súas publicacións. Nin verán as túas publicacións nin poderán seguirte. Poderán comprobar que as bloqueaches.",
+ "report.categories.other": "Outro",
+ "report.categories.spam": "Spam",
+ "report.categories.violation": "O contido viola unha ou máis regras do servidor",
+ "report.category.subtitle": "Elixe a mellor coincidencia",
+ "report.category.title": "Dinos o que está a pasar con {type}",
+ "report.category.title_account": "perfil",
+ "report.category.title_status": "publicación",
+ "report.close": "Feito",
+ "report.comment.title": "Hai algo máis que creas debamos saber?",
"report.forward": "Reenviar a {target}",
"report.forward_hint": "A conta é doutro servidor. Enviar unha copia anónima da denuncia aló tamén?",
- "report.hint": "A denuncia enviarase á moderación do teu servidor. Abaixo podes explicar a razón pola que estás a denunciar:",
+ "report.mute": "Acalar",
+ "report.mute_explanation": "Non verás as súas publicacións. Poderán seguirte e ver as túas publicacións e non saberán que as acalaches.",
+ "report.next": "Seguinte",
"report.placeholder": "Comentarios adicionais",
+ "report.reasons.dislike": "Non me gusta",
+ "report.reasons.dislike_description": "Non é algo que queiras ver",
+ "report.reasons.other": "É outra cousa",
+ "report.reasons.other_description": "O asunto non cae dentro de outras categorías",
+ "report.reasons.spam": "É spam",
+ "report.reasons.spam_description": "Ligazóns perigosas, relacións falsas, ou respostas repetitivas",
+ "report.reasons.violation": "Viola as regras do servidor",
+ "report.reasons.violation_description": "Daste conta de que quebra unhas normas en concreto",
+ "report.rules.subtitle": "Elixe todo o que sexa de aplicación",
+ "report.rules.title": "Que regras foron incumpridas?",
+ "report.statuses.subtitle": "Elixe todo o que corresponda",
+ "report.statuses.title": "Hai algunha publicación que apoie esta denuncia?",
"report.submit": "Enviar",
"report.target": "Denunciar a {target}",
+ "report.thanks.take_action": "Aquí tes unhas opcións para controlar o que ves en Mastodon:",
+ "report.thanks.take_action_actionable": "Mentras revisamos esto, podes tomar accións contra @{name}:",
+ "report.thanks.title": "Non queres ver esto?",
+ "report.thanks.title_actionable": "Grazas pola denuncia, investigarémola.",
+ "report.unfollow": "Non seguir a @{name}",
+ "report.unfollow_explanation": "Estás a seguir esta conta. Deixar de ver as súas publicacións na túa cronoloxía, non seguila.",
"search.placeholder": "Procurar",
"search_popout.search_format": "Formato de procura avanzada",
"search_popout.tips.full_text": "Texto simple devolve toots que ti escribiches, promoviches, marcaches favoritos, ou foches mencionada, así como nomes de usuaria coincidentes, nomes públicos e cancelos.",
@@ -382,7 +434,9 @@
"search_popout.tips.text": "Texto simple devolve coincidencias con nomes públicos, nomes de usuaria e cancelos",
"search_popout.tips.user": "usuaria",
"search_results.accounts": "Persoas",
+ "search_results.all": "Todo",
"search_results.hashtags": "Cancelos",
+ "search_results.nothing_found": "Non atopamos nada con estos termos de busca",
"search_results.statuses": "Publicacións",
"search_results.statuses_fts_disabled": "Procurar publicacións polo seu contido non está activado neste servidor do Mastodon.",
"search_results.total": "{count, number} {count, plural, one {resultado} other {resultados}}",
@@ -396,9 +450,14 @@
"status.delete": "Eliminar",
"status.detailed_status": "Vista detallada da conversa",
"status.direct": "Mensaxe directa a @{name}",
+ "status.edit": "Editar",
+ "status.edited": "Editado {date}",
+ "status.edited_x_times": "Editado {count, plural, one {{count} vez} other {{count} veces}}",
"status.embed": "Incrustar",
"status.favourite": "Favorito",
"status.filtered": "Filtrado",
+ "status.history.created": "{name} creado o {date}",
+ "status.history.edited": "{name} editado o {date}",
"status.load_more": "Cargar máis",
"status.media_hidden": "Contido multimedia agochado",
"status.mention": "Mencionar @{name}",
@@ -462,7 +521,7 @@
"upload_form.video_description": "Describir para persoas con problemas visuais ou auditivos",
"upload_modal.analyzing_picture": "Estase a analizar a imaxe…",
"upload_modal.apply": "Aplicar",
- "upload_modal.applying": "Applying…",
+ "upload_modal.applying": "Aplicando…",
"upload_modal.choose_image": "Elixir imaxe",
"upload_modal.description_placeholder": "Un raposo veloz brinca sobre o can preguiceiro",
"upload_modal.detect_text": "Detectar texto na imaxe",
diff --git a/app/javascript/mastodon/locales/he.json b/app/javascript/mastodon/locales/he.json
index 311323d21..db25a33fd 100644
--- a/app/javascript/mastodon/locales/he.json
+++ b/app/javascript/mastodon/locales/he.json
@@ -18,12 +18,12 @@
"account.followers": "עוקבים",
"account.followers.empty": "אף אחד לא עוקב אחר המשתמש הזה עדיין.",
"account.followers_counter": "{count, plural,one {עוקב אחד} other {{counter} עוקבים}}",
+ "account.following": "Following",
"account.following_counter": "{count, plural,one {עוקב אחרי {counter}}other {עוקב אחרי {counter}}}",
"account.follows.empty": "משתמש זה לא עוקב אחר אף אחד עדיין.",
"account.follows_you": "במעקב אחריך",
"account.hide_reblogs": "להסתיר הידהודים מאת @{name}",
"account.joined": "הצטרפו ב{date}",
- "account.last_status": "פעילות אחרונה",
"account.link_verified_on": "בעלות על הקישור הזה נבדקה לאחרונה ב{date}",
"account.locked_info": "מצב הפרטיות של החשבון הנוכחי הוגדר כנעול. בעל החשבון קובע באופן פרטני מי יכול לעקוב אחריו.",
"account.media": "מדיה",
@@ -32,7 +32,6 @@
"account.mute": "להשתיק את @{name}",
"account.mute_notifications": "להסתיר התראות מאת @{name}",
"account.muted": "מושתק",
- "account.never_active": "אף פעם",
"account.posts": "הודעות",
"account.posts_with_replies": "Toots with replies",
"account.report": "לדווח על @{name}",
@@ -42,21 +41,24 @@
"account.statuses_counter": "{count, plural, one {{counter} Toot} other {{counter} Toots}}",
"account.unblock": "הסרת חסימה מעל @{name}",
"account.unblock_domain": "הסר חסימה מקהילת {domain}",
+ "account.unblock_short": "Unblock",
"account.unendorse": "לא להציג בפרופיל",
"account.unfollow": "הפסקת מעקב",
"account.unmute": "הפסקת השתקת @{name}",
"account.unmute_notifications": "להפסיק הסתרת הודעות מעם @{name}",
+ "account.unmute_short": "Unmute",
"account_note.placeholder": "ללא הערה",
- "admin.dashboard.retention": "Retention",
- "admin.dashboard.retention.average": "Average",
+ "admin.dashboard.daily_retention": "User retention rate by day after sign-up",
+ "admin.dashboard.monthly_retention": "User retention rate by month after sign-up",
+ "admin.dashboard.retention.average": "ממוצע",
"admin.dashboard.retention.cohort": "Sign-up month",
- "admin.dashboard.retention.cohort_size": "New users",
+ "admin.dashboard.retention.cohort_size": "משתמשים חדשים",
"alert.rate_limited.message": "נא לנסות אחרי {retry_time, time, medium}.",
"alert.rate_limited.title": "מגבלות מיכסה",
"alert.unexpected.message": "אירעה שגיאה בלתי צפויה.",
"alert.unexpected.title": "אופס!",
"announcement.announcement": "הודעה",
- "attachments_list.unprocessed": "(unprocessed)",
+ "attachments_list.unprocessed": "(לא מעובד)",
"autosuggest_hashtag.per_week": "{count} לשבוע",
"boost_modal.combo": "ניתן להקיש {combo} כדי לדלג בפעם הבאה",
"bundle_column_error.body": "משהו השתבש בעת הצגת הרכיב הזה.",
@@ -104,6 +106,7 @@
"compose_form.poll.switch_to_single": "אפשרו בחירה בודדת בסקר",
"compose_form.publish": "ללחוש",
"compose_form.publish_loud": "לחצרץ!",
+ "compose_form.save_changes": "Save changes",
"compose_form.sensitive.hide": "{count, plural, one {Mark media as sensitive} other {Mark media as sensitive}}",
"compose_form.sensitive.marked": "{count, plural, one {Media is marked as sensitive} other {Media is marked as sensitive}}",
"compose_form.sensitive.unmarked": "{count, plural, one {Media is not marked as sensitive} other {Media is not marked as sensitive}}",
@@ -127,20 +130,20 @@
"confirmations.mute.confirm": "להשתיק",
"confirmations.mute.explanation": "This will hide posts from them and posts mentioning them, but it will still allow them to see your posts and follow you.",
"confirmations.mute.message": "להשתיק את {name}?",
- "confirmations.redraft.confirm": "Delete & redraft",
+ "confirmations.redraft.confirm": "מחק וערוך מחדש",
"confirmations.redraft.message": "Are you sure you want to delete this status and re-draft it? You will lose all replies, boosts and favourites to it.",
- "confirmations.reply.confirm": "Reply",
- "confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?",
+ "confirmations.reply.confirm": "הגב",
+ "confirmations.reply.message": "הגבה עכשיו ידרוס את ההודעה שאתם כותבים כעת. האם אתם בטוחים שברצונכם להמשיך?",
"confirmations.unfollow.confirm": "להפסיק מעקב",
"confirmations.unfollow.message": "להפסיק מעקב אחרי {name}?",
- "conversation.delete": "Delete conversation",
- "conversation.mark_as_read": "Mark as read",
- "conversation.open": "View conversation",
- "conversation.with": "With {names}",
+ "conversation.delete": "מחיקת שיחה",
+ "conversation.mark_as_read": "סמן כנקרא",
+ "conversation.open": "צפו בשיחה",
+ "conversation.with": "עם {names}",
"directory.federated": "From known fediverse",
"directory.local": "From {domain} only",
"directory.new_arrivals": "New arrivals",
- "directory.recently_active": "Recently active",
+ "directory.recently_active": "פעילים לאחרונה",
"embed.instructions": "ניתן להטמיע את ההודעה באתרך ע\"י העתקת הקוד שלהלן.",
"embed.preview": "דוגמא כיצד זה יראה:",
"emoji_button.activity": "פעילות",
@@ -157,14 +160,15 @@
"emoji_button.search_results": "תוצאות חיפוש",
"emoji_button.symbols": "סמלים",
"emoji_button.travel": "טיולים ואתרים",
- "empty_column.account_suspended": "Account suspended",
+ "empty_column.account_suspended": "חשבון מושהה",
"empty_column.account_timeline": "No toots here!",
- "empty_column.account_unavailable": "Profile unavailable",
- "empty_column.blocks": "You haven't blocked any users yet.",
+ "empty_column.account_unavailable": "פרופיל לא זמין",
+ "empty_column.blocks": "עדיין לא חסמתם משתמשים אחרים.",
"empty_column.bookmarked_statuses": "You don't have any bookmarked toots yet. When you bookmark one, it will show up here.",
"empty_column.community": "טור הסביבה ריק. יש לפרסם משהו כדי שדברים יתרחילו להתגלגל!",
- "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.",
+ "empty_column.direct": "עדיין אין לכם הודעות פרטיות. כאשר תשלחו או תקבלו אחת, היא תופיע כאן.",
"empty_column.domain_blocks": "There are no hidden domains yet.",
+ "empty_column.explore_statuses": "Nothing is trending right now. Check back later!",
"empty_column.favourited_statuses": "You don't have any favourite toots yet. When you favourite one, it will show up here.",
"empty_column.favourites": "No one has favourited this toot yet. When someone does, they will show up here.",
"empty_column.follow_recommendations": "Looks like no suggestions could be generated for you. You can try using search to look for people you might know or explore trending hashtags.",
@@ -183,6 +187,12 @@
"error.unexpected_crash.next_steps_addons": "Try disabling them and refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
"errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard",
"errors.unexpected_crash.report_issue": "Report issue",
+ "explore.search_results": "Search results",
+ "explore.suggested_follows": "For you",
+ "explore.title": "Explore",
+ "explore.trending_links": "News",
+ "explore.trending_statuses": "Posts",
+ "explore.trending_tags": "Hashtags",
"follow_recommendations.done": "Done",
"follow_recommendations.heading": "Follow people you'd like to see posts from! Here are some suggestions.",
"follow_recommendations.lead": "Posts from people you follow will show up in chronological order on your home feed. Don't be afraid to make mistakes, you can unfollow people just as easily any time!",
@@ -220,7 +230,7 @@
"keyboard_shortcuts.boost": "להדהד",
"keyboard_shortcuts.column": "להתמקד בהודעה באחד מהטורים",
"keyboard_shortcuts.compose": "להתמקד בתיבת חיבור ההודעות",
- "keyboard_shortcuts.description": "Description",
+ "keyboard_shortcuts.description": "תיאור",
"keyboard_shortcuts.direct": "to open direct messages column",
"keyboard_shortcuts.down": "לנוע במורד הרשימה",
"keyboard_shortcuts.enter": "to open status",
@@ -254,36 +264,37 @@
"lightbox.expand": "Expand image view box",
"lightbox.next": "הלאה",
"lightbox.previous": "הקודם",
- "lists.account.add": "Add to list",
- "lists.account.remove": "Remove from list",
+ "lists.account.add": "הוסף לרשימה",
+ "lists.account.remove": "הסר מרשימה",
"lists.delete": "Delete list",
"lists.edit": "Edit list",
"lists.edit.submit": "Change title",
- "lists.new.create": "Add list",
- "lists.new.title_placeholder": "New list title",
- "lists.replies_policy.followed": "Any followed user",
- "lists.replies_policy.list": "Members of the list",
- "lists.replies_policy.none": "No one",
- "lists.replies_policy.title": "Show replies to:",
- "lists.search": "Search among people you follow",
- "lists.subheading": "Your lists",
+ "lists.new.create": "הוספת רשימה",
+ "lists.new.title_placeholder": "כותרת הרשימה החדשה",
+ "lists.replies_policy.followed": "משתמשים שאני עוקב אחריהם",
+ "lists.replies_policy.list": "משתמשים שברשימה",
+ "lists.replies_policy.none": "אף אחד",
+ "lists.replies_policy.title": "הצג תגובות ל:",
+ "lists.search": "חיפוש בין אנשים שאני עוקב\\ת אחריהם",
+ "lists.subheading": "הרשימות שלך",
"load_pending": "{count, plural, one {# new item} other {# new items}}",
"loading_indicator.label": "טוען...",
"media_gallery.toggle_visible": "נראה\\בלתי נראה",
"missing_indicator.label": "לא נמצא",
- "missing_indicator.sublabel": "This resource could not be found",
- "mute_modal.duration": "Duration",
+ "missing_indicator.sublabel": "לא ניתן היה למצוא את המשאב",
+ "mute_modal.duration": "משך הזמן",
"mute_modal.hide_notifications": "להסתיר הודעות מחשבון זה?",
- "mute_modal.indefinite": "Indefinite",
+ "mute_modal.indefinite": "ללא תאריך סיום",
"navigation_bar.apps": "Mobile apps",
"navigation_bar.blocks": "חסימות",
"navigation_bar.bookmarks": "Bookmarks",
"navigation_bar.community_timeline": "ציר זמן מקומי",
"navigation_bar.compose": "Compose new toot",
- "navigation_bar.direct": "Direct messages",
+ "navigation_bar.direct": "הודעות ישירות",
"navigation_bar.discover": "Discover",
"navigation_bar.domain_blocks": "Hidden domains",
"navigation_bar.edit_profile": "עריכת פרופיל",
+ "navigation_bar.explore": "Explore",
"navigation_bar.favourites": "חיבובים",
"navigation_bar.filters": "Muted words",
"navigation_bar.follow_requests": "בקשות מעקב",
@@ -298,6 +309,7 @@
"navigation_bar.preferences": "העדפות",
"navigation_bar.public_timeline": "ציר זמן בין-קהילתי",
"navigation_bar.security": "Security",
+ "notification.admin.sign_up": "{name} signed up",
"notification.favourite": "חצרוצך חובב על ידי {name}",
"notification.follow": "{name} במעקב אחרייך",
"notification.follow_request": "{name} has requested to follow you",
@@ -306,13 +318,15 @@
"notification.poll": "A poll you have voted in has ended",
"notification.reblog": "חצרוצך הודהד על ידי {name}",
"notification.status": "{name} just posted",
+ "notification.update": "{name} ערכו פוסט",
"notifications.clear": "הסרת התראות",
"notifications.clear_confirmation": "להסיר את כל ההתראות? בטוח?",
+ "notifications.column_settings.admin.sign_up": "New sign-ups:",
"notifications.column_settings.alert": "התראות לשולחן העבודה",
"notifications.column_settings.favourite": "מחובבים:",
"notifications.column_settings.filter_bar.advanced": "Display all categories",
"notifications.column_settings.filter_bar.category": "Quick filter bar",
- "notifications.column_settings.filter_bar.show": "Show",
+ "notifications.column_settings.filter_bar.show_bar": "Show filter bar",
"notifications.column_settings.follow": "עוקבים חדשים:",
"notifications.column_settings.follow_request": "New follow requests:",
"notifications.column_settings.mention": "פניות:",
@@ -322,7 +336,9 @@
"notifications.column_settings.show": "הצגה בטור",
"notifications.column_settings.sound": "שמע מופעל",
"notifications.column_settings.status": "New toots:",
- "notifications.column_settings.unread_markers.category": "Unread notification markers",
+ "notifications.column_settings.unread_notifications.category": "Unread notifications",
+ "notifications.column_settings.unread_notifications.highlight": "Highlight unread notifications",
+ "notifications.column_settings.update": "שינויים:",
"notifications.filter.all": "All",
"notifications.filter.boosts": "Boosts",
"notifications.filter.favourites": "Favourites",
@@ -362,18 +378,54 @@
"regeneration_indicator.label": "Loading…",
"regeneration_indicator.sublabel": "Your home feed is being prepared!",
"relative_time.days": "{number}d",
+ "relative_time.full.days": "{number, plural, one {# day} other {# days}} ago",
+ "relative_time.full.hours": "{number, plural, one {# hour} other {# hours}} ago",
+ "relative_time.full.just_now": "just now",
+ "relative_time.full.minutes": "{number, plural, one {# minute} other {# minutes}} ago",
+ "relative_time.full.seconds": "{number, plural, one {# second} other {# seconds}} ago",
"relative_time.hours": "{number}h",
"relative_time.just_now": "כרגע",
"relative_time.minutes": "{number}m",
"relative_time.seconds": "{number}s",
"relative_time.today": "today",
"reply_indicator.cancel": "ביטול",
+ "report.block": "Block",
+ "report.block_explanation": "You will not see their posts. They will not be able to see your posts or follow you. They will be able to tell that they are blocked.",
+ "report.categories.other": "Other",
+ "report.categories.spam": "Spam",
+ "report.categories.violation": "Content violates one or more server rules",
+ "report.category.subtitle": "Choose the best match",
+ "report.category.title": "Tell us what's going on with this {type}",
+ "report.category.title_account": "profile",
+ "report.category.title_status": "post",
+ "report.close": "Done",
+ "report.comment.title": "Is there anything else you think we should know?",
"report.forward": "Forward to {target}",
"report.forward_hint": "The account is from another server. Send an anonymized copy of the report there as well?",
- "report.hint": "The report will be sent to your instance moderators. You can provide an explanation of why you are reporting this account below:",
+ "report.mute": "Mute",
+ "report.mute_explanation": "You will not see their posts. They can still follow you and see your posts and will not know that they are muted.",
+ "report.next": "Next",
"report.placeholder": "הערות נוספות",
+ "report.reasons.dislike": "I don't like it",
+ "report.reasons.dislike_description": "It is not something you want to see",
+ "report.reasons.other": "It's something else",
+ "report.reasons.other_description": "The issue does not fit into other categories",
+ "report.reasons.spam": "It's spam",
+ "report.reasons.spam_description": "Malicious links, fake engagement, or repetitive replies",
+ "report.reasons.violation": "It violates server rules",
+ "report.reasons.violation_description": "You are aware that it breaks specific rules",
+ "report.rules.subtitle": "Select all that apply",
+ "report.rules.title": "Which rules are being violated?",
+ "report.statuses.subtitle": "Select all that apply",
+ "report.statuses.title": "Are there any posts that back up this report?",
"report.submit": "שליחה",
"report.target": "דיווח",
+ "report.thanks.take_action": "Here are your options for controlling what you see on Mastodon:",
+ "report.thanks.take_action_actionable": "While we review this, you can take action against @{name}:",
+ "report.thanks.title": "Don't want to see this?",
+ "report.thanks.title_actionable": "Thanks for reporting, we'll look into this.",
+ "report.unfollow": "Unfollow @{name}",
+ "report.unfollow_explanation": "You are following this account. To not see their posts in your home feed anymore, unfollow them.",
"search.placeholder": "חיפוש",
"search_popout.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.",
@@ -382,7 +434,9 @@
"search_popout.tips.text": "טקסט פשוט מחזיר כינויים, שמות משתמש והאשתגים",
"search_popout.tips.user": "משתמש(ת)",
"search_results.accounts": "People",
+ "search_results.all": "All",
"search_results.hashtags": "Hashtags",
+ "search_results.nothing_found": "Could not find anything for these search terms",
"search_results.statuses": "Toots",
"search_results.statuses_fts_disabled": "Searching toots by their content is not enabled on this Mastodon server.",
"search_results.total": "{count, number} {count, plural, one {תוצאה} other {תוצאות}}",
@@ -395,10 +449,15 @@
"status.copy": "Copy link to status",
"status.delete": "מחיקה",
"status.detailed_status": "Detailed conversation view",
- "status.direct": "Direct message @{name}",
+ "status.direct": "הודעה ישירה ל@{name}",
+ "status.edit": "Edit",
+ "status.edited": "Edited {date}",
+ "status.edited_x_times": "Edited {count, plural, one {{count} time} other {{count} times}}",
"status.embed": "הטמעה",
"status.favourite": "חיבוב",
"status.filtered": "Filtered",
+ "status.history.created": "{name} created {date}",
+ "status.history.edited": "{name} edited {date}",
"status.load_more": "עוד",
"status.media_hidden": "מדיה מוסתרת",
"status.mention": "פניה אל @{name}",
diff --git a/app/javascript/mastodon/locales/hi.json b/app/javascript/mastodon/locales/hi.json
index 0bcf2a68b..8a464f7ec 100644
--- a/app/javascript/mastodon/locales/hi.json
+++ b/app/javascript/mastodon/locales/hi.json
@@ -18,12 +18,12 @@
"account.followers": "फॉलोवर",
"account.followers.empty": "कोई भी इस यूज़र् को फ़ॉलो नहीं करता है",
"account.followers_counter": "{count, plural, one {{counter} अनुगामी} other {{counter} समर्थक}}",
+ "account.following": "Following",
"account.following_counter": "{count, plural, one {{counter} निम्नलिखित} other {{counter} निम्नलिखित}}",
"account.follows.empty": "यह यूज़र् अभी तक किसी को फॉलो नहीं करता है।",
"account.follows_you": "आपको फॉलो करता है",
"account.hide_reblogs": "@{name} के बूस्ट छुपाएं",
"account.joined": "Joined {date}",
- "account.last_status": "अंतिम सक्रिय",
"account.link_verified_on": "इस लिंक का स्वामित्व {date} को चेक किया गया था",
"account.locked_info": "यह खाता गोपनीयता स्थिति लॉक करने के लिए सेट है। मालिक मैन्युअल रूप से समीक्षा करता है कि कौन उनको फॉलो कर सकता है।",
"account.media": "मीडिया",
@@ -32,7 +32,6 @@
"account.mute": "म्यूट @{name}",
"account.mute_notifications": "@{name} के नोटिफिकेशन म्यूट करे",
"account.muted": "म्यूट है",
- "account.never_active": "कभी नहीं दिखे",
"account.posts": "टूट्स",
"account.posts_with_replies": "टूट्स एवं जवाब",
"account.report": "रिपोर्ट @{name}",
@@ -42,12 +41,15 @@
"account.statuses_counter": "{count, plural, one {{counter} भोंपू} other {{counter} भोंपू}}",
"account.unblock": "@{name} को अनब्लॉक करें",
"account.unblock_domain": "{domain} दिखाए",
+ "account.unblock_short": "Unblock",
"account.unendorse": "प्रोफ़ाइल पर न दिखाए",
"account.unfollow": "अनफॉलो करें",
"account.unmute": "अनम्यूट @{name}",
"account.unmute_notifications": "@{name} के नोटिफिकेशन अनम्यूट करे",
+ "account.unmute_short": "Unmute",
"account_note.placeholder": "नोट्स जोड़ने के लिए क्लिक करें",
- "admin.dashboard.retention": "Retention",
+ "admin.dashboard.daily_retention": "User retention rate by day after sign-up",
+ "admin.dashboard.monthly_retention": "User retention rate by month after sign-up",
"admin.dashboard.retention.average": "Average",
"admin.dashboard.retention.cohort": "Sign-up month",
"admin.dashboard.retention.cohort_size": "New users",
@@ -104,6 +106,7 @@
"compose_form.poll.switch_to_single": "एक ही विकल्प के लिए अनुमति देने के लिए पोल बदलें",
"compose_form.publish": "टूट्",
"compose_form.publish_loud": "{publish}!",
+ "compose_form.save_changes": "Save changes",
"compose_form.sensitive.hide": "मीडिया को संवेदनशील के रूप में चिह्नित करें",
"compose_form.sensitive.marked": "मीडिया संवेदनशील के रूप में चिह्नित है",
"compose_form.sensitive.unmarked": "मीडिया संवेदनशील के रूप में चिह्नित नहीं है",
@@ -165,6 +168,7 @@
"empty_column.community": "लोकल टाइम्लाइन खाली है, कुछ देखने के लिये सार्वजनिक रूप से कुछ लिखें!",
"empty_column.direct": "आपके पास कोई सीधा सन्देश नहीं है, जब आप कोई भेजेंगे प्राप्त करेंगे तो यहाँ दिखेगा।",
"empty_column.domain_blocks": "अभी तक कोई छुपा हुआ डोमेन नहीं है।",
+ "empty_column.explore_statuses": "Nothing is trending right now. Check back later!",
"empty_column.favourited_statuses": "आपके पास अभी कोई भी चहिता टूट नहीं है. जब आप किसी टूट को पसंद (स्टार) करेंगे, तब वो यहाँ दिखेगा।",
"empty_column.favourites": "अभी तक किसी ने भी इस टूट को पसंद (स्टार) नहीं किया है. जब भी कोई इसे पसंद करेगा, उनका नाम यहाँ दिखेगा।",
"empty_column.follow_recommendations": "Looks like no suggestions could be generated for you. You can try using search to look for people you might know or explore trending hashtags.",
@@ -183,6 +187,12 @@
"error.unexpected_crash.next_steps_addons": "Try disabling them and refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
"errors.unexpected_crash.copy_stacktrace": "स्टैकट्रेस को क्लिपबोर्ड पर कॉपी करें",
"errors.unexpected_crash.report_issue": "समस्या सूचित करें",
+ "explore.search_results": "Search results",
+ "explore.suggested_follows": "For you",
+ "explore.title": "Explore",
+ "explore.trending_links": "News",
+ "explore.trending_statuses": "Posts",
+ "explore.trending_tags": "Hashtags",
"follow_recommendations.done": "Done",
"follow_recommendations.heading": "Follow people you'd like to see posts from! Here are some suggestions.",
"follow_recommendations.lead": "Posts from people you follow will show up in chronological order on your home feed. Don't be afraid to make mistakes, you can unfollow people just as easily any time!",
@@ -284,6 +294,7 @@
"navigation_bar.discover": "खोजें",
"navigation_bar.domain_blocks": "Hidden domains",
"navigation_bar.edit_profile": "प्रोफ़ाइल संपादित करें",
+ "navigation_bar.explore": "Explore",
"navigation_bar.favourites": "Favourites",
"navigation_bar.filters": "Muted words",
"navigation_bar.follow_requests": "अनुसरण करने के अनुरोध",
@@ -298,6 +309,7 @@
"navigation_bar.preferences": "Preferences",
"navigation_bar.public_timeline": "Federated timeline",
"navigation_bar.security": "Security",
+ "notification.admin.sign_up": "{name} signed up",
"notification.favourite": "{name} favourited your status",
"notification.follow": "{name} followed you",
"notification.follow_request": "{name} has requested to follow you",
@@ -306,13 +318,15 @@
"notification.poll": "A poll you have voted in has ended",
"notification.reblog": "{name} boosted your status",
"notification.status": "{name} just posted",
+ "notification.update": "{name} edited a post",
"notifications.clear": "Clear notifications",
"notifications.clear_confirmation": "Are you sure you want to permanently clear all your notifications?",
+ "notifications.column_settings.admin.sign_up": "New sign-ups:",
"notifications.column_settings.alert": "Desktop notifications",
"notifications.column_settings.favourite": "Favourites:",
"notifications.column_settings.filter_bar.advanced": "सभी श्रेणियाँ दिखाएं",
"notifications.column_settings.filter_bar.category": "फ़िल्टर बार",
- "notifications.column_settings.filter_bar.show": "दिखाएँ",
+ "notifications.column_settings.filter_bar.show_bar": "Show filter bar",
"notifications.column_settings.follow": "नए फ़ॉलोअर्स",
"notifications.column_settings.follow_request": "New follow requests:",
"notifications.column_settings.mention": "उल्लेख:",
@@ -322,7 +336,9 @@
"notifications.column_settings.show": "कॉलम में दिखाएँ",
"notifications.column_settings.sound": "ध्वनि चलाएँ",
"notifications.column_settings.status": "New toots:",
- "notifications.column_settings.unread_markers.category": "Unread notification markers",
+ "notifications.column_settings.unread_notifications.category": "Unread notifications",
+ "notifications.column_settings.unread_notifications.highlight": "Highlight unread notifications",
+ "notifications.column_settings.update": "Edits:",
"notifications.filter.all": "सभी",
"notifications.filter.boosts": "बूस्ट",
"notifications.filter.favourites": "पसंदीदा",
@@ -362,18 +378,54 @@
"regeneration_indicator.label": "लोड हो रहा है...",
"regeneration_indicator.sublabel": "Your home feed is being prepared!",
"relative_time.days": "{number}d",
+ "relative_time.full.days": "{number, plural, one {# day} other {# days}} ago",
+ "relative_time.full.hours": "{number, plural, one {# hour} other {# hours}} ago",
+ "relative_time.full.just_now": "just now",
+ "relative_time.full.minutes": "{number, plural, one {# minute} other {# minutes}} ago",
+ "relative_time.full.seconds": "{number, plural, one {# second} other {# seconds}} ago",
"relative_time.hours": "{number}h",
"relative_time.just_now": "अभी",
"relative_time.minutes": "{number}m",
"relative_time.seconds": "{number}s",
"relative_time.today": "today",
"reply_indicator.cancel": "रद्द करें",
+ "report.block": "Block",
+ "report.block_explanation": "You will not see their posts. They will not be able to see your posts or follow you. They will be able to tell that they are blocked.",
+ "report.categories.other": "Other",
+ "report.categories.spam": "Spam",
+ "report.categories.violation": "Content violates one or more server rules",
+ "report.category.subtitle": "Choose the best match",
+ "report.category.title": "Tell us what's going on with this {type}",
+ "report.category.title_account": "profile",
+ "report.category.title_status": "post",
+ "report.close": "Done",
+ "report.comment.title": "Is there anything else you think we should know?",
"report.forward": "Forward to {target}",
"report.forward_hint": "The account is from another server. Send an anonymized copy of the report there as well?",
- "report.hint": "The report will be sent to your server moderators. You can provide an explanation of why you are reporting this account below:",
- "report.placeholder": "Additional comments",
+ "report.mute": "Mute",
+ "report.mute_explanation": "You will not see their posts. They can still follow you and see your posts and will not know that they are muted.",
+ "report.next": "Next",
+ "report.placeholder": "Type or paste additional comments",
+ "report.reasons.dislike": "I don't like it",
+ "report.reasons.dislike_description": "It is not something you want to see",
+ "report.reasons.other": "It's something else",
+ "report.reasons.other_description": "The issue does not fit into other categories",
+ "report.reasons.spam": "It's spam",
+ "report.reasons.spam_description": "Malicious links, fake engagement, or repetitive replies",
+ "report.reasons.violation": "It violates server rules",
+ "report.reasons.violation_description": "You are aware that it breaks specific rules",
+ "report.rules.subtitle": "Select all that apply",
+ "report.rules.title": "Which rules are being violated?",
+ "report.statuses.subtitle": "Select all that apply",
+ "report.statuses.title": "Are there any posts that back up this report?",
"report.submit": "सबमिट करें",
"report.target": "Report {target}",
+ "report.thanks.take_action": "Here are your options for controlling what you see on Mastodon:",
+ "report.thanks.take_action_actionable": "While we review this, you can take action against @{name}:",
+ "report.thanks.title": "Don't want to see this?",
+ "report.thanks.title_actionable": "Thanks for reporting, we'll look into this.",
+ "report.unfollow": "Unfollow @{name}",
+ "report.unfollow_explanation": "You are following this account. To not see their posts in your home feed anymore, unfollow them.",
"search.placeholder": "खोजें",
"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.",
@@ -382,7 +434,9 @@
"search_popout.tips.text": "Simple text returns matching display names, usernames and hashtags",
"search_popout.tips.user": "user",
"search_results.accounts": "People",
+ "search_results.all": "All",
"search_results.hashtags": "Hashtags",
+ "search_results.nothing_found": "Could not find anything for these search terms",
"search_results.statuses": "Toots",
"search_results.statuses_fts_disabled": "Searching toots by their content is not enabled on this Mastodon server.",
"search_results.total": "{count, number} {count, plural, one {result} other {results}}",
@@ -396,9 +450,14 @@
"status.delete": "Delete",
"status.detailed_status": "Detailed conversation view",
"status.direct": "Direct message @{name}",
+ "status.edit": "Edit",
+ "status.edited": "Edited {date}",
+ "status.edited_x_times": "Edited {count, plural, one {{count} time} other {{count} times}}",
"status.embed": "Embed",
"status.favourite": "Favourite",
"status.filtered": "Filtered",
+ "status.history.created": "{name} created {date}",
+ "status.history.edited": "{name} edited {date}",
"status.load_more": "Load more",
"status.media_hidden": "Media hidden",
"status.mention": "Mention @{name}",
diff --git a/app/javascript/mastodon/locales/hr.json b/app/javascript/mastodon/locales/hr.json
index d11c73860..bbe62cf38 100644
--- a/app/javascript/mastodon/locales/hr.json
+++ b/app/javascript/mastodon/locales/hr.json
@@ -18,12 +18,12 @@
"account.followers": "Pratitelji",
"account.followers.empty": "Nitko još ne prati korisnika/cu.",
"account.followers_counter": "{count, plural, one {{counter} pratitelj} other {{counter} pratitelja}}",
+ "account.following": "Following",
"account.following_counter": "{count, plural, one {{counter} praćeni} few{{counter} praćena} other {{counter} praćenih}}",
"account.follows.empty": "Korisnik/ca još ne prati nikoga.",
"account.follows_you": "Prati te",
"account.hide_reblogs": "Sakrij boostove od @{name}",
- "account.joined": "Joined {date}",
- "account.last_status": "Posljednja aktivnost",
+ "account.joined": "Pridružio se {date}",
"account.link_verified_on": "Vlasništvo ove poveznice provjereno je {date}",
"account.locked_info": "Status privatnosti ovog računa postavljen je na zaključano. Vlasnik ručno pregledava tko ih može pratiti.",
"account.media": "Medijski sadržaj",
@@ -32,7 +32,6 @@
"account.mute": "Utišaj @{name}",
"account.mute_notifications": "Utišaj obavijesti od @{name}",
"account.muted": "Utišano",
- "account.never_active": "Nikad",
"account.posts": "Tootovi",
"account.posts_with_replies": "Tootovi i odgovori",
"account.report": "Prijavi @{name}",
@@ -42,21 +41,24 @@
"account.statuses_counter": "{count, plural, one {{counter} toot} other {{counter} toota}}",
"account.unblock": "Deblokiraj @{name}",
"account.unblock_domain": "Deblokiraj domenu {domain}",
+ "account.unblock_short": "Unblock",
"account.unendorse": "Ne ističi na profilu",
"account.unfollow": "Prestani pratiti",
"account.unmute": "Poništi utišavanje @{name}",
"account.unmute_notifications": "Ne utišavaj obavijesti od @{name}",
+ "account.unmute_short": "Unmute",
"account_note.placeholder": "Kliknite za dodavanje bilješke",
- "admin.dashboard.retention": "Retention",
- "admin.dashboard.retention.average": "Average",
- "admin.dashboard.retention.cohort": "Sign-up month",
- "admin.dashboard.retention.cohort_size": "New users",
+ "admin.dashboard.daily_retention": "User retention rate by day after sign-up",
+ "admin.dashboard.monthly_retention": "User retention rate by month after sign-up",
+ "admin.dashboard.retention.average": "Prosječno",
+ "admin.dashboard.retention.cohort": "Mjesec prijave",
+ "admin.dashboard.retention.cohort_size": "Novi korisnici",
"alert.rate_limited.message": "Molimo pokušajte nakon {retry_time, time, medium}.",
"alert.rate_limited.title": "Ograničenje učestalosti",
"alert.unexpected.message": "Dogodila se neočekivana greška.",
"alert.unexpected.title": "Ups!",
"announcement.announcement": "Najava",
- "attachments_list.unprocessed": "(unprocessed)",
+ "attachments_list.unprocessed": "(neobrađeno)",
"autosuggest_hashtag.per_week": "{count} tjedno",
"boost_modal.combo": "Možete pritisnuti {combo} kako biste preskočili ovo sljedeći put",
"bundle_column_error.body": "Nešto je pošlo po zlu tijekom učitavanja ove komponente.",
@@ -104,6 +106,7 @@
"compose_form.poll.switch_to_single": "Omogući odabir samo jedne opcije ankete",
"compose_form.publish": "Tootni",
"compose_form.publish_loud": "{publish}!",
+ "compose_form.save_changes": "Save changes",
"compose_form.sensitive.hide": "Označi medijski sadržaj kao osjetljiv",
"compose_form.sensitive.marked": "Medijski sadržaj označen je kao osjetljiv",
"compose_form.sensitive.unmarked": "Medijski sadržaj nije označen kao osjetljiv",
@@ -118,8 +121,8 @@
"confirmations.delete.message": "Stvarno želite obrisati ovaj toot?",
"confirmations.delete_list.confirm": "Obriši",
"confirmations.delete_list.message": "Jeste li sigurni da želite trajno obrisati ovu listu?",
- "confirmations.discard_edit_media.confirm": "Discard",
- "confirmations.discard_edit_media.message": "You have unsaved changes to the media description or preview, discard them anyway?",
+ "confirmations.discard_edit_media.confirm": "Odbaciti",
+ "confirmations.discard_edit_media.message": "Niste spremili promjene u opisu medija ili u predpregledu, svejedno ih odbaciti?",
"confirmations.domain_block.confirm": "Blokiraj cijelu domenu",
"confirmations.domain_block.message": "Jeste li zaista, zaista sigurni da želite blokirati cijelu domenu {domain}? U većini slučajeva dovoljno je i preferirano nekoliko ciljanih blokiranja ili utišavanja. Nećete vidjeti sadržaj s te domene ni u kojim javnim vremenskim crtama ili Vašim obavijestima. Vaši pratitelji s te domene bit će uklonjeni.",
"confirmations.logout.confirm": "Odjavi se",
@@ -163,28 +166,35 @@
"empty_column.blocks": "Još niste blokirali nikoga.",
"empty_column.bookmarked_statuses": "Još nemaš niti jedan označeni toot. Kada označiš jedan, prikazad će se ovdje.",
"empty_column.community": "Lokalna vremenska crta je prazna. Napišite nešto javno da biste pokrenuli stvari!",
- "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.",
+ "empty_column.direct": "Nemate još niti jedne direktne poruke. Kada ih pošaljete ili primite, prikazati će se ovdje.",
"empty_column.domain_blocks": "Još nema blokiranih domena.",
+ "empty_column.explore_statuses": "Nothing is trending right now. Check back later!",
"empty_column.favourited_statuses": "You don't have any favourite toots yet. When you favourite one, it will show up here.",
"empty_column.favourites": "No one has favourited this toot yet. When someone does, they will show up here.",
- "empty_column.follow_recommendations": "Looks like no suggestions could be generated for you. You can try using search to look for people you might know or explore trending hashtags.",
- "empty_column.follow_requests": "You don't have any follow requests yet. When you receive one, it will show up here.",
+ "empty_column.follow_recommendations": "Čini se da se ne postoje sugestije generirane za tebe. Možeš pokušati koristiti pretragu kako bi pronašao osobe koje poznaš ili istraži popularne hashtagove.",
+ "empty_column.follow_requests": "Nemaš niti jedan zahtjev za praćenjem. Ako ga dobiješ, prikazat će se ovdje.",
"empty_column.hashtag": "Još ne postoji ništa s ovim hashtagom.",
"empty_column.home": "Vaša početna vremenska crta je prazna! Posjetite {public} ili koristite tražilicu kako biste započeli i upoznali druge korisnike.",
- "empty_column.home.suggestions": "See some suggestions",
+ "empty_column.home.suggestions": "Pogledajte neke prijedloge",
"empty_column.list": "Na ovoj listi još nema ničega. Kada članovi ove liste objave nove tootove, oni će se pojaviti ovdje.",
- "empty_column.lists": "You don't have any lists yet. When you create one, it will show up here.",
+ "empty_column.lists": "Nemaš niti jednu listu. Kada je kreiraš, prikazat će se ovdje.",
"empty_column.mutes": "Niste utišali nijednog korisnika.",
"empty_column.notifications": "Još nemate obavijesti. Komunicirajte s drugima kako biste započeli razgovor.",
"empty_column.public": "Ovdje nema ništa! Napišite nešto javno ili ručno pratite korisnike s drugi poslužitelja da biste ovo popunili",
- "error.unexpected_crash.explanation": "Due to a bug in our code or a browser compatibility issue, this page could not be displayed correctly.",
- "error.unexpected_crash.explanation_addons": "This page could not be displayed correctly. This error is likely caused by a browser add-on or automatic translation tools.",
- "error.unexpected_crash.next_steps": "Try refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
- "error.unexpected_crash.next_steps_addons": "Try disabling them and refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
- "errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard",
+ "error.unexpected_crash.explanation": "Zbog bug-a u našem kodu ili zbog nekompatibilnosti pretraživača, ova stranica se ne može prikazati ispravno.",
+ "error.unexpected_crash.explanation_addons": "Ova stranica ne može biti ispravno prikazana. Ova greška je uzrokovana dodatkom za browser ili alatom za automatsko prevođenje.",
+ "error.unexpected_crash.next_steps": "Pokušaj osvježiti stranicu. Ako to ne pomogne, i dalje ćeš biti u mogućnosti koristiti Mastodon preko nekod drugog preglednika ili izvornog app-a.",
+ "error.unexpected_crash.next_steps_addons": "Pokušaj ih onemogućiti i osvježiti stranicu. Ako to ne pomogne, i dalje ćeš biti u mogućnosti koristiti Mastodon preko nekog drugog preglednika ili izvornog app-a.",
+ "errors.unexpected_crash.copy_stacktrace": "Kopiraj stacktrace u međuspremnik",
"errors.unexpected_crash.report_issue": "Prijavi problem",
- "follow_recommendations.done": "Done",
- "follow_recommendations.heading": "Follow people you'd like to see posts from! Here are some suggestions.",
+ "explore.search_results": "Search results",
+ "explore.suggested_follows": "For you",
+ "explore.title": "Explore",
+ "explore.trending_links": "News",
+ "explore.trending_statuses": "Posts",
+ "explore.trending_tags": "Hashtags",
+ "follow_recommendations.done": "Učinjeno",
+ "follow_recommendations.heading": "Zaprati osobe čije objave želiš vidjeti! Evo nekoliko prijedloga.",
"follow_recommendations.lead": "Posts from people you follow will show up in chronological order on your home feed. Don't be afraid to make mistakes, you can unfollow people just as easily any time!",
"follow_request.authorize": "Autoriziraj",
"follow_request.reject": "Odbij",
@@ -284,6 +294,7 @@
"navigation_bar.discover": "Istraživanje",
"navigation_bar.domain_blocks": "Blokirane domene",
"navigation_bar.edit_profile": "Uredi profil",
+ "navigation_bar.explore": "Explore",
"navigation_bar.favourites": "Favoriti",
"navigation_bar.filters": "Utišane riječi",
"navigation_bar.follow_requests": "Zahtjevi za praćenje",
@@ -298,6 +309,7 @@
"navigation_bar.preferences": "Postavke",
"navigation_bar.public_timeline": "Federalna vremenska crta",
"navigation_bar.security": "Sigurnost",
+ "notification.admin.sign_up": "{name} signed up",
"notification.favourite": "{name} je favorizirao/la Vaš toot",
"notification.follow": "{name} Vas je počeo/la pratiti",
"notification.follow_request": "{name} zatražio/la je da Vas prati",
@@ -306,13 +318,15 @@
"notification.poll": "Anketa u kojoj ste glasali je završila",
"notification.reblog": "{name} je boostao/la Vaš status",
"notification.status": "{name} just posted",
+ "notification.update": "{name} edited a post",
"notifications.clear": "Očisti obavijesti",
"notifications.clear_confirmation": "Želite li zaista trajno očistiti sve Vaše obavijesti?",
+ "notifications.column_settings.admin.sign_up": "New sign-ups:",
"notifications.column_settings.alert": "Obavijesti radne površine",
"notifications.column_settings.favourite": "Favoriti:",
"notifications.column_settings.filter_bar.advanced": "Prikaži sve kategorije",
"notifications.column_settings.filter_bar.category": "Brza traka filtera",
- "notifications.column_settings.filter_bar.show": "Prikaži",
+ "notifications.column_settings.filter_bar.show_bar": "Show filter bar",
"notifications.column_settings.follow": "Novi pratitelji:",
"notifications.column_settings.follow_request": "Novi zahtjevi za praćenje:",
"notifications.column_settings.mention": "Spominjanja:",
@@ -322,7 +336,9 @@
"notifications.column_settings.show": "Prikaži u stupcu",
"notifications.column_settings.sound": "Sviraj zvuk",
"notifications.column_settings.status": "New toots:",
- "notifications.column_settings.unread_markers.category": "Unread notification markers",
+ "notifications.column_settings.unread_notifications.category": "Unread notifications",
+ "notifications.column_settings.unread_notifications.highlight": "Highlight unread notifications",
+ "notifications.column_settings.update": "Edits:",
"notifications.filter.all": "Sve",
"notifications.filter.boosts": "Boostovi",
"notifications.filter.favourites": "Favoriti",
@@ -362,18 +378,54 @@
"regeneration_indicator.label": "Učitavanje…",
"regeneration_indicator.sublabel": "Priprema se Vaša početna stranica!",
"relative_time.days": "{number}d",
+ "relative_time.full.days": "{number, plural, one {# day} other {# days}} ago",
+ "relative_time.full.hours": "{number, plural, one {# hour} other {# hours}} ago",
+ "relative_time.full.just_now": "just now",
+ "relative_time.full.minutes": "{number, plural, one {# minute} other {# minutes}} ago",
+ "relative_time.full.seconds": "{number, plural, one {# second} other {# seconds}} ago",
"relative_time.hours": "{number}h",
"relative_time.just_now": "sada",
"relative_time.minutes": "{number}m",
"relative_time.seconds": "{number}s",
"relative_time.today": "danas",
"reply_indicator.cancel": "Otkaži",
+ "report.block": "Block",
+ "report.block_explanation": "You will not see their posts. They will not be able to see your posts or follow you. They will be able to tell that they are blocked.",
+ "report.categories.other": "Other",
+ "report.categories.spam": "Spam",
+ "report.categories.violation": "Content violates one or more server rules",
+ "report.category.subtitle": "Choose the best match",
+ "report.category.title": "Tell us what's going on with this {type}",
+ "report.category.title_account": "profile",
+ "report.category.title_status": "post",
+ "report.close": "Done",
+ "report.comment.title": "Is there anything else you think we should know?",
"report.forward": "Proslijedi {target}",
"report.forward_hint": "Račun je s drugog poslužitelja. Poslati anonimiziranu kopiju prijave i tamo?",
- "report.hint": "Prijava bit će poslana moderatorima poslužitelja. Ispod možete dati objašnjenje zašto prijavljujete ovaj račun:",
+ "report.mute": "Mute",
+ "report.mute_explanation": "You will not see their posts. They can still follow you and see your posts and will not know that they are muted.",
+ "report.next": "Next",
"report.placeholder": "Dodatni komentari",
+ "report.reasons.dislike": "I don't like it",
+ "report.reasons.dislike_description": "It is not something you want to see",
+ "report.reasons.other": "It's something else",
+ "report.reasons.other_description": "The issue does not fit into other categories",
+ "report.reasons.spam": "It's spam",
+ "report.reasons.spam_description": "Malicious links, fake engagement, or repetitive replies",
+ "report.reasons.violation": "It violates server rules",
+ "report.reasons.violation_description": "You are aware that it breaks specific rules",
+ "report.rules.subtitle": "Select all that apply",
+ "report.rules.title": "Which rules are being violated?",
+ "report.statuses.subtitle": "Select all that apply",
+ "report.statuses.title": "Are there any posts that back up this report?",
"report.submit": "Pošalji",
"report.target": "Prijavljivanje korisnika {target}",
+ "report.thanks.take_action": "Here are your options for controlling what you see on Mastodon:",
+ "report.thanks.take_action_actionable": "While we review this, you can take action against @{name}:",
+ "report.thanks.title": "Don't want to see this?",
+ "report.thanks.title_actionable": "Thanks for reporting, we'll look into this.",
+ "report.unfollow": "Unfollow @{name}",
+ "report.unfollow_explanation": "You are following this account. To not see their posts in your home feed anymore, unfollow them.",
"search.placeholder": "Traži",
"search_popout.search_format": "Format naprednog pretraživanja",
"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.",
@@ -382,7 +434,9 @@
"search_popout.tips.text": "Simple text returns matching display names, usernames and hashtags",
"search_popout.tips.user": "korisnik",
"search_results.accounts": "Ljudi",
+ "search_results.all": "All",
"search_results.hashtags": "Hashtags",
+ "search_results.nothing_found": "Could not find anything for these search terms",
"search_results.statuses": "Toots",
"search_results.statuses_fts_disabled": "Searching toots by their content is not enabled on this Mastodon server.",
"search_results.total": "{count, number} {count, plural, one {result} other {results}}",
@@ -396,9 +450,14 @@
"status.delete": "Obriši",
"status.detailed_status": "Detailed conversation view",
"status.direct": "Direct message @{name}",
+ "status.edit": "Edit",
+ "status.edited": "Edited {date}",
+ "status.edited_x_times": "Edited {count, plural, one {{count} time} other {{count} times}}",
"status.embed": "Embed",
"status.favourite": "Označi favoritom",
"status.filtered": "Filtered",
+ "status.history.created": "{name} created {date}",
+ "status.history.edited": "{name} edited {date}",
"status.load_more": "Učitaj više",
"status.media_hidden": "Sakriven medijski sadržaj",
"status.mention": "Spomeni @{name}",
diff --git a/app/javascript/mastodon/locales/hu.json b/app/javascript/mastodon/locales/hu.json
index db08bfc75..d121d6573 100644
--- a/app/javascript/mastodon/locales/hu.json
+++ b/app/javascript/mastodon/locales/hu.json
@@ -17,13 +17,13 @@
"account.follow": "Követés",
"account.followers": "Követő",
"account.followers.empty": "Ezt a felhasználót még senki sem követi.",
- "account.followers_counter": "{count, plural, one {{counter} követő} other {{counter} követő}}",
+ "account.followers_counter": "{count, plural, one {{counter} Követő} other {{counter} Követő}}",
+ "account.following": "Követve",
"account.following_counter": "{count, plural, other {{counter} Követett}}",
"account.follows.empty": "Ez a felhasználó még senkit sem követ.",
"account.follows_you": "Követ téged",
"account.hide_reblogs": "@{name} megtolásainak elrejtése",
"account.joined": "Csatlakozott {date}",
- "account.last_status": "Utoljára aktív",
"account.link_verified_on": "A linket eredetiségét ebben az időpontban ellenőriztük: {date}",
"account.locked_info": "Ennek a fióknak zárolt a láthatósága. A tulajdonos kézzel engedélyezi, hogy ki követheti őt.",
"account.media": "Média",
@@ -32,7 +32,6 @@
"account.mute": "@{name} némítása",
"account.mute_notifications": "@{name} értesítéseinek némítása",
"account.muted": "Némítva",
- "account.never_active": "Soha",
"account.posts": "Bejegyzések",
"account.posts_with_replies": "Bejegyzések és válaszok",
"account.report": "@{name} jelentése",
@@ -42,21 +41,24 @@
"account.statuses_counter": "{count, plural, one {{counter} Bejegyzés} other {{counter} Bejegyzés}}",
"account.unblock": "@{name} letiltásának feloldása",
"account.unblock_domain": "{domain} elrejtésének feloldása",
+ "account.unblock_short": "Tiltás feloldása",
"account.unendorse": "Ne jelenjen meg a profilodon",
"account.unfollow": "Követés megszüntetése",
"account.unmute": "@{name} némítás feloldása",
"account.unmute_notifications": "@{name} némított értesítéseinek feloldása",
+ "account.unmute_short": "Némitás feloldása",
"account_note.placeholder": "Klikk a feljegyzéshez",
- "admin.dashboard.retention": "Retention",
- "admin.dashboard.retention.average": "Average",
- "admin.dashboard.retention.cohort": "Sign-up month",
- "admin.dashboard.retention.cohort_size": "New users",
+ "admin.dashboard.daily_retention": "Napi regisztráció utáni felhasználómegtartási arány",
+ "admin.dashboard.monthly_retention": "Havi regisztráció utáni felhasználómegtartási arány",
+ "admin.dashboard.retention.average": "Átlag",
+ "admin.dashboard.retention.cohort": "Regisztráció hónapja",
+ "admin.dashboard.retention.cohort_size": "Új felhasználó",
"alert.rate_limited.message": "Próbáld újra {retry_time, time, medium} után.",
"alert.rate_limited.title": "Forgalomkorlátozás",
"alert.unexpected.message": "Váratlan hiba történt.",
"alert.unexpected.title": "Hoppá!",
"announcement.announcement": "Közlemény",
- "attachments_list.unprocessed": "(unprocessed)",
+ "attachments_list.unprocessed": "(feldolgozatlan)",
"autosuggest_hashtag.per_week": "{count} hetente",
"boost_modal.combo": "Hogy átugord ezt következő alkalommal, használd {combo}",
"bundle_column_error.body": "Valami hiba történt a komponens betöltése közben.",
@@ -104,6 +106,7 @@
"compose_form.poll.switch_to_single": "Szavazás megváltoztatása egyetlen választásosra",
"compose_form.publish": "Tülk",
"compose_form.publish_loud": "{publish}!",
+ "compose_form.save_changes": "Módosítások mentése",
"compose_form.sensitive.hide": "{count, plural, one {Média kényesnek jelölése} other {Média kényesnek jelölése}}",
"compose_form.sensitive.marked": "{count, plural, one {A médiát kényesnek jelölték} other {A médiát kényesnek jelölték}}",
"compose_form.sensitive.unmarked": "{count, plural, one {A médiát nem jelölték kényesnek} other {A médiát nem jelölték kényesnek}}",
@@ -118,8 +121,8 @@
"confirmations.delete.message": "Biztos, hogy törölni szeretnéd ezt a bejegyzést?",
"confirmations.delete_list.confirm": "Törlés",
"confirmations.delete_list.message": "Biztos, hogy véglegesen törölni szeretnéd ezt a listát?",
- "confirmations.discard_edit_media.confirm": "Discard",
- "confirmations.discard_edit_media.message": "You have unsaved changes to the media description or preview, discard them anyway?",
+ "confirmations.discard_edit_media.confirm": "Elvetés",
+ "confirmations.discard_edit_media.message": "Elmentetlen változtatásaid vannak a média leírásában vagy előnézetében. Eldobjuk őket?",
"confirmations.domain_block.confirm": "Teljes domain elrejtése",
"confirmations.domain_block.message": "Biztos, hogy le szeretnéd tiltani a teljes {domain} domaint? A legtöbb esetben néhány célzott tiltás vagy némítás elegendő, és kívánatosabb megoldás. Semmilyen tartalmat nem fogsz látni ebből a domainből se az idővonalakon, se az értesítésekben. Az ebben a domainben lévő követőidet is eltávolítjuk.",
"confirmations.logout.confirm": "Kijelentkezés",
@@ -165,9 +168,10 @@
"empty_column.community": "A helyi idővonal üres. Tégy közzé valamit nyilvánosan, hogy elindítsd az eseményeket!",
"empty_column.direct": "Még nincs egy közvetlen üzeneted sem. Ha küldesz vagy kapsz egyet, itt fog megjelenni.",
"empty_column.domain_blocks": "Még nem rejtettél el egyetlen domaint sem.",
+ "empty_column.explore_statuses": "Jelenleg semmi sem felkapott. Nézz vissza később!",
"empty_column.favourited_statuses": "Még nincs egyetlen kedvenc bejegyzésed sem. Ha kedvencnek jelölsz egyet, itt fog megjelenni.",
"empty_column.favourites": "Még senki sem jelölte ezt a bejegyzést kedvencnek. Ha valaki mégis megteszi, itt fogjuk mutatni.",
- "empty_column.follow_recommendations": "Úgy tűnik, neked nem tudunk javaslatokat adni. Próbáld a keresést használni olyanok megtalálására, akiket ismerhetsz, vagy fedezd fel a trendi hastageket.",
+ "empty_column.follow_recommendations": "Úgy tűnik, neked nem tudunk javaslatokat adni. Próbáld a keresést használni olyanok megtalálására, akiket ismerhetsz, vagy fedezd fel a felkapott hastageket.",
"empty_column.follow_requests": "Még nincs egy követési kérésed sem. Ha kapsz egyet, itt fogjuk feltüntetni.",
"empty_column.hashtag": "Jelenleg nem található semmi ezzel a hashtaggel.",
"empty_column.home": "A saját idővonalad üres! Látogasd meg a {public} oldalt vagy használd a keresőt, hogy megismerj másokat.",
@@ -183,6 +187,12 @@
"error.unexpected_crash.next_steps_addons": "Próbáld letiltani őket és frissíteni az oldalt. Ha ez nem segít, egy másik böngészőn vagy appon keresztül még mindig használhatod a Mastodont.",
"errors.unexpected_crash.copy_stacktrace": "Veremkiíratás vágólapra másolása",
"errors.unexpected_crash.report_issue": "Probléma jelentése",
+ "explore.search_results": "Keresési találatok",
+ "explore.suggested_follows": "Neked",
+ "explore.title": "Felfedezés",
+ "explore.trending_links": "Hírek",
+ "explore.trending_statuses": "Bejegyzések",
+ "explore.trending_tags": "Hashtagek",
"follow_recommendations.done": "Kész",
"follow_recommendations.heading": "Kövesd azokat, akiknek a bejegyzéseit látni szeretnéd! Itt van néhány javaslat.",
"follow_recommendations.lead": "Az általad követettek bejegyzései a saját idővonaladon fognak megjelenni időrendi sorrendben. Ne félj attól, hogy hibázol! A követést bármikor, ugyanilyen könnyen visszavonhatod!",
@@ -284,6 +294,7 @@
"navigation_bar.discover": "Felfedezés",
"navigation_bar.domain_blocks": "Rejtett domainek",
"navigation_bar.edit_profile": "Profil szerkesztése",
+ "navigation_bar.explore": "Felfedezés",
"navigation_bar.favourites": "Kedvencek",
"navigation_bar.filters": "Némított szavak",
"navigation_bar.follow_requests": "Követési kérelmek",
@@ -298,6 +309,7 @@
"navigation_bar.preferences": "Beállítások",
"navigation_bar.public_timeline": "Föderációs idővonal",
"navigation_bar.security": "Biztonság",
+ "notification.admin.sign_up": "{name} regisztrált",
"notification.favourite": "{name} kedvencnek jelölte a bejegyzésedet",
"notification.follow": "{name} követ téged",
"notification.follow_request": "{name} követni szeretne téged",
@@ -306,13 +318,15 @@
"notification.poll": "Egy szavazás, melyben részt vettél, véget ért",
"notification.reblog": "{name} megtolta a bejegyzésedet",
"notification.status": "{name} bejegyzést tett közzé",
+ "notification.update": "{name} szerkesztett egy bejegyzést",
"notifications.clear": "Értesítések törlése",
"notifications.clear_confirmation": "Biztos, hogy véglegesen törölni akarod az összes értesítésed?",
+ "notifications.column_settings.admin.sign_up": "Új regisztrálók:",
"notifications.column_settings.alert": "Asztali értesítések",
"notifications.column_settings.favourite": "Kedvencek:",
"notifications.column_settings.filter_bar.advanced": "Minden kategória mutatása",
"notifications.column_settings.filter_bar.category": "Gyorskereső mező",
- "notifications.column_settings.filter_bar.show": "Mutat",
+ "notifications.column_settings.filter_bar.show_bar": "Szűrősáv mutatása",
"notifications.column_settings.follow": "Új követők:",
"notifications.column_settings.follow_request": "Új követési kérelmek:",
"notifications.column_settings.mention": "Megemlítések:",
@@ -322,7 +336,9 @@
"notifications.column_settings.show": "Oszlopban mutatás",
"notifications.column_settings.sound": "Hang lejátszása",
"notifications.column_settings.status": "Új bejegyzések:",
- "notifications.column_settings.unread_markers.category": "Olvasatlan értesítés jelzők",
+ "notifications.column_settings.unread_notifications.category": "Olvasatlan értesítések",
+ "notifications.column_settings.unread_notifications.highlight": "Olvasatlan értesítések kiemelése",
+ "notifications.column_settings.update": "Szerkesztések:",
"notifications.filter.all": "Mind",
"notifications.filter.boosts": "Megtolások",
"notifications.filter.favourites": "Kedvencnek jelölések",
@@ -346,7 +362,7 @@
"poll.total_votes": "{count, plural, one {# szavazat} other {# szavazat}}",
"poll.vote": "Szavazás",
"poll.voted": "Erre a válaszra szavaztál",
- "poll.votes": "{votes, plural, one {# vote} other {# votes}}",
+ "poll.votes": "{votes, plural, one {# szavazat} other {# szavazat}}",
"poll_button.add_poll": "Új szavazás",
"poll_button.remove_poll": "Szavazás törlése",
"privacy.change": "Bejegyzés láthatóságának módosítása",
@@ -362,18 +378,54 @@
"regeneration_indicator.label": "Töltődik…",
"regeneration_indicator.sublabel": "A saját idővonalad épp készül!",
"relative_time.days": "{number}n",
+ "relative_time.full.days": "{number, plural, one {# napja} other {# napja}}",
+ "relative_time.full.hours": "{number, plural, one {# órája} other {# órája}}",
+ "relative_time.full.just_now": "épp most",
+ "relative_time.full.minutes": "{number, plural, one {# perce} other {# perce}}",
+ "relative_time.full.seconds": "{number, plural, one {# másodperce} other {# másodperce}}",
"relative_time.hours": "{number}ó",
"relative_time.just_now": "most",
"relative_time.minutes": "{number}p",
"relative_time.seconds": "{number}mp",
"relative_time.today": "ma",
"reply_indicator.cancel": "Mégsem",
+ "report.block": "Letiltás",
+ "report.block_explanation": "Nem fogod látni a bejegyzéseit. Nem fogja tudni megnézni a bejegyzéseidet és nem fog tudni követni sem. Azt is meg fogja tudni mondani, hogy letiltottad.",
+ "report.categories.other": "Egyéb",
+ "report.categories.spam": "Kéretlen üzenet",
+ "report.categories.violation": "A tartalom a kiszolgáló egy vagy több szabályát sérti",
+ "report.category.subtitle": "Válaszd ki a legjobb találatot",
+ "report.category.title": "Mondd el, hogy mi van ezzel a {type}",
+ "report.category.title_account": "profillal",
+ "report.category.title_status": "bejegyzéssel",
+ "report.close": "Kész",
+ "report.comment.title": "Van valami, amiről tudnunk kellene?",
"report.forward": "Továbbítás: {target}",
"report.forward_hint": "Ez a fiók egy másik kiszolgálóról van. Oda is elküldöd a jelentés egy anonimizált másolatát?",
- "report.hint": "A bejelentést a szervered moderátorainak küldjük el. Megmagyarázhatod, miért jelented az alábbi problémát:",
+ "report.mute": "Némítás",
+ "report.mute_explanation": "Nem fogod látni a bejegyzéseit. Továbbra is fog tudni követni, és látni fogja a bejegyzéseidet, és nem fogja tudni, hogy némítottad.",
+ "report.next": "Következő",
"report.placeholder": "További megjegyzések",
+ "report.reasons.dislike": "Nem tetszik",
+ "report.reasons.dislike_description": "Ezt nem szeretném látni",
+ "report.reasons.other": "Valami más",
+ "report.reasons.other_description": "Az eset nem illik egyik kategóriába sem",
+ "report.reasons.spam": "Ez kéretlen tartalom",
+ "report.reasons.spam_description": "Rosszindulatú hivatkozások, hamis interakció vagy ismétlődő válaszok",
+ "report.reasons.violation": "Sérti a kiszolgáló szabályait",
+ "report.reasons.violation_description": "Tudod, hogy mely konkrét szabályokat sért meg",
+ "report.rules.subtitle": "Válaszd ki az összes megfelelőt",
+ "report.rules.title": "Mely szabályok lettek megsértve?",
+ "report.statuses.subtitle": "Válaszd ki az összes megfelelőt",
+ "report.statuses.title": "Vannak olyan bejegyzések, amelyek alátámasztják ezt a jelentést?",
"report.submit": "Küldés",
"report.target": "{target} jelentése",
+ "report.thanks.take_action": "Itt vannak a beállítások, melyek szabályozzák, hogy mit látsz a Mastodonon:",
+ "report.thanks.take_action_actionable": "Míg átnézzük, a következőket teheted @{name} ellen:",
+ "report.thanks.title": "Nem akarod ezt látni?",
+ "report.thanks.title_actionable": "Köszönjük, hogy jelentetted, megnézzük.",
+ "report.unfollow": "@{name} követésének leállítása",
+ "report.unfollow_explanation": "Követed ezt a fiókot. Hogy ne lásd a bejegyzéseit a saját idővonaladon, szüntesd meg a követését.",
"search.placeholder": "Keresés",
"search_popout.search_format": "Speciális keresés",
"search_popout.tips.full_text": "Egyszerű szöveg, mely általad írt, kedvencnek jelölt vagy megtolt bejegyzéseket, rólad szóló megemlítéseket, felhasználói neveket, megjelenített neveket, hashtageket ad majd vissza.",
@@ -382,7 +434,9 @@
"search_popout.tips.text": "Egyszerű szöveg. Illeszkedő megjelenített nevet, felhasználói nevet, hashtageket ad majd vissza",
"search_popout.tips.user": "felhasználó",
"search_results.accounts": "Emberek",
+ "search_results.all": "Összes",
"search_results.hashtags": "Hashtagek",
+ "search_results.nothing_found": "Nincs találat ezekre a keresési kifejezésekre",
"search_results.statuses": "Bejegyzések",
"search_results.statuses_fts_disabled": "Ezen a Mastodon szerveren nem engedélyezett a bejegyzések tartalom szerinti keresése.",
"search_results.total": "{count, number} {count, plural, one {találat} other {találat}}",
@@ -396,9 +450,14 @@
"status.delete": "Törlés",
"status.detailed_status": "Részletes beszélgetési nézet",
"status.direct": "Közvetlen üzenet @{name} számára",
+ "status.edit": "Szerkesztés",
+ "status.edited": "Szerkesztve: {date}",
+ "status.edited_x_times": "{count, plural, one {{count} alkalommal} other {{count} alkalommal}} szerkesztve",
"status.embed": "Beágyazás",
"status.favourite": "Kedvenc",
"status.filtered": "Megszűrt",
+ "status.history.created": "{name} létrehozta: {date}",
+ "status.history.edited": "{name} szerkesztette: {date}",
"status.load_more": "Többet",
"status.media_hidden": "Média elrejtve",
"status.mention": "@{name} megemlítése",
@@ -462,7 +521,7 @@
"upload_form.video_description": "Írja le a hallás- vagy látássérültek számára",
"upload_modal.analyzing_picture": "Kép elemzése…",
"upload_modal.apply": "Alkalmaz",
- "upload_modal.applying": "Applying…",
+ "upload_modal.applying": "Alkalmazás…",
"upload_modal.choose_image": "Kép kiválasztása",
"upload_modal.description_placeholder": "A gyors, barna róka átugrik a lusta kutya fölött",
"upload_modal.detect_text": "Szöveg felismerése a képről",
diff --git a/app/javascript/mastodon/locales/hy.json b/app/javascript/mastodon/locales/hy.json
index e412917f0..2b7cdf5ac 100644
--- a/app/javascript/mastodon/locales/hy.json
+++ b/app/javascript/mastodon/locales/hy.json
@@ -18,12 +18,12 @@
"account.followers": "Հետեւողներ",
"account.followers.empty": "Այս օգտատիրոջը դեռ ոչ մէկ չի հետեւում։",
"account.followers_counter": "{count, plural, one {{counter} Հետեւորդ} other {{counter} Հետեւորդ}}",
+ "account.following": "Following",
"account.following_counter": "{count, plural, one {{counter} հետեւած} other {{counter} հետեւած}}",
"account.follows.empty": "Այս օգտատէրը դեռ ոչ մէկի չի հետեւում։",
"account.follows_you": "Հետեւում է քեզ",
"account.hide_reblogs": "Թաքցնել @{name}֊ի տարածածները",
"account.joined": "Միացել է {date}-ից",
- "account.last_status": "Վերջին այցը",
"account.link_verified_on": "Սոյն յղման տիրապետումը ստուգուած է՝ {date}֊ին",
"account.locked_info": "Սոյն հաշուի գաղտնիութեան մակարդակը նշուած է որպէս՝ փակ։ Հաշուի տէրն ընտրում է, թէ ով կարող է հետեւել իրեն։",
"account.media": "Մեդիա",
@@ -32,7 +32,6 @@
"account.mute": "Լռեցնել @{name}֊ին",
"account.mute_notifications": "Անջատել ծանուցումները @{name}֊ից",
"account.muted": "Լռեցուած",
- "account.never_active": "Երբեք",
"account.posts": "Գրառումներ",
"account.posts_with_replies": "Գրառումներ եւ պատասխաններ",
"account.report": "Բողոքել @{name}֊ի մասին",
@@ -42,15 +41,18 @@
"account.statuses_counter": "{count, plural, one {{counter} Գրառում} other {{counter} Գրառումներ}}",
"account.unblock": "Ապաարգելափակել @{name}֊ին",
"account.unblock_domain": "Ցուցադրել {domain} թաքցուած տիրոյթի գրառումները",
+ "account.unblock_short": "Unblock",
"account.unendorse": "Չցուցադրել անձնական էջում",
"account.unfollow": "Ապահետեւել",
"account.unmute": "Ապալռեցնել @{name}֊ին",
"account.unmute_notifications": "Միացնել ծանուցումները @{name}֊ից",
+ "account.unmute_short": "Unmute",
"account_note.placeholder": "Սեղմէ՛ք գրառելու համար\n",
- "admin.dashboard.retention": "Retention",
- "admin.dashboard.retention.average": "Average",
- "admin.dashboard.retention.cohort": "Sign-up month",
- "admin.dashboard.retention.cohort_size": "New users",
+ "admin.dashboard.daily_retention": "User retention rate by day after sign-up",
+ "admin.dashboard.monthly_retention": "User retention rate by month after sign-up",
+ "admin.dashboard.retention.average": "Միջին",
+ "admin.dashboard.retention.cohort": "Ամսուայ գրանցումներ",
+ "admin.dashboard.retention.cohort_size": "Նոր օգտուող",
"alert.rate_limited.message": "Փորձէք որոշ ժամանակ անց՝ {retry_time, time, medium}։",
"alert.rate_limited.title": "Գործողութիւնների յաճախութիւնը գերազանցում է թոյլատրելին",
"alert.unexpected.message": "Անսպասելի սխալ տեղի ունեցաւ։",
@@ -104,6 +106,7 @@
"compose_form.poll.switch_to_single": "Հարցումը դարձնել եզակի ընտրութեամբ",
"compose_form.publish": "Հրապարակել",
"compose_form.publish_loud": "Հրապարակե՜լ",
+ "compose_form.save_changes": "Save changes",
"compose_form.sensitive.hide": "Նշել մեդիան որպէս դիւրազգաց",
"compose_form.sensitive.marked": "Մեդիան նշուած է որպէս դիւրազգաց",
"compose_form.sensitive.unmarked": "Մեդիան նշուած չէ որպէս դիւրազգաց",
@@ -118,14 +121,14 @@
"confirmations.delete.message": "Վստա՞հ ես, որ ուզում ես ջնջել այս գրառումը։",
"confirmations.delete_list.confirm": "Ջնջել",
"confirmations.delete_list.message": "Վստա՞հ ես, որ ուզում ես մշտապէս ջնջել այս ցանկը։",
- "confirmations.discard_edit_media.confirm": "Discard",
+ "confirmations.discard_edit_media.confirm": "Չեղարկել",
"confirmations.discard_edit_media.message": "You have unsaved changes to the media description or preview, discard them anyway?",
"confirmations.domain_block.confirm": "Թաքցնել ամբողջ տիրույթը",
"confirmations.domain_block.message": "Հաստատ֊հաստա՞տ վստահ ես, որ ուզում ես արգելափակել ամբողջ {domain} տիրոյթը։ Սովորաբար մի երկու թիրախաւորուած արգելափակում կամ լռեցում բաւական է ու նախընտրելի։",
"confirmations.logout.confirm": "Ելք",
"confirmations.logout.message": "Համոզո՞ւած ես, որ ուզում ես դուրս գալ",
"confirmations.mute.confirm": "Լռեցնել",
- "confirmations.mute.explanation": "Սա թաքցնելու ա իրենց գրառումներն, ինչպէս նաեւ իրենց նշող գրառումներն, բայց իրենք միեւնոյն է կը կարողանան հետեւել ձեզ եւ տեսնել ձեր գրառումները։",
+ "confirmations.mute.explanation": "Սա թաքցնելու է իրենց գրառումները, ինչպէս նաեւ իրենց նշող գրառումները, բայց իրենք միեւնոյն է կը կարողանան հետեւել ձեզ եւ տեսնել ձեր գրառումները։",
"confirmations.mute.message": "Վստա՞հ ես, որ ուզում ես {name}֊ին լռեցնել։",
"confirmations.redraft.confirm": "Ջնջել եւ խմբագրել նորից",
"confirmations.redraft.message": "Վստահ ե՞ս, որ ցանկանում ես ջնջել եւ վերախմբագրել այս գրառումը։ Դու կը կորցնես այս գրառման բոլոր պատասխանները, տարածումները եւ հաւանումները։",
@@ -142,7 +145,7 @@
"directory.new_arrivals": "Նորեկներ",
"directory.recently_active": "Վերջերս ակտիւ",
"embed.instructions": "Այս գրառումը քո կայքում ներդնելու համար կարող ես պատճէնել ներքեւի կոդը։",
- "embed.preview": "Ահա, թէ ինչ տեսք կը ունենայ այն՝",
+ "embed.preview": "Ահա, թէ ինչ տեսք կունենայ այն՝",
"emoji_button.activity": "Զբաղմունքներ",
"emoji_button.custom": "Յատուկ",
"emoji_button.flags": "Դրօշներ",
@@ -165,6 +168,7 @@
"empty_column.community": "Տեղական հոսքը դատարկ է։ Հրապարակային մի բան գրի՛ր շարժիչը գործարկելու համար։",
"empty_column.direct": "Դու դեռ չունես ոչ մի հասցէագրուած հաղորդագրութիւն։ Երբ ուղարկես կամ ստանաս որեւէ անձնական նամակ, այն այստեղ կերեւայ։",
"empty_column.domain_blocks": "Թաքցուած տիրոյթներ դեռ չկան։",
+ "empty_column.explore_statuses": "Nothing is trending right now. Check back later!",
"empty_column.favourited_statuses": "Դու դեռ չունես որեւէ հաւանած գրառում։ Երբ հաւանես, դրանք կերեւան այստեղ։",
"empty_column.favourites": "Այս գրառումը ոչ մէկ դեռ չի հաւանել։ Հաւանողները կերեւան այստեղ, երբ հաւանեն։",
"empty_column.follow_recommendations": "Կարծես քեզ համար ոչ մի առաջարկ չի գեներացուել։ Օգտագործիր որոնման դաշտը մարդկանց փնտրելու համար կամ բացայայտիր յայտնի պիտակներով։",
@@ -183,6 +187,12 @@
"error.unexpected_crash.next_steps_addons": "Փորձիր անջատել յաւելուածները եւ թարմացնել էջը։ Եթե դա չօգնի, կարող ես օգտուել Մաստադոնից այլ դիտարկիչով կամ յաւելուածով։",
"errors.unexpected_crash.copy_stacktrace": "Պատճենել սթաքթրեյսը սեղմատախտակին",
"errors.unexpected_crash.report_issue": "Զեկուցել խնդրի մասին",
+ "explore.search_results": "Search results",
+ "explore.suggested_follows": "For you",
+ "explore.title": "Explore",
+ "explore.trending_links": "News",
+ "explore.trending_statuses": "Posts",
+ "explore.trending_tags": "Hashtags",
"follow_recommendations.done": "Աւարտուած է",
"follow_recommendations.heading": "Հետեւիր այն մարդկանց, որոնց գրառումները կը ցանկանաս տեսնել։ Ահա մի քանի առաջարկ։",
"follow_recommendations.lead": "Քո հոսքում, ժամանակագրական դասաւորութեամբ կը տեսնես այն մարդկանց գրառումները, որոնց հետեւում ես։ Մի վախեցիր սխալուել, դու միշտ կարող ես հեշտութեամբ ապահետեւել մարդկանց։",
@@ -284,6 +294,7 @@
"navigation_bar.discover": "Բացայայտել",
"navigation_bar.domain_blocks": "Թաքցուած տիրոյթներ",
"navigation_bar.edit_profile": "Խմբագրել անձնական էջը",
+ "navigation_bar.explore": "Explore",
"navigation_bar.favourites": "Հաւանածներ",
"navigation_bar.filters": "Լռեցուած բառեր",
"navigation_bar.follow_requests": "Հետեւելու հայցեր",
@@ -298,6 +309,7 @@
"navigation_bar.preferences": "Նախապատուութիւններ",
"navigation_bar.public_timeline": "Դաշնային հոսք",
"navigation_bar.security": "Անվտանգութիւն",
+ "notification.admin.sign_up": "{name} signed up",
"notification.favourite": "{name} հաւանեց գրառումդ",
"notification.follow": "{name} սկսեց հետեւել քեզ",
"notification.follow_request": "{name} քեզ հետեւելու հայց է ուղարկել",
@@ -306,13 +318,15 @@
"notification.poll": "Հարցումը, ուր դու քուէարկել ես, աւարտուեց։",
"notification.reblog": "{name} տարածեց գրառումդ",
"notification.status": "{name} հենց նոր գրառում արեց",
+ "notification.update": "{name} edited a post",
"notifications.clear": "Մաքրել ծանուցումները",
"notifications.clear_confirmation": "Վստա՞հ ես, որ ուզում ես մշտապէս մաքրել քո բոլոր ծանուցումները։",
+ "notifications.column_settings.admin.sign_up": "New sign-ups:",
"notifications.column_settings.alert": "Աշխատատիրոյթի ծանուցումներ",
"notifications.column_settings.favourite": "Հաւանածներից՝",
"notifications.column_settings.filter_bar.advanced": "Ցուցադրել բոլոր կատեգորիաները",
"notifications.column_settings.filter_bar.category": "Արագ զտման վահանակ",
- "notifications.column_settings.filter_bar.show": "Ցուցադրել",
+ "notifications.column_settings.filter_bar.show_bar": "Ցոյց տալ զտման պանելը",
"notifications.column_settings.follow": "Նոր հետեւողներ՝",
"notifications.column_settings.follow_request": "Նոր հետեւելու հայցեր:",
"notifications.column_settings.mention": "Նշումներ՝",
@@ -322,7 +336,9 @@
"notifications.column_settings.show": "Ցուցադրել սիւնում",
"notifications.column_settings.sound": "Ձայն հանել",
"notifications.column_settings.status": "Նոր գրառումներ։",
- "notifications.column_settings.unread_markers.category": "Չկարդացուած ծանուցումների նշաններ",
+ "notifications.column_settings.unread_notifications.category": "Չկարդացուած ծանուցումներ",
+ "notifications.column_settings.unread_notifications.highlight": "Highlight unread notifications",
+ "notifications.column_settings.update": "Edits:",
"notifications.filter.all": "Բոլորը",
"notifications.filter.boosts": "Տարածածները",
"notifications.filter.favourites": "Հաւանածները",
@@ -362,18 +378,54 @@
"regeneration_indicator.label": "Բեռնւում է…",
"regeneration_indicator.sublabel": "պատրաստւում է հիմնական հոսքդ",
"relative_time.days": "{number}օր",
+ "relative_time.full.days": "{number, plural, one {# day} other {# days}} ago",
+ "relative_time.full.hours": "{number, plural, one {# hour} other {# hours}} ago",
+ "relative_time.full.just_now": "just now",
+ "relative_time.full.minutes": "{number, plural, one {# minute} other {# minutes}} ago",
+ "relative_time.full.seconds": "{number, plural, one {# second} other {# seconds}} ago",
"relative_time.hours": "{number}ժ",
"relative_time.just_now": "նոր",
"relative_time.minutes": "{number}ր",
"relative_time.seconds": "{number}վ",
"relative_time.today": "Այսօր",
"reply_indicator.cancel": "Չեղարկել",
+ "report.block": "Block",
+ "report.block_explanation": "You will not see their posts. They will not be able to see your posts or follow you. They will be able to tell that they are blocked.",
+ "report.categories.other": "Other",
+ "report.categories.spam": "Spam",
+ "report.categories.violation": "Content violates one or more server rules",
+ "report.category.subtitle": "Choose the best match",
+ "report.category.title": "Tell us what's going on with this {type}",
+ "report.category.title_account": "profile",
+ "report.category.title_status": "post",
+ "report.close": "Done",
+ "report.comment.title": "Is there anything else you think we should know?",
"report.forward": "Փոխանցել {target}֊ին",
"report.forward_hint": "Այս հաշիւ այլ հանգոյցից է։ Ուղարկե՞մ այնտեղ էլ այս բողոքի անոնիմ պատճէնը։",
- "report.hint": "Այս զեկոյցը կուղարկուի հանգոյցի մոդերատորներին։ Ներքեւում կարող ես տրամադրել բացատրութիւն, թէ ինչու ես զեկուցում այս հաշուի մասին․",
+ "report.mute": "Mute",
+ "report.mute_explanation": "You will not see their posts. They can still follow you and see your posts and will not know that they are muted.",
+ "report.next": "Next",
"report.placeholder": "Լրացուցիչ մեկնաբանութիւններ",
+ "report.reasons.dislike": "I don't like it",
+ "report.reasons.dislike_description": "It is not something you want to see",
+ "report.reasons.other": "It's something else",
+ "report.reasons.other_description": "The issue does not fit into other categories",
+ "report.reasons.spam": "It's spam",
+ "report.reasons.spam_description": "Malicious links, fake engagement, or repetitive replies",
+ "report.reasons.violation": "It violates server rules",
+ "report.reasons.violation_description": "You are aware that it breaks specific rules",
+ "report.rules.subtitle": "Select all that apply",
+ "report.rules.title": "Which rules are being violated?",
+ "report.statuses.subtitle": "Select all that apply",
+ "report.statuses.title": "Are there any posts that back up this report?",
"report.submit": "Ուղարկել",
"report.target": "Բողոքել {target}֊ի մասին",
+ "report.thanks.take_action": "Here are your options for controlling what you see on Mastodon:",
+ "report.thanks.take_action_actionable": "While we review this, you can take action against @{name}:",
+ "report.thanks.title": "Don't want to see this?",
+ "report.thanks.title_actionable": "Thanks for reporting, we'll look into this.",
+ "report.unfollow": "Unfollow @{name}",
+ "report.unfollow_explanation": "You are following this account. To not see their posts in your home feed anymore, unfollow them.",
"search.placeholder": "Փնտրել",
"search_popout.search_format": "Փնտրելու առաջադէմ ձեւ",
"search_popout.tips.full_text": "Պարզ տեքստը վերադարձնում է գրառումներդ, հաւանածներդ, տարածածներդ, որտեղ ես նշուած եղել, ինչպէս նաեւ նման օգտանուններ, անուններ եւ պիտակներ։",
@@ -382,7 +434,9 @@
"search_popout.tips.text": "Հասարակ տեքստը կը վերադարձնի համընկնող անուններ, օգտանուններ ու պիտակներ",
"search_popout.tips.user": "օգտատէր",
"search_results.accounts": "Մարդիկ",
+ "search_results.all": "All",
"search_results.hashtags": "Պիտակներ",
+ "search_results.nothing_found": "Could not find anything for these search terms",
"search_results.statuses": "Գրառումներ",
"search_results.statuses_fts_disabled": "Այս հանգոյցում միացուած չէ ըստ բովանդակութեան գրառում փնտրելու հնարաւորութիւնը։",
"search_results.total": "{count, number} {count, plural, one {արդիւնք} other {արդիւնք}}",
@@ -396,9 +450,14 @@
"status.delete": "Ջնջել",
"status.detailed_status": "Շղթայի ընդլայնուած դիտում",
"status.direct": "Նամակ գրել {name} -ին",
+ "status.edit": "Edit",
+ "status.edited": "Edited {date}",
+ "status.edited_x_times": "Edited {count, plural, one {{count} time} other {{count} times}}",
"status.embed": "Ներդնել",
"status.favourite": "Հաւանել",
"status.filtered": "Զտուած",
+ "status.history.created": "{name} created {date}",
+ "status.history.edited": "{name} edited {date}",
"status.load_more": "Բեռնել աւելին",
"status.media_hidden": "մեդիաբովանդակութիւնը թաքցուած է",
"status.mention": "Նշել @{name}֊ին",
@@ -462,7 +521,7 @@
"upload_form.video_description": "Նկարագրիր տեսանիւթը լսողական կամ տեսողական խնդիրներով անձանց համար",
"upload_modal.analyzing_picture": "Լուսանկարի վերլուծում…",
"upload_modal.apply": "Կիրառել",
- "upload_modal.applying": "Applying…",
+ "upload_modal.applying": "Կիրառւում է...",
"upload_modal.choose_image": "Ընտրել նկար",
"upload_modal.description_placeholder": "Բել դղեակի ձախ ժամն օֆ ազգութեանը ցպահանջ չճշտած վնաս էր եւ փառք։",
"upload_modal.detect_text": "Յայտնաբերել տեքստը նկարից",
diff --git a/app/javascript/mastodon/locales/id.json b/app/javascript/mastodon/locales/id.json
index a664aff56..ee7810379 100644
--- a/app/javascript/mastodon/locales/id.json
+++ b/app/javascript/mastodon/locales/id.json
@@ -18,12 +18,12 @@
"account.followers": "Pengikut",
"account.followers.empty": "Pengguna ini belum ada pengikut.",
"account.followers_counter": "{count, plural, other {{counter} Pengikut}}",
+ "account.following": "Mengikuti",
"account.following_counter": "{count, plural, other {{counter} Mengikuti}}",
"account.follows.empty": "Pengguna ini belum mengikuti siapapun.",
"account.follows_you": "Mengikuti anda",
"account.hide_reblogs": "Sembunyikan boosts dari @{name}",
"account.joined": "Bergabung {date}",
- "account.last_status": "Terakhir aktif",
"account.link_verified_on": "Kepemilikan tautan ini telah dicek pada {date}",
"account.locked_info": "Status privasi akun ini disetel untuk dikunci. Pemilik secara manual meninjau siapa yang dapat mengikutinya.",
"account.media": "Media",
@@ -32,7 +32,6 @@
"account.mute": "Bisukan @{name}",
"account.mute_notifications": "Bisukan pemberitahuan dari @{name}",
"account.muted": "Dibisukan",
- "account.never_active": "Tak pernah",
"account.posts": "Kiriman",
"account.posts_with_replies": "Postingan dengan balasan",
"account.report": "Laporkan @{name}",
@@ -42,21 +41,24 @@
"account.statuses_counter": "{count, plural, other {{counter} Toot}}",
"account.unblock": "Hapus blokir @{name}",
"account.unblock_domain": "Buka blokir domain {domain}",
+ "account.unblock_short": "Buka blokir",
"account.unendorse": "Jangan tampilkan di profil",
"account.unfollow": "Berhenti mengikuti",
"account.unmute": "Berhenti membisukan @{name}",
"account.unmute_notifications": "Berhenti bisukan pemberitahuan dari @{name}",
+ "account.unmute_short": "Bunyikan",
"account_note.placeholder": "Klik untuk menambah catatan",
- "admin.dashboard.retention": "Retention",
- "admin.dashboard.retention.average": "Average",
- "admin.dashboard.retention.cohort": "Sign-up month",
- "admin.dashboard.retention.cohort_size": "New users",
+ "admin.dashboard.daily_retention": "Tingkat retensi pengguna perhari setelah mendaftar",
+ "admin.dashboard.monthly_retention": "Tingkat retensi pengguna perbulan setelah mendaftar",
+ "admin.dashboard.retention.average": "Rata-rata",
+ "admin.dashboard.retention.cohort": "Bulan pendaftaran",
+ "admin.dashboard.retention.cohort_size": "Pengguna baru",
"alert.rate_limited.message": "Mohon ulangi setelah {retry_time, time, medium}.",
"alert.rate_limited.title": "Batasan tingkat",
"alert.unexpected.message": "Terjadi kesalahan yang tidak terduga.",
"alert.unexpected.title": "Ups!",
"announcement.announcement": "Pengumuman",
- "attachments_list.unprocessed": "(unprocessed)",
+ "attachments_list.unprocessed": "(tidak diproses)",
"autosuggest_hashtag.per_week": "{count} per minggu",
"boost_modal.combo": "Anda dapat menekan {combo} untuk melewati ini",
"bundle_column_error.body": "Kesalahan terjadi saat memuat komponen ini.",
@@ -65,7 +67,7 @@
"bundle_modal_error.close": "Tutup",
"bundle_modal_error.message": "Kesalahan terjadi saat memuat komponen ini.",
"bundle_modal_error.retry": "Coba lagi",
- "column.blocks": "Pengguna diblokir",
+ "column.blocks": "Pengguna yang diblokir",
"column.bookmarks": "Markah",
"column.community": "Linimasa Lokal",
"column.direct": "Pesan langsung",
@@ -92,18 +94,19 @@
"community.column_settings.remote_only": "Hanya jarak jauh",
"compose_form.direct_message_warning": "This toot will only be visible to all the mentioned users.",
"compose_form.direct_message_warning_learn_more": "Pelajari selengkapnya",
- "compose_form.hashtag_warning": "Toot ini tidak akan ada dalam daftar tagar manapun karena telah di set sebagai tidak terdaftar. Hanya postingan publik yang bisa dicari dengan tagar.",
+ "compose_form.hashtag_warning": "Toot ini tidak akan ada dalam daftar tagar manapun karena telah diatur sebagai tidak terdaftar. Hanya postingan publik yang bisa dicari dengan tagar.",
"compose_form.lock_disclaimer": "Akun anda tidak {locked}. Semua orang dapat mengikuti anda untuk melihat postingan khusus untuk pengikut anda.",
"compose_form.lock_disclaimer.lock": "terkunci",
"compose_form.placeholder": "Apa yang ada di pikiran anda?",
"compose_form.poll.add_option": "Tambahkan pilihan",
- "compose_form.poll.duration": "Durasi jajak pendapat",
+ "compose_form.poll.duration": "Durasi polling",
"compose_form.poll.option_placeholder": "Pilihan {number}",
"compose_form.poll.remove_option": "Hapus opsi ini",
"compose_form.poll.switch_to_multiple": "Ubah japat menjadi pilihan ganda",
"compose_form.poll.switch_to_single": "Ubah japat menjadi pilihan tunggal",
"compose_form.publish": "Toot",
"compose_form.publish_loud": "{publish}!",
+ "compose_form.save_changes": "Simpan perubahan",
"compose_form.sensitive.hide": "{count, plural, other {Tandai media sebagai sensitif}}",
"compose_form.sensitive.marked": "{count, plural, other {Media ini ditandai sebagai sensitif}}",
"compose_form.sensitive.unmarked": "{count, plural, other {Media ini tidak ditandai sebagai sensitif}}",
@@ -118,8 +121,8 @@
"confirmations.delete.message": "Apa anda yakin untuk menghapus status ini?",
"confirmations.delete_list.confirm": "Hapus",
"confirmations.delete_list.message": "Apakah anda yakin untuk menghapus daftar ini secara permanen?",
- "confirmations.discard_edit_media.confirm": "Discard",
- "confirmations.discard_edit_media.message": "You have unsaved changes to the media description or preview, discard them anyway?",
+ "confirmations.discard_edit_media.confirm": "Buang",
+ "confirmations.discard_edit_media.message": "Anda belum menyimpan perubahan deskripsi atau pratinjau media, buang saja?",
"confirmations.domain_block.confirm": "Sembunyikan keseluruhan domain",
"confirmations.domain_block.message": "Apakah anda benar benar yakin untuk memblokir keseluruhan {domain}? Dalam kasus tertentu beberapa pemblokiran atau penyembunyian lebih baik.",
"confirmations.logout.confirm": "Keluar",
@@ -127,8 +130,8 @@
"confirmations.mute.confirm": "Bisukan",
"confirmations.mute.explanation": "Ini akan menyembunyikan pos dari mereka dan pos yang menyebut mereka, tapi ini tetap mengizinkan mereka melihat posmu dan mengikutimu.",
"confirmations.mute.message": "Apa anda yakin ingin membisukan {name}?",
- "confirmations.redraft.confirm": "Hapus dan konsep ulang",
- "confirmations.redraft.message": "Are you sure you want to delete this status and re-draft it? You will lose all replies, boosts and favourites to it.",
+ "confirmations.redraft.confirm": "Hapus dan susun ulang",
+ "confirmations.redraft.message": "Apakah anda yakin ingin menghapus dan menyusun ulang? Favorit dan boost akan hilang, dan balasan terhadap kiriman asli akan ditinggalkan.",
"confirmations.reply.confirm": "Balas",
"confirmations.reply.message": "Membalas sekarang akan menimpa pesan yang sedang Anda buat. Anda yakin ingin melanjutkan?",
"confirmations.unfollow.confirm": "Berhenti mengikuti",
@@ -141,8 +144,8 @@
"directory.local": "Dari {domain} saja",
"directory.new_arrivals": "Yang baru datang",
"directory.recently_active": "Baru-baru ini aktif",
- "embed.instructions": "Sematkan status ini di website anda dengan menyalin kode di bawah ini.",
- "embed.preview": "Seperti ini nantinya:",
+ "embed.instructions": "Sematkan kiriman ini di website anda dengan menyalin kode di bawah ini.",
+ "embed.preview": "Tampilan akan seperti ini nantinya:",
"emoji_button.activity": "Aktivitas",
"emoji_button.custom": "Kustom",
"emoji_button.flags": "Bendera",
@@ -165,9 +168,10 @@
"empty_column.community": "Linimasa lokal masih kosong. Tulis sesuatu secara publik dan buat roda berputar!",
"empty_column.direct": "Anda belum memiliki pesan langsung. Ketika Anda mengirim atau menerimanya, maka akan muncul di sini.",
"empty_column.domain_blocks": "Tidak ada topik tersembunyi.",
+ "empty_column.explore_statuses": "Tidak ada yang sedang tren pada saat ini. Silakan mengecek lagi nanti!",
"empty_column.favourited_statuses": "Anda belum memiliki toot favorit. Ketika Anda mengirim atau menerimanya, maka akan muncul di sini.",
- "empty_column.favourites": "Tidak ada seorangpun yang memfavoritkan toot ini. Ketika seseorang melakukannya, maka akan muncul disini.",
- "empty_column.follow_recommendations": "Sepertinya tak ada saran yang dibuat untuk Anda. Anda dapat coba menggunakan pencarian untuk menemukan orang yang Anda ketahui atau menjelajahi tagar yang sedang tren.",
+ "empty_column.favourites": "Belum ada yang memfavoritkan toot ini. Ketika seseorang melakukannya, akan muncul disini.",
+ "empty_column.follow_recommendations": "Sepertinya tak ada saran yang dibuat untuk Anda. Anda dapat mencoba menggunakan pencarian untuk menemukan orang yang Anda ketahui atau menjelajahi tagar yang sedang tren.",
"empty_column.follow_requests": "Anda belum memiliki permintaan mengikuti. Ketika Anda menerimanya, maka akan muncul disini.",
"empty_column.hashtag": "Tidak ada apapun dalam hashtag ini.",
"empty_column.home": "Linimasa anda kosong! Kunjungi {public} atau gunakan pencarian untuk memulai dan bertemu pengguna lain.",
@@ -183,6 +187,12 @@
"error.unexpected_crash.next_steps_addons": "Coba nonaktifkan mereka lalu segarkan halaman. Jika tak membantu, Anda masih bisa memakai Mastodon dengan peramban berbeda atau aplikasi murni.",
"errors.unexpected_crash.copy_stacktrace": "Salin stacktrace ke papan klip",
"errors.unexpected_crash.report_issue": "Laporkan masalah",
+ "explore.search_results": "Hasil pencarian",
+ "explore.suggested_follows": "Untuk Anda",
+ "explore.title": "Jelajahi",
+ "explore.trending_links": "Berita",
+ "explore.trending_statuses": "Postingan",
+ "explore.trending_tags": "Tagar",
"follow_recommendations.done": "Selesai",
"follow_recommendations.heading": "Ikuti orang yang ingin Anda lihat kirimannya! Ini ada beberapa saran.",
"follow_recommendations.lead": "Kiriman dari orang yang Anda ikuti akan tampil berdasar waktu di beranda Anda. Jangan takut membuat kesalahan, Anda dapat berhenti mengikuti mereka dengan mudah kapan saja!",
@@ -284,6 +294,7 @@
"navigation_bar.discover": "Temukan",
"navigation_bar.domain_blocks": "Domain tersembunyi",
"navigation_bar.edit_profile": "Ubah profil",
+ "navigation_bar.explore": "Jelajahi",
"navigation_bar.favourites": "Favorit",
"navigation_bar.filters": "Kata yang dibisukan",
"navigation_bar.follow_requests": "Permintaan mengikuti",
@@ -298,6 +309,7 @@
"navigation_bar.preferences": "Pengaturan",
"navigation_bar.public_timeline": "Linimasa gabungan",
"navigation_bar.security": "Keamanan",
+ "notification.admin.sign_up": "{name} mendaftar",
"notification.favourite": "{name} menyukai status anda",
"notification.follow": "{name} mengikuti anda",
"notification.follow_request": "{name} ingin mengikuti Anda",
@@ -306,13 +318,15 @@
"notification.poll": "Japat yang Anda ikuti telah berakhir",
"notification.reblog": "{name} mem-boost status anda",
"notification.status": "{name} baru saja memposting",
+ "notification.update": "{name} mengedit kiriman",
"notifications.clear": "Hapus notifikasi",
"notifications.clear_confirmation": "Apa anda yakin hendak menghapus semua notifikasi anda?",
+ "notifications.column_settings.admin.sign_up": "Pendaftaran baru:",
"notifications.column_settings.alert": "Notifikasi desktop",
"notifications.column_settings.favourite": "Favorit:",
"notifications.column_settings.filter_bar.advanced": "Tampilkan semua kategori",
"notifications.column_settings.filter_bar.category": "Bilah penyaring cepat",
- "notifications.column_settings.filter_bar.show": "Tampilkan",
+ "notifications.column_settings.filter_bar.show_bar": "Tampilkan bilah filter",
"notifications.column_settings.follow": "Pengikut baru:",
"notifications.column_settings.follow_request": "Permintaan mengikuti baru:",
"notifications.column_settings.mention": "Balasan:",
@@ -322,7 +336,9 @@
"notifications.column_settings.show": "Tampilkan dalam kolom",
"notifications.column_settings.sound": "Mainkan suara",
"notifications.column_settings.status": "Toot baru:",
- "notifications.column_settings.unread_markers.category": "Penanda notifikasi belum dibaca",
+ "notifications.column_settings.unread_notifications.category": "Notifikasi yang belum dibaca",
+ "notifications.column_settings.unread_notifications.highlight": "Sorot notifikasi yang belum dibaca",
+ "notifications.column_settings.update": "Edit:",
"notifications.filter.all": "Semua",
"notifications.filter.boosts": "Boost",
"notifications.filter.favourites": "Favorit",
@@ -346,7 +362,7 @@
"poll.total_votes": "{count, plural, other {# suara}}",
"poll.vote": "Memilih",
"poll.voted": "Anda memilih jawaban ini",
- "poll.votes": "{votes, plural, one {# vote} other {# votes}}",
+ "poll.votes": "{votes, plural, other {# suara}}",
"poll_button.add_poll": "Tambah japat",
"poll_button.remove_poll": "Hapus japat",
"privacy.change": "Tentukan privasi status",
@@ -362,18 +378,54 @@
"regeneration_indicator.label": "Memuat…",
"regeneration_indicator.sublabel": "Linimasa anda sedang disiapkan!",
"relative_time.days": "{number}h",
+ "relative_time.full.days": "{number, plural, other {# hari}} yang lalu",
+ "relative_time.full.hours": "{number, plural, other {# jam}} yang lalu",
+ "relative_time.full.just_now": "baru saja",
+ "relative_time.full.minutes": "{number, plural, other {# menit}} yang lalu",
+ "relative_time.full.seconds": "{number, plural, other {# detik}} yang lalu",
"relative_time.hours": "{number}j",
"relative_time.just_now": "sekarang",
"relative_time.minutes": "{number}m",
"relative_time.seconds": "{number}d",
"relative_time.today": "hari ini",
"reply_indicator.cancel": "Batal",
+ "report.block": "Blokir",
+ "report.block_explanation": "Anda tidak akan melihat postingan mereka. Mereka tidak akan bisa melihat postingan Anda atau mengikuti Anda. Mereka akan mampu menduga bahwa mereka diblokir.",
+ "report.categories.other": "Lainnya",
+ "report.categories.spam": "Spam",
+ "report.categories.violation": "Konten melanggar satu atau lebih peraturan server",
+ "report.category.subtitle": "Pilih pasangan terbaik",
+ "report.category.title": "Beritahu kami apa yang terjadi dengan {type} ini",
+ "report.category.title_account": "profil",
+ "report.category.title_status": "postingan",
+ "report.close": "Selesai",
+ "report.comment.title": "Adakah hal lain yang perlu kami ketahui?",
"report.forward": "Teruskan ke {target}",
"report.forward_hint": "Akun dari server lain. Kirim salinan laporan scr anonim ke sana?",
- "report.hint": "The report will be sent to your instance moderators. You can provide an explanation of why you are reporting this account below:",
+ "report.mute": "Bisukan",
+ "report.mute_explanation": "Anda tidak akan melihat postingan mereka. Mereka masih dapat mengikuti Anda dan melihat postingan Anda dan tidak akan mengetahui bahwa mereka dibisukan.",
+ "report.next": "Selanjutnya",
"report.placeholder": "Komentar tambahan",
+ "report.reasons.dislike": "Saya tidak menyukainya",
+ "report.reasons.dislike_description": "Ini bukan hal yang ingin Anda lihat",
+ "report.reasons.other": "Itu sesuatu yang lain",
+ "report.reasons.other_description": "Permasalahan ini tidak sesuai pada kategori lain",
+ "report.reasons.spam": "Ini spam",
+ "report.reasons.spam_description": "Tautan berbahaya, interaksi palsu, atau balasan berulang",
+ "report.reasons.violation": "Melanggar ketentuan server",
+ "report.reasons.violation_description": "Anda menyadari bahwa ia melanggar ketentuan tertentu",
+ "report.rules.subtitle": "Pilih semua yang berlaku",
+ "report.rules.title": "Ketentuan manakah yang dilanggar?",
+ "report.statuses.subtitle": "Pilih semua yang berlaku",
+ "report.statuses.title": "Adakah postingan yang mendukung pelaporan ini?",
"report.submit": "Kirim",
"report.target": "Melaporkan",
+ "report.thanks.take_action": "Berikut adalah pilihan Anda untuk mengatur apa yang Anda lihat di Mastodon:",
+ "report.thanks.take_action_actionable": "Ketika kami meninjau ini, Anda dapat mengambil tindakan terhadap @{name}:",
+ "report.thanks.title": "Tidak ingin melihat ini?",
+ "report.thanks.title_actionable": "Terima kasih atas pelaporan Anda, kami akan memeriksa ini lebih lanjut.",
+ "report.unfollow": "Berhenti mengikuti @{name}",
+ "report.unfollow_explanation": "Anda mengikuti akun ini. Untuk tidak melihat postingan mereka di Beranda Anda, berhenti mengikuti mereka.",
"search.placeholder": "Pencarian",
"search_popout.search_format": "Format pencarian mahir",
"search_popout.tips.full_text": "Teks simpel menampilkan status yang Anda tulis, favoritkan, boost-kan, atau status yang menyebut Anda, serta nama pengguna, nama yang ditampilkan, dan tagar yang cocok.",
@@ -382,7 +434,9 @@
"search_popout.tips.text": "Teks sederhana menampilkan nama yang ditampilkan, nama pengguna, dan tagar yang cocok",
"search_popout.tips.user": "pengguna",
"search_results.accounts": "Orang",
+ "search_results.all": "Semua",
"search_results.hashtags": "Tagar",
+ "search_results.nothing_found": "Tidak dapat menemukan apapun untuk istilah-istilah pencarian ini",
"search_results.statuses": "Toot",
"search_results.statuses_fts_disabled": "Pencarian toot berdasarkan konten tidak diaktifkan di server Mastadon ini.",
"search_results.total": "{count, number} {count, plural, one {hasil} other {hasil}}",
@@ -396,9 +450,14 @@
"status.delete": "Hapus",
"status.detailed_status": "Tampilan detail percakapan",
"status.direct": "Pesan langsung @{name}",
+ "status.edit": "Edit",
+ "status.edited": "Diedit {date}",
+ "status.edited_x_times": "Diedit {count, plural, other {{count} kali}}",
"status.embed": "Tanam",
"status.favourite": "Difavoritkan",
"status.filtered": "Disaring",
+ "status.history.created": "{name} membuat pada {date}",
+ "status.history.edited": "{name} mengedit pada {date}",
"status.load_more": "Tampilkan semua",
"status.media_hidden": "Media disembunyikan",
"status.mention": "Balasan @{name}",
@@ -462,7 +521,7 @@
"upload_form.video_description": "Penjelasan untuk orang dengan gangguan pendengaran atau penglihatan",
"upload_modal.analyzing_picture": "Analisis gambar…",
"upload_modal.apply": "Terapkan",
- "upload_modal.applying": "Applying…",
+ "upload_modal.applying": "Menerapkan…",
"upload_modal.choose_image": "Pilih gambar",
"upload_modal.description_placeholder": "Muharjo seorang xenofobia universal yang takut pada warga jazirah, contohnya Qatar",
"upload_modal.detect_text": "Deteksi teks pada gambar",
diff --git a/app/javascript/mastodon/locales/io.json b/app/javascript/mastodon/locales/io.json
index a0c7c4912..77c6871a4 100644
--- a/app/javascript/mastodon/locales/io.json
+++ b/app/javascript/mastodon/locales/io.json
@@ -18,12 +18,12 @@
"account.followers": "Sequanti",
"account.followers.empty": "No one follows this user yet.",
"account.followers_counter": "{count, plural, one {{counter} Follower} other {{counter} Followers}}",
+ "account.following": "Following",
"account.following_counter": "{count, plural, one {{counter} Following} other {{counter} Following}}",
"account.follows.empty": "This user doesn't follow anyone yet.",
"account.follows_you": "Sequas tu",
"account.hide_reblogs": "Hide boosts from @{name}",
"account.joined": "Joined {date}",
- "account.last_status": "Last active",
"account.link_verified_on": "Ownership of this link was checked on {date}",
"account.locked_info": "This account privacy status is set to locked. The owner manually reviews who can follow them.",
"account.media": "Media",
@@ -32,7 +32,6 @@
"account.mute": "Celar @{name}",
"account.mute_notifications": "Mute notifications from @{name}",
"account.muted": "Muted",
- "account.never_active": "Never",
"account.posts": "Mesaji",
"account.posts_with_replies": "Toots with replies",
"account.report": "Denuncar @{name}",
@@ -42,12 +41,15 @@
"account.statuses_counter": "{count, plural, one {{counter} Toot} other {{counter} Toots}}",
"account.unblock": "Desblokusar @{name}",
"account.unblock_domain": "Unhide {domain}",
+ "account.unblock_short": "Unblock",
"account.unendorse": "Don't feature on profile",
"account.unfollow": "Ne plus sequar",
"account.unmute": "Ne plus celar @{name}",
"account.unmute_notifications": "Unmute notifications from @{name}",
+ "account.unmute_short": "Unmute",
"account_note.placeholder": "Click to add a note",
- "admin.dashboard.retention": "Retention",
+ "admin.dashboard.daily_retention": "User retention rate by day after sign-up",
+ "admin.dashboard.monthly_retention": "User retention rate by month after sign-up",
"admin.dashboard.retention.average": "Average",
"admin.dashboard.retention.cohort": "Sign-up month",
"admin.dashboard.retention.cohort_size": "New users",
@@ -104,6 +106,7 @@
"compose_form.poll.switch_to_single": "Change poll to allow for a single choice",
"compose_form.publish": "Siflar",
"compose_form.publish_loud": "{publish}!",
+ "compose_form.save_changes": "Save changes",
"compose_form.sensitive.hide": "{count, plural, one {Mark media as sensitive} other {Mark media as sensitive}}",
"compose_form.sensitive.marked": "{count, plural, one {Media is marked as sensitive} other {Media is marked as sensitive}}",
"compose_form.sensitive.unmarked": "{count, plural, one {Media is not marked as sensitive} other {Media is not marked as sensitive}}",
@@ -165,6 +168,7 @@
"empty_column.community": "La lokala tempolineo esas vakua. Skribez ulo publike por iniciar la agiveso!",
"empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.",
"empty_column.domain_blocks": "There are no hidden domains yet.",
+ "empty_column.explore_statuses": "Nothing is trending right now. Check back later!",
"empty_column.favourited_statuses": "You don't have any favourite toots yet. When you favourite one, it will show up here.",
"empty_column.favourites": "No one has favourited this toot yet. When someone does, they will show up here.",
"empty_column.follow_recommendations": "Looks like no suggestions could be generated for you. You can try using search to look for people you might know or explore trending hashtags.",
@@ -183,6 +187,12 @@
"error.unexpected_crash.next_steps_addons": "Try disabling them and refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
"errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard",
"errors.unexpected_crash.report_issue": "Report issue",
+ "explore.search_results": "Search results",
+ "explore.suggested_follows": "For you",
+ "explore.title": "Explore",
+ "explore.trending_links": "News",
+ "explore.trending_statuses": "Posts",
+ "explore.trending_tags": "Hashtags",
"follow_recommendations.done": "Done",
"follow_recommendations.heading": "Follow people you'd like to see posts from! Here are some suggestions.",
"follow_recommendations.lead": "Posts from people you follow will show up in chronological order on your home feed. Don't be afraid to make mistakes, you can unfollow people just as easily any time!",
@@ -284,6 +294,7 @@
"navigation_bar.discover": "Discover",
"navigation_bar.domain_blocks": "Hidden domains",
"navigation_bar.edit_profile": "Modifikar profilo",
+ "navigation_bar.explore": "Explore",
"navigation_bar.favourites": "Favorati",
"navigation_bar.filters": "Muted words",
"navigation_bar.follow_requests": "Demandi di sequado",
@@ -298,6 +309,7 @@
"navigation_bar.preferences": "Preferi",
"navigation_bar.public_timeline": "Federata tempolineo",
"navigation_bar.security": "Security",
+ "notification.admin.sign_up": "{name} signed up",
"notification.favourite": "{name} favorizis tua mesajo",
"notification.follow": "{name} sequeskis tu",
"notification.follow_request": "{name} has requested to follow you",
@@ -306,13 +318,15 @@
"notification.poll": "A poll you have voted in has ended",
"notification.reblog": "{name} repetis tua mesajo",
"notification.status": "{name} just posted",
+ "notification.update": "{name} edited a post",
"notifications.clear": "Efacar savigi",
"notifications.clear_confirmation": "Ka tu esas certa, ke tu volas efacar omna tua savigi?",
+ "notifications.column_settings.admin.sign_up": "New sign-ups:",
"notifications.column_settings.alert": "Surtabla savigi",
"notifications.column_settings.favourite": "Favorati:",
"notifications.column_settings.filter_bar.advanced": "Display all categories",
"notifications.column_settings.filter_bar.category": "Quick filter bar",
- "notifications.column_settings.filter_bar.show": "Show",
+ "notifications.column_settings.filter_bar.show_bar": "Show filter bar",
"notifications.column_settings.follow": "Nova sequanti:",
"notifications.column_settings.follow_request": "New follow requests:",
"notifications.column_settings.mention": "Mencioni:",
@@ -322,7 +336,9 @@
"notifications.column_settings.show": "Montrar en kolumno",
"notifications.column_settings.sound": "Plear sono",
"notifications.column_settings.status": "New toots:",
- "notifications.column_settings.unread_markers.category": "Unread notification markers",
+ "notifications.column_settings.unread_notifications.category": "Unread notifications",
+ "notifications.column_settings.unread_notifications.highlight": "Highlight unread notifications",
+ "notifications.column_settings.update": "Edits:",
"notifications.filter.all": "All",
"notifications.filter.boosts": "Boosts",
"notifications.filter.favourites": "Favourites",
@@ -362,18 +378,54 @@
"regeneration_indicator.label": "Loading…",
"regeneration_indicator.sublabel": "Your home feed is being prepared!",
"relative_time.days": "{number}d",
+ "relative_time.full.days": "{number, plural, one {# day} other {# days}} ago",
+ "relative_time.full.hours": "{number, plural, one {# hour} other {# hours}} ago",
+ "relative_time.full.just_now": "just now",
+ "relative_time.full.minutes": "{number, plural, one {# minute} other {# minutes}} ago",
+ "relative_time.full.seconds": "{number, plural, one {# second} other {# seconds}} ago",
"relative_time.hours": "{number}h",
"relative_time.just_now": "now",
"relative_time.minutes": "{number}m",
"relative_time.seconds": "{number}s",
"relative_time.today": "today",
"reply_indicator.cancel": "Nihiligar",
+ "report.block": "Block",
+ "report.block_explanation": "You will not see their posts. They will not be able to see your posts or follow you. They will be able to tell that they are blocked.",
+ "report.categories.other": "Other",
+ "report.categories.spam": "Spam",
+ "report.categories.violation": "Content violates one or more server rules",
+ "report.category.subtitle": "Choose the best match",
+ "report.category.title": "Tell us what's going on with this {type}",
+ "report.category.title_account": "profile",
+ "report.category.title_status": "post",
+ "report.close": "Done",
+ "report.comment.title": "Is there anything else you think we should know?",
"report.forward": "Forward to {target}",
"report.forward_hint": "The account is from another server. Send an anonymized copy of the report there as well?",
- "report.hint": "The report will be sent to your instance moderators. You can provide an explanation of why you are reporting this account below:",
+ "report.mute": "Mute",
+ "report.mute_explanation": "You will not see their posts. They can still follow you and see your posts and will not know that they are muted.",
+ "report.next": "Next",
"report.placeholder": "Plusa komenti",
+ "report.reasons.dislike": "I don't like it",
+ "report.reasons.dislike_description": "It is not something you want to see",
+ "report.reasons.other": "It's something else",
+ "report.reasons.other_description": "The issue does not fit into other categories",
+ "report.reasons.spam": "It's spam",
+ "report.reasons.spam_description": "Malicious links, fake engagement, or repetitive replies",
+ "report.reasons.violation": "It violates server rules",
+ "report.reasons.violation_description": "You are aware that it breaks specific rules",
+ "report.rules.subtitle": "Select all that apply",
+ "report.rules.title": "Which rules are being violated?",
+ "report.statuses.subtitle": "Select all that apply",
+ "report.statuses.title": "Are there any posts that back up this report?",
"report.submit": "Sendar",
"report.target": "Denuncante",
+ "report.thanks.take_action": "Here are your options for controlling what you see on Mastodon:",
+ "report.thanks.take_action_actionable": "While we review this, you can take action against @{name}:",
+ "report.thanks.title": "Don't want to see this?",
+ "report.thanks.title_actionable": "Thanks for reporting, we'll look into this.",
+ "report.unfollow": "Unfollow @{name}",
+ "report.unfollow_explanation": "You are following this account. To not see their posts in your home feed anymore, unfollow them.",
"search.placeholder": "Serchez",
"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.",
@@ -382,7 +434,9 @@
"search_popout.tips.text": "Simple text returns matching display names, usernames and hashtags",
"search_popout.tips.user": "user",
"search_results.accounts": "People",
+ "search_results.all": "All",
"search_results.hashtags": "Hashtags",
+ "search_results.nothing_found": "Could not find anything for these search terms",
"search_results.statuses": "Toots",
"search_results.statuses_fts_disabled": "Searching toots by their content is not enabled on this Mastodon server.",
"search_results.total": "{count, number} {count, plural, one {rezulto} other {rezulti}}",
@@ -396,9 +450,14 @@
"status.delete": "Efacar",
"status.detailed_status": "Detailed conversation view",
"status.direct": "Direct message @{name}",
+ "status.edit": "Edit",
+ "status.edited": "Edited {date}",
+ "status.edited_x_times": "Edited {count, plural, one {{count} time} other {{count} times}}",
"status.embed": "Embed",
"status.favourite": "Favorizar",
"status.filtered": "Filtered",
+ "status.history.created": "{name} created {date}",
+ "status.history.edited": "{name} edited {date}",
"status.load_more": "Kargar pluse",
"status.media_hidden": "Kontenajo celita",
"status.mention": "Mencionar @{name}",
diff --git a/app/javascript/mastodon/locales/is.json b/app/javascript/mastodon/locales/is.json
index 9aeca30ac..bf1b892e6 100644
--- a/app/javascript/mastodon/locales/is.json
+++ b/app/javascript/mastodon/locales/is.json
@@ -1,16 +1,16 @@
{
"account.account_note_header": "Minnispunktur",
"account.add_or_remove_from_list": "Bæta við eða fjarlægja af listum",
- "account.badges.bot": "Þjarkur",
+ "account.badges.bot": "Róbót",
"account.badges.group": "Hópur",
"account.block": "Loka á @{name}",
- "account.block_domain": "Fela allt frá {domain}",
- "account.blocked": "Lokað á",
+ "account.block_domain": "Útiloka lénið {domain}",
+ "account.blocked": "Útilokaður",
"account.browse_more_on_origin_server": "Skoða nánari upplýsingar á notandasniðinu",
"account.cancel_follow_request": "Hætta við beiðni um að fylgjas",
"account.direct": "Bein skilaboð til @{name}",
- "account.disable_notifications": "Hættu að láta mig vita þegar @{name} þýtur",
- "account.domain_blocked": "Lén falið",
+ "account.disable_notifications": "Hætta að láta mig vita þegar @{name} sendir inn",
+ "account.domain_blocked": "Lén útilokað",
"account.edit_profile": "Breyta notandasniði",
"account.enable_notifications": "Láta mig vita þegar @{name} sendir inn",
"account.endorse": "Birta á notandasniði",
@@ -18,12 +18,12 @@
"account.followers": "Fylgjendur",
"account.followers.empty": "Ennþá fylgist enginn með þessum notanda.",
"account.followers_counter": "{count, plural, one {{counter} fylgjandi} other {{counter} fylgjendur}}",
+ "account.following": "Fylgist með",
"account.following_counter": "{count, plural, one {{counter} fylgist með} other {{counter} fylgjast með}}",
"account.follows.empty": "Þessi notandi fylgist ennþá ekki með neinum.",
"account.follows_you": "Fylgir þér",
"account.hide_reblogs": "Fela endurbirtingar fyrir @{name}",
"account.joined": "Gerðist þátttakandi {date}",
- "account.last_status": "Síðasta virkni",
"account.link_verified_on": "Eignarhald á þessum tengli var athugað þann {date}",
"account.locked_info": "Staða gagnaleyndar á þessum aðgangi er stillt á læsingu. Eigandinn yfirfer handvirkt hverjir geti fylgst með honum.",
"account.media": "Myndskrár",
@@ -32,31 +32,33 @@
"account.mute": "Þagga niður í @{name}",
"account.mute_notifications": "Þagga tilkynningar frá @{name}",
"account.muted": "Þaggað",
- "account.never_active": "Aldrei",
- "account.posts": "Þyt",
- "account.posts_with_replies": "Þyt og svör",
+ "account.posts": "Færslur",
+ "account.posts_with_replies": "Færslur og svör",
"account.report": "Kæra @{name}",
"account.requested": "Bíður eftir samþykki. Smelltu til að hætta við beiðni um að fylgjast með",
"account.share": "Deila notandasniði fyrir @{name}",
"account.show_reblogs": "Sýna endurbirtingar frá @{name}",
- "account.statuses_counter": "{count, plural, one {{counter} tíst} other {{counter} tíst}}",
+ "account.statuses_counter": "{count, plural, one {{counter} færsla} other {{counter} færslur}}",
"account.unblock": "Aflétta útilokun af @{name}",
- "account.unblock_domain": "Hætta að fela {domain}",
+ "account.unblock_domain": "Aflétta útilokun lénsins {domain}",
+ "account.unblock_short": "Hætta að loka á",
"account.unendorse": "Ekki birta á notandasniði",
"account.unfollow": "Hætta að fylgja",
"account.unmute": "Hætta að þagga niður í @{name}",
"account.unmute_notifications": "Hætta að þagga tilkynningar frá @{name}",
- "account_note.placeholder": "Engin athugasemd gefin",
- "admin.dashboard.retention": "Retention",
- "admin.dashboard.retention.average": "Average",
- "admin.dashboard.retention.cohort": "Sign-up month",
- "admin.dashboard.retention.cohort_size": "New users",
+ "account.unmute_short": "Hætta að þagga niður",
+ "account_note.placeholder": "Smelltu til að bæta við minnispunkti",
+ "admin.dashboard.daily_retention": "Hlutfall virkra notenda eftir nýskráningu eftir dögum",
+ "admin.dashboard.monthly_retention": "Hlutfall virkra notenda eftir nýskráningu eftir mánuðum",
+ "admin.dashboard.retention.average": "Meðaltal",
+ "admin.dashboard.retention.cohort": "Mánuður nýskráninga",
+ "admin.dashboard.retention.cohort_size": "Nýir notendur",
"alert.rate_limited.message": "Prófaðu aftur eftir {retry_time, time, medium}.",
"alert.rate_limited.title": "Með takmörkum",
"alert.unexpected.message": "Upp kom óvænt villa.",
"alert.unexpected.title": "Úbbs!",
"announcement.announcement": "Auglýsing",
- "attachments_list.unprocessed": "(unprocessed)",
+ "attachments_list.unprocessed": "(óunnið)",
"autosuggest_hashtag.per_week": "{count} á viku",
"boost_modal.combo": "Þú getur ýtt á {combo} til að sleppa þessu næst",
"bundle_column_error.body": "Eitthvað fór úrskeiðis við að hlaða inn þessari einingu.",
@@ -70,14 +72,14 @@
"column.community": "Staðvær tímalína",
"column.direct": "Bein skilaboð",
"column.directory": "Skoða notandasnið",
- "column.domain_blocks": "Falin lén",
- "column.favourites": "Fílanir",
- "column.follow_requests": "Fylgja beiðnum",
+ "column.domain_blocks": "Útilokuð lén",
+ "column.favourites": "Eftirlæti",
+ "column.follow_requests": "Beiðnir um að fylgjast með",
"column.home": "Heim",
"column.lists": "Listar",
"column.mutes": "Þaggaðir notendur",
"column.notifications": "Tilkynningar",
- "column.pins": "Föst tíst",
+ "column.pins": "Festar færslur",
"column.public": "Sameiginleg tímalína",
"column_back_button.label": "Til baka",
"column_header.hide_settings": "Fela stillingar",
@@ -90,9 +92,9 @@
"community.column_settings.local_only": "Einungis staðvært",
"community.column_settings.media_only": "Einungis myndskrár",
"community.column_settings.remote_only": "Einungis fjartengt",
- "compose_form.direct_message_warning": "Þetta tíst verður aðeins sent á notendur sem minnst er á.",
+ "compose_form.direct_message_warning": "Þessi færsla verður aðeins send á notendur sem minnst er á.",
"compose_form.direct_message_warning_learn_more": "Kanna nánar",
- "compose_form.hashtag_warning": "Þetta tíst verður ekki talið með undir nokkru myllumerki þar sem það er óskráð. Einungis er hægt að leita að opinberum tístum eftir myllumerkjum.",
+ "compose_form.hashtag_warning": "Þessi færsla verður ekki talin með undir nokkru myllumerki þar sem það er óskráð. Einungis er hægt að leita að opinberum færslum eftir myllumerkjum.",
"compose_form.lock_disclaimer": "Aðgangurinn þinn er ekki {locked}. Hver sem er getur fylgst með þeim færslum þínum sem einungis eru til fylgjenda þinna.",
"compose_form.lock_disclaimer.lock": "læst",
"compose_form.placeholder": "Hvað varstu að hugsa?",
@@ -102,25 +104,26 @@
"compose_form.poll.remove_option": "Fjarlægja þennan valkost",
"compose_form.poll.switch_to_multiple": "Breyta könnun svo hægt sé að hafa marga valkosti",
"compose_form.poll.switch_to_single": "Breyta könnun svo hægt sé að hafa einn stakan valkost",
- "compose_form.publish": "Þyt",
+ "compose_form.publish": "Tíst",
"compose_form.publish_loud": "{publish}!",
- "compose_form.sensitive.hide": "Merkja myndir sem viðkvæmar",
- "compose_form.sensitive.marked": "Mynd er merkt sem viðkvæm",
- "compose_form.sensitive.unmarked": "Mynd er ekki merkt sem viðkvæm",
- "compose_form.spoiler.marked": "Texti er falinn á bak við aðvörun",
- "compose_form.spoiler.unmarked": "Texti er ekki falinn",
+ "compose_form.save_changes": "Vista breytingar",
+ "compose_form.sensitive.hide": "{count, plural, one {Merkja mynd sem viðkvæma} other {Merkja myndir sem viðkvæmar}}",
+ "compose_form.sensitive.marked": "{count, plural, one {Mynd er merkt sem viðkvæm} other {Myndir eru merktar sem viðkvæmar}}",
+ "compose_form.sensitive.unmarked": "{count, plural, one {Mynd er ekki merkt sem viðkvæm} other {Myndir eru ekki merktar sem viðkvæmar}}",
+ "compose_form.spoiler.marked": "Fjarlægja aðvörun vegna efnis",
+ "compose_form.spoiler.unmarked": "Bæta við aðvörun vegna efnis",
"compose_form.spoiler_placeholder": "Skrifaðu aðvörunina þína hér",
"confirmation_modal.cancel": "Hætta við",
"confirmations.block.block_and_report": "Útiloka og kæra",
"confirmations.block.confirm": "Útiloka",
"confirmations.block.message": "Ertu viss um að þú viljir loka á {name}?",
"confirmations.delete.confirm": "Eyða",
- "confirmations.delete.message": "Ertu viss um að þú viljir eyða þessari stöðufærslu?",
+ "confirmations.delete.message": "Ertu viss um að þú viljir eyða þessari færslu?",
"confirmations.delete_list.confirm": "Eyða",
"confirmations.delete_list.message": "Ertu viss um að þú viljir eyða þessum lista endanlega?",
- "confirmations.discard_edit_media.confirm": "Discard",
- "confirmations.discard_edit_media.message": "You have unsaved changes to the media description or preview, discard them anyway?",
- "confirmations.domain_block.confirm": "Fela allt lénið",
+ "confirmations.discard_edit_media.confirm": "Henda",
+ "confirmations.discard_edit_media.message": "Þú ert með óvistaðar breytingar á lýsingu myndefnis eða forskoðunar, henda þeim samt?",
+ "confirmations.domain_block.confirm": "Útiloka allt lénið",
"confirmations.domain_block.message": "Ertu alveg algjörlega viss um að þú viljir loka á allt {domain}? Í flestum tilfellum er vænlegra að nota færri en markvissari útilokanir eða að þagga niður tiltekna aðila. Þú munt ekki sjá efni frá þessu léni í neinum opinberum tímalínum eða í tilkynningunum þínum. Fylgjendur þínir frá þessu léni verða fjarlægðir.",
"confirmations.logout.confirm": "Skrá út",
"confirmations.logout.message": "Ertu viss um að þú viljir skrá þig út?",
@@ -128,7 +131,7 @@
"confirmations.mute.explanation": "Þetta mun fela færslur frá þeim og þær færslur þar sem minnst er á þau, en það mun samt sem áður gera þeim kleift að sjá færslurnar þínar og að fylgjast með þér.",
"confirmations.mute.message": "Ertu viss um að þú viljir þagga niður í {name}?",
"confirmations.redraft.confirm": "Eyða og enduvinna drög",
- "confirmations.redraft.message": "Ertu viss um að þú viljir eyða þessari stöðufærslu og enduvinna drögin? Fílanir og endurbirtingar munu glatast og svör við upprunalegu fæerslunni munu verða munaðarlaus.",
+ "confirmations.redraft.message": "Ertu viss um að þú viljir eyða þessari færslu og enduvinna drögin? Eftirlæti og endurbirtingar munu glatast og svör við upprunalegu færslunni munu verða munaðarlaus.",
"confirmations.reply.confirm": "Svara",
"confirmations.reply.message": "Ef þú svarar núna verður skrifað yfir skilaboðin sem þú ert að semja núna. Ertu viss um að þú viljir halda áfram?",
"confirmations.unfollow.confirm": "Hætta að fylgja",
@@ -149,7 +152,7 @@
"emoji_button.food": "Matur og drykkur",
"emoji_button.label": "Setja inn tjáningartákn",
"emoji_button.nature": "Náttúra",
- "emoji_button.not_found": "Engin tjáningartákn!! (╯°□°)╯︵ ┻━┻",
+ "emoji_button.not_found": "Engin samsvarandi tjáningartákn fundust",
"emoji_button.objects": "Hlutir",
"emoji_button.people": "Fólk",
"emoji_button.recent": "Oft notað",
@@ -158,21 +161,22 @@
"emoji_button.symbols": "Tákn",
"emoji_button.travel": "Ferðalög og staðir",
"empty_column.account_suspended": "Notandaaðgangur í bið",
- "empty_column.account_timeline": "Engin þyt hér!",
+ "empty_column.account_timeline": "Engar færslur hér!",
"empty_column.account_unavailable": "Notandasnið ekki tiltækt",
"empty_column.blocks": "Þú hefur ekki ennþá útilokað neina notendur.",
- "empty_column.bookmarked_statuses": "Þú ert ekki ennþá með nein bókamerkt þyt. Þegar þú gefur þyti bókamerki, mun það birtast hér.",
+ "empty_column.bookmarked_statuses": "Þú ert ekki ennþá með neinar bókamerktar færslur. Þegar þú bókamerkir færslu, mun það birtast hér.",
"empty_column.community": "Staðværa tímalínan er tóm. Skrifaðu eitthvað opinberlega til að láta boltann fara að rúlla!",
"empty_column.direct": "Þú átt ennþá engin bein skilaboð. Þegar þú sendir eða tekur á móti slíkum skilaboðum, munu þau birtast hér.",
- "empty_column.domain_blocks": "Það eru engin falin lén ennþá.",
- "empty_column.favourited_statuses": "Þú hefur ekki fílað nein þyt. Þegar að þú fílar þyt, þá mun það birtast hér.",
- "empty_column.favourites": "Enginn hefu fílað þetta þyt ennþá. Þegar einhver gerir það, mun sá birtast hér.",
+ "empty_column.domain_blocks": "Það eru ennþá engin útilokuð lén.",
+ "empty_column.explore_statuses": "Ekkert er á uppleið í augnablikinu. Athugaðu aftur síðar!",
+ "empty_column.favourited_statuses": "Þú ert ekki ennþá með neinar eftirlætisfærslur. Þegar þú setur færslu í eftirlæti, munu þau birtast hér.",
+ "empty_column.favourites": "Enginn hefur ennþá sett þessa færslu í eftirlæti. Þegar einhver gerir það, mun það birtast hér.",
"empty_column.follow_recommendations": "Það lítur út fyrir að ekki hafi verið hægt að útbúa neinar tillögur fyrir þig. Þú getur reynt að leita að fólki sem þú gætir þekkt eða skoðað myllumerki sem eru í umræðunni.",
"empty_column.follow_requests": "Þú átt ennþá engar beiðnir um að fylgja þér. Þegar þú færð slíkar beiðnir, munu þær birtast hér.",
"empty_column.hashtag": "Það er ekkert ennþá undir þessu myllumerki.",
- "empty_column.home": "Heimatímalínan þín er tóm! Skoðaðu {public} eða notaðu leitina til að komast í gang og finna annað fólk.",
+ "empty_column.home": "Heimatímalínan þín er tóm! Fylgstu með fleira fólki til að fylla hana. {suggestions}",
"empty_column.home.suggestions": "Skoðaðu nokkrar tillögur",
- "empty_column.list": "Það er ennþá ekki neitt á þessum lista. Þegar meðlimir á listanum senda inn nýjar stöðufærslur, munu þær birtast hér.",
+ "empty_column.list": "Það er ennþá ekki neitt á þessum lista. Þegar meðlimir á listanum senda inn nýjar færslur, munu þær birtast hér.",
"empty_column.lists": "Þú ert ennþá ekki með neina lista. Þegar þú byrð til einhvern lista, munu hann birtast hér.",
"empty_column.mutes": "Þú hefur ekki þaggað niður í neinum notendum ennþá.",
"empty_column.notifications": "Þú ert ekki ennþá með neinar tilkynningar. Vertu í samskiptum við aðra til að umræður fari af stað.",
@@ -183,6 +187,12 @@
"error.unexpected_crash.next_steps_addons": "Prófaðu að gera þau óvirk og svo endurlesa síðuna. Ef það hjálpar ekki til, má samt vera að þú getir notað Mastodon í gegnum annan vafra eða forrit.",
"errors.unexpected_crash.copy_stacktrace": "Afrita rakningarupplýsingar (stacktrace) á klippispjald",
"errors.unexpected_crash.report_issue": "Tilkynna vandamál",
+ "explore.search_results": "Leitarniðurstöður",
+ "explore.suggested_follows": "Fyrir þig",
+ "explore.title": "Kanna",
+ "explore.trending_links": "Fréttir",
+ "explore.trending_statuses": "Færslur",
+ "explore.trending_tags": "Myllumerki",
"follow_recommendations.done": "Lokið",
"follow_recommendations.heading": "Fylgstu með fólki sem þú vilt sjá færslur frá! Hér eru nokkrar tillögur.",
"follow_recommendations.lead": "Færslur frá fólki sem þú fylgist með eru birtar í tímaröð á heimastreyminu þínu. Þú þarft ekki að hræðast mistök, það er jafn auðvelt að hætta að fylgjast með fólki hvenær sem er!",
@@ -215,40 +225,40 @@
"intervals.full.days": "{number, plural, one {# dagur} other {# dagar}}",
"intervals.full.hours": "{number, plural, one {# klukkustund} other {# klukkustundir}}",
"intervals.full.minutes": "{number, plural, one {# mínúta} other {# mínútur}}",
- "keyboard_shortcuts.back": "að fara til baka",
- "keyboard_shortcuts.blocked": "að opna lista yfir útilokaða notendur",
- "keyboard_shortcuts.boost": "að endurbirta",
- "keyboard_shortcuts.column": "að setja virkni á stöðufærslu í einum af dálkunum",
- "keyboard_shortcuts.compose": "að setja virkni á textainnsetningarreit",
+ "keyboard_shortcuts.back": "Fara til baka",
+ "keyboard_shortcuts.blocked": "Opna lista yfir útilokaða notendur",
+ "keyboard_shortcuts.boost": "Endurbirta færslu",
+ "keyboard_shortcuts.column": "Setja virkni í dálk",
+ "keyboard_shortcuts.compose": "Setja virkni á textainnsetningarreit",
"keyboard_shortcuts.description": "Lýsing",
- "keyboard_shortcuts.direct": "að opna dálk með beinum skilaboðum",
- "keyboard_shortcuts.down": "að fara neðar í listanum",
- "keyboard_shortcuts.enter": "að opna stöðufærslu",
- "keyboard_shortcuts.favourite": "Fíla þyt",
- "keyboard_shortcuts.favourites": "Opna fílanir",
- "keyboard_shortcuts.federated": "að opna sameiginlega tímalínu",
+ "keyboard_shortcuts.direct": "Opna dálk með beinum skilaboðum",
+ "keyboard_shortcuts.down": "Fara neðar í listanum",
+ "keyboard_shortcuts.enter": "Opna færslu",
+ "keyboard_shortcuts.favourite": "Eftirlætisfærsla",
+ "keyboard_shortcuts.favourites": "Opna eftirlætislista",
+ "keyboard_shortcuts.federated": "Opna sameiginlega tímalínu",
"keyboard_shortcuts.heading": "Flýtileiðir á lyklaborði",
- "keyboard_shortcuts.home": "að opna heimatímalínu",
+ "keyboard_shortcuts.home": "Opna heimatímalínu",
"keyboard_shortcuts.hotkey": "Flýtilykill",
- "keyboard_shortcuts.legend": "að birta þessa skýringu",
- "keyboard_shortcuts.local": "að opna staðværa tímalínu",
- "keyboard_shortcuts.mention": "að minnast á höfund",
- "keyboard_shortcuts.muted": "að opna lista yfir þaggaða notendur",
- "keyboard_shortcuts.my_profile": "að opna notandasniðið þitt",
- "keyboard_shortcuts.notifications": "að opna tilkynningadálk",
- "keyboard_shortcuts.open_media": "til að opna margmiðlunargögn",
- "keyboard_shortcuts.pinned": "Opna lista yfir föst þyt",
- "keyboard_shortcuts.profile": "að opna notandasnið höfundar",
- "keyboard_shortcuts.reply": "að svara",
- "keyboard_shortcuts.requests": "að opna lista yfir fylgjendabeiðnir",
- "keyboard_shortcuts.search": "að setja virkni í leit",
- "keyboard_shortcuts.spoilers": "til að birta/fela reit með aðvörun vegna efnis",
- "keyboard_shortcuts.start": "að opna \"komast í gang\" dálk",
- "keyboard_shortcuts.toggle_hidden": "að birta/fela texta á bak við aðvörun vegna efnis",
- "keyboard_shortcuts.toggle_sensitivity": "að birta/fela myndir",
- "keyboard_shortcuts.toot": "Hefja glænýtt þyt",
- "keyboard_shortcuts.unfocus": "að taka virkni úr textainnsetningarreit eða leit",
- "keyboard_shortcuts.up": "að fara ofar í listanum",
+ "keyboard_shortcuts.legend": "Birta þessa skýringu",
+ "keyboard_shortcuts.local": "Opna staðværa tímalínu",
+ "keyboard_shortcuts.mention": "Minnast á höfund",
+ "keyboard_shortcuts.muted": "Opna lista yfir þaggaða notendur",
+ "keyboard_shortcuts.my_profile": "Opna notandasniðið þitt",
+ "keyboard_shortcuts.notifications": "Opna tilkynningadálk",
+ "keyboard_shortcuts.open_media": "Opna margmiðlunargögn",
+ "keyboard_shortcuts.pinned": "Opna lista yfir festar færslur",
+ "keyboard_shortcuts.profile": "Opna notandasnið höfundar",
+ "keyboard_shortcuts.reply": "Svara færslu",
+ "keyboard_shortcuts.requests": "Opna lista yfir fylgjendabeiðnir",
+ "keyboard_shortcuts.search": "Setja virkni í leitarreit",
+ "keyboard_shortcuts.spoilers": "Birta/fela reit með aðvörun vegna efnis",
+ "keyboard_shortcuts.start": "Opna \"komast í gang\" dálk",
+ "keyboard_shortcuts.toggle_hidden": "Birta/fela texta á bak við aðvörun vegna efnis",
+ "keyboard_shortcuts.toggle_sensitivity": "Birta/fela myndir",
+ "keyboard_shortcuts.toot": "Byrja nýja færslu",
+ "keyboard_shortcuts.unfocus": "Taka virkni úr textainnsetningarreit eða leit",
+ "keyboard_shortcuts.up": "Fara ofar í listanum",
"lightbox.close": "Loka",
"lightbox.compress": "Þjappa myndskoðunarreit",
"lightbox.expand": "Fletta út myndskoðunarreit",
@@ -279,12 +289,13 @@
"navigation_bar.blocks": "Útilokaðir notendur",
"navigation_bar.bookmarks": "Bókamerki",
"navigation_bar.community_timeline": "Staðvær tímalína",
- "navigation_bar.compose": "Semja nýtt þyt",
+ "navigation_bar.compose": "Semja nýja færslu",
"navigation_bar.direct": "Bein skilaboð",
"navigation_bar.discover": "Uppgötva",
- "navigation_bar.domain_blocks": "Falin lén",
+ "navigation_bar.domain_blocks": "Útilokuð lén",
"navigation_bar.edit_profile": "Breyta notandasniði",
- "navigation_bar.favourites": "Fílanir",
+ "navigation_bar.explore": "Kanna",
+ "navigation_bar.favourites": "Eftirlæti",
"navigation_bar.filters": "Þögguð orð",
"navigation_bar.follow_requests": "Beiðnir um að fylgjast með",
"navigation_bar.follows_and_followers": "Fylgist með og fylgjendur",
@@ -294,25 +305,28 @@
"navigation_bar.logout": "Útskráning",
"navigation_bar.mutes": "Þaggaðir notendur",
"navigation_bar.personal": "Einka",
- "navigation_bar.pins": "Föst þyt",
+ "navigation_bar.pins": "Festar færslur",
"navigation_bar.preferences": "Kjörstillingar",
"navigation_bar.public_timeline": "Sameiginleg tímalína",
"navigation_bar.security": "Öryggi",
- "notification.favourite": "{name} filaði stöðufærslu þína",
+ "notification.admin.sign_up": "{name} skráði sig",
+ "notification.favourite": "{name} setti færslu þína í eftirlæti",
"notification.follow": "{name} fylgist með þér",
"notification.follow_request": "{name} hefur beðið um að fylgjast með þér",
"notification.mention": "{name} minntist á þig",
"notification.own_poll": "Könnuninni þinni er lokið",
"notification.poll": "Könnun sem þú tókst þátt í er lokið",
- "notification.reblog": "{name} endurbirti stöðufærsluna þína",
+ "notification.reblog": "{name} endurbirti færsluna þína",
"notification.status": "{name} sendi inn rétt í þessu",
+ "notification.update": "{name} breytti færslu",
"notifications.clear": "Hreinsa tilkynningar",
"notifications.clear_confirmation": "Ertu viss um að þú viljir endanlega eyða öllum tilkynningunum þínum?",
+ "notifications.column_settings.admin.sign_up": "Nýjar skráningar:",
"notifications.column_settings.alert": "Tilkynningar á skjáborði",
- "notifications.column_settings.favourite": "Fílanir:",
+ "notifications.column_settings.favourite": "Eftirlæti:",
"notifications.column_settings.filter_bar.advanced": "Birta alla flokka",
"notifications.column_settings.filter_bar.category": "Skyndisíustika",
- "notifications.column_settings.filter_bar.show": "Sýna",
+ "notifications.column_settings.filter_bar.show_bar": "Birta síustikuna",
"notifications.column_settings.follow": "Nýir fylgjendur:",
"notifications.column_settings.follow_request": "Nýjar beiðnir um að fylgjast með:",
"notifications.column_settings.mention": "Tilvísanir:",
@@ -321,11 +335,13 @@
"notifications.column_settings.reblog": "Endurbirtingar:",
"notifications.column_settings.show": "Sýna í dálki",
"notifications.column_settings.sound": "Spila hljóð",
- "notifications.column_settings.status": "Ný þyt:",
- "notifications.column_settings.unread_markers.category": "Merki fyrir ólesnar tilkynningar",
+ "notifications.column_settings.status": "Nýjar færslur:",
+ "notifications.column_settings.unread_notifications.category": "Ólesnar tilkynningar",
+ "notifications.column_settings.unread_notifications.highlight": "Áherslulita ólesnar tilkynningar",
+ "notifications.column_settings.update": "Breytingar:",
"notifications.filter.all": "Allt",
"notifications.filter.boosts": "Endurbirtingar",
- "notifications.filter.favourites": "Fílanir",
+ "notifications.filter.favourites": "Eftirlæti",
"notifications.filter.follows": "Fylgist með",
"notifications.filter.mentions": "Tilvísanir",
"notifications.filter.polls": "Niðurstöður könnunar",
@@ -346,10 +362,10 @@
"poll.total_votes": "{count, plural, one {# atkvæði} other {# atkvæði}}",
"poll.vote": "Greiða atkvæði",
"poll.voted": "Þú kaust þetta svar",
- "poll.votes": "{votes, plural, one {# vote} other {# votes}}",
+ "poll.votes": "{votes, plural, one {# atkvæði} other {# atkvæði}}",
"poll_button.add_poll": "Bæta við könnun",
"poll_button.remove_poll": "Fjarlægja könnun",
- "privacy.change": "Aðlaga gagnaleynd stöðufærslu",
+ "privacy.change": "Aðlaga gagnaleynd færslu",
"privacy.direct.long": "Senda einungis á notendur sem minnst er á",
"privacy.direct.short": "Beint",
"privacy.private.long": "Senda einungis á fylgjendur",
@@ -362,57 +378,100 @@
"regeneration_indicator.label": "Hleð inn…",
"regeneration_indicator.sublabel": "Verið er að útbúa heimastreymið þitt!",
"relative_time.days": "{number}d",
+ "relative_time.full.days": "Fyrir {number, plural, one {# degi} other {# dögum}} síðan",
+ "relative_time.full.hours": "Fyrir {number, plural, one {# klukkustund} other {# klukkustundum}} síðan",
+ "relative_time.full.just_now": "í þessu",
+ "relative_time.full.minutes": "Fyrir {number, plural, one {# mínútu} other {# mínútum}} síðan",
+ "relative_time.full.seconds": "Fyrir {number, plural, one {# sekúndu} other {# sekúndum}} síðan",
"relative_time.hours": "{number}kl.",
"relative_time.just_now": "núna",
"relative_time.minutes": "{number}mín",
"relative_time.seconds": "{number}sek",
"relative_time.today": "í dag",
"reply_indicator.cancel": "Hætta við",
+ "report.block": "Útiloka",
+ "report.block_explanation": "Þú munt ekki sjá færslurnar þeirra. Þeir munu ekki geta séð færslurnar þínar eða fylgst með þér. Þeir munu ekki geta séð að lokað sé á þá.",
+ "report.categories.other": "Annað",
+ "report.categories.spam": "Ruslpóstur",
+ "report.categories.violation": "Efnið brýtur gegn einni eða fleiri reglum netþjónsins",
+ "report.category.subtitle": "Veldu hvað samsvarar best",
+ "report.category.title": "Segðu okkur hvað er í gangi með þetta {type}-atriði",
+ "report.category.title_account": "notandasnið",
+ "report.category.title_status": "færsla",
+ "report.close": "Lokið",
+ "report.comment.title": "Er eitthvað annað sem þú heldur að við ættum að vita?",
"report.forward": "Áframsenda til {target}",
"report.forward_hint": "Notandaaðgangurinn er af öðrum vefþjóni. Á einnig að senda nafnlaust afrit af kærunni þangað?",
- "report.hint": "Kæran verður send á umsjónarmenn vefþjónsins þíns. Þú getur gefið skýringu hér fyrir neðan á því af hverju þú ert að kæra þennan notandaaðgang:",
+ "report.mute": "Þagga niður",
+ "report.mute_explanation": "Þú munt ekki sjá færslurnar þeirra. Þeir munu samt geta séð færslurnar þínar eða fylgst með þér, en munu ekki geta séð að þaggað sé niður í þeim.",
+ "report.next": "Næsta",
"report.placeholder": "Viðbótarathugasemdir",
+ "report.reasons.dislike": "Mér líkar það ekki",
+ "report.reasons.dislike_description": "Þetta er ekki eitthvað sem þið viljið sjá",
+ "report.reasons.other": "Það er eitthvað annað",
+ "report.reasons.other_description": "Vandamálið fellur ekki í aðra flokka",
+ "report.reasons.spam": "Þetta er ruslpóstur",
+ "report.reasons.spam_description": "Slæmir tenglar, fölsk samskipti eða endurtekin svör",
+ "report.reasons.violation": "Það gengur þvert á reglur fyrir netþjóninn",
+ "report.reasons.violation_description": "Þið eruð meðvituð um að þetta brýtur sértækar reglur",
+ "report.rules.subtitle": "Veldu allt sem á við",
+ "report.rules.title": "Hvaða reglur eru brotnar?",
+ "report.statuses.subtitle": "Veldu allt sem á við",
+ "report.statuses.title": "Eru einhverjar færslur sem styðja þessa kæru?",
"report.submit": "Senda inn",
"report.target": "Kæri {target}",
+ "report.thanks.take_action": "Hér eru nokkrir valkostir til að stýra hvað þú sérð á Mastodon:",
+ "report.thanks.take_action_actionable": "Á meðan við yfirförum þetta, geturðu tekið til aðgerða gegn @{name}:",
+ "report.thanks.title": "Viltu ekki sjá þetta?",
+ "report.thanks.title_actionable": "Takk fyrir tilkynninguna, við munum skoða málið.",
+ "report.unfollow": "Hætta að fylgjast með @{name}",
+ "report.unfollow_explanation": "Þú ert að fylgjast með þessum aðgangi. Til að hætta að sjá viðkomandi færslur á streyminu þínu, skaltu hætta að fylgjast með viðkomandi.",
"search.placeholder": "Leita",
"search_popout.search_format": "Snið ítarlegrar leitar",
- "search_popout.tips.full_text": "Einfaldur texti skilar stöðufærslum sem þú hefur skrifað, fílað, endurbirt eða sem á þig hefur verið minnst í, ásamt samsvarandi birtingarnöfnum, notendanöfnum og myllumerkjum.",
+ "search_popout.tips.full_text": "Einfaldur texti skilar færslum sem þú hefur skrifað, sett í eftirlæti, endurbirt eða verið minnst á þig í, ásamt samsvarandi birtingarnöfnum, notendanöfnum og myllumerkjum.",
"search_popout.tips.hashtag": "myllumerki",
- "search_popout.tips.status": "stöðufærsla",
+ "search_popout.tips.status": "færsla",
"search_popout.tips.text": "Einfaldur texti skilar samsvarandi birtingarnöfnum, notendanöfnum og myllumerkjum",
"search_popout.tips.user": "notandi",
"search_results.accounts": "Fólk",
+ "search_results.all": "Allt",
"search_results.hashtags": "Myllumerki",
- "search_results.statuses": "Þyt",
- "search_results.statuses_fts_disabled": "Að leita í efni þyta er ekki virk á þessum Mastodon-þjóni.",
+ "search_results.nothing_found": "Gat ekki fundið neitt sem samsvarar þessum leitarorðum",
+ "search_results.statuses": "Færslur",
+ "search_results.statuses_fts_disabled": "Að leita í efni færslna er ekki virkt á þessum Mastodon-þjóni.",
"search_results.total": "{count, number} {count, plural, one {niðurstaða} other {niðurstöður}}",
"status.admin_account": "Opna umsjónarviðmót fyrir @{name}",
- "status.admin_status": "Opna þessa stöðufærslu í umsjónarviðmótinu",
+ "status.admin_status": "Opna þessa færslu í umsjónarviðmótinu",
"status.block": "Útiloka @{name}",
"status.bookmark": "Bókamerki",
"status.cancel_reblog_private": "Taka úr endurbirtingu",
"status.cannot_reblog": "Þessa færslu er ekki hægt að endurbirta",
- "status.copy": "Afrita tengil í stöðufærslu",
+ "status.copy": "Afrita tengil í færslu",
"status.delete": "Eyða",
"status.detailed_status": "Nákvæm spjallþráðasýn",
"status.direct": "Bein skilaboð @{name}",
+ "status.edit": "Breyta",
+ "status.edited": "Breytt {date}",
+ "status.edited_x_times": "Breytt {count, plural, one {{count} sinni} other {{count} sinnum}}",
"status.embed": "Ívefja",
- "status.favourite": "Fílanir",
+ "status.favourite": "Eftirlæti",
"status.filtered": "Síað",
+ "status.history.created": "{name} útbjó {date}",
+ "status.history.edited": "{name} breytti {date}",
"status.load_more": "Hlaða inn meiru",
"status.media_hidden": "Mynd er falin",
"status.mention": "Minnast á @{name}",
"status.more": "Meira",
"status.mute": "Þagga niður í @{name}",
"status.mute_conversation": "Þagga niður í samtali",
- "status.open": "Útliða þessa stöðu",
+ "status.open": "Útliða þessa færslu",
"status.pin": "Festa á notandasnið",
- "status.pinned": "Fast þyt",
+ "status.pinned": "Fest færsla",
"status.read_more": "Lesa meira",
"status.reblog": "Endurbirting",
"status.reblog_private": "Endurbirta til upphaflegra lesenda",
"status.reblogged_by": "{name} endurbirti",
- "status.reblogs.empty": "Enginn hefur ennþá endurbirt þetta þyt. Þegar einhver gerir það, mun sá birtast hér.",
+ "status.reblogs.empty": "Enginn hefur ennþá endurbirt þessa færslu. Þegar einhver gerir það, mun það birtast hér.",
"status.redraft": "Eyða og enduvinna drög",
"status.remove_bookmark": "Fjarlægja bókamerki",
"status.reply": "Svara",
@@ -443,7 +502,7 @@
"timeline_hint.remote_resource_not_displayed": "{resource} frá öðrum netþjónum er ekki birt.",
"timeline_hint.resources.followers": "Fylgjendur",
"timeline_hint.resources.follows": "Fylgist með",
- "timeline_hint.resources.statuses": "Eldri þyt",
+ "timeline_hint.resources.statuses": "Eldri færslur",
"trends.counter_by_accounts": "{count, plural, one {{counter} aðili} other {{counter} aðilar}} tala",
"trends.trending_now": "Í umræðunni núna",
"ui.beforeunload": "Drögin tapast ef þú ferð út úr Mastodon.",
@@ -462,7 +521,7 @@
"upload_form.video_description": "Lýstu þessu fyrir fólk sem heyrir illa eða er með skerta sjón",
"upload_modal.analyzing_picture": "Greini mynd…",
"upload_modal.apply": "Virkja",
- "upload_modal.applying": "Applying…",
+ "upload_modal.applying": "Beiti…",
"upload_modal.choose_image": "Veldu mynd",
"upload_modal.description_placeholder": "Öllum dýrunum í skóginum þætti bezt að vera vinir",
"upload_modal.detect_text": "Skynja texta úr mynd",
diff --git a/app/javascript/mastodon/locales/it.json b/app/javascript/mastodon/locales/it.json
index d2c9e1179..1985450a5 100644
--- a/app/javascript/mastodon/locales/it.json
+++ b/app/javascript/mastodon/locales/it.json
@@ -6,24 +6,24 @@
"account.block": "Blocca @{name}",
"account.block_domain": "Blocca dominio {domain}",
"account.blocked": "Bloccato",
- "account.browse_more_on_origin_server": "Sfoglia ulteriormente sul profilo originale",
+ "account.browse_more_on_origin_server": "Sfoglia di più sul profilo originale",
"account.cancel_follow_request": "Annulla richiesta di seguire",
"account.direct": "Messaggio diretto a @{name}",
"account.disable_notifications": "Smetti di avvisarmi quando @{name} pubblica un post",
"account.domain_blocked": "Dominio bloccato",
"account.edit_profile": "Modifica profilo",
"account.enable_notifications": "Avvisami quando @{name} pubblica un post",
- "account.endorse": "Mostra sul profilo",
+ "account.endorse": "Metti in evidenza sul profilo",
"account.follow": "Segui",
"account.followers": "Follower",
- "account.followers.empty": "Ancora nessuno segue questo utente.",
+ "account.followers.empty": "Nessuno segue ancora questo utente.",
"account.followers_counter": "{count, plural, one {{counter} Follower} other {{counter} Follower}}",
+ "account.following": "Seguiti",
"account.following_counter": "{count, plural, other {{counter} Seguiti}}",
- "account.follows.empty": "Questo utente non segue ancora nessuno.",
+ "account.follows.empty": "Questo utente non segue nessuno ancora.",
"account.follows_you": "Ti segue",
"account.hide_reblogs": "Nascondi condivisioni da @{name}",
"account.joined": "Su questa istanza dal {date}",
- "account.last_status": "Ultima attività",
"account.link_verified_on": "La proprietà di questo link è stata controllata il {date}",
"account.locked_info": "Questo è un account privato. Il proprietario approva manualmente chi può seguirlo.",
"account.media": "Media",
@@ -31,32 +31,34 @@
"account.moved_to": "{name} si è trasferito su:",
"account.mute": "Silenzia @{name}",
"account.mute_notifications": "Silenzia notifiche da @{name}",
- "account.muted": "Silenziat*",
- "account.never_active": "Mai",
- "account.posts": "Toot",
- "account.posts_with_replies": "Toot e risposte",
+ "account.muted": "Silenziato",
+ "account.posts": "Post",
+ "account.posts_with_replies": "Post e risposte",
"account.report": "Segnala @{name}",
"account.requested": "In attesa di approvazione. Clicca per annullare la richiesta di seguire",
"account.share": "Condividi il profilo di @{name}",
"account.show_reblogs": "Mostra condivisioni da @{name}",
- "account.statuses_counter": "{count, plural, one {{counter} Toot} other {{counter} Toot}}",
+ "account.statuses_counter": "{count, plural, one {{counter} Post} other {{counter} Post}}",
"account.unblock": "Sblocca @{name}",
"account.unblock_domain": "Sblocca il dominio {domain}",
+ "account.unblock_short": "Sblocca",
"account.unendorse": "Non mostrare sul profilo",
"account.unfollow": "Smetti di seguire",
"account.unmute": "Riattiva @{name}",
"account.unmute_notifications": "Riattiva le notifiche da @{name}",
+ "account.unmute_short": "Riattiva l'audio",
"account_note.placeholder": "Clicca per aggiungere una nota",
- "admin.dashboard.retention": "Retention",
- "admin.dashboard.retention.average": "Average",
- "admin.dashboard.retention.cohort": "Sign-up month",
- "admin.dashboard.retention.cohort_size": "New users",
- "alert.rate_limited.message": "Sei pregato di riprovare tra {retry_time, time, medium}.",
- "alert.rate_limited.title": "Limitazione per eccesso di richieste",
+ "admin.dashboard.daily_retention": "Tasso di ritenzione utente per giorno dopo la registrazione",
+ "admin.dashboard.monthly_retention": "Tasso di ritenzione utente per mese dopo la registrazione",
+ "admin.dashboard.retention.average": "Media",
+ "admin.dashboard.retention.cohort": "Mese di iscrizione",
+ "admin.dashboard.retention.cohort_size": "Nuovi utenti",
+ "alert.rate_limited.message": "Riprova dopo le {retry_time, time, medium}.",
+ "alert.rate_limited.title": "Rate limit",
"alert.unexpected.message": "Si è verificato un errore imprevisto.",
"alert.unexpected.title": "Oops!",
"announcement.announcement": "Annuncio",
- "attachments_list.unprocessed": "(unprocessed)",
+ "attachments_list.unprocessed": "(non elaborato)",
"autosuggest_hashtag.per_week": "{count} per settimana",
"boost_modal.combo": "Puoi premere {combo} per saltare questo passaggio la prossima volta",
"bundle_column_error.body": "E' avvenuto un errore durante il caricamento di questo componente.",
@@ -77,22 +79,22 @@
"column.lists": "Elenchi",
"column.mutes": "Utenti silenziati",
"column.notifications": "Notifiche",
- "column.pins": "Toot in evidenza",
+ "column.pins": "Post fissati in cima",
"column.public": "Timeline federata",
"column_back_button.label": "Indietro",
"column_header.hide_settings": "Nascondi impostazioni",
"column_header.moveLeft_settings": "Sposta colonna a sinistra",
"column_header.moveRight_settings": "Sposta colonna a destra",
- "column_header.pin": "Evidenzia",
+ "column_header.pin": "Fissa in cima",
"column_header.show_settings": "Mostra impostazioni",
- "column_header.unpin": "Non mettere in evidenza",
+ "column_header.unpin": "Non fissare in cima",
"column_subheading.settings": "Impostazioni",
"community.column_settings.local_only": "Solo Locale",
"community.column_settings.media_only": "Solo Media",
"community.column_settings.remote_only": "Solo Remoto",
- "compose_form.direct_message_warning": "Questo toot sarà inviato solo agli utenti menzionati.",
+ "compose_form.direct_message_warning": "Questo post sarà inviato solo agli utenti menzionati.",
"compose_form.direct_message_warning_learn_more": "Scopri di più",
- "compose_form.hashtag_warning": "Questo toot non sarà elencato sotto alcun hashtag poiché senza elenco. Solo i toot pubblici possono essere ricercati per hashtag.",
+ "compose_form.hashtag_warning": "Questo post non sarà elencato sotto alcun hashtag poiché senza elenco. Solo i toot pubblici possono essere ricercati per hashtag.",
"compose_form.lock_disclaimer": "Il tuo profilo non è {locked}. Chiunque può seguirti e vedere le tue pubblicazioni visibili solo dai follower.",
"compose_form.lock_disclaimer.lock": "bloccato",
"compose_form.placeholder": "A cosa stai pensando?",
@@ -104,6 +106,7 @@
"compose_form.poll.switch_to_single": "Modifica sondaggio per consentire una singola scelta",
"compose_form.publish": "Toot",
"compose_form.publish_loud": "{publish}!",
+ "compose_form.save_changes": "Salva modifiche",
"compose_form.sensitive.hide": "Segna media come sensibile",
"compose_form.sensitive.marked": "Questo media è contrassegnato come sensibile",
"compose_form.sensitive.unmarked": "Questo media non è contrassegnato come sensibile",
@@ -115,11 +118,11 @@
"confirmations.block.confirm": "Blocca",
"confirmations.block.message": "Sei sicuro di voler bloccare {name}?",
"confirmations.delete.confirm": "Cancella",
- "confirmations.delete.message": "Sei sicuro di voler cancellare questo toot?",
+ "confirmations.delete.message": "Sei sicuro di voler cancellare questo post?",
"confirmations.delete_list.confirm": "Cancella",
"confirmations.delete_list.message": "Sei sicuro di voler cancellare definitivamente questa lista?",
- "confirmations.discard_edit_media.confirm": "Discard",
- "confirmations.discard_edit_media.message": "You have unsaved changes to the media description or preview, discard them anyway?",
+ "confirmations.discard_edit_media.confirm": "Abbandona",
+ "confirmations.discard_edit_media.message": "Sono state apportate modifiche non salvate alla descrizione o all'anteprima del media, vuoi abbandonarle?",
"confirmations.domain_block.confirm": "Blocca l'intero dominio",
"confirmations.domain_block.message": "Sei davvero, davvero sicur@ di voler bloccare {domain} completamente? Nella maggioranza dei casi, è preferibile e sufficiente bloccare o silenziare pochi account in modo mirato. Non vedrai più il contenuto da quel dominio né nelle timeline pubbliche né nelle tue notifiche. Anzi, verranno rimossi dai follower gli account di questo dominio.",
"confirmations.logout.confirm": "Disconnettiti",
@@ -141,7 +144,7 @@
"directory.local": "Solo da {domain}",
"directory.new_arrivals": "Nuovi arrivi",
"directory.recently_active": "Attivo di recente",
- "embed.instructions": "Incorpora questo toot sul tuo sito web copiando il codice sotto.",
+ "embed.instructions": "Incorpora questo post sul tuo sito web copiando il codice sotto.",
"embed.preview": "Ecco come apparirà:",
"emoji_button.activity": "Attività",
"emoji_button.custom": "Personalizzato",
@@ -158,15 +161,16 @@
"emoji_button.symbols": "Simboli",
"emoji_button.travel": "Viaggi & Luoghi",
"empty_column.account_suspended": "Account sospeso",
- "empty_column.account_timeline": "Nessun toot qui!",
+ "empty_column.account_timeline": "Nessun post qui!",
"empty_column.account_unavailable": "Profilo non disponibile",
"empty_column.blocks": "Non hai ancora bloccato alcun utente.",
- "empty_column.bookmarked_statuses": "Non hai ancora segnato alcun toot. Quando ne segni uno, sarà mostrato qui.",
+ "empty_column.bookmarked_statuses": "Non hai ancora segnato alcun post. Quando ne segni uno, sarà mostrato qui.",
"empty_column.community": "La timeline locale è vuota. Condividi qualcosa pubblicamente per dare inizio alla festa!",
"empty_column.direct": "Non hai ancora nessun messaggio privato. Quando ne manderai o riceverai qualcuno, apparirà qui.",
"empty_column.domain_blocks": "Non vi sono domini nascosti.",
- "empty_column.favourited_statuses": "Non hai ancora segnato nessun toot come apprezzato. Quando lo farai, comparirà qui.",
- "empty_column.favourites": "Nessuno ha ancora segnato questo toot come apprezzato. Quando qualcuno lo farà, apparirà qui.",
+ "empty_column.explore_statuses": "Nulla è in tendenza in questo momento. Riprova più tardi!",
+ "empty_column.favourited_statuses": "Non hai ancora segnato nessun post come apprezzato. Quando lo farai, comparirà qui.",
+ "empty_column.favourites": "Nessuno ha ancora segnato questo post come apprezzato. Quando qualcuno lo farà, apparirà qui.",
"empty_column.follow_recommendations": "Sembra che nessun suggerimento possa essere generato per te. Puoi provare a usare la ricerca per cercare persone che potresti conoscere o esplorare hashtag di tendenza.",
"empty_column.follow_requests": "Non hai ancora ricevuto nessuna richiesta di follow. Quando ne riceverai una, verrà mostrata qui.",
"empty_column.hashtag": "Non c'è ancora nessun post con questo hashtag.",
@@ -183,6 +187,12 @@
"error.unexpected_crash.next_steps_addons": "Prova a disabilitarli e ad aggiornare la pagina. Se questo non funziona, potresti ancora essere in grado di utilizzare Mastodon attraverso un browser o un'app diversi.",
"errors.unexpected_crash.copy_stacktrace": "Copia stacktrace negli appunti",
"errors.unexpected_crash.report_issue": "Segnala il problema",
+ "explore.search_results": "Risultati della ricerca",
+ "explore.suggested_follows": "Per te",
+ "explore.title": "Esplora",
+ "explore.trending_links": "Novità",
+ "explore.trending_statuses": "Post",
+ "explore.trending_tags": "Hashtag",
"follow_recommendations.done": "Fatto",
"follow_recommendations.heading": "Segui le persone da cui vuoi vedere i messaggi! Ecco alcuni suggerimenti.",
"follow_recommendations.lead": "I messaggi da persone che segui verranno visualizzati in ordine cronologico nel tuo home feed. Non abbiate paura di commettere errori, potete smettere di seguire le persone altrettanto facilmente in qualsiasi momento!",
@@ -208,7 +218,7 @@
"hashtag.column_settings.tag_mode.none": "Nessuno di questi",
"hashtag.column_settings.tag_toggle": "Include additional tags in this column",
"home.column_settings.basic": "Semplice",
- "home.column_settings.show_reblogs": "Mostra post condivisi",
+ "home.column_settings.show_reblogs": "Mostra condivisioni",
"home.column_settings.show_replies": "Mostra risposte",
"home.hide_announcements": "Nascondi annunci",
"home.show_announcements": "Mostra annunci",
@@ -217,14 +227,14 @@
"intervals.full.minutes": "{number, plural, one {# minuto} other {# minuti}}",
"keyboard_shortcuts.back": "per tornare indietro",
"keyboard_shortcuts.blocked": "per aprire l'elenco degli utenti bloccati",
- "keyboard_shortcuts.boost": "per condividere",
+ "keyboard_shortcuts.boost": "Condividi il post",
"keyboard_shortcuts.column": "per portare il focus su uno status in una delle colonne",
"keyboard_shortcuts.compose": "per portare il focus nell'area di composizione",
"keyboard_shortcuts.description": "Descrizione",
"keyboard_shortcuts.direct": "per aprire la colonna dei messaggi diretti",
- "keyboard_shortcuts.down": "per spostarsi in basso nella lista",
- "keyboard_shortcuts.enter": "per aprire lo status",
- "keyboard_shortcuts.favourite": "per segnare come apprezzato",
+ "keyboard_shortcuts.down": "Spostati in basso nella lista",
+ "keyboard_shortcuts.enter": "Apri il post",
+ "keyboard_shortcuts.favourite": "Apprezza post",
"keyboard_shortcuts.favourites": "per aprire l'elenco dei toot apprezzati",
"keyboard_shortcuts.federated": "per aprire la timeline federata",
"keyboard_shortcuts.heading": "Tasti di scelta rapida",
@@ -237,16 +247,16 @@
"keyboard_shortcuts.my_profile": "per aprire il tuo profilo",
"keyboard_shortcuts.notifications": "per aprire la colonna delle notifiche",
"keyboard_shortcuts.open_media": "per aprire media",
- "keyboard_shortcuts.pinned": "per aprire l'elenco dei toot fissati in cima",
+ "keyboard_shortcuts.pinned": "Apri l'elenco dei toot fissati in cima",
"keyboard_shortcuts.profile": "per aprire il profilo dell'autore",
- "keyboard_shortcuts.reply": "per rispondere",
+ "keyboard_shortcuts.reply": "Rispondi al post",
"keyboard_shortcuts.requests": "per aprire l'elenco di richieste di follow",
"keyboard_shortcuts.search": "per spostare il focus sulla ricerca",
"keyboard_shortcuts.spoilers": "per mostrare/nascondere il campo CW",
"keyboard_shortcuts.start": "per aprire la colonna \"Come iniziare\"",
"keyboard_shortcuts.toggle_hidden": "per mostrare/nascondere il testo dei CW",
"keyboard_shortcuts.toggle_sensitivity": "mostrare/nascondere media",
- "keyboard_shortcuts.toot": "per iniziare a scrivere un toot completamente nuovo",
+ "keyboard_shortcuts.toot": "Crea un nuovo post",
"keyboard_shortcuts.unfocus": "per uscire dall'area di composizione o dalla ricerca",
"keyboard_shortcuts.up": "per spostarsi in alto nella lista",
"lightbox.close": "Chiudi",
@@ -284,6 +294,7 @@
"navigation_bar.discover": "Scopri",
"navigation_bar.domain_blocks": "Domini nascosti",
"navigation_bar.edit_profile": "Modifica profilo",
+ "navigation_bar.explore": "Esplora",
"navigation_bar.favourites": "Apprezzati",
"navigation_bar.filters": "Parole silenziate",
"navigation_bar.follow_requests": "Richieste di seguirti",
@@ -294,10 +305,11 @@
"navigation_bar.logout": "Esci",
"navigation_bar.mutes": "Utenti silenziati",
"navigation_bar.personal": "Personale",
- "navigation_bar.pins": "Toot fissati in cima",
+ "navigation_bar.pins": "Post fissati in cima",
"navigation_bar.preferences": "Impostazioni",
"navigation_bar.public_timeline": "Timeline federata",
"navigation_bar.security": "Sicurezza",
+ "notification.admin.sign_up": "{name} si è iscritto",
"notification.favourite": "{name} ha apprezzato il tuo post",
"notification.follow": "{name} ha iniziato a seguirti",
"notification.follow_request": "{name} ti ha mandato una richiesta di follow",
@@ -306,13 +318,15 @@
"notification.poll": "Un sondaggio in cui hai votato è terminato",
"notification.reblog": "{name} ha condiviso il tuo post",
"notification.status": "{name} ha appena pubblicato un post",
+ "notification.update": "{name} ha modificato un post",
"notifications.clear": "Cancella notifiche",
"notifications.clear_confirmation": "Vuoi davvero cancellare tutte le notifiche?",
+ "notifications.column_settings.admin.sign_up": "Nuove iscrizioni:",
"notifications.column_settings.alert": "Notifiche desktop",
"notifications.column_settings.favourite": "Apprezzati:",
"notifications.column_settings.filter_bar.advanced": "Mostra tutte le categorie",
"notifications.column_settings.filter_bar.category": "Filtro rapido",
- "notifications.column_settings.filter_bar.show": "Mostra",
+ "notifications.column_settings.filter_bar.show_bar": "Mostra barra filtri",
"notifications.column_settings.follow": "Nuovi follower:",
"notifications.column_settings.follow_request": "Nuove richieste di follow:",
"notifications.column_settings.mention": "Menzioni:",
@@ -321,8 +335,10 @@
"notifications.column_settings.reblog": "Post condivisi:",
"notifications.column_settings.show": "Mostra in colonna",
"notifications.column_settings.sound": "Riproduci suono",
- "notifications.column_settings.status": "Nuovi toot:",
- "notifications.column_settings.unread_markers.category": "Marcatori di notifica non letti",
+ "notifications.column_settings.status": "Nuovi post:",
+ "notifications.column_settings.unread_notifications.category": "Notifiche non lette",
+ "notifications.column_settings.unread_notifications.highlight": "Evidenzia notifiche non lette",
+ "notifications.column_settings.update": "Modifiche:",
"notifications.filter.all": "Tutti",
"notifications.filter.boosts": "Condivisioni",
"notifications.filter.favourites": "Apprezzati",
@@ -346,7 +362,7 @@
"poll.total_votes": "{count, plural, one {# voto} other {# voti}}",
"poll.vote": "Vota",
"poll.voted": "Hai votato per questa risposta",
- "poll.votes": "{votes, plural, one {# vote} other {# votes}}",
+ "poll.votes": "{votes, plural, one {# voto} other {# voti}}",
"poll_button.add_poll": "Aggiungi un sondaggio",
"poll_button.remove_poll": "Rimuovi sondaggio",
"privacy.change": "Modifica privacy del post",
@@ -362,43 +378,86 @@
"regeneration_indicator.label": "Caricamento in corso…",
"regeneration_indicator.sublabel": "Stiamo preparando il tuo home feed!",
"relative_time.days": "{number}g",
+ "relative_time.full.days": "{number, plural, one {# giorno} other {# giorni}} fa",
+ "relative_time.full.hours": "{number, plural, one {# ora} other {# ore}} fa",
+ "relative_time.full.just_now": "proprio ora",
+ "relative_time.full.minutes": "{number, plural, one {# minuto} other {# minuti}} fa",
+ "relative_time.full.seconds": "{number, plural, one {# secondo} other {# secondi}} fa",
"relative_time.hours": "{number}o",
"relative_time.just_now": "ora",
"relative_time.minutes": "{number} minuti",
"relative_time.seconds": "{number} secondi",
"relative_time.today": "oggi",
"reply_indicator.cancel": "Annulla",
+ "report.block": "Blocca",
+ "report.block_explanation": "Non vedrai i loro post. Non saranno in grado di vedere i tuoi post o di seguirti. Potranno sapere che sono bloccati.",
+ "report.categories.other": "Altro",
+ "report.categories.spam": "Spam",
+ "report.categories.violation": "Il contenuto viola una o più regole del server",
+ "report.category.subtitle": "Scegli la migliore corrispondenza",
+ "report.category.title": "Dicci cosa sta succedendo con questo {type}",
+ "report.category.title_account": "profilo",
+ "report.category.title_status": "post",
+ "report.close": "Fatto",
+ "report.comment.title": "C'è altro che pensi che dovremmo sapere?",
"report.forward": "Inoltra a {target}",
"report.forward_hint": "Questo account appartiene a un altro server. Mandare anche là una copia anonima del rapporto?",
- "report.hint": "La segnalazione sarà inviata ai moderatori del tuo server. Di seguito, puoi fornire il motivo per il quale stai segnalando questo account:",
+ "report.mute": "Silenzia",
+ "report.mute_explanation": "Non vedrai i loro post. Potranno ancora seguirti e vedere i tuoi post e non sapranno che sono stati silenziati.",
+ "report.next": "Successivo",
"report.placeholder": "Commenti aggiuntivi",
+ "report.reasons.dislike": "Non mi piace",
+ "report.reasons.dislike_description": "Non è qualcosa che vuoi vedere",
+ "report.reasons.other": "È qualcos'altro",
+ "report.reasons.other_description": "Il problema non rientra in altre categorie",
+ "report.reasons.spam": "È spam",
+ "report.reasons.spam_description": "Collegamenti malevoli, false interazioni, o risposte ripetitive",
+ "report.reasons.violation": "Viola le regole del server",
+ "report.reasons.violation_description": "Siete consapevoli che viola regole specifiche",
+ "report.rules.subtitle": "Seleziona tutte le risposte pertinenti",
+ "report.rules.title": "Quali regole vengono violate?",
+ "report.statuses.subtitle": "Seleziona tutte le risposte pertinenti",
+ "report.statuses.title": "Ci sono post a sostegno di questa segnalazione?",
"report.submit": "Invia",
"report.target": "Invio la segnalazione {target}",
+ "report.thanks.take_action": "Ecco le tue opzioni per controllare quello che vedi su Mastodon:",
+ "report.thanks.take_action_actionable": "Mentre controlliamo, puoi fare questo contro @{name}:",
+ "report.thanks.title": "Non vuoi vedere questo?",
+ "report.thanks.title_actionable": "Grazie per la segnalazione, controlleremo il problema.",
+ "report.unfollow": "Non seguire più @{name}",
+ "report.unfollow_explanation": "Stai seguendo questo account. Per non vedere più i suoi post nel tuo feed home, smetti di seguirlo.",
"search.placeholder": "Cerca",
"search_popout.search_format": "Formato di ricerca avanzato",
"search_popout.tips.full_text": "Testo semplice per trovare gli status che hai scritto, segnato come apprezzati, condiviso o in cui sei stato citato, e inoltre i nomi utente, nomi visualizzati e hashtag che lo contengono.",
"search_popout.tips.hashtag": "etichetta",
- "search_popout.tips.status": "stato",
+ "search_popout.tips.status": "post",
"search_popout.tips.text": "Testo semplice per trovare nomi visualizzati, nomi utente e hashtag che lo contengono",
"search_popout.tips.user": "utente",
"search_results.accounts": "Gente",
+ "search_results.all": "Tutto",
"search_results.hashtags": "Hashtag",
- "search_results.statuses": "Toot",
- "search_results.statuses_fts_disabled": "La ricerca di toot per il loro contenuto non è abilitata su questo server Mastodon.",
+ "search_results.nothing_found": "Impossibile trovare qualcosa per questi termini di ricerca",
+ "search_results.statuses": "Post",
+ "search_results.statuses_fts_disabled": "La ricerca di post per il loro contenuto non è abilitata su questo server Mastodon.",
"search_results.total": "{count} {count, plural, one {risultato} other {risultati}}",
"status.admin_account": "Apri interfaccia di moderazione per @{name}",
- "status.admin_status": "Apri questo status nell'interfaccia di moderazione",
+ "status.admin_status": "Apri questo post nell'interfaccia di moderazione",
"status.block": "Blocca @{name}",
"status.bookmark": "Aggiungi segnalibro",
"status.cancel_reblog_private": "Annulla condivisione",
"status.cannot_reblog": "Questo post non può essere condiviso",
- "status.copy": "Copia link allo status",
+ "status.copy": "Copia link al post",
"status.delete": "Elimina",
"status.detailed_status": "Vista conversazione dettagliata",
"status.direct": "Messaggio privato @{name}",
+ "status.edit": "Modifica",
+ "status.edited": "Modificato il {date}",
+ "status.edited_x_times": "Modificato {count, plural, one {{count} volta} other {{count} volte}}",
"status.embed": "Incorpora",
"status.favourite": "Apprezzato",
"status.filtered": "Filtrato",
+ "status.history.created": "{name} ha creato {date}",
+ "status.history.edited": "{name} ha modificato {date}",
"status.load_more": "Mostra di più",
"status.media_hidden": "Allegato nascosto",
"status.mention": "Nomina @{name}",
@@ -407,12 +466,12 @@
"status.mute_conversation": "Silenzia conversazione",
"status.open": "Espandi questo post",
"status.pin": "Fissa in cima sul profilo",
- "status.pinned": "Toot fissato in cima",
+ "status.pinned": "Post fissato in cima",
"status.read_more": "Leggi altro",
"status.reblog": "Condividi",
"status.reblog_private": "Condividi con i destinatari iniziali",
"status.reblogged_by": "{name} ha condiviso",
- "status.reblogs.empty": "Nessuno ha ancora condiviso questo toot. Quando qualcuno lo farà, comparirà qui.",
+ "status.reblogs.empty": "Nessuno ha ancora condiviso questo post. Quando qualcuno lo farà, comparirà qui.",
"status.redraft": "Cancella e riscrivi",
"status.remove_bookmark": "Elimina segnalibro",
"status.reply": "Rispondi",
@@ -443,7 +502,7 @@
"timeline_hint.remote_resource_not_displayed": "{resource] da altri server non sono mostrati.",
"timeline_hint.resources.followers": "Follower",
"timeline_hint.resources.follows": "Segue",
- "timeline_hint.resources.statuses": "Toot meno recenti",
+ "timeline_hint.resources.statuses": "Post meno recenti",
"trends.counter_by_accounts": "{count, plural, one {{counter} persona} other {{counter} persone}} ne parla·no",
"trends.trending_now": "Di tendenza ora",
"ui.beforeunload": "La bozza andrà persa se esci da Mastodon.",
@@ -462,7 +521,7 @@
"upload_form.video_description": "Descrizione per persone con difetti uditivi o visivi",
"upload_modal.analyzing_picture": "Analisi immagine…",
"upload_modal.apply": "Applica",
- "upload_modal.applying": "Applying…",
+ "upload_modal.applying": "Applicazione in corso…",
"upload_modal.choose_image": "Scegli immagine",
"upload_modal.description_placeholder": "Ma la volpe col suo balzo ha raggiunto il quieto Fido",
"upload_modal.detect_text": "Rileva testo dall'immagine",
diff --git a/app/javascript/mastodon/locales/ja.json b/app/javascript/mastodon/locales/ja.json
index a9c90ee7f..4a388f92b 100644
--- a/app/javascript/mastodon/locales/ja.json
+++ b/app/javascript/mastodon/locales/ja.json
@@ -18,12 +18,12 @@
"account.followers": "フォロワー",
"account.followers.empty": "まだ誰もフォローしていません。",
"account.followers_counter": "{counter} フォロワー",
+ "account.following": "フォロー中",
"account.following_counter": "{counter} フォロー",
"account.follows.empty": "まだ誰もフォローしていません。",
"account.follows_you": "フォローされています",
"account.hide_reblogs": "@{name}さんからのブーストを非表示",
"account.joined": "{date} に登録",
- "account.last_status": "最後の活動",
"account.link_verified_on": "このリンクの所有権は{date}に確認されました",
"account.locked_info": "このアカウントは承認制アカウントです。相手が承認するまでフォローは完了しません。",
"account.media": "メディア",
@@ -32,7 +32,6 @@
"account.mute": "@{name}さんをミュート",
"account.mute_notifications": "@{name}さんからの通知を受け取らない",
"account.muted": "ミュート済み",
- "account.never_active": "活動なし",
"account.posts": "投稿",
"account.posts_with_replies": "投稿と返信",
"account.report": "@{name}さんを通報",
@@ -42,21 +41,24 @@
"account.statuses_counter": "{counter} 投稿",
"account.unblock": "@{name}さんのブロックを解除",
"account.unblock_domain": "{domain}のブロックを解除",
+ "account.unblock_short": "ブロック解除",
"account.unendorse": "プロフィールから外す",
"account.unfollow": "フォロー解除",
"account.unmute": "@{name}さんのミュートを解除",
"account.unmute_notifications": "@{name}さんからの通知を受け取るようにする",
+ "account.unmute_short": "ミュート解除",
"account_note.placeholder": "クリックしてメモを追加",
- "admin.dashboard.retention": "Retention",
- "admin.dashboard.retention.average": "Average",
- "admin.dashboard.retention.cohort": "Sign-up month",
- "admin.dashboard.retention.cohort_size": "New users",
+ "admin.dashboard.daily_retention": "サインアップ後の日ごとのユーザー継続率",
+ "admin.dashboard.monthly_retention": "サインアップ後の月ごとのユーザー継続率",
+ "admin.dashboard.retention.average": "平均",
+ "admin.dashboard.retention.cohort": "サインアップ月",
+ "admin.dashboard.retention.cohort_size": "新しいユーザー",
"alert.rate_limited.message": "{retry_time, time, medium} 以降に再度実行してください。",
"alert.rate_limited.title": "制限に達しました",
"alert.unexpected.message": "不明なエラーが発生しました。",
"alert.unexpected.title": "エラー!",
"announcement.announcement": "お知らせ",
- "attachments_list.unprocessed": "(unprocessed)",
+ "attachments_list.unprocessed": "(未処理)",
"autosuggest_hashtag.per_week": "{count} 回 / 週",
"boost_modal.combo": "次からは{combo}を押せばスキップできます",
"bundle_column_error.body": "コンポーネントの読み込み中に問題が発生しました。",
@@ -108,6 +110,7 @@
"compose_form.poll.switch_to_single": "単一選択に変更",
"compose_form.publish": "トゥート",
"compose_form.publish_loud": "{publish}!",
+ "compose_form.save_changes": "変更を保存",
"compose_form.sensitive.hide": "メディアを閲覧注意にする",
"compose_form.sensitive.marked": "メディアに閲覧注意が設定されています",
"compose_form.sensitive.unmarked": "メディアに閲覧注意が設定されていません",
@@ -122,8 +125,8 @@
"confirmations.delete.message": "本当に削除しますか?",
"confirmations.delete_list.confirm": "削除",
"confirmations.delete_list.message": "本当にこのリストを完全に削除しますか?",
- "confirmations.discard_edit_media.confirm": "Discard",
- "confirmations.discard_edit_media.message": "You have unsaved changes to the media description or preview, discard them anyway?",
+ "confirmations.discard_edit_media.confirm": "破棄",
+ "confirmations.discard_edit_media.message": "メディアの説明またはプレビューに保存されていない変更があります。それでも破棄しますか?",
"confirmations.domain_block.confirm": "ドメイン全体をブロック",
"confirmations.domain_block.message": "本当に{domain}全体を非表示にしますか? 多くの場合は個別にブロックやミュートするだけで充分であり、また好ましいです。公開タイムラインにそのドメインのコンテンツが表示されなくなり、通知も届かなくなります。そのドメインのフォロワーはアンフォローされます。",
"confirmations.logout.confirm": "ログアウト",
@@ -169,6 +172,7 @@
"empty_column.community": "ローカルタイムラインはまだ使われていません。何か書いてみましょう!",
"empty_column.direct": "ダイレクトメッセージはまだありません。ダイレクトメッセージをやりとりすると、ここに表示されます。",
"empty_column.domain_blocks": "ブロックしているドメインはありません。",
+ "empty_column.explore_statuses": "まだ何もありません。後で確認してください。",
"empty_column.favourited_statuses": "まだ何もお気に入り登録していません。お気に入り登録するとここに表示されます。",
"empty_column.favourites": "まだ誰もお気に入り登録していません。お気に入り登録されるとここに表示されます。",
"empty_column.follow_recommendations": "おすすめを生成できませんでした。検索を使って知り合いを探したり、トレンドハッシュタグを見てみましょう。",
@@ -187,6 +191,12 @@
"error.unexpected_crash.next_steps_addons": "それらを無効化してからリロードをお試しください。それでも解決しない場合、他のブラウザやアプリで Mastodon をお試しください。",
"errors.unexpected_crash.copy_stacktrace": "スタックトレースをクリップボードにコピー",
"errors.unexpected_crash.report_issue": "問題を報告",
+ "explore.search_results": "検索結果",
+ "explore.suggested_follows": "あなたに",
+ "explore.title": "エクスプローラー",
+ "explore.trending_links": "ニュース",
+ "explore.trending_statuses": "投稿",
+ "explore.trending_tags": "ハッシュタグ",
"follow_recommendations.done": "完了",
"follow_recommendations.heading": "投稿を見たい人をフォローしてください!ここにおすすめがあります。",
"follow_recommendations.lead": "あなたがフォローしている人の投稿は、ホームフィードに時系列で表示されます。いつでも簡単に解除できるので、気軽にフォローしてみてください!",
@@ -288,6 +298,7 @@
"navigation_bar.discover": "見つける",
"navigation_bar.domain_blocks": "ブロックしたドメイン",
"navigation_bar.edit_profile": "プロフィールを編集",
+ "navigation_bar.explore": "エクスプローラー",
"navigation_bar.favourites": "お気に入り",
"navigation_bar.filters": "フィルター設定",
"navigation_bar.follow_requests": "フォローリクエスト",
@@ -303,6 +314,7 @@
"navigation_bar.public_timeline": "連合タイムライン",
"navigation_bar.misc": "その他",
"navigation_bar.security": "セキュリティ",
+ "notification.admin.sign_up": "{name} がサインアップしました",
"notification.favourite": "{name}さんがあなたの投稿をお気に入りに登録しました",
"notification.follow": "{name}さんにフォローされました",
"notification.follow_request": "{name} さんがあなたにフォローリクエストしました",
@@ -311,13 +323,15 @@
"notification.poll": "アンケートが終了しました",
"notification.reblog": "{name}さんがあなたの投稿をブーストしました",
"notification.status": "{name}さんが投稿しました",
+ "notification.update": "{name} が投稿を編集しました",
"notifications.clear": "通知を消去",
"notifications.clear_confirmation": "本当に通知を消去しますか?",
+ "notifications.column_settings.admin.sign_up": "新規登録:",
"notifications.column_settings.alert": "デスクトップ通知",
"notifications.column_settings.favourite": "お気に入り:",
"notifications.column_settings.filter_bar.advanced": "すべてのカテゴリを表示",
- "notifications.column_settings.filter_bar.category": "クイックフィルターバー",
- "notifications.column_settings.filter_bar.show": "表示",
+ "notifications.column_settings.filter_bar.category": "クイックフィルターバー:",
+ "notifications.column_settings.filter_bar.show_bar": "フィルターバーを表示",
"notifications.column_settings.follow": "新しいフォロワー:",
"notifications.column_settings.follow_request": "新しいフォローリクエスト:",
"notifications.column_settings.mention": "返信:",
@@ -327,7 +341,9 @@
"notifications.column_settings.show": "カラムに表示",
"notifications.column_settings.sound": "通知音を再生",
"notifications.column_settings.status": "新しい投稿:",
- "notifications.column_settings.unread_markers.category": "未読マーカー",
+ "notifications.column_settings.unread_notifications.category": "未読の通知:",
+ "notifications.column_settings.unread_notifications.highlight": "未読の通知を強調表示",
+ "notifications.column_settings.update": "編集:",
"notifications.filter.all": "すべて",
"notifications.filter.boosts": "ブースト",
"notifications.filter.favourites": "お気に入り",
@@ -351,7 +367,7 @@
"poll.total_votes": "{count}票",
"poll.vote": "投票",
"poll.voted": "この項目に投票しました",
- "poll.votes": "{votes, plural, one {# vote} other {# votes}}",
+ "poll.votes": "{votes}票",
"poll_button.add_poll": "アンケートを追加",
"poll_button.remove_poll": "アンケートを削除",
"privacy.change": "公開範囲を変更",
@@ -367,18 +383,54 @@
"regeneration_indicator.label": "読み込み中…",
"regeneration_indicator.sublabel": "ホームタイムラインは準備中です!",
"relative_time.days": "{number}日前",
+ "relative_time.full.days": "{number} 日前",
+ "relative_time.full.hours": "{number} 時間前",
+ "relative_time.full.just_now": "今",
+ "relative_time.full.minutes": "{number} 分前",
+ "relative_time.full.seconds": "{number} 秒前",
"relative_time.hours": "{number}時間前",
"relative_time.just_now": "今",
"relative_time.minutes": "{number}分前",
"relative_time.seconds": "{number}秒前",
"relative_time.today": "今日",
"reply_indicator.cancel": "キャンセル",
+ "report.block": "ブロック",
+ "report.block_explanation": "相手の投稿が表示されなくなります。相手はあなたの投稿を見ることやフォローすることができません。相手はブロックされていることがわかります。",
+ "report.categories.other": "その他",
+ "report.categories.spam": "スパム",
+ "report.categories.violation": "サーバーのルールに違反",
+ "report.category.subtitle": "近いものを選択してください",
+ "report.category.title": "この{type}について教えてください",
+ "report.category.title_account": "プロフィール",
+ "report.category.title_status": "投稿",
+ "report.close": "完了",
+ "report.comment.title": "その他に私たちに伝えておくべき事はありますか?",
"report.forward": "{target} に転送する",
"report.forward_hint": "このアカウントは別のサーバーに所属しています。通報内容を匿名で転送しますか?",
- "report.hint": "通報内容はあなたのサーバーのモデレーターへ送信されます。通報理由を入力してください。:",
+ "report.mute": "ミュート",
+ "report.mute_explanation": "相手の投稿は表示されなくなります。相手は引き続きあなたをフォローして、あなたの投稿を表示することができますが、ミュートされていることはわかりません。",
+ "report.next": "次へ",
"report.placeholder": "追加コメント",
+ "report.reasons.dislike": "興味がありません",
+ "report.reasons.dislike_description": "見たくない内容の場合",
+ "report.reasons.other": "その他",
+ "report.reasons.other_description": "当てはまる選択肢がない場合",
+ "report.reasons.spam": "これはスパムです",
+ "report.reasons.spam_description": "悪意のあるリンクや虚偽の情報、執拗な返信など",
+ "report.reasons.violation": "サーバーのルールに違反しています",
+ "report.reasons.violation_description": "ルールに違反しているのを見つけた場合",
+ "report.rules.subtitle": "当てはまるものをすべて選んでください:",
+ "report.rules.title": "どのルールに違反していますか?",
+ "report.statuses.subtitle": "当てはまるものをすべて選んでください:",
+ "report.statuses.title": "この通報を裏付けるような投稿はありますか?",
"report.submit": "通報する",
"report.target": "{target}さんを通報する",
+ "report.thanks.take_action": "次のような方法はいかがでしょうか?",
+ "report.thanks.take_action_actionable": "私達が確認している間でも、あなたは @{name} さんに対して対応することが出来ます:",
+ "report.thanks.title": "見えないようにしたいですか?",
+ "report.thanks.title_actionable": "ご報告ありがとうございます、追って確認します。",
+ "report.unfollow": "@{name}のフォローを解除",
+ "report.unfollow_explanation": "このアカウントをフォローしています。ホームフィードに彼らの投稿を表示しないようにするには、彼らのフォローを外してください。",
"search.placeholder": "検索",
"search_popout.search_format": "高度な検索フォーマット",
"search_popout.tips.full_text": "表示名やユーザー名、ハッシュタグのほか、あなたの投稿やお気に入り、ブーストした投稿、返信に一致する単純なテキスト。",
@@ -387,7 +439,9 @@
"search_popout.tips.text": "表示名やユーザー名、ハッシュタグに一致する単純なテキスト",
"search_popout.tips.user": "ユーザー",
"search_results.accounts": "人々",
+ "search_results.all": "すべて",
"search_results.hashtags": "ハッシュタグ",
+ "search_results.nothing_found": "この検索条件では何も見つかりませんでした",
"search_results.statuses": "投稿",
"search_results.statuses_fts_disabled": "このサーバーでは投稿本文の検索は利用できません。",
"search_results.total": "{count, number}件の結果",
@@ -401,9 +455,14 @@
"status.delete": "削除",
"status.detailed_status": "詳細な会話ビュー",
"status.direct": "@{name}さんにダイレクトメッセージ",
+ "status.edit": "編集",
+ "status.edited": "{date} 編集済み",
+ "status.edited_x_times": "{count} 回編集",
"status.embed": "埋め込み",
"status.favourite": "お気に入り",
"status.filtered": "フィルターされました",
+ "status.history.created": "{name}さんが {date} に作成",
+ "status.history.edited": "{name}さんが {date} に編集",
"status.load_more": "もっと見る",
"status.media_hidden": "非表示のメディア",
"status.mention": "@{name}さんに投稿",
@@ -467,7 +526,7 @@
"upload_form.video_description": "視聴が難しいユーザーへの説明",
"upload_modal.analyzing_picture": "画像を解析中…",
"upload_modal.apply": "適用",
- "upload_modal.applying": "Applying…",
+ "upload_modal.applying": "適用中...",
"upload_modal.choose_image": "画像を選択",
"upload_modal.description_placeholder": "あのイーハトーヴォのすきとおった風",
"upload_modal.detect_text": "画像からテキストを検出",
diff --git a/app/javascript/mastodon/locales/ka.json b/app/javascript/mastodon/locales/ka.json
index 2b1221d6f..f6f3f1e10 100644
--- a/app/javascript/mastodon/locales/ka.json
+++ b/app/javascript/mastodon/locales/ka.json
@@ -18,12 +18,12 @@
"account.followers": "მიმდევრები",
"account.followers.empty": "No one follows this user yet.",
"account.followers_counter": "{count, plural, one {{counter} Follower} other {{counter} Followers}}",
+ "account.following": "Following",
"account.following_counter": "{count, plural, one {{counter} Following} other {{counter} Following}}",
"account.follows.empty": "This user doesn't follow anyone yet.",
"account.follows_you": "მოგყვებათ",
"account.hide_reblogs": "დაიმალოს ბუსტები @{name}-სგან",
"account.joined": "Joined {date}",
- "account.last_status": "Last active",
"account.link_verified_on": "Ownership of this link was checked on {date}",
"account.locked_info": "This account privacy status is set to locked. The owner manually reviews who can follow them.",
"account.media": "მედია",
@@ -32,7 +32,6 @@
"account.mute": "გააჩუმე @{name}",
"account.mute_notifications": "გააჩუმე შეტყობინებები @{name}-სგან",
"account.muted": "გაჩუმებული",
- "account.never_active": "Never",
"account.posts": "ტუტები",
"account.posts_with_replies": "ტუტები და პასუხები",
"account.report": "დაარეპორტე @{name}",
@@ -42,12 +41,15 @@
"account.statuses_counter": "{count, plural, one {{counter} Toot} other {{counter} Toots}}",
"account.unblock": "განბლოკე @{name}",
"account.unblock_domain": "გამოაჩინე {domain}",
+ "account.unblock_short": "Unblock",
"account.unendorse": "არ გამოირჩეს პროფილზე",
"account.unfollow": "ნუღარ მიჰყვები",
"account.unmute": "ნუღარ აჩუმებ @{name}-ს",
"account.unmute_notifications": "ნუღარ აჩუმებ შეტყობინებებს @{name}-სგან",
+ "account.unmute_short": "Unmute",
"account_note.placeholder": "Click to add a note",
- "admin.dashboard.retention": "Retention",
+ "admin.dashboard.daily_retention": "User retention rate by day after sign-up",
+ "admin.dashboard.monthly_retention": "User retention rate by month after sign-up",
"admin.dashboard.retention.average": "Average",
"admin.dashboard.retention.cohort": "Sign-up month",
"admin.dashboard.retention.cohort_size": "New users",
@@ -104,6 +106,7 @@
"compose_form.poll.switch_to_single": "Change poll to allow for a single choice",
"compose_form.publish": "ტუტი",
"compose_form.publish_loud": "{publish}!",
+ "compose_form.save_changes": "Save changes",
"compose_form.sensitive.hide": "{count, plural, one {Mark media as sensitive} other {Mark media as sensitive}}",
"compose_form.sensitive.marked": "მედია მონიშნულია მგრძნობიარედ",
"compose_form.sensitive.unmarked": "მედია არაა მონიშნული მგრძნობიარედ",
@@ -165,6 +168,7 @@
"empty_column.community": "ლოკალური თაიმლაინი ცარიელია. დაწერეთ რაიმე ღიად ან ქენით რაიმე სხვა!",
"empty_column.direct": "ჯერ პირდაპირი წერილები არ გაქვთ. როდესაც მიიღებთ ან გააგზავნით, გამოჩნდება აქ.",
"empty_column.domain_blocks": "There are no hidden domains yet.",
+ "empty_column.explore_statuses": "Nothing is trending right now. Check back later!",
"empty_column.favourited_statuses": "You don't have any favourite toots yet. When you favourite one, it will show up here.",
"empty_column.favourites": "No one has favourited this toot yet. When someone does, they will show up here.",
"empty_column.follow_recommendations": "Looks like no suggestions could be generated for you. You can try using search to look for people you might know or explore trending hashtags.",
@@ -183,6 +187,12 @@
"error.unexpected_crash.next_steps_addons": "Try disabling them and refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
"errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard",
"errors.unexpected_crash.report_issue": "Report issue",
+ "explore.search_results": "Search results",
+ "explore.suggested_follows": "For you",
+ "explore.title": "Explore",
+ "explore.trending_links": "News",
+ "explore.trending_statuses": "Posts",
+ "explore.trending_tags": "Hashtags",
"follow_recommendations.done": "Done",
"follow_recommendations.heading": "Follow people you'd like to see posts from! Here are some suggestions.",
"follow_recommendations.lead": "Posts from people you follow will show up in chronological order on your home feed. Don't be afraid to make mistakes, you can unfollow people just as easily any time!",
@@ -284,6 +294,7 @@
"navigation_bar.discover": "აღმოაჩინე",
"navigation_bar.domain_blocks": "დამალული დომენები",
"navigation_bar.edit_profile": "შეცვალე პროფილი",
+ "navigation_bar.explore": "Explore",
"navigation_bar.favourites": "ფავორიტები",
"navigation_bar.filters": "გაჩუმებული სიტყვები",
"navigation_bar.follow_requests": "დადევნების მოთხოვნები",
@@ -298,6 +309,7 @@
"navigation_bar.preferences": "პრეფერენსიები",
"navigation_bar.public_timeline": "ფედერალური თაიმლაინი",
"navigation_bar.security": "უსაფრთხოება",
+ "notification.admin.sign_up": "{name} signed up",
"notification.favourite": "{name}-მა თქვენი სტატუსი აქცია ფავორიტად",
"notification.follow": "{name} გამოგყვათ",
"notification.follow_request": "{name} has requested to follow you",
@@ -306,13 +318,15 @@
"notification.poll": "A poll you have voted in has ended",
"notification.reblog": "{name}-მა დაბუსტა თქვენი სტატუსი",
"notification.status": "{name} just posted",
+ "notification.update": "{name} edited a post",
"notifications.clear": "შეტყობინებების გასუფთავება",
"notifications.clear_confirmation": "დარწმუნებული ხართ, გსურთ სამუდამოდ წაშალოთ ყველა თქვენი შეტყობინება?",
+ "notifications.column_settings.admin.sign_up": "New sign-ups:",
"notifications.column_settings.alert": "დესკტოპ შეტყობინებები",
"notifications.column_settings.favourite": "ფავორიტები:",
"notifications.column_settings.filter_bar.advanced": "Display all categories",
"notifications.column_settings.filter_bar.category": "Quick filter bar",
- "notifications.column_settings.filter_bar.show": "Show",
+ "notifications.column_settings.filter_bar.show_bar": "Show filter bar",
"notifications.column_settings.follow": "ახალი მიმდევრები:",
"notifications.column_settings.follow_request": "New follow requests:",
"notifications.column_settings.mention": "ხსენებები:",
@@ -322,7 +336,9 @@
"notifications.column_settings.show": "გამოჩნდეს სვეტში",
"notifications.column_settings.sound": "ხმის დაკვრა",
"notifications.column_settings.status": "New toots:",
- "notifications.column_settings.unread_markers.category": "Unread notification markers",
+ "notifications.column_settings.unread_notifications.category": "Unread notifications",
+ "notifications.column_settings.unread_notifications.highlight": "Highlight unread notifications",
+ "notifications.column_settings.update": "Edits:",
"notifications.filter.all": "All",
"notifications.filter.boosts": "Boosts",
"notifications.filter.favourites": "Favourites",
@@ -362,18 +378,54 @@
"regeneration_indicator.label": "იტვირთება…",
"regeneration_indicator.sublabel": "თქვენი სახლის ლენტა მზადდება!",
"relative_time.days": "{number}დღ",
+ "relative_time.full.days": "{number, plural, one {# day} other {# days}} ago",
+ "relative_time.full.hours": "{number, plural, one {# hour} other {# hours}} ago",
+ "relative_time.full.just_now": "just now",
+ "relative_time.full.minutes": "{number, plural, one {# minute} other {# minutes}} ago",
+ "relative_time.full.seconds": "{number, plural, one {# second} other {# seconds}} ago",
"relative_time.hours": "{number}სთ",
"relative_time.just_now": "ახლა",
"relative_time.minutes": "{number}წთ",
"relative_time.seconds": "{number}წმ",
"relative_time.today": "today",
"reply_indicator.cancel": "უარყოფა",
+ "report.block": "Block",
+ "report.block_explanation": "You will not see their posts. They will not be able to see your posts or follow you. They will be able to tell that they are blocked.",
+ "report.categories.other": "Other",
+ "report.categories.spam": "Spam",
+ "report.categories.violation": "Content violates one or more server rules",
+ "report.category.subtitle": "Choose the best match",
+ "report.category.title": "Tell us what's going on with this {type}",
+ "report.category.title_account": "profile",
+ "report.category.title_status": "post",
+ "report.close": "Done",
+ "report.comment.title": "Is there anything else you think we should know?",
"report.forward": "ფორვარდი {target}-ს",
"report.forward_hint": "ანგარიში სხვა სერვერიდანაა. გავაგზავნოთ რეპორტის ანონიმური ასლიც?",
- "report.hint": "რეპორტი გაეგზავნება თქვენი ინსტანციის მოდერატორებს. ქვემოთ შეგიძლიათ დაამატოთ მიზეზი თუ რატომ არეპორტებთ ამ ანგარიშს:",
+ "report.mute": "Mute",
+ "report.mute_explanation": "You will not see their posts. They can still follow you and see your posts and will not know that they are muted.",
+ "report.next": "Next",
"report.placeholder": "დამატებითი კომენტარები",
+ "report.reasons.dislike": "I don't like it",
+ "report.reasons.dislike_description": "It is not something you want to see",
+ "report.reasons.other": "It's something else",
+ "report.reasons.other_description": "The issue does not fit into other categories",
+ "report.reasons.spam": "It's spam",
+ "report.reasons.spam_description": "Malicious links, fake engagement, or repetitive replies",
+ "report.reasons.violation": "It violates server rules",
+ "report.reasons.violation_description": "You are aware that it breaks specific rules",
+ "report.rules.subtitle": "Select all that apply",
+ "report.rules.title": "Which rules are being violated?",
+ "report.statuses.subtitle": "Select all that apply",
+ "report.statuses.title": "Are there any posts that back up this report?",
"report.submit": "დასრულება",
"report.target": "არეპორტებთ {target}",
+ "report.thanks.take_action": "Here are your options for controlling what you see on Mastodon:",
+ "report.thanks.take_action_actionable": "While we review this, you can take action against @{name}:",
+ "report.thanks.title": "Don't want to see this?",
+ "report.thanks.title_actionable": "Thanks for reporting, we'll look into this.",
+ "report.unfollow": "Unfollow @{name}",
+ "report.unfollow_explanation": "You are following this account. To not see their posts in your home feed anymore, unfollow them.",
"search.placeholder": "ძებნა",
"search_popout.search_format": "დეტალური ძებნის ფორმა",
"search_popout.tips.full_text": "მარტივი ტექსტი აბრუნებს სტატუსებს რომლებიც შექმენით, აქციეთ ფავორიტად, დაბუსტეთ, ან რაშიც ასახელეთ, ასევე ემთხვევა მომხმარებლის სახელებს, დისპლეი სახელებს, და ჰეშტეგებს.",
@@ -382,7 +434,9 @@
"search_popout.tips.text": "მარტივი ტექსტი აბრუნებს დამთხვეულ დისპლეი სახელებს, მომხმარებლის სახელებს და ჰეშტეგებს",
"search_popout.tips.user": "მომხმარებელი",
"search_results.accounts": "ხალხი",
+ "search_results.all": "All",
"search_results.hashtags": "ჰეშტეგები",
+ "search_results.nothing_found": "Could not find anything for these search terms",
"search_results.statuses": "ტუტები",
"search_results.statuses_fts_disabled": "Searching toots by their content is not enabled on this Mastodon server.",
"search_results.total": "{count, number} {count, plural, one {result} other {results}}",
@@ -396,9 +450,14 @@
"status.delete": "წაშლა",
"status.detailed_status": "Detailed conversation view",
"status.direct": "პირდაპირი წერილი @{name}-ს",
+ "status.edit": "Edit",
+ "status.edited": "Edited {date}",
+ "status.edited_x_times": "Edited {count, plural, one {{count} time} other {{count} times}}",
"status.embed": "ჩართვა",
"status.favourite": "ფავორიტი",
"status.filtered": "ფილტრირებული",
+ "status.history.created": "{name} created {date}",
+ "status.history.edited": "{name} edited {date}",
"status.load_more": "მეტის ჩატვირთვა",
"status.media_hidden": "მედია დამალულია",
"status.mention": "ასახელე @{name}",
diff --git a/app/javascript/mastodon/locales/kab.json b/app/javascript/mastodon/locales/kab.json
index 632054786..d6fcc2c7b 100644
--- a/app/javascript/mastodon/locales/kab.json
+++ b/app/javascript/mastodon/locales/kab.json
@@ -18,12 +18,12 @@
"account.followers": "Imeḍfaren",
"account.followers.empty": "Ar tura, ulac yiwen i yeṭṭafaṛen amseqdac-agi.",
"account.followers_counter": "{count, plural, one {{count} n umeḍfar} other {{count} n imeḍfaren}}",
+ "account.following": "Following",
"account.following_counter": "{count, plural, one {{counter} yeṭṭafaren} aḍfar {{counter} wayeḍ}}",
"account.follows.empty": "Ar tura, amseqdac-agi ur yeṭṭafaṛ yiwen.",
"account.follows_you": "Yeṭṭafaṛ-ik",
"account.hide_reblogs": "Ffer ayen i ibeṭṭu @{name}",
"account.joined": "Yerna-d {date}",
- "account.last_status": "Armud aneggaru",
"account.link_verified_on": "Taɣara n useɣwen-a tettwasenqed ass n {date}",
"account.locked_info": "Amiḍan-agi uslig isekweṛ. D bab-is kan i izemren ad yeǧǧ, s ufus-is, win ara t-iḍefṛen.",
"account.media": "Amidya",
@@ -32,7 +32,6 @@
"account.mute": "Sgugem @{name}",
"account.mute_notifications": "Sgugem tilɣa sγur @{name}",
"account.muted": "Yettwasgugem",
- "account.never_active": "Werǧin",
"account.posts": "Tijewwaqin",
"account.posts_with_replies": "Tijewwaqin akked tririyin",
"account.report": "Cetki ɣef @{name}",
@@ -42,15 +41,18 @@
"account.statuses_counter": "{count, plural, one {{counter} ajewwaq} other {{counter} ijewwaqen}}",
"account.unblock": "Serreḥ i @{name}",
"account.unblock_domain": "Ssken-d {domain}",
+ "account.unblock_short": "Unblock",
"account.unendorse": "Ur ttwellih ara fell-as deg umaɣnu-inek",
"account.unfollow": "Ur ṭṭafaṛ ara",
"account.unmute": "Kkes asgugem ɣef @{name}",
"account.unmute_notifications": "Serreḥ ilɣa sɣur @{name}",
+ "account.unmute_short": "Unmute",
"account_note.placeholder": "Ulac iwenniten",
- "admin.dashboard.retention": "Retention",
+ "admin.dashboard.daily_retention": "User retention rate by day after sign-up",
+ "admin.dashboard.monthly_retention": "User retention rate by month after sign-up",
"admin.dashboard.retention.average": "Average",
"admin.dashboard.retention.cohort": "Sign-up month",
- "admin.dashboard.retention.cohort_size": "New users",
+ "admin.dashboard.retention.cohort_size": "Iseqdacen imaynuten",
"alert.rate_limited.message": "Ma ulac aɣilif ɛreḍ tikelt-nniḍen akka {retry_time, time, medium}.",
"alert.rate_limited.title": "Aktum s talast",
"alert.unexpected.message": "Yeḍra-d unezri ur netturaǧu ara.",
@@ -104,6 +106,7 @@
"compose_form.poll.switch_to_single": "Change poll to allow for a single choice",
"compose_form.publish": "Jewweq",
"compose_form.publish_loud": "{publish}!",
+ "compose_form.save_changes": "Sekles ibeddilen",
"compose_form.sensitive.hide": "Creḍ allal n teywalt d anafri",
"compose_form.sensitive.marked": "Allal n teywalt yettwacreḍ d anafri",
"compose_form.sensitive.unmarked": "Allal n teywalt ur yettwacreḍ ara d anafri",
@@ -118,7 +121,7 @@
"confirmations.delete.message": "Tebɣiḍ s tidet ad tekkseḍ tasuffeɣt-agi?",
"confirmations.delete_list.confirm": "Kkes",
"confirmations.delete_list.message": "Tebɣiḍ s tidet ad tekkseḍ umuɣ-agi i lebda?",
- "confirmations.discard_edit_media.confirm": "Discard",
+ "confirmations.discard_edit_media.confirm": "Sefsex",
"confirmations.discard_edit_media.message": "You have unsaved changes to the media description or preview, discard them anyway?",
"confirmations.domain_block.confirm": "Ffer taɣult meṛṛa",
"confirmations.domain_block.message": "Are you really, really sure you want to block the entire {domain}? In most cases a few targeted blocks or mutes are sufficient and preferable. You will not see content from that domain in any public timelines or your notifications. Your followers from that domain will be removed.",
@@ -165,6 +168,7 @@
"empty_column.community": "Tasuddemt tazayezt tadigant n yisallen d tilemt. Aru ihi kra akken ad tt-teččareḍ!",
"empty_column.direct": "Ulac ɣur-k ula yiwen n yizen usrid. Ad d-yettwasken da, ticki tuzneḍ neɣ teṭṭfeḍ-d yiwen.",
"empty_column.domain_blocks": "Ulac kra n taɣult yettwaffren ar tura.",
+ "empty_column.explore_statuses": "Nothing is trending right now. Check back later!",
"empty_column.favourited_statuses": "Ulac ula yiwet n tjewwaqt deg yismenyifen-ik ar tura. Ticki Tella-d yiwet, ad d-ban da.",
"empty_column.favourites": "Ula yiwen ur yerri tajewwaqt-agi deg yismenyifen-is. Melmi i d-yella waya, ad d-yettwasken da.",
"empty_column.follow_recommendations": "Looks like no suggestions could be generated for you. You can try using search to look for people you might know or explore trending hashtags.",
@@ -183,6 +187,12 @@
"error.unexpected_crash.next_steps_addons": "Try disabling them and refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
"errors.unexpected_crash.copy_stacktrace": "Nɣel stacktrace ɣef wafus",
"errors.unexpected_crash.report_issue": "Mmel ugur",
+ "explore.search_results": "Search results",
+ "explore.suggested_follows": "I kečč·kem",
+ "explore.title": "Explore",
+ "explore.trending_links": "News",
+ "explore.trending_statuses": "Tisuffaɣ",
+ "explore.trending_tags": "Ihacṭagen",
"follow_recommendations.done": "Immed",
"follow_recommendations.heading": "Follow people you'd like to see posts from! Here are some suggestions.",
"follow_recommendations.lead": "Posts from people you follow will show up in chronological order on your home feed. Don't be afraid to make mistakes, you can unfollow people just as easily any time!",
@@ -284,6 +294,7 @@
"navigation_bar.discover": "Ẓer",
"navigation_bar.domain_blocks": "Tiɣula yeffren",
"navigation_bar.edit_profile": "Ẓreg amaɣnu",
+ "navigation_bar.explore": "Explore",
"navigation_bar.favourites": "Ismenyifen",
"navigation_bar.filters": "Awalen i yettwasgugmen",
"navigation_bar.follow_requests": "Isuturen n teḍfeṛt",
@@ -298,6 +309,7 @@
"navigation_bar.preferences": "Imenyafen",
"navigation_bar.public_timeline": "Tasuddemt tazayezt tamatut",
"navigation_bar.security": "Taɣellist",
+ "notification.admin.sign_up": "{name} signed up",
"notification.favourite": "{name} yesmenyef tasuffeɣt-ik·im",
"notification.follow": "{name} yeṭṭafaṛ-ik",
"notification.follow_request": "{name} yessuter-d ad k-yeḍfeṛ",
@@ -306,13 +318,15 @@
"notification.poll": "Tfukk tefrant ideg tettekkaḍ",
"notification.reblog": "{name} yebḍa tajewwiqt-ik i tikelt-nniḍen",
"notification.status": "{name} akken i d-yessufeɣ",
+ "notification.update": "{name} edited a post",
"notifications.clear": "Sfeḍ tilɣa",
"notifications.clear_confirmation": "Tebɣiḍ s tidet ad tekkseḍ akk tilɣa-inek·em i lebda?",
+ "notifications.column_settings.admin.sign_up": "New sign-ups:",
"notifications.column_settings.alert": "Tilɣa n tnarit",
"notifications.column_settings.favourite": "Ismenyifen:",
"notifications.column_settings.filter_bar.advanced": "Ssken-d meṛṛa tiggayin",
"notifications.column_settings.filter_bar.category": "Iri n usizdeg uzrib",
- "notifications.column_settings.filter_bar.show": "Ssken",
+ "notifications.column_settings.filter_bar.show_bar": "Show filter bar",
"notifications.column_settings.follow": "Imeḍfaṛen imaynuten:",
"notifications.column_settings.follow_request": "Isuturen imaynuten n teḍfeṛt:",
"notifications.column_settings.mention": "Abdar:",
@@ -322,7 +336,9 @@
"notifications.column_settings.show": "Ssken-d tilɣa deg ujgu",
"notifications.column_settings.sound": "Rmed imesli",
"notifications.column_settings.status": "Tiẓenẓunin timaynutin:",
- "notifications.column_settings.unread_markers.category": "Unread notification markers",
+ "notifications.column_settings.unread_notifications.category": "Unread notifications",
+ "notifications.column_settings.unread_notifications.highlight": "Highlight unread notifications",
+ "notifications.column_settings.update": "Edits:",
"notifications.filter.all": "Akk",
"notifications.filter.boosts": "Seǧhed",
"notifications.filter.favourites": "Ismenyifen",
@@ -362,18 +378,54 @@
"regeneration_indicator.label": "Yessalay-d…",
"regeneration_indicator.sublabel": "Tasuddemt tagejdant ara d-tettwaheggay!",
"relative_time.days": "{number}u",
+ "relative_time.full.days": "{number, plural, one {# day} other {# days}} ago",
+ "relative_time.full.hours": "{number, plural, one {# hour} other {# hours}} ago",
+ "relative_time.full.just_now": "tura kan",
+ "relative_time.full.minutes": "{number, plural, one {# minute} other {# minutes}} ago",
+ "relative_time.full.seconds": "{number, plural, one {# second} other {# seconds}} ago",
"relative_time.hours": "{number}isr",
"relative_time.just_now": "tura",
"relative_time.minutes": "{number}tis",
"relative_time.seconds": "{number}tas",
"relative_time.today": "assa",
"reply_indicator.cancel": "Sefsex",
+ "report.block": "Block",
+ "report.block_explanation": "You will not see their posts. They will not be able to see your posts or follow you. They will be able to tell that they are blocked.",
+ "report.categories.other": "Tiyyaḍ",
+ "report.categories.spam": "Aspam",
+ "report.categories.violation": "Content violates one or more server rules",
+ "report.category.subtitle": "Choose the best match",
+ "report.category.title": "Tell us what's going on with this {type}",
+ "report.category.title_account": "ameγnu",
+ "report.category.title_status": "tasuffeɣt",
+ "report.close": "Immed",
+ "report.comment.title": "Is there anything else you think we should know?",
"report.forward": "Bren-it ɣeṛ {target}",
"report.forward_hint": "The account is from another server. Send an anonymized copy of the report there as well?",
- "report.hint": "The report will be sent to your server moderators. You can provide an explanation of why you are reporting this account below:",
+ "report.mute": "Sgugem",
+ "report.mute_explanation": "You will not see their posts. They can still follow you and see your posts and will not know that they are muted.",
+ "report.next": "Next",
"report.placeholder": "Iwenniten-nniḍen",
+ "report.reasons.dislike": "I don't like it",
+ "report.reasons.dislike_description": "It is not something you want to see",
+ "report.reasons.other": "It's something else",
+ "report.reasons.other_description": "The issue does not fit into other categories",
+ "report.reasons.spam": "It's spam",
+ "report.reasons.spam_description": "Malicious links, fake engagement, or repetitive replies",
+ "report.reasons.violation": "It violates server rules",
+ "report.reasons.violation_description": "You are aware that it breaks specific rules",
+ "report.rules.subtitle": "Select all that apply",
+ "report.rules.title": "Which rules are being violated?",
+ "report.statuses.subtitle": "Select all that apply",
+ "report.statuses.title": "Are there any posts that back up this report?",
"report.submit": "Azen",
"report.target": "Mmel {target}",
+ "report.thanks.take_action": "Here are your options for controlling what you see on Mastodon:",
+ "report.thanks.take_action_actionable": "While we review this, you can take action against @{name}:",
+ "report.thanks.title": "Don't want to see this?",
+ "report.thanks.title_actionable": "Thanks for reporting, we'll look into this.",
+ "report.unfollow": "Unfollow @{name}",
+ "report.unfollow_explanation": "You are following this account. To not see their posts in your home feed anymore, unfollow them.",
"search.placeholder": "Nadi",
"search_popout.search_format": "Anadi yenneflin",
"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.",
@@ -382,7 +434,9 @@
"search_popout.tips.text": "Simple text returns matching display names, usernames and hashtags",
"search_popout.tips.user": "amseqdac",
"search_results.accounts": "Medden",
+ "search_results.all": "All",
"search_results.hashtags": "Ihacṭagen",
+ "search_results.nothing_found": "Could not find anything for these search terms",
"search_results.statuses": "Tibeṛṛaniyin",
"search_results.statuses_fts_disabled": "Anadi ɣef tjewwiqin s ugbur-nsent ur yermid ara deg uqeddac-agi n Maṣṭudun.",
"search_results.total": "{count, number} {count, plural, one {n ugemmuḍ} other {n yigemmuḍen}}",
@@ -396,9 +450,14 @@
"status.delete": "Kkes",
"status.detailed_status": "Detailed conversation view",
"status.direct": "Izen usrid i @{name}",
+ "status.edit": "Ẓreg",
+ "status.edited": "Tettwaẓreg deg {date}",
+ "status.edited_x_times": "Edited {count, plural, one {{count} time} other {{count} times}}",
"status.embed": "Seddu",
"status.favourite": "Rnu ɣer yismenyifen",
"status.filtered": "Yettwasizdeg",
+ "status.history.created": "{name} created {date}",
+ "status.history.edited": "{name} edited {date}",
"status.load_more": "Sali ugar",
"status.media_hidden": "Taɣwalt tettwaffer",
"status.mention": "Bder-d @{name}",
diff --git a/app/javascript/mastodon/locales/kk.json b/app/javascript/mastodon/locales/kk.json
index 1407a0991..28156f956 100644
--- a/app/javascript/mastodon/locales/kk.json
+++ b/app/javascript/mastodon/locales/kk.json
@@ -18,12 +18,12 @@
"account.followers": "Оқырмандар",
"account.followers.empty": "Әлі ешкім жазылмаған.",
"account.followers_counter": "{count, plural, one {{counter} Оқырман} other {{counter} Оқырман}}",
+ "account.following": "Following",
"account.following_counter": "{count, plural, one {{counter} Жазылым} other {{counter} Жазылым}}",
"account.follows.empty": "Ешкімге жазылмапты.",
"account.follows_you": "Сізге жазылыпты",
"account.hide_reblogs": "@{name} атты қолданушының әрекеттерін жасыру",
"account.joined": "Joined {date}",
- "account.last_status": "Соңғы белсенділік",
"account.link_verified_on": "Сілтеме меншігі расталған күн {date}",
"account.locked_info": "Бұл қолданушы өзі туралы мәліметтерді жасырған. Тек жазылғандар ғана көре алады.",
"account.media": "Медиа",
@@ -32,7 +32,6 @@
"account.mute": "Үнсіз қылу @{name}",
"account.mute_notifications": "@{name} туралы ескертпелерді жасыру",
"account.muted": "Үнсіз",
- "account.never_active": "Ешқашан",
"account.posts": "Жазбалар",
"account.posts_with_replies": "Жазбалар мен жауаптар",
"account.report": "Шағымдану @{name}",
@@ -42,12 +41,15 @@
"account.statuses_counter": "{count, plural, one {{counter} Пост} other {{counter} Пост}}",
"account.unblock": "Бұғаттан шығару @{name}",
"account.unblock_domain": "Бұғаттан шығару {domain}",
+ "account.unblock_short": "Unblock",
"account.unendorse": "Профильде рекомендемеу",
"account.unfollow": "Оқымау",
"account.unmute": "@{name} ескертпелерін қосу",
"account.unmute_notifications": "@{name} ескертпелерін көрсету",
+ "account.unmute_short": "Unmute",
"account_note.placeholder": "Жазба қалдыру үшін бас",
- "admin.dashboard.retention": "Retention",
+ "admin.dashboard.daily_retention": "User retention rate by day after sign-up",
+ "admin.dashboard.monthly_retention": "User retention rate by month after sign-up",
"admin.dashboard.retention.average": "Average",
"admin.dashboard.retention.cohort": "Sign-up month",
"admin.dashboard.retention.cohort_size": "New users",
@@ -104,6 +106,7 @@
"compose_form.poll.switch_to_single": "Тек бір жауап таңдайтындай қылу",
"compose_form.publish": "Түрт",
"compose_form.publish_loud": "{publish}!",
+ "compose_form.save_changes": "Save changes",
"compose_form.sensitive.hide": "Сезімтал ретінде белгіле",
"compose_form.sensitive.marked": "Медиа нәзік деп белгіленген",
"compose_form.sensitive.unmarked": "Медиа нәзік деп белгіленбеген",
@@ -165,6 +168,7 @@
"empty_column.community": "Жергілікті желі бос. Сіз бастап жазыңыз!",
"empty_column.direct": "Әзірше дым хат жоқ. Өзіңіз жазып көріңіз алдымен.",
"empty_column.domain_blocks": "Бұғатталған домен жоқ.",
+ "empty_column.explore_statuses": "Nothing is trending right now. Check back later!",
"empty_column.favourited_statuses": "Ешқандай жазба 'Таңдаулылар' тізіміне қосылмапты. Қосылғаннан кейін осында жинала бастайды.",
"empty_column.favourites": "Бұл постты әлі ешкім 'Таңдаулылар' тізіміне қоспапты. Біреу бастағаннан кейін осында көрінетін болады.",
"empty_column.follow_recommendations": "Looks like no suggestions could be generated for you. You can try using search to look for people you might know or explore trending hashtags.",
@@ -183,6 +187,12 @@
"error.unexpected_crash.next_steps_addons": "Try disabling them and refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
"errors.unexpected_crash.copy_stacktrace": "Жиынтықты көшіріп ал клипбордқа",
"errors.unexpected_crash.report_issue": "Мәселені хабарла",
+ "explore.search_results": "Search results",
+ "explore.suggested_follows": "For you",
+ "explore.title": "Explore",
+ "explore.trending_links": "News",
+ "explore.trending_statuses": "Posts",
+ "explore.trending_tags": "Hashtags",
"follow_recommendations.done": "Done",
"follow_recommendations.heading": "Follow people you'd like to see posts from! Here are some suggestions.",
"follow_recommendations.lead": "Posts from people you follow will show up in chronological order on your home feed. Don't be afraid to make mistakes, you can unfollow people just as easily any time!",
@@ -284,6 +294,7 @@
"navigation_bar.discover": "шарлау",
"navigation_bar.domain_blocks": "Жабық домендер",
"navigation_bar.edit_profile": "Профиль түзету",
+ "navigation_bar.explore": "Explore",
"navigation_bar.favourites": "Таңдаулылар",
"navigation_bar.filters": "Үнсіз сөздер",
"navigation_bar.follow_requests": "Жазылуға сұранғандар",
@@ -298,6 +309,7 @@
"navigation_bar.preferences": "Басымдықтар",
"navigation_bar.public_timeline": "Жаһандық желі",
"navigation_bar.security": "Қауіпсіздік",
+ "notification.admin.sign_up": "{name} signed up",
"notification.favourite": "{name} жазбаңызды таңдаулыға қосты",
"notification.follow": "{name} сізге жазылды",
"notification.follow_request": "{name} сізге жазылғысы келеді",
@@ -306,13 +318,15 @@
"notification.poll": "Бұл сауалнаманың мерзімі аяқталыпты",
"notification.reblog": "{name} жазбаңызды бөлісті",
"notification.status": "{name} just posted",
+ "notification.update": "{name} edited a post",
"notifications.clear": "Ескертпелерді тазарт",
"notifications.clear_confirmation": "Шынымен барлық ескертпелерді өшіресіз бе?",
+ "notifications.column_settings.admin.sign_up": "New sign-ups:",
"notifications.column_settings.alert": "Үстел ескертпелері",
"notifications.column_settings.favourite": "Таңдаулылар:",
"notifications.column_settings.filter_bar.advanced": "Барлық категорияны көрсет",
"notifications.column_settings.filter_bar.category": "Жедел сүзгі",
- "notifications.column_settings.filter_bar.show": "Көрсету",
+ "notifications.column_settings.filter_bar.show_bar": "Show filter bar",
"notifications.column_settings.follow": "Жаңа оқырмандар:",
"notifications.column_settings.follow_request": "Жазылуға жаңа сұранымдар:",
"notifications.column_settings.mention": "Аталымдар:",
@@ -322,7 +336,9 @@
"notifications.column_settings.show": "Бағанда көрсет",
"notifications.column_settings.sound": "Дыбысын қос",
"notifications.column_settings.status": "New toots:",
- "notifications.column_settings.unread_markers.category": "Unread notification markers",
+ "notifications.column_settings.unread_notifications.category": "Unread notifications",
+ "notifications.column_settings.unread_notifications.highlight": "Highlight unread notifications",
+ "notifications.column_settings.update": "Edits:",
"notifications.filter.all": "Барлығы",
"notifications.filter.boosts": "Бөлісулер",
"notifications.filter.favourites": "Таңдаулылар",
@@ -362,18 +378,54 @@
"regeneration_indicator.label": "Жүктеу…",
"regeneration_indicator.sublabel": "Жергілікті желі құрылуда!",
"relative_time.days": "{number}күн",
+ "relative_time.full.days": "{number, plural, one {# day} other {# days}} ago",
+ "relative_time.full.hours": "{number, plural, one {# hour} other {# hours}} ago",
+ "relative_time.full.just_now": "just now",
+ "relative_time.full.minutes": "{number, plural, one {# minute} other {# minutes}} ago",
+ "relative_time.full.seconds": "{number, plural, one {# second} other {# seconds}} ago",
"relative_time.hours": "{number}сағ",
"relative_time.just_now": "жаңа",
"relative_time.minutes": "{number}мин",
"relative_time.seconds": "{number}с",
"relative_time.today": "бүгін",
"reply_indicator.cancel": "Қайтып алу",
+ "report.block": "Block",
+ "report.block_explanation": "You will not see their posts. They will not be able to see your posts or follow you. They will be able to tell that they are blocked.",
+ "report.categories.other": "Other",
+ "report.categories.spam": "Spam",
+ "report.categories.violation": "Content violates one or more server rules",
+ "report.category.subtitle": "Choose the best match",
+ "report.category.title": "Tell us what's going on with this {type}",
+ "report.category.title_account": "profile",
+ "report.category.title_status": "post",
+ "report.close": "Done",
+ "report.comment.title": "Is there anything else you think we should know?",
"report.forward": "Жіберу {target}",
"report.forward_hint": "Бұл аккаунт басқа серверден. Аноним шағым жібересіз бе?",
- "report.hint": "Шағым сіздің модераторларға жіберіледі. Шағымның себептерін мына жерге жазуыңызға болады:",
+ "report.mute": "Mute",
+ "report.mute_explanation": "You will not see their posts. They can still follow you and see your posts and will not know that they are muted.",
+ "report.next": "Next",
"report.placeholder": "Қосымша пікірлер",
+ "report.reasons.dislike": "I don't like it",
+ "report.reasons.dislike_description": "It is not something you want to see",
+ "report.reasons.other": "It's something else",
+ "report.reasons.other_description": "The issue does not fit into other categories",
+ "report.reasons.spam": "It's spam",
+ "report.reasons.spam_description": "Malicious links, fake engagement, or repetitive replies",
+ "report.reasons.violation": "It violates server rules",
+ "report.reasons.violation_description": "You are aware that it breaks specific rules",
+ "report.rules.subtitle": "Select all that apply",
+ "report.rules.title": "Which rules are being violated?",
+ "report.statuses.subtitle": "Select all that apply",
+ "report.statuses.title": "Are there any posts that back up this report?",
"report.submit": "Жіберу",
"report.target": "Шағымдану {target}",
+ "report.thanks.take_action": "Here are your options for controlling what you see on Mastodon:",
+ "report.thanks.take_action_actionable": "While we review this, you can take action against @{name}:",
+ "report.thanks.title": "Don't want to see this?",
+ "report.thanks.title_actionable": "Thanks for reporting, we'll look into this.",
+ "report.unfollow": "Unfollow @{name}",
+ "report.unfollow_explanation": "You are following this account. To not see their posts in your home feed anymore, unfollow them.",
"search.placeholder": "Іздеу",
"search_popout.search_format": "Кеңейтілген іздеу форматы",
"search_popout.tips.full_text": "Simple text returns statuses you have written, favourited, bоosted, or have been mentioned in, as well as matching usernames, display names, and hashtags.",
@@ -382,7 +434,9 @@
"search_popout.tips.text": "Simple text returns matching display names, usernames аnd hashtags",
"search_popout.tips.user": "қолданушы",
"search_results.accounts": "Адамдар",
+ "search_results.all": "All",
"search_results.hashtags": "Хэштегтер",
+ "search_results.nothing_found": "Could not find anything for these search terms",
"search_results.statuses": "Жазбалар",
"search_results.statuses_fts_disabled": "Mastodon серверінде постты толық мәтінмен іздей алмайсыз.",
"search_results.total": "{count, number} {count, plural, one {нәтиже} other {нәтиже}}",
@@ -396,9 +450,14 @@
"status.delete": "Өшіру",
"status.detailed_status": "Толық пікірталас көрінісі",
"status.direct": "Хат жіберу @{name}",
+ "status.edit": "Edit",
+ "status.edited": "Edited {date}",
+ "status.edited_x_times": "Edited {count, plural, one {{count} time} other {{count} times}}",
"status.embed": "Embеd",
"status.favourite": "Таңдаулы",
"status.filtered": "Фильтрленген",
+ "status.history.created": "{name} created {date}",
+ "status.history.edited": "{name} edited {date}",
"status.load_more": "Тағы әкел",
"status.media_hidden": "Жабық медиа",
"status.mention": "Аталым @{name}",
diff --git a/app/javascript/mastodon/locales/kmr.json b/app/javascript/mastodon/locales/kmr.json
deleted file mode 100644
index 8f862606d..000000000
--- a/app/javascript/mastodon/locales/kmr.json
+++ /dev/null
@@ -1,484 +0,0 @@
-{
- "account.account_note_header": "Nîşe",
- "account.add_or_remove_from_list": "Tevlî bike an rake ji rêzokê",
- "account.badges.bot": "Bot",
- "account.badges.group": "Kom",
- "account.block": "@{name} asteng bike",
- "account.block_domain": "{domain} navpar asteng bike",
- "account.blocked": "Astengkirî",
- "account.browse_more_on_origin_server": "Li pelên resen bêhtir bigere",
- "account.cancel_follow_request": "Daxwaza şopandinê rake",
- "account.direct": "Peyamekê bişîne @{name}",
- "account.disable_notifications": "Êdî min agahdar neke gava @{name} diweşîne",
- "account.domain_blocked": "Navper hate astengkirin",
- "account.edit_profile": "Profîl serrast bike",
- "account.enable_notifications": "Min agahdar bike gava @{name} diweşîne",
- "account.endorse": "Taybetiyên li ser profîl",
- "account.follow": "Bişopîne",
- "account.followers": "Şopîner",
- "account.followers.empty": "Kesekî hin ev bikarhêner neşopandiye.",
- "account.followers_counter": "{count, plural, one {{counter} Follower} other {{counter} Followers}}",
- "account.following_counter": "{count, plural, one {{counter} Dişopîne} other {{counter} Dişopîne}}",
- "account.follows.empty": "Ev bikarhêner hin kesekî heya niha neşopandiye.",
- "account.follows_you": "Te dişopîne",
- "account.hide_reblogs": "Boost ên ji @{name} veşêre",
- "account.joined": "Tevlîbû di {date} de",
- "account.last_status": "Çalakiya dawî",
- "account.link_verified_on": "Xwedaniya li vê girêdanê di {date} de hatiye kontrolkirin",
- "account.locked_info": "Rewşa vê ajimêrê wek kilît kirî hatiye saz kirin. Xwedî yê ajimêrê, kesên vê bişopîne bi dest vekolin dike.",
- "account.media": "Medya",
- "account.mention": "Qal @{name} bike",
- "account.moved_to": "{name} hate livandin bo:",
- "account.mute": "@{name} Bêdeng bike",
- "account.mute_notifications": "Agahdariyan ji @{name} bêdeng bike",
- "account.muted": "Bêdengkirî",
- "account.never_active": "Tu car",
- "account.posts": "Şandî",
- "account.posts_with_replies": "Toot û bersiv",
- "account.report": "@{name} Ragihîne",
- "account.requested": "Li benda erêkirinê ye. Ji bo betal kirina daxwazê pêl bikin",
- "account.share": "Profîla @{name} parve bike",
- "account.show_reblogs": "Boostên @{name} nîşan bike",
- "account.statuses_counter": "{count, plural,one {{counter} şandî}other {{counter} şandî}}",
- "account.unblock": "Astengê li ser @{name} rake",
- "account.unblock_domain": "Astengê li ser navperê {domain} rake",
- "account.unendorse": "Li ser profîl nîşan neke",
- "account.unfollow": "Neşopîne",
- "account.unmute": "@{name} Bêdeng bike",
- "account.unmute_notifications": "Agahdariyan ji @{name} bêdeng bike",
- "account_note.placeholder": "Bitikîne bo nîşeyekê tevlî bikî",
- "admin.dashboard.retention": "Retention",
- "admin.dashboard.retention.average": "Average",
- "admin.dashboard.retention.cohort": "Sign-up month",
- "admin.dashboard.retention.cohort_size": "New users",
- "alert.rate_limited.message": "Jkx dîsa biceribîne piştî {retry_time, time, medium}.\n \n",
- "alert.rate_limited.title": "Rêje sînorkirî ye",
- "alert.unexpected.message": "Çewtiyeke bêhêvî çê bû.",
- "alert.unexpected.title": "Wey li min!",
- "announcement.announcement": "Daxuyanî",
- "attachments_list.unprocessed": "(unprocessed)",
- "autosuggest_hashtag.per_week": "Her hefte {count}",
- "boost_modal.combo": "Ji bo derbas bî carekî din de pêlê {combo} bike",
- "bundle_column_error.body": "Di dema barkirina vê hêmanê de tiştek çewt çê bû.",
- "bundle_column_error.retry": "Dîsa biceribîne",
- "bundle_column_error.title": "Çewtiya torê",
- "bundle_modal_error.close": "Bigire",
- "bundle_modal_error.message": "Di dema barkirina vê hêmanê de tiştek çewt çê bû.",
- "bundle_modal_error.retry": "Dîsa bicerbîne",
- "column.blocks": "Bikarhênerên astengkirî",
- "column.bookmarks": "Şûnpel",
- "column.community": "Demnameya herêmî",
- "column.direct": "Peyamên taybet",
- "column.directory": "Li profîlan bigere",
- "column.domain_blocks": "Navperên astengkirî",
- "column.favourites": "Bijarte",
- "column.follow_requests": "Daxwazên şopandinê",
- "column.home": "Serrûpel",
- "column.lists": "Rêzok",
- "column.mutes": "Bikarhênerên bêdengkirî",
- "column.notifications": "Agahdarî",
- "column.pins": "Toot a derzîkirî",
- "column.public": "Demnameyê federalîkirî",
- "column_back_button.label": "Veger",
- "column_header.hide_settings": "Sazkariyan veşêre",
- "column_header.moveLeft_settings": "Stûnê bilivîne bo çepê",
- "column_header.moveRight_settings": "Stûnê bilivîne bo rastê",
- "column_header.pin": "Bi derzî bike",
- "column_header.show_settings": "Sazkariyan nîşan bide",
- "column_header.unpin": "Bi derzî neke",
- "column_subheading.settings": "Sazkarî",
- "community.column_settings.local_only": "Tenê herêmî",
- "community.column_settings.media_only": "Tenê media",
- "community.column_settings.remote_only": "Tenê ji dûr ve",
- "compose_form.direct_message_warning": "Ev toot tenê ji bikarhênerên behskirî re were şandin.",
- "compose_form.direct_message_warning_learn_more": "Bêtir fêr bibe",
- "compose_form.hashtag_warning": "Ev şandî ji ber ku nehatiye tomarkirin dê di binê hashtagê de neyê tomar kirin. Tenê peyamên gelemperî dikarin bi hashtagê werin lêgerîn.",
- "compose_form.lock_disclaimer": "Ajimêrê te {locked} nîne. Herkes dikare te bişopîne da ku şandiyên te yên tenê şopînerên te ra xûya dibin bibînin.",
- "compose_form.lock_disclaimer.lock": "girtî ye",
- "compose_form.placeholder": "Çi di hişê te derbas dibe?",
- "compose_form.poll.add_option": "Hilbijarekî tevlî bike",
- "compose_form.poll.duration": "Dema rapirsî yê",
- "compose_form.poll.option_placeholder": "{number} Hilbijêre",
- "compose_form.poll.remove_option": "Vê hilbijarê rake",
- "compose_form.poll.switch_to_multiple": "Rapirsî yê biguherînin da ku destûr bidin vebijarkên pirjimar",
- "compose_form.poll.switch_to_single": "Rapirsîyê biguherîne da ku mafê bidî tenê vebijêrkek",
- "compose_form.publish": "Toot",
- "compose_form.publish_loud": "{publish}!",
- "compose_form.sensitive.hide": "{count, plural, one {Medya wekî hestiyar nîşan bide} other {Medya wekî hestiyar nîşan bide}}",
- "compose_form.sensitive.marked": "{count, plural, one {Medya wekî hestiyar hate nîşan} other {Medya wekî hestiyar nîşan}}",
- "compose_form.sensitive.unmarked": "{count, plural, one {Medya wekî hestiyar nehatiye nîşan} other {Medya wekî hestiyar nehatiye nîşan}}",
- "compose_form.spoiler.marked": "Hişyariya naverokê rake",
- "compose_form.spoiler.unmarked": "Hişyariya naverokê tevlî bike",
- "compose_form.spoiler_placeholder": "Li vir hişyariya xwe binivîse",
- "confirmation_modal.cancel": "Dev jê berde",
- "confirmations.block.block_and_report": "Asteng bike & ragihîne",
- "confirmations.block.confirm": "Asteng bike",
- "confirmations.block.message": "Ma tu dixwazî ku {name} asteng bikî?",
- "confirmations.delete.confirm": "Jê bibe",
- "confirmations.delete.message": "Ma tu dixwazî vê şandiyê jê bibî?",
- "confirmations.delete_list.confirm": "Jê bibe",
- "confirmations.delete_list.message": "Ma tu dixwazî bi awayekî herdemî vê rêzokê jê bibî?",
- "confirmations.discard_edit_media.confirm": "Discard",
- "confirmations.discard_edit_media.message": "You have unsaved changes to the media description or preview, discard them anyway?",
- "confirmations.domain_block.confirm": "Hemî navperê asteng bike",
- "confirmations.domain_block.message": "Tu ji xwe bawerî, bi rastî tu dixwazî hemû {domain} asteng bikî? Di gelek rewşan de asteng kirin an jî bêdeng kirin têrê dike û tê tercîh kirin. Tu nikarî naveroka vê navperê di demnameyê an jî agahdariyên xwe de bibînî. Şopînerên te yê di vê navperê were jêbirin.",
- "confirmations.logout.confirm": "Derkeve",
- "confirmations.logout.message": "Ma tu dixwazî ku derkevî?",
- "confirmations.mute.confirm": "Bêdeng bike",
- "confirmations.mute.explanation": "Ev ê şandinên ji wan tê û şandinên ku behsa wan dike veşêre, lê hê jî maf dide ku ew şandinên te bibînin û te bişopînin.",
- "confirmations.mute.message": "Bi rastî tu dixwazî {name} bêdeng bikî?",
- "confirmations.redraft.confirm": "Jê bibe & ji nû ve serrast bike",
- "confirmations.redraft.message": "Bi rastî tu dixwazî şandî ye jê bibî û nûve reşnivîsek çê bikî? Bijare û şandîyên wenda bibin û bersivên ji bo şandiye orîjînal sêwî bimînin.",
- "confirmations.reply.confirm": "Bersivê bide",
- "confirmations.reply.message": "Bersiva niha li ser peyama ku tu niha berhev dikî dê binivsîne. Ma pê bawer î ku tu dixwazî bidomînî?",
- "confirmations.unfollow.confirm": "Neşopîne",
- "confirmations.unfollow.message": "Ma tu dixwazî ku dev ji şopa {name} berdî?",
- "conversation.delete": "Axaftinê jê bibe",
- "conversation.mark_as_read": "Wekî xwendî nîşan bide",
- "conversation.open": "Axaftinê nîşan bide",
- "conversation.with": "Bi {names} re",
- "directory.federated": "Ji fediversên naskirî",
- "directory.local": "Tenê ji {domain}",
- "directory.new_arrivals": "Kesên ku nû hatine",
- "directory.recently_active": "Di demên dawî de çalak",
- "embed.instructions": "Bi jêgirtina koda jêrîn vê şandiyê li ser malpera xwe bicîh bikin.",
- "embed.preview": "Wa ye wê wusa xuya bike:",
- "emoji_button.activity": "Çalakî",
- "emoji_button.custom": "Kesanekirî",
- "emoji_button.flags": "Nîşankirî",
- "emoji_button.food": "Xwarin û vexwarin",
- "emoji_button.label": "Emoji têxe",
- "emoji_button.nature": "Sirûştî",
- "emoji_button.not_found": "Hestokên lihevhatî nehate dîtin",
- "emoji_button.objects": "Tişt",
- "emoji_button.people": "Mirov",
- "emoji_button.recent": "Pir caran tê bikaranîn",
- "emoji_button.search": "Bigere...",
- "emoji_button.search_results": "Encamên lêgerînê",
- "emoji_button.symbols": "Sembol",
- "emoji_button.travel": "Geşt û şûn",
- "empty_column.account_suspended": "Ajimêr hatiye rawestandin",
- "empty_column.account_timeline": "Li vir şandî tune!",
- "empty_column.account_unavailable": "Profîl nayê peydakirin",
- "empty_column.blocks": "Te tu bikarhêner asteng nekiriye.",
- "empty_column.bookmarked_statuses": "Hîn tu peyamên şûnpelkirî tuneye. Gava ku hûn yek şûnpel bikin, ew ê li vir xûya bike.",
- "empty_column.community": "Demnameya herêmî vala ye. Tiştek ji raya giştî re binivsînin da ku rûpel biherike!",
- "empty_column.direct": "Hêj peyameke te yê rasterast tuneye. Gava ku tu yekî bişeynî an jî bigirî, ew ê li vir xûya bike.",
- "empty_column.domain_blocks": "Hê jî navperên hatine asteng kirin tune ne.",
- "empty_column.favourited_statuses": "Hîn tu peyamên te yên bijare tunene. Gava ku te yekî bijart, ew ê li vir xûya bike.",
- "empty_column.favourites": "Hîn tu kes vê peyamê nebijartiye. Gava ku hin kes bijartin, ew ê li vir xûya bikin.",
- "empty_column.follow_recommendations": "Wusa dixuye ku ji bo we tu pêşniyar nehatine çêkirin. Hûn dikarin lêgerînê bikarbînin da ku li kesên ku hûn nas dikin bigerin an hashtagên trendî bigerin.",
- "empty_column.follow_requests": "Hê jî daxwaza şopandinê tunne ye. Dema daxwazek hat, yê li vir were nîşan kirin.",
- "empty_column.hashtag": "Di vê hashtagê de hêj tiştekî tune.",
- "empty_column.home": "Demnameya mala we vala ye! Ji bona tijîkirinê bêtir mirovan bişopînin. {suggestions}",
- "empty_column.home.suggestions": "Hinek pêşniyaran bibîne",
- "empty_column.list": "Di vê rêzokê de hîn tiştek tune ye. Gava ku endamên vê rêzokê peyamên nû biweşînin, ew ê li vir xuya bibin.",
- "empty_column.lists": "Hêj qet rêzokê te tunne ye. Dema yek peyda bû, yê li vir were nîşan kirin.",
- "empty_column.mutes": "Te tu bikarhêner bêdeng nekiriye.",
- "empty_column.notifications": "Hêj hişyariyên te tunene. Dema ku mirovên din bi we re têkilî danîn, hûn ê wê li vir bibînin.",
- "empty_column.public": "Li vir tiştekî tuneye! Ji raya giştî re tiştekî binivîsîne, an ji bo tijîkirinê ji rajekerên din bikarhêneran bi destan bişopînin",
- "error.unexpected_crash.explanation": "Ji ber xeletîyeke di koda me da an jî ji ber mijara lihevhatina gerokan, ev rûpel rast nehat nîşandan.",
- "error.unexpected_crash.explanation_addons": "Ev rûpel bi awayekî rast nehat nîşandan. Ev çewtî mimkûn e ji ber lêzêdekirina gerokan an jî amûrên wergera xweberî pêk tê.",
- "error.unexpected_crash.next_steps": "Nûkirina rûpelê biceribîne. Heke ev bi kêr neyê, dibe ku te hîn jî bi rêya gerokeke cuda an jî sepana xwecîhê Mastodonê bi kar bîne.",
- "error.unexpected_crash.next_steps_addons": "Ne çalak kirin û nûkirina rûpelê biceribîne. Heke ev bi kêr neyê, dibe ku te hîn jî bi rêya gerokeke cuda an jî sepana xwecîhê Mastodonê bi kar bîne.",
- "errors.unexpected_crash.copy_stacktrace": "Şopa gemara (stacktrace) tûrikê ra jê bigire",
- "errors.unexpected_crash.report_issue": "Pirsgirêkekê ragihîne",
- "follow_recommendations.done": "Qediya",
- "follow_recommendations.heading": "Mirovên ku tu dixwazî ji wan peyaman bibînî bişopîne! Hin pêşnîyar li vir in.",
- "follow_recommendations.lead": "Li gorî rêza kronolojîkî peyamên mirovên ku tu dişopînî dê demnameya te de xûya bike. Ji xeletiyan netirse, bi awayekî hêsan her wextî tu dikarî dev ji şopandinê berdî!",
- "follow_request.authorize": "Mafê bide",
- "follow_request.reject": "Nepejir",
- "follow_requests.unlocked_explanation": "Tevlî ku ajimêra te ne kilît kiriye, karmendên {domain} digotin qey tu dixwazî ku pêşdîtina daxwazên şopandinê bi destan bike.",
- "generic.saved": "Tomarkirî",
- "getting_started.developers": "Pêşdebir",
- "getting_started.directory": "Rêgeha profîlê",
- "getting_started.documentation": "Pelbend",
- "getting_started.heading": "Destpêkirin",
- "getting_started.invite": "Mirovan Vexwîne",
- "getting_started.open_source_notice": "Mastodon nermalava çavkaniya vekirî ye. Tu dikarî pirsgirêkan li ser GitHub-ê ragihînî di {github} de an jî dikarî tevkariyê bikî.",
- "getting_started.security": "Sazkariyên ajimêr",
- "getting_started.terms": "Mercên karûberan",
- "hashtag.column_header.tag_mode.all": "û {additional}",
- "hashtag.column_header.tag_mode.any": "an {additional}",
- "hashtag.column_header.tag_mode.none": "bêyî {additional}",
- "hashtag.column_settings.select.no_options_message": "Ti pêşniyar nehatin dîtin",
- "hashtag.column_settings.select.placeholder": "Têkeve hashtagê…",
- "hashtag.column_settings.tag_mode.all": "Van hemûyan",
- "hashtag.column_settings.tag_mode.any": "Yek ji van",
- "hashtag.column_settings.tag_mode.none": "Ne yek ji van",
- "hashtag.column_settings.tag_toggle": "Ji bo vê stûnê hin pêvekan tevlî bike",
- "home.column_settings.basic": "Bingehîn",
- "home.column_settings.show_reblogs": "Boost'an nîşan bike",
- "home.column_settings.show_replies": "Bersivan nîşan bide",
- "home.hide_announcements": "Reklaman veşêre",
- "home.show_announcements": "Reklaman nîşan bide",
- "intervals.full.days": "{number, plural, one {# roj} other {# roj}}",
- "intervals.full.hours": "{number, plural, one {# demjimêr} other {# demjimêr}}\n \n",
- "intervals.full.minutes": "{number, plural, one {# xulek} other {# xulek}}",
- "keyboard_shortcuts.back": "Vegere paşê",
- "keyboard_shortcuts.blocked": "Rêzoka bikarhênerên astengkirî veke",
- "keyboard_shortcuts.boost": "Şandiya parve (boost) bike",
- "keyboard_shortcuts.column": "Stûna balkişandinê",
- "keyboard_shortcuts.compose": "Bal bikşîne cîhê nivîsê/textarea",
- "keyboard_shortcuts.description": "Danasîn",
- "keyboard_shortcuts.direct": "Ji stûnê peyamên rasterast veke",
- "keyboard_shortcuts.down": "Di rêzokê de dakêşe jêr",
- "keyboard_shortcuts.enter": "Şandiyê veke",
- "keyboard_shortcuts.favourite": "Şandiya bijarte",
- "keyboard_shortcuts.favourites": "Rêzokên bijarte veke",
- "keyboard_shortcuts.federated": "Demnameyê federalîkirî veke",
- "keyboard_shortcuts.heading": "Kurterêyên klavyeyê",
- "keyboard_shortcuts.home": "Demnameyê veke",
- "keyboard_shortcuts.hotkey": "Bişkoka kurterê",
- "keyboard_shortcuts.legend": "Vê çîrokê nîşan bike",
- "keyboard_shortcuts.local": "Demnameya herêmî veke",
- "keyboard_shortcuts.mention": "Qala nivîskarî/ê bike",
- "keyboard_shortcuts.muted": "Rêzoka bikarhênerên bêdeng kirî veke",
- "keyboard_shortcuts.my_profile": "Profîla xwe veke",
- "keyboard_shortcuts.notifications": "Stûnê agahdariyan veke",
- "keyboard_shortcuts.open_media": "Medya veke",
- "keyboard_shortcuts.pinned": "Şandiyên derzîkirî veke",
- "keyboard_shortcuts.profile": "Profîla nivîskaran veke",
- "keyboard_shortcuts.reply": "Bersivê bide şandiyê",
- "keyboard_shortcuts.requests": "Rêzoka daxwazên şopandinê veke",
- "keyboard_shortcuts.search": "Bal bide şivika lêgerînê",
- "keyboard_shortcuts.spoilers": "Zeviya hişyariya naverokê nîşan bide/veşêre",
- "keyboard_shortcuts.start": "Stûna \"destpêkê\" veke",
- "keyboard_shortcuts.toggle_hidden": "Nivîsa paş hişyariya naverokê nîşan bide/veşêre",
- "keyboard_shortcuts.toggle_sensitivity": "Medyayê nîşan bide/veşêre",
- "keyboard_shortcuts.toot": "Dest bi şandiyeke nû bike",
- "keyboard_shortcuts.unfocus": "Bal nede cîhê nivîsê /lêgerînê",
- "keyboard_shortcuts.up": "Di rêzokê de rake jor",
- "lightbox.close": "Bigire",
- "lightbox.compress": "Qutîya wêneya nîşan dike bitepisîne",
- "lightbox.expand": "Qutîya wêneya nîşan dike fireh bike",
- "lightbox.next": "Pêş",
- "lightbox.previous": "Paş",
- "lists.account.add": "Tevlî rêzokê bike",
- "lists.account.remove": "Ji rêzokê rake",
- "lists.delete": "Rêzokê jê bibe",
- "lists.edit": "Rêzokê serrast bike",
- "lists.edit.submit": "Sernavê biguherîne",
- "lists.new.create": "Rêzokê tevlî bike",
- "lists.new.title_placeholder": "Sernavê rêzoka nû",
- "lists.replies_policy.followed": "Bikarhênereke şopandî",
- "lists.replies_policy.list": "Endamên rêzokê",
- "lists.replies_policy.none": "Ne yek",
- "lists.replies_policy.title": "Bersivan nîşan bide:",
- "lists.search": "Di navbera kesên ku te dişopînin bigere",
- "lists.subheading": "Rêzokên te",
- "load_pending": "{count, plural, one {# hêmaneke nû} other {#hêmaneke nû}}",
- "loading_indicator.label": "Tê barkirin...",
- "media_gallery.toggle_visible": "{number, plural, one {Wêneyê veşêre} other {Wêneyan veşêre}}",
- "missing_indicator.label": "Nehate dîtin",
- "missing_indicator.sublabel": "Ev çavkanî nehat dîtin",
- "mute_modal.duration": "Dem",
- "mute_modal.hide_notifications": "Agahdariyan ji ev bikarhêner veşêre?",
- "mute_modal.indefinite": "Nediyar",
- "navigation_bar.apps": "Sepana mobîl",
- "navigation_bar.blocks": "Bikarhênerên astengkirî",
- "navigation_bar.bookmarks": "Şûnpel",
- "navigation_bar.community_timeline": "Demnameya herêmî",
- "navigation_bar.compose": "Şandiyeke nû binivsîne",
- "navigation_bar.direct": "Peyamên rasterast",
- "navigation_bar.discover": "Vekolê",
- "navigation_bar.domain_blocks": "Navparên astengkirî",
- "navigation_bar.edit_profile": "Profîl serrast bike",
- "navigation_bar.favourites": "Bijarte",
- "navigation_bar.filters": "Peyvên bêdengkirî",
- "navigation_bar.follow_requests": "Daxwazên şopandinê",
- "navigation_bar.follows_and_followers": "Yên tê şopandin û şopîner",
- "navigation_bar.info": "Derbarê vî rajekarî",
- "navigation_bar.keyboard_shortcuts": "Bişkoka kurterê",
- "navigation_bar.lists": "Rêzok",
- "navigation_bar.logout": "Derkeve",
- "navigation_bar.mutes": "Bikarhênerên bêdengkirî",
- "navigation_bar.personal": "Kesanî",
- "navigation_bar.pins": "Toot a derzîkirî",
- "navigation_bar.preferences": "Hilbijarte",
- "navigation_bar.public_timeline": "Demnameyê federalîkirî",
- "navigation_bar.security": "Ewlehî",
- "notification.favourite": "{name} şandiya te hez kir",
- "notification.follow": "{name} te şopand",
- "notification.follow_request": "{name} dixwazê te bişopîne",
- "notification.mention": "{name} qale te kir",
- "notification.own_poll": "Rapirsîya te qediya",
- "notification.poll": "Rapirsiyeke ku te deng daye qediya",
- "notification.reblog": "{name} şandiya te belav kir/ boost kir",
- "notification.status": "{name} niha şand",
- "notifications.clear": "Agahdariyan pak bike",
- "notifications.clear_confirmation": "Bi rastî tu dixwazî bi awayekî dawî hemû agahdariyên xwe pak bikî?",
- "notifications.column_settings.alert": "Agahdariyên sermaseyê",
- "notifications.column_settings.favourite": "Bijarte:",
- "notifications.column_settings.filter_bar.advanced": "Hemû beşan nîşan bide",
- "notifications.column_settings.filter_bar.category": "Şivika parzûna bilêz",
- "notifications.column_settings.filter_bar.show": "Nîşan bike",
- "notifications.column_settings.follow": "Şopînerên nû:",
- "notifications.column_settings.follow_request": "Daxwazên şopandinê nû:",
- "notifications.column_settings.mention": "Qalkirin:",
- "notifications.column_settings.poll": "Encamên rapirsiyê:",
- "notifications.column_settings.push": "Agahdarîyên yekser",
- "notifications.column_settings.reblog": "Bilindkirî:",
- "notifications.column_settings.show": "Di nav stûnê de nîşan bike",
- "notifications.column_settings.sound": "Deng lêxe",
- "notifications.column_settings.status": "Şandiyên nû:",
- "notifications.column_settings.unread_markers.category": "Nîşankerê agahdariyên nexwendî",
- "notifications.filter.all": "Hemû",
- "notifications.filter.boosts": "Bilindkirî",
- "notifications.filter.favourites": "Bijarte",
- "notifications.filter.follows": "Şopîner",
- "notifications.filter.mentions": "Qalkirin",
- "notifications.filter.polls": "Encamên rapirsiyê",
- "notifications.filter.statuses": "Ji kesên tu dişopînî re rojanekirin",
- "notifications.grant_permission": "Destûrê bide.",
- "notifications.group": "{count} agahdarî",
- "notifications.mark_as_read": "Hemî agahdarîya wek xwendî nîşan bike",
- "notifications.permission_denied": "Agahdarîyên sermaseyê naxebite ji ber ku berê de daxwazî ya destûr dayîna gerokê hati bû red kirin",
- "notifications.permission_denied_alert": "Agahdarîyên sermaseyê nay çalak kirin, ji ber ku destûr kirina gerokê pêşî de hati bû red kirin",
- "notifications.permission_required": "Agahdarîyên sermaseyê naxebite çunkî mafê pêwîst dike nehatiye dayîn.",
- "notifications_permission_banner.enable": "Agahdarîyên sermaseyê çalak bike",
- "notifications_permission_banner.how_to_control": "Da ku agahdariyên mastodon bistînî gava ne vekirî be. Agahdariyên sermaseyê çalak bike\n Tu dikarî agahdariyên sermaseyê bi rê ve bibî ku bi hemû cureyên çalakiyên ên ku agahdariyan rû didin ku bi riya tikandînê li ser bişkoka {icon} çalak dibe.",
- "notifications_permission_banner.title": "Tu tiştî bîr neke",
- "picture_in_picture.restore": "Vegerîne paş",
- "poll.closed": "Girtî",
- "poll.refresh": "Nû bike",
- "poll.total_people": "{count, plural, one {# kes} other {# kes}}",
- "poll.total_votes": "{count, plural, one {# deng} other {# deng}}",
- "poll.vote": "Deng bide",
- "poll.voted": "Te dengê xwe da vê bersivê",
- "poll.votes": "{votes, plural, one {# vote} other {# votes}}",
- "poll_button.add_poll": "Rapirsîyek zêde bike",
- "poll_button.remove_poll": "Rapirsî yê rake",
- "privacy.change": "Nepênîtiya şandiyan biguherîne",
- "privacy.direct.long": "Tenê ji bo bikarhênerên qalkirî tê dîtin",
- "privacy.direct.short": "Taybet",
- "privacy.private.long": "Tenê bo şopîneran xuyabar e",
- "privacy.private.short": "Tenê şopîneran",
- "privacy.public.long": "Ji bo herkesî li berçav e, di demnameyên gelemperî de dê xûyakirin",
- "privacy.public.short": "Gelemperî",
- "privacy.unlisted.long": "Ji herkesî ra tê xûya, lê demnameyê gelemperî ra nay xûyakirin",
- "privacy.unlisted.short": "Nerêzok",
- "refresh": "Nû bike",
- "regeneration_indicator.label": "Tê barkirin…",
- "regeneration_indicator.sublabel": "Mala te da tê amedekirin!",
- "relative_time.days": "{number}r",
- "relative_time.hours": "{number}d",
- "relative_time.just_now": "niha",
- "relative_time.minutes": "{number}x",
- "relative_time.seconds": "{number}ç",
- "relative_time.today": "îro",
- "reply_indicator.cancel": "Dev jê berde",
- "report.forward": "Biçe bo {target}",
- "report.forward_hint": "Ajimêr ji rajekarek din da ne. Tu kopîyeka anonîm ya raporê bişînî li wur?",
- "report.hint": "Ev rapor yê rajekarê lihevkarên te ra were şandin. Tu dikarî şiroveyekê pêşkêş bikî bê ka tu çima vê ajimêrê jor radigîhînî:",
- "report.placeholder": "Şiroveyên zêde",
- "report.submit": "Bişîne",
- "report.target": "Ragihandin {target}",
- "search.placeholder": "Bigere",
- "search_popout.search_format": "Dirûva lêgerîna pêşketî",
- "search_popout.tips.full_text": "Nivîsên hêsan, şandiyên ku te nivîsandiye, bijare kiriye, bilind kiriye an jî yên behsa te kirine û her wiha navê bikarhêneran, navên xûya dike û hashtagan vedigerîne.",
- "search_popout.tips.hashtag": "hashtag",
- "search_popout.tips.status": "şandî",
- "search_popout.tips.text": "Nivîsên hêsan, navên xûya ên ku li hev hatî, bikarhêner û hashtagan vedigerîne",
- "search_popout.tips.user": "bikarhêner",
- "search_results.accounts": "Mirov",
- "search_results.hashtags": "Hashtag",
- "search_results.statuses": "Şandî",
- "search_results.statuses_fts_disabled": "Di vê rajekara Mastodonê da lêgerîna şandîyên li gorî naveroka wan ne çalak e.",
- "search_results.total": "{count, number} {count, plural, one {encam} other {encam}}",
- "status.admin_account": "Ji bo @{name} navrûya venihêrtinê veke",
- "status.admin_status": "Vê şandîyê di navrûya venihêrtinê de veke",
- "status.block": "@{name} asteng bike",
- "status.bookmark": "Şûnpel",
- "status.cancel_reblog_private": "Bilind neke",
- "status.cannot_reblog": "Ev şandî nayê bilindkirin",
- "status.copy": "Girêdanê jê bigire bo weşankirinê",
- "status.delete": "Jê bibe",
- "status.detailed_status": "Dîtina axaftina berfireh",
- "status.direct": "Peyama rasterast @{name}",
- "status.embed": "Hedimandî",
- "status.favourite": "Bijarte",
- "status.filtered": "Parzûnkirî",
- "status.load_more": "Bêtir bar bike",
- "status.media_hidden": "Medya veşartî ye",
- "status.mention": "Qal @{name} bike",
- "status.more": "Bêtir",
- "status.mute": "@{name} Bêdeng bike",
- "status.mute_conversation": "Axaftinê bêdeng bike",
- "status.open": "Vê şandiyê berferh bike",
- "status.pin": "Li ser profîlê derzî bike",
- "status.pinned": "Şandiya derzîkirî",
- "status.read_more": "Bêtir bixwîne",
- "status.reblog": "Bilindkirî",
- "status.reblog_private": "Bi dîtina resen bilind bike",
- "status.reblogged_by": "{name} bilind kir",
- "status.reblogs.empty": "Kesekî hin ev şandî bilind nekiriye. Gava kesek bilind bike, ew ên li vir werin xuyakirin.",
- "status.redraft": "Jê bibe & ji nû ve reşnivîs bike",
- "status.remove_bookmark": "Şûnpêlê jê rake",
- "status.reply": "Bersivê bide",
- "status.replyAll": "Mijarê bibersivîne",
- "status.report": "{name} gilî bike",
- "status.sensitive_warning": "Naveroka hestiyarî",
- "status.share": "Parve bike",
- "status.show_less": "Kêmtir nîşan bide",
- "status.show_less_all": "Ji bo hemîyan kêmtir nîşan bide",
- "status.show_more": "Hêj zehftir nîşan bide",
- "status.show_more_all": "Bêtir nîşan bide bo hemûyan",
- "status.show_thread": "Mijarê nîşan bide",
- "status.uncached_media_warning": "Tune ye",
- "status.unmute_conversation": "Axaftinê bêdeng neke",
- "status.unpin": "Şandiya derzîkirî ji profîlê rake",
- "suggestions.dismiss": "Pêşniyarê paşguh bike",
- "suggestions.header": "Dibe ku bala te bikşîne…",
- "tabs_bar.federated_timeline": "Giştî",
- "tabs_bar.home": "Serrûpel",
- "tabs_bar.local_timeline": "Herêmî",
- "tabs_bar.notifications": "Agahdarî",
- "tabs_bar.search": "Bigere",
- "time_remaining.days": "{number, plural, one {# roj} other {# roj}} mayî",
- "time_remaining.hours": "{number, plural, one {# demjimêr} other {# demjimêr}} mayî",
- "time_remaining.minutes": "{number, plural, one {# xulek} other {# xulek}} mayî",
- "time_remaining.moments": "Demên mayî",
- "time_remaining.seconds": "{number, plural, one {# çirke} other {# çirke}} maye",
- "timeline_hint.remote_resource_not_displayed": "{resource} Ji rajekerên din nayê dîtin.",
- "timeline_hint.resources.followers": "Şopîner",
- "timeline_hint.resources.follows": "Şopîner",
- "timeline_hint.resources.statuses": "Şandiyên kevn",
- "trends.counter_by_accounts": "{count, plural, one {{counter} kes} other {{counter} kes}} diaxivin",
- "trends.trending_now": "Rojev",
- "ui.beforeunload": "Ger ji Mastodonê veketi wê reşnivîsa te jî winda bibe.",
- "units.short.billion": "{count}B",
- "units.short.million": "{count}M",
- "units.short.thousand": "{count}H",
- "upload_area.title": "Ji bo barkirinê kaş bike û deyne",
- "upload_button.label": "Wêne, vîdeoyek an jî pelê dengî tevlî bike",
- "upload_error.limit": "Sînora barkirina pelan derbas bû.",
- "upload_error.poll": "Di rapirsîyan de mafê barkirina pelan nayê dayîn.",
- "upload_form.audio_description": "Ji bona kesên kêm dibihîsin re pênase bike",
- "upload_form.description": "Ji bona astengdarên dîtinê re vebêje",
- "upload_form.edit": "Serrast bike",
- "upload_form.thumbnail": "Wêneyê biçûk biguherîne",
- "upload_form.undo": "Jê bibe",
- "upload_form.video_description": "Ji bo kesên kerr û lalan pênase bike",
- "upload_modal.analyzing_picture": "Wêne tê analîzkirin…",
- "upload_modal.apply": "Bisepîne",
- "upload_modal.applying": "Applying…",
- "upload_modal.choose_image": "Wêneyê hilbijêre",
- "upload_modal.description_placeholder": "Rovîyek qehweyî û bilez li ser kûçikê tîral banz dide",
- "upload_modal.detect_text": "Ji nivîsa wêneyê re serwext be",
- "upload_modal.edit_media": "Medyayê sererast bike",
- "upload_modal.hint": "Ji bo hilbijartina xala navendê her tim dîmenê piçûk de pêşdîtina çerxê bitikîne an jî kaş bike.",
- "upload_modal.preparing_ocr": "OCR dihê amadekirin…",
- "upload_modal.preview_label": "Pêşdîtin ({ratio})",
- "upload_progress.label": "Tê barkirin...",
- "video.close": "Vîdyoyê bigire",
- "video.download": "Pelê daxe",
- "video.exit_fullscreen": "Ji dîmendera tijî derkeve",
- "video.expand": "Vîdyoyê berferh bike",
- "video.fullscreen": "Dimendera tijî",
- "video.hide": "Vîdyo veşêre",
- "video.mute": "Dengê qut bike",
- "video.pause": "Rawestîne",
- "video.play": "Vêxe",
- "video.unmute": "Dengê qut neke"
-}
diff --git a/app/javascript/mastodon/locales/kn.json b/app/javascript/mastodon/locales/kn.json
index 72b8f7f0a..450944dca 100644
--- a/app/javascript/mastodon/locales/kn.json
+++ b/app/javascript/mastodon/locales/kn.json
@@ -18,12 +18,12 @@
"account.followers": "ಹಿಂಬಾಲಕರು",
"account.followers.empty": "No one follows this user yet.",
"account.followers_counter": "{count, plural, one {{counter} Follower} other {{counter} Followers}}",
+ "account.following": "Following",
"account.following_counter": "{count, plural, one {{counter} Following} other {{counter} Following}}",
"account.follows.empty": "This user doesn't follow anyone yet.",
"account.follows_you": "Follows you",
"account.hide_reblogs": "Hide boosts from @{name}",
"account.joined": "Joined {date}",
- "account.last_status": "Last active",
"account.link_verified_on": "Ownership of this link was checked on {date}",
"account.locked_info": "This account privacy status is set to locked. The owner manually reviews who can follow them.",
"account.media": "Media",
@@ -32,7 +32,6 @@
"account.mute": "Mute @{name}",
"account.mute_notifications": "Mute notifications from @{name}",
"account.muted": "Muted",
- "account.never_active": "Never",
"account.posts": "ಟೂಟ್ಗಳು",
"account.posts_with_replies": "Toots and replies",
"account.report": "Report @{name}",
@@ -42,12 +41,15 @@
"account.statuses_counter": "{count, plural, one {{counter} Toot} other {{counter} Toots}}",
"account.unblock": "Unblock @{name}",
"account.unblock_domain": "Unhide {domain}",
+ "account.unblock_short": "Unblock",
"account.unendorse": "Don't feature on profile",
"account.unfollow": "Unfollow",
"account.unmute": "Unmute @{name}",
"account.unmute_notifications": "Unmute notifications from @{name}",
+ "account.unmute_short": "Unmute",
"account_note.placeholder": "Click to add a note",
- "admin.dashboard.retention": "Retention",
+ "admin.dashboard.daily_retention": "User retention rate by day after sign-up",
+ "admin.dashboard.monthly_retention": "User retention rate by month after sign-up",
"admin.dashboard.retention.average": "Average",
"admin.dashboard.retention.cohort": "Sign-up month",
"admin.dashboard.retention.cohort_size": "New users",
@@ -104,6 +106,7 @@
"compose_form.poll.switch_to_single": "Change poll to allow for a single choice",
"compose_form.publish": "Toot",
"compose_form.publish_loud": "{publish}!",
+ "compose_form.save_changes": "Save changes",
"compose_form.sensitive.hide": "{count, plural, one {Mark media as sensitive} other {Mark media as sensitive}}",
"compose_form.sensitive.marked": "{count, plural, one {Media is marked as sensitive} other {Media is marked as sensitive}}",
"compose_form.sensitive.unmarked": "{count, plural, one {Media is not marked as sensitive} other {Media is not marked as sensitive}}",
@@ -165,6 +168,7 @@
"empty_column.community": "The local timeline is empty. Write something publicly to get the ball rolling!",
"empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.",
"empty_column.domain_blocks": "There are no hidden domains yet.",
+ "empty_column.explore_statuses": "Nothing is trending right now. Check back later!",
"empty_column.favourited_statuses": "You don't have any favourite toots yet. When you favourite one, it will show up here.",
"empty_column.favourites": "No one has favourited this toot yet. When someone does, they will show up here.",
"empty_column.follow_recommendations": "Looks like no suggestions could be generated for you. You can try using search to look for people you might know or explore trending hashtags.",
@@ -183,6 +187,12 @@
"error.unexpected_crash.next_steps_addons": "Try disabling them and refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
"errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard",
"errors.unexpected_crash.report_issue": "Report issue",
+ "explore.search_results": "Search results",
+ "explore.suggested_follows": "For you",
+ "explore.title": "Explore",
+ "explore.trending_links": "News",
+ "explore.trending_statuses": "Posts",
+ "explore.trending_tags": "Hashtags",
"follow_recommendations.done": "Done",
"follow_recommendations.heading": "Follow people you'd like to see posts from! Here are some suggestions.",
"follow_recommendations.lead": "Posts from people you follow will show up in chronological order on your home feed. Don't be afraid to make mistakes, you can unfollow people just as easily any time!",
@@ -284,6 +294,7 @@
"navigation_bar.discover": "Discover",
"navigation_bar.domain_blocks": "Hidden domains",
"navigation_bar.edit_profile": "Edit profile",
+ "navigation_bar.explore": "Explore",
"navigation_bar.favourites": "Favourites",
"navigation_bar.filters": "Muted words",
"navigation_bar.follow_requests": "Follow requests",
@@ -298,6 +309,7 @@
"navigation_bar.preferences": "Preferences",
"navigation_bar.public_timeline": "Federated timeline",
"navigation_bar.security": "Security",
+ "notification.admin.sign_up": "{name} signed up",
"notification.favourite": "{name} favourited your status",
"notification.follow": "{name} followed you",
"notification.follow_request": "{name} has requested to follow you",
@@ -306,13 +318,15 @@
"notification.poll": "A poll you have voted in has ended",
"notification.reblog": "{name} boosted your status",
"notification.status": "{name} just posted",
+ "notification.update": "{name} edited a post",
"notifications.clear": "Clear notifications",
"notifications.clear_confirmation": "Are you sure you want to permanently clear all your notifications?",
+ "notifications.column_settings.admin.sign_up": "New sign-ups:",
"notifications.column_settings.alert": "Desktop notifications",
"notifications.column_settings.favourite": "Favourites:",
"notifications.column_settings.filter_bar.advanced": "Display all categories",
"notifications.column_settings.filter_bar.category": "Quick filter bar",
- "notifications.column_settings.filter_bar.show": "Show",
+ "notifications.column_settings.filter_bar.show_bar": "Show filter bar",
"notifications.column_settings.follow": "New followers:",
"notifications.column_settings.follow_request": "New follow requests:",
"notifications.column_settings.mention": "Mentions:",
@@ -322,7 +336,9 @@
"notifications.column_settings.show": "Show in column",
"notifications.column_settings.sound": "Play sound",
"notifications.column_settings.status": "New toots:",
- "notifications.column_settings.unread_markers.category": "Unread notification markers",
+ "notifications.column_settings.unread_notifications.category": "Unread notifications",
+ "notifications.column_settings.unread_notifications.highlight": "Highlight unread notifications",
+ "notifications.column_settings.update": "Edits:",
"notifications.filter.all": "All",
"notifications.filter.boosts": "Boosts",
"notifications.filter.favourites": "Favourites",
@@ -362,18 +378,54 @@
"regeneration_indicator.label": "Loading…",
"regeneration_indicator.sublabel": "Your home feed is being prepared!",
"relative_time.days": "{number}d",
+ "relative_time.full.days": "{number, plural, one {# day} other {# days}} ago",
+ "relative_time.full.hours": "{number, plural, one {# hour} other {# hours}} ago",
+ "relative_time.full.just_now": "just now",
+ "relative_time.full.minutes": "{number, plural, one {# minute} other {# minutes}} ago",
+ "relative_time.full.seconds": "{number, plural, one {# second} other {# seconds}} ago",
"relative_time.hours": "{number}h",
"relative_time.just_now": "now",
"relative_time.minutes": "{number}m",
"relative_time.seconds": "{number}s",
"relative_time.today": "today",
"reply_indicator.cancel": "Cancel",
+ "report.block": "Block",
+ "report.block_explanation": "You will not see their posts. They will not be able to see your posts or follow you. They will be able to tell that they are blocked.",
+ "report.categories.other": "Other",
+ "report.categories.spam": "Spam",
+ "report.categories.violation": "Content violates one or more server rules",
+ "report.category.subtitle": "Choose the best match",
+ "report.category.title": "Tell us what's going on with this {type}",
+ "report.category.title_account": "profile",
+ "report.category.title_status": "post",
+ "report.close": "Done",
+ "report.comment.title": "Is there anything else you think we should know?",
"report.forward": "Forward to {target}",
"report.forward_hint": "The account is from another server. Send an anonymized copy of the report there as well?",
- "report.hint": "The report will be sent to your server moderators. You can provide an explanation of why you are reporting this account below:",
- "report.placeholder": "Additional comments",
- "report.submit": "Submit",
+ "report.mute": "Mute",
+ "report.mute_explanation": "You will not see their posts. They can still follow you and see your posts and will not know that they are muted.",
+ "report.next": "Next",
+ "report.placeholder": "Type or paste additional comments",
+ "report.reasons.dislike": "I don't like it",
+ "report.reasons.dislike_description": "It is not something you want to see",
+ "report.reasons.other": "It's something else",
+ "report.reasons.other_description": "The issue does not fit into other categories",
+ "report.reasons.spam": "It's spam",
+ "report.reasons.spam_description": "Malicious links, fake engagement, or repetitive replies",
+ "report.reasons.violation": "It violates server rules",
+ "report.reasons.violation_description": "You are aware that it breaks specific rules",
+ "report.rules.subtitle": "Select all that apply",
+ "report.rules.title": "Which rules are being violated?",
+ "report.statuses.subtitle": "Select all that apply",
+ "report.statuses.title": "Are there any posts that back up this report?",
+ "report.submit": "Submit report",
"report.target": "Report {target}",
+ "report.thanks.take_action": "Here are your options for controlling what you see on Mastodon:",
+ "report.thanks.take_action_actionable": "While we review this, you can take action against @{name}:",
+ "report.thanks.title": "Don't want to see this?",
+ "report.thanks.title_actionable": "Thanks for reporting, we'll look into this.",
+ "report.unfollow": "Unfollow @{name}",
+ "report.unfollow_explanation": "You are following this account. To not see their posts in your home feed anymore, unfollow them.",
"search.placeholder": "Search",
"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.",
@@ -382,7 +434,9 @@
"search_popout.tips.text": "Simple text returns matching display names, usernames and hashtags",
"search_popout.tips.user": "user",
"search_results.accounts": "People",
+ "search_results.all": "All",
"search_results.hashtags": "Hashtags",
+ "search_results.nothing_found": "Could not find anything for these search terms",
"search_results.statuses": "Toots",
"search_results.statuses_fts_disabled": "Searching toots by their content is not enabled on this Mastodon server.",
"search_results.total": "{count, number} {count, plural, one {result} other {results}}",
@@ -396,9 +450,14 @@
"status.delete": "Delete",
"status.detailed_status": "Detailed conversation view",
"status.direct": "Direct message @{name}",
+ "status.edit": "Edit",
+ "status.edited": "Edited {date}",
+ "status.edited_x_times": "Edited {count, plural, one {{count} time} other {{count} times}}",
"status.embed": "Embed",
"status.favourite": "Favourite",
"status.filtered": "Filtered",
+ "status.history.created": "{name} created {date}",
+ "status.history.edited": "{name} edited {date}",
"status.load_more": "Load more",
"status.media_hidden": "Media hidden",
"status.mention": "Mention @{name}",
diff --git a/app/javascript/mastodon/locales/ko.json b/app/javascript/mastodon/locales/ko.json
index 4252141e7..454b3977a 100644
--- a/app/javascript/mastodon/locales/ko.json
+++ b/app/javascript/mastodon/locales/ko.json
@@ -18,12 +18,12 @@
"account.followers": "팔로워",
"account.followers.empty": "아직 아무도 이 유저를 팔로우하고 있지 않습니다.",
"account.followers_counter": "{counter} 팔로워",
+ "account.following": "팔로잉",
"account.following_counter": "{counter} 팔로잉",
"account.follows.empty": "이 유저는 아직 아무도 팔로우하고 있지 않습니다.",
"account.follows_you": "날 팔로우합니다",
"account.hide_reblogs": "@{name}의 부스트를 숨기기",
"account.joined": "{date}에 가입함",
- "account.last_status": "마지막 활동",
"account.link_verified_on": "{date}에 이 링크의 소유권이 확인 됨",
"account.locked_info": "이 계정의 프라이버시 설정은 잠금으로 설정되어 있습니다. 계정 소유자가 수동으로 팔로워를 승인합니다.",
"account.media": "미디어",
@@ -32,7 +32,6 @@
"account.mute": "@{name} 뮤트",
"account.mute_notifications": "@{name}의 알림을 뮤트",
"account.muted": "뮤트 됨",
- "account.never_active": "없음",
"account.posts": "게시물",
"account.posts_with_replies": "게시물과 답장",
"account.report": "@{name} 신고",
@@ -42,21 +41,24 @@
"account.statuses_counter": "{counter} 게시물",
"account.unblock": "차단 해제",
"account.unblock_domain": "도메인 {domain} 차단 해제",
+ "account.unblock_short": "차단 해제",
"account.unendorse": "프로필에 추천하지 않기",
"account.unfollow": "팔로우 해제",
"account.unmute": "@{name} 뮤트 해제",
"account.unmute_notifications": "@{name}의 알림 뮤트 해제",
+ "account.unmute_short": "뮤트 해제",
"account_note.placeholder": "클릭해서 노트 추가",
- "admin.dashboard.retention": "Retention",
- "admin.dashboard.retention.average": "Average",
- "admin.dashboard.retention.cohort": "Sign-up month",
- "admin.dashboard.retention.cohort_size": "New users",
+ "admin.dashboard.daily_retention": "가입 후 일별 사용자 유지율",
+ "admin.dashboard.monthly_retention": "가입 후 월별 사용자 유지율",
+ "admin.dashboard.retention.average": "평균",
+ "admin.dashboard.retention.cohort": "가입한 달",
+ "admin.dashboard.retention.cohort_size": "새로운 사용자",
"alert.rate_limited.message": "{retry_time, time, medium}에 다시 시도해 주세요.",
"alert.rate_limited.title": "빈도 제한됨",
"alert.unexpected.message": "예측하지 못한 에러가 발생했습니다.",
"alert.unexpected.title": "앗!",
"announcement.announcement": "공지사항",
- "attachments_list.unprocessed": "(unprocessed)",
+ "attachments_list.unprocessed": "(처리 안 됨)",
"autosuggest_hashtag.per_week": "주간 {count}회",
"boost_modal.combo": "다음엔 {combo}를 눌러서 이 과정을 건너뛸 수 있습니다",
"bundle_column_error.body": "컴포넌트를 불러오는 과정에서 문제가 발생했습니다.",
@@ -65,17 +67,17 @@
"bundle_modal_error.close": "닫기",
"bundle_modal_error.message": "컴포넌트를 불러오는 과정에서 문제가 발생했습니다.",
"bundle_modal_error.retry": "다시 시도",
- "column.blocks": "차단된 사용자",
+ "column.blocks": "차단한 사용자",
"column.bookmarks": "보관함",
"column.community": "로컬 타임라인",
"column.direct": "다이렉트 메시지",
"column.directory": "프로필 둘러보기",
- "column.domain_blocks": "차단된 도메인",
+ "column.domain_blocks": "차단한 도메인",
"column.favourites": "즐겨찾기",
"column.follow_requests": "팔로우 요청",
"column.home": "홈",
"column.lists": "리스트",
- "column.mutes": "뮤트된 사용자",
+ "column.mutes": "뮤트한 사용자",
"column.notifications": "알림",
"column.pins": "고정된 게시물",
"column.public": "연합 타임라인",
@@ -104,6 +106,7 @@
"compose_form.poll.switch_to_single": "단일 선택 투표로 변경",
"compose_form.publish": "뿌우",
"compose_form.publish_loud": "{publish}!",
+ "compose_form.save_changes": "변경사항 저장",
"compose_form.sensitive.hide": "미디어를 민감함으로 설정하기",
"compose_form.sensitive.marked": "미디어가 열람주의로 설정되어 있습니다",
"compose_form.sensitive.unmarked": "미디어가 열람주의로 설정 되어 있지 않습니다",
@@ -118,8 +121,8 @@
"confirmations.delete.message": "정말로 이 게시물을 삭제하시겠습니까?",
"confirmations.delete_list.confirm": "삭제",
"confirmations.delete_list.message": "정말로 이 리스트를 영구적으로 삭제하시겠습니까?",
- "confirmations.discard_edit_media.confirm": "Discard",
- "confirmations.discard_edit_media.message": "You have unsaved changes to the media description or preview, discard them anyway?",
+ "confirmations.discard_edit_media.confirm": "저장 안함",
+ "confirmations.discard_edit_media.message": "미디어 설명이나 미리보기에 대한 저장하지 않은 변경사항이 있습니다. 버리시겠습니까?",
"confirmations.domain_block.confirm": "도메인 전체를 차단",
"confirmations.domain_block.message": "정말로 {domain} 전체를 차단하시겠습니까? 대부분의 경우 개별 차단이나 뮤트로 충분합니다. 모든 공개 타임라인과 알림에서 해당 도메인에서 작성된 컨텐츠를 보지 못합니다. 해당 도메인에 속한 팔로워와의 관계가 사라집니다.",
"confirmations.logout.confirm": "로그아웃",
@@ -131,8 +134,8 @@
"confirmations.redraft.message": "정말로 이 게시물을 삭제하고 다시 쓰시겠습니까? 해당 포스트에 대한 부스트와 즐겨찾기를 잃게 되고 원본에 대한 답장은 연결 되지 않습니다.",
"confirmations.reply.confirm": "답글",
"confirmations.reply.message": "답글을 달기 위해 현재 작성 중인 메시지가 덮어 씌워집니다. 진행하시겠습니까?",
- "confirmations.unfollow.confirm": "언팔로우",
- "confirmations.unfollow.message": "정말로 {name}를 언팔로우하시겠습니까?",
+ "confirmations.unfollow.confirm": "팔로우 해제",
+ "confirmations.unfollow.message": "정말로 {name} 님을 팔로우 해제하시겠습니까?",
"conversation.delete": "대화 삭제",
"conversation.mark_as_read": "읽은 상태로 표시",
"conversation.open": "대화 보기",
@@ -164,7 +167,8 @@
"empty_column.bookmarked_statuses": "아직 보관한 게시물이 없습니다. 게시물을 보관하면 여기에 나타납니다.",
"empty_column.community": "로컬 타임라인에 아무 것도 없습니다. 아무거나 적어 보세요!",
"empty_column.direct": "아직 다이렉트 메시지가 없습니다. 다이렉트 메시지를 보내거나 받은 경우, 여기에 표시 됩니다.",
- "empty_column.domain_blocks": "아직 차단된 도메인이 없습니다.",
+ "empty_column.domain_blocks": "아직 차단한 도메인이 없습니다.",
+ "empty_column.explore_statuses": "아직 유행하는 것이 없습니다. 나중에 다시 확인하세요!",
"empty_column.favourited_statuses": "아직 즐겨찾기 한 게시물이 없습니다. 게시물을 즐겨찾기 하면 여기에 나타납니다.",
"empty_column.favourites": "아직 아무도 이 게시물을 즐겨찾기 하지 않았습니다. 누군가 즐겨찾기를 하면 여기에 나타납니다.",
"empty_column.follow_recommendations": "당신을 위한 제안이 생성될 수 없는 것 같습니다. 알 수도 있는 사람을 검색하거나 유행하는 해시태그를 둘러볼 수 있습니다.",
@@ -183,6 +187,12 @@
"error.unexpected_crash.next_steps_addons": "그것들을 끄고 페이지를 새로고침 해보세요. 그래도 해결되지 않는 경우, 다른 브라우저나 네이티브 앱으로도 마스토돈을 이용하실 수 있습니다.",
"errors.unexpected_crash.copy_stacktrace": "에러 내용을 클립보드에 복사",
"errors.unexpected_crash.report_issue": "문제 신고",
+ "explore.search_results": "검색 결과",
+ "explore.suggested_follows": "당신을 위한 추천",
+ "explore.title": "둘러보기",
+ "explore.trending_links": "소식",
+ "explore.trending_statuses": "게시물",
+ "explore.trending_tags": "해시태그",
"follow_recommendations.done": "완료",
"follow_recommendations.heading": "게시물을 받아 볼 사람들을 팔로우 하세요! 여기 몇몇의 추천이 있습니다.",
"follow_recommendations.lead": "당신이 팔로우 하는 사람들의 게시물이 시간순으로 정렬되어 당신의 홈 피드에 표시될 것입니다. 실수를 두려워 하지 마세요, 언제든지 쉽게 팔로우 취소를 할 수 있습니다!",
@@ -282,22 +292,24 @@
"navigation_bar.compose": "새 게시물 작성",
"navigation_bar.direct": "다이렉트 메시지",
"navigation_bar.discover": "발견하기",
- "navigation_bar.domain_blocks": "차단된 도메인",
+ "navigation_bar.domain_blocks": "차단한 도메인",
"navigation_bar.edit_profile": "프로필 편집",
+ "navigation_bar.explore": "탐색하기",
"navigation_bar.favourites": "즐겨찾기",
- "navigation_bar.filters": "뮤트된 단어",
+ "navigation_bar.filters": "뮤트한 단어",
"navigation_bar.follow_requests": "팔로우 요청",
"navigation_bar.follows_and_followers": "팔로우와 팔로워",
"navigation_bar.info": "이 서버에 대해서",
"navigation_bar.keyboard_shortcuts": "단축키",
"navigation_bar.lists": "리스트",
"navigation_bar.logout": "로그아웃",
- "navigation_bar.mutes": "뮤트 중인 사용자",
+ "navigation_bar.mutes": "뮤트한 사용자",
"navigation_bar.personal": "개인용",
"navigation_bar.pins": "고정된 게시물",
"navigation_bar.preferences": "사용자 설정",
"navigation_bar.public_timeline": "연합 타임라인",
"navigation_bar.security": "보안",
+ "notification.admin.sign_up": "{name} 님이 가입했습니다",
"notification.favourite": "{name} 님이 즐겨찾기 했습니다",
"notification.follow": "{name} 님이 나를 팔로우 했습니다",
"notification.follow_request": "{name} 님이 팔로우 요청을 보냈습니다",
@@ -306,13 +318,15 @@
"notification.poll": "당신이 참여 한 투표가 종료되었습니다",
"notification.reblog": "{name} 님이 부스트 했습니다",
"notification.status": "{name} 님이 방금 게시물을 올렸습니다",
+ "notification.update": "{name} 님이 게시물을 수정했습니다",
"notifications.clear": "알림 지우기",
"notifications.clear_confirmation": "정말로 알림을 삭제하시겠습니까?",
+ "notifications.column_settings.admin.sign_up": "새로운 가입:",
"notifications.column_settings.alert": "데스크탑 알림",
"notifications.column_settings.favourite": "즐겨찾기:",
"notifications.column_settings.filter_bar.advanced": "카테고리의 모든 종류를 표시",
"notifications.column_settings.filter_bar.category": "퀵 필터 바",
- "notifications.column_settings.filter_bar.show": "표시",
+ "notifications.column_settings.filter_bar.show_bar": "필터 막대 표시",
"notifications.column_settings.follow": "새 팔로워:",
"notifications.column_settings.follow_request": "새 팔로우 요청:",
"notifications.column_settings.mention": "답글:",
@@ -322,7 +336,9 @@
"notifications.column_settings.show": "컬럼에 표시",
"notifications.column_settings.sound": "효과음 재생",
"notifications.column_settings.status": "새 게시물:",
- "notifications.column_settings.unread_markers.category": "읽지 않음 알림 마커",
+ "notifications.column_settings.unread_notifications.category": "읽지 않은 알림",
+ "notifications.column_settings.unread_notifications.highlight": "읽지 않은 알림 강조",
+ "notifications.column_settings.update": "수정내역:",
"notifications.filter.all": "모두",
"notifications.filter.boosts": "부스트",
"notifications.filter.favourites": "즐겨찾기",
@@ -346,7 +362,7 @@
"poll.total_votes": "{count} 표",
"poll.vote": "투표",
"poll.voted": "이 답변에 투표했습니다",
- "poll.votes": "{votes, plural, one {# vote} other {# votes}}",
+ "poll.votes": "{votes} 표",
"poll_button.add_poll": "투표 추가",
"poll_button.remove_poll": "투표 삭제",
"privacy.change": "포스트의 프라이버시 설정을 변경",
@@ -362,18 +378,54 @@
"regeneration_indicator.label": "불러오는 중…",
"regeneration_indicator.sublabel": "당신의 홈 피드가 준비되는 중입니다!",
"relative_time.days": "{number}일 전",
+ "relative_time.full.days": "{number} 일 전",
+ "relative_time.full.hours": "{number} 시간 전",
+ "relative_time.full.just_now": "방금 전",
+ "relative_time.full.minutes": "{number} 분 전",
+ "relative_time.full.seconds": "{number} 초 전",
"relative_time.hours": "{number}시간 전",
"relative_time.just_now": "방금",
"relative_time.minutes": "{number}분 전",
"relative_time.seconds": "{number}초 전",
"relative_time.today": "오늘",
"reply_indicator.cancel": "취소",
+ "report.block": "차단",
+ "report.block_explanation": "당신은 그의 게시물을 보지 않게 됩니다. 그는 당신의 게시물을 보거나 팔로우 할 수 없습니다. 그가 차단되었다는 사실을 알 수 있습니다.",
+ "report.categories.other": "기타",
+ "report.categories.spam": "스팸",
+ "report.categories.violation": "컨텐츠가 한 개 이상의 서버 규칙을 위반합니다",
+ "report.category.subtitle": "가장 알맞은 것을 선택하세요",
+ "report.category.title": "이 {type}에 무슨 문제가 있는지 알려주세요",
+ "report.category.title_account": "프로필",
+ "report.category.title_status": "게시물",
+ "report.close": "완료",
+ "report.comment.title": "우리가 더 알아야 할 내용이 있나요?",
"report.forward": "{target}에 포워드 됨",
"report.forward_hint": "이 계정은 다른 서버에 있습니다. 익명화 된 사본을 해당 서버에도 전송할까요?",
- "report.hint": "신고는 당신의 서버 스태프에게 전송 됩니다. 왜 이 계정을 신고하는 지에 대한 설명을 아래에 작성할 수 있습니다:",
+ "report.mute": "침묵",
+ "report.mute_explanation": "당신은 그의 게시물을 보지 않게 됩니다. 그는 여전히 당신을 팔로우 하거나 당신의 게시물을 볼 수 있으며 뮤트 되었는지 알지 못합니다.",
+ "report.next": "다음",
"report.placeholder": "코멘트",
+ "report.reasons.dislike": "마음에 안듭니다",
+ "report.reasons.dislike_description": "내가 보기 싫은 종류에 속합니다",
+ "report.reasons.other": "기타",
+ "report.reasons.other_description": "이슈가 다른 분류에 속하지 않습니다",
+ "report.reasons.spam": "스팸입니다",
+ "report.reasons.spam_description": "악성 링크, 반응 스팸, 또는 반복적인 답글",
+ "report.reasons.violation": "서버 규칙을 위반합니다",
+ "report.reasons.violation_description": "특정 규칙을 위반합니다",
+ "report.rules.subtitle": "해당하는 사항을 모두 선택하세요",
+ "report.rules.title": "어떤 규칙을 위반했나요?",
+ "report.statuses.subtitle": "해당하는 사항을 모두 선택하세요",
+ "report.statuses.title": "이 신고에 대해서 더 참고해야 할 게시물이 있나요?",
"report.submit": "신고하기",
- "report.target": "문제가 된 사용자",
+ "report.target": "{target} 신고하기",
+ "report.thanks.take_action": "마스토돈에서 나에게 보이는 것을 조절하기 위한 몇 가지 선택사항들이 존재합니다:",
+ "report.thanks.take_action_actionable": "서버의 중재자들이 이것을 심사하는 동안, 당신은 @{name}에 대한 행동을 취할 수 있습니다:",
+ "report.thanks.title": "이런 것을 보지 않길 원하나요?",
+ "report.thanks.title_actionable": "신고해주셔서 감사합니다, 중재자분들이 확인할 예정입니다.",
+ "report.unfollow": "@{name}을 팔로우 해제",
+ "report.unfollow_explanation": "당신을 이 계정을 팔로우 하고 있습니다. 홈 피드에서 게시물을 보지 않으려면, 팔로우를 해제하세요.",
"search.placeholder": "검색",
"search_popout.search_format": "고급 검색 방법",
"search_popout.tips.full_text": "단순한 텍스트 검색은 당신이 작성했거나, 관심글로 지정했거나, 부스트했거나, 멘션을 받은 게시글, 그리고 유저네임, 디스플레이네임, 해시태그를 반환합니다.",
@@ -382,7 +434,9 @@
"search_popout.tips.text": "단순한 텍스트 검색은 관계된 프로필 이름, 유저 이름 그리고 해시태그를 표시합니다",
"search_popout.tips.user": "유저",
"search_results.accounts": "사람",
+ "search_results.all": "전부",
"search_results.hashtags": "해시태그",
+ "search_results.nothing_found": "검색어에 대한 결과를 찾을 수 없습니다",
"search_results.statuses": "게시물",
"search_results.statuses_fts_disabled": "이 마스토돈 서버에선 게시물의 내용을 통한 검색이 활성화 되어 있지 않습니다.",
"search_results.total": "{count, number}건의 결과",
@@ -396,12 +450,17 @@
"status.delete": "삭제",
"status.detailed_status": "대화 자세히 보기",
"status.direct": "@{name}에게 다이렉트 메시지",
+ "status.edit": "수정",
+ "status.edited": "{date}에 편집됨",
+ "status.edited_x_times": "{count}번 수정됨",
"status.embed": "공유하기",
"status.favourite": "즐겨찾기",
"status.filtered": "필터로 걸러짐",
+ "status.history.created": "{name} 님이 {date}에 생성함",
+ "status.history.edited": "{name} 님이 {date}에 수정함",
"status.load_more": "더 보기",
"status.media_hidden": "미디어 숨겨짐",
- "status.mention": "답장",
+ "status.mention": "@{name}에게 글쓰기",
"status.more": "자세히",
"status.mute": "@{name} 뮤트",
"status.mute_conversation": "이 대화를 뮤트",
@@ -416,7 +475,7 @@
"status.redraft": "지우고 다시 쓰기",
"status.remove_bookmark": "보관한 게시물 삭제",
"status.reply": "답장",
- "status.replyAll": "전원에게 답장",
+ "status.replyAll": "글타래에 답장",
"status.report": "신고",
"status.sensitive_warning": "민감한 미디어",
"status.share": "공유",
@@ -462,7 +521,7 @@
"upload_form.video_description": "청각, 시각 장애인을 위한 설명",
"upload_modal.analyzing_picture": "이미지 분석 중…",
"upload_modal.apply": "적용",
- "upload_modal.applying": "Applying…",
+ "upload_modal.applying": "적용 중...",
"upload_modal.choose_image": "이미지 선택",
"upload_modal.description_placeholder": "다람쥐 헌 쳇바퀴 타고파",
"upload_modal.detect_text": "이미지에서 텍스트 추출",
diff --git a/app/javascript/mastodon/locales/ku.json b/app/javascript/mastodon/locales/ku.json
index 2f0c4e511..0298c51ec 100644
--- a/app/javascript/mastodon/locales/ku.json
+++ b/app/javascript/mastodon/locales/ku.json
@@ -1,484 +1,543 @@
{
- "account.account_note_header": "تێبینی ",
- "account.add_or_remove_from_list": "زیادکردن یان سڕینەوە لە پێرستەکان",
- "account.badges.bot": "بوت",
- "account.badges.group": "گرووپ",
- "account.block": "بلۆکی @{name}",
- "account.block_domain": "بلۆکی هەموو شتێک لە {domain}",
- "account.blocked": "بلۆککرا",
- "account.browse_more_on_origin_server": "گەڕانی فرەتر لە سەر پرۆفایلی سەرەکی",
- "account.cancel_follow_request": "بەتاڵکردنی داوای شوێنکەوتن",
- "account.direct": "پەیامی تایبەت بە @{name}",
- "account.disable_notifications": "ئاگانامە مەنێرە بۆم کاتێک @{name} پۆست دەکرێت",
- "account.domain_blocked": "دۆمەین قەپاتکرا",
- "account.edit_profile": "دەستکاری پرۆفایل",
- "account.enable_notifications": "ئاگادارم بکەوە کاتێک @{name} بابەتەکان",
- "account.endorse": "ناساندن لە پرۆفایل",
- "account.follow": "شوێنکەوتن",
- "account.followers": "شوێنکەوتووان",
- "account.followers.empty": "کەسێک شوێن ئەم بەکارهێنەرە نەکەوتووە",
- "account.followers_counter": "{count, plural, one {{counter} شوێنکەوتوو} other {{counter} شوێنکەوتوو}}",
- "account.following_counter": "{count, plural, one {{counter} Following} other {{counter} Following}}",
- "account.follows.empty": "ئەم بەکارهێنەرە تا ئێستا شوێن کەس نەکەوتووە.",
- "account.follows_you": "شوێنکەوتووەکانت",
- "account.hide_reblogs": "داشاردنی بووستەکان لە @{name}",
- "account.joined": "Joined {date}",
- "account.last_status": "دوایین چالاکی",
- "account.link_verified_on": "خاوەنداریەتی ئەم لینکە لە {date} چێک کراوە",
- "account.locked_info": "تایبەتمەندی ئەم هەژمارەیە ڕیکخراوە بۆ قوفڵدراوە. خاوەنەکە بە دەستی پێداچوونەوە دەکات کە کێ دەتوانێت شوێنیان بکەوێت.",
- "account.media": "میدیا",
- "account.mention": "ئاماژە @{name}",
- "account.moved_to": "{name} گواسترایەوە بۆ:",
- "account.mute": "بێدەنگکردن @{name}",
- "account.mute_notifications": "هۆشیارکەرەوەکان لاببە لە @{name}",
- "account.muted": "بێ دەنگ",
- "account.never_active": "هەرگیز",
- "account.posts": "توتس",
- "account.posts_with_replies": "توتس و وەڵامەکان",
- "account.report": "گوزارشت @{name}",
- "account.requested": "چاوەڕێی ڕەزامەندین. کرتە بکە بۆ هەڵوەشاندنەوەی داواکاری شوێنکەوتن",
- "account.share": "پرۆفایلی @{name} هاوبەش بکە",
- "account.show_reblogs": "پیشاندانی بەرزکردنەوەکان لە @{name}",
- "account.statuses_counter": "{count, plural, one {{counter} Following} other {{counter} Following}}",
- "account.unblock": "@{name} لاببە",
- "account.unblock_domain": "کردنەوەی دۆمەینی {domain}",
- "account.unendorse": "تایبەتمەندی لەسەر پرۆفایلەکە نیە",
- "account.unfollow": "بەدوادانەچو",
- "account.unmute": "بێدەنگکردنی @{name}",
- "account.unmute_notifications": "بێدەنگکردنی هۆشیارییەکان لە @{name}",
- "account_note.placeholder": "کرتەبکە بۆ زیادکردنی تێبینی",
- "admin.dashboard.retention": "Retention",
- "admin.dashboard.retention.average": "Average",
- "admin.dashboard.retention.cohort": "Sign-up month",
- "admin.dashboard.retention.cohort_size": "New users",
- "alert.rate_limited.message": "تکایە هەوڵبدەرەوە دوای {retry_time, time, medium}.",
- "alert.rate_limited.title": "ڕێژەی سنووردار",
- "alert.unexpected.message": "هەڵەیەکی چاوەڕوان نەکراو ڕوویدا.",
- "alert.unexpected.title": "تەححح!",
- "announcement.announcement": "بانگەواز",
- "attachments_list.unprocessed": "(unprocessed)",
- "autosuggest_hashtag.per_week": "{count} هەرهەفتە",
- "boost_modal.combo": "دەتوانیت دەست بنێی بە سەر {combo} بۆ بازدان لە جاری داهاتوو",
- "bundle_column_error.body": "هەڵەیەک ڕوویدا لەکاتی بارکردنی ئەم پێکهاتەیە.",
- "bundle_column_error.retry": "دووبارە هەوڵبدە",
- "bundle_column_error.title": "هەڵيی تۆڕ",
- "bundle_modal_error.close": "داخستن",
- "bundle_modal_error.message": "هەڵەیەک ڕوویدا لەکاتی بارکردنی ئەم پێکهاتەیە.",
- "bundle_modal_error.retry": "دووبارە تاقی بکەوە",
- "column.blocks": "بەکارهێنەرە بلۆککراوەکان",
- "column.bookmarks": "نیشانەکان",
- "column.community": "هێڵی کاتی ناوخۆیی",
- "column.direct": "نامە ڕاستەوخۆکان",
- "column.directory": "گەڕان لە پرۆفایلەکان",
- "column.domain_blocks": "دۆمەینە داخراوەکان",
- "column.favourites": "دڵخوازترینەکان",
- "column.follow_requests": "بەدواداچوی داواکاریەکان بکە",
- "column.home": "سەرەتا",
- "column.lists": "پێرست",
- "column.mutes": "بێدەنگکردنی بەکارهێنەران",
- "column.notifications": "ئاگادارییەکان",
- "column.pins": "تووتسی چەسپاو",
- "column.public": "نووسراوەکانی هەمووشوێنێک",
- "column_back_button.label": "دواوە",
- "column_header.hide_settings": "شاردنەوەی ڕێکخستنەکان",
- "column_header.moveLeft_settings": "ستوون بگوێزەرەوە بۆ لای چەپ",
- "column_header.moveRight_settings": "جوولاندنی ئەستوون بۆ لای ڕاست",
- "column_header.pin": "سنجاق",
- "column_header.show_settings": "نیشاندانی رێکخستنەکان",
- "column_header.unpin": "سنجاق نەکردن",
- "column_subheading.settings": "رێکخستنەکان",
- "community.column_settings.local_only": "تەنها خۆماڵی",
- "community.column_settings.media_only": "تەنها میدیا",
- "community.column_settings.remote_only": "تەنها بۆ دوور",
- "compose_form.direct_message_warning": "ئەم توتە تەنیا بۆ بەکارهێنەرانی ناوبراو دەنێردرێت.",
- "compose_form.direct_message_warning_learn_more": "زیاتر فێربه",
- "compose_form.hashtag_warning": "ئەم توتە لە ژێر هیچ هاشتاگییەک دا ناکرێت وەک ئەوەی لە لیستەکەدا نەریزراوە. تەنها توتی گشتی دەتوانرێت بە هاشتاگی بگەڕێت.",
- "compose_form.lock_disclaimer": "هەژمێرەکەی لە حاڵەتی {locked}. هەر کەسێک دەتوانێت شوێنت بکەوێت بۆ پیشاندانی بابەتەکانی تەنها دوایخۆی.",
- "compose_form.lock_disclaimer.lock": "قفڵ دراوە",
- "compose_form.placeholder": "چی لە مێشکتدایە?",
- "compose_form.poll.add_option": "زیادکردنی هەڵبژاردەیەک",
- "compose_form.poll.duration": "ماوەی ڕاپرسی",
- "compose_form.poll.option_placeholder": "هەڵبژاردن {number}",
- "compose_form.poll.remove_option": "لابردنی ئەم هەڵبژاردەیە",
- "compose_form.poll.switch_to_multiple": "ڕاپرسی بگۆڕە بۆ ڕێگەدان بە چەند هەڵبژاردنێک",
- "compose_form.poll.switch_to_single": "گۆڕینی ڕاپرسی بۆ ڕێگەدان بە تاکە هەڵبژاردنێک",
- "compose_form.publish": "توت",
+ "account.account_note_header": "Nîşe",
+ "account.add_or_remove_from_list": "Tevlî bike an rake ji rêzokê",
+ "account.badges.bot": "Bot",
+ "account.badges.group": "Kom",
+ "account.block": "@{name} asteng bike",
+ "account.block_domain": "{domain} navpar asteng bike",
+ "account.blocked": "Astengkirî",
+ "account.browse_more_on_origin_server": "Li pelên resen bêhtir bigere",
+ "account.cancel_follow_request": "Daxwaza şopandinê rake",
+ "account.direct": "Peyamekê bişîne @{name}",
+ "account.disable_notifications": "Êdî min agahdar neke gava @{name} diweşîne",
+ "account.domain_blocked": "Navper hate astengkirin",
+ "account.edit_profile": "Profîl serrast bike",
+ "account.enable_notifications": "Min agahdar bike gava @{name} diweşîne",
+ "account.endorse": "Taybetiyên li ser profîl",
+ "account.follow": "Bişopîne",
+ "account.followers": "Şopîner",
+ "account.followers.empty": "Kesekî hin ev bikarhêner neşopandiye.",
+ "account.followers_counter": "{count, plural, one {{counter} Follower} other {{counter} Followers}}",
+ "account.following": "Dişopîne",
+ "account.following_counter": "{count, plural, one {{counter} Dişopîne} other {{counter} Dişopîne}}",
+ "account.follows.empty": "Ev bikarhêner hin kesekî heya niha neşopandiye.",
+ "account.follows_you": "Te dişopîne",
+ "account.hide_reblogs": "Bilindkirinên ji @{name} veşêre",
+ "account.joined": "Tevlîbû di {date} de",
+ "account.link_verified_on": "Xwedaniya li vê girêdanê di {date} de hatiye kontrolkirin",
+ "account.locked_info": "Rewşa vê ajimêrê wek kilît kirî hatiye saz kirin. Xwedî yê ajimêrê, kesên vê bişopîne bi dest vekolin dike.",
+ "account.media": "Medya",
+ "account.mention": "Qal @{name} bike",
+ "account.moved_to": "{name} hate livandin bo:",
+ "account.mute": "@{name} Bêdeng bike",
+ "account.mute_notifications": "Agahdariyan ji @{name} bêdeng bike",
+ "account.muted": "Bêdengkirî",
+ "account.posts": "Şandî",
+ "account.posts_with_replies": "Şandî û bersiv",
+ "account.report": "@{name} Ragihîne",
+ "account.requested": "Li benda erêkirinê ye. Ji bo betal kirina daxwazê pêl bikin",
+ "account.share": "Profîla @{name} parve bike",
+ "account.show_reblogs": "Bilindkirinên ji @{name} nîşan bike",
+ "account.statuses_counter": "{count, plural,one {{counter} şandî}other {{counter} şandî}}",
+ "account.unblock": "Astengê li ser @{name} rake",
+ "account.unblock_domain": "Astengê li ser navperê {domain} rake",
+ "account.unblock_short": "Astengiyê rake",
+ "account.unendorse": "Li ser profîl nîşan neke",
+ "account.unfollow": "Neşopîne",
+ "account.unmute": "@{name} Bêdeng bike",
+ "account.unmute_notifications": "Agahdariyan ji @{name} bêdeng bike",
+ "account.unmute_short": "Bêdeng neke",
+ "account_note.placeholder": "Bitikîne bo nîşeyekê tevlî bikî",
+ "admin.dashboard.daily_retention": "Rêjeya ragirtina bikarhêner bi roj piştî tomarkirinê",
+ "admin.dashboard.monthly_retention": "Rêjeya ragirtina bikarhêner bi meh piştî tomarkirinê",
+ "admin.dashboard.retention.average": "Navîn",
+ "admin.dashboard.retention.cohort": "Meha tomarkirinê",
+ "admin.dashboard.retention.cohort_size": "Bikarhênerên nû",
+ "alert.rate_limited.message": "Jkx dîsa biceribîne piştî {retry_time, time, medium}.\n \n",
+ "alert.rate_limited.title": "Rêje sînorkirî ye",
+ "alert.unexpected.message": "Çewtiyeke bêhêvî çê bû.",
+ "alert.unexpected.title": "Wey li min!",
+ "announcement.announcement": "Daxuyanî",
+ "attachments_list.unprocessed": "(bêpêvajo)",
+ "autosuggest_hashtag.per_week": "Her hefte {count}",
+ "boost_modal.combo": "Ji bo derbas bî carekî din de pêlê {combo} bike",
+ "bundle_column_error.body": "Di dema barkirina vê hêmanê de tiştek çewt çê bû.",
+ "bundle_column_error.retry": "Dîsa biceribîne",
+ "bundle_column_error.title": "Çewtiya torê",
+ "bundle_modal_error.close": "Bigire",
+ "bundle_modal_error.message": "Di dema barkirina vê hêmanê de tiştek çewt çê bû.",
+ "bundle_modal_error.retry": "Dîsa bicerbîne",
+ "column.blocks": "Bikarhênerên astengkirî",
+ "column.bookmarks": "Şûnpel",
+ "column.community": "Demnameya herêmî",
+ "column.direct": "Peyamên taybet",
+ "column.directory": "Li profîlan bigere",
+ "column.domain_blocks": "Navperên astengkirî",
+ "column.favourites": "Bijarte",
+ "column.follow_requests": "Daxwazên şopandinê",
+ "column.home": "Serrûpel",
+ "column.lists": "Rêzok",
+ "column.mutes": "Bikarhênerên bêdengkirî",
+ "column.notifications": "Agahdarî",
+ "column.pins": "Şandiya derzîkirî",
+ "column.public": "Demnameyê federalîkirî",
+ "column_back_button.label": "Veger",
+ "column_header.hide_settings": "Sazkariyan veşêre",
+ "column_header.moveLeft_settings": "Stûnê bilivîne bo çepê",
+ "column_header.moveRight_settings": "Stûnê bilivîne bo rastê",
+ "column_header.pin": "Bi derzî bike",
+ "column_header.show_settings": "Sazkariyan nîşan bide",
+ "column_header.unpin": "Bi derzî neke",
+ "column_subheading.settings": "Sazkarî",
+ "community.column_settings.local_only": "Tenê herêmî",
+ "community.column_settings.media_only": "Tenê media",
+ "community.column_settings.remote_only": "Tenê ji dûr ve",
+ "compose_form.direct_message_warning": "Ev şandî tenê ji bikarhênerên qalkirî re wê were şandin.",
+ "compose_form.direct_message_warning_learn_more": "Bêtir fêr bibe",
+ "compose_form.hashtag_warning": "Ev şandî ji ber ku nehatiye tomarkirin dê di binê hashtagê de neyê tomar kirin. Tenê peyamên gelemperî dikarin bi hashtagê werin lêgerîn.",
+ "compose_form.lock_disclaimer": "Ajimêrê te {locked} nîne. Herkes dikare te bişopîne da ku şandiyên te yên tenê şopînerên te ra xûya dibin bibînin.",
+ "compose_form.lock_disclaimer.lock": "girtî ye",
+ "compose_form.placeholder": "Çi di hişê te derbas dibe?",
+ "compose_form.poll.add_option": "Hilbijarekî tevlî bike",
+ "compose_form.poll.duration": "Dema rapirsî yê",
+ "compose_form.poll.option_placeholder": "{number} Hilbijêre",
+ "compose_form.poll.remove_option": "Vê hilbijarê rake",
+ "compose_form.poll.switch_to_multiple": "Rapirsî yê biguherînin da ku destûr bidin vebijarkên pirjimar",
+ "compose_form.poll.switch_to_single": "Rapirsîyê biguherîne da ku mafê bidî tenê vebijêrkek",
+ "compose_form.publish": "Toot",
"compose_form.publish_loud": "{publish}!",
- "compose_form.sensitive.hide": "نیشانکردنی میدیا وەک هەستیار",
- "compose_form.sensitive.marked": "وادەی کۆتایی",
- "compose_form.sensitive.unmarked": "میدیا وەک هەستیار نیشان نەکراوە",
- "compose_form.spoiler.marked": "دەق لە پشت ئاگاداریدا شاراوەتەوە",
- "compose_form.spoiler.unmarked": "دەق شاراوە نییە",
- "compose_form.spoiler_placeholder": "ئاگاداریەکەت لێرە بنووسە",
- "confirmation_modal.cancel": "هەڵوەشاندنەوه",
- "confirmations.block.block_and_report": "بلۆک & گوزارشت",
- "confirmations.block.confirm": "بلۆک",
- "confirmations.block.message": "ئایا دڵنیایت لەوەی دەتەوێت {name} بلۆک بکەیت?",
- "confirmations.delete.confirm": "سڕینەوە",
- "confirmations.delete.message": "ئایا دڵنیایت لەوەی دەتەوێت ئەم توتە بسڕیتەوە?",
- "confirmations.delete_list.confirm": "سڕینەوە",
- "confirmations.delete_list.message": "ئایا دڵنیایت لەوەی دەتەوێت بە هەمیشەیی ئەم لیستە بسڕیتەوە?",
- "confirmations.discard_edit_media.confirm": "Discard",
- "confirmations.discard_edit_media.message": "You have unsaved changes to the media description or preview, discard them anyway?",
- "confirmations.domain_block.confirm": "بلۆککردنی هەموو دۆمەینەکە",
- "confirmations.domain_block.message": "ئایا بەڕاستی، بەڕاستی تۆ دەتەوێت هەموو {domain} بلۆک بکەیت؟ لە زۆربەی حاڵەتەکاندا چەند بلۆکێکی ئامانجدار یان بێدەنگەکان پێویست و پەسەندن. تۆ ناوەڕۆک ێک نابینیت لە دۆمەینەکە لە هیچ هێڵی کاتی گشتی یان ئاگانامەکانت. شوێنکەوتوانی تۆ لەو دۆمەینەوە لادەبرێن.",
- "confirmations.logout.confirm": "چوونە دەرەوە",
- "confirmations.logout.message": "ئایا دڵنیایت لەوەی دەتەوێت بچیتە دەرەوە?",
- "confirmations.mute.confirm": "بێدەنگ",
- "confirmations.mute.explanation": "ئەمەش دەبێتە هۆی شاردنەوەی پۆستەکان یان ئەو بابەتانەی کە ئاماژەیان پێ دەکات ، بەڵام هێشتا ڕێگەیان پێ دەدات کە پۆستەکانتان ببینن و شوێنتان بکەون.",
- "confirmations.mute.message": "ئایا دڵنیایت لەوەی دەتەوێت بیلێیت {name}?",
- "confirmations.redraft.confirm": "سڕینەوە & دووبارە ڕەشکردنەوە",
- "confirmations.redraft.message": "ئایا دڵنیایت لەوەی دەتەوێت ئەم توتە بسڕیتەوە و دووبارە دایبنووسیتەوە؟ دڵخوازەکان و بەرزکردنەوەکان وون دەبن، و وەڵامەکان بۆ پۆستە ڕەسەنەکە هەتیو دەبن.",
- "confirmations.reply.confirm": "وەڵام",
- "confirmations.reply.message": "وەڵامدانەوە ئێستا ئەو نامەیە ی کە تۆ ئێستا دایڕشتووە، دەنووسێتەوە. ئایا دڵنیایت کە دەتەوێت بەردەوام بیت?",
- "confirmations.unfollow.confirm": "بەدوادانەچو",
- "confirmations.unfollow.message": "ئایا دڵنیایت لەوەی دەتەوێت پەیڕەوی {name}?",
- "conversation.delete": "سڕینەوەی گفتوگۆ",
- "conversation.mark_as_read": "نیشانەکردن وەک خوێندراوە",
- "conversation.open": "نیشاندان گفتوگۆ",
- "conversation.with": "لەگەڵ{names}",
- "directory.federated": "لە ڕاژەکانی ناسراو",
- "directory.local": "تەنها لە {domain}",
- "directory.new_arrivals": "تازە گەیشتنەکان",
- "directory.recently_active": "بەم دواییانە چالاکە",
- "embed.instructions": "ئەم توتە بنچین بکە لەسەر وێب سایتەکەت بە کۆپیکردنی کۆدەکەی خوارەوە.",
- "embed.preview": "ئەمە ئەو شتەیە کە لە شێوەی خۆی دەچێت:",
- "emoji_button.activity": "چالاکی",
- "emoji_button.custom": "ئاسایی",
- "emoji_button.flags": "ئاڵاکان",
- "emoji_button.food": "خواردن& خواردنەوە",
- "emoji_button.label": "ئیمۆجی بکەنێو",
- "emoji_button.nature": "سروشت",
- "emoji_button.not_found": "بێ ئیمۆجی! (╯°□°)╯( ┻━┻",
- "emoji_button.objects": "ئامانجەکان",
- "emoji_button.people": "خەڵک",
- "emoji_button.recent": "زۆرجار بەکارهێنراوە",
- "emoji_button.search": "گەڕان...",
- "emoji_button.search_results": "ئەنجامەکانی گەڕان",
- "emoji_button.symbols": "هێماکان",
- "emoji_button.travel": "گەشت & شوێنەکان",
- "empty_column.account_suspended": "Account suspended",
- "empty_column.account_timeline": "لێرە هیچ توتەک نییە!",
- "empty_column.account_unavailable": "پرۆفایل بەردەست نیە",
- "empty_column.blocks": "تۆ هێشتا هیچ بەکارهێنەرێکت بلۆک نەکردووە.",
- "empty_column.bookmarked_statuses": "تۆ هێشتا هیچ توتێکی دیاریکراوت نیە کاتێک نیشانەیەک نیشان دەکەیت، لێرە دەرئەکەویت.",
- "empty_column.community": "هێڵی کاتی ناوخۆیی بەتاڵە. شتێک بە ئاشکرا بنووسە بۆ ئەوەی تۆپەکە بسووڕێت!",
- "empty_column.direct": "تۆ هیچ نامەی ڕاستەوخۆت نیە تا ئێستا. کاتێک دانەیەک دەنێریت یان وەرت دەگرێت، لێرە پیشان دەدات.",
- "empty_column.domain_blocks": "هێشتا هیچ دۆمەینێکی بلۆک کراو نییە.",
- "empty_column.favourited_statuses": "تۆ هێشتا هیچ توتێکی دڵخوازت نییە، کاتێک حەزت لە دانەیەکی باشە، لێرە دەرئەکەویت.",
- "empty_column.favourites": "کەس ئەم توتەی دڵخواز نەکردووە،کاتێک کەسێک وا بکات، لێرە دەرئەکەون.",
- "empty_column.follow_recommendations": "Looks like no suggestions could be generated for you. You can try using search to look for people you might know or explore trending hashtags.",
- "empty_column.follow_requests": "تۆ هێشتا هیچ داواکارییەکی بەدواداچووت نیە. کاتێک یەکێکت بۆ هات، لێرە دەرئەکەویت.",
- "empty_column.hashtag": "هێشتا هیچ شتێک لەم هاشتاگەدا نییە.",
- "empty_column.home": "تایم لاینی ماڵەوەت بەتاڵە! سەردانی {public} بکە یان گەڕان بەکاربێنە بۆ دەستپێکردن و بینینی بەکارهێنەرانی تر.",
- "empty_column.home.suggestions": "See some suggestions",
- "empty_column.list": "هێشتا هیچ شتێک لەم لیستەدا نییە. کاتێک ئەندامانی ئەم لیستە دەنگی نوێ بڵاودەکەن، لێرە دەردەکەون.",
- "empty_column.lists": "تۆ هێشتا هیچ لیستت دروست نەکردووە، کاتێک دانەیەک دروست دەکەیت، لێرە پیشان دەدرێت.",
- "empty_column.mutes": "تۆ هێشتا هیچ بەکارهێنەرێکت بێدەنگ نەکردووە.",
- "empty_column.notifications": "تۆ هێشتا هیچ ئاگانامێکت نیە. چالاکی لەگەڵ کەسانی دیکە بکە بۆ دەستپێکردنی گفتوگۆکە.",
- "empty_column.public": "لێرە هیچ نییە! شتێک بە ئاشکرا بنووسە(بەگشتی)، یان بە دەستی شوێن بەکارهێنەران بکەوە لە ڕاژەکانی ترەوە بۆ پڕکردنەوەی",
- "error.unexpected_crash.explanation": "بەهۆی بوونی کێشە لە کۆدەکەمان یان کێشەی گونجانی وێبگەڕەکە، ئەم لاپەڕەیە بە دروستی پیشان نادرێت.",
- "error.unexpected_crash.explanation_addons": "ئەم لاپەڕەیە ناتوانرێت بە دروستی پیشان بدرێت. ئەم هەڵەیە لەوانەیە بەهۆی ئامێری وەرگێڕانی خۆکار یان زیادکراوی وێبگەڕەوە بێت.",
- "error.unexpected_crash.next_steps": "هەوڵدە لاپەڕەکە تازە بکەوە. ئەگەر ئەمە یارمەتیدەر نەبوو، لەوانەیە هێشتا بتوانیت ماستۆدۆن بەکاربێنیت لە ڕێگەی وێبگەڕەکەیان کاربەرنامەی ڕەسەن.",
- "error.unexpected_crash.next_steps_addons": "هەوڵدە لەکاریان بخەیت و لاپەڕەکە تازە بکەوە. ئەگەر ئەمە یارمەتیدەر نەبوو، لەوانەیە هێشتا بتوانیت ماستۆدۆن بەکاربێنیت لە ڕێگەی وێبگەڕەکانی دیکە یان نەرمەکالاکانی ئەسڵی.",
- "errors.unexpected_crash.copy_stacktrace": "کۆپیکردنی ستێکتراسی بۆ کلیپ بۆرد",
- "errors.unexpected_crash.report_issue": "کێشەی گوزارشت",
- "follow_recommendations.done": "Done",
- "follow_recommendations.heading": "Follow people you'd like to see posts from! Here are some suggestions.",
- "follow_recommendations.lead": "Posts from people you follow will show up in chronological order on your home feed. Don't be afraid to make mistakes, you can unfollow people just as easily any time!",
- "follow_request.authorize": "دهسهڵاتپێدراو",
- "follow_request.reject": "ڕەتکردنەوە",
- "follow_requests.unlocked_explanation": "هەرچەندە هەژمارەکەت داخراو نییە، ستافی {domain} وا بیریان کردەوە کە لەوانەیە بتانەوێت پێداچوونەوە بە داواکاریەکانی ئەم هەژمارەدا بکەن بە دەستی.",
- "generic.saved": "پاشکەوتکرا",
- "getting_started.developers": "پەرەپێدەران",
- "getting_started.directory": "پەڕەی پرۆفایل",
- "getting_started.documentation": "بەڵگەنامە",
- "getting_started.heading": "دەست پێکردن",
- "getting_started.invite": "بانگهێشتکردنی خەڵک",
- "getting_started.open_source_notice": "ماستۆدۆن نەرمەکالایەکی سەرچاوەی کراوەیە. دەتوانیت بەشداری بکەیت یان گوزارشت بکەیت لەسەر کێشەکانی لە پەڕەی گیتهاب {github}.",
- "getting_started.security": "ڕێکخستنەکانی هەژمارە",
- "getting_started.terms": "مەرجەکانی خزمەتگوزاری",
- "hashtag.column_header.tag_mode.all": "و {additional}",
- "hashtag.column_header.tag_mode.any": "یا {additional}",
- "hashtag.column_header.tag_mode.none": "بەبێ {additional}",
- "hashtag.column_settings.select.no_options_message": "هیچ پێشنیارێک نەدۆزرایەوە",
- "hashtag.column_settings.select.placeholder": "هاشتاگی تێبنووسە…",
- "hashtag.column_settings.tag_mode.all": "هەموو ئەمانە",
- "hashtag.column_settings.tag_mode.any": "هەر کام لەمانە",
- "hashtag.column_settings.tag_mode.none": "هیچ کام لەمانە",
- "hashtag.column_settings.tag_toggle": "تاگی زیادە ی ئەم ستوونە لەخۆ بنووسە",
- "home.column_settings.basic": "بنەڕەتی",
- "home.column_settings.show_reblogs": "پیشاندانی بەهێزکردن",
- "home.column_settings.show_replies": "وەڵامدانەوەکان پیشان بدە",
- "home.hide_announcements": "شاردنەوەی راگەیەنراوەکان",
- "home.show_announcements": "پیشاندانی راگەیەنراوەکان",
- "intervals.full.days": "{number, plural, one {# ڕۆژ} other {# ڕۆژەک}}",
- "intervals.full.hours": "{number, plural, one {# کات} other {# کات}}",
- "intervals.full.minutes": "{number, plural, one {# خولەک} other {# خولەک}}",
- "keyboard_shortcuts.back": "بۆ گەڕانەوە",
- "keyboard_shortcuts.blocked": "بۆ کردنەوەی لیستی بەکارهێنەرە بلۆککراوەکان",
- "keyboard_shortcuts.boost": "بۆ بەهێزکردن",
- "keyboard_shortcuts.column": "بۆ ئەوەی تیشک بخاتە سەر توتێک لە یەکێک لە ستوونەکان",
- "keyboard_shortcuts.compose": "بۆ سەرنجدان بە نووسینی ناوچەی دەق",
- "keyboard_shortcuts.description": "وهسف",
- "keyboard_shortcuts.direct": "بۆ کردنەوەی ستوونی نامە ڕاستەوخۆکان",
- "keyboard_shortcuts.down": "بۆ چوونە خوارەوە لە لیستەکەدا",
- "keyboard_shortcuts.enter": "بۆ کردنەوەی توت",
- "keyboard_shortcuts.favourite": "بۆ دڵخواز",
- "keyboard_shortcuts.favourites": "بۆ کردنەوەی لیستی دڵخوازەکان",
- "keyboard_shortcuts.federated": "بۆ کردنەوەی نووسراوەکانی هەمووشوێن",
- "keyboard_shortcuts.heading": "قهدبڕەکانی تەختەکلیل",
- "keyboard_shortcuts.home": "بۆ کردنەوەی هێڵی کاتی ماڵەوە",
- "keyboard_shortcuts.hotkey": "هۆتکەی",
- "keyboard_shortcuts.legend": "بۆ نیشاندانی ئەم نیشانە",
- "keyboard_shortcuts.local": "بۆ کردنەوەی نووسراوەکانی خۆماڵی",
- "keyboard_shortcuts.mention": "نۆ ناوبردن لە نووسەر",
- "keyboard_shortcuts.muted": "بۆ کردنەوەی پێرستی بەکارهێنەرانی بێدەنگ",
- "keyboard_shortcuts.my_profile": "بۆ کردنەوەی پرۆفایڵ",
- "keyboard_shortcuts.notifications": "بۆ کردنەوەی ستوونی ئاگانامەکان",
- "keyboard_shortcuts.open_media": "بۆ کردنەوەی میدیا",
- "keyboard_shortcuts.pinned": "بۆ کردنەوەی لیستی توتەکانی چەسپێنراو",
- "keyboard_shortcuts.profile": "بۆ کردنەوەی پرۆفایڵی نووسەر",
- "keyboard_shortcuts.reply": "بۆ وەڵامدانەوە",
- "keyboard_shortcuts.requests": "بۆ کردنەوەی لیستی داواکاریەکانی بەدوادا",
- "keyboard_shortcuts.search": "بۆ جەختکردن لەسەر گەڕان",
- "keyboard_shortcuts.spoilers": "بۆ پیشاندان/شاردنەوەی خانەی CW",
- "keyboard_shortcuts.start": "بۆ کردنەوەی ستوونی \"دەست پێبکە\"",
- "keyboard_shortcuts.toggle_hidden": "بۆ پیشاندان/شاردنەوەی دەق لە پشت CW",
- "keyboard_shortcuts.toggle_sensitivity": "بۆ پیشاندان/شاردنەوەی میدیا",
- "keyboard_shortcuts.toot": "بۆ دەست کردن بە براندێکی تازە",
- "keyboard_shortcuts.unfocus": "بۆ دروستکردنی ناوچەی دەق/گەڕان",
- "keyboard_shortcuts.up": "بۆ ئەوەی لە لیستەکەدا بڕۆیت",
- "lightbox.close": "دابخە",
- "lightbox.compress": "سندوقی نیشاندانی وێنە بپەستێنە",
- "lightbox.expand": "فراوانکردنی سندوقی بینینی وێنە",
- "lightbox.next": "داهاتوو",
- "lightbox.previous": "پێشوو",
- "lists.account.add": "زیادکردن بۆ لیست",
- "lists.account.remove": "لابردن لە لیست",
- "lists.delete": "سڕینەوەی لیست",
- "lists.edit": "دەستکاری لیست",
- "lists.edit.submit": "گۆڕینی ناونیشان",
- "lists.new.create": "زیادکردنی لیست",
- "lists.new.title_placeholder": "ناونیشانی لیستی نوێ",
- "lists.replies_policy.followed": "Any followed user",
- "lists.replies_policy.list": "Members of the list",
- "lists.replies_policy.none": "No one",
- "lists.replies_policy.title": "پیشاندانی وەڵامەکان بۆ:",
- "lists.search": "بگەڕێ لەناو ئەو کەسانەی کە شوێنیان کەوتویت",
- "lists.subheading": "لیستەکانت",
- "load_pending": "{count, plural, one {# new item} other {# new items}}",
- "loading_indicator.label": "بارکردن...",
- "media_gallery.toggle_visible": "شاردنەوەی {number, plural, one {image} other {images}}",
- "missing_indicator.label": "نەدۆزرایەوە",
- "missing_indicator.sublabel": "ئەو سەرچاوەیە نادۆزرێتەوە",
- "mute_modal.duration": "ماوە",
- "mute_modal.hide_notifications": "شاردنەوەی ئاگانامەکان لەم بەکارهێنەرە؟ ",
- "mute_modal.indefinite": "نادیار",
- "navigation_bar.apps": "بەرنامەی مۆبایل",
- "navigation_bar.blocks": "بەکارهێنەرە بلۆککراوەکان",
- "navigation_bar.bookmarks": "نیشانکراوەکان",
- "navigation_bar.community_timeline": "دەمنامەی ناوخۆیی",
- "navigation_bar.compose": "نووسینی توتی نوێ",
- "navigation_bar.direct": "نامە ڕاستەوخۆکان",
- "navigation_bar.discover": "دۆزینەوە",
- "navigation_bar.domain_blocks": "دۆمەینە بلۆک کراوەکان",
- "navigation_bar.edit_profile": "دەستکاری پرۆفایل بکە",
- "navigation_bar.favourites": "دڵخوازەکان",
- "navigation_bar.filters": "وشە کپەکان",
- "navigation_bar.follow_requests": "بەدواداچوی داواکاریەکان بکە",
- "navigation_bar.follows_and_followers": "شوێنکەوتوو و شوێنکەوتوان",
- "navigation_bar.info": "دەربارەی ئەم ڕاژە",
- "navigation_bar.keyboard_shortcuts": "هۆتکەی",
- "navigation_bar.lists": "لیستەکان",
- "navigation_bar.logout": "دەرچوون",
- "navigation_bar.mutes": "کپکردنی بەکارهێنەران",
- "navigation_bar.personal": "کەسی",
- "navigation_bar.pins": "توتی چەسپاو",
- "navigation_bar.preferences": "پەسەندەکان",
- "navigation_bar.public_timeline": "نووسراوەکانی هەمووشوێنێک",
- "navigation_bar.security": "ئاسایش",
- "notification.favourite": "{name} نووسراوەکەتی پەسەند کرد",
- "notification.follow": "{name} دوای تۆ کەوت",
- "notification.follow_request": "{name} داوای کردووە کە شوێنت بکەوێت",
- "notification.mention": "{name} باسی ئێوەی کرد",
- "notification.own_poll": "ڕاپرسیەکەت کۆتایی هات",
- "notification.poll": "ڕاپرسییەک کە دەنگی پێداویت کۆتایی هات",
- "notification.reblog": "{name} نووسراوەکەتی دووبارە توتاند",
- "notification.status": "{name} تازە بڵاوکرایەوە",
- "notifications.clear": "ئاگانامەکان بسڕیەوە",
- "notifications.clear_confirmation": "ئایا دڵنیایت لەوەی دەتەوێت بە هەمیشەیی هەموو ئاگانامەکانت بسڕیتەوە?",
- "notifications.column_settings.alert": "ئاگانامەکانی پیشانگەرر ڕومێزی",
- "notifications.column_settings.favourite": "دڵخوازترین:",
- "notifications.column_settings.filter_bar.advanced": "هەموو پۆلەکان پیشان بدە",
- "notifications.column_settings.filter_bar.category": "شریتی پاڵێوەری خێرا",
- "notifications.column_settings.filter_bar.show": "نیشاندان",
- "notifications.column_settings.follow": "شوێنکەوتوانی نوێ:",
- "notifications.column_settings.follow_request": "شوینکەوتنی داواکاری نوێ:",
- "notifications.column_settings.mention": "ئاماژەکان:",
- "notifications.column_settings.poll": "ئەنجامەکانی ڕاپرسی:",
- "notifications.column_settings.push": "ئاگانامەکان پاڵ بنێ",
- "notifications.column_settings.reblog": "دووبارەتوتەکان:",
- "notifications.column_settings.show": "لە ستووندا پیشان بدە",
- "notifications.column_settings.sound": "لێدانی دەنگ",
- "notifications.column_settings.status": "توتەکانی نوێ:",
- "notifications.column_settings.unread_markers.category": "Unread notification markers",
- "notifications.filter.all": "هەموو",
- "notifications.filter.boosts": "دووبارەتوتەکان",
- "notifications.filter.favourites": "دڵخوازەکان",
- "notifications.filter.follows": "شوێنکەوتن",
- "notifications.filter.mentions": "ئاماژەکان",
- "notifications.filter.polls": "ئەنجامەکانی ڕاپرسی",
- "notifications.filter.statuses": "نوێکردنەوەکان ئەو کەسانەی کە پەیڕەوی دەکەیت",
- "notifications.grant_permission": "Grant permission.",
- "notifications.group": "{count} ئاگانامە",
- "notifications.mark_as_read": "هەموو ئاگانامەکان وەک خوێندراوەتەوە نیشان بکە",
- "notifications.permission_denied": "ناتوانرێت ئاگانامەکانی دێسکتۆپ چالاک بکرێت وەک ڕێپێدان ڕەتکرایەوە.",
- "notifications.permission_denied_alert": "ناتوانرێت ئاگانامەکانی دێسکتۆپ چالاک بکرێت، چونکە پێشتر مۆڵەتی وێبگەڕ ڕەتکرایەوە",
- "notifications.permission_required": "Desktop notifications are unavailable because the required permission has not been granted.",
- "notifications_permission_banner.enable": "چالاککردنی ئاگانامەکانی دێسکتۆپ",
- "notifications_permission_banner.how_to_control": "بۆ وەرگرتنی ئاگانامەکان کاتێک ماستۆدۆن نەکراوەیە، ئاگانامەکانی دێسکتۆپ چالاک بکە. دەتوانیت بە وردی کۆنترۆڵی جۆری کارلێکەکان بکەیت کە ئاگانامەکانی دێسکتۆپ دروست دەکەن لە ڕێگەی دوگمەی {icon} لەسەرەوە کاتێک چالاک دەکرێن.",
- "notifications_permission_banner.title": "هەرگیز شتێک لە دەست مەدە",
- "picture_in_picture.restore": "بیگەڕێنەوە",
- "poll.closed": "دابخە",
- "poll.refresh": "نوێکردنەوە",
- "poll.total_people": "{count, plural, one {# خەڵک} other {# خەڵک}}",
- "poll.total_votes": "{count, plural, one {# دەنگ} other {# دەنگ}}\n",
- "poll.vote": "دەنگ",
- "poll.voted": "تۆ دەنگت بەو وەڵامە دا",
- "poll.votes": "{votes, plural, one {# vote} other {# votes}}",
- "poll_button.add_poll": "ڕاپرسییەک زیاد بکە",
- "poll_button.remove_poll": "دهنگدان بسڕهوه",
- "privacy.change": "ڕێکخستنی تایبەتمەندی توت",
- "privacy.direct.long": "تەنیا بۆ بەکارهێنەرانی ناوبراو",
- "privacy.direct.short": "ڕاستەوخۆ",
- "privacy.private.long": "بینراو تەنها بۆ شوێنکەوتوان",
- "privacy.private.short": "تەنها بۆ شوێنکەوتوان",
- "privacy.public.long": "بۆ هەمووان دیاربێت، لە هێڵی کاتی گشتی دا نیشان دەدرێت",
- "privacy.public.short": "گشتی",
- "privacy.unlisted.long": "بۆ هەمووان دیارە، بەڵام لە هێڵی کاتی گشتیدا نا",
- "privacy.unlisted.short": "لە لیست نەکراو",
- "refresh": "نوێکردنەوە",
- "regeneration_indicator.label": "بارکردن…",
- "regeneration_indicator.sublabel": "ڕاگەیەنەری ماڵەوەت ئامادە دەکرێت!",
- "relative_time.days": "{number}ڕۆژ",
- "relative_time.hours": "{number}کات",
- "relative_time.just_now": "ئێستا",
- "relative_time.minutes": "{number}کات",
- "relative_time.seconds": "{number}کات",
- "relative_time.today": "ئیمڕۆ",
- "reply_indicator.cancel": "هەڵوەشاندنەوه",
- "report.forward": "ناردن بۆ {target}",
- "report.forward_hint": "هەژمارەکە لە ڕاژەیەکی ترە. ڕونووسێکی نەناسراو بنێرە بۆ گوزارشت لەوێ?",
- "report.hint": "گوزارشتەکە دەنێردرێت بۆ بەرپرسانی ڕاژەکەت. دەتوانیت ڕوونکردنەوەیەک پێشکەش بکەیت کە بۆچی ئەم هەژمارە لە خوارەوە گوزارش دەکەیت:",
- "report.placeholder": "سەرنجەکانی زیاتر",
- "report.submit": "ناردن",
- "report.target": "گوزارشتکردنی{target}",
- "search.placeholder": "گەڕان",
- "search_popout.search_format": "شێوەی گەڕانی پێشکەوتوو",
- "search_popout.tips.full_text": "گەڕانێکی دەقی سادە دەتوانێت توتەکانی ئێوە کە، نووسیوتانە،پەسەنتان کردووە، دووبارەتانکردووە، یان ئەو توتانە کە باسی ئێوەی تێدا کراوە پەیدا دەکا. هەروەها ناوی بەکارهێنەران، ناوی پیشاندراو و هەشتەگەکانیش لە خۆ دەگرێت.",
- "search_popout.tips.hashtag": "هەشتاگ",
- "search_popout.tips.status": "توت",
- "search_popout.tips.text": "دەقی سادە هەڵدەسێ بە گەڕاندنەوەی هاوتایی ناوی پیشاندان، ناوی بەکارهێنەر و هاشتاگەکان",
- "search_popout.tips.user": "بەکارهێنەر",
- "search_results.accounts": "خەڵک",
- "search_results.hashtags": "هەشتاگ",
- "search_results.statuses": "توتەکان",
- "search_results.statuses_fts_disabled": "گەڕانی توتەکان بە ناوەڕۆکیان لەسەر ئەم ڕاژەی ماستۆدۆن چالاک نەکراوە.",
- "search_results.total": "{count, number} {count, plural, one {دەرئەنجام} other {دەرئەنجام}}",
- "status.admin_account": "کردنەوەی میانڕەوی بەڕێوەبەر بۆ @{name}",
- "status.admin_status": "ئەم توتە بکەوە لە ناو ڕووکاری بەڕیوەبەر",
- "status.block": "بلۆکی @{name}",
- "status.bookmark": "نیشانه",
- "status.cancel_reblog_private": "بێبەهێزکردن",
- "status.cannot_reblog": "ئەم بابەتە ناتوانرێت بەرزبکرێتەوە",
- "status.copy": "ڕوونووسی بەستەر بۆ توت",
- "status.delete": "سڕینەوە",
- "status.detailed_status": "ڕوانگەی گفتوگۆ بە وردەکاری",
- "status.direct": "پەیامی ڕاستەوخۆ @{name}",
- "status.embed": "نیشتەجێ بکە",
- "status.favourite": "دڵخواز",
- "status.filtered": "پاڵاوتن",
- "status.load_more": "بارکردنی زیاتر",
- "status.media_hidden": "میدیای شاراوە",
- "status.mention": "ناوبنێ @{name}",
- "status.more": "زیاتر",
- "status.mute": "بێدەنگکردن @{name}",
- "status.mute_conversation": "گفتوگۆی بێدەنگ",
- "status.open": "ئەم توتە فراوان بکە",
- "status.pin": "لکاندن لەسەر پرۆفایل",
- "status.pinned": "توتی چەسپکراو",
- "status.read_more": "زیاتر بخوێنەوە",
- "status.reblog": "بەهێزکردن",
- "status.reblog_private": "بەهێزکردن بۆ بینەرانی سەرەتایی",
- "status.reblogged_by": "{name} توتی کردەوە",
- "status.reblogs.empty": "کەس ئەم توتەی دووبارە نەتوتاندوە ،کاتێک کەسێک وا بکات، لێرە دەرئەکەون.",
- "status.redraft": "سڕینەوەی و دووبارە ڕەشنووس",
- "status.remove_bookmark": "لابردنی نیشانه",
- "status.reply": "وەڵام",
- "status.replyAll": "بە نووسراوە وەڵام بدەوە",
- "status.report": "گوزارشت @{name}",
- "status.sensitive_warning": "ناوەڕۆکی هەستیار",
- "status.share": "هاوبەش کردن",
- "status.show_less": "کەمتر نیشان بدە",
- "status.show_less_all": "کەمتر نیشان بدە بۆ هەمووی",
- "status.show_more": "زیاتر پیشان بدە",
- "status.show_more_all": "زیاتر نیشان بدە بۆ هەمووی",
- "status.show_thread": "نیشاندانی گفتوگۆ",
- "status.uncached_media_warning": "بەردەست نیە",
- "status.unmute_conversation": "گفتوگۆی بێدەنگ",
- "status.unpin": "لابردن لە پرۆفایل",
- "suggestions.dismiss": "ڕەتکردنەوەی پێشنیار",
- "suggestions.header": "لەوانەیە حەزت لەمەش بێت…",
- "tabs_bar.federated_timeline": "گشتی",
- "tabs_bar.home": "سەرەتا",
- "tabs_bar.local_timeline": "ناوخۆیی",
- "tabs_bar.notifications": "ئاگادارییەکان",
- "tabs_bar.search": "گەڕان",
- "time_remaining.days": "{number, plural, one {# ڕۆژ} other {# ڕۆژ}} ماوە",
- "time_remaining.hours": "{number, plural, one {# کات} other {# کات}} ماوە",
- "time_remaining.minutes": "{number, plural, one {# خۆلەک} other {# خولەک}} ماوە",
- "time_remaining.moments": "ئەو ساتانەی ماونەتەوە",
- "time_remaining.seconds": "{number, plural, one {# چرکە} other {# چرکە}} ماوە",
- "timeline_hint.remote_resource_not_displayed": "{resource} لە ڕاژەکانی ترەوە پیشان نادرێت.",
- "timeline_hint.resources.followers": "شوێنکەوتووان",
- "timeline_hint.resources.follows": "شوێنکەوتن",
- "timeline_hint.resources.statuses": "توتی کۆن",
- "trends.counter_by_accounts": "{count, plural, one {{counter} کەس} other {{counter} کەس}} گفتوگۆ دەکا",
- "trends.trending_now": "گۆگران",
- "ui.beforeunload": "ڕەشنووسەکەت لە دەست دەچێت ئەگەر لە ماستۆدۆن بڕۆیت.",
- "units.short.billion": "{count}ملیار",
- "units.short.million": "{count}ملیۆن",
- "units.short.thousand": "{count}هەزار",
- "upload_area.title": "ڕاکێشان & دانان بۆ بارکردن",
- "upload_button.label": "زیادکردنی وێنەکان، ڤیدیۆیەک یان فایلێکی دەنگی",
- "upload_error.limit": "سنووری بارکردنی فایل تێپەڕیوە.",
- "upload_error.poll": "پەڕگەکە ڕێی پێنەدراوە بە ڕاپرسی باربکرێت.",
- "upload_form.audio_description": "بۆ ئەو کەسانەی کە گوێ بیستیان هەیە وەسف دەکات",
- "upload_form.description": "وەسف بکە بۆ کەمبینایان",
- "upload_form.edit": "دەستکاری",
- "upload_form.thumbnail": "گۆڕانی وینۆچکە",
- "upload_form.undo": "سڕینەوە",
- "upload_form.video_description": "بۆ کەم بینایان و کەم بیستان وەسفی بکە",
- "upload_modal.analyzing_picture": "شیکردنەوەی وێنە…",
- "upload_modal.apply": "جێبەجێ کردن",
- "upload_modal.applying": "Applying…",
- "upload_modal.choose_image": "وێنە هەڵبژێرە",
- "upload_modal.description_placeholder": "بە دڵ کەین با بە نەشئەی مەی غوباری میحنەتی دونیا",
- "upload_modal.detect_text": "دەقی وێنەکە بدۆزیەوە",
- "upload_modal.edit_media": "دەستکاریکردنی میدیا",
- "upload_modal.hint": "گەر وێنە چکۆلە یان بڕاوەبێت، خاڵی ناوەندی دیار دەکەوێت. خاڵی ناوەندی وێنە بە کرتە یان جێبەجیکردنی رێکبخەن.",
- "upload_modal.preparing_ocr": "ئامادەکردنی OCR…",
- "upload_modal.preview_label": "پێشبینی ({ratio})",
- "upload_progress.label": "بارکردن...",
- "video.close": "داخستنی ڤیدیۆ",
- "video.download": "داگرتنی فایل",
- "video.exit_fullscreen": "دەرچوون لە پڕ شاشە",
- "video.expand": "ڤیدیۆفراوان بکە",
- "video.fullscreen": "پڕپیشانگەر",
- "video.hide": "شاردنەوەی ڤیدیۆ",
- "video.mute": "دەنگی کپ",
- "video.pause": "وەستان",
- "video.play": "پەخشکردن",
- "video.unmute": "دەنگ لابدە"
+ "compose_form.save_changes": "Guhertinan tomar bike",
+ "compose_form.sensitive.hide": "{count, plural, one {Medya wekî hestiyar nîşan bide} other {Medya wekî hestiyar nîşan bide}}",
+ "compose_form.sensitive.marked": "{count, plural, one {Medya wekî hestiyar hate nîşan} other {Medya wekî hestiyar nîşan}}",
+ "compose_form.sensitive.unmarked": "{count, plural, one {Medya wekî hestiyar nehatiye nîşan} other {Medya wekî hestiyar nehatiye nîşan}}",
+ "compose_form.spoiler.marked": "Hişyariya naverokê rake",
+ "compose_form.spoiler.unmarked": "Hişyariya naverokê tevlî bike",
+ "compose_form.spoiler_placeholder": "Li vir hişyariya xwe binivîse",
+ "confirmation_modal.cancel": "Dev jê berde",
+ "confirmations.block.block_and_report": "Asteng bike & ragihîne",
+ "confirmations.block.confirm": "Asteng bike",
+ "confirmations.block.message": "Ma tu dixwazî ku {name} asteng bikî?",
+ "confirmations.delete.confirm": "Jê bibe",
+ "confirmations.delete.message": "Ma tu dixwazî vê şandiyê jê bibî?",
+ "confirmations.delete_list.confirm": "Jê bibe",
+ "confirmations.delete_list.message": "Ma tu dixwazî bi awayekî herdemî vê rêzokê jê bibî?",
+ "confirmations.discard_edit_media.confirm": "Biavêje",
+ "confirmations.discard_edit_media.message": "Guhertinên neqedandî di danasîna an pêşdîtina medyayê de hene, wan bi her awayî bavêje?",
+ "confirmations.domain_block.confirm": "Hemî navperê asteng bike",
+ "confirmations.domain_block.message": "Tu ji xwe bawerî, bi rastî tu dixwazî hemû {domain} asteng bikî? Di gelek rewşan de asteng kirin an jî bêdeng kirin têrê dike û tê tercîh kirin. Tu nikarî naveroka vê navperê di demnameyê an jî agahdariyên xwe de bibînî. Şopînerên te yê di vê navperê were jêbirin.",
+ "confirmations.logout.confirm": "Derkeve",
+ "confirmations.logout.message": "Ma tu dixwazî ku derkevî?",
+ "confirmations.mute.confirm": "Bêdeng bike",
+ "confirmations.mute.explanation": "Ev ê şandinên ji wan tê û şandinên ku behsa wan dike veşêre, lê hê jî maf dide ku ew şandinên te bibînin û te bişopînin.",
+ "confirmations.mute.message": "Bi rastî tu dixwazî {name} bêdeng bikî?",
+ "confirmations.redraft.confirm": "Jê bibe & ji nû ve serrast bike",
+ "confirmations.redraft.message": "Bi rastî tu dixwazî şandî ye jê bibî û nûve reşnivîsek çê bikî? Bijarte û şandî wê wenda bibin û bersivên ji bo şandiyê resen wê sêwî bimînin.",
+ "confirmations.reply.confirm": "Bersivê bide",
+ "confirmations.reply.message": "Bersiva niha li ser peyama ku tu niha berhev dikî dê binivsîne. Ma pê bawer î ku tu dixwazî bidomînî?",
+ "confirmations.unfollow.confirm": "Neşopîne",
+ "confirmations.unfollow.message": "Ma tu dixwazî ku dev ji şopa {name} berdî?",
+ "conversation.delete": "Axaftinê jê bibe",
+ "conversation.mark_as_read": "Wekî xwendî nîşan bide",
+ "conversation.open": "Axaftinê nîşan bide",
+ "conversation.with": "Bi {names} re",
+ "directory.federated": "Ji fediversên naskirî",
+ "directory.local": "Tenê ji {domain}",
+ "directory.new_arrivals": "Kesên ku nû hatine",
+ "directory.recently_active": "Di demên dawî de çalak",
+ "embed.instructions": "Bi jêgirtina koda jêrîn vê şandiyê li ser malpera xwe bicîh bikin.",
+ "embed.preview": "Wa ye wê wusa xuya bike:",
+ "emoji_button.activity": "Çalakî",
+ "emoji_button.custom": "Kesanekirî",
+ "emoji_button.flags": "Nîşankirî",
+ "emoji_button.food": "Xwarin û vexwarin",
+ "emoji_button.label": "Emoji têxe",
+ "emoji_button.nature": "Sirûştî",
+ "emoji_button.not_found": "Hestokên lihevhatî nehate dîtin",
+ "emoji_button.objects": "Tişt",
+ "emoji_button.people": "Mirov",
+ "emoji_button.recent": "Pir caran tê bikaranîn",
+ "emoji_button.search": "Bigere...",
+ "emoji_button.search_results": "Encamên lêgerînê",
+ "emoji_button.symbols": "Sembol",
+ "emoji_button.travel": "Geşt û şûn",
+ "empty_column.account_suspended": "Ajimêr hatiye rawestandin",
+ "empty_column.account_timeline": "Li vir şandî tune!",
+ "empty_column.account_unavailable": "Profîl nayê peydakirin",
+ "empty_column.blocks": "Te tu bikarhêner asteng nekiriye.",
+ "empty_column.bookmarked_statuses": "Hîn tu peyamên şûnpelkirî tuneye. Gava ku hûn yek şûnpel bikin, ew ê li vir xûya bike.",
+ "empty_column.community": "Demnameya herêmî vala ye. Tiştek ji raya giştî re binivsînin da ku rûpel biherike!",
+ "empty_column.direct": "Hêj peyameke te yê rasterast tuneye. Gava ku tu yekî bişeynî an jî bigirî, ew ê li vir xûya bike.",
+ "empty_column.domain_blocks": "Hê jî navperên hatine asteng kirin tune ne.",
+ "empty_column.explore_statuses": "Tiştek niha di rojevê de tune. Paşê vegere!",
+ "empty_column.favourited_statuses": "Hîn tu peyamên te yên bijare tunene. Gava ku te yekî bijart, ew ê li vir xûya bike.",
+ "empty_column.favourites": "Hîn tu kes vê peyamê nebijartiye. Gava ku hin kes bijartin, ew ê li vir xûya bikin.",
+ "empty_column.follow_recommendations": "Wusa dixuye ku ji bo we tu pêşniyar nehatine çêkirin. Hûn dikarin lêgerînê bikarbînin da ku li kesên ku hûn nas dikin bigerin an hashtagên trendî bigerin.",
+ "empty_column.follow_requests": "Hê jî daxwaza şopandinê tunne ye. Dema daxwazek hat, yê li vir were nîşan kirin.",
+ "empty_column.hashtag": "Di vê hashtagê de hêj tiştekî tune.",
+ "empty_column.home": "Demnameya mala we vala ye! Ji bona tijîkirinê bêtir mirovan bişopînin. {suggestions}",
+ "empty_column.home.suggestions": "Hinek pêşniyaran bibîne",
+ "empty_column.list": "Di vê rêzokê de hîn tiştek tune ye. Gava ku endamên vê rêzokê peyamên nû biweşînin, ew ê li vir xuya bibin.",
+ "empty_column.lists": "Hêj qet rêzokê te tunne ye. Dema yek peyda bû, yê li vir were nîşan kirin.",
+ "empty_column.mutes": "Te tu bikarhêner bêdeng nekiriye.",
+ "empty_column.notifications": "Hêj hişyariyên te tunene. Dema ku mirovên din bi we re têkilî danîn, hûn ê wê li vir bibînin.",
+ "empty_column.public": "Li vir tiştekî tuneye! Ji raya giştî re tiştekî binivîsîne, an ji bo tijîkirinê ji rajekerên din bikarhêneran bi destan bişopînin",
+ "error.unexpected_crash.explanation": "Ji ber xeletîyeke di koda me da an jî ji ber mijara lihevhatina gerokan, ev rûpel rast nehat nîşandan.",
+ "error.unexpected_crash.explanation_addons": "Ev rûpel bi awayekî rast nehat nîşandan. Ev çewtî mimkûn e ji ber lêzêdekirina gerokan an jî amûrên wergera xweberî pêk tê.",
+ "error.unexpected_crash.next_steps": "Nûkirina rûpelê biceribîne. Heke ev bi kêr neyê, dibe ku te hîn jî bi rêya gerokeke cuda an jî sepana xwecîhê Mastodonê bi kar bîne.",
+ "error.unexpected_crash.next_steps_addons": "Ne çalak kirin û nûkirina rûpelê biceribîne. Heke ev bi kêr neyê, dibe ku te hîn jî bi rêya gerokeke cuda an jî sepana xwecîhê Mastodonê bi kar bîne.",
+ "errors.unexpected_crash.copy_stacktrace": "Şopa gemara (stacktrace) tûrikê ra jê bigire",
+ "errors.unexpected_crash.report_issue": "Pirsgirêkekê ragihîne",
+ "explore.search_results": "Encamên lêgerînê",
+ "explore.suggested_follows": "Ji bo te",
+ "explore.title": "Vekole",
+ "explore.trending_links": "Nûçe",
+ "explore.trending_statuses": "Şandî",
+ "explore.trending_tags": "Hashtag",
+ "follow_recommendations.done": "Qediya",
+ "follow_recommendations.heading": "Mirovên ku tu dixwazî ji wan peyaman bibînî bişopîne! Hin pêşnîyar li vir in.",
+ "follow_recommendations.lead": "Li gorî rêza kronolojîkî peyamên mirovên ku tu dişopînî dê demnameya te de xûya bike. Ji xeletiyan netirse, bi awayekî hêsan her wextî tu dikarî dev ji şopandinê berdî!",
+ "follow_request.authorize": "Mafê bide",
+ "follow_request.reject": "Nepejirîne",
+ "follow_requests.unlocked_explanation": "Tevlî ku ajimêra te ne kilît kiriye, karmendên {domain} digotin qey tu dixwazî ku pêşdîtina daxwazên şopandinê bi destan bike.",
+ "generic.saved": "Tomarkirî",
+ "getting_started.developers": "Pêşdebir",
+ "getting_started.directory": "Rêgeha profîlê",
+ "getting_started.documentation": "Pelbend",
+ "getting_started.heading": "Destpêkirin",
+ "getting_started.invite": "Mirovan Vexwîne",
+ "getting_started.open_source_notice": "Mastodon nermalava çavkaniya vekirî ye. Tu dikarî pirsgirêkan li ser GitHub-ê ragihînî di {github} de an jî dikarî tevkariyê bikî.",
+ "getting_started.security": "Sazkariyên ajimêr",
+ "getting_started.terms": "Mercên karûberan",
+ "hashtag.column_header.tag_mode.all": "û {additional}",
+ "hashtag.column_header.tag_mode.any": "an {additional}",
+ "hashtag.column_header.tag_mode.none": "bêyî {additional}",
+ "hashtag.column_settings.select.no_options_message": "Ti pêşniyar nehatin dîtin",
+ "hashtag.column_settings.select.placeholder": "Têkeve hashtagê…",
+ "hashtag.column_settings.tag_mode.all": "Van hemûyan",
+ "hashtag.column_settings.tag_mode.any": "Yek ji van",
+ "hashtag.column_settings.tag_mode.none": "Ne yek ji van",
+ "hashtag.column_settings.tag_toggle": "Ji bo vê stûnê hin pêvekan tevlî bike",
+ "home.column_settings.basic": "Bingehîn",
+ "home.column_settings.show_reblogs": "Bilindkirinan nîşan bike",
+ "home.column_settings.show_replies": "Bersivan nîşan bide",
+ "home.hide_announcements": "Reklaman veşêre",
+ "home.show_announcements": "Reklaman nîşan bide",
+ "intervals.full.days": "{number, plural, one {# roj} other {# roj}}",
+ "intervals.full.hours": "{number, plural, one {# demjimêr} other {# demjimêr}}\n \n",
+ "intervals.full.minutes": "{number, plural, one {# xulek} other {# xulek}}",
+ "keyboard_shortcuts.back": "Vegere paşê",
+ "keyboard_shortcuts.blocked": "Rêzoka bikarhênerên astengkirî veke",
+ "keyboard_shortcuts.boost": "Şandiyê bilind bike",
+ "keyboard_shortcuts.column": "Stûna balkişandinê",
+ "keyboard_shortcuts.compose": "Bal bikşîne cîhê nivîsê/textarea",
+ "keyboard_shortcuts.description": "Danasîn",
+ "keyboard_shortcuts.direct": "Ji stûnê peyamên rasterast veke",
+ "keyboard_shortcuts.down": "Di rêzokê de dakêşe jêr",
+ "keyboard_shortcuts.enter": "Şandiyê veke",
+ "keyboard_shortcuts.favourite": "Şandiya bijarte",
+ "keyboard_shortcuts.favourites": "Rêzokên bijarte veke",
+ "keyboard_shortcuts.federated": "Demnameyê federalîkirî veke",
+ "keyboard_shortcuts.heading": "Kurterêyên klavyeyê",
+ "keyboard_shortcuts.home": "Demnameyê veke",
+ "keyboard_shortcuts.hotkey": "Bişkoka kurterê",
+ "keyboard_shortcuts.legend": "Vê çîrokê nîşan bike",
+ "keyboard_shortcuts.local": "Demnameya herêmî veke",
+ "keyboard_shortcuts.mention": "Qala nivîskarî/ê bike",
+ "keyboard_shortcuts.muted": "Rêzoka bikarhênerên bêdeng kirî veke",
+ "keyboard_shortcuts.my_profile": "Profîla xwe veke",
+ "keyboard_shortcuts.notifications": "Stûnê agahdariyan veke",
+ "keyboard_shortcuts.open_media": "Medya veke",
+ "keyboard_shortcuts.pinned": "Şandiyên derzîkirî veke",
+ "keyboard_shortcuts.profile": "Profîla nivîskaran veke",
+ "keyboard_shortcuts.reply": "Bersivê bide şandiyê",
+ "keyboard_shortcuts.requests": "Rêzoka daxwazên şopandinê veke",
+ "keyboard_shortcuts.search": "Bal bide şivika lêgerînê",
+ "keyboard_shortcuts.spoilers": "Zeviya hişyariya naverokê nîşan bide/veşêre",
+ "keyboard_shortcuts.start": "Stûna \"destpêkê\" veke",
+ "keyboard_shortcuts.toggle_hidden": "Nivîsa paş hişyariya naverokê nîşan bide/veşêre",
+ "keyboard_shortcuts.toggle_sensitivity": "Medyayê nîşan bide/veşêre",
+ "keyboard_shortcuts.toot": "Dest bi şandiyeke nû bike",
+ "keyboard_shortcuts.unfocus": "Bal nede cîhê nivîsê /lêgerînê",
+ "keyboard_shortcuts.up": "Di rêzokê de rake jor",
+ "lightbox.close": "Bigire",
+ "lightbox.compress": "Qutîya wêneya nîşan dike bitepisîne",
+ "lightbox.expand": "Qutîya wêneya nîşan dike fireh bike",
+ "lightbox.next": "Pêş",
+ "lightbox.previous": "Paş",
+ "lists.account.add": "Tevlî rêzokê bike",
+ "lists.account.remove": "Ji rêzokê rake",
+ "lists.delete": "Rêzokê jê bibe",
+ "lists.edit": "Rêzokê serrast bike",
+ "lists.edit.submit": "Sernavê biguherîne",
+ "lists.new.create": "Rêzokê tevlî bike",
+ "lists.new.title_placeholder": "Sernavê rêzoka nû",
+ "lists.replies_policy.followed": "Bikarhênereke şopandî",
+ "lists.replies_policy.list": "Endamên rêzokê",
+ "lists.replies_policy.none": "Ne yek",
+ "lists.replies_policy.title": "Bersivan nîşan bide:",
+ "lists.search": "Di navbera kesên ku te dişopînin bigere",
+ "lists.subheading": "Rêzokên te",
+ "load_pending": "{count, plural, one {# hêmaneke nû} other {#hêmaneke nû}}",
+ "loading_indicator.label": "Tê barkirin...",
+ "media_gallery.toggle_visible": "{number, plural, one {Wêneyê veşêre} other {Wêneyan veşêre}}",
+ "missing_indicator.label": "Nehate dîtin",
+ "missing_indicator.sublabel": "Ev çavkanî nehat dîtin",
+ "mute_modal.duration": "Dem",
+ "mute_modal.hide_notifications": "Agahdariyan ji ev bikarhêner veşêre?",
+ "mute_modal.indefinite": "Nediyar",
+ "navigation_bar.apps": "Sepana mobîl",
+ "navigation_bar.blocks": "Bikarhênerên astengkirî",
+ "navigation_bar.bookmarks": "Şûnpel",
+ "navigation_bar.community_timeline": "Demnameya herêmî",
+ "navigation_bar.compose": "Şandiyeke nû binivsîne",
+ "navigation_bar.direct": "Peyamên rasterast",
+ "navigation_bar.discover": "Vekolê",
+ "navigation_bar.domain_blocks": "Navparên astengkirî",
+ "navigation_bar.edit_profile": "Profîl serrast bike",
+ "navigation_bar.explore": "Vekole",
+ "navigation_bar.favourites": "Bijarte",
+ "navigation_bar.filters": "Peyvên bêdengkirî",
+ "navigation_bar.follow_requests": "Daxwazên şopandinê",
+ "navigation_bar.follows_and_followers": "Şopandin û şopîner",
+ "navigation_bar.info": "Derbarê vî rajekarî",
+ "navigation_bar.keyboard_shortcuts": "Bişkoka kurterê",
+ "navigation_bar.lists": "Rêzok",
+ "navigation_bar.logout": "Derkeve",
+ "navigation_bar.mutes": "Bikarhênerên bêdengkirî",
+ "navigation_bar.personal": "Kesanî",
+ "navigation_bar.pins": "Şandiya derzîkirî",
+ "navigation_bar.preferences": "Sazkarî",
+ "navigation_bar.public_timeline": "Demnameyê federalîkirî",
+ "navigation_bar.security": "Ewlehî",
+ "notification.admin.sign_up": "{name} tomar bû",
+ "notification.favourite": "{name} şandiya te hez kir",
+ "notification.follow": "{name} te şopand",
+ "notification.follow_request": "{name} dixwazê te bişopîne",
+ "notification.mention": "{name} qale te kir",
+ "notification.own_poll": "Rapirsîya te qediya",
+ "notification.poll": "Rapirsiyeke ku te deng daye qediya",
+ "notification.reblog": "{name} şandiya te bilind kir",
+ "notification.status": "{name} niha şand",
+ "notification.update": "{name} şandiyek serrast kir",
+ "notifications.clear": "Agahdariyan pak bike",
+ "notifications.clear_confirmation": "Bi rastî tu dixwazî bi awayekî dawî hemû agahdariyên xwe pak bikî?",
+ "notifications.column_settings.admin.sign_up": "Tomarkirinên nû:",
+ "notifications.column_settings.alert": "Agahdariyên sermaseyê",
+ "notifications.column_settings.favourite": "Bijarte:",
+ "notifications.column_settings.filter_bar.advanced": "Hemû beşan nîşan bide",
+ "notifications.column_settings.filter_bar.category": "Şivika parzûna bilêz",
+ "notifications.column_settings.filter_bar.show_bar": "Darika parzûnê nîşan bide",
+ "notifications.column_settings.follow": "Şopînerên nû:",
+ "notifications.column_settings.follow_request": "Daxwazên şopandinê nû:",
+ "notifications.column_settings.mention": "Qalkirin:",
+ "notifications.column_settings.poll": "Encamên rapirsiyê:",
+ "notifications.column_settings.push": "Agahdarîyên yekser",
+ "notifications.column_settings.reblog": "Bilindkirî:",
+ "notifications.column_settings.show": "Di nav stûnê de nîşan bike",
+ "notifications.column_settings.sound": "Deng lêxe",
+ "notifications.column_settings.status": "Şandiyên nû:",
+ "notifications.column_settings.unread_notifications.category": "Agahdariyên nexwendî",
+ "notifications.column_settings.unread_notifications.highlight": "Agahiyên nexwendî nîşan bike",
+ "notifications.column_settings.update": "Serrastkirin:",
+ "notifications.filter.all": "Hemû",
+ "notifications.filter.boosts": "Bilindkirî",
+ "notifications.filter.favourites": "Bijarte",
+ "notifications.filter.follows": "Şopîner",
+ "notifications.filter.mentions": "Qalkirin",
+ "notifications.filter.polls": "Encamên rapirsiyê",
+ "notifications.filter.statuses": "Ji kesên tu dişopînî re rojanekirin",
+ "notifications.grant_permission": "Destûrê bide.",
+ "notifications.group": "{count} agahdarî",
+ "notifications.mark_as_read": "Hemî agahdarîya wek xwendî nîşan bike",
+ "notifications.permission_denied": "Agahdarîyên sermaseyê naxebite ji ber ku berê de daxwazî ya destûr dayîna gerokê hati bû red kirin",
+ "notifications.permission_denied_alert": "Agahdarîyên sermaseyê nay çalak kirin, ji ber ku destûr kirina gerokê pêşî de hati bû red kirin",
+ "notifications.permission_required": "Agahdarîyên sermaseyê naxebite çunkî mafê pêwîst dike nehatiye dayîn.",
+ "notifications_permission_banner.enable": "Agahdarîyên sermaseyê çalak bike",
+ "notifications_permission_banner.how_to_control": "Da ku agahdariyên mastodon bistînî gava ne vekirî be. Agahdariyên sermaseyê çalak bike\n Tu dikarî agahdariyên sermaseyê bi rê ve bibî ku bi hemû cureyên çalakiyên ên ku agahdariyan rû didin ku bi riya tikandînê li ser bişkoka {icon} çalak dibe.",
+ "notifications_permission_banner.title": "Tu tiştî bîr neke",
+ "picture_in_picture.restore": "Vegerîne paş",
+ "poll.closed": "Girtî",
+ "poll.refresh": "Nû bike",
+ "poll.total_people": "{count, plural, one {# kes} other {# kes}}",
+ "poll.total_votes": "{count, plural, one {# deng} other {# deng}}",
+ "poll.vote": "Deng bide",
+ "poll.voted": "Te dengê xwe da vê bersivê",
+ "poll.votes": "{votes, plural, one {# deng} other {# deng}}",
+ "poll_button.add_poll": "Rapirsîyek zêde bike",
+ "poll_button.remove_poll": "Rapirsî yê rake",
+ "privacy.change": "Nepênîtiya şandiyan biguherîne",
+ "privacy.direct.long": "Tenê ji bo bikarhênerên qalkirî tê dîtin",
+ "privacy.direct.short": "Taybet",
+ "privacy.private.long": "Tenê bo şopîneran xuyabar e",
+ "privacy.private.short": "Tenê şopîneran",
+ "privacy.public.long": "Ji bo herkesî li berçav e, di demnameyên gelemperî de dê xûyakirin",
+ "privacy.public.short": "Gelemperî",
+ "privacy.unlisted.long": "Ji herkesî ra tê xûya, lê demnameyê gelemperî ra nay xûyakirin",
+ "privacy.unlisted.short": "Nerêzok",
+ "refresh": "Nû bike",
+ "regeneration_indicator.label": "Tê barkirin…",
+ "regeneration_indicator.sublabel": "Mala te da tê amedekirin!",
+ "relative_time.days": "{number}r",
+ "relative_time.full.days": "{number, plural, one {# roj} other {# roj}} berê",
+ "relative_time.full.hours": "{number, plural, one {# demjimêr} other {# demjimêr}} berê",
+ "relative_time.full.just_now": "hema niha",
+ "relative_time.full.minutes": "{number, plural, one {# xulek} other {# xulek}} berê",
+ "relative_time.full.seconds": "{number, plural, one {# çirke} other {# çirke}} berê",
+ "relative_time.hours": "{number}d",
+ "relative_time.just_now": "niha",
+ "relative_time.minutes": "{number}x",
+ "relative_time.seconds": "{number}ç",
+ "relative_time.today": "îro",
+ "reply_indicator.cancel": "Dev jê berde",
+ "report.block": "Asteng bike",
+ "report.block_explanation": "Tu yê şandiyên wan nebînî. Ew ê nikaribin şandiyên te bibînin an jî te bişopînin. Ew ê bizanibin ku ew hatine astengkirin.",
+ "report.categories.other": "Yên din",
+ "report.categories.spam": "Nexwestî (Spam)",
+ "report.categories.violation": "Naverok yek an çend rêbazên rajekar binpê dike",
+ "report.category.subtitle": "Baştirîn lihevhatin hilbijêre",
+ "report.category.title": "Ji me re bêje ka çi diqewime bi vê {type} re",
+ "report.category.title_account": "profîl",
+ "report.category.title_status": "şandî",
+ "report.close": "Qediya",
+ "report.comment.title": "Tiştek din heye ku tu difikirî ku divê em zanibin?",
+ "report.forward": "Biçe bo {target}",
+ "report.forward_hint": "Ajimêr ji rajekarek din da ne. Tu kopîyeka anonîm ya raporê bişînî li wur?",
+ "report.mute": "Bêdeng bike",
+ "report.mute_explanation": "Tê yê şandiyên wan nebînî. Ew hin jî dikarin te bişopînin û şandiyên te bibînin û wê nizanibin ku ew hatine bêdengkirin.",
+ "report.next": "Pêş",
+ "report.placeholder": "Şiroveyên zêde",
+ "report.reasons.dislike": "Ez jê hez nakim",
+ "report.reasons.dislike_description": "Ew ne tiştek e ku tu dixwazî bibînî",
+ "report.reasons.other": "Tiştekî din e",
+ "report.reasons.other_description": "Pirsgirêk di kategoriyên din de cih nagire",
+ "report.reasons.spam": "Ew spam e",
+ "report.reasons.spam_description": "Girêdanên xerab, tevlêbûna sexte, an jî bersivên dubarekirî",
+ "report.reasons.violation": "Ew rêzikên rajekar binpê dike",
+ "report.reasons.violation_description": "Tu dizanî ku ew rêzikên taybetiyê binpê dike",
+ "report.rules.subtitle": "Hemûyên ku têne sepandin hibijêre",
+ "report.rules.title": "Kîjan rêzik têne binpêkirin?",
+ "report.statuses.subtitle": "Hemûyên ku têne sepandin hibijêre",
+ "report.statuses.title": "Tu şandiyên ku vê ragihandinê piştgirî dikin hene?",
+ "report.submit": "Bişîne",
+ "report.target": "Ragihandin {target}",
+ "report.thanks.take_action": "Li vir vebijêrkên te hene ji bo kontrolkirina tiştê ku tu li se Mastodon dibînî:",
+ "report.thanks.take_action_actionable": "Dema ku em vê yekê dinirxînin, tu dikarî li dijî @{name} tedbîran bigirî:",
+ "report.thanks.title": "Tu naxwazî vê bibînî?",
+ "report.thanks.title_actionable": "Spas ji bo ragihandina te, em ê binirxînin.",
+ "report.unfollow": "@{name} neşopîne",
+ "report.unfollow_explanation": "Tê vê ajimêrê dişopînî. Ji bo ku êdî şandiyên wan di rojeva xwe de nebînî, wan neşopîne.",
+ "search.placeholder": "Bigere",
+ "search_popout.search_format": "Dirûva lêgerîna pêşketî",
+ "search_popout.tips.full_text": "Nivîsên hêsan, şandiyên ku te nivîsandiye, bijare kiriye, bilind kiriye an jî yên behsa te kirine û her wiha navê bikarhêneran, navên xûya dike û hashtagan vedigerîne.",
+ "search_popout.tips.hashtag": "hashtag",
+ "search_popout.tips.status": "şandî",
+ "search_popout.tips.text": "Nivîsên hêsan, navên xûya ên ku li hev hatî, bikarhêner û hashtagan vedigerîne",
+ "search_popout.tips.user": "bikarhêner",
+ "search_results.accounts": "Mirov",
+ "search_results.all": "Hemû",
+ "search_results.hashtags": "Hashtag",
+ "search_results.nothing_found": "Ji bo van peyvên lêgerînê tiştek nehate dîtin",
+ "search_results.statuses": "Şandî",
+ "search_results.statuses_fts_disabled": "Di vê rajekara Mastodonê da lêgerîna şandîyên li gorî naveroka wan ne çalak e.",
+ "search_results.total": "{count, number} {count, plural, one {encam} other {encam}}",
+ "status.admin_account": "Ji bo @{name} navrûya venihêrtinê veke",
+ "status.admin_status": "Vê şandîyê di navrûya venihêrtinê de veke",
+ "status.block": "@{name} asteng bike",
+ "status.bookmark": "Şûnpel",
+ "status.cancel_reblog_private": "Bilind neke",
+ "status.cannot_reblog": "Ev şandî nayê bilindkirin",
+ "status.copy": "Girêdanê jê bigire bo weşankirinê",
+ "status.delete": "Jê bibe",
+ "status.detailed_status": "Dîtina axaftina berfireh",
+ "status.direct": "Peyama rasterast @{name}",
+ "status.edit": "Serrast bike",
+ "status.edited": "Di {date} de hate serrastkirin",
+ "status.edited_x_times": "{count, plural, one {{count} car} other {{count} car}} hate serrastkirin",
+ "status.embed": "Hedimandî",
+ "status.favourite": "Bijarte",
+ "status.filtered": "Parzûnkirî",
+ "status.history.created": "{name} {date} afirand",
+ "status.history.edited": "{name} {date} serrast kir",
+ "status.load_more": "Bêtir bar bike",
+ "status.media_hidden": "Medya veşartî ye",
+ "status.mention": "Qal @{name} bike",
+ "status.more": "Bêtir",
+ "status.mute": "@{name} Bêdeng bike",
+ "status.mute_conversation": "Axaftinê bêdeng bike",
+ "status.open": "Vê şandiyê berferh bike",
+ "status.pin": "Li ser profîlê derzî bike",
+ "status.pinned": "Şandiya derzîkirî",
+ "status.read_more": "Bêtir bixwîne",
+ "status.reblog": "Bilind bike",
+ "status.reblog_private": "Bi dîtina resen bilind bike",
+ "status.reblogged_by": "{name} bilind kir",
+ "status.reblogs.empty": "Kesekî hin ev şandî bilind nekiriye. Gava kesek bilind bike, ew ên li vir werin xuyakirin.",
+ "status.redraft": "Jê bibe & ji nû ve reşnivîs bike",
+ "status.remove_bookmark": "Şûnpêlê jê rake",
+ "status.reply": "Bersivê bide",
+ "status.replyAll": "Mijarê bibersivîne",
+ "status.report": "{name} gilî bike",
+ "status.sensitive_warning": "Naveroka hestiyarî",
+ "status.share": "Parve bike",
+ "status.show_less": "Kêmtir nîşan bide",
+ "status.show_less_all": "Ji bo hemîyan kêmtir nîşan bide",
+ "status.show_more": "Hêj zehftir nîşan bide",
+ "status.show_more_all": "Bêtir nîşan bide bo hemûyan",
+ "status.show_thread": "Mijarê nîşan bide",
+ "status.uncached_media_warning": "Tune ye",
+ "status.unmute_conversation": "Axaftinê bêdeng neke",
+ "status.unpin": "Şandiya derzîkirî ji profîlê rake",
+ "suggestions.dismiss": "Pêşniyarê paşguh bike",
+ "suggestions.header": "Dibe ku bala te bikşîne…",
+ "tabs_bar.federated_timeline": "Giştî",
+ "tabs_bar.home": "Serrûpel",
+ "tabs_bar.local_timeline": "Herêmî",
+ "tabs_bar.notifications": "Agahdarî",
+ "tabs_bar.search": "Bigere",
+ "time_remaining.days": "{number, plural, one {# roj} other {# roj}} maye",
+ "time_remaining.hours": "{number, plural, one {# demjimêr} other {# demjimêr}} maye",
+ "time_remaining.minutes": "{number, plural, one {# xulek} other {# xulek}} maye",
+ "time_remaining.moments": "Demên mayî",
+ "time_remaining.seconds": "{number, plural, one {# çirke} other {# çirke}} maye",
+ "timeline_hint.remote_resource_not_displayed": "{resource} Ji rajekerên din nayê dîtin.",
+ "timeline_hint.resources.followers": "Şopîner",
+ "timeline_hint.resources.follows": "Şopîner",
+ "timeline_hint.resources.statuses": "Şandiyên kevn",
+ "trends.counter_by_accounts": "{count, plural, one {{counter} kes} other {{counter} kes}} diaxivin",
+ "trends.trending_now": "Rojev",
+ "ui.beforeunload": "Ger ji Mastodonê veketi wê reşnivîsa te jî winda bibe.",
+ "units.short.billion": "{count}B",
+ "units.short.million": "{count}M",
+ "units.short.thousand": "{count}H",
+ "upload_area.title": "Ji bo barkirinê kaş bike û deyne",
+ "upload_button.label": "Wêne, vîdeoyek an jî pelê dengî tevlî bike",
+ "upload_error.limit": "Sînora barkirina pelan derbas bû.",
+ "upload_error.poll": "Di rapirsîyan de mafê barkirina pelan nayê dayîn.",
+ "upload_form.audio_description": "Ji bona kesên kêm dibihîsin re pênase bike",
+ "upload_form.description": "Ji bona astengdarên dîtinê re vebêje",
+ "upload_form.edit": "Serrast bike",
+ "upload_form.thumbnail": "Wêneyê biçûk biguherîne",
+ "upload_form.undo": "Jê bibe",
+ "upload_form.video_description": "Ji bo kesên kerr û lalan pênase bike",
+ "upload_modal.analyzing_picture": "Wêne tê analîzkirin…",
+ "upload_modal.apply": "Bisepîne",
+ "upload_modal.applying": "Tê sepandin…",
+ "upload_modal.choose_image": "Wêneyê hilbijêre",
+ "upload_modal.description_placeholder": "Rovîyek qehweyî û bilez li ser kûçikê tîral banz dide",
+ "upload_modal.detect_text": "Ji nivîsa wêneyê re serwext be",
+ "upload_modal.edit_media": "Medyayê sererast bike",
+ "upload_modal.hint": "Ji bo hilbijartina xala navendê her tim dîmenê piçûk de pêşdîtina çerxê bitikîne an jî kaş bike.",
+ "upload_modal.preparing_ocr": "OCR dihê amadekirin…",
+ "upload_modal.preview_label": "Pêşdîtin ({ratio})",
+ "upload_progress.label": "Tê barkirin...",
+ "video.close": "Vîdyoyê bigire",
+ "video.download": "Pelê daxe",
+ "video.exit_fullscreen": "Ji dîmendera tijî derkeve",
+ "video.expand": "Vîdyoyê berferh bike",
+ "video.fullscreen": "Dimendera tijî",
+ "video.hide": "Vîdyo veşêre",
+ "video.mute": "Dengê qut bike",
+ "video.pause": "Rawestîne",
+ "video.play": "Vêxe",
+ "video.unmute": "Dengê qut neke"
}
diff --git a/app/javascript/mastodon/locales/kw.json b/app/javascript/mastodon/locales/kw.json
index 14dcd9618..ca6eed5c1 100644
--- a/app/javascript/mastodon/locales/kw.json
+++ b/app/javascript/mastodon/locales/kw.json
@@ -18,12 +18,12 @@
"account.followers": "Holyoryon",
"account.followers.empty": "Ny wra nagonan holya'n devnydhyer ma hwath.",
"account.followers_counter": "{count, plural, one {{counter} Holyer} other {{counter} Holyer}}",
+ "account.following": "Following",
"account.following_counter": "{count, plural, one {Ow holya {counter}} other {Ow holya {counter}}}",
"account.follows.empty": "Ny wra'n devnydhyer ma holya nagonan hwath.",
"account.follows_you": "Y'th hol",
"account.hide_reblogs": "Kudha kenerthow a @{name}",
"account.joined": "Joined {date}",
- "account.last_status": "Bew diwettha",
"account.link_verified_on": "Perghenogeth an kolm ma a veu checkys dhe {date}",
"account.locked_info": "Studh privetter an akont ma yw alhwedhys. An perghen a wra dasweles dre leuv piw a yll aga holya.",
"account.media": "Myski",
@@ -32,7 +32,6 @@
"account.mute": "Tawhe @{name}",
"account.mute_notifications": "Tawhe gwarnyansow a @{name}",
"account.muted": "Tawhes",
- "account.never_active": "Nevra",
"account.posts": "Postow",
"account.posts_with_replies": "Postow ha gorthebow",
"account.report": "Reportya @{name}",
@@ -42,12 +41,15 @@
"account.statuses_counter": "{count, plural, one {{counter} Tout} other {{counter} Tout}}",
"account.unblock": "Anlettya @{name}",
"account.unblock_domain": "Anlettya gorfarth {domain}",
+ "account.unblock_short": "Unblock",
"account.unendorse": "Na wra diskwedhes yn profil",
"account.unfollow": "Anholya",
"account.unmute": "Antawhe @{name}",
"account.unmute_notifications": "Antawhe gwarnyansow a @{name}",
+ "account.unmute_short": "Unmute",
"account_note.placeholder": "Klyckya dhe geworra noten",
- "admin.dashboard.retention": "Retention",
+ "admin.dashboard.daily_retention": "User retention rate by day after sign-up",
+ "admin.dashboard.monthly_retention": "User retention rate by month after sign-up",
"admin.dashboard.retention.average": "Average",
"admin.dashboard.retention.cohort": "Sign-up month",
"admin.dashboard.retention.cohort_size": "New users",
@@ -104,6 +106,7 @@
"compose_form.poll.switch_to_single": "Chanjya sondyans dhe asa unn dewis hepken",
"compose_form.publish": "Tout",
"compose_form.publish_loud": "{publish}!",
+ "compose_form.save_changes": "Save changes",
"compose_form.sensitive.hide": "{count, plural, one {Merkya myski vel tender} other {Merkya myski vel tender}}",
"compose_form.sensitive.marked": "{count, plural, one {Myski merkys vel tender} other {Myski merkys vel tender}}",
"compose_form.sensitive.unmarked": "{count, plural, one {Nyns yw myski merkys vel tender} other {Nyns yw myski merkys vel tender}}",
@@ -165,6 +168,7 @@
"empty_column.community": "An amserlin leel yw gwag. Skrifewgh neppytn yn poblek dh'y lonchya!",
"empty_column.direct": "Nyns eus dhywgh messajys didro hwath. Pan wrewgh dannvon po degemeres onan, ev a wra omdhiskwedhes omma.",
"empty_column.domain_blocks": "Nyns eus gorfarthow lettys hwath.",
+ "empty_column.explore_statuses": "Nothing is trending right now. Check back later!",
"empty_column.favourited_statuses": "Nyns eus dhywgh postow drudh hwath. Pan wrewgh merkya onan vel drudh, ev a wra omdhiskwedhes omma.",
"empty_column.favourites": "Ny wrug nagonan merkya'n post ma vel drudh hwath. Pan wra, hynn a wra omdhiskwedhes omma.",
"empty_column.follow_recommendations": "Looks like no suggestions could be generated for you. You can try using search to look for people you might know or explore trending hashtags.",
@@ -183,6 +187,12 @@
"error.unexpected_crash.next_steps_addons": "Assayewgh aga disweythresa ha daskarga'n folen. Mar ny'gas gweres, martesen hwi a yll hwath usya Mastodon dre beurell aral po app teythyek.",
"errors.unexpected_crash.copy_stacktrace": "Dasskrifa daslergh dhe'n astel glypp",
"errors.unexpected_crash.report_issue": "Reportya kudyn",
+ "explore.search_results": "Search results",
+ "explore.suggested_follows": "For you",
+ "explore.title": "Explore",
+ "explore.trending_links": "News",
+ "explore.trending_statuses": "Posts",
+ "explore.trending_tags": "Hashtags",
"follow_recommendations.done": "Gwrys",
"follow_recommendations.heading": "Holyewgh tus a vynnowgh gweles postow anedha! Ottomma nebes profyansow.",
"follow_recommendations.lead": "Postow a dus a holyewgh a wra omdhiskwedhes omma yn aray termynel yn agas lin dre. Na borthewgh own a gammwul, hwi a yll p'eurpynag anholya tus mar es poran!",
@@ -284,6 +294,7 @@
"navigation_bar.discover": "Diskudha",
"navigation_bar.domain_blocks": "Gorfarthow lettys",
"navigation_bar.edit_profile": "Golegi profil",
+ "navigation_bar.explore": "Explore",
"navigation_bar.favourites": "Re drudh",
"navigation_bar.filters": "Geryow tawhes",
"navigation_bar.follow_requests": "Govynnow holya",
@@ -298,6 +309,7 @@
"navigation_bar.preferences": "Erviransow",
"navigation_bar.public_timeline": "Amserlin geffrysys",
"navigation_bar.security": "Diogeledh",
+ "notification.admin.sign_up": "{name} signed up",
"notification.favourite": "{name} a wrug merkya agas post vel drudh",
"notification.follow": "{name} a wrug agas holya",
"notification.follow_request": "{name} a bysis agas holya",
@@ -306,13 +318,15 @@
"notification.poll": "An sondyans may hwrussowgh ragleva a worfennas",
"notification.reblog": "{name} a generthas agas post",
"notification.status": "{name} a wrug nowydh postya",
+ "notification.update": "{name} edited a post",
"notifications.clear": "Dilea gwarnyansow",
"notifications.clear_confirmation": "Owgh hwi sur a vynnes dilea agas gwarnyansow oll yn fast?",
+ "notifications.column_settings.admin.sign_up": "New sign-ups:",
"notifications.column_settings.alert": "Gwarnyansow pennskrin",
"notifications.column_settings.favourite": "Re drudh:",
"notifications.column_settings.filter_bar.advanced": "Displetya rummow oll",
"notifications.column_settings.filter_bar.category": "Barr sidhla skav",
- "notifications.column_settings.filter_bar.show": "Diskwedhes",
+ "notifications.column_settings.filter_bar.show_bar": "Show filter bar",
"notifications.column_settings.follow": "Holyoryon nowydh:",
"notifications.column_settings.follow_request": "Govynnow holya nowydh:",
"notifications.column_settings.mention": "Menegow:",
@@ -322,7 +336,9 @@
"notifications.column_settings.show": "Diskwedhes yn koloven",
"notifications.column_settings.sound": "Seni son",
"notifications.column_settings.status": "Postow nowydh:",
- "notifications.column_settings.unread_markers.category": "Merkys gwarnyansow anredys",
+ "notifications.column_settings.unread_notifications.category": "Unread notifications",
+ "notifications.column_settings.unread_notifications.highlight": "Highlight unread notifications",
+ "notifications.column_settings.update": "Edits:",
"notifications.filter.all": "Oll",
"notifications.filter.boosts": "Kenerthow",
"notifications.filter.favourites": "Re drudh",
@@ -362,18 +378,54 @@
"regeneration_indicator.label": "Ow karga…",
"regeneration_indicator.sublabel": "Yma agas lin dre ow pos pareusys!",
"relative_time.days": "{number}d",
+ "relative_time.full.days": "{number, plural, one {# day} other {# days}} ago",
+ "relative_time.full.hours": "{number, plural, one {# hour} other {# hours}} ago",
+ "relative_time.full.just_now": "just now",
+ "relative_time.full.minutes": "{number, plural, one {# minute} other {# minutes}} ago",
+ "relative_time.full.seconds": "{number, plural, one {# second} other {# seconds}} ago",
"relative_time.hours": "{number}o",
"relative_time.just_now": "lemmyn",
"relative_time.minutes": "{number}m",
"relative_time.seconds": "{number}e",
"relative_time.today": "hedhyw",
"reply_indicator.cancel": "Hedhi",
+ "report.block": "Block",
+ "report.block_explanation": "You will not see their posts. They will not be able to see your posts or follow you. They will be able to tell that they are blocked.",
+ "report.categories.other": "Other",
+ "report.categories.spam": "Spam",
+ "report.categories.violation": "Content violates one or more server rules",
+ "report.category.subtitle": "Choose the best match",
+ "report.category.title": "Tell us what's going on with this {type}",
+ "report.category.title_account": "profile",
+ "report.category.title_status": "post",
+ "report.close": "Done",
+ "report.comment.title": "Is there anything else you think we should know?",
"report.forward": "Dasvovya dhe {target}",
"report.forward_hint": "Yma'n akont ma a leuren aral. Dannvon dasskrif dihanow an derivas ena ynwedh?",
- "report.hint": "An derivas a vydh danvenys dhe goswydhyon agas leuren. Hwi a yll profya displegyans a prag ytho owgh hwi ow reportya'n akont ma a-wòles:",
+ "report.mute": "Mute",
+ "report.mute_explanation": "You will not see their posts. They can still follow you and see your posts and will not know that they are muted.",
+ "report.next": "Next",
"report.placeholder": "Kampòllow ynwedhek",
+ "report.reasons.dislike": "I don't like it",
+ "report.reasons.dislike_description": "It is not something you want to see",
+ "report.reasons.other": "It's something else",
+ "report.reasons.other_description": "The issue does not fit into other categories",
+ "report.reasons.spam": "It's spam",
+ "report.reasons.spam_description": "Malicious links, fake engagement, or repetitive replies",
+ "report.reasons.violation": "It violates server rules",
+ "report.reasons.violation_description": "You are aware that it breaks specific rules",
+ "report.rules.subtitle": "Select all that apply",
+ "report.rules.title": "Which rules are being violated?",
+ "report.statuses.subtitle": "Select all that apply",
+ "report.statuses.title": "Are there any posts that back up this report?",
"report.submit": "Dannvon",
"report.target": "Ow reportya {target}",
+ "report.thanks.take_action": "Here are your options for controlling what you see on Mastodon:",
+ "report.thanks.take_action_actionable": "While we review this, you can take action against @{name}:",
+ "report.thanks.title": "Don't want to see this?",
+ "report.thanks.title_actionable": "Thanks for reporting, we'll look into this.",
+ "report.unfollow": "Unfollow @{name}",
+ "report.unfollow_explanation": "You are following this account. To not see their posts in your home feed anymore, unfollow them.",
"search.placeholder": "Hwilas",
"search_popout.search_format": "Furvas hwilas avonsys",
"search_popout.tips.full_text": "Tekst sempel a wra daskor postow a wrussowgh aga skrifa, merkya vel drudh, po bos menegys ynna, keffrys ha henwyn devnydhyoryon ha displetyans, ha bòlnosow a dhesedh.",
@@ -382,7 +434,9 @@
"search_popout.tips.text": "Tekst sempel a wra daskor henwyn displegya ha devnydhyoryon, ha bòlnosow",
"search_popout.tips.user": "devnydhyer",
"search_results.accounts": "Tus",
+ "search_results.all": "All",
"search_results.hashtags": "Bòlnosow",
+ "search_results.nothing_found": "Could not find anything for these search terms",
"search_results.statuses": "Postow",
"search_results.statuses_fts_disabled": "Nyns yw hwilas postow der aga dalgh gweythresys y'n leuren Mastodon ma.",
"search_results.total": "{count, number} {count, plural, one {sewyans} other {sewyans}}",
@@ -396,9 +450,14 @@
"status.delete": "Dilea",
"status.detailed_status": "Gwel kesklapp a-vanyl",
"status.direct": "Messach didro dhe @{name}",
+ "status.edit": "Edit",
+ "status.edited": "Edited {date}",
+ "status.edited_x_times": "Edited {count, plural, one {{count} time} other {{count} times}}",
"status.embed": "Staga",
"status.favourite": "Merkya vel drudh",
"status.filtered": "Sidhlys",
+ "status.history.created": "{name} created {date}",
+ "status.history.edited": "{name} edited {date}",
"status.load_more": "Karga moy",
"status.media_hidden": "Myski kudhys",
"status.mention": "Meneges @{name}",
diff --git a/app/javascript/mastodon/locales/locale-data/sa.js b/app/javascript/mastodon/locales/locale-data/sa.js
new file mode 100644
index 000000000..946dfde0f
--- /dev/null
+++ b/app/javascript/mastodon/locales/locale-data/sa.js
@@ -0,0 +1,97 @@
+/*eslint eqeqeq: "off"*/
+/*eslint no-nested-ternary: "off"*/
+/*eslint quotes: "off"*/
+/*eslint comma-dangle: "off"*/
+/*eslint semi: "off"*/
+
+export default [
+ {
+ locale: "sa",
+ fields: {
+ year: {
+ displayName: "year",
+ relative: {
+ 0: "this year",
+ 1: "next year",
+ "-1": "last year"
+ },
+ relativeTime: {
+ future: {
+ other: "+{0} y"
+ },
+ past: {
+ other: "-{0} y"
+ }
+ }
+ },
+ month: {
+ displayName: "month",
+ relative: {
+ 0: "this month",
+ 1: "next month",
+ "-1": "last month"
+ },
+ relativeTime: {
+ future: {
+ other: "+{0} m"
+ },
+ past: {
+ other: "-{0} m"
+ }
+ }
+ },
+ day: {
+ displayName: "day",
+ relative: {
+ 0: "अद्य",
+ 1: "श्वः",
+ "-1": "गतदिनम्"
+ },
+ relativeTime: {
+ future: {
+ other: "+{0} d"
+ },
+ past: {
+ other: "-{0} d"
+ }
+ }
+ },
+ hour: {
+ displayName: "hour",
+ relativeTime: {
+ future: {
+ other: "+{0} h"
+ },
+ past: {
+ other: "-{0} h"
+ }
+ }
+ },
+ minute: {
+ displayName: "minute",
+ relativeTime: {
+ future: {
+ other: "+{0} min"
+ },
+ past: {
+ other: "-{0} min"
+ }
+ }
+ },
+ second: {
+ displayName: "second",
+ relative: {
+ 0: "now"
+ },
+ relativeTime: {
+ future: {
+ other: "+{0} s"
+ },
+ past: {
+ other: "-{0} s"
+ }
+ }
+ }
+ }
+ }
+]
diff --git a/app/javascript/mastodon/locales/lt.json b/app/javascript/mastodon/locales/lt.json
index 0c1a46de3..bb432a8af 100644
--- a/app/javascript/mastodon/locales/lt.json
+++ b/app/javascript/mastodon/locales/lt.json
@@ -18,12 +18,12 @@
"account.followers": "Followers",
"account.followers.empty": "No one follows this user yet.",
"account.followers_counter": "{count, plural, one {{counter} Follower} other {{counter} Followers}}",
+ "account.following": "Following",
"account.following_counter": "{count, plural, one {{counter} Following} other {{counter} Following}}",
"account.follows.empty": "This user doesn't follow anyone yet.",
"account.follows_you": "Follows you",
"account.hide_reblogs": "Hide boosts from @{name}",
"account.joined": "Joined {date}",
- "account.last_status": "Last active",
"account.link_verified_on": "Ownership of this link was checked on {date}",
"account.locked_info": "This account privacy status is set to locked. The owner manually reviews who can follow them.",
"account.media": "Media",
@@ -32,7 +32,6 @@
"account.mute": "Mute @{name}",
"account.mute_notifications": "Mute notifications from @{name}",
"account.muted": "Užtildytas",
- "account.never_active": "Niekada",
"account.posts": "Toots",
"account.posts_with_replies": "Toots and replies",
"account.report": "Report @{name}",
@@ -42,12 +41,15 @@
"account.statuses_counter": "{count, plural, one {{counter} Toot} other {{counter} Toots}}",
"account.unblock": "Unblock @{name}",
"account.unblock_domain": "Unhide {domain}",
+ "account.unblock_short": "Unblock",
"account.unendorse": "Don't feature on profile",
"account.unfollow": "Nebesekti",
"account.unmute": "Unmute @{name}",
"account.unmute_notifications": "Unmute notifications from @{name}",
+ "account.unmute_short": "Unmute",
"account_note.placeholder": "Click to add a note",
- "admin.dashboard.retention": "Retention",
+ "admin.dashboard.daily_retention": "User retention rate by day after sign-up",
+ "admin.dashboard.monthly_retention": "User retention rate by month after sign-up",
"admin.dashboard.retention.average": "Average",
"admin.dashboard.retention.cohort": "Sign-up month",
"admin.dashboard.retention.cohort_size": "New users",
@@ -104,6 +106,7 @@
"compose_form.poll.switch_to_single": "Change poll to allow for a single choice",
"compose_form.publish": "Toot",
"compose_form.publish_loud": "{publish}!",
+ "compose_form.save_changes": "Save changes",
"compose_form.sensitive.hide": "{count, plural, one {Mark media as sensitive} other {Mark media as sensitive}}",
"compose_form.sensitive.marked": "{count, plural, one {Media is marked as sensitive} other {Media is marked as sensitive}}",
"compose_form.sensitive.unmarked": "{count, plural, one {Media is not marked as sensitive} other {Media is not marked as sensitive}}",
@@ -165,6 +168,7 @@
"empty_column.community": "The local timeline is empty. Write something publicly to get the ball rolling!",
"empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.",
"empty_column.domain_blocks": "There are no hidden domains yet.",
+ "empty_column.explore_statuses": "Nothing is trending right now. Check back later!",
"empty_column.favourited_statuses": "You don't have any favourite toots yet. When you favourite one, it will show up here.",
"empty_column.favourites": "No one has favourited this toot yet. When someone does, they will show up here.",
"empty_column.follow_recommendations": "Looks like no suggestions could be generated for you. You can try using search to look for people you might know or explore trending hashtags.",
@@ -183,6 +187,12 @@
"error.unexpected_crash.next_steps_addons": "Try disabling them and refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
"errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard",
"errors.unexpected_crash.report_issue": "Report issue",
+ "explore.search_results": "Search results",
+ "explore.suggested_follows": "For you",
+ "explore.title": "Explore",
+ "explore.trending_links": "News",
+ "explore.trending_statuses": "Posts",
+ "explore.trending_tags": "Hashtags",
"follow_recommendations.done": "Done",
"follow_recommendations.heading": "Follow people you'd like to see posts from! Here are some suggestions.",
"follow_recommendations.lead": "Posts from people you follow will show up in chronological order on your home feed. Don't be afraid to make mistakes, you can unfollow people just as easily any time!",
@@ -284,6 +294,7 @@
"navigation_bar.discover": "Discover",
"navigation_bar.domain_blocks": "Hidden domains",
"navigation_bar.edit_profile": "Edit profile",
+ "navigation_bar.explore": "Explore",
"navigation_bar.favourites": "Favourites",
"navigation_bar.filters": "Muted words",
"navigation_bar.follow_requests": "Follow requests",
@@ -298,6 +309,7 @@
"navigation_bar.preferences": "Preferences",
"navigation_bar.public_timeline": "Federated timeline",
"navigation_bar.security": "Security",
+ "notification.admin.sign_up": "{name} signed up",
"notification.favourite": "{name} favourited your status",
"notification.follow": "{name} followed you",
"notification.follow_request": "{name} has requested to follow you",
@@ -306,13 +318,15 @@
"notification.poll": "A poll you have voted in has ended",
"notification.reblog": "{name} boosted your status",
"notification.status": "{name} just posted",
+ "notification.update": "{name} edited a post",
"notifications.clear": "Clear notifications",
"notifications.clear_confirmation": "Are you sure you want to permanently clear all your notifications?",
+ "notifications.column_settings.admin.sign_up": "New sign-ups:",
"notifications.column_settings.alert": "Desktop notifications",
"notifications.column_settings.favourite": "Favourites:",
"notifications.column_settings.filter_bar.advanced": "Display all categories",
"notifications.column_settings.filter_bar.category": "Quick filter bar",
- "notifications.column_settings.filter_bar.show": "Show",
+ "notifications.column_settings.filter_bar.show_bar": "Show filter bar",
"notifications.column_settings.follow": "New followers:",
"notifications.column_settings.follow_request": "New follow requests:",
"notifications.column_settings.mention": "Mentions:",
@@ -322,7 +336,9 @@
"notifications.column_settings.show": "Show in column",
"notifications.column_settings.sound": "Play sound",
"notifications.column_settings.status": "New toots:",
- "notifications.column_settings.unread_markers.category": "Unread notification markers",
+ "notifications.column_settings.unread_notifications.category": "Unread notifications",
+ "notifications.column_settings.unread_notifications.highlight": "Highlight unread notifications",
+ "notifications.column_settings.update": "Edits:",
"notifications.filter.all": "All",
"notifications.filter.boosts": "Boosts",
"notifications.filter.favourites": "Favourites",
@@ -362,18 +378,54 @@
"regeneration_indicator.label": "Loading…",
"regeneration_indicator.sublabel": "Your home feed is being prepared!",
"relative_time.days": "{number}d",
+ "relative_time.full.days": "{number, plural, one {# day} other {# days}} ago",
+ "relative_time.full.hours": "{number, plural, one {# hour} other {# hours}} ago",
+ "relative_time.full.just_now": "just now",
+ "relative_time.full.minutes": "{number, plural, one {# minute} other {# minutes}} ago",
+ "relative_time.full.seconds": "{number, plural, one {# second} other {# seconds}} ago",
"relative_time.hours": "{number}h",
"relative_time.just_now": "now",
"relative_time.minutes": "{number}m",
"relative_time.seconds": "{number}s",
"relative_time.today": "today",
"reply_indicator.cancel": "Cancel",
+ "report.block": "Block",
+ "report.block_explanation": "You will not see their posts. They will not be able to see your posts or follow you. They will be able to tell that they are blocked.",
+ "report.categories.other": "Other",
+ "report.categories.spam": "Spam",
+ "report.categories.violation": "Content violates one or more server rules",
+ "report.category.subtitle": "Choose the best match",
+ "report.category.title": "Tell us what's going on with this {type}",
+ "report.category.title_account": "profile",
+ "report.category.title_status": "post",
+ "report.close": "Done",
+ "report.comment.title": "Is there anything else you think we should know?",
"report.forward": "Forward to {target}",
"report.forward_hint": "The account is from another server. Send an anonymized copy of the report there as well?",
- "report.hint": "The report will be sent to your server moderators. You can provide an explanation of why you are reporting this account below:",
- "report.placeholder": "Additional comments",
- "report.submit": "Submit",
+ "report.mute": "Mute",
+ "report.mute_explanation": "You will not see their posts. They can still follow you and see your posts and will not know that they are muted.",
+ "report.next": "Next",
+ "report.placeholder": "Type or paste additional comments",
+ "report.reasons.dislike": "I don't like it",
+ "report.reasons.dislike_description": "It is not something you want to see",
+ "report.reasons.other": "It's something else",
+ "report.reasons.other_description": "The issue does not fit into other categories",
+ "report.reasons.spam": "It's spam",
+ "report.reasons.spam_description": "Malicious links, fake engagement, or repetitive replies",
+ "report.reasons.violation": "It violates server rules",
+ "report.reasons.violation_description": "You are aware that it breaks specific rules",
+ "report.rules.subtitle": "Select all that apply",
+ "report.rules.title": "Which rules are being violated?",
+ "report.statuses.subtitle": "Select all that apply",
+ "report.statuses.title": "Are there any posts that back up this report?",
+ "report.submit": "Submit report",
"report.target": "Report {target}",
+ "report.thanks.take_action": "Here are your options for controlling what you see on Mastodon:",
+ "report.thanks.take_action_actionable": "While we review this, you can take action against @{name}:",
+ "report.thanks.title": "Don't want to see this?",
+ "report.thanks.title_actionable": "Thanks for reporting, we'll look into this.",
+ "report.unfollow": "Unfollow @{name}",
+ "report.unfollow_explanation": "You are following this account. To not see their posts in your home feed anymore, unfollow them.",
"search.placeholder": "Search",
"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.",
@@ -382,7 +434,9 @@
"search_popout.tips.text": "Simple text returns matching display names, usernames and hashtags",
"search_popout.tips.user": "user",
"search_results.accounts": "People",
+ "search_results.all": "All",
"search_results.hashtags": "Hashtags",
+ "search_results.nothing_found": "Could not find anything for these search terms",
"search_results.statuses": "Toots",
"search_results.statuses_fts_disabled": "Searching toots by their content is not enabled on this Mastodon server.",
"search_results.total": "{count, number} {count, plural, one {result} other {results}}",
@@ -396,9 +450,14 @@
"status.delete": "Delete",
"status.detailed_status": "Detailed conversation view",
"status.direct": "Direct message @{name}",
+ "status.edit": "Edit",
+ "status.edited": "Edited {date}",
+ "status.edited_x_times": "Edited {count, plural, one {{count} time} other {{count} times}}",
"status.embed": "Embed",
"status.favourite": "Favourite",
"status.filtered": "Filtered",
+ "status.history.created": "{name} created {date}",
+ "status.history.edited": "{name} edited {date}",
"status.load_more": "Load more",
"status.media_hidden": "Media hidden",
"status.mention": "Mention @{name}",
diff --git a/app/javascript/mastodon/locales/lv.json b/app/javascript/mastodon/locales/lv.json
index 4d65daa83..f16df5423 100644
--- a/app/javascript/mastodon/locales/lv.json
+++ b/app/javascript/mastodon/locales/lv.json
@@ -18,12 +18,12 @@
"account.followers": "Sekotāji",
"account.followers.empty": "Šim lietotājam patreiz nav sekotāju.",
"account.followers_counter": "{count, plural, one {{counter} Sekotājs} other {{counter} Sekotāji}}",
+ "account.following": "Seko",
"account.following_counter": "{count, plural, one {{counter} Sekojošs} other {{counter} Sekojoši}}",
"account.follows.empty": "Šis lietotājs pagaidām nevienam neseko.",
"account.follows_you": "Seko tev",
"account.hide_reblogs": "Paslēpt paceltos ierakstus no lietotāja @{name}",
"account.joined": "Pievienojās {date}",
- "account.last_status": "Pēdējā aktivitāte",
"account.link_verified_on": "Šīs saites piederība ir pārbaudīta {date}",
"account.locked_info": "Šī konta privātuma statuss ir slēgts. Īpašnieks izskatīs, kurš viņam drīkst sekot.",
"account.media": "Mediji",
@@ -32,7 +32,6 @@
"account.mute": "Apklusināt @{name}",
"account.mute_notifications": "Nerādīt paziņojumus no @{name}",
"account.muted": "Apklusināts",
- "account.never_active": "Nekad",
"account.posts": "Ziņas",
"account.posts_with_replies": "Ziņas un atbildes",
"account.report": "Ziņot par lietotāju @{name}",
@@ -42,21 +41,24 @@
"account.statuses_counter": "{count, plural, one {{counter} ziņa} other {{counter} ziņas}}",
"account.unblock": "Atbloķēt lietotāju @{name}",
"account.unblock_domain": "Atbloķēt domēnu {domain}",
+ "account.unblock_short": "Atbloķēt",
"account.unendorse": "Neattēlot profilā",
"account.unfollow": "Pārstāt sekot",
"account.unmute": "Noņemt apklusinājumu @{name}",
"account.unmute_notifications": "Rādīt paziņojumus no lietotāja @{name}",
+ "account.unmute_short": "Ieslēgt skaņu",
"account_note.placeholder": "Noklikšķiniet, lai pievienotu piezīmi",
- "admin.dashboard.retention": "Retention",
- "admin.dashboard.retention.average": "Average",
- "admin.dashboard.retention.cohort": "Sign-up month",
- "admin.dashboard.retention.cohort_size": "New users",
+ "admin.dashboard.daily_retention": "Lietotāju saglabāšanas rādītājs dienā pēc reģistrēšanās",
+ "admin.dashboard.monthly_retention": "Lietotāju saglabāšanas rādītājs mēnesī pēc reģistrēšanās",
+ "admin.dashboard.retention.average": "Vidēji",
+ "admin.dashboard.retention.cohort": "Reģistrēšanās mēnesis",
+ "admin.dashboard.retention.cohort_size": "Jauni lietotāji",
"alert.rate_limited.message": "Lūdzu, mēģini vēlreiz pāc {retry_time, time, medium}.",
"alert.rate_limited.title": "Biežums ierobežots",
- "alert.unexpected.message": "Negaidīta kļūda.",
+ "alert.unexpected.message": "Radās negaidīta kļūda.",
"alert.unexpected.title": "Ups!",
"announcement.announcement": "Paziņojums",
- "attachments_list.unprocessed": "(unprocessed)",
+ "attachments_list.unprocessed": "(neapstrādāti)",
"autosuggest_hashtag.per_week": "{count} nedēļā",
"boost_modal.combo": "Nospied {combo} lai izlaistu šo nākamreiz",
"bundle_column_error.body": "Kaut kas nogāja greizi ielādējot šo komponenti.",
@@ -104,6 +106,7 @@
"compose_form.poll.switch_to_single": "Maini aptaujas veidu, lai atļautu vienu izvēli",
"compose_form.publish": "Taurēt",
"compose_form.publish_loud": "{publish}!",
+ "compose_form.save_changes": "Saglabāt izmaiņas",
"compose_form.sensitive.hide": "{count, plural, one {Atzīmēt mediju kā sensitīvu} other {Atzīmēt medijus kā sensitīvus}}",
"compose_form.sensitive.marked": "{count, plural, one {Medijs ir atzīmēts kā sensitīvs} other {Mediji ir atzīmēti kā sensitīvi}}",
"compose_form.sensitive.unmarked": "{count, plural, one {Medijs nav atzīmēts kā sensitīvs} other {Mediji nav atzīmēti kā sensitīvi}}",
@@ -118,8 +121,8 @@
"confirmations.delete.message": "Vai tiešām vēlaties dzēst šo ziņu?",
"confirmations.delete_list.confirm": "Dzēst",
"confirmations.delete_list.message": "Vai tiešam vēlies neatgriezeniski dzēst šo sarakstu?",
- "confirmations.discard_edit_media.confirm": "Discard",
- "confirmations.discard_edit_media.message": "You have unsaved changes to the media description or preview, discard them anyway?",
+ "confirmations.discard_edit_media.confirm": "Izmest",
+ "confirmations.discard_edit_media.message": "Vai tev ir nesaglabātas izmaiņas mediju aprakstā vai priekšskatījumā, vai tomēr atmest tās?",
"confirmations.domain_block.confirm": "Bloķēt visu domēnu",
"confirmations.domain_block.message": "Vai tu tiešām, tiešam vēlies bloķēt visu domēnu {domain}? Lielākajā daļā gadījumu pietiek ja nobloķē vai apklusini kādu. Tu neredzēsi saturu vai paziņojumus no šī domēna nevienā laika līnijā. Tavi sekotāji no šī domēna tiks noņemti.",
"confirmations.logout.confirm": "Iziet",
@@ -165,6 +168,7 @@
"empty_column.community": "Vietējā ziņu lenta ir tukša. Uzraksti kaut ko publiski, lai viss notiktu!",
"empty_column.direct": "Patrez tev nav privātu ziņu. Tiklīdz tādu nosūtīsi vai saņemsi, tās parādīsies šeit.",
"empty_column.domain_blocks": "Vēl nav neviena bloķēta domēna.",
+ "empty_column.explore_statuses": "Pašlaik nekas nav tendēts. Pārbaudiet vēlāk!",
"empty_column.favourited_statuses": "Patreiz tev nav neviena izceltā ieraksta. Kad kādu izcelsi, tas parādīsies šeit.",
"empty_column.favourites": "Neviens šo ziņojumu vel nav izcēlis. Kad būs, tie parādīsies šeit.",
"empty_column.follow_recommendations": "Šķiet, ka tev nevarēja ģenerēt ieteikumus. Vari mēģināt izmantot meklēšanu, lai meklētu cilvēkus, kurus tu varētu pazīt, vai izpētīt populārākās atsauces.",
@@ -183,6 +187,12 @@
"error.unexpected_crash.next_steps_addons": "Mēģini tos atspējot un atsvaidzināt lapu. Ja tas nepalīdz, iespējams, varēsi lietot Mastodon, izmantojot citu pārlūkprogrammu vai vietējo lietotni.",
"errors.unexpected_crash.copy_stacktrace": "Iekopēt starpliktuvē",
"errors.unexpected_crash.report_issue": "Ziņot par problēmu",
+ "explore.search_results": "Meklēšanas rezultāti",
+ "explore.suggested_follows": "Tev",
+ "explore.title": "Pārlūkot",
+ "explore.trending_links": "Jaunumi",
+ "explore.trending_statuses": "Ziņas",
+ "explore.trending_tags": "Tēmturi",
"follow_recommendations.done": "Izpildīts",
"follow_recommendations.heading": "Seko cilvēkiem, no kuriem vēlies redzēt ziņas! Šeit ir daži ieteikumi.",
"follow_recommendations.lead": "Ziņas no cilvēkiem, kuriem seko, mājas plūsmā tiks parādītas hronoloģiskā secībā. Nebaidies kļūdīties, tu tikpat viegli vari pārtraukt sekot cilvēkiem jebkurā laikā!",
@@ -202,7 +212,7 @@
"hashtag.column_header.tag_mode.any": "vai {additional}",
"hashtag.column_header.tag_mode.none": "bez {additional}",
"hashtag.column_settings.select.no_options_message": "Ieteikumi netika atrasti",
- "hashtag.column_settings.select.placeholder": "Ievadīt mirkļbirkas…",
+ "hashtag.column_settings.select.placeholder": "Ievadīt tēmturus…",
"hashtag.column_settings.tag_mode.all": "Visi no šiem",
"hashtag.column_settings.tag_mode.any": "Kāds no šiem",
"hashtag.column_settings.tag_mode.none": "Neviens no šiem",
@@ -284,6 +294,7 @@
"navigation_bar.discover": "Atklāt",
"navigation_bar.domain_blocks": "Bloķētie domēni",
"navigation_bar.edit_profile": "Rediģēt profilu",
+ "navigation_bar.explore": "Pārlūkot",
"navigation_bar.favourites": "Izlases",
"navigation_bar.filters": "Klusināti vārdi",
"navigation_bar.follow_requests": "Sekošanas pieprasījumi",
@@ -298,6 +309,7 @@
"navigation_bar.preferences": "Iestatījumi",
"navigation_bar.public_timeline": "Apvienotā ziņu lenta",
"navigation_bar.security": "Drošība",
+ "notification.admin.sign_up": "{name} ir pierakstījies",
"notification.favourite": "{name} izcēla tavu ziņu",
"notification.follow": "{name} uzsāka tev sekot",
"notification.follow_request": "{name} vēlas tev sekot",
@@ -306,13 +318,15 @@
"notification.poll": "Aprauja, kurā tu piedalījies, ir pabeigta",
"notification.reblog": "{name} paaugstināja tavu ziņu",
"notification.status": "{name} tikko publicēja",
+ "notification.update": "{name} ir rediģējis rakstu",
"notifications.clear": "Notīrīt paziņojumus",
"notifications.clear_confirmation": "Vai tiešām vēlies neatgriezeniski notīrīt visus savus paziņojumus?",
+ "notifications.column_settings.admin.sign_up": "Jaunas pierakstīšanās:",
"notifications.column_settings.alert": "Darbvirsmas paziņojumi",
"notifications.column_settings.favourite": "Izlases:",
"notifications.column_settings.filter_bar.advanced": "Rādīt visas kategorijas",
"notifications.column_settings.filter_bar.category": "Ātro filtru josla",
- "notifications.column_settings.filter_bar.show": "Parādīt",
+ "notifications.column_settings.filter_bar.show_bar": "Rādīt filtru joslu",
"notifications.column_settings.follow": "Jauni sekotāji:",
"notifications.column_settings.follow_request": "Jauni sekotāju pieprasījumi:",
"notifications.column_settings.mention": "Pieminējumi:",
@@ -322,7 +336,9 @@
"notifications.column_settings.show": "Rādīt kolonnā",
"notifications.column_settings.sound": "Atskaņot skaņu",
"notifications.column_settings.status": "Jaunas ziņas:",
- "notifications.column_settings.unread_markers.category": "Nelasīto paziņojumu marķieri",
+ "notifications.column_settings.unread_notifications.category": "Nelasītie paziņojumi",
+ "notifications.column_settings.unread_notifications.highlight": "Iezīmēt nelasītos paziņojumus",
+ "notifications.column_settings.update": "Labojumi:",
"notifications.filter.all": "Visi",
"notifications.filter.boosts": "Palielinājumi",
"notifications.filter.favourites": "Izlases",
@@ -346,7 +362,7 @@
"poll.total_votes": "{count, plural, one {# balsojums} other {# balsojumi}}",
"poll.vote": "Balsot",
"poll.voted": "Tu balsoji par šo atbildi",
- "poll.votes": "{votes, plural, one {# vote} other {# votes}}",
+ "poll.votes": "{votes, plural, one {# balss} other {# balsis}}",
"poll_button.add_poll": "Pievienot aptauju",
"poll_button.remove_poll": "Noņemt aptauju",
"privacy.change": "Mainīt ziņas privātumu",
@@ -362,18 +378,54 @@
"regeneration_indicator.label": "Ielādē…",
"regeneration_indicator.sublabel": "Tiek gatavota tava plūsma!",
"relative_time.days": "{number}d",
+ "relative_time.full.days": "{number, plural, one {# diena} other {# dienas}} atpakaļ",
+ "relative_time.full.hours": "{number, plural, one {# stunda} other {# stundas}} atpakaļ",
+ "relative_time.full.just_now": "tikko",
+ "relative_time.full.minutes": "{number, plural, one {# minūte} other {# minūtes}} atpakaļ",
+ "relative_time.full.seconds": "{number, plural, one {# sekunde} other {# sekundes}} atpakaļ",
"relative_time.hours": "{number}st",
"relative_time.just_now": "tagad",
"relative_time.minutes": "{number}m",
"relative_time.seconds": "{number}s",
"relative_time.today": "šodien",
"reply_indicator.cancel": "Atcelt",
+ "report.block": "Bloķēt",
+ "report.block_explanation": "Tu neredzēsi viņu ziņas. Viņi nevarēs redzēt tavas ziņas vai sekot tev. Viņi varēs pateikt, ka ir bloķēti.",
+ "report.categories.other": "Citi",
+ "report.categories.spam": "Spams",
+ "report.categories.violation": "Saturs pārkāpj vienu vai vairākus servera noteikumus",
+ "report.category.subtitle": "Izvēlieties labāko atbilstību",
+ "report.category.title": "Pastāsti mums, kas notiek ar šo {type}",
+ "report.category.title_account": "profils",
+ "report.category.title_status": "ziņa",
+ "report.close": "Izpildīts",
+ "report.comment.title": "Vai ir vēl kas, tavuprāt, mums būtu jāzina?",
"report.forward": "Pārsūtīt {target}",
"report.forward_hint": "Konts ir no cita servera. Vai nosūtīt anonimizētu ziņojuma kopiju arī tam?",
- "report.hint": "Pārskats tiks nosūtīts tava servera moderatoriem. Tu vari pievienot paskaidrojumu, kādēļ tu ziņo par kontu:",
+ "report.mute": "Apklusināt",
+ "report.mute_explanation": "Tu neredzēsi viņu ziņas. Viņi joprojām var tev sekot un redzēt tavas ziņas un nezinās, ka viņiem ir izslēgta skaņa.",
+ "report.next": "Nākamais",
"report.placeholder": "Papildu komentāri",
+ "report.reasons.dislike": "Man tas nepatīk",
+ "report.reasons.dislike_description": "Tas nav kaut kas, ko tu vēlies redzēt",
+ "report.reasons.other": "Tas ir kaut kas cits",
+ "report.reasons.other_description": "Šis jautājums neietilpst citās kategorijās",
+ "report.reasons.spam": "Tas ir spams",
+ "report.reasons.spam_description": "Ļaunprātīgas saites, viltus iesaistīšana vai atkārtotas atbildes",
+ "report.reasons.violation": "Tas pārkāpj servera noteikumus",
+ "report.reasons.violation_description": "Tu zini, ka tas pārkāpj īpašus noteikumus",
+ "report.rules.subtitle": "Atlasi visus atbilstošos",
+ "report.rules.title": "Kuri noteikumi tiek pārkāpti?",
+ "report.statuses.subtitle": "Atlasi visus atbilstošos",
+ "report.statuses.title": "Vai ir kādas ziņas, kas atbalsta šo ziņojumu?",
"report.submit": "Iesniegt",
"report.target": "Ziņošana par: {target}",
+ "report.thanks.take_action": "Tālāk ir norādītas iespējas, kā kontrolēt Mastodon redzamo saturu:",
+ "report.thanks.take_action_actionable": "Kamēr mēs to izskatām, tu vari veikt darbības pret @{name}:",
+ "report.thanks.title": "Vai nevēlies to redzēt?",
+ "report.thanks.title_actionable": "Paldies, ka ziņoji, mēs to izskatīsim.",
+ "report.unfollow": "Pārtraukt sekošanu @{name}",
+ "report.unfollow_explanation": "Tu seko šim kontam. Lai vairs neredzētu viņu ziņas savā ziņu plūsmā, pārtrauc viņiem sekot.",
"search.placeholder": "Meklēšana",
"search_popout.search_format": "Paplašināts meklēšanas formāts",
"search_popout.tips.full_text": "Vienkāršs teksts atgriež ziņas, kuras esi rakstījis, iecienījis, paaugstinājis vai pieminējis, kā arī atbilstošie lietotājvārdi, parādāmie vārdi un tēmturi.",
@@ -382,7 +434,9 @@
"search_popout.tips.text": "Vienkāršs teksts atgriež atbilstošus parādāmos vārdus, lietotājvārdus un mirkļbirkas",
"search_popout.tips.user": "lietotājs",
"search_results.accounts": "Cilvēki",
- "search_results.hashtags": "Mirkļbirkas",
+ "search_results.all": "Visi",
+ "search_results.hashtags": "Tēmturi",
+ "search_results.nothing_found": "Nevarēja atrast neko šiem meklēšanas vienumiem",
"search_results.statuses": "Ziņas",
"search_results.statuses_fts_disabled": "Šajā Mastodon serverī nav iespējota ziņu meklēšana pēc to satura.",
"search_results.total": "{count, number} {count, plural, one {rezultāts} other {rezultāti}}",
@@ -396,9 +450,14 @@
"status.delete": "Dzēst",
"status.detailed_status": "Detalizēts sarunas skats",
"status.direct": "Privāta ziņa @{name}",
+ "status.edit": "Rediģēt",
+ "status.edited": "Rediģēts {date}",
+ "status.edited_x_times": "Rediģēts {count, plural, one {{count} reize} other {{count} reizes}}",
"status.embed": "Iestrādāt",
"status.favourite": "Iecienītā",
"status.filtered": "Filtrēts",
+ "status.history.created": "{name} izveidots {date}",
+ "status.history.edited": "{name} rediģēts {date}",
"status.load_more": "Ielādēt vairāk",
"status.media_hidden": "Medijs ir paslēpts",
"status.mention": "Pieminēt @{name}",
@@ -417,7 +476,7 @@
"status.remove_bookmark": "Noņemt grāmatzīmi",
"status.reply": "Atbildēt",
"status.replyAll": "Atbildēt uz tematu",
- "status.report": "Atskaite @{name}",
+ "status.report": "Ziņot par @{name}",
"status.sensitive_warning": "Sensitīvs saturs",
"status.share": "Kopīgot",
"status.show_less": "Rādīt mazāk",
@@ -430,7 +489,7 @@
"status.unpin": "Noņemt no profila",
"suggestions.dismiss": "Noraidīt ieteikumu",
"suggestions.header": "Jūs varētu interesēt arī…",
- "tabs_bar.federated_timeline": "Apvienotā",
+ "tabs_bar.federated_timeline": "Federētā",
"tabs_bar.home": "Sākums",
"tabs_bar.local_timeline": "Vietējā",
"tabs_bar.notifications": "Paziņojumi",
@@ -462,7 +521,7 @@
"upload_form.video_description": "Aprakstiet cilvēkiem ar dzirdes vai redzes traucējumiem",
"upload_modal.analyzing_picture": "Analizē attēlu…",
"upload_modal.apply": "Apstiprināt",
- "upload_modal.applying": "Applying…",
+ "upload_modal.applying": "Pielieto…",
"upload_modal.choose_image": "Izvēlēties attēlu",
"upload_modal.description_placeholder": "Raibais runcis rīgā ratu rumbā rūc",
"upload_modal.detect_text": "Noteikt tekstu no attēla",
diff --git a/app/javascript/mastodon/locales/mk.json b/app/javascript/mastodon/locales/mk.json
index 36ea33bb8..c6f097134 100644
--- a/app/javascript/mastodon/locales/mk.json
+++ b/app/javascript/mastodon/locales/mk.json
@@ -18,12 +18,12 @@
"account.followers": "Следбеници",
"account.followers.empty": "Никој не го следи овој корисник сеуште.",
"account.followers_counter": "{count, plural, one {{counter} Follower} other {{counter} Followers}}",
+ "account.following": "Following",
"account.following_counter": "{count, plural, one {{counter} Following} other {{counter} Following}}",
"account.follows.empty": "Корисникот не следи никој сеуште.",
"account.follows_you": "Те следи тебе",
"account.hide_reblogs": "Сокриј буст од @{name}",
"account.joined": "Joined {date}",
- "account.last_status": "Последно активен",
"account.link_verified_on": "Сопстевноста на овај линк беше проверен на {date}",
"account.locked_info": "Статусот на приватност на овај корисник е сетиран како заклучен. Корисникот одлучува кој можи да го следи него.",
"account.media": "Медија",
@@ -32,7 +32,6 @@
"account.mute": "Зачути го @{name}",
"account.mute_notifications": "Исклучи известувања од @{name}",
"account.muted": "Зачутено",
- "account.never_active": "Никогаш",
"account.posts": "Тутови",
"account.posts_with_replies": "Тутови и реплики",
"account.report": "Пријави @{name}",
@@ -42,12 +41,15 @@
"account.statuses_counter": "{count, plural, one {{counter} Toot} other {{counter} Toots}}",
"account.unblock": "Одблокирај @{name}",
"account.unblock_domain": "Прикажи {domain}",
+ "account.unblock_short": "Unblock",
"account.unendorse": "Не прикажувај на профил",
"account.unfollow": "Одследи",
"account.unmute": "Зачути го @{name}",
"account.unmute_notifications": "Исклучи известувања од @{name}",
+ "account.unmute_short": "Unmute",
"account_note.placeholder": "Click to add a note",
- "admin.dashboard.retention": "Retention",
+ "admin.dashboard.daily_retention": "User retention rate by day after sign-up",
+ "admin.dashboard.monthly_retention": "User retention rate by month after sign-up",
"admin.dashboard.retention.average": "Average",
"admin.dashboard.retention.cohort": "Sign-up month",
"admin.dashboard.retention.cohort_size": "New users",
@@ -104,6 +106,7 @@
"compose_form.poll.switch_to_single": "Change poll to allow for a single choice",
"compose_form.publish": "Тутови",
"compose_form.publish_loud": "{publish}!",
+ "compose_form.save_changes": "Save changes",
"compose_form.sensitive.hide": "Обележи медиа како сензитивна",
"compose_form.sensitive.marked": "Медиата е обележана како сензитивна",
"compose_form.sensitive.unmarked": "Медиата не е обележана како сензитивна",
@@ -165,6 +168,7 @@
"empty_column.community": "Локалниот времеплов е празен. Објавете нешто јавно за да може да почне шоуто!",
"empty_column.direct": "Немате директни пораки. Кога ќе пратите или примите, ќе се појават тука.",
"empty_column.domain_blocks": "Немате сокриени домеини уште.",
+ "empty_column.explore_statuses": "Nothing is trending right now. Check back later!",
"empty_column.favourited_statuses": "You don't have any favourite toots yet. When you favourite one, it will show up here.",
"empty_column.favourites": "No one has favourited this toot yet. When someone does, they will show up here.",
"empty_column.follow_recommendations": "Looks like no suggestions could be generated for you. You can try using search to look for people you might know or explore trending hashtags.",
@@ -183,6 +187,12 @@
"error.unexpected_crash.next_steps_addons": "Try disabling them and refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
"errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard",
"errors.unexpected_crash.report_issue": "Пријавете проблем",
+ "explore.search_results": "Search results",
+ "explore.suggested_follows": "For you",
+ "explore.title": "Explore",
+ "explore.trending_links": "News",
+ "explore.trending_statuses": "Posts",
+ "explore.trending_tags": "Hashtags",
"follow_recommendations.done": "Done",
"follow_recommendations.heading": "Follow people you'd like to see posts from! Here are some suggestions.",
"follow_recommendations.lead": "Posts from people you follow will show up in chronological order on your home feed. Don't be afraid to make mistakes, you can unfollow people just as easily any time!",
@@ -284,6 +294,7 @@
"navigation_bar.discover": "Discover",
"navigation_bar.domain_blocks": "Hidden domains",
"navigation_bar.edit_profile": "Уреди профил",
+ "navigation_bar.explore": "Explore",
"navigation_bar.favourites": "Омилени",
"navigation_bar.filters": "Замолќени зборови",
"navigation_bar.follow_requests": "Следи покани",
@@ -298,6 +309,7 @@
"navigation_bar.preferences": "Preferences",
"navigation_bar.public_timeline": "Федеративен времеплов",
"navigation_bar.security": "Безбедност",
+ "notification.admin.sign_up": "{name} signed up",
"notification.favourite": "{name} favourited your status",
"notification.follow": "{name} followed you",
"notification.follow_request": "{name} has requested to follow you",
@@ -306,13 +318,15 @@
"notification.poll": "A poll you have voted in has ended",
"notification.reblog": "{name} boosted your status",
"notification.status": "{name} just posted",
+ "notification.update": "{name} edited a post",
"notifications.clear": "Clear notifications",
"notifications.clear_confirmation": "Are you sure you want to permanently clear all your notifications?",
+ "notifications.column_settings.admin.sign_up": "New sign-ups:",
"notifications.column_settings.alert": "Desktop notifications",
"notifications.column_settings.favourite": "Favourites:",
"notifications.column_settings.filter_bar.advanced": "Display all categories",
"notifications.column_settings.filter_bar.category": "Quick filter bar",
- "notifications.column_settings.filter_bar.show": "Show",
+ "notifications.column_settings.filter_bar.show_bar": "Show filter bar",
"notifications.column_settings.follow": "New followers:",
"notifications.column_settings.follow_request": "New follow requests:",
"notifications.column_settings.mention": "Mentions:",
@@ -322,7 +336,9 @@
"notifications.column_settings.show": "Прикажи во колона",
"notifications.column_settings.sound": "Свири звуци",
"notifications.column_settings.status": "New toots:",
- "notifications.column_settings.unread_markers.category": "Unread notification markers",
+ "notifications.column_settings.unread_notifications.category": "Unread notifications",
+ "notifications.column_settings.unread_notifications.highlight": "Highlight unread notifications",
+ "notifications.column_settings.update": "Edits:",
"notifications.filter.all": "Сите",
"notifications.filter.boosts": "Бустови",
"notifications.filter.favourites": "Омилени",
@@ -362,18 +378,54 @@
"regeneration_indicator.label": "Вчитување…",
"regeneration_indicator.sublabel": "Вашиот новости се подготвуваат!",
"relative_time.days": "{number}д",
+ "relative_time.full.days": "{number, plural, one {# day} other {# days}} ago",
+ "relative_time.full.hours": "{number, plural, one {# hour} other {# hours}} ago",
+ "relative_time.full.just_now": "just now",
+ "relative_time.full.minutes": "{number, plural, one {# minute} other {# minutes}} ago",
+ "relative_time.full.seconds": "{number, plural, one {# second} other {# seconds}} ago",
"relative_time.hours": "{number}ч",
"relative_time.just_now": "сега",
"relative_time.minutes": "{number}м",
"relative_time.seconds": "{number}с",
"relative_time.today": "today",
"reply_indicator.cancel": "Откажи",
+ "report.block": "Block",
+ "report.block_explanation": "You will not see their posts. They will not be able to see your posts or follow you. They will be able to tell that they are blocked.",
+ "report.categories.other": "Other",
+ "report.categories.spam": "Spam",
+ "report.categories.violation": "Content violates one or more server rules",
+ "report.category.subtitle": "Choose the best match",
+ "report.category.title": "Tell us what's going on with this {type}",
+ "report.category.title_account": "profile",
+ "report.category.title_status": "post",
+ "report.close": "Done",
+ "report.comment.title": "Is there anything else you think we should know?",
"report.forward": "Проследи до {target}",
"report.forward_hint": "Оваа сметка е од друг сервер. Испрати анонимна копија од пријавата и таму?",
- "report.hint": "Пријавата ќе биде испратена до вашиот серверски модератор. Подолу можете да ставите опис зошто ја пријавувате сметката:",
+ "report.mute": "Mute",
+ "report.mute_explanation": "You will not see their posts. They can still follow you and see your posts and will not know that they are muted.",
+ "report.next": "Next",
"report.placeholder": "Додатни коментари",
+ "report.reasons.dislike": "I don't like it",
+ "report.reasons.dislike_description": "It is not something you want to see",
+ "report.reasons.other": "It's something else",
+ "report.reasons.other_description": "The issue does not fit into other categories",
+ "report.reasons.spam": "It's spam",
+ "report.reasons.spam_description": "Malicious links, fake engagement, or repetitive replies",
+ "report.reasons.violation": "It violates server rules",
+ "report.reasons.violation_description": "You are aware that it breaks specific rules",
+ "report.rules.subtitle": "Select all that apply",
+ "report.rules.title": "Which rules are being violated?",
+ "report.statuses.subtitle": "Select all that apply",
+ "report.statuses.title": "Are there any posts that back up this report?",
"report.submit": "Испрати",
"report.target": "Пријавување {target}",
+ "report.thanks.take_action": "Here are your options for controlling what you see on Mastodon:",
+ "report.thanks.take_action_actionable": "While we review this, you can take action against @{name}:",
+ "report.thanks.title": "Don't want to see this?",
+ "report.thanks.title_actionable": "Thanks for reporting, we'll look into this.",
+ "report.unfollow": "Unfollow @{name}",
+ "report.unfollow_explanation": "You are following this account. To not see their posts in your home feed anymore, unfollow them.",
"search.placeholder": "Барај",
"search_popout.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.",
@@ -382,7 +434,9 @@
"search_popout.tips.text": "Прост текст враќа совпаднати имиња, корисници и хештагови",
"search_popout.tips.user": "user",
"search_results.accounts": "People",
+ "search_results.all": "All",
"search_results.hashtags": "Hashtags",
+ "search_results.nothing_found": "Could not find anything for these search terms",
"search_results.statuses": "Toots",
"search_results.statuses_fts_disabled": "Searching toots by their content is not enabled on this Mastodon server.",
"search_results.total": "{count, number} {count, plural, one {result} other {results}}",
@@ -396,9 +450,14 @@
"status.delete": "Delete",
"status.detailed_status": "Detailed conversation view",
"status.direct": "Direct message @{name}",
+ "status.edit": "Edit",
+ "status.edited": "Edited {date}",
+ "status.edited_x_times": "Edited {count, plural, one {{count} time} other {{count} times}}",
"status.embed": "Embed",
"status.favourite": "Favourite",
"status.filtered": "Filtered",
+ "status.history.created": "{name} created {date}",
+ "status.history.edited": "{name} edited {date}",
"status.load_more": "Load more",
"status.media_hidden": "Media hidden",
"status.mention": "Mention @{name}",
diff --git a/app/javascript/mastodon/locales/ml.json b/app/javascript/mastodon/locales/ml.json
index cb320a661..1a0f4ac38 100644
--- a/app/javascript/mastodon/locales/ml.json
+++ b/app/javascript/mastodon/locales/ml.json
@@ -18,12 +18,12 @@
"account.followers": "പിന്തുടരുന്നവർ",
"account.followers.empty": "ഈ ഉപയോക്താവിനെ ആരും ഇതുവരെ പിന്തുടരുന്നില്ല.",
"account.followers_counter": "{count, plural, one {{counter} പിന്തുടരുന്നവർ} other {{counter} പിന്തുടരുന്നവർ}}",
+ "account.following": "Following",
"account.following_counter": "{count, plural, one {{counter} പിന്തുടരുന്നു} other {{counter} പിന്തുടരുന്നു}}",
"account.follows.empty": "ഈ ഉപയോക്താവ് ആരേയും ഇതുവരെ പിന്തുടരുന്നില്ല.",
"account.follows_you": "നിങ്ങളെ പിന്തുടരുന്നു",
"account.hide_reblogs": "@{name} ബൂസ്റ്റ് ചെയ്തവ മറയ്കുക",
"account.joined": "{date} ൽ ചേർന്നു",
- "account.last_status": "അവസാനം കണ്ടത്",
"account.link_verified_on": "ഈ ലിങ്കിന്റെ ഉടമസ്തത {date} ഇൽ ഉറപ്പാക്കിയതാണ്",
"account.locked_info": "ഈ അംഗത്വത്തിന്റെ സ്വകാര്യതാ നിലപാട് അനുസരിച്ച് പിന്തുടരുന്നവരെ തിരഞ്ഞെടുക്കാനുള്ള വിവേചനാധികാരം ഉടമസ്ഥനിൽ നിഷിപ്തമായിരിക്കുന്നു.",
"account.media": "മീഡിയ",
@@ -32,7 +32,6 @@
"account.mute": "@{name}-നെ(യെ) നിശ്ശബ്ദമാക്കൂ",
"account.mute_notifications": "@{name} യിൽ നിന്നുള്ള അറിയിപ്പുകൾ നിശബ്ദമാക്കുക",
"account.muted": "നിശ്ശബ്ദമാക്കിയിരിക്കുന്നു",
- "account.never_active": "ഒരിക്കലും ഇല്ല",
"account.posts": "പോസ്റ്റുകൾ",
"account.posts_with_replies": "പോസ്റ്റുകളും മറുപടികളും",
"account.report": "റിപ്പോർട്ട് ചെയ്യുക @{name}",
@@ -42,12 +41,15 @@
"account.statuses_counter": "{count, plural, one {{counter} ടൂട്ട്} other {{counter} ടൂട്ടുകൾ}}",
"account.unblock": "@{name} തടഞ്ഞത് മാറ്റുക",
"account.unblock_domain": "{domain} എന്ന മേഖല വെളിപ്പെടുത്തുക",
+ "account.unblock_short": "Unblock",
"account.unendorse": "പ്രൊഫൈലിൽ പ്രകടമാക്കരുത്",
"account.unfollow": "പിന്തുടരുന്നത് നിര്ത്തുക",
"account.unmute": "നിശ്ശബ്ദമാക്കുന്നത് നിർത്തുക @{name}",
"account.unmute_notifications": "@{name} യിൽ നിന്നുള്ള അറിയിപ്പുകൾ പ്രസിദ്ധപ്പെടുത്തുക",
+ "account.unmute_short": "Unmute",
"account_note.placeholder": "കുറിപ്പ് ചേർക്കാൻ ക്ലിക്കുചെയ്യുക",
- "admin.dashboard.retention": "Retention",
+ "admin.dashboard.daily_retention": "User retention rate by day after sign-up",
+ "admin.dashboard.monthly_retention": "User retention rate by month after sign-up",
"admin.dashboard.retention.average": "Average",
"admin.dashboard.retention.cohort": "Sign-up month",
"admin.dashboard.retention.cohort_size": "New users",
@@ -104,6 +106,7 @@
"compose_form.poll.switch_to_single": "വോട്ടെടുപ്പിൽ ഒരൊറ്റ ചോയ്സ് മാത്രം ആക്കുക",
"compose_form.publish": "ടൂട്ട്",
"compose_form.publish_loud": "{പ്രസിദ്ധീകരിക്കുക}!",
+ "compose_form.save_changes": "Save changes",
"compose_form.sensitive.hide": "{count, plural, one {Mark media as sensitive} other {Mark media as sensitive}}",
"compose_form.sensitive.marked": "{count, plural, one {Media is marked as sensitive} other {Media is marked as sensitive}}",
"compose_form.sensitive.unmarked": "{count, plural, one {Media is not marked as sensitive} other {Media is not marked as sensitive}}",
@@ -165,6 +168,7 @@
"empty_column.community": "പ്രാദേശികമായ സമയരേഖ ശൂന്യമാണ്. എന്തെങ്കിലും പരസ്യമായി എഴുതി തുടക്കം കുറിക്കു!",
"empty_column.direct": "നിങ്ങൾക്ക് ഇതുവരെ നേരിട്ടുള്ള സന്ദേശങ്ങൾ ഒന്നുമില്ല. നിങ്ങൾ അങ്ങനെ ഒന്ന് അയക്കുകയോ, നിങ്ങൾക്ക് ലഭിക്കുകയോ ചെയ്യുന്നപക്ഷം അതിവിടെ കാണപ്പെടുന്നതാണ്.",
"empty_column.domain_blocks": "മറയ്ക്കപ്പെട്ടിരിക്കുന്ന മേഖലകൾ ഇതുവരെ ഇല്ല.",
+ "empty_column.explore_statuses": "Nothing is trending right now. Check back later!",
"empty_column.favourited_statuses": "നിങ്ങൾക്ക് ഇത് വരെ ഒരു പ്രിയപ്പെട്ട ടൂട്ടും ഇല്ല. നിങ്ങൾ അങ്ങനെ ഒന്ന് പ്രിയപ്പെടുന്ന പക്ഷം അതിവിടെ കാണപ്പെടുന്നതാണ്.",
"empty_column.favourites": "ഇതുവരെ ആരും ഈ ടൂട്ട് പ്രിയപ്പെട്ടതായി അടയാളപ്പെടുത്തിയിട്ടില്ല. ആരെങ്കിലും അങ്ങനെ ചെയ്യുന്നപക്ഷം അതിവിടെ കാണപ്പെടുന്നതാണ്.",
"empty_column.follow_recommendations": "Looks like no suggestions could be generated for you. You can try using search to look for people you might know or explore trending hashtags.",
@@ -183,6 +187,12 @@
"error.unexpected_crash.next_steps_addons": "Try disabling them and refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
"errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard",
"errors.unexpected_crash.report_issue": "പ്രശ്നം അറിയിക്കുക",
+ "explore.search_results": "Search results",
+ "explore.suggested_follows": "For you",
+ "explore.title": "Explore",
+ "explore.trending_links": "News",
+ "explore.trending_statuses": "Posts",
+ "explore.trending_tags": "Hashtags",
"follow_recommendations.done": "പൂര്ത്തിയായീ",
"follow_recommendations.heading": "Follow people you'd like to see posts from! Here are some suggestions.",
"follow_recommendations.lead": "Posts from people you follow will show up in chronological order on your home feed. Don't be afraid to make mistakes, you can unfollow people just as easily any time!",
@@ -284,6 +294,7 @@
"navigation_bar.discover": "കണ്ടെത്തുക",
"navigation_bar.domain_blocks": "Hidden domains",
"navigation_bar.edit_profile": "പ്രൊഫൈൽ തിരുത്തുക",
+ "navigation_bar.explore": "Explore",
"navigation_bar.favourites": "പ്രിയപ്പെട്ടവ",
"navigation_bar.filters": "Muted words",
"navigation_bar.follow_requests": "പിന്തുടരാനുള്ള അഭ്യർത്ഥനകൾ",
@@ -298,6 +309,7 @@
"navigation_bar.preferences": "ക്രമീകരണങ്ങൾ",
"navigation_bar.public_timeline": "Federated timeline",
"navigation_bar.security": "സുരക്ഷ",
+ "notification.admin.sign_up": "{name} signed up",
"notification.favourite": "{name} favourited your status",
"notification.follow": "{name} നിങ്ങളെ പിന്തുടർന്നു",
"notification.follow_request": "{name} നിങ്ങളെ പിന്തുടരാൻ അഭ്യർത്ഥിച്ചു",
@@ -306,13 +318,15 @@
"notification.poll": "A poll you have voted in has ended",
"notification.reblog": "{name} നിങ്ങളുടെ പോസ്റ്റ് ബൂസ്റ്റ് ചെയ്തു",
"notification.status": "{name} ഇപ്പോൾ പോസ്റ്റുചെയ്തു",
+ "notification.update": "{name} edited a post",
"notifications.clear": "അറിയിപ്പ് മായ്ക്കുക",
"notifications.clear_confirmation": "നിങ്ങളുടെ എല്ലാ അറിയിപ്പുകളും ശാശ്വതമായി മായ്ക്കണമെന്ന് നിങ്ങൾക്ക് ഉറപ്പാണോ?",
+ "notifications.column_settings.admin.sign_up": "New sign-ups:",
"notifications.column_settings.alert": "ഡെസ്ക്ടോപ്പ് അറിയിപ്പുകൾ",
"notifications.column_settings.favourite": "പ്രിയപ്പെട്ടവ:",
"notifications.column_settings.filter_bar.advanced": "എല്ലാ വിഭാഗങ്ങളും പ്രദർശിപ്പിക്കുക",
"notifications.column_settings.filter_bar.category": "Quick filter bar",
- "notifications.column_settings.filter_bar.show": "കാണിക്കുക",
+ "notifications.column_settings.filter_bar.show_bar": "Show filter bar",
"notifications.column_settings.follow": "പുതിയ പിന്തുടരുന്നവർ:",
"notifications.column_settings.follow_request": "പുതിയ പിന്തുടരൽ അഭ്യർത്ഥനകൾ:",
"notifications.column_settings.mention": "സൂചനകൾ:",
@@ -322,7 +336,9 @@
"notifications.column_settings.show": "Show in column",
"notifications.column_settings.sound": "ശബ്ദം പ്ലേ ചെയ്യുക",
"notifications.column_settings.status": "പുതിയ ടൂട്ടുകൾ:",
- "notifications.column_settings.unread_markers.category": "Unread notification markers",
+ "notifications.column_settings.unread_notifications.category": "Unread notifications",
+ "notifications.column_settings.unread_notifications.highlight": "Highlight unread notifications",
+ "notifications.column_settings.update": "Edits:",
"notifications.filter.all": "എല്ലാം",
"notifications.filter.boosts": "ബൂസ്റ്റുകൾ",
"notifications.filter.favourites": "പ്രിയപ്പെട്ടവ",
@@ -362,18 +378,54 @@
"regeneration_indicator.label": "ലഭ്യമാക്കുന്നു…",
"regeneration_indicator.sublabel": "നിങ്ങളുടെ ഹോം ഫീഡ് തയാറാക്കുന്നു!",
"relative_time.days": "{number}ദിവസം",
+ "relative_time.full.days": "{number, plural, one {# day} other {# days}} ago",
+ "relative_time.full.hours": "{number, plural, one {# hour} other {# hours}} ago",
+ "relative_time.full.just_now": "just now",
+ "relative_time.full.minutes": "{number, plural, one {# minute} other {# minutes}} ago",
+ "relative_time.full.seconds": "{number, plural, one {# second} other {# seconds}} ago",
"relative_time.hours": "{number}മണി",
"relative_time.just_now": "ഇപ്പോൾ",
"relative_time.minutes": "{number}m",
"relative_time.seconds": "{number}s",
"relative_time.today": "ഇന്ന്",
"reply_indicator.cancel": "റദ്ദാക്കുക",
+ "report.block": "Block",
+ "report.block_explanation": "You will not see their posts. They will not be able to see your posts or follow you. They will be able to tell that they are blocked.",
+ "report.categories.other": "Other",
+ "report.categories.spam": "Spam",
+ "report.categories.violation": "Content violates one or more server rules",
+ "report.category.subtitle": "Choose the best match",
+ "report.category.title": "Tell us what's going on with this {type}",
+ "report.category.title_account": "profile",
+ "report.category.title_status": "post",
+ "report.close": "Done",
+ "report.comment.title": "Is there anything else you think we should know?",
"report.forward": "Forward to {target}",
"report.forward_hint": "ഈ അക്കൗണ്ട് മറ്റൊരു സെർവറിൽ നിന്നാണ്. റിപ്പോർട്ടിന്റെ അജ്ഞാത പകർപ്പ് അവിടെ അയയ്ക്കണോ?",
- "report.hint": "The report will be sent to your server moderators. You can provide an explanation of why you are reporting this account below:",
+ "report.mute": "Mute",
+ "report.mute_explanation": "You will not see their posts. They can still follow you and see your posts and will not know that they are muted.",
+ "report.next": "Next",
"report.placeholder": "കൂടുതൽ അഭിപ്രായങ്ങൾ",
+ "report.reasons.dislike": "I don't like it",
+ "report.reasons.dislike_description": "It is not something you want to see",
+ "report.reasons.other": "It's something else",
+ "report.reasons.other_description": "The issue does not fit into other categories",
+ "report.reasons.spam": "It's spam",
+ "report.reasons.spam_description": "Malicious links, fake engagement, or repetitive replies",
+ "report.reasons.violation": "It violates server rules",
+ "report.reasons.violation_description": "You are aware that it breaks specific rules",
+ "report.rules.subtitle": "Select all that apply",
+ "report.rules.title": "Which rules are being violated?",
+ "report.statuses.subtitle": "Select all that apply",
+ "report.statuses.title": "Are there any posts that back up this report?",
"report.submit": "സമർപ്പിക്കുക",
"report.target": "Report {target}",
+ "report.thanks.take_action": "Here are your options for controlling what you see on Mastodon:",
+ "report.thanks.take_action_actionable": "While we review this, you can take action against @{name}:",
+ "report.thanks.title": "Don't want to see this?",
+ "report.thanks.title_actionable": "Thanks for reporting, we'll look into this.",
+ "report.unfollow": "Unfollow @{name}",
+ "report.unfollow_explanation": "You are following this account. To not see their posts in your home feed anymore, unfollow them.",
"search.placeholder": "തിരയുക",
"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.",
@@ -382,7 +434,9 @@
"search_popout.tips.text": "Simple text returns matching display names, usernames and hashtags",
"search_popout.tips.user": "ഉപയോക്താവ്",
"search_results.accounts": "ആളുകൾ",
+ "search_results.all": "All",
"search_results.hashtags": "ഹാഷ്ടാഗുകൾ",
+ "search_results.nothing_found": "Could not find anything for these search terms",
"search_results.statuses": "ടൂട്ടുകൾ",
"search_results.statuses_fts_disabled": "Searching toots by their content is not enabled on this Mastodon server.",
"search_results.total": "{count, number} {count, plural, one {result} other {results}}",
@@ -396,9 +450,14 @@
"status.delete": "മായ്ക്കുക",
"status.detailed_status": "വിശദമായ സംഭാഷണ കാഴ്ച",
"status.direct": "@{name} ന് നേരിട്ട് മെസേജ് അയക്കുക",
+ "status.edit": "Edit",
+ "status.edited": "Edited {date}",
+ "status.edited_x_times": "Edited {count, plural, one {{count} time} other {{count} times}}",
"status.embed": "ഉൾച്ചേർക്കുക",
"status.favourite": "പ്രിയപ്പെട്ടത്",
"status.filtered": "ഫിൽട്ടർ ചെയ്തു",
+ "status.history.created": "{name} created {date}",
+ "status.history.edited": "{name} edited {date}",
"status.load_more": "കൂടുതൽ ലോഡു ചെയ്യുക",
"status.media_hidden": "മീഡിയ മറച്ചു",
"status.mention": "@{name} സൂചിപ്പിക്കുക",
diff --git a/app/javascript/mastodon/locales/mr.json b/app/javascript/mastodon/locales/mr.json
index 979f910ee..a731ff87b 100644
--- a/app/javascript/mastodon/locales/mr.json
+++ b/app/javascript/mastodon/locales/mr.json
@@ -18,12 +18,12 @@
"account.followers": "अनुयायी",
"account.followers.empty": "ह्या वापरकर्त्याचा आतापर्यंत कोणी अनुयायी नाही.",
"account.followers_counter": "{count, plural, one {{counter} Follower} other {{counter} Followers}}",
+ "account.following": "Following",
"account.following_counter": "{count, plural, one {{counter} Following} other {{counter} Following}}",
"account.follows.empty": "हा वापरकर्ता अजूनपर्यंत कोणाचा अनुयायी नाही.",
"account.follows_you": "तुमचा अनुयायी आहे",
"account.hide_reblogs": "@{name} पासून सर्व बूस्ट लपवा",
"account.joined": "Joined {date}",
- "account.last_status": "शेवटचे सक्रिय",
"account.link_verified_on": "Ownership of this link was checked on {date}",
"account.locked_info": "This account privacy status is set to locked. The owner manually reviews who can follow them.",
"account.media": "दृक्श्राव्य मजकूर",
@@ -32,7 +32,6 @@
"account.mute": "@{name} ला मूक कारा",
"account.mute_notifications": "Mute notifications from @{name}",
"account.muted": "Muted",
- "account.never_active": "Never",
"account.posts": "Toots",
"account.posts_with_replies": "Toots and replies",
"account.report": "Report @{name}",
@@ -42,12 +41,15 @@
"account.statuses_counter": "{count, plural, one {{counter} Toot} other {{counter} Toots}}",
"account.unblock": "@{name} ला ब्लॉक करा",
"account.unblock_domain": "उघड करा {domain}",
+ "account.unblock_short": "Unblock",
"account.unendorse": "Don't feature on profile",
"account.unfollow": "अनुयायी असणे थांबवा",
"account.unmute": "Unmute @{name}",
"account.unmute_notifications": "Unmute notifications from @{name}",
+ "account.unmute_short": "Unmute",
"account_note.placeholder": "Click to add a note",
- "admin.dashboard.retention": "Retention",
+ "admin.dashboard.daily_retention": "User retention rate by day after sign-up",
+ "admin.dashboard.monthly_retention": "User retention rate by month after sign-up",
"admin.dashboard.retention.average": "Average",
"admin.dashboard.retention.cohort": "Sign-up month",
"admin.dashboard.retention.cohort_size": "New users",
@@ -104,6 +106,7 @@
"compose_form.poll.switch_to_single": "Change poll to allow for a single choice",
"compose_form.publish": "Toot",
"compose_form.publish_loud": "{publish}!",
+ "compose_form.save_changes": "Save changes",
"compose_form.sensitive.hide": "{count, plural, one {Mark media as sensitive} other {Mark media as sensitive}}",
"compose_form.sensitive.marked": "{count, plural, one {Media is marked as sensitive} other {Media is marked as sensitive}}",
"compose_form.sensitive.unmarked": "{count, plural, one {Media is not marked as sensitive} other {Media is not marked as sensitive}}",
@@ -165,6 +168,7 @@
"empty_column.community": "The local timeline is empty. Write something publicly to get the ball rolling!",
"empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.",
"empty_column.domain_blocks": "There are no hidden domains yet.",
+ "empty_column.explore_statuses": "Nothing is trending right now. Check back later!",
"empty_column.favourited_statuses": "You don't have any favourite toots yet. When you favourite one, it will show up here.",
"empty_column.favourites": "No one has favourited this toot yet. When someone does, they will show up here.",
"empty_column.follow_recommendations": "Looks like no suggestions could be generated for you. You can try using search to look for people you might know or explore trending hashtags.",
@@ -183,6 +187,12 @@
"error.unexpected_crash.next_steps_addons": "Try disabling them and refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
"errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard",
"errors.unexpected_crash.report_issue": "Report issue",
+ "explore.search_results": "Search results",
+ "explore.suggested_follows": "For you",
+ "explore.title": "Explore",
+ "explore.trending_links": "News",
+ "explore.trending_statuses": "Posts",
+ "explore.trending_tags": "Hashtags",
"follow_recommendations.done": "Done",
"follow_recommendations.heading": "Follow people you'd like to see posts from! Here are some suggestions.",
"follow_recommendations.lead": "Posts from people you follow will show up in chronological order on your home feed. Don't be afraid to make mistakes, you can unfollow people just as easily any time!",
@@ -284,6 +294,7 @@
"navigation_bar.discover": "Discover",
"navigation_bar.domain_blocks": "Hidden domains",
"navigation_bar.edit_profile": "Edit profile",
+ "navigation_bar.explore": "Explore",
"navigation_bar.favourites": "Favourites",
"navigation_bar.filters": "Muted words",
"navigation_bar.follow_requests": "Follow requests",
@@ -298,6 +309,7 @@
"navigation_bar.preferences": "Preferences",
"navigation_bar.public_timeline": "Federated timeline",
"navigation_bar.security": "Security",
+ "notification.admin.sign_up": "{name} signed up",
"notification.favourite": "{name} favourited your status",
"notification.follow": "{name} followed you",
"notification.follow_request": "{name} has requested to follow you",
@@ -306,13 +318,15 @@
"notification.poll": "A poll you have voted in has ended",
"notification.reblog": "{name} boosted your status",
"notification.status": "{name} just posted",
+ "notification.update": "{name} edited a post",
"notifications.clear": "Clear notifications",
"notifications.clear_confirmation": "Are you sure you want to permanently clear all your notifications?",
+ "notifications.column_settings.admin.sign_up": "New sign-ups:",
"notifications.column_settings.alert": "Desktop notifications",
"notifications.column_settings.favourite": "Favourites:",
"notifications.column_settings.filter_bar.advanced": "Display all categories",
"notifications.column_settings.filter_bar.category": "Quick filter bar",
- "notifications.column_settings.filter_bar.show": "Show",
+ "notifications.column_settings.filter_bar.show_bar": "Show filter bar",
"notifications.column_settings.follow": "New followers:",
"notifications.column_settings.follow_request": "New follow requests:",
"notifications.column_settings.mention": "Mentions:",
@@ -322,7 +336,9 @@
"notifications.column_settings.show": "Show in column",
"notifications.column_settings.sound": "Play sound",
"notifications.column_settings.status": "New toots:",
- "notifications.column_settings.unread_markers.category": "Unread notification markers",
+ "notifications.column_settings.unread_notifications.category": "Unread notifications",
+ "notifications.column_settings.unread_notifications.highlight": "Highlight unread notifications",
+ "notifications.column_settings.update": "Edits:",
"notifications.filter.all": "All",
"notifications.filter.boosts": "Boosts",
"notifications.filter.favourites": "Favourites",
@@ -362,18 +378,54 @@
"regeneration_indicator.label": "Loading…",
"regeneration_indicator.sublabel": "Your home feed is being prepared!",
"relative_time.days": "{number}d",
+ "relative_time.full.days": "{number, plural, one {# day} other {# days}} ago",
+ "relative_time.full.hours": "{number, plural, one {# hour} other {# hours}} ago",
+ "relative_time.full.just_now": "just now",
+ "relative_time.full.minutes": "{number, plural, one {# minute} other {# minutes}} ago",
+ "relative_time.full.seconds": "{number, plural, one {# second} other {# seconds}} ago",
"relative_time.hours": "{number}h",
"relative_time.just_now": "now",
"relative_time.minutes": "{number}m",
"relative_time.seconds": "{number}s",
"relative_time.today": "today",
"reply_indicator.cancel": "Cancel",
+ "report.block": "Block",
+ "report.block_explanation": "You will not see their posts. They will not be able to see your posts or follow you. They will be able to tell that they are blocked.",
+ "report.categories.other": "Other",
+ "report.categories.spam": "Spam",
+ "report.categories.violation": "Content violates one or more server rules",
+ "report.category.subtitle": "Choose the best match",
+ "report.category.title": "Tell us what's going on with this {type}",
+ "report.category.title_account": "profile",
+ "report.category.title_status": "post",
+ "report.close": "Done",
+ "report.comment.title": "Is there anything else you think we should know?",
"report.forward": "Forward to {target}",
"report.forward_hint": "The account is from another server. Send an anonymized copy of the report there as well?",
- "report.hint": "The report will be sent to your server moderators. You can provide an explanation of why you are reporting this account below:",
- "report.placeholder": "Additional comments",
- "report.submit": "Submit",
+ "report.mute": "Mute",
+ "report.mute_explanation": "You will not see their posts. They can still follow you and see your posts and will not know that they are muted.",
+ "report.next": "Next",
+ "report.placeholder": "Type or paste additional comments",
+ "report.reasons.dislike": "I don't like it",
+ "report.reasons.dislike_description": "It is not something you want to see",
+ "report.reasons.other": "It's something else",
+ "report.reasons.other_description": "The issue does not fit into other categories",
+ "report.reasons.spam": "It's spam",
+ "report.reasons.spam_description": "Malicious links, fake engagement, or repetitive replies",
+ "report.reasons.violation": "It violates server rules",
+ "report.reasons.violation_description": "You are aware that it breaks specific rules",
+ "report.rules.subtitle": "Select all that apply",
+ "report.rules.title": "Which rules are being violated?",
+ "report.statuses.subtitle": "Select all that apply",
+ "report.statuses.title": "Are there any posts that back up this report?",
+ "report.submit": "Submit report",
"report.target": "Report {target}",
+ "report.thanks.take_action": "Here are your options for controlling what you see on Mastodon:",
+ "report.thanks.take_action_actionable": "While we review this, you can take action against @{name}:",
+ "report.thanks.title": "Don't want to see this?",
+ "report.thanks.title_actionable": "Thanks for reporting, we'll look into this.",
+ "report.unfollow": "Unfollow @{name}",
+ "report.unfollow_explanation": "You are following this account. To not see their posts in your home feed anymore, unfollow them.",
"search.placeholder": "Search",
"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.",
@@ -382,7 +434,9 @@
"search_popout.tips.text": "Simple text returns matching display names, usernames and hashtags",
"search_popout.tips.user": "user",
"search_results.accounts": "People",
+ "search_results.all": "All",
"search_results.hashtags": "Hashtags",
+ "search_results.nothing_found": "Could not find anything for these search terms",
"search_results.statuses": "Toots",
"search_results.statuses_fts_disabled": "Searching toots by their content is not enabled on this Mastodon server.",
"search_results.total": "{count, number} {count, plural, one {result} other {results}}",
@@ -396,9 +450,14 @@
"status.delete": "Delete",
"status.detailed_status": "Detailed conversation view",
"status.direct": "Direct message @{name}",
+ "status.edit": "Edit",
+ "status.edited": "Edited {date}",
+ "status.edited_x_times": "Edited {count, plural, one {{count} time} other {{count} times}}",
"status.embed": "Embed",
"status.favourite": "Favourite",
"status.filtered": "Filtered",
+ "status.history.created": "{name} created {date}",
+ "status.history.edited": "{name} edited {date}",
"status.load_more": "Load more",
"status.media_hidden": "Media hidden",
"status.mention": "Mention @{name}",
diff --git a/app/javascript/mastodon/locales/ms.json b/app/javascript/mastodon/locales/ms.json
index 50526f74c..96d300492 100644
--- a/app/javascript/mastodon/locales/ms.json
+++ b/app/javascript/mastodon/locales/ms.json
@@ -18,12 +18,12 @@
"account.followers": "Pengikut",
"account.followers.empty": "Belum ada yang mengikuti pengguna ini.",
"account.followers_counter": "{count, plural, one {{counter} Pengikut} other {{counter} Pengikut}}",
+ "account.following": "Following",
"account.following_counter": "{count, plural, one {{counter} Diikuti} other {{counter} Diikuti}}",
"account.follows.empty": "Pengguna ini belum mengikuti sesiapa.",
"account.follows_you": "Mengikuti anda",
"account.hide_reblogs": "Sembunyikan galakan daripada @{name}",
"account.joined": "Sertai pada {date}",
- "account.last_status": "Terakhir aktif",
"account.link_verified_on": "Pemilikan pautan ini telah disemak pada {date}",
"account.locked_info": "Status privasi akaun ini dikunci. Pemiliknya menyaring sendiri siapa yang boleh mengikutinya.",
"account.media": "Media",
@@ -32,7 +32,6 @@
"account.mute": "Bisukan @{name}",
"account.mute_notifications": "Bisukan pemberitahuan daripada @{name}",
"account.muted": "Dibisukan",
- "account.never_active": "Jangan sesekali",
"account.posts": "Hantaran",
"account.posts_with_replies": "Hantaran dan balasan",
"account.report": "Laporkan @{name}",
@@ -42,12 +41,15 @@
"account.statuses_counter": "{count, plural, one {{counter} Hantaran} other {{counter} Hantaran}}",
"account.unblock": "Nyahsekat @{name}",
"account.unblock_domain": "Nyahsekat domain {domain}",
+ "account.unblock_short": "Unblock",
"account.unendorse": "Jangan tampilkan di profil",
"account.unfollow": "Nyahikut",
"account.unmute": "Nyahbisukan @{name}",
"account.unmute_notifications": "Nyahbisukan pemberitahuan daripada @{name}",
+ "account.unmute_short": "Unmute",
"account_note.placeholder": "Klik untuk tambah catatan",
- "admin.dashboard.retention": "Retention",
+ "admin.dashboard.daily_retention": "User retention rate by day after sign-up",
+ "admin.dashboard.monthly_retention": "User retention rate by month after sign-up",
"admin.dashboard.retention.average": "Average",
"admin.dashboard.retention.cohort": "Sign-up month",
"admin.dashboard.retention.cohort_size": "New users",
@@ -104,6 +106,7 @@
"compose_form.poll.switch_to_single": "Ubah kepada undian pilihan tunggal",
"compose_form.publish": "Toot",
"compose_form.publish_loud": "{publish}!",
+ "compose_form.save_changes": "Save changes",
"compose_form.sensitive.hide": "{count, plural, one {Tandakan media sbg sensitif} other {Tandakan media sbg sensitif}}",
"compose_form.sensitive.marked": "{count, plural, one {Media telah ditanda sbg sensitif} other {Media telah ditanda sbg sensitif}}",
"compose_form.sensitive.unmarked": "{count, plural, one {Media tidak ditanda sbg sensitif} other {Media tidak ditanda sbg sensitif}}",
@@ -165,6 +168,7 @@
"empty_column.community": "Garis masa tempatan kosong. Tulislah secara awam untuk memulakan sesuatu!",
"empty_column.direct": "Anda tidak mempunyai mesej terus. Apabila anda menghantar atau menerimanya, ia akan muncul di sini.",
"empty_column.domain_blocks": "Belum ada domain yang disekat.",
+ "empty_column.explore_statuses": "Nothing is trending right now. Check back later!",
"empty_column.favourited_statuses": "Anda belum ada hantaran yang digemari. Apabila anda menggemari sesuatu, ia akan muncul di sini.",
"empty_column.favourites": "Tiada sesiapa yang menggemari hantaran ini. Apabila ada yang menggemari, ia akan muncul di sini.",
"empty_column.follow_recommendations": "Nampaknya tiada cadangan yang boleh dijana untuk anda. Anda boleh cuba gunakan gelintar untuk mencari orang yang anda mungkin kenal atau jelajahi tanda pagar sohor kini.",
@@ -183,6 +187,12 @@
"error.unexpected_crash.next_steps_addons": "Cuba nyahdaya pemalam dan segarkan semula halaman. Jika itu tidak membantu, anda masih boleh menggunakan Mastodon dengan pelayar yang berlainan atau aplikasi natif.",
"errors.unexpected_crash.copy_stacktrace": "Salin surih tindanan ke papan keratan",
"errors.unexpected_crash.report_issue": "Laporkan masalah",
+ "explore.search_results": "Search results",
+ "explore.suggested_follows": "For you",
+ "explore.title": "Explore",
+ "explore.trending_links": "News",
+ "explore.trending_statuses": "Posts",
+ "explore.trending_tags": "Hashtags",
"follow_recommendations.done": "Selesai",
"follow_recommendations.heading": "Ikuti orang yang anda ingin lihat hantarannya! Di sini ada beberapa cadangan.",
"follow_recommendations.lead": "Hantaran daripada orang yang anda ikuti akan muncul dalam susunan kronologi di suapan rumah anda. Jangan takut melakukan kesilapan, anda boleh nyahikuti orang dengan mudah pada bila-bila masa!",
@@ -284,6 +294,7 @@
"navigation_bar.discover": "Teroka",
"navigation_bar.domain_blocks": "Domain disekat",
"navigation_bar.edit_profile": "Sunting profil",
+ "navigation_bar.explore": "Explore",
"navigation_bar.favourites": "Kegemaran",
"navigation_bar.filters": "Perkataan yang dibisukan",
"navigation_bar.follow_requests": "Permintaan ikutan",
@@ -298,6 +309,7 @@
"navigation_bar.preferences": "Keutamaan",
"navigation_bar.public_timeline": "Garis masa bersekutu",
"navigation_bar.security": "Keselamatan",
+ "notification.admin.sign_up": "{name} signed up",
"notification.favourite": "{name} menggemari hantaran anda",
"notification.follow": "{name} mengikuti anda",
"notification.follow_request": "{name} meminta untuk mengikuti anda",
@@ -306,13 +318,15 @@
"notification.poll": "Sebuah undian yang anda undi telah tamat",
"notification.reblog": "{name} menggalak hantaran anda",
"notification.status": "{name} baru sahaja mengirim hantaran",
+ "notification.update": "{name} edited a post",
"notifications.clear": "Buang pemberitahuan",
"notifications.clear_confirmation": "Adakah anda pasti anda ingin membuang semua pemberitahuan anda secara kekal?",
+ "notifications.column_settings.admin.sign_up": "New sign-ups:",
"notifications.column_settings.alert": "Pemberitahuan atas meja",
"notifications.column_settings.favourite": "Kegemaran:",
"notifications.column_settings.filter_bar.advanced": "Papar semua kategori",
"notifications.column_settings.filter_bar.category": "Bar penapis pantas",
- "notifications.column_settings.filter_bar.show": "Tunjuk",
+ "notifications.column_settings.filter_bar.show_bar": "Show filter bar",
"notifications.column_settings.follow": "Pengikut baharu:",
"notifications.column_settings.follow_request": "Permintaan ikutan baharu:",
"notifications.column_settings.mention": "Sebutan:",
@@ -322,7 +336,9 @@
"notifications.column_settings.show": "Tunjukkan dalam lajur",
"notifications.column_settings.sound": "Mainkan bunyi",
"notifications.column_settings.status": "Hantaran baharu:",
- "notifications.column_settings.unread_markers.category": "Penanda pemberitahuan belum dibaca",
+ "notifications.column_settings.unread_notifications.category": "Unread notifications",
+ "notifications.column_settings.unread_notifications.highlight": "Highlight unread notifications",
+ "notifications.column_settings.update": "Edits:",
"notifications.filter.all": "Semua",
"notifications.filter.boosts": "Galakan",
"notifications.filter.favourites": "Kegemaran",
@@ -362,18 +378,54 @@
"regeneration_indicator.label": "Memuatkan…",
"regeneration_indicator.sublabel": "Suapan rumah anda sedang disediakan!",
"relative_time.days": "{number}h",
+ "relative_time.full.days": "{number, plural, one {# day} other {# days}} ago",
+ "relative_time.full.hours": "{number, plural, one {# hour} other {# hours}} ago",
+ "relative_time.full.just_now": "just now",
+ "relative_time.full.minutes": "{number, plural, one {# minute} other {# minutes}} ago",
+ "relative_time.full.seconds": "{number, plural, one {# second} other {# seconds}} ago",
"relative_time.hours": "{number}j",
"relative_time.just_now": "sekarang",
"relative_time.minutes": "{number}m",
"relative_time.seconds": "{number}s",
"relative_time.today": "hari ini",
"reply_indicator.cancel": "Batal",
+ "report.block": "Block",
+ "report.block_explanation": "You will not see their posts. They will not be able to see your posts or follow you. They will be able to tell that they are blocked.",
+ "report.categories.other": "Other",
+ "report.categories.spam": "Spam",
+ "report.categories.violation": "Content violates one or more server rules",
+ "report.category.subtitle": "Choose the best match",
+ "report.category.title": "Tell us what's going on with this {type}",
+ "report.category.title_account": "profile",
+ "report.category.title_status": "post",
+ "report.close": "Done",
+ "report.comment.title": "Is there anything else you think we should know?",
"report.forward": "Panjangkan ke {target}",
"report.forward_hint": "Akaun ini daripada pelayan lain. Hantar salinan laporan yang ditanpanamakan ke sana juga?",
- "report.hint": "Laporan akan dihantar ke penyederhana pelayan anda. Anda boleh sertakan penerangan kenapa anda laporkan akaun ini di bawah:",
+ "report.mute": "Mute",
+ "report.mute_explanation": "You will not see their posts. They can still follow you and see your posts and will not know that they are muted.",
+ "report.next": "Next",
"report.placeholder": "Ulasan tambahan",
+ "report.reasons.dislike": "I don't like it",
+ "report.reasons.dislike_description": "It is not something you want to see",
+ "report.reasons.other": "It's something else",
+ "report.reasons.other_description": "The issue does not fit into other categories",
+ "report.reasons.spam": "It's spam",
+ "report.reasons.spam_description": "Malicious links, fake engagement, or repetitive replies",
+ "report.reasons.violation": "It violates server rules",
+ "report.reasons.violation_description": "You are aware that it breaks specific rules",
+ "report.rules.subtitle": "Select all that apply",
+ "report.rules.title": "Which rules are being violated?",
+ "report.statuses.subtitle": "Select all that apply",
+ "report.statuses.title": "Are there any posts that back up this report?",
"report.submit": "Serah",
"report.target": "Melaporkan {target}",
+ "report.thanks.take_action": "Here are your options for controlling what you see on Mastodon:",
+ "report.thanks.take_action_actionable": "While we review this, you can take action against @{name}:",
+ "report.thanks.title": "Don't want to see this?",
+ "report.thanks.title_actionable": "Thanks for reporting, we'll look into this.",
+ "report.unfollow": "Unfollow @{name}",
+ "report.unfollow_explanation": "You are following this account. To not see their posts in your home feed anymore, unfollow them.",
"search.placeholder": "Cari",
"search_popout.search_format": "Format gelintar lanjutan",
"search_popout.tips.full_text": "Teks ringkas mengembalikan hantaran yang anda telah tulis, menggemari, menggalak, atau telah disebutkan, dan juga nama pengguna, nama paparan, dan tanda pagar yang dipadankan.",
@@ -382,7 +434,9 @@
"search_popout.tips.text": "Teks ringkas mengembalikan nama paparan, nama pengguna dan tanda pagar yang sepadan",
"search_popout.tips.user": "pengguna",
"search_results.accounts": "Orang",
+ "search_results.all": "All",
"search_results.hashtags": "Tanda pagar",
+ "search_results.nothing_found": "Could not find anything for these search terms",
"search_results.statuses": "Hantaran",
"search_results.statuses_fts_disabled": "Menggelintar hantaran menggunakan kandungannya tidak didayakan di pelayan Mastodon ini.",
"search_results.total": "{count, number} {count, plural, other {hasil}}",
@@ -396,9 +450,14 @@
"status.delete": "Padam",
"status.detailed_status": "Paparan perbualan terperinci",
"status.direct": "Mesej terus @{name}",
+ "status.edit": "Edit",
+ "status.edited": "Edited {date}",
+ "status.edited_x_times": "Edited {count, plural, one {{count} time} other {{count} times}}",
"status.embed": "Benaman",
"status.favourite": "Kegemaran",
"status.filtered": "Ditapis",
+ "status.history.created": "{name} created {date}",
+ "status.history.edited": "{name} edited {date}",
"status.load_more": "Muatkan lagi",
"status.media_hidden": "Media disembunyikan",
"status.mention": "Sebut @{name}",
diff --git a/app/javascript/mastodon/locales/nl.json b/app/javascript/mastodon/locales/nl.json
index c73e5ac0e..f30755286 100644
--- a/app/javascript/mastodon/locales/nl.json
+++ b/app/javascript/mastodon/locales/nl.json
@@ -18,12 +18,12 @@
"account.followers": "Volgers",
"account.followers.empty": "Niemand volgt nog deze gebruiker.",
"account.followers_counter": "{count, plural, one {{counter} volger} other {{counter} volgers}}",
+ "account.following": "Following",
"account.following_counter": "{count, plural, one {{counter} volgend} other {{counter} volgend}}",
"account.follows.empty": "Deze gebruiker volgt nog niemand.",
"account.follows_you": "Volgt jou",
"account.hide_reblogs": "Boosts van @{name} verbergen",
"account.joined": "Geregistreerd in {date}",
- "account.last_status": "Laatst actief",
"account.link_verified_on": "Eigendom van deze link is gecontroleerd op {date}",
"account.locked_info": "De privacystatus van dit account is op besloten gezet. De eigenaar bepaalt handmatig wie hen kan volgen.",
"account.media": "Media",
@@ -32,7 +32,6 @@
"account.mute": "@{name} negeren",
"account.mute_notifications": "Meldingen van @{name} negeren",
"account.muted": "Genegeerd",
- "account.never_active": "Nooit",
"account.posts": "Toots",
"account.posts_with_replies": "Toots en reacties",
"account.report": "@{name} rapporteren",
@@ -42,21 +41,24 @@
"account.statuses_counter": "{count, plural, one {{counter} toot} other {{counter} toots}}",
"account.unblock": "@{name} deblokkeren",
"account.unblock_domain": "{domain} niet langer verbergen",
+ "account.unblock_short": "Unblock",
"account.unendorse": "Niet op profiel weergeven",
"account.unfollow": "Ontvolgen",
"account.unmute": "@{name} niet langer negeren",
"account.unmute_notifications": "Meldingen van @{name} niet langer negeren",
+ "account.unmute_short": "Unmute",
"account_note.placeholder": "Klik om een opmerking toe te voegen",
- "admin.dashboard.retention": "Retention",
- "admin.dashboard.retention.average": "Average",
- "admin.dashboard.retention.cohort": "Sign-up month",
- "admin.dashboard.retention.cohort_size": "New users",
+ "admin.dashboard.daily_retention": "User retention rate by day after sign-up",
+ "admin.dashboard.monthly_retention": "User retention rate by month after sign-up",
+ "admin.dashboard.retention.average": "Gemiddelde",
+ "admin.dashboard.retention.cohort": "Aanmeldingsmaand",
+ "admin.dashboard.retention.cohort_size": "Nieuwe gebruikers",
"alert.rate_limited.message": "Probeer het nog een keer na {retry_time, time, medium}.",
"alert.rate_limited.title": "Beperkt te gebruiken",
"alert.unexpected.message": "Er deed zich een onverwachte fout voor",
"alert.unexpected.title": "Oeps!",
"announcement.announcement": "Mededeling",
- "attachments_list.unprocessed": "(unprocessed)",
+ "attachments_list.unprocessed": "(niet verwerkt)",
"autosuggest_hashtag.per_week": "{count} per week",
"boost_modal.combo": "Je kunt {combo} klikken om dit de volgende keer over te slaan",
"bundle_column_error.body": "Tijdens het laden van dit onderdeel is er iets fout gegaan.",
@@ -104,6 +106,7 @@
"compose_form.poll.switch_to_single": "Poll wijzigen om een enkele keuze toe te staan",
"compose_form.publish": "Toot",
"compose_form.publish_loud": "{publish}!",
+ "compose_form.save_changes": "Save changes",
"compose_form.sensitive.hide": "{count, plural, one {Media als gevoelig markeren} other {Media als gevoelig markeren}}",
"compose_form.sensitive.marked": "{count, plural, one {Media is als gevoelig gemarkeerd} other {Media is als gevoelig gemarkeerd}}",
"compose_form.sensitive.unmarked": "{count, plural, one {Media is niet als gevoelig gemarkeerd} other {Media is niet als gevoelig gemarkeerd}}",
@@ -118,8 +121,8 @@
"confirmations.delete.message": "Weet je het zeker dat je deze toot wilt verwijderen?",
"confirmations.delete_list.confirm": "Verwijderen",
"confirmations.delete_list.message": "Weet je zeker dat je deze lijst definitief wilt verwijderen?",
- "confirmations.discard_edit_media.confirm": "Discard",
- "confirmations.discard_edit_media.message": "You have unsaved changes to the media description or preview, discard them anyway?",
+ "confirmations.discard_edit_media.confirm": "Weggooien",
+ "confirmations.discard_edit_media.message": "Je hebt niet-opgeslagen wijzigingen in de mediabeschrijving of voorvertonning, wil je deze toch weggooien?",
"confirmations.domain_block.confirm": "Verberg alles van deze server",
"confirmations.domain_block.message": "Weet je het echt heel erg zeker dat je alles van {domain} wilt negeren? In de meeste gevallen is het blokkeren of negeren van een paar specifieke personen voldoende en beter. Je zult geen toots van deze server op openbare tijdlijnen zien of in jouw meldingen. Jouw volgers van deze server worden verwijderd.",
"confirmations.logout.confirm": "Uitloggen",
@@ -165,6 +168,7 @@
"empty_column.community": "De lokale tijdlijn is nog leeg. Toot iets in het openbaar om de spits af te bijten!",
"empty_column.direct": "Je hebt nog geen directe berichten. Wanneer je er een verzend of ontvangt, zijn deze hier te zien.",
"empty_column.domain_blocks": "Er zijn nog geen geblokkeerde domeinen.",
+ "empty_column.explore_statuses": "Nothing is trending right now. Check back later!",
"empty_column.favourited_statuses": "Jij hebt nog geen favoriete toots. Wanneer je er een aan jouw favorieten toevoegt, valt deze hier te zien.",
"empty_column.favourites": "Niemand heeft deze toot nog aan hun favorieten toegevoegd. Wanneer iemand dit doet, valt dat hier te zien.",
"empty_column.follow_recommendations": "Het lijkt er op dat er geen aanbevelingen voor jou aangemaakt kunnen worden. Je kunt proberen te zoeken naar mensen die je wellicht kent, zoeken op hashtags, de lokale en globale tijdlijnen bekijken of de gebruikersgids doorbladeren.",
@@ -183,6 +187,12 @@
"error.unexpected_crash.next_steps_addons": "Probeer deze uit te schakelen en de pagina te verversen. Wanneer dat niet helpt, kun je Mastodon nog altijd met een andere webbrowser of mobiele app gebruiken.",
"errors.unexpected_crash.copy_stacktrace": "Stacktrace naar klembord kopiëren",
"errors.unexpected_crash.report_issue": "Technisch probleem melden",
+ "explore.search_results": "Search results",
+ "explore.suggested_follows": "For you",
+ "explore.title": "Explore",
+ "explore.trending_links": "News",
+ "explore.trending_statuses": "Posts",
+ "explore.trending_tags": "Hashtags",
"follow_recommendations.done": "Klaar",
"follow_recommendations.heading": "Volg mensen waarvan je graag toots wil zien! Hier zijn enkele aanbevelingen.",
"follow_recommendations.lead": "Toots van mensen die je volgt zullen in chronologische volgorde onder start verschijnen. Wees niet bang om hierin fouten te maken, want je kunt mensen op elk moment net zo eenvoudig ontvolgen!",
@@ -284,6 +294,7 @@
"navigation_bar.discover": "Ontdekken",
"navigation_bar.domain_blocks": "Geblokkeerde domeinen",
"navigation_bar.edit_profile": "Profiel bewerken",
+ "navigation_bar.explore": "Explore",
"navigation_bar.favourites": "Favorieten",
"navigation_bar.filters": "Filters",
"navigation_bar.follow_requests": "Volgverzoeken",
@@ -298,6 +309,7 @@
"navigation_bar.preferences": "Instellingen",
"navigation_bar.public_timeline": "Globale tijdlijn",
"navigation_bar.security": "Beveiliging",
+ "notification.admin.sign_up": "{name} signed up",
"notification.favourite": "{name} voegde jouw toot als favoriet toe",
"notification.follow": "{name} volgt jou nu",
"notification.follow_request": "{name} wil jou graag volgen",
@@ -306,13 +318,15 @@
"notification.poll": "Een poll waaraan jij hebt meegedaan is beëindigd",
"notification.reblog": "{name} boostte jouw toot",
"notification.status": "{name} heeft zojuist een toot geplaatst",
+ "notification.update": "{name} edited a post",
"notifications.clear": "Meldingen verwijderen",
"notifications.clear_confirmation": "Weet je het zeker dat je al jouw meldingen wilt verwijderen?",
+ "notifications.column_settings.admin.sign_up": "New sign-ups:",
"notifications.column_settings.alert": "Desktopmeldingen",
"notifications.column_settings.favourite": "Favorieten:",
"notifications.column_settings.filter_bar.advanced": "Alle categorieën tonen",
"notifications.column_settings.filter_bar.category": "Snelle filterbalk",
- "notifications.column_settings.filter_bar.show": "Tonen",
+ "notifications.column_settings.filter_bar.show_bar": "Filterbalk tonen",
"notifications.column_settings.follow": "Nieuwe volgers:",
"notifications.column_settings.follow_request": "Nieuw volgverzoek:",
"notifications.column_settings.mention": "Vermeldingen:",
@@ -322,7 +336,9 @@
"notifications.column_settings.show": "In kolom tonen",
"notifications.column_settings.sound": "Geluid afspelen",
"notifications.column_settings.status": "Nieuwe toots:",
- "notifications.column_settings.unread_markers.category": "Markeringen voor ongelezen meldingen",
+ "notifications.column_settings.unread_notifications.category": "Ongelezen meldingen",
+ "notifications.column_settings.unread_notifications.highlight": "Ongelezen meldingen markeren",
+ "notifications.column_settings.update": "Edits:",
"notifications.filter.all": "Alles",
"notifications.filter.boosts": "Boosts",
"notifications.filter.favourites": "Favorieten",
@@ -346,7 +362,7 @@
"poll.total_votes": "{count, plural, one {# stem} other {# stemmen}}",
"poll.vote": "Stemmen",
"poll.voted": "Je hebt hier op gestemd",
- "poll.votes": "{votes, plural, one {# vote} other {# votes}}",
+ "poll.votes": "{votes, plural, one {# stem} other {# stemmen}}",
"poll_button.add_poll": "Poll toevoegen",
"poll_button.remove_poll": "Poll verwijderen",
"privacy.change": "Zichtbaarheid van toot aanpassen",
@@ -362,18 +378,54 @@
"regeneration_indicator.label": "Aan het laden…",
"regeneration_indicator.sublabel": "Jouw tijdlijn wordt aangemaakt!",
"relative_time.days": "{number}d",
+ "relative_time.full.days": "{number, plural, one {# day} other {# days}} ago",
+ "relative_time.full.hours": "{number, plural, one {# hour} other {# hours}} ago",
+ "relative_time.full.just_now": "just now",
+ "relative_time.full.minutes": "{number, plural, one {# minute} other {# minutes}} ago",
+ "relative_time.full.seconds": "{number, plural, one {# second} other {# seconds}} ago",
"relative_time.hours": "{number}u",
"relative_time.just_now": "nu",
"relative_time.minutes": "{number}m",
"relative_time.seconds": "{number}s",
"relative_time.today": "vandaag",
"reply_indicator.cancel": "Annuleren",
+ "report.block": "Block",
+ "report.block_explanation": "You will not see their posts. They will not be able to see your posts or follow you. They will be able to tell that they are blocked.",
+ "report.categories.other": "Other",
+ "report.categories.spam": "Spam",
+ "report.categories.violation": "Content violates one or more server rules",
+ "report.category.subtitle": "Choose the best match",
+ "report.category.title": "Tell us what's going on with this {type}",
+ "report.category.title_account": "profile",
+ "report.category.title_status": "post",
+ "report.close": "Done",
+ "report.comment.title": "Is there anything else you think we should know?",
"report.forward": "Naar {target} doorsturen",
"report.forward_hint": "Het account bevindt zich op een andere server. Wil je daar eveneens een geanonimiseerde kopie van deze rapportage naar toe sturen?",
- "report.hint": "De rapportage wordt naar de moderator(en) van jouw server gestuurd. Je kunt hieronder een uitleg geven waarom je dit account rapporteert:",
+ "report.mute": "Mute",
+ "report.mute_explanation": "You will not see their posts. They can still follow you and see your posts and will not know that they are muted.",
+ "report.next": "Next",
"report.placeholder": "Extra opmerkingen",
+ "report.reasons.dislike": "I don't like it",
+ "report.reasons.dislike_description": "It is not something you want to see",
+ "report.reasons.other": "It's something else",
+ "report.reasons.other_description": "The issue does not fit into other categories",
+ "report.reasons.spam": "It's spam",
+ "report.reasons.spam_description": "Malicious links, fake engagement, or repetitive replies",
+ "report.reasons.violation": "It violates server rules",
+ "report.reasons.violation_description": "You are aware that it breaks specific rules",
+ "report.rules.subtitle": "Select all that apply",
+ "report.rules.title": "Which rules are being violated?",
+ "report.statuses.subtitle": "Select all that apply",
+ "report.statuses.title": "Are there any posts that back up this report?",
"report.submit": "Verzenden",
"report.target": "{target} rapporteren",
+ "report.thanks.take_action": "Here are your options for controlling what you see on Mastodon:",
+ "report.thanks.take_action_actionable": "While we review this, you can take action against @{name}:",
+ "report.thanks.title": "Don't want to see this?",
+ "report.thanks.title_actionable": "Thanks for reporting, we'll look into this.",
+ "report.unfollow": "Unfollow @{name}",
+ "report.unfollow_explanation": "You are following this account. To not see their posts in your home feed anymore, unfollow them.",
"search.placeholder": "Zoeken",
"search_popout.search_format": "Geavanceerd zoeken",
"search_popout.tips.full_text": "Gebruik gewone tekst om te zoeken in jouw toots, gebooste toots, favorieten en in toots waarin je bent vermeldt, en tevens naar gebruikersnamen, weergavenamen en hashtags.",
@@ -382,7 +434,9 @@
"search_popout.tips.text": "Gebruik gewone tekst om te zoeken op weergavenamen, gebruikersnamen en hashtags",
"search_popout.tips.user": "gebruiker",
"search_results.accounts": "Gebruikers",
+ "search_results.all": "All",
"search_results.hashtags": "Hashtags",
+ "search_results.nothing_found": "Could not find anything for these search terms",
"search_results.statuses": "Toots",
"search_results.statuses_fts_disabled": "Het zoeken in toots is op deze Mastodon-server niet ingeschakeld.",
"search_results.total": "{count, number} {count, plural, one {resultaat} other {resultaten}}",
@@ -396,9 +450,14 @@
"status.delete": "Verwijderen",
"status.detailed_status": "Uitgebreide gespreksweergave",
"status.direct": "@{name} een direct bericht sturen",
+ "status.edit": "Edit",
+ "status.edited": "Edited {date}",
+ "status.edited_x_times": "Edited {count, plural, one {{count} time} other {{count} times}}",
"status.embed": "Insluiten",
"status.favourite": "Favoriet",
"status.filtered": "Gefilterd",
+ "status.history.created": "{name} created {date}",
+ "status.history.edited": "{name} edited {date}",
"status.load_more": "Meer laden",
"status.media_hidden": "Media verborgen",
"status.mention": "@{name} vermelden",
@@ -462,7 +521,7 @@
"upload_form.video_description": "Omschrijf dit voor mensen met een auditieve of visuele beperking",
"upload_modal.analyzing_picture": "Afbeelding analyseren…",
"upload_modal.apply": "Toepassen",
- "upload_modal.applying": "Applying…",
+ "upload_modal.applying": "Aan het toepassen…",
"upload_modal.choose_image": "Kies een afbeelding",
"upload_modal.description_placeholder": "Pa's wijze lynx bezag vroom het fikse aquaduct",
"upload_modal.detect_text": "Tekst in een afbeelding detecteren",
diff --git a/app/javascript/mastodon/locales/nn.json b/app/javascript/mastodon/locales/nn.json
index cfd9aaca9..40a961c5e 100644
--- a/app/javascript/mastodon/locales/nn.json
+++ b/app/javascript/mastodon/locales/nn.json
@@ -18,12 +18,12 @@
"account.followers": "Fylgjarar",
"account.followers.empty": "Ingen fylgjer denne brukaren enno.",
"account.followers_counter": "{count, plural, one {{counter} fylgjar} other {{counter} fylgjarar}}",
+ "account.following": "Following",
"account.following_counter": "{count, plural, one {{counter} fylgjar} other {{counter} fylgjar}}",
"account.follows.empty": "Denne brukaren fylgjer ikkje nokon enno.",
"account.follows_you": "Fylgjer deg",
"account.hide_reblogs": "Gøym fremhevingar frå @{name}",
- "account.joined": "Ble med den {date}",
- "account.last_status": "Sist aktiv",
+ "account.joined": "Vart med {date}",
"account.link_verified_on": "Eigarskap for denne lenkja vart sist sjekka {date}",
"account.locked_info": "Denne kontoen er privat. Eigaren kan sjølv velja kven som kan fylgja han.",
"account.media": "Media",
@@ -32,7 +32,6 @@
"account.mute": "Målbind @{name}",
"account.mute_notifications": "Målbind varsel frå @{name}",
"account.muted": "Målbunden",
- "account.never_active": "Aldri",
"account.posts": "Tut",
"account.posts_with_replies": "Tut og svar",
"account.report": "Rapporter @{name}",
@@ -42,15 +41,18 @@
"account.statuses_counter": "{count, plural, one {{counter} tut} other {{counter} tut}}",
"account.unblock": "Slutt å blokera @{name}",
"account.unblock_domain": "Vis {domain}",
+ "account.unblock_short": "Unblock",
"account.unendorse": "Ikkje framhev på profil",
"account.unfollow": "Slutt å fylgja",
"account.unmute": "Av-demp @{name}",
"account.unmute_notifications": "Vis varsel frå @{name}",
+ "account.unmute_short": "Unmute",
"account_note.placeholder": "Klikk for å leggja til merknad",
- "admin.dashboard.retention": "Retention",
+ "admin.dashboard.daily_retention": "User retention rate by day after sign-up",
+ "admin.dashboard.monthly_retention": "User retention rate by month after sign-up",
"admin.dashboard.retention.average": "Average",
"admin.dashboard.retention.cohort": "Sign-up month",
- "admin.dashboard.retention.cohort_size": "New users",
+ "admin.dashboard.retention.cohort_size": "Nye brukere",
"alert.rate_limited.message": "Ver venleg å prøva igjen etter {retry_time, time, medium}.",
"alert.rate_limited.title": "Begrensa rate",
"alert.unexpected.message": "Eit uventa problem oppstod.",
@@ -104,6 +106,7 @@
"compose_form.poll.switch_to_single": "Endra avstemninga til tillate berre eitt val",
"compose_form.publish": "Tut",
"compose_form.publish_loud": "{publish}!",
+ "compose_form.save_changes": "Save changes",
"compose_form.sensitive.hide": "Merk medium som sensitivt",
"compose_form.sensitive.marked": "Medium er markert som sensitivt",
"compose_form.sensitive.unmarked": "Medium er ikkje merka som sensitivt",
@@ -118,7 +121,7 @@
"confirmations.delete.message": "Er du sikker på at du vil sletta denne statusen?",
"confirmations.delete_list.confirm": "Slett",
"confirmations.delete_list.message": "Er du sikker på at du vil sletta denne lista for alltid?",
- "confirmations.discard_edit_media.confirm": "Discard",
+ "confirmations.discard_edit_media.confirm": "Forkast",
"confirmations.discard_edit_media.message": "You have unsaved changes to the media description or preview, discard them anyway?",
"confirmations.domain_block.confirm": "Gøym heile domenet",
"confirmations.domain_block.message": "Er du heilt, heilt sikker på at du vil blokkera heile {domain}? I dei fleste tilfelle er det godt nok og føretrekt med nokre få målretta blokkeringar eller målbindingar. Du kjem ikkje til å sjå innhald frå det domenet i nokon fødererte tidsliner eller i varsla dine. Fylgjarane dine frå det domenet vert fjerna.",
@@ -165,6 +168,7 @@
"empty_column.community": "Den lokale samtiden er tom. Skriv noko offentleg å få ballen til å rulle!",
"empty_column.direct": "Du har ingen direktemeldingar ennå. Når du sender eller får ein vil den dukke opp her.",
"empty_column.domain_blocks": "Det er ingen gøymde domene ennå.",
+ "empty_column.explore_statuses": "Nothing is trending right now. Check back later!",
"empty_column.favourited_statuses": "Du har ingen favoritt-tut ennå. Når du merkjer ein som favoritt, så dukkar det opp her.",
"empty_column.favourites": "Ingen har merkt dette tutet som favoritt enno. Når nokon gjer det, så dukkar det opp her.",
"empty_column.follow_recommendations": "Ser ut som at det ikke finnes noen forslag for deg. Du kan prøve å bruke søk for å se etter folk du kan vite eller utforske trendende hashtags.",
@@ -183,7 +187,13 @@
"error.unexpected_crash.next_steps_addons": "Prøv å deaktivere dem og laste siden på nytt. Hvis det ikke hjelper, kan du fremdeles bruke Mastodon via en annen nettleser eller en annen app.",
"errors.unexpected_crash.copy_stacktrace": "Kopier stacktrace til utklippstavla",
"errors.unexpected_crash.report_issue": "Rapporter problem",
- "follow_recommendations.done": "Utført",
+ "explore.search_results": "Search results",
+ "explore.suggested_follows": "For you",
+ "explore.title": "Explore",
+ "explore.trending_links": "News",
+ "explore.trending_statuses": "Posts",
+ "explore.trending_tags": "Hashtags",
+ "follow_recommendations.done": "Ferdig",
"follow_recommendations.heading": "Følg folk du ønsker å se innlegg fra! Her er noen forslag.",
"follow_recommendations.lead": "Innlegg fra mennesker du følger vil vises i kronologisk rekkefølge på hjemmefeed. Ikke vær redd for å gjøre feil, du kan slutte å følge folk like enkelt som alt!",
"follow_request.authorize": "Autoriser",
@@ -263,7 +273,7 @@
"lists.new.title_placeholder": "Ny listetittel",
"lists.replies_policy.followed": "Enhver fulgt bruker",
"lists.replies_policy.list": "Medlemmer i listen",
- "lists.replies_policy.none": "Ingen",
+ "lists.replies_policy.none": "Ikkje nokon",
"lists.replies_policy.title": "Vis svar på:",
"lists.search": "Søk gjennom folk du følgjer",
"lists.subheading": "Dine lister",
@@ -284,6 +294,7 @@
"navigation_bar.discover": "Oppdag",
"navigation_bar.domain_blocks": "Skjulte domene",
"navigation_bar.edit_profile": "Rediger profil",
+ "navigation_bar.explore": "Explore",
"navigation_bar.favourites": "Favorittar",
"navigation_bar.filters": "Målbundne ord",
"navigation_bar.follow_requests": "Fylgjeførespurnader",
@@ -298,6 +309,7 @@
"navigation_bar.preferences": "Innstillingar",
"navigation_bar.public_timeline": "Føderert tidsline",
"navigation_bar.security": "Tryggleik",
+ "notification.admin.sign_up": "{name} signed up",
"notification.favourite": "{name} merkte statusen din som favoritt",
"notification.follow": "{name} fylgde deg",
"notification.follow_request": "{name} har bedt om å fylgja deg",
@@ -306,13 +318,15 @@
"notification.poll": "Ei rundspørjing du har røysta i er ferdig",
"notification.reblog": "{name} framheva statusen din",
"notification.status": "{name} la nettopp ut",
+ "notification.update": "{name} edited a post",
"notifications.clear": "Tøm varsel",
"notifications.clear_confirmation": "Er du sikker på at du vil fjerna alle varsla dine for alltid?",
+ "notifications.column_settings.admin.sign_up": "New sign-ups:",
"notifications.column_settings.alert": "Skrivebordsvarsel",
"notifications.column_settings.favourite": "Favorittar:",
"notifications.column_settings.filter_bar.advanced": "Vis alle kategoriar",
"notifications.column_settings.filter_bar.category": "Snarfilterlinje",
- "notifications.column_settings.filter_bar.show": "Vis",
+ "notifications.column_settings.filter_bar.show_bar": "Show filter bar",
"notifications.column_settings.follow": "Nye fylgjarar:",
"notifications.column_settings.follow_request": "Ny fylgjarførespurnader:",
"notifications.column_settings.mention": "Nemningar:",
@@ -322,7 +336,9 @@
"notifications.column_settings.show": "Vis i kolonne",
"notifications.column_settings.sound": "Spel av lyd",
"notifications.column_settings.status": "Nye tuter:",
- "notifications.column_settings.unread_markers.category": "Ulest meldingsmarkører",
+ "notifications.column_settings.unread_notifications.category": "Unread notifications",
+ "notifications.column_settings.unread_notifications.highlight": "Highlight unread notifications",
+ "notifications.column_settings.update": "Edits:",
"notifications.filter.all": "Alle",
"notifications.filter.boosts": "Framhevingar",
"notifications.filter.favourites": "Favorittar",
@@ -362,18 +378,54 @@
"regeneration_indicator.label": "Lastar…",
"regeneration_indicator.sublabel": "Heimetidslinja di vert førebudd!",
"relative_time.days": "{number}dg",
+ "relative_time.full.days": "{number, plural, one {# day} other {# days}} ago",
+ "relative_time.full.hours": "{number, plural, one {# hour} other {# hours}} ago",
+ "relative_time.full.just_now": "just now",
+ "relative_time.full.minutes": "{number, plural, one {# minute} other {# minutes}} ago",
+ "relative_time.full.seconds": "{number, plural, one {# second} other {# seconds}} ago",
"relative_time.hours": "{number}t",
"relative_time.just_now": "nå",
"relative_time.minutes": "{number}min",
"relative_time.seconds": "{number}sek",
"relative_time.today": "i dag",
"reply_indicator.cancel": "Avbryt",
+ "report.block": "Block",
+ "report.block_explanation": "You will not see their posts. They will not be able to see your posts or follow you. They will be able to tell that they are blocked.",
+ "report.categories.other": "Other",
+ "report.categories.spam": "Spam",
+ "report.categories.violation": "Content violates one or more server rules",
+ "report.category.subtitle": "Choose the best match",
+ "report.category.title": "Tell us what's going on with this {type}",
+ "report.category.title_account": "profile",
+ "report.category.title_status": "post",
+ "report.close": "Done",
+ "report.comment.title": "Is there anything else you think we should know?",
"report.forward": "Vidaresend til {target}",
"report.forward_hint": "Kontoen er frå ein annan tenar. Vil du senda ein anonymisert kopi av rapporten dit òg?",
- "report.hint": "Rapporten vil verte sendt til dine tenarmoderatorar. Du kan oppgje ei forklaring på kvifor du rapporterer denne kontoen, under:",
+ "report.mute": "Mute",
+ "report.mute_explanation": "You will not see their posts. They can still follow you and see your posts and will not know that they are muted.",
+ "report.next": "Next",
"report.placeholder": "Tilleggskommentarar",
+ "report.reasons.dislike": "I don't like it",
+ "report.reasons.dislike_description": "It is not something you want to see",
+ "report.reasons.other": "It's something else",
+ "report.reasons.other_description": "The issue does not fit into other categories",
+ "report.reasons.spam": "It's spam",
+ "report.reasons.spam_description": "Malicious links, fake engagement, or repetitive replies",
+ "report.reasons.violation": "It violates server rules",
+ "report.reasons.violation_description": "You are aware that it breaks specific rules",
+ "report.rules.subtitle": "Select all that apply",
+ "report.rules.title": "Which rules are being violated?",
+ "report.statuses.subtitle": "Select all that apply",
+ "report.statuses.title": "Are there any posts that back up this report?",
"report.submit": "Send inn",
"report.target": "Rapporterer {target}",
+ "report.thanks.take_action": "Here are your options for controlling what you see on Mastodon:",
+ "report.thanks.take_action_actionable": "While we review this, you can take action against @{name}:",
+ "report.thanks.title": "Don't want to see this?",
+ "report.thanks.title_actionable": "Thanks for reporting, we'll look into this.",
+ "report.unfollow": "Unfollow @{name}",
+ "report.unfollow_explanation": "You are following this account. To not see their posts in your home feed anymore, unfollow them.",
"search.placeholder": "Søk",
"search_popout.search_format": "Avansert søkeformat",
"search_popout.tips.full_text": "Enkel tekst returnerer statusar du har skrive, likt, framheva eller vorte nemnd i, i tillegg til samsvarande brukarnamn, visningsnamn og emneknaggar.",
@@ -382,7 +434,9 @@
"search_popout.tips.text": "Enkel tekst returnerer samsvarande visningsnamn, brukarnamn og emneknaggar",
"search_popout.tips.user": "brukar",
"search_results.accounts": "Folk",
+ "search_results.all": "All",
"search_results.hashtags": "Emneknaggar",
+ "search_results.nothing_found": "Could not find anything for these search terms",
"search_results.statuses": "Tut",
"search_results.statuses_fts_disabled": "På denne Matsodon-tenaren kan du ikkje søkja på tut etter innhaldet deira.",
"search_results.total": "{count, number} {count, plural, one {treff} other {treff}}",
@@ -396,9 +450,14 @@
"status.delete": "Slett",
"status.detailed_status": "Detaljert samtalevisning",
"status.direct": "Send melding til @{name}",
+ "status.edit": "Edit",
+ "status.edited": "Edited {date}",
+ "status.edited_x_times": "Edited {count, plural, one {{count} time} other {{count} times}}",
"status.embed": "Bygg inn",
"status.favourite": "Favoritt",
"status.filtered": "Filtrert",
+ "status.history.created": "{name} created {date}",
+ "status.history.edited": "{name} edited {date}",
"status.load_more": "Last inn meir",
"status.media_hidden": "Medium gøymd",
"status.mention": "Nemn @{name}",
@@ -444,7 +503,7 @@
"timeline_hint.resources.followers": "Fylgjarar",
"timeline_hint.resources.follows": "Fylgjer",
"timeline_hint.resources.statuses": "Eldre tut",
- "trends.counter_by_accounts": "{count, plural, one {{counter} person} other {{counter} folk}} pratar",
+ "trends.counter_by_accounts": "Pratas om av {count, plural, one {{counter} person} other {{counter} folk}}",
"trends.trending_now": "Populært no",
"ui.beforeunload": "Kladden din forsvinn om du forlèt Mastodon no.",
"units.short.billion": "{count}m.ard",
@@ -468,7 +527,7 @@
"upload_modal.detect_text": "Gjenkjenn tekst i biletet",
"upload_modal.edit_media": "Rediger medium",
"upload_modal.hint": "Klikk og dra sirkelen på førehandsvisninga for å velge fokuspunktet som alltid vil vere synleg på alle miniatyrbileta.",
- "upload_modal.preparing_ocr": "Forbereder OCR…",
+ "upload_modal.preparing_ocr": "Førebur OCR…",
"upload_modal.preview_label": "Førehandsvis ({ratio})",
"upload_progress.label": "Lastar opp...",
"video.close": "Lukk video",
diff --git a/app/javascript/mastodon/locales/no.json b/app/javascript/mastodon/locales/no.json
index 179bbd1bd..e4474f6d9 100644
--- a/app/javascript/mastodon/locales/no.json
+++ b/app/javascript/mastodon/locales/no.json
@@ -18,12 +18,12 @@
"account.followers": "Følgere",
"account.followers.empty": "Ingen følger denne brukeren ennå.",
"account.followers_counter": "{count, plural, one {{counter} følger} other {{counter} følgere}}",
+ "account.following": "Following",
"account.following_counter": "{count, plural, one {{counter} som følges} other {{counter} som følges}}",
"account.follows.empty": "Denne brukeren følger ikke noen enda.",
"account.follows_you": "Følger deg",
"account.hide_reblogs": "Skjul fremhevinger fra @{name}",
"account.joined": "Ble med den {date}",
- "account.last_status": "Sist aktiv",
"account.link_verified_on": "Eierskap av denne lenken ble sjekket {date}",
"account.locked_info": "Denne kontoens personvernstatus er satt til låst. Eieren vurderer manuelt hvem som kan følge dem.",
"account.media": "Media",
@@ -32,7 +32,6 @@
"account.mute": "Demp @{name}",
"account.mute_notifications": "Ignorer varsler fra @{name}",
"account.muted": "Dempet",
- "account.never_active": "Aldri",
"account.posts": "Innlegg",
"account.posts_with_replies": "Toots with replies",
"account.report": "Rapportér @{name}",
@@ -42,15 +41,18 @@
"account.statuses_counter": "{count, plural, one {{counter} tut} other {{counter} tuter}}",
"account.unblock": "Avblokker @{name}",
"account.unblock_domain": "Vis {domain}",
+ "account.unblock_short": "Unblock",
"account.unendorse": "Ikke vis frem på profilen",
"account.unfollow": "Avfølg",
"account.unmute": "Avdemp @{name}",
"account.unmute_notifications": "Vis varsler fra @{name}",
+ "account.unmute_short": "Unmute",
"account_note.placeholder": "Klikk for å legge til et notat",
- "admin.dashboard.retention": "Retention",
+ "admin.dashboard.daily_retention": "User retention rate by day after sign-up",
+ "admin.dashboard.monthly_retention": "User retention rate by month after sign-up",
"admin.dashboard.retention.average": "Average",
"admin.dashboard.retention.cohort": "Sign-up month",
- "admin.dashboard.retention.cohort_size": "New users",
+ "admin.dashboard.retention.cohort_size": "Nye brukere",
"alert.rate_limited.message": "Vennligst prøv igjen etter kl. {retry_time, time, medium}.",
"alert.rate_limited.title": "Hastighetsbegrenset",
"alert.unexpected.message": "En uventet feil oppstod.",
@@ -104,6 +106,7 @@
"compose_form.poll.switch_to_single": "Endre avstemning til å tillate ett valg",
"compose_form.publish": "Tut",
"compose_form.publish_loud": "{publish}!",
+ "compose_form.save_changes": "Save changes",
"compose_form.sensitive.hide": "Merk media som sensitivt",
"compose_form.sensitive.marked": "Mediet er merket som sensitiv",
"compose_form.sensitive.unmarked": "Mediet er ikke merket som sensitiv",
@@ -118,7 +121,7 @@
"confirmations.delete.message": "Er du sikker på at du vil slette denne statusen?",
"confirmations.delete_list.confirm": "Slett",
"confirmations.delete_list.message": "Er du sikker på at du vil slette denne listen permanent?",
- "confirmations.discard_edit_media.confirm": "Discard",
+ "confirmations.discard_edit_media.confirm": "Forkast",
"confirmations.discard_edit_media.message": "You have unsaved changes to the media description or preview, discard them anyway?",
"confirmations.domain_block.confirm": "Skjul alt fra domenet",
"confirmations.domain_block.message": "Er du sikker på at du vil skjule hele domenet {domain}? I de fleste tilfeller er det bedre med målrettet blokkering eller demping.",
@@ -165,6 +168,7 @@
"empty_column.community": "Den lokale tidslinjen er tom. Skriv noe offentlig for å få snøballen til å rulle!",
"empty_column.direct": "Du har ingen direktemeldinger enda. Når du mottar eller sender en, vil den dukke opp her.",
"empty_column.domain_blocks": "Det er ingen skjulte domener enda.",
+ "empty_column.explore_statuses": "Nothing is trending right now. Check back later!",
"empty_column.favourited_statuses": "Du har ikke likt noen tuter enda. Når du liker en, vil den dukke opp her.",
"empty_column.favourites": "Ingen har likt denne tuten enda. Når noen gjør det, vil de dukke opp her.",
"empty_column.follow_recommendations": "Ser ut som at det ikke finnes noen forslag for deg. Du kan prøve å bruke søk for å se etter folk du kan vite eller utforske trendende hashtags.",
@@ -183,6 +187,12 @@
"error.unexpected_crash.next_steps_addons": "Prøv å deaktivere dem og laste siden på nytt. Hvis det ikke hjelper, kan du fremdeles bruke Mastodon via en annen nettleser eller en annen app.",
"errors.unexpected_crash.copy_stacktrace": "Kopier stacktrace-en til utklippstavlen",
"errors.unexpected_crash.report_issue": "Rapporter en feil",
+ "explore.search_results": "Search results",
+ "explore.suggested_follows": "For you",
+ "explore.title": "Explore",
+ "explore.trending_links": "News",
+ "explore.trending_statuses": "Posts",
+ "explore.trending_tags": "Hashtags",
"follow_recommendations.done": "Utført",
"follow_recommendations.heading": "Følg folk du ønsker å se innlegg fra! Her er noen forslag.",
"follow_recommendations.lead": "Innlegg fra mennesker du følger vil vises i kronologisk rekkefølge på hjemmefeed. Ikke vær redd for å gjøre feil, du kan slutte å følge folk like enkelt som alt!",
@@ -284,6 +294,7 @@
"navigation_bar.discover": "Oppdag",
"navigation_bar.domain_blocks": "Skjulte domener",
"navigation_bar.edit_profile": "Rediger profil",
+ "navigation_bar.explore": "Explore",
"navigation_bar.favourites": "Favoritter",
"navigation_bar.filters": "Stilnede ord",
"navigation_bar.follow_requests": "Følgeforespørsler",
@@ -298,6 +309,7 @@
"navigation_bar.preferences": "Innstillinger",
"navigation_bar.public_timeline": "Felles tidslinje",
"navigation_bar.security": "Sikkerhet",
+ "notification.admin.sign_up": "{name} signed up",
"notification.favourite": "{name} likte din status",
"notification.follow": "{name} fulgte deg",
"notification.follow_request": "{name} har bedt om å få følge deg",
@@ -306,13 +318,15 @@
"notification.poll": "En avstemning du har stemt på har avsluttet",
"notification.reblog": "{name} fremhevde din status",
"notification.status": "{name} la nettopp ut",
+ "notification.update": "{name} edited a post",
"notifications.clear": "Fjern varsler",
"notifications.clear_confirmation": "Er du sikker på at du vil fjerne alle dine varsler permanent?",
+ "notifications.column_settings.admin.sign_up": "New sign-ups:",
"notifications.column_settings.alert": "Skrivebordsvarslinger",
"notifications.column_settings.favourite": "Likt:",
"notifications.column_settings.filter_bar.advanced": "Vis alle kategorier",
"notifications.column_settings.filter_bar.category": "Hurtigfiltreringslinje",
- "notifications.column_settings.filter_bar.show": "Vis",
+ "notifications.column_settings.filter_bar.show_bar": "Show filter bar",
"notifications.column_settings.follow": "Nye følgere:",
"notifications.column_settings.follow_request": "Nye følgerforespørsler:",
"notifications.column_settings.mention": "Nevnt:",
@@ -322,7 +336,9 @@
"notifications.column_settings.show": "Vis i kolonne",
"notifications.column_settings.sound": "Spill lyd",
"notifications.column_settings.status": "Nye tuter:",
- "notifications.column_settings.unread_markers.category": "Ulest meldingsmarkører",
+ "notifications.column_settings.unread_notifications.category": "Unread notifications",
+ "notifications.column_settings.unread_notifications.highlight": "Highlight unread notifications",
+ "notifications.column_settings.update": "Edits:",
"notifications.filter.all": "Alle",
"notifications.filter.boosts": "Fremhevinger",
"notifications.filter.favourites": "Favoritter",
@@ -362,18 +378,54 @@
"regeneration_indicator.label": "Laster…",
"regeneration_indicator.sublabel": "Dine startside forberedes!",
"relative_time.days": "{number}d",
+ "relative_time.full.days": "{number, plural, one {# day} other {# days}} ago",
+ "relative_time.full.hours": "{number, plural, one {# hour} other {# hours}} ago",
+ "relative_time.full.just_now": "just now",
+ "relative_time.full.minutes": "{number, plural, one {# minute} other {# minutes}} ago",
+ "relative_time.full.seconds": "{number, plural, one {# second} other {# seconds}} ago",
"relative_time.hours": "{number}t",
"relative_time.just_now": "nå",
"relative_time.minutes": "{number}m",
"relative_time.seconds": "{number}s",
"relative_time.today": "i dag",
"reply_indicator.cancel": "Avbryt",
+ "report.block": "Block",
+ "report.block_explanation": "You will not see their posts. They will not be able to see your posts or follow you. They will be able to tell that they are blocked.",
+ "report.categories.other": "Other",
+ "report.categories.spam": "Spam",
+ "report.categories.violation": "Content violates one or more server rules",
+ "report.category.subtitle": "Choose the best match",
+ "report.category.title": "Tell us what's going on with this {type}",
+ "report.category.title_account": "profile",
+ "report.category.title_status": "post",
+ "report.close": "Done",
+ "report.comment.title": "Is there anything else you think we should know?",
"report.forward": "Videresend til {target}",
"report.forward_hint": "Denne kontoen er fra en annen tjener. Vil du sende en anonymisert kopi av rapporten dit også?",
- "report.hint": "The report will be sent to your instance moderators. You can provide an explanation of why you are reporting this account below:",
+ "report.mute": "Mute",
+ "report.mute_explanation": "You will not see their posts. They can still follow you and see your posts and will not know that they are muted.",
+ "report.next": "Next",
"report.placeholder": "Tilleggskommentarer",
+ "report.reasons.dislike": "I don't like it",
+ "report.reasons.dislike_description": "It is not something you want to see",
+ "report.reasons.other": "It's something else",
+ "report.reasons.other_description": "The issue does not fit into other categories",
+ "report.reasons.spam": "It's spam",
+ "report.reasons.spam_description": "Malicious links, fake engagement, or repetitive replies",
+ "report.reasons.violation": "It violates server rules",
+ "report.reasons.violation_description": "You are aware that it breaks specific rules",
+ "report.rules.subtitle": "Select all that apply",
+ "report.rules.title": "Which rules are being violated?",
+ "report.statuses.subtitle": "Select all that apply",
+ "report.statuses.title": "Are there any posts that back up this report?",
"report.submit": "Send inn",
"report.target": "Rapporterer",
+ "report.thanks.take_action": "Here are your options for controlling what you see on Mastodon:",
+ "report.thanks.take_action_actionable": "While we review this, you can take action against @{name}:",
+ "report.thanks.title": "Don't want to see this?",
+ "report.thanks.title_actionable": "Thanks for reporting, we'll look into this.",
+ "report.unfollow": "Unfollow @{name}",
+ "report.unfollow_explanation": "You are following this account. To not see their posts in your home feed anymore, unfollow them.",
"search.placeholder": "Søk",
"search_popout.search_format": "Avansert søkeformat",
"search_popout.tips.full_text": "Enkel tekst gir resultater for statuser du har skrevet, likt, fremhevet, eller har blitt nevnt i, i tillegg til samsvarende brukernavn, visningsnavn og emneknagger.",
@@ -382,7 +434,9 @@
"search_popout.tips.text": "Enkel tekst returnerer matchende visningsnavn, brukernavn og emneknagger",
"search_popout.tips.user": "bruker",
"search_results.accounts": "Folk",
+ "search_results.all": "All",
"search_results.hashtags": "Emneknagger",
+ "search_results.nothing_found": "Could not find anything for these search terms",
"search_results.statuses": "Tuter",
"search_results.statuses_fts_disabled": "Å søke i tuter etter innhold er ikke skrudd på i denne Mastodon-tjeneren.",
"search_results.total": "{count, number} {count, plural, one {resultat} other {resultater}}",
@@ -396,9 +450,14 @@
"status.delete": "Slett",
"status.detailed_status": "Detaljert samtalevisning",
"status.direct": "Send direktemelding til @{name}",
+ "status.edit": "Edit",
+ "status.edited": "Edited {date}",
+ "status.edited_x_times": "Edited {count, plural, one {{count} time} other {{count} times}}",
"status.embed": "Bygge inn",
"status.favourite": "Lik",
"status.filtered": "Filtrert",
+ "status.history.created": "{name} created {date}",
+ "status.history.edited": "{name} edited {date}",
"status.load_more": "Last mer",
"status.media_hidden": "Media skjult",
"status.mention": "Nevn @{name}",
@@ -444,7 +503,7 @@
"timeline_hint.resources.followers": "Følgere",
"timeline_hint.resources.follows": "Følger",
"timeline_hint.resources.statuses": "Eldre tuter",
- "trends.counter_by_accounts": "{count, plural, one {{counter} person} other {{counter} personer}} snakker",
+ "trends.counter_by_accounts": "Snakkes om av {count, plural, one {{counter} person} other {{counter} personer}}",
"trends.trending_now": "Trender nå",
"ui.beforeunload": "Din kladd vil bli forkastet om du forlater Mastodon.",
"units.short.billion": "{count}m.ard",
diff --git a/app/javascript/mastodon/locales/oc.json b/app/javascript/mastodon/locales/oc.json
index 6f7bc9761..ff819e0fd 100644
--- a/app/javascript/mastodon/locales/oc.json
+++ b/app/javascript/mastodon/locales/oc.json
@@ -18,12 +18,12 @@
"account.followers": "Seguidors",
"account.followers.empty": "Degun sèc pas aqueste utilizaire pel moment.",
"account.followers_counter": "{count, plural, one {{counter} Seguidor} other {{counter} Seguidors}}",
+ "account.following": "Following",
"account.following_counter": "{count, plural, one {{counter} Abonaments} other {{counter} Abonaments}}",
"account.follows.empty": "Aqueste utilizaire sèc pas degun pel moment.",
"account.follows_you": "Vos sèc",
"account.hide_reblogs": "Rescondre los partatges de @{name}",
"account.joined": "Arribèt en {date}",
- "account.last_status": "Darrièra activitat",
"account.link_verified_on": "La proprietat d’aqueste ligam foguèt verificada lo {date}",
"account.locked_info": "L’estatut de privacitat del compte es configurat sus clavat. Lo proprietari causís qual pòt sègre son compte.",
"account.media": "Mèdias",
@@ -32,7 +32,6 @@
"account.mute": "Rescondre @{name}",
"account.mute_notifications": "Rescondre las notificacions de @{name}",
"account.muted": "Mes en silenci",
- "account.never_active": "Jamai",
"account.posts": "Tuts",
"account.posts_with_replies": "Tuts e responsas",
"account.report": "Senhalar @{name}",
@@ -42,21 +41,24 @@
"account.statuses_counter": "{count, plural, one {{counter} Tut} other {{counter} Tuts}}",
"account.unblock": "Desblocar @{name}",
"account.unblock_domain": "Desblocar {domain}",
+ "account.unblock_short": "Unblock",
"account.unendorse": "Mostrar pas pel perfil",
"account.unfollow": "Quitar de sègre",
"account.unmute": "Quitar de rescondre @{name}",
"account.unmute_notifications": "Mostrar las notificacions de @{name}",
+ "account.unmute_short": "Unmute",
"account_note.placeholder": "Clicar per ajustar una nòta",
- "admin.dashboard.retention": "Retention",
- "admin.dashboard.retention.average": "Average",
- "admin.dashboard.retention.cohort": "Sign-up month",
- "admin.dashboard.retention.cohort_size": "New users",
+ "admin.dashboard.daily_retention": "User retention rate by day after sign-up",
+ "admin.dashboard.monthly_retention": "User retention rate by month after sign-up",
+ "admin.dashboard.retention.average": "Mejana",
+ "admin.dashboard.retention.cohort": "Mes d’inscripcion",
+ "admin.dashboard.retention.cohort_size": "Utilizaires novèls",
"alert.rate_limited.message": "Mercés de tornar ensajar aprèp {retry_time, time, medium}.",
"alert.rate_limited.title": "Taus limitat",
"alert.unexpected.message": "Una error s’es producha.",
"alert.unexpected.title": "Ops !",
"announcement.announcement": "Anóncia",
- "attachments_list.unprocessed": "(unprocessed)",
+ "attachments_list.unprocessed": "(pas tractat)",
"autosuggest_hashtag.per_week": "{count} per setmana",
"boost_modal.combo": "Podètz botar {combo} per passar aquò lo còp que ven",
"bundle_column_error.body": "Quicòm a fach mèuca pendent lo cargament d’aqueste compausant.",
@@ -104,6 +106,7 @@
"compose_form.poll.switch_to_single": "Cambiar lo sondatge per permetre una sola causida",
"compose_form.publish": "Tut",
"compose_form.publish_loud": "{publish} !",
+ "compose_form.save_changes": "Save changes",
"compose_form.sensitive.hide": "Marcar coma sensible",
"compose_form.sensitive.marked": "Lo mèdia es marcat coma sensible",
"compose_form.sensitive.unmarked": "Lo mèdia es pas marcat coma sensible",
@@ -118,7 +121,7 @@
"confirmations.delete.message": "Volètz vertadièrament escafar l’estatut ?",
"confirmations.delete_list.confirm": "Suprimir",
"confirmations.delete_list.message": "Volètz vertadièrament suprimir aquesta lista per totjorn ?",
- "confirmations.discard_edit_media.confirm": "Discard",
+ "confirmations.discard_edit_media.confirm": "Ignorar",
"confirmations.discard_edit_media.message": "You have unsaved changes to the media description or preview, discard them anyway?",
"confirmations.domain_block.confirm": "Amagar tot lo domeni",
"confirmations.domain_block.message": "Volètz vertadièrament blocar complètament {domain} ? De còps cal pas que blocar o rescondre unas personas solament.\nVeiretz pas cap de contengut d’aquel domeni dins cap de flux public o dins vòstras notificacions. Vòstres seguidors d’aquel domeni seràn levats.",
@@ -165,6 +168,7 @@
"empty_column.community": "Lo flux public local es void. Escrivètz quicòm per lo garnir !",
"empty_column.direct": "Avètz pas encara cap de messatges. Quand ne mandatz un o que ne recebètz un, serà mostrat aquí.",
"empty_column.domain_blocks": "I a pas encara cap de domeni amagat.",
+ "empty_column.explore_statuses": "Nothing is trending right now. Check back later!",
"empty_column.favourited_statuses": "Avètz pas encara cap de tut favorit. Quand n’auretz un, apareisserà aquí.",
"empty_column.favourites": "Degun a pas encara mes en favorit aqueste tut. Quand qualqu’un o farà, apareisserà aquí.",
"empty_column.follow_recommendations": "Looks like no suggestions could be generated for you. You can try using search to look for people you might know or explore trending hashtags.",
@@ -183,6 +187,12 @@
"error.unexpected_crash.next_steps_addons": "Ensajatz de los desactivar o actualizatz la pagina. Se aquò ajuda pas, podètz ensajar d’utilizar Mastodon via un autre navigador o una aplicacion nativa.",
"errors.unexpected_crash.copy_stacktrace": "Copiar las traças al quichapapièrs",
"errors.unexpected_crash.report_issue": "Senhalar un problèma",
+ "explore.search_results": "Search results",
+ "explore.suggested_follows": "For you",
+ "explore.title": "Explore",
+ "explore.trending_links": "News",
+ "explore.trending_statuses": "Posts",
+ "explore.trending_tags": "Hashtags",
"follow_recommendations.done": "Acabat",
"follow_recommendations.heading": "Follow people you'd like to see posts from! Here are some suggestions.",
"follow_recommendations.lead": "Posts from people you follow will show up in chronological order on your home feed. Don't be afraid to make mistakes, you can unfollow people just as easily any time!",
@@ -284,6 +294,7 @@
"navigation_bar.discover": "Trobar",
"navigation_bar.domain_blocks": "Domenis resconduts",
"navigation_bar.edit_profile": "Modificar lo perfil",
+ "navigation_bar.explore": "Explore",
"navigation_bar.favourites": "Favorits",
"navigation_bar.filters": "Mots ignorats",
"navigation_bar.follow_requests": "Demandas d’abonament",
@@ -298,6 +309,7 @@
"navigation_bar.preferences": "Preferéncias",
"navigation_bar.public_timeline": "Flux public global",
"navigation_bar.security": "Seguretat",
+ "notification.admin.sign_up": "{name} signed up",
"notification.favourite": "{name} a ajustat a sos favorits",
"notification.follow": "{name} vos sèc",
"notification.follow_request": "{name} a demandat a vos sègre",
@@ -306,13 +318,15 @@
"notification.poll": "Avètz participat a un sondatge que ven de s’acabar",
"notification.reblog": "{name} a partejat vòstre estatut",
"notification.status": "{name} ven de publicar",
+ "notification.update": "{name} edited a post",
"notifications.clear": "Escafar",
"notifications.clear_confirmation": "Volètz vertadièrament escafar totas vòstras las notificacions ?",
+ "notifications.column_settings.admin.sign_up": "New sign-ups:",
"notifications.column_settings.alert": "Notificacions localas",
"notifications.column_settings.favourite": "Favorits :",
"notifications.column_settings.filter_bar.advanced": "Mostrar totas las categorias",
"notifications.column_settings.filter_bar.category": "Barra de recèrca rapida",
- "notifications.column_settings.filter_bar.show": "Mostrar",
+ "notifications.column_settings.filter_bar.show_bar": "Afichar la barra de filtres",
"notifications.column_settings.follow": "Nòus seguidors :",
"notifications.column_settings.follow_request": "Novèla demanda d’abonament :",
"notifications.column_settings.mention": "Mencions :",
@@ -322,7 +336,9 @@
"notifications.column_settings.show": "Mostrar dins la colomna",
"notifications.column_settings.sound": "Emetre un son",
"notifications.column_settings.status": "Tuts novèls :",
- "notifications.column_settings.unread_markers.category": "Unread notification markers",
+ "notifications.column_settings.unread_notifications.category": "Notificacions pas legidas",
+ "notifications.column_settings.unread_notifications.highlight": "Highlight unread notifications",
+ "notifications.column_settings.update": "Edits:",
"notifications.filter.all": "Totas",
"notifications.filter.boosts": "Partages",
"notifications.filter.favourites": "Favorits",
@@ -362,18 +378,54 @@
"regeneration_indicator.label": "Cargament…",
"regeneration_indicator.sublabel": "Sèm a preparar vòstre flux d’acuèlh !",
"relative_time.days": "fa {number}d",
+ "relative_time.full.days": "{number, plural, one {# day} other {# days}} ago",
+ "relative_time.full.hours": "{number, plural, one {# hour} other {# hours}} ago",
+ "relative_time.full.just_now": "just now",
+ "relative_time.full.minutes": "{number, plural, one {# minute} other {# minutes}} ago",
+ "relative_time.full.seconds": "{number, plural, one {# second} other {# seconds}} ago",
"relative_time.hours": "fa {number}h",
"relative_time.just_now": "ara",
"relative_time.minutes": "fa {number} min",
"relative_time.seconds": "fa {number}s",
"relative_time.today": "uèi",
"reply_indicator.cancel": "Anullar",
+ "report.block": "Block",
+ "report.block_explanation": "You will not see their posts. They will not be able to see your posts or follow you. They will be able to tell that they are blocked.",
+ "report.categories.other": "Other",
+ "report.categories.spam": "Spam",
+ "report.categories.violation": "Content violates one or more server rules",
+ "report.category.subtitle": "Choose the best match",
+ "report.category.title": "Tell us what's going on with this {type}",
+ "report.category.title_account": "profile",
+ "report.category.title_status": "post",
+ "report.close": "Done",
+ "report.comment.title": "Is there anything else you think we should know?",
"report.forward": "Far sègre a {target}",
"report.forward_hint": "Lo compte ven d’un autre servidor. Volètz mandar una còpia anonima del rapòrt enlai tanben ?",
- "report.hint": "Lo moderator del servidor aurà lo rapòrt. Podètz fornir una explicacion de vòstre senhalament aquí dejós :",
+ "report.mute": "Mute",
+ "report.mute_explanation": "You will not see their posts. They can still follow you and see your posts and will not know that they are muted.",
+ "report.next": "Next",
"report.placeholder": "Comentaris addicionals",
+ "report.reasons.dislike": "I don't like it",
+ "report.reasons.dislike_description": "It is not something you want to see",
+ "report.reasons.other": "It's something else",
+ "report.reasons.other_description": "The issue does not fit into other categories",
+ "report.reasons.spam": "It's spam",
+ "report.reasons.spam_description": "Malicious links, fake engagement, or repetitive replies",
+ "report.reasons.violation": "It violates server rules",
+ "report.reasons.violation_description": "You are aware that it breaks specific rules",
+ "report.rules.subtitle": "Select all that apply",
+ "report.rules.title": "Which rules are being violated?",
+ "report.statuses.subtitle": "Select all that apply",
+ "report.statuses.title": "Are there any posts that back up this report?",
"report.submit": "Mandar",
"report.target": "Senhalar {target}",
+ "report.thanks.take_action": "Here are your options for controlling what you see on Mastodon:",
+ "report.thanks.take_action_actionable": "While we review this, you can take action against @{name}:",
+ "report.thanks.title": "Don't want to see this?",
+ "report.thanks.title_actionable": "Thanks for reporting, we'll look into this.",
+ "report.unfollow": "Unfollow @{name}",
+ "report.unfollow_explanation": "You are following this account. To not see their posts in your home feed anymore, unfollow them.",
"search.placeholder": "Recercar",
"search_popout.search_format": "Format recèrca avançada",
"search_popout.tips.full_text": "Un tèxte simple que tòrna los estatuts qu’avètz escriches, mes en favorits, partejats, o ont sètz mencionat, e tanben los noms d’utilizaires, escais-noms e etiquetas que correspondonas.",
@@ -382,7 +434,9 @@
"search_popout.tips.text": "Lo tèxte brut tòrna escais, noms d’utilizaire e etiquetas correspondents",
"search_popout.tips.user": "utilizaire",
"search_results.accounts": "Gents",
+ "search_results.all": "All",
"search_results.hashtags": "Etiquetas",
+ "search_results.nothing_found": "Could not find anything for these search terms",
"search_results.statuses": "Tuts",
"search_results.statuses_fts_disabled": "La recèrca de tuts per lor contengut es pas activada sus aqueste servidor Mastodon.",
"search_results.total": "{count, number} {count, plural, one {resultat} other {resultats}}",
@@ -396,9 +450,14 @@
"status.delete": "Escafar",
"status.detailed_status": "Vista detalhada de la convèrsa",
"status.direct": "Messatge per @{name}",
+ "status.edit": "Edit",
+ "status.edited": "Edited {date}",
+ "status.edited_x_times": "Edited {count, plural, one {{count} time} other {{count} times}}",
"status.embed": "Embarcar",
"status.favourite": "Apondre als favorits",
"status.filtered": "Filtrat",
+ "status.history.created": "{name} created {date}",
+ "status.history.edited": "{name} edited {date}",
"status.load_more": "Cargar mai",
"status.media_hidden": "Mèdia rescondut",
"status.mention": "Mencionar",
@@ -462,7 +521,7 @@
"upload_form.video_description": "Descriure per las personas amb pèrdas auditivas o mal vesent",
"upload_modal.analyzing_picture": "Analisi de l’imatge…",
"upload_modal.apply": "Aplicar",
- "upload_modal.applying": "Applying…",
+ "upload_modal.applying": "Aplicacion…",
"upload_modal.choose_image": "Causir un imatge",
"upload_modal.description_placeholder": "Lo dròlle bilingüe manja un yaourt de ròcs exagonals e kiwis verds farà un an mai",
"upload_modal.detect_text": "Detectar lo tèxt de l’imatge",
diff --git a/app/javascript/mastodon/locales/pa.json b/app/javascript/mastodon/locales/pa.json
index eca4765c4..088b5ff36 100644
--- a/app/javascript/mastodon/locales/pa.json
+++ b/app/javascript/mastodon/locales/pa.json
@@ -18,12 +18,12 @@
"account.followers": "Followers",
"account.followers.empty": "No one follows this user yet.",
"account.followers_counter": "{count, plural, one {{counter} Follower} other {{counter} Followers}}",
+ "account.following": "Following",
"account.following_counter": "{count, plural, one {{counter} Following} other {{counter} Following}}",
"account.follows.empty": "This user doesn't follow anyone yet.",
"account.follows_you": "Follows you",
"account.hide_reblogs": "Hide boosts from @{name}",
"account.joined": "Joined {date}",
- "account.last_status": "Last active",
"account.link_verified_on": "Ownership of this link was checked on {date}",
"account.locked_info": "This account privacy status is set to locked. The owner manually reviews who can follow them.",
"account.media": "Media",
@@ -32,7 +32,6 @@
"account.mute": "Mute @{name}",
"account.mute_notifications": "Mute notifications from @{name}",
"account.muted": "Muted",
- "account.never_active": "Never",
"account.posts": "Toots",
"account.posts_with_replies": "Toots and replies",
"account.report": "Report @{name}",
@@ -42,12 +41,15 @@
"account.statuses_counter": "{count, plural, one {{counter} Toot} other {{counter} Toots}}",
"account.unblock": "Unblock @{name}",
"account.unblock_domain": "Unblock domain {domain}",
+ "account.unblock_short": "Unblock",
"account.unendorse": "Don't feature on profile",
"account.unfollow": "Unfollow",
"account.unmute": "Unmute @{name}",
"account.unmute_notifications": "Unmute notifications from @{name}",
+ "account.unmute_short": "Unmute",
"account_note.placeholder": "Click to add a note",
- "admin.dashboard.retention": "Retention",
+ "admin.dashboard.daily_retention": "User retention rate by day after sign-up",
+ "admin.dashboard.monthly_retention": "User retention rate by month after sign-up",
"admin.dashboard.retention.average": "Average",
"admin.dashboard.retention.cohort": "Sign-up month",
"admin.dashboard.retention.cohort_size": "New users",
@@ -104,6 +106,7 @@
"compose_form.poll.switch_to_single": "Change poll to allow for a single choice",
"compose_form.publish": "Toot",
"compose_form.publish_loud": "{publish}!",
+ "compose_form.save_changes": "Save changes",
"compose_form.sensitive.hide": "{count, plural, one {Mark media as sensitive} other {Mark media as sensitive}}",
"compose_form.sensitive.marked": "{count, plural, one {Media is marked as sensitive} other {Media is marked as sensitive}}",
"compose_form.sensitive.unmarked": "{count, plural, one {Media is not marked as sensitive} other {Media is not marked as sensitive}}",
@@ -165,6 +168,7 @@
"empty_column.community": "The local timeline is empty. Write something publicly to get the ball rolling!",
"empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.",
"empty_column.domain_blocks": "There are no blocked domains yet.",
+ "empty_column.explore_statuses": "Nothing is trending right now. Check back later!",
"empty_column.favourited_statuses": "You don't have any favourite toots yet. When you favourite one, it will show up here.",
"empty_column.favourites": "No one has favourited this toot yet. When someone does, they will show up here.",
"empty_column.follow_recommendations": "Looks like no suggestions could be generated for you. You can try using search to look for people you might know or explore trending hashtags.",
@@ -183,6 +187,12 @@
"error.unexpected_crash.next_steps_addons": "Try disabling them and refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
"errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard",
"errors.unexpected_crash.report_issue": "Report issue",
+ "explore.search_results": "Search results",
+ "explore.suggested_follows": "For you",
+ "explore.title": "Explore",
+ "explore.trending_links": "News",
+ "explore.trending_statuses": "Posts",
+ "explore.trending_tags": "Hashtags",
"follow_recommendations.done": "Done",
"follow_recommendations.heading": "Follow people you'd like to see posts from! Here are some suggestions.",
"follow_recommendations.lead": "Posts from people you follow will show up in chronological order on your home feed. Don't be afraid to make mistakes, you can unfollow people just as easily any time!",
@@ -284,6 +294,7 @@
"navigation_bar.discover": "Discover",
"navigation_bar.domain_blocks": "Hidden domains",
"navigation_bar.edit_profile": "Edit profile",
+ "navigation_bar.explore": "Explore",
"navigation_bar.favourites": "Favourites",
"navigation_bar.filters": "Muted words",
"navigation_bar.follow_requests": "Follow requests",
@@ -298,6 +309,7 @@
"navigation_bar.preferences": "Preferences",
"navigation_bar.public_timeline": "Federated timeline",
"navigation_bar.security": "Security",
+ "notification.admin.sign_up": "{name} signed up",
"notification.favourite": "{name} favourited your status",
"notification.follow": "{name} followed you",
"notification.follow_request": "{name} has requested to follow you",
@@ -306,13 +318,15 @@
"notification.poll": "A poll you have voted in has ended",
"notification.reblog": "{name} boosted your status",
"notification.status": "{name} just posted",
+ "notification.update": "{name} edited a post",
"notifications.clear": "Clear notifications",
"notifications.clear_confirmation": "Are you sure you want to permanently clear all your notifications?",
+ "notifications.column_settings.admin.sign_up": "New sign-ups:",
"notifications.column_settings.alert": "Desktop notifications",
"notifications.column_settings.favourite": "Favourites:",
"notifications.column_settings.filter_bar.advanced": "Display all categories",
"notifications.column_settings.filter_bar.category": "Quick filter bar",
- "notifications.column_settings.filter_bar.show": "Show",
+ "notifications.column_settings.filter_bar.show_bar": "Show filter bar",
"notifications.column_settings.follow": "New followers:",
"notifications.column_settings.follow_request": "New follow requests:",
"notifications.column_settings.mention": "Mentions:",
@@ -322,7 +336,9 @@
"notifications.column_settings.show": "Show in column",
"notifications.column_settings.sound": "Play sound",
"notifications.column_settings.status": "New toots:",
- "notifications.column_settings.unread_markers.category": "Unread notification markers",
+ "notifications.column_settings.unread_notifications.category": "Unread notifications",
+ "notifications.column_settings.unread_notifications.highlight": "Highlight unread notifications",
+ "notifications.column_settings.update": "Edits:",
"notifications.filter.all": "All",
"notifications.filter.boosts": "Boosts",
"notifications.filter.favourites": "Favourites",
@@ -362,18 +378,54 @@
"regeneration_indicator.label": "Loading…",
"regeneration_indicator.sublabel": "Your home feed is being prepared!",
"relative_time.days": "{number}d",
+ "relative_time.full.days": "{number, plural, one {# day} other {# days}} ago",
+ "relative_time.full.hours": "{number, plural, one {# hour} other {# hours}} ago",
+ "relative_time.full.just_now": "just now",
+ "relative_time.full.minutes": "{number, plural, one {# minute} other {# minutes}} ago",
+ "relative_time.full.seconds": "{number, plural, one {# second} other {# seconds}} ago",
"relative_time.hours": "{number}h",
"relative_time.just_now": "now",
"relative_time.minutes": "{number}m",
"relative_time.seconds": "{number}s",
"relative_time.today": "today",
"reply_indicator.cancel": "Cancel",
+ "report.block": "Block",
+ "report.block_explanation": "You will not see their posts. They will not be able to see your posts or follow you. They will be able to tell that they are blocked.",
+ "report.categories.other": "Other",
+ "report.categories.spam": "Spam",
+ "report.categories.violation": "Content violates one or more server rules",
+ "report.category.subtitle": "Choose the best match",
+ "report.category.title": "Tell us what's going on with this {type}",
+ "report.category.title_account": "profile",
+ "report.category.title_status": "post",
+ "report.close": "Done",
+ "report.comment.title": "Is there anything else you think we should know?",
"report.forward": "Forward to {target}",
"report.forward_hint": "The account is from another server. Send an anonymized copy of the report there as well?",
- "report.hint": "The report will be sent to your server moderators. You can provide an explanation of why you are reporting this account below:",
- "report.placeholder": "Additional comments",
- "report.submit": "Submit",
+ "report.mute": "Mute",
+ "report.mute_explanation": "You will not see their posts. They can still follow you and see your posts and will not know that they are muted.",
+ "report.next": "Next",
+ "report.placeholder": "Type or paste additional comments",
+ "report.reasons.dislike": "I don't like it",
+ "report.reasons.dislike_description": "It is not something you want to see",
+ "report.reasons.other": "It's something else",
+ "report.reasons.other_description": "The issue does not fit into other categories",
+ "report.reasons.spam": "It's spam",
+ "report.reasons.spam_description": "Malicious links, fake engagement, or repetitive replies",
+ "report.reasons.violation": "It violates server rules",
+ "report.reasons.violation_description": "You are aware that it breaks specific rules",
+ "report.rules.subtitle": "Select all that apply",
+ "report.rules.title": "Which rules are being violated?",
+ "report.statuses.subtitle": "Select all that apply",
+ "report.statuses.title": "Are there any posts that back up this report?",
+ "report.submit": "Submit report",
"report.target": "Report {target}",
+ "report.thanks.take_action": "Here are your options for controlling what you see on Mastodon:",
+ "report.thanks.take_action_actionable": "While we review this, you can take action against @{name}:",
+ "report.thanks.title": "Don't want to see this?",
+ "report.thanks.title_actionable": "Thanks for reporting, we'll look into this.",
+ "report.unfollow": "Unfollow @{name}",
+ "report.unfollow_explanation": "You are following this account. To not see their posts in your home feed anymore, unfollow them.",
"search.placeholder": "Search",
"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.",
@@ -382,7 +434,9 @@
"search_popout.tips.text": "Simple text returns matching display names, usernames and hashtags",
"search_popout.tips.user": "user",
"search_results.accounts": "People",
+ "search_results.all": "All",
"search_results.hashtags": "Hashtags",
+ "search_results.nothing_found": "Could not find anything for these search terms",
"search_results.statuses": "Toots",
"search_results.statuses_fts_disabled": "Searching toots by their content is not enabled on this Mastodon server.",
"search_results.total": "{count, number} {count, plural, one {result} other {results}}",
@@ -396,9 +450,14 @@
"status.delete": "Delete",
"status.detailed_status": "Detailed conversation view",
"status.direct": "Direct message @{name}",
+ "status.edit": "Edit",
+ "status.edited": "Edited {date}",
+ "status.edited_x_times": "Edited {count, plural, one {{count} time} other {{count} times}}",
"status.embed": "Embed",
"status.favourite": "Favourite",
"status.filtered": "Filtered",
+ "status.history.created": "{name} created {date}",
+ "status.history.edited": "{name} edited {date}",
"status.load_more": "Load more",
"status.media_hidden": "Media hidden",
"status.mention": "Mention @{name}",
diff --git a/app/javascript/mastodon/locales/pl.json b/app/javascript/mastodon/locales/pl.json
index c6527311a..445f919db 100644
--- a/app/javascript/mastodon/locales/pl.json
+++ b/app/javascript/mastodon/locales/pl.json
@@ -18,12 +18,12 @@
"account.followers": "Śledzący",
"account.followers.empty": "Nikt jeszcze nie śledzi tego użytkownika.",
"account.followers_counter": "{count, plural, one {{counter} śledzący} few {{counter} śledzących} many {{counter} śledzących} other {{counter} śledzących}}",
+ "account.following": "Śledzenie",
"account.following_counter": "{count, plural, one {{counter} śledzony} few {{counter} śledzonych} many {{counter} śledzonych} other {{counter} śledzonych}}",
"account.follows.empty": "Ten użytkownik nie śledzi jeszcze nikogo.",
"account.follows_you": "Śledzi Cię",
"account.hide_reblogs": "Ukryj podbicia od @{name}",
"account.joined": "Dołączył(a) {date}",
- "account.last_status": "Ostatnia aktywność",
"account.link_verified_on": "Własność tego odnośnika została potwierdzona {date}",
"account.locked_info": "To konto jest prywatne. Właściciel ręcznie wybiera kto może go śledzić.",
"account.media": "Zawartość multimedialna",
@@ -32,7 +32,6 @@
"account.mute": "Wycisz @{name}",
"account.mute_notifications": "Wycisz powiadomienia o @{name}",
"account.muted": "Wyciszony",
- "account.never_active": "Nigdy",
"account.posts": "Wpisy",
"account.posts_with_replies": "Wpisy i odpowiedzi",
"account.report": "Zgłoś @{name}",
@@ -42,21 +41,24 @@
"account.statuses_counter": "{count, plural, one {{counter} wpis} few {{counter} wpisy} many {{counter} wpisów} other {{counter} wpisów}}",
"account.unblock": "Odblokuj @{name}",
"account.unblock_domain": "Odblokuj domenę {domain}",
+ "account.unblock_short": "Odblokuj",
"account.unendorse": "Przestań polecać",
"account.unfollow": "Przestań śledzić",
"account.unmute": "Cofnij wyciszenie @{name}",
"account.unmute_notifications": "Cofnij wyciszenie powiadomień od @{name}",
+ "account.unmute_short": "Włącz dźwięki",
"account_note.placeholder": "Naciśnij aby dodać notatkę",
- "admin.dashboard.retention": "Retention",
- "admin.dashboard.retention.average": "Average",
- "admin.dashboard.retention.cohort": "Sign-up month",
- "admin.dashboard.retention.cohort_size": "New users",
+ "admin.dashboard.daily_retention": "User retention rate by day after sign-up",
+ "admin.dashboard.monthly_retention": "User retention rate by month after sign-up",
+ "admin.dashboard.retention.average": "Średnia",
+ "admin.dashboard.retention.cohort": "Miesiąc rejestracji",
+ "admin.dashboard.retention.cohort_size": "Nowi użytkownicy",
"alert.rate_limited.message": "Spróbuj ponownie po {retry_time, time, medium}.",
"alert.rate_limited.title": "Ograniczony czasowo",
"alert.unexpected.message": "Wystąpił nieoczekiwany błąd.",
"alert.unexpected.title": "O nie!",
"announcement.announcement": "Ogłoszenie",
- "attachments_list.unprocessed": "(unprocessed)",
+ "attachments_list.unprocessed": "(nieprzetworzone)",
"autosuggest_hashtag.per_week": "{count} co tydzień",
"boost_modal.combo": "Naciśnij {combo}, aby pominąć to następnym razem",
"bundle_column_error.body": "Coś poszło nie tak podczas ładowania tego składnika.",
@@ -108,6 +110,7 @@
"compose_form.poll.switch_to_single": "Pozwól na wybranie tylko jednej opcji",
"compose_form.publish": "Wyślij",
"compose_form.publish_loud": "{publish}!",
+ "compose_form.save_changes": "Zapisz zmiany",
"compose_form.sensitive.hide": "Oznacz multimedia jako wrażliwe",
"compose_form.sensitive.marked": "Zawartość multimedia jest oznaczona jako wrażliwa",
"compose_form.sensitive.unmarked": "Zawartość multimedialna nie jest oznaczona jako wrażliwa",
@@ -122,8 +125,8 @@
"confirmations.delete.message": "Czy na pewno chcesz usunąć ten wpis?",
"confirmations.delete_list.confirm": "Usuń",
"confirmations.delete_list.message": "Czy na pewno chcesz bezpowrotnie usunąć tą listę?",
- "confirmations.discard_edit_media.confirm": "Discard",
- "confirmations.discard_edit_media.message": "You have unsaved changes to the media description or preview, discard them anyway?",
+ "confirmations.discard_edit_media.confirm": "Odrzuć",
+ "confirmations.discard_edit_media.message": "Masz niezapisane zmiany w opisie lub podglądzie, odrzucić je mimo to?",
"confirmations.domain_block.confirm": "Ukryj wszystko z domeny",
"confirmations.domain_block.message": "Czy na pewno chcesz zablokować całą domenę {domain}? Zwykle lepszym rozwiązaniem jest blokada lub wyciszenie kilku użytkowników.",
"confirmations.logout.confirm": "Wyloguj",
@@ -169,6 +172,7 @@
"empty_column.community": "Lokalna oś czasu jest pusta. Napisz coś publicznie, aby zagaić!",
"empty_column.direct": "Nie masz żadnych wiadomości bezpośrednich. Kiedy dostaniesz lub wyślesz jakąś, pojawi się ona tutaj.",
"empty_column.domain_blocks": "Brak ukrytych domen.",
+ "empty_column.explore_statuses": "Nothing is trending right now. Check back later!",
"empty_column.favourited_statuses": "Nie dodałeś(-aś) żadnego wpisu do ulubionych. Kiedy to zrobisz, pojawi się on tutaj.",
"empty_column.favourites": "Nikt nie dodał tego wpisu do ulubionych. Gdy ktoś to zrobi, pojawi się tutaj.",
"empty_column.follow_recommendations": "Wygląda na to, że nie można wygenerować dla Ciebie żadnych sugestii. Możesz spróbować wyszukać osoby, które znasz, lub przeglądać popularne hashtagi.",
@@ -187,6 +191,12 @@
"error.unexpected_crash.next_steps_addons": "Spróbuj je wyłączyć lub odświeżyć stronę. Jeśli to nie pomoże, możesz wciąż korzystać z Mastodona w innej przeglądarce lub natywnej aplikacji.",
"errors.unexpected_crash.copy_stacktrace": "Skopiuj ślad stosu do schowka",
"errors.unexpected_crash.report_issue": "Zgłoś problem",
+ "explore.search_results": "Search results",
+ "explore.suggested_follows": "For you",
+ "explore.title": "Explore",
+ "explore.trending_links": "News",
+ "explore.trending_statuses": "Posts",
+ "explore.trending_tags": "Hashtags",
"follow_recommendations.done": "Gotowe",
"follow_recommendations.heading": "Śledź ludzi, których wpisy chcesz czytać. Oto kilka propozycji.",
"follow_recommendations.lead": "Wpisy osób, które śledzisz będą pojawiać się w porządku chronologicznym na stronie głównej. Nie bój się popełniać błędów, możesz bez problemu przestać śledzić każdego w każdej chwili!",
@@ -288,6 +298,7 @@
"navigation_bar.discover": "Odkrywaj",
"navigation_bar.domain_blocks": "Ukryte domeny",
"navigation_bar.edit_profile": "Edytuj profil",
+ "navigation_bar.explore": "Explore",
"navigation_bar.favourites": "Ulubione",
"navigation_bar.filters": "Wyciszone słowa",
"navigation_bar.follow_requests": "Prośby o śledzenie",
@@ -303,6 +314,7 @@
"navigation_bar.preferences": "Preferencje",
"navigation_bar.public_timeline": "Globalna oś czasu",
"navigation_bar.security": "Bezpieczeństwo",
+ "notification.admin.sign_up": "{name} signed up",
"notification.favourite": "{name} dodał(a) Twój wpis do ulubionych",
"notification.follow": "{name} zaczął(-ęła) Cię śledzić",
"notification.follow_request": "{name} poprosił(a) o możliwość śledzenia Cię",
@@ -311,13 +323,15 @@
"notification.poll": "Głosowanie w którym brałeś(-aś) udział zakończyło się",
"notification.reblog": "{name} podbił(a) Twój wpis",
"notification.status": "{name} właśnie utworzył(a) wpis",
+ "notification.update": "{name} edytował post",
"notifications.clear": "Wyczyść powiadomienia",
"notifications.clear_confirmation": "Czy na pewno chcesz bezpowrotnie usunąć wszystkie powiadomienia?",
+ "notifications.column_settings.admin.sign_up": "New sign-ups:",
"notifications.column_settings.alert": "Powiadomienia na pulpicie",
"notifications.column_settings.favourite": "Dodanie do ulubionych:",
"notifications.column_settings.filter_bar.advanced": "Wyświetl wszystkie kategorie",
"notifications.column_settings.filter_bar.category": "Szybkie filtrowanie",
- "notifications.column_settings.filter_bar.show": "Pokaż",
+ "notifications.column_settings.filter_bar.show_bar": "Pokaż filtry",
"notifications.column_settings.follow": "Nowi śledzący:",
"notifications.column_settings.follow_request": "Nowe prośby o możliwość śledzenia:",
"notifications.column_settings.mention": "Wspomnienia:",
@@ -327,7 +341,9 @@
"notifications.column_settings.show": "Pokaż w kolumnie",
"notifications.column_settings.sound": "Odtwarzaj dźwięk",
"notifications.column_settings.status": "Nowe wpisy:",
- "notifications.column_settings.unread_markers.category": "Znaczniki nieprzeczytanych powiadomień",
+ "notifications.column_settings.unread_notifications.category": "Nieprzeczytane powiadomienia",
+ "notifications.column_settings.unread_notifications.highlight": "Podświetl nieprzeczytane powiadomienia",
+ "notifications.column_settings.update": "Edycje:",
"notifications.filter.all": "Wszystkie",
"notifications.filter.boosts": "Podbicia",
"notifications.filter.favourites": "Ulubione",
@@ -351,7 +367,7 @@
"poll.total_votes": "{count, plural, one {# głos} few {# głosy} many {# głosów} other {# głosów}}",
"poll.vote": "Zagłosuj",
"poll.voted": "Zagłosowałeś_aś na tą odpowiedź",
- "poll.votes": "{votes, plural, one {# vote} other {# votes}}",
+ "poll.votes": "{votes, plural, one {# głos} few {# głosy} many {# głosów} other {# głosów}}",
"poll_button.add_poll": "Dodaj głosowanie",
"poll_button.remove_poll": "Usuń głosowanie",
"privacy.change": "Dostosuj widoczność wpisów",
@@ -367,18 +383,54 @@
"regeneration_indicator.label": "Ładuję…",
"regeneration_indicator.sublabel": "Twoja oś czasu jest przygotowywana!",
"relative_time.days": "{number} dni",
+ "relative_time.full.days": "{number, plural, one {# dzień} few {# dni} many {# dni} other {# dni}} temu",
+ "relative_time.full.hours": "{number, plural, one {# godzinę} few {# godziny} many {# godzin} other {# godzin}} temu",
+ "relative_time.full.just_now": "przed chwilą",
+ "relative_time.full.minutes": "{number, plural, one {# minutę} few {# minuty} many {# minut} other {# minut}} temu",
+ "relative_time.full.seconds": "{number, plural, one {# sekundę} few {# sekundy} many {# sekund} other {# sekund}} temu",
"relative_time.hours": "{number} godz.",
"relative_time.just_now": "teraz",
"relative_time.minutes": "{number} min.",
"relative_time.seconds": "{number} s.",
"relative_time.today": "dzisiaj",
"reply_indicator.cancel": "Anuluj",
+ "report.block": "Block",
+ "report.block_explanation": "You will not see their posts. They will not be able to see your posts or follow you. They will be able to tell that they are blocked.",
+ "report.categories.other": "Inne",
+ "report.categories.spam": "Spam",
+ "report.categories.violation": "Zawartość narusza co najmniej jedną zasadę serwera",
+ "report.category.subtitle": "Choose the best match",
+ "report.category.title": "Tell us what's going on with this {type}",
+ "report.category.title_account": "profile",
+ "report.category.title_status": "post",
+ "report.close": "Done",
+ "report.comment.title": "Is there anything else you think we should know?",
"report.forward": "Przekaż na {target}",
"report.forward_hint": "To konto znajduje się na innej instancji. Czy chcesz wysłać anonimową kopię zgłoszenia rnież na nią?",
- "report.hint": "Zgłoszenie zostanie wysłane moderatorom Twojego serwera. Poniżej możesz też umieścić wyjaśnienie dlaczego zgłaszasz to konto:",
+ "report.mute": "Mute",
+ "report.mute_explanation": "You will not see their posts. They can still follow you and see your posts and will not know that they are muted.",
+ "report.next": "Next",
"report.placeholder": "Dodatkowe komentarze",
+ "report.reasons.dislike": "I don't like it",
+ "report.reasons.dislike_description": "It is not something you want to see",
+ "report.reasons.other": "It's something else",
+ "report.reasons.other_description": "The issue does not fit into other categories",
+ "report.reasons.spam": "It's spam",
+ "report.reasons.spam_description": "Niebezpieczne linki, fałszywe zaangażowanie lub powtarzające się odpowiedzi",
+ "report.reasons.violation": "It violates server rules",
+ "report.reasons.violation_description": "You are aware that it breaks specific rules",
+ "report.rules.subtitle": "Select all that apply",
+ "report.rules.title": "Which rules are being violated?",
+ "report.statuses.subtitle": "Select all that apply",
+ "report.statuses.title": "Are there any posts that back up this report?",
"report.submit": "Wyślij",
"report.target": "Zgłaszanie {target}",
+ "report.thanks.take_action": "Here are your options for controlling what you see on Mastodon:",
+ "report.thanks.take_action_actionable": "While we review this, you can take action against @{name}:",
+ "report.thanks.title": "Don't want to see this?",
+ "report.thanks.title_actionable": "Thanks for reporting, we'll look into this.",
+ "report.unfollow": "Unfollow @{name}",
+ "report.unfollow_explanation": "You are following this account. To not see their posts in your home feed anymore, unfollow them.",
"search.placeholder": "Szukaj",
"search_popout.search_format": "Zaawansowane wyszukiwanie",
"search_popout.tips.full_text": "Pozwala na wyszukiwanie wpisów które napisałeś(-aś), dodałeś(-aś) do ulubionych lub podbiłeś(-aś), w których o Tobie wspomniano, oraz pasujące nazwy użytkowników, pełne nazwy i hashtagi.",
@@ -387,7 +439,9 @@
"search_popout.tips.text": "Proste wyszukiwanie pasujących pseudonimów, nazw użytkowników i hashtagów",
"search_popout.tips.user": "użytkownik",
"search_results.accounts": "Ludzie",
+ "search_results.all": "All",
"search_results.hashtags": "Hashtagi",
+ "search_results.nothing_found": "Could not find anything for these search terms",
"search_results.statuses": "Wpisy",
"search_results.statuses_fts_disabled": "Szukanie wpisów przy pomocy ich zawartości nie jest włączone na tym serwerze Mastodona.",
"search_results.total": "{count, number} {count, plural, one {wynik} few {wyniki} many {wyników} more {wyników}}",
@@ -401,9 +455,14 @@
"status.delete": "Usuń",
"status.detailed_status": "Szczegółowy widok konwersacji",
"status.direct": "Wyślij wiadomość bezpośrednią do @{name}",
+ "status.edit": "Edytuj",
+ "status.edited": "Edytowano {date}",
+ "status.edited_x_times": "Edited {count, plural, one {{count} time} other {{count} times}}",
"status.embed": "Osadź",
"status.favourite": "Dodaj do ulubionych",
"status.filtered": "Filtrowany(-a)",
+ "status.history.created": "{name} created {date}",
+ "status.history.edited": "{name} edited {date}",
"status.load_more": "Załaduj więcej",
"status.media_hidden": "Zawartość multimedialna ukryta",
"status.mention": "Wspomnij o @{name}",
@@ -467,7 +526,7 @@
"upload_form.video_description": "Opisz dla osób niesłyszących, niedosłyszących, niewidomych i niedowidzących",
"upload_modal.analyzing_picture": "Analizowanie obrazu…",
"upload_modal.apply": "Zastosuj",
- "upload_modal.applying": "Applying…",
+ "upload_modal.applying": "Stosowanie…",
"upload_modal.choose_image": "Wybierz obraz",
"upload_modal.description_placeholder": "Pchnąć w tę łódź jeża lub ośm skrzyń fig",
"upload_modal.detect_text": "Wykryj tekst z obrazu",
diff --git a/app/javascript/mastodon/locales/pt-BR.json b/app/javascript/mastodon/locales/pt-BR.json
index 3fc47a212..c597aa20d 100644
--- a/app/javascript/mastodon/locales/pt-BR.json
+++ b/app/javascript/mastodon/locales/pt-BR.json
@@ -18,12 +18,12 @@
"account.followers": "Seguidores",
"account.followers.empty": "Nada aqui.",
"account.followers_counter": "{count, plural, one {{counter} seguidor} other {{counter} seguidores}}",
+ "account.following": "Following",
"account.following_counter": "{count, plural, one {segue {counter}} other {segue {counter}}}",
"account.follows.empty": "Nada aqui.",
"account.follows_you": "te segue",
"account.hide_reblogs": "Ocultar boosts de @{name}",
"account.joined": "Entrou em {date}",
- "account.last_status": "Ativo pela última vez",
"account.link_verified_on": "link verificado em {date}",
"account.locked_info": "Trancado. Seguir requer aprovação manual do perfil.",
"account.media": "Mídia",
@@ -32,7 +32,6 @@
"account.mute": "Silenciar @{name}",
"account.mute_notifications": "Ocultar notificações de @{name}",
"account.muted": "Silenciado",
- "account.never_active": "Nunca",
"account.posts": "Toots",
"account.posts_with_replies": "Com respostas",
"account.report": "Denunciar @{name}",
@@ -42,21 +41,24 @@
"account.statuses_counter": "{count, plural, one {{counter} Toot} other {{counter} Toots}}",
"account.unblock": "Desbloquear @{name}",
"account.unblock_domain": "Desbloquear domínio {domain}",
+ "account.unblock_short": "Unblock",
"account.unendorse": "Remover",
"account.unfollow": "Deixar de seguir",
"account.unmute": "Dessilenciar @{name}",
"account.unmute_notifications": "Mostrar notificações de @{name}",
+ "account.unmute_short": "Unmute",
"account_note.placeholder": "Nota pessoal sobre este perfil aqui",
- "admin.dashboard.retention": "Retention",
- "admin.dashboard.retention.average": "Average",
- "admin.dashboard.retention.cohort": "Sign-up month",
- "admin.dashboard.retention.cohort_size": "New users",
+ "admin.dashboard.daily_retention": "User retention rate by day after sign-up",
+ "admin.dashboard.monthly_retention": "Taxa de retenção de usuários por mês, após a inscrição",
+ "admin.dashboard.retention.average": "Média",
+ "admin.dashboard.retention.cohort": "Mês de inscrição",
+ "admin.dashboard.retention.cohort_size": "Novos usuários",
"alert.rate_limited.message": "Tente novamente após {retry_time, time, medium}.",
"alert.rate_limited.title": "Tentativas limitadas",
"alert.unexpected.message": "Ocorreu um erro inesperado.",
"alert.unexpected.title": "Eita!",
"announcement.announcement": "Comunicados",
- "attachments_list.unprocessed": "(unprocessed)",
+ "attachments_list.unprocessed": "(não processado)",
"autosuggest_hashtag.per_week": "{count} por semana",
"boost_modal.combo": "Pressione {combo} para pular isso na próxima vez",
"bundle_column_error.body": "Erro ao carregar este componente.",
@@ -104,6 +106,7 @@
"compose_form.poll.switch_to_single": "Opção única",
"compose_form.publish": "TOOT",
"compose_form.publish_loud": "{publish}!",
+ "compose_form.save_changes": "Salvar alterações",
"compose_form.sensitive.hide": "{count, plural, one {Marcar mídia como sensível} other {Marcar mídias como sensível}}",
"compose_form.sensitive.marked": "{count, plural, one {Mídia marcada como sensível} other {Mídias marcadas como sensível}}",
"compose_form.sensitive.unmarked": "{count, plural, one {Mídia não está marcada como sensível} other {Mídias não estão marcadas como sensível}}",
@@ -118,8 +121,8 @@
"confirmations.delete.message": "Você tem certeza de que deseja excluir este toot?",
"confirmations.delete_list.confirm": "Excluir",
"confirmations.delete_list.message": "Você tem certeza de que deseja excluir esta lista?",
- "confirmations.discard_edit_media.confirm": "Discard",
- "confirmations.discard_edit_media.message": "You have unsaved changes to the media description or preview, discard them anyway?",
+ "confirmations.discard_edit_media.confirm": "Descartar",
+ "confirmations.discard_edit_media.message": "Há mudanças não salvas na descrição ou pré-visualização da mídia; descartar assim mesmo?",
"confirmations.domain_block.confirm": "Bloquear instância",
"confirmations.domain_block.message": "Você tem certeza de que deseja bloquear tudo de {domain}? Você não verá mais o conteúdo desta instância em nenhuma linha do tempo pública ou nas suas notificações. Seus seguidores desta instância serão removidos.",
"confirmations.logout.confirm": "Sair",
@@ -165,6 +168,7 @@
"empty_column.community": "A linha local está vazia. Publique algo para começar!",
"empty_column.direct": "Nada aqui. Quando você enviar ou receber toots diretos, eles aparecerão aqui.",
"empty_column.domain_blocks": "Nada aqui.",
+ "empty_column.explore_statuses": "Nothing is trending right now. Check back later!",
"empty_column.favourited_statuses": "Nada aqui. Quando você favoritar um toot, ele aparecerá aqui.",
"empty_column.favourites": "Nada aqui. Quando alguém favoritar, o autor aparecerá aqui.",
"empty_column.follow_recommendations": "Parece que não há sugestões para você. Tente usar a pesquisa para encontrar pessoas que você possa conhecer ou explorar hashtags.",
@@ -183,6 +187,12 @@
"error.unexpected_crash.next_steps_addons": "Tente desativá-los e atualizar a página. Se isso não ajudar, você ainda poderá usar o Mastodon por meio de um navegador diferente ou de um aplicativo nativo.",
"errors.unexpected_crash.copy_stacktrace": "Copiar dados do erro para área de transferência",
"errors.unexpected_crash.report_issue": "Reportar problema",
+ "explore.search_results": "Resultado da pesquisa",
+ "explore.suggested_follows": "Para você",
+ "explore.title": "Explorar",
+ "explore.trending_links": "Novidades",
+ "explore.trending_statuses": "Posts",
+ "explore.trending_tags": "Hashtags",
"follow_recommendations.done": "Salvar",
"follow_recommendations.heading": "Siga pessoas que você gostaria de acompanhar! Aqui estão algumas sugestões.",
"follow_recommendations.lead": "Toots de pessoas que você segue aparecerão em ordem cronológica na página inicial. Não tenha medo de cometer erros, você pode facilmente deixar de seguir a qualquer momento!",
@@ -284,6 +294,7 @@
"navigation_bar.discover": "Descobrir",
"navigation_bar.domain_blocks": "Domínios bloqueados",
"navigation_bar.edit_profile": "Editar perfil",
+ "navigation_bar.explore": "Explore",
"navigation_bar.favourites": "Favoritos",
"navigation_bar.filters": "Palavras filtradas",
"navigation_bar.follow_requests": "Seguidores pendentes",
@@ -298,6 +309,7 @@
"navigation_bar.preferences": "Preferências",
"navigation_bar.public_timeline": "Linha global",
"navigation_bar.security": "Segurança",
+ "notification.admin.sign_up": "{name} se inscreveu",
"notification.favourite": "{name} favoritou teu toot",
"notification.follow": "{name} te seguiu",
"notification.follow_request": "{name} quer te seguir",
@@ -306,13 +318,15 @@
"notification.poll": "Uma enquete que você votou terminou",
"notification.reblog": "{name} deu boost no teu toot",
"notification.status": "{name} acabou de tootar",
+ "notification.update": "{name} editou uma publicação",
"notifications.clear": "Limpar notificações",
"notifications.clear_confirmation": "Você tem certeza de que deseja limpar todas as suas notificações?",
+ "notifications.column_settings.admin.sign_up": "Novas inscrições:",
"notifications.column_settings.alert": "Notificações no computador",
"notifications.column_settings.favourite": "Favoritos:",
"notifications.column_settings.filter_bar.advanced": "Mostrar todas as categorias",
"notifications.column_settings.filter_bar.category": "Barra de filtro rápido das notificações",
- "notifications.column_settings.filter_bar.show": "Mostrar",
+ "notifications.column_settings.filter_bar.show_bar": "Mostrar barra de filtro",
"notifications.column_settings.follow": "Seguidores:",
"notifications.column_settings.follow_request": "Seguidores pendentes:",
"notifications.column_settings.mention": "Menções:",
@@ -322,7 +336,9 @@
"notifications.column_settings.show": "Mostrar na coluna",
"notifications.column_settings.sound": "Tocar som",
"notifications.column_settings.status": "Novos toots:",
- "notifications.column_settings.unread_markers.category": "Marcar como não lidas",
+ "notifications.column_settings.unread_notifications.category": "Notificações não lidas",
+ "notifications.column_settings.unread_notifications.highlight": "Destacar notificações não lidas",
+ "notifications.column_settings.update": "Edits:",
"notifications.filter.all": "Tudo",
"notifications.filter.boosts": "Boosts",
"notifications.filter.favourites": "Favoritos",
@@ -346,7 +362,7 @@
"poll.total_votes": "{count, plural, one {# voto} other {# votos}}",
"poll.vote": "Votar",
"poll.voted": "Você votou nesta opção",
- "poll.votes": "{votes, plural, one {# vote} other {# votes}}",
+ "poll.votes": "{votes, plural, one {# voto} other {# votos}}",
"poll_button.add_poll": "Adicionar enquete",
"poll_button.remove_poll": "Remover enquete",
"privacy.change": "Alterar privacidade do toot",
@@ -362,18 +378,54 @@
"regeneration_indicator.label": "Carregando…",
"regeneration_indicator.sublabel": "Sua página inicial está sendo preparada!",
"relative_time.days": "{number}d",
+ "relative_time.full.days": "{number, plural, one {# day} other {# days}} ago",
+ "relative_time.full.hours": "{number, plural, one {# hour} other {# hours}} ago",
+ "relative_time.full.just_now": "agora mesmo",
+ "relative_time.full.minutes": "{number, plural, one {# minute} other {# minutes}} ago",
+ "relative_time.full.seconds": "{number, plural, one {# second} other {# seconds}} ago",
"relative_time.hours": "{number}h",
"relative_time.just_now": "agora",
"relative_time.minutes": "{number}m",
"relative_time.seconds": "{number}s",
"relative_time.today": "hoje",
"reply_indicator.cancel": "Cancelar",
+ "report.block": "Bloquear",
+ "report.block_explanation": "You will not see their posts. They will not be able to see your posts or follow you. They will be able to tell that they are blocked.",
+ "report.categories.other": "Outro",
+ "report.categories.spam": "Spam",
+ "report.categories.violation": "O conteúdo viola uma ou mais regras do servidor",
+ "report.category.subtitle": "Choose the best match",
+ "report.category.title": "Tell us what's going on with this {type}",
+ "report.category.title_account": "perfil",
+ "report.category.title_status": "publicação",
+ "report.close": "Concluído",
+ "report.comment.title": "Is there anything else you think we should know?",
"report.forward": "Encaminhar para {target}",
"report.forward_hint": "A conta está em outra instância. Enviar uma cópia anônima da denúncia para lá?",
- "report.hint": "A denúncia será enviada aos moderadores da instância. Explique por que denunciou a conta:",
+ "report.mute": "Silenciar",
+ "report.mute_explanation": "You will not see their posts. They can still follow you and see your posts and will not know that they are muted.",
+ "report.next": "Próximo",
"report.placeholder": "Comentários adicionais aqui",
+ "report.reasons.dislike": "Eu não gosto disso",
+ "report.reasons.dislike_description": "It is not something you want to see",
+ "report.reasons.other": "It's something else",
+ "report.reasons.other_description": "O problema não se encaixa em outras categorias",
+ "report.reasons.spam": "É spam",
+ "report.reasons.spam_description": "Malicious links, fake engagement, or repetitive replies",
+ "report.reasons.violation": "It violates server rules",
+ "report.reasons.violation_description": "Você está ciente de que isso quebra regras específicas",
+ "report.rules.subtitle": "Selecione tudo que se aplica",
+ "report.rules.title": "Which rules are being violated?",
+ "report.statuses.subtitle": "Selecione tudo que se aplica",
+ "report.statuses.title": "Are there any posts that back up this report?",
"report.submit": "Enviar",
"report.target": "Denunciando {target}",
+ "report.thanks.take_action": "Here are your options for controlling what you see on Mastodon:",
+ "report.thanks.take_action_actionable": "Enquanto revisamos isso, você pode tomar medidas contra @{name}:",
+ "report.thanks.title": "Não quer ver isto?",
+ "report.thanks.title_actionable": "Obrigado por reportar. Vamos analisar.",
+ "report.unfollow": "Unfollow @{name}",
+ "report.unfollow_explanation": "You are following this account. To not see their posts in your home feed anymore, unfollow them.",
"search.placeholder": "Pesquisar",
"search_popout.search_format": "Formato de pesquisa avançada",
"search_popout.tips.full_text": "Texto simples retorna toots que você escreveu, favoritou, deu boost, ou em que foi mencionado, assim como nomes de usuário e de exibição, e hashtags correspondentes.",
@@ -382,7 +434,9 @@
"search_popout.tips.text": "Texto simples retorna nomes de exibição e de usuário, e hashtags correspondentes",
"search_popout.tips.user": "usuário",
"search_results.accounts": "Pessoas",
+ "search_results.all": "Tudo",
"search_results.hashtags": "Hashtags",
+ "search_results.nothing_found": "Não foi possível encontrar nada para estes termos de busca",
"search_results.statuses": "Toots",
"search_results.statuses_fts_disabled": "Pesquisar toots por seu conteúdo não está ativado nesta instância Mastodon.",
"search_results.total": "{count, number} {count, plural, one {resultado} other {resultados}}",
@@ -396,9 +450,14 @@
"status.delete": "Excluir",
"status.detailed_status": "Visão detalhada da conversa",
"status.direct": "Enviar toot direto para @{name}",
+ "status.edit": "Editar",
+ "status.edited": "Editado em {date}",
+ "status.edited_x_times": "Edited {count, plural, one {{count} time} other {{count} times}}",
"status.embed": "Incorporar",
"status.favourite": "Favoritar",
"status.filtered": "Filtrado",
+ "status.history.created": "{name} criou {date}",
+ "status.history.edited": "{name} editou {date}",
"status.load_more": "Ver mais",
"status.media_hidden": "Mídia sensível",
"status.mention": "Mencionar @{name}",
@@ -462,7 +521,7 @@
"upload_form.video_description": "Descrever para deficientes auditivos ou visuais",
"upload_modal.analyzing_picture": "Analisando imagem…",
"upload_modal.apply": "Aplicar",
- "upload_modal.applying": "Applying…",
+ "upload_modal.applying": "Aplicando…",
"upload_modal.choose_image": "Escolher imagem",
"upload_modal.description_placeholder": "Um pequeno jabuti xereta viu dez cegonhas felizes",
"upload_modal.detect_text": "Transcrever imagem",
diff --git a/app/javascript/mastodon/locales/pt-PT.json b/app/javascript/mastodon/locales/pt-PT.json
index a5cb6a335..4e06401ec 100644
--- a/app/javascript/mastodon/locales/pt-PT.json
+++ b/app/javascript/mastodon/locales/pt-PT.json
@@ -18,12 +18,12 @@
"account.followers": "Seguidores",
"account.followers.empty": "Ainda ninguém segue este utilizador.",
"account.followers_counter": "{count, plural, one {{counter} Seguidor} other {{counter} Seguidores}}",
+ "account.following": "A seguir",
"account.following_counter": "{count, plural, other {A seguir {counter}}}",
"account.follows.empty": "Este utilizador ainda não segue ninguém.",
"account.follows_you": "Segue-te",
"account.hide_reblogs": "Esconder partilhas de @{name}",
"account.joined": "Ingressou em {date}",
- "account.last_status": "Última atividade",
"account.link_verified_on": "A posse deste link foi verificada em {date}",
"account.locked_info": "Esta conta é privada. O proprietário revê manualmente quem a pode seguir.",
"account.media": "Média",
@@ -32,7 +32,6 @@
"account.mute": "Silenciar @{name}",
"account.mute_notifications": "Silenciar notificações de @{name}",
"account.muted": "Silenciada",
- "account.never_active": "Nunca",
"account.posts": "Toots",
"account.posts_with_replies": "Publicações e respostas",
"account.report": "Denunciar @{name}",
@@ -42,21 +41,24 @@
"account.statuses_counter": "{count, plural, one {{counter} Toot} other {{counter} Toots}}",
"account.unblock": "Desbloquear @{name}",
"account.unblock_domain": "Mostrar {domain}",
+ "account.unblock_short": "Desbloquear",
"account.unendorse": "Não mostrar no perfil",
"account.unfollow": "Deixar de seguir",
"account.unmute": "Não silenciar @{name}",
"account.unmute_notifications": "Deixar de silenciar @{name}",
+ "account.unmute_short": "Deixar de silenciar",
"account_note.placeholder": "Clique para adicionar nota",
- "admin.dashboard.retention": "Retention",
- "admin.dashboard.retention.average": "Average",
- "admin.dashboard.retention.cohort": "Sign-up month",
- "admin.dashboard.retention.cohort_size": "New users",
+ "admin.dashboard.daily_retention": "Taxa de retenção de utilizadores por dia após a inscrição",
+ "admin.dashboard.monthly_retention": "Taxa de retenção de utilizadores por mês após a inscrição",
+ "admin.dashboard.retention.average": "Média",
+ "admin.dashboard.retention.cohort": "Mês de inscrição",
+ "admin.dashboard.retention.cohort_size": "Novos utilizadores",
"alert.rate_limited.message": "Volte a tentar depois das {retry_time, time, medium}.",
"alert.rate_limited.title": "Limite de tentativas",
"alert.unexpected.message": "Ocorreu um erro inesperado.",
"alert.unexpected.title": "Bolas!",
"announcement.announcement": "Anúncio",
- "attachments_list.unprocessed": "(unprocessed)",
+ "attachments_list.unprocessed": "(não processado)",
"autosuggest_hashtag.per_week": "{count} por semana",
"boost_modal.combo": "Pode clicar {combo} para não voltar a ver",
"bundle_column_error.body": "Algo de errado aconteceu enquanto este componente era carregado.",
@@ -104,6 +106,7 @@
"compose_form.poll.switch_to_single": "Alterar a votação para permitir uma única escolha",
"compose_form.publish": "Toot",
"compose_form.publish_loud": "{publish}!",
+ "compose_form.save_changes": "Guardar alterações",
"compose_form.sensitive.hide": "Marcar media como sensível",
"compose_form.sensitive.marked": "Media marcada como sensível",
"compose_form.sensitive.unmarked": "Media não está marcada como sensível",
@@ -111,15 +114,15 @@
"compose_form.spoiler.unmarked": "O texto não está escondido",
"compose_form.spoiler_placeholder": "Escreva o seu aviso aqui",
"confirmation_modal.cancel": "Cancelar",
- "confirmations.block.block_and_report": "Bloquear e denunciar",
+ "confirmations.block.block_and_report": "Bloquear e Denunciar",
"confirmations.block.confirm": "Bloquear",
"confirmations.block.message": "De certeza que queres bloquear {name}?",
"confirmations.delete.confirm": "Eliminar",
"confirmations.delete.message": "De certeza que quer eliminar esta publicação?",
"confirmations.delete_list.confirm": "Eliminar",
"confirmations.delete_list.message": "Tens a certeza de que deseja eliminar permanentemente esta lista?",
- "confirmations.discard_edit_media.confirm": "Discard",
- "confirmations.discard_edit_media.message": "You have unsaved changes to the media description or preview, discard them anyway?",
+ "confirmations.discard_edit_media.confirm": "Descartar",
+ "confirmations.discard_edit_media.message": "Tem alterações não salvas na descrição ou pré-visualização da media. Descartar mesmo assim?",
"confirmations.domain_block.confirm": "Esconder tudo deste domínio",
"confirmations.domain_block.message": "De certeza que queres bloquear completamente o domínio {domain}? Na maioria dos casos, silenciar ou bloquear alguns utilizadores é suficiente e é o recomendado. Não irás ver conteúdo daquele domínio em cronologia alguma nem nas tuas notificações. Os teus seguidores daquele domínio serão removidos.",
"confirmations.logout.confirm": "Terminar sessão",
@@ -165,6 +168,7 @@
"empty_column.community": "A timeline local está vazia. Escreve algo publicamente para começar!",
"empty_column.direct": "Ainda não tem qualquer mensagem direta. Quando enviar ou receber alguma, ela irá aparecer aqui.",
"empty_column.domain_blocks": "Ainda não há qualquer domínio escondido.",
+ "empty_column.explore_statuses": "Nada em destaque por agora. Volte mais tarde!",
"empty_column.favourited_statuses": "Ainda não tens quaisquer toots favoritos. Quando tiveres algum, ele irá aparecer aqui.",
"empty_column.favourites": "Ainda ninguém marcou este toot como favorito. Quando alguém o fizer, ele irá aparecer aqui.",
"empty_column.follow_recommendations": "Parece que não foi possível gerar nenhuma sugestão para si. Pode tentar utilizar a pesquisa para procurar pessoas que conheça ou explorar as hashtags em destaque.",
@@ -183,6 +187,12 @@
"error.unexpected_crash.next_steps_addons": "Tente desabilitá-los e atualizar a página. Se isso não ajudar, você ainda poderá usar o Mastodon por meio de um navegador diferente ou de um aplicativo nativo.",
"errors.unexpected_crash.copy_stacktrace": "Copiar a stacktrace para o clipboard",
"errors.unexpected_crash.report_issue": "Reportar problema",
+ "explore.search_results": "Resultados da pesquisa",
+ "explore.suggested_follows": "Para si",
+ "explore.title": "Explorar",
+ "explore.trending_links": "Notícias",
+ "explore.trending_statuses": "Publicações",
+ "explore.trending_tags": "Hashtags",
"follow_recommendations.done": "Concluído",
"follow_recommendations.heading": "Siga pessoas das quais gostaria de ver publicações! Aqui estão algumas sugestões.",
"follow_recommendations.lead": "As publicações das pessoas que segue serão exibidos em ordem cronológica na sua página inicial. Não tenha medo de cometer erros, você pode deixar de seguir as pessoas tão facilmente a qualquer momento!",
@@ -284,6 +294,7 @@
"navigation_bar.discover": "Descobrir",
"navigation_bar.domain_blocks": "Domínios escondidos",
"navigation_bar.edit_profile": "Editar perfil",
+ "navigation_bar.explore": "Explorar",
"navigation_bar.favourites": "Favoritos",
"navigation_bar.filters": "Palavras silenciadas",
"navigation_bar.follow_requests": "Seguidores pendentes",
@@ -298,6 +309,7 @@
"navigation_bar.preferences": "Preferências",
"navigation_bar.public_timeline": "Cronologia federada",
"navigation_bar.security": "Segurança",
+ "notification.admin.sign_up": "{name} inscreveu-se",
"notification.favourite": "{name} adicionou a tua publicação aos favoritos",
"notification.follow": "{name} começou a seguir-te",
"notification.follow_request": "{name} pediu para segui-lo",
@@ -306,13 +318,15 @@
"notification.poll": "Uma votação em que participaste chegou ao fim",
"notification.reblog": "{name} partilhou a tua publicação",
"notification.status": "{name} acabou de publicar",
+ "notification.update": "{name} editou uma publicação",
"notifications.clear": "Limpar notificações",
"notifications.clear_confirmation": "Queres mesmo limpar todas as notificações?",
+ "notifications.column_settings.admin.sign_up": "Novas inscrições:",
"notifications.column_settings.alert": "Notificações no ambiente de trabalho",
"notifications.column_settings.favourite": "Favoritos:",
"notifications.column_settings.filter_bar.advanced": "Mostrar todas as categorias",
"notifications.column_settings.filter_bar.category": "Barra de filtros rápidos",
- "notifications.column_settings.filter_bar.show": "Mostrar",
+ "notifications.column_settings.filter_bar.show_bar": "Mostrar barra de filtros",
"notifications.column_settings.follow": "Novos seguidores:",
"notifications.column_settings.follow_request": "Novos pedidos de seguidor:",
"notifications.column_settings.mention": "Menções:",
@@ -322,7 +336,9 @@
"notifications.column_settings.show": "Mostrar na coluna",
"notifications.column_settings.sound": "Reproduzir som",
"notifications.column_settings.status": "Novos toots:",
- "notifications.column_settings.unread_markers.category": "Marcadores de notificação não lidas",
+ "notifications.column_settings.unread_notifications.category": "Notificações não lidas",
+ "notifications.column_settings.unread_notifications.highlight": "Destacar notificações não lidas",
+ "notifications.column_settings.update": "Edições:",
"notifications.filter.all": "Todas",
"notifications.filter.boosts": "Boosts",
"notifications.filter.favourites": "Favoritos",
@@ -346,7 +362,7 @@
"poll.total_votes": "{contar, plural, um {# vote} outro {# votes}}",
"poll.vote": "Votar",
"poll.voted": "Votaste nesta resposta",
- "poll.votes": "{votes, plural, one {# vote} other {# votes}}",
+ "poll.votes": "{votes, plural, one {# voto } other {# votos}}",
"poll_button.add_poll": "Adicionar votação",
"poll_button.remove_poll": "Remover votação",
"privacy.change": "Ajustar a privacidade da publicação",
@@ -362,18 +378,54 @@
"regeneration_indicator.label": "A carregar…",
"regeneration_indicator.sublabel": "A tua página inicial está a ser preparada!",
"relative_time.days": "{number}d",
+ "relative_time.full.days": "{number, plural,one {# dia} other {# dias}} atrás",
+ "relative_time.full.hours": "{number, plural,one {# hora}other {# horas}} atrás",
+ "relative_time.full.just_now": "agora mesmo",
+ "relative_time.full.minutes": "{number, plural,one {# minuto}other {# minutos}} atrás",
+ "relative_time.full.seconds": "{number, plural,one {# segundo} other {# segundos}} atrás",
"relative_time.hours": "{number}h",
"relative_time.just_now": "agora",
"relative_time.minutes": "{number}m",
"relative_time.seconds": "{number}s",
"relative_time.today": "hoje",
"reply_indicator.cancel": "Cancelar",
+ "report.block": "Bloquear",
+ "report.block_explanation": "Não verá as publicações deles. Eles não serão capazes de ver suas publicações ou de o seguir. Eles vão conseguir saber que estão bloqueados.",
+ "report.categories.other": "Outro",
+ "report.categories.spam": "Spam",
+ "report.categories.violation": "O conteúdo viola uma ou mais regras do servidor",
+ "report.category.subtitle": "Escolha a melhor correspondência",
+ "report.category.title": "Diga-nos o que se passa com esse {type}",
+ "report.category.title_account": "perfil",
+ "report.category.title_status": "publicação",
+ "report.close": "Concluído",
+ "report.comment.title": "Há algo mais que pensa que devemos saber?",
"report.forward": "Reenviar para {target}",
- "report.forward_hint": "A conta é de outra instância. Enviar uma cópia anónima do relatório para lá também?",
- "report.hint": "O relatório será enviado para os moderadores da sua instância. Pode fornecer, em baixo, uma explicação do motivo pelo qual está a denunciar esta conta:",
+ "report.forward_hint": "A conta é de outro servidor. Enviar uma cópia anónima da denúncia para lá também?",
+ "report.mute": "Silenciar",
+ "report.mute_explanation": "Não verá as publicações deles. Eles ainda poderão segui-lo e ver as suas publicações e não saberão que estão silenciados.",
+ "report.next": "Seguinte",
"report.placeholder": "Comentários adicionais",
+ "report.reasons.dislike": "Não gosto disso",
+ "report.reasons.dislike_description": "Não é algo que deseje ver",
+ "report.reasons.other": "É outra coisa",
+ "report.reasons.other_description": "O problema não se encaixa nas outras categorias",
+ "report.reasons.spam": "É spam",
+ "report.reasons.spam_description": "Links maliciosos, contactos falsos, ou respostas repetitivas",
+ "report.reasons.violation": "Viola as regras do servidor",
+ "report.reasons.violation_description": "Está ciente de que infringe regras específicas",
+ "report.rules.subtitle": "Selecione tudo o que se aplicar",
+ "report.rules.title": "Que regras estão a ser violadas?",
+ "report.statuses.subtitle": "Selecione tudo o que se aplicar",
+ "report.statuses.title": "Existe alguma publicação que suporte esta denúncia?",
"report.submit": "Enviar",
- "report.target": "Denunciar",
+ "report.target": "A denunciar {target}",
+ "report.thanks.take_action": "Aqui estão as suas opções para controlar o que vê no Mastodon:",
+ "report.thanks.take_action_actionable": "Enquanto revemos a sua denúncia, pode tomar medidas contra @{name}:",
+ "report.thanks.title": "Não quer ver isto?",
+ "report.thanks.title_actionable": "Obrigado por reportar, vamos analisar.",
+ "report.unfollow": "Deixar de seguir @{name}",
+ "report.unfollow_explanation": "Está a seguir esta conta. Para não ver mais as publicações desta conta na sua página inicial, deixe de segui-la.",
"search.placeholder": "Pesquisar",
"search_popout.search_format": "Formato avançado de pesquisa",
"search_popout.tips.full_text": "Texto simples devolve publicações que escreveu, marcou como favorita, partilhou ou em que foi mencionado, tal como nomes de utilizador, alcunhas e hashtags.",
@@ -382,7 +434,9 @@
"search_popout.tips.text": "O texto simples retorna a correspondência de nomes, utilizadores e hashtags",
"search_popout.tips.user": "utilizador",
"search_results.accounts": "Pessoas",
+ "search_results.all": "Tudo",
"search_results.hashtags": "Hashtags",
+ "search_results.nothing_found": "Não foi possível encontrar resultados para as expressões pesquisadas",
"search_results.statuses": "Toots",
"search_results.statuses_fts_disabled": "A pesquisa de toots pelo seu conteúdo não está disponível nesta instância Mastodon.",
"search_results.total": "{count, number} {count, plural, one {resultado} other {resultados}}",
@@ -396,9 +450,14 @@
"status.delete": "Eliminar",
"status.detailed_status": "Vista de conversação detalhada",
"status.direct": "Mensagem direta @{name}",
+ "status.edit": "Editar",
+ "status.edited": "Editado em {date}",
+ "status.edited_x_times": "Editado {count, plural,one {{count} vez} other {{count} vezes}}",
"status.embed": "Incorporar",
"status.favourite": "Adicionar aos favoritos",
"status.filtered": "Filtrada",
+ "status.history.created": "{name} criado em {date}",
+ "status.history.edited": "{name} editado em {date}",
"status.load_more": "Carregar mais",
"status.media_hidden": "Media escondida",
"status.mention": "Mencionar @{name}",
@@ -462,7 +521,7 @@
"upload_form.video_description": "Descreva para pessoas com diminuição da acuidade auditiva ou visual",
"upload_modal.analyzing_picture": "A analizar imagem…",
"upload_modal.apply": "Aplicar",
- "upload_modal.applying": "Applying…",
+ "upload_modal.applying": "A aplicar…",
"upload_modal.choose_image": "Escolher imagem",
"upload_modal.description_placeholder": "Grave e cabisbaixo, o filho justo zelava pela querida mãe doente",
"upload_modal.detect_text": "Detectar texto na imagem",
diff --git a/app/javascript/mastodon/locales/ro.json b/app/javascript/mastodon/locales/ro.json
index b6cb0a86c..bd91f19b9 100644
--- a/app/javascript/mastodon/locales/ro.json
+++ b/app/javascript/mastodon/locales/ro.json
@@ -18,12 +18,12 @@
"account.followers": "Abonați",
"account.followers.empty": "Acest utilizator încă nu are abonați.",
"account.followers_counter": "{count, plural, one {{counter} Abonat} few {{counter} Abonați} other {{counter} Abonați}}",
+ "account.following": "Following",
"account.following_counter": "{count, plural, one {{counter} Abonament} few {{counter} Abonamente} other {{counter} Abonamente}}",
"account.follows.empty": "Momentan acest utilizator nu are niciun abonament.",
"account.follows_you": "Este abonat la tine",
"account.hide_reblogs": "Ascunde distribuirile de la @{name}",
"account.joined": "S-a înscris în {date}",
- "account.last_status": "Ultima activitate",
"account.link_verified_on": "Proprietatea acestui link a fost verificată pe {date}",
"account.locked_info": "Acest profil este privat. Această persoană aprobă manual conturile care se abonează la ea.",
"account.media": "Media",
@@ -32,7 +32,6 @@
"account.mute": "Ignoră pe @{name}",
"account.mute_notifications": "Ignoră notificările de la @{name}",
"account.muted": "Ignorat",
- "account.never_active": "Niciodată",
"account.posts": "Postări",
"account.posts_with_replies": "Postări și răspunsuri",
"account.report": "Raportează pe @{name}",
@@ -42,21 +41,24 @@
"account.statuses_counter": "{count, plural, one {{counter} Toot} other {{counter} Toots}}",
"account.unblock": "Deblochează pe @{name}",
"account.unblock_domain": "Deblochează domeniul {domain}",
+ "account.unblock_short": "Unblock",
"account.unendorse": "Nu promova pe profil",
"account.unfollow": "Nu mai urmări",
"account.unmute": "Nu mai ignora pe @{name}",
"account.unmute_notifications": "Activează notificările de la @{name}",
+ "account.unmute_short": "Unmute",
"account_note.placeholder": "Click to add a note",
- "admin.dashboard.retention": "Retention",
- "admin.dashboard.retention.average": "Average",
- "admin.dashboard.retention.cohort": "Sign-up month",
- "admin.dashboard.retention.cohort_size": "New users",
+ "admin.dashboard.daily_retention": "User retention rate by day after sign-up",
+ "admin.dashboard.monthly_retention": "User retention rate by month after sign-up",
+ "admin.dashboard.retention.average": "În medie",
+ "admin.dashboard.retention.cohort": "Înregistrări lunar",
+ "admin.dashboard.retention.cohort_size": "Utilizatori noi",
"alert.rate_limited.message": "Vă rugăm să reîncercați după {retry_time, time, medium}.",
"alert.rate_limited.title": "Debit limitat",
"alert.unexpected.message": "A apărut o eroare neașteptată.",
"alert.unexpected.title": "Ups!",
"announcement.announcement": "Anunț",
- "attachments_list.unprocessed": "(unprocessed)",
+ "attachments_list.unprocessed": "(neprocesate)",
"autosuggest_hashtag.per_week": "{count} pe săptămână",
"boost_modal.combo": "Poți apăsa {combo} pentru a sări peste asta data viitoare",
"bundle_column_error.body": "A apărut o eroare la încărcarea acestui element.",
@@ -104,6 +106,7 @@
"compose_form.poll.switch_to_single": "Modifică sondajul pentru a permite o singură opțiune",
"compose_form.publish": "Postează",
"compose_form.publish_loud": "{publish}!",
+ "compose_form.save_changes": "Save changes",
"compose_form.sensitive.hide": "{count, plural, one {Marchează conținutul media ca fiind sensibil} few {Marchează conținuturile media ca fiind sensibile} other {Marchează conținuturile media ca fiind sensibile}}",
"compose_form.sensitive.marked": "{count, plural, one {Conținutul media este marcat ca fiind sensibil} other {Conținuturile media sunt marcate ca fiind sensibile}}",
"compose_form.sensitive.unmarked": "{count, plural, one {Conținutul media nu este marcat ca fiind sensibil} other {Conținuturile media nu sunt marcate ca fiind sensibile}}",
@@ -118,8 +121,8 @@
"confirmations.delete.message": "Ești sigur că vrei să elimini această postare?",
"confirmations.delete_list.confirm": "Elimină",
"confirmations.delete_list.message": "Ești sigur că vrei să elimini definitiv această listă?",
- "confirmations.discard_edit_media.confirm": "Discard",
- "confirmations.discard_edit_media.message": "You have unsaved changes to the media description or preview, discard them anyway?",
+ "confirmations.discard_edit_media.confirm": "Renunță",
+ "confirmations.discard_edit_media.message": "Ai modificări nesalvate în descrierea sau previzualizarea media, renunți oricum?",
"confirmations.domain_block.confirm": "Blochează întregul domeniu",
"confirmations.domain_block.message": "Ești absolut sigur că vrei să blochezi tot domeniul {domain}? În cele mai multe cazuri, raportarea sau blocarea anumitor lucruri este suficientă și de preferat. Nu vei mai vedea niciun conținut din acest domeniu în vreun flux public sau în vreo notificare. Abonații tăi din acest domeniu vor fi eliminați.",
"confirmations.logout.confirm": "Deconectare",
@@ -165,6 +168,7 @@
"empty_column.community": "Nu există nimic în cronologia locală. Postează ceva public pentru a sparge gheața!",
"empty_column.direct": "Momentan nu ai niciun mesaj direct. Când trimiți sau primești un mesaj, va apărea aici.",
"empty_column.domain_blocks": "Momentan nu există domenii blocate.",
+ "empty_column.explore_statuses": "Nothing is trending right now. Check back later!",
"empty_column.favourited_statuses": "Momentan nu ai nicio postare favorită. Când vei adăuga una, va apărea aici.",
"empty_column.favourites": "Momentan nimeni nu a adăugat această postare la favorite. Când cineva o va face, va apărea aici.",
"empty_column.follow_recommendations": "Se pare că nu am putut genera nicio sugestie pentru tine. Poți încerca funcția de căutare pentru a căuta persoane pe care le cunoști, sau poți explora tendințele.",
@@ -183,6 +187,12 @@
"error.unexpected_crash.next_steps_addons": "Încearcă să le dezactivezi și să reîmprospătezi pagina. Dacă tot nu funcționează, poți accesa Mastodon dintr-un alt navigator sau dintr-o aplicație nativă.",
"errors.unexpected_crash.copy_stacktrace": "Copiere stacktrace în clipboard",
"errors.unexpected_crash.report_issue": "Raportează o problemă",
+ "explore.search_results": "Search results",
+ "explore.suggested_follows": "For you",
+ "explore.title": "Explore",
+ "explore.trending_links": "News",
+ "explore.trending_statuses": "Posts",
+ "explore.trending_tags": "Hashtags",
"follow_recommendations.done": "Terminat",
"follow_recommendations.heading": "Urmărește persoanele ale căror postări te-ar interesa! Iată câteva sugestii.",
"follow_recommendations.lead": "Postările de la persoanele la care te-ai abonat vor apărea în ordine cronologică în cronologia principală. Nu-ți fie teamă să faci greșeli, poți să te dezabonezi oricând de la ei la fel de ușor!",
@@ -284,6 +294,7 @@
"navigation_bar.discover": "Descoperă",
"navigation_bar.domain_blocks": "Domenii blocate",
"navigation_bar.edit_profile": "Modifică profilul",
+ "navigation_bar.explore": "Explore",
"navigation_bar.favourites": "Favorite",
"navigation_bar.filters": "Cuvinte ignorate",
"navigation_bar.follow_requests": "Cereri de abonare",
@@ -298,6 +309,7 @@
"navigation_bar.preferences": "Preferințe",
"navigation_bar.public_timeline": "Cronologie globală",
"navigation_bar.security": "Securitate",
+ "notification.admin.sign_up": "{name} signed up",
"notification.favourite": "{name} a adăugat postarea ta la favorite",
"notification.follow": "{name} s-a abonat la tine",
"notification.follow_request": "{name} a trimis o cerere de abonare",
@@ -306,13 +318,15 @@
"notification.poll": "Un sondaj pentru care ai votat s-a încheiat",
"notification.reblog": "{name} ți-a distribuit postarea",
"notification.status": "{name} tocmai a postat",
+ "notification.update": "{name} edited a post",
"notifications.clear": "Șterge notificările",
"notifications.clear_confirmation": "Ești sigur că vrei să ștergi permanent toate notificările?",
+ "notifications.column_settings.admin.sign_up": "New sign-ups:",
"notifications.column_settings.alert": "Notificări pe desktop",
"notifications.column_settings.favourite": "Favorite:",
"notifications.column_settings.filter_bar.advanced": "Afișează toate categoriile",
"notifications.column_settings.filter_bar.category": "Bară de filtrare rapidă",
- "notifications.column_settings.filter_bar.show": "Afișează",
+ "notifications.column_settings.filter_bar.show_bar": "Arată bara de filtrare",
"notifications.column_settings.follow": "Noi abonați:",
"notifications.column_settings.follow_request": "Noi cereri de abonare:",
"notifications.column_settings.mention": "Mențiuni:",
@@ -322,7 +336,9 @@
"notifications.column_settings.show": "Afișează în coloană",
"notifications.column_settings.sound": "Redare sunet",
"notifications.column_settings.status": "Postări noi:",
- "notifications.column_settings.unread_markers.category": "Marcaje de notificări necitite",
+ "notifications.column_settings.unread_notifications.category": "Notificări necitite",
+ "notifications.column_settings.unread_notifications.highlight": "Evidențiază notificările necitite",
+ "notifications.column_settings.update": "Edits:",
"notifications.filter.all": "Toate",
"notifications.filter.boosts": "Distribuiri",
"notifications.filter.favourites": "Favorite",
@@ -346,7 +362,7 @@
"poll.total_votes": "{count, plural, one {# vot} other {# voturi}}",
"poll.vote": "Votează",
"poll.voted": "Ai votat pentru acest răspuns",
- "poll.votes": "{votes, plural, one {# vote} other {# votes}}",
+ "poll.votes": "{votes, plural, one {# vot} other {# voturi}}",
"poll_button.add_poll": "Adaugă un sondaj",
"poll_button.remove_poll": "Elimină sondajul",
"privacy.change": "Modifică confidențialitatea postării",
@@ -362,18 +378,54 @@
"regeneration_indicator.label": "Se încarcă…",
"regeneration_indicator.sublabel": "Cronologia ta principală este în curs de pregătire!",
"relative_time.days": "{number}z",
+ "relative_time.full.days": "{number, plural, one {# day} other {# days}} ago",
+ "relative_time.full.hours": "{number, plural, one {# hour} other {# hours}} ago",
+ "relative_time.full.just_now": "just now",
+ "relative_time.full.minutes": "{number, plural, one {# minute} other {# minutes}} ago",
+ "relative_time.full.seconds": "{number, plural, one {# second} other {# seconds}} ago",
"relative_time.hours": "{number}o",
"relative_time.just_now": "acum",
"relative_time.minutes": "{number}m",
"relative_time.seconds": "{number}s",
"relative_time.today": "astăzi",
"reply_indicator.cancel": "Anulează",
+ "report.block": "Block",
+ "report.block_explanation": "You will not see their posts. They will not be able to see your posts or follow you. They will be able to tell that they are blocked.",
+ "report.categories.other": "Other",
+ "report.categories.spam": "Spam",
+ "report.categories.violation": "Content violates one or more server rules",
+ "report.category.subtitle": "Choose the best match",
+ "report.category.title": "Tell us what's going on with this {type}",
+ "report.category.title_account": "profile",
+ "report.category.title_status": "post",
+ "report.close": "Done",
+ "report.comment.title": "Is there anything else you think we should know?",
"report.forward": "Redirecționează către {target}",
"report.forward_hint": "Acest cont este de pe un alt server. Trimitem o copie anonimă a raportului și acolo?",
- "report.hint": "Sesizarea va fi trimisă către moderatorii acestei instanțe. Poți oferi o explicație pentru această sesizare mai jos:",
+ "report.mute": "Mute",
+ "report.mute_explanation": "You will not see their posts. They can still follow you and see your posts and will not know that they are muted.",
+ "report.next": "Next",
"report.placeholder": "Comentarii adiționale",
+ "report.reasons.dislike": "I don't like it",
+ "report.reasons.dislike_description": "It is not something you want to see",
+ "report.reasons.other": "It's something else",
+ "report.reasons.other_description": "The issue does not fit into other categories",
+ "report.reasons.spam": "It's spam",
+ "report.reasons.spam_description": "Malicious links, fake engagement, or repetitive replies",
+ "report.reasons.violation": "It violates server rules",
+ "report.reasons.violation_description": "You are aware that it breaks specific rules",
+ "report.rules.subtitle": "Select all that apply",
+ "report.rules.title": "Which rules are being violated?",
+ "report.statuses.subtitle": "Select all that apply",
+ "report.statuses.title": "Are there any posts that back up this report?",
"report.submit": "Trimite",
"report.target": "Raportează {target}",
+ "report.thanks.take_action": "Here are your options for controlling what you see on Mastodon:",
+ "report.thanks.take_action_actionable": "While we review this, you can take action against @{name}:",
+ "report.thanks.title": "Don't want to see this?",
+ "report.thanks.title_actionable": "Thanks for reporting, we'll look into this.",
+ "report.unfollow": "Unfollow @{name}",
+ "report.unfollow_explanation": "You are following this account. To not see their posts in your home feed anymore, unfollow them.",
"search.placeholder": "Caută",
"search_popout.search_format": "Formate pentru căutare avansată",
"search_popout.tips.full_text": "Textele simple returnează postări pe care le-ai scris, favorizat, impulsionat, sau în care sunt menționate, deasemenea și utilizatorii sau hashtag-urile care se potrivesc.",
@@ -382,7 +434,9 @@
"search_popout.tips.text": "Textele simple returnează nume, nume de utilizatori și hashtag-urile care se potrivesc",
"search_popout.tips.user": "utilizator",
"search_results.accounts": "Persoane",
+ "search_results.all": "All",
"search_results.hashtags": "Hashtag-uri",
+ "search_results.nothing_found": "Could not find anything for these search terms",
"search_results.statuses": "Postări",
"search_results.statuses_fts_disabled": "Căutarea de postări după conținutul lor nu este activată pe acest server.",
"search_results.total": "{count, number} {count, plural, one {rezultat} other {rezultate}}",
@@ -396,9 +450,14 @@
"status.delete": "Șterge",
"status.detailed_status": "Conversația detaliată",
"status.direct": "Mesaj direct către @{name}",
+ "status.edit": "Edit",
+ "status.edited": "Edited {date}",
+ "status.edited_x_times": "Edited {count, plural, one {{count} time} other {{count} times}}",
"status.embed": "Înglobează",
"status.favourite": "Favorite",
"status.filtered": "Sortate",
+ "status.history.created": "{name} created {date}",
+ "status.history.edited": "{name} edited {date}",
"status.load_more": "Încarcă mai multe",
"status.media_hidden": "Media ascunsă",
"status.mention": "Menționează pe @{name}",
@@ -462,7 +521,7 @@
"upload_form.video_description": "Adaugă o descriere pentru persoanele cu deficiențe vizuale sau auditive",
"upload_modal.analyzing_picture": "Se analizează imaginea…",
"upload_modal.apply": "Aplică",
- "upload_modal.applying": "Applying…",
+ "upload_modal.applying": "Se aplică…",
"upload_modal.choose_image": "Alege imaginea",
"upload_modal.description_placeholder": "Vând muzică de jazz și haine de bun-gust în New-York și Quebec la preț fix",
"upload_modal.detect_text": "Detectare text din imagine",
diff --git a/app/javascript/mastodon/locales/ru.json b/app/javascript/mastodon/locales/ru.json
index 30abbc0c2..79fac6eb5 100644
--- a/app/javascript/mastodon/locales/ru.json
+++ b/app/javascript/mastodon/locales/ru.json
@@ -18,12 +18,12 @@
"account.followers": "Подписчики",
"account.followers.empty": "На этого пользователя пока никто не подписан.",
"account.followers_counter": "{count, plural, one {{counter} подписчик} many {{counter} подписчиков} other {{counter} подписчика}}",
+ "account.following": "Подписки",
"account.following_counter": "{count, plural, one {{counter} подписка} many {{counter} подписок} other {{counter} подписки}}",
"account.follows.empty": "Этот пользователь пока ни на кого не подписался.",
"account.follows_you": "Подписан(а) на вас",
"account.hide_reblogs": "Скрыть продвижения от @{name}",
"account.joined": "Зарегистрирован(а) с {date}",
- "account.last_status": "Последняя активность",
"account.link_verified_on": "Владение этой ссылкой было проверено {date}",
"account.locked_info": "Это закрытый аккаунт. Его владелец вручную одобряет подписчиков.",
"account.media": "Медиа",
@@ -32,31 +32,33 @@
"account.mute": "Игнорировать @{name}",
"account.mute_notifications": "Скрыть уведомления от @{name}",
"account.muted": "Игнорируется",
- "account.never_active": "Никогда",
"account.posts": "Посты",
"account.posts_with_replies": "Посты и ответы",
- "account.report": "Жалоба №{name}",
+ "account.report": "Пожаловаться на @{name}",
"account.requested": "Ожидает подтверждения. Нажмите для отмены запроса",
"account.share": "Поделиться профилем @{name}",
"account.show_reblogs": "Показывать продвижения от @{name}",
"account.statuses_counter": "{count, plural, one {{counter} пост} many {{counter} постов} other {{counter} поста}}",
"account.unblock": "Разблокировать @{name}",
"account.unblock_domain": "Разблокировать {domain}",
+ "account.unblock_short": "Разблокировать",
"account.unendorse": "Не рекомендовать в профиле",
"account.unfollow": "Отписаться",
- "account.unmute": "Убрать {name} из игнорируемых",
+ "account.unmute": "Не игнорировать @{name}",
"account.unmute_notifications": "Показывать уведомления от @{name}",
+ "account.unmute_short": "Не игнорировать",
"account_note.placeholder": "Текст заметки",
- "admin.dashboard.retention": "Retention",
- "admin.dashboard.retention.average": "Average",
- "admin.dashboard.retention.cohort": "Sign-up month",
- "admin.dashboard.retention.cohort_size": "New users",
+ "admin.dashboard.daily_retention": "Уровень удержания пользователей после регистрации, в днях",
+ "admin.dashboard.monthly_retention": "Уровень удержания пользователей после регистрации, в месяцах",
+ "admin.dashboard.retention.average": "Среднее",
+ "admin.dashboard.retention.cohort": "Месяц регистрации",
+ "admin.dashboard.retention.cohort_size": "Новые пользователи",
"alert.rate_limited.message": "Пожалуйста, повторите после {retry_time, time, medium}.",
- "alert.rate_limited.title": "Вы выполняете действие слишком часто",
+ "alert.rate_limited.title": "Ограничение количества запросов",
"alert.unexpected.message": "Произошла непредвиденная ошибка.",
"alert.unexpected.title": "Упс!",
"announcement.announcement": "Объявление",
- "attachments_list.unprocessed": "(unprocessed)",
+ "attachments_list.unprocessed": "(не обработан)",
"autosuggest_hashtag.per_week": "{count} / неделю",
"boost_modal.combo": "{combo}, чтобы пропустить это в следующий раз",
"bundle_column_error.body": "Что-то пошло не так при загрузке этого компонента.",
@@ -104,6 +106,7 @@
"compose_form.poll.switch_to_single": "Переключить в режим выбора одного ответа",
"compose_form.publish": "Запостить",
"compose_form.publish_loud": "{publish}!",
+ "compose_form.save_changes": "Сохранить",
"compose_form.sensitive.hide": "{count, plural, one {Отметить медифайл как деликатный} other {Отметить медифайлы как деликатные}}",
"compose_form.sensitive.marked": "Медиа{count, plural, =1 {файл отмечен} other {файлы отмечены}} как «деликатного характера»",
"compose_form.sensitive.unmarked": "Медиа{count, plural, =1 {файл не отмечен} other {файлы не отмечены}} как «деликатного характера»",
@@ -118,8 +121,8 @@
"confirmations.delete.message": "Вы уверены, что хотите удалить этот пост?",
"confirmations.delete_list.confirm": "Удалить",
"confirmations.delete_list.message": "Вы действительно хотите навсегда удалить этот список?",
- "confirmations.discard_edit_media.confirm": "Discard",
- "confirmations.discard_edit_media.message": "You have unsaved changes to the media description or preview, discard them anyway?",
+ "confirmations.discard_edit_media.confirm": "Отменить",
+ "confirmations.discard_edit_media.message": "У вас имеются несохранённые изменения превью и описания медиафайла, отменить их?",
"confirmations.domain_block.confirm": "Да, заблокировать узел",
"confirmations.domain_block.message": "Вы точно уверены, что хотите скрыть все посты с узла {domain}? В большинстве случаев пары блокировок и скрытий вполне достаточно.\n\nПри блокировке узла, вы перестанете получать уведомления оттуда, все посты будут скрыты из публичных лент, а подписчики убраны.",
"confirmations.logout.confirm": "Выйти",
@@ -165,6 +168,7 @@
"empty_column.community": "Локальная лента пуста. Напишите что-нибудь, чтобы разогреть народ!",
"empty_column.direct": "У вас пока нет личных сообщений. Как только вы отправите или получите одно, оно появится здесь.",
"empty_column.domain_blocks": "Скрытых доменов пока нет.",
+ "empty_column.explore_statuses": "Нет актуального. Проверьте позже!",
"empty_column.favourited_statuses": "Вы не добавили ни один пост в «Избранное». Как только вы это сделаете, он появится здесь.",
"empty_column.favourites": "Никто ещё не добавил этот пост в «Избранное». Как только кто-то это сделает, это отобразится здесь.",
"empty_column.follow_recommendations": "Похоже, у нас нет предложений для вас. Вы можете попробовать поискать людей, которых уже знаете, или изучить актуальные хэштеги.",
@@ -183,6 +187,12 @@
"error.unexpected_crash.next_steps_addons": "Попробуйте их отключить и перезагрузить страницу. Если это не поможет, вы по-прежнему сможете войти в Mastodon через другой браузер или приложение.",
"errors.unexpected_crash.copy_stacktrace": "Скопировать диагностическую информацию",
"errors.unexpected_crash.report_issue": "Сообщить о проблеме",
+ "explore.search_results": "Результаты поиска",
+ "explore.suggested_follows": "Для вас",
+ "explore.title": "Обзор",
+ "explore.trending_links": "Новости",
+ "explore.trending_statuses": "Посты",
+ "explore.trending_tags": "Хэштеги",
"follow_recommendations.done": "Готово",
"follow_recommendations.heading": "Подпишитесь на людей, чьи посты вы бы хотели видеть. Вот несколько предложений.",
"follow_recommendations.lead": "Посты от людей, на которых вы подписаны, будут отображаться в вашей домашней ленте в хронологическом порядке. Не бойтесь ошибиться — вы так же легко сможете отписаться от них в любое время!",
@@ -193,10 +203,10 @@
"getting_started.developers": "Разработчикам",
"getting_started.directory": "Каталог профилей",
"getting_started.documentation": "Документация",
- "getting_started.heading": "Добро пожаловать",
+ "getting_started.heading": "Начать",
"getting_started.invite": "Пригласить людей",
"getting_started.open_source_notice": "Mastodon — сервис с открытым исходным кодом. Вы можете внести вклад или сообщить о проблемах на GitHub: {github}.",
- "getting_started.security": "Безопасность",
+ "getting_started.security": "Настройки учётной записи",
"getting_started.terms": "Условия использования",
"hashtag.column_header.tag_mode.all": "и {additional}",
"hashtag.column_header.tag_mode.any": "или {additional}",
@@ -243,9 +253,9 @@
"keyboard_shortcuts.requests": "перейти к запросам на подписку",
"keyboard_shortcuts.search": "перейти к поиску",
"keyboard_shortcuts.spoilers": "показать/скрыть поле предупреждения о содержании",
- "keyboard_shortcuts.start": "перейти к разделу \"добро пожаловать\"",
+ "keyboard_shortcuts.start": "Перейти к разделу \"Начать\"",
"keyboard_shortcuts.toggle_hidden": "показать/скрыть текст за предупреждением",
- "keyboard_shortcuts.toggle_sensitivity": "показать/скрыть медиафайлы",
+ "keyboard_shortcuts.toggle_sensitivity": "Показать/скрыть медиафайлы",
"keyboard_shortcuts.toot": "начать писать новый пост",
"keyboard_shortcuts.unfocus": "убрать фокус с поля ввода/поиска",
"keyboard_shortcuts.up": "вверх по списку",
@@ -284,6 +294,7 @@
"navigation_bar.discover": "Изучайте",
"navigation_bar.domain_blocks": "Скрытые домены",
"navigation_bar.edit_profile": "Изменить профиль",
+ "navigation_bar.explore": "Обзор",
"navigation_bar.favourites": "Избранное",
"navigation_bar.filters": "Игнорируемые слова",
"navigation_bar.follow_requests": "Запросы на подписку",
@@ -298,6 +309,7 @@
"navigation_bar.preferences": "Настройки",
"navigation_bar.public_timeline": "Глобальная лента",
"navigation_bar.security": "Безопасность",
+ "notification.admin.sign_up": "{name} зарегистрирован",
"notification.favourite": "{name} добавил(а) ваш пост в избранное",
"notification.follow": "{name} подписался (-лась) на вас",
"notification.follow_request": "{name} отправил запрос на подписку",
@@ -306,13 +318,15 @@
"notification.poll": "Опрос, в котором вы приняли участие, завершился",
"notification.reblog": "{name} продвинул(а) ваш пост",
"notification.status": "{name} только что запостил",
+ "notification.update": "{name} изменил(а) пост",
"notifications.clear": "Очистить уведомления",
"notifications.clear_confirmation": "Вы уверены, что хотите очистить все уведомления?",
+ "notifications.column_settings.admin.sign_up": "Новые регистрации:",
"notifications.column_settings.alert": "Уведомления на рабочем столе",
"notifications.column_settings.favourite": "Ваш пост добавили в «избранное»:",
"notifications.column_settings.filter_bar.advanced": "Отображать все категории",
"notifications.column_settings.filter_bar.category": "Панель сортировки",
- "notifications.column_settings.filter_bar.show": "Отображать панель сортировки",
+ "notifications.column_settings.filter_bar.show_bar": "Отображать панель сортировки",
"notifications.column_settings.follow": "У вас новый подписчик:",
"notifications.column_settings.follow_request": "Новые запросы на подписку:",
"notifications.column_settings.mention": "Вас упомянули в посте:",
@@ -322,7 +336,9 @@
"notifications.column_settings.show": "Отображать в списке",
"notifications.column_settings.sound": "Проигрывать звук",
"notifications.column_settings.status": "Новые посты:",
- "notifications.column_settings.unread_markers.category": "Маркеры непрочитанных уведомлений",
+ "notifications.column_settings.unread_notifications.category": "Непрочитанные уведомления",
+ "notifications.column_settings.unread_notifications.highlight": "Выделять непрочитанные уведомления",
+ "notifications.column_settings.update": "Правки:",
"notifications.filter.all": "Все",
"notifications.filter.boosts": "Продвижения",
"notifications.filter.favourites": "Отметки «избранного»",
@@ -346,7 +362,7 @@
"poll.total_votes": "{count, plural, one {# голос} few {# голоса} many {# голосов} other {# голосов}}",
"poll.vote": "Голосовать",
"poll.voted": "Вы проголосовали за этот вариант",
- "poll.votes": "{votes, plural, one {# vote} other {# votes}}",
+ "poll.votes": "{votes, plural, one {# голос} many {# голосов} other {# голоса}}",
"poll_button.add_poll": "Добавить опрос",
"poll_button.remove_poll": "Удалить опрос",
"privacy.change": "Изменить видимость поста",
@@ -362,18 +378,54 @@
"regeneration_indicator.label": "Загрузка…",
"regeneration_indicator.sublabel": "Один момент, мы подготавливаем вашу ленту!",
"relative_time.days": "{number} д",
+ "relative_time.full.days": "{number, plural, one {# день} many {# дней} other {# дня}} назад",
+ "relative_time.full.hours": "{number, plural, one {# час} many {# часов} other {# часа}} назад",
+ "relative_time.full.just_now": "только что",
+ "relative_time.full.minutes": "{number, plural, one {# минуту} many {# минут} other {# минуты}} назад",
+ "relative_time.full.seconds": "{number, plural, one {# секунду} many {# секунд} other {# секунды}} назад",
"relative_time.hours": "{number} ч",
"relative_time.just_now": "только что",
"relative_time.minutes": "{number} мин",
"relative_time.seconds": "{number} с",
"relative_time.today": "сегодня",
"reply_indicator.cancel": "Отмена",
- "report.forward": "Переслать в {target}",
+ "report.block": "Заблокировать",
+ "report.block_explanation": "В перестаните видеть посты этого пользователя, а он(а) больше не сможет подписаться на вас и читать ваши посты. Он(а) сможет понять что вы заблокировали его/её.",
+ "report.categories.other": "Другое",
+ "report.categories.spam": "Спам",
+ "report.categories.violation": "Содержимое нарушает одно или несколько правил узла",
+ "report.category.subtitle": "Выберите наиболее подходящее",
+ "report.category.title": "Расскажите нам, что не так с {type}",
+ "report.category.title_account": "этим профилем",
+ "report.category.title_status": "этим постом",
+ "report.close": "Готово",
+ "report.comment.title": "Есть ли что-нибудь ещё, что нам стоит знать?",
+ "report.forward": "Переслать на {target}",
"report.forward_hint": "Эта учётная запись расположена на другом узле. Отправить туда анонимную копию вашей жалобы?",
- "report.hint": "Жалоба будет отправлена модераторам вашего узла. Вы также можете указать подробную причину жалобы ниже:",
- "report.placeholder": "Комментарий",
+ "report.mute": "Игнорировать",
+ "report.mute_explanation": "Вы не будете видеть их посты. Они по-прежнему могут подписываться на вас и видеть ваши посты, но не будут знать, что они в списке игнорируемых.",
+ "report.next": "Далее",
+ "report.placeholder": "Дополнительные комментарии",
+ "report.reasons.dislike": "Мне не нравится",
+ "report.reasons.dislike_description": "Не хотел(а) бы видеть такой контент",
+ "report.reasons.other": "Другое",
+ "report.reasons.other_description": "Проблема не попадает ни под одну из категорий",
+ "report.reasons.spam": "Это спам",
+ "report.reasons.spam_description": "Вредоносные ссылки, фальшивое взаимодействие или повторяющиеся ответы",
+ "report.reasons.violation": "Нарушаются правила сервера",
+ "report.reasons.violation_description": "Вы знаете, что подобное нарушает определенные правила",
+ "report.rules.subtitle": "Выберите все подходящие варианты",
+ "report.rules.title": "Какие правила нарушены?",
+ "report.statuses.subtitle": "Выберите все подходящие варианты",
+ "report.statuses.title": "Выберите посты, которые относятся к вашей жалобе.",
"report.submit": "Отправить",
"report.target": "Жалоба на {target}",
+ "report.thanks.take_action": "Вот несколько опций управления тем, что вы видите в Mastodon:",
+ "report.thanks.take_action_actionable": "Пока мы рассматриваем его, вот действия, которые вы можете предпринять лично против @{name}:",
+ "report.thanks.title": "Не хотите видеть это?",
+ "report.thanks.title_actionable": "Спасибо за обращение, мы его рассмотрим.",
+ "report.unfollow": "Отписаться от @{name}",
+ "report.unfollow_explanation": "Вы подписаны на этого пользователя. Чтобы не видеть его/её посты в своей домашней ленте, отпишитесь от него/неё.",
"search.placeholder": "Поиск",
"search_popout.search_format": "Продвинутый формат поиска",
"search_popout.tips.full_text": "Поиск по простому тексту отобразит посты, которые вы написали, добавили в избранное, продвинули или в которых были упомянуты, а также подходящие имена пользователей и хэштеги.",
@@ -382,9 +434,11 @@
"search_popout.tips.text": "Простой ввод текста покажет совпадающие имена пользователей, отображаемые имена и хэштеги",
"search_popout.tips.user": "пользователь",
"search_results.accounts": "Люди",
+ "search_results.all": "Все",
"search_results.hashtags": "Хэштеги",
+ "search_results.nothing_found": "Could not find anything for these search terms",
"search_results.statuses": "Посты",
- "search_results.statuses_fts_disabled": "Поиск постов по их содержанию не поддерживается данным узлом Mastodon.",
+ "search_results.statuses_fts_disabled": "Поиск постов по их содержанию не поддерживается данным сервером Mastodon.",
"search_results.total": "{count, number} {count, plural, one {результат} few {результата} many {результатов} other {результатов}}",
"status.admin_account": "Открыть интерфейс модератора для @{name}",
"status.admin_status": "Открыть этот пост в интерфейсе модератора",
@@ -396,9 +450,14 @@
"status.delete": "Удалить",
"status.detailed_status": "Подробный просмотр обсуждения",
"status.direct": "Написать @{name}",
+ "status.edit": "Изменить",
+ "status.edited": "Последнее изменение: {date}",
+ "status.edited_x_times": "{count, plural, one {{count} изменение} many {{count} изменений} other {{count} изменения}}",
"status.embed": "Встроить на свой сайт",
"status.favourite": "В избранное",
"status.filtered": "Отфильтровано",
+ "status.history.created": "{name} создал {date}",
+ "status.history.edited": "{name} отредактировал {date}",
"status.load_more": "Загрузить остальное",
"status.media_hidden": "Файл скрыт",
"status.mention": "Упомянуть @{name}",
@@ -444,7 +503,7 @@
"timeline_hint.resources.followers": "подписчиков",
"timeline_hint.resources.follows": "подписки",
"timeline_hint.resources.statuses": "прошлые посты",
- "trends.counter_by_accounts": "{count, plural, one {{counter} человек обсуждает} few {{counter} человека обсуждает} many {{counter} человек обсуждают} other {{counter} обсуждают}} ",
+ "trends.counter_by_accounts": "{count, plural, one {{counter} человек обсуждает} few {{counter} человека обсуждают} many {{counter} человек обсуждают} other {{counter} человека обсуждает}}",
"trends.trending_now": "Самое актуальное",
"ui.beforeunload": "Ваш черновик будет утерян, если вы покинете Mastodon.",
"units.short.billion": "{count} млрд",
@@ -462,7 +521,7 @@
"upload_form.video_description": "Опишите видео для людей с нарушением слуха или зрения",
"upload_modal.analyzing_picture": "Обработка изображения…",
"upload_modal.apply": "Применить",
- "upload_modal.applying": "Applying…",
+ "upload_modal.applying": "Применение…",
"upload_modal.choose_image": "Выбрать изображение",
"upload_modal.description_placeholder": "На дворе трава, на траве дрова",
"upload_modal.detect_text": "Найти текст на картинке",
diff --git a/app/javascript/mastodon/locales/sa.json b/app/javascript/mastodon/locales/sa.json
index 1e496c3ec..e1910d283 100644
--- a/app/javascript/mastodon/locales/sa.json
+++ b/app/javascript/mastodon/locales/sa.json
@@ -18,12 +18,12 @@
"account.followers": "अनुसर्तारः",
"account.followers.empty": "नाऽनुसर्तारो वर्तन्ते",
"account.followers_counter": "{count, plural, one {{counter} अनुसर्ता} two {{counter} अनुसर्तारौ} other {{counter} अनुसर्तारः}}",
+ "account.following": "Following",
"account.following_counter": "{count, plural, one {{counter} अनुसृतः} two {{counter} अनुसृतौ} other {{counter} अनुसृताः}}",
"account.follows.empty": "न कोऽप्यनुसृतो वर्तते",
"account.follows_you": "त्वामनुसरति",
"account.hide_reblogs": "@{name} मित्रस्य प्रकाशनानि छिद्यन्ताम्",
"account.joined": "Joined {date}",
- "account.last_status": "गतसक्रियता",
"account.link_verified_on": "अन्तर्जालस्थानस्यास्य स्वामित्वं परीक्षितमासीत् {date} दिने",
"account.locked_info": "एतस्या लेखायाः गुह्यता \"निषिद्ध\"इति वर्तते । स्वामी स्वयञ्चिनोति कोऽनुसर्ता भवितुमर्हतीति ।",
"account.media": "सामग्री",
@@ -32,7 +32,6 @@
"account.mute": "निःशब्दम् @{name}",
"account.mute_notifications": "@{name} सूचनाः निष्क्रियन्ताम्",
"account.muted": "निःशब्दम्",
- "account.never_active": "नैव कदापि",
"account.posts": "दौत्यानि",
"account.posts_with_replies": "दौत्यानि प्रत्युत्तराणि च",
"account.report": "आविद्यताम् @{name}",
@@ -42,12 +41,15 @@
"account.statuses_counter": "{count, plural, one {{counter} दौत्यम्} two {{counter} दौत्ये} other {{counter} दौत्यानि}}",
"account.unblock": "निषेधता नश्यताम् @{name}",
"account.unblock_domain": "प्रदेशनिषेधता नश्यताम् {domain}",
+ "account.unblock_short": "Unblock",
"account.unendorse": "व्यक्तिगतविवरणे मा प्रकाश्यताम्",
"account.unfollow": "नश्यतामनुसरणम्",
"account.unmute": "सशब्दम् @{name}",
"account.unmute_notifications": "@{name} सूचनाः सक्रियन्ताम्",
+ "account.unmute_short": "Unmute",
"account_note.placeholder": "टीकायोजनार्थं नुद्यताम्",
- "admin.dashboard.retention": "Retention",
+ "admin.dashboard.daily_retention": "User retention rate by day after sign-up",
+ "admin.dashboard.monthly_retention": "User retention rate by month after sign-up",
"admin.dashboard.retention.average": "Average",
"admin.dashboard.retention.cohort": "Sign-up month",
"admin.dashboard.retention.cohort_size": "New users",
@@ -104,6 +106,7 @@
"compose_form.poll.switch_to_single": "मतदानं परिवर्तयित्वा निर्विकल्पमतदानं क्रियताम्",
"compose_form.publish": "दौत्यम्",
"compose_form.publish_loud": "{publish}!",
+ "compose_form.save_changes": "Save changes",
"compose_form.sensitive.hide": "संवेदनशीलसामग्रीत्यङ्यताम्",
"compose_form.sensitive.marked": "संवेदनशीलसामग्रीत्यङ्कितम्",
"compose_form.sensitive.unmarked": "संवेदनशीलसामग्रीति नाङ्कितम्",
@@ -165,6 +168,7 @@
"empty_column.community": "स्थानीयसमयतालिका रिक्ता । सार्वजनिकत्वेनाऽत्र किमपि लिख्यताम् ।",
"empty_column.direct": "नैकोऽपि प्रत्यक्षसन्देशो वर्तते । यदा प्रेष्यते वा प्राप्यतेऽत्र दृश्यते",
"empty_column.domain_blocks": "न निषिद्धप्रदेशाः सन्ति ।",
+ "empty_column.explore_statuses": "Nothing is trending right now. Check back later!",
"empty_column.favourited_statuses": "न प्रियदौत्यानि सन्ति । यदा प्रीतिरित्यङ्क्यतेऽत्र दृश्यते ।",
"empty_column.favourites": "नैतद्दौत्यं प्रियमस्ति कस्मै अपि । यदा कस्मै प्रियं भवति तदाऽत्र दृश्यते ।",
"empty_column.follow_recommendations": "Looks like no suggestions could be generated for you. You can try using search to look for people you might know or explore trending hashtags.",
@@ -183,6 +187,12 @@
"error.unexpected_crash.next_steps_addons": "Try disabling them and refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
"errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard",
"errors.unexpected_crash.report_issue": "Report issue",
+ "explore.search_results": "Search results",
+ "explore.suggested_follows": "For you",
+ "explore.title": "Explore",
+ "explore.trending_links": "News",
+ "explore.trending_statuses": "Posts",
+ "explore.trending_tags": "Hashtags",
"follow_recommendations.done": "Done",
"follow_recommendations.heading": "Follow people you'd like to see posts from! Here are some suggestions.",
"follow_recommendations.lead": "Posts from people you follow will show up in chronological order on your home feed. Don't be afraid to make mistakes, you can unfollow people just as easily any time!",
@@ -284,6 +294,7 @@
"navigation_bar.discover": "Discover",
"navigation_bar.domain_blocks": "Hidden domains",
"navigation_bar.edit_profile": "Edit profile",
+ "navigation_bar.explore": "Explore",
"navigation_bar.favourites": "Favourites",
"navigation_bar.filters": "Muted words",
"navigation_bar.follow_requests": "Follow requests",
@@ -298,6 +309,7 @@
"navigation_bar.preferences": "Preferences",
"navigation_bar.public_timeline": "Federated timeline",
"navigation_bar.security": "Security",
+ "notification.admin.sign_up": "{name} signed up",
"notification.favourite": "{name} favourited your status",
"notification.follow": "{name} followed you",
"notification.follow_request": "{name} has requested to follow you",
@@ -306,13 +318,15 @@
"notification.poll": "A poll you have voted in has ended",
"notification.reblog": "{name} boosted your status",
"notification.status": "{name} just posted",
+ "notification.update": "{name} edited a post",
"notifications.clear": "Clear notifications",
"notifications.clear_confirmation": "Are you sure you want to permanently clear all your notifications?",
+ "notifications.column_settings.admin.sign_up": "New sign-ups:",
"notifications.column_settings.alert": "Desktop notifications",
"notifications.column_settings.favourite": "Favourites:",
"notifications.column_settings.filter_bar.advanced": "Display all categories",
"notifications.column_settings.filter_bar.category": "Quick filter bar",
- "notifications.column_settings.filter_bar.show": "Show",
+ "notifications.column_settings.filter_bar.show_bar": "Show filter bar",
"notifications.column_settings.follow": "New followers:",
"notifications.column_settings.follow_request": "New follow requests:",
"notifications.column_settings.mention": "Mentions:",
@@ -322,7 +336,9 @@
"notifications.column_settings.show": "Show in column",
"notifications.column_settings.sound": "Play sound",
"notifications.column_settings.status": "New toots:",
- "notifications.column_settings.unread_markers.category": "Unread notification markers",
+ "notifications.column_settings.unread_notifications.category": "Unread notifications",
+ "notifications.column_settings.unread_notifications.highlight": "Highlight unread notifications",
+ "notifications.column_settings.update": "Edits:",
"notifications.filter.all": "All",
"notifications.filter.boosts": "Boosts",
"notifications.filter.favourites": "Favourites",
@@ -362,18 +378,54 @@
"regeneration_indicator.label": "Loading…",
"regeneration_indicator.sublabel": "Your home feed is being prepared!",
"relative_time.days": "{number}d",
+ "relative_time.full.days": "{number, plural, one {# day} other {# days}} ago",
+ "relative_time.full.hours": "{number, plural, one {# hour} other {# hours}} ago",
+ "relative_time.full.just_now": "just now",
+ "relative_time.full.minutes": "{number, plural, one {# minute} other {# minutes}} ago",
+ "relative_time.full.seconds": "{number, plural, one {# second} other {# seconds}} ago",
"relative_time.hours": "{number}h",
"relative_time.just_now": "now",
"relative_time.minutes": "{number}m",
"relative_time.seconds": "{number}s",
"relative_time.today": "today",
"reply_indicator.cancel": "Cancel",
+ "report.block": "Block",
+ "report.block_explanation": "You will not see their posts. They will not be able to see your posts or follow you. They will be able to tell that they are blocked.",
+ "report.categories.other": "Other",
+ "report.categories.spam": "Spam",
+ "report.categories.violation": "Content violates one or more server rules",
+ "report.category.subtitle": "Choose the best match",
+ "report.category.title": "Tell us what's going on with this {type}",
+ "report.category.title_account": "profile",
+ "report.category.title_status": "post",
+ "report.close": "Done",
+ "report.comment.title": "Is there anything else you think we should know?",
"report.forward": "Forward to {target}",
"report.forward_hint": "The account is from another server. Send an anonymized copy of the report there as well?",
- "report.hint": "The report will be sent to your server moderators. You can provide an explanation of why you are reporting this account below:",
- "report.placeholder": "Additional comments",
- "report.submit": "Submit",
+ "report.mute": "Mute",
+ "report.mute_explanation": "You will not see their posts. They can still follow you and see your posts and will not know that they are muted.",
+ "report.next": "Next",
+ "report.placeholder": "Type or paste additional comments",
+ "report.reasons.dislike": "I don't like it",
+ "report.reasons.dislike_description": "It is not something you want to see",
+ "report.reasons.other": "It's something else",
+ "report.reasons.other_description": "The issue does not fit into other categories",
+ "report.reasons.spam": "It's spam",
+ "report.reasons.spam_description": "Malicious links, fake engagement, or repetitive replies",
+ "report.reasons.violation": "It violates server rules",
+ "report.reasons.violation_description": "You are aware that it breaks specific rules",
+ "report.rules.subtitle": "Select all that apply",
+ "report.rules.title": "Which rules are being violated?",
+ "report.statuses.subtitle": "Select all that apply",
+ "report.statuses.title": "Are there any posts that back up this report?",
+ "report.submit": "Submit report",
"report.target": "Report {target}",
+ "report.thanks.take_action": "Here are your options for controlling what you see on Mastodon:",
+ "report.thanks.take_action_actionable": "While we review this, you can take action against @{name}:",
+ "report.thanks.title": "Don't want to see this?",
+ "report.thanks.title_actionable": "Thanks for reporting, we'll look into this.",
+ "report.unfollow": "Unfollow @{name}",
+ "report.unfollow_explanation": "You are following this account. To not see their posts in your home feed anymore, unfollow them.",
"search.placeholder": "Search",
"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.",
@@ -382,7 +434,9 @@
"search_popout.tips.text": "Simple text returns matching display names, usernames and hashtags",
"search_popout.tips.user": "user",
"search_results.accounts": "People",
+ "search_results.all": "All",
"search_results.hashtags": "Hashtags",
+ "search_results.nothing_found": "Could not find anything for these search terms",
"search_results.statuses": "Toots",
"search_results.statuses_fts_disabled": "Searching toots by their content is not enabled on this Mastodon server.",
"search_results.total": "{count, number} {count, plural, one {result} other {results}}",
@@ -396,9 +450,14 @@
"status.delete": "Delete",
"status.detailed_status": "Detailed conversation view",
"status.direct": "Direct message @{name}",
+ "status.edit": "Edit",
+ "status.edited": "Edited {date}",
+ "status.edited_x_times": "Edited {count, plural, one {{count} time} other {{count} times}}",
"status.embed": "Embed",
"status.favourite": "Favourite",
"status.filtered": "Filtered",
+ "status.history.created": "{name} created {date}",
+ "status.history.edited": "{name} edited {date}",
"status.load_more": "Load more",
"status.media_hidden": "Media hidden",
"status.mention": "Mention @{name}",
diff --git a/app/javascript/mastodon/locales/sc.json b/app/javascript/mastodon/locales/sc.json
index 339bbac09..1c29dfb79 100644
--- a/app/javascript/mastodon/locales/sc.json
+++ b/app/javascript/mastodon/locales/sc.json
@@ -18,12 +18,12 @@
"account.followers": "Sighiduras",
"account.followers.empty": "Nemos sighit ancora custa persone.",
"account.followers_counter": "{count, plural, one {{counter} sighidura} other {{counter} sighiduras}}",
+ "account.following": "Following",
"account.following_counter": "{count, plural, one {Sighende a {counter}} other {Sighende a {counter}}}",
"account.follows.empty": "Custa persone non sighit ancora a nemos.",
"account.follows_you": "Ti sighit",
"account.hide_reblogs": "Cua is cumpartziduras de @{name}",
"account.joined": "At aderidu su {date}",
- "account.last_status": "Ùrtima atividade",
"account.link_verified_on": "Sa propiedade de custu ligòngiu est istada controllada su {date}",
"account.locked_info": "S'istadu de riservadesa de custu contu est istadu cunfiguradu comente blocadu. Sa persone chi tenet sa propiedade revisionat a manu chie dda podet sighire.",
"account.media": "Cuntenutu multimediale",
@@ -32,7 +32,6 @@
"account.mute": "Pone a @{name} a sa muda",
"account.mute_notifications": "Disativa is notìficas de @{name}",
"account.muted": "A sa muda",
- "account.never_active": "Mai",
"account.posts": "Publicatziones",
"account.posts_with_replies": "Publicatziones e rispostas",
"account.report": "Signala @{name}",
@@ -42,12 +41,15 @@
"account.statuses_counter": "{count, plural, one {{counter} publicatzione} other {{counter} publicatziones}}",
"account.unblock": "Isbloca a @{name}",
"account.unblock_domain": "Isbloca su domìniu {domain}",
+ "account.unblock_short": "Unblock",
"account.unendorse": "Non cussiges in su profilu",
"account.unfollow": "Non sigas prus",
"account.unmute": "Torra a ativare a @{name}",
"account.unmute_notifications": "Ativa notìficas pro @{name}",
+ "account.unmute_short": "Unmute",
"account_note.placeholder": "Incarca pro agiùnghere una nota",
- "admin.dashboard.retention": "Retention",
+ "admin.dashboard.daily_retention": "User retention rate by day after sign-up",
+ "admin.dashboard.monthly_retention": "User retention rate by month after sign-up",
"admin.dashboard.retention.average": "Average",
"admin.dashboard.retention.cohort": "Sign-up month",
"admin.dashboard.retention.cohort_size": "New users",
@@ -104,6 +106,7 @@
"compose_form.poll.switch_to_single": "Muda su sondàgiu pro permìtere un'optzione isceti",
"compose_form.publish": "Tut",
"compose_form.publish_loud": "{publish}!",
+ "compose_form.save_changes": "Save changes",
"compose_form.sensitive.hide": "{count, plural, one {Marca elementu multimediale comente a sensìbile} other {Marca elementos multimediales comente sensìbiles}}",
"compose_form.sensitive.marked": "{count, plural, one {Elementu multimediale marcadu comente a sensìbile} other {Elementos multimediales marcados comente a sensìbiles}}",
"compose_form.sensitive.unmarked": "{count, plural, one {Elementu multimediale non marcadu comente a sensìbile} other {Elementos multimediales non marcados comente a sensìbiles}}",
@@ -165,6 +168,7 @@
"empty_column.community": "Sa lìnia de tempus locale est bòida. Iscrie inoghe pro cumintzare sa festa!",
"empty_column.direct": "Non tenes ancora perunu messàgiu deretu. Cando nd'as a imbiare o nd'as a retzire unu, at a èssere ammustradu inoghe.",
"empty_column.domain_blocks": "Non tenes ancora perunu domìniu blocadu.",
+ "empty_column.explore_statuses": "Nothing is trending right now. Check back later!",
"empty_column.favourited_statuses": "Non tenes ancora peruna publicatzione in is preferidos. Cando nd'as a agiùnghere una, at a èssere ammustrada inoghe.",
"empty_column.favourites": "Nemos at marcadu ancora custa publicatzione comente preferida. Cando calicunu dd'at a fàghere, at a èssere ammustrada inoghe.",
"empty_column.follow_recommendations": "Looks like no suggestions could be generated for you. You can try using search to look for people you might know or explore trending hashtags.",
@@ -183,6 +187,12 @@
"error.unexpected_crash.next_steps_addons": "Proa a ddos disabilitare e torra a carrigare sa pàgina. Si custu no acontzat su problema, podes chircare de impreare Mastodon in unu navigadore diferente o in un'aplicatzione nativa.",
"errors.unexpected_crash.copy_stacktrace": "Còpia stacktrace in punta de billete",
"errors.unexpected_crash.report_issue": "Sinnala unu problema",
+ "explore.search_results": "Search results",
+ "explore.suggested_follows": "For you",
+ "explore.title": "Explore",
+ "explore.trending_links": "News",
+ "explore.trending_statuses": "Posts",
+ "explore.trending_tags": "Hashtags",
"follow_recommendations.done": "Fatu",
"follow_recommendations.heading": "Sighi gente de chie boles bìdere is publicatziones! Càstia custos cussìgios.",
"follow_recommendations.lead": "Is messàgios de gente a sa chi ses sighende ant a èssere ammustrados in òrdine cronològicu in sa lìnia de tempus printzipale tua. Non timas de fàghere errores, acabbare de sighire gente est fàtzile in cale si siat momentu!",
@@ -284,6 +294,7 @@
"navigation_bar.discover": "Iscoberi",
"navigation_bar.domain_blocks": "Domìnios blocados",
"navigation_bar.edit_profile": "Modìfica profilu",
+ "navigation_bar.explore": "Explore",
"navigation_bar.favourites": "Preferidos",
"navigation_bar.filters": "Faeddos a sa muda",
"navigation_bar.follow_requests": "Rechestas de sighidura",
@@ -298,6 +309,7 @@
"navigation_bar.preferences": "Preferèntzias",
"navigation_bar.public_timeline": "Lìnia de tempus federada",
"navigation_bar.security": "Seguresa",
+ "notification.admin.sign_up": "{name} signed up",
"notification.favourite": "{name} at marcadu sa publicatzione tua comente a preferida",
"notification.follow": "{name} ti sighit",
"notification.follow_request": "{name} at dimandadu de ti sighire",
@@ -306,13 +318,15 @@
"notification.poll": "Unu sondàgiu in su chi as votadu est acabbadu",
"notification.reblog": "{name} at cumpartzidu sa publicatzione tua",
"notification.status": "{name} at publicadu cosa",
+ "notification.update": "{name} edited a post",
"notifications.clear": "Lìmpia notìficas",
"notifications.clear_confirmation": "Seguru chi boles isboidare in manera permanente totu is notìficas tuas?",
+ "notifications.column_settings.admin.sign_up": "New sign-ups:",
"notifications.column_settings.alert": "Notìficas de iscrivania",
"notifications.column_settings.favourite": "Preferidos:",
"notifications.column_settings.filter_bar.advanced": "Ammustra totu is categorias",
"notifications.column_settings.filter_bar.category": "Barra lestra de filtros",
- "notifications.column_settings.filter_bar.show": "Ammustra",
+ "notifications.column_settings.filter_bar.show_bar": "Show filter bar",
"notifications.column_settings.follow": "Sighiduras noas:",
"notifications.column_settings.follow_request": "Rechestas noas de sighidura:",
"notifications.column_settings.mention": "Mèntovos:",
@@ -322,7 +336,9 @@
"notifications.column_settings.show": "Ammustra in sa colunna",
"notifications.column_settings.sound": "Reprodue unu sonu",
"notifications.column_settings.status": "Publicatziones noas:",
- "notifications.column_settings.unread_markers.category": "Marcadores de notìficas de lèghere",
+ "notifications.column_settings.unread_notifications.category": "Unread notifications",
+ "notifications.column_settings.unread_notifications.highlight": "Highlight unread notifications",
+ "notifications.column_settings.update": "Edits:",
"notifications.filter.all": "Totus",
"notifications.filter.boosts": "Cumpartziduras",
"notifications.filter.favourites": "Preferidos",
@@ -362,18 +378,54 @@
"regeneration_indicator.label": "Carrighende…",
"regeneration_indicator.sublabel": "Preparende sa lìnia de tempus printzipale tua.",
"relative_time.days": "{number} dies a oe",
+ "relative_time.full.days": "{number, plural, one {# day} other {# days}} ago",
+ "relative_time.full.hours": "{number, plural, one {# hour} other {# hours}} ago",
+ "relative_time.full.just_now": "just now",
+ "relative_time.full.minutes": "{number, plural, one {# minute} other {# minutes}} ago",
+ "relative_time.full.seconds": "{number, plural, one {# second} other {# seconds}} ago",
"relative_time.hours": "{number} oras a immoe",
"relative_time.just_now": "immoe",
"relative_time.minutes": "{number} minutos a immoe",
"relative_time.seconds": "{number} segundos a immoe",
"relative_time.today": "oe",
"reply_indicator.cancel": "Annulla",
+ "report.block": "Block",
+ "report.block_explanation": "You will not see their posts. They will not be able to see your posts or follow you. They will be able to tell that they are blocked.",
+ "report.categories.other": "Other",
+ "report.categories.spam": "Spam",
+ "report.categories.violation": "Content violates one or more server rules",
+ "report.category.subtitle": "Choose the best match",
+ "report.category.title": "Tell us what's going on with this {type}",
+ "report.category.title_account": "profile",
+ "report.category.title_status": "post",
+ "report.close": "Done",
+ "report.comment.title": "Is there anything else you think we should know?",
"report.forward": "Torra a imbiare a {target}",
"report.forward_hint": "Custu contu est de un'àteru serbidore. Ddi boles imbiare puru una còpia anònima de custu informe?",
- "report.hint": "S'informe at a èssere imbiadu a sa moderatzione de su serbidore. Podes frunire un'ispiegatzione de sa signalatzione tua de custu contu:",
+ "report.mute": "Mute",
+ "report.mute_explanation": "You will not see their posts. They can still follow you and see your posts and will not know that they are muted.",
+ "report.next": "Next",
"report.placeholder": "Cummentos additzionales",
+ "report.reasons.dislike": "I don't like it",
+ "report.reasons.dislike_description": "It is not something you want to see",
+ "report.reasons.other": "It's something else",
+ "report.reasons.other_description": "The issue does not fit into other categories",
+ "report.reasons.spam": "It's spam",
+ "report.reasons.spam_description": "Malicious links, fake engagement, or repetitive replies",
+ "report.reasons.violation": "It violates server rules",
+ "report.reasons.violation_description": "You are aware that it breaks specific rules",
+ "report.rules.subtitle": "Select all that apply",
+ "report.rules.title": "Which rules are being violated?",
+ "report.statuses.subtitle": "Select all that apply",
+ "report.statuses.title": "Are there any posts that back up this report?",
"report.submit": "Imbia",
"report.target": "Informende de {target}",
+ "report.thanks.take_action": "Here are your options for controlling what you see on Mastodon:",
+ "report.thanks.take_action_actionable": "While we review this, you can take action against @{name}:",
+ "report.thanks.title": "Don't want to see this?",
+ "report.thanks.title_actionable": "Thanks for reporting, we'll look into this.",
+ "report.unfollow": "Unfollow @{name}",
+ "report.unfollow_explanation": "You are following this account. To not see their posts in your home feed anymore, unfollow them.",
"search.placeholder": "Chirca",
"search_popout.search_format": "Formadu de chirca avantzada",
"search_popout.tips.full_text": "Testu sèmplitze pro agatare publicatziones chi as iscritu, marcadu comente a preferidas, cumpartzidu o chi t'ant mentovadu, e fintzas nòmines, nòmines de utente e etichetas.",
@@ -382,7 +434,9 @@
"search_popout.tips.text": "Testu sèmplitze pro agatare nòmines visualizados, nòmines de utente e etichetas",
"search_popout.tips.user": "utente",
"search_results.accounts": "Gente",
+ "search_results.all": "All",
"search_results.hashtags": "Etichetas",
+ "search_results.nothing_found": "Could not find anything for these search terms",
"search_results.statuses": "Publicatziones",
"search_results.statuses_fts_disabled": "Sa chirca de publicatziones pro su cuntenutu issoro no est abilitada in custu serbidore de Mastodon.",
"search_results.total": "{count, number} {count, plural, one {resurtadu} other {resurtados}}",
@@ -396,9 +450,14 @@
"status.delete": "Cantzella",
"status.detailed_status": "Visualizatzione de detàlliu de arresonada",
"status.direct": "Messàgiu deretu a @{name}",
+ "status.edit": "Edit",
+ "status.edited": "Edited {date}",
+ "status.edited_x_times": "Edited {count, plural, one {{count} time} other {{count} times}}",
"status.embed": "Afissa",
"status.favourite": "Preferidos",
"status.filtered": "Filtradu",
+ "status.history.created": "{name} created {date}",
+ "status.history.edited": "{name} edited {date}",
"status.load_more": "Càrriga·nde àteros",
"status.media_hidden": "Elementos multimediales cuados",
"status.mention": "Mèntova a @{name}",
diff --git a/app/javascript/mastodon/locales/si.json b/app/javascript/mastodon/locales/si.json
index 0baa6c7ae..a74105406 100644
--- a/app/javascript/mastodon/locales/si.json
+++ b/app/javascript/mastodon/locales/si.json
@@ -18,12 +18,12 @@
"account.followers": "Followers",
"account.followers.empty": "No one follows this user yet.",
"account.followers_counter": "{count, plural, one {{counter} Follower} other {{counter} Followers}}",
+ "account.following": "Following",
"account.following_counter": "{count, plural, one {{counter} Following} other {{counter} Following}}",
"account.follows.empty": "This user doesn't follow anyone yet.",
"account.follows_you": "Follows you",
"account.hide_reblogs": "Hide boosts from @{name}",
"account.joined": "{date} එක් වී ඇත",
- "account.last_status": "අවසන් වරට සක්රීය",
"account.link_verified_on": "මෙම සබැඳියේ හිමිකාරිත්වය {date} දින පරීක්ෂා කරන ලදි",
"account.locked_info": "This account privacy status is set to locked. The owner manually reviews who can follow them.",
"account.media": "මාධ්යය",
@@ -32,7 +32,6 @@
"account.mute": "@{name} නිහඬ කරන්න",
"account.mute_notifications": "Mute notifications from @{name}",
"account.muted": "Muted",
- "account.never_active": "Never",
"account.posts": "Toots",
"account.posts_with_replies": "Toots and replies",
"account.report": "@{name} වාර්තා කරන්න",
@@ -42,15 +41,18 @@
"account.statuses_counter": "{count, plural, one {{counter} Toot} other {{counter} Toots}}",
"account.unblock": "@{name} අනවහිර කරන්න",
"account.unblock_domain": "{domain} වසම අනවහිර කරන්න",
+ "account.unblock_short": "Unblock",
"account.unendorse": "පැතිකඩෙහි විශේෂාංග නොකරන්න",
"account.unfollow": "Unfollow",
"account.unmute": "Unmute @{name}",
"account.unmute_notifications": "Unmute notifications from @{name}",
+ "account.unmute_short": "Unmute",
"account_note.placeholder": "සටහන එකතු කිරීමට ක්ලික් කරන්න",
- "admin.dashboard.retention": "Retention",
+ "admin.dashboard.daily_retention": "User retention rate by day after sign-up",
+ "admin.dashboard.monthly_retention": "User retention rate by month after sign-up",
"admin.dashboard.retention.average": "Average",
"admin.dashboard.retention.cohort": "Sign-up month",
- "admin.dashboard.retention.cohort_size": "New users",
+ "admin.dashboard.retention.cohort_size": "නව පරිශීලකයින්",
"alert.rate_limited.message": "කරුණාකර {retry_time, time, medium} ට පසු නැවත උත්සාහ කරන්න.",
"alert.rate_limited.title": "Rate limited",
"alert.unexpected.message": "An unexpected error occurred.",
@@ -104,6 +106,7 @@
"compose_form.poll.switch_to_single": "තනි තේරීමකට ඉඩ දීම සඳහා මත විමසුම වෙනස් කරන්න",
"compose_form.publish": "පිඹින්න",
"compose_form.publish_loud": "{publish}!",
+ "compose_form.save_changes": "Save changes",
"compose_form.sensitive.hide": "{count, plural, one {මාධ්ය සංවේදී ලෙස සලකුණු කරන්න} other {මාධ්ය සංවේදී ලෙස සලකුණු කරන්න}}",
"compose_form.sensitive.marked": "{count, plural, one {මාධ්ය සංවේදී ලෙස සලකුණු කර ඇත} other {මාධ්ය සංවේදී ලෙස සලකුණු කර ඇත}}",
"compose_form.sensitive.unmarked": "{count, plural, one {මාධ්ය සංවේදී ලෙස සලකුණු කර නැත} other {මාධ්ය සංවේදී ලෙස සලකුණු කර නැත}}",
@@ -118,7 +121,7 @@
"confirmations.delete.message": "Are you sure you want to delete this status?",
"confirmations.delete_list.confirm": "Delete",
"confirmations.delete_list.message": "Are you sure you want to permanently delete this list?",
- "confirmations.discard_edit_media.confirm": "Discard",
+ "confirmations.discard_edit_media.confirm": "ඉවත ලන්න",
"confirmations.discard_edit_media.message": "You have unsaved changes to the media description or preview, discard them anyway?",
"confirmations.domain_block.confirm": "සම්පූර්ණ වසම අවහිර කරන්න",
"confirmations.domain_block.message": "Are you really, really sure you want to block the entire {domain}? In most cases a few targeted blocks or mutes are sufficient and preferable. You will not see content from that domain in any public timelines or your notifications. Your followers from that domain will be removed.",
@@ -165,6 +168,7 @@
"empty_column.community": "The local timeline is empty. Write something publicly to get the ball rolling!",
"empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.",
"empty_column.domain_blocks": "අවහිර කළ වසම් නොමැත.",
+ "empty_column.explore_statuses": "Nothing is trending right now. Check back later!",
"empty_column.favourited_statuses": "You don't have any favourite toots yet. When you favourite one, it will show up here.",
"empty_column.favourites": "No one has favourited this toot yet. When someone does, they will show up here.",
"empty_column.follow_recommendations": "Looks like no suggestions could be generated for you. You can try using search to look for people you might know or explore trending hashtags.",
@@ -183,6 +187,12 @@
"error.unexpected_crash.next_steps_addons": "Try disabling them and refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
"errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard",
"errors.unexpected_crash.report_issue": "Report issue",
+ "explore.search_results": "Search results",
+ "explore.suggested_follows": "For you",
+ "explore.title": "Explore",
+ "explore.trending_links": "News",
+ "explore.trending_statuses": "Posts",
+ "explore.trending_tags": "Hashtags",
"follow_recommendations.done": "Done",
"follow_recommendations.heading": "Follow people you'd like to see posts from! Here are some suggestions.",
"follow_recommendations.lead": "Posts from people you follow will show up in chronological order on your home feed. Don't be afraid to make mistakes, you can unfollow people just as easily any time!",
@@ -284,6 +294,7 @@
"navigation_bar.discover": "Discover",
"navigation_bar.domain_blocks": "Hidden domains",
"navigation_bar.edit_profile": "පැතිකඩ සංස්කරණය",
+ "navigation_bar.explore": "Explore",
"navigation_bar.favourites": "ප්රියතමයන්",
"navigation_bar.filters": "නිහඬ කළ වචන",
"navigation_bar.follow_requests": "Follow requests",
@@ -298,6 +309,7 @@
"navigation_bar.preferences": "Preferences",
"navigation_bar.public_timeline": "Federated timeline",
"navigation_bar.security": "ආරක්ෂාව",
+ "notification.admin.sign_up": "{name} signed up",
"notification.favourite": "{name} favourited your status",
"notification.follow": "{name} followed you",
"notification.follow_request": "{name} has requested to follow you",
@@ -306,13 +318,15 @@
"notification.poll": "A poll you have voted in has ended",
"notification.reblog": "{name} boosted your status",
"notification.status": "{name} just posted",
+ "notification.update": "{name} edited a post",
"notifications.clear": "දැනුම්දීම් හිස්කරන්න",
"notifications.clear_confirmation": "Are you sure you want to permanently clear all your notifications?",
+ "notifications.column_settings.admin.sign_up": "New sign-ups:",
"notifications.column_settings.alert": "Desktop notifications",
"notifications.column_settings.favourite": "ප්රියතමයන්:",
"notifications.column_settings.filter_bar.advanced": "Display all categories",
"notifications.column_settings.filter_bar.category": "Quick filter bar",
- "notifications.column_settings.filter_bar.show": "පෙන්වන්න",
+ "notifications.column_settings.filter_bar.show_bar": "Show filter bar",
"notifications.column_settings.follow": "New followers:",
"notifications.column_settings.follow_request": "New follow requests:",
"notifications.column_settings.mention": "සැඳහුම්:",
@@ -322,7 +336,9 @@
"notifications.column_settings.show": "තීරුවෙහි පෙන්වන්න",
"notifications.column_settings.sound": "ශබ්දය ධාවනය",
"notifications.column_settings.status": "New toots:",
- "notifications.column_settings.unread_markers.category": "Unread notification markers",
+ "notifications.column_settings.unread_notifications.category": "Unread notifications",
+ "notifications.column_settings.unread_notifications.highlight": "Highlight unread notifications",
+ "notifications.column_settings.update": "Edits:",
"notifications.filter.all": "සියල්ල",
"notifications.filter.boosts": "Boosts",
"notifications.filter.favourites": "ප්රියතමයන්",
@@ -362,18 +378,54 @@
"regeneration_indicator.label": "පූරණය වෙමින්…",
"regeneration_indicator.sublabel": "Your home feed is being prepared!",
"relative_time.days": "{number}d",
+ "relative_time.full.days": "{number, plural, one {# day} other {# days}} ago",
+ "relative_time.full.hours": "{number, plural, one {# hour} other {# hours}} ago",
+ "relative_time.full.just_now": "just now",
+ "relative_time.full.minutes": "{number, plural, one {# minute} other {# minutes}} ago",
+ "relative_time.full.seconds": "{number, plural, one {# second} other {# seconds}} ago",
"relative_time.hours": "{number}h",
"relative_time.just_now": "දැන්",
"relative_time.minutes": "{number}m",
"relative_time.seconds": "{number}s",
"relative_time.today": "අද",
"reply_indicator.cancel": "අවලංගු කරන්න",
+ "report.block": "Block",
+ "report.block_explanation": "You will not see their posts. They will not be able to see your posts or follow you. They will be able to tell that they are blocked.",
+ "report.categories.other": "Other",
+ "report.categories.spam": "Spam",
+ "report.categories.violation": "Content violates one or more server rules",
+ "report.category.subtitle": "Choose the best match",
+ "report.category.title": "Tell us what's going on with this {type}",
+ "report.category.title_account": "profile",
+ "report.category.title_status": "post",
+ "report.close": "Done",
+ "report.comment.title": "Is there anything else you think we should know?",
"report.forward": "Forward to {target}",
"report.forward_hint": "The account is from another server. Send an anonymized copy of the report there as well?",
- "report.hint": "The report will be sent to your server moderators. You can provide an explanation of why you are reporting this account below:",
+ "report.mute": "Mute",
+ "report.mute_explanation": "You will not see their posts. They can still follow you and see your posts and will not know that they are muted.",
+ "report.next": "Next",
"report.placeholder": "අමතර අදහස්",
+ "report.reasons.dislike": "I don't like it",
+ "report.reasons.dislike_description": "It is not something you want to see",
+ "report.reasons.other": "It's something else",
+ "report.reasons.other_description": "The issue does not fit into other categories",
+ "report.reasons.spam": "It's spam",
+ "report.reasons.spam_description": "Malicious links, fake engagement, or repetitive replies",
+ "report.reasons.violation": "It violates server rules",
+ "report.reasons.violation_description": "You are aware that it breaks specific rules",
+ "report.rules.subtitle": "Select all that apply",
+ "report.rules.title": "Which rules are being violated?",
+ "report.statuses.subtitle": "Select all that apply",
+ "report.statuses.title": "Are there any posts that back up this report?",
"report.submit": "යොමන්න",
"report.target": "Report {target}",
+ "report.thanks.take_action": "Here are your options for controlling what you see on Mastodon:",
+ "report.thanks.take_action_actionable": "While we review this, you can take action against @{name}:",
+ "report.thanks.title": "Don't want to see this?",
+ "report.thanks.title_actionable": "Thanks for reporting, we'll look into this.",
+ "report.unfollow": "Unfollow @{name}",
+ "report.unfollow_explanation": "You are following this account. To not see their posts in your home feed anymore, unfollow them.",
"search.placeholder": "සොයන්න",
"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.",
@@ -382,7 +434,9 @@
"search_popout.tips.text": "Simple text returns matching display names, usernames and hashtags",
"search_popout.tips.user": "පරිශීලක",
"search_results.accounts": "මිනිසුන්",
+ "search_results.all": "All",
"search_results.hashtags": "Hashtags",
+ "search_results.nothing_found": "Could not find anything for these search terms",
"search_results.statuses": "Toots",
"search_results.statuses_fts_disabled": "Searching toots by their content is not enabled on this Mastodon server.",
"search_results.total": "{count, number} {count, plural, one {result} other {results}}",
@@ -396,9 +450,14 @@
"status.delete": "Delete",
"status.detailed_status": "Detailed conversation view",
"status.direct": "@{name} සෘජු පණිවිඩය",
+ "status.edit": "Edit",
+ "status.edited": "Edited {date}",
+ "status.edited_x_times": "Edited {count, plural, one {{count} time} other {{count} times}}",
"status.embed": "එබ්බවූ",
"status.favourite": "ප්රියතම",
"status.filtered": "පෙරන ලද",
+ "status.history.created": "{name} created {date}",
+ "status.history.edited": "{name} edited {date}",
"status.load_more": "තව පූරණය කරන්න",
"status.media_hidden": "මාධ්ය සඟවා ඇත",
"status.mention": "@{name} සැඳහුම",
diff --git a/app/javascript/mastodon/locales/sk.json b/app/javascript/mastodon/locales/sk.json
index 5911881bb..860e65413 100644
--- a/app/javascript/mastodon/locales/sk.json
+++ b/app/javascript/mastodon/locales/sk.json
@@ -9,7 +9,7 @@
"account.browse_more_on_origin_server": "Prehľadávaj viac na pôvodnom profile",
"account.cancel_follow_request": "Zruš žiadosť o sledovanie",
"account.direct": "Priama správa pre @{name}",
- "account.disable_notifications": "Prestaň oboznamovať keď má príspevky @{name}",
+ "account.disable_notifications": "Prestaň oznamovať, keď má príspevky @{name}",
"account.domain_blocked": "Doména ukrytá",
"account.edit_profile": "Uprav profil",
"account.enable_notifications": "Oboznamuj ma, keď má @{name} príspevky",
@@ -18,12 +18,12 @@
"account.followers": "Sledujúci",
"account.followers.empty": "Tohto používateľa ešte nikto nenásleduje.",
"account.followers_counter": "{count, plural, one {{counter} Sledujúci} few {{counter} Sledujúci} many {{counter} Sledujúci} other {{counter} Sledujúci}}",
+ "account.following": "Nasledujem",
"account.following_counter": "{count, plural, one {{counter} Following} other {{counter} Following}}",
"account.follows.empty": "Tento používateľ ešte nikoho nenasleduje.",
"account.follows_you": "Nasleduje ťa",
"account.hide_reblogs": "Skry vyzdvihnutia od @{name}",
"account.joined": "Pridal/a sa v {date}",
- "account.last_status": "Naposledy aktívny",
"account.link_verified_on": "Vlastníctvo tohto odkazu bolo skontrolované {date}",
"account.locked_info": "Stav súkromia pre tento účet je nastavený na zamknutý. Jeho vlastník sám prehodnocuje, kto ho môže sledovať.",
"account.media": "Médiá",
@@ -31,9 +31,8 @@
"account.moved_to": "{name} sa presunul/a na:",
"account.mute": "Nevšímaj si @{name}",
"account.mute_notifications": "Stĺm oboznámenia od @{name}",
- "account.muted": "Utíšený/á",
- "account.never_active": "Nikdy",
- "account.posts": "Príspevkov",
+ "account.muted": "Nevšímaný/á",
+ "account.posts": "Príspevky",
"account.posts_with_replies": "Príspevky, aj s odpoveďami",
"account.report": "Nahlás @{name}",
"account.requested": "Čaká na schválenie. Klikni pre zrušenie žiadosti",
@@ -42,21 +41,24 @@
"account.statuses_counter": "{count, plural, one {{counter} Toot} other {{counter} Toots}}",
"account.unblock": "Odblokuj @{name}",
"account.unblock_domain": "Prestaň skrývať {domain}",
+ "account.unblock_short": "Odblokuj",
"account.unendorse": "Nezobrazuj na profile",
"account.unfollow": "Prestaň následovať",
"account.unmute": "Prestaň ignorovať @{name}",
- "account.unmute_notifications": "Zruš stĺmenie oboznámení od @{name}",
+ "account.unmute_notifications": "Zruš nevšímanie si oznámení od @{name}",
+ "account.unmute_short": "Zruš nevšímanie",
"account_note.placeholder": "Klikni pre vloženie poznámky",
- "admin.dashboard.retention": "Retention",
- "admin.dashboard.retention.average": "Average",
- "admin.dashboard.retention.cohort": "Sign-up month",
- "admin.dashboard.retention.cohort_size": "New users",
+ "admin.dashboard.daily_retention": "User retention rate by day after sign-up",
+ "admin.dashboard.monthly_retention": "User retention rate by month after sign-up",
+ "admin.dashboard.retention.average": "Priemer",
+ "admin.dashboard.retention.cohort": "Mesiac zaregistrovania sa",
+ "admin.dashboard.retention.cohort_size": "Noví užívatelia",
"alert.rate_limited.message": "Prosím, skús to znova za {retry_time, time, medium}.",
"alert.rate_limited.title": "Tempo obmedzené",
"alert.unexpected.message": "Vyskytla sa nečakaná chyba.",
"alert.unexpected.title": "Ups!",
"announcement.announcement": "Oboznámenie",
- "attachments_list.unprocessed": "(unprocessed)",
+ "attachments_list.unprocessed": "(nespracované)",
"autosuggest_hashtag.per_week": "{count} týždenne",
"boost_modal.combo": "Nabudúce môžeš kliknúť {combo} pre preskočenie",
"bundle_column_error.body": "Pri načítaní tohto prvku nastala nejaká chyba.",
@@ -75,7 +77,7 @@
"column.follow_requests": "Žiadosti o sledovanie",
"column.home": "Domov",
"column.lists": "Zoznamy",
- "column.mutes": "Ignorovaní užívatelia",
+ "column.mutes": "Nevšímaní užívatelia",
"column.notifications": "Oboznámenia",
"column.pins": "Pripnuté príspevky",
"column.public": "Federovaná časová os",
@@ -104,6 +106,7 @@
"compose_form.poll.switch_to_single": "Zmeň anketu na takú s jedinou voľbou",
"compose_form.publish": "Pošli",
"compose_form.publish_loud": "{publish}!",
+ "compose_form.save_changes": "Ulož zmeny",
"compose_form.sensitive.hide": "Označ médiá ako chúlostivé",
"compose_form.sensitive.marked": "Médiálny obsah je označený ako chúlostivý",
"compose_form.sensitive.unmarked": "Médiálny obsah nieje označený ako chúlostivý",
@@ -118,15 +121,15 @@
"confirmations.delete.message": "Si si istý/á, že chceš vymazať túto správu?",
"confirmations.delete_list.confirm": "Vymaž",
"confirmations.delete_list.message": "Si si istý/á, že chceš natrvalo vymazať tento zoznam?",
- "confirmations.discard_edit_media.confirm": "Discard",
+ "confirmations.discard_edit_media.confirm": "Zahoď",
"confirmations.discard_edit_media.message": "You have unsaved changes to the media description or preview, discard them anyway?",
"confirmations.domain_block.confirm": "Skry celú doménu",
"confirmations.domain_block.message": "Si si naozaj istý/á, že chceš blokovať celú doménu {domain}? Vo väčšine prípadov stačí blokovať alebo ignorovať pár konkrétnych užívateľov, čo sa doporučuje. Neuvidíš obsah z tejto domény v žiadnej verejnej časovej osi, ani v oznámeniach. Tvoji následovníci pochádzajúci z tejto domény budú odstránení.",
"confirmations.logout.confirm": "Odhlás sa",
"confirmations.logout.message": "Si si istý/á, že sa chceš odhlásiť?",
- "confirmations.mute.confirm": "Ignoruj",
+ "confirmations.mute.confirm": "Nevšímaj si",
"confirmations.mute.explanation": "Toto nastavenie pred tebou skryje ich príspevky, alebo príspevky od iných v ktorých sú spomenutí, ale umožní im vidieť tvoje príspevky, aj ťa následovať.",
- "confirmations.mute.message": "Naozaj chceš ignorovať {name}?",
+ "confirmations.mute.message": "Naozaj si chceš nevšímať {name}?",
"confirmations.redraft.confirm": "Vyčisti a prepíš",
"confirmations.redraft.message": "Si si istý/á, že chceš premazať a prepísať tento príspevok? Jeho nadobudnuté vyzdvihnutia a obľúbenia, ale i odpovede na pôvodný príspevok budú odlúčené.",
"confirmations.reply.confirm": "Odpovedz",
@@ -158,13 +161,14 @@
"emoji_button.symbols": "Symboly",
"emoji_button.travel": "Cestovanie a miesta",
"empty_column.account_suspended": "Účet bol vylúčený",
- "empty_column.account_timeline": "Niesú tu žiadne príspevky!",
+ "empty_column.account_timeline": "Niesu tu žiadne príspevky!",
"empty_column.account_unavailable": "Profil nedostupný",
"empty_column.blocks": "Ešte si nikoho nezablokoval/a.",
"empty_column.bookmarked_statuses": "Ešte nemáš žiadné záložky. Keď si pridáš príspevok k záložkám, zobrazí sa tu.",
"empty_column.community": "Lokálna časová os je prázdna. Napíšte niečo, aby sa to tu začalo hýbať!",
"empty_column.direct": "Ešte nemáš žiadne priame správy. Keď nejakú pošleš, alebo dostaneš, ukáže sa tu.",
"empty_column.domain_blocks": "Žiadne domény ešte niesú skryté.",
+ "empty_column.explore_statuses": "Nothing is trending right now. Check back later!",
"empty_column.favourited_statuses": "Nemáš obľúbené ešte žiadne príspevky. Keď si nejaký obľúbiš, bude zobrazený práve tu.",
"empty_column.favourites": "Tento toot si ešte nikto neobľúbil. Ten kto si ho obľúbi, bude zobrazený tu.",
"empty_column.follow_recommendations": "Zdá sa že pre Vás nemohli byť vygenerované žiadne návrhy. Môžete skúsiť použiť vyhľadávanie aby ste našli ľudi ktorých poznáte, alebo preskúmať trendujúce heštegy.",
@@ -183,6 +187,12 @@
"error.unexpected_crash.next_steps_addons": "Skús ich vypnúť, a obnoviť túto stránku. Ak to nepomôže, pravdepodobne budeš stále môcť Mastodon používať cez iný prehliadač, alebo natívnu aplikáciu.",
"errors.unexpected_crash.copy_stacktrace": "Skopíruj stacktrace do schránky",
"errors.unexpected_crash.report_issue": "Nahlás problém",
+ "explore.search_results": "Výsledky hľadania",
+ "explore.suggested_follows": "Pre teba",
+ "explore.title": "Explore",
+ "explore.trending_links": "News",
+ "explore.trending_statuses": "Príspevky",
+ "explore.trending_tags": "Haštagy",
"follow_recommendations.done": "Hotovo",
"follow_recommendations.heading": "Následuj ľudí od ktorých by si chcel/a vidieť príspevky! Tu sú nejaké návrhy.",
"follow_recommendations.lead": "Príspevky od ľudi ktorých sledujete sa zobrazia v chronologickom poradí na Vašej nástenke. Nebojte sa spraviť chyby, vždy môžete zrušiť sledovanie konkrétnych ľudí!",
@@ -217,13 +227,13 @@
"intervals.full.minutes": "{number, plural, one {# minúta} few {# minút} many {# minút} other {# minút}}",
"keyboard_shortcuts.back": "dostať sa naspäť",
"keyboard_shortcuts.blocked": "otvor zoznam blokovaných užívateľov",
- "keyboard_shortcuts.boost": "vyzdvihnúť",
+ "keyboard_shortcuts.boost": "Vyzdvihni príspevok",
"keyboard_shortcuts.column": "zameraj sa na príspevok v jednom zo stĺpcov",
"keyboard_shortcuts.compose": "zameraj sa na písaciu plochu",
"keyboard_shortcuts.description": "Popis",
"keyboard_shortcuts.direct": "pre otvorenie panelu priamých správ",
"keyboard_shortcuts.down": "posunúť sa dole v zozname",
- "keyboard_shortcuts.enter": "otvoriť správu",
+ "keyboard_shortcuts.enter": "Otvor príspevok",
"keyboard_shortcuts.favourite": "pridaj do obľúbených",
"keyboard_shortcuts.favourites": "otvor zoznam obľúbených",
"keyboard_shortcuts.federated": "otvor federovanú časovú os",
@@ -284,6 +294,7 @@
"navigation_bar.discover": "Objavuj",
"navigation_bar.domain_blocks": "Skryté domény",
"navigation_bar.edit_profile": "Uprav profil",
+ "navigation_bar.explore": "Explore",
"navigation_bar.favourites": "Obľúbené",
"navigation_bar.filters": "Filtrované slová",
"navigation_bar.follow_requests": "Žiadosti o sledovanie",
@@ -292,12 +303,13 @@
"navigation_bar.keyboard_shortcuts": "Klávesové skratky",
"navigation_bar.lists": "Zoznamy",
"navigation_bar.logout": "Odhlás sa",
- "navigation_bar.mutes": "Ignorovaní užívatelia",
+ "navigation_bar.mutes": "Stíšení užívatelia",
"navigation_bar.personal": "Osobné",
"navigation_bar.pins": "Pripnuté príspevky",
"navigation_bar.preferences": "Nastavenia",
"navigation_bar.public_timeline": "Federovaná časová os",
"navigation_bar.security": "Zabezbečenie",
+ "notification.admin.sign_up": "{name} signed up",
"notification.favourite": "{name} si obľúbil/a tvoj príspevok",
"notification.follow": "{name} ťa začal/a následovať",
"notification.follow_request": "{name} žiada ťa následovať",
@@ -306,13 +318,15 @@
"notification.poll": "Anketa v ktorej si hlasoval/a sa skončila",
"notification.reblog": "{name} zdieľal/a tvoj príspevok",
"notification.status": "{name} práve uverejnil/a",
+ "notification.update": "{name} edited a post",
"notifications.clear": "Vyčisti oboznámenia",
"notifications.clear_confirmation": "Naozaj chceš nenávratne prečistiť všetky tvoje oboznámenia?",
+ "notifications.column_settings.admin.sign_up": "New sign-ups:",
"notifications.column_settings.alert": "Oboznámenia na ploche",
"notifications.column_settings.favourite": "Obľúbené:",
"notifications.column_settings.filter_bar.advanced": "Zobraz všetky kategórie",
"notifications.column_settings.filter_bar.category": "Rýchle triedenie",
- "notifications.column_settings.filter_bar.show": "Ukáž",
+ "notifications.column_settings.filter_bar.show_bar": "Ukáž filtrovací panel",
"notifications.column_settings.follow": "Noví sledujúci:",
"notifications.column_settings.follow_request": "Nové žiadosti o následovanie:",
"notifications.column_settings.mention": "Zmienenia:",
@@ -321,8 +335,10 @@
"notifications.column_settings.reblog": "Vyzdvihnutia:",
"notifications.column_settings.show": "Ukáž v stĺpci",
"notifications.column_settings.sound": "Prehraj zvuk",
- "notifications.column_settings.status": "New toots:",
- "notifications.column_settings.unread_markers.category": "Značenia neprečítaných oboznámení",
+ "notifications.column_settings.status": "Nové príspevky:",
+ "notifications.column_settings.unread_notifications.category": "Neprečítané oboznámenia",
+ "notifications.column_settings.unread_notifications.highlight": "Zdôrazni neprečítané oboznámenia",
+ "notifications.column_settings.update": "Úpravy:",
"notifications.filter.all": "Všetky",
"notifications.filter.boosts": "Vyzdvihnutia",
"notifications.filter.favourites": "Obľúbené",
@@ -362,18 +378,54 @@
"regeneration_indicator.label": "Načítava sa…",
"regeneration_indicator.sublabel": "Vaša nástenka sa pripravuje!",
"relative_time.days": "{number}dní",
+ "relative_time.full.days": "{number, plural, one {# day} other {# days}} ago",
+ "relative_time.full.hours": "{number, plural, one {# hour} other {# hours}} ago",
+ "relative_time.full.just_now": "práve teraz",
+ "relative_time.full.minutes": "{number, plural, one {# minute} other {# minutes}} ago",
+ "relative_time.full.seconds": "{number, plural, one {# second} other {# seconds}} ago",
"relative_time.hours": "{number}hod",
"relative_time.just_now": "teraz",
"relative_time.minutes": "{number}min",
"relative_time.seconds": "{number}sek",
"relative_time.today": "dnes",
"reply_indicator.cancel": "Zrušiť",
+ "report.block": "Blokuj",
+ "report.block_explanation": "You will not see their posts. They will not be able to see your posts or follow you. They will be able to tell that they are blocked.",
+ "report.categories.other": "Other",
+ "report.categories.spam": "Spam",
+ "report.categories.violation": "Content violates one or more server rules",
+ "report.category.subtitle": "Choose the best match",
+ "report.category.title": "Tell us what's going on with this {type}",
+ "report.category.title_account": "profilom",
+ "report.category.title_status": "príspevkom",
+ "report.close": "Hotovo",
+ "report.comment.title": "Is there anything else you think we should know?",
"report.forward": "Posuň ku {target}",
"report.forward_hint": "Tento účet je z iného serveru. Chceš poslať anonymnú kópiu hlásenia aj tam?",
- "report.hint": "Toto nahlásenie bude zaslané správcom tvojho servera. Môžeš napísať odvôvodnenie, prečo nahlasuješ tento účet:",
+ "report.mute": "Nevšímaj si",
+ "report.mute_explanation": "You will not see their posts. They can still follow you and see your posts and will not know that they are muted.",
+ "report.next": "Ďalej",
"report.placeholder": "Ďalšie komentáre",
+ "report.reasons.dislike": "Nepáči sa mi",
+ "report.reasons.dislike_description": "Nieje to niečo, čo chceš vidieť",
+ "report.reasons.other": "Je to niečo iné",
+ "report.reasons.other_description": "The issue does not fit into other categories",
+ "report.reasons.spam": "Je to spam",
+ "report.reasons.spam_description": "Malicious links, fake engagement, or repetitive replies",
+ "report.reasons.violation": "Porušuje pravidlá servera",
+ "report.reasons.violation_description": "You are aware that it breaks specific rules",
+ "report.rules.subtitle": "Select all that apply",
+ "report.rules.title": "Which rules are being violated?",
+ "report.statuses.subtitle": "Select all that apply",
+ "report.statuses.title": "Are there any posts that back up this report?",
"report.submit": "Odošli",
"report.target": "Nahlás {target}",
+ "report.thanks.take_action": "Here are your options for controlling what you see on Mastodon:",
+ "report.thanks.take_action_actionable": "While we review this, you can take action against @{name}:",
+ "report.thanks.title": "Nechceš to vidieť?",
+ "report.thanks.title_actionable": "Thanks for reporting, we'll look into this.",
+ "report.unfollow": "Nesleduj @{name}",
+ "report.unfollow_explanation": "You are following this account. To not see their posts in your home feed anymore, unfollow them.",
"search.placeholder": "Hľadaj",
"search_popout.search_format": "Pokročilé vyhľadávanie",
"search_popout.tips.full_text": "Vráti jednoduchý textový výpis príspevkov ktoré si napísal/a, ktoré si obľúbil/a, povýšil/a, alebo aj tých, v ktorých si bol/a spomenutý/á, a potom všetky zadaniu odpovedajúce prezývky, mená a haštagy.",
@@ -382,7 +434,9 @@
"search_popout.tips.text": "Vráti jednoduchý textový výpis zhodujúcich sa mien, prezývok a haštagov",
"search_popout.tips.user": "užívateľ",
"search_results.accounts": "Ľudia",
+ "search_results.all": "Všetky",
"search_results.hashtags": "Haštagy",
+ "search_results.nothing_found": "Could not find anything for these search terms",
"search_results.statuses": "Príspevky",
"search_results.statuses_fts_disabled": "Vyhľadávanie v obsahu príspevkov nieje na tomto Mastodon serveri povolené.",
"search_results.total": "{count, number} {count, plural, one {výsledok} many {výsledkov} other {výsledky}}",
@@ -396,15 +450,20 @@
"status.delete": "Zmazať",
"status.detailed_status": "Podrobný náhľad celej konverzácie",
"status.direct": "Priama správa pre @{name}",
+ "status.edit": "Uprav",
+ "status.edited": "Upravené {date}",
+ "status.edited_x_times": "Edited {count, plural, one {{count} time} other {{count} times}}",
"status.embed": "Vložiť",
"status.favourite": "Páči sa mi",
"status.filtered": "Filtrované",
+ "status.history.created": "{name} created {date}",
+ "status.history.edited": "{name} edited {date}",
"status.load_more": "Ukáž viac",
"status.media_hidden": "Skryté médiá",
"status.mention": "Spomeň @{name}",
"status.more": "Viac",
- "status.mute": "Utíš @{name}",
- "status.mute_conversation": "Ignoruj konverzáciu",
+ "status.mute": "Nevšímaj si @{name}",
+ "status.mute_conversation": "Nevšímaj si konverzáciu",
"status.open": "Otvor tento príspevok",
"status.pin": "Pripni na profil",
"status.pinned": "Pripnutý príspevok",
@@ -426,7 +485,7 @@
"status.show_more_all": "Všetkým ukáž viac",
"status.show_thread": "Ukáž diskusné vlákno",
"status.uncached_media_warning": "Nedostupný/é",
- "status.unmute_conversation": "Prestaň ignorovať konverzáciu",
+ "status.unmute_conversation": "Prestaň si nevšímať konverzáciu",
"status.unpin": "Odopni z profilu",
"suggestions.dismiss": "Zavrhni návrh",
"suggestions.header": "Mohlo by ťa zaujímať…",
@@ -477,7 +536,7 @@
"video.expand": "Zväčši video",
"video.fullscreen": "Zobraz na celú obrazovku",
"video.hide": "Skry video",
- "video.mute": "Vypni zvuk",
+ "video.mute": "Stlm zvuk",
"video.pause": "Pauza",
"video.play": "Prehraj",
"video.unmute": "Zapni zvuk"
diff --git a/app/javascript/mastodon/locales/sl.json b/app/javascript/mastodon/locales/sl.json
index 0919fc3cd..92a3ffcc9 100644
--- a/app/javascript/mastodon/locales/sl.json
+++ b/app/javascript/mastodon/locales/sl.json
@@ -1,29 +1,29 @@
{
"account.account_note_header": "Opombe",
- "account.add_or_remove_from_list": "Dodaj ali odstrani iz seznama",
+ "account.add_or_remove_from_list": "Dodaj ali odstrani s seznamov",
"account.badges.bot": "Robot",
- "account.badges.group": "Group",
+ "account.badges.group": "Skupina",
"account.block": "Blokiraj @{name}",
- "account.block_domain": "Skrij vse iz {domain}",
+ "account.block_domain": "Blokiraj domeno {domain}",
"account.blocked": "Blokirano",
- "account.browse_more_on_origin_server": "Browse more on the original profile",
- "account.cancel_follow_request": "Cancel follow request",
+ "account.browse_more_on_origin_server": "Brskaj več po izvirnem profilu",
+ "account.cancel_follow_request": "Prekliči prošnjo za sledenje",
"account.direct": "Neposredno sporočilo @{name}",
- "account.disable_notifications": "Stop notifying me when @{name} posts",
- "account.domain_blocked": "Skrita domena",
+ "account.disable_notifications": "Ne obveščaj me več, ko ima @{name} novo objavo",
+ "account.domain_blocked": "Blokirana domena",
"account.edit_profile": "Uredi profil",
- "account.enable_notifications": "Notify me when @{name} posts",
- "account.endorse": "Zmožnost profila",
+ "account.enable_notifications": "Obvesti me, ko ima @{name} novo objavo",
+ "account.endorse": "Izpostavi v profilu",
"account.follow": "Sledi",
"account.followers": "Sledilci",
"account.followers.empty": "Nihče ne sledi temu uporabniku.",
- "account.followers_counter": "{count, plural, one {{counter} Follower} other {{counter} Followers}}",
- "account.following_counter": "{count, plural, one {{counter} Following} other {{counter} Following}}",
+ "account.followers_counter": "{count, plural, one {ima {count} sledilca} two {ima {count} sledilca} few {ima {count} sledilcev} other {ima {count} sledilce}}",
+ "account.following": "Following",
+ "account.following_counter": "{count, plural, one {sledi {count} osebi} two {sledi {count} osebama} few {sledi {count} osebam} other {sledi {count} osebam}}",
"account.follows.empty": "Ta uporabnik še ne sledi nikomur.",
- "account.follows_you": "Sledi tebi",
+ "account.follows_you": "Vam sledi",
"account.hide_reblogs": "Skrij spodbude od @{name}",
- "account.joined": "Joined {date}",
- "account.last_status": "Zadnja dejavnost",
+ "account.joined": "Pridružen/a {date}",
"account.link_verified_on": "Lastništvo te povezave je bilo preverjeno {date}",
"account.locked_info": "Stanje zasebnosti računa je nastavljeno na zaklenjeno. Lastnik ročno pregleda, kdo ga lahko spremlja.",
"account.media": "Mediji",
@@ -32,7 +32,6 @@
"account.mute": "Utišaj @{name}",
"account.mute_notifications": "Utišaj obvestila od @{name}",
"account.muted": "Utišan",
- "account.never_active": "Nikoli",
"account.posts": "Tuti",
"account.posts_with_replies": "Tuti in odgovori",
"account.report": "Prijavi @{name}",
@@ -42,22 +41,25 @@
"account.statuses_counter": "{count, plural, one {{counter} Toot} other {{counter} Toots}}",
"account.unblock": "Odblokiraj @{name}",
"account.unblock_domain": "Razkrij {domain}",
+ "account.unblock_short": "Odblokiraj",
"account.unendorse": "Ne vključi v profil",
"account.unfollow": "Prenehaj slediti",
"account.unmute": "Odtišaj @{name}",
"account.unmute_notifications": "Vklopi obvestila od @{name}",
+ "account.unmute_short": "Unmute",
"account_note.placeholder": "Click to add a note",
- "admin.dashboard.retention": "Retention",
- "admin.dashboard.retention.average": "Average",
- "admin.dashboard.retention.cohort": "Sign-up month",
- "admin.dashboard.retention.cohort_size": "New users",
- "alert.rate_limited.message": "Please retry after {retry_time, time, medium}.",
- "alert.rate_limited.title": "Rate limited",
+ "admin.dashboard.daily_retention": "User retention rate by day after sign-up",
+ "admin.dashboard.monthly_retention": "User retention rate by month after sign-up",
+ "admin.dashboard.retention.average": "Povprečje",
+ "admin.dashboard.retention.cohort": "Mesec prijave",
+ "admin.dashboard.retention.cohort_size": "Novi uporabniki",
+ "alert.rate_limited.message": "Poskusite znova čez {retry_time, time, medium}.",
+ "alert.rate_limited.title": "Hitrost omejena",
"alert.unexpected.message": "Zgodila se je nepričakovana napaka.",
"alert.unexpected.title": "Uups!",
- "announcement.announcement": "Announcement",
- "attachments_list.unprocessed": "(unprocessed)",
- "autosuggest_hashtag.per_week": "{count} per week",
+ "announcement.announcement": "Objava",
+ "attachments_list.unprocessed": "(neobdelano)",
+ "autosuggest_hashtag.per_week": "{count} na teden",
"boost_modal.combo": "Če želite preskočiti to, lahko pritisnete {combo}",
"bundle_column_error.body": "Med nalaganjem te komponente je prišlo do napake.",
"bundle_column_error.retry": "Poskusi ponovno",
@@ -66,10 +68,10 @@
"bundle_modal_error.message": "Med nalaganjem te komponente je prišlo do napake.",
"bundle_modal_error.retry": "Poskusi ponovno",
"column.blocks": "Blokirani uporabniki",
- "column.bookmarks": "Bookmarks",
+ "column.bookmarks": "Zaznamki",
"column.community": "Lokalna časovnica",
"column.direct": "Neposredna sporočila",
- "column.directory": "Browse profiles",
+ "column.directory": "Prebrskaj profile",
"column.domain_blocks": "Skrite domene",
"column.favourites": "Priljubljene",
"column.follow_requests": "Sledi prošnjam",
@@ -87,9 +89,9 @@
"column_header.show_settings": "Prikaži nastavitve",
"column_header.unpin": "Odpni",
"column_subheading.settings": "Nastavitve",
- "community.column_settings.local_only": "Local only",
+ "community.column_settings.local_only": "Samo krajevno",
"community.column_settings.media_only": "Samo mediji",
- "community.column_settings.remote_only": "Remote only",
+ "community.column_settings.remote_only": "Samo oddaljeno",
"compose_form.direct_message_warning": "Ta tut bo viden le vsem omenjenim uporabnikom.",
"compose_form.direct_message_warning_learn_more": "Nauči se več",
"compose_form.hashtag_warning": "Ta tut ne bo naveden pod nobenim ključnikom, ker ni javen. Samo javne tute lahko iščete s ključniki.",
@@ -100,10 +102,11 @@
"compose_form.poll.duration": "Trajanje ankete",
"compose_form.poll.option_placeholder": "Izbira {number}",
"compose_form.poll.remove_option": "Odstrani to izbiro",
- "compose_form.poll.switch_to_multiple": "Change poll to allow multiple choices",
- "compose_form.poll.switch_to_single": "Change poll to allow for a single choice",
+ "compose_form.poll.switch_to_multiple": "Spremenite anketo, da omogočite več izbir",
+ "compose_form.poll.switch_to_single": "Spremenite anketo, da omogočite eno izbiro",
"compose_form.publish": "Tutni",
"compose_form.publish_loud": "{publish}!",
+ "compose_form.save_changes": "Shrani spremembe",
"compose_form.sensitive.hide": "Označi medij kot občutljiv",
"compose_form.sensitive.marked": "Medij je označen kot občutljiv",
"compose_form.sensitive.unmarked": "Medij ni označen kot občutljiv",
@@ -118,14 +121,14 @@
"confirmations.delete.message": "Ali ste prepričani, da želite izbrisati to stanje?",
"confirmations.delete_list.confirm": "Izbriši",
"confirmations.delete_list.message": "Ali ste prepričani, da želite trajno izbrisati ta seznam?",
- "confirmations.discard_edit_media.confirm": "Discard",
- "confirmations.discard_edit_media.message": "You have unsaved changes to the media description or preview, discard them anyway?",
+ "confirmations.discard_edit_media.confirm": "Opusti",
+ "confirmations.discard_edit_media.message": "Imate ne shranjene spremembe za medijski opis ali predogled; jih želite kljub temu opustiti?",
"confirmations.domain_block.confirm": "Skrij celotno domeno",
"confirmations.domain_block.message": "Ali ste res, res prepričani, da želite blokirati celotno {domain}? V večini primerov je nekaj ciljnih blokiranj ali utišanj dovolj in boljše. Vsebino iz te domene ne boste videli v javnih časovnicah ali obvestilih. Vaši sledilci iz te domene bodo odstranjeni.",
- "confirmations.logout.confirm": "Log out",
- "confirmations.logout.message": "Are you sure you want to log out?",
+ "confirmations.logout.confirm": "Odjava",
+ "confirmations.logout.message": "Ali ste prepričani, da se želite odjaviti?",
"confirmations.mute.confirm": "Utišanje",
- "confirmations.mute.explanation": "This will hide posts from them and posts mentioning them, but it will still allow them to see your posts and follow you.",
+ "confirmations.mute.explanation": "S tem boste skrili objave pred njimi in objave, ki jih omenjajo, še vedno pa bodo lahko videli vaše objave in vam sledili.",
"confirmations.mute.message": "Ali ste prepričani, da želite utišati {name}?",
"confirmations.redraft.confirm": "Izbriši in preoblikuj",
"confirmations.redraft.message": "Ali ste prepričani, da želite izbrisati ta status in ga preoblikovati? Vzljubi in spodbude bodo izgubljeni, odgovori na izvirno objavo pa bodo osiroteli.",
@@ -133,14 +136,14 @@
"confirmations.reply.message": "Odgovarjanje bo prepisalo sporočilo, ki ga trenutno sestavljate. Ali ste prepričani, da želite nadaljevati?",
"confirmations.unfollow.confirm": "Prenehaj slediti",
"confirmations.unfollow.message": "Ali ste prepričani, da ne želite več slediti {name}?",
- "conversation.delete": "Delete conversation",
- "conversation.mark_as_read": "Mark as read",
- "conversation.open": "View conversation",
- "conversation.with": "With {names}",
- "directory.federated": "From known fediverse",
- "directory.local": "From {domain} only",
- "directory.new_arrivals": "New arrivals",
- "directory.recently_active": "Recently active",
+ "conversation.delete": "Izbriši pogovor",
+ "conversation.mark_as_read": "Označi kot prebrano",
+ "conversation.open": "Prikaži pogovor",
+ "conversation.with": "Z {names}",
+ "directory.federated": "Iz znanega fediverzuma",
+ "directory.local": "Samo iz {domain}",
+ "directory.new_arrivals": "Novi prišleki",
+ "directory.recently_active": "Nedavno aktiven/a",
"embed.instructions": "Vstavi ta status na svojo spletno stran tako, da kopirate spodnjo kodo.",
"embed.preview": "Tako bo izgledalo:",
"emoji_button.activity": "Dejavnost",
@@ -157,7 +160,7 @@
"emoji_button.search_results": "Rezultati iskanja",
"emoji_button.symbols": "Simboli",
"emoji_button.travel": "Potovanja in Kraji",
- "empty_column.account_suspended": "Account suspended",
+ "empty_column.account_suspended": "Račun je suspendiran",
"empty_column.account_timeline": "Tukaj ni tutov!",
"empty_column.account_unavailable": "Profil ni na voljo",
"empty_column.blocks": "Niste še blokirali nobenega uporabnika.",
@@ -165,31 +168,38 @@
"empty_column.community": "Lokalna časovnica je prazna. Napišite nekaj javnega, da se bo žoga zakotalila!",
"empty_column.direct": "Nimate še nobenih neposrednih sporočil. Ko ga boste poslali ali prejeli, se bo prikazal tukaj.",
"empty_column.domain_blocks": "Še vedno ni skritih domen.",
+ "empty_column.explore_statuses": "Trenutno ni nič v trendu. Preverite znova kasneje!",
"empty_column.favourited_statuses": "Nimate priljubljenih tutov. Ko boste vzljubili kakšnega, se bo prikazal tukaj.",
"empty_column.favourites": "Nihče še ni vzljubil tega tuta. Ko ga bo nekdo, se bo pojavil tukaj.",
- "empty_column.follow_recommendations": "Looks like no suggestions could be generated for you. You can try using search to look for people you might know or explore trending hashtags.",
+ "empty_column.follow_recommendations": "Kaže, da za vas ni mogoče pripraviti nobenih predlogov. Poskusite uporabiti iskanje, da poiščete osebe, ki jih poznate, ali raziščete ključnike, ki so v trendu.",
"empty_column.follow_requests": "Nimate prošenj za sledenje. Ko boste prejeli kakšno, se bo prikazala tukaj.",
"empty_column.hashtag": "V tem ključniku še ni nič.",
"empty_column.home": "Vaša domača časovnica je prazna! Obiščite {public} ali uporabite iskanje, da se boste srečali druge uporabnike.",
- "empty_column.home.suggestions": "See some suggestions",
+ "empty_column.home.suggestions": "Oglejte si nekaj predlogov",
"empty_column.list": "Na tem seznamu ni ničesar. Ko bodo člani tega seznama objavili nove statuse, se bodo pojavili tukaj.",
"empty_column.lists": "Nimate seznamov. Ko ga boste ustvarili, se bo prikazal tukaj.",
"empty_column.mutes": "Niste utišali še nobenega uporabnika.",
"empty_column.notifications": "Nimate še nobenih obvestil. Povežite se z drugimi, da začnete pogovor.",
"empty_column.public": "Tukaj ni ničesar! Da ga napolnite, napišite nekaj javnega ali pa ročno sledite uporabnikom iz drugih strežnikov",
- "error.unexpected_crash.explanation": "Due to a bug in our code or a browser compatibility issue, this page could not be displayed correctly.",
- "error.unexpected_crash.explanation_addons": "This page could not be displayed correctly. This error is likely caused by a browser add-on or automatic translation tools.",
- "error.unexpected_crash.next_steps": "Try refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
- "error.unexpected_crash.next_steps_addons": "Try disabling them and refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
- "errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard",
- "errors.unexpected_crash.report_issue": "Report issue",
- "follow_recommendations.done": "Done",
- "follow_recommendations.heading": "Follow people you'd like to see posts from! Here are some suggestions.",
- "follow_recommendations.lead": "Posts from people you follow will show up in chronological order on your home feed. Don't be afraid to make mistakes, you can unfollow people just as easily any time!",
+ "error.unexpected_crash.explanation": "Zaradi hrošča v naši kodi ali težave z združljivostjo brskalnika te strani ni mogoče ustrezno prikazati.",
+ "error.unexpected_crash.explanation_addons": "Te strani ni mogoče ustrezno prikazati. To napako najverjetneje povzroča dodatek briskalnika ali samodejna orodja za prevajanje.",
+ "error.unexpected_crash.next_steps": "Poskusite osvežiti stran. Če to ne pomaga, boste morda še vedno lahko uporabljali Mastodon prek drugega brskalnika ali z domorodno aplikacijo.",
+ "error.unexpected_crash.next_steps_addons": "Poskusite jih onemogočiti in osvežiti stran. Če to ne pomaga, boste morda še vedno lahko uporabljali Mastodon prek drugega brskalnika ali z domorodno aplikacijo.",
+ "errors.unexpected_crash.copy_stacktrace": "Kopiraj sledenje sklada na odložišče",
+ "errors.unexpected_crash.report_issue": "Prijavi težavo",
+ "explore.search_results": "Rezultati iskanja",
+ "explore.suggested_follows": "Za vas",
+ "explore.title": "Razišči",
+ "explore.trending_links": "Novice",
+ "explore.trending_statuses": "Objave",
+ "explore.trending_tags": "Ključniki",
+ "follow_recommendations.done": "Opravljeno",
+ "follow_recommendations.heading": "Sledite osebam, katerih objave želite videti! Tukaj je nekaj predlogov.",
+ "follow_recommendations.lead": "Objave oseb, ki jim sledite, se bodo prikazale v kronološkem zaporedju v vašem domačem viru. Ne bojte se storiti napake, osebam enako enostavno nehate slediti kadar koli!",
"follow_request.authorize": "Overi",
"follow_request.reject": "Zavrni",
- "follow_requests.unlocked_explanation": "Even though your account is not locked, the {domain} staff thought you might want to review follow requests from these accounts manually.",
- "generic.saved": "Saved",
+ "follow_requests.unlocked_explanation": "Čeprav vaš račun ni zaklenjen, zaposleni pri {domain} menijo, da bi morda želeli pregledati zahteve za sledenje teh računov ročno.",
+ "generic.saved": "Shranjeno",
"getting_started.developers": "Razvijalci",
"getting_started.directory": "Imenik profilov",
"getting_started.documentation": "Dokumentacija",
@@ -210,8 +220,8 @@
"home.column_settings.basic": "Osnovno",
"home.column_settings.show_reblogs": "Pokaži spodbude",
"home.column_settings.show_replies": "Pokaži odgovore",
- "home.hide_announcements": "Hide announcements",
- "home.show_announcements": "Show announcements",
+ "home.hide_announcements": "Skrij objave",
+ "home.show_announcements": "Prikaži objave",
"intervals.full.days": "{number, plural, one {# dan} two {# dni} few {# dni} other {# dni}}",
"intervals.full.hours": "{number, plural, one {# ura} two {# uri} few {# ure} other {# ur}}",
"intervals.full.minutes": "{number, plural, one {# minuta} two {# minuti} few {# minute} other {# minut}}",
@@ -250,8 +260,8 @@
"keyboard_shortcuts.unfocus": "odfokusiraj območje za sestavljanje besedila/iskanje",
"keyboard_shortcuts.up": "premakni se navzgor po seznamu",
"lightbox.close": "Zapri",
- "lightbox.compress": "Compress image view box",
- "lightbox.expand": "Expand image view box",
+ "lightbox.compress": "Strni ogledno polje slike",
+ "lightbox.expand": "Razširi ogledno polje slike",
"lightbox.next": "Naslednji",
"lightbox.previous": "Prejšnji",
"lists.account.add": "Dodaj na seznam",
@@ -261,10 +271,10 @@
"lists.edit.submit": "Spremeni naslov",
"lists.new.create": "Dodaj seznam",
"lists.new.title_placeholder": "Nov naslov seznama",
- "lists.replies_policy.followed": "Any followed user",
- "lists.replies_policy.list": "Members of the list",
- "lists.replies_policy.none": "No one",
- "lists.replies_policy.title": "Show replies to:",
+ "lists.replies_policy.followed": "Vsem sledenim uporabnikom",
+ "lists.replies_policy.list": "Članom seznama",
+ "lists.replies_policy.none": "Nikomur",
+ "lists.replies_policy.title": "Pokaži odgovore:",
"lists.search": "Išči med ljudmi, katerim sledite",
"lists.subheading": "Vaši seznami",
"load_pending": "{count, plural, one {# nov element} other {# novih elementov}}",
@@ -272,18 +282,19 @@
"media_gallery.toggle_visible": "Preklopi vidljivost",
"missing_indicator.label": "Ni najdeno",
"missing_indicator.sublabel": "Tega vira ni bilo mogoče najti",
- "mute_modal.duration": "Duration",
+ "mute_modal.duration": "Trajanje",
"mute_modal.hide_notifications": "Skrij obvestila tega uporabnika?",
- "mute_modal.indefinite": "Indefinite",
+ "mute_modal.indefinite": "Nedoločeno",
"navigation_bar.apps": "Mobilne aplikacije",
"navigation_bar.blocks": "Blokirani uporabniki",
- "navigation_bar.bookmarks": "Bookmarks",
+ "navigation_bar.bookmarks": "Zaznamki",
"navigation_bar.community_timeline": "Lokalna časovnica",
"navigation_bar.compose": "Sestavi nov tut",
"navigation_bar.direct": "Neposredna sporočila",
"navigation_bar.discover": "Odkrijte",
"navigation_bar.domain_blocks": "Skrite domene",
"navigation_bar.edit_profile": "Uredi profil",
+ "navigation_bar.explore": "Razišči",
"navigation_bar.favourites": "Priljubljeni",
"navigation_bar.filters": "Utišane besede",
"navigation_bar.follow_requests": "Prošnje za sledenje",
@@ -298,23 +309,26 @@
"navigation_bar.preferences": "Nastavitve",
"navigation_bar.public_timeline": "Združena časovnica",
"navigation_bar.security": "Varnost",
+ "notification.admin.sign_up": "{name} se je vpisal/a",
"notification.favourite": "{name} je vzljubil/a vaš status",
"notification.follow": "{name} vam sledi",
- "notification.follow_request": "{name} has requested to follow you",
+ "notification.follow_request": "{name} vam želi slediti",
"notification.mention": "{name} vas je omenil/a",
- "notification.own_poll": "Your poll has ended",
+ "notification.own_poll": "Vaša anketa se je končala",
"notification.poll": "Glasovanje, v katerem ste sodelovali, se je končalo",
"notification.reblog": "{name} je spodbudil/a vaš status",
- "notification.status": "{name} just posted",
+ "notification.status": "{name} je pravkar objavil/a",
+ "notification.update": "{name} je uredil(a) objavo",
"notifications.clear": "Počisti obvestila",
"notifications.clear_confirmation": "Ali ste prepričani, da želite trajno izbrisati vsa vaša obvestila?",
+ "notifications.column_settings.admin.sign_up": "Novi vpisi:",
"notifications.column_settings.alert": "Namizna obvestila",
"notifications.column_settings.favourite": "Priljubljeni:",
"notifications.column_settings.filter_bar.advanced": "Prikaži vse kategorije",
"notifications.column_settings.filter_bar.category": "Vrstica za hitro filtriranje",
- "notifications.column_settings.filter_bar.show": "Pokaži",
+ "notifications.column_settings.filter_bar.show_bar": "Pokaži vrstico s filtri",
"notifications.column_settings.follow": "Novi sledilci:",
- "notifications.column_settings.follow_request": "New follow requests:",
+ "notifications.column_settings.follow_request": "Nove prošnje za sledenje:",
"notifications.column_settings.mention": "Omembe:",
"notifications.column_settings.poll": "Rezultati glasovanja:",
"notifications.column_settings.push": "Potisna obvestila",
@@ -322,31 +336,33 @@
"notifications.column_settings.show": "Prikaži v stolpcu",
"notifications.column_settings.sound": "Predvajaj zvok",
"notifications.column_settings.status": "New toots:",
- "notifications.column_settings.unread_markers.category": "Unread notification markers",
+ "notifications.column_settings.unread_notifications.category": "Neprebrana obvestila",
+ "notifications.column_settings.unread_notifications.highlight": "Poudari neprebrana obvestila",
+ "notifications.column_settings.update": "Urejanja:",
"notifications.filter.all": "Vse",
"notifications.filter.boosts": "Spodbude",
"notifications.filter.favourites": "Priljubljeni",
"notifications.filter.follows": "Sledi",
"notifications.filter.mentions": "Omembe",
"notifications.filter.polls": "Rezultati glasovanj",
- "notifications.filter.statuses": "Updates from people you follow",
- "notifications.grant_permission": "Grant permission.",
+ "notifications.filter.statuses": "Posodobitve pri osebah, ki jih spremljate",
+ "notifications.grant_permission": "Dovoli.",
"notifications.group": "{count} obvestil",
- "notifications.mark_as_read": "Mark every notification as read",
- "notifications.permission_denied": "Desktop notifications are unavailable due to previously denied browser permissions request",
- "notifications.permission_denied_alert": "Desktop notifications can't be enabled, as browser permission has been denied before",
- "notifications.permission_required": "Desktop notifications are unavailable because the required permission has not been granted.",
- "notifications_permission_banner.enable": "Enable desktop notifications",
- "notifications_permission_banner.how_to_control": "To receive notifications when Mastodon isn't open, enable desktop notifications. You can control precisely which types of interactions generate desktop notifications through the {icon} button above once they're enabled.",
- "notifications_permission_banner.title": "Never miss a thing",
- "picture_in_picture.restore": "Put it back",
+ "notifications.mark_as_read": "Vsa obvestila ozači kot prebrana",
+ "notifications.permission_denied": "Namizna obvestila niso na voljo zaradi poprej zavrnjene zahteve dovoljenja brskalnika.",
+ "notifications.permission_denied_alert": "Namiznih obvestil ni mogoče omogočiti, ker je bilo dovoljenje brskalnika že prej zavrnjeno",
+ "notifications.permission_required": "Namizna obvestila niso na voljo, ker zahtevano dovoljenje ni bilo podeljeno.",
+ "notifications_permission_banner.enable": "Omogoči obvestila na namizju",
+ "notifications_permission_banner.how_to_control": "Če želite prejemati obvestila, ko Mastodon ni odprt, omogočite namizna obvestila. Natančno lahko nadzirate, katere vrste interakcij naj tvorijo namizna obvestila; ko so omogočena, za to uporabite gumb {icon} zgoraj.",
+ "notifications_permission_banner.title": "Nikoli ne zamudite ničesar",
+ "picture_in_picture.restore": "Postavi nazaj",
"poll.closed": "Zaprto",
"poll.refresh": "Osveži",
- "poll.total_people": "{count, plural, one {# person} other {# people}}",
+ "poll.total_people": "{count, plural, one {# oseba} two {# osebi} few {# osebe} other {# oseb}}",
"poll.total_votes": "{count, plural,one {# glas} other {# glasov}}",
"poll.vote": "Glasuj",
- "poll.voted": "You voted for this answer",
- "poll.votes": "{votes, plural, one {# vote} other {# votes}}",
+ "poll.voted": "Glasovali ste za ta odgovor",
+ "poll.votes": "{votes, plural, one {# glas} two {# glasova} few {# glasovi} other {# glasov}}",
"poll_button.add_poll": "Dodaj anketo",
"poll_button.remove_poll": "Odstrani anketo",
"privacy.change": "Prilagodi zasebnost statusa",
@@ -358,22 +374,58 @@
"privacy.public.short": "Javno",
"privacy.unlisted.long": "Ne objavi na javne časovnice",
"privacy.unlisted.short": "Ni prikazano",
- "refresh": "Refresh",
+ "refresh": "Osveži",
"regeneration_indicator.label": "Nalaganje…",
"regeneration_indicator.sublabel": "Vaš domači vir se pripravlja!",
"relative_time.days": "{number}d",
- "relative_time.hours": "{number}h",
+ "relative_time.full.days": "{number, plural, one {pred # dnem} two {pred # dnevoma} few {pred # dnevi} other {pred # dnevi}}",
+ "relative_time.full.hours": "{number, plural, one {pred # uro} two {pred # urama} few {pred # urami} other {pred # urami}}",
+ "relative_time.full.just_now": "pravkar",
+ "relative_time.full.minutes": "{number, plural, one {pred # minuto} two {pred # minutama} few {pred # minutami} other {pred # minutami}}",
+ "relative_time.full.seconds": "{number, plural, one {pred # sekundo} two {pred # sekundama} few {pred # sekundami} other {pred # sekundami}}",
+ "relative_time.hours": "{number}u",
"relative_time.just_now": "zdaj",
"relative_time.minutes": "{number}m",
"relative_time.seconds": "{number}s",
"relative_time.today": "danes",
"reply_indicator.cancel": "Prekliči",
+ "report.block": "Blokiraj",
+ "report.block_explanation": "Njihovih objav ne boste videli. Oni ne bodo videli vaših objav, niti vam ne morejo slediti. Lahko bodo ugotovili, da so blokirani.",
+ "report.categories.other": "Drugo",
+ "report.categories.spam": "Neželeno",
+ "report.categories.violation": "Vsebina krši eno ali več pravil strežnika",
+ "report.category.subtitle": "Izberite najboljši zadetek",
+ "report.category.title": "Povejte nam, kaj se dogaja s to/tem {type}",
+ "report.category.title_account": "profil",
+ "report.category.title_status": "objava",
+ "report.close": "Opravljeno",
+ "report.comment.title": "Je še kaj, za kar menite, da bi morali vedeti?",
"report.forward": "Posreduj do {target}",
"report.forward_hint": "Račun je iz drugega strežnika. Pošljem anonimno kopijo poročila tudi na drugi strežnik?",
- "report.hint": "Poročilo bo poslano moderatorjem vašega vozlišča. Spodaj lahko navedete, zakaj prijavljate ta račun:",
+ "report.mute": "Utišaj",
+ "report.mute_explanation": "Njihovih objav ne boste videli. Še vedno vam lahko sledijo in vidijo vaše objave, ne bodo vedeli, da so utišani.",
+ "report.next": "Naprej",
"report.placeholder": "Dodatni komentarji",
+ "report.reasons.dislike": "Ni mi všeč",
+ "report.reasons.dislike_description": "To ni tisto, kar želim videti",
+ "report.reasons.other": "Gre za nekaj drugega",
+ "report.reasons.other_description": "Težava ne sodi v druge kategorije",
+ "report.reasons.spam": "To je neželena vsebina",
+ "report.reasons.spam_description": "Škodljive povezave, lažno prizadevanje ali ponavljajoči se odgovori",
+ "report.reasons.violation": "Krši strežniška pravila",
+ "report.reasons.violation_description": "Zavedate se, da krši določena pravila",
+ "report.rules.subtitle": "Izberite vse, kar ustreza",
+ "report.rules.title": "Katera pravila so kršena?",
+ "report.statuses.subtitle": "Izberite vse, kar ustreza",
+ "report.statuses.title": "Ali so kakšne objave, ki dokazujejo trditve iz tega poročila?",
"report.submit": "Pošlji",
"report.target": "Prijavi {target}",
+ "report.thanks.take_action": "Tukaj so vaše možnosti za nadzor tistega, kar vidite na Mastodonu:",
+ "report.thanks.take_action_actionable": "Medtem, ko to pregledujemo, lahko proti @{name} ukrepate:",
+ "report.thanks.title": "Ali si želite to pogledati?",
+ "report.thanks.title_actionable": "Hvala za poročilo, bomo preverili.",
+ "report.unfollow": "Ne sledi več @{name}",
+ "report.unfollow_explanation": "Temu računu sledite. Da ne boste več videli njegovih objav v svojem domačem viru, mu prenehajte slediti.",
"search.placeholder": "Iskanje",
"search_popout.search_format": "Napredna oblika iskanja",
"search_popout.tips.full_text": "Enostavno besedilo vrne statuse, ki ste jih napisali, vzljubili, spodbudili ali ste bili v njih omenjeni, kot tudi ujemajoča se uporabniška imena, prikazna imena in ključnike.",
@@ -382,23 +434,30 @@
"search_popout.tips.text": "Enostavno besedilo vrne ujemajoča se prikazna imena, uporabniška imena in ključnike",
"search_popout.tips.user": "uporabnik",
"search_results.accounts": "Ljudje",
+ "search_results.all": "Vse",
"search_results.hashtags": "Ključniki",
+ "search_results.nothing_found": "Za ta iskalni niz ni zadetkov",
"search_results.statuses": "Tuti",
"search_results.statuses_fts_disabled": "Iskanje tutov po njihovi vsebini ni omogočeno na tem strežniku Mastodon.",
"search_results.total": "{count, number} {count, plural, one {rezultat} other {rezultatov}}",
"status.admin_account": "Odpri vmesnik za moderiranje za @{name}",
"status.admin_status": "Odpri status v vmesniku za moderiranje",
"status.block": "Blokiraj @{name}",
- "status.bookmark": "Bookmark",
+ "status.bookmark": "Dodaj med zaznamke",
"status.cancel_reblog_private": "Prekini spodbudo",
"status.cannot_reblog": "Te objave ni mogoče spodbuditi",
"status.copy": "Kopiraj povezavo do statusa",
"status.delete": "Izbriši",
"status.detailed_status": "Podroben pogled pogovora",
"status.direct": "Neposredno sporočilo @{name}",
+ "status.edit": "Uredi",
+ "status.edited": "Urejeno {date}",
+ "status.edited_x_times": "Urejeno {count, plural, one {#-krat} two {#-krat} few {#-krat} other {#-krat}}",
"status.embed": "Vgradi",
"status.favourite": "Priljubljen",
"status.filtered": "Filtrirano",
+ "status.history.created": "{name}: ustvarjeno {date}",
+ "status.history.edited": "{name}: urejeno {date}",
"status.load_more": "Naloži več",
"status.media_hidden": "Mediji so skriti",
"status.mention": "Omeni @{name}",
@@ -414,7 +473,7 @@
"status.reblogged_by": "{name} spodbuja",
"status.reblogs.empty": "Nihče še ni spodbudil tega tuta. Ko se bo to zgodilo, se bodo pojavili tukaj.",
"status.redraft": "Izbriši in preoblikuj",
- "status.remove_bookmark": "Remove bookmark",
+ "status.remove_bookmark": "Odstrani zaznamek",
"status.reply": "Odgovori",
"status.replyAll": "Odgovori na objavo",
"status.report": "Prijavi @{name}",
@@ -425,7 +484,7 @@
"status.show_more": "Prikaži več",
"status.show_more_all": "Prikaži več za vse",
"status.show_thread": "Prikaži objavo",
- "status.uncached_media_warning": "Not available",
+ "status.uncached_media_warning": "Ni na voljo",
"status.unmute_conversation": "Odtišaj pogovor",
"status.unpin": "Odpni iz profila",
"suggestions.dismiss": "Zavrni predlog",
@@ -440,39 +499,39 @@
"time_remaining.minutes": "{number, plural, one {# minuta} other {# minut}} je ostalo",
"time_remaining.moments": "Preostali trenutki",
"time_remaining.seconds": "{number, plural, one {# sekunda} other {# sekund}} je ostalo",
- "timeline_hint.remote_resource_not_displayed": "{resource} from other servers are not displayed.",
- "timeline_hint.resources.followers": "Followers",
- "timeline_hint.resources.follows": "Follows",
+ "timeline_hint.remote_resource_not_displayed": "{resource} z drugih strežnikov ni prikazano.",
+ "timeline_hint.resources.followers": "sledilcev",
+ "timeline_hint.resources.follows": "Sledi",
"timeline_hint.resources.statuses": "Older toots",
- "trends.counter_by_accounts": "{count, plural, one {{counter} person} other {{counter} people}} talking",
- "trends.trending_now": "Trending now",
+ "trends.counter_by_accounts": "{count, plural, one {{count} oseba govori} two {{count} osebi govorita} few {{count} osebe govorijo} other {{count} oseb govori}}",
+ "trends.trending_now": "Zdaj v trendu",
"ui.beforeunload": "Vaš osnutek bo izgubljen, če zapustite Mastodona.",
- "units.short.billion": "{count}B",
- "units.short.million": "{count}M",
- "units.short.thousand": "{count}K",
+ "units.short.billion": "{count} milijard",
+ "units.short.million": "{count} mio.",
+ "units.short.thousand": "{count} tisoč",
"upload_area.title": "Za pošiljanje povlecite in spustite",
"upload_button.label": "Dodaj medije",
"upload_error.limit": "Omejitev prenosa datoteke je presežena.",
"upload_error.poll": "Prenos datoteke z anketami ni dovoljen.",
- "upload_form.audio_description": "Describe for people with hearing loss",
+ "upload_form.audio_description": "Opiši za osebe z okvaro sluha",
"upload_form.description": "Opišite za slabovidne",
- "upload_form.edit": "Edit",
- "upload_form.thumbnail": "Change thumbnail",
+ "upload_form.edit": "Uredi",
+ "upload_form.thumbnail": "Spremeni sličico",
"upload_form.undo": "Izbriši",
- "upload_form.video_description": "Describe for people with hearing loss or visual impairment",
- "upload_modal.analyzing_picture": "Analyzing picture…",
- "upload_modal.apply": "Apply",
- "upload_modal.applying": "Applying…",
- "upload_modal.choose_image": "Choose image",
+ "upload_form.video_description": "Opiši za osebe z okvaro sluha in/ali vida",
+ "upload_modal.analyzing_picture": "Analiziranje slike …",
+ "upload_modal.apply": "Uveljavi",
+ "upload_modal.applying": "Uveljavljanje poteka …",
+ "upload_modal.choose_image": "Izberite sliko",
"upload_modal.description_placeholder": "Pri Jakcu bom vzel šest čudežnih fig",
- "upload_modal.detect_text": "Detect text from picture",
- "upload_modal.edit_media": "Edit media",
- "upload_modal.hint": "Click or drag the circle on the preview to choose the focal point which will always be in view on all thumbnails.",
- "upload_modal.preparing_ocr": "Preparing OCR…",
- "upload_modal.preview_label": "Preview ({ratio})",
+ "upload_modal.detect_text": "Zaznaj besedilo s slike",
+ "upload_modal.edit_media": "Uredi medij",
+ "upload_modal.hint": "Kliknite ali povlecite krog v predogledu, da izberete točko pozornosti, ki bo vedno vidna na vseh oglednih sličicah.",
+ "upload_modal.preparing_ocr": "Priprava optične prepoznave znakov (OCR) ...",
+ "upload_modal.preview_label": "Predogled ({ratio})",
"upload_progress.label": "Pošiljanje...",
"video.close": "Zapri video",
- "video.download": "Download file",
+ "video.download": "Prenesi datoteko",
"video.exit_fullscreen": "Izhod iz celozaslonskega načina",
"video.expand": "Razširi video",
"video.fullscreen": "Celozaslonski način",
diff --git a/app/javascript/mastodon/locales/sq.json b/app/javascript/mastodon/locales/sq.json
index 062b566d0..d1047f5da 100644
--- a/app/javascript/mastodon/locales/sq.json
+++ b/app/javascript/mastodon/locales/sq.json
@@ -18,12 +18,12 @@
"account.followers": "Ndjekës",
"account.followers.empty": "Këtë përdorues ende s’e ndjek kush.",
"account.followers_counter": "{count, plural, one {{counter} Ndjekës} other {{counter} Ndjekës}}",
+ "account.following": "Following",
"account.following_counter": "{count, plural, one {{counter} i Ndjekur} other {{counter} të Ndjekur}}",
"account.follows.empty": "Ky përdorues ende s’ndjek kënd.",
"account.follows_you": "Ju ndjek",
"account.hide_reblogs": "Fshih përforcime nga @{name}",
"account.joined": "U bë pjesë më {date}",
- "account.last_status": "Aktiv së fundi më",
"account.link_verified_on": "Pronësia e kësaj lidhjeje qe kontrolluar më {date}",
"account.locked_info": "Gjendja e privatësisë së kësaj llogarie është caktuar si e kyçur. I zoti merr dorazi në shqyrtim cilët mund ta ndjekin.",
"account.media": "Media",
@@ -32,7 +32,6 @@
"account.mute": "Heshtoni @{name}",
"account.mute_notifications": "Heshtoji njoftimet prej @{name}",
"account.muted": "Heshtuar",
- "account.never_active": "Kurrë",
"account.posts": "Mesazhe",
"account.posts_with_replies": "Mesazhe dhe përgjigje",
"account.report": "Raportojeni @{name}",
@@ -42,21 +41,24 @@
"account.statuses_counter": "{count, plural, one {{counter} Mesazh} other {{counter} Mesazhe}}",
"account.unblock": "Zhbllokoje @{name}",
"account.unblock_domain": "Zhblloko përkatësinë {domain}",
+ "account.unblock_short": "Unblock",
"account.unendorse": "Mos e përfshi në profil",
"account.unfollow": "Resht së ndjekuri",
"account.unmute": "Ktheji zërin @{name}",
"account.unmute_notifications": "Hiqua ndalimin e shfaqjes njoftimeve nga @{name}",
+ "account.unmute_short": "Unmute",
"account_note.placeholder": "Klikoni për të shtuar shënim",
- "admin.dashboard.retention": "Retention",
- "admin.dashboard.retention.average": "Average",
- "admin.dashboard.retention.cohort": "Sign-up month",
- "admin.dashboard.retention.cohort_size": "New users",
+ "admin.dashboard.daily_retention": "Shkallë mbajtjeje përdoruesi, në ditë, pas regjistrimit",
+ "admin.dashboard.monthly_retention": "Shkallë mbajtjeje përdoruesi, në muaj, pas regjistrimit",
+ "admin.dashboard.retention.average": "Mesatare",
+ "admin.dashboard.retention.cohort": "Muaj regjistrimi",
+ "admin.dashboard.retention.cohort_size": "Përdorues të rinj",
"alert.rate_limited.message": "Ju lutemi, riprovoni pas {retry_time, time, medium}.",
"alert.rate_limited.title": "Shpejtësi e kufizuar",
"alert.unexpected.message": "Ndodhi një gabim të papritur.",
"alert.unexpected.title": "Hëm!",
"announcement.announcement": "Lajmërim",
- "attachments_list.unprocessed": "(unprocessed)",
+ "attachments_list.unprocessed": "(e papërpunuar)",
"autosuggest_hashtag.per_week": "{count} për javë",
"boost_modal.combo": "Që kjo të anashkalohet herës tjetër, mund të shtypni {combo}",
"bundle_column_error.body": "Diç shkoi ters teksa ngarkohej ky përbërës.",
@@ -104,6 +106,7 @@
"compose_form.poll.switch_to_single": "Ndrysho votimin për të lejuar vetëm një zgjedhje",
"compose_form.publish": "Mesazh",
"compose_form.publish_loud": "{publish}!",
+ "compose_form.save_changes": "Ruaji ndryshimet",
"compose_form.sensitive.hide": "{count, plural, one {Vëri shenjë medias si rezervat} other {Vëru shenjë mediave si rezervat}}",
"compose_form.sensitive.marked": "{count, plural, one {Medias i është vënë shenjë rezervat} other {Mediave u është vënë shenjë si rezervat}}",
"compose_form.sensitive.unmarked": "{count, plural, one {Media s’ka shenjë si rezervat} other {Mediat s’kanë shenja si rezervat}}",
@@ -118,8 +121,8 @@
"confirmations.delete.message": "Jeni i sigurt se doni të fshihet kjo gjendje?",
"confirmations.delete_list.confirm": "Fshije",
"confirmations.delete_list.message": "Jeni i sigurt se doni të fshihet përgjithmonë kjo listë?",
- "confirmations.discard_edit_media.confirm": "Discard",
- "confirmations.discard_edit_media.message": "You have unsaved changes to the media description or preview, discard them anyway?",
+ "confirmations.discard_edit_media.confirm": "Hidhe tej",
+ "confirmations.discard_edit_media.message": "Keni ndryshime të paruajtura te përshkrimi ose paraparja e medias, të hidhen tej, sido qoftë?",
"confirmations.domain_block.confirm": "Bllokoje krejt përkatësinë",
"confirmations.domain_block.message": "Jeni i sigurt, shumë i sigurt se doni të bllokohet krejt {domain}? Në shumicën e rasteve, ndoca bllokime ose heshtime me synim të caktuar janë të mjaftueshme dhe të parapëlqyera. S’keni për të parë lëndë nga kjo përkatësi në ndonjë rrjedhë kohore publike, apo te njoftimet tuaja. Ndjekësit tuaj prej asaj përkatësie do të hiqen.",
"confirmations.logout.confirm": "Dilni",
@@ -165,6 +168,7 @@
"empty_column.community": "Rrjedha kohore vendore është e zbrazët. Shkruani diçka publikisht që t’i hyhet valles!",
"empty_column.direct": "S’keni ende ndonjë mesazh të drejtpërdrejt. Kur dërgoni ose merrni një të tillë, ai do të shfaqet këtu.",
"empty_column.domain_blocks": "Ende s’ka përkatësi të fshehura.",
+ "empty_column.explore_statuses": "Asgjë në modë tani. Kontrolloni më vonë!",
"empty_column.favourited_statuses": "S’keni ende ndonjë mesazh të parapëlqyer. Kur parapëlqeni një të tillë, ai do të shfaqet këtu.",
"empty_column.favourites": "Askush s’e ka parapëlqyer ende këtë mesazh. Kur e bën dikush, ai do të shfaqet këtu.",
"empty_column.follow_recommendations": "Duket se s’u prodhuan dot sugjerime për ju. Mund të provoni të kërkoni për persona që mund të njihni, ose të eksploroni hashtag-ë që janë në modë.",
@@ -183,6 +187,12 @@
"error.unexpected_crash.next_steps_addons": "Provoni t’i çaktivizoni dhe të rifreskoni faqen. Nëse kjo s’bën punë, mundeni prapë të jeni në gjendje të përdorni Mastodon-in përmes një shfletuesi tjetër, apo një aplikacioni prej Mastodon-it.",
"errors.unexpected_crash.copy_stacktrace": "Kopjo stacktrace-in në të papastër",
"errors.unexpected_crash.report_issue": "Raportoni problemin",
+ "explore.search_results": "Përfundime kërkimi",
+ "explore.suggested_follows": "Për ju",
+ "explore.title": "Eksploroni",
+ "explore.trending_links": "Lajme",
+ "explore.trending_statuses": "Postime",
+ "explore.trending_tags": "Hashtagë",
"follow_recommendations.done": "U bë",
"follow_recommendations.heading": "Ndiqni persona prej të cilëve doni të shihni postime! Ja ca sugjerime.",
"follow_recommendations.lead": "Postimet prej personash që ndiqni do të shfaqen në rend kohor te prurja juaj kryesore. Mos kini frikë të bëni gabime, mund të ndalni po aq kollaj ndjekjen e dikujt, në çfarëdo kohe!",
@@ -284,6 +294,7 @@
"navigation_bar.discover": "Zbuloni",
"navigation_bar.domain_blocks": "Përkatësi të bllokuara",
"navigation_bar.edit_profile": "Përpunoni profilin",
+ "navigation_bar.explore": "Explore",
"navigation_bar.favourites": "Të parapëlqyer",
"navigation_bar.filters": "Fjalë të heshtuara",
"navigation_bar.follow_requests": "Kërkesa për ndjekje",
@@ -298,6 +309,7 @@
"navigation_bar.preferences": "Parapëlqime",
"navigation_bar.public_timeline": "Rrjedhë kohore të federuarish",
"navigation_bar.security": "Siguri",
+ "notification.admin.sign_up": "{name} u regjistrua",
"notification.favourite": "{name} pëlqeu mesazhin tuaj",
"notification.follow": "{name} zuri t’ju ndjekë",
"notification.follow_request": "{name} ka kërkuar t’ju ndjekë",
@@ -306,13 +318,15 @@
"notification.poll": "Ka përfunduar një pyetësor ku keni votuar",
"notification.reblog": "{name} përforcoi mesazhin tuaj",
"notification.status": "{name} sapo postoi",
+ "notification.update": "{name} përpunoi një postim",
"notifications.clear": "Spastroji njoftimet",
"notifications.clear_confirmation": "Jeni i sigurt se doni të spastrohen përgjithmonë krejt njoftimet tuaja?",
+ "notifications.column_settings.admin.sign_up": "Regjistrime të reja:",
"notifications.column_settings.alert": "Njoftime desktopi",
"notifications.column_settings.favourite": "Të parapëlqyer:",
"notifications.column_settings.filter_bar.advanced": "Shfaq krejt kategoritë",
"notifications.column_settings.filter_bar.category": "Shtyllë filtrimesh të shpejta",
- "notifications.column_settings.filter_bar.show": "Shfaq",
+ "notifications.column_settings.filter_bar.show_bar": "Shfaq shtyllë filtrash",
"notifications.column_settings.follow": "Ndjekës të rinj:",
"notifications.column_settings.follow_request": "Kërkesa të reja për ndjekje:",
"notifications.column_settings.mention": "Përmendje:",
@@ -322,7 +336,9 @@
"notifications.column_settings.show": "Shfaqi në shtylla",
"notifications.column_settings.sound": "Luaj një tingull",
"notifications.column_settings.status": "Mesazhe të rinj:",
- "notifications.column_settings.unread_markers.category": "Shenja njoftimesh të palexuara",
+ "notifications.column_settings.unread_notifications.category": "Njoftime të palexuara",
+ "notifications.column_settings.unread_notifications.highlight": "Theksoji njoftimet e palexuara",
+ "notifications.column_settings.update": "Përpunime:",
"notifications.filter.all": "Krejt",
"notifications.filter.boosts": "Përforcime",
"notifications.filter.favourites": "Të parapëlqyer",
@@ -346,7 +362,7 @@
"poll.total_votes": "{count, plural,one {# votë }other {# vota }}",
"poll.vote": "Votoni",
"poll.voted": "Votuat për këtë përgjigje",
- "poll.votes": "{votes, plural, one {# vote} other {# votes}}",
+ "poll.votes": "{votes, plural, one {# votë} other {# vota}}",
"poll_button.add_poll": "Shtoni një pyetësor",
"poll_button.remove_poll": "Hiqe pyetësorin",
"privacy.change": "Rregulloni privatësi mesazhesh",
@@ -362,18 +378,54 @@
"regeneration_indicator.label": "Po ngarkohet…",
"regeneration_indicator.sublabel": "Prurja juaj vetjake po përgatitet!",
"relative_time.days": "{number}d",
+ "relative_time.full.days": "{number, plural, one {# ditë} other {# ditë}} më parë",
+ "relative_time.full.hours": "{number, plural, one {# orë} other {# orë}} më parë",
+ "relative_time.full.just_now": "mu tani",
+ "relative_time.full.minutes": "{number, plural, one {# minutë} other {# minuta}} më parë",
+ "relative_time.full.seconds": "{number, plural, one {# sekondë} other {# sekonda}} më parë",
"relative_time.hours": "{number}o",
"relative_time.just_now": "tani",
"relative_time.minutes": "{number}m",
"relative_time.seconds": "{number}s",
"relative_time.today": "sot",
"reply_indicator.cancel": "Anuloje",
+ "report.block": "Bllokoje",
+ "report.block_explanation": "S’do të shihni postime prej tyre. S’do të jenë në gjendje të shohin postimet tuaja, apo t’ju ndjekin. Do të jenë në gjendje të shohin se janë bllokuar.",
+ "report.categories.other": "Tjetër",
+ "report.categories.spam": "I padëshiruar",
+ "report.categories.violation": "Lënda shkel një ose disa rregulla shërbyesi",
+ "report.category.subtitle": "Zgjidhni përputhjen më të mirë",
+ "report.category.title": "Tregonani se ç’po ndodh me këtë {type}",
+ "report.category.title_account": "profil",
+ "report.category.title_status": "postim",
+ "report.close": "U bë",
+ "report.comment.title": "Ka ndonjë gjë tjetër që do të duhej ta dinim?",
"report.forward": "Përcillja {target}",
"report.forward_hint": "Llogaria është nga një shërbyes tjetër. Të dërgohet edhe një kopje e anonimizuar e raportimit?",
- "report.hint": "Raportimi do t’u dërgohet moderatorëve të shërbyesit tuaj. Më poshtë mund të jepni një shpjegim se pse po e raportoni këtë llogari:",
+ "report.mute": "Heshtoje",
+ "report.mute_explanation": "S’do të shihni postimet e tyre. Ende mund t’ju ndjekin dhe të shohin postimet tuaja dhe s’do ta dinë që janë heshtuar.",
+ "report.next": "Pasuesi",
"report.placeholder": "Komente shtesë",
+ "report.reasons.dislike": "S’më pëlqen",
+ "report.reasons.dislike_description": "S’është gjë që do të doja ta shihja",
+ "report.reasons.other": "Është tjetër gjë",
+ "report.reasons.other_description": "Problemi nuk hyn te kategoritë e tjera",
+ "report.reasons.spam": "Është mesazh i padëshiruar",
+ "report.reasons.spam_description": "Lidhje dashakeqe, angazhim i rremë, ose përgjigje të përsëritura",
+ "report.reasons.violation": "Cenon rregulla shërbyesi",
+ "report.reasons.violation_description": "Jeni i ndërgjegjshëm që cenon rregulla specifike",
+ "report.rules.subtitle": "Përzgjidhni gjithçka që ka vend",
+ "report.rules.title": "Cilat rregulla po cenohen?",
+ "report.statuses.subtitle": "Përzgjidhni gjithçka që ka vend",
+ "report.statuses.title": "A ka postime që dëshmojnë problemet e këtij raporti?",
"report.submit": "Parashtroje",
"report.target": "Raportim i {target}",
+ "report.thanks.take_action": "Ja mundësitë tuaja për të kontrolluar ç’shihni në Mastodon:",
+ "report.thanks.take_action_actionable": "Teksa e shqyrtojmë, mund të ndërmerrni veprim kundër @{name}:",
+ "report.thanks.title": "S’doni të shihni këtë?",
+ "report.thanks.title_actionable": "Faleminderit për raportimin, do ta shohim.",
+ "report.unfollow": "Mos e ndiq më @{name}",
+ "report.unfollow_explanation": "Po e ndiqni këtë llogari. Për të mos parë më postimet e tyre te prurja juaj e kreut, ndalni ndjekjen e tyre.",
"search.placeholder": "Kërkoni",
"search_popout.search_format": "Format kërkimi të mëtejshëm",
"search_popout.tips.full_text": "Kërkimi për tekst të thjeshtë përgjigjet me mesazhe që keni shkruar, parapëlqyer, përforcuar, ose ku jeni përmendur, si dhe emra përdoruesish, emra ekrani dhe hashtag-ë që kanë përputhje me termin e kërkimit.",
@@ -382,7 +434,9 @@
"search_popout.tips.text": "Kërkim për tekst të thjeshtë përgjigjet me emra, emra përdoruesish dhe hashtag-ë që kanë përputhje me termin e kërkimit",
"search_popout.tips.user": "përdorues",
"search_results.accounts": "Persona",
+ "search_results.all": "Krejt",
"search_results.hashtags": "Hashtag-ë",
+ "search_results.nothing_found": "S’u gjet gjë për këto terma kërkimi",
"search_results.statuses": "Mesazhe",
"search_results.statuses_fts_disabled": "Kërkimi i mesazheve sipas lëndës së tyre s’është i aktivizuar në këtë shërbyes Mastodon.",
"search_results.total": "{count, number} {count, plural, one {përfundim} other {përfundime}}",
@@ -396,9 +450,14 @@
"status.delete": "Fshije",
"status.detailed_status": "Pamje e hollësishme bisede",
"status.direct": "Mesazh i drejtpërdrejtë për @{name}",
+ "status.edit": "Përpunojeni",
+ "status.edited": "Përpunuar më {date}",
+ "status.edited_x_times": "Përpunuar {count, plural, one {{count} herë} other {{count} herë}}",
"status.embed": "Trupëzim",
"status.favourite": "I parapëlqyer",
"status.filtered": "I filtruar",
+ "status.history.created": "{name} u krijua më {date}",
+ "status.history.edited": "{name} u përpunua më {date}",
"status.load_more": "Ngarko më tepër",
"status.media_hidden": "Me media të fshehur",
"status.mention": "Përmendni @{name}",
@@ -462,7 +521,7 @@
"upload_form.video_description": "Përshkruajeni për persona me dëgjim të kufizuar ose probleme shikimi",
"upload_modal.analyzing_picture": "Po analizohet fotoja…",
"upload_modal.apply": "Aplikoje",
- "upload_modal.applying": "Applying…",
+ "upload_modal.applying": "Po zbatohet…",
"upload_modal.choose_image": "Zgjidhni figurë",
"upload_modal.description_placeholder": "Deshe Korçën, Korçën të dhamë",
"upload_modal.detect_text": "Pikase tekstin prej fotoje",
diff --git a/app/javascript/mastodon/locales/sr-Latn.json b/app/javascript/mastodon/locales/sr-Latn.json
index 3e29734ef..332352cc1 100644
--- a/app/javascript/mastodon/locales/sr-Latn.json
+++ b/app/javascript/mastodon/locales/sr-Latn.json
@@ -18,12 +18,12 @@
"account.followers": "Pratioca",
"account.followers.empty": "No one follows this user yet.",
"account.followers_counter": "{count, plural, one {{counter} Follower} other {{counter} Followers}}",
+ "account.following": "Following",
"account.following_counter": "{count, plural, one {{counter} Following} other {{counter} Following}}",
"account.follows.empty": "This user doesn't follow anyone yet.",
"account.follows_you": "Prati Vas",
"account.hide_reblogs": "Sakrij podrške koje daje korisnika @{name}",
"account.joined": "Joined {date}",
- "account.last_status": "Last active",
"account.link_verified_on": "Ownership of this link was checked on {date}",
"account.locked_info": "This account privacy status is set to locked. The owner manually reviews who can follow them.",
"account.media": "Mediji",
@@ -32,7 +32,6 @@
"account.mute": "Ućutkaj korisnika @{name}",
"account.mute_notifications": "Isključi obaveštenja od korisnika @{name}",
"account.muted": "Muted",
- "account.never_active": "Never",
"account.posts": "Statusa",
"account.posts_with_replies": "Toots with replies",
"account.report": "Prijavi @{name}",
@@ -42,12 +41,15 @@
"account.statuses_counter": "{count, plural, one {{counter} Toot} other {{counter} Toots}}",
"account.unblock": "Odblokiraj korisnika @{name}",
"account.unblock_domain": "Odblokiraj domen {domain}",
+ "account.unblock_short": "Unblock",
"account.unendorse": "Don't feature on profile",
"account.unfollow": "Otprati",
"account.unmute": "Ukloni ućutkavanje korisniku @{name}",
"account.unmute_notifications": "Uključi nazad obaveštenja od korisnika @{name}",
+ "account.unmute_short": "Unmute",
"account_note.placeholder": "Click to add a note",
- "admin.dashboard.retention": "Retention",
+ "admin.dashboard.daily_retention": "User retention rate by day after sign-up",
+ "admin.dashboard.monthly_retention": "User retention rate by month after sign-up",
"admin.dashboard.retention.average": "Average",
"admin.dashboard.retention.cohort": "Sign-up month",
"admin.dashboard.retention.cohort_size": "New users",
@@ -104,6 +106,7 @@
"compose_form.poll.switch_to_single": "Change poll to allow for a single choice",
"compose_form.publish": "Tutni",
"compose_form.publish_loud": "{publish}!",
+ "compose_form.save_changes": "Save changes",
"compose_form.sensitive.hide": "{count, plural, one {Mark media as sensitive} other {Mark media as sensitive}}",
"compose_form.sensitive.marked": "{count, plural, one {Media is marked as sensitive} other {Media is marked as sensitive}}",
"compose_form.sensitive.unmarked": "{count, plural, one {Media is not marked as sensitive} other {Media is not marked as sensitive}}",
@@ -165,6 +168,7 @@
"empty_column.community": "Lokalna lajna je prazna. Napišite nešto javno da lajna produva!",
"empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.",
"empty_column.domain_blocks": "There are no hidden domains yet.",
+ "empty_column.explore_statuses": "Nothing is trending right now. Check back later!",
"empty_column.favourited_statuses": "You don't have any favourite toots yet. When you favourite one, it will show up here.",
"empty_column.favourites": "No one has favourited this toot yet. When someone does, they will show up here.",
"empty_column.follow_recommendations": "Looks like no suggestions could be generated for you. You can try using search to look for people you might know or explore trending hashtags.",
@@ -183,6 +187,12 @@
"error.unexpected_crash.next_steps_addons": "Try disabling them and refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
"errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard",
"errors.unexpected_crash.report_issue": "Report issue",
+ "explore.search_results": "Search results",
+ "explore.suggested_follows": "For you",
+ "explore.title": "Explore",
+ "explore.trending_links": "News",
+ "explore.trending_statuses": "Posts",
+ "explore.trending_tags": "Hashtags",
"follow_recommendations.done": "Done",
"follow_recommendations.heading": "Follow people you'd like to see posts from! Here are some suggestions.",
"follow_recommendations.lead": "Posts from people you follow will show up in chronological order on your home feed. Don't be afraid to make mistakes, you can unfollow people just as easily any time!",
@@ -284,6 +294,7 @@
"navigation_bar.discover": "Discover",
"navigation_bar.domain_blocks": "Hidden domains",
"navigation_bar.edit_profile": "Izmeni profil",
+ "navigation_bar.explore": "Explore",
"navigation_bar.favourites": "Omiljeni",
"navigation_bar.filters": "Muted words",
"navigation_bar.follow_requests": "Zahtevi za praćenje",
@@ -298,6 +309,7 @@
"navigation_bar.preferences": "Podešavanja",
"navigation_bar.public_timeline": "Federisana lajna",
"navigation_bar.security": "Security",
+ "notification.admin.sign_up": "{name} signed up",
"notification.favourite": "{name} je stavio Vaš status kao omiljeni",
"notification.follow": "{name} Vas je zapratio",
"notification.follow_request": "{name} has requested to follow you",
@@ -306,13 +318,15 @@
"notification.poll": "A poll you have voted in has ended",
"notification.reblog": "{name} je podržao(la) Vaš status",
"notification.status": "{name} just posted",
+ "notification.update": "{name} edited a post",
"notifications.clear": "Očisti obaveštenja",
"notifications.clear_confirmation": "Da li ste sigurno da trajno želite da očistite Vaša obaveštenja?",
+ "notifications.column_settings.admin.sign_up": "New sign-ups:",
"notifications.column_settings.alert": "Obaveštenja na radnoj površini",
"notifications.column_settings.favourite": "Omiljeni:",
"notifications.column_settings.filter_bar.advanced": "Display all categories",
"notifications.column_settings.filter_bar.category": "Quick filter bar",
- "notifications.column_settings.filter_bar.show": "Show",
+ "notifications.column_settings.filter_bar.show_bar": "Show filter bar",
"notifications.column_settings.follow": "Novi pratioci:",
"notifications.column_settings.follow_request": "New follow requests:",
"notifications.column_settings.mention": "Pominjanja:",
@@ -322,7 +336,9 @@
"notifications.column_settings.show": "Prikaži u koloni",
"notifications.column_settings.sound": "Puštaj zvuk",
"notifications.column_settings.status": "New toots:",
- "notifications.column_settings.unread_markers.category": "Unread notification markers",
+ "notifications.column_settings.unread_notifications.category": "Unread notifications",
+ "notifications.column_settings.unread_notifications.highlight": "Highlight unread notifications",
+ "notifications.column_settings.update": "Edits:",
"notifications.filter.all": "All",
"notifications.filter.boosts": "Boosts",
"notifications.filter.favourites": "Favourites",
@@ -362,18 +378,54 @@
"regeneration_indicator.label": "Loading…",
"regeneration_indicator.sublabel": "Your home feed is being prepared!",
"relative_time.days": "{number}d",
+ "relative_time.full.days": "{number, plural, one {# day} other {# days}} ago",
+ "relative_time.full.hours": "{number, plural, one {# hour} other {# hours}} ago",
+ "relative_time.full.just_now": "just now",
+ "relative_time.full.minutes": "{number, plural, one {# minute} other {# minutes}} ago",
+ "relative_time.full.seconds": "{number, plural, one {# second} other {# seconds}} ago",
"relative_time.hours": "{number}h",
"relative_time.just_now": "sada",
"relative_time.minutes": "{number}m",
"relative_time.seconds": "{number}s",
"relative_time.today": "today",
"reply_indicator.cancel": "Poništi",
+ "report.block": "Block",
+ "report.block_explanation": "You will not see their posts. They will not be able to see your posts or follow you. They will be able to tell that they are blocked.",
+ "report.categories.other": "Other",
+ "report.categories.spam": "Spam",
+ "report.categories.violation": "Content violates one or more server rules",
+ "report.category.subtitle": "Choose the best match",
+ "report.category.title": "Tell us what's going on with this {type}",
+ "report.category.title_account": "profile",
+ "report.category.title_status": "post",
+ "report.close": "Done",
+ "report.comment.title": "Is there anything else you think we should know?",
"report.forward": "Forward to {target}",
"report.forward_hint": "The account is from another server. Send an anonymized copy of the report there as well?",
- "report.hint": "The report will be sent to your instance moderators. You can provide an explanation of why you are reporting this account below:",
+ "report.mute": "Mute",
+ "report.mute_explanation": "You will not see their posts. They can still follow you and see your posts and will not know that they are muted.",
+ "report.next": "Next",
"report.placeholder": "Dodatni komentari",
+ "report.reasons.dislike": "I don't like it",
+ "report.reasons.dislike_description": "It is not something you want to see",
+ "report.reasons.other": "It's something else",
+ "report.reasons.other_description": "The issue does not fit into other categories",
+ "report.reasons.spam": "It's spam",
+ "report.reasons.spam_description": "Malicious links, fake engagement, or repetitive replies",
+ "report.reasons.violation": "It violates server rules",
+ "report.reasons.violation_description": "You are aware that it breaks specific rules",
+ "report.rules.subtitle": "Select all that apply",
+ "report.rules.title": "Which rules are being violated?",
+ "report.statuses.subtitle": "Select all that apply",
+ "report.statuses.title": "Are there any posts that back up this report?",
"report.submit": "Pošalji",
"report.target": "Prijavljujem {target}",
+ "report.thanks.take_action": "Here are your options for controlling what you see on Mastodon:",
+ "report.thanks.take_action_actionable": "While we review this, you can take action against @{name}:",
+ "report.thanks.title": "Don't want to see this?",
+ "report.thanks.title_actionable": "Thanks for reporting, we'll look into this.",
+ "report.unfollow": "Unfollow @{name}",
+ "report.unfollow_explanation": "You are following this account. To not see their posts in your home feed anymore, unfollow them.",
"search.placeholder": "Pretraga",
"search_popout.search_format": "Napredni format pretrage",
"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.",
@@ -382,7 +434,9 @@
"search_popout.tips.text": "Traženjem običnog teksta ćete dobiti sva pronađena imena, sva korisnička imena i sve nađene heštegove",
"search_popout.tips.user": "korisnik",
"search_results.accounts": "People",
+ "search_results.all": "All",
"search_results.hashtags": "Hashtags",
+ "search_results.nothing_found": "Could not find anything for these search terms",
"search_results.statuses": "Toots",
"search_results.statuses_fts_disabled": "Searching toots by their content is not enabled on this Mastodon server.",
"search_results.total": "{count, number} {count, plural, one {rezultat} few {rezultata} other {rezultata}}",
@@ -396,9 +450,14 @@
"status.delete": "Obriši",
"status.detailed_status": "Detailed conversation view",
"status.direct": "Direct message @{name}",
+ "status.edit": "Edit",
+ "status.edited": "Edited {date}",
+ "status.edited_x_times": "Edited {count, plural, one {{count} time} other {{count} times}}",
"status.embed": "Ugradi na sajt",
"status.favourite": "Omiljeno",
"status.filtered": "Filtered",
+ "status.history.created": "{name} created {date}",
+ "status.history.edited": "{name} edited {date}",
"status.load_more": "Učitaj još",
"status.media_hidden": "Multimedija sakrivena",
"status.mention": "Pomeni korisnika @{name}",
diff --git a/app/javascript/mastodon/locales/sr.json b/app/javascript/mastodon/locales/sr.json
index ba822e15d..e7f1e54cc 100644
--- a/app/javascript/mastodon/locales/sr.json
+++ b/app/javascript/mastodon/locales/sr.json
@@ -18,12 +18,12 @@
"account.followers": "Пратиоци",
"account.followers.empty": "Тренутно нико не прати овог корисника.",
"account.followers_counter": "{count, plural, one {{counter} пратилац} few {{counter} пратиоца} other {{counter} пратилаца}}",
+ "account.following": "Following",
"account.following_counter": "{count, plural, one {{counter} прати} few {{counter} прати} other {{counter} прати}}",
"account.follows.empty": "Корисник тренутно не прати никога.",
"account.follows_you": "Прати Вас",
"account.hide_reblogs": "Сакриј подршке које даје корисника @{name}",
"account.joined": "Придружио/ла се {date}",
- "account.last_status": "Последњи пут активан/на",
"account.link_verified_on": "Власништво над овом везом је проверено {date}",
"account.locked_info": "Статус приватности овог налога је подешен на закључано. Власник ручно прегледа ко га може пратити.",
"account.media": "Медији",
@@ -32,7 +32,6 @@
"account.mute": "Ућуткај корисника @{name}",
"account.mute_notifications": "Искључи обавештења од корисника @{name}",
"account.muted": "Ућуткан",
- "account.never_active": "Никада",
"account.posts": "Трубе",
"account.posts_with_replies": "Трубе и одговори",
"account.report": "Пријави @{name}",
@@ -42,12 +41,15 @@
"account.statuses_counter": "{count, plural, one {{counter} објава} few {{counter} објаве} other {{counter} објава}}",
"account.unblock": "Одблокирај корисника @{name}",
"account.unblock_domain": "Одблокирај домен {domain}",
+ "account.unblock_short": "Unblock",
"account.unendorse": "Не истичи на налогу",
"account.unfollow": "Отпрати",
"account.unmute": "Уклони ућуткавање кориснику @{name}",
"account.unmute_notifications": "Укључи назад обавештења од корисника @{name}",
+ "account.unmute_short": "Unmute",
"account_note.placeholder": "Click to add a note",
- "admin.dashboard.retention": "Retention",
+ "admin.dashboard.daily_retention": "User retention rate by day after sign-up",
+ "admin.dashboard.monthly_retention": "User retention rate by month after sign-up",
"admin.dashboard.retention.average": "Average",
"admin.dashboard.retention.cohort": "Sign-up month",
"admin.dashboard.retention.cohort_size": "New users",
@@ -104,6 +106,7 @@
"compose_form.poll.switch_to_single": "Промените анкету да бисте омогућили један избор",
"compose_form.publish": "Труби",
"compose_form.publish_loud": "{publish}!",
+ "compose_form.save_changes": "Save changes",
"compose_form.sensitive.hide": "Означи мултимедију као осетљиву",
"compose_form.sensitive.marked": "Медији су означени као осетљиви",
"compose_form.sensitive.unmarked": "Медији су означени као не-осетљиви",
@@ -165,6 +168,7 @@
"empty_column.community": "Локална временска линија је празна. Напишите нешто јавно да започнете!",
"empty_column.direct": "Још увек немате директних порука. Када пошаљете или примите једну, појавиће се овде.",
"empty_column.domain_blocks": "Још увек нема сакривених домена.",
+ "empty_column.explore_statuses": "Nothing is trending right now. Check back later!",
"empty_column.favourited_statuses": "Још увек немате труба које су вам се свиделе. Када вам се једна свиди, појавиће се овде.",
"empty_column.favourites": "Још увек се никоме није свидела ова труба. Када се некоме свиди, појавиће се овде.",
"empty_column.follow_recommendations": "Looks like no suggestions could be generated for you. You can try using search to look for people you might know or explore trending hashtags.",
@@ -183,6 +187,12 @@
"error.unexpected_crash.next_steps_addons": "Покушајте да их онемогућите и освежите страницу. Ако то не помогне, можда ћете и даље моћи да користите Mastodon преко другог прегледача или матичне апликације.",
"errors.unexpected_crash.copy_stacktrace": "Копирај \"stacktrace\" у клипборд",
"errors.unexpected_crash.report_issue": "Пријави проблем",
+ "explore.search_results": "Search results",
+ "explore.suggested_follows": "For you",
+ "explore.title": "Explore",
+ "explore.trending_links": "News",
+ "explore.trending_statuses": "Posts",
+ "explore.trending_tags": "Hashtags",
"follow_recommendations.done": "Done",
"follow_recommendations.heading": "Follow people you'd like to see posts from! Here are some suggestions.",
"follow_recommendations.lead": "Posts from people you follow will show up in chronological order on your home feed. Don't be afraid to make mistakes, you can unfollow people just as easily any time!",
@@ -284,6 +294,7 @@
"navigation_bar.discover": "Откриј",
"navigation_bar.domain_blocks": "Сакривени домени",
"navigation_bar.edit_profile": "Измени налог",
+ "navigation_bar.explore": "Explore",
"navigation_bar.favourites": "Омиљене",
"navigation_bar.filters": "Пригушене речи",
"navigation_bar.follow_requests": "Захтеви за праћење",
@@ -298,6 +309,7 @@
"navigation_bar.preferences": "Подешавања",
"navigation_bar.public_timeline": "Здружена временска линија",
"navigation_bar.security": "Безбедност",
+ "notification.admin.sign_up": "{name} signed up",
"notification.favourite": "{name} је ставио/ла Ваш статус као омиљени",
"notification.follow": "{name} Вас је запратио/ла",
"notification.follow_request": "{name} је затражио да Вас запрати",
@@ -306,13 +318,15 @@
"notification.poll": "Завршена је анкета у којој сте гласали",
"notification.reblog": "{name} је подржао/ла Ваш статус",
"notification.status": "{name} управо објавио",
+ "notification.update": "{name} edited a post",
"notifications.clear": "Очисти обавештења",
"notifications.clear_confirmation": "Да ли сте сигурно да трајно желите да очистите Ваша обавештења?",
+ "notifications.column_settings.admin.sign_up": "New sign-ups:",
"notifications.column_settings.alert": "Обавештења на радној површини",
"notifications.column_settings.favourite": "Омиљени:",
"notifications.column_settings.filter_bar.advanced": "Прикажи све категорије",
"notifications.column_settings.filter_bar.category": "Трака за брзи филтер",
- "notifications.column_settings.filter_bar.show": "Прикажи",
+ "notifications.column_settings.filter_bar.show_bar": "Show filter bar",
"notifications.column_settings.follow": "Нови пратиоци:",
"notifications.column_settings.follow_request": "Нови захтеви за праћење:",
"notifications.column_settings.mention": "Помињања:",
@@ -322,7 +336,9 @@
"notifications.column_settings.show": "Прикажи у колони",
"notifications.column_settings.sound": "Пуштај звук",
"notifications.column_settings.status": "Нови тутови:",
- "notifications.column_settings.unread_markers.category": "Unread notification markers",
+ "notifications.column_settings.unread_notifications.category": "Unread notifications",
+ "notifications.column_settings.unread_notifications.highlight": "Highlight unread notifications",
+ "notifications.column_settings.update": "Edits:",
"notifications.filter.all": "Све",
"notifications.filter.boosts": "Подршки",
"notifications.filter.favourites": "Омиљене",
@@ -362,18 +378,54 @@
"regeneration_indicator.label": "Учитавање…",
"regeneration_indicator.sublabel": "Ваша почетна страница се припрема!",
"relative_time.days": "{number}д",
+ "relative_time.full.days": "{number, plural, one {# day} other {# days}} ago",
+ "relative_time.full.hours": "{number, plural, one {# hour} other {# hours}} ago",
+ "relative_time.full.just_now": "just now",
+ "relative_time.full.minutes": "{number, plural, one {# minute} other {# minutes}} ago",
+ "relative_time.full.seconds": "{number, plural, one {# second} other {# seconds}} ago",
"relative_time.hours": "{number}х",
"relative_time.just_now": "сада",
"relative_time.minutes": "{number}м",
"relative_time.seconds": "{number}с",
"relative_time.today": "данас",
"reply_indicator.cancel": "Поништи",
+ "report.block": "Block",
+ "report.block_explanation": "You will not see their posts. They will not be able to see your posts or follow you. They will be able to tell that they are blocked.",
+ "report.categories.other": "Other",
+ "report.categories.spam": "Spam",
+ "report.categories.violation": "Content violates one or more server rules",
+ "report.category.subtitle": "Choose the best match",
+ "report.category.title": "Tell us what's going on with this {type}",
+ "report.category.title_account": "profile",
+ "report.category.title_status": "post",
+ "report.close": "Done",
+ "report.comment.title": "Is there anything else you think we should know?",
"report.forward": "Проследити {target}",
"report.forward_hint": "Налог је са другог сервера. Послати анонимну копију пријаве и тамо?",
- "report.hint": "Пријава ће бити послата модераторима ваше инстанце. Можете додати објашњење зашто пријављујете овај налог у наставку:",
+ "report.mute": "Mute",
+ "report.mute_explanation": "You will not see their posts. They can still follow you and see your posts and will not know that they are muted.",
+ "report.next": "Next",
"report.placeholder": "Додатни коментари",
+ "report.reasons.dislike": "I don't like it",
+ "report.reasons.dislike_description": "It is not something you want to see",
+ "report.reasons.other": "It's something else",
+ "report.reasons.other_description": "The issue does not fit into other categories",
+ "report.reasons.spam": "It's spam",
+ "report.reasons.spam_description": "Malicious links, fake engagement, or repetitive replies",
+ "report.reasons.violation": "It violates server rules",
+ "report.reasons.violation_description": "You are aware that it breaks specific rules",
+ "report.rules.subtitle": "Select all that apply",
+ "report.rules.title": "Which rules are being violated?",
+ "report.statuses.subtitle": "Select all that apply",
+ "report.statuses.title": "Are there any posts that back up this report?",
"report.submit": "Пошаљи",
"report.target": "Пријављујем {target}",
+ "report.thanks.take_action": "Here are your options for controlling what you see on Mastodon:",
+ "report.thanks.take_action_actionable": "While we review this, you can take action against @{name}:",
+ "report.thanks.title": "Don't want to see this?",
+ "report.thanks.title_actionable": "Thanks for reporting, we'll look into this.",
+ "report.unfollow": "Unfollow @{name}",
+ "report.unfollow_explanation": "You are following this account. To not see their posts in your home feed anymore, unfollow them.",
"search.placeholder": "Претрага",
"search_popout.search_format": "Напредни формат претраге",
"search_popout.tips.full_text": "Једноставан текст враћа статусе које сте написали, фаворизовали, подржали или били поменути, као и подударање корисничких имена, приказаних имена, и тараба.",
@@ -382,7 +434,9 @@
"search_popout.tips.text": "Тражењем обичног текста ћете добити сва пронађена имена, сва корисничка имена и све нађене хештегове",
"search_popout.tips.user": "корисник",
"search_results.accounts": "Људи",
+ "search_results.all": "All",
"search_results.hashtags": "Тарабе",
+ "search_results.nothing_found": "Could not find anything for these search terms",
"search_results.statuses": "Трубе",
"search_results.statuses_fts_disabled": "Searching toots by their content is not enabled on this Mastodon server.",
"search_results.total": "{count, number} {count, plural, one {резултат} few {резултата} other {резултата}}",
@@ -396,9 +450,14 @@
"status.delete": "Обриши",
"status.detailed_status": "Детаљни преглед разговора",
"status.direct": "Директна порука @{name}",
+ "status.edit": "Edit",
+ "status.edited": "Edited {date}",
+ "status.edited_x_times": "Edited {count, plural, one {{count} time} other {{count} times}}",
"status.embed": "Угради на сајт",
"status.favourite": "Омиљено",
"status.filtered": "Филтрирано",
+ "status.history.created": "{name} created {date}",
+ "status.history.edited": "{name} edited {date}",
"status.load_more": "Учитај још",
"status.media_hidden": "Мултимедија сакривена",
"status.mention": "Помени корисника @{name}",
diff --git a/app/javascript/mastodon/locales/sv.json b/app/javascript/mastodon/locales/sv.json
index efcdd187c..65e547183 100644
--- a/app/javascript/mastodon/locales/sv.json
+++ b/app/javascript/mastodon/locales/sv.json
@@ -18,12 +18,12 @@
"account.followers": "Följare",
"account.followers.empty": "Ingen följer denna användare än.",
"account.followers_counter": "{count, plural, one {{counter} Följare} other {{counter} Följare}}",
+ "account.following": "Följer",
"account.following_counter": "{count, plural, one {{counter} Följer} other {{counter} Följer}}",
"account.follows.empty": "Denna användare följer inte någon än.",
"account.follows_you": "Följer dig",
"account.hide_reblogs": "Dölj knuffar från @{name}",
"account.joined": "Gick med {date}",
- "account.last_status": "Senast aktiv",
"account.link_verified_on": "Ägarskap för detta konto kontrollerades den {date}",
"account.locked_info": "Detta konto har låst integritetsstatus. Ägaren väljer manuellt vem som kan följa.",
"account.media": "Media",
@@ -32,7 +32,6 @@
"account.mute": "Tysta @{name}",
"account.mute_notifications": "Stäng av notifieringar från @{name}",
"account.muted": "Tystad",
- "account.never_active": "Aldrig",
"account.posts": "Tutningar",
"account.posts_with_replies": "Tutningar och svar",
"account.report": "Rapportera @{name}",
@@ -42,21 +41,24 @@
"account.statuses_counter": "{count, plural,one {{counter} Tuta} other {{counter} Tutor}}",
"account.unblock": "Avblockera @{name}",
"account.unblock_domain": "Sluta dölja {domain}",
+ "account.unblock_short": "Avblockera",
"account.unendorse": "Visa inte på profil",
"account.unfollow": "Sluta följ",
"account.unmute": "Sluta tysta @{name}",
"account.unmute_notifications": "Återaktivera aviseringar från @{name}",
+ "account.unmute_short": "Unmute",
"account_note.placeholder": "Klicka för att lägga till anteckning",
- "admin.dashboard.retention": "Retention",
- "admin.dashboard.retention.average": "Average",
- "admin.dashboard.retention.cohort": "Sign-up month",
- "admin.dashboard.retention.cohort_size": "New users",
+ "admin.dashboard.daily_retention": "Användarlojalitet per dag efter registrering",
+ "admin.dashboard.monthly_retention": "Användarlojalitet per månad efter registrering",
+ "admin.dashboard.retention.average": "Genomsnittlig",
+ "admin.dashboard.retention.cohort": "Registreringsmånad",
+ "admin.dashboard.retention.cohort_size": "Nya användare",
"alert.rate_limited.message": "Vänligen försök igen efter {retry_time, time, medium}.",
"alert.rate_limited.title": "Mängd begränsad",
"alert.unexpected.message": "Ett oväntat fel uppstod.",
"alert.unexpected.title": "Hoppsan!",
"announcement.announcement": "Meddelande",
- "attachments_list.unprocessed": "(unprocessed)",
+ "attachments_list.unprocessed": "(obearbetad)",
"autosuggest_hashtag.per_week": "{count} per vecka",
"boost_modal.combo": "Du kan trycka {combo} för att slippa detta nästa gång",
"bundle_column_error.body": "Något gick fel medan denna komponent laddades.",
@@ -104,6 +106,7 @@
"compose_form.poll.switch_to_single": "Ändra enkät för att tillåta ett enda val",
"compose_form.publish": "Tut",
"compose_form.publish_loud": "{publish}!",
+ "compose_form.save_changes": "Spara ändringar",
"compose_form.sensitive.hide": "Markera media som känsligt",
"compose_form.sensitive.marked": "Media har markerats som känsligt",
"compose_form.sensitive.unmarked": "Media är inte markerat som känsligt",
@@ -118,8 +121,8 @@
"confirmations.delete.message": "Är du säker på att du vill radera denna status?",
"confirmations.delete_list.confirm": "Radera",
"confirmations.delete_list.message": "Är du säker på att du vill radera denna lista permanent?",
- "confirmations.discard_edit_media.confirm": "Discard",
- "confirmations.discard_edit_media.message": "You have unsaved changes to the media description or preview, discard them anyway?",
+ "confirmations.discard_edit_media.confirm": "Kasta",
+ "confirmations.discard_edit_media.message": "Du har o-sparade ändringar till mediabeskrivningen eller förhandsgranskningen, kasta bort dem ändå?",
"confirmations.domain_block.confirm": "Dölj hela domänen",
"confirmations.domain_block.message": "Är du verkligen, verkligen säker på att du vill blockera hela {domain}? I de flesta fall är några riktade blockeringar eller nedtystade konton tillräckligt och att föredra. Du kommer inte se innehåll från den domänen i den allmänna tidslinjen eller i dina aviseringar. Dina följare från den domänen komer att tas bort.",
"confirmations.logout.confirm": "Logga ut",
@@ -165,9 +168,10 @@
"empty_column.community": "Den lokala tidslinjen är tom. Skriv något offentligt för att sätta bollen i rullning!",
"empty_column.direct": "Du har inga direktmeddelanden än. När du skickar eller tar emot ett kommer det att visas här.",
"empty_column.domain_blocks": "Det finns ännu inga dolda domäner.",
+ "empty_column.explore_statuses": "Ingenting är trendigt just nu. Kom tillbaka senare!",
"empty_column.favourited_statuses": "Du har inga favoritmarkerade toots än. När du favoritmarkerar en kommer den visas här.",
"empty_column.favourites": "Ingen har favoritmarkerat den här tooten än. När någon gör det kommer den visas här.",
- "empty_column.follow_recommendations": "Looks like no suggestions could be generated for you. You can try using search to look for people you might know or explore trending hashtags.",
+ "empty_column.follow_recommendations": "Det ser ut som om inga förslag kan genereras till dig. Du kan prova att använda sök för att leta efter personer som du kanske känner eller utforska trendande hash-taggar.",
"empty_column.follow_requests": "Du har inga följarförfrågningar än. När du får en kommer den visas här.",
"empty_column.hashtag": "Det finns inget i denna hashtag ännu.",
"empty_column.home": "Din hemma-tidslinje är tom! Besök {public} eller använd sökning för att komma igång och träffa andra användare.",
@@ -183,9 +187,15 @@
"error.unexpected_crash.next_steps_addons": "Prova att avaktivera dem och uppdatera sidan. Om detta inte hjälper kan du försöka använda Mastodon med en annan webbläsare eller en app.",
"errors.unexpected_crash.copy_stacktrace": "Kopiera stacktrace till urklipp",
"errors.unexpected_crash.report_issue": "Rapportera problem",
+ "explore.search_results": "Sökresultat",
+ "explore.suggested_follows": "För dig",
+ "explore.title": "Utforska",
+ "explore.trending_links": "Nyheter",
+ "explore.trending_statuses": "Inlägg",
+ "explore.trending_tags": "Hashtaggar",
"follow_recommendations.done": "Klar",
- "follow_recommendations.heading": "Follow people you'd like to see posts from! Here are some suggestions.",
- "follow_recommendations.lead": "Posts from people you follow will show up in chronological order on your home feed. Don't be afraid to make mistakes, you can unfollow people just as easily any time!",
+ "follow_recommendations.heading": "Följ personer som du skulle vilja se inlägg från! Här finns det några förslag.",
+ "follow_recommendations.lead": "Inlägg från personer du följer kommer att dyka upp i kronologisk ordning i ditt hem-flöde. Var inte rädd för att göra misstag, du kan sluta följa människor lika enkelt när som helst!",
"follow_request.authorize": "Godkänn",
"follow_request.reject": "Avvisa",
"follow_requests.unlocked_explanation": "Även om ditt konto inte är låst tror {domain} personalen att du kanske vill granska dessa följares förfrågningar manuellt.",
@@ -250,8 +260,8 @@
"keyboard_shortcuts.unfocus": "för att avfokusera skrivfält/sökfält",
"keyboard_shortcuts.up": "för att flytta uppåt i listan",
"lightbox.close": "Stäng",
- "lightbox.compress": "Compress image view box",
- "lightbox.expand": "Expand image view box",
+ "lightbox.compress": "Komprimera bildvyrutan",
+ "lightbox.expand": "Utöka bildvyrutan",
"lightbox.next": "Nästa",
"lightbox.previous": "Tidigare",
"lists.account.add": "Lägg till i lista",
@@ -261,7 +271,7 @@
"lists.edit.submit": "Ändra titel",
"lists.new.create": "Lägg till lista",
"lists.new.title_placeholder": "Ny listrubrik",
- "lists.replies_policy.followed": "Any followed user",
+ "lists.replies_policy.followed": "Alla användare som följs",
"lists.replies_policy.list": "Medlemmar i listan",
"lists.replies_policy.none": "Ingen",
"lists.replies_policy.title": "Visa svar till:",
@@ -284,6 +294,7 @@
"navigation_bar.discover": "Upptäck",
"navigation_bar.domain_blocks": "Dolda domäner",
"navigation_bar.edit_profile": "Redigera profil",
+ "navigation_bar.explore": "Utforska",
"navigation_bar.favourites": "Favoriter",
"navigation_bar.filters": "Tystade ord",
"navigation_bar.follow_requests": "Följförfrågningar",
@@ -298,6 +309,7 @@
"navigation_bar.preferences": "Inställningar",
"navigation_bar.public_timeline": "Förenad tidslinje",
"navigation_bar.security": "Säkerhet",
+ "notification.admin.sign_up": "{name} registrerade sig",
"notification.favourite": "{name} favoriserade din status",
"notification.follow": "{name} följer dig",
"notification.follow_request": "{name} har begärt att följa dig",
@@ -306,13 +318,15 @@
"notification.poll": "En omröstning du röstat i har avslutats",
"notification.reblog": "{name} knuffade din status",
"notification.status": "{name} skrev just",
+ "notification.update": "{name} redigerade ett inlägg",
"notifications.clear": "Rensa aviseringar",
"notifications.clear_confirmation": "Är du säker på att du vill rensa alla dina aviseringar permanent?",
+ "notifications.column_settings.admin.sign_up": "Nya registreringar:",
"notifications.column_settings.alert": "Skrivbordsaviseringar",
"notifications.column_settings.favourite": "Favoriter:",
"notifications.column_settings.filter_bar.advanced": "Visa alla kategorier",
"notifications.column_settings.filter_bar.category": "Snabbfilter",
- "notifications.column_settings.filter_bar.show": "Visa",
+ "notifications.column_settings.filter_bar.show_bar": "Visa filterfält",
"notifications.column_settings.follow": "Nya följare:",
"notifications.column_settings.follow_request": "Ny följ-förfrågan:",
"notifications.column_settings.mention": "Omnämningar:",
@@ -322,7 +336,9 @@
"notifications.column_settings.show": "Visa i kolumnen",
"notifications.column_settings.sound": "Spela upp ljud",
"notifications.column_settings.status": "Nya tutor:",
- "notifications.column_settings.unread_markers.category": "Unread notification markers",
+ "notifications.column_settings.unread_notifications.category": "O-lästa aviseringar",
+ "notifications.column_settings.unread_notifications.highlight": "Markera o-lästa aviseringar",
+ "notifications.column_settings.update": "Redigeringar:",
"notifications.filter.all": "Alla",
"notifications.filter.boosts": "Knuffar",
"notifications.filter.favourites": "Favoriter",
@@ -333,9 +349,9 @@
"notifications.grant_permission": "Godkänn åtkomst.",
"notifications.group": "{count} aviseringar",
"notifications.mark_as_read": "Markera varje avisering som läst",
- "notifications.permission_denied": "Desktop notifications are unavailable due to previously denied browser permissions request",
- "notifications.permission_denied_alert": "Desktop notifications can't be enabled, as browser permission has been denied before",
- "notifications.permission_required": "Desktop notifications are unavailable because the required permission has not been granted.",
+ "notifications.permission_denied": "Skrivbordsaviseringar är otillgängliga på grund av tidigare nekade förfrågningar om behörighet i webbläsaren",
+ "notifications.permission_denied_alert": "Skrivbordsaviseringar kan inte aktiveras, eftersom att webbläsarens behörighet har nekats innan",
+ "notifications.permission_required": "Skrivbordsaviseringar är otillgängliga eftersom att rättigheten som krävs inte har godkänts.",
"notifications_permission_banner.enable": "Aktivera skrivbordsaviseringar",
"notifications_permission_banner.how_to_control": "För att ta emot aviseringar när Mastodon inte är öppet, aktivera skrivbordsaviseringar. När de är aktiverade kan du styra exakt vilka typer av interaktioner som aviseras via {icon} -knappen ovan.",
"notifications_permission_banner.title": "Missa aldrig något",
@@ -346,7 +362,7 @@
"poll.total_votes": "{count, plural, one {1 röst} other {# röster}}",
"poll.vote": "Rösta",
"poll.voted": "Du röstade för detta svar",
- "poll.votes": "{votes, plural, one {# vote} other {# votes}}",
+ "poll.votes": "{votes, plural, one {# röst} other {# röster}}",
"poll_button.add_poll": "Lägg till en omröstning",
"poll_button.remove_poll": "Ta bort omröstning",
"privacy.change": "Justera sekretess",
@@ -362,18 +378,54 @@
"regeneration_indicator.label": "Laddar…",
"regeneration_indicator.sublabel": "Ditt hemmaflöde förbereds!",
"relative_time.days": "{number}d",
+ "relative_time.full.days": "{number, plural, one {# dag} other {# dagar}} sedan",
+ "relative_time.full.hours": "{number, plural, one {# timme} other {# timmar}} sedan",
+ "relative_time.full.just_now": "just nu",
+ "relative_time.full.minutes": "{number, plural, one {# minut} other {# minuter}} sedan",
+ "relative_time.full.seconds": "{number, plural, one {# sekund} other {# sekunder}} sedan",
"relative_time.hours": "{number}tim",
"relative_time.just_now": "nu",
"relative_time.minutes": "{number}min",
"relative_time.seconds": "{number}sek",
"relative_time.today": "idag",
"reply_indicator.cancel": "Ångra",
+ "report.block": "Blockera",
+ "report.block_explanation": "You will not see their posts. They will not be able to see your posts or follow you. They will be able to tell that they are blocked.",
+ "report.categories.other": "Övrigt",
+ "report.categories.spam": "Skräppost",
+ "report.categories.violation": "Innehåll bryter mot en eller flera serverregler",
+ "report.category.subtitle": "Välj den bästa träffen",
+ "report.category.title": "Berätta för oss vad som händer med den här {type}",
+ "report.category.title_account": "profil",
+ "report.category.title_status": "inlägg",
+ "report.close": "Färdig",
+ "report.comment.title": "Is there anything else you think we should know?",
"report.forward": "Vidarebefordra till {target}",
"report.forward_hint": "Kontot är från en annan server. Skicka även en anonymiserad kopia av anmälan dit?",
- "report.hint": "Anmälan skickas till din instans moderatorer. Du kan ge en förklaring till varför du har anmält detta konto nedan:",
+ "report.mute": "Tysta",
+ "report.mute_explanation": "You will not see their posts. They can still follow you and see your posts and will not know that they are muted.",
+ "report.next": "Nästa",
"report.placeholder": "Ytterligare kommentarer",
+ "report.reasons.dislike": "Jag tycker inte om det",
+ "report.reasons.dislike_description": "Det är inget som du vill se",
+ "report.reasons.other": "Det är något annat",
+ "report.reasons.other_description": "The issue does not fit into other categories",
+ "report.reasons.spam": "Det är skräppost",
+ "report.reasons.spam_description": "Skadliga länkar, bedrägligt beteende eller repetitiva svar",
+ "report.reasons.violation": "Det bryter mot serverns regler",
+ "report.reasons.violation_description": "Du är medveten om att det bryter mot specifika regler",
+ "report.rules.subtitle": "Select all that apply",
+ "report.rules.title": "Which rules are being violated?",
+ "report.statuses.subtitle": "Select all that apply",
+ "report.statuses.title": "Are there any posts that back up this report?",
"report.submit": "Skicka",
"report.target": "Rapporterar {target}",
+ "report.thanks.take_action": "Here are your options for controlling what you see on Mastodon:",
+ "report.thanks.take_action_actionable": "While we review this, you can take action against @{name}:",
+ "report.thanks.title": "Vill du inte se det här?",
+ "report.thanks.title_actionable": "Thanks for reporting, we'll look into this.",
+ "report.unfollow": "Sluta följ @{username}",
+ "report.unfollow_explanation": "You are following this account. To not see their posts in your home feed anymore, unfollow them.",
"search.placeholder": "Sök",
"search_popout.search_format": "Avancerat sökformat",
"search_popout.tips.full_text": "Enkel text returnerar statusar där du har skrivit, favoriserat, knuffat eller nämnts samt med matchande användarnamn, visningsnamn och hashtags.",
@@ -382,7 +434,9 @@
"search_popout.tips.text": "Enkel text returnerar matchande visningsnamn, användarnamn och hashtags",
"search_popout.tips.user": "användare",
"search_results.accounts": "Människor",
+ "search_results.all": "Alla",
"search_results.hashtags": "Hashtaggar",
+ "search_results.nothing_found": "Could not find anything for these search terms",
"search_results.statuses": "Tutor",
"search_results.statuses_fts_disabled": "Att söka toots med deras innehåll är inte möjligt på denna Mastodon-server.",
"search_results.total": "{count, number} {count, plural, ett {result} andra {results}}",
@@ -396,9 +450,14 @@
"status.delete": "Radera",
"status.detailed_status": "Detaljerad samtalsvy",
"status.direct": "Direktmeddela @{name}",
+ "status.edit": "Redigera",
+ "status.edited": "Edited {date}",
+ "status.edited_x_times": "Redigerad {count, plural, one {{count} gång} other {{count} gånger}}",
"status.embed": "Bädda in",
"status.favourite": "Favorit",
"status.filtered": "Filtrerat",
+ "status.history.created": "{name} created {date}",
+ "status.history.edited": "{name} edited {date}",
"status.load_more": "Ladda fler",
"status.media_hidden": "Media dold",
"status.mention": "Omnämn @{name}",
@@ -462,7 +521,7 @@
"upload_form.video_description": "Beskriv för personer med hörsel- eller synnedsättning",
"upload_modal.analyzing_picture": "Analyserar bild…",
"upload_modal.apply": "Verkställ",
- "upload_modal.applying": "Applying…",
+ "upload_modal.applying": "Verkställer…",
"upload_modal.choose_image": "Välj bild",
"upload_modal.description_placeholder": "En snabb brun räv hoppar över den lata hunden",
"upload_modal.detect_text": "Upptäck bildens text",
diff --git a/app/javascript/mastodon/locales/szl.json b/app/javascript/mastodon/locales/szl.json
index eca4765c4..088b5ff36 100644
--- a/app/javascript/mastodon/locales/szl.json
+++ b/app/javascript/mastodon/locales/szl.json
@@ -18,12 +18,12 @@
"account.followers": "Followers",
"account.followers.empty": "No one follows this user yet.",
"account.followers_counter": "{count, plural, one {{counter} Follower} other {{counter} Followers}}",
+ "account.following": "Following",
"account.following_counter": "{count, plural, one {{counter} Following} other {{counter} Following}}",
"account.follows.empty": "This user doesn't follow anyone yet.",
"account.follows_you": "Follows you",
"account.hide_reblogs": "Hide boosts from @{name}",
"account.joined": "Joined {date}",
- "account.last_status": "Last active",
"account.link_verified_on": "Ownership of this link was checked on {date}",
"account.locked_info": "This account privacy status is set to locked. The owner manually reviews who can follow them.",
"account.media": "Media",
@@ -32,7 +32,6 @@
"account.mute": "Mute @{name}",
"account.mute_notifications": "Mute notifications from @{name}",
"account.muted": "Muted",
- "account.never_active": "Never",
"account.posts": "Toots",
"account.posts_with_replies": "Toots and replies",
"account.report": "Report @{name}",
@@ -42,12 +41,15 @@
"account.statuses_counter": "{count, plural, one {{counter} Toot} other {{counter} Toots}}",
"account.unblock": "Unblock @{name}",
"account.unblock_domain": "Unblock domain {domain}",
+ "account.unblock_short": "Unblock",
"account.unendorse": "Don't feature on profile",
"account.unfollow": "Unfollow",
"account.unmute": "Unmute @{name}",
"account.unmute_notifications": "Unmute notifications from @{name}",
+ "account.unmute_short": "Unmute",
"account_note.placeholder": "Click to add a note",
- "admin.dashboard.retention": "Retention",
+ "admin.dashboard.daily_retention": "User retention rate by day after sign-up",
+ "admin.dashboard.monthly_retention": "User retention rate by month after sign-up",
"admin.dashboard.retention.average": "Average",
"admin.dashboard.retention.cohort": "Sign-up month",
"admin.dashboard.retention.cohort_size": "New users",
@@ -104,6 +106,7 @@
"compose_form.poll.switch_to_single": "Change poll to allow for a single choice",
"compose_form.publish": "Toot",
"compose_form.publish_loud": "{publish}!",
+ "compose_form.save_changes": "Save changes",
"compose_form.sensitive.hide": "{count, plural, one {Mark media as sensitive} other {Mark media as sensitive}}",
"compose_form.sensitive.marked": "{count, plural, one {Media is marked as sensitive} other {Media is marked as sensitive}}",
"compose_form.sensitive.unmarked": "{count, plural, one {Media is not marked as sensitive} other {Media is not marked as sensitive}}",
@@ -165,6 +168,7 @@
"empty_column.community": "The local timeline is empty. Write something publicly to get the ball rolling!",
"empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.",
"empty_column.domain_blocks": "There are no blocked domains yet.",
+ "empty_column.explore_statuses": "Nothing is trending right now. Check back later!",
"empty_column.favourited_statuses": "You don't have any favourite toots yet. When you favourite one, it will show up here.",
"empty_column.favourites": "No one has favourited this toot yet. When someone does, they will show up here.",
"empty_column.follow_recommendations": "Looks like no suggestions could be generated for you. You can try using search to look for people you might know or explore trending hashtags.",
@@ -183,6 +187,12 @@
"error.unexpected_crash.next_steps_addons": "Try disabling them and refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
"errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard",
"errors.unexpected_crash.report_issue": "Report issue",
+ "explore.search_results": "Search results",
+ "explore.suggested_follows": "For you",
+ "explore.title": "Explore",
+ "explore.trending_links": "News",
+ "explore.trending_statuses": "Posts",
+ "explore.trending_tags": "Hashtags",
"follow_recommendations.done": "Done",
"follow_recommendations.heading": "Follow people you'd like to see posts from! Here are some suggestions.",
"follow_recommendations.lead": "Posts from people you follow will show up in chronological order on your home feed. Don't be afraid to make mistakes, you can unfollow people just as easily any time!",
@@ -284,6 +294,7 @@
"navigation_bar.discover": "Discover",
"navigation_bar.domain_blocks": "Hidden domains",
"navigation_bar.edit_profile": "Edit profile",
+ "navigation_bar.explore": "Explore",
"navigation_bar.favourites": "Favourites",
"navigation_bar.filters": "Muted words",
"navigation_bar.follow_requests": "Follow requests",
@@ -298,6 +309,7 @@
"navigation_bar.preferences": "Preferences",
"navigation_bar.public_timeline": "Federated timeline",
"navigation_bar.security": "Security",
+ "notification.admin.sign_up": "{name} signed up",
"notification.favourite": "{name} favourited your status",
"notification.follow": "{name} followed you",
"notification.follow_request": "{name} has requested to follow you",
@@ -306,13 +318,15 @@
"notification.poll": "A poll you have voted in has ended",
"notification.reblog": "{name} boosted your status",
"notification.status": "{name} just posted",
+ "notification.update": "{name} edited a post",
"notifications.clear": "Clear notifications",
"notifications.clear_confirmation": "Are you sure you want to permanently clear all your notifications?",
+ "notifications.column_settings.admin.sign_up": "New sign-ups:",
"notifications.column_settings.alert": "Desktop notifications",
"notifications.column_settings.favourite": "Favourites:",
"notifications.column_settings.filter_bar.advanced": "Display all categories",
"notifications.column_settings.filter_bar.category": "Quick filter bar",
- "notifications.column_settings.filter_bar.show": "Show",
+ "notifications.column_settings.filter_bar.show_bar": "Show filter bar",
"notifications.column_settings.follow": "New followers:",
"notifications.column_settings.follow_request": "New follow requests:",
"notifications.column_settings.mention": "Mentions:",
@@ -322,7 +336,9 @@
"notifications.column_settings.show": "Show in column",
"notifications.column_settings.sound": "Play sound",
"notifications.column_settings.status": "New toots:",
- "notifications.column_settings.unread_markers.category": "Unread notification markers",
+ "notifications.column_settings.unread_notifications.category": "Unread notifications",
+ "notifications.column_settings.unread_notifications.highlight": "Highlight unread notifications",
+ "notifications.column_settings.update": "Edits:",
"notifications.filter.all": "All",
"notifications.filter.boosts": "Boosts",
"notifications.filter.favourites": "Favourites",
@@ -362,18 +378,54 @@
"regeneration_indicator.label": "Loading…",
"regeneration_indicator.sublabel": "Your home feed is being prepared!",
"relative_time.days": "{number}d",
+ "relative_time.full.days": "{number, plural, one {# day} other {# days}} ago",
+ "relative_time.full.hours": "{number, plural, one {# hour} other {# hours}} ago",
+ "relative_time.full.just_now": "just now",
+ "relative_time.full.minutes": "{number, plural, one {# minute} other {# minutes}} ago",
+ "relative_time.full.seconds": "{number, plural, one {# second} other {# seconds}} ago",
"relative_time.hours": "{number}h",
"relative_time.just_now": "now",
"relative_time.minutes": "{number}m",
"relative_time.seconds": "{number}s",
"relative_time.today": "today",
"reply_indicator.cancel": "Cancel",
+ "report.block": "Block",
+ "report.block_explanation": "You will not see their posts. They will not be able to see your posts or follow you. They will be able to tell that they are blocked.",
+ "report.categories.other": "Other",
+ "report.categories.spam": "Spam",
+ "report.categories.violation": "Content violates one or more server rules",
+ "report.category.subtitle": "Choose the best match",
+ "report.category.title": "Tell us what's going on with this {type}",
+ "report.category.title_account": "profile",
+ "report.category.title_status": "post",
+ "report.close": "Done",
+ "report.comment.title": "Is there anything else you think we should know?",
"report.forward": "Forward to {target}",
"report.forward_hint": "The account is from another server. Send an anonymized copy of the report there as well?",
- "report.hint": "The report will be sent to your server moderators. You can provide an explanation of why you are reporting this account below:",
- "report.placeholder": "Additional comments",
- "report.submit": "Submit",
+ "report.mute": "Mute",
+ "report.mute_explanation": "You will not see their posts. They can still follow you and see your posts and will not know that they are muted.",
+ "report.next": "Next",
+ "report.placeholder": "Type or paste additional comments",
+ "report.reasons.dislike": "I don't like it",
+ "report.reasons.dislike_description": "It is not something you want to see",
+ "report.reasons.other": "It's something else",
+ "report.reasons.other_description": "The issue does not fit into other categories",
+ "report.reasons.spam": "It's spam",
+ "report.reasons.spam_description": "Malicious links, fake engagement, or repetitive replies",
+ "report.reasons.violation": "It violates server rules",
+ "report.reasons.violation_description": "You are aware that it breaks specific rules",
+ "report.rules.subtitle": "Select all that apply",
+ "report.rules.title": "Which rules are being violated?",
+ "report.statuses.subtitle": "Select all that apply",
+ "report.statuses.title": "Are there any posts that back up this report?",
+ "report.submit": "Submit report",
"report.target": "Report {target}",
+ "report.thanks.take_action": "Here are your options for controlling what you see on Mastodon:",
+ "report.thanks.take_action_actionable": "While we review this, you can take action against @{name}:",
+ "report.thanks.title": "Don't want to see this?",
+ "report.thanks.title_actionable": "Thanks for reporting, we'll look into this.",
+ "report.unfollow": "Unfollow @{name}",
+ "report.unfollow_explanation": "You are following this account. To not see their posts in your home feed anymore, unfollow them.",
"search.placeholder": "Search",
"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.",
@@ -382,7 +434,9 @@
"search_popout.tips.text": "Simple text returns matching display names, usernames and hashtags",
"search_popout.tips.user": "user",
"search_results.accounts": "People",
+ "search_results.all": "All",
"search_results.hashtags": "Hashtags",
+ "search_results.nothing_found": "Could not find anything for these search terms",
"search_results.statuses": "Toots",
"search_results.statuses_fts_disabled": "Searching toots by their content is not enabled on this Mastodon server.",
"search_results.total": "{count, number} {count, plural, one {result} other {results}}",
@@ -396,9 +450,14 @@
"status.delete": "Delete",
"status.detailed_status": "Detailed conversation view",
"status.direct": "Direct message @{name}",
+ "status.edit": "Edit",
+ "status.edited": "Edited {date}",
+ "status.edited_x_times": "Edited {count, plural, one {{count} time} other {{count} times}}",
"status.embed": "Embed",
"status.favourite": "Favourite",
"status.filtered": "Filtered",
+ "status.history.created": "{name} created {date}",
+ "status.history.edited": "{name} edited {date}",
"status.load_more": "Load more",
"status.media_hidden": "Media hidden",
"status.mention": "Mention @{name}",
diff --git a/app/javascript/mastodon/locales/ta.json b/app/javascript/mastodon/locales/ta.json
index 1b3e70fb6..3c4bcb234 100644
--- a/app/javascript/mastodon/locales/ta.json
+++ b/app/javascript/mastodon/locales/ta.json
@@ -18,12 +18,12 @@
"account.followers": "பின்தொடர்பவர்கள்",
"account.followers.empty": "இதுவரை யாரும் இந்த பயனரைப் பின்தொடரவில்லை.",
"account.followers_counter": "{count, plural, one {{counter} வாசகர்} other {{counter} வாசகர்கள்}}",
+ "account.following": "Following",
"account.following_counter": "{count, plural,one {{counter} சந்தா} other {{counter} சந்தாக்கள்}}",
"account.follows.empty": "இந்த பயனர் இதுவரை யாரையும் பின்தொடரவில்லை.",
"account.follows_you": "உங்களைப் பின்தொடர்கிறார்",
"account.hide_reblogs": "இருந்து ஊக்கியாக மறை @{name}",
"account.joined": "Joined {date}",
- "account.last_status": "கடைசி செயல்பாடு",
"account.link_verified_on": "இந்த இணைப்பை உரிமையாளர் சரிபார்க்கப்பட்டது {date}",
"account.locked_info": "இந்தக் கணக்கு தனியுரிமை நிலை பூட்டப்பட்டுள்ளது. அவர்களைப் பின்தொடர்பவர் யார் என்பதை உரிமையாளர் கைமுறையாக மதிப்பாய்வு செய்கிறார்.",
"account.media": "ஊடகங்கள்",
@@ -32,7 +32,6 @@
"account.mute": "ஊமையான @{name}",
"account.mute_notifications": "அறிவிப்புகளை முடக்கு @{name}",
"account.muted": "முடக்கியது",
- "account.never_active": "எப்போதுமில்லை",
"account.posts": "டூட்டுகள்",
"account.posts_with_replies": "Toots மற்றும் பதில்கள்",
"account.report": "@{name} -ஐப் புகாரளி",
@@ -42,12 +41,15 @@
"account.statuses_counter": "{count, plural, one {{counter} டூட்} other {{counter} டூட்டுகள்}}",
"account.unblock": "@{name} மீது தடை நீக்குக",
"account.unblock_domain": "{domain} ஐ காண்பி",
+ "account.unblock_short": "Unblock",
"account.unendorse": "சுயவிவரத்தில் இடம்பெற வேண்டாம்",
"account.unfollow": "பின்தொடர்வதை நிறுத்துக",
"account.unmute": "@{name} இன் மீது மௌனத் தடையை நீக்குக",
"account.unmute_notifications": "@{name} இலிருந்து அறிவிப்புகளின் மீது மௌனத் தடையை நீக்குக",
+ "account.unmute_short": "Unmute",
"account_note.placeholder": "குறிப்பு ஒன்றை சேர்க்க சொடுக்கவும்",
- "admin.dashboard.retention": "Retention",
+ "admin.dashboard.daily_retention": "User retention rate by day after sign-up",
+ "admin.dashboard.monthly_retention": "User retention rate by month after sign-up",
"admin.dashboard.retention.average": "Average",
"admin.dashboard.retention.cohort": "Sign-up month",
"admin.dashboard.retention.cohort_size": "New users",
@@ -104,6 +106,7 @@
"compose_form.poll.switch_to_single": "ஒரே ஒரு தேர்வை மட்டும் அனுமதிக்குமாறு மாற்று",
"compose_form.publish": "டூட்",
"compose_form.publish_loud": "{publish}!",
+ "compose_form.save_changes": "Save changes",
"compose_form.sensitive.hide": "அனைவருக்கும் ஏற்றப் படம் இல்லை எனக் குறியிடு",
"compose_form.sensitive.marked": "இப்படம் அனைவருக்கும் ஏற்றதல்ல எனக் குறியிடப்பட்டுள்ளது",
"compose_form.sensitive.unmarked": "இப்படம் அனைவருக்கும் ஏற்றதல்ல எனக் குறியிடப்படவில்லை",
@@ -165,6 +168,7 @@
"empty_column.community": "உங்கள் மாஸ்டடான் முச்சந்தியில் யாரும் இல்லை. எதையேனும் எழுதி ஆட்டத்தைத் துவக்குங்கள்!",
"empty_column.direct": "உங்கள் தனிப்பெட்டியில் செய்திகள் ஏதும் இல்லை. செய்தியை நீங்கள் அனுப்பும்போதோ அல்லது பெறும்போதோ, அது இங்கே காண்பிக்கப்படும்.",
"empty_column.domain_blocks": "தடுக்கப்பட்டக் களங்கள் இதுவரை இல்லை.",
+ "empty_column.explore_statuses": "Nothing is trending right now. Check back later!",
"empty_column.favourited_statuses": "உங்களுக்குப் பிடித்த டூட்டுகள் இதுவரை இல்லை. ஒரு டூட்டில் நீங்கள் விருப்பக்குறி இட்டால், அது இங்கே காண்பிக்கப்படும்.",
"empty_column.favourites": "இந்த டூட்டில் இதுவரை யாரும் விருப்பக்குறி இடவில்லை. யாரேனும் விரும்பினால், அது இங்கே காண்பிக்கப்படும்.",
"empty_column.follow_recommendations": "Looks like no suggestions could be generated for you. You can try using search to look for people you might know or explore trending hashtags.",
@@ -183,6 +187,12 @@
"error.unexpected_crash.next_steps_addons": "Try disabling them and refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
"errors.unexpected_crash.copy_stacktrace": "Stacktrace-ஐ clipboard-ல் நகலெடு",
"errors.unexpected_crash.report_issue": "புகாரளி",
+ "explore.search_results": "Search results",
+ "explore.suggested_follows": "For you",
+ "explore.title": "Explore",
+ "explore.trending_links": "News",
+ "explore.trending_statuses": "Posts",
+ "explore.trending_tags": "Hashtags",
"follow_recommendations.done": "Done",
"follow_recommendations.heading": "Follow people you'd like to see posts from! Here are some suggestions.",
"follow_recommendations.lead": "Posts from people you follow will show up in chronological order on your home feed. Don't be afraid to make mistakes, you can unfollow people just as easily any time!",
@@ -284,6 +294,7 @@
"navigation_bar.discover": "கண்டு பிடி",
"navigation_bar.domain_blocks": "மறைந்த களங்கள்",
"navigation_bar.edit_profile": "சுயவிவரத்தைத் திருத்தவும்",
+ "navigation_bar.explore": "Explore",
"navigation_bar.favourites": "விருப்பத்துக்குகந்த",
"navigation_bar.filters": "முடக்கப்பட்ட வார்த்தைகள்",
"navigation_bar.follow_requests": "கோரிக்கைகளை பின்பற்றவும்",
@@ -298,6 +309,7 @@
"navigation_bar.preferences": "விருப்பங்கள்",
"navigation_bar.public_timeline": "கூட்டாட்சி காலக்கெடு",
"navigation_bar.security": "பத்திரம்",
+ "notification.admin.sign_up": "{name} signed up",
"notification.favourite": "{name} ஆர்வம் கொண்டவர், உங்கள் நிலை",
"notification.follow": "{name} உங்களைப் பின்தொடர்கிறார்",
"notification.follow_request": "{name} உங்களைப் பின்தொடரக் கோருகிறார்",
@@ -306,13 +318,15 @@
"notification.poll": "நீங்கள் வாக்களித்த வாக்கெடுப்பு முடிவடைந்தது",
"notification.reblog": "{name} உங்கள் நிலை அதிகரித்தது",
"notification.status": "{name} just posted",
+ "notification.update": "{name} edited a post",
"notifications.clear": "அறிவிப்புகளை அழிக்கவும்",
"notifications.clear_confirmation": "உங்கள் எல்லா அறிவிப்புகளையும் நிரந்தரமாக அழிக்க விரும்புகிறீர்களா?",
+ "notifications.column_settings.admin.sign_up": "New sign-ups:",
"notifications.column_settings.alert": "டெஸ்க்டாப் அறிவிப்புகள்",
"notifications.column_settings.favourite": "பிடித்தவை:",
"notifications.column_settings.filter_bar.advanced": "எல்லா வகைகளையும் காட்டு",
"notifications.column_settings.filter_bar.category": "விரைவு வடிகட்டி பட்டை",
- "notifications.column_settings.filter_bar.show": "காட்டு",
+ "notifications.column_settings.filter_bar.show_bar": "Show filter bar",
"notifications.column_settings.follow": "புதிய பின்பற்றுபவர்கள்:",
"notifications.column_settings.follow_request": "புதிய பின்தொடர் கோரிக்கைகள்:",
"notifications.column_settings.mention": "குறிப்பிடுகிறது:",
@@ -322,7 +336,9 @@
"notifications.column_settings.show": "பத்தியில் காண்பி",
"notifications.column_settings.sound": "ஒலி விளையாட",
"notifications.column_settings.status": "New toots:",
- "notifications.column_settings.unread_markers.category": "Unread notification markers",
+ "notifications.column_settings.unread_notifications.category": "Unread notifications",
+ "notifications.column_settings.unread_notifications.highlight": "Highlight unread notifications",
+ "notifications.column_settings.update": "Edits:",
"notifications.filter.all": "எல்லா",
"notifications.filter.boosts": "மதிப்பை உயர்த்து",
"notifications.filter.favourites": "விருப்பத்துக்குகந்த",
@@ -362,18 +378,54 @@
"regeneration_indicator.label": "சுமையேற்றம்…",
"regeneration_indicator.sublabel": "உங்கள் வீட்டு ஊட்டம் தயார் செய்யப்படுகிறது!",
"relative_time.days": "{number}நா",
+ "relative_time.full.days": "{number, plural, one {# day} other {# days}} ago",
+ "relative_time.full.hours": "{number, plural, one {# hour} other {# hours}} ago",
+ "relative_time.full.just_now": "just now",
+ "relative_time.full.minutes": "{number, plural, one {# minute} other {# minutes}} ago",
+ "relative_time.full.seconds": "{number, plural, one {# second} other {# seconds}} ago",
"relative_time.hours": "{number}ம",
"relative_time.just_now": "இப்பொழுது",
"relative_time.minutes": "{number}நி",
"relative_time.seconds": "{number}வி",
"relative_time.today": "இன்று",
"reply_indicator.cancel": "எதிராணை",
+ "report.block": "Block",
+ "report.block_explanation": "You will not see their posts. They will not be able to see your posts or follow you. They will be able to tell that they are blocked.",
+ "report.categories.other": "Other",
+ "report.categories.spam": "Spam",
+ "report.categories.violation": "Content violates one or more server rules",
+ "report.category.subtitle": "Choose the best match",
+ "report.category.title": "Tell us what's going on with this {type}",
+ "report.category.title_account": "profile",
+ "report.category.title_status": "post",
+ "report.close": "Done",
+ "report.comment.title": "Is there anything else you think we should know?",
"report.forward": "முன்னோக்கி {target}",
"report.forward_hint": "கணக்கு மற்றொரு சேவையகத்திலிருந்து வருகிறது. அறிக்கையின் அநாமதேய பிரதி ஒன்றை அனுப்பவும்.?",
- "report.hint": "அறிக்கை உங்கள் மாதிரியாக மாற்றியமைக்கப்படும். கீழே உள்ள கணக்கை நீங்கள் ஏன் புகாரளிக்கிறீர்கள் என்பதற்கான விளக்கத்தை வழங்கலாம்:",
+ "report.mute": "Mute",
+ "report.mute_explanation": "You will not see their posts. They can still follow you and see your posts and will not know that they are muted.",
+ "report.next": "Next",
"report.placeholder": "கூடுதல் கருத்துரைகள்",
+ "report.reasons.dislike": "I don't like it",
+ "report.reasons.dislike_description": "It is not something you want to see",
+ "report.reasons.other": "It's something else",
+ "report.reasons.other_description": "The issue does not fit into other categories",
+ "report.reasons.spam": "It's spam",
+ "report.reasons.spam_description": "Malicious links, fake engagement, or repetitive replies",
+ "report.reasons.violation": "It violates server rules",
+ "report.reasons.violation_description": "You are aware that it breaks specific rules",
+ "report.rules.subtitle": "Select all that apply",
+ "report.rules.title": "Which rules are being violated?",
+ "report.statuses.subtitle": "Select all that apply",
+ "report.statuses.title": "Are there any posts that back up this report?",
"report.submit": "சமர்ப்பி",
"report.target": "Report {target}",
+ "report.thanks.take_action": "Here are your options for controlling what you see on Mastodon:",
+ "report.thanks.take_action_actionable": "While we review this, you can take action against @{name}:",
+ "report.thanks.title": "Don't want to see this?",
+ "report.thanks.title_actionable": "Thanks for reporting, we'll look into this.",
+ "report.unfollow": "Unfollow @{name}",
+ "report.unfollow_explanation": "You are following this account. To not see their posts in your home feed anymore, unfollow them.",
"search.placeholder": "தேடு",
"search_popout.search_format": "மேம்பட்ட தேடல் வடிவம்",
"search_popout.tips.full_text": "எளிமையான உரை நீங்கள் எழுதப்பட்ட, புகழ், அதிகரித்தது, அல்லது குறிப்பிட்டுள்ள, அதே போல் பயனர் பெயர்கள், காட்சி பெயர்கள், மற்றும் ஹேஸ்டேகைகளை கொண்டுள்ளது என்று நிலைகளை கொடுக்கிறது.",
@@ -382,7 +434,9 @@
"search_popout.tips.text": "எளிய உரை காட்சி பெயர்கள், பயனர்பெயர்கள் மற்றும் ஹாஷ்டேட்களுடன் பொருந்துகிறது",
"search_popout.tips.user": "பயனர்",
"search_results.accounts": "மக்கள்",
+ "search_results.all": "All",
"search_results.hashtags": "ஹாஷ்டேக்குகளைச்",
+ "search_results.nothing_found": "Could not find anything for these search terms",
"search_results.statuses": "டூட்டுகள்",
"search_results.statuses_fts_disabled": "டூட்டுகளின் வார்த்தைகளைக்கொண்டு தேடுவது இந்த மச்டோடன் வழங்கியில் இயல்விக்கப்படவில்லை.",
"search_results.total": "{count, number} {count, plural, one {result} மற்ற {results}}",
@@ -396,9 +450,14 @@
"status.delete": "நீக்கு",
"status.detailed_status": "விரிவான உரையாடல் காட்சி",
"status.direct": "நேரடி செய்தி @{name}",
+ "status.edit": "Edit",
+ "status.edited": "Edited {date}",
+ "status.edited_x_times": "Edited {count, plural, one {{count} time} other {{count} times}}",
"status.embed": "கிடத்து",
"status.favourite": "விருப்பத்துக்குகந்த",
"status.filtered": "வடிகட்டு",
+ "status.history.created": "{name} created {date}",
+ "status.history.edited": "{name} edited {date}",
"status.load_more": "அதிகமாய் ஏற்று",
"status.media_hidden": "மீடியா மறைக்கப்பட்டது",
"status.mention": "குறிப்பிடு @{name}",
diff --git a/app/javascript/mastodon/locales/tai.json b/app/javascript/mastodon/locales/tai.json
index 2302e7ccc..2f8936a9c 100644
--- a/app/javascript/mastodon/locales/tai.json
+++ b/app/javascript/mastodon/locales/tai.json
@@ -18,12 +18,12 @@
"account.followers": "Followers",
"account.followers.empty": "No one follows this user yet.",
"account.followers_counter": "{count, plural, one {{counter} Follower} other {{counter} Followers}}",
+ "account.following": "Following",
"account.following_counter": "{count, plural, one {{counter} Following} other {{counter} Following}}",
"account.follows.empty": "This user doesn't follow anyone yet.",
"account.follows_you": "Follows you",
"account.hide_reblogs": "Hide boosts from @{name}",
"account.joined": "Joined {date}",
- "account.last_status": "Last active",
"account.link_verified_on": "Ownership of this link was checked on {date}",
"account.locked_info": "This account privacy status is set to locked. The owner manually reviews who can follow them.",
"account.media": "Mûi-thé",
@@ -32,7 +32,6 @@
"account.mute": "Mute @{name}",
"account.mute_notifications": "Mute notifications from @{name}",
"account.muted": "Muted",
- "account.never_active": "Never",
"account.posts": "Toots",
"account.posts_with_replies": "Toots and replies",
"account.report": "Report @{name}",
@@ -42,12 +41,15 @@
"account.statuses_counter": "{count, plural, one {{counter} Toot} other {{counter} Toots}}",
"account.unblock": "Unblock @{name}",
"account.unblock_domain": "Unblock domain {domain}",
+ "account.unblock_short": "Unblock",
"account.unendorse": "Don't feature on profile",
"account.unfollow": "Unfollow",
"account.unmute": "Unmute @{name}",
"account.unmute_notifications": "Unmute notifications from @{name}",
+ "account.unmute_short": "Unmute",
"account_note.placeholder": "Click to add a note",
- "admin.dashboard.retention": "Retention",
+ "admin.dashboard.daily_retention": "User retention rate by day after sign-up",
+ "admin.dashboard.monthly_retention": "User retention rate by month after sign-up",
"admin.dashboard.retention.average": "Average",
"admin.dashboard.retention.cohort": "Sign-up month",
"admin.dashboard.retention.cohort_size": "New users",
@@ -104,6 +106,7 @@
"compose_form.poll.switch_to_single": "Change poll to allow for a single choice",
"compose_form.publish": "Toot",
"compose_form.publish_loud": "{publish}!",
+ "compose_form.save_changes": "Save changes",
"compose_form.sensitive.hide": "{count, plural, one {Mark media as sensitive} other {Mark media as sensitive}}",
"compose_form.sensitive.marked": "{count, plural, one {Media is marked as sensitive} other {Media is marked as sensitive}}",
"compose_form.sensitive.unmarked": "{count, plural, one {Media is not marked as sensitive} other {Media is not marked as sensitive}}",
@@ -165,6 +168,7 @@
"empty_column.community": "The local timeline is empty. Write something publicly to get the ball rolling!",
"empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.",
"empty_column.domain_blocks": "There are no blocked domains yet.",
+ "empty_column.explore_statuses": "Nothing is trending right now. Check back later!",
"empty_column.favourited_statuses": "You don't have any favourite toots yet. When you favourite one, it will show up here.",
"empty_column.favourites": "No one has favourited this toot yet. When someone does, they will show up here.",
"empty_column.follow_recommendations": "Looks like no suggestions could be generated for you. You can try using search to look for people you might know or explore trending hashtags.",
@@ -183,6 +187,12 @@
"error.unexpected_crash.next_steps_addons": "Try disabling them and refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
"errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard",
"errors.unexpected_crash.report_issue": "Report issue",
+ "explore.search_results": "Search results",
+ "explore.suggested_follows": "For you",
+ "explore.title": "Explore",
+ "explore.trending_links": "News",
+ "explore.trending_statuses": "Posts",
+ "explore.trending_tags": "Hashtags",
"follow_recommendations.done": "Done",
"follow_recommendations.heading": "Follow people you'd like to see posts from! Here are some suggestions.",
"follow_recommendations.lead": "Posts from people you follow will show up in chronological order on your home feed. Don't be afraid to make mistakes, you can unfollow people just as easily any time!",
@@ -284,6 +294,7 @@
"navigation_bar.discover": "Discover",
"navigation_bar.domain_blocks": "Hidden domains",
"navigation_bar.edit_profile": "Edit profile",
+ "navigation_bar.explore": "Explore",
"navigation_bar.favourites": "Favourites",
"navigation_bar.filters": "Muted words",
"navigation_bar.follow_requests": "Follow requests",
@@ -298,6 +309,7 @@
"navigation_bar.preferences": "Preferences",
"navigation_bar.public_timeline": "Federated timeline",
"navigation_bar.security": "Security",
+ "notification.admin.sign_up": "{name} signed up",
"notification.favourite": "{name} favourited your status",
"notification.follow": "{name} followed you",
"notification.follow_request": "{name} has requested to follow you",
@@ -306,13 +318,15 @@
"notification.poll": "A poll you have voted in has ended",
"notification.reblog": "{name} boosted your status",
"notification.status": "{name} just posted",
+ "notification.update": "{name} edited a post",
"notifications.clear": "Clear notifications",
"notifications.clear_confirmation": "Are you sure you want to permanently clear all your notifications?",
+ "notifications.column_settings.admin.sign_up": "New sign-ups:",
"notifications.column_settings.alert": "Desktop notifications",
"notifications.column_settings.favourite": "Favourites:",
"notifications.column_settings.filter_bar.advanced": "Display all categories",
"notifications.column_settings.filter_bar.category": "Quick filter bar",
- "notifications.column_settings.filter_bar.show": "Show",
+ "notifications.column_settings.filter_bar.show_bar": "Show filter bar",
"notifications.column_settings.follow": "New followers:",
"notifications.column_settings.follow_request": "New follow requests:",
"notifications.column_settings.mention": "Mentions:",
@@ -322,7 +336,9 @@
"notifications.column_settings.show": "Show in column",
"notifications.column_settings.sound": "Play sound",
"notifications.column_settings.status": "New toots:",
- "notifications.column_settings.unread_markers.category": "Unread notification markers",
+ "notifications.column_settings.unread_notifications.category": "Unread notifications",
+ "notifications.column_settings.unread_notifications.highlight": "Highlight unread notifications",
+ "notifications.column_settings.update": "Edits:",
"notifications.filter.all": "All",
"notifications.filter.boosts": "Boosts",
"notifications.filter.favourites": "Favourites",
@@ -362,18 +378,54 @@
"regeneration_indicator.label": "Loading…",
"regeneration_indicator.sublabel": "Your home feed is being prepared!",
"relative_time.days": "{number}d",
+ "relative_time.full.days": "{number, plural, one {# day} other {# days}} ago",
+ "relative_time.full.hours": "{number, plural, one {# hour} other {# hours}} ago",
+ "relative_time.full.just_now": "just now",
+ "relative_time.full.minutes": "{number, plural, one {# minute} other {# minutes}} ago",
+ "relative_time.full.seconds": "{number, plural, one {# second} other {# seconds}} ago",
"relative_time.hours": "{number}h",
"relative_time.just_now": "now",
"relative_time.minutes": "{number}m",
"relative_time.seconds": "{number}s",
"relative_time.today": "today",
"reply_indicator.cancel": "Cancel",
+ "report.block": "Block",
+ "report.block_explanation": "You will not see their posts. They will not be able to see your posts or follow you. They will be able to tell that they are blocked.",
+ "report.categories.other": "Other",
+ "report.categories.spam": "Spam",
+ "report.categories.violation": "Content violates one or more server rules",
+ "report.category.subtitle": "Choose the best match",
+ "report.category.title": "Tell us what's going on with this {type}",
+ "report.category.title_account": "profile",
+ "report.category.title_status": "post",
+ "report.close": "Done",
+ "report.comment.title": "Is there anything else you think we should know?",
"report.forward": "Forward to {target}",
"report.forward_hint": "The account is from another server. Send an anonymized copy of the report there as well?",
- "report.hint": "The report will be sent to your server moderators. You can provide an explanation of why you are reporting this account below:",
- "report.placeholder": "Additional comments",
- "report.submit": "Submit",
+ "report.mute": "Mute",
+ "report.mute_explanation": "You will not see their posts. They can still follow you and see your posts and will not know that they are muted.",
+ "report.next": "Next",
+ "report.placeholder": "Type or paste additional comments",
+ "report.reasons.dislike": "I don't like it",
+ "report.reasons.dislike_description": "It is not something you want to see",
+ "report.reasons.other": "It's something else",
+ "report.reasons.other_description": "The issue does not fit into other categories",
+ "report.reasons.spam": "It's spam",
+ "report.reasons.spam_description": "Malicious links, fake engagement, or repetitive replies",
+ "report.reasons.violation": "It violates server rules",
+ "report.reasons.violation_description": "You are aware that it breaks specific rules",
+ "report.rules.subtitle": "Select all that apply",
+ "report.rules.title": "Which rules are being violated?",
+ "report.statuses.subtitle": "Select all that apply",
+ "report.statuses.title": "Are there any posts that back up this report?",
+ "report.submit": "Submit report",
"report.target": "Report {target}",
+ "report.thanks.take_action": "Here are your options for controlling what you see on Mastodon:",
+ "report.thanks.take_action_actionable": "While we review this, you can take action against @{name}:",
+ "report.thanks.title": "Don't want to see this?",
+ "report.thanks.title_actionable": "Thanks for reporting, we'll look into this.",
+ "report.unfollow": "Unfollow @{name}",
+ "report.unfollow_explanation": "You are following this account. To not see their posts in your home feed anymore, unfollow them.",
"search.placeholder": "Search",
"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.",
@@ -382,7 +434,9 @@
"search_popout.tips.text": "Simple text returns matching display names, usernames and hashtags",
"search_popout.tips.user": "user",
"search_results.accounts": "People",
+ "search_results.all": "All",
"search_results.hashtags": "Hashtags",
+ "search_results.nothing_found": "Could not find anything for these search terms",
"search_results.statuses": "Toots",
"search_results.statuses_fts_disabled": "Searching toots by their content is not enabled on this Mastodon server.",
"search_results.total": "{count, number} {count, plural, one {result} other {results}}",
@@ -396,9 +450,14 @@
"status.delete": "Delete",
"status.detailed_status": "Detailed conversation view",
"status.direct": "Direct message @{name}",
+ "status.edit": "Edit",
+ "status.edited": "Edited {date}",
+ "status.edited_x_times": "Edited {count, plural, one {{count} time} other {{count} times}}",
"status.embed": "Embed",
"status.favourite": "Favourite",
"status.filtered": "Filtered",
+ "status.history.created": "{name} created {date}",
+ "status.history.edited": "{name} edited {date}",
"status.load_more": "Load more",
"status.media_hidden": "Media hidden",
"status.mention": "Mention @{name}",
diff --git a/app/javascript/mastodon/locales/te.json b/app/javascript/mastodon/locales/te.json
index 348d753dc..05af59c6a 100644
--- a/app/javascript/mastodon/locales/te.json
+++ b/app/javascript/mastodon/locales/te.json
@@ -18,12 +18,12 @@
"account.followers": "అనుచరులు",
"account.followers.empty": "ఈ వినియోగదారుడిని ఇంకా ఎవరూ అనుసరించడంలేదు.",
"account.followers_counter": "{count, plural, one {{counter} Follower} other {{counter} Followers}}",
+ "account.following": "Following",
"account.following_counter": "{count, plural, one {{counter} Following} other {{counter} Following}}",
"account.follows.empty": "ఈ వినియోగదారి ఇంకా ఎవరినీ అనుసరించడంలేదు.",
"account.follows_you": "మిమ్మల్ని అనుసరిస్తున్నారు",
"account.hide_reblogs": "@{name} నుంచి బూస్ట్ లను దాచిపెట్టు",
"account.joined": "Joined {date}",
- "account.last_status": "Last active",
"account.link_verified_on": "ఈ లంకె యొక్క యాజమాన్యం {date}న పరీక్షించబడింది",
"account.locked_info": "ఈ ఖాతా యొక్క గోప్యత స్థితి లాక్ చేయబడి వుంది. ఈ ఖాతాను ఎవరు అనుసరించవచ్చో యజమానే నిర్ణయం తీసుకుంటారు.",
"account.media": "మీడియా",
@@ -32,7 +32,6 @@
"account.mute": "@{name}ను మ్యూట్ చెయ్యి",
"account.mute_notifications": "@{name}నుంచి ప్రకటనలను మ్యూట్ చెయ్యి",
"account.muted": "మ్యూట్ అయినవి",
- "account.never_active": "Never",
"account.posts": "టూట్లు",
"account.posts_with_replies": "టూట్లు మరియు ప్రత్యుత్తరములు",
"account.report": "@{name}పై ఫిర్యాదుచేయు",
@@ -42,12 +41,15 @@
"account.statuses_counter": "{count, plural, one {{counter} Toot} other {{counter} Toots}}",
"account.unblock": "@{name}పై బ్లాక్ ను తొలగించు",
"account.unblock_domain": "{domain}ను దాచవద్దు",
+ "account.unblock_short": "Unblock",
"account.unendorse": "ప్రొఫైల్లో చూపించవద్దు",
"account.unfollow": "అనుసరించవద్దు",
"account.unmute": "@{name}పై మ్యూట్ ని తొలగించు",
"account.unmute_notifications": "@{name} నుంచి ప్రకటనలపై మ్యూట్ ని తొలగించు",
+ "account.unmute_short": "Unmute",
"account_note.placeholder": "Click to add a note",
- "admin.dashboard.retention": "Retention",
+ "admin.dashboard.daily_retention": "User retention rate by day after sign-up",
+ "admin.dashboard.monthly_retention": "User retention rate by month after sign-up",
"admin.dashboard.retention.average": "Average",
"admin.dashboard.retention.cohort": "Sign-up month",
"admin.dashboard.retention.cohort_size": "New users",
@@ -104,6 +106,7 @@
"compose_form.poll.switch_to_single": "Change poll to allow for a single choice",
"compose_form.publish": "టూట్",
"compose_form.publish_loud": "{publish}!",
+ "compose_form.save_changes": "Save changes",
"compose_form.sensitive.hide": "{count, plural, one {Mark media as sensitive} other {Mark media as sensitive}}",
"compose_form.sensitive.marked": "మీడియా సున్నితమైనదిగా గుర్తించబడింది",
"compose_form.sensitive.unmarked": "మీడియా సున్నితమైనదిగా గుర్తించబడలేదు",
@@ -165,6 +168,7 @@
"empty_column.community": "స్థానిక కాలక్రమం ఖాళీగా ఉంది. మొదలుపెట్టడానికి బహిరంగంగా ఏదో ఒకటి వ్రాయండి!",
"empty_column.direct": "మీకు ఇంకా ఏ ప్రత్యక్ష సందేశాలు లేవు. మీరు ఒకదాన్ని పంపినప్పుడు లేదా స్వీకరించినప్పుడు, అది ఇక్కడ చూపబడుతుంది.",
"empty_column.domain_blocks": "దాచబడిన డొమైన్లు ఇంకా ఏమీ లేవు.",
+ "empty_column.explore_statuses": "Nothing is trending right now. Check back later!",
"empty_column.favourited_statuses": "మీకు ఇష్టపడిన టూట్లు ఇంకా ఎమీ లేవు. మీరు ఒకదానిని ఇష్టపడినప్పుడు, అది ఇక్కడ కనిపిస్తుంది.",
"empty_column.favourites": "ఈ టూట్ను ఇంకా ఎవరూ ఇష్టపడలేదు. ఎవరైనా అలా చేసినప్పుడు, అవి ఇక్కడ కనబడతాయి.",
"empty_column.follow_recommendations": "Looks like no suggestions could be generated for you. You can try using search to look for people you might know or explore trending hashtags.",
@@ -183,6 +187,12 @@
"error.unexpected_crash.next_steps_addons": "Try disabling them and refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
"errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard",
"errors.unexpected_crash.report_issue": "Report issue",
+ "explore.search_results": "Search results",
+ "explore.suggested_follows": "For you",
+ "explore.title": "Explore",
+ "explore.trending_links": "News",
+ "explore.trending_statuses": "Posts",
+ "explore.trending_tags": "Hashtags",
"follow_recommendations.done": "Done",
"follow_recommendations.heading": "Follow people you'd like to see posts from! Here are some suggestions.",
"follow_recommendations.lead": "Posts from people you follow will show up in chronological order on your home feed. Don't be afraid to make mistakes, you can unfollow people just as easily any time!",
@@ -284,6 +294,7 @@
"navigation_bar.discover": "కనుగొను",
"navigation_bar.domain_blocks": "దాచిన డొమైన్లు",
"navigation_bar.edit_profile": "ప్రొఫైల్ని సవరించండి",
+ "navigation_bar.explore": "Explore",
"navigation_bar.favourites": "ఇష్టపడినవి",
"navigation_bar.filters": "మ్యూట్ చేయబడిన పదాలు",
"navigation_bar.follow_requests": "అనుసరించడానికి అభ్యర్ధనలు",
@@ -298,6 +309,7 @@
"navigation_bar.preferences": "ప్రాధాన్యతలు",
"navigation_bar.public_timeline": "సమాఖ్య కాలక్రమం",
"navigation_bar.security": "భద్రత",
+ "notification.admin.sign_up": "{name} signed up",
"notification.favourite": "{name} మీ స్టేటస్ ను ఇష్టపడ్డారు",
"notification.follow": "{name} మిమ్మల్ని అనుసరిస్తున్నారు",
"notification.follow_request": "{name} has requested to follow you",
@@ -306,13 +318,15 @@
"notification.poll": "మీరు పాల్గొనిన ఎన్సిక ముగిసినది",
"notification.reblog": "{name} మీ స్టేటస్ ను బూస్ట్ చేసారు",
"notification.status": "{name} just posted",
+ "notification.update": "{name} edited a post",
"notifications.clear": "ప్రకటనలను తుడిచివేయు",
"notifications.clear_confirmation": "మీరు మీ అన్ని నోటిఫికేషన్లను శాశ్వతంగా తొలగించాలనుకుంటున్నారా?",
+ "notifications.column_settings.admin.sign_up": "New sign-ups:",
"notifications.column_settings.alert": "డెస్క్టాప్ నోటిఫికేషన్లు",
"notifications.column_settings.favourite": "ఇష్టపడినవి:",
"notifications.column_settings.filter_bar.advanced": "అన్ని విభాగాలను చూపించు",
"notifications.column_settings.filter_bar.category": "క్విక్ ఫిల్టర్ బార్",
- "notifications.column_settings.filter_bar.show": "చూపించు",
+ "notifications.column_settings.filter_bar.show_bar": "Show filter bar",
"notifications.column_settings.follow": "క్రొత్త అనుచరులు:",
"notifications.column_settings.follow_request": "New follow requests:",
"notifications.column_settings.mention": "ప్రస్తావనలు:",
@@ -322,7 +336,9 @@
"notifications.column_settings.show": "నిలువు వరుసలో చూపు",
"notifications.column_settings.sound": "ధ్వనిని ప్లే చేయి",
"notifications.column_settings.status": "New toots:",
- "notifications.column_settings.unread_markers.category": "Unread notification markers",
+ "notifications.column_settings.unread_notifications.category": "Unread notifications",
+ "notifications.column_settings.unread_notifications.highlight": "Highlight unread notifications",
+ "notifications.column_settings.update": "Edits:",
"notifications.filter.all": "అన్నీ",
"notifications.filter.boosts": "బూస్ట్లు",
"notifications.filter.favourites": "ఇష్టాలు",
@@ -362,18 +378,54 @@
"regeneration_indicator.label": "లోడ్ అవుతోంది…",
"regeneration_indicator.sublabel": "మీ హోమ్ ఫీడ్ సిద్ధమవుతోంది!",
"relative_time.days": "{number}d",
+ "relative_time.full.days": "{number, plural, one {# day} other {# days}} ago",
+ "relative_time.full.hours": "{number, plural, one {# hour} other {# hours}} ago",
+ "relative_time.full.just_now": "just now",
+ "relative_time.full.minutes": "{number, plural, one {# minute} other {# minutes}} ago",
+ "relative_time.full.seconds": "{number, plural, one {# second} other {# seconds}} ago",
"relative_time.hours": "{number}h",
"relative_time.just_now": "ఇప్పుడు",
"relative_time.minutes": "{number}m",
"relative_time.seconds": "{number}s",
"relative_time.today": "today",
"reply_indicator.cancel": "రద్దు చెయ్యి",
+ "report.block": "Block",
+ "report.block_explanation": "You will not see their posts. They will not be able to see your posts or follow you. They will be able to tell that they are blocked.",
+ "report.categories.other": "Other",
+ "report.categories.spam": "Spam",
+ "report.categories.violation": "Content violates one or more server rules",
+ "report.category.subtitle": "Choose the best match",
+ "report.category.title": "Tell us what's going on with this {type}",
+ "report.category.title_account": "profile",
+ "report.category.title_status": "post",
+ "report.close": "Done",
+ "report.comment.title": "Is there anything else you think we should know?",
"report.forward": "{target}కి ఫార్వార్డ్ చేయండి",
"report.forward_hint": "ఖాతా మరొక సర్వర్లో ఉంది. నివేదిక యొక్క ఒక అనామకంగా ఉన్న కాపీని అక్కడికి కూడా పంపించమంటారా?",
- "report.hint": "మీ సేవిక మోడరేటర్లకు నివేదిక పంపబడుతుంది. ఈ ఖాతాను ఎందుకు నివేదిస్తున్నారనేదాని వివరణను మీరు దిగువన అందించవచ్చు:",
+ "report.mute": "Mute",
+ "report.mute_explanation": "You will not see their posts. They can still follow you and see your posts and will not know that they are muted.",
+ "report.next": "Next",
"report.placeholder": "అదనపు వ్యాఖ్యలు",
+ "report.reasons.dislike": "I don't like it",
+ "report.reasons.dislike_description": "It is not something you want to see",
+ "report.reasons.other": "It's something else",
+ "report.reasons.other_description": "The issue does not fit into other categories",
+ "report.reasons.spam": "It's spam",
+ "report.reasons.spam_description": "Malicious links, fake engagement, or repetitive replies",
+ "report.reasons.violation": "It violates server rules",
+ "report.reasons.violation_description": "You are aware that it breaks specific rules",
+ "report.rules.subtitle": "Select all that apply",
+ "report.rules.title": "Which rules are being violated?",
+ "report.statuses.subtitle": "Select all that apply",
+ "report.statuses.title": "Are there any posts that back up this report?",
"report.submit": "సమర్పించండి",
"report.target": "{target}పై ఫిర్యాదు చేయండి",
+ "report.thanks.take_action": "Here are your options for controlling what you see on Mastodon:",
+ "report.thanks.take_action_actionable": "While we review this, you can take action against @{name}:",
+ "report.thanks.title": "Don't want to see this?",
+ "report.thanks.title_actionable": "Thanks for reporting, we'll look into this.",
+ "report.unfollow": "Unfollow @{name}",
+ "report.unfollow_explanation": "You are following this account. To not see their posts in your home feed anymore, unfollow them.",
"search.placeholder": "శోధన",
"search_popout.search_format": "అధునాతన శోధన ఆకృతి",
"search_popout.tips.full_text": "సాధారణ వచనం మీరు వ్రాసిన, ఇష్టపడే, పెంచబడిన లేదా పేర్కొనబడిన, అలాగే యూజర్పేర్లు, ప్రదర్శన పేర్లు, మరియు హ్యాష్ట్యాగ్లను నమోదు చేసిన హోదాలను అందిస్తుంది.",
@@ -382,7 +434,9 @@
"search_popout.tips.text": "సింపుల్ టెక్స్ట్ ప్రదర్శన పేర్లు, యూజర్ పేర్లు మరియు హ్యాష్ట్యాగ్లను సరిపోలుస్తుంది",
"search_popout.tips.user": "వాడుకరి",
"search_results.accounts": "వ్యక్తులు",
+ "search_results.all": "All",
"search_results.hashtags": "హాష్ ట్యాగ్లు",
+ "search_results.nothing_found": "Could not find anything for these search terms",
"search_results.statuses": "టూట్లు",
"search_results.statuses_fts_disabled": "Searching toots by their content is not enabled on this Mastodon server.",
"search_results.total": "{count, number} {count, plural, one {result} other {results}}",
@@ -396,9 +450,14 @@
"status.delete": "తొలగించు",
"status.detailed_status": "వివరణాత్మక సంభాషణ వీక్షణ",
"status.direct": "@{name}కు నేరుగా సందేశం పంపు",
+ "status.edit": "Edit",
+ "status.edited": "Edited {date}",
+ "status.edited_x_times": "Edited {count, plural, one {{count} time} other {{count} times}}",
"status.embed": "ఎంబెడ్",
"status.favourite": "ఇష్టపడు",
"status.filtered": "వడకట్టబడిన",
+ "status.history.created": "{name} created {date}",
+ "status.history.edited": "{name} edited {date}",
"status.load_more": "మరిన్ని లోడ్ చేయి",
"status.media_hidden": "మీడియా దాచబడింది",
"status.mention": "@{name}ను ప్రస్తావించు",
diff --git a/app/javascript/mastodon/locales/th.json b/app/javascript/mastodon/locales/th.json
index 90b8ba464..f7eddd11b 100644
--- a/app/javascript/mastodon/locales/th.json
+++ b/app/javascript/mastodon/locales/th.json
@@ -13,17 +13,17 @@
"account.domain_blocked": "ปิดกั้นโดเมนอยู่",
"account.edit_profile": "แก้ไขโปรไฟล์",
"account.enable_notifications": "แจ้งเตือนฉันเมื่อ @{name} โพสต์",
- "account.endorse": "แสดงให้เห็นในโปรไฟล์",
+ "account.endorse": "แนะนำในโปรไฟล์",
"account.follow": "ติดตาม",
"account.followers": "ผู้ติดตาม",
"account.followers.empty": "ยังไม่มีใครติดตามผู้ใช้นี้",
"account.followers_counter": "{count, plural, other {{counter} ผู้ติดตาม}}",
+ "account.following": "กำลังติดตาม",
"account.following_counter": "{count, plural, other {{counter} กำลังติดตาม}}",
"account.follows.empty": "ผู้ใช้นี้ยังไม่ได้ติดตามใคร",
"account.follows_you": "ติดตามคุณ",
"account.hide_reblogs": "ซ่อนการดันจาก @{name}",
"account.joined": "เข้าร่วมเมื่อ {date}",
- "account.last_status": "ใช้งานล่าสุด",
"account.link_verified_on": "ตรวจสอบความเป็นเจ้าของของลิงก์นี้เมื่อ {date}",
"account.locked_info": "มีการตั้งสถานะความเป็นส่วนตัวของบัญชีนี้เป็นล็อคอยู่ เจ้าของตรวจทานผู้ที่สามารถติดตามเขาด้วยตนเอง",
"account.media": "สื่อ",
@@ -32,7 +32,6 @@
"account.mute": "ซ่อน @{name}",
"account.mute_notifications": "ซ่อนการแจ้งเตือนจาก @{name}",
"account.muted": "ซ่อนอยู่",
- "account.never_active": "ไม่เลย",
"account.posts": "โพสต์",
"account.posts_with_replies": "โพสต์และการตอบกลับ",
"account.report": "รายงาน @{name}",
@@ -42,21 +41,24 @@
"account.statuses_counter": "{count, plural, other {{counter} โพสต์}}",
"account.unblock": "เลิกปิดกั้น @{name}",
"account.unblock_domain": "เลิกปิดกั้นโดเมน {domain}",
- "account.unendorse": "ไม่แสดงให้เห็นในโปรไฟล์",
+ "account.unblock_short": "เลิกปิดกั้น",
+ "account.unendorse": "ไม่แนะนำในโปรไฟล์",
"account.unfollow": "เลิกติดตาม",
"account.unmute": "เลิกซ่อน @{name}",
"account.unmute_notifications": "เลิกซ่อนการแจ้งเตือนจาก @{name}",
+ "account.unmute_short": "เลิกซ่อน",
"account_note.placeholder": "คลิกเพื่อเพิ่มหมายเหตุ",
- "admin.dashboard.retention": "Retention",
- "admin.dashboard.retention.average": "Average",
- "admin.dashboard.retention.cohort": "Sign-up month",
- "admin.dashboard.retention.cohort_size": "New users",
+ "admin.dashboard.daily_retention": "อัตราการรักษาผู้ใช้ตามวันหลังจากลงทะเบียน",
+ "admin.dashboard.monthly_retention": "อัตราการรักษาผู้ใช้ตามเดือนหลังจากลงทะเบียน",
+ "admin.dashboard.retention.average": "ค่าเฉลี่ย",
+ "admin.dashboard.retention.cohort": "เดือนที่ลงทะเบียน",
+ "admin.dashboard.retention.cohort_size": "ผู้ใช้ใหม่",
"alert.rate_limited.message": "โปรดลองใหม่หลังจาก {retry_time, time, medium}",
"alert.rate_limited.title": "มีการจำกัดอัตรา",
"alert.unexpected.message": "เกิดข้อผิดพลาดที่ไม่คาดคิด",
"alert.unexpected.title": "อุปส์!",
"announcement.announcement": "ประกาศ",
- "attachments_list.unprocessed": "(unprocessed)",
+ "attachments_list.unprocessed": "(ยังไม่ได้ประมวลผล)",
"autosuggest_hashtag.per_week": "{count} ต่อสัปดาห์",
"boost_modal.combo": "คุณสามารถกด {combo} เพื่อข้ามสิ่งนี้ในครั้งถัดไป",
"bundle_column_error.body": "มีบางอย่างผิดพลาดขณะโหลดส่วนประกอบนี้",
@@ -104,6 +106,7 @@
"compose_form.poll.switch_to_single": "เปลี่ยนการสำรวจความคิดเห็นเป็นอนุญาตตัวเลือกเดี่ยว",
"compose_form.publish": "โพสต์",
"compose_form.publish_loud": "{publish}!",
+ "compose_form.save_changes": "บันทึกการเปลี่ยนแปลง",
"compose_form.sensitive.hide": "{count, plural, other {ทำเครื่องหมายสื่อว่าละเอียดอ่อน}}",
"compose_form.sensitive.marked": "{count, plural, other {มีการทำเครื่องหมายสื่อว่าละเอียดอ่อน}}",
"compose_form.sensitive.unmarked": "{count, plural, other {ไม่มีการทำเครื่องหมายสื่อว่าละเอียดอ่อน}}",
@@ -118,8 +121,8 @@
"confirmations.delete.message": "คุณแน่ใจหรือไม่ว่าต้องการลบโพสต์นี้?",
"confirmations.delete_list.confirm": "ลบ",
"confirmations.delete_list.message": "คุณแน่ใจหรือไม่ว่าต้องการลบรายการนี้อย่างถาวร?",
- "confirmations.discard_edit_media.confirm": "Discard",
- "confirmations.discard_edit_media.message": "You have unsaved changes to the media description or preview, discard them anyway?",
+ "confirmations.discard_edit_media.confirm": "ละทิ้ง",
+ "confirmations.discard_edit_media.message": "คุณมีการเปลี่ยนแปลงคำอธิบายหรือตัวอย่างสื่อที่ยังไม่ได้บันทึก ละทิ้งการเปลี่ยนแปลงต่อไป?",
"confirmations.domain_block.confirm": "ปิดกั้นทั้งโดเมน",
"confirmations.domain_block.message": "คุณแน่ใจจริง ๆ หรือไม่ว่าต้องการปิดกั้นทั้ง {domain}? ในกรณีส่วนใหญ่ การปิดกั้นหรือการซ่อนแบบกำหนดเป้าหมายไม่กี่รายการนั้นเพียงพอและเป็นที่นิยม คุณจะไม่เห็นเนื้อหาจากโดเมนนั้นในเส้นเวลาสาธารณะใด ๆ หรือการแจ้งเตือนของคุณ จะเอาผู้ติดตามของคุณจากโดเมนนั้นออก",
"confirmations.logout.confirm": "ออกจากระบบ",
@@ -130,14 +133,14 @@
"confirmations.redraft.confirm": "ลบแล้วร่างใหม่",
"confirmations.redraft.message": "คุณแน่ใจหรือไม่ว่าต้องการลบโพสต์นี้แล้วร่างโพสต์ใหม่? รายการโปรดและการดันจะหายไป และการตอบกลับโพสต์ดั้งเดิมจะไม่มีความเกี่ยวพัน",
"confirmations.reply.confirm": "ตอบกลับ",
- "confirmations.reply.message": "การตอบกลับตอนนี้จะเขียนทับข้อความที่คุณกำลังเขียน คุณแน่ใจหรือไม่ว่าต้องการดำเนินการต่อ?",
+ "confirmations.reply.message": "การตอบกลับในตอนนี้จะเขียนทับข้อความที่คุณกำลังเขียนในปัจจุบัน คุณแน่ใจหรือไม่ว่าต้องการดำเนินการต่อ?",
"confirmations.unfollow.confirm": "เลิกติดตาม",
"confirmations.unfollow.message": "คุณแน่ใจหรือไม่ว่าต้องการเลิกติดตาม {name}?",
"conversation.delete": "ลบการสนทนา",
"conversation.mark_as_read": "ทำเครื่องหมายว่าอ่านแล้ว",
"conversation.open": "ดูการสนทนา",
"conversation.with": "กับ {names}",
- "directory.federated": "จากเฟดิเวิร์สที่รู้จัก",
+ "directory.federated": "จากจักรวาลสหพันธ์ที่รู้จัก",
"directory.local": "จาก {domain} เท่านั้น",
"directory.new_arrivals": "มาใหม่",
"directory.recently_active": "ใช้งานล่าสุด",
@@ -165,9 +168,10 @@
"empty_column.community": "เส้นเวลาในเซิร์ฟเวอร์ว่างเปล่า เขียนบางอย่างเป็นสาธารณะเพื่อเริ่มต้น!",
"empty_column.direct": "คุณยังไม่มีข้อความโดยตรงใด ๆ เมื่อคุณส่งหรือรับข้อความ ข้อความจะปรากฏที่นี่",
"empty_column.domain_blocks": "ยังไม่มีโดเมนที่ปิดกั้นอยู่",
+ "empty_column.explore_statuses": "ไม่มีสิ่งใดที่กำลังนิยมในตอนนี้ กลับมาตรวจสอบในภายหลัง!",
"empty_column.favourited_statuses": "คุณยังไม่มีโพสต์ที่ชื่นชอบใด ๆ เมื่อคุณชื่นชอบโพสต์ โพสต์จะปรากฏที่นี่",
"empty_column.favourites": "ยังไม่มีใครชื่นชอบโพสต์นี้ เมื่อใครสักคนชื่นชอบ เขาจะปรากฏที่นี่",
- "empty_column.follow_recommendations": "Looks like no suggestions could be generated for you. You can try using search to look for people you might know or explore trending hashtags.",
+ "empty_column.follow_recommendations": "ดูเหมือนว่าจะไม่สามารถสร้างข้อเสนอแนะสำหรับคุณ คุณสามารถลองใช้การค้นหาเพื่อมองหาผู้คนที่คุณอาจรู้จักหรือสำรวจแฮชแท็กที่กำลังนิยม",
"empty_column.follow_requests": "คุณยังไม่มีคำขอติดตามใด ๆ เมื่อคุณได้รับคำขอ คำขอจะปรากฏที่นี่",
"empty_column.hashtag": "ยังไม่มีสิ่งใดในแฮชแท็กนี้",
"empty_column.home": "เส้นเวลาหน้าแรกของคุณว่างเปล่า! ติดตามผู้คนเพิ่มเติมเพื่อเติมเส้นเวลาให้เต็ม {suggestions}",
@@ -176,13 +180,19 @@
"empty_column.lists": "คุณยังไม่มีรายการใด ๆ เมื่อคุณสร้างรายการ รายการจะปรากฏที่นี่",
"empty_column.mutes": "คุณยังไม่ได้ซ่อนผู้ใช้ใด ๆ",
"empty_column.notifications": "คุณยังไม่มีการแจ้งเตือนใด ๆ เมื่อผู้คนอื่น ๆ โต้ตอบกับคุณ คุณจะเห็นการแจ้งเตือนที่นี่",
- "empty_column.public": "ไม่มีสิ่งใดที่นี่! เขียนบางอย่างเป็นสาธารณะ หรือติดตามผู้ใช้จากเซิร์ฟเวอร์อื่น ๆ ด้วยตนเองเพื่อเติมให้เต็ม",
+ "empty_column.public": "ไม่มีสิ่งใดที่นี่! เขียนบางอย่างเป็นสาธารณะ หรือติดตามผู้ใช้จากเซิร์ฟเวอร์อื่น ๆ ด้วยตนเองเพื่อเติมเส้นเวลาให้เต็ม",
"error.unexpected_crash.explanation": "เนื่องจากข้อบกพร่องในโค้ดของเราหรือปัญหาความเข้ากันได้ของเบราว์เซอร์ จึงไม่สามารถแสดงหน้านี้ได้อย่างถูกต้อง",
"error.unexpected_crash.explanation_addons": "ไม่สามารถแสดงหน้านี้ได้อย่างถูกต้อง ข้อผิดพลาดนี้เป็นไปได้ว่าเกิดจากส่วนเสริมของเบราว์เซอร์หรือเครื่องมือการแปลอัตโนมัติ",
"error.unexpected_crash.next_steps": "ลองรีเฟรชหน้า หากนั่นไม่ช่วย คุณอาจยังสามารถใช้ Mastodon ได้ผ่านเบราว์เซอร์อื่นหรือแอป",
"error.unexpected_crash.next_steps_addons": "ลองปิดใช้งานส่วนเสริมหรือเครื่องมือแล้วรีเฟรชหน้า หากนั่นไม่ช่วย คุณอาจยังสามารถใช้ Mastodon ได้ผ่านเบราว์เซอร์อื่นหรือแอป",
"errors.unexpected_crash.copy_stacktrace": "คัดลอกการติดตามสแตกไปยังคลิปบอร์ด",
"errors.unexpected_crash.report_issue": "รายงานปัญหา",
+ "explore.search_results": "ผลลัพธ์การค้นหา",
+ "explore.suggested_follows": "สำหรับคุณ",
+ "explore.title": "สำรวจ",
+ "explore.trending_links": "ข่าว",
+ "explore.trending_statuses": "โพสต์",
+ "explore.trending_tags": "แฮชแท็ก",
"follow_recommendations.done": "เสร็จสิ้น",
"follow_recommendations.heading": "ติดตามผู้คนที่คุณต้องการเห็นโพสต์! นี่คือข้อเสนอแนะบางส่วน",
"follow_recommendations.lead": "Posts from people you follow will show up in chronological order on your home feed. Don't be afraid to make mistakes, you can unfollow people just as easily any time!",
@@ -284,6 +294,7 @@
"navigation_bar.discover": "ค้นพบ",
"navigation_bar.domain_blocks": "โดเมนที่ปิดกั้นอยู่",
"navigation_bar.edit_profile": "แก้ไขโปรไฟล์",
+ "navigation_bar.explore": "สำรวจ",
"navigation_bar.favourites": "รายการโปรด",
"navigation_bar.filters": "คำที่ซ่อนอยู่",
"navigation_bar.follow_requests": "คำขอติดตาม",
@@ -298,6 +309,7 @@
"navigation_bar.preferences": "การกำหนดลักษณะ",
"navigation_bar.public_timeline": "เส้นเวลาที่ติดต่อกับภายนอก",
"navigation_bar.security": "ความปลอดภัย",
+ "notification.admin.sign_up": "{name} ได้ลงทะเบียน",
"notification.favourite": "{name} ได้ชื่นชอบโพสต์ของคุณ",
"notification.follow": "{name} ได้ติดตามคุณ",
"notification.follow_request": "{name} ได้ขอติดตามคุณ",
@@ -306,13 +318,15 @@
"notification.poll": "การสำรวจความคิดเห็นที่คุณได้ลงคะแนนได้สิ้นสุดแล้ว",
"notification.reblog": "{name} ได้ดันโพสต์ของคุณ",
"notification.status": "{name} เพิ่งโพสต์",
+ "notification.update": "{name} ได้แก้ไขโพสต์",
"notifications.clear": "ล้างการแจ้งเตือน",
"notifications.clear_confirmation": "คุณแน่ใจหรือไม่ว่าต้องการล้างการแจ้งเตือนทั้งหมดของคุณอย่างถาวร?",
+ "notifications.column_settings.admin.sign_up": "การลงทะเบียนใหม่:",
"notifications.column_settings.alert": "การแจ้งเตือนบนเดสก์ท็อป",
"notifications.column_settings.favourite": "รายการโปรด:",
"notifications.column_settings.filter_bar.advanced": "แสดงหมวดหมู่ทั้งหมด",
"notifications.column_settings.filter_bar.category": "แถบตัวกรองด่วน",
- "notifications.column_settings.filter_bar.show": "แสดง",
+ "notifications.column_settings.filter_bar.show_bar": "แสดงแถบตัวกรอง",
"notifications.column_settings.follow": "ผู้ติดตามใหม่:",
"notifications.column_settings.follow_request": "คำขอติดตามใหม่:",
"notifications.column_settings.mention": "การกล่าวถึง:",
@@ -322,7 +336,9 @@
"notifications.column_settings.show": "แสดงในคอลัมน์",
"notifications.column_settings.sound": "เล่นเสียง",
"notifications.column_settings.status": "โพสต์ใหม่:",
- "notifications.column_settings.unread_markers.category": "เครื่องหมายการแจ้งเตือนที่ยังไม่ได้อ่าน",
+ "notifications.column_settings.unread_notifications.category": "การแจ้งเตือนที่ยังไม่ได้อ่าน",
+ "notifications.column_settings.unread_notifications.highlight": "เน้นการแจ้งเตือนที่ยังไม่ได้อ่าน",
+ "notifications.column_settings.update": "การแก้ไข:",
"notifications.filter.all": "ทั้งหมด",
"notifications.filter.boosts": "การดัน",
"notifications.filter.favourites": "รายการโปรด",
@@ -338,7 +354,7 @@
"notifications.permission_required": "Desktop notifications are unavailable because the required permission has not been granted.",
"notifications_permission_banner.enable": "เปิดใช้งานการแจ้งเตือนบนเดสก์ท็อป",
"notifications_permission_banner.how_to_control": "To receive notifications when Mastodon isn't open, enable desktop notifications. You can control precisely which types of interactions generate desktop notifications through the {icon} button above once they're enabled.",
- "notifications_permission_banner.title": "ไม่พลาดสิ่งต่าง ๆ",
+ "notifications_permission_banner.title": "ไม่พลาดสิ่งใด",
"picture_in_picture.restore": "นำกลับมา",
"poll.closed": "ปิดแล้ว",
"poll.refresh": "รีเฟรช",
@@ -346,7 +362,7 @@
"poll.total_votes": "{count, plural, other {# การลงคะแนน}}",
"poll.vote": "ลงคะแนน",
"poll.voted": "คุณได้ลงคะแนนให้กับคำตอบนี้",
- "poll.votes": "{votes, plural, one {# vote} other {# votes}}",
+ "poll.votes": "{votes, plural, other {# การลงคะแนน}}",
"poll_button.add_poll": "เพิ่มการสำรวจความคิดเห็น",
"poll_button.remove_poll": "เอาการสำรวจความคิดเห็นออก",
"privacy.change": "เปลี่ยนความเป็นส่วนตัวของโพสต์",
@@ -362,18 +378,54 @@
"regeneration_indicator.label": "กำลังโหลด…",
"regeneration_indicator.sublabel": "กำลังเตรียมฟีดหน้าแรกของคุณ!",
"relative_time.days": "{number} วัน",
+ "relative_time.full.days": "{number, plural, other {# วัน}}ที่แล้ว",
+ "relative_time.full.hours": "{number, plural, other {# ชั่วโมง}}ที่แล้ว",
+ "relative_time.full.just_now": "เมื่อกี้นี้",
+ "relative_time.full.minutes": "{number, plural, other {# นาที}}ที่แล้ว",
+ "relative_time.full.seconds": "{number, plural, other {# วินาที}}ที่แล้ว",
"relative_time.hours": "{number} ชั่วโมง",
"relative_time.just_now": "ตอนนี้",
"relative_time.minutes": "{number} นาที",
"relative_time.seconds": "{number} วินาที",
"relative_time.today": "วันนี้",
"reply_indicator.cancel": "ยกเลิก",
+ "report.block": "ปิดกั้น",
+ "report.block_explanation": "คุณจะไม่เห็นโพสต์ของเขา เขาจะไม่สามารถเห็นโพสต์ของคุณหรือติดตามคุณ เขาจะสามารถบอกได้ว่ามีการปิดกั้นเขา",
+ "report.categories.other": "อื่น ๆ",
+ "report.categories.spam": "สแปม",
+ "report.categories.violation": "เนื้อหาละเมิดหนึ่งกฎของเซิร์ฟเวอร์หรือมากกว่า",
+ "report.category.subtitle": "เลือกที่ตรงกันที่สุด",
+ "report.category.title": "บอกเราว่าเกิดอะไรขึ้นกับ {type} นี้",
+ "report.category.title_account": "โปรไฟล์",
+ "report.category.title_status": "โพสต์",
+ "report.close": "เสร็จสิ้น",
+ "report.comment.title": "มีสิ่งอื่นใดที่คุณคิดว่าเราควรทราบหรือไม่?",
"report.forward": "ส่งต่อไปยัง {target}",
"report.forward_hint": "บัญชีมาจากเซิร์ฟเวอร์อื่น ส่งสำเนาของรายงานที่ไม่ระบุตัวตนไปที่นั่นด้วย?",
- "report.hint": "จะส่งรายงานไปยังผู้ควบคุมเซิร์ฟเวอร์ของคุณ คุณสามารถให้คำอธิบายเหตุผลที่คุณรายงานบัญชีนี้ได้ด้านล่าง:",
+ "report.mute": "ซ่อน",
+ "report.mute_explanation": "คุณจะไม่เห็นโพสต์ของเขา เขายังสามารถติดตามคุณและเห็นโพสต์ของคุณและจะไม่ทราบว่ามีการซ่อนเขา",
+ "report.next": "ถัดไป",
"report.placeholder": "ความคิดเห็นเพิ่มเติม",
+ "report.reasons.dislike": "ฉันไม่ชอบโพสต์",
+ "report.reasons.dislike_description": "โพสต์ไม่ใช่บางอย่างที่คุณต้องการเห็น",
+ "report.reasons.other": "โพสต์เป็นอย่างอื่น",
+ "report.reasons.other_description": "ปัญหาไม่เข้าหมวดหมู่อื่น ๆ",
+ "report.reasons.spam": "โพสต์เป็นสแปม",
+ "report.reasons.spam_description": "ลิงก์ที่เป็นอันตราย, การมีส่วนร่วมปลอม หรือการตอบกลับซ้ำ ๆ",
+ "report.reasons.violation": "โพสต์ละเมิดกฎของเซิร์ฟเวอร์",
+ "report.reasons.violation_description": "คุณทราบว่าโพสต์แหกกฎเฉพาะ",
+ "report.rules.subtitle": "เลือกทั้งหมดที่นำไปใช้",
+ "report.rules.title": "กำลังละเมิดกฎใด?",
+ "report.statuses.subtitle": "เลือกทั้งหมดที่นำไปใช้",
+ "report.statuses.title": "มีโพสต์ใด ๆ ที่สนับสนุนรายงานนี้หรือไม่?",
"report.submit": "ส่ง",
"report.target": "กำลังรายงาน {target}",
+ "report.thanks.take_action": "นี่คือตัวเลือกของคุณสำหรับการควบคุมสิ่งที่คุณเห็นใน Mastodon:",
+ "report.thanks.take_action_actionable": "ขณะที่เราตรวจทานสิ่งนี้ คุณสามารถดำเนินการกับ @{name}:",
+ "report.thanks.title": "ไม่ต้องการเห็นสิ่งนี้?",
+ "report.thanks.title_actionable": "ขอบคุณสำหรับการรายงาน เราจะตรวจสอบสิ่งนี้",
+ "report.unfollow": "เลิกติดตาม @{name}",
+ "report.unfollow_explanation": "คุณกำลังติดตามบัญชีนี้ เพื่อไม่ให้เห็นโพสต์ของเขาในฟีดหน้าแรกของคุณอีกต่อไป เลิกติดตามเขา",
"search.placeholder": "ค้นหา",
"search_popout.search_format": "รูปแบบการค้นหาขั้นสูง",
"search_popout.tips.full_text": "ข้อความแบบง่ายส่งคืนโพสต์ที่คุณได้เขียน ชื่นชอบ ดัน หรือได้รับการกล่าวถึง ตลอดจนชื่อผู้ใช้, ชื่อที่แสดง และแฮชแท็กที่ตรงกัน",
@@ -382,7 +434,9 @@
"search_popout.tips.text": "ข้อความแบบง่ายส่งคืนชื่อที่แสดง, ชื่อผู้ใช้ และแฮชแท็กที่ตรงกัน",
"search_popout.tips.user": "ผู้ใช้",
"search_results.accounts": "ผู้คน",
+ "search_results.all": "ทั้งหมด",
"search_results.hashtags": "แฮชแท็ก",
+ "search_results.nothing_found": "ไม่พบสิ่งใดสำหรับคำค้นหาเหล่านี้",
"search_results.statuses": "โพสต์",
"search_results.statuses_fts_disabled": "ไม่มีการเปิดใช้งานการค้นหาโพสต์โดยเนื้อหาของโพสต์ในเซิร์ฟเวอร์ Mastodon นี้",
"search_results.total": "{count, number} {count, plural, other {ผลลัพธ์}}",
@@ -396,9 +450,14 @@
"status.delete": "ลบ",
"status.detailed_status": "มุมมองการสนทนาโดยละเอียด",
"status.direct": "ส่งข้อความโดยตรงถึง @{name}",
+ "status.edit": "แก้ไข",
+ "status.edited": "แก้ไขเมื่อ {date}",
+ "status.edited_x_times": "แก้ไข {count, plural, other {{count} ครั้ง}}",
"status.embed": "ฝัง",
"status.favourite": "ชื่นชอบ",
"status.filtered": "กรองอยู่",
+ "status.history.created": "{name} ได้สร้างเมื่อ {date}",
+ "status.history.edited": "{name} ได้แก้ไขเมื่อ {date}",
"status.load_more": "โหลดเพิ่มเติม",
"status.media_hidden": "ซ่อนสื่ออยู่",
"status.mention": "กล่าวถึง @{name}",
@@ -462,7 +521,7 @@
"upload_form.video_description": "อธิบายสำหรับผู้สูญเสียการได้ยินหรือบกพร่องทางการมองเห็น",
"upload_modal.analyzing_picture": "กำลังวิเคราะห์รูปภาพ…",
"upload_modal.apply": "นำไปใช้",
- "upload_modal.applying": "Applying…",
+ "upload_modal.applying": "กำลังนำไปใช้…",
"upload_modal.choose_image": "เลือกภาพ",
"upload_modal.description_placeholder": "สุนัขจิ้งจอกสีน้ำตาลที่ว่องไวกระโดดข้ามสุนัขขี้เกียจ",
"upload_modal.detect_text": "ตรวจหาข้อความจากรูปภาพ",
diff --git a/app/javascript/mastodon/locales/tr.json b/app/javascript/mastodon/locales/tr.json
index 2ae8a908a..96d6f83c3 100644
--- a/app/javascript/mastodon/locales/tr.json
+++ b/app/javascript/mastodon/locales/tr.json
@@ -18,12 +18,12 @@
"account.followers": "Takipçi",
"account.followers.empty": "Henüz kimse bu kullanıcıyı takip etmiyor.",
"account.followers_counter": "{count, plural, one {{counter} Takipçi} other {{counter} Takipçi}}",
+ "account.following": "Takip Ediliyor",
"account.following_counter": "{count, plural, one {{counter} Takip Edilen} other {{counter} Takip Edilen}}",
"account.follows.empty": "Bu kullanıcı henüz kimseyi takip etmiyor.",
"account.follows_you": "Seni takip ediyor",
"account.hide_reblogs": "@{name} kişisinin boostlarını gizle",
"account.joined": "{date} tarihinde katıldı",
- "account.last_status": "Son etkinlik",
"account.link_verified_on": "Bu bağlantının sahipliği {date} tarihinde kontrol edildi",
"account.locked_info": "Bu hesabın gizlilik durumu kilitli olarak ayarlanmış. Sahibi, onu kimin takip edebileceğini elle inceliyor.",
"account.media": "Medya",
@@ -32,7 +32,6 @@
"account.mute": "@{name} adlı kişiyi sessize al",
"account.mute_notifications": "@{name} adlı kişinin bildirimlerini kapat",
"account.muted": "Susturuldu",
- "account.never_active": "Asla",
"account.posts": "Gönderiler",
"account.posts_with_replies": "Gönderiler ve yanıtlar",
"account.report": "@{name} adlı kişiyi bildir",
@@ -42,21 +41,24 @@
"account.statuses_counter": "{count, plural, one {{counter} Gönderi} other {{counter} Gönderi}}",
"account.unblock": "@{name} adlı kişinin engelini kaldır",
"account.unblock_domain": "{domain} alan adının engelini kaldır",
+ "account.unblock_short": "Engeli kaldır",
"account.unendorse": "Profilde gösterme",
"account.unfollow": "Takibi bırak",
"account.unmute": "@{name} adlı kişinin sesini aç",
"account.unmute_notifications": "@{name} adlı kişinin bildirimlerini aç",
+ "account.unmute_short": "Susturmayı kaldır",
"account_note.placeholder": "Not eklemek için tıklayın",
- "admin.dashboard.retention": "Retention",
- "admin.dashboard.retention.average": "Average",
- "admin.dashboard.retention.cohort": "Sign-up month",
- "admin.dashboard.retention.cohort_size": "New users",
+ "admin.dashboard.daily_retention": "Kayıttan sonra günlük kullanıcı saklama oranı",
+ "admin.dashboard.monthly_retention": "Kayıttan sonra aylık kullanıcı saklama oranı",
+ "admin.dashboard.retention.average": "Ortalama",
+ "admin.dashboard.retention.cohort": "Kayıt ayı",
+ "admin.dashboard.retention.cohort_size": "Yeni kullanıcılar",
"alert.rate_limited.message": "Lütfen {retry_time, time, medium} süresinden sonra tekrar deneyin.",
"alert.rate_limited.title": "Oran sınırlıdır",
"alert.unexpected.message": "Beklenmedik bir hata oluştu.",
"alert.unexpected.title": "Hay aksi!",
"announcement.announcement": "Duyuru",
- "attachments_list.unprocessed": "(unprocessed)",
+ "attachments_list.unprocessed": "(işlenmemiş)",
"autosuggest_hashtag.per_week": "Haftada {count}",
"boost_modal.combo": "Bir daha ki sefere {combo} tuşuna basabilirsin",
"bundle_column_error.body": "Bu bileşen yüklenirken bir şeyler ters gitti.",
@@ -104,6 +106,7 @@
"compose_form.poll.switch_to_single": "Tek bir seçeneğe izin vermek için anketi değiştir",
"compose_form.publish": "Tootla",
"compose_form.publish_loud": "{publish}!",
+ "compose_form.save_changes": "Değişiklikleri kaydet",
"compose_form.sensitive.hide": "{count, plural, one {Medyayı hassas olarak işaretle} other {Medyayı hassas olarak işaretle}}",
"compose_form.sensitive.marked": "{count, plural, one {Medya hassas olarak işaretlendi} other {Medya hassas olarak işaretlendi}}",
"compose_form.sensitive.unmarked": "{count, plural, one {Medya hassas olarak işaretlenmemiş} other {Medya hassas olarak işaretlenmemiş}}",
@@ -118,8 +121,8 @@
"confirmations.delete.message": "Bu tootu silmek istediğinden emin misin?",
"confirmations.delete_list.confirm": "Sil",
"confirmations.delete_list.message": "Bu listeyi kalıcı olarak silmek istediğinden emin misin?",
- "confirmations.discard_edit_media.confirm": "Discard",
- "confirmations.discard_edit_media.message": "You have unsaved changes to the media description or preview, discard them anyway?",
+ "confirmations.discard_edit_media.confirm": "Vazgeç",
+ "confirmations.discard_edit_media.message": "Medya açıklaması veya ön izlemede kaydedilmemiş değişiklikleriniz var, yine de vazgeçmek istiyor musunuz?",
"confirmations.domain_block.confirm": "Alanın tamamını engelle",
"confirmations.domain_block.message": "{domain} alanının tamamını engellemek istediğinden gerçekten emin misin? Genellikle hedeflenen birkaç engelleme veya sessize alma yeterlidir ve tercih edilir. Bu alan adından gelen içeriği herhangi bir genel zaman çizelgesinde veya bildirimlerinde görmezsin. Bu alan adındaki takipçilerin kaldırılır.",
"confirmations.logout.confirm": "Oturumu kapat",
@@ -165,6 +168,7 @@
"empty_column.community": "Yerel zaman çizelgesi boş. Daha fazla eğlence için herkese açık bir gönderi paylaşın!",
"empty_column.direct": "Henüz direkt mesajın yok. Bir tane gönderdiğinde veya aldığında burada görünür.",
"empty_column.domain_blocks": "Henüz hiçbir gizli alan adı yok.",
+ "empty_column.explore_statuses": "Şu an öne çıkan birşey yok. Daha sonra tekrar bakın!",
"empty_column.favourited_statuses": "Favori tootun yok. Favori tootun olduğunda burada görünür.",
"empty_column.favourites": "Kimse bu gönderiyi favorilerine eklememiş. Biri eklediğinde burada görünecek.",
"empty_column.follow_recommendations": "Öyle görünüyor ki sizin için hiçbir öneri oluşturulamıyor. Tanıdığınız kişileri aramak için aramayı kullanabilir veya öne çıkanlara bakabilirsiniz.",
@@ -183,6 +187,12 @@
"error.unexpected_crash.next_steps_addons": "Bunları devre dışı bırakmayı ve sayfayı yenilemeyi deneyin. Bu yardımcı olmazsa, Mastodon'u başka bir tarayıcı veya yerel uygulama aracılığıyla kullanabilirsiniz.",
"errors.unexpected_crash.copy_stacktrace": "Yığın izlemeyi (stacktrace) panoya kopyala",
"errors.unexpected_crash.report_issue": "Sorun bildir",
+ "explore.search_results": "Arama sonuçları",
+ "explore.suggested_follows": "Sizin için",
+ "explore.title": "Keşfet",
+ "explore.trending_links": "Haberler",
+ "explore.trending_statuses": "Gönderiler",
+ "explore.trending_tags": "Etiketler",
"follow_recommendations.done": "Tamam",
"follow_recommendations.heading": "Gönderilerini görmek isteyeceğiniz kişileri takip edin! Burada bazı öneriler bulabilirsiniz.",
"follow_recommendations.lead": "Takip ettiğiniz kişilerin gönderileri anasayfa akışınızda kronolojik sırada görünmeye devam edecek. Hata yapmaktan çekinmeyin, kişileri istediğiniz anda kolayca takipten çıkabilirsiniz!",
@@ -284,6 +294,7 @@
"navigation_bar.discover": "Keşfet",
"navigation_bar.domain_blocks": "Engellenen alan adları",
"navigation_bar.edit_profile": "Profili düzenle",
+ "navigation_bar.explore": "Keşfet",
"navigation_bar.favourites": "Favoriler",
"navigation_bar.filters": "Sessize alınmış kelimeler",
"navigation_bar.follow_requests": "Takip istekleri",
@@ -298,6 +309,7 @@
"navigation_bar.preferences": "Tercihler",
"navigation_bar.public_timeline": "Federe zaman tüneli",
"navigation_bar.security": "Güvenlik",
+ "notification.admin.sign_up": "{name} kaydoldu",
"notification.favourite": "{name} gönderini beğendi",
"notification.follow": "{name} seni takip etti",
"notification.follow_request": "{name} size takip isteği gönderdi",
@@ -306,13 +318,15 @@
"notification.poll": "Oy verdiğiniz bir anket sona erdi",
"notification.reblog": "{name} gönderini teşvik etti",
"notification.status": "{name} az önce gönderdi",
+ "notification.update": "{name} bir gönderiyi düzenledi",
"notifications.clear": "Bildirimleri temizle",
"notifications.clear_confirmation": "Tüm bildirimlerinizi kalıcı olarak temizlemek ister misiniz?",
+ "notifications.column_settings.admin.sign_up": "Yeni kayıtlar:",
"notifications.column_settings.alert": "Masaüstü bildirimleri",
"notifications.column_settings.favourite": "Beğeniler:",
"notifications.column_settings.filter_bar.advanced": "Tüm kategorileri görüntüle",
"notifications.column_settings.filter_bar.category": "Hızlı filtre çubuğu",
- "notifications.column_settings.filter_bar.show": "Göster",
+ "notifications.column_settings.filter_bar.show_bar": "Süzme çubuğunu göster",
"notifications.column_settings.follow": "Yeni takipçiler:",
"notifications.column_settings.follow_request": "Yeni takip istekleri:",
"notifications.column_settings.mention": "Bahsetmeler:",
@@ -322,7 +336,9 @@
"notifications.column_settings.show": "Sütunda göster",
"notifications.column_settings.sound": "Ses çal",
"notifications.column_settings.status": "Yeni gönderiler:",
- "notifications.column_settings.unread_markers.category": "Okunmamış bildirim işaretleri",
+ "notifications.column_settings.unread_notifications.category": "Okunmamış bildirimler",
+ "notifications.column_settings.unread_notifications.highlight": "Okunmamış bildirimleri öne çıkar",
+ "notifications.column_settings.update": "Düzenlemeler:",
"notifications.filter.all": "Tümü",
"notifications.filter.boosts": "Boostlar",
"notifications.filter.favourites": "Beğeniler",
@@ -346,7 +362,7 @@
"poll.total_votes": "{count, plural, one {# oy} other {# oy}}",
"poll.vote": "Oy ver",
"poll.voted": "Bu cevap için oy kullandınız",
- "poll.votes": "{votes, plural, one {# vote} other {# votes}}",
+ "poll.votes": "{votes, plural, one {# oy} other {# oy}}",
"poll_button.add_poll": "Bir anket ekleyin",
"poll_button.remove_poll": "Anketi kaldır",
"privacy.change": "Gönderi gizliliğini değiştir",
@@ -362,18 +378,54 @@
"regeneration_indicator.label": "Yükleniyor…",
"regeneration_indicator.sublabel": "Ana akışın hazırlanıyor!",
"relative_time.days": "{number}g",
+ "relative_time.full.days": "{number, plural, one {# gün} other {# gün}} önce",
+ "relative_time.full.hours": "{number, plural, one {# saat} other {# saat}} önce",
+ "relative_time.full.just_now": "şimdi",
+ "relative_time.full.minutes": "{number, plural, one {# dakika} other {# dakika}} önce",
+ "relative_time.full.seconds": "{number, plural, one {# saniye} other {# saniye}} önce",
"relative_time.hours": "{number}sa",
"relative_time.just_now": "şimdi",
"relative_time.minutes": "{number}dk",
"relative_time.seconds": "{number}sn",
"relative_time.today": "bugün",
"reply_indicator.cancel": "İptal",
+ "report.block": "Engelle",
+ "report.block_explanation": "Gönderilerini göremeyeceksiniz. Gönderilerinizi göremezler veya sizi takip edemezler. Engelli olduklarını anlayabilecekler.",
+ "report.categories.other": "Diğer",
+ "report.categories.spam": "İstenmeyen",
+ "report.categories.violation": "İçerik bir veya daha fazla sunucu kuralını ihlal ediyor",
+ "report.category.subtitle": "En uygun eşleşmeyi seçin",
+ "report.category.title": "Bu {type} ile ilgili neler oluyor bize söyleyin",
+ "report.category.title_account": "profil",
+ "report.category.title_status": "gönderi",
+ "report.close": "Tamam",
+ "report.comment.title": "Bilmemizi istediğiniz başka bir şey var mı?",
"report.forward": "{target} ilet",
"report.forward_hint": "Hesap başka bir sunucudan. Raporun anonim bir kopyası da oraya gönderilsin mi?",
- "report.hint": "Bu rapor sunucu moderatörlerine gönderilecek. Bu hesabı neden bildirdiğiniz hakkında bilgi verebirsiniz:",
+ "report.mute": "Sessiz",
+ "report.mute_explanation": "Gönderilerini göremeyeceksiniz. Sizi takip etmeyi sürdürebilir ve gönderilerinizi görebilirler ama sessize alındıklarını anlamayacaklar.",
+ "report.next": "Sonraki",
"report.placeholder": "Ek yorumlar",
+ "report.reasons.dislike": "Beğenmedim",
+ "report.reasons.dislike_description": "Görmek isteyeceğiniz bir şey değil",
+ "report.reasons.other": "Başka bir şey",
+ "report.reasons.other_description": "Sorun başka kategorilere uymuyor",
+ "report.reasons.spam": "İstenmeyen",
+ "report.reasons.spam_description": "Kötü niyetli bağlantılar, sahte etkileşim veya tekrarlayan yanıtlar",
+ "report.reasons.violation": "Sunucu kurallarını ihlal ediyor",
+ "report.reasons.violation_description": "Belirli kuralları ihlal ettiğinin farkındasınız",
+ "report.rules.subtitle": "Geçerli olanların hepsini seçin",
+ "report.rules.title": "Hangi kurallar ihlal ediliyor?",
+ "report.statuses.subtitle": "Geçerli olanların hepsini seçin",
+ "report.statuses.title": "Bu bildirimi destekleyecek herhangi bir gönderi var mı?",
"report.submit": "Gönder",
"report.target": "{target} Bildiriliyor",
+ "report.thanks.take_action": "Mastodon'da ne görebileceğinizi denetlemeye ilişkin seçenekler şunlardır:",
+ "report.thanks.take_action_actionable": "Biz değerlendirirken, @{name} hesabına yönelik bir şeyler yapabilirsiniz:",
+ "report.thanks.title": "Bunu görmek istemiyor musunuz?",
+ "report.thanks.title_actionable": "Bildirdiğiniz için teşekkürler, konuyu araştıracağız.",
+ "report.unfollow": "@{name} takip etmeyi bırak",
+ "report.unfollow_explanation": "Bu hesabı takip ediyorsunuz. Ana akışınızda gönderilerini görmek istemiyorsanız, onu takip etmeyi bırakın.",
"search.placeholder": "Ara",
"search_popout.search_format": "Gelişmiş arama biçimi",
"search_popout.tips.full_text": "Basit metin yazdığınız, beğendiğiniz, teşvik ettiğiniz veya söz edilen gönderilerin yanı sıra kullanıcı adlarını, görünen adları ve hashtag'leri eşleştiren gönderileri de döndürür.",
@@ -382,7 +434,9 @@
"search_popout.tips.text": "Basit metin, eşleşen görünen adları, kullanıcı adlarını ve hashtag'leri döndürür",
"search_popout.tips.user": "kullanıcı",
"search_results.accounts": "İnsanlar",
+ "search_results.all": "Tümü",
"search_results.hashtags": "Etiketler",
+ "search_results.nothing_found": "Bu arama seçenekleriyle bir sonuç bulunamadı",
"search_results.statuses": "Gönderiler",
"search_results.statuses_fts_disabled": "Bu Mastodon sunucusunda gönderi içeriğine göre arama etkin değil.",
"search_results.total": "{count, number} {count, plural, one {sonuç} other {sonuç}}",
@@ -396,9 +450,14 @@
"status.delete": "Sil",
"status.detailed_status": "Ayrıntılı sohbet görünümü",
"status.direct": "@{name} adlı kişiye direkt mesaj",
+ "status.edit": "Düzenle",
+ "status.edited": "{date} tarihinde düzenlenmiş",
+ "status.edited_x_times": "{count, plural, one {{count} kez} other {{count} kez}} düzenlendi",
"status.embed": "Gömülü",
"status.favourite": "Beğen",
"status.filtered": "Filtrelenmiş",
+ "status.history.created": "{name} oluşturdu {date}",
+ "status.history.edited": "{name} düzenledi {date}",
"status.load_more": "Daha fazlasını yükle",
"status.media_hidden": "Medya gizli",
"status.mention": "@{name} kişisinden bahset",
@@ -462,7 +521,7 @@
"upload_form.video_description": "İşitme kaybı veya görme engeli olan kişiler için tarif edin",
"upload_modal.analyzing_picture": "Resim analiz ediliyor…",
"upload_modal.apply": "Uygula",
- "upload_modal.applying": "Applying…",
+ "upload_modal.applying": "Uygulanıyor…",
"upload_modal.choose_image": "Resim seç",
"upload_modal.description_placeholder": "Pijamalı hasta yağız şoföre çabucak güvendi",
"upload_modal.detect_text": "Resimdeki metni algıla",
diff --git a/app/javascript/mastodon/locales/tt.json b/app/javascript/mastodon/locales/tt.json
index 456c5f72d..06936f110 100644
--- a/app/javascript/mastodon/locales/tt.json
+++ b/app/javascript/mastodon/locales/tt.json
@@ -18,12 +18,12 @@
"account.followers": "Followers",
"account.followers.empty": "No one follows this user yet.",
"account.followers_counter": "{count, plural, one {{counter} Follower} other {{counter} Followers}}",
+ "account.following": "Following",
"account.following_counter": "{count, plural, one {{counter} Following} other {{counter} Following}}",
"account.follows.empty": "This user doesn't follow anyone yet.",
"account.follows_you": "Сезгә язылган",
"account.hide_reblogs": "Hide boosts from @{name}",
"account.joined": "Joined {date}",
- "account.last_status": "Last active",
"account.link_verified_on": "Ownership of this link was checked on {date}",
"account.locked_info": "This account privacy status is set to locked. The owner manually reviews who can follow them.",
"account.media": "Медиа",
@@ -32,7 +32,6 @@
"account.mute": "Mute @{name}",
"account.mute_notifications": "Mute notifications from @{name}",
"account.muted": "Muted",
- "account.never_active": "Беркайчан да",
"account.posts": "Toots",
"account.posts_with_replies": "Toots and replies",
"account.report": "Report @{name}",
@@ -42,12 +41,15 @@
"account.statuses_counter": "{count, plural, one {{counter} Toot} other {{counter} Toots}}",
"account.unblock": "Unblock @{name}",
"account.unblock_domain": "Unblock domain {domain}",
+ "account.unblock_short": "Unblock",
"account.unendorse": "Don't feature on profile",
"account.unfollow": "Язылынмау",
"account.unmute": "Unmute @{name}",
"account.unmute_notifications": "Unmute notifications from @{name}",
+ "account.unmute_short": "Unmute",
"account_note.placeholder": "Click to add a note",
- "admin.dashboard.retention": "Retention",
+ "admin.dashboard.daily_retention": "User retention rate by day after sign-up",
+ "admin.dashboard.monthly_retention": "User retention rate by month after sign-up",
"admin.dashboard.retention.average": "Average",
"admin.dashboard.retention.cohort": "Sign-up month",
"admin.dashboard.retention.cohort_size": "New users",
@@ -104,6 +106,7 @@
"compose_form.poll.switch_to_single": "Change poll to allow for a single choice",
"compose_form.publish": "Toot",
"compose_form.publish_loud": "{publish}!",
+ "compose_form.save_changes": "Save changes",
"compose_form.sensitive.hide": "{count, plural, one {Mark media as sensitive} other {Mark media as sensitive}}",
"compose_form.sensitive.marked": "{count, plural, one {Media is marked as sensitive} other {Media is marked as sensitive}}",
"compose_form.sensitive.unmarked": "{count, plural, one {Media is not marked as sensitive} other {Media is not marked as sensitive}}",
@@ -165,6 +168,7 @@
"empty_column.community": "The local timeline is empty. Write something publicly to get the ball rolling!",
"empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.",
"empty_column.domain_blocks": "There are no blocked domains yet.",
+ "empty_column.explore_statuses": "Nothing is trending right now. Check back later!",
"empty_column.favourited_statuses": "You don't have any favourite toots yet. When you favourite one, it will show up here.",
"empty_column.favourites": "No one has favourited this toot yet. When someone does, they will show up here.",
"empty_column.follow_recommendations": "Looks like no suggestions could be generated for you. You can try using search to look for people you might know or explore trending hashtags.",
@@ -183,6 +187,12 @@
"error.unexpected_crash.next_steps_addons": "Try disabling them and refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
"errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard",
"errors.unexpected_crash.report_issue": "Report issue",
+ "explore.search_results": "Search results",
+ "explore.suggested_follows": "For you",
+ "explore.title": "Explore",
+ "explore.trending_links": "News",
+ "explore.trending_statuses": "Posts",
+ "explore.trending_tags": "Hashtags",
"follow_recommendations.done": "Done",
"follow_recommendations.heading": "Follow people you'd like to see posts from! Here are some suggestions.",
"follow_recommendations.lead": "Posts from people you follow will show up in chronological order on your home feed. Don't be afraid to make mistakes, you can unfollow people just as easily any time!",
@@ -284,6 +294,7 @@
"navigation_bar.discover": "Discover",
"navigation_bar.domain_blocks": "Hidden domains",
"navigation_bar.edit_profile": "Профильны үзгәртү",
+ "navigation_bar.explore": "Explore",
"navigation_bar.favourites": "Favourites",
"navigation_bar.filters": "Muted words",
"navigation_bar.follow_requests": "Follow requests",
@@ -298,6 +309,7 @@
"navigation_bar.preferences": "Caylaw",
"navigation_bar.public_timeline": "Federated timeline",
"navigation_bar.security": "Хәвефсезлек",
+ "notification.admin.sign_up": "{name} signed up",
"notification.favourite": "{name} favourited your status",
"notification.follow": "{name} followed you",
"notification.follow_request": "{name} has requested to follow you",
@@ -306,13 +318,15 @@
"notification.poll": "A poll you have voted in has ended",
"notification.reblog": "{name} boosted your status",
"notification.status": "{name} just posted",
+ "notification.update": "{name} edited a post",
"notifications.clear": "Clear notifications",
"notifications.clear_confirmation": "Are you sure you want to permanently clear all your notifications?",
+ "notifications.column_settings.admin.sign_up": "New sign-ups:",
"notifications.column_settings.alert": "Desktop notifications",
"notifications.column_settings.favourite": "Favourites:",
"notifications.column_settings.filter_bar.advanced": "Display all categories",
"notifications.column_settings.filter_bar.category": "Quick filter bar",
- "notifications.column_settings.filter_bar.show": "Күрсәтү",
+ "notifications.column_settings.filter_bar.show_bar": "Show filter bar",
"notifications.column_settings.follow": "New followers:",
"notifications.column_settings.follow_request": "New follow requests:",
"notifications.column_settings.mention": "Mentions:",
@@ -322,7 +336,9 @@
"notifications.column_settings.show": "Show in column",
"notifications.column_settings.sound": "Play sound",
"notifications.column_settings.status": "New toots:",
- "notifications.column_settings.unread_markers.category": "Unread notification markers",
+ "notifications.column_settings.unread_notifications.category": "Unread notifications",
+ "notifications.column_settings.unread_notifications.highlight": "Highlight unread notifications",
+ "notifications.column_settings.update": "Edits:",
"notifications.filter.all": "Бөтенесе",
"notifications.filter.boosts": "Boosts",
"notifications.filter.favourites": "Favourites",
@@ -362,18 +378,54 @@
"regeneration_indicator.label": "Йөкләү...",
"regeneration_indicator.sublabel": "Your home feed is being prepared!",
"relative_time.days": "{number}к",
+ "relative_time.full.days": "{number, plural, one {# day} other {# days}} ago",
+ "relative_time.full.hours": "{number, plural, one {# hour} other {# hours}} ago",
+ "relative_time.full.just_now": "just now",
+ "relative_time.full.minutes": "{number, plural, one {# minute} other {# minutes}} ago",
+ "relative_time.full.seconds": "{number, plural, one {# second} other {# seconds}} ago",
"relative_time.hours": "{number}с",
"relative_time.just_now": "хәзер",
"relative_time.minutes": "{number}м",
"relative_time.seconds": "{number}сек",
"relative_time.today": "бүген",
"reply_indicator.cancel": "Баш тарту",
+ "report.block": "Block",
+ "report.block_explanation": "You will not see their posts. They will not be able to see your posts or follow you. They will be able to tell that they are blocked.",
+ "report.categories.other": "Other",
+ "report.categories.spam": "Spam",
+ "report.categories.violation": "Content violates one or more server rules",
+ "report.category.subtitle": "Choose the best match",
+ "report.category.title": "Tell us what's going on with this {type}",
+ "report.category.title_account": "профиль",
+ "report.category.title_status": "post",
+ "report.close": "Done",
+ "report.comment.title": "Is there anything else you think we should know?",
"report.forward": "Forward to {target}",
"report.forward_hint": "The account is from another server. Send an anonymized copy of the report there as well?",
- "report.hint": "The report will be sent to your server moderators. You can provide an explanation of why you are reporting this account below:",
- "report.placeholder": "Additional comments",
+ "report.mute": "Mute",
+ "report.mute_explanation": "You will not see their posts. They can still follow you and see your posts and will not know that they are muted.",
+ "report.next": "Next",
+ "report.placeholder": "Type or paste additional comments",
+ "report.reasons.dislike": "I don't like it",
+ "report.reasons.dislike_description": "It is not something you want to see",
+ "report.reasons.other": "It's something else",
+ "report.reasons.other_description": "The issue does not fit into other categories",
+ "report.reasons.spam": "It's spam",
+ "report.reasons.spam_description": "Malicious links, fake engagement, or repetitive replies",
+ "report.reasons.violation": "It violates server rules",
+ "report.reasons.violation_description": "You are aware that it breaks specific rules",
+ "report.rules.subtitle": "Select all that apply",
+ "report.rules.title": "Which rules are being violated?",
+ "report.statuses.subtitle": "Select all that apply",
+ "report.statuses.title": "Are there any posts that back up this report?",
"report.submit": "Җибәрү",
"report.target": "Report {target}",
+ "report.thanks.take_action": "Here are your options for controlling what you see on Mastodon:",
+ "report.thanks.take_action_actionable": "While we review this, you can take action against @{name}:",
+ "report.thanks.title": "Don't want to see this?",
+ "report.thanks.title_actionable": "Thanks for reporting, we'll look into this.",
+ "report.unfollow": "Unfollow @{name}",
+ "report.unfollow_explanation": "You are following this account. To not see their posts in your home feed anymore, unfollow them.",
"search.placeholder": "Эзләү",
"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.",
@@ -382,7 +434,9 @@
"search_popout.tips.text": "Simple text returns matching display names, usernames and hashtags",
"search_popout.tips.user": "кулланучы",
"search_results.accounts": "Кешеләр",
+ "search_results.all": "All",
"search_results.hashtags": "Hashtags",
+ "search_results.nothing_found": "Could not find anything for these search terms",
"search_results.statuses": "Toots",
"search_results.statuses_fts_disabled": "Searching toots by their content is not enabled on this Mastodon server.",
"search_results.total": "{count, number} {count, plural, one {result} other {results}}",
@@ -396,9 +450,14 @@
"status.delete": "Бетерү",
"status.detailed_status": "Detailed conversation view",
"status.direct": "Direct message @{name}",
+ "status.edit": "Edit",
+ "status.edited": "Edited {date}",
+ "status.edited_x_times": "Edited {count, plural, one {{count} time} other {{count} times}}",
"status.embed": "Embed",
"status.favourite": "Favourite",
"status.filtered": "Filtered",
+ "status.history.created": "{name} created {date}",
+ "status.history.edited": "{name} edited {date}",
"status.load_more": "Load more",
"status.media_hidden": "Media hidden",
"status.mention": "Mention @{name}",
@@ -420,9 +479,9 @@
"status.report": "Report @{name}",
"status.sensitive_warning": "Sensitive content",
"status.share": "Уртаклашу",
- "status.show_less": "Show less",
+ "status.show_less": "Әзрәк күрсәтү",
"status.show_less_all": "Show less for all",
- "status.show_more": "Show more",
+ "status.show_more": "Күбрәк күрсәтү",
"status.show_more_all": "Show more for all",
"status.show_thread": "Show thread",
"status.uncached_media_warning": "Not available",
diff --git a/app/javascript/mastodon/locales/ug.json b/app/javascript/mastodon/locales/ug.json
index eca4765c4..088b5ff36 100644
--- a/app/javascript/mastodon/locales/ug.json
+++ b/app/javascript/mastodon/locales/ug.json
@@ -18,12 +18,12 @@
"account.followers": "Followers",
"account.followers.empty": "No one follows this user yet.",
"account.followers_counter": "{count, plural, one {{counter} Follower} other {{counter} Followers}}",
+ "account.following": "Following",
"account.following_counter": "{count, plural, one {{counter} Following} other {{counter} Following}}",
"account.follows.empty": "This user doesn't follow anyone yet.",
"account.follows_you": "Follows you",
"account.hide_reblogs": "Hide boosts from @{name}",
"account.joined": "Joined {date}",
- "account.last_status": "Last active",
"account.link_verified_on": "Ownership of this link was checked on {date}",
"account.locked_info": "This account privacy status is set to locked. The owner manually reviews who can follow them.",
"account.media": "Media",
@@ -32,7 +32,6 @@
"account.mute": "Mute @{name}",
"account.mute_notifications": "Mute notifications from @{name}",
"account.muted": "Muted",
- "account.never_active": "Never",
"account.posts": "Toots",
"account.posts_with_replies": "Toots and replies",
"account.report": "Report @{name}",
@@ -42,12 +41,15 @@
"account.statuses_counter": "{count, plural, one {{counter} Toot} other {{counter} Toots}}",
"account.unblock": "Unblock @{name}",
"account.unblock_domain": "Unblock domain {domain}",
+ "account.unblock_short": "Unblock",
"account.unendorse": "Don't feature on profile",
"account.unfollow": "Unfollow",
"account.unmute": "Unmute @{name}",
"account.unmute_notifications": "Unmute notifications from @{name}",
+ "account.unmute_short": "Unmute",
"account_note.placeholder": "Click to add a note",
- "admin.dashboard.retention": "Retention",
+ "admin.dashboard.daily_retention": "User retention rate by day after sign-up",
+ "admin.dashboard.monthly_retention": "User retention rate by month after sign-up",
"admin.dashboard.retention.average": "Average",
"admin.dashboard.retention.cohort": "Sign-up month",
"admin.dashboard.retention.cohort_size": "New users",
@@ -104,6 +106,7 @@
"compose_form.poll.switch_to_single": "Change poll to allow for a single choice",
"compose_form.publish": "Toot",
"compose_form.publish_loud": "{publish}!",
+ "compose_form.save_changes": "Save changes",
"compose_form.sensitive.hide": "{count, plural, one {Mark media as sensitive} other {Mark media as sensitive}}",
"compose_form.sensitive.marked": "{count, plural, one {Media is marked as sensitive} other {Media is marked as sensitive}}",
"compose_form.sensitive.unmarked": "{count, plural, one {Media is not marked as sensitive} other {Media is not marked as sensitive}}",
@@ -165,6 +168,7 @@
"empty_column.community": "The local timeline is empty. Write something publicly to get the ball rolling!",
"empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.",
"empty_column.domain_blocks": "There are no blocked domains yet.",
+ "empty_column.explore_statuses": "Nothing is trending right now. Check back later!",
"empty_column.favourited_statuses": "You don't have any favourite toots yet. When you favourite one, it will show up here.",
"empty_column.favourites": "No one has favourited this toot yet. When someone does, they will show up here.",
"empty_column.follow_recommendations": "Looks like no suggestions could be generated for you. You can try using search to look for people you might know or explore trending hashtags.",
@@ -183,6 +187,12 @@
"error.unexpected_crash.next_steps_addons": "Try disabling them and refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
"errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard",
"errors.unexpected_crash.report_issue": "Report issue",
+ "explore.search_results": "Search results",
+ "explore.suggested_follows": "For you",
+ "explore.title": "Explore",
+ "explore.trending_links": "News",
+ "explore.trending_statuses": "Posts",
+ "explore.trending_tags": "Hashtags",
"follow_recommendations.done": "Done",
"follow_recommendations.heading": "Follow people you'd like to see posts from! Here are some suggestions.",
"follow_recommendations.lead": "Posts from people you follow will show up in chronological order on your home feed. Don't be afraid to make mistakes, you can unfollow people just as easily any time!",
@@ -284,6 +294,7 @@
"navigation_bar.discover": "Discover",
"navigation_bar.domain_blocks": "Hidden domains",
"navigation_bar.edit_profile": "Edit profile",
+ "navigation_bar.explore": "Explore",
"navigation_bar.favourites": "Favourites",
"navigation_bar.filters": "Muted words",
"navigation_bar.follow_requests": "Follow requests",
@@ -298,6 +309,7 @@
"navigation_bar.preferences": "Preferences",
"navigation_bar.public_timeline": "Federated timeline",
"navigation_bar.security": "Security",
+ "notification.admin.sign_up": "{name} signed up",
"notification.favourite": "{name} favourited your status",
"notification.follow": "{name} followed you",
"notification.follow_request": "{name} has requested to follow you",
@@ -306,13 +318,15 @@
"notification.poll": "A poll you have voted in has ended",
"notification.reblog": "{name} boosted your status",
"notification.status": "{name} just posted",
+ "notification.update": "{name} edited a post",
"notifications.clear": "Clear notifications",
"notifications.clear_confirmation": "Are you sure you want to permanently clear all your notifications?",
+ "notifications.column_settings.admin.sign_up": "New sign-ups:",
"notifications.column_settings.alert": "Desktop notifications",
"notifications.column_settings.favourite": "Favourites:",
"notifications.column_settings.filter_bar.advanced": "Display all categories",
"notifications.column_settings.filter_bar.category": "Quick filter bar",
- "notifications.column_settings.filter_bar.show": "Show",
+ "notifications.column_settings.filter_bar.show_bar": "Show filter bar",
"notifications.column_settings.follow": "New followers:",
"notifications.column_settings.follow_request": "New follow requests:",
"notifications.column_settings.mention": "Mentions:",
@@ -322,7 +336,9 @@
"notifications.column_settings.show": "Show in column",
"notifications.column_settings.sound": "Play sound",
"notifications.column_settings.status": "New toots:",
- "notifications.column_settings.unread_markers.category": "Unread notification markers",
+ "notifications.column_settings.unread_notifications.category": "Unread notifications",
+ "notifications.column_settings.unread_notifications.highlight": "Highlight unread notifications",
+ "notifications.column_settings.update": "Edits:",
"notifications.filter.all": "All",
"notifications.filter.boosts": "Boosts",
"notifications.filter.favourites": "Favourites",
@@ -362,18 +378,54 @@
"regeneration_indicator.label": "Loading…",
"regeneration_indicator.sublabel": "Your home feed is being prepared!",
"relative_time.days": "{number}d",
+ "relative_time.full.days": "{number, plural, one {# day} other {# days}} ago",
+ "relative_time.full.hours": "{number, plural, one {# hour} other {# hours}} ago",
+ "relative_time.full.just_now": "just now",
+ "relative_time.full.minutes": "{number, plural, one {# minute} other {# minutes}} ago",
+ "relative_time.full.seconds": "{number, plural, one {# second} other {# seconds}} ago",
"relative_time.hours": "{number}h",
"relative_time.just_now": "now",
"relative_time.minutes": "{number}m",
"relative_time.seconds": "{number}s",
"relative_time.today": "today",
"reply_indicator.cancel": "Cancel",
+ "report.block": "Block",
+ "report.block_explanation": "You will not see their posts. They will not be able to see your posts or follow you. They will be able to tell that they are blocked.",
+ "report.categories.other": "Other",
+ "report.categories.spam": "Spam",
+ "report.categories.violation": "Content violates one or more server rules",
+ "report.category.subtitle": "Choose the best match",
+ "report.category.title": "Tell us what's going on with this {type}",
+ "report.category.title_account": "profile",
+ "report.category.title_status": "post",
+ "report.close": "Done",
+ "report.comment.title": "Is there anything else you think we should know?",
"report.forward": "Forward to {target}",
"report.forward_hint": "The account is from another server. Send an anonymized copy of the report there as well?",
- "report.hint": "The report will be sent to your server moderators. You can provide an explanation of why you are reporting this account below:",
- "report.placeholder": "Additional comments",
- "report.submit": "Submit",
+ "report.mute": "Mute",
+ "report.mute_explanation": "You will not see their posts. They can still follow you and see your posts and will not know that they are muted.",
+ "report.next": "Next",
+ "report.placeholder": "Type or paste additional comments",
+ "report.reasons.dislike": "I don't like it",
+ "report.reasons.dislike_description": "It is not something you want to see",
+ "report.reasons.other": "It's something else",
+ "report.reasons.other_description": "The issue does not fit into other categories",
+ "report.reasons.spam": "It's spam",
+ "report.reasons.spam_description": "Malicious links, fake engagement, or repetitive replies",
+ "report.reasons.violation": "It violates server rules",
+ "report.reasons.violation_description": "You are aware that it breaks specific rules",
+ "report.rules.subtitle": "Select all that apply",
+ "report.rules.title": "Which rules are being violated?",
+ "report.statuses.subtitle": "Select all that apply",
+ "report.statuses.title": "Are there any posts that back up this report?",
+ "report.submit": "Submit report",
"report.target": "Report {target}",
+ "report.thanks.take_action": "Here are your options for controlling what you see on Mastodon:",
+ "report.thanks.take_action_actionable": "While we review this, you can take action against @{name}:",
+ "report.thanks.title": "Don't want to see this?",
+ "report.thanks.title_actionable": "Thanks for reporting, we'll look into this.",
+ "report.unfollow": "Unfollow @{name}",
+ "report.unfollow_explanation": "You are following this account. To not see their posts in your home feed anymore, unfollow them.",
"search.placeholder": "Search",
"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.",
@@ -382,7 +434,9 @@
"search_popout.tips.text": "Simple text returns matching display names, usernames and hashtags",
"search_popout.tips.user": "user",
"search_results.accounts": "People",
+ "search_results.all": "All",
"search_results.hashtags": "Hashtags",
+ "search_results.nothing_found": "Could not find anything for these search terms",
"search_results.statuses": "Toots",
"search_results.statuses_fts_disabled": "Searching toots by their content is not enabled on this Mastodon server.",
"search_results.total": "{count, number} {count, plural, one {result} other {results}}",
@@ -396,9 +450,14 @@
"status.delete": "Delete",
"status.detailed_status": "Detailed conversation view",
"status.direct": "Direct message @{name}",
+ "status.edit": "Edit",
+ "status.edited": "Edited {date}",
+ "status.edited_x_times": "Edited {count, plural, one {{count} time} other {{count} times}}",
"status.embed": "Embed",
"status.favourite": "Favourite",
"status.filtered": "Filtered",
+ "status.history.created": "{name} created {date}",
+ "status.history.edited": "{name} edited {date}",
"status.load_more": "Load more",
"status.media_hidden": "Media hidden",
"status.mention": "Mention @{name}",
diff --git a/app/javascript/mastodon/locales/uk.json b/app/javascript/mastodon/locales/uk.json
index 808701957..876f8aa8a 100644
--- a/app/javascript/mastodon/locales/uk.json
+++ b/app/javascript/mastodon/locales/uk.json
@@ -18,12 +18,12 @@
"account.followers": "Підписники",
"account.followers.empty": "Ніхто ще не підписався на цього користувача.",
"account.followers_counter": "{count, plural, one {{counter} Підписник} few {{counter} Підписники} many {{counter} Підписників} other {{counter} Підписники}}",
+ "account.following": "Following",
"account.following_counter": "{count, plural, one {{counter} Підписка} few {{counter} Підписки} many {{counter} Підписок} other {{counter} Підписки}}",
"account.follows.empty": "Цей користувач ще ні на кого не підписався.",
"account.follows_you": "Підписаний(-а) на вас",
"account.hide_reblogs": "Сховати передмухи від @{name}",
"account.joined": "Долучення {date}",
- "account.last_status": "Крайня активність",
"account.link_verified_on": "Права власності на це посилання були перевірені {date}",
"account.locked_info": "Статус конфіденційності цього облікового запису встановлено у заблокований. Власник вручну переглядає, хто може за ним стежити.",
"account.media": "Медіа",
@@ -32,7 +32,6 @@
"account.mute": "Заглушити @{name}",
"account.mute_notifications": "Не показувати сповіщення від @{name}",
"account.muted": "Заглушений",
- "account.never_active": "Ніколи",
"account.posts": "Дмухи",
"account.posts_with_replies": "Дмухи й відповіді",
"account.report": "Поскаржитися на @{name}",
@@ -42,21 +41,24 @@
"account.statuses_counter": "{count, plural, one {{counter} Пост} few {{counter} Пости} many {{counter} Постів} other {{counter} Пости}}",
"account.unblock": "Розблокувати @{name}",
"account.unblock_domain": "Розблокувати {domain}",
+ "account.unblock_short": "Розблокувати",
"account.unendorse": "Не публікувати у профілі",
"account.unfollow": "Відписатися",
"account.unmute": "Зняти глушення з @{name}",
"account.unmute_notifications": "Показувати сповіщення від @{name}",
+ "account.unmute_short": "Unmute",
"account_note.placeholder": "Коментарі відсутні",
- "admin.dashboard.retention": "Retention",
- "admin.dashboard.retention.average": "Average",
- "admin.dashboard.retention.cohort": "Sign-up month",
- "admin.dashboard.retention.cohort_size": "New users",
+ "admin.dashboard.daily_retention": "User retention rate by day after sign-up",
+ "admin.dashboard.monthly_retention": "User retention rate by month after sign-up",
+ "admin.dashboard.retention.average": "Середнє",
+ "admin.dashboard.retention.cohort": "Місяць реєстрації",
+ "admin.dashboard.retention.cohort_size": "Нові користувачі",
"alert.rate_limited.message": "Спробуйте ще раз через {retry_time, time, medium}.",
"alert.rate_limited.title": "Швидкість обмежена",
"alert.unexpected.message": "Трапилась неочікувана помилка.",
"alert.unexpected.title": "Ой!",
"announcement.announcement": "Оголошення",
- "attachments_list.unprocessed": "(unprocessed)",
+ "attachments_list.unprocessed": "(не оброблено)",
"autosuggest_hashtag.per_week": "{count} в тиждень",
"boost_modal.combo": "Ви можете натиснути {combo}, щоб пропустити це наступного разу",
"bundle_column_error.body": "Щось пішло не так під час завантаження компоненту.",
@@ -104,6 +106,7 @@
"compose_form.poll.switch_to_single": "Перемкнути у режим вибору однієї відповіді",
"compose_form.publish": "Дмухнути",
"compose_form.publish_loud": "{publish}!",
+ "compose_form.save_changes": "Зберегти зміни",
"compose_form.sensitive.hide": "{count, plural, one {Позначити медіа делікатним} other {Позначити медіа делікатними}}",
"compose_form.sensitive.marked": "{count, plural, one {Медіа позначене делікатним} other {Медіа позначені делікатними}}",
"compose_form.sensitive.unmarked": "{count, plural, one {Медіа не позначене делікатним} other {Медіа не позначені делікатними}}",
@@ -118,8 +121,8 @@
"confirmations.delete.message": "Ви впевнені, що хочете видалити цей допис?",
"confirmations.delete_list.confirm": "Видалити",
"confirmations.delete_list.message": "Ви впевнені, що хочете видалити цей список назавжди?",
- "confirmations.discard_edit_media.confirm": "Discard",
- "confirmations.discard_edit_media.message": "You have unsaved changes to the media description or preview, discard them anyway?",
+ "confirmations.discard_edit_media.confirm": "Відкинути",
+ "confirmations.discard_edit_media.message": "У вас є незбережені зміни в описі медіа або попереднього перегляду, все одно відкинути їх?",
"confirmations.domain_block.confirm": "Сховати весь домен",
"confirmations.domain_block.message": "Ви точно, точно впевнені, що хочете заблокувати весь домен {domain}? У більшості випадків для нормальної роботи краще заблокувати/заглушити лише деяких користувачів. Ви не зможете бачити контент з цього домену у будь-яких стрічках або ваших сповіщеннях. Ваші підписники з цього домену будуть відписані від вас.",
"confirmations.logout.confirm": "Вийти",
@@ -165,6 +168,7 @@
"empty_column.community": "Локальна стрічка пуста. Напишіть щось, щоб розігріти народ!",
"empty_column.direct": "У вас ще немає прямих повідомлень. Коли ви відправите чи отримаєте якесь, воно з'явиться тут.",
"empty_column.domain_blocks": "Тут поки немає прихованих доменів.",
+ "empty_column.explore_statuses": "Nothing is trending right now. Check back later!",
"empty_column.favourited_statuses": "У вас ще немає вподобаних дмухів. Коли ви щось вподобаєте, воно з'явиться тут.",
"empty_column.favourites": "Ніхто ще не вподобав цього дмуху. Коли хтось це зробить, вони з'являться тут.",
"empty_column.follow_recommendations": "Схоже, для вас не буде створено жодної пропозиції. Ви можете спробувати скористатися пошуком людей, яких ви можете знати або переглянути популярні хештеґи.",
@@ -183,6 +187,12 @@
"error.unexpected_crash.next_steps_addons": "Спробуйте їх вимкнути та оновити сторінку. Якщо це не допомагає, ви можете використовувати Mastodon через інший браузер або окремий застосунок.",
"errors.unexpected_crash.copy_stacktrace": "Скопіювати трасування стека у буфер обміну",
"errors.unexpected_crash.report_issue": "Повідомити про проблему",
+ "explore.search_results": "Результати пошуку",
+ "explore.suggested_follows": "Для вас",
+ "explore.title": "Огляд",
+ "explore.trending_links": "Новини",
+ "explore.trending_statuses": "Дописи",
+ "explore.trending_tags": "Хештеґи",
"follow_recommendations.done": "Готово",
"follow_recommendations.heading": "Підпишіться на людей, чиї дописи ви хочете бачити! Ось деякі пропозиції.",
"follow_recommendations.lead": "Дописи від людей, за якими ви стежите, з'являться в хронологічному порядку у вашій домашній стрічці. Не бійся помилятися, ви можете відписатися від людей так само легко в будь-який час!",
@@ -284,6 +294,7 @@
"navigation_bar.discover": "Знайти",
"navigation_bar.domain_blocks": "Приховані домени",
"navigation_bar.edit_profile": "Редагувати профіль",
+ "navigation_bar.explore": "Explore",
"navigation_bar.favourites": "Вподобане",
"navigation_bar.filters": "Приховані слова",
"navigation_bar.follow_requests": "Запити на підписку",
@@ -298,6 +309,7 @@
"navigation_bar.preferences": "Налаштування",
"navigation_bar.public_timeline": "Глобальна стрічка",
"navigation_bar.security": "Безпека",
+ "notification.admin.sign_up": "{name} приєднується",
"notification.favourite": "{name} вподобав(-ла) ваш допис",
"notification.follow": "{name} підписався(-лась) на вас",
"notification.follow_request": "{name} відправив(-ла) запит на підписку",
@@ -306,13 +318,15 @@
"notification.poll": "Опитування, у якому ви голосували, закінчилося",
"notification.reblog": "{name} передмухнув(-ла) Ваш допис",
"notification.status": "{name} щойно дописує",
+ "notification.update": "{name} змінює допис",
"notifications.clear": "Очистити сповіщення",
"notifications.clear_confirmation": "Ви впевнені, що хочете назавжди видалити всі сповіщеня?",
+ "notifications.column_settings.admin.sign_up": "Нові реєстрації:",
"notifications.column_settings.alert": "Сповіщення на комп'ютері",
"notifications.column_settings.favourite": "Вподобане:",
"notifications.column_settings.filter_bar.advanced": "Показати всі категорії",
"notifications.column_settings.filter_bar.category": "Панель швидкого фільтру",
- "notifications.column_settings.filter_bar.show": "Показати",
+ "notifications.column_settings.filter_bar.show_bar": "Показати панель фільтра",
"notifications.column_settings.follow": "Нові підписники:",
"notifications.column_settings.follow_request": "Нові запити на підписку:",
"notifications.column_settings.mention": "Згадки:",
@@ -322,7 +336,9 @@
"notifications.column_settings.show": "Показати в колонці",
"notifications.column_settings.sound": "Відтворювати звуки",
"notifications.column_settings.status": "Нові дмухи:",
- "notifications.column_settings.unread_markers.category": "Мітки непрочитаних сповіщень",
+ "notifications.column_settings.unread_notifications.category": "Непрочитані сповіщення",
+ "notifications.column_settings.unread_notifications.highlight": "Виділити непрочитані сповіщення",
+ "notifications.column_settings.update": "Зміни:",
"notifications.filter.all": "Усі",
"notifications.filter.boosts": "Передмухи",
"notifications.filter.favourites": "Улюблені",
@@ -346,7 +362,7 @@
"poll.total_votes": "{count, plural, one {# голос} few {# голоси} many {# голосів} other {# голосів}}",
"poll.vote": "Проголосувати",
"poll.voted": "Ви голосували за цю відповідь",
- "poll.votes": "{votes, plural, one {# vote} other {# votes}}",
+ "poll.votes": "{votes, plural, one {# голос} few {# голоси} many {# голосів} other {# голоса}}",
"poll_button.add_poll": "Додати опитування",
"poll_button.remove_poll": "Видалити опитування",
"privacy.change": "Змінити видимість допису",
@@ -362,18 +378,54 @@
"regeneration_indicator.label": "Завантаження…",
"regeneration_indicator.sublabel": "Ваша домашня стрічка готується!",
"relative_time.days": "{number}д",
+ "relative_time.full.days": "{number, plural, one {# день} few {# дні} other {# днів}} тому",
+ "relative_time.full.hours": "{number, plural, one {# година} few {# години} other {# годин}} тому",
+ "relative_time.full.just_now": "щойно",
+ "relative_time.full.minutes": "{number, plural, one {# хвилина} few {# хвилини} other {# хвилин}} тому",
+ "relative_time.full.seconds": "{number, plural, one {# секунда} few {# секунди} other {# секунд}} тому",
"relative_time.hours": "{number}г",
"relative_time.just_now": "щойно",
"relative_time.minutes": "{number}х",
"relative_time.seconds": "{number}с",
"relative_time.today": "сьогодні",
"reply_indicator.cancel": "Відмінити",
+ "report.block": "Заблокувати",
+ "report.block_explanation": "You will not see their posts. They will not be able to see your posts or follow you. They will be able to tell that they are blocked.",
+ "report.categories.other": "Інше",
+ "report.categories.spam": "Спам",
+ "report.categories.violation": "Контент порушує одне або кілька правил сервера",
+ "report.category.subtitle": "Choose the best match",
+ "report.category.title": "Tell us what's going on with this {type}",
+ "report.category.title_account": "профіль",
+ "report.category.title_status": "допис",
+ "report.close": "Готово",
+ "report.comment.title": "Is there anything else you think we should know?",
"report.forward": "Надіслати до {target}",
"report.forward_hint": "Це акаунт з іншого серверу. Відправити анонімізовану копію скарги і туди?",
- "report.hint": "Скаргу буде відправлено модераторам Вашого сайту. Ви можете надати їм пояснення, чому ви скаржитесь на акаунт нижче:",
+ "report.mute": "Mute",
+ "report.mute_explanation": "You will not see their posts. They can still follow you and see your posts and will not know that they are muted.",
+ "report.next": "Далі",
"report.placeholder": "Додаткові коментарі",
+ "report.reasons.dislike": "Мені це не подобається",
+ "report.reasons.dislike_description": "It is not something you want to see",
+ "report.reasons.other": "Це щось інше",
+ "report.reasons.other_description": "The issue does not fit into other categories",
+ "report.reasons.spam": "Це спам",
+ "report.reasons.spam_description": "Malicious links, fake engagement, or repetitive replies",
+ "report.reasons.violation": "It violates server rules",
+ "report.reasons.violation_description": "You are aware that it breaks specific rules",
+ "report.rules.subtitle": "Select all that apply",
+ "report.rules.title": "Which rules are being violated?",
+ "report.statuses.subtitle": "Select all that apply",
+ "report.statuses.title": "Are there any posts that back up this report?",
"report.submit": "Відправити",
"report.target": "Скаржимося на {target}",
+ "report.thanks.take_action": "Here are your options for controlling what you see on Mastodon:",
+ "report.thanks.take_action_actionable": "While we review this, you can take action against @{name}:",
+ "report.thanks.title": "Don't want to see this?",
+ "report.thanks.title_actionable": "Thanks for reporting, we'll look into this.",
+ "report.unfollow": "Unfollow @{name}",
+ "report.unfollow_explanation": "You are following this account. To not see their posts in your home feed anymore, unfollow them.",
"search.placeholder": "Пошук",
"search_popout.search_format": "Розширений формат пошуку",
"search_popout.tips.full_text": "Пошук за текстом знаходить статуси, які ви написали, вподобали, передмухнули, або в яких вас згадували. Також він знаходить імена користувачів, реальні імена та хештеґи.",
@@ -382,7 +434,9 @@
"search_popout.tips.text": "Пошук за текстом знаходить імена користувачів, реальні імена та хештеґи",
"search_popout.tips.user": "користувач",
"search_results.accounts": "Люди",
+ "search_results.all": "Усе",
"search_results.hashtags": "Хештеґи",
+ "search_results.nothing_found": "Could not find anything for these search terms",
"search_results.statuses": "Дмухів",
"search_results.statuses_fts_disabled": "Пошук дмухів за вмістом недоступний на цьому сервері Mastodon.",
"search_results.total": "{count, number} {count, plural, one {результат} few {результати} many {результатів} other {результатів}}",
@@ -396,9 +450,14 @@
"status.delete": "Видалити",
"status.detailed_status": "Детальний вигляд бесіди",
"status.direct": "Пряме повідомлення до @{name}",
+ "status.edit": "Редагувати",
+ "status.edited": "Відредаговано {date}",
+ "status.edited_x_times": "Відредаговано {count, plural, one {{count} раз} few {{count} рази} many {{counter} разів} other {{counter} разів}}",
"status.embed": "Вбудувати",
"status.favourite": "Подобається",
"status.filtered": "Відфільтровано",
+ "status.history.created": "{name} створює {date}",
+ "status.history.edited": "{name} змінює {date}",
"status.load_more": "Завантажити більше",
"status.media_hidden": "Медіа приховано",
"status.mention": "Згадати @{name}",
@@ -462,7 +521,7 @@
"upload_form.video_description": "Опишіть для людей із вадами слуху або зору",
"upload_modal.analyzing_picture": "Аналізуємо малюнок…",
"upload_modal.apply": "Застосувати",
- "upload_modal.applying": "Applying…",
+ "upload_modal.applying": "Застосування…",
"upload_modal.choose_image": "Вибрати зображення",
"upload_modal.description_placeholder": "Щурячий бугай із їжаком-харцизом в'ючись підписали ґешефт у єнах",
"upload_modal.detect_text": "Виявити текст на малюнку",
diff --git a/app/javascript/mastodon/locales/ur.json b/app/javascript/mastodon/locales/ur.json
index 55f6856d2..e5aad2355 100644
--- a/app/javascript/mastodon/locales/ur.json
+++ b/app/javascript/mastodon/locales/ur.json
@@ -18,12 +18,12 @@
"account.followers": "پیروکار",
"account.followers.empty": "\"ہنوز اس صارف کی کوئی پیروی نہیں کرتا\".",
"account.followers_counter": "{count, plural,one {{counter} پیروکار} other {{counter} پیروکار}}",
+ "account.following": "Following",
"account.following_counter": "{count, plural, one {{counter} پیروی کر رہے ہیں} other {{counter} پیروی کر رہے ہیں}}",
"account.follows.empty": "\"یہ صارف ہنوز کسی کی پیروی نہیں کرتا ہے\".",
"account.follows_you": "آپ کا پیروکار ہے",
"account.hide_reblogs": "@{name} سے فروغ چھپائیں",
"account.joined": "{date} شامل ہوئے",
- "account.last_status": "آخری فعال",
"account.link_verified_on": "اس لنک کی ملکیت کی توثیق {date} پر کی گئی تھی",
"account.locked_info": "اس اکاونٹ کا اخفائی ضابطہ مقفل ہے۔ صارف کی پیروی کون کر سکتا ہے اس کا جائزہ وہ خود لیتا ہے.",
"account.media": "وسائل",
@@ -32,7 +32,6 @@
"account.mute": "خاموش @{name}",
"account.mute_notifications": "@{name} سے اطلاعات خاموش کریں",
"account.muted": "خاموش کردہ",
- "account.never_active": "کبھی نہیں",
"account.posts": "ٹوٹ",
"account.posts_with_replies": "ٹوٹ اور جوابات",
"account.report": "@{name} اطلاع کریں",
@@ -42,12 +41,15 @@
"account.statuses_counter": "{count, plural, one {{counter} Toot} other {{counter} Toots}}",
"account.unblock": "@{name} کو بحال کریں",
"account.unblock_domain": "{domain} کو نہ چھپائیں",
+ "account.unblock_short": "Unblock",
"account.unendorse": "مشخص پر نمایاں نہ کریں",
"account.unfollow": "پیروی ترک کریں",
"account.unmute": "@{name} کو با آواز کریں",
"account.unmute_notifications": "@{name} سے اطلاعات کو با آواز کریں",
+ "account.unmute_short": "Unmute",
"account_note.placeholder": "Click to add a note",
- "admin.dashboard.retention": "Retention",
+ "admin.dashboard.daily_retention": "User retention rate by day after sign-up",
+ "admin.dashboard.monthly_retention": "User retention rate by month after sign-up",
"admin.dashboard.retention.average": "Average",
"admin.dashboard.retention.cohort": "Sign-up month",
"admin.dashboard.retention.cohort_size": "New users",
@@ -104,6 +106,7 @@
"compose_form.poll.switch_to_single": "کسی ایک انتخاب کے لیے پول تبدیل کریں",
"compose_form.publish": "ٹوٹ",
"compose_form.publish_loud": "{publish}!",
+ "compose_form.save_changes": "Save changes",
"compose_form.sensitive.hide": "وسائل کو حساس نشاندہ کریں",
"compose_form.sensitive.marked": "وسائل حساس نشاندہ ہے",
"compose_form.sensitive.unmarked": "{count, plural, one {میڈیا کو حساس کے طور پر نشان زد نہیں کیا گیا ہے} other {میڈیا کو حساس کے طور پر نشان زد نہیں کیا گیا ہے}}",
@@ -165,6 +168,7 @@
"empty_column.community": "مقامی جدول خالی ہے. کچھ تحریر کریں تاکہ بات آگے بڑھے!",
"empty_column.direct": "آپ کیلئے کوئی راست پیغام نہیں ہے. جب آپ بھیجیں گے یا وصول کریں گے، یہاں نظر آئےگا.",
"empty_column.domain_blocks": "ابھی تک کوئی چھپا ہوا ڈومین نہیں ہے.",
+ "empty_column.explore_statuses": "Nothing is trending right now. Check back later!",
"empty_column.favourited_statuses": "آپ کا کوئی پسندیدہ ٹوٹ نہیں ہے. جب آپ پسند کریں گے، یہاں نظر آئےگا.",
"empty_column.favourites": "ابھی تک کسی نے بھی اس ٹوٹ کو پسند نہیں کیا ہے. جب بھی کوئی اسے پسند کرے گا، ان کا نام یہاں نظر آئے گا.",
"empty_column.follow_recommendations": "Looks like no suggestions could be generated for you. You can try using search to look for people you might know or explore trending hashtags.",
@@ -183,6 +187,12 @@
"error.unexpected_crash.next_steps_addons": "Try disabling them and refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
"errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard",
"errors.unexpected_crash.report_issue": "مسئلہ کی اطلاع کریں",
+ "explore.search_results": "Search results",
+ "explore.suggested_follows": "For you",
+ "explore.title": "Explore",
+ "explore.trending_links": "News",
+ "explore.trending_statuses": "Posts",
+ "explore.trending_tags": "Hashtags",
"follow_recommendations.done": "Done",
"follow_recommendations.heading": "Follow people you'd like to see posts from! Here are some suggestions.",
"follow_recommendations.lead": "Posts from people you follow will show up in chronological order on your home feed. Don't be afraid to make mistakes, you can unfollow people just as easily any time!",
@@ -284,6 +294,7 @@
"navigation_bar.discover": "دریافت کریں",
"navigation_bar.domain_blocks": "Hidden domains",
"navigation_bar.edit_profile": "پروفائل میں ترمیم کریں",
+ "navigation_bar.explore": "Explore",
"navigation_bar.favourites": "پسندیدہ",
"navigation_bar.filters": "خاموش کردہ الفاظ",
"navigation_bar.follow_requests": "پیروی کی درخواستیں",
@@ -298,6 +309,7 @@
"navigation_bar.preferences": "ترجیحات",
"navigation_bar.public_timeline": "وفاقی ٹائم لائن",
"navigation_bar.security": "سیکورٹی",
+ "notification.admin.sign_up": "{name} signed up",
"notification.favourite": "{name} favourited your status",
"notification.follow": "{name} آپ کی پیروی کی",
"notification.follow_request": "{name} نے آپ کی پیروی کی درخواست کی",
@@ -306,13 +318,15 @@
"notification.poll": "آپ کا ووٹ دیا گیا ایک پول ختم ہو گیا ہے",
"notification.reblog": "{name} boosted your status",
"notification.status": "{name} نے ابھی ابھی پوسٹ کیا",
+ "notification.update": "{name} edited a post",
"notifications.clear": "اطلاعات ہٹائیں",
"notifications.clear_confirmation": "کیا آپ واقعی اپنی تمام اطلاعات کو صاف کرنا چاہتے ہیں؟",
+ "notifications.column_settings.admin.sign_up": "New sign-ups:",
"notifications.column_settings.alert": "ڈیسک ٹاپ اطلاعات",
"notifications.column_settings.favourite": "پسندیدہ:",
"notifications.column_settings.filter_bar.advanced": "تمام زمرے دکھائیں",
"notifications.column_settings.filter_bar.category": "Quick filter bar",
- "notifications.column_settings.filter_bar.show": "Show",
+ "notifications.column_settings.filter_bar.show_bar": "Show filter bar",
"notifications.column_settings.follow": "New followers:",
"notifications.column_settings.follow_request": "New follow requests:",
"notifications.column_settings.mention": "Mentions:",
@@ -322,7 +336,9 @@
"notifications.column_settings.show": "Show in column",
"notifications.column_settings.sound": "Play sound",
"notifications.column_settings.status": "New toots:",
- "notifications.column_settings.unread_markers.category": "Unread notification markers",
+ "notifications.column_settings.unread_notifications.category": "Unread notifications",
+ "notifications.column_settings.unread_notifications.highlight": "Highlight unread notifications",
+ "notifications.column_settings.update": "Edits:",
"notifications.filter.all": "All",
"notifications.filter.boosts": "Boosts",
"notifications.filter.favourites": "Favourites",
@@ -362,18 +378,54 @@
"regeneration_indicator.label": "Loading…",
"regeneration_indicator.sublabel": "Your home feed is being prepared!",
"relative_time.days": "{number}d",
+ "relative_time.full.days": "{number, plural, one {# day} other {# days}} ago",
+ "relative_time.full.hours": "{number, plural, one {# hour} other {# hours}} ago",
+ "relative_time.full.just_now": "just now",
+ "relative_time.full.minutes": "{number, plural, one {# minute} other {# minutes}} ago",
+ "relative_time.full.seconds": "{number, plural, one {# second} other {# seconds}} ago",
"relative_time.hours": "{number}h",
"relative_time.just_now": "now",
"relative_time.minutes": "{number}m",
"relative_time.seconds": "{number}s",
"relative_time.today": "today",
"reply_indicator.cancel": "Cancel",
+ "report.block": "Block",
+ "report.block_explanation": "You will not see their posts. They will not be able to see your posts or follow you. They will be able to tell that they are blocked.",
+ "report.categories.other": "Other",
+ "report.categories.spam": "Spam",
+ "report.categories.violation": "Content violates one or more server rules",
+ "report.category.subtitle": "Choose the best match",
+ "report.category.title": "Tell us what's going on with this {type}",
+ "report.category.title_account": "profile",
+ "report.category.title_status": "post",
+ "report.close": "Done",
+ "report.comment.title": "Is there anything else you think we should know?",
"report.forward": "Forward to {target}",
"report.forward_hint": "The account is from another server. Send an anonymized copy of the report there as well?",
- "report.hint": "The report will be sent to your server moderators. You can provide an explanation of why you are reporting this account below:",
- "report.placeholder": "Additional comments",
- "report.submit": "Submit",
+ "report.mute": "Mute",
+ "report.mute_explanation": "You will not see their posts. They can still follow you and see your posts and will not know that they are muted.",
+ "report.next": "Next",
+ "report.placeholder": "Type or paste additional comments",
+ "report.reasons.dislike": "I don't like it",
+ "report.reasons.dislike_description": "It is not something you want to see",
+ "report.reasons.other": "It's something else",
+ "report.reasons.other_description": "The issue does not fit into other categories",
+ "report.reasons.spam": "It's spam",
+ "report.reasons.spam_description": "Malicious links, fake engagement, or repetitive replies",
+ "report.reasons.violation": "It violates server rules",
+ "report.reasons.violation_description": "You are aware that it breaks specific rules",
+ "report.rules.subtitle": "Select all that apply",
+ "report.rules.title": "Which rules are being violated?",
+ "report.statuses.subtitle": "Select all that apply",
+ "report.statuses.title": "Are there any posts that back up this report?",
+ "report.submit": "Submit report",
"report.target": "Report {target}",
+ "report.thanks.take_action": "Here are your options for controlling what you see on Mastodon:",
+ "report.thanks.take_action_actionable": "While we review this, you can take action against @{name}:",
+ "report.thanks.title": "Don't want to see this?",
+ "report.thanks.title_actionable": "Thanks for reporting, we'll look into this.",
+ "report.unfollow": "Unfollow @{name}",
+ "report.unfollow_explanation": "You are following this account. To not see their posts in your home feed anymore, unfollow them.",
"search.placeholder": "Search",
"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.",
@@ -382,7 +434,9 @@
"search_popout.tips.text": "Simple text returns matching display names, usernames and hashtags",
"search_popout.tips.user": "user",
"search_results.accounts": "People",
+ "search_results.all": "All",
"search_results.hashtags": "Hashtags",
+ "search_results.nothing_found": "Could not find anything for these search terms",
"search_results.statuses": "Toots",
"search_results.statuses_fts_disabled": "Searching toots by their content is not enabled on this Mastodon server.",
"search_results.total": "{count, number} {count, plural, one {result} other {results}}",
@@ -396,9 +450,14 @@
"status.delete": "Delete",
"status.detailed_status": "Detailed conversation view",
"status.direct": "Direct message @{name}",
+ "status.edit": "Edit",
+ "status.edited": "Edited {date}",
+ "status.edited_x_times": "Edited {count, plural, one {{count} time} other {{count} times}}",
"status.embed": "Embed",
"status.favourite": "Favourite",
"status.filtered": "Filtered",
+ "status.history.created": "{name} created {date}",
+ "status.history.edited": "{name} edited {date}",
"status.load_more": "Load more",
"status.media_hidden": "Media hidden",
"status.mention": "Mention @{name}",
diff --git a/app/javascript/mastodon/locales/vi.json b/app/javascript/mastodon/locales/vi.json
index 9922707be..d47033881 100644
--- a/app/javascript/mastodon/locales/vi.json
+++ b/app/javascript/mastodon/locales/vi.json
@@ -8,7 +8,7 @@
"account.blocked": "Đã chặn",
"account.browse_more_on_origin_server": "Truy cập trang của người này",
"account.cancel_follow_request": "Hủy yêu cầu theo dõi",
- "account.direct": "Nhắn tin @{name}",
+ "account.direct": "Nhắn riêng @{name}",
"account.disable_notifications": "Không thông báo khi @{name} đăng tút",
"account.domain_blocked": "Người đã chặn",
"account.edit_profile": "Chỉnh sửa trang cá nhân",
@@ -18,12 +18,12 @@
"account.followers": "Người theo dõi",
"account.followers.empty": "Chưa có người theo dõi nào.",
"account.followers_counter": "{count, plural, one {{counter} Người theo dõi} other {{counter} Người theo dõi}}",
+ "account.following": "Đang theo dõi",
"account.following_counter": "{count, plural, one {{counter} Theo dõi} other {{counter} Theo dõi}}",
"account.follows.empty": "Người này chưa theo dõi ai.",
"account.follows_you": "Đang theo dõi bạn",
- "account.hide_reblogs": "Ẩn chia sẻ từ @{name}",
+ "account.hide_reblogs": "Ẩn tút do @{name} đăng lại",
"account.joined": "Đã tham gia {date}",
- "account.last_status": "Online",
"account.link_verified_on": "Liên kết này đã được xác thực vào {date}",
"account.locked_info": "Đây là tài khoản riêng tư. Họ sẽ tự mình xét duyệt các yêu cầu theo dõi.",
"account.media": "Media",
@@ -32,33 +32,35 @@
"account.mute": "Ẩn @{name}",
"account.mute_notifications": "Tắt thông báo từ @{name}",
"account.muted": "Đã ẩn",
- "account.never_active": "Chưa có bất cứ hoạt động nào",
"account.posts": "Tút",
"account.posts_with_replies": "Trả lời",
"account.report": "Báo cáo @{name}",
"account.requested": "Đang chờ chấp thuận. Nhấp vào đây để hủy yêu cầu theo dõi",
"account.share": "Chia sẻ trang @{name}",
- "account.show_reblogs": "Hiện chia sẻ từ @{name}",
+ "account.show_reblogs": "Hiện tút do @{name} đăng lại",
"account.statuses_counter": "{count, plural, one {{counter} Tút} other {{counter} Tút}}",
"account.unblock": "Bỏ chặn @{name}",
"account.unblock_domain": "Bỏ ẩn {domain}",
+ "account.unblock_short": "Bỏ chặn",
"account.unendorse": "Ngưng tôn vinh người này",
"account.unfollow": "Ngưng theo dõi",
"account.unmute": "Bỏ ẩn @{name}",
"account.unmute_notifications": "Mở lại thông báo từ @{name}",
+ "account.unmute_short": "Bỏ ẩn",
"account_note.placeholder": "Nhấn để thêm",
- "admin.dashboard.retention": "Retention",
- "admin.dashboard.retention.average": "Average",
- "admin.dashboard.retention.cohort": "Sign-up month",
- "admin.dashboard.retention.cohort_size": "New users",
+ "admin.dashboard.daily_retention": "Tỉ lệ người dùng sau đăng ký ở lại theo ngày",
+ "admin.dashboard.monthly_retention": "Tỉ lệ người dùng ở lại sau khi đăng ký",
+ "admin.dashboard.retention.average": "Trung bình",
+ "admin.dashboard.retention.cohort": "Tháng đăng ký",
+ "admin.dashboard.retention.cohort_size": "Người dùng mới",
"alert.rate_limited.message": "Vui lòng thử lại sau {retry_time, time, medium}.",
"alert.rate_limited.title": "Vượt giới hạn",
"alert.unexpected.message": "Đã xảy ra lỗi không mong muốn.",
"alert.unexpected.title": "Ốiii!",
"announcement.announcement": "Thông báo chung",
- "attachments_list.unprocessed": "(unprocessed)",
+ "attachments_list.unprocessed": "(chưa xử lí)",
"autosuggest_hashtag.per_week": "{count} mỗi tuần",
- "boost_modal.combo": "Nhấn {combo} để chia sẻ nhanh hơn",
+ "boost_modal.combo": "Nhấn {combo} để bỏ qua bước này",
"bundle_column_error.body": "Đã có lỗi xảy ra trong khi tải nội dung này.",
"bundle_column_error.retry": "Thử lại",
"bundle_column_error.title": "Không có kết nối internet",
@@ -104,6 +106,7 @@
"compose_form.poll.switch_to_single": "Chỉ cho phép chọn duy nhất một lựa chọn",
"compose_form.publish": "Đăng tút",
"compose_form.publish_loud": "{publish}!",
+ "compose_form.save_changes": "Lưu thay đổi",
"compose_form.sensitive.hide": "{count, plural, other {Đánh dấu nội dung nhạy cảm}}",
"compose_form.sensitive.marked": "{count, plural, other {Nội dung này nhạy cảm}}",
"compose_form.sensitive.unmarked": "{count, plural, other {Nội dung này bình thường}}",
@@ -118,8 +121,8 @@
"confirmations.delete.message": "Bạn \bthật sự muốn xóa tút này?",
"confirmations.delete_list.confirm": "Xóa bỏ",
"confirmations.delete_list.message": "Bạn thật sự muốn xóa vĩnh viễn danh sách này?",
- "confirmations.discard_edit_media.confirm": "Discard",
- "confirmations.discard_edit_media.message": "You have unsaved changes to the media description or preview, discard them anyway?",
+ "confirmations.discard_edit_media.confirm": "Bỏ qua",
+ "confirmations.discard_edit_media.message": "Bạn chưa lưu thay đổi đối với phần mô tả hoặc bản xem trước của media, vẫn bỏ luôn?",
"confirmations.domain_block.confirm": "Ẩn toàn bộ máy chủ",
"confirmations.domain_block.message": "Bạn thật sự muốn ẩn toàn bộ nội dung từ {domain}? Sẽ hợp lý hơn nếu bạn chỉ chặn hoặc ẩn một vài tài khoản cụ thể. Ẩn toàn bộ nội dung từ máy chủ sẽ khiến bạn không còn thấy nội dung từ máy chủ đó ở bất kỳ nơi nào, kể cả thông báo. Người quan tâm bạn từ máy chủ đó cũng sẽ bị xóa luôn.",
"confirmations.logout.confirm": "Đăng xuất",
@@ -128,7 +131,7 @@
"confirmations.mute.explanation": "Điều này sẽ khiến tút của họ và những tút có nhắc đến họ bị ẩn, tuy nhiên họ vẫn có thể xem tút của bạn và theo dõi bạn.",
"confirmations.mute.message": "Bạn thật sự muốn ẩn {name}?",
"confirmations.redraft.confirm": "Xóa & viết lại",
- "confirmations.redraft.message": "Bạn thật sự muốn xóa tút và viết lại? Điều này sẽ xóa mất những lượt thích và chia sẻ của tút, cũng như những trả lời sẽ không còn nội dung gốc.",
+ "confirmations.redraft.message": "Bạn thật sự muốn xóa tút và viết lại? Điều này sẽ xóa mất những lượt thích và đăng lại của tút, cũng như những trả lời sẽ không còn nội dung gốc.",
"confirmations.reply.confirm": "Trả lời",
"confirmations.reply.message": "Nội dung bạn đang soạn thảo sẽ bị ghi đè, bạn có tiếp tục?",
"confirmations.unfollow.confirm": "Ngưng theo dõi",
@@ -165,6 +168,7 @@
"empty_column.community": "Máy chủ của bạn chưa có tút nào công khai. Bạn hãy thử viết gì đó đi!",
"empty_column.direct": "Bạn chưa có tin nhắn nào. Khi bạn gửi hoặc nhận tin nhắn, nó sẽ hiển thị ở đây.",
"empty_column.domain_blocks": "Chưa ẩn bất kỳ máy chủ nào.",
+ "empty_column.explore_statuses": "Chưa có xu hướng nào. Kiểm tra lại sau!",
"empty_column.favourited_statuses": "Bạn chưa thích tút nào. Hãy thử đi, nó sẽ xuất hiện ở đây.",
"empty_column.favourites": "Chưa có ai thích tút này.",
"empty_column.follow_recommendations": "Bạn chưa có gợi ý theo dõi nào. Hãy thử tìm kiếm những người thú vị hoặc khám phá những hashtag xu hướng.",
@@ -175,7 +179,7 @@
"empty_column.list": "Chưa có tút. Khi những người trong danh sách này đăng tút mới, chúng sẽ xuất hiện ở đây.",
"empty_column.lists": "Bạn chưa tạo danh sách nào.",
"empty_column.mutes": "Bạn chưa ẩn bất kỳ ai.",
- "empty_column.notifications": "Bạn chưa có thông báo nào. Hãy thử theo dõi hoặc nhắn tin cho một ai đó.",
+ "empty_column.notifications": "Bạn chưa có thông báo nào. Hãy thử theo dõi hoặc nhắn riêng cho một ai đó.",
"empty_column.public": "Trống trơn! Bạn hãy viết gì đó hoặc bắt đầu theo dõi những người khác",
"error.unexpected_crash.explanation": "Trang này có thể không hiển thị chính xác do lỗi lập trình Mastodon hoặc vấn đề tương thích trình duyệt.",
"error.unexpected_crash.explanation_addons": "Trang này không thể hiển thị do xung khắc với add-on của trình duyệt hoặc công cụ tự động dịch ngôn ngữ.",
@@ -183,6 +187,12 @@
"error.unexpected_crash.next_steps_addons": "Hãy tắt add-on và làm tươi trang. Nếu vẫn không được, bạn nên thử đăng nhập Mastodon trên trình duyệt khác hoặc app khác.",
"errors.unexpected_crash.copy_stacktrace": "Sao chép stacktrace vào clipboard",
"errors.unexpected_crash.report_issue": "Báo cáo lỗi",
+ "explore.search_results": "Kết quả tìm kiếm",
+ "explore.suggested_follows": "Dành cho bạn",
+ "explore.title": "Khám phá",
+ "explore.trending_links": "Tin tức",
+ "explore.trending_statuses": "Tút",
+ "explore.trending_tags": "Hashtag",
"follow_recommendations.done": "Xong",
"follow_recommendations.heading": "Theo dõi những người bạn muốn đọc tút của họ! Dưới đây là vài gợi ý.",
"follow_recommendations.lead": "Tút từ những người bạn theo dõi sẽ hiện theo thứ tự thời gian trên bảng tin. Đừng ngại, bạn có thể dễ dàng ngưng theo dõi họ bất cứ lúc nào!",
@@ -208,7 +218,7 @@
"hashtag.column_settings.tag_mode.none": "Không chọn",
"hashtag.column_settings.tag_toggle": "Bao gồm thêm hashtag cho cột này",
"home.column_settings.basic": "Tùy chỉnh",
- "home.column_settings.show_reblogs": "Hiện những lượt chia sẻ",
+ "home.column_settings.show_reblogs": "Hiện những lượt đăng lại",
"home.column_settings.show_replies": "Hiện những tút dạng trả lời",
"home.hide_announcements": "Ẩn thông báo",
"home.show_announcements": "Hiện thông báo",
@@ -217,7 +227,7 @@
"intervals.full.minutes": "{number, plural, other {# phút}}",
"keyboard_shortcuts.back": "trở lại",
"keyboard_shortcuts.blocked": "mở danh sách người đã chặn",
- "keyboard_shortcuts.boost": "chia sẻ",
+ "keyboard_shortcuts.boost": "Đăng lại",
"keyboard_shortcuts.column": "mở các mục",
"keyboard_shortcuts.compose": "mở khung soạn tút",
"keyboard_shortcuts.description": "Mô tả",
@@ -284,6 +294,7 @@
"navigation_bar.discover": "Khám phá",
"navigation_bar.domain_blocks": "Máy chủ đã ẩn",
"navigation_bar.edit_profile": "Trang cá nhân",
+ "navigation_bar.explore": "Xu hướng",
"navigation_bar.favourites": "Thích",
"navigation_bar.filters": "Bộ lọc từ ngữ",
"navigation_bar.follow_requests": "Yêu cầu theo dõi",
@@ -298,33 +309,38 @@
"navigation_bar.preferences": "Cài đặt",
"navigation_bar.public_timeline": "Thế giới",
"navigation_bar.security": "Bảo mật",
+ "notification.admin.sign_up": "{name} đăng ký máy chủ của bạn",
"notification.favourite": "{name} thích tút của bạn",
"notification.follow": "{name} theo dõi bạn",
"notification.follow_request": "{name} yêu cầu theo dõi bạn",
"notification.mention": "{name} nhắc đến bạn",
"notification.own_poll": "Cuộc bình chọn của bạn đã kết thúc",
"notification.poll": "Cuộc bình chọn đã kết thúc",
- "notification.reblog": "{name} chia sẻ tút của bạn",
+ "notification.reblog": "{name} đăng lại tút của bạn",
"notification.status": "{name} vừa đăng",
+ "notification.update": "{name} đã viết lại một tút",
"notifications.clear": "Xóa hết thông báo",
"notifications.clear_confirmation": "Bạn thật sự muốn xóa vĩnh viễn tất cả thông báo của mình?",
+ "notifications.column_settings.admin.sign_up": "Lượt đăng ký mới:",
"notifications.column_settings.alert": "Thông báo trên máy tính",
"notifications.column_settings.favourite": "Lượt thích:",
"notifications.column_settings.filter_bar.advanced": "Toàn bộ",
"notifications.column_settings.filter_bar.category": "Phân loại",
- "notifications.column_settings.filter_bar.show": "Lượt nhắc",
+ "notifications.column_settings.filter_bar.show_bar": "Hiện bộ lọc",
"notifications.column_settings.follow": "Người theo dõi mới:",
"notifications.column_settings.follow_request": "Yêu cầu theo dõi mới:",
"notifications.column_settings.mention": "Lượt nhắc đến:",
"notifications.column_settings.poll": "Kết quả bình chọn:",
"notifications.column_settings.push": "Thông báo đẩy",
- "notifications.column_settings.reblog": "Lượt chia sẻ mới:",
+ "notifications.column_settings.reblog": "Lượt đăng lại mới:",
"notifications.column_settings.show": "Thông báo trên thanh menu",
"notifications.column_settings.sound": "Kèm theo tiếng \"bíp\"",
"notifications.column_settings.status": "Tút mới:",
- "notifications.column_settings.unread_markers.category": "Đánh dấu những thông báo chưa đọc",
+ "notifications.column_settings.unread_notifications.category": "Thông báo chưa đọc",
+ "notifications.column_settings.unread_notifications.highlight": "Nổi bật thông báo chưa đọc",
+ "notifications.column_settings.update": "Lượt sửa:",
"notifications.filter.all": "Toàn bộ",
- "notifications.filter.boosts": "Chia sẻ",
+ "notifications.filter.boosts": "Đăng lại",
"notifications.filter.favourites": "Thích",
"notifications.filter.follows": "Đang theo dõi",
"notifications.filter.mentions": "Lượt nhắc đến",
@@ -346,12 +362,12 @@
"poll.total_votes": "{count, plural, other {# người bình chọn}}",
"poll.vote": "Bình chọn",
"poll.voted": "Bạn đã bình chọn rồi",
- "poll.votes": "{votes, plural, one {# vote} other {# votes}}",
+ "poll.votes": "{votes, plural, other {# lượt bình chọn}}",
"poll_button.add_poll": "Tạo bình chọn",
"poll_button.remove_poll": "Hủy cuộc bình chọn",
"privacy.change": "Thay đổi quyền riêng tư",
- "privacy.direct.long": "Gửi trực tiếp cho người được nhắc đến",
- "privacy.direct.short": "Tin nhắn",
+ "privacy.direct.long": "Chỉ người được nhắc đến mới thấy",
+ "privacy.direct.short": "Nhắn riêng",
"privacy.private.long": "Dành riêng cho người theo dõi",
"privacy.private.short": "Riêng tư",
"privacy.public.long": "Hiện trên bảng tin máy chủ",
@@ -362,27 +378,65 @@
"regeneration_indicator.label": "Đang tải…",
"regeneration_indicator.sublabel": "Bảng tin của bạn đang được cập nhật!",
"relative_time.days": "{number} ngày",
+ "relative_time.full.days": "{number, plural, other {# ngày}} trước",
+ "relative_time.full.hours": "{number, plural, other {# giờ}} trước",
+ "relative_time.full.just_now": "vừa xong",
+ "relative_time.full.minutes": "{number, plural, other {# phút}} trước",
+ "relative_time.full.seconds": "{number, plural, other {# giây}} trước",
"relative_time.hours": "{number} giờ",
"relative_time.just_now": "vừa xong",
"relative_time.minutes": "{number} phút",
"relative_time.seconds": "{number}s",
"relative_time.today": "hôm nay",
"reply_indicator.cancel": "Hủy bỏ",
+ "report.block": "Chặn",
+ "report.block_explanation": "Bạn sẽ không thấy tút của họ nữa. Họ cũng không thể theo dõi hoặc thấy tút của bạn. Họ sẽ biết là họ đã bị chặn.",
+ "report.categories.other": "Khác",
+ "report.categories.spam": "Spam",
+ "report.categories.violation": "Vi phạm quy tắc máy chủ",
+ "report.category.subtitle": "Chọn mục gần khớp nhất",
+ "report.category.title": "Nói với họ chuyện gì xảy ra với {type}",
+ "report.category.title_account": "người dùng",
+ "report.category.title_status": "tút",
+ "report.close": "Xong",
+ "report.comment.title": "Bạn nghĩ chúng tôi nên biết thêm điều gì?",
"report.forward": "Chuyển đến {target}",
"report.forward_hint": "Người này thuộc máy chủ khác. Gửi một báo cáo ẩn danh tới máy chủ đó?",
- "report.hint": "Hãy cho quản trị viên biết lý do vì sao bạn báo cáo người này:",
+ "report.mute": "Ẩn",
+ "report.mute_explanation": "Bạn sẽ không thấy tút của họ nữa. Họ cũng không thể theo dõi hoặc thấy tút của bạn. Họ sẽ không biết là họ đã bị bạn ẩn.",
+ "report.next": "Tiếp theo",
"report.placeholder": "Bổ sung thêm",
+ "report.reasons.dislike": "Tôi không thích nó",
+ "report.reasons.dislike_description": "Đó không phải là thứ gì mà bạn muốn thấy",
+ "report.reasons.other": "Một lý do khác",
+ "report.reasons.other_description": "Vấn đề không nằm trong những mục trên",
+ "report.reasons.spam": "Đây là spam",
+ "report.reasons.spam_description": "Liên kết độc hại, tạo tương tác giả hoặc trả lời lặp đi lặp lại",
+ "report.reasons.violation": "Vi phạm quy tắc máy chủ",
+ "report.reasons.violation_description": "Bạn nhận thấy nó vi phạm quy tắc máy chủ",
+ "report.rules.subtitle": "Chọn tất cả những áp dụng",
+ "report.rules.title": "Vi phạm quy tắc nào?",
+ "report.statuses.subtitle": "Chọn tất cả những áp dụng",
+ "report.statuses.title": "Bạn muốn gửi tút nào kèm báo cáo này?",
"report.submit": "Gửi đi",
"report.target": "Báo cáo {target}",
+ "report.thanks.take_action": "Đây là một số cách để kiểm soát thứ bạn nhìn thấy trên Mastodon:",
+ "report.thanks.take_action_actionable": "Trong lúc chờ chúng tôi xem xét, bạn có thể áp dụng hành động với @{name}:",
+ "report.thanks.title": "Không muốn xem thứ này?",
+ "report.thanks.title_actionable": "Cảm ơn đã báo cáo, chúng tôi sẽ xem xét kỹ.",
+ "report.unfollow": "Ngưng theo dõi @{name}",
+ "report.unfollow_explanation": "Bạn đang theo dõi người này. Để không thấy tút của họ trong bảng tin nữa, hãy ngưng theo dõi.",
"search.placeholder": "Tìm kiếm",
"search_popout.search_format": "Gợi ý",
- "search_popout.tips.full_text": "Nội dung trả về bao gồm những tút mà bạn đã viết, thích, chia sẻ hoặc những tút có nhắc đến bạn. Bạn cũng có thể tìm địa chỉ người dùng, tên hiển thị và hashtag.",
+ "search_popout.tips.full_text": "Nội dung trả về bao gồm những tút mà bạn đã viết, thích, đăng lại hoặc những tút có nhắc đến bạn. Bạn cũng có thể tìm địa chỉ người dùng, tên hiển thị và hashtag.",
"search_popout.tips.hashtag": "hashtag",
"search_popout.tips.status": "tút",
"search_popout.tips.text": "Nội dung trả về là tên người dùng, tên hiển thị và hashtag",
"search_popout.tips.user": "người dùng",
"search_results.accounts": "Người dùng",
+ "search_results.all": "Toàn bộ",
"search_results.hashtags": "Hashtags",
+ "search_results.nothing_found": "Không tìm thấy kết quả trùng khớp",
"search_results.statuses": "Tút",
"search_results.statuses_fts_disabled": "Máy chủ của bạn không bật tính năng tìm kiếm tút.",
"search_results.total": "{count, number} {count, plural, one {kết quả} other {kết quả}}",
@@ -390,15 +444,20 @@
"status.admin_status": "Mở tút này trong giao diện quản trị",
"status.block": "Chặn @{name}",
"status.bookmark": "Lưu",
- "status.cancel_reblog_private": "Hủy chia sẻ",
- "status.cannot_reblog": "Không thể chia sẻ tút này",
+ "status.cancel_reblog_private": "Hủy đăng lại",
+ "status.cannot_reblog": "Không thể đăng lại tút này",
"status.copy": "Sao chép URL",
"status.delete": "Xóa",
"status.detailed_status": "Xem chi tiết thêm",
- "status.direct": "Nhắn tin @{name}",
+ "status.direct": "Nhắn riêng @{name}",
+ "status.edit": "Sửa",
+ "status.edited": "Đã sửa {date}",
+ "status.edited_x_times": "Đã sửa {count, plural, other {{count} lần}}",
"status.embed": "Nhúng",
"status.favourite": "Thích",
"status.filtered": "Bộ lọc",
+ "status.history.created": "{name} tạo lúc {date}",
+ "status.history.edited": "{name} sửa lúc {date}",
"status.load_more": "Xem thêm",
"status.media_hidden": "Đã ẩn",
"status.mention": "Nhắc đến @{name}",
@@ -409,10 +468,10 @@
"status.pin": "Ghim lên trang cá nhân",
"status.pinned": "Tút đã ghim",
"status.read_more": "Đọc tiếp",
- "status.reblog": "Chia sẻ",
- "status.reblog_private": "Chia sẻ (Riêng tư)",
- "status.reblogged_by": "{name} chia sẻ",
- "status.reblogs.empty": "Tút này chưa có ai chia sẻ. Nếu có, nó sẽ hiển thị ở đây.",
+ "status.reblog": "Đăng lại",
+ "status.reblog_private": "Đăng lại (Riêng tư)",
+ "status.reblogged_by": "{name} đăng lại",
+ "status.reblogs.empty": "Tút này chưa có ai đăng lại. Nếu có, nó sẽ hiển thị ở đây.",
"status.redraft": "Xóa và viết lại",
"status.remove_bookmark": "Bỏ lưu",
"status.reply": "Trả lời",
@@ -424,7 +483,7 @@
"status.show_less_all": "Thu gọn toàn bộ",
"status.show_more": "Xem thêm",
"status.show_more_all": "Hiển thị tất cả",
- "status.show_thread": "Toàn chủ đề",
+ "status.show_thread": "Xem chuỗi tút này",
"status.uncached_media_warning": "Uncached",
"status.unmute_conversation": "Quan tâm",
"status.unpin": "Bỏ ghim trên trang cá nhân",
@@ -462,7 +521,7 @@
"upload_form.video_description": "Mô tả cho người mất thị lực hoặc không thể nghe",
"upload_modal.analyzing_picture": "Phân tích hình ảnh",
"upload_modal.apply": "Áp dụng",
- "upload_modal.applying": "Applying…",
+ "upload_modal.applying": "Đang áp dụng…",
"upload_modal.choose_image": "Chọn ảnh",
"upload_modal.description_placeholder": "A quick brown fox jumps over the lazy dog",
"upload_modal.detect_text": "Trích văn bản từ trong ảnh",
diff --git a/app/javascript/mastodon/locales/whitelist_kmr.json b/app/javascript/mastodon/locales/whitelist_ckb.json
similarity index 100%
rename from app/javascript/mastodon/locales/whitelist_kmr.json
rename to app/javascript/mastodon/locales/whitelist_ckb.json
diff --git a/app/javascript/mastodon/locales/zgh.json b/app/javascript/mastodon/locales/zgh.json
index 22f6823fe..b321d1525 100644
--- a/app/javascript/mastodon/locales/zgh.json
+++ b/app/javascript/mastodon/locales/zgh.json
@@ -18,12 +18,12 @@
"account.followers": "ⵉⵎⴹⴼⴰⵕⵏ",
"account.followers.empty": "No one follows this user yet.",
"account.followers_counter": "{count, plural, one {{counter} Follower} other {{counter} Followers}}",
+ "account.following": "Following",
"account.following_counter": "{count, plural, one {{counter} Following} other {{counter} Following}}",
"account.follows.empty": "This user doesn't follow anyone yet.",
"account.follows_you": "ⴹⴼⵕⵏ ⴽⵯⵏ",
"account.hide_reblogs": "Hide boosts from @{name}",
"account.joined": "Joined {date}",
- "account.last_status": "Last active",
"account.link_verified_on": "Ownership of this link was checked on {date}",
"account.locked_info": "This account privacy status is set to locked. The owner manually reviews who can follow them.",
"account.media": "ⴰⵙⵏⵖⵎⵉⵙ",
@@ -32,7 +32,6 @@
"account.mute": "ⵥⵥⵉⵥⵏ @{name}",
"account.mute_notifications": "ⵥⵥⵉⵥⵏ ⵜⵉⵏⵖⵎⵉⵙⵉⵏ ⵙⴳ @{name}",
"account.muted": "ⵉⵜⵜⵓⵥⵉⵥⵏ",
- "account.never_active": "ⵓⵙⴰⵔ",
"account.posts": "Toots",
"account.posts_with_replies": "Toots and replies",
"account.report": "Report @{name}",
@@ -42,12 +41,15 @@
"account.statuses_counter": "{count, plural, one {{counter} Toot} other {{counter} Toots}}",
"account.unblock": "Unblock @{name}",
"account.unblock_domain": "Unblock domain {domain}",
+ "account.unblock_short": "Unblock",
"account.unendorse": "Don't feature on profile",
"account.unfollow": "ⴽⴽⵙ ⴰⴹⴼⴼⵓⵕ",
"account.unmute": "Unmute @{name}",
"account.unmute_notifications": "Unmute notifications from @{name}",
+ "account.unmute_short": "Unmute",
"account_note.placeholder": "Click to add a note",
- "admin.dashboard.retention": "Retention",
+ "admin.dashboard.daily_retention": "User retention rate by day after sign-up",
+ "admin.dashboard.monthly_retention": "User retention rate by month after sign-up",
"admin.dashboard.retention.average": "Average",
"admin.dashboard.retention.cohort": "Sign-up month",
"admin.dashboard.retention.cohort_size": "New users",
@@ -104,6 +106,7 @@
"compose_form.poll.switch_to_single": "Change poll to allow for a single choice",
"compose_form.publish": "Toot",
"compose_form.publish_loud": "{publish}!",
+ "compose_form.save_changes": "Save changes",
"compose_form.sensitive.hide": "{count, plural, one {Mark media as sensitive} other {Mark media as sensitive}}",
"compose_form.sensitive.marked": "{count, plural, one {Media is marked as sensitive} other {Media is marked as sensitive}}",
"compose_form.sensitive.unmarked": "{count, plural, one {Media is not marked as sensitive} other {Media is not marked as sensitive}}",
@@ -165,6 +168,7 @@
"empty_column.community": "The local timeline is empty. Write something publicly to get the ball rolling!",
"empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.",
"empty_column.domain_blocks": "There are no blocked domains yet.",
+ "empty_column.explore_statuses": "Nothing is trending right now. Check back later!",
"empty_column.favourited_statuses": "You don't have any favourite toots yet. When you favourite one, it will show up here.",
"empty_column.favourites": "No one has favourited this toot yet. When someone does, they will show up here.",
"empty_column.follow_recommendations": "Looks like no suggestions could be generated for you. You can try using search to look for people you might know or explore trending hashtags.",
@@ -183,6 +187,12 @@
"error.unexpected_crash.next_steps_addons": "Try disabling them and refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
"errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard",
"errors.unexpected_crash.report_issue": "Report issue",
+ "explore.search_results": "Search results",
+ "explore.suggested_follows": "For you",
+ "explore.title": "Explore",
+ "explore.trending_links": "News",
+ "explore.trending_statuses": "Posts",
+ "explore.trending_tags": "Hashtags",
"follow_recommendations.done": "Done",
"follow_recommendations.heading": "Follow people you'd like to see posts from! Here are some suggestions.",
"follow_recommendations.lead": "Posts from people you follow will show up in chronological order on your home feed. Don't be afraid to make mistakes, you can unfollow people just as easily any time!",
@@ -284,6 +294,7 @@
"navigation_bar.discover": "Discover",
"navigation_bar.domain_blocks": "Hidden domains",
"navigation_bar.edit_profile": "ⵙⵏⴼⵍ ⵉⴼⵔⵙ",
+ "navigation_bar.explore": "Explore",
"navigation_bar.favourites": "Favourites",
"navigation_bar.filters": "Muted words",
"navigation_bar.follow_requests": "ⵜⵓⵜⵔⴰⵡⵉⵏ ⵏ ⵓⴹⴼⴰⵕ",
@@ -298,6 +309,7 @@
"navigation_bar.preferences": "Preferences",
"navigation_bar.public_timeline": "Federated timeline",
"navigation_bar.security": "Security",
+ "notification.admin.sign_up": "{name} signed up",
"notification.favourite": "{name} favourited your status",
"notification.follow": "ⵉⴹⴼⴼⴰⵔ ⴽ {name}",
"notification.follow_request": "{name} has requested to follow you",
@@ -306,13 +318,15 @@
"notification.poll": "A poll you have voted in has ended",
"notification.reblog": "{name} boosted your status",
"notification.status": "{name} just posted",
+ "notification.update": "{name} edited a post",
"notifications.clear": "ⵙⴼⴹ ⵜⵉⵏⵖⵎⵉⵙⵉⵏ",
"notifications.clear_confirmation": "Are you sure you want to permanently clear all your notifications?",
+ "notifications.column_settings.admin.sign_up": "New sign-ups:",
"notifications.column_settings.alert": "Desktop notifications",
"notifications.column_settings.favourite": "Favourites:",
"notifications.column_settings.filter_bar.advanced": "Display all categories",
"notifications.column_settings.filter_bar.category": "Quick filter bar",
- "notifications.column_settings.filter_bar.show": "Show",
+ "notifications.column_settings.filter_bar.show_bar": "Show filter bar",
"notifications.column_settings.follow": "New followers:",
"notifications.column_settings.follow_request": "New follow requests:",
"notifications.column_settings.mention": "Mentions:",
@@ -322,7 +336,9 @@
"notifications.column_settings.show": "Show in column",
"notifications.column_settings.sound": "ⵖⵔ ⵉⵎⵙⵍⵉ",
"notifications.column_settings.status": "New toots:",
- "notifications.column_settings.unread_markers.category": "Unread notification markers",
+ "notifications.column_settings.unread_notifications.category": "Unread notifications",
+ "notifications.column_settings.unread_notifications.highlight": "Highlight unread notifications",
+ "notifications.column_settings.update": "Edits:",
"notifications.filter.all": "ⴰⴽⴽⵯ",
"notifications.filter.boosts": "Boosts",
"notifications.filter.favourites": "Favourites",
@@ -362,18 +378,54 @@
"regeneration_indicator.label": "ⴰⵣⴷⴰⵎ…",
"regeneration_indicator.sublabel": "Your home feed is being prepared!",
"relative_time.days": "{number}ⴰⵙ",
+ "relative_time.full.days": "{number, plural, one {# day} other {# days}} ago",
+ "relative_time.full.hours": "{number, plural, one {# hour} other {# hours}} ago",
+ "relative_time.full.just_now": "just now",
+ "relative_time.full.minutes": "{number, plural, one {# minute} other {# minutes}} ago",
+ "relative_time.full.seconds": "{number, plural, one {# second} other {# seconds}} ago",
"relative_time.hours": "{number}ⵙⵔⴳ",
"relative_time.just_now": "ⴷⵖⵉ",
"relative_time.minutes": "{number}ⵙⴷ",
"relative_time.seconds": "{number}ⵙⵏ",
"relative_time.today": "ⴰⵙⵙⴰ",
"reply_indicator.cancel": "ⵙⵔ",
+ "report.block": "Block",
+ "report.block_explanation": "You will not see their posts. They will not be able to see your posts or follow you. They will be able to tell that they are blocked.",
+ "report.categories.other": "Other",
+ "report.categories.spam": "Spam",
+ "report.categories.violation": "Content violates one or more server rules",
+ "report.category.subtitle": "Choose the best match",
+ "report.category.title": "Tell us what's going on with this {type}",
+ "report.category.title_account": "profile",
+ "report.category.title_status": "post",
+ "report.close": "Done",
+ "report.comment.title": "Is there anything else you think we should know?",
"report.forward": "ⵙⵙⵉⴼⴹ ⵉ {target}",
"report.forward_hint": "The account is from another server. Send an anonymized copy of the report there as well?",
- "report.hint": "The report will be sent to your server moderators. You can provide an explanation of why you are reporting this account below:",
- "report.placeholder": "Additional comments",
+ "report.mute": "Mute",
+ "report.mute_explanation": "You will not see their posts. They can still follow you and see your posts and will not know that they are muted.",
+ "report.next": "Next",
+ "report.placeholder": "Type or paste additional comments",
+ "report.reasons.dislike": "I don't like it",
+ "report.reasons.dislike_description": "It is not something you want to see",
+ "report.reasons.other": "It's something else",
+ "report.reasons.other_description": "The issue does not fit into other categories",
+ "report.reasons.spam": "It's spam",
+ "report.reasons.spam_description": "Malicious links, fake engagement, or repetitive replies",
+ "report.reasons.violation": "It violates server rules",
+ "report.reasons.violation_description": "You are aware that it breaks specific rules",
+ "report.rules.subtitle": "Select all that apply",
+ "report.rules.title": "Which rules are being violated?",
+ "report.statuses.subtitle": "Select all that apply",
+ "report.statuses.title": "Are there any posts that back up this report?",
"report.submit": "ⴰⵣⵏ",
"report.target": "Report {target}",
+ "report.thanks.take_action": "Here are your options for controlling what you see on Mastodon:",
+ "report.thanks.take_action_actionable": "While we review this, you can take action against @{name}:",
+ "report.thanks.title": "Don't want to see this?",
+ "report.thanks.title_actionable": "Thanks for reporting, we'll look into this.",
+ "report.unfollow": "Unfollow @{name}",
+ "report.unfollow_explanation": "You are following this account. To not see their posts in your home feed anymore, unfollow them.",
"search.placeholder": "ⵔⵣⵓ",
"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.",
@@ -382,7 +434,9 @@
"search_popout.tips.text": "Simple text returns matching display names, usernames and hashtags",
"search_popout.tips.user": "user",
"search_results.accounts": "ⵎⵉⴷⴷⵏ",
+ "search_results.all": "All",
"search_results.hashtags": "ⵀⴰⵛⵟⴰⴳ",
+ "search_results.nothing_found": "Could not find anything for these search terms",
"search_results.statuses": "Toots",
"search_results.statuses_fts_disabled": "Searching toots by their content is not enabled on this Mastodon server.",
"search_results.total": "{count, number} {count, plural, one {result} other {results}}",
@@ -396,9 +450,14 @@
"status.delete": "ⴽⴽⵙ",
"status.detailed_status": "Detailed conversation view",
"status.direct": "ⵜⵓⵣⵉⵏⵜ ⵜⵓⵙⵔⵉⴷⵜ ⵉ @{name}",
+ "status.edit": "Edit",
+ "status.edited": "Edited {date}",
+ "status.edited_x_times": "Edited {count, plural, one {{count} time} other {{count} times}}",
"status.embed": "Embed",
"status.favourite": "Favourite",
"status.filtered": "Filtered",
+ "status.history.created": "{name} created {date}",
+ "status.history.edited": "{name} edited {date}",
"status.load_more": "ⵙⵙⵉⵍⵉ ⵓⴳⴳⴰⵔ",
"status.media_hidden": "Media hidden",
"status.mention": "Mention @{name}",
diff --git a/app/javascript/mastodon/locales/zh-CN.json b/app/javascript/mastodon/locales/zh-CN.json
index 286d54fb8..9e306688e 100644
--- a/app/javascript/mastodon/locales/zh-CN.json
+++ b/app/javascript/mastodon/locales/zh-CN.json
@@ -18,12 +18,12 @@
"account.followers": "关注者",
"account.followers.empty": "目前无人关注此用户。",
"account.followers_counter": "被 {counter} 人关注",
+ "account.following": "正在关注",
"account.following_counter": "正在关注 {counter} 人",
"account.follows.empty": "此用户目前尚未关注任何人。",
"account.follows_you": "关注了你",
"account.hide_reblogs": "隐藏来自 @{name} 的转嘟",
"account.joined": "加入于 {date}",
- "account.last_status": "最近活动",
"account.link_verified_on": "此链接的所有权已在 {date} 检查",
"account.locked_info": "此账户已锁嘟。账户的主人会手动审核关注者。",
"account.media": "媒体",
@@ -32,7 +32,6 @@
"account.mute": "隐藏 @{name}",
"account.mute_notifications": "隐藏来自 @{name} 的通知",
"account.muted": "已隐藏",
- "account.never_active": "从未活跃",
"account.posts": "嘟文",
"account.posts_with_replies": "嘟文和回复",
"account.report": "举报 @{name}",
@@ -42,21 +41,24 @@
"account.statuses_counter": "{counter} 条嘟文",
"account.unblock": "解除屏蔽 @{name}",
"account.unblock_domain": "不再屏蔽 {domain} 实例",
+ "account.unblock_short": "移出黑名单",
"account.unendorse": "不在个人资料中推荐此用户",
"account.unfollow": "取消关注",
"account.unmute": "不再隐藏 @{name}",
"account.unmute_notifications": "不再隐藏来自 @{name} 的通知",
+ "account.unmute_short": "恢复消息提醒",
"account_note.placeholder": "点击添加备注",
- "admin.dashboard.retention": "Retention",
- "admin.dashboard.retention.average": "Average",
- "admin.dashboard.retention.cohort": "Sign-up month",
- "admin.dashboard.retention.cohort_size": "New users",
+ "admin.dashboard.daily_retention": "注册后用户留存率(按日计算)",
+ "admin.dashboard.monthly_retention": "注册后用户留存率(按月计算)",
+ "admin.dashboard.retention.average": "平均",
+ "admin.dashboard.retention.cohort": "注册月",
+ "admin.dashboard.retention.cohort_size": "新用户",
"alert.rate_limited.message": "请在{retry_time, time, medium}后重试。",
"alert.rate_limited.title": "频率受限",
"alert.unexpected.message": "发生了意外错误。",
"alert.unexpected.title": "哎呀!",
"announcement.announcement": "公告",
- "attachments_list.unprocessed": "(unprocessed)",
+ "attachments_list.unprocessed": "(未处理)",
"autosuggest_hashtag.per_week": "每星期 {count} 条",
"boost_modal.combo": "下次按住 {combo} 即可跳过此提示",
"bundle_column_error.body": "载入这个组件时发生了错误。",
@@ -83,9 +85,9 @@
"column_header.hide_settings": "隐藏设置",
"column_header.moveLeft_settings": "将此栏左移",
"column_header.moveRight_settings": "将此栏右移",
- "column_header.pin": "固定",
+ "column_header.pin": "置顶",
"column_header.show_settings": "显示设置",
- "column_header.unpin": "取消固定",
+ "column_header.unpin": "取消置顶",
"column_subheading.settings": "设置",
"community.column_settings.local_only": "只显示本站",
"community.column_settings.media_only": "仅媒体",
@@ -96,7 +98,7 @@
"compose_form.lock_disclaimer": "你的帐户没有{locked}。任何人都可以在关注你后立即查看仅关注者可见的嘟文。",
"compose_form.lock_disclaimer.lock": "开启保护",
"compose_form.placeholder": "在想啥?",
- "compose_form.poll.add_option": "添加一个选项",
+ "compose_form.poll.add_option": "添加选项",
"compose_form.poll.duration": "投票持续时间",
"compose_form.poll.option_placeholder": "选项 {number}",
"compose_form.poll.remove_option": "移除这个选项",
@@ -104,6 +106,7 @@
"compose_form.poll.switch_to_single": "将投票改为单选",
"compose_form.publish": "嘟嘟",
"compose_form.publish_loud": "{publish}!",
+ "compose_form.save_changes": "保存更改",
"compose_form.sensitive.hide": "标记媒体为敏感内容",
"compose_form.sensitive.marked": "媒体已被标记为敏感内容",
"compose_form.sensitive.unmarked": "媒体未被标记为敏感内容",
@@ -118,8 +121,8 @@
"confirmations.delete.message": "你确定要删除这条嘟文吗?",
"confirmations.delete_list.confirm": "删除",
"confirmations.delete_list.message": "你确定要永久删除这个列表吗?",
- "confirmations.discard_edit_media.confirm": "Discard",
- "confirmations.discard_edit_media.message": "You have unsaved changes to the media description or preview, discard them anyway?",
+ "confirmations.discard_edit_media.confirm": "丢弃",
+ "confirmations.discard_edit_media.message": "您还有未保存的媒体描述或预览修改,仍然丢弃它们吗?",
"confirmations.domain_block.confirm": "隐藏整个网站的内容",
"confirmations.domain_block.message": "你真的确定要屏蔽所有来自 {domain} 的内容吗?多数情况下,屏蔽或隐藏几个特定的用户就已经足够了。来自该网站的内容将不再出现在你的任何公共时间轴或通知列表里。来自该网站的关注者将会被移除。",
"confirmations.logout.confirm": "登出",
@@ -165,6 +168,7 @@
"empty_column.community": "本站时间轴暂时没有内容,快写点什么让它动起来吧!",
"empty_column.direct": "你还没有使用过私信。当你发出或者收到私信时,它会在这里显示。",
"empty_column.domain_blocks": "目前没有被隐藏的站点。",
+ "empty_column.explore_statuses": "目前没有热门话题,稍后再来看看吧!",
"empty_column.favourited_statuses": "你还没有喜欢过任何嘟文。喜欢过的嘟文会显示在这里。",
"empty_column.favourites": "没有人喜欢过这条嘟文。如果有人喜欢了,就会显示在这里。",
"empty_column.follow_recommendations": "似乎无法为你生成任何建议。你可以尝试使用搜索寻找你可能知道的人或探索热门标签。",
@@ -183,6 +187,12 @@
"error.unexpected_crash.next_steps_addons": "请尝试禁用它们并刷新页面。如果没有帮助,你仍可以尝试使用其他浏览器或原生应用来使用 Mastodon。",
"errors.unexpected_crash.copy_stacktrace": "把堆栈跟踪信息复制到剪贴板",
"errors.unexpected_crash.report_issue": "报告问题",
+ "explore.search_results": "搜索结果",
+ "explore.suggested_follows": "为您推荐",
+ "explore.title": "探索",
+ "explore.trending_links": "最新消息",
+ "explore.trending_statuses": "嘟文",
+ "explore.trending_tags": "话题标签",
"follow_recommendations.done": "完成",
"follow_recommendations.heading": "关注你感兴趣的用户!这里有一些推荐。",
"follow_recommendations.lead": "你关注的人的嘟文将按时间顺序在你的主页上显示。 别担心,你可以随时取消关注!",
@@ -284,6 +294,7 @@
"navigation_bar.discover": "发现",
"navigation_bar.domain_blocks": "已屏蔽的网站",
"navigation_bar.edit_profile": "修改个人资料",
+ "navigation_bar.explore": "探索",
"navigation_bar.favourites": "喜欢",
"navigation_bar.filters": "隐藏关键词",
"navigation_bar.follow_requests": "关注请求",
@@ -298,6 +309,7 @@
"navigation_bar.preferences": "首选项",
"navigation_bar.public_timeline": "跨站公共时间轴",
"navigation_bar.security": "安全",
+ "notification.admin.sign_up": "{name} 注册了",
"notification.favourite": "{name} 喜欢了你的嘟文",
"notification.follow": "{name} 开始关注你",
"notification.follow_request": "{name} 向你发送了关注请求",
@@ -306,13 +318,15 @@
"notification.poll": "你参与的一个投票已经结束",
"notification.reblog": "{name} 转嘟了你的嘟文",
"notification.status": "{name} 刚刚发嘟",
+ "notification.update": "{name} 编辑了嘟文",
"notifications.clear": "清空通知列表",
"notifications.clear_confirmation": "你确定要永久清空通知列表吗?",
+ "notifications.column_settings.admin.sign_up": "新注册:",
"notifications.column_settings.alert": "桌面通知",
"notifications.column_settings.favourite": "当你的嘟文被喜欢时:",
"notifications.column_settings.filter_bar.advanced": "显示所有类别",
"notifications.column_settings.filter_bar.category": "快速过滤栏",
- "notifications.column_settings.filter_bar.show": "显示",
+ "notifications.column_settings.filter_bar.show_bar": "显示过滤栏",
"notifications.column_settings.follow": "当有人关注你时:",
"notifications.column_settings.follow_request": "新的关注请求:",
"notifications.column_settings.mention": "当有人在嘟文中提及你时:",
@@ -322,7 +336,9 @@
"notifications.column_settings.show": "在通知栏显示",
"notifications.column_settings.sound": "播放音效",
"notifications.column_settings.status": "新嘟文:",
- "notifications.column_settings.unread_markers.category": "未读通知标记",
+ "notifications.column_settings.unread_notifications.category": "未读通知",
+ "notifications.column_settings.unread_notifications.highlight": "高亮显示未读通知",
+ "notifications.column_settings.update": "编辑:",
"notifications.filter.all": "全部",
"notifications.filter.boosts": "转嘟",
"notifications.filter.favourites": "喜欢",
@@ -346,7 +362,7 @@
"poll.total_votes": "{count} 票",
"poll.vote": "投票",
"poll.voted": "你已经对这个答案投过票了",
- "poll.votes": "{votes, plural, one {# vote} other {# votes}}",
+ "poll.votes": "{votes, plural, one {# 票} other {# 票}}",
"poll_button.add_poll": "发起投票",
"poll_button.remove_poll": "移除投票",
"privacy.change": "设置嘟文的可见范围",
@@ -362,18 +378,54 @@
"regeneration_indicator.label": "加载中……",
"regeneration_indicator.sublabel": "你的主页动态正在准备中!",
"relative_time.days": "{number}天",
+ "relative_time.full.days": "{number, plural, one {# 天} other {# 天}}前",
+ "relative_time.full.hours": "{number, plural, one {# 小时} other {# 小时}}前",
+ "relative_time.full.just_now": "刚刚",
+ "relative_time.full.minutes": "{number, plural, one {# 分钟} other {# 分钟}}前",
+ "relative_time.full.seconds": "{number, plural, one {# 秒} other {# 秒}}前",
"relative_time.hours": "{number}时",
"relative_time.just_now": "刚刚",
"relative_time.minutes": "{number}分",
"relative_time.seconds": "{number}秒",
"relative_time.today": "今天",
"reply_indicator.cancel": "取消",
+ "report.block": "屏蔽",
+ "report.block_explanation": "你不会看到他们的帖子。他们也将无法看到你的帖子或关注你。他们将能够判断他们被屏蔽了。",
+ "report.categories.other": "其他",
+ "report.categories.spam": "垃圾信息",
+ "report.categories.violation": "内容违反一条或多条服务器规则",
+ "report.category.subtitle": "选择最佳匹配",
+ "report.category.title": "告诉我们这个 {type} 的情况",
+ "report.category.title_account": "个人资料",
+ "report.category.title_status": "嘟文",
+ "report.close": "完成",
+ "report.comment.title": "还有什么你认为我们应该知道的吗?",
"report.forward": "转发举报至 {target}",
"report.forward_hint": "这名用户来自另一个服务器。是否要向那个服务器发送一条匿名的举报?",
- "report.hint": "举报将会发送给你所在服务器的监察员。你可以在下面填写举报该用户的理由:",
+ "report.mute": "静音",
+ "report.mute_explanation": "你将不会看到他们的嘟文。他们仍然可以关注你并看到你的嘟文,但他们不会知道他们被静音了。",
+ "report.next": "下一步",
"report.placeholder": "备注",
+ "report.reasons.dislike": "我不喜欢它",
+ "report.reasons.dislike_description": "这不是你想看到的东西",
+ "report.reasons.other": "其他原因",
+ "report.reasons.other_description": "该问题不符合其他类别",
+ "report.reasons.spam": "它是垃圾信息",
+ "report.reasons.spam_description": "恶意链接,虚假互动和重复回复",
+ "report.reasons.violation": "它违反了服务器规则",
+ "report.reasons.violation_description": "你清楚它违反了特定的规则",
+ "report.rules.subtitle": "选择所有适用选项",
+ "report.rules.title": "哪些规则被违反了?",
+ "report.statuses.subtitle": "选择所有适用选项",
+ "report.statuses.title": "是否有任何嘟文可以支持这一报告?",
"report.submit": "提交",
"report.target": "举报 {target}",
+ "report.thanks.take_action": "以下是您控制您在 Mastodon 上能看到哪些内容的选项:",
+ "report.thanks.take_action_actionable": "在我们审阅这个问题时,你可以对 @{name} 采取行动",
+ "report.thanks.title": "不想看到这个内容?",
+ "report.thanks.title_actionable": "感谢提交举报,我们将会进行处理。",
+ "report.unfollow": "取消关注 @{name}",
+ "report.unfollow_explanation": "你正在关注这个账户。如果要想在你的主页上不再看到他们的嘟文,请取消对他们的关注。",
"search.placeholder": "搜索",
"search_popout.search_format": "高级搜索格式",
"search_popout.tips.full_text": "输入关键词检索所有你发送、喜欢、转嘟过或提及到你的嘟文,以及其他用户公开的用户名、昵称和话题标签。",
@@ -382,7 +434,9 @@
"search_popout.tips.text": "输入关键词检索昵称、用户名和话题标签",
"search_popout.tips.user": "用户",
"search_results.accounts": "用户",
+ "search_results.all": "全部",
"search_results.hashtags": "话题标签",
+ "search_results.nothing_found": "无法找到符合这些搜索词的任何内容",
"search_results.statuses": "嘟文",
"search_results.statuses_fts_disabled": "此Mastodon服务器未启用嘟文内容搜索。",
"search_results.total": "共 {count, number} 个结果",
@@ -396,9 +450,14 @@
"status.delete": "删除",
"status.detailed_status": "对话详情",
"status.direct": "发送私信给 @{name}",
+ "status.edit": "编辑",
+ "status.edited": "编辑于 {date}",
+ "status.edited_x_times": "共编辑 {count, plural, one {{count} 次} other {{count} 次}}",
"status.embed": "嵌入",
"status.favourite": "喜欢",
"status.filtered": "已过滤",
+ "status.history.created": "{name} 创建于 {date}",
+ "status.history.edited": "{name} 编辑于 {date}",
"status.load_more": "加载更多",
"status.media_hidden": "已隐藏的媒体内容",
"status.mention": "提及 @{name}",
@@ -422,7 +481,7 @@
"status.share": "分享",
"status.show_less": "隐藏内容",
"status.show_less_all": "隐藏所有内容",
- "status.show_more": "显示内容",
+ "status.show_more": "显示更多",
"status.show_more_all": "显示所有内容",
"status.show_thread": "显示全部对话",
"status.uncached_media_warning": "暂不可用",
@@ -462,7 +521,7 @@
"upload_form.video_description": "为听障人士和视障人士添加文字描述",
"upload_modal.analyzing_picture": "分析图片…",
"upload_modal.apply": "应用",
- "upload_modal.applying": "Applying…",
+ "upload_modal.applying": "正在应用…",
"upload_modal.choose_image": "选择图像",
"upload_modal.description_placeholder": "天地玄黄 宇宙洪荒 日月盈仄 辰宿列张",
"upload_modal.detect_text": "从图片中检测文本",
diff --git a/app/javascript/mastodon/locales/zh-HK.json b/app/javascript/mastodon/locales/zh-HK.json
index e93c81f94..b60560cd1 100644
--- a/app/javascript/mastodon/locales/zh-HK.json
+++ b/app/javascript/mastodon/locales/zh-HK.json
@@ -18,12 +18,12 @@
"account.followers": "關注者",
"account.followers.empty": "尚未有人關注這位使用者。",
"account.followers_counter": "有 {count, plural,one {{counter} 個} other {{counter} 個}}關注者",
+ "account.following": "Following",
"account.following_counter": "正在關注 {count, plural,one {{counter}}other {{counter} 人}}",
"account.follows.empty": "這位使用者尚未關注任何人。",
"account.follows_you": "關注你",
"account.hide_reblogs": "隱藏 @{name} 的轉推",
"account.joined": "於 {date} 加入",
- "account.last_status": "上次活躍時間",
"account.link_verified_on": "此連結的所有權已在 {date} 檢查過",
"account.locked_info": "這位使用者將私隱設定為「不公開」,會手動審批誰能關注他/她。",
"account.media": "媒體",
@@ -32,7 +32,6 @@
"account.mute": "將 @{name} 靜音",
"account.mute_notifications": "將來自 @{name} 的通知靜音",
"account.muted": "靜音",
- "account.never_active": "永不",
"account.posts": "文章",
"account.posts_with_replies": "包含回覆的文章",
"account.report": "舉報 @{name}",
@@ -42,12 +41,15 @@
"account.statuses_counter": "{count, plural,one {{counter} 篇}other {{counter} 篇}}文章",
"account.unblock": "解除對 @{name} 的封鎖",
"account.unblock_domain": "解除對域名 {domain} 的封鎖",
+ "account.unblock_short": "Unblock",
"account.unendorse": "不再於個人資料頁面推薦對方",
"account.unfollow": "取消關注",
"account.unmute": "取消 @{name} 的靜音",
"account.unmute_notifications": "取消來自 @{name} 通知的靜音",
+ "account.unmute_short": "Unmute",
"account_note.placeholder": "按此添加備注",
- "admin.dashboard.retention": "Retention",
+ "admin.dashboard.daily_retention": "User retention rate by day after sign-up",
+ "admin.dashboard.monthly_retention": "User retention rate by month after sign-up",
"admin.dashboard.retention.average": "Average",
"admin.dashboard.retention.cohort": "Sign-up month",
"admin.dashboard.retention.cohort_size": "New users",
@@ -104,6 +106,7 @@
"compose_form.poll.switch_to_single": "變更投票為限定單一選項",
"compose_form.publish": "發文",
"compose_form.publish_loud": "{publish}!",
+ "compose_form.save_changes": "Save changes",
"compose_form.sensitive.hide": "標記媒體為敏感內容",
"compose_form.sensitive.marked": "媒體被標示為敏感",
"compose_form.sensitive.unmarked": "媒體沒有被標示為敏感",
@@ -165,6 +168,7 @@
"empty_column.community": "本站時間軸暫時未有內容,快寫一點東西來搶頭香啊!",
"empty_column.direct": "你沒有個人訊息。當你發出或接收個人訊息,就會在這裡出現。",
"empty_column.domain_blocks": "尚未隱藏任何網域。",
+ "empty_column.explore_statuses": "Nothing is trending right now. Check back later!",
"empty_column.favourited_statuses": "你還沒收藏任何文章。這裡將會顯示你收藏的嘟文。",
"empty_column.favourites": "還沒有人收藏這則文章。這裡將會顯示被收藏的嘟文。",
"empty_column.follow_recommendations": "似乎未能替您產生任何建議。您可以試著搜尋您知道的帳戶或者探索熱門主題標籤",
@@ -183,6 +187,12 @@
"error.unexpected_crash.next_steps_addons": "請嘗試停止使用這些附加元件然後重新載入頁面。如果問題沒有解決,你仍然可以使用不同的瀏覽器或 Mastodon 應用程式來檢視。",
"errors.unexpected_crash.copy_stacktrace": "複製 stacktrace 到剪貼簿",
"errors.unexpected_crash.report_issue": "舉報問題",
+ "explore.search_results": "Search results",
+ "explore.suggested_follows": "For you",
+ "explore.title": "Explore",
+ "explore.trending_links": "News",
+ "explore.trending_statuses": "Posts",
+ "explore.trending_tags": "Hashtags",
"follow_recommendations.done": "完成",
"follow_recommendations.heading": "跟隨人們以看到來自他們的嘟文!這裡有些建議。",
"follow_recommendations.lead": "您跟隨對象知嘟文將會以時間順序顯示於您的 home feed 上。別擔心犯下錯誤,您隨時可以取消跟隨人們!",
@@ -284,6 +294,7 @@
"navigation_bar.discover": "探索",
"navigation_bar.domain_blocks": "封鎖的服務站",
"navigation_bar.edit_profile": "修改個人資料",
+ "navigation_bar.explore": "Explore",
"navigation_bar.favourites": "最愛的內容",
"navigation_bar.filters": "靜音詞彙",
"navigation_bar.follow_requests": "關注請求",
@@ -298,6 +309,7 @@
"navigation_bar.preferences": "偏好設定",
"navigation_bar.public_timeline": "跨站時間軸",
"navigation_bar.security": "安全",
+ "notification.admin.sign_up": "{name} signed up",
"notification.favourite": "{name} 喜歡你的文章",
"notification.follow": "{name} 開始關注你",
"notification.follow_request": "{name} 要求關注你",
@@ -306,13 +318,15 @@
"notification.poll": "你參與過的一個投票已經結束",
"notification.reblog": "{name} 轉推你的文章",
"notification.status": "{name} 剛發表了文章",
+ "notification.update": "{name} edited a post",
"notifications.clear": "清空通知紀錄",
"notifications.clear_confirmation": "你確定要清空通知紀錄嗎?",
+ "notifications.column_settings.admin.sign_up": "New sign-ups:",
"notifications.column_settings.alert": "顯示桌面通知",
"notifications.column_settings.favourite": "你最愛的文章:",
"notifications.column_settings.filter_bar.advanced": "顯示所有分類",
"notifications.column_settings.filter_bar.category": "快速過濾欄",
- "notifications.column_settings.filter_bar.show": "顯示",
+ "notifications.column_settings.filter_bar.show_bar": "Show filter bar",
"notifications.column_settings.follow": "關注你:",
"notifications.column_settings.follow_request": "新的關注請求:",
"notifications.column_settings.mention": "提及你:",
@@ -322,7 +336,9 @@
"notifications.column_settings.show": "在通知欄顯示",
"notifications.column_settings.sound": "播放音效",
"notifications.column_settings.status": "新的文章",
- "notifications.column_settings.unread_markers.category": "未讀通知標記",
+ "notifications.column_settings.unread_notifications.category": "Unread notifications",
+ "notifications.column_settings.unread_notifications.highlight": "Highlight unread notifications",
+ "notifications.column_settings.update": "Edits:",
"notifications.filter.all": "全部",
"notifications.filter.boosts": "轉推",
"notifications.filter.favourites": "最愛",
@@ -362,18 +378,54 @@
"regeneration_indicator.label": "載入中……",
"regeneration_indicator.sublabel": "你的主頁時間軸正在準備中!",
"relative_time.days": "{number}日前",
+ "relative_time.full.days": "{number, plural, one {# day} other {# days}} ago",
+ "relative_time.full.hours": "{number, plural, one {# hour} other {# hours}} ago",
+ "relative_time.full.just_now": "just now",
+ "relative_time.full.minutes": "{number, plural, one {# minute} other {# minutes}} ago",
+ "relative_time.full.seconds": "{number, plural, one {# second} other {# seconds}} ago",
"relative_time.hours": "{number}小時前",
"relative_time.just_now": "剛剛",
"relative_time.minutes": "{number}分鐘前",
"relative_time.seconds": "{number}秒前",
"relative_time.today": "今天",
"reply_indicator.cancel": "取消",
+ "report.block": "Block",
+ "report.block_explanation": "You will not see their posts. They will not be able to see your posts or follow you. They will be able to tell that they are blocked.",
+ "report.categories.other": "Other",
+ "report.categories.spam": "Spam",
+ "report.categories.violation": "Content violates one or more server rules",
+ "report.category.subtitle": "Choose the best match",
+ "report.category.title": "Tell us what's going on with this {type}",
+ "report.category.title_account": "profile",
+ "report.category.title_status": "post",
+ "report.close": "Done",
+ "report.comment.title": "Is there anything else you think we should know?",
"report.forward": "轉寄到 {target}",
"report.forward_hint": "這個帳戶屬於其他服務站。要向該服務站發送匿名的舉報訊息嗎?",
- "report.hint": "這訊息會發送到你服務站的管理員。你可以提供舉報這個帳戶的理由:",
+ "report.mute": "Mute",
+ "report.mute_explanation": "You will not see their posts. They can still follow you and see your posts and will not know that they are muted.",
+ "report.next": "Next",
"report.placeholder": "額外訊息",
+ "report.reasons.dislike": "I don't like it",
+ "report.reasons.dislike_description": "It is not something you want to see",
+ "report.reasons.other": "It's something else",
+ "report.reasons.other_description": "The issue does not fit into other categories",
+ "report.reasons.spam": "It's spam",
+ "report.reasons.spam_description": "Malicious links, fake engagement, or repetitive replies",
+ "report.reasons.violation": "It violates server rules",
+ "report.reasons.violation_description": "You are aware that it breaks specific rules",
+ "report.rules.subtitle": "Select all that apply",
+ "report.rules.title": "Which rules are being violated?",
+ "report.statuses.subtitle": "Select all that apply",
+ "report.statuses.title": "Are there any posts that back up this report?",
"report.submit": "提交",
"report.target": "舉報",
+ "report.thanks.take_action": "Here are your options for controlling what you see on Mastodon:",
+ "report.thanks.take_action_actionable": "While we review this, you can take action against @{name}:",
+ "report.thanks.title": "Don't want to see this?",
+ "report.thanks.title_actionable": "Thanks for reporting, we'll look into this.",
+ "report.unfollow": "Unfollow @{name}",
+ "report.unfollow_explanation": "You are following this account. To not see their posts in your home feed anymore, unfollow them.",
"search.placeholder": "搜尋",
"search_popout.search_format": "高級搜索格式",
"search_popout.tips.full_text": "輸入簡單的文字,搜索由你發放、收藏、轉推和提及你的文章,以及符合的使用者名稱,顯示名稱和標籤。",
@@ -382,7 +434,9 @@
"search_popout.tips.text": "輸入簡單的文字,搜索符合的顯示名稱、使用者名稱和標籤",
"search_popout.tips.user": "使用者",
"search_results.accounts": "使用者",
+ "search_results.all": "All",
"search_results.hashtags": "標籤",
+ "search_results.nothing_found": "Could not find anything for these search terms",
"search_results.statuses": "文章",
"search_results.statuses_fts_disabled": "此 Mastodon 伺服器並未啟用「搜尋文章內章」功能。",
"search_results.total": "{count, number} 項結果",
@@ -396,9 +450,14 @@
"status.delete": "刪除",
"status.detailed_status": "詳細對話內容",
"status.direct": "私訊 @{name}",
+ "status.edit": "Edit",
+ "status.edited": "Edited {date}",
+ "status.edited_x_times": "Edited {count, plural, one {{count} time} other {{count} times}}",
"status.embed": "嵌入",
"status.favourite": "最愛",
"status.filtered": "已過濾",
+ "status.history.created": "{name} created {date}",
+ "status.history.edited": "{name} edited {date}",
"status.load_more": "載入更多",
"status.media_hidden": "隱藏媒體內容",
"status.mention": "提及 @{name}",
diff --git a/app/javascript/mastodon/locales/zh-TW.json b/app/javascript/mastodon/locales/zh-TW.json
index 7fdd156ea..f9366fe17 100644
--- a/app/javascript/mastodon/locales/zh-TW.json
+++ b/app/javascript/mastodon/locales/zh-TW.json
@@ -18,12 +18,12 @@
"account.followers": "跟隨者",
"account.followers.empty": "尚未有人跟隨這位使用者。",
"account.followers_counter": "被 {count, plural,one {{counter} 人}other {{counter} 人}} 跟隨",
+ "account.following": "跟隨中",
"account.following_counter": "正在跟隨 {count, plural,one {{counter}}other {{counter} 人}}",
"account.follows.empty": "這位使用者尚未跟隨任何人。",
"account.follows_you": "跟隨了您",
"account.hide_reblogs": "隱藏來自 @{name} 的轉嘟",
"account.joined": "加入於 {date}",
- "account.last_status": "上次活躍時間",
"account.link_verified_on": "已在 {date} 檢查此連結的擁有者權限",
"account.locked_info": "此帳戶的隱私狀態被設為鎖定。該擁有者會手動審核能跟隨此帳戶的人。",
"account.media": "媒體",
@@ -32,7 +32,6 @@
"account.mute": "靜音 @{name}",
"account.mute_notifications": "靜音來自 @{name} 的通知",
"account.muted": "已靜音",
- "account.never_active": "永不",
"account.posts": "嘟文",
"account.posts_with_replies": "嘟文與回覆",
"account.report": "檢舉 @{name}",
@@ -42,21 +41,24 @@
"account.statuses_counter": "{count, plural,one {{counter} 則}other {{counter} 則}}嘟文",
"account.unblock": "取消封鎖 @{name}",
"account.unblock_domain": "取消封鎖域名 {domain}",
+ "account.unblock_short": "解除封鎖",
"account.unendorse": "不再於個人資料頁面推薦對方",
"account.unfollow": "取消跟隨",
"account.unmute": "取消靜音 @{name}",
"account.unmute_notifications": "重新接收來自 @{name} 的通知",
+ "account.unmute_short": "解除靜音",
"account_note.placeholder": "按此添加備注",
- "admin.dashboard.retention": "Retention",
- "admin.dashboard.retention.average": "Average",
- "admin.dashboard.retention.cohort": "Sign-up month",
- "admin.dashboard.retention.cohort_size": "New users",
+ "admin.dashboard.daily_retention": "註冊後使用者存留率(日)",
+ "admin.dashboard.monthly_retention": "註冊後使用者存留率(月)",
+ "admin.dashboard.retention.average": "平均",
+ "admin.dashboard.retention.cohort": "註冊月份",
+ "admin.dashboard.retention.cohort_size": "新使用者",
"alert.rate_limited.message": "請在 {retry_time, time, medium} 後重試",
"alert.rate_limited.title": "已限速",
"alert.unexpected.message": "發生了非預期的錯誤。",
"alert.unexpected.title": "哎呀!",
"announcement.announcement": "公告",
- "attachments_list.unprocessed": "(unprocessed)",
+ "attachments_list.unprocessed": "(未經處理)",
"autosuggest_hashtag.per_week": "{count} / 週",
"boost_modal.combo": "下次您可以按 {combo} 跳過",
"bundle_column_error.body": "載入此元件時發生錯誤。",
@@ -104,6 +106,7 @@
"compose_form.poll.switch_to_single": "變更投票為允許單一選項",
"compose_form.publish": "嘟出去",
"compose_form.publish_loud": "{publish}!",
+ "compose_form.save_changes": "儲存變更",
"compose_form.sensitive.hide": "標記媒體為敏感內容",
"compose_form.sensitive.marked": "此媒體被標記為敏感內容",
"compose_form.sensitive.unmarked": "此媒體未被標記為敏感內容",
@@ -118,8 +121,8 @@
"confirmations.delete.message": "您確定要刪除這則嘟文?",
"confirmations.delete_list.confirm": "刪除",
"confirmations.delete_list.message": "確定永久刪除此名單?",
- "confirmations.discard_edit_media.confirm": "Discard",
- "confirmations.discard_edit_media.message": "You have unsaved changes to the media description or preview, discard them anyway?",
+ "confirmations.discard_edit_media.confirm": "捨棄",
+ "confirmations.discard_edit_media.message": "您在媒體描述或預覽區塊有未儲存的變更。是否要捨棄這些變更?",
"confirmations.domain_block.confirm": "隱藏整個域名",
"confirmations.domain_block.message": "真的非常確定封鎖整個 {domain} 網域嗎?大部分情況下,您只需要封鎖或靜音少數特定的帳帳戶能滿足需求了。您將不能在任何公開的時間軸及通知中看到來自此網域的內容。您來自該網域的跟隨者也將被移除。",
"confirmations.logout.confirm": "登出",
@@ -165,6 +168,7 @@
"empty_column.community": "本機時間軸是空的。快公開嘟些文搶頭香啊!",
"empty_column.direct": "您還沒有任何私訊。當您私訊別人或收到私訊時,它將於此顯示。",
"empty_column.domain_blocks": "尚未封鎖任何網域。",
+ "empty_column.explore_statuses": "目前沒有熱門討論,請稍候再回來看看!",
"empty_column.favourited_statuses": "您還沒加過任何嘟文至最愛。當您收藏嘟文時,它將於此顯示。",
"empty_column.favourites": "還沒有人加過這則嘟文至最愛。當有人收藏嘟文時,它將於此顯示。",
"empty_column.follow_recommendations": "似乎未能為您產生任何建議。您可以嘗試使用搜尋來尋找您可能認識的人,或是探索熱門主題標籤。",
@@ -183,6 +187,12 @@
"error.unexpected_crash.next_steps_addons": "請嘗試關閉他們然後重新整理頁面。如果狀況沒有改善,您可以使用不同的瀏覽器或應用程式來檢視來使用 Mastodon。",
"errors.unexpected_crash.copy_stacktrace": "複製 stacktrace 到剪貼簿",
"errors.unexpected_crash.report_issue": "回報問題",
+ "explore.search_results": "搜尋結果",
+ "explore.suggested_follows": "為您推薦",
+ "explore.title": "探索",
+ "explore.trending_links": "最新消息",
+ "explore.trending_statuses": "嘟文",
+ "explore.trending_tags": "主題標籤",
"follow_recommendations.done": "完成",
"follow_recommendations.heading": "跟隨您想檢視其貼文的人!這裡有一些建議。",
"follow_recommendations.lead": "來自您跟隨的人的貼文將會按時間順序顯示在您的家 feed 上。不要害怕犯錯,您隨時都可以取消跟隨其他人!",
@@ -262,7 +272,7 @@
"lists.new.create": "新增名單",
"lists.new.title_placeholder": "新名單標題",
"lists.replies_policy.followed": "任何跟隨的使用者",
- "lists.replies_policy.list": "列表成員",
+ "lists.replies_policy.list": "名單成員",
"lists.replies_policy.none": "沒有人",
"lists.replies_policy.title": "顯示回覆:",
"lists.search": "搜尋您跟隨的使用者",
@@ -284,7 +294,8 @@
"navigation_bar.discover": "探索",
"navigation_bar.domain_blocks": "隱藏的網域",
"navigation_bar.edit_profile": "編輯個人資料",
- "navigation_bar.favourites": "收藏",
+ "navigation_bar.explore": "探索",
+ "navigation_bar.favourites": "最愛",
"navigation_bar.filters": "靜音詞彙",
"navigation_bar.follow_requests": "跟隨請求",
"navigation_bar.follows_and_followers": "跟隨中與跟隨者",
@@ -298,6 +309,7 @@
"navigation_bar.preferences": "偏好設定",
"navigation_bar.public_timeline": "聯邦時間軸",
"navigation_bar.security": "安全性",
+ "notification.admin.sign_up": "{name} 已經註冊",
"notification.favourite": "{name} 把您的嘟文加入了最愛",
"notification.follow": "{name} 跟隨了您",
"notification.follow_request": "{name} 要求跟隨您",
@@ -306,13 +318,15 @@
"notification.poll": "您曾投過的投票已經結束",
"notification.reblog": "{name} 轉嘟了您的嘟文",
"notification.status": "{name} 剛剛嘟文",
+ "notification.update": "{name} 編輯了嘟文",
"notifications.clear": "清除通知",
"notifications.clear_confirmation": "確定要永久清除您的通知嗎?",
+ "notifications.column_settings.admin.sign_up": "新註冊帳號:",
"notifications.column_settings.alert": "桌面通知",
"notifications.column_settings.favourite": "最愛:",
"notifications.column_settings.filter_bar.advanced": "顯示所有分類",
"notifications.column_settings.filter_bar.category": "快速過濾欄",
- "notifications.column_settings.filter_bar.show": "顯示",
+ "notifications.column_settings.filter_bar.show_bar": "顯示過濾器列",
"notifications.column_settings.follow": "新的跟隨者:",
"notifications.column_settings.follow_request": "新的跟隨請求:",
"notifications.column_settings.mention": "提及:",
@@ -322,7 +336,9 @@
"notifications.column_settings.show": "在欄位中顯示",
"notifications.column_settings.sound": "播放聲音",
"notifications.column_settings.status": "新嘟文:",
- "notifications.column_settings.unread_markers.category": "未讀通知標記",
+ "notifications.column_settings.unread_notifications.category": "未讀通知",
+ "notifications.column_settings.unread_notifications.highlight": "突顯未讀通知",
+ "notifications.column_settings.update": "編輯:",
"notifications.filter.all": "全部",
"notifications.filter.boosts": "轉嘟",
"notifications.filter.favourites": "最愛",
@@ -346,7 +362,7 @@
"poll.total_votes": "{count, plural, one {# 個投票} other {# 個投票}}",
"poll.vote": "投票",
"poll.voted": "您已對此問題投票",
- "poll.votes": "{votes, plural, one {# vote} other {# votes}}",
+ "poll.votes": "{votes, plural, one {# 張票} other {# 張票}}",
"poll_button.add_poll": "建立投票",
"poll_button.remove_poll": "移除投票",
"privacy.change": "調整嘟文隱私狀態",
@@ -362,18 +378,54 @@
"regeneration_indicator.label": "載入中…",
"regeneration_indicator.sublabel": "您的主頁時間軸正在準備中!",
"relative_time.days": "{number} 天",
+ "relative_time.full.days": "{number, plural, one {# 天} other {# 天}}前",
+ "relative_time.full.hours": "{number, plural, one {# 小時} other {# 小時}}前",
+ "relative_time.full.just_now": "剛剛",
+ "relative_time.full.minutes": "{number, plural, one {# 分鐘} other {# 分鐘}}前",
+ "relative_time.full.seconds": "{number, plural, one {# 秒} other {# 秒}}前",
"relative_time.hours": "{number}小時前",
"relative_time.just_now": "剛剛",
"relative_time.minutes": "{number} 分前",
"relative_time.seconds": "{number} 秒",
"relative_time.today": "今天",
"reply_indicator.cancel": "取消",
+ "report.block": "封鎖",
+ "report.block_explanation": "您將不再看到他們的嘟文。他們將無法看到您的嘟文或是跟隨您。他們會被告知他們已被封鎖。",
+ "report.categories.other": "其他",
+ "report.categories.spam": "垃圾訊息",
+ "report.categories.violation": "內容違反一項或多項伺服器條款",
+ "report.category.subtitle": "選擇最佳條件符合",
+ "report.category.title": "告訴我們這個 {type} 發生了什麼事",
+ "report.category.title_account": "個人檔案",
+ "report.category.title_status": "嘟文",
+ "report.close": "已完成",
+ "report.comment.title": "有什麼其他您想讓我們知道的嗎?",
"report.forward": "轉寄到 {target}",
"report.forward_hint": "這個帳戶屬於其他伺服器。要像該伺服器發送匿名的檢舉訊息嗎?",
- "report.hint": "這項訊息會發送到您伺服器的管理員。您可以提供檢舉這個帳戶的理由:",
+ "report.mute": "靜音",
+ "report.mute_explanation": "您將不再看到他們的嘟文。他們仍能可以跟隨您以及察看您的嘟文,並且不會知道他們已被靜音。",
+ "report.next": "繼續",
"report.placeholder": "其他備註",
+ "report.reasons.dislike": "我不喜歡",
+ "report.reasons.dislike_description": "這是您不想看到的",
+ "report.reasons.other": "其他原因",
+ "report.reasons.other_description": "這個問題不屬於其他分類",
+ "report.reasons.spam": "垃圾訊息",
+ "report.reasons.spam_description": "有害連結、假造的互動,或是重複性回覆",
+ "report.reasons.violation": "違反伺服器規則",
+ "report.reasons.violation_description": "您知道它違反特定規則",
+ "report.rules.subtitle": "請選擇所有適用的選項",
+ "report.rules.title": "違反了哪些規則?",
+ "report.statuses.subtitle": "請選擇所有適用的選項",
+ "report.statuses.title": "是否有能佐證這份檢舉之嘟文?",
"report.submit": "送出",
"report.target": "檢舉 {target}",
+ "report.thanks.take_action": "以下是控制您想於 Mastodon 看到什麼內容之選項:",
+ "report.thanks.take_action_actionable": "當我們正在審核期間,您可以對 @{name} 採取以下措施:",
+ "report.thanks.title": "不想再看到這個?",
+ "report.thanks.title_actionable": "感謝您的檢舉,我們將會著手處理。",
+ "report.unfollow": "取消跟隨 @{name}",
+ "report.unfollow_explanation": "您正在跟隨此帳號。如不欲於首頁再見到他們的嘟文,請取消跟隨。",
"search.placeholder": "搜尋",
"search_popout.search_format": "進階搜尋格式",
"search_popout.tips.full_text": "輸入簡單的文字,搜尋由您撰寫、最愛、轉嘟或提您的嘟文,以及與關鍵詞匹配的使用者名稱、帳戶顯示名稱和主題標籤。",
@@ -382,7 +434,9 @@
"search_popout.tips.text": "輸入簡單的文字,搜尋符合的使用者名稱,帳戶名稱與標籤",
"search_popout.tips.user": "使用者",
"search_results.accounts": "使用者",
+ "search_results.all": "全部",
"search_results.hashtags": "主題標籤",
+ "search_results.nothing_found": "無法找到符合搜尋條件之結果",
"search_results.statuses": "嘟文",
"search_results.statuses_fts_disabled": "「依內容搜尋嘟文」未在此 Mastodon 伺服器啟用。",
"search_results.total": "{count, number} 項結果",
@@ -396,9 +450,14 @@
"status.delete": "刪除",
"status.detailed_status": "詳細的對話內容",
"status.direct": "發送私訊給 @{name}",
+ "status.edit": "編輯",
+ "status.edited": "編輯於 {date}",
+ "status.edited_x_times": "已編輯 {count, plural, one {{count} 次} other {{count} 次}}",
"status.embed": "內嵌",
"status.favourite": "最愛",
"status.filtered": "已過濾",
+ "status.history.created": "{name} 於 {date} 建立",
+ "status.history.edited": "{name} 於 {date} 修改",
"status.load_more": "載入更多",
"status.media_hidden": "隱藏媒體內容",
"status.mention": "提及 @{name}",
@@ -462,7 +521,7 @@
"upload_form.video_description": "描述給聽障或視障人士",
"upload_modal.analyzing_picture": "正在分析圖片…",
"upload_modal.apply": "套用",
- "upload_modal.applying": "Applying…",
+ "upload_modal.applying": "正在套用⋯⋯",
"upload_modal.choose_image": "選擇圖片",
"upload_modal.description_placeholder": "我能吞下玻璃而不傷身體",
"upload_modal.detect_text": "從圖片中偵測文字",
diff --git a/app/javascript/mastodon/reducers/compose.js b/app/javascript/mastodon/reducers/compose.js
index 06a908e9d..ea882a71f 100644
--- a/app/javascript/mastodon/reducers/compose.js
+++ b/app/javascript/mastodon/reducers/compose.js
@@ -43,6 +43,7 @@ import {
INIT_MEDIA_EDIT_MODAL,
COMPOSE_CHANGE_MEDIA_DESCRIPTION,
COMPOSE_CHANGE_MEDIA_FOCUS,
+ COMPOSE_SET_STATUS,
} from '../actions/compose';
import { TIMELINE_DELETE } from '../actions/timelines';
import { STORE_HYDRATE } from '../actions/store';
@@ -58,6 +59,7 @@ const initialState = ImmutableMap({
spoiler: false,
spoiler_text: '',
privacy: null,
+ id: null,
text: '',
focusDate: null,
caretPosition: null,
@@ -107,6 +109,7 @@ function statusToTextMentions(state, status) {
function clearAll(state) {
return state.withMutations(map => {
+ map.set('id', null);
map.set('text', '');
map.set('spoiler', false);
map.set('spoiler_text', '');
@@ -313,6 +316,7 @@ export default function compose(state = initialState, action) {
return state.set('is_composing', action.value);
case COMPOSE_REPLY:
return state.withMutations(map => {
+ map.set('id', null);
map.set('in_reply_to', action.status.get('id'));
map.set('text', statusToTextMentions(state, action.status));
map.set('privacy', privacyPreference(action.status.get('visibility'), state.get('default_privacy')));
@@ -329,21 +333,12 @@ export default function compose(state = initialState, action) {
map.set('spoiler_text', '');
}
});
- case COMPOSE_REPLY_CANCEL:
- case COMPOSE_RESET:
- return state.withMutations(map => {
- map.set('in_reply_to', null);
- map.set('text', '');
- map.set('spoiler', false);
- map.set('spoiler_text', '');
- map.set('privacy', state.get('default_privacy'));
- map.set('poll', null);
- map.set('idempotencyKey', uuid());
- });
case COMPOSE_SUBMIT_REQUEST:
return state.set('is_submitting', true);
case COMPOSE_UPLOAD_CHANGE_REQUEST:
return state.set('is_changing_upload', true);
+ case COMPOSE_REPLY_CANCEL:
+ case COMPOSE_RESET:
case COMPOSE_SUBMIT_SUCCESS:
return clearAll(state);
case COMPOSE_SUBMIT_FAIL:
@@ -454,6 +449,34 @@ export default function compose(state = initialState, action) {
map.set('spoiler_text', '');
}
+ if (action.status.get('poll')) {
+ map.set('poll', ImmutableMap({
+ options: action.status.getIn(['poll', 'options']).map(x => x.get('title')),
+ multiple: action.status.getIn(['poll', 'multiple']),
+ expires_in: expiresInFromExpiresAt(action.status.getIn(['poll', 'expires_at'])),
+ }));
+ }
+ });
+ case COMPOSE_SET_STATUS:
+ return state.withMutations(map => {
+ map.set('id', action.status.get('id'));
+ map.set('text', action.text);
+ map.set('in_reply_to', action.status.get('in_reply_to_id'));
+ map.set('privacy', action.status.get('visibility'));
+ map.set('media_attachments', action.status.get('media_attachments'));
+ map.set('focusDate', new Date());
+ map.set('caretPosition', null);
+ map.set('idempotencyKey', uuid());
+ map.set('sensitive', action.status.get('sensitive'));
+
+ if (action.spoiler_text.length > 0) {
+ map.set('spoiler', true);
+ map.set('spoiler_text', action.spoiler_text);
+ } else {
+ map.set('spoiler', false);
+ map.set('spoiler_text', '');
+ }
+
if (action.status.get('poll')) {
map.set('poll', ImmutableMap({
options: action.status.getIn(['poll', 'options']).map(x => x.get('title')),
diff --git a/app/javascript/mastodon/reducers/history.js b/app/javascript/mastodon/reducers/history.js
new file mode 100644
index 000000000..00b01aa6e
--- /dev/null
+++ b/app/javascript/mastodon/reducers/history.js
@@ -0,0 +1,28 @@
+import { HISTORY_FETCH_REQUEST, HISTORY_FETCH_SUCCESS, HISTORY_FETCH_FAIL } from 'mastodon/actions/history';
+import { Map as ImmutableMap, List as ImmutableList, fromJS } from 'immutable';
+
+const initialHistory = ImmutableMap({
+ loading: false,
+ items: ImmutableList(),
+});
+
+const initialState = ImmutableMap();
+
+export default function history(state = initialState, action) {
+ switch(action.type) {
+ case HISTORY_FETCH_REQUEST:
+ return state.update(action.statusId, initialHistory, history => history.withMutations(map => {
+ map.set('loading', true);
+ map.set('items', ImmutableList());
+ }));
+ case HISTORY_FETCH_SUCCESS:
+ return state.update(action.statusId, initialHistory, history => history.withMutations(map => {
+ map.set('loading', false);
+ map.set('items', fromJS(action.history.map((x, i) => ({ ...x, account: x.account.id, original: i === 0 })).reverse()));
+ }));
+ case HISTORY_FETCH_FAIL:
+ return state.update(action.statusId, initialHistory, history => history.set('loading', false));
+ default:
+ return state;
+ }
+}
diff --git a/app/javascript/mastodon/reducers/index.js b/app/javascript/mastodon/reducers/index.js
index 53e2dd681..0219d8a5e 100644
--- a/app/javascript/mastodon/reducers/index.js
+++ b/app/javascript/mastodon/reducers/index.js
@@ -17,7 +17,7 @@ import status_lists from './status_lists';
import mutes from './mutes';
import blocks from './blocks';
import boosts from './boosts';
-import reports from './reports';
+import rules from './rules';
import contexts from './contexts';
import compose from './compose';
import search from './search';
@@ -38,6 +38,7 @@ import announcements from './announcements';
import markers from './markers';
import picture_in_picture from './picture_in_picture';
import accounts_map from './accounts_map';
+import history from './history';
const reducers = {
announcements,
@@ -60,7 +61,7 @@ const reducers = {
mutes,
blocks,
boosts,
- reports,
+ rules,
contexts,
compose,
search,
@@ -79,6 +80,7 @@ const reducers = {
missed_updates,
markers,
picture_in_picture,
+ history,
};
export default combineReducers(reducers);
diff --git a/app/javascript/mastodon/reducers/modal.js b/app/javascript/mastodon/reducers/modal.js
index ea81b4332..3eab07d9d 100644
--- a/app/javascript/mastodon/reducers/modal.js
+++ b/app/javascript/mastodon/reducers/modal.js
@@ -1,15 +1,38 @@
import { MODAL_OPEN, MODAL_CLOSE } from '../actions/modal';
import { TIMELINE_DELETE } from '../actions/timelines';
+import { COMPOSE_UPLOAD_CHANGE_SUCCESS } from '../actions/compose';
import { Stack as ImmutableStack, Map as ImmutableMap } from 'immutable';
-export default function modal(state = ImmutableStack(), action) {
+const initialState = ImmutableMap({
+ ignoreFocus: false,
+ stack: ImmutableStack(),
+});
+
+const popModal = (state, { modalType, ignoreFocus }) => {
+ if (modalType === undefined || modalType === state.getIn(['stack', 0, 'modalType'])) {
+ return state.set('ignoreFocus', !!ignoreFocus).update('stack', stack => stack.shift());
+ } else {
+ return state;
+ }
+};
+
+const pushModal = (state, modalType, modalProps) => {
+ return state.withMutations(map => {
+ map.set('ignoreFocus', false);
+ map.update('stack', stack => stack.unshift(ImmutableMap({ modalType, modalProps })));
+ });
+};
+
+export default function modal(state = initialState, action) {
switch(action.type) {
case MODAL_OPEN:
- return state.unshift(ImmutableMap({ modalType: action.modalType, modalProps: action.modalProps }));
+ return pushModal(state, action.modalType, action.modalProps);
case MODAL_CLOSE:
- return (action.modalType === undefined || action.modalType === state.getIn([0, 'modalType'])) ? state.shift() : state;
+ return popModal(state, action);
+ case COMPOSE_UPLOAD_CHANGE_SUCCESS:
+ return popModal(state, { modalType: 'FOCAL_POINT', ignoreFocus: false });
case TIMELINE_DELETE:
- return state.filterNot((modal) => modal.get('modalProps').statusId === action.id);
+ return state.update('stack', stack => stack.filterNot((modal) => modal.get('modalProps').statusId === action.id));
default:
return state;
}
diff --git a/app/javascript/mastodon/reducers/reports.js b/app/javascript/mastodon/reducers/reports.js
deleted file mode 100644
index 21ae6f93f..000000000
--- a/app/javascript/mastodon/reducers/reports.js
+++ /dev/null
@@ -1,64 +0,0 @@
-import {
- REPORT_INIT,
- REPORT_SUBMIT_REQUEST,
- REPORT_SUBMIT_SUCCESS,
- REPORT_SUBMIT_FAIL,
- REPORT_CANCEL,
- REPORT_STATUS_TOGGLE,
- REPORT_COMMENT_CHANGE,
- REPORT_FORWARD_CHANGE,
-} from '../actions/reports';
-import { Map as ImmutableMap, Set as ImmutableSet } from 'immutable';
-
-const initialState = ImmutableMap({
- new: ImmutableMap({
- isSubmitting: false,
- account_id: null,
- status_ids: ImmutableSet(),
- comment: '',
- forward: false,
- }),
-});
-
-export default function reports(state = initialState, action) {
- switch(action.type) {
- case REPORT_INIT:
- return state.withMutations(map => {
- map.setIn(['new', 'isSubmitting'], false);
- map.setIn(['new', 'account_id'], action.account.get('id'));
-
- if (state.getIn(['new', 'account_id']) !== action.account.get('id')) {
- map.setIn(['new', 'status_ids'], action.status ? ImmutableSet([action.status.getIn(['reblog', 'id'], action.status.get('id'))]) : ImmutableSet());
- map.setIn(['new', 'comment'], '');
- } else if (action.status) {
- map.updateIn(['new', 'status_ids'], ImmutableSet(), set => set.add(action.status.getIn(['reblog', 'id'], action.status.get('id'))));
- }
- });
- case REPORT_STATUS_TOGGLE:
- return state.updateIn(['new', 'status_ids'], ImmutableSet(), set => {
- if (action.checked) {
- return set.add(action.statusId);
- }
-
- return set.remove(action.statusId);
- });
- case REPORT_COMMENT_CHANGE:
- return state.setIn(['new', 'comment'], action.comment);
- case REPORT_FORWARD_CHANGE:
- return state.setIn(['new', 'forward'], action.forward);
- case REPORT_SUBMIT_REQUEST:
- return state.setIn(['new', 'isSubmitting'], true);
- case REPORT_SUBMIT_FAIL:
- return state.setIn(['new', 'isSubmitting'], false);
- case REPORT_CANCEL:
- case REPORT_SUBMIT_SUCCESS:
- return state.withMutations(map => {
- map.setIn(['new', 'account_id'], null);
- map.setIn(['new', 'status_ids'], ImmutableSet());
- map.setIn(['new', 'comment'], '');
- map.setIn(['new', 'isSubmitting'], false);
- });
- default:
- return state;
- }
-};
diff --git a/app/javascript/mastodon/reducers/rules.js b/app/javascript/mastodon/reducers/rules.js
new file mode 100644
index 000000000..c1180b520
--- /dev/null
+++ b/app/javascript/mastodon/reducers/rules.js
@@ -0,0 +1,13 @@
+import { RULES_FETCH_SUCCESS } from 'mastodon/actions/rules';
+import { List as ImmutableList, fromJS } from 'immutable';
+
+const initialState = ImmutableList();
+
+export default function rules(state = initialState, action) {
+ switch (action.type) {
+ case RULES_FETCH_SUCCESS:
+ return fromJS(action.rules);
+ default:
+ return state;
+ }
+}
diff --git a/app/javascript/mastodon/reducers/search.js b/app/javascript/mastodon/reducers/search.js
index 875b2d92b..7dceac6b9 100644
--- a/app/javascript/mastodon/reducers/search.js
+++ b/app/javascript/mastodon/reducers/search.js
@@ -1,6 +1,8 @@
import {
SEARCH_CHANGE,
SEARCH_CLEAR,
+ SEARCH_FETCH_REQUEST,
+ SEARCH_FETCH_FAIL,
SEARCH_FETCH_SUCCESS,
SEARCH_SHOW,
SEARCH_EXPAND_SUCCESS,
@@ -17,6 +19,7 @@ const initialState = ImmutableMap({
submitted: false,
hidden: false,
results: ImmutableMap(),
+ isLoading: false,
searchTerm: '',
});
@@ -37,12 +40,24 @@ export default function search(state = initialState, action) {
case COMPOSE_MENTION:
case COMPOSE_DIRECT:
return state.set('hidden', true);
+ case SEARCH_FETCH_REQUEST:
+ return state.withMutations(map => {
+ map.set('isLoading', true);
+ map.set('submitted', true);
+ });
+ case SEARCH_FETCH_FAIL:
+ return state.set('isLoading', false);
case SEARCH_FETCH_SUCCESS:
- return state.set('results', ImmutableMap({
- accounts: ImmutableList(action.results.accounts.map(item => item.id)),
- statuses: ImmutableList(action.results.statuses.map(item => item.id)),
- hashtags: fromJS(action.results.hashtags),
- })).set('submitted', true).set('searchTerm', action.searchTerm);
+ return state.withMutations(map => {
+ map.set('results', ImmutableMap({
+ accounts: ImmutableList(action.results.accounts.map(item => item.id)),
+ statuses: ImmutableList(action.results.statuses.map(item => item.id)),
+ hashtags: fromJS(action.results.hashtags),
+ }));
+
+ map.set('searchTerm', action.searchTerm);
+ map.set('isLoading', false);
+ });
case SEARCH_EXPAND_SUCCESS:
const results = action.searchType === 'hashtags' ? fromJS(action.results.hashtags) : action.results[action.searchType].map(item => item.id);
return state.updateIn(['results', action.searchType], list => list.concat(results));
diff --git a/app/javascript/mastodon/reducers/settings.js b/app/javascript/mastodon/reducers/settings.js
index 2a89919e1..39639f3dc 100644
--- a/app/javascript/mastodon/reducers/settings.js
+++ b/app/javascript/mastodon/reducers/settings.js
@@ -36,6 +36,8 @@ const initialState = ImmutableMap({
mention: false,
poll: false,
status: false,
+ update: false,
+ 'admin.sign_up': false,
}),
quickFilter: ImmutableMap({
@@ -55,6 +57,8 @@ const initialState = ImmutableMap({
mention: true,
poll: true,
status: true,
+ update: true,
+ 'admin.sign_up': true,
}),
sounds: ImmutableMap({
@@ -65,6 +69,8 @@ const initialState = ImmutableMap({
mention: true,
poll: true,
status: true,
+ update: true,
+ 'admin.sign_up': true,
}),
}),
diff --git a/app/javascript/mastodon/reducers/status_lists.js b/app/javascript/mastodon/reducers/status_lists.js
index 9f8f28dee..49bc94a40 100644
--- a/app/javascript/mastodon/reducers/status_lists.js
+++ b/app/javascript/mastodon/reducers/status_lists.js
@@ -17,6 +17,11 @@ import {
import {
PINNED_STATUSES_FETCH_SUCCESS,
} from '../actions/pin_statuses';
+import {
+ TRENDS_STATUSES_FETCH_REQUEST,
+ TRENDS_STATUSES_FETCH_SUCCESS,
+ TRENDS_STATUSES_FETCH_FAIL,
+} from '../actions/trends';
import { Map as ImmutableMap, List as ImmutableList } from 'immutable';
import {
FAVOURITE_SUCCESS,
@@ -26,6 +31,10 @@ import {
PIN_SUCCESS,
UNPIN_SUCCESS,
} from '../actions/interactions';
+import {
+ ACCOUNT_BLOCK_SUCCESS,
+ ACCOUNT_MUTE_SUCCESS,
+} from '../actions/accounts';
const initialState = ImmutableMap({
favourites: ImmutableMap({
@@ -43,6 +52,11 @@ const initialState = ImmutableMap({
loaded: false,
items: ImmutableList(),
}),
+ trending: ImmutableMap({
+ next: null,
+ loaded: false,
+ items: ImmutableList(),
+ }),
});
const normalizeList = (state, listType, statuses, next) => {
@@ -96,6 +110,12 @@ export default function statusLists(state = initialState, action) {
return normalizeList(state, 'bookmarks', action.statuses, action.next);
case BOOKMARKED_STATUSES_EXPAND_SUCCESS:
return appendToList(state, 'bookmarks', action.statuses, action.next);
+ case TRENDS_STATUSES_FETCH_REQUEST:
+ return state.setIn(['trending', 'isLoading'], true);
+ case TRENDS_STATUSES_FETCH_FAIL:
+ return state.setIn(['trending', 'isLoading'], false);
+ case TRENDS_STATUSES_FETCH_SUCCESS:
+ return normalizeList(state, 'trending', action.statuses, action.next);
case FAVOURITE_SUCCESS:
return prependOneToList(state, 'favourites', action.status);
case UNFAVOURITE_SUCCESS:
@@ -110,6 +130,9 @@ export default function statusLists(state = initialState, action) {
return prependOneToList(state, 'pins', action.status);
case UNPIN_SUCCESS:
return removeOneFromList(state, 'pins', action.status);
+ case ACCOUNT_BLOCK_SUCCESS:
+ case ACCOUNT_MUTE_SUCCESS:
+ return state.updateIn(['trending', 'items'], ImmutableList(), list => list.filterNot(statusId => action.statuses.getIn([statusId, 'account']) === action.relationship.id));
default:
return state;
}
diff --git a/app/javascript/mastodon/reducers/trends.js b/app/javascript/mastodon/reducers/trends.js
index 5cecc8fca..3e01bd07d 100644
--- a/app/javascript/mastodon/reducers/trends.js
+++ b/app/javascript/mastodon/reducers/trends.js
@@ -1,22 +1,45 @@
-import { TRENDS_FETCH_REQUEST, TRENDS_FETCH_SUCCESS, TRENDS_FETCH_FAIL } from '../actions/trends';
+import {
+ TRENDS_TAGS_FETCH_REQUEST,
+ TRENDS_TAGS_FETCH_SUCCESS,
+ TRENDS_TAGS_FETCH_FAIL,
+ TRENDS_LINKS_FETCH_REQUEST,
+ TRENDS_LINKS_FETCH_SUCCESS,
+ TRENDS_LINKS_FETCH_FAIL,
+} from 'mastodon/actions/trends';
import { Map as ImmutableMap, List as ImmutableList, fromJS } from 'immutable';
const initialState = ImmutableMap({
- items: ImmutableList(),
- isLoading: false,
+ tags: ImmutableMap({
+ items: ImmutableList(),
+ isLoading: false,
+ }),
+
+ links: ImmutableMap({
+ items: ImmutableList(),
+ isLoading: false,
+ }),
});
export default function trendsReducer(state = initialState, action) {
switch(action.type) {
- case TRENDS_FETCH_REQUEST:
- return state.set('isLoading', true);
- case TRENDS_FETCH_SUCCESS:
+ case TRENDS_TAGS_FETCH_REQUEST:
+ return state.setIn(['tags', 'isLoading'], true);
+ case TRENDS_TAGS_FETCH_SUCCESS:
return state.withMutations(map => {
- map.set('items', fromJS(action.trends));
- map.set('isLoading', false);
+ map.setIn(['tags', 'items'], fromJS(action.trends));
+ map.setIn(['tags', 'isLoading'], false);
});
- case TRENDS_FETCH_FAIL:
- return state.set('isLoading', false);
+ case TRENDS_TAGS_FETCH_FAIL:
+ return state.setIn(['tags', 'isLoading'], false);
+ case TRENDS_LINKS_FETCH_REQUEST:
+ return state.setIn(['links', 'isLoading'], true);
+ case TRENDS_LINKS_FETCH_SUCCESS:
+ return state.withMutations(map => {
+ map.setIn(['links', 'items'], fromJS(action.trends));
+ map.setIn(['links', 'isLoading'], false);
+ });
+ case TRENDS_LINKS_FETCH_FAIL:
+ return state.setIn(['links', 'isLoading'], false);
default:
return state;
}
diff --git a/app/javascript/mastodon/service_worker/web_push_locales.js b/app/javascript/mastodon/service_worker/web_push_locales.js
index 1265f3cfa..7d713cd37 100644
--- a/app/javascript/mastodon/service_worker/web_push_locales.js
+++ b/app/javascript/mastodon/service_worker/web_push_locales.js
@@ -20,6 +20,9 @@ filenames.forEach(filename => {
'notification.mention': full['notification.mention'] || '',
'notification.reblog': full['notification.reblog'] || '',
'notification.poll': full['notification.poll'] || '',
+ 'notification.status': full['notification.status'] || '',
+ 'notification.update': full['notification.update'] || '',
+ 'notification.admin.sign_up': full['notification.admin.sign_up'] || '',
'status.show_more': full['status.show_more'] || '',
'status.reblog': full['status.reblog'] || '',
diff --git a/app/javascript/mastodon/service_worker/web_push_notifications.js b/app/javascript/mastodon/service_worker/web_push_notifications.js
index 926c5c4d7..48a2be7e7 100644
--- a/app/javascript/mastodon/service_worker/web_push_notifications.js
+++ b/app/javascript/mastodon/service_worker/web_push_notifications.js
@@ -102,7 +102,7 @@ const handlePush = (event) => {
options.image = undefined;
options.actions = [actionExpand(preferred_locale)];
- } else if (notification.type === 'mention') {
+ } else if (['mention', 'status'].includes(notification.type)) {
options.actions = [actionReblog(preferred_locale), actionFavourite(preferred_locale)];
}
diff --git a/app/javascript/packs/public.js b/app/javascript/packs/public.js
index 7ebe8b4d0..be467a8e2 100644
--- a/app/javascript/packs/public.js
+++ b/app/javascript/packs/public.js
@@ -151,13 +151,7 @@ function main() {
});
delegate(document, '.sidebar__toggle__icon', 'click', () => {
- const target = document.querySelector('.sidebar ul');
-
- if (target.style.display === 'block') {
- target.style.display = 'none';
- } else {
- target.style.display = 'block';
- }
+ document.querySelector('.sidebar ul').classList.toggle('visible');
});
// Empty the honeypot fields in JS in case something like an extension
diff --git a/app/javascript/styles/mastodon-light/diff.scss b/app/javascript/styles/mastodon-light/diff.scss
index 8e6b0cdd5..2c8162b28 100644
--- a/app/javascript/styles/mastodon-light/diff.scss
+++ b/app/javascript/styles/mastodon-light/diff.scss
@@ -40,19 +40,11 @@ html {
background: lighten($ui-base-color, 12%);
}
-.filter-form,
-.directory__card__bar {
+.filter-form {
background: $white;
border-bottom: 1px solid lighten($ui-base-color, 8%);
}
-.scrollable .directory__list {
- width: calc(100% + 2px);
- margin-left: -1px;
- margin-right: -1px;
-}
-
-.directory__card,
.table-of-contents {
border: 1px solid lighten($ui-base-color, 8%);
}
@@ -75,8 +67,7 @@ html {
.column-header__back-button,
.column-header__button,
.column-header__button.active,
-.account__header__bar,
-.directory__card__extra {
+.account__header__bar {
background: $white;
}
@@ -152,10 +143,15 @@ html {
.box-widget input[type="password"],
.box-widget textarea,
.statuses-grid .detailed-status,
+.report-dialog-modal__textarea,
.audio-player {
border: 1px solid lighten($ui-base-color, 8%);
}
+.report-dialog-modal .dialog-option .poll__input {
+ color: $white;
+}
+
.search__input {
@media screen and (max-width: $no-gap-breakpoint) {
border-top: 0;
@@ -308,7 +304,8 @@ html {
}
&__item {
- a {
+ a,
+ button {
background: $white;
color: $darker-text-color;
}
@@ -340,10 +337,18 @@ html {
color: $white;
}
-.dropdown-menu__separator {
+.dropdown-menu__separator,
+.dropdown-menu__item.edited-timestamp__history__item,
+.dropdown-menu__container__header,
+.compare-history-modal .report-modal__target,
+.report-dialog-modal .poll__option.dialog-option {
border-bottom-color: lighten($ui-base-color, 4%);
}
+.report-dialog-modal__container {
+ border-top-color: lighten($ui-base-color, 4%);
+}
+
// Change the background colors of modals
.actions-modal,
.boost-modal,
@@ -351,9 +356,11 @@ html {
.mute-modal,
.block-modal,
.report-modal,
+.report-dialog-modal,
.embed-modal,
.error-modal,
.onboarding-modal,
+.compare-history-modal,
.report-modal__comment .setting-text__wrapper,
.report-modal__comment .setting-text,
.announcements,
diff --git a/app/javascript/styles/mastodon/accounts.scss b/app/javascript/styles/mastodon/accounts.scss
index 485fe4a9d..215774a19 100644
--- a/app/javascript/styles/mastodon/accounts.scss
+++ b/app/javascript/styles/mastodon/accounts.scss
@@ -331,7 +331,8 @@
}
.batch-table__row--muted .pending-account__header,
-.batch-table__row--muted .accounts-table {
+.batch-table__row--muted .accounts-table,
+.batch-table__row--muted .name-tag {
&,
a,
strong {
@@ -339,6 +340,10 @@
}
}
+.batch-table__row--muted .name-tag .avatar {
+ opacity: 0.5;
+}
+
.batch-table__row--muted .accounts-table {
tbody td.accounts-table__extra,
&__count,
@@ -352,7 +357,8 @@
}
.batch-table__row--attention .pending-account__header,
-.batch-table__row--attention .accounts-table {
+.batch-table__row--attention .accounts-table,
+.batch-table__row--attention .name-tag {
&,
a,
strong {
diff --git a/app/javascript/styles/mastodon/admin.scss b/app/javascript/styles/mastodon/admin.scss
index 92061585a..27be22f1b 100644
--- a/app/javascript/styles/mastodon/admin.scss
+++ b/app/javascript/styles/mastodon/admin.scss
@@ -322,6 +322,10 @@ $content-width: 840px;
& > ul {
display: none;
+
+ &.visible {
+ display: block;
+ }
}
ul a,
@@ -363,6 +367,21 @@ body,
}
}
+ .positive-hint,
+ .negative-hint,
+ .neutral-hint {
+ a {
+ color: inherit;
+ text-decoration: underline;
+
+ &:focus,
+ &:hover,
+ &:active {
+ text-decoration: none;
+ }
+ }
+ }
+
.positive-hint {
color: $valid-value-color;
font-weight: 500;
@@ -594,12 +613,16 @@ body,
}
.log-entry {
+ display: block;
line-height: 20px;
padding: 15px;
padding-left: 15px * 2 + 40px;
background: $ui-base-color;
border-bottom: 1px solid darken($ui-base-color, 8%);
position: relative;
+ text-decoration: none;
+ color: $darker-text-color;
+ font-size: 14px;
&:first-child {
border-top-left-radius: 4px;
@@ -612,15 +635,12 @@ body,
border-bottom: 0;
}
- &:hover {
+ &:hover,
+ &:focus,
+ &:active {
background: lighten($ui-base-color, 4%);
}
- &__header {
- color: $darker-text-color;
- font-size: 14px;
- }
-
&__avatar {
position: absolute;
left: 15px;
@@ -899,6 +919,14 @@ a.name-tag,
text-align: center;
}
+.applications-list__item {
+ padding: 15px 0;
+ background: $ui-base-color;
+ border: 1px solid lighten($ui-base-color, 4%);
+ border-radius: 4px;
+ margin-top: 15px;
+}
+
.announcements-list {
border: 1px solid lighten($ui-base-color, 4%);
border-radius: 4px;
@@ -918,6 +946,12 @@ a.name-tag,
text-decoration: none;
margin-bottom: 10px;
+ .account-role {
+ vertical-align: middle;
+ }
+ }
+
+ a.announcements-list__item__title {
&:hover,
&:focus,
&:active {
@@ -936,6 +970,10 @@ a.name-tag,
align-items: center;
}
+ &__permissions {
+ margin-top: 10px;
+ }
+
&:last-child {
border-bottom: 0;
}
@@ -1203,12 +1241,21 @@ a.sparkline {
}
}
}
+
+ @media screen and (max-width: 930px) {
+ grid-template-columns: minmax(0, 1fr);
+ }
}
.account-card {
background: $ui-base-color;
border-radius: 4px;
+ &__permalink {
+ color: inherit;
+ text-decoration: none;
+ }
+
&__header {
padding: 4px;
border-radius: 4px;
@@ -1225,20 +1272,22 @@ a.sparkline {
}
&__title {
- margin-top: -25px;
+ margin-top: -(15px + 8px);
display: flex;
align-items: flex-end;
&__avatar {
- padding: 15px;
+ padding: 14px;
- img {
+ img,
+ .account__avatar {
display: block;
margin: 0;
width: 56px;
height: 56px;
- background: darken($ui-base-color, 8%);
+ background-color: darken($ui-base-color, 8%);
border-radius: 8px;
+ border: 1px solid $ui-base-color;
}
}
@@ -1246,44 +1295,77 @@ a.sparkline {
color: $darker-text-color;
padding-bottom: 15px;
font-size: 15px;
+ line-height: 20px;
bdi {
display: block;
color: $primary-text-color;
- font-weight: 500;
+ font-weight: 700;
}
}
}
&__bio {
padding: 0 15px;
+ margin: 8px 0;
overflow: hidden;
text-overflow: ellipsis;
word-wrap: break-word;
- max-height: 18px * 2;
+ max-height: 21px * 2;
position: relative;
+ font-size: 15px;
+ line-height: 21px;
&::after {
display: block;
content: "";
width: 50px;
- height: 18px;
+ height: 21px;
position: absolute;
bottom: 0;
right: 15px;
background: linear-gradient(to left, $ui-base-color, transparent);
pointer-events: none;
}
+
+ a {
+ color: $secondary-text-color;
+ text-decoration: none;
+ unicode-bidi: isolate;
+
+ &:hover {
+ text-decoration: underline;
+ }
+
+ &.mention {
+ &:hover {
+ text-decoration: none;
+
+ span {
+ text-decoration: underline;
+ }
+ }
+ }
+ }
}
&__actions {
display: flex;
+ justify-content: space-between;
align-items: center;
- padding-top: 10px;
&__button {
- flex: 0 0 auto;
+ flex-shrink: 1;
padding: 0 15px;
+ overflow: hidden;
+
+ .button {
+ min-width: 0;
+ white-space: nowrap;
+ text-overflow: ellipsis;
+ overflow: hidden;
+ max-width: 100%;
+ }
}
}
@@ -1292,19 +1374,23 @@ a.sparkline {
display: grid;
grid-auto-columns: minmax(0, 1fr);
grid-auto-flow: column;
+ max-width: 340px;
+ min-width: 65px * 3;
&__item {
- padding: 15px;
+ padding: 15px 0;
text-align: center;
color: $primary-text-color;
font-weight: 600;
font-size: 15px;
+ line-height: 21px;
small {
display: block;
color: $darker-text-color;
font-weight: 400;
font-size: 13px;
+ line-height: 18px;
}
}
}
@@ -1350,16 +1436,20 @@ a.sparkline {
line-height: 20px;
margin-bottom: 4px;
- .username a {
+ .username {
color: $primary-text-color;
font-weight: 500;
- text-decoration: none;
margin-right: 5px;
- &:hover,
- &:focus,
- &:active {
- text-decoration: underline;
+ a {
+ color: inherit;
+ text-decoration: none;
+
+ &:hover,
+ &:focus,
+ &:active {
+ text-decoration: underline;
+ }
}
}
@@ -1410,8 +1500,9 @@ a.sparkline {
}
&__button {
+ box-sizing: border-box;
flex: 0 0 auto;
- width: 100px;
+ width: 200px;
padding: 15px;
padding-right: 0;
@@ -1427,4 +1518,147 @@ a.sparkline {
color: $dark-text-color;
}
}
+
+ @media screen and (max-width: 800px) {
+ border: 0;
+
+ &__item {
+ flex-direction: column;
+ border: 0;
+
+ &__button {
+ width: 100%;
+ padding: 15px 0;
+ }
+
+ &__description {
+ padding: 0;
+ padding-bottom: 15px;
+ }
+ }
+ }
+}
+
+.section-skip-link {
+ float: right;
+
+ a {
+ color: $ui-highlight-color;
+ text-decoration: none;
+
+ &:hover,
+ &:focus,
+ &:active {
+ text-decoration: underline;
+ }
+ }
+}
+
+.strike-card {
+ padding: 15px;
+ border-radius: 4px;
+ background: $ui-base-color;
+ font-size: 15px;
+ line-height: 20px;
+ word-wrap: break-word;
+ font-weight: 400;
+ color: $primary-text-color;
+ box-sizing: border-box;
+ min-height: 100%;
+
+ p {
+ margin-bottom: 20px;
+ unicode-bidi: plaintext;
+
+ &:last-child {
+ margin-bottom: 0;
+ }
+
+ strong {
+ font-weight: 700;
+ }
+ }
+
+ &__rules {
+ list-style: disc;
+ padding-left: 15px;
+ margin-bottom: 20px;
+ color: $darker-text-color;
+
+ &:last-child {
+ margin-bottom: 0;
+ }
+
+ &__text {
+ color: $primary-text-color;
+ }
+ }
+
+ &__statuses-list {
+ border-radius: 4px;
+ border: 1px solid darken($ui-base-color, 8%);
+ font-size: 13px;
+ line-height: 18px;
+ overflow: hidden;
+
+ &__item {
+ padding: 16px;
+ background: lighten($ui-base-color, 2%);
+ border-bottom: 1px solid darken($ui-base-color, 8%);
+
+ &:last-child {
+ border-bottom: 0;
+ }
+
+ &__meta {
+ color: $darker-text-color;
+ }
+
+ a {
+ color: inherit;
+ text-decoration: none;
+
+ &:hover,
+ &:focus,
+ &:active {
+ text-decoration: underline;
+ }
+ }
+ }
+ }
+}
+
+.availability-indicator {
+ display: flex;
+ align-items: center;
+ margin-bottom: 30px;
+ font-size: 14px;
+ line-height: 21px;
+
+ &__hint {
+ padding: 0 15px;
+ }
+
+ &__graphic {
+ display: flex;
+ margin: 0 -2px;
+
+ &__item {
+ display: block;
+ flex: 0 0 auto;
+ width: 4px;
+ height: 21px;
+ background: lighten($ui-base-color, 8%);
+ margin: 0 2px;
+ border-radius: 2px;
+
+ &.positive {
+ background: $valid-value-color;
+ }
+
+ &.negative {
+ background: $error-value-color;
+ }
+ }
+ }
}
diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss
index 9cacd10b5..713d24c0f 100644
--- a/app/javascript/styles/mastodon/components.scss
+++ b/app/javascript/styles/mastodon/components.scss
@@ -50,16 +50,14 @@
cursor: pointer;
display: inline-block;
font-family: inherit;
- font-size: 14px;
+ font-size: 15px;
font-weight: 500;
- height: 36px;
letter-spacing: 0;
- line-height: 36px;
+ line-height: 22px;
overflow: hidden;
- padding: 0 16px;
+ padding: 7px 18px;
position: relative;
text-align: center;
- text-transform: uppercase;
text-decoration: none;
text-overflow: ellipsis;
transition: all 100ms ease-in;
@@ -100,17 +98,6 @@
outline: 0 !important;
}
- &.button-primary,
- &.button-alternative,
- &.button-secondary,
- &.button-alternative-2 {
- font-size: 16px;
- line-height: 36px;
- height: auto;
- text-transform: none;
- padding: 4px 16px;
- }
-
&.button-alternative {
color: $inverted-text-color;
background: $ui-primary-color;
@@ -135,7 +122,7 @@
&.button-secondary {
color: $darker-text-color;
background: transparent;
- padding: 3px 15px;
+ padding: 6px 17px;
border: 1px solid $ui-primary-color;
&:active,
@@ -179,6 +166,11 @@
transition-property: background-color, color;
text-decoration: none;
+ a {
+ color: inherit;
+ text-decoration: none;
+ }
+
&:hover,
&:active,
&:focus {
@@ -604,30 +596,24 @@
display: flex;
align-items: flex-start;
justify-content: space-between;
- opacity: 0;
- transition: opacity .1s ease;
+ }
- .icon-button {
- flex: 0 1 auto;
- color: $secondary-text-color;
- font-size: 14px;
- font-weight: 500;
- padding: 10px;
- font-family: inherit;
+ .icon-button {
+ flex: 0 1 auto;
+ color: $secondary-text-color;
+ font-size: 14px;
+ font-weight: 500;
+ padding: 10px;
+ font-family: inherit;
- &:hover,
- &:focus,
- &:active {
- color: lighten($secondary-text-color, 7%);
- }
- }
-
- &.active {
- opacity: 1;
+ &:hover,
+ &:focus,
+ &:active {
+ color: lighten($secondary-text-color, 7%);
}
}
- &-description {
+ &__warning {
position: absolute;
z-index: 2;
bottom: 0;
@@ -635,34 +621,6 @@
right: 0;
box-sizing: border-box;
background: linear-gradient(0deg, rgba($base-shadow-color, 0.8) 0, rgba($base-shadow-color, 0.35) 80%, transparent);
- padding: 10px;
- opacity: 0;
- transition: opacity .1s ease;
-
- textarea {
- background: transparent;
- color: $secondary-text-color;
- border: 0;
- padding: 0;
- margin: 0;
- width: 100%;
- font-family: inherit;
- font-size: 14px;
- font-weight: 500;
-
- &:focus {
- color: $white;
- }
-
- &::placeholder {
- opacity: 0.75;
- color: $secondary-text-color;
- }
- }
-
- &.active {
- opacity: 1;
- }
}
}
@@ -878,7 +836,8 @@
.status__content__spoiler-link {
background: $action-button-color;
- &:hover {
+ &:hover,
+ &:focus {
background: lighten($action-button-color, 7%);
text-decoration: none;
}
@@ -990,7 +949,7 @@
text-transform: uppercase;
line-height: 20px;
cursor: pointer;
- vertical-align: middle;
+ vertical-align: top;
}
.status__wrapper--filtered {
@@ -1039,12 +998,8 @@
}
@keyframes fade {
- 0% {
- opacity: 0;
- }
- 100% {
- opacity: 1;
- }
+ 0% { opacity: 0; }
+ 100% { opacity: 1; }
}
opacity: 1;
@@ -1054,42 +1009,6 @@
.audio-player {
margin-top: 8px;
}
-
- &.light {
- .status__relative-time,
- .status__visibility-icon {
- color: $light-text-color;
- }
-
- .status__display-name {
- color: $inverted-text-color;
- }
-
- .display-name {
- color: $light-text-color;
-
- strong {
- color: $inverted-text-color;
- }
- }
-
- .status__content {
- color: $inverted-text-color;
-
- a {
- color: $highlight-text-color;
- }
-
- a.status__content__spoiler-link {
- color: $primary-text-color;
- background: $ui-primary-color;
-
- &:hover {
- background: lighten($ui-primary-color, 8%);
- }
- }
- }
- }
}
.status__relative-time,
@@ -1118,42 +1037,39 @@
font-size: 15px;
}
-.status-check-box {
- border-bottom: 1px solid $ui-secondary-color;
- display: flex;
+.status-check-box__status {
+ display: block;
+ box-sizing: border-box;
+ width: 100%;
+ padding: 0 10px;
- .status-check-box__status {
- margin: 10px 0 10px 10px;
- flex: 1;
- overflow: hidden;
+ .detailed-status__display-name {
+ color: lighten($inverted-text-color, 16%);
- .media-gallery {
- max-width: 250px;
+ span {
+ display: inline;
}
- .status__content {
- padding: 0;
- white-space: normal;
- }
-
- .video-player,
- .audio-player {
- margin-top: 8px;
- max-width: 250px;
- }
-
- .media-gallery__item-thumbnail {
- cursor: default;
+ &:hover strong {
+ text-decoration: none;
}
}
-}
-.status-check-box-toggle {
- align-items: center;
- display: flex;
- flex: 0 0 auto;
- justify-content: center;
- padding: 10px;
+ .media-gallery,
+ .audio-player,
+ .video-player {
+ margin-top: 15px;
+ max-width: 250px;
+ }
+
+ .status__content {
+ padding: 0;
+ white-space: normal;
+ }
+
+ .media-gallery__item-thumbnail {
+ cursor: default;
+ }
}
.status__prepend {
@@ -1238,6 +1154,43 @@
.audio-player {
margin-top: 8px;
}
+
+ &.light {
+ .status__relative-time,
+ .status__visibility-icon {
+ color: $light-text-color;
+ }
+
+ .status__display-name {
+ color: $inverted-text-color;
+ }
+
+ .display-name {
+ color: $light-text-color;
+
+ strong {
+ color: $inverted-text-color;
+ }
+ }
+
+ .status__content {
+ color: $inverted-text-color;
+
+ a {
+ color: $highlight-text-color;
+ }
+
+ a.status__content__spoiler-link {
+ color: $primary-text-color;
+ background: $ui-primary-color;
+
+ &:hover,
+ &:focus {
+ background: lighten($ui-primary-color, 8%);
+ }
+ }
+ }
+ }
}
.detailed-status__meta {
@@ -1661,7 +1614,8 @@ a.account__display-name {
background: $ui-base-lighter-color;
color: $inverted-text-color;
- &:hover {
+ &:hover,
+ &:focus {
background: lighten($ui-base-lighter-color, 7%);
text-decoration: none;
}
@@ -1766,11 +1720,11 @@ a.account__display-name {
justify-content: center;
flex-direction: column;
scrollbar-width: none; /* Firefox */
- -ms-overflow-style: none; /* IE 10+ */
+ -ms-overflow-style: none; /* IE 10+ */
* {
scrollbar-width: none; /* Firefox */
- -ms-overflow-style: none; /* IE 10+ */
+ -ms-overflow-style: none; /* IE 10+ */
}
&::-webkit-scrollbar,
@@ -1893,8 +1847,47 @@ a.account__display-name {
box-shadow: 2px 4px 15px rgba($base-shadow-color, 0.4);
z-index: 9999;
- ul {
- list-style: none;
+ &__text-button {
+ display: inline;
+ color: inherit;
+ background: transparent;
+ border: 0;
+ margin: 0;
+ padding: 0;
+ font-family: inherit;
+ font-size: inherit;
+ line-height: inherit;
+
+ &:focus {
+ outline: 1px dotted;
+ }
+ }
+
+ &__container {
+ &__header {
+ border-bottom: 1px solid darken($ui-secondary-color, 8%);
+ padding: 4px 14px;
+ padding-bottom: 8px;
+ font-size: 13px;
+ line-height: 18px;
+ color: $inverted-text-color;
+ }
+
+ &__list {
+ list-style: none;
+
+ &--scrollable {
+ max-height: 300px;
+ overflow-y: scroll;
+ }
+ }
+
+ &--loading {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ padding: 30px 45px;
+ }
}
&.left {
@@ -1950,18 +1943,29 @@ a.account__display-name {
}
.dropdown-menu__item {
- a {
- font-size: 13px;
- line-height: 18px;
+ font-size: 13px;
+ line-height: 18px;
+ display: block;
+ color: $inverted-text-color;
+
+ a,
+ button {
+ font-family: inherit;
+ font-size: inherit;
+ line-height: inherit;
display: block;
+ width: 100%;
padding: 4px 14px;
+ border: 0;
+ margin: 0;
box-sizing: border-box;
text-decoration: none;
background: $ui-secondary-color;
- color: $inverted-text-color;
+ color: inherit;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
+ text-align: inherit;
&:focus,
&:hover,
@@ -1973,6 +1977,42 @@ a.account__display-name {
}
}
+.dropdown-menu__item--text {
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ padding: 4px 14px;
+}
+
+.dropdown-menu__item.edited-timestamp__history__item {
+ border-bottom: 1px solid darken($ui-secondary-color, 8%);
+
+ &:last-child {
+ border-bottom: 0;
+ }
+
+ &.dropdown-menu__item--text,
+ a,
+ button {
+ padding: 8px 14px;
+ }
+}
+
+.inline-account {
+ display: inline-flex;
+ align-items: center;
+ vertical-align: top;
+
+ .account__avatar {
+ margin-right: 5px;
+ border-radius: 50%;
+ }
+
+ strong {
+ font-weight: 600;
+ }
+}
+
.dropdown--active .dropdown__content {
display: block;
line-height: 18px;
@@ -2262,17 +2302,7 @@ a.account__display-name {
padding: 0;
}
- .directory__list {
- display: grid;
- grid-gap: 10px;
- grid-template-columns: minmax(0, 50%) minmax(0, 50%);
-
- @media screen and (max-width: $no-gap-breakpoint) {
- display: block;
- }
- }
-
- .directory__card {
+ .account-card {
margin-bottom: 0;
}
@@ -2298,7 +2328,7 @@ a.account__display-name {
.scrollable {
overflow: visible;
- @supports (display: grid) {
+ @supports(display: grid) {
contain: content;
}
}
@@ -2717,7 +2747,7 @@ a.account__display-name {
overflow-y: auto;
}
- @supports (display: grid) { // hack to fix Chrome <57
+ @supports(display: grid) { // hack to fix Chrome <57
contain: strict;
}
@@ -2731,10 +2761,14 @@ a.account__display-name {
position: relative;
min-height: 120px;
}
+
+ .scrollable {
+ flex: 1 1 auto;
+ }
}
.scrollable.fullscreen {
- @supports (display: grid) { // hack to fix Chrome <57
+ @supports(display: grid) { // hack to fix Chrome <57
contain: none;
}
}
@@ -3635,36 +3669,48 @@ a.status-card.compact:hover {
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
+ display: flex;
+ align-items: center;
+ justify-content: center;
+}
- span {
- display: block;
- float: left;
- transform: translateX(-50%);
- margin: 82px 0 0 50%;
- white-space: nowrap;
+.circular-progress {
+ color: lighten($ui-base-color, 26%);
+ animation: 1.4s linear 0s infinite normal none running simple-rotate;
+
+ circle {
+ stroke: currentColor;
+ stroke-dasharray: 80px, 200px;
+ stroke-dashoffset: 0;
+ animation: circular-progress 1.4s ease-in-out infinite;
}
}
-.loading-indicator__figure {
- position: absolute;
- top: 50%;
- left: 50%;
- transform: translate(-50%, -50%);
- width: 42px;
- height: 42px;
- box-sizing: border-box;
- background-color: transparent;
- border: 0 solid lighten($ui-base-color, 26%);
- border-width: 6px;
- border-radius: 50%;
+@keyframes circular-progress {
+ 0% {
+ stroke-dasharray: 1px, 200px;
+ stroke-dashoffset: 0;
+ }
+
+ 50% {
+ stroke-dasharray: 100px, 200px;
+ stroke-dashoffset: -15px;
+ }
+
+ 100% {
+ stroke-dasharray: 100px, 200px;
+ stroke-dashoffset: -125px;
+ }
}
-.no-reduce-motion .loading-indicator span {
- animation: loader-label 1.15s infinite cubic-bezier(0.215, 0.61, 0.355, 1);
-}
+@keyframes simple-rotate {
+ 0% {
+ transform: rotate(0deg);
+ }
-.no-reduce-motion .loading-indicator__figure {
- animation: loader-figure 1.15s infinite cubic-bezier(0.215, 0.61, 0.355, 1);
+ 100% {
+ transform: rotate(360deg);
+ }
}
@keyframes spring-rotate-in {
@@ -3711,46 +3757,6 @@ a.status-card.compact:hover {
}
}
-@keyframes loader-figure {
- 0% {
- width: 0;
- height: 0;
- background-color: lighten($ui-base-color, 26%);
- }
-
- 29% {
- background-color: lighten($ui-base-color, 26%);
- }
-
- 30% {
- width: 42px;
- height: 42px;
- background-color: transparent;
- border-width: 21px;
- opacity: 1;
- }
-
- 100% {
- width: 42px;
- height: 42px;
- border-width: 0;
- opacity: 0;
- background-color: transparent;
- }
-}
-
-@keyframes loader-label {
- 0% {
- opacity: 0.25;
- }
- 30% {
- opacity: 1;
- }
- 100% {
- opacity: 0.25;
- }
-}
-
.video-error-cover {
align-items: center;
background: $base-overlay-background;
@@ -4042,7 +4048,7 @@ a.status-card.compact:hover {
align-items: center;
justify-content: center;
- @supports (display: grid) { // hack to fix Chrome <57
+ @supports(display: grid) { // hack to fix Chrome <57
contain: strict;
}
@@ -4268,7 +4274,7 @@ a.status-card.compact:hover {
}
}
-.upload-progess__message {
+.upload-progress__message {
flex: 1 1 auto;
}
@@ -4950,7 +4956,8 @@ a.status-card.compact:hover {
.report-modal,
.actions-modal,
.mute-modal,
-.block-modal {
+.block-modal,
+.compare-history-modal {
background: lighten($ui-secondary-color, 8%);
color: $inverted-text-color;
border-radius: 8px;
@@ -5048,6 +5055,201 @@ a.status-card.compact:hover {
max-width: 700px;
}
+.report-dialog-modal {
+ max-width: 90vw;
+ width: 480px;
+ height: 80vh;
+ background: lighten($ui-secondary-color, 8%);
+ color: $inverted-text-color;
+ border-radius: 8px;
+ overflow: hidden;
+ position: relative;
+ flex-direction: column;
+ display: flex;
+
+ &__container {
+ box-sizing: border-box;
+ border-top: 1px solid $ui-secondary-color;
+ padding: 20px;
+ flex-grow: 1;
+ display: flex;
+ flex-direction: column;
+ min-height: 0;
+ overflow: auto;
+ }
+
+ &__title {
+ font-size: 28px;
+ line-height: 33px;
+ font-weight: 700;
+ margin-bottom: 15px;
+
+ @media screen and (max-height: 800px) {
+ font-size: 22px;
+ }
+ }
+
+ &__subtitle {
+ font-size: 17px;
+ font-weight: 600;
+ line-height: 22px;
+ margin-bottom: 4px;
+ }
+
+ &__lead {
+ font-size: 17px;
+ line-height: 22px;
+ color: lighten($inverted-text-color, 16%);
+ margin-bottom: 30px;
+ }
+
+ &__actions {
+ margin-top: 30px;
+ display: flex;
+
+ .button {
+ flex: 1 1 auto;
+ }
+ }
+
+ &__statuses {
+ flex-grow: 1;
+ min-height: 0;
+ overflow: auto;
+ }
+
+ .status__content a {
+ color: $highlight-text-color;
+ }
+
+ .status__content,
+ .status__content p {
+ color: $inverted-text-color;
+ }
+
+ .status__content__spoiler-link {
+ color: $primary-text-color;
+ background: $ui-primary-color;
+
+ &:hover {
+ background: lighten($ui-primary-color, 8%);
+ }
+ }
+
+ .dialog-option .poll__input {
+ border-color: $inverted-text-color;
+ color: $ui-secondary-color;
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+
+ svg {
+ width: 8px;
+ height: auto;
+ }
+
+ &:active,
+ &:focus,
+ &:hover {
+ border-color: lighten($inverted-text-color, 15%);
+ border-width: 4px;
+ }
+
+ &.active {
+ border-color: $inverted-text-color;
+ background: $inverted-text-color;
+ }
+ }
+
+ .poll__option.dialog-option {
+ padding: 15px 0;
+ flex: 0 0 auto;
+ border-bottom: 1px solid $ui-secondary-color;
+
+ &:last-child {
+ border-bottom: 0;
+ }
+
+ & > .poll__option__text {
+ font-size: 13px;
+ color: lighten($inverted-text-color, 16%);
+
+ strong {
+ font-size: 17px;
+ font-weight: 500;
+ line-height: 22px;
+ color: $inverted-text-color;
+ display: block;
+ margin-bottom: 4px;
+
+ &:last-child {
+ margin-bottom: 0;
+ }
+ }
+ }
+ }
+
+ .flex-spacer {
+ background: transparent;
+ }
+
+ &__textarea {
+ display: block;
+ box-sizing: border-box;
+ width: 100%;
+ margin: 0;
+ color: $inverted-text-color;
+ background: $simple-background-color;
+ padding: 10px;
+ font-family: inherit;
+ font-size: 17px;
+ line-height: 22px;
+ resize: vertical;
+ border: 0;
+ outline: 0;
+ border-radius: 4px;
+ margin: 20px 0;
+
+ &::placeholder {
+ color: $dark-text-color;
+ }
+
+ &:focus {
+ outline: 0;
+ }
+ }
+
+ &__toggle {
+ display: flex;
+ align-items: center;
+
+ & > span {
+ font-size: 17px;
+ font-weight: 500;
+ margin-left: 10px;
+ }
+ }
+
+ .button.button-secondary {
+ border-color: $inverted-text-color;
+ color: $inverted-text-color;
+ flex: 0 0 auto;
+
+ &:hover,
+ &:focus,
+ &:active {
+ border-color: lighten($inverted-text-color, 15%);
+ color: lighten($inverted-text-color, 15%);
+ }
+ }
+
+ hr {
+ border: 0;
+ background: transparent;
+ margin: 15px 0;
+ }
+}
+
.report-modal__container {
display: flex;
border-top: 1px solid $ui-secondary-color;
@@ -5352,6 +5554,47 @@ a.status-card.compact:hover {
}
}
+.compare-history-modal {
+ .report-modal__target {
+ border-bottom: 1px solid $ui-secondary-color;
+ }
+
+ &__container {
+ padding: 30px;
+ pointer-events: all;
+ }
+
+ .status__content {
+ color: $inverted-text-color;
+ font-size: 19px;
+ line-height: 24px;
+
+ .emojione {
+ width: 24px;
+ height: 24px;
+ margin: -1px 0 0;
+ }
+
+ a {
+ color: $highlight-text-color;
+ }
+
+ hr {
+ height: 0.25rem;
+ padding: 0;
+ background-color: $ui-secondary-color;
+ border: 0;
+ margin: 20px 0;
+ }
+ }
+
+ .media-gallery,
+ .audio-player,
+ .video-player {
+ margin-top: 15px;
+ }
+}
+
.loading-bar {
background-color: $highlight-text-color;
height: 3px;
@@ -5537,7 +5780,6 @@ a.status-card.compact:hover {
overflow: hidden;
position: absolute;
}
-
/* End Media Gallery */
.detailed,
@@ -5951,136 +6193,20 @@ a.status-card.compact:hover {
}
}
-.directory {
- &__list {
- width: 100%;
- margin: 10px 0;
- transition: opacity 100ms ease-in;
+.scrollable .account-card {
+ margin: 10px;
+ background: lighten($ui-base-color, 8%);
+}
- &.loading {
- opacity: 0.7;
- }
-
- @media screen and (max-width: $no-gap-breakpoint) {
- margin: 0;
- }
+.scrollable .account-card__title__avatar {
+ img,
+ .account__avatar {
+ border-color: lighten($ui-base-color, 8%);
}
+}
- &__card {
- box-sizing: border-box;
- margin-bottom: 10px;
-
- &__img {
- height: 125px;
- position: relative;
- background: darken($ui-base-color, 12%);
- overflow: hidden;
-
- img {
- display: block;
- width: 100%;
- height: 100%;
- margin: 0;
- object-fit: cover;
- }
- }
-
- &__bar {
- display: flex;
- align-items: center;
- background: lighten($ui-base-color, 4%);
- padding: 10px;
-
- &__name {
- flex: 1 1 auto;
- display: flex;
- align-items: center;
- text-decoration: none;
- overflow: hidden;
- }
-
- &__relationship {
- width: 23px;
- min-height: 1px;
- flex: 0 0 auto;
- }
-
- .avatar {
- flex: 0 0 auto;
- width: 48px;
- height: 48px;
- padding-top: 2px;
-
- img {
- width: 100%;
- height: 100%;
- display: block;
- margin: 0;
- border-radius: 4px;
- background: darken($ui-base-color, 8%);
- object-fit: cover;
- }
- }
-
- .display-name {
- margin-left: 15px;
- text-align: left;
-
- strong {
- font-size: 15px;
- color: $primary-text-color;
- font-weight: 500;
- overflow: hidden;
- text-overflow: ellipsis;
- }
-
- span {
- display: block;
- font-size: 14px;
- color: $darker-text-color;
- font-weight: 400;
- overflow: hidden;
- text-overflow: ellipsis;
- }
- }
- }
-
- &__extra {
- background: $ui-base-color;
- display: flex;
- align-items: center;
- justify-content: center;
-
- .accounts-table__count {
- width: 33.33%;
- flex: 0 0 auto;
- padding: 15px 0;
- }
-
- .account__header__content {
- box-sizing: border-box;
- padding: 15px 10px;
- border-bottom: 1px solid lighten($ui-base-color, 8%);
- width: 100%;
- min-height: 18px + 30px;
- white-space: nowrap;
- overflow: hidden;
- text-overflow: ellipsis;
-
- p {
- display: none;
-
- &:first-child {
- display: inline;
- }
- }
-
- br {
- display: none;
- }
- }
- }
- }
+.scrollable .account-card__bio::after {
+ background: linear-gradient(to left, lighten($ui-base-color, 8%), transparent);
}
.account-gallery__container {
@@ -6184,6 +6310,7 @@ a.status-card.compact:hover {
&__column {
padding: 10px 15px;
+ padding-bottom: 0;
}
.radio-button {
@@ -6267,15 +6394,9 @@ noscript {
}
@keyframes flicker {
- 0% {
- opacity: 1;
- }
- 30% {
- opacity: 0.75;
- }
- 100% {
- opacity: 1;
- }
+ 0% { opacity: 1; }
+ 30% { opacity: 0.75; }
+ 100% { opacity: 1; }
}
@media screen and (max-width: 630px) and (max-height: 400px) {
@@ -6308,13 +6429,13 @@ noscript {
& > .icon-button.close {
will-change: opacity transform;
transition: opacity $duration * 0.5 $delay,
- transform $duration $delay;
+ transform $duration $delay;
}
& > .compose__action-bar .icon-button {
will-change: opacity transform;
transition: opacity $duration * 0.5 $delay + $duration * 0.5,
- transform $duration $delay;
+ transform $duration $delay;
}
}
}
@@ -7471,3 +7592,122 @@ noscript {
text-align: center;
}
}
+
+.explore__search-header {
+ background: $ui-base-color;
+ display: flex;
+ align-items: flex-start;
+ justify-content: center;
+ padding: 15px;
+
+ .search {
+ width: 100%;
+ margin-bottom: 0;
+ }
+
+ .search__input {
+ border-radius: 4px;
+ color: $inverted-text-color;
+ background: $simple-background-color;
+ padding: 10px;
+
+ &::placeholder {
+ color: $dark-text-color;
+ }
+ }
+
+ .search .fa {
+ top: 10px;
+ right: 10px;
+ color: $dark-text-color;
+ }
+
+ .search .fa-times-circle {
+ top: 12px;
+ }
+}
+
+.explore__search-results {
+ flex: 1 1 auto;
+ display: flex;
+ flex-direction: column;
+}
+
+.story {
+ display: flex;
+ align-items: center;
+ color: $primary-text-color;
+ text-decoration: none;
+ padding: 15px 0;
+ border-bottom: 1px solid lighten($ui-base-color, 8%);
+
+ &:last-child {
+ border-bottom: 0;
+ }
+
+ &:hover,
+ &:active,
+ &:focus {
+ background-color: lighten($ui-base-color, 4%);
+ }
+
+ &__details {
+ padding: 0 15px;
+ flex: 1 1 auto;
+
+ &__publisher {
+ color: $darker-text-color;
+ margin-bottom: 4px;
+ }
+
+ &__title {
+ font-size: 19px;
+ line-height: 24px;
+ font-weight: 500;
+ margin-bottom: 4px;
+ }
+
+ &__shared {
+ color: $darker-text-color;
+ }
+ }
+
+ &__thumbnail {
+ flex: 0 0 auto;
+ margin: 0 15px;
+ position: relative;
+ width: 120px;
+ height: 120px;
+
+ .skeleton {
+ width: 100%;
+ height: 100%;
+ }
+
+ img {
+ border-radius: 4px;
+ display: block;
+ margin: 0;
+ width: 100%;
+ height: 100%;
+ object-fit: cover;
+ }
+
+ &__preview {
+ border-radius: 4px;
+ display: block;
+ margin: 0;
+ width: 100%;
+ height: 100%;
+ object-fit: fill;
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: 0;
+
+ &--hidden {
+ display: none;
+ }
+ }
+ }
+}
diff --git a/app/javascript/styles/mastodon/containers.scss b/app/javascript/styles/mastodon/containers.scss
index 665965aad..49d7b2668 100644
--- a/app/javascript/styles/mastodon/containers.scss
+++ b/app/javascript/styles/mastodon/containers.scss
@@ -1,7 +1,6 @@
.container-alt {
width: 700px;
margin: 0 auto;
- margin-top: 40px;
@media screen and (max-width: 740px) {
width: 100%;
@@ -67,22 +66,20 @@
line-height: 18px;
box-sizing: border-box;
padding: 20px 0;
- padding-bottom: 0;
- margin-bottom: -30px;
margin-top: 40px;
+ margin-bottom: 10px;
+ border-bottom: 1px solid $ui-base-color;
@media screen and (max-width: 440px) {
width: 100%;
margin: 0;
- margin-bottom: 10px;
padding: 20px;
- padding-bottom: 0;
}
.avatar {
width: 40px;
height: 40px;
- margin-right: 8px;
+ margin-right: 10px;
img {
width: 100%;
@@ -96,7 +93,7 @@
.name {
flex: 1 1 auto;
color: $secondary-text-color;
- width: calc(100% - 88px);
+ width: calc(100% - 90px);
.username {
display: block;
@@ -110,7 +107,7 @@
display: block;
font-size: 32px;
line-height: 40px;
- margin-left: 8px;
+ margin-left: 10px;
}
}
@@ -412,14 +409,6 @@
}
}
- .directory__card {
- border-radius: 4px;
-
- @media screen and (max-width: $no-gap-breakpoint) {
- border-radius: 0;
- }
- }
-
.page-header {
@media screen and (max-width: $no-gap-breakpoint) {
border-bottom: 0;
@@ -838,19 +827,21 @@
grid-gap: 10px;
grid-template-columns: minmax(0, 50%) minmax(0, 50%);
+ .account-card {
+ display: flex;
+ flex-direction: column;
+ }
+
@media screen and (max-width: $no-gap-breakpoint) {
display: block;
- }
- .icon-button {
- font-size: 18px;
+ .account-card {
+ margin-bottom: 10px;
+ display: block;
+ }
}
}
- .directory__card {
- margin-bottom: 0;
- }
-
.card-grid {
display: flex;
flex-wrap: wrap;
diff --git a/app/javascript/styles/mastodon/footer.scss b/app/javascript/styles/mastodon/footer.scss
index 00d290883..073ebda7e 100644
--- a/app/javascript/styles/mastodon/footer.scss
+++ b/app/javascript/styles/mastodon/footer.scss
@@ -90,6 +90,20 @@
.column-4 {
display: none;
}
+
+ .column-2 h4 {
+ display: none;
+ }
+ }
+ }
+
+ .legal-xs {
+ display: none;
+ text-align: center;
+ padding-top: 20px;
+
+ @media screen and (max-width: $no-gap-breakpoint) {
+ display: block;
}
}
@@ -105,7 +119,8 @@
}
}
- ul a {
+ ul a,
+ .legal-xs a {
text-decoration: none;
color: lighten($ui-base-color, 34%);
diff --git a/app/javascript/styles/mastodon/forms.scss b/app/javascript/styles/mastodon/forms.scss
index b4c6f2352..612528e36 100644
--- a/app/javascript/styles/mastodon/forms.scss
+++ b/app/javascript/styles/mastodon/forms.scss
@@ -801,9 +801,41 @@ code {
}
}
}
+}
- @media screen and (max-width: 740px) and (min-width: 441px) {
- margin-top: 40px;
+.oauth-prompt {
+ h3 {
+ color: $ui-secondary-color;
+ font-size: 17px;
+ line-height: 22px;
+ font-weight: 500;
+ margin-bottom: 30px;
+ }
+
+ p {
+ font-size: 14px;
+ line-height: 18px;
+ margin-bottom: 30px;
+ }
+
+ .permissions-list {
+ border: 1px solid $ui-base-color;
+ border-radius: 4px;
+ background: darken($ui-base-color, 4%);
+ margin-bottom: 30px;
+ }
+
+ .actions {
+ margin: 0 -10px;
+ display: flex;
+
+ form {
+ box-sizing: border-box;
+ padding: 0 10px;
+ flex: 1 1 auto;
+ min-height: 1px;
+ width: 50%;
+ }
}
}
@@ -1006,3 +1038,39 @@ code {
display: none;
}
}
+
+.permissions-list {
+ &__item {
+ padding: 15px;
+ color: $ui-secondary-color;
+ border-bottom: 1px solid lighten($ui-base-color, 4%);
+ display: flex;
+ align-items: center;
+
+ &__text {
+ flex: 1 1 auto;
+
+ &__title {
+ font-weight: 500;
+ }
+
+ &__type {
+ color: $darker-text-color;
+ }
+ }
+
+ &__icon {
+ flex: 0 0 auto;
+ font-size: 18px;
+ width: 30px;
+ color: $valid-value-color;
+ display: flex;
+ align-items: center;
+ }
+
+ &:last-child {
+ border-bottom: 0;
+ padding-bottom: 0;
+ }
+ }
+}
diff --git a/app/javascript/styles/mastodon/polls.scss b/app/javascript/styles/mastodon/polls.scss
index e33fc7983..a719044ea 100644
--- a/app/javascript/styles/mastodon/polls.scss
+++ b/app/javascript/styles/mastodon/polls.scss
@@ -69,7 +69,7 @@
display: none;
}
- .autossugest-input {
+ .autosuggest-input {
flex: 1 1 auto;
}
diff --git a/app/javascript/styles/mastodon/rtl.scss b/app/javascript/styles/mastodon/rtl.scss
index ea7bb5113..98eb1511c 100644
--- a/app/javascript/styles/mastodon/rtl.scss
+++ b/app/javascript/styles/mastodon/rtl.scss
@@ -12,11 +12,6 @@ body.rtl {
margin-left: 10px;
}
- .directory__card__bar .display-name {
- margin-left: 0;
- margin-right: 15px;
- }
-
.display-name,
.announcements__item {
text-align: right;
diff --git a/app/javascript/styles/mastodon/tables.scss b/app/javascript/styles/mastodon/tables.scss
index 36bc07a72..431b8a73a 100644
--- a/app/javascript/styles/mastodon/tables.scss
+++ b/app/javascript/styles/mastodon/tables.scss
@@ -65,6 +65,24 @@
}
}
+ &.horizontal-table {
+ border-collapse: collapse;
+ border-style: hidden;
+
+ & > tbody > tr > th,
+ & > tbody > tr > td {
+ padding: 11px 10px;
+ background: transparent;
+ border: 1px solid lighten($ui-base-color, 8%);
+ color: $secondary-text-color;
+ }
+
+ & > tbody > tr > th {
+ color: $darker-text-color;
+ font-weight: 600;
+ }
+ }
+
&.batch-table {
& > thead > tr > th {
background: $ui-base-color;
@@ -210,6 +228,7 @@ a.table-action-link {
&__content {
padding-top: 12px;
padding-bottom: 16px;
+ overflow: hidden;
&--unpadded {
padding: 0;
@@ -296,3 +315,9 @@ a.table-action-link {
}
}
}
+
+.one-liner {
+ white-space: nowrap;
+ overflow: hidden;
+ text-overflow: ellipsis;
+}
diff --git a/app/lib/access_token_extension.rb b/app/lib/access_token_extension.rb
index 3e184e775..2cafaaa20 100644
--- a/app/lib/access_token_extension.rb
+++ b/app/lib/access_token_extension.rb
@@ -11,6 +11,10 @@ module AccessTokenExtension
update(revoked_at: clock.now.utc)
end
+ def update_last_used(request, clock = Time)
+ update(last_used_at: clock.now.utc, last_used_ip: request.remote_ip)
+ end
+
def push_to_streaming_api
Redis.current.publish("timeline:access_token:#{id}", Oj.dump(event: :kill)) if revoked? || destroyed?
end
diff --git a/app/lib/activitypub/activity.rb b/app/lib/activitypub/activity.rb
index 706960f92..f599e1b58 100644
--- a/app/lib/activitypub/activity.rb
+++ b/app/lib/activitypub/activity.rb
@@ -71,15 +71,7 @@ class ActivityPub::Activity
end
def object_uri
- @object_uri ||= begin
- str = value_or_id(@object)
-
- if str&.start_with?('bear:')
- Addressable::URI.parse(str).query_values['u']
- else
- str
- end
- end
+ @object_uri ||= uri_from_bearcap(value_or_id(@object))
end
def unsupported_object_type?
diff --git a/app/lib/activitypub/activity/announce.rb b/app/lib/activitypub/activity/announce.rb
index 1f9319290..0674b1083 100644
--- a/app/lib/activitypub/activity/announce.rb
+++ b/app/lib/activitypub/activity/announce.rb
@@ -8,6 +8,7 @@ class ActivityPub::Activity::Announce < ActivityPub::Activity
original_status = status_from_object
return reject_payload! if original_status.nil? || !announceable?(original_status)
+ return if requested_through_relay?
@status = Status.find_by(account: @account, reblog: original_status)
@@ -22,8 +23,7 @@ class ActivityPub::Activity::Announce < ActivityPub::Activity
visibility: visibility_from_audience
)
- Trends.tags.register(@status)
- Trends.links.register(@status)
+ Trends.register!(@status)
distribute
end
@@ -35,7 +35,7 @@ class ActivityPub::Activity::Announce < ActivityPub::Activity
def distribute
# Notify the author of the original status if that status is local
- NotifyService.new.call(@status.reblog.account, :reblog, @status) if reblog_of_local_account?(@status) && !reblog_by_following_group_account?(@status)
+ LocalNotificationWorker.perform_async(@status.reblog.account_id, @status.id, 'Status', 'reblog') if reblog_of_local_account?(@status) && !reblog_by_following_group_account?(@status)
# Distribute into home and list feeds
::DistributionWorker.perform_async(@status.id) if @options[:override_timestamps] || @status.within_realtime_window?
diff --git a/app/lib/activitypub/activity/create.rb b/app/lib/activitypub/activity/create.rb
index ad273c20b..cf31b6ff6 100644
--- a/app/lib/activitypub/activity/create.rb
+++ b/app/lib/activitypub/activity/create.rb
@@ -112,7 +112,7 @@ class ActivityPub::Activity::Create < ActivityPub::Activity
url: @status_parser.url || @status_parser.uri,
account: @account,
text: converted_object_type? ? converted_text : (@status_parser.text || ''),
- language: @status_parser.language || detected_language,
+ language: @status_parser.language,
spoiler_text: converted_object_type? ? '' : (@status_parser.spoiler_text || ''),
created_at: @status_parser.created_at,
edited_at: @status_parser.edited_at,
@@ -370,10 +370,6 @@ class ActivityPub::Activity::Create < ActivityPub::Activity
Formatter.instance.linkify([@status_parser.title.presence, @status_parser.spoiler_text.presence, @status_parser.url || @status_parser.uri].compact.join("\n\n"))
end
- def detected_language
- LanguageDetector.instance.detect(@status_parser.text, @account) if supported_object_type?
- end
-
def unsupported_media_type?(mime_type)
mime_type.present? && !MediaAttachment.supported_mime_types.include?(mime_type)
end
diff --git a/app/lib/activitypub/activity/delete.rb b/app/lib/activitypub/activity/delete.rb
index 801647cf7..f5ef863f3 100644
--- a/app/lib/activitypub/activity/delete.rb
+++ b/app/lib/activitypub/activity/delete.rb
@@ -37,50 +37,16 @@ class ActivityPub::Activity::Delete < ActivityPub::Activity
return if @status.nil?
- forward! if @json['signature'].present? && @status.distributable?
+ forwarder.forward! if forwarder.forwardable?
delete_now!
end
end
- def rebloggers_ids
- return @rebloggers_ids if defined?(@rebloggers_ids)
- @rebloggers_ids = @status.reblogs.includes(:account).references(:account).merge(Account.local).pluck(:account_id)
- end
-
- def inboxes_for_reblogs
- Account.where(id: ::Follow.where(target_account_id: rebloggers_ids).select(:account_id)).inboxes
- end
-
- def replied_to_status
- return @replied_to_status if defined?(@replied_to_status)
- @replied_to_status = @status.thread
- end
-
- def reply_to_local?
- !replied_to_status.nil? && replied_to_status.account.local?
- end
-
- def inboxes_for_reply
- replied_to_status.account.followers.inboxes
- end
-
- def forward!
- inboxes = inboxes_for_reblogs
- inboxes += inboxes_for_reply if reply_to_local?
- inboxes -= [@account.preferred_inbox_url]
-
- sender_id = reply_to_local? ? replied_to_status.account_id : rebloggers_ids.first
-
- ActivityPub::LowPriorityDeliveryWorker.push_bulk(inboxes.uniq) do |inbox_url|
- [payload, sender_id, inbox_url]
- end
+ def forwarder
+ @forwarder ||= ActivityPub::Forwarder.new(@account, @json, @status)
end
def delete_now!
RemoveStatusService.new.call(@status, redraft: false)
end
-
- def payload
- @payload ||= Oj.dump(@json)
- end
end
diff --git a/app/lib/activitypub/activity/follow.rb b/app/lib/activitypub/activity/follow.rb
index 4efb84b8c..97e41ab78 100644
--- a/app/lib/activitypub/activity/follow.rb
+++ b/app/lib/activitypub/activity/follow.rb
@@ -31,10 +31,10 @@ class ActivityPub::Activity::Follow < ActivityPub::Activity
follow_request = FollowRequest.create!(account: @account, target_account: target_account, uri: @json['id'])
if target_account.locked? || @account.silenced?
- NotifyService.new.call(target_account, :follow_request, follow_request)
+ LocalNotificationWorker.perform_async(target_account.id, follow_request.id, 'FollowRequest', 'follow_request')
else
AuthorizeFollowService.new.call(@account, target_account)
- NotifyService.new.call(target_account, :follow, ::Follow.find_by(account: @account, target_account: target_account))
+ LocalNotificationWorker.perform_async(target_account.id, ::Follow.find_by(account: @account, target_account: target_account).id, 'Follow', 'follow')
end
end
diff --git a/app/lib/activitypub/activity/like.rb b/app/lib/activitypub/activity/like.rb
index c065f01f8..aa1dc3040 100644
--- a/app/lib/activitypub/activity/like.rb
+++ b/app/lib/activitypub/activity/like.rb
@@ -7,6 +7,8 @@ class ActivityPub::Activity::Like < ActivityPub::Activity
return if original_status.nil? || !original_status.account.local? || delete_arrived_first?(@json['id']) || @account.favourited?(original_status)
favourite = original_status.favourites.create!(account: @account)
- NotifyService.new.call(original_status.account, :favourite, favourite)
+
+ LocalNotificationWorker.perform_async(original_status.account_id, favourite.id, 'Favourite', 'favourite')
+ Trends.statuses.register(original_status)
end
end
diff --git a/app/lib/activitypub/activity/update.rb b/app/lib/activitypub/activity/update.rb
index f04ad321b..5b3238ece 100644
--- a/app/lib/activitypub/activity/update.rb
+++ b/app/lib/activitypub/activity/update.rb
@@ -8,6 +8,8 @@ class ActivityPub::Activity::Update < ActivityPub::Activity
update_account
elsif equals_or_includes_any?(@object['type'], %w(Note Question))
update_status
+ elsif converted_object_type?
+ Status.find_by(uri: object_uri, account_id: @account.id)
end
end
@@ -20,12 +22,12 @@ class ActivityPub::Activity::Update < ActivityPub::Activity
end
def update_status
- return reject_payload! if invalid_origin?(@object['id'])
+ return reject_payload! if invalid_origin?(object_uri)
- status = Status.find_by(uri: object_uri, account_id: @account.id)
+ @status = Status.find_by(uri: object_uri, account_id: @account.id)
- return if status.nil?
+ return if @status.nil?
- ActivityPub::ProcessStatusUpdateService.new.call(status, @object)
+ ActivityPub::ProcessStatusUpdateService.new.call(@status, @object)
end
end
diff --git a/app/lib/activitypub/forwarder.rb b/app/lib/activitypub/forwarder.rb
new file mode 100644
index 000000000..4206b9d82
--- /dev/null
+++ b/app/lib/activitypub/forwarder.rb
@@ -0,0 +1,65 @@
+# frozen_string_literal: true
+
+class ActivityPub::Forwarder
+ def initialize(account, original_json, status)
+ @json = original_json
+ @account = account
+ @status = status
+ end
+
+ def forwardable?
+ @json['signature'].present? && @status.distributable?
+ end
+
+ def forward!
+ ActivityPub::LowPriorityDeliveryWorker.push_bulk(inboxes) do |inbox_url|
+ [payload, signature_account_id, inbox_url]
+ end
+ end
+
+ private
+
+ def payload
+ @payload ||= Oj.dump(@json)
+ end
+
+ def reblogged_by_account_ids
+ @reblogged_by_account_ids ||= @status.reblogs.includes(:account).references(:account).merge(Account.local).pluck(:account_id)
+ end
+
+ def signature_account_id
+ @signature_account_id ||= begin
+ if in_reply_to_local?
+ in_reply_to.account_id
+ else
+ reblogged_by_account_ids.first
+ end
+ end
+ end
+
+ def inboxes
+ @inboxes ||= begin
+ arr = inboxes_for_followers_of_reblogged_by_accounts
+ arr += inboxes_for_followers_of_replied_to_account if in_reply_to_local?
+ arr -= [@account.preferred_inbox_url]
+ arr.uniq!
+ arr
+ end
+ end
+
+ def inboxes_for_followers_of_reblogged_by_accounts
+ Account.where(id: ::Follow.where(target_account_id: reblogged_by_account_ids).select(:account_id)).inboxes
+ end
+
+ def inboxes_for_followers_of_replied_to_account
+ in_reply_to.account.followers.inboxes
+ end
+
+ def in_reply_to
+ @status.thread
+ end
+
+ def in_reply_to_local?
+ @status.thread&.account&.local?
+ end
+end
diff --git a/app/lib/admin/metrics/dimension.rb b/app/lib/admin/metrics/dimension.rb
index d8392ddfc..81b89d9b3 100644
--- a/app/lib/admin/metrics/dimension.rb
+++ b/app/lib/admin/metrics/dimension.rb
@@ -9,6 +9,8 @@ class Admin::Metrics::Dimension
software_versions: Admin::Metrics::Dimension::SoftwareVersionsDimension,
tag_servers: Admin::Metrics::Dimension::TagServersDimension,
tag_languages: Admin::Metrics::Dimension::TagLanguagesDimension,
+ instance_accounts: Admin::Metrics::Dimension::InstanceAccountsDimension,
+ instance_languages: Admin::Metrics::Dimension::InstanceLanguagesDimension,
}.freeze
def self.retrieve(dimension_keys, start_at, end_at, limit, params)
diff --git a/app/lib/admin/metrics/dimension/base_dimension.rb b/app/lib/admin/metrics/dimension/base_dimension.rb
index 5872c22cb..bd2e4ecec 100644
--- a/app/lib/admin/metrics/dimension/base_dimension.rb
+++ b/app/lib/admin/metrics/dimension/base_dimension.rb
@@ -1,23 +1,34 @@
# frozen_string_literal: true
class Admin::Metrics::Dimension::BaseDimension
+ CACHE_TTL = 5.minutes.freeze
+
def self.with_params?
false
end
+ attr_reader :loaded
+
+ alias loaded? loaded
+
def initialize(start_at, end_at, limit, params)
@start_at = start_at&.to_datetime
@end_at = end_at&.to_datetime
@limit = limit&.to_i
@params = params
+ @loaded = false
end
def key
raise NotImplementedError
end
+ def cache_key
+ ["metrics/dimension/#{key}", @start_at, @end_at, @limit, canonicalized_params].join(';')
+ end
+
def data
- raise NotImplementedError
+ load
end
def self.model_name
@@ -30,11 +41,28 @@ class Admin::Metrics::Dimension::BaseDimension
protected
+ def load
+ unless loaded?
+ @values = Rails.cache.fetch(cache_key, expires_in: CACHE_TTL) { perform_query }
+ @loaded = true
+ end
+
+ @values
+ end
+
+ def perform_query
+ raise NotImplementedError
+ end
+
def time_period
(@start_at..@end_at)
end
def params
- raise NotImplementedError
+ {}
+ end
+
+ def canonicalized_params
+ params.to_h.to_a.sort_by { |k, _v| k.to_s }.map { |k, v| "#{k}=#{v}" }.join(';')
end
end
diff --git a/app/lib/admin/metrics/dimension/instance_accounts_dimension.rb b/app/lib/admin/metrics/dimension/instance_accounts_dimension.rb
new file mode 100644
index 000000000..4eac8e611
--- /dev/null
+++ b/app/lib/admin/metrics/dimension/instance_accounts_dimension.rb
@@ -0,0 +1,35 @@
+# frozen_string_literal: true
+
+class Admin::Metrics::Dimension::InstanceAccountsDimension < Admin::Metrics::Dimension::BaseDimension
+ include LanguagesHelper
+
+ def self.with_params?
+ true
+ end
+
+ def key
+ 'instance_accounts'
+ end
+
+ protected
+
+ def perform_query
+ sql = <<-SQL.squish
+ SELECT accounts.username, count(follows.*) AS value
+ FROM accounts
+ LEFT JOIN follows ON follows.target_account_id = accounts.id
+ WHERE accounts.domain = $1
+ GROUP BY accounts.id, follows.target_account_id
+ ORDER BY value DESC
+ LIMIT $2
+ SQL
+
+ rows = ActiveRecord::Base.connection.select_all(sql, nil, [[nil, params[:domain]], [nil, @limit]])
+
+ rows.map { |row| { key: row['username'], human_key: row['username'], value: row['value'].to_s } }
+ end
+
+ def params
+ @params.permit(:domain)
+ end
+end
diff --git a/app/lib/admin/metrics/dimension/instance_languages_dimension.rb b/app/lib/admin/metrics/dimension/instance_languages_dimension.rb
new file mode 100644
index 000000000..1ede1a56e
--- /dev/null
+++ b/app/lib/admin/metrics/dimension/instance_languages_dimension.rb
@@ -0,0 +1,37 @@
+# frozen_string_literal: true
+
+class Admin::Metrics::Dimension::InstanceLanguagesDimension < Admin::Metrics::Dimension::BaseDimension
+ include LanguagesHelper
+
+ def self.with_params?
+ true
+ end
+
+ def key
+ 'instance_languages'
+ end
+
+ protected
+
+ def perform_query
+ sql = <<-SQL.squish
+ SELECT COALESCE(statuses.language, 'und') AS language, count(*) AS value
+ FROM statuses
+ INNER JOIN accounts ON accounts.id = statuses.account_id
+ WHERE accounts.domain = $1
+ AND statuses.id BETWEEN $2 AND $3
+ AND statuses.reblog_of_id IS NULL
+ GROUP BY COALESCE(statuses.language, 'und')
+ ORDER BY count(*) DESC
+ LIMIT $4
+ SQL
+
+ rows = ActiveRecord::Base.connection.select_all(sql, nil, [[nil, params[:domain]], [nil, Mastodon::Snowflake.id_at(@start_at, with_random: false)], [nil, Mastodon::Snowflake.id_at(@end_at, with_random: false)], [nil, @limit]])
+
+ rows.map { |row| { key: row['language'], human_key: standard_locale_name(row['language']), value: row['value'].to_s } }
+ end
+
+ def params
+ @params.permit(:domain)
+ end
+end
diff --git a/app/lib/admin/metrics/dimension/languages_dimension.rb b/app/lib/admin/metrics/dimension/languages_dimension.rb
index a6aaf5d21..f1cf82cf2 100644
--- a/app/lib/admin/metrics/dimension/languages_dimension.rb
+++ b/app/lib/admin/metrics/dimension/languages_dimension.rb
@@ -7,7 +7,9 @@ class Admin::Metrics::Dimension::LanguagesDimension < Admin::Metrics::Dimension:
'languages'
end
- def data
+ protected
+
+ def perform_query
sql = <<-SQL.squish
SELECT locale, count(*) AS value
FROM users
@@ -20,6 +22,6 @@ class Admin::Metrics::Dimension::LanguagesDimension < Admin::Metrics::Dimension:
rows = ActiveRecord::Base.connection.select_all(sql, nil, [[nil, @start_at], [nil, @end_at], [nil, @limit]])
- rows.map { |row| { key: row['locale'], human_key: human_locale(row['locale']), value: row['value'].to_s } }
+ rows.map { |row| { key: row['locale'], human_key: standard_locale_name(row['locale']), value: row['value'].to_s } }
end
end
diff --git a/app/lib/admin/metrics/dimension/servers_dimension.rb b/app/lib/admin/metrics/dimension/servers_dimension.rb
index 3e80b6625..91bcce655 100644
--- a/app/lib/admin/metrics/dimension/servers_dimension.rb
+++ b/app/lib/admin/metrics/dimension/servers_dimension.rb
@@ -5,7 +5,9 @@ class Admin::Metrics::Dimension::ServersDimension < Admin::Metrics::Dimension::B
'servers'
end
- def data
+ protected
+
+ def perform_query
sql = <<-SQL.squish
SELECT accounts.domain, count(*) AS value
FROM statuses
diff --git a/app/lib/admin/metrics/dimension/software_versions_dimension.rb b/app/lib/admin/metrics/dimension/software_versions_dimension.rb
index 34917404d..816615f99 100644
--- a/app/lib/admin/metrics/dimension/software_versions_dimension.rb
+++ b/app/lib/admin/metrics/dimension/software_versions_dimension.rb
@@ -7,12 +7,12 @@ class Admin::Metrics::Dimension::SoftwareVersionsDimension < Admin::Metrics::Dim
'software_versions'
end
- def data
+ protected
+
+ def perform_query
[mastodon_version, ruby_version, postgresql_version, redis_version]
end
- private
-
def mastodon_version
value = Mastodon::Version.to_s
diff --git a/app/lib/admin/metrics/dimension/sources_dimension.rb b/app/lib/admin/metrics/dimension/sources_dimension.rb
index a9f061809..122807cdc 100644
--- a/app/lib/admin/metrics/dimension/sources_dimension.rb
+++ b/app/lib/admin/metrics/dimension/sources_dimension.rb
@@ -5,7 +5,9 @@ class Admin::Metrics::Dimension::SourcesDimension < Admin::Metrics::Dimension::B
'sources'
end
- def data
+ protected
+
+ def perform_query
sql = <<-SQL.squish
SELECT oauth_applications.name, count(*) AS value
FROM users
diff --git a/app/lib/admin/metrics/dimension/space_usage_dimension.rb b/app/lib/admin/metrics/dimension/space_usage_dimension.rb
index aa00a2e18..5867c5bab 100644
--- a/app/lib/admin/metrics/dimension/space_usage_dimension.rb
+++ b/app/lib/admin/metrics/dimension/space_usage_dimension.rb
@@ -8,12 +8,12 @@ class Admin::Metrics::Dimension::SpaceUsageDimension < Admin::Metrics::Dimension
'space_usage'
end
- def data
+ protected
+
+ def perform_query
[postgresql_size, redis_size, media_size]
end
- private
-
def postgresql_size
value = ActiveRecord::Base.connection.execute('SELECT pg_database_size(current_database())').first['pg_database_size']
diff --git a/app/lib/admin/metrics/dimension/tag_languages_dimension.rb b/app/lib/admin/metrics/dimension/tag_languages_dimension.rb
index 1cfa07478..e1349c229 100644
--- a/app/lib/admin/metrics/dimension/tag_languages_dimension.rb
+++ b/app/lib/admin/metrics/dimension/tag_languages_dimension.rb
@@ -11,7 +11,9 @@ class Admin::Metrics::Dimension::TagLanguagesDimension < Admin::Metrics::Dimensi
'tag_languages'
end
- def data
+ protected
+
+ def perform_query
sql = <<-SQL.squish
SELECT COALESCE(statuses.language, 'und') AS language, count(*) AS value
FROM statuses
@@ -25,11 +27,9 @@ class Admin::Metrics::Dimension::TagLanguagesDimension < Admin::Metrics::Dimensi
rows = ActiveRecord::Base.connection.select_all(sql, nil, [[nil, params[:id]], [nil, Mastodon::Snowflake.id_at(@start_at, with_random: false)], [nil, Mastodon::Snowflake.id_at(@end_at, with_random: false)], [nil, @limit]])
- rows.map { |row| { key: row['language'], human_key: human_locale(row['language']), value: row['value'].to_s } }
+ rows.map { |row| { key: row['language'], human_key: standard_locale_name(row['language']), value: row['value'].to_s } }
end
- private
-
def params
@params.permit(:id)
end
diff --git a/app/lib/admin/metrics/dimension/tag_servers_dimension.rb b/app/lib/admin/metrics/dimension/tag_servers_dimension.rb
index 12c5980d7..7ddf3378c 100644
--- a/app/lib/admin/metrics/dimension/tag_servers_dimension.rb
+++ b/app/lib/admin/metrics/dimension/tag_servers_dimension.rb
@@ -9,7 +9,9 @@ class Admin::Metrics::Dimension::TagServersDimension < Admin::Metrics::Dimension
'tag_servers'
end
- def data
+ protected
+
+ def perform_query
sql = <<-SQL.squish
SELECT accounts.domain, count(*) AS value
FROM statuses
@@ -27,8 +29,6 @@ class Admin::Metrics::Dimension::TagServersDimension < Admin::Metrics::Dimension
rows.map { |row| { key: row['domain'] || Rails.configuration.x.local_domain, human_key: row['domain'] || Rails.configuration.x.local_domain, value: row['value'].to_s } }
end
- private
-
def params
@params.permit(:id)
end
diff --git a/app/lib/admin/metrics/measure.rb b/app/lib/admin/metrics/measure.rb
index a839498a1..0b510eb25 100644
--- a/app/lib/admin/metrics/measure.rb
+++ b/app/lib/admin/metrics/measure.rb
@@ -10,6 +10,12 @@ class Admin::Metrics::Measure
tag_accounts: Admin::Metrics::Measure::TagAccountsMeasure,
tag_uses: Admin::Metrics::Measure::TagUsesMeasure,
tag_servers: Admin::Metrics::Measure::TagServersMeasure,
+ instance_accounts: Admin::Metrics::Measure::InstanceAccountsMeasure,
+ instance_media_attachments: Admin::Metrics::Measure::InstanceMediaAttachmentsMeasure,
+ instance_reports: Admin::Metrics::Measure::InstanceReportsMeasure,
+ instance_statuses: Admin::Metrics::Measure::InstanceStatusesMeasure,
+ instance_follows: Admin::Metrics::Measure::InstanceFollowsMeasure,
+ instance_followers: Admin::Metrics::Measure::InstanceFollowersMeasure,
}.freeze
def self.retrieve(measure_keys, start_at, end_at, params)
diff --git a/app/lib/admin/metrics/measure/active_users_measure.rb b/app/lib/admin/metrics/measure/active_users_measure.rb
index 513189780..e6f09d4bc 100644
--- a/app/lib/admin/metrics/measure/active_users_measure.rb
+++ b/app/lib/admin/metrics/measure/active_users_measure.rb
@@ -5,20 +5,20 @@ class Admin::Metrics::Measure::ActiveUsersMeasure < Admin::Metrics::Measure::Bas
'active_users'
end
- def total
+ protected
+
+ def perform_total_query
activity_tracker.sum(time_period.first, time_period.last)
end
- def previous_total
+ def perform_previous_total_query
activity_tracker.sum(previous_time_period.first, previous_time_period.last)
end
- def data
+ def perform_data_query
activity_tracker.get(time_period.first, time_period.last).map { |date, value| { date: date.to_time(:utc).iso8601, value: value.to_s } }
end
- protected
-
def activity_tracker
@activity_tracker ||= ActivityTracker.new('activity:logins', :unique)
end
diff --git a/app/lib/admin/metrics/measure/base_measure.rb b/app/lib/admin/metrics/measure/base_measure.rb
index 0107ffd9c..e33a6c494 100644
--- a/app/lib/admin/metrics/measure/base_measure.rb
+++ b/app/lib/admin/metrics/measure/base_measure.rb
@@ -1,30 +1,49 @@
# frozen_string_literal: true
class Admin::Metrics::Measure::BaseMeasure
+ CACHE_TTL = 5.minutes.freeze
+
def self.with_params?
false
end
+ attr_reader :loaded
+
+ alias loaded? loaded
+
def initialize(start_at, end_at, params)
@start_at = start_at&.to_datetime
@end_at = end_at&.to_datetime
@params = params
+ @loaded = false
+ end
+
+ def cache_key
+ ["metrics/measure/#{key}", @start_at, @end_at, canonicalized_params].join(';')
end
def key
raise NotImplementedError
end
+ def unit
+ nil
+ end
+
+ def total_in_time_range?
+ true
+ end
+
def total
- raise NotImplementedError
+ load[:total]
end
def previous_total
- raise NotImplementedError
+ load[:previous_total]
end
def data
- raise NotImplementedError
+ load[:data]
end
def self.model_name
@@ -37,6 +56,35 @@ class Admin::Metrics::Measure::BaseMeasure
protected
+ def load
+ unless loaded?
+ @values = Rails.cache.fetch(cache_key, expires_in: CACHE_TTL) { perform_queries }.with_indifferent_access
+ @loaded = true
+ end
+
+ @values
+ end
+
+ def perform_queries
+ {
+ total: perform_total_query,
+ previous_total: perform_previous_total_query,
+ data: perform_data_query,
+ }
+ end
+
+ def perform_total_query
+ raise NotImplementedError
+ end
+
+ def perform_previous_total_query
+ raise NotImplementedError
+ end
+
+ def perform_data_query
+ raise NotImplementedError
+ end
+
def time_period
(@start_at..@end_at)
end
@@ -50,6 +98,10 @@ class Admin::Metrics::Measure::BaseMeasure
end
def params
- raise NotImplementedError
+ {}
+ end
+
+ def canonicalized_params
+ params.to_h.to_a.sort_by { |k, _v| k.to_s }.map { |k, v| "#{k}=#{v}" }.join(';')
end
end
diff --git a/app/lib/admin/metrics/measure/instance_accounts_measure.rb b/app/lib/admin/metrics/measure/instance_accounts_measure.rb
new file mode 100644
index 000000000..4c61a064a
--- /dev/null
+++ b/app/lib/admin/metrics/measure/instance_accounts_measure.rb
@@ -0,0 +1,58 @@
+# frozen_string_literal: true
+
+class Admin::Metrics::Measure::InstanceAccountsMeasure < Admin::Metrics::Measure::BaseMeasure
+ def self.with_params?
+ true
+ end
+
+ def key
+ 'instance_accounts'
+ end
+
+ def total_in_time_range?
+ false
+ end
+
+ protected
+
+ def perform_total_query
+ Account.where(domain: params[:domain]).count
+ end
+
+ def perform_previous_total_query
+ nil
+ end
+
+ def perform_data_query
+ sql = <<-SQL.squish
+ SELECT axis.*, (
+ WITH new_accounts AS (
+ SELECT accounts.id
+ FROM accounts
+ WHERE date_trunc('day', accounts.created_at)::date = axis.period
+ AND accounts.domain = $3::text
+ )
+ SELECT count(*) FROM new_accounts
+ ) AS value
+ FROM (
+ SELECT generate_series(date_trunc('day', $1::timestamp)::date, date_trunc('day', $2::timestamp)::date, interval '1 day') AS period
+ ) AS axis
+ SQL
+
+ rows = ActiveRecord::Base.connection.select_all(sql, nil, [[nil, @start_at], [nil, @end_at], [nil, params[:domain]]])
+
+ rows.map { |row| { date: row['period'], value: row['value'].to_s } }
+ end
+
+ def time_period
+ (@start_at.to_date..@end_at.to_date)
+ end
+
+ def previous_time_period
+ ((@start_at.to_date - length_of_period)..(@end_at.to_date - length_of_period))
+ end
+
+ def params
+ @params.permit(:domain)
+ end
+end
diff --git a/app/lib/admin/metrics/measure/instance_followers_measure.rb b/app/lib/admin/metrics/measure/instance_followers_measure.rb
new file mode 100644
index 000000000..caa60013b
--- /dev/null
+++ b/app/lib/admin/metrics/measure/instance_followers_measure.rb
@@ -0,0 +1,59 @@
+# frozen_string_literal: true
+
+class Admin::Metrics::Measure::InstanceFollowersMeasure < Admin::Metrics::Measure::BaseMeasure
+ def self.with_params?
+ true
+ end
+
+ def key
+ 'instance_followers'
+ end
+
+ def total_in_time_range?
+ false
+ end
+
+ protected
+
+ def perform_total_query
+ Follow.joins(:account).merge(Account.where(domain: params[:domain])).count
+ end
+
+ def perform_previous_total_query
+ nil
+ end
+
+ def perform_data_query
+ sql = <<-SQL.squish
+ SELECT axis.*, (
+ WITH new_followers AS (
+ SELECT follows.id
+ FROM follows
+ INNER JOIN accounts ON follows.account_id = accounts.id
+ WHERE date_trunc('day', follows.created_at)::date = axis.period
+ AND accounts.domain = $3::text
+ )
+ SELECT count(*) FROM new_followers
+ ) AS value
+ FROM (
+ SELECT generate_series(date_trunc('day', $1::timestamp)::date, date_trunc('day', $2::timestamp)::date, interval '1 day') AS period
+ ) AS axis
+ SQL
+
+ rows = ActiveRecord::Base.connection.select_all(sql, nil, [[nil, @start_at], [nil, @end_at], [nil, params[:domain]]])
+
+ rows.map { |row| { date: row['period'], value: row['value'].to_s } }
+ end
+
+ def time_period
+ (@start_at.to_date..@end_at.to_date)
+ end
+
+ def previous_time_period
+ ((@start_at.to_date - length_of_period)..(@end_at.to_date - length_of_period))
+ end
+
+ def params
+ @params.permit(:domain)
+ end
+end
diff --git a/app/lib/admin/metrics/measure/instance_follows_measure.rb b/app/lib/admin/metrics/measure/instance_follows_measure.rb
new file mode 100644
index 000000000..b026c7e6d
--- /dev/null
+++ b/app/lib/admin/metrics/measure/instance_follows_measure.rb
@@ -0,0 +1,59 @@
+# frozen_string_literal: true
+
+class Admin::Metrics::Measure::InstanceFollowsMeasure < Admin::Metrics::Measure::BaseMeasure
+ def self.with_params?
+ true
+ end
+
+ def key
+ 'instance_follows'
+ end
+
+ def total_in_time_range?
+ false
+ end
+
+ protected
+
+ def perform_total_query
+ Follow.joins(:target_account).merge(Account.where(domain: params[:domain])).count
+ end
+
+ def perform_previous_total_query
+ nil
+ end
+
+ def perform_data_query
+ sql = <<-SQL.squish
+ SELECT axis.*, (
+ WITH new_follows AS (
+ SELECT follows.id
+ FROM follows
+ INNER JOIN accounts ON follows.target_account_id = accounts.id
+ WHERE date_trunc('day', follows.created_at)::date = axis.period
+ AND accounts.domain = $3::text
+ )
+ SELECT count(*) FROM new_follows
+ ) AS value
+ FROM (
+ SELECT generate_series(date_trunc('day', $1::timestamp)::date, date_trunc('day', $2::timestamp)::date, interval '1 day') AS period
+ ) AS axis
+ SQL
+
+ rows = ActiveRecord::Base.connection.select_all(sql, nil, [[nil, @start_at], [nil, @end_at], [nil, params[:domain]]])
+
+ rows.map { |row| { date: row['period'], value: row['value'].to_s } }
+ end
+
+ def time_period
+ (@start_at.to_date..@end_at.to_date)
+ end
+
+ def previous_time_period
+ ((@start_at.to_date - length_of_period)..(@end_at.to_date - length_of_period))
+ end
+
+ def params
+ @params.permit(:domain)
+ end
+end
diff --git a/app/lib/admin/metrics/measure/instance_media_attachments_measure.rb b/app/lib/admin/metrics/measure/instance_media_attachments_measure.rb
new file mode 100644
index 000000000..2e2154c92
--- /dev/null
+++ b/app/lib/admin/metrics/measure/instance_media_attachments_measure.rb
@@ -0,0 +1,69 @@
+# frozen_string_literal: true
+
+class Admin::Metrics::Measure::InstanceMediaAttachmentsMeasure < Admin::Metrics::Measure::BaseMeasure
+ include ActionView::Helpers::NumberHelper
+
+ def self.with_params?
+ true
+ end
+
+ def key
+ 'instance_media_attachments'
+ end
+
+ def unit
+ 'bytes'
+ end
+
+ def value_to_human_value(value)
+ number_to_human_size(value)
+ end
+
+ def total_in_time_range?
+ false
+ end
+
+ protected
+
+ def perform_total_query
+ MediaAttachment.joins(:account).merge(Account.where(domain: params[:domain])).sum('COALESCE(file_file_size, 0) + COALESCE(thumbnail_file_size, 0)')
+ end
+
+ def perform_previous_total_query
+ nil
+ end
+
+ def perform_data_query
+ sql = <<-SQL.squish
+ SELECT axis.*, (
+ WITH new_media_attachments AS (
+ SELECT COALESCE(media_attachments.file_file_size, 0) + COALESCE(media_attachments.thumbnail_file_size, 0) AS size
+ FROM media_attachments
+ INNER JOIN accounts ON accounts.id = media_attachments.account_id
+ WHERE date_trunc('day', media_attachments.created_at)::date = axis.period
+ AND accounts.domain = $3::text
+ )
+ SELECT SUM(size) FROM new_media_attachments
+ ) AS value
+ FROM (
+ SELECT generate_series(date_trunc('day', $1::timestamp)::date, date_trunc('day', $2::timestamp)::date, interval '1 day') AS period
+ ) AS axis
+ SQL
+
+ rows = ActiveRecord::Base.connection.select_all(sql, nil, [[nil, @start_at], [nil, @end_at], [nil, params[:domain]]])
+
+ rows.map { |row| { date: row['period'], value: row['value'].to_s } }
+ end
+
+ def time_period
+ (@start_at.to_date..@end_at.to_date)
+ end
+
+ def previous_time_period
+ ((@start_at.to_date - length_of_period)..(@end_at.to_date - length_of_period))
+ end
+
+ def params
+ @params.permit(:domain)
+ end
+end
diff --git a/app/lib/admin/metrics/measure/instance_reports_measure.rb b/app/lib/admin/metrics/measure/instance_reports_measure.rb
new file mode 100644
index 000000000..6b3f35067
--- /dev/null
+++ b/app/lib/admin/metrics/measure/instance_reports_measure.rb
@@ -0,0 +1,59 @@
+# frozen_string_literal: true
+
+class Admin::Metrics::Measure::InstanceReportsMeasure < Admin::Metrics::Measure::BaseMeasure
+ def self.with_params?
+ true
+ end
+
+ def key
+ 'instance_reports'
+ end
+
+ def total_in_time_range?
+ false
+ end
+
+ protected
+
+ def perform_total_query
+ Report.where(target_account: Account.where(domain: params[:domain])).count
+ end
+
+ def perform_previous_total_query
+ nil
+ end
+
+ def perform_data_query
+ sql = <<-SQL.squish
+ SELECT axis.*, (
+ WITH new_reports AS (
+ SELECT reports.id
+ FROM reports
+ INNER JOIN accounts ON accounts.id = reports.target_account_id
+ WHERE date_trunc('day', reports.created_at)::date = axis.period
+ AND accounts.domain = $3::text
+ )
+ SELECT count(*) FROM new_reports
+ ) AS value
+ FROM (
+ SELECT generate_series(date_trunc('day', $1::timestamp)::date, date_trunc('day', $2::timestamp)::date, interval '1 day') AS period
+ ) AS axis
+ SQL
+
+ rows = ActiveRecord::Base.connection.select_all(sql, nil, [[nil, @start_at], [nil, @end_at], [nil, params[:domain]]])
+
+ rows.map { |row| { date: row['period'], value: row['value'].to_s } }
+ end
+
+ def time_period
+ (@start_at.to_date..@end_at.to_date)
+ end
+
+ def previous_time_period
+ ((@start_at.to_date - length_of_period)..(@end_at.to_date - length_of_period))
+ end
+
+ def params
+ @params.permit(:domain)
+ end
+end
diff --git a/app/lib/admin/metrics/measure/instance_statuses_measure.rb b/app/lib/admin/metrics/measure/instance_statuses_measure.rb
new file mode 100644
index 000000000..86b10da6c
--- /dev/null
+++ b/app/lib/admin/metrics/measure/instance_statuses_measure.rb
@@ -0,0 +1,60 @@
+# frozen_string_literal: true
+
+class Admin::Metrics::Measure::InstanceStatusesMeasure < Admin::Metrics::Measure::BaseMeasure
+ def self.with_params?
+ true
+ end
+
+ def key
+ 'instance_statuses'
+ end
+
+ def total_in_time_range?
+ false
+ end
+
+ protected
+
+ def perform_total_query
+ Status.joins(:account).merge(Account.where(domain: params[:domain])).count
+ end
+
+ def perform_previous_total_query
+ nil
+ end
+
+ def perform_data_query
+ sql = <<-SQL.squish
+ SELECT axis.*, (
+ WITH new_statuses AS (
+ SELECT statuses.id
+ FROM statuses
+ INNER JOIN accounts ON accounts.id = statuses.account_id
+ WHERE statuses.id BETWEEN $3 AND $4
+ AND accounts.domain = $5::text
+ AND date_trunc('day', statuses.created_at)::date = axis.period
+ )
+ SELECT count(*) FROM new_statuses
+ ) AS value
+ FROM (
+ SELECT generate_series(date_trunc('day', $1::timestamp)::date, date_trunc('day', $2::timestamp)::date, interval '1 day') AS period
+ ) AS axis
+ SQL
+
+ rows = ActiveRecord::Base.connection.select_all(sql, nil, [[nil, @start_at], [nil, @end_at], [nil, Mastodon::Snowflake.id_at(@start_at, with_random: false)], [nil, Mastodon::Snowflake.id_at(@end_at, with_random: false)], [nil, params[:domain]]])
+
+ rows.map { |row| { date: row['period'], value: row['value'].to_s } }
+ end
+
+ def time_period
+ (@start_at.to_date..@end_at.to_date)
+ end
+
+ def previous_time_period
+ ((@start_at.to_date - length_of_period)..(@end_at.to_date - length_of_period))
+ end
+
+ def params
+ @params.permit(:domain)
+ end
+end
diff --git a/app/lib/admin/metrics/measure/interactions_measure.rb b/app/lib/admin/metrics/measure/interactions_measure.rb
index b928fdb8f..7a2b7e0fa 100644
--- a/app/lib/admin/metrics/measure/interactions_measure.rb
+++ b/app/lib/admin/metrics/measure/interactions_measure.rb
@@ -5,20 +5,20 @@ class Admin::Metrics::Measure::InteractionsMeasure < Admin::Metrics::Measure::Ba
'interactions'
end
- def total
+ protected
+
+ def perform_total_query
activity_tracker.sum(time_period.first, time_period.last)
end
- def previous_total
+ def perform_previous_total_query
activity_tracker.sum(previous_time_period.first, previous_time_period.last)
end
- def data
+ def perform_data_query
activity_tracker.get(time_period.first, time_period.last).map { |date, value| { date: date.to_time(:utc).iso8601, value: value.to_s } }
end
- protected
-
def activity_tracker
@activity_tracker ||= ActivityTracker.new('activity:interactions', :basic)
end
diff --git a/app/lib/admin/metrics/measure/new_users_measure.rb b/app/lib/admin/metrics/measure/new_users_measure.rb
index b31679ad3..71191f1a2 100644
--- a/app/lib/admin/metrics/measure/new_users_measure.rb
+++ b/app/lib/admin/metrics/measure/new_users_measure.rb
@@ -5,15 +5,17 @@ class Admin::Metrics::Measure::NewUsersMeasure < Admin::Metrics::Measure::BaseMe
'new_users'
end
- def total
+ protected
+
+ def perform_total_query
User.where(created_at: time_period).count
end
- def previous_total
+ def perform_previous_total_query
User.where(created_at: previous_time_period).count
end
- def data
+ def perform_data_query
sql = <<-SQL.squish
SELECT axis.*, (
WITH new_users AS (
diff --git a/app/lib/admin/metrics/measure/opened_reports_measure.rb b/app/lib/admin/metrics/measure/opened_reports_measure.rb
index 9acc2c33d..4b80a0c8c 100644
--- a/app/lib/admin/metrics/measure/opened_reports_measure.rb
+++ b/app/lib/admin/metrics/measure/opened_reports_measure.rb
@@ -5,15 +5,17 @@ class Admin::Metrics::Measure::OpenedReportsMeasure < Admin::Metrics::Measure::B
'opened_reports'
end
- def total
+ protected
+
+ def perform_total_query
Report.where(created_at: time_period).count
end
- def previous_total
+ def perform_previous_total_query
Report.where(created_at: previous_time_period).count
end
- def data
+ def perform_data_query
sql = <<-SQL.squish
SELECT axis.*, (
WITH new_reports AS (
diff --git a/app/lib/admin/metrics/measure/resolved_reports_measure.rb b/app/lib/admin/metrics/measure/resolved_reports_measure.rb
index 00cb24f7e..4ab746c8f 100644
--- a/app/lib/admin/metrics/measure/resolved_reports_measure.rb
+++ b/app/lib/admin/metrics/measure/resolved_reports_measure.rb
@@ -5,15 +5,17 @@ class Admin::Metrics::Measure::ResolvedReportsMeasure < Admin::Metrics::Measure:
'resolved_reports'
end
- def total
+ protected
+
+ def perform_total_query
Report.resolved.where(action_taken_at: time_period).count
end
- def previous_total
+ def perform_previous_total_query
Report.resolved.where(action_taken_at: previous_time_period).count
end
- def data
+ def perform_data_query
sql = <<-SQL.squish
SELECT axis.*, (
WITH resolved_reports AS (
diff --git a/app/lib/admin/metrics/measure/tag_accounts_measure.rb b/app/lib/admin/metrics/measure/tag_accounts_measure.rb
index ef773081b..8f4512efe 100644
--- a/app/lib/admin/metrics/measure/tag_accounts_measure.rb
+++ b/app/lib/admin/metrics/measure/tag_accounts_measure.rb
@@ -9,20 +9,20 @@ class Admin::Metrics::Measure::TagAccountsMeasure < Admin::Metrics::Measure::Bas
'tag_accounts'
end
- def total
+ protected
+
+ def perform_total_query
tag.history.aggregate(time_period).accounts
end
- def previous_total
+ def perform_previous_total_query
tag.history.aggregate(previous_time_period).accounts
end
- def data
+ def perform_data_query
time_period.map { |date| { date: date.to_time(:utc).iso8601, value: tag.history.get(date).accounts.to_s } }
end
- protected
-
def tag
@tag ||= Tag.find(params[:id])
end
diff --git a/app/lib/admin/metrics/measure/tag_servers_measure.rb b/app/lib/admin/metrics/measure/tag_servers_measure.rb
index cc064f63f..11f229602 100644
--- a/app/lib/admin/metrics/measure/tag_servers_measure.rb
+++ b/app/lib/admin/metrics/measure/tag_servers_measure.rb
@@ -9,15 +9,17 @@ class Admin::Metrics::Measure::TagServersMeasure < Admin::Metrics::Measure::Base
'tag_servers'
end
- def total
+ protected
+
+ def perform_total_query
tag.statuses.where('statuses.id BETWEEN ? AND ?', Mastodon::Snowflake.id_at(@start_at, with_random: false), Mastodon::Snowflake.id_at(@end_at, with_random: false)).joins(:account).count('distinct accounts.domain')
end
- def previous_total
+ def perform_previous_total_query
tag.statuses.where('statuses.id BETWEEN ? AND ?', Mastodon::Snowflake.id_at(@start_at - length_of_period, with_random: false), Mastodon::Snowflake.id_at(@end_at - length_of_period, with_random: false)).joins(:account).count('distinct accounts.domain')
end
- def data
+ def perform_data_query
sql = <<-SQL.squish
SELECT axis.*, (
SELECT count(distinct accounts.domain) AS value
@@ -38,8 +40,6 @@ class Admin::Metrics::Measure::TagServersMeasure < Admin::Metrics::Measure::Base
rows.map { |row| { date: row['day'], value: row['value'].to_s } }
end
- protected
-
def tag
@tag ||= Tag.find(params[:id])
end
diff --git a/app/lib/admin/metrics/measure/tag_uses_measure.rb b/app/lib/admin/metrics/measure/tag_uses_measure.rb
index b7667bc6c..bce86b89f 100644
--- a/app/lib/admin/metrics/measure/tag_uses_measure.rb
+++ b/app/lib/admin/metrics/measure/tag_uses_measure.rb
@@ -9,20 +9,20 @@ class Admin::Metrics::Measure::TagUsesMeasure < Admin::Metrics::Measure::BaseMea
'tag_uses'
end
- def total
+ protected
+
+ def perform_total_query
tag.history.aggregate(time_period).uses
end
- def previous_total
+ def perform_previous_total_query
tag.history.aggregate(previous_time_period).uses
end
- def data
+ def perform_data_query
time_period.map { |date| { date: date.to_time(:utc).iso8601, value: tag.history.get(date).uses.to_s } }
end
- protected
-
def tag
@tag ||= Tag.find(params[:id])
end
diff --git a/app/lib/admin/metrics/retention.rb b/app/lib/admin/metrics/retention.rb
index 0179a6e28..f6135ac1e 100644
--- a/app/lib/admin/metrics/retention.rb
+++ b/app/lib/admin/metrics/retention.rb
@@ -1,6 +1,8 @@
# frozen_string_literal: true
class Admin::Metrics::Retention
+ CACHE_TTL = 5.minutes.freeze
+
class Cohort < ActiveModelSerializers::Model
attributes :period, :frequency, :data
end
@@ -9,13 +11,37 @@ class Admin::Metrics::Retention
attributes :date, :rate, :value
end
+ attr_reader :loaded
+
+ alias loaded? loaded
+
def initialize(start_at, end_at, frequency)
@start_at = start_at&.to_date
@end_at = end_at&.to_date
@frequency = %w(day month).include?(frequency) ? frequency : 'day'
+ @loaded = false
+ end
+
+ def cache_key
+ ['metrics/retention', @start_at, @end_at, @frequency].join(';')
end
def cohorts
+ load
+ end
+
+ protected
+
+ def load
+ unless loaded?
+ @values = Rails.cache.fetch(cache_key, expires_in: CACHE_TTL) { perform_query }
+ @loaded = true
+ end
+
+ @values
+ end
+
+ def perform_query
sql = <<-SQL.squish
SELECT axis.*, (
WITH new_users AS (
diff --git a/app/lib/application_extension.rb b/app/lib/application_extension.rb
index e61cd0721..a1fea6430 100644
--- a/app/lib/application_extension.rb
+++ b/app/lib/application_extension.rb
@@ -8,4 +8,8 @@ module ApplicationExtension
validates :website, url: true, length: { maximum: 2_000 }, if: :website?
validates :redirect_uri, length: { maximum: 2_000 }
end
+
+ def most_recently_used_access_token
+ @most_recently_used_access_token ||= access_tokens.where.not(last_used_at: nil).order(last_used_at: :desc).first
+ end
end
diff --git a/app/lib/delivery_failure_tracker.rb b/app/lib/delivery_failure_tracker.rb
index 8907ade4c..7b800fc0b 100644
--- a/app/lib/delivery_failure_tracker.rb
+++ b/app/lib/delivery_failure_tracker.rb
@@ -30,7 +30,7 @@ class DeliveryFailureTracker
end
def exhausted_deliveries_days
- Redis.current.smembers(exhausted_deliveries_key).sort.map { |date| Date.new(date.slice(0, 4).to_i, date.slice(4, 2).to_i, date.slice(6, 2).to_i) }
+ @exhausted_deliveries_days ||= Redis.current.smembers(exhausted_deliveries_key).sort.map { |date| Date.new(date.slice(0, 4).to_i, date.slice(4, 2).to_i, date.slice(6, 2).to_i) }
end
alias reset! track_success!
diff --git a/app/lib/feed_manager.rb b/app/lib/feed_manager.rb
index 0713aa471..efc9da34b 100644
--- a/app/lib/feed_manager.rb
+++ b/app/lib/feed_manager.rb
@@ -499,14 +499,14 @@ class FeedManager
return false if active_filters.empty?
- combined_regex = active_filters.reduce { |memo, obj| Regexp.union(memo, obj) }
+ combined_regex = Regexp.union(active_filters)
status = status.reblog if status.reblog?
combined_text = [
Formatter.instance.plaintext(status),
status.spoiler_text,
status.preloadable_poll ? status.preloadable_poll.options.join("\n\n") : nil,
- status.media_attachments.map(&:description).join("\n\n"),
+ status.ordered_media_attachments.map(&:description).join("\n\n"),
].compact.join("\n\n")
combined_regex.match?(combined_text)
@@ -549,7 +549,7 @@ class FeedManager
end
else
# A reblog may reach earlier than the original status because of the
- # delay of the worker deliverying the original status, the late addition
+ # delay of the worker delivering the original status, the late addition
# by merging timelines, and other reasons.
# If such a reblog already exists, just do not re-insert it into the feed.
return false unless redis.zscore(reblog_key, status.id).nil?
diff --git a/app/lib/formatter.rb b/app/lib/formatter.rb
index f2c4beed5..dfa493ed5 100644
--- a/app/lib/formatter.rb
+++ b/app/lib/formatter.rb
@@ -32,7 +32,7 @@ class Formatter
include ActionView::Helpers::TextHelper
def format(status, **options)
- if status.reblog?
+ if status.respond_to?(:reblog?) && status.reblog?
prepend_reblog = status.reblog.account.acct
status = status.proper
else
@@ -53,7 +53,7 @@ class Formatter
return html.html_safe # rubocop:disable Rails/OutputSafety
end
- linkable_accounts = status.active_mentions.map(&:account)
+ linkable_accounts = status.respond_to?(:active_mentions) ? status.active_mentions.map(&:account) : []
linkable_accounts << status.account
html = raw_content
@@ -90,6 +90,8 @@ class Formatter
end
def simplified_format(account, **options)
+ return '' if account.note.blank?
+
html = account.local? ? linkify(account.note) : reformat(account.note)
html = encode_custom_emojis(html, account.emojis, options[:autoplay]) if options[:custom_emojify]
html.html_safe # rubocop:disable Rails/OutputSafety
diff --git a/app/lib/language_detector.rb b/app/lib/language_detector.rb
deleted file mode 100644
index 40452eddc..000000000
--- a/app/lib/language_detector.rb
+++ /dev/null
@@ -1,101 +0,0 @@
-# frozen_string_literal: true
-
-class LanguageDetector
- include Singleton
-
- WORDS_THRESHOLD = 4
- RELIABLE_CHARACTERS_RE = /[\p{Hebrew}\p{Arabic}\p{Syriac}\p{Thaana}\p{Nko}\p{Han}\p{Katakana}\p{Hiragana}\p{Hangul}\p{Thai}]+/m
-
- def initialize
- @identifier = CLD3::NNetLanguageIdentifier.new(1, 2048)
- end
-
- def detect(text, account)
- input_text = prepare_text(text)
-
- return if input_text.blank?
-
- detect_language_code(input_text) || default_locale(account)
- end
-
- def language_names
- @language_names = CLD3::TaskContextParams::LANGUAGE_NAMES.map { |name| iso6391(name.to_s).to_sym }.uniq
- end
-
- private
-
- def prepare_text(text)
- simplify_text(text).strip
- end
-
- def unreliable_input?(text)
- !reliable_input?(text)
- end
-
- def reliable_input?(text)
- sufficient_text_length?(text) || language_specific_character_set?(text)
- end
-
- def sufficient_text_length?(text)
- text.split(/\s+/).size >= WORDS_THRESHOLD
- end
-
- def language_specific_character_set?(text)
- words = text.scan(RELIABLE_CHARACTERS_RE)
-
- if words.present?
- words.reduce(0) { |acc, elem| acc + elem.size }.to_f / text.size > 0.3
- else
- false
- end
- end
-
- def detect_language_code(text)
- return if unreliable_input?(text)
-
- result = @identifier.find_language(text)
-
- iso6391(result.language.to_s).to_sym if result&.reliable?
- end
-
- def iso6391(bcp47)
- iso639 = bcp47.split('-').first
-
- # CLD3 returns grandfathered language code for Hebrew
- return 'he' if iso639 == 'iw'
-
- ISO_639.find(iso639).alpha2
- end
-
- def simplify_text(text)
- new_text = remove_html(text)
- new_text.gsub!(FetchLinkCardService::URL_PATTERN, '\1')
- new_text.gsub!(Account::MENTION_RE, '')
- new_text.gsub!(Tag::HASHTAG_RE) { |string| string.gsub(/[#_]/, '#' => '', '_' => ' ').gsub(/[a-z][A-Z]|[a-zA-Z][\d]/) { |s| s.insert(1, ' ') }.downcase }
- new_text.gsub!(/:#{CustomEmoji::SHORTCODE_RE_FRAGMENT}:/, '')
- new_text.gsub!(/\s+/, ' ')
- new_text
- end
-
- def new_scrubber
- scrubber = Rails::Html::PermitScrubber.new
- scrubber.tags = %w(br p)
- scrubber
- end
-
- def scrubber
- @scrubber ||= new_scrubber
- end
-
- def remove_html(text)
- text = Loofah.fragment(text).scrub!(scrubber).to_s
- text.gsub!(' ', "\n")
- text.gsub!('', "\n\n")
- text.gsub!(/(^
|<\/p>$)/, '')
- text
- end
-
- def default_locale(account)
- account.user_locale&.to_sym || I18n.default_locale if account.local?
- end
-end
diff --git a/app/lib/link_details_extractor.rb b/app/lib/link_details_extractor.rb
index 56ad0717b..fabbd244d 100644
--- a/app/lib/link_details_extractor.rb
+++ b/app/lib/link_details_extractor.rb
@@ -2,6 +2,20 @@
class LinkDetailsExtractor
include ActionView::Helpers::TagHelper
+ include LanguagesHelper
+
+ # Some publications wrap their JSON-LD data in their
+
+