Merge pull request #1721 from ClearlyClaire/glitch-soc/merge-upstream

Merge upstream changes
This commit is contained in:
Claire 2022-03-23 15:56:24 +01:00 committed by GitHub
commit 6f032076ed
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
90 changed files with 769 additions and 636 deletions

View file

@ -1,4 +1,4 @@
version: "2" version: '2'
checks: checks:
argument-count: argument-count:
enabled: false enabled: false
@ -34,8 +34,8 @@ plugins:
sass-lint: sass-lint:
enabled: true enabled: true
exclude_patterns: exclude_patterns:
- spec/ - spec/
- vendor/asset/ - vendor/asset/
- app/javascript/mastodon/locales/**/*.json - app/javascript/mastodon/locales/**/*.json
- config/locales/**/*.yml - config/locales/**/*.yml

View file

@ -9,9 +9,9 @@ services:
# Update 'VARIANT' to pick a version of Ruby: 3, 3.1, 3.0, 2, 2.7, 2.6 # Update 'VARIANT' to pick a version of Ruby: 3, 3.1, 3.0, 2, 2.7, 2.6
# Append -bullseye or -buster to pin to an OS version. # Append -bullseye or -buster to pin to an OS version.
# Use -bullseye variants on local arm64/Apple Silicon. # Use -bullseye variants on local arm64/Apple Silicon.
VARIANT: "3.0-bullseye" VARIANT: '3.0-bullseye'
# Optional Node.js version to install # Optional Node.js version to install
NODE_VERSION: "14" NODE_VERSION: '14'
volumes: volumes:
- ..:/workspaces/mastodon:cached - ..:/workspaces/mastodon:cached
environment: environment:
@ -34,7 +34,6 @@ services:
- internal_network - internal_network
user: vscode user: vscode
db: db:
image: postgres:14-alpine image: postgres:14-alpine
restart: unless-stopped restart: unless-stopped

View file

@ -3,9 +3,9 @@ on:
workflow_dispatch: workflow_dispatch:
push: push:
branches: branches:
- "main" - 'main'
tags: tags:
- "*" - '*'
pull_request: pull_request:
paths: paths:
- .github/workflows/build-image.yml - .github/workflows/build-image.yml

View file

@ -2,9 +2,9 @@ name: Check i18n
on: on:
push: push:
branches: [ main ] branches: [main]
pull_request: pull_request:
branches: [ main ] branches: [main]
env: env:
RAILS_ENV: test RAILS_ENV: test

78
.prettierignore Normal file
View file

