Compare commits
47 commits
6f29aea2fa
...
4d5c53d9c0
Author | SHA1 | Date | |
---|---|---|---|
4d5c53d9c0 | |||
|
ad52b04a1c | ||
|
8c8bee5a36 | ||
|
6c37529723 | ||
|
c244b70dc2 | ||
|
24bdba3413 | ||
|
631a5eec85 | ||
|
d436696f46 | ||
|
2ea9336b68 | ||
|
36592d10aa | ||
|
182b9248c0 | ||
|
9984fca9a0 | ||
|
8dea897a3b | ||
|
d0137910c6 | ||
|
c9f08f77ed | ||
|
967505ee9b | ||
|
ef2e48e6da | ||
|
3875bd138d | ||
|
7542a134d5 | ||
|
249b4117f9 | ||
|
f47d761e12 | ||
|
7a30c68953 | ||
|
0dd4595704 | ||
|
fa8e972722 | ||
|
f1300ad284 | ||
|
79b0e192d9 | ||
|
36d819bef3 | ||
|
1a37862a76 | ||
|
d41b43ed4f | ||
|
fd3bfc0710 | ||
|
c29fdadefd | ||
|
bd285cdd02 | ||
|
bd84817848 | ||
|
5c3ec727ec | ||
|
c5883e0999 | ||
|
981395e4d6 | ||
|
0899c91d4b | ||
|
1d35626dc7 | ||
|
63ba69810e | ||
|
8f5694d79e | ||
|
97eddb5906 | ||
|
016c1e4e78 | ||
|
05f0d51005 | ||
|
a16c2c99b5 | ||
|
81547845ac | ||
|
8c375d8a5c | ||
|
8de5df225e |
140 changed files with 1121 additions and 532 deletions
|
@ -1,5 +1,5 @@
|
||||||
# This is a sample configuration file. You can generate your configuration
|
# This is a sample configuration file. You can generate your configuration
|
||||||
# with the `rake mastodon:setup` interactive setup wizard, but to customize
|
# with the `bundle exec rails mastodon:setup` interactive setup wizard, but to customize
|
||||||
# your setup even further, you'll need to edit it manually. This sample does
|
# your setup even further, you'll need to edit it manually. This sample does
|
||||||
# not demonstrate all available configuration options. Please look at
|
# not demonstrate all available configuration options. Please look at
|
||||||
# https://docs.joinmastodon.org/admin/config/ for the full documentation.
|
# https://docs.joinmastodon.org/admin/config/ for the full documentation.
|
||||||
|
@ -40,14 +40,14 @@ ES_PASS=password
|
||||||
|
|
||||||
# Secrets
|
# Secrets
|
||||||
# -------
|
# -------
|
||||||
# Make sure to use `rake secret` to generate secrets
|
# Make sure to use `bundle exec rails secret` to generate secrets
|
||||||
# -------
|
# -------
|
||||||
SECRET_KEY_BASE=
|
SECRET_KEY_BASE=
|
||||||
OTP_SECRET=
|
OTP_SECRET=
|
||||||
|
|
||||||
# Web Push
|
# Web Push
|
||||||
# --------
|
# --------
|
||||||
# Generate with `rake mastodon:webpush:generate_vapid_key`
|
# Generate with `bundle exec rails mastodon:webpush:generate_vapid_key`
|
||||||
# --------
|
# --------
|
||||||
VAPID_PRIVATE_KEY=
|
VAPID_PRIVATE_KEY=
|
||||||
VAPID_PUBLIC_KEY=
|
VAPID_PUBLIC_KEY=
|
||||||
|
|
6
.github/workflows/bundler-audit.yml
vendored
6
.github/workflows/bundler-audit.yml
vendored
|
@ -1,8 +1,10 @@
|
||||||
name: Bundler Audit
|
name: Bundler Audit
|
||||||
on:
|
on:
|
||||||
|
merge_group:
|
||||||
push:
|
push:
|
||||||
branches-ignore:
|
branches:
|
||||||
- 'dependabot/**'
|
- 'main'
|
||||||
|
- 'stable-*'
|
||||||
paths:
|
paths:
|
||||||
- 'Gemfile*'
|
- 'Gemfile*'
|
||||||
- '.ruby-version'
|
- '.ruby-version'
|
||||||
|
|
8
.github/workflows/check-i18n.yml
vendored
8
.github/workflows/check-i18n.yml
vendored
|
@ -2,9 +2,13 @@ name: Check i18n
|
||||||
|
|
||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
branches: [main]
|
branches:
|
||||||
|
- 'main'
|
||||||
|
- 'stable-*'
|
||||||
pull_request:
|
pull_request:
|
||||||
branches: [main]
|
branches:
|
||||||
|
- 'main'
|
||||||
|
- 'stable-*'
|
||||||
|
|
||||||
env:
|
env:
|
||||||
RAILS_ENV: test
|
RAILS_ENV: test
|
||||||
|
|
10
.github/workflows/codeql.yml
vendored
10
.github/workflows/codeql.yml
vendored
|
@ -1,11 +1,15 @@
|
||||||
name: 'CodeQL'
|
name: 'CodeQL'
|
||||||
|
|
||||||
on:
|
on:
|
||||||
|
merge_group:
|
||||||
push:
|
push:
|
||||||
branches: ['main']
|
branches:
|
||||||
|
- 'main'
|
||||||
|
- 'stable-*'
|
||||||
pull_request:
|
pull_request:
|
||||||
# The branches below must be a subset of the branches above
|
branches:
|
||||||
branches: ['main']
|
- 'main'
|
||||||
|
- 'stable-*'
|
||||||
schedule:
|
schedule:
|
||||||
- cron: '22 6 * * 1'
|
- cron: '22 6 * * 1'
|
||||||
|
|
||||||
|
|
4
.github/workflows/crowdin-upload.yml
vendored
4
.github/workflows/crowdin-upload.yml
vendored
|
@ -1,9 +1,11 @@
|
||||||
name: Crowdin / Upload translations
|
name: Crowdin / Upload translations
|
||||||
|
|
||||||
on:
|
on:
|
||||||
|
merge_group:
|
||||||
push:
|
push:
|
||||||
branches:
|
branches:
|
||||||
- main
|
- 'main'
|
||||||
|
- 'stable-*'
|
||||||
paths:
|
paths:
|
||||||
- crowdin.yml
|
- crowdin.yml
|
||||||
- app/javascript/mastodon/locales/en.json
|
- app/javascript/mastodon/locales/en.json
|
||||||
|
|
4
.github/workflows/format-check.yml
vendored
4
.github/workflows/format-check.yml
vendored
|
@ -1,6 +1,10 @@
|
||||||
name: Check formatting
|
name: Check formatting
|
||||||
on:
|
on:
|
||||||
|
merge_group:
|
||||||
push:
|
push:
|
||||||
|
branches:
|
||||||
|
- 'main'
|
||||||
|
- 'stable-*'
|
||||||
pull_request:
|
pull_request:
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
|
|
7
.github/workflows/lint-css.yml
vendored
7
.github/workflows/lint-css.yml
vendored
|
@ -1,9 +1,10 @@
|
||||||
name: CSS Linting
|
name: CSS Linting
|
||||||
on:
|
on:
|
||||||
|
merge_group:
|
||||||
push:
|
push:
|
||||||
branches-ignore:
|
branches:
|
||||||
- 'dependabot/**'
|
- 'main'
|
||||||
- 'renovate/**'
|
- 'stable-*'
|
||||||
paths:
|
paths:
|
||||||
- 'package.json'
|
- 'package.json'
|
||||||
- 'yarn.lock'
|
- 'yarn.lock'
|
||||||
|
|
7
.github/workflows/lint-haml.yml
vendored
7
.github/workflows/lint-haml.yml
vendored
|
@ -1,9 +1,10 @@
|
||||||
name: Haml Linting
|
name: Haml Linting
|
||||||
on:
|
on:
|
||||||
|
merge_group:
|
||||||
push:
|
push:
|
||||||
branches-ignore:
|
branches:
|
||||||
- 'dependabot/**'
|
- 'main'
|
||||||
- 'renovate/**'
|
- 'stable-*'
|
||||||
paths:
|
paths:
|
||||||
- '.github/workflows/haml-lint-problem-matcher.json'
|
- '.github/workflows/haml-lint-problem-matcher.json'
|
||||||
- '.github/workflows/lint-haml.yml'
|
- '.github/workflows/lint-haml.yml'
|
||||||
|
|
7
.github/workflows/lint-js.yml
vendored
7
.github/workflows/lint-js.yml
vendored
|
@ -1,9 +1,10 @@
|
||||||
name: JavaScript Linting
|
name: JavaScript Linting
|
||||||
on:
|
on:
|
||||||
|
merge_group:
|
||||||
push:
|
push:
|
||||||
branches-ignore:
|
branches:
|
||||||
- 'dependabot/**'
|
- 'main'
|
||||||
- 'renovate/**'
|
- 'stable-*'
|
||||||
paths:
|
paths:
|
||||||
- 'package.json'
|
- 'package.json'
|
||||||
- 'yarn.lock'
|
- 'yarn.lock'
|
||||||
|
|
7
.github/workflows/lint-ruby.yml
vendored
7
.github/workflows/lint-ruby.yml
vendored
|
@ -1,9 +1,10 @@
|
||||||
name: Ruby Linting
|
name: Ruby Linting
|
||||||
on:
|
on:
|
||||||
|
merge_group:
|
||||||
push:
|
push:
|
||||||
branches-ignore:
|
branches:
|
||||||
- 'dependabot/**'
|
- 'main'
|
||||||
- 'renovate/**'
|
- 'stable-*'
|
||||||
paths:
|
paths:
|
||||||
- 'Gemfile*'
|
- 'Gemfile*'
|
||||||
- '.rubocop*.yml'
|
- '.rubocop*.yml'
|
||||||
|
|
7
.github/workflows/test-js.yml
vendored
7
.github/workflows/test-js.yml
vendored
|
@ -1,9 +1,10 @@
|
||||||
name: JavaScript Testing
|
name: JavaScript Testing
|
||||||
on:
|
on:
|
||||||
|
merge_group:
|
||||||
push:
|
push:
|
||||||
branches-ignore:
|
branches:
|
||||||
- 'dependabot/**'
|
- 'main'
|
||||||
- 'renovate/**'
|
- 'stable-*'
|
||||||
paths:
|
paths:
|
||||||
- 'package.json'
|
- 'package.json'
|
||||||
- 'yarn.lock'
|
- 'yarn.lock'
|
||||||
|
|
34
.github/workflows/test-migrations.yml
vendored
34
.github/workflows/test-migrations.yml
vendored
|
@ -1,29 +1,29 @@
|
||||||
name: Historical data migration test
|
name: Historical data migration test
|
||||||
|
|
||||||
on:
|
on:
|
||||||
|
merge_group:
|
||||||
push:
|
push:
|
||||||
branches-ignore:
|
branches:
|
||||||
- 'dependabot/**'
|
- 'main'
|
||||||
- 'renovate/**'
|
- 'stable-*'
|
||||||
|
paths:
|
||||||
|
- 'Gemfile*'
|
||||||
|
- '.ruby-version'
|
||||||
|
- '**/*.rb'
|
||||||
|
- '.github/workflows/test-migrations.yml'
|
||||||
|
- 'lib/tasks/tests.rake'
|
||||||
|
|
||||||
pull_request:
|
pull_request:
|
||||||
|
paths:
|
||||||
|
- 'Gemfile*'
|
||||||
|
- '.ruby-version'
|
||||||
|
- '**/*.rb'
|
||||||
|
- '.github/workflows/test-migrations.yml'
|
||||||
|
- 'lib/tasks/tests.rake'
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
pre_job:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
|
|
||||||
outputs:
|
|
||||||
should_skip: ${{ steps.skip_check.outputs.should_skip }}
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- id: skip_check
|
|
||||||
uses: fkirc/skip-duplicate-actions@v5
|
|
||||||
with:
|
|
||||||
paths: '["Gemfile*", ".ruby-version", "**/*.rb", ".github/workflows/test-migrations.yml", "lib/tasks/tests.rake"]'
|
|
||||||
|
|
||||||
test:
|
test:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
needs: pre_job
|
|
||||||
if: needs.pre_job.outputs.should_skip != 'true'
|
|
||||||
|
|
||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
|
|
9
.github/workflows/test-ruby.yml
vendored
9
.github/workflows/test-ruby.yml
vendored
|
@ -1,10 +1,11 @@
|
||||||
name: Ruby Testing
|
name: Ruby Testing
|
||||||
|
|
||||||
on:
|
on:
|
||||||
|
merge_group:
|
||||||
push:
|
push:
|
||||||
branches-ignore:
|
branches:
|
||||||
- 'dependabot/**'
|
- 'main'
|
||||||
- 'renovate/**'
|
- 'stable-*'
|
||||||
pull_request:
|
pull_request:
|
||||||
|
|
||||||
env:
|
env:
|
||||||
|
@ -223,7 +224,7 @@ jobs:
|
||||||
- name: Load database schema
|
- name: Load database schema
|
||||||
run: './bin/rails db:create db:schema:load db:seed'
|
run: './bin/rails db:create db:schema:load db:seed'
|
||||||
|
|
||||||
- run: bin/rspec --tag paperclip_processing
|
- run: bin/rspec --tag attachment_processing
|
||||||
|
|
||||||
- name: Upload coverage reports to Codecov
|
- name: Upload coverage reports to Codecov
|
||||||
if: matrix.ruby-version == '.ruby-version'
|
if: matrix.ruby-version == '.ruby-version'
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
3.3.3
|
3.3.4
|
||||||
|
|
|
@ -12,7 +12,7 @@ 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.3.x"]
|
||||||
# renovate: datasource=docker depName=docker.io/ruby
|
# renovate: datasource=docker depName=docker.io/ruby
|
||||||
ARG RUBY_VERSION="3.3.3"
|
ARG RUBY_VERSION="3.3.4"
|
||||||
# # Node version to use in base image, change with [--build-arg NODE_MAJOR_VERSION="20"]
|
# # Node version to use in base image, change with [--build-arg NODE_MAJOR_VERSION="20"]
|
||||||
# renovate: datasource=node-version depName=node
|
# renovate: datasource=node-version depName=node
|
||||||
ARG NODE_MAJOR_VERSION="20"
|
ARG NODE_MAJOR_VERSION="20"
|
||||||
|
@ -67,7 +67,9 @@ ENV \
|
||||||
# Optimize jemalloc 5.x performance
|
# Optimize jemalloc 5.x performance
|
||||||
MALLOC_CONF="narenas:2,background_thread:true,thp:never,dirty_decay_ms:1000,muzzy_decay_ms:0" \
|
MALLOC_CONF="narenas:2,background_thread:true,thp:never,dirty_decay_ms:1000,muzzy_decay_ms:0" \
|
||||||
# Enable libvips, should not be changed
|
# Enable libvips, should not be changed
|
||||||
MASTODON_USE_LIBVIPS=true
|
MASTODON_USE_LIBVIPS=true \
|
||||||
|
# Sidekiq will touch tmp/sidekiq_process_has_started_and_will_begin_processing_jobs to indicate it is ready. This can be used for a readiness check in Kubernetes
|
||||||
|
MASTODON_SIDEKIQ_READY_FILENAME=sidekiq_process_has_started_and_will_begin_processing_jobs
|
||||||
|
|
||||||
# Set default shell used for running commands
|
# Set default shell used for running commands
|
||||||
SHELL ["/bin/bash", "-o", "pipefail", "-o", "errexit", "-c"]
|
SHELL ["/bin/bash", "-o", "pipefail", "-o", "errexit", "-c"]
|
||||||
|
|
14
Gemfile.lock
14
Gemfile.lock
|
@ -159,7 +159,7 @@ GEM
|
||||||
case_transform (0.2)
|
case_transform (0.2)
|
||||||
activesupport
|
activesupport
|
||||||
cbor (0.5.9.8)
|
cbor (0.5.9.8)
|
||||||
charlock_holmes (0.7.8)
|
charlock_holmes (0.7.9)
|
||||||
chewy (7.6.0)
|
chewy (7.6.0)
|
||||||
activesupport (>= 5.2)
|
activesupport (>= 5.2)
|
||||||
elasticsearch (>= 7.14.0, < 8)
|
elasticsearch (>= 7.14.0, < 8)
|
||||||
|
@ -346,7 +346,7 @@ GEM
|
||||||
activesupport (>= 3.0)
|
activesupport (>= 3.0)
|
||||||
nokogiri (>= 1.6)
|
nokogiri (>= 1.6)
|
||||||
io-console (0.7.2)
|
io-console (0.7.2)
|
||||||
irb (1.13.2)
|
irb (1.14.0)
|
||||||
rdoc (>= 4.0.0)
|
rdoc (>= 4.0.0)
|
||||||
reline (>= 0.4.2)
|
reline (>= 0.4.2)
|
||||||
jmespath (1.6.2)
|
jmespath (1.6.2)
|
||||||
|
@ -583,7 +583,7 @@ GEM
|
||||||
orm_adapter (0.5.0)
|
orm_adapter (0.5.0)
|
||||||
ox (2.14.18)
|
ox (2.14.18)
|
||||||
parallel (1.25.1)
|
parallel (1.25.1)
|
||||||
parser (3.3.3.0)
|
parser (3.3.4.0)
|
||||||
ast (~> 2.4.1)
|
ast (~> 2.4.1)
|
||||||
racc
|
racc
|
||||||
parslet (2.0.0)
|
parslet (2.0.0)
|
||||||
|
@ -733,13 +733,13 @@ GEM
|
||||||
rspec-mocks (~> 3.0)
|
rspec-mocks (~> 3.0)
|
||||||
sidekiq (>= 5, < 8)
|
sidekiq (>= 5, < 8)
|
||||||
rspec-support (3.13.1)
|
rspec-support (3.13.1)
|
||||||
rubocop (1.64.1)
|
rubocop (1.65.0)
|
||||||
json (~> 2.3)
|
json (~> 2.3)
|
||||||
language_server-protocol (>= 3.17.0)
|
language_server-protocol (>= 3.17.0)
|
||||||
parallel (~> 1.10)
|
parallel (~> 1.10)
|
||||||
parser (>= 3.3.0.2)
|
parser (>= 3.3.0.2)
|
||||||
rainbow (>= 2.2.2, < 4.0)
|
rainbow (>= 2.2.2, < 4.0)
|
||||||
regexp_parser (>= 1.8, < 3.0)
|
regexp_parser (>= 2.4, < 3.0)
|
||||||
rexml (>= 3.2.5, < 4.0)
|
rexml (>= 3.2.5, < 4.0)
|
||||||
rubocop-ast (>= 1.31.1, < 2.0)
|
rubocop-ast (>= 1.31.1, < 2.0)
|
||||||
ruby-progressbar (~> 1.7)
|
ruby-progressbar (~> 1.7)
|
||||||
|
@ -793,10 +793,10 @@ GEM
|
||||||
redis (>= 4.5.0, < 5)
|
redis (>= 4.5.0, < 5)
|
||||||
sidekiq-bulk (0.2.0)
|
sidekiq-bulk (0.2.0)
|
||||||
sidekiq
|
sidekiq
|
||||||
sidekiq-scheduler (5.0.3)
|
sidekiq-scheduler (5.0.5)
|
||||||
rufus-scheduler (~> 3.2)
|
rufus-scheduler (~> 3.2)
|
||||||
sidekiq (>= 6, < 8)
|
sidekiq (>= 6, < 8)
|
||||||
tilt (>= 1.4.0)
|
tilt (>= 1.4.0, < 3)
|
||||||
sidekiq-unique-jobs (7.1.33)
|
sidekiq-unique-jobs (7.1.33)
|
||||||
brpoplpush-redis_script (> 0.1.1, <= 2.0.0)
|
brpoplpush-redis_script (> 0.1.1, <= 2.0.0)
|
||||||
concurrent-ruby (~> 1.0, >= 1.0.5)
|
concurrent-ruby (~> 1.0, >= 1.0.5)
|
||||||
|
|
|
@ -8,7 +8,7 @@ class Api::V1::Polls::VotesController < Api::BaseController
|
||||||
before_action :set_poll
|
before_action :set_poll
|
||||||
|
|
||||||
def create
|
def create
|
||||||
VoteService.new.call(current_account, @poll, vote_params[:choices])
|
VoteService.new.call(current_account, @poll, vote_params)
|
||||||
render json: @poll, serializer: REST::PollSerializer
|
render json: @poll, serializer: REST::PollSerializer
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -22,6 +22,6 @@ class Api::V1::Polls::VotesController < Api::BaseController
|
||||||
end
|
end
|
||||||
|
|
||||||
def vote_params
|
def vote_params
|
||||||
params.permit(choices: [])
|
params.require(:choices)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -279,7 +279,7 @@ export function submitComposeFail(error) {
|
||||||
|
|
||||||
export function uploadCompose(files) {
|
export function uploadCompose(files) {
|
||||||
return function (dispatch, getState) {
|
return function (dispatch, getState) {
|
||||||
const uploadLimit = 4;
|
const uploadLimit = getState().getIn(['server', 'server', 'configuration', 'statuses', 'max_media_attachments']);
|
||||||
const media = getState().getIn(['compose', 'media_attachments']);
|
const media = getState().getIn(['compose', 'media_attachments']);
|
||||||
const pending = getState().getIn(['compose', 'pending_media_attachments']);
|
const pending = getState().getIn(['compose', 'pending_media_attachments']);
|
||||||
const progress = new Array(files.length).fill(0);
|
const progress = new Array(files.length).fill(0);
|
||||||
|
@ -299,7 +299,7 @@ export function uploadCompose(files) {
|
||||||
dispatch(uploadComposeRequest());
|
dispatch(uploadComposeRequest());
|
||||||
|
|
||||||
for (const [i, file] of Array.from(files).entries()) {
|
for (const [i, file] of Array.from(files).entries()) {
|
||||||
if (media.size + i > 3) break;
|
if (media.size + i > (uploadLimit - 1)) break;
|
||||||
|
|
||||||
const data = new FormData();
|
const data = new FormData();
|
||||||
data.append('file', file);
|
data.append('file', file);
|
||||||
|
|
|
@ -131,7 +131,7 @@ const Account = ({ size = 46, account, onFollow, onBlock, onMute, onMuteNotifica
|
||||||
return (
|
return (
|
||||||
<div className={classNames('account', { 'account--minimal': minimal })}>
|
<div className={classNames('account', { 'account--minimal': minimal })}>
|
||||||
<div className='account__wrapper'>
|
<div className='account__wrapper'>
|
||||||
<Link key={account.get('id')} className='account__display-name' title={account.get('acct')} to={`/@${account.get('acct')}`}>
|
<Link key={account.get('id')} className='account__display-name' title={account.get('acct')} to={`/@${account.get('acct')}`} data-hover-card-account={account.get('id')}>
|
||||||
<div className='account__avatar-wrapper'>
|
<div className='account__avatar-wrapper'>
|
||||||
<Avatar account={account} size={size} />
|
<Avatar account={account} size={size} />
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -43,6 +43,7 @@ export const HoverCardController: React.FC = () => {
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
let isScrolling = false;
|
let isScrolling = false;
|
||||||
let currentAnchor: HTMLElement | null = null;
|
let currentAnchor: HTMLElement | null = null;
|
||||||
|
let currentTitle: string | null = null;
|
||||||
|
|
||||||
const open = (target: HTMLElement) => {
|
const open = (target: HTMLElement) => {
|
||||||
target.setAttribute('aria-describedby', 'hover-card');
|
target.setAttribute('aria-describedby', 'hover-card');
|
||||||
|
@ -75,6 +76,9 @@ export const HoverCardController: React.FC = () => {
|
||||||
currentAnchor?.removeAttribute('aria-describedby');
|
currentAnchor?.removeAttribute('aria-describedby');
|
||||||
currentAnchor = target;
|
currentAnchor = target;
|
||||||
|
|
||||||
|
currentTitle = target.getAttribute('title');
|
||||||
|
target.removeAttribute('title');
|
||||||
|
|
||||||
setEnterTimeout(() => {
|
setEnterTimeout(() => {
|
||||||
open(target);
|
open(target);
|
||||||
}, enterDelay);
|
}, enterDelay);
|
||||||
|
@ -90,11 +94,20 @@ export const HoverCardController: React.FC = () => {
|
||||||
};
|
};
|
||||||
|
|
||||||
const handleMouseLeave = (e: MouseEvent) => {
|
const handleMouseLeave = (e: MouseEvent) => {
|
||||||
|
const { target } = e;
|
||||||
|
|
||||||
if (!currentAnchor) {
|
if (!currentAnchor) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (e.target === currentAnchor || e.target === cardRef.current) {
|
if (
|
||||||
|
currentTitle &&
|
||||||
|
target instanceof HTMLElement &&
|
||||||
|
target === currentAnchor
|
||||||
|
)
|
||||||
|
target.setAttribute('title', currentTitle);
|
||||||
|
|
||||||
|
if (target === currentAnchor || target === cardRef.current) {
|
||||||
cancelEnterTimeout();
|
cancelEnterTimeout();
|
||||||
|
|
||||||
setLeaveTimeout(() => {
|
setLeaveTimeout(() => {
|
||||||
|
|
|
@ -305,13 +305,13 @@ class MediaGallery extends PureComponent {
|
||||||
style.aspectRatio = '3 / 2';
|
style.aspectRatio = '3 / 2';
|
||||||
}
|
}
|
||||||
|
|
||||||
const size = media.take(4).size;
|
const size = media.size;
|
||||||
const uncached = media.every(attachment => attachment.get('type') === 'unknown');
|
const uncached = media.every(attachment => attachment.get('type') === 'unknown');
|
||||||
|
|
||||||
if (this.isFullSizeEligible()) {
|
if (this.isFullSizeEligible()) {
|
||||||
children = <Item standalone autoplay={autoplay} onClick={this.handleClick} attachment={media.get(0)} lang={lang} displayWidth={width} visible={visible} />;
|
children = <Item standalone autoplay={autoplay} onClick={this.handleClick} attachment={media.get(0)} lang={lang} displayWidth={width} visible={visible} />;
|
||||||
} else {
|
} else {
|
||||||
children = media.take(4).map((attachment, i) => <Item key={attachment.get('id')} autoplay={autoplay} onClick={this.handleClick} attachment={attachment} index={i} lang={lang} size={size} displayWidth={width} visible={visible || uncached} />);
|
children = media.map((attachment, i) => <Item key={attachment.get('id')} autoplay={autoplay} onClick={this.handleClick} attachment={attachment} index={i} lang={lang} size={size} displayWidth={width} visible={visible || uncached} />);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (uncached) {
|
if (uncached) {
|
||||||
|
|
|
@ -562,7 +562,7 @@ class Status extends ImmutablePureComponent {
|
||||||
<RelativeTimestamp timestamp={status.get('created_at')} />{status.get('edited_at') && <abbr title={intl.formatMessage(messages.edited, { date: intl.formatDate(status.get('edited_at'), { year: 'numeric', month: 'short', day: '2-digit', hour: '2-digit', minute: '2-digit' }) })}> *</abbr>}
|
<RelativeTimestamp timestamp={status.get('created_at')} />{status.get('edited_at') && <abbr title={intl.formatMessage(messages.edited, { date: intl.formatDate(status.get('edited_at'), { year: 'numeric', month: 'short', day: '2-digit', hour: '2-digit', minute: '2-digit' }) })}> *</abbr>}
|
||||||
</a>
|
</a>
|
||||||
|
|
||||||
<a onClick={this.handleAccountClick} href={`/@${status.getIn(['account', 'acct'])}`} data-hover-card-account={status.getIn(['account', 'id'])} className='status__display-name' target='_blank' rel='noopener noreferrer'>
|
<a onClick={this.handleAccountClick} href={`/@${status.getIn(['account', 'acct'])}`} title={status.getIn(['account', 'acct'])} data-hover-card-account={status.getIn(['account', 'id'])} className='status__display-name' target='_blank' rel='noopener noreferrer'>
|
||||||
<div className='status__avatar'>
|
<div className='status__avatar'>
|
||||||
{statusAvatar}
|
{statusAvatar}
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -116,7 +116,7 @@ class StatusContent extends PureComponent {
|
||||||
|
|
||||||
if (mention) {
|
if (mention) {
|
||||||
link.addEventListener('click', this.onMentionClick.bind(this, mention), false);
|
link.addEventListener('click', this.onMentionClick.bind(this, mention), false);
|
||||||
link.removeAttribute('title');
|
link.setAttribute('title', `@${mention.get('acct')}`);
|
||||||
link.setAttribute('href', `/@${mention.get('acct')}`);
|
link.setAttribute('href', `/@${mention.get('acct')}`);
|
||||||
link.setAttribute('data-hover-card-account', mention.get('id'));
|
link.setAttribute('data-hover-card-account', mention.get('id'));
|
||||||
} else if (link.textContent[0] === '#' || (link.previousSibling && link.previousSibling.textContent && link.previousSibling.textContent[link.previousSibling.textContent.length - 1] === '#')) {
|
} else if (link.textContent[0] === '#' || (link.previousSibling && link.previousSibling.textContent && link.previousSibling.textContent[link.previousSibling.textContent.length - 1] === '#')) {
|
||||||
|
|
|
@ -9,7 +9,7 @@ const mapStateToProps = state => {
|
||||||
const readyAttachmentsSize = state.getIn(['compose', 'media_attachments']).size ?? 0;
|
const readyAttachmentsSize = state.getIn(['compose', 'media_attachments']).size ?? 0;
|
||||||
const pendingAttachmentsSize = state.getIn(['compose', 'pending_media_attachments']).size ?? 0;
|
const pendingAttachmentsSize = state.getIn(['compose', 'pending_media_attachments']).size ?? 0;
|
||||||
const attachmentsSize = readyAttachmentsSize + pendingAttachmentsSize;
|
const attachmentsSize = readyAttachmentsSize + pendingAttachmentsSize;
|
||||||
const isOverLimit = attachmentsSize > 3;
|
const isOverLimit = attachmentsSize > state.getIn(['server', 'server', 'configuration', 'statuses', 'max_media_attachments'])-1;
|
||||||
const hasVideoOrAudio = state.getIn(['compose', 'media_attachments']).some(m => ['video', 'audio'].includes(m.get('type')));
|
const hasVideoOrAudio = state.getIn(['compose', 'media_attachments']).some(m => ['video', 'audio'].includes(m.get('type')));
|
||||||
|
|
||||||
return {
|
return {
|
||||||
|
|
|
@ -435,7 +435,7 @@ class Notification extends ImmutablePureComponent {
|
||||||
|
|
||||||
const targetAccount = report.get('target_account');
|
const targetAccount = report.get('target_account');
|
||||||
const targetDisplayNameHtml = { __html: targetAccount.get('display_name_html') };
|
const targetDisplayNameHtml = { __html: targetAccount.get('display_name_html') };
|
||||||
const targetLink = <bdi><Link className='notification__display-name' data-hover-card-account={targetAccount.get('id')} to={`/@${targetAccount.get('acct')}`} dangerouslySetInnerHTML={targetDisplayNameHtml} /></bdi>;
|
const targetLink = <bdi><Link className='notification__display-name' title={targetAccount.get('acct')} data-hover-card-account={targetAccount.get('id')} to={`/@${targetAccount.get('acct')}`} dangerouslySetInnerHTML={targetDisplayNameHtml} /></bdi>;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<HotKeys handlers={this.getHandlers()}>
|
<HotKeys handlers={this.getHandlers()}>
|
||||||
|
@ -458,7 +458,7 @@ class Notification extends ImmutablePureComponent {
|
||||||
const { notification } = this.props;
|
const { notification } = this.props;
|
||||||
const account = notification.get('account');
|
const account = notification.get('account');
|
||||||
const displayNameHtml = { __html: account.get('display_name_html') };
|
const displayNameHtml = { __html: account.get('display_name_html') };
|
||||||
const link = <bdi><Link className='notification__display-name' href={`/@${account.get('acct')}`} data-hover-card-account={account.get('id')} to={`/@${account.get('acct')}`} dangerouslySetInnerHTML={displayNameHtml} /></bdi>;
|
const link = <bdi><Link className='notification__display-name' href={`/@${account.get('acct')}`} title={account.get('acct')} data-hover-card-account={account.get('id')} to={`/@${account.get('acct')}`} dangerouslySetInnerHTML={displayNameHtml} /></bdi>;
|
||||||
|
|
||||||
switch(notification.get('type')) {
|
switch(notification.get('type')) {
|
||||||
case 'follow':
|
case 'follow':
|
||||||
|
|
|
@ -141,7 +141,7 @@ export default class Card extends PureComponent {
|
||||||
const showAuthor = !!card.getIn(['authors', 0, 'accountId']);
|
const showAuthor = !!card.getIn(['authors', 0, 'accountId']);
|
||||||
|
|
||||||
const description = (
|
const description = (
|
||||||
<div className='status-card__content'>
|
<div className='status-card__content' dir='auto'>
|
||||||
<span className='status-card__host'>
|
<span className='status-card__host'>
|
||||||
<span lang={language}>{provider}</span>
|
<span lang={language}>{provider}</span>
|
||||||
{card.get('published_at') && <> · <RelativeTimestamp timestamp={card.get('published_at')} /></>}
|
{card.get('published_at') && <> · <RelativeTimestamp timestamp={card.get('published_at')} /></>}
|
||||||
|
|
|
@ -25,7 +25,7 @@ import { clearHeight } from '../../actions/height_cache';
|
||||||
import { expandNotifications } from '../../actions/notifications';
|
import { expandNotifications } from '../../actions/notifications';
|
||||||
import { fetchServer, fetchServerTranslationLanguages } from '../../actions/server';
|
import { fetchServer, fetchServerTranslationLanguages } from '../../actions/server';
|
||||||
import { expandHomeTimeline } from '../../actions/timelines';
|
import { expandHomeTimeline } from '../../actions/timelines';
|
||||||
import initialState, { me, owner, singleUserMode, trendsEnabled, trendsAsLanding } from '../../initial_state';
|
import initialState, { me, owner, singleUserMode, trendsEnabled, trendsAsLanding, disableHoverCards } from '../../initial_state';
|
||||||
|
|
||||||
import BundleColumnError from './components/bundle_column_error';
|
import BundleColumnError from './components/bundle_column_error';
|
||||||
import Header from './components/header';
|
import Header from './components/header';
|
||||||
|
@ -588,7 +588,7 @@ class UI extends PureComponent {
|
||||||
|
|
||||||
{layout !== 'mobile' && <PictureInPicture />}
|
{layout !== 'mobile' && <PictureInPicture />}
|
||||||
<NotificationsContainer />
|
<NotificationsContainer />
|
||||||
<HoverCardController />
|
{!disableHoverCards && <HoverCardController />}
|
||||||
<LoadingBarContainer className='loading-bar' />
|
<LoadingBarContainer className='loading-bar' />
|
||||||
<ModalContainer />
|
<ModalContainer />
|
||||||
<UploadArea active={draggingOver} onClose={this.closeUploadModal} />
|
<UploadArea active={draggingOver} onClose={this.closeUploadModal} />
|
||||||
|
|
|
@ -15,6 +15,7 @@
|
||||||
* @property {boolean=} boost_modal
|
* @property {boolean=} boost_modal
|
||||||
* @property {boolean=} delete_modal
|
* @property {boolean=} delete_modal
|
||||||
* @property {boolean=} disable_swiping
|
* @property {boolean=} disable_swiping
|
||||||
|
* @property {boolean=} disable_hover_cards
|
||||||
* @property {string=} disabled_account_id
|
* @property {string=} disabled_account_id
|
||||||
* @property {string} display_media
|
* @property {string} display_media
|
||||||
* @property {string} domain
|
* @property {string} domain
|
||||||
|
@ -86,6 +87,7 @@ export const autoPlayGif = getMeta('auto_play_gif');
|
||||||
export const boostModal = getMeta('boost_modal');
|
export const boostModal = getMeta('boost_modal');
|
||||||
export const deleteModal = getMeta('delete_modal');
|
export const deleteModal = getMeta('delete_modal');
|
||||||
export const disableSwiping = getMeta('disable_swiping');
|
export const disableSwiping = getMeta('disable_swiping');
|
||||||
|
export const disableHoverCards = getMeta('disable_hover_cards');
|
||||||
export const disabledAccountId = getMeta('disabled_account_id');
|
export const disabledAccountId = getMeta('disabled_account_id');
|
||||||
export const displayMedia = getMeta('display_media');
|
export const displayMedia = getMeta('display_media');
|
||||||
export const domain = getMeta('domain');
|
export const domain = getMeta('domain');
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
"about.disclaimer": "ماستدون برنامج حر ومفتوح المصدر وعلامة تجارية لـ Mastodon GmbH.",
|
"about.disclaimer": "ماستدون برنامج حر ومفتوح المصدر وعلامة تجارية لـ Mastodon GmbH.",
|
||||||
"about.domain_blocks.no_reason_available": "السبب غير متوفر",
|
"about.domain_blocks.no_reason_available": "السبب غير متوفر",
|
||||||
"about.domain_blocks.preamble": "يسمح لك ماستدون عموماً بعرض المحتوى من المستخدمين من أي خادم آخر في الفدرالية والتفاعل معهم. وهذه هي الاستثناءات التي وضعت على هذا الخادم بالذات.",
|
"about.domain_blocks.preamble": "يسمح لك ماستدون عموماً بعرض المحتوى من المستخدمين من أي خادم آخر في الفدرالية والتفاعل معهم. وهذه هي الاستثناءات التي وضعت على هذا الخادم بالذات.",
|
||||||
"about.domain_blocks.silenced.explanation": "عموماً، لن ترى ملفات التعريف والمحتوى من هذا الخادم، إلا إذا كنت تبحث عنه بشكل صريح أو تختار أن تتابعه.",
|
"about.domain_blocks.silenced.explanation": "لن تظهر لك ملفات التعريف الشخصية والمحتوى من هذا الخادوم، إلا إن بحثت عنه عمدًا أو تابعته.",
|
||||||
"about.domain_blocks.silenced.title": "محدود",
|
"about.domain_blocks.silenced.title": "محدود",
|
||||||
"about.domain_blocks.suspended.explanation": "لن يتم معالجة أي بيانات من هذا الخادم أو تخزينها أو تبادلها، مما يجعل أي تفاعل أو اتصال مع المستخدمين من هذا الخادم مستحيلا.",
|
"about.domain_blocks.suspended.explanation": "لن يتم معالجة أي بيانات من هذا الخادم أو تخزينها أو تبادلها، مما يجعل أي تفاعل أو اتصال مع المستخدمين من هذا الخادم مستحيلا.",
|
||||||
"about.domain_blocks.suspended.title": "مُعلّق",
|
"about.domain_blocks.suspended.title": "مُعلّق",
|
||||||
|
@ -21,7 +21,7 @@
|
||||||
"account.blocked": "محظور",
|
"account.blocked": "محظور",
|
||||||
"account.browse_more_on_origin_server": "تصفح المزيد في الملف الشخصي الأصلي",
|
"account.browse_more_on_origin_server": "تصفح المزيد في الملف الشخصي الأصلي",
|
||||||
"account.cancel_follow_request": "إلغاء طلب المتابعة",
|
"account.cancel_follow_request": "إلغاء طلب المتابعة",
|
||||||
"account.copy": "نسخ الرابط إلى الحساب",
|
"account.copy": "نسخ الرابط إلى الملف الشخصي",
|
||||||
"account.direct": "إشارة خاصة لـ @{name}",
|
"account.direct": "إشارة خاصة لـ @{name}",
|
||||||
"account.disable_notifications": "توقف عن إشعاري عندما ينشر @{name}",
|
"account.disable_notifications": "توقف عن إشعاري عندما ينشر @{name}",
|
||||||
"account.domain_blocked": "اسم النِّطاق محظور",
|
"account.domain_blocked": "اسم النِّطاق محظور",
|
||||||
|
@ -32,7 +32,7 @@
|
||||||
"account.featured_tags.last_status_never": "لا توجد رسائل",
|
"account.featured_tags.last_status_never": "لا توجد رسائل",
|
||||||
"account.featured_tags.title": "وسوم {name} المميَّزة",
|
"account.featured_tags.title": "وسوم {name} المميَّزة",
|
||||||
"account.follow": "متابعة",
|
"account.follow": "متابعة",
|
||||||
"account.follow_back": "رد المتابعة",
|
"account.follow_back": "تابعهم بالمثل",
|
||||||
"account.followers": "مُتابِعون",
|
"account.followers": "مُتابِعون",
|
||||||
"account.followers.empty": "لا أحدَ يُتابع هذا المُستخدم إلى حد الآن.",
|
"account.followers.empty": "لا أحدَ يُتابع هذا المُستخدم إلى حد الآن.",
|
||||||
"account.following": "الاشتراكات",
|
"account.following": "الاشتراكات",
|
||||||
|
@ -51,7 +51,7 @@
|
||||||
"account.mute_notifications_short": "كتم الإشعارات",
|
"account.mute_notifications_short": "كتم الإشعارات",
|
||||||
"account.mute_short": "اكتم",
|
"account.mute_short": "اكتم",
|
||||||
"account.muted": "مَكتوم",
|
"account.muted": "مَكتوم",
|
||||||
"account.mutual": "متبادل",
|
"account.mutual": "متبادلة",
|
||||||
"account.no_bio": "لم يتم تقديم وصف.",
|
"account.no_bio": "لم يتم تقديم وصف.",
|
||||||
"account.open_original_page": "افتح الصفحة الأصلية",
|
"account.open_original_page": "افتح الصفحة الأصلية",
|
||||||
"account.posts": "منشورات",
|
"account.posts": "منشورات",
|
||||||
|
@ -70,8 +70,8 @@
|
||||||
"account.unmute_notifications_short": "إلغاء كَتم الإشعارات",
|
"account.unmute_notifications_short": "إلغاء كَتم الإشعارات",
|
||||||
"account.unmute_short": "إلغاء الكتم",
|
"account.unmute_short": "إلغاء الكتم",
|
||||||
"account_note.placeholder": "اضغط لإضافة مُلاحظة",
|
"account_note.placeholder": "اضغط لإضافة مُلاحظة",
|
||||||
"admin.dashboard.daily_retention": "معدل الاحتفاظ بالمستخدم بعد التسجيل بيوم",
|
"admin.dashboard.daily_retention": "معدّل بقاء المستخدمين بعد إنشاء الحسابات، بالأيام",
|
||||||
"admin.dashboard.monthly_retention": "معدل الاحتفاظ بالمستخدم بعد التسجيل بالشهور",
|
"admin.dashboard.monthly_retention": "معدّل بقاء المستخدمين بعد إنشاء الحسابات، بالشهور",
|
||||||
"admin.dashboard.retention.average": "المعدل",
|
"admin.dashboard.retention.average": "المعدل",
|
||||||
"admin.dashboard.retention.cohort": "شهر التسجيل",
|
"admin.dashboard.retention.cohort": "شهر التسجيل",
|
||||||
"admin.dashboard.retention.cohort_size": "المستخدمون الجدد",
|
"admin.dashboard.retention.cohort_size": "المستخدمون الجدد",
|
||||||
|
@ -87,12 +87,12 @@
|
||||||
"attachments_list.unprocessed": "(غير معالَج)",
|
"attachments_list.unprocessed": "(غير معالَج)",
|
||||||
"audio.hide": "إخفاء المقطع الصوتي",
|
"audio.hide": "إخفاء المقطع الصوتي",
|
||||||
"block_modal.remote_users_caveat": "سوف نطلب من الخادم {domain} أن يحترم قرارك، لكن الالتزام غير مضمون لأن بعض الخواديم قد تتعامل مع نصوص الكتل بشكل مختلف. قد تظل المنشورات العامة مرئية للمستخدمين غير المسجلين الدخول.",
|
"block_modal.remote_users_caveat": "سوف نطلب من الخادم {domain} أن يحترم قرارك، لكن الالتزام غير مضمون لأن بعض الخواديم قد تتعامل مع نصوص الكتل بشكل مختلف. قد تظل المنشورات العامة مرئية للمستخدمين غير المسجلين الدخول.",
|
||||||
"block_modal.show_less": "أظهر الأقل",
|
"block_modal.show_less": "تفاصيل أقلّ",
|
||||||
"block_modal.show_more": "أظهر المزيد",
|
"block_modal.show_more": "تفاصيل أكثر",
|
||||||
"block_modal.they_cant_mention": "لن يستطيع ذِكرك أو متابعتك.",
|
"block_modal.they_cant_mention": "لن يستطيع ذِكرك أو متابعتك.",
|
||||||
"block_modal.they_cant_see_posts": "لن يستطيع رؤية منشوراتك ولن ترى منشوراته.",
|
"block_modal.they_cant_see_posts": "لن يستطيع مطالعة منشوراتك ولن تطالع منشوراته.",
|
||||||
"block_modal.they_will_know": "يمكنه أن يرى أنه قد تم حظره.",
|
"block_modal.they_will_know": "سيعلم أنه قد حُظِر.",
|
||||||
"block_modal.title": "أتريد حظر المستخدم؟",
|
"block_modal.title": "أتريد حظر هذا المستخدم؟",
|
||||||
"block_modal.you_wont_see_mentions": "لن تر المنشورات التي يُشار فيهم إليه.",
|
"block_modal.you_wont_see_mentions": "لن تر المنشورات التي يُشار فيهم إليه.",
|
||||||
"boost_modal.combo": "يُمكنك الضّغط على {combo} لتخطي هذا في المرة المُقبلة",
|
"boost_modal.combo": "يُمكنك الضّغط على {combo} لتخطي هذا في المرة المُقبلة",
|
||||||
"bundle_column_error.copy_stacktrace": "انسخ تقرير الخطأ",
|
"bundle_column_error.copy_stacktrace": "انسخ تقرير الخطأ",
|
||||||
|
@ -156,7 +156,7 @@
|
||||||
"compose_form.poll.single": "اختر واحدا",
|
"compose_form.poll.single": "اختر واحدا",
|
||||||
"compose_form.poll.switch_to_multiple": "تغيِير الاستطلاع للسماح باِخيارات مُتعدِّدة",
|
"compose_form.poll.switch_to_multiple": "تغيِير الاستطلاع للسماح باِخيارات مُتعدِّدة",
|
||||||
"compose_form.poll.switch_to_single": "تغيِير الاستطلاع للسماح باِخيار واحد فقط",
|
"compose_form.poll.switch_to_single": "تغيِير الاستطلاع للسماح باِخيار واحد فقط",
|
||||||
"compose_form.poll.type": "الأسلوب",
|
"compose_form.poll.type": "الطراز",
|
||||||
"compose_form.publish": "نشر",
|
"compose_form.publish": "نشر",
|
||||||
"compose_form.publish_form": "منشور جديد",
|
"compose_form.publish_form": "منشور جديد",
|
||||||
"compose_form.reply": "ردّ",
|
"compose_form.reply": "ردّ",
|
||||||
|
|
|
@ -35,7 +35,9 @@
|
||||||
"account.follow_back": "Последване взаимно",
|
"account.follow_back": "Последване взаимно",
|
||||||
"account.followers": "Последователи",
|
"account.followers": "Последователи",
|
||||||
"account.followers.empty": "Още никой не следва потребителя.",
|
"account.followers.empty": "Още никой не следва потребителя.",
|
||||||
|
"account.followers_counter": "{count, plural, one {{counter} последовател} other {{counter} последователи}}",
|
||||||
"account.following": "Последвано",
|
"account.following": "Последвано",
|
||||||
|
"account.following_counter": "{count, plural, one {{counter} последван} other {{counter} последвани}}",
|
||||||
"account.follows.empty": "Потребителят още никого не следва.",
|
"account.follows.empty": "Потребителят още никого не следва.",
|
||||||
"account.go_to_profile": "Към профила",
|
"account.go_to_profile": "Към профила",
|
||||||
"account.hide_reblogs": "Скриване на подсилвания от @{name}",
|
"account.hide_reblogs": "Скриване на подсилвания от @{name}",
|
||||||
|
@ -61,6 +63,7 @@
|
||||||
"account.requested_follow": "{name} поиска да ви последва",
|
"account.requested_follow": "{name} поиска да ви последва",
|
||||||
"account.share": "Споделяне на профила на @{name}",
|
"account.share": "Споделяне на профила на @{name}",
|
||||||
"account.show_reblogs": "Показване на подсилвания от @{name}",
|
"account.show_reblogs": "Показване на подсилвания от @{name}",
|
||||||
|
"account.statuses_counter": "{count, plural, one {{counter} публикация} other {{counter} публикации}}",
|
||||||
"account.unblock": "Отблокиране на @{name}",
|
"account.unblock": "Отблокиране на @{name}",
|
||||||
"account.unblock_domain": "Отблокиране на домейн {domain}",
|
"account.unblock_domain": "Отблокиране на домейн {domain}",
|
||||||
"account.unblock_short": "Отблокиране",
|
"account.unblock_short": "Отблокиране",
|
||||||
|
|
|
@ -197,7 +197,7 @@
|
||||||
"copy_icon_button.copied": "Zkopírováno do schránky",
|
"copy_icon_button.copied": "Zkopírováno do schránky",
|
||||||
"copypaste.copied": "Zkopírováno",
|
"copypaste.copied": "Zkopírováno",
|
||||||
"copypaste.copy_to_clipboard": "Zkopírovat do schránky",
|
"copypaste.copy_to_clipboard": "Zkopírovat do schránky",
|
||||||
"directory.federated": "Ze známého fedivesmíru",
|
"directory.federated": "Ze známého fediversu",
|
||||||
"directory.local": "Pouze z {domain}",
|
"directory.local": "Pouze z {domain}",
|
||||||
"directory.new_arrivals": "Nově příchozí",
|
"directory.new_arrivals": "Nově příchozí",
|
||||||
"directory.recently_active": "Nedávno aktivní",
|
"directory.recently_active": "Nedávno aktivní",
|
||||||
|
@ -213,7 +213,7 @@
|
||||||
"domain_block_modal.block_account_instead": "Raději blokovat @{name}",
|
"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_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_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.",
|
"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.title": "Blokovat doménu?",
|
||||||
"domain_block_modal.you_will_lose_followers": "Všichni vaši sledující z tohoto serveru budou odstraněni.",
|
"domain_block_modal.you_will_lose_followers": "Všichni vaši sledující z tohoto serveru budou odstraněni.",
|
||||||
"domain_block_modal.you_wont_see_posts": "Neuvidíte příspěvky ani upozornění od uživatelů z tohoto serveru.",
|
"domain_block_modal.you_wont_see_posts": "Neuvidíte příspěvky ani upozornění od uživatelů z tohoto serveru.",
|
||||||
|
@ -341,7 +341,7 @@
|
||||||
"hashtag.column_settings.tag_mode.any": "Jakýkoliv z těchto",
|
"hashtag.column_settings.tag_mode.any": "Jakýkoliv z těchto",
|
||||||
"hashtag.column_settings.tag_mode.none": "Žádný z těchto",
|
"hashtag.column_settings.tag_mode.none": "Žádný z těchto",
|
||||||
"hashtag.column_settings.tag_toggle": "Zahrnout v tomto sloupci další štítky",
|
"hashtag.column_settings.tag_toggle": "Zahrnout v tomto sloupci další štítky",
|
||||||
"hashtag.counter_by_accounts": "{count, plural, one {{counter} účastník} few {{counter} účastníci} other {{counter} účastníků}}",
|
"hashtag.counter_by_accounts": "{count, plural, one {{counter} účastník*ice} few {{counter} účastníci} other {{counter} účastníků}}",
|
||||||
"hashtag.counter_by_uses": "{count, plural, one {{counter} příspěvek} few {{counter} příspěvky} other {{counter} příspěvků}}",
|
"hashtag.counter_by_uses": "{count, plural, one {{counter} příspěvek} few {{counter} příspěvky} other {{counter} příspěvků}}",
|
||||||
"hashtag.counter_by_uses_today": "Dnes {count, plural, one {{counter} příspěvek} few {{counter} příspěvky} other {{counter} příspěvků}}",
|
"hashtag.counter_by_uses_today": "Dnes {count, plural, one {{counter} příspěvek} few {{counter} příspěvky} other {{counter} příspěvků}}",
|
||||||
"hashtag.follow": "Sledovat hashtag",
|
"hashtag.follow": "Sledovat hashtag",
|
||||||
|
@ -440,7 +440,7 @@
|
||||||
"mute_modal.show_options": "Zobrazit možnosti",
|
"mute_modal.show_options": "Zobrazit možnosti",
|
||||||
"mute_modal.they_can_mention_and_follow": "Mohou vás zmínit a sledovat, ale neuvidíte je.",
|
"mute_modal.they_can_mention_and_follow": "Mohou vás zmínit a sledovat, ale neuvidíte je.",
|
||||||
"mute_modal.they_wont_know": "Nebudou vědět, že byli skryti.",
|
"mute_modal.they_wont_know": "Nebudou vědět, že byli skryti.",
|
||||||
"mute_modal.title": "Ztlumit uživatele?",
|
"mute_modal.title": "Ztlumit uživatele*ku?",
|
||||||
"mute_modal.you_wont_see_mentions": "Neuvidíte příspěvky, které je zmiňují.",
|
"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.",
|
"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.about": "O aplikaci",
|
||||||
|
@ -566,8 +566,8 @@
|
||||||
"onboarding.share.message": "Jsem {username} na #Mastodonu! Pojď mě sledovat na {url}",
|
"onboarding.share.message": "Jsem {username} na #Mastodonu! Pojď mě sledovat na {url}",
|
||||||
"onboarding.share.next_steps": "Možné další kroky:",
|
"onboarding.share.next_steps": "Možné další kroky:",
|
||||||
"onboarding.share.title": "Sdílejte svůj profil",
|
"onboarding.share.title": "Sdílejte svůj profil",
|
||||||
"onboarding.start.lead": "Your new Mastodon account is ready to go. Here's how you can make the most of it:",
|
"onboarding.start.lead": "Nyní jste součástí Mastodonu, unikátní sociální sítě, kde vy - ne algoritmus - vytváří vaše vlastní prožitky. Začněte na této nové sociální platformě:",
|
||||||
"onboarding.start.skip": "Want to skip right ahead?",
|
"onboarding.start.skip": "Nepotřebujete pomoci začít?",
|
||||||
"onboarding.start.title": "Dokázali jste to!",
|
"onboarding.start.title": "Dokázali jste to!",
|
||||||
"onboarding.steps.follow_people.body": "Mastodon je o sledování zajimavých lidí.",
|
"onboarding.steps.follow_people.body": "Mastodon je o sledování zajimavých lidí.",
|
||||||
"onboarding.steps.follow_people.title": "Přispůsobit vlastní domovský kanál",
|
"onboarding.steps.follow_people.title": "Přispůsobit vlastní domovský kanál",
|
||||||
|
@ -581,7 +581,7 @@
|
||||||
"onboarding.tips.accounts_from_other_servers": "<strong>Víte, že?</strong> Protože je Mastodon decentralizovaný, některé profily, na které narazíte, budou hostovány na jiných serverech, než je ten váš. A přesto s nimi můžete bezproblémově komunikovat! Jejich server se nachází v druhé polovině uživatelského jména!",
|
"onboarding.tips.accounts_from_other_servers": "<strong>Víte, že?</strong> Protože je Mastodon decentralizovaný, některé profily, na které narazíte, budou hostovány na jiných serverech, než je ten váš. A přesto s nimi můžete bezproblémově komunikovat! Jejich server se nachází v druhé polovině uživatelského jména!",
|
||||||
"onboarding.tips.migration": "<strong>Víte, že?</strong> Pokud máte pocit, že {domain} pro vás v budoucnu není vhodnou volbou, můžete se přesunout na jiný Mastodon server, aniž byste přišli o své sledující. Můžete dokonce hostovat svůj vlastní server!",
|
"onboarding.tips.migration": "<strong>Víte, že?</strong> Pokud máte pocit, že {domain} pro vás v budoucnu není vhodnou volbou, můžete se přesunout na jiný Mastodon server, aniž byste přišli o své sledující. Můžete dokonce hostovat svůj vlastní server!",
|
||||||
"onboarding.tips.verification": "<strong>Víte, že?</strong> Svůj účet můžete ověřit tak, že na své webové stránky umístíte odkaz na váš Mastodon profil a odkaz na stránku přidáte do svého profilu. Nejsou k tomu potřeba žádné poplatky ani dokumenty!",
|
"onboarding.tips.verification": "<strong>Víte, že?</strong> Svůj účet můžete ověřit tak, že na své webové stránky umístíte odkaz na váš Mastodon profil a odkaz na stránku přidáte do svého profilu. Nejsou k tomu potřeba žádné poplatky ani dokumenty!",
|
||||||
"password_confirmation.exceeds_maxlength": "Potvrzení hesla překračuje maximální délku hesla",
|
"password_confirmation.exceeds_maxlength": "Potvrzení hesla překračuje maximální povolenou délku hesla",
|
||||||
"password_confirmation.mismatching": "Zadaná hesla se neshodují",
|
"password_confirmation.mismatching": "Zadaná hesla se neshodují",
|
||||||
"picture_in_picture.restore": "Vrátit zpět",
|
"picture_in_picture.restore": "Vrátit zpět",
|
||||||
"poll.closed": "Uzavřeno",
|
"poll.closed": "Uzavřeno",
|
||||||
|
@ -665,7 +665,7 @@
|
||||||
"report.unfollow": "Přestat sledovat @{name}",
|
"report.unfollow": "Přestat sledovat @{name}",
|
||||||
"report.unfollow_explanation": "Tento účet sledujete. Abyste už neviděli jeho příspěvky ve své domovské časové ose, přestaňte jej sledovat.",
|
"report.unfollow_explanation": "Tento účet sledujete. Abyste už neviděli jeho příspěvky ve své domovské časové ose, přestaňte jej sledovat.",
|
||||||
"report_notification.attached_statuses": "{count, plural, one {{count} připojený příspěvek} few {{count} připojené příspěvky} many {{count} připojených příspěvků} other {{count} připojených příspěvků}}",
|
"report_notification.attached_statuses": "{count, plural, one {{count} připojený příspěvek} few {{count} připojené příspěvky} many {{count} připojených příspěvků} other {{count} připojených příspěvků}}",
|
||||||
"report_notification.categories.legal": "Zákonné",
|
"report_notification.categories.legal": "Právní ustanovení",
|
||||||
"report_notification.categories.other": "Ostatní",
|
"report_notification.categories.other": "Ostatní",
|
||||||
"report_notification.categories.spam": "Spam",
|
"report_notification.categories.spam": "Spam",
|
||||||
"report_notification.categories.violation": "Porušení pravidla",
|
"report_notification.categories.violation": "Porušení pravidla",
|
||||||
|
|
|
@ -411,6 +411,7 @@
|
||||||
"limited_account_hint.action": "構わず表示する",
|
"limited_account_hint.action": "構わず表示する",
|
||||||
"limited_account_hint.title": "このプロフィールは{domain}のモデレーターによって非表示にされています。",
|
"limited_account_hint.title": "このプロフィールは{domain}のモデレーターによって非表示にされています。",
|
||||||
"link_preview.author": "{name}",
|
"link_preview.author": "{name}",
|
||||||
|
"link_preview.more_from_author": "{name}さんの投稿をもっと読む",
|
||||||
"lists.account.add": "リストに追加",
|
"lists.account.add": "リストに追加",
|
||||||
"lists.account.remove": "リストから外す",
|
"lists.account.remove": "リストから外す",
|
||||||
"lists.delete": "リストを削除",
|
"lists.delete": "リストを削除",
|
||||||
|
@ -691,8 +692,11 @@
|
||||||
"server_banner.about_active_users": "過去30日間にこのサーバーを使用している人 (月間アクティブユーザー)",
|
"server_banner.about_active_users": "過去30日間にこのサーバーを使用している人 (月間アクティブユーザー)",
|
||||||
"server_banner.active_users": "人のアクティブユーザー",
|
"server_banner.active_users": "人のアクティブユーザー",
|
||||||
"server_banner.administered_by": "管理者",
|
"server_banner.administered_by": "管理者",
|
||||||
|
"server_banner.is_one_of_many": "{domain} は、数々の独立したMastodonサーバーのうちのひとつです。サーバーに登録してFediverseのコミュニティに加わってみませんか。",
|
||||||
"server_banner.server_stats": "サーバーの情報",
|
"server_banner.server_stats": "サーバーの情報",
|
||||||
"sign_in_banner.create_account": "アカウント作成",
|
"sign_in_banner.create_account": "アカウント作成",
|
||||||
|
"sign_in_banner.follow_anyone": "連合内の誰でもフォローして投稿を時系列で見ることができます。アルゴリズム、広告、クリックベイトはありません。",
|
||||||
|
"sign_in_banner.mastodon_is": "Mastodonに参加して、世界で起きていることを見つけよう。",
|
||||||
"sign_in_banner.sign_in": "ログイン",
|
"sign_in_banner.sign_in": "ログイン",
|
||||||
"sign_in_banner.sso_redirect": "ログインまたは登録",
|
"sign_in_banner.sso_redirect": "ログインまたは登録",
|
||||||
"status.admin_account": "@{name}さんのモデレーション画面を開く",
|
"status.admin_account": "@{name}さんのモデレーション画面を開く",
|
||||||
|
|
|
@ -1,6 +1,10 @@
|
||||||
{
|
{
|
||||||
|
"about.blocks": "Ulac agbur",
|
||||||
"about.contact": "Anermis:",
|
"about.contact": "Anermis:",
|
||||||
"about.disclaimer": "Mastodon d aseɣẓan ilelli, d aseɣẓan n uɣbalu yeldin, d tnezzut n Mastodon gGmbH.",
|
"about.disclaimer": "Mastodon d aseɣẓan ilelli, d aseɣẓan n uɣbalu yeldin, d tnezzut n Mastodon gGmbH.",
|
||||||
|
"about.domain_blocks.preamble": "Maṣṭudun s umata yeḍmen-ak ad teẓreḍ agbur, ad tesdemreḍ akked yimseqdacen-nniḍen seg yal aqeddac deg fedivers. Ha-tent-an ɣur-k tsuraf i yellan deg uqeddac-agi.",
|
||||||
|
"about.domain_blocks.silenced.title": "Ɣur-s talast",
|
||||||
|
"about.domain_blocks.suspended.title": "Yeḥbes",
|
||||||
"about.not_available": "Talɣut-a ur tettwabder ara deg uqeddac-a.",
|
"about.not_available": "Talɣut-a ur tettwabder ara deg uqeddac-a.",
|
||||||
"about.powered_by": "Azeṭṭa inmetti yettwasɣelsen sɣur {mastodon}",
|
"about.powered_by": "Azeṭṭa inmetti yettwasɣelsen sɣur {mastodon}",
|
||||||
"about.rules": "Ilugan n uqeddac",
|
"about.rules": "Ilugan n uqeddac",
|
||||||
|
@ -24,9 +28,12 @@
|
||||||
"account.featured_tags.last_status_at": "Tasuffeɣt taneggarut ass n {date}",
|
"account.featured_tags.last_status_at": "Tasuffeɣt taneggarut ass n {date}",
|
||||||
"account.featured_tags.last_status_never": "Ulac tisuffaɣ",
|
"account.featured_tags.last_status_never": "Ulac tisuffaɣ",
|
||||||
"account.follow": "Ḍfer",
|
"account.follow": "Ḍfer",
|
||||||
|
"account.follow_back": "Ḍfer-it ula d kečč·m",
|
||||||
"account.followers": "Imeḍfaren",
|
"account.followers": "Imeḍfaren",
|
||||||
"account.followers.empty": "Ar tura, ulac yiwen i yeṭṭafaṛen amseqdac-agi.",
|
"account.followers.empty": "Ar tura, ulac yiwen i yeṭṭafaṛen amseqdac-agi.",
|
||||||
|
"account.followers_counter": "{count, plural, one {{counter} n umḍfar} other {{counter} n yimeḍfaren}}",
|
||||||
"account.following": "Yeṭṭafaṛ",
|
"account.following": "Yeṭṭafaṛ",
|
||||||
|
"account.following_counter": "{count, plural, one {{counter} yettwaḍfaren} other {{counter} yettwaḍfaren}}",
|
||||||
"account.follows.empty": "Ar tura, amseqdac-agi ur yeṭṭafaṛ yiwen.",
|
"account.follows.empty": "Ar tura, amseqdac-agi ur yeṭṭafaṛ yiwen.",
|
||||||
"account.go_to_profile": "Ddu ɣer umaɣnu",
|
"account.go_to_profile": "Ddu ɣer umaɣnu",
|
||||||
"account.hide_reblogs": "Ffer ayen i ibeṭṭu @{name}",
|
"account.hide_reblogs": "Ffer ayen i ibeṭṭu @{name}",
|
||||||
|
@ -49,6 +56,7 @@
|
||||||
"account.requested_follow": "{name} yessuter ad k·m-yeḍfer",
|
"account.requested_follow": "{name} yessuter ad k·m-yeḍfer",
|
||||||
"account.share": "Bḍu amaɣnu n @{name}",
|
"account.share": "Bḍu amaɣnu n @{name}",
|
||||||
"account.show_reblogs": "Ssken-d inebḍa n @{name}",
|
"account.show_reblogs": "Ssken-d inebḍa n @{name}",
|
||||||
|
"account.statuses_counter": "{count, plural, one {{counter} n tsuffeɣt} other {{counter} n tsuffaɣ}}",
|
||||||
"account.unblock": "Serreḥ i @{name}",
|
"account.unblock": "Serreḥ i @{name}",
|
||||||
"account.unblock_domain": "Ssken-d {domain}",
|
"account.unblock_domain": "Ssken-d {domain}",
|
||||||
"account.unblock_short": "Serreḥ",
|
"account.unblock_short": "Serreḥ",
|
||||||
|
@ -166,6 +174,7 @@
|
||||||
"dismissable_banner.explore_tags": "D wiyi i d ihacṭagen i d-yettawin tamyigawt deg web anmetti ass-a. Ihacṭagen i sseqdacen ugar n medden, εlayit d imezwura.",
|
"dismissable_banner.explore_tags": "D wiyi i d ihacṭagen i d-yettawin tamyigawt deg web anmetti ass-a. Ihacṭagen i sseqdacen ugar n medden, εlayit d imezwura.",
|
||||||
"domain_block_modal.block": "Sewḥel aqeddac",
|
"domain_block_modal.block": "Sewḥel aqeddac",
|
||||||
"domain_block_modal.they_cant_follow": "Yiwen ur yezmir ad k·m-id-yeḍfer seg uqeddac-a.",
|
"domain_block_modal.they_cant_follow": "Yiwen ur yezmir ad k·m-id-yeḍfer seg uqeddac-a.",
|
||||||
|
"domain_block_modal.title": "Sewḥel taɣult?",
|
||||||
"domain_pill.activitypub_like_language": "ActivityPub am tutlayt yettmeslay Mastodon d izeḍwan inmettiyen nniḍen.",
|
"domain_pill.activitypub_like_language": "ActivityPub am tutlayt yettmeslay Mastodon d izeḍwan inmettiyen nniḍen.",
|
||||||
"domain_pill.server": "Aqeddac",
|
"domain_pill.server": "Aqeddac",
|
||||||
"domain_pill.username": "Isem n useqdac",
|
"domain_pill.username": "Isem n useqdac",
|
||||||
|
@ -214,6 +223,7 @@
|
||||||
"filter_modal.added.review_and_configure_title": "Iɣewwaṛen n imzizdig",
|
"filter_modal.added.review_and_configure_title": "Iɣewwaṛen n imzizdig",
|
||||||
"filter_modal.added.settings_link": "asebter n yiɣewwaṛen",
|
"filter_modal.added.settings_link": "asebter n yiɣewwaṛen",
|
||||||
"filter_modal.added.short_explanation": "Tasuffeɣt-a tettwarna ɣer taggayt-a n yimsizdegen: {title}.",
|
"filter_modal.added.short_explanation": "Tasuffeɣt-a tettwarna ɣer taggayt-a n yimsizdegen: {title}.",
|
||||||
|
"filter_modal.added.title": "Yettwarna umsizdeg!",
|
||||||
"filter_modal.select_filter.expired": "yemmut",
|
"filter_modal.select_filter.expired": "yemmut",
|
||||||
"filter_modal.select_filter.prompt_new": "Taggayt tamaynutt : {name}",
|
"filter_modal.select_filter.prompt_new": "Taggayt tamaynutt : {name}",
|
||||||
"filter_modal.select_filter.search": "Nadi neɣ snulfu-d",
|
"filter_modal.select_filter.search": "Nadi neɣ snulfu-d",
|
||||||
|
@ -224,9 +234,9 @@
|
||||||
"firehose.remote": "Iqeddacen nniḍen",
|
"firehose.remote": "Iqeddacen nniḍen",
|
||||||
"follow_request.authorize": "Ssireg",
|
"follow_request.authorize": "Ssireg",
|
||||||
"follow_request.reject": "Agi",
|
"follow_request.reject": "Agi",
|
||||||
"follow_suggestions.dismiss": "Ur ttɛawad ara ad t-id-sekneṭ",
|
"follow_suggestions.dismiss": "Dayen ur t-id-skan ara",
|
||||||
"follow_suggestions.view_all": "Wali-ten akk",
|
"follow_suggestions.view_all": "Wali-ten akk",
|
||||||
"follow_suggestions.who_to_follow": "Menhu ara ḍefṛeḍ",
|
"follow_suggestions.who_to_follow": "Ad tḍefreḍ?",
|
||||||
"followed_tags": "Ihacṭagen yettwaḍfaren",
|
"followed_tags": "Ihacṭagen yettwaḍfaren",
|
||||||
"footer.about": "Ɣef",
|
"footer.about": "Ɣef",
|
||||||
"footer.directory": "Akaram n imeɣna",
|
"footer.directory": "Akaram n imeɣna",
|
||||||
|
@ -235,6 +245,7 @@
|
||||||
"footer.keyboard_shortcuts": "Inegzumen n unasiw",
|
"footer.keyboard_shortcuts": "Inegzumen n unasiw",
|
||||||
"footer.privacy_policy": "Tasertit tabaḍnit",
|
"footer.privacy_policy": "Tasertit tabaḍnit",
|
||||||
"footer.source_code": "Wali tangalt taɣbalut",
|
"footer.source_code": "Wali tangalt taɣbalut",
|
||||||
|
"footer.status": "N tsuffeɣt",
|
||||||
"generic.saved": "Yettwasekles",
|
"generic.saved": "Yettwasekles",
|
||||||
"getting_started.heading": "Bdu",
|
"getting_started.heading": "Bdu",
|
||||||
"hashtag.column_header.tag_mode.all": "d {additional}",
|
"hashtag.column_header.tag_mode.all": "d {additional}",
|
||||||
|
@ -313,11 +324,14 @@
|
||||||
"lightbox.previous": "Ɣer deffir",
|
"lightbox.previous": "Ɣer deffir",
|
||||||
"limited_account_hint.action": "Wali amaɣnu akken yebɣu yili",
|
"limited_account_hint.action": "Wali amaɣnu akken yebɣu yili",
|
||||||
"link_preview.author": "S-ɣur {name}",
|
"link_preview.author": "S-ɣur {name}",
|
||||||
|
"link_preview.more_from_author": "Ugar sɣur {name}",
|
||||||
|
"link_preview.shares": "{count, plural, one {{counter} post} other {{counter} posts}}",
|
||||||
"lists.account.add": "Rnu ɣer tebdart",
|
"lists.account.add": "Rnu ɣer tebdart",
|
||||||
"lists.account.remove": "Kkes seg tebdart",
|
"lists.account.remove": "Kkes seg tebdart",
|
||||||
"lists.delete": "Kkes tabdart",
|
"lists.delete": "Kkes tabdart",
|
||||||
"lists.edit": "Ẓreg tabdart",
|
"lists.edit": "Ẓreg tabdart",
|
||||||
"lists.edit.submit": "Beddel azwel",
|
"lists.edit.submit": "Beddel azwel",
|
||||||
|
"lists.exclusive": "Ffer tisuffaɣ-a seg ugejdan",
|
||||||
"lists.new.create": "Rnu tabdart",
|
"lists.new.create": "Rnu tabdart",
|
||||||
"lists.new.title_placeholder": "Azwel amaynut n tebdart",
|
"lists.new.title_placeholder": "Azwel amaynut n tebdart",
|
||||||
"lists.replies_policy.followed": "Kra n useqdac i yettwaḍefren",
|
"lists.replies_policy.followed": "Kra n useqdac i yettwaḍefren",
|
||||||
|
@ -338,6 +352,7 @@
|
||||||
"navigation_bar.bookmarks": "Ticraḍ",
|
"navigation_bar.bookmarks": "Ticraḍ",
|
||||||
"navigation_bar.community_timeline": "Tasuddemt tadigant",
|
"navigation_bar.community_timeline": "Tasuddemt tadigant",
|
||||||
"navigation_bar.compose": "Aru tajewwiqt tamaynut",
|
"navigation_bar.compose": "Aru tajewwiqt tamaynut",
|
||||||
|
"navigation_bar.direct": "Tibdarin tusligin",
|
||||||
"navigation_bar.discover": "Ẓer",
|
"navigation_bar.discover": "Ẓer",
|
||||||
"navigation_bar.domain_blocks": "Tiɣula yeffren",
|
"navigation_bar.domain_blocks": "Tiɣula yeffren",
|
||||||
"navigation_bar.explore": "Snirem",
|
"navigation_bar.explore": "Snirem",
|
||||||
|
@ -357,9 +372,14 @@
|
||||||
"navigation_bar.search": "Nadi",
|
"navigation_bar.search": "Nadi",
|
||||||
"navigation_bar.security": "Taɣellist",
|
"navigation_bar.security": "Taɣellist",
|
||||||
"not_signed_in_indicator.not_signed_in": "You need to sign in to access this resource.",
|
"not_signed_in_indicator.not_signed_in": "You need to sign in to access this resource.",
|
||||||
|
"notification.admin.report": "Yemla-t-id {name} {target}",
|
||||||
|
"notification.admin.sign_up": "Ijerred {name}",
|
||||||
|
"notification.favourite": "{name} yesmenyaf addad-ik·im",
|
||||||
"notification.follow": "iṭṭafar-ik·em-id {name}",
|
"notification.follow": "iṭṭafar-ik·em-id {name}",
|
||||||
"notification.follow_request": "{name} yessuter-d ad k·m-yeḍfeṛ",
|
"notification.follow_request": "{name} yessuter-d ad k·m-yeḍfeṛ",
|
||||||
"notification.mention": "{name} yebder-ik-id",
|
"notification.mention": "{name} yebder-ik-id",
|
||||||
|
"notification.moderation-warning.learn_more": "Issin ugar",
|
||||||
|
"notification.moderation_warning.action_suspend": "Yettwaseḥbes umiḍan-ik.",
|
||||||
"notification.own_poll": "Tafrant-ik·im tfuk",
|
"notification.own_poll": "Tafrant-ik·im tfuk",
|
||||||
"notification.poll": "Tfukk tefrant ideg tettekkaḍ",
|
"notification.poll": "Tfukk tefrant ideg tettekkaḍ",
|
||||||
"notification.reblog": "{name} yebḍa tajewwiqt-ik i tikelt-nniḍen",
|
"notification.reblog": "{name} yebḍa tajewwiqt-ik i tikelt-nniḍen",
|
||||||
|
@ -370,6 +390,7 @@
|
||||||
"notification_requests.notifications_from": "Ilɣa sɣur {name}",
|
"notification_requests.notifications_from": "Ilɣa sɣur {name}",
|
||||||
"notifications.clear": "Sfeḍ tilɣa",
|
"notifications.clear": "Sfeḍ tilɣa",
|
||||||
"notifications.clear_confirmation": "Tebɣiḍ s tidet ad tekkseḍ akk tilɣa-inek·em i lebda?",
|
"notifications.clear_confirmation": "Tebɣiḍ s tidet ad tekkseḍ akk tilɣa-inek·em i lebda?",
|
||||||
|
"notifications.column_settings.admin.report": "Ineqqisen imaynuten:",
|
||||||
"notifications.column_settings.alert": "Tilɣa n tnarit",
|
"notifications.column_settings.alert": "Tilɣa n tnarit",
|
||||||
"notifications.column_settings.favourite": "Imenyafen:",
|
"notifications.column_settings.favourite": "Imenyafen:",
|
||||||
"notifications.column_settings.filter_bar.advanced": "Sken-d akk taggayin",
|
"notifications.column_settings.filter_bar.advanced": "Sken-d akk taggayin",
|
||||||
|
@ -384,6 +405,7 @@
|
||||||
"notifications.column_settings.sound": "Rmed imesli",
|
"notifications.column_settings.sound": "Rmed imesli",
|
||||||
"notifications.column_settings.status": "Tisuffaɣ timaynutin :",
|
"notifications.column_settings.status": "Tisuffaɣ timaynutin :",
|
||||||
"notifications.column_settings.unread_notifications.category": "Ilɣa ur nettwaɣra",
|
"notifications.column_settings.unread_notifications.category": "Ilɣa ur nettwaɣra",
|
||||||
|
"notifications.column_settings.update": "Iẓreg:",
|
||||||
"notifications.filter.all": "Akk",
|
"notifications.filter.all": "Akk",
|
||||||
"notifications.filter.boosts": "Seǧhed",
|
"notifications.filter.boosts": "Seǧhed",
|
||||||
"notifications.filter.favourites": "Imenyafen",
|
"notifications.filter.favourites": "Imenyafen",
|
||||||
|
@ -413,6 +435,7 @@
|
||||||
"onboarding.follows.lead": "You curate your own home feed. The more people you follow, the more active and interesting it will be. These profiles may be a good starting point—you can always unfollow them later!",
|
"onboarding.follows.lead": "You curate your own home feed. The more people you follow, the more active and interesting it will be. These profiles may be a good starting point—you can always unfollow them later!",
|
||||||
"onboarding.follows.title": "Ttwassnen deg Mastodon",
|
"onboarding.follows.title": "Ttwassnen deg Mastodon",
|
||||||
"onboarding.profile.display_name": "Isem ara d-yettwaskanen",
|
"onboarding.profile.display_name": "Isem ara d-yettwaskanen",
|
||||||
|
"onboarding.profile.display_name_hint": "Isem-ik·im ummid neɣ isem-ik·im n uqeṣṣer…",
|
||||||
"onboarding.profile.note": "Tameddurt",
|
"onboarding.profile.note": "Tameddurt",
|
||||||
"onboarding.profile.note_hint": "Tzemreḍ ad d-@tbedreḍ imdanen niḍen neɣ #ihacṭagen …",
|
"onboarding.profile.note_hint": "Tzemreḍ ad d-@tbedreḍ imdanen niḍen neɣ #ihacṭagen …",
|
||||||
"onboarding.profile.save_and_continue": "Sekles, tkemmleḍ",
|
"onboarding.profile.save_and_continue": "Sekles, tkemmleḍ",
|
||||||
|
@ -441,6 +464,7 @@
|
||||||
"poll.total_votes": "{count, plural, one {# n udɣaṛ} other {# n yedɣaṛen}}",
|
"poll.total_votes": "{count, plural, one {# n udɣaṛ} other {# n yedɣaṛen}}",
|
||||||
"poll.vote": "Dɣeṛ",
|
"poll.vote": "Dɣeṛ",
|
||||||
"poll.voted": "Tdeɣṛeḍ ɣef tririt-ayi",
|
"poll.voted": "Tdeɣṛeḍ ɣef tririt-ayi",
|
||||||
|
"poll.votes": "{votes, plural, one {# n udɣaṛ} other {# n yedɣaṛen}}",
|
||||||
"poll_button.add_poll": "Rnu asenqed",
|
"poll_button.add_poll": "Rnu asenqed",
|
||||||
"poll_button.remove_poll": "Kkes asenqed",
|
"poll_button.remove_poll": "Kkes asenqed",
|
||||||
"privacy.change": "Seggem tabaḍnit n yizen",
|
"privacy.change": "Seggem tabaḍnit n yizen",
|
||||||
|
@ -465,9 +489,12 @@
|
||||||
"relative_time.seconds": "{number}tas",
|
"relative_time.seconds": "{number}tas",
|
||||||
"relative_time.today": "assa",
|
"relative_time.today": "assa",
|
||||||
"reply_indicator.cancel": "Sefsex",
|
"reply_indicator.cancel": "Sefsex",
|
||||||
|
"reply_indicator.poll": "Afmiḍi",
|
||||||
"report.block": "Sewḥel",
|
"report.block": "Sewḥel",
|
||||||
|
"report.categories.legal": "Azerfan",
|
||||||
"report.categories.other": "Tiyyaḍ",
|
"report.categories.other": "Tiyyaḍ",
|
||||||
"report.categories.spam": "Aspam",
|
"report.categories.spam": "Aspam",
|
||||||
|
"report.category.subtitle": "Fren amṣada akk ufrin",
|
||||||
"report.category.title_account": "ameɣnu",
|
"report.category.title_account": "ameɣnu",
|
||||||
"report.category.title_status": "tasuffeɣt",
|
"report.category.title_status": "tasuffeɣt",
|
||||||
"report.close": "Immed",
|
"report.close": "Immed",
|
||||||
|
@ -476,13 +503,25 @@
|
||||||
"report.next": "Uḍfiṛ",
|
"report.next": "Uḍfiṛ",
|
||||||
"report.placeholder": "Iwenniten-nniḍen",
|
"report.placeholder": "Iwenniten-nniḍen",
|
||||||
"report.reasons.dislike": "Ur t-ḥemmleɣ ara",
|
"report.reasons.dislike": "Ur t-ḥemmleɣ ara",
|
||||||
|
"report.reasons.dislike_description": "D ayen akk ur bɣiɣ ara ad waliɣ",
|
||||||
"report.reasons.other": "D ayen nniḍen",
|
"report.reasons.other": "D ayen nniḍen",
|
||||||
|
"report.reasons.other_description": "Ugur ur yemṣada ara akk d taggayin-nniḍen",
|
||||||
"report.reasons.spam": "D aspam",
|
"report.reasons.spam": "D aspam",
|
||||||
|
"report.reasons.spam_description": "Yir iseɣwan, yir agman d tririyin i d-yettuɣalen",
|
||||||
|
"report.reasons.violation": "Truẓi n yilugan n uqeddac",
|
||||||
|
"report.reasons.violation_description": "Teẓriḍ y·tettruẓu kra n yilugan",
|
||||||
|
"report.rules.subtitle": "Fren ayen akk yemṣadan",
|
||||||
|
"report.rules.title": "Acu n yilugan i yettwarẓan?",
|
||||||
|
"report.statuses.subtitle": "Fren ayen akk yemṣadan",
|
||||||
|
"report.statuses.title": "Llant tsuffaɣ ara isdemren aneqqis-a?",
|
||||||
"report.submit": "Azen",
|
"report.submit": "Azen",
|
||||||
"report.target": "Mmel {target}",
|
"report.target": "Mmel {target}",
|
||||||
|
"report.thanks.take_action_actionable": "Ideg nekkni nessenqad tuttra-inek•inem, tzemreḍ ad tḥadreḍ mgal @{name}:",
|
||||||
"report.thanks.title": "Ur tebɣiḍ ara ad twaliḍ aya?",
|
"report.thanks.title": "Ur tebɣiḍ ara ad twaliḍ aya?",
|
||||||
|
"report.thanks.title_actionable": "Tanemmirt ɣef uneqqis, ad nwali deg waya.",
|
||||||
"report.unfollow": "Seḥbes aḍfar n @{name}",
|
"report.unfollow": "Seḥbes aḍfar n @{name}",
|
||||||
"report_notification.attached_statuses": "{count, plural, one {# post} other {# posts}} attached",
|
"report_notification.attached_statuses": "{count, plural, one {# post} other {# posts}} attached",
|
||||||
|
"report_notification.categories.legal": "Azerfan",
|
||||||
"report_notification.categories.other": "Ayen nniḍen",
|
"report_notification.categories.other": "Ayen nniḍen",
|
||||||
"report_notification.categories.spam": "Aspam",
|
"report_notification.categories.spam": "Aspam",
|
||||||
"report_notification.open": "Ldi aneqqis",
|
"report_notification.open": "Ldi aneqqis",
|
||||||
|
@ -497,6 +536,7 @@
|
||||||
"search_popout.full_text_search_disabled_message": "Ur yelli ara deg {domain}.",
|
"search_popout.full_text_search_disabled_message": "Ur yelli ara deg {domain}.",
|
||||||
"search_popout.language_code": "Tangalt ISO n tutlayt",
|
"search_popout.language_code": "Tangalt ISO n tutlayt",
|
||||||
"search_popout.options": "Iwellihen n unadi",
|
"search_popout.options": "Iwellihen n unadi",
|
||||||
|
"search_popout.quick_actions": "Tigawin tiruradin",
|
||||||
"search_popout.recent": "Inadiyen ineggura",
|
"search_popout.recent": "Inadiyen ineggura",
|
||||||
"search_popout.user": "amseqdac",
|
"search_popout.user": "amseqdac",
|
||||||
"search_results.accounts": "Imeɣna",
|
"search_results.accounts": "Imeɣna",
|
||||||
|
@ -505,7 +545,9 @@
|
||||||
"search_results.see_all": "Wali-ten akk",
|
"search_results.see_all": "Wali-ten akk",
|
||||||
"search_results.statuses": "Tisuffaɣ",
|
"search_results.statuses": "Tisuffaɣ",
|
||||||
"search_results.title": "Anadi ɣef {q}",
|
"search_results.title": "Anadi ɣef {q}",
|
||||||
|
"server_banner.active_users": "iseqdacen urmiden",
|
||||||
"server_banner.administered_by": "Yettwadbel sɣur :",
|
"server_banner.administered_by": "Yettwadbel sɣur :",
|
||||||
|
"server_banner.server_stats": "Tidaddanin n uqeddac:",
|
||||||
"sign_in_banner.create_account": "Snulfu-d amiḍan",
|
"sign_in_banner.create_account": "Snulfu-d amiḍan",
|
||||||
"sign_in_banner.sign_in": "Qqen",
|
"sign_in_banner.sign_in": "Qqen",
|
||||||
"sign_in_banner.sso_redirect": "Qqen neɣ jerred",
|
"sign_in_banner.sso_redirect": "Qqen neɣ jerred",
|
||||||
|
@ -516,13 +558,21 @@
|
||||||
"status.cannot_reblog": "Tasuffeɣt-a ur tezmir ara ad tettwabḍu tikelt-nniḍen",
|
"status.cannot_reblog": "Tasuffeɣt-a ur tezmir ara ad tettwabḍu tikelt-nniḍen",
|
||||||
"status.copy": "Nɣel assaɣ ɣer tasuffeɣt",
|
"status.copy": "Nɣel assaɣ ɣer tasuffeɣt",
|
||||||
"status.delete": "Kkes",
|
"status.delete": "Kkes",
|
||||||
|
"status.direct": "Bder-d @{name} weḥd-s",
|
||||||
|
"status.direct_indicator": "Abdar uslig",
|
||||||
"status.edit": "Ẓreg",
|
"status.edit": "Ẓreg",
|
||||||
"status.edited_x_times": "Tettwaẓreg {count, plural, one {{count} n tikkelt} other {{count} n tikkal}}",
|
"status.edited_x_times": "Tettwaẓreg {count, plural, one {{count} n tikkelt} other {{count} n tikkal}}",
|
||||||
"status.embed": "Seddu",
|
"status.embed": "Seddu",
|
||||||
|
"status.favourite": "Amenyaf",
|
||||||
|
"status.favourites": "{count, plural, one {n usmenyaf} other {n ismenyafen}}",
|
||||||
"status.filter": "Sizdeg tassufeɣt-a",
|
"status.filter": "Sizdeg tassufeɣt-a",
|
||||||
"status.filtered": "Yettwasizdeg",
|
"status.filtered": "Yettwasizdeg",
|
||||||
"status.hide": "Ffer tasuffeɣt",
|
"status.hide": "Ffer tasuffeɣt",
|
||||||
|
"status.history.created": "Yerna-t {name} {date}",
|
||||||
|
"status.history.edited": "Ibeddel-it {name} {date}",
|
||||||
"status.load_more": "Sali ugar",
|
"status.load_more": "Sali ugar",
|
||||||
|
"status.media.open": "Sit i ulday",
|
||||||
|
"status.media.show": "Sit i uskan",
|
||||||
"status.media_hidden": "Amidya yettwaffer",
|
"status.media_hidden": "Amidya yettwaffer",
|
||||||
"status.mention": "Bder-d @{name}",
|
"status.mention": "Bder-d @{name}",
|
||||||
"status.more": "Ugar",
|
"status.more": "Ugar",
|
||||||
|
@ -534,6 +584,7 @@
|
||||||
"status.read_more": "Issin ugar",
|
"status.read_more": "Issin ugar",
|
||||||
"status.reblog": "Bḍu",
|
"status.reblog": "Bḍu",
|
||||||
"status.reblogged_by": "Yebḍa-tt {name}",
|
"status.reblogged_by": "Yebḍa-tt {name}",
|
||||||
|
"status.reblogs": "{count, plural, one {n usnerni} other {n yisnernuyen}}",
|
||||||
"status.reblogs.empty": "Ula yiwen ur yebḍi tajewwiqt-agi ar tura. Ticki yebḍa-tt yiwen, ad d-iban da.",
|
"status.reblogs.empty": "Ula yiwen ur yebḍi tajewwiqt-agi ar tura. Ticki yebḍa-tt yiwen, ad d-iban da.",
|
||||||
"status.redraft": "Kkes tɛiwdeḍ tira",
|
"status.redraft": "Kkes tɛiwdeḍ tira",
|
||||||
"status.remove_bookmark": "Kkes tacreḍt",
|
"status.remove_bookmark": "Kkes tacreḍt",
|
||||||
|
@ -548,6 +599,7 @@
|
||||||
"status.show_less_all": "Semẓi akk tisuffɣin",
|
"status.show_less_all": "Semẓi akk tisuffɣin",
|
||||||
"status.show_more": "Ssken-d ugar",
|
"status.show_more": "Ssken-d ugar",
|
||||||
"status.show_more_all": "Ẓerr ugar lebda",
|
"status.show_more_all": "Ẓerr ugar lebda",
|
||||||
|
"status.show_original": "Sken aɣbalu",
|
||||||
"status.title.with_attachments": "{user} posted {attachmentCount, plural, one {an attachment} other {# attachments}}",
|
"status.title.with_attachments": "{user} posted {attachmentCount, plural, one {an attachment} other {# attachments}}",
|
||||||
"status.translate": "Suqel",
|
"status.translate": "Suqel",
|
||||||
"status.translated_from_with": "Yettwasuqel seg {lang} s {provider}",
|
"status.translated_from_with": "Yettwasuqel seg {lang} s {provider}",
|
||||||
|
@ -582,6 +634,7 @@
|
||||||
"upload_form.video_description": "Glem-d i yemdanen i yesɛan ugur deg tmesliwt neɣ deg yiẓri",
|
"upload_form.video_description": "Glem-d i yemdanen i yesɛan ugur deg tmesliwt neɣ deg yiẓri",
|
||||||
"upload_modal.analyzing_picture": "Tasleḍt n tugna tetteddu…",
|
"upload_modal.analyzing_picture": "Tasleḍt n tugna tetteddu…",
|
||||||
"upload_modal.apply": "Snes",
|
"upload_modal.apply": "Snes",
|
||||||
|
"upload_modal.applying": "Asnas…",
|
||||||
"upload_modal.choose_image": "Fren tugna",
|
"upload_modal.choose_image": "Fren tugna",
|
||||||
"upload_modal.description_placeholder": "Aberraɣ arurad ineggez nnig n uqjun amuṭṭis",
|
"upload_modal.description_placeholder": "Aberraɣ arurad ineggez nnig n uqjun amuṭṭis",
|
||||||
"upload_modal.detect_text": "Sefru-d aḍris seg tugna",
|
"upload_modal.detect_text": "Sefru-d aḍris seg tugna",
|
||||||
|
@ -589,6 +642,7 @@
|
||||||
"upload_modal.preparing_ocr": "Aheyyi n OCR…",
|
"upload_modal.preparing_ocr": "Aheyyi n OCR…",
|
||||||
"upload_modal.preview_label": "Taskant ({ratio})",
|
"upload_modal.preview_label": "Taskant ({ratio})",
|
||||||
"upload_progress.label": "Asali iteddu...",
|
"upload_progress.label": "Asali iteddu...",
|
||||||
|
"upload_progress.processing": "Asesfer…",
|
||||||
"username.taken": "Yettwaṭṭef yisem-a n useqdac. Ɛreḍ wayeḍ",
|
"username.taken": "Yettwaṭṭef yisem-a n useqdac. Ɛreḍ wayeḍ",
|
||||||
"video.close": "Mdel tabidyutt",
|
"video.close": "Mdel tabidyutt",
|
||||||
"video.download": "Sidered afaylu",
|
"video.download": "Sidered afaylu",
|
||||||
|
|
|
@ -35,6 +35,7 @@
|
||||||
"account.follow_back": "Sekot atpakaļ",
|
"account.follow_back": "Sekot atpakaļ",
|
||||||
"account.followers": "Sekotāji",
|
"account.followers": "Sekotāji",
|
||||||
"account.followers.empty": "Šim lietotājam vēl nav sekotāju.",
|
"account.followers.empty": "Šim lietotājam vēl nav sekotāju.",
|
||||||
|
"account.followers_counter": "{count, plural, zero {{count} sekotāju} one {{count} sekotājs} other {{count} sekotāji}}",
|
||||||
"account.following": "Seko",
|
"account.following": "Seko",
|
||||||
"account.follows.empty": "Šis lietotājs pagaidām nevienam neseko.",
|
"account.follows.empty": "Šis lietotājs pagaidām nevienam neseko.",
|
||||||
"account.go_to_profile": "Doties uz profilu",
|
"account.go_to_profile": "Doties uz profilu",
|
||||||
|
@ -312,9 +313,9 @@
|
||||||
"home.column_settings.show_reblogs": "Rādīt pastiprinātos ierakstus",
|
"home.column_settings.show_reblogs": "Rādīt pastiprinātos ierakstus",
|
||||||
"home.column_settings.show_replies": "Rādīt atbildes",
|
"home.column_settings.show_replies": "Rādīt atbildes",
|
||||||
"home.hide_announcements": "Slēpt paziņojumus",
|
"home.hide_announcements": "Slēpt paziņojumus",
|
||||||
"home.pending_critical_update.body": "Lūdzu, pēc iespējas ātrāk atjaunini savu Mastodon serveri!",
|
"home.pending_critical_update.body": "Lūgums pēc iespējas drīzāk atjaunināt savu Mastodon serveri.",
|
||||||
"home.pending_critical_update.link": "Skatīt jauninājumus",
|
"home.pending_critical_update.link": "Skatīt jauninājumus",
|
||||||
"home.pending_critical_update.title": "Pieejams kritisks drošības jauninājums!",
|
"home.pending_critical_update.title": "Ir pieejams būtisks drošības atjauninājums.",
|
||||||
"home.show_announcements": "Rādīt paziņojumus",
|
"home.show_announcements": "Rādīt paziņojumus",
|
||||||
"interaction_modal.description.favourite": "Ar Mastodon kontu tu vari pievienot šo ziņu izlasei, lai informētu autoru, ka to novērtē, un saglabātu to vēlākai lasīšanai.",
|
"interaction_modal.description.favourite": "Ar Mastodon kontu tu vari pievienot šo ziņu izlasei, lai informētu autoru, ka to novērtē, un saglabātu to vēlākai lasīšanai.",
|
||||||
"interaction_modal.description.follow": "Ar Mastodon kontu Tu vari sekot {name}, lai saņemtu lietotāja ierakstus savā mājas plūsmā.",
|
"interaction_modal.description.follow": "Ar Mastodon kontu Tu vari sekot {name}, lai saņemtu lietotāja ierakstus savā mājas plūsmā.",
|
||||||
|
|
|
@ -3,6 +3,8 @@
|
||||||
"about.contact": "Контакт:",
|
"about.contact": "Контакт:",
|
||||||
"about.disclaimer": "Mastodon є задарьнов проґрамов из удпертым кодом тай торговов значков Mastodon gGmbH.",
|
"about.disclaimer": "Mastodon є задарьнов проґрамов из удпертым кодом тай торговов значков Mastodon gGmbH.",
|
||||||
"about.domain_blocks.no_reason_available": "Причины не ясні",
|
"about.domain_blocks.no_reason_available": "Причины не ясні",
|
||||||
|
"about.domain_blocks.preamble": "Майбульш Mastodon поволят вам позирати контент тай комуніковати из хосновачами из другых федерованых серверув. Туй лиш уняткы учинені про сись конкретный сервер.",
|
||||||
|
"about.domain_blocks.silenced.explanation": "Вы майбульш не будете видіти профілі тай контент из сього сервера, кидь не будете го самі глядати авадь пудпишете ся на нього.",
|
||||||
"about.domain_blocks.silenced.title": "Обмежено",
|
"about.domain_blocks.silenced.title": "Обмежено",
|
||||||
"about.domain_blocks.suspended.explanation": "Ниякі податкы из сього сервера не будут уброблені, усокочені ци поміняні, што чинит невозможнов хоть-яку інтеракцію ци зязок из хосновачами из сього сервера.",
|
"about.domain_blocks.suspended.explanation": "Ниякі податкы из сього сервера не будут уброблені, усокочені ци поміняні, што чинит невозможнов хоть-яку інтеракцію ци зязок из хосновачами из сього сервера.",
|
||||||
"about.domain_blocks.suspended.title": "Заблоковано",
|
"about.domain_blocks.suspended.title": "Заблоковано",
|
||||||
|
@ -20,6 +22,7 @@
|
||||||
"account.browse_more_on_origin_server": "Позирайте бульше на ориґіналнум профілю",
|
"account.browse_more_on_origin_server": "Позирайте бульше на ориґіналнум профілю",
|
||||||
"account.cancel_follow_request": "Удмінити пудписку",
|
"account.cancel_follow_request": "Удмінити пудписку",
|
||||||
"account.copy": "Зкопіровати удкликованя на профіл",
|
"account.copy": "Зкопіровати удкликованя на профіл",
|
||||||
|
"account.direct": "Пошептати @{name}",
|
||||||
"account.disable_notifications": "Бульше не сповіщати ми коли {name} пише",
|
"account.disable_notifications": "Бульше не сповіщати ми коли {name} пише",
|
||||||
"account.domain_blocked": "Домен заблокованый",
|
"account.domain_blocked": "Домен заблокованый",
|
||||||
"account.edit_profile": "Управити профіл",
|
"account.edit_profile": "Управити профіл",
|
||||||
|
@ -39,8 +42,10 @@
|
||||||
"account.joined_short": "Датум прикапчованя",
|
"account.joined_short": "Датум прикапчованя",
|
||||||
"account.languages": "Поміняти убрані языкы",
|
"account.languages": "Поміняти убрані языкы",
|
||||||
"account.link_verified_on": "Властность сього удкликованя было звірено {date}",
|
"account.link_verified_on": "Властность сього удкликованя было звірено {date}",
|
||||||
|
"account.locked_info": "Сись профіл є замкнутый. Ґазда акаунта буде ручно провіряти тко го може зафоловити.",
|
||||||
"account.media": "Медіа",
|
"account.media": "Медіа",
|
||||||
"account.moved_to": "Хосновач {name} указав, ож новый профіл йим є:",
|
"account.mention": "Спомянути @{name}",
|
||||||
|
"account.moved_to": "Хосновач {name} указав, ож новый профіл му є:",
|
||||||
"account.mute": "Стишити {name}",
|
"account.mute": "Стишити {name}",
|
||||||
"account.mute_notifications_short": "Стишити голошіня",
|
"account.mute_notifications_short": "Стишити голошіня",
|
||||||
"account.mute_short": "Стишити",
|
"account.mute_short": "Стишити",
|
||||||
|
@ -60,9 +65,12 @@
|
||||||
"account.unblock_short": "Розблоковати",
|
"account.unblock_short": "Розблоковати",
|
||||||
"account.unendorse": "Не указовати на профілови",
|
"account.unendorse": "Не указовати на профілови",
|
||||||
"account.unfollow": "Удписати ся",
|
"account.unfollow": "Удписати ся",
|
||||||
|
"account.unmute": "Указовати {name}",
|
||||||
"account.unmute_notifications_short": "Указовати голошіня",
|
"account.unmute_notifications_short": "Указовати голошіня",
|
||||||
"account.unmute_short": "Указовати",
|
"account.unmute_short": "Указовати",
|
||||||
"account_note.placeholder": "Клопкніт обы додати примітку",
|
"account_note.placeholder": "Клопкніт обы додати примітку",
|
||||||
|
"admin.dashboard.retention.average": "Середньоє",
|
||||||
|
"admin.dashboard.retention.cohort": "Місяць прикапчованя",
|
||||||
"admin.dashboard.retention.cohort_size": "Нові хосновачі",
|
"admin.dashboard.retention.cohort_size": "Нові хосновачі",
|
||||||
"admin.impact_report.instance_accounts": "Профілі из акаунтув, котрі ся удалят",
|
"admin.impact_report.instance_accounts": "Профілі из акаунтув, котрі ся удалят",
|
||||||
"admin.impact_report.instance_followers": "Пудписникы, котрых стратят наші хосновачі",
|
"admin.impact_report.instance_followers": "Пудписникы, котрых стратят наші хосновачі",
|
||||||
|
@ -70,11 +78,77 @@
|
||||||
"admin.impact_report.title": "Вплыв цілком",
|
"admin.impact_report.title": "Вплыв цілком",
|
||||||
"alert.rate_limited.message": "Попробуйте зась по {retry_time, time, medium}.",
|
"alert.rate_limited.message": "Попробуйте зась по {retry_time, time, medium}.",
|
||||||
"alert.rate_limited.title": "Частота обмежена",
|
"alert.rate_limited.title": "Частота обмежена",
|
||||||
|
"alert.unexpected.message": "Стала ся нечекана хыба.",
|
||||||
|
"alert.unexpected.title": "Ийой!",
|
||||||
|
"announcement.announcement": "Голошіня",
|
||||||
|
"audio.hide": "Зпрятати звук",
|
||||||
|
"block_modal.remote_users_caveat": "Попросиме ґазду сервера {domain} честовати вашоє рішеня. Айбо не ґарантуєме повный соглас, бо даякі серверы можут брати блокованя по-инчакому. Публичні дописы годно быти видко незалоґованым хосновачам.",
|
||||||
|
"block_modal.show_less": "Указати менше",
|
||||||
|
"block_modal.show_more": "Указати бульше",
|
||||||
|
"block_modal.they_cant_mention": "Они не можут вас споминати авадь слідовати.",
|
||||||
|
"block_modal.they_cant_see_posts": "Они не можут видіти ваші публикації, тай наспак — вы йихні.",
|
||||||
|
"block_modal.they_will_know": "Они видят, ож сут заблоковані.",
|
||||||
|
"block_modal.title": "Заблоковати хосновача?",
|
||||||
|
"block_modal.you_wont_see_mentions": "Не будете видіти публикації тай споминкы сього хосновача.",
|
||||||
|
"boost_modal.combo": "Можете клынцнути {combo} другый раз обы сесе пропустити",
|
||||||
|
"bundle_column_error.copy_stacktrace": "Укопіровати звіт за хыбу",
|
||||||
|
"bundle_column_error.error.body": "Не годни сьме указати зажадану сторунку. Годно быти спозад хыбы у нашум сістемі, авадь проблемы зумісности бравзера.",
|
||||||
|
"bundle_column_error.error.title": "Ийой!",
|
||||||
|
"bundle_column_error.network.body": "Стала ся хыба як сьме пробовали напаровати сторунку. Годно ся йсе было стати спозад слабого споєня вашого інтернета, авадь сервера.",
|
||||||
|
"bundle_column_error.network.title": "Хыба споєня",
|
||||||
|
"bundle_column_error.retry": "Попробуйте зась",
|
||||||
"bundle_column_error.return": "Вернути ся на головну",
|
"bundle_column_error.return": "Вернути ся на головну",
|
||||||
"bundle_column_error.routing.body": "Не можеме найти сяку сторунку. Бизувні сьте, ож URL у адресному шорикови є добрый?",
|
"bundle_column_error.routing.body": "Не можеме найти сяку сторунку. Бизувні сьте, ож URL у адресному шорикови є добрый?",
|
||||||
"bundle_column_error.routing.title": "404",
|
"bundle_column_error.routing.title": "404",
|
||||||
"bundle_modal_error.close": "Заперти",
|
"bundle_modal_error.close": "Заперти",
|
||||||
"bundle_modal_error.message": "Штось ся показило, закидь сьме ладовали сись компонент.",
|
"bundle_modal_error.message": "Штось ся показило, закидь сьме ладовали сись компонент.",
|
||||||
"bundle_modal_error.retry": "Попробовати зась",
|
"bundle_modal_error.retry": "Попробовати зась",
|
||||||
"closed_registrations.other_server_instructions": "Mastodon є децентралізованов платформов, можете си учинити профіл и на другому серверови тай комуніковати из сим."
|
"closed_registrations.other_server_instructions": "Mastodon є децентралізованов платформов, можете си учинити профіл и на другому серверови тай комуніковати из сим.",
|
||||||
|
"closed_registrations_modal.description": "Раз не мож учинити профіл на {domain}, айбо не мусите мати профіл ипен на серверови {domain} обы хосновати Mastodon.",
|
||||||
|
"closed_registrations_modal.find_another_server": "Найти другый сервер",
|
||||||
|
"column.about": "За сайт",
|
||||||
|
"column.blocks": "Заблоковані хосновачі",
|
||||||
|
"column.bookmarks": "Усокоченоє",
|
||||||
|
"column.direct": "Шептаня",
|
||||||
|
"column.directory": "Никати профілі",
|
||||||
|
"column.domain_blocks": "Заблоковані домены",
|
||||||
|
"column.favourites": "Убраноє",
|
||||||
|
"column.follow_requests": "Запросы на пудписку",
|
||||||
|
"column.lists": "Исписы",
|
||||||
|
"column.mutes": "Стишені хосновачі",
|
||||||
|
"column.notifications": "Убвіщеня",
|
||||||
|
"column.pins": "Закріплені публикації",
|
||||||
|
"column_back_button.label": "Назад",
|
||||||
|
"column_header.hide_settings": "Спрятати штімованя",
|
||||||
|
"column_header.moveLeft_settings": "Посунути колонку до ліва",
|
||||||
|
"column_header.moveRight_settings": "Посунути колонку до права",
|
||||||
|
"column_header.pin": "Закріпити",
|
||||||
|
"column_header.show_settings": "Указати штімованя",
|
||||||
|
"column_header.unpin": "Удкріпити",
|
||||||
|
"column_subheading.settings": "Штімованя",
|
||||||
|
"compose.language.change": "Поміняти язык",
|
||||||
|
"compose.language.search": "Глядати языкы...",
|
||||||
|
"compose.published.body": "Пост опубликованый.",
|
||||||
|
"compose.saved.body": "Пост усокоченый.",
|
||||||
|
"compose_form.direct_message_warning_learn_more": "Читайте бульше",
|
||||||
|
"compose_form.encryption_warning": "Публикації на Mastodon не шіфрувут ся. Не шырьте чутливу інформацію через Mastodon.",
|
||||||
|
"compose_form.hashtag_warning": "Сись пост не буде ся появляти у исписови по гештеґови, бо вун не є публичный. Лишек публичні посты буде видко за гештеґом.",
|
||||||
|
"compose_form.lock_disclaimer": "Ваш профіл є {locked}. Хоть-тко може ся на вас пудписати, обы видїти ваші ексклузівні посты.",
|
||||||
|
"compose_form.lock_disclaimer.lock": "замкнено",
|
||||||
|
"compose_form.placeholder": "Што нового?",
|
||||||
|
"compose_form.poll.duration": "Трывалость убзвідованя",
|
||||||
|
"compose_form.poll.multiple": "Дакулько варіантув",
|
||||||
|
"compose_form.poll.option_placeholder": "Варіант {number}",
|
||||||
|
"compose_form.poll.single": "Уберіт єден",
|
||||||
|
"compose_form.poll.switch_to_multiple": "Змінити убзвідованя обы поволити дакулько варіантув",
|
||||||
|
"compose_form.poll.switch_to_single": "Змінити убзвідованя обы поволити лишек єден варіант",
|
||||||
|
"compose_form.poll.type": "Стіл",
|
||||||
|
"compose_form.publish": "Публикація",
|
||||||
|
"compose_form.publish_form": "Нова публикація",
|
||||||
|
"compose_form.reply": "Удповідь",
|
||||||
|
"copypaste.copy_to_clipboard": "Копіровати у памнять",
|
||||||
|
"directory.recently_active": "Недавно актівні",
|
||||||
|
"disabled_account_banner.account_settings": "Штімованя акаунта",
|
||||||
|
"disabled_account_banner.text": "Ваш акаунт {disabledAccount} раз є неактівный.",
|
||||||
|
"dismissable_banner.community_timeline": "Туй сут недавні публикації уд профілув на серверови {domain}."
|
||||||
}
|
}
|
||||||
|
|
|
@ -32,7 +32,7 @@
|
||||||
"account.featured_tags.last_status_never": "Немає дописів",
|
"account.featured_tags.last_status_never": "Немає дописів",
|
||||||
"account.featured_tags.title": "{name} виділяє хештеґи",
|
"account.featured_tags.title": "{name} виділяє хештеґи",
|
||||||
"account.follow": "Підписатися",
|
"account.follow": "Підписатися",
|
||||||
"account.follow_back": "Підписатися взаємно",
|
"account.follow_back": "Стежити також",
|
||||||
"account.followers": "Підписники",
|
"account.followers": "Підписники",
|
||||||
"account.followers.empty": "Ніхто ще не підписаний на цього користувача.",
|
"account.followers.empty": "Ніхто ще не підписаний на цього користувача.",
|
||||||
"account.followers_counter": "{count, plural, one {{counter} підписник} few {{counter} підписники} many {{counter} підписників} other {{counter} підписники}}",
|
"account.followers_counter": "{count, plural, one {{counter} підписник} few {{counter} підписники} many {{counter} підписників} other {{counter} підписники}}",
|
||||||
|
@ -217,18 +217,18 @@
|
||||||
"domain_block_modal.title": "Заблокувати домен?",
|
"domain_block_modal.title": "Заблокувати домен?",
|
||||||
"domain_block_modal.you_will_lose_followers": "Усіх ваших підписників з цього сервера буде вилучено.",
|
"domain_block_modal.you_will_lose_followers": "Усіх ваших підписників з цього сервера буде вилучено.",
|
||||||
"domain_block_modal.you_wont_see_posts": "Ви не бачитимете дописів і сповіщень від користувачів на цьому сервері.",
|
"domain_block_modal.you_wont_see_posts": "Ви не бачитимете дописів і сповіщень від користувачів на цьому сервері.",
|
||||||
"domain_pill.activitypub_lets_connect": "Це дозволяє вам спілкуватися та взаємодіяти з людьми не лише на Mastodon, але й у різних соціальних додатках.",
|
"domain_pill.activitypub_lets_connect": "Це дозволяє вам спілкуватися та взаємодіяти з людьми не лише на Mastodon, але й у різних соціальних застосунках.",
|
||||||
"domain_pill.activitypub_like_language": "ActivityPub - це як мова, якою Мастодонт розмовляє з іншими соціальними мережами.",
|
"domain_pill.activitypub_like_language": "ActivityPub - це як мова, якою Mastodon розмовляє з іншими соціальними мережами.",
|
||||||
"domain_pill.server": "Сервер",
|
"domain_pill.server": "Сервер",
|
||||||
"domain_pill.their_handle": "Їхня адреса:",
|
"domain_pill.their_handle": "Їхня адреса:",
|
||||||
"domain_pill.their_server": "Їхній цифровий дім, де живуть усі їхні пости.",
|
"domain_pill.their_server": "Їхній цифровий дім, де живуть усі їхні дописи.",
|
||||||
"domain_pill.their_username": "Їхній унікальний ідентифікатор на їхньому сервері. Ви можете знайти користувачів з однаковими іменами на різних серверах.",
|
"domain_pill.their_username": "Їхній унікальний ідентифікатор на їхньому сервері. Ви можете знайти користувачів з однаковими іменами на різних серверах.",
|
||||||
"domain_pill.username": "Ім'я користувача",
|
"domain_pill.username": "Ім'я користувача",
|
||||||
"domain_pill.whats_in_a_handle": "Що є в адресі?",
|
"domain_pill.whats_in_a_handle": "Що є в адресі?",
|
||||||
"domain_pill.who_they_are": "Оскільки дескриптори вказують, хто це і де він знаходиться, ви можете взаємодіяти з людьми через соціальну мережу платформ на основі <button>ActivityPub</button>.",
|
"domain_pill.who_they_are": "Оскільки дескриптори вказують, хто це і де він знаходиться, ви можете взаємодіяти з людьми через соціальну мережу платформ на основі <button>ActivityPub</button>.",
|
||||||
"domain_pill.who_you_are": "Оскільки ваш нікнейм вказує, хто ви та де ви, люди можуть взаємодіяти з вами через соціальну мережу платформ на основі <button>ActivityPub</button>.",
|
"domain_pill.who_you_are": "Оскільки ваш нікнейм вказує, хто ви та де ви, люди можуть взаємодіяти з вами через соціальну мережу платформ на основі <button>ActivityPub</button>.",
|
||||||
"domain_pill.your_handle": "Ваша адреса:",
|
"domain_pill.your_handle": "Ваша адреса:",
|
||||||
"domain_pill.your_server": "Ваш цифровий дім, де живуть усі ваші публікації. Не подобається цей? Перенесіть сервери в будь-який час і залучайте своїх підписників.",
|
"domain_pill.your_server": "Ваш цифровий дім, де живуть усі ваші дописи. Не подобається цей? Перенесіть сервери в будь-який час і залучайте своїх підписників.",
|
||||||
"domain_pill.your_username": "Ваш унікальний ідентифікатор на цьому сервері. Ви можете знайти користувачів з однаковими іменами на різних серверах.",
|
"domain_pill.your_username": "Ваш унікальний ідентифікатор на цьому сервері. Ви можете знайти користувачів з однаковими іменами на різних серверах.",
|
||||||
"embed.instructions": "Вбудуйте цей допис до вашого вебсайту, скопіювавши код нижче.",
|
"embed.instructions": "Вбудуйте цей допис до вашого вебсайту, скопіювавши код нижче.",
|
||||||
"embed.preview": "Ось який вигляд це матиме:",
|
"embed.preview": "Ось який вигляд це матиме:",
|
||||||
|
@ -489,9 +489,9 @@
|
||||||
"notification.reblog": "{name} поширює ваш допис",
|
"notification.reblog": "{name} поширює ваш допис",
|
||||||
"notification.relationships_severance_event": "Втрачено з'єднання з {name}",
|
"notification.relationships_severance_event": "Втрачено з'єднання з {name}",
|
||||||
"notification.relationships_severance_event.account_suspension": "Адміністратор з {from} призупинив {target}, що означає, що ви більше не можете отримувати оновлення від них або взаємодіяти з ними.",
|
"notification.relationships_severance_event.account_suspension": "Адміністратор з {from} призупинив {target}, що означає, що ви більше не можете отримувати оновлення від них або взаємодіяти з ними.",
|
||||||
"notification.relationships_severance_event.domain_block": "Адміністратор з {from} заблокував {target}, включаючи {followersCount} ваших підписників і {{followingCount, plural, one {# account} other {# accounts}}, на які ви підписані.",
|
"notification.relationships_severance_event.domain_block": "Адміністратор з {from} заблокував {target}, включаючи {followersCount} ваших підписників і {followingCount , plural, one {# обліковий запис} few {# облікові записи} many {# облікових записів} other {# обліковий запис}}, на які ви підписані.",
|
||||||
"notification.relationships_severance_event.learn_more": "Дізнатися більше",
|
"notification.relationships_severance_event.learn_more": "Докладніше",
|
||||||
"notification.relationships_severance_event.user_domain_block": "Ви заблокували {target}, видаливши {followersCount} ваших підписників і {followingCount, plural, one {# account} other {# accounts}}, за якими ви стежите.",
|
"notification.relationships_severance_event.user_domain_block": "Ви заблокували {target}, видаливши {followersCount} ваших підписників і {followingCount, plural, one {# обліковий запис} few {# облікові записи} many {# облікових записів} other {# обліковий запис}}, за якими ви стежите.",
|
||||||
"notification.status": "{name} щойно дописує",
|
"notification.status": "{name} щойно дописує",
|
||||||
"notification.update": "{name} змінює допис",
|
"notification.update": "{name} змінює допис",
|
||||||
"notification_requests.accept": "Прийняти",
|
"notification_requests.accept": "Прийняти",
|
||||||
|
|
|
@ -48,6 +48,10 @@ html {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.icon-button:disabled {
|
||||||
|
color: darken($action-button-color, 25%);
|
||||||
|
}
|
||||||
|
|
||||||
.account__header__bar .avatar .account__avatar {
|
.account__header__bar .avatar .account__avatar {
|
||||||
border-color: $white;
|
border-color: $white;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1366,6 +1366,8 @@ body > [data-popper-placement] {
|
||||||
min-height: 54px;
|
min-height: 54px;
|
||||||
border-bottom: 1px solid var(--background-border-color);
|
border-bottom: 1px solid var(--background-border-color);
|
||||||
cursor: auto;
|
cursor: auto;
|
||||||
|
opacity: 1;
|
||||||
|
animation: fade 150ms linear;
|
||||||
|
|
||||||
@keyframes fade {
|
@keyframes fade {
|
||||||
0% {
|
0% {
|
||||||
|
@ -1377,9 +1379,6 @@ body > [data-popper-placement] {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
opacity: 1;
|
|
||||||
animation: fade 150ms linear;
|
|
||||||
|
|
||||||
.media-gallery,
|
.media-gallery,
|
||||||
.video-player,
|
.video-player,
|
||||||
.audio-player,
|
.audio-player,
|
||||||
|
@ -4851,8 +4850,10 @@ a.status-card {
|
||||||
&__menu {
|
&__menu {
|
||||||
@include search-popout;
|
@include search-popout;
|
||||||
|
|
||||||
padding: 0;
|
& {
|
||||||
background: $ui-secondary-color;
|
padding: 0;
|
||||||
|
background: $ui-secondary-color;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
&__menu-list {
|
&__menu-list {
|
||||||
|
@ -10453,7 +10454,7 @@ noscript {
|
||||||
gap: 4px;
|
gap: 4px;
|
||||||
|
|
||||||
dt {
|
dt {
|
||||||
flex: 0 0 auto;
|
flex: 0 1 auto;
|
||||||
color: $dark-text-color;
|
color: $dark-text-color;
|
||||||
min-width: 0;
|
min-width: 0;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
|
|
|
@ -62,7 +62,8 @@ class LinkDetailsExtractor
|
||||||
end
|
end
|
||||||
|
|
||||||
def author_name
|
def author_name
|
||||||
author['name']
|
name = author['name']
|
||||||
|
name.is_a?(Array) ? name.join(', ') : name
|
||||||
end
|
end
|
||||||
|
|
||||||
def author_url
|
def author_url
|
||||||
|
@ -156,11 +157,11 @@ class LinkDetailsExtractor
|
||||||
end
|
end
|
||||||
|
|
||||||
def title
|
def title
|
||||||
html_entities.decode(structured_data&.headline || opengraph_tag('og:title') || document.xpath('//title').map(&:content).first).strip
|
html_entities_decode(structured_data&.headline || opengraph_tag('og:title') || document.xpath('//title').map(&:content).first)&.strip
|
||||||
end
|
end
|
||||||
|
|
||||||
def description
|
def description
|
||||||
html_entities.decode(structured_data&.description || opengraph_tag('og:description') || meta_tag('description'))
|
html_entities_decode(structured_data&.description || opengraph_tag('og:description') || meta_tag('description'))
|
||||||
end
|
end
|
||||||
|
|
||||||
def published_at
|
def published_at
|
||||||
|
@ -180,7 +181,7 @@ class LinkDetailsExtractor
|
||||||
end
|
end
|
||||||
|
|
||||||
def provider_name
|
def provider_name
|
||||||
html_entities.decode(structured_data&.publisher_name || opengraph_tag('og:site_name'))
|
html_entities_decode(structured_data&.publisher_name || opengraph_tag('og:site_name'))
|
||||||
end
|
end
|
||||||
|
|
||||||
def provider_url
|
def provider_url
|
||||||
|
@ -188,7 +189,7 @@ class LinkDetailsExtractor
|
||||||
end
|
end
|
||||||
|
|
||||||
def author_name
|
def author_name
|
||||||
html_entities.decode(structured_data&.author_name || opengraph_tag('og:author') || opengraph_tag('og:author:username'))
|
html_entities_decode(structured_data&.author_name || opengraph_tag('og:author') || opengraph_tag('og:author:username'))
|
||||||
end
|
end
|
||||||
|
|
||||||
def author_url
|
def author_url
|
||||||
|
@ -257,7 +258,7 @@ class LinkDetailsExtractor
|
||||||
|
|
||||||
next if json_ld.blank?
|
next if json_ld.blank?
|
||||||
|
|
||||||
structured_data = StructuredData.new(html_entities.decode(json_ld))
|
structured_data = StructuredData.new(html_entities_decode(json_ld))
|
||||||
|
|
||||||
next unless structured_data.valid?
|
next unless structured_data.valid?
|
||||||
|
|
||||||
|
@ -273,10 +274,11 @@ class LinkDetailsExtractor
|
||||||
end
|
end
|
||||||
|
|
||||||
def detect_encoding_and_parse_document
|
def detect_encoding_and_parse_document
|
||||||
[detect_encoding, nil, @html_charset, 'UTF-8'].uniq.each do |encoding|
|
[detect_encoding, nil, header_encoding].uniq.each do |encoding|
|
||||||
document = Nokogiri::HTML(@html, nil, encoding)
|
document = Nokogiri::HTML(@html, nil, encoding)
|
||||||
return document if document.to_s.valid_encoding?
|
return document if document.to_s.valid_encoding?
|
||||||
end
|
end
|
||||||
|
Nokogiri::HTML(@html, nil, 'UTF-8')
|
||||||
end
|
end
|
||||||
|
|
||||||
def detect_encoding
|
def detect_encoding
|
||||||
|
@ -284,12 +286,28 @@ class LinkDetailsExtractor
|
||||||
guess&.fetch(:confidence, 0).to_i > 60 ? guess&.fetch(:encoding, nil) : nil
|
guess&.fetch(:confidence, 0).to_i > 60 ? guess&.fetch(:encoding, nil) : nil
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def header_encoding
|
||||||
|
Encoding.find(@html_charset).name if @html_charset
|
||||||
|
rescue ArgumentError
|
||||||
|
# Encoding from HTTP header is not recognized by ruby
|
||||||
|
nil
|
||||||
|
end
|
||||||
|
|
||||||
def detector
|
def detector
|
||||||
@detector ||= CharlockHolmes::EncodingDetector.new.tap do |detector|
|
@detector ||= CharlockHolmes::EncodingDetector.new.tap do |detector|
|
||||||
detector.strip_tags = true
|
detector.strip_tags = true
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def html_entities_decode(string)
|
||||||
|
return if string.nil?
|
||||||
|
|
||||||
|
unicode_string = string.to_s.encode('UTF-8')
|
||||||
|
raise EncodingError, 'cannot convert string to valid UTF-8' unless unicode_string.valid_encoding?
|
||||||
|
|
||||||
|
html_entities.decode(unicode_string)
|
||||||
|
end
|
||||||
|
|
||||||
def html_entities
|
def html_entities
|
||||||
@html_entities ||= HTMLEntities.new(:expanded)
|
@html_entities ||= HTMLEntities.new(:expanded)
|
||||||
end
|
end
|
||||||
|
|
|
@ -91,6 +91,10 @@ module User::HasSettings
|
||||||
settings['web.disable_swiping']
|
settings['web.disable_swiping']
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def setting_disable_hover_cards
|
||||||
|
settings['web.disable_hover_cards']
|
||||||
|
end
|
||||||
|
|
||||||
def setting_always_send_emails
|
def setting_always_send_emails
|
||||||
settings['always_send_emails']
|
settings['always_send_emails']
|
||||||
end
|
end
|
||||||
|
|
|
@ -46,6 +46,11 @@ class PreviewCard < ApplicationRecord
|
||||||
y_comp: 4,
|
y_comp: 4,
|
||||||
}.freeze
|
}.freeze
|
||||||
|
|
||||||
|
# URL size limit to safely store in PosgreSQL's unique indexes
|
||||||
|
# Technically this is a byte-size limit but we use it as a
|
||||||
|
# character limit to work with length validation
|
||||||
|
URL_CHARACTER_LIMIT = 2692
|
||||||
|
|
||||||
self.inheritance_column = false
|
self.inheritance_column = false
|
||||||
|
|
||||||
enum :type, { link: 0, photo: 1, video: 2, rich: 3 }
|
enum :type, { link: 0, photo: 1, video: 2, rich: 3 }
|
||||||
|
@ -63,7 +68,7 @@ class PreviewCard < ApplicationRecord
|
||||||
convert_options: { all: '-quality 90 +profile "!icc,*" +set date:modify +set date:create +set date:timestamp' },
|
convert_options: { all: '-quality 90 +profile "!icc,*" +set date:modify +set date:create +set date:timestamp' },
|
||||||
validate_media_type: false
|
validate_media_type: false
|
||||||
|
|
||||||
validates :url, presence: true, uniqueness: true, url: true
|
validates :url, presence: true, uniqueness: true, url: true, length: { maximum: URL_CHARACTER_LIMIT }
|
||||||
validates_attachment_content_type :image, content_type: IMAGE_MIME_TYPES
|
validates_attachment_content_type :image, content_type: IMAGE_MIME_TYPES
|
||||||
validates_attachment_size :image, less_than: LIMIT
|
validates_attachment_size :image, less_than: LIMIT
|
||||||
remotable_attachment :image, LIMIT
|
remotable_attachment :image, LIMIT
|
||||||
|
|
|
@ -288,7 +288,7 @@ class Status < ApplicationRecord
|
||||||
else
|
else
|
||||||
map = media_attachments.index_by(&:id)
|
map = media_attachments.index_by(&:id)
|
||||||
ordered_media_attachment_ids.filter_map { |media_attachment_id| map[media_attachment_id] }
|
ordered_media_attachment_ids.filter_map { |media_attachment_id| map[media_attachment_id] }
|
||||||
end
|
end.take(MEDIA_ATTACHMENTS_LIMIT)
|
||||||
end
|
end
|
||||||
|
|
||||||
def replies_count
|
def replies_count
|
||||||
|
|
|
@ -53,12 +53,14 @@ class StatusEdit < ApplicationRecord
|
||||||
def ordered_media_attachments
|
def ordered_media_attachments
|
||||||
return @ordered_media_attachments if defined?(@ordered_media_attachments)
|
return @ordered_media_attachments if defined?(@ordered_media_attachments)
|
||||||
|
|
||||||
@ordered_media_attachments = if ordered_media_attachment_ids.nil?
|
@ordered_media_attachments = begin
|
||||||
[]
|
if ordered_media_attachment_ids.nil?
|
||||||
else
|
[]
|
||||||
map = status.media_attachments.index_by(&:id)
|
else
|
||||||
ordered_media_attachment_ids.map.with_index { |media_attachment_id, index| PreservedMediaAttachment.new(media_attachment: map[media_attachment_id], description: media_descriptions[index]) }
|
map = status.media_attachments.index_by(&:id)
|
||||||
end
|
ordered_media_attachment_ids.map.with_index { |media_attachment_id, index| PreservedMediaAttachment.new(media_attachment: map[media_attachment_id], description: media_descriptions[index]) }
|
||||||
|
end
|
||||||
|
end.take(Status::MEDIA_ATTACHMENTS_LIMIT)
|
||||||
end
|
end
|
||||||
|
|
||||||
def proper
|
def proper
|
||||||
|
|
|
@ -25,6 +25,7 @@ class UserSettings
|
||||||
setting :use_pending_items, default: false
|
setting :use_pending_items, default: false
|
||||||
setting :use_system_font, default: false
|
setting :use_system_font, default: false
|
||||||
setting :disable_swiping, default: false
|
setting :disable_swiping, default: false
|
||||||
|
setting :disable_hover_cards, default: false
|
||||||
setting :delete_modal, default: true
|
setting :delete_modal, default: true
|
||||||
setting :reblog_modal, default: false
|
setting :reblog_modal, default: false
|
||||||
setting :reduce_motion, default: false
|
setting :reduce_motion, default: false
|
||||||
|
|
|
@ -24,6 +24,7 @@ class InitialStateSerializer < ActiveModel::Serializer
|
||||||
store[:expand_spoilers] = object_account_user.setting_expand_spoilers
|
store[:expand_spoilers] = object_account_user.setting_expand_spoilers
|
||||||
store[:reduce_motion] = object_account_user.setting_reduce_motion
|
store[:reduce_motion] = object_account_user.setting_reduce_motion
|
||||||
store[:disable_swiping] = object_account_user.setting_disable_swiping
|
store[:disable_swiping] = object_account_user.setting_disable_swiping
|
||||||
|
store[:disable_hover_cards] = object_account_user.setting_disable_hover_cards
|
||||||
store[:advanced_layout] = object_account_user.setting_advanced_layout
|
store[:advanced_layout] = object_account_user.setting_advanced_layout
|
||||||
store[:use_blurhash] = object_account_user.setting_use_blurhash
|
store[:use_blurhash] = object_account_user.setting_use_blurhash
|
||||||
store[:use_pending_items] = object_account_user.setting_use_pending_items
|
store[:use_pending_items] = object_account_user.setting_use_pending_items
|
||||||
|
|
|
@ -15,9 +15,6 @@ class FetchLinkCardService < BaseService
|
||||||
)
|
)
|
||||||
}iox
|
}iox
|
||||||
|
|
||||||
# URL size limit to safely store in PosgreSQL's unique indexes
|
|
||||||
BYTESIZE_LIMIT = 2692
|
|
||||||
|
|
||||||
def call(status)
|
def call(status)
|
||||||
@status = status
|
@status = status
|
||||||
@original_url = parse_urls
|
@original_url = parse_urls
|
||||||
|
@ -32,7 +29,7 @@ class FetchLinkCardService < BaseService
|
||||||
end
|
end
|
||||||
|
|
||||||
attach_card if @card&.persisted?
|
attach_card if @card&.persisted?
|
||||||
rescue HTTP::Error, OpenSSL::SSL::SSLError, Addressable::URI::InvalidURIError, Mastodon::HostValidationError, Mastodon::LengthValidationError, Encoding::UndefinedConversionError => e
|
rescue HTTP::Error, OpenSSL::SSL::SSLError, Addressable::URI::InvalidURIError, Mastodon::HostValidationError, Mastodon::LengthValidationError, EncodingError, ActiveRecord::RecordInvalid => e
|
||||||
Rails.logger.debug { "Error fetching link #{@original_url}: #{e}" }
|
Rails.logger.debug { "Error fetching link #{@original_url}: #{e}" }
|
||||||
nil
|
nil
|
||||||
end
|
end
|
||||||
|
@ -88,7 +85,7 @@ class FetchLinkCardService < BaseService
|
||||||
|
|
||||||
def bad_url?(uri)
|
def bad_url?(uri)
|
||||||
# Avoid local instance URLs and invalid URLs
|
# Avoid local instance URLs and invalid URLs
|
||||||
uri.host.blank? || TagManager.instance.local_url?(uri.to_s) || !%w(http https).include?(uri.scheme) || uri.to_s.bytesize > BYTESIZE_LIMIT
|
uri.host.blank? || TagManager.instance.local_url?(uri.to_s) || !%w(http https).include?(uri.scheme)
|
||||||
end
|
end
|
||||||
|
|
||||||
def mention_link?(anchor)
|
def mention_link?(anchor)
|
||||||
|
|
|
@ -56,6 +56,7 @@
|
||||||
= ff.input :'web.auto_play', wrapper: :with_label, recommended: true, label: I18n.t('simple_form.labels.defaults.setting_auto_play_gif')
|
= ff.input :'web.auto_play', wrapper: :with_label, recommended: true, label: I18n.t('simple_form.labels.defaults.setting_auto_play_gif')
|
||||||
= ff.input :'web.reduce_motion', wrapper: :with_label, label: I18n.t('simple_form.labels.defaults.setting_reduce_motion')
|
= ff.input :'web.reduce_motion', wrapper: :with_label, label: I18n.t('simple_form.labels.defaults.setting_reduce_motion')
|
||||||
= ff.input :'web.disable_swiping', wrapper: :with_label, label: I18n.t('simple_form.labels.defaults.setting_disable_swiping')
|
= ff.input :'web.disable_swiping', wrapper: :with_label, label: I18n.t('simple_form.labels.defaults.setting_disable_swiping')
|
||||||
|
= ff.input :'web.disable_hover_cards', wrapper: :with_label, label: I18n.t('simple_form.labels.defaults.setting_disable_hover_cards')
|
||||||
= ff.input :'web.use_system_font', wrapper: :with_label, label: I18n.t('simple_form.labels.defaults.setting_system_font_ui')
|
= ff.input :'web.use_system_font', wrapper: :with_label, label: I18n.t('simple_form.labels.defaults.setting_system_font_ui')
|
||||||
|
|
||||||
%h4= t 'appearance.discovery'
|
%h4= t 'appearance.discovery'
|
||||||
|
|
|
@ -5,6 +5,23 @@ require_relative '../../lib/mastodon/sidekiq_middleware'
|
||||||
Sidekiq.configure_server do |config|
|
Sidekiq.configure_server do |config|
|
||||||
config.redis = REDIS_SIDEKIQ_PARAMS
|
config.redis = REDIS_SIDEKIQ_PARAMS
|
||||||
|
|
||||||
|
# This is used in Kubernetes setups, to signal that the Sidekiq process has started and will begin processing jobs
|
||||||
|
# This comes from https://github.com/sidekiq/sidekiq/wiki/Kubernetes#sidekiq
|
||||||
|
ready_filename = ENV.fetch('MASTODON_SIDEKIQ_READY_FILENAME', nil)
|
||||||
|
if ready_filename
|
||||||
|
raise 'MASTODON_SIDEKIQ_READY_FILENAME is not a valid filename' if File.basename(ready_filename) != ready_filename
|
||||||
|
|
||||||
|
ready_path = Rails.root.join('tmp', ready_filename)
|
||||||
|
|
||||||
|
config.on(:startup) do
|
||||||
|
FileUtils.touch(ready_path)
|
||||||
|
end
|
||||||
|
|
||||||
|
config.on(:shutdown) do
|
||||||
|
FileUtils.rm_f(ready_path)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
config.server_middleware do |chain|
|
config.server_middleware do |chain|
|
||||||
chain.add Mastodon::SidekiqMiddleware
|
chain.add Mastodon::SidekiqMiddleware
|
||||||
end
|
end
|
||||||
|
|
|
@ -5,7 +5,7 @@ Rails.application.configure do
|
||||||
# You should only generate this once per instance. If you later decide to change it, all push subscription will
|
# You should only generate this once per instance. If you later decide to change it, all push subscription will
|
||||||
# be invalidated, requiring the users to access the website again to resubscribe.
|
# be invalidated, requiring the users to access the website again to resubscribe.
|
||||||
#
|
#
|
||||||
# Generate with `rake mastodon:webpush:generate_vapid_key` task (`docker-compose run --rm web rake mastodon:webpush:generate_vapid_key` if you use docker compose)
|
# Generate with `bundle exec rails mastodon:webpush:generate_vapid_key` task (`docker-compose run --rm web bundle exec rails mastodon:webpush:generate_vapid_key` if you use docker compose)
|
||||||
#
|
#
|
||||||
# For more information visit https://rossta.net/blog/using-the-web-push-api-with-vapid.html
|
# For more information visit https://rossta.net/blog/using-the-web-push-api-with-vapid.html
|
||||||
|
|
||||||
|
|
|
@ -21,6 +21,18 @@ kab:
|
||||||
username:
|
username:
|
||||||
invalid: ilaq ad ilin isekkilen, uṭṭunen d yijerriden n wadda kan
|
invalid: ilaq ad ilin isekkilen, uṭṭunen d yijerriden n wadda kan
|
||||||
reserved: yettwaṭṭef
|
reserved: yettwaṭṭef
|
||||||
|
admin/webhook:
|
||||||
|
attributes:
|
||||||
|
url:
|
||||||
|
invalid: mačči d URL ameɣtu
|
||||||
|
doorkeeper/application:
|
||||||
|
attributes:
|
||||||
|
website:
|
||||||
|
invalid: mačči d URL ameɣtu
|
||||||
|
import:
|
||||||
|
attributes:
|
||||||
|
data:
|
||||||
|
malformed: yir amsal
|
||||||
status:
|
status:
|
||||||
attributes:
|
attributes:
|
||||||
reblog:
|
reblog:
|
||||||
|
@ -28,4 +40,20 @@ kab:
|
||||||
user:
|
user:
|
||||||
attributes:
|
attributes:
|
||||||
email:
|
email:
|
||||||
|
blocked: isseqdac asaǧǧaw n yimayl ur yettusirgen ara
|
||||||
unreachable: ur d-ttban ara d akken yella
|
unreachable: ur d-ttban ara d akken yella
|
||||||
|
role_id:
|
||||||
|
elevated: ur yezmir ara ad iεeddi tamlilt-ik tamirant
|
||||||
|
user_role:
|
||||||
|
attributes:
|
||||||
|
permissions_as_keys:
|
||||||
|
dangerous: deg-s tisirag tiriɣelsanin i temlilt tazadurt
|
||||||
|
elevated: ur yezmir ara ad yesεu tirirag ur nelli ara deg temlilit-ik tamirant
|
||||||
|
own_role: ur yezmir ara ad yettwabeddel s temlilt-ik tamirant
|
||||||
|
position:
|
||||||
|
elevated: ur yezmir ara ad iεeddi tamlilt-ik tamirant
|
||||||
|
own_role: ur yezmir ara ad yettwabeddel s temlilt-ik tamirant
|
||||||
|
webhook:
|
||||||
|
attributes:
|
||||||
|
events:
|
||||||
|
invalid_permissions: ur yezmir ara ad yesεu tidyanin iwumi ur tesεiḍ ara tisirag
|
||||||
|
|
|
@ -1762,6 +1762,10 @@ ar:
|
||||||
webauthn_authentication: مفاتيح الأمان
|
webauthn_authentication: مفاتيح الأمان
|
||||||
severed_relationships:
|
severed_relationships:
|
||||||
download: تنزيل (%{count})
|
download: تنزيل (%{count})
|
||||||
|
lost_followers: المتابعون المفقودون
|
||||||
|
lost_follows: المتابعات المفقودة
|
||||||
|
preamble: بحجبكم اسم نطاق قد تخسرون متابَعاتٍ، و كذلك إذا قرّر مديرو الخادوم حظر خادوم ما. و في هذه الحالات يكون بوسعكم تنزيل قائمة بالصلات المبتورة لمعاينتها، مع القدرة على استيرادها إلى خادوم آخر.
|
||||||
|
purged: حذف مدير خادومكم المعلومات عن هذا الخادوم.
|
||||||
statuses:
|
statuses:
|
||||||
attached:
|
attached:
|
||||||
audio:
|
audio:
|
||||||
|
@ -1978,6 +1982,7 @@ ar:
|
||||||
edit_profile_title: قم بتخصيص ملفك التعريفي
|
edit_profile_title: قم بتخصيص ملفك التعريفي
|
||||||
explanation: ها هي بعض النصائح قبل بداية الاستخدام
|
explanation: ها هي بعض النصائح قبل بداية الاستخدام
|
||||||
feature_action: اعرف المزيد
|
feature_action: اعرف المزيد
|
||||||
|
feature_audience: يتيح لكم مًستُدون إدارة جمهوركم بلا وسطاء. فبتنصيب و تشغيل مَستُودون على بنيتكم التحتية تمكنكم متابعة مستخدمي مَستُدون من أيّ خادوم،كما يمكنهم متابعتكم، بلا تحكُّم من أي طرف ثالث.
|
||||||
feature_audience_title: اِبنوا جُمهورَكم بِثِقَة
|
feature_audience_title: اِبنوا جُمهورَكم بِثِقَة
|
||||||
feature_control: أنتم الأدرى بالمحتوى الذي تريدون أن تطالعوه في فيض المنشورات الرئيس. لا خوارزميات تتحكم فيما يظهر لكم ولا إعلانات تضيع وقتكم. بحساب واحد تمكنكم متابعة من تشاؤون على أيّ خادوم ماستدون، وتلقّى منشوراتهم بترتيبها الزمني، لتصنعوا ركنكم الأليف في الإنترنت.
|
feature_control: أنتم الأدرى بالمحتوى الذي تريدون أن تطالعوه في فيض المنشورات الرئيس. لا خوارزميات تتحكم فيما يظهر لكم ولا إعلانات تضيع وقتكم. بحساب واحد تمكنكم متابعة من تشاؤون على أيّ خادوم ماستدون، وتلقّى منشوراتهم بترتيبها الزمني، لتصنعوا ركنكم الأليف في الإنترنت.
|
||||||
feature_control_title: تحكَّموا في فيض المنشورات الخاص بكم
|
feature_control_title: تحكَّموا في فيض المنشورات الخاص بكم
|
||||||
|
|
|
@ -118,7 +118,7 @@ cs:
|
||||||
promote: Povýšit
|
promote: Povýšit
|
||||||
protocol: Protokol
|
protocol: Protokol
|
||||||
public: Veřejný
|
public: Veřejný
|
||||||
push_subscription_expires: Odebírání PuSH expiruje
|
push_subscription_expires: Odebírání PuSH vyprší
|
||||||
redownload: Obnovit profil
|
redownload: Obnovit profil
|
||||||
redownloaded_msg: Profil účtu %{username} byl úspěšně obnoven ze zdroje
|
redownloaded_msg: Profil účtu %{username} byl úspěšně obnoven ze zdroje
|
||||||
reject: Zamítnout
|
reject: Zamítnout
|
||||||
|
|
|
@ -12,6 +12,7 @@ kab:
|
||||||
last_attempt: Γur-k yiwen n uɛraḍ-nniḍen kan send ad yettucekkel umiḍan-ik.
|
last_attempt: Γur-k yiwen n uɛraḍ-nniḍen kan send ad yettucekkel umiḍan-ik.
|
||||||
locked: Amiḍan-ik yettwargel.
|
locked: Amiḍan-ik yettwargel.
|
||||||
not_found_in_database: Tella tuccḍa deg %{authentication_keys} neγ deg wawal uffir.
|
not_found_in_database: Tella tuccḍa deg %{authentication_keys} neγ deg wawal uffir.
|
||||||
|
omniauth_user_creation_failure: Tuccḍa lawan n tmerna n umiḍan i timagit-a.
|
||||||
pending: Amiḍan-inek mazal-it deg ɛiwed n tmuγli.
|
pending: Amiḍan-inek mazal-it deg ɛiwed n tmuγli.
|
||||||
timeout: Tiɣimit n tuqqna tezri. Ma ulac aɣilif ɛiwed tuqqna akken ad tkemmleḍ.
|
timeout: Tiɣimit n tuqqna tezri. Ma ulac aɣilif ɛiwed tuqqna akken ad tkemmleḍ.
|
||||||
unauthenticated: Ilaq ad teqqneḍ neɣ ad tjerrḍeḍ akken ad tkemmelḍ.
|
unauthenticated: Ilaq ad teqqneḍ neɣ ad tjerrḍeḍ akken ad tkemmelḍ.
|
||||||
|
@ -47,21 +48,41 @@ kab:
|
||||||
subject: 'Mastodon: Iwellihen n uwennez n wawal uffir'
|
subject: 'Mastodon: Iwellihen n uwennez n wawal uffir'
|
||||||
title: Aɛiwed n wawal uffir
|
title: Aɛiwed n wawal uffir
|
||||||
two_factor_disabled:
|
two_factor_disabled:
|
||||||
|
explanation: Tuqqna tella tura s useqdec n tansa n yimayl tasuft d wawal n uεeddi.
|
||||||
subject: 'Mastodon: Asesteb s snat n tarrayin yensa'
|
subject: 'Mastodon: Asesteb s snat n tarrayin yensa'
|
||||||
|
subtitle: Asesteb s snat tarrayin i umiḍan-ik yensan.
|
||||||
title: Asesteb s snat n tarrayin insa
|
title: Asesteb s snat n tarrayin insa
|
||||||
two_factor_enabled:
|
two_factor_enabled:
|
||||||
|
explanation: Ajuṭu yettusirwen s usnas TOTP yeqqnen ilaq i wakken ad teqqneḍ.
|
||||||
subject: 'Mastodon: Asesteb s snat n tarrayin yermed'
|
subject: 'Mastodon: Asesteb s snat n tarrayin yermed'
|
||||||
|
subtitle: Asesteb s snat tarrayin yettwarmed i umiḍan-ik.
|
||||||
title: Asesteb s snat n tarrayin irmed
|
title: Asesteb s snat n tarrayin irmed
|
||||||
two_factor_recovery_codes_changed:
|
two_factor_recovery_codes_changed:
|
||||||
explanation: Tangalt n tuɣalin tettwaḥbes sakin nesnulfa-d yiwet d tamaynut.
|
explanation: Tangalt n tuɣalin tettwaḥbes sakin nesnulfa-d yiwet d tamaynut.
|
||||||
subject: 'Mastodon: Tingalin n tuɣalin n snat n tarayin ttwarnanat i tikkelt-nniḍen'
|
subject: 'Mastodon: Tingalin n tuɣalin n snat n tarayin ttwarnanat i tikkelt-nniḍen'
|
||||||
|
subtitle: Tangalt n tuɣalin tettwaḥbes sakin nesnulfa-d yiwet d tamaynut.
|
||||||
title: Tangalt n tuɣalin 2FA tettwabeddel
|
title: Tangalt n tuɣalin 2FA tettwabeddel
|
||||||
unlock_instructions:
|
unlock_instructions:
|
||||||
subject: 'Mastodon: iwelihhen n userreḥ'
|
subject: 'Mastodon: iwelihhen n userreḥ'
|
||||||
webauthn_credential:
|
webauthn_credential:
|
||||||
added:
|
added:
|
||||||
|
explanation: Tasarut-a n tɣellist tettwarna ɣer umiḍan-ik·im
|
||||||
subject: 'Maṣṭudun : Tasarutt tamaynutt n tɣellist'
|
subject: 'Maṣṭudun : Tasarutt tamaynutt n tɣellist'
|
||||||
title: Tasarut tamaynutt n tɣellist tamaynut tettwarna
|
title: Tasarut tamaynutt n tɣellist tamaynut tettwarna
|
||||||
|
deleted:
|
||||||
|
explanation: Tasarut-a n tɣellist tettwakkes seg umiḍan-ik·im
|
||||||
|
subject: 'Mastodon: Tasarut n tɣellsit tettwakkes'
|
||||||
|
title: Yiwet seg tsura-k·m n tɣellist tettwakkes
|
||||||
|
webauthn_disabled:
|
||||||
|
explanation: Yensa usesteb s tsura n tɣellist i umiḍan-ik.
|
||||||
|
extra: Tzemreḍ ad tkecmeḍ tura s useqdec asuf n ujuṭu yettwasran s usnas TOPTP yeqqnen.
|
||||||
|
subject: 'Mastodon: Asesteb s tsura n tɣellist yensa'
|
||||||
|
title: Tisura n tɣellist nsant
|
||||||
|
webauthn_enabled:
|
||||||
|
explanation: Asesteb n tsarut n tɣellist tettwarmed i umiḍan-ik.
|
||||||
|
extra: Tasarut-ik n tɣellist tezmer tura ad tettuseqdec i unekcum.
|
||||||
|
subject: 'Mastodon: Asesteb n tsarut n tɣellist yermed'
|
||||||
|
title: Tisura n tɣellist remdent
|
||||||
omniauth_callbacks:
|
omniauth_callbacks:
|
||||||
failure: Ur nezmir ara ad ak·akem-nsesṭeb seg %{kind} acku "%{reason}".
|
failure: Ur nezmir ara ad ak·akem-nsesṭeb seg %{kind} acku "%{reason}".
|
||||||
success: Asesṭeb idda akken iwata seg umiḍan %{kind}.
|
success: Asesṭeb idda akken iwata seg umiḍan %{kind}.
|
||||||
|
|
|
@ -5,6 +5,7 @@ kab:
|
||||||
doorkeeper/application:
|
doorkeeper/application:
|
||||||
name: Isem n usnas
|
name: Isem n usnas
|
||||||
redirect_uri: URI n uwelleh
|
redirect_uri: URI n uwelleh
|
||||||
|
scopes: Tinerfadin
|
||||||
website: Asmel web n usnas
|
website: Asmel web n usnas
|
||||||
errors:
|
errors:
|
||||||
models:
|
models:
|
||||||
|
@ -39,6 +40,7 @@ kab:
|
||||||
empty: Ulac ɣur-k·m isnasen.
|
empty: Ulac ɣur-k·m isnasen.
|
||||||
name: Isem
|
name: Isem
|
||||||
new: Asnas amaynut
|
new: Asnas amaynut
|
||||||
|
scopes: Tinerfadin
|
||||||
show: Ẓer
|
show: Ẓer
|
||||||
title: Isnasen-ik·im
|
title: Isnasen-ik·im
|
||||||
new:
|
new:
|
||||||
|
@ -47,6 +49,8 @@ kab:
|
||||||
actions: Tigawin
|
actions: Tigawin
|
||||||
application_id: ID n usnas
|
application_id: ID n usnas
|
||||||
callback_urls: URL n tririt n wawal
|
callback_urls: URL n tririt n wawal
|
||||||
|
scopes: Tinerfadin
|
||||||
|
secret: Tuffirt n umsaɣ
|
||||||
title: 'Asnas: %{name}'
|
title: 'Asnas: %{name}'
|
||||||
authorizations:
|
authorizations:
|
||||||
buttons:
|
buttons:
|
||||||
|
@ -55,6 +59,7 @@ kab:
|
||||||
error:
|
error:
|
||||||
title: Tella-d tuccḍa
|
title: Tella-d tuccḍa
|
||||||
new:
|
new:
|
||||||
|
review_permissions: Asenqed n tsirag
|
||||||
title: Tlaq tsiregt
|
title: Tlaq tsiregt
|
||||||
show:
|
show:
|
||||||
title: Nɣel tangalt n wurag sakkin senteḍ-itt deg usnas.
|
title: Nɣel tangalt n wurag sakkin senteḍ-itt deg usnas.
|
||||||
|
@ -64,8 +69,12 @@ kab:
|
||||||
confirmations:
|
confirmations:
|
||||||
revoke: Tetḥeqqeḍ?
|
revoke: Tetḥeqqeḍ?
|
||||||
index:
|
index:
|
||||||
|
authorized_at: Yettwasireg ɣef %{date}
|
||||||
description_html: Ha-t-an yisnasen i izemren ad kecmen ɣer umiḍan-ik·im, s useqdec n API. Ma llan yisnasen ur teεqileḍ ara da, neɣ kra n wesnas ur iteddu ara akken ilaq, tzemreḍ ad tekkseḍ anekcum-is.
|
description_html: Ha-t-an yisnasen i izemren ad kecmen ɣer umiḍan-ik·im, s useqdec n API. Ma llan yisnasen ur teεqileḍ ara da, neɣ kra n wesnas ur iteddu ara akken ilaq, tzemreḍ ad tekkseḍ anekcum-is.
|
||||||
last_used_at: Yettwaseqdec i tikkelt taneggarut ass n %{date}
|
last_used_at: Yettwaseqdec i tikkelt taneggarut ass n %{date}
|
||||||
|
never_used: Urǧin yettwaseqdac
|
||||||
|
scopes: Tisirag
|
||||||
|
superapp: Adigan
|
||||||
title: Isnasen-ik·im yettusirgen
|
title: Isnasen-ik·im yettusirgen
|
||||||
errors:
|
errors:
|
||||||
messages:
|
messages:
|
||||||
|
@ -82,13 +91,28 @@ kab:
|
||||||
destroy:
|
destroy:
|
||||||
notice: Yettwaḥwi wesnas.
|
notice: Yettwaḥwi wesnas.
|
||||||
grouped_scopes:
|
grouped_scopes:
|
||||||
|
access:
|
||||||
|
read: Anekcum i tɣuri kan
|
||||||
|
read/write: Anekcum i tɣuri d tira
|
||||||
|
write: Anekcum i tira kan
|
||||||
title:
|
title:
|
||||||
accounts: Imiḍanen
|
accounts: Imiḍanen
|
||||||
admin/accounts: Tadbelt n imiḍan
|
admin/accounts: Tadbelt n imiḍan
|
||||||
|
admin/all: Akk timahilin tinebdalin
|
||||||
|
admin/reports: Tadbelt n yineqqisen
|
||||||
|
blocks: Yewḥel
|
||||||
|
bookmarks: Ticraḍ
|
||||||
|
conversations: Idiwenniyen
|
||||||
crypto: Awgelhen seg yixef ɣer yixef
|
crypto: Awgelhen seg yixef ɣer yixef
|
||||||
|
favourites: Imenyafen
|
||||||
filters: Imzizdigen
|
filters: Imzizdigen
|
||||||
|
follow: Aḍfar, asgugem akked usewḥel
|
||||||
|
follows: Aḍfar
|
||||||
lists: Tibdarin
|
lists: Tibdarin
|
||||||
|
media: Imeddayen n umidya
|
||||||
|
mutes: Yeggugem
|
||||||
notifications: Tilɣa
|
notifications: Tilɣa
|
||||||
|
profile: Amaɣnu-k Mastodon
|
||||||
push: Tilɣa yettudemmren
|
push: Tilɣa yettudemmren
|
||||||
reports: Ineqqisen
|
reports: Ineqqisen
|
||||||
search: Nadi
|
search: Nadi
|
||||||
|
|
|
@ -31,7 +31,7 @@ ko:
|
||||||
form:
|
form:
|
||||||
error: 이런! 오류를 확인하세요
|
error: 이런! 오류를 확인하세요
|
||||||
help:
|
help:
|
||||||
native_redirect_uri: "%{native_redirect_uri}에서 로컬 테스트를 할 수 있습니다."
|
native_redirect_uri: "%{native_redirect_uri}를 이용해 로컬 테스트를 할 수 있습니다"
|
||||||
redirect_uri: 한 줄에 하나의 URI를 작성하세요
|
redirect_uri: 한 줄에 하나의 URI를 작성하세요
|
||||||
scopes: 스페이스로 범위를 구분하세요. 빈 칸으로 놔두면 기본 범위를 사용합니다.
|
scopes: 스페이스로 범위를 구분하세요. 빈 칸으로 놔두면 기본 범위를 사용합니다.
|
||||||
index:
|
index:
|
||||||
|
|
|
@ -25,7 +25,7 @@ lv:
|
||||||
edit: Labot
|
edit: Labot
|
||||||
submit: Apstiprināt
|
submit: Apstiprināt
|
||||||
confirmations:
|
confirmations:
|
||||||
destroy: Vai esi pārliecināts?
|
destroy: Vai tiešām?
|
||||||
edit:
|
edit:
|
||||||
title: Labot lietotni
|
title: Labot lietotni
|
||||||
form:
|
form:
|
||||||
|
@ -69,7 +69,7 @@ lv:
|
||||||
buttons:
|
buttons:
|
||||||
revoke: Atsaukt
|
revoke: Atsaukt
|
||||||
confirmations:
|
confirmations:
|
||||||
revoke: Vai esi pārliecināts?
|
revoke: Vai tiešām?
|
||||||
index:
|
index:
|
||||||
authorized_at: Autorizētas %{date}
|
authorized_at: Autorizētas %{date}
|
||||||
description_html: Šīs ir lietotnes, kas var piekļūt Tavam kontam ar API. Ja šeit ir lietotnes, kuras neatpazīsti, vai lietotne darbojas ne tā, kā paredzēts, vari atsaukt tās piekļuvi.
|
description_html: Šīs ir lietotnes, kas var piekļūt Tavam kontam ar API. Ja šeit ir lietotnes, kuras neatpazīsti, vai lietotne darbojas ne tā, kā paredzēts, vari atsaukt tās piekļuvi.
|
||||||
|
@ -135,6 +135,7 @@ lv:
|
||||||
media: Multividesu pielikumi
|
media: Multividesu pielikumi
|
||||||
mutes: Apklusinātie
|
mutes: Apklusinātie
|
||||||
notifications: Paziņojumi
|
notifications: Paziņojumi
|
||||||
|
profile: Tavs Mastodon profils
|
||||||
push: Uznirstošie paziņojumi
|
push: Uznirstošie paziņojumi
|
||||||
reports: Ziņojumi
|
reports: Ziņojumi
|
||||||
search: Meklēt
|
search: Meklēt
|
||||||
|
@ -165,6 +166,7 @@ lv:
|
||||||
admin:write:reports: veikt moderācijas darbības pārskatos
|
admin:write:reports: veikt moderācijas darbības pārskatos
|
||||||
crypto: lieto pilnīgu šifrēšanu
|
crypto: lieto pilnīgu šifrēšanu
|
||||||
follow: mainīt konta attiecības
|
follow: mainīt konta attiecības
|
||||||
|
profile: lasīt tikai Tava konta profila informāciju
|
||||||
push: saņemt savus push paziņojumus
|
push: saņemt savus push paziņojumus
|
||||||
read: lasīt visus sava konta datus
|
read: lasīt visus sava konta datus
|
||||||
read:accounts: apskatīt kontu informāciju
|
read:accounts: apskatīt kontu informāciju
|
||||||
|
|
|
@ -31,18 +31,18 @@ gl:
|
||||||
created_msg: Nota de moderación creada correctamente!
|
created_msg: Nota de moderación creada correctamente!
|
||||||
destroyed_msg: Nota de moderación eliminada de xeito correcto!
|
destroyed_msg: Nota de moderación eliminada de xeito correcto!
|
||||||
accounts:
|
accounts:
|
||||||
add_email_domain_block: Bloquear o dominio do email
|
add_email_domain_block: Bloquear o dominio do enderezo
|
||||||
approve: Aprobar
|
approve: Aprobar
|
||||||
approved_msg: Aprobada a solicitude de rexistro de %{username}
|
approved_msg: Aprobada a solicitude de rexistro de %{username}
|
||||||
are_you_sure: Está segura?
|
are_you_sure: Está segura?
|
||||||
avatar: Imaxe de perfil
|
avatar: Imaxe de perfil
|
||||||
by_domain: Dominio
|
by_domain: Dominio
|
||||||
change_email:
|
change_email:
|
||||||
changed_msg: Email mudado de xeito correcto!
|
changed_msg: Correo cambiado de xeito correcto!
|
||||||
current_email: Email actual
|
current_email: Enderezo actual
|
||||||
label: Mudar email
|
label: Cambiar de enderezo
|
||||||
new_email: Novo email
|
new_email: Novo enderezo
|
||||||
submit: Mudar email
|
submit: Cambiar de enderezo
|
||||||
title: Mudar email de %{username}
|
title: Mudar email de %{username}
|
||||||
change_role:
|
change_role:
|
||||||
changed_msg: Rol mudado correctamente!
|
changed_msg: Rol mudado correctamente!
|
||||||
|
@ -64,10 +64,10 @@ gl:
|
||||||
display_name: Nome a amosar
|
display_name: Nome a amosar
|
||||||
domain: Dominio
|
domain: Dominio
|
||||||
edit: Editar
|
edit: Editar
|
||||||
email: Email
|
email: Enderezo de correo
|
||||||
email_status: Estado do email
|
email_status: Estado do correo
|
||||||
enable: Activar
|
enable: Activar
|
||||||
enable_sign_in_token_auth: Activar autenticación cun token no email
|
enable_sign_in_token_auth: Activar autenticación cun token no correo
|
||||||
enabled: Activado
|
enabled: Activado
|
||||||
enabled_msg: Desbloqueada a conta de %{username}
|
enabled_msg: Desbloqueada a conta de %{username}
|
||||||
followers: Seguidoras
|
followers: Seguidoras
|
||||||
|
@ -132,7 +132,7 @@ gl:
|
||||||
resubscribe: Resubscribir
|
resubscribe: Resubscribir
|
||||||
role: Rol
|
role: Rol
|
||||||
search: Procurar
|
search: Procurar
|
||||||
search_same_email_domain: Outras usuarias co mesmo dominio de email
|
search_same_email_domain: Outras usuarias co mesmo dominio de correo
|
||||||
search_same_ip: Outras usuarias co mesmo IP
|
search_same_ip: Outras usuarias co mesmo IP
|
||||||
security: Seguridade
|
security: Seguridade
|
||||||
security_measures:
|
security_measures:
|
||||||
|
@ -154,9 +154,9 @@ gl:
|
||||||
suspension_irreversible: Elimináronse de xeito irreversible os datos desta conta. Podes reactivar a conta para facela usable novamente pero non recuperará os datos eliminados.
|
suspension_irreversible: Elimináronse de xeito irreversible os datos desta conta. Podes reactivar a conta para facela usable novamente pero non recuperará os datos eliminados.
|
||||||
suspension_reversible_hint_html: Esta conta foi suspendida, e os datos serán totalmente eliminados o %{date}. Ata entón, a conta pode ser restaurada sen danos. Se desexas eliminar agora mesmo todos os datos da conta, podes facelo aquí embaixo.
|
suspension_reversible_hint_html: Esta conta foi suspendida, e os datos serán totalmente eliminados o %{date}. Ata entón, a conta pode ser restaurada sen danos. Se desexas eliminar agora mesmo todos os datos da conta, podes facelo aquí embaixo.
|
||||||
title: Contas
|
title: Contas
|
||||||
unblock_email: Desbloquear enderezo de email
|
unblock_email: Desbloquear enderezo de correo
|
||||||
unblocked_email_msg: Enderezo de email de %{username} desbloqueado
|
unblocked_email_msg: Enderezo de correo de %{username} desbloqueado
|
||||||
unconfirmed_email: Email non confirmado
|
unconfirmed_email: Enderezo de correo sen confirmar
|
||||||
undo_sensitized: Desmarcar como sensible
|
undo_sensitized: Desmarcar como sensible
|
||||||
undo_silenced: Desfacer acalar
|
undo_silenced: Desfacer acalar
|
||||||
undo_suspension: Desfacer suspensión
|
undo_suspension: Desfacer suspensión
|
||||||
|
@ -173,12 +173,12 @@ gl:
|
||||||
approve_appeal: Aprobar apelación
|
approve_appeal: Aprobar apelación
|
||||||
approve_user: Aprobar Usuaria
|
approve_user: Aprobar Usuaria
|
||||||
assigned_to_self_report: Asignar denuncia
|
assigned_to_self_report: Asignar denuncia
|
||||||
change_email_user: Editar email da usuaria
|
change_email_user: Editar correo electrónico da usuaria
|
||||||
change_role_user: Cambiar Rol da Usuaria
|
change_role_user: Cambiar Rol da Usuaria
|
||||||
confirm_user: Confirmar usuaria
|
confirm_user: Confirmar usuaria
|
||||||
create_account_warning: Crear aviso
|
create_account_warning: Crear aviso
|
||||||
create_announcement: Crear anuncio
|
create_announcement: Crear anuncio
|
||||||
create_canonical_email_block: Crear Bloqueo de email
|
create_canonical_email_block: Crear Bloqueo de correo electrónico
|
||||||
create_custom_emoji: Crear emoticonas personalizadas
|
create_custom_emoji: Crear emoticonas personalizadas
|
||||||
create_domain_allow: Crear Dominio Permitido
|
create_domain_allow: Crear Dominio Permitido
|
||||||
create_domain_block: Crear bloquedo do Dominio
|
create_domain_block: Crear bloquedo do Dominio
|
||||||
|
@ -188,7 +188,7 @@ gl:
|
||||||
create_user_role: Crear Rol
|
create_user_role: Crear Rol
|
||||||
demote_user: Degradar usuaria
|
demote_user: Degradar usuaria
|
||||||
destroy_announcement: Eliminar anuncio
|
destroy_announcement: Eliminar anuncio
|
||||||
destroy_canonical_email_block: Eliminar Bloqueo de email
|
destroy_canonical_email_block: Eliminar Bloqueo de correo electrónico
|
||||||
destroy_custom_emoji: Eliminar emoticona personalizada
|
destroy_custom_emoji: Eliminar emoticona personalizada
|
||||||
destroy_domain_allow: Eliminar Dominio permitido
|
destroy_domain_allow: Eliminar Dominio permitido
|
||||||
destroy_domain_block: Eliminar bloqueo do Dominio
|
destroy_domain_block: Eliminar bloqueo do Dominio
|
||||||
|
@ -200,7 +200,7 @@ gl:
|
||||||
destroy_user_role: Eliminar Rol
|
destroy_user_role: Eliminar Rol
|
||||||
disable_2fa_user: Desactivar 2FA
|
disable_2fa_user: Desactivar 2FA
|
||||||
disable_custom_emoji: Desactivar emoticona personalizada
|
disable_custom_emoji: Desactivar emoticona personalizada
|
||||||
disable_sign_in_token_auth_user: Desactivar Autenticación por token no email para Usuaria
|
disable_sign_in_token_auth_user: Desactivar Autenticación con token no correo para Usuaria
|
||||||
disable_user: Desactivar usuaria
|
disable_user: Desactivar usuaria
|
||||||
enable_custom_emoji: Activar emoticona personalizada
|
enable_custom_emoji: Activar emoticona personalizada
|
||||||
enable_sign_in_token_auth_user: Activar Autenticación con token no email para Usuaria
|
enable_sign_in_token_auth_user: Activar Autenticación con token no email para Usuaria
|
||||||
|
@ -211,14 +211,14 @@ gl:
|
||||||
reject_user: Rexeitar Usuaria
|
reject_user: Rexeitar Usuaria
|
||||||
remove_avatar_user: Eliminar avatar
|
remove_avatar_user: Eliminar avatar
|
||||||
reopen_report: Reabrir denuncia
|
reopen_report: Reabrir denuncia
|
||||||
resend_user: Reenviar o email de confirmación
|
resend_user: Reenviar o correo de confirmación
|
||||||
reset_password_user: Restabelecer contrasinal
|
reset_password_user: Restabelecer contrasinal
|
||||||
resolve_report: Resolver denuncia
|
resolve_report: Resolver denuncia
|
||||||
sensitive_account: Marca o multimedia da túa conta como sensible
|
sensitive_account: Marca o multimedia da túa conta como sensible
|
||||||
silence_account: Silenciar conta
|
silence_account: Silenciar conta
|
||||||
suspend_account: Suspender conta
|
suspend_account: Suspender conta
|
||||||
unassigned_report: Desasignar denuncia
|
unassigned_report: Desasignar denuncia
|
||||||
unblock_email_account: Desbloquear enderezo de email
|
unblock_email_account: Desbloquear enderezo de correo
|
||||||
unsensitive_account: Retira a marca de sensible do multimedia da conta
|
unsensitive_account: Retira a marca de sensible do multimedia da conta
|
||||||
unsilence_account: Deixar de silenciar conta
|
unsilence_account: Deixar de silenciar conta
|
||||||
unsuspend_account: Retirar suspensión de conta
|
unsuspend_account: Retirar suspensión de conta
|
||||||
|
@ -660,7 +660,7 @@ gl:
|
||||||
delete_data_html: Eliminar o perfil e contidos de <strong>@%{acct}</strong> para os próximos 30 días a non ser que sexa suspendida nese período
|
delete_data_html: Eliminar o perfil e contidos de <strong>@%{acct}</strong> para os próximos 30 días a non ser que sexa suspendida nese período
|
||||||
preview_preamble_html: "<strong>@%{acct}</strong> vai recibir un aviso co seguinte contido:"
|
preview_preamble_html: "<strong>@%{acct}</strong> vai recibir un aviso co seguinte contido:"
|
||||||
record_strike_html: Anotar un aviso contra <strong>@%{acct}</strong> para axudarche a xestionar futuros problemas con esta conta
|
record_strike_html: Anotar un aviso contra <strong>@%{acct}</strong> para axudarche a xestionar futuros problemas con esta conta
|
||||||
send_email_html: Enviar un email de aviso a <strong>@%{acct}</strong>
|
send_email_html: Enviar un correo de aviso a <strong>@%{acct}</strong>
|
||||||
warning_placeholder: Razóns adicionais optativas para a acción de moderación.
|
warning_placeholder: Razóns adicionais optativas para a acción de moderación.
|
||||||
target_origin: Orixe da conta denunciada
|
target_origin: Orixe da conta denunciada
|
||||||
title: Denuncias
|
title: Denuncias
|
||||||
|
@ -1060,7 +1060,7 @@ gl:
|
||||||
redirect_to_app_html: Ímoste redirixir á app <strong>%{app_name}</strong>. Se iso non acontece, proba %{clicking_this_link} ou volve ti manualmente á app.
|
redirect_to_app_html: Ímoste redirixir á app <strong>%{app_name}</strong>. Se iso non acontece, proba %{clicking_this_link} ou volve ti manualmente á app.
|
||||||
registration_complete: Completouse a creación da conta en %{domain}!
|
registration_complete: Completouse a creación da conta en %{domain}!
|
||||||
welcome_title: Benvida, %{name}!
|
welcome_title: Benvida, %{name}!
|
||||||
wrong_email_hint: Se o enderezo de email non é correcto, podes cambialo nos axustes da conta.
|
wrong_email_hint: Se o enderezo de correo non é correcto, podes cambialo nos axustes da conta.
|
||||||
delete_account: Eliminar conta
|
delete_account: Eliminar conta
|
||||||
delete_account_html: Se queres eliminar a túa conta, podes <a href="%{path}">facelo aquí</a>. Deberás confirmar a acción.
|
delete_account_html: Se queres eliminar a túa conta, podes <a href="%{path}">facelo aquí</a>. Deberás confirmar a acción.
|
||||||
description:
|
description:
|
||||||
|
|
|
@ -1741,7 +1741,7 @@ ko:
|
||||||
contrast: 마스토돈 (고대비)
|
contrast: 마스토돈 (고대비)
|
||||||
default: 마스토돈 (어두움)
|
default: 마스토돈 (어두움)
|
||||||
mastodon-light: 마스토돈 (밝음)
|
mastodon-light: 마스토돈 (밝음)
|
||||||
system: 자동 선택 (시스템 테마 이용)
|
system: 자동 (시스템 테마 사용)
|
||||||
time:
|
time:
|
||||||
formats:
|
formats:
|
||||||
default: "%Y-%m-%d %H:%M"
|
default: "%Y-%m-%d %H:%M"
|
||||||
|
|
|
@ -116,6 +116,8 @@ ro:
|
||||||
redownloaded_msg: S-a reîmprospătat cu succes profilul %{username} de la origine
|
redownloaded_msg: S-a reîmprospătat cu succes profilul %{username} de la origine
|
||||||
reject: Respinge
|
reject: Respinge
|
||||||
rejected_msg: S-a respins cu succes cererea de înregistrare a utilizatorului %{username}
|
rejected_msg: S-a respins cu succes cererea de înregistrare a utilizatorului %{username}
|
||||||
|
remote_suspension_irreversible: Datele acestui cont au fost șterse în mod ireversibil.
|
||||||
|
remote_suspension_reversible_hint_html: Contul a fost suspendat pe server-ul respectiv, iar datele vor fi șterse complet pe %{date}. Până atunci, server-ul remote poate restabili acest cont fără consecințe negative. Dacă dorești să elimini toate datele contului numaidecât, poți face acest lucru mai jos.
|
||||||
remove_avatar: Elimină avatar
|
remove_avatar: Elimină avatar
|
||||||
remove_header: Elimină antet
|
remove_header: Elimină antet
|
||||||
removed_avatar_msg: S-a îndepărtat cu succes poza de profil a utilizatorului %{username}
|
removed_avatar_msg: S-a îndepărtat cu succes poza de profil a utilizatorului %{username}
|
||||||
|
|
|
@ -1 +1,21 @@
|
||||||
|
---
|
||||||
ry:
|
ry:
|
||||||
|
accounts:
|
||||||
|
follow: Пудписати ся
|
||||||
|
following: Пудпискы
|
||||||
|
posts:
|
||||||
|
few: Публикації
|
||||||
|
one: Публикація
|
||||||
|
other: Публикації
|
||||||
|
posts_tab_heading: Публикації
|
||||||
|
imports:
|
||||||
|
titles:
|
||||||
|
following: Імпортованя пудписок
|
||||||
|
types:
|
||||||
|
following: Испис пудписок
|
||||||
|
notification_mailer:
|
||||||
|
follow:
|
||||||
|
body: "%{name} ся пудписує ся на вас!"
|
||||||
|
subject: "%{name} ся пудписує ся на вас"
|
||||||
|
relationships:
|
||||||
|
following: Пудпискы
|
||||||
|
|
|
@ -211,6 +211,7 @@ en:
|
||||||
setting_default_privacy: Posting privacy
|
setting_default_privacy: Posting privacy
|
||||||
setting_default_sensitive: Always mark media as sensitive
|
setting_default_sensitive: Always mark media as sensitive
|
||||||
setting_delete_modal: Show confirmation dialog before deleting a post
|
setting_delete_modal: Show confirmation dialog before deleting a post
|
||||||
|
setting_disable_hover_cards: Disable profile preview on hover
|
||||||
setting_disable_swiping: Disable swiping motions
|
setting_disable_swiping: Disable swiping motions
|
||||||
setting_display_media: Media display
|
setting_display_media: Media display
|
||||||
setting_display_media_default: Default
|
setting_display_media_default: Default
|
||||||
|
|
|
@ -255,7 +255,7 @@ gl:
|
||||||
require_invite_text: Pedir unha razón para unirse
|
require_invite_text: Pedir unha razón para unirse
|
||||||
show_domain_blocks: Amosar dominios bloqueados
|
show_domain_blocks: Amosar dominios bloqueados
|
||||||
show_domain_blocks_rationale: Explicar porque están bloqueados os dominios
|
show_domain_blocks_rationale: Explicar porque están bloqueados os dominios
|
||||||
site_contact_email: Email de contacto
|
site_contact_email: Correo de contacto
|
||||||
site_contact_username: Nome do contacto
|
site_contact_username: Nome do contacto
|
||||||
site_extended_description: Descrición ampla
|
site_extended_description: Descrición ampla
|
||||||
site_short_description: Descrición do servidor
|
site_short_description: Descrición do servidor
|
||||||
|
|
|
@ -5,6 +5,7 @@ kab:
|
||||||
account:
|
account:
|
||||||
display_name: Isem-ik·im ummid neɣ isem-ik·im n uqeṣṣer.
|
display_name: Isem-ik·im ummid neɣ isem-ik·im n uqeṣṣer.
|
||||||
fields: Asebter-ik·im agejdan, imqimen, leεmer, ayen tebɣiḍ.
|
fields: Asebter-ik·im agejdan, imqimen, leεmer, ayen tebɣiḍ.
|
||||||
|
note: 'Tzemreḍ ad d-@tbedreḍ imdanen niḍen neɣ #ihacṭagen.'
|
||||||
account_alias:
|
account_alias:
|
||||||
acct: Sekcem isem n umseqdac@domain n umiḍan s wansa itebγiḍ ad gujjeḍ
|
acct: Sekcem isem n umseqdac@domain n umiḍan s wansa itebγiḍ ad gujjeḍ
|
||||||
account_migration:
|
account_migration:
|
||||||
|
@ -27,6 +28,8 @@ kab:
|
||||||
name: 'Ha-t-an kra seg ihacṭagen i tesseqdaceḍ ussan-a ineggura maḍi :'
|
name: 'Ha-t-an kra seg ihacṭagen i tesseqdaceḍ ussan-a ineggura maḍi :'
|
||||||
imports:
|
imports:
|
||||||
data: Afaylu CSV id yusan seg uqeddac-nniḍen n Maṣṭudun
|
data: Afaylu CSV id yusan seg uqeddac-nniḍen n Maṣṭudun
|
||||||
|
invite_request:
|
||||||
|
text: Aya ad aɣ-iɛiwen ad nessenqed tuttra-k•m
|
||||||
ip_block:
|
ip_block:
|
||||||
comment: D afrayan. Cfu ɣef wayɣer i terniḍ alugen-a.
|
comment: D afrayan. Cfu ɣef wayɣer i terniḍ alugen-a.
|
||||||
severities:
|
severities:
|
||||||
|
@ -36,6 +39,8 @@ kab:
|
||||||
fields:
|
fields:
|
||||||
name: Tabzimt
|
name: Tabzimt
|
||||||
value: Agbur
|
value: Agbur
|
||||||
|
account_alias:
|
||||||
|
acct: Tansa n umiḍan aqbur
|
||||||
account_migration:
|
account_migration:
|
||||||
acct: Tansa n umiḍan amaynut
|
acct: Tansa n umiḍan amaynut
|
||||||
account_warning_preset:
|
account_warning_preset:
|
||||||
|
@ -51,6 +56,7 @@ kab:
|
||||||
suspend: Ḥbes di leεḍil
|
suspend: Ḥbes di leεḍil
|
||||||
announcement:
|
announcement:
|
||||||
ends_at: Tagara n tedyant
|
ends_at: Tagara n tedyant
|
||||||
|
starts_at: Tazwara n tedyant
|
||||||
text: Alɣu
|
text: Alɣu
|
||||||
defaults:
|
defaults:
|
||||||
autofollow: Ɛreḍ-it-id ad yeḍfer amiḍan-ik·im
|
autofollow: Ɛreḍ-it-id ad yeḍfer amiḍan-ik·im
|
||||||
|
@ -59,18 +65,25 @@ kab:
|
||||||
chosen_languages: Sizdeg tutlayin
|
chosen_languages: Sizdeg tutlayin
|
||||||
confirm_new_password: Sentem awal uffir amaynut
|
confirm_new_password: Sentem awal uffir amaynut
|
||||||
confirm_password: Sentem awal uffir
|
confirm_password: Sentem awal uffir
|
||||||
|
context: Isatalen n umsizdeg
|
||||||
current_password: Awal uffir n tura
|
current_password: Awal uffir n tura
|
||||||
data: Isefka
|
data: Isefka
|
||||||
display_name: Isem ara d-yettwaskanen
|
display_name: Isem ara d-yettwaskanen
|
||||||
email: Tansa imayl
|
email: Tansa imayl
|
||||||
expires_in: Ad yemmet
|
expires_in: Ad yemmet
|
||||||
|
fields: Urtiyen niḍen
|
||||||
header: Ixef
|
header: Ixef
|
||||||
|
honeypot: "%{label} (ur tettaččar ara)"
|
||||||
|
inbox_url: URL n tbewwaḍt n urmas yettwacudden
|
||||||
|
irreversible: Kkes deg wadeg n tuffra
|
||||||
locale: Tutlayt n wegrudem
|
locale: Tutlayt n wegrudem
|
||||||
max_uses: Amḍan afellay n iseqdacen
|
max_uses: Amḍan afellay n iseqdacen
|
||||||
new_password: Awal uffir amaynut
|
new_password: Awal uffir amaynut
|
||||||
note: Tameddurt
|
note: Tameddurt
|
||||||
otp_attempt: Tangalt n snat n tarayin
|
otp_attempt: Tangalt n snat n tarayin
|
||||||
password: Awal uffir
|
password: Awal uffir
|
||||||
|
phrase: Awal n tsarut neɣ tafyirt
|
||||||
|
setting_advanced_layout: Rmed agrudem n web leqqayen
|
||||||
setting_default_language: Tutlayt n tira
|
setting_default_language: Tutlayt n tira
|
||||||
setting_default_privacy: Tabaḍnit n tira
|
setting_default_privacy: Tabaḍnit n tira
|
||||||
setting_display_media_default: Akk-a kan
|
setting_display_media_default: Akk-a kan
|
||||||
|
@ -88,8 +101,15 @@ kab:
|
||||||
featured_tag:
|
featured_tag:
|
||||||
name: Ahacṭag
|
name: Ahacṭag
|
||||||
form_admin_settings:
|
form_admin_settings:
|
||||||
|
custom_css: CSS udmawan
|
||||||
|
profile_directory: Rmed akaram n imaγnuten
|
||||||
|
site_contact_email: Imayl n unermas
|
||||||
|
site_short_description: Aglam n uqeddac
|
||||||
site_terms: Tasertit tabaḍnit
|
site_terms: Tasertit tabaḍnit
|
||||||
site_title: Isem n uqeddac
|
site_title: Isem n uqeddac
|
||||||
|
status_page_url: URL n uusebter n waddaden
|
||||||
|
theme: Asentel amezwer
|
||||||
|
thumbnail: Tanfult n uqeddac
|
||||||
interactions:
|
interactions:
|
||||||
must_be_follower: Ssewḥel ilɣa sɣur wid akked tid ur yellin ara d imeḍfaren-ik·im
|
must_be_follower: Ssewḥel ilɣa sɣur wid akked tid ur yellin ara d imeḍfaren-ik·im
|
||||||
must_be_following: Ssewḥel ilɣa sɣur wid akked tid ur tettḍafareḍ ara
|
must_be_following: Ssewḥel ilɣa sɣur wid akked tid ur tettḍafareḍ ara
|
||||||
|
@ -109,18 +129,25 @@ kab:
|
||||||
follow: Yeḍfer-ik·im-id walbɛaḍ
|
follow: Yeḍfer-ik·im-id walbɛaḍ
|
||||||
follow_request: Ma yella win i d-yessutren ad k·em-yeḍfer
|
follow_request: Ma yella win i d-yessutren ad k·em-yeḍfer
|
||||||
mention: Yuder-ik·em-id walbɛaḍ
|
mention: Yuder-ik·em-id walbɛaḍ
|
||||||
|
pending_account: Amiḍan amaynut yesran asenqed
|
||||||
reblog: Yella win yesselhan adda-dik·im
|
reblog: Yella win yesselhan adda-dik·im
|
||||||
|
report: Aneqis amaynut yettwazen
|
||||||
rule:
|
rule:
|
||||||
hint: Isallen-nniḍen
|
hint: Isallen-nniḍen
|
||||||
text: Alugen
|
text: Alugen
|
||||||
tag:
|
tag:
|
||||||
name: Ahacṭag
|
name: Ahacṭag
|
||||||
user:
|
user:
|
||||||
|
role: Tamlilt
|
||||||
time_zone: Tamnaḍt tasragant
|
time_zone: Tamnaḍt tasragant
|
||||||
user_role:
|
user_role:
|
||||||
name: Isem
|
name: Isem
|
||||||
permissions_as_keys: Tisirag
|
permissions_as_keys: Tisirag
|
||||||
|
webhook:
|
||||||
|
events: Tidyanin turmidin
|
||||||
'no': Ala
|
'no': Ala
|
||||||
|
not_recommended: Ur yettuwelleh ara
|
||||||
|
overridden: Yeččur
|
||||||
recommended: Yettuwelleh
|
recommended: Yettuwelleh
|
||||||
required:
|
required:
|
||||||
mark: "*"
|
mark: "*"
|
||||||
|
|
|
@ -2,6 +2,12 @@
|
||||||
ro:
|
ro:
|
||||||
simple_form:
|
simple_form:
|
||||||
hints:
|
hints:
|
||||||
|
account:
|
||||||
|
discoverable: Este posibil ca postările și profilul tău să fie recomandate în diferite zone ale Mastodon, iar profilul tău ar poate fi sugerat altor utilizatori.
|
||||||
|
fields: Pagina ta principală, pronumele tale, vârsta, sau orice îți dorești.
|
||||||
|
indexable: Postările tale publice pot apărea în rezultatele căutărilor pe Mastodon. Persoanele care au interacționat cu postările tale vor putea să le caute oricând.
|
||||||
|
note: 'Poți @menționa alte persoane sau #hashtag-uri.'
|
||||||
|
unlocked: Alte persoane vă vor putea urmări fără a solicita aprobare. Debifați dacă doriți să revizuiți cererile și să alegeți dacă doriți să acceptați sau să respingeți noii urmăritori.
|
||||||
account_alias:
|
account_alias:
|
||||||
acct: Specificați numele de utilizator@domeniu al contului de la care doriți să treceți
|
acct: Specificați numele de utilizator@domeniu al contului de la care doriți să treceți
|
||||||
account_migration:
|
account_migration:
|
||||||
|
@ -23,12 +29,14 @@ ro:
|
||||||
text: Poți folosi sintaxa de postare. Te rugăm să fii atent la spațiul pe care anunțul îl va ocupa pe ecranul utilizatorului
|
text: Poți folosi sintaxa de postare. Te rugăm să fii atent la spațiul pe care anunțul îl va ocupa pe ecranul utilizatorului
|
||||||
defaults:
|
defaults:
|
||||||
autofollow: Persoanele care se înregistrează datorită invitației tale te vor urmări automat
|
autofollow: Persoanele care se înregistrează datorită invitației tale te vor urmări automat
|
||||||
|
avatar: WEBP, PNG, GIF sau JPG. Cel mult %{size}. Va fi redimensionată la %{dimensions}px
|
||||||
bot: Acest cont performează în cea mai mare parte acțiuni automate și nu poate fi monitorizat
|
bot: Acest cont performează în cea mai mare parte acțiuni automate și nu poate fi monitorizat
|
||||||
context: Contextele în care filtrul trebuie aplicat
|
context: Contextele în care filtrul trebuie aplicat
|
||||||
current_password: În scopuri de securitate, vă rugăm să introduceţi parola contului curent
|
current_password: În scopuri de securitate, vă rugăm să introduceţi parola contului curent
|
||||||
current_username: Pentru a confirma, vă rugăm să introduceţi numele de utilizator al contului curent
|
current_username: Pentru a confirma, vă rugăm să introduceţi numele de utilizator al contului curent
|
||||||
digest: Este trimis doar după o lungă perioadă de inactivitate și numai dacă primești mesaje personale în perioada de absență
|
digest: Este trimis doar după o lungă perioadă de inactivitate și numai dacă primești mesaje personale în perioada de absență
|
||||||
email: Vei primi un e-mail de confirmare
|
email: Vei primi un e-mail de confirmare
|
||||||
|
header: WEBP, PNG, GIF sau JPG. Cel mult %{size}. Va fi redimensionată la %{dimensions}px
|
||||||
inbox_url: Copiază adresa URL de pe prima pagină a reului pe care vrei să îl utilizezi
|
inbox_url: Copiază adresa URL de pe prima pagină a reului pe care vrei să îl utilizezi
|
||||||
irreversible: Postările sortate vor dispărea ireversibil, chiar dacă filtrul este ulterior șters
|
irreversible: Postările sortate vor dispărea ireversibil, chiar dacă filtrul este ulterior șters
|
||||||
locale: Limba interfaței de utilizator, e-mailurile si notificările push
|
locale: Limba interfaței de utilizator, e-mailurile si notificările push
|
||||||
|
@ -36,17 +44,27 @@ ro:
|
||||||
phrase: Vor fi potrivite indiferent de textul din casetă sau advertismentul unei postări
|
phrase: Vor fi potrivite indiferent de textul din casetă sau advertismentul unei postări
|
||||||
scopes: La care API-uri aplicația are nevoie de acces. Dacă selectezi un scop principal nu mai e nevoie să selectezi fiecare sub-scop al acestuia.
|
scopes: La care API-uri aplicația are nevoie de acces. Dacă selectezi un scop principal nu mai e nevoie să selectezi fiecare sub-scop al acestuia.
|
||||||
setting_aggregate_reblogs: Nu afișa impulsurile noi pentru postările care au fost deja recent impulsionate (afectează doar noile impulsuri primite)
|
setting_aggregate_reblogs: Nu afișa impulsurile noi pentru postările care au fost deja recent impulsionate (afectează doar noile impulsuri primite)
|
||||||
|
setting_always_send_emails: În mod normal, notificările prin e-mail nu vor fi trimise când utilizați în mod activ Mastodon
|
||||||
setting_default_sensitive: Fișierele media sensibile sunt ascunse implicit și pot fi dezvăluite cu un clic
|
setting_default_sensitive: Fișierele media sensibile sunt ascunse implicit și pot fi dezvăluite cu un clic
|
||||||
setting_display_media_default: Ascunde conținutul media marcat ca sensibil (NSFW)
|
setting_display_media_default: Ascunde conținutul media marcat ca sensibil (NSFW)
|
||||||
setting_display_media_hide_all: Întotdeauna ascunde tot conținutul media
|
setting_display_media_hide_all: Întotdeauna ascunde tot conținutul media
|
||||||
setting_display_media_show_all: Întotdeauna afișează conținutul media marcat ca sensibil
|
setting_display_media_show_all: Întotdeauna afișează conținutul media marcat ca sensibil
|
||||||
setting_use_blurhash: Gradienții sunt bazați pe culorile vizualelor ascunse, dar ofuscă orice detalii
|
setting_use_blurhash: Gradienții sunt bazați pe culorile vizualelor ascunse, dar ofuscă orice detalii
|
||||||
setting_use_pending_items: Ascunde actualizările cronologice din spatele unui click în loc de a derula automat fluxul
|
setting_use_pending_items: Ascunde actualizările cronologice din spatele unui click în loc de a derula automat fluxul
|
||||||
|
username: Poți folosi litere, numere sau liniuțe de subliniere
|
||||||
whole_word: Când fraza sau cuvântul este doar alfanumeric, acesta se aplică doar dacă există o potrivire completă
|
whole_word: Când fraza sau cuvântul este doar alfanumeric, acesta se aplică doar dacă există o potrivire completă
|
||||||
domain_allow:
|
domain_allow:
|
||||||
domain: Acest domeniu va putea prelua date de pe acest server și datele primite de la el vor fi procesate și stocate
|
domain: Acest domeniu va putea prelua date de pe acest server și datele primite de la el vor fi procesate și stocate
|
||||||
email_domain_block:
|
email_domain_block:
|
||||||
|
domain: Acesta poate fi numele de domeniu care apare în adresa de e-mail sau în înregistrarea MX pe care o utilizează. Acestea vor fi verificate la înscriere.
|
||||||
with_dns_records: Se va face o încercare de a rezolva înregistrările DNS ale domeniului dat și rezultatele vor fi de asemenea afișate pe lista neagră
|
with_dns_records: Se va face o încercare de a rezolva înregistrările DNS ale domeniului dat și rezultatele vor fi de asemenea afișate pe lista neagră
|
||||||
|
featured_tag:
|
||||||
|
name: 'Iată câteva dintre hashtag-urile pe care le-ai folosit cel mai recent:'
|
||||||
|
filters:
|
||||||
|
action: Alege ce acţiune va fi efectuată atunci când o postare corespunde filtrului
|
||||||
|
actions:
|
||||||
|
hide: Ascunde complet conținutul filtrat, ca și cum nu ar exista
|
||||||
|
warn: Ascunde conținutul filtrat în spatele unui avertisment care menționează titlul filtrului
|
||||||
form_challenge:
|
form_challenge:
|
||||||
current_password: Ați intrat într-o zonă securizată
|
current_password: Ați intrat într-o zonă securizată
|
||||||
imports:
|
imports:
|
||||||
|
|
|
@ -63,12 +63,16 @@ Rails.application.routes.draw do
|
||||||
tokens: 'oauth/tokens'
|
tokens: 'oauth/tokens'
|
||||||
end
|
end
|
||||||
|
|
||||||
get '.well-known/oauth-authorization-server', to: 'well_known/oauth_metadata#show', as: :oauth_metadata, defaults: { format: 'json' }
|
scope path: '.well-known' do
|
||||||
get '.well-known/host-meta', to: 'well_known/host_meta#show', as: :host_meta, defaults: { format: 'xml' }
|
scope module: :well_known do
|
||||||
get '.well-known/nodeinfo', to: 'well_known/node_info#index', as: :nodeinfo, defaults: { format: 'json' }
|
get 'oauth-authorization-server', to: 'oauth_metadata#show', as: :oauth_metadata, defaults: { format: 'json' }
|
||||||
get '.well-known/webfinger', to: 'well_known/webfinger#show', as: :webfinger
|
get 'host-meta', to: 'host_meta#show', as: :host_meta, defaults: { format: 'xml' }
|
||||||
get '.well-known/change-password', to: redirect('/auth/edit')
|
get 'nodeinfo', to: 'node_info#index', as: :nodeinfo, defaults: { format: 'json' }
|
||||||
get '.well-known/proxy', to: redirect { |_, request| "/authorize_interaction?#{request.params.to_query}" }
|
get 'webfinger', to: 'webfinger#show', as: :webfinger
|
||||||
|
end
|
||||||
|
get 'change-password', to: redirect('/auth/edit'), as: nil
|
||||||
|
get 'proxy', to: redirect { |_, request| "/authorize_interaction?#{request.params.to_query}" }, as: nil
|
||||||
|
end
|
||||||
|
|
||||||
get '/nodeinfo/2.0', to: 'well_known/node_info#show', as: :nodeinfo_schema
|
get '/nodeinfo/2.0', to: 'well_known/node_info#show', as: :nodeinfo_schema
|
||||||
|
|
||||||
|
@ -94,19 +98,15 @@ Rails.application.routes.draw do
|
||||||
|
|
||||||
namespace :auth do
|
namespace :auth do
|
||||||
resource :setup, only: [:show, :update], controller: :setup
|
resource :setup, only: [:show, :update], controller: :setup
|
||||||
resource :challenge, only: [:create], controller: :challenges
|
resource :challenge, only: [:create]
|
||||||
get 'sessions/security_key_options', to: 'sessions#webauthn_options'
|
get 'sessions/security_key_options', to: 'sessions#webauthn_options'
|
||||||
post 'captcha_confirmation', to: 'confirmations#confirm_captcha', as: :captcha_confirmation
|
post 'captcha_confirmation', to: 'confirmations#confirm_captcha', as: :captcha_confirmation
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
devise_for :users, path: 'auth', format: false, controllers: {
|
scope module: :auth do
|
||||||
omniauth_callbacks: 'auth/omniauth_callbacks',
|
devise_for :users, path: 'auth', format: false
|
||||||
sessions: 'auth/sessions',
|
end
|
||||||
registrations: 'auth/registrations',
|
|
||||||
passwords: 'auth/passwords',
|
|
||||||
confirmations: 'auth/confirmations',
|
|
||||||
}
|
|
||||||
|
|
||||||
with_options constraints: ->(req) { req.format.nil? || req.format.html? } do
|
with_options constraints: ->(req) { req.format.nil? || req.format.html? } do
|
||||||
get '/users/:username', to: redirect_with_vary('/@%{username}')
|
get '/users/:username', to: redirect_with_vary('/@%{username}')
|
||||||
|
|
|
@ -203,9 +203,11 @@ namespace :api, format: false do
|
||||||
post :unmute
|
post :unmute
|
||||||
end
|
end
|
||||||
|
|
||||||
resource :pin, only: :create, controller: 'accounts/pins'
|
scope module: :accounts do
|
||||||
post :unpin, to: 'accounts/pins#destroy'
|
resource :pin, only: :create
|
||||||
resource :note, only: :create, controller: 'accounts/notes'
|
post :unpin, to: 'pins#destroy'
|
||||||
|
resource :note, only: :create
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
resources :tags, only: [:show] do
|
resources :tags, only: [:show] do
|
||||||
|
@ -218,7 +220,7 @@ namespace :api, format: false do
|
||||||
resources :followed_tags, only: [:index]
|
resources :followed_tags, only: [:index]
|
||||||
|
|
||||||
resources :lists, only: [:index, :create, :show, :update, :destroy] do
|
resources :lists, only: [:index, :create, :show, :update, :destroy] do
|
||||||
resource :accounts, only: [:show, :create, :destroy], controller: 'lists/accounts'
|
resource :accounts, only: [:show, :create, :destroy], module: :lists
|
||||||
end
|
end
|
||||||
|
|
||||||
namespace :featured_tags do
|
namespace :featured_tags do
|
||||||
|
@ -228,7 +230,7 @@ namespace :api, format: false do
|
||||||
resources :featured_tags, only: [:index, :create, :destroy]
|
resources :featured_tags, only: [:index, :create, :destroy]
|
||||||
|
|
||||||
resources :polls, only: [:create, :show] do
|
resources :polls, only: [:create, :show] do
|
||||||
resources :votes, only: :create, controller: 'polls/votes'
|
resources :votes, only: :create, module: :polls
|
||||||
end
|
end
|
||||||
|
|
||||||
namespace :push do
|
namespace :push do
|
||||||
|
@ -314,8 +316,10 @@ namespace :api, format: false do
|
||||||
resources :suggestions, only: [:index]
|
resources :suggestions, only: [:index]
|
||||||
resource :instance, only: [:show]
|
resource :instance, only: [:show]
|
||||||
resources :filters, only: [:index, :create, :show, :update, :destroy] do
|
resources :filters, only: [:index, :create, :show, :update, :destroy] do
|
||||||
resources :keywords, only: [:index, :create], controller: 'filters/keywords'
|
scope module: :filters do
|
||||||
resources :statuses, only: [:index, :create], controller: 'filters/statuses'
|
resources :keywords, only: [:index, :create]
|
||||||
|
resources :statuses, only: [:index, :create]
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
namespace :filters do
|
namespace :filters do
|
||||||
|
|
|
@ -26,9 +26,9 @@ namespace :settings do
|
||||||
resources :follows, only: :index, controller: :following_accounts
|
resources :follows, only: :index, controller: :following_accounts
|
||||||
resources :blocks, only: :index, controller: :blocked_accounts
|
resources :blocks, only: :index, controller: :blocked_accounts
|
||||||
resources :mutes, only: :index, controller: :muted_accounts
|
resources :mutes, only: :index, controller: :muted_accounts
|
||||||
resources :lists, only: :index, controller: :lists
|
resources :lists, only: :index
|
||||||
resources :domain_blocks, only: :index, controller: :blocked_domains
|
resources :domain_blocks, only: :index, controller: :blocked_domains
|
||||||
resources :bookmarks, only: :index, controller: :bookmarks
|
resources :bookmarks, only: :index
|
||||||
end
|
end
|
||||||
|
|
||||||
resources :two_factor_authentication_methods, only: [:index] do
|
resources :two_factor_authentication_methods, only: [:index] do
|
||||||
|
@ -37,13 +37,13 @@ namespace :settings do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
resource :otp_authentication, only: [:show, :create], controller: 'two_factor_authentication/otp_authentication'
|
scope module: :two_factor_authentication do
|
||||||
|
resource :otp_authentication, only: [:show, :create], controller: :otp_authentication
|
||||||
|
|
||||||
resources :webauthn_credentials, only: [:index, :new, :create, :destroy],
|
resources :webauthn_credentials, only: [:index, :new, :create, :destroy], path: 'security_keys' do
|
||||||
path: 'security_keys',
|
collection do
|
||||||
controller: 'two_factor_authentication/webauthn_credentials' do
|
get :options
|
||||||
collection do
|
end
|
||||||
get :options
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -34,7 +34,7 @@ RSpec.describe Admin::Disputes::AppealsController do
|
||||||
|
|
||||||
let(:current_user) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')) }
|
let(:current_user) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')) }
|
||||||
|
|
||||||
it 'redirects back to the strike page and notifies target account about approved appeal', :sidekiq_inline do
|
it 'redirects back to the strike page and notifies target account about approved appeal', :inline_jobs do
|
||||||
emails = capture_emails { subject }
|
emails = capture_emails { subject }
|
||||||
|
|
||||||
expect(response)
|
expect(response)
|
||||||
|
@ -58,7 +58,7 @@ RSpec.describe Admin::Disputes::AppealsController do
|
||||||
|
|
||||||
let(:current_user) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')) }
|
let(:current_user) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')) }
|
||||||
|
|
||||||
it 'redirects back to the strike page and notifies target account about rejected appeal', :sidekiq_inline do
|
it 'redirects back to the strike page and notifies target account about rejected appeal', :inline_jobs do
|
||||||
emails = capture_emails { subject }
|
emails = capture_emails { subject }
|
||||||
|
|
||||||
expect(response)
|
expect(response)
|
||||||
|
|
|
@ -176,7 +176,7 @@ RSpec.describe Admin::DomainBlocksController do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
describe 'PUT #update', :sidekiq_inline do
|
describe 'PUT #update', :inline_jobs do
|
||||||
subject do
|
subject do
|
||||||
post :update, params: { :id => domain_block.id, :domain_block => { domain: 'example.com', severity: new_severity }, 'confirm' => '' }
|
post :update, params: { :id => domain_block.id, :domain_block => { domain: 'example.com', severity: new_severity }, 'confirm' => '' }
|
||||||
end
|
end
|
||||||
|
|
|
@ -13,7 +13,7 @@ describe Admin::ResetsController do
|
||||||
sign_in Fabricate(:user, role: UserRole.find_by(name: 'Admin')), scope: :user
|
sign_in Fabricate(:user, role: UserRole.find_by(name: 'Admin')), scope: :user
|
||||||
end
|
end
|
||||||
|
|
||||||
describe 'POST #create', :sidekiq_inline do
|
describe 'POST #create', :inline_jobs do
|
||||||
it 'redirects to admin accounts page' do
|
it 'redirects to admin accounts page' do
|
||||||
emails = capture_emails { subject }
|
emails = capture_emails { subject }
|
||||||
|
|
||||||
|
|
|
@ -123,7 +123,7 @@ RSpec.describe Auth::SessionsController do
|
||||||
user.update(current_sign_in_at: 1.month.ago)
|
user.update(current_sign_in_at: 1.month.ago)
|
||||||
end
|
end
|
||||||
|
|
||||||
it 'logs the user in and sends suspicious email and redirects home', :sidekiq_inline do
|
it 'logs the user in and sends suspicious email and redirects home', :inline_jobs do
|
||||||
emails = capture_emails { subject }
|
emails = capture_emails { subject }
|
||||||
|
|
||||||
expect(response)
|
expect(response)
|
||||||
|
@ -263,7 +263,7 @@ RSpec.describe Auth::SessionsController do
|
||||||
travel_to '2023-12-20T10:00:00Z'
|
travel_to '2023-12-20T10:00:00Z'
|
||||||
end
|
end
|
||||||
|
|
||||||
it 'does not log the user in, sets a flash message, and sends a suspicious sign in email', :sidekiq_inline do
|
it 'does not log the user in, sets a flash message, and sends a suspicious sign in email', :inline_jobs do
|
||||||
emails = capture_emails do
|
emails = capture_emails do
|
||||||
Auth::SessionsController::MAX_2FA_ATTEMPTS_PER_HOUR.times do
|
Auth::SessionsController::MAX_2FA_ATTEMPTS_PER_HOUR.times do
|
||||||
post :create, params: { user: { otp_attempt: '1234' } }, session: { attempt_user_id: user.id, attempt_user_updated_at: user.updated_at.to_s }
|
post :create, params: { user: { otp_attempt: '1234' } }, session: { attempt_user_id: user.id, attempt_user_updated_at: user.updated_at.to_s }
|
||||||
|
|
|
@ -75,7 +75,7 @@ describe UserTrackingConcern do
|
||||||
expect(redis.ttl("account:#{user.account_id}:regeneration")).to be >= 0
|
expect(redis.ttl("account:#{user.account_id}:regeneration")).to be >= 0
|
||||||
end
|
end
|
||||||
|
|
||||||
it 'regenerates feed when sign in is older than two weeks', :sidekiq_inline do
|
it 'regenerates feed when sign in is older than two weeks', :inline_jobs do
|
||||||
get :show
|
get :show
|
||||||
|
|
||||||
expect_updated_sign_in_at(user)
|
expect_updated_sign_in_at(user)
|
||||||
|
|
|
@ -17,7 +17,7 @@ RSpec.describe Disputes::AppealsController do
|
||||||
let(:strike) { Fabricate(:account_warning, target_account: current_user.account) }
|
let(:strike) { Fabricate(:account_warning, target_account: current_user.account) }
|
||||||
let(:params) { { strike_id: strike.id, appeal: { text: 'Foo' } } }
|
let(:params) { { strike_id: strike.id, appeal: { text: 'Foo' } } }
|
||||||
|
|
||||||
it 'notifies staff about new appeal and redirects back to strike page', :sidekiq_inline do
|
it 'notifies staff about new appeal and redirects back to strike page', :inline_jobs do
|
||||||
emails = capture_emails { subject }
|
emails = capture_emails { subject }
|
||||||
|
|
||||||
expect(emails.size)
|
expect(emails.size)
|
||||||
|
@ -36,7 +36,7 @@ RSpec.describe Disputes::AppealsController do
|
||||||
let(:strike) { Fabricate(:account_warning, target_account: current_user.account) }
|
let(:strike) { Fabricate(:account_warning, target_account: current_user.account) }
|
||||||
let(:params) { { strike_id: strike.id, appeal: { text: '' } } }
|
let(:params) { { strike_id: strike.id, appeal: { text: '' } } }
|
||||||
|
|
||||||
it 'does not send email and renders strike show page', :sidekiq_inline do
|
it 'does not send email and renders strike show page', :inline_jobs do
|
||||||
emails = capture_emails { subject }
|
emails = capture_emails { subject }
|
||||||
|
|
||||||
expect(emails).to be_empty
|
expect(emails).to be_empty
|
||||||
|
|
|
@ -50,7 +50,7 @@ describe Settings::DeletesController do
|
||||||
delete :destroy, params: { form_delete_confirmation: { password: 'petsmoldoggos' } }
|
delete :destroy, params: { form_delete_confirmation: { password: 'petsmoldoggos' } }
|
||||||
end
|
end
|
||||||
|
|
||||||
it 'removes user record and redirects', :aggregate_failures, :sidekiq_inline do
|
it 'removes user record and redirects', :aggregate_failures, :inline_jobs do
|
||||||
expect(response).to redirect_to '/auth/sign_in'
|
expect(response).to redirect_to '/auth/sign_in'
|
||||||
expect(User.find_by(id: user.id)).to be_nil
|
expect(User.find_by(id: user.id)).to be_nil
|
||||||
expect(user.account.reload).to be_suspended
|
expect(user.account.reload).to be_suspended
|
||||||
|
|
18
spec/fixtures/requests/alternative_utf8_spelling_in_header.txt
vendored
Normal file
18
spec/fixtures/requests/alternative_utf8_spelling_in_header.txt
vendored
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
HTTP/1.1 200 OK
|
||||||
|
server: nginx
|
||||||
|
date: Thu, 13 Jun 2024 14:33:13 GMT
|
||||||
|
content-type: text/html; charset=utf8
|
||||||
|
content-length: 192
|
||||||
|
accept-ranges: bytes
|
||||||
|
|
||||||
|
<!doctype html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<title>Webserver Configs R Us</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<h2>Welcome</h2>
|
||||||
|
<p>Sneaky non-UTF character: á</p>
|
||||||
|
</body>
|
||||||
|
</html>
|
17
spec/fixtures/requests/latin1_posing_as_utf8_broken.txt
vendored
Normal file
17
spec/fixtures/requests/latin1_posing_as_utf8_broken.txt
vendored
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
HTTP/1.1 200 OK
|
||||||
|
server: nginx
|
||||||
|
date: Thu, 13 Jun 2024 14:33:13 GMT
|
||||||
|
content-type: text/html; charset=utf-8
|
||||||
|
content-length: 158
|
||||||
|
accept-ranges: bytes
|
||||||
|
|
||||||
|
<!doctype html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<title>Tofu á l'orange</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<h2>Tofu á l'orange</h2>
|
||||||
|
</body>
|
||||||
|
</html>
|
17
spec/fixtures/requests/latin1_posing_as_utf8_recoverable.txt
vendored
Normal file
17
spec/fixtures/requests/latin1_posing_as_utf8_recoverable.txt
vendored
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
HTTP/1.1 200 OK
|
||||||
|
server: nginx
|
||||||
|
date: Thu, 13 Jun 2024 14:33:13 GMT
|
||||||
|
content-type: text/html; charset=utf-8
|
||||||
|
content-length: 158
|
||||||
|
accept-ranges: bytes
|
||||||
|
|
||||||
|
<!doctype html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<title>Tofu with orange sauce</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<h2>Tofu á l'orange</h2>
|
||||||
|
</body>
|
||||||
|
</html>
|
18
spec/fixtures/requests/long_canonical_url.txt
vendored
Normal file
18
spec/fixtures/requests/long_canonical_url.txt
vendored
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
HTTP/1.1 200 OK
|
||||||
|
server: nginx
|
||||||
|
date: Thu, 13 Jun 2024 14:33:13 GMT
|
||||||
|
content-type: text/html; charset=utf-8
|
||||||
|
content-length: 3225
|
||||||
|
accept-ranges: bytes
|
||||||
|
|
||||||
|
<!doctype html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<link rel="canonical" href="https://example.com/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa">
|
||||||
|
<title>Very long canonical URL</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<h2>We have very long URLs</h2>
|
||||||
|
</body>
|
||||||
|
</html>
|
17
spec/fixtures/requests/page_without_title.txt
vendored
Normal file
17
spec/fixtures/requests/page_without_title.txt
vendored
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
HTTP/1.1 200 OK
|
||||||
|
server: nginx
|
||||||
|
date: Thu, 13 Jun 2024 14:33:13 GMT
|
||||||
|
content-type: text/html; charset=utf-8
|
||||||
|
content-length: 171
|
||||||
|
accept-ranges: bytes
|
||||||
|
|
||||||
|
<!doctype html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<h2>I am not a valid page</h2>
|
||||||
|
<p>Thankfully, browsers do not care</p>
|
||||||
|
</body>
|
||||||
|
</html>
|
|
@ -47,7 +47,7 @@ RSpec.describe ActivityPub::Activity::Delete do
|
||||||
expect(Status.find_by(id: status.id)).to be_nil
|
expect(Status.find_by(id: status.id)).to be_nil
|
||||||
end
|
end
|
||||||
|
|
||||||
it 'sends delete activity to followers of rebloggers', :sidekiq_inline do
|
it 'sends delete activity to followers of rebloggers', :inline_jobs do
|
||||||
expect(a_request(:post, 'http://example.com/inbox')).to have_been_made.once
|
expect(a_request(:post, 'http://example.com/inbox')).to have_been_made.once
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -38,7 +38,7 @@ RSpec.describe ActivityPub::Activity::Move do
|
||||||
subject.perform
|
subject.perform
|
||||||
end
|
end
|
||||||
|
|
||||||
context 'when all conditions are met', :sidekiq_inline do
|
context 'when all conditions are met', :inline_jobs do
|
||||||
it 'sets moved account on old account' do
|
it 'sets moved account on old account' do
|
||||||
expect(old_account.reload.moved_to_account_id).to eq new_account.id
|
expect(old_account.reload.moved_to_account_id).to eq new_account.id
|
||||||
end
|
end
|
||||||
|
|
|
@ -192,6 +192,35 @@ RSpec.describe LinkDetailsExtractor do
|
||||||
|
|
||||||
include_examples 'structured data'
|
include_examples 'structured data'
|
||||||
end
|
end
|
||||||
|
|
||||||
|
context 'with author names as array' do
|
||||||
|
let(:ld_json) do
|
||||||
|
{
|
||||||
|
'@context' => 'https://schema.org',
|
||||||
|
'@type' => 'NewsArticle',
|
||||||
|
'headline' => 'A lot of authors',
|
||||||
|
'description' => 'But we decided to cram them into one',
|
||||||
|
'author' => {
|
||||||
|
'@type' => 'Person',
|
||||||
|
'name' => ['Author 1', 'Author 2'],
|
||||||
|
},
|
||||||
|
}.to_json
|
||||||
|
end
|
||||||
|
let(:html) { <<~HTML }
|
||||||
|
<!doctype html>
|
||||||
|
<html>
|
||||||
|
<body>
|
||||||
|
<script type="application/ld+json">
|
||||||
|
#{ld_json}
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
HTML
|
||||||
|
|
||||||
|
it 'joins author names' do
|
||||||
|
expect(subject.author_name).to eq 'Author 1, Author 2'
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
context 'when Open Graph protocol data is present' do
|
context 'when Open Graph protocol data is present' do
|
||||||
|
|
|
@ -69,7 +69,7 @@ RSpec.describe Admin::AccountAction do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
it 'sends email to target account user', :sidekiq_inline do
|
it 'sends email to target account user', :inline_jobs do
|
||||||
emails = capture_emails { subject }
|
emails = capture_emails { subject }
|
||||||
|
|
||||||
expect(emails).to contain_exactly(
|
expect(emails).to contain_exactly(
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
|
|
||||||
require 'rails_helper'
|
require 'rails_helper'
|
||||||
|
|
||||||
RSpec.describe CustomEmoji, :paperclip_processing do
|
RSpec.describe CustomEmoji, :attachment_processing do
|
||||||
describe '#search' do
|
describe '#search' do
|
||||||
subject { described_class.search(search_term) }
|
subject { described_class.search(search_term) }
|
||||||
|
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
|
|
||||||
require 'rails_helper'
|
require 'rails_helper'
|
||||||
|
|
||||||
RSpec.describe MediaAttachment, :paperclip_processing do
|
RSpec.describe MediaAttachment, :attachment_processing do
|
||||||
describe 'local?' do
|
describe 'local?' do
|
||||||
subject { media_attachment.local? }
|
subject { media_attachment.local? }
|
||||||
|
|
||||||
|
|
|
@ -247,6 +247,41 @@ RSpec.describe Status do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
describe '#ordered_media_attachments' do
|
||||||
|
let(:status) { Fabricate(:status) }
|
||||||
|
|
||||||
|
let(:first_attachment) { Fabricate(:media_attachment) }
|
||||||
|
let(:second_attachment) { Fabricate(:media_attachment) }
|
||||||
|
let(:last_attachment) { Fabricate(:media_attachment) }
|
||||||
|
let(:extra_attachment) { Fabricate(:media_attachment) }
|
||||||
|
|
||||||
|
before do
|
||||||
|
stub_const('Status::MEDIA_ATTACHMENTS_LIMIT', 3)
|
||||||
|
|
||||||
|
# Add attachments out of order
|
||||||
|
status.media_attachments << second_attachment
|
||||||
|
status.media_attachments << last_attachment
|
||||||
|
status.media_attachments << extra_attachment
|
||||||
|
status.media_attachments << first_attachment
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'when ordered_media_attachment_ids is not set' do
|
||||||
|
it 'returns up to MEDIA_ATTACHMENTS_LIMIT attachments' do
|
||||||
|
expect(status.ordered_media_attachments.size).to eq Status::MEDIA_ATTACHMENTS_LIMIT
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'when ordered_media_attachment_ids is set' do
|
||||||
|
before do
|
||||||
|
status.update!(ordered_media_attachment_ids: [first_attachment.id, second_attachment.id, last_attachment.id, extra_attachment.id])
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'returns up to MEDIA_ATTACHMENTS_LIMIT attachments in the expected order' do
|
||||||
|
expect(status.ordered_media_attachments).to eq [first_attachment, second_attachment, last_attachment]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
describe '.mutes_map' do
|
describe '.mutes_map' do
|
||||||
subject { described_class.mutes_map([status.conversation.id], account) }
|
subject { described_class.mutes_map([status.conversation.id], account) }
|
||||||
|
|
||||||
|
|
|
@ -101,7 +101,7 @@ RSpec.describe User do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
describe 'scopes', :sidekiq_inline do
|
describe 'scopes', :inline_jobs do
|
||||||
describe 'recent' do
|
describe 'recent' do
|
||||||
it 'returns an array of recent users ordered by id' do
|
it 'returns an array of recent users ordered by id' do
|
||||||
first_user = Fabricate(:user)
|
first_user = Fabricate(:user)
|
||||||
|
@ -507,7 +507,7 @@ RSpec.describe User do
|
||||||
context 'when user is new' do
|
context 'when user is new' do
|
||||||
let(:confirmed_at) { nil }
|
let(:confirmed_at) { nil }
|
||||||
|
|
||||||
it 'confirms user and delivers welcome email', :sidekiq_inline do
|
it 'confirms user and delivers welcome email', :inline_jobs do
|
||||||
emails = capture_emails { subject }
|
emails = capture_emails { subject }
|
||||||
|
|
||||||
expect(user.confirmed_at).to be_present
|
expect(user.confirmed_at).to be_present
|
||||||
|
|
|
@ -120,7 +120,7 @@ RSpec.configure do |config|
|
||||||
end
|
end
|
||||||
|
|
||||||
config.around do |example|
|
config.around do |example|
|
||||||
if example.metadata[:sidekiq_inline] == true
|
if example.metadata[:inline_jobs] == true
|
||||||
Sidekiq::Testing.inline!
|
Sidekiq::Testing.inline!
|
||||||
else
|
else
|
||||||
Sidekiq::Testing.fake!
|
Sidekiq::Testing.fake!
|
||||||
|
@ -137,7 +137,7 @@ RSpec.configure do |config|
|
||||||
end
|
end
|
||||||
|
|
||||||
config.before do |example|
|
config.before do |example|
|
||||||
unless example.metadata[:paperclip_processing]
|
unless example.metadata[:attachment_processing]
|
||||||
allow_any_instance_of(Paperclip::Attachment).to receive(:post_process).and_return(true) # rubocop:disable RSpec/AnyInstance
|
allow_any_instance_of(Paperclip::Attachment).to receive(:post_process).and_return(true) # rubocop:disable RSpec/AnyInstance
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -10,7 +10,7 @@ RSpec.describe 'Account actions' do
|
||||||
let(:headers) { { 'Authorization' => "Bearer #{token.token}" } }
|
let(:headers) { { 'Authorization' => "Bearer #{token.token}" } }
|
||||||
|
|
||||||
shared_examples 'a successful notification delivery' do
|
shared_examples 'a successful notification delivery' do
|
||||||
it 'notifies the user about the action taken', :sidekiq_inline do
|
it 'notifies the user about the action taken', :inline_jobs do
|
||||||
emails = capture_emails { subject }
|
emails = capture_emails { subject }
|
||||||
|
|
||||||
expect(emails.size)
|
expect(emails.size)
|
||||||
|
|
|
@ -10,7 +10,7 @@ RSpec.describe 'API V1 Conversations' do
|
||||||
|
|
||||||
let(:other) { Fabricate(:user) }
|
let(:other) { Fabricate(:user) }
|
||||||
|
|
||||||
describe 'GET /api/v1/conversations', :sidekiq_inline do
|
describe 'GET /api/v1/conversations', :inline_jobs do
|
||||||
before do
|
before do
|
||||||
user.account.follow!(other.account)
|
user.account.follow!(other.account)
|
||||||
PostStatusService.new.call(other.account, text: 'Hey @alice', visibility: 'direct')
|
PostStatusService.new.call(other.account, text: 'Hey @alice', visibility: 'direct')
|
||||||
|
|
|
@ -147,7 +147,7 @@ RSpec.describe 'FeaturedTags' do
|
||||||
expect(body).to be_empty
|
expect(body).to be_empty
|
||||||
end
|
end
|
||||||
|
|
||||||
it 'deletes the featured tag', :sidekiq_inline do
|
it 'deletes the featured tag', :inline_jobs do
|
||||||
delete "/api/v1/featured_tags/#{id}", headers: headers
|
delete "/api/v1/featured_tags/#{id}", headers: headers
|
||||||
|
|
||||||
featured_tag = FeaturedTag.find_by(id: id)
|
featured_tag = FeaturedTag.find_by(id: id)
|
||||||
|
|
|
@ -121,19 +121,19 @@ RSpec.describe 'Media' do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
context 'with image/jpeg', :paperclip_processing do
|
context 'with image/jpeg', :attachment_processing do
|
||||||
let(:params) { { file: fixture_file_upload('attachment.jpg', 'image/jpeg'), description: 'jpeg image' } }
|
let(:params) { { file: fixture_file_upload('attachment.jpg', 'image/jpeg'), description: 'jpeg image' } }
|
||||||
|
|
||||||
it_behaves_like 'a successful media upload', 'image'
|
it_behaves_like 'a successful media upload', 'image'
|
||||||
end
|
end
|
||||||
|
|
||||||
context 'with image/gif', :paperclip_processing do
|
context 'with image/gif', :attachment_processing do
|
||||||
let(:params) { { file: fixture_file_upload('attachment.gif', 'image/gif') } }
|
let(:params) { { file: fixture_file_upload('attachment.gif', 'image/gif') } }
|
||||||
|
|
||||||
it_behaves_like 'a successful media upload', 'image'
|
it_behaves_like 'a successful media upload', 'image'
|
||||||
end
|
end
|
||||||
|
|
||||||
context 'with video/webm', :paperclip_processing do
|
context 'with video/webm', :attachment_processing do
|
||||||
let(:params) { { file: fixture_file_upload('attachment.webm', 'video/webm') } }
|
let(:params) { { file: fixture_file_upload('attachment.webm', 'video/webm') } }
|
||||||
|
|
||||||
it_behaves_like 'a successful media upload', 'gifv'
|
it_behaves_like 'a successful media upload', 'gifv'
|
||||||
|
|
|
@ -8,7 +8,7 @@ RSpec.describe 'Policies' do
|
||||||
let(:scopes) { 'read:notifications write:notifications' }
|
let(:scopes) { 'read:notifications write:notifications' }
|
||||||
let(:headers) { { 'Authorization' => "Bearer #{token.token}" } }
|
let(:headers) { { 'Authorization' => "Bearer #{token.token}" } }
|
||||||
|
|
||||||
describe 'GET /api/v1/notifications/policy', :sidekiq_inline do
|
describe 'GET /api/v1/notifications/policy', :inline_jobs do
|
||||||
subject do
|
subject do
|
||||||
get '/api/v1/notifications/policy', headers: headers, params: params
|
get '/api/v1/notifications/policy', headers: headers, params: params
|
||||||
end
|
end
|
||||||
|
|
|
@ -8,7 +8,7 @@ RSpec.describe 'Requests' do
|
||||||
let(:scopes) { 'read:notifications write:notifications' }
|
let(:scopes) { 'read:notifications write:notifications' }
|
||||||
let(:headers) { { 'Authorization' => "Bearer #{token.token}" } }
|
let(:headers) { { 'Authorization' => "Bearer #{token.token}" } }
|
||||||
|
|
||||||
describe 'GET /api/v1/notifications/requests', :sidekiq_inline do
|
describe 'GET /api/v1/notifications/requests', :inline_jobs do
|
||||||
subject do
|
subject do
|
||||||
get '/api/v1/notifications/requests', headers: headers, params: params
|
get '/api/v1/notifications/requests', headers: headers, params: params
|
||||||
end
|
end
|
||||||
|
|
|
@ -8,7 +8,7 @@ RSpec.describe 'Notifications' do
|
||||||
let(:scopes) { 'read:notifications write:notifications' }
|
let(:scopes) { 'read:notifications write:notifications' }
|
||||||
let(:headers) { { 'Authorization' => "Bearer #{token.token}" } }
|
let(:headers) { { 'Authorization' => "Bearer #{token.token}" } }
|
||||||
|
|
||||||
describe 'GET /api/v1/notifications', :sidekiq_inline do
|
describe 'GET /api/v1/notifications', :inline_jobs do
|
||||||
subject do
|
subject do
|
||||||
get '/api/v1/notifications', headers: headers, params: params
|
get '/api/v1/notifications', headers: headers, params: params
|
||||||
end
|
end
|
||||||
|
|
|
@ -10,9 +10,10 @@ RSpec.describe 'API V1 Polls Votes' do
|
||||||
|
|
||||||
describe 'POST /api/v1/polls/:poll_id/votes' do
|
describe 'POST /api/v1/polls/:poll_id/votes' do
|
||||||
let(:poll) { Fabricate(:poll) }
|
let(:poll) { Fabricate(:poll) }
|
||||||
|
let(:params) { { choices: %w(1) } }
|
||||||
|
|
||||||
before do
|
before do
|
||||||
post "/api/v1/polls/#{poll.id}/votes", params: { choices: %w(1) }, headers: headers
|
post "/api/v1/polls/#{poll.id}/votes", params: params, headers: headers
|
||||||
end
|
end
|
||||||
|
|
||||||
it 'creates a vote', :aggregate_failures do
|
it 'creates a vote', :aggregate_failures do
|
||||||
|
@ -24,6 +25,14 @@ RSpec.describe 'API V1 Polls Votes' do
|
||||||
expect(poll.reload.cached_tallies).to eq [0, 1]
|
expect(poll.reload.cached_tallies).to eq [0, 1]
|
||||||
end
|
end
|
||||||
|
|
||||||
|
context 'when the required choices param is not provided' do
|
||||||
|
let(:params) { {} }
|
||||||
|
|
||||||
|
it 'returns http bad request' do
|
||||||
|
expect(response).to have_http_status(400)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
def vote
|
def vote
|
||||||
|
|
|
@ -33,7 +33,7 @@ RSpec.describe 'Reports' do
|
||||||
|
|
||||||
it_behaves_like 'forbidden for wrong scope', 'read read:reports'
|
it_behaves_like 'forbidden for wrong scope', 'read read:reports'
|
||||||
|
|
||||||
it 'creates a report', :aggregate_failures, :sidekiq_inline do
|
it 'creates a report', :aggregate_failures, :inline_jobs do
|
||||||
emails = capture_emails { subject }
|
emails = capture_emails { subject }
|
||||||
|
|
||||||
expect(response).to have_http_status(200)
|
expect(response).to have_http_status(200)
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
|
|
||||||
require 'rails_helper'
|
require 'rails_helper'
|
||||||
|
|
||||||
RSpec.describe 'Favourites', :sidekiq_inline do
|
RSpec.describe 'Favourites', :inline_jobs do
|
||||||
let(:user) { Fabricate(:user) }
|
let(:user) { Fabricate(:user) }
|
||||||
let(:scopes) { 'write:favourites' }
|
let(:scopes) { 'write:favourites' }
|
||||||
let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: scopes) }
|
let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: scopes) }
|
||||||
|
|
|
@ -41,7 +41,7 @@ describe 'API V1 Statuses Reblogs' do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
describe 'POST /api/v1/statuses/:status_id/unreblog', :sidekiq_inline do
|
describe 'POST /api/v1/statuses/:status_id/unreblog', :inline_jobs do
|
||||||
context 'with public status' do
|
context 'with public status' do
|
||||||
let(:status) { Fabricate(:status, account: user.account) }
|
let(:status) { Fabricate(:status, account: user.account) }
|
||||||
|
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
|
|
||||||
require 'rails_helper'
|
require 'rails_helper'
|
||||||
|
|
||||||
describe 'Home', :sidekiq_inline do
|
describe 'Home', :inline_jobs do
|
||||||
let(:user) { Fabricate(:user) }
|
let(:user) { Fabricate(:user) }
|
||||||
let(:scopes) { 'read:statuses' }
|
let(:scopes) { 'read:statuses' }
|
||||||
let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: scopes) }
|
let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: scopes) }
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Reference in a new issue