mirror of
https://github.com/glitch-soc/mastodon.git
synced 2025-02-18 16:43:51 -05:00
Merge commit 'e68b26c8df2056182564abcee230927ed53200c8' into glitch-soc/merge-upstream
Conflicts: - `app/models/trends/statuses.rb`: Upstream added a date restriction to trendable posts, while glitch-soc had slightly different conditions. Added the date restriction to glitch-soc's conditions.
This commit is contained in:
commit
6374937147
59
.annotaterb.yml
Normal file
59
.annotaterb.yml
Normal file
@ -0,0 +1,59 @@
|
|||||||
|
---
|
||||||
|
:position: before
|
||||||
|
:position_in_additional_file_patterns: before
|
||||||
|
:position_in_class: before
|
||||||
|
:position_in_factory: before
|
||||||
|
:position_in_fixture: before
|
||||||
|
:position_in_routes: before
|
||||||
|
:position_in_serializer: before
|
||||||
|
:position_in_test: before
|
||||||
|
:classified_sort: true
|
||||||
|
:exclude_controllers: true
|
||||||
|
:exclude_factories: true
|
||||||
|
:exclude_fixtures: true
|
||||||
|
:exclude_helpers: true
|
||||||
|
:exclude_scaffolds: true
|
||||||
|
:exclude_serializers: true
|
||||||
|
:exclude_sti_subclasses: true
|
||||||
|
:exclude_tests: true
|
||||||
|
:force: false
|
||||||
|
:format_markdown: false
|
||||||
|
:format_rdoc: false
|
||||||
|
:format_yard: false
|
||||||
|
:frozen: false
|
||||||
|
:ignore_model_sub_dir: false
|
||||||
|
:ignore_unknown_models: false
|
||||||
|
:include_version: false
|
||||||
|
:show_complete_foreign_keys: false
|
||||||
|
:show_foreign_keys: false
|
||||||
|
:show_indexes: false
|
||||||
|
:simple_indexes: false
|
||||||
|
:sort: false
|
||||||
|
:timestamp: false
|
||||||
|
:trace: false
|
||||||
|
:with_comment: true
|
||||||
|
:with_column_comments: true
|
||||||
|
:with_table_comments: true
|
||||||
|
:active_admin: false
|
||||||
|
:command:
|
||||||
|
:debug: false
|
||||||
|
:hide_default_column_types: ''
|
||||||
|
:hide_limit_column_types: 'integer,boolean'
|
||||||
|
:ignore_columns:
|
||||||
|
:ignore_routes:
|
||||||
|
:models: true
|
||||||
|
:routes: false
|
||||||
|
:skip_on_db_migrate: false
|
||||||
|
:target_action: :do_annotations
|
||||||
|
:wrapper:
|
||||||
|
:wrapper_close:
|
||||||
|
:wrapper_open:
|
||||||
|
:classes_default_to_s: []
|
||||||
|
:additional_file_patterns: []
|
||||||
|
:model_dir:
|
||||||
|
- app/models
|
||||||
|
:require: []
|
||||||
|
:root_dir:
|
||||||
|
- ''
|
||||||
|
|
||||||
|
:show_check_constraints: false
|
@ -69,7 +69,7 @@ services:
|
|||||||
hard: -1
|
hard: -1
|
||||||
|
|
||||||
libretranslate:
|
libretranslate:
|
||||||
image: libretranslate/libretranslate:v1.6.1
|
image: libretranslate/libretranslate:v1.6.2
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
volumes:
|
volumes:
|
||||||
- lt-data:/home/libretranslate/.local
|
- lt-data:/home/libretranslate/.local
|
||||||
|
1
.github/workflows/build-container-image.yml
vendored
1
.github/workflows/build-container-image.yml
vendored
@ -92,6 +92,7 @@ jobs:
|
|||||||
build-args: |
|
build-args: |
|
||||||
MASTODON_VERSION_PRERELEASE=${{ inputs.version_prerelease }}
|
MASTODON_VERSION_PRERELEASE=${{ inputs.version_prerelease }}
|
||||||
MASTODON_VERSION_METADATA=${{ inputs.version_metadata }}
|
MASTODON_VERSION_METADATA=${{ inputs.version_metadata }}
|
||||||
|
SOURCE_COMMIT=${{ github.sha }}
|
||||||
platforms: ${{ inputs.platforms }}
|
platforms: ${{ inputs.platforms }}
|
||||||
provenance: false
|
provenance: false
|
||||||
builder: ${{ steps.buildx.outputs.name || steps.buildx-native.outputs.name }}
|
builder: ${{ steps.buildx.outputs.name || steps.buildx-native.outputs.name }}
|
||||||
|
307
Dockerfile
307
Dockerfile
@ -29,6 +29,8 @@ FROM docker.io/ruby:${RUBY_VERSION}-slim-${DEBIAN_VERSION} AS ruby
|
|||||||
ARG MASTODON_VERSION_PRERELEASE=""
|
ARG MASTODON_VERSION_PRERELEASE=""
|
||||||
# Append build metadata or fork information to version.rb [--build-arg MASTODON_VERSION_METADATA="pr-123456"]
|
# Append build metadata or fork information to version.rb [--build-arg MASTODON_VERSION_METADATA="pr-123456"]
|
||||||
ARG MASTODON_VERSION_METADATA=""
|
ARG MASTODON_VERSION_METADATA=""
|
||||||
|
# Will be available as Mastodon::Version.source_commit
|
||||||
|
ARG SOURCE_COMMIT=""
|
||||||
|
|
||||||
# Allow Ruby on Rails to serve static files
|
# Allow Ruby on Rails to serve static files
|
||||||
# See: https://docs.joinmastodon.org/admin/config/#rails_serve_static_files
|
# See: https://docs.joinmastodon.org/admin/config/#rails_serve_static_files
|
||||||
@ -45,30 +47,31 @@ ARG GID="991"
|
|||||||
|
|
||||||
# Apply Mastodon build options based on options above
|
# Apply Mastodon build options based on options above
|
||||||
ENV \
|
ENV \
|
||||||
# Apply Mastodon version information
|
# Apply Mastodon version information
|
||||||
MASTODON_VERSION_PRERELEASE="${MASTODON_VERSION_PRERELEASE}" \
|
MASTODON_VERSION_PRERELEASE="${MASTODON_VERSION_PRERELEASE}" \
|
||||||
MASTODON_VERSION_METADATA="${MASTODON_VERSION_METADATA}" \
|
MASTODON_VERSION_METADATA="${MASTODON_VERSION_METADATA}" \
|
||||||
# Apply Mastodon static files and YJIT options
|
SOURCE_COMMIT="${SOURCE_COMMIT}" \
|
||||||
|
# Apply Mastodon static files and YJIT options
|
||||||
RAILS_SERVE_STATIC_FILES=${RAILS_SERVE_STATIC_FILES} \
|
RAILS_SERVE_STATIC_FILES=${RAILS_SERVE_STATIC_FILES} \
|
||||||
RUBY_YJIT_ENABLE=${RUBY_YJIT_ENABLE} \
|
RUBY_YJIT_ENABLE=${RUBY_YJIT_ENABLE} \
|
||||||
# Apply timezone
|
# Apply timezone
|
||||||
TZ=${TZ}
|
TZ=${TZ}
|
||||||
|
|
||||||
ENV \
|
ENV \
|
||||||
# Configure the IP to bind Mastodon to when serving traffic
|
# Configure the IP to bind Mastodon to when serving traffic
|
||||||
BIND="0.0.0.0" \
|
BIND="0.0.0.0" \
|
||||||
# Use production settings for Yarn, Node and related nodejs based tools
|
# Use production settings for Yarn, Node and related nodejs based tools
|
||||||
NODE_ENV="production" \
|
NODE_ENV="production" \
|
||||||
# Use production settings for Ruby on Rails
|
# Use production settings for Ruby on Rails
|
||||||
RAILS_ENV="production" \
|
RAILS_ENV="production" \
|
||||||
# Add Ruby and Mastodon installation to the PATH
|
# Add Ruby and Mastodon installation to the PATH
|
||||||
DEBIAN_FRONTEND="noninteractive" \
|
DEBIAN_FRONTEND="noninteractive" \
|
||||||
PATH="${PATH}:/opt/ruby/bin:/opt/mastodon/bin" \
|
PATH="${PATH}:/opt/ruby/bin:/opt/mastodon/bin" \
|
||||||
# Optimize jemalloc 5.x performance
|
# Optimize jemalloc 5.x performance
|
||||||
MALLOC_CONF="narenas:2,background_thread:true,thp:never,dirty_decay_ms:1000,muzzy_decay_ms:0" \
|
MALLOC_CONF="narenas:2,background_thread:true,thp:never,dirty_decay_ms:1000,muzzy_decay_ms:0" \
|
||||||
# Enable libvips, should not be changed
|
# Enable libvips, should not be changed
|
||||||
MASTODON_USE_LIBVIPS=true \
|
MASTODON_USE_LIBVIPS=true \
|
||||||
# Sidekiq will touch tmp/sidekiq_process_has_started_and_will_begin_processing_jobs to indicate it is ready. This can be used for a readiness check in Kubernetes
|
# Sidekiq will touch tmp/sidekiq_process_has_started_and_will_begin_processing_jobs to indicate it is ready. This can be used for a readiness check in Kubernetes
|
||||||
MASTODON_SIDEKIQ_READY_FILENAME=sidekiq_process_has_started_and_will_begin_processing_jobs
|
MASTODON_SIDEKIQ_READY_FILENAME=sidekiq_process_has_started_and_will_begin_processing_jobs
|
||||||
|
|
||||||
# Set default shell used for running commands
|
# Set default shell used for running commands
|
||||||
@ -79,14 +82,14 @@ ARG TARGETPLATFORM
|
|||||||
RUN echo "Target platform is $TARGETPLATFORM"
|
RUN echo "Target platform is $TARGETPLATFORM"
|
||||||
|
|
||||||
RUN \
|
RUN \
|
||||||
# Remove automatic apt cache Docker cleanup scripts
|
# Remove automatic apt cache Docker cleanup scripts
|
||||||
rm -f /etc/apt/apt.conf.d/docker-clean; \
|
rm -f /etc/apt/apt.conf.d/docker-clean; \
|
||||||
# Sets timezone
|
# Sets timezone
|
||||||
echo "${TZ}" > /etc/localtime; \
|
echo "${TZ}" > /etc/localtime; \
|
||||||
# Creates mastodon user/group and sets home directory
|
# Creates mastodon user/group and sets home directory
|
||||||
groupadd -g "${GID}" mastodon; \
|
groupadd -g "${GID}" mastodon; \
|
||||||
useradd -l -u "${UID}" -g "${GID}" -m -d /opt/mastodon mastodon; \
|
useradd -l -u "${UID}" -g "${GID}" -m -d /opt/mastodon mastodon; \
|
||||||
# Creates /mastodon symlink to /opt/mastodon
|
# Creates /mastodon symlink to /opt/mastodon
|
||||||
ln -s /opt/mastodon /mastodon;
|
ln -s /opt/mastodon /mastodon;
|
||||||
|
|
||||||
# Set /opt/mastodon as working directory
|
# Set /opt/mastodon as working directory
|
||||||
@ -94,28 +97,28 @@ WORKDIR /opt/mastodon
|
|||||||
|
|
||||||
# hadolint ignore=DL3008,DL3005
|
# hadolint ignore=DL3008,DL3005
|
||||||
RUN \
|
RUN \
|
||||||
# Mount Apt cache and lib directories from Docker buildx caches
|
# Mount Apt cache and lib directories from Docker buildx caches
|
||||||
--mount=type=cache,id=apt-cache-${TARGETPLATFORM},target=/var/cache/apt,sharing=locked \
|
--mount=type=cache,id=apt-cache-${TARGETPLATFORM},target=/var/cache/apt,sharing=locked \
|
||||||
--mount=type=cache,id=apt-lib-${TARGETPLATFORM},target=/var/lib/apt,sharing=locked \
|
--mount=type=cache,id=apt-lib-${TARGETPLATFORM},target=/var/lib/apt,sharing=locked \
|
||||||
# Apt update & upgrade to check for security updates to Debian image
|
# Apt update & upgrade to check for security updates to Debian image
|
||||||
apt-get update; \
|
apt-get update; \
|
||||||
apt-get dist-upgrade -yq; \
|
apt-get dist-upgrade -yq; \
|
||||||
# Install jemalloc, curl and other necessary components
|
# Install jemalloc, curl and other necessary components
|
||||||
apt-get install -y --no-install-recommends \
|
apt-get install -y --no-install-recommends \
|
||||||
curl \
|
curl \
|
||||||
file \
|
file \
|
||||||
libjemalloc2 \
|
libjemalloc2 \
|
||||||
patchelf \
|
patchelf \
|
||||||
procps \
|
procps \
|
||||||
tini \
|
tini \
|
||||||
tzdata \
|
tzdata \
|
||||||
wget \
|
wget \
|
||||||
; \
|
; \
|
||||||
# Patch Ruby to use jemalloc
|
# Patch Ruby to use jemalloc
|
||||||
patchelf --add-needed libjemalloc.so.2 /usr/local/bin/ruby; \
|
patchelf --add-needed libjemalloc.so.2 /usr/local/bin/ruby; \
|
||||||
# Discard patchelf after use
|
# Discard patchelf after use
|
||||||
apt-get purge -y \
|
apt-get purge -y \
|
||||||
patchelf \
|
patchelf \
|
||||||
;
|
;
|
||||||
|
|
||||||
# Create temporary build layer from base image
|
# Create temporary build layer from base image
|
||||||
@ -132,56 +135,56 @@ ARG TARGETPLATFORM
|
|||||||
|
|
||||||
# hadolint ignore=DL3008
|
# hadolint ignore=DL3008
|
||||||
RUN \
|
RUN \
|
||||||
# Mount Apt cache and lib directories from Docker buildx caches
|
# Mount Apt cache and lib directories from Docker buildx caches
|
||||||
--mount=type=cache,id=apt-cache-${TARGETPLATFORM},target=/var/cache/apt,sharing=locked \
|
--mount=type=cache,id=apt-cache-${TARGETPLATFORM},target=/var/cache/apt,sharing=locked \
|
||||||
--mount=type=cache,id=apt-lib-${TARGETPLATFORM},target=/var/lib/apt,sharing=locked \
|
--mount=type=cache,id=apt-lib-${TARGETPLATFORM},target=/var/lib/apt,sharing=locked \
|
||||||
# Install build tools and bundler dependencies from APT
|
# Install build tools and bundler dependencies from APT
|
||||||
apt-get install -y --no-install-recommends \
|
apt-get install -y --no-install-recommends \
|
||||||
autoconf \
|
autoconf \
|
||||||
automake \
|
automake \
|
||||||
build-essential \
|
build-essential \
|
||||||
cmake \
|
cmake \
|
||||||
git \
|
git \
|
||||||
libgdbm-dev \
|
libgdbm-dev \
|
||||||
libglib2.0-dev \
|
libglib2.0-dev \
|
||||||
libgmp-dev \
|
libgmp-dev \
|
||||||
libicu-dev \
|
libicu-dev \
|
||||||
libidn-dev \
|
libidn-dev \
|
||||||
libpq-dev \
|
libpq-dev \
|
||||||
libssl-dev \
|
libssl-dev \
|
||||||
libtool \
|
libtool \
|
||||||
meson \
|
meson \
|
||||||
nasm \
|
nasm \
|
||||||
pkg-config \
|
pkg-config \
|
||||||
shared-mime-info \
|
shared-mime-info \
|
||||||
xz-utils \
|
xz-utils \
|
||||||
# libvips components
|
# libvips components
|
||||||
libcgif-dev \
|
libcgif-dev \
|
||||||
libexif-dev \
|
libexif-dev \
|
||||||
libexpat1-dev \
|
libexpat1-dev \
|
||||||
libgirepository1.0-dev \
|
libgirepository1.0-dev \
|
||||||
libheif-dev \
|
libheif-dev \
|
||||||
libimagequant-dev \
|
libimagequant-dev \
|
||||||
libjpeg62-turbo-dev \
|
libjpeg62-turbo-dev \
|
||||||
liblcms2-dev \
|
liblcms2-dev \
|
||||||
liborc-dev \
|
liborc-dev \
|
||||||
libspng-dev \
|
libspng-dev \
|
||||||
libtiff-dev \
|
libtiff-dev \
|
||||||
libwebp-dev \
|
libwebp-dev \
|
||||||
# ffmpeg components
|
# ffmpeg components
|
||||||
libdav1d-dev \
|
libdav1d-dev \
|
||||||
liblzma-dev \
|
liblzma-dev \
|
||||||
libmp3lame-dev \
|
libmp3lame-dev \
|
||||||
libopus-dev \
|
libopus-dev \
|
||||||
libsnappy-dev \
|
libsnappy-dev \
|
||||||
libvorbis-dev \
|
libvorbis-dev \
|
||||||
libvpx-dev \
|
libvpx-dev \
|
||||||
libx264-dev \
|
libx264-dev \
|
||||||
libx265-dev \
|
libx265-dev \
|
||||||
;
|
;
|
||||||
|
|
||||||
RUN \
|
RUN \
|
||||||
# Configure Corepack
|
# Configure Corepack
|
||||||
rm /usr/local/bin/yarn*; \
|
rm /usr/local/bin/yarn*; \
|
||||||
corepack enable; \
|
corepack enable; \
|
||||||
corepack prepare --activate;
|
corepack prepare --activate;
|
||||||
@ -228,28 +231,28 @@ WORKDIR /usr/local/ffmpeg/src/ffmpeg-${FFMPEG_VERSION}
|
|||||||
# Configure and compile ffmpeg
|
# Configure and compile ffmpeg
|
||||||
RUN \
|
RUN \
|
||||||
./configure \
|
./configure \
|
||||||
--prefix=/usr/local/ffmpeg \
|
--prefix=/usr/local/ffmpeg \
|
||||||
--toolchain=hardened \
|
--toolchain=hardened \
|
||||||
--disable-debug \
|
--disable-debug \
|
||||||
--disable-devices \
|
--disable-devices \
|
||||||
--disable-doc \
|
--disable-doc \
|
||||||
--disable-ffplay \
|
--disable-ffplay \
|
||||||
--disable-network \
|
--disable-network \
|
||||||
--disable-static \
|
--disable-static \
|
||||||
--enable-ffmpeg \
|
--enable-ffmpeg \
|
||||||
--enable-ffprobe \
|
--enable-ffprobe \
|
||||||
--enable-gpl \
|
--enable-gpl \
|
||||||
--enable-libdav1d \
|
--enable-libdav1d \
|
||||||
--enable-libmp3lame \
|
--enable-libmp3lame \
|
||||||
--enable-libopus \
|
--enable-libopus \
|
||||||
--enable-libsnappy \
|
--enable-libsnappy \
|
||||||
--enable-libvorbis \
|
--enable-libvorbis \
|
||||||
--enable-libvpx \
|
--enable-libvpx \
|
||||||
--enable-libwebp \
|
--enable-libwebp \
|
||||||
--enable-libx264 \
|
--enable-libx264 \
|
||||||
--enable-libx265 \
|
--enable-libx265 \
|
||||||
--enable-shared \
|
--enable-shared \
|
||||||
--enable-version3 \
|
--enable-version3 \
|
||||||
; \
|
; \
|
||||||
make -j$(nproc); \
|
make -j$(nproc); \
|
||||||
make install;
|
make install;
|
||||||
@ -263,17 +266,17 @@ ARG TARGETPLATFORM
|
|||||||
COPY Gemfile* /opt/mastodon/
|
COPY Gemfile* /opt/mastodon/
|
||||||
|
|
||||||
RUN \
|
RUN \
|
||||||
# Mount Ruby Gem caches
|
# Mount Ruby Gem caches
|
||||||
--mount=type=cache,id=gem-cache-${TARGETPLATFORM},target=/usr/local/bundle/cache/,sharing=locked \
|
--mount=type=cache,id=gem-cache-${TARGETPLATFORM},target=/usr/local/bundle/cache/,sharing=locked \
|
||||||
# Configure bundle to prevent changes to Gemfile and Gemfile.lock
|
# Configure bundle to prevent changes to Gemfile and Gemfile.lock
|
||||||
bundle config set --global frozen "true"; \
|
bundle config set --global frozen "true"; \
|
||||||
# Configure bundle to not cache downloaded Gems
|
# Configure bundle to not cache downloaded Gems
|
||||||
bundle config set --global cache_all "false"; \
|
bundle config set --global cache_all "false"; \
|
||||||
# Configure bundle to only process production Gems
|
# Configure bundle to only process production Gems
|
||||||
bundle config set --local without "development test"; \
|
bundle config set --local without "development test"; \
|
||||||
# Configure bundle to not warn about root user
|
# Configure bundle to not warn about root user
|
||||||
bundle config set silence_root_warning "true"; \
|
bundle config set silence_root_warning "true"; \
|
||||||
# Download and install required Gems
|
# Download and install required Gems
|
||||||
bundle install -j"$(nproc)";
|
bundle install -j"$(nproc)";
|
||||||
|
|
||||||
# Create temporary node specific build layer from build layer
|
# Create temporary node specific build layer from build layer
|
||||||
@ -288,9 +291,9 @@ COPY .yarn /opt/mastodon/.yarn
|
|||||||
|
|
||||||
# hadolint ignore=DL3008
|
# hadolint ignore=DL3008
|
||||||
RUN \
|
RUN \
|
||||||
--mount=type=cache,id=corepack-cache-${TARGETPLATFORM},target=/usr/local/share/.cache/corepack,sharing=locked \
|
--mount=type=cache,id=corepack-cache-${TARGETPLATFORM},target=/usr/local/share/.cache/corepack,sharing=locked \
|
||||||
--mount=type=cache,id=yarn-cache-${TARGETPLATFORM},target=/usr/local/share/.cache/yarn,sharing=locked \
|
--mount=type=cache,id=yarn-cache-${TARGETPLATFORM},target=/usr/local/share/.cache/yarn,sharing=locked \
|
||||||
# Install Node packages
|
# Install Node packages
|
||||||
yarn workspaces focus --production @mastodon/mastodon;
|
yarn workspaces focus --production @mastodon/mastodon;
|
||||||
|
|
||||||
# Create temporary assets build layer from build layer
|
# Create temporary assets build layer from build layer
|
||||||
@ -311,10 +314,10 @@ ARG TARGETPLATFORM
|
|||||||
|
|
||||||
RUN \
|
RUN \
|
||||||
ldconfig; \
|
ldconfig; \
|
||||||
# Use Ruby on Rails to create Mastodon assets
|
# Use Ruby on Rails to create Mastodon assets
|
||||||
SECRET_KEY_BASE_DUMMY=1 \
|
SECRET_KEY_BASE_DUMMY=1 \
|
||||||
bundle exec rails assets:precompile; \
|
bundle exec rails assets:precompile; \
|
||||||
# Cleanup temporary files
|
# Cleanup temporary files
|
||||||
rm -fr /opt/mastodon/tmp;
|
rm -fr /opt/mastodon/tmp;
|
||||||
|
|
||||||
# Prep final Mastodon Ruby layer
|
# Prep final Mastodon Ruby layer
|
||||||
@ -324,49 +327,49 @@ ARG TARGETPLATFORM
|
|||||||
|
|
||||||
# hadolint ignore=DL3008
|
# hadolint ignore=DL3008
|
||||||
RUN \
|
RUN \
|
||||||
# Mount Apt cache and lib directories from Docker buildx caches
|
# Mount Apt cache and lib directories from Docker buildx caches
|
||||||
--mount=type=cache,id=apt-cache-${TARGETPLATFORM},target=/var/cache/apt,sharing=locked \
|
--mount=type=cache,id=apt-cache-${TARGETPLATFORM},target=/var/cache/apt,sharing=locked \
|
||||||
--mount=type=cache,id=apt-lib-${TARGETPLATFORM},target=/var/lib/apt,sharing=locked \
|
--mount=type=cache,id=apt-lib-${TARGETPLATFORM},target=/var/lib/apt,sharing=locked \
|
||||||
# Mount Corepack and Yarn caches from Docker buildx caches
|
# Mount Corepack and Yarn caches from Docker buildx caches
|
||||||
--mount=type=cache,id=corepack-cache-${TARGETPLATFORM},target=/usr/local/share/.cache/corepack,sharing=locked \
|
--mount=type=cache,id=corepack-cache-${TARGETPLATFORM},target=/usr/local/share/.cache/corepack,sharing=locked \
|
||||||
--mount=type=cache,id=yarn-cache-${TARGETPLATFORM},target=/usr/local/share/.cache/yarn,sharing=locked \
|
--mount=type=cache,id=yarn-cache-${TARGETPLATFORM},target=/usr/local/share/.cache/yarn,sharing=locked \
|
||||||
# Apt update install non-dev versions of necessary components
|
# Apt update install non-dev versions of necessary components
|
||||||
apt-get install -y --no-install-recommends \
|
apt-get install -y --no-install-recommends \
|
||||||
libexpat1 \
|
libexpat1 \
|
||||||
libglib2.0-0 \
|
libglib2.0-0 \
|
||||||
libicu72 \
|
libicu72 \
|
||||||
libidn12 \
|
libidn12 \
|
||||||
libpq5 \
|
libpq5 \
|
||||||
libreadline8 \
|
libreadline8 \
|
||||||
libssl3 \
|
libssl3 \
|
||||||
libyaml-0-2 \
|
libyaml-0-2 \
|
||||||
# libvips components
|
# libvips components
|
||||||
libcgif0 \
|
libcgif0 \
|
||||||
libexif12 \
|
libexif12 \
|
||||||
libheif1 \
|
libheif1 \
|
||||||
libimagequant0 \
|
libimagequant0 \
|
||||||
libjpeg62-turbo \
|
libjpeg62-turbo \
|
||||||
liblcms2-2 \
|
liblcms2-2 \
|
||||||
liborc-0.4-0 \
|
liborc-0.4-0 \
|
||||||
libspng0 \
|
libspng0 \
|
||||||
libtiff6 \
|
libtiff6 \
|
||||||
libwebp7 \
|
libwebp7 \
|
||||||
libwebpdemux2 \
|
libwebpdemux2 \
|
||||||
libwebpmux3 \
|
libwebpmux3 \
|
||||||
# ffmpeg components
|
# ffmpeg components
|
||||||
libdav1d6 \
|
libdav1d6 \
|
||||||
libmp3lame0 \
|
libmp3lame0 \
|
||||||
libopencore-amrnb0 \
|
libopencore-amrnb0 \
|
||||||
libopencore-amrwb0 \
|
libopencore-amrwb0 \
|
||||||
libopus0 \
|
libopus0 \
|
||||||
libsnappy1v5 \
|
libsnappy1v5 \
|
||||||
libtheora0 \
|
libtheora0 \
|
||||||
libvorbis0a \
|
libvorbis0a \
|
||||||
libvorbisenc2 \
|
libvorbisenc2 \
|
||||||
libvorbisfile3 \
|
libvorbisfile3 \
|
||||||
libvpx7 \
|
libvpx7 \
|
||||||
libx264-164 \
|
libx264-164 \
|
||||||
libx265-199 \
|
libx265-199 \
|
||||||
;
|
;
|
||||||
|
|
||||||
# Copy Mastodon sources into final layer
|
# Copy Mastodon sources into final layer
|
||||||
@ -386,7 +389,7 @@ COPY --from=ffmpeg /usr/local/ffmpeg/lib /usr/local/lib
|
|||||||
|
|
||||||
RUN \
|
RUN \
|
||||||
ldconfig; \
|
ldconfig; \
|
||||||
# Smoketest media processors
|
# Smoketest media processors
|
||||||
vips -v; \
|
vips -v; \
|
||||||
ffmpeg -version; \
|
ffmpeg -version; \
|
||||||
ffprobe -version;
|
ffprobe -version;
|
||||||
@ -396,10 +399,10 @@ RUN \
|
|||||||
bundle exec bootsnap precompile --gemfile app/ lib/;
|
bundle exec bootsnap precompile --gemfile app/ lib/;
|
||||||
|
|
||||||
RUN \
|
RUN \
|
||||||
# Pre-create and chown system volume to Mastodon user
|
# Pre-create and chown system volume to Mastodon user
|
||||||
mkdir -p /opt/mastodon/public/system; \
|
mkdir -p /opt/mastodon/public/system; \
|
||||||
chown mastodon:mastodon /opt/mastodon/public/system; \
|
chown mastodon:mastodon /opt/mastodon/public/system; \
|
||||||
# Set Mastodon user as owner of tmp folder
|
# Set Mastodon user as owner of tmp folder
|
||||||
chown -R mastodon:mastodon /opt/mastodon/tmp;
|
chown -R mastodon:mastodon /opt/mastodon/tmp;
|
||||||
|
|
||||||
# Set the running user for resulting container
|
# Set the running user for resulting container
|
||||||
|
4
Gemfile
4
Gemfile
@ -114,7 +114,7 @@ group :opentelemetry do
|
|||||||
gem 'opentelemetry-instrumentation-net_http', '~> 0.22.4', require: false
|
gem 'opentelemetry-instrumentation-net_http', '~> 0.22.4', require: false
|
||||||
gem 'opentelemetry-instrumentation-pg', '~> 0.29.0', require: false
|
gem 'opentelemetry-instrumentation-pg', '~> 0.29.0', require: false
|
||||||
gem 'opentelemetry-instrumentation-rack', '~> 0.25.0', require: false
|
gem 'opentelemetry-instrumentation-rack', '~> 0.25.0', require: false
|
||||||
gem 'opentelemetry-instrumentation-rails', '~> 0.32.0', require: false
|
gem 'opentelemetry-instrumentation-rails', '~> 0.33.0', require: false
|
||||||
gem 'opentelemetry-instrumentation-redis', '~> 0.25.3', require: false
|
gem 'opentelemetry-instrumentation-redis', '~> 0.25.3', require: false
|
||||||
gem 'opentelemetry-instrumentation-sidekiq', '~> 0.25.2', require: false
|
gem 'opentelemetry-instrumentation-sidekiq', '~> 0.25.2', require: false
|
||||||
gem 'opentelemetry-sdk', '~> 1.4', require: false
|
gem 'opentelemetry-sdk', '~> 1.4', require: false
|
||||||
@ -172,7 +172,7 @@ group :development do
|
|||||||
gem 'rubocop-rspec_rails', require: false
|
gem 'rubocop-rspec_rails', require: false
|
||||||
|
|
||||||
# Annotates modules with schema
|
# Annotates modules with schema
|
||||||
gem 'annotate', '~> 3.2'
|
gem 'annotaterb', '~> 4.13'
|
||||||
|
|
||||||
# Enhanced error message pages for development
|
# Enhanced error message pages for development
|
||||||
gem 'better_errors', '~> 2.9'
|
gem 'better_errors', '~> 2.9'
|
||||||
|
28
Gemfile.lock
28
Gemfile.lock
@ -90,23 +90,21 @@ GEM
|
|||||||
public_suffix (>= 2.0.2, < 7.0)
|
public_suffix (>= 2.0.2, < 7.0)
|
||||||
aes_key_wrap (1.1.0)
|
aes_key_wrap (1.1.0)
|
||||||
android_key_attestation (0.3.0)
|
android_key_attestation (0.3.0)
|
||||||
annotate (3.2.0)
|
annotaterb (4.13.0)
|
||||||
activerecord (>= 3.2, < 8.0)
|
|
||||||
rake (>= 10.4, < 14.0)
|
|
||||||
ast (2.4.2)
|
ast (2.4.2)
|
||||||
attr_required (1.0.2)
|
attr_required (1.0.2)
|
||||||
awrence (1.2.1)
|
awrence (1.2.1)
|
||||||
aws-eventstream (1.3.0)
|
aws-eventstream (1.3.0)
|
||||||
aws-partitions (1.1004.0)
|
aws-partitions (1.1009.0)
|
||||||
aws-sdk-core (3.212.0)
|
aws-sdk-core (3.213.0)
|
||||||
aws-eventstream (~> 1, >= 1.3.0)
|
aws-eventstream (~> 1, >= 1.3.0)
|
||||||
aws-partitions (~> 1, >= 1.992.0)
|
aws-partitions (~> 1, >= 1.992.0)
|
||||||
aws-sigv4 (~> 1.9)
|
aws-sigv4 (~> 1.9)
|
||||||
jmespath (~> 1, >= 1.6.1)
|
jmespath (~> 1, >= 1.6.1)
|
||||||
aws-sdk-kms (1.95.0)
|
aws-sdk-kms (1.96.0)
|
||||||
aws-sdk-core (~> 3, >= 3.210.0)
|
aws-sdk-core (~> 3, >= 3.210.0)
|
||||||
aws-sigv4 (~> 1.5)
|
aws-sigv4 (~> 1.5)
|
||||||
aws-sdk-s3 (1.170.1)
|
aws-sdk-s3 (1.172.0)
|
||||||
aws-sdk-core (~> 3, >= 3.210.0)
|
aws-sdk-core (~> 3, >= 3.210.0)
|
||||||
aws-sdk-kms (~> 1)
|
aws-sdk-kms (~> 1)
|
||||||
aws-sigv4 (~> 1.5)
|
aws-sigv4 (~> 1.5)
|
||||||
@ -348,7 +346,7 @@ GEM
|
|||||||
json-ld-preloaded (3.3.1)
|
json-ld-preloaded (3.3.1)
|
||||||
json-ld (~> 3.3)
|
json-ld (~> 3.3)
|
||||||
rdf (~> 3.3)
|
rdf (~> 3.3)
|
||||||
json-schema (5.0.1)
|
json-schema (5.1.0)
|
||||||
addressable (~> 2.8)
|
addressable (~> 2.8)
|
||||||
jsonapi-renderer (0.2.2)
|
jsonapi-renderer (0.2.2)
|
||||||
jwt (2.7.1)
|
jwt (2.7.1)
|
||||||
@ -480,13 +478,13 @@ GEM
|
|||||||
opentelemetry-api (~> 1.0)
|
opentelemetry-api (~> 1.0)
|
||||||
opentelemetry-instrumentation-active_support (~> 0.1)
|
opentelemetry-instrumentation-active_support (~> 0.1)
|
||||||
opentelemetry-instrumentation-base (~> 0.22.1)
|
opentelemetry-instrumentation-base (~> 0.22.1)
|
||||||
opentelemetry-instrumentation-action_pack (0.9.0)
|
opentelemetry-instrumentation-action_pack (0.10.0)
|
||||||
opentelemetry-api (~> 1.0)
|
opentelemetry-api (~> 1.0)
|
||||||
opentelemetry-instrumentation-base (~> 0.22.1)
|
opentelemetry-instrumentation-base (~> 0.22.1)
|
||||||
opentelemetry-instrumentation-rack (~> 0.21)
|
opentelemetry-instrumentation-rack (~> 0.21)
|
||||||
opentelemetry-instrumentation-action_view (0.7.2)
|
opentelemetry-instrumentation-action_view (0.7.3)
|
||||||
opentelemetry-api (~> 1.0)
|
opentelemetry-api (~> 1.0)
|
||||||
opentelemetry-instrumentation-active_support (~> 0.1)
|
opentelemetry-instrumentation-active_support (~> 0.6)
|
||||||
opentelemetry-instrumentation-base (~> 0.22.1)
|
opentelemetry-instrumentation-base (~> 0.22.1)
|
||||||
opentelemetry-instrumentation-active_job (0.7.8)
|
opentelemetry-instrumentation-active_job (0.7.8)
|
||||||
opentelemetry-api (~> 1.0)
|
opentelemetry-api (~> 1.0)
|
||||||
@ -529,10 +527,10 @@ GEM
|
|||||||
opentelemetry-instrumentation-rack (0.25.0)
|
opentelemetry-instrumentation-rack (0.25.0)
|
||||||
opentelemetry-api (~> 1.0)
|
opentelemetry-api (~> 1.0)
|
||||||
opentelemetry-instrumentation-base (~> 0.22.1)
|
opentelemetry-instrumentation-base (~> 0.22.1)
|
||||||
opentelemetry-instrumentation-rails (0.32.0)
|
opentelemetry-instrumentation-rails (0.33.0)
|
||||||
opentelemetry-api (~> 1.0)
|
opentelemetry-api (~> 1.0)
|
||||||
opentelemetry-instrumentation-action_mailer (~> 0.2.0)
|
opentelemetry-instrumentation-action_mailer (~> 0.2.0)
|
||||||
opentelemetry-instrumentation-action_pack (~> 0.9.0)
|
opentelemetry-instrumentation-action_pack (~> 0.10.0)
|
||||||
opentelemetry-instrumentation-action_view (~> 0.7.0)
|
opentelemetry-instrumentation-action_view (~> 0.7.0)
|
||||||
opentelemetry-instrumentation-active_job (~> 0.7.0)
|
opentelemetry-instrumentation-active_job (~> 0.7.0)
|
||||||
opentelemetry-instrumentation-active_record (~> 0.8.0)
|
opentelemetry-instrumentation-active_record (~> 0.8.0)
|
||||||
@ -884,7 +882,7 @@ PLATFORMS
|
|||||||
DEPENDENCIES
|
DEPENDENCIES
|
||||||
active_model_serializers (~> 0.10)
|
active_model_serializers (~> 0.10)
|
||||||
addressable (~> 2.8)
|
addressable (~> 2.8)
|
||||||
annotate (~> 3.2)
|
annotaterb (~> 4.13)
|
||||||
aws-sdk-s3 (~> 1.123)
|
aws-sdk-s3 (~> 1.123)
|
||||||
better_errors (~> 2.9)
|
better_errors (~> 2.9)
|
||||||
binding_of_caller (~> 1.0)
|
binding_of_caller (~> 1.0)
|
||||||
@ -968,7 +966,7 @@ DEPENDENCIES
|
|||||||
opentelemetry-instrumentation-net_http (~> 0.22.4)
|
opentelemetry-instrumentation-net_http (~> 0.22.4)
|
||||||
opentelemetry-instrumentation-pg (~> 0.29.0)
|
opentelemetry-instrumentation-pg (~> 0.29.0)
|
||||||
opentelemetry-instrumentation-rack (~> 0.25.0)
|
opentelemetry-instrumentation-rack (~> 0.25.0)
|
||||||
opentelemetry-instrumentation-rails (~> 0.32.0)
|
opentelemetry-instrumentation-rails (~> 0.33.0)
|
||||||
opentelemetry-instrumentation-redis (~> 0.25.3)
|
opentelemetry-instrumentation-redis (~> 0.25.3)
|
||||||
opentelemetry-instrumentation-sidekiq (~> 0.25.2)
|
opentelemetry-instrumentation-sidekiq (~> 0.25.2)
|
||||||
opentelemetry-sdk (~> 1.4)
|
opentelemetry-sdk (~> 1.4)
|
||||||
|
@ -5,6 +5,8 @@ module Admin
|
|||||||
before_action :set_instances, only: :index
|
before_action :set_instances, only: :index
|
||||||
before_action :set_instance, except: :index
|
before_action :set_instance, except: :index
|
||||||
|
|
||||||
|
LOGS_LIMIT = 5
|
||||||
|
|
||||||
def index
|
def index
|
||||||
authorize :instance, :index?
|
authorize :instance, :index?
|
||||||
preload_delivery_failures!
|
preload_delivery_failures!
|
||||||
@ -13,7 +15,7 @@ module Admin
|
|||||||
def show
|
def show
|
||||||
authorize :instance, :show?
|
authorize :instance, :show?
|
||||||
@time_period = (6.days.ago.to_date...Time.now.utc.to_date)
|
@time_period = (6.days.ago.to_date...Time.now.utc.to_date)
|
||||||
@action_logs = Admin::ActionLogFilter.new(target_domain: @instance.domain).results.limit(5)
|
@action_logs = Admin::ActionLogFilter.new(target_domain: @instance.domain).results.limit(LOGS_LIMIT)
|
||||||
end
|
end
|
||||||
|
|
||||||
def destroy
|
def destroy
|
||||||
|
@ -12,7 +12,7 @@ class Api::V1::Accounts::FamiliarFollowersController < Api::BaseController
|
|||||||
private
|
private
|
||||||
|
|
||||||
def set_accounts
|
def set_accounts
|
||||||
@accounts = Account.without_suspended.where(id: account_ids).select('id, hide_collections')
|
@accounts = Account.without_suspended.where(id: account_ids).select(:id, :hide_collections)
|
||||||
end
|
end
|
||||||
|
|
||||||
def familiar_followers
|
def familiar_followers
|
||||||
|
@ -5,6 +5,8 @@ class Api::V1::FeaturedTags::SuggestionsController < Api::BaseController
|
|||||||
before_action :require_user!
|
before_action :require_user!
|
||||||
before_action :set_recently_used_tags, only: :index
|
before_action :set_recently_used_tags, only: :index
|
||||||
|
|
||||||
|
RECENT_TAGS_LIMIT = 10
|
||||||
|
|
||||||
def index
|
def index
|
||||||
render json: @recently_used_tags, each_serializer: REST::TagSerializer, relationships: TagRelationshipsPresenter.new(@recently_used_tags, current_user&.account_id)
|
render json: @recently_used_tags, each_serializer: REST::TagSerializer, relationships: TagRelationshipsPresenter.new(@recently_used_tags, current_user&.account_id)
|
||||||
end
|
end
|
||||||
@ -12,6 +14,6 @@ class Api::V1::FeaturedTags::SuggestionsController < Api::BaseController
|
|||||||
private
|
private
|
||||||
|
|
||||||
def set_recently_used_tags
|
def set_recently_used_tags
|
||||||
@recently_used_tags = Tag.suggestions_for_account(current_account).limit(10)
|
@recently_used_tags = Tag.suggestions_for_account(current_account).limit(RECENT_TAGS_LIMIT)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -15,17 +15,12 @@ class Api::V1::Lists::AccountsController < Api::BaseController
|
|||||||
end
|
end
|
||||||
|
|
||||||
def create
|
def create
|
||||||
ApplicationRecord.transaction do
|
AddAccountsToListService.new.call(@list, Account.find(account_ids))
|
||||||
list_accounts.each do |account|
|
|
||||||
@list.accounts << account
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
render_empty
|
render_empty
|
||||||
end
|
end
|
||||||
|
|
||||||
def destroy
|
def destroy
|
||||||
ListAccount.where(list: @list, account_id: account_ids).destroy_all
|
RemoveAccountsFromListService.new.call(@list, Account.where(id: account_ids))
|
||||||
render_empty
|
render_empty
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -43,10 +38,6 @@ class Api::V1::Lists::AccountsController < Api::BaseController
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def list_accounts
|
|
||||||
Account.find(account_ids)
|
|
||||||
end
|
|
||||||
|
|
||||||
def account_ids
|
def account_ids
|
||||||
Array(resource_params[:account_ids])
|
Array(resource_params[:account_ids])
|
||||||
end
|
end
|
||||||
|
@ -5,6 +5,8 @@ class Settings::FeaturedTagsController < Settings::BaseController
|
|||||||
before_action :set_featured_tag, except: [:index, :create]
|
before_action :set_featured_tag, except: [:index, :create]
|
||||||
before_action :set_recently_used_tags, only: :index
|
before_action :set_recently_used_tags, only: :index
|
||||||
|
|
||||||
|
RECENT_TAGS_LIMIT = 10
|
||||||
|
|
||||||
def index
|
def index
|
||||||
@featured_tag = FeaturedTag.new
|
@featured_tag = FeaturedTag.new
|
||||||
end
|
end
|
||||||
@ -38,7 +40,7 @@ class Settings::FeaturedTagsController < Settings::BaseController
|
|||||||
end
|
end
|
||||||
|
|
||||||
def set_recently_used_tags
|
def set_recently_used_tags
|
||||||
@recently_used_tags = Tag.suggestions_for_account(current_account).limit(10)
|
@recently_used_tags = Tag.suggestions_for_account(current_account).limit(RECENT_TAGS_LIMIT)
|
||||||
end
|
end
|
||||||
|
|
||||||
def featured_tag_params
|
def featured_tag_params
|
||||||
|
@ -24,6 +24,8 @@ class Settings::ImportsController < Settings::BaseController
|
|||||||
lists: false,
|
lists: false,
|
||||||
}.freeze
|
}.freeze
|
||||||
|
|
||||||
|
RECENT_IMPORTS_LIMIT = 10
|
||||||
|
|
||||||
def index
|
def index
|
||||||
@import = Form::Import.new(current_account: current_account)
|
@import = Form::Import.new(current_account: current_account)
|
||||||
end
|
end
|
||||||
@ -96,6 +98,6 @@ class Settings::ImportsController < Settings::BaseController
|
|||||||
end
|
end
|
||||||
|
|
||||||
def set_recent_imports
|
def set_recent_imports
|
||||||
@recent_imports = current_account.bulk_imports.reorder(id: :desc).limit(10)
|
@recent_imports = current_account.bulk_imports.reorder(id: :desc).limit(RECENT_IMPORTS_LIMIT)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -1,9 +1,11 @@
|
|||||||
# frozen_string_literal: true
|
# frozen_string_literal: true
|
||||||
|
|
||||||
module SelfDestructHelper
|
module SelfDestructHelper
|
||||||
|
VERIFY_PURPOSE = 'self-destruct'
|
||||||
|
|
||||||
def self.self_destruct?
|
def self.self_destruct?
|
||||||
value = ENV.fetch('SELF_DESTRUCT', nil)
|
value = Rails.configuration.x.mastodon.self_destruct_value
|
||||||
value.present? && Rails.application.message_verifier('self-destruct').verify(value) == ENV['LOCAL_DOMAIN']
|
value.present? && Rails.application.message_verifier(VERIFY_PURPOSE).verify(value) == ENV['LOCAL_DOMAIN']
|
||||||
rescue ActiveSupport::MessageVerifier::InvalidSignature
|
rescue ActiveSupport::MessageVerifier::InvalidSignature
|
||||||
false
|
false
|
||||||
end
|
end
|
||||||
|
@ -1,9 +1,6 @@
|
|||||||
# frozen_string_literal: true
|
# frozen_string_literal: true
|
||||||
|
|
||||||
module StatusesHelper
|
module StatusesHelper
|
||||||
EMBEDDED_CONTROLLER = 'statuses'
|
|
||||||
EMBEDDED_ACTION = 'embed'
|
|
||||||
|
|
||||||
VISIBLITY_ICONS = {
|
VISIBLITY_ICONS = {
|
||||||
public: 'globe',
|
public: 'globe',
|
||||||
unlisted: 'lock_open',
|
unlisted: 'lock_open',
|
||||||
@ -60,18 +57,10 @@ module StatusesHelper
|
|||||||
components.compact_blank.join("\n\n")
|
components.compact_blank.join("\n\n")
|
||||||
end
|
end
|
||||||
|
|
||||||
def stream_link_target
|
|
||||||
embedded_view? ? '_blank' : nil
|
|
||||||
end
|
|
||||||
|
|
||||||
def visibility_icon(status)
|
def visibility_icon(status)
|
||||||
VISIBLITY_ICONS[status.visibility.to_sym]
|
VISIBLITY_ICONS[status.visibility.to_sym]
|
||||||
end
|
end
|
||||||
|
|
||||||
def embedded_view?
|
|
||||||
params[:controller] == EMBEDDED_CONTROLLER && params[:action] == EMBEDDED_ACTION
|
|
||||||
end
|
|
||||||
|
|
||||||
def prefers_autoplay?
|
def prefers_autoplay?
|
||||||
ActiveModel::Type::Boolean.new.cast(params[:autoplay]) || current_user&.setting_auto_play_gif
|
ActiveModel::Type::Boolean.new.cast(params[:autoplay]) || current_user&.setting_auto_play_gif
|
||||||
end
|
end
|
||||||
|
@ -141,6 +141,9 @@ export const pollRecentNotifications = createDataLoadingThunk(
|
|||||||
|
|
||||||
return { notifications };
|
return { notifications };
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
useLoadingBar: false,
|
||||||
|
},
|
||||||
);
|
);
|
||||||
|
|
||||||
export const processNewNotificationForGroups = createAppAsyncThunk(
|
export const processNewNotificationForGroups = createAppAsyncThunk(
|
||||||
|
@ -128,6 +128,8 @@ export const BoostModal: React.FC<{
|
|||||||
? messages.cancel_reblog
|
? messages.cancel_reblog
|
||||||
: messages.reblog,
|
: messages.reblog,
|
||||||
)}
|
)}
|
||||||
|
/* eslint-disable-next-line jsx-a11y/no-autofocus -- We are in the modal */
|
||||||
|
autoFocus
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -490,6 +490,7 @@
|
|||||||
"notification.label.private_reply": "رد خاص",
|
"notification.label.private_reply": "رد خاص",
|
||||||
"notification.label.reply": "ردّ",
|
"notification.label.reply": "ردّ",
|
||||||
"notification.mention": "إشارة",
|
"notification.mention": "إشارة",
|
||||||
|
"notification.mentioned_you": "{name} mentioned you",
|
||||||
"notification.moderation-warning.learn_more": "اعرف المزيد",
|
"notification.moderation-warning.learn_more": "اعرف المزيد",
|
||||||
"notification.moderation_warning": "لقد تلقيت تحذيرًا بالإشراف",
|
"notification.moderation_warning": "لقد تلقيت تحذيرًا بالإشراف",
|
||||||
"notification.moderation_warning.action_delete_statuses": "تم حذف بعض من منشوراتك.",
|
"notification.moderation_warning.action_delete_statuses": "تم حذف بعض من منشوراتك.",
|
||||||
|
@ -87,16 +87,23 @@
|
|||||||
"alert.unexpected.title": "Опаа!",
|
"alert.unexpected.title": "Опаа!",
|
||||||
"alt_text_badge.title": "Алтернативен текст",
|
"alt_text_badge.title": "Алтернативен текст",
|
||||||
"announcement.announcement": "Оповестяване",
|
"announcement.announcement": "Оповестяване",
|
||||||
|
"annual_report.summary.archetype.booster": "Якият подсилвател",
|
||||||
"annual_report.summary.archetype.lurker": "Дебнещото",
|
"annual_report.summary.archetype.lurker": "Дебнещото",
|
||||||
"annual_report.summary.archetype.oracle": "Оракул",
|
"annual_report.summary.archetype.oracle": "Оракул",
|
||||||
"annual_report.summary.archetype.pollster": "Анкетьорче",
|
"annual_report.summary.archetype.pollster": "Анкетьорче",
|
||||||
"annual_report.summary.archetype.replier": "Социална пеперуда",
|
"annual_report.summary.archetype.replier": "Социална пеперуда",
|
||||||
"annual_report.summary.followers.followers": "последователи",
|
"annual_report.summary.followers.followers": "последователи",
|
||||||
"annual_report.summary.followers.total": "{count} общо",
|
"annual_report.summary.followers.total": "{count} общо",
|
||||||
|
"annual_report.summary.here_it_is": "Ето преглед на вашата {year} година:",
|
||||||
"annual_report.summary.highlighted_post.by_favourites": "най-правено като любима публикация",
|
"annual_report.summary.highlighted_post.by_favourites": "най-правено като любима публикация",
|
||||||
|
"annual_report.summary.highlighted_post.by_reblogs": "най-подсилваната публикация",
|
||||||
|
"annual_report.summary.highlighted_post.by_replies": "публикации с най-много отговори",
|
||||||
|
"annual_report.summary.highlighted_post.possessive": "на {name}",
|
||||||
"annual_report.summary.most_used_app.most_used_app": "най-употребявано приложение",
|
"annual_report.summary.most_used_app.most_used_app": "най-употребявано приложение",
|
||||||
"annual_report.summary.most_used_hashtag.most_used_hashtag": "най-употребяван хаштаг",
|
"annual_report.summary.most_used_hashtag.most_used_hashtag": "най-употребяван хаштаг",
|
||||||
"annual_report.summary.new_posts.new_posts": "нови публикации",
|
"annual_report.summary.new_posts.new_posts": "нови публикации",
|
||||||
|
"annual_report.summary.percentile.text": "<topLabel>Това ви слага най-отгоре</topLabel><percentage></percentage><bottomLabel>сред потребителите на Mastodon.</bottomLabel>",
|
||||||
|
"annual_report.summary.percentile.we_wont_tell_bernie": "Няма да кажем на Бърни Сандърс.",
|
||||||
"annual_report.summary.thanks": "Благодарим, че сте част от Mastodon!",
|
"annual_report.summary.thanks": "Благодарим, че сте част от Mastodon!",
|
||||||
"attachments_list.unprocessed": "(необработено)",
|
"attachments_list.unprocessed": "(необработено)",
|
||||||
"audio.hide": "Скриване на звука",
|
"audio.hide": "Скриване на звука",
|
||||||
@ -634,7 +641,7 @@
|
|||||||
"onboarding.steps.follow_people.title": "Персонализиране на началния ви инфоканал",
|
"onboarding.steps.follow_people.title": "Персонализиране на началния ви инфоканал",
|
||||||
"onboarding.steps.publish_status.body": "Поздравете целия свят.",
|
"onboarding.steps.publish_status.body": "Поздравете целия свят.",
|
||||||
"onboarding.steps.publish_status.title": "Направете първата си публикация",
|
"onboarding.steps.publish_status.title": "Направете първата си публикация",
|
||||||
"onboarding.steps.setup_profile.body": "Други са по-вероятно да взаимодействат с вас с попълнения профил.",
|
"onboarding.steps.setup_profile.body": "Подсилете взаимодействията си, имайки изчерпателен профил.",
|
||||||
"onboarding.steps.setup_profile.title": "Пригодете профила си",
|
"onboarding.steps.setup_profile.title": "Пригодете профила си",
|
||||||
"onboarding.steps.share_profile.body": "Позволете на приятелите си да знаят как да ви намират в Mastodon!",
|
"onboarding.steps.share_profile.body": "Позволете на приятелите си да знаят как да ви намират в Mastodon!",
|
||||||
"onboarding.steps.share_profile.title": "Споделяне на профила ви",
|
"onboarding.steps.share_profile.title": "Споделяне на профила ви",
|
||||||
|
@ -101,7 +101,7 @@
|
|||||||
"annual_report.summary.highlighted_post.possessive": "{name}",
|
"annual_report.summary.highlighted_post.possessive": "{name}",
|
||||||
"annual_report.summary.most_used_app.most_used_app": "am häufigsten verwendete App",
|
"annual_report.summary.most_used_app.most_used_app": "am häufigsten verwendete App",
|
||||||
"annual_report.summary.most_used_hashtag.most_used_hashtag": "am häufigsten verwendeter Hashtag",
|
"annual_report.summary.most_used_hashtag.most_used_hashtag": "am häufigsten verwendeter Hashtag",
|
||||||
"annual_report.summary.most_used_hashtag.none": "Kein",
|
"annual_report.summary.most_used_hashtag.none": "Keiner",
|
||||||
"annual_report.summary.new_posts.new_posts": "neue Beiträge",
|
"annual_report.summary.new_posts.new_posts": "neue Beiträge",
|
||||||
"annual_report.summary.percentile.text": "<topLabel>Damit gehörst du zu den obersten</topLabel><percentage></percentage><bottomLabel>der Mastodon-Nutzer*innen.</bottomLabel>",
|
"annual_report.summary.percentile.text": "<topLabel>Damit gehörst du zu den obersten</topLabel><percentage></percentage><bottomLabel>der Mastodon-Nutzer*innen.</bottomLabel>",
|
||||||
"annual_report.summary.percentile.we_wont_tell_bernie": "Wir werden Bernie nichts verraten.",
|
"annual_report.summary.percentile.we_wont_tell_bernie": "Wir werden Bernie nichts verraten.",
|
||||||
@ -688,7 +688,7 @@
|
|||||||
"poll_button.remove_poll": "Umfrage entfernen",
|
"poll_button.remove_poll": "Umfrage entfernen",
|
||||||
"privacy.change": "Sichtbarkeit anpassen",
|
"privacy.change": "Sichtbarkeit anpassen",
|
||||||
"privacy.direct.long": "Alle in diesem Beitrag erwähnten Profile",
|
"privacy.direct.long": "Alle in diesem Beitrag erwähnten Profile",
|
||||||
"privacy.direct.short": "Bestimmte Profile",
|
"privacy.direct.short": "Ausgewählte Profile",
|
||||||
"privacy.private.long": "Nur deine Follower",
|
"privacy.private.long": "Nur deine Follower",
|
||||||
"privacy.private.short": "Follower",
|
"privacy.private.short": "Follower",
|
||||||
"privacy.public.long": "Alle in und außerhalb von Mastodon",
|
"privacy.public.long": "Alle in und außerhalb von Mastodon",
|
||||||
|
@ -38,7 +38,7 @@
|
|||||||
"account.following": "Seuratut",
|
"account.following": "Seuratut",
|
||||||
"account.following_counter": "{count, plural, one {{counter} seurattu} other {{counter} seurattua}}",
|
"account.following_counter": "{count, plural, one {{counter} seurattu} other {{counter} seurattua}}",
|
||||||
"account.follows.empty": "Tämä käyttäjä ei vielä seuraa ketään.",
|
"account.follows.empty": "Tämä käyttäjä ei vielä seuraa ketään.",
|
||||||
"account.go_to_profile": "Mene profiiliin",
|
"account.go_to_profile": "Siirry profiiliin",
|
||||||
"account.hide_reblogs": "Piilota käyttäjän @{name} tehostukset",
|
"account.hide_reblogs": "Piilota käyttäjän @{name} tehostukset",
|
||||||
"account.in_memoriam": "Muistoissamme.",
|
"account.in_memoriam": "Muistoissamme.",
|
||||||
"account.joined_short": "Liittynyt",
|
"account.joined_short": "Liittynyt",
|
||||||
@ -101,6 +101,7 @@
|
|||||||
"annual_report.summary.highlighted_post.possessive": "Käyttäjän {name}",
|
"annual_report.summary.highlighted_post.possessive": "Käyttäjän {name}",
|
||||||
"annual_report.summary.most_used_app.most_used_app": "käytetyin sovellus",
|
"annual_report.summary.most_used_app.most_used_app": "käytetyin sovellus",
|
||||||
"annual_report.summary.most_used_hashtag.most_used_hashtag": "käytetyin aihetunniste",
|
"annual_report.summary.most_used_hashtag.most_used_hashtag": "käytetyin aihetunniste",
|
||||||
|
"annual_report.summary.most_used_hashtag.none": "Ei mitään",
|
||||||
"annual_report.summary.new_posts.new_posts": "uutta julkaisua",
|
"annual_report.summary.new_posts.new_posts": "uutta julkaisua",
|
||||||
"annual_report.summary.percentile.text": "<topLabel>Olet osa huippujoukkoa, johon kuuluu</topLabel><percentage></percentage><bottomLabel>Mastodon-käyttäjistä.</bottomLabel>",
|
"annual_report.summary.percentile.text": "<topLabel>Olet osa huippujoukkoa, johon kuuluu</topLabel><percentage></percentage><bottomLabel>Mastodon-käyttäjistä.</bottomLabel>",
|
||||||
"annual_report.summary.thanks": "Kiitos, että olet osa Mastodonia!",
|
"annual_report.summary.thanks": "Kiitos, että olet osa Mastodonia!",
|
||||||
|
@ -101,6 +101,7 @@
|
|||||||
"annual_report.summary.highlighted_post.possessive": "{name}'s",
|
"annual_report.summary.highlighted_post.possessive": "{name}'s",
|
||||||
"annual_report.summary.most_used_app.most_used_app": "aip is mó a úsáidtear",
|
"annual_report.summary.most_used_app.most_used_app": "aip is mó a úsáidtear",
|
||||||
"annual_report.summary.most_used_hashtag.most_used_hashtag": "hashtag is mó a úsáidtear",
|
"annual_report.summary.most_used_hashtag.most_used_hashtag": "hashtag is mó a úsáidtear",
|
||||||
|
"annual_report.summary.most_used_hashtag.none": "Dada",
|
||||||
"annual_report.summary.new_posts.new_posts": "postanna nua",
|
"annual_report.summary.new_posts.new_posts": "postanna nua",
|
||||||
"annual_report.summary.percentile.text": "<topLabel>Cuireann sé sin i mbarr</topLabel><percentage></percentage><bottomLabel> úsáideoirí Mastodon.</bottomLabel>",
|
"annual_report.summary.percentile.text": "<topLabel>Cuireann sé sin i mbarr</topLabel><percentage></percentage><bottomLabel> úsáideoirí Mastodon.</bottomLabel>",
|
||||||
"annual_report.summary.percentile.we_wont_tell_bernie": "Ní inseoidh muid do Bernie.",
|
"annual_report.summary.percentile.we_wont_tell_bernie": "Ní inseoidh muid do Bernie.",
|
||||||
|
@ -101,6 +101,7 @@
|
|||||||
"annual_report.summary.highlighted_post.possessive": "של {name}",
|
"annual_report.summary.highlighted_post.possessive": "של {name}",
|
||||||
"annual_report.summary.most_used_app.most_used_app": "היישומון שהכי בשימוש",
|
"annual_report.summary.most_used_app.most_used_app": "היישומון שהכי בשימוש",
|
||||||
"annual_report.summary.most_used_hashtag.most_used_hashtag": "התג בשימוש הרב ביותר",
|
"annual_report.summary.most_used_hashtag.most_used_hashtag": "התג בשימוש הרב ביותר",
|
||||||
|
"annual_report.summary.most_used_hashtag.none": "אף אחד",
|
||||||
"annual_report.summary.new_posts.new_posts": "הודעות חדשות",
|
"annual_report.summary.new_posts.new_posts": "הודעות חדשות",
|
||||||
"annual_report.summary.percentile.text": "<topLabel>ממקם אותך באחוזון </topLabel><percentage></percentage><bottomLabel>של משמשי מסטודון.</bottomLabel>",
|
"annual_report.summary.percentile.text": "<topLabel>ממקם אותך באחוזון </topLabel><percentage></percentage><bottomLabel>של משמשי מסטודון.</bottomLabel>",
|
||||||
"annual_report.summary.percentile.we_wont_tell_bernie": "לא נגלה לברני.",
|
"annual_report.summary.percentile.we_wont_tell_bernie": "לא נגלה לברני.",
|
||||||
|
@ -87,6 +87,25 @@
|
|||||||
"alert.unexpected.title": "Ups!",
|
"alert.unexpected.title": "Ups!",
|
||||||
"alt_text_badge.title": "Texto alt",
|
"alt_text_badge.title": "Texto alt",
|
||||||
"announcement.announcement": "Annuncio",
|
"announcement.announcement": "Annuncio",
|
||||||
|
"annual_report.summary.archetype.booster": "Le impulsator",
|
||||||
|
"annual_report.summary.archetype.lurker": "Le lector",
|
||||||
|
"annual_report.summary.archetype.oracle": "Le oraculo",
|
||||||
|
"annual_report.summary.archetype.pollster": "Le sondagista",
|
||||||
|
"annual_report.summary.archetype.replier": "Le responditor",
|
||||||
|
"annual_report.summary.followers.followers": "sequitores",
|
||||||
|
"annual_report.summary.followers.total": "{count} in total",
|
||||||
|
"annual_report.summary.here_it_is": "Ecce tu summario de {year}:",
|
||||||
|
"annual_report.summary.highlighted_post.by_favourites": "message le plus favorite",
|
||||||
|
"annual_report.summary.highlighted_post.by_reblogs": "message le plus impulsate",
|
||||||
|
"annual_report.summary.highlighted_post.by_replies": "message le plus respondite",
|
||||||
|
"annual_report.summary.highlighted_post.possessive": "{name}, ecce tu…",
|
||||||
|
"annual_report.summary.most_used_app.most_used_app": "application le plus usate",
|
||||||
|
"annual_report.summary.most_used_hashtag.most_used_hashtag": "hashtag le plus usate",
|
||||||
|
"annual_report.summary.most_used_hashtag.none": "Necun",
|
||||||
|
"annual_report.summary.new_posts.new_posts": "nove messages",
|
||||||
|
"annual_report.summary.percentile.text": "<topLabel>Isto te pone in le prime</topLabel><percentage></percentage><bottomLabel>del usatores de Mastodon.</bottomLabel>",
|
||||||
|
"annual_report.summary.percentile.we_wont_tell_bernie": "Tu es un primo inter pares.",
|
||||||
|
"annual_report.summary.thanks": "Gratias pro facer parte de Mastodon!",
|
||||||
"attachments_list.unprocessed": "(non processate)",
|
"attachments_list.unprocessed": "(non processate)",
|
||||||
"audio.hide": "Celar audio",
|
"audio.hide": "Celar audio",
|
||||||
"block_modal.remote_users_caveat": "Nos demandera al servitor {domain} de respectar tu decision. Nonobstante, le conformitate non es garantite perque alcun servitores pote tractar le blocadas de maniera differente. Le messages public pote esser totevia visibile pro le usatores non authenticate.",
|
"block_modal.remote_users_caveat": "Nos demandera al servitor {domain} de respectar tu decision. Nonobstante, le conformitate non es garantite perque alcun servitores pote tractar le blocadas de maniera differente. Le messages public pote esser totevia visibile pro le usatores non authenticate.",
|
||||||
@ -158,6 +177,7 @@
|
|||||||
"compose_form.poll.duration": "Durata del sondage",
|
"compose_form.poll.duration": "Durata del sondage",
|
||||||
"compose_form.poll.multiple": "Selection multiple",
|
"compose_form.poll.multiple": "Selection multiple",
|
||||||
"compose_form.poll.option_placeholder": "Option {number}",
|
"compose_form.poll.option_placeholder": "Option {number}",
|
||||||
|
"compose_form.poll.single": "Option singule",
|
||||||
"compose_form.poll.switch_to_multiple": "Cambiar le sondage pro permitter selectiones multiple",
|
"compose_form.poll.switch_to_multiple": "Cambiar le sondage pro permitter selectiones multiple",
|
||||||
"compose_form.poll.switch_to_single": "Cambiar le sondage pro permitter selection singule",
|
"compose_form.poll.switch_to_single": "Cambiar le sondage pro permitter selection singule",
|
||||||
"compose_form.poll.type": "Stilo",
|
"compose_form.poll.type": "Stilo",
|
||||||
@ -196,6 +216,7 @@
|
|||||||
"confirmations.unfollow.title": "Cessar de sequer le usator?",
|
"confirmations.unfollow.title": "Cessar de sequer le usator?",
|
||||||
"content_warning.hide": "Celar le message",
|
"content_warning.hide": "Celar le message",
|
||||||
"content_warning.show": "Monstrar in omne caso",
|
"content_warning.show": "Monstrar in omne caso",
|
||||||
|
"content_warning.show_more": "Monstrar plus",
|
||||||
"conversation.delete": "Deler conversation",
|
"conversation.delete": "Deler conversation",
|
||||||
"conversation.mark_as_read": "Marcar como legite",
|
"conversation.mark_as_read": "Marcar como legite",
|
||||||
"conversation.open": "Vider conversation",
|
"conversation.open": "Vider conversation",
|
||||||
@ -304,6 +325,7 @@
|
|||||||
"filter_modal.select_filter.subtitle": "Usa un categoria existente o crea un nove",
|
"filter_modal.select_filter.subtitle": "Usa un categoria existente o crea un nove",
|
||||||
"filter_modal.select_filter.title": "Filtrar iste message",
|
"filter_modal.select_filter.title": "Filtrar iste message",
|
||||||
"filter_modal.title.status": "Filtrar un message",
|
"filter_modal.title.status": "Filtrar un message",
|
||||||
|
"filter_warning.matches_filter": "Corresponde al filtro “<span>{title}</span>”",
|
||||||
"filtered_notifications_banner.pending_requests": "De {count, plural, =0 {nemo} one {un persona} other {# personas}} que tu pote cognoscer",
|
"filtered_notifications_banner.pending_requests": "De {count, plural, =0 {nemo} one {un persona} other {# personas}} que tu pote cognoscer",
|
||||||
"filtered_notifications_banner.title": "Notificationes filtrate",
|
"filtered_notifications_banner.title": "Notificationes filtrate",
|
||||||
"firehose.all": "Toto",
|
"firehose.all": "Toto",
|
||||||
@ -383,6 +405,7 @@
|
|||||||
"interaction_modal.description.follow": "Con un conto sur Mastodon, tu pote sequer {name} e reciper su messages in tu fluxo de initio.",
|
"interaction_modal.description.follow": "Con un conto sur Mastodon, tu pote sequer {name} e reciper su messages in tu fluxo de initio.",
|
||||||
"interaction_modal.description.reblog": "Con un conto sur Mastodon, tu pote impulsar iste message pro condivider lo con tu proprie sequitores.",
|
"interaction_modal.description.reblog": "Con un conto sur Mastodon, tu pote impulsar iste message pro condivider lo con tu proprie sequitores.",
|
||||||
"interaction_modal.description.reply": "Con un conto sur Mastodon, tu pote responder a iste message.",
|
"interaction_modal.description.reply": "Con un conto sur Mastodon, tu pote responder a iste message.",
|
||||||
|
"interaction_modal.description.vote": "Con un conto sur Mastodon, tu pote votar in iste sondage.",
|
||||||
"interaction_modal.login.action": "Porta me a casa",
|
"interaction_modal.login.action": "Porta me a casa",
|
||||||
"interaction_modal.login.prompt": "Dominio de tu servitor, p.ex. mastodon.social",
|
"interaction_modal.login.prompt": "Dominio de tu servitor, p.ex. mastodon.social",
|
||||||
"interaction_modal.no_account_yet": "Non sur Mstodon?",
|
"interaction_modal.no_account_yet": "Non sur Mstodon?",
|
||||||
@ -394,6 +417,7 @@
|
|||||||
"interaction_modal.title.follow": "Sequer {name}",
|
"interaction_modal.title.follow": "Sequer {name}",
|
||||||
"interaction_modal.title.reblog": "Impulsar le message de {name}",
|
"interaction_modal.title.reblog": "Impulsar le message de {name}",
|
||||||
"interaction_modal.title.reply": "Responder al message de {name}",
|
"interaction_modal.title.reply": "Responder al message de {name}",
|
||||||
|
"interaction_modal.title.vote": "Votar in le sondage de {name}",
|
||||||
"intervals.full.days": "{number, plural, one {# die} other {# dies}}",
|
"intervals.full.days": "{number, plural, one {# die} other {# dies}}",
|
||||||
"intervals.full.hours": "{number, plural, one {# hora} other {# horas}}",
|
"intervals.full.hours": "{number, plural, one {# hora} other {# horas}}",
|
||||||
"intervals.full.minutes": "{number, plural, one {# minuta} other {# minutas}}",
|
"intervals.full.minutes": "{number, plural, one {# minuta} other {# minutas}}",
|
||||||
@ -503,9 +527,12 @@
|
|||||||
"notification.admin.report_statuses_other": "{name} ha reportate {target}",
|
"notification.admin.report_statuses_other": "{name} ha reportate {target}",
|
||||||
"notification.admin.sign_up": "{name} se ha inscribite",
|
"notification.admin.sign_up": "{name} se ha inscribite",
|
||||||
"notification.admin.sign_up.name_and_others": "{name} e {count, plural, one {# altere usator} other {altere # usatores}} se inscribeva",
|
"notification.admin.sign_up.name_and_others": "{name} e {count, plural, one {# altere usator} other {altere # usatores}} se inscribeva",
|
||||||
|
"notification.annual_report.message": "Tu summario #Wrapstodon pro {year} attende! Revela le momentos saliente e memorabile de tu anno sur Mastodon!",
|
||||||
|
"notification.annual_report.view": "Visitar summario #Wrapstodon",
|
||||||
"notification.favourite": "{name} ha marcate tu message como favorite",
|
"notification.favourite": "{name} ha marcate tu message como favorite",
|
||||||
"notification.favourite.name_and_others_with_link": "{name} e <a>{count, plural, one {# altere} other {# alteres}}</a> favoriva tu message",
|
"notification.favourite.name_and_others_with_link": "{name} e <a>{count, plural, one {# altere} other {# alteres}}</a> favoriva tu message",
|
||||||
"notification.follow": "{name} te ha sequite",
|
"notification.follow": "{name} te ha sequite",
|
||||||
|
"notification.follow.name_and_others": "{name} e <a>{count, plural, one {# other} other {# alteres}}</a> te ha sequite",
|
||||||
"notification.follow_request": "{name} ha requestate de sequer te",
|
"notification.follow_request": "{name} ha requestate de sequer te",
|
||||||
"notification.follow_request.name_and_others": "{name} e {count, plural, one {# altere} other {# alteres}} ha demandate de sequer te",
|
"notification.follow_request.name_and_others": "{name} e {count, plural, one {# altere} other {# alteres}} ha demandate de sequer te",
|
||||||
"notification.label.mention": "Mention",
|
"notification.label.mention": "Mention",
|
||||||
@ -564,6 +591,7 @@
|
|||||||
"notifications.column_settings.filter_bar.category": "Barra de filtro rapide",
|
"notifications.column_settings.filter_bar.category": "Barra de filtro rapide",
|
||||||
"notifications.column_settings.follow": "Nove sequitores:",
|
"notifications.column_settings.follow": "Nove sequitores:",
|
||||||
"notifications.column_settings.follow_request": "Nove requestas de sequimento:",
|
"notifications.column_settings.follow_request": "Nove requestas de sequimento:",
|
||||||
|
"notifications.column_settings.group": "Gruppo",
|
||||||
"notifications.column_settings.mention": "Mentiones:",
|
"notifications.column_settings.mention": "Mentiones:",
|
||||||
"notifications.column_settings.poll": "Resultatos del sondage:",
|
"notifications.column_settings.poll": "Resultatos del sondage:",
|
||||||
"notifications.column_settings.push": "Notificationes push",
|
"notifications.column_settings.push": "Notificationes push",
|
||||||
|
@ -88,6 +88,7 @@
|
|||||||
"alt_text_badge.title": "Testo alternativo",
|
"alt_text_badge.title": "Testo alternativo",
|
||||||
"announcement.announcement": "Annuncio",
|
"announcement.announcement": "Annuncio",
|
||||||
"annual_report.summary.archetype.oracle": "L'oracolo",
|
"annual_report.summary.archetype.oracle": "L'oracolo",
|
||||||
|
"annual_report.summary.archetype.pollster": "Sondaggista",
|
||||||
"annual_report.summary.followers.followers": "seguaci",
|
"annual_report.summary.followers.followers": "seguaci",
|
||||||
"annual_report.summary.followers.total": "{count} in totale",
|
"annual_report.summary.followers.total": "{count} in totale",
|
||||||
"annual_report.summary.here_it_is": "Ecco il tuo {year} in sintesi:",
|
"annual_report.summary.here_it_is": "Ecco il tuo {year} in sintesi:",
|
||||||
|
@ -69,7 +69,7 @@
|
|||||||
"account.unendorse": "Nerodyti profilyje",
|
"account.unendorse": "Nerodyti profilyje",
|
||||||
"account.unfollow": "Nebesekti",
|
"account.unfollow": "Nebesekti",
|
||||||
"account.unmute": "Atšaukti nutildymą @{name}",
|
"account.unmute": "Atšaukti nutildymą @{name}",
|
||||||
"account.unmute_notifications_short": "Atšaukti nutildymą pranešimams",
|
"account.unmute_notifications_short": "Atšaukti pranešimų nutildymą",
|
||||||
"account.unmute_short": "Atšaukti nutildymą",
|
"account.unmute_short": "Atšaukti nutildymą",
|
||||||
"account_note.placeholder": "Spustelėk, kad pridėtum pastabą.",
|
"account_note.placeholder": "Spustelėk, kad pridėtum pastabą.",
|
||||||
"admin.dashboard.daily_retention": "Naudotojų pasilikimo rodiklis pagal dieną po registracijos",
|
"admin.dashboard.daily_retention": "Naudotojų pasilikimo rodiklis pagal dieną po registracijos",
|
||||||
@ -526,6 +526,7 @@
|
|||||||
"notification.admin.report_statuses": "{name} pranešė {target} kategorijai {category}",
|
"notification.admin.report_statuses": "{name} pranešė {target} kategorijai {category}",
|
||||||
"notification.admin.report_statuses_other": "{name} pranešė {target}",
|
"notification.admin.report_statuses_other": "{name} pranešė {target}",
|
||||||
"notification.admin.sign_up": "{name} užsiregistravo",
|
"notification.admin.sign_up": "{name} užsiregistravo",
|
||||||
|
"notification.admin.sign_up.name_and_others": "{name} ir {count, plural, one {# kitas} few {# kiti} many {# kito} other {# kitų}} užsiregistravo",
|
||||||
"notification.annual_report.message": "Jūsų laukia {year} #Wrapstodon! Atskleiskite savo metų svarbiausius įvykius ir įsimintinas akimirkas platformoje „Mastodon“.",
|
"notification.annual_report.message": "Jūsų laukia {year} #Wrapstodon! Atskleiskite savo metų svarbiausius įvykius ir įsimintinas akimirkas platformoje „Mastodon“.",
|
||||||
"notification.annual_report.view": "Peržiūrėti #Wrapstodon",
|
"notification.annual_report.view": "Peržiūrėti #Wrapstodon",
|
||||||
"notification.favourite": "{name} pamėgo tavo įrašą",
|
"notification.favourite": "{name} pamėgo tavo įrašą",
|
||||||
@ -537,6 +538,7 @@
|
|||||||
"notification.label.private_reply": "Privatus atsakymas",
|
"notification.label.private_reply": "Privatus atsakymas",
|
||||||
"notification.label.reply": "Atsakymas",
|
"notification.label.reply": "Atsakymas",
|
||||||
"notification.mention": "Paminėjimas",
|
"notification.mention": "Paminėjimas",
|
||||||
|
"notification.mentioned_you": "{name} paminėjo jus",
|
||||||
"notification.moderation-warning.learn_more": "Sužinoti daugiau",
|
"notification.moderation-warning.learn_more": "Sužinoti daugiau",
|
||||||
"notification.moderation_warning": "Gavai prižiūrėjimo įspėjimą",
|
"notification.moderation_warning": "Gavai prižiūrėjimo įspėjimą",
|
||||||
"notification.moderation_warning.action_delete_statuses": "Kai kurie tavo įrašai buvo pašalintos.",
|
"notification.moderation_warning.action_delete_statuses": "Kai kurie tavo įrašai buvo pašalintos.",
|
||||||
|
@ -89,6 +89,10 @@
|
|||||||
"annual_report.summary.followers.followers": "sekotāji",
|
"annual_report.summary.followers.followers": "sekotāji",
|
||||||
"annual_report.summary.followers.total": "pavisam {count}",
|
"annual_report.summary.followers.total": "pavisam {count}",
|
||||||
"annual_report.summary.here_it_is": "Šeit ir {year}. gada pārskats:",
|
"annual_report.summary.here_it_is": "Šeit ir {year}. gada pārskats:",
|
||||||
|
"annual_report.summary.highlighted_post.possessive": "{name}",
|
||||||
|
"annual_report.summary.most_used_app.most_used_app": "visizmantotākā lietotne",
|
||||||
|
"annual_report.summary.most_used_hashtag.most_used_hashtag": "visizmantotākais tēmturis",
|
||||||
|
"annual_report.summary.most_used_hashtag.none": "Nav",
|
||||||
"annual_report.summary.new_posts.new_posts": "jauni ieraksti",
|
"annual_report.summary.new_posts.new_posts": "jauni ieraksti",
|
||||||
"attachments_list.unprocessed": "(neapstrādāti)",
|
"attachments_list.unprocessed": "(neapstrādāti)",
|
||||||
"audio.hide": "Slēpt audio",
|
"audio.hide": "Slēpt audio",
|
||||||
@ -329,7 +333,11 @@
|
|||||||
"hashtag.follow": "Sekot tēmturim",
|
"hashtag.follow": "Sekot tēmturim",
|
||||||
"hashtag.unfollow": "Pārstāt sekot tēmturim",
|
"hashtag.unfollow": "Pārstāt sekot tēmturim",
|
||||||
"hashtags.and_other": "… un {count, plural, other {vēl #}}",
|
"hashtags.and_other": "… un {count, plural, other {vēl #}}",
|
||||||
|
"hints.profiles.see_more_followers": "Skatīt vairāk sekotāju {domain}",
|
||||||
|
"hints.profiles.see_more_follows": "Skatīt vairāk sekojumu {domain}",
|
||||||
|
"hints.profiles.see_more_posts": "Skatīt vairāk ierakstu {domain}",
|
||||||
"hints.threads.replies_may_be_missing": "Var trūkt atbildes no citiem serveriem.",
|
"hints.threads.replies_may_be_missing": "Var trūkt atbildes no citiem serveriem.",
|
||||||
|
"hints.threads.see_more": "Skatīt vairāk atbilžu {domain}",
|
||||||
"home.column_settings.show_reblogs": "Rādīt pastiprinātos ierakstus",
|
"home.column_settings.show_reblogs": "Rādīt pastiprinātos ierakstus",
|
||||||
"home.column_settings.show_replies": "Rādīt atbildes",
|
"home.column_settings.show_replies": "Rādīt atbildes",
|
||||||
"home.hide_announcements": "Slēpt paziņojumus",
|
"home.hide_announcements": "Slēpt paziņojumus",
|
||||||
|
@ -101,6 +101,7 @@
|
|||||||
"annual_report.summary.highlighted_post.possessive": "som {name} laga",
|
"annual_report.summary.highlighted_post.possessive": "som {name} laga",
|
||||||
"annual_report.summary.most_used_app.most_used_app": "mest brukte app",
|
"annual_report.summary.most_used_app.most_used_app": "mest brukte app",
|
||||||
"annual_report.summary.most_used_hashtag.most_used_hashtag": "mest brukte emneknagg",
|
"annual_report.summary.most_used_hashtag.most_used_hashtag": "mest brukte emneknagg",
|
||||||
|
"annual_report.summary.most_used_hashtag.none": "Ingen",
|
||||||
"annual_report.summary.new_posts.new_posts": "nye innlegg",
|
"annual_report.summary.new_posts.new_posts": "nye innlegg",
|
||||||
"annual_report.summary.percentile.text": "<topLabel>Du er av dei</topLabel><percentage></percentage><bottomLabel>ivrigaste Mastodon-brukarane.</bottomLabel>",
|
"annual_report.summary.percentile.text": "<topLabel>Du er av dei</topLabel><percentage></percentage><bottomLabel>ivrigaste Mastodon-brukarane.</bottomLabel>",
|
||||||
"annual_report.summary.percentile.we_wont_tell_bernie": "Ikkje eit ord til pressa.",
|
"annual_report.summary.percentile.we_wont_tell_bernie": "Ikkje eit ord til pressa.",
|
||||||
|
@ -87,6 +87,24 @@
|
|||||||
"alert.unexpected.title": "Ups!",
|
"alert.unexpected.title": "Ups!",
|
||||||
"alt_text_badge.title": "Tekst alternatywny",
|
"alt_text_badge.title": "Tekst alternatywny",
|
||||||
"announcement.announcement": "Ogłoszenie",
|
"announcement.announcement": "Ogłoszenie",
|
||||||
|
"annual_report.summary.archetype.booster": "Łowca treści",
|
||||||
|
"annual_report.summary.archetype.lurker": "Czyhający",
|
||||||
|
"annual_report.summary.archetype.oracle": "Wyrocznia",
|
||||||
|
"annual_report.summary.archetype.pollster": "Ankieter",
|
||||||
|
"annual_report.summary.archetype.replier": "Motyl społeczny",
|
||||||
|
"annual_report.summary.followers.followers": "obserwujących",
|
||||||
|
"annual_report.summary.followers.total": "łącznie {count}",
|
||||||
|
"annual_report.summary.here_it_is": "Oto przegląd Twojego {year} roku:",
|
||||||
|
"annual_report.summary.highlighted_post.by_favourites": "najbardziej ulubiony wpis",
|
||||||
|
"annual_report.summary.highlighted_post.by_reblogs": "najbardziej promowany wpis",
|
||||||
|
"annual_report.summary.highlighted_post.by_replies": "wpis z największą liczbą odpowiedzi",
|
||||||
|
"annual_report.summary.highlighted_post.possessive": "{name}",
|
||||||
|
"annual_report.summary.most_used_app.most_used_app": "najczęściej używana aplikacja",
|
||||||
|
"annual_report.summary.most_used_hashtag.most_used_hashtag": "najczęściej używany hashtag",
|
||||||
|
"annual_report.summary.most_used_hashtag.none": "Brak",
|
||||||
|
"annual_report.summary.new_posts.new_posts": "nowe wpisy",
|
||||||
|
"annual_report.summary.percentile.we_wont_tell_bernie": "Nie powiemy Berniemu.",
|
||||||
|
"annual_report.summary.thanks": "Dziękujemy, że jesteś częścią Mastodona!",
|
||||||
"attachments_list.unprocessed": "(nieprzetworzone)",
|
"attachments_list.unprocessed": "(nieprzetworzone)",
|
||||||
"audio.hide": "Ukryj dźwięk",
|
"audio.hide": "Ukryj dźwięk",
|
||||||
"block_modal.remote_users_caveat": "Poprosimy serwer {domain} o uszanowanie twojej decyzji. Zgodność nie jest jednak gwarantowana, bo niektóre serwery mogą inaczej obsługiwać blokowanie. Wpisy publiczne mogą być widoczne dla niezalogowanych użytkowników.",
|
"block_modal.remote_users_caveat": "Poprosimy serwer {domain} o uszanowanie twojej decyzji. Zgodność nie jest jednak gwarantowana, bo niektóre serwery mogą inaczej obsługiwać blokowanie. Wpisy publiczne mogą być widoczne dla niezalogowanych użytkowników.",
|
||||||
@ -508,6 +526,7 @@
|
|||||||
"notification.admin.report_statuses_other": "{name} zgłosił(a) {target}",
|
"notification.admin.report_statuses_other": "{name} zgłosił(a) {target}",
|
||||||
"notification.admin.sign_up": "Użytkownik {name} zarejestrował się",
|
"notification.admin.sign_up": "Użytkownik {name} zarejestrował się",
|
||||||
"notification.admin.sign_up.name_and_others": "zarejestrował(-a) się {name} i {count, plural, one {# inna osoba} few {# inne osoby} other {# innych osób}}",
|
"notification.admin.sign_up.name_and_others": "zarejestrował(-a) się {name} i {count, plural, one {# inna osoba} few {# inne osoby} other {# innych osób}}",
|
||||||
|
"notification.annual_report.view": "Zobacz #Wrapstodon",
|
||||||
"notification.favourite": "{name} dodaje Twój wpis do ulubionych",
|
"notification.favourite": "{name} dodaje Twój wpis do ulubionych",
|
||||||
"notification.favourite.name_and_others_with_link": "{name} i <a>{count, plural, one {# inna osoba</a> polubiła twój wpis} few {# inne osoby</a> polubiły twój wpis} other {# innych osób</a> polubiło twój wpis}}",
|
"notification.favourite.name_and_others_with_link": "{name} i <a>{count, plural, one {# inna osoba</a> polubiła twój wpis} few {# inne osoby</a> polubiły twój wpis} other {# innych osób</a> polubiło twój wpis}}",
|
||||||
"notification.follow": "{name} obserwuje Cię",
|
"notification.follow": "{name} obserwuje Cię",
|
||||||
|
@ -348,6 +348,8 @@
|
|||||||
"hashtag.follow": "Sledovať hashtag",
|
"hashtag.follow": "Sledovať hashtag",
|
||||||
"hashtag.unfollow": "Prestať sledovať hashtag",
|
"hashtag.unfollow": "Prestať sledovať hashtag",
|
||||||
"hashtags.and_other": "…a {count, plural, other {# ďalších}}",
|
"hashtags.and_other": "…a {count, plural, other {# ďalších}}",
|
||||||
|
"hints.profiles.see_more_posts": "Pozri viac príspevkov na {domain}",
|
||||||
|
"hints.threads.replies_may_be_missing": "Odpovede z ostatných serverov môžu chýbať.",
|
||||||
"hints.threads.see_more": "Pozri viac odpovedí na {domain}",
|
"hints.threads.see_more": "Pozri viac odpovedí na {domain}",
|
||||||
"home.column_settings.show_reblogs": "Zobraziť zdieľania",
|
"home.column_settings.show_reblogs": "Zobraziť zdieľania",
|
||||||
"home.column_settings.show_replies": "Zobraziť odpovede",
|
"home.column_settings.show_replies": "Zobraziť odpovede",
|
||||||
@ -360,6 +362,10 @@
|
|||||||
"ignore_notifications_modal.filter_to_act_users": "Stále budeš môcť akceptovať, odmietnuť, alebo nahlásiť užívateľov",
|
"ignore_notifications_modal.filter_to_act_users": "Stále budeš môcť akceptovať, odmietnuť, alebo nahlásiť užívateľov",
|
||||||
"ignore_notifications_modal.filter_to_avoid_confusion": "Triedenie pomáha vyvarovať sa možnému zmäteniu",
|
"ignore_notifications_modal.filter_to_avoid_confusion": "Triedenie pomáha vyvarovať sa možnému zmäteniu",
|
||||||
"ignore_notifications_modal.ignore": "Ignoruj upozornenia",
|
"ignore_notifications_modal.ignore": "Ignoruj upozornenia",
|
||||||
|
"ignore_notifications_modal.new_accounts_title": "Nevšímať si oznámenia z nových účtov?",
|
||||||
|
"ignore_notifications_modal.not_followers_title": "Nevšímať si oznámenia od ľudí, ktorí ťa nenasledujú?",
|
||||||
|
"ignore_notifications_modal.not_following_title": "Nevšímať si oznámenia od ľudí, ktorých nenasleduješ?",
|
||||||
|
"ignore_notifications_modal.private_mentions_title": "Nevšímať si oznámenia o nevyžiadaných súkromných spomínaniach?",
|
||||||
"interaction_modal.description.favourite": "S účtom na Mastodone môžete tento príspevok ohviezdičkovať, tak dať autorovi vedieť, že sa vám páči, a uložiť si ho na neskôr.",
|
"interaction_modal.description.favourite": "S účtom na Mastodone môžete tento príspevok ohviezdičkovať, tak dať autorovi vedieť, že sa vám páči, a uložiť si ho na neskôr.",
|
||||||
"interaction_modal.description.follow": "S účtom na Mastodone môžete {name} sledovať a vidieť ich príspevky vo svojom domovskom kanáli.",
|
"interaction_modal.description.follow": "S účtom na Mastodone môžete {name} sledovať a vidieť ich príspevky vo svojom domovskom kanáli.",
|
||||||
"interaction_modal.description.reblog": "S účtom na Mastodone môžete tento príspevok zdeľať so svojimi sledovateľmi.",
|
"interaction_modal.description.reblog": "S účtom na Mastodone môžete tento príspevok zdeľať so svojimi sledovateľmi.",
|
||||||
|
@ -86,6 +86,8 @@
|
|||||||
"alert.unexpected.message": "Zgodila se je nepričakovana napaka.",
|
"alert.unexpected.message": "Zgodila se je nepričakovana napaka.",
|
||||||
"alert.unexpected.title": "Ojoj!",
|
"alert.unexpected.title": "Ojoj!",
|
||||||
"announcement.announcement": "Obvestilo",
|
"announcement.announcement": "Obvestilo",
|
||||||
|
"annual_report.summary.most_used_hashtag.none": "Brez",
|
||||||
|
"annual_report.summary.new_posts.new_posts": "nove objave",
|
||||||
"attachments_list.unprocessed": "(neobdelano)",
|
"attachments_list.unprocessed": "(neobdelano)",
|
||||||
"audio.hide": "Skrij zvok",
|
"audio.hide": "Skrij zvok",
|
||||||
"block_modal.remote_users_caveat": "Od strežnika {domain} bomo zahtevali, da spoštuje vašo odločitev. Izpolnjevanje zahteve ni zagotovljeno, ker nekateri strežniki blokiranja obravnavajo drugače. Javne objave bodo morda še vedno vidne neprijavljenim uporabnikom.",
|
"block_modal.remote_users_caveat": "Od strežnika {domain} bomo zahtevali, da spoštuje vašo odločitev. Izpolnjevanje zahteve ni zagotovljeno, ker nekateri strežniki blokiranja obravnavajo drugače. Javne objave bodo morda še vedno vidne neprijavljenim uporabnikom.",
|
||||||
@ -433,6 +435,7 @@
|
|||||||
"lists.subheading": "Vaši seznami",
|
"lists.subheading": "Vaši seznami",
|
||||||
"load_pending": "{count, plural, one {# nov element} two {# nova elementa} few {# novi elementi} other {# novih elementov}}",
|
"load_pending": "{count, plural, one {# nov element} two {# nova elementa} few {# novi elementi} other {# novih elementov}}",
|
||||||
"loading_indicator.label": "Nalaganje …",
|
"loading_indicator.label": "Nalaganje …",
|
||||||
|
"media_gallery.hide": "Skrij",
|
||||||
"moved_to_account_banner.text": "Vaš račun {disabledAccount} je trenutno onemogočen, ker ste se prestavili na {movedToAccount}.",
|
"moved_to_account_banner.text": "Vaš račun {disabledAccount} je trenutno onemogočen, ker ste se prestavili na {movedToAccount}.",
|
||||||
"mute_modal.hide_from_notifications": "Skrijte se pred obvestili",
|
"mute_modal.hide_from_notifications": "Skrijte se pred obvestili",
|
||||||
"mute_modal.hide_options": "Skrij možnosti",
|
"mute_modal.hide_options": "Skrij možnosti",
|
||||||
@ -444,6 +447,7 @@
|
|||||||
"mute_modal.you_wont_see_mentions": "Objav, ki jih omenjajo, ne boste videli.",
|
"mute_modal.you_wont_see_mentions": "Objav, ki jih omenjajo, ne boste videli.",
|
||||||
"mute_modal.you_wont_see_posts": "Še vedno vidijo vaše objave, vi pa ne njihovih.",
|
"mute_modal.you_wont_see_posts": "Še vedno vidijo vaše objave, vi pa ne njihovih.",
|
||||||
"navigation_bar.about": "O Mastodonu",
|
"navigation_bar.about": "O Mastodonu",
|
||||||
|
"navigation_bar.administration": "Upravljanje",
|
||||||
"navigation_bar.advanced_interface": "Odpri v naprednem spletnem vmesniku",
|
"navigation_bar.advanced_interface": "Odpri v naprednem spletnem vmesniku",
|
||||||
"navigation_bar.blocks": "Blokirani uporabniki",
|
"navigation_bar.blocks": "Blokirani uporabniki",
|
||||||
"navigation_bar.bookmarks": "Zaznamki",
|
"navigation_bar.bookmarks": "Zaznamki",
|
||||||
@ -478,10 +482,12 @@
|
|||||||
"notification.favourite": "{name} je vzljubil/a vašo objavo",
|
"notification.favourite": "{name} je vzljubil/a vašo objavo",
|
||||||
"notification.follow": "{name} vam sledi",
|
"notification.follow": "{name} vam sledi",
|
||||||
"notification.follow_request": "{name} vam želi slediti",
|
"notification.follow_request": "{name} vam želi slediti",
|
||||||
|
"notification.label.mention": "Omemba",
|
||||||
"notification.label.private_mention": "Zasebna omemba",
|
"notification.label.private_mention": "Zasebna omemba",
|
||||||
"notification.label.private_reply": "Zasebni odgovor",
|
"notification.label.private_reply": "Zasebni odgovor",
|
||||||
"notification.label.reply": "Odgovori",
|
"notification.label.reply": "Odgovori",
|
||||||
"notification.mention": "Omemba",
|
"notification.mention": "Omemba",
|
||||||
|
"notification.mentioned_you": "{name} vas je omenil/a",
|
||||||
"notification.moderation-warning.learn_more": "Več o tem",
|
"notification.moderation-warning.learn_more": "Več o tem",
|
||||||
"notification.moderation_warning": "Prejeli ste opozorilo moderatorjev",
|
"notification.moderation_warning": "Prejeli ste opozorilo moderatorjev",
|
||||||
"notification.moderation_warning.action_delete_statuses": "Nekatere vaše objave so odstranjene.",
|
"notification.moderation_warning.action_delete_statuses": "Nekatere vaše objave so odstranjene.",
|
||||||
@ -502,6 +508,7 @@
|
|||||||
"notification.status": "{name} je pravkar objavil/a",
|
"notification.status": "{name} je pravkar objavil/a",
|
||||||
"notification.update": "{name} je uredil(a) objavo",
|
"notification.update": "{name} je uredil(a) objavo",
|
||||||
"notification_requests.accept": "Sprejmi",
|
"notification_requests.accept": "Sprejmi",
|
||||||
|
"notification_requests.confirm_accept_multiple.title": "Ali želite sprejeti zahteve za obvestila?",
|
||||||
"notification_requests.confirm_dismiss_multiple.title": "Želite opustiti zahteve za obvestila?",
|
"notification_requests.confirm_dismiss_multiple.title": "Želite opustiti zahteve za obvestila?",
|
||||||
"notification_requests.dismiss": "Zavrni",
|
"notification_requests.dismiss": "Zavrni",
|
||||||
"notification_requests.edit_selection": "Uredi",
|
"notification_requests.edit_selection": "Uredi",
|
||||||
@ -740,6 +747,7 @@
|
|||||||
"status.edit": "Uredi",
|
"status.edit": "Uredi",
|
||||||
"status.edited": "Zadnje urejanje {date}",
|
"status.edited": "Zadnje urejanje {date}",
|
||||||
"status.edited_x_times": "Urejeno {count, plural, one {#-krat} two {#-krat} few {#-krat} other {#-krat}}",
|
"status.edited_x_times": "Urejeno {count, plural, one {#-krat} two {#-krat} few {#-krat} other {#-krat}}",
|
||||||
|
"status.embed": "Pridobite kodo za vgradnjo",
|
||||||
"status.favourite": "Priljubljen_a",
|
"status.favourite": "Priljubljen_a",
|
||||||
"status.favourites": "{count, plural, one {priljubitev} two {priljubitvi} few {priljubitve} other {priljubitev}}",
|
"status.favourites": "{count, plural, one {priljubitev} two {priljubitvi} few {priljubitve} other {priljubitev}}",
|
||||||
"status.filter": "Filtriraj to objavo",
|
"status.filter": "Filtriraj to objavo",
|
||||||
|
@ -81,7 +81,7 @@
|
|||||||
"admin.impact_report.instance_followers": "Kullanıcılarımızın kaybedeceği takipçiler",
|
"admin.impact_report.instance_followers": "Kullanıcılarımızın kaybedeceği takipçiler",
|
||||||
"admin.impact_report.instance_follows": "Kullanıcılarının kaybedeceği takipçiler",
|
"admin.impact_report.instance_follows": "Kullanıcılarının kaybedeceği takipçiler",
|
||||||
"admin.impact_report.title": "Etki özeti",
|
"admin.impact_report.title": "Etki özeti",
|
||||||
"alert.rate_limited.message": "Lütfen {retry_time, time, medium} saatinden sonra tekrar deneyin.",
|
"alert.rate_limited.message": "Lütfen sonra tekrar deneyin {retry_time, time, medium}.",
|
||||||
"alert.rate_limited.title": "Aşırı istek gönderildi",
|
"alert.rate_limited.title": "Aşırı istek gönderildi",
|
||||||
"alert.unexpected.message": "Beklenmedik bir hata oluştu.",
|
"alert.unexpected.message": "Beklenmedik bir hata oluştu.",
|
||||||
"alert.unexpected.title": "Hay aksi!",
|
"alert.unexpected.title": "Hay aksi!",
|
||||||
@ -358,7 +358,7 @@
|
|||||||
"footer.privacy_policy": "Gizlilik politikası",
|
"footer.privacy_policy": "Gizlilik politikası",
|
||||||
"footer.source_code": "Kaynak kodu görüntüle",
|
"footer.source_code": "Kaynak kodu görüntüle",
|
||||||
"footer.status": "Durum",
|
"footer.status": "Durum",
|
||||||
"generic.saved": "Kaydedildi",
|
"generic.saved": "Kaydet",
|
||||||
"getting_started.heading": "Başlarken",
|
"getting_started.heading": "Başlarken",
|
||||||
"hashtag.column_header.tag_mode.all": "ve {additional}",
|
"hashtag.column_header.tag_mode.all": "ve {additional}",
|
||||||
"hashtag.column_header.tag_mode.any": "ya da {additional}",
|
"hashtag.column_header.tag_mode.any": "ya da {additional}",
|
||||||
|
@ -89,7 +89,7 @@
|
|||||||
"announcement.announcement": "公告",
|
"announcement.announcement": "公告",
|
||||||
"annual_report.summary.archetype.booster": "潮流捕手",
|
"annual_report.summary.archetype.booster": "潮流捕手",
|
||||||
"annual_report.summary.archetype.lurker": "吃瓜群众",
|
"annual_report.summary.archetype.lurker": "吃瓜群众",
|
||||||
"annual_report.summary.archetype.oracle": "预言家",
|
"annual_report.summary.archetype.oracle": "无所不在",
|
||||||
"annual_report.summary.archetype.pollster": "投票狂魔",
|
"annual_report.summary.archetype.pollster": "投票狂魔",
|
||||||
"annual_report.summary.archetype.replier": "评论区原住民",
|
"annual_report.summary.archetype.replier": "评论区原住民",
|
||||||
"annual_report.summary.followers.followers": "关注者",
|
"annual_report.summary.followers.followers": "关注者",
|
||||||
@ -102,13 +102,13 @@
|
|||||||
"annual_report.summary.most_used_app.most_used_app": "最常用的应用",
|
"annual_report.summary.most_used_app.most_used_app": "最常用的应用",
|
||||||
"annual_report.summary.most_used_hashtag.most_used_hashtag": "最常用的话题",
|
"annual_report.summary.most_used_hashtag.most_used_hashtag": "最常用的话题",
|
||||||
"annual_report.summary.most_used_hashtag.none": "无",
|
"annual_report.summary.most_used_hashtag.none": "无",
|
||||||
"annual_report.summary.new_posts.new_posts": "新发嘟",
|
"annual_report.summary.new_posts.new_posts": "新嘟嘟",
|
||||||
"annual_report.summary.percentile.text": "<topLabel>这使你跻身 Mastodon 用户的前</topLabel><percentage></percentage><bottomLabel></bottomLabel>",
|
"annual_report.summary.percentile.text": "<topLabel>这使你跻身 Mastodon 用户的前</topLabel><percentage></percentage><bottomLabel></bottomLabel>",
|
||||||
"annual_report.summary.percentile.we_wont_tell_bernie": "我们打死也不会告诉Bernie。",
|
"annual_report.summary.percentile.we_wont_tell_bernie": "我们打死也不会告诉扣税国王的(他知道的话要来收你发嘟税了)。",
|
||||||
"annual_report.summary.thanks": "感谢你这一年与 Mastodon 一路同行!",
|
"annual_report.summary.thanks": "感谢你这一年与 Mastodon 一路同行!",
|
||||||
"attachments_list.unprocessed": "(未处理)",
|
"attachments_list.unprocessed": "(未处理)",
|
||||||
"audio.hide": "隐藏音频",
|
"audio.hide": "隐藏音频",
|
||||||
"block_modal.remote_users_caveat": "我们将要求服务器 {domain} 尊重您的决定。然而,我们无法保证对方一定遵从,因为某些服务器可能会以不同的方案处理屏蔽操作。公开嘟文仍然可能对未登录的用户可见。",
|
"block_modal.remote_users_caveat": "我们将要求服务器 {domain} 尊重你的决定。然而,我们无法保证对方一定遵从,因为某些服务器可能会以不同的方案处理屏蔽操作。公开嘟文仍然可能对未登录的用户可见。",
|
||||||
"block_modal.show_less": "隐藏",
|
"block_modal.show_less": "隐藏",
|
||||||
"block_modal.show_more": "显示更多",
|
"block_modal.show_more": "显示更多",
|
||||||
"block_modal.they_cant_mention": "他们不能提及或关注你。",
|
"block_modal.they_cant_mention": "他们不能提及或关注你。",
|
||||||
@ -132,7 +132,7 @@
|
|||||||
"bundle_modal_error.message": "载入这个组件时发生了错误。",
|
"bundle_modal_error.message": "载入这个组件时发生了错误。",
|
||||||
"bundle_modal_error.retry": "重试",
|
"bundle_modal_error.retry": "重试",
|
||||||
"closed_registrations.other_server_instructions": "基于 Mastodon 去中心化的特性,你可以在其它服务器上创建账号并继续与此服务器互动。",
|
"closed_registrations.other_server_instructions": "基于 Mastodon 去中心化的特性,你可以在其它服务器上创建账号并继续与此服务器互动。",
|
||||||
"closed_registrations_modal.description": "您目前无法在 {domain} 上创建账户,但请注意,使用 Mastodon 并非需要专门在 {domain} 上注册账户。",
|
"closed_registrations_modal.description": "你目前无法在 {domain} 上创建账户,但请注意,使用 Mastodon 并非需要专门在 {domain} 上注册账户。",
|
||||||
"closed_registrations_modal.find_another_server": "查找其他服务器",
|
"closed_registrations_modal.find_another_server": "查找其他服务器",
|
||||||
"closed_registrations_modal.preamble": "Mastodon 是去中心化的,所以无论在哪个实例创建账号,都可以关注本服务器上的账号并与之交流。 或者你还可以自己搭建实例!",
|
"closed_registrations_modal.preamble": "Mastodon 是去中心化的,所以无论在哪个实例创建账号,都可以关注本服务器上的账号并与之交流。 或者你还可以自己搭建实例!",
|
||||||
"closed_registrations_modal.title": "注册 Mastodon 账号",
|
"closed_registrations_modal.title": "注册 Mastodon 账号",
|
||||||
@ -161,8 +161,8 @@
|
|||||||
"column_header.unpin": "取消置顶",
|
"column_header.unpin": "取消置顶",
|
||||||
"column_subheading.settings": "设置",
|
"column_subheading.settings": "设置",
|
||||||
"community.column_settings.local_only": "仅限本站",
|
"community.column_settings.local_only": "仅限本站",
|
||||||
"community.column_settings.media_only": "仅限媒体",
|
"community.column_settings.media_only": "仅媒体",
|
||||||
"community.column_settings.remote_only": "仅限外部",
|
"community.column_settings.remote_only": "仅外站",
|
||||||
"compose.language.change": "更改语言",
|
"compose.language.change": "更改语言",
|
||||||
"compose.language.search": "搜索语言...",
|
"compose.language.search": "搜索语言...",
|
||||||
"compose.published.body": "嘟文已发布。",
|
"compose.published.body": "嘟文已发布。",
|
||||||
@ -180,11 +180,11 @@
|
|||||||
"compose_form.poll.single": "单选",
|
"compose_form.poll.single": "单选",
|
||||||
"compose_form.poll.switch_to_multiple": "将投票改为多选",
|
"compose_form.poll.switch_to_multiple": "将投票改为多选",
|
||||||
"compose_form.poll.switch_to_single": "将投票改为单选",
|
"compose_form.poll.switch_to_single": "将投票改为单选",
|
||||||
"compose_form.poll.type": "样式",
|
"compose_form.poll.type": "类型",
|
||||||
"compose_form.publish": "发布",
|
"compose_form.publish": "发布",
|
||||||
"compose_form.publish_form": "发布",
|
"compose_form.publish_form": "新嘟文",
|
||||||
"compose_form.reply": "回复",
|
"compose_form.reply": "回复",
|
||||||
"compose_form.save_changes": "更新",
|
"compose_form.save_changes": "更改",
|
||||||
"compose_form.spoiler.marked": "移除内容警告",
|
"compose_form.spoiler.marked": "移除内容警告",
|
||||||
"compose_form.spoiler.unmarked": "添加内容警告",
|
"compose_form.spoiler.unmarked": "添加内容警告",
|
||||||
"compose_form.spoiler_placeholder": "内容警告 (可选)",
|
"compose_form.spoiler_placeholder": "内容警告 (可选)",
|
||||||
@ -197,7 +197,7 @@
|
|||||||
"confirmations.delete_list.message": "确定永久删除这个列表吗?",
|
"confirmations.delete_list.message": "确定永久删除这个列表吗?",
|
||||||
"confirmations.delete_list.title": "确认删除列表?",
|
"confirmations.delete_list.title": "确认删除列表?",
|
||||||
"confirmations.discard_edit_media.confirm": "丢弃",
|
"confirmations.discard_edit_media.confirm": "丢弃",
|
||||||
"confirmations.discard_edit_media.message": "您还有未保存的媒体描述或预览修改,仍要丢弃吗?",
|
"confirmations.discard_edit_media.message": "你还有未保存的媒体描述或预览修改,仍要丢弃吗?",
|
||||||
"confirmations.edit.confirm": "编辑",
|
"confirmations.edit.confirm": "编辑",
|
||||||
"confirmations.edit.message": "编辑此消息将会覆盖当前正在撰写的信息。仍要继续吗?",
|
"confirmations.edit.message": "编辑此消息将会覆盖当前正在撰写的信息。仍要继续吗?",
|
||||||
"confirmations.edit.title": "确认覆盖嘟文?",
|
"confirmations.edit.title": "确认覆盖嘟文?",
|
||||||
@ -229,7 +229,7 @@
|
|||||||
"directory.new_arrivals": "新来者",
|
"directory.new_arrivals": "新来者",
|
||||||
"directory.recently_active": "最近活跃",
|
"directory.recently_active": "最近活跃",
|
||||||
"disabled_account_banner.account_settings": "账号设置",
|
"disabled_account_banner.account_settings": "账号设置",
|
||||||
"disabled_account_banner.text": "您的账号 {disabledAccount} 目前已被禁用。",
|
"disabled_account_banner.text": "你的账号 {disabledAccount} 目前已被禁用。",
|
||||||
"dismissable_banner.community_timeline": "这些是来自 {domain} 用户的最新公开嘟文。",
|
"dismissable_banner.community_timeline": "这些是来自 {domain} 用户的最新公开嘟文。",
|
||||||
"dismissable_banner.dismiss": "忽略",
|
"dismissable_banner.dismiss": "忽略",
|
||||||
"dismissable_banner.explore_links": "这些新闻故事正被本站和分布式网络上其他站点的用户谈论。",
|
"dismissable_banner.explore_links": "这些新闻故事正被本站和分布式网络上其他站点的用户谈论。",
|
||||||
@ -264,7 +264,7 @@
|
|||||||
"emoji_button.clear": "清除",
|
"emoji_button.clear": "清除",
|
||||||
"emoji_button.custom": "自定义",
|
"emoji_button.custom": "自定义",
|
||||||
"emoji_button.flags": "旗帜",
|
"emoji_button.flags": "旗帜",
|
||||||
"emoji_button.food": "食物和饮料",
|
"emoji_button.food": "食物与饮料",
|
||||||
"emoji_button.label": "插入表情符号",
|
"emoji_button.label": "插入表情符号",
|
||||||
"emoji_button.nature": "自然",
|
"emoji_button.nature": "自然",
|
||||||
"emoji_button.not_found": "未找到匹配的表情符号",
|
"emoji_button.not_found": "未找到匹配的表情符号",
|
||||||
@ -288,13 +288,13 @@
|
|||||||
"empty_column.favourited_statuses": "你没有喜欢过任何嘟文。喜欢过的嘟文会显示在这里。",
|
"empty_column.favourited_statuses": "你没有喜欢过任何嘟文。喜欢过的嘟文会显示在这里。",
|
||||||
"empty_column.favourites": "没有人喜欢过这条嘟文。如果有人喜欢了,就会显示在这里。",
|
"empty_column.favourites": "没有人喜欢过这条嘟文。如果有人喜欢了,就会显示在这里。",
|
||||||
"empty_column.follow_requests": "你还没有收到任何关注请求。当你收到一个关注请求时,它会出现在这里。",
|
"empty_column.follow_requests": "你还没有收到任何关注请求。当你收到一个关注请求时,它会出现在这里。",
|
||||||
"empty_column.followed_tags": "您还没有关注任何话题标签。 当您关注后,它们会出现在这里。",
|
"empty_column.followed_tags": "你还没有关注任何话题标签。 当你关注后,它们会出现在这里。",
|
||||||
"empty_column.hashtag": "这个话题标签下暂时没有内容。",
|
"empty_column.hashtag": "这个话题标签下暂时没有内容。",
|
||||||
"empty_column.home": "你的主页时间线是空的!快去关注更多人吧。 {suggestions}",
|
"empty_column.home": "你的主页时间线是空的!快去关注更多人吧。 {suggestions}",
|
||||||
"empty_column.list": "列表中还没有任何内容。当列表成员发布新嘟文时,它们将出现在这里。",
|
"empty_column.list": "列表中还没有任何内容。当列表成员发布新嘟文时,它们将出现在这里。",
|
||||||
"empty_column.lists": "你还没有创建过列表。你创建的列表会在这里显示。",
|
"empty_column.lists": "你还没有创建过列表。你创建的列表会在这里显示。",
|
||||||
"empty_column.mutes": "你没有隐藏任何用户。",
|
"empty_column.mutes": "你没有隐藏任何用户。",
|
||||||
"empty_column.notification_requests": "都看完了!这里没有任何未读通知。当收到新的通知时,它们将根据您的设置显示在这里。",
|
"empty_column.notification_requests": "都看完了!这里没有任何未读通知。当收到新的通知时,它们将根据你的设置显示在这里。",
|
||||||
"empty_column.notifications": "你还没有收到过任何通知,快和其他用户互动吧。",
|
"empty_column.notifications": "你还没有收到过任何通知,快和其他用户互动吧。",
|
||||||
"empty_column.public": "这里什么都没有!写一些公开的嘟文,或者关注其他服务器的用户后,这里就会有嘟文出现了",
|
"empty_column.public": "这里什么都没有!写一些公开的嘟文,或者关注其他服务器的用户后,这里就会有嘟文出现了",
|
||||||
"error.unexpected_crash.explanation": "此页面无法正确显示,这可能是因为我们的代码中有错误,也可能是因为浏览器兼容问题。",
|
"error.unexpected_crash.explanation": "此页面无法正确显示,这可能是因为我们的代码中有错误,也可能是因为浏览器兼容问题。",
|
||||||
@ -333,7 +333,7 @@
|
|||||||
"firehose.remote": "其他服务器",
|
"firehose.remote": "其他服务器",
|
||||||
"follow_request.authorize": "同意",
|
"follow_request.authorize": "同意",
|
||||||
"follow_request.reject": "拒绝",
|
"follow_request.reject": "拒绝",
|
||||||
"follow_requests.unlocked_explanation": "尽管你没有锁嘟,但是 {domain} 的工作人员认为你也许会想手动审核审核这些账号的关注请求。",
|
"follow_requests.unlocked_explanation": "尽管你没有锁嘟,但是 {domain} 的站务人员认为你也许会想手动审核审核这些账号的关注请求。",
|
||||||
"follow_suggestions.curated_suggestion": "站务人员精选",
|
"follow_suggestions.curated_suggestion": "站务人员精选",
|
||||||
"follow_suggestions.dismiss": "不再显示",
|
"follow_suggestions.dismiss": "不再显示",
|
||||||
"follow_suggestions.featured_longer": "由 {domain} 管理团队精选",
|
"follow_suggestions.featured_longer": "由 {domain} 管理团队精选",
|
||||||
@ -354,7 +354,7 @@
|
|||||||
"footer.directory": "用户目录",
|
"footer.directory": "用户目录",
|
||||||
"footer.get_app": "获取应用",
|
"footer.get_app": "获取应用",
|
||||||
"footer.invite": "邀请",
|
"footer.invite": "邀请",
|
||||||
"footer.keyboard_shortcuts": "快捷键列表",
|
"footer.keyboard_shortcuts": "快捷键",
|
||||||
"footer.privacy_policy": "隐私政策",
|
"footer.privacy_policy": "隐私政策",
|
||||||
"footer.source_code": "查看源代码",
|
"footer.source_code": "查看源代码",
|
||||||
"footer.status": "状态",
|
"footer.status": "状态",
|
||||||
@ -401,18 +401,18 @@
|
|||||||
"ignore_notifications_modal.not_followers_title": "是否忽略未关注你的人的通知?",
|
"ignore_notifications_modal.not_followers_title": "是否忽略未关注你的人的通知?",
|
||||||
"ignore_notifications_modal.not_following_title": "是否忽略你未关注的人的通知?",
|
"ignore_notifications_modal.not_following_title": "是否忽略你未关注的人的通知?",
|
||||||
"ignore_notifications_modal.private_mentions_title": "是否忽略不请自来的私下提及?",
|
"ignore_notifications_modal.private_mentions_title": "是否忽略不请自来的私下提及?",
|
||||||
"interaction_modal.description.favourite": "只需一个 Mastodon 账号,即可喜欢这条嘟文,对嘟文的作者展示您欣赏的态度,并保存嘟文以供日后使用。",
|
"interaction_modal.description.favourite": "只需一个 Mastodon 账号,即可喜欢这条嘟文,对嘟文的作者展示你欣赏的态度,并保存嘟文以供日后使用。",
|
||||||
"interaction_modal.description.follow": "拥有一个 Mastodon 账号,你就可以关注 {name} 并在自己的主页上接收对方的新嘟文。",
|
"interaction_modal.description.follow": "拥有一个 Mastodon 账号,你就可以关注 {name} 并在自己的主页上接收对方的新嘟文。",
|
||||||
"interaction_modal.description.reblog": "拥有一个 Mastodon 账号,你就可以向自己的关注者们转发此嘟文。",
|
"interaction_modal.description.reblog": "拥有一个 Mastodon 账号,你就可以向自己的关注者们转发此嘟文。",
|
||||||
"interaction_modal.description.reply": "拥有一个 Mastodon 账号,你就可以回复此嘟文。",
|
"interaction_modal.description.reply": "拥有一个 Mastodon 账号,你就可以回复此嘟文。",
|
||||||
"interaction_modal.description.vote": "拥有一个 Mastodon 账号,你就可以参与此投票。",
|
"interaction_modal.description.vote": "拥有一个 Mastodon 账号,你就可以参与此投票。",
|
||||||
"interaction_modal.login.action": "转到主页",
|
"interaction_modal.login.action": "转到主页",
|
||||||
"interaction_modal.login.prompt": "您所入驻的服务器域名,如:mastodon.social",
|
"interaction_modal.login.prompt": "你所入驻的服务器域名,如:mastodon.social",
|
||||||
"interaction_modal.no_account_yet": "不在 Mastodon 上?",
|
"interaction_modal.no_account_yet": "不在 Mastodon 上?",
|
||||||
"interaction_modal.on_another_server": "在另一服务器",
|
"interaction_modal.on_another_server": "在另一服务器",
|
||||||
"interaction_modal.on_this_server": "在此服务器",
|
"interaction_modal.on_this_server": "在此服务器",
|
||||||
"interaction_modal.sign_in": "您尚未登录此服务器,您的账号托管在哪?",
|
"interaction_modal.sign_in": "你尚未登录此服务器,你的账号托管在哪?",
|
||||||
"interaction_modal.sign_in_hint": "提示:这是您注册的网站,如果您不记得了,请在邮箱的收件箱中查找欢迎邮件。您还可以输入完整的用户名!(例如 @Mastodon@mastodon.social)",
|
"interaction_modal.sign_in_hint": "提示:这是你注册的网站,如果你不记得了,请在邮箱的收件箱中查找欢迎邮件。你还可以输入完整的用户名!(例如 @Mastodon@mastodon.social)",
|
||||||
"interaction_modal.title.favourite": "喜欢 {name} 的嘟文",
|
"interaction_modal.title.favourite": "喜欢 {name} 的嘟文",
|
||||||
"interaction_modal.title.follow": "关注 {name}",
|
"interaction_modal.title.follow": "关注 {name}",
|
||||||
"interaction_modal.title.reblog": "转发 {name} 的嘟文",
|
"interaction_modal.title.reblog": "转发 {name} 的嘟文",
|
||||||
@ -424,8 +424,8 @@
|
|||||||
"keyboard_shortcuts.back": "返回上一页",
|
"keyboard_shortcuts.back": "返回上一页",
|
||||||
"keyboard_shortcuts.blocked": "打开被屏蔽用户列表",
|
"keyboard_shortcuts.blocked": "打开被屏蔽用户列表",
|
||||||
"keyboard_shortcuts.boost": "转嘟",
|
"keyboard_shortcuts.boost": "转嘟",
|
||||||
"keyboard_shortcuts.column": "选择某栏",
|
"keyboard_shortcuts.column": "选中某栏",
|
||||||
"keyboard_shortcuts.compose": "选择输入框",
|
"keyboard_shortcuts.compose": "选中输入框",
|
||||||
"keyboard_shortcuts.description": "说明",
|
"keyboard_shortcuts.description": "说明",
|
||||||
"keyboard_shortcuts.direct": "打开私下提及栏",
|
"keyboard_shortcuts.direct": "打开私下提及栏",
|
||||||
"keyboard_shortcuts.down": "在列表中让光标下移",
|
"keyboard_shortcuts.down": "在列表中让光标下移",
|
||||||
@ -447,7 +447,7 @@
|
|||||||
"keyboard_shortcuts.profile": "打开作者的个人资料",
|
"keyboard_shortcuts.profile": "打开作者的个人资料",
|
||||||
"keyboard_shortcuts.reply": "回复嘟文",
|
"keyboard_shortcuts.reply": "回复嘟文",
|
||||||
"keyboard_shortcuts.requests": "打开关注请求列表",
|
"keyboard_shortcuts.requests": "打开关注请求列表",
|
||||||
"keyboard_shortcuts.search": "选择搜索框",
|
"keyboard_shortcuts.search": "选中搜索框",
|
||||||
"keyboard_shortcuts.spoilers": "显示或隐藏被折叠的正文",
|
"keyboard_shortcuts.spoilers": "显示或隐藏被折叠的正文",
|
||||||
"keyboard_shortcuts.start": "打开“开始使用”栏",
|
"keyboard_shortcuts.start": "打开“开始使用”栏",
|
||||||
"keyboard_shortcuts.toggle_hidden": "显示或隐藏被折叠的正文",
|
"keyboard_shortcuts.toggle_hidden": "显示或隐藏被折叠的正文",
|
||||||
@ -473,16 +473,16 @@
|
|||||||
"lists.exclusive": "在主页中隐藏这些嘟文",
|
"lists.exclusive": "在主页中隐藏这些嘟文",
|
||||||
"lists.new.create": "新建列表",
|
"lists.new.create": "新建列表",
|
||||||
"lists.new.title_placeholder": "新列表的标题",
|
"lists.new.title_placeholder": "新列表的标题",
|
||||||
"lists.replies_policy.followed": "任何被关注的用户",
|
"lists.replies_policy.followed": "所有我关注的用户",
|
||||||
"lists.replies_policy.list": "列表成员",
|
"lists.replies_policy.list": "列表成员",
|
||||||
"lists.replies_policy.none": "无人",
|
"lists.replies_policy.none": "不显示",
|
||||||
"lists.replies_policy.title": "显示回复:",
|
"lists.replies_policy.title": "显示回复:",
|
||||||
"lists.search": "搜索你关注的人",
|
"lists.search": "搜索你关注的人",
|
||||||
"lists.subheading": "你的列表",
|
"lists.subheading": "你的列表",
|
||||||
"load_pending": "{count} 项",
|
"load_pending": "{count} 项",
|
||||||
"loading_indicator.label": "加载中…",
|
"loading_indicator.label": "加载中…",
|
||||||
"media_gallery.hide": "隐藏",
|
"media_gallery.hide": "隐藏",
|
||||||
"moved_to_account_banner.text": "您的账号 {disabledAccount} 已禁用,因为您已迁移到 {movedToAccount}。",
|
"moved_to_account_banner.text": "你的账号 {disabledAccount} 已禁用,因为你已迁移到 {movedToAccount}。",
|
||||||
"mute_modal.hide_from_notifications": "从通知中隐藏",
|
"mute_modal.hide_from_notifications": "从通知中隐藏",
|
||||||
"mute_modal.hide_options": "隐藏选项",
|
"mute_modal.hide_options": "隐藏选项",
|
||||||
"mute_modal.indefinite": "直到我取消隐藏他们",
|
"mute_modal.indefinite": "直到我取消隐藏他们",
|
||||||
@ -507,19 +507,19 @@
|
|||||||
"navigation_bar.filters": "忽略的关键词",
|
"navigation_bar.filters": "忽略的关键词",
|
||||||
"navigation_bar.follow_requests": "关注请求",
|
"navigation_bar.follow_requests": "关注请求",
|
||||||
"navigation_bar.followed_tags": "关注的话题标签",
|
"navigation_bar.followed_tags": "关注的话题标签",
|
||||||
"navigation_bar.follows_and_followers": "关注和粉丝",
|
"navigation_bar.follows_and_followers": "关注与关注者",
|
||||||
"navigation_bar.lists": "列表",
|
"navigation_bar.lists": "列表",
|
||||||
"navigation_bar.logout": "退出登录",
|
"navigation_bar.logout": "退出登录",
|
||||||
"navigation_bar.moderation": "运营",
|
"navigation_bar.moderation": "审核",
|
||||||
"navigation_bar.mutes": "已隐藏的用户",
|
"navigation_bar.mutes": "已隐藏的用户",
|
||||||
"navigation_bar.opened_in_classic_interface": "嘟文、账户和其他特定页面默认在经典网页界面中打开。",
|
"navigation_bar.opened_in_classic_interface": "嘟文、账户和其他特定页面默认在经典网页界面中打开。",
|
||||||
"navigation_bar.personal": "个人",
|
"navigation_bar.personal": "个人",
|
||||||
"navigation_bar.pins": "置顶嘟文",
|
"navigation_bar.pins": "置顶嘟文",
|
||||||
"navigation_bar.preferences": "首选项",
|
"navigation_bar.preferences": "偏好设置",
|
||||||
"navigation_bar.public_timeline": "跨站公共时间轴",
|
"navigation_bar.public_timeline": "跨站公共时间轴",
|
||||||
"navigation_bar.search": "搜索",
|
"navigation_bar.search": "搜索",
|
||||||
"navigation_bar.security": "安全",
|
"navigation_bar.security": "安全",
|
||||||
"not_signed_in_indicator.not_signed_in": "您需要登录才能访问此资源。",
|
"not_signed_in_indicator.not_signed_in": "你需要登录才能访问此资源。",
|
||||||
"notification.admin.report": "{name} 举报了 {target}",
|
"notification.admin.report": "{name} 举报了 {target}",
|
||||||
"notification.admin.report_account": "{name} 举报了来自 {target} 的 {count, plural, other {# 条嘟文}},原因为 {category}",
|
"notification.admin.report_account": "{name} 举报了来自 {target} 的 {count, plural, other {# 条嘟文}},原因为 {category}",
|
||||||
"notification.admin.report_account_other": "{name} 举报了来自 {target} 的 {count, plural, other {# 条嘟文}}",
|
"notification.admin.report_account_other": "{name} 举报了来自 {target} 的 {count, plural, other {# 条嘟文}}",
|
||||||
@ -528,10 +528,10 @@
|
|||||||
"notification.admin.sign_up": "{name} 注册了",
|
"notification.admin.sign_up": "{name} 注册了",
|
||||||
"notification.admin.sign_up.name_and_others": "{name} 和 {count, plural, other {另外 # 人}}注册了",
|
"notification.admin.sign_up.name_and_others": "{name} 和 {count, plural, other {另外 # 人}}注册了",
|
||||||
"notification.annual_report.message": "你的 {year} #Wrapstodon 年度回顾来啦!快来看看这一年你在 Mastodon 上的精彩瞬间!",
|
"notification.annual_report.message": "你的 {year} #Wrapstodon 年度回顾来啦!快来看看这一年你在 Mastodon 上的精彩瞬间!",
|
||||||
"notification.annual_report.view": "查看 #Wrapstodon",
|
"notification.annual_report.view": "查看 #Wrapstodon 年度回顾",
|
||||||
"notification.favourite": "{name} 喜欢了你的嘟文",
|
"notification.favourite": "{name} 喜欢了你的嘟文",
|
||||||
"notification.favourite.name_and_others_with_link": "{name} 和 <a>{count, plural, other {另外 # 人}}</a> 喜欢了你的嘟文",
|
"notification.favourite.name_and_others_with_link": "{name} 和 <a>{count, plural, other {另外 # 人}}</a> 喜欢了你的嘟文",
|
||||||
"notification.follow": "{name} 开始关注你",
|
"notification.follow": "{name} 关注了你",
|
||||||
"notification.follow.name_and_others": "{name} 和 <a>{count, plural, other {另外 # 人}}</a> 关注了你",
|
"notification.follow.name_and_others": "{name} 和 <a>{count, plural, other {另外 # 人}}</a> 关注了你",
|
||||||
"notification.follow_request": "{name} 向你发送了关注请求",
|
"notification.follow_request": "{name} 向你发送了关注请求",
|
||||||
"notification.follow_request.name_and_others": "{name} 和 {count, plural, other {另外 # 人}} 向你发送了关注请求",
|
"notification.follow_request.name_and_others": "{name} 和 {count, plural, other {另外 # 人}} 向你发送了关注请求",
|
||||||
@ -569,7 +569,7 @@
|
|||||||
"notification_requests.confirm_dismiss_multiple.button": "{count, plural, other {拒绝请求}}",
|
"notification_requests.confirm_dismiss_multiple.button": "{count, plural, other {拒绝请求}}",
|
||||||
"notification_requests.confirm_dismiss_multiple.message": "你将要拒绝 {count, plural, other {# 个通知请求}}。你将无法再轻易访问{count, plural, other {它们}}。是否继续?",
|
"notification_requests.confirm_dismiss_multiple.message": "你将要拒绝 {count, plural, other {# 个通知请求}}。你将无法再轻易访问{count, plural, other {它们}}。是否继续?",
|
||||||
"notification_requests.confirm_dismiss_multiple.title": "是否拒绝通知请求?",
|
"notification_requests.confirm_dismiss_multiple.title": "是否拒绝通知请求?",
|
||||||
"notification_requests.dismiss": "拒绝",
|
"notification_requests.dismiss": "忽略",
|
||||||
"notification_requests.dismiss_multiple": "{count, plural, other {拒绝 # 个请求…}}",
|
"notification_requests.dismiss_multiple": "{count, plural, other {拒绝 # 个请求…}}",
|
||||||
"notification_requests.edit_selection": "编辑",
|
"notification_requests.edit_selection": "编辑",
|
||||||
"notification_requests.exit_selection": "完成",
|
"notification_requests.exit_selection": "完成",
|
||||||
@ -597,7 +597,7 @@
|
|||||||
"notifications.column_settings.push": "推送通知",
|
"notifications.column_settings.push": "推送通知",
|
||||||
"notifications.column_settings.reblog": "转嘟:",
|
"notifications.column_settings.reblog": "转嘟:",
|
||||||
"notifications.column_settings.show": "在通知栏显示",
|
"notifications.column_settings.show": "在通知栏显示",
|
||||||
"notifications.column_settings.sound": "播放音效",
|
"notifications.column_settings.sound": "播放提示音",
|
||||||
"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": "高亮显示未读通知",
|
||||||
@ -630,7 +630,7 @@
|
|||||||
"notifications.policy.filter_not_following_hint": "直到你手动批准",
|
"notifications.policy.filter_not_following_hint": "直到你手动批准",
|
||||||
"notifications.policy.filter_not_following_title": "你没有关注的人",
|
"notifications.policy.filter_not_following_title": "你没有关注的人",
|
||||||
"notifications.policy.filter_private_mentions_hint": "过滤通知,除非通知是在回复提及你自己的内容,或发送者是你关注的人",
|
"notifications.policy.filter_private_mentions_hint": "过滤通知,除非通知是在回复提及你自己的内容,或发送者是你关注的人",
|
||||||
"notifications.policy.filter_private_mentions_title": "不请自来的提及",
|
"notifications.policy.filter_private_mentions_title": "不请自来的私下提及",
|
||||||
"notifications.policy.title": "管理来自 … 的通知",
|
"notifications.policy.title": "管理来自 … 的通知",
|
||||||
"notifications_permission_banner.enable": "启用桌面通知",
|
"notifications_permission_banner.enable": "启用桌面通知",
|
||||||
"notifications_permission_banner.how_to_control": "启用桌面通知以在 Mastodon 未打开时接收通知。你可以通过交互通过上面的 {icon} 按钮来精细控制可以发送桌面通知的交互类型。",
|
"notifications_permission_banner.how_to_control": "启用桌面通知以在 Mastodon 未打开时接收通知。你可以通过交互通过上面的 {icon} 按钮来精细控制可以发送桌面通知的交互类型。",
|
||||||
@ -640,9 +640,9 @@
|
|||||||
"onboarding.actions.go_to_explore": "看看有什么新鲜事",
|
"onboarding.actions.go_to_explore": "看看有什么新鲜事",
|
||||||
"onboarding.actions.go_to_home": "转到主页动态",
|
"onboarding.actions.go_to_home": "转到主页动态",
|
||||||
"onboarding.compose.template": "你好 #Mastodon!",
|
"onboarding.compose.template": "你好 #Mastodon!",
|
||||||
"onboarding.follows.empty": "很抱歉,现在无法显示任何结果。您可以尝试使用搜索或浏览探索页面来查找要关注的人,或稍后再试。",
|
"onboarding.follows.empty": "很抱歉,现在无法显示任何结果。你可以尝试使用搜索或浏览探索页面来查找要关注的人,或稍后再试。",
|
||||||
"onboarding.follows.lead": "你管理你自己的家庭饲料。你关注的人越多,它将越活跃和有趣。 这些配置文件可能是一个很好的起点——你可以随时取消关注它们!",
|
"onboarding.follows.lead": "你管理你自己的家庭饲料。你关注的人越多,它将越活跃和有趣。 这些配置文件可能是一个很好的起点——你可以随时取消关注它们!",
|
||||||
"onboarding.follows.title": "定制您的主页动态",
|
"onboarding.follows.title": "定制你的主页动态",
|
||||||
"onboarding.profile.discoverable": "让我的资料卡可被他人发现",
|
"onboarding.profile.discoverable": "让我的资料卡可被他人发现",
|
||||||
"onboarding.profile.discoverable_hint": "当你选择在 Mastodon 上启用发现功能时,你的嘟文可能会出现在搜索结果和热门中,你的账户可能会被推荐给与你兴趣相似的人。",
|
"onboarding.profile.discoverable_hint": "当你选择在 Mastodon 上启用发现功能时,你的嘟文可能会出现在搜索结果和热门中,你的账户可能会被推荐给与你兴趣相似的人。",
|
||||||
"onboarding.profile.display_name": "昵称",
|
"onboarding.profile.display_name": "昵称",
|
||||||
@ -653,28 +653,28 @@
|
|||||||
"onboarding.profile.save_and_continue": "保存并继续",
|
"onboarding.profile.save_and_continue": "保存并继续",
|
||||||
"onboarding.profile.title": "设置个人资料",
|
"onboarding.profile.title": "设置个人资料",
|
||||||
"onboarding.profile.upload_avatar": "上传头像",
|
"onboarding.profile.upload_avatar": "上传头像",
|
||||||
"onboarding.profile.upload_header": "上传资料卡头图",
|
"onboarding.profile.upload_header": "上传个人资料背景横幅",
|
||||||
"onboarding.share.lead": "让人们知道他们如何在Mastodon找到你!",
|
"onboarding.share.lead": "让人们知道他们如何在Mastodon找到你!",
|
||||||
"onboarding.share.message": "我是来自 #Mastodon 的 {username}!请在 {url} 关注我。",
|
"onboarding.share.message": "我是来自 #Mastodon 的 {username}!请在 {url} 关注我。",
|
||||||
"onboarding.share.next_steps": "可能的下一步:",
|
"onboarding.share.next_steps": "可能的下一步:",
|
||||||
"onboarding.share.title": "分享你的个人资料",
|
"onboarding.share.title": "分享你的个人资料",
|
||||||
"onboarding.start.lead": "你的新 Mastodon 帐户已准备好。下面是如何最大限度地利用它:",
|
"onboarding.start.lead": "你的新 Mastodon 账户已准备好。下面是如何最大限度地利用它:",
|
||||||
"onboarding.start.skip": "想要在前面跳过吗?",
|
"onboarding.start.skip": "想要在前面跳过吗?",
|
||||||
"onboarding.start.title": "你已经成功了!",
|
"onboarding.start.title": "你已经成功了!",
|
||||||
"onboarding.steps.follow_people.body": "You curate your own feed. Lets fill it with interesting people.",
|
"onboarding.steps.follow_people.body": "You curate your own feed. Lets fill it with interesting people.",
|
||||||
"onboarding.steps.follow_people.title": "定制您的主页动态",
|
"onboarding.steps.follow_people.title": "定制你的主页动态",
|
||||||
"onboarding.steps.publish_status.body": "向世界问声好吧。",
|
"onboarding.steps.publish_status.body": "向世界问声好吧。",
|
||||||
"onboarding.steps.publish_status.title": "发布你的第一篇嘟文",
|
"onboarding.steps.publish_status.title": "发布你的第一篇嘟文",
|
||||||
"onboarding.steps.setup_profile.body": "Others are more likely to interact with you with a filled out profile.",
|
"onboarding.steps.setup_profile.body": "Others are more likely to interact with you with a filled out profile.",
|
||||||
"onboarding.steps.setup_profile.title": "自定义你的个人资料",
|
"onboarding.steps.setup_profile.title": "自定义你的个人资料",
|
||||||
"onboarding.steps.share_profile.body": "Let your friends know how to find you on Mastodon!",
|
"onboarding.steps.share_profile.body": "让你的朋友知道怎样在 Mastodon 找到你",
|
||||||
"onboarding.steps.share_profile.title": "分享你的个人资料",
|
"onboarding.steps.share_profile.title": "分享你的个人资料",
|
||||||
"onboarding.tips.2fa": "<strong>你知道吗?</strong>你可以在账户设置中配置双因素认证来保护账户安全。可以使用你选择的任何 TOTP 应用,无需电话号码!",
|
"onboarding.tips.2fa": "<strong>你知道吗?</strong>你可以在账户设置中配置双因素认证来保护账户安全。可以使用你选择的任何 TOTP 应用,无需电话号码!",
|
||||||
"onboarding.tips.accounts_from_other_servers": "<strong>你知道吗?</strong> 既然Mastodon是去中心化的,你所看到的一些账户将被托管在你以外的服务器上。 但你可以无缝地与他们交互!他们的服务器在他们的用户名的后半部分!",
|
"onboarding.tips.accounts_from_other_servers": "<strong>你知道吗?</strong> 既然Mastodon是去中心化的,你所看到的一些账户将被托管在你以外的服务器上。 但你可以无缝地与他们交互!他们的服务器在他们的用户名的后半部分!",
|
||||||
"onboarding.tips.migration": "<strong>您知道吗?</strong> 如果你觉得你喜欢 {domain} 不是您未来的一个伟大的服务器选择。 您可以移动到另一个 Mastodon 服务器而不失去您的关注者。 您甚至可以主持您自己的服务器!",
|
"onboarding.tips.migration": "<strong>你知道吗?</strong>如果你将来觉得 {domain} 不再符合您的需求,你可以在保留现有关注者的情况下迁移至其他 Mastodon 服务器。你甚至可以部署自己的服务器!",
|
||||||
"onboarding.tips.verification": "<strong>您知道吗?</strong> 您可以通过在自己的网站上放置一个链接到您的 Mastodon 个人资料并将网站添加到您的个人资料来验证您的帐户。 无需收费或文书工作!",
|
"onboarding.tips.verification": "<strong>你知道吗?</strong> 你可以通过在自己的网站上放置一个链接到你的 Mastodon 个人资料并将网站添加到你的个人资料来验证你的账户。 无需收费或文书工作!",
|
||||||
"password_confirmation.exceeds_maxlength": "密码确认超过最大密码长度",
|
"password_confirmation.exceeds_maxlength": "密码确认超过最大密码长度",
|
||||||
"password_confirmation.mismatching": "密码确认不匹配",
|
"password_confirmation.mismatching": "确认密码与密码不一致。",
|
||||||
"picture_in_picture.restore": "恢复",
|
"picture_in_picture.restore": "恢复",
|
||||||
"poll.closed": "已关闭",
|
"poll.closed": "已关闭",
|
||||||
"poll.refresh": "刷新",
|
"poll.refresh": "刷新",
|
||||||
@ -687,9 +687,9 @@
|
|||||||
"poll_button.add_poll": "发起投票",
|
"poll_button.add_poll": "发起投票",
|
||||||
"poll_button.remove_poll": "移除投票",
|
"poll_button.remove_poll": "移除投票",
|
||||||
"privacy.change": "设置嘟文的可见范围",
|
"privacy.change": "设置嘟文的可见范围",
|
||||||
"privacy.direct.long": "帖子中提到的每个人",
|
"privacy.direct.long": "嘟文中提到的每个人",
|
||||||
"privacy.direct.short": "特定的人",
|
"privacy.direct.short": "特定的人",
|
||||||
"privacy.private.long": "仅限您的关注者",
|
"privacy.private.long": "仅限你的关注者",
|
||||||
"privacy.private.short": "关注者",
|
"privacy.private.short": "关注者",
|
||||||
"privacy.public.long": "所有 Mastodon 内外的人",
|
"privacy.public.long": "所有 Mastodon 内外的人",
|
||||||
"privacy.public.short": "公开",
|
"privacy.public.short": "公开",
|
||||||
@ -745,12 +745,12 @@
|
|||||||
"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": "以下是您控制您在 Mastodon 上能看到哪些内容的选项:",
|
"report.thanks.take_action": "以下是你控制你在 Mastodon 上能看到哪些内容的选项:",
|
||||||
"report.thanks.take_action_actionable": "在我们审阅这个问题时,你可以对 @{name} 采取行动",
|
"report.thanks.take_action_actionable": "在我们审阅这个问题时,你可以对 @{name} 采取行动",
|
||||||
"report.thanks.title": "不想看到这个内容?",
|
"report.thanks.title": "不想看到这个内容?",
|
||||||
"report.thanks.title_actionable": "感谢提交举报,我们将会进行处理。",
|
"report.thanks.title_actionable": "感谢提交举报,我们将会进行处理。",
|
||||||
@ -780,7 +780,7 @@
|
|||||||
"search_popout.options": "搜索选项",
|
"search_popout.options": "搜索选项",
|
||||||
"search_popout.quick_actions": "快捷操作",
|
"search_popout.quick_actions": "快捷操作",
|
||||||
"search_popout.recent": "最近搜索",
|
"search_popout.recent": "最近搜索",
|
||||||
"search_popout.specific_date": "指定日期",
|
"search_popout.specific_date": "具体日期",
|
||||||
"search_popout.user": "用户",
|
"search_popout.user": "用户",
|
||||||
"search_results.accounts": "用户",
|
"search_results.accounts": "用户",
|
||||||
"search_results.all": "全部",
|
"search_results.all": "全部",
|
||||||
@ -789,7 +789,7 @@
|
|||||||
"search_results.see_all": "查看全部",
|
"search_results.see_all": "查看全部",
|
||||||
"search_results.statuses": "嘟文",
|
"search_results.statuses": "嘟文",
|
||||||
"search_results.title": "搜索 {q}",
|
"search_results.title": "搜索 {q}",
|
||||||
"server_banner.about_active_users": "过去 30 天内使用此服务器的人(每月活跃用户)",
|
"server_banner.about_active_users": "过去 30 天内使用此服务器的人(月活跃用户)",
|
||||||
"server_banner.active_users": "活跃用户",
|
"server_banner.active_users": "活跃用户",
|
||||||
"server_banner.administered_by": "本站管理员:",
|
"server_banner.administered_by": "本站管理员:",
|
||||||
"server_banner.is_one_of_many": "{domain} 是可用于参与联邦宇宙的众多独立 Mastodon 服务器之一。",
|
"server_banner.is_one_of_many": "{domain} 是可用于参与联邦宇宙的众多独立 Mastodon 服务器之一。",
|
||||||
@ -814,7 +814,7 @@
|
|||||||
"status.direct_indicator": "私下提及",
|
"status.direct_indicator": "私下提及",
|
||||||
"status.edit": "编辑",
|
"status.edit": "编辑",
|
||||||
"status.edited": "最后编辑于 {date}",
|
"status.edited": "最后编辑于 {date}",
|
||||||
"status.edited_x_times": "共编辑 {count, plural, one {{count} 次} other {{count} 次}}",
|
"status.edited_x_times": "共编辑 {count, plural, other {{count} 次}}",
|
||||||
"status.embed": "获取嵌入代码",
|
"status.embed": "获取嵌入代码",
|
||||||
"status.favourite": "喜欢",
|
"status.favourite": "喜欢",
|
||||||
"status.favourites": "{count, plural, other {次喜欢}}",
|
"status.favourites": "{count, plural, other {次喜欢}}",
|
||||||
@ -834,7 +834,7 @@
|
|||||||
"status.pinned": "置顶嘟文",
|
"status.pinned": "置顶嘟文",
|
||||||
"status.read_more": "查看更多",
|
"status.read_more": "查看更多",
|
||||||
"status.reblog": "转嘟",
|
"status.reblog": "转嘟",
|
||||||
"status.reblog_private": "转嘟(可见者不变)",
|
"status.reblog_private": "以相同可见性转嘟",
|
||||||
"status.reblogged_by": "{name} 转嘟了",
|
"status.reblogged_by": "{name} 转嘟了",
|
||||||
"status.reblogs": "{count, plural, other {次转嘟}}",
|
"status.reblogs": "{count, plural, other {次转嘟}}",
|
||||||
"status.reblogs.empty": "没有人转嘟过此条嘟文。如果有人转嘟了,就会显示在这里。",
|
"status.reblogs.empty": "没有人转嘟过此条嘟文。如果有人转嘟了,就会显示在这里。",
|
||||||
@ -856,7 +856,7 @@
|
|||||||
"status.uncached_media_warning": "预览不可用",
|
"status.uncached_media_warning": "预览不可用",
|
||||||
"status.unmute_conversation": "恢复此对话的通知提醒",
|
"status.unmute_conversation": "恢复此对话的通知提醒",
|
||||||
"status.unpin": "在个人资料页面取消置顶",
|
"status.unpin": "在个人资料页面取消置顶",
|
||||||
"subscribed_languages.lead": "更改此选择后,仅选定语言的嘟文会出现在您的主页和列表时间轴上。选择「无」将接收所有语言的嘟文。",
|
"subscribed_languages.lead": "更改此选择后,仅选定语言的嘟文会出现在你的主页和列表时间轴上。选择「无」将接收所有语言的嘟文。",
|
||||||
"subscribed_languages.save": "保存更改",
|
"subscribed_languages.save": "保存更改",
|
||||||
"subscribed_languages.target": "更改 {target} 的订阅语言",
|
"subscribed_languages.target": "更改 {target} 的订阅语言",
|
||||||
"tabs_bar.home": "主页",
|
"tabs_bar.home": "主页",
|
||||||
@ -886,7 +886,7 @@
|
|||||||
"upload_form.edit": "编辑",
|
"upload_form.edit": "编辑",
|
||||||
"upload_form.thumbnail": "更改缩略图",
|
"upload_form.thumbnail": "更改缩略图",
|
||||||
"upload_form.video_description": "为听障人士和视障人士添加文字描述",
|
"upload_form.video_description": "为听障人士和视障人士添加文字描述",
|
||||||
"upload_modal.analyzing_picture": "分析图片…",
|
"upload_modal.analyzing_picture": "正在分析图片…",
|
||||||
"upload_modal.apply": "应用",
|
"upload_modal.apply": "应用",
|
||||||
"upload_modal.applying": "正在应用…",
|
"upload_modal.applying": "正在应用…",
|
||||||
"upload_modal.choose_image": "选择图像",
|
"upload_modal.choose_image": "选择图像",
|
||||||
@ -908,5 +908,5 @@
|
|||||||
"video.mute": "静音",
|
"video.mute": "静音",
|
||||||
"video.pause": "暂停",
|
"video.pause": "暂停",
|
||||||
"video.play": "播放",
|
"video.play": "播放",
|
||||||
"video.unmute": "解除禁音"
|
"video.unmute": "取消静音"
|
||||||
}
|
}
|
||||||
|
@ -17,6 +17,6 @@ class AnnualReport::CommonlyInteractedWithAccounts < AnnualReport::Source
|
|||||||
private
|
private
|
||||||
|
|
||||||
def commonly_interacted_with_accounts
|
def commonly_interacted_with_accounts
|
||||||
report_statuses.where.not(in_reply_to_account_id: @account.id).group(:in_reply_to_account_id).having('count(*) > 1').order(total: :desc).limit(SET_SIZE).pluck(Arel.sql('in_reply_to_account_id, count(*) AS total'))
|
report_statuses.where.not(in_reply_to_account_id: @account.id).group(:in_reply_to_account_id).having('count(*) > 1').order(count_all: :desc).limit(SET_SIZE).count
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -17,6 +17,6 @@ class AnnualReport::MostRebloggedAccounts < AnnualReport::Source
|
|||||||
private
|
private
|
||||||
|
|
||||||
def most_reblogged_accounts
|
def most_reblogged_accounts
|
||||||
report_statuses.where.not(reblog_of_id: nil).joins(reblog: :account).group('accounts.id').having('count(*) > 1').order(total: :desc).limit(SET_SIZE).pluck(Arel.sql('accounts.id, count(*) as total'))
|
report_statuses.where.not(reblog_of_id: nil).joins(reblog: :account).group(accounts: [:id]).having('count(*) > 1').order(count_all: :desc).limit(SET_SIZE).count
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -17,6 +17,6 @@ class AnnualReport::MostUsedApps < AnnualReport::Source
|
|||||||
private
|
private
|
||||||
|
|
||||||
def most_used_apps
|
def most_used_apps
|
||||||
report_statuses.joins(:application).group('oauth_applications.name').order(total: :desc).limit(SET_SIZE).pluck(Arel.sql('oauth_applications.name, count(*) as total'))
|
report_statuses.joins(:application).group(oauth_applications: [:name]).order(count_all: :desc).limit(SET_SIZE).count
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -17,6 +17,12 @@ class AnnualReport::TopHashtags < AnnualReport::Source
|
|||||||
private
|
private
|
||||||
|
|
||||||
def top_hashtags
|
def top_hashtags
|
||||||
Tag.joins(:statuses).where(statuses: { id: report_statuses.select(:id) }).group(:id).having('count(*) > 1').order(total: :desc).limit(SET_SIZE).pluck(Arel.sql('COALESCE(tags.display_name, tags.name), count(*) AS total'))
|
Tag.joins(:statuses).where(statuses: { id: report_statuses.select(:id) }).group(coalesced_tag_names).having('count(*) > 1').order(count_all: :desc).limit(SET_SIZE).count
|
||||||
|
end
|
||||||
|
|
||||||
|
def coalesced_tag_names
|
||||||
|
Arel.sql(<<~SQL.squish)
|
||||||
|
COALESCE(tags.display_name, tags.name)
|
||||||
|
SQL
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -187,7 +187,7 @@ class FeedManager
|
|||||||
timeline_key = key(:home, into_account.id)
|
timeline_key = key(:home, into_account.id)
|
||||||
timeline_status_ids = redis.zrange(timeline_key, 0, -1)
|
timeline_status_ids = redis.zrange(timeline_key, 0, -1)
|
||||||
|
|
||||||
from_account.statuses.select('id, reblog_of_id').where(id: timeline_status_ids).reorder(nil).find_each do |status|
|
from_account.statuses.select(:id, :reblog_of_id).where(id: timeline_status_ids).reorder(nil).find_each do |status|
|
||||||
remove_from_feed(:home, into_account.id, status, aggregate_reblogs: into_account.user&.aggregates_reblogs?)
|
remove_from_feed(:home, into_account.id, status, aggregate_reblogs: into_account.user&.aggregates_reblogs?)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@ -200,7 +200,7 @@ class FeedManager
|
|||||||
timeline_key = key(:list, list.id)
|
timeline_key = key(:list, list.id)
|
||||||
timeline_status_ids = redis.zrange(timeline_key, 0, -1)
|
timeline_status_ids = redis.zrange(timeline_key, 0, -1)
|
||||||
|
|
||||||
from_account.statuses.select('id, reblog_of_id').where(id: timeline_status_ids).reorder(nil).find_each do |status|
|
from_account.statuses.select(:id, :reblog_of_id).where(id: timeline_status_ids).reorder(nil).find_each do |status|
|
||||||
remove_from_feed(:list, list.id, status, aggregate_reblogs: list.account.user&.aggregates_reblogs?)
|
remove_from_feed(:list, list.id, status, aggregate_reblogs: list.account.user&.aggregates_reblogs?)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@ -221,7 +221,7 @@ class FeedManager
|
|||||||
.where.not(account: into_account.following)
|
.where.not(account: into_account.following)
|
||||||
.tagged_with_none(TagFollow.where(account: into_account).pluck(:tag_id))
|
.tagged_with_none(TagFollow.where(account: into_account).pluck(:tag_id))
|
||||||
|
|
||||||
scope.select('id, reblog_of_id').reorder(nil).find_each do |status|
|
scope.select(:id, :reblog_of_id).reorder(nil).find_each do |status|
|
||||||
remove_from_feed(:home, into_account.id, status, aggregate_reblogs: into_account.user&.aggregates_reblogs?)
|
remove_from_feed(:home, into_account.id, status, aggregate_reblogs: into_account.user&.aggregates_reblogs?)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -71,7 +71,7 @@ class Importer::StatusesIndexImporter < Importer::BaseImporter
|
|||||||
end
|
end
|
||||||
|
|
||||||
def local_votes_scope
|
def local_votes_scope
|
||||||
Poll.joins(:votes).where(votes: { account: Account.local }).select('polls.id, polls.status_id')
|
Poll.joins(:votes).where(votes: { account: Account.local }).select(polls: [:id, :status_id])
|
||||||
end
|
end
|
||||||
|
|
||||||
def local_statuses_scope
|
def local_statuses_scope
|
||||||
|
@ -144,6 +144,8 @@ class SearchQueryTransformer < Parslet::Transform
|
|||||||
end
|
end
|
||||||
|
|
||||||
class PrefixClause
|
class PrefixClause
|
||||||
|
EPOCH_RE = /\A\d+\z/
|
||||||
|
|
||||||
attr_reader :operator, :prefix, :term
|
attr_reader :operator, :prefix, :term
|
||||||
|
|
||||||
def initialize(prefix, operator, term, options = {})
|
def initialize(prefix, operator, term, options = {})
|
||||||
@ -168,15 +170,15 @@ class SearchQueryTransformer < Parslet::Transform
|
|||||||
when 'before'
|
when 'before'
|
||||||
@filter = :created_at
|
@filter = :created_at
|
||||||
@type = :range
|
@type = :range
|
||||||
@term = { lt: TermValidator.validate_date!(term), time_zone: @options[:current_account]&.user_time_zone.presence || 'UTC' }
|
@term = { lt: date_from_term(term), time_zone: @options[:current_account]&.user_time_zone.presence || 'UTC' }
|
||||||
when 'after'
|
when 'after'
|
||||||
@filter = :created_at
|
@filter = :created_at
|
||||||
@type = :range
|
@type = :range
|
||||||
@term = { gt: TermValidator.validate_date!(term), time_zone: @options[:current_account]&.user_time_zone.presence || 'UTC' }
|
@term = { gt: date_from_term(term), time_zone: @options[:current_account]&.user_time_zone.presence || 'UTC' }
|
||||||
when 'during'
|
when 'during'
|
||||||
@filter = :created_at
|
@filter = :created_at
|
||||||
@type = :range
|
@type = :range
|
||||||
@term = { gte: TermValidator.validate_date!(term), lte: TermValidator.validate_date!(term), time_zone: @options[:current_account]&.user_time_zone.presence || 'UTC' }
|
@term = { gte: date_from_term(term), lte: date_from_term(term), time_zone: @options[:current_account]&.user_time_zone.presence || 'UTC' }
|
||||||
when 'in'
|
when 'in'
|
||||||
@operator = :flag
|
@operator = :flag
|
||||||
@term = term
|
@term = term
|
||||||
@ -222,16 +224,10 @@ class SearchQueryTransformer < Parslet::Transform
|
|||||||
|
|
||||||
term
|
term
|
||||||
end
|
end
|
||||||
end
|
|
||||||
|
|
||||||
class TermValidator
|
def date_from_term(term)
|
||||||
STRICT_DATE_REGEX = /\A\d{4}-\d{2}-\d{2}\z/ # yyyy-MM-dd
|
DateTime.iso8601(term) unless term.match?(EPOCH_RE) # This will raise Date::Error if the date is invalid
|
||||||
EPOCH_MILLIS_REGEX = /\A\d{1,19}\z/
|
term
|
||||||
|
|
||||||
def self.validate_date!(value)
|
|
||||||
return value if value.match?(STRICT_DATE_REGEX) || value.match?(EPOCH_MILLIS_REGEX)
|
|
||||||
|
|
||||||
raise Mastodon::FilterValidationError, "Invalid date #{value}"
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -61,7 +61,7 @@ class AccountFilter
|
|||||||
when 'email'
|
when 'email'
|
||||||
accounts_with_users.merge(User.matches_email(value.to_s.strip))
|
accounts_with_users.merge(User.matches_email(value.to_s.strip))
|
||||||
when 'ip'
|
when 'ip'
|
||||||
valid_ip?(value) ? accounts_with_users.merge(User.matches_ip(value).group('users.id, accounts.id')) : Account.none
|
valid_ip?(value) ? accounts_with_users.merge(User.matches_ip(value).group(users: [:id], accounts: [:id])) : Account.none
|
||||||
when 'invited_by'
|
when 'invited_by'
|
||||||
invited_by_scope(value)
|
invited_by_scope(value)
|
||||||
when 'order'
|
when 'order'
|
||||||
|
@ -4,75 +4,68 @@ module Account::Associations
|
|||||||
extend ActiveSupport::Concern
|
extend ActiveSupport::Concern
|
||||||
|
|
||||||
included do
|
included do
|
||||||
# Local users
|
# Core associations
|
||||||
has_one :user, inverse_of: :account, dependent: :destroy
|
with_options dependent: :destroy do
|
||||||
|
# Association where account owns record
|
||||||
|
with_options inverse_of: :account do
|
||||||
|
has_many :account_moderation_notes
|
||||||
|
has_many :account_pins
|
||||||
|
has_many :account_warnings
|
||||||
|
has_many :aliases, class_name: 'AccountAlias'
|
||||||
|
has_many :bookmarks
|
||||||
|
has_many :conversations, class_name: 'AccountConversation'
|
||||||
|
has_many :custom_filters
|
||||||
|
has_many :favourites
|
||||||
|
has_many :featured_tags, -> { includes(:tag) }
|
||||||
|
has_many :list_accounts
|
||||||
|
has_many :media_attachments
|
||||||
|
has_many :mentions
|
||||||
|
has_many :migrations, class_name: 'AccountMigration'
|
||||||
|
has_many :notification_permissions
|
||||||
|
has_many :notification_requests
|
||||||
|
has_many :notifications
|
||||||
|
has_many :owned_lists, class_name: 'List'
|
||||||
|
has_many :polls
|
||||||
|
has_many :report_notes
|
||||||
|
has_many :reports
|
||||||
|
has_many :scheduled_statuses
|
||||||
|
has_many :status_pins
|
||||||
|
has_many :statuses
|
||||||
|
|
||||||
# Timelines
|
has_one :deletion_request, class_name: 'AccountDeletionRequest'
|
||||||
has_many :statuses, inverse_of: :account, dependent: :destroy
|
has_one :follow_recommendation_suppression
|
||||||
has_many :favourites, inverse_of: :account, dependent: :destroy
|
has_one :notification_policy
|
||||||
has_many :bookmarks, inverse_of: :account, dependent: :destroy
|
has_one :statuses_cleanup_policy, class_name: 'AccountStatusesCleanupPolicy'
|
||||||
has_many :mentions, inverse_of: :account, dependent: :destroy
|
has_one :user
|
||||||
has_many :conversations, class_name: 'AccountConversation', dependent: :destroy, inverse_of: :account
|
end
|
||||||
has_many :scheduled_statuses, inverse_of: :account, dependent: :destroy
|
|
||||||
|
|
||||||
# Notifications
|
# Association where account is targeted by record
|
||||||
has_many :notifications, inverse_of: :account, dependent: :destroy
|
with_options foreign_key: :target_account_id, inverse_of: :target_account do
|
||||||
has_one :notification_policy, inverse_of: :account, dependent: :destroy
|
has_many :strikes, class_name: 'AccountWarning'
|
||||||
has_many :notification_permissions, inverse_of: :account, dependent: :destroy
|
has_many :targeted_moderation_notes, class_name: 'AccountModerationNote'
|
||||||
has_many :notification_requests, inverse_of: :account, dependent: :destroy
|
has_many :targeted_reports, class_name: 'Report'
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
# Pinned statuses
|
# Status records pinned by the account
|
||||||
has_many :status_pins, inverse_of: :account, dependent: :destroy
|
has_many :pinned_statuses, -> { reorder(status_pins: { created_at: :desc }) }, through: :status_pins, class_name: 'Status', source: :status
|
||||||
has_many :pinned_statuses, -> { reorder('status_pins.created_at DESC') }, through: :status_pins, class_name: 'Status', source: :status
|
|
||||||
|
|
||||||
# Endorsements
|
# Account records endorsed (pinned) by the account
|
||||||
has_many :account_pins, inverse_of: :account, dependent: :destroy
|
|
||||||
has_many :endorsed_accounts, through: :account_pins, class_name: 'Account', source: :target_account
|
has_many :endorsed_accounts, through: :account_pins, class_name: 'Account', source: :target_account
|
||||||
|
|
||||||
# Media
|
# List records the account has been added to (not owned by the account)
|
||||||
has_many :media_attachments, dependent: :destroy
|
|
||||||
has_many :polls, dependent: :destroy
|
|
||||||
|
|
||||||
# Report relationships
|
|
||||||
has_many :reports, dependent: :destroy, inverse_of: :account
|
|
||||||
has_many :targeted_reports, class_name: 'Report', foreign_key: :target_account_id, dependent: :destroy, inverse_of: :target_account
|
|
||||||
|
|
||||||
has_many :report_notes, dependent: :destroy
|
|
||||||
has_many :custom_filters, inverse_of: :account, dependent: :destroy
|
|
||||||
|
|
||||||
# Moderation notes
|
|
||||||
has_many :account_moderation_notes, dependent: :destroy, inverse_of: :account
|
|
||||||
has_many :targeted_moderation_notes, class_name: 'AccountModerationNote', foreign_key: :target_account_id, dependent: :destroy, inverse_of: :target_account
|
|
||||||
has_many :account_warnings, dependent: :destroy, inverse_of: :account
|
|
||||||
has_many :strikes, class_name: 'AccountWarning', foreign_key: :target_account_id, dependent: :destroy, inverse_of: :target_account
|
|
||||||
|
|
||||||
# Lists (that the account is on, not owned by the account)
|
|
||||||
has_many :list_accounts, inverse_of: :account, dependent: :destroy
|
|
||||||
has_many :lists, through: :list_accounts
|
has_many :lists, through: :list_accounts
|
||||||
|
|
||||||
# Lists (owned by the account)
|
# Account record where account has been migrated
|
||||||
has_many :owned_lists, class_name: 'List', dependent: :destroy, inverse_of: :account
|
|
||||||
|
|
||||||
# Account migrations
|
|
||||||
belongs_to :moved_to_account, class_name: 'Account', optional: true
|
belongs_to :moved_to_account, class_name: 'Account', optional: true
|
||||||
has_many :migrations, class_name: 'AccountMigration', dependent: :destroy, inverse_of: :account
|
|
||||||
has_many :aliases, class_name: 'AccountAlias', dependent: :destroy, inverse_of: :account
|
|
||||||
|
|
||||||
# Hashtags
|
# Tag records applied to account
|
||||||
has_and_belongs_to_many :tags # rubocop:disable Rails/HasAndBelongsToMany
|
has_and_belongs_to_many :tags # rubocop:disable Rails/HasAndBelongsToMany
|
||||||
has_many :featured_tags, -> { includes(:tag) }, dependent: :destroy, inverse_of: :account
|
|
||||||
|
|
||||||
# Account deletion requests
|
# FollowRecommendation for account (surfaced via view)
|
||||||
has_one :deletion_request, class_name: 'AccountDeletionRequest', inverse_of: :account, dependent: :destroy
|
|
||||||
|
|
||||||
# Follow recommendations
|
|
||||||
has_one :follow_recommendation, inverse_of: :account, dependent: nil
|
has_one :follow_recommendation, inverse_of: :account, dependent: nil
|
||||||
has_one :follow_recommendation_suppression, inverse_of: :account, dependent: :destroy
|
|
||||||
|
|
||||||
# Account statuses cleanup policy
|
# BulkImport records owned by account
|
||||||
has_one :statuses_cleanup_policy, class_name: 'AccountStatusesCleanupPolicy', inverse_of: :account, dependent: :destroy
|
|
||||||
|
|
||||||
# Imports
|
|
||||||
has_many :bulk_imports, inverse_of: :account, dependent: :delete_all
|
has_many :bulk_imports, inverse_of: :account, dependent: :delete_all
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -80,8 +80,8 @@ module Account::Interactions
|
|||||||
has_many :passive_relationships, foreign_key: 'target_account_id', inverse_of: :target_account
|
has_many :passive_relationships, foreign_key: 'target_account_id', inverse_of: :target_account
|
||||||
end
|
end
|
||||||
|
|
||||||
has_many :following, -> { order('follows.id desc') }, through: :active_relationships, source: :target_account
|
has_many :following, -> { order(follows: { id: :desc }) }, through: :active_relationships, source: :target_account
|
||||||
has_many :followers, -> { order('follows.id desc') }, through: :passive_relationships, source: :account
|
has_many :followers, -> { order(follows: { id: :desc }) }, through: :passive_relationships, source: :account
|
||||||
|
|
||||||
with_options class_name: 'SeveredRelationship', dependent: :destroy do
|
with_options class_name: 'SeveredRelationship', dependent: :destroy do
|
||||||
has_many :severed_relationships, foreign_key: 'local_account_id', inverse_of: :local_account
|
has_many :severed_relationships, foreign_key: 'local_account_id', inverse_of: :local_account
|
||||||
@ -96,16 +96,16 @@ module Account::Interactions
|
|||||||
has_many :block_relationships, foreign_key: 'account_id', inverse_of: :account
|
has_many :block_relationships, foreign_key: 'account_id', inverse_of: :account
|
||||||
has_many :blocked_by_relationships, foreign_key: :target_account_id, inverse_of: :target_account
|
has_many :blocked_by_relationships, foreign_key: :target_account_id, inverse_of: :target_account
|
||||||
end
|
end
|
||||||
has_many :blocking, -> { order('blocks.id desc') }, through: :block_relationships, source: :target_account
|
has_many :blocking, -> { order(blocks: { id: :desc }) }, through: :block_relationships, source: :target_account
|
||||||
has_many :blocked_by, -> { order('blocks.id desc') }, through: :blocked_by_relationships, source: :account
|
has_many :blocked_by, -> { order(blocks: { id: :desc }) }, through: :blocked_by_relationships, source: :account
|
||||||
|
|
||||||
# Mute relationships
|
# Mute relationships
|
||||||
with_options class_name: 'Mute', dependent: :destroy do
|
with_options class_name: 'Mute', dependent: :destroy do
|
||||||
has_many :mute_relationships, foreign_key: 'account_id', inverse_of: :account
|
has_many :mute_relationships, foreign_key: 'account_id', inverse_of: :account
|
||||||
has_many :muted_by_relationships, foreign_key: :target_account_id, inverse_of: :target_account
|
has_many :muted_by_relationships, foreign_key: :target_account_id, inverse_of: :target_account
|
||||||
end
|
end
|
||||||
has_many :muting, -> { order('mutes.id desc') }, through: :mute_relationships, source: :target_account
|
has_many :muting, -> { order(mutes: { id: :desc }) }, through: :mute_relationships, source: :target_account
|
||||||
has_many :muted_by, -> { order('mutes.id desc') }, through: :muted_by_relationships, source: :account
|
has_many :muted_by, -> { order(mutes: { id: :desc }) }, through: :muted_by_relationships, source: :account
|
||||||
has_many :conversation_mutes, dependent: :destroy
|
has_many :conversation_mutes, dependent: :destroy
|
||||||
has_many :domain_blocks, class_name: 'AccountDomainBlock', dependent: :destroy
|
has_many :domain_blocks, class_name: 'AccountDomainBlock', dependent: :destroy
|
||||||
has_many :announcement_mutes, dependent: :destroy
|
has_many :announcement_mutes, dependent: :destroy
|
||||||
|
123
app/models/concerns/notification/groups.rb
Normal file
123
app/models/concerns/notification/groups.rb
Normal file
@ -0,0 +1,123 @@
|
|||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
module Notification::Groups
|
||||||
|
extend ActiveSupport::Concern
|
||||||
|
|
||||||
|
# `set_group_key!` needs to be updated if this list changes
|
||||||
|
GROUPABLE_NOTIFICATION_TYPES = %i(favourite reblog follow).freeze
|
||||||
|
MAXIMUM_GROUP_SPAN_HOURS = 12
|
||||||
|
|
||||||
|
def set_group_key!
|
||||||
|
return if filtered? || GROUPABLE_NOTIFICATION_TYPES.exclude?(type)
|
||||||
|
|
||||||
|
type_prefix = case type
|
||||||
|
when :favourite, :reblog
|
||||||
|
[type, target_status&.id].join('-')
|
||||||
|
when :follow
|
||||||
|
type
|
||||||
|
else
|
||||||
|
raise NotImplementedError
|
||||||
|
end
|
||||||
|
redis_key = "notif-group/#{account.id}/#{type_prefix}"
|
||||||
|
hour_bucket = activity.created_at.utc.to_i / 1.hour.to_i
|
||||||
|
|
||||||
|
# Reuse previous group if it does not span too large an amount of time
|
||||||
|
previous_bucket = redis.get(redis_key).to_i
|
||||||
|
hour_bucket = previous_bucket if hour_bucket < previous_bucket + MAXIMUM_GROUP_SPAN_HOURS
|
||||||
|
|
||||||
|
# We do not concern ourselves with race conditions since we use hour buckets
|
||||||
|
redis.set(redis_key, hour_bucket, ex: MAXIMUM_GROUP_SPAN_HOURS.hours.to_i)
|
||||||
|
|
||||||
|
self.group_key = "#{type_prefix}-#{hour_bucket}"
|
||||||
|
end
|
||||||
|
|
||||||
|
class_methods do
|
||||||
|
def paginate_groups(limit, pagination_order, grouped_types: nil)
|
||||||
|
raise ArgumentError unless %i(asc desc).include?(pagination_order)
|
||||||
|
|
||||||
|
query = reorder(id: pagination_order)
|
||||||
|
|
||||||
|
# Ideally `:types` would be a bind rather than part of the SQL itself, but that does not
|
||||||
|
# seem to be possible to do with Rails, considering that the expression would occur in
|
||||||
|
# multiple places, including in a `select`
|
||||||
|
group_key_sql = begin
|
||||||
|
if grouped_types.present?
|
||||||
|
# Normalize `grouped_types` so the number of different SQL query shapes remains small, and
|
||||||
|
# the queries can be analyzed in monitoring/telemetry tools
|
||||||
|
grouped_types = (grouped_types.map(&:to_sym) & GROUPABLE_NOTIFICATION_TYPES).sort
|
||||||
|
|
||||||
|
sanitize_sql_array([<<~SQL.squish, { types: grouped_types }])
|
||||||
|
COALESCE(
|
||||||
|
CASE
|
||||||
|
WHEN notifications.type IN (:types) THEN notifications.group_key
|
||||||
|
ELSE NULL
|
||||||
|
END,
|
||||||
|
'ungrouped-' || notifications.id
|
||||||
|
)
|
||||||
|
SQL
|
||||||
|
else
|
||||||
|
"COALESCE(notifications.group_key, 'ungrouped-' || notifications.id)"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
unscoped
|
||||||
|
.with_recursive(
|
||||||
|
grouped_notifications: [
|
||||||
|
# Base case: fetching one notification and annotating it with visited groups
|
||||||
|
query
|
||||||
|
.select('notifications.*', "ARRAY[#{group_key_sql}] AS groups")
|
||||||
|
.limit(1),
|
||||||
|
# Recursive case, always yielding at most one annotated notification
|
||||||
|
unscoped
|
||||||
|
.from(
|
||||||
|
[
|
||||||
|
# Expose the working table as `wt`, but quit early if we've reached the limit
|
||||||
|
unscoped
|
||||||
|
.select('id', 'groups')
|
||||||
|
.from('grouped_notifications')
|
||||||
|
.where('array_length(grouped_notifications.groups, 1) < :limit', limit: limit)
|
||||||
|
.arel.as('wt'),
|
||||||
|
# Recursive query, using `LATERAL` so we can refer to `wt`
|
||||||
|
query
|
||||||
|
.where(pagination_order == :desc ? 'notifications.id < wt.id' : 'notifications.id > wt.id')
|
||||||
|
.where.not("#{group_key_sql} = ANY(wt.groups)")
|
||||||
|
.limit(1)
|
||||||
|
.arel.lateral('notifications'),
|
||||||
|
]
|
||||||
|
)
|
||||||
|
.select('notifications.*', "array_append(wt.groups, #{group_key_sql}) AS groups"),
|
||||||
|
]
|
||||||
|
)
|
||||||
|
.from('grouped_notifications AS notifications')
|
||||||
|
.order(id: pagination_order)
|
||||||
|
.limit(limit)
|
||||||
|
end
|
||||||
|
|
||||||
|
# This returns notifications from the request page, but with at most one notification per group.
|
||||||
|
# Notifications that have no `group_key` each count as a separate group.
|
||||||
|
def paginate_groups_by_max_id(limit, max_id: nil, since_id: nil, grouped_types: nil)
|
||||||
|
query = reorder(id: :desc)
|
||||||
|
query = query.where(id: ...(max_id.to_i)) if max_id.present?
|
||||||
|
query = query.where(id: (since_id.to_i + 1)...) if since_id.present?
|
||||||
|
query.paginate_groups(limit, :desc, grouped_types: grouped_types)
|
||||||
|
end
|
||||||
|
|
||||||
|
# Differs from :paginate_groups_by_max_id in that it gives the results immediately following min_id,
|
||||||
|
# whereas since_id gives the items with largest id, but with since_id as a cutoff.
|
||||||
|
# Results will be in ascending order by id.
|
||||||
|
def paginate_groups_by_min_id(limit, max_id: nil, min_id: nil, grouped_types: nil)
|
||||||
|
query = reorder(id: :asc)
|
||||||
|
query = query.where(id: (min_id.to_i + 1)...) if min_id.present?
|
||||||
|
query = query.where(id: ...(max_id.to_i)) if max_id.present?
|
||||||
|
query.paginate_groups(limit, :asc, grouped_types: grouped_types)
|
||||||
|
end
|
||||||
|
|
||||||
|
def to_a_grouped_paginated_by_id(limit, options = {})
|
||||||
|
if options[:min_id].present?
|
||||||
|
paginate_groups_by_min_id(limit, min_id: options[:min_id], max_id: options[:max_id], grouped_types: options[:grouped_types]).reverse
|
||||||
|
else
|
||||||
|
paginate_groups_by_max_id(limit, max_id: options[:max_id], since_id: options[:since_id], grouped_types: options[:grouped_types]).to_a
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
@ -33,8 +33,15 @@ class FollowRequest < ApplicationRecord
|
|||||||
|
|
||||||
def authorize!
|
def authorize!
|
||||||
follow = account.follow!(target_account, reblogs: show_reblogs, notify: notify, languages: languages, uri: uri, bypass_limit: true)
|
follow = account.follow!(target_account, reblogs: show_reblogs, notify: notify, languages: languages, uri: uri, bypass_limit: true)
|
||||||
ListAccount.where(follow_request: self).update_all(follow_request_id: nil, follow_id: follow.id)
|
|
||||||
MergeWorker.perform_async(target_account.id, account.id) if account.local?
|
if account.local?
|
||||||
|
ListAccount.where(follow_request: self).update_all(follow_request_id: nil, follow_id: follow.id)
|
||||||
|
MergeWorker.perform_async(target_account.id, account.id, 'home')
|
||||||
|
MergeWorker.push_bulk(List.where(account: account).joins(:list_accounts).where(list_accounts: { account_id: target_account.id }).pluck(:id)) do |list_id|
|
||||||
|
[target_account.id, list_id, 'list']
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
destroy!
|
destroy!
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -28,9 +28,9 @@ class InstanceFilter
|
|||||||
def scope_for(key, value)
|
def scope_for(key, value)
|
||||||
case key.to_s
|
case key.to_s
|
||||||
when 'limited'
|
when 'limited'
|
||||||
Instance.joins(:domain_block).reorder(Arel.sql('domain_blocks.id desc'))
|
Instance.joins(:domain_block).reorder(domain_blocks: { id: :desc })
|
||||||
when 'allowed'
|
when 'allowed'
|
||||||
Instance.joins(:domain_allow).reorder(Arel.sql('domain_allows.id desc'))
|
Instance.joins(:domain_allow).reorder(domain_allows: { id: :desc })
|
||||||
when 'by_domain'
|
when 'by_domain'
|
||||||
Instance.matches_domain(value)
|
Instance.matches_domain(value)
|
||||||
when 'availability'
|
when 'availability'
|
||||||
|
@ -19,6 +19,7 @@
|
|||||||
class Notification < ApplicationRecord
|
class Notification < ApplicationRecord
|
||||||
self.inheritance_column = nil
|
self.inheritance_column = nil
|
||||||
|
|
||||||
|
include Notification::Groups
|
||||||
include Paginable
|
include Paginable
|
||||||
include Redisable
|
include Redisable
|
||||||
|
|
||||||
@ -31,10 +32,6 @@ class Notification < ApplicationRecord
|
|||||||
'Poll' => :poll,
|
'Poll' => :poll,
|
||||||
}.freeze
|
}.freeze
|
||||||
|
|
||||||
# `set_group_key!` needs to be updated if this list changes
|
|
||||||
GROUPABLE_NOTIFICATION_TYPES = %i(favourite reblog follow).freeze
|
|
||||||
MAXIMUM_GROUP_SPAN_HOURS = 12
|
|
||||||
|
|
||||||
# Please update app/javascript/api_types/notification.ts if you change this
|
# Please update app/javascript/api_types/notification.ts if you change this
|
||||||
PROPERTIES = {
|
PROPERTIES = {
|
||||||
mention: {
|
mention: {
|
||||||
@ -130,30 +127,6 @@ class Notification < ApplicationRecord
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def set_group_key!
|
|
||||||
return if filtered? || Notification::GROUPABLE_NOTIFICATION_TYPES.exclude?(type)
|
|
||||||
|
|
||||||
type_prefix = case type
|
|
||||||
when :favourite, :reblog
|
|
||||||
[type, target_status&.id].join('-')
|
|
||||||
when :follow
|
|
||||||
type
|
|
||||||
else
|
|
||||||
raise NotImplementedError
|
|
||||||
end
|
|
||||||
redis_key = "notif-group/#{account.id}/#{type_prefix}"
|
|
||||||
hour_bucket = activity.created_at.utc.to_i / 1.hour.to_i
|
|
||||||
|
|
||||||
# Reuse previous group if it does not span too large an amount of time
|
|
||||||
previous_bucket = redis.get(redis_key).to_i
|
|
||||||
hour_bucket = previous_bucket if hour_bucket < previous_bucket + MAXIMUM_GROUP_SPAN_HOURS
|
|
||||||
|
|
||||||
# We do not concern ourselves with race conditions since we use hour buckets
|
|
||||||
redis.set(redis_key, hour_bucket, ex: MAXIMUM_GROUP_SPAN_HOURS.hours.to_i)
|
|
||||||
|
|
||||||
self.group_key = "#{type_prefix}-#{hour_bucket}"
|
|
||||||
end
|
|
||||||
|
|
||||||
class << self
|
class << self
|
||||||
def browserable(types: [], exclude_types: [], from_account_id: nil, include_filtered: false)
|
def browserable(types: [], exclude_types: [], from_account_id: nil, include_filtered: false)
|
||||||
requested_types = if types.empty?
|
requested_types = if types.empty?
|
||||||
@ -171,94 +144,6 @@ class Notification < ApplicationRecord
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def paginate_groups(limit, pagination_order, grouped_types: nil)
|
|
||||||
raise ArgumentError unless %i(asc desc).include?(pagination_order)
|
|
||||||
|
|
||||||
query = reorder(id: pagination_order)
|
|
||||||
|
|
||||||
# Ideally `:types` would be a bind rather than part of the SQL itself, but that does not
|
|
||||||
# seem to be possible to do with Rails, considering that the expression would occur in
|
|
||||||
# multiple places, including in a `select`
|
|
||||||
group_key_sql = begin
|
|
||||||
if grouped_types.present?
|
|
||||||
# Normalize `grouped_types` so the number of different SQL query shapes remains small, and
|
|
||||||
# the queries can be analyzed in monitoring/telemetry tools
|
|
||||||
grouped_types = (grouped_types.map(&:to_sym) & GROUPABLE_NOTIFICATION_TYPES).sort
|
|
||||||
|
|
||||||
sanitize_sql_array([<<~SQL.squish, { types: grouped_types }])
|
|
||||||
COALESCE(
|
|
||||||
CASE
|
|
||||||
WHEN notifications.type IN (:types) THEN notifications.group_key
|
|
||||||
ELSE NULL
|
|
||||||
END,
|
|
||||||
'ungrouped-' || notifications.id
|
|
||||||
)
|
|
||||||
SQL
|
|
||||||
else
|
|
||||||
"COALESCE(notifications.group_key, 'ungrouped-' || notifications.id)"
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
unscoped
|
|
||||||
.with_recursive(
|
|
||||||
grouped_notifications: [
|
|
||||||
# Base case: fetching one notification and annotating it with visited groups
|
|
||||||
query
|
|
||||||
.select('notifications.*', "ARRAY[#{group_key_sql}] AS groups")
|
|
||||||
.limit(1),
|
|
||||||
# Recursive case, always yielding at most one annotated notification
|
|
||||||
unscoped
|
|
||||||
.from(
|
|
||||||
[
|
|
||||||
# Expose the working table as `wt`, but quit early if we've reached the limit
|
|
||||||
unscoped
|
|
||||||
.select('id', 'groups')
|
|
||||||
.from('grouped_notifications')
|
|
||||||
.where('array_length(grouped_notifications.groups, 1) < :limit', limit: limit)
|
|
||||||
.arel.as('wt'),
|
|
||||||
# Recursive query, using `LATERAL` so we can refer to `wt`
|
|
||||||
query
|
|
||||||
.where(pagination_order == :desc ? 'notifications.id < wt.id' : 'notifications.id > wt.id')
|
|
||||||
.where.not("#{group_key_sql} = ANY(wt.groups)")
|
|
||||||
.limit(1)
|
|
||||||
.arel.lateral('notifications'),
|
|
||||||
]
|
|
||||||
)
|
|
||||||
.select('notifications.*', "array_append(wt.groups, #{group_key_sql}) AS groups"),
|
|
||||||
]
|
|
||||||
)
|
|
||||||
.from('grouped_notifications AS notifications')
|
|
||||||
.order(id: pagination_order)
|
|
||||||
.limit(limit)
|
|
||||||
end
|
|
||||||
|
|
||||||
# This returns notifications from the request page, but with at most one notification per group.
|
|
||||||
# Notifications that have no `group_key` each count as a separate group.
|
|
||||||
def paginate_groups_by_max_id(limit, max_id: nil, since_id: nil, grouped_types: nil)
|
|
||||||
query = reorder(id: :desc)
|
|
||||||
query = query.where(id: ...(max_id.to_i)) if max_id.present?
|
|
||||||
query = query.where(id: (since_id.to_i + 1)...) if since_id.present?
|
|
||||||
query.paginate_groups(limit, :desc, grouped_types: grouped_types)
|
|
||||||
end
|
|
||||||
|
|
||||||
# Differs from :paginate_groups_by_max_id in that it gives the results immediately following min_id,
|
|
||||||
# whereas since_id gives the items with largest id, but with since_id as a cutoff.
|
|
||||||
# Results will be in ascending order by id.
|
|
||||||
def paginate_groups_by_min_id(limit, max_id: nil, min_id: nil, grouped_types: nil)
|
|
||||||
query = reorder(id: :asc)
|
|
||||||
query = query.where(id: (min_id.to_i + 1)...) if min_id.present?
|
|
||||||
query = query.where(id: ...(max_id.to_i)) if max_id.present?
|
|
||||||
query.paginate_groups(limit, :asc, grouped_types: grouped_types)
|
|
||||||
end
|
|
||||||
|
|
||||||
def to_a_grouped_paginated_by_id(limit, options = {})
|
|
||||||
if options[:min_id].present?
|
|
||||||
paginate_groups_by_min_id(limit, min_id: options[:min_id], max_id: options[:max_id], grouped_types: options[:grouped_types]).reverse
|
|
||||||
else
|
|
||||||
paginate_groups_by_max_id(limit, max_id: options[:max_id], since_id: options[:since_id], grouped_types: options[:grouped_types]).to_a
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def preload_cache_collection_target_statuses(notifications, &_block)
|
def preload_cache_collection_target_statuses(notifications, &_block)
|
||||||
notifications.group_by(&:type).each do |type, grouped_notifications|
|
notifications.group_by(&:type).each do |type, grouped_notifications|
|
||||||
associations = TARGET_STATUS_INCLUDES_BY_TYPE[type]
|
associations = TARGET_STATUS_INCLUDES_BY_TYPE[type]
|
||||||
|
@ -29,8 +29,8 @@ class Poll < ApplicationRecord
|
|||||||
has_many :votes, class_name: 'PollVote', inverse_of: :poll, dependent: :delete_all
|
has_many :votes, class_name: 'PollVote', inverse_of: :poll, dependent: :delete_all
|
||||||
|
|
||||||
with_options class_name: 'Account', source: :account, through: :votes do
|
with_options class_name: 'Account', source: :account, through: :votes do
|
||||||
has_many :voters, -> { group('accounts.id') }
|
has_many :voters, -> { group(accounts: [:id]) }
|
||||||
has_many :local_voters, -> { group('accounts.id').merge(Account.local) }
|
has_many :local_voters, -> { group(accounts: [:id]).merge(Account.local) }
|
||||||
end
|
end
|
||||||
|
|
||||||
has_many :notifications, as: :activity, dependent: :destroy
|
has_many :notifications, as: :activity, dependent: :destroy
|
||||||
|
@ -399,23 +399,23 @@ class Status < ApplicationRecord
|
|||||||
end
|
end
|
||||||
|
|
||||||
def favourites_map(status_ids, account_id)
|
def favourites_map(status_ids, account_id)
|
||||||
Favourite.select('status_id').where(status_id: status_ids).where(account_id: account_id).each_with_object({}) { |f, h| h[f.status_id] = true }
|
Favourite.select(:status_id).where(status_id: status_ids).where(account_id: account_id).each_with_object({}) { |f, h| h[f.status_id] = true }
|
||||||
end
|
end
|
||||||
|
|
||||||
def bookmarks_map(status_ids, account_id)
|
def bookmarks_map(status_ids, account_id)
|
||||||
Bookmark.select('status_id').where(status_id: status_ids).where(account_id: account_id).map { |f| [f.status_id, true] }.to_h
|
Bookmark.select(:status_id).where(status_id: status_ids).where(account_id: account_id).map { |f| [f.status_id, true] }.to_h
|
||||||
end
|
end
|
||||||
|
|
||||||
def reblogs_map(status_ids, account_id)
|
def reblogs_map(status_ids, account_id)
|
||||||
unscoped.select('reblog_of_id').where(reblog_of_id: status_ids).where(account_id: account_id).each_with_object({}) { |s, h| h[s.reblog_of_id] = true }
|
unscoped.select(:reblog_of_id).where(reblog_of_id: status_ids).where(account_id: account_id).each_with_object({}) { |s, h| h[s.reblog_of_id] = true }
|
||||||
end
|
end
|
||||||
|
|
||||||
def mutes_map(conversation_ids, account_id)
|
def mutes_map(conversation_ids, account_id)
|
||||||
ConversationMute.select('conversation_id').where(conversation_id: conversation_ids).where(account_id: account_id).each_with_object({}) { |m, h| h[m.conversation_id] = true }
|
ConversationMute.select(:conversation_id).where(conversation_id: conversation_ids).where(account_id: account_id).each_with_object({}) { |m, h| h[m.conversation_id] = true }
|
||||||
end
|
end
|
||||||
|
|
||||||
def pins_map(status_ids, account_id)
|
def pins_map(status_ids, account_id)
|
||||||
StatusPin.select('status_id').where(status_id: status_ids).where(account_id: account_id).each_with_object({}) { |p, h| h[p.status_id] = true }
|
StatusPin.select(:status_id).where(status_id: status_ids).where(account_id: account_id).each_with_object({}) { |p, h| h[p.status_id] = true }
|
||||||
end
|
end
|
||||||
|
|
||||||
def from_text(text)
|
def from_text(text)
|
||||||
|
@ -61,7 +61,7 @@ class Tag < ApplicationRecord
|
|||||||
scope :recently_used, lambda { |account|
|
scope :recently_used, lambda { |account|
|
||||||
joins(:statuses)
|
joins(:statuses)
|
||||||
.where(statuses: { id: account.statuses.select(:id).limit(RECENT_STATUS_LIMIT) })
|
.where(statuses: { id: account.statuses.select(:id).limit(RECENT_STATUS_LIMIT) })
|
||||||
.group(:id).order(Arel.sql('count(*) desc'))
|
.group(:id).order(Arel.star.count.desc)
|
||||||
}
|
}
|
||||||
scope :matches_name, ->(term) { where(arel_table[:name].lower.matches(arel_table.lower("#{sanitize_sql_like(Tag.normalize(term))}%"), nil, true)) } # Search with case-sensitive to use B-tree index
|
scope :matches_name, ->(term) { where(arel_table[:name].lower.matches(arel_table.lower("#{sanitize_sql_like(Tag.normalize(term))}%"), nil, true)) } # Search with case-sensitive to use B-tree index
|
||||||
|
|
||||||
@ -127,7 +127,7 @@ class Tag < ApplicationRecord
|
|||||||
query = query.merge(Tag.listable) if options[:exclude_unlistable]
|
query = query.merge(Tag.listable) if options[:exclude_unlistable]
|
||||||
query = query.merge(matching_name(stripped_term).or(reviewed)) if options[:exclude_unreviewed]
|
query = query.merge(matching_name(stripped_term).or(reviewed)) if options[:exclude_unreviewed]
|
||||||
|
|
||||||
query.order(Arel.sql('length(name) ASC, name ASC'))
|
query.order(Arel.sql('LENGTH(name)').asc, name: :asc)
|
||||||
.limit(limit)
|
.limit(limit)
|
||||||
.offset(offset)
|
.offset(offset)
|
||||||
end
|
end
|
||||||
|
@ -106,7 +106,7 @@ class Trends::Statuses < Trends::Base
|
|||||||
private
|
private
|
||||||
|
|
||||||
def eligible?(status)
|
def eligible?(status)
|
||||||
status.public_visibility? && status.account.discoverable? && !status.account.silenced? && !status.account.sensitized? && (status.spoiler_text.blank? || Setting.trending_status_cw) && !status.sensitive? && !status.reply? && valid_locale?(status.language)
|
status.created_at.past? && status.public_visibility? && status.account.discoverable? && !status.account.silenced? && !status.account.sensitized? && (status.spoiler_text.blank? || Setting.trending_status_cw) && !status.sensitive? && !status.reply? && valid_locale?(status.language)
|
||||||
end
|
end
|
||||||
|
|
||||||
def calculate_scores(statuses, at_time)
|
def calculate_scores(statuses, at_time)
|
||||||
|
@ -125,7 +125,7 @@ class User < ApplicationRecord
|
|||||||
scope :signed_in_recently, -> { where(current_sign_in_at: ACTIVE_DURATION.ago..) }
|
scope :signed_in_recently, -> { where(current_sign_in_at: ACTIVE_DURATION.ago..) }
|
||||||
scope :not_signed_in_recently, -> { where(current_sign_in_at: ...ACTIVE_DURATION.ago) }
|
scope :not_signed_in_recently, -> { where(current_sign_in_at: ...ACTIVE_DURATION.ago) }
|
||||||
scope :matches_email, ->(value) { where(arel_table[:email].matches("#{value}%")) }
|
scope :matches_email, ->(value) { where(arel_table[:email].matches("#{value}%")) }
|
||||||
scope :matches_ip, ->(value) { left_joins(:ips).merge(IpBlock.contained_by(value)).group('users.id') }
|
scope :matches_ip, ->(value) { left_joins(:ips).merge(IpBlock.contained_by(value)).group(users: [:id]) }
|
||||||
|
|
||||||
before_validation :sanitize_role
|
before_validation :sanitize_role
|
||||||
before_create :set_approved
|
before_create :set_approved
|
||||||
|
33
app/services/add_accounts_to_list_service.rb
Normal file
33
app/services/add_accounts_to_list_service.rb
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
class AddAccountsToListService < BaseService
|
||||||
|
def call(list, accounts)
|
||||||
|
@list = list
|
||||||
|
@accounts = accounts
|
||||||
|
|
||||||
|
return if @accounts.empty?
|
||||||
|
|
||||||
|
update_list!
|
||||||
|
merge_into_list!
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def update_list!
|
||||||
|
ApplicationRecord.transaction do
|
||||||
|
@accounts.each do |account|
|
||||||
|
@list.accounts << account
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def merge_into_list!
|
||||||
|
MergeWorker.push_bulk(merge_account_ids) do |account_id|
|
||||||
|
[account_id, @list.id, 'list']
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def merge_account_ids
|
||||||
|
ListAccount.where(list: @list, account: @accounts).where.not(follow_id: nil).pluck(:account_id)
|
||||||
|
end
|
||||||
|
end
|
@ -81,7 +81,10 @@ class FollowService < BaseService
|
|||||||
follow = @source_account.follow!(@target_account, **follow_options.merge(rate_limit: @options[:with_rate_limit], bypass_limit: @options[:bypass_limit]))
|
follow = @source_account.follow!(@target_account, **follow_options.merge(rate_limit: @options[:with_rate_limit], bypass_limit: @options[:bypass_limit]))
|
||||||
|
|
||||||
LocalNotificationWorker.perform_async(@target_account.id, follow.id, follow.class.name, 'follow')
|
LocalNotificationWorker.perform_async(@target_account.id, follow.id, follow.class.name, 'follow')
|
||||||
MergeWorker.perform_async(@target_account.id, @source_account.id)
|
MergeWorker.perform_async(@target_account.id, @source_account.id, 'home')
|
||||||
|
MergeWorker.push_bulk(List.where(account: @source_account).joins(:list_accounts).where(list_accounts: { account_id: @target_account.id }).pluck(:id)) do |list_id|
|
||||||
|
[@target_account.id, list_id, 'list']
|
||||||
|
end
|
||||||
|
|
||||||
follow
|
follow
|
||||||
end
|
end
|
||||||
|
29
app/services/remove_accounts_from_list_service.rb
Normal file
29
app/services/remove_accounts_from_list_service.rb
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
class RemoveAccountsFromListService < BaseService
|
||||||
|
def call(list, accounts)
|
||||||
|
@list = list
|
||||||
|
@accounts = accounts
|
||||||
|
|
||||||
|
return if @accounts.empty?
|
||||||
|
|
||||||
|
unmerge_from_list!
|
||||||
|
update_list!
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def update_list!
|
||||||
|
ListAccount.where(list: @list, account: @accounts).destroy_all
|
||||||
|
end
|
||||||
|
|
||||||
|
def unmerge_from_list!
|
||||||
|
UnmergeWorker.push_bulk(unmerge_account_ids) do |account_id|
|
||||||
|
[account_id, @list.id, 'list']
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def unmerge_account_ids
|
||||||
|
ListAccount.where(list: @list, account: @accounts).where.not(follow_id: nil).pluck(:account_id)
|
||||||
|
end
|
||||||
|
end
|
@ -31,7 +31,13 @@ class UnfollowService < BaseService
|
|||||||
|
|
||||||
create_notification(follow) if !@target_account.local? && @target_account.activitypub?
|
create_notification(follow) if !@target_account.local? && @target_account.activitypub?
|
||||||
create_reject_notification(follow) if @target_account.local? && !@source_account.local? && @source_account.activitypub?
|
create_reject_notification(follow) if @target_account.local? && !@source_account.local? && @source_account.activitypub?
|
||||||
UnmergeWorker.perform_async(@target_account.id, @source_account.id) unless @options[:skip_unmerge]
|
|
||||||
|
unless @options[:skip_unmerge]
|
||||||
|
UnmergeWorker.perform_async(@target_account.id, @source_account.id, 'home')
|
||||||
|
UnmergeWorker.push_bulk(List.where(account: @source_account).joins(:list_accounts).where(list_accounts: { account_id: @target_account.id }).pluck(:list_id)) do |list_id|
|
||||||
|
[@target_account.id, list_id, 'list']
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
follow
|
follow
|
||||||
end
|
end
|
||||||
|
@ -6,6 +6,12 @@ class UnmuteService < BaseService
|
|||||||
|
|
||||||
account.unmute!(target_account)
|
account.unmute!(target_account)
|
||||||
|
|
||||||
MergeWorker.perform_async(target_account.id, account.id) if account.following?(target_account)
|
if account.following?(target_account)
|
||||||
|
MergeWorker.perform_async(target_account.id, account.id, 'home')
|
||||||
|
|
||||||
|
MergeWorker.push_bulk(List.where(account: account).joins(:list_accounts).where(list_accounts: { account_id: target_account.id }).pluck(:id)) do |list_id|
|
||||||
|
[target_account.id, list_id, 'list']
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -10,7 +10,7 @@
|
|||||||
- elsif status.reply? && status.in_reply_to_id.present?
|
- elsif status.reply? && status.in_reply_to_id.present?
|
||||||
.status__prepend
|
.status__prepend
|
||||||
= material_symbol('reply')
|
= material_symbol('reply')
|
||||||
= t('admin.statuses.replied_to_html', acct_link: admin_account_inline_link_to(status.in_reply_to_account, path: admin_account_status_path(status.thread.account_id, status.in_reply_to_id)))
|
= t('admin.statuses.replied_to_html', acct_link: admin_account_inline_link_to(status.in_reply_to_account, path: status.thread.present? ? admin_account_status_path(status.thread.account_id, status.in_reply_to_id) : nil))
|
||||||
.status__content><
|
.status__content><
|
||||||
- if status.proper.spoiler_text.blank?
|
- if status.proper.spoiler_text.blank?
|
||||||
= prerender_custom_emojis(status_content_format(status.proper), status.proper.emojis)
|
= prerender_custom_emojis(status_content_format(status.proper), status.proper.emojis)
|
||||||
@ -44,7 +44,7 @@
|
|||||||
= t("statuses.visibilities.#{status.visibility}")
|
= t("statuses.visibilities.#{status.visibility}")
|
||||||
·
|
·
|
||||||
|
|
||||||
= link_to ActivityPub::TagManager.instance.url_for(status.proper), class: 'detailed-status__link', target: stream_link_target, rel: 'noopener noreferrer' do
|
= link_to ActivityPub::TagManager.instance.url_for(status.proper), class: 'detailed-status__link', rel: 'noopener noreferrer' do
|
||||||
= t('admin.statuses.view_publicly')
|
= t('admin.statuses.view_publicly')
|
||||||
|
|
||||||
- if status.proper.sensitive?
|
- if status.proper.sensitive?
|
||||||
|
@ -22,7 +22,7 @@
|
|||||||
- if @status.reply?
|
- if @status.reply?
|
||||||
%tr
|
%tr
|
||||||
%th= t('admin.statuses.in_reply_to')
|
%th= t('admin.statuses.in_reply_to')
|
||||||
%td= admin_account_link_to @status.in_reply_to_account, path: admin_account_status_path(@status.thread.account_id, @status.in_reply_to_id)
|
%td= admin_account_link_to @status.in_reply_to_account, path: @status.thread.present? ? admin_account_status_path(@status.thread.account_id, @status.in_reply_to_id) : nil
|
||||||
%tr
|
%tr
|
||||||
%th= t('admin.statuses.application')
|
%th= t('admin.statuses.application')
|
||||||
%td= @status.application&.name
|
%td= @status.application&.name
|
||||||
@ -61,7 +61,7 @@
|
|||||||
- elsif @status.reply? && @status.in_reply_to_id.present?
|
- elsif @status.reply? && @status.in_reply_to_id.present?
|
||||||
.status__prepend
|
.status__prepend
|
||||||
= material_symbol('reply')
|
= material_symbol('reply')
|
||||||
= t('admin.statuses.replied_to_html', acct_link: admin_account_inline_link_to(@status.in_reply_to_account, path: admin_account_status_path(@status.thread.account_id, @status.in_reply_to_id)))
|
= t('admin.statuses.replied_to_html', acct_link: admin_account_inline_link_to(@status.in_reply_to_account, path: @status.thread.present? ? admin_account_status_path(@status.thread.account_id, @status.in_reply_to_id) : nil))
|
||||||
.status__content><
|
.status__content><
|
||||||
- if @status.proper.spoiler_text.blank?
|
- if @status.proper.spoiler_text.blank?
|
||||||
= prerender_custom_emojis(status_content_format(@status.proper), @status.proper.emojis)
|
= prerender_custom_emojis(status_content_format(@status.proper), @status.proper.emojis)
|
||||||
|
@ -23,7 +23,7 @@
|
|||||||
= image_tag(status.account.avatar.url, width: 15, height: 15, alt: '', class: 'avatar')
|
= image_tag(status.account.avatar.url, width: 15, height: 15, alt: '', class: 'avatar')
|
||||||
.username= status.account.acct
|
.username= status.account.acct
|
||||||
·
|
·
|
||||||
= link_to ActivityPub::TagManager.instance.url_for(status), class: 'detailed-status__datetime', target: stream_link_target, rel: 'noopener noreferrer' do
|
= link_to ActivityPub::TagManager.instance.url_for(status), class: 'detailed-status__datetime', rel: 'noopener noreferrer' do
|
||||||
%time.formatted{ datetime: status.created_at.iso8601, title: l(status.created_at) }= l(status.created_at)
|
%time.formatted{ datetime: status.created_at.iso8601, title: l(status.created_at) }= l(status.created_at)
|
||||||
- if status.edited?
|
- if status.edited?
|
||||||
·
|
·
|
||||||
|
@ -42,13 +42,33 @@
|
|||||||
%label.batch-table__toolbar__select.batch-checkbox-all
|
%label.batch-table__toolbar__select.batch-checkbox-all
|
||||||
= check_box_tag :batch_checkbox_all, nil, false
|
= check_box_tag :batch_checkbox_all, nil, false
|
||||||
.batch-table__toolbar__actions
|
.batch-table__toolbar__actions
|
||||||
= f.button safe_join([material_symbol('person_add'), t('relationships.follow_selected_followers')]), name: :follow, class: 'table-action-link', type: :submit, data: { confirm: t('relationships.confirm_follow_selected_followers') } if followed_by_relationship? && !mutual_relationship?
|
- if followed_by_relationship? && !mutual_relationship?
|
||||||
|
= f.button safe_join([material_symbol('person_add'), t('relationships.follow_selected_followers')]),
|
||||||
|
class: 'table-action-link',
|
||||||
|
data: { confirm: t('relationships.confirm_follow_selected_followers') },
|
||||||
|
name: :follow,
|
||||||
|
type: :submit
|
||||||
|
|
||||||
= f.button safe_join([material_symbol('person_remove'), t('relationships.remove_selected_follows')]), name: :unfollow, class: 'table-action-link', type: :submit, data: { confirm: t('relationships.confirm_remove_selected_follows') } unless followed_by_relationship?
|
- unless followed_by_relationship?
|
||||||
|
= f.button safe_join([material_symbol('person_remove'), t('relationships.remove_selected_follows')]),
|
||||||
|
class: 'table-action-link',
|
||||||
|
data: { confirm: t('relationships.confirm_remove_selected_follows') },
|
||||||
|
name: :unfollow,
|
||||||
|
type: :submit
|
||||||
|
|
||||||
= f.button safe_join([material_symbol('delete'), t('relationships.remove_selected_followers')]), name: :remove_from_followers, class: 'table-action-link', type: :submit, data: { confirm: t('relationships.confirm_remove_selected_followers') } unless following_relationship?
|
- unless following_relationship?
|
||||||
|
= f.button safe_join([material_symbol('delete'), t('relationships.remove_selected_followers')]),
|
||||||
|
class: 'table-action-link',
|
||||||
|
data: { confirm: t('relationships.confirm_remove_selected_followers') },
|
||||||
|
name: :remove_from_followers,
|
||||||
|
type: :submit
|
||||||
|
|
||||||
= f.button safe_join([material_symbol('delete'), t('relationships.remove_selected_domains')]), name: :remove_domains_from_followers, class: 'table-action-link', type: :submit, data: { confirm: t('admin.reports.are_you_sure') } if followed_by_relationship?
|
- if followed_by_relationship?
|
||||||
|
= f.button safe_join([material_symbol('delete'), t('relationships.remove_selected_domains')]),
|
||||||
|
class: 'table-action-link',
|
||||||
|
data: { confirm: t('admin.reports.are_you_sure') },
|
||||||
|
name: :remove_domains_from_followers,
|
||||||
|
type: :submit
|
||||||
.batch-table__body
|
.batch-table__body
|
||||||
- if @accounts.empty?
|
- if @accounts.empty?
|
||||||
= nothing_here 'nothing-here--under-tabs'
|
= nothing_here 'nothing-here--under-tabs'
|
||||||
|
@ -5,18 +5,42 @@ class MergeWorker
|
|||||||
include Redisable
|
include Redisable
|
||||||
include DatabaseHelper
|
include DatabaseHelper
|
||||||
|
|
||||||
def perform(from_account_id, into_account_id)
|
def perform(from_account_id, into_id, type = 'home')
|
||||||
with_primary do
|
with_primary do
|
||||||
@from_account = Account.find(from_account_id)
|
@from_account = Account.find(from_account_id)
|
||||||
|
end
|
||||||
|
|
||||||
|
case type
|
||||||
|
when 'home'
|
||||||
|
merge_into_home!(into_id)
|
||||||
|
when 'list'
|
||||||
|
merge_into_list!(into_id)
|
||||||
|
end
|
||||||
|
rescue ActiveRecord::RecordNotFound
|
||||||
|
true
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def merge_into_home!(into_account_id)
|
||||||
|
with_primary do
|
||||||
@into_account = Account.find(into_account_id)
|
@into_account = Account.find(into_account_id)
|
||||||
end
|
end
|
||||||
|
|
||||||
with_read_replica do
|
with_read_replica do
|
||||||
FeedManager.instance.merge_into_home(@from_account, @into_account)
|
FeedManager.instance.merge_into_home(@from_account, @into_account)
|
||||||
end
|
end
|
||||||
rescue ActiveRecord::RecordNotFound
|
|
||||||
true
|
|
||||||
ensure
|
ensure
|
||||||
redis.del("account:#{into_account_id}:regeneration")
|
redis.del("account:#{into_account_id}:regeneration")
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def merge_into_list!(into_list_id)
|
||||||
|
with_primary do
|
||||||
|
@into_list = List.find(into_list_id)
|
||||||
|
end
|
||||||
|
|
||||||
|
with_read_replica do
|
||||||
|
FeedManager.instance.merge_into_list(@from_account, @into_list)
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
@ -2,9 +2,18 @@
|
|||||||
|
|
||||||
class MuteWorker
|
class MuteWorker
|
||||||
include Sidekiq::Worker
|
include Sidekiq::Worker
|
||||||
|
include DatabaseHelper
|
||||||
|
|
||||||
def perform(account_id, target_account_id)
|
def perform(account_id, target_account_id)
|
||||||
FeedManager.instance.clear_from_home(Account.find(account_id), Account.find(target_account_id))
|
with_primary do
|
||||||
|
@account = Account.find(account_id)
|
||||||
|
@target_account = Account.find(target_account_id)
|
||||||
|
end
|
||||||
|
|
||||||
|
with_read_replica do
|
||||||
|
FeedManager.instance.clear_from_home(@account, @target_account)
|
||||||
|
FeedManager.instance.clear_from_lists(@account, @target_account)
|
||||||
|
end
|
||||||
rescue ActiveRecord::RecordNotFound
|
rescue ActiveRecord::RecordNotFound
|
||||||
true
|
true
|
||||||
end
|
end
|
||||||
|
@ -6,16 +6,40 @@ class UnmergeWorker
|
|||||||
|
|
||||||
sidekiq_options queue: 'pull'
|
sidekiq_options queue: 'pull'
|
||||||
|
|
||||||
def perform(from_account_id, into_account_id)
|
def perform(from_account_id, into_id, type = 'home')
|
||||||
with_primary do
|
with_primary do
|
||||||
@from_account = Account.find(from_account_id)
|
@from_account = Account.find(from_account_id)
|
||||||
|
end
|
||||||
|
|
||||||
|
case type
|
||||||
|
when 'home'
|
||||||
|
unmerge_from_home!(into_id)
|
||||||
|
when 'list'
|
||||||
|
unmerge_from_list!(into_id)
|
||||||
|
end
|
||||||
|
rescue ActiveRecord::RecordNotFound
|
||||||
|
true
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def unmerge_from_home!(into_account_id)
|
||||||
|
with_primary do
|
||||||
@into_account = Account.find(into_account_id)
|
@into_account = Account.find(into_account_id)
|
||||||
end
|
end
|
||||||
|
|
||||||
with_read_replica do
|
with_read_replica do
|
||||||
FeedManager.instance.unmerge_from_home(@from_account, @into_account)
|
FeedManager.instance.unmerge_from_home(@from_account, @into_account)
|
||||||
end
|
end
|
||||||
rescue ActiveRecord::RecordNotFound
|
end
|
||||||
true
|
|
||||||
|
def unmerge_from_list!(into_list_id)
|
||||||
|
with_primary do
|
||||||
|
@into_list = List.find(into_list_id)
|
||||||
|
end
|
||||||
|
|
||||||
|
with_read_replica do
|
||||||
|
FeedManager.instance.unmerge_from_list(@from_account, @into_list)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -55,10 +55,11 @@ production:
|
|||||||
prepared_statements: <%= ENV['PREPARED_STATEMENTS'] || 'true' %>
|
prepared_statements: <%= ENV['PREPARED_STATEMENTS'] || 'true' %>
|
||||||
replica:
|
replica:
|
||||||
<<: *default
|
<<: *default
|
||||||
database: <%= ENV['REPLICA_DB_NAME'] ||ENV['DB_NAME'] || 'mastodon_production' %>
|
database: <%= ENV['REPLICA_DB_NAME'] || ENV['DB_NAME'] || 'mastodon_production' %>
|
||||||
username: <%= ENV['REPLICA_DB_USER'] ||ENV['DB_USER'] || 'mastodon' %>
|
username: <%= ENV['REPLICA_DB_USER'] || ENV['DB_USER'] || 'mastodon' %>
|
||||||
password: <%= (ENV['REPLICA_DB_PASS'] || ENV['DB_PASS'] || '').to_json %>
|
password: <%= (ENV['REPLICA_DB_PASS'] || ENV['DB_PASS'] || '').to_json %>
|
||||||
host: <%= ENV['REPLICA_DB_HOST'] ||ENV['DB_HOST'] || 'localhost' %>
|
host: <%= ENV['REPLICA_DB_HOST'] || ENV['DB_HOST'] || 'localhost' %>
|
||||||
port: <%= ENV['REPLICA_DB_PORT'] ||ENV['DB_PORT'] || 5432 %>
|
port: <%= ENV['REPLICA_DB_PORT'] || ENV['DB_PORT'] || 5432 %>
|
||||||
prepared_statements: <%= ENV['PREPARED_STATEMENTS'] || 'true' %>
|
prepared_statements: <%= ENV['REPLICA_PREPARED_STATEMENTS'] || ENV['PREPARED_STATEMENTS'] || 'true' %>
|
||||||
replica: true
|
replica: true
|
||||||
|
database_tasks: <%= ENV['REPLICA_DB_TASKS'] || 'true' %>
|
||||||
|
@ -65,6 +65,13 @@ if ENV.keys.any? { |name| name.match?(/OTEL_.*_ENDPOINT/) }
|
|||||||
"#{prefix}#{separator}#{$PROGRAM_NAME.split('/').last}"
|
"#{prefix}#{separator}#{$PROGRAM_NAME.split('/').last}"
|
||||||
end
|
end
|
||||||
c.service_version = Mastodon::Version.to_s
|
c.service_version = Mastodon::Version.to_s
|
||||||
|
|
||||||
|
if Mastodon::Version.source_commit.present?
|
||||||
|
c.resource = OpenTelemetry::SDK::Resources::Resource.create(
|
||||||
|
'vcs.repository.ref.revision' => Mastodon::Version.source_commit,
|
||||||
|
'vcs.repository.url.full' => Mastodon::Version.source_base_url
|
||||||
|
)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -49,16 +49,16 @@ zh-CN:
|
|||||||
blocked: 使用了被封禁的电子邮件提供商
|
blocked: 使用了被封禁的电子邮件提供商
|
||||||
unreachable: 似乎不存在
|
unreachable: 似乎不存在
|
||||||
role_id:
|
role_id:
|
||||||
elevated: 不能高于您当前的身份
|
elevated: 不能高于你现在的身份
|
||||||
user_role:
|
user_role:
|
||||||
attributes:
|
attributes:
|
||||||
permissions_as_keys:
|
permissions_as_keys:
|
||||||
dangerous: 包含对基本角色不安全的权限
|
dangerous: 包含对基本角色不安全的权限
|
||||||
elevated: 不能包含您当前身份未有的权限
|
elevated: 不能包含你当前身份未有的权限
|
||||||
own_role: 无法以您当前的身份更改
|
own_role: 无权以你当前的身份更改
|
||||||
position:
|
position:
|
||||||
elevated: 不能高于您当前的角色
|
elevated: 不能高于你当前的角色
|
||||||
own_role: 无法以您当前的身份更改
|
own_role: 无权以你当前的身份更改
|
||||||
webhook:
|
webhook:
|
||||||
attributes:
|
attributes:
|
||||||
events:
|
events:
|
||||||
|
@ -723,7 +723,6 @@ an:
|
|||||||
original_status: Publicación orichinal
|
original_status: Publicación orichinal
|
||||||
reblogs: Impulsos
|
reblogs: Impulsos
|
||||||
status_changed: Publicación cambiada
|
status_changed: Publicación cambiada
|
||||||
title: Estau d'as cuentas - @%{name}
|
|
||||||
trending: En tendencia
|
trending: En tendencia
|
||||||
visibility: Visibilidat
|
visibility: Visibilidat
|
||||||
with_media: Con multimedia
|
with_media: Con multimedia
|
||||||
|
@ -847,7 +847,6 @@ ar:
|
|||||||
original_status: المنشور الأصلي
|
original_status: المنشور الأصلي
|
||||||
reblogs: المعاد تدوينها
|
reblogs: المعاد تدوينها
|
||||||
status_changed: عُدّل المنشور
|
status_changed: عُدّل المنشور
|
||||||
title: منشورات الحساب - @%{name}
|
|
||||||
trending: المتداولة
|
trending: المتداولة
|
||||||
visibility: مدى الظهور
|
visibility: مدى الظهور
|
||||||
with_media: تحتوي على وسائط
|
with_media: تحتوي على وسائط
|
||||||
|
@ -856,7 +856,6 @@ be:
|
|||||||
original_status: Зыходны допіс
|
original_status: Зыходны допіс
|
||||||
reblogs: Рэпосты
|
reblogs: Рэпосты
|
||||||
status_changed: Допіс зменены
|
status_changed: Допіс зменены
|
||||||
title: Допісы уліковага запісу - @%{name}
|
|
||||||
trending: Папулярныя
|
trending: Папулярныя
|
||||||
visibility: Бачнасць
|
visibility: Бачнасць
|
||||||
with_media: З медыя
|
with_media: З медыя
|
||||||
|
@ -807,7 +807,7 @@ bg:
|
|||||||
original_status: Първообразна публикация
|
original_status: Първообразна публикация
|
||||||
reblogs: Блогване пак
|
reblogs: Блогване пак
|
||||||
status_changed: Публикацията променена
|
status_changed: Публикацията променена
|
||||||
title: Публикации на акаунта - @%{name}
|
title: Публикации на акаунт - @%{name}
|
||||||
trending: Изгряващи
|
trending: Изгряващи
|
||||||
visibility: Видимост
|
visibility: Видимост
|
||||||
with_media: С мултимедия
|
with_media: С мултимедия
|
||||||
@ -1105,8 +1105,10 @@ bg:
|
|||||||
security: Сигурност
|
security: Сигурност
|
||||||
set_new_password: Задаване на нова парола
|
set_new_password: Задаване на нова парола
|
||||||
setup:
|
setup:
|
||||||
|
email_below_hint_html: Проверете папката си за спам или поискайте друго е-писмо. Може да поправите адреса на имейла си, ако е грешен.
|
||||||
email_settings_hint_html: Щракнете на връзката за потвърждаване, която ви изпратихме до %{email}. Ще ви почакаме тук.
|
email_settings_hint_html: Щракнете на връзката за потвърждаване, която ви изпратихме до %{email}. Ще ви почакаме тук.
|
||||||
link_not_received: Не получихте ли връзка?
|
link_not_received: Не получихте ли връзка?
|
||||||
|
new_confirmation_instructions_sent: До няколко минути ще получите друго е-писмо с връзка за потвърждаване!
|
||||||
title: Проверете входящата си поща
|
title: Проверете входящата си поща
|
||||||
sign_in:
|
sign_in:
|
||||||
preamble_html: Влезте с идентификационните данни за <strong>%{domain}</strong>. Ако вашият акаунт е хостван на различен сървър, няма да можете да влезете в този.
|
preamble_html: Влезте с идентификационните данни за <strong>%{domain}</strong>. Ако вашият акаунт е хостван на различен сървър, няма да можете да влезете в този.
|
||||||
@ -1117,6 +1119,7 @@ bg:
|
|||||||
title: Първоначални настройки за %{domain}.
|
title: Първоначални настройки за %{domain}.
|
||||||
status:
|
status:
|
||||||
account_status: Състояние на акаунта
|
account_status: Състояние на акаунта
|
||||||
|
confirming: Чака се потвърждението на имейла да завърши.
|
||||||
functional: Вашият акаунт е в изправност.
|
functional: Вашият акаунт е в изправност.
|
||||||
pending: Вашето приложение чака преглед от персонала ни. Това може да отнеме време. Ще получите е-писмо, ако приложението ви се одобри.
|
pending: Вашето приложение чака преглед от персонала ни. Това може да отнеме време. Ще получите е-писмо, ако приложението ви се одобри.
|
||||||
redirecting_to: Вашият акаунт е бездеен, защото сега се пренасочва към %{acct}.
|
redirecting_to: Вашият акаунт е бездеен, защото сега се пренасочва към %{acct}.
|
||||||
@ -1126,6 +1129,8 @@ bg:
|
|||||||
use_security_key: Употреба на ключ за сигурност
|
use_security_key: Употреба на ключ за сигурност
|
||||||
author_attribution:
|
author_attribution:
|
||||||
example_title: Примерен текст
|
example_title: Примерен текст
|
||||||
|
hint_html: Пишете ли новинарски статии или блогове извън Mastodon? Управлявайте как ви приписват авторството, когато са споделени в Mastodon.
|
||||||
|
instructions: 'Уверете се, че този код е в HTML на статията ви:'
|
||||||
more_from_html: Още от %{name}
|
more_from_html: Още от %{name}
|
||||||
s_blog: Блогът на %{name}
|
s_blog: Блогът на %{name}
|
||||||
then_instructions: Тогава добавете име на домейна на публикацията в долното поле.
|
then_instructions: Тогава добавете име на домейна на публикацията в долното поле.
|
||||||
@ -1166,6 +1171,9 @@ bg:
|
|||||||
before: 'Прочетете внимателно тези бележки преди да продължите:'
|
before: 'Прочетете внимателно тези бележки преди да продължите:'
|
||||||
caches: Съдържание, което може да е кеширано от други сървъри, може да се задържи
|
caches: Съдържание, което може да е кеширано от други сървъри, може да се задържи
|
||||||
data_removal: Ваши публикации и други данни ще бъдат завинаги премахнати
|
data_removal: Ваши публикации и други данни ще бъдат завинаги премахнати
|
||||||
|
email_change_html: Може да <a href="%{path}">промените адреса на имейла си</a>, без да изтривате акаунта си
|
||||||
|
email_contact_html: Ако още не сте го получили, то обърнете се за помощ към <a href="mailto:%{email}">%{email}</a>
|
||||||
|
email_reconfirmation_html: Ако не сте получили е-писмо за потвърждение, може да го <a href="%{path}">заявите отново</a>
|
||||||
irreversible: Няма да може да възстановите или да задействате пак акаунта си
|
irreversible: Няма да може да възстановите или да задействате пак акаунта си
|
||||||
more_details_html: За повече детайли прегледайте <a href="%{terms_path}">декларацията за поверителност</a>.
|
more_details_html: За повече детайли прегледайте <a href="%{terms_path}">декларацията за поверителност</a>.
|
||||||
username_available: Вашето потребителско име ще стане налично отново
|
username_available: Вашето потребителско име ще стане налично отново
|
||||||
@ -1393,6 +1401,7 @@ bg:
|
|||||||
unsubscribe:
|
unsubscribe:
|
||||||
action: Да, да се спре абонамента
|
action: Да, да се спре абонамента
|
||||||
complete: Спрян абонамент
|
complete: Спрян абонамент
|
||||||
|
confirmation_html: Наистина ли искате да спрете абонамента от получаването на %{type} за Mastodon в %{domain} към имейла си при %{email}? Може винаги пак да се абонирате от своите <a href="%{settings_path}">настройки за известяване по е-поща</a>.
|
||||||
title: Спиране на абонамента
|
title: Спиране на абонамента
|
||||||
media_attachments:
|
media_attachments:
|
||||||
validations:
|
validations:
|
||||||
|
@ -263,7 +263,7 @@ br:
|
|||||||
original_status: Toud orin
|
original_status: Toud orin
|
||||||
reblogs: Skignadennoù
|
reblogs: Skignadennoù
|
||||||
status_changed: Toud kemmet
|
status_changed: Toud kemmet
|
||||||
title: Toudoù ar gont - @%{name}
|
status_title: Embannadenn gant @%{name}
|
||||||
visibility: Gwelusted
|
visibility: Gwelusted
|
||||||
with_media: Gant mediaoù
|
with_media: Gant mediaoù
|
||||||
strikes:
|
strikes:
|
||||||
|
@ -841,7 +841,6 @@ ca:
|
|||||||
original_status: Publicació original
|
original_status: Publicació original
|
||||||
reblogs: Impulsos
|
reblogs: Impulsos
|
||||||
status_changed: Publicació canviada
|
status_changed: Publicació canviada
|
||||||
title: Estats del compte - @%{name}
|
|
||||||
trending: Tendència
|
trending: Tendència
|
||||||
visibility: Visibilitat
|
visibility: Visibilitat
|
||||||
with_media: Amb contingut multimèdia
|
with_media: Amb contingut multimèdia
|
||||||
|
@ -520,7 +520,6 @@ ckb:
|
|||||||
media:
|
media:
|
||||||
title: میدیا
|
title: میدیا
|
||||||
no_status_selected: هیچ دۆخیک نەگۆڕاوە وەک ئەوەی هیچ بارێک دەستنیشان نەکراوە
|
no_status_selected: هیچ دۆخیک نەگۆڕاوە وەک ئەوەی هیچ بارێک دەستنیشان نەکراوە
|
||||||
title: دۆخی ئەژمێر - @%{name}
|
|
||||||
with_media: بە میدیا
|
with_media: بە میدیا
|
||||||
tags:
|
tags:
|
||||||
review: پێداچوونەوەی دۆخ
|
review: پێداچوونەوەی دۆخ
|
||||||
|
@ -459,7 +459,6 @@ co:
|
|||||||
media:
|
media:
|
||||||
title: Media
|
title: Media
|
||||||
no_status_selected: I statuti ùn sò micca stati mudificati perchè manc'unu era selezziunatu
|
no_status_selected: I statuti ùn sò micca stati mudificati perchè manc'unu era selezziunatu
|
||||||
title: Statuti di u contu - @%{name}
|
|
||||||
with_media: Cù media
|
with_media: Cù media
|
||||||
system_checks:
|
system_checks:
|
||||||
rules_check:
|
rules_check:
|
||||||
|
@ -826,7 +826,6 @@ cs:
|
|||||||
original_status: Původní příspěvek
|
original_status: Původní příspěvek
|
||||||
reblogs: Boosty
|
reblogs: Boosty
|
||||||
status_changed: Příspěvek změněn
|
status_changed: Příspěvek změněn
|
||||||
title: Příspěvky účtu - @%{name}
|
|
||||||
trending: Populární
|
trending: Populární
|
||||||
visibility: Viditelnost
|
visibility: Viditelnost
|
||||||
with_media: S médii
|
with_media: S médii
|
||||||
|
@ -897,7 +897,6 @@ cy:
|
|||||||
original_status: Postiad gwreiddiol
|
original_status: Postiad gwreiddiol
|
||||||
reblogs: Ailflogiadau
|
reblogs: Ailflogiadau
|
||||||
status_changed: Postiad wedi'i newid
|
status_changed: Postiad wedi'i newid
|
||||||
title: Postiadau cyfrif - @%{name}
|
|
||||||
trending: Yn trendio
|
trending: Yn trendio
|
||||||
visibility: Gwelededd
|
visibility: Gwelededd
|
||||||
with_media: Gyda chyfryngau
|
with_media: Gyda chyfryngau
|
||||||
|
@ -826,8 +826,10 @@ da:
|
|||||||
back_to_account: Retur til kontoside
|
back_to_account: Retur til kontoside
|
||||||
back_to_report: Retur til anmeldelsesside
|
back_to_report: Retur til anmeldelsesside
|
||||||
batch:
|
batch:
|
||||||
|
add_to_report: 'Føj til rapporten #%{id}'
|
||||||
remove_from_report: Fjern fra anmeldelse
|
remove_from_report: Fjern fra anmeldelse
|
||||||
report: Anmeldelse
|
report: Anmeldelse
|
||||||
|
contents: Indhold
|
||||||
deleted: Slettet
|
deleted: Slettet
|
||||||
favourites: Favoritter
|
favourites: Favoritter
|
||||||
history: Versionshistorik
|
history: Versionshistorik
|
||||||
@ -836,13 +838,17 @@ da:
|
|||||||
media:
|
media:
|
||||||
title: Medier
|
title: Medier
|
||||||
metadata: Metadata
|
metadata: Metadata
|
||||||
|
no_history: Dette indlæg er ikke blevet redigeret
|
||||||
no_status_selected: Ingen indlæg ændret (ingen valgt)
|
no_status_selected: Ingen indlæg ændret (ingen valgt)
|
||||||
open: Åbn indlæg
|
open: Åbn indlæg
|
||||||
original_status: Oprindeligt indlæg
|
original_status: Oprindeligt indlæg
|
||||||
reblogs: Genblogninger
|
reblogs: Genblogninger
|
||||||
|
replied_to_html: Besvarede %{acct_link}
|
||||||
status_changed: Indlæg ændret
|
status_changed: Indlæg ændret
|
||||||
|
status_title: Indlæg fra @%{name}
|
||||||
title: Kontoindlæg - @%{name}
|
title: Kontoindlæg - @%{name}
|
||||||
trending: Populære
|
trending: Populære
|
||||||
|
view_publicly: Vis offentligt
|
||||||
visibility: Synlighed
|
visibility: Synlighed
|
||||||
with_media: Med medier
|
with_media: Med medier
|
||||||
strikes:
|
strikes:
|
||||||
|
@ -427,9 +427,9 @@ de:
|
|||||||
not_permitted: Du bist nicht berechtigt, diese Aktion durchzuführen
|
not_permitted: Du bist nicht berechtigt, diese Aktion durchzuführen
|
||||||
obfuscate: Domain-Name verschleiern
|
obfuscate: Domain-Name verschleiern
|
||||||
obfuscate_hint: Den Domain-Namen öffentlich nur teilweise bekannt geben, sofern die Liste der Domain-Beschränkungen aktiviert ist
|
obfuscate_hint: Den Domain-Namen öffentlich nur teilweise bekannt geben, sofern die Liste der Domain-Beschränkungen aktiviert ist
|
||||||
private_comment: Interne bzw. nicht-öffentliche Notiz
|
private_comment: Nicht-öffentliche Notiz
|
||||||
private_comment_hint: Kommentar zu dieser Domain-Beschränkung für die interne Nutzung durch die Moderator*innen.
|
private_comment_hint: Kommentar zu dieser Domain-Beschränkung für die interne Nutzung durch die Moderator*innen.
|
||||||
public_comment: Öffentliche Notiz
|
public_comment: Öffentliche Begründung
|
||||||
public_comment_hint: Öffentlicher Hinweis zu dieser Domain-Beschränkung, sofern das Veröffentlichen von Sperrlisten grundsätzlich aktiviert ist.
|
public_comment_hint: Öffentlicher Hinweis zu dieser Domain-Beschränkung, sofern das Veröffentlichen von Sperrlisten grundsätzlich aktiviert ist.
|
||||||
reject_media: Mediendateien ablehnen
|
reject_media: Mediendateien ablehnen
|
||||||
reject_media_hint: Entfernt lokal gespeicherte Mediendateien und verhindert deren künftiges Herunterladen. Für Sperren irrelevant
|
reject_media_hint: Entfernt lokal gespeicherte Mediendateien und verhindert deren künftiges Herunterladen. Für Sperren irrelevant
|
||||||
@ -502,7 +502,7 @@ de:
|
|||||||
by_domain: Domain
|
by_domain: Domain
|
||||||
confirm_purge: Möchtest du die Daten von dieser Domain wirklich für immer löschen?
|
confirm_purge: Möchtest du die Daten von dieser Domain wirklich für immer löschen?
|
||||||
content_policies:
|
content_policies:
|
||||||
comment: Interne Notiz
|
comment: Nicht-öffentliche Notiz
|
||||||
description_html: Du kannst Inhaltsrichtlinien definieren, die auf alle Konten dieser Domain und einer ihrer Subdomains angewendet werden.
|
description_html: Du kannst Inhaltsrichtlinien definieren, die auf alle Konten dieser Domain und einer ihrer Subdomains angewendet werden.
|
||||||
limited_federation_mode_description_html: Du kannst auswählen, ob du eine Föderation mit dieser Domain erlaubst.
|
limited_federation_mode_description_html: Du kannst auswählen, ob du eine Föderation mit dieser Domain erlaubst.
|
||||||
policies:
|
policies:
|
||||||
@ -826,8 +826,10 @@ de:
|
|||||||
back_to_account: Zurück zum Konto
|
back_to_account: Zurück zum Konto
|
||||||
back_to_report: Zurück zur Seite mit den Meldungen
|
back_to_report: Zurück zur Seite mit den Meldungen
|
||||||
batch:
|
batch:
|
||||||
|
add_to_report: Der Meldung Nr. %{id} hinzufügen
|
||||||
remove_from_report: Von der Meldung entfernen
|
remove_from_report: Von der Meldung entfernen
|
||||||
report: Meldung
|
report: Meldung
|
||||||
|
contents: Inhalte
|
||||||
deleted: Gelöscht
|
deleted: Gelöscht
|
||||||
favourites: Favoriten
|
favourites: Favoriten
|
||||||
history: Versionsverlauf
|
history: Versionsverlauf
|
||||||
@ -836,13 +838,17 @@ de:
|
|||||||
media:
|
media:
|
||||||
title: Medien
|
title: Medien
|
||||||
metadata: Metadaten
|
metadata: Metadaten
|
||||||
|
no_history: Der Beitrag wurde nicht bearbeitet
|
||||||
no_status_selected: Keine Beiträge wurden geändert, weil keine ausgewählt wurden
|
no_status_selected: Keine Beiträge wurden geändert, weil keine ausgewählt wurden
|
||||||
open: Beitrag öffnen
|
open: Beitrag öffnen
|
||||||
original_status: Ursprünglicher Beitrag
|
original_status: Ursprünglicher Beitrag
|
||||||
reblogs: Geteilte Beiträge
|
reblogs: Geteilte Beiträge
|
||||||
|
replied_to_html: Antwortete %{acct_link}
|
||||||
status_changed: Beitrag bearbeitet
|
status_changed: Beitrag bearbeitet
|
||||||
title: Beiträge des Kontos - @%{name}
|
status_title: Beitrag von @%{name}
|
||||||
|
title: Beiträge des Kontos – @%{name}
|
||||||
trending: Trends
|
trending: Trends
|
||||||
|
view_publicly: Öffentlich anzeigen
|
||||||
visibility: Sichtbarkeit
|
visibility: Sichtbarkeit
|
||||||
with_media: Mit Medien
|
with_media: Mit Medien
|
||||||
strikes:
|
strikes:
|
||||||
|
@ -9,7 +9,7 @@ zh-CN:
|
|||||||
already_authenticated: 你已登录。
|
already_authenticated: 你已登录。
|
||||||
inactive: 你还没有激活账户。
|
inactive: 你还没有激活账户。
|
||||||
invalid: "%{authentication_keys} 无效或密码错误。"
|
invalid: "%{authentication_keys} 无效或密码错误。"
|
||||||
last_attempt: 你只有最后一次尝试机会,若未通过,帐号将被锁定。
|
last_attempt: 你只有最后一次尝试机会,若未通过,账号将被锁定。
|
||||||
locked: 你的账户已被锁定。
|
locked: 你的账户已被锁定。
|
||||||
not_found_in_database: "%{authentication_keys}或密码错误。"
|
not_found_in_database: "%{authentication_keys}或密码错误。"
|
||||||
omniauth_user_creation_failure: 为此身份创建账户时出错。
|
omniauth_user_creation_failure: 为此身份创建账户时出错。
|
||||||
@ -33,7 +33,7 @@ zh-CN:
|
|||||||
title: 新邮箱地址
|
title: 新邮箱地址
|
||||||
password_change:
|
password_change:
|
||||||
explanation: 你的账户密码已更改。
|
explanation: 你的账户密码已更改。
|
||||||
extra: 如果你并没有申请更改密码,那似乎有人已经入侵你的帐户。请立即更改你的密码;如果你已经无法访问你的帐户,请联系服务器的管理员获取帮助。
|
extra: 如果你并没有申请更改密码,那似乎有人已经入侵你的账户。请立即更改你的密码;如果你已经无法访问你的账户,请联系服务器的管理员获取帮助。
|
||||||
subject: Mastodon:密码已被更改
|
subject: Mastodon:密码已被更改
|
||||||
title: 密码已被重置
|
title: 密码已被重置
|
||||||
reconfirmation_instructions:
|
reconfirmation_instructions:
|
||||||
@ -66,7 +66,7 @@ zh-CN:
|
|||||||
subject: Mastodon:账户解锁信息
|
subject: Mastodon:账户解锁信息
|
||||||
webauthn_credential:
|
webauthn_credential:
|
||||||
added:
|
added:
|
||||||
explanation: 以下安全密钥已添加到你的帐户
|
explanation: 以下安全密钥已添加到你的账户
|
||||||
subject: Mastodon:新的安全密钥
|
subject: Mastodon:新的安全密钥
|
||||||
title: 已添加一个新的安全密钥
|
title: 已添加一个新的安全密钥
|
||||||
deleted:
|
deleted:
|
||||||
|
@ -60,6 +60,7 @@ ia:
|
|||||||
error:
|
error:
|
||||||
title: Un error ha occurrite
|
title: Un error ha occurrite
|
||||||
new:
|
new:
|
||||||
|
prompt_html: "%{client_name} vole haber le permission de acceder a tu conto. <strong>Solmente approba iste requesta si tu recognosce e confide in iste fonte.</strong>"
|
||||||
review_permissions: Revider permissiones
|
review_permissions: Revider permissiones
|
||||||
title: Autorisation necessari
|
title: Autorisation necessari
|
||||||
show:
|
show:
|
||||||
@ -82,6 +83,7 @@ ia:
|
|||||||
access_denied: Le proprietario del ressource o servitor de autorisation ha refusate le requesta.
|
access_denied: Le proprietario del ressource o servitor de autorisation ha refusate le requesta.
|
||||||
credential_flow_not_configured: Le processo de credentiales de contrasigno del proprietario del ressource ha fallite perque Doorkeeper.configure.resource_owner_from_credentials non es configurate.
|
credential_flow_not_configured: Le processo de credentiales de contrasigno del proprietario del ressource ha fallite perque Doorkeeper.configure.resource_owner_from_credentials non es configurate.
|
||||||
invalid_client: Le authentication del cliente ha fallite perque le cliente es incognite, necun authentication de cliente es includite, o le methodo de authentication non es supportate.
|
invalid_client: Le authentication del cliente ha fallite perque le cliente es incognite, necun authentication de cliente es includite, o le methodo de authentication non es supportate.
|
||||||
|
invalid_code_challenge_method: Le methodo de defia de codice debe esser S256. Le methodo simple (plain) non es supportate.
|
||||||
invalid_grant: Le concession de autorisation fornite es invalide, expirate, revocate, non corresponde al URI de redirection usate in le requesta de autorisation, o ha essite emittite a un altere cliente.
|
invalid_grant: Le concession de autorisation fornite es invalide, expirate, revocate, non corresponde al URI de redirection usate in le requesta de autorisation, o ha essite emittite a un altere cliente.
|
||||||
invalid_redirect_uri: Le URI de redirection includite non es valide.
|
invalid_redirect_uri: Le URI de redirection includite non es valide.
|
||||||
invalid_request:
|
invalid_request:
|
||||||
|
@ -60,7 +60,7 @@ zh-CN:
|
|||||||
error:
|
error:
|
||||||
title: 发生错误
|
title: 发生错误
|
||||||
new:
|
new:
|
||||||
prompt_html: "%{client_name} 请求获得访问您账户的权限。 <strong>请在确保自己了解并信任此来源后再批准该请求。</strong>"
|
prompt_html: "%{client_name} 请求获得访问你账户的权限。 <strong>请在确保自己了解并信任此来源后再批准该请求。</strong>"
|
||||||
review_permissions: 检查权限
|
review_permissions: 检查权限
|
||||||
title: 需要授权
|
title: 需要授权
|
||||||
show:
|
show:
|
||||||
@ -85,7 +85,7 @@ zh-CN:
|
|||||||
invalid_client: 由于应用信息未知、未提交认证信息或使用了不支持的认证方式,认证失败
|
invalid_client: 由于应用信息未知、未提交认证信息或使用了不支持的认证方式,认证失败
|
||||||
invalid_code_challenge_method: 代码验证方法必须是 S256,不支持明文。
|
invalid_code_challenge_method: 代码验证方法必须是 S256,不支持明文。
|
||||||
invalid_grant: 授权方式无效、过期或已被撤销、与授权请求中的回调地址不一致,或使用了其他应用的回调地址
|
invalid_grant: 授权方式无效、过期或已被撤销、与授权请求中的回调地址不一致,或使用了其他应用的回调地址
|
||||||
invalid_redirect_uri: 无效的登录回调地址
|
invalid_redirect_uri: 登录回调地址无效。
|
||||||
invalid_request:
|
invalid_request:
|
||||||
missing_param: 缺少必需的参数:%{value}
|
missing_param: 缺少必需的参数:%{value}
|
||||||
request_not_authorized: 请求需要被授权。授权请求所需的参数缺失或无效。
|
request_not_authorized: 请求需要被授权。授权请求所需的参数缺失或无效。
|
||||||
@ -123,14 +123,14 @@ zh-CN:
|
|||||||
admin/accounts: 账号管理
|
admin/accounts: 账号管理
|
||||||
admin/all: 所有管理功能
|
admin/all: 所有管理功能
|
||||||
admin/reports: 举报管理
|
admin/reports: 举报管理
|
||||||
all: 完全访问您的Mastodon账户
|
all: 完全访问你的Mastodon账户
|
||||||
blocks: 屏蔽
|
blocks: 屏蔽
|
||||||
bookmarks: 书签
|
bookmarks: 书签
|
||||||
conversations: 会话
|
conversations: 会话
|
||||||
crypto: 端到端加密
|
crypto: 端到端加密
|
||||||
favourites: 喜欢
|
favourites: 喜欢
|
||||||
filters: 过滤器
|
filters: 过滤器
|
||||||
follow: 关注者,隐藏与屏蔽
|
follow: 关注,隐藏与屏蔽
|
||||||
follows: 关注
|
follows: 关注
|
||||||
lists: 列表
|
lists: 列表
|
||||||
media: 媒体文件
|
media: 媒体文件
|
||||||
@ -163,7 +163,7 @@ zh-CN:
|
|||||||
admin:write:domain_allows: 在域上执行管理操作
|
admin:write:domain_allows: 在域上执行管理操作
|
||||||
admin:write:domain_blocks: 在域块上执行管理操作
|
admin:write:domain_blocks: 在域块上执行管理操作
|
||||||
admin:write:email_domain_blocks: 对已屏蔽邮箱域名执行管理操作
|
admin:write:email_domain_blocks: 对已屏蔽邮箱域名执行管理操作
|
||||||
admin:write:ip_blocks: 在 IP 块上执行管理操作
|
admin:write:ip_blocks: 针对 IP 段执行管理操作
|
||||||
admin:write:reports: 对举报执行管理操作
|
admin:write:reports: 对举报执行管理操作
|
||||||
crypto: 使用端到端加密
|
crypto: 使用端到端加密
|
||||||
follow: 关注或屏蔽用户
|
follow: 关注或屏蔽用户
|
||||||
|
@ -817,7 +817,6 @@ el:
|
|||||||
original_status: Αρχική ανάρτηση
|
original_status: Αρχική ανάρτηση
|
||||||
reblogs: Αναδημοσιεύσεις
|
reblogs: Αναδημοσιεύσεις
|
||||||
status_changed: Η ανάρτηση άλλαξε
|
status_changed: Η ανάρτηση άλλαξε
|
||||||
title: Καταστάσεις λογαριασμού - @%{name}
|
|
||||||
trending: Τάσεις
|
trending: Τάσεις
|
||||||
visibility: Ορατότητα
|
visibility: Ορατότητα
|
||||||
with_media: Με πολυμέσα
|
with_media: Με πολυμέσα
|
||||||
|
@ -832,7 +832,6 @@ en-GB:
|
|||||||
original_status: Original post
|
original_status: Original post
|
||||||
reblogs: Reblogs
|
reblogs: Reblogs
|
||||||
status_changed: Post changed
|
status_changed: Post changed
|
||||||
title: Account posts - @%{name}
|
|
||||||
trending: Trending
|
trending: Trending
|
||||||
visibility: Visibility
|
visibility: Visibility
|
||||||
with_media: With media
|
with_media: With media
|
||||||
|
@ -830,7 +830,6 @@ eo:
|
|||||||
original_status: Originala afiŝo
|
original_status: Originala afiŝo
|
||||||
reblogs: Reblogaĵoj
|
reblogs: Reblogaĵoj
|
||||||
status_changed: Afiŝo ŝanĝiĝis
|
status_changed: Afiŝo ŝanĝiĝis
|
||||||
title: Afiŝoj de la konto - @%{name}
|
|
||||||
trending: Popularaĵoj
|
trending: Popularaĵoj
|
||||||
visibility: Videbleco
|
visibility: Videbleco
|
||||||
with_media: Kun aŭdovidaĵoj
|
with_media: Kun aŭdovidaĵoj
|
||||||
|
@ -187,6 +187,7 @@ es-AR:
|
|||||||
create_domain_block: Crear bloqueo de dominio
|
create_domain_block: Crear bloqueo de dominio
|
||||||
create_email_domain_block: Crear bloqueo de dominio de correo electrónico
|
create_email_domain_block: Crear bloqueo de dominio de correo electrónico
|
||||||
create_ip_block: Crear regla de dirección IP
|
create_ip_block: Crear regla de dirección IP
|
||||||
|
create_relay: Crear Relé
|
||||||
create_unavailable_domain: Crear dominio no disponible
|
create_unavailable_domain: Crear dominio no disponible
|
||||||
create_user_role: Crear rol
|
create_user_role: Crear rol
|
||||||
demote_user: Descender usuario
|
demote_user: Descender usuario
|
||||||
@ -198,14 +199,17 @@ es-AR:
|
|||||||
destroy_email_domain_block: Eliminar bloqueo de dominio de correo electrónico
|
destroy_email_domain_block: Eliminar bloqueo de dominio de correo electrónico
|
||||||
destroy_instance: Purgar dominio
|
destroy_instance: Purgar dominio
|
||||||
destroy_ip_block: Eliminar regla de dirección IP
|
destroy_ip_block: Eliminar regla de dirección IP
|
||||||
|
destroy_relay: Eliminar Relé
|
||||||
destroy_status: Eliminar mensaje
|
destroy_status: Eliminar mensaje
|
||||||
destroy_unavailable_domain: Eliminar dominio no disponible
|
destroy_unavailable_domain: Eliminar dominio no disponible
|
||||||
destroy_user_role: Destruir rol
|
destroy_user_role: Destruir rol
|
||||||
disable_2fa_user: Deshabilitar 2FA
|
disable_2fa_user: Deshabilitar 2FA
|
||||||
disable_custom_emoji: Deshabilitar emoji personalizado
|
disable_custom_emoji: Deshabilitar emoji personalizado
|
||||||
|
disable_relay: Desactivar Relé
|
||||||
disable_sign_in_token_auth_user: Deshabilitar autenticación de token por correo electrónico para el usuario
|
disable_sign_in_token_auth_user: Deshabilitar autenticación de token por correo electrónico para el usuario
|
||||||
disable_user: Deshabilitar usuario
|
disable_user: Deshabilitar usuario
|
||||||
enable_custom_emoji: Habilitar emoji personalizado
|
enable_custom_emoji: Habilitar emoji personalizado
|
||||||
|
enable_relay: Activar Relé
|
||||||
enable_sign_in_token_auth_user: Habilitar autenticación de token por correo electrónico para el usuario
|
enable_sign_in_token_auth_user: Habilitar autenticación de token por correo electrónico para el usuario
|
||||||
enable_user: Habilitar usuario
|
enable_user: Habilitar usuario
|
||||||
memorialize_account: Convertir en cuenta conmemorativa
|
memorialize_account: Convertir en cuenta conmemorativa
|
||||||
@ -247,6 +251,7 @@ es-AR:
|
|||||||
create_domain_block_html: "%{name} bloqueó el dominio %{target}"
|
create_domain_block_html: "%{name} bloqueó el dominio %{target}"
|
||||||
create_email_domain_block_html: "%{name} bloqueó el dominio de correo electrónico %{target}"
|
create_email_domain_block_html: "%{name} bloqueó el dominio de correo electrónico %{target}"
|
||||||
create_ip_block_html: "%{name} creó la regla para la dirección IP %{target}"
|
create_ip_block_html: "%{name} creó la regla para la dirección IP %{target}"
|
||||||
|
create_relay_html: "%{name} creó un relé %{target}"
|
||||||
create_unavailable_domain_html: "%{name} detuvo la entrega al dominio %{target}"
|
create_unavailable_domain_html: "%{name} detuvo la entrega al dominio %{target}"
|
||||||
create_user_role_html: "%{name} creó el rol %{target}"
|
create_user_role_html: "%{name} creó el rol %{target}"
|
||||||
demote_user_html: "%{name} bajó de nivel al usuario %{target}"
|
demote_user_html: "%{name} bajó de nivel al usuario %{target}"
|
||||||
@ -258,14 +263,17 @@ es-AR:
|
|||||||
destroy_email_domain_block_html: "%{name} desbloqueó el dominio de correo electrónico %{target}"
|
destroy_email_domain_block_html: "%{name} desbloqueó el dominio de correo electrónico %{target}"
|
||||||
destroy_instance_html: "%{name} purgó el dominio %{target}"
|
destroy_instance_html: "%{name} purgó el dominio %{target}"
|
||||||
destroy_ip_block_html: "%{name} eliminó la regla para la dirección IP %{target}"
|
destroy_ip_block_html: "%{name} eliminó la regla para la dirección IP %{target}"
|
||||||
|
destroy_relay_html: "%{name} eliminó el relé %{target}"
|
||||||
destroy_status_html: "%{name} eliminó el mensaje de %{target}"
|
destroy_status_html: "%{name} eliminó el mensaje de %{target}"
|
||||||
destroy_unavailable_domain_html: "%{name} reanudó la entrega al dominio %{target}"
|
destroy_unavailable_domain_html: "%{name} reanudó la entrega al dominio %{target}"
|
||||||
destroy_user_role_html: "%{name} eliminó el rol %{target}"
|
destroy_user_role_html: "%{name} eliminó el rol %{target}"
|
||||||
disable_2fa_user_html: "%{name} deshabilitó el requerimiento de dos factores para el usuario %{target}"
|
disable_2fa_user_html: "%{name} deshabilitó el requerimiento de dos factores para el usuario %{target}"
|
||||||
disable_custom_emoji_html: "%{name} deshabilitó el emoji %{target}"
|
disable_custom_emoji_html: "%{name} deshabilitó el emoji %{target}"
|
||||||
|
disable_relay_html: "%{name} desactivó el relé %{target}"
|
||||||
disable_sign_in_token_auth_user_html: "%{name} deshabilitó la autenticación de token por correo electrónico para %{target}"
|
disable_sign_in_token_auth_user_html: "%{name} deshabilitó la autenticación de token por correo electrónico para %{target}"
|
||||||
disable_user_html: "%{name} deshabilitó el inicio de sesión para el usuario %{target}"
|
disable_user_html: "%{name} deshabilitó el inicio de sesión para el usuario %{target}"
|
||||||
enable_custom_emoji_html: "%{name} habilitó el emoji %{target}"
|
enable_custom_emoji_html: "%{name} habilitó el emoji %{target}"
|
||||||
|
enable_relay_html: "%{name} activó el relé %{target}"
|
||||||
enable_sign_in_token_auth_user_html: "%{name} habilitó la autenticación de token por correo electrónico para %{target}"
|
enable_sign_in_token_auth_user_html: "%{name} habilitó la autenticación de token por correo electrónico para %{target}"
|
||||||
enable_user_html: "%{name} habilitó el inicio de sesión para el usuario %{target}"
|
enable_user_html: "%{name} habilitó el inicio de sesión para el usuario %{target}"
|
||||||
memorialize_account_html: "%{name} convirtió la cuenta de %{target} en una cuenta conmemorativa"
|
memorialize_account_html: "%{name} convirtió la cuenta de %{target} en una cuenta conmemorativa"
|
||||||
@ -818,8 +826,10 @@ es-AR:
|
|||||||
back_to_account: Volver a la página de la cuenta
|
back_to_account: Volver a la página de la cuenta
|
||||||
back_to_report: Volver a la página de la denuncia
|
back_to_report: Volver a la página de la denuncia
|
||||||
batch:
|
batch:
|
||||||
|
add_to_report: 'Añadir al informe #%{id}'
|
||||||
remove_from_report: Quitar de la denuncia
|
remove_from_report: Quitar de la denuncia
|
||||||
report: Denunciar
|
report: Denunciar
|
||||||
|
contents: Contenidos
|
||||||
deleted: Eliminado
|
deleted: Eliminado
|
||||||
favourites: Favoritos
|
favourites: Favoritos
|
||||||
history: Historial de versiones
|
history: Historial de versiones
|
||||||
@ -828,13 +838,17 @@ es-AR:
|
|||||||
media:
|
media:
|
||||||
title: Medios
|
title: Medios
|
||||||
metadata: Metadatos
|
metadata: Metadatos
|
||||||
|
no_history: Esta publicación no ha sido editada
|
||||||
no_status_selected: No se cambió ningún mensaje, ya que ninguno fue seleccionado
|
no_status_selected: No se cambió ningún mensaje, ya que ninguno fue seleccionado
|
||||||
open: Abrir mensaje
|
open: Abrir mensaje
|
||||||
original_status: Mensaje original
|
original_status: Mensaje original
|
||||||
reblogs: Adhesiones
|
reblogs: Adhesiones
|
||||||
|
replied_to_html: Respondió a %{acct_link}
|
||||||
status_changed: Mensaje cambiado
|
status_changed: Mensaje cambiado
|
||||||
title: Mensajes de la cuenta - @%{name}
|
status_title: Publicación de @%{name}
|
||||||
|
title: Publicaciones de la cuenta - @%{name}
|
||||||
trending: En tendencia
|
trending: En tendencia
|
||||||
|
view_publicly: Ver públicamente
|
||||||
visibility: Visibilidad
|
visibility: Visibilidad
|
||||||
with_media: Con medios
|
with_media: Con medios
|
||||||
strikes:
|
strikes:
|
||||||
|
@ -187,6 +187,7 @@ es-MX:
|
|||||||
create_domain_block: Crear Bloqueo de Dominio
|
create_domain_block: Crear Bloqueo de Dominio
|
||||||
create_email_domain_block: Crear bloqueo de dominio de correo electrónico
|
create_email_domain_block: Crear bloqueo de dominio de correo electrónico
|
||||||
create_ip_block: Crear regla IP
|
create_ip_block: Crear regla IP
|
||||||
|
create_relay: Crear Relé
|
||||||
create_unavailable_domain: Crear Dominio No Disponible
|
create_unavailable_domain: Crear Dominio No Disponible
|
||||||
create_user_role: Crear rol
|
create_user_role: Crear rol
|
||||||
demote_user: Degradar Usuario
|
demote_user: Degradar Usuario
|
||||||
@ -198,14 +199,17 @@ es-MX:
|
|||||||
destroy_email_domain_block: Eliminar bloqueo de dominio de correo electrónico
|
destroy_email_domain_block: Eliminar bloqueo de dominio de correo electrónico
|
||||||
destroy_instance: Purgar dominio
|
destroy_instance: Purgar dominio
|
||||||
destroy_ip_block: Eliminar regla IP
|
destroy_ip_block: Eliminar regla IP
|
||||||
|
destroy_relay: Eliminar Relé
|
||||||
destroy_status: Eliminar Estado
|
destroy_status: Eliminar Estado
|
||||||
destroy_unavailable_domain: Eliminar Dominio No Disponible
|
destroy_unavailable_domain: Eliminar Dominio No Disponible
|
||||||
destroy_user_role: Destruir Rol
|
destroy_user_role: Destruir Rol
|
||||||
disable_2fa_user: Deshabilitar 2FA
|
disable_2fa_user: Deshabilitar 2FA
|
||||||
disable_custom_emoji: Deshabilitar Emoji Personalizado
|
disable_custom_emoji: Deshabilitar Emoji Personalizado
|
||||||
|
disable_relay: Desactivar Relé
|
||||||
disable_sign_in_token_auth_user: Deshabilitar la autenticación por token de correo electrónico para el usuario
|
disable_sign_in_token_auth_user: Deshabilitar la autenticación por token de correo electrónico para el usuario
|
||||||
disable_user: Deshabilitar Usuario
|
disable_user: Deshabilitar Usuario
|
||||||
enable_custom_emoji: Habilitar Emoji Personalizado
|
enable_custom_emoji: Habilitar Emoji Personalizado
|
||||||
|
enable_relay: Activar Relé
|
||||||
enable_sign_in_token_auth_user: Habilitar la autenticación por token de correo electrónico para el usuario
|
enable_sign_in_token_auth_user: Habilitar la autenticación por token de correo electrónico para el usuario
|
||||||
enable_user: Habilitar Usuario
|
enable_user: Habilitar Usuario
|
||||||
memorialize_account: Transformar en Cuenta Conmemorativa
|
memorialize_account: Transformar en Cuenta Conmemorativa
|
||||||
@ -247,6 +251,7 @@ es-MX:
|
|||||||
create_domain_block_html: "%{name} bloqueó el dominio %{target}"
|
create_domain_block_html: "%{name} bloqueó el dominio %{target}"
|
||||||
create_email_domain_block_html: "%{name} bloqueó el dominio de correo electrónico %{target}"
|
create_email_domain_block_html: "%{name} bloqueó el dominio de correo electrónico %{target}"
|
||||||
create_ip_block_html: "%{name} creó una regla para la IP %{target}"
|
create_ip_block_html: "%{name} creó una regla para la IP %{target}"
|
||||||
|
create_relay_html: "%{name} creó un relé %{target}"
|
||||||
create_unavailable_domain_html: "%{name} detuvo las entregas al dominio %{target}"
|
create_unavailable_domain_html: "%{name} detuvo las entregas al dominio %{target}"
|
||||||
create_user_role_html: "%{name} creó el rol %{target}"
|
create_user_role_html: "%{name} creó el rol %{target}"
|
||||||
demote_user_html: "%{name} degradó al usuario %{target}"
|
demote_user_html: "%{name} degradó al usuario %{target}"
|
||||||
@ -258,14 +263,17 @@ es-MX:
|
|||||||
destroy_email_domain_block_html: "%{name} desbloqueó el dominio de correo electrónico %{target}"
|
destroy_email_domain_block_html: "%{name} desbloqueó el dominio de correo electrónico %{target}"
|
||||||
destroy_instance_html: "%{name} purgó el dominio %{target}"
|
destroy_instance_html: "%{name} purgó el dominio %{target}"
|
||||||
destroy_ip_block_html: "%{name} eliminó una regla para la IP %{target}"
|
destroy_ip_block_html: "%{name} eliminó una regla para la IP %{target}"
|
||||||
|
destroy_relay_html: "%{name} eliminó el relé %{target}"
|
||||||
destroy_status_html: "%{name} eliminó el estado por %{target}"
|
destroy_status_html: "%{name} eliminó el estado por %{target}"
|
||||||
destroy_unavailable_domain_html: "%{name} reanudó las entregas al dominio %{target}"
|
destroy_unavailable_domain_html: "%{name} reanudó las entregas al dominio %{target}"
|
||||||
destroy_user_role_html: "%{name} eliminó el rol %{target}"
|
destroy_user_role_html: "%{name} eliminó el rol %{target}"
|
||||||
disable_2fa_user_html: "%{name} desactivó el requisito de dos factores para el usuario %{target}"
|
disable_2fa_user_html: "%{name} desactivó el requisito de dos factores para el usuario %{target}"
|
||||||
disable_custom_emoji_html: "%{name} desactivó el emoji %{target}"
|
disable_custom_emoji_html: "%{name} desactivó el emoji %{target}"
|
||||||
|
disable_relay_html: "%{name} desactivó el relé %{target}"
|
||||||
disable_sign_in_token_auth_user_html: "%{name} desactivó la autenticación por token de correo electrónico para %{target}"
|
disable_sign_in_token_auth_user_html: "%{name} desactivó la autenticación por token de correo electrónico para %{target}"
|
||||||
disable_user_html: "%{name} deshabilitó el inicio de sesión para el usuario %{target}"
|
disable_user_html: "%{name} deshabilitó el inicio de sesión para el usuario %{target}"
|
||||||
enable_custom_emoji_html: "%{name} activó el emoji %{target}"
|
enable_custom_emoji_html: "%{name} activó el emoji %{target}"
|
||||||
|
enable_relay_html: "%{name} activó el relé %{target}"
|
||||||
enable_sign_in_token_auth_user_html: "%{name} activó autenticación por token de correo electrónico para %{target}"
|
enable_sign_in_token_auth_user_html: "%{name} activó autenticación por token de correo electrónico para %{target}"
|
||||||
enable_user_html: "%{name} habilitó el inicio de sesión para el usuario %{target}"
|
enable_user_html: "%{name} habilitó el inicio de sesión para el usuario %{target}"
|
||||||
memorialize_account_html: "%{name} convirtió la cuenta de %{target} en una página in memoriam"
|
memorialize_account_html: "%{name} convirtió la cuenta de %{target} en una página in memoriam"
|
||||||
@ -818,8 +826,10 @@ es-MX:
|
|||||||
back_to_account: Volver a la cuenta
|
back_to_account: Volver a la cuenta
|
||||||
back_to_report: Volver a la página de reporte
|
back_to_report: Volver a la página de reporte
|
||||||
batch:
|
batch:
|
||||||
|
add_to_report: 'Añadir al informe #%{id}'
|
||||||
remove_from_report: Eliminar del reporte
|
remove_from_report: Eliminar del reporte
|
||||||
report: Reportar
|
report: Reportar
|
||||||
|
contents: Contenidos
|
||||||
deleted: Eliminado
|
deleted: Eliminado
|
||||||
favourites: Favoritos
|
favourites: Favoritos
|
||||||
history: Historial de versiones
|
history: Historial de versiones
|
||||||
@ -828,13 +838,17 @@ es-MX:
|
|||||||
media:
|
media:
|
||||||
title: Multimedia
|
title: Multimedia
|
||||||
metadata: Metadatos
|
metadata: Metadatos
|
||||||
|
no_history: Esta publicación no ha sido editada
|
||||||
no_status_selected: No se cambió ningún estado al no seleccionar ninguno
|
no_status_selected: No se cambió ningún estado al no seleccionar ninguno
|
||||||
open: Abrir publicación
|
open: Abrir publicación
|
||||||
original_status: Publicación original
|
original_status: Publicación original
|
||||||
reblogs: Impulsos
|
reblogs: Impulsos
|
||||||
|
replied_to_html: Respondió a %{acct_link}
|
||||||
status_changed: Publicación cambiada
|
status_changed: Publicación cambiada
|
||||||
title: Estado de las cuentas - @%{name}
|
status_title: Publicación de @%{name}
|
||||||
|
title: Publicaciones de la cuenta - @%{name}
|
||||||
trending: En tendencia
|
trending: En tendencia
|
||||||
|
view_publicly: Ver públicamente
|
||||||
visibility: Visibilidad
|
visibility: Visibilidad
|
||||||
with_media: Con multimedia
|
with_media: Con multimedia
|
||||||
strikes:
|
strikes:
|
||||||
|
@ -57,7 +57,7 @@ es:
|
|||||||
confirming: Confirmando
|
confirming: Confirmando
|
||||||
custom: Personalizado
|
custom: Personalizado
|
||||||
delete: Eliminar datos
|
delete: Eliminar datos
|
||||||
deleted: Borrado
|
deleted: Eliminado
|
||||||
demote: Degradar
|
demote: Degradar
|
||||||
destroyed_msg: Los datos de %{username} están ahora en cola para ser eliminados inminentemente
|
destroyed_msg: Los datos de %{username} están ahora en cola para ser eliminados inminentemente
|
||||||
disable: Deshabilitar
|
disable: Deshabilitar
|
||||||
@ -116,7 +116,7 @@ es:
|
|||||||
protocol: Protocolo
|
protocol: Protocolo
|
||||||
public: Público
|
public: Público
|
||||||
push_subscription_expires: Expiración de la suscripción PuSH
|
push_subscription_expires: Expiración de la suscripción PuSH
|
||||||
redownload: Refrescar avatar
|
redownload: Refrescar perfil
|
||||||
redownloaded_msg: Se actualizó correctamente el perfil de %{username} desde el origen
|
redownloaded_msg: Se actualizó correctamente el perfil de %{username} desde el origen
|
||||||
reject: Rechazar
|
reject: Rechazar
|
||||||
rejected_msg: La solicitud de registro de %{username} ha sido rechazada con éxito
|
rejected_msg: La solicitud de registro de %{username} ha sido rechazada con éxito
|
||||||
@ -187,6 +187,7 @@ es:
|
|||||||
create_domain_block: Crear Bloqueo de Dominio
|
create_domain_block: Crear Bloqueo de Dominio
|
||||||
create_email_domain_block: Crear Bloqueo de Dominio de Correo Electrónico
|
create_email_domain_block: Crear Bloqueo de Dominio de Correo Electrónico
|
||||||
create_ip_block: Crear regla IP
|
create_ip_block: Crear regla IP
|
||||||
|
create_relay: Crear Relé
|
||||||
create_unavailable_domain: Crear Dominio No Disponible
|
create_unavailable_domain: Crear Dominio No Disponible
|
||||||
create_user_role: Crear Rol
|
create_user_role: Crear Rol
|
||||||
demote_user: Degradar Usuario
|
demote_user: Degradar Usuario
|
||||||
@ -198,14 +199,17 @@ es:
|
|||||||
destroy_email_domain_block: Eliminar Bloqueo de Dominio de Correo Electrónico
|
destroy_email_domain_block: Eliminar Bloqueo de Dominio de Correo Electrónico
|
||||||
destroy_instance: Purgar Dominio
|
destroy_instance: Purgar Dominio
|
||||||
destroy_ip_block: Eliminar regla IP
|
destroy_ip_block: Eliminar regla IP
|
||||||
|
destroy_relay: Eliminar Relé
|
||||||
destroy_status: Eliminar Publicación
|
destroy_status: Eliminar Publicación
|
||||||
destroy_unavailable_domain: Eliminar Dominio No Disponible
|
destroy_unavailable_domain: Eliminar Dominio No Disponible
|
||||||
destroy_user_role: Destruir Rol
|
destroy_user_role: Destruir Rol
|
||||||
disable_2fa_user: Deshabilitar 2FA
|
disable_2fa_user: Deshabilitar 2FA
|
||||||
disable_custom_emoji: Deshabilitar Emoji Personalizado
|
disable_custom_emoji: Deshabilitar Emoji Personalizado
|
||||||
|
disable_relay: Desactivar Relé
|
||||||
disable_sign_in_token_auth_user: Deshabilitar la Autenticación por Token de Correo Electrónico para el Usuario
|
disable_sign_in_token_auth_user: Deshabilitar la Autenticación por Token de Correo Electrónico para el Usuario
|
||||||
disable_user: Deshabilitar Usuario
|
disable_user: Deshabilitar Usuario
|
||||||
enable_custom_emoji: Habilitar Emoji Personalizado
|
enable_custom_emoji: Habilitar Emoji Personalizado
|
||||||
|
enable_relay: Activar Relé
|
||||||
enable_sign_in_token_auth_user: Habilitar la Autenticación por Token de Correo Electrónico para el Usuario
|
enable_sign_in_token_auth_user: Habilitar la Autenticación por Token de Correo Electrónico para el Usuario
|
||||||
enable_user: Habilitar Usuario
|
enable_user: Habilitar Usuario
|
||||||
memorialize_account: Transformar en Cuenta Conmemorativa
|
memorialize_account: Transformar en Cuenta Conmemorativa
|
||||||
@ -247,6 +251,7 @@ es:
|
|||||||
create_domain_block_html: "%{name} bloqueó el dominio %{target}"
|
create_domain_block_html: "%{name} bloqueó el dominio %{target}"
|
||||||
create_email_domain_block_html: "%{name} bloqueó el dominio de correo electrónico %{target}"
|
create_email_domain_block_html: "%{name} bloqueó el dominio de correo electrónico %{target}"
|
||||||
create_ip_block_html: "%{name} creó una regla para la IP %{target}"
|
create_ip_block_html: "%{name} creó una regla para la IP %{target}"
|
||||||
|
create_relay_html: "%{name} creó un relé %{target}"
|
||||||
create_unavailable_domain_html: "%{name} detuvo las entregas al dominio %{target}"
|
create_unavailable_domain_html: "%{name} detuvo las entregas al dominio %{target}"
|
||||||
create_user_role_html: "%{name} creó el rol %{target}"
|
create_user_role_html: "%{name} creó el rol %{target}"
|
||||||
demote_user_html: "%{name} degradó al usuario %{target}"
|
demote_user_html: "%{name} degradó al usuario %{target}"
|
||||||
@ -258,14 +263,17 @@ es:
|
|||||||
destroy_email_domain_block_html: "%{name} desbloqueó el dominio de correo electrónico %{target}"
|
destroy_email_domain_block_html: "%{name} desbloqueó el dominio de correo electrónico %{target}"
|
||||||
destroy_instance_html: "%{name} purgó el dominio %{target}"
|
destroy_instance_html: "%{name} purgó el dominio %{target}"
|
||||||
destroy_ip_block_html: "%{name} eliminó una regla para la IP %{target}"
|
destroy_ip_block_html: "%{name} eliminó una regla para la IP %{target}"
|
||||||
|
destroy_relay_html: "%{name} eliminó el relé %{target}"
|
||||||
destroy_status_html: "%{name} eliminó la publicación de %{target}"
|
destroy_status_html: "%{name} eliminó la publicación de %{target}"
|
||||||
destroy_unavailable_domain_html: "%{name} reanudó las entregas al dominio %{target}"
|
destroy_unavailable_domain_html: "%{name} reanudó las entregas al dominio %{target}"
|
||||||
destroy_user_role_html: "%{name} eliminó el rol %{target}"
|
destroy_user_role_html: "%{name} eliminó el rol %{target}"
|
||||||
disable_2fa_user_html: "%{name} desactivó el requisito de dos factores para el usuario %{target}"
|
disable_2fa_user_html: "%{name} desactivó el requisito de dos factores para el usuario %{target}"
|
||||||
disable_custom_emoji_html: "%{name} desactivó el emoji %{target}"
|
disable_custom_emoji_html: "%{name} desactivó el emoji %{target}"
|
||||||
|
disable_relay_html: "%{name} desactivó el relé %{target}"
|
||||||
disable_sign_in_token_auth_user_html: "%{name} ha deshabilitado la autenticación por token de correo electrónico para %{target}"
|
disable_sign_in_token_auth_user_html: "%{name} ha deshabilitado la autenticación por token de correo electrónico para %{target}"
|
||||||
disable_user_html: "%{name} deshabilitó el inicio de sesión para el usuario %{target}"
|
disable_user_html: "%{name} deshabilitó el inicio de sesión para el usuario %{target}"
|
||||||
enable_custom_emoji_html: "%{name} activó el emoji %{target}"
|
enable_custom_emoji_html: "%{name} activó el emoji %{target}"
|
||||||
|
enable_relay_html: "%{name} activó el relé %{target}"
|
||||||
enable_sign_in_token_auth_user_html: "%{name} ha habilitado la autenticación por token de correo electrónico para %{target}"
|
enable_sign_in_token_auth_user_html: "%{name} ha habilitado la autenticación por token de correo electrónico para %{target}"
|
||||||
enable_user_html: "%{name} habilitó el inicio de sesión para el usuario %{target}"
|
enable_user_html: "%{name} habilitó el inicio de sesión para el usuario %{target}"
|
||||||
memorialize_account_html: "%{name} convirtió la cuenta de %{target} en una página in memoriam"
|
memorialize_account_html: "%{name} convirtió la cuenta de %{target} en una página in memoriam"
|
||||||
@ -566,7 +574,7 @@ es:
|
|||||||
'94670856': 3 años
|
'94670856': 3 años
|
||||||
new:
|
new:
|
||||||
title: Crear nueva regla IP
|
title: Crear nueva regla IP
|
||||||
no_ip_block_selected: No se han cambiado reglas IP ya que no se ha seleccionado ninguna
|
no_ip_block_selected: No se han cambiado reglas IP, ya que no se ha seleccionado ninguna
|
||||||
title: Reglas IP
|
title: Reglas IP
|
||||||
relationships:
|
relationships:
|
||||||
title: Relaciones de %{acct}
|
title: Relaciones de %{acct}
|
||||||
@ -818,8 +826,10 @@ es:
|
|||||||
back_to_account: Volver a la cuenta
|
back_to_account: Volver a la cuenta
|
||||||
back_to_report: Volver a la página del reporte
|
back_to_report: Volver a la página del reporte
|
||||||
batch:
|
batch:
|
||||||
|
add_to_report: 'Añadir al informe #%{id}'
|
||||||
remove_from_report: Eliminar del reporte
|
remove_from_report: Eliminar del reporte
|
||||||
report: Reporte
|
report: Reporte
|
||||||
|
contents: Contenidos
|
||||||
deleted: Eliminado
|
deleted: Eliminado
|
||||||
favourites: Favoritos
|
favourites: Favoritos
|
||||||
history: Historial de versiones
|
history: Historial de versiones
|
||||||
@ -828,13 +838,17 @@ es:
|
|||||||
media:
|
media:
|
||||||
title: Multimedia
|
title: Multimedia
|
||||||
metadata: Metadatos
|
metadata: Metadatos
|
||||||
|
no_history: Esta publicación no ha sido editada
|
||||||
no_status_selected: No se cambió ninguna publicación al no seleccionar ninguna
|
no_status_selected: No se cambió ninguna publicación al no seleccionar ninguna
|
||||||
open: Abrir publicación
|
open: Abrir publicación
|
||||||
original_status: Publicación original
|
original_status: Publicación original
|
||||||
reblogs: Impulsos
|
reblogs: Impulsos
|
||||||
|
replied_to_html: Respondió a %{acct_link}
|
||||||
status_changed: Publicación cambiada
|
status_changed: Publicación cambiada
|
||||||
|
status_title: Publicación de @%{name}
|
||||||
title: Publicaciones de la cuenta - @%{name}
|
title: Publicaciones de la cuenta - @%{name}
|
||||||
trending: En tendencia
|
trending: En tendencia
|
||||||
|
view_publicly: Ver públicamente
|
||||||
visibility: Visibilidad
|
visibility: Visibilidad
|
||||||
with_media: Con multimedia
|
with_media: Con multimedia
|
||||||
strikes:
|
strikes:
|
||||||
@ -910,7 +924,7 @@ es:
|
|||||||
review: Estado de revisión
|
review: Estado de revisión
|
||||||
search: Buscar
|
search: Buscar
|
||||||
title: Etiquetas
|
title: Etiquetas
|
||||||
updated_msg: Hashtags actualizados exitosamente
|
updated_msg: La configuración de etiquetas se actualizó correctamente
|
||||||
title: Administración
|
title: Administración
|
||||||
trends:
|
trends:
|
||||||
allow: Permitir
|
allow: Permitir
|
||||||
@ -1109,7 +1123,7 @@ es:
|
|||||||
didnt_get_confirmation: "¿No recibiste un enlace de confirmación?"
|
didnt_get_confirmation: "¿No recibiste un enlace de confirmación?"
|
||||||
dont_have_your_security_key: "¿No tienes tu clave de seguridad?"
|
dont_have_your_security_key: "¿No tienes tu clave de seguridad?"
|
||||||
forgot_password: "¿Olvidaste tu contraseña?"
|
forgot_password: "¿Olvidaste tu contraseña?"
|
||||||
invalid_reset_password_token: El token de reinicio de contraseña es inválido o expiró. Por favor pide uno nuevo.
|
invalid_reset_password_token: El token de restablecimiento de contraseña no es válido o ha expirado. Por favor solicita uno nuevo.
|
||||||
link_to_otp: Introduce un código de dos factores desde tu teléfono o un código de recuperación
|
link_to_otp: Introduce un código de dos factores desde tu teléfono o un código de recuperación
|
||||||
link_to_webauth: Utilice su dispositivo de clave de seguridad
|
link_to_webauth: Utilice su dispositivo de clave de seguridad
|
||||||
log_in_with: Iniciar sesión con
|
log_in_with: Iniciar sesión con
|
||||||
@ -1258,7 +1272,7 @@ es:
|
|||||||
'422':
|
'422':
|
||||||
content: Verificación de seguridad fallida. ¿Estás bloqueando algunas cookies?
|
content: Verificación de seguridad fallida. ¿Estás bloqueando algunas cookies?
|
||||||
title: Verificación de seguridad fallida
|
title: Verificación de seguridad fallida
|
||||||
'429': Asfixiado
|
'429': Demasiadas solicitudes
|
||||||
'500':
|
'500':
|
||||||
content: Lo sentimos, algo ha funcionado mal por nuestra parte.
|
content: Lo sentimos, algo ha funcionado mal por nuestra parte.
|
||||||
title: Esta página no es correcta
|
title: Esta página no es correcta
|
||||||
@ -1446,7 +1460,7 @@ es:
|
|||||||
'604800': 1 semana
|
'604800': 1 semana
|
||||||
'86400': 1 día
|
'86400': 1 día
|
||||||
expires_in_prompt: Nunca
|
expires_in_prompt: Nunca
|
||||||
generate: Generar
|
generate: Generar enlace de invitación
|
||||||
invalid: Esta invitación no es válida
|
invalid: Esta invitación no es válida
|
||||||
invited_by: 'Fuiste invitado por:'
|
invited_by: 'Fuiste invitado por:'
|
||||||
max_uses:
|
max_uses:
|
||||||
@ -1489,12 +1503,12 @@ es:
|
|||||||
title: Cancelar suscripición
|
title: Cancelar suscripición
|
||||||
media_attachments:
|
media_attachments:
|
||||||
validations:
|
validations:
|
||||||
images_and_video: No se puede adjuntar un video a unapublicación que ya contenga imágenes
|
images_and_video: No se puede adjuntar un video a una publicación que ya contenga imágenes
|
||||||
not_found: Archivos multimedia %{ids} no encontrados, o ya se encuentran adjuntos a otra publicación
|
not_found: Archivos multimedia %{ids} no encontrados, o ya se encuentran adjuntos a otra publicación
|
||||||
not_ready: No se pueden adjuntar archivos que no se han terminado de procesar. ¡Inténtalo de nuevo en un momento!
|
not_ready: No se pueden adjuntar archivos que no se han terminado de procesar. ¡Inténtalo de nuevo en un momento!
|
||||||
too_many: No se pueden adjuntar más de 4 archivos
|
too_many: No se pueden adjuntar más de 4 archivos
|
||||||
migrations:
|
migrations:
|
||||||
acct: username@domain de la nueva cuenta
|
acct: Movido a
|
||||||
cancel: Cancelar redireccionamiento
|
cancel: Cancelar redireccionamiento
|
||||||
cancel_explanation: Al cancelar el redireccionamiento se reactivará tu cuenta actual, pero no recuperarás los seguidores que hayan sido trasladados a la otra cuenta.
|
cancel_explanation: Al cancelar el redireccionamiento se reactivará tu cuenta actual, pero no recuperarás los seguidores que hayan sido trasladados a la otra cuenta.
|
||||||
cancelled_msg: El redireccionamiento se ha cancelado correctamente.
|
cancelled_msg: El redireccionamiento se ha cancelado correctamente.
|
||||||
@ -1729,7 +1743,7 @@ es:
|
|||||||
migrate: Migración de cuenta
|
migrate: Migración de cuenta
|
||||||
notifications: Notificaciones por correo electrónico
|
notifications: Notificaciones por correo electrónico
|
||||||
preferences: Preferencias
|
preferences: Preferencias
|
||||||
profile: Perfil
|
profile: Perfil público
|
||||||
relationships: Siguiendo y seguidores
|
relationships: Siguiendo y seguidores
|
||||||
severed_relationships: Relaciones cortadas
|
severed_relationships: Relaciones cortadas
|
||||||
statuses_cleanup: Eliminación automática de publicaciones
|
statuses_cleanup: Eliminación automática de publicaciones
|
||||||
@ -1773,11 +1787,11 @@ es:
|
|||||||
direct: Las publicaciones que son visibles solo para los usuarios mencionados no pueden fijarse
|
direct: Las publicaciones que son visibles solo para los usuarios mencionados no pueden fijarse
|
||||||
limit: Ya has fijado el número máximo de publicaciones
|
limit: Ya has fijado el número máximo de publicaciones
|
||||||
ownership: La publicación de otra persona no puede fijarse
|
ownership: La publicación de otra persona no puede fijarse
|
||||||
reblog: Un boost no puede fijarse
|
reblog: Una publicación impulsada no puede fijarse
|
||||||
title: "%{name}: «%{quote}»"
|
title: "%{name}: «%{quote}»"
|
||||||
visibilities:
|
visibilities:
|
||||||
direct: Directa
|
direct: Directa
|
||||||
private: Sólo mostrar a seguidores
|
private: Solo seguidores
|
||||||
private_long: Solo mostrar a tus seguidores
|
private_long: Solo mostrar a tus seguidores
|
||||||
public: Pública
|
public: Pública
|
||||||
public_long: Todos pueden ver
|
public_long: Todos pueden ver
|
||||||
@ -1826,8 +1840,8 @@ es:
|
|||||||
tags:
|
tags:
|
||||||
does_not_match_previous_name: no coincide con el nombre anterior
|
does_not_match_previous_name: no coincide con el nombre anterior
|
||||||
themes:
|
themes:
|
||||||
contrast: Alto contraste
|
contrast: Mastodon (alto contraste)
|
||||||
default: Mastodon
|
default: Mastodon (oscuro)
|
||||||
mastodon-light: Mastodon (claro)
|
mastodon-light: Mastodon (claro)
|
||||||
system: Automático (usar tema del sistema)
|
system: Automático (usar tema del sistema)
|
||||||
time:
|
time:
|
||||||
@ -1847,7 +1861,7 @@ es:
|
|||||||
edit: Editar
|
edit: Editar
|
||||||
enabled: La autenticación de dos factores está activada
|
enabled: La autenticación de dos factores está activada
|
||||||
enabled_success: Verificación de dos factores activada exitosamente
|
enabled_success: Verificación de dos factores activada exitosamente
|
||||||
generate_recovery_codes: generar códigos de recuperación
|
generate_recovery_codes: Generar códigos de recuperación
|
||||||
lost_recovery_codes: Los códigos de recuperación te permiten obtener acceso a tu cuenta si pierdes tu teléfono. Si has perdido tus códigos de recuperación, puedes regenerarlos aquí. Tus viejos códigos de recuperación se harán inválidos.
|
lost_recovery_codes: Los códigos de recuperación te permiten obtener acceso a tu cuenta si pierdes tu teléfono. Si has perdido tus códigos de recuperación, puedes regenerarlos aquí. Tus viejos códigos de recuperación se harán inválidos.
|
||||||
methods: Métodos de autenticación de doble factor
|
methods: Métodos de autenticación de doble factor
|
||||||
otp: Aplicación de autenticación
|
otp: Aplicación de autenticación
|
||||||
|
@ -833,7 +833,6 @@ et:
|
|||||||
original_status: Algne postitus
|
original_status: Algne postitus
|
||||||
reblogs: Jagamised
|
reblogs: Jagamised
|
||||||
status_changed: Muudetud postitus
|
status_changed: Muudetud postitus
|
||||||
title: Konto postitused - @%{name}
|
|
||||||
trending: Populaarne
|
trending: Populaarne
|
||||||
visibility: Nähtavus
|
visibility: Nähtavus
|
||||||
with_media: Meediaga
|
with_media: Meediaga
|
||||||
|
@ -793,7 +793,6 @@ eu:
|
|||||||
original_status: Jatorrizko bidalketa
|
original_status: Jatorrizko bidalketa
|
||||||
reblogs: Bultzadak
|
reblogs: Bultzadak
|
||||||
status_changed: Bidalketa aldatuta
|
status_changed: Bidalketa aldatuta
|
||||||
title: Kontuaren bidalketak - @%{name}
|
|
||||||
trending: Joera
|
trending: Joera
|
||||||
visibility: Ikusgaitasuna
|
visibility: Ikusgaitasuna
|
||||||
with_media: Multimediarekin
|
with_media: Multimediarekin
|
||||||
|
@ -741,7 +741,6 @@ fa:
|
|||||||
original_status: فرستهٔ اصلی
|
original_status: فرستهٔ اصلی
|
||||||
reblogs: تقویتها
|
reblogs: تقویتها
|
||||||
status_changed: فرسته تغییر کرد
|
status_changed: فرسته تغییر کرد
|
||||||
title: "@%{name} - نوشتههای حساب"
|
|
||||||
trending: پرطرفدار
|
trending: پرطرفدار
|
||||||
visibility: نمایانی
|
visibility: نمایانی
|
||||||
with_media: دارای عکس یا ویدیو
|
with_media: دارای عکس یا ویدیو
|
||||||
|
@ -826,8 +826,10 @@ fi:
|
|||||||
back_to_account: Takaisin tilin sivulle
|
back_to_account: Takaisin tilin sivulle
|
||||||
back_to_report: Takaisin raporttisivulle
|
back_to_report: Takaisin raporttisivulle
|
||||||
batch:
|
batch:
|
||||||
|
add_to_report: Lisää raporttiin nro %{id}
|
||||||
remove_from_report: Poista raportista
|
remove_from_report: Poista raportista
|
||||||
report: Raportti
|
report: Raportti
|
||||||
|
contents: Sisältö
|
||||||
deleted: Poistettu
|
deleted: Poistettu
|
||||||
favourites: Suosikit
|
favourites: Suosikit
|
||||||
history: Versiohistoria
|
history: Versiohistoria
|
||||||
@ -836,13 +838,17 @@ fi:
|
|||||||
media:
|
media:
|
||||||
title: Media
|
title: Media
|
||||||
metadata: Metadata
|
metadata: Metadata
|
||||||
|
no_history: Tätä julkaisua ei ole muokattu
|
||||||
no_status_selected: Julkaisuja ei muutettu, koska yhtään ei ollut valittuna
|
no_status_selected: Julkaisuja ei muutettu, koska yhtään ei ollut valittuna
|
||||||
open: Avaa julkaisu
|
open: Avaa julkaisu
|
||||||
original_status: Alkuperäinen julkaisu
|
original_status: Alkuperäinen julkaisu
|
||||||
reblogs: Edelleen jako
|
reblogs: Edelleen jako
|
||||||
|
replied_to_html: Vastaus käyttäjälle %{acct_link}
|
||||||
status_changed: Julkaisua muutettu
|
status_changed: Julkaisua muutettu
|
||||||
title: Tilin tilat - @%{name}
|
status_title: Julkaisu käyttäjältä @%{name}
|
||||||
|
title: Tilin julkaisut - @%{name}
|
||||||
trending: Suosituttua
|
trending: Suosituttua
|
||||||
|
view_publicly: Näytä julkisesti
|
||||||
visibility: Näkyvyys
|
visibility: Näkyvyys
|
||||||
with_media: Sisältää mediaa
|
with_media: Sisältää mediaa
|
||||||
strikes:
|
strikes:
|
||||||
|
@ -826,8 +826,10 @@ fo:
|
|||||||
back_to_account: Aftur til kontusíðu
|
back_to_account: Aftur til kontusíðu
|
||||||
back_to_report: Aftur til meldingarsíðu
|
back_to_report: Aftur til meldingarsíðu
|
||||||
batch:
|
batch:
|
||||||
|
add_to_report: 'Legg afturat melding #%{id}'
|
||||||
remove_from_report: Strika frá melding
|
remove_from_report: Strika frá melding
|
||||||
report: Melding
|
report: Melding
|
||||||
|
contents: Innihald
|
||||||
deleted: Strikað
|
deleted: Strikað
|
||||||
favourites: Dámdir postar
|
favourites: Dámdir postar
|
||||||
history: Útgávusøga
|
history: Útgávusøga
|
||||||
@ -836,13 +838,17 @@ fo:
|
|||||||
media:
|
media:
|
||||||
title: Miðlar
|
title: Miðlar
|
||||||
metadata: Metadátur
|
metadata: Metadátur
|
||||||
|
no_history: Hesin posturin er ikki broyttur
|
||||||
no_status_selected: Eingir postar vóru broyttir, tí eingir vóru valdir
|
no_status_selected: Eingir postar vóru broyttir, tí eingir vóru valdir
|
||||||
open: Lat post upp
|
open: Lat post upp
|
||||||
original_status: Upprunapostur
|
original_status: Upprunapostur
|
||||||
reblogs: Endurbloggar
|
reblogs: Endurbloggar
|
||||||
|
replied_to_html: Svaraði %{acct_link}
|
||||||
status_changed: Postur broyttur
|
status_changed: Postur broyttur
|
||||||
title: Postar hjá kontu - @%{name}
|
status_title: Postar hjá @%{name}
|
||||||
|
title: Kontupostar - @%{name}
|
||||||
trending: Vælumtókt
|
trending: Vælumtókt
|
||||||
|
view_publicly: Vís fyri øllum
|
||||||
visibility: Sýni
|
visibility: Sýni
|
||||||
with_media: Við miðli
|
with_media: Við miðli
|
||||||
strikes:
|
strikes:
|
||||||
|
@ -836,7 +836,6 @@ fr-CA:
|
|||||||
original_status: Message original
|
original_status: Message original
|
||||||
reblogs: Partages
|
reblogs: Partages
|
||||||
status_changed: Publication modifiée
|
status_changed: Publication modifiée
|
||||||
title: Messages du compte - @%{name}
|
|
||||||
trending: Tendances
|
trending: Tendances
|
||||||
visibility: Visibilité
|
visibility: Visibilité
|
||||||
with_media: Avec médias
|
with_media: Avec médias
|
||||||
|
@ -836,7 +836,6 @@ fr:
|
|||||||
original_status: Message original
|
original_status: Message original
|
||||||
reblogs: Partages
|
reblogs: Partages
|
||||||
status_changed: Publication modifiée
|
status_changed: Publication modifiée
|
||||||
title: Messages du compte - @%{name}
|
|
||||||
trending: Tendances
|
trending: Tendances
|
||||||
visibility: Visibilité
|
visibility: Visibilité
|
||||||
with_media: Avec médias
|
with_media: Avec médias
|
||||||
|
@ -833,7 +833,6 @@ fy:
|
|||||||
original_status: Oarspronklik berjocht
|
original_status: Oarspronklik berjocht
|
||||||
reblogs: Boosts
|
reblogs: Boosts
|
||||||
status_changed: Berjocht wizige
|
status_changed: Berjocht wizige
|
||||||
title: Accountberjochten - @%{name}
|
|
||||||
trending: Trending
|
trending: Trending
|
||||||
visibility: Sichtberheid
|
visibility: Sichtberheid
|
||||||
with_media: Mei media
|
with_media: Mei media
|
||||||
|
@ -196,6 +196,7 @@ ga:
|
|||||||
create_domain_block: Cruthaigh Bloc Fearainn
|
create_domain_block: Cruthaigh Bloc Fearainn
|
||||||
create_email_domain_block: Cruthaigh Bloc Fearainn Ríomhphoist
|
create_email_domain_block: Cruthaigh Bloc Fearainn Ríomhphoist
|
||||||
create_ip_block: Cruthaigh riail IP
|
create_ip_block: Cruthaigh riail IP
|
||||||
|
create_relay: Cruthaigh Leaschraolacháin
|
||||||
create_unavailable_domain: Cruthaigh Fearann Gan Fáil
|
create_unavailable_domain: Cruthaigh Fearann Gan Fáil
|
||||||
create_user_role: Cruthaigh Ról
|
create_user_role: Cruthaigh Ról
|
||||||
demote_user: Ísligh úsáideoir
|
demote_user: Ísligh úsáideoir
|
||||||
@ -207,14 +208,17 @@ ga:
|
|||||||
destroy_email_domain_block: Scrios Bloc Fearainn Ríomhphoist
|
destroy_email_domain_block: Scrios Bloc Fearainn Ríomhphoist
|
||||||
destroy_instance: Fearann Purge
|
destroy_instance: Fearann Purge
|
||||||
destroy_ip_block: Scrios riail IP
|
destroy_ip_block: Scrios riail IP
|
||||||
|
destroy_relay: Scrios Leaschraolacháin
|
||||||
destroy_status: Scrios Postáil
|
destroy_status: Scrios Postáil
|
||||||
destroy_unavailable_domain: Scrios Fearann Gan Fáil
|
destroy_unavailable_domain: Scrios Fearann Gan Fáil
|
||||||
destroy_user_role: Scrios ról
|
destroy_user_role: Scrios ról
|
||||||
disable_2fa_user: Díchumasaigh 2FA
|
disable_2fa_user: Díchumasaigh 2FA
|
||||||
disable_custom_emoji: Díchumasaigh Emoji Saincheaptha
|
disable_custom_emoji: Díchumasaigh Emoji Saincheaptha
|
||||||
|
disable_relay: Díchumasaigh Leaschraolacháin
|
||||||
disable_sign_in_token_auth_user: Díchumasaigh Fíordheimhniú Comhartha Ríomhphoist don Úsáideoir
|
disable_sign_in_token_auth_user: Díchumasaigh Fíordheimhniú Comhartha Ríomhphoist don Úsáideoir
|
||||||
disable_user: Díchumasaigh Úsáideoir
|
disable_user: Díchumasaigh Úsáideoir
|
||||||
enable_custom_emoji: Cumasaigh Emoji Saincheaptha
|
enable_custom_emoji: Cumasaigh Emoji Saincheaptha
|
||||||
|
enable_relay: Cumasaigh Leaschraolacháin
|
||||||
enable_sign_in_token_auth_user: Cumasaigh Fíordheimhniú Comhartha Ríomhphoist don Úsáideoir
|
enable_sign_in_token_auth_user: Cumasaigh Fíordheimhniú Comhartha Ríomhphoist don Úsáideoir
|
||||||
enable_user: Cumasaigh Úsáideoir
|
enable_user: Cumasaigh Úsáideoir
|
||||||
memorialize_account: Cuntas Cuimhneacháin
|
memorialize_account: Cuntas Cuimhneacháin
|
||||||
@ -256,6 +260,7 @@ ga:
|
|||||||
create_domain_block_html: "%{name} fearann bactha %{target}"
|
create_domain_block_html: "%{name} fearann bactha %{target}"
|
||||||
create_email_domain_block_html: Chuir %{name} fearann ríomhphoist bactha %{target}
|
create_email_domain_block_html: Chuir %{name} fearann ríomhphoist bactha %{target}
|
||||||
create_ip_block_html: Chruthaigh %{name} riail don IP %{target}
|
create_ip_block_html: Chruthaigh %{name} riail don IP %{target}
|
||||||
|
create_relay_html: Chruthaigh %{name} athsheoladh %{target}
|
||||||
create_unavailable_domain_html: Chuir %{name} deireadh leis an seachadadh chuig fearann %{target}
|
create_unavailable_domain_html: Chuir %{name} deireadh leis an seachadadh chuig fearann %{target}
|
||||||
create_user_role_html: Chruthaigh %{name} %{target} ról
|
create_user_role_html: Chruthaigh %{name} %{target} ról
|
||||||
demote_user_html: "%{name} úsáideoir scriosta %{target}"
|
demote_user_html: "%{name} úsáideoir scriosta %{target}"
|
||||||
@ -267,14 +272,17 @@ ga:
|
|||||||
destroy_email_domain_block_html: "%{name} fearann ríomhphoist díchoiscthe %{target}"
|
destroy_email_domain_block_html: "%{name} fearann ríomhphoist díchoiscthe %{target}"
|
||||||
destroy_instance_html: Glanadh %{name} fearann %{target}
|
destroy_instance_html: Glanadh %{name} fearann %{target}
|
||||||
destroy_ip_block_html: "%{name} scriosta riail le haghaidh IP %{target}"
|
destroy_ip_block_html: "%{name} scriosta riail le haghaidh IP %{target}"
|
||||||
|
destroy_relay_html: Scrios %{name} an athsheoladh %{target}
|
||||||
destroy_status_html: Bhain %{name} postáil le %{target}
|
destroy_status_html: Bhain %{name} postáil le %{target}
|
||||||
destroy_unavailable_domain_html: D'athchrom %{name} ar an seachadadh chuig fearann %{target}
|
destroy_unavailable_domain_html: D'athchrom %{name} ar an seachadadh chuig fearann %{target}
|
||||||
destroy_user_role_html: Scrios %{name} ról %{target}
|
destroy_user_role_html: Scrios %{name} ról %{target}
|
||||||
disable_2fa_user_html: Dhíchumasaigh %{name} riachtanas dhá fhachtóir don úsáideoir %{target}
|
disable_2fa_user_html: Dhíchumasaigh %{name} riachtanas dhá fhachtóir don úsáideoir %{target}
|
||||||
disable_custom_emoji_html: Dhíchumasaigh %{name} emoji %{target}
|
disable_custom_emoji_html: Dhíchumasaigh %{name} emoji %{target}
|
||||||
|
disable_relay_html: Dhíchumasaigh %{name} an athsheoladh %{target}
|
||||||
disable_sign_in_token_auth_user_html: Dhíchumasaigh %{name} fíordheimhniú comhartha ríomhphoist le haghaidh %{target}
|
disable_sign_in_token_auth_user_html: Dhíchumasaigh %{name} fíordheimhniú comhartha ríomhphoist le haghaidh %{target}
|
||||||
disable_user_html: "%{name} logáil isteach díchumasaithe d'úsáideoir %{target}"
|
disable_user_html: "%{name} logáil isteach díchumasaithe d'úsáideoir %{target}"
|
||||||
enable_custom_emoji_html: "%{name} emoji cumasaithe %{target}"
|
enable_custom_emoji_html: "%{name} emoji cumasaithe %{target}"
|
||||||
|
enable_relay_html: Chuir %{name} an sealaíocht %{target} ar chumas
|
||||||
enable_sign_in_token_auth_user_html: Chuir %{name} fíordheimhniú comhartha ríomhphoist ar chumas %{target}
|
enable_sign_in_token_auth_user_html: Chuir %{name} fíordheimhniú comhartha ríomhphoist ar chumas %{target}
|
||||||
enable_user_html: "%{name} logáil isteach cumasaithe don úsáideoir %{target}"
|
enable_user_html: "%{name} logáil isteach cumasaithe don úsáideoir %{target}"
|
||||||
memorialize_account_html: Rinne %{name} cuntas %{target} a iompú ina leathanach cuimhneacháin
|
memorialize_account_html: Rinne %{name} cuntas %{target} a iompú ina leathanach cuimhneacháin
|
||||||
@ -860,8 +868,10 @@ ga:
|
|||||||
back_to_account: Ar ais go leathanach cuntais
|
back_to_account: Ar ais go leathanach cuntais
|
||||||
back_to_report: Ar ais go leathanach tuairisce
|
back_to_report: Ar ais go leathanach tuairisce
|
||||||
batch:
|
batch:
|
||||||
|
add_to_report: 'Cuir leis an tuairisc # %{id}'
|
||||||
remove_from_report: Bain den tuairisc
|
remove_from_report: Bain den tuairisc
|
||||||
report: Tuairisc
|
report: Tuairisc
|
||||||
|
contents: Ábhar
|
||||||
deleted: Scriosta
|
deleted: Scriosta
|
||||||
favourites: Toghanna
|
favourites: Toghanna
|
||||||
history: Stair leagan
|
history: Stair leagan
|
||||||
@ -870,13 +880,17 @@ ga:
|
|||||||
media:
|
media:
|
||||||
title: Meáin
|
title: Meáin
|
||||||
metadata: Meiteashonraí
|
metadata: Meiteashonraí
|
||||||
|
no_history: Níl an postáil seo curtha in eagar
|
||||||
no_status_selected: Níor athraíodh aon phostáil mar níor roghnaíodh ceann ar bith
|
no_status_selected: Níor athraíodh aon phostáil mar níor roghnaíodh ceann ar bith
|
||||||
open: Oscail postáil
|
open: Oscail postáil
|
||||||
original_status: Bunphostáil
|
original_status: Bunphostáil
|
||||||
reblogs: Athbhlaganna
|
reblogs: Athbhlaganna
|
||||||
|
replied_to_html: D'fhreagair %{acct_link}
|
||||||
status_changed: Athraíodh postáil
|
status_changed: Athraíodh postáil
|
||||||
title: Poist chuntais - @%{name}
|
status_title: Postáil le @ %{name}
|
||||||
|
title: Postálacha cuntais - @%{name}
|
||||||
trending: Ag treochtáil
|
trending: Ag treochtáil
|
||||||
|
view_publicly: Féach go poiblí
|
||||||
visibility: Infheictheacht
|
visibility: Infheictheacht
|
||||||
with_media: Le meáin
|
with_media: Le meáin
|
||||||
strikes:
|
strikes:
|
||||||
|
@ -861,7 +861,6 @@ gd:
|
|||||||
original_status: Am post tùsail
|
original_status: Am post tùsail
|
||||||
reblogs: Brosnachaidhean
|
reblogs: Brosnachaidhean
|
||||||
status_changed: Post air atharrachadh
|
status_changed: Post air atharrachadh
|
||||||
title: Postaichean a’ chunntais - @%{name}
|
|
||||||
trending: A’ treandadh
|
trending: A’ treandadh
|
||||||
visibility: Faicsinneachd
|
visibility: Faicsinneachd
|
||||||
with_media: Le meadhanan riutha
|
with_media: Le meadhanan riutha
|
||||||
|
@ -826,8 +826,10 @@ gl:
|
|||||||
back_to_account: Volver a páxina da conta
|
back_to_account: Volver a páxina da conta
|
||||||
back_to_report: Volver a denuncias
|
back_to_report: Volver a denuncias
|
||||||
batch:
|
batch:
|
||||||
|
add_to_report: 'Engadir á denuncia #%{id}'
|
||||||
remove_from_report: Eliminar da denuncia
|
remove_from_report: Eliminar da denuncia
|
||||||
report: Denuncia
|
report: Denuncia
|
||||||
|
contents: Contidos
|
||||||
deleted: Eliminado
|
deleted: Eliminado
|
||||||
favourites: Favoritas
|
favourites: Favoritas
|
||||||
history: Historial de versións
|
history: Historial de versións
|
||||||
@ -836,13 +838,17 @@ gl:
|
|||||||
media:
|
media:
|
||||||
title: Medios
|
title: Medios
|
||||||
metadata: Metadatos
|
metadata: Metadatos
|
||||||
|
no_history: Esta publicación foi editada
|
||||||
no_status_selected: Non se cambiou ningunha publicación xa que ningunha foi seleccionada
|
no_status_selected: Non se cambiou ningunha publicación xa que ningunha foi seleccionada
|
||||||
open: Abrir publicación
|
open: Abrir publicación
|
||||||
original_status: Publicación orixinal
|
original_status: Publicación orixinal
|
||||||
reblogs: Promocións
|
reblogs: Promocións
|
||||||
|
replied_to_html: Respondeu a %{acct_link}
|
||||||
status_changed: Publicación editada
|
status_changed: Publicación editada
|
||||||
|
status_title: Publicación de @%{name}
|
||||||
title: Publicacións da conta - @%{name}
|
title: Publicacións da conta - @%{name}
|
||||||
trending: Popular
|
trending: Popular
|
||||||
|
view_publicly: Ver publicamente
|
||||||
visibility: Visibilidade
|
visibility: Visibilidade
|
||||||
with_media: con medios
|
with_media: con medios
|
||||||
strikes:
|
strikes:
|
||||||
|
@ -193,6 +193,7 @@ he:
|
|||||||
create_domain_block: יצירת דומיין חסום
|
create_domain_block: יצירת דומיין חסום
|
||||||
create_email_domain_block: יצירת חסימת דומיין דוא"ל
|
create_email_domain_block: יצירת חסימת דומיין דוא"ל
|
||||||
create_ip_block: יצירת כלל IP
|
create_ip_block: יצירת כלל IP
|
||||||
|
create_relay: יצירת ממסר
|
||||||
create_unavailable_domain: יצירת דומיין בלתי זמין
|
create_unavailable_domain: יצירת דומיין בלתי זמין
|
||||||
create_user_role: יצירת תפקיד
|
create_user_role: יצירת תפקיד
|
||||||
demote_user: הורדת משתמש בדרגה
|
demote_user: הורדת משתמש בדרגה
|
||||||
@ -204,14 +205,17 @@ he:
|
|||||||
destroy_email_domain_block: מחיקת חסימת דומיין דוא"ל
|
destroy_email_domain_block: מחיקת חסימת דומיין דוא"ל
|
||||||
destroy_instance: טיהור דומיין
|
destroy_instance: טיהור דומיין
|
||||||
destroy_ip_block: מחיקת כלל IP
|
destroy_ip_block: מחיקת כלל IP
|
||||||
|
destroy_relay: מחיקת ממסר
|
||||||
destroy_status: מחיקת הודעה
|
destroy_status: מחיקת הודעה
|
||||||
destroy_unavailable_domain: מחיקת דומיין בלתי זמין
|
destroy_unavailable_domain: מחיקת דומיין בלתי זמין
|
||||||
destroy_user_role: מחיקת תפקיד
|
destroy_user_role: מחיקת תפקיד
|
||||||
disable_2fa_user: השעיית זיהוי דו-גורמי
|
disable_2fa_user: השעיית זיהוי דו-גורמי
|
||||||
disable_custom_emoji: השעיית אמוג'י מיוחד
|
disable_custom_emoji: השעיית אמוג'י מיוחד
|
||||||
|
disable_relay: השבתת ממסר
|
||||||
disable_sign_in_token_auth_user: השעיית אסימון הזדהות בדוא"ל של משתמש
|
disable_sign_in_token_auth_user: השעיית אסימון הזדהות בדוא"ל של משתמש
|
||||||
disable_user: השעיית משתמש
|
disable_user: השעיית משתמש
|
||||||
enable_custom_emoji: הפעלת אמוג'י מיוחד
|
enable_custom_emoji: הפעלת אמוג'י מיוחד
|
||||||
|
enable_relay: החייאת ממסר
|
||||||
enable_sign_in_token_auth_user: הפעלת אסימון הזדהות בדוא"ל של משתמש
|
enable_sign_in_token_auth_user: הפעלת אסימון הזדהות בדוא"ל של משתמש
|
||||||
enable_user: אפשור משתמש
|
enable_user: אפשור משתמש
|
||||||
memorialize_account: הנצחת חשבון
|
memorialize_account: הנצחת חשבון
|
||||||
@ -253,6 +257,7 @@ he:
|
|||||||
create_domain_block_html: "%{name} חסם/ה את הדומיין %{target}"
|
create_domain_block_html: "%{name} חסם/ה את הדומיין %{target}"
|
||||||
create_email_domain_block_html: '%{name} חסם/ה את דומיין הדוא"ל %{target}'
|
create_email_domain_block_html: '%{name} חסם/ה את דומיין הדוא"ל %{target}'
|
||||||
create_ip_block_html: "%{name} יצר/ה כלל עבור IP %{target}"
|
create_ip_block_html: "%{name} יצר/ה כלל עבור IP %{target}"
|
||||||
|
create_relay_html: "%{name} יצרו את הממסר %{target}"
|
||||||
create_unavailable_domain_html: "%{name} הפסיק/ה משלוח לדומיין %{target}"
|
create_unavailable_domain_html: "%{name} הפסיק/ה משלוח לדומיין %{target}"
|
||||||
create_user_role_html: "%{name} יצר את התפקיד של %{target}"
|
create_user_role_html: "%{name} יצר את התפקיד של %{target}"
|
||||||
demote_user_html: "%{name} הוריד/ה בדרגה את המשתמש %{target}"
|
demote_user_html: "%{name} הוריד/ה בדרגה את המשתמש %{target}"
|
||||||
@ -264,14 +269,17 @@ he:
|
|||||||
destroy_email_domain_block_html: '%{name} הסיר/ה חסימה מדומיין הדוא"ל %{target}'
|
destroy_email_domain_block_html: '%{name} הסיר/ה חסימה מדומיין הדוא"ל %{target}'
|
||||||
destroy_instance_html: "%{name} טיהר/ה את הדומיין %{target}"
|
destroy_instance_html: "%{name} טיהר/ה את הדומיין %{target}"
|
||||||
destroy_ip_block_html: "%{name} מחק/ה את הכלל עבור IP %{target}"
|
destroy_ip_block_html: "%{name} מחק/ה את הכלל עבור IP %{target}"
|
||||||
|
destroy_relay_html: "%{name} מחקו את הממסר %{target}"
|
||||||
destroy_status_html: ההודעה של %{target} הוסרה ע"י %{name}
|
destroy_status_html: ההודעה של %{target} הוסרה ע"י %{name}
|
||||||
destroy_unavailable_domain_html: "%{name} התחיל/ה מחדש משלוח לדומיין %{target}"
|
destroy_unavailable_domain_html: "%{name} התחיל/ה מחדש משלוח לדומיין %{target}"
|
||||||
destroy_user_role_html: "%{name} ביטל את התפקיד של %{target}"
|
destroy_user_role_html: "%{name} ביטל את התפקיד של %{target}"
|
||||||
disable_2fa_user_html: "%{name} ביטל/ה את הדרישה לאימות דו-גורמי למשתמש %{target}"
|
disable_2fa_user_html: "%{name} ביטל/ה את הדרישה לאימות דו-גורמי למשתמש %{target}"
|
||||||
disable_custom_emoji_html: "%{name} השבית/ה את האמוג'י %{target}"
|
disable_custom_emoji_html: "%{name} השבית/ה את האמוג'י %{target}"
|
||||||
|
disable_relay_html: "%{name} השביתו את הממסר %{target}"
|
||||||
disable_sign_in_token_auth_user_html: '%{name} השבית/ה את האימות בעזרת אסימון דוא"ל עבור %{target}'
|
disable_sign_in_token_auth_user_html: '%{name} השבית/ה את האימות בעזרת אסימון דוא"ל עבור %{target}'
|
||||||
disable_user_html: "%{name} חסם/ה כניסה מהמשתמש/ת %{target}"
|
disable_user_html: "%{name} חסם/ה כניסה מהמשתמש/ת %{target}"
|
||||||
enable_custom_emoji_html: "%{name} אפשר/ה את האמוג'י %{target}"
|
enable_custom_emoji_html: "%{name} אפשר/ה את האמוג'י %{target}"
|
||||||
|
enable_relay_html: "%{name} החיו את הממסר %{target}"
|
||||||
enable_sign_in_token_auth_user_html: '%{name} אפשר/ה אימות בעזרת אסימון דוא"ל עבור %{target}'
|
enable_sign_in_token_auth_user_html: '%{name} אפשר/ה אימות בעזרת אסימון דוא"ל עבור %{target}'
|
||||||
enable_user_html: "%{name} אפשר/ה כניסה עבור המשתמש %{target}"
|
enable_user_html: "%{name} אפשר/ה כניסה עבור המשתמש %{target}"
|
||||||
memorialize_account_html: "%{name} הפך/ה את חשבונו של %{target} לדף הנצחה"
|
memorialize_account_html: "%{name} הפך/ה את חשבונו של %{target} לדף הנצחה"
|
||||||
@ -846,8 +854,10 @@ he:
|
|||||||
back_to_account: חזרה לדף החשבון
|
back_to_account: חזרה לדף החשבון
|
||||||
back_to_report: חזרה לעמוד הדיווח
|
back_to_report: חזרה לעמוד הדיווח
|
||||||
batch:
|
batch:
|
||||||
|
add_to_report: להוסיף לדו"ח מספר %{id}
|
||||||
remove_from_report: הסרה מהדיווח
|
remove_from_report: הסרה מהדיווח
|
||||||
report: דווח
|
report: דווח
|
||||||
|
contents: תוכן
|
||||||
deleted: מחוקים
|
deleted: מחוקים
|
||||||
favourites: חיבובים
|
favourites: חיבובים
|
||||||
history: היסטורית גרסאות
|
history: היסטורית גרסאות
|
||||||
@ -856,13 +866,17 @@ he:
|
|||||||
media:
|
media:
|
||||||
title: מדיה
|
title: מדיה
|
||||||
metadata: נתוני-מטא
|
metadata: נתוני-מטא
|
||||||
|
no_history: הודעה זו לא נערכה
|
||||||
no_status_selected: לא בוצעו שינויים בהודעות שכן לא נבחרו כאלו
|
no_status_selected: לא בוצעו שינויים בהודעות שכן לא נבחרו כאלו
|
||||||
open: פתח הודעה
|
open: פתח הודעה
|
||||||
original_status: הודעה מקורית
|
original_status: הודעה מקורית
|
||||||
reblogs: שיתופים
|
reblogs: שיתופים
|
||||||
|
replied_to_html: בתגובה לחשבון %{acct_link}
|
||||||
status_changed: הודעה שונתה
|
status_changed: הודעה שונתה
|
||||||
title: הודעות החשבון - @%{name}
|
status_title: פרסום מאת @%{name}
|
||||||
|
title: פרסומי החשבון - @%{name}
|
||||||
trending: נושאים חמים
|
trending: נושאים חמים
|
||||||
|
view_publicly: צפיה בפומבי
|
||||||
visibility: נראות
|
visibility: נראות
|
||||||
with_media: עם מדיה
|
with_media: עם מדיה
|
||||||
strikes:
|
strikes:
|
||||||
|
@ -841,7 +841,6 @@ hu:
|
|||||||
original_status: Eredeti bejegyzés
|
original_status: Eredeti bejegyzés
|
||||||
reblogs: Megosztások
|
reblogs: Megosztások
|
||||||
status_changed: A bejegyzés megváltozott
|
status_changed: A bejegyzés megváltozott
|
||||||
title: Fiók bejegyzései - @%{name}
|
|
||||||
trending: Felkapott
|
trending: Felkapott
|
||||||
visibility: Láthatóság
|
visibility: Láthatóság
|
||||||
with_media: Médiával
|
with_media: Médiával
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user