@ -0,0 +1,78 @@
# See https://help.github.com/articles/ignoring-files for more about ignoring files.
#
# If you find yourself ignoring temporary files generated by your text editor
# or operating system, you probably want to add a global ignore instead:
# git config --global core.excludesfile '~/.gitignore_global'
# Ignore bundler config and downloaded libraries.
/.bundle
/vendor/bundle
# Ignore the default SQLite database.
/db/*.sqlite3
/db/*.sqlite3-journal
# Ignore all logfiles and tempfiles.
.eslintcache
/log/*
!/log/.keep
/tmp
/coverage
/public/system
/public/assets
/public/packs
/public/packs-test
.env
.env.production
.env.development
/node_modules/
/build/
# Ignore Vagrant files
.vagrant/
# Ignore Capistrano customizations
/config/deploy/*
# Ignore IDE files
.vscode/
.idea/
# Ignore postgres + redis + elasticsearch volume optionally created by docker-compose
/postgres
/postgres14
/redis
/elasticsearch
# ignore Helm dependency charts
/chart/charts/*.tgz
# Ignore Apple files
.DS_Store
# Ignore vim files
*~
*.swp
# Ignore npm debug log
npm-debug.log
# Ignore yarn log files
yarn-error.log
yarn-debug.log
# Ignore vagrant log files
*-cloudimg-console.log
# Ignore Docker option files
docker-compose.override.yml
# Ignore Helm files
/chart
# Ignore emoji map file
/app/javascript/mastodon/features/emoji/emoji_map.json
# Ignore locale files
/app/javascript/mastodon/locales
/config/locales

3
.prettierrc.js Normal file
View file

@ -0,0 +1,3 @@
module.exports = {
singleQuote: true
}

View file

@ -6,7 +6,7 @@ All notable changes to this project will be documented in this file.
## Unreleased ## Unreleased
### Added ### Added
- **Add support for post editing** ([Gargron](https://github.com/mastodon/mastodon/pull/16697), [Gargron](https://github.com/mastodon/mastodon/pull/17727), [Gargron](https://github.com/mastodon/mastodon/pull/17728), [Gargron](https://github.com/mastodon/mastodon/pull/17320), [Gargron](https://github.com/mastodon/mastodon/pull/17404), [Gargron](https://github.com/mastodon/mastodon/pull/17390), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/17335), [Gargron](https://github.com/mastodon/mastodon/pull/17696), [Gargron](https://github.com/mastodon/mastodon/pull/17745), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/17740), [Gargron](https://github.com/mastodon/mastodon/pull/17697), [Gargron](https://github.com/mastodon/mastodon/pull/17648), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/17531), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/17499), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/17498), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/17380), [Gargron](https://github.com/mastodon/mastodon/pull/17373), [Gargron](https://github.com/mastodon/mastodon/pull/17334), [Gargron](https://github.com/mastodon/mastodon/pull/17333), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/17699), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/17748)) - **Add support for incoming edited posts** ([Gargron](https://github.com/mastodon/mastodon/pull/16697), [Gargron](https://github.com/mastodon/mastodon/pull/17727), [Gargron](https://github.com/mastodon/mastodon/pull/17728), [Gargron](https://github.com/mastodon/mastodon/pull/17320), [Gargron](https://github.com/mastodon/mastodon/pull/17404), [Gargron](https://github.com/mastodon/mastodon/pull/17390), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/17335), [Gargron](https://github.com/mastodon/mastodon/pull/17696), [Gargron](https://github.com/mastodon/mastodon/pull/17745), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/17740), [Gargron](https://github.com/mastodon/mastodon/pull/17697), [Gargron](https://github.com/mastodon/mastodon/pull/17648), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/17531), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/17499), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/17498), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/17380), [Gargron](https://github.com/mastodon/mastodon/pull/17373), [Gargron](https://github.com/mastodon/mastodon/pull/17334), [Gargron](https://github.com/mastodon/mastodon/pull/17333), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/17699), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/17748))
- Previous versions remain available for perusal and comparison - Previous versions remain available for perusal and comparison
- People who reblogged a post are notified when it's edited - People who reblogged a post are notified when it's edited
- New REST APIs: - New REST APIs:
@ -14,7 +14,7 @@ All notable changes to this project will be documented in this file.
- `GET /api/v1/statuses/:id/history` - `GET /api/v1/statuses/:id/history`
- `GET /api/v1/statuses/:id/source` - `GET /api/v1/statuses/:id/source`
- New streaming API event: - New streaming API event:
- `update` - `status.update`
- **Add appeals for moderator decisions** ([Gargron](https://github.com/mastodon/mastodon/pull/17364), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/17725), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/17566), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/17652), [Gargron](https://github.com/mastodon/mastodon/pull/17616), [Gargron](https://github.com/mastodon/mastodon/pull/17615), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/17554), [Gargron](https://github.com/mastodon/mastodon/pull/17523)) - **Add appeals for moderator decisions** ([Gargron](https://github.com/mastodon/mastodon/pull/17364), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/17725), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/17566), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/17652), [Gargron](https://github.com/mastodon/mastodon/pull/17616), [Gargron](https://github.com/mastodon/mastodon/pull/17615), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/17554), [Gargron](https://github.com/mastodon/mastodon/pull/17523))
- All default moderator decisions now notify the affected user by e-mail - All default moderator decisions now notify the affected user by e-mail
- They now link to an appeal page instead of suggesting replying to the e-mail - They now link to an appeal page instead of suggesting replying to the e-mail
@ -63,7 +63,7 @@ All notable changes to this project will be documented in this file.
- Add `types` param to `GET /api/v1/notifications` in REST API ([Gargron](https://github.com/mastodon/mastodon/pull/17767)) - Add `types` param to `GET /api/v1/notifications` in REST API ([Gargron](https://github.com/mastodon/mastodon/pull/17767))
- **Add notifications for moderators about new sign-ups** ([Gargron](https://github.com/mastodon/mastodon/pull/16953), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/17629)) - **Add notifications for moderators about new sign-ups** ([Gargron](https://github.com/mastodon/mastodon/pull/16953), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/17629))
- When a new user confirms e-mail, moderators receive a notification - When a new user confirms e-mail, moderators receive a notification
- New streaming API event: - New notification type:
- `admin.sign_up` - `admin.sign_up`
- Add authentication history ([Gargron](https://github.com/mastodon/mastodon/pull/16408), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/16428), [baby-gnu](https://github.com/mastodon/mastodon/pull/16654)) - Add authentication history ([Gargron](https://github.com/mastodon/mastodon/pull/16408), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/16428), [baby-gnu](https://github.com/mastodon/mastodon/pull/16654))
- Add ability to automatically delete old posts ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/16529), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/17691), [tribela](https://github.com/mastodon/mastodon/pull/16653)) - Add ability to automatically delete old posts ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/16529), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/17691), [tribela](https://github.com/mastodon/mastodon/pull/16653))

View file

@ -5,7 +5,7 @@ SHELL ["/bin/bash", "-c"]
RUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections RUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections
# Install Node v16 (LTS) # Install Node v16 (LTS)
ENV NODE_VER="16.13.2" ENV NODE_VER="16.14.2"
RUN ARCH= && \ RUN ARCH= && \
dpkgArch="$(dpkg --print-architecture)" && \ dpkgArch="$(dpkg --print-architecture)" && \
case "${dpkgArch##*-}" in \ case "${dpkgArch##*-}" in \

View file

@ -89,7 +89,7 @@ gem 'stoplight', '~> 2.2.1'
gem 'strong_migrations', '~> 0.7' gem 'strong_migrations', '~> 0.7'
gem 'tty-prompt', '~> 0.23', require: false gem 'tty-prompt', '~> 0.23', require: false
gem 'twitter-text', '~> 3.1.0' gem 'twitter-text', '~> 3.1.0'
gem 'tzinfo-data', '~> 1.2021' gem 'tzinfo-data', '~> 1.2022'
gem 'webpacker', '~> 5.4' gem 'webpacker', '~> 5.4'
gem 'webpush', '~> 0.3' gem 'webpush', '~> 0.3'
gem 'webauthn', '~> 3.0.0.alpha1' gem 'webauthn', '~> 3.0.0.alpha1'
@ -131,11 +131,11 @@ group :development do
gem 'better_errors', '~> 2.9' gem 'better_errors', '~> 2.9'
gem 'binding_of_caller', '~> 1.0' gem 'binding_of_caller', '~> 1.0'
gem 'bullet', '~> 7.0' gem 'bullet', '~> 7.0'
gem 'letter_opener', '~> 1.7' gem 'letter_opener', '~> 1.8'
gem 'letter_opener_web', '~> 2.0' gem 'letter_opener_web', '~> 2.0'
gem 'memory_profiler' gem 'memory_profiler'
gem 'rubocop', '~> 1.25', require: false gem 'rubocop', '~> 1.26', require: false
gem 'rubocop-rails', '~> 2.13', require: false gem 'rubocop-rails', '~> 2.14', require: false
gem 'brakeman', '~> 5.2', require: false gem 'brakeman', '~> 5.2', require: false
gem 'bundler-audit', '~> 0.9', require: false gem 'bundler-audit', '~> 0.9', require: false

View file

@ -351,8 +351,8 @@ GEM
terrapin (~> 0.6.0) terrapin (~> 0.6.0)
launchy (2.5.0) launchy (2.5.0)
addressable (~> 2.7) addressable (~> 2.7)
letter_opener (1.7.0) letter_opener (1.8.1)
launchy (~> 2.2) launchy (>= 2.2, < 3)
letter_opener_web (2.0.0) letter_opener_web (2.0.0)
actionmailer (>= 5.2) actionmailer (>= 5.2)
letter_opener (~> 1.7) letter_opener (~> 1.7)
@ -433,8 +433,8 @@ GEM
openssl-signature_algorithm (0.4.0) openssl-signature_algorithm (0.4.0)
orm_adapter (0.5.0) orm_adapter (0.5.0)
ox (2.14.10) ox (2.14.10)
parallel (1.21.0) parallel (1.22.0)
parser (3.1.0.0) parser (3.1.1.0)
ast (~> 2.4.1) ast (~> 2.4.1)
parslet (2.0.0) parslet (2.0.0)
pastel (0.8.0) pastel (0.8.0)
@ -527,7 +527,7 @@ GEM
redis (4.5.1) redis (4.5.1)
redis-namespace (1.8.2) redis-namespace (1.8.2)
redis (>= 3.0.4) redis (>= 3.0.4)
regexp_parser (2.2.0) regexp_parser (2.2.1)
request_store (1.5.0) request_store (1.5.0)
rack (>= 1.4) rack (>= 1.4)
responders (3.0.1) responders (3.0.1)
@ -562,18 +562,18 @@ GEM
rspec-support (3.11.0) rspec-support (3.11.0)
rspec_junit_formatter (0.5.1) rspec_junit_formatter (0.5.1)
rspec-core (>= 2, < 4, != 2.12.0) rspec-core (>= 2, < 4, != 2.12.0)
rubocop (1.25.1) rubocop (1.26.0)
parallel (~> 1.10) parallel (~> 1.10)
parser (>= 3.1.0.0) parser (>= 3.1.0.0)
rainbow (>= 2.2.2, < 4.0) rainbow (>= 2.2.2, < 4.0)
regexp_parser (>= 1.8, < 3.0) regexp_parser (>= 1.8, < 3.0)
rexml rexml
rubocop-ast (>= 1.15.1, < 2.0) rubocop-ast (>= 1.16.0, < 2.0)
ruby-progressbar (~> 1.7) ruby-progressbar (~> 1.7)
unicode-display_width (>= 1.4.0, < 3.0) unicode-display_width (>= 1.4.0, < 3.0)
rubocop-ast (1.15.1) rubocop-ast (1.16.0)
parser (>= 3.0.1.1) parser (>= 3.1.1.0)
rubocop-rails (2.13.2) rubocop-rails (2.14.2)
activesupport (>= 4.2.0) activesupport (>= 4.2.0)
rack (>= 1.1) rack (>= 1.1)
rubocop (>= 1.7.0, < 2.0) rubocop (>= 1.7.0, < 2.0)
@ -669,7 +669,7 @@ GEM
unf (~> 0.1.0) unf (~> 0.1.0)
tzinfo (2.0.4) tzinfo (2.0.4)
concurrent-ruby (~> 1.0) concurrent-ruby (~> 1.0)
tzinfo-data (1.2021.5) tzinfo-data (1.2022.1)
tzinfo (>= 1.0.0) tzinfo (>= 1.0.0)
unf (0.1.4) unf (0.1.4)
unf_ext unf_ext
@ -774,7 +774,7 @@ DEPENDENCIES
json-ld-preloaded (~> 3.2) json-ld-preloaded (~> 3.2)
kaminari (~> 1.2) kaminari (~> 1.2)
kt-paperclip (~> 7.1) kt-paperclip (~> 7.1)
letter_opener (~> 1.7) letter_opener (~> 1.8)
letter_opener_web (~> 2.0) letter_opener_web (~> 2.0)
link_header (~> 0.0) link_header (~> 0.0)
lograge (~> 0.11) lograge (~> 0.11)
@ -819,8 +819,8 @@ DEPENDENCIES
rspec-rails (~> 5.1) rspec-rails (~> 5.1)
rspec-sidekiq (~> 3.1) rspec-sidekiq (~> 3.1)
rspec_junit_formatter (~> 0.5) rspec_junit_formatter (~> 0.5)
rubocop (~> 1.25) rubocop (~> 1.26)
rubocop-rails (~> 2.13) rubocop-rails (~> 2.14)
ruby-progressbar (~> 1.11) ruby-progressbar (~> 1.11)
sanitize (~> 6.0) sanitize (~> 6.0)
scenic (~> 1.6) scenic (~> 1.6)
@ -839,7 +839,7 @@ DEPENDENCIES
thor (~> 1.2) thor (~> 1.2)
tty-prompt (~> 0.23) tty-prompt (~> 0.23)
twitter-text (~> 3.1.0) twitter-text (~> 3.1.0)
tzinfo-data (~> 1.2021) tzinfo-data (~> 1.2022)
webauthn (~> 3.0.0.alpha1) webauthn (~> 3.0.0.alpha1)
webmock (~> 3.14) webmock (~> 3.14)
webpacker (~> 5.4) webpacker (~> 5.4)

View file

@ -95,8 +95,5 @@
"scripts": { "scripts": {
"postdeploy": "bundle exec rails db:migrate && bundle exec rails db:seed" "postdeploy": "bundle exec rails db:migrate && bundle exec rails db:seed"
}, },
"addons": [ "addons": ["heroku-postgresql", "heroku-redis"]
"heroku-postgresql",
"heroku-redis"
]
} }

View file

@ -2,6 +2,7 @@
class ActivityPub::BaseController < Api::BaseController class ActivityPub::BaseController < Api::BaseController
skip_before_action :require_authenticated_user! skip_before_action :require_authenticated_user!
skip_around_action :set_locale
private private

View file

@ -15,8 +15,6 @@ class Api::BaseController < ApplicationController
protect_from_forgery with: :null_session protect_from_forgery with: :null_session
skip_around_action :set_locale
rescue_from ActiveRecord::RecordInvalid, Mastodon::ValidationError do |e| rescue_from ActiveRecord::RecordInvalid, Mastodon::ValidationError do |e|
render json: { error: e.to_s }, status: 422 render json: { error: e.to_s }, status: 422
end end

View file

@ -5,7 +5,6 @@ import Motion from 'flavours/glitch/util/optional_motion';
import spring from 'react-motion/lib/spring'; import spring from 'react-motion/lib/spring';
import ImmutablePureComponent from 'react-immutable-pure-component'; import ImmutablePureComponent from 'react-immutable-pure-component';
import { FormattedMessage } from 'react-intl'; import { FormattedMessage } from 'react-intl';
import classNames from 'classnames';
import Icon from 'flavours/glitch/components/icon'; import Icon from 'flavours/glitch/components/icon';
import { isUserTouching } from 'flavours/glitch/util/is_mobile'; import { isUserTouching } from 'flavours/glitch/util/is_mobile';
@ -44,10 +43,16 @@ export default class Upload extends ImmutablePureComponent {
<Motion defaultStyle={{ scale: 0.8 }} style={{ scale: spring(1, { stiffness: 180, damping: 12, }) }}> <Motion defaultStyle={{ scale: 0.8 }} style={{ scale: spring(1, { stiffness: 180, damping: 12, }) }}>
{({ scale }) => ( {({ scale }) => (
<div style={{ transform: `scale(${scale})`, backgroundImage: `url(${media.get('preview_url')})`, backgroundPosition: `${x}% ${y}%` }}> <div style={{ transform: `scale(${scale})`, backgroundImage: `url(${media.get('preview_url')})`, backgroundPosition: `${x}% ${y}%` }}>
<div className={classNames('composer--upload_form--actions', { active: true })}> <div className='composer--upload_form--actions'>
<button className='icon-button' onClick={this.handleUndoClick}><Icon id='times' /> <FormattedMessage id='upload_form.undo' defaultMessage='Delete' /></button> <button className='icon-button' onClick={this.handleUndoClick}><Icon id='times' /> <FormattedMessage id='upload_form.undo' defaultMessage='Delete' /></button>
{!isEditingStatus && (<button className='icon-button' onClick={this.handleFocalPointClick}><Icon id='pencil' /> <FormattedMessage id='upload_form.edit' defaultMessage='Edit' /></button>)} {!isEditingStatus && (<button className='icon-button' onClick={this.handleFocalPointClick}><Icon id='pencil' /> <FormattedMessage id='upload_form.edit' defaultMessage='Edit' /></button>)}
</div> </div>
{(media.get('description') || '').length === 0 && (
<div className='composer--upload_form--item__warning'>
<button className='icon-button' onClick={this.handleFocalPointClick}><Icon id='info-circle' /> <FormattedMessage id='upload_form.description_missing' defaultMessage='No description added' /></button>
</div>
)}
</div> </div>
)} )}
</Motion> </Motion>

View file

@ -1322,7 +1322,7 @@ a.sparkline {
width: 50px; width: 50px;
height: 21px; height: 21px;
position: absolute; position: absolute;
bottom: 8px; bottom: 0;
right: 15px; right: 15px;
background: linear-gradient(to left, $ui-base-color, transparent); background: linear-gradient(to left, $ui-base-color, transparent);
pointer-events: none; pointer-events: none;

View file

@ -425,54 +425,12 @@
background-repeat: no-repeat; background-repeat: no-repeat;
overflow: hidden; overflow: hidden;
textarea {
display: block;
position: absolute;
box-sizing: border-box;
bottom: 0;
left: 0;
margin: 0;
border: 0;
padding: 10px;
width: 100%;
color: $secondary-text-color;
background: linear-gradient(0deg, rgba($base-shadow-color, 0.8) 0, rgba($base-shadow-color, 0.35) 80%, transparent);
font-size: 14px;
font-family: inherit;
font-weight: 500;
opacity: 0;
z-index: 2;
transition: opacity .1s ease;
&:focus { color: $white }
&::placeholder {
opacity: 0.54;
color: $secondary-text-color;
}
}
& > .close { mix-blend-mode: difference } & > .close { mix-blend-mode: difference }
} }
&.active {
& > div {
textarea { opacity: 1 }
}
}
}
.composer--upload_form--actions {
background: linear-gradient(180deg, rgba($base-shadow-color, 0.8) 0, rgba($base-shadow-color, 0.35) 80%, transparent);
display: flex;
align-items: flex-start;
justify-content: space-between;
opacity: 0;
transition: opacity .1s ease;
.icon-button { .icon-button {
flex: 0 1 auto; flex: 0 1 auto;
color: $ui-secondary-color; color: $secondary-text-color;
font-size: 14px; font-size: 14px;
font-weight: 500; font-weight: 500;
padding: 10px; padding: 10px;
@ -481,15 +439,28 @@
&:hover, &:hover,
&:focus, &:focus,
&:active { &:active {
color: lighten($ui-secondary-color, 4%); color: lighten($secondary-text-color, 7%);
} }
} }
&.active { &__warning {
opacity: 1; position: absolute;
z-index: 2;
bottom: 0;
left: 0;
right: 0;
box-sizing: border-box;
background: linear-gradient(0deg, rgba($base-shadow-color, 0.8) 0, rgba($base-shadow-color, 0.35) 80%, transparent);
} }
} }
.composer--upload_form--actions {
background: linear-gradient(180deg, rgba($base-shadow-color, 0.8) 0, rgba($base-shadow-color, 0.35) 80%, transparent);
display: flex;
align-items: flex-start;
justify-content: space-between;
}
.composer--upload_form--progress { .composer--upload_form--progress {
display: flex; display: flex;
padding: 10px; padding: 10px;

View file

@ -609,6 +609,15 @@
color: $inverted-text-color; color: $inverted-text-color;
} }
.status__content__spoiler-link {
color: $primary-text-color;
background: $ui-primary-color;
&:hover {
background: lighten($ui-primary-color, 8%);
}
}
.dialog-option .poll__input { .dialog-option .poll__input {
border-color: $inverted-text-color; border-color: $inverted-text-color;
color: $ui-secondary-color; color: $ui-secondary-color;

View file

@ -198,7 +198,8 @@
.status__content__spoiler-link { .status__content__spoiler-link {
background: lighten($ui-base-color, 30%); background: lighten($ui-base-color, 30%);
&:hover { &:hover,
&:focus {
background: lighten($ui-base-color, 33%); background: lighten($ui-base-color, 33%);
text-decoration: none; text-decoration: none;
} }
@ -222,13 +223,13 @@
background: lighten($ui-base-color, 30%); background: lighten($ui-base-color, 30%);
border: 0; border: 0;
color: $inverted-text-color; color: $inverted-text-color;
font-weight: 500; font-weight: 700;
font-size: 11px; font-size: 11px;
padding: 0 5px; padding: 0 5px;
text-transform: uppercase; text-transform: uppercase;
line-height: inherit; line-height: inherit;
cursor: pointer; cursor: pointer;
vertical-align: bottom; vertical-align: top;
&:hover { &:hover {
background: lighten($ui-base-color, 33%); background: lighten($ui-base-color, 33%);
@ -760,7 +761,8 @@ a.status__display-name,
background: $ui-base-lighter-color; background: $ui-base-lighter-color;
color: $inverted-text-color; color: $inverted-text-color;
&:hover { &:hover,
&:focus {
background: lighten($ui-base-color, 29%); background: lighten($ui-base-color, 29%);
text-decoration: none; text-decoration: none;
} }

View file

@ -165,14 +165,6 @@
} }
} }
.composer--upload_form--item > div input {
color: lighten($white, 7%);
&::placeholder {
color: lighten($white, 10%);
}
}
.dropdown-menu__separator, .dropdown-menu__separator,
.dropdown-menu__item.edited-timestamp__history__item, .dropdown-menu__item.edited-timestamp__history__item,
.dropdown-menu__container__header, .dropdown-menu__container__header,

View file

@ -5,7 +5,6 @@ import Motion from '../../ui/util/optional_motion';
import spring from 'react-motion/lib/spring'; import spring from 'react-motion/lib/spring';
import ImmutablePureComponent from 'react-immutable-pure-component'; import ImmutablePureComponent from 'react-immutable-pure-component';
import { FormattedMessage } from 'react-intl'; import { FormattedMessage } from 'react-intl';
import classNames from 'classnames';
import Icon from 'mastodon/components/icon'; import Icon from 'mastodon/components/icon';
export default class Upload extends ImmutablePureComponent { export default class Upload extends ImmutablePureComponent {
@ -43,10 +42,16 @@ export default class Upload extends ImmutablePureComponent {
<Motion defaultStyle={{ scale: 0.8 }} style={{ scale: spring(1, { stiffness: 180, damping: 12 }) }}> <Motion defaultStyle={{ scale: 0.8 }} style={{ scale: spring(1, { stiffness: 180, damping: 12 }) }}>
{({ scale }) => ( {({ scale }) => (
<div className='compose-form__upload-thumbnail' style={{ transform: `scale(${scale})`, backgroundImage: `url(${media.get('preview_url')})`, backgroundPosition: `${x}% ${y}%` }}> <div className='compose-form__upload-thumbnail' style={{ transform: `scale(${scale})`, backgroundImage: `url(${media.get('preview_url')})`, backgroundPosition: `${x}% ${y}%` }}>
<div className={classNames('compose-form__upload__actions', { active: true })}> <div className='compose-form__upload__actions'>
<button className='icon-button' onClick={this.handleUndoClick}><Icon id='times' /> <FormattedMessage id='upload_form.undo' defaultMessage='Delete' /></button> <button className='icon-button' onClick={this.handleUndoClick}><Icon id='times' /> <FormattedMessage id='upload_form.undo' defaultMessage='Delete' /></button>
{!isEditingStatus && (<button className='icon-button' onClick={this.handleFocalPointClick}><Icon id='pencil' /> <FormattedMessage id='upload_form.edit' defaultMessage='Edit' /></button>)} {!isEditingStatus && (<button className='icon-button' onClick={this.handleFocalPointClick}><Icon id='pencil' /> <FormattedMessage id='upload_form.edit' defaultMessage='Edit' /></button>)}
</div> </div>
{(media.get('description') || '').length === 0 && (
<div className='compose-form__upload__warning'>
<button className='icon-button' onClick={this.handleFocalPointClick}><Icon id='info-circle' /> <FormattedMessage id='upload_form.description_missing' defaultMessage='No description added' /></button>
</div>
)}
</div> </div>
)} )}
</Motion> </Motion>

View file

@ -24,15 +24,15 @@ const appendLoadMore = (id, list, onLoadMore) => {
} }
}; };
const renderAccounts = (results, onLoadMore) => appendLoadMore('accounts', results.get('accounts').map(item => ( const renderAccounts = (results, onLoadMore) => appendLoadMore('accounts', results.get('accounts', ImmutableList()).map(item => (
<Account key={`account-${item}`} id={item} /> <Account key={`account-${item}`} id={item} />
)), onLoadMore); )), onLoadMore);
const renderHashtags = (results, onLoadMore) => appendLoadMore('hashtags', results.get('hashtags').map(item => ( const renderHashtags = (results, onLoadMore) => appendLoadMore('hashtags', results.get('hashtags', ImmutableList()).map(item => (
<Hashtag key={`tag-${item.get('name')}`} hashtag={item} /> <Hashtag key={`tag-${item.get('name')}`} hashtag={item} />
)), onLoadMore); )), onLoadMore);
const renderStatuses = (results, onLoadMore) => appendLoadMore('statuses', results.get('statuses').map(item => ( const renderStatuses = (results, onLoadMore) => appendLoadMore('statuses', results.get('statuses', ImmutableList()).map(item => (
<Status key={`status-${item}`} id={item} /> <Status key={`status-${item}`} id={item} />
)), onLoadMore); )), onLoadMore);

View file

@ -328,7 +328,7 @@
"notifications.column_settings.filter_bar.category": "Barra ràpida de filtres", "notifications.column_settings.filter_bar.category": "Barra ràpida de filtres",
"notifications.column_settings.filter_bar.show_bar": "Mostra la barra de filtres", "notifications.column_settings.filter_bar.show_bar": "Mostra la barra de filtres",
"notifications.column_settings.follow": "Nous seguidors:", "notifications.column_settings.follow": "Nous seguidors:",
"notifications.column_settings.follow_request": "Nova sol·licitud de seguiment:", "notifications.column_settings.follow_request": "Noves sol·licituts de seguiment:",
"notifications.column_settings.mention": "Mencions:", "notifications.column_settings.mention": "Mencions:",
"notifications.column_settings.poll": "Resultats de lenquesta:", "notifications.column_settings.poll": "Resultats de lenquesta:",
"notifications.column_settings.push": "Notificacions push", "notifications.column_settings.push": "Notificacions push",
@ -353,7 +353,7 @@
"notifications.permission_denied_alert": "No es poden activar les notificacions del escriptori perquè el permís del navegador ha estat denegat abans", "notifications.permission_denied_alert": "No es poden activar les notificacions del escriptori perquè el permís del navegador ha estat denegat abans",
"notifications.permission_required": "Les notificacions d'escriptori no estan disponibles perquè el permís requerit no ha estat concedit.", "notifications.permission_required": "Les notificacions d'escriptori no estan disponibles perquè el permís requerit no ha estat concedit.",
"notifications_permission_banner.enable": "Activar les notificacions descriptori", "notifications_permission_banner.enable": "Activar les notificacions descriptori",
"notifications_permission_banner.how_to_control": "Per a rebre notificacions quan Mastodon no està obert cal activar les notificacions descriptori. Pots controlar amb precisió quins tipus dinteraccions generen notificacions descriptori després dactivar el botó {icon} de dalt.", "notifications_permission_banner.how_to_control": "Per a rebre notificacions quan Mastodon no és obert cal activar les notificacions descriptori. Pots controlar amb precisió quins tipus dinteraccions generen notificacions descriptori després dactivar el botó {icon} de dalt.",
"notifications_permission_banner.title": "Mai et perdis res", "notifications_permission_banner.title": "Mai et perdis res",
"picture_in_picture.restore": "Retornal", "picture_in_picture.restore": "Retornal",
"poll.closed": "Finalitzada", "poll.closed": "Finalitzada",
@ -376,7 +376,7 @@
"privacy.unlisted.short": "No llistat", "privacy.unlisted.short": "No llistat",
"refresh": "Actualitza", "refresh": "Actualitza",
"regeneration_indicator.label": "Carregant…", "regeneration_indicator.label": "Carregant…",
"regeneration_indicator.sublabel": "S'està preparant la línia de temps Inici!", "regeneration_indicator.sublabel": "S'està preparant la teva línia de temps Inici!",
"relative_time.days": "fa {number} dies", "relative_time.days": "fa {number} dies",
"relative_time.full.days": "fa {number, plural, one {# dia} other {# dies}}", "relative_time.full.days": "fa {number, plural, one {# dia} other {# dies}}",
"relative_time.full.hours": "fa {number, plural, one {# hora} other {# hores}}", "relative_time.full.hours": "fa {number, plural, one {# hora} other {# hores}}",
@ -394,7 +394,7 @@
"report.categories.other": "Altres", "report.categories.other": "Altres",
"report.categories.spam": "Contingut brossa", "report.categories.spam": "Contingut brossa",
"report.categories.violation": "El contingut viola una o més regles del servidor", "report.categories.violation": "El contingut viola una o més regles del servidor",
"report.category.subtitle": "Tria la millor combinació", "report.category.subtitle": "Tria la millor coincidència",
"report.category.title": "Digue'ns què està passant amb aquest {type}", "report.category.title": "Digue'ns què està passant amb aquest {type}",
"report.category.title_account": "perfil", "report.category.title_account": "perfil",
"report.category.title_status": "publicació", "report.category.title_status": "publicació",
@ -410,7 +410,7 @@
"report.reasons.dislike_description": "Això no és quelcom que vulguis veure", "report.reasons.dislike_description": "Això no és quelcom que vulguis veure",
"report.reasons.other": "Això és una altre cosa", "report.reasons.other": "Això és una altre cosa",
"report.reasons.other_description": "El problema no encaixa en altres categories", "report.reasons.other_description": "El problema no encaixa en altres categories",
"report.reasons.spam": "Això és brossa", "report.reasons.spam": "Això és contingut brossa",
"report.reasons.spam_description": "Enllaços maliciosos, compromís falç o respostes repetitives", "report.reasons.spam_description": "Enllaços maliciosos, compromís falç o respostes repetitives",
"report.reasons.violation": "Viola les regles del servidor", "report.reasons.violation": "Viola les regles del servidor",
"report.reasons.violation_description": "Ets conscient que trenca regles especifiques", "report.reasons.violation_description": "Ets conscient que trenca regles especifiques",
@ -447,7 +447,7 @@
"status.cancel_reblog_private": "Desfer l'impuls", "status.cancel_reblog_private": "Desfer l'impuls",
"status.cannot_reblog": "Aquesta publicació no pot ser impulsada", "status.cannot_reblog": "Aquesta publicació no pot ser impulsada",
"status.copy": "Copia l'enllaç a l'estat", "status.copy": "Copia l'enllaç a l'estat",
"status.delete": "Esborrar", "status.delete": "Esborra",
"status.detailed_status": "Visualització detallada de la conversa", "status.detailed_status": "Visualització detallada de la conversa",
"status.direct": "Missatge directe @{name}", "status.direct": "Missatge directe @{name}",
"status.edit": "Edita", "status.edit": "Edita",
@ -465,17 +465,17 @@
"status.mute": "Silenciar @{name}", "status.mute": "Silenciar @{name}",
"status.mute_conversation": "Silenciar conversació", "status.mute_conversation": "Silenciar conversació",
"status.open": "Ampliar aquest estat", "status.open": "Ampliar aquest estat",
"status.pin": "Fixat en el perfil", "status.pin": "Fixa en el perfil",
"status.pinned": "Publicació fixada", "status.pinned": "Publicació fixada",
"status.read_more": "Llegir més", "status.read_more": "Llegir més",
"status.reblog": "Impuls", "status.reblog": "Impuls",
"status.reblog_private": "Impulsar a l'audiència original", "status.reblog_private": "Impulsar amb la visibilitat original",
"status.reblogged_by": "{name} ha impulsat", "status.reblogged_by": "{name} ha impulsat",
"status.reblogs.empty": "Encara ningú no ha impulsat aquesta publicació. Quan algú ho faci, apareixeran aquí.", "status.reblogs.empty": "Encara ningú no ha impulsat aquesta publicació. Quan algú ho faci, apareixeran aquí.",
"status.redraft": "Esborrar i reescriure", "status.redraft": "Esborrar i reescriure",
"status.remove_bookmark": "Suprimeix el marcador", "status.remove_bookmark": "Suprimeix el marcador",
"status.reply": "Respondre", "status.reply": "Respondre",
"status.replyAll": "Respondre al tema", "status.replyAll": "Respondre al fil",
"status.report": "Informar sobre @{name}", "status.report": "Informar sobre @{name}",
"status.sensitive_warning": "Contingut sensible", "status.sensitive_warning": "Contingut sensible",
"status.share": "Compartir", "status.share": "Compartir",
@ -510,11 +510,11 @@
"units.short.million": "{count}M", "units.short.million": "{count}M",
"units.short.thousand": "{count}K", "units.short.thousand": "{count}K",
"upload_area.title": "Arrossega i deixa anar per a carregar", "upload_area.title": "Arrossega i deixa anar per a carregar",
"upload_button.label": "Afegir multimèdia (JPEG, PNG, GIF, WebM, MP4, MOV)", "upload_button.label": "Afegir mèdia, un vídeo o un fitxer d'audio",
"upload_error.limit": "S'ha superat el límit de càrrega d'arxius.", "upload_error.limit": "S'ha superat el límit de càrrega d'arxius.",
"upload_error.poll": "No es permet l'enviament de fitxers en les enquestes.", "upload_error.poll": "No es permet l'enviament de fitxers en les enquestes.",
"upload_form.audio_description": "Descriviu per a les persones amb pèrdua auditiva", "upload_form.audio_description": "Descriviu per a les persones amb pèrdua auditiva",
"upload_form.description": "Descriure els problemes visuals", "upload_form.description": "Descriure per els que tenen problemes visuals",
"upload_form.edit": "Edita", "upload_form.edit": "Edita",
"upload_form.thumbnail": "Canvia la miniatura", "upload_form.thumbnail": "Canvia la miniatura",
"upload_form.undo": "Esborra", "upload_form.undo": "Esborra",
@ -523,7 +523,7 @@
"upload_modal.apply": "Aplica", "upload_modal.apply": "Aplica",
"upload_modal.applying": "Aplicant…", "upload_modal.applying": "Aplicant…",
"upload_modal.choose_image": "Tria imatge", "upload_modal.choose_image": "Tria imatge",
"upload_modal.description_placeholder": "Jove xef, porti whisky amb quinze glaçons dhidrogen, coi!", "upload_modal.description_placeholder": "Una ràpida guineu marró salta sobre el gos mandrós",
"upload_modal.detect_text": "Detecta el text de l'imatge", "upload_modal.detect_text": "Detecta el text de l'imatge",
"upload_modal.edit_media": "Editar multimèdia", "upload_modal.edit_media": "Editar multimèdia",
"upload_modal.hint": "Fes clic o arrossega el cercle en la previsualització per escollir el punt focal que sempre serà visible de totes les miniatures.", "upload_modal.hint": "Fes clic o arrossega el cercle en la previsualització per escollir el punt focal que sempre serà visible de totes les miniatures.",

View file

@ -18,7 +18,7 @@
"account.followers": "پی‌گیرندگان", "account.followers": "پی‌گیرندگان",
"account.followers.empty": "هنوز کسی این کاربر را پی‌گیری نمی‌کند.", "account.followers.empty": "هنوز کسی این کاربر را پی‌گیری نمی‌کند.",
"account.followers_counter": "{count, plural, one {{counter} پی‌گیرنده} other {{counter} پی‌گیرنده}}", "account.followers_counter": "{count, plural, one {{counter} پی‌گیرنده} other {{counter} پی‌گیرنده}}",
"account.following": "Following", "account.following": "پی می‌گیرید",
"account.following_counter": "{count, plural, one {{counter} پی‌گرفته} other {{counter} پی‌گرفته}}", "account.following_counter": "{count, plural, one {{counter} پی‌گرفته} other {{counter} پی‌گرفته}}",
"account.follows.empty": "این کاربر هنوز پی‌گیر کسی نیست.", "account.follows.empty": "این کاربر هنوز پی‌گیر کسی نیست.",
"account.follows_you": "پی می‌گیردتان", "account.follows_you": "پی می‌گیردتان",
@ -41,12 +41,12 @@
"account.statuses_counter": "{count, plural, one {{counter} فرسته} other {{counter} فرسته}}", "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": "Unblock", "account.unblock_short": "رفع مسدودیت",
"account.unendorse": "معرّفی نکردن در نمایه", "account.unendorse": "معرّفی نکردن در نمایه",
"account.unfollow": "ناپی‌گیری", "account.unfollow": "ناپی‌گیری",
"account.unmute": "ناخموشی @{name}", "account.unmute": "ناخموشی @{name}",
"account.unmute_notifications": "ناخموشی آگاهی‌ها از @{name}", "account.unmute_notifications": "ناخموشی آگاهی‌ها از @{name}",
"account.unmute_short": "Unmute", "account.unmute_short": "ناخموشی",
"account_note.placeholder": "برای افزودن یادداشت کلیک کنید", "account_note.placeholder": "برای افزودن یادداشت کلیک کنید",
"admin.dashboard.daily_retention": "User retention rate by day after sign-up", "admin.dashboard.daily_retention": "User retention rate by day after sign-up",
"admin.dashboard.monthly_retention": "User retention rate by month after sign-up", "admin.dashboard.monthly_retention": "User retention rate by month after sign-up",
@ -106,7 +106,7 @@
"compose_form.poll.switch_to_single": "تبدیل به نظرسنجی تک‌گزینه‌ای", "compose_form.poll.switch_to_single": "تبدیل به نظرسنجی تک‌گزینه‌ای",
"compose_form.publish": "بوق", "compose_form.publish": "بوق",
"compose_form.publish_loud": "{publish}!", "compose_form.publish_loud": "{publish}!",
"compose_form.save_changes": "Save changes", "compose_form.save_changes": "ذخیرهٔ تغییرات",
"compose_form.sensitive.hide": "{count, plural, one {علامت‌گذاری رسانه به عنوان حساس} other {علامت‌گذاری رسانه‌ها به عنوان حساس}}", "compose_form.sensitive.hide": "{count, plural, one {علامت‌گذاری رسانه به عنوان حساس} other {علامت‌گذاری رسانه‌ها به عنوان حساس}}",
"compose_form.sensitive.marked": "{count, plural, one {رسانه به عنوان حساس علامت‌گذاری شد} other {رسانه‌ها به عنوان حساس علامت‌گذاری شدند}}", "compose_form.sensitive.marked": "{count, plural, one {رسانه به عنوان حساس علامت‌گذاری شد} other {رسانه‌ها به عنوان حساس علامت‌گذاری شدند}}",
"compose_form.sensitive.unmarked": "{count, plural, one {رسانه به عنوان حساس علامت‌گذاری نشد} other {رسانه‌ها به عنوان حساس علامت‌گذاری نشدند}}", "compose_form.sensitive.unmarked": "{count, plural, one {رسانه به عنوان حساس علامت‌گذاری نشد} other {رسانه‌ها به عنوان حساس علامت‌گذاری نشدند}}",
@ -187,12 +187,12 @@
"error.unexpected_crash.next_steps_addons": "لطفاً از کارشان انداخته و صفحه را نوسازی کنید. اگر کمکی نکرد، شاید همچنان بتوانید با مرورگری دیگر یا با کاره‌ای بومی از ماستودون استفاده کنید.", "error.unexpected_crash.next_steps_addons": "لطفاً از کارشان انداخته و صفحه را نوسازی کنید. اگر کمکی نکرد، شاید همچنان بتوانید با مرورگری دیگر یا با کاره‌ای بومی از ماستودون استفاده کنید.",
"errors.unexpected_crash.copy_stacktrace": "رونوشت از جزئیات اشکال", "errors.unexpected_crash.copy_stacktrace": "رونوشت از جزئیات اشکال",
"errors.unexpected_crash.report_issue": "گزارش مشکل", "errors.unexpected_crash.report_issue": "گزارش مشکل",
"explore.search_results": "Search results", "explore.search_results": "نتایج جست‌وجو",
"explore.suggested_follows": "For you", "explore.suggested_follows": "برای شما",
"explore.title": "Explore", "explore.title": "کاوش",
"explore.trending_links": "News", "explore.trending_links": "اخبار",
"explore.trending_statuses": "Posts", "explore.trending_statuses": "فرسته‌ها",
"explore.trending_tags": "Hashtags", "explore.trending_tags": "هشتگ‌ها",
"follow_recommendations.done": "انجام شد", "follow_recommendations.done": "انجام شد",
"follow_recommendations.heading": "افرادی را که می‌خواهید فرسته‌هایشان را ببینید پی‌گیری کنید! این‌ها تعدادی پیشنهاد هستند.", "follow_recommendations.heading": "افرادی را که می‌خواهید فرسته‌هایشان را ببینید پی‌گیری کنید! این‌ها تعدادی پیشنهاد هستند.",
"follow_recommendations.lead": "فرسته‌های افرادی که دنبال می‌کنید به ترتیب زمانی در خوراک خانه‌تان نشان داده خواهد شد. از اشتباه کردن نترسید. می‌توانید به همین سادگی در هر زمانی از دنبال کردن افراد دست بکشید!", "follow_recommendations.lead": "فرسته‌های افرادی که دنبال می‌کنید به ترتیب زمانی در خوراک خانه‌تان نشان داده خواهد شد. از اشتباه کردن نترسید. می‌توانید به همین سادگی در هر زمانی از دنبال کردن افراد دست بکشید!",
@ -294,7 +294,7 @@
"navigation_bar.discover": "گشت و گذار", "navigation_bar.discover": "گشت و گذار",
"navigation_bar.domain_blocks": "دامنه‌های مسدود شده", "navigation_bar.domain_blocks": "دامنه‌های مسدود شده",
"navigation_bar.edit_profile": "ویرایش نمایه", "navigation_bar.edit_profile": "ویرایش نمایه",
"navigation_bar.explore": "Explore", "navigation_bar.explore": "کاوش",
"navigation_bar.favourites": "پسندیده‌ها", "navigation_bar.favourites": "پسندیده‌ها",
"navigation_bar.filters": "واژه‌های خموش", "navigation_bar.filters": "واژه‌های خموش",
"navigation_bar.follow_requests": "درخواست‌های پی‌گیری", "navigation_bar.follow_requests": "درخواست‌های پی‌گیری",
@ -309,7 +309,7 @@
"navigation_bar.preferences": "ترجیحات", "navigation_bar.preferences": "ترجیحات",
"navigation_bar.public_timeline": "خط زمانی همگانی", "navigation_bar.public_timeline": "خط زمانی همگانی",
"navigation_bar.security": "امنیت", "navigation_bar.security": "امنیت",
"notification.admin.sign_up": "{name} signed up", "notification.admin.sign_up": "{name} ثبت نام کرد",
"notification.favourite": "{name} فرسته‌تان را پسندید", "notification.favourite": "{name} فرسته‌تان را پسندید",
"notification.follow": "{name} پی‌گیرتان شد", "notification.follow": "{name} پی‌گیرتان شد",
"notification.follow_request": "{name} می‌خواهد پی‌گیر شما باشد", "notification.follow_request": "{name} می‌خواهد پی‌گیر شما باشد",
@ -318,10 +318,10 @@
"notification.poll": "نظرسنجی‌ای که در آن رأی دادید به پایان رسیده است", "notification.poll": "نظرسنجی‌ای که در آن رأی دادید به پایان رسیده است",
"notification.reblog": "{name} فرسته‌تان را تقویت کرد", "notification.reblog": "{name} فرسته‌تان را تقویت کرد",
"notification.status": "{name} چیزی فرستاد", "notification.status": "{name} چیزی فرستاد",
"notification.update": "{name} edited a post", "notification.update": "{name} فرسته‌ای را ویرایش کرد",
"notifications.clear": "پاک‌سازی آگاهی‌ها", "notifications.clear": "پاک‌سازی آگاهی‌ها",
"notifications.clear_confirmation": "مطمئنید می‌خواهید همهٔ آگاهی‌هایتان را برای همیشه پاک کنید؟", "notifications.clear_confirmation": "مطمئنید می‌خواهید همهٔ آگاهی‌هایتان را برای همیشه پاک کنید؟",
"notifications.column_settings.admin.sign_up": "New sign-ups:", "notifications.column_settings.admin.sign_up": "ثبت نام‌های جدید:",
"notifications.column_settings.alert": "آگاهی‌های میزکار", "notifications.column_settings.alert": "آگاهی‌های میزکار",
"notifications.column_settings.favourite": "پسندیده‌ها:", "notifications.column_settings.favourite": "پسندیده‌ها:",
"notifications.column_settings.filter_bar.advanced": "نمایش همۀ دسته‌ها", "notifications.column_settings.filter_bar.advanced": "نمایش همۀ دسته‌ها",
@ -338,7 +338,7 @@
"notifications.column_settings.status": "فرسته‌های جدید:", "notifications.column_settings.status": "فرسته‌های جدید:",
"notifications.column_settings.unread_notifications.category": "آگاهی‌های خوانده نشده", "notifications.column_settings.unread_notifications.category": "آگاهی‌های خوانده نشده",
"notifications.column_settings.unread_notifications.highlight": "پررنگ کردن آگاهی‌های خوانده نشده", "notifications.column_settings.unread_notifications.highlight": "پررنگ کردن آگاهی‌های خوانده نشده",
"notifications.column_settings.update": "Edits:", "notifications.column_settings.update": "ویرایش‌ها:",
"notifications.filter.all": "همه", "notifications.filter.all": "همه",
"notifications.filter.boosts": "تقویت‌ها", "notifications.filter.boosts": "تقویت‌ها",
"notifications.filter.favourites": "پسندها", "notifications.filter.favourites": "پسندها",
@ -378,20 +378,20 @@
"regeneration_indicator.label": "در حال بار شدن…", "regeneration_indicator.label": "در حال بار شدن…",
"regeneration_indicator.sublabel": "خوراک خانگیان دارد آماده می‌شود!", "regeneration_indicator.sublabel": "خوراک خانگیان دارد آماده می‌شود!",
"relative_time.days": "{number} روز", "relative_time.days": "{number} روز",
"relative_time.full.days": "{number, plural, one {# day} other {# days}} ago", "relative_time.full.days": "{number, plural, one {# روز} other {# روز}} پیش",
"relative_time.full.hours": "{number, plural, one {# hour} other {# hours}} ago", "relative_time.full.hours": "{number, plural, one {# ساعت} other {# ساعت}} پیش",
"relative_time.full.just_now": "just now", "relative_time.full.just_now": "همين آلان",
"relative_time.full.minutes": "{number, plural, one {# minute} other {# minutes}} ago", "relative_time.full.minutes": "{number, plural, one {# دقیقه} other {# دقیقه}} پیش",
"relative_time.full.seconds": "{number, plural, one {# second} other {# seconds}} ago", "relative_time.full.seconds": "{number, plural, one {# ثانیه} other {# ثانیه}} پیش",
"relative_time.hours": "{number} ساعت", "relative_time.hours": "{number} ساعت",
"relative_time.just_now": "حالا", "relative_time.just_now": "حالا",
"relative_time.minutes": "{number} دقیقه", "relative_time.minutes": "{number} دقیقه",
"relative_time.seconds": "{number} ثانیه", "relative_time.seconds": "{number} ثانیه",
"relative_time.today": "امروز", "relative_time.today": "امروز",
"reply_indicator.cancel": "لغو", "reply_indicator.cancel": "لغو",
"report.block": "Block", "report.block": "مسدود کردن",
"report.block_explanation": "You will not see their posts. They will not be able to see your posts or follow you. They will be able to tell that they are blocked.", "report.block_explanation": "شما فرسته‌هایشان را نخواهید دید. آن‌ها نمی‌توانند فرسته‌هایتان را ببینند یا شما را پی‌بگیرند. آنها می‌توانند بگویند که مسدود شده‌اند.",
"report.categories.other": "Other", "report.categories.other": "غیره",
"report.categories.spam": "Spam", "report.categories.spam": "Spam",
"report.categories.violation": "Content violates one or more server rules", "report.categories.violation": "Content violates one or more server rules",
"report.category.subtitle": "Choose the best match", "report.category.subtitle": "Choose the best match",

View file

@ -18,7 +18,7 @@
"account.followers": "フォロワー", "account.followers": "フォロワー",
"account.followers.empty": "まだ誰もフォローしていません。", "account.followers.empty": "まだ誰もフォローしていません。",
"account.followers_counter": "{counter} フォロワー", "account.followers_counter": "{counter} フォロワー",
"account.following": "Following", "account.following": "フォロー中",
"account.following_counter": "{counter} フォロー", "account.following_counter": "{counter} フォロー",
"account.follows.empty": "まだ誰もフォローしていません。", "account.follows.empty": "まだ誰もフォローしていません。",
"account.follows_you": "フォローされています", "account.follows_you": "フォローされています",
@ -41,12 +41,12 @@
"account.statuses_counter": "{counter} 投稿", "account.statuses_counter": "{counter} 投稿",
"account.unblock": "@{name}さんのブロックを解除", "account.unblock": "@{name}さんのブロックを解除",
"account.unblock_domain": "{domain}のブロックを解除", "account.unblock_domain": "{domain}のブロックを解除",
"account.unblock_short": "Unblock", "account.unblock_short": "ブロック解除",
"account.unendorse": "プロフィールから外す", "account.unendorse": "プロフィールから外す",
"account.unfollow": "フォロー解除", "account.unfollow": "フォロー解除",
"account.unmute": "@{name}さんのミュートを解除", "account.unmute": "@{name}さんのミュートを解除",
"account.unmute_notifications": "@{name}さんからの通知を受け取るようにする", "account.unmute_notifications": "@{name}さんからの通知を受け取るようにする",
"account.unmute_short": "Unmute", "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": "サインアップ後の月ごとのユーザー継続率",
@ -192,7 +192,7 @@
"errors.unexpected_crash.copy_stacktrace": "スタックトレースをクリップボードにコピー", "errors.unexpected_crash.copy_stacktrace": "スタックトレースをクリップボードにコピー",
"errors.unexpected_crash.report_issue": "問題を報告", "errors.unexpected_crash.report_issue": "問題を報告",
"explore.search_results": "検索結果", "explore.search_results": "検索結果",
"explore.suggested_follows": "For you", "explore.suggested_follows": "あなたに",
"explore.title": "エクスプローラー", "explore.title": "エクスプローラー",
"explore.trending_links": "ニュース", "explore.trending_links": "ニュース",
"explore.trending_statuses": "投稿", "explore.trending_statuses": "投稿",
@ -326,7 +326,7 @@
"notification.update": "{name} が投稿を編集しました", "notification.update": "{name} が投稿を編集しました",
"notifications.clear": "通知を消去", "notifications.clear": "通知を消去",
"notifications.clear_confirmation": "本当に通知を消去しますか?", "notifications.clear_confirmation": "本当に通知を消去しますか?",
"notifications.column_settings.admin.sign_up": "New sign-ups:", "notifications.column_settings.admin.sign_up": "新規登録:",
"notifications.column_settings.alert": "デスクトップ通知", "notifications.column_settings.alert": "デスクトップ通知",
"notifications.column_settings.favourite": "お気に入り:", "notifications.column_settings.favourite": "お気に入り:",
"notifications.column_settings.filter_bar.advanced": "すべてのカテゴリを表示", "notifications.column_settings.filter_bar.advanced": "すべてのカテゴリを表示",
@ -395,7 +395,7 @@
"relative_time.today": "今日", "relative_time.today": "今日",
"reply_indicator.cancel": "キャンセル", "reply_indicator.cancel": "キャンセル",
"report.block": "ブロック", "report.block": "ブロック",
"report.block_explanation": "You will not see their posts. They will not be able to see your posts or follow you. They will be able to tell that they are blocked.", "report.block_explanation": "相手の投稿が表示されなくなります。相手はあなたの投稿を見ることやフォローすることができません。相手はブロックされていることがわかります。",
"report.categories.other": "その他", "report.categories.other": "その他",
"report.categories.spam": "スパム", "report.categories.spam": "スパム",
"report.categories.violation": "サーバーのルールに違反", "report.categories.violation": "サーバーのルールに違反",
@ -404,11 +404,11 @@
"report.category.title_account": "プロフィール", "report.category.title_account": "プロフィール",
"report.category.title_status": "投稿", "report.category.title_status": "投稿",
"report.close": "完了", "report.close": "完了",
"report.comment.title": "Is there anything else you think we should know?", "report.comment.title": "その他に私たちに伝えておくべき事はありますか?",
"report.forward": "{target} に転送する", "report.forward": "{target} に転送する",
"report.forward_hint": "このアカウントは別のサーバーに所属しています。通報内容を匿名で転送しますか?", "report.forward_hint": "このアカウントは別のサーバーに所属しています。通報内容を匿名で転送しますか?",
"report.mute": "ミュート", "report.mute": "ミュート",
"report.mute_explanation": "You will not see their posts. They can still follow you and see your posts and will not know that they are muted.", "report.mute_explanation": "相手の投稿は表示されなくなります。相手は引き続きあなたをフォローして、あなたの投稿を表示することができますが、ミュートされていることはわかりません。",
"report.next": "次へ", "report.next": "次へ",
"report.placeholder": "追加コメント", "report.placeholder": "追加コメント",
"report.reasons.dislike": "興味がありません", "report.reasons.dislike": "興味がありません",
@ -426,9 +426,9 @@
"report.submit": "通報する", "report.submit": "通報する",
"report.target": "{target}さんを通報する", "report.target": "{target}さんを通報する",
"report.thanks.take_action": "次のような方法はいかがでしょうか?", "report.thanks.take_action": "次のような方法はいかがでしょうか?",
"report.thanks.take_action_actionable": "While we review this, you can take action against @{name}:", "report.thanks.take_action_actionable": "私達が確認している間でも、あなたは @{name} さんに対して対応することが出来ます:",
"report.thanks.title": "見えないようにしたいですか?", "report.thanks.title": "見えないようにしたいですか?",
"report.thanks.title_actionable": "Thanks for reporting, we'll look into this.", "report.thanks.title_actionable": "ご報告ありがとうございます、追って確認します。",
"report.unfollow": "@{name}のフォローを解除", "report.unfollow": "@{name}のフォローを解除",
"report.unfollow_explanation": "このアカウントをフォローしています。ホームフィードに彼らの投稿を表示しないようにするには、彼らのフォローを外してください。", "report.unfollow_explanation": "このアカウントをフォローしています。ホームフィードに彼らの投稿を表示しないようにするには、彼らのフォローを外してください。",
"search.placeholder": "検索", "search.placeholder": "検索",
@ -441,7 +441,7 @@
"search_results.accounts": "人々", "search_results.accounts": "人々",
"search_results.all": "すべて", "search_results.all": "すべて",
"search_results.hashtags": "ハッシュタグ", "search_results.hashtags": "ハッシュタグ",
"search_results.nothing_found": "Could not find anything for these search terms", "search_results.nothing_found": "この検索条件では何も見つかりませんでした",
"search_results.statuses": "投稿", "search_results.statuses": "投稿",
"search_results.statuses_fts_disabled": "このサーバーでは投稿本文の検索は利用できません。", "search_results.statuses_fts_disabled": "このサーバーでは投稿本文の検索は利用できません。",
"search_results.total": "{count, number}件の結果", "search_results.total": "{count, number}件の結果",

View file

@ -18,7 +18,7 @@
"account.followers": "Подписчики", "account.followers": "Подписчики",
"account.followers.empty": "На этого пользователя пока никто не подписан.", "account.followers.empty": "На этого пользователя пока никто не подписан.",
"account.followers_counter": "{count, plural, one {{counter} подписчик} many {{counter} подписчиков} other {{counter} подписчика}}", "account.followers_counter": "{count, plural, one {{counter} подписчик} many {{counter} подписчиков} other {{counter} подписчика}}",
"account.following": "Following", "account.following": "Подписки",
"account.following_counter": "{count, plural, one {{counter} подписка} many {{counter} подписок} other {{counter} подписки}}", "account.following_counter": "{count, plural, one {{counter} подписка} many {{counter} подписок} other {{counter} подписки}}",
"account.follows.empty": "Этот пользователь пока ни на кого не подписался.", "account.follows.empty": "Этот пользователь пока ни на кого не подписался.",
"account.follows_you": "Подписан(а) на вас", "account.follows_you": "Подписан(а) на вас",
@ -95,7 +95,7 @@
"compose_form.direct_message_warning": "Адресованные посты отправляются и видны только упомянутым в них пользователям.", "compose_form.direct_message_warning": "Адресованные посты отправляются и видны только упомянутым в них пользователям.",
"compose_form.direct_message_warning_learn_more": "Подробнее", "compose_form.direct_message_warning_learn_more": "Подробнее",
"compose_form.hashtag_warning": "Так как этот пост не публичный, он не отобразится в поиске по хэштегам.", "compose_form.hashtag_warning": "Так как этот пост не публичный, он не отобразится в поиске по хэштегам.",
"compose_form.lock_disclaimer": "Ваша учётная запись не {locked}. Любой пользователь сможет подписаться на вас и просматривать посты для подписчиков.", "compose_form.lock_disclaimer": "Ваша учётная запись {locked}. Любой пользователь сможет подписаться на вас и просматривать посты для подписчиков.",
"compose_form.lock_disclaimer.lock": "не закрыта", "compose_form.lock_disclaimer.lock": "не закрыта",
"compose_form.placeholder": "О чём думаете?", "compose_form.placeholder": "О чём думаете?",
"compose_form.poll.add_option": "Добавить вариант", "compose_form.poll.add_option": "Добавить вариант",
@ -390,42 +390,42 @@
"relative_time.today": "сегодня", "relative_time.today": "сегодня",
"reply_indicator.cancel": "Отмена", "reply_indicator.cancel": "Отмена",
"report.block": "Заблокировать", "report.block": "Заблокировать",
"report.block_explanation": "You will not see their posts. They will not be able to see your posts or follow you. They will be able to tell that they are blocked.", "report.block_explanation": "В перестаните видеть посты этого пользователя, а он(а) больше не сможет подписаться на вас и читать ваши посты. Он(а) сможет понять что вы заблокировали его/её.",
"report.categories.other": "Другое", "report.categories.other": "Другое",
"report.categories.spam": "Спам", "report.categories.spam": "Спам",
"report.categories.violation": "Содержимое нарушает одно или несколько правил узла", "report.categories.violation": "Содержимое нарушает одно или несколько правил узла",
"report.category.subtitle": "Выберите наиболее подходящее", "report.category.subtitle": "Выберите наиболее подходящее",
"report.category.title": "Расскажите нам, что происходит с {type}", "report.category.title": "Расскажите нам, что не так с {type}",
"report.category.title_account": "профиль", "report.category.title_account": "этим профилем",
"report.category.title_status": "пост", "report.category.title_status": "этим постом",
"report.close": "Готово", "report.close": "Готово",
"report.comment.title": "Есть что-нибудь еще, что мы должны знать?", "report.comment.title": "Есть ли что-нибудь ещё, что нам стоит знать?",
"report.forward": "Переслать в {target}", "report.forward": "Переслать на {target}",
"report.forward_hint": "Эта учётная запись расположена на другом узле. Отправить туда анонимную копию вашей жалобы?", "report.forward_hint": "Эта учётная запись расположена на другом узле. Отправить туда анонимную копию вашей жалобы?",
"report.mute": "Mute", "report.mute": "Игнорировать",
"report.mute_explanation": "Вы не будете видеть их посты. Они по-прежнему могут подписываться на вас и видеть ваши посты, но не будут знать, что они в списке игнорируемых.", "report.mute_explanation": "Вы не будете видеть их посты. Они по-прежнему могут подписываться на вас и видеть ваши посты, но не будут знать, что они в списке игнорируемых.",
"report.next": "Далее", "report.next": "Далее",
"report.placeholder": "Комментарий", "report.placeholder": "Дополнительные комментарии",
"report.reasons.dislike": "Мне не нравится", "report.reasons.dislike": "Мне не нравится",
"report.reasons.dislike_description": "Не хотел(а) бы видеть такой контент", "report.reasons.dislike_description": "Не хотел(а) бы видеть такой контент",
"report.reasons.other": "Другое", "report.reasons.other": "Другое",
"report.reasons.other_description": "Проблема не подпадает под другие категории", "report.reasons.other_description": "Проблема не попадает ни под одну из категорий",
"report.reasons.spam": "Это спам", "report.reasons.spam": "Это спам",
"report.reasons.spam_description": "Вредоносные ссылки, поддельные действия или повторяющиеся ответы", "report.reasons.spam_description": "Вредоносные ссылки, фальшивое взаимодействие или повторяющиеся ответы",
"report.reasons.violation": "Нарушаются правила сервера", "report.reasons.violation": "Нарушаются правила сервера",
"report.reasons.violation_description": "Вы знаете, что подобное нарушает определенные правила", "report.reasons.violation_description": "Вы знаете, что подобное нарушает определенные правила",
"report.rules.subtitle": "Выберите все подходящие варианты", "report.rules.subtitle": "Выберите все подходящие варианты",
"report.rules.title": "Какие правила нарушены?", "report.rules.title": "Какие правила нарушены?",
"report.statuses.subtitle": "Выберите все подходящие варианты", "report.statuses.subtitle": "Выберите все подходящие варианты",
"report.statuses.title": "Есть ли сообщения, подтверждающие основания этой жалобы?", "report.statuses.title": "Выберите посты, которые относятся к вашей жалобе.",
"report.submit": "Отправить", "report.submit": "Отправить",
"report.target": "Жалоба на {target}", "report.target": "Жалоба на {target}",
"report.thanks.take_action": "Here are your options for controlling what you see on Mastodon:", "report.thanks.take_action": "Вот несколько опций управления тем, что вы видите в Mastodon:",
"report.thanks.take_action_actionable": "While we review this, you can take action against @{name}:", "report.thanks.take_action_actionable": "Пока мы рассматриваем его, вот действия, которые вы можете предпринять лично против @{name}:",
"report.thanks.title": "Не хотите видеть это?", "report.thanks.title": "Не хотите видеть это?",
"report.thanks.title_actionable": "Спасибо за обращение, мы его рассмотрим.", "report.thanks.title_actionable": "Спасибо за обращение, мы его рассмотрим.",
"report.unfollow": "Отписаться от @{name}", "report.unfollow": "Отписаться от @{name}",
"report.unfollow_explanation": "You are following this account. To not see their posts in your home feed anymore, unfollow them.", "report.unfollow_explanation": "Вы подписаны на этого пользователя. Чтобы не видеть его/её посты в своей домашней ленте, отпишитесь от него/неё.",
"search.placeholder": "Поиск", "search.placeholder": "Поиск",
"search_popout.search_format": "Продвинутый формат поиска", "search_popout.search_format": "Продвинутый формат поиска",
"search_popout.tips.full_text": "Поиск по простому тексту отобразит посты, которые вы написали, добавили в избранное, продвинули или в которых были упомянуты, а также подходящие имена пользователей и хэштеги.", "search_popout.tips.full_text": "Поиск по простому тексту отобразит посты, которые вы написали, добавили в избранное, продвинули или в которых были упомянуты, а также подходящие имена пользователей и хэштеги.",

View file

@ -389,7 +389,7 @@
"relative_time.seconds": "{number}sek", "relative_time.seconds": "{number}sek",
"relative_time.today": "dnes", "relative_time.today": "dnes",
"reply_indicator.cancel": "Zrušiť", "reply_indicator.cancel": "Zrušiť",
"report.block": "Block", "report.block": "Blokuj",
"report.block_explanation": "You will not see their posts. They will not be able to see your posts or follow you. They will be able to tell that they are blocked.", "report.block_explanation": "You will not see their posts. They will not be able to see your posts or follow you. They will be able to tell that they are blocked.",
"report.categories.other": "Other", "report.categories.other": "Other",
"report.categories.spam": "Spam", "report.categories.spam": "Spam",
@ -424,7 +424,7 @@
"report.thanks.take_action_actionable": "While we review this, you can take action against @{name}:", "report.thanks.take_action_actionable": "While we review this, you can take action against @{name}:",
"report.thanks.title": "Nechceš to vidieť?", "report.thanks.title": "Nechceš to vidieť?",
"report.thanks.title_actionable": "Thanks for reporting, we'll look into this.", "report.thanks.title_actionable": "Thanks for reporting, we'll look into this.",
"report.unfollow": "Unfollow @{name}", "report.unfollow": "Nesleduj @{name}",
"report.unfollow_explanation": "You are following this account. To not see their posts in your home feed anymore, unfollow them.", "report.unfollow_explanation": "You are following this account. To not see their posts in your home feed anymore, unfollow them.",
"search.placeholder": "Hľadaj", "search.placeholder": "Hľadaj",
"search_popout.search_format": "Pokročilé vyhľadávanie", "search_popout.search_format": "Pokročilé vyhľadávanie",
@ -434,7 +434,7 @@
"search_popout.tips.text": "Vráti jednoduchý textový výpis zhodujúcich sa mien, prezývok a haštagov", "search_popout.tips.text": "Vráti jednoduchý textový výpis zhodujúcich sa mien, prezývok a haštagov",
"search_popout.tips.user": "užívateľ", "search_popout.tips.user": "užívateľ",
"search_results.accounts": "Ľudia", "search_results.accounts": "Ľudia",
"search_results.all": "All", "search_results.all": "Všetky",
"search_results.hashtags": "Haštagy", "search_results.hashtags": "Haštagy",
"search_results.nothing_found": "Could not find anything for these search terms", "search_results.nothing_found": "Could not find anything for these search terms",
"search_results.statuses": "Príspevky", "search_results.statuses": "Príspevky",
@ -451,7 +451,7 @@
"status.detailed_status": "Podrobný náhľad celej konverzácie", "status.detailed_status": "Podrobný náhľad celej konverzácie",
"status.direct": "Priama správa pre @{name}", "status.direct": "Priama správa pre @{name}",
"status.edit": "Uprav", "status.edit": "Uprav",
"status.edited": "Edited {date}", "status.edited": "Upravené {date}",
"status.edited_x_times": "Edited {count, plural, one {{count} time} other {{count} times}}", "status.edited_x_times": "Edited {count, plural, one {{count} time} other {{count} times}}",
"status.embed": "Vložiť", "status.embed": "Vložiť",
"status.favourite": "Páči sa mi", "status.favourite": "Páči sa mi",

View file

@ -41,7 +41,7 @@
"account.statuses_counter": "{count, plural, one {{counter} Пост} few {{counter} Пости} many {{counter} Постів} other {{counter} Пости}}", "account.statuses_counter": "{count, plural, one {{counter} Пост} few {{counter} Пости} many {{counter} Постів} other {{counter} Пости}}",
"account.unblock": "Розблокувати @{name}", "account.unblock": "Розблокувати @{name}",
"account.unblock_domain": "Розблокувати {domain}", "account.unblock_domain": "Розблокувати {domain}",
"account.unblock_short": "Unblock", "account.unblock_short": "Розблокувати",
"account.unendorse": "Не публікувати у профілі", "account.unendorse": "Не публікувати у профілі",
"account.unfollow": "Відписатися", "account.unfollow": "Відписатися",
"account.unmute": "Зняти глушення з @{name}", "account.unmute": "Зняти глушення з @{name}",
@ -187,7 +187,7 @@
"error.unexpected_crash.next_steps_addons": "Спробуйте їх вимкнути та оновити сторінку. Якщо це не допомагає, ви можете використовувати Mastodon через інший браузер або окремий застосунок.", "error.unexpected_crash.next_steps_addons": "Спробуйте їх вимкнути та оновити сторінку. Якщо це не допомагає, ви можете використовувати Mastodon через інший браузер або окремий застосунок.",
"errors.unexpected_crash.copy_stacktrace": "Скопіювати трасування стека у буфер обміну", "errors.unexpected_crash.copy_stacktrace": "Скопіювати трасування стека у буфер обміну",
"errors.unexpected_crash.report_issue": "Повідомити про проблему", "errors.unexpected_crash.report_issue": "Повідомити про проблему",
"explore.search_results": "Search results", "explore.search_results": "Результати пошуку",
"explore.suggested_follows": "Для вас", "explore.suggested_follows": "Для вас",
"explore.title": "Огляд", "explore.title": "Огляд",
"explore.trending_links": "Новини", "explore.trending_links": "Новини",
@ -309,7 +309,7 @@
"navigation_bar.preferences": "Налаштування", "navigation_bar.preferences": "Налаштування",
"navigation_bar.public_timeline": "Глобальна стрічка", "navigation_bar.public_timeline": "Глобальна стрічка",
"navigation_bar.security": "Безпека", "navigation_bar.security": "Безпека",
"notification.admin.sign_up": "{name} signed up", "notification.admin.sign_up": "{name} приєднується",
"notification.favourite": "{name} вподобав(-ла) ваш допис", "notification.favourite": "{name} вподобав(-ла) ваш допис",
"notification.follow": "{name} підписався(-лась) на вас", "notification.follow": "{name} підписався(-лась) на вас",
"notification.follow_request": "{name} відправив(-ла) запит на підписку", "notification.follow_request": "{name} відправив(-ла) запит на підписку",
@ -321,7 +321,7 @@
"notification.update": "{name} змінює допис", "notification.update": "{name} змінює допис",
"notifications.clear": "Очистити сповіщення", "notifications.clear": "Очистити сповіщення",
"notifications.clear_confirmation": "Ви впевнені, що хочете назавжди видалити всі сповіщеня?", "notifications.clear_confirmation": "Ви впевнені, що хочете назавжди видалити всі сповіщеня?",
"notifications.column_settings.admin.sign_up": "New sign-ups:", "notifications.column_settings.admin.sign_up": "Нові реєстрації:",
"notifications.column_settings.alert": "Сповіщення на комп'ютері", "notifications.column_settings.alert": "Сповіщення на комп'ютері",
"notifications.column_settings.favourite": "Вподобане:", "notifications.column_settings.favourite": "Вподобане:",
"notifications.column_settings.filter_bar.advanced": "Показати всі категорії", "notifications.column_settings.filter_bar.advanced": "Показати всі категорії",
@ -389,7 +389,7 @@
"relative_time.seconds": "{number}с", "relative_time.seconds": "{number}с",
"relative_time.today": "сьогодні", "relative_time.today": "сьогодні",
"reply_indicator.cancel": "Відмінити", "reply_indicator.cancel": "Відмінити",
"report.block": "Block", "report.block": "Заблокувати",
"report.block_explanation": "You will not see their posts. They will not be able to see your posts or follow you. They will be able to tell that they are blocked.", "report.block_explanation": "You will not see their posts. They will not be able to see your posts or follow you. They will be able to tell that they are blocked.",
"report.categories.other": "Інше", "report.categories.other": "Інше",
"report.categories.spam": "Спам", "report.categories.spam": "Спам",

View file

@ -8,7 +8,7 @@
"account.blocked": "Đã chặn", "account.blocked": "Đã chặn",
"account.browse_more_on_origin_server": "Truy cập trang của người này", "account.browse_more_on_origin_server": "Truy cập trang của người này",
"account.cancel_follow_request": "Hủy yêu cầu theo dõi", "account.cancel_follow_request": "Hủy yêu cầu theo dõi",
"account.direct": "Nhắn tin @{name}", "account.direct": "Nhắn riêng @{name}",
"account.disable_notifications": "Không thông báo khi @{name} đăng tút", "account.disable_notifications": "Không thông báo khi @{name} đăng tút",
"account.domain_blocked": "Người đã chặn", "account.domain_blocked": "Người đã chặn",
"account.edit_profile": "Chỉnh sửa trang cá nhân", "account.edit_profile": "Chỉnh sửa trang cá nhân",
@ -49,9 +49,9 @@
"account.unmute_short": "Bỏ ẩn", "account.unmute_short": "Bỏ ẩn",
"account_note.placeholder": "Nhấn để thêm", "account_note.placeholder": "Nhấn để thêm",
"admin.dashboard.daily_retention": "Tỉ lệ người dùng sau đăng ký ở lại theo ngày", "admin.dashboard.daily_retention": "Tỉ lệ người dùng sau đăng ký ở lại theo ngày",
"admin.dashboard.monthly_retention": "Tỉ lệ người dùng sau đăng ký ở lại theo tháng", "admin.dashboard.monthly_retention": "Tỉ lệ người dùng ở lại sau khi đăng ký",
"admin.dashboard.retention.average": "Trung bình", "admin.dashboard.retention.average": "Trung bình",
"admin.dashboard.retention.cohort": "Đăng ký tháng", "admin.dashboard.retention.cohort": "Tháng đăng ký",
"admin.dashboard.retention.cohort_size": "Người dùng mới", "admin.dashboard.retention.cohort_size": "Người dùng mới",
"alert.rate_limited.message": "Vui lòng thử lại sau {retry_time, time, medium}.", "alert.rate_limited.message": "Vui lòng thử lại sau {retry_time, time, medium}.",
"alert.rate_limited.title": "Vượt giới hạn", "alert.rate_limited.title": "Vượt giới hạn",
@ -179,7 +179,7 @@
"empty_column.list": "Chưa có tút. Khi những người trong danh sách này đăng tút mới, chúng sẽ xuất hiện ở đây.", "empty_column.list": "Chưa có tút. Khi những người trong danh sách này đăng tút mới, chúng sẽ xuất hiện ở đây.",
"empty_column.lists": "Bạn chưa tạo danh sách nào.", "empty_column.lists": "Bạn chưa tạo danh sách nào.",
"empty_column.mutes": "Bạn chưa ẩn bất kỳ ai.", "empty_column.mutes": "Bạn chưa ẩn bất kỳ ai.",
"empty_column.notifications": "Bạn chưa có thông báo nào. Hãy thử theo dõi hoặc nhắn tin cho một ai đó.", "empty_column.notifications": "Bạn chưa có thông báo nào. Hãy thử theo dõi hoặc nhắn riêng cho một ai đó.",
"empty_column.public": "Trống trơn! Bạn hãy viết gì đó hoặc bắt đầu theo dõi những người khác", "empty_column.public": "Trống trơn! Bạn hãy viết gì đó hoặc bắt đầu theo dõi những người khác",
"error.unexpected_crash.explanation": "Trang này có thể không hiển thị chính xác do lỗi lập trình Mastodon hoặc vấn đề tương thích trình duyệt.", "error.unexpected_crash.explanation": "Trang này có thể không hiển thị chính xác do lỗi lập trình Mastodon hoặc vấn đề tương thích trình duyệt.",
"error.unexpected_crash.explanation_addons": "Trang này không thể hiển thị do xung khắc với add-on của trình duyệt hoặc công cụ tự động dịch ngôn ngữ.", "error.unexpected_crash.explanation_addons": "Trang này không thể hiển thị do xung khắc với add-on của trình duyệt hoặc công cụ tự động dịch ngôn ngữ.",
@ -188,7 +188,7 @@
"errors.unexpected_crash.copy_stacktrace": "Sao chép stacktrace vào clipboard", "errors.unexpected_crash.copy_stacktrace": "Sao chép stacktrace vào clipboard",
"errors.unexpected_crash.report_issue": "Báo cáo lỗi", "errors.unexpected_crash.report_issue": "Báo cáo lỗi",
"explore.search_results": "Kết quả tìm kiếm", "explore.search_results": "Kết quả tìm kiếm",
"explore.suggested_follows": "Đề xuất cho bạn", "explore.suggested_follows": "Dành cho bạn",
"explore.title": "Khám phá", "explore.title": "Khám phá",
"explore.trending_links": "Tin tức", "explore.trending_links": "Tin tức",
"explore.trending_statuses": "Tút", "explore.trending_statuses": "Tút",
@ -294,7 +294,7 @@
"navigation_bar.discover": "Khám phá", "navigation_bar.discover": "Khám phá",
"navigation_bar.domain_blocks": "Máy chủ đã ẩn", "navigation_bar.domain_blocks": "Máy chủ đã ẩn",
"navigation_bar.edit_profile": "Trang cá nhân", "navigation_bar.edit_profile": "Trang cá nhân",
"navigation_bar.explore": "Khám phá", "navigation_bar.explore": "Xu hướng",
"navigation_bar.favourites": "Thích", "navigation_bar.favourites": "Thích",
"navigation_bar.filters": "Bộ lọc từ ngữ", "navigation_bar.filters": "Bộ lọc từ ngữ",
"navigation_bar.follow_requests": "Yêu cầu theo dõi", "navigation_bar.follow_requests": "Yêu cầu theo dõi",
@ -309,7 +309,7 @@
"navigation_bar.preferences": "Cài đặt", "navigation_bar.preferences": "Cài đặt",
"navigation_bar.public_timeline": "Thế giới", "navigation_bar.public_timeline": "Thế giới",
"navigation_bar.security": "Bảo mật", "navigation_bar.security": "Bảo mật",
"notification.admin.sign_up": "{name} vừa đăng ký", "notification.admin.sign_up": "{name} đăng ký máy chủ của bạn",
"notification.favourite": "{name} thích tút của bạn", "notification.favourite": "{name} thích tút của bạn",
"notification.follow": "{name} theo dõi bạn", "notification.follow": "{name} theo dõi bạn",
"notification.follow_request": "{name} yêu cầu theo dõi bạn", "notification.follow_request": "{name} yêu cầu theo dõi bạn",
@ -367,7 +367,7 @@
"poll_button.remove_poll": "Hủy cuộc bình chọn", "poll_button.remove_poll": "Hủy cuộc bình chọn",
"privacy.change": "Thay đổi quyền riêng tư", "privacy.change": "Thay đổi quyền riêng tư",
"privacy.direct.long": "Chỉ người được nhắc đến mới thấy", "privacy.direct.long": "Chỉ người được nhắc đến mới thấy",
"privacy.direct.short": "Tin nhắn", "privacy.direct.short": "Nhắn riêng",
"privacy.private.long": "Dành riêng cho người theo dõi", "privacy.private.long": "Dành riêng cho người theo dõi",
"privacy.private.short": "Riêng tư", "privacy.private.short": "Riêng tư",
"privacy.public.long": "Hiện trên bảng tin máy chủ", "privacy.public.long": "Hiện trên bảng tin máy chủ",
@ -449,7 +449,7 @@
"status.copy": "Sao chép URL", "status.copy": "Sao chép URL",
"status.delete": "Xóa", "status.delete": "Xóa",
"status.detailed_status": "Xem chi tiết thêm", "status.detailed_status": "Xem chi tiết thêm",
"status.direct": "Nhắn tin @{name}", "status.direct": "Nhắn riêng @{name}",
"status.edit": "Sửa", "status.edit": "Sửa",
"status.edited": "Đã sửa {date}", "status.edited": "Đã sửa {date}",
"status.edited_x_times": "Đã sửa {count, plural, other {{count} lần}}", "status.edited_x_times": "Đã sửa {count, plural, other {{count} lần}}",
@ -483,7 +483,7 @@
"status.show_less_all": "Thu gọn toàn bộ", "status.show_less_all": "Thu gọn toàn bộ",
"status.show_more": "Xem thêm", "status.show_more": "Xem thêm",
"status.show_more_all": "Hiển thị tất cả", "status.show_more_all": "Hiển thị tất cả",
"status.show_thread": "Toàn chủ đề", "status.show_thread": "Xem chuỗi tút này",
"status.uncached_media_warning": "Uncached", "status.uncached_media_warning": "Uncached",
"status.unmute_conversation": "Quan tâm", "status.unmute_conversation": "Quan tâm",
"status.unpin": "Bỏ ghim trên trang cá nhân", "status.unpin": "Bỏ ghim trên trang cá nhân",

View file

@ -1322,7 +1322,7 @@ a.sparkline {
width: 50px; width: 50px;
height: 21px; height: 21px;
position: absolute; position: absolute;
bottom: 8px; bottom: 0;
right: 15px; right: 15px;
background: linear-gradient(to left, $ui-base-color, transparent); background: linear-gradient(to left, $ui-base-color, transparent);
pointer-events: none; pointer-events: none;

View file

@ -596,8 +596,7 @@
display: flex; display: flex;
align-items: flex-start; align-items: flex-start;
justify-content: space-between; justify-content: space-between;
opacity: 0; }
transition: opacity .1s ease;
.icon-button { .icon-button {
flex: 0 1 auto; flex: 0 1 auto;
@ -614,12 +613,7 @@
} }
} }
&.active { &__warning {
opacity: 1;
}
}
&-description {
position: absolute; position: absolute;
z-index: 2; z-index: 2;
bottom: 0; bottom: 0;
@ -627,34 +621,6 @@
right: 0; right: 0;
box-sizing: border-box; box-sizing: border-box;
background: linear-gradient(0deg, rgba($base-shadow-color, 0.8) 0, rgba($base-shadow-color, 0.35) 80%, transparent); background: linear-gradient(0deg, rgba($base-shadow-color, 0.8) 0, rgba($base-shadow-color, 0.35) 80%, transparent);
padding: 10px;
opacity: 0;
transition: opacity .1s ease;
textarea {
background: transparent;
color: $secondary-text-color;
border: 0;
padding: 0;
margin: 0;
width: 100%;
font-family: inherit;
font-size: 14px;
font-weight: 500;
&:focus {
color: $white;
}
&::placeholder {
opacity: 0.75;
color: $secondary-text-color;
}
}
&.active {
opacity: 1;
}
} }
} }
@ -870,7 +836,8 @@
.status__content__spoiler-link { .status__content__spoiler-link {
background: $action-button-color; background: $action-button-color;
&:hover { &:hover,
&:focus {
background: lighten($action-button-color, 7%); background: lighten($action-button-color, 7%);
text-decoration: none; text-decoration: none;
} }
@ -982,7 +949,7 @@
text-transform: uppercase; text-transform: uppercase;
line-height: 20px; line-height: 20px;
cursor: pointer; cursor: pointer;
vertical-align: middle; vertical-align: top;
} }
.status__wrapper--filtered { .status__wrapper--filtered {
@ -1042,42 +1009,6 @@
.audio-player { .audio-player {
margin-top: 8px; margin-top: 8px;
} }
&.light {
.status__relative-time,
.status__visibility-icon {
color: $light-text-color;
}
.status__display-name {
color: $inverted-text-color;
}
.display-name {
color: $light-text-color;
strong {
color: $inverted-text-color;
}
}
.status__content {
color: $inverted-text-color;
a {
color: $highlight-text-color;
}
a.status__content__spoiler-link {
color: $primary-text-color;
background: $ui-primary-color;
&:hover {
background: lighten($ui-primary-color, 8%);
}
}
}
}
} }
.status__relative-time, .status__relative-time,
@ -1223,6 +1154,43 @@
.audio-player { .audio-player {
margin-top: 8px; margin-top: 8px;
} }
&.light {
.status__relative-time,
.status__visibility-icon {
color: $light-text-color;
}
.status__display-name {
color: $inverted-text-color;
}
.display-name {
color: $light-text-color;
strong {
color: $inverted-text-color;
}
}
.status__content {
color: $inverted-text-color;
a {
color: $highlight-text-color;
}
a.status__content__spoiler-link {
color: $primary-text-color;
background: $ui-primary-color;
&:hover,
&:focus {
background: lighten($ui-primary-color, 8%);
}
}
}
}
} }
.detailed-status__meta { .detailed-status__meta {
@ -1646,7 +1614,8 @@ a.account__display-name {
background: $ui-base-lighter-color; background: $ui-base-lighter-color;
color: $inverted-text-color; color: $inverted-text-color;
&:hover { &:hover,
&:focus {
background: lighten($ui-base-lighter-color, 7%); background: lighten($ui-base-lighter-color, 7%);
text-decoration: none; text-decoration: none;
} }
@ -5158,6 +5127,15 @@ a.status-card.compact:hover {
color: $inverted-text-color; color: $inverted-text-color;
} }
.status__content__spoiler-link {
color: $primary-text-color;
background: $ui-primary-color;
&:hover {
background: lighten($ui-primary-color, 8%);
}
}
.dialog-option .poll__input { .dialog-option .poll__input {
border-color: $inverted-text-color; border-color: $inverted-text-color;
color: $ui-secondary-color; color: $ui-secondary-color;

View file

@ -3,7 +3,7 @@
.moved-account-widget .moved-account-widget
.moved-account-widget__message .moved-account-widget__message
= fa_icon 'suitcase' = fa_icon 'suitcase'
= t('accounts.moved_html', name: content_tag(:bdi, content_tag(:strong, display_name(account, custom_emojify: true), class: :emojify)), new_profile_link: link_to(content_tag(:strong, safe_join(['@', content_tag(:span, moved_to_account.acct)])), ActivityPub::TagManager.instance.url_for(moved_to_account), class: 'mention')) = t('accounts.moved_html', name: content_tag(:bdi, content_tag(:strong, display_name(account, custom_emojify: true), class: :emojify)), new_profile_link: link_to(content_tag(:strong, safe_join(['@', content_tag(:span, moved_to_account.pretty_acct)])), ActivityPub::TagManager.instance.url_for(moved_to_account), class: 'mention'))
.moved-account-widget__card .moved-account-widget__card
= link_to ActivityPub::TagManager.instance.url_for(moved_to_account), class: 'detailed-status__display-name p-author h-card', target: '_blank', rel: 'me noopener noreferrer' do = link_to ActivityPub::TagManager.instance.url_for(moved_to_account), class: 'detailed-status__display-name p-author h-card', target: '_blank', rel: 'me noopener noreferrer' do
@ -17,4 +17,4 @@
%span.display-name %span.display-name
%bdi %bdi
%strong.emojify= display_name(moved_to_account, custom_emojify: true) %strong.emojify= display_name(moved_to_account, custom_emojify: true)
%span @#{moved_to_account.acct} %span @#{moved_to_account.pretty_acct}

View file

@ -1,11 +1,11 @@
- content_for :page_title do - content_for :page_title do
= t('admin.account_actions.title', acct: @account.acct) = t('admin.account_actions.title', acct: @account.pretty_acct)
= simple_form_for @account_action, url: admin_account_action_path(@account.id) do |f| = simple_form_for @account_action, url: admin_account_action_path(@account.id) do |f|
= f.input :report_id, as: :hidden = f.input :report_id, as: :hidden
.fields-group .fields-group
= f.input :type, as: :radio_buttons, collection: Admin::AccountAction.types_for_account(@account), include_blank: false, wrapper: :with_block_label, label_method: ->(type) { safe_join([I18n.t("simple_form.labels.admin_account_action.types.#{type}"), content_tag(:span, I18n.t("simple_form.hints.admin_account_action.types.#{type}"), class: 'hint')])}, hint: t('simple_form.hints.admin_account_action.type_html', acct: @account.acct) = f.input :type, as: :radio_buttons, collection: Admin::AccountAction.types_for_account(@account), include_blank: false, wrapper: :with_block_label, label_method: ->(type) { safe_join([I18n.t("simple_form.labels.admin_account_action.types.#{type}"), content_tag(:span, I18n.t("simple_form.hints.admin_account_action.types.#{type}"), class: 'hint')])}, hint: t('simple_form.hints.admin_account_action.type_html', acct: @account.pretty_acct)
- if @account.local? - if @account.local?
%hr.spacer/ %hr.spacer/

View file

@ -5,7 +5,7 @@
= fa_icon 'warning' = fa_icon 'warning'
.log-entry__content .log-entry__content
.log-entry__title .log-entry__title
= t(account_warning.action, scope: 'admin.strikes.actions', name: content_tag(:span, account_warning.account.username, class: 'username'), target: content_tag(:span, account_warning.target_account.acct, class: 'target')).html_safe = t(account_warning.action, scope: 'admin.strikes.actions', name: content_tag(:span, account_warning.account.username, class: 'username'), target: content_tag(:span, account_warning.target_account.pretty_acct, class: 'target')).html_safe
.log-entry__timestamp .log-entry__timestamp
%time.formatted{ datetime: account_warning.created_at.iso8601 } %time.formatted{ datetime: account_warning.created_at.iso8601 }
= l(account_warning.created_at) = l(account_warning.created_at)

View file

@ -33,7 +33,7 @@
= hidden_field_tag key, params[key] = hidden_field_tag key, params[key]
- %i(username by_domain display_name email ip).each do |key| - %i(username by_domain display_name email ip).each do |key|
- unless key == :by_domain && params[:remote].blank? - unless key == :by_domain && params[:origin] != 'remote'
.input.string.optional .input.string.optional
= text_field_tag key, params[key], class: 'string optional', placeholder: I18n.t("admin.accounts.#{key}") = text_field_tag key, params[key], class: 'string optional', placeholder: I18n.t("admin.accounts.#{key}")

View file

@ -1,5 +1,5 @@
- content_for :page_title do - content_for :page_title do
= @account.acct = @account.pretty_acct
- if @account.instance_actor? - if @account.instance_actor?
.flash-message.notice .flash-message.notice

View file

@ -1,5 +1,5 @@
- content_for :page_title do - content_for :page_title do
= t('admin.accounts.change_email.title', username: @account.acct) = t('admin.accounts.change_email.title', username: @account.username)
= simple_form_for @user, url: admin_account_change_email_path(@account.id) do |f| = simple_form_for @user, url: admin_account_change_email_path(@account.id) do |f|
.fields-group .fields-group

View file

@ -4,7 +4,7 @@
= image_tag appeal.account.avatar.url(:original), alt: '', width: 40, height: 40, class: 'avatar' = image_tag appeal.account.avatar.url(:original), alt: '', width: 40, height: 40, class: 'avatar'
.log-entry__content .log-entry__content
.log-entry__title .log-entry__title
= t(appeal.strike.action, scope: 'admin.strikes.actions', name: content_tag(:span, appeal.strike.account.username, class: 'username'), target: content_tag(:span, appeal.account.acct, class: 'target')).html_safe = t(appeal.strike.action, scope: 'admin.strikes.actions', name: content_tag(:span, appeal.strike.account.username, class: 'username'), target: content_tag(:span, appeal.account.username, class: 'target')).html_safe
.log-entry__timestamp .log-entry__timestamp
%time.formatted{ datetime: appeal.strike.created_at.iso8601 } %time.formatted{ datetime: appeal.strike.created_at.iso8601 }
= l(appeal.strike.created_at) = l(appeal.strike.created_at)

View file

@ -1,7 +1,7 @@
.directory__tag .directory__tag
= link_to admin_instance_path(instance) do = link_to admin_instance_path(instance) do
%h4 %h4
= fa_icon 'warning fw' if instance.failing? = fa_icon 'warning fw', title: t('admin.instances.availability.warning') if instance.failing?
= instance.domain = instance.domain
%small %small

View file

@ -1,5 +1,5 @@
- content_for :page_title do - content_for :page_title do
= t('admin.relationships.title', acct: @account.acct) = t('admin.relationships.title', acct: @account.pretty_acct)
.filters .filters
.filter-subset .filter-subset

View file

@ -1,7 +1,7 @@
- content_for :page_title do - content_for :page_title do
= t('admin.statuses.title') = t('admin.statuses.title')
\- \-
= "@#{@account.acct}" = "@#{@account.pretty_acct}"
.filters .filters
.filter-subset .filter-subset

View file

@ -1,5 +1,5 @@
<%= raw t('application_mailer.salutation', name: display_name(@me)) %> <%= raw t('application_mailer.salutation', name: display_name(@me)) %>
<%= raw(@report.account.local? ? t('admin_mailer.new_report.body', target: @report.target_account.acct, reporter: @report.account.acct) : t('admin_mailer.new_report.body_remote', target: @report.target_account.acct, domain: @report.account.domain)) %> <%= raw(@report.account.local? ? t('admin_mailer.new_report.body', target: @report.target_account.pretty_acct, reporter: @report.account.pretty_acct) : t('admin_mailer.new_report.body_remote', target: @report.target_account.acct, domain: @report.account.domain)) %>
<%= raw t('application_mailer.view')%> <%= admin_report_url(@report) %> <%= raw t('application_mailer.view')%> <%= admin_report_url(@report) %>

View file

@ -7,7 +7,7 @@
= t('auth.status.pending') = t('auth.status.pending')
- elsif @user.account.moved_to_account_id.present? - elsif @user.account.moved_to_account_id.present?
.flash-message.warning .flash-message.warning
= t('auth.status.redirecting_to', acct: @user.account.moved_to_account.acct) = t('auth.status.redirecting_to', acct: @user.account.moved_to_account.pretty_acct)
= link_to t('migrations.cancel'), settings_migration_path = link_to t('migrations.cancel'), settings_migration_path
%h3= t('auth.status.account_status') %h3= t('auth.status.account_status')

View file

@ -1,5 +1,5 @@
- content_for :page_title do - content_for :page_title do
= t('authorize_follow.title', acct: @resource.acct) = t('authorize_follow.title', acct: @resource.pretty_acct)
.form-container .form-container
.follow-prompt .follow-prompt

View file

@ -1,5 +1,5 @@
- content_for :page_title do - content_for :page_title do
= t('authorize_follow.title', acct: @resource.acct) = t('authorize_follow.title', acct: @resource.pretty_acct)
.form-container .form-container
.follow-prompt .follow-prompt

View file

@ -23,7 +23,7 @@
= image_tag full_asset_url(status.account.avatar.url), alt:'' = image_tag full_asset_url(status.account.avatar.url), alt:''
%td{ align: 'left' } %td{ align: 'left' }
%bdi= display_name(status.account) %bdi= display_name(status.account)
= "@#{status.account.acct}" = "@#{status.account.pretty_acct}"
- if status.spoiler_text? - if status.spoiler_text?
%div.auto-dir %div.auto-dir

View file

@ -3,7 +3,7 @@
<%= raw t('notification_mailer.digest.body', since: l(@me.user_current_sign_in_at || @since), instance: root_url) %> <%= raw t('notification_mailer.digest.body', since: l(@me.user_current_sign_in_at || @since), instance: root_url) %>
<% @notifications.each do |notification| %> <% @notifications.each do |notification| %>
* <%= raw t('notification_mailer.digest.mention', name: notification.from_account.acct) %> * <%= raw t('notification_mailer.digest.mention', name: notification.from_account.pretty_acct) %>
<%= raw Formatter.instance.plaintext(notification.target_status) %> <%= raw Formatter.instance.plaintext(notification.target_status) %>

View file

@ -20,7 +20,7 @@
= image_tag full_pack_url('media/images/mailer/icon_grade.png'), alt:'' = image_tag full_pack_url('media/images/mailer/icon_grade.png'), alt:''
%h1= t 'notification_mailer.favourite.title' %h1= t 'notification_mailer.favourite.title'
%p.lead= t('notification_mailer.favourite.body', name: @account.acct) %p.lead= t('notification_mailer.favourite.body', name: @account.pretty_acct)
= render 'status', status: @status = render 'status', status: @status

View file

@ -1,5 +1,5 @@
<%= raw t('application_mailer.salutation', name: display_name(@me)) %> <%= raw t('application_mailer.salutation', name: display_name(@me)) %>
<%= raw t('notification_mailer.favourite.body', name: @account.acct) %> <%= raw t('notification_mailer.favourite.body', name: @account.pretty_acct) %>
<%= render 'status', status: @status %> <%= render 'status', status: @status %>

View file

@ -20,7 +20,7 @@
= image_tag full_pack_url('media/images/mailer/icon_person_add.png'), alt: '' = image_tag full_pack_url('media/images/mailer/icon_person_add.png'), alt: ''
%h1= t 'notification_mailer.follow.title' %h1= t 'notification_mailer.follow.title'
%p.lead= t('notification_mailer.follow.body', name: @account.acct) %p.lead= t('notification_mailer.follow.body', name: @account.pretty_acct)
%table.email-table{ cellspacing: 0, cellpadding: 0 } %table.email-table{ cellspacing: 0, cellpadding: 0 }
%tbody %tbody

View file

@ -1,5 +1,5 @@
<%= raw t('application_mailer.salutation', name: display_name(@me)) %> <%= raw t('application_mailer.salutation', name: display_name(@me)) %>
<%= raw t('notification_mailer.follow.body', name: @account.acct) %> <%= raw t('notification_mailer.follow.body', name: @account.pretty_acct) %>
<%= raw t('application_mailer.view')%> <%= web_url("accounts/#{@account.id}") %> <%= raw t('application_mailer.view')%> <%= web_url("accounts/#{@account.id}") %>

View file

@ -20,7 +20,7 @@
= image_tag full_pack_url('media/images/mailer/icon_person_add.png'), alt: '' = image_tag full_pack_url('media/images/mailer/icon_person_add.png'), alt: ''
%h1= t 'notification_mailer.follow_request.title' %h1= t 'notification_mailer.follow_request.title'
%p.lead= t('notification_mailer.follow_request.body', name: @account.acct) %p.lead= t('notification_mailer.follow_request.body', name: @account.pretty_acct)
%table.email-table{ cellspacing: 0, cellpadding: 0 } %table.email-table{ cellspacing: 0, cellpadding: 0 }
%tbody %tbody

View file

@ -1,5 +1,5 @@
<%= raw t('application_mailer.salutation', name: display_name(@me)) %> <%= raw t('application_mailer.salutation', name: display_name(@me)) %>
<%= raw t('notification_mailer.follow_request.body', name: @account.acct) %> <%= raw t('notification_mailer.follow_request.body', name: @account.pretty_acct) %>
<%= raw t('application_mailer.view')%> <%= web_url("follow_requests") %> <%= raw t('application_mailer.view')%> <%= web_url("follow_requests") %>

View file

@ -20,7 +20,7 @@
= image_tag full_pack_url('media/images/mailer/icon_reply.png'), alt: '' = image_tag full_pack_url('media/images/mailer/icon_reply.png'), alt: ''
%h1= t 'notification_mailer.mention.title' %h1= t 'notification_mailer.mention.title'
%p.lead= t('notification_mailer.mention.body', name: @status.account.acct) %p.lead= t('notification_mailer.mention.body', name: @status.account.pretty_acct)
= render 'status', status: @status = render 'status', status: @status

View file

@ -1,5 +1,5 @@
<%= raw t('application_mailer.salutation', name: display_name(@me)) %> <%= raw t('application_mailer.salutation', name: display_name(@me)) %>
<%= raw t('notification_mailer.mention.body', name: @status.account.acct) %> <%= raw t('notification_mailer.mention.body', name: @status.account.pretty_acct) %>
<%= render 'status', status: @status %> <%= render 'status', status: @status %>

View file

@ -20,7 +20,7 @@
= image_tag full_pack_url('media/images/mailer/icon_cached.png'), alt: '' = image_tag full_pack_url('media/images/mailer/icon_cached.png'), alt: ''
%h1= t 'notification_mailer.reblog.title' %h1= t 'notification_mailer.reblog.title'
%p.lead= t('notification_mailer.reblog.body', name: @account.acct) %p.lead= t('notification_mailer.reblog.body', name: @account.pretty_acct)
= render 'status', status: @status = render 'status', status: @status

View file

@ -1,5 +1,5 @@
<%= raw t('application_mailer.salutation', name: display_name(@me)) %> <%= raw t('application_mailer.salutation', name: display_name(@me)) %>
<%= raw t('notification_mailer.reblog.body', name: @account.acct) %> <%= raw t('notification_mailer.reblog.body', name: @account.pretty_acct) %>
<%= render 'status', status: @status %> <%= render 'status', status: @status %>

View file

@ -29,5 +29,5 @@
- else - else
- @aliases.each do |account_alias| - @aliases.each do |account_alias|
%tr %tr
%td= account_alias.acct %td= account_alias.pretty_acct
%td= table_link_to 'trash', t('aliases.remove'), settings_alias_path(account_alias), data: { method: :delete } %td= table_link_to 'trash', t('aliases.remove'), settings_alias_path(account_alias), data: { method: :delete }

View file

@ -8,7 +8,7 @@
= render 'application/card', account: current_account.moved_to_account = render 'application/card', account: current_account.moved_to_account
.fields-row__column.fields-group.fields-row__column-6 .fields-row__column.fields-group.fields-row__column-6
%p.hint %p.hint
%span.positive-hint= t('migrations.redirecting_to', acct: current_account.moved_to_account.acct) %span.positive-hint= t('migrations.redirecting_to', acct: current_account.moved_to_account.pretty_acct)
%p.hint= t('migrations.cancel_explanation') %p.hint= t('migrations.cancel_explanation')
@ -76,7 +76,7 @@
- if migration.target_account.present? - if migration.target_account.present?
= compact_account_link_to migration.target_account = compact_account_link_to migration.target_account
- else - else
= migration.acct = migration.pretty_acct
%td= number_with_delimiter migration.followers_count %td= number_with_delimiter migration.followers_count

View file

@ -27,7 +27,7 @@ class Scheduler::UserCleanupScheduler
end end
def clean_discarded_statuses! def clean_discarded_statuses!
Status.discarded.where('deleted_at <= ?', 30.days.ago).find_in_batches do |statuses| Status.unscoped.discarded.where('deleted_at <= ?', 30.days.ago).find_in_batches do |statuses|
RemovalWorker.push_bulk(statuses) do |status| RemovalWorker.push_bulk(statuses) do |status|
[status.id, { 'immediate' => true }] [status.id, { 'immediate' => true }]
end end

View file

@ -43,12 +43,11 @@ run.config:
fs_watch: true fs_watch: true
deploy.config: deploy.config:
extra_steps: extra_steps:
- NODE_ENV=production bundle exec rake assets:precompile - NODE_ENV=production bundle exec rake assets:precompile
transform: transform:
- "envsubst < /app/.env.nanobox > /app/.env.production" - 'envsubst < /app/.env.nanobox > /app/.env.production'
- |- - |-
if [ -z "$LOCAL_DOMAIN" ] if [ -z "$LOCAL_DOMAIN" ]
then then
@ -70,7 +69,6 @@ deploy.config:
bin/tootctl search deploy bin/tootctl search deploy
fi fi
web.web: web.web:
start: start:
nginx: nginx -c /app/nanobox/nginx-web.conf nginx: nginx -c /app/nanobox/nginx-web.conf
@ -89,7 +87,6 @@ web.web:
data.storage: data.storage:
- public/system - public/system
web.stream: web.stream:
start: start:
nginx: nginx -c /app/nanobox/nginx-stream.conf nginx: nginx -c /app/nanobox/nginx-stream.conf
@ -103,7 +100,6 @@ web.stream:
writable_dirs: writable_dirs:
- tmp - tmp
worker.sidekiq: worker.sidekiq:
start: start:
default: bundle exec sidekiq -c 5 -q default -L /app/log/sidekiq.log default: bundle exec sidekiq -c 5 -q default -L /app/log/sidekiq.log
@ -123,7 +119,6 @@ worker.sidekiq:
data.storage: data.storage:
- public/system - public/system
data.db: data.db:
image: nanobox/postgresql:9.6 image: nanobox/postgresql:9.6
@ -145,7 +140,6 @@ data.db:
curl -k -H "X-AUTH-TOKEN: ${WAREHOUSE_DATA_HOARDER_TOKEN}" https://${WAREHOUSE_DATA_HOARDER_HOST}:7410/blobs/${file} -X DELETE curl -k -H "X-AUTH-TOKEN: ${WAREHOUSE_DATA_HOARDER_TOKEN}" https://${WAREHOUSE_DATA_HOARDER_HOST}:7410/blobs/${file} -X DELETE
done done
data.elastic: data.elastic:
image: nanobox/elasticsearch:5 image: nanobox/elasticsearch:5
@ -171,7 +165,6 @@ data.elastic:
curl -k -H "X-AUTH-TOKEN: ${WAREHOUSE_DATA_HOARDER_TOKEN}" https://${WAREHOUSE_DATA_HOARDER_HOST}:7410/blobs/${file} -X DELETE curl -k -H "X-AUTH-TOKEN: ${WAREHOUSE_DATA_HOARDER_TOKEN}" https://${WAREHOUSE_DATA_HOARDER_HOST}:7410/blobs/${file} -X DELETE
done done
data.redis: data.redis:
image: nanobox/redis:4.0 image: nanobox/redis:4.0
@ -191,7 +184,6 @@ data.redis:
curl -k -H "X-AUTH-TOKEN: ${WAREHOUSE_DATA_HOARDER_TOKEN}" https://${WAREHOUSE_DATA_HOARDER_HOST}:7410/blobs/${file} -X DELETE curl -k -H "X-AUTH-TOKEN: ${WAREHOUSE_DATA_HOARDER_TOKEN}" https://${WAREHOUSE_DATA_HOARDER_HOST}:7410/blobs/${file} -X DELETE
done done
data.storage: data.storage:
image: nanobox/unfs:0.9 image: nanobox/unfs:0.9

View file

@ -7,7 +7,7 @@
"check_name": "SQL", "check_name": "SQL",
"message": "Possible SQL injection", "message": "Possible SQL injection",
"file": "app/models/status.rb", "file": "app/models/status.rb",
"line": 105, "line": 106,
"link": "https://brakemanscanner.org/docs/warning_types/sql_injection/", "link": "https://brakemanscanner.org/docs/warning_types/sql_injection/",
"code": "result.joins(\"INNER JOIN statuses_tags t#{id} ON t#{id}.status_id = statuses.id AND t#{id}.tag_id = #{id}\")", "code": "result.joins(\"INNER JOIN statuses_tags t#{id} ON t#{id}.status_id = statuses.id AND t#{id}.tag_id = #{id}\")",
"render_path": null, "render_path": null,
@ -27,7 +27,7 @@
"check_name": "SQL", "check_name": "SQL",
"message": "Possible SQL injection", "message": "Possible SQL injection",
"file": "app/models/trends/query.rb", "file": "app/models/trends/query.rb",
"line": 60, "line": 76,
"link": "https://brakemanscanner.org/docs/warning_types/sql_injection/", "link": "https://brakemanscanner.org/docs/warning_types/sql_injection/",
"code": "klass.joins(\"join unnest(array[#{ids.join(\",\")}]) with ordinality as x (id, ordering) on #{klass.table_name}.id = x.id\")", "code": "klass.joins(\"join unnest(array[#{ids.join(\",\")}]) with ordinality as x (id, ordering) on #{klass.table_name}.id = x.id\")",
"render_path": null, "render_path": null,
@ -60,6 +60,36 @@
"confidence": "High", "confidence": "High",
"note": "" "note": ""
}, },
{
"warning_type": "Cross-Site Scripting",
"warning_code": 2,
"fingerprint": "71cf98c8235b5cfa9946b5db8fdc1a2f3a862566abb34e4542be6f3acae78233",
"check_name": "CrossSiteScripting",
"message": "Unescaped model attribute",
"file": "app/views/admin/disputes/appeals/_appeal.html.haml",
"line": 7,
"link": "https://brakemanscanner.org/docs/warning_types/cross_site_scripting",
"code": "t((Unresolved Model).new.strike.action, :scope => \"admin.strikes.actions\", :name => content_tag(:span, (Unresolved Model).new.strike.account.username, :class => \"username\"), :target => content_tag(:span, (Unresolved Model).new.account.username, :class => \"target\"))",
"render_path": [
{
"type": "template",
"name": "admin/disputes/appeals/index",
"line": 20,
"file": "app/views/admin/disputes/appeals/index.html.haml",
"rendered": {
"name": "admin/disputes/appeals/_appeal",
"file": "app/views/admin/disputes/appeals/_appeal.html.haml"
}
}
],
"location": {
"type": "template",
"template": "admin/disputes/appeals/_appeal"
},
"user_input": "(Unresolved Model).new.strike",
"confidence": "Weak",
"note": ""
},
{ {
"warning_type": "SQL Injection", "warning_type": "SQL Injection",
"warning_code": 0, "warning_code": 0,
@ -121,33 +151,23 @@
"note": "" "note": ""
}, },
{ {
"warning_type": "Cross-Site Scripting", "warning_type": "Mass Assignment",
"warning_code": 2, "warning_code": 105,
"fingerprint": "afad51718ae373b2f19d2513029fd2afccf58b9148e475934bc6a162ee33c352", "fingerprint": "ab5035dd1a9f8c3a8d92fb2c37e8fe86fede4f87c91b71aa32e89c9eede602fc",
"check_name": "CrossSiteScripting", "check_name": "PermitAttributes",
"message": "Unescaped model attribute", "message": "Potentially dangerous key allowed for mass assignment",
"file": "app/views/admin/disputes/appeals/_appeal.html.haml", "file": "app/controllers/api/v1/notifications_controller.rb",
"line": 7, "line": 81,
"link": "https://brakemanscanner.org/docs/warning_types/cross_site_scripting", "link": "https://brakemanscanner.org/docs/warning_types/mass_assignment/",
"code": "t((Unresolved Model).new.strike.action, :scope => \"admin.strikes.actions\", :name => content_tag(:span, (Unresolved Model).new.strike.account.username, :class => \"username\"), :target => content_tag(:span, (Unresolved Model).new.account.acct, :class => \"target\"))", "code": "params.permit(:account_id, :types => ([]), :exclude_types => ([]))",
"render_path": [ "render_path": null,
{
"type": "template",
"name": "admin/disputes/appeals/index",
"line": 20,
"file": "app/views/admin/disputes/appeals/index.html.haml",
"rendered": {
"name": "admin/disputes/appeals/_appeal",
"file": "app/views/admin/disputes/appeals/_appeal.html.haml"
}
}
],
"location": { "location": {
"type": "template", "type": "method",
"template": "admin/disputes/appeals/_appeal" "class": "Api::V1::NotificationsController",
"method": "browserable_params"
}, },
"user_input": "(Unresolved Model).new.strike", "user_input": ":account_id",
"confidence": "Weak", "confidence": "High",
"note": "" "note": ""
}, },
{ {
@ -184,7 +204,7 @@
{ {
"type": "template", "type": "template",
"name": "admin/trends/links/index", "name": "admin/trends/links/index",
"line": 45, "line": 49,
"file": "app/views/admin/trends/links/index.html.haml", "file": "app/views/admin/trends/links/index.html.haml",
"rendered": { "rendered": {
"name": "admin/trends/links/_preview_card", "name": "admin/trends/links/_preview_card",
@ -207,7 +227,7 @@
"check_name": "PermitAttributes", "check_name": "PermitAttributes",
"message": "Potentially dangerous key allowed for mass assignment", "message": "Potentially dangerous key allowed for mass assignment",
"file": "app/controllers/api/v1/reports_controller.rb", "file": "app/controllers/api/v1/reports_controller.rb",
"line": 36, "line": 26,
"link": "https://brakemanscanner.org/docs/warning_types/mass_assignment/", "link": "https://brakemanscanner.org/docs/warning_types/mass_assignment/",
"code": "params.permit(:account_id, :comment, :category, :forward, :status_ids => ([]), :rule_ids => ([]))", "code": "params.permit(:account_id, :comment, :category, :forward, :status_ids => ([]), :rule_ids => ([]))",
"render_path": null, "render_path": null,
@ -221,6 +241,6 @@
"note": "" "note": ""
} }
], ],
"updated": "2022-02-15 03:48:53 +0100", "updated": "2022-03-22 07:48:32 +0100",
"brakeman_version": "5.2.1" "brakeman_version": "5.2.1"
} }

View file

@ -32,4 +32,3 @@ production:
host: <%= ENV['DB_HOST'] || 'localhost' %> host: <%= ENV['DB_HOST'] || 'localhost' %>
port: <%= ENV['DB_PORT'] || 5432 %> port: <%= ENV['DB_PORT'] || 5432 %>
prepared_statements: <%= ENV['PREPARED_STATEMENTS'] || 'true' %> prepared_statements: <%= ENV['PREPARED_STATEMENTS'] || 'true' %>

View file

@ -1,7 +1,7 @@
--- ---
ca: ca:
about: about:
about_hashtag_html: Aquests són tuts públics etiquetats amb <strong>#%{hashtag}</strong>. Pots interactuar amb elles si tens un compte a qualsevol lloc del fedivers. about_hashtag_html: Aquests són publicacions públiques etiquetades amb <strong>#%{hashtag}</strong>. Pots interactuar amb elles si tens un compte a qualsevol lloc del fedivers.
about_mastodon_html: 'La xarxa social del futur: sense anuncis, sense vigilància corporativa, disseny ètic i descentralització. Posseeix les teves dades amb Mastodon!' about_mastodon_html: 'La xarxa social del futur: sense anuncis, sense vigilància corporativa, disseny ètic i descentralització. Posseeix les teves dades amb Mastodon!'
about_this: Quant a about_this: Quant a
active_count_after: actiu active_count_after: actiu
@ -25,7 +25,7 @@ ca:
instance_actor_flash: | instance_actor_flash: |
Aquest compte és un actor virtual utilitzat per a representar al propi servidor i no cap usuari individual. Aquest compte és un actor virtual utilitzat per a representar al propi servidor i no cap usuari individual.
S'utilitza per a propòsits de federació i no ha de ser bloquejat si no voleu bloquejar tota la instància, en aquest cas hauríeu d'utilitzar un bloqueig de domini. S'utilitza per a propòsits de federació i no ha de ser bloquejat si no voleu bloquejar tota la instància, en aquest cas hauríeu d'utilitzar un bloqueig de domini.
learn_more: Més informació learn_more: Aprèn més
logged_in_as_html: Actualment has iniciat sessió com a %{username}. logged_in_as_html: Actualment has iniciat sessió com a %{username}.
logout_before_registering: Ja has iniciat sessió. logout_before_registering: Ja has iniciat sessió.
privacy_policy: Política de privadesa privacy_policy: Política de privadesa
@ -35,12 +35,12 @@ ca:
server_stats: 'Estadístiques del servidor:' server_stats: 'Estadístiques del servidor:'
source_code: Codi font source_code: Codi font
status_count_after: status_count_after:
one: estat one: publicació
other: tuts other: publicacions
status_count_before: Que han escrit status_count_before: Que han publicat
tagline: Segueix els teus amics i descobreix-ne de nous tagline: Segueix els teus amics i descobreix-ne de nous
terms: Termes del servei terms: Termes del servei
unavailable_content: Contingut no disponible unavailable_content: Servidors moderats
unavailable_content_description: unavailable_content_description:
domain: Servidor domain: Servidor
reason: Raó reason: Raó
@ -78,10 +78,10 @@ ca:
pin_errors: pin_errors:
following: Has d'estar seguint la persona que vulguis avalar following: Has d'estar seguint la persona que vulguis avalar
posts: posts:
one: Tut one: Publicació
other: Tuts other: Publicacions
posts_tab_heading: Tuts posts_tab_heading: Publicacions
posts_with_replies: Tuts i respostes posts_with_replies: Publicacions i respostes
roles: roles:
admin: Administrador admin: Administrador
bot: Bot bot: Bot
@ -98,7 +98,7 @@ ca:
created_msg: La nota de moderació s'ha creat correctament! created_msg: La nota de moderació s'ha creat correctament!
destroyed_msg: Nota de moderació destruïda amb èxit! destroyed_msg: Nota de moderació destruïda amb èxit!
accounts: accounts:
add_email_domain_block: Afegir el domini de correu a la llista negra add_email_domain_block: Bloquejar el domini de l'adreça de correu electrònic
approve: Aprova approve: Aprova
approved_msg: Laplicació del registre de %{username} sha aprovat amb èxit approved_msg: Laplicació del registre de %{username} sha aprovat amb èxit
are_you_sure: N'estàs segur? are_you_sure: N'estàs segur?

View file

@ -25,7 +25,7 @@ ca:
explanation: Has creat un compte a %{host} amb aquesta adreça de correu electrònic. Estàs a un sol clic de l'activació. Si no fos així, ignora aquest correu electrònic. explanation: Has creat un compte a %{host} amb aquesta adreça de correu electrònic. Estàs a un sol clic de l'activació. Si no fos així, ignora aquest correu electrònic.
explanation_when_pending: Has sol·licitat una invitació a %{host} amb aquesta adreça de correu electrònic. Un cop confirmis la teva adreça de correu electrònic revisarem la teva sol·licitud. No es pot iniciar la sessió fins llavors. Si la teva sol·licitud és rebutjada les teves dades seliminaran, de manera que no sexigirà cap altra acció. Si no has estat tu qui ha fet aquest sol·licitud si us plau ignora aquest correu electrònic. explanation_when_pending: Has sol·licitat una invitació a %{host} amb aquesta adreça de correu electrònic. Un cop confirmis la teva adreça de correu electrònic revisarem la teva sol·licitud. No es pot iniciar la sessió fins llavors. Si la teva sol·licitud és rebutjada les teves dades seliminaran, de manera que no sexigirà cap altra acció. Si no has estat tu qui ha fet aquest sol·licitud si us plau ignora aquest correu electrònic.
extra_html: Si us plau consulta també <a href="%{terms_path}"> les regles del servidor</a> i <a href="%{policy_path}"> les nostres condicions de servei</a>. extra_html: Si us plau consulta també <a href="%{terms_path}"> les regles del servidor</a> i <a href="%{policy_path}"> les nostres condicions de servei</a>.
subject: 'Mastodon: Instruccions de confirmació de %{instance}' subject: 'Mastodon: Instruccions de confirmació per a %{instance}'
title: Verifica l'adreça de correu title: Verifica l'adreça de correu
email_changed: email_changed:
explanation: 'L''adreça de correu del teu compte s''està canviant a:' explanation: 'L''adreça de correu del teu compte s''està canviant a:'
@ -34,7 +34,7 @@ ca:
title: Adreça de correu electrònic nova title: Adreça de correu electrònic nova
password_change: password_change:
explanation: S'ha canviat la contrasenya del teu compte. explanation: S'ha canviat la contrasenya del teu compte.
extra: Si no has canviat el teu correu electrònic, és probable que algú hagi accedit al teu compte. Si us plau, canvia la contrasenya immediatament o posa't en contacte amb l'administrador del servidor si no pots accedir al teu compte. extra: Si no has canviat la teva contrasenya, és probable que algú hagi accedit al teu compte. Si us plau, canvia la contrasenya immediatament o posa't en contacte amb l'administrador del servidor si no pots accedir al teu compte.
subject: 'Mastodon: Contrasenya canviada' subject: 'Mastodon: Contrasenya canviada'
title: Contrasenya canviada title: Contrasenya canviada
reconfirmation_instructions: reconfirmation_instructions:
@ -61,7 +61,7 @@ ca:
subject: 'Mastodon: codis de recuperació de Dos factors regenerats' subject: 'Mastodon: codis de recuperació de Dos factors regenerats'
title: 2FA codis de recuperació canviats title: 2FA codis de recuperació canviats
unlock_instructions: unlock_instructions:
subject: 'Mastodon: Instruccions per a desbloquejar' subject: 'Mastodon: Instruccions de desbloqueig'
webauthn_credential: webauthn_credential:
added: added:
explanation: La següent clau de seguretat s'ha afegit al teu compte explanation: La següent clau de seguretat s'ha afegit al teu compte
@ -84,34 +84,34 @@ ca:
success: Autenticat amb èxit des del compte %{kind}. success: Autenticat amb èxit des del compte %{kind}.
passwords: passwords:
no_token: No pots accedir a aquesta pàgina sense provenir des del correu de restabliment de la contrasenya. Si vens des del correu de restabliment de contrasenya, assegura't que estàs emprant l'adreça completa proporcionada. no_token: No pots accedir a aquesta pàgina sense provenir des del correu de restabliment de la contrasenya. Si vens des del correu de restabliment de contrasenya, assegura't que estàs emprant l'adreça completa proporcionada.
send_instructions: Si el teu correu electrònic existeix en la nostra base de dades, rebràs en pocs minuts un enllaç de restabliment de contrasenya en l'adreça de correu. Si us plau verifica la teva carpeta de correu brossa if no rebut aquest correu. send_instructions: Si el teu correu electrònic existeix en la nostra base de dades, rebràs en pocs minuts un enllaç de restabliment de contrasenya en l'adreça de correu. Si us plau verifica la teva carpeta de correu brossa si no has rebut aquest correu.
send_paranoid_instructions: Si el seu correu electrònic existeix en la nostra base de dades, rebràs un enllaç de restabliment de contrasenya en l'adreça de correu en pocs minuts. send_paranoid_instructions: Si el teu correu electrònic existeix en la nostra base de dades, rebràs un enllaç de restabliment de contrasenya en l'adreça de correu en pocs minuts. Si us plau verifica la carpeta de correu brossa si no reps aquest correu.
updated: La contrasenya s'ha canviat correctament. Ara ja estàs registrat. updated: La contrasenya s'ha canviat correctament. Ara ja estàs registrat.
updated_not_active: La contrasenya s'ha canviat correctament. updated_not_active: La contrasenya s'ha canviat correctament.
registrations: registrations:
destroyed: Adéu! el compte s'ha cancel·lat amb èxit. Desitgem veure't de nou aviat. destroyed: Adéu! el compte s'ha cancel·lat amb èxit. Desitgem veure't de nou ben aviat.
signed_up: Benvingut! T'has registrat amb èxit. signed_up: Benvingut! T'has registrat amb èxit.
signed_up_but_inactive: T´has registrat amb èxit. No obstant, no podem identificar-te perquè el compte encara no s'ha activat. signed_up_but_inactive: T´has registrat amb èxit. No obstant, no podem iniciar la teva sessió perquè el teu compte encara no s'ha activat.
signed_up_but_locked: T´has registrat amb èxit. No obstant, no podem identificar-te perquè el compte està blocat. signed_up_but_locked: T´has registrat amb èxit. No obstant, no podem iniciar la teva sessió perquè el teu compte està bloquejat.
signed_up_but_pending: S'ha enviat un missatge amb un enllaç de confirmació a la teva adreça de correu electrònic. Després que hagis fet clic a l'enllaç, revisarem la sol·licitud. Se't notificarà si s'aprova. signed_up_but_pending: S'ha enviat un missatge amb un enllaç de confirmació a la teva adreça de correu electrònic. Després que hagis fet clic a l'enllaç, revisarem la sol·licitud. Se't notificarà si s'aprova.
signed_up_but_unconfirmed: S'ha enviat per correu electrònic un missatge amb un enllaç de confirmació. Fes clic a l'enllaç per a activar el compte. signed_up_but_unconfirmed: S'ha enviat per correu electrònic un missatge amb un enllaç de confirmació. Fes clic a l'enllaç per a activar el compte. Si us plau verifica la teva carpeta de correu brossa si no reps aquest correu.
update_needs_confirmation: Ha actualitzat el seu compte amb èxit, però necessitem verificar la nova adreça de correu. Si us plau comprovi el correu i segueixi l'enllaç per confirmar la nova adreça de correu. update_needs_confirmation: Has actualitzat el teu compte amb èxit, però necessitem verificar la teva nova adreça de correu. Si us plau comprova el correu i segueixi l'enllaç per confirmar la nova adreça de correu. Si us plau verifica la teva carpeta de correu brossa si no reps aquest correu.
updated: El seu compte ha estat actualitzat amb èxit. updated: El teu compte ha estat actualitzat amb èxit.
sessions: sessions:
already_signed_out: Has tancat la sessió amb èxit. already_signed_out: Has tancat la sessió amb èxit.
signed_in: T'has registrat amb èxit. signed_in: T'has registrat amb èxit.
signed_out: Has tancat la sessió amb èxit. signed_out: Has tancat la sessió amb èxit.
unlocks: unlocks:
send_instructions: En pocs minuts rebràs un correu electrònic amb instruccions sobre com desbloquejar el teu compte. Si us plau verifica la teva carpeta de correu brossa si no has rebut aquest correu. send_instructions: En pocs minuts rebràs un correu electrònic amb instruccions sobre com desbloquejar el teu compte. Si us plau verifica la teva carpeta de correu brossa si no has rebut aquest correu.
send_paranoid_instructions: Si el compte existeix, rebràs en pocs minuts un correu electrònic amb instruccions sobre com desbloquejar-lo. Verifica la carpeta de correu brossa si no has rebut aquest correu. send_paranoid_instructions: Si el teu compte existeix, rebràs en pocs minuts un correu electrònic amb instruccions sobre com desbloquejar-lo. Verifica la carpeta de correu brossa si no has rebut aquest correu.
unlocked: El compte s'ha desblocat correctament. Inicia sessió per a continuar. unlocked: El compte s'ha desbloquejat correctament. Inicia sessió per a continuar.
errors: errors:
messages: messages:
already_confirmed: ja està confirmat. Intenta d'iniciar sessió already_confirmed: ja està confirmat. Intenta d'iniciar sessió
confirmation_period_expired: calia fer la confirmació dins de %{period}, torna a sol·licitar-la confirmation_period_expired: cal fer la confirmació dins de %{period}, si us plau sol·licita-ho de nou
expired: ha expirat, demana'n una altra expired: ha expirat, si us plau demana'n una altra
not_found: no s'ha trobat not_found: no s'ha trobat
not_locked: no està bloquejada not_locked: no està bloquejada
not_saved: not_saved:
one: '1 error ha impedit desar aquest %{resource}:' one: '1 error ha impedit desar aquest %{resource}:'
other: "%{count} errors hab impedit desar aquest %{resource}:" other: "%{count} errors han impedit desar aquest %{resource}:"

View file

@ -37,21 +37,21 @@ da:
title: Adgangskode skiftet title: Adgangskode skiftet
reconfirmation_instructions: reconfirmation_instructions:
explanation: Bekræft den nye adresse for at skifte din e-mail. explanation: Bekræft den nye adresse for at skifte din e-mail.
extra: Er denne ændring ikke foranlediget af dig, så ignorér denne e-mail. Mastodon-kontoens e-mailadresse skiftes ikke, før linket ovenfor benyttes. extra: Er denne ændring ikke foranlediget af dig, så ignorér denne e-mail. Mastodon-kontoens e-mailadresse kan kun skiftes vha. linket ovenfor.
subject: 'Mastodon: Bekræft e-mail for %{instance}' subject: 'Mastodon: Bekræft e-mail for %{instance}'
title: Bekræft e-mailadresse title: Bekræft e-mailadresse
reset_password_instructions: reset_password_instructions:
action: Skift adgangskode action: Skift adgangskode
explanation: Du har anmodet om en ny kontoadgangskode. explanation: Du har anmodet om en ny kontoadgangskode.
extra: Har du ikke anmodet om dette, så ignorér denne e-mail. Din adgangskode skiftes først, når linket ovenfor er benyttet til at oprette en ny. extra: Har du ikke anmodet om dette, så ignorér denne e-mail. Din adgangskode skiftes først, når en ny er oprettet vha. linket ovenfor.
subject: 'Mastodon: Nulstil adgangskode-instruktioner' subject: 'Mastodon: Instruktioner til adgangskodenulstilling'
title: Adgangskodenulstilling title: Adgangskodenulstilling
two_factor_disabled: two_factor_disabled:
explanation: Tofaktorgodkendelse for din konto er blevet deaktiveret. Indlogning er nu kun mulig via email og adgangskode. explanation: Tofaktorgodkendelse for kontoen er blevet deaktiveret. Indlogning er nu kun mulig via email og adgangskode.
subject: 'Mastodon: Tofaktorgodkendelse deaktiveret' subject: 'Mastodon: Tofaktorgodkendelse deaktiveret'
title: 2FA deaktiveret title: 2FA deaktiveret
two_factor_enabled: two_factor_enabled:
explanation: Tofaktorgodkendelse er blevet aktiveret for din konto. Et login-token genereret af den parrede TOTP-app vil være nødvendig. explanation: Tofaktorgodkendelse er blevet aktiveret for kontoen. Indlogning vil kærve et token genereret af den parrede TOTP-app.
subject: 'Mastodon: Tofaktorgodkendelse aktiveret' subject: 'Mastodon: Tofaktorgodkendelse aktiveret'
title: 2FA aktiveret title: 2FA aktiveret
two_factor_recovery_codes_changed: two_factor_recovery_codes_changed:
@ -70,38 +70,38 @@ da:
subject: 'Mastodon: Sikkerhedsnøgle slettet' subject: 'Mastodon: Sikkerhedsnøgle slettet'
title: En af dine sikkerhedsnøgler er blevet slettet title: En af dine sikkerhedsnøgler er blevet slettet
webauthn_disabled: webauthn_disabled:
explanation: Godkendelse med sikkerhedsnøgler er blevet deaktiveret for din konto. Indlogning er nu kun mulig via token genereret af den parrede TOTP-app. explanation: Godkendelse med sikkerhedsnøgler er blevet deaktiveret for kontoen. Indlogning er nu kun mulig via token genereret af den parrede TOTP-app.
subject: 'Mastodon: Godkendelse med sikkerhedsnøgler deaktiveret' subject: 'Mastodon: Godkendelse med sikkerhedsnøgler deaktiveret'
title: Sikkerhedsnøgler deaktiveret title: Sikkerhedsnøgler deaktiveret
webauthn_enabled: webauthn_enabled:
explanation: Sikkerhedsnøglegodkendelse er aktiveret for din konto. Din sikkerhedsnøgle kan nu bruges til indlogning. explanation: Sikkerhedsnøglegodkendelse er aktiveret for kontoen. Din sikkerhedsnøgle kan nu bruges til indlogning.
subject: 'Mastodon: Sikkerhedsnøglegodkendelse aktiveret' subject: 'Mastodon: Sikkerhedsnøglegodkendelse aktiveret'
title: Sikkerhedsnøgler aktiveret title: Sikkerhedsnøgler aktiveret
omniauth_callbacks: omniauth_callbacks:
failure: Kunne ikke godkende dig fra %{kind} fordi "%{reason}". failure: Kunne ikke godkende dig fra %{kind} fordi "%{reason}".
success: Godkendt fra %{kind}-konto. success: Godkendt fra %{kind}-konto.
passwords: passwords:
no_token: Denne side er kun tilgængelig via linket fra en adgangskodenulstillings e-mail. Husk i den forbindelse at benytte den fuldstændige URL fra e-mailen. no_token: Denne side er kun tilgængelig via linket fra en e-mail til adgangskodenulstillings. Husk i den forbindelse at benytte den fuldstændige URL fra e-mailen.
send_instructions: Er din e-mailadresse allerede registreret, e-mailes du et link til adgangskodenulstilling. Tjek spammappen, hvis e-mailen ikke ses i indbakken indenfor få minutter. send_instructions: Er din e-mailadresse allerede registreret, e-mailes du et link til adgangskodenulstilling. Tjek spammappen, hvis e-mailen ikke ses i indbakken indenfor få minutter.
send_paranoid_instructions: Er din e-mail-adresse allerede registreret, e-mailes du et link til adgangskodegendannelse. Tjek spammappen, hvis e-mailen ikke ses i indbakken indenfor få minutter. send_paranoid_instructions: Er din e-mailadresse allerede registreret, e-mailes du et link til adgangskodenulstilling. Tjek spammappen, hvis e-mailen ikke ses i indbakken indenfor få minutter.
updated: Din adgangskode er skiftet, og du er nu logget ind. updated: Din adgangskode er skiftet, og du er nu logget ind.
updated_not_active: Din adgangskode er skiftet. updated_not_active: Din adgangskode er skiftet.
registrations: registrations:
destroyed: Farvel! Din konto er nu annulleret. Vi håber snart at se dig igen. destroyed: Farvel! Din konto er nu annulleret. Vi håber snart at se dig igen.
signed_up: Velkommen! Du har nu tilmeldt dig. signed_up: Velkommen! Du er nu tilmeldt.
signed_up_but_inactive: Du har nu oprettet dig. Da din konto endnu ikke er aktiveret, kan du dog pt. ikke logge ind. signed_up_but_inactive: Du har nu oprettet dig. Da din konto endnu ikke er aktiveret, kan du dog ikke logge ind med det samme.
signed_up_but_locked: Du har nu oprettet dig. Da din konto er låst, kan du pt. ikke logge ind. signed_up_but_locked: Du har nu oprettet dig. Da din konto er låst, kan du ikke logge ind med det samme.
signed_up_but_pending: En besked med et bekræftelseslink er e-mailet til dig. Når du har klikket på linket, gennemgår vi din ansøgning, og du får besked, hvis den godkendes. signed_up_but_pending: Et bekræftelseslink er e-mailet til dig. Når du har klikket på linket, gennemgår vi din ansøgning, og du får besked, hvis den godkendes.
signed_up_but_unconfirmed: En besked med et bekræftelseslink er e-mailet til dig. Følg linket for at aktivere din konto. Tjek din spammappe, hvis du ikke ser denne e-mail i din indbakke. signed_up_but_unconfirmed: Et bekræftelseslink er e-mailet til dig. Følg linket for at aktivere din konto. Tjek spammappen, hvis e-mailen ikke dukker op i indbakken.
update_needs_confirmation: Du har opdateret din konto. Din nye e-mailadresse skal dog bekræftes. For at gøre dette, tjek din e-mail og følg bekræftelseslinket. Tjek din spammappe, hvis du ikke ser denne e-mail i din indbakke indenfor få minutter. update_needs_confirmation: Du har opdateret din konto. Din nye e-mailadresse skal nu bekræftes. Til dette formål er du blevet e-mailet et bekræftelseslink, så følg dette for at bekræfte den nye e-mailadresse. Ser du ikke e-mailen i din indbakke snarest, så tjek Spam-mappen.
updated: Din konto er nu opdateret. updated: Din konto er nu opdateret.
sessions: sessions:
already_signed_out: Du er nu logget ud. already_signed_out: Du er nu logget ud.
signed_in: Du er nu logget ind. signed_in: Du er nu logget ind.
signed_out: Du er nu logget ud. signed_out: Du er nu logget ud.
unlocks: unlocks:
send_instructions: Instruktioner mailes til dig om, hvordan du oplåser din konto. Er denne e-mail ikke er i din indbakke inden for få minutter, så tjek spammappe. send_instructions: Instruktioner e-mailes til dig om, hvordan du oplåser din konto. Er e-mailen ikke er i din indbakke inden for få minutter, så tjek i Spam.
send_paranoid_instructions: Findes din konto, mailes du instrukser om, hvordan du oplåser den. Ser du ikke denne e-mail i din indbakke undenfor få minutter, så tjek spammappen. send_paranoid_instructions: Findes din konto, e-mailes du instrukser om, hvordan du oplåser den. Er e-mailen i din indbakke indenfor få minutter, så tjek i Spam.
unlocked: Din konto er nu oplåst. Log ind for at fortsætte. unlocked: Din konto er nu oplåst. Log ind for at fortsætte.
errors: errors:
messages: messages:

View file

@ -13,9 +13,9 @@ ca:
attributes: attributes:
redirect_uri: redirect_uri:
fragment_present: no pot contenir un fragment. fragment_present: no pot contenir un fragment.
invalid_uri: ha de ser un URI válid. invalid_uri: ha de ser una URI vàlida.
relative_uri: ha de ser un URI absoluta. relative_uri: ha de ser una URI absoluta.
secured_uri: ha de ser un URI HTTPS/SSL. secured_uri: ha de ser una URI HTTPS/SSL.
doorkeeper: doorkeeper:
applications: applications:
buttons: buttons:
@ -82,9 +82,9 @@ ca:
messages: messages:
access_denied: El propietari del recurs o servidor d'autorizació ha denegat la petició. access_denied: El propietari del recurs o servidor d'autorizació ha denegat la petició.
credential_flow_not_configured: Les credencials de contrasenya del propietari del recurs han fallat degut a que Doorkeeper.configure.resource_owner_from_credentials està sense configurar. credential_flow_not_configured: Les credencials de contrasenya del propietari del recurs han fallat degut a que Doorkeeper.configure.resource_owner_from_credentials està sense configurar.
invalid_client: La autentificació del client ha fallat perquè és un client desconegut o no està inclòs l'autentificació del client o el mètode d'autenticació no està confirmat. invalid_client: La autentificació del client ha fallat perquè és un client desconegut o no està inclòsa l'autentificació del client o el mètode d'autenticació no està confirmat.
invalid_grant: La concessió d'autorizació oferida és invàlida, ha vençut, s'ha revocat, no coincideix amb l'URI de redirecció utilizada en la petició d'autorizació, o fou emesa per a un altre client. invalid_grant: La concessió d'autorizació oferta és invàlida, ha vençut, s'ha revocat, no coincideix amb l'URI de redirecció utilizada en la petició d'autorizació, o fou emesa per a un altre client.
invalid_redirect_uri: L'URI de redirecció inclòs no és vàlid. invalid_redirect_uri: L'uri de redirecció inclòsa no és vàlida.
invalid_request: invalid_request:
missing_param: 'Falta paràmetre requerit: %{value}.' missing_param: 'Falta paràmetre requerit: %{value}.'
request_not_authorized: La petició ha de ser autoritzada. Falta o és invàlid un paràmetre requerit per l'autorització de la petició. request_not_authorized: La petició ha de ser autoritzada. Falta o és invàlid un paràmetre requerit per l'autorització de la petició.
@ -154,7 +154,7 @@ ca:
admin:write:accounts: fer l'acció de moderació en els comptes admin:write:accounts: fer l'acció de moderació en els comptes
admin:write:reports: fer l'acció de moderació en els informes admin:write:reports: fer l'acció de moderació en els informes
crypto: usa xifrat d'extrem a extrem crypto: usa xifrat d'extrem a extrem
follow: seguir, blocar, desblocar i deixar de seguir comptes follow: modificar relacions dels comptes
push: rebre notificacions push del teu compte push: rebre notificacions push del teu compte
read: llegir les dades del teu compte read: llegir les dades del teu compte
read:accounts: veure informació dels comptes read:accounts: veure informació dels comptes
@ -168,13 +168,13 @@ ca:
read:notifications: veure les teves notificacions read:notifications: veure les teves notificacions
read:reports: veure els teus informes read:reports: veure els teus informes
read:search: cerca en nom teu read:search: cerca en nom teu
read:statuses: veure tots els tuts read:statuses: veure tots les publicacions
write: publicar en el teu nom write: modificar totes les dades del teu compte
write:accounts: modifica el teu perfil write:accounts: modifica el teu perfil
write:blocks: bloqueja comptes i dominis write:blocks: bloqueja comptes i dominis
write:bookmarks: publicacions a marcadors write:bookmarks: publicacions a marcadors
write:conversations: silencia i esborra converses write:conversations: silencia i esborra converses
write:favourites: afavoreix tuts write:favourites: afavoreix publicacions
write:filters: crear filtres write:filters: crear filtres
write:follows: seguir usuaris write:follows: seguir usuaris
write:lists: crear llistes write:lists: crear llistes
@ -182,4 +182,4 @@ ca:
write:mutes: silencia usuaris i converses write:mutes: silencia usuaris i converses
write:notifications: esborra les teves notificacions write:notifications: esborra les teves notificacions
write:reports: informe daltres persones write:reports: informe daltres persones
write:statuses: publicar tuts write:statuses: publicar publicacions

View file

@ -4,7 +4,7 @@ da:
attributes: attributes:
doorkeeper/application: doorkeeper/application:
name: Applikationsnavn name: Applikationsnavn
redirect_uri: Link redirect_uri: Omdirigerings-URI
scopes: Områder scopes: Områder
website: Applikationswebsted website: Applikationswebsted
errors: errors:
@ -13,7 +13,7 @@ da:
attributes: attributes:
redirect_uri: redirect_uri:
fragment_present: kan ikke indeholde et fragment. fragment_present: kan ikke indeholde et fragment.
invalid_uri: skal være en gyldigt URI. invalid_uri: skal være en gyldig URI.
relative_uri: skal være en absolut URI. relative_uri: skal være en absolut URI.
secured_uri: skal være en HTTPS-/SSL-URI. secured_uri: skal være en HTTPS-/SSL-URI.
doorkeeper: doorkeeper:
@ -33,7 +33,7 @@ da:
help: help:
native_redirect_uri: Brug %{native_redirect_uri} til lokale tests native_redirect_uri: Brug %{native_redirect_uri} til lokale tests
redirect_uri: Brug én linje pr. URI redirect_uri: Brug én linje pr. URI
scopes: Adskil omfang med mellemrum. Lad være tomt for standardomfang. scopes: Adskil omfang med mellemrum. Lad stå tomt for standardomfang.
index: index:
application: Applikation application: Applikation
callback_url: Callback-URL callback_url: Callback-URL
@ -60,9 +60,9 @@ da:
error: error:
title: En fejl opstod title: En fejl opstod
new: new:
prompt_html: "%{client_name} ønsker tilladelse til at tilgå din konto. Den er en tredjepartsapplikation. <strong>Er der ikke tillid til den, bør den ikke godkendes.</strong>" prompt_html: "%{client_name} ønsker tilladelse til at tilgå din konto. Den er en tredjepartsapplikation. <strong>Har du ikke tillid til den, bør den ikke godkendes.</strong>"
review_permissions: Gennemgå tilladelser review_permissions: Gennemgå tilladelser
title: Godkendelse krævet title: Godkendelse kræves
show: show:
title: Kopiér og indsæt denne godkendelseskode i applikationen. title: Kopiér og indsæt denne godkendelseskode i applikationen.
authorized_applications: authorized_applications:
@ -72,7 +72,7 @@ da:
revoke: Sikker? revoke: Sikker?
index: index:
authorized_at: Godkendt pr. %{date} authorized_at: Godkendt pr. %{date}
description_html: Disse er applikationer, som kan tilgå din konto vha. API'en. Er der applikationer her, som ikke genkendes eller udviser mærkelig adfærd, kan deres adgang tilbagekaldes. description_html: Disse er applikationer, som kan tilgå din konto vha. API'en. Er her applikationer, som ikke genkendes eller udviser mærkværdig adfærd, kan deres adgangstilladelse ophæves.
last_used_at: Senest brugt pr. %{date} last_used_at: Senest brugt pr. %{date}
never_used: Aldrig brugt never_used: Aldrig brugt
scopes: Tilladelser scopes: Tilladelser
@ -81,25 +81,25 @@ da:
errors: errors:
messages: messages:
access_denied: Ressourceejeren eller godkendelsesserveren afviste anmodningen. access_denied: Ressourceejeren eller godkendelsesserveren afviste anmodningen.
credential_flow_not_configured: Ressourceejeradgangskodeakkreditiv flow mislykkedes grundet ikke-opsat Doorkeeper.configure.resource_owner_from_credentials. credential_flow_not_configured: Ressourceejeradgangskodeakkreditiver-flow mislykkedes grundet ikke-opsat Doorkeeper.configure.resource_owner_from_credentials.
invalid_client: Klientbekræftelse mislykkedes grundet en ukendt klient, ingen klientbekræftelse inkluderet, eller uunderstøttet bekræftelsesmetode. invalid_client: Klientgodkendelse mislykkedes grundet en ukendt klient, ingen inkluderet klientgodkendelse eller uunderstøttet godkendelsesmetode.
invalid_grant: Den leverede godkendelse er ugyldig, udløbet, tilbagekaldt, matcher ikke omdirigerings-URI brugt i godkendelsesanmodningen, eller er udstedt til en anden klient. invalid_grant: Den leverede godkendelse er ugyldig, udløbet, ophævet, matcher ikke omdirigerings-URI'en brugt i godkendelsesanmodningen eller er udstedt til en anden klient.
invalid_redirect_uri: Inkluderede ormdirigerings-URI er ugyldig. invalid_redirect_uri: Inkluderede ormdirigerings-URI er ugyldig.
invalid_request: invalid_request:
missing_param: 'Mangler krævet parameter: %{value}.' missing_param: 'Mangler obligatoriske parameter: %{value}.'
request_not_authorized: Anmodning skal godkendes. Krævet parameter til godkendelse af anmodning mangler eller er ugyldig. request_not_authorized: Anmodning kræver godkendelse. Obligatorisk parameter til godkendelse af anmodning mangler eller er ugyldig.
unknown: Anmodningen mangler en krævet parametre, inkluderer en uunderstøttet parametre værdi eller er på anden vis fejlbehæftet. unknown: Anmodningen mangler en obligatorisk parameter, indeholder en uunderstøttet parameterværdi eller er på anden vis fejlbehæftet.
invalid_resource_owner: De angivne ressourceejerakkreditiver er ugyldige, eller ressourceejer kunne ikke findes invalid_resource_owner: De angivne ressourceejerakkreditiver er ugyldige, eller ressourceejer kan ikke findes
invalid_scope: Det anmodede omfang er ugyldigt, ukendt eller fejlbehæftet. invalid_scope: Det anmodede omfang er ugyldigt, ukendt eller forkert udformet.
invalid_token: invalid_token:
expired: Adgangstoken er udløbet expired: Adgangstoken er udløbet
revoked: Adgangstoken er tilbagekaldt revoked: Adgangstoken er ophævet
unknown: Adgangstoken er ugyldig unknown: Adgangstoken er ugyldigt
resource_owner_authenticator_not_configured: Ressourceejer kunne ikke findes grundet ikke-opsat Doorkeeper.configure.resource_owner_authenticator. resource_owner_authenticator_not_configured: Ressourceejer kunne ikke findes grundet ikke-opsat Doorkeeper.configure.resource_owner_authenticator.
server_error: Godkejdelsesserveren stødte på en uventet betingelse, der forhindrede den i at imødekomme anmodningen. server_error: Godkejdelsesserveren stødte på en uventet betingelse, der forhindrede den i at imødekomme anmodningen.
temporarily_unavailable: Godkendelsesserveren kan pt. ikke håndtere anmodningen grundet midlertidig overbelastning eller servervedligehold. temporarily_unavailable: Godkendelsesserveren kan pt. ikke håndtere anmodningen grundet midlertidig overbelastning eller servervedligehold.
unauthorized_client: Klienten er ikke godkendt til at udføre denne anmodning via denne metode. unauthorized_client: Klienten er ikke godkendt til at udføre denne anmodning vha. denne metode.
unsupported_grant_type: Godkendelsestypen understøttes ikke af godkendelsesserveren. unsupported_grant_type: Godkendelsestildelingstypen understøttes ikke af godkendelsesserveren.
unsupported_response_type: Godkendelsesserveren understøtter ikke denne svartype. unsupported_response_type: Godkendelsesserveren understøtter ikke denne svartype.
flash: flash:
applications: applications:
@ -111,7 +111,7 @@ da:
notice: Applikation opdateret. notice: Applikation opdateret.
authorized_applications: authorized_applications:
destroy: destroy:
notice: Applikation tilbagekaldt. notice: Applikation ophævet.
grouped_scopes: grouped_scopes:
access: access:
read: Skrivebeskyttet adgang read: Skrivebeskyttet adgang
@ -133,7 +133,7 @@ da:
follows: Følger follows: Følger
lists: Lister lists: Lister
media: Medievedhæftninger media: Medievedhæftninger
mutes: Tavsgjorte mutes: Tavsgørelser
notifications: Notifikationer notifications: Notifikationer
push: Push-notifikationer push: Push-notifikationer
reports: Anmeldelser reports: Anmeldelser
@ -143,43 +143,43 @@ da:
admin: admin:
nav: nav:
applications: Applikationer applications: Applikationer
oauth2_provider: OAuth-udbyder oauth2_provider: OAuth2-leverandør
application: application:
title: OAuth-godkendelse krævet title: OAuth-godkendelse obligatorisk
scopes: scopes:
admin:read: læs al data på serveren admin:read: læs alle data på serveren
admin:read:accounts: læs sensitiv information fra alle konti admin:read:accounts: læs sensitiv information fra alle konti
admin:read:reports: læs sensitiv information fra alle anmeldelser og anmeldte konti admin:read:reports: læs sensitiv information fra alle anmeldelser og anmeldte konti
admin:write: redigér al data på serveren admin:write: redigér alle data på serveren
admin:write:accounts: udfør modereringshandlinger på konti admin:write:accounts: udfør modereringshandlinger på konti
admin:write:reports: udfør modereringshandlinger på anmeldelser admin:write:reports: udfør modereringshandlinger på anmeldelser
crypto: benyt ende-til-ende kryptering crypto: benyt ende-til-ende kryptering
follow: ændre kontorelationer follow: ændre kontorelationer
push: modtage dine push-notifikationer push: modtag dine push-notifikationer
read: læse alle dine kontodata read: læs alle dine kontodata
read:accounts: se kontooplysninger read:accounts: se kontooplysninger
read:blocks: se dine blokeringer read:blocks: se dine blokeringer
read:bookmarks: se dine bogmærker read:bookmarks: se dine bogmærker
read:favourites: se dine favoritter read:favourites: se dine favoritter
read:filters: se dine filtre read:filters: se dine filtre
read:follows: se, hvem du følger read:follows: se dine følger
read:lists: se dine lister read:lists: se dine lister
read:mutes: se dine tavsgørelser read:mutes: se dine tavsgørelser
read:notifications: se dine notifikationer read:notifications: se dine notifikationer
read:reports: se dine anmeldelser read:reports: se dine anmeldelser
read:search: søge på dine vegne read:search: søg på dine vegne
read:statuses: se alle statusser read:statuses: se alle indlæg
write: ændre alle dine kontodata write: ændre alle dine kontodata
write:accounts: ændre din profil write:accounts: ændre din profil
write:blocks: blokere konti og domæner write:blocks: blokere konti og domæner
write:bookmarks: bogmærke statusser write:bookmarks: bogmærke indlæg
write:conversations: tavsgør og slet konversationer write:conversations: tavsgøre og slette konversationer
write:favourites: favoritmarkerede indlæg write:favourites: favoritmarkere indlæg
write:filters: oprette filtre write:filters: oprette filtre
write:follows: følge personer write:follows: følge personer
write:lists: oprette lister write:lists: oprette lister
write:media: uploade multimediefiler write:media: uploade mediefiler
write:mutes: tavsgøre personer og konversationer write:mutes: tavsgøre personer og konversationer
write:notifications: rydde dine notifikationer write:notifications: rydde dine notifikationer
write:reports: anmelde personer write:reports: anmelde personer
write:statuses: udgive statusser write:statuses: udgive indlæg

View file

@ -101,6 +101,7 @@ sk:
notice: Oprávnenia aplikácie zrušené. notice: Oprávnenia aplikácie zrušené.
grouped_scopes: grouped_scopes:
title: title:
blocks: Blokovania
mutes: Nevšímané mutes: Nevšímané
layouts: layouts:
admin: admin:

View file

@ -109,7 +109,11 @@ uk:
grouped_scopes: grouped_scopes:
title: title:
accounts: Облікові записи accounts: Облікові записи
admin/reports: Адміністрація звітів
all: Усе all: Усе
blocks: Блокування
bookmarks: Закладки
conversations: Бесіди
crypto: Наскрізне шифрування crypto: Наскрізне шифрування
filters: Фільтри filters: Фільтри
lists: Списки lists: Списки

View file

@ -71,13 +71,13 @@ vi:
confirmations: confirmations:
revoke: Bạn có chắc không? revoke: Bạn có chắc không?
index: index:
authorized_at: Cấp quyền vào %{date} authorized_at: Cho phép vào %{date}
description_html: Đây là những ứng dụng có thể truy cập tài khoản của bạn bằng API. Nếu có ứng dụng bạn không nhận ra ở đây hoặc ứng dụng hoạt động sai, bạn có thể thu hồi quyền truy cập của ứng dụng đó. description_html: Đây là những ứng dụng có thể truy cập tài khoản của bạn bằng API. Nếu có ứng dụng bạn không nhận ra ở đây hoặc ứng dụng hoạt động sai, bạn có thể thu hồi quyền truy cập của ứng dụng đó.
last_used_at: Dùng gần nhất vào %{date} last_used_at: Dùng lần cuối %{date}
never_used: Chưa dùng bao giờ never_used: Chưa dùng
scopes: Quyền cho phép scopes: Quyền cho phép
superapp: Đang dùng superapp: Đang dùng
title: Các ứng dụng đang cho phép title: Các ứng dụng đang dùng
errors: errors:
messages: messages:
access_denied: Chủ sở hữu tài nguyên hoặc máy chủ đã từ chối yêu cầu. access_denied: Chủ sở hữu tài nguyên hoặc máy chủ đã từ chối yêu cầu.

View file

@ -490,6 +490,7 @@ en:
other: Failed attempts on %{count} different days. other: Failed attempts on %{count} different days.
no_failures_recorded: No failures on record. no_failures_recorded: No failures on record.
title: Availability title: Availability
warning: The last attempt to connect to this server has been unsuccessful
back_to_all: All back_to_all: All
back_to_limited: Limited back_to_limited: Limited
back_to_warning: Warning back_to_warning: Warning

View file

@ -716,7 +716,7 @@ ja:
trends: trends:
allow: 許可 allow: 許可
approved: 承認 approved: 承認
disallow: 不許可 disallow: 拒否
links: links:
allow: リンクの許可 allow: リンクの許可
allow_provider: 発行者の承認 allow_provider: 発行者の承認
@ -731,8 +731,11 @@ ja:
title: 発行者 title: 発行者
rejected: 拒否 rejected: 拒否
statuses: statuses:
allow: 投稿を許可する allow: 掲載を許可
disallow: 投稿を許可しない allow_account: 投稿者を許可
disallow: 掲載を拒否
disallow_account: 投稿者を拒否
title: トレンド投稿
tags: tags:
current_score: 現在のスコア %{score} current_score: 現在のスコア %{score}
dashboard: dashboard:
@ -1309,6 +1312,7 @@ ja:
default_language: UIの表示言語 default_language: UIの表示言語
disallowed_hashtags: disallowed_hashtags:
other: '許可されていないハッシュタグが含まれています: %{tags}' other: '許可されていないハッシュタグが含まれています: %{tags}'
edited_at_html: "%{date} 編集済み"
errors: errors:
in_reply_not_found: あなたが返信しようとしている投稿は存在しないようです。 in_reply_not_found: あなたが返信しようとしている投稿は存在しないようです。
open_in_web: Webで開く open_in_web: Webで開く

View file

@ -21,7 +21,7 @@ ku:
documentation: Pelbend documentation: Pelbend
federation_hint_html: Bi ajimêrê xwe %{instance} re tu dikarî kesên rajekar û li derveyî mastodonê bişopînî. federation_hint_html: Bi ajimêrê xwe %{instance} re tu dikarî kesên rajekar û li derveyî mastodonê bişopînî.
get_apps: Sepaneke mobîl bicerbîne get_apps: Sepaneke mobîl bicerbîne
hosted_on: Mastodon li ser%{domain} tê hildanê hosted_on: Mastodon li ser %{domain} tê pêşkêşkirin
instance_actor_flash: 'Ev ajimêr aktorekî aşopî ye ji bo rajekar were temsîl kirin tê bikaranîn ne ajimêra kesî ye. Ji bo armanca federasyonê dixebite û divê ney asteng kirin heta ku te xwest hemû nimûneyan asteng bikî, di vir de ger tu blogek navper bikarbînî. instance_actor_flash: 'Ev ajimêr aktorekî aşopî ye ji bo rajekar were temsîl kirin tê bikaranîn ne ajimêra kesî ye. Ji bo armanca federasyonê dixebite û divê ney asteng kirin heta ku te xwest hemû nimûneyan asteng bikî, di vir de ger tu blogek navper bikarbînî.
' '
@ -904,9 +904,9 @@ ku:
sensitive_content: Naveroka hestiyarî sensitive_content: Naveroka hestiyarî
toot_layout: Xêzkirina şandîya toot_layout: Xêzkirina şandîya
application_mailer: application_mailer:
notification_preferences: Hevyazên e-name yê biguherîne notification_preferences: Sazkariyên e-nameyê biguherîne
salutation: "%{name}," salutation: "%{name},"
settings: 'Hevyazên e-name yê biguherîne: %{link}' settings: 'Sazkariyên e-nameyê biguherîne: %{link}'
view: 'Nîşan bide:' view: 'Nîşan bide:'
view_profile: Profîlê nîşan bide view_profile: Profîlê nîşan bide
view_status: Şandiyê nîşan bide view_status: Şandiyê nîşan bide
@ -1596,7 +1596,7 @@ ku:
<p>Originally adapted from the <a href="https://github.com/discourse/discourse">Discourse privacy policy</a>.</p> <p>Originally adapted from the <a href="https://github.com/discourse/discourse">Discourse privacy policy</a>.</p>
title: "%{instance} mercên bikaranîn û politîkayên nehêniyê" title: "%{instance} mercên bikaranîn û politîkayên nehêniyê"
themes: themes:
contrast: Mastodon (dijberiya bilind) contrast: Mastodon (Dijberiya bilind)
default: Mastodon (Tarî) default: Mastodon (Tarî)
mastodon-light: Mastodon (Ronahî) mastodon-light: Mastodon (Ronahî)
time: time:
@ -1635,8 +1635,8 @@ ku:
title: Pakêtkirina arşîvan title: Pakêtkirina arşîvan
sign_in_token: sign_in_token:
details: 'Li vir hûrgiliyên hewldanê hene:' details: 'Li vir hûrgiliyên hewldanê hene:'
explanation: 'Me hewildanek têketina ajimêra te ji navnîşana IPya nenas nas kir. Ger ev tu bî, ji kerema xwe koda ewlehiyê ya jêr têkeve rûpela jêpirsînê:' explanation: 'Me hewildanek têketina ajimêra te ji navnîşana IP ya nenas destnîşan kir. Ger ev tu bî, ji kerema xwe koda ewlehiyê ya jêr binivîsîne di rûpela jêpirsînê de:'
further_actions: 'Ger ev ne tu bî, ji kerema xwe re şîfreya xwe biguherîne û li ser hesaba xwe rastkirina du-gavî çalak bike. Tu dikarî wê ji vê derê çêkî:' further_actions: 'Ger ev ne tu bî, ji kerema xwe re pêborîna xwe biguherîne û li ser ajimêra xwe rastkirina du-gavî çalak bike. Tu dikarî wê ji vê derê çê bikî:'
subject: Ji kerema xwe re hewldanên têketinê piştrast bike subject: Ji kerema xwe re hewldanên têketinê piştrast bike
title: Hewldanên têketinê title: Hewldanên têketinê
warning: warning:

View file

@ -27,6 +27,8 @@ ja:
scheduled_at: お知らせを今すぐ掲載する場合は空欄にしてください scheduled_at: お知らせを今すぐ掲載する場合は空欄にしてください
starts_at: オプションです。お知らせしたい事柄の期間が決まっている場合に使用します starts_at: オプションです。お知らせしたい事柄の期間が決まっている場合に使用します
text: 投稿と同じ構文を使用できます。アナウンスが占める画面のスペースに注意してください text: 投稿と同じ構文を使用できます。アナウンスが占める画面のスペースに注意してください
appeal:
text: 一度だけ異議を申し立てることができます
defaults: defaults:
autofollow: 招待から登録した人が自動的にあなたをフォローするようになります autofollow: 招待から登録した人が自動的にあなたをフォローするようになります
avatar: "%{size}までのPNG、GIF、JPGが利用可能です。%{dimensions}pxまで縮小されます" avatar: "%{size}までのPNG、GIF、JPGが利用可能です。%{dimensions}pxまで縮小されます"
@ -116,6 +118,8 @@ ja:
scheduled_at: 掲載予約日時 scheduled_at: 掲載予約日時
starts_at: 予定開始日時 starts_at: 予定開始日時
text: お知らせ text: お知らせ
appeal:
text: この決定を覆すべき理由を説明してください
defaults: defaults:
autofollow: 招待から参加後、あなたをフォロー autofollow: 招待から参加後、あなたをフォロー
avatar: アイコン avatar: アイコン
@ -194,6 +198,7 @@ ja:
sign_up_requires_approval: 登録を制限 sign_up_requires_approval: 登録を制限
severity: ルール severity: ルール
notification_emails: notification_emails:
appeal: モデレーターの判断に異議申し立てが行われました
digest: タイムラインからピックアップしてメールで通知する digest: タイムラインからピックアップしてメールで通知する
favourite: お気に入り登録された時 favourite: お気に入り登録された時
follow: フォローされた時 follow: フォローされた時
@ -201,6 +206,8 @@ ja:
mention: 返信が来た時 mention: 返信が来た時
pending_account: 新しいアカウントの承認が必要な時 pending_account: 新しいアカウントの承認が必要な時
reblog: 投稿がブーストされた時 reblog: 投稿がブーストされた時
report: 新しいレポートが送信されました
trending_tag: 新しいトレンドタグにはレビューが必要です
rule: rule:
text: ルール text: ルール
tag: tag:

View file

@ -153,6 +153,9 @@ sk:
comment: Okomentuj comment: Okomentuj
invite_request: invite_request:
text: Prečo sa k nám chceš pridať? text: Prečo sa k nám chceš pridať?
ip_block:
comment: Komentár
severity: Pravidlo
notification_emails: notification_emails:
digest: Zasielať súhrnné emaily digest: Zasielať súhrnné emaily
favourite: Zaslať email, ak si niekto obľúbi tvoj príspevok favourite: Zaslať email, ak si niekto obľúbi tvoj príspevok

View file

@ -133,6 +133,7 @@ th:
expires_in: หมดอายุหลังจาก expires_in: หมดอายุหลังจาก
fields: ข้อมูลเมตาโปรไฟล์ fields: ข้อมูลเมตาโปรไฟล์
header: ส่วนหัว header: ส่วนหัว
honeypot: "%{label} (ไม่ต้องกรอก)"
inbox_url: URL กล่องขาเข้าแบบรีเลย์ inbox_url: URL กล่องขาเข้าแบบรีเลย์
irreversible: ลบแทนที่จะซ่อน irreversible: ลบแทนที่จะซ่อน
locale: ภาษาส่วนติดต่อ locale: ภาษาส่วนติดต่อ
@ -194,6 +195,7 @@ th:
sign_up_requires_approval: จำกัดการลงทะเบียน sign_up_requires_approval: จำกัดการลงทะเบียน
severity: กฎ severity: กฎ
notification_emails: notification_emails:
appeal: ใครสักคนอุทธรณ์การตัดสินใจของผู้ควบคุม
digest: ส่งอีเมลสรุป digest: ส่งอีเมลสรุป
favourite: ใครสักคนได้ชื่นชอบโพสต์ของคุณ favourite: ใครสักคนได้ชื่นชอบโพสต์ของคุณ
follow: ใครสักคนได้ติดตามคุณ follow: ใครสักคนได้ติดตามคุณ

View file

@ -15,6 +15,7 @@ sk:
contact: Kontakt contact: Kontakt
contact_missing: Nezadaný contact_missing: Nezadaný
contact_unavailable: Neuvedený/á contact_unavailable: Neuvedený/á
continue_to_web: Pokračovať na webovú aplikáciu
discover_users: Objavuj užívateľov discover_users: Objavuj užívateľov
documentation: Dokumentácia documentation: Dokumentácia
federation_hint_html: S účtom na %{instance} budeš môcť následovať ľúdí na hociakom Mastodon serveri, ale aj na iných serveroch. federation_hint_html: S účtom na %{instance} budeš môcť následovať ľúdí na hociakom Mastodon serveri, ale aj na iných serveroch.
@ -24,6 +25,7 @@ sk:
Tento účet je virtuálnym aktérom, ktorý predstavuje samotný server a nie žiadného jedného užívateľa. Tento účet je virtuálnym aktérom, ktorý predstavuje samotný server a nie žiadného jedného užívateľa.
Je využívaný pre potreby federovania a nemal by byť blokovaný, pokiaľ nechceš zablokovať celý server, čo ide lepšie dosiahnúť cez blokovanie domény. Je využívaný pre potreby federovania a nemal by byť blokovaný, pokiaľ nechceš zablokovať celý server, čo ide lepšie dosiahnúť cez blokovanie domény.
learn_more: Zisti viac learn_more: Zisti viac
logged_in_as_html: Práve si prihlásený/á ako %{username}.
logout_before_registering: Už si prihlásený/á. logout_before_registering: Už si prihlásený/á.
privacy_policy: Zásady súkromia privacy_policy: Zásady súkromia
rules: Serverové pravidlá rules: Serverové pravidlá

View file

@ -52,6 +52,7 @@ th:
what_is_mastodon: Mastodon คืออะไร? what_is_mastodon: Mastodon คืออะไร?
accounts: accounts:
choices_html: 'ตัวเลือกของ %{name}:' choices_html: 'ตัวเลือกของ %{name}:'
endorsements_hint: คุณสามารถแนะนำผู้คนที่คุณติดตามจากส่วนติดต่อเว็บ และเขาจะปรากฏที่นี่
featured_tags_hint: คุณสามารถแนะนำแฮชแท็กที่เฉพาะเจาะจงที่จะแสดงที่นี่ featured_tags_hint: คุณสามารถแนะนำแฮชแท็กที่เฉพาะเจาะจงที่จะแสดงที่นี่
follow: ติดตาม follow: ติดตาม
followers: followers:
@ -66,6 +67,8 @@ th:
nothing_here: ไม่มีสิ่งใดที่นี่! nothing_here: ไม่มีสิ่งใดที่นี่!
people_followed_by: ผู้คนที่ %{name} ติดตาม people_followed_by: ผู้คนที่ %{name} ติดตาม
people_who_follow: ผู้คนที่ติดตาม %{name} people_who_follow: ผู้คนที่ติดตาม %{name}
pin_errors:
following: คุณต้องกำลังติดตามคนที่คุณต้องการแนะนำอยู่แล้ว
posts: posts:
other: โพสต์ other: โพสต์
posts_tab_heading: โพสต์ posts_tab_heading: โพสต์
@ -269,6 +272,7 @@ th:
update_domain_block: อัปเดตการปิดกั้นโดเมน update_domain_block: อัปเดตการปิดกั้นโดเมน
update_status: อัปเดตโพสต์ update_status: อัปเดตโพสต์
actions: actions:
approve_appeal_html: "%{name} ได้อนุมัติการอุทธรณ์การตัดสินใจในการควบคุมจาก %{target}"
approve_user_html: "%{name} ได้อนุมัติการลงทะเบียนจาก %{target}" approve_user_html: "%{name} ได้อนุมัติการลงทะเบียนจาก %{target}"
assigned_to_self_report_html: "%{name} ได้มอบหมายรายงาน %{target} ให้กับตนเอง" assigned_to_self_report_html: "%{name} ได้มอบหมายรายงาน %{target} ให้กับตนเอง"
change_email_user_html: "%{name} ได้เปลี่ยนที่อยู่อีเมลของผู้ใช้ %{target}" change_email_user_html: "%{name} ได้เปลี่ยนที่อยู่อีเมลของผู้ใช้ %{target}"
@ -299,6 +303,7 @@ th:
enable_user_html: "%{name} ได้เปิดใช้งานการเข้าสู่ระบบสำหรับผู้ใช้ %{target}" enable_user_html: "%{name} ได้เปิดใช้งานการเข้าสู่ระบบสำหรับผู้ใช้ %{target}"
memorialize_account_html: "%{name} ได้เปลี่ยนบัญชีของ %{target} เป็นหน้าอนุสรณ์" memorialize_account_html: "%{name} ได้เปลี่ยนบัญชีของ %{target} เป็นหน้าอนุสรณ์"
promote_user_html: "%{name} ได้เลื่อนขั้นผู้ใช้ %{target}" promote_user_html: "%{name} ได้เลื่อนขั้นผู้ใช้ %{target}"
reject_appeal_html: "%{name} ได้ปฏิเสธการอุทธรณ์การตัดสินใจในการควบคุมจาก %{target}"
reject_user_html: "%{name} ได้ปฏิเสธการลงทะเบียนจาก %{target}" reject_user_html: "%{name} ได้ปฏิเสธการลงทะเบียนจาก %{target}"
remove_avatar_user_html: "%{name} ได้เอาภาพประจำตัวของ %{target} ออก" remove_avatar_user_html: "%{name} ได้เอาภาพประจำตัวของ %{target} ออก"
reopen_report_html: "%{name} ได้เปิดรายงาน %{target} ใหม่" reopen_report_html: "%{name} ได้เปิดรายงาน %{target} ใหม่"
@ -786,6 +791,9 @@ th:
sensitive: เพื่อทำเครื่องหมายบัญชีของเขาว่าละเอียดอ่อน sensitive: เพื่อทำเครื่องหมายบัญชีของเขาว่าละเอียดอ่อน
silence: เพื่อจำกัดบัญชีของเขา silence: เพื่อจำกัดบัญชีของเขา
suspend: เพื่อระงับบัญชีของเขา suspend: เพื่อระงับบัญชีของเขา
body: "%{target} กำลังอุทธรณ์การตัดสินใจในการควบคุมโดย %{action_taken_by} จาก %{date} ซึ่งเป็น %{type} เขาเขียนว่า:"
next_steps: คุณสามารถอนุมัติการอุทธรณ์เพื่อเลิกทำการตัดสินใจในการควบคุม หรือเพิกเฉยการอุทธรณ์
subject: "%{username} กำลังอุทธรณ์การตัดสินใจในการควบคุมใน %{instance}"
new_pending_account: new_pending_account:
body: รายละเอียดของบัญชีใหม่อยู่ด้านล่าง คุณสามารถอนุมัติหรือปฏิเสธใบสมัครนี้ body: รายละเอียดของบัญชีใหม่อยู่ด้านล่าง คุณสามารถอนุมัติหรือปฏิเสธใบสมัครนี้
new_report: new_report:

View file

@ -459,6 +459,17 @@ uk:
back_to_warning: Попередження back_to_warning: Попередження
by_domain: Домен by_domain: Домен
confirm_purge: Ви впевнені, що хочете видалити ці дані з цього домену? confirm_purge: Ви впевнені, що хочете видалити ці дані з цього домену?
content_policies:
policies:
reject_media: Відхилити медіа
reject_reports: Відхилити скарги
silence: Обмеження
suspend: Призупинити
policy: Правила
reason: Суспільна причина
title: Політика вмісту
dashboard:
instance_languages_dimension: Найуживаніші мови
delivery: delivery:
all: Усі all: Усі
clear: Очистити помилки доставляння clear: Очистити помилки доставляння
@ -731,6 +742,10 @@ uk:
rejected: Посилання цього публікатора можуть не будуть популярними rejected: Посилання цього публікатора можуть не будуть популярними
title: Публікатори title: Публікатори
rejected: Відхилено rejected: Відхилено
statuses:
allow: Дозволити оприлюднення
allow_account: Дозволити автора
disallow_account: Заборонити автора
tags: tags:
current_score: Поточний результат %{score} current_score: Поточний результат %{score}
dashboard: dashboard:
@ -1334,6 +1349,7 @@ uk:
many: 'заборонених хештеґів: %{tags}' many: 'заборонених хештеґів: %{tags}'
one: 'заборонений хештеґ: %{tags}' one: 'заборонений хештеґ: %{tags}'
other: 'заборонених хештеґів: %{tags}' other: 'заборонених хештеґів: %{tags}'
edited_at_html: Відредаговано %{date}
errors: errors:
in_reply_not_found: Статуса, на який ви намагаєтеся відповісти, не існує. in_reply_not_found: Статуса, на який ви намагаєтеся відповісти, не існує.
open_in_web: Відкрити у вебі open_in_web: Відкрити у вебі
@ -1396,7 +1412,7 @@ uk:
'2629746': 1 місяць '2629746': 1 місяць
'31556952': 1 рік '31556952': 1 рік
'5259492': 2 місяці '5259492': 2 місяці
'604800': 1 week '604800': 1 тиждень
'63113904': 2 роки '63113904': 2 роки
'7889238': 3 місяці '7889238': 3 місяці
min_age_label: Поріг давності min_age_label: Поріг давності

View file

@ -51,7 +51,7 @@ vi:
user_count_after: user_count_after:
other: người dùng other: người dùng
user_count_before: Nhà của user_count_before: Nhà của
what_is_mastodon: Tham gia Mastodon what_is_mastodon: Mastodon
accounts: accounts:
choices_html: "%{name} tôn vinh:" choices_html: "%{name} tôn vinh:"
endorsements_hint: Bạn có thể tôn vinh những người bạn theo dõi và họ sẽ hiển thị ở giao diện web. endorsements_hint: Bạn có thể tôn vinh những người bạn theo dõi và họ sẽ hiển thị ở giao diện web.
@ -186,7 +186,7 @@ vi:
roles: roles:
admin: Quản trị viên admin: Quản trị viên
moderator: Kiểm duyệt viên moderator: Kiểm duyệt viên
staff: Nhân viên staff: Đội ngũ
user: Người dùng user: Người dùng
search: Tìm kiếm search: Tìm kiếm
search_same_email_domain: Tra cứu email search_same_email_domain: Tra cứu email
@ -227,7 +227,7 @@ vi:
whitelisted: Danh sách trắng whitelisted: Danh sách trắng
action_logs: action_logs:
action_types: action_types:
approve_appeal: Đồng ý kháng cáo approve_appeal: Phê duyệt kháng cáo
approve_user: Phê duyệt người dùng approve_user: Phê duyệt người dùng
assigned_to_self_report: Tự xử lý báo cáo assigned_to_self_report: Tự xử lý báo cáo
change_email_user: Đổi email change_email_user: Đổi email
@ -295,7 +295,7 @@ vi:
destroy_announcement_html: "%{name} xóa thông báo %{target}" destroy_announcement_html: "%{name} xóa thông báo %{target}"
destroy_custom_emoji_html: "%{name} đã xóa emoji %{target}" destroy_custom_emoji_html: "%{name} đã xóa emoji %{target}"
destroy_domain_allow_html: "%{name} đã ngừng liên hợp với %{target}" destroy_domain_allow_html: "%{name} đã ngừng liên hợp với %{target}"
destroy_domain_block_html: "%{name} bỏ chặn tên miền email %{target}" destroy_domain_block_html: "%{name} bỏ chặn máy chủ %{target}"
destroy_email_domain_block_html: "%{name} bỏ chặn tên miền email %{target}" destroy_email_domain_block_html: "%{name} bỏ chặn tên miền email %{target}"
destroy_instance_html: "%{name} thanh trừng máy chủ %{target}" destroy_instance_html: "%{name} thanh trừng máy chủ %{target}"
destroy_ip_block_html: "%{name} bỏ chặn IP %{target}" destroy_ip_block_html: "%{name} bỏ chặn IP %{target}"
@ -388,7 +388,7 @@ vi:
interactions: tương tác interactions: tương tác
media_storage: Dung lượng lưu trữ media_storage: Dung lượng lưu trữ
new_users: người dùng mới new_users: người dùng mới
opened_reports: báo cáo chưa xử lí opened_reports: tổng báo cáo
pending_appeals_html: pending_appeals_html:
other: "<strong>%{count}</strong> kháng cáo đang chờ" other: "<strong>%{count}</strong> kháng cáo đang chờ"
pending_reports_html: pending_reports_html:
@ -584,20 +584,20 @@ vi:
action_log: Nhật ký kiểm duyệt action_log: Nhật ký kiểm duyệt
action_taken_by: Hành động được thực hiện bởi action_taken_by: Hành động được thực hiện bởi
actions: actions:
delete_description_html: Những tút bị báo cáo sẽ được xóa và 1 thẹo sẽ được ghi lại để giúp bạn lưu ý về tài khoản này trong tương lai. delete_description_html: Những tút bị báo cáo sẽ được xóa và 1 lần cảnh cáo sẽ được ghi lại để giúp bạn lưu ý về tài khoản này trong tương lai.
mark_as_sensitive_description_html: Media trong báo cáo sẽ bị đánh dấu nhạy cảm và bạn nhận 1 lần cảnh cáo. mark_as_sensitive_description_html: Media trong báo cáo sẽ bị đánh dấu nhạy cảm và họ nhận 1 lần cảnh cáo.
other_description_html: Những tùy chọn để kiểm soát tài khoản và giao tiếp với tài khoản bị báo cáo. other_description_html: Những tùy chọn để kiểm soát tài khoản và giao tiếp với tài khoản bị báo cáo.
resolve_description_html: Không có hành động nào áp dụng đối với tài khoản bị báo cáo, không có thẹo, và báo cáo sẽ được đóng. resolve_description_html: Không có hành động nào áp dụng đối với tài khoản bị báo cáo, không có cảnh cáo, và báo cáo sẽ được đóng.
silence_description_html: Trang cá nhân sẽ chỉ hiển thị với những người đã theo dõi hoặc tìm kiếm thủ công, hạn chế tối đa tầm ảnh hưởng của nó. Có thể đổi lại bình thường sau. silence_description_html: Trang cá nhân sẽ chỉ hiển thị với những người đã theo dõi hoặc tìm kiếm thủ công, hạn chế tối đa tầm ảnh hưởng của nó. Có thể đổi lại bình thường sau.
suspend_description_html: Trang cá nhân và tất cả các nội dung sẽ không thể truy cập cho đến khi nó bị xóa hoàn toàn. Không thể tương tác với tài khoản. Đảo ngược trong vòng 30 ngày. suspend_description_html: Trang cá nhân và tất cả các nội dung sẽ không thể truy cập cho đến khi nó bị xóa hoàn toàn. Không thể tương tác với tài khoản. Đảo ngược trong vòng 30 ngày.
actions_description_html: Quyết định hướng xử lý báo cáo này. Nếu áp đặt trừng phạt, một email thông báo sẽ được gửi cho họ, ngoại trừ nếu đó là <strong>Spam</strong>. actions_description_html: Hướng xử lý báo cáo này. Nếu áp đặt trừng phạt, một email thông báo sẽ được gửi cho họ, ngoại trừ <strong>Spam</strong>.
add_to_report: Bổ sung báo cáo add_to_report: Bổ sung báo cáo
are_you_sure: Bạn có chắc không? are_you_sure: Bạn có chắc không?
assign_to_self: Giao cho tôi assign_to_self: Giao cho tôi
assigned: Người xử lý assigned: Người xử lý
by_target_domain: Tên tài khoản bị báo cáo by_target_domain: Tên tài khoản bị báo cáo
category: Phân loại category: Phân loại
category_description_html: Lý do tài khoản hoặc nội dung này bị báo cáo sẽ được trích dẫn trong giao tiếp với tài khoản báo cáo category_description_html: Lý do tài khoản hoặc nội dung này bị báo cáo sẽ được trích dẫn khi giao tiếp với họ
comment: comment:
none: Không có mô tả none: Không có mô tả
comment_description_html: 'Để cung cấp thêm thông tin, %{name} cho biết:' comment_description_html: 'Để cung cấp thêm thông tin, %{name} cho biết:'
@ -628,7 +628,7 @@ vi:
skip_to_actions: Kiểm duyệt ngay skip_to_actions: Kiểm duyệt ngay
status: Trạng thái status: Trạng thái
statuses: Nội dung bị báo cáo statuses: Nội dung bị báo cáo
statuses_description_html: Lý do tài khoản hoặc nội dung này bị báo cáo sẽ được trích dẫn trong giao tiếp với tài khoản báo cáo statuses_description_html: Lý do tài khoản hoặc nội dung này bị báo cáo sẽ được trích dẫn khi giao tiếp với họ
target_origin: Nguồn báo cáo target_origin: Nguồn báo cáo
title: Báo cáo title: Báo cáo
unassign: Bỏ qua unassign: Bỏ qua
@ -703,8 +703,8 @@ vi:
desc_html: Nếu tắt, bảng tin sẽ chỉ hiển thị nội dung do người dùng của máy chủ này tạo ra desc_html: Nếu tắt, bảng tin sẽ chỉ hiển thị nội dung do người dùng của máy chủ này tạo ra
title: Bao gồm nội dung từ mạng liên hợp trên bảng tin không được xác thực title: Bao gồm nội dung từ mạng liên hợp trên bảng tin không được xác thực
show_staff_badge: show_staff_badge:
desc_html: Hiển thị huy hiệu nhân viên trên trang người dùng desc_html: Hiện huy hiệu đội ngũ trên trang người dùng
title: Hiển thị huy hiệu nhân viên title: Hiện huy hiệu đội ngũ
site_description: site_description:
desc_html: Nội dung giới thiệu về máy chủ. Mô tả những gì làm cho máy chủ Mastodon này đặc biệt và bất cứ điều gì quan trọng khác. Bạn có thể dùng các thẻ HTML, đặc biệt là <code>&lt;a&gt;</code> và <code>&lt;em&gt;</code>. desc_html: Nội dung giới thiệu về máy chủ. Mô tả những gì làm cho máy chủ Mastodon này đặc biệt và bất cứ điều gì quan trọng khác. Bạn có thể dùng các thẻ HTML, đặc biệt là <code>&lt;a&gt;</code> và <code>&lt;em&gt;</code>.
title: Mô tả máy chủ title: Mô tả máy chủ
@ -774,11 +774,11 @@ vi:
approved: Đã cho phép approved: Đã cho phép
disallow: Cấm disallow: Cấm
links: links:
allow: Liên kết cho phép allow: Cho phép liên kết
allow_provider: Nguồn đăng cho phép allow_provider: Cho phép nguồn đăng
description_html: Đây là những liên kết được chia sẻ nhiều trên máy chủ của bạn. Nó có thể giúp người dùng tìm hiểu những gì đang xảy ra trên thế giới. Không có liên kết nào được hiển thị công khai cho đến khi bạn duyệt nguồn. Bạn cũng có thể cho phép hoặc từ chối từng liên kết riêng. description_html: Đây là những liên kết được chia sẻ nhiều trên máy chủ của bạn. Nó có thể giúp người dùng tìm hiểu những gì đang xảy ra trên thế giới. Không có liên kết nào được hiển thị công khai cho đến khi bạn duyệt nguồn đăng. Bạn cũng có thể cho phép hoặc từ chối từng liên kết riêng.
disallow: Liên kết cấm disallow: Cấm liên kết
disallow_provider: Nguồn đăng bị cấm disallow_provider: Cấm nguồn đăng
shared_by_over_week: shared_by_over_week:
one: một người chia sẻ trong tuần qua one: một người chia sẻ trong tuần qua
other: "%{count} người chia sẻ trong tuần qua" other: "%{count} người chia sẻ trong tuần qua"
@ -796,8 +796,8 @@ vi:
allow: Cho phép tút allow: Cho phép tút
allow_account: Cho phép người đăng allow_account: Cho phép người đăng
description_html: Đây là những tút đang được đăng lại và yêu thích rất nhiều trên máy chủ của bạn. Nó có thể giúp người dùng mới và người dùng cũ tìm thấy nhiều người hơn để theo dõi. Không có tút nào được hiển thị công khai cho đến khi bạn cho phép người đăng và người cho phép đề xuất tài khoản của họ cho người khác. Bạn cũng có thể cho phép hoặc từ chối từng tút riêng. description_html: Đây là những tút đang được đăng lại và yêu thích rất nhiều trên máy chủ của bạn. Nó có thể giúp người dùng mới và người dùng cũ tìm thấy nhiều người hơn để theo dõi. Không có tút nào được hiển thị công khai cho đến khi bạn cho phép người đăng và người cho phép đề xuất tài khoản của họ cho người khác. Bạn cũng có thể cho phép hoặc từ chối từng tút riêng.
disallow: Không cho phép tút disallow: Cấm tút
disallow_account: Không cho phép người đăng disallow_account: Cấm người đăng
not_discoverable: Tác giả đã chọn không tham gia mục khám phá not_discoverable: Tác giả đã chọn không tham gia mục khám phá
shared_by: shared_by:
other: Được thích và đăng lại %{friendly_count} lần other: Được thích và đăng lại %{friendly_count} lần
@ -817,7 +817,7 @@ vi:
not_usable: Không được phép dùng not_usable: Không được phép dùng
peaked_on_and_decaying: Đỉnh điểm %{date}, giờ đang giảm peaked_on_and_decaying: Đỉnh điểm %{date}, giờ đang giảm
title: Hashtag xu hướng title: Hashtag xu hướng
trendable: Có thể xuất hiện thành xu hướng trendable: Có thể trở thành xu hướng
trending_rank: 'Xu hướng #%{rank}' trending_rank: 'Xu hướng #%{rank}'
usable: Có thể dùng usable: Có thể dùng
usage_comparison: Dùng %{today} lần hôm nay, so với %{yesterday} hôm qua usage_comparison: Dùng %{today} lần hôm nay, so với %{yesterday} hôm qua
@ -1094,7 +1094,7 @@ vi:
new: new:
title: Thêm bộ lọc mới title: Thêm bộ lọc mới
footer: footer:
developers: Nhà phát triển developers: Phát triển
more: Nhiều hơn more: Nhiều hơn
resources: Quy tắc resources: Quy tắc
trending_now: Xu hướng trending_now: Xu hướng
@ -1433,7 +1433,7 @@ vi:
show_more: Đọc thêm show_more: Đọc thêm
show_newer: Mới hơn show_newer: Mới hơn
show_older: Cũ hơn show_older: Cũ hơn
show_thread: Toàn chủ đề show_thread: Xem chuỗi tút này
sign_in_to_participate: Đăng nhập để trả lời tút này sign_in_to_participate: Đăng nhập để trả lời tút này
title: '%{name}: "%{quote}"' title: '%{name}: "%{quote}"'
visibilities: visibilities:
@ -1609,7 +1609,7 @@ vi:
none: Cảnh báo none: Cảnh báo
sensitive: Tài khoản đã bị đánh dấu nhạy cảm sensitive: Tài khoản đã bị đánh dấu nhạy cảm
silence: Tài khoản bị hạn chế silence: Tài khoản bị hạn chế
suspend: Toài khoản bị vô hiệu hóa suspend: Tài khoản bị vô hiệu hóa
welcome: welcome:
edit_profile_action: Cài đặt trang cá nhân edit_profile_action: Cài đặt trang cá nhân
edit_profile_step: Bạn có thể tùy chỉnh trang cá nhân của mình bằng cách tải lên ảnh đại diện, ảnh bìa, thay đổi tên hiển thị và hơn thế nữa. Nếu bạn muốn những người theo dõi mới phải được phê duyệt, hãy chuyển tài khoản sang trạng thái khóa. edit_profile_step: Bạn có thể tùy chỉnh trang cá nhân của mình bằng cách tải lên ảnh đại diện, ảnh bìa, thay đổi tên hiển thị và hơn thế nữa. Nếu bạn muốn những người theo dõi mới phải được phê duyệt, hãy chuyển tài khoản sang trạng thái khóa.

View file

@ -22,7 +22,7 @@
class: Scheduler::EmailDomainBlockRefreshScheduler class: Scheduler::EmailDomainBlockRefreshScheduler
queue: scheduler queue: scheduler
trends_review_notifications_scheduler: trends_review_notifications_scheduler:
every: '2h' every: '6h'
class: Scheduler::Trends::ReviewNotificationsScheduler class: Scheduler::Trends::ReviewNotificationsScheduler
queue: scheduler queue: scheduler
media_cleanup_scheduler: media_cleanup_scheduler:

View file

@ -1,6 +1,5 @@
version: '3' version: '3'
services: services:
db: db:
restart: always restart: always
image: postgres:14-alpine image: postgres:14-alpine
@ -8,11 +7,11 @@ services:
networks: networks:
- internal_network - internal_network
healthcheck: healthcheck:
test: ["CMD", "pg_isready", "-U", "postgres"] test: ['CMD', 'pg_isready', '-U', 'postgres']
volumes: volumes:
- ./postgres14:/var/lib/postgresql/data - ./postgres14:/var/lib/postgresql/data
environment: environment:
- "POSTGRES_HOST_AUTH_METHOD=trust" - 'POSTGRES_HOST_AUTH_METHOD=trust'
redis: redis:
restart: always restart: always
@ -20,28 +19,28 @@ services:
networks: networks:
- internal_network - internal_network
healthcheck: healthcheck:
test: ["CMD", "redis-cli", "ping"] test: ['CMD', 'redis-cli', 'ping']
volumes: volumes:
- ./redis:/data - ./redis:/data
# es: # es:
# restart: always # restart: always
# image: docker.elastic.co/elasticsearch/elasticsearch-oss:7.10.2 # image: docker.elastic.co/elasticsearch/elasticsearch-oss:7.10.2
# environment: # environment:
# - "ES_JAVA_OPTS=-Xms512m -Xmx512m" # - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
# - "cluster.name=es-mastodon" # - "cluster.name=es-mastodon"
# - "discovery.type=single-node" # - "discovery.type=single-node"
# - "bootstrap.memory_lock=true" # - "bootstrap.memory_lock=true"
# networks: # networks:
# - internal_network # - internal_network
# healthcheck: # healthcheck:
# test: ["CMD-SHELL", "curl --silent --fail localhost:9200/_cluster/health || exit 1"] # test: ["CMD-SHELL", "curl --silent --fail localhost:9200/_cluster/health || exit 1"]
# volumes: # volumes:
# - ./elasticsearch:/usr/share/elasticsearch/data # - ./elasticsearch:/usr/share/elasticsearch/data
# ulimits: # ulimits:
# memlock: # memlock:
# soft: -1 # soft: -1
# hard: -1 # hard: -1
web: web:
build: . build: .
@ -53,13 +52,14 @@ services:
- external_network - external_network
- internal_network - internal_network
healthcheck: healthcheck:
test: ["CMD-SHELL", "wget -q --spider --proxy=off localhost:3000/health || exit 1"] # prettier-ignore
test: ['CMD-SHELL', 'wget -q --spider --proxy=off localhost:3000/health || exit 1']
ports: ports:
- "127.0.0.1:3000:3000" - '127.0.0.1:3000:3000'
depends_on: depends_on:
- db - db
- redis - redis
# - es # - es
volumes: volumes:
- ./public/system:/mastodon/public/system - ./public/system:/mastodon/public/system
@ -73,9 +73,10 @@ services:
- external_network - external_network
- internal_network - internal_network
healthcheck: healthcheck:
test: ["CMD-SHELL", "wget -q --spider --proxy=off localhost:4000/api/v1/streaming/health || exit 1"] # prettier-ignore
test: ['CMD-SHELL', 'wget -q --spider --proxy=off localhost:4000/api/v1/streaming/health || exit 1']
ports: ports:
- "127.0.0.1:4000:4000" - '127.0.0.1:4000:4000'
depends_on: depends_on:
- db - db
- redis - redis
@ -95,24 +96,24 @@ services:
volumes: volumes:
- ./public/system:/mastodon/public/system - ./public/system:/mastodon/public/system
healthcheck: healthcheck:
test: ["CMD-SHELL", "ps aux | grep '[s]idekiq\ 6' || false"] test: ['CMD-SHELL', "ps aux | grep '[s]idekiq\ 6' || false"]
## Uncomment to enable federation with tor instances along with adding the following ENV variables ## Uncomment to enable federation with tor instances along with adding the following ENV variables
## http_proxy=http://privoxy:8118 ## http_proxy=http://privoxy:8118
## ALLOW_ACCESS_TO_HIDDEN_SERVICE=true ## ALLOW_ACCESS_TO_HIDDEN_SERVICE=true
# tor: # tor:
# image: sirboops/tor # image: sirboops/tor
# networks: # networks:
# - external_network # - external_network
# - internal_network # - internal_network
# #
# privoxy: # privoxy:
# image: sirboops/privoxy # image: sirboops/privoxy
# volumes: # volumes:
# - ./priv-config:/opt/config # - ./priv-config:/opt/config
# networks: # networks:
# - external_network # - external_network
# - internal_network # - internal_network
networks: networks:
external_network: external_network:

View file

@ -32,9 +32,9 @@ module Mastodon
multiple domains to the command. multiple domains to the command.
When the --with-dns-records option is given, an attempt to resolve the When the --with-dns-records option is given, an attempt to resolve the
given domains' DNS records will be made and the results (A, AAAA and MX) will given domains' MX records will be made and the results will also be blocked.
also be blocked. This can be helpful if you are blocking an e-mail server that This can be helpful if you are blocking an e-mail server that has many
has many different domains pointing to it as it allows you to essentially block different domains pointing to it as it allows you to essentially block
it at the root. it at the root.
LONG_DESC LONG_DESC
def add(*domains) def add(*domains)
@ -53,26 +53,19 @@ module Mastodon
next next
end end
email_domain_block = EmailDomainBlock.new(domain: domain, with_dns_records: options[:with_dns_records] || false) other_domains = []
if options[:with_dns_records]
Resolv::DNS.open do |dns|
dns.timeouts = 5
other_domains = dns.getresources(@email_domain_block.domain, Resolv::DNS::Resource::IN::MX).to_a
end
end
email_domain_block = EmailDomainBlock.new(domain: domain, other_domains: other_domains)
email_domain_block.save! email_domain_block.save!
processed += 1 processed += 1
next unless email_domain_block.with_dns_records? (email_domain_block.other_domains || []).uniq.each do |hostname|
hostnames = []
ips = []
Resolv::DNS.open do |dns|
dns.timeouts = 5
hostnames = dns.getresources(email_domain_block.domain, Resolv::DNS::Resource::IN::MX).to_a.map { |e| e.exchange.to_s }
([email_domain_block.domain] + hostnames).uniq.each do |hostname|
ips.concat(dns.getresources(hostname, Resolv::DNS::Resource::IN::A).to_a.map { |e| e.address.to_s })
ips.concat(dns.getresources(hostname, Resolv::DNS::Resource::IN::AAAA).to_a.map { |e| e.address.to_s })
end
end
(hostnames + ips).uniq.each do |hostname|
another_email_domain_block = EmailDomainBlock.new(domain: hostname, parent: email_domain_block) another_email_domain_block = EmailDomainBlock.new(domain: hostname, parent: email_domain_block)
if EmailDomainBlock.where(domain: hostname).exists? if EmailDomainBlock.where(domain: hostname).exists?

View file

@ -14,7 +14,9 @@
"test:lint": "${npm_execpath} run test:lint:js && ${npm_execpath} run test:lint:sass", "test:lint": "${npm_execpath} run test:lint:js && ${npm_execpath} run test:lint:sass",
"test:lint:js": "eslint --ext=js . --cache", "test:lint:js": "eslint --ext=js . --cache",
"test:lint:sass": "sass-lint -v", "test:lint:sass": "sass-lint -v",
"test:jest": "cross-env NODE_ENV=test jest" "test:jest": "cross-env NODE_ENV=test jest",
"format": "prettier --write '**/*.{json,yml}",
"format-check": "prettier --write '**/*.{json,yml}"
}, },
"repository": { "repository": {
"type": "git", "type": "git",
@ -61,13 +63,13 @@
}, },
"private": true, "private": true,
"dependencies": { "dependencies": {
"@babel/core": "^7.17.7", "@babel/core": "^7.17.8",
"@babel/plugin-proposal-decorators": "^7.17.2", "@babel/plugin-proposal-decorators": "^7.17.8",
"@babel/plugin-transform-react-inline-elements": "^7.16.7", "@babel/plugin-transform-react-inline-elements": "^7.16.7",
"@babel/plugin-transform-runtime": "^7.17.0", "@babel/plugin-transform-runtime": "^7.17.0",
"@babel/preset-env": "^7.16.11", "@babel/preset-env": "^7.16.11",
"@babel/preset-react": "^7.16.7", "@babel/preset-react": "^7.16.7",
"@babel/runtime": "^7.17.7", "@babel/runtime": "^7.17.8",
"@gamestdio/websocket": "^0.3.2", "@gamestdio/websocket": "^0.3.2",
"@github/webauthn-json": "^0.5.7", "@github/webauthn-json": "^0.5.7",
"@rails/ujs": "^6.1.5", "@rails/ujs": "^6.1.5",
@ -183,8 +185,9 @@
"eslint-plugin-import": "~2.25.4", "eslint-plugin-import": "~2.25.4",
"eslint-plugin-jsx-a11y": "~6.5.1", "eslint-plugin-jsx-a11y": "~6.5.1",
"eslint-plugin-promise": "~6.0.0", "eslint-plugin-promise": "~6.0.0",
"eslint-plugin-react": "~7.29.3", "eslint-plugin-react": "~7.29.4",
"jest": "^27.5.1", "jest": "^27.5.1",
"prettier": "^2.6.0",
"raf": "^3.4.1", "raf": "^3.4.1",
"react-intl-translations-manager": "^5.0.3", "react-intl-translations-manager": "^5.0.3",
"react-test-renderer": "^16.14.0", "react-test-renderer": "^16.14.0",

View file

@ -92,8 +92,5 @@
"scripts": { "scripts": {
"postdeploy": "bundle exec rails db:migrate && bundle exec rails db:seed" "postdeploy": "bundle exec rails db:migrate && bundle exec rails db:seed"
}, },
"addons": [ "addons": ["postgresql", "redis"]
"postgresql",
"redis"
]
} }

