mirror of
https://git.kescher.at/CatCatNya/catstodon.git
synced 2025-01-18 10:24:05 +01:00
Merge branch 'upstream-main' into patches/emoji-reactions-main
This commit is contained in:
commit
b6d249fd0f
320 changed files with 4256 additions and 1955 deletions
|
@ -1,10 +1,6 @@
|
|||
[production]
|
||||
defaults
|
||||
> 0.2%
|
||||
firefox >= 78
|
||||
ios >= 15.6
|
||||
not dead
|
||||
not OperaMini all
|
||||
|
||||
[development]
|
||||
supports es6-module
|
||||
|
|
|
@ -59,7 +59,7 @@ body:
|
|||
Any additional technical details you may have, like logs or error traces
|
||||
value: |
|
||||
If this is happening on your own Mastodon server, please fill out those:
|
||||
- Ruby version: (from `ruby --version`, eg. v3.3.5)
|
||||
- Ruby version: (from `ruby --version`, eg. v3.4.1)
|
||||
- Node.js version: (from `node --version`, eg. v20.18.0)
|
||||
validations:
|
||||
required: false
|
||||
|
|
2
.github/ISSUE_TEMPLATE/3.troubleshooting.yml
vendored
2
.github/ISSUE_TEMPLATE/3.troubleshooting.yml
vendored
|
@ -60,7 +60,7 @@ body:
|
|||
value: |
|
||||
Please at least include those informations:
|
||||
- Operating system: (eg. Ubuntu 22.04)
|
||||
- Ruby version: (from `ruby --version`, eg. v3.3.5)
|
||||
- Ruby version: (from `ruby --version`, eg. v3.4.1)
|
||||
- Node.js version: (from `node --version`, eg. v20.18.0)
|
||||
validations:
|
||||
required: false
|
||||
|
|
5
.github/renovate.json5
vendored
5
.github/renovate.json5
vendored
|
@ -14,11 +14,6 @@
|
|||
// If we do not want a package to be grouped with others, we need to set its groupName
|
||||
// to `null` after any other rule set it to something.
|
||||
dependencyDashboardHeader: 'This issue lists Renovate updates and detected dependencies. Read the [Dependency Dashboard](https://docs.renovatebot.com/key-concepts/dashboard/) docs to learn more. Before approving any upgrade: read the description and comments in the [`renovate.json5` file](https://github.com/mastodon/mastodon/blob/main/.github/renovate.json5).',
|
||||
constraints: {
|
||||
// Mastodon should work on Ruby 3.4, but its test dependencies are currently uninstallable on Ruby 3.4.
|
||||
// TODO: remove this once https://github.com/briandunn/flatware/issues/103 is fixed
|
||||
ruby: '3.3',
|
||||
},
|
||||
postUpdateOptions: ['yarnDedupeHighest'],
|
||||
packageRules: [
|
||||
{
|
||||
|
|
2
.github/workflows/check-i18n.yml
vendored
2
.github/workflows/check-i18n.yml
vendored
|
@ -18,7 +18,7 @@ permissions:
|
|||
|
||||
jobs:
|
||||
check-i18n:
|
||||
runs-on: ubuntu-24.04
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
|
|
|
@ -51,7 +51,7 @@ jobs:
|
|||
|
||||
# Create or update the pull request
|
||||
- name: Create Pull Request
|
||||
uses: peter-evans/create-pull-request@v7.0.5
|
||||
uses: peter-evans/create-pull-request@v7.0.6
|
||||
with:
|
||||
commit-message: 'New Crowdin translations'
|
||||
title: 'New Crowdin Translations for ${{ github.base_ref || github.ref_name }} (automated)'
|
||||
|
|
2
.github/workflows/crowdin-download.yml
vendored
2
.github/workflows/crowdin-download.yml
vendored
|
@ -53,7 +53,7 @@ jobs:
|
|||
|
||||
# Create or update the pull request
|
||||
- name: Create Pull Request
|
||||
uses: peter-evans/create-pull-request@v7.0.5
|
||||
uses: peter-evans/create-pull-request@v7
|
||||
with:
|
||||
commit-message: 'New Crowdin translations'
|
||||
title: 'New Crowdin Translations (automated)'
|
||||
|
|
2
.github/workflows/lint-haml.yml
vendored
2
.github/workflows/lint-haml.yml
vendored
|
@ -43,4 +43,4 @@ jobs:
|
|||
- name: Run haml-lint
|
||||
run: |
|
||||
echo "::add-matcher::.github/workflows/haml-lint-problem-matcher.json"
|
||||
bin/haml-lint --reporter github
|
||||
bin/haml-lint --parallel --reporter github
|
||||
|
|
6
.github/workflows/test-ruby.yml
vendored
6
.github/workflows/test-ruby.yml
vendored
|
@ -125,6 +125,7 @@ jobs:
|
|||
matrix:
|
||||
ruby-version:
|
||||
- '3.2'
|
||||
- '3.3'
|
||||
- '.ruby-version'
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
|
@ -174,7 +175,7 @@ jobs:
|
|||
|
||||
test-libvips:
|
||||
name: Libvips tests
|
||||
runs-on: ubuntu-24.04
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
needs:
|
||||
- build
|
||||
|
@ -226,6 +227,7 @@ jobs:
|
|||
matrix:
|
||||
ruby-version:
|
||||
- '3.2'
|
||||
- '3.3'
|
||||
- '.ruby-version'
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
|
@ -304,6 +306,7 @@ jobs:
|
|||
matrix:
|
||||
ruby-version:
|
||||
- '3.2'
|
||||
- '3.3'
|
||||
- '.ruby-version'
|
||||
|
||||
steps:
|
||||
|
@ -420,6 +423,7 @@ jobs:
|
|||
matrix:
|
||||
ruby-version:
|
||||
- '3.2'
|
||||
- '3.3'
|
||||
- '.ruby-version'
|
||||
search-image:
|
||||
- docker.elastic.co/elasticsearch/elasticsearch:7.17.13
|
||||
|
|
2
.nvmrc
2
.nvmrc
|
@ -1 +1 @@
|
|||
22.12
|
||||
22.13
|
||||
|
|
|
@ -29,9 +29,6 @@ Style/IfUnlessModifier:
|
|||
Style/KeywordArgumentsMerging:
|
||||
Enabled: false
|
||||
|
||||
Style/MultipleComparison:
|
||||
Enabled: false
|
||||
|
||||
Style/NumericLiterals:
|
||||
AllowedPatterns:
|
||||
- \d{4}_\d{2}_\d{2}_\d{6}
|
||||
|
@ -61,3 +58,6 @@ Style/TrailingCommaInArrayLiteral:
|
|||
|
||||
Style/TrailingCommaInHashLiteral:
|
||||
EnforcedStyleForMultiline: comma
|
||||
|
||||
Style/WordArray:
|
||||
MinSize: 3 # Override default of 2
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
# This configuration was generated by
|
||||
# `rubocop --auto-gen-config --auto-gen-only-exclude --no-offense-counts --no-auto-gen-timestamp`
|
||||
# using RuboCop version 1.69.1.
|
||||
# using RuboCop version 1.70.0.
|
||||
# The point is for the user to remove these configuration records
|
||||
# one by one as the offenses are removed from the code base.
|
||||
# Note that changes in the inspected code, or installation of new
|
||||
|
@ -8,7 +8,7 @@
|
|||
|
||||
Lint/NonLocalExitFromIterator:
|
||||
Exclude:
|
||||
- 'app/helpers/jsonld_helper.rb'
|
||||
- 'app/helpers/json_ld_helper.rb'
|
||||
|
||||
# Configuration parameters: AllowedMethods, AllowedPatterns, CountRepeatedAttributes.
|
||||
Metrics/AbcSize:
|
||||
|
@ -69,20 +69,11 @@ Style/MapToHash:
|
|||
Exclude:
|
||||
- 'app/models/status.rb'
|
||||
|
||||
# This cop supports unsafe autocorrection (--autocorrect-all).
|
||||
# Configuration parameters: EnforcedStyle.
|
||||
# SupportedStyles: literals, strict
|
||||
Style/MutableConstant:
|
||||
Exclude:
|
||||
- 'app/models/tag.rb'
|
||||
- 'app/services/delete_account_service.rb'
|
||||
- 'lib/mastodon/migration_warning.rb'
|
||||
|
||||
# Configuration parameters: AllowedMethods.
|
||||
# AllowedMethods: respond_to_missing?
|
||||
Style/OptionalBooleanParameter:
|
||||
Exclude:
|
||||
- 'app/helpers/jsonld_helper.rb'
|
||||
- 'app/helpers/json_ld_helper.rb'
|
||||
- 'app/lib/admin/system_check/message.rb'
|
||||
- 'app/lib/request.rb'
|
||||
- 'app/lib/webfinger.rb'
|
||||
|
@ -103,10 +94,3 @@ Style/RedundantConstantBase:
|
|||
Exclude:
|
||||
- 'config/environments/production.rb'
|
||||
- 'config/initializers/sidekiq.rb'
|
||||
|
||||
# This cop supports safe autocorrection (--autocorrect).
|
||||
# Configuration parameters: WordRegex.
|
||||
# SupportedStyles: percent, brackets
|
||||
Style/WordArray:
|
||||
EnforcedStyle: percent
|
||||
MinSize: 3
|
||||
|
|
|
@ -1 +1 @@
|
|||
3.3.6
|
||||
3.4.1
|
||||
|
|
18
CHANGELOG.md
18
CHANGELOG.md
|
@ -2,6 +2,24 @@
|
|||
|
||||
All notable changes to this project will be documented in this file.
|
||||
|
||||
## [4.3.3] - 2025-01-16
|
||||
|
||||
### Security
|
||||
|
||||
- Fix insufficient validation of account URIs ([GHSA-5wxh-3p65-r4g6](https://github.com/mastodon/mastodon/security/advisories/GHSA-5wxh-3p65-r4g6))
|
||||
- Update dependencies
|
||||
|
||||
### Fixed
|
||||
|
||||
- Fix `libyaml` missing from `Dockerfile` build stage (#33591 by @vmstan)
|
||||
- Fix incorrect notification settings migration for non-followers (#33348 by @ClearlyClaire)
|
||||
- Fix down clause for notification policy v2 migrations (#33340 by @jesseplusplus)
|
||||
- Fix error decrementing status count when `FeaturedTags#last_status_at` is `nil` (#33320 by @ClearlyClaire)
|
||||
- Fix last paginated notification group only including data on a single notification (#33271 by @ClearlyClaire)
|
||||
- Fix processing of mentions for post edits with an existing corresponding silent mention (#33227 by @ClearlyClaire)
|
||||
- Fix deletion of unconfirmed users with Webauthn set (#33186 by @ClearlyClaire)
|
||||
- Fix empty authors preview card serialization (#33151, #33466 by @mjankowski and @ClearlyClaire)
|
||||
|
||||
## [4.3.2] - 2024-12-03
|
||||
|
||||
### Added
|
||||
|
|
|
@ -51,7 +51,7 @@ You can contribute in the following ways:
|
|||
If your contributions are accepted into Mastodon, you can request to be paid through [our OpenCollective](https://opencollective.com/mastodon).
|
||||
|
||||
Please review the org-level [contribution guidelines] for high-level acceptance
|
||||
criteria guidance.
|
||||
criteria guidance and the [DEVELOPMENT] guide for environment-specific details.
|
||||
|
||||
[contribution guidelines]: https://github.com/mastodon/.github/blob/main/CONTRIBUTING.md
|
||||
|
||||
|
@ -94,3 +94,5 @@ It is not always possible to phrase every change in such a manner, but it is des
|
|||
The [Mastodon documentation](https://docs.joinmastodon.org) is a statically generated site. You can [submit merge requests to mastodon/documentation](https://github.com/mastodon/documentation).
|
||||
|
||||
</blockquote>
|
||||
|
||||
[DEVELOPMENT]: docs/DEVELOPMENT.md
|
||||
|
|
|
@ -10,9 +10,9 @@
|
|||
ARG TARGETPLATFORM=${TARGETPLATFORM}
|
||||
ARG BUILDPLATFORM=${BUILDPLATFORM}
|
||||
|
||||
# Ruby image to use for base image, change with [--build-arg RUBY_VERSION="3.3.x"]
|
||||
# Ruby image to use for base image, change with [--build-arg RUBY_VERSION="3.4.x"]
|
||||
# renovate: datasource=docker depName=docker.io/ruby
|
||||
ARG RUBY_VERSION="3.3.6"
|
||||
ARG RUBY_VERSION="3.4.1"
|
||||
# # Node version to use in base image, change with [--build-arg NODE_MAJOR_VERSION="20"]
|
||||
# renovate: datasource=node-version depName=node
|
||||
ARG NODE_MAJOR_VERSION="22"
|
||||
|
@ -20,7 +20,7 @@ ARG NODE_MAJOR_VERSION="22"
|
|||
ARG DEBIAN_VERSION="bookworm"
|
||||
# Node image to use for base image based on combined variables (ex: 20-bookworm-slim)
|
||||
FROM docker.io/node:${NODE_MAJOR_VERSION}-${DEBIAN_VERSION}-slim AS node
|
||||
# Ruby image to use for base image based on combined variables (ex: 3.3.x-slim-bookworm)
|
||||
# Ruby image to use for base image based on combined variables (ex: 3.4.x-slim-bookworm)
|
||||
FROM docker.io/ruby:${RUBY_VERSION}-slim-${DEBIAN_VERSION} AS ruby
|
||||
|
||||
# Resulting version string is vX.X.X-MASTODON_VERSION_PRERELEASE+MASTODON_VERSION_METADATA
|
||||
|
@ -153,6 +153,7 @@ RUN \
|
|||
libpq-dev \
|
||||
libssl-dev \
|
||||
libtool \
|
||||
libyaml-dev \
|
||||
meson \
|
||||
nasm \
|
||||
pkg-config \
|
||||
|
|
8
Gemfile
8
Gemfile
|
@ -1,7 +1,7 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
source 'https://rubygems.org'
|
||||
ruby '>= 3.2.0', '< 3.5'
|
||||
ruby '>= 3.2.0', '< 3.5.0'
|
||||
|
||||
gem 'propshaft'
|
||||
gem 'puma', '~> 6.3'
|
||||
|
@ -94,7 +94,7 @@ gem 'twitter-text', '~> 3.1.0'
|
|||
gem 'tzinfo-data', '~> 1.2023'
|
||||
gem 'webauthn', '~> 3.0'
|
||||
gem 'webpacker', '~> 5.4'
|
||||
gem 'webpush', github: 'ClearlyClaire/webpush', ref: 'f14a4d52e201128b1b00245d11b6de80d6cfdcd9'
|
||||
gem 'webpush', github: 'mastodon/webpush', ref: '9631ac63045cfabddacc69fc06e919b4c13eb913'
|
||||
|
||||
gem 'json-ld'
|
||||
gem 'json-ld-preloaded', '~> 3.2'
|
||||
|
@ -108,7 +108,7 @@ group :opentelemetry do
|
|||
gem 'opentelemetry-instrumentation-active_model_serializers', '~> 0.21.0', require: false
|
||||
gem 'opentelemetry-instrumentation-concurrent_ruby', '~> 0.21.2', require: false
|
||||
gem 'opentelemetry-instrumentation-excon', '~> 0.22.0', require: false
|
||||
gem 'opentelemetry-instrumentation-faraday', '~> 0.24.1', require: false
|
||||
gem 'opentelemetry-instrumentation-faraday', '~> 0.25.0', require: false
|
||||
gem 'opentelemetry-instrumentation-http', '~> 0.23.2', require: false
|
||||
gem 'opentelemetry-instrumentation-http_client', '~> 0.22.3', require: false
|
||||
gem 'opentelemetry-instrumentation-net_http', '~> 0.22.4', require: false
|
||||
|
@ -125,7 +125,7 @@ group :test do
|
|||
gem 'flatware-rspec'
|
||||
|
||||
# Adds RSpec Error/Warning annotations to GitHub PRs on the Files tab
|
||||
gem 'rspec-github', '~> 2.4', require: false
|
||||
gem 'rspec-github', '~> 3.0', require: false
|
||||
|
||||
# RSpec helpers for email specs
|
||||
gem 'email_spec'
|
||||
|
|
51
Gemfile.lock
51
Gemfile.lock
|
@ -1,9 +1,9 @@
|
|||
GIT
|
||||
remote: https://github.com/ClearlyClaire/webpush.git
|
||||
revision: f14a4d52e201128b1b00245d11b6de80d6cfdcd9
|
||||
ref: f14a4d52e201128b1b00245d11b6de80d6cfdcd9
|
||||
remote: https://github.com/mastodon/webpush.git
|
||||
revision: 9631ac63045cfabddacc69fc06e919b4c13eb913
|
||||
ref: 9631ac63045cfabddacc69fc06e919b4c13eb913
|
||||
specs:
|
||||
webpush (0.3.8)
|
||||
webpush (1.1.0)
|
||||
hkdf (~> 0.2)
|
||||
jwt (~> 2.0)
|
||||
|
||||
|
@ -94,7 +94,7 @@ GEM
|
|||
ast (2.4.2)
|
||||
attr_required (1.0.2)
|
||||
aws-eventstream (1.3.0)
|
||||
aws-partitions (1.1029.0)
|
||||
aws-partitions (1.1032.0)
|
||||
aws-sdk-core (3.214.1)
|
||||
aws-eventstream (~> 1, >= 1.3.0)
|
||||
aws-partitions (~> 1, >= 1.992.0)
|
||||
|
@ -103,7 +103,7 @@ GEM
|
|||
aws-sdk-kms (1.96.0)
|
||||
aws-sdk-core (~> 3, >= 3.210.0)
|
||||
aws-sigv4 (~> 1.5)
|
||||
aws-sdk-s3 (1.176.1)
|
||||
aws-sdk-s3 (1.177.0)
|
||||
aws-sdk-core (~> 3, >= 3.210.0)
|
||||
aws-sdk-kms (~> 1)
|
||||
aws-sigv4 (~> 1.5)
|
||||
|
@ -160,7 +160,7 @@ GEM
|
|||
cocoon (1.2.15)
|
||||
color_diff (0.1)
|
||||
concurrent-ruby (1.3.4)
|
||||
connection_pool (2.4.1)
|
||||
connection_pool (2.5.0)
|
||||
cose (1.3.1)
|
||||
cbor (~> 0.5.9)
|
||||
openssl-signature_algorithm (~> 1.0)
|
||||
|
@ -233,16 +233,16 @@ GEM
|
|||
faraday-net_http (3.4.0)
|
||||
net-http (>= 0.5.0)
|
||||
fast_blank (1.0.1)
|
||||
fastimage (2.3.1)
|
||||
fastimage (2.4.0)
|
||||
ffi (1.17.1)
|
||||
ffi-compiler (1.3.2)
|
||||
ffi (>= 1.15.5)
|
||||
rake
|
||||
flatware (2.3.3)
|
||||
flatware (2.3.4)
|
||||
drb
|
||||
thor (< 2.0)
|
||||
flatware-rspec (2.3.3)
|
||||
flatware (= 2.3.3)
|
||||
flatware-rspec (2.3.4)
|
||||
flatware (= 2.3.4)
|
||||
rspec (>= 3.6)
|
||||
fog-core (2.5.0)
|
||||
builder
|
||||
|
@ -490,7 +490,7 @@ GEM
|
|||
opentelemetry-instrumentation-active_job (0.7.8)
|
||||
opentelemetry-api (~> 1.0)
|
||||
opentelemetry-instrumentation-base (~> 0.22.1)
|
||||
opentelemetry-instrumentation-active_model_serializers (0.21.0)
|
||||
opentelemetry-instrumentation-active_model_serializers (0.21.1)
|
||||
opentelemetry-api (~> 1.0)
|
||||
opentelemetry-instrumentation-active_support (>= 0.7.0)
|
||||
opentelemetry-instrumentation-base (~> 0.22.1)
|
||||
|
@ -510,7 +510,7 @@ GEM
|
|||
opentelemetry-instrumentation-excon (0.22.5)
|
||||
opentelemetry-api (~> 1.0)
|
||||
opentelemetry-instrumentation-base (~> 0.22.1)
|
||||
opentelemetry-instrumentation-faraday (0.24.8)
|
||||
opentelemetry-instrumentation-faraday (0.25.0)
|
||||
opentelemetry-api (~> 1.0)
|
||||
opentelemetry-instrumentation-base (~> 0.22.1)
|
||||
opentelemetry-instrumentation-http (0.23.5)
|
||||
|
@ -522,14 +522,14 @@ GEM
|
|||
opentelemetry-instrumentation-net_http (0.22.8)
|
||||
opentelemetry-api (~> 1.0)
|
||||
opentelemetry-instrumentation-base (~> 0.22.1)
|
||||
opentelemetry-instrumentation-pg (0.29.1)
|
||||
opentelemetry-instrumentation-pg (0.29.2)
|
||||
opentelemetry-api (~> 1.0)
|
||||
opentelemetry-helpers-sql-obfuscation
|
||||
opentelemetry-instrumentation-base (~> 0.22.1)
|
||||
opentelemetry-instrumentation-rack (0.25.0)
|
||||
opentelemetry-api (~> 1.0)
|
||||
opentelemetry-instrumentation-base (~> 0.22.1)
|
||||
opentelemetry-instrumentation-rails (0.34.0)
|
||||
opentelemetry-instrumentation-rails (0.34.1)
|
||||
opentelemetry-api (~> 1.0)
|
||||
opentelemetry-instrumentation-action_mailer (~> 0.3.0)
|
||||
opentelemetry-instrumentation-action_pack (~> 0.10.0)
|
||||
|
@ -538,6 +538,7 @@ GEM
|
|||
opentelemetry-instrumentation-active_record (~> 0.8.0)
|
||||
opentelemetry-instrumentation-active_support (~> 0.7.0)
|
||||
opentelemetry-instrumentation-base (~> 0.22.1)
|
||||
opentelemetry-instrumentation-concurrent_ruby (~> 0.21.4)
|
||||
opentelemetry-instrumentation-redis (0.25.7)
|
||||
opentelemetry-api (~> 1.0)
|
||||
opentelemetry-instrumentation-base (~> 0.22.1)
|
||||
|
@ -555,7 +556,7 @@ GEM
|
|||
opentelemetry-api (~> 1.0)
|
||||
orm_adapter (0.5.0)
|
||||
ostruct (0.6.1)
|
||||
ox (2.14.19)
|
||||
ox (2.14.20)
|
||||
bigdecimal (>= 3.0)
|
||||
parallel (1.26.3)
|
||||
parser (3.3.6.0)
|
||||
|
@ -690,7 +691,7 @@ GEM
|
|||
rspec-expectations (3.13.3)
|
||||
diff-lcs (>= 1.2.0, < 2.0)
|
||||
rspec-support (~> 3.13.0)
|
||||
rspec-github (2.4.0)
|
||||
rspec-github (3.0.0)
|
||||
rspec-core (~> 3.0)
|
||||
rspec-mocks (3.13.2)
|
||||
diff-lcs (>= 1.2.0, < 2.0)
|
||||
|
@ -709,7 +710,7 @@ GEM
|
|||
rspec-mocks (~> 3.0)
|
||||
sidekiq (>= 5, < 8)
|
||||
rspec-support (3.13.2)
|
||||
rubocop (1.69.2)
|
||||
rubocop (1.70.0)
|
||||
json (~> 2.3)
|
||||
language_server-protocol (>= 3.17.0)
|
||||
parallel (~> 1.10)
|
||||
|
@ -723,7 +724,7 @@ GEM
|
|||
parser (>= 3.3.1.0)
|
||||
rubocop-capybara (2.21.0)
|
||||
rubocop (~> 1.41)
|
||||
rubocop-performance (1.23.0)
|
||||
rubocop-performance (1.23.1)
|
||||
rubocop (>= 1.48.1, < 2.0)
|
||||
rubocop-ast (>= 1.31.1, < 2.0)
|
||||
rubocop-rails (2.28.0)
|
||||
|
@ -744,7 +745,7 @@ GEM
|
|||
ruby-vips (2.2.2)
|
||||
ffi (~> 1.12)
|
||||
logger
|
||||
rubyzip (2.3.2)
|
||||
rubyzip (2.4.1)
|
||||
rufus-scheduler (3.9.2)
|
||||
fugit (~> 1.1, >= 1.11.1)
|
||||
safety_net_attestation (0.4.0)
|
||||
|
@ -793,7 +794,7 @@ GEM
|
|||
simplecov-html (0.13.1)
|
||||
simplecov-lcov (0.8.0)
|
||||
simplecov_json_formatter (0.1.4)
|
||||
stackprof (0.2.26)
|
||||
stackprof (0.2.27)
|
||||
stoplight (4.1.0)
|
||||
redlock (~> 1.0)
|
||||
stringio (3.1.2)
|
||||
|
@ -809,7 +810,7 @@ GEM
|
|||
unicode-display_width (>= 1.1.1, < 3)
|
||||
terrapin (1.0.1)
|
||||
climate_control
|
||||
test-prof (1.4.3)
|
||||
test-prof (1.4.4)
|
||||
thor (1.3.2)
|
||||
tilt (2.5.0)
|
||||
timeout (0.4.3)
|
||||
|
@ -963,7 +964,7 @@ DEPENDENCIES
|
|||
opentelemetry-instrumentation-active_model_serializers (~> 0.21.0)
|
||||
opentelemetry-instrumentation-concurrent_ruby (~> 0.21.2)
|
||||
opentelemetry-instrumentation-excon (~> 0.22.0)
|
||||
opentelemetry-instrumentation-faraday (~> 0.24.1)
|
||||
opentelemetry-instrumentation-faraday (~> 0.25.0)
|
||||
opentelemetry-instrumentation-http (~> 0.23.2)
|
||||
opentelemetry-instrumentation-http_client (~> 0.22.3)
|
||||
opentelemetry-instrumentation-net_http (~> 0.22.4)
|
||||
|
@ -994,7 +995,7 @@ DEPENDENCIES
|
|||
redis (~> 4.5)
|
||||
redis-namespace (~> 1.10)
|
||||
rqrcode (~> 2.2)
|
||||
rspec-github (~> 2.4)
|
||||
rspec-github (~> 3.0)
|
||||
rspec-rails (~> 7.0)
|
||||
rspec-sidekiq (~> 5.0)
|
||||
rubocop
|
||||
|
@ -1034,7 +1035,7 @@ DEPENDENCIES
|
|||
xorcist (~> 1.1)
|
||||
|
||||
RUBY VERSION
|
||||
ruby 3.3.6p108
|
||||
ruby 3.4.1p0
|
||||
|
||||
BUNDLED WITH
|
||||
2.6.2
|
||||
|
|
147
README.md
147
README.md
|
@ -14,27 +14,27 @@ Mastodon Glitch Edition is a fork of [Mastodon](https://github.com/mastodon/mast
|
|||
|
||||
---
|
||||
|
||||
<h1><picture>
|
||||
<source media="(prefers-color-scheme: dark)" srcset="./lib/assets/wordmark.dark.png?raw=true">
|
||||
<source media="(prefers-color-scheme: light)" srcset="./lib/assets/wordmark.light.png?raw=true">
|
||||
<img alt="Mastodon" src="./lib/assets/wordmark.light.png?raw=true" height="34">
|
||||
</picture></h1>
|
||||
> [!NOTE]
|
||||
> Want to learn more about Mastodon?
|
||||
> Click below to find out more in a video.
|
||||
|
||||
[![GitHub release](https://img.shields.io/github/release/mastodon/mastodon.svg)][releases]
|
||||
[![Ruby Testing](https://github.com/mastodon/mastodon/actions/workflows/test-ruby.yml/badge.svg)](https://github.com/mastodon/mastodon/actions/workflows/test-ruby.yml)
|
||||
[![Crowdin](https://d322cqt584bo4o.cloudfront.net/mastodon/localized.svg)][crowdin]
|
||||
<p align="center">
|
||||
<a style="text-decoration:none" href="https://www.youtube.com/watch?v=IPSbNdBmWKE">
|
||||
<img alt="Mastodon hero image" src="https://github.com/user-attachments/assets/ef53f5e9-c0d8-484d-9f53-00efdebb92c3" />
|
||||
</a>
|
||||
</p>
|
||||
|
||||
[releases]: https://github.com/mastodon/mastodon/releases
|
||||
[crowdin]: https://crowdin.com/project/mastodon
|
||||
<p align="center">
|
||||
<a style="text-decoration:none" href="https://github.com/mastodon/mastodon/releases">
|
||||
<img src="https://img.shields.io/github/release/mastodon/mastodon.svg" alt="Release" /></a>
|
||||
<a style="text-decoration:none" href="https://github.com/mastodon/mastodon/actions/workflows/test-ruby.yml">
|
||||
<img src="https://github.com/mastodon/mastodon/actions/workflows/test-ruby.yml/badge.svg" alt="Ruby Testing" /></a>
|
||||
<a style="text-decoration:none" href="https://crowdin.com/project/mastodon">
|
||||
<img src="https://d322cqt584bo4o.cloudfront.net/mastodon/localized.svg" alt="Crowdin" /></a>
|
||||
</p>
|
||||
|
||||
Mastodon is a **free, open-source social network server** based on ActivityPub where users can follow friends and discover new ones. On Mastodon, users can publish anything they want: links, pictures, text, and video. All Mastodon servers are interoperable as a federated network (users on one server can seamlessly communicate with users from another one, including non-Mastodon software that implements ActivityPub!)
|
||||
|
||||
Click below to **learn more** in a video:
|
||||
|
||||
[![Screenshot](https://blog.joinmastodon.org/2018/06/why-activitypub-is-the-future/ezgif-2-60f1b00403.gif)][youtube_demo]
|
||||
|
||||
[youtube_demo]: https://www.youtube.com/watch?v=IPSbNdBmWKE
|
||||
|
||||
## Navigation
|
||||
|
||||
- [Project homepage 🐘](https://joinmastodon.org)
|
||||
|
@ -53,25 +53,15 @@ Click below to **learn more** in a video:
|
|||
|
||||
<img src="/app/javascript/images/elephant_ui_working.svg?raw=true" align="right" width="30%" />
|
||||
|
||||
### No vendor lock-in: Fully interoperable with any conforming platform
|
||||
**No vendor lock-in: Fully interoperable with any conforming platform** - It doesn't have to be Mastodon; whatever implements ActivityPub is part of the social network! [Learn more](https://blog.joinmastodon.org/2018/06/why-activitypub-is-the-future/)
|
||||
|
||||
It doesn't have to be Mastodon; whatever implements ActivityPub is part of the social network! [Learn more](https://blog.joinmastodon.org/2018/06/why-activitypub-is-the-future/)
|
||||
**Real-time, chronological timeline updates** - updates of people you're following appear in real-time in the UI via WebSockets. There's a firehose view as well!
|
||||
|
||||
### Real-time, chronological timeline updates
|
||||
**Media attachments like images and short videos** - upload and view images and WebM/MP4 videos attached to the updates. Videos with no audio track are treated like GIFs; normal videos loop continuously!
|
||||
|
||||
Updates of people you're following appear in real-time in the UI via WebSockets. There's a firehose view as well!
|
||||
**Safety and moderation tools** - Mastodon includes private posts, locked accounts, phrase filtering, muting, blocking, and all sorts of other features, along with a reporting and moderation system. [Learn more](https://blog.joinmastodon.org/2018/07/cage-the-mastodon/)
|
||||
|
||||
### Media attachments like images and short videos
|
||||
|
||||
Upload and view images and WebM/MP4 videos attached to the updates. Videos with no audio track are treated like GIFs; normal videos loop continuously!
|
||||
|
||||
### Safety and moderation tools
|
||||
|
||||
Mastodon includes private posts, locked accounts, phrase filtering, muting, blocking, and all sorts of other features, along with a reporting and moderation system. [Learn more](https://blog.joinmastodon.org/2018/07/cage-the-mastodon/)
|
||||
|
||||
### OAuth2 and a straightforward REST API
|
||||
|
||||
Mastodon acts as an OAuth2 provider, so 3rd party apps can use the REST and Streaming APIs. This results in a rich app ecosystem with a lot of choices!
|
||||
**OAuth2 and a straightforward REST API** - Mastodon acts as an OAuth2 provider, so 3rd party apps can use the REST and Streaming APIs. This results in a rich app ecosystem with a lot of choices!
|
||||
|
||||
## Deployment
|
||||
|
||||
|
@ -90,85 +80,40 @@ Mastodon acts as an OAuth2 provider, so 3rd party apps can use the REST and Stre
|
|||
|
||||
The repository includes deployment configurations for **Docker and docker-compose** as well as specific platforms like **Heroku**, and **Scalingo**. For Helm charts, reference the [mastodon/chart repository](https://github.com/mastodon/chart). The [**standalone** installation guide](https://docs.joinmastodon.org/admin/install/) is available in the documentation.
|
||||
|
||||
## Development
|
||||
|
||||
### Vagrant
|
||||
|
||||
A **Vagrant** configuration is included for development purposes. To use it, complete the following steps:
|
||||
|
||||
- Install Vagrant and Virtualbox
|
||||
- Install the `vagrant-hostsupdater` plugin: `vagrant plugin install vagrant-hostsupdater`
|
||||
- Run `vagrant up`
|
||||
- Run `vagrant ssh -c "cd /vagrant && bin/dev"`
|
||||
- Open `http://mastodon.local` in your browser
|
||||
|
||||
### macOS
|
||||
|
||||
To set up **macOS** for native development, complete the following steps:
|
||||
|
||||
- Install [Homebrew] and run `brew install postgresql@14 redis imagemagick
|
||||
libidn nvm` to install the required project dependencies
|
||||
- Use a Ruby version manager to activate the ruby in `.ruby-version` and run
|
||||
`nvm use` to activate the node version from `.nvmrc`
|
||||
- Run the `bin/setup` script, which will install the required ruby gems and node
|
||||
packages and prepare the database for local development
|
||||
- Finally, run the `bin/dev` script which will launch services via `overmind`
|
||||
(if installed) or `foreman`
|
||||
|
||||
### Docker
|
||||
|
||||
For production hosting and deployment with **Docker**, use the `Dockerfile` and
|
||||
`docker-compose.yml` in the project root directory.
|
||||
|
||||
For local development, install and launch [Docker], and run:
|
||||
|
||||
```shell
|
||||
docker compose -f .devcontainer/compose.yaml up -d
|
||||
docker compose -f .devcontainer/compose.yaml exec app bin/setup
|
||||
docker compose -f .devcontainer/compose.yaml exec app bin/dev
|
||||
```
|
||||
|
||||
### Dev Containers
|
||||
|
||||
Within IDEs that support the [Development Containers] specification, start the
|
||||
"Mastodon on local machine" container from the editor. The necessary `docker
|
||||
compose` commands to build and setup the container should run automatically. For
|
||||
**Visual Studio Code** this requires installing the [Dev Container extension].
|
||||
|
||||
### GitHub Codespaces
|
||||
|
||||
[GitHub Codespaces] provides a web-based version of VS Code and a cloud hosted
|
||||
development environment configured with the software needed for this project.
|
||||
|
||||
[![Open in GitHub Codespaces](https://github.com/codespaces/badge.svg)][codespace]
|
||||
|
||||
- Click the button to create a new codespace, and confirm the options
|
||||
- Wait for the environment to build (takes a few minutes)
|
||||
- When the editor is ready, run `bin/dev` in the terminal
|
||||
- Wait for an _Open in Browser_ prompt. This will open Mastodon
|
||||
- On the _Ports_ tab "stream" setting change _Port visibility_ → _Public_
|
||||
|
||||
## Contributing
|
||||
|
||||
Mastodon is **free, open-source software** licensed under **AGPLv3**.
|
||||
|
||||
You can open issues for bugs you've found or features you think are missing. You can also submit pull requests to this repository or submit translations using Crowdin. To get started, take a look at [CONTRIBUTING.md](CONTRIBUTING.md). If your contributions are accepted into Mastodon, you can request to be paid through [our OpenCollective](https://opencollective.com/mastodon).
|
||||
You can open issues for bugs you've found or features you think are missing. You
|
||||
can also submit pull requests to this repository or translations via Crowdin. To
|
||||
get started, look at the [CONTRIBUTING] and [DEVELOPMENT] guides. For changes
|
||||
accepted into Mastodon, you can request to be paid through our [OpenCollective].
|
||||
|
||||
**IRC channel**: #mastodon on irc.libera.chat
|
||||
**IRC channel**: #mastodon on [`irc.libera.chat`](https://libera.chat)
|
||||
|
||||
## License
|
||||
|
||||
Copyright (C) 2016-2024 Eugen Rochko & other Mastodon contributors (see [AUTHORS.md](AUTHORS.md))
|
||||
Copyright (c) 2016-2024 Eugen Rochko (+ [`mastodon authors`](AUTHORS.md))
|
||||
|
||||
This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
|
||||
Licensed under GNU Affero General Public License as stated in the [LICENSE](LICENSE):
|
||||
|
||||
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details.
|
||||
```
|
||||
Copyright (c) 2016-2024 Eugen Rochko & other Mastodon contributors
|
||||
|
||||
You should have received a copy of the GNU Affero General Public License along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
This program is free software: you can redistribute it and/or modify it under
|
||||
the terms of the GNU Affero General Public License as published by the Free
|
||||
Software Foundation, either version 3 of the License, or (at your option) any
|
||||
later version.
|
||||
|
||||
[codespace]: https://codespaces.new/mastodon/mastodon?quickstart=1&devcontainer_path=.devcontainer%2Fcodespaces%2Fdevcontainer.json
|
||||
[Dev Container extension]: https://containers.dev/supporting#dev-containers
|
||||
[Development Containers]: https://containers.dev/supporting
|
||||
[Docker]: https://docs.docker.com
|
||||
[GitHub Codespaces]: https://docs.github.com/en/codespaces
|
||||
[Homebrew]: https://brew.sh
|
||||
This program is distributed in the hope that it will be useful, but WITHOUT
|
||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
||||
FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more
|
||||
details.
|
||||
|
||||
You should have received a copy of the GNU Affero General Public License along
|
||||
with this program. If not, see https://www.gnu.org/licenses/
|
||||
```
|
||||
|
||||
[CONTRIBUTING]: CONTRIBUTING.md
|
||||
[DEVELOPMENT]: docs/DEVELOPMENT.md
|
||||
[OpenCollective]: https://opencollective.com/mastodon
|
||||
|
|
|
@ -49,7 +49,7 @@ class ActivityPub::CollectionsController < ActivityPub::BaseController
|
|||
|
||||
def collection_presenter
|
||||
ActivityPub::CollectionPresenter.new(
|
||||
id: account_collection_url(@account, params[:id]),
|
||||
id: ActivityPub::TagManager.instance.collection_uri_for(@account, params[:id]),
|
||||
type: @type,
|
||||
size: @size,
|
||||
items: @items
|
||||
|
|
|
@ -41,12 +41,8 @@ class ActivityPub::OutboxesController < ActivityPub::BaseController
|
|||
end
|
||||
end
|
||||
|
||||
def outbox_url(**)
|
||||
if params[:account_username].present?
|
||||
account_outbox_url(@account, **)
|
||||
else
|
||||
instance_actor_outbox_url(**)
|
||||
end
|
||||
def outbox_url(...)
|
||||
ActivityPub::TagManager.instance.outbox_uri_for(@account, ...)
|
||||
end
|
||||
|
||||
def next_page
|
||||
|
|
|
@ -6,7 +6,7 @@ module Admin
|
|||
|
||||
def index
|
||||
authorize :software_update, :index?
|
||||
@software_updates = SoftwareUpdate.all.sort_by(&:gem_version)
|
||||
@software_updates = SoftwareUpdate.by_version
|
||||
end
|
||||
|
||||
private
|
||||
|
|
|
@ -21,6 +21,7 @@ class Api::V1::Push::SubscriptionsController < Api::BaseController
|
|||
endpoint: subscription_params[:endpoint],
|
||||
key_p256dh: subscription_params[:keys][:p256dh],
|
||||
key_auth: subscription_params[:keys][:auth],
|
||||
standard: subscription_params[:standard] || false,
|
||||
data: data_params,
|
||||
user_id: current_user.id,
|
||||
access_token_id: doorkeeper_token.id
|
||||
|
@ -55,7 +56,7 @@ class Api::V1::Push::SubscriptionsController < Api::BaseController
|
|||
end
|
||||
|
||||
def subscription_params
|
||||
params.require(:subscription).permit(:endpoint, keys: [:auth, :p256dh])
|
||||
params.require(:subscription).permit(:endpoint, :standard, keys: [:auth, :p256dh])
|
||||
end
|
||||
|
||||
def data_params
|
||||
|
|
|
@ -80,10 +80,31 @@ class Api::V2::NotificationsController < Api::BaseController
|
|||
return [] if @notifications.empty?
|
||||
|
||||
MastodonOTELTracer.in_span('Api::V2::NotificationsController#load_grouped_notifications') do
|
||||
NotificationGroup.from_notifications(@notifications, pagination_range: (@notifications.last.id)..(@notifications.first.id), grouped_types: params[:grouped_types])
|
||||
pagination_range = (@notifications.last.id)..@notifications.first.id
|
||||
|
||||
# If the page is incomplete, we know we are on the last page
|
||||
if incomplete_page?
|
||||
if paginating_up?
|
||||
pagination_range = @notifications.last.id...(params[:max_id]&.to_i)
|
||||
else
|
||||
range_start = params[:since_id]&.to_i
|
||||
range_start += 1 unless range_start.nil?
|
||||
pagination_range = range_start..(@notifications.first.id)
|
||||
end
|
||||
end
|
||||
|
||||
NotificationGroup.from_notifications(@notifications, pagination_range: pagination_range, grouped_types: params[:grouped_types])
|
||||
end
|
||||
end
|
||||
|
||||
def incomplete_page?
|
||||
@notifications.size < limit_param(DEFAULT_NOTIFICATIONS_LIMIT)
|
||||
end
|
||||
|
||||
def paginating_up?
|
||||
params[:min_id].present?
|
||||
end
|
||||
|
||||
def browserable_account_notifications
|
||||
current_account.notifications.without_suspended.browserable(
|
||||
types: Array(browserable_params[:types]),
|
||||
|
|
|
@ -66,7 +66,7 @@ class Api::Web::PushSubscriptionsController < Api::Web::BaseController
|
|||
end
|
||||
|
||||
def subscription_params
|
||||
@subscription_params ||= params.require(:subscription).permit(:endpoint, keys: [:auth, :p256dh])
|
||||
@subscription_params ||= params.require(:subscription).permit(:standard, :endpoint, keys: [:auth, :p256dh])
|
||||
end
|
||||
|
||||
def web_push_subscription_params
|
||||
|
@ -76,6 +76,7 @@ class Api::Web::PushSubscriptionsController < Api::Web::BaseController
|
|||
endpoint: subscription_params[:endpoint],
|
||||
key_auth: subscription_params[:keys][:auth],
|
||||
key_p256dh: subscription_params[:keys][:p256dh],
|
||||
standard: subscription_params[:standard] || false,
|
||||
user_id: active_session.user_id,
|
||||
}
|
||||
end
|
||||
|
|
|
@ -18,7 +18,7 @@ class Auth::SetupController < ApplicationController
|
|||
|
||||
if @user.update(user_params)
|
||||
@user.resend_confirmation_instructions unless @user.confirmed?
|
||||
redirect_to auth_setup_path, notice: I18n.t('auth.setup.new_confirmation_instructions_sent')
|
||||
redirect_to auth_setup_path, notice: t('auth.setup.new_confirmation_instructions_sent')
|
||||
else
|
||||
render :show
|
||||
end
|
||||
|
|
|
@ -25,7 +25,7 @@ module Localized
|
|||
end
|
||||
|
||||
def available_locale_or_nil(locale_name)
|
||||
locale_name.to_sym if locale_name.present? && I18n.available_locales.include?(locale_name.to_sym)
|
||||
locale_name.to_sym if locale_name.respond_to?(:to_sym) && I18n.available_locales.include?(locale_name.to_sym)
|
||||
end
|
||||
|
||||
def content_locale
|
||||
|
|
|
@ -1,10 +1,8 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
class CustomCssController < ActionController::Base # rubocop:disable Rails/ApplicationController
|
||||
before_action :set_user_roles
|
||||
|
||||
def show
|
||||
expires_in 3.minutes, public: true
|
||||
expires_in 1.month, public: true
|
||||
render content_type: 'text/css'
|
||||
end
|
||||
|
||||
|
@ -14,8 +12,4 @@ class CustomCssController < ActionController::Base # rubocop:disable Rails/Appli
|
|||
Setting.custom_css
|
||||
end
|
||||
helper_method :custom_css_styles
|
||||
|
||||
def set_user_roles
|
||||
@user_roles = UserRole.providing_styles
|
||||
end
|
||||
end
|
||||
|
|
|
@ -46,7 +46,7 @@ class FollowerAccountsController < ApplicationController
|
|||
end
|
||||
|
||||
def page_url(page)
|
||||
account_followers_url(@account, page: page) unless page.nil?
|
||||
ActivityPub::TagManager.instance.followers_uri_for(@account, page: page) unless page.nil?
|
||||
end
|
||||
|
||||
def next_page_url
|
||||
|
|
|
@ -239,6 +239,14 @@ module ApplicationHelper
|
|||
I18n.t 'user_mailer.welcome.hashtags_recent_count', people: number_with_delimiter(people), count: people
|
||||
end
|
||||
|
||||
def app_store_url_ios
|
||||
'https://apps.apple.com/app/mastodon-for-iphone-and-ipad/id1571998974'
|
||||
end
|
||||
|
||||
def app_store_url_android
|
||||
'https://play.google.com/store/apps/details?id=org.joinmastodon.android'
|
||||
end
|
||||
|
||||
# glitch-soc addition to handle the multiple flavors
|
||||
def preload_locale_pack
|
||||
supported_locales = Themes.instance.flavour(current_flavour)['locales']
|
||||
|
|
|
@ -27,8 +27,33 @@ module ThemeHelper
|
|||
end
|
||||
end
|
||||
|
||||
def custom_stylesheet
|
||||
if active_custom_stylesheet.present?
|
||||
stylesheet_link_tag(
|
||||
custom_css_path(active_custom_stylesheet),
|
||||
host: root_url,
|
||||
media: :all,
|
||||
skip_pipeline: true
|
||||
)
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def active_custom_stylesheet
|
||||
if cached_custom_css_digest.present?
|
||||
[:custom, cached_custom_css_digest.to_s.first(8)]
|
||||
.compact_blank
|
||||
.join('-')
|
||||
end
|
||||
end
|
||||
|
||||
def cached_custom_css_digest
|
||||
Rails.cache.fetch(:setting_digest_custom_css) do
|
||||
Setting.custom_css&.then { |content| Digest::SHA256.hexdigest(content) }
|
||||
end
|
||||
end
|
||||
|
||||
def theme_color_for(theme)
|
||||
theme == 'mastodon-light' ? Themes::THEME_COLORS[:light] : Themes::THEME_COLORS[:dark]
|
||||
end
|
||||
|
|
|
@ -119,7 +119,11 @@ function loaded() {
|
|||
formattedContent = dateFormat.format(datetime);
|
||||
}
|
||||
|
||||
content.title = formattedContent;
|
||||
const timeGiven = content.dateTime.includes('T');
|
||||
content.title = timeGiven
|
||||
? dateTimeFormat.format(datetime)
|
||||
: dateFormat.format(datetime);
|
||||
|
||||
content.textContent = formattedContent;
|
||||
});
|
||||
|
||||
|
|
|
@ -7,26 +7,18 @@ import { requestNotificationPermission } from '../utils/notifications';
|
|||
import { fetchFollowRequests } from './accounts';
|
||||
import {
|
||||
importFetchedAccount,
|
||||
importFetchedStatus,
|
||||
} from './importer';
|
||||
import { submitMarkers } from './markers';
|
||||
import { notificationsUpdate } from "./notifications_typed";
|
||||
import { register as registerPushNotifications } from './push_notifications';
|
||||
import { saveSettings } from './settings';
|
||||
|
||||
export * from "./notifications_typed";
|
||||
|
||||
export const NOTIFICATIONS_UPDATE_NOOP = 'NOTIFICATIONS_UPDATE_NOOP';
|
||||
|
||||
export const NOTIFICATIONS_FILTER_SET = 'NOTIFICATIONS_FILTER_SET';
|
||||
|
||||
export const NOTIFICATIONS_SET_BROWSER_SUPPORT = 'NOTIFICATIONS_SET_BROWSER_SUPPORT';
|
||||
export const NOTIFICATIONS_SET_BROWSER_PERMISSION = 'NOTIFICATIONS_SET_BROWSER_PERMISSION';
|
||||
|
||||
export const NOTIFICATION_REQUESTS_DISMISS_REQUEST = 'NOTIFICATION_REQUESTS_DISMISS_REQUEST';
|
||||
export const NOTIFICATION_REQUESTS_DISMISS_SUCCESS = 'NOTIFICATION_REQUESTS_DISMISS_SUCCESS';
|
||||
export const NOTIFICATION_REQUESTS_DISMISS_FAIL = 'NOTIFICATION_REQUESTS_DISMISS_FAIL';
|
||||
|
||||
defineMessages({
|
||||
mention: { id: 'notification.mention', defaultMessage: '{name} mentioned you' },
|
||||
group: { id: 'notifications.group', defaultMessage: '{count} notifications' },
|
||||
|
@ -34,8 +26,6 @@ defineMessages({
|
|||
|
||||
export function updateNotifications(notification, intlMessages, intlLocale) {
|
||||
return (dispatch, getState) => {
|
||||
const activeFilter = getState().getIn(['settings', 'notifications', 'quickFilter', 'active']);
|
||||
const showInColumn = activeFilter === 'all' ? getState().getIn(['settings', 'notifications', 'shows', notification.type], true) : activeFilter === notification.type;
|
||||
const showAlert = getState().getIn(['settings', 'notifications', 'alerts', notification.type], true);
|
||||
const playSound = getState().getIn(['settings', 'notifications', 'sounds', notification.type], true);
|
||||
|
||||
|
@ -57,24 +47,9 @@ export function updateNotifications(notification, intlMessages, intlLocale) {
|
|||
|
||||
dispatch(submitMarkers());
|
||||
|
||||
if (showInColumn) {
|
||||
dispatch(importFetchedAccount(notification.account));
|
||||
|
||||
if (notification.status) {
|
||||
dispatch(importFetchedStatus(notification.status));
|
||||
}
|
||||
|
||||
if (notification.report) {
|
||||
dispatch(importFetchedAccount(notification.report.target_account));
|
||||
}
|
||||
|
||||
dispatch(notificationsUpdate({ notification, playSound: playSound && !filtered}));
|
||||
} else if (playSound && !filtered) {
|
||||
dispatch({
|
||||
type: NOTIFICATIONS_UPDATE_NOOP,
|
||||
meta: { sound: 'boop' },
|
||||
});
|
||||
}
|
||||
// `notificationsUpdate` is still used in `user_lists` and `relationships` reducers
|
||||
dispatch(importFetchedAccount(notification.account));
|
||||
dispatch(notificationsUpdate({ notification, playSound: playSound && !filtered}));
|
||||
|
||||
// Desktop notifications
|
||||
if (typeof window.Notification !== 'undefined' && showAlert && !filtered) {
|
||||
|
@ -93,17 +68,6 @@ export function updateNotifications(notification, intlMessages, intlLocale) {
|
|||
|
||||
const noOp = () => {};
|
||||
|
||||
export function setFilter (filterType) {
|
||||
return dispatch => {
|
||||
dispatch({
|
||||
type: NOTIFICATIONS_FILTER_SET,
|
||||
path: ['notifications', 'quickFilter', 'active'],
|
||||
value: filterType,
|
||||
});
|
||||
dispatch(saveSettings());
|
||||
};
|
||||
}
|
||||
|
||||
// Browser support
|
||||
export function setupBrowserNotifications() {
|
||||
return dispatch => {
|
||||
|
|
|
@ -33,7 +33,7 @@ const unsubscribe = ({ registration, subscription }) =>
|
|||
subscription ? subscription.unsubscribe().then(() => registration) : registration;
|
||||
|
||||
const sendSubscriptionToBackend = (subscription) => {
|
||||
const params = { subscription };
|
||||
const params = { subscription: { ...subscription.toJSON(), standard: true } };
|
||||
|
||||
if (me) {
|
||||
const data = pushNotificationsSetting.get(me);
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
import { Iterable, fromJS } from 'immutable';
|
||||
import { fromJS, isIndexed } from 'immutable';
|
||||
|
||||
import { hydrateCompose } from './compose';
|
||||
import { importFetchedAccounts } from './importer';
|
||||
|
@ -10,7 +10,7 @@ export const STORE_HYDRATE_LAZY = 'STORE_HYDRATE_LAZY';
|
|||
|
||||
const convertState = rawState =>
|
||||
fromJS(rawState, (k, v) =>
|
||||
Iterable.isIndexed(v) ? v.toList() : v.toMap());
|
||||
isIndexed(v) ? v.toList() : v.toMap());
|
||||
|
||||
const applyMigrations = (state) => {
|
||||
return state.withMutations(state => {
|
||||
|
|
|
@ -19,7 +19,7 @@ export interface BaseApiAccountJSON {
|
|||
avatar_static: string;
|
||||
bot: boolean;
|
||||
created_at: string;
|
||||
discoverable: boolean;
|
||||
discoverable?: boolean;
|
||||
indexable: boolean;
|
||||
display_name: string;
|
||||
emojis: ApiCustomEmojiJSON[];
|
||||
|
|
|
@ -3,7 +3,7 @@ import ImmutablePropTypes from 'react-immutable-proptypes';
|
|||
import { Permalink } from 'flavours/glitch/components/permalink';
|
||||
|
||||
export const MentionsPlaceholder = ({ status }) => {
|
||||
if (status.get('spoiler_text').length === 0 || !status.get('mentions')) {
|
||||
if (status.get('spoiler_text').length === 0 || !status.get('mentions') || status.get('mentions').isEmpty()) {
|
||||
return null;
|
||||
}
|
||||
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
import { Component } from 'react';
|
||||
|
||||
import type { IntlShape } from 'react-intl';
|
||||
import type { MessageDescriptor, PrimitiveType, IntlShape } from 'react-intl';
|
||||
import { injectIntl, defineMessages } from 'react-intl';
|
||||
|
||||
const messages = defineMessages({
|
||||
|
@ -102,7 +102,13 @@ const getUnitDelay = (units: string) => {
|
|||
};
|
||||
|
||||
export const timeAgoString = (
|
||||
intl: Pick<IntlShape, 'formatDate' | 'formatMessage'>,
|
||||
intl: {
|
||||
formatDate: IntlShape['formatDate'];
|
||||
formatMessage: (
|
||||
{ id, defaultMessage }: MessageDescriptor,
|
||||
values?: Record<string, PrimitiveType>,
|
||||
) => string;
|
||||
},
|
||||
date: Date,
|
||||
now: number,
|
||||
year: number,
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
import { Provider } from 'react-redux';
|
||||
|
||||
import { fetchCustomEmojis } from 'flavours/glitch/actions/custom_emojis';
|
||||
import { fetchServer } from 'flavours/glitch/actions/server';
|
||||
import { hydrateStore } from 'flavours/glitch/actions/store';
|
||||
import { Router } from 'flavours/glitch/components/router';
|
||||
import Compose from 'flavours/glitch/features/standalone/compose';
|
||||
|
@ -13,6 +14,7 @@ if (initialState) {
|
|||
}
|
||||
|
||||
store.dispatch(fetchCustomEmojis());
|
||||
store.dispatch(fetchServer());
|
||||
|
||||
const ComposeContainer = () => (
|
||||
<IntlProvider>
|
||||
|
|
|
@ -119,7 +119,11 @@ function loaded() {
|
|||
formattedContent = dateFormat.format(datetime);
|
||||
}
|
||||
|
||||
content.title = formattedContent;
|
||||
const timeGiven = content.dateTime.includes('T');
|
||||
content.title = timeGiven
|
||||
? dateTimeFormat.format(datetime)
|
||||
: dateFormat.format(datetime);
|
||||
|
||||
content.textContent = formattedContent;
|
||||
});
|
||||
|
||||
|
|
|
@ -177,11 +177,6 @@ export const Conversation = ({ conversation, scrollKey, onMoveUp, onMoveDown })
|
|||
toggleHidden: handleShowMore,
|
||||
};
|
||||
|
||||
let media = null;
|
||||
if (lastStatus.get('media_attachments').size > 0) {
|
||||
media = <AttachmentList compact media={lastStatus.get('media_attachments')} />;
|
||||
}
|
||||
|
||||
return (
|
||||
<HotKeys handlers={handlers}>
|
||||
<div className={classNames('conversation focusable muted', { unread })} tabIndex={0}>
|
||||
|
@ -206,9 +201,15 @@ export const Conversation = ({ conversation, scrollKey, onMoveUp, onMoveDown })
|
|||
expanded={sharedCWState ? lastStatus.get('hidden') : expanded}
|
||||
onExpandedToggle={handleShowMore}
|
||||
collapsible
|
||||
media={media}
|
||||
/>
|
||||
|
||||
{lastStatus.get('media_attachments').size > 0 && (
|
||||
<AttachmentList
|
||||
compact
|
||||
media={lastStatus.get('media_attachments')}
|
||||
/>
|
||||
)}
|
||||
|
||||
<div className='status__action-bar'>
|
||||
<IconButton className='status__action-bar-button' title={intl.formatMessage(messages.reply)} icon='reply' iconComponent={ReplyIcon} onClick={handleReply} />
|
||||
|
||||
|
|
|
@ -3,10 +3,10 @@ import { defineMessages, injectIntl } from 'react-intl';
|
|||
import { connect } from 'react-redux';
|
||||
|
||||
import { openModal } from 'flavours/glitch/actions/modal';
|
||||
import { fetchNotifications } from 'flavours/glitch/actions/notification_groups';
|
||||
import { fetchNotifications , setNotificationsFilter } from 'flavours/glitch/actions/notification_groups';
|
||||
|
||||
import { showAlert } from '../../../actions/alerts';
|
||||
import { setFilter, requestBrowserPermission } from '../../../actions/notifications';
|
||||
import { requestBrowserPermission } from '../../../actions/notifications';
|
||||
import { changeAlerts as changePushNotifications } from '../../../actions/push_notifications';
|
||||
import { changeSetting } from '../../../actions/settings';
|
||||
import ColumnSettings from '../components/column_settings';
|
||||
|
@ -43,7 +43,7 @@ const mapDispatchToProps = (dispatch) => ({
|
|||
}
|
||||
} else if (path[0] === 'quickFilter') {
|
||||
dispatch(changeSetting(['notifications', ...path], checked));
|
||||
dispatch(setFilter('all'));
|
||||
dispatch(setNotificationsFilter('all'));
|
||||
} else if (path[0] === 'alerts' && checked && typeof window.Notification !== 'undefined' && Notification.permission !== 'granted') {
|
||||
if (checked && typeof window.Notification !== 'undefined' && Notification.permission !== 'granted') {
|
||||
dispatch(requestBrowserPermission((permission) => {
|
||||
|
|
|
@ -12,6 +12,7 @@ import AddPhotoAlternateIcon from '@/material-icons/400-24px/add_photo_alternate
|
|||
import EditIcon from '@/material-icons/400-24px/edit.svg?react';
|
||||
import PersonIcon from '@/material-icons/400-24px/person.svg?react';
|
||||
import { updateAccount } from 'flavours/glitch/actions/accounts';
|
||||
import { closeOnboarding } from 'flavours/glitch/actions/onboarding';
|
||||
import { Button } from 'flavours/glitch/components/button';
|
||||
import { Column } from 'flavours/glitch/components/column';
|
||||
import { ColumnHeader } from 'flavours/glitch/components/column_header';
|
||||
|
@ -58,7 +59,9 @@ export const Profile: React.FC<{
|
|||
);
|
||||
const [avatar, setAvatar] = useState<File>();
|
||||
const [header, setHeader] = useState<File>();
|
||||
const [discoverable, setDiscoverable] = useState(true);
|
||||
const [discoverable, setDiscoverable] = useState(
|
||||
account?.discoverable ?? true,
|
||||
);
|
||||
const [isSaving, setIsSaving] = useState(false);
|
||||
const [errors, setErrors] = useState<ApiAccountErrors>();
|
||||
const avatarFileRef = createRef<HTMLInputElement>();
|
||||
|
@ -132,6 +135,7 @@ export const Profile: React.FC<{
|
|||
)
|
||||
.then(() => {
|
||||
history.push('/start/follows');
|
||||
dispatch(closeOnboarding());
|
||||
return '';
|
||||
})
|
||||
// eslint-disable-next-line @typescript-eslint/use-unknown-in-catch-callback-variable
|
||||
|
|
|
@ -46,7 +46,8 @@ class StatusCheckBox extends PureComponent {
|
|||
</div>
|
||||
</div>
|
||||
|
||||
<StatusContent status={status} media={<MediaAttachments status={status} visible={false} />} />
|
||||
<StatusContent status={status} />
|
||||
<MediaAttachments status={status} visible={false} />
|
||||
</div>
|
||||
);
|
||||
|
||||
|
|
|
@ -100,6 +100,7 @@ const mapStateToProps = state => ({
|
|||
hicolorPrivacyIcons: state.getIn(['local_settings', 'hicolor_privacy_icons']),
|
||||
moved: state.getIn(['accounts', me, 'moved']) && state.getIn(['accounts', state.getIn(['accounts', me, 'moved'])]),
|
||||
firstLaunch: state.getIn(['settings', 'introductionVersion'], 0) < INTRODUCTION_VERSION,
|
||||
newAccount: !state.getIn(['accounts', me, 'note']) && !state.getIn(['accounts', me, 'bot']) && state.getIn(['accounts', me, 'following_count'], 0) === 0 && state.getIn(['accounts', me, 'statuses_count'], 0) === 0,
|
||||
username: state.getIn(['accounts', me, 'username']),
|
||||
});
|
||||
|
||||
|
@ -144,6 +145,7 @@ class SwitchingColumnsArea extends PureComponent {
|
|||
children: PropTypes.node,
|
||||
location: PropTypes.object,
|
||||
singleColumn: PropTypes.bool,
|
||||
forceOnboarding: PropTypes.bool,
|
||||
};
|
||||
|
||||
UNSAFE_componentWillMount () {
|
||||
|
@ -174,14 +176,16 @@ class SwitchingColumnsArea extends PureComponent {
|
|||
};
|
||||
|
||||
render () {
|
||||
const { children, singleColumn } = this.props;
|
||||
const { children, singleColumn, forceOnboarding } = this.props;
|
||||
const { signedIn } = this.props.identity;
|
||||
const pathName = this.props.location.pathname;
|
||||
|
||||
let redirect;
|
||||
|
||||
if (signedIn) {
|
||||
if (singleColumn) {
|
||||
if (forceOnboarding) {
|
||||
redirect = <Redirect from='/' to='/start' exact />;
|
||||
} else if (singleColumn) {
|
||||
redirect = <Redirect from='/' to='/home' exact />;
|
||||
} else {
|
||||
redirect = <Redirect from='/' to='/deck/getting-started' exact />;
|
||||
|
@ -292,6 +296,7 @@ class UI extends PureComponent {
|
|||
moved: PropTypes.map,
|
||||
layout: PropTypes.string.isRequired,
|
||||
firstLaunch: PropTypes.bool,
|
||||
newAccount: PropTypes.bool,
|
||||
username: PropTypes.string,
|
||||
...WithRouterPropTypes,
|
||||
};
|
||||
|
@ -615,7 +620,7 @@ class UI extends PureComponent {
|
|||
|
||||
render () {
|
||||
const { draggingOver } = this.state;
|
||||
const { children, isWide, location, layout, moved } = this.props;
|
||||
const { children, isWide, location, layout, moved, firstLaunch, newAccount } = this.props;
|
||||
|
||||
const className = classNames('ui', {
|
||||
'wide': isWide,
|
||||
|
@ -662,7 +667,7 @@ class UI extends PureComponent {
|
|||
|
||||
<Header />
|
||||
|
||||
<SwitchingColumnsArea identity={this.props.identity} location={location} singleColumn={layout === 'mobile' || layout === 'single-column'}>
|
||||
<SwitchingColumnsArea identity={this.props.identity} location={location} singleColumn={layout === 'mobile' || layout === 'single-column'} forceOnboarding={firstLaunch && newAccount}>
|
||||
{children}
|
||||
</SwitchingColumnsArea>
|
||||
|
||||
|
|
|
@ -41,13 +41,6 @@
|
|||
"navigation_bar.app_settings": "إعدادات التطبيق",
|
||||
"navigation_bar.keyboard_shortcuts": "اختصارات لوحة المفاتيح",
|
||||
"navigation_bar.misc": "متنوع",
|
||||
"notification.markForDeletion": "وضع علامة للحذف",
|
||||
"notification_purge.btn_all": "تحديد الكل",
|
||||
"notification_purge.btn_apply": "مسح المحدد",
|
||||
"notification_purge.btn_invert": "عكس التحديد",
|
||||
"notification_purge.btn_none": "إزالة التحديد",
|
||||
"notifications.marked_clear": "مسح الإشعارات المحددة",
|
||||
"notifications.marked_clear_confirmation": "هل أنت متأكد من أنك تريد مسح جميع الإشعارات المحددة نهائياً؟",
|
||||
"settings.always_show_spoilers_field": "تمكين دائما حقل تحذير المحتوى",
|
||||
"settings.close": "إغلاق",
|
||||
"settings.content_warnings": "Content warnings",
|
||||
|
|
|
@ -13,13 +13,6 @@
|
|||
"navigation_bar.app_settings": "Nastavení aplikace",
|
||||
"navigation_bar.keyboard_shortcuts": "Klávesové zkratky",
|
||||
"navigation_bar.misc": "Různé",
|
||||
"notification.markForDeletion": "Označit pro smazání",
|
||||
"notification_purge.btn_all": "Vybrat\nvše",
|
||||
"notification_purge.btn_apply": "Smazat\nvybrané",
|
||||
"notification_purge.btn_invert": "Obrátit\nvýběr",
|
||||
"notification_purge.btn_none": "Nevybrat\nnic",
|
||||
"notifications.marked_clear": "Smazat vybraná oznámení",
|
||||
"notifications.marked_clear_confirmation": "Určitě chcete trvale smazat všechna vybraná oznámení?",
|
||||
"settings.always_show_spoilers_field": "Vždy zobrazit pole pro varování o obsahu",
|
||||
"settings.close": "Zavřít",
|
||||
"settings.compose_box_opts": "Editační pole",
|
||||
|
@ -29,8 +22,6 @@
|
|||
"settings.content_warnings": "Varování o obsahu",
|
||||
"settings.content_warnings.regexp": "Regulární výraz",
|
||||
"settings.content_warnings_filter": "Tato varování o obsahu automaticky nerozbalovat:",
|
||||
"settings.content_warnings_media_outside": "Zobrazit obrázky a videa mimo varování o obsahu",
|
||||
"settings.content_warnings_media_outside_hint": "Obrázky a videa z příspěvku s varováním o obsahu se zobrazí se separátním přepínačem zobrazení, stejně jako na běžném Mastodonu.",
|
||||
"settings.content_warnings_shared_state": "Zobrazit/schovat všechny kopie naráz",
|
||||
"settings.content_warnings_shared_state_hint": "Tlačítko varování o obsahu bude mít efekt na všechny kopie příspěvku naráz, stejně jako na běžném Mastodonu. Nebude pak možné automaticky sbalit jakoukoliv kopii příspěvku, která má rozbalené varování o obsahu",
|
||||
"settings.content_warnings_unfold_opts": "Možnosti automatického rozbalení",
|
||||
|
|
|
@ -51,14 +51,7 @@
|
|||
"navigation_bar.app_settings": "App-Einstellungen",
|
||||
"navigation_bar.keyboard_shortcuts": "Tastaturkürzel",
|
||||
"navigation_bar.misc": "Sonstiges",
|
||||
"notification.markForDeletion": "Zum Entfernen auswählen",
|
||||
"notification_purge.btn_all": "Alle\nauswählen",
|
||||
"notification_purge.btn_apply": "Ausgewählte\nentfernen",
|
||||
"notification_purge.btn_invert": "Auswahl\numkehren",
|
||||
"notification_purge.btn_none": "Auswahl\naufheben",
|
||||
"notifications.column_settings.filter_bar.show_bar": "Filterleiste anzeigen",
|
||||
"notifications.marked_clear": "Ausgewählte Benachrichtigungen entfernen",
|
||||
"notifications.marked_clear_confirmation": "Möchtest du wirklich alle auswählten Benachrichtigungen für immer entfernen?",
|
||||
"settings.always_show_spoilers_field": "Das Inhaltswarnungs-Feld immer aktivieren",
|
||||
"settings.close": "Schließen",
|
||||
"settings.compose_box_opts": "Verfassen-Box",
|
||||
|
@ -68,8 +61,6 @@
|
|||
"settings.content_warnings": "Content warnings",
|
||||
"settings.content_warnings.regexp": "Regulärer Ausdruck",
|
||||
"settings.content_warnings_filter": "Inhaltswarnungen, die nicht ausgeklappt werden sollen:",
|
||||
"settings.content_warnings_media_outside": "Medienanhänge außerhalb von Inhaltswarnungen anzeigen",
|
||||
"settings.content_warnings_media_outside_hint": "Das ursprüngliche Verhalten von Mastodon wiederherstellen, in welchem Inhaltswarnungen keine Auswirkungen auf Anhänge haben",
|
||||
"settings.content_warnings_shared_state": "Inhalt aller Kopien auf einmal ein-/ausblenden",
|
||||
"settings.content_warnings_shared_state_hint": "Das ursprüngliche Verhalten von Mastodon wiederhertstellen, in welchem der Inhaltswarnungs-Knopf alle Kopien eines Posts auf einmal ein-/ausklappt. Das wird das automatische Einklappen jedweder Kopie eines Toots mit ausgeklappter Inhaltswarnung",
|
||||
"settings.content_warnings_unfold_opts": "Optionen zum automatischen Ausklappen",
|
||||
|
|
|
@ -51,14 +51,7 @@
|
|||
"navigation_bar.app_settings": "Agordoj de aplikaĵo",
|
||||
"navigation_bar.keyboard_shortcuts": "Fulmoklavoj",
|
||||
"navigation_bar.misc": "Aliaj",
|
||||
"notification.markForDeletion": "Sigeli por forigi",
|
||||
"notification_purge.btn_all": "Selekti ĉiujn",
|
||||
"notification_purge.btn_apply": "Forigi selektajn",
|
||||
"notification_purge.btn_invert": "Inverti selekton",
|
||||
"notification_purge.btn_none": "Elekti neniun",
|
||||
"notifications.column_settings.filter_bar.show_bar": "Montri mezuron de filtrilo",
|
||||
"notifications.marked_clear": "Forigi selektajn sciigojn",
|
||||
"notifications.marked_clear_confirmation": "Ĉu vi certas, ke vi volas forigi tutajn selektitajn sciigojn?",
|
||||
"settings.always_show_spoilers_field": "Ĉiam ŝaltiĝu la arealo de Enhava Averto",
|
||||
"settings.close": "Fermi",
|
||||
"settings.compose_box_opts": "Skatolo por verki",
|
||||
|
@ -68,8 +61,6 @@
|
|||
"settings.content_warnings": "Enhavaj avertoj",
|
||||
"settings.content_warnings.regexp": "Regula esprimo",
|
||||
"settings.content_warnings_filter": "Enhavaj avertoj, kiujn ne aŭtomate malkaŝu:",
|
||||
"settings.content_warnings_media_outside": "Montri plurmediojn ekstere de enhavaj avertoj",
|
||||
"settings.content_warnings_media_outside_hint": "Fari same, kiel la originala programaro Mastodon, por ke la enhavaj avertoj ne influas plurmediojn",
|
||||
"settings.content_warnings_shared_state": "Montri/Malmontri enhavon de kopiaĵoj tuje",
|
||||
"settings.content_warnings_shared_state_hint": "Redonu normalan kondukton de Mastodon per havante la butonon por la Averto por la Enhavo rezultas tutajn kopiaĵojn tuje. Tion preventos aŭtomatan kolapsadon de kopiiaĵo de afiŝo ajn, kiu havus malkolapsan EA-on",
|
||||
"settings.content_warnings_unfold_opts": "Aŭtomat-malkolapsintaj agordoj",
|
||||
|
|
|
@ -51,14 +51,7 @@
|
|||
"navigation_bar.app_settings": "Ajustes de aplicación",
|
||||
"navigation_bar.keyboard_shortcuts": "Atajos de teclado",
|
||||
"navigation_bar.misc": "Misc",
|
||||
"notification.markForDeletion": "Marcar para borrar",
|
||||
"notification_purge.btn_all": "Seleccionar\ntodo",
|
||||
"notification_purge.btn_apply": "Borrar\nselección",
|
||||
"notification_purge.btn_invert": "Invertir\nselección",
|
||||
"notification_purge.btn_none": "Seleccionar\nnada",
|
||||
"notifications.column_settings.filter_bar.show_bar": "Mostrar barra de filtros",
|
||||
"notifications.marked_clear": "Limpiar notificaciones seleccionadas",
|
||||
"notifications.marked_clear_confirmation": "¿Deseas borrar permanentemente todas las notificaciones seleccionadas?",
|
||||
"settings.always_show_spoilers_field": "Siempre mostrar el campo de advertencia de contenido",
|
||||
"settings.close": "Cerrar",
|
||||
"settings.compose_box_opts": "Cuadro de redacción",
|
||||
|
@ -68,8 +61,6 @@
|
|||
"settings.content_warnings": "Content warnings",
|
||||
"settings.content_warnings.regexp": "Regexp (expresión regular)",
|
||||
"settings.content_warnings_filter": "No descolapsar estas advertencias de contenido:",
|
||||
"settings.content_warnings_media_outside": "Mostrar archivos adjuntos fuera de las advertencias de contenido",
|
||||
"settings.content_warnings_media_outside_hint": "Reproduce el comportamiento normal de Mastodon teniendo al tener el interruptor de advertencia de contenido activado, no afectando los archivos adjuntos",
|
||||
"settings.content_warnings_shared_state": "Mostrar/ocultar el contenido de todas las copias a la vez",
|
||||
"settings.content_warnings_shared_state_hint": "Reproduce el comportamiento normal de Mastodon al hacer que el botón Advertencia de contenido afecte a todas las copias de un mensaje a la vez. Esto evitará el colapso automático de cualquier copia de un toot con CW desplegado",
|
||||
"settings.content_warnings_unfold_opts": "Opciones de Auto-desplegado",
|
||||
|
|
|
@ -47,13 +47,6 @@
|
|||
"navigation_bar.app_settings": "Ajustes de aplicación",
|
||||
"navigation_bar.keyboard_shortcuts": "Atajos de teclado",
|
||||
"navigation_bar.misc": "Misc",
|
||||
"notification.markForDeletion": "Marcar para borrar",
|
||||
"notification_purge.btn_all": "Seleccionar\ntodo",
|
||||
"notification_purge.btn_apply": "Borrar\nselección",
|
||||
"notification_purge.btn_invert": "Invertir\nselección",
|
||||
"notification_purge.btn_none": "Seleccionar\nnada",
|
||||
"notifications.marked_clear": "Limpiar notificaciones seleccionadas",
|
||||
"notifications.marked_clear_confirmation": "¿Deseas borrar permanentemente todas las notificaciones seleccionadas?",
|
||||
"settings.always_show_spoilers_field": "Siempre mostrar el campo de advertencia de contenido",
|
||||
"settings.close": "Cerrar",
|
||||
"settings.compose_box_opts": "Cuadro de redacción",
|
||||
|
@ -63,8 +56,6 @@
|
|||
"settings.content_warnings": "Content warnings",
|
||||
"settings.content_warnings.regexp": "Regexp (expresión regular)",
|
||||
"settings.content_warnings_filter": "No descolapsar estas advertencias de contenido:",
|
||||
"settings.content_warnings_media_outside": "Mostrar archivos adjuntos fuera de las advertencias de contenido",
|
||||
"settings.content_warnings_media_outside_hint": "Reproduce el comportamiento normal de Mastodon teniendo al tener el interruptor de advertencia de contenido activado, no afectando los archivos adjuntos",
|
||||
"settings.content_warnings_shared_state": "Mostrar/ocultar el contenido de todas las copias a la vez",
|
||||
"settings.content_warnings_shared_state_hint": "Reproduce el comportamiento normal de Mastodon al hacer que el botón Advertencia de contenido afecte a todas las copias de un mensaje a la vez. Esto evitará el colapso automático de cualquier copia de un toot con CW desplegado",
|
||||
"settings.content_warnings_unfold_opts": "Opciones de Auto-desplegado",
|
||||
|
|
|
@ -47,13 +47,6 @@
|
|||
"navigation_bar.app_settings": "Ajustes de la aplicación",
|
||||
"navigation_bar.keyboard_shortcuts": "Atajos de teclado",
|
||||
"navigation_bar.misc": "Misc",
|
||||
"notification.markForDeletion": "Marcar para borrado",
|
||||
"notification_purge.btn_all": "Seleccionar\ntodo",
|
||||
"notification_purge.btn_apply": "Borrar\nselección",
|
||||
"notification_purge.btn_invert": "Invertir\nselección",
|
||||
"notification_purge.btn_none": "Seleccionar\nninguno",
|
||||
"notifications.marked_clear": "Limpiar las notificaciones seleccionadas",
|
||||
"notifications.marked_clear_confirmation": "¿Estás seguro de borrar permanentemente todas las notificaciones seleccionadas?",
|
||||
"settings.always_show_spoilers_field": "Siempre mostrar el campo de advertencia de contenido",
|
||||
"settings.close": "Cerrar",
|
||||
"settings.compose_box_opts": "Cuadro de redacción",
|
||||
|
@ -63,8 +56,6 @@
|
|||
"settings.content_warnings": "Advertencias de contenido",
|
||||
"settings.content_warnings.regexp": "Regexp (expresión regular)",
|
||||
"settings.content_warnings_filter": "No descolapsar estas advertencias de contenido:",
|
||||
"settings.content_warnings_media_outside": "Mostrar archivos adjuntos fuera de las advertencias de contenido",
|
||||
"settings.content_warnings_media_outside_hint": "Reproduce el comportamiento normal de Mastodon teniendo al tener el interruptor de advertencia de contenido activado, no afectando los archivos adjuntos",
|
||||
"settings.content_warnings_shared_state": "Mostrar/ocultar el contenido de todas las copias a la vez",
|
||||
"settings.content_warnings_shared_state_hint": "Reproduce el comportamiento normal de Mastodon al hacer que el botón Advertencia de contenido afecte a todas las copias de un mensaje a la vez. Esto evitará el colapso automático de cualquier copia de un toot con CW desplegado",
|
||||
"settings.content_warnings_unfold_opts": "Opciones de Auto-desplegado",
|
||||
|
|
|
@ -10,8 +10,6 @@
|
|||
"home.column_settings.advanced": "پیشرفته",
|
||||
"navigation_bar.app_settings": "تنظیمات کاره",
|
||||
"navigation_bar.keyboard_shortcuts": "میانبرهای صفحهکلید",
|
||||
"notification.markForDeletion": "علامتگذاری برای حذف",
|
||||
"notification_purge.btn_all": "انتخاب همه",
|
||||
"settings.close": "بستن",
|
||||
"settings.content_warnings": "هشدارهای محتوا",
|
||||
"settings.media": "رسانه",
|
||||
|
|
|
@ -47,13 +47,6 @@
|
|||
"navigation_bar.app_settings": "Paramètres de l'application",
|
||||
"navigation_bar.keyboard_shortcuts": "Raccourcis clavier",
|
||||
"navigation_bar.misc": "Autres",
|
||||
"notification.markForDeletion": "Ajouter aux éléments à supprimer",
|
||||
"notification_purge.btn_all": "Sélectionner\ntout",
|
||||
"notification_purge.btn_apply": "Effacer\nla sélection",
|
||||
"notification_purge.btn_invert": "Inverser\nla sélection",
|
||||
"notification_purge.btn_none": "Annuler\nla sélection",
|
||||
"notifications.marked_clear": "Effacer les notifications sélectionnées",
|
||||
"notifications.marked_clear_confirmation": "Voulez-vous vraiment effacer de manière permanente toutes les notifications sélectionnées ?",
|
||||
"settings.always_show_spoilers_field": "Toujours activer le champ de rédaction de l'avertissement de contenu",
|
||||
"settings.close": "Fermer",
|
||||
"settings.compose_box_opts": "Zone de rédaction",
|
||||
|
@ -63,8 +56,6 @@
|
|||
"settings.content_warnings": "Content warnings",
|
||||
"settings.content_warnings.regexp": "Expression rationnelle",
|
||||
"settings.content_warnings_filter": "Avertissement de contenu à ne pas automatiquement déplier :",
|
||||
"settings.content_warnings_media_outside": "Afficher les médias en dehors des avertissements de contenu",
|
||||
"settings.content_warnings_media_outside_hint": "Reproduit le comportement par défaut de Mastodon, les médias attachés ne sont plus affectés par le bouton d'affichage d'un post avec avertissement",
|
||||
"settings.content_warnings_shared_state": "Affiche/cache le contenu de toutes les copies à la fois",
|
||||
"settings.content_warnings_shared_state_hint": "Reproduit le comportement par défaut de Mastodon, le bouton d'avertissement de contenu affecte toutes les copies d'un post à la fois. Cela empêchera le repliement automatique de n'importe quelle copie d'un post avec un avertissement déplié",
|
||||
"settings.content_warnings_unfold_opts": "Options de dépliement automatique",
|
||||
|
|
|
@ -47,13 +47,6 @@
|
|||
"navigation_bar.app_settings": "Paramètres de l'application",
|
||||
"navigation_bar.keyboard_shortcuts": "Raccourcis clavier",
|
||||
"navigation_bar.misc": "Autres",
|
||||
"notification.markForDeletion": "Ajouter aux éléments à supprimer",
|
||||
"notification_purge.btn_all": "Sélectionner\ntout",
|
||||
"notification_purge.btn_apply": "Effacer\nla sélection",
|
||||
"notification_purge.btn_invert": "Inverser\nla sélection",
|
||||
"notification_purge.btn_none": "Annuler\nla sélection",
|
||||
"notifications.marked_clear": "Effacer les notifications sélectionnées",
|
||||
"notifications.marked_clear_confirmation": "Voulez-vous vraiment effacer de manière permanente toutes les notifications sélectionnées ?",
|
||||
"settings.always_show_spoilers_field": "Toujours activer le champ de rédaction de l'avertissement de contenu",
|
||||
"settings.close": "Fermer",
|
||||
"settings.compose_box_opts": "Zone de rédaction",
|
||||
|
@ -63,8 +56,6 @@
|
|||
"settings.content_warnings": "Content warnings",
|
||||
"settings.content_warnings.regexp": "Expression rationnelle",
|
||||
"settings.content_warnings_filter": "Avertissement de contenu à ne pas automatiquement déplier :",
|
||||
"settings.content_warnings_media_outside": "Afficher les médias en dehors des avertissements de contenu",
|
||||
"settings.content_warnings_media_outside_hint": "Reproduit le comportement par défaut de Mastodon, les médias attachés ne sont plus affectés par le bouton d'affichage d'un post avec avertissement",
|
||||
"settings.content_warnings_shared_state": "Affiche/cache le contenu de toutes les copies à la fois",
|
||||
"settings.content_warnings_shared_state_hint": "Reproduit le comportement par défaut de Mastodon, le bouton d'avertissement de contenu affecte toutes les copies d'un post à la fois. Cela empêchera le repliement automatique de n'importe quelle copie d'un post avec un avertissement déplié",
|
||||
"settings.content_warnings_unfold_opts": "Options de dépliement automatique",
|
||||
|
|
|
@ -43,13 +43,6 @@
|
|||
"navigation_bar.app_settings": "Pengaturan aplikasi",
|
||||
"navigation_bar.keyboard_shortcuts": "Pintasan keyboard",
|
||||
"navigation_bar.misc": "Lainnya",
|
||||
"notification.markForDeletion": "Tandai untuk dihapus",
|
||||
"notification_purge.btn_all": "Pilih semua",
|
||||
"notification_purge.btn_apply": "Hapus yang\ndipilih",
|
||||
"notification_purge.btn_invert": "Balikkan\npilihan",
|
||||
"notification_purge.btn_none": "Pilih tidak\nsatu pun",
|
||||
"notifications.marked_clear": "Hapus notifikasi yang dipilih",
|
||||
"notifications.marked_clear_confirmation": "Apakah Anda yakin ingin menghapus secara permanen semua notifikasi yang dipilih?",
|
||||
"settings.always_show_spoilers_field": "Selalu aktifkan bidang Peringatan Konten",
|
||||
"settings.close": "Tutup",
|
||||
"settings.compose_box_opts": "Kotak tulis",
|
||||
|
@ -59,8 +52,6 @@
|
|||
"settings.content_warnings": "Content warnings",
|
||||
"settings.content_warnings.regexp": "Ekspresi reguler",
|
||||
"settings.content_warnings_filter": "Peringatan konten yang tidak akan dibuka secara otomatis:",
|
||||
"settings.content_warnings_media_outside": "Tampilkan lampiran media di luar peringatan konten",
|
||||
"settings.content_warnings_media_outside_hint": "Reproduksi perilaku Mastodon upstream dengan membuat tombol Peringatan Konten tidak memengaruhi lampiran media",
|
||||
"settings.content_warnings_shared_state": "Tampilkan/sembunyikan konten semua salinan sekaligus",
|
||||
"settings.preferences": "Preferences",
|
||||
"settings.status_icons_reply": "Indikator balasan",
|
||||
|
|
|
@ -39,13 +39,6 @@
|
|||
"navigation_bar.app_settings": "アプリ設定",
|
||||
"navigation_bar.keyboard_shortcuts": "キーボードショートカット",
|
||||
"navigation_bar.misc": "その他",
|
||||
"notification.markForDeletion": "選択",
|
||||
"notification_purge.btn_all": "すべて\n選択",
|
||||
"notification_purge.btn_apply": "選択したものを\n削除",
|
||||
"notification_purge.btn_invert": "選択を\n反転",
|
||||
"notification_purge.btn_none": "選択\n解除",
|
||||
"notifications.marked_clear": "選択した通知を削除する",
|
||||
"notifications.marked_clear_confirmation": "削除した全ての通知を完全に削除してもよろしいですか?",
|
||||
"settings.always_show_spoilers_field": "常にコンテンツワーニング設定を表示する(指定がない場合は通常投稿)",
|
||||
"settings.close": "閉じる",
|
||||
"settings.compose_box_opts": "コンポーズボックス設定",
|
||||
|
@ -55,7 +48,6 @@
|
|||
"settings.content_warnings": "コンテンツワーニング",
|
||||
"settings.content_warnings.regexp": "正規表現",
|
||||
"settings.content_warnings_filter": "説明に指定した文字が含まれているものを自動で展開しないようにする",
|
||||
"settings.content_warnings_media_outside": "コンテンツワーニングの外側にメディア添付ファイルを表示する",
|
||||
"settings.content_warnings_shared_state": "すべてのコピーの内容を一度に表示/非表示",
|
||||
"settings.content_warnings_unfold_opts": "自動展開オプション",
|
||||
"settings.enable_content_warnings_auto_unfold": "コンテンツワーニング指定されている投稿を常に表示する",
|
||||
|
|
|
@ -51,14 +51,7 @@
|
|||
"navigation_bar.app_settings": "앱 설정",
|
||||
"navigation_bar.keyboard_shortcuts": "키보드 단축기",
|
||||
"navigation_bar.misc": "다양한 옵션들",
|
||||
"notification.markForDeletion": "삭제하기 위해 표시",
|
||||
"notification_purge.btn_all": "전체선택",
|
||||
"notification_purge.btn_apply": "선택된 알림 삭제",
|
||||
"notification_purge.btn_invert": "선택반전",
|
||||
"notification_purge.btn_none": "전체선택해제",
|
||||
"notifications.column_settings.filter_bar.show_bar": "필터 막대 표시",
|
||||
"notifications.marked_clear": "선택된 알림 모두 삭제",
|
||||
"notifications.marked_clear_confirmation": "정말로 선택된 알림들을 영구적으로 삭제할까요?",
|
||||
"settings.always_show_spoilers_field": "열람주의 항목을 언제나 활성화",
|
||||
"settings.close": "닫기",
|
||||
"settings.compose_box_opts": "작성 상자",
|
||||
|
@ -68,8 +61,6 @@
|
|||
"settings.content_warnings": "열람주의",
|
||||
"settings.content_warnings.regexp": "정규표현식",
|
||||
"settings.content_warnings_filter": "자동으로 펼치지 않을 열람주의 문구:",
|
||||
"settings.content_warnings_media_outside": "미디어 첨부를 열람주의 바깥에 보이기",
|
||||
"settings.content_warnings_media_outside_hint": "마스토돈 원본처럼 열람주의 토글이 미디어 첨부에는 영향을 미치지 않게 합니다",
|
||||
"settings.content_warnings_shared_state": "동일한 글의 열람주의를 한번에 열고 닫기",
|
||||
"settings.content_warnings_shared_state_hint": "마스토돈 원본처럼 열람주의 버튼이 동일한 모든 글에 대해 영향을 미치게 합니다. 펼쳐진 열람주의 글이 자동으로 다시 접히는 것을 방지합니다",
|
||||
"settings.content_warnings_unfold_opts": "자동 펼치기 옵션",
|
||||
|
|
|
@ -20,10 +20,6 @@
|
|||
"confirmations.missing_media_description.message": "Minstens één media-bijlage mist een beschrijving. Overweeg om alle mediabijlagen voor slechtzienden te beschrijven voordat u uw toot verstuurt.",
|
||||
"direct.group_by_conversations": "Groeperen op gesprek",
|
||||
"home.column_settings.advanced": "Geavanceerd",
|
||||
"notification_purge.btn_all": "Alles selecteren",
|
||||
"notification_purge.btn_invert": "Selectie omkeren",
|
||||
"notifications.marked_clear": "Wis geselecteerde meldingen",
|
||||
"notifications.marked_clear_confirmation": "Weet je zeker dat je alle geselecteerde meldingen permanent wilt wissen?",
|
||||
"settings.close": "Sluiten",
|
||||
"settings.content_warnings": "Content warnings",
|
||||
"settings.general": "Algemeen",
|
||||
|
|
|
@ -33,13 +33,6 @@
|
|||
"navigation_bar.app_settings": "Ustawienia aplikacji",
|
||||
"navigation_bar.keyboard_shortcuts": "Skróty klawiszowe",
|
||||
"navigation_bar.misc": "Różne",
|
||||
"notification.markForDeletion": "Oznacz do usunięcia",
|
||||
"notification_purge.btn_all": "Zaznacz\nwszystkie",
|
||||
"notification_purge.btn_apply": "Usuń\nzaznaczone",
|
||||
"notification_purge.btn_invert": "Odwróć\nzaznaczenie",
|
||||
"notification_purge.btn_none": "Odznacz\nwszystkie",
|
||||
"notifications.marked_clear": "Usuń zaznaczone powiadomienia",
|
||||
"notifications.marked_clear_confirmation": "Czy na pewno chcesz bezpowrtonie usunąć wszystkie powiadomienia?",
|
||||
"settings.always_show_spoilers_field": "Zawsze pokazuj pole ostrzeżenia o zawartości",
|
||||
"settings.close": "Zamknij",
|
||||
"settings.compose_box_opts": "Pole edycji",
|
||||
|
@ -49,8 +42,6 @@
|
|||
"settings.content_warnings": "Content warnings",
|
||||
"settings.content_warnings.regexp": "Wyrażenie regularne",
|
||||
"settings.content_warnings_filter": "Ostrzeżenia o zawartości nieodkrywane automatycznie:",
|
||||
"settings.content_warnings_media_outside": "Wyświetlaj załączniki multimedialne poza ostrzeżeniem o zawartości",
|
||||
"settings.content_warnings_media_outside_hint": "Nie ukrywaj załączników multimedialnych, gdy wpis jest ukryty za ostrzeżeniem, tak jak robi to niezmodyfikowany Mastodon",
|
||||
"settings.content_warnings_shared_state": "Pokaż/ukryj zawartość wszystkich kopii jednocześnie",
|
||||
"settings.content_warnings_shared_state_hint": "Zachowaj się tak, jak niezmodyfikowany Mastodon, tj. wymuś działanie przycisku ostrzeżenia o zawartości na wszystkie kopie danego wpisu. Włączenie tego ustawienia spowoduje wyłączenie automatycznego zwijania kopii wpisów z odkrytym ostrzeżeniem o zawartości.",
|
||||
"settings.content_warnings_unfold_opts": "Opcje automatycznego odkrywania",
|
||||
|
|
|
@ -33,13 +33,6 @@
|
|||
"navigation_bar.app_settings": "Configurações do aplicativo",
|
||||
"navigation_bar.keyboard_shortcuts": "Atalhos de teclado",
|
||||
"navigation_bar.misc": "Diversos",
|
||||
"notification.markForDeletion": "Marcar para exclusão",
|
||||
"notification_purge.btn_all": "Selecionar\ntudo",
|
||||
"notification_purge.btn_apply": "Limpar\nselecionados",
|
||||
"notification_purge.btn_invert": "Inverter\nseleção",
|
||||
"notification_purge.btn_none": "Selecionar\nnenhum",
|
||||
"notifications.marked_clear": "Limpar as notificações selecionadas",
|
||||
"notifications.marked_clear_confirmation": "Tem certeza que deseja limpar todas as notificações selecionadas permanentemente?",
|
||||
"settings.always_show_spoilers_field": "Sempre ativar o campo Aviso de Conteúdo",
|
||||
"settings.close": "Fechar",
|
||||
"settings.compose_box_opts": "Caixa de composição",
|
||||
|
@ -49,8 +42,6 @@
|
|||
"settings.content_warnings": "Aviso de Conteúdo",
|
||||
"settings.content_warnings.regexp": "Expressão regular",
|
||||
"settings.content_warnings_filter": "Avisos de conteúdo para não revelar automaticamente:",
|
||||
"settings.content_warnings_media_outside": "Exibir anexos de mídia fora avisos de conteúdo",
|
||||
"settings.content_warnings_media_outside_hint": "Reproduzir o comportamento do Mastodonte, fazendo com que a alternância do Aviso de Conteúdo não afete os anexos de mídia",
|
||||
"settings.content_warnings_shared_state": "Mostrar/ocultar o conteúdo de todas as cópias de uma só vez",
|
||||
"settings.content_warnings_shared_state_hint": "Reproduzir o comportamento do Mastodonte fazendo com que o botão de Aviso de Conteúdo afete todas as cópias de um post de uma só vez. Isto evitará o colapso automático de qualquer cópia de um toon com Aviso de Conteúdo revelado",
|
||||
"settings.content_warnings_unfold_opts": "Opções de auto-revelar",
|
||||
|
|
|
@ -8,13 +8,7 @@
|
|||
"column.favourited_by": "Adicionado aos favoritos de",
|
||||
"column.heading": "Diversos",
|
||||
"moved_to_warning": "Esta conta mudou-se para {moved_to_link} e, portanto, pode não aceitar novos seguidores.",
|
||||
"notification.markForDeletion": "Marcada para eliminação",
|
||||
"notification_purge.btn_all": "Seleccionar tudo",
|
||||
"notification_purge.btn_apply": "Limpar Selecionadas",
|
||||
"notification_purge.btn_none": "Desselecionar tudo",
|
||||
"notifications.column_settings.filter_bar.show_bar": "Mostrar barra de filtros",
|
||||
"notifications.marked_clear": "Limpar as notificações selecionadas",
|
||||
"notifications.marked_clear_confirmation": "Tem a certeza que deseja limpar todas as notificações selecionadas permanentemente?",
|
||||
"settings.always_show_spoilers_field": "Mostrar sempre o campo Aviso de Conteúdo",
|
||||
"settings.content_warnings": "Content warnings",
|
||||
"settings.layout_opts": "Disposição do conteúdo",
|
||||
|
|
|
@ -41,22 +41,13 @@
|
|||
"moved_to_warning": "Этот аккаунт переехал на {moved_to_link}, и скорее всего не принимает новых подписчиков.",
|
||||
"navigation_bar.app_settings": "Настройки приложения",
|
||||
"navigation_bar.keyboard_shortcuts": "Сочетания клавиш",
|
||||
"notification.markForDeletion": "Отметить для удаления",
|
||||
"notification_purge.btn_all": "Выбрать все",
|
||||
"notification_purge.btn_apply": "Удалить выбранное",
|
||||
"notification_purge.btn_invert": "Инвертировать выбор",
|
||||
"notification_purge.btn_none": "Отменить выбор",
|
||||
"notifications.column_settings.filter_bar.show_bar": "Показать панель фильтров",
|
||||
"notifications.marked_clear": "Удалить выбранные уведомления",
|
||||
"notifications.marked_clear_confirmation": "Вы уверены, что хотите безвозвратно удалить все выбранные уведомления?",
|
||||
"settings.always_show_spoilers_field": "Всегда ставить предупреждение о содержании",
|
||||
"settings.close": "Закрыть",
|
||||
"settings.compose_box_opts": "Форма постинга",
|
||||
"settings.content_warnings": "Content warnings",
|
||||
"settings.content_warnings.regexp": "Регулярное выражение",
|
||||
"settings.content_warnings_filter": "Предупреждения о содержании, к которым автоматическое разворачивание не применяется:",
|
||||
"settings.content_warnings_media_outside": "Показывать медиафайлы внизу под предупреждением о содержании",
|
||||
"settings.content_warnings_media_outside_hint": "Воспроизводить исходное поведение Mastodon, когда предупреждение о содержании сворачивает только текст поста",
|
||||
"settings.content_warnings_shared_state": "Показывать/скрывать содержимое всех копий вместе",
|
||||
"settings.content_warnings_shared_state_hint": "Воспроизводить исходное поведение Mastodon, когда раскрывание и закрывание предупреждения о содержимом охватывает все копии поста сразу. Это предотвращает автоматическое сворачивание копий поста с уже однажды раскрытым CW",
|
||||
"settings.content_warnings_unfold_opts": "Автоматическое раскрытие",
|
||||
|
|
|
@ -34,13 +34,6 @@
|
|||
"navigation_bar.app_settings": "Налаштування програми",
|
||||
"navigation_bar.keyboard_shortcuts": "Комбінації клавіш",
|
||||
"navigation_bar.misc": "Різне",
|
||||
"notification.markForDeletion": "Позначити для видалення",
|
||||
"notification_purge.btn_all": "Вибрати\nвсе",
|
||||
"notification_purge.btn_apply": "Очистити\nвибір",
|
||||
"notification_purge.btn_invert": "Інвертувати\nвибір",
|
||||
"notification_purge.btn_none": "Вибрати\nнічого",
|
||||
"notifications.marked_clear": "Очистити вибрані сповіщення",
|
||||
"notifications.marked_clear_confirmation": "Ви впевнені, що хочете незворотньо очистити всі вибрані сповіщення?",
|
||||
"settings.always_show_spoilers_field": "Завжди вмикати попередження про вміст",
|
||||
"settings.close": "Закрити",
|
||||
"settings.compose_box_opts": "Compose box",
|
||||
|
@ -50,8 +43,6 @@
|
|||
"settings.content_warnings": "Content warnings",
|
||||
"settings.content_warnings.regexp": "Регулярний вираз",
|
||||
"settings.content_warnings_filter": "Застереження щодо автоматичного розгортання вмісту:",
|
||||
"settings.content_warnings_media_outside": "Відображати вкладені медіафайли поза попередженнями про вміст",
|
||||
"settings.content_warnings_media_outside_hint": "Відтворити поведінку Mastodon перед початком роботи, встановивши перемикач попередження про вміст, щоб не впливати на вкладені файли мультимедіа",
|
||||
"settings.content_warnings_shared_state": "Показати/приховати вміст усіх копій одночасно",
|
||||
"settings.content_warnings_shared_state_hint": "Відтворити поведінку Mastodon, що передує, за допомогою кнопки попередження про вміст, яка впливає на всі копії допису одразу. Це запобігатиме автоматичному згортанню будь-якої копії допису з розгорнутим CW",
|
||||
"settings.content_warnings_unfold_opts": "Параметри автоматичного розгортання",
|
||||
|
|
|
@ -51,14 +51,7 @@
|
|||
"navigation_bar.app_settings": "应用设置",
|
||||
"navigation_bar.keyboard_shortcuts": "键盘快捷键",
|
||||
"navigation_bar.misc": "杂项",
|
||||
"notification.markForDeletion": "标记已删除",
|
||||
"notification_purge.btn_all": "全选",
|
||||
"notification_purge.btn_apply": "清除已选",
|
||||
"notification_purge.btn_invert": "反选",
|
||||
"notification_purge.btn_none": "取消全选",
|
||||
"notifications.column_settings.filter_bar.show_bar": "显示筛选栏",
|
||||
"notifications.marked_clear": "清除选择的通知",
|
||||
"notifications.marked_clear_confirmation": "你确定要永久清除所有选择的通知吗?",
|
||||
"settings.always_show_spoilers_field": "始终显示内容警告框",
|
||||
"settings.close": "关闭",
|
||||
"settings.compose_box_opts": "撰写框",
|
||||
|
@ -68,8 +61,6 @@
|
|||
"settings.content_warnings": "内容警告",
|
||||
"settings.content_warnings.regexp": "正则表达式",
|
||||
"settings.content_warnings_filter": "不会自动展开的内容警告:",
|
||||
"settings.content_warnings_media_outside": "在内容警告外显示媒体附件",
|
||||
"settings.content_warnings_media_outside_hint": "通过让内容警告开关不影响媒体附件来复制上游Mastodon行为",
|
||||
"settings.content_warnings_shared_state": "一次显示/隐藏所有副本的内容",
|
||||
"settings.content_warnings_shared_state_hint": "通过让内容警告按钮同时影响所有帖子的副本来重现上游Mastodon行为。这将防止任何展开内容警告的嘟文自动折叠。",
|
||||
"settings.content_warnings_unfold_opts": "自动展开设置项",
|
||||
|
|
|
@ -47,14 +47,7 @@
|
|||
"navigation_bar.app_settings": "應用程式設定",
|
||||
"navigation_bar.keyboard_shortcuts": "鍵盤快速鍵",
|
||||
"navigation_bar.misc": "雜項",
|
||||
"notification.markForDeletion": "標記刪除",
|
||||
"notification_purge.btn_all": "選取全部",
|
||||
"notification_purge.btn_apply": "清除所選項目",
|
||||
"notification_purge.btn_invert": "反向選擇",
|
||||
"notification_purge.btn_none": "取消選取",
|
||||
"notifications.column_settings.filter_bar.show_bar": "顯示過濾器",
|
||||
"notifications.marked_clear": "清除被選取的通知訊息",
|
||||
"notifications.marked_clear_confirmation": "您確定要永久清除所有被選取的通知訊息嗎?",
|
||||
"settings.always_show_spoilers_field": "永遠啟用內容警告欄位",
|
||||
"settings.close": "關閉",
|
||||
"settings.compose_box_opts": "貼文撰寫框",
|
||||
|
@ -64,8 +57,6 @@
|
|||
"settings.content_warnings": "內容警告",
|
||||
"settings.content_warnings.regexp": "正規表達式",
|
||||
"settings.content_warnings_filter": "不要自動展開內容警告:",
|
||||
"settings.content_warnings_media_outside": "在內容警告外顯示媒體檔案",
|
||||
"settings.content_warnings_media_outside_hint": "透過內容警告切換不影響媒體檔案來重現上游 Mastodon 行為",
|
||||
"settings.content_warnings_shared_state": "一次顯示/隱藏所有副本的內容",
|
||||
"settings.content_warnings_shared_state_hint": "透過內容警告按鈕同時影響貼文的所有副本來重現上游 Mastodon 行為。 這將防止任何帶有展開的內容警告的貼文副本自動折疊",
|
||||
"settings.content_warnings_unfold_opts": "自動展開選項",
|
||||
|
|
|
@ -1344,7 +1344,7 @@ body > [data-popper-placement] {
|
|||
}
|
||||
}
|
||||
|
||||
.status__content.status__content--collapsed .status__content__text {
|
||||
.status__content.status__content--collapsed {
|
||||
max-height: 20px * 15; // 15 lines is roughly above 500 characters
|
||||
}
|
||||
|
||||
|
@ -1642,7 +1642,7 @@ body > [data-popper-placement] {
|
|||
padding: 0 10px;
|
||||
|
||||
.detailed-status__display-name {
|
||||
color: lighten($inverted-text-color, 16%);
|
||||
color: $dark-text-color;
|
||||
|
||||
span {
|
||||
display: inline;
|
||||
|
|
|
@ -659,6 +659,10 @@ code {
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
.status-card {
|
||||
contain: unset;
|
||||
}
|
||||
}
|
||||
|
||||
.block-icon {
|
||||
|
|
|
@ -7,26 +7,18 @@ import { requestNotificationPermission } from '../utils/notifications';
|
|||
import { fetchFollowRequests } from './accounts';
|
||||
import {
|
||||
importFetchedAccount,
|
||||
importFetchedStatus,
|
||||
} from './importer';
|
||||
import { submitMarkers } from './markers';
|
||||
import { notificationsUpdate } from "./notifications_typed";
|
||||
import { register as registerPushNotifications } from './push_notifications';
|
||||
import { saveSettings } from './settings';
|
||||
|
||||
export * from "./notifications_typed";
|
||||
|
||||
export const NOTIFICATIONS_UPDATE_NOOP = 'NOTIFICATIONS_UPDATE_NOOP';
|
||||
|
||||
export const NOTIFICATIONS_FILTER_SET = 'NOTIFICATIONS_FILTER_SET';
|
||||
|
||||
export const NOTIFICATIONS_SET_BROWSER_SUPPORT = 'NOTIFICATIONS_SET_BROWSER_SUPPORT';
|
||||
export const NOTIFICATIONS_SET_BROWSER_PERMISSION = 'NOTIFICATIONS_SET_BROWSER_PERMISSION';
|
||||
|
||||
export const NOTIFICATION_REQUESTS_DISMISS_REQUEST = 'NOTIFICATION_REQUESTS_DISMISS_REQUEST';
|
||||
export const NOTIFICATION_REQUESTS_DISMISS_SUCCESS = 'NOTIFICATION_REQUESTS_DISMISS_SUCCESS';
|
||||
export const NOTIFICATION_REQUESTS_DISMISS_FAIL = 'NOTIFICATION_REQUESTS_DISMISS_FAIL';
|
||||
|
||||
defineMessages({
|
||||
mention: { id: 'notification.mention', defaultMessage: '{name} mentioned you' },
|
||||
group: { id: 'notifications.group', defaultMessage: '{count} notifications' },
|
||||
|
@ -34,8 +26,6 @@ defineMessages({
|
|||
|
||||
export function updateNotifications(notification, intlMessages, intlLocale) {
|
||||
return (dispatch, getState) => {
|
||||
const activeFilter = getState().getIn(['settings', 'notifications', 'quickFilter', 'active']);
|
||||
const showInColumn = activeFilter === 'all' ? getState().getIn(['settings', 'notifications', 'shows', notification.type], true) : activeFilter === notification.type;
|
||||
const showAlert = getState().getIn(['settings', 'notifications', 'alerts', notification.type], true);
|
||||
const playSound = getState().getIn(['settings', 'notifications', 'sounds', notification.type], true);
|
||||
|
||||
|
@ -57,24 +47,9 @@ export function updateNotifications(notification, intlMessages, intlLocale) {
|
|||
|
||||
dispatch(submitMarkers());
|
||||
|
||||
if (showInColumn) {
|
||||
dispatch(importFetchedAccount(notification.account));
|
||||
|
||||
if (notification.status) {
|
||||
dispatch(importFetchedStatus(notification.status));
|
||||
}
|
||||
|
||||
if (notification.report) {
|
||||
dispatch(importFetchedAccount(notification.report.target_account));
|
||||
}
|
||||
|
||||
dispatch(notificationsUpdate({ notification, playSound: playSound && !filtered}));
|
||||
} else if (playSound && !filtered) {
|
||||
dispatch({
|
||||
type: NOTIFICATIONS_UPDATE_NOOP,
|
||||
meta: { sound: 'boop' },
|
||||
});
|
||||
}
|
||||
// `notificationsUpdate` is still used in `user_lists` and `relationships` reducers
|
||||
dispatch(importFetchedAccount(notification.account));
|
||||
dispatch(notificationsUpdate({ notification, playSound: playSound && !filtered}));
|
||||
|
||||
// Desktop notifications
|
||||
if (typeof window.Notification !== 'undefined' && showAlert && !filtered) {
|
||||
|
@ -93,17 +68,6 @@ export function updateNotifications(notification, intlMessages, intlLocale) {
|
|||
|
||||
const noOp = () => {};
|
||||
|
||||
export function setFilter (filterType) {
|
||||
return dispatch => {
|
||||
dispatch({
|
||||
type: NOTIFICATIONS_FILTER_SET,
|
||||
path: ['notifications', 'quickFilter', 'active'],
|
||||
value: filterType,
|
||||
});
|
||||
dispatch(saveSettings());
|
||||
};
|
||||
}
|
||||
|
||||
// Browser support
|
||||
export function setupBrowserNotifications() {
|
||||
return dispatch => {
|
||||
|
|
|
@ -33,7 +33,7 @@ const unsubscribe = ({ registration, subscription }) =>
|
|||
subscription ? subscription.unsubscribe().then(() => registration) : registration;
|
||||
|
||||
const sendSubscriptionToBackend = (subscription) => {
|
||||
const params = { subscription };
|
||||
const params = { subscription: { ...subscription.toJSON(), standard: true } };
|
||||
|
||||
if (me) {
|
||||
const data = pushNotificationsSetting.get(me);
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
import { Iterable, fromJS } from 'immutable';
|
||||
import { fromJS, isIndexed } from 'immutable';
|
||||
|
||||
import { hydrateCompose } from './compose';
|
||||
import { importFetchedAccounts } from './importer';
|
||||
|
@ -9,8 +9,7 @@ export const STORE_HYDRATE_LAZY = 'STORE_HYDRATE_LAZY';
|
|||
|
||||
const convertState = rawState =>
|
||||
fromJS(rawState, (k, v) =>
|
||||
Iterable.isIndexed(v) ? v.toList() : v.toMap());
|
||||
|
||||
isIndexed(v) ? v.toList() : v.toMap());
|
||||
|
||||
export function hydrateStore(rawState) {
|
||||
return dispatch => {
|
||||
|
|
|
@ -19,7 +19,7 @@ export interface BaseApiAccountJSON {
|
|||
avatar_static: string;
|
||||
bot: boolean;
|
||||
created_at: string;
|
||||
discoverable: boolean;
|
||||
discoverable?: boolean;
|
||||
indexable: boolean;
|
||||
display_name: string;
|
||||
emojis: ApiCustomEmojiJSON[];
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
import { Component } from 'react';
|
||||
|
||||
import type { IntlShape } from 'react-intl';
|
||||
import type { MessageDescriptor, PrimitiveType, IntlShape } from 'react-intl';
|
||||
import { injectIntl, defineMessages } from 'react-intl';
|
||||
|
||||
const messages = defineMessages({
|
||||
|
@ -102,7 +102,13 @@ const getUnitDelay = (units: string) => {
|
|||
};
|
||||
|
||||
export const timeAgoString = (
|
||||
intl: Pick<IntlShape, 'formatDate' | 'formatMessage'>,
|
||||
intl: {
|
||||
formatDate: IntlShape['formatDate'];
|
||||
formatMessage: (
|
||||
{ id, defaultMessage }: MessageDescriptor,
|
||||
values?: Record<string, PrimitiveType>,
|
||||
) => string;
|
||||
},
|
||||
date: Date,
|
||||
now: number,
|
||||
year: number,
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
import { Provider } from 'react-redux';
|
||||
|
||||
import { fetchCustomEmojis } from 'mastodon/actions/custom_emojis';
|
||||
import { fetchServer } from 'mastodon/actions/server';
|
||||
import { hydrateStore } from 'mastodon/actions/store';
|
||||
import { Router } from 'mastodon/components/router';
|
||||
import Compose from 'mastodon/features/standalone/compose';
|
||||
|
@ -13,6 +14,7 @@ if (initialState) {
|
|||
}
|
||||
|
||||
store.dispatch(fetchCustomEmojis());
|
||||
store.dispatch(fetchServer());
|
||||
|
||||
const ComposeContainer = () => (
|
||||
<IntlProvider>
|
||||
|
|
|
@ -335,15 +335,29 @@ class Announcement extends ImmutablePureComponent {
|
|||
const endsAt = announcement.get('ends_at') && new Date(announcement.get('ends_at'));
|
||||
const now = new Date();
|
||||
const hasTimeRange = startsAt && endsAt;
|
||||
const skipYear = hasTimeRange && startsAt.getFullYear() === endsAt.getFullYear() && endsAt.getFullYear() === now.getFullYear();
|
||||
const skipEndDate = hasTimeRange && startsAt.getDate() === endsAt.getDate() && startsAt.getMonth() === endsAt.getMonth() && startsAt.getFullYear() === endsAt.getFullYear();
|
||||
const skipTime = announcement.get('all_day');
|
||||
|
||||
let timestamp = null;
|
||||
if (hasTimeRange) {
|
||||
const skipYear = startsAt.getFullYear() === endsAt.getFullYear() && endsAt.getFullYear() === now.getFullYear();
|
||||
const skipEndDate = startsAt.getDate() === endsAt.getDate() && startsAt.getMonth() === endsAt.getMonth() && startsAt.getFullYear() === endsAt.getFullYear();
|
||||
timestamp = (
|
||||
<>
|
||||
<FormattedDate value={startsAt} year={(skipYear || startsAt.getFullYear() === now.getFullYear()) ? undefined : 'numeric'} month='short' day='2-digit' hour={skipTime ? undefined : '2-digit'} minute={skipTime ? undefined : '2-digit'} /> - <FormattedDate value={endsAt} year={(skipYear || endsAt.getFullYear() === now.getFullYear()) ? undefined : 'numeric'} month={skipEndDate ? undefined : 'short'} day={skipEndDate ? undefined : '2-digit'} hour={skipTime ? undefined : '2-digit'} minute={skipTime ? undefined : '2-digit'} />
|
||||
</>
|
||||
);
|
||||
} else {
|
||||
const publishedAt = new Date(announcement.get('published_at'));
|
||||
timestamp = (
|
||||
<FormattedDate value={publishedAt} year={publishedAt.getFullYear() === now.getFullYear() ? undefined : 'numeric'} month='short' day='2-digit' hour={skipTime ? undefined : '2-digit'} minute={skipTime ? undefined : '2-digit'} />
|
||||
);
|
||||
}
|
||||
|
||||
return (
|
||||
<div className='announcements__item'>
|
||||
<strong className='announcements__item__range'>
|
||||
<FormattedMessage id='announcement.announcement' defaultMessage='Announcement' />
|
||||
{hasTimeRange && <span> · <FormattedDate value={startsAt} year={(skipYear || startsAt.getFullYear() === now.getFullYear()) ? undefined : 'numeric'} month='short' day='2-digit' hour={skipTime ? undefined : '2-digit'} minute={skipTime ? undefined : '2-digit'} /> - <FormattedDate value={endsAt} year={(skipYear || endsAt.getFullYear() === now.getFullYear()) ? undefined : 'numeric'} month={skipEndDate ? undefined : 'short'} day={skipEndDate ? undefined : '2-digit'} hour={skipTime ? undefined : '2-digit'} minute={skipTime ? undefined : '2-digit'} /></span>}
|
||||
<span> · {timestamp}</span>
|
||||
</strong>
|
||||
|
||||
<Content announcement={announcement} />
|
||||
|
|
|
@ -3,10 +3,10 @@ import { defineMessages, injectIntl } from 'react-intl';
|
|||
import { connect } from 'react-redux';
|
||||
|
||||
import { openModal } from 'mastodon/actions/modal';
|
||||
import { fetchNotifications } from 'mastodon/actions/notification_groups';
|
||||
import { fetchNotifications , setNotificationsFilter } from 'mastodon/actions/notification_groups';
|
||||
|
||||
import { showAlert } from '../../../actions/alerts';
|
||||
import { setFilter, requestBrowserPermission } from '../../../actions/notifications';
|
||||
import { requestBrowserPermission } from '../../../actions/notifications';
|
||||
import { changeAlerts as changePushNotifications } from '../../../actions/push_notifications';
|
||||
import { changeSetting } from '../../../actions/settings';
|
||||
import ColumnSettings from '../components/column_settings';
|
||||
|
@ -43,7 +43,7 @@ const mapDispatchToProps = (dispatch) => ({
|
|||
}
|
||||
} else if (path[0] === 'quickFilter') {
|
||||
dispatch(changeSetting(['notifications', ...path], checked));
|
||||
dispatch(setFilter('all'));
|
||||
dispatch(setNotificationsFilter('all'));
|
||||
} else if (path[0] === 'alerts' && checked && typeof window.Notification !== 'undefined' && Notification.permission !== 'granted') {
|
||||
if (checked && typeof window.Notification !== 'undefined' && Notification.permission !== 'granted') {
|
||||
dispatch(requestBrowserPermission((permission) => {
|
||||
|
|
|
@ -12,6 +12,7 @@ import AddPhotoAlternateIcon from '@/material-icons/400-24px/add_photo_alternate
|
|||
import EditIcon from '@/material-icons/400-24px/edit.svg?react';
|
||||
import PersonIcon from '@/material-icons/400-24px/person.svg?react';
|
||||
import { updateAccount } from 'mastodon/actions/accounts';
|
||||
import { closeOnboarding } from 'mastodon/actions/onboarding';
|
||||
import { Button } from 'mastodon/components/button';
|
||||
import { Column } from 'mastodon/components/column';
|
||||
import { ColumnHeader } from 'mastodon/components/column_header';
|
||||
|
@ -58,7 +59,9 @@ export const Profile: React.FC<{
|
|||
);
|
||||
const [avatar, setAvatar] = useState<File>();
|
||||
const [header, setHeader] = useState<File>();
|
||||
const [discoverable, setDiscoverable] = useState(true);
|
||||
const [discoverable, setDiscoverable] = useState(
|
||||
account?.discoverable ?? true,
|
||||
);
|
||||
const [isSaving, setIsSaving] = useState(false);
|
||||
const [errors, setErrors] = useState<ApiAccountErrors>();
|
||||
const avatarFileRef = createRef<HTMLInputElement>();
|
||||
|
@ -132,6 +135,7 @@ export const Profile: React.FC<{
|
|||
)
|
||||
.then(() => {
|
||||
history.push('/start/follows');
|
||||
dispatch(closeOnboarding());
|
||||
return '';
|
||||
})
|
||||
// eslint-disable-next-line @typescript-eslint/use-unknown-in-catch-callback-variable
|
||||
|
|
|
@ -92,6 +92,7 @@ const mapStateToProps = state => ({
|
|||
hasMediaAttachments: state.getIn(['compose', 'media_attachments']).size > 0,
|
||||
canUploadMore: !state.getIn(['compose', 'media_attachments']).some(x => ['audio', 'video'].includes(x.get('type'))) && state.getIn(['compose', 'media_attachments']).size < state.getIn(['server', 'server', 'configuration', 'statuses', 'max_media_attachments']),
|
||||
firstLaunch: state.getIn(['settings', 'introductionVersion'], 0) < INTRODUCTION_VERSION,
|
||||
newAccount: !state.getIn(['accounts', me, 'note']) && !state.getIn(['accounts', me, 'bot']) && state.getIn(['accounts', me, 'following_count'], 0) === 0 && state.getIn(['accounts', me, 'statuses_count'], 0) === 0,
|
||||
username: state.getIn(['accounts', me, 'username']),
|
||||
});
|
||||
|
||||
|
@ -135,6 +136,7 @@ class SwitchingColumnsArea extends PureComponent {
|
|||
children: PropTypes.node,
|
||||
location: PropTypes.object,
|
||||
singleColumn: PropTypes.bool,
|
||||
forceOnboarding: PropTypes.bool,
|
||||
};
|
||||
|
||||
UNSAFE_componentWillMount () {
|
||||
|
@ -165,14 +167,16 @@ class SwitchingColumnsArea extends PureComponent {
|
|||
};
|
||||
|
||||
render () {
|
||||
const { children, singleColumn } = this.props;
|
||||
const { children, singleColumn, forceOnboarding } = this.props;
|
||||
const { signedIn } = this.props.identity;
|
||||
const pathName = this.props.location.pathname;
|
||||
|
||||
let redirect;
|
||||
|
||||
if (signedIn) {
|
||||
if (singleColumn) {
|
||||
if (forceOnboarding) {
|
||||
redirect = <Redirect from='/' to='/start' exact />;
|
||||
} else if (singleColumn) {
|
||||
redirect = <Redirect from='/' to='/home' exact />;
|
||||
} else {
|
||||
redirect = <Redirect from='/' to='/deck/getting-started' exact />;
|
||||
|
@ -276,6 +280,7 @@ class UI extends PureComponent {
|
|||
intl: PropTypes.object.isRequired,
|
||||
layout: PropTypes.string.isRequired,
|
||||
firstLaunch: PropTypes.bool,
|
||||
newAccount: PropTypes.bool,
|
||||
username: PropTypes.string,
|
||||
...WithRouterPropTypes,
|
||||
};
|
||||
|
@ -568,7 +573,7 @@ class UI extends PureComponent {
|
|||
|
||||
render () {
|
||||
const { draggingOver } = this.state;
|
||||
const { children, isComposing, location, layout } = this.props;
|
||||
const { children, isComposing, location, layout, firstLaunch, newAccount } = this.props;
|
||||
|
||||
const handlers = {
|
||||
help: this.handleHotkeyToggleHelp,
|
||||
|
@ -597,7 +602,7 @@ class UI extends PureComponent {
|
|||
<div className={classNames('ui', { 'is-composing': isComposing })} ref={this.setRef}>
|
||||
<Header />
|
||||
|
||||
<SwitchingColumnsArea identity={this.props.identity} location={location} singleColumn={layout === 'mobile' || layout === 'single-column'}>
|
||||
<SwitchingColumnsArea identity={this.props.identity} location={location} singleColumn={layout === 'mobile' || layout === 'single-column'} forceOnboarding={firstLaunch && newAccount}>
|
||||
{children}
|
||||
</SwitchingColumnsArea>
|
||||
|
||||
|
|
|
@ -240,5 +240,7 @@
|
|||
"dismissable_banner.community_timeline": "Bunlar, hesabları {domain} serverində yerləşən insanların ən son ictimai paylaşımlarıdır.",
|
||||
"dismissable_banner.dismiss": "Bağla",
|
||||
"dismissable_banner.explore_links": "Bu xəbərlər bu gün fediversedə ən çox paylaşılır. Daha fərqli insanlar tərəfindən dərc edilən daha yeni xəbərlər daha yuxarıda sıralanır.",
|
||||
"dismissable_banner.explore_statuses": "Fediversedən olan bu paylaşımlar bu gün maraq qazanır. Daha çox gücləndirici və bəyənmə olan daha yeni paylaşımlar daha yuxarıda sıralanır."
|
||||
"dismissable_banner.explore_statuses": "Fediversedən olan bu paylaşımlar bu gün maraq qazanır. Daha çox gücləndirici və bəyənmə olan daha yeni paylaşımlar daha yuxarıda sıralanır.",
|
||||
"domain_block_modal.block_account_instead": "@{name} istifadəçisini blokla",
|
||||
"domain_block_modal.they_can_interact_with_old_posts": "Bu serverdən olan insanlar köhnə paylaşımlarınızla əlaqə qura bilər."
|
||||
}
|
||||
|
|
|
@ -457,6 +457,7 @@
|
|||
"keyboard_shortcuts.toggle_hidden": "Показване/скриване на текст зад предупреждение на съдържание",
|
||||
"keyboard_shortcuts.toggle_sensitivity": "Показване/скриване на мултимедията",
|
||||
"keyboard_shortcuts.toot": "Начало на нова публикация",
|
||||
"keyboard_shortcuts.translate": "за превод на публикация",
|
||||
"keyboard_shortcuts.unfocus": "Разфокусиране на текстовото поле за съставяне/търсене",
|
||||
"keyboard_shortcuts.up": "Преместване нагоре в списъка",
|
||||
"lightbox.close": "Затваряне",
|
||||
|
@ -836,6 +837,7 @@
|
|||
"status.reblogs.empty": "Още никого не е подсилвал публикацията. Подсилващият ще се покаже тук.",
|
||||
"status.redraft": "Изтриване и преработване",
|
||||
"status.remove_bookmark": "Премахване на отметката",
|
||||
"status.remove_favourite": "Премахване от любими",
|
||||
"status.replied_in_thread": "Отговорено в нишката",
|
||||
"status.replied_to": "В отговор до {name}",
|
||||
"status.reply": "Отговор",
|
||||
|
|
|
@ -457,6 +457,7 @@
|
|||
"keyboard_shortcuts.toggle_hidden": "Mostra/amaga el text marcat com a sensible",
|
||||
"keyboard_shortcuts.toggle_sensitivity": "Mostra/amaga contingut",
|
||||
"keyboard_shortcuts.toot": "Escriu un nou tut",
|
||||
"keyboard_shortcuts.translate": "per a traduir una publicació",
|
||||
"keyboard_shortcuts.unfocus": "Descentra l'àrea de composició de text/cerca",
|
||||
"keyboard_shortcuts.up": "Apuja a la llista",
|
||||
"lightbox.close": "Tanca",
|
||||
|
@ -836,6 +837,7 @@
|
|||
"status.reblogs.empty": "Encara no ha impulsat ningú aquest tut. Quan algú ho faci, apareixerà aquí.",
|
||||
"status.redraft": "Esborra i reescriu",
|
||||
"status.remove_bookmark": "Elimina el marcador",
|
||||
"status.remove_favourite": "Elimina dels preferits",
|
||||
"status.replied_in_thread": "Respost al fil",
|
||||
"status.replied_to": "En resposta a {name}",
|
||||
"status.reply": "Respon",
|
||||
|
|
|
@ -85,10 +85,30 @@
|
|||
"alert.rate_limited.title": "Spojení omezena",
|
||||
"alert.unexpected.message": "Objevila se neočekávaná chyba.",
|
||||
"alert.unexpected.title": "Jejda!",
|
||||
"alt_text_badge.title": "Popisek",
|
||||
"announcement.announcement": "Oznámení",
|
||||
"annual_report.summary.archetype.booster": "Lovec obsahu",
|
||||
"annual_report.summary.archetype.lurker": "Špión",
|
||||
"annual_report.summary.archetype.oracle": "Vědma",
|
||||
"annual_report.summary.archetype.pollster": "Průzkumník",
|
||||
"annual_report.summary.archetype.replier": "Sociální motýlek",
|
||||
"annual_report.summary.followers.followers": "sledujících",
|
||||
"annual_report.summary.followers.total": "{count} celkem",
|
||||
"annual_report.summary.here_it_is": "Zde je tvůj {year} v přehledu:",
|
||||
"annual_report.summary.highlighted_post.by_favourites": "nejvíce oblíbený příspěvek",
|
||||
"annual_report.summary.highlighted_post.by_reblogs": "nejvíce boostovaný příspěvek",
|
||||
"annual_report.summary.highlighted_post.by_replies": "příspěvek s nejvíce odpověďmi",
|
||||
"annual_report.summary.highlighted_post.possessive": "{name}",
|
||||
"annual_report.summary.most_used_app.most_used_app": "nejpoužívanější aplikace",
|
||||
"annual_report.summary.most_used_hashtag.most_used_hashtag": "nejpoužívanější hashtag",
|
||||
"annual_report.summary.most_used_hashtag.none": "Žádné",
|
||||
"annual_report.summary.new_posts.new_posts": "nové příspěvky",
|
||||
"annual_report.summary.percentile.text": "<topLabel>To vás umisťuje do vrcholu</topLabel><percentage></percentage><bottomLabel>{domain} uživatelů.</bottomLabel>",
|
||||
"annual_report.summary.percentile.we_wont_tell_bernie": "To, že jste zdejší smetánka zůstane mezi námi ;).",
|
||||
"annual_report.summary.thanks": "Děkujeme, že jste součástí Mastodonu!",
|
||||
"attachments_list.unprocessed": "(nezpracováno)",
|
||||
"audio.hide": "Skrýt zvuk",
|
||||
"block_modal.remote_users_caveat": "Požádáme server {domain}, aby respektoval vaše rozhodnutí. Úplné dodržování nastavení však není zaručeno, protože některé servery mohou řešit blokování různě. Veřejné příspěvky mohou stále být viditelné pro nepřihlášené uživatele.",
|
||||
"block_modal.remote_users_caveat": "Požádáme server {domain}, aby respektoval vaše rozhodnutí. Úplné dodržování nastavení však není zaručeno, protože některé servery mohou řešit blokování různě. Veřejné příspěvky mohou být stále viditelné pro nepřihlášené uživatele.",
|
||||
"block_modal.show_less": "Zobrazit méně",
|
||||
"block_modal.show_more": "Zobrazit více",
|
||||
"block_modal.they_cant_mention": "Nemůže vás zmiňovat ani sledovat.",
|
||||
|
@ -109,6 +129,7 @@
|
|||
"bundle_column_error.routing.body": "Požadovaná stránka nebyla nalezena. Opravdu je URL v adresním řádku správně?",
|
||||
"bundle_column_error.routing.title": "404",
|
||||
"bundle_modal_error.close": "Zavřít",
|
||||
"bundle_modal_error.message": "Něco se pokazilo při načítání této obrazovky.",
|
||||
"bundle_modal_error.retry": "Zkusit znovu",
|
||||
"closed_registrations.other_server_instructions": "Protože Mastodon je decentralizovaný, můžete si vytvořit účet na jiném serveru a přesto komunikovat s tímto serverem.",
|
||||
"closed_registrations_modal.description": "V současné době není možné vytvořit účet na {domain}, ale mějte prosím na paměti, že k používání Mastodonu nepotřebujete účet konkrétně na {domain}.",
|
||||
|
@ -119,13 +140,16 @@
|
|||
"column.blocks": "Blokovaní uživatelé",
|
||||
"column.bookmarks": "Záložky",
|
||||
"column.community": "Místní časová osa",
|
||||
"column.create_list": "Vytvořit seznam",
|
||||
"column.direct": "Soukromé zmínky",
|
||||
"column.directory": "Prozkoumat profily",
|
||||
"column.domain_blocks": "Blokované domény",
|
||||
"column.edit_list": "Upravit seznam",
|
||||
"column.favourites": "Oblíbené",
|
||||
"column.firehose": "Živé kanály",
|
||||
"column.follow_requests": "Žádosti o sledování",
|
||||
"column.home": "Domů",
|
||||
"column.list_members": "Spravovat členy seznamu",
|
||||
"column.lists": "Seznamy",
|
||||
"column.mutes": "Skrytí uživatelé",
|
||||
"column.notifications": "Oznámení",
|
||||
|
@ -138,6 +162,7 @@
|
|||
"column_header.pin": "Připnout",
|
||||
"column_header.show_settings": "Zobrazit nastavení",
|
||||
"column_header.unpin": "Odepnout",
|
||||
"column_search.cancel": "Zrušit",
|
||||
"column_subheading.settings": "Nastavení",
|
||||
"community.column_settings.local_only": "Pouze místní",
|
||||
"community.column_settings.media_only": "Pouze média",
|
||||
|
@ -156,6 +181,7 @@
|
|||
"compose_form.poll.duration": "Doba trvání ankety",
|
||||
"compose_form.poll.multiple": "Výběr z více možností",
|
||||
"compose_form.poll.option_placeholder": "Volba {number}",
|
||||
"compose_form.poll.single": "Jediná volba",
|
||||
"compose_form.poll.switch_to_multiple": "Povolit u ankety výběr více voleb",
|
||||
"compose_form.poll.switch_to_single": "Povolit u ankety výběr pouze jedné volby",
|
||||
"compose_form.poll.type": "Styl",
|
||||
|
@ -179,6 +205,9 @@
|
|||
"confirmations.edit.confirm": "Upravit",
|
||||
"confirmations.edit.message": "Editovat teď znamená přepsání zprávy, kterou právě tvoříte. Opravdu chcete pokračovat?",
|
||||
"confirmations.edit.title": "Přepsat příspěvek?",
|
||||
"confirmations.follow_to_list.confirm": "Sledovat a přidat do seznamu",
|
||||
"confirmations.follow_to_list.message": "Musíte {name} sledovat, abyste je přidali do seznamu.",
|
||||
"confirmations.follow_to_list.title": "Sledovat uživatele?",
|
||||
"confirmations.logout.confirm": "Odhlásit se",
|
||||
"confirmations.logout.message": "Opravdu se chcete odhlásit?",
|
||||
"confirmations.logout.title": "Odhlásit se?",
|
||||
|
@ -193,6 +222,8 @@
|
|||
"confirmations.unfollow.message": "Opravdu chcete {name} přestat sledovat?",
|
||||
"confirmations.unfollow.title": "Přestat sledovat uživatele?",
|
||||
"content_warning.hide": "Skrýt příspěvek",
|
||||
"content_warning.show": "Přesto zobrazit",
|
||||
"content_warning.show_more": "Zobrazit více",
|
||||
"conversation.delete": "Smazat konverzaci",
|
||||
"conversation.mark_as_read": "Označit jako přečtené",
|
||||
"conversation.open": "Zobrazit konverzaci",
|
||||
|
@ -208,19 +239,25 @@
|
|||
"disabled_account_banner.text": "Váš účet {disabledAccount} je momentálně deaktivován.",
|
||||
"dismissable_banner.community_timeline": "Toto jsou nejnovější veřejné příspěvky od lidí, jejichž účty hostuje {domain}.",
|
||||
"dismissable_banner.dismiss": "Zavřít",
|
||||
"dismissable_banner.explore_links": "Tyto zprávy jsou dnes nejvíce sdíleny ve fediversu. Novější novinky publikované více různými lidmi jsou v pořadí vyšší.",
|
||||
"dismissable_banner.explore_statuses": "Tyto příspěvky napříč fediversem dnes získávají na popularitě. Novější příspěvky s více boosty a oblíbenými jsou výše v pořadí.",
|
||||
"dismissable_banner.explore_tags": "Tyto hashtagy dnes na fediversu získávají na popularitě. Hashtagy, které používá více různých lidí, jsou řazeny výše.",
|
||||
"dismissable_banner.public_timeline": "Toto jsou nejnovější veřejné příspěvky od lidí na fediversu, které lidé na {domain} sledují.",
|
||||
"domain_block_modal.block": "Blokovat server",
|
||||
"domain_block_modal.block_account_instead": "Raději blokovat @{name}",
|
||||
"domain_block_modal.they_can_interact_with_old_posts": "Lidé z tohoto serveru mohou interagovat s vašimi starými příspěvky.",
|
||||
"domain_block_modal.they_cant_follow": "Nikdo z tohoto serveru vás nemůže sledovat.",
|
||||
"domain_block_modal.they_wont_know": "Nebude vědět, že je zablokován*a.",
|
||||
"domain_block_modal.title": "Blokovat doménu?",
|
||||
"domain_block_modal.you_will_lose_num_followers": "Ztratíte {followersCount, plural, one {{followersCountDisplay} sledujícího} few {{followersCountDisplay} sledující} many {{followersCountDisplay} sledujících} other {{followersCountDisplay} sledujících}} a {followingCount, plural, one {{followingCountDisplay} sledovaného} few {{followingCountDisplay} sledované} many {{followingCountDisplay} sledovaných} other {{followingCountDisplay} sledovaných}}.",
|
||||
"domain_block_modal.you_will_lose_relationships": "Ztratíte všechny sledující a lidi, které sledujete z tohoto serveru.",
|
||||
"domain_block_modal.you_wont_see_posts": "Neuvidíte příspěvky ani upozornění od uživatelů z tohoto serveru.",
|
||||
"domain_pill.activitypub_lets_connect": "Umožňuje vám spojit se a komunikovat s lidmi nejen na Mastodonu, ale i s dalšími sociálními aplikacemi.",
|
||||
"domain_pill.activitypub_like_language": "ActivityPub je jako jazyk, kterým Mastodon mluví s jinými sociálními sítěmi.",
|
||||
"domain_pill.server": "Server",
|
||||
"domain_pill.their_handle": "Handle:",
|
||||
"domain_pill.their_server": "Digitální domov, kde žijí všechny příspěvky.",
|
||||
"domain_pill.their_username": "Jedinečný identikátor na serveru. Je možné najít uživatele se stejným uživatelským jménem na různých serverech.",
|
||||
"domain_pill.their_server": "Jejich digitální domov, kde žijí jejich všechny příspěvky.",
|
||||
"domain_pill.their_username": "Jejich jedinečný identikátor na jejich serveru. Je možné najít uživatele se stejným uživatelským jménem na jiných serverech.",
|
||||
"domain_pill.username": "Uživatelské jméno",
|
||||
"domain_pill.whats_in_a_handle": "Co obsahuje handle?",
|
||||
"domain_pill.who_they_are": "Protože handle říkají kdo je kdo a také kde, je možné interagovat s lidmi napříč sociálními weby <button>platforem postavených na ActivityPub</button>.",
|
||||
|
@ -293,6 +330,8 @@
|
|||
"filter_modal.select_filter.subtitle": "Použít existující kategorii nebo vytvořit novou kategorii",
|
||||
"filter_modal.select_filter.title": "Filtrovat tento příspěvek",
|
||||
"filter_modal.title.status": "Filtrovat příspěvek",
|
||||
"filter_warning.matches_filter": "Odpovídá filtru “<span>{title}</span>”",
|
||||
"filtered_notifications_banner.pending_requests": "Od {count, plural, =0 {nikoho, koho možná znáte} one {člověka, kterého možná znáte} few {#, které možná znáte} many {#, které možná znáte} other {#, které možná znáte}}",
|
||||
"filtered_notifications_banner.title": "Filtrovaná oznámení",
|
||||
"firehose.all": "Vše",
|
||||
"firehose.local": "Tento server",
|
||||
|
@ -300,14 +339,14 @@
|
|||
"follow_request.authorize": "Autorizovat",
|
||||
"follow_request.reject": "Zamítnout",
|
||||
"follow_requests.unlocked_explanation": "Přestože váš účet není uzamčen, personál {domain} usoudil, že byste mohli chtít tyto požadavky na sledování zkontrolovat ručně.",
|
||||
"follow_suggestions.curated_suggestion": "Výběr personálů",
|
||||
"follow_suggestions.curated_suggestion": "Výběr personálu",
|
||||
"follow_suggestions.dismiss": "Znovu nezobrazovat",
|
||||
"follow_suggestions.featured_longer": "Ručně vybráno týmem {domain}",
|
||||
"follow_suggestions.friends_of_friends_longer": "Populární mezi lidmi, které sledujete",
|
||||
"follow_suggestions.hints.featured": "Tento profil byl ručně vybrán týmem {domain}.",
|
||||
"follow_suggestions.hints.friends_of_friends": "Tento profil je populární mezi lidmi, které sledujete.",
|
||||
"follow_suggestions.hints.most_followed": "Tento profil je jedním z nejvíce sledovaných na {domain}.",
|
||||
"follow_suggestions.hints.most_interactions": "Tento profil nedávno dostalo velkou pozornost na {domain}.",
|
||||
"follow_suggestions.hints.most_followed": "Tento profil je jedním z nejsledovanějších na {domain}.",
|
||||
"follow_suggestions.hints.most_interactions": "Tomuto profilu se nedávno dostalo velké pozornosti na {domain}.",
|
||||
"follow_suggestions.hints.similar_to_recently_followed": "Tento profil je podobný profilům, které jste nedávno sledovali.",
|
||||
"follow_suggestions.personalized_suggestion": "Přizpůsobený návrh",
|
||||
"follow_suggestions.popular_suggestion": "Populární návrh",
|
||||
|
@ -323,8 +362,10 @@
|
|||
"footer.privacy_policy": "Zásady ochrany osobních údajů",
|
||||
"footer.source_code": "Zobrazit zdrojový kód",
|
||||
"footer.status": "Stav",
|
||||
"footer.terms_of_service": "Obchodní podmínky",
|
||||
"generic.saved": "Uloženo",
|
||||
"getting_started.heading": "Začínáme",
|
||||
"hashtag.admin_moderation": "Otevřít moderátorské rozhraní pro #{name}",
|
||||
"hashtag.column_header.tag_mode.all": "a {additional}",
|
||||
"hashtag.column_header.tag_mode.any": "nebo {additional}",
|
||||
"hashtag.column_header.tag_mode.none": "bez {additional}",
|
||||
|
@ -340,6 +381,14 @@
|
|||
"hashtag.follow": "Sledovat hashtag",
|
||||
"hashtag.unfollow": "Přestat sledovat hashtag",
|
||||
"hashtags.and_other": "…a {count, plural, one {# další} few {# další} other {# dalších}}",
|
||||
"hints.profiles.followers_may_be_missing": "Sledující mohou pro tento profil chybět.",
|
||||
"hints.profiles.follows_may_be_missing": "Sledování mohou pro tento profil chybět.",
|
||||
"hints.profiles.posts_may_be_missing": "Některé příspěvky z tohoto profilu mohou chybět.",
|
||||
"hints.profiles.see_more_followers": "Zobrazit více sledujících na {domain}",
|
||||
"hints.profiles.see_more_follows": "Zobrazit další sledování na {domain}",
|
||||
"hints.profiles.see_more_posts": "Zobrazit další příspěvky na {domain}",
|
||||
"hints.threads.replies_may_be_missing": "Odpovědi z jiných serverů mohou chybět.",
|
||||
"hints.threads.see_more": "Zobrazit další odpovědi na {domain}",
|
||||
"home.column_settings.show_reblogs": "Zobrazit boosty",
|
||||
"home.column_settings.show_replies": "Zobrazit odpovědi",
|
||||
"home.hide_announcements": "Skrýt oznámení",
|
||||
|
@ -347,12 +396,32 @@
|
|||
"home.pending_critical_update.link": "Zobrazit aktualizace",
|
||||
"home.pending_critical_update.title": "K dispozici je kritická bezpečnostní aktualizace!",
|
||||
"home.show_announcements": "Zobrazit oznámení",
|
||||
"ignore_notifications_modal.disclaimer": "Mastodon nemůže informovat uživatele, že jste ignorovali jejich oznámení. Ignorování oznámení nezabrání odesílání zpráv samotných.",
|
||||
"ignore_notifications_modal.filter_instead": "Místo toho filtrovat",
|
||||
"ignore_notifications_modal.filter_to_act_users": "Stále budete moci přijmout, odmítnout nebo nahlásit uživatele",
|
||||
"ignore_notifications_modal.filter_to_avoid_confusion": "Filtrování pomáhá vyhnout se možným nejasnostem",
|
||||
"ignore_notifications_modal.filter_to_review_separately": "Filtrovaná oznámení můžete zkontrolovat samostatně",
|
||||
"ignore_notifications_modal.ignore": "Ignorovat oznámení",
|
||||
"ignore_notifications_modal.limited_accounts_title": "Ignorovat oznámení z moderovaných účtů?",
|
||||
"ignore_notifications_modal.new_accounts_title": "Ignorovat oznámení z nových účtů?",
|
||||
"ignore_notifications_modal.not_followers_title": "Ignorovat oznámení od lidí, kteří vás nesledují?",
|
||||
"ignore_notifications_modal.not_following_title": "Ignorovat oznámení od lidí, které nesledujete?",
|
||||
"ignore_notifications_modal.private_mentions_title": "Ignorovat oznámení z nevyžádaných soukromých zmínek?",
|
||||
"interaction_modal.action.favourite": "Chcete-li pokračovat, musíte oblíbit z vašeho účtu.",
|
||||
"interaction_modal.action.follow": "Chcete-li pokračovat, musíte sledovat z vašeho účtu.",
|
||||
"interaction_modal.action.reblog": "Chcete-li pokračovat, musíte dát boost z vašeho účtu.",
|
||||
"interaction_modal.action.reply": "Chcete-li pokračovat, musíte odpovědět z vašeho účtu.",
|
||||
"interaction_modal.action.vote": "Chcete-li pokračovat, musíte hlasovat z vašeho účtu.",
|
||||
"interaction_modal.go": "Přejít",
|
||||
"interaction_modal.no_account_yet": "Ještě nemáte účet?",
|
||||
"interaction_modal.on_another_server": "Na jiném serveru",
|
||||
"interaction_modal.on_this_server": "Na tomto serveru",
|
||||
"interaction_modal.title.favourite": "Oblíbit si příspěvek od uživatele {name}",
|
||||
"interaction_modal.title.follow": "Sledovat {name}",
|
||||
"interaction_modal.title.reblog": "Boostnout příspěvek uživatele {name}",
|
||||
"interaction_modal.title.reply": "Odpovědět na příspěvek uživatele {name}",
|
||||
"interaction_modal.title.vote": "Hlasujte v anketě {name}",
|
||||
"interaction_modal.username_prompt": "např. {example}",
|
||||
"intervals.full.days": "{number, plural, one {# den} few {# dny} many {# dní} other {# dní}}",
|
||||
"intervals.full.hours": "{number, plural, one {# hodina} few {# hodiny} many {# hodin} other {# hodin}}",
|
||||
"intervals.full.minutes": "{number, plural, one {# minuta} few {# minuty} many {# minut} other {# minut}}",
|
||||
|
@ -388,23 +457,48 @@
|
|||
"keyboard_shortcuts.toggle_hidden": "Zobrazit/skrýt text za varováním o obsahu",
|
||||
"keyboard_shortcuts.toggle_sensitivity": "Zobrazit/skrýt média",
|
||||
"keyboard_shortcuts.toot": "Začít nový příspěvek",
|
||||
"keyboard_shortcuts.translate": "k přeložení příspěvku",
|
||||
"keyboard_shortcuts.unfocus": "Zrušit zaměření na nový příspěvek/hledání",
|
||||
"keyboard_shortcuts.up": "Posunout v seznamu nahoru",
|
||||
"lightbox.close": "Zavřít",
|
||||
"lightbox.next": "Další",
|
||||
"lightbox.previous": "Předchozí",
|
||||
"lightbox.zoom_in": "Přiblížit na skutečnou velikost",
|
||||
"lightbox.zoom_out": "Přizpůsobit velikost",
|
||||
"limited_account_hint.action": "Přesto profil zobrazit",
|
||||
"limited_account_hint.title": "Tento profil byl skryt moderátory {domain}.",
|
||||
"link_preview.author": "Podle {name}",
|
||||
"link_preview.more_from_author": "Více od {name}",
|
||||
"link_preview.shares": "{count, plural, one {{counter} příspěvek} few {{counter} příspěvky} many {{counter} příspěvků} other {{counter} příspěvků}}",
|
||||
"lists.add_member": "Přidat",
|
||||
"lists.add_to_list": "Přidat do seznamu",
|
||||
"lists.add_to_lists": "Přidat {name} do seznamů",
|
||||
"lists.create": "Vytvořit",
|
||||
"lists.create_a_list_to_organize": "Vytvořte nový seznam pro organizaci vašeho domovského kanálu",
|
||||
"lists.create_list": "Vytvořit seznam",
|
||||
"lists.delete": "Smazat seznam",
|
||||
"lists.done": "Hotovo",
|
||||
"lists.edit": "Upravit seznam",
|
||||
"lists.exclusive": "Skrýt členy na domovském kanálu",
|
||||
"lists.exclusive_hint": "Pokud je někdo na tomto seznamu, skryjte jej ve vašem domovském kanálu, abyste se vyhnuli dvojímu vidění jejich příspěvků.",
|
||||
"lists.find_users_to_add": "Najít uživatele, které chcete přidat",
|
||||
"lists.list_members": "Členové seznamu",
|
||||
"lists.list_members_count": "{count, plural, one {# člen} few {# členové} many {# členů} other {# členů}}",
|
||||
"lists.list_name": "Název seznamu",
|
||||
"lists.new_list_name": "Název nového seznamu",
|
||||
"lists.no_lists_yet": "Zatím žádné seznamy.",
|
||||
"lists.no_members_yet": "Zatím žádní členové.",
|
||||
"lists.no_results_found": "Nebyly nalezeny žádné výsledky.",
|
||||
"lists.remove_member": "Odstranit",
|
||||
"lists.replies_policy.followed": "Sledovaným uživatelům",
|
||||
"lists.replies_policy.list": "Členům seznamu",
|
||||
"lists.replies_policy.none": "Nikomu",
|
||||
"lists.save": "Uložit",
|
||||
"lists.search": "Hledat",
|
||||
"lists.show_replies_to": "Zahrnout odpovědi od členů seznamu pro",
|
||||
"load_pending": "{count, plural, one {# nová položka} few {# nové položky} many {# nových položek} other {# nových položek}}",
|
||||
"loading_indicator.label": "Načítání…",
|
||||
"media_gallery.hide": "Skrýt",
|
||||
"moved_to_account_banner.text": "Váš účet {disabledAccount} je momentálně deaktivován, protože jste se přesunul/a na {movedToAccount}.",
|
||||
"mute_modal.hide_from_notifications": "Skrýt z notifikací",
|
||||
"mute_modal.hide_options": "Skrýt možnosti",
|
||||
|
@ -416,6 +510,7 @@
|
|||
"mute_modal.you_wont_see_mentions": "Neuvidíte příspěvky, které je zmiňují.",
|
||||
"mute_modal.you_wont_see_posts": "Stále budou moci vidět vaše příspěvky, ale vy jejich neuvidíte.",
|
||||
"navigation_bar.about": "O aplikaci",
|
||||
"navigation_bar.administration": "Administrace",
|
||||
"navigation_bar.advanced_interface": "Otevřít pokročilé webové rozhraní",
|
||||
"navigation_bar.blocks": "Blokovaní uživatelé",
|
||||
"navigation_bar.bookmarks": "Záložky",
|
||||
|
@ -432,6 +527,7 @@
|
|||
"navigation_bar.follows_and_followers": "Sledovaní a sledující",
|
||||
"navigation_bar.lists": "Seznamy",
|
||||
"navigation_bar.logout": "Odhlásit se",
|
||||
"navigation_bar.moderation": "Moderace",
|
||||
"navigation_bar.mutes": "Skrytí uživatelé",
|
||||
"navigation_bar.opened_in_classic_interface": "Příspěvky, účty a další specifické stránky jsou ve výchozím nastavení otevřeny v klasickém webovém rozhraní.",
|
||||
"navigation_bar.personal": "Osobní",
|
||||
|
@ -442,12 +538,28 @@
|
|||
"navigation_bar.security": "Zabezpečení",
|
||||
"not_signed_in_indicator.not_signed_in": "Pro přístup k tomuto zdroji se musíte přihlásit.",
|
||||
"notification.admin.report": "Uživatel {name} nahlásil {target}",
|
||||
"notification.admin.report_account": "{name} nahlásil {count, plural, one {jeden příspěvek} few {# příspěvky} many {# příspěvků} other {# příspěvků}} od {target} za {category}",
|
||||
"notification.admin.report_account_other": "{name} nahlásil {count, plural, one {jeden příspěvek} few {# příspěvky} many {# příspěvků} other {# příspěvků}} od {target}",
|
||||
"notification.admin.report_statuses": "{name} nahlásil {target} za {category}",
|
||||
"notification.admin.report_statuses_other": "{name} nahlásil {target}",
|
||||
"notification.admin.sign_up": "Uživatel {name} se zaregistroval",
|
||||
"notification.admin.sign_up.name_and_others": "{name} a {count, plural, one {# další} few {# další} many {# dalších} other {# dalších}} se zaregistrovali",
|
||||
"notification.annual_report.message": "Váš #Wrapstodon {year} na Vás čeká! Podívejte se, jak vypadal tento Váš rok na Mastodonu!",
|
||||
"notification.annual_report.view": "Zobrazit #Wrapstodon",
|
||||
"notification.favourite": "Uživatel {name} si oblíbil váš příspěvek",
|
||||
"notification.favourite.name_and_others_with_link": "{name} a {count, plural, one {<a># další</a> si oblíbil} few {<a># další</a> si oblíbili} other {<a># dalších</a> si oblíbilo}} Váš příspěvek",
|
||||
"notification.favourite_pm": "{name} si oblíbil vaši soukromou zmínku",
|
||||
"notification.favourite_pm.name_and_others_with_link": "{name} a {count, plural, one {<a># další</a> si oblíbil} few {<a># další</a> si oblíbili} other {<a># dalších</a> si oblíbilo}} Vaši soukromou zmínku",
|
||||
"notification.follow": "Uživatel {name} vás začal sledovat",
|
||||
"notification.follow.name_and_others": "{name} a {count, plural, one {<a># další</a> Vás začal sledovat} few {<a># další</a> Vás začali sledovat} other {<a># dalších</a> Vás začalo sledovat}}",
|
||||
"notification.follow_request": "Uživatel {name} požádal o povolení vás sledovat",
|
||||
"notification.follow_request.name_and_others": "{name} a {count, plural, one {# další Vám poslal žádost o sledování} few {# další Vám poslali žádost o sledování} other {# dalších Vám poslalo žádost o sledování}}",
|
||||
"notification.label.mention": "Zmínka",
|
||||
"notification.label.private_mention": "Soukromá zmínka",
|
||||
"notification.label.private_reply": "Privátní odpověď",
|
||||
"notification.label.reply": "Odpověď",
|
||||
"notification.mention": "Zmínka",
|
||||
"notification.mentioned_you": "{name} vás zmínil",
|
||||
"notification.moderation-warning.learn_more": "Zjistit více",
|
||||
"notification.moderation_warning": "Obdrželi jste moderační varování",
|
||||
"notification.moderation_warning.action_delete_statuses": "Některé z vašich příspěvků byly odstraněny.",
|
||||
|
@ -460,6 +572,7 @@
|
|||
"notification.own_poll": "Vaše anketa skončila",
|
||||
"notification.poll": "Anketa, ve které jste hlasovali, skončila",
|
||||
"notification.reblog": "Uživatel {name} boostnul váš příspěvek",
|
||||
"notification.reblog.name_and_others_with_link": "{name} a {count, plural, one {<a># další</a> boostnul} few {<a># další</a> boostnuli} other {<a># dalších</a> boostnulo}} Váš příspěvek",
|
||||
"notification.relationships_severance_event": "Kontakt ztracen s {name}",
|
||||
"notification.relationships_severance_event.account_suspension": "Administrátor z {from} pozastavil {target}, což znamená, že již od nich nemůžete přijímat aktualizace nebo s nimi interagovat.",
|
||||
"notification.relationships_severance_event.domain_block": "Administrátor z {from} pozastavil {target}, včetně {followersCount} z vašich sledujících a {followingCount, plural, one {# účet, který sledujete} few {# účty, které sledujete} many {# účtů, které sledujete} other {# účtů, které sledujete}}.",
|
||||
|
@ -468,11 +581,24 @@
|
|||
"notification.status": "Uživatel {name} právě přidal příspěvek",
|
||||
"notification.update": "Uživatel {name} upravil příspěvek",
|
||||
"notification_requests.accept": "Přijmout",
|
||||
"notification_requests.accept_multiple": "{count, plural, one {Schválit # požadavek…} few {Schválit # požadavky…} other {Schválit # požadavků…}}",
|
||||
"notification_requests.confirm_accept_multiple.button": "{count, plural, one {Schválit požadavek} other {Schválit požadavky}}",
|
||||
"notification_requests.confirm_accept_multiple.message": "Chystáte se schválit {count, plural, one {jeden požadavek} few {# požadavky} other {# požadavků}} na oznámení. Opravdu chcete pokračovat?",
|
||||
"notification_requests.confirm_accept_multiple.title": "Přijmout žádosti o oznámení?",
|
||||
"notification_requests.confirm_dismiss_multiple.button": "{count, plural, one {Zamítnout požadavek} other {Zamítnout požadavky}}",
|
||||
"notification_requests.confirm_dismiss_multiple.message": "Chystáte se zamítnout {count, plural, one {jeden požadavek} few {# požadavky} many {# požadavků} other {# požadavků}} na oznámení. Poté k {count, plural, one {němu} other {něm}} již nebudete mít snadný přístup. Opravdu chcete pokračovat?",
|
||||
"notification_requests.confirm_dismiss_multiple.title": "Zamítnout požadavky na oznámení?",
|
||||
"notification_requests.dismiss": "Zamítnout",
|
||||
"notification_requests.dismiss_multiple": "Zamítnout {count, plural, one {# požadavek} few {# požadavky} many {# požadavků} other {# požadavků}}…",
|
||||
"notification_requests.edit_selection": "Upravit",
|
||||
"notification_requests.exit_selection": "Hotovo",
|
||||
"notification_requests.explainer_for_limited_account": "Oznámení z tohoto účtu byla filtrována, protože tento účet byl omezen moderátorem.",
|
||||
"notification_requests.explainer_for_limited_remote_account": "Oznámení z tohoto účtu byla filtrována, protože tento účet nebo jeho server byl omezen moderátorem.",
|
||||
"notification_requests.maximize": "Maximalizovat",
|
||||
"notification_requests.minimize_banner": "Minimalizovat banner filtrovaných oznámení",
|
||||
"notification_requests.notifications_from": "Oznámení od {name}",
|
||||
"notification_requests.title": "Vyfiltrovaná oznámení",
|
||||
"notification_requests.view": "Zobrazit oznámení",
|
||||
"notifications.clear": "Vyčistit oznámení",
|
||||
"notifications.clear_confirmation": "Opravdu chcete trvale smazat všechna vaše oznámení?",
|
||||
"notifications.clear_title": "Vyčistit oznámení?",
|
||||
|
@ -484,6 +610,7 @@
|
|||
"notifications.column_settings.filter_bar.category": "Panel rychlého filtrování",
|
||||
"notifications.column_settings.follow": "Noví sledující:",
|
||||
"notifications.column_settings.follow_request": "Nové žádosti o sledování:",
|
||||
"notifications.column_settings.group": "Skupina",
|
||||
"notifications.column_settings.mention": "Zmínky:",
|
||||
"notifications.column_settings.poll": "Výsledky anket:",
|
||||
"notifications.column_settings.push": "Push oznámení",
|
||||
|
@ -507,6 +634,14 @@
|
|||
"notifications.permission_denied": "Oznámení na ploše nejsou k dispozici, protože byla zamítnuta žádost o oprávnění je zobrazovat",
|
||||
"notifications.permission_denied_alert": "Oznámení na ploše není možné zapnout, protože oprávnění bylo v minulosti zamítnuto",
|
||||
"notifications.permission_required": "Oznámení na ploše nejsou k dispozici, protože nebylo uděleno potřebné oprávnění.",
|
||||
"notifications.policy.accept": "Přijmout",
|
||||
"notifications.policy.accept_hint": "Zobrazit v oznámeních",
|
||||
"notifications.policy.drop": "Ignorovat",
|
||||
"notifications.policy.drop_hint": "Permanentně odstranit, aby již nikdy nespatřil světlo světa",
|
||||
"notifications.policy.filter": "Filtrovat",
|
||||
"notifications.policy.filter_hint": "Odeslat do filtrované schránky oznámení",
|
||||
"notifications.policy.filter_limited_accounts_hint": "Omezeno moderátory serveru",
|
||||
"notifications.policy.filter_limited_accounts_title": "Moderované účty",
|
||||
"notifications.policy.filter_new_accounts.hint": "Vytvořeno během {days, plural, one {včerejška} few {posledních # dnů} many {posledních # dní} other {posledních # dní}}",
|
||||
"notifications.policy.filter_new_accounts_title": "Nové účty",
|
||||
"notifications.policy.filter_not_followers_hint": "Včetně lidí, kteří vás sledovali méně než {days, plural, one {jeden den} few {# dny} many {# dní} other {# dní}}",
|
||||
|
@ -515,10 +650,15 @@
|
|||
"notifications.policy.filter_not_following_title": "Lidé, které nesledujete",
|
||||
"notifications.policy.filter_private_mentions_hint": "Vyfiltrováno, pokud to není odpověď na vaši zmínku nebo pokud sledujete odesílatele",
|
||||
"notifications.policy.filter_private_mentions_title": "Nevyžádané soukromé zmínky",
|
||||
"notifications.policy.title": "Spravovat oznámení od…",
|
||||
"notifications_permission_banner.enable": "Povolit oznámení na ploše",
|
||||
"notifications_permission_banner.how_to_control": "Chcete-li dostávat oznámení, i když nemáte Mastodon otevřený, povolte oznámení na ploše. Můžete si zvolit, o kterých druzích interakcí chcete být oznámením na ploše informování pod tlačítkem {icon} výše.",
|
||||
"notifications_permission_banner.title": "Nenechte si nic uniknout",
|
||||
"onboarding.follows.back": "Zpět",
|
||||
"onboarding.follows.done": "Hotovo",
|
||||
"onboarding.follows.empty": "Bohužel, žádné výsledky nelze momentálně zobrazit. Můžete zkusit vyhledat nebo procházet stránku s průzkumem a najít lidi, kteří budou sledovat, nebo to zkuste znovu později.",
|
||||
"onboarding.follows.search": "Hledat",
|
||||
"onboarding.follows.title": "Sledujte lidi a začněte",
|
||||
"onboarding.profile.discoverable": "Udělat svůj profil vyhledatelným",
|
||||
"onboarding.profile.discoverable_hint": "Když se rozhodnete být vyhledatelný na Mastodonu, vaše příspěvky se mohou objevit ve výsledcích vyhledávání a v populárních, a váš profil může být navrhován lidem s podobnými zájmy.",
|
||||
"onboarding.profile.display_name": "Zobrazované jméno",
|
||||
|
@ -556,6 +696,8 @@
|
|||
"privacy_policy.title": "Zásady ochrany osobních údajů",
|
||||
"recommended": "Doporučeno",
|
||||
"refresh": "Obnovit",
|
||||
"regeneration_indicator.please_stand_by": "Počkej prosím.",
|
||||
"regeneration_indicator.preparing_your_home_feed": "Připravujeme vaší domovskou stránku…",
|
||||
"relative_time.days": "{number} d",
|
||||
"relative_time.full.days": "před {number, plural, one {# dnem} few {# dny} many {# dny} other {# dny}}",
|
||||
"relative_time.full.hours": "před {number, plural, one {# hodinou} few {# hodinami} many {# hodinami} other {# hodinami}}",
|
||||
|
@ -639,8 +781,11 @@
|
|||
"search_results.accounts": "Profily",
|
||||
"search_results.all": "Vše",
|
||||
"search_results.hashtags": "Hashtagy",
|
||||
"search_results.no_results": "Nelze najít.",
|
||||
"search_results.no_search_yet": "Zkuste vyhledat příspěvky, profily nebo hashtagy.",
|
||||
"search_results.see_all": "Zobrazit vše",
|
||||
"search_results.statuses": "Příspěvky",
|
||||
"search_results.title": "Hledat \"{q}\"",
|
||||
"server_banner.about_active_users": "Lidé používající tento server během posledních 30 dní (měsíční aktivní uživatelé)",
|
||||
"server_banner.active_users": "aktivní uživatelé",
|
||||
"server_banner.administered_by": "Spravováno:",
|
||||
|
@ -658,6 +803,7 @@
|
|||
"status.bookmark": "Přidat do záložek",
|
||||
"status.cancel_reblog_private": "Zrušit boostnutí",
|
||||
"status.cannot_reblog": "Tento příspěvek nemůže být boostnutý",
|
||||
"status.continued_thread": "Pokračuje ve vlákně",
|
||||
"status.copy": "Zkopírovat odkaz na příspěvek",
|
||||
"status.delete": "Smazat",
|
||||
"status.detailed_status": "Podrobné zobrazení konverzace",
|
||||
|
@ -666,6 +812,7 @@
|
|||
"status.edit": "Upravit",
|
||||
"status.edited": "Naposledy upraveno {date}",
|
||||
"status.edited_x_times": "Upraveno {count, plural, one {{count}krát} few {{count}krát} many {{count}krát} other {{count}krát}}",
|
||||
"status.embed": "Získejte kód pro vložení",
|
||||
"status.favourite": "Oblíbit",
|
||||
"status.favourites": "{count, plural, one {oblíbený} few {oblíbené} many {oblíbených} other {oblíbených}}",
|
||||
"status.filter": "Filtrovat tento příspěvek",
|
||||
|
@ -690,6 +837,8 @@
|
|||
"status.reblogs.empty": "Tento příspěvek ještě nikdo neboostnul. Pokud to někdo udělá, zobrazí se zde.",
|
||||
"status.redraft": "Smazat a přepsat",
|
||||
"status.remove_bookmark": "Odstranit ze záložek",
|
||||
"status.remove_favourite": "Odebrat z oblíbených",
|
||||
"status.replied_in_thread": "Odpověděli ve vlákně",
|
||||
"status.replied_to": "Odpověděl/a uživateli {name}",
|
||||
"status.reply": "Odpovědět",
|
||||
"status.replyAll": "Odpovědět na vlákno",
|
||||
|
@ -710,6 +859,7 @@
|
|||
"subscribed_languages.target": "Změnit odebírané jazyky na {target}",
|
||||
"tabs_bar.home": "Domů",
|
||||
"tabs_bar.notifications": "Oznámení",
|
||||
"terms_of_service.title": "Podmínky služby",
|
||||
"time_remaining.days": "{number, plural, one {Zbývá # den} few {Zbývají # dny} many {Zbývá # dní} other {Zbývá # dní}}",
|
||||
"time_remaining.hours": "{number, plural, one {Zbývá # hodina} few {Zbývají # hodiny} many {Zbývá # hodin} other {Zbývá # hodin}}",
|
||||
"time_remaining.minutes": "{number, plural, one {Zbývá # minuta} few {Zbývají # minuty} many {Zbývá # minut} other {Zbývá # minut}}",
|
||||
|
@ -727,6 +877,11 @@
|
|||
"upload_error.poll": "Nahrávání souborů není povoleno s anketami.",
|
||||
"upload_form.audio_description": "Popis pro sluchově postižené",
|
||||
"upload_form.description": "Popis pro zrakově postižené",
|
||||
"upload_form.drag_and_drop.instructions": "Chcete-li zvednout přílohu, stiskněte mezerník nebo enter. Při přetažení použijte klávesnicové šipky k přesunutí mediální přílohy v libovolném směru. Stiskněte mezerník nebo enter pro vložení přílohy do nové pozice, nebo stiskněte Esc pro ukončení.",
|
||||
"upload_form.drag_and_drop.on_drag_cancel": "Přetažení bylo zrušeno. Příloha {item} byla vrácena.",
|
||||
"upload_form.drag_and_drop.on_drag_end": "Příloha {item} byla vrácena.",
|
||||
"upload_form.drag_and_drop.on_drag_over": "Příloha {item} byla přesunuta.",
|
||||
"upload_form.drag_and_drop.on_drag_start": "Zvednuta příloha {item}.",
|
||||
"upload_form.edit": "Upravit",
|
||||
"upload_form.thumbnail": "Změnit miniaturu",
|
||||
"upload_form.video_description": "Popis pro sluchově či zrakově postižené",
|
||||
|
|
|
@ -457,6 +457,7 @@
|
|||
"keyboard_shortcuts.toggle_hidden": "Dangos/cuddio testun tu ôl i CW",
|
||||
"keyboard_shortcuts.toggle_sensitivity": "Dangos/cuddio cyfryngau",
|
||||
"keyboard_shortcuts.toot": "Dechrau post newydd",
|
||||
"keyboard_shortcuts.translate": "i gyfieithu postiad",
|
||||
"keyboard_shortcuts.unfocus": "Dad-ffocysu ardal cyfansoddi testun/chwilio",
|
||||
"keyboard_shortcuts.up": "Symud yn uwch yn y rhestr",
|
||||
"lightbox.close": "Cau",
|
||||
|
@ -835,6 +836,7 @@
|
|||
"status.reblogs.empty": "Does neb wedi hybio'r post yma eto. Pan y bydd rhywun yn gwneud, byddent yn ymddangos yma.",
|
||||
"status.redraft": "Dileu ac ailddrafftio",
|
||||
"status.remove_bookmark": "Tynnu nod tudalen",
|
||||
"status.remove_favourite": "Tynnu o'r ffefrynnau",
|
||||
"status.replied_in_thread": "Atebodd mewn edefyn",
|
||||
"status.replied_to": "Wedi ateb {name}",
|
||||
"status.reply": "Ateb",
|
||||
|
|
|
@ -457,6 +457,7 @@
|
|||
"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.translate": "for at oversætte et indlæg",
|
||||
"keyboard_shortcuts.unfocus": "Fjern fokus fra tekstskrivningsområde/søgning",
|
||||
"keyboard_shortcuts.up": "Flyt opad på listen",
|
||||
"lightbox.close": "Luk",
|
||||
|
@ -481,6 +482,7 @@
|
|||
"lists.exclusive": "Skjul medlemmer i Hjem",
|
||||
"lists.exclusive_hint": "Er nogen er på denne liste, skjul personen i hjemme-feeds for at undgå at se vedkommendes indlæg to gange.",
|
||||
"lists.find_users_to_add": "Find brugere at tilføje",
|
||||
"lists.list_members": "Liste over medlemmer",
|
||||
"lists.list_members_count": "{count, plural, one {# medlem} other {# medlemmer}}",
|
||||
"lists.list_name": "Listetitel",
|
||||
"lists.new_list_name": "Ny listetitel",
|
||||
|
|
|
@ -457,6 +457,7 @@
|
|||
"keyboard_shortcuts.toggle_hidden": "Beitragstext hinter der Inhaltswarnung anzeigen/ausblenden",
|
||||
"keyboard_shortcuts.toggle_sensitivity": "Medien anzeigen/ausblenden",
|
||||
"keyboard_shortcuts.toot": "Neuen Beitrag erstellen",
|
||||
"keyboard_shortcuts.translate": "Beitrag übersetzen",
|
||||
"keyboard_shortcuts.unfocus": "Eingabefeld/Suche nicht mehr fokussieren",
|
||||
"keyboard_shortcuts.up": "Ansicht nach oben bewegen",
|
||||
"lightbox.close": "Schließen",
|
||||
|
|
|
@ -863,7 +863,7 @@
|
|||
"time_remaining.minutes": "απομένουν {number, plural, one {# λεπτό} other {# λεπτά}}",
|
||||
"time_remaining.moments": "Στιγμές που απομένουν",
|
||||
"time_remaining.seconds": "απομένουν {number, plural, one {# δευτερόλεπτο} other {# δευτερόλεπτα}}",
|
||||
"trends.counter_by_accounts": "{count, plural, one {{counter} άτομο} other {{counter} άτομα} }{days, plural, one { την τελευταία ημέρα} other { τις τελευταίες {days} ημέρες}}",
|
||||
"trends.counter_by_accounts": "{count, plural, one {{counter} άτομο} other {{counter} άτομα}} {days, plural, one {την τελευταία ημέρα} other {τις τελευταίες {days} ημέρες}}",
|
||||
"trends.trending_now": "Δημοφιλή τώρα",
|
||||
"ui.beforeunload": "Το προσχέδιό σου θα χαθεί αν φύγεις από το Mastodon.",
|
||||
"units.short.billion": "{count}Δις",
|
||||
|
|
|
@ -457,6 +457,7 @@
|
|||
"keyboard_shortcuts.toggle_hidden": "Montri/kaŝi tekston malantaŭ CW",
|
||||
"keyboard_shortcuts.toggle_sensitivity": "Montri/kaŝi plurmedion",
|
||||
"keyboard_shortcuts.toot": "Komencu novan afiŝon",
|
||||
"keyboard_shortcuts.translate": "Traduki afiŝon",
|
||||
"keyboard_shortcuts.unfocus": "Senfokusigi verki tekstareon/serĉon",
|
||||
"keyboard_shortcuts.up": "Movu supren en la listo",
|
||||
"lightbox.close": "Fermi",
|
||||
|
|
|
@ -457,6 +457,7 @@
|
|||
"keyboard_shortcuts.toggle_hidden": "Mostrar/ocultar texto detrás de la advertencia de contenido (\"CW\")",
|
||||
"keyboard_shortcuts.toggle_sensitivity": "Mostrar/ocultar medios",
|
||||
"keyboard_shortcuts.toot": "Comenzar un mensaje nuevo",
|
||||
"keyboard_shortcuts.translate": "para traducir un mensaje",
|
||||
"keyboard_shortcuts.unfocus": "Quitar el foco del área de texto de redacción o de búsqueda",
|
||||
"keyboard_shortcuts.up": "Subir en la lista",
|
||||
"lightbox.close": "Cerrar",
|
||||
|
|
|
@ -457,6 +457,7 @@
|
|||
"keyboard_shortcuts.toggle_hidden": "mostrar/ocultar texto tras aviso de contenido (CW)",
|
||||
"keyboard_shortcuts.toggle_sensitivity": "mostrar/ocultar medios",
|
||||
"keyboard_shortcuts.toot": "Comenzar una nueva publicación",
|
||||
"keyboard_shortcuts.translate": "para traducir una publicación",
|
||||
"keyboard_shortcuts.unfocus": "para retirar el foco de la caja de redacción/búsqueda",
|
||||
"keyboard_shortcuts.up": "para ir hacia arriba en la lista",
|
||||
"lightbox.close": "Cerrar",
|
||||
|
|
|
@ -457,6 +457,7 @@
|
|||
"keyboard_shortcuts.toggle_hidden": "mostrar/ocultar texto tras aviso de contenido (CW)",
|
||||
"keyboard_shortcuts.toggle_sensitivity": "mostrar/ocultar medios",
|
||||
"keyboard_shortcuts.toot": "Comienza una nueva publicación",
|
||||
"keyboard_shortcuts.translate": "para traducir una publicación",
|
||||
"keyboard_shortcuts.unfocus": "para retirar el foco de la caja de redacción/búsqueda",
|
||||
"keyboard_shortcuts.up": "para ir hacia arriba en la lista",
|
||||
"lightbox.close": "Cerrar",
|
||||
|
|
|
@ -104,6 +104,7 @@
|
|||
"annual_report.summary.most_used_hashtag.none": "Ei mitään",
|
||||
"annual_report.summary.new_posts.new_posts": "uutta julkaisua",
|
||||
"annual_report.summary.percentile.text": "<topLabel>Olet osa huippujoukkoa, johon kuuluu</topLabel><percentage></percentage><bottomLabel>{domain}-käyttäjistä.</bottomLabel>",
|
||||
"annual_report.summary.percentile.we_wont_tell_bernie": "Emme kerro Bernie Sandersille.",
|
||||
"annual_report.summary.thanks": "Kiitos, että olet osa Mastodonia!",
|
||||
"attachments_list.unprocessed": "(käsittelemätön)",
|
||||
"audio.hide": "Piilota ääni",
|
||||
|
@ -456,6 +457,7 @@
|
|||
"keyboard_shortcuts.toggle_hidden": "Näytä tai piilota sisältövaroituksella merkitty teksti",
|
||||
"keyboard_shortcuts.toggle_sensitivity": "Näytä tai piilota media",
|
||||
"keyboard_shortcuts.toot": "Luo uusi julkaisu",
|
||||
"keyboard_shortcuts.translate": "Käännä julkaisu",
|
||||
"keyboard_shortcuts.unfocus": "Poistu kirjoitus- tai hakukentästä",
|
||||
"keyboard_shortcuts.up": "Siirry luettelossa taaksepäin",
|
||||
"lightbox.close": "Sulje",
|
||||
|
|
|
@ -34,7 +34,9 @@
|
|||
"account.follow_back": "Sundan pabalik",
|
||||
"account.followers": "Mga tagasunod",
|
||||
"account.followers.empty": "Wala pang sumusunod sa tagagamit na ito.",
|
||||
"account.followers_counter": "{count, plural, one {{counter} tagasunod} other {{counter} tagasunod}}",
|
||||
"account.following": "Sinusundan",
|
||||
"account.following_counter": "{count, plural, one {{counter} sinusundan} other {{counter} sinusundan}}",
|
||||
"account.follows.empty": "Wala pang sinusundan ang tagagamit na ito.",
|
||||
"account.go_to_profile": "Pumunta sa profile",
|
||||
"account.hide_reblogs": "Itago ang mga pagpapalakas mula sa {name}",
|
||||
|
@ -46,14 +48,21 @@
|
|||
"account.media": "Medya",
|
||||
"account.mention": "Banggitin si @{name}",
|
||||
"account.moved_to": "Ipinahihiwatig ni {name} na ang kanilang bagong account ngayon ay:",
|
||||
"account.mute": "I-mute si @{name}",
|
||||
"account.mute_notifications_short": "I-mute ang mga abiso",
|
||||
"account.mute_short": "I-mute",
|
||||
"account.muted": "Naka-mute",
|
||||
"account.mutual": "Ka-mutual",
|
||||
"account.no_bio": "Walang nakalaan na paglalarawan.",
|
||||
"account.open_original_page": "Buksan ang pinagmulang pahina",
|
||||
"account.posts": "Mga post",
|
||||
"account.report": "I-ulat si/ang @{name}",
|
||||
"account.requested": "Naghihintay ng pag-apruba. I-click upang ikansela ang hiling sa pagsunod",
|
||||
"account.requested_follow": "Hinihiling ni {name} na sundan ka",
|
||||
"account.share": "Ibahagi ang profile ni @{name}",
|
||||
"account.show_reblogs": "Ipakita ang mga pagpapalakas mula sa/kay {name}",
|
||||
"account.unendorse": "Huwag itampok sa profile",
|
||||
"account.unfollow": "Huwag nang sundan",
|
||||
"admin.dashboard.retention.cohort_size": "Mga bagong tagagamit",
|
||||
"alert.rate_limited.message": "Mangyaring subukan muli pagkatapos ng {retry_time, time, medium}.",
|
||||
"audio.hide": "Itago ang tunog",
|
||||
|
@ -355,6 +364,7 @@
|
|||
"status.more": "Higit pa",
|
||||
"status.read_more": "Basahin ang higit pa",
|
||||
"status.reblogs.empty": "Wala pang nagpalakas ng post na ito. Kung may sinumang nagpalakas, makikita sila rito.",
|
||||
"status.remove_favourite": "Tanggalin sa mga paborito",
|
||||
"status.reply": "Tumugon",
|
||||
"status.report": "I-ulat si/ang @{name}",
|
||||
"status.sensitive_warning": "Sensitibong nilalaman",
|
||||
|
|
|
@ -362,6 +362,7 @@
|
|||
"footer.privacy_policy": "Privatlívspolitikkur",
|
||||
"footer.source_code": "Vís keldukotuna",
|
||||
"footer.status": "Støða",
|
||||
"footer.terms_of_service": "Tænastutreytir",
|
||||
"generic.saved": "Goymt",
|
||||
"getting_started.heading": "At byrja",
|
||||
"hashtag.admin_moderation": "Lat umsjónarmarkamót upp fyri #{name}",
|
||||
|
@ -456,6 +457,7 @@
|
|||
"keyboard_shortcuts.toggle_hidden": "Vís/fjal tekst handan CW",
|
||||
"keyboard_shortcuts.toggle_sensitivity": "Vís ella fjal innihald",
|
||||
"keyboard_shortcuts.toot": "Byrja nýggjan post",
|
||||
"keyboard_shortcuts.translate": "at umseta ein post",
|
||||
"keyboard_shortcuts.unfocus": "Tak skrivi-/leiti-økið úr miðdeplinum",
|
||||
"keyboard_shortcuts.up": "Flyt upp á listanum",
|
||||
"lightbox.close": "Lat aftur",
|
||||
|
@ -857,6 +859,7 @@
|
|||
"subscribed_languages.target": "Broyt haldaramál fyri {target}",
|
||||
"tabs_bar.home": "Heim",
|
||||
"tabs_bar.notifications": "Fráboðanir",
|
||||
"terms_of_service.title": "Tænastutreytir",
|
||||
"time_remaining.days": "{number, plural, one {# dagur} other {# dagar}} eftir",
|
||||
"time_remaining.hours": "{number, plural, one {# tími} other {# tímar}} eftir",
|
||||
"time_remaining.minutes": "{number, plural, one {# minuttur} other {# minuttir}} eftir",
|
||||
|
|
|
@ -457,6 +457,7 @@
|
|||
"keyboard_shortcuts.toggle_hidden": "Déplier/replier texte derrière avertissement",
|
||||
"keyboard_shortcuts.toggle_sensitivity": "Afficher/cacher médias",
|
||||
"keyboard_shortcuts.toot": "Commencer un nouveau message",
|
||||
"keyboard_shortcuts.translate": "traduire un message",
|
||||
"keyboard_shortcuts.unfocus": "Ne plus se concentrer sur la zone de rédaction/barre de recherche",
|
||||
"keyboard_shortcuts.up": "Monter dans la liste",
|
||||
"lightbox.close": "Fermer",
|
||||
|
|
|
@ -457,6 +457,7 @@
|
|||
"keyboard_shortcuts.toggle_hidden": "Déplier/replier le texte derrière un CW",
|
||||
"keyboard_shortcuts.toggle_sensitivity": "Afficher/cacher les médias",
|
||||
"keyboard_shortcuts.toot": "Commencer un nouveau message",
|
||||
"keyboard_shortcuts.translate": "traduire un message",
|
||||
"keyboard_shortcuts.unfocus": "Quitter la zone de rédaction/barre de recherche",
|
||||
"keyboard_shortcuts.up": "Monter dans la liste",
|
||||
"lightbox.close": "Fermer",
|
||||
|
|
|
@ -407,6 +407,13 @@
|
|||
"ignore_notifications_modal.not_followers_title": "An dtugann tú aird ar fhógraí ó dhaoine nach leanann tú?",
|
||||
"ignore_notifications_modal.not_following_title": "An ndéanann tú neamhaird de fhógraí ó dhaoine nach leanann tú?",
|
||||
"ignore_notifications_modal.private_mentions_title": "An dtugann tú aird ar fhógraí ó Luaintí Príobháideacha gan iarraidh?",
|
||||
"interaction_modal.action.favourite": "Chun leanúint ar aghaidh, ní mór duit an ceann is fearr leat ó do chuntas.",
|
||||
"interaction_modal.action.follow": "Chun leanúint ar aghaidh, ní mór duit leanúint ó do chuntas.",
|
||||
"interaction_modal.action.reblog": "Chun leanúint ar aghaidh, ní mór duit athbhlagáil ó do chuntas.",
|
||||
"interaction_modal.action.reply": "Chun leanúint ar aghaidh, ní mór duit freagra a thabhairt ó do chuntas.",
|
||||
"interaction_modal.action.vote": "Chun leanúint ar aghaidh, ní mór duit vótáil ó do chuntas.",
|
||||
"interaction_modal.go": "Téigh",
|
||||
"interaction_modal.no_account_yet": "Níl cuntas agat fós?",
|
||||
"interaction_modal.on_another_server": "Ar freastalaí eile",
|
||||
"interaction_modal.on_this_server": "Ar an freastalaí seo",
|
||||
"interaction_modal.title.favourite": "An postáil {name} is fearr leat",
|
||||
|
@ -414,6 +421,7 @@
|
|||
"interaction_modal.title.reblog": "Mol postáil de chuid {name}",
|
||||
"interaction_modal.title.reply": "Freagair postáil {name}",
|
||||
"interaction_modal.title.vote": "Vótáil i vótaíocht {name}",
|
||||
"interaction_modal.username_prompt": "M.sh. {example}",
|
||||
"intervals.full.days": "{number, plural, one {# lá} other {# lá}}",
|
||||
"intervals.full.hours": "{number, plural, one {# uair} other {# uair}}",
|
||||
"intervals.full.minutes": "{number, plural, one {# nóiméad} other {# nóiméad}}",
|
||||
|
@ -449,6 +457,7 @@
|
|||
"keyboard_shortcuts.toggle_hidden": "Taispeáin/folaigh an téacs taobh thiar de CW",
|
||||
"keyboard_shortcuts.toggle_sensitivity": "Taispeáin / cuir i bhfolach meáin",
|
||||
"keyboard_shortcuts.toot": "Cuir tús le postáil nua",
|
||||
"keyboard_shortcuts.translate": "post a aistriú",
|
||||
"keyboard_shortcuts.unfocus": "Unfocus cum textarea/search",
|
||||
"keyboard_shortcuts.up": "Bog suas ar an liosta",
|
||||
"lightbox.close": "Dún",
|
||||
|
@ -687,6 +696,8 @@
|
|||
"privacy_policy.title": "Polasaí príobháideachais",
|
||||
"recommended": "Molta",
|
||||
"refresh": "Athnuaigh",
|
||||
"regeneration_indicator.please_stand_by": "Fan i do sheasamh, le do thoil.",
|
||||
"regeneration_indicator.preparing_your_home_feed": "Ag ullmhú do bheatha baile…",
|
||||
"relative_time.days": "{number}l",
|
||||
"relative_time.full.days": "{number, plural, one {# lá} other {# lá}} ó shin",
|
||||
"relative_time.full.hours": "{number, plural, one {# uair} other {# uair}} ó shin",
|
||||
|
@ -826,6 +837,7 @@
|
|||
"status.reblogs.empty": "Níor mhol éinne an phostáil seo fós. Nuair a mholfaidh duine éigin í, taispeánfar anseo é sin.",
|
||||
"status.redraft": "Scrios ⁊ athdhréachtaigh",
|
||||
"status.remove_bookmark": "Bain leabharmharc",
|
||||
"status.remove_favourite": "Bain ó cheanáin",
|
||||
"status.replied_in_thread": "D'fhreagair sa snáithe",
|
||||
"status.replied_to": "D'fhreagair {name}",
|
||||
"status.reply": "Freagair",
|
||||
|
|
|
@ -457,6 +457,7 @@
|
|||
"keyboard_shortcuts.toggle_hidden": "Para mostrar o texto tras Aviso de Contido (CW)",
|
||||
"keyboard_shortcuts.toggle_sensitivity": "Para amosar/agochar contido multimedia",
|
||||
"keyboard_shortcuts.toot": "Para escribir unha nova publicación",
|
||||
"keyboard_shortcuts.translate": "para traducir unha publicación",
|
||||
"keyboard_shortcuts.unfocus": "Para deixar de destacar a área de escritura/procura",
|
||||
"keyboard_shortcuts.up": "Para mover cara arriba na listaxe",
|
||||
"lightbox.close": "Fechar",
|
||||
|
@ -836,6 +837,7 @@
|
|||
"status.reblogs.empty": "Aínda ninguén promoveu esta publicación. Cando alguén o faga, amosarase aquí.",
|
||||
"status.redraft": "Eliminar e reescribir",
|
||||
"status.remove_bookmark": "Eliminar marcador",
|
||||
"status.remove_favourite": "Retirar das favoritas",
|
||||
"status.replied_in_thread": "Respondeu nun fío",
|
||||
"status.replied_to": "Respondeu a {name}",
|
||||
"status.reply": "Responder",
|
||||
|
|
|
@ -457,6 +457,7 @@
|
|||
"keyboard_shortcuts.toggle_hidden": "הצגת/הסתרת טקסט מוסתר מאחורי אזהרת תוכן",
|
||||
"keyboard_shortcuts.toggle_sensitivity": "הצגת/הסתרת מדיה",
|
||||
"keyboard_shortcuts.toot": "להתחיל חיצרוץ חדש",
|
||||
"keyboard_shortcuts.translate": "לתרגם הודעה",
|
||||
"keyboard_shortcuts.unfocus": "לצאת מתיבת חיבור/חיפוש",
|
||||
"keyboard_shortcuts.up": "לנוע במעלה הרשימה",
|
||||
"lightbox.close": "סגירה",
|
||||
|
@ -836,6 +837,7 @@
|
|||
"status.reblogs.empty": "עוד לא הידהדו את ההודעה הזו. כאשר זה יקרה, ההדהודים יופיעו כאן.",
|
||||
"status.redraft": "מחיקה ועריכה מחדש",
|
||||
"status.remove_bookmark": "הסרת סימניה",
|
||||
"status.remove_favourite": "להסיר מרשימת המועדפים",
|
||||
"status.replied_in_thread": "תגובה לשרשור",
|
||||
"status.replied_to": "בתגובה לחשבון {name}",
|
||||
"status.reply": "תגובה",
|
||||
|
|
|
@ -440,7 +440,7 @@
|
|||
"keyboard_shortcuts.heading": "Gyorsbillentyűk",
|
||||
"keyboard_shortcuts.home": "Saját idővonal megnyitása",
|
||||
"keyboard_shortcuts.hotkey": "Gyorsbillentyű",
|
||||
"keyboard_shortcuts.legend": "jelmagyarázat megjelenítése",
|
||||
"keyboard_shortcuts.legend": "Jelmagyarázat megjelenítése",
|
||||
"keyboard_shortcuts.local": "Helyi idővonal megnyitása",
|
||||
"keyboard_shortcuts.mention": "Szerző megemlítése",
|
||||
"keyboard_shortcuts.muted": "Némított felhasználók listájának megnyitása",
|
||||
|
@ -453,10 +453,11 @@
|
|||
"keyboard_shortcuts.requests": "Követési kérések listájának megnyitása",
|
||||
"keyboard_shortcuts.search": "Fókuszálás a keresősávra",
|
||||
"keyboard_shortcuts.spoilers": "Tartalmi figyelmeztetés mező megjelenítése/elrejtése",
|
||||
"keyboard_shortcuts.start": "\"Első lépések\" oszlop megnyitása",
|
||||
"keyboard_shortcuts.start": "„Első lépések” oszlop megnyitása",
|
||||
"keyboard_shortcuts.toggle_hidden": "Tartalmi figyelmeztetéssel ellátott szöveg megjelenítése/elrejtése",
|
||||
"keyboard_shortcuts.toggle_sensitivity": "Média megjelenítése/elrejtése",
|
||||
"keyboard_shortcuts.toot": "Új bejegyzés írása",
|
||||
"keyboard_shortcuts.translate": "Bejegyzés lefordítása",
|
||||
"keyboard_shortcuts.unfocus": "Szerkesztés/keresés fókuszból való kivétele",
|
||||
"keyboard_shortcuts.up": "Mozgás felfelé a listában",
|
||||
"lightbox.close": "Bezárás",
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue