diff --git a/.github/workflows/build-nightly.yml b/.github/workflows/build-nightly.yml index 2cf52e910b..d2c3eea197 100644 --- a/.github/workflows/build-nightly.yml +++ b/.github/workflows/build-nightly.yml @@ -33,7 +33,7 @@ jobs: labels: | org.opencontainers.image.description=Nightly build image used for testing purposes flavor: | - latest=auto + latest=true tags: | type=raw,value=edge type=raw,value=nightly diff --git a/.nvmrc b/.nvmrc index 541b047dd0..b1b396bcfa 100644 --- a/.nvmrc +++ b/.nvmrc @@ -1 +1 @@ -20.6 +20.7 diff --git a/CHANGELOG.md b/CHANGELOG.md index 37116f738d..8e285bfeb0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,7 +8,7 @@ The following changelog entries focus on changes visible to users, administrator ### Added -- **Add full-text search of opted-in public posts and rework search operators** ([Gargron](https://github.com/mastodon/mastodon/pull/26485), [jsgoldstein](https://github.com/mastodon/mastodon/pull/26344), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/26657), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/26650), [jsgoldstein](https://github.com/mastodon/mastodon/pull/26659), [Gargron](https://github.com/mastodon/mastodon/pull/26660), [Gargron](https://github.com/mastodon/mastodon/pull/26663), [Gargron](https://github.com/mastodon/mastodon/pull/26688), [Gargron](https://github.com/mastodon/mastodon/pull/26689), [Gargron](https://github.com/mastodon/mastodon/pull/26686), [Gargron](https://github.com/mastodon/mastodon/pull/26687), [Gargron](https://github.com/mastodon/mastodon/pull/26692), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/26697), [Gargron](https://github.com/mastodon/mastodon/pull/26699), [Gargron](https://github.com/mastodon/mastodon/pull/26701), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/26710), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/26739), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/26754), [Gargron](https://github.com/mastodon/mastodon/pull/26662), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/26755), [Gargron](https://github.com/mastodon/mastodon/pull/26781), [Gargron](https://github.com/mastodon/mastodon/pull/26782), [Gargron](https://github.com/mastodon/mastodon/pull/26760), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/26756), [Gargron](https://github.com/mastodon/mastodon/pull/26784), [Gargron](https://github.com/mastodon/mastodon/pull/26807), [Gargron](https://github.com/mastodon/mastodon/pull/26835), [Gargron](https://github.com/mastodon/mastodon/pull/26847), [Gargron](https://github.com/mastodon/mastodon/pull/26834), [arbolitoloco1](https://github.com/mastodon/mastodon/pull/26893), [tribela](https://github.com/mastodon/mastodon/pull/26896)) +- **Add full-text search of opted-in public posts and rework search operators** ([Gargron](https://github.com/mastodon/mastodon/pull/26485), [jsgoldstein](https://github.com/mastodon/mastodon/pull/26344), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/26657), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/26650), [jsgoldstein](https://github.com/mastodon/mastodon/pull/26659), [Gargron](https://github.com/mastodon/mastodon/pull/26660), [Gargron](https://github.com/mastodon/mastodon/pull/26663), [Gargron](https://github.com/mastodon/mastodon/pull/26688), [Gargron](https://github.com/mastodon/mastodon/pull/26689), [Gargron](https://github.com/mastodon/mastodon/pull/26686), [Gargron](https://github.com/mastodon/mastodon/pull/26687), [Gargron](https://github.com/mastodon/mastodon/pull/26692), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/26697), [Gargron](https://github.com/mastodon/mastodon/pull/26699), [Gargron](https://github.com/mastodon/mastodon/pull/26701), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/26710), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/26739), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/26754), [Gargron](https://github.com/mastodon/mastodon/pull/26662), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/26755), [Gargron](https://github.com/mastodon/mastodon/pull/26781), [Gargron](https://github.com/mastodon/mastodon/pull/26782), [Gargron](https://github.com/mastodon/mastodon/pull/26760), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/26756), [Gargron](https://github.com/mastodon/mastodon/pull/26784), [Gargron](https://github.com/mastodon/mastodon/pull/26807), [Gargron](https://github.com/mastodon/mastodon/pull/26835), [Gargron](https://github.com/mastodon/mastodon/pull/26847), [Gargron](https://github.com/mastodon/mastodon/pull/26834), [arbolitoloco1](https://github.com/mastodon/mastodon/pull/26893), [tribela](https://github.com/mastodon/mastodon/pull/26896), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/26927), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/26959)) This introduces a new `public_statuses` Elasticsearch index for public posts by users who have opted in to their posts being searchable (`toot#indexable` flag). This also revisits the other indexes to provide more useful indexing, and adds new search operators such as `from:me`, `before:2022-11-01`, `after:2022-11-01`, `during:2022-11-01`, `language:fr`, `has:poll`, or `in:library` (for searching only in posts you have written or interacted with). Results are now ordered chronologically. @@ -17,7 +17,7 @@ The following changelog entries focus on changes visible to users, administrator That URL can be changed using the `UPDATE_CHECK_URL` environment variable, and the feature outright disabled by setting that variable to an empty string (`UPDATE_CHECK_URL=`). - **Add “Privacy and reach” tab in profile settings** ([Gargron](https://github.com/mastodon/mastodon/pull/26484), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/26508)) This reorganized scattered privacy and reach settings to a single place, as well as improve their wording. -- **Add display of out-of-band hashtags in the web interface** ([Gargron](https://github.com/mastodon/mastodon/pull/26492), [arbolitoloco1](https://github.com/mastodon/mastodon/pull/26497), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/26506), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/26525), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/26606), [Gargron](https://github.com/mastodon/mastodon/pull/26666)) +- **Add display of out-of-band hashtags in the web interface** ([Gargron](https://github.com/mastodon/mastodon/pull/26492), [arbolitoloco1](https://github.com/mastodon/mastodon/pull/26497), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/26506), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/26525), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/26606), [Gargron](https://github.com/mastodon/mastodon/pull/26666), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/26960)) - **Add role badges to the web interface** ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/25649), [Gargron](https://github.com/mastodon/mastodon/pull/26281)) - **Add ability to pick domains to forward reports to using the `forward_to_domains` parameter in `POST /api/v1/reports`** ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/25866), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/26636)) The `forward_to_domains` REST API parameter is a list of strings. If it is empty or omitted, the previous behavior is maintained. @@ -39,7 +39,7 @@ The following changelog entries focus on changes visible to users, administrator - Add admin API for managing tags ([rrgeorge](https://github.com/mastodon/mastodon/pull/26872)) - Add a link to hashtag timelines from the Trending hashtags moderation interface ([gunchleoc](https://github.com/mastodon/mastodon/pull/26724)) - Add timezone to datetimes in e-mails ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/26822)) -- Add `authorized_fetch` server setting in addition to env var ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/25798)) +- Add `authorized_fetch` server setting in addition to env var ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/25798), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/26958)) - Add avatar image to webfinger responses ([tvler](https://github.com/mastodon/mastodon/pull/26558)) - Add debug logging on signature verification failure ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/26637), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/26812)) - Add explicit error messages when DeepL quota is exceeded ([lutoma](https://github.com/mastodon/mastodon/pull/26704)) @@ -66,7 +66,7 @@ The following changelog entries focus on changes visible to users, administrator - Add users index on `unconfirmed_email` ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/25672), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/25702)) - Add superapp index on `oauth_applications` ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/25670)) - Add index to backups on `user_id` column ([mjankowski](https://github.com/mastodon/mastodon/pull/25647)) -- Add onboarding prompt when home feed too slow in web UI ([Gargron](https://github.com/mastodon/mastodon/pull/25267), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/25556), [Gargron](https://github.com/mastodon/mastodon/pull/25579), [renchap](https://github.com/mastodon/mastodon/pull/25580), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/25581), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/25617), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/25917), [Gargron](https://github.com/mastodon/mastodon/pull/26829)) +- Add onboarding prompt when home feed too slow in web UI ([Gargron](https://github.com/mastodon/mastodon/pull/25267), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/25556), [Gargron](https://github.com/mastodon/mastodon/pull/25579), [renchap](https://github.com/mastodon/mastodon/pull/25580), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/25581), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/25617), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/25917), [Gargron](https://github.com/mastodon/mastodon/pull/26829), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/26935)) - Add `POST /api/v1/conversations/:id/unread` API endpoint to mark a conversation as unread ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/25509)) - Add `translate="no"` to outgoing mentions and links ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/25524)) - Add unsubscribe link and headers to e-mails ([Gargron](https://github.com/mastodon/mastodon/pull/25378), [c960657](https://github.com/mastodon/mastodon/pull/26085)) @@ -104,7 +104,7 @@ The following changelog entries focus on changes visible to users, administrator - Add support for streaming server to connect to postgres with self-signed certs through the `sslmode` URL parameter ([ramuuns](https://github.com/mastodon/mastodon/pull/21431)) - Add support for specifying S3 storage classes through the `S3_STORAGE_CLASS` environment variable ([hyl](https://github.com/mastodon/mastodon/pull/22480)) - Add support for incoming rich text ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/23913)) -- Add support for Ruby 3.2 ([tenderlove](https://github.com/mastodon/mastodon/pull/22928), [casperisfine](https://github.com/mastodon/mastodon/pull/24142), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/24202)) +- Add support for Ruby 3.2 ([tenderlove](https://github.com/mastodon/mastodon/pull/22928), [casperisfine](https://github.com/mastodon/mastodon/pull/24142), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/24202), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/26934)) - Add API parameter to safeguard unexpected mentions in new posts ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/18350)) ### Changed @@ -130,14 +130,14 @@ The following changelog entries focus on changes visible to users, administrator - Change DCT method used for JPEG encoding to float ([electroCutie](https://github.com/mastodon/mastodon/pull/26675)) - Change from `node-redis` to `ioredis` for streaming ([gmemstr](https://github.com/mastodon/mastodon/pull/26581)) - Change private statuses index to index without crutches ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/26713)) -- Change video compression parameters ([Gargron](https://github.com/mastodon/mastodon/pull/26631), [Gargron](https://github.com/mastodon/mastodon/pull/26745), [Gargron](https://github.com/mastodon/mastodon/pull/26766)) +- Change video compression parameters ([Gargron](https://github.com/mastodon/mastodon/pull/26631), [Gargron](https://github.com/mastodon/mastodon/pull/26745), [Gargron](https://github.com/mastodon/mastodon/pull/26766), [Gargron](https://github.com/mastodon/mastodon/pull/26970)) - Change admin e-mail notification settings to be their own settings group ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/26596)) - Change opacity of the delete icon in the search field to be more visible ([AntoninDelFabbro](https://github.com/mastodon/mastodon/pull/26449)) - Change Account Search to prioritize username over display name ([jsgoldstein](https://github.com/mastodon/mastodon/pull/26623)) - Change follow recommendation materialized view to be faster in most cases ([renchap, ClearlyClaire](https://github.com/mastodon/mastodon/pull/26545)) - Change `robots.txt` to block GPTBot ([Foritus](https://github.com/mastodon/mastodon/pull/26396)) - Change header of hashtag timelines in web UI ([Gargron](https://github.com/mastodon/mastodon/pull/26362), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/26416)) -- Change streaming `/metrics` to include additional metrics ([ThisIsMissEm](https://github.com/mastodon/mastodon/pull/26299)) +- Change streaming `/metrics` to include additional metrics ([ThisIsMissEm](https://github.com/mastodon/mastodon/pull/26299), [ThisIsMissEm](https://github.com/mastodon/mastodon/pull/26945)) - Change indexing frequency from 5 minutes to 1 minute, add locks to schedulers ([Gargron](https://github.com/mastodon/mastodon/pull/26304)) - Change column link to add a better keyboard focus indicator ([teeerevor](https://github.com/mastodon/mastodon/pull/26278)) - Change poll form element colors to fit with the rest of the ui ([teeerevor](https://github.com/mastodon/mastodon/pull/26139), [teeerevor](https://github.com/mastodon/mastodon/pull/26162), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/26164)) @@ -159,7 +159,6 @@ The following changelog entries focus on changes visible to users, administrator - Change wording of “Content cache retention period” setting to highlight destructive implications ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/23261)) - Change autolinking to allow carets in URL search params ([renchap](https://github.com/mastodon/mastodon/pull/25216)) - Change share action from being in action bar to being in dropdown in web UI ([Gargron](https://github.com/mastodon/mastodon/pull/25105)) -- Change remote report processing to accept reports with long comments, but truncate them ([ThisIsMissEm](https://github.com/mastodon/mastodon/pull/25028)) - Change sessions to be ordered from most-recent to least-recently updated ([frankieroberto](https://github.com/mastodon/mastodon/pull/25005)) - Change vacuum scheduler to also delete expired tokens and unused application records ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/24868), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/24871)) - Change "Sign in" to "Login" ([Gargron](https://github.com/mastodon/mastodon/pull/24942)) @@ -213,29 +212,23 @@ The following changelog entries focus on changes visible to users, administrator - **Fix being unable to load past a full page of filtered posts in Home timeline** ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/24930)) - **Fix log-in flow when involving both OAuth and external authentication** ([CSDUMMI](https://github.com/mastodon/mastodon/pull/24073)) - **Fix broken links in account gallery** ([c960657](https://github.com/mastodon/mastodon/pull/24218)) -- **Fix blocking subdomains of an already-blocked domain** ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/26392)) - **Fix migration handler not updating lists** ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/24808)) +- Fix crash when viewing a moderation appeal and the moderator account has been deleted ([xrobau](https://github.com/mastodon/mastodon/pull/25900)) +- Fix error in Web UI when server rules cannot be fetched ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/26957)) - Fix paragraph margins resulting in irregular read-more cut-off in web UI ([Gargron](https://github.com/mastodon/mastodon/pull/26828)) - Fix notification permissions being requested immediately after login ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/26472)) - Fix performances of profile directory ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/26840), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/26842)) - Fix mute button and volume slider feeling disconnected in web UI ([Gargron](https://github.com/mastodon/mastodon/pull/26827), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/26860)) - Fix “Scoped order is ignored, it's forced to be batch order.” warnings ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/26793)) - Fix blocked domain appearing in account feeds ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/26823)) -- Fix moderator rights inconsistencies ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/26729)) -- Fix crash when encountering invalid URL ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/26814)) - Fix invalid `Content-Type` header for WebP images ([c960657](https://github.com/mastodon/mastodon/pull/26773)) - Fix minor inefficiencies in `tootctl search deploy` ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/26721)) - Fix filter form in profiles directory overflowing instead of wrapping ([arbolitoloco1](https://github.com/mastodon/mastodon/pull/26682)) -- Fix `/api/v1/timelines/tag/:hashtag` allowing for unauthenticated access when public preview is disabled ([danielmbrasil](https://github.com/mastodon/mastodon/pull/26237)) -- Fix inefficiencies in `PlainTextFormatter` ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/26727)) - Fix sign up steps progress layout in right-to-left locales ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/26728)) - Fix bug with “favorited by” and “reblogged by“ view on posts only showing up to 40 items ([timothyjrogers](https://github.com/mastodon/mastodon/pull/26577), [timothyjrogers](https://github.com/mastodon/mastodon/pull/26574)) - Fix bad search type heuristic ([Gargron](https://github.com/mastodon/mastodon/pull/26673)) - Fix not being able to negate prefix clauses in search ([Gargron](https://github.com/mastodon/mastodon/pull/26672)) - Fix timeout on invalid set of exclusionary parameters in `/api/v1/timelines/public` ([danielmbrasil](https://github.com/mastodon/mastodon/pull/26239)) -- Fix unexpected audio stream transcoding when uploaded video is eligible to passthrough ([yufushiro](https://github.com/mastodon/mastodon/pull/26608)) -- Fix uploading of video files for which `ffprobe` reports `0/0` average framerate ([NicolaiSoeborg](https://github.com/mastodon/mastodon/pull/26500)) -- Fix cached posts including stale stats ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/26409)) - Fix adding column with default value taking longer on Postgres >= 11 ([Gargron](https://github.com/mastodon/mastodon/pull/26375)) - Fix light theme select option for hashtags ([teeerevor](https://github.com/mastodon/mastodon/pull/26311)) - Fix AVIF attachments ([c960657](https://github.com/mastodon/mastodon/pull/26264)) @@ -300,6 +293,34 @@ The following changelog entries focus on changes visible to users, administrator - Fix streaming API not being usable without `DATABASE_URL` ([Gargron](https://github.com/mastodon/mastodon/pull/23960)) - Fix external authentication not running onboarding code for new users ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/23458)) +## [4.1.8] - 2023-09-19 + +### Fixed + +- Fix post edits not being forwarded as expected ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/26936)) +- Fix moderator rights inconsistencies ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/26729)) +- Fix crash when encountering invalid URL ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/26814)) +- Fix cached posts including stale stats ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/26409)) +- Fix uploading of video files for which `ffprobe` reports `0/0` average framerate ([NicolaiSoeborg](https://github.com/mastodon/mastodon/pull/26500)) +- Fix unexpected audio stream transcoding when uploaded video is eligible to passthrough ([yufushiro](https://github.com/mastodon/mastodon/pull/26608)) + +### Security + +- Fix missing HTML sanitization in translation API (CVE-2023-42452) +- Fix incorrect domain name normalization (CVE-2023-42451) + +## [4.1.7] - 2023-09-05 + +### Changed + +- Change remote report processing to accept reports with long comments, but truncate them ([ThisIsMissEm](https://github.com/mastodon/mastodon/pull/25028)) + +### Fixed + +- **Fix blocking subdomains of an already-blocked domain** ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/26392)) +- Fix `/api/v1/timelines/tag/:hashtag` allowing for unauthenticated access when public preview is disabled ([danielmbrasil](https://github.com/mastodon/mastodon/pull/26237)) +- Fix inefficiencies in `PlainTextFormatter` ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/26727)) + ## [4.1.6] - 2023-07-31 ### Fixed diff --git a/app/helpers/authorized_fetch_helper.rb b/app/helpers/authorized_fetch_helper.rb index ce87526e6a..cc1b8d02c3 100644 --- a/app/helpers/authorized_fetch_helper.rb +++ b/app/helpers/authorized_fetch_helper.rb @@ -2,7 +2,7 @@ module AuthorizedFetchHelper def authorized_fetch_mode? - ENV.fetch('AUTHORIZED_FETCH') { Setting.authorized_fetch } == 'true' || Rails.configuration.x.limited_federation_mode + ENV.fetch('AUTHORIZED_FETCH') { Setting.authorized_fetch && 'true' } == 'true' || Rails.configuration.x.limited_federation_mode end def authorized_fetch_overridden? diff --git a/app/javascript/flavours/glitch/features/about/index.jsx b/app/javascript/flavours/glitch/features/about/index.jsx index fe07a870b2..feecc2dd6f 100644 --- a/app/javascript/flavours/glitch/features/about/index.jsx +++ b/app/javascript/flavours/glitch/features/about/index.jsx @@ -6,6 +6,7 @@ import { defineMessages, injectIntl, FormattedMessage } from 'react-intl'; import classNames from 'classnames'; import { Helmet } from 'react-helmet'; +import { List as ImmutableList } from 'immutable'; import ImmutablePropTypes from 'react-immutable-proptypes'; import { connect } from 'react-redux'; @@ -161,7 +162,7 @@ class About extends PureComponent {
- {!isLoading && (server.get('rules', []).isEmpty() ? ( + {!isLoading && (server.get('rules', ImmutableList()).isEmpty() ? (

) : (
    diff --git a/app/javascript/flavours/glitch/reducers/search.js b/app/javascript/flavours/glitch/reducers/search.js index a215282aa9..e4144db62e 100644 --- a/app/javascript/flavours/glitch/reducers/search.js +++ b/app/javascript/flavours/glitch/reducers/search.js @@ -14,6 +14,7 @@ import { SEARCH_SHOW, SEARCH_EXPAND_REQUEST, SEARCH_EXPAND_SUCCESS, + SEARCH_EXPAND_FAIL, SEARCH_HISTORY_UPDATE, } from 'flavours/glitch/actions/search'; @@ -54,6 +55,7 @@ export default function search(state = initialState, action) { map.set('type', action.searchType); }); case SEARCH_FETCH_FAIL: + case SEARCH_EXPAND_FAIL: return state.set('isLoading', false); case SEARCH_FETCH_SUCCESS: return state.withMutations(map => { @@ -68,10 +70,10 @@ export default function search(state = initialState, action) { map.set('isLoading', false); }); case SEARCH_EXPAND_REQUEST: - return state.set('type', action.searchType); + return state.set('type', action.searchType).set('isLoading', true); case SEARCH_EXPAND_SUCCESS: const results = action.searchType === 'hashtags' ? ImmutableOrderedSet(fromJS(action.results.hashtags)) : action.results[action.searchType].map(item => item.id); - return state.updateIn(['results', action.searchType], list => list.union(results)); + return state.updateIn(['results', action.searchType], list => list.union(results)).set('isLoading', false); case SEARCH_HISTORY_UPDATE: return state.set('recent', ImmutableOrderedSet(fromJS(action.recent))); default: diff --git a/app/javascript/mastodon/components/status.jsx b/app/javascript/mastodon/components/status.jsx index e1728910ee..4a5ad54a1c 100644 --- a/app/javascript/mastodon/components/status.jsx +++ b/app/javascript/mastodon/components/status.jsx @@ -546,7 +546,7 @@ class Status extends ImmutablePureComponent { const visibilityIcon = visibilityIconInfo[status.get('visibility')]; const {statusContentProps, hashtagBar} = getHashtagBarForStatus(status); - const expanded = !status.get('hidden') + const expanded = !status.get('hidden') || status.get('spoiler_text').length === 0; return ( diff --git a/app/javascript/mastodon/features/about/index.jsx b/app/javascript/mastodon/features/about/index.jsx index aff38124b6..72a030e9d3 100644 --- a/app/javascript/mastodon/features/about/index.jsx +++ b/app/javascript/mastodon/features/about/index.jsx @@ -6,6 +6,7 @@ import { defineMessages, injectIntl, FormattedMessage } from 'react-intl'; import classNames from 'classnames'; import { Helmet } from 'react-helmet'; +import { List as ImmutableList } from 'immutable'; import ImmutablePropTypes from 'react-immutable-proptypes'; import { connect } from 'react-redux'; @@ -161,7 +162,7 @@ class About extends PureComponent {
- {!isLoading && (server.get('rules', []).isEmpty() ? ( + {!isLoading && (server.get('rules', ImmutableList()).isEmpty() ? (

) : (
    diff --git a/app/javascript/mastodon/features/status/components/detailed_status.jsx b/app/javascript/mastodon/features/status/components/detailed_status.jsx index e41a042c7c..3927aba2f5 100644 --- a/app/javascript/mastodon/features/status/components/detailed_status.jsx +++ b/app/javascript/mastodon/features/status/components/detailed_status.jsx @@ -293,7 +293,7 @@ class DetailedStatus extends ImmutablePureComponent { } const {statusContentProps, hashtagBar} = getHashtagBarForStatus(status); - const expanded = !status.get('hidden') + const expanded = !status.get('hidden') || status.get('spoiler_text').length === 0; return (
    diff --git a/app/javascript/mastodon/locales/be.json b/app/javascript/mastodon/locales/be.json index d60fabd204..8d293670c0 100644 --- a/app/javascript/mastodon/locales/be.json +++ b/app/javascript/mastodon/locales/be.json @@ -310,6 +310,9 @@ "home.explore_prompt.body": "Ваша галоўная стужка змяшчае сумесь допісаў з хэштэгамі, за якімі вы вырашылі сачыць, допісаў ад людзей, за якімі вы вырашылі сачыць, і допісаў, якія яны пашыраюць. Зараз усё выглядае даволі ціха, так што як наконт:", "home.explore_prompt.title": "Гэта ваша апорная кропка ў Mastodon.", "home.hide_announcements": "Схаваць аб'явы", + "home.pending_critical_update.body": "Калі ласка, абнавіце свой сервер Mastodon як мага хутчэй!", + "home.pending_critical_update.link": "Прагледзець абнаўленні", + "home.pending_critical_update.title": "Даступна крытычнае абнаўленне бяспекі!", "home.show_announcements": "Паказаць аб'явы", "interaction_modal.description.favourite": "Маючы ўліковы запіс Mastodon, вы можаце ўпадабаць гэты допіс, каб паведаміць аўтару, што ён вам падабаецца, і захаваць яго на будучыню.", "interaction_modal.description.follow": "Маючы акаўнт у Mastodon, вы можаце падпісацца на {name}, каб бачыць яго/яе допісы ў сваёй хатняй стужцы.", @@ -586,6 +589,7 @@ "search.quick_action.open_url": "Адкрыць спасылку ў Mastodon", "search.quick_action.status_search": "Супадзенне паведамленняў {x}", "search.search_or_paste": "Пошук", + "search_popout.full_text_search_disabled_message": "Недаступна на {domain}.", "search_popout.language_code": "ISO код мовы", "search_popout.options": "Параметры пошуку", "search_popout.quick_actions": "Хуткія дзеянні", diff --git a/app/javascript/mastodon/locales/bn.json b/app/javascript/mastodon/locales/bn.json index 5d8d02fa4c..4b055f53a4 100644 --- a/app/javascript/mastodon/locales/bn.json +++ b/app/javascript/mastodon/locales/bn.json @@ -4,11 +4,11 @@ "about.disclaimer": "ম্যাস্টোডন একটি ফ্রি, ওপেন সোর্স সফটওয়্যার এবং ম্যাস্টোডন জিজিএমবিএইচ এর একটি ট্রেডমার্ক।", "about.domain_blocks.no_reason_available": "কারণ দর্শানো যাচ্ছে না", "about.domain_blocks.preamble": "ম্যাস্টোডন সাধারণত আপনাকে ফেদিভার্স এ অন্য কোনও সার্ভারের ব্যবহারকারীদের থেকে সামগ্রী দেখতে এবং তাদের সাথে আলাপচারিতা করার সুযোগ দেয়। এই ব্যতিক্রম যে এই বিশেষ সার্ভারে তৈরি করা হয়েছে।", - "about.domain_blocks.silenced.explanation": "আপনি সাধারণত এই সার্ভার থেকে প্রোফাইল এবং বিষয়বস্তু দেখতে পারবেন না, যদি না আপনি স্পষ্টভাবে এটি দেখেন বা অনুসরণ করে এটি নির্বাচন করেন৷", + "about.domain_blocks.silenced.explanation": "আপনি সাধারণত এই সার্ভার থেকে প্রোফাইল এবং বিষয়বস্তু দেখতে পারবেন না, যদি না আপনি নিজে থেকেই এটাকে ফলো না করেন.", "about.domain_blocks.silenced.title": "সীমিত", "about.domain_blocks.suspended.explanation": "এই সার্ভার থেকে কোনও ডেটা প্রক্রিয়াজাতকরণ, সংরক্ষণ বা আদান-প্রদান করা হবে না, তাই এই সার্ভার ব্যবহারকারীদের সাথে কোনও মিথস্ক্রিয়া বা যোগাযোগকে অসম্ভব করে তুলেছে।", "about.domain_blocks.suspended.title": "সাসপেন্ড করা হয়েছে", - "about.not_available": "এই তথ্য এই সার্ভারে উপলব্ধ করা হয়নি।", + "about.not_available": "এই তথ্য এই সার্ভারে উন্মুক্ত করা হয়নি.", "about.powered_by": "{mastodon} দ্বারা তৈরি বিকেন্দ্রীভূত সামাজিক মিডিয়া।", "about.rules": "সার্ভারের নিয়মাবলী", "account.account_note_header": "বিজ্ঞপ্তি", @@ -16,45 +16,45 @@ "account.badges.bot": "বট", "account.badges.group": "দল", "account.block": "@{name} কে ব্লক করো", - "account.block_domain": "{domain} থেকে সব লুকাও", - "account.block_short": "অবরোধ", + "account.block_domain": "{domain} কে ব্লক করুন", + "account.block_short": "ব্লক", "account.blocked": "অবরুদ্ধ", "account.browse_more_on_origin_server": "মূল প্রোফাইলটিতে আরও ব্রাউজ করুন", "account.cancel_follow_request": "অনুসরণ অনুরোধ প্রত্যাহার করুন", "account.direct": "গোপনে মেনশন করুন @{name}", "account.disable_notifications": "আমাকে জানানো বন্ধ করো যখন @{name} পোস্ট করবে", - "account.domain_blocked": "ডোমেন গোপন করুন", - "account.edit_profile": "প্রোফাইল পরিবর্তন করুন", + "account.domain_blocked": "ডোমেইন ব্লক করা", + "account.edit_profile": "প্রোফাইল সম্পাদনা করুন", "account.enable_notifications": "আমাকে জানাবে যখন @{name} পোস্ট করবে", - "account.endorse": "নিজের পাতায় দেখান", + "account.endorse": "প্রোফাইলে ফিচার করুন", "account.featured_tags.last_status_at": "{date} এ সর্বশেষ পোস্ট", "account.featured_tags.last_status_never": "কোনো পোস্ট নেই", - "account.featured_tags.title": "{name}-এর বৈশিষ্ট্যযুক্ত হ্যাশট্যাগগুলি৷", + "account.featured_tags.title": "{name} এর ফিচার করা Hashtag সমূহ", "account.follow": "অনুসরণ", "account.followers": "অনুসরণকারী", - "account.followers.empty": "এই ব্যক্তিকে এখনো কেউ অনুসরণ করে না।", + "account.followers.empty": "এই ব্যক্তিকে এখনো কেউ অনুসরণ করে না.", "account.followers_counter": "{count, plural,one {{counter} জন অনুসরণকারী } other {{counter} জন অনুসরণকারী}}", "account.following": "অনুসরণ করা হচ্ছে", "account.following_counter": "{count, plural,one {{counter} জনকে অনুসরণ} other {{counter} জনকে অনুসরণ}}", - "account.follows.empty": "এই সদস্য কাওকে এখনো অনুসরণ করেন না.", - "account.follows_you": "তোমাকে অনুসরণ করে", + "account.follows.empty": "এই সদস্য কাউকে এখনো ফলো করেন না.", + "account.follows_you": "আপনাকে ফলো করে", "account.go_to_profile": "প্রোফাইলে যান", "account.hide_reblogs": "@{name}'র সমর্থনগুলি লুকিয়ে ফেলুন", - "account.in_memoriam": "স্মৃতিসৌধে।", + "account.in_memoriam": "স্মৃতিতে.", "account.joined_short": "যোগ দিয়েছেন", "account.languages": "সাবস্ক্রাইব করা ভাষা পরিবর্তন করুন", "account.link_verified_on": "এই লিংকের মালিকানা চেক করা হয়েছে {date} তারিখে", - "account.locked_info": "এই নিবন্ধনের গোপনীয়তার ক্ষেত্র তালা দেওয়া আছে। নিবন্ধনকারী অনুসরণ করার অনুমতি যাদেরকে দেবেন, শুধু তারাই অনুসরণ করতে পারবেন।", + "account.locked_info": "এই একাউন্ট লক করা। উনি যাদেরকে ফলো করার অনুমতি যাদেরকে দেবেন, শুধু তারাই ফলো করতে পারবেন.", "account.media": "মিডিয়া", - "account.mention": "@{name} কে উল্লেখ করুন", + "account.mention": "@{name} কে মেনশন করুন", "account.moved_to": "{name} নির্দেশ করেছে যে তাদের নতুন অ্যাকাউন্ট এখন হলো:", "account.mute": "@{name} কে নিঃশব্দ করুন", - "account.mute_notifications_short": "বিজ্ঞপ্তি নিংশব্দ", - "account.mute_short": "নিঃশব্দ", - "account.muted": "নিঃশব্দ", - "account.no_bio": "কোনো বর্ণনা দেওয়া হয়নি।", + "account.mute_notifications_short": "নোটিফিকেশন মিউট করুন", + "account.mute_short": "মিউট করুন", + "account.muted": "মিউট করা", + "account.no_bio": "কোনো বর্ণনা দেওয়া হয়নি.", "account.open_original_page": "মূল পৃষ্ঠা খুলুন", - "account.posts": "টুট", + "account.posts": "পোষ্টসমূহ", "account.posts_with_replies": "টুট এবং মতামত", "account.report": "@{name} কে রিপোর্ট করুন", "account.requested": "অনুমতির অপেক্ষা। অনুসরণ করার অনুরোধ বাতিল করতে এখানে ক্লিক করুন", @@ -76,6 +76,9 @@ "admin.dashboard.retention.average": "গড়", "admin.dashboard.retention.cohort": "সাইন আপের মাস", "admin.dashboard.retention.cohort_size": "নতুন ব্যবহারকারী", + "admin.impact_report.instance_accounts": "যেসব একাউন্ট এর প্রোফাইল এটি ডিলিট করবে", + "admin.impact_report.instance_followers": "যেসব ফলোয়ারদের আমাদের ইউজাররা হারাবে", + "admin.impact_report.instance_follows": "যেসব ফলোয়ারদের তাদের ইউজার হারাবে", "alert.rate_limited.message": "{retry_time, time, medium} -এর পরে আবার প্রচেষ্টা করুন।", "alert.rate_limited.title": "হার সীমিত", "alert.unexpected.message": "সমস্যা অপ্রত্যাশিত.", @@ -131,7 +134,9 @@ "community.column_settings.remote_only": "শুধুমাত্র দূরবর্তী", "compose.language.change": "ভাষা পরিবর্তন করুন", "compose.language.search": "ভাষা অনুসন্ধান করুন...", + "compose.published.body": "পোষ্ট publish করা হয়েছে.", "compose.published.open": "দেখো", + "compose.saved.body": "পোস্ট সংরক্ষণ করা হয়েছে.", "compose_form.direct_message_warning_learn_more": "আরো জানুন", "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.", "compose_form.hashtag_warning": "এই পোস্টটি কোনো হ্যাশট্যাগের বিষয় নয় কারণ এটি সর্বজনীনভাবে উপলব্ধ নয়। শুধুমাত্র জনসাধারণের কাছে পোস্ট করা বার্তাই হ্যাশট্যাগ দ্বারা অনুসন্ধান করা যেতে পারে।", @@ -165,9 +170,11 @@ "confirmations.delete_list.confirm": "মুছে ফেলুন", "confirmations.delete_list.message": "আপনি কি নিশ্চিত যে আপনি এই তালিকাটি স্থায়িভাবে মুছে ফেলতে চান ?", "confirmations.discard_edit_media.confirm": "বাতিল করো", + "confirmations.discard_edit_media.message": "মিডিয়া Description বা Preview তে আপনার আপনার অসংরক্ষিত পরিবর্তন আছে, সেগুলো বাতিল করবেন?", "confirmations.domain_block.confirm": "এই ডোমেন থেকে সব লুকান", "confirmations.domain_block.message": "আপনি কি সত্যিই সত্যই নিশ্চিত যে আপনি পুরো {domain}'টি ব্লক করতে চান? বেশিরভাগ ক্ষেত্রে কয়েকটি লক্ষ্যযুক্ত ব্লক বা নীরবতা যথেষ্ট এবং পছন্দসই। আপনি কোনও পাবলিক টাইমলাইন বা আপনার বিজ্ঞপ্তিগুলিতে সেই ডোমেন থেকে সামগ্রী দেখতে পাবেন না। সেই ডোমেন থেকে আপনার অনুসরণকারীদের সরানো হবে।", "confirmations.edit.confirm": "সম্পাদন", + "confirmations.edit.message": "এখন সম্পাদনা করলে আপনি যে মেসেজ লিখছেন তা overwrite করবে, চালিয়ে যেতে চান?", "confirmations.logout.confirm": "প্রস্থান", "confirmations.logout.message": "আপনি লগ আউট করতে চান?", "confirmations.mute.confirm": "সরিয়ে ফেলুন", @@ -187,6 +194,8 @@ "directory.local": "শুধু {domain} থেকে", "directory.new_arrivals": "নতুন আগত", "directory.recently_active": "সম্প্রতি সক্রিয়", + "disabled_account_banner.account_settings": "একাউন্ট সেটিংস", + "disabled_account_banner.text": "আপনার একাউন্ট {disabledAccount} বর্তমানে বন্ধ করা.", "dismissable_banner.dismiss": "সরাও", "dismissable_banner.explore_links": "These news stories are being talked about by people on this and other servers of the decentralized network right now.", "dismissable_banner.explore_tags": "These hashtags are gaining traction among people on this and other servers of the decentralized network right now.", diff --git a/app/javascript/mastodon/locales/ca.json b/app/javascript/mastodon/locales/ca.json index 4ad2e12883..99640953af 100644 --- a/app/javascript/mastodon/locales/ca.json +++ b/app/javascript/mastodon/locales/ca.json @@ -181,7 +181,7 @@ "confirmations.mute.confirm": "Silencia", "confirmations.mute.explanation": "Això amagarà els tuts d'ells i els d'els que els mencionin, però encara els permetrà veure els teus tuts i seguir-te.", "confirmations.mute.message": "Segur que vols silenciar {name}?", - "confirmations.redraft.confirm": "Elimina i reescriu-la", + "confirmations.redraft.confirm": "Esborra i reescriu", "confirmations.redraft.message": "Segur que vols eliminar aquest tut i tornar a escriure'l? Es perdran tots els impulsos i els favorits, i les respostes al tut original quedaran aïllades.", "confirmations.reply.confirm": "Respon", "confirmations.reply.message": "Si respons ara, sobreescriuràs el missatge que estàs editant. Segur que vols continuar?", @@ -308,7 +308,7 @@ "home.column_settings.show_reblogs": "Mostra els impulsos", "home.column_settings.show_replies": "Mostra les respostes", "home.explore_prompt.body": "La teva línia de temps Inici tindrà una barreja dels tuts de les etiquetes que has triat seguir, de les persones que has triat seguir i dels tuts que s'impulsen. Ara mateix es veu força tranquil·la, què et sembla si:", - "home.explore_prompt.title": "Aquest és la teva base a Mastodon.", + "home.explore_prompt.title": "Aquesta és la teva base inicial a Mastodon.", "home.hide_announcements": "Amaga els anuncis", "home.pending_critical_update.body": "Si us plau actualitza el teu servidor Mastodon tant aviat com sigui possible!", "home.pending_critical_update.link": "Veure actualitzacions", @@ -581,7 +581,7 @@ "report_notification.categories.other": "Altres", "report_notification.categories.spam": "Brossa", "report_notification.categories.violation": "Violació de norma", - "report_notification.open": "Obre un informe", + "report_notification.open": "Obre l'informe", "search.no_recent_searches": "No hi ha cerques recents", "search.placeholder": "Cerca", "search.quick_action.account_search": "Perfils coincidint amb {x}", @@ -652,7 +652,7 @@ "status.reblog_private": "Impulsa amb la visibilitat original", "status.reblogged_by": "impulsat per {name}", "status.reblogs.empty": "Encara no ha impulsat ningú aquest tut. Quan algú ho faci, apareixerà aquí.", - "status.redraft": "Elimina i reescriu-la", + "status.redraft": "Esborra i reescriu", "status.remove_bookmark": "Elimina el marcador", "status.replied_to": "En resposta a {name}", "status.reply": "Respon", diff --git a/app/javascript/mastodon/locales/de.json b/app/javascript/mastodon/locales/de.json index eaa979f3a6..f4ac4c0ce3 100644 --- a/app/javascript/mastodon/locales/de.json +++ b/app/javascript/mastodon/locales/de.json @@ -42,7 +42,7 @@ "account.hide_reblogs": "Geteilte Beiträge von @{name} ausblenden", "account.in_memoriam": "Zum Andenken.", "account.joined_short": "Beigetreten", - "account.languages": "Genutzte Sprachen überarbeiten", + "account.languages": "Ausgewählte Sprachen ändern", "account.link_verified_on": "Das Profil mit dieser E-Mail-Adresse wurde bereits am {date} bestätigt", "account.locked_info": "Die Privatsphäre dieses Kontos wurde auf „geschützt“ gesetzt. Die Person bestimmt manuell, wer ihrem Profil folgen darf.", "account.media": "Medien", @@ -201,9 +201,9 @@ "disabled_account_banner.text": "Dein Konto {disabledAccount} ist derzeit deaktiviert.", "dismissable_banner.community_timeline": "Das sind die neuesten öffentlichen Beiträge von Profilen, deren Konten von {domain} verwaltet werden.", "dismissable_banner.dismiss": "Ablehnen", - "dismissable_banner.explore_links": "Diese Nachrichten werden heute am häufigsten im sozialen Netzwerk geteilt. Neuere Nachrichten, die von vielen verschiedenen Konten veröffentlicht wurden, haben höhere Priorität.", + "dismissable_banner.explore_links": "Diese Nachrichten werden heute am häufigsten im sozialen Netzwerk geteilt. Neuere Nachrichten, die von vielen verschiedenen Profilen veröffentlicht wurden, werden höher eingestuft.", "dismissable_banner.explore_statuses": "Diese Beiträge stammen aus dem gesamten sozialen Netzwerk und gewinnen derzeit an Reichweite. Neuere Beiträge, die häufiger geteilt und favorisiert wurden, werden höher eingestuft.", - "dismissable_banner.explore_tags": "Das sind Hashtags, die derzeit an Reichweite gewinnen. Hashtags, die von vielen verschiedenen Konten verwendet werden, haben höhere Priorität.", + "dismissable_banner.explore_tags": "Das sind Hashtags, die derzeit an Reichweite gewinnen. Hashtags, die von vielen verschiedenen Profilen verwendet werden, werden höher eingestuft.", "dismissable_banner.public_timeline": "Das sind die neuesten öffentlichen Beiträge von Profilen im sozialen Netzwerk, denen Leute auf {domain} folgen.", "embed.instructions": "Du kannst diesen Beitrag außerhalb des Fediverse (z. B. auf deiner Website) einbetten, indem du diesen iFrame-Code einfügst.", "embed.preview": "Vorschau:", @@ -244,8 +244,8 @@ "empty_column.public": "Hier ist nichts zu sehen! Schreibe etwas öffentlich oder folge Profilen von anderen Servern, um die Timeline aufzufüllen", "error.unexpected_crash.explanation": "Wegen eines Fehlers in unserem Code oder aufgrund einer Browser-Inkompatibilität kann diese Seite nicht korrekt angezeigt werden.", "error.unexpected_crash.explanation_addons": "Diese Seite konnte nicht korrekt angezeigt werden. Dieser Fehler wird wahrscheinlich durch ein Browser-Add-on oder automatische Übersetzungswerkzeuge verursacht.", - "error.unexpected_crash.next_steps": "Versuche, diese Seite zu aktualisieren. Wenn das nicht helfen sollte, kannst du das Webinterface von Mastodon vermutlich über einen anderen Browser erreichen – oder du nutzt eine mobile (native) App.", - "error.unexpected_crash.next_steps_addons": "Versuche, die Seite zu deaktivieren und lade sie dann neu. Sollte das Problem weiter bestehen, kannst du das Webinterface von Mastodon vermutlich über einen anderen Browser erreichen – oder du nutzt eine mobile (native) App.", + "error.unexpected_crash.next_steps": "Versuche, die Seite neu zu laden. Wenn das nicht helfen sollte, kannst du das Webinterface von Mastodon vermutlich über einen anderen Browser erreichen – oder du verwendest eine mobile (native) App.", + "error.unexpected_crash.next_steps_addons": "Versuche, das Add-on oder Übersetzungswerkzeug zu deaktivieren und lade die Seite anschließend neu. Sollte das Problem weiter bestehen, kannst du das Webinterface von Mastodon vermutlich über einen anderen Browser erreichen – oder du verwendest eine mobile (native) App.", "errors.unexpected_crash.copy_stacktrace": "Fehlerdiagnose in die Zwischenablage kopieren", "errors.unexpected_crash.report_issue": "Fehler melden", "explore.search_results": "Suchergebnisse", @@ -352,7 +352,7 @@ "keyboard_shortcuts.mention": "Profil erwähnen", "keyboard_shortcuts.muted": "Liste stummgeschalteter Profile öffnen", "keyboard_shortcuts.my_profile": "Eigenes Profil aufrufen", - "keyboard_shortcuts.notifications": "Mitteilungen aufrufen", + "keyboard_shortcuts.notifications": "Benachrichtigungen aufrufen", "keyboard_shortcuts.open_media": "Medieninhalt öffnen", "keyboard_shortcuts.pinned": "Liste angehefteter Beiträge öffnen", "keyboard_shortcuts.profile": "Profil aufrufen", @@ -464,7 +464,7 @@ "notifications.grant_permission": "Berechtigung erteilen.", "notifications.group": "{count} Benachrichtigungen", "notifications.mark_as_read": "Alle Benachrichtigungen als gelesen markieren", - "notifications.permission_denied": "Desktop-Benachrichtigungen können nicht aktiviert werden, da die Berechtigung verweigert wurde.", + "notifications.permission_denied": "Desktop-Benachrichtigungen können aufgrund einer zuvor verweigerten Berechtigung nicht aktiviert werden", "notifications.permission_denied_alert": "Desktop-Benachrichtigungen können nicht aktiviert werden, da die Browser-Berechtigung zuvor verweigert wurde", "notifications.permission_required": "Desktop-Benachrichtigungen sind nicht verfügbar, da die erforderliche Berechtigung nicht erteilt wurde.", "notifications_permission_banner.enable": "Aktiviere Desktop-Benachrichtigungen", @@ -527,7 +527,7 @@ "relative_time.days": "{number} T.", "relative_time.full.days": "vor {number, plural, one {# Tag} other {# Tagen}}", "relative_time.full.hours": "vor {number, plural, one {# Stunde} other {# Stunden}}", - "relative_time.full.just_now": "soeben", + "relative_time.full.just_now": "gerade eben", "relative_time.full.minutes": "vor {number, plural, one {# Minute} other {# Minuten}}", "relative_time.full.seconds": "vor {number, plural, one {1 Sekunde} other {# Sekunden}}", "relative_time.hours": "{number} Std.", @@ -609,7 +609,7 @@ "server_banner.administered_by": "Verwaltet von:", "server_banner.introduction": "{domain} ist Teil eines dezentralisierten sozialen Netzwerks, angetrieben von {mastodon}.", "server_banner.learn_more": "Mehr erfahren", - "server_banner.server_stats": "Serverstatistiken:", + "server_banner.server_stats": "Serverstatistik:", "sign_in_banner.create_account": "Konto erstellen", "sign_in_banner.sign_in": "Anmelden", "sign_in_banner.sso_redirect": "Anmelden oder registrieren", @@ -636,7 +636,7 @@ "status.hide": "Beitrag ausblenden", "status.history.created": "{name} erstellte {date}", "status.history.edited": "{name} bearbeitete {date}", - "status.load_more": "Weitere laden", + "status.load_more": "Mehr laden", "status.media.open": "Zum Öffnen anklicken", "status.media.show": "Zum Anzeigen anklicken", "status.media_hidden": "Inhalt ausgeblendet", @@ -662,9 +662,9 @@ "status.share": "Teilen", "status.show_filter_reason": "Trotzdem anzeigen", "status.show_less": "Weniger anzeigen", - "status.show_less_all": "Alle Inhaltswarnungen zuklappen", + "status.show_less_all": "Alles einklappen", "status.show_more": "Mehr anzeigen", - "status.show_more_all": "Alle Inhaltswarnungen aufklappen", + "status.show_more_all": "Alles ausklappen", "status.show_original": "Ursprünglichen Beitrag anzeigen", "status.title.with_attachments": "{user} veröffentlichte {attachmentCount, plural, one {ein Medium} other {{attachmentCount} Medien}}", "status.translate": "Übersetzen", @@ -684,7 +684,7 @@ "time_remaining.seconds": "noch {number, plural, one {# Sekunde} other {# Sekunden}}", "timeline_hint.remote_resource_not_displayed": "{resource} von anderen Servern werden nicht angezeigt.", "timeline_hint.resources.followers": "Follower", - "timeline_hint.resources.follows": "Folge ich", + "timeline_hint.resources.follows": "„Folge ich“", "timeline_hint.resources.statuses": "Ältere Beiträge", "trends.counter_by_accounts": "{count, plural, one {{counter} Profil} other {{counter} Profile}} {days, plural, one {seit gestern} other {in {days} Tagen}}", "trends.trending_now": "Aktuelle Trends", @@ -717,7 +717,7 @@ "upload_progress.processing": "Wird verarbeitet…", "username.taken": "Dieser Profilname ist vergeben. Versuche einen anderen", "video.close": "Video schließen", - "video.download": "Video-Datei herunterladen", + "video.download": "Datei herunterladen", "video.exit_fullscreen": "Vollbild verlassen", "video.expand": "Video vergrößern", "video.fullscreen": "Vollbild", @@ -725,5 +725,5 @@ "video.mute": "Stummschalten", "video.pause": "Pausieren", "video.play": "Abspielen", - "video.unmute": "Ton einschalten" + "video.unmute": "Stummschaltung aufheben" } diff --git a/app/javascript/mastodon/locales/ko.json b/app/javascript/mastodon/locales/ko.json index 42692168c8..6e5a8c6f58 100644 --- a/app/javascript/mastodon/locales/ko.json +++ b/app/javascript/mastodon/locales/ko.json @@ -428,8 +428,8 @@ "notification.follow": "{name} 님이 나를 팔로우했습니다", "notification.follow_request": "{name} 님이 팔로우 요청을 보냈습니다", "notification.mention": "{name} 님의 멘션", - "notification.own_poll": "투표를 마쳤습니다", - "notification.poll": "참여했던 투표가 끝났습니다.", + "notification.own_poll": "설문을 마침", + "notification.poll": "참여한 설문이 종료됨", "notification.reblog": "{name} 님이 부스트했습니다", "notification.status": "{name} 님이 방금 게시물을 올렸습니다", "notification.update": "{name} 님이 게시물을 수정했습니다", @@ -445,7 +445,7 @@ "notifications.column_settings.follow": "새 팔로워:", "notifications.column_settings.follow_request": "새 팔로우 요청:", "notifications.column_settings.mention": "멘션:", - "notifications.column_settings.poll": "투표 결과:", + "notifications.column_settings.poll": "설문 결과:", "notifications.column_settings.push": "푸시 알림", "notifications.column_settings.reblog": "부스트:", "notifications.column_settings.show": "컬럼에 표시", @@ -459,7 +459,7 @@ "notifications.filter.favourites": "좋아요", "notifications.filter.follows": "팔로우", "notifications.filter.mentions": "멘션", - "notifications.filter.polls": "투표 결과", + "notifications.filter.polls": "설문 결과", "notifications.filter.statuses": "팔로우 하는 사람들의 최신 게시물", "notifications.grant_permission": "권한 부여.", "notifications.group": "{count}개의 알림", @@ -500,16 +500,16 @@ "password_confirmation.exceeds_maxlength": "암호 확인 값이 최대 암호 길이를 초과하였습니다", "password_confirmation.mismatching": "암호 확인 값이 일치하지 않습니다", "picture_in_picture.restore": "다시 넣기", - "poll.closed": "마감됨", + "poll.closed": "마감", "poll.refresh": "새로고침", "poll.reveal": "결과 보기", "poll.total_people": "{count}명", "poll.total_votes": "{count} 표", "poll.vote": "투표", - "poll.voted": "이 답변에 투표했습니다", + "poll.voted": "이 답변에 투표함", "poll.votes": "{votes} 표", - "poll_button.add_poll": "투표 추가", - "poll_button.remove_poll": "투표 삭제", + "poll_button.add_poll": "설문 추가", + "poll_button.remove_poll": "설문 제거", "privacy.change": "게시물의 프라이버시 설정을 변경", "privacy.direct.long": "언급된 사용자만 볼 수 있음", "privacy.direct.short": "멘션한 사람들만", @@ -577,7 +577,7 @@ "report.unfollow": "@{name}을 팔로우 해제", "report.unfollow_explanation": "이 계정을 팔로우하고 있습니다. 홈 피드에서 더 이상 게시물을 받아 보지 않으려면 팔로우를 해제하십시오.", "report_notification.attached_statuses": "{count}개의 게시물 첨부됨", - "report_notification.categories.legal": "법적 문제 관련", + "report_notification.categories.legal": "법령", "report_notification.categories.other": "기타", "report_notification.categories.spam": "스팸", "report_notification.categories.violation": "규칙 위반", @@ -695,7 +695,7 @@ "upload_area.title": "드래그 & 드롭으로 업로드", "upload_button.label": "이미지, 영상, 오디오 파일 추가", "upload_error.limit": "파일 업로드 제한에 도달했습니다.", - "upload_error.poll": "파일 업로드는 투표와 함께 첨부할 수 없습니다.", + "upload_error.poll": "파일 업로드는 설문과 함께 쓸 수 없어요.", "upload_form.audio_description": "청각 장애인을 위한 설명", "upload_form.description": "시각장애인을 위한 설명", "upload_form.description_missing": "설명이 추가되지 않음", diff --git a/app/javascript/mastodon/locales/my.json b/app/javascript/mastodon/locales/my.json index a5f73c6edb..8e0b7ab41e 100644 --- a/app/javascript/mastodon/locales/my.json +++ b/app/javascript/mastodon/locales/my.json @@ -310,6 +310,8 @@ "home.explore_prompt.body": "သင့်ရဲ့သတင်းစဥ် မှာ သင် စောင့်ကြည့်​နေတယ့် ခေါင်းစဥ်​တွေ၊သင်​စောင့်ကြည့်​နေတယ့်အ​ကောင့်​တွေ နဲ့ အဆိုပါ အ​ကောင့်​တွေပြန်မျှ​ဝေထားတယ့် ပိုစ့်​တွေကို မြင်ရမှာပါ။:", "home.explore_prompt.title": "ဤသည်မှာ Mastodon ရှိ သင့်ပင်မစာမျက်နှာဖြစ်သည်။", "home.hide_announcements": "ကြေညာချက်များကို ဖျောက်ပါ", + "home.pending_critical_update.body": "သင့် Mastodon ဆာဗာ အမြန်ဆုံး အပ်ဒိတ်လုပ်ပါ။", + "home.pending_critical_update.link": "အပ်ဒိတ်များကြည့်ရန်", "home.show_announcements": "ကြေညာချက်များကို ပြပါ", "interaction_modal.description.favourite": "Mastodon အကောင့်ဖြင့် ဤပို့စ်ကို သင် favorite ပြုလုပ်ကြောင်း စာရေးသူအား အသိပေးပြီး နောက်ပိုင်းတွင် သိမ်းဆည်းနိုင်သည်။", "interaction_modal.description.follow": "Mastodon အကောင့်ဖြင့် သင်၏ ပင်မစာမျက်နှာတွင် ၎င်းတို့၏ ပို့စ်များကို ရရှိရန်အတွက် {name} ကို စောင့်ကြည့်နိုင်ပါသည်။", @@ -411,6 +413,7 @@ "navigation_bar.lists": "စာရင်းများ", "navigation_bar.logout": "ထွက်မယ်", "navigation_bar.mutes": "အသုံးပြုသူများကို ပိတ်ထားပါ", + "navigation_bar.opened_in_classic_interface": "ပို့စ်များ၊ အကောင့်များနှင့် အခြားသီးခြားစာမျက်နှာများကို classic ဝဘ်အင်တာဖေ့စ်တွင် ဖွင့်ထားသည်။", "navigation_bar.personal": "ကိုယ်ရေးကိုယ်တာ", "navigation_bar.pins": "ပင်တွဲထားသောပို့စ်များ", "navigation_bar.preferences": "စိတ်ကြိုက်သတ်မှတ်ချက်များ", @@ -586,12 +589,17 @@ "search.quick_action.open_url": "Mastodon တွင် URL ကိုဖွင့်မည်", "search.quick_action.status_search": "{x} နှင့် ကိုက်ညီသော ပို့စ်များ", "search.search_or_paste": "URL ရိုက်ထည့်ပါ သို့မဟုတ် ရှာဖွေပါ", + "search_popout.full_text_search_disabled_message": "{domain} တွင် မရနိုင်ပါ။", + "search_popout.language_code": "ISO ဘာသာစကားကုဒ်", + "search_popout.options": "ရွေးချယ်ထားသည်များ ရှာဖွေရန်", "search_popout.quick_actions": "အမြန်လုပ်ဆောင်မှုများ", "search_popout.recent": "လတ်တလော ရှာဖွေမှုများ", + "search_popout.user": "အသုံးပြုသူ", "search_results.accounts": "စာမျက်နှာ", "search_results.all": "အားလုံး", "search_results.hashtags": "ဟက်ရှ်တက်များ", "search_results.nothing_found": "ရှာဖွေလိုသောအရာမရှိပါ", + "search_results.see_all": "အားလုံးကို ကြည့်ရန်", "search_results.statuses": "ပို့စ်တင်မယ်", "search_results.title": "{q} ကို ရှာပါ", "server_banner.about_active_users": "ပြီးခဲ့သည့် ရက်ပေါင်း ၃၀ အတွင်း ဤဆာဗာကို အသုံးပြုသူများ (လအလိုက် လက်ရှိအသုံးပြုသူများ)", diff --git a/app/javascript/mastodon/locales/sk.json b/app/javascript/mastodon/locales/sk.json index 92846912fe..6c08f899a4 100644 --- a/app/javascript/mastodon/locales/sk.json +++ b/app/javascript/mastodon/locales/sk.json @@ -581,6 +581,7 @@ "search_results.all": "Všetky", "search_results.hashtags": "Haštagy", "search_results.nothing_found": "Pre tieto výrazy nemožno nič nájsť", + "search_results.see_all": "Ukáž všetky", "search_results.statuses": "Príspevky", "search_results.title": "Hľadaj {q}", "server_banner.active_users": "aktívni užívatelia", @@ -599,6 +600,7 @@ "status.copy": "Skopíruj odkaz na príspevok", "status.delete": "Zmazať", "status.detailed_status": "Podrobný náhľad celej konverzácie", + "status.direct": "Spomeň @{name} v súkromí", "status.direct_indicator": "Súkromné spomenutie", "status.edit": "Uprav", "status.edited": "Upravené {date}", diff --git a/app/javascript/mastodon/locales/sq.json b/app/javascript/mastodon/locales/sq.json index b8401805dd..2e908fdc5b 100644 --- a/app/javascript/mastodon/locales/sq.json +++ b/app/javascript/mastodon/locales/sq.json @@ -341,6 +341,7 @@ "keyboard_shortcuts.direct": "që të hapni shtyllën e përmendjeve private", "keyboard_shortcuts.down": "Për zbritje poshtë nëpër listë", "keyboard_shortcuts.enter": "Për hapje postimi", + "keyboard_shortcuts.favourite": "I vini shenjë postimit si të parapëlqyer", "keyboard_shortcuts.favourites": "Hapni listë të parapëlqyerish", "keyboard_shortcuts.federated": "Për hapje rrjedhe kohore të të federuarave", "keyboard_shortcuts.heading": "Shkurtore tastiere", @@ -629,6 +630,7 @@ "status.edited": "Përpunuar më {date}", "status.edited_x_times": "Përpunuar {count, plural, one {{count} herë} other {{count} herë}}", "status.embed": "Trupëzim", + "status.favourite": "I vini shenjë si të parapëlqyer", "status.filter": "Filtroje këtë postim", "status.filtered": "I filtruar", "status.hide": "Fshihe postimin", diff --git a/app/javascript/mastodon/locales/vi.json b/app/javascript/mastodon/locales/vi.json index 8a37d5bd53..e5cdf0d619 100644 --- a/app/javascript/mastodon/locales/vi.json +++ b/app/javascript/mastodon/locales/vi.json @@ -12,7 +12,7 @@ "about.powered_by": "Mạng xã hội liên hợp {mastodon}", "about.rules": "Nội quy máy chủ", "account.account_note_header": "Ghi chú", - "account.add_or_remove_from_list": "Thêm vào danh sách", + "account.add_or_remove_from_list": "Sửa danh sách", "account.badges.bot": "Bot", "account.badges.group": "Nhóm", "account.block": "Chặn @{name}", @@ -47,7 +47,7 @@ "account.locked_info": "Đây là tài khoản riêng tư. Chủ tài khoản tự mình xét duyệt các yêu cầu theo dõi.", "account.media": "Media", "account.mention": "Nhắc đến @{name}", - "account.moved_to": "{name} đã chuyển sang máy chủ khác:", + "account.moved_to": "{name} đã chuyển sang máy chủ khác", "account.mute": "Ẩn @{name}", "account.mute_notifications_short": "Ẩn thông báo", "account.mute_short": "Ẩn", @@ -101,7 +101,7 @@ "bundle_modal_error.close": "Đóng", "bundle_modal_error.message": "Đã có lỗi xảy ra trong khi tải nội dung này.", "bundle_modal_error.retry": "Thử lại", - "closed_registrations.other_server_instructions": "Vì Mastodon liên hợp nên bạn có thể tạo tài khoản trên máy chủ khác và vẫn tương tác với máy chủ này.", + "closed_registrations.other_server_instructions": "Tạo tài khoản trên máy chủ khác và vẫn tương tác với máy chủ này.", "closed_registrations_modal.description": "{domain} hiện tắt đăng ký, nhưng hãy lưu ý rằng bạn không cần một tài khoản riêng trên {domain} để sử dụng Mastodon.", "closed_registrations_modal.find_another_server": "Tìm máy chủ khác", "closed_registrations_modal.preamble": "Mastodon liên hợp nên bất kể bạn tạo tài khoản ở đâu, bạn cũng sẽ có thể theo dõi và tương tác với mọi người trên máy chủ này. Bạn thậm chí có thể tự mở máy chủ!", @@ -380,8 +380,8 @@ "lists.edit": "Sửa danh sách", "lists.edit.submit": "Thay đổi tiêu đề", "lists.exclusive": "Ẩn những tút này khỏi bảng tin", - "lists.new.create": "Tạo danh sách mới", - "lists.new.title_placeholder": "Tên danh sách mới", + "lists.new.create": "Tạo mới", + "lists.new.title_placeholder": "Tên danh sách", "lists.replies_policy.followed": "Người theo dõi", "lists.replies_policy.list": "Người trong danh sách", "lists.replies_policy.none": "Không ai", @@ -437,23 +437,23 @@ "notifications.clear_confirmation": "Bạn thật sự muốn xóa vĩnh viễn tất cả thông báo của mình?", "notifications.column_settings.admin.report": "Báo cáo mới:", "notifications.column_settings.admin.sign_up": "Người mới tham gia:", - "notifications.column_settings.alert": "Thông báo trên máy tính", + "notifications.column_settings.alert": "Báo trên máy tính", "notifications.column_settings.favourite": "Lượt thích:", "notifications.column_settings.filter_bar.advanced": "Toàn bộ", "notifications.column_settings.filter_bar.category": "Phân loại", "notifications.column_settings.filter_bar.show_bar": "Hiện bộ lọc", - "notifications.column_settings.follow": "Người theo dõi mới:", - "notifications.column_settings.follow_request": "Yêu cầu theo dõi mới:", + "notifications.column_settings.follow": "Người theo dõi:", + "notifications.column_settings.follow_request": "Yêu cầu theo dõi:", "notifications.column_settings.mention": "Lượt nhắc đến:", "notifications.column_settings.poll": "Kết quả bình chọn:", "notifications.column_settings.push": "Thông báo đẩy", - "notifications.column_settings.reblog": "Lượt đăng lại mới:", - "notifications.column_settings.show": "Hiện trên thanh bên", - "notifications.column_settings.sound": "Kèm âm thanh", + "notifications.column_settings.reblog": "Lượt đăng lại:", + "notifications.column_settings.show": "Báo trên thanh bên", + "notifications.column_settings.sound": "Kèm âm báo", "notifications.column_settings.status": "Tút mới:", "notifications.column_settings.unread_notifications.category": "Thông báo chưa đọc", "notifications.column_settings.unread_notifications.highlight": "Nổi bật thông báo chưa đọc", - "notifications.column_settings.update": "Lượt sửa:", + "notifications.column_settings.update": "Sửa tút:", "notifications.filter.all": "Toàn bộ", "notifications.filter.boosts": "Đăng lại", "notifications.filter.favourites": "Lượt thích", @@ -634,8 +634,8 @@ "status.filter": "Lọc tút này", "status.filtered": "Bộ lọc", "status.hide": "Ẩn tút", - "status.history.created": "{name} đăng {date} trước", - "status.history.edited": "{name} đã sửa {date} trước", + "status.history.created": "{name} đăng {date}", + "status.history.edited": "{name} đã sửa {date}", "status.load_more": "Tải thêm", "status.media.open": "Nhấn để mở", "status.media.show": "Nhấn để xem", @@ -687,7 +687,7 @@ "timeline_hint.resources.follows": "Đang theo dõi", "timeline_hint.resources.statuses": "Tút cũ hơn", "trends.counter_by_accounts": "{count, plural, other {{count} lượt}} dùng trong {days, plural, other {{days} ngày}} qua", - "trends.trending_now": "Thịnh hành", + "trends.trending_now": "Xu hướng", "ui.beforeunload": "Bản nháp của bạn sẽ bị mất nếu bạn thoát khỏi Mastodon.", "units.short.billion": "{count}B", "units.short.million": "{count}M", diff --git a/app/javascript/mastodon/locales/zh-TW.json b/app/javascript/mastodon/locales/zh-TW.json index b28eca7a7e..a6694b21df 100644 --- a/app/javascript/mastodon/locales/zh-TW.json +++ b/app/javascript/mastodon/locales/zh-TW.json @@ -8,7 +8,7 @@ "about.domain_blocks.silenced.title": "已受限", "about.domain_blocks.suspended.explanation": "來自此伺服器的資料都不會被處理、儲存或交換,也無法與此伺服器上的使用者互動或交流。", "about.domain_blocks.suspended.title": "已停權", - "about.not_available": "無法在本伺服器上使用此資訊。", + "about.not_available": "無法於本伺服器上使用此資訊。", "about.powered_by": "由 {mastodon} 提供的去中心化社群媒體", "about.rules": "伺服器規則", "account.account_note_header": "備註", @@ -464,9 +464,9 @@ "notifications.grant_permission": "授予權限", "notifications.group": "{count} 條通知", "notifications.mark_as_read": "將所有通知都標記為已讀", - "notifications.permission_denied": "由於之前已拒絕瀏覽器請求,因此桌面通知不可用", + "notifications.permission_denied": "由於之前已拒絕瀏覽器請求,因此無法使用桌面通知", "notifications.permission_denied_alert": "由於之前瀏覽器權限被拒絕,無法啟用桌面通知", - "notifications.permission_required": "由於尚未授予所需的權限,所以桌面通知不可用。", + "notifications.permission_required": "由於尚未授予所需的權限,因此無法使用桌面通知。", "notifications_permission_banner.enable": "啟用桌面通知", "notifications_permission_banner.how_to_control": "啟用桌面通知以在 Mastodon 沒有開啟的時候接收通知。在已經啟用桌面通知的時候,您可以透過上面的 {icon} 按鈕準確的控制哪些類型的互動會產生桌面通知。", "notifications_permission_banner.title": "不要錯過任何東西!", @@ -590,7 +590,7 @@ "search.quick_action.open_url": "於 Mastodon 中開啟連結", "search.quick_action.status_search": "符合的嘟文 {x}", "search.search_or_paste": "搜尋或輸入網址", - "search_popout.full_text_search_disabled_message": "{domain} 上不可用。", + "search_popout.full_text_search_disabled_message": "{domain} 上無法使用。", "search_popout.language_code": "ISO 語言代碼 (ISO language code)", "search_popout.options": "搜尋選項", "search_popout.quick_actions": "快捷操作", diff --git a/app/javascript/mastodon/reducers/search.js b/app/javascript/mastodon/reducers/search.js index 904e351857..72835eb917 100644 --- a/app/javascript/mastodon/reducers/search.js +++ b/app/javascript/mastodon/reducers/search.js @@ -14,6 +14,7 @@ import { SEARCH_SHOW, SEARCH_EXPAND_REQUEST, SEARCH_EXPAND_SUCCESS, + SEARCH_EXPAND_FAIL, SEARCH_HISTORY_UPDATE, } from '../actions/search'; @@ -54,6 +55,7 @@ export default function search(state = initialState, action) { map.set('type', action.searchType); }); case SEARCH_FETCH_FAIL: + case SEARCH_EXPAND_FAIL: return state.set('isLoading', false); case SEARCH_FETCH_SUCCESS: return state.withMutations(map => { @@ -68,10 +70,10 @@ export default function search(state = initialState, action) { map.set('isLoading', false); }); case SEARCH_EXPAND_REQUEST: - return state.set('type', action.searchType); + return state.set('type', action.searchType).set('isLoading', true); case SEARCH_EXPAND_SUCCESS: const results = action.searchType === 'hashtags' ? ImmutableOrderedSet(fromJS(action.results.hashtags)) : action.results[action.searchType].map(item => item.id); - return state.updateIn(['results', action.searchType], list => list.union(results)); + return state.updateIn(['results', action.searchType], list => list.union(results)).set('isLoading', false); case SEARCH_HISTORY_UPDATE: return state.set('recent', ImmutableOrderedSet(fromJS(action.recent))); default: diff --git a/app/lib/request.rb b/app/lib/request.rb index fa0e3472f6..5f128af734 100644 --- a/app/lib/request.rb +++ b/app/lib/request.rb @@ -68,26 +68,13 @@ class Request # about 15s in total TIMEOUT = { connect_timeout: 5, read_timeout: 10, write_timeout: 10, read_deadline: 30 }.freeze - # Workaround for overly-eager decoding of percent-encoded characters in Addressable::URI#normalized_path - # https://github.com/sporkmonger/addressable/issues/366 - URI_NORMALIZER = lambda do |uri| - uri = HTTP::URI.parse(uri) - - HTTP::URI.new( - scheme: uri.normalized_scheme, - authority: uri.normalized_authority, - path: Addressable::URI.normalize_path(encode_non_ascii(uri.path)).presence || '/', - query: encode_non_ascii(uri.query) - ) - end - include RoutingHelper def initialize(verb, url, **options) raise ArgumentError if url.blank? @verb = verb - @url = URI_NORMALIZER.call(url) + @url = Addressable::URI.parse(url).normalize @http_client = options.delete(:http_client) @allow_local = options.delete(:allow_local) @options = options.merge(socket_class: use_proxy? || @allow_local ? ProxySocket : Socket) @@ -151,14 +138,8 @@ class Request %w(http https).include?(parsed_url.scheme) && parsed_url.host.present? end - NON_ASCII_PATTERN = /[^\x00-\x7F]+/ - - def encode_non_ascii(str) - str&.gsub(NON_ASCII_PATTERN) { |substr| CGI.escape(substr.encode(Encoding::UTF_8)) } - end - def http_client - HTTP.use(:auto_inflate).use(normalize_uri: { normalizer: URI_NORMALIZER }).follow(max_hops: 3) + HTTP.use(:auto_inflate).follow(max_hops: 3) end end diff --git a/app/lib/tag_manager.rb b/app/lib/tag_manager.rb index f1b61ff4fd..c1bd2973ed 100644 --- a/app/lib/tag_manager.rb +++ b/app/lib/tag_manager.rb @@ -7,18 +7,18 @@ class TagManager include RoutingHelper def web_domain?(domain) - domain.nil? || domain.delete('/').casecmp(Rails.configuration.x.web_domain).zero? + domain.nil? || domain.delete_suffix('/').casecmp(Rails.configuration.x.web_domain).zero? end def local_domain?(domain) - domain.nil? || domain.delete('/').casecmp(Rails.configuration.x.local_domain).zero? + domain.nil? || domain.delete_suffix('/').casecmp(Rails.configuration.x.local_domain).zero? end def normalize_domain(domain) return if domain.nil? uri = Addressable::URI.new - uri.host = domain.delete('/') + uri.host = domain.delete_suffix('/') uri.normalized_host end diff --git a/app/services/translate_status_service.rb b/app/services/translate_status_service.rb index c2b40433ed..9ad146ae7d 100644 --- a/app/services/translate_status_service.rb +++ b/app/services/translate_status_service.rb @@ -75,7 +75,9 @@ class TranslateStatusService < BaseService case source when :content - status_translation.content = unwrap_emoji_shortcodes(translation.text).to_html + node = unwrap_emoji_shortcodes(translation.text) + Sanitize.node!(node, Sanitize::Config::MASTODON_STRICT) + status_translation.content = node.to_html when :spoiler_text status_translation.spoiler_text = unwrap_emoji_shortcodes(translation.text).content when Poll::Option diff --git a/app/views/admin/account_warnings/_account_warning.html.haml b/app/views/admin/account_warnings/_account_warning.html.haml index 0306351857..85bac789f7 100644 --- a/app/views/admin/account_warnings/_account_warning.html.haml +++ b/app/views/admin/account_warnings/_account_warning.html.haml @@ -5,7 +5,7 @@ = fa_icon 'warning' .log-entry__content .log-entry__title - = t(account_warning.action, scope: 'admin.strikes.actions', name: content_tag(:span, account_warning.account.username, class: 'username'), target: content_tag(:span, account_warning.target_account.pretty_acct, class: 'target')).html_safe + = t(account_warning.action, scope: 'admin.strikes.actions', name: content_tag(:span, account_warning.account ? account_warning.account.username : I18n.t('admin.action_logs.deleted_account'), class: 'username'), target: content_tag(:span, account_warning.target_account.pretty_acct, class: 'target')).html_safe .log-entry__timestamp %time.formatted{ datetime: account_warning.created_at.iso8601 } = l(account_warning.created_at) diff --git a/config/locales/ar.yml b/config/locales/ar.yml index 741ebc60ff..f8c74207de 100644 --- a/config/locales/ar.yml +++ b/config/locales/ar.yml @@ -797,6 +797,9 @@ ar: branding: preamble: العلامة التجارية لخادمك الخاص تميزه عن الخوادم الأخرى في الشبكة. يمكن عرض هذه المعلومات عبر مجموعة متنوعة من البيئات، مثل واجهة الويب لماستدون، في التطبيقات الأصلية، في معاينات الروابط على مواقع الويب الأخرى وضمن تطبيقات الرسائل، وما إلى ذلك. ولهذا السبب، من الأفضل إبقاء هذه المعلومات واضحة وقصيرة وموجزة. title: العلامة + captcha_enabled: + desc_html: ويعتمد هذا على نصوص برمجية خارجية من hCaptcha، والتي قد تكون مصدر قلق يتعلق بالأمان والخصوصية. بالإضافة إلى ذلك، قد يؤدي ذلك إلى جعل عملية التسجيل أقل سهولة بالنسبة لبعض الأشخاص (وخاصة المعاقين). لهذه الأسباب، يرجى النظر في تدابير بديلة مثل التسجيل على أساس الموافقة أو على أساس الدعوة. + title: مطالبة المستخدمين الجدد بحل اختبار CAPTCHA لتأكيد حساباتهم content_retention: preamble: التحكم في كيفية تخزين المحتوى الذي ينشئه المستخدم في ماستدون. title: الاحتفاظ بالمحتوى @@ -826,6 +829,7 @@ ar: open: يمكن للجميع إنشاء حساب security: authorized_fetch: يتطلّب المصادقة مِن الخوادم الفديرالية + authorized_fetch_hint: إن طلب المصادقة من الخوادم الموحدة يتيح تنفيذًا أكثر صرامة للكتل على مستوى المستخدم وعلى مستوى الخادم. ومع ذلك، يأتي هذا على حساب عقوبة الأداء، ويقلل من مدى وصول ردودك، وقد يؤدي إلى حدوث مشكلات في التوافق مع بعض الخدمات الموحدة. بالإضافة إلى ذلك، لن يمنع هذا الجهات الفاعلة المخصصة من جلب منشوراتك وحساباتك العامة. authorized_fetch_overridden_hint: لا يُمكِنُكَ تغيير هذا الإعداد لأنه مفروض عبر مُتغيّر في البيئة. federation_authentication: إنفاذ التوثيق الفديرالي title: إعدادات الخادم @@ -919,6 +923,7 @@ ar: message_html: إعدادات خادم الويب الخاص بكم ليست على ما يرام. خصوصية مستخدميكم في خطر. upload_check_privacy_error_object_storage: action: تحقق هنا للمزيد من المعلومات + message_html: "تم تكوين مخزن الكائنات الخاص بك بشكل خاطئ. خصوصية المستخدمين في خطر." tags: review: حالة المراجعة updated_msg: تم تحديث إعدادات الوسوم بنجاح @@ -936,6 +941,13 @@ ar: no_link_selected: لم يطرأ أي تغيير على أي رابط بما أنه لم يتم اختيار أي واحد publishers: no_publisher_selected: لم يطرأ أي تغيير على أي ناشر بما أنه لم يتم اختيار أي واحد + shared_by_over_week: + few: "%{count} أشخاص أعادوا نشره خلال الأسبوع الماضي" + many: "%{count} شخصًا أعادوا نشره خلال الأسبوع الماضي" + one: شخص واحد أعاد نشره خلال الأسبوع الماضي + other: "%{count} شخص أعادوا نشره خلال الأسبوع الماضي" + two: شخصان أعادا نشره خلال الأسبوع الماضي + zero: لا أحد أعاد نشره خلال الأسبوع الماضي title: الروابط المتداولة usage_comparison: تمت مشاركته %{today} مرات اليوم، مقارنة بـ %{yesterday} بالأمس not_allowed_to_trend: غير مسموح ظهوره في المتداولة @@ -1008,6 +1020,13 @@ ar: empty: ليس لديك أي نقاط نهاية ويب هوك تم تكوينها بعد. enable: تشغيل enabled: نشِط + enabled_events: + few: تم تفعيل %{count} أحداث + many: تم تفعيل %{count} حدثًا + one: تم تفعيل حدث واحد + other: تم تفعيل %{count} حدث + two: تم تفعيل حدثين + zero: لم يتم تفعيل أي حدث events: الأحداث new: رابط ويب جديد rotate_secret: تغيير الرمز @@ -1311,6 +1330,13 @@ ar: other: "%{count} منشور" two: "%{count} منشوران اثنان" zero: "%{count} منشورات" + statuses_long: + few: "%{count} منشورات فردية مخفية" + many: "%{count} منشورًا فرديا مخفيا" + one: منشور فردي مخفي واحد + other: "%{count} منشور فردي مخفي" + two: منشوران فرديان مخفيان + zero: لا منشورات فردية مخفية title: عوامل التصفية new: save: حفظ عامل التصفية الجديد @@ -1357,7 +1383,19 @@ ar: overwrite: إعادة الكتابة overwrite_long: استبدال التسجيلات الحالية بالجديدة overwrite_preambles: + blocking_html: أنت على وشك استبدال قائمة الحظر بما يصل إلى %{total_items} من الحسابات من %{filename}. + bookmarks_html: أنت على وشك استبدال إشاراتك المرجعية بما يصل إلى %{total_items} من المشاركات من %{filename}. + domain_blocking_html: أنت على وشك إرشاداتك المرجعية بما يصل إلى %{total_items} من المشاركات من %{filename}. + following_html: أنت على وشك متابعة ما يصل إلى %{total_items} من الحسابات من %{filename} والتوقف عن متابعة أي شخص آخر. lists_html: إنّك بصدد استبدال قوائمك بمحتوى مِلَفّ %{filename}. ما يُقارِب %{total_items} حسابًا سوف تُضاف إلى قوائم جديدة. + muting_html: أنت على وشك استبدال قائمة الحسابات الصامتة بما يصل إلى %{total_items} من الحسابات من %{filename}. + preambles: + blocking_html: أنت على وشك حظر ما يصل إلى %{total_items} من الحسابات من %{filename}. + bookmarks_html: أنت على وشك إضافة ما يصل إلى %{total_items} من المشاركات من %{filename} إلى إشاراتك المرجعية. + domain_blocking_html: أنت على وشك حظر ما يصل إلى %{total_items} من النطاقات من %{filename}. + following_html: أنت على وشك متابعة ما يصل إلى %{total_items} من الحسابات من %{filename}. + lists_html: أنت على وشك إضافة ما يصل إلى %{total_items} حسابات من %{filename} إلى قوائمك. سيتم إنشاء قوائم جديدة في حالة عدم وجود قائمة للإضافة إليها. + muting_html: أنت على وشك تجاهل ما يصل إلى %{total_items} من الحسابات من %{filename}. preface: بإمكانك استيراد بيانات قد قُمتَ بتصديرها مِن مثيل خادم آخَر، كقوائم المستخدِمين الذين كنتَ تتابِعهم أو قُمتَ بحظرهم. recent_imports: الاستيرادات الحديثة states: @@ -1431,6 +1469,7 @@ ar: unsubscribe: action: نعم، ألغِ الاشتراك complete: غير مشترك + confirmation_html: هل أنت متأكد أنك تريد إلغاء الاشتراك في تلقي %{type} لـ Mastodon على %{domain} إلى بريدك الإلكتروني على %{email}؟ يمكنك دائمًا إعادة الاشتراك من إعدادات إشعارات البريد الإلكتروني. emails: notification_emails: favourite: إشعارات رسائل البريد الخاصة بالمفضلة @@ -1438,6 +1477,7 @@ ar: follow_request: رسائل البريد الإلكترونية الخاصة بطلبات المتابعة mention: إشعارات رسائل البريد عندما يَذكُرك أحدهم reblog: رسائل البريد الخاصة بالمنشورات المعاد نشرها + resubscribe_html: إذا قمت بإلغاء الاشتراك عن طريق الخطأ، يمكنك إعادة الاشتراك من إعدادات الإشعارات في بريدك الإلكتروني. success_html: لن تتلقّ بعد الآن %{type} لماستدون مِن %{domain} على بريدك الإلكتروني %{email}. title: إلغاء الاشتراك media_attachments: @@ -1566,8 +1606,11 @@ ar: privacy: hint_html: "قم بتخصيص الطريقة التي تريد بها أن يُكتَشَف ملفك الشخصي ومنشوراتك. يمكن لمجموعة متنوعة من الميزات في Mastodon أن تساعدك في الوصول إلى جمهور أوسع عند تفعيلها. خذ بعض الوقت لمراجعة هذه الإعدادات للتأكد من أنها تناسب حالة الاستخدام الخاصة بك." privacy: الخصوصية + privacy_hint_html: تحكم في مقدار ما ترغب في الكشف عنه لصالح الآخرين. يكتشف الأشخاص الملفات الشخصية المثيرة والتطبيقات الرائعة من خلال تصفح متابعات الأشخاص الآخرين ورؤية التطبيقات التي ينشرونها، ولكن قد تفضل الاحتفاظ بها مخفية. reach: الوصول + reach_hint_html: تحكم في ما إذا كنت ترغب في أن يكتشفك ويتابعك أشخاص جدد. هل ترغب في أن تظهر منشوراتك على شاشة الاستكشاف؟ هل ترغب في أن يرى الأشخاص الآخرون اقتراحات المتابعة الخاصة بك؟ هل ترغب في قبول جميع المتابعين الجدد تلقائيًا، أم ترغب في التحكّم التفصيلي على كل واحد منهم؟ search: البحث + search_hint_html: تحكم في كيفية العثور عليك. هل ترغب في أن يجد الناس معلوماتك بناءً على ما نشرته علنيًا؟ هل ترغب في أن يمكن للأشخاص خارج منصة Mastodon العثور على ملفك الشخصي عند البحث على الويب؟ يرجى مراعاة أنه لا يمكن ضمان استبعاد تام من جميع محركات البحث للمعلومات العامة. title: الخصوصية والوصول إلى الجمهور privacy_policy: title: سياسة الخصوصية @@ -1802,6 +1845,7 @@ ar: default: "%b %d, %Y, %H:%M" month: "%b %Y" time: "%H:%M" + with_time_zone: "%b %d %Y، %H:%M %Z" translation: errors: quota_exceeded: تم تجاوز حصة استخدام خدمة التَّرْجَمَةً على نطاق الخادم. @@ -1891,7 +1935,9 @@ ar: seamless_external_login: لقد قمت بتسجيل الدخول عبر خدمة خارجية، إنّ إعدادات الكلمة السرية و البريد الإلكتروني غير متوفرة. signed_in_as: 'تم تسجيل دخولك بصفة:' verification: + extra_instructions_html: نصيحة: يمكن أن يكون الرابط الموجود على موقع الويب الخاص بك غير مرئي. الجزء المهم هو rel="me" الذي يمنع انتحال الهوية على مواقع الويب ذات المحتوى الذي ينشئه المستخدم. يمكنك أيضًا استخدام علامة link في رأس الصفحة بدلاً من a، ولكن يجب أن يكون HTML قابلاً للوصول دون تنفيذ JavaScript. here_is_how: إليك كيف ذلك + hint_html: "التحقق من هويتك على Mastodon متاح للجميع. بناءً على معايير الويب المفتوحة، الآن ودائمًا مجانًا. كل ما تحتاجه هو موقع ويب شخصي يتعرف الناس مِن خلاله عليك. عندما تقوم بربط هذا الموقع بملفك الشخصي، سنتحقق من أن الموقع يشير إلى ملفك الشخصي ونعرض عليه علامة بصرية." instructions_html: قم بنسخ ولصق التعليمة البرمجية أدناه في شفرة HTML لموقعك الخاص على الويب. ثم أضف عنوان موقع الويب الخاص بك إلى أحد الحقول الإضافية في ملفك التعريفي عبر لسان "تعديل الملف التعريفي" ثم احفظ التغييرات. verification: التحقق verified_links: روابطك التي تم التحقق منها diff --git a/config/locales/be.yml b/config/locales/be.yml index 4d7d233d87..0f9654691e 100644 --- a/config/locales/be.yml +++ b/config/locales/be.yml @@ -315,6 +315,7 @@ be: unpublish: Зняць з публікацыі unpublished_msg: Аб'ява паспяхова схована! updated_msg: Аб'ява паспяхова адноўлена! + critical_update_pending: Чакаецца крытычнае абнаўленне custom_emojis: assign_category: Прызначыць катэгорыю by_domain: Дамен @@ -798,11 +799,22 @@ be: approved: Для рэгістрацыі патрабуецца пацвярджэнне none: Нікому не магчыма зарэгістравацца open: Любому магчыма зарэгістравацца + security: + authorized_fetch: Патрабаваць аўтэнтыфікацыю ад федэратыўных сервераў + authorized_fetch_overridden_hint: Вы не можаце змяніць гэты параметр, паколькі ён перавызначаны зменнай асяроддзя. title: Налады сервера site_uploads: delete: Выдаліць запампаваны файл destroyed_msg: Загрузка сайту паспяхова выдалена! software_updates: + critical_update: Крытычна - зрабіце абнаўленне як мага хутчэй + documentation_link: Даведацца больш + release_notes: Журнал змен + title: Даступныя абнаўленні + type: Тып + types: + major: Буйны рэліз + minor: Малы рэліз version: Версія statuses: account: Аўтар @@ -868,6 +880,11 @@ be: message_html: Вы не вызначылі ніякіх правілаў сервера. sidekiq_process_check: message_html: Не працуе працэс Sidekiq для %{value} чаргі. Калі ласка праверце вашу канфігурацыю Sidekiq + software_version_critical_check: + action: Прагледзець даступныя абнаўленні + message_html: Даступна крытычнае абнаўленне Mastodon, калі ласка, зрабіце абнаўленне як мага хутчэй. + software_version_patch_check: + action: Прагледзець даступныя абнаўленні upload_check_privacy_error: action: Для падрабязнасцей націсніце тут message_html: "Ваш сервер не наладжаны. Прыватнасць карыстальнікаў пад пагрозай." @@ -989,6 +1006,8 @@ be: body: "%{target} абскарджвае рашэнне мадэратара %{action_taken_by} ад %{date}, якая была %{type}. Яны напісалі:" next_steps: Вы можаце ўхваліць апеляцыю каб адмяніць рашэнне мадэратараў ці ігнараваць яе. subject: "%{username} абскарджвае рашэнне мадэратараў на %{instance}" + new_critical_software_updates: + subject: Даступны крытычныя абнаўленні Mastodon для %{instance}! new_pending_account: body: Падрабязнасці новага ўліковага запісу прыведзены ніжэй. Вы можаце зацвердзіць або адхіліць гэтую заяўку. subject: Новы ўліковы запіс для разгляду ў %{instance} (%{username}) @@ -996,6 +1015,9 @@ be: body: "%{reporter} паскардзіўся на %{target}" body_remote: Нехта з %{domain} паскардзіўся на %{target} subject: Новая скарга на %{instance} (#%{id}) + new_software_updates: + body: Выйшлі новыя версіі Mastodon, магчыма, вам варта абнавіцца! + subject: Новыя версіі Mastodon даступныя для %{instance}! new_trends: body: 'Гэтыя элементы трэба праверыць, перш чым публікаваць:' new_trending_links: @@ -1774,6 +1796,7 @@ be: default: "%d.%m.%Y %H:%M" month: "%b %Y" time: "%H:%M" + with_time_zone: "%b %d, %Y, %H:%M %Z" translation: errors: quota_exceeded: Сервер перавысіў квоту на выкарыстанне службы перакладу. diff --git a/config/locales/de.yml b/config/locales/de.yml index ce53ec48aa..c41b5aa18a 100644 --- a/config/locales/de.yml +++ b/config/locales/de.yml @@ -77,14 +77,14 @@ de: invite_request_text: Begründung für das Beitreten invited_by: Eingeladen von ip: IP-Adresse - joined: Registriert + joined: Beigetreten location: all: Alle local: Lokal remote: Extern title: Herkunft login_status: Status - media_attachments: Medieninhalte + media_attachments: Medienanhänge memorialize: In Gedenkseite umwandeln memorialized: Gedenkseite memorialized_msg: "%{username} wurde erfolgreich in ein Gedenkseiten-Konto umgewandelt" @@ -167,7 +167,7 @@ de: view_domain: Übersicht für Domain anzeigen warn: Verwarnen web: Web - whitelisted: Auf der Whitelist + whitelisted: Für Föderation zugelassen action_logs: action_types: approve_appeal: Einspruch zulassen @@ -376,7 +376,7 @@ de: title: Einsprüche domain_allows: add_new: Föderation mit Domain erlauben - created_msg: Domain wurde erfolgreich zur Whitelist hinzugefügt + created_msg: Domain wurde erfolgreich für die Föderation zugelassen destroyed_msg: Domain wurde von der Föderation ausgeschlossen export: Exportieren import: Importieren @@ -404,7 +404,7 @@ de: create: Server einschränken hint: Die Einschränkung einer Domain wird nicht verhindern, dass Konteneinträge in der Datenbank erstellt werden. Es werden aber alle Moderationsmethoden rückwirkend und automatisch auf diese Konten angewendet. severity: - desc_html: "Stummschalten wird Beiträge von Konten unter dieser Domain für alle unsichtbar machen, die den Konten nicht folgen. Sperren wird alle Inhalte, Medien und Profildaten für die Konten dieser Domain von deinem Server entfernen. Verwende Kein, wenn du nur Medieninhalte ablehnen möchtest." + desc_html: "Stummschalten wird Beiträge von Konten unter dieser Domain für alle unsichtbar machen, die den Konten nicht folgen. Sperren wird alle Inhalte, Medien und Profildaten für die Konten dieser Domain von deinem Server entfernen. Verwende Kein, wenn du nur Mediendateien ablehnen möchtest." noop: Kein silence: Stummschaltung suspend: Sperren @@ -486,7 +486,7 @@ de: content_policies: comment: Interne Notiz 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 wählen, ob du eine Föderation mit dieser Domain gestattest. + limited_federation_mode_description_html: Du kannst auswählen, ob du eine Föderation mit dieser Domain erlaubst. policies: reject_media: Medien ablehnen reject_reports: Meldungen ablehnen @@ -532,7 +532,7 @@ de: total_followed_by_them: Gefolgt von denen total_followed_by_us: Gefolgt von uns total_reported: Beschwerden über sie - total_storage: Medieninhalte + total_storage: Medienanhänge totals_time_period_hint_html: Die unten angezeigten Summen enthalten Daten für alle Zeiten. invites: deactivate_all: Alle deaktivieren @@ -587,7 +587,7 @@ de: action_taken_by: Maßnahme ergriffen von actions: delete_description_html: Der gemeldete Beitrag wird gelöscht und die ergriffene Maßnahme wird aufgezeichnet, um dir bei zukünftigen Verstößen des gleichen Kontos zu helfen. - mark_as_sensitive_description_html: Die Medien in den gemeldeten Beiträgen werden mit einer Inhaltswarnung versehen und der Vorfall wird gesichert, um bei zukünftigen Verstößen desselben Kontos besser reagieren zu können. + mark_as_sensitive_description_html: Die Medien in den gemeldeten Beiträgen werden mit einer Inhaltswarnung versehen und der Vorfall wird vermerkt, um bei zukünftigen Verstößen desselben Kontos besser reagieren zu können. other_description_html: Weitere Optionen zur Steuerung des Kontoverhaltens und zur Anpassung der Kommunikation mit dem gemeldeten Konto. resolve_description_html: Es wird keine Maßnahme gegen das gemeldete Konto ergriffen und der Vorgang wird nicht aufgezeichnet – die Meldung wird hiermit geschlossen. silence_description_html: Das Konto wird nur für diejenigen sichtbar sein, die dem Konto bereits folgen oder es manuell suchen, was die Reichweite stark einschränkt. Kann jederzeit rückgängig gemacht werden. Alle Meldungen zu diesem Konto werden geschlossen. @@ -742,7 +742,7 @@ de: preamble: Das Branding deines Servers unterscheidet ihn von anderen Servern im Netzwerk. Diese Informationen können in einer Vielzahl von Umgebungen angezeigt werden, z. B. in der Weboberfläche von Mastodon, in nativen Anwendungen, in Linkvorschauen auf anderen Websites und in Messaging-Apps und so weiter. Aus diesem Grund ist es am besten, diese Informationen klar, kurz und prägnant zu halten. title: Branding captcha_enabled: - desc_html: Dies beruht auf externen Skripten von hCaptcha, die ein Sicherheits- und Datenschutzproblem darstellen könnten. Darüber hinaus kann das den Registrierungsprozess für manche Menschen (insbesondere für Menschen mit Behinderung) erheblich erschweren. Aus diesen Gründen solltest du alternative Maßnahmen wie Zulassungs- oder Einladungs-basierte Registrierungen in Erwägung ziehen. + desc_html: Dies beruht auf externen Skripten von hCaptcha, die ein Sicherheits- und Datenschutzproblem darstellen könnten. Darüber hinaus kann das den Registrierungsprozess für manche Menschen (insbesondere für Menschen mit Behinderung) erheblich erschweren. Aus diesen Gründen solltest du alternative Maßnahmen in Betracht ziehen, z. B. eine Registrierung basierend auf einer Einladung oder auf Genehmigungen. title: Neue Nutzer*innen müssen ein CAPTCHA lösen, um das Konto zu bestätigen content_retention: preamble: Lege fest, wie lange Inhalte von Nutzer*innen auf deinem Mastodon-Server gespeichert bleiben. @@ -980,7 +980,7 @@ de: subject: Kritische Mastodon-Updates sind für %{instance} verfügbar! new_pending_account: body: Die Details von diesem neuem Konto sind unten. Du kannst die Anfrage akzeptieren oder ablehnen. - subject: Neues Konto zur Überprüfung auf %{instance} verfügbar (%{username}) + subject: Neues Konto zum Überprüfen auf %{instance} verfügbar (%{username}) new_report: body: "%{reporter} hat %{target} gemeldet" body_remote: Jemand von %{domain} hat %{target} gemeldet @@ -1198,7 +1198,7 @@ de: content: Wir bitten um Verzeihung, aber etwas ist bei uns schiefgegangen. title: Diese Seite enthält einen Fehler '503': Die Seite konnte wegen eines temporären Serverfehlers nicht angezeigt werden. - noscript_html: Bitte aktiviere JavaScript, um das Webinterface von Mastodon zu verwenden. Alternativ kannst du auch eine der nativen Apps für Mastodon nutzen. + noscript_html: Bitte aktiviere JavaScript, um das Webinterface von Mastodon zu verwenden. Alternativ kannst du auch eine der nativen Apps für Mastodon verwenden. existing_username_validator: not_found: kann lokale Konten mit diesem Profilnamen nicht finden not_found_multiple: "%{usernames} konnten nicht gefunden werden" @@ -1399,9 +1399,9 @@ de: title: Abbestellen media_attachments: validations: - images_and_video: Es kann kein Video zu einem Beitrag hinzugefügt werden, der bereits Bilder enthält - not_ready: Dateien, die noch nicht verarbeitet wurden, können nicht hinzugefügt werden. Versuche es gleich noch einmal! - too_many: Mehr als vier Medien können nicht hinzugefügt werden + images_and_video: Es kann kein Video an einen Beitrag angehängt werden, der bereits Bilder enthält + not_ready: Dateien, die noch nicht verarbeitet wurden, können nicht angehängt werden. Versuche es gleich noch einmal! + too_many: Mehr als vier Dateien können nicht angehängt werden migrations: acct: umgezogen nach cancel: Weiterleitung beenden @@ -1487,9 +1487,9 @@ de: units: billion: Mrd. million: Mio. - quadrillion: Q + quadrillion: Brd. thousand: Tsd. - trillion: T + trillion: Bio. otp_authentication: code_hint: Gib den Code ein, den deine 2FA- bzw. TOTP-App generiert hat, um den Vorgang zu bestätigen description_html: Wenn du die Zwei-Faktor-Authentisierung (2FA) mit einer Authentifizierungs-App deines Smartphones aktivierst, benötigst du neben dem regulären Passwort zusätzlich auch den zeitbasierten Code der 2FA-App, um dich anmelden zu können. @@ -1699,7 +1699,7 @@ de: keep_direct: Private Nachrichten behalten keep_direct_hint: Löscht keinen deiner Beiträge, die nur für erwähnte Profile sichtbar sind keep_media: Beiträge mit Medien behalten - keep_media_hint: Löscht keinen deiner Beiträge mit Medieninhalten + keep_media_hint: Löscht keinen deiner Beiträge mit Medienanhängen keep_pinned: Angeheftete Beiträge behalten keep_pinned_hint: Löscht keinen deiner angehefteten Beiträge keep_polls: Umfragen behalten @@ -1751,7 +1751,7 @@ de: enabled: Zwei-Faktor-Authentisierung (2FA) ist aktiviert enabled_success: Zwei-Faktor-Authentisierung (2FA) erfolgreich aktiviert generate_recovery_codes: Wiederherstellungscodes erstellen - lost_recovery_codes: Wiederherstellungscodes erlauben es dir, wieder Zugang zu deinem Konto zu erlangen, falls du keinen Zugriff mehr auf die Zwei-Faktor-Authentisierung (2FA) oder den Sicherheitsschlüssel hast. Solltest du diese Wiederherstellungscodes verloren haben, kannst du sie hier neu generieren. Deine alten, bereits erstellten Wiederherstellungscodes werden dadurch ungültig. + lost_recovery_codes: Wiederherstellungscodes ermöglichen es dir, wieder Zugang zu deinem Konto zu erlangen, falls du keinen Zugriff mehr auf die Zwei-Faktor-Authentisierung (2FA) oder den Sicherheitsschlüssel hast. Solltest du diese Wiederherstellungscodes verloren haben, kannst du sie hier neu generieren. Deine alten, bereits erstellten Wiederherstellungscodes werden dadurch ungültig. methods: Methoden der Zwei-Faktor-Authentisierung (2FA) otp: Authentisierungs-App recovery_codes: Wiederherstellungscodes sichern @@ -1760,7 +1760,7 @@ de: webauthn: Sicherheitsschlüssel user_mailer: appeal_approved: - action: Gehe zu deinem Konto + action: Dein Konto aufrufen explanation: Der Einspruch gegen deinen Verstoß vom %{strike_date}, den du am %{appeal_date} eingereicht hast, wurde genehmigt. Dein Konto ist wieder in gutem Zustand. subject: Dein Einspruch vom %{date} wurde angenommen title: Einspruch angenommen @@ -1789,7 +1789,7 @@ de: delete_statuses: Einige deiner Beiträge haben gegen eine oder mehrere Serverregeln verstoßen und wurden daher von den Moderator*innen von %{instance} entfernt. disable: Du kannst dein Konto nicht mehr verwenden, aber dein Profil und deine anderen Daten bleiben erhalten. Du kannst eine Sicherung deiner Daten anfordern, die Kontoeinstellungen ändern oder dein Konto löschen. mark_statuses_as_sensitive: Ein oder mehrere deiner Beiträge wurden von den Moderator*innen von %{instance} mit einer Inhaltswarnung versehen. Das bedeutet, dass die Medien in den Beiträgen erst angeklickt werden müssen, bevor sie angezeigt werden. Beim Verfassen der nächsten Beiträge kannst du auch selbst eine Inhaltswarnung für hochgeladene Medien festlegen. - sensitive: Von nun an werden alle deine hochgeladenen Medieninhalte mit einer Inhaltswarnung versehen und hinter einer Warnung versteckt. + sensitive: Von nun an werden alle deine hochgeladenen Mediendateien mit einer Inhaltswarnung versehen und hinter einer Warnung versteckt. silence: Du kannst dein Konto weiterhin verwenden, aber nur Personen, die dir bereits folgen, sehen deine Beiträge auf diesem Server. Ebenso kannst du aus verschiedenen Suchfunktionen ausgeschlossen werden. Andere können dir jedoch weiterhin manuell folgen. suspend: Du kannst dein Konto nicht mehr verwenden und dein Profil und andere Daten sind nicht mehr verfügbar. Du kannst dich immer noch anmelden, um eine Sicherung deiner Daten anzufordern, bis die Daten innerhalb von 30 Tagen vollständig gelöscht wurden. Allerdings werden wir einige Daten speichern, um zu verhindern, dass du die Sperrung umgehst. reason: 'Begründung:' diff --git a/config/locales/doorkeeper.ar.yml b/config/locales/doorkeeper.ar.yml index 9391e74a2d..889c182a3f 100644 --- a/config/locales/doorkeeper.ar.yml +++ b/config/locales/doorkeeper.ar.yml @@ -177,7 +177,7 @@ ar: read:mutes: رؤية الحسابات التي كَتمتَها read:notifications: رؤية إشعاراتك الخاصة read:reports: رؤية إبلاغاتك - read:search: البحث مكانك + read:search: البحث نيابةً عنك read:statuses: رؤية كافة المنشورات write: تغيير كافة بيانات حسابك write:accounts: تعديل صفحتك التعريفية diff --git a/config/locales/doorkeeper.de.yml b/config/locales/doorkeeper.de.yml index 8bd4b16f49..cc7b88a282 100644 --- a/config/locales/doorkeeper.de.yml +++ b/config/locales/doorkeeper.de.yml @@ -132,7 +132,7 @@ de: follow: Folge ich, Stummschaltungen und Blockierungen follows: Folge ich lists: Listen - media: Medieninhalte + media: Medienanhänge mutes: Stummschaltungen notifications: Benachrichtigungen push: Push-Benachrichtigungen @@ -188,7 +188,7 @@ de: write:filters: Filter erstellen write:follows: Profilen folgen write:lists: Listen erstellen - write:media: Medieninhalte hochladen + write:media: Mediendateien hochladen write:mutes: Profile und Unterhaltungen stummschalten write:notifications: deine Benachrichtigungen löschen write:reports: andere Profile melden diff --git a/config/locales/doorkeeper.es-MX.yml b/config/locales/doorkeeper.es-MX.yml index 4d91b74af4..082d656bc5 100644 --- a/config/locales/doorkeeper.es-MX.yml +++ b/config/locales/doorkeeper.es-MX.yml @@ -184,7 +184,7 @@ es-MX: write:blocks: bloquear cuentas y dominios write:bookmarks: guardar estados como marcadores write:conversations: silenciar y eliminar conversaciones - write:favourites: marcar publicaciones como favoritas + write:favourites: publicaciones favoritas write:filters: crear filtros write:follows: seguir usuarios write:lists: crear listas diff --git a/config/locales/doorkeeper.sq.yml b/config/locales/doorkeeper.sq.yml index af6d6977da..308a5429a6 100644 --- a/config/locales/doorkeeper.sq.yml +++ b/config/locales/doorkeeper.sq.yml @@ -127,6 +127,7 @@ sq: bookmarks: Faqerojtës conversations: Biseda crypto: Fshehtëzim skaj-më-skaj + favourites: Të parapëlqyer filters: Filtra follow: Ndjekje, Heshtime dhe Bllokime follows: Ndjekje @@ -183,6 +184,7 @@ sq: write:blocks: të bllokojë llogari dhe përkatësi write:bookmarks: të faqeruajë gjendje write:conversations: heshtoni dhe fshini biseda + write:favourites: postime të parapëlqyer write:filters: të krijojë filtra write:follows: të ndjekë persona write:lists: të krijojë lista diff --git a/config/locales/doorkeeper.vi.yml b/config/locales/doorkeeper.vi.yml index d6e62d82b1..8375795273 100644 --- a/config/locales/doorkeeper.vi.yml +++ b/config/locales/doorkeeper.vi.yml @@ -5,7 +5,7 @@ vi: doorkeeper/application: name: Tên ứng dụng redirect_uri: URL chuyển hướng - scopes: Quyền hạn + scopes: Quyền website: Trang web ứng dụng errors: models: @@ -41,7 +41,7 @@ vi: empty: Bạn không có ứng dụng nào. name: Tên new: Ứng dụng mới - scopes: Quyền hạn + scopes: Quyền show: Xem title: Ứng dụng của bạn new: @@ -50,7 +50,7 @@ vi: actions: Hành động application_id: Mã Client callback_urls: Gọi lại URLs - scopes: Quyền hạn + scopes: Quyền secret: Bí ẩn của Client title: 'Ứng dụng: %{name}' authorizations: @@ -147,7 +147,7 @@ vi: application: title: Đăng nhập bằng OAuth scopes: - admin:read: đọc tất cả dữ liệu trên máy chủ + admin:read: đọc mọi dữ liệu trên máy chủ admin:read:accounts: đọc thông tin nhạy cảm của tất cả các tài khoản admin:read:canonical_email_blocks: đọc thông tin nhạy cảm của tất cả các khối email chuẩn admin:read:domain_allows: đọc thông tin nhạy cảm của tất cả các tên miền cho phép @@ -157,32 +157,32 @@ vi: admin:read:reports: đọc thông tin của các báo cáo và các tài khoản bị báo cáo admin:write: sửa đổi tất cả dữ liệu trên máy chủ admin:write:accounts: áp đặt hành động kiểm duyệt trên tài khoản - admin:write:canonical_email_blocks: thực hiện các hành động kiểm duyệt đối với chặn email - admin:write:domain_allows: thực hiện các hành động kiểm duyệt đối với các email cho phép - admin:write:domain_blocks: thực hiện các hành động kiểm duyệt đối với các tên miền chặn - admin:write:email_domain_blocks: thực hiện các hành động kiểm duyệt đối với các tên miền email chặn + admin:write:canonical_email_blocks: áp đặt kiểm duyệt đối với chặn email + admin:write:domain_allows: áp đặt kiểm duyệt đối với các email cho phép + admin:write:domain_blocks: áp đặt kiểm duyệt đối với các tên miền chặn + admin:write:email_domain_blocks: áp đặt kiểm duyệt đối với các tên miền email chặn admin:write:ip_blocks: áp đặt kiểm duyệt với các IP chặn admin:write:reports: áp đặt kiểm duyệt với các báo cáo crypto: dùng mã hóa đầu cuối follow: sửa đổi các mối quan hệ tài khoản - push: nhận thông báo đẩy của bạn - read: đọc tất cả dữ liệu tài khoản của bạn + push: nhận thông báo đẩy + read: đọc mọi dữ liệu tài khoản read:accounts: xem thông tin tài khoản - read:blocks: xem những người bạn chặn - read:bookmarks: xem những thứ bạn đã lưu + read:blocks: xem những người đã chặn + read:bookmarks: xem tút đã lưu read:favourites: xem lượt thích - read:filters: xem bộ lọc của bạn - read:follows: xem lượt theo dõi của bạn - read:lists: xem danh sách của bạn - read:mutes: xem những người bạn đã ẩn - read:notifications: xem thông báo của bạn + read:filters: xem bộ lọc + read:follows: xem những người theo dõi + read:lists: xem danh sách + read:mutes: xem những người đã ẩn + read:notifications: xem thông báo read:reports: xem báo cáo của bạn - read:search: thay mặt bạn tìm kiếm + read:search: tìm kiếm read:statuses: xem toàn bộ tút write: sửa đổi mọi dữ liệu tài khoản của bạn - write:accounts: sửa đổi trang hồ sơ của bạn + write:accounts: sửa đổi trang hồ sơ write:blocks: chặn người và máy chủ - write:bookmarks: sửa đổi những thứ bạn lưu + write:bookmarks: sửa đổi những tút lưu write:conversations: ẩn và xóa thảo luận write:favourites: thích tút write:filters: tạo bộ lọc @@ -190,6 +190,6 @@ vi: write:lists: tạo danh sách write:media: tải lên tập tin write:mutes: ẩn người và thảo luận - write:notifications: xóa thông báo của bạn + write:notifications: xóa thông báo write:reports: báo cáo người khác write:statuses: đăng tút diff --git a/config/locales/es-MX.yml b/config/locales/es-MX.yml index 65749996e9..542478f716 100644 --- a/config/locales/es-MX.yml +++ b/config/locales/es-MX.yml @@ -1521,13 +1521,13 @@ es-MX: posting_defaults: Configuración por defecto de publicaciones public_timelines: Líneas de tiempo públicas privacy: - hint_html: "Personaliza el descubrimiento de tu perfil y tus publicaciones. En Mastodon tienes distintas características que te ayudarán a alcanzar una mayor audiencia si las activas. Tómate un momento para revisar estas configuraciones y asegurarte de que cumplen tus necesidades." + hint_html: "Personaliza cómo te gustaría que tu perfil y tus publicaciones sean encontradas. En Mastodon tienes a tu disposición distintas características que pueden ayudarte a llegar a una audiencia más amplia cuando se encuentran activadas. Toma un momento para revisar estos ajustes para asegurarte si cumplen tus necesidades." privacy: Privacidad - privacy_hint_html: Controla cuánto deseas revelar a los demás. Las personas descubren perfiles y aplicaciones interesantes navegando por los seguidores de otras personas y viendo desde qué aplicaciones publican, pero puede que prefieras mantenerlo oculto. + privacy_hint_html: Controla cuánto quieres compartir para el beneficio de otros. Las personas descubren perfiles interesantes y aplicaciones geniales al navegar por los seguidores de otras personas y viendo desde cuáles aplicaciones publican, pero también puedes preferir mantenerlo oculto. reach: Alcance - reach_hint_html: Controla si quieres ser descubierto y seguido por nuevas personas. ¿Quieres que tus publicaciones aparezcan en la sección de Explorar? ¿Quieres que tu cuenta se recomiende a otras personas? ¿Quieres aceptar automáticamente a todos los nuevos seguidores o tener control sobre cada uno de ellos? + reach_hint_html: Controla si quieres ser descubierto y seguido por nuevas personas. ¿Quieres que tus publicaciones aparezcan en la pantalla de Explorar? ¿Quieres que otras personas te encuentren en sus recomendaciones de cuentas a seguir? ¿Quieres aceptar todos los nuevos seguidores automáticamente o controlar cada uno? search: Búsqueda - search_hint_html: Controla cómo quieres que te encuentren. ¿Quieres que otras personas te encuentren por lo que has publicado públicamente? ¿Quieres que las personas de fuera de Mastodon encuentren tu perfil al buscar en la web? Por favor, ten en cuenta que la exclusión total de todos los motores de búsqueda no puede ser garantizada para información pública. + search_hint_html: Controla cómo quieres ser encontrado. ¿Quieres que otras personas te encuentren por lo que has compartido públicamente? ¿Quieres que las personas afuera de Mastodon encuentren tu perfil al navegar por Internet? Por favor, toma en cuenta que la exclusión total de todos los motores de búsqueda no se puede garantizar para información pública. title: Privacidad y alcance privacy_policy: title: Política de Privacidad @@ -1741,8 +1741,8 @@ es-MX: with_time_zone: "%d de %b de %Y, %H:%M %Z" translation: errors: - quota_exceeded: Se ha sobrepasado la cuota de uso del servicio de traducción para todo el servidor. - too_many_requests: Ha habido demasiadas solicitudes al servicio de traducción recientemente. + quota_exceeded: Se ha excedido la cuota de uso del servicio de traducción en todo el servidor. + too_many_requests: Se han registrado muchas solicitudes al servicio de traducción recientemente. two_factor_authentication: add: Añadir disable: Deshabilitar diff --git a/config/locales/fr-QC.yml b/config/locales/fr-QC.yml index 3e35c1a745..b9605f3a6a 100644 --- a/config/locales/fr-QC.yml +++ b/config/locales/fr-QC.yml @@ -1528,7 +1528,7 @@ fr-QC: reach_hint_html: Contrôlez si vous souhaitez être découvert et suivi par de nouvelles personnes. Voulez-vous que vos publications apparaissent sur l’écran Explorer ? Voulez-vous que d’autres personnes vous voient dans leurs recommandations de suivi ? Souhaitez-vous approuver automatiquement tous les nouveaux abonnés ou avoir un contrôle granulaire sur chacun d’entre eux ? search: Recherche search_hint_html: Contrôlez la façon dont vous voulez être retrouvé. Voulez-vous que les gens vous trouvent selon ce que vous avez publié publiquement ? Voulez-vous que des personnes extérieures à Mastodon trouvent votre profil en faisant des recherches sur le web ? N’oubliez pas que l’exclusion totale de tous les moteurs de recherche ne peut être garantie pour les informations publiques. - title: Confidentialité et portée + title: Vie privée et visibilité privacy_policy: title: Politique de confidentialité reactions: diff --git a/config/locales/fr.yml b/config/locales/fr.yml index 4807cb2f2b..821ef39dbe 100644 --- a/config/locales/fr.yml +++ b/config/locales/fr.yml @@ -1528,7 +1528,7 @@ fr: reach_hint_html: Contrôlez si vous souhaitez être découvert et suivi par de nouvelles personnes. Voulez-vous que vos publications apparaissent sur l’écran Explorer ? Voulez-vous que d’autres personnes vous voient dans leurs recommandations de suivi ? Souhaitez-vous approuver automatiquement tous les nouveaux abonnés ou avoir un contrôle granulaire sur chacun d’entre eux ? search: Recherche search_hint_html: Contrôlez la façon dont vous voulez être retrouvé. Voulez-vous que les gens vous trouvent selon ce que vous avez publié publiquement ? Voulez-vous que des personnes extérieures à Mastodon trouvent votre profil en faisant des recherches sur le web ? N’oubliez pas que l’exclusion totale de tous les moteurs de recherche ne peut être garantie pour les informations publiques. - title: Confidentialité et portée + title: Vie privée et visibilité privacy_policy: title: Politique de confidentialité reactions: diff --git a/config/locales/ko.yml b/config/locales/ko.yml index 582036efc0..70b5645012 100644 --- a/config/locales/ko.yml +++ b/config/locales/ko.yml @@ -769,7 +769,7 @@ ko: delete: 업로드한 파일 삭제 destroyed_msg: 사이트 업로드를 성공적으로 삭제했습니다! software_updates: - critical_update: 긴급 — 빨리 업데이트 해주세요 + critical_update: 긴급 — 빠른 업데이트 요망 description: 최신 수정 사항과 기능을 활용하기 위해 Mastodon 설치를 최신 상태로 유지하기를 권장합니다. 더욱이, 때로는 보안 문제를 피하기 위해 Mastodon을 적절한 시점에 긴급 업데이트해야 하는 경우도 있습니다. 따라서 Mastodon은 30분마다 업데이트를 확인하며, 이메일 알림 환경설정에 따라 사용자에게 알려드립니다. documentation_link: 더 알아보기 release_notes: 릴리스 노트 @@ -778,7 +778,7 @@ ko: types: major: 메이저 릴리스 minor: 마이너 릴리스 - patch: 패치 릴리스 — 버그픽스이며 변경을 적용하기 쉽습니다 + patch: 패치 릴리스 — 버그픽스 그리고 변경점의 빠른 적용 version: 버전 statuses: account: 작성자 @@ -1442,7 +1442,7 @@ ko: subject: "%{name} 님의 멘션" title: 새 답글 poll: - subject: "%{name}의 투표가 종료되었습니다" + subject: "%{name}의 설문이 종료됨" reblog: body: '당신의 게시물을 %{name} 님이 부스트 했습니다:' subject: "%{name} 님이 내 게시물을 부스트 했습니다" @@ -1482,15 +1482,15 @@ ko: truncate: "…" polls: errors: - already_voted: 이미 투표에 참여하셨습니다 - duplicate_options: 중복된 항목이 있습니다 - duration_too_long: 너무 먼 미래입니다 - duration_too_short: 너무 가깝습니다 - expired: 투표가 이미 끝났습니다 - invalid_choice: 선택한 투표 항목이 존재하지 않습니다 - over_character_limit: 각각 %{max} 글자를 넘을 수 없습니다 - self_vote: 내가 만든 투표엔 투표 할 수 없습니다 - too_few_options: 한가지 이상의 항목을 포함해야 합니다 + already_voted: 이미 참여한 설문 + duplicate_options: 중복된 항목 있음 + duration_too_long: 지나치게 먼 미래 + duration_too_short: 너무 짧음 + expired: 이미 종료된 설문 + invalid_choice: 선택한 투표 항목이 존재하지 않음 + over_character_limit: 각 문자가 %{max} 보다 짧아야 함 + self_vote: 자신이 만든 설문에는 투표할 수 없음 + too_few_options: 둘 이상의 항목이 있어야 함 too_many_options: 항목은 %{max}개를 넘을 수 없습니다 preferences: other: 기타 @@ -1500,11 +1500,11 @@ ko: hint_html: "내 프로필과 게시물이 어떻게 발견될지를 제어합니다. 활성화 하면 마스토돈의 다양한 기능들이 내가 더 많은 사람에게 도달할 수 있도록 도와줍니다. 이 설정이 내 용도에 맞는지 잠시 검토하세요." privacy: 개인정보 privacy_hint_html: 다른 이들을 위해 노출할 수 있는 정보의 양을 조절합니다. 누군가는 다른 이들의 팔로우를 둘러보고 어떤 앱에서 게시물을 올렸는지 살피면서 흥미로운 프로필과 멋진 앱을 발견할 수 있지만, 누군가는 이를 숨기고 싶을 수도 있겠죠. - reach: 거리감 - reach_hint_html: 새로운 사람들이 나를 발견하고 팔로우하도록 허용할지 여부를 제어합니다. 탐색 화면에 게시물이 표시되기를 바라나요? 다른 사람들의 팔로우 추천에 표시되기를 바라나요? 모든 새 팔로워를 자동으로 수락하거나 각 팔로워를 세세하게 제어할까요? + reach: 도달 + reach_hint_html: 새로운 사람들이 나를 발견하고 팔로우하도록 허용할지 여부를 제어합니다. 발견하기 화면에 게시물이 표시되기를 바라나요? 다른 사람들의 팔로우 추천에 표시되기를 바라나요? 모든 새 팔로워를 자동으로 수락하거나 각 팔로워를 세세하게 제어할까요? search: 검색 search_hint_html: 내가 어떻게 발견될지를 제어합니다. 내가 공개적으로 게시한 것들로 인해 사람들이 날 발견하길 원하나요? 마스토돈 바깥의 사람들이 웹에서 검색을 통해 내 프로필을 발견하길 원하나요? 공개적인 정보에 대해서 모든 검색엔진의 검색결과에서 제외하는 것은 보장할 수 없다는 점에 주의해주세요. - title: 개인정보와 거리감 + title: 개인정보와 도달 privacy_policy: title: 개인정보처리방침 reactions: @@ -1672,8 +1672,8 @@ ko: keep_media_hint: 미디어가 첨부된 게시물을 삭제하지 않습니다 keep_pinned: 고정된 게시물 유지 keep_pinned_hint: 고정 게시물을 삭제하지 않습니다 - keep_polls: 투표 유지 - keep_polls_hint: 투표를 삭제하지 않습니다 + keep_polls: 설문 유지 + keep_polls_hint: 설문을 삭제하지 않았음 keep_self_bookmark: 북마크한 게시물 유지 keep_self_bookmark_hint: 북마크한 본인의 게시물을 삭제하지 않습니다 keep_self_fav: 마음에 들어한 게시물 유지 diff --git a/config/locales/my.yml b/config/locales/my.yml index 83f655350b..8e01e82afe 100644 --- a/config/locales/my.yml +++ b/config/locales/my.yml @@ -306,6 +306,7 @@ my: unpublish: ပြန်ဖြုတ်ပါ unpublished_msg: ကြေညာချက်ကို ဖြုတ်ပြီးပါပြီ updated_msg: ကြေညာချက်ကို ပြင်ဆင်ပြီးပါပြီ။ + critical_update_pending: အရေးကြီးသောအပ်ဒိတ်ကို ဆိုင်းငံ့ထားသည် custom_emojis: assign_category: အမျိုးအစားသတ်မှတ်ရန် by_domain: ဒိုမိန်း @@ -756,10 +757,21 @@ my: approved: အကောင့်ဖွင့်ရန်အတွက် အတည်ပြုချက် လိုအပ်ပါသည် none: မည်သူမျှ အကောင့်ဖွင့်၍မရပါ open: မည်သူမဆို အကောင့်ဖွင့်နိုင်ပါသည် + security: + authorized_fetch: ဖက်ဒီဆာဗာများမှ စစ်မှန်ကြောင်းအထောက်အထားပြရန် လိုအပ်သည်။ title: ဆာဗာသတ်မှတ်ချက်များ site_uploads: delete: တင်ထားသောဖိုင်ဖျက်ရန် destroyed_msg: ဆိုက်အပ်လုဒ်ကို အောင်မြင်စွာ ဖျက်လိုက်ပါပြီ။ + software_updates: + critical_update: အရေးကြီးသည် — ကျေးဇူးပြု၍ မြန်မြန်အပ်ဒိတ်လုပ်ပါ + documentation_link: ပိုမိုသိရှိရန် + release_notes: ထုတ်ဝေမှုမှတ်စုများ + title: ရရှိနိုင်သော အပ်ဒိတ်များ + type: အမျိုးအစား + types: + major: အဓိကထုတ်ဝေမှု + version: ဗားရှင်း statuses: account: ရေးသားသူ application: အက်ပလီကေးရှင်း @@ -814,6 +826,12 @@ my: message_html: သင်သည် မည်သည့်ဆာဗာစည်းမျဉ်းများကိုမျှ မသတ်မှတ်ထားပါ။ sidekiq_process_check: message_html: "%{value} တန်းစီ(s) အတွက် Sidekiq လုပ်ငန်းစဉ် မရှိပါ။ သင်၏ Sidekiq ဖွဲ့စည်းမှုကို ပြန်လည်သုံးသပ်ပါ။" + software_version_critical_check: + action: ရရှိနိုင်သော အပ်ဒိတ်များကြည့်ပါ + message_html: Mastodon အပ်ဒိတ်ရနိုင်သည်၊ ကျေးဇူးပြု၍ မြန်မြန် အပ်ဒိတ်လုပ်ပါ။ + software_version_patch_check: + action: ရရှိနိုင်သော အပ်ဒိတ်များကြည့်ပါ + message_html: ပြင်ဆင်ပြီးသော Mastodon အပ်ဒိတ် ရနိုင်ပါသည် upload_check_privacy_error: action: နောက်ထပ်အချက်အလက်များအတွက် ဤနေရာတွင် ကြည့်ပါ message_html: "သင်၏ဝဘ်ဆာဗာကို မှားယွင်းစွာပြုလုပ်ထားသည်။ သင့်အသုံးပြုသူများ၏ လျှို့ဝှက်ချက်များသည် အန္တရာယ်ရှိသည်။" @@ -923,6 +941,9 @@ my: body: "%{target} သည် %{type} ဖြစ်သည့် %{date} တွင် %{action_taken_by} ဖြင့် စိစစ်မှုတစ်ခုအား အယူခံဝင်နေပါသည်။ သူတို့ရေးသားခဲ့သည် -" next_steps: စိစစ်ဆုံးဖြတ်ချက်ပြန်ဖျက်ရန်အတွက် တင်ပြနိုင်သည် သို့မဟုတ် ၎င်းကို လျစ်လျူရှုနိုင်သည်။ subject: "%{username} က %{instance} တွင် စိစစ်ဆုံးဖြတ်ချက်ကို တင်ပြနေသည်" + new_critical_software_updates: + body: Mastodon ၏ ဗားရှင်းအသစ်များကို ထုတ်ဝေလိုက်ပါပြီ၊ အမြန်ဆုံး အပ်ဒိတ်လုပ်နိုင်ပါသည်။ + subject: Mastodon အပ်ဒိတ်များကို %{instance} အတွက် ရနိုင်ပါသည်။ new_pending_account: body: အကောင့်သစ်၏အသေးစိတ်ကို အောက်တွင်ဖော်ပြထားသည်။ ၎င်းကို အတည်ပြုနိုင်သည် သို့မဟုတ် ငြင်းပယ်နိုင်သည်။ subject: " (%{username}) %{instance} ပေါ်ရှိ ပြန်လည်သုံးသပ်ရမည့် အကောင့်သစ်" @@ -930,6 +951,9 @@ my: body: "%{reporter} က %{target} ကို တိုင်ကြားခဲ့သည်" body_remote: "%{domain} မှ တစ်စုံတစ်ယောက်က %{target} ကို တိုင်ကြားခဲ့သည်" subject: "%{instance} (#%{id}) အတွက် တိုင်ကြားစာအသစ်" + new_software_updates: + body: Mastodon ဗားရှင်းအသစ်များ ထွက်ရှိပြီးပါပြီ၊ သင် update လုပ်နိုင်ပါပြီ။ + subject: Mastodon ဗားရှင်းအသစ်များကို %{instance} အတွက် ရနိုင်ပါသည် new_trends: body: အောက်ပါအရာများကို အများကိုမပြမီ ပြန်လည်သုံးသပ်ရန် လိုအပ်သည် - new_trending_links: @@ -1663,6 +1687,11 @@ my: default: "%b %d, %Y, %H:%M" month: "%b %Y" time: "%H:%M" + with_time_zone: "%b %d, %Y, %H:%M %Z" + translation: + errors: + quota_exceeded: ဘာသာပြန်ဝန်ဆောင်မှုအတွက် ဆာဗာတစ်ခုလုံးအသုံးပြုမှုခွဲတမ်းကို ကျော်လွန်သွားပါပြီ။ + too_many_requests: မကြာသေးမီက ဘာသာပြန်ဝန်ဆောင်မှုသို့ တောင်းဆိုမှု အများအပြားရှိခဲ့သည်။ two_factor_authentication: add: ထည့်ရန် disable: 2FA ကို ပိတ်ပါ diff --git a/config/locales/simple_form.be.yml b/config/locales/simple_form.be.yml index 7c116d15c4..85f22ad239 100644 --- a/config/locales/simple_form.be.yml +++ b/config/locales/simple_form.be.yml @@ -291,6 +291,11 @@ be: pending_account: Новы акаўнт патрабуе разгляду reblog: Нехта пашырыў ваш допіс report: Новая скарга даслана + software_updates: + all: Апавяшчаць аб усіх абнаўленнях + critical: Апавяшчаць толькі аб крытычных абнаўленнях + label: Даступная новая версія Mastodon + none: Не апавяшчаць аб абнаўленнях (не рэкамендуецца) trending_tag: Новы трэнд патрабуе разгляду rule: text: Правіла @@ -317,6 +322,7 @@ be: url: URL-адрас канцавога пункту 'no': Не not_recommended: Не рэкамендавана + overridden: Перавызначана recommended: Рэкамендуем required: mark: "*" diff --git a/config/locales/simple_form.ca.yml b/config/locales/simple_form.ca.yml index 6f9b9a5d16..15e1d0de24 100644 --- a/config/locales/simple_form.ca.yml +++ b/config/locales/simple_form.ca.yml @@ -6,7 +6,7 @@ ca: discoverable: El teu perfil i els teus tuts públics poden aparèixer o ser recomanats en diverses àreas de Mastodon i el teu perfil pot ser suggerit a altres usuaris. display_name: El teu nom complet o el teu nom divertit. fields: La teva pàgina d'inici, pronoms, edat, el que vulguis. - indexable: Els teus tuts públics Mastodon poden aparèixer en els resultats de cerca de Mastodon. Les persones que han interaccionat amb el teus tuts seran sempre capaços de cercar-los. + indexable: Els teus tuts públics poden aparèixer en els resultats de cerca de Mastodon. Les persones que han interaccionat amb el teus tuts seran sempre capaços de cercar-los. note: 'Pots @mencionar altra gent o #etiquetes.' show_collections: La gent podrà navegar pels teus seguits i seguidors. Qui segueixis sí que veurà que els segueixes. unlocked: La gent serà capaç de seguir-te sense sol·licitar-ho. Desmarca si vols revisar les sol·licituds i triar si acceptes o no els nous seguidors. diff --git a/config/locales/simple_form.de.yml b/config/locales/simple_form.de.yml index 649afab76e..fcf92e29f4 100644 --- a/config/locales/simple_form.de.yml +++ b/config/locales/simple_form.de.yml @@ -15,26 +15,26 @@ de: account_migration: acct: Gib profilname@domain des Kontos an, zu dem du umziehen möchtest account_warning_preset: - text: Du kannst Beitragssyntax verwenden, wie z. B. URLs, Hashtags und Erwähnungen - title: Optional. Für Empfänger*in nicht sichtbar + text: Du kannst die Syntax wie für Beiträge verwenden – z. B. URLs, Hashtags und Erwähnungen + title: "(Optional) Für Empfänger*in nicht sichtbar" admin_account_action: include_statuses: Die Person wird sehen, welche Inhalte dich zu dieser Maßnahme veranlasst haben send_email_notification: Benutzer*in wird eine Erklärung erhalten, was mit dem Konto geschehen ist - text_html: Optional. Du kannst Beitragssyntax verwenden. Du kannst Warnvorlagen hinzufügen, um Zeit zu sparen + text_html: (Optional) Du kannst die Syntax wie für Beiträge verwenden. Du kannst Warnvorlagen hinzufügen, um Zeit zu sparen type_html: Wähle aus, wie mit %{acct} vorgegangen werden soll types: disable: Benutzer*in daran hindern, das Konto verwenden zu können, aber die Inhalte nicht löschen oder ausblenden. none: Dem Konto eine Warnung zusenden, ohne dabei eine andere Aktion vorzunehmen. - sensitive: Erzwingen, dass alle Medieninhalte dieses Profils mit einer Inhaltswarnung versehen werden. + sensitive: Erzwingen, dass alle Medienanhänge dieses Profils mit einer Inhaltswarnung versehen werden. silence: Verhindert, dass dieses Profil öffentlich sichtbare Beiträge verfassen kann, und verbirgt alle Beiträge und Benachrichtigungen vor Personen, die diesem Profil nicht folgen. Alle Meldungen zu diesem Konto werden geschlossen. suspend: Verhindert jegliche Interaktion von oder zu diesem Konto und löscht dessen Inhalt. Dies kann innerhalb von 30 Tagen rückgängig gemacht werden. Alle Meldungen zu diesem Konto werden geschlossen. - warning_preset_id: Optional. Du kannst immer noch eigenen Text an das Ende der Vorlage hinzufügen + warning_preset_id: "(Optional) Du kannst immer noch eigenen Text an das Ende der Vorlage hinzufügen" announcement: all_day: Falls aktiviert, werden nur der Tag bzw. die Tage innerhalb des Zeitraums angezeigt - ends_at: Optional. Die Ankündigung wird zu diesem Zeitpunkt automatisch zurückgezogen + ends_at: "(Optional) Die Ankündigung wird zu diesem Zeitpunkt automatisch zurückgezogen" scheduled_at: Leer lassen, um die Ankündigung sofort zu veröffentlichen - starts_at: Optional. Nur für den Fall, dass deine Ankündigung an einen bestimmten Zeitraum gebunden ist - text: Du kannst die reguläre Syntax wie für Beiträge verwenden, also auch Profile erwähnen und Hashtags nutzen. Bitte beachte den Platz, den die Ankündigung auf dem Bildschirm der Benutzer*innen einnehmen wird + starts_at: "(Optional) Für den Fall, dass deine Ankündigung an einen bestimmten Zeitraum gebunden ist" + text: Du kannst die Syntax wie für Beiträge verwenden. Bitte berücksichtige den Platz, den die Ankündigung auf dem Bildschirm der Benutzer*innen einnehmen wird appeal: text: Du kannst nur einmal Einspruch gegen eine Maßnahme einlegen defaults: @@ -107,7 +107,7 @@ de: invite_request: text: Dies wird uns bei der Überprüfung deiner Anmeldung behilflich sein ip_block: - comment: Optional. Zur Erinnerung, weshalb du diese Regel eingeführt hast. + comment: "(Optional) Zur Erinnerung, weshalb du diese Regel eingeführt hast." expires_in: IP-Adressen sind eine begrenzte Ressource. Sie können außerdem auf viele Computer aufgeteilt sein und auch die Zuordnungen ändern sich. Deshalb werden unbestimmte IP-Sperren nicht empfohlen. ip: Gib eine IPv4- oder IPv6-Adresse an. Du kannst ganze Bereiche mit der CIDR-Syntax blockieren. Achte darauf, dass du dich nicht selbst aussperrst! severities: diff --git a/config/locales/simple_form.es-MX.yml b/config/locales/simple_form.es-MX.yml index 75fe91eaec..0ed471a1f8 100644 --- a/config/locales/simple_form.es-MX.yml +++ b/config/locales/simple_form.es-MX.yml @@ -3,13 +3,13 @@ es-MX: simple_form: hints: account: - discoverable: Tu perfil y publicaciones públicas pueden ser destacadas o recomendadas en varias áreas de Mastodon y tu perfil puede ser sugerido a otros usuarios. + discoverable: Tu perfil y las publicaciones públicas pueden ser destacadas o recomendadas en varias áreas de Mastodon y tu perfil puede ser sugerido a otros usuarios. display_name: Tu nombre completo o tu nick. fields: Tu página de inicio, pronombres, edad, todo lo que quieras. - indexable: Tus publicaciones públicas pueden aparecer en los resultados de búsqueda en Mastodon. Las personas que han interactuado con tus publicaciones pueden ser capaces de buscarlas sin importar su visibilidad. + indexable: Tus publicaciones públicas pueden aparecer en los resultados de búsqueda en Mastodon. Las personas que han interactuado con tus publicaciones pueden buscarlas en cualquier momento. note: 'Puedes @mencionar a otra gente o #hashtags.' - show_collections: Las personas podrán navegar a través de tus seguidos y seguidores. Esto no impide que las personas que sigues sepan que las estás siguiendo. - unlocked: Las personas podrán seguirte sin pedir aprobación. Desmarca si deseas revisar las solicitudes de seguimiento y aceptar o rechazar nuevos seguidores. + show_collections: Las personas pueden navegar a través de tus seguidos y seguidores. Las personas que te siguen pueden ver que las sigues. + unlocked: Las personas pueden seguirte sin solicitar la aprobación. No lo selecciones si quieres revisar las solicitudes de seguimiento y elegir si aceptas o rechazas a nuevos seguidores. account_alias: acct: Especifique el nombre de usuario@dominio de la cuenta desde la cual se desea migrar account_migration: @@ -121,8 +121,8 @@ es-MX: otp: 'Introduce el código de autenticación de dos factores generado por tu aplicación de teléfono o usa uno de tus códigos de recuperación:' webauthn: Si es una tecla USB, asegúrese de insertarla y, si es necesario, púlsela. settings: - indexable: Puede que tu página de perfil aparezca en los resultados de búsqueda en Google, Bing y otros. - show_application: Tú siempre podrás ver desde qué aplicación se ha publicado tu publicación. + indexable: Tu página de perfil puede aparecer en los resultados de búsqueda en Google, Bing, entre otros. + show_application: Siempre podrás ver desde cuál aplicación realizaste una publicación. tag: name: Sólo se puede cambiar el cajón de las letras, por ejemplo, para que sea más legible user: @@ -140,13 +140,13 @@ es-MX: url: Donde los eventos serán enviados labels: account: - discoverable: Destacar perfil y publicaciones en algoritmos de descubrimiento + discoverable: Destacar el perfil y las publicaciones en el algoritmo de descubrimiento fields: name: Etiqueta value: Contenido indexable: Incluir publicaciones públicas en los resultados de búsqueda - show_collections: Mostrar seguidos y seguidores en el perfil - unlocked: Aceptar automáticamente nuevos seguidores + show_collections: Mostrar los seguidos y seguidores en el perfil + unlocked: Aceptar automáticamente a nuevos seguidores account_alias: acct: Maneja la cuenta antigua account_migration: @@ -301,8 +301,8 @@ es-MX: rule: text: Norma settings: - indexable: Incluye la página de perfil en los buscadores - show_application: Mostrar desde qué aplicación enviaste una publicación + indexable: Incluir la página de perfil en los motores de búsqueda + show_application: Mostrar desde cuál aplicación enviaste una publicación tag: listable: Permitir que esta etiqueta aparezca en las búsquedas y en el directorio del perfil name: Etiqueta diff --git a/config/locales/simple_form.my.yml b/config/locales/simple_form.my.yml index 0bb283eca0..cf15616d24 100644 --- a/config/locales/simple_form.my.yml +++ b/config/locales/simple_form.my.yml @@ -291,6 +291,12 @@ my: pending_account: အကောင့်အသစ်ကို ပြန်လည်သုံးသပ်ရန် လိုအပ်သည် reblog: တစ်ယောက်က သင့်ပို့စ်ကို Boost လုပ်ခဲ့သည် report: အစီရင်ခံစာအသစ် တင်သွင်းထားသည် + software_updates: + all: အပ်ဒိတ်အားလုံးအတွက် အသိပေးရန် + critical: အရေးကြီးသော အပ်ဒိတ်များအတွက်သာ အသိပေးပါ + label: Mastodon ဗားရှင်းအသစ်ကို ရပါပြီ + none: "(မထောက်ခံထားသည့်) အပ်ဒိတ်များကို မည်သည့်အခါမျှ အသိပေးမည်မဟုတ်ပါ" + patch: ပြင်ဆင်ပြီးသောအပ်ဒိတ်များကို အသိပေးရန် trending_tag: လက်ရှိခေတ်စားနေသောပို့စ်များကို ပြန်လည်သုံးသပ်ရန် လိုသည် rule: text: စည်းမျဉ်း diff --git a/config/locales/simple_form.vi.yml b/config/locales/simple_form.vi.yml index 17d53a672c..8943527b16 100644 --- a/config/locales/simple_form.vi.yml +++ b/config/locales/simple_form.vi.yml @@ -45,16 +45,16 @@ vi: current_password: Vì mục đích bảo mật, vui lòng nhập mật khẩu của tài khoản hiện tại current_username: Để xác nhận, vui lòng nhập tên người dùng của tài khoản hiện tại digest: Chỉ gửi sau một thời gian dài không hoạt động hoặc khi bạn nhận được tin nhắn (trong thời gian vắng mặt) - email: Bạn sẽ được gửi một email xác nhận + email: Bạn sẽ được gửi một email xác minh header: PNG, GIF hoặc JPG, tối đa %{size}. Sẽ bị nén xuống %{dimensions}px inbox_url: Sao chép URL của máy chủ mà bạn muốn dùng irreversible: Các tút đã lọc sẽ không thể phục hồi, kể cả sau khi xóa bộ lọc locale: Ngôn ngữ của giao diện, email và thông báo đẩy password: Dùng ít nhất 8 ký tự phrase: Sẽ được hiện thị trong văn bản hoặc cảnh báo nội dung của một tút - scopes: API nào ứng dụng sẽ được phép truy cập. Nếu bạn chọn quyền hạn cấp cao nhất, bạn không cần chọn từng phạm vi. + scopes: Ứng dụng sẽ được phép truy cập những API nào. Nếu bạn chọn quyền cấp cao nhất, không cần chọn quyền nhỏ. setting_aggregate_reblogs: Nếu một tút đã được đăng lại thì những lượt đăng lại sau sẽ không hiện trên bảng tin nữa - setting_always_send_emails: Bình thường thì email thông báo sẽ không gửi khi bạn đang dùng Mastodon + setting_always_send_emails: Bình thường thì sẽ không gửi khi bạn đang dùng Mastodon setting_default_sensitive: Bắt buộc nhấn vào mới có thể xem setting_display_media_default: Click để xem setting_display_media_hide_all: Luôn ẩn @@ -73,7 +73,7 @@ vi: filters: action: Chọn hành động sẽ thực hiện khi một tút khớp với bộ lọc actions: - hide: Ẩn hoàn toàn nội dung đã lọc, hoạt động như thể nó không tồn tại + hide: Ẩn hoàn toàn nội dung đã lọc, như thể nó không tồn tại warn: Ẩn nội dung đã lọc đằng sau một cảnh báo đề cập đến tiêu đề của bộ lọc form_admin_settings: activity_api_enabled: Số lượng tút được đăng trong máy chủ, người dùng đang hoạt động và đăng ký mới hàng tuần @@ -97,9 +97,9 @@ vi: theme: Chủ đề mà khách truy cập đăng xuất và người mới nhìn thấy. thumbnail: 'Một hình ảnh tỉ lệ 2: 1 được hiển thị cùng với thông tin máy chủ của bạn.' timeline_preview: Khách truy cập đã đăng xuất sẽ có thể xem các tút công khai gần đây nhất trên máy chủ. - trendable_by_default: Bỏ qua việc duyệt thủ công nội dung thịnh hành. Các mục riêng lẻ vẫn có thể bị xóa khỏi xu hướng sau này. + trendable_by_default: Bỏ qua việc duyệt thủ công nội dung xu hướng. Các mục riêng lẻ vẫn có thể bị xóa khỏi xu hướng sau này. trends: Hiển thị những tút, hashtag và tin tức đang được thảo luận nhiều trên máy chủ của bạn. - trends_as_landing_page: Hiển thị nội dung thịnh hành cho người dùng đã đăng xuất và khách truy cập thay vì mô tả về máy chủ này. Yêu cầu xu hướng được kích hoạt. + trends_as_landing_page: Hiển thị nội dung xu hướng cho người dùng chưa đăng nhập thay vì mô tả về máy chủ này. Yêu cầu xu hướng được kích hoạt. form_challenge: current_password: Biểu mẫu này an toàn imports: @@ -140,7 +140,7 @@ vi: url: Nơi những sự kiện được gửi đến labels: account: - discoverable: Cho phép hiện hồ sơ và tút trong thuật toán khám phá + discoverable: Cho phép khám phá hồ sơ fields: name: Nhãn value: Nội dung @@ -218,7 +218,7 @@ vi: setting_reduce_motion: Giảm chuyển động ảnh GIF setting_system_font_ui: Dùng phông chữ mặc định hệ thống setting_theme: Giao diện - setting_trends: Hiển thị thịnh hành hôm nay + setting_trends: Hiển thị xu hướng trong ngày setting_unfollow_modal: Hỏi trước khi bỏ theo dõi ai đó setting_use_blurhash: Phủ màu media nhạy cảm setting_use_pending_items: Không tự động cập nhật bảng tin @@ -262,9 +262,9 @@ vi: theme: Chủ đề mặc định thumbnail: Hình thu nhỏ của máy chủ timeline_preview: Cho phép truy cập vào dòng thời gian công khai - trendable_by_default: Cho phép thịnh hành mà không cần duyệt trước - trends: Bật thịnh hành - trends_as_landing_page: Dùng trang thịnh hành làm trang chào mừng + trendable_by_default: Cho phép lên xu hướng mà không cần duyệt trước + trends: Bật xu hướng + trends_as_landing_page: Dùng trang xu hướng làm trang chào mừng interactions: must_be_follower: Những người không theo dõi bạn must_be_following: Những người bạn không theo dõi @@ -306,7 +306,7 @@ vi: tag: listable: Cho phép xuất hiện trong tìm kiếm và đề xuất name: Hashtag - trendable: Cho phép hashtag này thịnh hành + trendable: Cho phép hashtag này lên xu hướng usable: Cho phép dùng trong tút user: role: Vai trò diff --git a/config/locales/sq.yml b/config/locales/sq.yml index c7990812c8..6cdfa268db 100644 --- a/config/locales/sq.yml +++ b/config/locales/sq.yml @@ -829,10 +829,18 @@ sq: system_checks: database_schema_check: message_html: Ka migrime bazash të dhënash pezull. Ju lutemi, kryejini, për të qenë të sigurt se aplikacioni sillet siç priteet + elasticsearch_health_red: + message_html: Grupi juaj i instancave Elasticsearch s’është i shëndetshëm (gjendje e verdhë), s’mund të përdoren veçoritë e kërkimit + elasticsearch_health_yellow: + message_html: Grupi juaj i instancave Elasticsearch s’është i shëndetshëm (gjendje e verdhë), mund të doni të hetoni shkakun + elasticsearch_index_mismatch: + message_html: Përshoqërimet e treguesit të Elasticsearch-it janë të vjetruara. Ju lutemi, xhironi tootctl search deploy --only=%{value} elasticsearch_preset: action: Shihni documentimin + message_html: Grupi i instancave tuaja Elasticsearch ka më shumë se një nyjë, por Mastodon-i s’është formësuar t’i përdorë ato. elasticsearch_preset_single_node: action: Shihni documentimin + message_html: Grupi i instancave tuaja Elasticsearch ka vetëm një nyjë, ES_PRESET i duhet dhënë vlera single_node_cluster. elasticsearch_reset_chewy: message_html: Treguesi juaj i sistemit Elasticsearch është i vjetruar, për shkak të një ndryshimi rregullimesh. Për ta përditësuar, ju lutemi, xhironi tootctl search deploy --reset-chewy. elasticsearch_running_check: @@ -1375,6 +1383,7 @@ sq: confirmation_html: Jeni i sigurt se doni të shpajtoheni prej marrjes së %{type} për Mastodon në %{domain} te email-i juaj në %{email}? Mundeni përherë të ripajtoheni, që prej rregullimeve tuaja për njoftime me email. emails: notification_emails: + favourite: email-e njoftimesh për të parapëlqyer follow: email-e njoftimi ndjekjesh follow_request: email-e kërkesash për ndjekje mention: email-e njoftimi përmendjesh @@ -1461,6 +1470,7 @@ sq: update: subject: "%{name} përpunoi një postim" notifications: + administration_emails: Njoftime email për përgjegjësin email_events: Akte për njoftim me email email_events_hint: 'Përzgjidhni akte për të cilët doni të merrni njoftime:' other_settings: Rregullimet të tjera njoftimesh diff --git a/config/locales/vi.yml b/config/locales/vi.yml index 0941159314..093b0bca9e 100644 --- a/config/locales/vi.yml +++ b/config/locales/vi.yml @@ -122,7 +122,7 @@ vi: removed_header_msg: Đã xóa bỏ ảnh bìa của %{username} resend_confirmation: already_confirmed: Người này đã được xác minh - send: Gửi lại email xác nhận + send: Gửi lại email xác minh success: Xác nhận đã được gửi đi thành công! reset: Đặt lại reset_password: Đặt lại mật khẩu @@ -208,7 +208,7 @@ vi: reject_user: Từ chối đăng ký remove_avatar_user: Xóa ảnh đại diện reopen_report: Mở lại báo cáo - resend_user: Gửi lại email xác nhận + resend_user: Gửi lại email xác minh reset_password_user: Đặt lại mật khẩu resolve_report: Xử lý báo cáo sensitive_account: Áp đặt nhạy cảm @@ -267,7 +267,7 @@ vi: reject_user_html: "%{name} đã từ chối đăng ký từ %{target}" remove_avatar_user_html: "%{name} đã xóa ảnh đại diện của %{target}" reopen_report_html: "%{name} mở lại báo cáo %{target}" - resend_user_html: "%{name} gửi lại email xác nhận cho %{target}" + resend_user_html: "%{name} gửi lại email xác minh cho %{target}" reset_password_user_html: "%{name} đã đặt lại mật khẩu của %{target}" resolve_report_html: "%{name} đã xử lý báo cáo %{target}" sensitive_account_html: "%{name} đánh dấu nội dung của %{target} là nhạy cảm" @@ -694,7 +694,7 @@ vi: manage_settings: Quản lý thiết lập manage_settings_description: Cho phép thay đổi thiết lập máy chủ manage_taxonomies: Quản lý phân loại - manage_taxonomies_description: Cho phép đánh giá nội dung thịnh hành và cập nhật cài đặt hashtag + manage_taxonomies_description: Cho phép đánh giá nội dung xu hướng và cập nhật cài đặt hashtag manage_user_access: Quản lý người truy cập manage_user_access_description: Cho phép vô hiệu hóa xác thực hai bước của người khác, thay đổi địa chỉ email và đặt lại mật khẩu của họ manage_users: Quản lý người @@ -744,7 +744,7 @@ vi: publish_discovered_servers: Công khai các máy chủ được phát hiện publish_statistics: Công khai số liệu thống kê title: Khám phá - trends: Thịnh hành + trends: Xu hướng domain_blocks: all: Tới mọi người disabled: Không ai @@ -800,7 +800,7 @@ vi: reblogs: Lượt đăng lại status_changed: Tút đã thay đổi title: Toàn bộ tút - trending: Thịnh hành + trending: Xu hướng visibility: Hiển thị with_media: Có media strikes: @@ -880,7 +880,7 @@ vi: pending_review: Đang chờ preview_card_providers: allowed: Tin tức từ nguồn này có thể lên xu hướng - description_html: Đây là những nguồn mà từ đó các liên kết thường được chia sẻ trên máy chủ của bạn. Các liên kết sẽ không thể thịnh hành trừ khi bạn cho phép nguồn. Sự cho phép (hoặc cấm) của bạn áp dụng luôn cho các tên miền phụ. + description_html: Đây là những nguồn mà từ đó các liên kết thường được chia sẻ trên máy chủ của bạn. Các liên kết sẽ không thể lên xu hướng trừ khi bạn cho phép nguồn. Sự cho phép (hoặc cấm) của bạn áp dụng luôn cho các tên miền phụ. rejected: Tin tức từ nguồn này không thể lên xu hướng title: Nguồn đăng rejected: Đã cấm @@ -890,11 +890,11 @@ vi: description_html: Đây là những tút đang được chia sẻ và yêu thích rất nhiều trên máy chủ của bạn. Nó có thể giúp người mới và người cũ tìm thấy nhiều người hơn để theo dõi. Không có tút nào được hiển thị công khai cho đến khi bạn cho phép người đăng và người cho phép đề xuất tài khoản của họ cho người khác. Bạn cũng có thể cho phép hoặc từ chối từng tút riêng. disallow: Cấm tút disallow_account: Cấm người đăng - no_status_selected: Không có tút thịnh hành nào thay đổi vì không có tút nào được chọn + no_status_selected: Không có tút xu hướng nào thay đổi vì không có tút nào được chọn not_discoverable: Tác giả đã chọn không tham gia mục khám phá shared_by: other: Được thích và đăng lại %{friendly_count} lần - title: Tút nổi bật + title: Tút xu hướng tags: current_score: Chỉ số gần đây %{score} dashboard: @@ -905,20 +905,20 @@ vi: tag_uses_measure: tổng lượt dùng description_html: Đây là những hashtag đang xuất hiện trong rất nhiều tút trên máy chủ của bạn. Nó có thể giúp mọi người tìm ra những gì đang được quan tâm nhiều nhất vào lúc này. Không có hashtag nào được hiển thị công khai cho đến khi bạn cho phép chúng. listable: Có thể đề xuất - no_tag_selected: Không có hashtag thịnh hành nào thay đổi vì không có hashtag nào được chọn + no_tag_selected: Không có hashtag xu hướng nào thay đổi vì không có hashtag nào được chọn not_listable: Không thể đề xuất - not_trendable: Không cho thịnh hành + not_trendable: Không cho lên xu hướng not_usable: Không được phép dùng peaked_on_and_decaying: Đỉnh điểm %{date}, giờ đang giảm title: Hashtag nổi bật - trendable: Cho phép thịnh hành + trendable: Cho phép lên xu hướng trending_rank: 'Nổi bật #%{rank}' usable: Có thể dùng usage_comparison: Dùng %{today} lần hôm nay, so với %{yesterday} hôm qua used_by_over_week: other: "%{count} người dùng tuần rồi" title: Xu hướng - trending: Thịnh hành + trending: Xu hướng warning_presets: add_new: Thêm mới delete: Xóa bỏ @@ -1029,7 +1029,7 @@ vi: prefix_invited_by_user: "@%{name} mời bạn tham gia máy chủ Mastodon này!" prefix_sign_up: Tham gia Mastodon ngay hôm nay! suffix: Với tài khoản, bạn sẽ có thể theo dõi mọi người, đăng tút và nhắn tin với người từ bất kỳ máy chủ Mastodon khác! - didnt_get_confirmation: Không nhận được email yêu cầu xác thực? + didnt_get_confirmation: Không nhận được email xác minh? dont_have_your_security_key: Bạn có khóa bảo mật chưa? forgot_password: Quên mật khẩu invalid_reset_password_token: Mã đặt lại mật khẩu không hợp lệ hoặc hết hạn. Vui lòng yêu cầu một cái mới. @@ -1052,7 +1052,7 @@ vi: saml: SAML register: Đăng ký registration_closed: "%{instance} tạm dừng đăng ký mới" - resend_confirmation: Gửi lại email xác nhận + resend_confirmation: Gửi lại email xác minh reset_password: Đặt lại mật khẩu rules: accept: Chấp nhận @@ -1068,14 +1068,14 @@ vi: email_below_hint_html: Kiểm tra hộp thư rác hoặc yêu cầu gửi lại. Bạn có thể sửa địa chỉ email của mình nếu sai. email_settings_hint_html: Nhấn vào liên kết chúng tôi vừa gửi để xác minh %{email}. Nhanh nhé bạn. link_not_received: Không nhận được mã? - new_confirmation_instructions_sent: Bạn sẽ nhận được một email mới với liên kết xác nhận sau vài phút! + new_confirmation_instructions_sent: Bạn sẽ nhận được một email mới với liên kết xác minh sau vài phút! title: Kiểm tra email của bạn sign_in: preamble_html: Đăng nhập bằng tài khoản %{domain}. Nếu đăng ký trên một máy chủ khác, bạn sẽ không thể đăng nhập tại đây. title: Đăng nhập %{domain} sign_up: manual_review: "%{domain} sẽ duyệt đăng ký thủ công. Để giúp chúng tôi duyệt nhanh, hãy viết một chút về bản thân và lý do bạn muốn có một tài khoản trên %{domain}." - preamble: Với tài khoản trên máy chủ Mastodon này, bạn sẽ có thể theo dõi bất kỳ người nào trên các máy chủ khác, bất kể tài khoản của họ ở đâu. + preamble: Với tài khoản trên máy chủ Mastodon này, bạn sẽ có thể theo dõi bất kỳ người nào thuộc các máy chủ khác. title: Đang đăng ký trên %{domain}. status: account_status: Trạng thái tài khoản @@ -1125,7 +1125,7 @@ vi: data_removal: Bài viết của bạn và dữ liệu khác sẽ bị xóa vĩnh viễn email_change_html: Bạn có thể thay đổi địa chỉ email mà không cần phải xóa tài khoản email_contact_html: Nếu vẫn không nhận được, bạn có thể liên hệ %{email} để được giúp đỡ - email_reconfirmation_html: Nếu bạn không nhận được email xác nhận, hãy thử yêu cầu lại + email_reconfirmation_html: Nếu bạn không nhận được email xác minh, hãy thử yêu cầu lại irreversible: Bạn sẽ không thể khôi phục hoặc kích hoạt lại tài khoản của mình more_details_html: Đọc chính sách bảo mật để biết thêm chi tiết. username_available: Tên người dùng của bạn sẽ có thể đăng ký lại @@ -1209,7 +1209,7 @@ vi: account: Trang hồ sơ home: Trang chính và danh sách notifications: Thông báo - public: Tin công khai + public: Tút công khai thread: Thảo luận edit: add_keyword: Thêm từ khoá @@ -1292,7 +1292,7 @@ vi: following_html: Bạn sắp theo dõi tới %{total_items} người từ %{filename}. lists_html: Bạn sắp thêm %{total_items} tài khoản từ %{filename} vào danh sách của bạn. Những danh sách mới sẽ được tạo nếu bạn chưa có danh sách nào. muting_html: Bạn sắp ẩn lên tới %{total_items} người từ %{filename}. - preface: Bạn có thể nhập dữ liệu mà bạn đã xuất từ một máy chủ khác, chẳng hạn như danh sách những người bạn đang theo dõi hoặc chặn. + preface: Bạn có thể nhập dữ liệu mà bạn đã xuất từ một máy chủ khác, chẳng hạn danh sách những người đang theo dõi hoặc chặn. recent_imports: Đã nhập gần đây states: finished: Đã hoàn thành @@ -1466,7 +1466,7 @@ vi: trillion: T otp_authentication: code_hint: Nhập mã được tạo bởi ứng dụng xác minh của bạn để xác nhận - description_html: Nếu kích hoạt xác minh 2 bước thông qua ứng dụng, bạn sẽ đăng nhập bằng mã token được tạo bởi chính điện thoại của bạn. + description_html: Bạn sẽ đăng nhập bằng mã token được tạo ra bởi điện thoại của bạn. enable: Kích hoạt instructions_html: "Quét mã QR bằng Google Authenticator hoặc một ứng dụng TOTP tương tự trên điện thoại của bạn. Kể từ bây giờ, ứng dụng đó sẽ tạo những token để bạn đăng nhập." manual_instructions: 'Nếu bạn không thể quét mã QR, đây sẽ là dòng chữ gợi ý:' diff --git a/db/post_migrate/20230803082451_add_unique_index_on_preview_cards_statuses.rb b/db/post_migrate/20230803082451_add_unique_index_on_preview_cards_statuses.rb index 3e9ab134b7..d29d7847c5 100644 --- a/db/post_migrate/20230803082451_add_unique_index_on_preview_cards_statuses.rb +++ b/db/post_migrate/20230803082451_add_unique_index_on_preview_cards_statuses.rb @@ -18,7 +18,7 @@ class AddUniqueIndexOnPreviewCardsStatuses < ActiveRecord::Migration[6.1] def supports_concurrent_reindex? @supports_concurrent_reindex ||= begin version = select_one("SELECT current_setting('server_version_num') AS v")['v'].to_i - version >= 12_000 + version >= 120_000 end end diff --git a/lib/mastodon/migration_helpers.rb b/lib/mastodon/migration_helpers.rb index 4a43f67c27..c382b5fbd5 100644 --- a/lib/mastodon/migration_helpers.rb +++ b/lib/mastodon/migration_helpers.rb @@ -202,7 +202,7 @@ module Mastodon def supports_add_column_with_default? version = select_one("SELECT current_setting('server_version_num') AS v")['v'].to_i - version >= 11_000 + version >= 110_000 end # Adds a foreign key with only minimal locking on the tables involved. diff --git a/lib/mastodon/version.rb b/lib/mastodon/version.rb index c4d3e4dfd9..e0b27316d9 100644 --- a/lib/mastodon/version.rb +++ b/lib/mastodon/version.rb @@ -17,7 +17,7 @@ module Mastodon end def default_prerelease - 'rc1' + 'rc2' end def prerelease diff --git a/lib/paperclip/transcoder.rb b/lib/paperclip/transcoder.rb index b88cf662c2..ed5425a3b8 100644 --- a/lib/paperclip/transcoder.rb +++ b/lib/paperclip/transcoder.rb @@ -41,11 +41,14 @@ module Paperclip @output_options['vframes'] = 1 when 'mp4' unless eligible_to_passthrough?(metadata) - bitrate = (metadata.width * metadata.height * 30 * BITS_PER_PIXEL) / 1_000 + size_limit_in_bits = MediaAttachment::VIDEO_LIMIT * 8 + desired_bitrate = (metadata.width * metadata.height * 30 * BITS_PER_PIXEL).floor + maximum_bitrate = (size_limit_in_bits / metadata.duration).floor - 192_000 # Leave some space for the audio stream + bitrate = [desired_bitrate, maximum_bitrate].min - @output_options['b:v'] = "#{bitrate}k" - @output_options['maxrate'] = "#{bitrate + 192}k" - @output_options['bufsize'] = "#{bitrate * 5}k" + @output_options['b:v'] = bitrate + @output_options['maxrate'] = bitrate + 192_000 + @output_options['bufsize'] = bitrate * 5 if high_vfr?(metadata) @output_options['vsync'] = 'vfr' diff --git a/spec/controllers/concerns/signature_verification_spec.rb b/spec/controllers/concerns/signature_verification_spec.rb index f8e44845d7..650cd21eaf 100644 --- a/spec/controllers/concerns/signature_verification_spec.rb +++ b/spec/controllers/concerns/signature_verification_spec.rb @@ -129,37 +129,6 @@ describe SignatureVerification do end end - context 'with non-normalized URL' do - before do - get :success - - fake_request = Request.new(:get, 'http://test.host/subdir/../success') - fake_request.on_behalf_of(author) - - request.headers.merge!(fake_request.headers) - - allow(controller).to receive(:actor_refresh_key!).and_return(author) - end - - describe '#build_signed_string' do - it 'includes the normalized request path' do - expect(controller.send(:build_signed_string)).to start_with "(request-target): get /success\n" - end - end - - describe '#signed_request?' do - it 'returns true' do - expect(controller.signed_request?).to be true - end - end - - describe '#signed_request_actor' do - it 'returns an account' do - expect(controller.signed_request_account).to eq author - end - end - end - context 'with request with unparsable Date header' do before do get :success @@ -233,7 +202,7 @@ describe SignatureVerification do request.headers.merge!(fake_request.headers) - stub_request(:get, 'http://localhost:5000/actor').to_raise(Mastodon::HostValidationError) + stub_request(:get, 'http://localhost:5000/actor#main-key').to_raise(Mastodon::HostValidationError) end describe '#signed_request?' do diff --git a/spec/lib/request_spec.rb b/spec/lib/request_spec.rb index 8ccfcacef2..f0861376b9 100644 --- a/spec/lib/request_spec.rb +++ b/spec/lib/request_spec.rb @@ -4,9 +4,7 @@ require 'rails_helper' require 'securerandom' describe Request do - subject { described_class.new(:get, url) } - - let(:url) { 'http://example.com' } + subject { described_class.new(:get, 'http://example.com') } describe '#headers' do it 'returns user agent' do @@ -94,152 +92,6 @@ describe Request do expect { subject.perform }.to raise_error Mastodon::ValidationError end end - - context 'with bare domain URL' do - let(:url) { 'http://example.com' } - - before do - stub_request(:get, 'http://example.com') - end - - it 'normalizes path' do - subject.perform do |response| - expect(response.request.uri.path).to eq '/' - end - end - - it 'normalizes path used for request signing' do - subject.perform - - headers = subject.instance_variable_get(:@headers) - expect(headers[Request::REQUEST_TARGET]).to eq 'get /' - end - - it 'normalizes path used in request line' do - subject.perform do |response| - expect(response.request.headline).to eq 'GET / HTTP/1.1' - end - end - end - - context 'with unnormalized URL' do - let(:url) { 'HTTP://EXAMPLE.com:80/foo%41%3A?bar=%41%3A#baz' } - - before do - stub_request(:get, 'http://example.com/foo%41%3A?bar=%41%3A') - end - - it 'normalizes scheme' do - subject.perform do |response| - expect(response.request.uri.scheme).to eq 'http' - end - end - - it 'normalizes host' do - subject.perform do |response| - expect(response.request.uri.authority).to eq 'example.com' - end - end - - it 'does not modify path' do - subject.perform do |response| - expect(response.request.uri.path).to eq '/foo%41%3A' - end - end - - it 'does not modify query string' do - subject.perform do |response| - expect(response.request.uri.query).to eq 'bar=%41%3A' - end - end - - it 'does not modify path used for request signing' do - subject.perform - - headers = subject.instance_variable_get(:@headers) - expect(headers[Request::REQUEST_TARGET]).to eq 'get /foo%41%3A' - end - - it 'does not modify path used in request line' do - subject.perform do |response| - expect(response.request.headline).to eq 'GET /foo%41%3A?bar=%41%3A HTTP/1.1' - end - end - - it 'strips fragment' do - subject.perform do |response| - expect(response.request.uri.fragment).to be_nil - end - end - end - - context 'with non-ASCII URL' do - let(:url) { 'http://éxample.com:81/föo?bär=1' } - - before do - stub_request(:get, 'http://xn--xample-9ua.com:81/f%C3%B6o?b%C3%A4r=1') - end - - it 'IDN-encodes host' do - subject.perform do |response| - expect(response.request.uri.authority).to eq 'xn--xample-9ua.com:81' - end - end - - it 'IDN-encodes host in Host header' do - subject.perform do |response| - expect(response.request.headers['Host']).to eq 'xn--xample-9ua.com' - end - end - - it 'percent-escapes path used for request signing' do - subject.perform - - headers = subject.instance_variable_get(:@headers) - expect(headers[Request::REQUEST_TARGET]).to eq 'get /f%C3%B6o' - end - - it 'normalizes path used in request line' do - subject.perform do |response| - expect(response.request.headline).to eq 'GET /f%C3%B6o?b%C3%A4r=1 HTTP/1.1' - end - end - end - - context 'with redirecting URL' do - let(:url) { 'http://example.com/foo' } - - before do - stub_request(:get, 'http://example.com/foo').to_return(status: 302, headers: { 'Location' => 'HTTPS://EXAMPLE.net/Bar' }) - stub_request(:get, 'https://example.net/Bar').to_return(body: 'Lorem ipsum') - end - - it 'resolves redirect' do - subject.perform do |response| - expect(response.body.to_s).to eq 'Lorem ipsum' - end - - expect(a_request(:get, 'https://example.net/Bar')).to have_been_made - end - - it 'normalizes destination scheme' do - subject.perform do |response| - expect(response.request.uri.scheme).to eq 'https' - end - end - - it 'normalizes destination host' do - subject.perform do |response| - expect(response.request.uri.authority).to eq 'example.net' - end - end - - it 'does modify path' do - subject.perform do |response| - expect(response.request.uri.path).to eq '/Bar' - end - end - end end describe "response's body_with_limit method" do diff --git a/streaming/index.js b/streaming/index.js index ced2383853..9e6d69d4eb 100644 --- a/streaming/index.js +++ b/streaming/index.js @@ -174,6 +174,28 @@ const redisConfigFromEnv = (env) => { }; }; +const PUBLIC_CHANNELS = [ + 'public', + 'public:media', + 'public:local', + 'public:local:media', + 'public:remote', + 'public:remote:media', + 'hashtag', + 'hashtag:local', +]; + +// Used for priming the counters/gauges for the various metrics that are +// per-channel +const CHANNEL_NAMES = [ + 'system', + 'user', + 'user:notification', + 'list', + 'direct', + ...PUBLIC_CHANNELS +]; + const startServer = async () => { const app = express(); @@ -225,9 +247,6 @@ const startServer = async () => { labelNames: ['type'], }); - connectedClients.set({ type: 'websocket' }, 0); - connectedClients.set({ type: 'eventsource' }, 0); - const connectedChannels = new metrics.Gauge({ name: 'connected_channels', help: 'The number of channels the streaming server is streaming to', @@ -239,6 +258,35 @@ const startServer = async () => { help: 'The number of Redis channels the streaming server is subscribed to', }); + const redisMessagesReceived = new metrics.Counter({ + name: 'redis_messages_received_total', + help: 'The total number of messages the streaming server has received from redis subscriptions' + }); + + const messagesSent = new metrics.Counter({ + name: 'messages_sent_total', + help: 'The total number of messages the streaming server sent to clients per connection type', + labelNames: [ 'type' ] + }); + + // Prime the gauges so we don't loose metrics between restarts: + redisSubscriptions.set(0); + connectedClients.set({ type: 'websocket' }, 0); + connectedClients.set({ type: 'eventsource' }, 0); + + // For each channel, initialize the gauges at zero; There's only a finite set of channels available + CHANNEL_NAMES.forEach(( channel ) => { + connectedChannels.set({ type: 'websocket', channel }, 0); + connectedChannels.set({ type: 'eventsource', channel }, 0); + }) + + // Prime the counters so that we don't loose metrics between restarts. + // Unfortunately counters don't support the set() API, so instead I'm using + // inc(0) to achieve the same result. + redisMessagesReceived.inc(0); + messagesSent.inc({ type: 'websocket' }, 0); + messagesSent.inc({ type: 'eventsource' }, 0); + // When checking metrics in the browser, the favicon is requested this // prevents the request from falling through to the API Router, which would // error for this endpoint: @@ -284,6 +332,8 @@ const startServer = async () => { * @param {string} message */ const onRedisMessage = (channel, message) => { + redisMessagesReceived.inc(); + const callbacks = subs[channel]; log.silly(`New message on channel ${redisPrefix}${channel}`); @@ -512,17 +562,6 @@ const startServer = async () => { } }; - const PUBLIC_CHANNELS = [ - 'public', - 'public:media', - 'public:local', - 'public:local:media', - 'public:remote', - 'public:remote:media', - 'hashtag', - 'hashtag:local', - ]; - /** * @param {any} req * @param {string|undefined} channelName @@ -727,11 +766,12 @@ const startServer = async () => { * @param {any} req * @param {function(string, string): void} output * @param {undefined | function(string[], SubscriptionListener): void} attachCloseHandler + * @param {'websocket' | 'eventsource'} destinationType * @param {boolean=} needsFiltering * @param {boolean=} allowLocalOnly * @returns {SubscriptionListener} */ - const streamFrom = (ids, req, output, attachCloseHandler, needsFiltering = false, allowLocalOnly = false) => { + const streamFrom = (ids, req, output, attachCloseHandler, destinationType, needsFiltering = false, allowLocalOnly = false) => { const accountId = req.accountId || req.remoteAddress; log.verbose(req.requestId, `Starting stream from ${ids.join(', ')} for ${accountId}`); @@ -740,6 +780,8 @@ const startServer = async () => { // TODO: Replace "string"-based delete payloads with object payloads: const encodedPayload = typeof payload === 'object' ? JSON.stringify(payload) : payload; + messagesSent.labels({ type: destinationType }).inc(1); + log.silly(req.requestId, `Transmitting for ${accountId}: ${event} ${encodedPayload}`); output(event, encodedPayload); }; @@ -1060,7 +1102,7 @@ const startServer = async () => { const onSend = streamToHttp(req, res); const onEnd = streamHttpEnd(req, subscriptionHeartbeat(channelIds)); - streamFrom(channelIds, req, onSend, onEnd, options.needsFiltering, options.allowLocalOnly); + streamFrom(channelIds, req, onSend, onEnd, 'eventsource', options.needsFiltering, options.allowLocalOnly); }).catch(err => { log.verbose(req.requestId, 'Subscription error:', err.toString()); httpNotFound(res); @@ -1284,7 +1326,7 @@ const startServer = async () => { const onSend = streamToWs(request, socket, streamNameFromChannelName(channelName, params)); const stopHeartbeat = subscriptionHeartbeat(channelIds); - const listener = streamFrom(channelIds, request, onSend, undefined, options.needsFiltering, options.allowLocalOnly); + const listener = streamFrom(channelIds, request, onSend, undefined, 'websocket', options.needsFiltering, options.allowLocalOnly); connectedChannels.labels({ type: 'websocket', channel: channelName }).inc();