View file

@ -167,6 +167,11 @@ const startWorker = async (workerId) => {
const redisPrefix = redisNamespace ? `${redisNamespace}:` : ''; const redisPrefix = redisNamespace ? `${redisNamespace}:` : '';
/**
* @type {Object.<string, Array.<function(string): void>>}
*/
const subs = {};
const redisSubscribeClient = await redisUrlToClient(redisParams, process.env.REDIS_URL); const redisSubscribeClient = await redisUrlToClient(redisParams, process.env.REDIS_URL);
const redisClient = await redisUrlToClient(redisParams, process.env.REDIS_URL); const redisClient = await redisUrlToClient(redisParams, process.env.REDIS_URL);
@ -191,23 +196,55 @@ const startWorker = async (workerId) => {
}; };
/** /**
* @param {string} message
* @param {string} channel * @param {string} channel
* @param {function(string): void} callback
*/ */
const subscribe = (channel, callback) => { const onRedisMessage = (message, channel) => {
log.silly(`Adding listener for ${channel}`); const callbacks = subs[channel];
redisSubscribeClient.subscribe(channel, callback); log.silly(`New message on channel ${channel}`);
if (!callbacks) {
return;
}
callbacks.forEach(callback => callback(message));
}; };
/** /**
* @param {string} channel * @param {string} channel
* @param {function(string): void} callback * @param {function(string): void} callback
*/ */
const subscribe = (channel, callback) => {
log.silly(`Adding listener for ${channel}`);
subs[channel] = subs[channel] || [];
if (subs[channel].length === 0) {
log.verbose(`Subscribe ${channel}`);
redisSubscribeClient.subscribe(channel, onRedisMessage);
}
subs[channel].push(callback);
};
/**
* @param {string} channel
*/
const unsubscribe = (channel, callback) => { const unsubscribe = (channel, callback) => {
log.silly(`Removing listener for ${channel}`); log.silly(`Removing listener for ${channel}`);
redisSubscribeClient.unsubscribe(channel, callback); if (!subs[channel]) {
return;
}
subs[channel] = subs[channel].filter(item => item !== callback);
if (subs[channel].length === 0) {
log.verbose(`Unsubscribe ${channel}`);
redisSubscribeClient.unsubscribe(channel);
delete subs[channel];
}
}; };
const FALSE_VALUES = [ const FALSE_VALUES = [

View file

@ -33,18 +33,18 @@
resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.17.7.tgz#078d8b833fbbcc95286613be8c716cef2b519fa2" resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.17.7.tgz#078d8b833fbbcc95286613be8c716cef2b519fa2"
integrity sha512-p8pdE6j0a29TNGebNm7NzYZWB3xVZJBZ7XGs42uAKzQo8VQ3F0By/cQCtUEABwIqw5zo6WA4NbmxsfzADzMKnQ== integrity sha512-p8pdE6j0a29TNGebNm7NzYZWB3xVZJBZ7XGs42uAKzQo8VQ3F0By/cQCtUEABwIqw5zo6WA4NbmxsfzADzMKnQ==
"@babel/core@^7.1.0", "@babel/core@^7.12.3", "@babel/core@^7.17.7", "@babel/core@^7.7.2", "@babel/core@^7.8.0": "@babel/core@^7.1.0", "@babel/core@^7.12.3", "@babel/core@^7.17.8", "@babel/core@^7.7.2", "@babel/core@^7.8.0":
version "7.17.7" version "7.17.8"
resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.17.7.tgz#f7c28228c83cdf2dbd1b9baa06eaf9df07f0c2f9" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.17.8.tgz#3dac27c190ebc3a4381110d46c80e77efe172e1a"
integrity sha512-djHlEfFHnSnTAcPb7dATbiM5HxGOP98+3JLBZtjRb5I7RXrw7kFRoG2dXM8cm3H+o11A8IFH/uprmJpwFynRNQ== integrity sha512-OdQDV/7cRBtJHLSOBqqbYNkOcydOgnX59TZx4puf41fzcVtN3e/4yqY8lMQsK+5X2lJtAdmA+6OHqsj1hBJ4IQ==
dependencies: dependencies:
"@ampproject/remapping" "^2.1.0" "@ampproject/remapping" "^2.1.0"
"@babel/code-frame" "^7.16.7" "@babel/code-frame" "^7.16.7"
"@babel/generator" "^7.17.7" "@babel/generator" "^7.17.7"
"@babel/helper-compilation-targets" "^7.17.7" "@babel/helper-compilation-targets" "^7.17.7"
"@babel/helper-module-transforms" "^7.17.7" "@babel/helper-module-transforms" "^7.17.7"
"@babel/helpers" "^7.17.7" "@babel/helpers" "^7.17.8"
"@babel/parser" "^7.17.7" "@babel/parser" "^7.17.8"
"@babel/template" "^7.16.7" "@babel/template" "^7.16.7"
"@babel/traverse" "^7.17.3" "@babel/traverse" "^7.17.3"
"@babel/types" "^7.17.0" "@babel/types" "^7.17.0"
@ -96,10 +96,10 @@
browserslist "^4.17.5" browserslist "^4.17.5"
semver "^6.3.0" semver "^6.3.0"
"@babel/helper-create-class-features-plugin@^7.16.10", "@babel/helper-create-class-features-plugin@^7.16.7", "@babel/helper-create-class-features-plugin@^7.17.1": "@babel/helper-create-class-features-plugin@^7.16.10", "@babel/helper-create-class-features-plugin@^7.16.7", "@babel/helper-create-class-features-plugin@^7.17.6":
version "7.17.1" version "7.17.6"
resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.17.1.tgz#9699f14a88833a7e055ce57dcd3ffdcd25186b21" resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.17.6.tgz#3778c1ed09a7f3e65e6d6e0f6fbfcc53809d92c9"
integrity sha512-JBdSr/LtyYIno/pNnJ75lBcqc3Z1XXujzPanHqjvvrhOA+DTceTFuJi8XjmWTZh4r3fsdfqaCMN0iZemdkxZHQ== integrity sha512-SogLLSxXm2OkBbSsHZMM4tUi8fUzjs63AT/d0YQIzr6GSd8Hxsbk2KYDX0k0DweAzGMj/YWeiCsorIdtdcW8Eg==
dependencies: dependencies:
"@babel/helper-annotate-as-pure" "^7.16.7" "@babel/helper-annotate-as-pure" "^7.16.7"
"@babel/helper-environment-visitor" "^7.16.7" "@babel/helper-environment-visitor" "^7.16.7"
@ -295,10 +295,10 @@
"@babel/traverse" "^7.16.8" "@babel/traverse" "^7.16.8"
"@babel/types" "^7.16.8" "@babel/types" "^7.16.8"
"@babel/helpers@^7.17.7": "@babel/helpers@^7.17.8":
version "7.17.7" version "7.17.8"
resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.17.7.tgz#6fc0a24280fd00026e85424bbfed4650e76d7127" resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.17.8.tgz#288450be8c6ac7e4e44df37bcc53d345e07bc106"
integrity sha512-TKsj9NkjJfTBxM7Phfy7kv6yYc4ZcOo+AaWGqQOKTPDOmcGkIFb5xNA746eKisQkm4yavUYh4InYM9S+VnO01w== integrity sha512-QcL86FGxpfSJwGtAvv4iG93UL6bmqBdmoVY0CMCU2g+oD2ezQse3PT5Pa+jiD6LJndBQi0EDlpzOWNlLuhz5gw==
dependencies: dependencies:
"@babel/template" "^7.16.7" "@babel/template" "^7.16.7"
"@babel/traverse" "^7.17.3" "@babel/traverse" "^7.17.3"
@ -322,10 +322,10 @@
chalk "^2.0.0" chalk "^2.0.0"
js-tokens "^4.0.0" js-tokens "^4.0.0"
"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.16.7", "@babel/parser@^7.17.3", "@babel/parser@^7.17.7", "@babel/parser@^7.7.0": "@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.16.7", "@babel/parser@^7.17.3", "@babel/parser@^7.17.8", "@babel/parser@^7.7.0":
version "7.17.7" version "7.17.8"
resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.17.7.tgz#fc19b645a5456c8d6fdb6cecd3c66c0173902800" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.17.8.tgz#2817fb9d885dd8132ea0f8eb615a6388cca1c240"
integrity sha512-bm3AQf45vR4gKggRfvJdYJ0gFLoCbsPxiFLSH6hTVYABptNHY6l9NrhnucVjQ/X+SPtLANT9lc0fFhikj+VBRA== integrity sha512-BoHhDJrJXqcg+ZL16Xv39H9n+AqJ4pcDrQBGZN+wHxIysrLZ3/ECwCBUch/1zUNhnsXULcONU3Ei5Hmkfk6kiQ==
"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.16.7": "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.16.7":
version "7.16.7" version "7.16.7"
@ -369,12 +369,12 @@
"@babel/helper-plugin-utils" "^7.16.7" "@babel/helper-plugin-utils" "^7.16.7"
"@babel/plugin-syntax-class-static-block" "^7.14.5" "@babel/plugin-syntax-class-static-block" "^7.14.5"
"@babel/plugin-proposal-decorators@^7.17.2": "@babel/plugin-proposal-decorators@^7.17.8":
version "7.17.2" version "7.17.8"
resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.17.2.tgz#c36372ddfe0360cac1ee331a238310bddca11493" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.17.8.tgz#4f0444e896bee85d35cf714a006fc5418f87ff00"
integrity sha512-WH8Z95CwTq/W8rFbMqb9p3hicpt4RX4f0K659ax2VHxgOyT6qQmUaEVEjIh4WR9Eh9NymkVn5vwsrE68fAQNUw== integrity sha512-U69odN4Umyyx1xO1rTII0IDkAEC+RNlcKXtqOblfpzqy1C+aOplb76BQNq0+XdpVkOaPlpEDwd++joY8FNFJKA==
dependencies: dependencies:
"@babel/helper-create-class-features-plugin" "^7.17.1" "@babel/helper-create-class-features-plugin" "^7.17.6"
"@babel/helper-plugin-utils" "^7.16.7" "@babel/helper-plugin-utils" "^7.16.7"
"@babel/helper-replace-supers" "^7.16.7" "@babel/helper-replace-supers" "^7.16.7"
"@babel/plugin-syntax-decorators" "^7.17.0" "@babel/plugin-syntax-decorators" "^7.17.0"
@ -1036,10 +1036,10 @@
dependencies: dependencies:
regenerator-runtime "^0.12.0" regenerator-runtime "^0.12.0"
"@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.10.2", "@babel/runtime@^7.12.0", "@babel/runtime@^7.12.5", "@babel/runtime@^7.15.4", "@babel/runtime@^7.16.3", "@babel/runtime@^7.17.7", "@babel/runtime@^7.2.0", "@babel/runtime@^7.3.1", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.3", "@babel/runtime@^7.7.2", "@babel/runtime@^7.8.4", "@babel/runtime@^7.9.2": "@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.10.2", "@babel/runtime@^7.12.0", "@babel/runtime@^7.12.5", "@babel/runtime@^7.15.4", "@babel/runtime@^7.16.3", "@babel/runtime@^7.17.8", "@babel/runtime@^7.2.0", "@babel/runtime@^7.3.1", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.3", "@babel/runtime@^7.7.2", "@babel/runtime@^7.8.4", "@babel/runtime@^7.9.2":
version "7.17.7" version "7.17.8"
resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.17.7.tgz#a5f3328dc41ff39d803f311cfe17703418cf9825" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.17.8.tgz#3e56e4aff81befa55ac3ac6a0967349fd1c5bca2"
integrity sha512-L6rvG9GDxaLgFjg41K+5Yv9OMrU98sWe+Ykmc6FDJW/+vYZMhdOMKkISgzptMaERHvS2Y2lw9MDRm2gHhlQQoA== integrity sha512-dQpEpK0O9o6lj6oPu0gRDbbnk+4LeHlNcBpspf6Olzt3GIX4P1lWF1gS+pHLDFlaJvbR6q7jCfQ08zA4QJBnmA==
dependencies: dependencies:
regenerator-runtime "^0.13.4" regenerator-runtime "^0.13.4"
@ -4392,10 +4392,10 @@ eslint-plugin-promise@~6.0.0:
resolved "https://registry.yarnpkg.com/eslint-plugin-promise/-/eslint-plugin-promise-6.0.0.tgz#017652c07c9816413a41e11c30adc42c3d55ff18" resolved "https://registry.yarnpkg.com/eslint-plugin-promise/-/eslint-plugin-promise-6.0.0.tgz#017652c07c9816413a41e11c30adc42c3d55ff18"
integrity sha512-7GPezalm5Bfi/E22PnQxDWH2iW9GTvAlUNTztemeHb6c1BniSyoeTrM87JkC0wYdi6aQrZX9p2qEiAno8aTcbw== integrity sha512-7GPezalm5Bfi/E22PnQxDWH2iW9GTvAlUNTztemeHb6c1BniSyoeTrM87JkC0wYdi6aQrZX9p2qEiAno8aTcbw==
eslint-plugin-react@~7.29.3: eslint-plugin-react@~7.29.4:
version "7.29.3" version "7.29.4"
resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.29.3.tgz#f4eab757f2756d25d6d4c2a58a9e20b004791f05" resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.29.4.tgz#4717de5227f55f3801a5fd51a16a4fa22b5914d2"
integrity sha512-MzW6TuCnDOcta67CkpDyRfRsEVx9FNMDV8wZsDqe1luHPdGTrQIUaUXD27Ja3gHsdOIs/cXzNchWGlqm+qRVRg== integrity sha512-CVCXajliVh509PcZYRFyu/BoUEz452+jtQJq2b3Bae4v3xBUWPLCmtmBM+ZinG4MzwmxJgJ2M5rMqhqLVn7MtQ==
dependencies: dependencies:
array-includes "^3.1.4" array-includes "^3.1.4"
array.prototype.flatmap "^1.2.5" array.prototype.flatmap "^1.2.5"
@ -8661,6 +8661,11 @@ prelude-ls@~1.1.2:
resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54"
integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=
prettier@^2.6.0:
version "2.6.0"
resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.6.0.tgz#12f8f504c4d8ddb76475f441337542fa799207d4"
integrity sha512-m2FgJibYrBGGgQXNzfd0PuDGShJgRavjUoRCw1mZERIWVSXF0iLzLm+aOqTAbLnC3n6JzUhAA8uZnFVghHJ86A==
pretty-format@^25.2.1, pretty-format@^25.5.0: pretty-format@^25.2.1, pretty-format@^25.5.0:
version "25.5.0" version "25.5.0"
resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-25.5.0.tgz#7873c1d774f682c34b8d48b6743a2bf2ac55791a" resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-25.5.0.tgz#7873c1d774f682c34b8d48b6743a2bf2ac55791a"