diff --git a/AUTHORS.md b/AUTHORS.md index dfbd2cdcd..1bcf455b1 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -1,3 +1,6 @@ +Authors +======= + Mastodon is available on [GitHub](https://github.com/tootsuite/mastodon) and provided thanks to the work of the following contributors: @@ -581,3 +584,248 @@ and provided thanks to the work of the following contributors: * [雨宮美羽](mailto:k737566@gmail.com) This document is provided for informational purposes only. Since it is only updated once per release, the version you are looking at may be currently out of date. To see the full list of contributors, consider looking at the [git history](https://github.com/tootsuite/mastodon/graphs/contributors) instead. + +## Translators + +Following people have contributed to translation of Mastodon: + +- **Arabic** + - ButterflyOfFire +- **Asturian** + - ButterflyOfFire + - Enol P. +- **Basque** + - Aitzol + - ButterflyOfFire + - Gorka Azkarate + - Osoitz + - Peru Iparragirre +- **Bulgarian** + - ButterflyOfFire +- **Catalan** + - ButterflyOfFire + - Joan Montané + - Jose Luis + - spla +- **Chinese (Hong Kong)** + - ButterflyOfFire + - Luzi Leung +- **Chinese (Simplified)** + - Allen Zhong + - ButterflyOfFire + - SerCom_KC +- **Chinese (Traditional)** + - ButterflyOfFire + - James58899 + - Jeff Huang + - S1ttidoe477 + - SHA265 +- **Corsican** + - Alix D. R. + - ButterflyOfFire +- **Croatian** + - ButterflyOfFire +- **Czech** + - ButterflyOfFire + - Lorem Ipsum + - Marek Ľach +- **Danish** + - ButterflyOfFire + - Rasmus Sæderup +- **Dutch** + - ButterflyOfFire + - Jelv + - jeroenpraat + - rscmbbng +- **English** + - ButterflyOfFire + - Renato "Lond" Cerqueira +- **Esperanto** + - ButterflyOfFire + - Jeong Arm + - Martin Bodin + - Mélanie Chauvel + - Vanege + - tuxayo/Victor Grousset +- **Finnish** + - ButterflyOfFire + - Jonne Arjoranta + - S Heija + - Taru Luojola +- **French** + - Alda Marteau-Hardi + - Alix D. R. + - Baptiste Jonglez + - ButterflyOfFire + - Franck Paul + - Jean-Baptiste Holcroft + - Jonathan Chan + - Letiteuf55 + - Martin Bodin + - Mélanie Chauvel + - Olivier Humbert + - Paul Marques Mota + - Sylvhem + - Technowix + - Thibaut Girka + - Théodore + - azenet + - codl +- **Galician** + - ButterflyOfFire + - Xose M. + - manequim +- **Georgian** + - ButterflyOfFire +- **German** + - Benedikt Geißler + - ButterflyOfFire + - Daniel + - Eugen Rochko + - Koyu Berteon + - Patrick Figel + - Weblate Admin + - averageunicorn + - ePirat + - koyu + - larsreineke + - lilo +- **Greek** + - Antonis + - ButterflyOfFire + - Dimitris Maroulidis + - Konstantinos Grevenitis +- **Hebrew** + - ButterflyOfFire + - Ira + - Yaron Shahrabani +- **Hungarian** + - Adam Paszternak + - ButterflyOfFire + - Tibike Miklós +- **Ido** + - ButterflyOfFire +- **Indonesian** + - Alfiana Sibuea + - ButterflyOfFire + - Dito Kurnia Pratama + - Eirworks + - afachri + - se7entime +- **Italian** + - Alessandro Levati + - ButterflyOfFire + - Giuseppe Pignataro + - Stefano +- **Japanese** + - ButterflyOfFire + - Kumasun Morino + - Yamagishi Kazutoshi + - mayaeh + - osapon + - unarist + - 小鳥遊まりあ + - 森の子リスのミーコの大冒険 +- **Korean** + - ButterflyOfFire + - Jeong Arm + - Minori Hiraoka + - Yamagishi Kazutoshi +- **Malay** + - ButterflyOfFire + - Muhammad Nur Hidayat (MNH48) +- **Norwegian (old code)** + - ButterflyOfFire + - Espen Rønnevik + - Tale +- **Occitan** + - ButterflyOfFire + - Maxenç + - Quenti2 + - Quentí +- **Persian** + - ButterflyOfFire + - Masoud Abkenar +- **Polish** + - ButterflyOfFire + - Jakub Mendyk + - Marcin Mikołajczak + - Marek Ľach + - Stasiek Michalski + - krkk +- **Portuguese** + - ButterflyOfFire + - Hugo Gameiro + - manequim +- **Portuguese (Brazil)** + - André Andrade + - Anna e só + - ButterflyOfFire + - Renato "Lond" Cerqueira +- **Romanian** + - ButterflyOfFire + - adrianbblk +- **Russian** + - Andrew Zyabin + - ButterflyOfFire + - Evgeny Petrov + - Yaron Shahrabani +- **Serbian** + - Branko Kokanovic + - Burekz Finezt + - ButterflyOfFire +- **Serbian (latin)** + - ButterflyOfFire +- **Slovak** + - ButterflyOfFire + - Ivan Pleva + - Lorem Ipsum + - Marek Ľach + - Peter +- **Slovenian** + - ButterflyOfFire + - Kristijan Tkalec +- **Spanish** + - Angeles Broullón + - Antón López + - ButterflyOfFire + - Carlos Mondragon + - David Charte + - Emmanuel + - Lothar Wolf + - Pablo de la Concepción Sanz +- **Swedish** + - ButterflyOfFire + - Elias Mårtenson + - Isak Holmström + - Shellkr + - Stefan Midjich + - Tim Stahel +- **Telugu** + - ButterflyOfFire + - Joseph Nuthalapati + - Ranjith Tellakula + - avndp +- **Thai** + - ButterflyOfFire +- **Turkish** + - ButterflyOfFire +- **Ukrainian** + - ButterflyOfFire + - Ivan Verchenko + - alexcleac +- **Welsh** + - ButterflyOfFire + - Jaz-Michael King + - Kevin Beynon + - Owain Rhys Lewis + - Renato "Lond" Cerqueira + - Rhoslyn Prys + - carl morris +- **Armenian** + - ButterflyOfFire +- **Latvian** + - ButterflyOfFire +- **Tamil** + - ButterflyOfFire + - Prasanna Venkadesh diff --git a/CHANGELOG.md b/CHANGELOG.md index 0ce92ec00..3bafbe1e9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,304 +3,328 @@ Changelog All notable changes to this project will be documented in this file. -## [Unreleased] +## [2.7.0] - 2019-01-20 ### Added -- Add link for adding a user to a list from their profile (#9062) -- Add joining several hashtags in a single column (#8904) -- Add volume sliders for videos (#9366) -- Add a tooltip explaining what a locked account is (#9403) -- Add preloaded cache for common JSON-LD contexts (#9412) -- Add profile directory (#9427) -- Add setting to not group reblogs in home feed (#9248) -- Add admin ability to remove a user's header image (#9495) -- Add account hashtags to ActivityPub actor JSON (#9450) -- Add error message for avatar image that's too large (#9518) -- Add notification quick-filter bar (#9399) -- Add new first-time tutorial (#9531) -- Add moderation warnings (#9519) -- Add emoji codepoint mappings for v11.0 (#9618) -- Add REST API for creating an account (#9572) -- Add support for Malayalam in language filter (#9624) -- Add exclude_reblogs option to account statuses API (#9640) -- Add local followers page to admin account UI (#9610) -- Add healthcheck commands to docker-compose.yml (#9143) -- Add handler for Move activity to migrate followers (#9629) -- Add CSV export for lists and domain blocks (#9677) -- Add `tootctl accounts follow ACCT` (#9414) -- Add scheduled statuses (#9706) -- Add immutable caching for S3 objects (#9722) -- Add cache to custom emojis API (#9732) -- Add preview cards to non-detailed statuses on public pages (#9714) -- Add `mod` and `moderator` to list of default reserved usernames (#9713) -- Add quick links to the admin interface in the web UI (#8545) +- Add link for adding a user to a list from their profile ([namelessGonbai](https://github.com/tootsuite/mastodon/pull/9062)) +- Add joining several hashtags in a single column ([gdpelican](https://github.com/tootsuite/mastodon/pull/8904)) +- Add volume sliders for videos ([sumdog](https://github.com/tootsuite/mastodon/pull/9366)) +- Add a tooltip explaining what a locked account is ([pawelngei](https://github.com/tootsuite/mastodon/pull/9403)) +- Add preloaded cache for common JSON-LD contexts ([ThibG](https://github.com/tootsuite/mastodon/pull/9412)) +- Add profile directory ([Gargron](https://github.com/tootsuite/mastodon/pull/9427)) +- Add setting to not group reblogs in home feed ([ThibG](https://github.com/tootsuite/mastodon/pull/9248)) +- Add admin ability to remove a user's header image ([ThibG](https://github.com/tootsuite/mastodon/pull/9495)) +- Add account hashtags to ActivityPub actor JSON ([Gargron](https://github.com/tootsuite/mastodon/pull/9450)) +- Add error message for avatar image that's too large ([sumdog](https://github.com/tootsuite/mastodon/pull/9518)) +- Add notification quick-filter bar ([pawelngei](https://github.com/tootsuite/mastodon/pull/9399)) +- Add new first-time tutorial ([Gargron](https://github.com/tootsuite/mastodon/pull/9531)) +- Add moderation warnings ([Gargron](https://github.com/tootsuite/mastodon/pull/9519)) +- Add emoji codepoint mappings for v11.0 ([Gargron](https://github.com/tootsuite/mastodon/pull/9618)) +- Add REST API for creating an account ([Gargron](https://github.com/tootsuite/mastodon/pull/9572)) +- Add support for Malayalam in language filter ([tachyons](https://github.com/tootsuite/mastodon/pull/9624)) +- Add exclude_reblogs option to account statuses API ([Gargron](https://github.com/tootsuite/mastodon/pull/9640)) +- Add local followers page to admin account UI ([chr-1x](https://github.com/tootsuite/mastodon/pull/9610)) +- Add healthcheck commands to docker-compose.yml ([BenLubar](https://github.com/tootsuite/mastodon/pull/9143)) +- Add handler for Move activity to migrate followers ([Gargron](https://github.com/tootsuite/mastodon/pull/9629)) +- Add CSV export for lists and domain blocks ([Gargron](https://github.com/tootsuite/mastodon/pull/9677)) +- Add `tootctl accounts follow ACCT` ([Gargron](https://github.com/tootsuite/mastodon/pull/9414)) +- Add scheduled statuses ([Gargron](https://github.com/tootsuite/mastodon/pull/9706)) +- Add immutable caching for S3 objects ([nolanlawson](https://github.com/tootsuite/mastodon/pull/9722)) +- Add cache to custom emojis API ([Gargron](https://github.com/tootsuite/mastodon/pull/9732)) +- Add preview cards to non-detailed statuses on public pages ([Gargron](https://github.com/tootsuite/mastodon/pull/9714)) +- Add `mod` and `moderator` to list of default reserved usernames ([Gargron](https://github.com/tootsuite/mastodon/pull/9713)) +- Add quick links to the admin interface in the web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/8545)) +- Add `tootctl domains crawl` ([Gargron](https://github.com/tootsuite/mastodon/pull/9809)) +- Add attachment list fallback to public pages ([ThibG](https://github.com/tootsuite/mastodon/pull/9780)) +- Add `tootctl --version` ([Gargron](https://github.com/tootsuite/mastodon/pull/9835)) +- Add information about how to opt-in to the directory on the directory ([Gargron](https://github.com/tootsuite/mastodon/pull/9834)) +- Add timeouts for S3 ([Gargron](https://github.com/tootsuite/mastodon/pull/9842)) +- Add support for non-public reblogs from ActivityPub ([Gargron](https://github.com/tootsuite/mastodon/pull/9841)) +- Add sending of `Reject` activity when sending a `Block` activity ([ThibG](https://github.com/tootsuite/mastodon/pull/9811)) ### Changed -- Temporarily pause timeline if mouse moved recently (#9200) -- Change the password form order (#9267) -- Redesign admin UI for accounts (#9340, #9643) -- Redesign admin UI for instances/domain blocks (#9645) -- Swap avatar and header input fields in profile page (#9271) -- When posting in mobile mode, go back to previous history location (#9502) -- Split out is_changing_upload from is_submitting (#9536) -- Back to the getting-started when pins the timeline. (#9561) -- Allow unauthenticated REST API access to GET /api/v1/accounts/:id/statuses (#9573) -- Limit maximum visibility of local silenced users to unlisted (#9583) -- Change API error message for unconfirmed accounts (#9625) -- Change the icon to "reply-all" when it's a reply to other accounts (#9378) -- Do not ignore federated reports targetting already-reported accounts (#9534) -- Upgrade default Ruby version to 2.6.0 (#9688) -- Change e-mail digest frequency (#9689) -- Change Docker images for Tor support in docker-compose.yml (#9438) -- Display fallback link card thumbnail when none is given (#9715) -- Change account bio length validation to ignore mention domains and URLs (#9717) -- Use configured contact user for "anonymous" federation activities (#9661) -- Change remote interaction dialog to use specific actions instead of generic "interact" (#9743) -- Always re-fetch public key when signature verification fails to support blind key rotation (#9667) -- Make replies to boosts impossible, connect reply to original status instead (#9129) -- Change e-mail MX validation to check both A and MX records against blacklist (#9489) +- Temporarily pause timeline if mouse moved recently ([lmorchard](https://github.com/tootsuite/mastodon/pull/9200)) +- Change the password form order ([mayaeh](https://github.com/tootsuite/mastodon/pull/9267)) +- Redesign admin UI for accounts ([Gargron](https://github.com/tootsuite/mastodon/pull/9340), [Gargron](https://github.com/tootsuite/mastodon/pull/9643)) +- Redesign admin UI for instances/domain blocks ([Gargron](https://github.com/tootsuite/mastodon/pull/9645)) +- Swap avatar and header input fields in profile page ([ThibG](https://github.com/tootsuite/mastodon/pull/9271)) +- When posting in mobile mode, go back to previous history location ([ThibG](https://github.com/tootsuite/mastodon/pull/9502)) +- Split out is_changing_upload from is_submitting ([ThibG](https://github.com/tootsuite/mastodon/pull/9536)) +- Back to the getting-started when pins the timeline. ([kedamaDQ](https://github.com/tootsuite/mastodon/pull/9561)) +- Allow unauthenticated REST API access to GET /api/v1/accounts/:id/statuses ([Gargron](https://github.com/tootsuite/mastodon/pull/9573)) +- Limit maximum visibility of local silenced users to unlisted ([ThibG](https://github.com/tootsuite/mastodon/pull/9583)) +- Change API error message for unconfirmed accounts ([noellabo](https://github.com/tootsuite/mastodon/pull/9625)) +- Change the icon to "reply-all" when it's a reply to other accounts ([mayaeh](https://github.com/tootsuite/mastodon/pull/9378)) +- Do not ignore federated reports targetting already-reported accounts ([ThibG](https://github.com/tootsuite/mastodon/pull/9534)) +- Upgrade default Ruby version to 2.6.0 ([Gargron](https://github.com/tootsuite/mastodon/pull/9688)) +- Change e-mail digest frequency ([Gargron](https://github.com/tootsuite/mastodon/pull/9689)) +- Change Docker images for Tor support in docker-compose.yml ([Sir-Boops](https://github.com/tootsuite/mastodon/pull/9438)) +- Display fallback link card thumbnail when none is given ([Gargron](https://github.com/tootsuite/mastodon/pull/9715)) +- Change account bio length validation to ignore mention domains and URLs ([Gargron](https://github.com/tootsuite/mastodon/pull/9717)) +- Use configured contact user for "anonymous" federation activities ([yukimochi](https://github.com/tootsuite/mastodon/pull/9661)) +- Change remote interaction dialog to use specific actions instead of generic "interact" ([Gargron](https://github.com/tootsuite/mastodon/pull/9743)) +- Always re-fetch public key when signature verification fails to support blind key rotation ([ThibG](https://github.com/tootsuite/mastodon/pull/9667)) +- Make replies to boosts impossible, connect reply to original status instead ([valerauko](https://github.com/tootsuite/mastodon/pull/9129)) +- Change e-mail MX validation to check both A and MX records against blacklist ([Gargron](https://github.com/tootsuite/mastodon/pull/9489)) +- Hide floating action button on search and getting started pages ([tmm576](https://github.com/tootsuite/mastodon/pull/9826)) +- Redesign public hashtag page to use a masonry layout ([Gargron](https://github.com/tootsuite/mastodon/pull/9822)) +- Use `summary` as summary instead of content warning for converted ActivityPub objects ([Gargron](https://github.com/tootsuite/mastodon/pull/9823)) +- Display a double reply arrow on public pages for toots that are replies ([ThibG](https://github.com/tootsuite/mastodon/pull/9808)) +- Change admin UI right panel size to be wider ([Kjwon15](https://github.com/tootsuite/mastodon/pull/9768)) ### Removed -- Remove links to bridge.joinmastodon.org (non-functional) (#9608) -- Remove LD-Signatures from activities that do not need them (#9659) +- Remove links to bridge.joinmastodon.org (non-functional) ([Gargron](https://github.com/tootsuite/mastodon/pull/9608)) +- Remove LD-Signatures from activities that do not need them ([ThibG](https://github.com/tootsuite/mastodon/pull/9659)) ### Fixed -- Remove unused computation of reblog references from updateTimeline (#9244) -- Fix loaded embeds resetting if a status arrives from API again (#9270) -- Fix race condition causing shallow status with only a "favourited" attribute (#9272) -- Remove intermediary arrays when creating hash maps from results (#9291) -- Extract counters from accounts table to account_stats table to improve performance (#9295) -- Change identities id column to a bigint (#9371) -- Fix conversations API pagination (#9407) -- Improve account suspension speed and completeness (#9290) -- Fix thread depth computation in statuses_controller (#9426) -- Fix database deadlocks by moving account stats update outside transaction (#9437) -- Escape HTML in profile name preview in profile settings (#9446) -- Use same CORS policy for /@:username and /users/:username (#9485) -- Make custom emoji domains case insensitive (#9474) -- Various fixes to scrollable lists and media gallery (#9501) -- Fix bootsnap cache directory being declared relatively (#9511) -- Fix timeline pagination in the web UI (#9516) -- Fix padding on dropdown elements in preferences (#9517) -- Make avatar and headers respect GIF autoplay settings (#9515) -- Do no retry Web Push workers if the server returns a 4xx response (#9434) -- Minor scrollable list fixes (#9551) -- Ignore low-confidence CharlockHolmes guesses when parsing link cards (#9510) -- Fix `tootctl accounts rotate` not updating public keys (#9556) -- Fix CSP / X-Frame-Options for media players (#9558) -- Fix unnecessary loadMore calls when the end of a timeline has been reached (#9581) -- Skip mailer job retries when a record no longer exists (#9590) -- Fix composer not getting focus after reply confirmation dialog (#9602) -- Fix signature verification stoplight triggering on non-timeout errors (#9617) -- Fix ThreadResolveWorker getting queued with invalid URLs (#9628) -- Fix crash when clearing uninitialized timeline (#9662) -- Avoid duplicate work by merging ReplyDistributionWorker into DistributionWorker (#9660) -- Skip full text search if it fails, instead of erroring out completely (#9654) -- Fix profile metadata links not verifying correctly sometimes (#9673) -- Ensure blocked user unfollows blocker if Block/Undo-Block activities are processed out of order (#9687) -- Fix unreadable text color in report modal for some statuses (#9716) -- Stop GIFV timeline preview explicitly when it's opened in modal (#9749) +- Remove unused computation of reblog references from updateTimeline ([ThibG](https://github.com/tootsuite/mastodon/pull/9244)) +- Fix loaded embeds resetting if a status arrives from API again ([ThibG](https://github.com/tootsuite/mastodon/pull/9270)) +- Fix race condition causing shallow status with only a "favourited" attribute ([ThibG](https://github.com/tootsuite/mastodon/pull/9272)) +- Remove intermediary arrays when creating hash maps from results ([Gargron](https://github.com/tootsuite/mastodon/pull/9291)) +- Extract counters from accounts table to account_stats table to improve performance ([Gargron](https://github.com/tootsuite/mastodon/pull/9295)) +- Change identities id column to a bigint ([Gargron](https://github.com/tootsuite/mastodon/pull/9371)) +- Fix conversations API pagination ([ThibG](https://github.com/tootsuite/mastodon/pull/9407)) +- Improve account suspension speed and completeness ([Gargron](https://github.com/tootsuite/mastodon/pull/9290)) +- Fix thread depth computation in statuses_controller ([ThibG](https://github.com/tootsuite/mastodon/pull/9426)) +- Fix database deadlocks by moving account stats update outside transaction ([ThibG](https://github.com/tootsuite/mastodon/pull/9437)) +- Escape HTML in profile name preview in profile settings ([pawelngei](https://github.com/tootsuite/mastodon/pull/9446)) +- Use same CORS policy for /@:username and /users/:username ([ThibG](https://github.com/tootsuite/mastodon/pull/9485)) +- Make custom emoji domains case insensitive ([Esteth](https://github.com/tootsuite/mastodon/pull/9474)) +- Various fixes to scrollable lists and media gallery ([ThibG](https://github.com/tootsuite/mastodon/pull/9501)) +- Fix bootsnap cache directory being declared relatively ([Gargron](https://github.com/tootsuite/mastodon/pull/9511)) +- Fix timeline pagination in the web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/9516)) +- Fix padding on dropdown elements in preferences ([ThibG](https://github.com/tootsuite/mastodon/pull/9517)) +- Make avatar and headers respect GIF autoplay settings ([ThibG](https://github.com/tootsuite/mastodon/pull/9515)) +- Do no retry Web Push workers if the server returns a 4xx response ([Gargron](https://github.com/tootsuite/mastodon/pull/9434)) +- Minor scrollable list fixes ([ThibG](https://github.com/tootsuite/mastodon/pull/9551)) +- Ignore low-confidence CharlockHolmes guesses when parsing link cards ([ThibG](https://github.com/tootsuite/mastodon/pull/9510)) +- Fix `tootctl accounts rotate` not updating public keys ([Gargron](https://github.com/tootsuite/mastodon/pull/9556)) +- Fix CSP / X-Frame-Options for media players ([jomo](https://github.com/tootsuite/mastodon/pull/9558)) +- Fix unnecessary loadMore calls when the end of a timeline has been reached ([ThibG](https://github.com/tootsuite/mastodon/pull/9581)) +- Skip mailer job retries when a record no longer exists ([Gargron](https://github.com/tootsuite/mastodon/pull/9590)) +- Fix composer not getting focus after reply confirmation dialog ([ThibG](https://github.com/tootsuite/mastodon/pull/9602)) +- Fix signature verification stoplight triggering on non-timeout errors ([Gargron](https://github.com/tootsuite/mastodon/pull/9617)) +- Fix ThreadResolveWorker getting queued with invalid URLs ([Gargron](https://github.com/tootsuite/mastodon/pull/9628)) +- Fix crash when clearing uninitialized timeline ([ThibG](https://github.com/tootsuite/mastodon/pull/9662)) +- Avoid duplicate work by merging ReplyDistributionWorker into DistributionWorker ([ThibG](https://github.com/tootsuite/mastodon/pull/9660)) +- Skip full text search if it fails, instead of erroring out completely ([Kjwon15](https://github.com/tootsuite/mastodon/pull/9654)) +- Fix profile metadata links not verifying correctly sometimes ([shrft](https://github.com/tootsuite/mastodon/pull/9673)) +- Ensure blocked user unfollows blocker if Block/Undo-Block activities are processed out of order ([ThibG](https://github.com/tootsuite/mastodon/pull/9687)) +- Fix unreadable text color in report modal for some statuses ([Gargron](https://github.com/tootsuite/mastodon/pull/9716)) +- Stop GIFV timeline preview explicitly when it's opened in modal ([kedamaDQ](https://github.com/tootsuite/mastodon/pull/9749)) +- Fix scrollbar width compensation ([ThibG](https://github.com/tootsuite/mastodon/pull/9824)) +- Fix race conditions when processing deleted toots ([ThibG](https://github.com/tootsuite/mastodon/pull/9815)) +- Fix SSO issues on WebKit browsers by disabling Same-Site cookie again ([moritzheiber](https://github.com/tootsuite/mastodon/pull/9819)) +- Fix empty OEmbed error ([renatolond](https://github.com/tootsuite/mastodon/pull/9807)) +- Fix drag & drop modal not disappearing sometimes ([hinaloe](https://github.com/tootsuite/mastodon/pull/9797)) +- Fix statuses with content warnings being displayed in web push notifications sometimes ([ThibG](https://github.com/tootsuite/mastodon/pull/9778)) +- Fix scroll-to-detailed status not working on public pages ([ThibG](https://github.com/tootsuite/mastodon/pull/9773)) +- Fix media modal loading indicator ([ThibG](https://github.com/tootsuite/mastodon/pull/9771)) +- Fix hashtag search results not having a permalink fallback in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/9810)) +- Fix slightly cropped font on settings page dropdowns when using system font ([ariasuni](https://github.com/tootsuite/mastodon/pull/9839)) +- Fix not being able to drag & drop text into forms ([tmm576](https://github.com/tootsuite/mastodon/pull/9840)) ### Security -- Sanitize and sandbox toot embeds in web UI (#9552) +- Sanitize and sandbox toot embeds in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/9552)) +- Add tombstones for remote statuses to prevent replay attacks ([ThibG](https://github.com/tootsuite/mastodon/pull/9830)) ## [2.6.5] - 2018-12-01 ### Changed -- Change lists to display replies to others on the list and list owner (#9324) +- Change lists to display replies to others on the list and list owner ([ThibG](https://github.com/tootsuite/mastodon/pull/9324)) ### Fixed -- Fix failures caused by commonly-used JSON-LD contexts being unavailable (#9412) +- Fix failures caused by commonly-used JSON-LD contexts being unavailable ([ThibG](https://github.com/tootsuite/mastodon/pull/9412)) ## [2.6.4] - 2018-11-30 ### Fixed -- Fix yarn dependencies not installing due to yanked event-stream package (#9401) +- Fix yarn dependencies not installing due to yanked event-stream package ([Gargron](https://github.com/tootsuite/mastodon/pull/9401)) ## [2.6.3] - 2018-11-30 ### Added -- Add hyphen to characters allowed in remote usernames (#9345) +- Add hyphen to characters allowed in remote usernames ([ThibG](https://github.com/tootsuite/mastodon/pull/9345)) ### Changed -- Change server user count to exclude suspended accounts (#9380) +- Change server user count to exclude suspended accounts ([Gargron](https://github.com/tootsuite/mastodon/pull/9380)) ### Fixed -- Fix ffmpeg processing sometimes stalling due to overfilled stdout buffer (#9368) -- Fix missing DNS records raising the wrong kind of exception (#9379) -- Fix already queued deliveries still trying to reach inboxes marked as unavailable (#9358) +- Fix ffmpeg processing sometimes stalling due to overfilled stdout buffer ([hugogameiro](https://github.com/tootsuite/mastodon/pull/9368)) +- Fix missing DNS records raising the wrong kind of exception ([Gargron](https://github.com/tootsuite/mastodon/pull/9379)) +- Fix already queued deliveries still trying to reach inboxes marked as unavailable ([Gargron](https://github.com/tootsuite/mastodon/pull/9358)) ### Security -- Fix TLS handshake timeout not being enforced (#9381) +- Fix TLS handshake timeout not being enforced ([Gargron](https://github.com/tootsuite/mastodon/pull/9381)) ## [2.6.2] - 2018-11-23 ### Added -- Add Page to whitelisted ActivityPub types (#9188) -- Add 20px to column width in web UI (#9227) -- Add amount of freed disk space in `tootctl media remove` (#9229, #9239, #9288) -- Add "Show thread" link to self-replies (#9228) +- Add Page to whitelisted ActivityPub types ([mbajur](https://github.com/tootsuite/mastodon/pull/9188)) +- Add 20px to column width in web UI ([Gargron](https://github.com/tootsuite/mastodon/pull/9227)) +- Add amount of freed disk space in `tootctl media remove` ([Gargron](https://github.com/tootsuite/mastodon/pull/9229), [Gargron](https://github.com/tootsuite/mastodon/pull/9239), [mayaeh](https://github.com/tootsuite/mastodon/pull/9288)) +- Add "Show thread" link to self-replies ([Gargron](https://github.com/tootsuite/mastodon/pull/9228)) ### Changed -- Change order of Atom and RSS links so Atom is first (#9302) -- Change Nginx configuration for Nanobox apps (#9310) -- Change the follow action to appear instant in web UI (#9220) -- Change how the ActiveRecord connection is instantiated in on_worker_boot (#9238) -- Change `tootctl accounts cull` to always touch accounts so they can be skipped (#9293) -- Change mime type comparison to ignore JSON-LD profile (#9179) +- Change order of Atom and RSS links so Atom is first ([Alkarex](https://github.com/tootsuite/mastodon/pull/9302)) +- Change Nginx configuration for Nanobox apps ([danhunsaker](https://github.com/tootsuite/mastodon/pull/9310)) +- Change the follow action to appear instant in web UI ([Gargron](https://github.com/tootsuite/mastodon/pull/9220)) +- Change how the ActiveRecord connection is instantiated in on_worker_boot ([Gargron](https://github.com/tootsuite/mastodon/pull/9238)) +- Change `tootctl accounts cull` to always touch accounts so they can be skipped ([renatolond](https://github.com/tootsuite/mastodon/pull/9293)) +- Change mime type comparison to ignore JSON-LD profile ([valerauko](https://github.com/tootsuite/mastodon/pull/9179)) ### Fixed -- Fix web UI crash when conversation has no last status (#9207) -- Fix follow limit validator reporting lower number past threshold (#9230) -- Fix form validation flash message color and input borders (#9235) -- Fix invalid twitter:player cards being displayed (#9254) -- Fix emoji update date being processed incorrectly (#9255) -- Fix playing embed resetting if status is reloaded in web UI (#9270, #9275) -- Fix web UI crash when favouriting a deleted status (#9272) -- Fix intermediary arrays being created for hash maps (#9291) -- Fix filter ID not being a string in REST API (#9303) +- Fix web UI crash when conversation has no last status ([sammy8806](https://github.com/tootsuite/mastodon/pull/9207)) +- Fix follow limit validator reporting lower number past threshold ([Gargron](https://github.com/tootsuite/mastodon/pull/9230)) +- Fix form validation flash message color and input borders ([Gargron](https://github.com/tootsuite/mastodon/pull/9235)) +- Fix invalid twitter:player cards being displayed ([ThibG](https://github.com/tootsuite/mastodon/pull/9254)) +- Fix emoji update date being processed incorrectly ([ThibG](https://github.com/tootsuite/mastodon/pull/9255)) +- Fix playing embed resetting if status is reloaded in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/9270), [Gargron](https://github.com/tootsuite/mastodon/pull/9275)) +- Fix web UI crash when favouriting a deleted status ([ThibG](https://github.com/tootsuite/mastodon/pull/9272)) +- Fix intermediary arrays being created for hash maps ([Gargron](https://github.com/tootsuite/mastodon/pull/9291)) +- Fix filter ID not being a string in REST API ([Gargron](https://github.com/tootsuite/mastodon/pull/9303)) ### Security -- Fix multiple remote account deletions being able to deadlock the database (#9292) -- Fix HTTP connection timeout of 10s not being enforced (#9329) +- Fix multiple remote account deletions being able to deadlock the database ([Gargron](https://github.com/tootsuite/mastodon/pull/9292)) +- Fix HTTP connection timeout of 10s not being enforced ([Gargron](https://github.com/tootsuite/mastodon/pull/9329)) ## [2.6.1] - 2018-10-30 ### Fixed -- Fix resolving resources by URL not working due to a regression in #9132 (#9171) -- Fix reducer error in web UI when a conversation has no last status (#9173) +- Fix resolving resources by URL not working due to a regression in [valerauko](https://github.com/tootsuite/mastodon/pull/9132) ([Gargron](https://github.com/tootsuite/mastodon/pull/9171)) +- Fix reducer error in web UI when a conversation has no last status ([Gargron](https://github.com/tootsuite/mastodon/pull/9173)) ## [2.6.0] - 2018-10-30 ### Added -- Add link ownership verification (#8703) -- Add conversations API (#8832) -- Add limit for the number of people that can be followed from one account (#8807) -- Add admin setting to customize mascot (#8766) -- Add support for more granular ActivityPub audiences from other software, i.e. circles (#8950, #9093, #9150) -- Add option to block all reports from a domain (#8830) -- Add user preference to always expand toots marked with content warnings (#8762) -- Add user preference to always hide all media (#8569) -- Add `force_login` param to OAuth authorize page (#8655) -- Add `tootctl accounts backup` (#8642, #8811) -- Add `tootctl accounts create` (#8642, #8811) -- Add `tootctl accounts cull` (#8642, #8811) -- Add `tootctl accounts delete` (#8642, #8811) -- Add `tootctl accounts modify` (#8642, #8811) -- Add `tootctl accounts refresh` (#8642, #8811) -- Add `tootctl feeds build` (#8642, #8811) -- Add `tootctl feeds clear` (#8642, #8811) -- Add `tootctl settings registrations open` (#8642, #8811) -- Add `tootctl settings registrations close` (#8642, #8811) -- Add `min_id` param to REST API to support backwards pagination (#8736) -- Add a confirmation dialog when hitting reply and the compose box isn't empty (#8893) -- Add PostgreSQL disk space growth tracking in PGHero (#8906) -- Add button for disabling local account to report quick actions bar (#9024) -- Add Czech language (#8594) -- Add `same-site` (`lax`) attribute to cookies (#8626) -- Add support for styled scrollbars in Firefox Nightly (#8653) -- Add highlight to the active tab in web UI profiles (#8673) -- Add auto-focus for comment textarea in report modal (#8689) -- Add auto-focus for emoji picker's search field (#8688) -- Add nginx and systemd templates to `dist/` directory (#8770) -- Add support for `/.well-known/change-password` (#8828) -- Add option to override FFMPEG binary path (#8855) -- Add `dns-prefetch` tag when using different host for assets or uploads (#8942) -- Add `description` meta tag (#8941) -- Add `Content-Security-Policy` header (#8957) -- Add cache for the instance info API (#8765) -- Add suggested follows to search screen in mobile layout (#9010) -- Add CORS header to `/.well-known/*` routes (#9083) -- Add `card` attribute to statuses returned from REST API (#9120) -- Add in-stream link preview (#9120) -- Add support for ActivityPub `Page` objects (#9121) +- Add link ownership verification ([Gargron](https://github.com/tootsuite/mastodon/pull/8703)) +- Add conversations API ([Gargron](https://github.com/tootsuite/mastodon/pull/8832)) +- Add limit for the number of people that can be followed from one account ([Gargron](https://github.com/tootsuite/mastodon/pull/8807)) +- Add admin setting to customize mascot ([ashleyhull-versent](https://github.com/tootsuite/mastodon/pull/8766)) +- Add support for more granular ActivityPub audiences from other software, i.e. circles ([Gargron](https://github.com/tootsuite/mastodon/pull/8950), [Gargron](https://github.com/tootsuite/mastodon/pull/9093), [Gargron](https://github.com/tootsuite/mastodon/pull/9150)) +- Add option to block all reports from a domain ([Gargron](https://github.com/tootsuite/mastodon/pull/8830)) +- Add user preference to always expand toots marked with content warnings ([webroo](https://github.com/tootsuite/mastodon/pull/8762)) +- Add user preference to always hide all media ([fvh-P](https://github.com/tootsuite/mastodon/pull/8569)) +- Add `force_login` param to OAuth authorize page ([Gargron](https://github.com/tootsuite/mastodon/pull/8655)) +- Add `tootctl accounts backup` ([Gargron](https://github.com/tootsuite/mastodon/pull/8642), [Gargron](https://github.com/tootsuite/mastodon/pull/8811)) +- Add `tootctl accounts create` ([Gargron](https://github.com/tootsuite/mastodon/pull/8642), [Gargron](https://github.com/tootsuite/mastodon/pull/8811)) +- Add `tootctl accounts cull` ([Gargron](https://github.com/tootsuite/mastodon/pull/8642), [Gargron](https://github.com/tootsuite/mastodon/pull/8811)) +- Add `tootctl accounts delete` ([Gargron](https://github.com/tootsuite/mastodon/pull/8642), [Gargron](https://github.com/tootsuite/mastodon/pull/8811)) +- Add `tootctl accounts modify` ([Gargron](https://github.com/tootsuite/mastodon/pull/8642), [Gargron](https://github.com/tootsuite/mastodon/pull/8811)) +- Add `tootctl accounts refresh` ([Gargron](https://github.com/tootsuite/mastodon/pull/8642), [Gargron](https://github.com/tootsuite/mastodon/pull/8811)) +- Add `tootctl feeds build` ([Gargron](https://github.com/tootsuite/mastodon/pull/8642), [Gargron](https://github.com/tootsuite/mastodon/pull/8811)) +- Add `tootctl feeds clear` ([Gargron](https://github.com/tootsuite/mastodon/pull/8642), [Gargron](https://github.com/tootsuite/mastodon/pull/8811)) +- Add `tootctl settings registrations open` ([Gargron](https://github.com/tootsuite/mastodon/pull/8642), [Gargron](https://github.com/tootsuite/mastodon/pull/8811)) +- Add `tootctl settings registrations close` ([Gargron](https://github.com/tootsuite/mastodon/pull/8642), [Gargron](https://github.com/tootsuite/mastodon/pull/8811)) +- Add `min_id` param to REST API to support backwards pagination ([Gargron](https://github.com/tootsuite/mastodon/pull/8736)) +- Add a confirmation dialog when hitting reply and the compose box isn't empty ([ThibG](https://github.com/tootsuite/mastodon/pull/8893)) +- Add PostgreSQL disk space growth tracking in PGHero ([Gargron](https://github.com/tootsuite/mastodon/pull/8906)) +- Add button for disabling local account to report quick actions bar ([Gargron](https://github.com/tootsuite/mastodon/pull/9024)) +- Add Czech language ([Aditoo17](https://github.com/tootsuite/mastodon/pull/8594)) +- Add `same-site` (`lax`) attribute to cookies ([sorin-davidoi](https://github.com/tootsuite/mastodon/pull/8626)) +- Add support for styled scrollbars in Firefox Nightly ([sorin-davidoi](https://github.com/tootsuite/mastodon/pull/8653)) +- Add highlight to the active tab in web UI profiles ([rhoio](https://github.com/tootsuite/mastodon/pull/8673)) +- Add auto-focus for comment textarea in report modal ([ThibG](https://github.com/tootsuite/mastodon/pull/8689)) +- Add auto-focus for emoji picker's search field ([ThibG](https://github.com/tootsuite/mastodon/pull/8688)) +- Add nginx and systemd templates to `dist/` directory ([Gargron](https://github.com/tootsuite/mastodon/pull/8770)) +- Add support for `/.well-known/change-password` ([Gargron](https://github.com/tootsuite/mastodon/pull/8828)) +- Add option to override FFMPEG binary path ([sascha-sl](https://github.com/tootsuite/mastodon/pull/8855)) +- Add `dns-prefetch` tag when using different host for assets or uploads ([Gargron](https://github.com/tootsuite/mastodon/pull/8942)) +- Add `description` meta tag ([Gargron](https://github.com/tootsuite/mastodon/pull/8941)) +- Add `Content-Security-Policy` header ([ThibG](https://github.com/tootsuite/mastodon/pull/8957)) +- Add cache for the instance info API ([ykzts](https://github.com/tootsuite/mastodon/pull/8765)) +- Add suggested follows to search screen in mobile layout ([Gargron](https://github.com/tootsuite/mastodon/pull/9010)) +- Add CORS header to `/.well-known/*` routes ([BenLubar](https://github.com/tootsuite/mastodon/pull/9083)) +- Add `card` attribute to statuses returned from REST API ([Gargron](https://github.com/tootsuite/mastodon/pull/9120)) +- Add in-stream link preview ([Gargron](https://github.com/tootsuite/mastodon/pull/9120)) +- Add support for ActivityPub `Page` objects ([mbajur](https://github.com/tootsuite/mastodon/pull/9121)) ### Changed -- Change forms design (#8703) -- Change reports overview to group by target account (#8674) -- Change web UI to show "read more" link on overly long in-stream statuses (#8205) -- Change design of direct messages column (#8832, #9022) -- Change home timelines to exclude DMs (#8940) -- Change list timelines to exclude all replies (#8683) -- Change admin accounts UI default sort to most recent (#8813) -- Change documentation URL in the UI (#8898) -- Change style of success and failure messages (#8973) -- Change DM filtering to always allow DMs from staff (#8993) -- Change recommended Ruby version to 2.5.3 (#9003) -- Change docker-compose default to persist volumes in current directory (#9055) -- Change character counters on edit profile page to input length limit (#9100) -- Change notification filtering to always let through messages from staff (#9152) -- Change "hide boosts from user" function also hiding notifications about boosts (#9147) -- Change CSS `detailed-status__wrapper` class actually wrap the detailed status (#8547) +- Change forms design ([Gargron](https://github.com/tootsuite/mastodon/pull/8703)) +- Change reports overview to group by target account ([Gargron](https://github.com/tootsuite/mastodon/pull/8674)) +- Change web UI to show "read more" link on overly long in-stream statuses ([lanodan](https://github.com/tootsuite/mastodon/pull/8205)) +- Change design of direct messages column ([Gargron](https://github.com/tootsuite/mastodon/pull/8832), [Gargron](https://github.com/tootsuite/mastodon/pull/9022)) +- Change home timelines to exclude DMs ([Gargron](https://github.com/tootsuite/mastodon/pull/8940)) +- Change list timelines to exclude all replies ([cbayerlein](https://github.com/tootsuite/mastodon/pull/8683)) +- Change admin accounts UI default sort to most recent ([Gargron](https://github.com/tootsuite/mastodon/pull/8813)) +- Change documentation URL in the UI ([Gargron](https://github.com/tootsuite/mastodon/pull/8898)) +- Change style of success and failure messages ([Gargron](https://github.com/tootsuite/mastodon/pull/8973)) +- Change DM filtering to always allow DMs from staff ([qguv](https://github.com/tootsuite/mastodon/pull/8993)) +- Change recommended Ruby version to 2.5.3 ([zunda](https://github.com/tootsuite/mastodon/pull/9003)) +- Change docker-compose default to persist volumes in current directory ([Gargron](https://github.com/tootsuite/mastodon/pull/9055)) +- Change character counters on edit profile page to input length limit ([Gargron](https://github.com/tootsuite/mastodon/pull/9100)) +- Change notification filtering to always let through messages from staff ([Gargron](https://github.com/tootsuite/mastodon/pull/9152)) +- Change "hide boosts from user" function also hiding notifications about boosts ([ThibG](https://github.com/tootsuite/mastodon/pull/9147)) +- Change CSS `detailed-status__wrapper` class actually wrap the detailed status ([trwnh](https://github.com/tootsuite/mastodon/pull/8547)) ### Deprecated -- `GET /api/v1/timelines/direct` → `GET /api/v1/conversations` (#8832) -- `POST /api/v1/notifications/dismiss` → `POST /api/v1/notifications/:id/dismiss` (#8905) -- `GET /api/v1/statuses/:id/card` → `card` attributed included in status (#9120) +- `GET /api/v1/timelines/direct` → `GET /api/v1/conversations` ([Gargron](https://github.com/tootsuite/mastodon/pull/8832)) +- `POST /api/v1/notifications/dismiss` → `POST /api/v1/notifications/:id/dismiss` ([Gargron](https://github.com/tootsuite/mastodon/pull/8905)) +- `GET /api/v1/statuses/:id/card` → `card` attributed included in status ([Gargron](https://github.com/tootsuite/mastodon/pull/9120)) ### Removed -- Remove "on this device" label in column push settings (#8704) -- Remove rake tasks in favour of tootctl commands (#8675) +- Remove "on this device" label in column push settings ([rhoio](https://github.com/tootsuite/mastodon/pull/8704)) +- Remove rake tasks in favour of tootctl commands ([Gargron](https://github.com/tootsuite/mastodon/pull/8675)) ### Fixed -- Fix remote statuses using instance's default locale if no language given (#8861) -- Fix streaming API not exiting when port or socket is unavailable (#9023) -- Fix network calls being performed in database transaction in ActivityPub handler (#8951) -- Fix dropdown arrow position (#8637) -- Fix first element of dropdowns being focused even if not using keyboard (#8679) -- Fix tootctl requiring `bundle exec` invocation (#8619) -- Fix public pages not using animation preference for avatars (#8614) -- Fix OEmbed/OpenGraph cards not understanding relative URLs (#8669) -- Fix some dark emojis not having a white outline (#8597) -- Fix media description not being displayed in various media modals (#8678) -- Fix generated URLs of desktop notifications missing base URL (#8758) -- Fix RTL styles (#8764, #8767, #8823, #8897, #9005, #9007, #9018, #9021, #9145, #9146) -- Fix crash in streaming API when tag param missing (#8955) -- Fix hotkeys not working when no element is focused (#8998) -- Fix some hotkeys not working on detailed status view (#9006) -- Fix og:url on status pages (#9047) -- Fix upload option buttons only being visible on hover (#9074) -- Fix tootctl not returning exit code 1 on wrong arguments (#9094) -- Fix preview cards for appearing for profiles mentioned in toot (#6934, #9158) -- Fix local accounts sometimes being duplicated as faux-remote (#9109) -- Fix emoji search when the shortcode has multiple separators (#9124) -- Fix dropdowns sometimes being partially obscured by other elements (#9126) -- Fix cache not updating when reply/boost/favourite counters or media sensitivity update (#9119) -- Fix empty display name precedence over username in web UI (#9163) -- Fix td instead of th in sessions table header (#9162) -- Fix handling of content types with profile (#9132) +- Fix remote statuses using instance's default locale if no language given ([Kjwon15](https://github.com/tootsuite/mastodon/pull/8861)) +- Fix streaming API not exiting when port or socket is unavailable ([Gargron](https://github.com/tootsuite/mastodon/pull/9023)) +- Fix network calls being performed in database transaction in ActivityPub handler ([Gargron](https://github.com/tootsuite/mastodon/pull/8951)) +- Fix dropdown arrow position ([ThibG](https://github.com/tootsuite/mastodon/pull/8637)) +- Fix first element of dropdowns being focused even if not using keyboard ([ThibG](https://github.com/tootsuite/mastodon/pull/8679)) +- Fix tootctl requiring `bundle exec` invocation ([abcang](https://github.com/tootsuite/mastodon/pull/8619)) +- Fix public pages not using animation preference for avatars ([renatolond](https://github.com/tootsuite/mastodon/pull/8614)) +- Fix OEmbed/OpenGraph cards not understanding relative URLs ([ThibG](https://github.com/tootsuite/mastodon/pull/8669)) +- Fix some dark emojis not having a white outline ([ThibG](https://github.com/tootsuite/mastodon/pull/8597)) +- Fix media description not being displayed in various media modals ([ThibG](https://github.com/tootsuite/mastodon/pull/8678)) +- Fix generated URLs of desktop notifications missing base URL ([GenbuHase](https://github.com/tootsuite/mastodon/pull/8758)) +- Fix RTL styles ([mabkenar](https://github.com/tootsuite/mastodon/pull/8764), [mabkenar](https://github.com/tootsuite/mastodon/pull/8767), [mabkenar](https://github.com/tootsuite/mastodon/pull/8823), [mabkenar](https://github.com/tootsuite/mastodon/pull/8897), [mabkenar](https://github.com/tootsuite/mastodon/pull/9005), [mabkenar](https://github.com/tootsuite/mastodon/pull/9007), [mabkenar](https://github.com/tootsuite/mastodon/pull/9018), [mabkenar](https://github.com/tootsuite/mastodon/pull/9021), [mabkenar](https://github.com/tootsuite/mastodon/pull/9145), [mabkenar](https://github.com/tootsuite/mastodon/pull/9146)) +- Fix crash in streaming API when tag param missing ([Gargron](https://github.com/tootsuite/mastodon/pull/8955)) +- Fix hotkeys not working when no element is focused ([ThibG](https://github.com/tootsuite/mastodon/pull/8998)) +- Fix some hotkeys not working on detailed status view ([ThibG](https://github.com/tootsuite/mastodon/pull/9006)) +- Fix og:url on status pages ([ThibG](https://github.com/tootsuite/mastodon/pull/9047)) +- Fix upload option buttons only being visible on hover ([Gargron](https://github.com/tootsuite/mastodon/pull/9074)) +- Fix tootctl not returning exit code 1 on wrong arguments ([sascha-sl](https://github.com/tootsuite/mastodon/pull/9094)) +- Fix preview cards for appearing for profiles mentioned in toot ([ThibG](https://github.com/tootsuite/mastodon/pull/6934), [ThibG](https://github.com/tootsuite/mastodon/pull/9158)) +- Fix local accounts sometimes being duplicated as faux-remote ([Gargron](https://github.com/tootsuite/mastodon/pull/9109)) +- Fix emoji search when the shortcode has multiple separators ([ThibG](https://github.com/tootsuite/mastodon/pull/9124)) +- Fix dropdowns sometimes being partially obscured by other elements ([kedamaDQ](https://github.com/tootsuite/mastodon/pull/9126)) +- Fix cache not updating when reply/boost/favourite counters or media sensitivity update ([Gargron](https://github.com/tootsuite/mastodon/pull/9119)) +- Fix empty display name precedence over username in web UI ([Gargron](https://github.com/tootsuite/mastodon/pull/9163)) +- Fix td instead of th in sessions table header ([Gargron](https://github.com/tootsuite/mastodon/pull/9162)) +- Fix handling of content types with profile ([valerauko](https://github.com/tootsuite/mastodon/pull/9132)) ## [2.5.2] - 2018-10-12 ### Security -- Fix XSS vulnerability (#8959) +- Fix XSS vulnerability ([Gargron](https://github.com/tootsuite/mastodon/pull/8959)) ## [2.5.1] - 2018-10-07 ### Fixed -- Fix database migrations for PostgreSQL below 9.5 (#8903) -- Fix class autoloading issue in ActivityPub Create handler (#8820) -- Fix cache statistics not being sent via statsd when statsd enabled (#8831) -- Bump puma from 3.11.4 to 3.12.0 (#8883) +- Fix database migrations for PostgreSQL below 9.5 ([Gargron](https://github.com/tootsuite/mastodon/pull/8903)) +- Fix class autoloading issue in ActivityPub Create handler ([Gargron](https://github.com/tootsuite/mastodon/pull/8820)) +- Fix cache statistics not being sent via statsd when statsd enabled ([ykzts](https://github.com/tootsuite/mastodon/pull/8831)) +- Bump puma from 3.11.4 to 3.12.0 ([dependabot[bot]](https://github.com/tootsuite/mastodon/pull/8883)) ### Security -- Fix some local images not having their EXIF metadata stripped on upload (#8714) -- Fix being able to enable a disabled relay via ActivityPub Accept handler (#8864) -- Bump nokogiri from 1.8.4 to 1.8.5 (#8881) -- Fix being able to report statuses not belonging to the reported account (#8916) +- Fix some local images not having their EXIF metadata stripped on upload ([ThibG](https://github.com/tootsuite/mastodon/pull/8714)) +- Fix being able to enable a disabled relay via ActivityPub Accept handler ([ThibG](https://github.com/tootsuite/mastodon/pull/8864)) +- Bump nokogiri from 1.8.4 to 1.8.5 ([dependabot[bot]](https://github.com/tootsuite/mastodon/pull/8881)) +- Fix being able to report statuses not belonging to the reported account ([ThibG](https://github.com/tootsuite/mastodon/pull/8916)) diff --git a/Dockerfile b/Dockerfile index 6ced07455..190905337 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,5 +1,5 @@ -FROM node:8.14.0-alpine as node -FROM ruby:2.4.5-alpine3.8 +FROM node:8.15-alpine as node +FROM ruby:2.6-alpine3.8 LABEL maintainer="https://github.com/tootsuite/mastodon" \ description="Your self-hosted, globally interconnected microblogging community" diff --git a/Gemfile b/Gemfile index ec51950ca..d17ff1a51 100644 --- a/Gemfile +++ b/Gemfile @@ -13,7 +13,7 @@ gem 'hamlit-rails', '~> 0.2' gem 'pg', '~> 1.1' gem 'makara', '~> 0.4' gem 'pghero', '~> 2.2' -gem 'dotenv-rails', '~> 2.5' +gem 'dotenv-rails', '~> 2.6' gem 'aws-sdk-s3', '~> 1.30', require: false gem 'fog-core', '<= 2.1.0' @@ -75,7 +75,7 @@ gem 'rqrcode', '~> 0.10' gem 'sanitize', '~> 5.0' gem 'sidekiq', '~> 5.2' gem 'sidekiq-scheduler', '~> 3.0' -gem 'sidekiq-unique-jobs', '~> 5.0' +gem 'sidekiq-unique-jobs', '~> 6.0' gem 'sidekiq-bulk', '~>0.2.0' gem 'simple-navigation', '~> 4.0' gem 'simple_form', '~> 4.1' @@ -89,7 +89,7 @@ gem 'tzinfo-data', '~> 1.2018' gem 'webpacker', '~> 3.5' gem 'webpush' -gem 'json-ld', '~> 2.2' +gem 'json-ld', '~> 3.0' gem 'json-ld-preloaded', '~> 3.0' gem 'rdf-normalize', '~> 0.3' @@ -127,8 +127,8 @@ group :development do gem 'letter_opener', '~> 1.7' gem 'letter_opener_web', '~> 1.3' gem 'memory_profiler' - gem 'rubocop', '~> 0.62', require: false - gem 'brakeman', '~> 4.3', require: false + gem 'rubocop', '~> 0.63', require: false + gem 'brakeman', '~> 4.4', require: false gem 'bundler-audit', '~> 0.6', require: false gem 'scss_lint', '~> 0.57', require: false @@ -145,3 +145,5 @@ group :production do gem 'lograge', '~> 0.10' gem 'redis-rails', '~> 5.0' end + +gem 'concurrent-ruby', require: false diff --git a/Gemfile.lock b/Gemfile.lock index 8718bc89b..acb4b8dda 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -76,8 +76,8 @@ GEM av (0.9.0) cocaine (~> 0.5.3) aws-eventstream (1.0.1) - aws-partitions (1.122.0) - aws-sdk-core (3.43.0) + aws-partitions (1.131.0) + aws-sdk-core (3.45.0) aws-eventstream (~> 1.0) aws-partitions (~> 1.0) aws-sigv4 (~> 1.0) @@ -85,7 +85,7 @@ GEM aws-sdk-kms (1.13.0) aws-sdk-core (~> 3, >= 3.39.0) aws-sigv4 (~> 1.0) - aws-sdk-s3 (1.30.0) + aws-sdk-s3 (1.30.1) aws-sdk-core (~> 3, >= 3.39.0) aws-sdk-kms (~> 1) aws-sigv4 (~> 1.0) @@ -100,14 +100,14 @@ GEM debug_inspector (>= 0.0.1) bootsnap (1.3.2) msgpack (~> 1.0) - brakeman (4.3.1) + brakeman (4.4.0) browser (2.5.3) builder (3.2.3) bullet (5.9.0) activesupport (>= 3.0.0) uniform_notifier (~> 1.11) - bundler-audit (0.6.0) - bundler (~> 1.2) + bundler-audit (0.6.1) + bundler (>= 1.2.0, < 3) thor (~> 0.18) byebug (10.0.2) capistrano (3.11.0) @@ -148,7 +148,7 @@ GEM cocaine (0.5.8) climate_control (>= 0.0.3, < 1.0) coderay (1.1.2) - concurrent-ruby (1.0.5) + concurrent-ruby (1.1.4) connection_pool (2.2.2) crack (0.4.3) safe_yaml (~> 1.0.0) @@ -185,9 +185,9 @@ GEM unf (>= 0.0.5, < 1.0.0) doorkeeper (5.0.2) railties (>= 4.2) - dotenv (2.5.0) - dotenv-rails (2.5.0) - dotenv (= 2.5.0) + dotenv (2.6.0) + dotenv-rails (2.6.0) + dotenv (= 2.6.0) railties (>= 3.2, < 6.0) elasticsearch (6.0.2) elasticsearch-api (= 6.0.2) @@ -200,7 +200,7 @@ GEM multi_json encryptor (3.0.0) equatable (0.5.0) - erubi (1.7.1) + erubi (1.8.0) et-orbi (1.1.6) tzinfo excon (0.62.0) @@ -231,7 +231,7 @@ GEM fuubar (2.3.2) rspec-core (~> 3.0) ruby-progressbar (~> 1.4) - get_process_mem (0.2.2) + get_process_mem (0.2.3) globalid (0.4.1) activesupport (>= 4.2.0) goldfinger (2.1.0) @@ -269,7 +269,7 @@ GEM httplog (1.2.0) rack (>= 1.0) rainbow (>= 2.0.0) - i18n (1.1.1) + i18n (1.5.2) concurrent-ruby (~> 1.0) i18n-tasks (0.9.28) activesupport (>= 4.0.2) @@ -284,10 +284,10 @@ GEM idn-ruby (0.1.0) ipaddress (0.8.3) iso-639 (0.2.8) - jaro_winkler (1.5.1) + jaro_winkler (1.5.2) jmespath (1.4.0) json (2.1.0) - json-ld (2.2.1) + json-ld (3.0.2) multi_json (~> 1.12) rdf (>= 2.2.8, < 4.0) json-ld-preloaded (3.0.0) @@ -354,16 +354,16 @@ GEM net-ssh (>= 2.6.5) net-ssh (5.0.2) nio4r (2.3.1) - nokogiri (1.10.0) + nokogiri (1.10.1) mini_portile2 (~> 2.4.0) nokogumbo (2.0.0) nokogiri (~> 1.8, >= 1.8.4) - nsa (0.2.4) + nsa (0.2.7) activesupport (>= 4.2, < 6) - concurrent-ruby (~> 1.0.0) - sidekiq (>= 3.5.0) - statsd-ruby (~> 1.2.0) - oj (3.7.6) + concurrent-ruby (~> 1.0, >= 1.0.2) + sidekiq (>= 3.5) + statsd-ruby (~> 1.4, >= 1.4.0) + oj (3.7.7) omniauth (1.9.0) hashie (>= 3.4.6, < 3.7.0) rack (>= 1.6.2, < 3) @@ -392,12 +392,12 @@ GEM parallel (1.12.1) parallel_tests (2.27.1) parallel - parser (2.5.3.0) + parser (2.6.0.0) ast (~> 2.4.0) pastel (0.7.2) equatable (~> 0.5.0) tty-color (~> 0.4.0) - pg (1.1.3) + pg (1.1.4) pghero (2.2.0) activerecord pkg-config (1.3.2) @@ -427,7 +427,7 @@ GEM rack-attack (5.4.2) rack (>= 1.0, < 3) rack-cors (1.0.2) - rack-protection (2.0.4) + rack-protection (2.0.5) rack rack-proxy (0.6.4) rack @@ -467,11 +467,11 @@ GEM rake (>= 0.8.7) thor (>= 0.19.0, < 2.0) rainbow (3.0.0) - rake (12.3.1) + rake (12.3.2) rb-fsevent (0.10.3) rb-inotify (0.9.10) ffi (>= 0.5.0, < 2) - rdf (3.0.7) + rdf (3.0.9) hamster (~> 3.0) link_header (~> 0.0, >= 0.0.8) rdf-normalize (0.3.3) @@ -525,7 +525,7 @@ GEM rspec-core (~> 3.0, >= 3.0.0) sidekiq (>= 2.4.0) rspec-support (3.8.0) - rubocop (0.62.0) + rubocop (0.63.0) jaro_winkler (~> 1.5.1) parallel (~> 1.10) parser (>= 2.5, != 2.5.1.1) @@ -551,8 +551,9 @@ GEM scss_lint (0.57.1) rake (>= 0.9, < 13) sass (~> 3.5, >= 3.5.5) - sidekiq (5.2.3) + sidekiq (5.2.5) connection_pool (~> 2.2, >= 2.2.2) + rack (>= 1.5.0) rack-protection (>= 1.5.0) redis (>= 3.3.5, < 5) sidekiq-bulk (0.2.0) @@ -562,8 +563,9 @@ GEM rufus-scheduler (~> 3.2) sidekiq (>= 3) tilt (>= 1.4.0) - sidekiq-unique-jobs (5.0.10) - sidekiq (>= 4.0, <= 6.0) + sidekiq-unique-jobs (6.0.8) + concurrent-ruby (~> 1.0, >= 1.0.5) + sidekiq (>= 4.0, < 6.0) thor (~> 0) simple-navigation (4.0.5) activesupport (>= 2.3.2) @@ -586,7 +588,7 @@ GEM net-scp (>= 1.1.2) net-ssh (>= 2.8.0) stackprof (0.2.12) - statsd-ruby (1.2.1) + statsd-ruby (1.4.0) stoplight (2.1.3) streamio-ffmpeg (3.0.2) multi_json (~> 1.8) @@ -637,7 +639,7 @@ GEM activesupport (>= 4.2) rack-proxy (>= 0.6.1) railties (>= 4.2) - webpush (0.3.5) + webpush (0.3.6) hkdf (~> 0.2) jwt (~> 2.0) websocket-driver (0.7.0) @@ -659,7 +661,7 @@ DEPENDENCIES better_errors (~> 2.5) binding_of_caller (~> 0.7) bootsnap (~> 1.3) - brakeman (~> 4.3) + brakeman (~> 4.4) browser bullet (~> 5.9) bundler-audit (~> 0.6) @@ -672,12 +674,13 @@ DEPENDENCIES chewy (~> 5.0) cld3 (~> 3.2.3) climate_control (~> 0.2) + concurrent-ruby derailed_benchmarks devise (~> 4.5) devise-two-factor (~> 3.0) devise_pam_authenticatable2 (~> 9.2) doorkeeper (~> 5.0) - dotenv-rails (~> 2.5) + dotenv-rails (~> 2.6) fabrication (~> 2.20) faker (~> 1.9) fast_blank (~> 1.0) @@ -696,7 +699,7 @@ DEPENDENCIES i18n-tasks (~> 0.9) idn-ruby iso-639 - json-ld (~> 2.2) + json-ld (~> 3.0) json-ld-preloaded (~> 3.0) kaminari (~> 1.1) letter_opener (~> 1.7) @@ -743,13 +746,13 @@ DEPENDENCIES rqrcode (~> 0.10) rspec-rails (~> 3.8) rspec-sidekiq (~> 3.0) - rubocop (~> 0.62) + rubocop (~> 0.63) sanitize (~> 5.0) scss_lint (~> 0.57) sidekiq (~> 5.2) sidekiq-bulk (~> 0.2.0) sidekiq-scheduler (~> 3.0) - sidekiq-unique-jobs (~> 5.0) + sidekiq-unique-jobs (~> 6.0) simple-navigation (~> 4.0) simple_form (~> 4.1) simplecov (~> 0.16) @@ -768,7 +771,7 @@ DEPENDENCIES webpush RUBY VERSION - ruby 2.5.3p105 + ruby 2.6.0p0 BUNDLED WITH - 1.16.6 + 1.17.3 diff --git a/app/controllers/api/v1/statuses/reblogged_by_accounts_controller.rb b/app/controllers/api/v1/statuses/reblogged_by_accounts_controller.rb index 4315b0283..6851099f6 100644 --- a/app/controllers/api/v1/statuses/reblogged_by_accounts_controller.rb +++ b/app/controllers/api/v1/statuses/reblogged_by_accounts_controller.rb @@ -25,7 +25,7 @@ class Api::V1::Statuses::RebloggedByAccountsController < Api::BaseController end def paginated_statuses - Status.where(reblog_of_id: @status.id).paginate_by_max_id( + Status.where(reblog_of_id: @status.id).where(visibility: [:public, :unlisted]).paginate_by_max_id( limit_param(DEFAULT_ACCOUNTS_LIMIT), params[:max_id], params[:since_id] diff --git a/app/controllers/directories_controller.rb b/app/controllers/directories_controller.rb index 96fe4c1c6..ff7ff4a42 100644 --- a/app/controllers/directories_controller.rb +++ b/app/controllers/directories_controller.rb @@ -28,7 +28,7 @@ class DirectoriesController < ApplicationController end def set_tags - @tags = Tag.discoverable.limit(30) + @tags = Tag.discoverable.limit(30).reject { |tag| tag.cached_sample_accounts.empty? } end def set_accounts diff --git a/app/controllers/tags_controller.rb b/app/controllers/tags_controller.rb index 8e4051834..4694c823a 100644 --- a/app/controllers/tags_controller.rb +++ b/app/controllers/tags_controller.rb @@ -3,6 +3,8 @@ class TagsController < ApplicationController PAGE_SIZE = 20 + layout 'public' + before_action :set_body_classes before_action :set_instance_presenter diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index c33975cac..5097a0953 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -69,8 +69,12 @@ module ApplicationHelper tag(:meta, content: content, property: property) end - def react_component(name, props = {}) - content_tag(:div, nil, data: { component: name.to_s.camelcase, props: Oj.dump(props) }) + def react_component(name, props = {}, &block) + if block.nil? + content_tag(:div, nil, data: { component: name.to_s.camelcase, props: Oj.dump(props) }) + else + content_tag(:div, data: { component: name.to_s.camelcase, props: Oj.dump(props) }, &block) + end end def body_classes diff --git a/app/javascript/mastodon/common.js b/app/javascript/mastodon/common.js index 2b10b8c30..fba21316a 100644 --- a/app/javascript/mastodon/common.js +++ b/app/javascript/mastodon/common.js @@ -4,5 +4,9 @@ export function start() { require('font-awesome/css/font-awesome.css'); require.context('../images/', true); - Rails.start(); + try { + Rails.start(); + } catch (e) { + // If called twice + } }; diff --git a/app/javascript/mastodon/components/display_name.js b/app/javascript/mastodon/components/display_name.js index c2c40cb3f..acddf77c5 100644 --- a/app/javascript/mastodon/components/display_name.js +++ b/app/javascript/mastodon/components/display_name.js @@ -1,15 +1,17 @@ import React from 'react'; import ImmutablePropTypes from 'react-immutable-proptypes'; +import PropTypes from 'prop-types'; export default class DisplayName extends React.PureComponent { static propTypes = { account: ImmutablePropTypes.map.isRequired, others: ImmutablePropTypes.list, + localDomain: PropTypes.string, }; render () { - const { account, others } = this.props; + const { account, others, localDomain } = this.props; const displayNameHtml = { __html: account.get('display_name_html') }; let suffix; @@ -17,7 +19,13 @@ export default class DisplayName extends React.PureComponent { if (others && others.size > 1) { suffix = `+${others.size}`; } else { - suffix = @{account.get('acct')}; + let acct = account.get('acct'); + + if (acct.indexOf('@') === -1 && localDomain) { + acct = `${acct}@${localDomain}`; + } + + suffix = @{acct}; } return ( diff --git a/app/javascript/mastodon/components/hashtag.js b/app/javascript/mastodon/components/hashtag.js index a407df31e..f091d7893 100644 --- a/app/javascript/mastodon/components/hashtag.js +++ b/app/javascript/mastodon/components/hashtag.js @@ -1,16 +1,16 @@ import React from 'react'; import { Sparklines, SparklinesCurve } from 'react-sparklines'; -import { Link } from 'react-router-dom'; import { FormattedMessage } from 'react-intl'; import ImmutablePropTypes from 'react-immutable-proptypes'; +import Permalink from './permalink'; import { shortNumberFormat } from '../utils/numbers'; const Hashtag = ({ hashtag }) => (
- + #{hashtag.get('name')} - + {shortNumberFormat(hashtag.getIn(['history', 0, 'accounts']))} }} />
diff --git a/app/javascript/mastodon/components/status.js b/app/javascript/mastodon/components/status.js index fd0780025..20d838500 100644 --- a/app/javascript/mastodon/components/status.js +++ b/app/javascript/mastodon/components/status.js @@ -77,7 +77,7 @@ class Status extends ImmutablePureComponent { 'account', 'muted', 'hidden', - ] + ]; handleClick = () => { if (this.props.onClick) { diff --git a/app/javascript/mastodon/features/standalone/hashtag_timeline/index.js b/app/javascript/mastodon/features/standalone/hashtag_timeline/index.js index 759922638..333726f94 100644 --- a/app/javascript/mastodon/features/standalone/hashtag_timeline/index.js +++ b/app/javascript/mastodon/features/standalone/hashtag_timeline/index.js @@ -1,28 +1,32 @@ import React from 'react'; import { connect } from 'react-redux'; import PropTypes from 'prop-types'; -import StatusListContainer from '../../ui/containers/status_list_container'; +import ImmutablePropTypes from 'react-immutable-proptypes'; import { expandHashtagTimeline } from '../../../actions/timelines'; -import Column from '../../../components/column'; -import ColumnHeader from '../../../components/column_header'; import { connectHashtagStream } from '../../../actions/streaming'; +import Masonry from 'react-masonry-infinite'; +import { List as ImmutableList } from 'immutable'; +import DetailedStatusContainer from '../../status/containers/detailed_status_container'; +import { debounce } from 'lodash'; +import LoadingIndicator from '../../../components/loading_indicator'; -export default @connect() +const mapStateToProps = (state, { hashtag }) => ({ + statusIds: state.getIn(['timelines', `hashtag:${hashtag}`, 'items'], ImmutableList()), + isLoading: state.getIn(['timelines', `hashtag:${hashtag}`, 'isLoading'], false), + hasMore: state.getIn(['timelines', `hashtag:${hashtag}`, 'hasMore'], false), +}); + +export default @connect(mapStateToProps) class HashtagTimeline extends React.PureComponent { static propTypes = { dispatch: PropTypes.func.isRequired, + statusIds: ImmutablePropTypes.list.isRequired, + isLoading: PropTypes.bool.isRequired, + hasMore: PropTypes.bool.isRequired, hashtag: PropTypes.string.isRequired, }; - handleHeaderClick = () => { - this.column.scrollTop(); - } - - setRef = c => { - this.column = c; - } - componentDidMount () { const { dispatch, hashtag } = this.props; @@ -37,28 +41,52 @@ class HashtagTimeline extends React.PureComponent { } } - handleLoadMore = maxId => { - this.props.dispatch(expandHashtagTimeline(this.props.hashtag, { maxId })); + handleLoadMore = () => { + const maxId = this.props.statusIds.last(); + + if (maxId) { + this.props.dispatch(expandHashtagTimeline(this.props.hashtag, { maxId })); + } } + setRef = c => { + this.masonry = c; + } + + handleHeightChange = debounce(() => { + if (!this.masonry) { + return; + } + + this.masonry.forcePack(); + }, 50) + render () { - const { hashtag } = this.props; + const { statusIds, hasMore, isLoading } = this.props; + + const sizes = [ + { columns: 1, gutter: 0 }, + { mq: '415px', columns: 1, gutter: 10 }, + { mq: '640px', columns: 2, gutter: 10 }, + { mq: '960px', columns: 3, gutter: 10 }, + { mq: '1255px', columns: 3, gutter: 10 }, + ]; + + const loader = (isLoading && statusIds.isEmpty()) ? : undefined; return ( - - - - - + + {statusIds.map(statusId => ( +
+ +
+ )).toArray()} +
); } diff --git a/app/javascript/mastodon/features/status/components/detailed_status.js b/app/javascript/mastodon/features/status/components/detailed_status.js index 9f0b9c51e..df33c7e07 100644 --- a/app/javascript/mastodon/features/status/components/detailed_status.js +++ b/app/javascript/mastodon/features/status/components/detailed_status.js @@ -11,6 +11,8 @@ import { defineMessages, injectIntl, FormattedDate, FormattedNumber } from 'reac import Card from './card'; import ImmutablePureComponent from 'react-immutable-pure-component'; import Video from '../../video'; +import scheduleIdleTask from '../../ui/util/schedule_idle_task'; +import classNames from 'classnames'; const messages = defineMessages({ local_only: { id: 'status.local_only', defaultMessage: 'This post is only visible by other users of your instance' }, @@ -28,10 +30,18 @@ export default class DetailedStatus extends ImmutablePureComponent { onOpenMedia: PropTypes.func.isRequired, onOpenVideo: PropTypes.func.isRequired, onToggleHidden: PropTypes.func.isRequired, + measureHeight: PropTypes.bool, + onHeightChange: PropTypes.func, + domain: PropTypes.string.isRequired, + compact: PropTypes.bool, + }; + + state = { + height: null, }; handleAccountClick = (e) => { - if (e.button === 0 && !(e.ctrlKey || e.metaKey)) { + if (e.button === 0 && !(e.ctrlKey || e.metaKey) && this.context.router) { e.preventDefault(); this.context.router.history.push(`/accounts/${this.props.status.getIn(['account', 'id'])}`); } @@ -47,15 +57,59 @@ export default class DetailedStatus extends ImmutablePureComponent { this.props.onToggleHidden(this.props.status); } + _measureHeight (heightJustChanged) { + if (this.props.measureHeight && this.node) { + scheduleIdleTask(() => this.node && this.setState({ height: Math.ceil(this.node.scrollHeight) + 1 })); + + if (this.props.onHeightChange && heightJustChanged) { + this.props.onHeightChange(); + } + } + } + + setRef = c => { + this.node = c; + this._measureHeight(); + } + + componentDidUpdate (prevProps, prevState) { + this._measureHeight(prevState.height !== this.state.height); + } + + handleModalLink = e => { + e.preventDefault(); + + let href; + + if (e.target.nodeName !== 'A') { + href = e.target.parentNode.href; + } else { + href = e.target.href; + } + + window.open(href, 'mastodon-intent', 'width=445,height=600,resizable=no,menubar=no,status=no,scrollbars=yes'); + } + render () { const status = this.props.status.get('reblog') ? this.props.status.get('reblog') : this.props.status; const intl = this.props.intl; + const outerStyle = { boxSizing: 'border-box' }; + const { compact } = this.props; + + if (!status) { + return null; + } let media = ''; let applicationLink = ''; let reblogLink = ''; let localOnly = ''; let reblogIcon = 'retweet'; + let favouriteLink = ''; + + if (this.props.measureHeight) { + outerStyle.height = `${this.state.height}px`; + } if (status.get('media_attachments').size > 0) { if (status.get('media_attachments').some(item => item.get('type') === 'unknown')) { @@ -102,39 +156,67 @@ export default class DetailedStatus extends ImmutablePureComponent { if (status.get('visibility') === 'private') { reblogLink = ; + } else if (this.context.router) { + reblogLink = ( + + + + + + + ); } else { - reblogLink = ( - - - - - ); + reblogLink = ( + + + + + + + ); } if(status.get('local_only')) { localOnly = · ; } - return ( -
- -
- + if (this.context.router) { + favouriteLink = ( + + + + + + + ); + } else { + favouriteLink = ( +
+ + + + + ); + } - + return ( +
+
+ +
+ +
- {media} + -
- - - {applicationLink} · {reblogLink} · - - - - - {localOnly} + {media} + +
+ + + {applicationLink} · {reblogLink} · {favouriteLink}{localOnly} +
); diff --git a/app/javascript/mastodon/features/status/containers/detailed_status_container.js b/app/javascript/mastodon/features/status/containers/detailed_status_container.js new file mode 100644 index 000000000..2c0db0a6b --- /dev/null +++ b/app/javascript/mastodon/features/status/containers/detailed_status_container.js @@ -0,0 +1,172 @@ +import React from 'react'; +import { connect } from 'react-redux'; +import DetailedStatus from '../components/detailed_status'; +import { makeGetStatus } from '../../../selectors'; +import { + replyCompose, + mentionCompose, + directCompose, +} from '../../../actions/compose'; +import { + reblog, + favourite, + unreblog, + unfavourite, + pin, + unpin, +} from '../../../actions/interactions'; +import { blockAccount } from '../../../actions/accounts'; +import { + muteStatus, + unmuteStatus, + deleteStatus, + hideStatus, + revealStatus, +} from '../../../actions/statuses'; +import { initMuteModal } from '../../../actions/mutes'; +import { initReport } from '../../../actions/reports'; +import { openModal } from '../../../actions/modal'; +import { defineMessages, injectIntl, FormattedMessage } from 'react-intl'; +import { boostModal, deleteModal } from '../../../initial_state'; +import { showAlertForError } from '../../../actions/alerts'; + +const messages = defineMessages({ + deleteConfirm: { id: 'confirmations.delete.confirm', defaultMessage: 'Delete' }, + deleteMessage: { id: 'confirmations.delete.message', defaultMessage: 'Are you sure you want to delete this status?' }, + redraftConfirm: { id: 'confirmations.redraft.confirm', defaultMessage: 'Delete & redraft' }, + redraftMessage: { id: 'confirmations.redraft.message', defaultMessage: 'Are you sure you want to delete this status and re-draft it? Favourites and boosts will be lost, and replies to the original post will be orphaned.' }, + blockConfirm: { id: 'confirmations.block.confirm', defaultMessage: 'Block' }, + replyConfirm: { id: 'confirmations.reply.confirm', defaultMessage: 'Reply' }, + replyMessage: { id: 'confirmations.reply.message', defaultMessage: 'Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?' }, +}); + +const makeMapStateToProps = () => { + const getStatus = makeGetStatus(); + + const mapStateToProps = (state, props) => ({ + status: getStatus(state, props), + domain: state.getIn(['meta', 'domain']), + }); + + return mapStateToProps; +}; + +const mapDispatchToProps = (dispatch, { intl }) => ({ + + onReply (status, router) { + dispatch((_, getState) => { + let state = getState(); + if (state.getIn(['compose', 'text']).trim().length !== 0) { + dispatch(openModal('CONFIRM', { + message: intl.formatMessage(messages.replyMessage), + confirm: intl.formatMessage(messages.replyConfirm), + onConfirm: () => dispatch(replyCompose(status, router)), + })); + } else { + dispatch(replyCompose(status, router)); + } + }); + }, + + onModalReblog (status) { + dispatch(reblog(status)); + }, + + onReblog (status, e) { + if (status.get('reblogged')) { + dispatch(unreblog(status)); + } else { + if (e.shiftKey || !boostModal) { + this.onModalReblog(status); + } else { + dispatch(openModal('BOOST', { status, onReblog: this.onModalReblog })); + } + } + }, + + onFavourite (status) { + if (status.get('favourited')) { + dispatch(unfavourite(status)); + } else { + dispatch(favourite(status)); + } + }, + + onPin (status) { + if (status.get('pinned')) { + dispatch(unpin(status)); + } else { + dispatch(pin(status)); + } + }, + + onEmbed (status) { + dispatch(openModal('EMBED', { + url: status.get('url'), + onError: error => dispatch(showAlertForError(error)), + })); + }, + + onDelete (status, history, withRedraft = false) { + if (!deleteModal) { + dispatch(deleteStatus(status.get('id'), history, withRedraft)); + } else { + dispatch(openModal('CONFIRM', { + message: intl.formatMessage(withRedraft ? messages.redraftMessage : messages.deleteMessage), + confirm: intl.formatMessage(withRedraft ? messages.redraftConfirm : messages.deleteConfirm), + onConfirm: () => dispatch(deleteStatus(status.get('id'), history, withRedraft)), + })); + } + }, + + onDirect (account, router) { + dispatch(directCompose(account, router)); + }, + + onMention (account, router) { + dispatch(mentionCompose(account, router)); + }, + + onOpenMedia (media, index) { + dispatch(openModal('MEDIA', { media, index })); + }, + + onOpenVideo (media, time) { + dispatch(openModal('VIDEO', { media, time })); + }, + + onBlock (account) { + dispatch(openModal('CONFIRM', { + message: @{account.get('acct')} }} />, + confirm: intl.formatMessage(messages.blockConfirm), + onConfirm: () => dispatch(blockAccount(account.get('id'))), + })); + }, + + onReport (status) { + dispatch(initReport(status.get('account'), status)); + }, + + onMute (account) { + dispatch(initMuteModal(account)); + }, + + onMuteConversation (status) { + if (status.get('muted')) { + dispatch(unmuteStatus(status.get('id'))); + } else { + dispatch(muteStatus(status.get('id'))); + } + }, + + onToggleHidden (status) { + if (status.get('hidden')) { + dispatch(revealStatus(status.get('id'))); + } else { + dispatch(hideStatus(status.get('id'))); + } + }, + +}); + +export default injectIntl(connect(makeMapStateToProps, mapDispatchToProps)(DetailedStatus)); diff --git a/app/javascript/mastodon/features/status/index.js b/app/javascript/mastodon/features/status/index.js index a092f7bb1..d48b682eb 100644 --- a/app/javascript/mastodon/features/status/index.js +++ b/app/javascript/mastodon/features/status/index.js @@ -101,6 +101,7 @@ const makeMapStateToProps = () => { ancestorsIds, descendantsIds, askReplyConfirmation: state.getIn(['compose', 'text']).trim().length !== 0, + domain: state.getIn(['meta', 'domain']), }; }; @@ -123,6 +124,7 @@ class Status extends ImmutablePureComponent { descendantsIds: ImmutablePropTypes.list, intl: PropTypes.object.isRequired, askReplyConfirmation: PropTypes.bool, + domain: PropTypes.string.isRequired, }; state = { @@ -387,7 +389,7 @@ class Status extends ImmutablePureComponent { render () { let ancestors, descendants; - const { shouldUpdateScroll, status, ancestorsIds, descendantsIds, intl } = this.props; + const { shouldUpdateScroll, status, ancestorsIds, descendantsIds, intl, domain } = this.props; const { fullscreen } = this.state; if (status === null) { @@ -438,6 +440,7 @@ class Status extends ImmutablePureComponent { onOpenVideo={this.handleOpenVideo} onOpenMedia={this.handleOpenMedia} onToggleHidden={this.handleToggleHidden} + domain={domain} /> path.match(/^\/statuses\//); +const shouldHideFAB = path => path.match(/^\/statuses\/|^\/search|^\/getting-started/); export default @(component => injectIntl(component, { withRef: true })) class ColumnsArea extends ImmutablePureComponent { diff --git a/app/javascript/mastodon/features/ui/index.js b/app/javascript/mastodon/features/ui/index.js index cb88e538a..f01c2bf24 100644 --- a/app/javascript/mastodon/features/ui/index.js +++ b/app/javascript/mastodon/features/ui/index.js @@ -243,6 +243,7 @@ class UI extends React.PureComponent { } handleDragOver = (e) => { + if (this.dataTransferIsText(e.dataTransfer)) return false; e.preventDefault(); e.stopPropagation(); @@ -256,9 +257,11 @@ class UI extends React.PureComponent { } handleDrop = (e) => { + if (this.dataTransferIsText(e.dataTransfer)) return; e.preventDefault(); this.setState({ draggingOver: false }); + this.dragTargets = []; if (e.dataTransfer && e.dataTransfer.files.length === 1) { this.props.dispatch(uploadCompose(e.dataTransfer.files)); @@ -278,6 +281,10 @@ class UI extends React.PureComponent { this.setState({ draggingOver: false }); } + dataTransferIsText = (dataTransfer) => { + return (dataTransfer && Array.from(dataTransfer.types).includes('text/plain') && dataTransfer.items.length === 1); + } + closeUploadModal = () => { this.setState({ draggingOver: false }); } diff --git a/app/javascript/mastodon/locales/ar.json b/app/javascript/mastodon/locales/ar.json index 85117c524..8c6080c62 100644 --- a/app/javascript/mastodon/locales/ar.json +++ b/app/javascript/mastodon/locales/ar.json @@ -17,7 +17,7 @@ "account.follows_you": "يتابعك", "account.hide_reblogs": "إخفاء ترقيات @{name}", "account.link_verified_on": "تم التحقق مِن مالك هذا الرابط بتاريخ {date}", - "account.locked_info": "This account privacy status is set to locked. The owner manually reviews who can follow them.", + "account.locked_info": "تم تأمين خصوصية هذا الحساب عبر قُفل. فصاحب الحساب يُراجِع يدويا طلبات المتابَعة و الاشتراك بحسابه.", "account.media": "وسائط", "account.mention": "أُذكُر @{name}", "account.moved_to": "{name} إنتقل إلى :", @@ -137,8 +137,8 @@ "follow_request.authorize": "ترخيص", "follow_request.reject": "رفض", "getting_started.developers": "المُطوِّرون", - "getting_started.directory": "Profile directory", - "getting_started.documentation": "Documentation", + "getting_started.directory": "دليل المستخدِمين والمستخدِمات", + "getting_started.documentation": "الدليل", "getting_started.heading": "إستعدّ للبدء", "getting_started.invite": "دعوة أشخاص", "getting_started.open_source_notice": "ماستدون برنامج مفتوح المصدر. يمكنك المساهمة، أو الإبلاغ عن تقارير الأخطاء، على جيت هب {github}.", @@ -160,17 +160,17 @@ "introduction.federation.home.headline": "Home", "introduction.federation.home.text": "سوف تُعرَض منشورات الأشخاص الذين تُتابِعهم على الخيط الرئيسي. بإمكانك متابعة أي حساب أيا كان الخادم الذي هو عليه!", "introduction.federation.local.headline": "Local", - "introduction.federation.local.text": "Public posts from people on the same server as you will appear in the local timeline.", - "introduction.interactions.action": "Finish tutorial!", + "introduction.federation.local.text": "المنشورات المُوجّهة للعامة على نفس الخادم الذي أنتم عليه ستظهر على الخيط الزمني المحلي.", + "introduction.interactions.action": "إنهاء العرض التوضيحي!", "introduction.interactions.favourite.headline": "الإضافة إلى المفضلة", "introduction.interactions.favourite.text": "يمكِنك إضافة أي تبويق إلى المفضلة و إعلام صاحبه أنك أعجِبت بذاك التبويق.", "introduction.interactions.reblog.headline": "الترقية", "introduction.interactions.reblog.text": "يمكنكم مشاركة تبويقات الأشخاص الآخرين مع متابِعيكم عن طريق ترقيتها.", "introduction.interactions.reply.headline": "الرد", - "introduction.interactions.reply.text": "You can reply to other people's and your own toots, which will chain them together in a conversation.", + "introduction.interactions.reply.text": "يمكنكم الرد على تبويقاتكم و تبويقات الآخرين على شكل سلسلة محادثة.", "introduction.welcome.action": "هيا بنا!", "introduction.welcome.headline": "الخطوات الأولى", - "introduction.welcome.text": "Welcome to the fediverse! In a few moments, you'll be able to broadcast messages and talk to your friends across a wide variety of servers. But this server, {domain}, is special—it hosts your profile, so remember its name.", + "introduction.welcome.text": "مرحبا بكم على الفيديفيرس! بعد لحظات قليلة ، سيكون بمقدوركم بث رسائل والتحدث إلى أصدقائكم عبر تشكيلة واسعة من الخوادم المختلفة. هذا الخادم ، {domain} ، يستضيف ملفكم الشخصي ، لذا يجب تذكر اسمه جيدا.", "keyboard_shortcuts.back": "للعودة", "keyboard_shortcuts.blocked": "لفتح قائمة المستخدمين المحظورين", "keyboard_shortcuts.boost": "للترقية", @@ -297,8 +297,8 @@ "search_results.statuses": "التبويقات", "search_results.total": "{count, number} {count, plural, one {result} و {results}}", "standalone.public_title": "نظرة على ...", - "status.admin_account": "Open moderation interface for @{name}", - "status.admin_status": "Open this status in the moderation interface", + "status.admin_account": "افتح الواجهة الإدارية لـ @{name}", + "status.admin_status": "افتح هذا المنشور على واجهة الإشراف", "status.block": "Block @{name}", "status.cancel_reblog_private": "إلغاء الترقية", "status.cannot_reblog": "تعذرت ترقية هذا المنشور", diff --git a/app/javascript/mastodon/locales/ca.json b/app/javascript/mastodon/locales/ca.json index 5d7830772..c568d09fe 100644 --- a/app/javascript/mastodon/locales/ca.json +++ b/app/javascript/mastodon/locales/ca.json @@ -8,7 +8,7 @@ "account.disclaimer_full": "La informació següent pot reflectir incompleta el perfil de l'usuari.", "account.domain_blocked": "Domini ocult", "account.edit_profile": "Editar el perfil", - "account.endorse": "Característica del perfil", + "account.endorse": "Recomanar en el teu perfil", "account.follow": "Segueix", "account.followers": "Seguidors", "account.followers.empty": "Encara ningú no segueix aquest usuari.", @@ -155,9 +155,9 @@ "home.column_settings.show_reblogs": "Mostrar impulsos", "home.column_settings.show_replies": "Mostrar respostes", "introduction.federation.action": "Següent", - "introduction.federation.federated.headline": "Federated", + "introduction.federation.federated.headline": "Federada", "introduction.federation.federated.text": "Les publicacions públiques d'altres servidors del fedivers apareixeran a la línia de temps federada.", - "introduction.federation.home.headline": "Home", + "introduction.federation.home.headline": "Inici", "introduction.federation.home.text": "Les publicacions de les persones que segueixes apareixeran a la línia de temps Inici. Pots seguir qualsevol persona de qualsevol servidor!", "introduction.federation.local.headline": "Local", "introduction.federation.local.text": "Les publicacions públiques de les persones del teu mateix servidor apareixeran a la línia de temps local.", @@ -297,8 +297,8 @@ "search_results.statuses": "Toots", "search_results.total": "{count, number} {count, plural, un {result} altres {results}}", "standalone.public_title": "Una mirada a l'interior ...", - "status.admin_account": "Open moderation interface for @{name}", - "status.admin_status": "Open this status in the moderation interface", + "status.admin_account": "Obre l'interfície de moderació per a @{name}", + "status.admin_status": "Obre aquest estat a la interfície de moderació", "status.block": "Block @{name}", "status.cancel_reblog_private": "Desfer l'impuls", "status.cannot_reblog": "Aquesta publicació no pot ser retootejada", diff --git a/app/javascript/mastodon/locales/co.json b/app/javascript/mastodon/locales/co.json index 8a27f5018..b344227b8 100644 --- a/app/javascript/mastodon/locales/co.json +++ b/app/javascript/mastodon/locales/co.json @@ -297,8 +297,8 @@ "search_results.statuses": "Statuti", "search_results.total": "{count, number} {count, plural, one {risultatu} other {risultati}}", "standalone.public_title": "Una vista à l'internu...", - "status.admin_account": "Open moderation interface for @{name}", - "status.admin_status": "Open this status in the moderation interface", + "status.admin_account": "Apre l'interfaccia di muderazione per @{name}", + "status.admin_status": "Apre stu statutu in l'interfaccia di muderazione", "status.block": "Bluccà @{name}", "status.cancel_reblog_private": "Ùn sparte più", "status.cannot_reblog": "Stu statutu ùn pò micca esse spartutu", diff --git a/app/javascript/mastodon/locales/cs.json b/app/javascript/mastodon/locales/cs.json index 3718b8e94..e5e86f052 100644 --- a/app/javascript/mastodon/locales/cs.json +++ b/app/javascript/mastodon/locales/cs.json @@ -150,7 +150,7 @@ "hashtag.column_settings.tag_mode.all": "Všechny z těchto", "hashtag.column_settings.tag_mode.any": "Jakékoliv z těchto", "hashtag.column_settings.tag_mode.none": "Žádné z těchto", - "hashtag.column_settings.tag_toggle": "Zahrnout v tomto sloupci dodatečné hashtagy", + "hashtag.column_settings.tag_toggle": "Zahrnout v tomto sloupci dodatečné tagy", "home.column_settings.basic": "Základní", "home.column_settings.show_reblogs": "Zobrazit boosty", "home.column_settings.show_replies": "Zobrazit odpovědi", @@ -297,8 +297,8 @@ "search_results.statuses": "Tooty", "search_results.total": "{count, number} {count, plural, one {výsledek} few {výsledky} many {výsledku} other {výsledků}}", "standalone.public_title": "Nahlédněte dovnitř...", - "status.admin_account": "Open moderation interface for @{name}", - "status.admin_status": "Open this status in the moderation interface", + "status.admin_account": "Otevřít moderační rozhraní pro uživatele @{name}", + "status.admin_status": "Otevřít tento příspěvek v moderačním rozhraní", "status.block": "Zablokovat uživatele @{name}", "status.cancel_reblog_private": "Zrušit boost", "status.cannot_reblog": "Tento příspěvek nemůže být boostnutý", diff --git a/app/javascript/mastodon/locales/cy.json b/app/javascript/mastodon/locales/cy.json index f96b2e22f..caa037d57 100644 --- a/app/javascript/mastodon/locales/cy.json +++ b/app/javascript/mastodon/locales/cy.json @@ -84,7 +84,7 @@ "confirmations.block.confirm": "Blocio", "confirmations.block.message": "Ydych chi'n sicr eich bod eisiau blocio {name}?", "confirmations.delete.confirm": "Dileu", - "confirmations.delete.message": "Ydych chi'n sicr eich bod eisiau dileu y statws hwn?", + "confirmations.delete.message": "Ydych chi'n sicr eich bod eisiau dileu y tŵt hwn?", "confirmations.delete_list.confirm": "Dileu", "confirmations.delete_list.message": "Ydych chi'n sicr eich bod eisiau dileu y rhestr hwn am byth?", "confirmations.domain_block.confirm": "Cuddio parth cyfan", @@ -92,12 +92,12 @@ "confirmations.mute.confirm": "Tawelu", "confirmations.mute.message": "Ydych chi'n sicr eich bod am ddistewi {name}?", "confirmations.redraft.confirm": "Dileu & ailddrafftio", - "confirmations.redraft.message": "Ydych chi'n siwr eich bod eisiau dileu y statws hwn a'i ailddrafftio? Bydd ffefrynnau a bwstiau'n cael ei colli, a bydd ymatebion i'r statws gwreiddiol yn cael eu hamddifadu.", + "confirmations.redraft.message": "Ydych chi'n siwr eich bod eisiau dileu y tŵt hwn a'i ailddrafftio? Bydd ffefrynnau a bwstiau'n cael ei colli, a bydd ymatebion i'r tŵt gwreiddiol yn cael eu hamddifadu.", "confirmations.reply.confirm": "Ateb", "confirmations.reply.message": "Bydd ateb nawr yn cymryd lle y neges yr ydych yn cyfansoddi ar hyn o bryd. Ydych chi'n sicr yr ydych am barhau?", "confirmations.unfollow.confirm": "Dad-ddilynwch", "confirmations.unfollow.message": "Ydych chi'n sicr eich bod am ddad-ddilyn {name}?", - "embed.instructions": "Mewnblannwch y statws hwn ar eich gwefan drwy gopïo'r côd isod.", + "embed.instructions": "Mewnblannwch y tŵt hwn ar eich gwefan drwy gopïo'r côd isod.", "embed.preview": "Dyma sut olwg fydd arno:", "emoji_button.activity": "Gweithgarwch", "emoji_button.custom": "Unigryw", @@ -144,29 +144,29 @@ "getting_started.open_source_notice": "Mae Mastodon yn feddalwedd côd agored. Mae modd cyfrannu neu adrodd materion ar GitHUb ar {github}.", "getting_started.security": "Diogelwch", "getting_started.terms": "Telerau Gwasanaeth", - "hashtag.column_header.tag_mode.all": "and {additional}", - "hashtag.column_header.tag_mode.any": "or {additional}", - "hashtag.column_header.tag_mode.none": "without {additional}", - "hashtag.column_settings.tag_mode.all": "All of these", - "hashtag.column_settings.tag_mode.any": "Any of these", - "hashtag.column_settings.tag_mode.none": "None of these", + "hashtag.column_header.tag_mode.all": "a {additional}", + "hashtag.column_header.tag_mode.any": "neu {additional}", + "hashtag.column_header.tag_mode.none": "heb {additional}", + "hashtag.column_settings.tag_mode.all": "Pob un o'r rhain", + "hashtag.column_settings.tag_mode.any": "Unrhyw un o'r rhain", + "hashtag.column_settings.tag_mode.none": "Dim o'r rhain", "hashtag.column_settings.tag_toggle": "Include additional tags in this column", "home.column_settings.basic": "Syml", "home.column_settings.show_reblogs": "Dangos bŵstiau", "home.column_settings.show_replies": "Dangos ymatebion", - "introduction.federation.action": "Next", - "introduction.federation.federated.headline": "Federated", + "introduction.federation.action": "Nesaf", + "introduction.federation.federated.headline": "Ffederasiwn", "introduction.federation.federated.text": "Public posts from other servers of the fediverse will appear in the federated timeline.", "introduction.federation.home.headline": "Home", "introduction.federation.home.text": "Posts from people you follow will appear in your home feed. You can follow anyone on any server!", "introduction.federation.local.headline": "Local", "introduction.federation.local.text": "Public posts from people on the same server as you will appear in the local timeline.", "introduction.interactions.action": "Finish tutorial!", - "introduction.interactions.favourite.headline": "Favourite", + "introduction.interactions.favourite.headline": "Ffefryn", "introduction.interactions.favourite.text": "You can save a toot for later, and let the author know that you liked it, by favouriting it.", - "introduction.interactions.reblog.headline": "Boost", + "introduction.interactions.reblog.headline": "Hwb", "introduction.interactions.reblog.text": "You can share other people's toots with your followers by boosting them.", - "introduction.interactions.reply.headline": "Reply", + "introduction.interactions.reply.headline": "Ateb", "introduction.interactions.reply.text": "You can reply to other people's and your own toots, which will chain them together in a conversation.", "introduction.welcome.action": "Let's go!", "introduction.welcome.headline": "First steps", @@ -174,12 +174,12 @@ "keyboard_shortcuts.back": "i lywio nôl", "keyboard_shortcuts.blocked": "i agor rhestr defnyddwyr a flociwyd", "keyboard_shortcuts.boost": "i fŵstio", - "keyboard_shortcuts.column": "i ffocysu statws yn un o'r colofnau", + "keyboard_shortcuts.column": "i ffocysu tŵt yn un o'r colofnau", "keyboard_shortcuts.compose": "i ffocysu yr ardal cyfansoddi testun", "keyboard_shortcuts.description": "Disgrifiad", "keyboard_shortcuts.direct": "i agor colofn negeseuon preifat", "keyboard_shortcuts.down": "i symud lawr yn y rhestr", - "keyboard_shortcuts.enter": "i agor statws", + "keyboard_shortcuts.enter": "i agor tŵt", "keyboard_shortcuts.favourite": "i hoffi", "keyboard_shortcuts.favourites": "i agor rhestr hoffi", "keyboard_shortcuts.federated": "i agor ffrwd y ffederasiwn", @@ -239,30 +239,30 @@ "navigation_bar.preferences": "Dewisiadau", "navigation_bar.public_timeline": "Ffrwd y ffederasiwn", "navigation_bar.security": "Diogelwch", - "notification.favourite": "hoffodd {name} eich statws", + "notification.favourite": "hoffodd {name} eich tŵt", "notification.follow": "dilynodd {name} chi", "notification.mention": "Soniodd {name} amdanoch chi", - "notification.reblog": "{name} boosted your status", + "notification.reblog": "Hysbysebodd {name} eich tŵt", "notifications.clear": "Clirio hysbysiadau", "notifications.clear_confirmation": "Ydych chi'n sicr eich bod am glirio'ch holl hysbysiadau am byth?", "notifications.column_settings.alert": "Hysbysiadau bwrdd gwaith", "notifications.column_settings.favourite": "Ffefrynnau:", "notifications.column_settings.filter_bar.advanced": "Display all categories", "notifications.column_settings.filter_bar.category": "Quick filter bar", - "notifications.column_settings.filter_bar.show": "Show", + "notifications.column_settings.filter_bar.show": "Dangos", "notifications.column_settings.follow": "Dilynwyr newydd:", "notifications.column_settings.mention": "Crybwylliadau:", "notifications.column_settings.push": "Hysbysiadau push", - "notifications.column_settings.reblog": "Boosts:", + "notifications.column_settings.reblog": "Hybiadau:", "notifications.column_settings.show": "Dangos yn y golofn", "notifications.column_settings.sound": "Chwarae sain", - "notifications.filter.all": "All", - "notifications.filter.boosts": "Boosts", - "notifications.filter.favourites": "Favourites", - "notifications.filter.follows": "Follows", + "notifications.filter.all": "Pob", + "notifications.filter.boosts": "Hybiadau", + "notifications.filter.favourites": "Ffefrynnau", + "notifications.filter.follows": "Yn dilyn", "notifications.filter.mentions": "Mentions", "notifications.group": "{count} o hysbysiadau", - "privacy.change": "Addasu preifatrwdd y statws", + "privacy.change": "Addasu preifatrwdd y tŵt", "privacy.direct.long": "Cyhoeddi i'r defnyddwyr sy'n cael eu crybwyll yn unig", "privacy.direct.short": "Uniongyrchol", "privacy.private.long": "Cyhoeddi i ddilynwyr yn unig", @@ -289,7 +289,7 @@ "search_popout.search_format": "Fformat chwilio uwch", "search_popout.tips.full_text": "Mae testun syml yn dychwelyd tŵtiau yr ydych wedi ysgrifennu, hoffi, wedi'u bŵstio, neu wedi'ch crybwyll ynddynt, ynghyd a chyfateb a enwau defnyddwyr, enwau arddangos ac hashnodau.", "search_popout.tips.hashtag": "hashnod", - "search_popout.tips.status": "statws", + "search_popout.tips.status": "tŵt", "search_popout.tips.text": "Mae testun syml yn dychwelyd enwau arddangos, enwau defnyddwyr a hashnodau sy'n cyfateb", "search_popout.tips.user": "defnyddiwr", "search_results.accounts": "Pobl", @@ -298,7 +298,7 @@ "search_results.total": "{count, number} {count, plural, one {result} other {results}}", "standalone.public_title": "Golwg tu fewn...", "status.admin_account": "Open moderation interface for @{name}", - "status.admin_status": "Open this status in the moderation interface", + "status.admin_status": "Open this tŵt in the moderation interface", "status.block": "Blocio @{name}", "status.cancel_reblog_private": "Dadfŵstio", "status.cannot_reblog": "Ni ellir sbarduno'r tŵt hwn", @@ -307,7 +307,7 @@ "status.direct": "Neges breifat @{name}", "status.embed": "Plannu", "status.favourite": "Hoffi", - "status.filtered": "Filtered", + "status.filtered": "Wedi'i hidlo", "status.load_more": "Llwythwch mwy", "status.local_only": "This post is only visible by other users of your instance", "status.media_hidden": "Cyfryngau wedi'u cuddio", @@ -315,7 +315,7 @@ "status.more": "Mwy", "status.mute": "Tawelu @{name}", "status.mute_conversation": "Tawelu sgwrs", - "status.open": "Ehangu'r statws hwn", + "status.open": "Ehangu'r tŵt hwn", "status.pin": "Pinio ar y proffil", "status.pinned": "Pinio tŵt", "status.read_more": "Darllen mwy", @@ -334,12 +334,12 @@ "status.show_less_all": "Dangos llai i bawb", "status.show_more": "Dangos mwy", "status.show_more_all": "Dangos mwy i bawb", - "status.show_thread": "Show thread", + "status.show_thread": "Dangos edefyn", "status.unmute_conversation": "Dad-dawelu sgwrs", "status.unpin": "Dadbinio o'r proffil", "suggestions.dismiss": "Dismiss suggestion", "suggestions.header": "You might be interested in…", - "tabs_bar.federated_timeline": "Wedi'i ffedereiddio", + "tabs_bar.federated_timeline": "Ffederasiwn", "tabs_bar.home": "Hafan", "tabs_bar.local_timeline": "Lleol", "tabs_bar.notifications": "Hysbysiadau", @@ -349,7 +349,7 @@ "upload_area.title": "Llusgwch & gollwing i uwchlwytho", "upload_button.label": "Ychwanegwch gyfryngau (JPEG, PNG, GIF, WebM, MP4, MOV)", "upload_form.description": "Disgrifio i'r rheini a nam ar ei golwg", - "upload_form.focus": "Cropio", + "upload_form.focus": "Newid rhagolwg", "upload_form.undo": "Dileu", "upload_progress.label": "Uwchlwytho...", "video.close": "Cau fideo", diff --git a/app/javascript/mastodon/locales/de.json b/app/javascript/mastodon/locales/de.json index 8e268d5aa..7e5a3b559 100644 --- a/app/javascript/mastodon/locales/de.json +++ b/app/javascript/mastodon/locales/de.json @@ -92,7 +92,7 @@ "confirmations.mute.confirm": "Stummschalten", "confirmations.mute.message": "Bist du dir sicher, dass du {name} stummschalten möchtest?", "confirmations.redraft.confirm": "Löschen und neu erstellen", - "confirmations.redraft.message": "Bist du dir sicher, dass du diesen Status löschen und neu machen möchtest? Favoriten und Boosts werden verloren gehen und Antworten zu diesem Post werden verwaist sein.", + "confirmations.redraft.message": "Bist du dir sicher, dass du diesen Beitrag löschen und neu machen möchtest? Favoriten und Boosts werden verloren gehen und Antworten zu diesem Beitrag werden verwaist sein.", "confirmations.reply.confirm": "Antworten", "confirmations.reply.message": "Wenn du jetzt antwortest wird es die gesamte Nachricht verwerfen, die du gerade schreibst. Möchtest du wirklich fortfahren?", "confirmations.unfollow.confirm": "Entfolgen", @@ -165,7 +165,7 @@ "introduction.interactions.favourite.headline": "Favorisieren", "introduction.interactions.favourite.text": "Du kannst einen Beitrag für später speichern und dem Autor wissen lassen, dass du ihn magst, indem du ihn favorisierst.", "introduction.interactions.reblog.headline": "Teilen", - "introduction.interactions.reblog.text": "Du kannst Beiträge von anderen Leuten an deine Follower teilen (oder auch \"boosten\").", + "introduction.interactions.reblog.text": "Du kannst Beiträge von anderen Leuten an deine Follower teilen.", "introduction.interactions.reply.headline": "Antworten", "introduction.interactions.reply.text": "Du kannst auf die Beiträge von anderen Leuten antworten und die Beiträge werden dann in eine Konversation zusammengebunden.", "introduction.welcome.action": "Lasst uns loslegen!", @@ -173,7 +173,7 @@ "introduction.welcome.text": "Willkommen im Fediverse! In wenigen Momenten wirst du in der Lage sein Nachrichten zu versenden und mit deinen Freunden über Server hinweg in Kontakt zu treten. Aber dieser Server, {domain}, ist sehr speziell — er hostet dein Profil, also merke dir den Namen.", "keyboard_shortcuts.back": "zurück navigieren", "keyboard_shortcuts.blocked": "Liste blockierter Profile öffnen", - "keyboard_shortcuts.boost": "boosten", + "keyboard_shortcuts.boost": "teilen", "keyboard_shortcuts.column": "einen Status in einer der Spalten fokussieren", "keyboard_shortcuts.compose": "fokussiere das Eingabefeld", "keyboard_shortcuts.description": "Beschreibung", @@ -257,9 +257,9 @@ "notifications.column_settings.show": "In der Spalte anzeigen", "notifications.column_settings.sound": "Ton abspielen", "notifications.filter.all": "Alle", - "notifications.filter.boosts": "Boosts", + "notifications.filter.boosts": "Erneut geteilte Beiträge", "notifications.filter.favourites": "Favoriten", - "notifications.filter.follows": "Follows", + "notifications.filter.follows": "Folgende", "notifications.filter.mentions": "Erwähnungen", "notifications.group": "{count} Benachrichtigungen", "privacy.change": "Sichtbarkeit des Beitrags anpassen", @@ -297,8 +297,8 @@ "search_results.statuses": "Beiträge", "search_results.total": "{count, number} {count, plural, one {Ergebnis} other {Ergebnisse}}", "standalone.public_title": "Ein kleiner Einblick …", - "status.admin_account": "Open moderation interface for @{name}", - "status.admin_status": "Open this status in the moderation interface", + "status.admin_account": "Öffne Moderationsoberfläche für @{name}", + "status.admin_status": "Öffne diesen Status in der Moderationsoberfläche", "status.block": "Blockiere @{name}", "status.cancel_reblog_private": "Nicht mehr teilen", "status.cannot_reblog": "Dieser Beitrag kann nicht geteilt werden", @@ -322,7 +322,7 @@ "status.reblog": "Teilen", "status.reblog_private": "An das eigentliche Publikum teilen", "status.reblogged_by": "{name} teilte", - "status.reblogs.empty": "Diesen Beitrag hat noch niemand geboostet. Sobald es jemand tun, wird er hier angezeigt.", + "status.reblogs.empty": "Diesen Beitrag hat noch niemand geteilt. Sobald es jemand tut, wird die Person hier angezeigt.", "status.redraft": "Löschen und neu erstellen", "status.reply": "Antworten", "status.replyAll": "Auf Thread antworten", diff --git a/app/javascript/mastodon/locales/defaultMessages.json b/app/javascript/mastodon/locales/defaultMessages.json index 0bc710441..22aa27866 100644 --- a/app/javascript/mastodon/locales/defaultMessages.json +++ b/app/javascript/mastodon/locales/defaultMessages.json @@ -1988,6 +1988,43 @@ ], "path": "app/javascript/mastodon/features/status/components/detailed_status.json" }, + { + "descriptors": [ + { + "defaultMessage": "Delete", + "id": "confirmations.delete.confirm" + }, + { + "defaultMessage": "Are you sure you want to delete this status?", + "id": "confirmations.delete.message" + }, + { + "defaultMessage": "Delete & redraft", + "id": "confirmations.redraft.confirm" + }, + { + "defaultMessage": "Are you sure you want to delete this status and re-draft it? Favourites and boosts will be lost, and replies to the original post will be orphaned.", + "id": "confirmations.redraft.message" + }, + { + "defaultMessage": "Block", + "id": "confirmations.block.confirm" + }, + { + "defaultMessage": "Reply", + "id": "confirmations.reply.confirm" + }, + { + "defaultMessage": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?", + "id": "confirmations.reply.message" + }, + { + "defaultMessage": "Are you sure you want to block {name}?", + "id": "confirmations.block.message" + } + ], + "path": "app/javascript/mastodon/features/status/containers/detailed_status_container.json" + }, { "descriptors": [ { diff --git a/app/javascript/mastodon/locales/fr.json b/app/javascript/mastodon/locales/fr.json index a7829085d..649d495ed 100644 --- a/app/javascript/mastodon/locales/fr.json +++ b/app/javascript/mastodon/locales/fr.json @@ -297,8 +297,8 @@ "search_results.statuses": "Pouets", "search_results.total": "{count, number} {count, plural, one {résultat} other {résultats}}", "standalone.public_title": "Un aperçu …", - "status.admin_account": "Open moderation interface for @{name}", - "status.admin_status": "Open this status in the moderation interface", + "status.admin_account": "Ouvrir l'interface de modération pour @{name}", + "status.admin_status": "Ouvrir ce statut dans l'interface de modération", "status.block": "Block @{name}", "status.cancel_reblog_private": "Dé-booster", "status.cannot_reblog": "Cette publication ne peut être boostée", diff --git a/app/javascript/mastodon/locales/gl.json b/app/javascript/mastodon/locales/gl.json index 206f5af34..453043a0f 100644 --- a/app/javascript/mastodon/locales/gl.json +++ b/app/javascript/mastodon/locales/gl.json @@ -137,7 +137,7 @@ "follow_request.authorize": "Autorizar", "follow_request.reject": "Rexeitar", "getting_started.developers": "Desenvolvedoras", - "getting_started.directory": "Profile directory", + "getting_started.directory": "Directorio do perfil", "getting_started.documentation": "Documentation", "getting_started.heading": "Comezando", "getting_started.invite": "Convide a xente", @@ -297,8 +297,8 @@ "search_results.statuses": "Toots", "search_results.total": "{count, number} {count,plural,one {result} outros {results}}", "standalone.public_title": "Ollada dentro...", - "status.admin_account": "Open moderation interface for @{name}", - "status.admin_status": "Open this status in the moderation interface", + "status.admin_account": "Abrir interface de moderación para @{name}", + "status.admin_status": "Abrir este estado na interface de moderación", "status.block": "Block @{name}", "status.cancel_reblog_private": "Non promover", "status.cannot_reblog": "Esta mensaxe non pode ser promovida", diff --git a/app/javascript/mastodon/locales/ja.json b/app/javascript/mastodon/locales/ja.json index ab37a1c09..8ca6507e3 100644 --- a/app/javascript/mastodon/locales/ja.json +++ b/app/javascript/mastodon/locales/ja.json @@ -137,7 +137,7 @@ "follow_request.authorize": "許可", "follow_request.reject": "拒否", "getting_started.developers": "開発", - "getting_started.directory": "Profile directory", + "getting_started.directory": "ディレクトリ", "getting_started.documentation": "ドキュメント", "getting_started.heading": "スタート", "getting_started.invite": "招待", @@ -262,7 +262,7 @@ "notifications.filter.follows": "フォロー", "notifications.filter.mentions": "返信", "notifications.group": "{count} 件の通知", - "privacy.change": "投稿のプライバシーを変更", + "privacy.change": "公開範囲を変更", "privacy.direct.long": "メンションしたユーザーだけに公開", "privacy.direct.short": "ダイレクト", "privacy.private.long": "フォロワーだけに公開", @@ -297,8 +297,8 @@ "search_results.statuses": "トゥート", "search_results.total": "{count, number}件の結果", "standalone.public_title": "今こんな話をしています...", - "status.admin_account": "Open moderation interface for @{name}", - "status.admin_status": "Open this status in the moderation interface", + "status.admin_account": "@{name} のモデレーション画面を開く", + "status.admin_status": "このトゥートをモデレーション画面で開く", "status.block": "@{name}さんをブロック", "status.cancel_reblog_private": "ブースト解除", "status.cannot_reblog": "この投稿はブーストできません", diff --git a/app/javascript/mastodon/locales/ko.json b/app/javascript/mastodon/locales/ko.json index a21720911..ff30adde4 100644 --- a/app/javascript/mastodon/locales/ko.json +++ b/app/javascript/mastodon/locales/ko.json @@ -297,8 +297,8 @@ "search_results.statuses": "툿", "search_results.total": "{count, number}건의 결과", "standalone.public_title": "지금 이런 이야기를 하고 있습니다…", - "status.admin_account": "Open moderation interface for @{name}", - "status.admin_status": "Open this status in the moderation interface", + "status.admin_account": "@{name}에 대한 모더레이션 인터페이스 열기", + "status.admin_status": "모더레이션 인터페이스에서 이 게시물 열기", "status.block": "@{name} 차단", "status.cancel_reblog_private": "부스트 취소", "status.cannot_reblog": "이 포스트는 부스트 할 수 없습니다", diff --git a/app/javascript/mastodon/locales/nl.json b/app/javascript/mastodon/locales/nl.json index 71cc437cb..7087df8e4 100644 --- a/app/javascript/mastodon/locales/nl.json +++ b/app/javascript/mastodon/locales/nl.json @@ -118,8 +118,8 @@ "empty_column.community": "De lokale tijdlijn is nog leeg. Toot iets in het openbaar om de bal aan het rollen te krijgen!", "empty_column.direct": "Je hebt nog geen directe berichten. Wanneer je er een verzend of ontvangt, zijn deze hier te zien.", "empty_column.domain_blocks": "Er zijn nog geen genegeerde domeinen.", - "empty_column.favourited_statuses": "Jij hebt nog geen favoriete toots. Wanneer je er een als favoriet markeert, valt deze hier te zien.", - "empty_column.favourites": "Niemand heeft nog deze toot als favoriet gemarkeerd. Wanneer iemand dit doet, valt dat hier te zien.", + "empty_column.favourited_statuses": "Jij hebt nog geen favoriete toots. Wanneer je er een aan jouw favorieten toevoegt, valt deze hier te zien.", + "empty_column.favourites": "Niemand heeft deze toot nog aan hun favorieten toegevoegd. Wanneer iemand dit doet, valt dat hier te zien.", "empty_column.follow_requests": "Jij hebt nog enkel volgverzoek ontvangen. Wanneer je er eentje ontvangt, valt dat hier te zien.", "empty_column.hashtag": "Er is nog niks te vinden onder deze hashtag.", "empty_column.home": "Jij volgt nog niemand. Bezoek {public} of gebruik het zoekvenster om andere mensen te ontmoeten.", @@ -163,7 +163,7 @@ "introduction.federation.local.text": "Openbare toots van mensen die ook op jouw server zitten verschijnen op de lokale tijdlijn.", "introduction.interactions.action": "Introductie beëindigen!", "introduction.interactions.favourite.headline": "Favorieten", - "introduction.interactions.favourite.text": "Je kunt door een toot als favoriet te markeren, deze voor later bewaren en de auteur laten weten dat je het leuk vond.", + "introduction.interactions.favourite.text": "Je kunt door een toot aan jouw favorieten toe te voegen, deze voor later bewaren en de auteur laten weten dat je de toot leuk vind.", "introduction.interactions.reblog.headline": "Boost", "introduction.interactions.reblog.text": "Je kunt toots van andere mensen met jouw volgers delen door deze te boosten.", "introduction.interactions.reply.headline": "Reageren", @@ -180,7 +180,7 @@ "keyboard_shortcuts.direct": "om jouw directe berichten te tonen", "keyboard_shortcuts.down": "om naar beneden door de lijst te bewegen", "keyboard_shortcuts.enter": "om toot volledig te tonen", - "keyboard_shortcuts.favourite": "om als favoriet te markeren", + "keyboard_shortcuts.favourite": "om aan jouw favorieten toe te voegen", "keyboard_shortcuts.favourites": "om jouw lijst met favorieten te tonen", "keyboard_shortcuts.federated": "om de globale tijdlijn te tonen", "keyboard_shortcuts.heading": "Sneltoetsen", @@ -239,7 +239,7 @@ "navigation_bar.preferences": "Instellingen", "navigation_bar.public_timeline": "Globale tijdlijn", "navigation_bar.security": "Beveiliging", - "notification.favourite": "{name} markeerde jouw toot als favoriet", + "notification.favourite": "{name} voegde jouw toot als favoriet toe", "notification.follow": "{name} volgt jou nu", "notification.mention": "{name} vermeldde jou", "notification.reblog": "{name} boostte jouw toot", @@ -297,8 +297,8 @@ "search_results.statuses": "Toots", "search_results.total": "{count, number} {count, plural, one {resultaat} other {resultaten}}", "standalone.public_title": "Een kijkje binnenin...", - "status.admin_account": "Open moderation interface for @{name}", - "status.admin_status": "Open this status in the moderation interface", + "status.admin_account": "Moderatie-omgeving van @{name} openen", + "status.admin_status": "Deze toot in de moderatie-omgeving openen", "status.block": "Blokkeer @{name}", "status.cancel_reblog_private": "Niet langer boosten", "status.cannot_reblog": "Deze toot kan niet geboost worden", @@ -337,7 +337,7 @@ "status.show_thread": "Gesprek tonen", "status.unmute_conversation": "Gesprek niet langer negeren", "status.unpin": "Van profielpagina losmaken", - "suggestions.dismiss": "Suggestie verwerpen", + "suggestions.dismiss": "Voorstel verwerpen", "suggestions.header": "Je bent waarschijnlijk ook geïnteresseerd in…", "tabs_bar.federated_timeline": "Globaal", "tabs_bar.home": "Start", diff --git a/app/javascript/mastodon/locales/oc.json b/app/javascript/mastodon/locales/oc.json index f32537ddd..d8bbc50fa 100644 --- a/app/javascript/mastodon/locales/oc.json +++ b/app/javascript/mastodon/locales/oc.json @@ -297,8 +297,8 @@ "search_results.statuses": "Tuts", "search_results.total": "{count, number} {count, plural, one {resultat} other {resultats}}", "standalone.public_title": "Una ulhada dedins…", - "status.admin_account": "Open moderation interface for @{name}", - "status.admin_status": "Open this status in the moderation interface", + "status.admin_account": "Dobrir l’interfàcia de moderacion per @{name}", + "status.admin_status": "Dobrir aqueste estatut dins l’interfàcia de moderacion", "status.block": "Blocar @{name}", "status.cancel_reblog_private": "Quitar de partejar", "status.cannot_reblog": "Aqueste estatut pòt pas èsser partejat", diff --git a/app/javascript/mastodon/locales/pl.json b/app/javascript/mastodon/locales/pl.json index 8d5f6c8dc..1bbc60282 100644 --- a/app/javascript/mastodon/locales/pl.json +++ b/app/javascript/mastodon/locales/pl.json @@ -1,5 +1,5 @@ { - "account.add_or_remove_from_list": "Add or Remove from lists", + "account.add_or_remove_from_list": "Dodaj lub usuń z list", "account.badges.bot": "Bot", "account.block": "Blokuj @{name}", "account.block_domain": "Blokuj wszystko z {domain}", @@ -113,7 +113,7 @@ "emoji_button.search_results": "Wyniki wyszukiwania", "emoji_button.symbols": "Symbole", "emoji_button.travel": "Podróże i miejsca", - "empty_column.account_timeline": "No toots here!", + "empty_column.account_timeline": "Brak wpisów tutaj!", "empty_column.blocks": "Nie zablokowałeś(-aś) jeszcze żadnego użytkownika.", "empty_column.community": "Lokalna oś czasu jest pusta. Napisz coś publicznie, aby zagaić!", "empty_column.direct": "Nie masz żadnych wiadomości bezpośrednich. Kiedy dostaniesz lub wyślesz jakąś, pojawi się ona tutaj.", @@ -137,19 +137,19 @@ "follow_request.authorize": "Autoryzuj", "follow_request.reject": "Odrzuć", "getting_started.developers": "Dla programistów", - "getting_started.directory": "Profile directory", + "getting_started.directory": "Katalog profilów", "getting_started.documentation": "Dokumentacja", "getting_started.heading": "Rozpocznij", "getting_started.invite": "Zaproś znajomych", "getting_started.open_source_notice": "Mastodon jest oprogramowaniem o otwartym źródle. Możesz pomóc w rozwoju lub zgłaszać błędy na GitHubie tutaj: {github}.", "getting_started.security": "Bezpieczeństwo", "getting_started.terms": "Zasady użytkowania", - "hashtag.column_header.tag_mode.all": "and {additional}", - "hashtag.column_header.tag_mode.any": "or {additional}", - "hashtag.column_header.tag_mode.none": "without {additional}", - "hashtag.column_settings.tag_mode.all": "All of these", - "hashtag.column_settings.tag_mode.any": "Any of these", - "hashtag.column_settings.tag_mode.none": "None of these", + "hashtag.column_header.tag_mode.all": "i {additional}", + "hashtag.column_header.tag_mode.any": "lub {additional}", + "hashtag.column_header.tag_mode.none": "bez {additional}", + "hashtag.column_settings.tag_mode.all": "Wszystkie", + "hashtag.column_settings.tag_mode.any": "Dowolne", + "hashtag.column_settings.tag_mode.none": "Żadne", "hashtag.column_settings.tag_toggle": "Include additional tags in this column", "home.column_settings.basic": "Podstawowe", "home.column_settings.show_reblogs": "Pokazuj podbicia", @@ -297,8 +297,8 @@ "search_results.statuses": "Wpisy", "search_results.total": "{count, number} {count, plural, one {wynik} few {wyniki} many {wyników} more {wyników}}", "standalone.public_title": "Spojrzenie w głąb…", - "status.admin_account": "Open moderation interface for @{name}", - "status.admin_status": "Open this status in the moderation interface", + "status.admin_account": "Otwórz interfejs moderacyjny dla @{name}", + "status.admin_status": "Otwórz ten wpis w interfejsie moderacyjnym", "status.block": "Zablokuj @{name}", "status.cancel_reblog_private": "Cofnij podbicie", "status.cannot_reblog": "Ten wpis nie może zostać podbity", @@ -334,11 +334,11 @@ "status.show_less_all": "Zwiń wszystkie", "status.show_more": "Rozwiń", "status.show_more_all": "Rozwiń wszystkie", - "status.show_thread": "Show thread", + "status.show_thread": "Pokaż wątek", "status.unmute_conversation": "Cofnij wyciszenie konwersacji", "status.unpin": "Odepnij z profilu", - "suggestions.dismiss": "Dismiss suggestion", - "suggestions.header": "You might be interested in…", + "suggestions.dismiss": "Odrzuć sugestię", + "suggestions.header": "Może Cię zainteresować…", "tabs_bar.federated_timeline": "Globalne", "tabs_bar.home": "Strona główna", "tabs_bar.local_timeline": "Lokalne", @@ -349,7 +349,7 @@ "upload_area.title": "Przeciągnij i upuść aby wysłać", "upload_button.label": "Dodaj zawartość multimedialną (JPEG, PNG, GIF, WebM, MP4, MOV)", "upload_form.description": "Wprowadź opis dla niewidomych i niedowidzących", - "upload_form.focus": "Przytnij", + "upload_form.focus": "Dopasuj podgląd", "upload_form.undo": "Usuń", "upload_progress.label": "Wysyłanie...", "video.close": "Zamknij film", diff --git a/app/javascript/mastodon/locales/pt-BR.json b/app/javascript/mastodon/locales/pt-BR.json index 723d7f78f..d441ad049 100644 --- a/app/javascript/mastodon/locales/pt-BR.json +++ b/app/javascript/mastodon/locales/pt-BR.json @@ -297,8 +297,8 @@ "search_results.statuses": "Toots", "search_results.total": "{count, number} {count, plural, one {resultado} other {resultados}}", "standalone.public_title": "Dê uma espiada...", - "status.admin_account": "Open moderation interface for @{name}", - "status.admin_status": "Open this status in the moderation interface", + "status.admin_account": "Abrir interface de moderação para @{name}", + "status.admin_status": "Abrir esse status na interface de moderação", "status.block": "Block @{name}", "status.cancel_reblog_private": "Desfazer compartilhamento", "status.cannot_reblog": "Esta postagem não pode ser compartilhada", diff --git a/app/javascript/mastodon/locales/ro.json b/app/javascript/mastodon/locales/ro.json index 9c1412627..de7984a82 100644 --- a/app/javascript/mastodon/locales/ro.json +++ b/app/javascript/mastodon/locales/ro.json @@ -137,7 +137,7 @@ "follow_request.authorize": "Autorizează", "follow_request.reject": "Respinge", "getting_started.developers": "Dezvoltatori", - "getting_started.directory": "Directorul profilului", + "getting_started.directory": "Explorează", "getting_started.documentation": "Documentație", "getting_started.heading": "Începe", "getting_started.invite": "Invită prieteni", diff --git a/app/javascript/mastodon/locales/sk.json b/app/javascript/mastodon/locales/sk.json index 764a314cf..a7e7f02c7 100644 --- a/app/javascript/mastodon/locales/sk.json +++ b/app/javascript/mastodon/locales/sk.json @@ -24,8 +24,8 @@ "account.mute": "Ignorovať @{name}", "account.mute_notifications": "Stĺmiť oboznámenia od @{name}", "account.muted": "Utíšený/á", - "account.posts": "Hlášky", - "account.posts_with_replies": "Hlášky s odpoveďami", + "account.posts": "Príspevky", + "account.posts_with_replies": "Príspevky aj s odpoveďami", "account.report": "Nahlás @{name}", "account.requested": "Čaká na schválenie. Kliknite pre zrušenie žiadosti", "account.share": "Zdieľať @{name} profil", @@ -56,7 +56,7 @@ "column.lists": "Zoznamy", "column.mutes": "Ignorovaní užívatelia", "column.notifications": "Oboznámenia", - "column.pins": "Pripnuté hlášky", + "column.pins": "Pripnuté príspevky", "column.public": "Federovaná časová os", "column_back_button.label": "Späť", "column_header.hide_settings": "Skryť nastavenia", @@ -70,7 +70,7 @@ "compose_form.direct_message_warning": "Tento príspevok bude videný výhradne iba spomenutými užívateľmi. Ber ale na vedomie že správci tvojej a všetkých iných zahrnutých instancií majú možnosť skontrolovať túto správu.", "compose_form.direct_message_warning_learn_more": "Zistiť viac", "compose_form.hashtag_warning": "Tento toot nebude zobrazený pod žiadným haštagom lebo nieje listovaný. Iba verejné tooty môžu byť nájdené podľa haštagu.", - "compose_form.lock_disclaimer": "Váš účet nie je zamknutý. Ktokoľvek ťa môže nasledovať a vidieť tvoje správy pre sledujúcich.", + "compose_form.lock_disclaimer": "Váš účet nie je {locked}. Ktokoľvek ťa môže nasledovať a vidieť tvoje správy pre sledujúcich.", "compose_form.lock_disclaimer.lock": "zamknutý", "compose_form.placeholder": "Čo máš na mysli?", "compose_form.publish": "Pošli", @@ -208,8 +208,8 @@ "lists.account.add": "Pridať do zoznamu", "lists.account.remove": "Odobrať zo zoznamu", "lists.delete": "Vymazať list", - "lists.edit": "Upraviť zoznam", - "lists.new.create": "Pridať zoznam", + "lists.edit": "Uprav zoznam", + "lists.new.create": "Pridaj zoznam", "lists.new.title_placeholder": "Názov nového zoznamu", "lists.search": "Vyhľadávajte medzi užívateľmi ktorých sledujete", "lists.subheading": "Tvoje zoznamy", @@ -225,7 +225,7 @@ "navigation_bar.direct": "Súkromné správy", "navigation_bar.discover": "Objavuj", "navigation_bar.domain_blocks": "Skryté domény", - "navigation_bar.edit_profile": "Upraviť profil", + "navigation_bar.edit_profile": "Uprav profil", "navigation_bar.favourites": "Obľúbené", "navigation_bar.filters": "Utĺmené slová", "navigation_bar.follow_requests": "Žiadosti o sledovanie", @@ -294,11 +294,11 @@ "search_popout.tips.user": "používateľ", "search_results.accounts": "Ľudia", "search_results.hashtags": "Haštagy", - "search_results.statuses": "Hlášky", + "search_results.statuses": "Príspevky", "search_results.total": "{count, number} {count, plural, one {výsledok} many {výsledkov} other {výsledky}}", "standalone.public_title": "Náhľad dovnútra...", - "status.admin_account": "Open moderation interface for @{name}", - "status.admin_status": "Open this status in the moderation interface", + "status.admin_account": "Otvor moderovacie rozhranie užívateľa @{name}", + "status.admin_status": "Otvor tento príspevok v moderovacom rozhraní", "status.block": "Blokovať @{name}", "status.cancel_reblog_private": "Nezdieľaj", "status.cannot_reblog": "Tento príspevok nemôže byť re-tootnutý", diff --git a/app/javascript/mastodon/service_worker/web_push_notifications.js b/app/javascript/mastodon/service_worker/web_push_notifications.js index 80a4fb329..1ab0dc0fa 100644 --- a/app/javascript/mastodon/service_worker/web_push_notifications.js +++ b/app/javascript/mastodon/service_worker/web_push_notifications.js @@ -92,11 +92,14 @@ const handlePush = (event) => { options.image = notification.status && notification.status.media_attachments.length > 0 && notification.status.media_attachments[0].preview_url || undefined; options.data = { access_token, preferred_locale, id: notification.status ? notification.status.id : notification.account.id, url: notification.status ? `/web/statuses/${notification.status.id}` : `/web/accounts/${notification.account.id}` }; - if (notification.status && notification.status.sensitive) { + if (notification.status && notification.status.spoiler_text || notification.status.sensitive) { options.data.hiddenBody = htmlToPlainText(notification.status.content); options.data.hiddenImage = notification.status.media_attachments.length > 0 && notification.status.media_attachments[0].preview_url; - options.body = notification.status.spoiler_text; + if (notification.status.spoiler_text) { + options.body = notification.status.spoiler_text; + } + options.image = undefined; options.actions = [actionExpand(preferred_locale)]; } else if (notification.type === 'mention') { diff --git a/app/javascript/packs/public.js b/app/javascript/packs/public.js index 6ba37c049..4ab27c769 100644 --- a/app/javascript/packs/public.js +++ b/app/javascript/packs/public.js @@ -33,6 +33,17 @@ function main() { const Rellax = require('rellax'); const createHistory = require('history').createBrowserHistory; + const scrollToDetailedStatus = () => { + const history = createHistory(); + const detailedStatuses = document.querySelectorAll('.public-layout .detailed-status'); + const location = history.location; + + if (detailedStatuses.length === 1 && (!location.state || !location.state.scrolledToDetailedStatus)) { + detailedStatuses[0].scrollIntoView(); + history.replace(location.pathname, { ...location.state, scrolledToDetailedStatus: true }); + } + }; + ready(() => { const locale = document.documentElement.lang; @@ -72,12 +83,24 @@ function main() { if (reactComponents.length > 0) { import(/* webpackChunkName: "containers/media_container" */ '../mastodon/containers/media_container') .then(({ default: MediaContainer }) => { + [].forEach.call(reactComponents, (component) => { + [].forEach.call(component.children, (child) => { + component.removeChild(child); + }); + }); + const content = document.createElement('div'); ReactDOM.render(, content); document.body.appendChild(content); + scrollToDetailedStatus(); }) - .catch(error => console.error(error)); + .catch(error => { + console.error(error); + scrollToDetailedStatus(); + }); + } else { + scrollToDetailedStatus(); } const parallaxComponents = document.querySelectorAll('.parallax'); @@ -86,13 +109,12 @@ function main() { new Rellax('.parallax', { speed: -1 }); } - const history = createHistory(); - const detailedStatuses = document.querySelectorAll('.public-layout .detailed-status'); - const location = history.location; - - if (detailedStatuses.length === 1 && (!location.state || !location.state.scrolledToDetailedStatus)) { - detailedStatuses[0].scrollIntoView(); - history.replace(location.pathname, { ...location.state, scrolledToDetailedStatus: true }); + if (document.body.classList.contains('with-modals')) { + const scrollbarWidth = window.innerWidth - document.documentElement.clientWidth; + const scrollbarWidthStyle = document.createElement('style'); + scrollbarWidthStyle.id = 'scrollbar-width'; + document.head.appendChild(scrollbarWidthStyle); + scrollbarWidthStyle.sheet.insertRule(`body.with-modals--active { margin-right: ${scrollbarWidth}px; }`, 0); } }); diff --git a/app/javascript/styles/mastodon/about.scss b/app/javascript/styles/mastodon/about.scss index dc456be3e..c6f249fab 100644 --- a/app/javascript/styles/mastodon/about.scss +++ b/app/javascript/styles/mastodon/about.scss @@ -364,7 +364,7 @@ $small-breakpoint: 960px; @media screen and (max-width: $column-breakpoint) { .grid { - grid-template-columns: auto; + grid-template-columns: 100%; .column-0 { display: block; @@ -1267,8 +1267,7 @@ $small-breakpoint: 960px; } #mastodon-timeline { - display: block; - width: 100vw; + display: flex; height: 100vh; border-radius: 0; } diff --git a/app/javascript/styles/mastodon/admin.scss b/app/javascript/styles/mastodon/admin.scss index 375c655f5..177f8145f 100644 --- a/app/javascript/styles/mastodon/admin.scss +++ b/app/javascript/styles/mastodon/admin.scss @@ -1,4 +1,6 @@ $no-columns-breakpoint: 600px; +$sidebar-width: 240px; +$content-width: 840px; .admin-wrapper { display: flex; @@ -6,7 +8,7 @@ $no-columns-breakpoint: 600px; height: 100%; .sidebar-wrapper { - flex: 1; + flex: 1 1 $sidebar-width; height: 100%; background: $ui-base-color; display: flex; @@ -14,7 +16,7 @@ $no-columns-breakpoint: 600px; } .sidebar { - width: 240px; + width: $sidebar-width; height: 100%; padding: 0; overflow-y: auto; @@ -95,12 +97,12 @@ $no-columns-breakpoint: 600px; } .content-wrapper { - flex: 2; + flex: 2 1 $content-width; overflow: auto; } .content { - max-width: 700px; + max-width: $content-width; padding: 20px 15px; padding-top: 60px; padding-left: 25px; diff --git a/app/javascript/styles/mastodon/containers.scss b/app/javascript/styles/mastodon/containers.scss index 8de53ca98..a98fa52c4 100644 --- a/app/javascript/styles/mastodon/containers.scss +++ b/app/javascript/styles/mastodon/containers.scss @@ -295,7 +295,7 @@ color: $primary-text-color; } - @media screen and (max-width: $no-gap-breakpoint) { + @media screen and (max-width: 550px) { &.optional { display: none; } diff --git a/app/javascript/styles/mastodon/forms.scss b/app/javascript/styles/mastodon/forms.scss index 6132dd1ae..bab982706 100644 --- a/app/javascript/styles/mastodon/forms.scss +++ b/app/javascript/styles/mastodon/forms.scss @@ -419,7 +419,7 @@ code { background: darken($ui-base-color, 10%) url("data:image/svg+xml;utf8,") no-repeat right 8px center / auto 16px; border: 1px solid darken($ui-base-color, 14%); border-radius: 4px; - padding: 10px; + padding-left: 10px; padding-right: 30px; height: 41px; } diff --git a/app/javascript/styles/mastodon/widgets.scss b/app/javascript/styles/mastodon/widgets.scss index 87e633c70..c97337e4e 100644 --- a/app/javascript/styles/mastodon/widgets.scss +++ b/app/javascript/styles/mastodon/widgets.scss @@ -425,3 +425,93 @@ border-radius: 0; } } + +$maximum-width: 1235px; +$fluid-breakpoint: $maximum-width + 20px; + +.statuses-grid { + min-height: 600px; + + @media screen and (max-width: 640px) { + width: 100% !important; // Masonry layout is unnecessary at this width + } + + &__item { + width: (960px - 20px) / 3; + + @media screen and (max-width: $fluid-breakpoint) { + width: (940px - 20px) / 3; + } + + @media screen and (max-width: 640px) { + width: 100%; + } + + @media screen and (max-width: $no-gap-breakpoint) { + width: 100vw; + } + } + + .detailed-status { + border-radius: 4px; + + @media screen and (max-width: $no-gap-breakpoint) { + border-top: 1px solid lighten($ui-base-color, 16%); + } + + &.compact { + .detailed-status__meta { + margin-top: 15px; + } + + .status__content { + font-size: 15px; + line-height: 20px; + + .emojione { + width: 20px; + height: 20px; + margin: -3px 0 0; + } + + .status__content__spoiler-link { + line-height: 20px; + margin: 0; + } + } + + .media-gallery, + .status-card, + .video-player { + margin-top: 15px; + } + } + } +} + +.notice-widget { + margin-bottom: 10px; + color: $darker-text-color; + + p { + margin-bottom: 10px; + + &:last-child { + margin-bottom: 0; + } + } + + a { + font-size: 14px; + line-height: 20px; + text-decoration: none; + font-weight: 500; + color: $ui-highlight-color; + + &:hover, + &:focus, + &:active { + text-decoration: underline; + } + } +} diff --git a/app/lib/activitypub/activity/announce.rb b/app/lib/activitypub/activity/announce.rb index 1147a4481..34d1b7cbd 100644 --- a/app/lib/activitypub/activity/announce.rb +++ b/app/lib/activitypub/activity/announce.rb @@ -17,7 +17,7 @@ class ActivityPub::Activity::Announce < ActivityPub::Activity uri: @json['id'], created_at: @json['published'], override_timestamps: @options[:override_timestamps], - visibility: original_status.visibility + visibility: visibility_from_audience ) distribute(status) @@ -26,6 +26,18 @@ class ActivityPub::Activity::Announce < ActivityPub::Activity private + def visibility_from_audience + if equals_or_includes?(@json['to'], ActivityPub::TagManager::COLLECTIONS[:public]) + :public + elsif equals_or_includes?(@json['cc'], ActivityPub::TagManager::COLLECTIONS[:public]) + :unlisted + elsif equals_or_includes?(@json['to'], @account.followers_url) + :private + else + :direct + end + end + def announceable?(status) status.account_id == @account.id || status.public_visibility? || status.unlisted_visibility? end diff --git a/app/lib/activitypub/activity/create.rb b/app/lib/activitypub/activity/create.rb index 2b238bc88..b49657d4b 100644 --- a/app/lib/activitypub/activity/create.rb +++ b/app/lib/activitypub/activity/create.rb @@ -5,10 +5,13 @@ class ActivityPub::Activity::Create < ActivityPub::Activity CONVERTED_TYPES = %w(Image Video Article Page).freeze def perform - return if delete_arrived_first?(object_uri) || unsupported_object_type? || invalid_origin?(@object['id']) + return if unsupported_object_type? || invalid_origin?(@object['id']) + return if Tombstone.exists?(uri: @object['id']) RedisLock.acquire(lock_options) do |lock| if lock.acquired? + return if delete_arrived_first?(object_uri) + @status = find_existing_status if @status.nil? @@ -59,7 +62,7 @@ class ActivityPub::Activity::Create < ActivityPub::Activity account: @account, text: text_from_content || '', language: detected_language, - spoiler_text: text_from_summary || '', + spoiler_text: converted_object_type? ? '' : (text_from_summary || ''), created_at: @object['published'], override_timestamps: @options[:override_timestamps], reply: @object['inReplyTo'].present?, @@ -254,7 +257,7 @@ class ActivityPub::Activity::Create < ActivityPub::Activity end def text_from_content - return Formatter.instance.linkify([text_from_name, object_url || @object['id']].join(' ')) if converted_object_type? + return Formatter.instance.linkify([[text_from_name, text_from_summary.presence].compact.join("\n\n"), object_url || @object['id']].join(' ')) if converted_object_type? if @object['content'].present? @object['content'] diff --git a/app/lib/activitypub/activity/delete.rb b/app/lib/activitypub/activity/delete.rb index 8270fed1b..dc76dd3e2 100644 --- a/app/lib/activitypub/activity/delete.rb +++ b/app/lib/activitypub/activity/delete.rb @@ -21,11 +21,14 @@ class ActivityPub::Activity::Delete < ActivityPub::Activity def delete_note return if object_uri.nil? + unless invalid_origin?(object_uri) + RedisLock.acquire(lock_options) { |_lock| delete_later!(object_uri) } + Tombstone.find_or_create_by(uri: object_uri, account: @account) + end + @status = Status.find_by(uri: object_uri, account: @account) @status ||= Status.find_by(uri: @object['atomUri'], account: @account) if @object.is_a?(Hash) && @object['atomUri'].present? - delete_later!(object_uri) - return if @status.nil? if @status.public_visibility? || @status.unlisted_visibility? @@ -68,4 +71,17 @@ class ActivityPub::Activity::Delete < ActivityPub::Activity def payload @payload ||= Oj.dump(@json) end + + def lock_options + { redis: Redis.current, key: "create:#{object_uri}" } + end + + def invalid_origin?(url) + return true if unsupported_uri_scheme?(url) + + needle = Addressable::URI.parse(url).host + haystack = Addressable::URI.parse(@account.uri).host + + !haystack.casecmp(needle).zero? + end end diff --git a/app/models/status.rb b/app/models/status.rb index 9c036b27d..12cf993a4 100644 --- a/app/models/status.rb +++ b/app/models/status.rb @@ -490,7 +490,7 @@ class Status < ApplicationRecord return if direct_visibility? account&.increment_count!(:statuses_count) - reblog&.increment_count!(:reblogs_count) if reblog? + reblog&.increment_count!(:reblogs_count) if reblog? && (public_visibility? || unlisted_visibility?) thread&.increment_count!(:replies_count) if in_reply_to_id.present? && (public_visibility? || unlisted_visibility?) end @@ -498,7 +498,7 @@ class Status < ApplicationRecord return if direct_visibility? || marked_for_mass_destruction? account&.decrement_count!(:statuses_count) - reblog&.decrement_count!(:reblogs_count) if reblog? + reblog&.decrement_count!(:reblogs_count) if reblog? && (public_visibility? || unlisted_visibility?) thread&.decrement_count!(:replies_count) if in_reply_to_id.present? && (public_visibility? || unlisted_visibility?) end diff --git a/app/models/tombstone.rb b/app/models/tombstone.rb new file mode 100644 index 000000000..997bb65fd --- /dev/null +++ b/app/models/tombstone.rb @@ -0,0 +1,16 @@ +# frozen_string_literal: true + +# == Schema Information +# +# Table name: tombstones +# +# id :bigint(8) not null, primary key +# account_id :bigint(8) +# uri :string not null +# created_at :datetime not null +# updated_at :datetime not null +# + +class Tombstone < ApplicationRecord + belongs_to :account +end diff --git a/app/models/user.rb b/app/models/user.rb index 92eb4d6f0..7e11e7ed6 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -362,7 +362,8 @@ class User < ApplicationRecord end def regenerate_feed! - Redis.current.setnx("account:#{account_id}:regeneration", true) && Redis.current.expire("account:#{account_id}:regeneration", 1.day.seconds) + return unless Redis.current.setnx("account:#{account_id}:regeneration", true) + Redis.current.expire("account:#{account_id}:regeneration", 1.day.seconds) RegenerationWorker.perform_async(account_id) end diff --git a/app/services/activitypub/process_account_service.rb b/app/services/activitypub/process_account_service.rb index d6c791b44..487456f3a 100644 --- a/app/services/activitypub/process_account_service.rb +++ b/app/services/activitypub/process_account_service.rb @@ -33,6 +33,8 @@ class ActivityPub::ProcessAccountService < BaseService after_protocol_change! if protocol_changed? after_key_change! if key_changed? && !@options[:signed_with_known_key] + clear_tombstones! if key_changed? + unless @options[:only_key] check_featured_collection! if @account.featured_collection_url.present? check_links! unless @account.fields.empty? @@ -209,6 +211,10 @@ class ActivityPub::ProcessAccountService < BaseService !@old_public_key.nil? && @old_public_key != @account.public_key end + def clear_tombstones! + Tombstone.delete_all(account_id: @account.id) + end + def protocol_changed? !@old_protocol.nil? && @old_protocol != @account.protocol end diff --git a/app/services/fetch_oembed_service.rb b/app/services/fetch_oembed_service.rb index 9ddf9b13b..10176cfb9 100644 --- a/app/services/fetch_oembed_service.rb +++ b/app/services/fetch_oembed_service.rb @@ -43,7 +43,7 @@ class FetchOEmbedService res.code != 200 ? nil : res.body_with_limit end - validate(parse_for_format(body)) unless body.nil? + validate(parse_for_format(body)) if body.present? rescue Oj::ParseError, Ox::ParseError nil end diff --git a/app/services/post_status_service.rb b/app/services/post_status_service.rb index 26b611bee..fb12e3e17 100644 --- a/app/services/post_status_service.rb +++ b/app/services/post_status_service.rb @@ -49,6 +49,8 @@ class PostStatusService < BaseService @visibility = :unlisted if @visibility == :public && @account.silenced @scheduled_at = @options[:scheduled_at]&.to_datetime @scheduled_at = nil if scheduled_in_the_past? + rescue ArgumentError + raise ActiveRecord::RecordInvalid end def process_status! diff --git a/app/services/precompute_feed_service.rb b/app/services/precompute_feed_service.rb index 4f771ff72..076dedaca 100644 --- a/app/services/precompute_feed_service.rb +++ b/app/services/precompute_feed_service.rb @@ -3,6 +3,7 @@ class PrecomputeFeedService < BaseService def call(account) FeedManager.instance.populate_feed(account) + ensure Redis.current.del("account:#{account.id}:regeneration") end end diff --git a/app/services/unfollow_service.rb b/app/services/unfollow_service.rb index 03e45912d..95da2a667 100644 --- a/app/services/unfollow_service.rb +++ b/app/services/unfollow_service.rb @@ -20,6 +20,7 @@ class UnfollowService < BaseService follow.destroy! create_notification(follow) unless @target_account.local? + create_reject_notification(follow) if @target_account.local? && !@source_account.local? UnmergeWorker.perform_async(@target_account.id, @source_account.id) follow end @@ -42,6 +43,12 @@ class UnfollowService < BaseService end end + def create_reject_notification(follow) + # Rejecting an already-existing follow request + return unless follow.account.activitypub? + ActivityPub::DeliveryWorker.perform_async(build_reject_json(follow), follow.target_account_id, follow.account.inbox_url) + end + def build_json(follow) ActiveModelSerializers::SerializableResource.new( follow, @@ -50,6 +57,14 @@ class UnfollowService < BaseService ).to_json end + def build_reject_json(follow) + ActiveModelSerializers::SerializableResource.new( + follow, + serializer: ActivityPub::RejectFollowSerializer, + adapter: ActivityPub::Adapter + ).to_json + end + def build_xml(follow) OStatus::AtomSerializer.render(OStatus::AtomSerializer.new.unfollow_salmon(follow)) end diff --git a/app/views/directories/index.html.haml b/app/views/directories/index.html.haml index 88706def7..a8aa68cc4 100644 --- a/app/views/directories/index.html.haml +++ b/app/views/directories/index.html.haml @@ -41,8 +41,22 @@ = paginate @accounts .column-1 - - if @tags.empty? - .nothing-here.nothing-here--flexible + - if user_signed_in? + .box-widget.notice-widget + - if current_account.discoverable? + - if current_account.followers_count < Account::MIN_FOLLOWERS_DISCOVERY + %p= t('directories.enabled_but_waiting', min_followers: Account::MIN_FOLLOWERS_DISCOVERY) + - else + %p= t('directories.enabled') + - else + %p= t('directories.how_to_enable') + + = link_to settings_profile_path do + = t('settings.edit_profile') + = fa_icon 'chevron-right fw' + + - if @tags.empty? && !user_signed_in? + .nothing-here - else - @tags.each do |tag| .directory__tag{ class: tag.id == @tag&.id ? 'active' : nil } diff --git a/app/views/stream_entries/_attachment_list.html.haml b/app/views/stream_entries/_attachment_list.html.haml new file mode 100644 index 000000000..d9706f47b --- /dev/null +++ b/app/views/stream_entries/_attachment_list.html.haml @@ -0,0 +1,8 @@ +.attachment-list + .attachment-list__icon + = fa_icon 'link' + %ul.attachment-list__list + - attachments.each do |media| + %li + - url = media.remote_url.presence || media.file.url + = link_to File.basename(url), url, title: media.description diff --git a/app/views/stream_entries/_detailed_status.html.haml b/app/views/stream_entries/_detailed_status.html.haml index f4a32b3cf..a485c9210 100644 --- a/app/views/stream_entries/_detailed_status.html.haml +++ b/app/views/stream_entries/_detailed_status.html.haml @@ -25,9 +25,11 @@ - if !status.media_attachments.empty? - if status.media_attachments.first.video? - video = status.media_attachments.first - = react_component :video, src: video.file.url(:original), preview: video.file.url(:small), sensitive: !current_account&.user&.show_all_media? && status.sensitive? || current_account&.user&.hide_all_media?, width: 670, height: 380, detailed: true, inline: true, alt: video.description + = react_component :video, src: video.file.url(:original), preview: video.file.url(:small), sensitive: !current_account&.user&.show_all_media? && status.sensitive? || current_account&.user&.hide_all_media?, width: 670, height: 380, detailed: true, inline: true, alt: video.description do + = render partial: 'stream_entries/attachment_list', locals: { attachments: status.media_attachments } - else - = react_component :media_gallery, height: 380, sensitive: !current_account&.user&.show_all_media? && status.sensitive? || current_account&.user&.hide_all_media?, standalone: true, 'autoPlayGif': current_account&.user&.setting_auto_play_gif || autoplay, 'reduceMotion': current_account&.user&.setting_reduce_motion, media: status.media_attachments.map { |a| ActiveModelSerializers::SerializableResource.new(a, serializer: REST::MediaAttachmentSerializer).as_json } + = react_component :media_gallery, height: 380, sensitive: !current_account&.user&.show_all_media? && status.sensitive? || current_account&.user&.hide_all_media?, standalone: true, 'autoPlayGif': current_account&.user&.setting_auto_play_gif || autoplay, 'reduceMotion': current_account&.user&.setting_reduce_motion, media: status.media_attachments.map { |a| ActiveModelSerializers::SerializableResource.new(a, serializer: REST::MediaAttachmentSerializer).as_json } do + = render partial: 'stream_entries/attachment_list', locals: { attachments: status.media_attachments } - elsif status.preview_card = react_component :card, 'maxDescription': 160, card: ActiveModelSerializers::SerializableResource.new(status.preview_card, serializer: REST::PreviewCardSerializer).as_json @@ -44,7 +46,10 @@ = link_to status.application.name, status.application.website, class: 'detailed-status__application', target: '_blank', rel: 'noopener' · = link_to remote_interaction_path(status, type: :reply), class: 'modal-button detailed-status__link' do - = fa_icon('reply') + - if status.in_reply_to_id.nil? + = fa_icon('reply') + - else + = fa_icon('reply-all') %span.detailed-status__reblogs>= number_to_human status.replies_count, strip_insignificant_zeros: true = " " · diff --git a/app/views/stream_entries/_simple_status.html.haml b/app/views/stream_entries/_simple_status.html.haml index 6947b3d24..26c11db53 100644 --- a/app/views/stream_entries/_simple_status.html.haml +++ b/app/views/stream_entries/_simple_status.html.haml @@ -29,16 +29,21 @@ - if !status.media_attachments.empty? - if status.media_attachments.first.video? - video = status.media_attachments.first - = react_component :video, src: video.file.url(:original), preview: video.file.url(:small), sensitive: !current_account&.user&.show_all_media? && status.sensitive? || current_account&.user&.hide_all_media?, width: 610, height: 343, inline: true, alt: video.description + = react_component :video, src: video.file.url(:original), preview: video.file.url(:small), sensitive: !current_account&.user&.show_all_media? && status.sensitive? || current_account&.user&.hide_all_media?, width: 610, height: 343, inline: true, alt: video.description do + = render partial: 'stream_entries/attachment_list', locals: { attachments: status.media_attachments } - else - = react_component :media_gallery, height: 343, sensitive: !current_account&.user&.show_all_media? && status.sensitive? || current_account&.user&.hide_all_media?, 'autoPlayGif': current_account&.user&.setting_auto_play_gif || autoplay, media: status.media_attachments.map { |a| ActiveModelSerializers::SerializableResource.new(a, serializer: REST::MediaAttachmentSerializer).as_json } + = react_component :media_gallery, height: 343, sensitive: !current_account&.user&.show_all_media? && status.sensitive? || current_account&.user&.hide_all_media?, 'autoPlayGif': current_account&.user&.setting_auto_play_gif || autoplay, media: status.media_attachments.map { |a| ActiveModelSerializers::SerializableResource.new(a, serializer: REST::MediaAttachmentSerializer).as_json } do + = render partial: 'stream_entries/attachment_list', locals: { attachments: status.media_attachments } - elsif status.preview_card = react_component :card, 'maxDescription': 160, card: ActiveModelSerializers::SerializableResource.new(status.preview_card, serializer: REST::PreviewCardSerializer).as_json .status__action-bar .status__action-bar__counter = link_to remote_interaction_path(status, type: :reply), class: 'status__action-bar-button icon-button modal-button', style: 'font-size: 18px; width: 23.1429px; height: 23.1429px; line-height: 23.15px;' do - = fa_icon 'reply fw' + - if status.in_reply_to_id.nil? + = fa_icon 'reply fw' + - else + = fa_icon 'reply-all fw' .status__action-bar__counter__label= obscured_counter status.replies_count = link_to remote_interaction_path(status, type: :reblog), class: 'status__action-bar-button icon-button modal-button', style: 'font-size: 18px; width: 23.1429px; height: 23.1429px; line-height: 23.15px;' do - if status.public_visibility? || status.unlisted_visibility? diff --git a/app/views/tags/_features.html.haml b/app/views/tags/_features.html.haml deleted file mode 100644 index 8fbc6b760..000000000 --- a/app/views/tags/_features.html.haml +++ /dev/null @@ -1,25 +0,0 @@ -.features-list - .features-list__row - .text - %h6= t 'about.features.real_conversation_title' - = t 'about.features.real_conversation_body' - .visual - = fa_icon 'fw comments' - .features-list__row - .text - %h6= t 'about.features.not_a_product_title' - = t 'about.features.not_a_product_body' - .visual - = fa_icon 'fw users' - .features-list__row - .text - %h6= t 'about.features.within_reach_title' - = t 'about.features.within_reach_body' - .visual - = fa_icon 'fw mobile' - .features-list__row - .text - %h6= t 'about.features.humane_approach_title' - = t 'about.features.humane_approach_body' - .visual - = fa_icon 'fw leaf' diff --git a/app/views/tags/show.html.haml b/app/views/tags/show.html.haml index f6e452f18..18de48eea 100644 --- a/app/views/tags/show.html.haml +++ b/app/views/tags/show.html.haml @@ -8,33 +8,9 @@ = javascript_pack_tag 'about', integrity: true, crossorigin: 'anonymous' = render 'og' -.landing-page.tag-page.alternative - .features - .container - .grid - .column-1 - #mastodon-timeline{ data: { props: Oj.dump(default_props.merge(hashtag: @tag.name)) } } - - .column-2 - .about-mastodon - .about-hashtag.landing-page__information - .brand - = link_to root_url do - = image_tag asset_pack_path('logo_full.svg'), alt: 'Mastodon' - - %p= t 'about.about_hashtag_html', hashtag: @tag.name - - .cta - - if user_signed_in? - = link_to t('settings.back'), root_path, class: 'button button-secondary' - - else - = link_to t('auth.login'), new_user_session_path, class: 'button button-secondary' - = link_to t('about.learn_more'), about_path, class: 'button button-alternative' - - .landing-page__features.landing-page__information - %h3= t 'about.what_is_mastodon' - %p= t 'about.about_mastodon_html' - - = render 'features' +.page-header + %h1= "##{@tag.name}" + %p= t('about.about_hashtag_html', hashtag: @tag.name) +#mastodon-timeline{ data: { props: Oj.dump(default_props.merge(hashtag: @tag.name)) }} #modal-container diff --git a/app/workers/publish_scheduled_status_worker.rb b/app/workers/publish_scheduled_status_worker.rb index 641fcc61c..850610c4e 100644 --- a/app/workers/publish_scheduled_status_worker.rb +++ b/app/workers/publish_scheduled_status_worker.rb @@ -3,6 +3,8 @@ class PublishScheduledStatusWorker include Sidekiq::Worker + sidekiq_options unique: :until_executed + def perform(scheduled_status_id) scheduled_status = ScheduledStatus.find(scheduled_status_id) scheduled_status.destroy! diff --git a/config/deploy.rb b/config/deploy.rb index e0cd60f54..f0db50788 100644 --- a/config/deploy.rb +++ b/config/deploy.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -lock '3.10.2' +lock '3.11.0' set :repo_url, ENV.fetch('REPO', 'https://github.com/tootsuite/mastodon.git') set :branch, ENV.fetch('BRANCH', 'master') diff --git a/config/initializers/devise.rb b/config/initializers/devise.rb index 3e4c9a79d..cd9bacf68 100644 --- a/config/initializers/devise.rb +++ b/config/initializers/devise.rb @@ -10,7 +10,6 @@ Warden::Manager.after_set_user except: :fetch do |user, warden| expires: 1.year.from_now, httponly: true, secure: (Rails.env.production? || ENV['LOCAL_HTTPS'] == 'true'), - same_site: :lax, } end @@ -21,7 +20,6 @@ Warden::Manager.after_fetch do |user, warden| expires: 1.year.from_now, httponly: true, secure: (Rails.env.production? || ENV['LOCAL_HTTPS'] == 'true'), - same_site: :lax, } else warden.logout diff --git a/config/initializers/paperclip.rb b/config/initializers/paperclip.rb index 4bbf8b827..ce4185e02 100644 --- a/config/initializers/paperclip.rb +++ b/config/initializers/paperclip.rb @@ -36,6 +36,9 @@ if ENV['S3_ENABLED'] == 'true' }, s3_options: { signature_version: ENV.fetch('S3_SIGNATURE_VERSION') { 'v4' }, + http_open_timeout: 5, + http_read_timeout: 5, + http_idle_timeout: 5, } ) diff --git a/config/initializers/session_store.rb b/config/initializers/session_store.rb index c0757b6b5..3dc0edd6f 100644 --- a/config/initializers/session_store.rb +++ b/config/initializers/session_store.rb @@ -1,3 +1,3 @@ # Be sure to restart your server when you modify this file. -Rails.application.config.session_store :cookie_store, key: '_mastodon_session', secure: (Rails.env.production? || ENV['LOCAL_HTTPS'] == 'true'), same_site: :lax +Rails.application.config.session_store :cookie_store, key: '_mastodon_session', secure: (Rails.env.production? || ENV['LOCAL_HTTPS'] == 'true') diff --git a/config/locales/ar.yml b/config/locales/ar.yml index 07bcfbf12..08f5578ba 100644 --- a/config/locales/ar.yml +++ b/config/locales/ar.yml @@ -88,6 +88,7 @@ ar: admin: account_actions: action: تنفيذ الاجراء + title: اتخاذ إجراء إشراف على %{acct} account_moderation_notes: create: إترك ملاحظة created_msg: تم إنشاء ملاحظة الإشراف بنجاح ! @@ -107,6 +108,7 @@ ar: confirm: تأكيد confirmed: مؤكَّد confirming: التأكد + deleted: تمت إزالته demote: إنزال الرُتبة الوظيفية disable: تعطيل disable_two_factor_authentication: تعطيل المصادقة بخطوتين @@ -124,7 +126,9 @@ ar: follows: يتابع header: الرأسية inbox_url: رابط صندوق الوارد + invited_by: تمت دعوته مِن طرف ip: عنوان الإيبي + joined: انضم location: all: الكل local: المحلي @@ -151,7 +155,7 @@ ar: protocol: البروتوكول public: عمومي push_subscription_expires: انتهاء الاشتراك ”PuSH“ - redownload: تحديث الصورة الرمزية + redownload: تحديث الصفحة الشخصية remove_avatar: حذف الصورة الرمزية remove_header: حذف الرأسية resend_confirmation: @@ -172,18 +176,19 @@ ar: shared_inbox_url: رابط الصندوق المُشترَك للبريد الوارد show: created_reports: البلاغات التي أنشأها هذا الحساب - targeted_reports: الشكاوي التي أُنشِأت ضد هذا الحساب + targeted_reports: الشكاوي التي أُنشِأت مِن طرف الآخَرين silence: كتم silenced: تم كتمه statuses: المنشورات subscribe: اشترك suspended: تم تعليقه title: الحسابات - unconfirmed_email: البريد الإلكتروني غير المؤكد + unconfirmed_email: البريد الإلكتروني غير مؤكد undo_silenced: رفع الصمت undo_suspension: إلغاء تعليق الحساب unsubscribe: إلغاء الاشتراك username: إسم المستخدم + warn: تحذير web: الويب action_logs: actions: @@ -266,7 +271,7 @@ ar: week_users_active: نشط هذا الأسبوع week_users_new: مستخدِمين هذا الأسبوع domain_blocks: - add_new: إضافة نطاق جديد + add_new: إضافة حجب جديد لنطاق created_msg: إنّ حجب النطاق حيز التشغيل destroyed_msg: تم إلغاء الحجب المفروض على النطاق domain: النطاق @@ -282,6 +287,9 @@ ar: reject_media: رفض ملفات الوسائط reject_media_hint: يزيل ملفات الوسائط المخزنة محليًا ويرفض تنزيل أي ملفات في المستقبل. غير ذي صلة للتعليق reject_reports: رفض التقارير + severity: + silence: تم كتمه + suspend: تم تعليقه show: affected_accounts: few: "%{count} حسابات معنية في قاعدة البيانات" @@ -295,7 +303,7 @@ ar: suspend: إلغاء التعليق المفروض على كافة حسابات هذا النطاق title: رفع حظر النطاق عن %{domain} undo: إلغاء - undo: إلغاء + undo: إلغاء حجب النطاق email_domain_blocks: add_new: إضافة created_msg: لقد دخل حظر نطاق البريد الإلكتروني حيّز الخدمة @@ -308,8 +316,24 @@ ar: title: القائمة السوداء للبريد الإلكتروني followers: back_to_account: العودة إلى الحساب + title: "%{acct} مُتابِعون" instances: - title: مثيلات الخوادم المعروفة + known_accounts: + few: "%{count} حسابات معروفة" + many: "%{count} حسابات معروفة" + one: حساب معروف %{count} + other: "%{count} حسابات معروفة" + two: "%{count} حسابات معروفة" + zero: "%{count} حسابات معروفة" + moderation: + all: كافتها + title: الإشراف + title: الفديرالية + total_blocked_by_us: المحجوبة مِن طرفنا + total_followed_by_them: يُتابِعونها + total_followed_by_us: التي نُتابِعها + total_reported: تقارير عنهم + total_storage: الوسائط المُرفَقة invites: deactivate_all: تعطيلها كافة filter: @@ -541,6 +565,7 @@ ar: warning_title: توافر المحتوى المنشور و المبعثَر directories: directory: سِجلّ الحسابات + enabled: إنّ حسابك الآن ضمن فهرس المستخدِمين. explanation: استكشف مستخدِمين آخرين حسب المواضيع التي تهمهم explore_mastodon: استكشف %{title} people: @@ -573,6 +598,7 @@ ar: blocks: قمت بحظر csv: CSV follows: أنت تتبع + lists: القوائم mutes: قُمتَ بكتم storage: ذاكرة التخزين filters: @@ -669,11 +695,17 @@ ar: action: معاينة كافة الإشعارات body: هذا هو مُلَخَّص الرسائل التي فاتتك وذلك منذ آخر زيارة لك في %{since} mention: "%{name} أشار إليك في :" - new_followers_summary: رائع، لقد قام بمتابعتك %{count} مُتابِعون جُدد أثناء فترة غيابك عن ماستدون ! + new_followers_summary: + few: رائع، لقد قام بمتابَعتك %{count} مُتابِعون جُدد أثناء فترة غيابك عن ماستدون! + many: رائع، لقد قام بمتابَعتك %{count} مُتابِعون جُدد أثناء فترة غيابك عن ماستدون! + one: و لقد تحصّلتَ كذلك على مُتابِع آخَر بينما كنتَ غائبًا! هذا شيء رائع! + other: رائع، لقد قام بمتابَعتك %{count} مُتابِعون جُدد أثناء فترة غيابك عن ماستدون! + two: رائع، لقد قام بمتابَعتك %{count} مُتابِعون جُدد أثناء فترة غيابك عن ماستدون! + zero: رائع، لقد قام بمتابَعتك %{count} مُتابِعون جُدد أثناء فترة غيابك عن ماستدون! subject: few: "%{count} إشعارات جديدة منذ آخر زيارة لك إلى \U0001F418" many: "%{count} إشعارات جديدة منذ آخر زيارة لك إلى \U0001F418" - one: "إشعار واحد منذ آخر زيارة لك لـ \U0001F418" + one: "إشعار واحد 1 منذ آخر زيارة لك لـ \U0001F418" other: "%{count} إشعارات جديدة منذ آخر زيارة لك إلى \U0001F418" two: "إشعارات جديدة منذ آخر زيارة لك إلى \U0001F418" zero: "إشعارات جديدة منذ آخر زيارة لك إلى \U0001F418" diff --git a/config/locales/ca.yml b/config/locales/ca.yml index b9a6a7b64..f5245bd98 100644 --- a/config/locales/ca.yml +++ b/config/locales/ca.yml @@ -86,12 +86,13 @@ ca: changed_msg: El correu electrònic del compte s'ha canviat correctament! current_email: Correu electrònic actual label: Canviar l'adreça de correu - new_email: Nou correu + new_email: Nova adreça de correu submit: Canviar adreça de correu title: Canviar adreça de correu de %{username} confirm: Confirma confirmed: Confirmat confirming: Confirmant + deleted: Esborrats demote: Degrada disable: Inhabilita disable_two_factor_authentication: Desactiva 2FA @@ -105,12 +106,13 @@ ca: enabled: Habilitat feed_url: URL del canal followers: Seguidors - followers_local: "(%{local} locals)" followers_url: URL dels seguidors follows: Segueix header: Capçalera inbox_url: URL de la safata d'entrada + invited_by: Convidat per ip: IP + joined: Unit location: all: Tot local: Local @@ -137,7 +139,7 @@ ca: protocol: Protocol public: Públic push_subscription_expires: La subscripció PuSH expira - redownload: Actualitza l'avatar + redownload: Actualitza el perfil remove_avatar: Eliminar avatar remove_header: Treu la capçalera resend_confirmation: @@ -157,8 +159,8 @@ ca: search: Cerca shared_inbox_url: URL de la safata d'entrada compartida show: - created_reports: Informes creats per aquest compte - targeted_reports: Informes realitzats sobre aquest compte + created_reports: Informes creats + targeted_reports: Informes realitzats per altres silence: Silenci silenced: Silenciat statuses: Estats @@ -170,6 +172,7 @@ ca: undo_suspension: Desfés la suspensió unsubscribe: Cancel·la la subscripció username: Nom d'usuari + warn: Avís web: Web action_logs: actions: @@ -253,7 +256,7 @@ ca: week_users_active: usuaris actius aquesta setmana week_users_new: nous usuaris aquest setmana domain_blocks: - add_new: Afegeix + add_new: Afegir nou bloqueig de domini created_msg: El bloqueig de domini ara s'està processant destroyed_msg: El bloqueig de domini s'ha desfet domain: Domini @@ -270,6 +273,11 @@ ca: reject_media_hint: Elimina els fitxers multimèdia emmagatzemats localment i impedeix baixar-ne cap en el futur. Irrellevant en les suspensions reject_reports: Rebutja informes reject_reports_hint: Ignora tots els informes procedents d'aquest domini. No és rellevant per a les suspensions + rejecting_media: rebutjant els fitxers multimèdia + rejecting_reports: rebutjant els informes + severity: + silence: silenciat + suspend: suspès show: affected_accounts: one: Un compte afectat en la base de dades @@ -279,7 +287,7 @@ ca: suspend: Desfés la suspensió de tots els comptes d'aquest domini title: Desfés el bloqueig de domini de %{domain} undo: Desfés - undo: Desfés + undo: Desfés el bloqueig del domini email_domain_blocks: add_new: Afegeix created_msg: S'ha creat el bloc de domini de correu electrònic @@ -294,7 +302,20 @@ ca: back_to_account: Tornar al compte title: Seguidors de %{acct} instances: - title: Instàncies conegudes + delivery_available: El lliurament està disponible + known_accounts: + one: "%{count} compte conegut" + other: "%{count} comptes coneguts" + moderation: + all: Totes + limited: Limitades + title: Moderació + title: Federació + total_blocked_by_us: Bloquejades per nosaltres + total_followed_by_them: Seguides per ells + total_followed_by_us: Seguides per nosaltres + total_reported: Informes sobre elles + total_storage: Adjunts multimèdia invites: deactivate_all: Desactiva-ho tot filter: @@ -532,8 +553,11 @@ ca: warning_title: Disponibilitat de contingut disseminat directories: directory: Directori de perfils + enabled: Actualment estàs inclòs al directori. + enabled_but_waiting: Has optat per aparèixer al directori però encara no tens el nombre mínim de seguidors (%{min_followers}) per ser-hi. explanation: Descobreix usuaris segons els seus interessos explore_mastodon: Explora %{title} + how_to_enable: Actualment no tens activat ser al directori. Pots optar-hi a continuació. Utilitza etiquetes en el teu text bio per incloure't sota etiquetes especifiques! people: one: "%{count} persona" other: "%{count} gent" @@ -559,7 +583,9 @@ ca: size: Tamany blocks: Persones que has blocat csv: CSV + domain_blocks: Bloquejos de dominis follows: Persones que segueixes + lists: Llistes mutes: Persones silenciades storage: Emmagatzematge filters: @@ -708,10 +734,25 @@ ca: no_account_html: No tens cap compte? Pots registrar-te aquí proceed: Comença a seguir prompt: 'Seguiràs a:' + reason_html: "Per què és necessari aquest pas? %{instance} pot ser que no sigui el servidor on estàs registrat per tant primer hem de redirigir-te al teu servidor." + remote_interaction: + favourite: + proceed: Procedir a afavorir + prompt: 'Vols marcar com a favorit aquest toot:' + reblog: + proceed: Procedir a impulsar + prompt: 'Vols impulsar aquest toot:' + reply: + proceed: Procedir a respondre + prompt: 'Vols respondre a aquest toot:' remote_unfollow: error: Error title: Títol unfollowed: Sense seguir + scheduled_statuses: + over_daily_limit: Has superat el límit de %{limit} toots programats per a aquell dia + over_total_limit: Has superat el limit de %{limit} toots programats + too_soon: La data programada ha de ser futura sessions: activity: Última activitat browser: Navegador diff --git a/config/locales/co.yml b/config/locales/co.yml index c2de9e4c6..a7264e754 100644 --- a/config/locales/co.yml +++ b/config/locales/co.yml @@ -84,14 +84,15 @@ co: by_domain: Duminiu change_email: changed_msg: Email di u contu cambiatu! - current_email: Email attuale - label: Mudificà l’Email - new_email: Novu Email - submit: Cambià Email - title: Mudificà l’Email di %{username} + current_email: E-mail attuale + label: Mudificà l’e-mail + new_email: Novu e-mail + submit: Cambià l'e-mail + title: Mudificà l’e-mail di %{username} confirm: Cunfirmà confirmed: Cunfirmata confirming: Cunfirmazione + deleted: Sguassatu demote: Ritrugradà disable: Disattivà disable_two_factor_authentication: Disattivà l’identificazione à 2 fattori @@ -100,17 +101,18 @@ co: domain: Duminiu edit: Mudificà email: E-mail - email_status: Statu di l’e-mail + email_status: Statutu di l’e-mail enable: Attivà enabled: Attivatu feed_url: URL di u flussu followers: Abbunati - followers_local: "(%{local} lucali)" followers_url: URL di l’abbunati follows: Abbunamenti header: Intistatura inbox_url: URL di l’inbox + invited_by: Invitatu da ip: IP + joined: Ghjuntu location: all: Tutti local: Lucale @@ -137,7 +139,7 @@ co: protocol: Prutucollu public: Pubblicu push_subscription_expires: Spirata di l’abbunamentu PuSH - redownload: Mette à ghjornu i ritratti + redownload: Mette à ghjornu u prufile remove_avatar: Toglie l’avatar remove_header: Toglie l'intistatura resend_confirmation: @@ -157,8 +159,8 @@ co: search: Cercà shared_inbox_url: URL di l’inbox spartuta show: - created_reports: Signalamenti creati da stu contu - targeted_reports: Signalamenti creati contr’à stu contu + created_reports: Signalamenti fatti + targeted_reports: Signalatu da l'altri silence: Silenzà silenced: Silenzatu statuses: Statuti @@ -170,6 +172,7 @@ co: undo_suspension: Ùn suspende più unsubscribe: Disabbunassi username: Cugnome + warn: Averte web: Web action_logs: actions: @@ -253,7 +256,7 @@ co: week_users_active: attivi sta settimana week_users_new: utilizatori sta settimana domain_blocks: - add_new: Aghjustà + add_new: Aghjustà novu blucchime di duminiu created_msg: U blucchime di u duminiu hè attivu destroyed_msg: U blucchime di u duminiu ùn hè più attivu domain: Duminiu @@ -270,6 +273,11 @@ co: reject_media_hint: Sguassa tutti i media caricati è ricusa caricamenti futuri. Inutile per una suspensione reject_reports: Righjittà i rapporti reject_reports_hint: Ignurà tutti i signalamenti chì venenu d'issu duminiu. Senz'oghjettu pè e suspensione + rejecting_media: righjettu di i fugliali media + rejecting_reports: righjettu di i signalamenti + severity: + silence: silenzatu + suspend: suspesu show: affected_accounts: one: Un contu tuccatu indè a database @@ -279,7 +287,7 @@ co: suspend: Ùn suspende più i conti nant’à stu duminiu title: Ùn bluccà più u duminiu %{domain} undo: Annullà - undo: Annullà + undo: Annullà u blucchime di duminiu email_domain_blocks: add_new: Aghjustà created_msg: U blucchime di u duminiu d’e-mail hè attivu @@ -294,7 +302,20 @@ co: back_to_account: Rivene à u Contu title: Abbunati à %{acct} instances: - title: Istanze cunnisciute + delivery_available: Rimessa dispunibule + known_accounts: + one: "%{count} contu cunnisciutu" + other: "%{count} conti cunnisciuti" + moderation: + all: Tuttu + limited: Limitatu + title: Muderazione + title: Federazione + total_blocked_by_us: Bluccati da noi + total_followed_by_them: Siguitati da elli + total_followed_by_us: Siguitati da noi + total_reported: Rapporti nant'à elli + total_storage: Media aghjunti invites: deactivate_all: Disattivà tuttu filter: @@ -559,7 +580,9 @@ co: size: Pesu blocks: Bluccate csv: CSV + domain_blocks: Blucchime di duminiu follows: Seguitate + lists: Liste mutes: Piattate storage: I vostri media filters: @@ -708,10 +731,25 @@ co: no_account_html: Ùn avete micca un contu? Pudete arregistravi quì proceed: Cuntinuà per siguità prompt: 'Avete da siguità:' + reason_html: "Perchè hè necessaria sta tappa? %{instance} ùn hè forse micca u servore induve site arregistratu·a, allora primu duvemu riindirizzavi à u vostru servore." + remote_interaction: + favourite: + proceed: Cuntinuà per favurisce + prompt: 'Vulete aghjustà stu statutu à i vostri favuriti:' + reblog: + proceed: Cuntinuà per sparte + prompt: 'Vulete sparte stu statutu:' + reply: + proceed: Cuntinuà per risponde + prompt: 'Vulete risponde à stu statutu:' remote_unfollow: error: Errore title: Titulu unfollowed: Disabbunatu + scheduled_statuses: + over_daily_limit: Avete trapassatu a limita di %{limit} statuti planificati per stu ghjornu + over_total_limit: Avete trapassatu a limita di %{limit} statuti planificati + too_soon: A data deve esse indè u futuru sessions: activity: Ultima attività browser: Navigatore diff --git a/config/locales/cs.yml b/config/locales/cs.yml index 8f3143fc6..424ec3dab 100644 --- a/config/locales/cs.yml +++ b/config/locales/cs.yml @@ -2,7 +2,7 @@ cs: about: about_hashtag_html: Tohle jsou veřejné tooty označené hashtagem #%{hashtag}. Pokud máte účet kdekoliv na fediverse, můžete s nimi interagovat. - about_mastodon_html: Mastodon je sociální síť založená na otevřených webových protokolech a svobodném, otevřeném softwaru. Je decentrovalizovaná jako e-mail. + about_mastodon_html: Mastodon je sociální síť založená na otevřených webových protokolech a svobodném, otevřeném softwaru. Je decentralizovaná jako e-mail. about_this: O této instanci administered_by: 'Instanci spravuje:' api: API @@ -92,10 +92,11 @@ cs: label: Změnit e-mail new_email: Nový e-mail submit: Změnit e-mail - title: Změnit e-mail pro uživatele %{username} + title: Změnit e-mail uživateli %{username} confirm: Potvrdit confirmed: Potvrzeno - confirming: Potvrzující + confirming: Potvrzuji + deleted: Smazáno demote: Degradovat disable: Zablokovat disable_two_factor_authentication: Zakázat 2FA @@ -109,12 +110,13 @@ cs: enabled: Povoleno feed_url: URL proudu followers: Sledovatelé - followers_local: "(%{local} místních)" followers_url: URL sledovatelů follows: Sledovaní header: Hlavička inbox_url: URL přijatých zpráv + invited_by: Pozván/a uživatelem ip: IP + joined: Připojil/a se location: all: Vše local: Místní @@ -141,7 +143,7 @@ cs: protocol: Protokol public: Veřejný push_subscription_expires: Odebírání PuSH expiruje - redownload: Obnovit avatar + redownload: Obnovit profil remove_avatar: Odstranit avatar remove_header: Odstranit hlavičku resend_confirmation: @@ -159,10 +161,10 @@ cs: user: Uživatel salmon_url: URL Salmon search: Hledat - shared_inbox_url: URL sdílené schránky + shared_inbox_url: URL sdílených přijatých zpráv show: - created_reports: Nahlášení vytvořená z tohoto účtu - targeted_reports: Nahlášení vytvořená o tomto účtu + created_reports: Vytvořená nahlášení + targeted_reports: Nahlášeni ostatními silence: Utišit silenced: Utišen/a statuses: Příspěvky @@ -174,6 +176,7 @@ cs: undo_suspension: Zrušit pozastavení unsubscribe: Přestat odebírat username: Uživatelské jméno + warn: Varovat web: Web action_logs: actions: @@ -257,7 +260,7 @@ cs: week_users_active: aktivních tento týden week_users_new: uživatelů tento týden domain_blocks: - add_new: Přidat nové + add_new: Přidat novou blokaci domény created_msg: Blokace domény se právě vyřizuje destroyed_msg: Blokace domény byla zrušena domain: Doména @@ -272,8 +275,13 @@ cs: title: Nová doménová blokace reject_media: Odmítat mediální soubory reject_media_hint: Odstraní lokálně uložené soubory a odmítne jejich stažení v budoucnosti. Nepodstatné pro pozastavení - reject_reports: Odmítnout nahlášení - reject_reports_hint: Ignorovat všechna nahlášení pocházející z této domény. Nepodstatné pro suspenzace + reject_reports: Odmítat nahlášení + reject_reports_hint: Ignorovat všechna nahlášení pocházející z této domény. Nepodstatné pro pozastavení + rejecting_media: odmítají se mediální soubory + rejecting_reports: odmítají se nahlášení + severity: + silence: utišené + suspend: pozastavené show: affected_accounts: few: "%{count} účty v databázi byly ovlivněny" @@ -284,7 +292,7 @@ cs: suspend: Zrušit pozastavení všech existujících účtů z této domény title: Zrušit blokaci domény %{domain} undo: Odvolat - undo: Odvolat + undo: Odvolat blokaci domény email_domain_blocks: add_new: Přidat nový created_msg: E-mailová doména úspěšně přidána na černou listinu @@ -299,7 +307,21 @@ cs: back_to_account: Zpět na účet title: Sledovatelé uživatele %{acct} instances: - title: Známé instance + delivery_available: Doručení je k dispozici + known_accounts: + few: "%{count} známé účty" + one: "%{count} známý účet" + other: "%{count} známých účtů" + moderation: + all: Vše + limited: Omezené + title: Moderace + title: Federace + total_blocked_by_us: Blokované námi + total_followed_by_them: Sledované jím + total_followed_by_us: Sledované námi + total_reported: Nahlášení o něm + total_storage: Mediální přílohy invites: deactivate_all: Deaktivovat vše filter: @@ -537,8 +559,11 @@ cs: warning_title: Dostupnost rozšířeného obsahu directories: directory: Adresář profilů + enabled: Aktuálně jste v adresáři uveden/a. + enabled_but_waiting: Přihlásil/a jste se k uvedení v adresáři, ale ještě nemáte minimální počet sledovatelů (%{min_followers}) pro uvedení. explanation: Objevujte uživatele podle jejich zájmů explore_mastodon: Prozkoumejte %{title} + how_to_enable: Aktuálně nejste přihlášen/a do adresáře. Přihlásit se můžete níže. Použijte ve svém popisu profilu hashtagy, abyste mohl/a být uveden/a pod konkrétními hashtagy! people: few: "%{count} lidé" one: "%{count} člověk" @@ -565,7 +590,9 @@ cs: size: Velikost blocks: Blokujete csv: CSV + domain_blocks: Blokace domén follows: Sledujete + lists: Seznamy mutes: Ignorujete storage: Paměť médií filters: @@ -661,7 +688,7 @@ cs: body: Zde najdete stručný souhrn zpráv, které jste zmeškal/a od vaší poslední návštěvy %{since} mention: "%{name} vás zmínil/a v:" new_followers_summary: - few: Navíc jste získal/a %{count} nové sledovatele, zatímco jste byl/a pryč! Hurá! + few: Navíc jste získal/a %{count} nové sledovatele, zatímco jste byl/a pryč! Skvělé! one: Navíc jste získal/a jednoho nového sledovatele, zatímco jste byl/a pryč! Hurá! other: Navíc jste získal/a %{count} nových sledovatelů, zatímco jste byl/a pryč! Úžasné! subject: @@ -718,10 +745,25 @@ cs: no_account_html: Ještě nemáte účet? Můžete se registrovat zde proceed: Pokračovat ke sledování prompt: 'Budete sledovat:' + reason_html: "Proč je tento krok nutný? %{instance} nemusí být serverem, na kterém jste registrován/a, proto vás musíme nejdříve přesměrovat na váš domovský server." + remote_interaction: + favourite: + proceed: Pokračovat k oblíbení + prompt: 'Chcete si oblíbit tento toot:' + reblog: + proceed: Pokračovat k boostnutí + prompt: 'Chcete boostnout tento toot:' + reply: + proceed: Pokračovat k odpovězení + prompt: 'Chcete odpovědět na tento toot:' remote_unfollow: error: Chyba title: Nadpis unfollowed: Už nesledujete + scheduled_statuses: + over_daily_limit: Překročil/a jste limit %{limit} plánovaných tootů pro tento den + over_total_limit: Překročil/a jste limit %{limit} plánovaných tootů + too_soon: Plánované datum musí být v budoucnosti sessions: activity: Nejnovější aktivita browser: Prohlížeč diff --git a/config/locales/cy.yml b/config/locales/cy.yml index 40cb1cac0..53b474c16 100644 --- a/config/locales/cy.yml +++ b/config/locales/cy.yml @@ -30,16 +30,34 @@ cy: other_instances: Rhestr achosion privacy_policy: Polisi preifatrwydd source_code: Cod ffynhonnell - status_count_after: statws + status_count_after: + few: statwsau + many: statwsau + one: statws + other: statwsau + two: statwsau + zero: statwsau status_count_before: Ysgriffennwyd gan terms: Telerau gwasanaeth - user_count_after: defnyddwyr + user_count_after: + few: defnyddwyr + many: defnyddwyr + one: defnyddiwr + other: defnyddwyr + two: defnyddwyr + zero: defnyddwyr user_count_before: Cartref i what_is_mastodon: Beth yw Mastodon? accounts: choices_html: 'Dewisiadau %{name}:' follow: Dilynwch - followers: Dilynwyr + followers: + few: Dilynwyr + many: Dilynwyr + one: Dilynwr + other: Dilynwyr + two: Dilynwyr + zero: Dilynwyr following: Yn dilyn joined: Ymunodd %{date} link_verified_on: Gwiriwyd perchnogaeth y ddolen yma ar %{date} @@ -51,7 +69,13 @@ cy: people_who_follow: Pobl sy'n dilyn %{name} pin_errors: following: Rhaid i ti fod yn dilyn y person yr ydych am ei gymeradwyo yn barod - posts: Tŵtiau + posts: + few: Tŵtiau + many: Tŵtiau + one: Tŵt + other: Tŵtiau + two: Tŵtiau + zero: Tŵtiau posts_tab_heading: Tŵtiau posts_with_replies: Tŵtiau ac atebion reserved_username: Mae'r enw defnyddiwr ar gadw @@ -61,6 +85,8 @@ cy: moderator: Safonwr unfollow: Dad-ddilyn admin: + account_actions: + action: Cyflawni gweithred account_moderation_notes: create: Gadael nodyn created_msg: Crewyd nodyn cymedroli yn llwyddiannus! @@ -80,6 +106,7 @@ cy: confirm: Cadarnhau confirmed: Cadarnhawyd confirming: Cadarnhau + deleted: Wedi dileu demote: Diraddio disable: Diffodd disable_two_factor_authentication: Diffodd 2FA @@ -95,8 +122,11 @@ cy: followers: Dilynwyr followers_url: URL Dilynwyr follows: Yn dilyn + header: Pennawd inbox_url: URL Mewnflwch + invited_by: Gwahoddwyd gan ip: IP + joined: Ymunodd location: all: Popeth local: Lleol @@ -106,6 +136,7 @@ cy: media_attachments: Atodiadau memorialize: Troi yn gofeb moderation: + active: Yn weithredol all: Popeth silenced: Wedi ei dawelu suspended: Wedi ei atal @@ -122,7 +153,7 @@ cy: protocol: Protocol public: Cyhoeddus push_subscription_expires: Tanysgrifiad PuSH yn dod i ben - redownload: Adnewyddu afatar + redownload: Adnewyddu proffil remove_avatar: Dileu afatar resend_confirmation: already_confirmed: Mae'r defnyddiwr hwn wedi ei gadarnhau yn barod @@ -154,6 +185,7 @@ cy: undo_suspension: Dadwneud ataliad unsubscribe: Dad-danysgrifio username: Enw defnyddiwr + warn: Rhybuddio web: Gwe action_logs: actions: @@ -271,7 +303,10 @@ cy: title: Cofnod newydd yng nghosbrestr e-byst title: Cosbrestr e-bost instances: - title: Achosion hysbys + moderation: + all: Pob + limited: Gyfyngedig + title: Ffederasiwn invites: deactivate_all: Diffodd pob un filter: @@ -412,7 +447,14 @@ cy: last_delivery: Danfoniad diwethaf title: WebSub topic: Pwnc + tags: + accounts: Cyfrifon + hidden: Cudd + name: Hashnod title: Gweinyddiaeth + warning_presets: + delete: Dileu + edit: Golygu admin_mailer: new_report: body: Mae %{reporter} wedi cwyno am %{target} @@ -497,7 +539,7 @@ cy: '422': content: Methwyd i ddilysu diogelwch. A ydych chi'n blocio cwcîs? title: Methwyd i ddilysu diogelwch - '429': Crogwyd + '429': Wedi'i arafu '500': content: Mae'n ddrwg gennym ni, ond fe aeth rhywbeth o'i le ar ein rhan ni. title: Nid yw'r dudalen hon yn gywir @@ -714,7 +756,13 @@ cy: attached: description: 'Ynghlwm: %{attached}' image: "%{count} o luniau" - video: "%{count} fideo" + video: + few: "%{count} fideo" + many: "%{count} fideo" + one: "%{count} fideo" + other: "%{count} fideo" + two: "%{count} fideo" + zero: "%{count} fideo" boosted_from_html: Wedi ei fŵstio %{acct_link} content_warning: 'Rhybudd cynnwys: %{warning}' disallowed_hashtags: 'yn cynnwys yr hashnod gwaharddedig: %{tags}' @@ -852,6 +900,12 @@ cy: explanation: Fe wnaethoch chi gais am gopi wrth gefn llawn o'ch cyfrif Mastodon. Mae nawr yn barod i'w lawrlwytho! subject: Mae eich archif yn barod i'w lawrlwytho title: Allfudo archif + warning: + title: + disable: Cyfrif wedi'i rewi + none: Rhybudd + silence: Cyfrif cyfyngedig + suspend: Cyfrif wedi'i rewi welcome: edit_profile_action: Sefydlu proffil edit_profile_step: Mae modd i chi addasu eich proffil drwy uwchlwytho afatar, pennawd, drwy newid eich enw arddangos a mwy. Os hoffech chi adolygu dilynwyr newydd cyn iddynt gael caniatad i'ch dilyn, mae modd i chi gloi eich cyfrif. diff --git a/config/locales/de.yml b/config/locales/de.yml index 12ff54aa8..f3276b4f7 100644 --- a/config/locales/de.yml +++ b/config/locales/de.yml @@ -1,7 +1,7 @@ --- de: about: - about_hashtag_html: Dies sind öffentliche Beiträge, die mit #%{hashtag} getaggt wurden. Wenn du ein Konto irgendwo im Fediversum besitzt, kannst du mit ihnen interagieren. + about_hashtag_html: Dies sind öffentliche Beiträge, die mit #%{hashtag} getaggt wurden. Wenn du irgendwo im Fediversum ein Konto besitzt, kannst du mit ihnen interagieren. about_mastodon_html: Mastodon ist ein soziales Netzwerk. Es basiert auf offenen Web-Protokollen und freier, quelloffener Software. Es ist dezentral (so wie E-Mail!). about_this: Über diese Instanz administered_by: 'Administriert von:' @@ -22,7 +22,7 @@ de: not_a_product_title: Du bist ein Mensch und keine Ware real_conversation_body: Mit 500 Zeichen pro Beitrag und Features wie Inhalts- und Bilderwarnungen kannst du dich so ausdrücken, wie du es möchtest. real_conversation_title: Geschaffen für echte Gespräche - within_reach_body: Verschiedene Apps für iOS, Android und andere Plattformen erlauben dir, dank unseres blühenden API-Ökosystems, dich von überall auf dem Laufenden zu halten. + within_reach_body: Verschiedene Apps für iOS, Android und andere Plattformen erlauben es dir, dank unseres blühenden API-Ökosystems, dich von überall auf dem Laufenden zu halten. within_reach_title: Immer für dich da generic_description: "%{domain} ist ein Server im Netzwerk" hosted_on: Mastodon, beherbergt auf %{domain} @@ -44,8 +44,8 @@ de: choices_html: "%{name} empfiehlt:" follow: Folgen followers: - one: Folgende - other: Follower + one: Folgender + other: Folgende following: Folgt joined: Beigetreten am %{date} last_active: zuletzt aktiv @@ -81,7 +81,7 @@ de: accounts: are_you_sure: Bist du sicher? avatar: Profilbild - by_domain: Domäne + by_domain: Domain change_email: changed_msg: E-Mail-Adresse des Kontos erfolgreich geändert! current_email: Aktuelle E-Mail-Adresse @@ -92,6 +92,7 @@ de: confirm: Bestätigen confirmed: Bestätigt confirming: Bestätigung + deleted: Gelöscht demote: Degradieren disable: Ausschalten disable_two_factor_authentication: 2FA abschalten @@ -104,13 +105,14 @@ de: enable: Freischalten enabled: Freigegeben feed_url: Feed-URL - followers: Folger - followers_local: "(%{local} lokal)" + followers: Folgende followers_url: URL des Folgenden follows: Folgt header: Header inbox_url: Posteingangs-URL + invited_by: Eingeladen von ip: IP-Adresse + joined: Beigetreten location: all: Alle local: Lokal @@ -137,7 +139,7 @@ de: protocol: Protokoll public: Öffentlich push_subscription_expires: PuSH-Abonnement läuft aus - redownload: Avatar neu laden + redownload: Profil neu laden remove_avatar: Profilbild entfernen remove_header: Header entfernen resend_confirmation: @@ -155,10 +157,10 @@ de: user: Nutzer salmon_url: Salmon-URL search: Suche - shared_inbox_url: Geteilter Posteingang URL + shared_inbox_url: Geteilte Posteingang-URL show: - created_reports: Meldungen durch dieses Konto - targeted_reports: Meldungen über dieses Konto + created_reports: Erstellte Beschwerdemeldungen + targeted_reports: Beschwerdemeldungen von anderen silence: Stummschalten silenced: Stummgeschaltet statuses: Beiträge @@ -170,6 +172,7 @@ de: undo_suspension: Sperre zurücknehmen unsubscribe: Abbestellen username: Profilname + warn: Warnen web: Web action_logs: actions: @@ -190,17 +193,17 @@ de: disable_user: "%{name} hat den Login für Benutzer:in %{target} deaktiviert" enable_custom_emoji: "%{name} hat das %{target} Emoji aktiviert" enable_user: "%{name} hat die Anmeldung für di:en Benutzer:in %{target} aktiviert" - memorialize_account: "%{name} hat %{target}s Profil in eine Gedenkseite umgewandelt" + memorialize_account: "%{name} hat %{target}s Konto in eine Gedenkseite umgewandelt" promote_user: "%{name} hat %{target} befördert" remove_avatar_user: "%{name} hat das Profilbild von %{target} entfernt" reopen_report: "%{name} hat die Meldung %{target} wieder geöffnet" reset_password_user: "%{name} hat das Passwort für di:en Benutzer:in %{target} zurückgesetzt" resolve_report: "%{name} hat die Meldung %{target} bearbeitet" - silence_account: "%{name} hat %{target}s Account stummgeschaltet" - suspend_account: "%{name} hat %{target}s Account gesperrt" + silence_account: "%{name} hat %{target}s Konto stummgeschaltet" + suspend_account: "%{name} hat %{target}s Konto gesperrt" unassigned_report: "%{name} hat die Zuweisung der Meldung %{target} entfernt" - unsilence_account: "%{name} hat die Stummschaltung von %{target}s Account aufgehoben" - unsuspend_account: "%{name} hat die Sperrung von %{target}s Account aufgehoben" + unsilence_account: "%{name} hat die Stummschaltung von %{target}s Konto aufgehoben" + unsuspend_account: "%{name} hat die Sperrung von %{target}s Konto aufgehoben" update_custom_emoji: "%{name} hat das %{target} Emoji aktualisiert" update_status: "%{name} hat den Status von %{target} aktualisiert" deleted_status: "(gelöschter Beitrag)" @@ -253,7 +256,7 @@ de: week_users_active: Aktiv diese Woche week_users_new: Benutzer:innen diese Woche domain_blocks: - add_new: Neu hinzufügen + add_new: Neue Domainblockade hinzufügen created_msg: Die Domain-Blockade wird nun durchgeführt destroyed_msg: Die Domain-Blockade wurde rückgängig gemacht domain: Domain @@ -270,6 +273,11 @@ de: reject_media_hint: Entfernt lokal gespeicherte Mediendateien und verhindert deren künftiges Herunterladen. Für Sperren irrelevant reject_reports: Meldungen ablehnen reject_reports_hint: Ignoriere alle Meldungen von dieser Domain. Irrelevant für Sperrungen + rejecting_media: Mediendateien ablehnen + rejecting_reports: Beschwerdemeldungen ablehnen + severity: + silence: stummgeschaltet + suspend: gesperrt show: affected_accounts: one: Ein Konto in der Datenbank betroffen @@ -279,7 +287,7 @@ de: suspend: Alle existierenden Konten dieser Domain entsperren title: Domain-Blockade für %{domain} zurücknehmen undo: Zurücknehmen - undo: Zurücknehmen + undo: Domainblockade zurücknehmen email_domain_blocks: add_new: Neue hinzufügen created_msg: E-Mail-Domain-Blockade erfolgreich erstellt @@ -291,10 +299,23 @@ de: title: Neue E-Mail-Domain-Blockade title: E-Mail-Domain-Blockade followers: - back_to_account: Zurück zum Account + back_to_account: Zurück zum Konto title: "%{acct}'s Follower" instances: - title: Bekannte Instanzen + delivery_available: Zustellung ist verfügbar + known_accounts: + one: "%{count} bekanntes Konto" + other: "%{count} bekannte Accounts" + moderation: + all: Alle + limited: Limitiert + title: Moderation + title: Föderation + total_blocked_by_us: Von uns gesperrt + total_followed_by_them: Gefolgt von denen + total_followed_by_us: Gefolgt von uns + total_reported: Beschwerdemeldungen über sie + total_storage: Medienanhänge invites: deactivate_all: Alle deaktivieren filter: @@ -484,8 +505,8 @@ de: invalid_reset_password_token: Das Token zum Zurücksetzen des Passworts ist ungültig oder abgelaufen. Bitte fordere ein neues an. login: Anmelden logout: Abmelden - migrate_account: Ziehe zu einem anderen Account um - migrate_account_html: Wenn du es wünschst diesen Account zu einem anderen umzuziehen, dann kannst du es hier einstellen. + migrate_account: Ziehe zu einem anderen Konto um + migrate_account_html: Wenn du wünschst, dieses Konto zu einem anderen umzuziehen, kannst du dies hier einstellen. or: oder or_log_in_with: Oder anmelden mit providers: @@ -499,7 +520,7 @@ de: set_new_password: Neues Passwort setzen authorize_follow: already_following: Du folgst diesem Konto bereits - error: Das Profil konnte nicht geladen werden + error: Das Remote-Konto konnte nicht geladen werden follow: Folgen follow_request: 'Du hast eine Folgeanfrage gesendet an:' following: 'Erfolg! Du folgst nun:' @@ -532,8 +553,11 @@ de: warning_title: Verfügbarkeit verstreuter Inhalte directories: directory: Profilverzeichnis + enabled: Du bist gerade in dem Verzeichnis gelistet. + enabled_but_waiting: Du bist damit einverstanden im Verzeichnis gelistet zu werden, aber du hast nicht die minimale Anzahl an Folgenden (%{min_followers}), damit es passiert. explanation: Entdecke Benutzer basierend auf deren Interessen explore_mastodon: Entdecke %{title} + how_to_enable: Du hast dich gerade nicht dazu entschieden im Verzeichnis gelistet zu werden. Du kannst dich unten dafür eintragen. Benutze Hashtags in deiner Profilbeschreibung, um unter spezifischen Hashtags gelistet zu werden! people: one: "%{count} Person" other: "%{count} Leute" @@ -559,7 +583,9 @@ de: size: Größe blocks: Du hast blockiert csv: CSV + domain_blocks: Domainblockaden follows: Du folgst + lists: Listen mutes: Du hast stummgeschaltet storage: Medienspeicher filters: @@ -631,7 +657,7 @@ de: table: expires_at: Läuft ab uses: Verwendungen - title: Leute Einladen + title: Leute einladen lists: errors: limit: Du hast die maximale Anzahl an Listen erreicht @@ -640,10 +666,10 @@ de: images_and_video: Es kann kein Video an einen Beitrag, der bereits Bilder enthält, angehängt werden too_many: Es können nicht mehr als 4 Bilder angehängt werden migrations: - acct: benutzername@domain des neuen Accounts + acct: benutzername@domain des neuen Kontos currently_redirecting: 'Deine Profilweiterleitung wurde gesetzt auf:' proceed: Speichern - updated_msg: Deine Account-Migrationseinstellungen wurden erfolgreich aktualisiert! + updated_msg: Deine Konto-Migrationseinstellungen wurden erfolgreich aktualisiert! moderation: title: Moderation notification_mailer: @@ -705,13 +731,28 @@ de: remote_follow: acct: Profilname@Domain, von wo aus du dieser Person folgen möchtest missing_resource: Die erforderliche Weiterleitungs-URL für dein Konto konnte nicht gefunden werden - no_account_html: Noch keinen Account? Du kannst dich hier anmelden + no_account_html: Noch kein Konto? Du kannst dich hier anmelden proceed: Weiter prompt: 'Du wirst dieser Person folgen:' + reason_html: "Warum ist dieser Schritt erforderlich?%{instance} ist möglicherweise nicht der Server auf dem du registriert bist, also müssen wir dich erst auf deinen Heimserver weiterleiten." + remote_interaction: + favourite: + proceed: Fortfahren zum Favorisieren + prompt: 'Du möchtest diesen Beitrag favorisieren:' + reblog: + proceed: Fortfahren zum Teilen + prompt: 'Du möchtest diesen Beitrag teilen:' + reply: + proceed: Fortfahren zum Antworten + prompt: 'Du möchtest auf diesen Beitrag antworten:' remote_unfollow: error: Fehler title: Titel unfollowed: Entfolgt + scheduled_statuses: + over_daily_limit: Du hast das Limit für geplante Beiträge, dass %{limit} beträgt, für heute erreicht + over_total_limit: Du hast das Limit für geplante Beiträge, dass %{limit} beträgt, erreicht + too_soon: Das geplante Datum muss in der Zukunft liegen sessions: activity: Letzte Aktivität browser: Browser @@ -735,7 +776,7 @@ de: weibo: Weibo current_session: Aktuelle Sitzung description: "%{browser} auf %{platform}" - explanation: Dies sind die Webbrowser, die derzeit in dein Mastodon-Konto eingeloggt sind. + explanation: Dies sind die Webbrowser, die derzeit in deinem Mastodon-Konto eingeloggt sind. ip: IP-Adresse platforms: adobe_air: Adobe Air @@ -762,7 +803,7 @@ de: export: Datenexport followers: Autorisierte Folgende import: Datenimport - migrate: Account-Umzug + migrate: Konto-Umzug notifications: Benachrichtigungen preferences: Einstellungen settings: Einstellungen @@ -803,7 +844,7 @@ de: stream_entries: pinned: Angehefteter Beitrag reblogged: teilte - sensitive_content: Heikle Inhalte + sensitive_content: Sensible Inhalte terms: body_html: |

Datenschutzerklärung

@@ -910,33 +951,33 @@ de: manual_instructions: 'Wenn du den QR-Code nicht einlesen kannst und ihn manuell eingeben musst, ist hier das Klartext-Geheimnis:' recovery_codes: Wiederherstellungs-Codes sichern recovery_codes_regenerated: Wiederherstellungscodes erfolgreich neu generiert - recovery_instructions_html: Wenn du den Zugang zu deinem Telefon verlieren solltest, kannst du einen untenstehenden Wiederherstellungscodes benutzen, um wieder auf dein Konto zugreifen zu können. Bewahre die Wiederherstellungscodes gut auf. Du könntest sie beispielsweise ausdrucken und bei deinen restlichen wichtigen Dokumenten aufbewahren. + recovery_instructions_html: Wenn du den Zugang zu deinem Telefon verlieren solltest, kannst du einen untenstehenden Wiederherstellungscode benutzen, um wieder auf dein Konto zugreifen zu können. Bewahre die Wiederherstellungscodes gut auf. Du könntest sie beispielsweise ausdrucken und bei deinen restlichen wichtigen Dokumenten aufbewahren. setup: Einrichten wrong_code: Der eingegebene Code war ungültig! Stimmen Serverzeit und Gerätezeit? user_mailer: backup_ready: - explanation: Du hast ein vollständiges Backup von deinem Mastodon-Account angefragt. Es kann jetzt heruntergeladen werden! + explanation: Du hast ein vollständiges Backup von deinem Mastodon-Konto angefragt. Es kann jetzt heruntergeladen werden! subject: Dein Archiv ist bereit zum Download title: Archiv-Download warning: explanation: - disable: Solange dein Account eingefroren ist sind deine Benutzerdaten intakt, aber du kannst nichts tun bis dein Account entsperrt wurde. - silence: Solange dein Account limitiert ist können nur Leute, die dir bereits folgen deine Beiträge auf dem Server sehen und es könnte sein, dass du von verschiedenen öffentlichen Listungen ausgeschlossen wirst. Andererseits können andere dir manuell folgen. - suspend: Dein Account wurde gesperrt und alle deine Beiträge und hochgeladenen Medien wurden unwiderruflich vom Server und anderen Servern wo du Follower hattest gelöscht. + disable: Solange dein Konto eingefroren ist, sind deine Benutzerdaten intakt; aber du kannst nichts tun, bis dein Konto entsperrt wurde. + silence: Solange dein Konto limitiert ist, können nur die Leute, die dir bereits folgen, deine Beiträge auf dem Server sehen und es könnte sein, dass du von verschiedenen öffentlichen Listungen ausgeschlossen wirst. Andererseits können andere dir manuell folgen. + suspend: Dein Konto wurde gesperrt und alle deine Beiträge und hochgeladenen Medien wurden unwiderruflich vom Server und anderen Servern, bei denen du Folgende hattest, gelöscht. review_server_policies: Serverrichtlinien ansehen subject: - disable: Dein Account %{acct} wurde eingefroren + disable: Dein Konto %{acct} wurde eingefroren none: Warnung für %{acct} - silence: Dein Account %{acct} wurde limitiert - suspend: Dein Account %{acct} wurde gesperrt + silence: Dein Konto %{acct} wurde limitiert + suspend: Dein Konto %{acct} wurde gesperrt title: - disable: Account eingefroren + disable: Konto eingefroren none: Warnung - silence: Account limitiert - suspend: Account gesperrt + silence: Konto limitiert + suspend: Konto gesperrt welcome: edit_profile_action: Profil einstellen - edit_profile_step: Du kannst dein Profil anpassen, indem du einen Avatar oder ein Titelbild hochlädst oder deinen Anzeigenamen änderst und mehr. Wenn du deine Follower vorher überprüfen möchtest, bevor sie dir folgen können, dann kannst du dein Profil sperren. + edit_profile_step: Du kannst dein Profil anpassen, indem du einen Avatar oder ein Titelbild hochlädst oder deinen Anzeigenamen änderst und mehr. Wenn du deine Folgenden vorher überprüfen möchtest, bevor sie dir folgen können, dann kannst du dein Profil sperren. explanation: Hier sind ein paar Tipps, um loszulegen final_action: Fang an zu posten final_step: 'Fang an zu posten! Selbst ohne Follower werden deine öffentlichen Beitrage von anderen gesehen, zum Beispiel auf der lokalen Zeitleiste oder in Hashtags. Vielleicht möchtest du dich vorstellen mit dem #introductions-Hashtag.' @@ -959,5 +1000,5 @@ de: seamless_external_login: Du bist angemeldet über einen Drittanbieter-Dienst, weswegen Passwort- und E-Maileinstellungen nicht verfügbar sind. signed_in_as: 'Angemeldet als:' verification: - explanation_html: 'Du kannst bestätigen, dass die Links in deinen Profil-Metadaten dir gehören. Dafür muss die verlinkte Website einen Link zurück auf dein Mastodon-Profil enthalten. Dieser Link muss ein rel="me"-Attribut enthalten. Der Linktext is dabei egal. Hier ist ein Beispiel:' + explanation_html: 'Du kannst bestätigen, dass die Links in deinen Profil-Metadaten dir gehören. Dafür muss die verlinkte Website einen Link zurück auf dein Mastodon-Profil enthalten. Dieser Link muss ein rel="me"-Attribut enthalten. Der Linktext ist dabei egal. Hier ist ein Beispiel:' verification: Verifizierung diff --git a/config/locales/devise.pl.yml b/config/locales/devise.pl.yml index 54bae2925..57c21437b 100644 --- a/config/locales/devise.pl.yml +++ b/config/locales/devise.pl.yml @@ -18,6 +18,7 @@ pl: mailer: confirmation_instructions: action: Zweryfikuj adres e-mail + action_with_app: Potwierdź i wróć do %{app} explanation: Utworzyłeś(-aś) konto na %{host} podając ten adres e-mail. Jedno kliknięcie dzieli Cię od aktywacji tego konta. Jeżeli to nie Ty, zignoruj ten e-mail. extra_html: Przeczytaj też regulamin instancji i nasze zasady użytkowania. subject: 'Mastodon: Instrukcje weryfikacji adresu e-mail na %{instance}' @@ -77,4 +78,8 @@ pl: expired: wygasło, poproś o nowe not_found: nie znaleziono not_locked: było zablokowane - not_saved: 'Błędy (%{count}) uniemożliwiły zapisanie zasobu %{resource}:' + not_saved: + few: 'Błędy (%{count}) uniemożliwiły zapisanie tego %{resource}:' + many: 'Błędy (%{count}) uniemożliwiły zapisanie tego %{resource}:' + one: '1 błąd nie uniemożliwił zapisanie %{resource}:' + other: 'Błędy (%{count}) uniemożliwiły zapisanie tego %{resource}:' diff --git a/config/locales/devise.sk.yml b/config/locales/devise.sk.yml index 73deb35b4..16cd9262e 100644 --- a/config/locales/devise.sk.yml +++ b/config/locales/devise.sk.yml @@ -60,22 +60,22 @@ sk: signed_up: Vitaj! Tvoja registrácia bola úspešná. signed_up_but_inactive: Registrácia bola úspešná. Avšak, účet ešte nebol aktivovaný, takže ťa nemôžeme prihlásiť. signed_up_but_locked: Prihlasovanie úspešné. Avšak tvoj účet je zamknutý, takže ťa nieje možné prihlásiť. - signed_up_but_unconfirmed: Správa s odkazom potvrdzujúcim registráciu bola poslaná na váš email. Pre aktváciu účtu, kliknite na daný odkaz. - update_needs_confirmation: Účet bol úspešne zmenený ale ešte potrebujeme overiť vašu novú emailovú adresu. Pre overenie prosím kliknite na link v správe ktorú sme vám poslali na email. - updated: Váš účet bol úspešne aktualizovaný. + signed_up_but_unconfirmed: Správa s odkazom na potvrdenie registrácie bola odoslaná na tvoj email. Pre aktváciu účtu, klikni prosím na daný odkaz. Takisto ale skontroluj aj svoju spam zložku, pokiaľ sa ti zdá, že si tento email nedostal/a. + update_needs_confirmation: Účet bol úspešne zmenený ale ešte potrebujeme overiť tvoju novú emailovú adresu. Pre overenie prosím klikni na link v správe ktorú si dostal/a na email. Takisto ale skontroluj aj svoju spam zložku, ak sa ti zdá, že si tento email nedostal/a. + updated: Tvoj účet bol úspešne aktualizovaný. sessions: - already_signed_out: Odhlásenie bolo úspešné. - signed_in: Prihlásenie úspešné. - signed_out: Odhlásenie úspešné. + already_signed_out: Odhlásil/a si sa úspešné. + signed_in: Prihlásil/a si sa úspešné. + signed_out: Odhlásil/a si sa úspešné. unlocks: - send_instructions: O niekoľko minút obdržíte email s inštrukciami ako nastaviť nové heslo. - send_paranoid_instructions: Ak váš účet existuje, o niekoľko minút obdržíte email s inštrukciami ako ho odomknúť. - unlocked: Váš účet bol úspešne odomknutý. Prosím prihláste sa. + send_instructions: O niekoľko minút obdržíš email s pokynmi, ako nastaviť nové heslo. Prosím, skontroluj ale aj svoju spam zložku, pokiaľ sa ti zdá, že si tento email nedostal/a. + send_paranoid_instructions: Ak tvoj účet existuje, o niekoľko minút obdržíš email s pokynmi ako si ho odomknúť. Prosím, skontroluj ale aj svoju spam zložku, pokiaľ sa ti zdá, že si tento email nedostal/a. + unlocked: Tvoj účet bol úspešne odomknutý. Pre pokračovanie sa prosím prihlás. errors: messages: - already_confirmed: bol už potvrdený, skúste sa prihlásiť - confirmation_period_expired: musí byť potvrdený do %{period}, prosím požiadajte o nový - expired: expiroval, prosím, vyžiadajte si nový + already_confirmed: bol už potvrdený, skús sa prihlásiť + confirmation_period_expired: musí byť potvrdený do %{period}, prosím požiadaj o nový + expired: vypŕšal, prosím, vyžiadaj si nový not_found: nenájdený not_locked: nebol uzamknutý not_saved: diff --git a/config/locales/devise.sr.yml b/config/locales/devise.sr.yml index 9d1359695..475d1e2a5 100644 --- a/config/locales/devise.sr.yml +++ b/config/locales/devise.sr.yml @@ -17,11 +17,33 @@ sr: unconfirmed: Пре наставка морате потврдити свој налог. mailer: confirmation_instructions: + action: Потврдите адресу е-поште + action_with_app: Потврди и врати се на %{app} + explanation: Направили сте налог на %{host} са адресом ове е-поште. На један клик сте удаљени од активирања. Ако ово нисте ви, молимо игноришите ову е-пошту. + extra_html: Молимо да такође проверите правила ове инстанце и наше услове коришћења. subject: 'Мастодонт: Упутство за потврду корисничког налога на инстанци %{instance}' + title: Потврдите адресу е-поште + email_changed: + explanation: 'Адреса ове е-поште за ваш налог ће бити промењена у:' + extra: Ако нисте променили вашу е-пошту, сасвим је могуће да је неко други добио приступ вашем налогу. Молимо промените лозинку одмах или контактирајте администратора инстанце ако сте закључани изван вашег налога. + subject: 'Мастодон: Е-пошта промењена' + title: Нова адреса е-поште password_change: + explanation: Лозинка вашег налога је промењена. + extra: Ако нисте променили вашу е-пошту, сасвим је могуће да је неко други добио приступ вашем налогу. Молимо промените лозинку одмах или контактирајте администратора инстанце ако сте закључани изван вашег налога. subject: 'Мастодонт: Лозинка промењена' + title: Лозинка промењена + reconfirmation_instructions: + explanation: Потврдите нову адресу да бисте променили е-пошту. + extra: Ако ова промена није иницирана са ваше стране, молимо игноришите ову е-пошту. Адреса е-пошта за овај Мастодон налог неће бити промењена док не приступите повезници/линку изнад. + subject: 'Мастодон: Потврдите е-пошту за %{instance}' + title: Потврдите адресу е-поште reset_password_instructions: + action: Лозинка промењена + explanation: Затражили сте нову лозинку за ваш налог. + extra: Ако нисте затражили ово, молимо игноришите ову е-пошту. Ваша лозинка неће бити промењена док не приступите повезници/вези изнад и не направите нову. subject: 'Мастодонт: Упутство за ресетовање лозинке' + title: Лозинка ресетована unlock_instructions: subject: 'Мастодонт: Упутство за откључавање корисничког налога' omniauth_callbacks: diff --git a/config/locales/doorkeeper.cs.yml b/config/locales/doorkeeper.cs.yml index 352b31895..b9e9bc034 100644 --- a/config/locales/doorkeeper.cs.yml +++ b/config/locales/doorkeeper.cs.yml @@ -72,7 +72,7 @@ cs: index: application: Aplikace created_at: Autorizováno - date_format: "%d.%m.%Y %H:%M:%S" + date_format: "%d. %m. %Y %H:%M:%S" scopes: Rozsahy title: Vaše autorizované aplikace errors: diff --git a/config/locales/el.yml b/config/locales/el.yml index 71acb47ea..c29b8301e 100644 --- a/config/locales/el.yml +++ b/config/locales/el.yml @@ -92,6 +92,7 @@ el: confirm: Επιβεβαίωση confirmed: Επιβεβαιώθηκε confirming: Προς επιβεβαίωση + deleted: Διαγραμμένοι demote: Υποβίβαση disable: Απενεργοποίηση disable_two_factor_authentication: Απενεργοποίηση 2FA @@ -105,12 +106,13 @@ el: enabled: Ενεργοποιημένο feed_url: URL ροής followers: Ακόλουθοι - followers_local: "(%{local} τοπικοί)" followers_url: URL ακολούθων follows: Ακολουθεί header: Επικεφαλίδα inbox_url: URL εισερχομένων + invited_by: Προσκλήθηκε από ip: IP + joined: Γράφτηκε location: all: Όλες local: Τοπικά @@ -170,6 +172,7 @@ el: undo_suspension: Αναίρεση παύσης unsubscribe: Κατάργηση εγγραφής username: Όνομα χρήστη + warn: Προειδοποίηση web: Διαδίκτυο action_logs: actions: @@ -270,6 +273,11 @@ el: reject_media_hint: Αφαιρεί τα τοπικά αποθηκευμένα αρχεία πολυμέσων και αποτρέπει τη λήψη άλλων στο μέλλον. Δεν έχει σημασία για τις αναστολές reject_reports: Απόρριψη καταγγελιών reject_reports_hint: Αγνόηση όσων καταγγελιών προέρχονται από αυτό τον τομέα. Δεν σχετίζεται με τις παύσεις + rejecting_media: απορρίπτουν αρχεία πολυμέσων + rejecting_reports: απορρίπτουν καταγγελίες + severity: + silence: αποσιωπημένοι + suspend: ανεσταλμένοι show: affected_accounts: one: Επηρεάζεται ένας λογαριασμός στη βάση δεδομένων @@ -294,7 +302,20 @@ el: back_to_account: Επιστροφή στον λογαριασμό title: Ακόλουθοι του/της %{acct} instances: + delivery_available: Διαθέσιμη παράδοση + known_accounts: + one: "%{count} γνωστός λογαριασμός" + other: "%{count} γνωστοί λογαριασμοί" + moderation: + all: Όλα + limited: Περιορισμένα + title: Διαμεσολάβηση title: Γνωστοί κόμβοι + total_blocked_by_us: Μπλοκάρονται από εμάς + total_followed_by_them: Ακολουθούνται από εκείνους + total_followed_by_us: Ακολουθούνται από εμάς + total_reported: Καταγγελίες προς εκείνους + total_storage: Συνημμένα πολυμέσα invites: deactivate_all: Απενεργοποίηση όλων filter: @@ -377,7 +398,7 @@ el: desc_html: Οι προεπισκοπήσεις συνδέσμων σε τρίτους ιστότοπους θα είναι ορατές ακόμα κι όταν το πολυμέσο έχει σημειωθεί ως ευαίσθητο title: Εμφάνιση ευαίσθητων πολυμέσων στις προεπισκοπήσεις OpenGraph profile_directory: - desc_html: Να επιτρέπεται ο εντοπισμός των χρηστών + desc_html: Να επιτρέπεται η ανακάλυψη χρηστών title: Ενεργοποίηση του καταλόγου χρηστών registrations: closed_message: @@ -532,8 +553,11 @@ el: warning_title: Διαθεσιμότητα ήδη διανεμημένου περιεχομένου directories: directory: Κατάλογος λογαριασμών + enabled: Περιλαμβάνεσαι στον κατάλογο. + enabled_but_waiting: Έχεις επιλέξει να εμφανίζεσαι στον κατάλογο μεν, αλλά ακόμα δεν έχεις τον ελάχιστο αριθμό ακόλουθων (%{min_followers}) που απαιτείται για να συμπεριληφθείς. explanation: Βρες χρήστες βάσει των ενδιαφερόντων τους explore_mastodon: Εξερεύνησε %{title} + how_to_enable: Δεν έχεις επιλέξει να συμπεριληφθείς στον καταλογο. Μπορείς να επιλέξεις παρακάτω. Χρησιμοποίησε ταμπέλες στο κείμενο του βιογραφικού σου για να εμφανίζεσαι κάτω από συγκεκριμένες ταμπέλες! people: one: "%{count} άτομο" other: "%{count} άτομα" @@ -559,7 +583,9 @@ el: size: Μέγεθος blocks: Μπλοκάρεις csv: CSV + domain_blocks: Μπλοκαρίσματα κόμβων follows: Ακολουθείς + lists: Λίστες mutes: Αποσιωπάς storage: Αποθήκευση πολυμέσων filters: @@ -706,11 +732,26 @@ el: missing_resource: Δεν βρέθηκε το απαιτούμενο URL ανακατεύθυνσης για το λογαριασμό σου no_account_html: Δεν έχεις λογαριασμό; Μπορείς να γραφτείς εδώ proceed: Συνέχισε για να ακολουθήσεις - prompt: 'Θα ακολουθήσεις:' + prompt: 'Ετοιμάζεσαι να ακολουθήσεις:' + reason_html: "Γιατί χρειάζεται αυτό το βήμα; Το %{instance} πορεία να μην είναι ο κόμβος που είσαι γραμμένος, έτσι πρέπει να σε ανακατευθύνουμε στο δικό σου." + remote_interaction: + favourite: + proceed: Συνέχισε για σημείωση ως αγαπημένου + prompt: 'Θέλεις να σημειώσεις ως αγαπημένο αυτό το τουτ:' + reblog: + proceed: Συνέχισε για προώθηση + prompt: 'Θέλεις να προωθήσεις αυτό το τουτ:' + reply: + proceed: Συνέχισε για να απαντήσεις + prompt: 'Θέλεις να απαντήσεις σε αυτό το τουτ:' remote_unfollow: error: Σφάλμα title: Τίτλος unfollowed: Σταμάτησες να ακολουθείς + scheduled_statuses: + over_daily_limit: Έχεις υπερβεί το όριο των %{limit} προγραμματισμένων τουτ για εκείνη τη μέρα + over_total_limit: Έχεις υπερβεί το όριο των %{limit} προγραμματισμένων τουτ + too_soon: Η προγραμματισμένη ημερομηνία πρέπει να είναι στο μέλλον sessions: activity: Τελευταία δραστηριότητα browser: Φυλλομετρητής (Browser) diff --git a/config/locales/en.yml b/config/locales/en.yml index 9f57f8620..39d0dd6cf 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -553,8 +553,11 @@ en: warning_title: Disseminated content availability directories: directory: Profile directory + enabled: You are currently listed in the directory. + enabled_but_waiting: You have opted-in to be listed in the directory, but you do not have the minimum number of followers (%{min_followers}) to be listed yet. explanation: Discover users based on their interests explore_mastodon: Explore %{title} + how_to_enable: You are not currently opted-in to the directory. You can opt-in below. Use hashtags in your bio text to be listed under specific hashtags! people: one: "%{count} person" other: "%{count} people" diff --git a/config/locales/eu.yml b/config/locales/eu.yml index 73a60e771..6abf15201 100644 --- a/config/locales/eu.yml +++ b/config/locales/eu.yml @@ -105,7 +105,6 @@ eu: enabled: Gaituta feed_url: Jarioaren URL-a followers: Jarraitzaileak - followers_local: "(%{local} lokala)" followers_url: Jarraitzaileen URL-a follows: Jarraitzen du header: Goiburua diff --git a/config/locales/fr.yml b/config/locales/fr.yml index d0c7289c8..7fa041872 100644 --- a/config/locales/fr.yml +++ b/config/locales/fr.yml @@ -92,6 +92,7 @@ fr: confirm: Confirmer confirmed: Confirmé confirming: Confirmation + deleted: Effacé demote: Rétrograder disable: Désactiver disable_two_factor_authentication: Désactiver l’authentification à deux facteurs @@ -105,11 +106,11 @@ fr: enabled: Activé feed_url: URL du flux followers: Abonné⋅e⋅s - followers_local: "(%{local} local)" followers_url: URL des abonné·e·s follows: Abonnements header: Entête inbox_url: URL d’entrée + invited_by: Invité par ip: Adresse IP location: all: Tous @@ -137,7 +138,7 @@ fr: protocol: Protocole public: Publique push_subscription_expires: Expiration de l’abonnement PuSH - redownload: Rafraîchir les avatars + redownload: Rafraîchir le profil remove_avatar: Supprimer l’avatar remove_header: Supprimer l'entête resend_confirmation: @@ -157,8 +158,8 @@ fr: search: Rechercher shared_inbox_url: URL de la boite de réception partagée show: - created_reports: Signalements créés par ce compte - targeted_reports: Signalements créés visant ce compte + created_reports: Signalements faits + targeted_reports: Signalés par d'autres silence: Masquer silenced: Silencié statuses: Statuts @@ -253,7 +254,7 @@ fr: week_users_active: actif·ve·s cette semaine week_users_new: utilisateur·rice·s cette semaine domain_blocks: - add_new: Ajouter + add_new: Ajouter un nouveau bloqueur de domaine created_msg: Le blocage de domaine est désormais activé destroyed_msg: Le blocage de domaine a été désactivé domain: Domaine @@ -270,6 +271,11 @@ fr: reject_media_hint: Supprime localement les fichiers média stockés et refuse d’en télécharger ultérieurement. Ne concerne pas les suspensions reject_reports: Rapports de rejet reject_reports_hint: Ignorez tous les rapports provenant de ce domaine. Sans objet pour les suspensions + rejecting_media: rejet des fichiers multimédia + rejecting_reports: rejet de rapports + severity: + silence: silencié + suspend: suspendu show: affected_accounts: one: Un compte affecté dans la base de données @@ -279,7 +285,7 @@ fr: suspend: Annuler la suspension sur tous les comptes existants pour ce domaine title: Annuler le blocage de domaine pour %{domain} undo: Annuler - undo: Annuler + undo: Annuler le bloqueur de domaine email_domain_blocks: add_new: Ajouter created_msg: Le blocage de domaine de courriel est désormais activé @@ -294,7 +300,19 @@ fr: back_to_account: Retour au compte title: Abonné⋅e⋅s de %{acct} instances: - title: Instances connues + known_accounts: + one: "%{count} compte connu" + other: "%{count} comptes connus" + moderation: + all: Tout + limited: Limité + title: Modération + title: Fédération + total_blocked_by_us: Bloqués par nous + total_followed_by_them: Suivi par eux + total_followed_by_us: Suivi par nous + total_reported: Signalements à leurs propos + total_storage: Attachements de média invites: deactivate_all: Tout désactiver filter: @@ -532,8 +550,11 @@ fr: warning_title: Disponibilité du contenu disséminé directories: directory: Annuaire des profils + enabled: Vous êtes actuellement listé dans l'annuaire. + enabled_but_waiting: Vous avez choisi d'être listé dans l'annuaire, mais vous n'avez pas encore le nombre minimum de suiveurs (%{min_followers}) pour y être inscrit. explanation: Découvrir des utilisateurs en se basant sur leurs centres d'intérêt explore_mastodon: Explorer %{title} + how_to_enable: Vous n'êtes pas encore inscrit dans l'annuaire. Vous pouvez vous inscrire ci-dessous. Utilisez des hashtags dans votre texte biographique pour être listé sous des hashtags spécifiques ! people: one: "%{count} personne" other: "%{count} personne" @@ -559,7 +580,9 @@ fr: size: Taille blocks: Vous bloquez csv: CSV + domain_blocks: Bloqueurs de domaine follows: Vous suivez + lists: Listes mutes: Vous masquez storage: Médias stockés filters: @@ -708,10 +731,22 @@ fr: no_account_html: Vous n’avez pas de compte ? Vous pouvez vous inscrire ici proceed: Confirmer l’abonnement prompt: 'Vous allez suivre :' + reason_html: "Pourquoi cette étape est-elle nécessaire? %{instance} pourrait ne pas être le serveur où vous vous êtes inscrit, et nous devons donc vous rediriger vers votre serveur de base en premier." + remote_interaction: + favourite: + prompt: 'Vous souhaitez mettre ce pouet en favori :' + reblog: + prompt: 'Vous souhaitez repartager ce pouet :' + reply: + prompt: 'Vous souhaitez répondre à ce pouet :' remote_unfollow: error: Erreur title: Titre unfollowed: Non-suivi + scheduled_statuses: + over_daily_limit: Vous avez dépassé la limite de %{limit} pouets planifiés pour ce jour + over_total_limit: Vous avez dépassé la limite de %{limit} pouets planifiés + too_soon: La date planifiée doit être dans le futur sessions: activity: Dernière activité browser: Navigateur diff --git a/config/locales/gl.yml b/config/locales/gl.yml index df5f04bae..57e150d49 100644 --- a/config/locales/gl.yml +++ b/config/locales/gl.yml @@ -84,14 +84,15 @@ gl: by_domain: Dominio change_email: changed_msg: Cambiouse correctamente o correo-e da conta! - current_email: Correo-e actual - label: Cambiar correo-e - new_email: Novo correo-e - submit: Cambiar correo-e - title: Cambiar o correo-e de %{username} + current_email: Correo actual + label: Cambiar correo + new_email: Novo correo + submit: Cambiar correo + title: Cambiar o correo de %{username} confirm: Confirmar confirmed: Confirmado confirming: Confirmar + deleted: Eliminado demote: Degradar disable: Deshabilitar disable_two_factor_authentication: Deshabilitar 2FA @@ -99,18 +100,19 @@ gl: display_name: Mostrar nome domain: Dominio edit: Editar - email: E-mail - email_status: Estado del correo electrónico + email: Email + email_status: Estado do correo enable: Habilitar enabled: Habilitado feed_url: URL fonte followers: Seguidoras - followers_local: "(local %{local})" followers_url: URL das seguidoras follows: Segue header: Cabeceira inbox_url: URL da Caixa de entrada + invited_by: Convidada por ip: IP + joined: Uniuse location: all: Todo local: Local @@ -137,7 +139,7 @@ gl: protocol: Protocolo public: Público push_subscription_expires: A suscrición PuSH caduca - redownload: Actualizar avatar + redownload: Actualizar perfil remove_avatar: Eliminar avatar remove_header: Eliminar cabeceira resend_confirmation: @@ -157,19 +159,20 @@ gl: search: Busca shared_inbox_url: URL da caixa de entrada compartida show: - created_reports: Informes creados por esta conta - targeted_reports: Informes feitos sobre esta conta + created_reports: Informes creados + targeted_reports: Informes feitos por outros silence: Acalar silenced: Acalada statuses: Estados subscribe: Subscribir suspended: Suspendida title: Contas - unconfirmed_email: Correo-e non confirmado + unconfirmed_email: Correo non confirmado undo_silenced: Desfacer acalar undo_suspension: Desfacer suspensión unsubscribe: Non subscribir username: Nome de usuaria + warn: Aviso web: Web action_logs: actions: @@ -253,7 +256,7 @@ gl: week_users_active: activas estas semana week_users_new: usuarias esta semana domain_blocks: - add_new: Engadir novo + add_new: Engadir novo bloqueo de dominio created_msg: Estase a procesar o bloqueo do dominio destroyed_msg: Desfixose a acción de bloqueo de dominio domain: Dominio @@ -270,6 +273,11 @@ gl: reject_media_hint: Eliminar ficheiros de medios almacenados localmente e rexeita descargalos no futuro. Irrelevante para as suspensións reject_reports: Rexeitar informes reject_reports_hint: Ignorar todos os informes procedentes de este dominio. Irrelevante para as suspensións + rejecting_media: rexeitando ficheiros de medios + rejecting_reports: rexeitando informes + severity: + silence: acalado + suspend: suspendido show: affected_accounts: one: Afectoulle a unha conta na base de datos @@ -279,7 +287,7 @@ gl: suspend: Non suspender todas as contas existentes de este dominio title: Desfacer o bloqueo de dominio para %{domain} undo: Desfacer - undo: Desfacer + undo: Desfacer bloqueo de dominio email_domain_blocks: add_new: Engadir novo created_msg: Engadeuse correctamente o dominio de email a lista negra @@ -294,7 +302,20 @@ gl: back_to_account: Voltar a Conta title: Seguidoras de %{acct} instances: - title: Instancias coñecidas + delivery_available: A entrega está dispoñible + known_accounts: + one: "%{count} conta coñecida" + other: "%{count} contas coñecidas" + moderation: + all: Todo + limited: Limitado + title: Moderación + title: Federación + total_blocked_by_us: Bloqueado por nós + total_followed_by_them: Seguidas por eles + total_followed_by_us: Seguidas por nós + total_reported: Informes sobre elas + total_storage: Anexos de medios invites: deactivate_all: Desactivar todo filter: @@ -532,8 +553,11 @@ gl: warning_title: Dispoñibilidade do contido espallado directories: directory: Directorio de perfil + enabled: Vostede está actualmente na lista do directorio. + enabled_but_waiting: Vostede optou por ser incluída no directorio, mais por agora non ten o número mínimo de seguidoras (%{min_followers}) para aparecer. explanation: Descubra usuarias según o seu interese explore_mastodon: Explorar %{title} + how_to_enable: Actualmente non solicitou ser incluída no directorio, pode facelo abaixo. Utilice etiquetas no texto de biografía para ser incluída baixo etiquetas específicas! people: one: "%{count} persoa" other: "%{count} persoas" @@ -559,7 +583,9 @@ gl: size: Tamaño blocks: A bloquear csv: CSV + domain_blocks: Bloqueos de dominio follows: A seguir + lists: Listas mutes: Acalou storage: Almacenamento de medios filters: @@ -708,10 +734,25 @@ gl: no_account_html: Non ten unha conta? Pode rexistrarse aquí proceed: Proceda para seguir prompt: 'Vostede vai seguir:' + reason_html: "Por que é necesario este paso?%{instance} podería non ser o servidor onde se rexistrou, así que precisamo redirixila primeiro ao seu servidor de orixe." + remote_interaction: + favourite: + proceed: Darlle a favorito + prompt: 'Vostede quere favorecer este toot:' + reblog: + proceed: Darlle a promocionar + prompt: 'Vostede quere promocionar este toot:' + reply: + proceed: Respostar + prompt: 'Vostede quere respostar a este toot:' remote_unfollow: error: Fallo title: Título unfollowed: Deixou de seguir + scheduled_statuses: + over_daily_limit: Excedeu o límite de %{limit} toots programados para ese día + over_total_limit: Excedeu o límite de %{limit} toots programados + too_soon: A data de programación debe estar no futuro sessions: activity: Última actividade browser: Navegador diff --git a/config/locales/id.yml b/config/locales/id.yml index ae38b3f7d..fabf2746e 100644 --- a/config/locales/id.yml +++ b/config/locales/id.yml @@ -1,28 +1,75 @@ --- id: about: + about_hashtag_html: Ini adalah toot public yang ditandai dengan #%{hashtag}. Anda bisa berinteraksi dengan mereka jika anda memiliki akun dimanapun di fediverse. about_mastodon_html: Mastodon adalah sebuah jejaring sosial terbuka, open-sourcedesentralisasi dari platform komersial, menjauhkan anda resiko dari sebuah perusahaan yang memonopoli komunikasi anda. Pilih server yang anda percayai — apapun yang anda pilih, anda tetap dapat berinteraksi dengan semua orang. Semua orang dapat menjalankan server Mastodon sendiri dan berpartisipasi dalam jejaring sosial dengan mudah. about_this: Tentang server ini - closed_registrations: Pendaftaran untuk server ini sedang ditutup. + api: API + apps: Aplikasi hp + closed_registrations: Pendaftaran untuk server ini sedang ditutup. Tetapi, anda bisa mencari server lain untuk membuat akun dan mendapatkan akses dari jaringan yang sama di sana. contact: Kontak - other_instances: Server lain + contact_missing: Belum diset + contact_unavailable: Tidak Tersedia + documentation: Dokumentasi + extended_description_html: | +

Tempat yang baik untuk peraturan

+

Deskripsi lainnya belum diset.

+ features: + humane_approach_body: Belajar dari kegagalan jaringan lain, Mastodon berupaya untuk membuat pilihan desain yang etis untuk melawan penyalahgunaan media sosial. + humane_approach_title: Pendekatan yang lebih manusiawi + not_a_product_body: Mastodon bukanlah jaringan komersil. Tidak ada iklan, tidak ada pengumpulan data, tidak ada batasan vendor. Tidak ada otoritas terpusat. + not_a_product_title: Anda adalah orang, bukanlah sebuah produk + real_conversation_body: Dengan 500 karakter dan dukungan konten granular dan peringatan media, anda dapat mengekspresikan diri anda sendiri sesuai yang anda mau. + real_conversation_title: Dibangun untuk percakapan yang sebenarnya + within_reach_body: Berbagai aplikasi untuk iOS, Android, dan platform lainnya berkat ekosistem API yang ramah pada pengembang untuk tetap terhubung dengan teman-teman anda dimanapun. + within_reach_title: Selalu dalam jangkauan + generic_description: "%{domain} adalah satu server dalam jaringan" + hosted_on: Mastodon dihosting di %{domain} + learn_more: Pelajari selengkapnya + other_instances: Daftar Server + privacy_policy: Kebijakan Privasi source_code: Kode sumber - status_count_after: status + status_count_after: + one: status + other: status status_count_before: Yang telah menulis - user_count_after: pengguna + terms: Kebijakan layanan + user_count_after: + one: pengguna + other: pengguna user_count_before: Tempat bernaung bagi + what_is_mastodon: Apa itu Mastodon? accounts: follow: Ikuti - followers: Pengikut - following: Mengikut + followers: + one: Pengikut + other: Pengikut + following: Mengikuti + joined: Bergabung pada %{date} + last_active: terakhir aktif + link_verified_on: Kepemilikan tautan ini telah dicek pada %{date} + media: Media + moved_html: "%{name} telah pindah ke %{new_profile_link}:" + network_hidden: Informasi ini tidak tersedia nothing_here: Tidak ada apapun disini! people_followed_by: Orang yang diikuti %{name} people_who_follow: Orang-orang yang mengikuti %{name} + pin_errors: + following: Anda harus mengikuti orang yang ingin anda endorse posts: one: Toot - other: Toots + other: Toot + posts_tab_heading: Toot + posts_with_replies: Toot dan balasan + reserved_username: Nama pengguna telah dipesan + roles: + admin: Admin + bot: Bot + moderator: Moderator unfollow: Berhenti mengikuti admin: + account_actions: + action: Lakukan aksi accounts: are_you_sure: Anda yakin? confirm: Konfirmasi diff --git a/config/locales/ja.yml b/config/locales/ja.yml index f8b249c08..7ccb2f21c 100644 --- a/config/locales/ja.yml +++ b/config/locales/ja.yml @@ -18,7 +18,7 @@ ja: features: humane_approach_body: 他の SNS の失敗から学び、Mastodon はソーシャルメディアが誤った使い方をされることの無いように倫理的な設計を目指しています。 humane_approach_title: より思いやりのある設計 - not_a_product_body: Mastodon は営利的な SNS ではありません。広告や、データの収集・解析は無く、またユーザーの囲い込みもありません。ここには中央権力はありません。 + not_a_product_body: Mastodon は営利的な SNS ではありません。広告や、データの収集・解析によるターゲティングは無く、またユーザーの囲い込みもありません。ここには中央権力はありません。 not_a_product_title: あなたは人間であり、商品ではありません real_conversation_body: 好きなように書ける500文字までの投稿や、文章やメディアの内容に警告をつけられる機能で、思い通りに自分自身を表現することができます。 real_conversation_title: 本当のコミュニケーションのために @@ -92,6 +92,7 @@ ja: confirm: 確認 confirmed: 確認済み confirming: 確認中 + deleted: 削除済み demote: 降格 disable: 無効化 disable_two_factor_authentication: 二段階認証を無効にする @@ -105,12 +106,13 @@ ja: enabled: 有効 feed_url: フィードURL followers: フォロワー数 - followers_local: "(%{local} ローカル)" followers_url: Followers URL follows: フォロー数 header: ヘッダー inbox_url: Inbox URL + invited_by: 招待した人 ip: IP + joined: 登録日 location: all: すべて local: ローカル @@ -155,7 +157,7 @@ ja: user: ユーザー salmon_url: Salmon URL search: 検索 - shared_inbox_url: Shared Inbox URL + shared_inbox_url: Shared inbox URL show: created_reports: このアカウントで作られたレポート targeted_reports: このアカウントについてのレポート @@ -170,6 +172,7 @@ ja: undo_suspension: 停止から戻す unsubscribe: 購読の解除 username: ユーザー名 + warn: 警告 web: Web action_logs: actions: @@ -253,7 +256,7 @@ ja: week_users_active: 今週活動した人数 week_users_new: 今週登録した人数 domain_blocks: - add_new: 新規追加 + add_new: ドメインブロックを追加 created_msg: ドメインブロック処理を完了しました destroyed_msg: ドメインブロックを外しました domain: ドメイン @@ -270,6 +273,11 @@ ja: reject_media_hint: ローカルに保存されたメディアファイルを削除し、今後のダウンロードを拒否します。停止とは無関係です reject_reports: レポートを拒否 reject_reports_hint: このドメインからのレポートをすべて無視します。停止とは無関係です + rejecting_media: メディアファイルを拒否中 + rejecting_reports: レポートを拒否中 + severity: + silence: サイレンス中 + suspend: 停止中 show: affected_accounts: one: データベース中の一つのアカウントに影響します @@ -294,7 +302,20 @@ ja: back_to_account: 戻る title: "%{acct}さんのフォロワー" instances: + delivery_available: 配送可能 + known_accounts: + one: 既知のアカウント数 %{count} + other: 既知のアカウント数 %{count} + moderation: + all: すべて + limited: 制限あり + title: モデレーション title: 既知のインスタンス + total_blocked_by_us: ブロック合計 + total_followed_by_them: 被フォロー合計 + total_followed_by_us: フォロー合計 + total_reported: レポート合計 + total_storage: 添付されたメディア invites: deactivate_all: すべて無効化 filter: @@ -365,7 +386,7 @@ ja: desc_html: 全ページに適用されるCSSの編集 title: カスタムCSS hero: - desc_html: フロントページに表示されます。サイズは600x100px以上推奨です。未設定の場合、インスタンスのサムネイルが使用されます + desc_html: フロントページに表示されます。サイズは600x100px以上推奨です。未設定の場合、標準のサムネイルが使用されます title: ヒーローイメージ mascot: desc_html: 複数のページに表示されます。サイズは293x205px以上推奨です。未設定の場合、標準のマスコットが使用されます @@ -532,8 +553,11 @@ ja: warning_title: 共有されたコンテンツについて directories: directory: ディレクトリ - explanation: 興味のある人を見つけよう + enabled: あなたはディレクトリに掲載されています。 + enabled_but_waiting: あなたはディレクトリへの掲載を選択しましたが、掲載に必要な最小フォロワー数 (%{min_followers} 人) を満たしていません。 + explanation: 関心を軸にユーザーを発見しよう explore_mastodon: "%{title}を探索" + how_to_enable: あなたはディレクトリへの掲載を選択していません。下記から選択できます。ハッシュタグカラムに掲載するにはプロフィール文にハッシュタグを使用してください。 people: one: "%{count} 人" other: "%{count} 人" @@ -559,7 +583,9 @@ ja: size: 容量 blocks: ブロック csv: CSV + domain_blocks: 非表示にしたドメイン follows: フォロー + lists: リスト mutes: ミュート storage: メディア filters: @@ -707,10 +733,25 @@ ja: no_account_html: アカウントをお持ちではないですか?こちらからサインアップできます proceed: フォローする prompt: 'フォローしようとしています:' + reason_html: "なぜこの手順が必要でしょうか?%{instance}はあなたが登録されているサーバーではないかもしれないので、まずあなたのサーバーに転送する必要があります。" + remote_interaction: + favourite: + proceed: お気に入り登録する + prompt: 'お気に入り登録しようとしています:' + reblog: + proceed: ブーストする + prompt: 'ブーストしようとしています:' + reply: + proceed: 返信する + prompt: '返信しようとしています:' remote_unfollow: error: エラー title: タイトル unfollowed: フォロー解除しました + scheduled_statuses: + over_daily_limit: その日予約できる投稿数 %{limit} を超えています + over_total_limit: 予約できる投稿数 %{limit} を超えています + too_soon: より先の時間を指定してください sessions: activity: 最後のアクティビティ browser: ブラウザ diff --git a/config/locales/ko.yml b/config/locales/ko.yml index a15066d19..bf6a8b770 100644 --- a/config/locales/ko.yml +++ b/config/locales/ko.yml @@ -92,6 +92,7 @@ ko: confirm: 확인 confirmed: 확인됨 confirming: 확인 중 + deleted: 삭제됨 demote: 모더레이터 강등 disable: 비활성화 disable_two_factor_authentication: 2단계 인증을 비활성화 @@ -99,18 +100,19 @@ ko: display_name: 이름 domain: 도메인 edit: 편집 - email: E-mail + email: 이메일 email_status: 이메일 상태 enable: 활성화 - enabled: 활성화된 + enabled: 활성 feed_url: 피드 URL followers: 팔로워 수 - followers_local: "(%{local} 로컬)" followers_url: 팔로워 URL follows: 팔로잉 수 header: 헤더 inbox_url: 수신함 URL + invited_by: 초대자 ip: IP + joined: 가입 location: all: 전체 local: 로컬 @@ -137,7 +139,7 @@ ko: protocol: 프로토콜 public: 전체 공개 push_subscription_expires: PuSH 구독 기간 만료 - redownload: 아바타 업데이트 + redownload: 프로필 업데이트 remove_avatar: 아바타 지우기 remove_header: 헤더 삭제 resend_confirmation: @@ -170,6 +172,7 @@ ko: undo_suspension: 정지 해제 unsubscribe: 구독 해제 username: 아이디 + warn: 경고 web: 웹 action_logs: actions: @@ -253,7 +256,7 @@ ko: week_users_active: 이번 주의 활성 사용자 week_users_new: 이번 주의 신규 유저 domain_blocks: - add_new: 추가하기 + add_new: 도메인 차단 추가하기 created_msg: 도메인 차단 처리를 완료했습니다 destroyed_msg: 도메인 차단이 해제되었습니다 domain: 도메인 @@ -272,6 +275,11 @@ ko: reject_media_hint: 로컬에 저장된 미디어 파일을 삭제하고, 이후로도 다운로드를 거부합니다. 정지와는 관계 없습니다 reject_reports: 신고 거부 reject_reports_hint: 이 도메인으로부터의 모든 신고를 무시합니다. 정지와는 무관합니다 + rejecting_media: 미디어 거부 + rejecting_reports: 신고 거부 + severity: + silence: 침묵 + suspend: 정지 show: affected_accounts: one: 데이터베이스 중 1개의 계정에 영향을 끼칩니다 @@ -281,7 +289,7 @@ ko: suspend: 이 도메인에 존재하는 모든 계정의 계정 정지를 해제 title: "%{domain}의 도메인 차단을 해제" undo: 실행 취소 - undo: 실행 취소 + undo: 도메인 차단 취소 email_domain_blocks: add_new: 새로 추가 created_msg: 이메일 도메인 차단 규칙을 생성했습니다 @@ -296,7 +304,20 @@ ko: back_to_account: 계정으로 돌아가기 title: "%{acct}의 팔로워" instances: - title: 알려진 인스턴스들 + delivery_available: 전송 가능 + known_accounts: + one: 알려진 계정 %{count}개 + other: 알려진 계정 %{count}개 + moderation: + all: 모두 + limited: 제한됨 + title: 모더레이션 + title: 연합 + total_blocked_by_us: 우리에게 차단 됨 + total_followed_by_them: 우리를 팔로우 + total_followed_by_us: 우리가 한 팔로우 + total_reported: 이들에 대한 신고 + total_storage: 미디어 첨부 invites: deactivate_all: 전부 비활성화 filter: @@ -534,8 +555,11 @@ ko: warning_title: 공유된 컨텐츠에 대해서 directories: directory: 프로필 디렉토리 + enabled: 당신은 디렉터리에 표시 되고 있습니다. + enabled_but_waiting: 디렉터리에 표시 되기 위해서는 수동으로 참여해야 합니다, 하지만 디렉터리에 표시 되기 위한 최소 팔로워(%{min_followers})수에 미치지 못했습니다. explanation: 관심사에 대한 유저들을 발견합니다 explore_mastodon: "%{title} 탐사하기" + how_to_enable: 아직 디렉터리에 참여하지 않았습니다. 아래에서 참여할 수 있습니다. 바이오 텍스트에 해시태그를 사용해 특정 해시태그 디렉터리에 표시 될 수 있습니다! people: one: "%{count}명" other: "%{count}명" @@ -561,7 +585,9 @@ ko: size: 크기 blocks: 차단 csv: CSV + domain_blocks: 도메인 차단 follows: 팔로우 + lists: 리스트 mutes: 뮤트 storage: 미디어 filters: @@ -710,10 +736,25 @@ ko: no_account_html: 계정이 없나요? 여기에서 가입 할 수 있습니다 proceed: 팔로우 하기 prompt: '팔로우 하려 하고 있습니다:' + reason_html: "왜 이 과정이 필요하죠?%{instance}는 당신이 가입한 서버가 아닐 것입니다, 당신의 홈 서버로 먼저 가야 합니다." + remote_interaction: + favourite: + proceed: 즐겨찾기 진행 + prompt: '이 툿을 즐겨찾기 하려고 합니다:' + reblog: + proceed: 부스트 진행 + prompt: '이 툿을 부스트 하려 합니다:' + reply: + proceed: 답장 진행 + prompt: '이 툿에 답장을 하려 합니다:' remote_unfollow: error: 에러 title: 타이틀 unfollowed: 언팔로우됨 + scheduled_statuses: + over_daily_limit: 그 날짜에 대한 %{limit}개의 예약 툿 제한을 초과합니다 + over_total_limit: 예약 툿 제한 %{limit}을 초과합니다 + too_soon: 예약 날짜는 미래여야 합니다 sessions: activity: 마지막 활동 browser: 브라우저 diff --git a/config/locales/nl.yml b/config/locales/nl.yml index 776d01b45..e0d7a4a02 100644 --- a/config/locales/nl.yml +++ b/config/locales/nl.yml @@ -92,6 +92,7 @@ nl: confirm: Bevestigen confirmed: Bevestigd confirming: Bevestiging + deleted: Verwijderd demote: Degraderen disable: Uitschakelen disable_two_factor_authentication: 2FA uitschakelen @@ -100,17 +101,18 @@ nl: domain: Domein edit: Bewerken email: E-mail - email_status: E-mail Status + email_status: E-mailstatus enable: Inschakelen enabled: Ingeschakeld feed_url: Feed-URL followers: Volgers - followers_local: "(%{local} lokaal)" followers_url: Volgers-URL follows: Volgt header: Omslagfoto inbox_url: Inbox-URL + invited_by: Uitgenodigd door ip: IP + joined: Geregistreerd in location: all: Alles local: Lokaal @@ -137,7 +139,7 @@ nl: protocol: Protocol public: Openbaar push_subscription_expires: PuSH-abonnement verloopt op - redownload: Avatar vernieuwen + redownload: Profiel vernieuwen remove_avatar: Avatar verwijderen remove_header: Omslagfoto verwijderen resend_confirmation: @@ -157,8 +159,8 @@ nl: search: Zoeken shared_inbox_url: Gedeelde inbox-URL show: - created_reports: Door dit account aangemaakte rapportages - targeted_reports: Over dit account aangemaakte rapportages + created_reports: Aangemaakte rapportages + targeted_reports: Door anderen gerapporteerd silence: Negeren silenced: Genegeerd statuses: Toots @@ -170,6 +172,7 @@ nl: undo_suspension: Niet langer opschorten unsubscribe: Opzeggen username: Gebruikersnaam + warn: Waarschuwen web: Webapp action_logs: actions: @@ -253,7 +256,7 @@ nl: week_users_active: actieve gebruikers deze week week_users_new: nieuwe gebruikers deze week domain_blocks: - add_new: Nieuwe toevoegen + add_new: Nieuwe domeinblokkade toevoegen created_msg: Domeinblokkade wordt nu verwerkt destroyed_msg: Domeinblokkade is ongedaan gemaakt domain: Domein @@ -266,10 +269,15 @@ nl: silence: Negeren suspend: Opschorten title: Nieuwe domeinblokkade - reject_media: Mediabestanden verwerpen + reject_media: Mediabestanden weigeren reject_media_hint: Verwijderd lokaal opgeslagen mediabestanden en weigert deze in de toekomst te downloaden. Irrelevant voor opgeschorte domeinen reject_reports: Rapportages weigeren reject_reports_hint: Alle rapportages die vanaf dit domein komen negeren. Irrelevant voor opgeschorte domeinen + rejecting_media: mediabestanden worden geweigerd + rejecting_reports: rapportages worden geweigerd + severity: + silence: genegeerd + suspend: opgeschort show: affected_accounts: one: Eén account in de database aangepast @@ -279,7 +287,7 @@ nl: suspend: Alle opgeschorte accounts van dit domein niet langer opschorten title: Domeinblokkade voor %{domain} ongedaan maken undo: Ongedaan maken - undo: Ongedaan maken + undo: domeinblokkade ongedaan maken email_domain_blocks: add_new: Nieuwe toevoegen created_msg: Blokkeren e-maildomein geslaagd @@ -294,7 +302,20 @@ nl: back_to_account: Terug naar account title: Volgers van %{acct} instances: - title: Bekende servers + delivery_available: Bezorging is mogelijk + known_accounts: + one: "%{count} bekend account" + other: "%{count} bekende accounts" + moderation: + all: Alles + limited: Beperkt + title: Moderatie + title: Andere domeinen + total_blocked_by_us: Door ons geblokkeerd + total_followed_by_them: Door hun gevolgd + total_followed_by_us: Door ons gevolgd + total_reported: Rapportages over hun + total_storage: Mediabijlagen invites: deactivate_all: Alles deactiveren filter: @@ -532,8 +553,11 @@ nl: warning_title: Verwijdering gegevens op andere servers directories: directory: Gebruikersgids + enabled: Je staat momenteel in de gebruikersgids vermeldt. + enabled_but_waiting: Je hebt er voor gekozen om in de gebruikersgids te worden vermeldt, maar je hebt daarvoor nog niet het minimaal aantal volgers (%{min_followers}). explanation: Ontdek gebruikers aan de hand van hun interesses explore_mastodon: "%{title} verkennen" + how_to_enable: Je geeft momenteel geen toestemming om in de gebruikersgids te worden vermeldt. Je kunt hieronder toestemming geven. Gebruik hashtags in de tekst van jouw bio, om onder bepaalde hashtags te worden vermeldt! people: one: "%{count} gebruikers" other: "%{count} gebruikers" @@ -559,7 +583,9 @@ nl: size: Omvang blocks: Jij blokkeert csv: CSV + domain_blocks: Domeinblokkades follows: Jij volgt + lists: Lijsten mutes: Jij negeert storage: Mediaopslag filters: @@ -659,8 +685,8 @@ nl: other: "%{count} nieuwe meldingen sinds jouw laatste bezoek \U0001F418" title: Tijdens jouw afwezigheid... favourite: - body: 'Jouw toot werd door %{name} als favoriet gemarkeerd:' - subject: "%{name} markeerde jouw toot als favoriet" + body: 'Jouw toot werd door %{name} aan hun favorieten toegevoegd:' + subject: "%{name} voegde jouw toot als favoriet toe" title: Nieuwe favoriet follow: body: "%{name} volgt jou nu!" @@ -708,10 +734,25 @@ nl: no_account_html: Heb je geen account? Je kunt er hier een registreren proceed: Ga verder om te volgen prompt: 'Jij gaat volgen:' + reason_html: " Waarom is deze extra stap nodig? %{instance} is wellicht niet de server waarop jij je geregistreerd hebt. We verwijzen je eerst door naar jouw eigen server." + remote_interaction: + favourite: + proceed: Doorgaan met toevoegen aan jouw favorieten + prompt: 'Je wilt de volgende toot aan jouw favorieten toevoegen:' + reblog: + proceed: Doorgaan met boosten + prompt: 'Je wilt de volgende toot boosten:' + reply: + proceed: Doorgaan met reageren + prompt: 'Je wilt op de volgende toot reageren:' remote_unfollow: error: Fout title: Titel unfollowed: Ontvolgd + scheduled_statuses: + over_daily_limit: Je hebt de limiet van %{limit} in te plannen toots voor die dag overschreden + over_total_limit: Je hebt de limiet van %{limit} in te plannen toots overschreden + too_soon: De datum voor de ingeplande toot moet in de toekomst liggen sessions: activity: Laatst actief browser: Webbrowser @@ -917,6 +958,10 @@ nl: subject: Jouw archief staat klaar om te worden gedownload title: Archief ophalen warning: + explanation: + disable: Zolang jouw account is bevroren blijven jouw accountgegevens intact, maar kun je geen handelingen uitvoeren totdat het account is vrijgegeven. + silence: Zolang jouw account wordt beperkt, kunnen alleen mensen die jou al volgen jouw toots op deze server zien. Tevens ben je niet zichtbaar in meldingen, gesprekken en op openbare tijdlijnen. Anderen kunnen je echter wel handmatig volgen. + suspend: Jouw account is opgeschort. Jouw toots en geüploade media zijn onomkeerbaar van deze server verwijderd, en ook o.a. van de servers waar jij volgers had. review_server_policies: Serverbeleid bekijken subject: disable: Jouw account %{acct} is bevroren diff --git a/config/locales/oc.yml b/config/locales/oc.yml index 108f383b1..7bedded41 100644 --- a/config/locales/oc.yml +++ b/config/locales/oc.yml @@ -87,11 +87,12 @@ oc: current_email: Adreça actuala label: Cambiar d’adreça new_email: Novèla adreça - submit: Cambiar + submit: Cambiar l’adreça title: Cambiar l’adreça a %{username} confirm: Confirmar confirmed: Confirmat confirming: Confirmacion + deleted: Suprimits demote: Retrogradar disable: Desactivar disable_two_factor_authentication: Desactivar 2FA @@ -105,12 +106,13 @@ oc: enabled: Activat feed_url: Flux URL followers: Seguidors - followers_local: "(%{local} local)" followers_url: URL dels seguidors follows: Abonaments header: Bandièra inbox_url: URL de recepcion + invited_by: Convidat per ip: IP + joined: Venguèt location: all: Totes local: Locals @@ -137,7 +139,7 @@ oc: protocol: Protocòl public: Public push_subscription_expires: Fin de l’abonament PuSH - redownload: Actualizar los avatars + redownload: Actualizar lo perfil remove_avatar: Supriir l’avatar remove_header: Levar la bandièra resend_confirmation: @@ -157,8 +159,8 @@ oc: search: Cercar shared_inbox_url: URL de recepcion partejada show: - created_reports: Rapòrts creat per aqueste compte - targeted_reports: Rapòrts faches tocant aqueste compte + created_reports: Senhalaments creats + targeted_reports: Senhalaments dels autres silence: Silenci silenced: Rescondut statuses: Estatuts @@ -170,6 +172,7 @@ oc: undo_suspension: Levar la suspension unsubscribe: Se desabonar username: Nom d’utilizaire + warn: Avisar web: Web action_logs: actions: @@ -253,7 +256,7 @@ oc: week_users_active: actius aquesta setmana week_users_new: utilizaires aquesta setmana domain_blocks: - add_new: Ajustar + add_new: Ajustar un novèl blocatge de domeni created_msg: Domeni blocat es a èsser tractat destroyed_msg: Lo blocatge del domeni es estat levat domain: Domeni @@ -270,6 +273,11 @@ oc: reject_media_hint: Lèva los fichièrs gardats localament e regèta las demandas de telecargament dins lo futur. Servís pas a res per las suspensions reject_reports: Regetar los senhalaments reject_reports_hint: Ignorar totes los senhalaments que venon d’aqueste domeni. Pas pertiment per las suspensions + rejecting_media: regeta los fichièrs multimèdias + rejecting_reports: regeta los senhalements + severity: + silence: mes en silenci + suspend: suspendut show: affected_accounts: one: Un compte de la basa de donadas tocat @@ -294,7 +302,20 @@ oc: back_to_account: Tornar al compte title: Seguidors de %{acct} instances: - title: Instàncias conegudas + delivery_available: Liurason disponibla + known_accounts: + one: "%{count} compte conegut" + other: "%{count} comptes coneguts" + moderation: + all: Totas + limited: Limitat + title: Moderacion + title: Federacion + total_blocked_by_us: Avèm blocat + total_followed_by_them: Sègon + total_followed_by_us: Seguèm + total_reported: Senhalament a prepaus d’eles + total_storage: Fichièrs junts invites: deactivate_all: O desactivar tot filter: @@ -588,8 +609,11 @@ oc: warning_title: Disponibilitat del contengut difusat directories: directory: Annuari de perfils + enabled: Sètz actualament listat dins l'annuari. + enabled_but_waiting: Avètz causit d'èsser listat dins l'annuari mas avètz pas encara lo nombre minimum de seguidors (%{min_followers}) per i èsser listat. explanation: Trobar d’utilizaires segon lor interèsses explore_mastodon: Explorar %{title} + how_to_enable: Sètz pas actualament listat dins l’annuari. Podètz cambiar aquò çai-jos. Utilizatz d'etiquetas dins vòstre tèxt de bio per èsser listat amb d’etiquetas especificas ! people: one: "%{count} persona" other: "%{count} personas" @@ -615,7 +639,9 @@ oc: size: Talha blocks: Personas que blocatz csv: CSV + domain_blocks: Blocatge de domenis follows: Personas que seguètz + lists: Listas mutes: Personas rescondudas storage: Mèdias gardats filters: @@ -764,10 +790,25 @@ oc: no_account_html: Avètz pas cap de compte ? Podètz vos marcar aquí proceed: Clicatz per sègre prompt: 'Sètz per sègre :' + reason_html: "Perque aquesta etapa es necessària ?%{instance} es benlèu pas lo servidor ont vos marquèretz, doncas nos cal vos redirigir cap a vòstre prim servidor per començar." + remote_interaction: + favourite: + proceed: Contunhar per metre en favorit + prompt: 'Volètz metre en favorit aqueste tut :' + reblog: + proceed: Contunhar per repartejar + prompt: 'Volètz repartejar aqueste tut :' + reply: + proceed: Contunhar per respondre + prompt: 'Volètz respondre a aqueste tut :' remote_unfollow: error: Error title: Títol unfollowed: Pas mai seguit + scheduled_statuses: + over_daily_limit: Avètz passat la limita de %{limit} tuts programats per aquel jorn + over_total_limit: Avètz passat la limita de %{limit} tuts programats + too_soon: La data planificada deu èsser dins lo futur sessions: activity: Darrièra activitat browser: Navigator diff --git a/config/locales/pl.yml b/config/locales/pl.yml index 7d9a05919..beadae14d 100644 --- a/config/locales/pl.yml +++ b/config/locales/pl.yml @@ -78,6 +78,9 @@ pl: moderator: Moderator unfollow: Przestań śledzić admin: + account_actions: + action: Wykonaj działanie + title: Wykonaj działanie moderacyjne na %{acct} account_moderation_notes: create: Pozostaw notatkę created_msg: Pomyślnie dodano notatkę moderacyjną! @@ -97,6 +100,7 @@ pl: confirm: Potwierdź confirmed: Potwierdzono confirming: Potwierdzanie + deleted: Usunięto demote: Degraduj disable: Dezaktywuj disable_two_factor_authentication: Wyłącz uwierzytelnianie dwuetapowe @@ -112,8 +116,11 @@ pl: followers: Śledzący followers_url: Adres śledzących follows: Śledzeni + header: Nagłówek inbox_url: Adres skrzynki + invited_by: Zaproszony(-a) przez ip: Adres IP + joined: Dołączył(-a) location: all: Wszystkie local: Lokalne @@ -140,8 +147,9 @@ pl: protocol: Protokół public: Publiczne push_subscription_expires: Subskrypcja PuSH wygasa - redownload: Odśwież awatar + redownload: Odśwież profil remove_avatar: Usun awatar + remove_header: Usuń nagłówek resend_confirmation: already_confirmed: To konto zostało już potwierdzone send: Wyślij ponownie e-mail z potwierdzeniem @@ -172,12 +180,14 @@ pl: undo_suspension: Cofnij zawieszenie unsubscribe: Przestań subskrybować username: Nazwa użytkownika + warn: Ostrzeż web: Sieć action_logs: actions: assigned_to_self_report: "%{name} przypisał(a) sobie zgłoszenie %{target}" change_email_user: "%{name} zmienił(a) adres e-mail użytkownika %{target}" confirm_user: "%{name} potwierdził(a) adres e-mail użytkownika %{target}" + create_account_warning: "%{name} wysłał(a) ostrzeżenie do %{target}" create_custom_emoji: "%{name} dodał(a) nowe emoji %{target}" create_domain_block: "%{name} zablokował(a) domenę %{target}" create_email_domain_block: "%{name} dodał(a) domenę e-mail %{target} na czarną listę" @@ -271,8 +281,17 @@ pl: reject_media_hint: Usuwa przechowywane lokalnie pliki multimedialne i nie pozwala na ich pobieranie. Nieprzydatne przy zawieszeniu reject_reports: Odrzucaj zgłoszenia reject_reports_hint: Zgłoszenia z tej instancji będą ignorowane. Nieprzydatne przy zawieszeniu + rejecting_media: pliki multimedialne są odrzucane + rejecting_reports: zgłoszenia są odrzucane + severity: + silence: wyciszono + suspend: zawieszono show: - affected_accounts: Dotyczy %{count} kont w bazie danych + affected_accounts: + few: Dotknęło %{count} kont w bazie danych + many: Dotknęło %{count} kont w bazie danych + one: Dotknęło jedno konto w bazie danych + other: Dotknęło %{count} kont w bazie danych retroactive: silence: Odwołaj wyciszenie wszystkich kont w tej domenie suspend: Odwołaj zawieszenie wszystkich kont w tej domenie @@ -289,8 +308,26 @@ pl: create: Utwórz blokadę title: Nowa blokada domeny e-mail title: Blokowanie domen e-mail + followers: + back_to_account: Wróć do konta + title: Śledzący %{acct} instances: + delivery_available: Doręczanie jest dostępne + known_accounts: + few: "%{count} znane konta" + many: "%{count} znane konta" + one: "%{count} znane konto" + other: "%{count} znane konta" + moderation: + all: Wszystkie + limited: Ograniczone + title: Moderacja title: Znane instancje + total_blocked_by_us: Zablokowane przez nas + total_followed_by_them: Śledzeni przez nich + total_followed_by_us: Śledzeni przez nas + total_reported: Zgłoszenia dotyczące ich + total_storage: Załączniki multimedialne invites: deactivate_all: Unieważnij wszystkie filter: @@ -443,6 +480,12 @@ pl: unhide: Pokazuj w katalogu visible: Widoczne title: Administracja + warning_presets: + add_new: Dodaj nowy + delete: Usuń + edit: Edytuj + edit_preset: Edytuj szablon ostrzeżenia + title: Zarządzaj szablonami ostrzeżeń admin_mailer: new_report: body: Użytkownik %{reporter} zgłosił(a) %{target} @@ -551,7 +594,9 @@ pl: size: Rozmiar blocks: Zablokowani csv: CSV + domain_blocks: Blokady domen follows: Śledzeni + lists: Listy mutes: Wyciszeni storage: Urządzenie przechowujące dane filters: @@ -915,6 +960,22 @@ pl: explanation: Zażądałeś pełnej kopii zapasowej konta na Mastodonie. Jest ona dostępna do pobrania! subject: Twoje archiwum jest gotowe do pobrania title: Odbiór archiwum + warning: + explanation: + disable: Kiedy Twoje konto jest wyłączone, Twoje dane pozostają na serwerze, ale nie możesz wykonywać żadnych działań, zanim zostanie odblokowane. + silence: Kiedy Twoje konto jest ograniczone, tylko osoby które je śledzą będą widzieć Twoje wpisy. Może ono też przestać być widoczne na publicznych listach. Inni wciąż mogą zacząć Cię śledzić. + suspend: Twoje konto zostało zawieszone i wszystkie Twoje wpisy wraz z zawartością multimedialną zostały nieodwracalnie usunięte z tego serwera i serwerów, których użytkownicy śledzili Cię. + review_server_policies: Przejrzyj zasady serwera + subject: + disable: Twoje konto %{acct} zostało wyłączone + none: Ostrzeżenie dla %{acct} + silence: Twoje konto %{acct} zostało ograniczone + suspend: Twoje konto %{acct} zostało zawieszone + title: + disable: Konto wyłączone + none: Ostrzeżenie + silence: Konto ograniczone + suspend: Konto zawieszone welcome: edit_profile_action: Skonfiguruj profil edit_profile_step: Możesz dostować profil wysyłając awatar, obraz nagłówka, zmieniając wyświetlaną nazwę i wiele więcej. Jeżeli chcesz, możesz zablokować konto, aby kontrolować, kto może Cię śledzić. diff --git a/config/locales/pt-BR.yml b/config/locales/pt-BR.yml index e0d833c1e..3dfc625aa 100644 --- a/config/locales/pt-BR.yml +++ b/config/locales/pt-BR.yml @@ -92,6 +92,7 @@ pt-BR: confirm: Confirmar confirmed: Confirmado confirming: Confirmando + deleted: Excluído demote: Rebaixar disable: Desativar disable_two_factor_authentication: Desativar 2FA @@ -105,12 +106,13 @@ pt-BR: enabled: Ativado feed_url: URL do feed followers: Seguidores - followers_local: "(%{local} local)" followers_url: URL de seguidores follows: Segue header: Cabeçalho inbox_url: URL da caixa de entrada + invited_by: Convidado por ip: IP + joined: Se cadastrou location: all: Todos local: Local @@ -137,7 +139,7 @@ pt-BR: protocol: Protocolo public: Público push_subscription_expires: Inscrição PuSH expira - redownload: Atualizar avatar + redownload: Atualizar perfil remove_avatar: Remover avatar remove_header: Remover cabeçalho resend_confirmation: @@ -170,6 +172,7 @@ pt-BR: undo_suspension: Retirar suspensão unsubscribe: Desinscrever-se username: Nome de usuário + warn: Notificar web: Web action_logs: actions: @@ -253,7 +256,7 @@ pt-BR: week_users_active: ativos essa semana week_users_new: usuários essa semana domain_blocks: - add_new: Adicionar novo + add_new: Adicionar novo bloqueio de domínio created_msg: Bloqueio de domínio está sendo processado destroyed_msg: Bloqueio de domínio desfeito domain: Domínio @@ -270,6 +273,11 @@ pt-BR: reject_media_hint: Remove arquivos de mídia armazenados localmente e recusa quaisquer outros no futuro. Irrelevante para suspensões reject_reports: Rejeitar denúncias reject_reports_hint: Ignorar todas as denúncias vindas deste domíno. Irrelevante para suspensões + rejecting_media: rejeitando arquivos de mídia + rejecting_reports: rejeitando denúncias + severity: + silence: silenciado + suspend: suspenso show: affected_accounts: one: Uma conta no banco de dados foi afetada @@ -279,7 +287,7 @@ pt-BR: suspend: Retirar suspensão de todas as contas neste domínio title: Retirar bloqueio de domínio de %{domain} undo: Retirar - undo: Retirar + undo: Retirar bloqueio de domínio email_domain_blocks: add_new: Adicionar novo created_msg: Bloqueio de domínio de e-mail criado com sucesso @@ -294,7 +302,20 @@ pt-BR: back_to_account: Voltar para a conta title: Pessoas que seguem %{acct} instances: - title: Instâncias conhecidas + delivery_available: Entrega está disponível + known_accounts: + one: "%{count} conta conhecida" + other: "%{count} contas conhecidas" + moderation: + all: Todas + limited: Limitado + title: Moderação + title: Federação + total_blocked_by_us: Bloqueado por nós + total_followed_by_them: Seguidos por eles + total_followed_by_us: Seguidos por nós + total_reported: Denúncias sobre eles + total_storage: Mídias anexadas invites: deactivate_all: Desativar todos filter: @@ -535,8 +556,8 @@ pt-BR: explanation: Descobrir usuários baseado em seus interesses explore_mastodon: Explorar %{title} people: - one: "%{count} pessoas" - other: "%{count} pessoa" + one: "%{count} pessoa" + other: "%{count} pessoas" errors: '403': Você não tem permissão para ver esta página. '404': A página pela qual você está procurando não existe. @@ -559,7 +580,9 @@ pt-BR: size: Tamanho blocks: Você bloqueou csv: CSV + domain_blocks: Bloqueios de domínio follows: Você segue + lists: Listas mutes: Você silenciou storage: Armazenamento de mídia filters: @@ -708,10 +731,25 @@ pt-BR: no_account_html: Não tem uma conta? Você pode cadastrar-se aqui proceed: Prosseguir para seguir prompt: 'Você irá seguir:' + reason_html: "Por que esse passo é necessário? %{instance} pode não ser o servidor onde você se registrou, então precisamos redirecionar você para o seu servidor primeiro." + remote_interaction: + favourite: + proceed: Proceder para favoritar + prompt: 'Você quer favoritar este toot:' + reblog: + proceed: Proceder para compartilhar + prompt: 'Você quer compartilhar esse toot:' + reply: + proceed: Proceder para responder + prompt: 'Você quer responder à esse toot:' remote_unfollow: error: Erro title: Título unfollowed: Deixou de seguir + scheduled_statuses: + over_daily_limit: Você excedeu o limite de %{limit} toots planejados para esse dia + over_total_limit: Você excedeu o limite de %{limit} toots planejados + too_soon: A data planejada precisa ser no futuro sessions: activity: Última atividade browser: Navegador diff --git a/config/locales/ro.yml b/config/locales/ro.yml index 60a38b7c6..aa4d3c967 100644 --- a/config/locales/ro.yml +++ b/config/locales/ro.yml @@ -1,6 +1,8 @@ --- ro: about: + features: + not_a_product_title: Ești o persoană, nu un produs hosted_on: Mastodon găzduit de %{domain} accounts: posts: @@ -64,7 +66,7 @@ ro: success_msg: Contul tău a fost șterg. Nu mai poate fi recuperat :D warning_html: Doar ștergerea conținutului de pe acest server este garantată. Conținutul tău care a fost redistribuit în alte instațe e posibil să lase urme. Serverele deconecate sau care nu mai sunt abonate la actualizările contului tău nu își vor mai actualiza baza de date. directories: - explanation: Descoperă utilizatori în funcție de interesele lor + explanation: Descoperă oameni și companii în funcție de interesele lor explore_mastodon: Explorează %{title} people: few: "%{count} persoană" diff --git a/config/locales/simple_form.ar.yml b/config/locales/simple_form.ar.yml index ad94a9d5d..ef1d269ee 100644 --- a/config/locales/simple_form.ar.yml +++ b/config/locales/simple_form.ar.yml @@ -6,6 +6,8 @@ ar: text: بإمكانك استخدام نفس القواعد التي نجدها في التبويقات كعناوين الروابط والوسوم والإشارات admin_account_action: send_email_notification: سوف يتلقى المستخدم رسالة تُفسِّر ما حدث على حسابه + type_html: اختر ما تود إجراؤه على %{acct} + warning_preset_id: اختياري. يمكنك إضافة نص مخصص إلى نهاية النموذج defaults: autofollow: سوف يتابعك تلقائيًا الأشخاص الذين يقومون بالتسجيل من خلال الدعوة avatar: ملف PNG أو GIF أو JPG. حجمه على أقصى تصدير %{size}. سيتم تصغيره إلى %{dimensions}px @@ -22,6 +24,7 @@ ar: password: يُنصح باستخدام 8 أحرف على الأقل phrase: سوف يتم العثور عليه مهما كان نوع النص أو حتى و إن كان داخل الويب فيه تحذير عن المحتوى scopes: ما هي المجالات المسموح بها في التطبيق ؟ إن قمت باختيار أعلى المجالات فيمكنك الإستغناء عن الخَيار اليدوي. + setting_aggregate_reblogs: لا تقم بعرض المشارَكات الجديدة لتبويقات قد قُمتَ بمشاركتها سابقا (هذا الإجراء يعني المشاركات الجديدة فقط التي تلقيتَها) setting_default_language: يمكن الكشف التلقائي للّغة اللتي استخدمتها في تحرير تبويقاتك ، غيرَ أنّ العملية ليست دائما دقيقة setting_display_media_default: إخفاء الوسائط المُعيَّنة كحساسة setting_display_media_hide_all: إخفاء كافة الوسائط دائمًا @@ -41,6 +44,8 @@ ar: fields: name: التسمية value: المحتوى + account_warning_preset: + text: نموذج نصي admin_account_action: send_email_notification: إشعار المستخدِم عبر البريد الإلكتروني text: تحذير مخصص @@ -50,6 +55,7 @@ ar: none: لا تفعل شيئا silence: كتم suspend: تعليق و حذف كافة بيانات الحساب + warning_preset_id: استخدم نموذج تنبيه defaults: autofollow: إرسال دعوة لمتابعة حسابك avatar: الصورة الرمزية diff --git a/config/locales/simple_form.de.yml b/config/locales/simple_form.de.yml index 6d0a9196f..3958e315f 100644 --- a/config/locales/simple_form.de.yml +++ b/config/locales/simple_form.de.yml @@ -10,14 +10,14 @@ de: type_html: Wähle aus, was du mit %{acct} machen möchtest warning_preset_id: Optional. Du kannst immer noch eigenen Text an das Ende der Vorlage hinzufügen defaults: - autofollow: Leute die sich über deine Einladung registrieren werden dir automatisch folgen + autofollow: Leute, die sich über deine Einladung registrieren, werden dir automatisch folgen avatar: PNG, GIF oder JPG. Maximal %{size}. Wird auf %{dimensions} px herunterskaliert bot: Dieses Konto führt lediglich automatisierte Aktionen durch und wird möglicherweise nicht überwacht context: Ein oder mehrere Aspekte, wo der Filter greifen soll digest: Wenn du lange Zeit inaktiv bist, wird dir eine Zusammenfassung von Erwähnungen in deiner Abwesenheit zugeschickt - discoverable_html: Das Verzeichnis lässt dich neue Benutzerkonten finden basierend auf Interessen und Aktivitäten. Dies benötigt mindestens %{min_followers} Follower - email: Du wirst ein Bestätigungs-E-Mail erhalten - fields: Du kannst bis zu 4 Elemente als Tabelle dargestellt auf deinem Profil anzeigen lassen + discoverable_html: Das Verzeichnis lässt dich basierend auf Interessen und Aktivitäten neue Benutzerkonten finden. Dies benötigt mindestens %{min_followers} Follower + email: Du wirst eine Bestätigungs-E-Mail erhalten + fields: Du kannst bis zu 4 Elemente auf deinem Profil anzeigen lassen, die als Tabelle dargestellt werden header: PNG, GIF oder JPG. Maximal %{size}. Wird auf %{dimensions} px herunterskaliert inbox_url: Kopiere die URL von der Startseite des gewünschten Relays irreversible: Gefilterte Beiträge werden unwiderruflich gefiltert, selbst wenn der Filter später entfernt wurde @@ -26,16 +26,16 @@ de: password: Verwende mindestens 8 Zeichen phrase: Wird unabhängig vom umgebenen Text oder Inhaltswarnung eines Beitrags verglichen scopes: Welche Schnittstellen der Applikation erlaubt sind. Wenn du einen Top-Level-Scope auswählst, dann musst du nicht jeden einzelnen darunter auswählen. - setting_aggregate_reblogs: Zeige keine neuen Boosts für Beiträge, die nicht kürzlich geboostet wurden (dies betrifft nur neulich erhaltene Boosts) + setting_aggregate_reblogs: Zeige denselben Beitrag nicht nochmal an, wenn er erneut geteilt wurde (dies betrifft nur neulich erhaltene erneut geteilte Beiträge) setting_default_language: Die Sprache der Beiträge kann automatisch erkannt werden, aber dies ist nicht immer genau setting_display_media_default: Verstecke Medien, die als sensibel markiert sind setting_display_media_hide_all: Alle Medien immer verstecken setting_display_media_show_all: Medien, die als sensibel markiert sind, immer anzeigen - setting_hide_network: Wem du folgst und wer dir folgt wird in deinem Profil nicht angezeigt + setting_hide_network: Wem du folgst und wer dir folgt, wird in deinem Profil nicht angezeigt setting_noindex: Betrifft dein öffentliches Profil und deine Beiträge setting_theme: Wirkt sich darauf aus, wie Mastodon aussieht, egal auf welchem Gerät du eingeloggt bist. username: Dein Benutzer:innen-Name wird auf %{domain} nur einmal vorkommen - whole_word: Wenn das Schlüsselwort oder -phrase nur Buchstaben und Zahlen enthält, wird es nur angewendet werden, wenn es dem ganzen Wort entspricht + whole_word: Wenn das Schlagwort oder die Phrase nur Buchstaben und Zahlen enthält, wird es nur angewendet, wenn es dem ganzen Wort entspricht imports: data: CSV-Datei, die aus einer anderen Mastodon-Instanz exportiert wurde sessions: @@ -60,7 +60,7 @@ de: suspend: Deaktivieren und unwiderruflich Benutzerdaten löschen warning_preset_id: Benutze eine Warnungsvorlage defaults: - autofollow: Einladen, um deinen Account zu folgen + autofollow: Einladen, um deinem Account zu folgen avatar: Profilbild bot: Dieser Benutzer ist ein Bot chosen_languages: Sprachen filtern @@ -76,7 +76,7 @@ de: fields: Profil-Metadaten header: Kopfbild inbox_url: Inbox-URL des Relays - irreversible: Fallen lassen anstatt es zu verstecken + irreversible: Verwerfen statt verstecken locale: Sprache der Benutzeroberfläche locked: Gesperrtes Profil max_uses: Maximale Verwendungen @@ -85,33 +85,33 @@ de: otp_attempt: Zwei-Faktor-Authentisierungs-Code password: Passwort phrase: Schlagwort oder Phrase - setting_aggregate_reblogs: Gruppenboosts in Zeitleisten + setting_aggregate_reblogs: Gruppiere erneut geteilte Beiträge in Zeitleisten setting_auto_play_gif: Animierte GIFs automatisch abspielen setting_boost_modal: Bestätigungsdialog anzeigen, bevor ein Beitrag geteilt wird setting_default_language: Beitragssprache setting_default_privacy: Beitragssichtbarkeit - setting_default_sensitive: Medien immer als heikel markieren + setting_default_sensitive: Medien immer als sensibel markieren setting_delete_modal: Bestätigungsdialog anzeigen, bevor ein Beitrag gelöscht wird setting_display_media: Medien-Anzeige setting_display_media_default: Standard setting_display_media_hide_all: Alle verstecken setting_display_media_show_all: Alle anzeigen - setting_expand_spoilers: Toots mit Inhaltswarnungen immer ausklappen + setting_expand_spoilers: Beiträge mit Inhaltswarnungen immer ausklappen setting_hide_network: Blende dein Netzwerk aus setting_noindex: Suchmaschinen-Indexierung verhindern setting_reduce_motion: Bewegung in Animationen verringern setting_system_font_ui: Standardschriftart des Systems verwenden setting_theme: Theme der Website - setting_unfollow_modal: Bestätigungsdialog anzeigen, bevor jemand entfolgt wird + setting_unfollow_modal: Bestätigungsdialog anzeigen, bevor jemandem entfolgt wird severity: Schweregrad type: Importtyp username: Profilname - username_or_email: Profilname oder Email + username_or_email: Profilname oder E-Mail whole_word: Ganzes Wort interactions: must_be_follower: Benachrichtigungen von Nicht-Folgenden blockieren must_be_following: Benachrichtigungen von Profilen blockieren, denen ich nicht folge - must_be_following_dm: Private Nachrichten von Profilen denen ich nicht folge blockieren + must_be_following_dm: Private Nachrichten von Profilen, denen ich nicht folge, blockieren notification_emails: digest: Schicke Übersichts-E-Mails favourite: E-Mail senden, wenn jemand meinen Beitrag favorisiert diff --git a/config/locales/simple_form.fr.yml b/config/locales/simple_form.fr.yml index 21f81ecc2..730a69522 100644 --- a/config/locales/simple_form.fr.yml +++ b/config/locales/simple_form.fr.yml @@ -8,7 +8,7 @@ fr: send_email_notification: L'utilisateur recevra une explication de ce qu'il s'est passé avec son compte text_html: Optionnel. Vous pouvez utilisez la syntaxe des pouets. Vous pouvez ajouter des présélections d'attention pour économiser du temps type_html: Choisir que faire avec %{acct} - warning_preset_id: Optionnel. Vous pouvez toujours ajouter un texte personnalisé à la fin de le présélection + warning_preset_id: Optionnel. Vous pouvez toujours ajouter un texte personnalisé à la fin de la présélection defaults: autofollow: Les personnes qui s’inscrivent grâce à l’invitation vous suivront automatiquement avatar: Au format PNG, GIF ou JPG. %{size} maximum. Sera réduit à %{dimensions}px @@ -58,7 +58,7 @@ fr: none: Ne rien faire silence: Silence suspend: Suspendre et effacer les données du compte de manière irréversible - warning_preset_id: Utiliser une présélection d'attention + warning_preset_id: Utiliser un modèle d'avertissement defaults: autofollow: Invitation à suivre votre compte avatar: Image de profil diff --git a/config/locales/simple_form.nl.yml b/config/locales/simple_form.nl.yml index ce56f613a..6eb784c30 100644 --- a/config/locales/simple_form.nl.yml +++ b/config/locales/simple_form.nl.yml @@ -2,6 +2,13 @@ nl: simple_form: hints: + account_warning_preset: + text: Je kunt voor toots specifieke tekst gebruiken, zoals URL's, hashtags en vermeldingen + admin_account_action: + send_email_notification: De gebruiker ontvangt een uitleg over wat er met hun account is gebeurd + text_html: Optioneel. Je kunt voor toots specifieke tekst gebruiken. Om tijd te besparen kun je voorinstellingen van waarschuwingen toevoegen + type_html: Kies wat er met %{acct} moet gebeuren + warning_preset_id: Optioneel. Je kunt nog steeds handmatig tekst toevoegen aan het eind van de voorinstelling defaults: autofollow: Mensen die zich via de uitnodiging hebben geregistreerd, volgen jou automatisch avatar: PNG, GIF of JPG. Maximaal %{size}. Wordt teruggeschaald naar %{dimensions}px @@ -32,7 +39,7 @@ nl: imports: data: CSV-bestand dat op een andere Mastodonserver werd geëxporteerd sessions: - otp: Voer de tweestaps-aanmeldcode vanaf jouw mobiele telefoon in of gebruik een van jouw herstelcodes. + otp: 'Voer de tweestaps-aanmeldcode vanaf jouw mobiele telefoon in of gebruik een van jouw herstelcodes:' user: chosen_languages: Alleen toots in de aangevinkte talen worden op de openbare tijdlijnen getoond labels: @@ -50,6 +57,7 @@ nl: disable: Uitschakelen none: Niets doen silence: Negeren + suspend: Opschorten en onomkeerbaar accountgegevens verwijderen warning_preset_id: Gebruik een voorinstelling van een waarschuwing defaults: autofollow: Uitnodigen om jouw account te volgen @@ -106,7 +114,7 @@ nl: must_be_following_dm: Directe berichten van mensen die jij niet volgt blokkeren notification_emails: digest: Periodiek e-mails met een samenvatting versturen - favourite: Een e-mail versturen wanneer iemand jouw toot als favoriet markeert + favourite: Een e-mail versturen wanneer iemand jouw toot aan hun favorieten heeft toegevoegd follow: Een e-mail versturen wanneer iemand jou volgt follow_request: Een e-mail versturen wanneer iemand jou wil volgen mention: Een e-mail versturen wanneer iemand jou vermeld diff --git a/config/locales/simple_form.pl.yml b/config/locales/simple_form.pl.yml index b0bc564aa..bbc55e8a9 100644 --- a/config/locales/simple_form.pl.yml +++ b/config/locales/simple_form.pl.yml @@ -2,6 +2,13 @@ pl: simple_form: hints: + account_warning_preset: + text: Możesz korzystać ze składni której używasz we wpisach, takiej jak adresy URL, hashtagi i wspomnienia + admin_account_action: + send_email_notification: Użytkownik otrzyma informację, co stało się z jego kontem + text_html: Możesz używać składni której używasz we wpisach. Możesz dodać szablon ostrzeżenia aby zaoszczędzić czas + type_html: Wybierz co chcesz zrobić z %{acct} + warning_preset_id: Nieobowiązkowe. Możesz dodać niestandardowy tekst do końcowki szablonu defaults: autofollow: Osoby, które zarejestrują się z Twojego zaproszenia automatycznie zaczną Cię śledzić avatar: PNG, GIF lub JPG. Maksymalnie %{size}. Zostanie zmniejszony do %{dimensions}px @@ -9,6 +16,7 @@ pl: context: Jedno lub wiele miejsc, w których filtr zostanie zastosowany digest: Wysyłane tylko po długiej nieaktywności, jeżeli w tym czasie otrzymaleś jakąś wiadomość bezpośrednią discoverable_html: Katalog pozwala znaleźć konta na podstawie zainteresowań i aktywności. Profil musi śledzić przynajmniej %{min_followers} osób + email: Otrzymasz e-mail potwierdzający fields: Możesz ustawić maksymalnie 4 niestandardowe pola wyświetlane jako tabela na Twoim profilu header: PNG, GIF lub JPG. Maksymalnie %{size}. Zostanie zmniejszony do %{dimensions}px inbox_url: Skopiuj adres ze strony głównej przekaźnika, którego chcesz użyć @@ -18,11 +26,15 @@ pl: password: Użyj co najmniej 8 znaków phrase: Zostanie wykryte nawet, gdy znajduje się za ostrzeżeniem o zawartości scopes: Wybór API, do których aplikacja będzie miała dostęp. Jeżeli wybierzesz nadrzędny zakres, nie musisz wybierać jego elementów. + setting_aggregate_reblogs: Nie pokazuj nowych podbić dla wpisów, które zostały niedawno podbite (dotyczy tylko nowo otrzymanych podbić) setting_default_language: Język Twoich wpisów może być wykrywany automatycznie, ale nie zawsze jest to dokładne + setting_display_media_default: Ukrywaj zawartość oznaczoną jako wrażliwa + setting_display_media_hide_all: Zawsze ukrywaj zawartość multimedialną setting_display_media_show_all: Zawsze pokazuj zawartość multimedialną jako wrażliwą setting_hide_network: Informacje o tym, kto Cię śledzi i kogo śledzisz nie będą widoczne setting_noindex: Wpływa na widoczność strony profilu i Twoich wpisów setting_theme: Zmienia wygląd Mastodona po zalogowaniu z dowolnego urządzenia. + username: Twoja nazwa użytkownika będzie niepowtarzalna na %{domain} whole_word: Jeśli słowo lub fraza składa się jedynie z liter lub cyfr, filtr będzie zastosowany tylko do pełnych wystąpień imports: data: Plik CSV wyeksportowany z innej instancji Mastodona @@ -35,6 +47,18 @@ pl: fields: name: Nazwa value: Zawartość + account_warning_preset: + text: Tekst szablonu + admin_account_action: + send_email_notification: Powiadom użytkownika mailem + text: Niestandardowe ostrzeżenie + type: Działanie + types: + disable: Wyłącz + none: Nie rób niczego + silence: Wycisz + suspend: Zawieś i nieodwracalnie usuń dane konta + warning_preset_id: Użyj szablonu ostrzeżenia defaults: autofollow: Zapraszaj do śledzenia swojego konta avatar: Awatar @@ -62,14 +86,18 @@ pl: password: Hasło phrase: Słowo kluczowe lub fraza scopes: Do których API aplikacja będzie miała dostęp. Jeżeli wybierzesz zakres wyższego poziomu, nie musisz zaznaczać bardziej szczegółowych. + setting_aggregate_reblogs: Grupuj podbicia na osiach czasu setting_auto_play_gif: Automatycznie odtwarzaj animowane GIFy setting_boost_modal: Pytaj o potwierdzenie przed podbiciem setting_default_language: Język wpisów setting_default_privacy: Widoczność wpisów setting_default_sensitive: Zawsze oznaczaj zawartość multimedialną jako wrażliwą setting_delete_modal: Pytaj o potwierdzenie przed usunięciem wpisu + setting_display_media: Wyświetlanie zawartości multimedialnej + setting_display_media_default: Domyślne setting_display_media_hide_all: Ukryj wszystko setting_display_media_show_all: Pokaż wszystko + setting_expand_spoilers: Zawsze rozwijaj wpisy oznaczone ostrzeżeniem o zawartości setting_hide_network: Ukryj swoją sieć setting_noindex: Nie indeksuj mojego profilu w wyszukiwarkach internetowych setting_reduce_motion: Ogranicz ruch w animacjach diff --git a/config/locales/simple_form.sk.yml b/config/locales/simple_form.sk.yml index 48363ea19..f2d26cf02 100644 --- a/config/locales/simple_form.sk.yml +++ b/config/locales/simple_form.sk.yml @@ -20,13 +20,13 @@ sk: fields: Až štyri položky môžeš mať na svojom profile zobrazené vo forme tabuľky header: PNG, GIF, alebo JPG. Maximálne %{size}. Bude zmenšený na %{dimensions}px inbox_url: Skopíruj adresu z hlavnej stránky mostíka, ktorý chceš používať - irreversible: Vytriedené hlášky zmiznú nenávratne, aj keď triedenie neskôr zrušíš - locale: Jazyk užívateľského rozhrania, emailových a nástenkových oboznámení - locked: Vyžaduje manuálne schvalovať sledujúcich + irreversible: Vytriedené príspevky zmiznú nenávratne, aj keď triedenie neskôr zrušíš + locale: Jazyk užívateľského rozhrania, emailových, a nástenkových oboznámení + locked: Vyžaduje, aby si manuálne schvaľoval/a následovateľov password: Zadaj aspoň osem znakov phrase: Zhoda sa nájde nezávisle od toho, či je text napísaný, veľkými, alebo malými písmenami, či už v tele, alebo v hlavičke scopes: Ktoré API budú povolené aplikácii pre prístup. Ak vyberieš vrcholný stupeň, nemusíš už potom vyberať po jednom. - setting_aggregate_reblogs: Neukazuj nové vyzdvihnutia pre hlášky, ktoré už boli len nedávno povýšené (týka sa iba nanovo získaných vyzdvihnutí) + setting_aggregate_reblogs: Neukazuj nové vyzdvihnutia pre príspevky, ktoré už boli len nedávno povýšené (týka sa iba nanovo získaných vyzdvihnutí) setting_default_language: Jazyk tvojích príspevkov môže byť zistený automaticky, ale nieje to vždy presné setting_display_media_default: Skryť médiá označené ako citlivé setting_display_media_hide_all: Vždy ukryť všetky médiá diff --git a/config/locales/simple_form.sr.yml b/config/locales/simple_form.sr.yml index c6294d4ba..7e3c6685e 100644 --- a/config/locales/simple_form.sr.yml +++ b/config/locales/simple_form.sr.yml @@ -2,12 +2,21 @@ sr: simple_form: hints: + account_warning_preset: + text: Можете користити синтаксу труба, као што су нпр. УРЛ-ова, тарабе и помињања + admin_account_action: + send_email_notification: Корисник ће добити објашњење тога шта му се десило са налога + text_html: Опционално. Можете користити синтаксу труба. Можете додати упозоравајућа преподешавање да сачувате време + type_html: Изаберите шта да радите са %{acct} + warning_preset_id: Опционално. Можете и даље додати прилагођени текст на крај пресета defaults: autofollow: Особе које се пријаве кроз позивнице ће вас аутоматски запратити avatar: PNG, GIF или JPG. Највише %{size}. Биће смањена на %{dimensions}px bot: Овај налог углавном врши аутоматизоване радње и можда се не надгледа context: Један или више контекста у којима треба да се примени филтер digest: Послато после дужег периода неактивности са прегледом свих битних ствари које сте добили док сте били одсутни + discoverable_html: Директоријум омогућава људима да пронађу налоге засноване на интересима и активности. Захтева бар %{min_followers} пратиоца + email: Биће вам послата е-пошта са потврдом fields: Можете имати до 4 ставке приказане као табела на вашем профилу header: PNG, GIF или JPG. Највише %{size}. Биће смањена на %{dimensions}px inbox_url: Копирајте URL са насловне стране релеја који желите користити @@ -17,10 +26,15 @@ sr: password: Користите најмање 8 знакова phrase: Биће упарена без обзира на велико или мало слово у тексту или упозорења о садржају трубе scopes: Којим API-јима ће апликација дозволити приступ. Ако изаберете опсег највишег нивоа, не морате одабрати појединачне. + setting_aggregate_reblogs: Не показуј нова дељења за трубе које су недавно подељене (утиче само на недавно примљена дељења) setting_default_language: Језик ваших труба може бити аутоматски откривен, али није увек прецизан + setting_display_media_default: Сакриј медије означене као осетљиве + setting_display_media_hide_all: Увек сакриј све медије + setting_display_media_show_all: Увек прикажи медије означене као осетљиве setting_hide_network: Кога пратите и ко вас прати неће бити приказано на вашем профилу setting_noindex: Утиче на Ваш јавни профил и статусне стране setting_theme: Утиче како ће Мастодонт изгледати када сте пријављени са било ког уређаја. + username: Ваш надимак ће бити јединствен на %{domain} whole_word: Када је кључна реч или фраза искључиво алфанумеричка, биће примењена само ако се подудара са целом речи imports: data: CSV фајл извезен са друге Мастодонт инстанце @@ -33,6 +47,18 @@ sr: fields: name: Етикета value: Садржај + account_warning_preset: + text: Текст пресета + admin_account_action: + send_email_notification: Обавести корисника преко е-поште + text: Прилагођено упозорење + type: Радња + types: + disable: Онемогући + none: Не ради ништа + silence: Утишај + suspend: Обуставите и неповратно избришите податке о налогу + warning_preset_id: Користи упозоравајући пресет defaults: autofollow: Позовите да прати ваш налог avatar: Аватар @@ -43,6 +69,7 @@ sr: context: Филтрирај контексте current_password: Тренутна лозинка data: Подаци + discoverable: Наведите овај налог у фасцикли display_name: Име за приказ email: Адреса е-поште expires_in: Истиче након @@ -58,12 +85,18 @@ sr: otp_attempt: Двофакторски код password: Лозинка phrase: Кључна реч или фраза + setting_aggregate_reblogs: Групиши дељења у временским линијама setting_auto_play_gif: Аутоматски пуштај анимиране GIF-ове setting_boost_modal: Прикажи дијалог за потврду пре давања подршке setting_default_language: Језик објављивања setting_default_privacy: Приватност објава setting_default_sensitive: Увек означи мултимедију као осетљиву setting_delete_modal: Прикажи дијалог за потврду пре брисања тута + setting_display_media: Приказ медија + setting_display_media_default: Подразумевано + setting_display_media_hide_all: Сакриј све + setting_display_media_show_all: Прикажи све + setting_expand_spoilers: Увек прошити трубе које су означене упозорењем садржаја setting_hide_network: Сакриј своју мрежу setting_noindex: Одјави се од индексирања search engine-а setting_reduce_motion: Смањи покрете у анимацијама diff --git a/config/locales/sk.yml b/config/locales/sk.yml index 91d1fdb8f..d8a81bbbf 100644 --- a/config/locales/sk.yml +++ b/config/locales/sk.yml @@ -1,16 +1,16 @@ --- sk: about: - about_hashtag_html: Toto sú verejné hlášky otagované #%{hashtag}. Ak máš účet niekde vo fediverse, môžeš ich využívať. - about_mastodon_html: Mastodon je sociálna sieť založená na otvorených webových protokoloch a na slobodnom, otvorenom softvéri. Je decentralizovaná podobne ako email. + about_hashtag_html: Toto sú verejné príspevky otagované pod #%{hashtag}. Ak máš účet hocikde v rámci fediversa, môžeš ich využívať. + about_mastodon_html: Mastodon je sociálna sieť založená na otvorených webových protokoloch a na slobodnom softvéri. Je decentralizovaná, podobne ako email. about_this: O tejto instancii administered_by: 'Správcom je:' api: API - apps: Mobilné aplikácie - closed_registrations: Registrácie sú na tomto serveri momentálne uzatvorené. Avšak, môžeš nájsť nejaký iný Mastodon server kde si založ účet a získaj tak prístup do presne tej istej siete, odtiaľ. + apps: Aplikácie + closed_registrations: Registrácie sú na tomto serveri momentálne uzatvorené. Avšak, môžeš nájsť nejaký iný Mastodon server kde si založ účet a získaj tak prístup do presne tej istej siete odtiaľ. contact: Kontakt - contact_missing: Nezadané - contact_unavailable: Neuvedené + contact_missing: Nezadaný + contact_unavailable: Neuvedený documentation: Dokumentácia extended_description_html: |

Pravidlá

@@ -50,8 +50,8 @@ sk: one: Sledujúci other: Sledovatelia following: Sledovaní - joined: Pridal/a sa %{date} - last_active: poslednýkrát aktívny + joined: Pridal/a sa v %{date} + last_active: naposledy aktívny link_verified_on: Vlastníctvo tohto odkazu bolo skontrolované %{date} media: Médiá moved_html: "%{name} účet bol presunutý na %{new_profile_link}:" @@ -89,13 +89,14 @@ sk: change_email: changed_msg: Email k tomuto účtu bol úspešne zmenený! current_email: Súčastný email - label: Zmeniť email + label: Zmeň email new_email: Nový email - submit: Zmeniť email + submit: Zmeň email title: Zmeň email pre %{username} confirm: Potvrdiť confirmed: Potvrdený confirming: Potvrdzujúci + deleted: Zmazané demote: Degradovať disable: Zablokovať disable_two_factor_authentication: Zakázať 2FA @@ -103,18 +104,19 @@ sk: display_name: Zobraziť meno domain: Doména edit: Uprav - email: Emailová adresa + email: Email email_status: Stav emailu enable: Povoliť enabled: Povolený feed_url: URL časovej osi followers: Sledujúci - followers_local: "(%{local} local)" followers_url: URL sledujúcich follows: Sledovania header: Hlavička inbox_url: URL prijatých správ + invited_by: Pozvaný/á užívateľom ip: IP + joined: Pridal/a sa location: all: Všetko local: Miestne @@ -127,7 +129,7 @@ sk: active: Aktívny/a all: Všetko silenced: Umlčané - suspended: Suspendované + suspended: Vylúčený/á title: Moderácia moderation_notes: Moderátorské poznámky most_recent_activity: Posledná aktivita @@ -141,7 +143,7 @@ sk: protocol: Protokol public: Verejná os push_subscription_expires: PuSH odoberanie expiruje - redownload: Obnoviť avatar + redownload: Obnov profil remove_avatar: Odstrániť avatár remove_header: Odstráň hlavičku resend_confirmation: @@ -161,8 +163,8 @@ sk: search: Hľadať shared_inbox_url: URL zdieľanej schránky show: - created_reports: Reportované týmto používateľom - targeted_reports: Nahlásenia pre tento účet + created_reports: Vytvorené hlásenia + targeted_reports: Nahlásenia od ostatných silence: Stíšiť silenced: Utíšení statuses: Príspevky @@ -174,6 +176,7 @@ sk: undo_suspension: Zrušiť suspendáciu unsubscribe: Prestaň odoberať username: Prezývka + warn: Varovať web: Web action_logs: actions: @@ -257,7 +260,7 @@ sk: week_users_active: aktívni tento týždeň week_users_new: užívateľov počas tohto týždňa domain_blocks: - add_new: Pridať nový + add_new: Pridaj nové doménové blokovanie created_msg: Doména je v procese blokovania destroyed_msg: Blokovanie domény bolo zrušené domain: Doména @@ -274,17 +277,22 @@ sk: reject_media_hint: Zmaže lokálne uložené súbory médií a odmietne ich sťahovanie v budúcnosti. Irelevantné pre suspendáciu reject_reports: Zamietni hlásenia reject_reports_hint: Ignoruj všetky hlásenia prichádzajúce z tejto domény. Nevplýva na blokovania + rejecting_media: odmietanie médiálnych súborov + rejecting_reports: odmietané hlásenia + severity: + silence: utíšené + suspend: vylúčený show: affected_accounts: few: "%{count} účty v databáze ovplyvnených" - one: Jeden účet v databáze ovplyvnený - other: "%{count} účtov v databáze ovplyvnených" + one: Jeden účet v databáze bol ovplyvnený + other: "%{count} účtov v databáze bolo ovplyvnených" retroactive: - silence: Zrušiť stíšenie všetkých existujúcich účtov z tejto domény - suspend: Zrušiť suspendáciu všetkých existujúcich účtov z tejto domény - title: Zrušiť blokovanie domény pre %{domain} + silence: Zruš stíšenie všetkých existujúcich účtov z tejto domény + suspend: Zruš suspendáciu všetkých existujúcich účtov z tejto domény + title: Zruš blokovanie domény %{domain} undo: Vrátiť späť - undo: Späť + undo: Odvolaj blokovanie domény email_domain_blocks: add_new: Pridaj nový created_msg: Emailová doména bola úspešne pridaná do zoznamu zakázaných @@ -299,7 +307,21 @@ sk: back_to_account: Späť na účet title: Následovatielia užívateľa %{acct} instances: - title: Známe instancie + delivery_available: Je v dosahu doručovania + known_accounts: + few: "%{count} známe účty" + one: "%{count} známy účet" + other: "%{count} známe účty" + moderation: + all: Všetky + limited: Obmedzené + title: Moderácia + title: Federácia + total_blocked_by_us: Nami blokované + total_followed_by_them: Nimi sledované + total_followed_by_us: Nami sledované + total_reported: Nahlásenia o nich + total_storage: Mediálne prílohy invites: deactivate_all: Pozastaviť všetky filter: @@ -398,13 +420,13 @@ sk: desc_html: Povoliť každému aby si mohli vytvoriť účet title: Verejná registrácia show_known_fediverse_at_about_page: - desc_html: Pokiaľ je zapnuté, bude v ukážke osi možné nahliadnúť príspevky z celého známeho fediversa. Inak budú ukázané iba hlášky z miestnej osi. - title: Ukázať celé známe fediversum na náhľade osi + desc_html: Pokiaľ je zapnuté, bude v ukážke osi možné nahliadnúť príspevky z celého známeho fediversa. Inak budú ukázané iba príspevky z miestnej osi. + title: Ukáž celé známe fediverse na náhľade osi show_staff_badge: - desc_html: Zobraz moderátorsku značku na užívateľovej stránke - title: Zobraziť značku moderátora + desc_html: Zobraz moderátorsky odznak na užívateľovom profile + title: Zobraz značku moderátora site_description: - desc_html: Oboznamujúci paragraf na hlavnej stránke a pri meta tagoch. Môžete použiť HTML kód, presnejšie < a> a < em> . + desc_html: Oboznamujúci paragraf na hlavnej stránke a pri meta tagoch. Opíš, čo robí tento Mastodon server špecifickým, a ďalej hocičo iné, čo považuješ za dôležité. Môžeš použiť HTML kód, hlavne < a >, ale tiež <>. title: Popis instancie site_description_extended: desc_html: Toto je vhodné miesto pre vaše pravidlá, oboznámenia a iné veci, ktorými je vaša instancia špecifická. Je možné tu používať HTML kód @@ -537,8 +559,11 @@ sk: warning_title: Dostupnosť rozšírovaného obsahu directories: directory: Katalóg profilov + enabled: Momentálne si uvedený/á na zozname profilov. + enabled_but_waiting: Vyjadril/a si záujem o uvedenie na zozname profilov, lenže ešte nemáš minimálny vyžadovaný počet následovateľov (%{min_followers}), aby si tam bol/a uveden/á. explanation: Pátraj po užívateľoch podľa ich záujmov explore_mastodon: Prebádaj %{title} + how_to_enable: Momentálne niesi zaradený/á do verejnej profilovej databázy. Prihlásiť sa môžeš nižšie. Použi haštagy vo svojom biografickom popise na profile, ak chceš byť uvedený/á aj pod konkrétnými haštagmi! people: few: "%{count} ľudia" one: "%{count} človek" @@ -565,7 +590,9 @@ sk: size: Veľkosť blocks: Blokujete csv: CSV + domain_blocks: Blokované domény follows: Následujete + lists: Zoznamy mutes: Stíšil/a si storage: Úložisko médií filters: @@ -718,10 +745,25 @@ sk: no_account_html: Nemáš ešte účet? Môžeš sa zaregistrovať tu proceed: Začni následovať prompt: 'Budeš sledovať:' + reason_html: "Načo je tento krok potrebný? %{instance} nemusí byť práve tým serverom na ktorom si zaregistrovaný/á, takže je ťa najprv potrebné presmerovať na tvoj domáci server." + remote_interaction: + favourite: + proceed: Pokračuj k obľúbeniu + prompt: 'Chceš si obľúbiť tento príspevok:' + reblog: + proceed: Pokračuj k vyzdvihnutiu + prompt: 'Chceš vyzdvihnúť tento príspevok:' + reply: + proceed: Pokračuj odpovedaním + prompt: 'Chceš odpovedať na tento príspevok:' remote_unfollow: error: Chyba title: Názov unfollowed: Už nesleduješ + scheduled_statuses: + over_daily_limit: Prekročil/a si denný limit %{limit} predplánovaných príspevkov + over_total_limit: Prekročil/a si limit %{limit} predplánovaných príspevkov + too_soon: Dátum musí byť stanovený do budúcnosti sessions: activity: Najnovšia aktivita browser: Prehliadač @@ -827,7 +869,7 @@ sk:
  • Základné informácie o účte: Ak sa na tomto serveri zaregistruješ, budeš môcť byť požiadaný/á zadať prezývku, emailovú adresu a heslo. Budeš tiež môcť zadať aj ďalšie profilové údaje, ako napríklad meno a životopis, a nahrať profilovú fotku aj obrázok v záhlaví. Tvoja prezývka, meno, životopis, profilová fotka a obrázok v záhlaví sú vždy zobrazené verejne.
  • Príspevky, sledovania a iné verejné informácie: Zoznam ľudí, ktorých sleduješ je zobrazený verejne, a to isté platí aj pre zoznam tvojích následovateľov. Keď pošleš správu, ukladá sa jej dátum a čas, ale aj z akej aplikácie bola poslaná. Správy môžu obsahovať mediálne prílohy, ako obrázky a videá. Verejné, a nezaradené príspevky sú verejne prístupné. Keď si pripneš príspevok na svoj profil, toto je tiež verejne dostupnou informáciou. Tvoje príspevky sú takisto doručené tvojím sledovateľom, a to aj v rámci iných serverov, kde je potom uložená kópia tvojho príspevku. Ak vymažeš príspevok, táto akcia bude takisto doručená tvojím sledovateľom. Vyzdvihnutie, alebo obľúbenie iného príspevku je vždy verejne viditeľné.
  • -
  • Priame príspevky, a príspevky iba pre sledovateľov: Všetky príspevky sú uložené a spracované na serveri. Príspevky iba pre sledovateľov sú doručené tvojím sledovateľom a užívateľom ktorí sú v nich spomenutí, pričom priame príspevky sú doručené iba tím užívateľom ktorí sú v nich spomenutí. V niektorých prípadoch to môže znamenať, že tieto príspevkz sú doručené aj vrámci iných serverov, a kópie príspevkov sú tam uložené. +
  • Priame príspevky, a príspevky iba pre sledovateľov: Všetky príspevky sú uložené a spracované na serveri. Príspevky iba pre sledovateľov sú doručené tvojím sledovateľom a užívateľom ktorí sú v nich spomenutí, pričom priame príspevky sú doručené iba tím užívateľom ktorí sú v nich spomenutí. V niektorých prípadoch to môže znamenať, že tieto príspevkz sú doručené aj v rámci iných serverov, a kópie príspevkov sú na nich uložené. V dobrej viere robíme všetko preto, aby bol prístup k tímto príspevkom vymedzený iba pre oprávnených používateľov, ale môže sa stať, že iné servery v tomto ohľade zlyhajú. Preto je dôležité prezrieť si a zhodnotiť, na aké servery patria tvoji následovatelia. V nastaveniach si môžeš zapnúť voľbu ručne povoľovať a odmietať nových následovateľov. Prosím maj na pamäti, že správcovia tvojho, aj vzdialeného obdŕžiavajúceho servera majú možnosť vidieť dané príspevky a správy, ale aj že obdŕžitelia týchto správ si ich môzu odfotiť, skopírovať, alebo ich inak zdieľať. Nezdieľaj žiadne nebezpečné, alebo ohrozujúce správy pomocou Mastodonu!
  • @@ -870,8 +912,8 @@ sk: warning: explanation: disable: Pokiaľ je tvoj účet zamrazený, tvoje dáta zostávajú nedoknuté, ale nemôžeš v rámci neho nič robiť, až kým nebude odomknutý. - silence: Kým je tvoj účet obmedzený, tvoje hlášky na tomto serveri uvidia iba tí ľudia, ktorí ťa už následujú, a môžeš byť vylúčený/á z rôznych verejných záznamov. Ostatní ťa však stále budú môcť následovať manuálne. - suspend: Tvoj účet bol vylúčený, a všetky tvoje hlášky a nahraté médiálné súbory boli nenávratne zmazané z tohto serveru, a zo serverov na ktorých si mal následovateľov. + silence: Kým je účet obmedzený, tvoje príspevky na tomto serveri uvidia iba tí ľudia, ktorí ťa už následujú, a môžeš byť vylúčený/á z rôznych verejných záznamov. Ostatní ťa však stále budú môcť následovať manuálne. + suspend: Tvoj účet bol vylúčený, a všetky tvoje príspevky a nahraté médiálné súbory boli nenávratne zmazané z tohto serveru, a zo serverov na ktorých si mal následovateľov. review_server_policies: Prehodnoť pravidlá servera subject: disable: Tvoj účet %{acct} bol zamrazený diff --git a/config/locales/sr.yml b/config/locales/sr.yml index e78a9b817..1d373ed67 100644 --- a/config/locales/sr.yml +++ b/config/locales/sr.yml @@ -54,6 +54,7 @@ sr: other: Пратиоци following: Пратим joined: Придружио/ла се %{date} + last_active: последњи активни link_verified_on: Власништво над овом везом је проверено %{date} media: Медији moved_html: "%{name} је прешао на %{new_profile_link}:" @@ -77,6 +78,9 @@ sr: moderator: Модератор unfollow: Отпрати admin: + account_actions: + action: Извршите радњу + title: Извршите модераторске радње на %{acct} account_moderation_notes: create: Оставите белешку created_msg: Модераторска белешка успешно направљена! @@ -88,14 +92,15 @@ sr: by_domain: Домен change_email: changed_msg: Е-пошта налога успешно промењена! - current_email: Тренутна Е-пошта - label: Промените Е-пошту - new_email: Нова Е-пошта - submit: Промените Е-пошту - title: Промените Е-пошту за %{username} + current_email: Тренутна е-пошта + label: Промените е-пошту + new_email: Нова e-пошта + submit: Промените e-пошту + title: Промените e-пошту за %{username} confirm: Потврди confirmed: Потврђено confirming: Потврдување + deleted: Избрисано demote: Ражалуј disable: Искључи disable_two_factor_authentication: Искључи 2FA @@ -104,15 +109,18 @@ sr: domain: Домен edit: Измени email: Е-пошта - email_status: Е-пошта статус + email_status: Статус е-поште enable: Омогући enabled: Укључено feed_url: Адреса довода followers: Пратиоци followers_url: Адреса пратиоца follows: Праћени + header: Заглавље inbox_url: Адреса сандучета + invited_by: Позван од стране ip: IP + joined: Придружио се location: all: Све local: Локалне @@ -122,6 +130,7 @@ sr: media_attachments: Мултимедијални прилози memorialize: Пребаци у in memoriam moderation: + active: Активан all: Сви silenced: Ућуткани suspended: Суспендовани @@ -138,8 +147,9 @@ sr: protocol: Протокол public: Јавно push_subscription_expires: PuSH претплата истиче - redownload: Освежи аватар + redownload: Освежи профил remove_avatar: Уклони аватар + remove_header: Одстрани заглавље resend_confirmation: already_confirmed: Овој корисник е веќе потврден send: Препрати го е-мајлот за потврда @@ -157,25 +167,27 @@ sr: search: Претрага shared_inbox_url: Адреса дељеног сандучета show: - created_reports: Пријаве које је направио овај налог - targeted_reports: Пријаве направљене о овом налогу + created_reports: Направљени извештаји + targeted_reports: Пријаве од стране других silence: Ућуткај silenced: Ућуткан statuses: Статуси subscribe: Претплати се suspended: Суспендовани title: Налози - unconfirmed_email: Непотврђена Е-пошта + unconfirmed_email: Непотврђена е-пошта undo_silenced: Укини ћутање undo_suspension: Укини суспензију unsubscribe: Укини претплату username: Корисничко име + warn: Упозори web: Веб action_logs: actions: assigned_to_self_report: "%{name} је доделио/ла извештај %{target} себи" change_email_user: "%{name} је променио/ла адресу Е-поште коисника/це %{target}" confirm_user: "%{name} је потврдио адресу е-поште корисника %{target}" + create_account_warning: "%{name} је послао пријаву %{target}" create_custom_emoji: "%{name} је отпремио нови емоџи %{target}" create_domain_block: "%{name} је блокирао домен %{target}" create_email_domain_block: "%{name} је ставио на црну листу домен е-поште %{target}" @@ -234,6 +246,7 @@ sr: config: Конфигурација feature_deletions: Брисање налога feature_invites: Позивнице + feature_profile_directory: Фасцикла профила feature_registrations: Регистрација feature_relay: Федеративни релеј features: Карактеристике @@ -251,7 +264,7 @@ sr: week_users_active: активно ове недеље week_users_new: корисника ове недеље domain_blocks: - add_new: Додај нови + add_new: Додај нови блок домена created_msg: Блокирање домена се обрађује destroyed_msg: Блокирање домена је опозвано domain: Домен @@ -268,6 +281,11 @@ sr: reject_media_hint: Уклања локално ускладиштене мултимедијске фајлове и одбија да их скида убудуће. Небитно је за суспензију reject_reports: Одбаци извештај reject_reports_hint: Игнориши све извештаје који долазе са овог домена. Небитно је за суспензије + rejecting_media: одбацивање медијских датотека + rejecting_reports: одбацивање пријава + severity: + silence: ућуткани + suspend: суспендовани show: affected_accounts: few: Утиче на %{count} налога у бази @@ -279,7 +297,7 @@ sr: suspend: Уклони суспензије за све постојеће налоге са овог домена title: Поништи блокаду домена за %{domain} undo: Поништи - undo: Поништи + undo: Поништи блок домена email_domain_blocks: add_new: Додај нови created_msg: Успешно додао домен Е-поште на црну листу @@ -290,8 +308,25 @@ sr: create: Додај домен title: Нова ставка е-поштe у црној листи title: Црна листа E-поште + followers: + back_to_account: Назад на налог + title: "%{acct} Пратиоци" instances: - title: Познате инстанце + delivery_available: Достава је доступна + known_accounts: + few: "%{count} знаних налога" + many: "%{count} знаних налога" + one: "%{count} знан налог" + other: "%{count} знаних налога" + moderation: + all: Све + limited: Ограничено + title: Модерација + title: Федерација + total_blocked_by_us: Блокирано од стране нас + total_followed_by_them: Праћени од стране њих + total_followed_by_us: Праћени од стране нас + total_reported: Пријаве везане за њих invites: deactivate_all: Деактивирај све filter: @@ -373,6 +408,9 @@ sr: preview_sensitive_media: desc_html: Преглед веза на другим веб страницама ће приказати иконицу чак и ако је медиј означен као осетљиво title: Покажи осетљив медиј у ОпенГраф прегледу + profile_directory: + desc_html: Дозволи корисницима да буду откривени + title: Омогући профил фасцикле registrations: closed_message: desc_html: Приказује се на главној страни када је инстанца затворена за регистрације. Можете користити HTML тагове @@ -432,7 +470,21 @@ sr: last_delivery: Последња достава title: WebSub topic: Topic + tags: + accounts: Налози + hidden: Скривено + hide: Сакриј од фасцикле + name: Тараба + title: Тараба + unhide: Прикажи у фасцикли + visible: Видљиво title: Администрација + warning_presets: + add_new: Додај нови + delete: Избриши + edit: Уреди + edit_preset: Уреди пресет упозорења + title: Управљај пресетима упозорења admin_mailer: new_report: body: "%{reporter} је пријавио %{target}" @@ -510,6 +562,16 @@ sr: success_msg: Ваш налог је успешно обрисан warning_html: Гарантовано је само брисање садржаја са ове инстанце. Садржај који је дељен даље ће вероватно да остави неке трагове. Недоступни и угашени сервери, као и сервери који су одјављени од примања статуса од Вас, неће ажурирати своје базе. warning_title: Доступност расејаног садржаја + directories: + directory: Профил фасцикле + enabled: Ви сте тренутно видљиви у фасцикли. + explanation: Откријте кориснике на основу њихових интереса + explore_mastodon: Истражи %{title} + people: + few: "%{count} људе" + many: "%{count} људе" + one: "%{count} особу" + other: "%{count} људе" errors: '403': Немате дозвола да видите ову страну. '404': Страна коју сте тражили не постоји. @@ -532,7 +594,9 @@ sr: size: Величина blocks: Блокирали сте csv: CSV + domain_blocks: Блокови домена follows: Пратите + lists: Листе mutes: Ућуткали сте storage: Мултимедијално складиште filters: @@ -691,10 +755,22 @@ sr: no_account_html: Немате налог? Можете се пријавити овде proceed: Наставите да би сте запратили prompt: 'Запратићете:' + reason_html: "Зашто је овај корак неопходан?%{instance} можда није сервер на којем сте регистровани, тако да прво морамо да вас преусмеримо на ваш сервер." + remote_interaction: + reblog: + proceed: Наставите да бисте поделили + prompt: 'Желите да делите ову трубу:' + reply: + proceed: Наставите да бисте одговорили + prompt: 'Желите да одговорите на ову трубу:' remote_unfollow: error: Грешка title: Наслов unfollowed: Отпраћени + scheduled_statuses: + over_daily_limit: Прекорачили сте границу од %{limit} планираних труба за тај дан + over_total_limit: Прекорачили сте границу од %{limit} планираних труба + too_soon: Планирани датум мора бити у будућности sessions: activity: Последња активност browser: Веб читач @@ -824,6 +900,22 @@ sr: explanation: Тражили сте потпуну резервну копију вашег Мастодон рачуна. Спремна за преузимање! subject: Ваша архива је спремна за преузимање title: Извоз архиве + warning: + explanation: + disable: Док је ваш рачун замрзнут, подаци о вашем рачуну остају нетакнути, али не можете вршити никакве радње док се не откључа. + silence: Иако је ваш налог ограничен, само људи који вас већ прате ће видети ваше трубе на овом серверу, и можда ћете бити искључени из различитих јавних листа. Међутим, други вас могу и даље ручно пратити. + suspend: Ваш налог је суспендован, а све ваше трубе и учитане медијске датотеке неповратно су уклоњени са овог сервера и сервера на којима сте имали следбенике. + review_server_policies: Прегледај политику сервера + subject: + disable: Ваш налог %{acct} је замрзнут + none: Упозорење за %{acct} + silence: Ваш налог %{acct} је ограничен + suspend: Ваш налог %{acct} је суспендован + title: + disable: Налог замрзнут + none: Упозорење + silence: Налог ограничен + suspend: Налог суспендован welcome: edit_profile_action: Подеси профил edit_profile_step: Профил можете прилагодити постављањем аватара, заглавља, променом имена и још много тога. Ако желите да прегледате нове пратиоце пре него што буду дозвољени да вас прате, можете закључати свој налог. diff --git a/config/locales/te.yml b/config/locales/te.yml index 39be5b687..f0f6942ab 100644 --- a/config/locales/te.yml +++ b/config/locales/te.yml @@ -19,7 +19,7 @@ te: humane_approach_body: వేరే సామాజిక మాధ్యమాల వైఫల్యాల నుండి నేర్చుకుని, నైతిక రూపకల్పనలతో సామాజిక మాధ్యమాల దుర్వినియోగంపై మాస్టొడాన్ పోరాటం చేసే లక్ష్యంతో పనిచేస్తుంది. humane_approach_title: మరింత మానవత్వంతో కూడిన విధానం not_a_product_body: మాస్టొడాన్ వ్యాపార సంబంధిత మాధ్యమం కాదు. ఎటువంటి ప్రకటనలు, డేటా మైనింగ్, కంచెలు లేనిది. ఏ కేంద్ర అధికరమూ లేదు. - not_a_product_title: మీరొక వ్యక్తి, వస్తువు కాదు. + not_a_product_title: మీరొక వ్యక్తి, వస్తువు కాదు real_conversation_body: With 500 characters at your disposal and support for granular content and media warnings, you can express yourself the way you want to. real_conversation_title: నిజమైన సంభాషణలకోసం నిర్మించబడింది within_reach_body: ఆండ్రాయిడ్, iOS మరియు ఇతర ప్లాట్ఫాంలకు వివిధరకాల యాప్స్ వున్నాయి. డెవలపర్ సహిత API వ్యవస్థే ఇందుకు మూలకారణం. ఇవి మీ స్ణేహితులతో అన్నివేళలా అందుబాటులో వుండడానికి సహాయపడతాయి. @@ -105,7 +105,6 @@ te: enabled: చేతనం చేయబడింది feed_url: ఫీడ్ URL followers: అనుచరులు - followers_local: "(%{local} local)" followers_url: అనుచరుల URL follows: అనుసరిస్తున్నారు header: Header diff --git a/db/migrate/20190117114553_create_tombstones.rb b/db/migrate/20190117114553_create_tombstones.rb new file mode 100644 index 000000000..06d6d8c5a --- /dev/null +++ b/db/migrate/20190117114553_create_tombstones.rb @@ -0,0 +1,12 @@ +class CreateTombstones < ActiveRecord::Migration[5.2] + def change + create_table :tombstones do |t| + t.belongs_to :account, foreign_key: { on_delete: :cascade } + t.string :uri, null: false + + t.timestamps + end + + add_index :tombstones, :uri + end +end diff --git a/db/schema.rb b/db/schema.rb index ab28146a5..85f69d1d8 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 2019_01_03_124754) do +ActiveRecord::Schema.define(version: 2019_01_17_114553) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -616,6 +616,15 @@ ActiveRecord::Schema.define(version: 2019_01_03_124754) do t.index ["name"], name: "index_tags_on_name", unique: true end + create_table "tombstones", force: :cascade do |t| + t.bigint "account_id" + t.string "uri", null: false + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.index ["account_id"], name: "index_tombstones_on_account_id" + t.index ["uri"], name: "index_tombstones_on_uri" + end + create_table "users", force: :cascade do |t| t.string "email", default: "", null: false t.datetime "created_at", null: false @@ -744,6 +753,7 @@ ActiveRecord::Schema.define(version: 2019_01_03_124754) do add_foreign_key "statuses_tags", "tags", name: "fk_3081861e21", on_delete: :cascade add_foreign_key "stream_entries", "accounts", name: "fk_5659b17554", on_delete: :cascade add_foreign_key "subscriptions", "accounts", name: "fk_9847d1cbb5", on_delete: :cascade + add_foreign_key "tombstones", "accounts", on_delete: :cascade add_foreign_key "users", "accounts", name: "fk_50500f500d", on_delete: :cascade add_foreign_key "users", "invites", on_delete: :nullify add_foreign_key "users", "oauth_applications", column: "created_by_application_id", on_delete: :nullify diff --git a/lib/cli.rb b/lib/cli.rb index a810c632a..6036adfbe 100644 --- a/lib/cli.rb +++ b/lib/cli.rb @@ -7,6 +7,7 @@ require_relative 'mastodon/accounts_cli' require_relative 'mastodon/feeds_cli' require_relative 'mastodon/settings_cli' require_relative 'mastodon/domains_cli' +require_relative 'mastodon/version' module Mastodon class CLI < Thor @@ -31,5 +32,12 @@ module Mastodon desc 'domains SUBCOMMAND ...ARGS', 'Manage account domains' subcommand 'domains', Mastodon::DomainsCLI + + map %w(--version -v) => :version + + desc 'version', 'Show version' + def version + say(Mastodon::Version.to_s) + end end end diff --git a/lib/mastodon/accounts_cli.rb b/lib/mastodon/accounts_cli.rb index 24fb67991..dca31cdca 100644 --- a/lib/mastodon/accounts_cli.rb +++ b/lib/mastodon/accounts_cli.rb @@ -176,7 +176,7 @@ module Mastodon end say("Deleting user with #{account.statuses_count} statuses, this might take a while...") - SuspendAccountService.new.call(account, remove_user: true) + SuspendAccountService.new.call(account, including_user: true) say('OK', :green) end diff --git a/lib/mastodon/domains_cli.rb b/lib/mastodon/domains_cli.rb index 16e298584..303b8a94a 100644 --- a/lib/mastodon/domains_cli.rb +++ b/lib/mastodon/domains_cli.rb @@ -1,5 +1,6 @@ # frozen_string_literal: true +require 'concurrent' require_relative '../../config/boot' require_relative '../../config/environment' require_relative 'cli_helper' @@ -32,5 +33,115 @@ module Mastodon say say("Removed #{removed} accounts#{dry_run}", :green) end + + option :concurrency, type: :numeric, default: 50, aliases: [:c] + option :silent, type: :boolean, default: false, aliases: [:s] + option :format, type: :string, default: 'summary', aliases: [:f] + desc 'crawl [START]', 'Crawl all known peers, optionally beginning at START' + long_desc <<-LONG_DESC + Crawl the fediverse by using the Mastodon REST API endpoints that expose + all known peers, and collect statistics from those peers, as long as those + peers support those API endpoints. When no START is given, the command uses + this server's own database of known peers to seed the crawl. + + The --concurrency (-c) option controls the number of threads performing HTTP + requests at the same time. More threads means the crawl may complete faster. + + The --silent (-s) option controls progress output. + + The --format (-f) option controls how the data is displayed at the end. By + default (`summary`), a summary of the statistics is returned. The other options + are `domains`, which returns a newline-delimited list of all discovered peers, + and `json`, which dumps all the aggregated data raw. + LONG_DESC + def crawl(start = nil) + stats = Concurrent::Hash.new + processed = Concurrent::AtomicFixnum.new(0) + failed = Concurrent::AtomicFixnum.new(0) + start_at = Time.now.to_f + seed = start ? [start] : Account.remote.domains + + pool = Concurrent::ThreadPoolExecutor.new(min_threads: 0, max_threads: options[:concurrency], idletime: 10, auto_terminate: true, max_queue: 0) + + work_unit = ->(domain) do + next if stats.key?(domain) + stats[domain] = nil + processed.increment + + begin + Request.new(:get, "https://#{domain}/api/v1/instance").perform do |res| + next unless res.code == 200 + stats[domain] = Oj.load(res.to_s) + end + + Request.new(:get, "https://#{domain}/api/v1/instance/peers").perform do |res| + next unless res.code == 200 + + Oj.load(res.to_s).reject { |peer| stats.key?(peer) }.each do |peer| + pool.post(peer, &work_unit) + end + end + + Request.new(:get, "https://#{domain}/api/v1/instance/activity").perform do |res| + next unless res.code == 200 + stats[domain]['activity'] = Oj.load(res.to_s) + end + + say('.', :green, false) unless options[:silent] + rescue StandardError + failed.increment + say('.', :red, false) unless options[:silent] + end + end + + seed.each do |domain| + pool.post(domain, &work_unit) + end + + sleep 20 + sleep 20 until pool.queue_length.zero? + + pool.shutdown + pool.wait_for_termination(20) + ensure + pool.shutdown + + say unless options[:silent] + + case options[:format] + when 'summary' + stats_to_summary(stats, processed, failed, start_at) + when 'domains' + stats_to_domains(stats) + when 'json' + stats_to_json(stats) + end + end + + private + + def stats_to_summary(stats, processed, failed, start_at) + stats.compact! + + total_domains = stats.size + total_users = stats.reduce(0) { |sum, (_key, val)| val.is_a?(Hash) && val['stats'].is_a?(Hash) ? sum + val['stats']['user_count'].to_i : sum } + total_active = stats.reduce(0) { |sum, (_key, val)| val.is_a?(Hash) && val['activity'].is_a?(Array) && val['activity'].size > 2 && val['activity'][1].is_a?(Hash) ? sum + val['activity'][1]['logins'].to_i : sum } + total_joined = stats.reduce(0) { |sum, (_key, val)| val.is_a?(Hash) && val['activity'].is_a?(Array) && val['activity'].size > 2 && val['activity'][1].is_a?(Hash) ? sum + val['activity'][1]['registrations'].to_i : sum } + + say("Visited #{processed.value} domains, #{failed.value} failed (#{(Time.now.to_f - start_at).round}s elapsed)", :green) + say("Total servers: #{total_domains}", :green) + say("Total registered: #{total_users}", :green) + say("Total active last week: #{total_active}", :green) + say("Total joined last week: #{total_joined}", :green) + end + + def stats_to_domains(stats) + say(stats.keys.join("\n")) + end + + def stats_to_json(stats) + stats.compact! + say(Oj.dump(stats)) + end end end diff --git a/lib/mastodon/version.rb b/lib/mastodon/version.rb index d0511eadb..abbc31178 100644 --- a/lib/mastodon/version.rb +++ b/lib/mastodon/version.rb @@ -21,7 +21,7 @@ module Mastodon end def flags - 'rc1' + '' end def to_a diff --git a/lib/tasks/repo.rake b/lib/tasks/repo.rake index 367859e94..8ceec3085 100644 --- a/lib/tasks/repo.rake +++ b/lib/tasks/repo.rake @@ -1,10 +1,13 @@ # frozen_string_literal: true namespace :repo do - desc 'Generate the authors.md file' + desc 'Generate the AUTHORS.md file' task :authors do - file = File.open('AUTHORS.md', 'w') + file = File.open(Rails.root.join('AUTHORS.md'), 'w') file << <<~HEADER + Authors + ======= + Mastodon is available on [GitHub](https://github.com/tootsuite/mastodon) and provided thanks to the work of the following contributors: @@ -27,4 +30,50 @@ namespace :repo do This document is provided for informational purposes only. Since it is only updated once per release, the version you are looking at may be currently out of date. To see the full list of contributors, consider looking at the [git history](https://github.com/tootsuite/mastodon/graphs/contributors) instead. FOOTER end + + desc 'Replace pull requests with authors in the CHANGELOG.md file' + task :changelog do + path = Rails.root.join('CHANGELOG.md') + tmp = Tempfile.new + + HttpLog.config.compact_log = true + + begin + File.open(path, 'r') do |file| + file.each_line do |line| + if line.start_with?('-') + new_line = line.gsub(/#([[:digit:]]+)*/) do |pull_request_reference| + pull_request_number = pull_request_reference[1..-1] + response = nil + + loop do + response = HTTP.headers('Authorization' => "token #{ENV['GITHUB_API_TOKEN']}").get("https://api.github.com/repos/tootsuite/mastodon/pulls/#{pull_request_number}") + + if response.code == 403 + sleep_for = (response.headers['X-RateLimit-Reset'].to_i - Time.now.to_i).abs + puts "Sleeping for #{sleep_for} seconds to get over rate limit" + sleep sleep_for + else + break + end + end + + pull_request = Oj.load(response.to_s) + "[#{pull_request['user']['login']}](#{pull_request['html_url']})" + end + + tmp.puts new_line + else + tmp.puts line + end + end + end + + tmp.close + FileUtils.mv(tmp.path, path) + ensure + tmp.close + tmp.unlink + end + end end diff --git a/package.json b/package.json index d5dbd19c3..5fa6fa8b7 100644 --- a/package.json +++ b/package.json @@ -98,11 +98,12 @@ "react-immutable-proptypes": "^2.1.0", "react-immutable-pure-component": "^1.1.1", "react-intl": "^2.7.2", + "react-masonry-infinite": "^1.2.2", "react-motion": "^0.5.2", "react-notification": "^6.8.4", "react-overlays": "^0.8.3", "react-redux": "^6.0.0", - "react-redux-loading-bar": "^4.1.0", + "react-redux-loading-bar": "^4.0.8", "react-router-dom": "^4.1.1", "react-router-scroll-4": "^1.0.0-beta.1", "react-select": "^2.2.0", diff --git a/spec/controllers/api/v1/media_controller_spec.rb b/spec/controllers/api/v1/media_controller_spec.rb index f01fcd942..4e3037208 100644 --- a/spec/controllers/api/v1/media_controller_spec.rb +++ b/spec/controllers/api/v1/media_controller_spec.rb @@ -84,19 +84,17 @@ RSpec.describe Api::V1::MediaController, type: :controller do post :create, params: { file: fixture_file_upload('files/attachment.webm', 'video/webm') } end - xit 'returns http success' do + it do + # returns http success expect(response).to have_http_status(200) - end - xit 'creates a media attachment' do + # creates a media attachment expect(MediaAttachment.first).to_not be_nil - end - xit 'uploads a file' do + # uploads a file expect(MediaAttachment.first).to have_attached_file(:file) - end - xit 'returns media ID in JSON' do + # returns media ID in JSON expect(body_as_json[:id]).to eq MediaAttachment.first.id.to_s end end diff --git a/spec/controllers/tags_controller_spec.rb b/spec/controllers/tags_controller_spec.rb index 33ccaed61..69def90cf 100644 --- a/spec/controllers/tags_controller_spec.rb +++ b/spec/controllers/tags_controller_spec.rb @@ -17,7 +17,7 @@ RSpec.describe TagsController, type: :controller do it 'renders application layout' do get :show, params: { id: 'test', max_id: late.id } - expect(response).to render_template layout: 'application' + expect(response).to render_template layout: 'public' end end diff --git a/spec/fixtures/requests/oembed_json_empty.html b/spec/fixtures/requests/oembed_json_empty.html new file mode 100644 index 000000000..4b02413aa --- /dev/null +++ b/spec/fixtures/requests/oembed_json_empty.html @@ -0,0 +1,7 @@ + + + + + + + diff --git a/spec/models/admin/account_action_spec.rb b/spec/models/admin/account_action_spec.rb index 8c55cf4dd..a3db60cfc 100644 --- a/spec/models/admin/account_action_spec.rb +++ b/spec/models/admin/account_action_spec.rb @@ -1,4 +1,131 @@ require 'rails_helper' RSpec.describe Admin::AccountAction, type: :model do + let(:account_action) { described_class.new } + + describe '#save!' do + subject { account_action.save! } + let(:account) { Fabricate(:account, user: Fabricate(:user, admin: true)) } + let(:target_account) { Fabricate(:account, user: Fabricate(:user)) } + let(:type) { 'disable' } + + before do + account_action.assign_attributes( + type: type, + current_account: account, + target_account: target_account + ) + end + + context 'type is "disable"' do + let(:type) { 'disable' } + + it 'disable user' do + subject + expect(target_account.user).to be_disabled + end + end + + context 'type is "silence"' do + let(:type) { 'silence' } + + it 'silences account' do + subject + expect(target_account).to be_silenced + end + end + + context 'type is "suspend"' do + let(:type) { 'suspend' } + + it 'suspends account' do + subject + expect(target_account).to be_suspended + end + + it 'queues Admin::SuspensionWorker by 1' do + Sidekiq::Testing.fake! do + expect do + subject + end.to change { Admin::SuspensionWorker.jobs.size }.by 1 + end + end + end + + it 'creates Admin::ActionLog' do + expect do + subject + end.to change { Admin::ActionLog.count }.by 1 + end + + it 'calls queue_email!' do + expect(account_action).to receive(:queue_email!) + subject + end + + it 'calls process_reports!' do + expect(account_action).to receive(:process_reports!) + subject + end + end + + describe '#report' do + subject { account_action.report } + + context 'report_id.present?' do + before do + account_action.report_id = Fabricate(:report).id + end + + it 'returns Report' do + expect(subject).to be_instance_of Report + end + end + + context '!report_id.present?' do + it 'returns nil' do + expect(subject).to be_nil + end + end + end + + describe '#with_report?' do + subject { account_action.with_report? } + + context '!report.nil?' do + before do + account_action.report_id = Fabricate(:report).id + end + + it 'returns true' do + expect(subject).to be true + end + end + + context '!(!report.nil?)' do + it 'returns false' do + expect(subject).to be false + end + end + end + + describe '.types_for_account' do + subject { described_class.types_for_account(account) } + + context 'account.local?' do + let(:account) { Fabricate(:account, domain: nil) } + + it 'returns ["none", "disable", "silence", "suspend"]' do + expect(subject).to eq %w(none disable silence suspend) + end + end + + context '!account.local?' do + let(:account) { Fabricate(:account, domain: 'hoge.com') } + + it 'returns ["silence", "suspend"]' do + expect(subject).to eq %w(silence suspend) + end + end + end end diff --git a/spec/models/admin/action_log_spec.rb b/spec/models/admin/action_log_spec.rb index 81d7e1be3..3495cc514 100644 --- a/spec/models/admin/action_log_spec.rb +++ b/spec/models/admin/action_log_spec.rb @@ -1,4 +1,12 @@ +# frozen_string_literal: true + require 'rails_helper' RSpec.describe Admin::ActionLog, type: :model do + describe '#action' do + it 'returns action' do + action_log = described_class.new(action: 'hoge') + expect(action_log.action).to be :hoge + end + end end diff --git a/spec/rails_helper.rb b/spec/rails_helper.rb index 1ded751ab..3a5e7491e 100644 --- a/spec/rails_helper.rb +++ b/spec/rails_helper.rb @@ -29,7 +29,6 @@ Devise::Test::ControllerHelpers.module_eval do value: resource.activate_session(warden.request), expires: 1.year.from_now, httponly: true, - same_site: :lax, } end end diff --git a/spec/services/fetch_oembed_service_spec.rb b/spec/services/fetch_oembed_service_spec.rb index 706eb3f2a..5789fb53b 100644 --- a/spec/services/fetch_oembed_service_spec.rb +++ b/spec/services/fetch_oembed_service_spec.rb @@ -8,6 +8,7 @@ describe FetchOEmbedService, type: :service do before do stub_request(:get, "https://host.test/provider.json").to_return(status: 404) stub_request(:get, "https://host.test/provider.xml").to_return(status: 404) + stub_request(:get, "https://host.test/empty_provider.json").to_return(status: 200) end describe 'discover_provider' do @@ -93,6 +94,23 @@ describe FetchOEmbedService, type: :service do expect(subject.call('https://host.test/oembed.html')).to be_nil end end + + context 'Empty JSON provider is discoverable' do + before do + stub_request(:get, 'https://host.test/oembed.html').to_return( + status: 200, + headers: { 'Content-Type': 'text/html' }, + body: request_fixture('oembed_json_empty.html') + ) + end + + it 'returns new OEmbed::Provider for JSON provider' do + subject.call('https://host.test/oembed.html') + expect(subject.endpoint_url).to eq 'https://host.test/empty_provider.json' + expect(subject.format).to eq :json + end + end + end context 'when status code is not 200' do diff --git a/spec/services/unfollow_service_spec.rb b/spec/services/unfollow_service_spec.rb index c5914c818..8a2881ab1 100644 --- a/spec/services/unfollow_service_spec.rb +++ b/spec/services/unfollow_service_spec.rb @@ -56,4 +56,22 @@ RSpec.describe UnfollowService, type: :service do expect(a_request(:post, 'http://example.com/inbox')).to have_been_made.once end end + + describe 'remote ActivityPub (reverse)' do + let(:bob) { Fabricate(:user, email: 'bob@example.com', account: Fabricate(:account, username: 'bob', protocol: :activitypub, domain: 'example.com', inbox_url: 'http://example.com/inbox')).account } + + before do + bob.follow!(sender) + stub_request(:post, 'http://example.com/inbox').to_return(status: 200) + subject.call(bob, sender) + end + + it 'destroys the following relation' do + expect(bob.following?(sender)).to be false + end + + it 'sends a reject activity' do + expect(a_request(:post, 'http://example.com/inbox')).to have_been_made.once + end + end end diff --git a/yarn.lock b/yarn.lock index 0fd1924fe..9ff12a712 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1681,6 +1681,13 @@ braces@^2.3.0, braces@^2.3.1: split-string "^3.0.2" to-regex "^3.0.1" +bricks.js@^1.7.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/bricks.js/-/bricks.js-1.8.0.tgz#8fdeb3c0226af251f4d5727a7df7f9ac0092b4b2" + integrity sha1-j96zwCJq8lH01XJ6fff5rACStLI= + dependencies: + knot.js "^1.1.5" + brorand@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" @@ -5528,6 +5535,11 @@ kleur@^2.0.1: resolved "https://registry.yarnpkg.com/kleur/-/kleur-2.0.2.tgz#b704f4944d95e255d038f0cb05fb8a602c55a300" integrity sha512-77XF9iTllATmG9lSlIv0qdQ2BQ/h9t0bJllHlbvsQ0zUWfU7Yi0S8L5JXzPZgkefIiajLmBJJ4BsMJmqcf7oxQ== +knot.js@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/knot.js/-/knot.js-1.1.5.tgz#28e72522f703f50fe98812fde224dd72728fef5d" + integrity sha1-KOclIvcD9Q/piBL94iTdcnKP710= + lcid@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" @@ -7558,6 +7570,13 @@ react-immutable-pure-component@^1.1.1: optionalDependencies: "@types/react" "16.4.6" +react-infinite-scroller@^1.0.12: + version "1.2.4" + resolved "https://registry.yarnpkg.com/react-infinite-scroller/-/react-infinite-scroller-1.2.4.tgz#f67eaec4940a4ce6417bebdd6e3433bfc38826e9" + integrity sha512-/oOa0QhZjXPqaD6sictN2edFMsd3kkMiE19Vcz5JDgHpzEJVqYcmq+V3mkwO88087kvKGe1URNksHEOt839Ubw== + dependencies: + prop-types "^15.5.8" + react-input-autosize@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/react-input-autosize/-/react-input-autosize-2.2.1.tgz#ec428fa15b1592994fb5f9aa15bb1eb6baf420f8" @@ -7596,6 +7615,15 @@ react-lifecycles-compat@^3.0.2, react-lifecycles-compat@^3.0.4: resolved "https://registry.yarnpkg.com/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz#4f1a273afdfc8f3488a8c516bfda78f872352362" integrity sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA== +react-masonry-infinite@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/react-masonry-infinite/-/react-masonry-infinite-1.2.2.tgz#20c1386f9ccdda9747527c8f42bc2c02dd2e7951" + integrity sha1-IME4b5zN2pdHUnyPQrwsAt0ueVE= + dependencies: + bricks.js "^1.7.0" + prop-types "^15.5.10" + react-infinite-scroller "^1.0.12" + react-motion@^0.5.2: version "0.5.2" resolved "https://registry.yarnpkg.com/react-motion/-/react-motion-0.5.2.tgz#0dd3a69e411316567927917c6626551ba0607316" @@ -7624,10 +7652,10 @@ react-overlays@^0.8.3: react-transition-group "^2.2.0" warning "^3.0.0" -react-redux-loading-bar@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/react-redux-loading-bar/-/react-redux-loading-bar-4.1.0.tgz#3ca460569d979450d9d1dc992328efa449c10a7a" - integrity sha512-9L51ZvPqnlPs97j44FZLio6maQ/2BMP8xXFPArDWxByyLyGYs2fXpSZw+Lby9qr8Px3SsH9dylfC8HfQrmc/Mw== +react-redux-loading-bar@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/react-redux-loading-bar/-/react-redux-loading-bar-4.0.8.tgz#e84d59d1517b79f53b0f39c8ddb40682af648c1b" + integrity sha512-BpR1tlYrYKFtGhxa7nAKc0dpcV33ZgXJ/jKNLpDDaxu2/cCxbkWQt9YlWT+VLw1x/7qyNYY4DH48bZdtmciSpg== dependencies: prop-types "^15.6.2" react-lifecycles-compat "^3.0.2"