Compare commits
No commits in common. "0e80d060dc7ca370cbf020d4ffed8432117b80b4" and "f532af92f1afc1b4679736cf2a3a2515f27d9b8f" have entirely different histories.
0e80d060dc
...
f532af92f1
580 changed files with 4492 additions and 5636 deletions
|
@ -69,7 +69,7 @@ services:
|
||||||
hard: -1
|
hard: -1
|
||||||
|
|
||||||
libretranslate:
|
libretranslate:
|
||||||
image: libretranslate/libretranslate:v1.6.1
|
image: libretranslate/libretranslate:v1.6.0
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
volumes:
|
volumes:
|
||||||
- lt-data:/home/libretranslate/.local
|
- lt-data:/home/libretranslate/.local
|
||||||
|
|
|
@ -7,13 +7,8 @@ RSpec/Focus: # Require full spec run on CI
|
||||||
Exclude: []
|
Exclude: []
|
||||||
|
|
||||||
Rails/Output: # Remove any `puts` debugging
|
Rails/Output: # Remove any `puts` debugging
|
||||||
inherit_mode:
|
|
||||||
merge:
|
|
||||||
- Include
|
|
||||||
Enabled: true
|
Enabled: true
|
||||||
Exclude: []
|
Exclude: []
|
||||||
Include:
|
|
||||||
- spec/**/*.rb
|
|
||||||
|
|
||||||
Rails/FindEach: # Using `each` could impact performance, use `find_each`
|
Rails/FindEach: # Using `each` could impact performance, use `find_each`
|
||||||
Enabled: true
|
Enabled: true
|
||||||
|
|
60
CHANGELOG.md
60
CHANGELOG.md
|
@ -10,24 +10,21 @@ The following changelog entries focus on changes visible to users, administrator
|
||||||
|
|
||||||
- **Add confirmation interstitial instead of silently redirecting logged-out visitors to remote resources** (#27792, #28902, and #30651 by @ClearlyClaire and @Gargron)\
|
- **Add confirmation interstitial instead of silently redirecting logged-out visitors to remote resources** (#27792, #28902, and #30651 by @ClearlyClaire and @Gargron)\
|
||||||
This fixes a longstanding open redirect in Mastodon, at the cost of added friction when local links to remote resources are shared.
|
This fixes a longstanding open redirect in Mastodon, at the cost of added friction when local links to remote resources are shared.
|
||||||
- Change `form-action` Content-Security-Policy directive to be more restrictive (#26897 by @ClearlyClaire)
|
|
||||||
- Update dependencies
|
|
||||||
|
|
||||||
### Added
|
### Added
|
||||||
|
|
||||||
- **Add server-side notification grouping** (#29889, #30576, #30685, #30688, #30707, #30776, #30779, #30781, #30440, #31062, #31098, #31076, #31111, #31123, #31223, #31214, #31224, #31299, #31325, #31347, #31304, #31326, #31384, #31403, #31433, #31509, #31486, #31513, #31592, #31594, #31638, #31746, #31652, #31709, #31725, #31745, #31613, #31657, #31840, #31610 and #31929 by @ClearlyClaire, @Gargron, @mgmn, and @renchap)\
|
- **Add experimental server-side notification grouping** (#29889, #30576, #30685, #30688, #30707, #30776, #30779, #30781, #30440, #31062, #31098, #31076, #31111, #31123, #31223, #31214, #31224, #31299, #31325, #31347, #31304, #31326, #31384, #31403, #31433, #31509, #31486, and #31513 by @ClearlyClaire, @mgmn, and @renchap)\
|
||||||
Group notifications of the same type for the same target, so that your notifications no longer get cluttered by boost and favorite notifications as soon as a couple of your posts get traction.\
|
Group notifications of the same type for the same target, so that your notifications no longer get cluttered by boost and favorite notifications as soon as a couple of your posts get traction.\
|
||||||
This is done server-side so that clients can efficiently get relevant groups without having to go through numerous pages of individual notifications.\
|
This is done server-side so that clients can efficiently get relevant groups without having to go through numerous pages of individual notifications.\
|
||||||
As part of this, the visual design of the entire notifications feature has been revamped.\
|
As part of this, the visual design of the entire notifications feature has been revamped.\
|
||||||
This feature is intended to eventually replace the existing notifications column, but for this first beta, users will have to enable it in the “Experimental features” section of the notifications column settings.\
|
This feature is intended to eventually replace the existing notifications column, but for this first beta, users will have to enable it in the “Experimental features” section of the notifications column settings.\
|
||||||
The API is not final yet, but it consists of:
|
The API is not final yet, but it consists of:
|
||||||
- a new `group_key` attribute to `Notification` entities
|
- a new `group_key` attribute to `Notification` entities
|
||||||
- `GET /api/v2/notifications`: https://docs.joinmastodon.org/methods/grouped_notifications/#get-grouped
|
- `GET /api/v2_alpha/notifications`: https://docs.joinmastodon.org/methods/notifications_alpha/#get-grouped
|
||||||
- `GET /api/v2/notifications/:group_key`: https://docs.joinmastodon.org/methods/grouped_notifications/#get-notification-group
|
- `GET /api/v2_alpha/notifications/:group_key`: https://docs.joinmastodon.org/methods/notifications_alpha/#get-notification-group
|
||||||
- `GET /api/v2/notifications/:group_key/accounts`: https://docs.joinmastodon.org/methods/grouped_notifications/#get-group-accounts
|
- `POST /api/v2_alpha/notifications/:group_key/dimsiss`: https://docs.joinmastodon.org/methods/notifications_alpha/#dismiss-group
|
||||||
- `POST /api/v2/notifications/:group_key/dimsiss`: https://docs.joinmastodon.org/methods/grouped_notifications/#dismiss-group
|
- `GET /api/v2_alpha/notifications/:unread_count`: https://docs.joinmastodon.org/methods/notifications_alpha/#unread-group-count
|
||||||
- `GET /api/v2/notifications/:unread_count`: https://docs.joinmastodon.org/methods/grouped_notifications/#unread-group-count
|
- **Add notification policies, filtered notifications and notification requests** (#29366, #29529, #29433, #29565, #29567, #29572, #29575, #29588, #29646, #29652, #29658, #29666, #29693, #29699, #29737, #29706, #29570, #29752, #29810, #29826, #30114, #30251, #30559, #29868, #31008, #31011, #30996, #31149, #31220, #31222, #31225, #31242, #31262, #31250, #31273, #31310, #31316, #31322, #31329, #31324, #31331, #31343, #31342, #31309, #31358, #31378, #31406, #31256, #31456, #31419, #31457, #31508, #31540, and #31541 by @ClearlyClaire, @Gargron, @TheEssem, @mgmn, @oneiros, and @renchap)\
|
||||||
- **Add notification policies, filtered notifications and notification requests** (#29366, #29529, #29433, #29565, #29567, #29572, #29575, #29588, #29646, #29652, #29658, #29666, #29693, #29699, #29737, #29706, #29570, #29752, #29810, #29826, #30114, #30251, #30559, #29868, #31008, #31011, #30996, #31149, #31220, #31222, #31225, #31242, #31262, #31250, #31273, #31310, #31316, #31322, #31329, #31324, #31331, #31343, #31342, #31309, #31358, #31378, #31406, #31256, #31456, #31419, #31457, #31508, #31540, #31541, and #31723 by @ClearlyClaire, @Gargron, @TheEssem, @mgmn, @oneiros, and @renchap)\
|
|
||||||
The old “Block notifications from non-followers”, “Block notifications from people you don't follow” and “Block direct messages from people you don't follow” notification settings have been replaced by a new set of settings found directly in the notification column.\
|
The old “Block notifications from non-followers”, “Block notifications from people you don't follow” and “Block direct messages from people you don't follow” notification settings have been replaced by a new set of settings found directly in the notification column.\
|
||||||
You can now separately filter or drop notifications from people you don't follow, people who don't follow you, accounts created within the past 30 days, as well as unsolicited private mentions, and accounts limited by the moderation.\
|
You can now separately filter or drop notifications from people you don't follow, people who don't follow you, accounts created within the past 30 days, as well as unsolicited private mentions, and accounts limited by the moderation.\
|
||||||
Instead of being outright dropped, notifications that you chose to filter are put in a separate “Filtered notifications” box that you can review separately without it clogging your main notifications.\
|
Instead of being outright dropped, notifications that you chose to filter are put in a separate “Filtered notifications” box that you can review separately without it clogging your main notifications.\
|
||||||
|
@ -60,22 +57,19 @@ The following changelog entries focus on changes visible to users, administrator
|
||||||
- **Add timeline of public posts about a trending link** (#30381 and #30840 by @Gargron)\
|
- **Add timeline of public posts about a trending link** (#30381 and #30840 by @Gargron)\
|
||||||
You can now see public posts mentioning currently-trending articles from people who have opted into discovery features.\
|
You can now see public posts mentioning currently-trending articles from people who have opted into discovery features.\
|
||||||
This adds a new REST API endpoint: https://docs.joinmastodon.org/methods/timelines/#link
|
This adds a new REST API endpoint: https://docs.joinmastodon.org/methods/timelines/#link
|
||||||
- **Add author highlight for news articles whose authors are on the fediverse** (#30398, #30670, #30521, #30846, #31819, and #31900 by @Gargron and @oneiros)\
|
- **Add author highlight for news articles whose authors are on the fediverse** (#30398, #30670, #30521, and #30846 by @Gargron)\
|
||||||
This adds a mechanism to [highlight the author of news articles](https://blog.joinmastodon.org/2024/07/highlighting-journalism-on-mastodon/) shared on Mastodon.\
|
This adds a mechanism to [highlight the author of news articles](https://blog.joinmastodon.org/2024/07/highlighting-journalism-on-mastodon/) shared on Mastodon.\
|
||||||
Articles hosted outside the fediverse can indicate a fediverse author with a meta tag:
|
Articles hosted outside the fediverse can indicate a fediverse author with a meta tag:
|
||||||
```html
|
```html
|
||||||
<meta name="fediverse:creator" content="username@domain" />
|
<meta name="fediverse:creator" content="username@domain" />
|
||||||
```
|
```
|
||||||
On the API side, this is represented by a new `authors` attribute to the `PreviewCard` entity: https://docs.joinmastodon.org/entities/PreviewCard/#authors\
|
On the API side, this is represented by a new `authors` attribute to the `PreviewCard` entity: https://docs.joinmastodon.org/entities/PreviewCard/#authors\
|
||||||
Users can allow arbitrary domains to use `fediverse:creator` to credit them by visiting `/settings/verification`.\
|
Note that this feature is still work in progress and the tagging format and verification mechanisms may change in future releases.
|
||||||
This is federated as a new `attributionDomains` property in the `http://joinmastodon.org/ns` namespace, containing an array of domain names: https://docs.joinmastodon.org/spec/activitypub/#properties-used-1
|
|
||||||
- **Add in-app notifications for moderation actions and warnings** (#30065, #30082, and #30081 by @ClearlyClaire)\
|
- **Add in-app notifications for moderation actions and warnings** (#30065, #30082, and #30081 by @ClearlyClaire)\
|
||||||
In addition to email notifications, also notify users of moderation actions or warnings against them directly within the app, so they are less likely to miss important communication from their moderators.\
|
In addition to email notifications, also notify users of moderation actions or warnings against them directly within the app, so they are less likely to miss important communication from their moderators.\
|
||||||
This adds the `moderation_warning` notification type to the REST API and streaming, with a new [`moderation_warning` attribute](https://docs.joinmastodon.org/entities/Notification/#moderation_warning).
|
This adds the `moderation_warning` notification type to the REST API and streaming, with a new [`moderation_warning` attribute](https://docs.joinmastodon.org/entities/Notification/#moderation_warning).
|
||||||
- **Add domain information to profiles in web UI** (#29602 by @Gargron)\
|
- **Add domain information to profiles in web UI** (#29602 by @Gargron)\
|
||||||
Clicking the domain of a user in their profile will now open a tooltip with a short explanation about servers and federation.
|
Clicking the domain of a user in their profile will now open a tooltip with a short explanation about servers and federation.
|
||||||
- **Add support for Redis sentinel** (#31694, #31623, #31744, #31767, and #31768 by @ThisIsMissEm and @oneiros)\
|
|
||||||
See https://docs.joinmastodon.org/admin/scaling/#redis-sentinel
|
|
||||||
- Add ability to reorder uploaded media before posting in web UI (#28456 by @Gargron)
|
- Add ability to reorder uploaded media before posting in web UI (#28456 by @Gargron)
|
||||||
- Add moderation interface for searching hashtags (#30880 by @ThisIsMissEm)
|
- Add moderation interface for searching hashtags (#30880 by @ThisIsMissEm)
|
||||||
- Add ability for admins to configure instance favicon and logo (#30040, #30208, #30259, #30375, #30734, #31016, and #30205 by @ClearlyClaire, @FawazFarid, @JasonPunyon, @mgmn, and @renchap)\
|
- Add ability for admins to configure instance favicon and logo (#30040, #30208, #30259, #30375, #30734, #31016, and #30205 by @ClearlyClaire, @FawazFarid, @JasonPunyon, @mgmn, and @renchap)\
|
||||||
|
@ -83,8 +77,6 @@ The following changelog entries focus on changes visible to users, administrator
|
||||||
- Add `api_versions` to `/api/v2/instance` (#31354 by @ClearlyClaire)\
|
- Add `api_versions` to `/api/v2/instance` (#31354 by @ClearlyClaire)\
|
||||||
Add API version number to make it easier for clients to detect compatible features going forward.\
|
Add API version number to make it easier for clients to detect compatible features going forward.\
|
||||||
See API documentation at https://docs.joinmastodon.org/entities/Instance/#api-versions
|
See API documentation at https://docs.joinmastodon.org/entities/Instance/#api-versions
|
||||||
- Add quick links to Administration and Moderation Reports from Web UI (#24838 by @ThisIsMissEm)
|
|
||||||
- Add link to `/admin/roles` in moderation interface when changing someone's role (#31791 by @ClearlyClaire)
|
|
||||||
- Add recent audit log entries in federation moderation interface (#27386 by @ThisIsMissEm)
|
- Add recent audit log entries in federation moderation interface (#27386 by @ThisIsMissEm)
|
||||||
- Add profile setup to onboarding in web UI (#27829, #27876, and #28453 by @Gargron)
|
- Add profile setup to onboarding in web UI (#27829, #27876, and #28453 by @Gargron)
|
||||||
- Add prominent share/copy button on profiles in web UI (#27865 and #27889 by @ClearlyClaire and @Gargron)
|
- Add prominent share/copy button on profiles in web UI (#27865 and #27889 by @ClearlyClaire and @Gargron)
|
||||||
|
@ -121,24 +113,21 @@ The following changelog entries focus on changes visible to users, administrator
|
||||||
- Add support for multiple `redirect_uris` when creating OAuth 2.0 Applications (#29192 by @ThisIsMissEm)
|
- Add support for multiple `redirect_uris` when creating OAuth 2.0 Applications (#29192 by @ThisIsMissEm)
|
||||||
- Add Interlingue and Interlingua to interface languages (#28630 and #30828 by @Dhghomon and @renchap)
|
- Add Interlingue and Interlingua to interface languages (#28630 and #30828 by @Dhghomon and @renchap)
|
||||||
- Add Kashubian, Pennsylvania Dutch, Vai, Jawi Malay, Mohawk and Low German to posting languages (#26024, #26634, #27136, #29098, #27115, and #27434 by @EngineerDali, @HelgeKrueger, and @gunchleoc)
|
- Add Kashubian, Pennsylvania Dutch, Vai, Jawi Malay, Mohawk and Low German to posting languages (#26024, #26634, #27136, #29098, #27115, and #27434 by @EngineerDali, @HelgeKrueger, and @gunchleoc)
|
||||||
|
- Add validations to `Web::PushSubscription` (#30540 and #30542 by @ThisIsMissEm)
|
||||||
- Add option to use native Ruby driver for Redis through `REDIS_DRIVER=ruby` (#30717 by @vmstan)
|
- Add option to use native Ruby driver for Redis through `REDIS_DRIVER=ruby` (#30717 by @vmstan)
|
||||||
- Add support for libvips in addition to ImageMagick (#30090, #30590, #30597, #30632, #30857, #30869, and #30858 by @ClearlyClaire, @Gargron, and @mjankowski)\
|
- Add support for libvips in addition to ImageMagick (#30090, #30590, #30597, #30632, #30857, #30869, and #30858 by @ClearlyClaire, @Gargron, and @mjankowski)\
|
||||||
Server admins can now use libvips as a faster and lighter alternative to ImageMagick for processing user-uploaded images.\
|
Server admins can now use libvips as a faster and lighter alternative to ImageMagick for processing user-uploaded images.\
|
||||||
This requires libvips 8.13 or newer, and needs to be enabled with `MASTODON_USE_LIBVIPS=true`.\
|
This requires libvips 8.13 or newer, and needs to be enabled with `MASTODON_USE_LIBVIPS=true`.\
|
||||||
This is enabled by default in the official Docker images, and is intended to completely replace ImageMagick in the future.
|
This is enabled by default in the official Docker images, and is intended to completely replace ImageMagick in the future.
|
||||||
- Add validations to `Web::PushSubscription` (#30540 and #30542 by @ThisIsMissEm)
|
|
||||||
- Add anchors to each authorized application in `/oauth/authorized_applications` (#31677 by @fowl2)
|
|
||||||
- Add active animation to header settings button (#30221, #30307, and #30388 by @daudix)
|
- Add active animation to header settings button (#30221, #30307, and #30388 by @daudix)
|
||||||
- Add OpenTelemetry instrumentation (#30130, #30322, #30353, and #30350 by @julianocosta89, @renchap, and @robbkidd)\
|
- Add OpenTelemetry instrumentation (#30130, #30322, #30353, and #30350 by @julianocosta89, @renchap, and @robbkidd)\
|
||||||
See https://docs.joinmastodon.org/admin/config/#otel for documentation
|
See https://docs.joinmastodon.org/admin/config/#otel for documentation
|
||||||
- Add API to get multiple accounts and statuses (#27871 and #30465 by @ClearlyClaire)\
|
- Add API to get multiple accounts and statuses (#27871 and #30465 by @ClearlyClaire)\
|
||||||
This adds `GET /api/v1/accounts` and `GET /api/v1/statuses` to the REST API, see https://docs.joinmastodon.org/methods/accounts/#index and https://docs.joinmastodon.org/methods/statuses/#index
|
This adds `GET /api/v1/accounts` and `GET /api/v1/statuses` to the REST API, see https://docs.joinmastodon.org/methods/accounts/#index and https://docs.joinmastodon.org/methods/statuses/#index
|
||||||
- Add support for CORS to `POST /oauth/revoke` (#31743 by @ClearlyClaire)
|
|
||||||
- Add redirection back to previous page after site upload deletion (#30141 by @FawazFarid)
|
- Add redirection back to previous page after site upload deletion (#30141 by @FawazFarid)
|
||||||
- Add RFC8414 OAuth 2.0 server metadata (#29191 by @ThisIsMissEm)
|
- Add RFC8414 OAuth 2.0 server metadata (#29191 by @ThisIsMissEm)
|
||||||
- Add loading indicator and empty result message to advanced interface search (#30085 by @ClearlyClaire)
|
- Add loading indicator and empty result message to advanced interface search (#30085 by @ClearlyClaire)
|
||||||
- Add `profile` OAuth 2.0 scope, allowing more limited access to user data (#29087 and #30357 by @ThisIsMissEm)
|
- Add `profile` OAuth 2.0 scope, allowing more limited access to user data (#29087 and #30357 by @ThisIsMissEm)
|
||||||
- Add global Regexp timeout (#31928 by @ClearlyClaire)
|
|
||||||
- Add the role ID to the badge component (#29707 by @renchap)
|
- Add the role ID to the badge component (#29707 by @renchap)
|
||||||
- Add diagnostic message for failure during CLI search deploy (#29462 by @mjankowski)
|
- Add diagnostic message for failure during CLI search deploy (#29462 by @mjankowski)
|
||||||
- Add pagination `Link` headers on API accounts/statuses when pinned true (#29442 by @mjankowski)
|
- Add pagination `Link` headers on API accounts/statuses when pinned true (#29442 by @mjankowski)
|
||||||
|
@ -167,14 +156,14 @@ The following changelog entries focus on changes visible to users, administrator
|
||||||
- **Change icons throughout the web interface** (#27385, #27539, #27555, #27579, #27700, #27817, #28519, #28709, #28064, #28775, #28780, #27924, #29294, #29395, #29537, #29569, #29610, #29612, #29649, #29844, #27780, #30974, #30963, #30962, #30961, #31362, #31363, #31359, #31371, #31360, #31512, #31511, and #31525 by @ClearlyClaire, @Gargron, @arbolitoloco1, @mjankowski, @nclm, @renchap, @ronilaukkarinen, and @zunda)\
|
- **Change icons throughout the web interface** (#27385, #27539, #27555, #27579, #27700, #27817, #28519, #28709, #28064, #28775, #28780, #27924, #29294, #29395, #29537, #29569, #29610, #29612, #29649, #29844, #27780, #30974, #30963, #30962, #30961, #31362, #31363, #31359, #31371, #31360, #31512, #31511, and #31525 by @ClearlyClaire, @Gargron, @arbolitoloco1, @mjankowski, @nclm, @renchap, @ronilaukkarinen, and @zunda)\
|
||||||
This changes all the interface icons from FontAwesome to Material Symbols for a more modern look, consistent with the official Mastodon Android app.\
|
This changes all the interface icons from FontAwesome to Material Symbols for a more modern look, consistent with the official Mastodon Android app.\
|
||||||
In addition, better care is given to pixel alignment, and icon variants are used to better highlight active/inactive state.
|
In addition, better care is given to pixel alignment, and icon variants are used to better highlight active/inactive state.
|
||||||
- **Change design of compose form in web UI** (#28119, #29059, #29248, #29372, #29384, #29417, #29456, #29406, #29651, #29659, and #31889 by @ClearlyClaire, @Gargron, @eai04191, @hinaloe, and @ronilaukkarinen)\
|
- **Change design of compose form in web UI** (#28119, #29059, #29248, #29372, #29384, #29417, #29456, #29406, #29651, and #29659 by @ClearlyClaire, @Gargron, @eai04191, @hinaloe, and @ronilaukkarinen)\
|
||||||
The compose form has been completely redesigned for a more modern and consistent look, as well as spelling out the chosen privacy setting and language name at all times.\
|
The compose form has been completely redesigned for a more modern and consistent look, as well as spelling out the chosen privacy setting and language name at all times.\
|
||||||
As part of this, the “Unlisted” privacy setting has been renamed to “Quiet public”.
|
As part of this, the “Unlisted” privacy setting has been renamed to “Quiet public”.
|
||||||
- **Change design of modals in the web UI** (#29576, #29614, #29640, #29644, #30131, #30884, #31399, #31555, #31752, #31801, #31883, #31844, #31864, and #31943 by @ClearlyClaire, @Gargron, @tribela and @vmstan)\
|
- **Change design of confirmation modals in the web UI** (#29576, #29614, #29640, #29644, #30131, #30884, and #31399 by @ClearlyClaire, @Gargron, and @tribela)\
|
||||||
The mute, block, and domain block confirmation modals have been completely redesigned to be clearer and include more detailed information on the action to be performed.\
|
The mute, block, and domain block confirmation modals have been completely redesigned to be clearer and include more detailed information on the action to be performed.\
|
||||||
They also have a more modern and consistent design, along with other confirmation modals in the application.
|
They also have a more modern and consistent design, along with other confirmation modals in the application.
|
||||||
- **Change colors throughout the web UI** (#29522, #29584, #29653, #29779, #29803, #29809, #29808, #29828, #31034, #31168, #31266, #31348, #31349, #31361, and #31510 by @ClearlyClaire, @Gargron, @renchap, and @vmstan)
|
- **Change colors throughout the web UI** (#29522, #29584, #29653, #29779, #29803, #29809, #29808, #29828, #31034, #31168, #31266, #31348, #31349, #31361, and #31510 by @ClearlyClaire, @Gargron, @renchap, and @vmstan)
|
||||||
- **Change onboarding prompt to follow suggestions carousel in web UI** (#28878, #29272, and #31912 by @Gargron)
|
- **Change onboarding prompt to follow suggestions carousel in web UI** (#28878 and #29272 by @Gargron)
|
||||||
- **Change email templates** (#28416, #28755, #28814, #29064, #28883, #29470, #29607, #29761, #29760, and #29879 by @ClearlyClaire, @Gargron, @hteumeuleu, and @mjankowski)\
|
- **Change email templates** (#28416, #28755, #28814, #29064, #28883, #29470, #29607, #29761, #29760, and #29879 by @ClearlyClaire, @Gargron, @hteumeuleu, and @mjankowski)\
|
||||||
All emails to end-users have been completely redesigned with a fresh new look, providing more information while making them easier to read and keeping maximum compatibility across mail clients.
|
All emails to end-users have been completely redesigned with a fresh new look, providing more information while making them easier to read and keeping maximum compatibility across mail clients.
|
||||||
- **Change follow recommendations algorithm** (#28314, #28433, #29017, #29108, #29306, #29550, #29619, and #31474 by @ClearlyClaire, @Gargron, @kernal053, @mjankowski, and @wheatear-dev)\
|
- **Change follow recommendations algorithm** (#28314, #28433, #29017, #29108, #29306, #29550, #29619, and #31474 by @ClearlyClaire, @Gargron, @kernal053, @mjankowski, and @wheatear-dev)\
|
||||||
|
@ -182,28 +171,19 @@ The following changelog entries focus on changes visible to users, administrator
|
||||||
In addition, the implementation has been significantly reworked, and all follow recommendations are now dismissable.\
|
In addition, the implementation has been significantly reworked, and all follow recommendations are now dismissable.\
|
||||||
This change deprecates the `source` attribute in `Suggestion` entities in the REST API, and replaces it with the new [`sources` attribute](https://docs.joinmastodon.org/entities/Suggestion/#sources).
|
This change deprecates the `source` attribute in `Suggestion` entities in the REST API, and replaces it with the new [`sources` attribute](https://docs.joinmastodon.org/entities/Suggestion/#sources).
|
||||||
- Change account search algorithm (#30803 by @Gargron)
|
- Change account search algorithm (#30803 by @Gargron)
|
||||||
- **Change streaming server to use its own dependencies and its own docker image** (#24702, #27967, #26850, #28112, #28115, #28137, #28138, #28497, #28548, #30795, #31612, and #31615 by @TheEssem, @ThisIsMissEm, @jippi, @renchap, @timetinytim, and @vmstan)\
|
- **Change streaming server to use its own dependencies and its own docker image** (#24702, #27967, #26850, #28112, #28115, #28137, #28138, #28497, #28548, and #30795 by @TheEssem, @ThisIsMissEm, @jippi, @timetinytim, and @vmstan)\
|
||||||
In order to reduce the amount of runtime dependencies, the streaming server has been moved into a separate package and Docker image.\
|
In order to reduce the amount of runtime dependencies, the streaming server has been moved into a separate package and Docker image.\
|
||||||
The `mastodon` image does not contain the streaming server anymore, as it has been moved to its own `mastodon-streaming` image.\
|
The `mastodon` image does not contain the streaming server anymore, as it has been moved to its own `mastodon-streaming` image.\
|
||||||
Administrators may need to update their setup accordingly.
|
Administrators may need to update their setup accordingly.
|
||||||
- Change how content warnings and filters are displayed in web UI (#31365, and #31761 by @Gargron)
|
- Change how content warnings and filters are displayed in web UI (#31365 by @Gargron)
|
||||||
- Change preview card processing to ignore `undefined` as canonical url (#31882 by @oneiros)
|
|
||||||
- Change embedded posts to use web UI (#31766 by @Gargron)
|
|
||||||
- Change inner borders in media galleries in web UI (#31852 by @Gargron)
|
|
||||||
- Change design of hide media button in web UI (#31807 by @Gargron)
|
|
||||||
- Change labels on thread indicators in web UI (#31806 by @Gargron)
|
|
||||||
- Change report action buttons to be disabled when action has already been taken (#31773, #31822, and #31899 by @ClearlyClaire and @ThisIsMissEm)
|
|
||||||
- Change width of columns in advanced web UI (#31762 by @Gargron)
|
|
||||||
- Change design of unread conversations in web UI (#31763 by @Gargron)
|
|
||||||
- Change Web UI to allow viewing and severing relationships with suspended accounts (#27667 by @ClearlyClaire)\
|
- Change Web UI to allow viewing and severing relationships with suspended accounts (#27667 by @ClearlyClaire)\
|
||||||
This also adds a `with_suspended` parameter to `GET /api/v1/accounts/relationships` in the REST API.
|
This also adds a `with_suspended` parameter to `GET /api/v1/accounts/relationships` in the REST API.
|
||||||
- Change preview card image size limit from 2MB to 8MB when using libvips (#31904 by @ClearlyClaire)
|
|
||||||
- Change avatars border radius (#31390 by @renchap)
|
- Change avatars border radius (#31390 by @renchap)
|
||||||
- Change counters to be displayed on profile timelines in web UI (#30525 by @Gargron)
|
- Change counters to be displayed on profile timelines in web UI (#30525 by @Gargron)
|
||||||
- Change disabled buttons color in light mode to make the difference more visible (#30998 by @renchap)
|
- Change disabled buttons color in light mode to make the difference more visible (#30998 by @renchap)
|
||||||
- Change design of people tab on explore in web UI (#30059 by @Gargron)
|
- Change design of people tab on explore in web UI (#30059 by @Gargron)
|
||||||
- Change sidebar text in web UI (#30696 by @Gargron)
|
- Change sidebar text in web UI (#30696 by @Gargron)
|
||||||
- Change "Follow" to "Follow back" and "Mutual" when appropriate in web UI (#28452, #28465, and #31934 by @ClearlyClaire, @Gargron and @renchap)
|
- Change "Follow" to "Follow back" and "Mutual" when appropriate in web UI (#28452 and #28465 by @Gargron and @renchap)
|
||||||
- Change media to be hidden/blurred by default in report modal (#28522 by @ClearlyClaire)
|
- Change media to be hidden/blurred by default in report modal (#28522 by @ClearlyClaire)
|
||||||
- Change order of the "muting" and "blocking" list options in “Data Exports” (#26088 by @fixermark)
|
- Change order of the "muting" and "blocking" list options in “Data Exports” (#26088 by @fixermark)
|
||||||
- Change admin and moderation notes character limit from 500 to 2000 characters (#30288 by @ThisIsMissEm)
|
- Change admin and moderation notes character limit from 500 to 2000 characters (#30288 by @ThisIsMissEm)
|
||||||
|
@ -217,7 +197,6 @@ The following changelog entries focus on changes visible to users, administrator
|
||||||
- Change dropdown menu icon to not be replaced by close icon when open in web UI (#29532 by @Gargron)
|
- Change dropdown menu icon to not be replaced by close icon when open in web UI (#29532 by @Gargron)
|
||||||
- Change back button to always appear in advanced web UI (#29551 and #29669 by @Gargron)
|
- Change back button to always appear in advanced web UI (#29551 and #29669 by @Gargron)
|
||||||
- Change border of active compose field search inputs (#29832 and #29839 by @vmstan)
|
- Change border of active compose field search inputs (#29832 and #29839 by @vmstan)
|
||||||
- Change instances of Nokogiri HTML4 parsing to HTML5 (#31812, #31815, #31813, and #31814 by @flavorjones)
|
|
||||||
- Change link detection to allow `@` at the end of an URL (#31124 by @adamniedzielski)
|
- Change link detection to allow `@` at the end of an URL (#31124 by @adamniedzielski)
|
||||||
- Change User-Agent to use Mastodon as the product, and http.rb as platform details (#31192 by @ClearlyClaire)
|
- Change User-Agent to use Mastodon as the product, and http.rb as platform details (#31192 by @ClearlyClaire)
|
||||||
- Change layout and wording of the Content Retention server settings page (#27733 by @vmstan)
|
- Change layout and wording of the Content Retention server settings page (#27733 by @vmstan)
|
||||||
|
@ -270,17 +249,8 @@ The following changelog entries focus on changes visible to users, administrator
|
||||||
- Fix various issues when in link preview card generation (#28748, #30017, #30362, #30173, #30853, #30929, #30933, #30957, #30987, and #31144 by @adamniedzielski, @oneiros, @phocks, @timothyjrogers, and @tribela)
|
- Fix various issues when in link preview card generation (#28748, #30017, #30362, #30173, #30853, #30929, #30933, #30957, #30987, and #31144 by @adamniedzielski, @oneiros, @phocks, @timothyjrogers, and @tribela)
|
||||||
- Fix handling of missing links in Webfinger responses (#31030 by @adamniedzielski)
|
- Fix handling of missing links in Webfinger responses (#31030 by @adamniedzielski)
|
||||||
- Fix HTTP 500 error in `/api/v1/polls/:id/votes` when required `choices` parameter is missing (#25598 by @danielmbrasil)
|
- Fix HTTP 500 error in `/api/v1/polls/:id/votes` when required `choices` parameter is missing (#25598 by @danielmbrasil)
|
||||||
- Fix security context sometimes not being added in LD-Signed activities (#31871 by @ClearlyClaire)
|
|
||||||
- Fix cross-origin loading of `inert.css` polyfill (#30687 by @louis77)
|
- Fix cross-origin loading of `inert.css` polyfill (#30687 by @louis77)
|
||||||
- Fix cutoff of instance name in sign-up form (#30598 by @oneiros)
|
- Fix cutoff of instance name in sign-up form (#30598 by @oneiros)
|
||||||
- Fix invalid date searches returning 503 errors (#31526 by @notchairmk)
|
|
||||||
- Fix invalid `visibility` values in `POST /api/v1/statuses` returning 500 errors (#31571 by @c960657)
|
|
||||||
- Fix some components re-rendering spuriously in web UI (#31879 and #31881 by @ClearlyClaire and @Gargron)
|
|
||||||
- Fix sort order of moderation notes on Reports and Accounts (#31528 by @ThisIsMissEm)
|
|
||||||
- Fix email language when recipient has no selected locale (#31747 by @ClearlyClaire)
|
|
||||||
- Fix frequently-used languages not correctly updating in the web UI (#31386 by @c960657)
|
|
||||||
- Fix `POST /api/v1/statuses` silently ignoring invalid `media_ids` parameter (#31681 by @c960657)
|
|
||||||
- Fix handling of the `BIND` environment variable in the streaming server (#31624 by @ThisIsMissEm)
|
|
||||||
- Fix empty `aria-hidden` attribute value in logo resources area (#30570 by @mjankowski)
|
- Fix empty `aria-hidden` attribute value in logo resources area (#30570 by @mjankowski)
|
||||||
- Fix “Redirect URI” field not being marked as required in “New application” form (#30311 by @ThisIsMissEm)
|
- Fix “Redirect URI” field not being marked as required in “New application” form (#30311 by @ThisIsMissEm)
|
||||||
- Fix right-to-left text in preview cards (#30930 by @ClearlyClaire)
|
- Fix right-to-left text in preview cards (#30930 by @ClearlyClaire)
|
||||||
|
|
3
Gemfile
3
Gemfile
|
@ -47,6 +47,7 @@ gem 'color_diff', '~> 0.1'
|
||||||
gem 'csv', '~> 3.2'
|
gem 'csv', '~> 3.2'
|
||||||
gem 'discard', '~> 1.2'
|
gem 'discard', '~> 1.2'
|
||||||
gem 'doorkeeper', '~> 5.6'
|
gem 'doorkeeper', '~> 5.6'
|
||||||
|
gem 'ed25519', '~> 1.3'
|
||||||
gem 'fast_blank', '~> 1.0'
|
gem 'fast_blank', '~> 1.0'
|
||||||
gem 'fastimage'
|
gem 'fastimage'
|
||||||
gem 'hiredis', '~> 0.6'
|
gem 'hiredis', '~> 0.6'
|
||||||
|
@ -110,7 +111,7 @@ group :opentelemetry do
|
||||||
gem 'opentelemetry-instrumentation-http', '~> 0.23.2', require: false
|
gem 'opentelemetry-instrumentation-http', '~> 0.23.2', require: false
|
||||||
gem 'opentelemetry-instrumentation-http_client', '~> 0.22.3', require: false
|
gem 'opentelemetry-instrumentation-http_client', '~> 0.22.3', require: false
|
||||||
gem 'opentelemetry-instrumentation-net_http', '~> 0.22.4', require: false
|
gem 'opentelemetry-instrumentation-net_http', '~> 0.22.4', require: false
|
||||||
gem 'opentelemetry-instrumentation-pg', '~> 0.29.0', require: false
|
gem 'opentelemetry-instrumentation-pg', '~> 0.28.0', require: false
|
||||||
gem 'opentelemetry-instrumentation-rack', '~> 0.24.1', require: false
|
gem 'opentelemetry-instrumentation-rack', '~> 0.24.1', require: false
|
||||||
gem 'opentelemetry-instrumentation-rails', '~> 0.31.0', require: false
|
gem 'opentelemetry-instrumentation-rails', '~> 0.31.0', require: false
|
||||||
gem 'opentelemetry-instrumentation-redis', '~> 0.25.3', require: false
|
gem 'opentelemetry-instrumentation-redis', '~> 0.25.3', require: false
|
||||||
|
|
53
Gemfile.lock
53
Gemfile.lock
|
@ -100,20 +100,20 @@ GEM
|
||||||
attr_required (1.0.2)
|
attr_required (1.0.2)
|
||||||
awrence (1.2.1)
|
awrence (1.2.1)
|
||||||
aws-eventstream (1.3.0)
|
aws-eventstream (1.3.0)
|
||||||
aws-partitions (1.978.0)
|
aws-partitions (1.974.0)
|
||||||
aws-sdk-core (3.209.0)
|
aws-sdk-core (3.205.0)
|
||||||
aws-eventstream (~> 1, >= 1.3.0)
|
aws-eventstream (~> 1, >= 1.3.0)
|
||||||
aws-partitions (~> 1, >= 1.651.0)
|
aws-partitions (~> 1, >= 1.651.0)
|
||||||
aws-sigv4 (~> 1.9)
|
aws-sigv4 (~> 1.9)
|
||||||
jmespath (~> 1, >= 1.6.1)
|
jmespath (~> 1, >= 1.6.1)
|
||||||
aws-sdk-kms (1.94.0)
|
aws-sdk-kms (1.91.0)
|
||||||
aws-sdk-core (~> 3, >= 3.207.0)
|
aws-sdk-core (~> 3, >= 3.205.0)
|
||||||
aws-sigv4 (~> 1.5)
|
aws-sigv4 (~> 1.5)
|
||||||
aws-sdk-s3 (1.166.0)
|
aws-sdk-s3 (1.162.0)
|
||||||
aws-sdk-core (~> 3, >= 3.207.0)
|
aws-sdk-core (~> 3, >= 3.205.0)
|
||||||
aws-sdk-kms (~> 1)
|
aws-sdk-kms (~> 1)
|
||||||
aws-sigv4 (~> 1.5)
|
aws-sigv4 (~> 1.5)
|
||||||
aws-sigv4 (1.10.0)
|
aws-sigv4 (1.9.1)
|
||||||
aws-eventstream (~> 1, >= 1.0.2)
|
aws-eventstream (~> 1, >= 1.0.2)
|
||||||
azure-storage-blob (2.0.3)
|
azure-storage-blob (2.0.3)
|
||||||
azure-storage-common (~> 2.0)
|
azure-storage-common (~> 2.0)
|
||||||
|
@ -197,7 +197,7 @@ GEM
|
||||||
railties (>= 4.1.0)
|
railties (>= 4.1.0)
|
||||||
responders
|
responders
|
||||||
warden (~> 1.2.3)
|
warden (~> 1.2.3)
|
||||||
devise-two-factor (6.0.0)
|
devise-two-factor (5.1.0)
|
||||||
activesupport (~> 7.0)
|
activesupport (~> 7.0)
|
||||||
devise (~> 4.0)
|
devise (~> 4.0)
|
||||||
railties (~> 7.0)
|
railties (~> 7.0)
|
||||||
|
@ -212,8 +212,9 @@ GEM
|
||||||
domain_name (0.6.20240107)
|
domain_name (0.6.20240107)
|
||||||
doorkeeper (5.7.1)
|
doorkeeper (5.7.1)
|
||||||
railties (>= 5)
|
railties (>= 5)
|
||||||
dotenv (3.1.4)
|
dotenv (3.1.2)
|
||||||
drb (2.2.1)
|
drb (2.2.1)
|
||||||
|
ed25519 (1.3.0)
|
||||||
elasticsearch (7.17.11)
|
elasticsearch (7.17.11)
|
||||||
elasticsearch-api (= 7.17.11)
|
elasticsearch-api (= 7.17.11)
|
||||||
elasticsearch-transport (= 7.17.11)
|
elasticsearch-transport (= 7.17.11)
|
||||||
|
@ -289,7 +290,7 @@ GEM
|
||||||
raabro (~> 1.4)
|
raabro (~> 1.4)
|
||||||
globalid (1.2.1)
|
globalid (1.2.1)
|
||||||
activesupport (>= 6.1)
|
activesupport (>= 6.1)
|
||||||
google-protobuf (3.25.5)
|
google-protobuf (3.25.4)
|
||||||
googleapis-common-protos-types (1.15.0)
|
googleapis-common-protos-types (1.15.0)
|
||||||
google-protobuf (>= 3.18, < 5.a)
|
google-protobuf (>= 3.18, < 5.a)
|
||||||
haml (6.3.0)
|
haml (6.3.0)
|
||||||
|
@ -330,7 +331,7 @@ GEM
|
||||||
httplog (1.7.0)
|
httplog (1.7.0)
|
||||||
rack (>= 2.0)
|
rack (>= 2.0)
|
||||||
rainbow (>= 2.0.0)
|
rainbow (>= 2.0.0)
|
||||||
i18n (1.14.6)
|
i18n (1.14.5)
|
||||||
concurrent-ruby (~> 1.0)
|
concurrent-ruby (~> 1.0)
|
||||||
i18n-tasks (1.0.14)
|
i18n-tasks (1.0.14)
|
||||||
activesupport (>= 4.0.2)
|
activesupport (>= 4.0.2)
|
||||||
|
@ -406,7 +407,7 @@ GEM
|
||||||
llhttp-ffi (0.5.0)
|
llhttp-ffi (0.5.0)
|
||||||
ffi-compiler (~> 1.0)
|
ffi-compiler (~> 1.0)
|
||||||
rake (~> 13.0)
|
rake (~> 13.0)
|
||||||
logger (1.6.1)
|
logger (1.6.0)
|
||||||
lograge (0.14.0)
|
lograge (0.14.0)
|
||||||
actionpack (>= 4)
|
actionpack (>= 4)
|
||||||
activesupport (>= 4)
|
activesupport (>= 4)
|
||||||
|
@ -428,7 +429,7 @@ GEM
|
||||||
addressable (~> 2.5)
|
addressable (~> 2.5)
|
||||||
azure-storage-blob (~> 2.0.1)
|
azure-storage-blob (~> 2.0.1)
|
||||||
hashie (~> 5.0)
|
hashie (~> 5.0)
|
||||||
memory_profiler (1.1.0)
|
memory_profiler (1.0.2)
|
||||||
mime-types (3.5.2)
|
mime-types (3.5.2)
|
||||||
mime-types-data (~> 3.2015)
|
mime-types-data (~> 3.2015)
|
||||||
mime-types-data (3.2024.0820)
|
mime-types-data (3.2024.0820)
|
||||||
|
@ -471,9 +472,9 @@ GEM
|
||||||
omniauth-rails_csrf_protection (1.0.2)
|
omniauth-rails_csrf_protection (1.0.2)
|
||||||
actionpack (>= 4.2)
|
actionpack (>= 4.2)
|
||||||
omniauth (~> 2.0)
|
omniauth (~> 2.0)
|
||||||
omniauth-saml (2.2.1)
|
omniauth-saml (2.1.0)
|
||||||
omniauth (~> 2.1)
|
omniauth (~> 2.0)
|
||||||
ruby-saml (~> 1.17)
|
ruby-saml (~> 1.12)
|
||||||
omniauth_openid_connect (0.6.1)
|
omniauth_openid_connect (0.6.1)
|
||||||
omniauth (>= 1.9, < 3)
|
omniauth (>= 1.9, < 3)
|
||||||
openid_connect (~> 1.1)
|
openid_connect (~> 1.1)
|
||||||
|
@ -501,8 +502,8 @@ GEM
|
||||||
opentelemetry-common (~> 0.20)
|
opentelemetry-common (~> 0.20)
|
||||||
opentelemetry-sdk (~> 1.2)
|
opentelemetry-sdk (~> 1.2)
|
||||||
opentelemetry-semantic_conventions
|
opentelemetry-semantic_conventions
|
||||||
opentelemetry-helpers-sql-obfuscation (0.2.0)
|
opentelemetry-helpers-sql-obfuscation (0.1.0)
|
||||||
opentelemetry-common (~> 0.21)
|
opentelemetry-common (~> 0.20)
|
||||||
opentelemetry-instrumentation-action_mailer (0.1.0)
|
opentelemetry-instrumentation-action_mailer (0.1.0)
|
||||||
opentelemetry-api (~> 1.0)
|
opentelemetry-api (~> 1.0)
|
||||||
opentelemetry-instrumentation-active_support (~> 0.1)
|
opentelemetry-instrumentation-active_support (~> 0.1)
|
||||||
|
@ -527,9 +528,8 @@ GEM
|
||||||
opentelemetry-instrumentation-active_support (0.6.0)
|
opentelemetry-instrumentation-active_support (0.6.0)
|
||||||
opentelemetry-api (~> 1.0)
|
opentelemetry-api (~> 1.0)
|
||||||
opentelemetry-instrumentation-base (~> 0.22.1)
|
opentelemetry-instrumentation-base (~> 0.22.1)
|
||||||
opentelemetry-instrumentation-base (0.22.6)
|
opentelemetry-instrumentation-base (0.22.3)
|
||||||
opentelemetry-api (~> 1.0)
|
opentelemetry-api (~> 1.0)
|
||||||
opentelemetry-common (~> 0.21)
|
|
||||||
opentelemetry-registry (~> 0.1)
|
opentelemetry-registry (~> 0.1)
|
||||||
opentelemetry-instrumentation-concurrent_ruby (0.21.4)
|
opentelemetry-instrumentation-concurrent_ruby (0.21.4)
|
||||||
opentelemetry-api (~> 1.0)
|
opentelemetry-api (~> 1.0)
|
||||||
|
@ -549,7 +549,7 @@ GEM
|
||||||
opentelemetry-instrumentation-net_http (0.22.7)
|
opentelemetry-instrumentation-net_http (0.22.7)
|
||||||
opentelemetry-api (~> 1.0)
|
opentelemetry-api (~> 1.0)
|
||||||
opentelemetry-instrumentation-base (~> 0.22.1)
|
opentelemetry-instrumentation-base (~> 0.22.1)
|
||||||
opentelemetry-instrumentation-pg (0.29.0)
|
opentelemetry-instrumentation-pg (0.28.0)
|
||||||
opentelemetry-api (~> 1.0)
|
opentelemetry-api (~> 1.0)
|
||||||
opentelemetry-helpers-sql-obfuscation
|
opentelemetry-helpers-sql-obfuscation
|
||||||
opentelemetry-instrumentation-base (~> 0.22.1)
|
opentelemetry-instrumentation-base (~> 0.22.1)
|
||||||
|
@ -609,7 +609,7 @@ GEM
|
||||||
psych (5.1.2)
|
psych (5.1.2)
|
||||||
stringio
|
stringio
|
||||||
public_suffix (6.0.1)
|
public_suffix (6.0.1)
|
||||||
puma (6.4.3)
|
puma (6.4.2)
|
||||||
nio4r (~> 2.0)
|
nio4r (~> 2.0)
|
||||||
pundit (2.4.0)
|
pundit (2.4.0)
|
||||||
activesupport (>= 3.0.0)
|
activesupport (>= 3.0.0)
|
||||||
|
@ -763,7 +763,7 @@ GEM
|
||||||
rubocop-rspec (~> 3, >= 3.0.1)
|
rubocop-rspec (~> 3, >= 3.0.1)
|
||||||
ruby-prof (1.7.0)
|
ruby-prof (1.7.0)
|
||||||
ruby-progressbar (1.13.0)
|
ruby-progressbar (1.13.0)
|
||||||
ruby-saml (1.17.0)
|
ruby-saml (1.16.0)
|
||||||
nokogiri (>= 1.13.10)
|
nokogiri (>= 1.13.10)
|
||||||
rexml
|
rexml
|
||||||
ruby-vips (2.2.2)
|
ruby-vips (2.2.2)
|
||||||
|
@ -781,7 +781,7 @@ GEM
|
||||||
scenic (1.8.0)
|
scenic (1.8.0)
|
||||||
activerecord (>= 4.0.0)
|
activerecord (>= 4.0.0)
|
||||||
railties (>= 4.0.0)
|
railties (>= 4.0.0)
|
||||||
selenium-webdriver (4.25.0)
|
selenium-webdriver (4.24.0)
|
||||||
base64 (~> 0.2)
|
base64 (~> 0.2)
|
||||||
logger (~> 1.4)
|
logger (~> 1.4)
|
||||||
rexml (~> 3.2, >= 3.2.5)
|
rexml (~> 3.2, >= 3.2.5)
|
||||||
|
@ -893,7 +893,7 @@ GEM
|
||||||
rack-proxy (>= 0.6.1)
|
rack-proxy (>= 0.6.1)
|
||||||
railties (>= 5.2)
|
railties (>= 5.2)
|
||||||
semantic_range (>= 2.3.0)
|
semantic_range (>= 2.3.0)
|
||||||
webrick (1.8.2)
|
webrick (1.8.1)
|
||||||
websocket (1.2.11)
|
websocket (1.2.11)
|
||||||
websocket-driver (0.7.6)
|
websocket-driver (0.7.6)
|
||||||
websocket-extensions (>= 0.1.0)
|
websocket-extensions (>= 0.1.0)
|
||||||
|
@ -936,6 +936,7 @@ DEPENDENCIES
|
||||||
discard (~> 1.2)
|
discard (~> 1.2)
|
||||||
doorkeeper (~> 5.6)
|
doorkeeper (~> 5.6)
|
||||||
dotenv
|
dotenv
|
||||||
|
ed25519 (~> 1.3)
|
||||||
email_spec
|
email_spec
|
||||||
fabrication (~> 2.30)
|
fabrication (~> 2.30)
|
||||||
faker (~> 3.2)
|
faker (~> 3.2)
|
||||||
|
@ -990,7 +991,7 @@ DEPENDENCIES
|
||||||
opentelemetry-instrumentation-http (~> 0.23.2)
|
opentelemetry-instrumentation-http (~> 0.23.2)
|
||||||
opentelemetry-instrumentation-http_client (~> 0.22.3)
|
opentelemetry-instrumentation-http_client (~> 0.22.3)
|
||||||
opentelemetry-instrumentation-net_http (~> 0.22.4)
|
opentelemetry-instrumentation-net_http (~> 0.22.4)
|
||||||
opentelemetry-instrumentation-pg (~> 0.29.0)
|
opentelemetry-instrumentation-pg (~> 0.28.0)
|
||||||
opentelemetry-instrumentation-rack (~> 0.24.1)
|
opentelemetry-instrumentation-rack (~> 0.24.1)
|
||||||
opentelemetry-instrumentation-rails (~> 0.31.0)
|
opentelemetry-instrumentation-rails (~> 0.31.0)
|
||||||
opentelemetry-instrumentation-redis (~> 0.25.3)
|
opentelemetry-instrumentation-redis (~> 0.25.3)
|
||||||
|
|
18
app/controllers/activitypub/claims_controller.rb
Normal file
18
app/controllers/activitypub/claims_controller.rb
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
class ActivityPub::ClaimsController < ActivityPub::BaseController
|
||||||
|
skip_before_action :authenticate_user!
|
||||||
|
|
||||||
|
before_action :require_account_signature!
|
||||||
|
before_action :set_claim_result
|
||||||
|
|
||||||
|
def create
|
||||||
|
render json: @claim_result, serializer: ActivityPub::OneTimeKeySerializer
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def set_claim_result
|
||||||
|
@claim_result = ::Keys::ClaimService.new.call(@account.id, params[:id])
|
||||||
|
end
|
||||||
|
end
|
|
@ -22,6 +22,8 @@ class ActivityPub::CollectionsController < ActivityPub::BaseController
|
||||||
@items = @items.map { |item| item.distributable? ? item : ActivityPub::TagManager.instance.uri_for(item) }
|
@items = @items.map { |item| item.distributable? ? item : ActivityPub::TagManager.instance.uri_for(item) }
|
||||||
when 'tags'
|
when 'tags'
|
||||||
@items = for_signed_account { @account.featured_tags }
|
@items = for_signed_account { @account.featured_tags }
|
||||||
|
when 'devices'
|
||||||
|
@items = @account.devices
|
||||||
else
|
else
|
||||||
not_found
|
not_found
|
||||||
end
|
end
|
||||||
|
@ -29,7 +31,7 @@ class ActivityPub::CollectionsController < ActivityPub::BaseController
|
||||||
|
|
||||||
def set_size
|
def set_size
|
||||||
case params[:id]
|
case params[:id]
|
||||||
when 'featured', 'tags'
|
when 'featured', 'devices', 'tags'
|
||||||
@size = @items.size
|
@size = @items.size
|
||||||
else
|
else
|
||||||
not_found
|
not_found
|
||||||
|
@ -40,7 +42,7 @@ class ActivityPub::CollectionsController < ActivityPub::BaseController
|
||||||
case params[:id]
|
case params[:id]
|
||||||
when 'featured'
|
when 'featured'
|
||||||
@type = :ordered
|
@type = :ordered
|
||||||
when 'tags'
|
when 'devices', 'tags'
|
||||||
@type = :unordered
|
@type = :unordered
|
||||||
else
|
else
|
||||||
not_found
|
not_found
|
||||||
|
|
|
@ -1,36 +0,0 @@
|
||||||
# frozen_string_literal: true
|
|
||||||
|
|
||||||
class ActivityPub::LikesController < ActivityPub::BaseController
|
|
||||||
include Authorization
|
|
||||||
|
|
||||||
vary_by -> { 'Signature' if authorized_fetch_mode? }
|
|
||||||
|
|
||||||
before_action :require_account_signature!, if: :authorized_fetch_mode?
|
|
||||||
before_action :set_status
|
|
||||||
|
|
||||||
def index
|
|
||||||
expires_in 0, public: @status.distributable? && public_fetch_mode?
|
|
||||||
render json: likes_collection_presenter, serializer: ActivityPub::CollectionSerializer, adapter: ActivityPub::Adapter, content_type: 'application/activity+json'
|
|
||||||
end
|
|
||||||
|
|
||||||
private
|
|
||||||
|
|
||||||
def pundit_user
|
|
||||||
signed_request_account
|
|
||||||
end
|
|
||||||
|
|
||||||
def set_status
|
|
||||||
@status = @account.statuses.find(params[:status_id])
|
|
||||||
authorize @status, :show?
|
|
||||||
rescue Mastodon::NotPermittedError
|
|
||||||
not_found
|
|
||||||
end
|
|
||||||
|
|
||||||
def likes_collection_presenter
|
|
||||||
ActivityPub::CollectionPresenter.new(
|
|
||||||
id: account_status_likes_url(@account, @status),
|
|
||||||
type: :unordered,
|
|
||||||
size: @status.favourites_count
|
|
||||||
)
|
|
||||||
end
|
|
||||||
end
|
|
|
@ -12,7 +12,7 @@ class ActivityPub::RepliesController < ActivityPub::BaseController
|
||||||
before_action :set_replies
|
before_action :set_replies
|
||||||
|
|
||||||
def index
|
def index
|
||||||
expires_in 0, public: @status.distributable? && public_fetch_mode?
|
expires_in 0, public: public_fetch_mode?
|
||||||
render json: replies_collection_presenter, serializer: ActivityPub::CollectionSerializer, adapter: ActivityPub::Adapter, content_type: 'application/activity+json', skip_activities: true
|
render json: replies_collection_presenter, serializer: ActivityPub::CollectionSerializer, adapter: ActivityPub::Adapter, content_type: 'application/activity+json', skip_activities: true
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -1,36 +0,0 @@
|
||||||
# frozen_string_literal: true
|
|
||||||
|
|
||||||
class ActivityPub::SharesController < ActivityPub::BaseController
|
|
||||||
include Authorization
|
|
||||||
|
|
||||||
vary_by -> { 'Signature' if authorized_fetch_mode? }
|
|
||||||
|
|
||||||
before_action :require_account_signature!, if: :authorized_fetch_mode?
|
|
||||||
before_action :set_status
|
|
||||||
|
|
||||||
def index
|
|
||||||
expires_in 0, public: @status.distributable? && public_fetch_mode?
|
|
||||||
render json: shares_collection_presenter, serializer: ActivityPub::CollectionSerializer, adapter: ActivityPub::Adapter, content_type: 'application/activity+json'
|
|
||||||
end
|
|
||||||
|
|
||||||
private
|
|
||||||
|
|
||||||
def pundit_user
|
|
||||||
signed_request_account
|
|
||||||
end
|
|
||||||
|
|
||||||
def set_status
|
|
||||||
@status = @account.statuses.find(params[:status_id])
|
|
||||||
authorize @status, :show?
|
|
||||||
rescue Mastodon::NotPermittedError
|
|
||||||
not_found
|
|
||||||
end
|
|
||||||
|
|
||||||
def shares_collection_presenter
|
|
||||||
ActivityPub::CollectionPresenter.new(
|
|
||||||
id: account_status_shares_url(@account, @status),
|
|
||||||
type: :unordered,
|
|
||||||
size: @status.reblogs_count
|
|
||||||
)
|
|
||||||
end
|
|
||||||
end
|
|
|
@ -7,7 +7,7 @@ class Api::OEmbedController < Api::BaseController
|
||||||
before_action :require_public_status!
|
before_action :require_public_status!
|
||||||
|
|
||||||
def show
|
def show
|
||||||
render json: @status, serializer: OEmbedSerializer, width: params[:maxwidth], height: params[:maxheight]
|
render json: @status, serializer: OEmbedSerializer, width: maxwidth_or_default, height: maxheight_or_default
|
||||||
end
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
@ -23,4 +23,12 @@ class Api::OEmbedController < Api::BaseController
|
||||||
def status_finder
|
def status_finder
|
||||||
StatusFinder.new(params[:url])
|
StatusFinder.new(params[:url])
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def maxwidth_or_default
|
||||||
|
(params[:maxwidth].presence || 400).to_i
|
||||||
|
end
|
||||||
|
|
||||||
|
def maxheight_or_default
|
||||||
|
params[:maxheight].present? ? params[:maxheight].to_i : nil
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
30
app/controllers/api/v1/crypto/deliveries_controller.rb
Normal file
30
app/controllers/api/v1/crypto/deliveries_controller.rb
Normal file
|
@ -0,0 +1,30 @@
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
class Api::V1::Crypto::DeliveriesController < Api::BaseController
|
||||||
|
before_action -> { doorkeeper_authorize! :crypto }
|
||||||
|
before_action :require_user!
|
||||||
|
before_action :set_current_device
|
||||||
|
|
||||||
|
def create
|
||||||
|
devices.each do |device_params|
|
||||||
|
DeliverToDeviceService.new.call(current_account, @current_device, device_params)
|
||||||
|
end
|
||||||
|
|
||||||
|
render_empty
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def set_current_device
|
||||||
|
@current_device = Device.find_by!(access_token: doorkeeper_token)
|
||||||
|
end
|
||||||
|
|
||||||
|
def resource_params
|
||||||
|
params.require(:device)
|
||||||
|
params.permit(device: [:account_id, :device_id, :type, :body, :hmac])
|
||||||
|
end
|
||||||
|
|
||||||
|
def devices
|
||||||
|
Array(resource_params[:device])
|
||||||
|
end
|
||||||
|
end
|
|
@ -0,0 +1,47 @@
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
class Api::V1::Crypto::EncryptedMessagesController < Api::BaseController
|
||||||
|
LIMIT = 80
|
||||||
|
|
||||||
|
before_action -> { doorkeeper_authorize! :crypto }
|
||||||
|
before_action :require_user!
|
||||||
|
before_action :set_current_device
|
||||||
|
|
||||||
|
before_action :set_encrypted_messages, only: :index
|
||||||
|
after_action :insert_pagination_headers, only: :index
|
||||||
|
|
||||||
|
def index
|
||||||
|
render json: @encrypted_messages, each_serializer: REST::EncryptedMessageSerializer
|
||||||
|
end
|
||||||
|
|
||||||
|
def clear
|
||||||
|
@current_device.encrypted_messages.up_to(params[:up_to_id]).delete_all
|
||||||
|
render_empty
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def set_current_device
|
||||||
|
@current_device = Device.find_by!(access_token: doorkeeper_token)
|
||||||
|
end
|
||||||
|
|
||||||
|
def set_encrypted_messages
|
||||||
|
@encrypted_messages = @current_device.encrypted_messages.to_a_paginated_by_id(limit_param(LIMIT), params_slice(:max_id, :since_id, :min_id))
|
||||||
|
end
|
||||||
|
|
||||||
|
def next_path
|
||||||
|
api_v1_crypto_encrypted_messages_url pagination_params(max_id: pagination_max_id) if records_continue?
|
||||||
|
end
|
||||||
|
|
||||||
|
def prev_path
|
||||||
|
api_v1_crypto_encrypted_messages_url pagination_params(min_id: pagination_since_id) unless @encrypted_messages.empty?
|
||||||
|
end
|
||||||
|
|
||||||
|
def pagination_collection
|
||||||
|
@encrypted_messages
|
||||||
|
end
|
||||||
|
|
||||||
|
def records_continue?
|
||||||
|
@encrypted_messages.size == limit_param(LIMIT)
|
||||||
|
end
|
||||||
|
end
|
25
app/controllers/api/v1/crypto/keys/claims_controller.rb
Normal file
25
app/controllers/api/v1/crypto/keys/claims_controller.rb
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
class Api::V1::Crypto::Keys::ClaimsController < Api::BaseController
|
||||||
|
before_action -> { doorkeeper_authorize! :crypto }
|
||||||
|
before_action :require_user!
|
||||||
|
before_action :set_claim_results
|
||||||
|
|
||||||
|
def create
|
||||||
|
render json: @claim_results, each_serializer: REST::Keys::ClaimResultSerializer
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def set_claim_results
|
||||||
|
@claim_results = devices.filter_map { |device_params| ::Keys::ClaimService.new.call(current_account, device_params[:account_id], device_params[:device_id]) }
|
||||||
|
end
|
||||||
|
|
||||||
|
def resource_params
|
||||||
|
params.permit(device: [:account_id, :device_id])
|
||||||
|
end
|
||||||
|
|
||||||
|
def devices
|
||||||
|
Array(resource_params[:device])
|
||||||
|
end
|
||||||
|
end
|
17
app/controllers/api/v1/crypto/keys/counts_controller.rb
Normal file
17
app/controllers/api/v1/crypto/keys/counts_controller.rb
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
class Api::V1::Crypto::Keys::CountsController < Api::BaseController
|
||||||
|
before_action -> { doorkeeper_authorize! :crypto }
|
||||||
|
before_action :require_user!
|
||||||
|
before_action :set_current_device
|
||||||
|
|
||||||
|
def show
|
||||||
|
render json: { one_time_keys: @current_device.one_time_keys.count }
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def set_current_device
|
||||||
|
@current_device = Device.find_by!(access_token: doorkeeper_token)
|
||||||
|
end
|
||||||
|
end
|
26
app/controllers/api/v1/crypto/keys/queries_controller.rb
Normal file
26
app/controllers/api/v1/crypto/keys/queries_controller.rb
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
class Api::V1::Crypto::Keys::QueriesController < Api::BaseController
|
||||||
|
before_action -> { doorkeeper_authorize! :crypto }
|
||||||
|
before_action :require_user!
|
||||||
|
before_action :set_accounts
|
||||||
|
before_action :set_query_results
|
||||||
|
|
||||||
|
def create
|
||||||
|
render json: @query_results, each_serializer: REST::Keys::QueryResultSerializer
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def set_accounts
|
||||||
|
@accounts = Account.where(id: account_ids).includes(:devices)
|
||||||
|
end
|
||||||
|
|
||||||
|
def set_query_results
|
||||||
|
@query_results = @accounts.filter_map { |account| ::Keys::QueryService.new.call(account) }
|
||||||
|
end
|
||||||
|
|
||||||
|
def account_ids
|
||||||
|
Array(params[:id]).map(&:to_i)
|
||||||
|
end
|
||||||
|
end
|
29
app/controllers/api/v1/crypto/keys/uploads_controller.rb
Normal file
29
app/controllers/api/v1/crypto/keys/uploads_controller.rb
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
class Api::V1::Crypto::Keys::UploadsController < Api::BaseController
|
||||||
|
before_action -> { doorkeeper_authorize! :crypto }
|
||||||
|
before_action :require_user!
|
||||||
|
|
||||||
|
def create
|
||||||
|
device = Device.find_or_initialize_by(access_token: doorkeeper_token)
|
||||||
|
|
||||||
|
device.transaction do
|
||||||
|
device.account = current_account
|
||||||
|
device.update!(resource_params[:device])
|
||||||
|
|
||||||
|
if resource_params[:one_time_keys].present? && resource_params[:one_time_keys].is_a?(Enumerable)
|
||||||
|
resource_params[:one_time_keys].each do |one_time_key_params|
|
||||||
|
device.one_time_keys.create!(one_time_key_params)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
render json: device, serializer: REST::Keys::DeviceSerializer
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def resource_params
|
||||||
|
params.permit(device: [:device_id, :name, :fingerprint_key, :identity_key], one_time_keys: [:key_id, :key, :signature])
|
||||||
|
end
|
||||||
|
end
|
|
@ -1,27 +0,0 @@
|
||||||
# frozen_string_literal: true
|
|
||||||
|
|
||||||
class Api::V1::DomainBlocks::PreviewsController < Api::BaseController
|
|
||||||
before_action -> { doorkeeper_authorize! :follow, :write, :'write:blocks' }
|
|
||||||
before_action :require_user!
|
|
||||||
before_action :set_domain
|
|
||||||
before_action :set_domain_block_preview
|
|
||||||
|
|
||||||
def show
|
|
||||||
render json: @domain_block_preview, serializer: REST::DomainBlockPreviewSerializer
|
|
||||||
end
|
|
||||||
|
|
||||||
private
|
|
||||||
|
|
||||||
def set_domain
|
|
||||||
@domain = TagManager.instance.normalize_domain(params[:domain])
|
|
||||||
end
|
|
||||||
|
|
||||||
def set_domain_block_preview
|
|
||||||
@domain_block_preview = with_read_replica do
|
|
||||||
DomainBlockPreviewPresenter.new(
|
|
||||||
following_count: current_account.following.where(domain: @domain).count,
|
|
||||||
followers_count: current_account.followers.where(domain: @domain).count
|
|
||||||
)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
|
@ -7,8 +7,6 @@ class Api::V1::Peers::SearchController < Api::BaseController
|
||||||
skip_before_action :require_authenticated_user!, unless: :limited_federation_mode?
|
skip_before_action :require_authenticated_user!, unless: :limited_federation_mode?
|
||||||
skip_around_action :set_locale
|
skip_around_action :set_locale
|
||||||
|
|
||||||
LIMIT = 10
|
|
||||||
|
|
||||||
vary_by ''
|
vary_by ''
|
||||||
|
|
||||||
def index
|
def index
|
||||||
|
@ -37,10 +35,10 @@ class Api::V1::Peers::SearchController < Api::BaseController
|
||||||
field: 'accounts_count',
|
field: 'accounts_count',
|
||||||
modifier: 'log2p',
|
modifier: 'log2p',
|
||||||
},
|
},
|
||||||
}).limit(LIMIT).pluck(:domain)
|
}).limit(10).pluck(:domain)
|
||||||
else
|
else
|
||||||
domain = normalized_domain
|
domain = normalized_domain
|
||||||
@domains = Instance.searchable.domain_starts_with(domain).limit(LIMIT).pluck(:domain)
|
@domains = Instance.searchable.domain_starts_with(domain).limit(10).pluck(:domain)
|
||||||
end
|
end
|
||||||
rescue Addressable::URI::InvalidURIError
|
rescue Addressable::URI::InvalidURIError
|
||||||
@domains = []
|
@domains = []
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
# frozen_string_literal: true
|
# frozen_string_literal: true
|
||||||
|
|
||||||
class Api::V2::Notifications::AccountsController < Api::BaseController
|
class Api::V2Alpha::Notifications::AccountsController < Api::BaseController
|
||||||
before_action -> { doorkeeper_authorize! :read, :'read:notifications' }
|
before_action -> { doorkeeper_authorize! :read, :'read:notifications' }
|
||||||
before_action :require_user!
|
before_action :require_user!
|
||||||
before_action :set_notifications!
|
before_action :set_notifications!
|
||||||
|
@ -33,11 +33,11 @@ class Api::V2::Notifications::AccountsController < Api::BaseController
|
||||||
end
|
end
|
||||||
|
|
||||||
def next_path
|
def next_path
|
||||||
api_v2_notification_accounts_url pagination_params(max_id: pagination_max_id) if records_continue?
|
api_v2_alpha_notification_accounts_url pagination_params(max_id: pagination_max_id) if records_continue?
|
||||||
end
|
end
|
||||||
|
|
||||||
def prev_path
|
def prev_path
|
||||||
api_v2_notification_accounts_url pagination_params(min_id: pagination_since_id) unless @paginated_notifications.empty?
|
api_v2_alpha_notification_accounts_url pagination_params(min_id: pagination_since_id) unless @paginated_notifications.empty?
|
||||||
end
|
end
|
||||||
|
|
||||||
def pagination_collection
|
def pagination_collection
|
|
@ -1,6 +1,6 @@
|
||||||
# frozen_string_literal: true
|
# frozen_string_literal: true
|
||||||
|
|
||||||
class Api::V2::NotificationsController < Api::BaseController
|
class Api::V2Alpha::NotificationsController < Api::BaseController
|
||||||
before_action -> { doorkeeper_authorize! :read, :'read:notifications' }, except: [:clear, :dismiss]
|
before_action -> { doorkeeper_authorize! :read, :'read:notifications' }, except: [:clear, :dismiss]
|
||||||
before_action -> { doorkeeper_authorize! :write, :'write:notifications' }, only: [:clear, :dismiss]
|
before_action -> { doorkeeper_authorize! :write, :'write:notifications' }, only: [:clear, :dismiss]
|
||||||
before_action :require_user!
|
before_action :require_user!
|
||||||
|
@ -21,7 +21,7 @@ class Api::V2::NotificationsController < Api::BaseController
|
||||||
ActiveRecord::Associations::Preloader.new(records: @presenter.accounts, associations: [:account_stat, { user: :role }]).call
|
ActiveRecord::Associations::Preloader.new(records: @presenter.accounts, associations: [:account_stat, { user: :role }]).call
|
||||||
end
|
end
|
||||||
|
|
||||||
MastodonOTELTracer.in_span('Api::V2::NotificationsController#index rendering') do |span|
|
MastodonOTELTracer.in_span('Api::V2Alpha::NotificationsController#index rendering') do |span|
|
||||||
statuses = @grouped_notifications.filter_map { |group| group.target_status&.id }
|
statuses = @grouped_notifications.filter_map { |group| group.target_status&.id }
|
||||||
|
|
||||||
span.add_attributes(
|
span.add_attributes(
|
||||||
|
@ -64,7 +64,7 @@ class Api::V2::NotificationsController < Api::BaseController
|
||||||
private
|
private
|
||||||
|
|
||||||
def load_notifications
|
def load_notifications
|
||||||
MastodonOTELTracer.in_span('Api::V2::NotificationsController#load_notifications') do
|
MastodonOTELTracer.in_span('Api::V2Alpha::NotificationsController#load_notifications') do
|
||||||
notifications = browserable_account_notifications.includes(from_account: [:account_stat, :user]).to_a_grouped_paginated_by_id(
|
notifications = browserable_account_notifications.includes(from_account: [:account_stat, :user]).to_a_grouped_paginated_by_id(
|
||||||
limit_param(DEFAULT_NOTIFICATIONS_LIMIT),
|
limit_param(DEFAULT_NOTIFICATIONS_LIMIT),
|
||||||
params.slice(:max_id, :since_id, :min_id, :grouped_types).permit(:max_id, :since_id, :min_id, grouped_types: [])
|
params.slice(:max_id, :since_id, :min_id, :grouped_types).permit(:max_id, :since_id, :min_id, grouped_types: [])
|
||||||
|
@ -79,7 +79,7 @@ class Api::V2::NotificationsController < Api::BaseController
|
||||||
def load_grouped_notifications
|
def load_grouped_notifications
|
||||||
return [] if @notifications.empty?
|
return [] if @notifications.empty?
|
||||||
|
|
||||||
MastodonOTELTracer.in_span('Api::V2::NotificationsController#load_grouped_notifications') do
|
MastodonOTELTracer.in_span('Api::V2Alpha::NotificationsController#load_grouped_notifications') do
|
||||||
NotificationGroup.from_notifications(@notifications, pagination_range: (@notifications.last.id)..(@notifications.first.id), grouped_types: params[:grouped_types])
|
NotificationGroup.from_notifications(@notifications, pagination_range: (@notifications.last.id)..(@notifications.first.id), grouped_types: params[:grouped_types])
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -101,11 +101,11 @@ class Api::V2::NotificationsController < Api::BaseController
|
||||||
end
|
end
|
||||||
|
|
||||||
def next_path
|
def next_path
|
||||||
api_v2_notifications_url pagination_params(max_id: pagination_max_id) unless @notifications.empty?
|
api_v2_alpha_notifications_url pagination_params(max_id: pagination_max_id) unless @notifications.empty?
|
||||||
end
|
end
|
||||||
|
|
||||||
def prev_path
|
def prev_path
|
||||||
api_v2_notifications_url pagination_params(min_id: pagination_since_id) unless @notifications.empty?
|
api_v2_alpha_notifications_url pagination_params(min_id: pagination_since_id) unless @notifications.empty?
|
||||||
end
|
end
|
||||||
|
|
||||||
def pagination_collection
|
def pagination_collection
|
|
@ -9,7 +9,7 @@ class Api::Web::EmbedsController < Api::Web::BaseController
|
||||||
return not_found if @status.hidden?
|
return not_found if @status.hidden?
|
||||||
|
|
||||||
if @status.local?
|
if @status.local?
|
||||||
render json: @status, serializer: OEmbedSerializer
|
render json: @status, serializer: OEmbedSerializer, width: 400
|
||||||
else
|
else
|
||||||
return not_found unless user_signed_in?
|
return not_found unless user_signed_in?
|
||||||
|
|
||||||
|
|
|
@ -20,6 +20,11 @@ class Auth::SessionsController < Devise::SessionsController
|
||||||
p.form_action(false)
|
p.form_action(false)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def check_suspicious!
|
||||||
|
user = find_user
|
||||||
|
@login_is_suspicious = suspicious_sign_in?(user) unless user.nil?
|
||||||
|
end
|
||||||
|
|
||||||
def create
|
def create
|
||||||
super do |resource|
|
super do |resource|
|
||||||
# We only need to call this if this hasn't already been
|
# We only need to call this if this hasn't already been
|
||||||
|
@ -96,11 +101,6 @@ class Auth::SessionsController < Devise::SessionsController
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
def check_suspicious!
|
|
||||||
user = find_user
|
|
||||||
@login_is_suspicious = suspicious_sign_in?(user) unless user.nil?
|
|
||||||
end
|
|
||||||
|
|
||||||
def home_paths(resource)
|
def home_paths(resource)
|
||||||
paths = [about_path, '/explore']
|
paths = [about_path, '/explore']
|
||||||
|
|
||||||
|
|
|
@ -31,7 +31,7 @@ module WebAppControllerConcern
|
||||||
def redirect_unauthenticated_to_permalinks!
|
def redirect_unauthenticated_to_permalinks!
|
||||||
return if user_signed_in? && current_account.moved_to_account_id.nil?
|
return if user_signed_in? && current_account.moved_to_account_id.nil?
|
||||||
|
|
||||||
permalink_redirector = PermalinkRedirector.new(request.original_fullpath)
|
permalink_redirector = PermalinkRedirector.new(request.path)
|
||||||
return if permalink_redirector.redirect_path.blank?
|
return if permalink_redirector.redirect_path.blank?
|
||||||
|
|
||||||
expires_in(15.seconds, public: true, stale_while_revalidate: 30.seconds, stale_if_error: 1.day) unless user_signed_in?
|
expires_in(15.seconds, public: true, stale_while_revalidate: 30.seconds, stale_if_error: 1.day) unless user_signed_in?
|
||||||
|
|
|
@ -23,6 +23,23 @@ module ContextHelper
|
||||||
indexable: { 'toot' => 'http://joinmastodon.org/ns#', 'indexable' => 'toot:indexable' },
|
indexable: { 'toot' => 'http://joinmastodon.org/ns#', 'indexable' => 'toot:indexable' },
|
||||||
memorial: { 'toot' => 'http://joinmastodon.org/ns#', 'memorial' => 'toot:memorial' },
|
memorial: { 'toot' => 'http://joinmastodon.org/ns#', 'memorial' => 'toot:memorial' },
|
||||||
voters_count: { 'toot' => 'http://joinmastodon.org/ns#', 'votersCount' => 'toot:votersCount' },
|
voters_count: { 'toot' => 'http://joinmastodon.org/ns#', 'votersCount' => 'toot:votersCount' },
|
||||||
|
olm: {
|
||||||
|
'toot' => 'http://joinmastodon.org/ns#',
|
||||||
|
'Device' => 'toot:Device',
|
||||||
|
'Ed25519Signature' => 'toot:Ed25519Signature',
|
||||||
|
'Ed25519Key' => 'toot:Ed25519Key',
|
||||||
|
'Curve25519Key' => 'toot:Curve25519Key',
|
||||||
|
'EncryptedMessage' => 'toot:EncryptedMessage',
|
||||||
|
'publicKeyBase64' => 'toot:publicKeyBase64',
|
||||||
|
'deviceId' => 'toot:deviceId',
|
||||||
|
'claim' => { '@type' => '@id', '@id' => 'toot:claim' },
|
||||||
|
'fingerprintKey' => { '@type' => '@id', '@id' => 'toot:fingerprintKey' },
|
||||||
|
'identityKey' => { '@type' => '@id', '@id' => 'toot:identityKey' },
|
||||||
|
'devices' => { '@type' => '@id', '@id' => 'toot:devices' },
|
||||||
|
'messageFranking' => 'toot:messageFranking',
|
||||||
|
'messageType' => 'toot:messageType',
|
||||||
|
'cipherText' => 'toot:cipherText',
|
||||||
|
},
|
||||||
suspended: { 'toot' => 'http://joinmastodon.org/ns#', 'suspended' => 'toot:suspended' },
|
suspended: { 'toot' => 'http://joinmastodon.org/ns#', 'suspended' => 'toot:suspended' },
|
||||||
attribution_domains: { 'toot' => 'http://joinmastodon.org/ns#', 'attributionDomains' => { '@id' => 'toot:attributionDomains', '@type' => '@id' } },
|
attribution_domains: { 'toot' => 'http://joinmastodon.org/ns#', 'attributionDomains' => { '@id' => 'toot:attributionDomains', '@type' => '@id' } },
|
||||||
}.freeze
|
}.freeze
|
||||||
|
|
|
@ -1,31 +0,0 @@
|
||||||
import { useMemo, useCallback } from 'react';
|
|
||||||
|
|
||||||
import { useLocation, useHistory } from 'react-router';
|
|
||||||
|
|
||||||
export function useSearchParams() {
|
|
||||||
const { search } = useLocation();
|
|
||||||
|
|
||||||
return useMemo(() => new URLSearchParams(search), [search]);
|
|
||||||
}
|
|
||||||
|
|
||||||
export function useSearchParam(name: string, defaultValue?: string) {
|
|
||||||
const searchParams = useSearchParams();
|
|
||||||
const history = useHistory();
|
|
||||||
|
|
||||||
const value = searchParams.get(name) ?? defaultValue;
|
|
||||||
|
|
||||||
const setValue = useCallback(
|
|
||||||
(value: string | null) => {
|
|
||||||
if (value === null) {
|
|
||||||
searchParams.delete(name);
|
|
||||||
} else {
|
|
||||||
searchParams.set(name, value);
|
|
||||||
}
|
|
||||||
|
|
||||||
history.push({ search: searchParams.toString() });
|
|
||||||
},
|
|
||||||
[history, name, searchParams],
|
|
||||||
);
|
|
||||||
|
|
||||||
return [value, setValue] as const;
|
|
||||||
}
|
|
|
@ -1,5 +1,4 @@
|
||||||
import { browserHistory } from 'mastodon/components/router';
|
import { browserHistory } from 'mastodon/components/router';
|
||||||
import { debounceWithDispatchAndArguments } from 'mastodon/utils/debounce';
|
|
||||||
|
|
||||||
import api, { getLinks } from '../api';
|
import api, { getLinks } from '../api';
|
||||||
|
|
||||||
|
@ -450,20 +449,6 @@ export function expandFollowingFail(id, error) {
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
const debouncedFetchRelationships = debounceWithDispatchAndArguments((dispatch, ...newAccountIds) => {
|
|
||||||
if (newAccountIds.length === 0) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
dispatch(fetchRelationshipsRequest(newAccountIds));
|
|
||||||
|
|
||||||
api().get(`/api/v1/accounts/relationships?with_suspended=true&${newAccountIds.map(id => `id[]=${id}`).join('&')}`).then(response => {
|
|
||||||
dispatch(fetchRelationshipsSuccess({ relationships: response.data }));
|
|
||||||
}).catch(error => {
|
|
||||||
dispatch(fetchRelationshipsFail(error));
|
|
||||||
});
|
|
||||||
}, { delay: 500 });
|
|
||||||
|
|
||||||
export function fetchRelationships(accountIds) {
|
export function fetchRelationships(accountIds) {
|
||||||
return (dispatch, getState) => {
|
return (dispatch, getState) => {
|
||||||
const state = getState();
|
const state = getState();
|
||||||
|
@ -475,7 +460,13 @@ export function fetchRelationships(accountIds) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
debouncedFetchRelationships(dispatch, ...newAccountIds);
|
dispatch(fetchRelationshipsRequest(newAccountIds));
|
||||||
|
|
||||||
|
api().get(`/api/v1/accounts/relationships?with_suspended=true&${newAccountIds.map(id => `id[]=${id}`).join('&')}`).then(response => {
|
||||||
|
dispatch(fetchRelationshipsSuccess({ relationships: response.data }));
|
||||||
|
}).catch(error => {
|
||||||
|
dispatch(fetchRelationshipsFail(error));
|
||||||
|
});
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,5 @@
|
||||||
import { defineMessages } from 'react-intl';
|
import { defineMessages } from 'react-intl';
|
||||||
|
|
||||||
import { AxiosError } from 'axios';
|
|
||||||
|
|
||||||
const messages = defineMessages({
|
const messages = defineMessages({
|
||||||
unexpectedTitle: { id: 'alert.unexpected.title', defaultMessage: 'Oops!' },
|
unexpectedTitle: { id: 'alert.unexpected.title', defaultMessage: 'Oops!' },
|
||||||
unexpectedMessage: { id: 'alert.unexpected.message', defaultMessage: 'An unexpected error occurred.' },
|
unexpectedMessage: { id: 'alert.unexpected.message', defaultMessage: 'An unexpected error occurred.' },
|
||||||
|
@ -52,11 +50,6 @@ export const showAlertForError = (error, skipNotFound = false) => {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
// An aborted request, e.g. due to reloading the browser window, it not really error
|
|
||||||
if (error.code === AxiosError.ECONNABORTED) {
|
|
||||||
return { type: ALERT_NOOP };
|
|
||||||
}
|
|
||||||
|
|
||||||
console.error(error);
|
console.error(error);
|
||||||
|
|
||||||
return showAlert({
|
return showAlert({
|
||||||
|
|
|
@ -2,6 +2,7 @@ import { debounce } from 'lodash';
|
||||||
|
|
||||||
import type { MarkerJSON } from 'mastodon/api_types/markers';
|
import type { MarkerJSON } from 'mastodon/api_types/markers';
|
||||||
import { getAccessToken } from 'mastodon/initial_state';
|
import { getAccessToken } from 'mastodon/initial_state';
|
||||||
|
import { selectUseGroupedNotifications } from 'mastodon/selectors/settings';
|
||||||
import type { AppDispatch, RootState } from 'mastodon/store';
|
import type { AppDispatch, RootState } from 'mastodon/store';
|
||||||
import { createAppAsyncThunk } from 'mastodon/store/typed_functions';
|
import { createAppAsyncThunk } from 'mastodon/store/typed_functions';
|
||||||
|
|
||||||
|
@ -75,7 +76,12 @@ interface MarkerParam {
|
||||||
}
|
}
|
||||||
|
|
||||||
function getLastNotificationId(state: RootState): string | undefined {
|
function getLastNotificationId(state: RootState): string | undefined {
|
||||||
return state.notificationGroups.lastReadId;
|
// eslint-disable-next-line @typescript-eslint/no-unsafe-return
|
||||||
|
return selectUseGroupedNotifications(state)
|
||||||
|
? state.notificationGroups.lastReadId
|
||||||
|
: // @ts-expect-error state.notifications is not yet typed
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-unsafe-call
|
||||||
|
state.getIn(['notifications', 'lastReadId']);
|
||||||
}
|
}
|
||||||
|
|
||||||
const buildPostMarkersParams = (state: RootState) => {
|
const buildPostMarkersParams = (state: RootState) => {
|
||||||
|
|
|
@ -2,7 +2,7 @@ import { createAction } from '@reduxjs/toolkit';
|
||||||
|
|
||||||
import {
|
import {
|
||||||
apiClearNotifications,
|
apiClearNotifications,
|
||||||
apiFetchNotificationGroups,
|
apiFetchNotifications,
|
||||||
} from 'mastodon/api/notifications';
|
} from 'mastodon/api/notifications';
|
||||||
import type { ApiAccountJSON } from 'mastodon/api_types/accounts';
|
import type { ApiAccountJSON } from 'mastodon/api_types/accounts';
|
||||||
import type {
|
import type {
|
||||||
|
@ -68,15 +68,10 @@ function dispatchAssociatedRecords(
|
||||||
dispatch(importFetchedStatuses(fetchedStatuses));
|
dispatch(importFetchedStatuses(fetchedStatuses));
|
||||||
}
|
}
|
||||||
|
|
||||||
const supportedGroupedNotificationTypes = ['favourite', 'reblog'];
|
|
||||||
|
|
||||||
export const fetchNotifications = createDataLoadingThunk(
|
export const fetchNotifications = createDataLoadingThunk(
|
||||||
'notificationGroups/fetch',
|
'notificationGroups/fetch',
|
||||||
async (_params, { getState }) =>
|
async (_params, { getState }) =>
|
||||||
apiFetchNotificationGroups({
|
apiFetchNotifications({ exclude_types: getExcludedTypes(getState()) }),
|
||||||
grouped_types: supportedGroupedNotificationTypes,
|
|
||||||
exclude_types: getExcludedTypes(getState()),
|
|
||||||
}),
|
|
||||||
({ notifications, accounts, statuses }, { dispatch }) => {
|
({ notifications, accounts, statuses }, { dispatch }) => {
|
||||||
dispatch(importFetchedAccounts(accounts));
|
dispatch(importFetchedAccounts(accounts));
|
||||||
dispatch(importFetchedStatuses(statuses));
|
dispatch(importFetchedStatuses(statuses));
|
||||||
|
@ -97,8 +92,7 @@ export const fetchNotifications = createDataLoadingThunk(
|
||||||
export const fetchNotificationsGap = createDataLoadingThunk(
|
export const fetchNotificationsGap = createDataLoadingThunk(
|
||||||
'notificationGroups/fetchGap',
|
'notificationGroups/fetchGap',
|
||||||
async (params: { gap: NotificationGap }, { getState }) =>
|
async (params: { gap: NotificationGap }, { getState }) =>
|
||||||
apiFetchNotificationGroups({
|
apiFetchNotifications({
|
||||||
grouped_types: supportedGroupedNotificationTypes,
|
|
||||||
max_id: params.gap.maxId,
|
max_id: params.gap.maxId,
|
||||||
exclude_types: getExcludedTypes(getState()),
|
exclude_types: getExcludedTypes(getState()),
|
||||||
}),
|
}),
|
||||||
|
@ -114,8 +108,7 @@ export const fetchNotificationsGap = createDataLoadingThunk(
|
||||||
export const pollRecentNotifications = createDataLoadingThunk(
|
export const pollRecentNotifications = createDataLoadingThunk(
|
||||||
'notificationGroups/pollRecentNotifications',
|
'notificationGroups/pollRecentNotifications',
|
||||||
async (_params, { getState }) => {
|
async (_params, { getState }) => {
|
||||||
return apiFetchNotificationGroups({
|
return apiFetchNotifications({
|
||||||
grouped_types: supportedGroupedNotificationTypes,
|
|
||||||
max_id: undefined,
|
max_id: undefined,
|
||||||
exclude_types: getExcludedTypes(getState()),
|
exclude_types: getExcludedTypes(getState()),
|
||||||
// In slow mode, we don't want to include notifications that duplicate the already-displayed ones
|
// In slow mode, we don't want to include notifications that duplicate the already-displayed ones
|
||||||
|
|
|
@ -17,6 +17,6 @@ export const updateNotificationsPolicy = createDataLoadingThunk(
|
||||||
(policy: Partial<NotificationPolicy>) => apiUpdateNotificationsPolicy(policy),
|
(policy: Partial<NotificationPolicy>) => apiUpdateNotificationsPolicy(policy),
|
||||||
);
|
);
|
||||||
|
|
||||||
export const decreasePendingRequestsCount = createAction<number>(
|
export const decreasePendingNotificationsCount = createAction<number>(
|
||||||
'notificationPolicy/decreasePendingRequestsCount',
|
'notificationPolicy/decreasePendingNotificationCount',
|
||||||
);
|
);
|
||||||
|
|
|
@ -1,214 +0,0 @@
|
||||||
import {
|
|
||||||
apiFetchNotificationRequest,
|
|
||||||
apiFetchNotificationRequests,
|
|
||||||
apiFetchNotifications,
|
|
||||||
apiAcceptNotificationRequest,
|
|
||||||
apiDismissNotificationRequest,
|
|
||||||
apiAcceptNotificationRequests,
|
|
||||||
apiDismissNotificationRequests,
|
|
||||||
} from 'mastodon/api/notifications';
|
|
||||||
import type { ApiAccountJSON } from 'mastodon/api_types/accounts';
|
|
||||||
import type {
|
|
||||||
ApiNotificationGroupJSON,
|
|
||||||
ApiNotificationJSON,
|
|
||||||
} from 'mastodon/api_types/notifications';
|
|
||||||
import type { ApiStatusJSON } from 'mastodon/api_types/statuses';
|
|
||||||
import type { AppDispatch } from 'mastodon/store';
|
|
||||||
import { createDataLoadingThunk } from 'mastodon/store/typed_functions';
|
|
||||||
|
|
||||||
import { importFetchedAccounts, importFetchedStatuses } from './importer';
|
|
||||||
import { decreasePendingRequestsCount } from './notification_policies';
|
|
||||||
|
|
||||||
// TODO: refactor with notification_groups
|
|
||||||
function dispatchAssociatedRecords(
|
|
||||||
dispatch: AppDispatch,
|
|
||||||
notifications: ApiNotificationGroupJSON[] | ApiNotificationJSON[],
|
|
||||||
) {
|
|
||||||
const fetchedAccounts: ApiAccountJSON[] = [];
|
|
||||||
const fetchedStatuses: ApiStatusJSON[] = [];
|
|
||||||
|
|
||||||
notifications.forEach((notification) => {
|
|
||||||
if (notification.type === 'admin.report') {
|
|
||||||
fetchedAccounts.push(notification.report.target_account);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (notification.type === 'moderation_warning') {
|
|
||||||
fetchedAccounts.push(notification.moderation_warning.target_account);
|
|
||||||
}
|
|
||||||
|
|
||||||
if ('status' in notification && notification.status) {
|
|
||||||
fetchedStatuses.push(notification.status);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
if (fetchedAccounts.length > 0)
|
|
||||||
dispatch(importFetchedAccounts(fetchedAccounts));
|
|
||||||
|
|
||||||
if (fetchedStatuses.length > 0)
|
|
||||||
dispatch(importFetchedStatuses(fetchedStatuses));
|
|
||||||
}
|
|
||||||
|
|
||||||
export const fetchNotificationRequests = createDataLoadingThunk(
|
|
||||||
'notificationRequests/fetch',
|
|
||||||
async (_params, { getState }) => {
|
|
||||||
let sinceId = undefined;
|
|
||||||
|
|
||||||
if (getState().notificationRequests.items.length > 0) {
|
|
||||||
sinceId = getState().notificationRequests.items[0]?.id;
|
|
||||||
}
|
|
||||||
|
|
||||||
return apiFetchNotificationRequests({
|
|
||||||
since_id: sinceId,
|
|
||||||
});
|
|
||||||
},
|
|
||||||
({ requests, links }, { dispatch }) => {
|
|
||||||
const next = links.refs.find((link) => link.rel === 'next');
|
|
||||||
|
|
||||||
dispatch(importFetchedAccounts(requests.map((request) => request.account)));
|
|
||||||
|
|
||||||
return { requests, next: next?.uri };
|
|
||||||
},
|
|
||||||
{
|
|
||||||
condition: (_params, { getState }) =>
|
|
||||||
!getState().notificationRequests.isLoading,
|
|
||||||
},
|
|
||||||
);
|
|
||||||
|
|
||||||
export const fetchNotificationRequest = createDataLoadingThunk(
|
|
||||||
'notificationRequest/fetch',
|
|
||||||
async ({ id }: { id: string }) => apiFetchNotificationRequest(id),
|
|
||||||
{
|
|
||||||
condition: ({ id }, { getState }) =>
|
|
||||||
!(
|
|
||||||
getState().notificationRequests.current.item?.id === id ||
|
|
||||||
getState().notificationRequests.current.isLoading
|
|
||||||
),
|
|
||||||
},
|
|
||||||
);
|
|
||||||
|
|
||||||
export const expandNotificationRequests = createDataLoadingThunk(
|
|
||||||
'notificationRequests/expand',
|
|
||||||
async (_, { getState }) => {
|
|
||||||
const nextUrl = getState().notificationRequests.next;
|
|
||||||
if (!nextUrl) throw new Error('missing URL');
|
|
||||||
|
|
||||||
return apiFetchNotificationRequests(undefined, nextUrl);
|
|
||||||
},
|
|
||||||
({ requests, links }, { dispatch }) => {
|
|
||||||
const next = links.refs.find((link) => link.rel === 'next');
|
|
||||||
|
|
||||||
dispatch(importFetchedAccounts(requests.map((request) => request.account)));
|
|
||||||
|
|
||||||
return { requests, next: next?.uri };
|
|
||||||
},
|
|
||||||
{
|
|
||||||
condition: (_, { getState }) =>
|
|
||||||
!!getState().notificationRequests.next &&
|
|
||||||
!getState().notificationRequests.isLoading,
|
|
||||||
},
|
|
||||||
);
|
|
||||||
|
|
||||||
export const fetchNotificationsForRequest = createDataLoadingThunk(
|
|
||||||
'notificationRequest/fetchNotifications',
|
|
||||||
async ({ accountId }: { accountId: string }, { getState }) => {
|
|
||||||
const sinceId =
|
|
||||||
// @ts-expect-error current.notifications.items is not yet typed
|
|
||||||
// eslint-disable-next-line @typescript-eslint/no-unsafe-call
|
|
||||||
getState().notificationRequests.current.notifications.items[0]?.get(
|
|
||||||
'id',
|
|
||||||
) as string | undefined;
|
|
||||||
|
|
||||||
return apiFetchNotifications({
|
|
||||||
since_id: sinceId,
|
|
||||||
account_id: accountId,
|
|
||||||
});
|
|
||||||
},
|
|
||||||
({ notifications, links }, { dispatch }) => {
|
|
||||||
const next = links.refs.find((link) => link.rel === 'next');
|
|
||||||
|
|
||||||
dispatchAssociatedRecords(dispatch, notifications);
|
|
||||||
|
|
||||||
return { notifications, next: next?.uri };
|
|
||||||
},
|
|
||||||
{
|
|
||||||
condition: ({ accountId }, { getState }) => {
|
|
||||||
const current = getState().notificationRequests.current;
|
|
||||||
return !(
|
|
||||||
current.item?.account_id === accountId &&
|
|
||||||
current.notifications.isLoading
|
|
||||||
);
|
|
||||||
},
|
|
||||||
},
|
|
||||||
);
|
|
||||||
|
|
||||||
export const expandNotificationsForRequest = createDataLoadingThunk(
|
|
||||||
'notificationRequest/expandNotifications',
|
|
||||||
async (_, { getState }) => {
|
|
||||||
const nextUrl = getState().notificationRequests.current.notifications.next;
|
|
||||||
if (!nextUrl) throw new Error('missing URL');
|
|
||||||
|
|
||||||
return apiFetchNotifications(undefined, nextUrl);
|
|
||||||
},
|
|
||||||
({ notifications, links }, { dispatch }) => {
|
|
||||||
const next = links.refs.find((link) => link.rel === 'next');
|
|
||||||
|
|
||||||
dispatchAssociatedRecords(dispatch, notifications);
|
|
||||||
|
|
||||||
return { notifications, next: next?.uri };
|
|
||||||
},
|
|
||||||
{
|
|
||||||
condition: ({ accountId }: { accountId: string }, { getState }) => {
|
|
||||||
const url = getState().notificationRequests.current.notifications.next;
|
|
||||||
|
|
||||||
return (
|
|
||||||
!!url &&
|
|
||||||
!getState().notificationRequests.current.notifications.isLoading &&
|
|
||||||
getState().notificationRequests.current.item?.account_id === accountId
|
|
||||||
);
|
|
||||||
},
|
|
||||||
},
|
|
||||||
);
|
|
||||||
|
|
||||||
export const acceptNotificationRequest = createDataLoadingThunk(
|
|
||||||
'notificationRequest/accept',
|
|
||||||
({ id }: { id: string }) => apiAcceptNotificationRequest(id),
|
|
||||||
(_data, { dispatch, discardLoadData }) => {
|
|
||||||
dispatch(decreasePendingRequestsCount(1));
|
|
||||||
|
|
||||||
// The payload is not used in any functions
|
|
||||||
return discardLoadData;
|
|
||||||
},
|
|
||||||
);
|
|
||||||
|
|
||||||
export const dismissNotificationRequest = createDataLoadingThunk(
|
|
||||||
'notificationRequest/dismiss',
|
|
||||||
({ id }: { id: string }) => apiDismissNotificationRequest(id),
|
|
||||||
(_data, { dispatch, discardLoadData }) => {
|
|
||||||
dispatch(decreasePendingRequestsCount(1));
|
|
||||||
|
|
||||||
// The payload is not used in any functions
|
|
||||||
return discardLoadData;
|
|
||||||
},
|
|
||||||
);
|
|
||||||
|
|
||||||
export const acceptNotificationRequests = createDataLoadingThunk(
|
|
||||||
'notificationRequests/acceptBulk',
|
|
||||||
({ ids }: { ids: string[] }) => apiAcceptNotificationRequests(ids),
|
|
||||||
(_data, { dispatch, discardLoadData, actionArg: { ids } }) => {
|
|
||||||
dispatch(decreasePendingRequestsCount(ids.length));
|
|
||||||
|
|
||||||
// The payload is not used in any functions
|
|
||||||
return discardLoadData;
|
|
||||||
},
|
|
||||||
);
|
|
||||||
|
|
||||||
export const dismissNotificationRequests = createDataLoadingThunk(
|
|
||||||
'notificationRequests/dismissBulk',
|
|
||||||
({ ids }: { ids: string[] }) => apiDismissNotificationRequests(ids),
|
|
||||||
(_data, { dispatch, discardLoadData, actionArg: { ids } }) => {
|
|
||||||
dispatch(decreasePendingRequestsCount(ids.length));
|
|
||||||
|
|
||||||
// The payload is not used in any functions
|
|
||||||
return discardLoadData;
|
|
||||||
},
|
|
||||||
);
|
|
|
@ -10,7 +10,7 @@ import api, { getLinks } from '../api';
|
||||||
import { unescapeHTML } from '../utils/html';
|
import { unescapeHTML } from '../utils/html';
|
||||||
import { requestNotificationPermission } from '../utils/notifications';
|
import { requestNotificationPermission } from '../utils/notifications';
|
||||||
|
|
||||||
import { fetchFollowRequests } from './accounts';
|
import { fetchFollowRequests, fetchRelationships } from './accounts';
|
||||||
import {
|
import {
|
||||||
importFetchedAccount,
|
importFetchedAccount,
|
||||||
importFetchedAccounts,
|
importFetchedAccounts,
|
||||||
|
@ -18,6 +18,7 @@ import {
|
||||||
importFetchedStatuses,
|
importFetchedStatuses,
|
||||||
} from './importer';
|
} from './importer';
|
||||||
import { submitMarkers } from './markers';
|
import { submitMarkers } from './markers';
|
||||||
|
import { decreasePendingNotificationsCount } from './notification_policies';
|
||||||
import { notificationsUpdate } from "./notifications_typed";
|
import { notificationsUpdate } from "./notifications_typed";
|
||||||
import { register as registerPushNotifications } from './push_notifications';
|
import { register as registerPushNotifications } from './push_notifications';
|
||||||
import { saveSettings } from './settings';
|
import { saveSettings } from './settings';
|
||||||
|
@ -43,6 +44,26 @@ export const NOTIFICATIONS_MARK_AS_READ = 'NOTIFICATIONS_MARK_AS_READ';
|
||||||
export const NOTIFICATIONS_SET_BROWSER_SUPPORT = 'NOTIFICATIONS_SET_BROWSER_SUPPORT';
|
export const NOTIFICATIONS_SET_BROWSER_SUPPORT = 'NOTIFICATIONS_SET_BROWSER_SUPPORT';
|
||||||
export const NOTIFICATIONS_SET_BROWSER_PERMISSION = 'NOTIFICATIONS_SET_BROWSER_PERMISSION';
|
export const NOTIFICATIONS_SET_BROWSER_PERMISSION = 'NOTIFICATIONS_SET_BROWSER_PERMISSION';
|
||||||
|
|
||||||
|
export const NOTIFICATION_REQUESTS_FETCH_REQUEST = 'NOTIFICATION_REQUESTS_FETCH_REQUEST';
|
||||||
|
export const NOTIFICATION_REQUESTS_FETCH_SUCCESS = 'NOTIFICATION_REQUESTS_FETCH_SUCCESS';
|
||||||
|
export const NOTIFICATION_REQUESTS_FETCH_FAIL = 'NOTIFICATION_REQUESTS_FETCH_FAIL';
|
||||||
|
|
||||||
|
export const NOTIFICATION_REQUESTS_EXPAND_REQUEST = 'NOTIFICATION_REQUESTS_EXPAND_REQUEST';
|
||||||
|
export const NOTIFICATION_REQUESTS_EXPAND_SUCCESS = 'NOTIFICATION_REQUESTS_EXPAND_SUCCESS';
|
||||||
|
export const NOTIFICATION_REQUESTS_EXPAND_FAIL = 'NOTIFICATION_REQUESTS_EXPAND_FAIL';
|
||||||
|
|
||||||
|
export const NOTIFICATION_REQUEST_FETCH_REQUEST = 'NOTIFICATION_REQUEST_FETCH_REQUEST';
|
||||||
|
export const NOTIFICATION_REQUEST_FETCH_SUCCESS = 'NOTIFICATION_REQUEST_FETCH_SUCCESS';
|
||||||
|
export const NOTIFICATION_REQUEST_FETCH_FAIL = 'NOTIFICATION_REQUEST_FETCH_FAIL';
|
||||||
|
|
||||||
|
export const NOTIFICATION_REQUEST_ACCEPT_REQUEST = 'NOTIFICATION_REQUEST_ACCEPT_REQUEST';
|
||||||
|
export const NOTIFICATION_REQUEST_ACCEPT_SUCCESS = 'NOTIFICATION_REQUEST_ACCEPT_SUCCESS';
|
||||||
|
export const NOTIFICATION_REQUEST_ACCEPT_FAIL = 'NOTIFICATION_REQUEST_ACCEPT_FAIL';
|
||||||
|
|
||||||
|
export const NOTIFICATION_REQUEST_DISMISS_REQUEST = 'NOTIFICATION_REQUEST_DISMISS_REQUEST';
|
||||||
|
export const NOTIFICATION_REQUEST_DISMISS_SUCCESS = 'NOTIFICATION_REQUEST_DISMISS_SUCCESS';
|
||||||
|
export const NOTIFICATION_REQUEST_DISMISS_FAIL = 'NOTIFICATION_REQUEST_DISMISS_FAIL';
|
||||||
|
|
||||||
export const NOTIFICATION_REQUESTS_ACCEPT_REQUEST = 'NOTIFICATION_REQUESTS_ACCEPT_REQUEST';
|
export const NOTIFICATION_REQUESTS_ACCEPT_REQUEST = 'NOTIFICATION_REQUESTS_ACCEPT_REQUEST';
|
||||||
export const NOTIFICATION_REQUESTS_ACCEPT_SUCCESS = 'NOTIFICATION_REQUESTS_ACCEPT_SUCCESS';
|
export const NOTIFICATION_REQUESTS_ACCEPT_SUCCESS = 'NOTIFICATION_REQUESTS_ACCEPT_SUCCESS';
|
||||||
export const NOTIFICATION_REQUESTS_ACCEPT_FAIL = 'NOTIFICATION_REQUESTS_ACCEPT_FAIL';
|
export const NOTIFICATION_REQUESTS_ACCEPT_FAIL = 'NOTIFICATION_REQUESTS_ACCEPT_FAIL';
|
||||||
|
@ -51,11 +72,33 @@ export const NOTIFICATION_REQUESTS_DISMISS_REQUEST = 'NOTIFICATION_REQUESTS_DISM
|
||||||
export const NOTIFICATION_REQUESTS_DISMISS_SUCCESS = 'NOTIFICATION_REQUESTS_DISMISS_SUCCESS';
|
export const NOTIFICATION_REQUESTS_DISMISS_SUCCESS = 'NOTIFICATION_REQUESTS_DISMISS_SUCCESS';
|
||||||
export const NOTIFICATION_REQUESTS_DISMISS_FAIL = 'NOTIFICATION_REQUESTS_DISMISS_FAIL';
|
export const NOTIFICATION_REQUESTS_DISMISS_FAIL = 'NOTIFICATION_REQUESTS_DISMISS_FAIL';
|
||||||
|
|
||||||
|
export const NOTIFICATIONS_FOR_REQUEST_FETCH_REQUEST = 'NOTIFICATIONS_FOR_REQUEST_FETCH_REQUEST';
|
||||||
|
export const NOTIFICATIONS_FOR_REQUEST_FETCH_SUCCESS = 'NOTIFICATIONS_FOR_REQUEST_FETCH_SUCCESS';
|
||||||
|
export const NOTIFICATIONS_FOR_REQUEST_FETCH_FAIL = 'NOTIFICATIONS_FOR_REQUEST_FETCH_FAIL';
|
||||||
|
|
||||||
|
export const NOTIFICATIONS_FOR_REQUEST_EXPAND_REQUEST = 'NOTIFICATIONS_FOR_REQUEST_EXPAND_REQUEST';
|
||||||
|
export const NOTIFICATIONS_FOR_REQUEST_EXPAND_SUCCESS = 'NOTIFICATIONS_FOR_REQUEST_EXPAND_SUCCESS';
|
||||||
|
export const NOTIFICATIONS_FOR_REQUEST_EXPAND_FAIL = 'NOTIFICATIONS_FOR_REQUEST_EXPAND_FAIL';
|
||||||
|
|
||||||
defineMessages({
|
defineMessages({
|
||||||
mention: { id: 'notification.mention', defaultMessage: '{name} mentioned you' },
|
mention: { id: 'notification.mention', defaultMessage: '{name} mentioned you' },
|
||||||
group: { id: 'notifications.group', defaultMessage: '{count} notifications' },
|
group: { id: 'notifications.group', defaultMessage: '{count} notifications' },
|
||||||
});
|
});
|
||||||
|
|
||||||
|
const fetchRelatedRelationships = (dispatch, notifications) => {
|
||||||
|
const accountIds = notifications.filter(item => ['follow', 'follow_request', 'admin.sign_up'].indexOf(item.type) !== -1).map(item => item.account.id);
|
||||||
|
|
||||||
|
if (accountIds.length > 0) {
|
||||||
|
dispatch(fetchRelationships(accountIds));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const selectNotificationCountForRequest = (state, id) => {
|
||||||
|
const requests = state.getIn(['notificationRequests', 'items']);
|
||||||
|
const thisRequest = requests.find(request => request.get('id') === id);
|
||||||
|
return thisRequest ? thisRequest.get('notifications_count') : 0;
|
||||||
|
};
|
||||||
|
|
||||||
export const loadPending = () => ({
|
export const loadPending = () => ({
|
||||||
type: NOTIFICATIONS_LOAD_PENDING,
|
type: NOTIFICATIONS_LOAD_PENDING,
|
||||||
});
|
});
|
||||||
|
@ -98,6 +141,8 @@ export function updateNotifications(notification, intlMessages, intlLocale) {
|
||||||
|
|
||||||
|
|
||||||
dispatch(notificationsUpdate({ notification, preferPendingItems, playSound: playSound && !filtered}));
|
dispatch(notificationsUpdate({ notification, preferPendingItems, playSound: playSound && !filtered}));
|
||||||
|
|
||||||
|
fetchRelatedRelationships(dispatch, [notification]);
|
||||||
} else if (playSound && !filtered) {
|
} else if (playSound && !filtered) {
|
||||||
dispatch({
|
dispatch({
|
||||||
type: NOTIFICATIONS_UPDATE_NOOP,
|
type: NOTIFICATIONS_UPDATE_NOOP,
|
||||||
|
@ -189,6 +234,7 @@ export function expandNotifications({ maxId = undefined, forceLoad = false }) {
|
||||||
dispatch(importFetchedAccounts(response.data.filter(item => item.report).map(item => item.report.target_account)));
|
dispatch(importFetchedAccounts(response.data.filter(item => item.report).map(item => item.report.target_account)));
|
||||||
|
|
||||||
dispatch(expandNotificationsSuccess(response.data, next ? next.uri : null, isLoadingMore, isLoadingRecent, isLoadingRecent && preferPendingItems));
|
dispatch(expandNotificationsSuccess(response.data, next ? next.uri : null, isLoadingMore, isLoadingRecent, isLoadingRecent && preferPendingItems));
|
||||||
|
fetchRelatedRelationships(dispatch, response.data);
|
||||||
dispatch(submitMarkers());
|
dispatch(submitMarkers());
|
||||||
} catch(error) {
|
} catch(error) {
|
||||||
dispatch(expandNotificationsFail(error, isLoadingMore));
|
dispatch(expandNotificationsFail(error, isLoadingMore));
|
||||||
|
@ -297,3 +343,296 @@ export function setBrowserPermission (value) {
|
||||||
value,
|
value,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export const fetchNotificationRequests = () => (dispatch, getState) => {
|
||||||
|
const params = {};
|
||||||
|
|
||||||
|
if (getState().getIn(['notificationRequests', 'isLoading'])) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (getState().getIn(['notificationRequests', 'items'])?.size > 0) {
|
||||||
|
params.since_id = getState().getIn(['notificationRequests', 'items', 0, 'id']);
|
||||||
|
}
|
||||||
|
|
||||||
|
dispatch(fetchNotificationRequestsRequest());
|
||||||
|
|
||||||
|
api().get('/api/v1/notifications/requests', { params }).then(response => {
|
||||||
|
const next = getLinks(response).refs.find(link => link.rel === 'next');
|
||||||
|
dispatch(importFetchedAccounts(response.data.map(x => x.account)));
|
||||||
|
dispatch(fetchNotificationRequestsSuccess(response.data, next ? next.uri : null));
|
||||||
|
}).catch(err => {
|
||||||
|
dispatch(fetchNotificationRequestsFail(err));
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
export const fetchNotificationRequestsRequest = () => ({
|
||||||
|
type: NOTIFICATION_REQUESTS_FETCH_REQUEST,
|
||||||
|
});
|
||||||
|
|
||||||
|
export const fetchNotificationRequestsSuccess = (requests, next) => ({
|
||||||
|
type: NOTIFICATION_REQUESTS_FETCH_SUCCESS,
|
||||||
|
requests,
|
||||||
|
next,
|
||||||
|
});
|
||||||
|
|
||||||
|
export const fetchNotificationRequestsFail = error => ({
|
||||||
|
type: NOTIFICATION_REQUESTS_FETCH_FAIL,
|
||||||
|
error,
|
||||||
|
});
|
||||||
|
|
||||||
|
export const expandNotificationRequests = () => (dispatch, getState) => {
|
||||||
|
const url = getState().getIn(['notificationRequests', 'next']);
|
||||||
|
|
||||||
|
if (!url || getState().getIn(['notificationRequests', 'isLoading'])) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
dispatch(expandNotificationRequestsRequest());
|
||||||
|
|
||||||
|
api().get(url).then(response => {
|
||||||
|
const next = getLinks(response).refs.find(link => link.rel === 'next');
|
||||||
|
dispatch(importFetchedAccounts(response.data.map(x => x.account)));
|
||||||
|
dispatch(expandNotificationRequestsSuccess(response.data, next?.uri));
|
||||||
|
}).catch(err => {
|
||||||
|
dispatch(expandNotificationRequestsFail(err));
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
export const expandNotificationRequestsRequest = () => ({
|
||||||
|
type: NOTIFICATION_REQUESTS_EXPAND_REQUEST,
|
||||||
|
});
|
||||||
|
|
||||||
|
export const expandNotificationRequestsSuccess = (requests, next) => ({
|
||||||
|
type: NOTIFICATION_REQUESTS_EXPAND_SUCCESS,
|
||||||
|
requests,
|
||||||
|
next,
|
||||||
|
});
|
||||||
|
|
||||||
|
export const expandNotificationRequestsFail = error => ({
|
||||||
|
type: NOTIFICATION_REQUESTS_EXPAND_FAIL,
|
||||||
|
error,
|
||||||
|
});
|
||||||
|
|
||||||
|
export const fetchNotificationRequest = id => (dispatch, getState) => {
|
||||||
|
const current = getState().getIn(['notificationRequests', 'current']);
|
||||||
|
|
||||||
|
if (current.getIn(['item', 'id']) === id || current.get('isLoading')) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
dispatch(fetchNotificationRequestRequest(id));
|
||||||
|
|
||||||
|
api().get(`/api/v1/notifications/requests/${id}`).then(({ data }) => {
|
||||||
|
dispatch(fetchNotificationRequestSuccess(data));
|
||||||
|
}).catch(err => {
|
||||||
|
dispatch(fetchNotificationRequestFail(id, err));
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
export const fetchNotificationRequestRequest = id => ({
|
||||||
|
type: NOTIFICATION_REQUEST_FETCH_REQUEST,
|
||||||
|
id,
|
||||||
|
});
|
||||||
|
|
||||||
|
export const fetchNotificationRequestSuccess = request => ({
|
||||||
|
type: NOTIFICATION_REQUEST_FETCH_SUCCESS,
|
||||||
|
request,
|
||||||
|
});
|
||||||
|
|
||||||
|
export const fetchNotificationRequestFail = (id, error) => ({
|
||||||
|
type: NOTIFICATION_REQUEST_FETCH_FAIL,
|
||||||
|
id,
|
||||||
|
error,
|
||||||
|
});
|
||||||
|
|
||||||
|
export const acceptNotificationRequest = (id) => (dispatch, getState) => {
|
||||||
|
const count = selectNotificationCountForRequest(getState(), id);
|
||||||
|
dispatch(acceptNotificationRequestRequest(id));
|
||||||
|
|
||||||
|
api().post(`/api/v1/notifications/requests/${id}/accept`).then(() => {
|
||||||
|
dispatch(acceptNotificationRequestSuccess(id));
|
||||||
|
dispatch(decreasePendingNotificationsCount(count));
|
||||||
|
}).catch(err => {
|
||||||
|
dispatch(acceptNotificationRequestFail(id, err));
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
export const acceptNotificationRequestRequest = id => ({
|
||||||
|
type: NOTIFICATION_REQUEST_ACCEPT_REQUEST,
|
||||||
|
id,
|
||||||
|
});
|
||||||
|
|
||||||
|
export const acceptNotificationRequestSuccess = id => ({
|
||||||
|
type: NOTIFICATION_REQUEST_ACCEPT_SUCCESS,
|
||||||
|
id,
|
||||||
|
});
|
||||||
|
|
||||||
|
export const acceptNotificationRequestFail = (id, error) => ({
|
||||||
|
type: NOTIFICATION_REQUEST_ACCEPT_FAIL,
|
||||||
|
id,
|
||||||
|
error,
|
||||||
|
});
|
||||||
|
|
||||||
|
export const dismissNotificationRequest = (id) => (dispatch, getState) => {
|
||||||
|
const count = selectNotificationCountForRequest(getState(), id);
|
||||||
|
dispatch(dismissNotificationRequestRequest(id));
|
||||||
|
|
||||||
|
api().post(`/api/v1/notifications/requests/${id}/dismiss`).then(() =>{
|
||||||
|
dispatch(dismissNotificationRequestSuccess(id));
|
||||||
|
dispatch(decreasePendingNotificationsCount(count));
|
||||||
|
}).catch(err => {
|
||||||
|
dispatch(dismissNotificationRequestFail(id, err));
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
export const dismissNotificationRequestRequest = id => ({
|
||||||
|
type: NOTIFICATION_REQUEST_DISMISS_REQUEST,
|
||||||
|
id,
|
||||||
|
});
|
||||||
|
|
||||||
|
export const dismissNotificationRequestSuccess = id => ({
|
||||||
|
type: NOTIFICATION_REQUEST_DISMISS_SUCCESS,
|
||||||
|
id,
|
||||||
|
});
|
||||||
|
|
||||||
|
export const dismissNotificationRequestFail = (id, error) => ({
|
||||||
|
type: NOTIFICATION_REQUEST_DISMISS_FAIL,
|
||||||
|
id,
|
||||||
|
error,
|
||||||
|
});
|
||||||
|
|
||||||
|
export const acceptNotificationRequests = (ids) => (dispatch, getState) => {
|
||||||
|
const count = ids.reduce((count, id) => count + selectNotificationCountForRequest(getState(), id), 0);
|
||||||
|
dispatch(acceptNotificationRequestsRequest(ids));
|
||||||
|
|
||||||
|
api().post(`/api/v1/notifications/requests/accept`, { id: ids }).then(() => {
|
||||||
|
dispatch(acceptNotificationRequestsSuccess(ids));
|
||||||
|
dispatch(decreasePendingNotificationsCount(count));
|
||||||
|
}).catch(err => {
|
||||||
|
dispatch(acceptNotificationRequestFail(ids, err));
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
export const acceptNotificationRequestsRequest = ids => ({
|
||||||
|
type: NOTIFICATION_REQUESTS_ACCEPT_REQUEST,
|
||||||
|
ids,
|
||||||
|
});
|
||||||
|
|
||||||
|
export const acceptNotificationRequestsSuccess = ids => ({
|
||||||
|
type: NOTIFICATION_REQUESTS_ACCEPT_SUCCESS,
|
||||||
|
ids,
|
||||||
|
});
|
||||||
|
|
||||||
|
export const acceptNotificationRequestsFail = (ids, error) => ({
|
||||||
|
type: NOTIFICATION_REQUESTS_ACCEPT_FAIL,
|
||||||
|
ids,
|
||||||
|
error,
|
||||||
|
});
|
||||||
|
|
||||||
|
export const dismissNotificationRequests = (ids) => (dispatch, getState) => {
|
||||||
|
const count = ids.reduce((count, id) => count + selectNotificationCountForRequest(getState(), id), 0);
|
||||||
|
dispatch(acceptNotificationRequestsRequest(ids));
|
||||||
|
|
||||||
|
api().post(`/api/v1/notifications/requests/dismiss`, { id: ids }).then(() => {
|
||||||
|
dispatch(dismissNotificationRequestsSuccess(ids));
|
||||||
|
dispatch(decreasePendingNotificationsCount(count));
|
||||||
|
}).catch(err => {
|
||||||
|
dispatch(dismissNotificationRequestFail(ids, err));
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
export const dismissNotificationRequestsRequest = ids => ({
|
||||||
|
type: NOTIFICATION_REQUESTS_DISMISS_REQUEST,
|
||||||
|
ids,
|
||||||
|
});
|
||||||
|
|
||||||
|
export const dismissNotificationRequestsSuccess = ids => ({
|
||||||
|
type: NOTIFICATION_REQUESTS_DISMISS_SUCCESS,
|
||||||
|
ids,
|
||||||
|
});
|
||||||
|
|
||||||
|
export const dismissNotificationRequestsFail = (ids, error) => ({
|
||||||
|
type: NOTIFICATION_REQUESTS_DISMISS_FAIL,
|
||||||
|
ids,
|
||||||
|
error,
|
||||||
|
});
|
||||||
|
|
||||||
|
export const fetchNotificationsForRequest = accountId => (dispatch, getState) => {
|
||||||
|
const current = getState().getIn(['notificationRequests', 'current']);
|
||||||
|
const params = { account_id: accountId };
|
||||||
|
|
||||||
|
if (current.getIn(['item', 'account']) === accountId) {
|
||||||
|
if (current.getIn(['notifications', 'isLoading'])) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (current.getIn(['notifications', 'items'])?.size > 0) {
|
||||||
|
params.since_id = current.getIn(['notifications', 'items', 0, 'id']);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
dispatch(fetchNotificationsForRequestRequest());
|
||||||
|
|
||||||
|
api().get('/api/v1/notifications', { params }).then(response => {
|
||||||
|
const next = getLinks(response).refs.find(link => link.rel === 'next');
|
||||||
|
dispatch(importFetchedAccounts(response.data.map(item => item.account)));
|
||||||
|
dispatch(importFetchedStatuses(response.data.map(item => item.status).filter(status => !!status)));
|
||||||
|
dispatch(importFetchedAccounts(response.data.filter(item => item.report).map(item => item.report.target_account)));
|
||||||
|
|
||||||
|
dispatch(fetchNotificationsForRequestSuccess(response.data, next?.uri));
|
||||||
|
}).catch(err => {
|
||||||
|
dispatch(fetchNotificationsForRequestFail(err));
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
export const fetchNotificationsForRequestRequest = () => ({
|
||||||
|
type: NOTIFICATIONS_FOR_REQUEST_FETCH_REQUEST,
|
||||||
|
});
|
||||||
|
|
||||||
|
export const fetchNotificationsForRequestSuccess = (notifications, next) => ({
|
||||||
|
type: NOTIFICATIONS_FOR_REQUEST_FETCH_SUCCESS,
|
||||||
|
notifications,
|
||||||
|
next,
|
||||||
|
});
|
||||||
|
|
||||||
|
export const fetchNotificationsForRequestFail = (error) => ({
|
||||||
|
type: NOTIFICATIONS_FOR_REQUEST_FETCH_FAIL,
|
||||||
|
error,
|
||||||
|
});
|
||||||
|
|
||||||
|
export const expandNotificationsForRequest = () => (dispatch, getState) => {
|
||||||
|
const url = getState().getIn(['notificationRequests', 'current', 'notifications', 'next']);
|
||||||
|
|
||||||
|
if (!url || getState().getIn(['notificationRequests', 'current', 'notifications', 'isLoading'])) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
dispatch(expandNotificationsForRequestRequest());
|
||||||
|
|
||||||
|
api().get(url).then(response => {
|
||||||
|
const next = getLinks(response).refs.find(link => link.rel === 'next');
|
||||||
|
dispatch(importFetchedAccounts(response.data.map(item => item.account)));
|
||||||
|
dispatch(importFetchedStatuses(response.data.map(item => item.status).filter(status => !!status)));
|
||||||
|
dispatch(importFetchedAccounts(response.data.filter(item => item.report).map(item => item.report.target_account)));
|
||||||
|
|
||||||
|
dispatch(expandNotificationsForRequestSuccess(response.data, next?.uri));
|
||||||
|
}).catch(err => {
|
||||||
|
dispatch(expandNotificationsForRequestFail(err));
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
export const expandNotificationsForRequestRequest = () => ({
|
||||||
|
type: NOTIFICATIONS_FOR_REQUEST_EXPAND_REQUEST,
|
||||||
|
});
|
||||||
|
|
||||||
|
export const expandNotificationsForRequestSuccess = (notifications, next) => ({
|
||||||
|
type: NOTIFICATIONS_FOR_REQUEST_EXPAND_SUCCESS,
|
||||||
|
notifications,
|
||||||
|
next,
|
||||||
|
});
|
||||||
|
|
||||||
|
export const expandNotificationsForRequestFail = (error) => ({
|
||||||
|
type: NOTIFICATIONS_FOR_REQUEST_EXPAND_FAIL,
|
||||||
|
error,
|
||||||
|
});
|
||||||
|
|
|
@ -1,10 +1,14 @@
|
||||||
|
import { selectUseGroupedNotifications } from 'mastodon/selectors/settings';
|
||||||
import { createAppAsyncThunk } from 'mastodon/store';
|
import { createAppAsyncThunk } from 'mastodon/store';
|
||||||
|
|
||||||
import { fetchNotifications } from './notification_groups';
|
import { fetchNotifications } from './notification_groups';
|
||||||
|
import { expandNotifications } from './notifications';
|
||||||
|
|
||||||
export const initializeNotifications = createAppAsyncThunk(
|
export const initializeNotifications = createAppAsyncThunk(
|
||||||
'notifications/initialize',
|
'notifications/initialize',
|
||||||
(_, { dispatch }) => {
|
(_, { dispatch, getState }) => {
|
||||||
|
if (selectUseGroupedNotifications(getState()))
|
||||||
void dispatch(fetchNotifications());
|
void dispatch(fetchNotifications());
|
||||||
|
else void dispatch(expandNotifications({}));
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
// @ts-check
|
// @ts-check
|
||||||
|
|
||||||
|
import { selectUseGroupedNotifications } from 'mastodon/selectors/settings';
|
||||||
|
|
||||||
import { getLocale } from '../locales';
|
import { getLocale } from '../locales';
|
||||||
import { connectStream } from '../stream';
|
import { connectStream } from '../stream';
|
||||||
|
|
||||||
|
@ -103,14 +105,18 @@ export const connectTimelineStream = (timelineId, channelName, params = {}, opti
|
||||||
const notificationJSON = JSON.parse(data.payload);
|
const notificationJSON = JSON.parse(data.payload);
|
||||||
dispatch(updateNotifications(notificationJSON, messages, locale));
|
dispatch(updateNotifications(notificationJSON, messages, locale));
|
||||||
// TODO: remove this once the groups feature replaces the previous one
|
// TODO: remove this once the groups feature replaces the previous one
|
||||||
|
if(selectUseGroupedNotifications(getState())) {
|
||||||
dispatch(processNewNotificationForGroups(notificationJSON));
|
dispatch(processNewNotificationForGroups(notificationJSON));
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case 'notifications_merged':
|
case 'notifications_merged':
|
||||||
const state = getState();
|
const state = getState();
|
||||||
if (state.notifications.top || !state.notifications.mounted)
|
if (state.notifications.top || !state.notifications.mounted)
|
||||||
dispatch(expandNotifications({ forceLoad: true, maxId: undefined }));
|
dispatch(expandNotifications({ forceLoad: true, maxId: undefined }));
|
||||||
|
if (selectUseGroupedNotifications(state)) {
|
||||||
dispatch(refreshStaleNotificationGroups());
|
dispatch(refreshStaleNotificationGroups());
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case 'conversation':
|
case 'conversation':
|
||||||
// @ts-expect-error
|
// @ts-expect-error
|
||||||
|
@ -135,16 +141,22 @@ export const connectTimelineStream = (timelineId, channelName, params = {}, opti
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param {Function} dispatch
|
* @param {Function} dispatch
|
||||||
|
* @param {Function} getState
|
||||||
*/
|
*/
|
||||||
async function refreshHomeTimelineAndNotification(dispatch) {
|
async function refreshHomeTimelineAndNotification(dispatch, getState) {
|
||||||
await dispatch(expandHomeTimeline({ maxId: undefined }));
|
await dispatch(expandHomeTimeline({ maxId: undefined }));
|
||||||
|
|
||||||
|
// TODO: remove this once the groups feature replaces the previous one
|
||||||
|
if(selectUseGroupedNotifications(getState())) {
|
||||||
// TODO: polling for merged notifications
|
// TODO: polling for merged notifications
|
||||||
try {
|
try {
|
||||||
await dispatch(pollRecentGroupNotifications());
|
await dispatch(pollRecentGroupNotifications());
|
||||||
} catch {
|
} catch {
|
||||||
// TODO
|
// TODO
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
await dispatch(expandNotifications({}));
|
||||||
|
}
|
||||||
|
|
||||||
await dispatch(fetchAnnouncements());
|
await dispatch(fetchAnnouncements());
|
||||||
}
|
}
|
||||||
|
|
|
@ -42,9 +42,6 @@ const authorizationTokenFromInitialState = (): RawAxiosRequestHeaders => {
|
||||||
// eslint-disable-next-line import/no-default-export
|
// eslint-disable-next-line import/no-default-export
|
||||||
export default function api(withAuthorization = true) {
|
export default function api(withAuthorization = true) {
|
||||||
return axios.create({
|
return axios.create({
|
||||||
transitional: {
|
|
||||||
clarifyTimeoutError: true,
|
|
||||||
},
|
|
||||||
headers: {
|
headers: {
|
||||||
...csrfHeader,
|
...csrfHeader,
|
||||||
...(withAuthorization ? authorizationTokenFromInitialState() : {}),
|
...(withAuthorization ? authorizationTokenFromInitialState() : {}),
|
||||||
|
@ -70,7 +67,6 @@ export async function apiRequest<ApiResponse = unknown>(
|
||||||
args: {
|
args: {
|
||||||
params?: RequestParamsOrData;
|
params?: RequestParamsOrData;
|
||||||
data?: RequestParamsOrData;
|
data?: RequestParamsOrData;
|
||||||
timeout?: number;
|
|
||||||
} = {},
|
} = {},
|
||||||
) {
|
) {
|
||||||
const { data } = await api().request<ApiResponse>({
|
const { data } = await api().request<ApiResponse>({
|
||||||
|
|
|
@ -1,44 +1,14 @@
|
||||||
import api, {
|
import api, { apiRequest, getLinks } from 'mastodon/api';
|
||||||
apiRequest,
|
import type { ApiNotificationGroupsResultJSON } from 'mastodon/api_types/notifications';
|
||||||
getLinks,
|
|
||||||
apiRequestGet,
|
|
||||||
apiRequestPost,
|
|
||||||
} from 'mastodon/api';
|
|
||||||
import type {
|
|
||||||
ApiNotificationGroupsResultJSON,
|
|
||||||
ApiNotificationRequestJSON,
|
|
||||||
ApiNotificationJSON,
|
|
||||||
} from 'mastodon/api_types/notifications';
|
|
||||||
|
|
||||||
export const apiFetchNotifications = async (
|
export const apiFetchNotifications = async (params?: {
|
||||||
params?: {
|
|
||||||
account_id?: string;
|
|
||||||
since_id?: string;
|
|
||||||
},
|
|
||||||
url?: string,
|
|
||||||
) => {
|
|
||||||
const response = await api().request<ApiNotificationJSON[]>({
|
|
||||||
method: 'GET',
|
|
||||||
url: url ?? '/api/v1/notifications',
|
|
||||||
params,
|
|
||||||
});
|
|
||||||
|
|
||||||
return {
|
|
||||||
notifications: response.data,
|
|
||||||
links: getLinks(response),
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
export const apiFetchNotificationGroups = async (params?: {
|
|
||||||
url?: string;
|
|
||||||
grouped_types?: string[];
|
|
||||||
exclude_types?: string[];
|
exclude_types?: string[];
|
||||||
max_id?: string;
|
max_id?: string;
|
||||||
since_id?: string;
|
since_id?: string;
|
||||||
}) => {
|
}) => {
|
||||||
const response = await api().request<ApiNotificationGroupsResultJSON>({
|
const response = await api().request<ApiNotificationGroupsResultJSON>({
|
||||||
method: 'GET',
|
method: 'GET',
|
||||||
url: '/api/v2/notifications',
|
url: '/api/v2_alpha/notifications',
|
||||||
params,
|
params,
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -54,43 +24,3 @@ export const apiFetchNotificationGroups = async (params?: {
|
||||||
|
|
||||||
export const apiClearNotifications = () =>
|
export const apiClearNotifications = () =>
|
||||||
apiRequest<undefined>('POST', 'v1/notifications/clear');
|
apiRequest<undefined>('POST', 'v1/notifications/clear');
|
||||||
|
|
||||||
export const apiFetchNotificationRequests = async (
|
|
||||||
params?: {
|
|
||||||
since_id?: string;
|
|
||||||
},
|
|
||||||
url?: string,
|
|
||||||
) => {
|
|
||||||
const response = await api().request<ApiNotificationRequestJSON[]>({
|
|
||||||
method: 'GET',
|
|
||||||
url: url ?? '/api/v1/notifications/requests',
|
|
||||||
params,
|
|
||||||
});
|
|
||||||
|
|
||||||
return {
|
|
||||||
requests: response.data,
|
|
||||||
links: getLinks(response),
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
export const apiFetchNotificationRequest = async (id: string) => {
|
|
||||||
return apiRequestGet<ApiNotificationRequestJSON>(
|
|
||||||
`v1/notifications/requests/${id}`,
|
|
||||||
);
|
|
||||||
};
|
|
||||||
|
|
||||||
export const apiAcceptNotificationRequest = async (id: string) => {
|
|
||||||
return apiRequestPost(`v1/notifications/requests/${id}/accept`);
|
|
||||||
};
|
|
||||||
|
|
||||||
export const apiDismissNotificationRequest = async (id: string) => {
|
|
||||||
return apiRequestPost(`v1/notifications/requests/${id}/dismiss`);
|
|
||||||
};
|
|
||||||
|
|
||||||
export const apiAcceptNotificationRequests = async (id: string[]) => {
|
|
||||||
return apiRequestPost('v1/notifications/requests/accept', { id });
|
|
||||||
};
|
|
||||||
|
|
||||||
export const apiDismissNotificationRequests = async (id: string[]) => {
|
|
||||||
return apiRequestPost('v1/notifications/requests/dismiss', { id });
|
|
||||||
};
|
|
||||||
|
|
|
@ -149,12 +149,3 @@ export interface ApiNotificationGroupsResultJSON {
|
||||||
statuses: ApiStatusJSON[];
|
statuses: ApiStatusJSON[];
|
||||||
notification_groups: ApiNotificationGroupJSON[];
|
notification_groups: ApiNotificationGroupJSON[];
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface ApiNotificationRequestJSON {
|
|
||||||
id: string;
|
|
||||||
created_at: string;
|
|
||||||
updated_at: string;
|
|
||||||
notifications_count: string;
|
|
||||||
account: ApiAccountJSON;
|
|
||||||
last_status?: ApiStatusJSON;
|
|
||||||
}
|
|
||||||
|
|
|
@ -7,7 +7,6 @@ interface BaseProps
|
||||||
extends Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, 'children'> {
|
extends Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, 'children'> {
|
||||||
block?: boolean;
|
block?: boolean;
|
||||||
secondary?: boolean;
|
secondary?: boolean;
|
||||||
dangerous?: boolean;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
interface PropsChildren extends PropsWithChildren<BaseProps> {
|
interface PropsChildren extends PropsWithChildren<BaseProps> {
|
||||||
|
@ -27,7 +26,6 @@ export const Button: React.FC<Props> = ({
|
||||||
disabled,
|
disabled,
|
||||||
block,
|
block,
|
||||||
secondary,
|
secondary,
|
||||||
dangerous,
|
|
||||||
className,
|
className,
|
||||||
title,
|
title,
|
||||||
text,
|
text,
|
||||||
|
@ -48,7 +46,6 @@ export const Button: React.FC<Props> = ({
|
||||||
className={classNames('button', className, {
|
className={classNames('button', className, {
|
||||||
'button-secondary': secondary,
|
'button-secondary': secondary,
|
||||||
'button--block': block,
|
'button--block': block,
|
||||||
'button--dangerous': dangerous,
|
|
||||||
})}
|
})}
|
||||||
disabled={disabled}
|
disabled={disabled}
|
||||||
onClick={handleClick}
|
onClick={handleClick}
|
||||||
|
|
|
@ -75,10 +75,10 @@ export const FollowButton: React.FC<{
|
||||||
label = <LoadingIndicator />;
|
label = <LoadingIndicator />;
|
||||||
} else if (relationship.following && relationship.followed_by) {
|
} else if (relationship.following && relationship.followed_by) {
|
||||||
label = intl.formatMessage(messages.mutual);
|
label = intl.formatMessage(messages.mutual);
|
||||||
|
} else if (!relationship.following && relationship.followed_by) {
|
||||||
|
label = intl.formatMessage(messages.followBack);
|
||||||
} else if (relationship.following || relationship.requested) {
|
} else if (relationship.following || relationship.requested) {
|
||||||
label = intl.formatMessage(messages.unfollow);
|
label = intl.formatMessage(messages.unfollow);
|
||||||
} else if (relationship.followed_by) {
|
|
||||||
label = intl.formatMessage(messages.followBack);
|
|
||||||
} else {
|
} else {
|
||||||
label = intl.formatMessage(messages.follow);
|
label = intl.formatMessage(messages.follow);
|
||||||
}
|
}
|
||||||
|
|
|
@ -148,7 +148,7 @@ class ModalRoot extends PureComponent {
|
||||||
return (
|
return (
|
||||||
<div className='modal-root' ref={this.setRef}>
|
<div className='modal-root' ref={this.setRef}>
|
||||||
<div style={{ pointerEvents: visible ? 'auto' : 'none' }}>
|
<div style={{ pointerEvents: visible ? 'auto' : 'none' }}>
|
||||||
<div role='presentation' className='modal-root__overlay' onClick={onClose} style={{ backgroundColor: backgroundColor ? `rgba(${backgroundColor.r}, ${backgroundColor.g}, ${backgroundColor.b}, 0.9)` : null }} />
|
<div role='presentation' className='modal-root__overlay' onClick={onClose} style={{ backgroundColor: backgroundColor ? `rgba(${backgroundColor.r}, ${backgroundColor.g}, ${backgroundColor.b}, 0.7)` : null }} />
|
||||||
<div role='dialog' className='modal-root__container'>{children}</div>
|
<div role='dialog' className='modal-root__container'>{children}</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -4,22 +4,22 @@ import AccountNavigation from 'mastodon/features/account/navigation';
|
||||||
import Trends from 'mastodon/features/getting_started/containers/trends_container';
|
import Trends from 'mastodon/features/getting_started/containers/trends_container';
|
||||||
import { showTrends } from 'mastodon/initial_state';
|
import { showTrends } from 'mastodon/initial_state';
|
||||||
|
|
||||||
const DefaultNavigation: React.FC = () => (showTrends ? <Trends /> : null);
|
const DefaultNavigation: React.FC = () =>
|
||||||
|
showTrends ? (
|
||||||
|
<>
|
||||||
|
<div className='flex-spacer' />
|
||||||
|
<Trends />
|
||||||
|
</>
|
||||||
|
) : null;
|
||||||
|
|
||||||
export const NavigationPortal: React.FC = () => (
|
export const NavigationPortal: React.FC = () => (
|
||||||
<div className='navigation-panel__portal'>
|
|
||||||
<Switch>
|
<Switch>
|
||||||
<Route path='/@:acct' exact component={AccountNavigation} />
|
<Route path='/@:acct' exact component={AccountNavigation} />
|
||||||
<Route
|
<Route path='/@:acct/tagged/:tagged?' exact component={AccountNavigation} />
|
||||||
path='/@:acct/tagged/:tagged?'
|
|
||||||
exact
|
|
||||||
component={AccountNavigation}
|
|
||||||
/>
|
|
||||||
<Route path='/@:acct/with_replies' exact component={AccountNavigation} />
|
<Route path='/@:acct/with_replies' exact component={AccountNavigation} />
|
||||||
<Route path='/@:acct/followers' exact component={AccountNavigation} />
|
<Route path='/@:acct/followers' exact component={AccountNavigation} />
|
||||||
<Route path='/@:acct/following' exact component={AccountNavigation} />
|
<Route path='/@:acct/following' exact component={AccountNavigation} />
|
||||||
<Route path='/@:acct/media' exact component={AccountNavigation} />
|
<Route path='/@:acct/media' exact component={AccountNavigation} />
|
||||||
<Route component={DefaultNavigation} />
|
<Route component={DefaultNavigation} />
|
||||||
</Switch>
|
</Switch>
|
||||||
</div>
|
|
||||||
);
|
);
|
||||||
|
|
|
@ -51,8 +51,7 @@ function normalizePath(
|
||||||
|
|
||||||
if (
|
if (
|
||||||
layoutFromWindow() === 'multi-column' &&
|
layoutFromWindow() === 'multi-column' &&
|
||||||
location.pathname &&
|
!location.pathname?.startsWith('/deck')
|
||||||
!location.pathname.startsWith('/deck')
|
|
||||||
) {
|
) {
|
||||||
location.pathname = `/deck${location.pathname}`;
|
location.pathname = `/deck${location.pathname}`;
|
||||||
}
|
}
|
||||||
|
|
|
@ -375,19 +375,11 @@ class StatusActionBar extends ImmutablePureComponent {
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className='status__action-bar'>
|
<div className='status__action-bar'>
|
||||||
<div className='status__action-bar__button-wrapper'>
|
|
||||||
<IconButton className='status__action-bar__button' title={replyTitle} icon={isReply ? 'reply' : replyIcon} iconComponent={isReply ? ReplyIcon : replyIconComponent} onClick={this.handleReplyClick} counter={status.get('replies_count')} />
|
<IconButton className='status__action-bar__button' title={replyTitle} icon={isReply ? 'reply' : replyIcon} iconComponent={isReply ? ReplyIcon : replyIconComponent} onClick={this.handleReplyClick} counter={status.get('replies_count')} />
|
||||||
</div>
|
|
||||||
<div className='status__action-bar__button-wrapper'>
|
|
||||||
<IconButton className={classNames('status__action-bar__button', { reblogPrivate })} disabled={!publicStatus && !reblogPrivate} active={status.get('reblogged')} title={reblogTitle} icon='retweet' iconComponent={reblogIconComponent} onClick={this.handleReblogClick} counter={withCounters ? status.get('reblogs_count') : undefined} />
|
<IconButton className={classNames('status__action-bar__button', { reblogPrivate })} disabled={!publicStatus && !reblogPrivate} active={status.get('reblogged')} title={reblogTitle} icon='retweet' iconComponent={reblogIconComponent} onClick={this.handleReblogClick} counter={withCounters ? status.get('reblogs_count') : undefined} />
|
||||||
</div>
|
|
||||||
<div className='status__action-bar__button-wrapper'>
|
|
||||||
<IconButton className='status__action-bar__button star-icon' animate active={status.get('favourited')} title={intl.formatMessage(messages.favourite)} icon='star' iconComponent={status.get('favourited') ? StarIcon : StarBorderIcon} onClick={this.handleFavouriteClick} counter={withCounters ? status.get('favourites_count') : undefined} />
|
<IconButton className='status__action-bar__button star-icon' animate active={status.get('favourited')} title={intl.formatMessage(messages.favourite)} icon='star' iconComponent={status.get('favourited') ? StarIcon : StarBorderIcon} onClick={this.handleFavouriteClick} counter={withCounters ? status.get('favourites_count') : undefined} />
|
||||||
</div>
|
|
||||||
<div className='status__action-bar__button-wrapper'>
|
|
||||||
<IconButton className='status__action-bar__button bookmark-icon' disabled={!signedIn} active={status.get('bookmarked')} title={intl.formatMessage(messages.bookmark)} icon='bookmark' iconComponent={status.get('bookmarked') ? BookmarkIcon : BookmarkBorderIcon} onClick={this.handleBookmarkClick} />
|
<IconButton className='status__action-bar__button bookmark-icon' disabled={!signedIn} active={status.get('bookmarked')} title={intl.formatMessage(messages.bookmark)} icon='bookmark' iconComponent={status.get('bookmarked') ? BookmarkIcon : BookmarkBorderIcon} onClick={this.handleBookmarkClick} />
|
||||||
</div>
|
|
||||||
<div className='status__action-bar__button-wrapper'>
|
|
||||||
<DropdownMenuContainer
|
<DropdownMenuContainer
|
||||||
scrollKey={scrollKey}
|
scrollKey={scrollKey}
|
||||||
status={status}
|
status={status}
|
||||||
|
@ -398,7 +390,6 @@ class StatusActionBar extends ImmutablePureComponent {
|
||||||
title={intl.formatMessage(messages.more)}
|
title={intl.formatMessage(messages.more)}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -92,10 +92,10 @@ const messageForFollowButton = relationship => {
|
||||||
|
|
||||||
if (relationship.get('following') && relationship.get('followed_by')) {
|
if (relationship.get('following') && relationship.get('followed_by')) {
|
||||||
return messages.mutual;
|
return messages.mutual;
|
||||||
|
} else if (!relationship.get('following') && relationship.get('followed_by')) {
|
||||||
|
return messages.followBack;
|
||||||
} else if (relationship.get('following') || relationship.get('requested')) {
|
} else if (relationship.get('following') || relationship.get('requested')) {
|
||||||
return messages.unfollow;
|
return messages.unfollow;
|
||||||
} else if (relationship.get('followed_by')) {
|
|
||||||
return messages.followBack;
|
|
||||||
} else {
|
} else {
|
||||||
return messages.follow;
|
return messages.follow;
|
||||||
}
|
}
|
||||||
|
|
|
@ -43,7 +43,10 @@ class AccountNavigation extends PureComponent {
|
||||||
}
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
|
<>
|
||||||
|
<div className='flex-spacer' />
|
||||||
<FeaturedTags accountId={accountId} tagged={tagged} />
|
<FeaturedTags accountId={accountId} tagged={tagged} />
|
||||||
|
</>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
import type { ChangeEventHandler } from 'react';
|
import type { ChangeEventHandler } from 'react';
|
||||||
import { useCallback, useEffect, useRef } from 'react';
|
import { useCallback, useEffect, useRef, useState } from 'react';
|
||||||
|
|
||||||
import { defineMessages, useIntl } from 'react-intl';
|
import { defineMessages, useIntl } from 'react-intl';
|
||||||
|
|
||||||
|
@ -23,8 +23,6 @@ import { RadioButton } from 'mastodon/components/radio_button';
|
||||||
import ScrollContainer from 'mastodon/containers/scroll_container';
|
import ScrollContainer from 'mastodon/containers/scroll_container';
|
||||||
import { useAppDispatch, useAppSelector } from 'mastodon/store';
|
import { useAppDispatch, useAppSelector } from 'mastodon/store';
|
||||||
|
|
||||||
import { useSearchParam } from '../../../hooks/useSearchParam';
|
|
||||||
|
|
||||||
import { AccountCard } from './components/account_card';
|
import { AccountCard } from './components/account_card';
|
||||||
|
|
||||||
const messages = defineMessages({
|
const messages = defineMessages({
|
||||||
|
@ -49,19 +47,18 @@ export const Directory: React.FC<{
|
||||||
const intl = useIntl();
|
const intl = useIntl();
|
||||||
const dispatch = useAppDispatch();
|
const dispatch = useAppDispatch();
|
||||||
|
|
||||||
|
const [state, setState] = useState<{
|
||||||
|
order: string | null;
|
||||||
|
local: boolean | null;
|
||||||
|
}>({
|
||||||
|
order: null,
|
||||||
|
local: null,
|
||||||
|
});
|
||||||
|
|
||||||
const column = useRef<Column>(null);
|
const column = useRef<Column>(null);
|
||||||
|
|
||||||
const [orderParam, setOrderParam] = useSearchParam('order');
|
const order = state.order ?? params?.order ?? 'active';
|
||||||
const [localParam, setLocalParam] = useSearchParam('local');
|
const local = state.local ?? params?.local ?? false;
|
||||||
|
|
||||||
let localParamBool: boolean | undefined;
|
|
||||||
|
|
||||||
if (localParam === 'false') {
|
|
||||||
localParamBool = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
const order = orderParam ?? params?.order ?? 'active';
|
|
||||||
const local = localParamBool ?? params?.local ?? true;
|
|
||||||
|
|
||||||
const handlePin = useCallback(() => {
|
const handlePin = useCallback(() => {
|
||||||
if (columnId) {
|
if (columnId) {
|
||||||
|
@ -104,10 +101,10 @@ export const Directory: React.FC<{
|
||||||
if (columnId) {
|
if (columnId) {
|
||||||
dispatch(changeColumnParams(columnId, ['order'], e.target.value));
|
dispatch(changeColumnParams(columnId, ['order'], e.target.value));
|
||||||
} else {
|
} else {
|
||||||
setOrderParam(e.target.value);
|
setState((s) => ({ order: e.target.value, local: s.local }));
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
[dispatch, columnId, setOrderParam],
|
[dispatch, columnId],
|
||||||
);
|
);
|
||||||
|
|
||||||
const handleChangeLocal = useCallback<ChangeEventHandler<HTMLInputElement>>(
|
const handleChangeLocal = useCallback<ChangeEventHandler<HTMLInputElement>>(
|
||||||
|
@ -116,13 +113,11 @@ export const Directory: React.FC<{
|
||||||
dispatch(
|
dispatch(
|
||||||
changeColumnParams(columnId, ['local'], e.target.value === '1'),
|
changeColumnParams(columnId, ['local'], e.target.value === '1'),
|
||||||
);
|
);
|
||||||
} else if (e.target.value === '1') {
|
|
||||||
setLocalParam('true');
|
|
||||||
} else {
|
} else {
|
||||||
setLocalParam('false');
|
setState((s) => ({ local: e.target.value === '1', order: s.order }));
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
[dispatch, columnId, setLocalParam],
|
[dispatch, columnId],
|
||||||
);
|
);
|
||||||
|
|
||||||
const handleLoadMore = useCallback(() => {
|
const handleLoadMore = useCallback(() => {
|
||||||
|
|
|
@ -6,6 +6,7 @@ import { FormattedMessage } from 'react-intl';
|
||||||
import ImmutablePropTypes from 'react-immutable-proptypes';
|
import ImmutablePropTypes from 'react-immutable-proptypes';
|
||||||
|
|
||||||
import { identityContextPropShape, withIdentity } from 'mastodon/identity_context';
|
import { identityContextPropShape, withIdentity } from 'mastodon/identity_context';
|
||||||
|
import { forceGroupedNotifications } from 'mastodon/initial_state';
|
||||||
import { PERMISSION_MANAGE_USERS, PERMISSION_MANAGE_REPORTS } from 'mastodon/permissions';
|
import { PERMISSION_MANAGE_USERS, PERMISSION_MANAGE_REPORTS } from 'mastodon/permissions';
|
||||||
|
|
||||||
import ClearColumnButton from './clear_column_button';
|
import ClearColumnButton from './clear_column_button';
|
||||||
|
@ -35,6 +36,7 @@ class ColumnSettings extends PureComponent {
|
||||||
|
|
||||||
const filterAdvancedStr = <FormattedMessage id='notifications.column_settings.filter_bar.advanced' defaultMessage='Display all categories' />;
|
const filterAdvancedStr = <FormattedMessage id='notifications.column_settings.filter_bar.advanced' defaultMessage='Display all categories' />;
|
||||||
const unreadMarkersShowStr = <FormattedMessage id='notifications.column_settings.unread_notifications.highlight' defaultMessage='Highlight unread notifications' />;
|
const unreadMarkersShowStr = <FormattedMessage id='notifications.column_settings.unread_notifications.highlight' defaultMessage='Highlight unread notifications' />;
|
||||||
|
const groupingShowStr = <FormattedMessage id='notifications.column_settings.beta.grouping' defaultMessage='Group notifications' />;
|
||||||
const alertStr = <FormattedMessage id='notifications.column_settings.alert' defaultMessage='Desktop notifications' />;
|
const alertStr = <FormattedMessage id='notifications.column_settings.alert' defaultMessage='Desktop notifications' />;
|
||||||
const showStr = <FormattedMessage id='notifications.column_settings.show' defaultMessage='Show in column' />;
|
const showStr = <FormattedMessage id='notifications.column_settings.show' defaultMessage='Show in column' />;
|
||||||
const soundStr = <FormattedMessage id='notifications.column_settings.sound' defaultMessage='Play sound' />;
|
const soundStr = <FormattedMessage id='notifications.column_settings.sound' defaultMessage='Play sound' />;
|
||||||
|
@ -66,6 +68,18 @@ class ColumnSettings extends PureComponent {
|
||||||
|
|
||||||
<PolicyControls />
|
<PolicyControls />
|
||||||
|
|
||||||
|
{!forceGroupedNotifications && (
|
||||||
|
<section role='group' aria-labelledby='notifications-beta'>
|
||||||
|
<h3 id='notifications-beta'>
|
||||||
|
<FormattedMessage id='notifications.column_settings.beta.category' defaultMessage='Experimental features' />
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<div className='column-settings__row'>
|
||||||
|
<SettingToggle id='unread-notification-markers' prefix='notifications' settings={settings} settingPath={['groupingBeta']} onChange={onChange} label={groupingShowStr} />
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
)}
|
||||||
|
|
||||||
<section role='group' aria-labelledby='notifications-unread-markers'>
|
<section role='group' aria-labelledby='notifications-unread-markers'>
|
||||||
<h3 id='notifications-unread-markers'>
|
<h3 id='notifications-unread-markers'>
|
||||||
<FormattedMessage id='notifications.column_settings.unread_notifications.category' defaultMessage='Unread notifications' />
|
<FormattedMessage id='notifications.column_settings.unread_notifications.category' defaultMessage='Unread notifications' />
|
||||||
|
|
|
@ -31,7 +31,7 @@ export const FilteredNotificationsIconButton: React.FC<{
|
||||||
history.push('/notifications/requests');
|
history.push('/notifications/requests');
|
||||||
}, [history]);
|
}, [history]);
|
||||||
|
|
||||||
if (policy === null || policy.summary.pending_requests_count <= 0) {
|
if (policy === null || policy.summary.pending_notifications_count === 0) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -70,7 +70,7 @@ export const FilteredNotificationsBanner: React.FC = () => {
|
||||||
};
|
};
|
||||||
}, [dispatch]);
|
}, [dispatch]);
|
||||||
|
|
||||||
if (policy === null || policy.summary.pending_requests_count <= 0) {
|
if (policy === null || policy.summary.pending_notifications_count === 0) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -12,7 +12,7 @@ import DeleteIcon from '@/material-icons/400-24px/delete.svg?react';
|
||||||
import MoreHorizIcon from '@/material-icons/400-24px/more_horiz.svg?react';
|
import MoreHorizIcon from '@/material-icons/400-24px/more_horiz.svg?react';
|
||||||
import { initBlockModal } from 'mastodon/actions/blocks';
|
import { initBlockModal } from 'mastodon/actions/blocks';
|
||||||
import { initMuteModal } from 'mastodon/actions/mutes';
|
import { initMuteModal } from 'mastodon/actions/mutes';
|
||||||
import { acceptNotificationRequest, dismissNotificationRequest } from 'mastodon/actions/notification_requests';
|
import { acceptNotificationRequest, dismissNotificationRequest } from 'mastodon/actions/notifications';
|
||||||
import { initReport } from 'mastodon/actions/reports';
|
import { initReport } from 'mastodon/actions/reports';
|
||||||
import { Avatar } from 'mastodon/components/avatar';
|
import { Avatar } from 'mastodon/components/avatar';
|
||||||
import { CheckBox } from 'mastodon/components/check_box';
|
import { CheckBox } from 'mastodon/components/check_box';
|
||||||
|
@ -40,11 +40,11 @@ export const NotificationRequest = ({ id, accountId, notificationsCount, checked
|
||||||
const { push: historyPush } = useHistory();
|
const { push: historyPush } = useHistory();
|
||||||
|
|
||||||
const handleDismiss = useCallback(() => {
|
const handleDismiss = useCallback(() => {
|
||||||
dispatch(dismissNotificationRequest({ id }));
|
dispatch(dismissNotificationRequest(id));
|
||||||
}, [dispatch, id]);
|
}, [dispatch, id]);
|
||||||
|
|
||||||
const handleAccept = useCallback(() => {
|
const handleAccept = useCallback(() => {
|
||||||
dispatch(acceptNotificationRequest({ id }));
|
dispatch(acceptNotificationRequest(id));
|
||||||
}, [dispatch, id]);
|
}, [dispatch, id]);
|
||||||
|
|
||||||
const handleMute = useCallback(() => {
|
const handleMute = useCallback(() => {
|
||||||
|
|
|
@ -10,13 +10,7 @@ import { useSelector, useDispatch } from 'react-redux';
|
||||||
import DeleteIcon from '@/material-icons/400-24px/delete.svg?react';
|
import DeleteIcon from '@/material-icons/400-24px/delete.svg?react';
|
||||||
import DoneIcon from '@/material-icons/400-24px/done.svg?react';
|
import DoneIcon from '@/material-icons/400-24px/done.svg?react';
|
||||||
import InventoryIcon from '@/material-icons/400-24px/inventory_2.svg?react';
|
import InventoryIcon from '@/material-icons/400-24px/inventory_2.svg?react';
|
||||||
import {
|
import { fetchNotificationRequest, fetchNotificationsForRequest, expandNotificationsForRequest, acceptNotificationRequest, dismissNotificationRequest } from 'mastodon/actions/notifications';
|
||||||
fetchNotificationRequest,
|
|
||||||
fetchNotificationsForRequest,
|
|
||||||
expandNotificationsForRequest,
|
|
||||||
acceptNotificationRequest,
|
|
||||||
dismissNotificationRequest,
|
|
||||||
} from 'mastodon/actions/notification_requests';
|
|
||||||
import Column from 'mastodon/components/column';
|
import Column from 'mastodon/components/column';
|
||||||
import ColumnHeader from 'mastodon/components/column_header';
|
import ColumnHeader from 'mastodon/components/column_header';
|
||||||
import { IconButton } from 'mastodon/components/icon_button';
|
import { IconButton } from 'mastodon/components/icon_button';
|
||||||
|
@ -50,28 +44,28 @@ export const NotificationRequest = ({ multiColumn, params: { id } }) => {
|
||||||
const columnRef = useRef();
|
const columnRef = useRef();
|
||||||
const intl = useIntl();
|
const intl = useIntl();
|
||||||
const dispatch = useDispatch();
|
const dispatch = useDispatch();
|
||||||
const notificationRequest = useSelector(state => state.notificationRequests.current.item?.id === id ? state.notificationRequests.current.item : null);
|
const notificationRequest = useSelector(state => state.getIn(['notificationRequests', 'current', 'item', 'id']) === id ? state.getIn(['notificationRequests', 'current', 'item']) : null);
|
||||||
const accountId = notificationRequest?.account_id;
|
const accountId = notificationRequest?.get('account');
|
||||||
const account = useSelector(state => state.getIn(['accounts', accountId]));
|
const account = useSelector(state => state.getIn(['accounts', accountId]));
|
||||||
const notifications = useSelector(state => state.notificationRequests.current.notifications.items);
|
const notifications = useSelector(state => state.getIn(['notificationRequests', 'current', 'notifications', 'items']));
|
||||||
const isLoading = useSelector(state => state.notificationRequests.current.notifications.isLoading);
|
const isLoading = useSelector(state => state.getIn(['notificationRequests', 'current', 'notifications', 'isLoading']));
|
||||||
const hasMore = useSelector(state => !!state.notificationRequests.current.notifications.next);
|
const hasMore = useSelector(state => !!state.getIn(['notificationRequests', 'current', 'notifications', 'next']));
|
||||||
const removed = useSelector(state => state.notificationRequests.current.removed);
|
const removed = useSelector(state => state.getIn(['notificationRequests', 'current', 'removed']));
|
||||||
|
|
||||||
const handleHeaderClick = useCallback(() => {
|
const handleHeaderClick = useCallback(() => {
|
||||||
columnRef.current?.scrollTop();
|
columnRef.current?.scrollTop();
|
||||||
}, [columnRef]);
|
}, [columnRef]);
|
||||||
|
|
||||||
const handleLoadMore = useCallback(() => {
|
const handleLoadMore = useCallback(() => {
|
||||||
dispatch(expandNotificationsForRequest({ accountId }));
|
dispatch(expandNotificationsForRequest());
|
||||||
}, [dispatch, accountId]);
|
}, [dispatch]);
|
||||||
|
|
||||||
const handleDismiss = useCallback(() => {
|
const handleDismiss = useCallback(() => {
|
||||||
dispatch(dismissNotificationRequest({ id }));
|
dispatch(dismissNotificationRequest(id));
|
||||||
}, [dispatch, id]);
|
}, [dispatch, id]);
|
||||||
|
|
||||||
const handleAccept = useCallback(() => {
|
const handleAccept = useCallback(() => {
|
||||||
dispatch(acceptNotificationRequest({ id }));
|
dispatch(acceptNotificationRequest(id));
|
||||||
}, [dispatch, id]);
|
}, [dispatch, id]);
|
||||||
|
|
||||||
const handleMoveUp = useCallback(id => {
|
const handleMoveUp = useCallback(id => {
|
||||||
|
@ -85,12 +79,12 @@ export const NotificationRequest = ({ multiColumn, params: { id } }) => {
|
||||||
}, [columnRef, notifications]);
|
}, [columnRef, notifications]);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
dispatch(fetchNotificationRequest({ id }));
|
dispatch(fetchNotificationRequest(id));
|
||||||
}, [dispatch, id]);
|
}, [dispatch, id]);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (accountId) {
|
if (accountId) {
|
||||||
dispatch(fetchNotificationsForRequest({ accountId }));
|
dispatch(fetchNotificationsForRequest(accountId));
|
||||||
}
|
}
|
||||||
}, [dispatch, accountId]);
|
}, [dispatch, accountId]);
|
||||||
|
|
||||||
|
|
|
@ -11,12 +11,7 @@ import ArrowDropDownIcon from '@/material-icons/400-24px/arrow_drop_down.svg?rea
|
||||||
import InventoryIcon from '@/material-icons/400-24px/inventory_2.svg?react';
|
import InventoryIcon from '@/material-icons/400-24px/inventory_2.svg?react';
|
||||||
import MoreHorizIcon from '@/material-icons/400-24px/more_horiz.svg?react';
|
import MoreHorizIcon from '@/material-icons/400-24px/more_horiz.svg?react';
|
||||||
import { openModal } from 'mastodon/actions/modal';
|
import { openModal } from 'mastodon/actions/modal';
|
||||||
import {
|
import { fetchNotificationRequests, expandNotificationRequests, acceptNotificationRequests, dismissNotificationRequests } from 'mastodon/actions/notifications';
|
||||||
fetchNotificationRequests,
|
|
||||||
expandNotificationRequests,
|
|
||||||
acceptNotificationRequests,
|
|
||||||
dismissNotificationRequests,
|
|
||||||
} from 'mastodon/actions/notification_requests';
|
|
||||||
import { changeSetting } from 'mastodon/actions/settings';
|
import { changeSetting } from 'mastodon/actions/settings';
|
||||||
import { CheckBox } from 'mastodon/components/check_box';
|
import { CheckBox } from 'mastodon/components/check_box';
|
||||||
import Column from 'mastodon/components/column';
|
import Column from 'mastodon/components/column';
|
||||||
|
@ -89,7 +84,7 @@ const SelectRow = ({selectAllChecked, toggleSelectAll, selectedItems, selectionM
|
||||||
message: intl.formatMessage(messages.confirmAcceptMultipleMessage, { count: selectedItems.length }),
|
message: intl.formatMessage(messages.confirmAcceptMultipleMessage, { count: selectedItems.length }),
|
||||||
confirm: intl.formatMessage(messages.confirmAcceptMultipleButton, { count: selectedItems.length}),
|
confirm: intl.formatMessage(messages.confirmAcceptMultipleButton, { count: selectedItems.length}),
|
||||||
onConfirm: () =>
|
onConfirm: () =>
|
||||||
dispatch(acceptNotificationRequests({ ids: selectedItems })),
|
dispatch(acceptNotificationRequests(selectedItems)),
|
||||||
},
|
},
|
||||||
}));
|
}));
|
||||||
}, [dispatch, intl, selectedItems]);
|
}, [dispatch, intl, selectedItems]);
|
||||||
|
@ -102,7 +97,7 @@ const SelectRow = ({selectAllChecked, toggleSelectAll, selectedItems, selectionM
|
||||||
message: intl.formatMessage(messages.confirmDismissMultipleMessage, { count: selectedItems.length }),
|
message: intl.formatMessage(messages.confirmDismissMultipleMessage, { count: selectedItems.length }),
|
||||||
confirm: intl.formatMessage(messages.confirmDismissMultipleButton, { count: selectedItems.length}),
|
confirm: intl.formatMessage(messages.confirmDismissMultipleButton, { count: selectedItems.length}),
|
||||||
onConfirm: () =>
|
onConfirm: () =>
|
||||||
dispatch(dismissNotificationRequests({ ids: selectedItems })),
|
dispatch(dismissNotificationRequests(selectedItems)),
|
||||||
},
|
},
|
||||||
}));
|
}));
|
||||||
}, [dispatch, intl, selectedItems]);
|
}, [dispatch, intl, selectedItems]);
|
||||||
|
@ -166,9 +161,9 @@ export const NotificationRequests = ({ multiColumn }) => {
|
||||||
const columnRef = useRef();
|
const columnRef = useRef();
|
||||||
const intl = useIntl();
|
const intl = useIntl();
|
||||||
const dispatch = useDispatch();
|
const dispatch = useDispatch();
|
||||||
const isLoading = useSelector(state => state.notificationRequests.isLoading);
|
const isLoading = useSelector(state => state.getIn(['notificationRequests', 'isLoading']));
|
||||||
const notificationRequests = useSelector(state => state.notificationRequests.items);
|
const notificationRequests = useSelector(state => state.getIn(['notificationRequests', 'items']));
|
||||||
const hasMore = useSelector(state => !!state.notificationRequests.next);
|
const hasMore = useSelector(state => !!state.getIn(['notificationRequests', 'next']));
|
||||||
|
|
||||||
const [selectionMode, setSelectionMode] = useState(false);
|
const [selectionMode, setSelectionMode] = useState(false);
|
||||||
const [checkedRequestIds, setCheckedRequestIds] = useState([]);
|
const [checkedRequestIds, setCheckedRequestIds] = useState([]);
|
||||||
|
@ -187,7 +182,7 @@ export const NotificationRequests = ({ multiColumn }) => {
|
||||||
else
|
else
|
||||||
ids.push(id);
|
ids.push(id);
|
||||||
|
|
||||||
setSelectAllChecked(ids.length === notificationRequests.length);
|
setSelectAllChecked(ids.length === notificationRequests.size);
|
||||||
|
|
||||||
return [...ids];
|
return [...ids];
|
||||||
});
|
});
|
||||||
|
@ -198,7 +193,7 @@ export const NotificationRequests = ({ multiColumn }) => {
|
||||||
if(checked)
|
if(checked)
|
||||||
setCheckedRequestIds([]);
|
setCheckedRequestIds([]);
|
||||||
else
|
else
|
||||||
setCheckedRequestIds(notificationRequests.map(request => request.id));
|
setCheckedRequestIds(notificationRequests.map(request => request.get('id')).toArray());
|
||||||
|
|
||||||
return !checked;
|
return !checked;
|
||||||
});
|
});
|
||||||
|
@ -222,7 +217,7 @@ export const NotificationRequests = ({ multiColumn }) => {
|
||||||
multiColumn={multiColumn}
|
multiColumn={multiColumn}
|
||||||
showBackButton
|
showBackButton
|
||||||
appendContent={
|
appendContent={
|
||||||
notificationRequests.length > 0 && (
|
notificationRequests.size > 0 && (
|
||||||
<SelectRow selectionMode={selectionMode} setSelectionMode={setSelectionMode} selectAllChecked={selectAllChecked} toggleSelectAll={toggleSelectAll} selectedItems={checkedRequestIds} />
|
<SelectRow selectionMode={selectionMode} setSelectionMode={setSelectionMode} selectAllChecked={selectAllChecked} toggleSelectAll={toggleSelectAll} selectedItems={checkedRequestIds} />
|
||||||
)}
|
)}
|
||||||
>
|
>
|
||||||
|
@ -241,12 +236,12 @@ export const NotificationRequests = ({ multiColumn }) => {
|
||||||
>
|
>
|
||||||
{notificationRequests.map(request => (
|
{notificationRequests.map(request => (
|
||||||
<NotificationRequest
|
<NotificationRequest
|
||||||
key={request.id}
|
key={request.get('id')}
|
||||||
id={request.id}
|
id={request.get('id')}
|
||||||
accountId={request.account_id}
|
accountId={request.get('account')}
|
||||||
notificationsCount={request.notifications_count}
|
notificationsCount={request.get('notifications_count')}
|
||||||
showCheckbox={selectionMode}
|
showCheckbox={selectionMode}
|
||||||
checked={checkedRequestIds.includes(request.id)}
|
checked={checkedRequestIds.includes(request.get('id'))}
|
||||||
toggleCheck={handleCheck}
|
toggleCheck={handleCheck}
|
||||||
/>
|
/>
|
||||||
))}
|
))}
|
||||||
|
|
|
@ -1,8 +1,13 @@
|
||||||
|
import Notifications from 'mastodon/features/notifications';
|
||||||
import Notifications_v2 from 'mastodon/features/notifications_v2';
|
import Notifications_v2 from 'mastodon/features/notifications_v2';
|
||||||
|
import { selectUseGroupedNotifications } from 'mastodon/selectors/settings';
|
||||||
|
import { useAppSelector } from 'mastodon/store';
|
||||||
|
|
||||||
export const NotificationsWrapper = (props) => {
|
export const NotificationsWrapper = (props) => {
|
||||||
|
const optedInGroupedNotifications = useAppSelector(selectUseGroupedNotifications);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Notifications_v2 {...props} />
|
optedInGroupedNotifications ? <Notifications_v2 {...props} /> : <Notifications {...props} />
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -99,7 +99,7 @@ export const BlockModal = ({ accountId, acct }) => {
|
||||||
<FormattedMessage id='confirmation_modal.cancel' defaultMessage='Cancel' />
|
<FormattedMessage id='confirmation_modal.cancel' defaultMessage='Cancel' />
|
||||||
</button>
|
</button>
|
||||||
|
|
||||||
<Button onClick={handleClick} dangerous autoFocus>
|
<Button onClick={handleClick} autoFocus>
|
||||||
<FormattedMessage id='confirmations.block.confirm' defaultMessage='Block' />
|
<FormattedMessage id='confirmations.block.confirm' defaultMessage='Block' />
|
||||||
</Button>
|
</Button>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -5,9 +5,9 @@ import { useRouteMatch, NavLink } from 'react-router-dom';
|
||||||
|
|
||||||
import { Icon } from 'mastodon/components/icon';
|
import { Icon } from 'mastodon/components/icon';
|
||||||
|
|
||||||
const ColumnLink = ({ icon, activeIcon, iconComponent, activeIconComponent, text, to, href, method, badge, transparent, optional, ...other }) => {
|
const ColumnLink = ({ icon, activeIcon, iconComponent, activeIconComponent, text, to, href, method, badge, transparent, ...other }) => {
|
||||||
const match = useRouteMatch(to);
|
const match = useRouteMatch(to);
|
||||||
const className = classNames('column-link', { 'column-link--transparent': transparent, 'column-link--optional': optional });
|
const className = classNames('column-link', { 'column-link--transparent': transparent });
|
||||||
const badgeElement = typeof badge !== 'undefined' ? <span className='column-link__badge'>{badge}</span> : null;
|
const badgeElement = typeof badge !== 'undefined' ? <span className='column-link__badge'>{badge}</span> : null;
|
||||||
const iconElement = (typeof icon === 'string' || iconComponent) ? <Icon id={icon} icon={iconComponent} className='column-link__icon' /> : icon;
|
const iconElement = (typeof icon === 'string' || iconComponent) ? <Icon id={icon} icon={iconComponent} className='column-link__icon' /> : icon;
|
||||||
const activeIconElement = activeIcon ?? (activeIconComponent ? <Icon id={icon} icon={activeIconComponent} className='column-link__icon' /> : iconElement);
|
const activeIconElement = activeIcon ?? (activeIconComponent ? <Icon id={icon} icon={activeIconComponent} className='column-link__icon' /> : iconElement);
|
||||||
|
@ -43,7 +43,6 @@ ColumnLink.propTypes = {
|
||||||
method: PropTypes.string,
|
method: PropTypes.string,
|
||||||
badge: PropTypes.node,
|
badge: PropTypes.node,
|
||||||
transparent: PropTypes.bool,
|
transparent: PropTypes.bool,
|
||||||
optional: PropTypes.bool,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
export default ColumnLink;
|
export default ColumnLink;
|
||||||
|
|
|
@ -4,6 +4,8 @@ import { Children, cloneElement, useCallback } from 'react';
|
||||||
import ImmutablePropTypes from 'react-immutable-proptypes';
|
import ImmutablePropTypes from 'react-immutable-proptypes';
|
||||||
import ImmutablePureComponent from 'react-immutable-pure-component';
|
import ImmutablePureComponent from 'react-immutable-pure-component';
|
||||||
|
|
||||||
|
import { supportsPassiveEvents } from 'detect-passive-events';
|
||||||
|
|
||||||
import { scrollRight } from '../../../scroll';
|
import { scrollRight } from '../../../scroll';
|
||||||
import BundleContainer from '../containers/bundle_container';
|
import BundleContainer from '../containers/bundle_container';
|
||||||
import {
|
import {
|
||||||
|
@ -61,7 +63,7 @@ export default class ColumnsArea extends ImmutablePureComponent {
|
||||||
children: PropTypes.node,
|
children: PropTypes.node,
|
||||||
};
|
};
|
||||||
|
|
||||||
// Corresponds to (max-width: $no-gap-breakpoint - 1px) in SCSS
|
// Corresponds to (max-width: $no-gap-breakpoint + 285px - 1px) in SCSS
|
||||||
mediaQuery = 'matchMedia' in window && window.matchMedia('(max-width: 1174px)');
|
mediaQuery = 'matchMedia' in window && window.matchMedia('(max-width: 1174px)');
|
||||||
|
|
||||||
state = {
|
state = {
|
||||||
|
@ -69,6 +71,10 @@ export default class ColumnsArea extends ImmutablePureComponent {
|
||||||
};
|
};
|
||||||
|
|
||||||
componentDidMount() {
|
componentDidMount() {
|
||||||
|
if (!this.props.singleColumn) {
|
||||||
|
this.node.addEventListener('wheel', this.handleWheel, supportsPassiveEvents ? { passive: true } : false);
|
||||||
|
}
|
||||||
|
|
||||||
if (this.mediaQuery) {
|
if (this.mediaQuery) {
|
||||||
if (this.mediaQuery.addEventListener) {
|
if (this.mediaQuery.addEventListener) {
|
||||||
this.mediaQuery.addEventListener('change', this.handleLayoutChange);
|
this.mediaQuery.addEventListener('change', this.handleLayoutChange);
|
||||||
|
@ -81,7 +87,23 @@ export default class ColumnsArea extends ImmutablePureComponent {
|
||||||
this.isRtlLayout = document.getElementsByTagName('body')[0].classList.contains('rtl');
|
this.isRtlLayout = document.getElementsByTagName('body')[0].classList.contains('rtl');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
UNSAFE_componentWillUpdate(nextProps) {
|
||||||
|
if (this.props.singleColumn !== nextProps.singleColumn && nextProps.singleColumn) {
|
||||||
|
this.node.removeEventListener('wheel', this.handleWheel);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
componentDidUpdate(prevProps) {
|
||||||
|
if (this.props.singleColumn !== prevProps.singleColumn && !this.props.singleColumn) {
|
||||||
|
this.node.addEventListener('wheel', this.handleWheel, supportsPassiveEvents ? { passive: true } : false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
componentWillUnmount () {
|
componentWillUnmount () {
|
||||||
|
if (!this.props.singleColumn) {
|
||||||
|
this.node.removeEventListener('wheel', this.handleWheel);
|
||||||
|
}
|
||||||
|
|
||||||
if (this.mediaQuery) {
|
if (this.mediaQuery) {
|
||||||
if (this.mediaQuery.removeEventListener) {
|
if (this.mediaQuery.removeEventListener) {
|
||||||
this.mediaQuery.removeEventListener('change', this.handleLayoutChange);
|
this.mediaQuery.removeEventListener('change', this.handleLayoutChange);
|
||||||
|
@ -94,7 +116,7 @@ export default class ColumnsArea extends ImmutablePureComponent {
|
||||||
handleChildrenContentChange() {
|
handleChildrenContentChange() {
|
||||||
if (!this.props.singleColumn) {
|
if (!this.props.singleColumn) {
|
||||||
const modifier = this.isRtlLayout ? -1 : 1;
|
const modifier = this.isRtlLayout ? -1 : 1;
|
||||||
scrollRight(this.node, (this.node.scrollWidth - window.innerWidth) * modifier);
|
this._interruptScrollAnimation = scrollRight(this.node, (this.node.scrollWidth - window.innerWidth) * modifier);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -102,6 +124,14 @@ export default class ColumnsArea extends ImmutablePureComponent {
|
||||||
this.setState({ renderComposePanel: !e.matches });
|
this.setState({ renderComposePanel: !e.matches });
|
||||||
};
|
};
|
||||||
|
|
||||||
|
handleWheel = () => {
|
||||||
|
if (typeof this._interruptScrollAnimation !== 'function') {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
this._interruptScrollAnimation();
|
||||||
|
};
|
||||||
|
|
||||||
setRef = (node) => {
|
setRef = (node) => {
|
||||||
this.node = node;
|
this.node = node;
|
||||||
};
|
};
|
||||||
|
|
|
@ -0,0 +1,106 @@
|
||||||
|
import PropTypes from 'prop-types';
|
||||||
|
import { useCallback } from 'react';
|
||||||
|
|
||||||
|
import { FormattedMessage } from 'react-intl';
|
||||||
|
|
||||||
|
import { useDispatch } from 'react-redux';
|
||||||
|
|
||||||
|
import CampaignIcon from '@/material-icons/400-24px/campaign.svg?react';
|
||||||
|
import DomainDisabledIcon from '@/material-icons/400-24px/domain_disabled.svg?react';
|
||||||
|
import HistoryIcon from '@/material-icons/400-24px/history.svg?react';
|
||||||
|
import PersonRemoveIcon from '@/material-icons/400-24px/person_remove.svg?react';
|
||||||
|
import ReplyIcon from '@/material-icons/400-24px/reply.svg?react';
|
||||||
|
import VisibilityOffIcon from '@/material-icons/400-24px/visibility_off.svg?react';
|
||||||
|
import { blockAccount } from 'mastodon/actions/accounts';
|
||||||
|
import { blockDomain } from 'mastodon/actions/domain_blocks';
|
||||||
|
import { closeModal } from 'mastodon/actions/modal';
|
||||||
|
import { Button } from 'mastodon/components/button';
|
||||||
|
import { Icon } from 'mastodon/components/icon';
|
||||||
|
|
||||||
|
export const DomainBlockModal = ({ domain, accountId, acct }) => {
|
||||||
|
const dispatch = useDispatch();
|
||||||
|
|
||||||
|
const handleClick = useCallback(() => {
|
||||||
|
dispatch(closeModal({ modalType: undefined, ignoreFocus: false }));
|
||||||
|
dispatch(blockDomain(domain));
|
||||||
|
}, [dispatch, domain]);
|
||||||
|
|
||||||
|
const handleSecondaryClick = useCallback(() => {
|
||||||
|
dispatch(closeModal({ modalType: undefined, ignoreFocus: false }));
|
||||||
|
dispatch(blockAccount(accountId));
|
||||||
|
}, [dispatch, accountId]);
|
||||||
|
|
||||||
|
const handleCancel = useCallback(() => {
|
||||||
|
dispatch(closeModal({ modalType: undefined, ignoreFocus: false }));
|
||||||
|
}, [dispatch]);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div className='modal-root__modal safety-action-modal'>
|
||||||
|
<div className='safety-action-modal__top'>
|
||||||
|
<div className='safety-action-modal__header'>
|
||||||
|
<div className='safety-action-modal__header__icon'>
|
||||||
|
<Icon icon={DomainDisabledIcon} />
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div>
|
||||||
|
<h1><FormattedMessage id='domain_block_modal.title' defaultMessage='Block domain?' /></h1>
|
||||||
|
<div>{domain}</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div className='safety-action-modal__bullet-points'>
|
||||||
|
<div>
|
||||||
|
<div className='safety-action-modal__bullet-points__icon'><Icon icon={CampaignIcon} /></div>
|
||||||
|
<div><FormattedMessage id='domain_block_modal.they_wont_know' defaultMessage="They won't know they've been blocked." /></div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div>
|
||||||
|
<div className='safety-action-modal__bullet-points__icon'><Icon icon={VisibilityOffIcon} /></div>
|
||||||
|
<div><FormattedMessage id='domain_block_modal.you_wont_see_posts' defaultMessage="You won't see posts or notifications from users on this server." /></div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div>
|
||||||
|
<div className='safety-action-modal__bullet-points__icon'><Icon icon={PersonRemoveIcon} /></div>
|
||||||
|
<div><FormattedMessage id='domain_block_modal.you_will_lose_followers' defaultMessage='All your followers from this server will be removed.' /></div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div>
|
||||||
|
<div className='safety-action-modal__bullet-points__icon'><Icon icon={ReplyIcon} /></div>
|
||||||
|
<div><FormattedMessage id='domain_block_modal.they_cant_follow' defaultMessage='Nobody from this server can follow you.' /></div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div>
|
||||||
|
<div className='safety-action-modal__bullet-points__icon'><Icon icon={HistoryIcon} /></div>
|
||||||
|
<div><FormattedMessage id='domain_block_modal.they_can_interact_with_old_posts' defaultMessage='People from this server can interact with your old posts.' /></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div className='safety-action-modal__bottom'>
|
||||||
|
<div className='safety-action-modal__actions'>
|
||||||
|
<Button onClick={handleSecondaryClick} secondary>
|
||||||
|
<FormattedMessage id='domain_block_modal.block_account_instead' defaultMessage='Block @{name} instead' values={{ name: acct.split('@')[0] }} />
|
||||||
|
</Button>
|
||||||
|
|
||||||
|
<div className='spacer' />
|
||||||
|
|
||||||
|
<button onClick={handleCancel} className='link-button'>
|
||||||
|
<FormattedMessage id='confirmation_modal.cancel' defaultMessage='Cancel' />
|
||||||
|
</button>
|
||||||
|
|
||||||
|
<Button onClick={handleClick} autoFocus>
|
||||||
|
<FormattedMessage id='domain_block_modal.block' defaultMessage='Block server' />
|
||||||
|
</Button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
DomainBlockModal.propTypes = {
|
||||||
|
domain: PropTypes.string.isRequired,
|
||||||
|
accountId: PropTypes.string.isRequired,
|
||||||
|
acct: PropTypes.string.isRequired,
|
||||||
|
};
|
||||||
|
|
||||||
|
export default DomainBlockModal;
|
|
@ -1,204 +0,0 @@
|
||||||
import { useCallback, useEffect, useState } from 'react';
|
|
||||||
|
|
||||||
import { FormattedMessage } from 'react-intl';
|
|
||||||
|
|
||||||
import CampaignIcon from '@/material-icons/400-24px/campaign.svg?react';
|
|
||||||
import DomainDisabledIcon from '@/material-icons/400-24px/domain_disabled.svg?react';
|
|
||||||
import HistoryIcon from '@/material-icons/400-24px/history.svg?react';
|
|
||||||
import PersonRemoveIcon from '@/material-icons/400-24px/person_remove.svg?react';
|
|
||||||
import ReplyIcon from '@/material-icons/400-24px/reply.svg?react';
|
|
||||||
import VisibilityOffIcon from '@/material-icons/400-24px/visibility_off.svg?react';
|
|
||||||
import { blockAccount } from 'mastodon/actions/accounts';
|
|
||||||
import { blockDomain } from 'mastodon/actions/domain_blocks';
|
|
||||||
import { closeModal } from 'mastodon/actions/modal';
|
|
||||||
import { apiRequest } from 'mastodon/api';
|
|
||||||
import { Button } from 'mastodon/components/button';
|
|
||||||
import { Icon } from 'mastodon/components/icon';
|
|
||||||
import { LoadingIndicator } from 'mastodon/components/loading_indicator';
|
|
||||||
import { ShortNumber } from 'mastodon/components/short_number';
|
|
||||||
import { useAppDispatch } from 'mastodon/store';
|
|
||||||
|
|
||||||
interface DomainBlockPreviewResponse {
|
|
||||||
following_count: number;
|
|
||||||
followers_count: number;
|
|
||||||
}
|
|
||||||
|
|
||||||
export const DomainBlockModal: React.FC<{
|
|
||||||
domain: string;
|
|
||||||
accountId: string;
|
|
||||||
acct: string;
|
|
||||||
}> = ({ domain, accountId, acct }) => {
|
|
||||||
const dispatch = useAppDispatch();
|
|
||||||
const [loading, setLoading] = useState(true);
|
|
||||||
const [preview, setPreview] = useState<DomainBlockPreviewResponse | null>(
|
|
||||||
null,
|
|
||||||
);
|
|
||||||
|
|
||||||
const handleClick = useCallback(() => {
|
|
||||||
if (loading) {
|
|
||||||
return; // Prevent destructive action before the preview finishes loading or times out
|
|
||||||
}
|
|
||||||
|
|
||||||
dispatch(closeModal({ modalType: undefined, ignoreFocus: false }));
|
|
||||||
dispatch(blockDomain(domain));
|
|
||||||
}, [dispatch, loading, domain]);
|
|
||||||
|
|
||||||
const handleSecondaryClick = useCallback(() => {
|
|
||||||
dispatch(closeModal({ modalType: undefined, ignoreFocus: false }));
|
|
||||||
dispatch(blockAccount(accountId));
|
|
||||||
}, [dispatch, accountId]);
|
|
||||||
|
|
||||||
const handleCancel = useCallback(() => {
|
|
||||||
dispatch(closeModal({ modalType: undefined, ignoreFocus: false }));
|
|
||||||
}, [dispatch]);
|
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
setLoading(true);
|
|
||||||
|
|
||||||
apiRequest<DomainBlockPreviewResponse>('GET', 'v1/domain_blocks/preview', {
|
|
||||||
params: { domain },
|
|
||||||
timeout: 5000,
|
|
||||||
})
|
|
||||||
.then((data) => {
|
|
||||||
setPreview(data);
|
|
||||||
setLoading(false);
|
|
||||||
return '';
|
|
||||||
})
|
|
||||||
.catch(() => {
|
|
||||||
setLoading(false);
|
|
||||||
});
|
|
||||||
}, [setPreview, setLoading, domain]);
|
|
||||||
|
|
||||||
return (
|
|
||||||
<div className='modal-root__modal safety-action-modal' aria-live='polite'>
|
|
||||||
<div className='safety-action-modal__top'>
|
|
||||||
<div className='safety-action-modal__header'>
|
|
||||||
<div className='safety-action-modal__header__icon'>
|
|
||||||
<Icon id='' icon={DomainDisabledIcon} />
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div>
|
|
||||||
<h1>
|
|
||||||
<FormattedMessage
|
|
||||||
id='domain_block_modal.title'
|
|
||||||
defaultMessage='Block domain?'
|
|
||||||
/>
|
|
||||||
</h1>
|
|
||||||
<div>{domain}</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div className='safety-action-modal__bullet-points'>
|
|
||||||
{preview && preview.followers_count + preview.following_count > 0 && (
|
|
||||||
<div>
|
|
||||||
<div className='safety-action-modal__bullet-points__icon'>
|
|
||||||
<Icon id='' icon={PersonRemoveIcon} />
|
|
||||||
</div>
|
|
||||||
<div>
|
|
||||||
<strong>
|
|
||||||
<FormattedMessage
|
|
||||||
id='domain_block_modal.you_will_lose_num_followers'
|
|
||||||
defaultMessage='You will lose {followersCount, plural, one {{followersCountDisplay} follower} other {{followersCountDisplay} followers}} and {followingCount, plural, one {{followingCountDisplay} person you follow} other {{followingCountDisplay} people you follow}}.'
|
|
||||||
values={{
|
|
||||||
followersCount: preview.followers_count,
|
|
||||||
followersCountDisplay: (
|
|
||||||
<ShortNumber value={preview.followers_count} />
|
|
||||||
),
|
|
||||||
followingCount: preview.following_count,
|
|
||||||
followingCountDisplay: (
|
|
||||||
<ShortNumber value={preview.following_count} />
|
|
||||||
),
|
|
||||||
}}
|
|
||||||
/>
|
|
||||||
</strong>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
)}
|
|
||||||
|
|
||||||
<div className='safety-action-modal__bullet-points--deemphasized'>
|
|
||||||
<div className='safety-action-modal__bullet-points__icon'>
|
|
||||||
<Icon id='' icon={CampaignIcon} />
|
|
||||||
</div>
|
|
||||||
<div>
|
|
||||||
<FormattedMessage
|
|
||||||
id='domain_block_modal.they_wont_know'
|
|
||||||
defaultMessage="They won't know they've been blocked."
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div className='safety-action-modal__bullet-points--deemphasized'>
|
|
||||||
<div className='safety-action-modal__bullet-points__icon'>
|
|
||||||
<Icon id='' icon={VisibilityOffIcon} />
|
|
||||||
</div>
|
|
||||||
<div>
|
|
||||||
<FormattedMessage
|
|
||||||
id='domain_block_modal.you_wont_see_posts'
|
|
||||||
defaultMessage="You won't see posts or notifications from users on this server."
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div className='safety-action-modal__bullet-points--deemphasized'>
|
|
||||||
<div className='safety-action-modal__bullet-points__icon'>
|
|
||||||
<Icon id='' icon={ReplyIcon} />
|
|
||||||
</div>
|
|
||||||
<div>
|
|
||||||
<FormattedMessage
|
|
||||||
id='domain_block_modal.they_cant_follow'
|
|
||||||
defaultMessage='Nobody from this server can follow you.'
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div className='safety-action-modal__bullet-points--deemphasized'>
|
|
||||||
<div className='safety-action-modal__bullet-points__icon'>
|
|
||||||
<Icon id='' icon={HistoryIcon} />
|
|
||||||
</div>
|
|
||||||
<div>
|
|
||||||
<FormattedMessage
|
|
||||||
id='domain_block_modal.they_can_interact_with_old_posts'
|
|
||||||
defaultMessage='People from this server can interact with your old posts.'
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div className='safety-action-modal__bottom'>
|
|
||||||
<div className='safety-action-modal__actions'>
|
|
||||||
<Button onClick={handleSecondaryClick} secondary>
|
|
||||||
<FormattedMessage
|
|
||||||
id='domain_block_modal.block_account_instead'
|
|
||||||
defaultMessage='Block @{name} instead'
|
|
||||||
values={{ name: acct.split('@')[0] }}
|
|
||||||
/>
|
|
||||||
</Button>
|
|
||||||
|
|
||||||
<div className='spacer' />
|
|
||||||
|
|
||||||
<button onClick={handleCancel} className='link-button'>
|
|
||||||
<FormattedMessage
|
|
||||||
id='confirmation_modal.cancel'
|
|
||||||
defaultMessage='Cancel'
|
|
||||||
/>
|
|
||||||
</button>
|
|
||||||
|
|
||||||
<Button onClick={handleClick} dangerous aria-busy={loading}>
|
|
||||||
{loading ? (
|
|
||||||
<LoadingIndicator />
|
|
||||||
) : (
|
|
||||||
<FormattedMessage
|
|
||||||
id='domain_block_modal.block'
|
|
||||||
defaultMessage='Block server'
|
|
||||||
/>
|
|
||||||
)}
|
|
||||||
</Button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
};
|
|
||||||
|
|
||||||
// eslint-disable-next-line import/no-default-export
|
|
||||||
export default DomainBlockModal;
|
|
|
@ -17,7 +17,7 @@ export default class ImageLoader extends PureComponent {
|
||||||
width: PropTypes.number,
|
width: PropTypes.number,
|
||||||
height: PropTypes.number,
|
height: PropTypes.number,
|
||||||
onClick: PropTypes.func,
|
onClick: PropTypes.func,
|
||||||
zoomedIn: PropTypes.bool,
|
zoomButtonHidden: PropTypes.bool,
|
||||||
};
|
};
|
||||||
|
|
||||||
static defaultProps = {
|
static defaultProps = {
|
||||||
|
@ -134,7 +134,7 @@ export default class ImageLoader extends PureComponent {
|
||||||
};
|
};
|
||||||
|
|
||||||
render () {
|
render () {
|
||||||
const { alt, lang, src, width, height, onClick, zoomedIn } = this.props;
|
const { alt, lang, src, width, height, onClick } = this.props;
|
||||||
const { loading } = this.state;
|
const { loading } = this.state;
|
||||||
|
|
||||||
const className = classNames('image-loader', {
|
const className = classNames('image-loader', {
|
||||||
|
@ -149,7 +149,6 @@ export default class ImageLoader extends PureComponent {
|
||||||
<div className='loading-bar__container' style={{ width: this.state.width || width }}>
|
<div className='loading-bar__container' style={{ width: this.state.width || width }}>
|
||||||
<LoadingBar className='loading-bar' loading={1} />
|
<LoadingBar className='loading-bar' loading={1} />
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<canvas
|
<canvas
|
||||||
className='image-loader__preview-canvas'
|
className='image-loader__preview-canvas'
|
||||||
ref={this.setCanvasRef}
|
ref={this.setCanvasRef}
|
||||||
|
@ -165,7 +164,7 @@ export default class ImageLoader extends PureComponent {
|
||||||
onClick={onClick}
|
onClick={onClick}
|
||||||
width={width}
|
width={width}
|
||||||
height={height}
|
height={height}
|
||||||
zoomedIn={zoomedIn}
|
zoomButtonHidden={this.props.zoomButtonHidden}
|
||||||
/>
|
/>
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -12,8 +12,6 @@ import ReactSwipeableViews from 'react-swipeable-views';
|
||||||
import ChevronLeftIcon from '@/material-icons/400-24px/chevron_left.svg?react';
|
import ChevronLeftIcon from '@/material-icons/400-24px/chevron_left.svg?react';
|
||||||
import ChevronRightIcon from '@/material-icons/400-24px/chevron_right.svg?react';
|
import ChevronRightIcon from '@/material-icons/400-24px/chevron_right.svg?react';
|
||||||
import CloseIcon from '@/material-icons/400-24px/close.svg?react';
|
import CloseIcon from '@/material-icons/400-24px/close.svg?react';
|
||||||
import FitScreenIcon from '@/material-icons/400-24px/fit_screen.svg?react';
|
|
||||||
import ActualSizeIcon from '@/svg-icons/actual_size.svg?react';
|
|
||||||
import { getAverageFromBlurhash } from 'mastodon/blurhash';
|
import { getAverageFromBlurhash } from 'mastodon/blurhash';
|
||||||
import { GIFV } from 'mastodon/components/gifv';
|
import { GIFV } from 'mastodon/components/gifv';
|
||||||
import { Icon } from 'mastodon/components/icon';
|
import { Icon } from 'mastodon/components/icon';
|
||||||
|
@ -28,8 +26,6 @@ const messages = defineMessages({
|
||||||
close: { id: 'lightbox.close', defaultMessage: 'Close' },
|
close: { id: 'lightbox.close', defaultMessage: 'Close' },
|
||||||
previous: { id: 'lightbox.previous', defaultMessage: 'Previous' },
|
previous: { id: 'lightbox.previous', defaultMessage: 'Previous' },
|
||||||
next: { id: 'lightbox.next', defaultMessage: 'Next' },
|
next: { id: 'lightbox.next', defaultMessage: 'Next' },
|
||||||
zoomIn: { id: 'lightbox.zoom_in', defaultMessage: 'Zoom to actual size' },
|
|
||||||
zoomOut: { id: 'lightbox.zoom_out', defaultMessage: 'Zoom to fit' },
|
|
||||||
});
|
});
|
||||||
|
|
||||||
class MediaModal extends ImmutablePureComponent {
|
class MediaModal extends ImmutablePureComponent {
|
||||||
|
@ -50,39 +46,30 @@ class MediaModal extends ImmutablePureComponent {
|
||||||
state = {
|
state = {
|
||||||
index: null,
|
index: null,
|
||||||
navigationHidden: false,
|
navigationHidden: false,
|
||||||
zoomedIn: false,
|
zoomButtonHidden: false,
|
||||||
};
|
|
||||||
|
|
||||||
handleZoomClick = () => {
|
|
||||||
this.setState(prevState => ({
|
|
||||||
zoomedIn: !prevState.zoomedIn,
|
|
||||||
}));
|
|
||||||
};
|
};
|
||||||
|
|
||||||
handleSwipe = (index) => {
|
handleSwipe = (index) => {
|
||||||
this.setState({
|
this.setState({ index: index % this.props.media.size });
|
||||||
index: index % this.props.media.size,
|
|
||||||
zoomedIn: false,
|
|
||||||
});
|
|
||||||
};
|
};
|
||||||
|
|
||||||
handleTransitionEnd = () => {
|
handleTransitionEnd = () => {
|
||||||
this.setState({
|
this.setState({
|
||||||
zoomedIn: false,
|
zoomButtonHidden: false,
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
handleNextClick = () => {
|
handleNextClick = () => {
|
||||||
this.setState({
|
this.setState({
|
||||||
index: (this.getIndex() + 1) % this.props.media.size,
|
index: (this.getIndex() + 1) % this.props.media.size,
|
||||||
zoomedIn: false,
|
zoomButtonHidden: true,
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
handlePrevClick = () => {
|
handlePrevClick = () => {
|
||||||
this.setState({
|
this.setState({
|
||||||
index: (this.props.media.size + this.getIndex() - 1) % this.props.media.size,
|
index: (this.props.media.size + this.getIndex() - 1) % this.props.media.size,
|
||||||
zoomedIn: false,
|
zoomButtonHidden: true,
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -91,7 +78,7 @@ class MediaModal extends ImmutablePureComponent {
|
||||||
|
|
||||||
this.setState({
|
this.setState({
|
||||||
index: index % this.props.media.size,
|
index: index % this.props.media.size,
|
||||||
zoomedIn: false,
|
zoomButtonHidden: true,
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -143,22 +130,15 @@ class MediaModal extends ImmutablePureComponent {
|
||||||
return this.state.index !== null ? this.state.index : this.props.index;
|
return this.state.index !== null ? this.state.index : this.props.index;
|
||||||
}
|
}
|
||||||
|
|
||||||
handleToggleNavigation = () => {
|
toggleNavigation = () => {
|
||||||
this.setState(prevState => ({
|
this.setState(prevState => ({
|
||||||
navigationHidden: !prevState.navigationHidden,
|
navigationHidden: !prevState.navigationHidden,
|
||||||
}));
|
}));
|
||||||
};
|
};
|
||||||
|
|
||||||
setRef = c => {
|
|
||||||
this.setState({
|
|
||||||
viewportWidth: c?.clientWidth,
|
|
||||||
viewportHeight: c?.clientHeight,
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
render () {
|
render () {
|
||||||
const { media, statusId, lang, intl, onClose } = this.props;
|
const { media, statusId, lang, intl, onClose } = this.props;
|
||||||
const { navigationHidden, zoomedIn, viewportWidth, viewportHeight } = this.state;
|
const { navigationHidden } = this.state;
|
||||||
|
|
||||||
const index = this.getIndex();
|
const index = this.getIndex();
|
||||||
|
|
||||||
|
@ -180,8 +160,8 @@ class MediaModal extends ImmutablePureComponent {
|
||||||
alt={description}
|
alt={description}
|
||||||
lang={lang}
|
lang={lang}
|
||||||
key={image.get('url')}
|
key={image.get('url')}
|
||||||
onClick={this.handleToggleNavigation}
|
onClick={this.toggleNavigation}
|
||||||
zoomedIn={zoomedIn}
|
zoomButtonHidden={this.state.zoomButtonHidden}
|
||||||
/>
|
/>
|
||||||
);
|
);
|
||||||
} else if (image.get('type') === 'video') {
|
} else if (image.get('type') === 'video') {
|
||||||
|
@ -250,11 +230,8 @@ class MediaModal extends ImmutablePureComponent {
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
const currentMedia = media.get(index);
|
|
||||||
const zoomable = currentMedia.get('type') === 'image' && (currentMedia.getIn(['meta', 'original', 'width']) > viewportWidth || currentMedia.getIn(['meta', 'original', 'height']) > viewportHeight);
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className='modal-root__modal media-modal' ref={this.setRef}>
|
<div className='modal-root__modal media-modal'>
|
||||||
<div className='media-modal__closer' role='presentation' onClick={onClose} >
|
<div className='media-modal__closer' role='presentation' onClick={onClose} >
|
||||||
<ReactSwipeableViews
|
<ReactSwipeableViews
|
||||||
style={swipeableViewsStyle}
|
style={swipeableViewsStyle}
|
||||||
|
@ -269,10 +246,7 @@ class MediaModal extends ImmutablePureComponent {
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className={navigationClassName}>
|
<div className={navigationClassName}>
|
||||||
<div className='media-modal__buttons'>
|
<IconButton className='media-modal__close' title={intl.formatMessage(messages.close)} icon='times' iconComponent={CloseIcon} onClick={onClose} size={40} />
|
||||||
{zoomable && <IconButton title={intl.formatMessage(zoomedIn ? messages.zoomOut : messages.zoomIn)} iconComponent={zoomedIn ? FitScreenIcon : ActualSizeIcon} onClick={this.handleZoomClick} />}
|
|
||||||
<IconButton title={intl.formatMessage(messages.close)} icon='times' iconComponent={CloseIcon} onClick={onClose} />
|
|
||||||
</div>
|
|
||||||
|
|
||||||
{leftNav}
|
{leftNav}
|
||||||
{rightNav}
|
{rightNav}
|
||||||
|
|
|
@ -38,6 +38,7 @@ import { timelinePreview, trendsEnabled } from 'mastodon/initial_state';
|
||||||
import { transientSingleColumn } from 'mastodon/is_mobile';
|
import { transientSingleColumn } from 'mastodon/is_mobile';
|
||||||
import { canManageReports, canViewAdminDashboard } from 'mastodon/permissions';
|
import { canManageReports, canViewAdminDashboard } from 'mastodon/permissions';
|
||||||
import { selectUnreadNotificationGroupsCount } from 'mastodon/selectors/notifications';
|
import { selectUnreadNotificationGroupsCount } from 'mastodon/selectors/notifications';
|
||||||
|
import { selectUseGroupedNotifications } from 'mastodon/selectors/settings';
|
||||||
|
|
||||||
import ColumnLink from './column_link';
|
import ColumnLink from './column_link';
|
||||||
import DisabledAccountBanner from './disabled_account_banner';
|
import DisabledAccountBanner from './disabled_account_banner';
|
||||||
|
@ -66,17 +67,19 @@ const messages = defineMessages({
|
||||||
});
|
});
|
||||||
|
|
||||||
const NotificationsLink = () => {
|
const NotificationsLink = () => {
|
||||||
|
const optedInGroupedNotifications = useSelector(selectUseGroupedNotifications);
|
||||||
const count = useSelector(selectUnreadNotificationGroupsCount);
|
const count = useSelector(state => state.getIn(['notifications', 'unread']));
|
||||||
const intl = useIntl();
|
const intl = useIntl();
|
||||||
|
|
||||||
|
const newCount = useSelector(selectUnreadNotificationGroupsCount);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<ColumnLink
|
<ColumnLink
|
||||||
key='notifications'
|
key='notifications'
|
||||||
transparent
|
transparent
|
||||||
to='/notifications'
|
to='/notifications'
|
||||||
icon={<IconWithBadge id='bell' icon={NotificationsIcon} count={count} className='column-link__icon' />}
|
icon={<IconWithBadge id='bell' icon={NotificationsIcon} count={optedInGroupedNotifications ? newCount : count} className='column-link__icon' />}
|
||||||
activeIcon={<IconWithBadge id='bell' icon={NotificationsActiveIcon} count={count} className='column-link__icon' />}
|
activeIcon={<IconWithBadge id='bell' icon={NotificationsActiveIcon} count={optedInGroupedNotifications ? newCount : count} className='column-link__icon' />}
|
||||||
text={intl.formatMessage(messages.notifications)}
|
text={intl.formatMessage(messages.notifications)}
|
||||||
/>
|
/>
|
||||||
);
|
);
|
||||||
|
@ -122,17 +125,14 @@ class NavigationPanel extends Component {
|
||||||
|
|
||||||
let banner = undefined;
|
let banner = undefined;
|
||||||
|
|
||||||
if (transientSingleColumn) {
|
if(transientSingleColumn)
|
||||||
banner = (
|
banner = (<div className='switch-to-advanced'>
|
||||||
<div className='switch-to-advanced'>
|
|
||||||
{intl.formatMessage(messages.openedInClassicInterface)}
|
{intl.formatMessage(messages.openedInClassicInterface)}
|
||||||
{" "}
|
{" "}
|
||||||
<a href={`/deck${location.pathname}`} className='switch-to-advanced__toggle'>
|
<a href={`/deck${location.pathname}`} className='switch-to-advanced__toggle'>
|
||||||
{intl.formatMessage(messages.advancedInterface)}
|
{intl.formatMessage(messages.advancedInterface)}
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>);
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className='navigation-panel'>
|
<div className='navigation-panel'>
|
||||||
|
@ -146,7 +146,6 @@ class NavigationPanel extends Component {
|
||||||
</div>
|
</div>
|
||||||
}
|
}
|
||||||
|
|
||||||
<div className='navigation-panel__menu'>
|
|
||||||
{signedIn && (
|
{signedIn && (
|
||||||
<>
|
<>
|
||||||
<ColumnLink transparent to='/home' icon='home' iconComponent={HomeIcon} activeIconComponent={HomeActiveIcon} text={intl.formatMessage(messages.home)} />
|
<ColumnLink transparent to='/home' icon='home' iconComponent={HomeIcon} activeIconComponent={HomeActiveIcon} text={intl.formatMessage(messages.home)} />
|
||||||
|
@ -162,8 +161,10 @@ class NavigationPanel extends Component {
|
||||||
)}
|
)}
|
||||||
|
|
||||||
{(signedIn || timelinePreview) && (
|
{(signedIn || timelinePreview) && (
|
||||||
|
<>
|
||||||
<ColumnLink transparent to='/public/local' isActive={this.isFirehoseActive} icon='globe' iconComponent={PublicIcon} text={intl.formatMessage(messages.firehose)} />
|
<ColumnLink transparent to='/public/local' isActive={this.isFirehoseActive} icon='globe' iconComponent={PublicIcon} text={intl.formatMessage(messages.firehose)} />
|
||||||
<ColumnLink transparent to='/tags/furry' icon='pets' iconComponent={FurryIcon} text={intl.formatMessage(messages.furry)} />
|
<ColumnLink transparent to='/tags/furry' icon='pets' iconComponent={FurryIcon} text={intl.formatMessage(messages.furry)} />
|
||||||
|
</>
|
||||||
)}
|
)}
|
||||||
|
|
||||||
{!signedIn && (
|
{!signedIn && (
|
||||||
|
@ -186,8 +187,8 @@ class NavigationPanel extends Component {
|
||||||
|
|
||||||
<ColumnLink transparent href='/settings/preferences' icon='cog' iconComponent={SettingsIcon} text={intl.formatMessage(messages.preferences)} />
|
<ColumnLink transparent href='/settings/preferences' icon='cog' iconComponent={SettingsIcon} text={intl.formatMessage(messages.preferences)} />
|
||||||
|
|
||||||
{canManageReports(permissions) && <ColumnLink optional transparent href='/admin/reports' icon='flag' iconComponent={ModerationIcon} text={intl.formatMessage(messages.moderation)} />}
|
{canManageReports(permissions) && <ColumnLink transparent href='/admin/reports' icon='flag' iconComponent={ModerationIcon} text={intl.formatMessage(messages.moderation)} />}
|
||||||
{canViewAdminDashboard(permissions) && <ColumnLink optional transparent href='/admin/dashboard' icon='tachometer' iconComponent={AdministrationIcon} text={intl.formatMessage(messages.administration)} />}
|
{canViewAdminDashboard(permissions) && <ColumnLink transparent href='/admin/dashboard' icon='tachometer' iconComponent={AdministrationIcon} text={intl.formatMessage(messages.administration)} />}
|
||||||
</>
|
</>
|
||||||
)}
|
)}
|
||||||
|
|
||||||
|
@ -195,9 +196,6 @@ class NavigationPanel extends Component {
|
||||||
<hr />
|
<hr />
|
||||||
<ColumnLink transparent to='/about' icon='ellipsis-h' iconComponent={MoreHorizIcon} text={intl.formatMessage(messages.about)} />
|
<ColumnLink transparent to='/about' icon='ellipsis-h' iconComponent={MoreHorizIcon} text={intl.formatMessage(messages.about)} />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
|
||||||
|
|
||||||
<div className='flex-spacer' />
|
|
||||||
|
|
||||||
<NavigationPortal />
|
<NavigationPortal />
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -1,6 +1,17 @@
|
||||||
import PropTypes from 'prop-types';
|
import PropTypes from 'prop-types';
|
||||||
import { PureComponent } from 'react';
|
import { PureComponent } from 'react';
|
||||||
|
|
||||||
|
import { defineMessages, injectIntl } from 'react-intl';
|
||||||
|
|
||||||
|
import FullscreenExitIcon from '@/material-icons/400-24px/fullscreen_exit.svg?react';
|
||||||
|
import RectangleIcon from '@/material-icons/400-24px/rectangle.svg?react';
|
||||||
|
import { IconButton } from 'mastodon/components/icon_button';
|
||||||
|
|
||||||
|
const messages = defineMessages({
|
||||||
|
compress: { id: 'lightbox.compress', defaultMessage: 'Compress image view box' },
|
||||||
|
expand: { id: 'lightbox.expand', defaultMessage: 'Expand image view box' },
|
||||||
|
});
|
||||||
|
|
||||||
const MIN_SCALE = 1;
|
const MIN_SCALE = 1;
|
||||||
const MAX_SCALE = 4;
|
const MAX_SCALE = 4;
|
||||||
const NAV_BAR_HEIGHT = 66;
|
const NAV_BAR_HEIGHT = 66;
|
||||||
|
@ -93,7 +104,8 @@ class ZoomableImage extends PureComponent {
|
||||||
width: PropTypes.number,
|
width: PropTypes.number,
|
||||||
height: PropTypes.number,
|
height: PropTypes.number,
|
||||||
onClick: PropTypes.func,
|
onClick: PropTypes.func,
|
||||||
zoomedIn: PropTypes.bool,
|
zoomButtonHidden: PropTypes.bool,
|
||||||
|
intl: PropTypes.object.isRequired,
|
||||||
};
|
};
|
||||||
|
|
||||||
static defaultProps = {
|
static defaultProps = {
|
||||||
|
@ -119,6 +131,8 @@ class ZoomableImage extends PureComponent {
|
||||||
translateX: null,
|
translateX: null,
|
||||||
translateY: null,
|
translateY: null,
|
||||||
},
|
},
|
||||||
|
zoomState: 'expand', // 'expand' 'compress'
|
||||||
|
navigationHidden: false,
|
||||||
dragPosition: { top: 0, left: 0, x: 0, y: 0 },
|
dragPosition: { top: 0, left: 0, x: 0, y: 0 },
|
||||||
dragged: false,
|
dragged: false,
|
||||||
lockScroll: { x: 0, y: 0 },
|
lockScroll: { x: 0, y: 0 },
|
||||||
|
@ -155,20 +169,35 @@ class ZoomableImage extends PureComponent {
|
||||||
this.container.addEventListener('DOMMouseScroll', handler);
|
this.container.addEventListener('DOMMouseScroll', handler);
|
||||||
this.removers.push(() => this.container.removeEventListener('DOMMouseScroll', handler));
|
this.removers.push(() => this.container.removeEventListener('DOMMouseScroll', handler));
|
||||||
|
|
||||||
this._initZoomMatrix();
|
this.initZoomMatrix();
|
||||||
}
|
}
|
||||||
|
|
||||||
componentWillUnmount () {
|
componentWillUnmount () {
|
||||||
this._removeEventListeners();
|
this.removeEventListeners();
|
||||||
}
|
}
|
||||||
|
|
||||||
componentDidUpdate (prevProps) {
|
componentDidUpdate () {
|
||||||
if (prevProps.zoomedIn !== this.props.zoomedIn) {
|
this.setState({ zoomState: this.state.scale >= this.state.zoomMatrix.rate ? 'compress' : 'expand' });
|
||||||
this._toggleZoom();
|
|
||||||
|
if (this.state.scale === MIN_SCALE) {
|
||||||
|
this.container.style.removeProperty('cursor');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
_removeEventListeners () {
|
UNSAFE_componentWillReceiveProps () {
|
||||||
|
// reset when slide to next image
|
||||||
|
if (this.props.zoomButtonHidden) {
|
||||||
|
this.setState({
|
||||||
|
scale: MIN_SCALE,
|
||||||
|
lockTranslate: { x: 0, y: 0 },
|
||||||
|
}, () => {
|
||||||
|
this.container.scrollLeft = 0;
|
||||||
|
this.container.scrollTop = 0;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
removeEventListeners () {
|
||||||
this.removers.forEach(listeners => listeners());
|
this.removers.forEach(listeners => listeners());
|
||||||
this.removers = [];
|
this.removers = [];
|
||||||
}
|
}
|
||||||
|
@ -191,6 +220,9 @@ class ZoomableImage extends PureComponent {
|
||||||
};
|
};
|
||||||
|
|
||||||
mouseDownHandler = e => {
|
mouseDownHandler = e => {
|
||||||
|
this.container.style.cursor = 'grabbing';
|
||||||
|
this.container.style.userSelect = 'none';
|
||||||
|
|
||||||
this.setState({ dragPosition: {
|
this.setState({ dragPosition: {
|
||||||
left: this.container.scrollLeft,
|
left: this.container.scrollLeft,
|
||||||
top: this.container.scrollTop,
|
top: this.container.scrollTop,
|
||||||
|
@ -214,6 +246,9 @@ class ZoomableImage extends PureComponent {
|
||||||
};
|
};
|
||||||
|
|
||||||
mouseUpHandler = () => {
|
mouseUpHandler = () => {
|
||||||
|
this.container.style.cursor = 'grab';
|
||||||
|
this.container.style.removeProperty('user-select');
|
||||||
|
|
||||||
this.image.removeEventListener('mousemove', this.mouseMoveHandler);
|
this.image.removeEventListener('mousemove', this.mouseMoveHandler);
|
||||||
this.image.removeEventListener('mouseup', this.mouseUpHandler);
|
this.image.removeEventListener('mouseup', this.mouseUpHandler);
|
||||||
};
|
};
|
||||||
|
@ -241,13 +276,13 @@ class ZoomableImage extends PureComponent {
|
||||||
const _MAX_SCALE = Math.max(MAX_SCALE, this.state.zoomMatrix.rate);
|
const _MAX_SCALE = Math.max(MAX_SCALE, this.state.zoomMatrix.rate);
|
||||||
const scale = clamp(MIN_SCALE, _MAX_SCALE, this.state.scale * distance / this.lastDistance);
|
const scale = clamp(MIN_SCALE, _MAX_SCALE, this.state.scale * distance / this.lastDistance);
|
||||||
|
|
||||||
this._zoom(scale, midpoint);
|
this.zoom(scale, midpoint);
|
||||||
|
|
||||||
this.lastMidpoint = midpoint;
|
this.lastMidpoint = midpoint;
|
||||||
this.lastDistance = distance;
|
this.lastDistance = distance;
|
||||||
};
|
};
|
||||||
|
|
||||||
_zoom(nextScale, midpoint) {
|
zoom(nextScale, midpoint) {
|
||||||
const { scale, zoomMatrix } = this.state;
|
const { scale, zoomMatrix } = this.state;
|
||||||
const { scrollLeft, scrollTop } = this.container;
|
const { scrollLeft, scrollTop } = this.container;
|
||||||
|
|
||||||
|
@ -283,13 +318,14 @@ class ZoomableImage extends PureComponent {
|
||||||
if (dragged) return;
|
if (dragged) return;
|
||||||
const handler = this.props.onClick;
|
const handler = this.props.onClick;
|
||||||
if (handler) handler();
|
if (handler) handler();
|
||||||
|
this.setState({ navigationHidden: !this.state.navigationHidden });
|
||||||
};
|
};
|
||||||
|
|
||||||
handleMouseDown = e => {
|
handleMouseDown = e => {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
};
|
};
|
||||||
|
|
||||||
_initZoomMatrix = () => {
|
initZoomMatrix = () => {
|
||||||
const { width, height } = this.props;
|
const { width, height } = this.props;
|
||||||
const { clientWidth, clientHeight } = this.container;
|
const { clientWidth, clientHeight } = this.container;
|
||||||
const { offsetWidth, offsetHeight } = this.image;
|
const { offsetWidth, offsetHeight } = this.image;
|
||||||
|
@ -321,7 +357,10 @@ class ZoomableImage extends PureComponent {
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
_toggleZoom () {
|
handleZoomClick = e => {
|
||||||
|
e.preventDefault();
|
||||||
|
e.stopPropagation();
|
||||||
|
|
||||||
const { scale, zoomMatrix } = this.state;
|
const { scale, zoomMatrix } = this.state;
|
||||||
|
|
||||||
if ( scale >= zoomMatrix.rate ) {
|
if ( scale >= zoomMatrix.rate ) {
|
||||||
|
@ -355,7 +394,10 @@ class ZoomableImage extends PureComponent {
|
||||||
this.container.scrollTop = zoomMatrix.scrollTop;
|
this.container.scrollTop = zoomMatrix.scrollTop;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
this.container.style.cursor = 'grab';
|
||||||
|
this.container.style.removeProperty('user-select');
|
||||||
|
};
|
||||||
|
|
||||||
setContainerRef = c => {
|
setContainerRef = c => {
|
||||||
this.container = c;
|
this.container = c;
|
||||||
|
@ -366,16 +408,29 @@ class ZoomableImage extends PureComponent {
|
||||||
};
|
};
|
||||||
|
|
||||||
render () {
|
render () {
|
||||||
const { alt, lang, src, width, height } = this.props;
|
const { alt, lang, src, width, height, intl } = this.props;
|
||||||
const { scale, lockTranslate, dragged } = this.state;
|
const { scale, lockTranslate } = this.state;
|
||||||
const overflow = scale === MIN_SCALE ? 'hidden' : 'scroll';
|
const overflow = scale === MIN_SCALE ? 'hidden' : 'scroll';
|
||||||
const cursor = scale === MIN_SCALE ? null : (dragged ? 'grabbing' : 'grab');
|
const zoomButtonShouldHide = this.state.navigationHidden || this.props.zoomButtonHidden || this.state.zoomMatrix.rate <= MIN_SCALE ? 'media-modal__zoom-button--hidden' : '';
|
||||||
|
const zoomButtonTitle = this.state.zoomState === 'compress' ? intl.formatMessage(messages.compress) : intl.formatMessage(messages.expand);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
|
<>
|
||||||
|
<IconButton
|
||||||
|
className={`media-modal__zoom-button ${zoomButtonShouldHide}`}
|
||||||
|
title={zoomButtonTitle}
|
||||||
|
icon={this.state.zoomState}
|
||||||
|
iconComponent={this.state.zoomState === 'compress' ? FullscreenExitIcon : RectangleIcon}
|
||||||
|
onClick={this.handleZoomClick}
|
||||||
|
size={40}
|
||||||
|
style={{
|
||||||
|
fontSize: '30px', /* Fontawesome's fa-compress fa-expand is larger than fa-close */
|
||||||
|
}}
|
||||||
|
/>
|
||||||
<div
|
<div
|
||||||
className='zoomable-image'
|
className='zoomable-image'
|
||||||
ref={this.setContainerRef}
|
ref={this.setContainerRef}
|
||||||
style={{ overflow, cursor, userSelect: 'none' }}
|
style={{ overflow }}
|
||||||
>
|
>
|
||||||
<img
|
<img
|
||||||
role='presentation'
|
role='presentation'
|
||||||
|
@ -395,8 +450,10 @@ class ZoomableImage extends PureComponent {
|
||||||
onMouseDown={this.handleMouseDown}
|
onMouseDown={this.handleMouseDown}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
</>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export default ZoomableImage;
|
export default injectIntl(ZoomableImage);
|
||||||
|
|
|
@ -186,7 +186,7 @@ class SwitchingColumnsArea extends PureComponent {
|
||||||
{redirect}
|
{redirect}
|
||||||
|
|
||||||
{singleColumn ? <Redirect from='/deck' to='/home' exact /> : null}
|
{singleColumn ? <Redirect from='/deck' to='/home' exact /> : null}
|
||||||
{singleColumn && pathName.startsWith('/deck/') ? <Redirect from={pathName} to={{...this.props.location, pathname: pathName.slice(5)}} /> : null}
|
{singleColumn && pathName.startsWith('/deck/') ? <Redirect from={pathName} to={pathName.slice(5)} /> : null}
|
||||||
{/* Redirect old bookmarks (without /deck) with home-like routes to the advanced interface */}
|
{/* Redirect old bookmarks (without /deck) with home-like routes to the advanced interface */}
|
||||||
{!singleColumn && pathName === '/getting-started' ? <Redirect from='/getting-started' to='/deck/getting-started' exact /> : null}
|
{!singleColumn && pathName === '/getting-started' ? <Redirect from='/getting-started' to='/deck/getting-started' exact /> : null}
|
||||||
{!singleColumn && pathName === '/home' ? <Redirect from='/home' to='/deck/getting-started' exact /> : null}
|
{!singleColumn && pathName === '/home' ? <Redirect from='/home' to='/deck/getting-started' exact /> : null}
|
||||||
|
|
|
@ -43,6 +43,7 @@
|
||||||
* @property {boolean=} use_pending_items
|
* @property {boolean=} use_pending_items
|
||||||
* @property {string} version
|
* @property {string} version
|
||||||
* @property {string} sso_redirect
|
* @property {string} sso_redirect
|
||||||
|
* @property {boolean} force_grouped_notifications
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -118,6 +119,7 @@ export const criticalUpdatesPending = initialState?.critical_updates_pending;
|
||||||
// @ts-expect-error
|
// @ts-expect-error
|
||||||
export const statusPageUrl = getMeta('status_page_url');
|
export const statusPageUrl = getMeta('status_page_url');
|
||||||
export const sso_redirect = getMeta('sso_redirect');
|
export const sso_redirect = getMeta('sso_redirect');
|
||||||
|
export const forceGroupedNotifications = getMeta('force_grouped_notifications');
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @returns {string | undefined}
|
* @returns {string | undefined}
|
||||||
|
|
|
@ -288,6 +288,8 @@
|
||||||
"keyboard_shortcuts.unfocus": "Retirar lo foco d'a caixa de redacción/busqueda",
|
"keyboard_shortcuts.unfocus": "Retirar lo foco d'a caixa de redacción/busqueda",
|
||||||
"keyboard_shortcuts.up": "Ir enta alto en a lista",
|
"keyboard_shortcuts.up": "Ir enta alto en a lista",
|
||||||
"lightbox.close": "Zarrar",
|
"lightbox.close": "Zarrar",
|
||||||
|
"lightbox.compress": "Comprimir quadro de visualización d'imachen",
|
||||||
|
"lightbox.expand": "Expandir quadro de visualización d'imachen",
|
||||||
"lightbox.next": "Siguient",
|
"lightbox.next": "Siguient",
|
||||||
"lightbox.previous": "Anterior",
|
"lightbox.previous": "Anterior",
|
||||||
"limited_account_hint.action": "Amostrar perfil de totz modos",
|
"limited_account_hint.action": "Amostrar perfil de totz modos",
|
||||||
|
|
|
@ -36,7 +36,6 @@
|
||||||
"account.followers.empty": "لا أحدَ يُتابع هذا المُستخدم إلى حد الآن.",
|
"account.followers.empty": "لا أحدَ يُتابع هذا المُستخدم إلى حد الآن.",
|
||||||
"account.followers_counter": "{count, plural, zero{لا مُتابع} one {مُتابعٌ واحِد} two {مُتابعانِ اِثنان} few {{counter} مُتابِعين} many {{counter} مُتابِعًا} other {{counter} مُتابع}}",
|
"account.followers_counter": "{count, plural, zero{لا مُتابع} one {مُتابعٌ واحِد} two {مُتابعانِ اِثنان} few {{counter} مُتابِعين} many {{counter} مُتابِعًا} other {{counter} مُتابع}}",
|
||||||
"account.following": "الاشتراكات",
|
"account.following": "الاشتراكات",
|
||||||
"account.following_counter": "{count, plural, zero{لا يُتابِع أحدًا} one {يُتابِعُ واحد} two{يُتابِعُ اِثنان} few{يُتابِعُ {counter}} many{يُتابِعُ {counter}} other {يُتابِعُ {counter}}}",
|
|
||||||
"account.follows.empty": "لا يُتابع هذا المُستخدمُ أيَّ أحدٍ حتى الآن.",
|
"account.follows.empty": "لا يُتابع هذا المُستخدمُ أيَّ أحدٍ حتى الآن.",
|
||||||
"account.go_to_profile": "اذهب إلى الملف الشخصي",
|
"account.go_to_profile": "اذهب إلى الملف الشخصي",
|
||||||
"account.hide_reblogs": "إخفاء المعاد نشرها مِن @{name}",
|
"account.hide_reblogs": "إخفاء المعاد نشرها مِن @{name}",
|
||||||
|
@ -220,6 +219,7 @@
|
||||||
"domain_block_modal.they_cant_follow": "لا أحد من هذا الخادم يمكنه متابعتك.",
|
"domain_block_modal.they_cant_follow": "لا أحد من هذا الخادم يمكنه متابعتك.",
|
||||||
"domain_block_modal.they_wont_know": "لن يَعرف أنه قد تم حظره.",
|
"domain_block_modal.they_wont_know": "لن يَعرف أنه قد تم حظره.",
|
||||||
"domain_block_modal.title": "أتريد حظر النطاق؟",
|
"domain_block_modal.title": "أتريد حظر النطاق؟",
|
||||||
|
"domain_block_modal.you_will_lose_followers": "سيتم إزالة جميع متابعيك من هذا الخادم.",
|
||||||
"domain_block_modal.you_wont_see_posts": "لن ترى منشورات أو إشعارات من المستخدمين على هذا الخادم.",
|
"domain_block_modal.you_wont_see_posts": "لن ترى منشورات أو إشعارات من المستخدمين على هذا الخادم.",
|
||||||
"domain_pill.activitypub_lets_connect": "يتيح لك التواصل والتفاعل مع الناس ليس فقط على ماستدون، ولكن عبر تطبيقات اجتماعية مختلفة أيضا.",
|
"domain_pill.activitypub_lets_connect": "يتيح لك التواصل والتفاعل مع الناس ليس فقط على ماستدون، ولكن عبر تطبيقات اجتماعية مختلفة أيضا.",
|
||||||
"domain_pill.activitypub_like_language": "إنّ ActivityPub مثل لغة ماستدون التي يتحدث بها مع شبكات اجتماعية أخرى.",
|
"domain_pill.activitypub_like_language": "إنّ ActivityPub مثل لغة ماستدون التي يتحدث بها مع شبكات اجتماعية أخرى.",
|
||||||
|
@ -309,7 +309,7 @@
|
||||||
"follow_request.authorize": "ترخيص",
|
"follow_request.authorize": "ترخيص",
|
||||||
"follow_request.reject": "رفض",
|
"follow_request.reject": "رفض",
|
||||||
"follow_requests.unlocked_explanation": "حتى وإن كان حسابك غير مقفل، يعتقد فريق {domain} أنك قد ترغب في مراجعة طلبات المتابعة من هذه الحسابات يدوياً.",
|
"follow_requests.unlocked_explanation": "حتى وإن كان حسابك غير مقفل، يعتقد فريق {domain} أنك قد ترغب في مراجعة طلبات المتابعة من هذه الحسابات يدوياً.",
|
||||||
"follow_suggestions.curated_suggestion": "انتقاه الفريق",
|
"follow_suggestions.curated_suggestion": "اختيار الموظفين",
|
||||||
"follow_suggestions.dismiss": "لا تُظهرها مجدّدًا",
|
"follow_suggestions.dismiss": "لا تُظهرها مجدّدًا",
|
||||||
"follow_suggestions.featured_longer": "مختار يدوياً من قِبل فريق {domain}",
|
"follow_suggestions.featured_longer": "مختار يدوياً من قِبل فريق {domain}",
|
||||||
"follow_suggestions.friends_of_friends_longer": "مشهور بين الأشخاص الذين تتابعهم",
|
"follow_suggestions.friends_of_friends_longer": "مشهور بين الأشخاص الذين تتابعهم",
|
||||||
|
@ -419,6 +419,8 @@
|
||||||
"keyboard_shortcuts.unfocus": "لإلغاء التركيز على حقل النص أو نافذة البحث",
|
"keyboard_shortcuts.unfocus": "لإلغاء التركيز على حقل النص أو نافذة البحث",
|
||||||
"keyboard_shortcuts.up": "للانتقال إلى أعلى القائمة",
|
"keyboard_shortcuts.up": "للانتقال إلى أعلى القائمة",
|
||||||
"lightbox.close": "إغلاق",
|
"lightbox.close": "إغلاق",
|
||||||
|
"lightbox.compress": "ضغط مربع عرض الصورة",
|
||||||
|
"lightbox.expand": "توسيع مربع عرض الصور",
|
||||||
"lightbox.next": "التالي",
|
"lightbox.next": "التالي",
|
||||||
"lightbox.previous": "العودة",
|
"lightbox.previous": "العودة",
|
||||||
"limited_account_hint.action": "إظهار الملف التعريفي على أي حال",
|
"limited_account_hint.action": "إظهار الملف التعريفي على أي حال",
|
||||||
|
@ -526,6 +528,8 @@
|
||||||
"notifications.column_settings.admin.report": "التبليغات الجديدة:",
|
"notifications.column_settings.admin.report": "التبليغات الجديدة:",
|
||||||
"notifications.column_settings.admin.sign_up": "التسجيلات الجديدة:",
|
"notifications.column_settings.admin.sign_up": "التسجيلات الجديدة:",
|
||||||
"notifications.column_settings.alert": "إشعارات سطح المكتب",
|
"notifications.column_settings.alert": "إشعارات سطح المكتب",
|
||||||
|
"notifications.column_settings.beta.category": "ميزات تجريبية",
|
||||||
|
"notifications.column_settings.beta.grouping": "جمّع الإشعارات",
|
||||||
"notifications.column_settings.favourite": "المفضلة:",
|
"notifications.column_settings.favourite": "المفضلة:",
|
||||||
"notifications.column_settings.filter_bar.advanced": "عرض جميع الفئات",
|
"notifications.column_settings.filter_bar.advanced": "عرض جميع الفئات",
|
||||||
"notifications.column_settings.filter_bar.category": "شريط التصفية السريعة",
|
"notifications.column_settings.filter_bar.category": "شريط التصفية السريعة",
|
||||||
|
@ -750,7 +754,7 @@
|
||||||
"status.edit": "تعديل",
|
"status.edit": "تعديل",
|
||||||
"status.edited": "آخر تعديل يوم {date}",
|
"status.edited": "آخر تعديل يوم {date}",
|
||||||
"status.edited_x_times": "عُدّل {count, plural, zero {} one {مرةً واحدة} two {مرّتان} few {{count} مرات} many {{count} مرة} other {{count} مرة}}",
|
"status.edited_x_times": "عُدّل {count, plural, zero {} one {مرةً واحدة} two {مرّتان} few {{count} مرات} many {{count} مرة} other {{count} مرة}}",
|
||||||
"status.embed": "الحصول على شيفرة الدمج",
|
"status.embed": "الحصول على شفرة الإدماج",
|
||||||
"status.favourite": "فضّل",
|
"status.favourite": "فضّل",
|
||||||
"status.favourites": "{count, plural, zero {}one {مفضلة واحدة} two {مفضلتان} few {# مفضلات} many {# مفضلات} other {# مفضلات}}",
|
"status.favourites": "{count, plural, zero {}one {مفضلة واحدة} two {مفضلتان} few {# مفضلات} many {# مفضلات} other {# مفضلات}}",
|
||||||
"status.filter": "تصفية هذا المنشور",
|
"status.filter": "تصفية هذا المنشور",
|
||||||
|
@ -771,7 +775,7 @@
|
||||||
"status.reblog": "إعادة النشر",
|
"status.reblog": "إعادة النشر",
|
||||||
"status.reblog_private": "إعادة النشر إلى الجمهور الأصلي",
|
"status.reblog_private": "إعادة النشر إلى الجمهور الأصلي",
|
||||||
"status.reblogged_by": "شارَكَه {name}",
|
"status.reblogged_by": "شارَكَه {name}",
|
||||||
"status.reblogs": "{count, plural, one {إعادة نشر واحدة} two {معاد نشرها مرتان} few {# إعادات نشر} many {# إعادات نشر} other {# إعادة نشر}}",
|
"status.reblogs": "{count, plural, one {تعزيز واحد} two {تعزيزتان} few {# تعزيزات} many {# تعزيزات} other {# تعزيزات}}",
|
||||||
"status.reblogs.empty": "لم يقم أي أحد بمشاركة هذا المنشور بعد. عندما يقوم أحدهم بذلك سوف يظهر هنا.",
|
"status.reblogs.empty": "لم يقم أي أحد بمشاركة هذا المنشور بعد. عندما يقوم أحدهم بذلك سوف يظهر هنا.",
|
||||||
"status.redraft": "إزالة وإعادة الصياغة",
|
"status.redraft": "إزالة وإعادة الصياغة",
|
||||||
"status.remove_bookmark": "احذفه مِن الفواصل المرجعية",
|
"status.remove_bookmark": "احذفه مِن الفواصل المرجعية",
|
||||||
|
|
|
@ -297,6 +297,7 @@
|
||||||
"notifications.clear": "Borrar los avisos",
|
"notifications.clear": "Borrar los avisos",
|
||||||
"notifications.column_settings.admin.report": "Informes nuevos:",
|
"notifications.column_settings.admin.report": "Informes nuevos:",
|
||||||
"notifications.column_settings.admin.sign_up": "Rexistros nuevos:",
|
"notifications.column_settings.admin.sign_up": "Rexistros nuevos:",
|
||||||
|
"notifications.column_settings.beta.category": "Funciones esperimentales",
|
||||||
"notifications.column_settings.follow": "Siguidores nuevos:",
|
"notifications.column_settings.follow": "Siguidores nuevos:",
|
||||||
"notifications.column_settings.follow_request": "Solicitúes de siguimientu nueves:",
|
"notifications.column_settings.follow_request": "Solicitúes de siguimientu nueves:",
|
||||||
"notifications.column_settings.mention": "Menciones:",
|
"notifications.column_settings.mention": "Menciones:",
|
||||||
|
|
|
@ -219,6 +219,7 @@
|
||||||
"domain_block_modal.they_cant_follow": "Ніхто з гэтага сервера не зможа падпісацца на вас.",
|
"domain_block_modal.they_cant_follow": "Ніхто з гэтага сервера не зможа падпісацца на вас.",
|
||||||
"domain_block_modal.they_wont_know": "Карыстальнік не будзе ведаць пра блакіроўку.",
|
"domain_block_modal.they_wont_know": "Карыстальнік не будзе ведаць пра блакіроўку.",
|
||||||
"domain_block_modal.title": "Заблакіраваць дамен?",
|
"domain_block_modal.title": "Заблакіраваць дамен?",
|
||||||
|
"domain_block_modal.you_will_lose_followers": "Усе падпісчыкі з гэтага сервера будуць выдаленыя.",
|
||||||
"domain_block_modal.you_wont_see_posts": "Вы не ўбачыце допісаў і апавяшчэнняў ад карыстальнікаў з гэтага сервера.",
|
"domain_block_modal.you_wont_see_posts": "Вы не ўбачыце допісаў і апавяшчэнняў ад карыстальнікаў з гэтага сервера.",
|
||||||
"domain_pill.activitypub_lets_connect": "Ён дазваляе вам узаемадзейнічаць не толькі з карыстальнікамі Mastodon, але і розных іншых сацыяльных платформ.",
|
"domain_pill.activitypub_lets_connect": "Ён дазваляе вам узаемадзейнічаць не толькі з карыстальнікамі Mastodon, але і розных іншых сацыяльных платформ.",
|
||||||
"domain_pill.activitypub_like_language": "ActivityPub — гэта мова, на якой Mastodon размаўляе з іншымі сацыяльнымі сеткамі.",
|
"domain_pill.activitypub_like_language": "ActivityPub — гэта мова, на якой Mastodon размаўляе з іншымі сацыяльнымі сеткамі.",
|
||||||
|
@ -411,6 +412,8 @@
|
||||||
"keyboard_shortcuts.unfocus": "Расфакусаваць тэкставую вобласць/пошукавы радок",
|
"keyboard_shortcuts.unfocus": "Расфакусаваць тэкставую вобласць/пошукавы радок",
|
||||||
"keyboard_shortcuts.up": "Перамясціцца ўверх па спісе",
|
"keyboard_shortcuts.up": "Перамясціцца ўверх па спісе",
|
||||||
"lightbox.close": "Закрыць",
|
"lightbox.close": "Закрыць",
|
||||||
|
"lightbox.compress": "Сціснуць бачную вобласць выявы",
|
||||||
|
"lightbox.expand": "Павялічыць бачную вобласць выявы",
|
||||||
"lightbox.next": "Далей",
|
"lightbox.next": "Далей",
|
||||||
"lightbox.previous": "Назад",
|
"lightbox.previous": "Назад",
|
||||||
"limited_account_hint.action": "Усе роўна паказваць профіль",
|
"limited_account_hint.action": "Усе роўна паказваць профіль",
|
||||||
|
@ -520,6 +523,8 @@
|
||||||
"notifications.column_settings.admin.report": "Новыя скаргі:",
|
"notifications.column_settings.admin.report": "Новыя скаргі:",
|
||||||
"notifications.column_settings.admin.sign_up": "Новыя ўваходы:",
|
"notifications.column_settings.admin.sign_up": "Новыя ўваходы:",
|
||||||
"notifications.column_settings.alert": "Апавяшчэнні на працоўным стале",
|
"notifications.column_settings.alert": "Апавяшчэнні на працоўным стале",
|
||||||
|
"notifications.column_settings.beta.category": "Эксперыментальныя функцыі",
|
||||||
|
"notifications.column_settings.beta.grouping": "Групаваць апавяшчэннi",
|
||||||
"notifications.column_settings.favourite": "Упадабанае:",
|
"notifications.column_settings.favourite": "Упадабанае:",
|
||||||
"notifications.column_settings.filter_bar.advanced": "Паказаць усе катэгорыі",
|
"notifications.column_settings.filter_bar.advanced": "Паказаць усе катэгорыі",
|
||||||
"notifications.column_settings.filter_bar.category": "Панэль хуткай фільтрацыі",
|
"notifications.column_settings.filter_bar.category": "Панэль хуткай фільтрацыі",
|
||||||
|
|
|
@ -220,6 +220,7 @@
|
||||||
"domain_block_modal.they_cant_follow": "Никого от този сървър не може да ви последва.",
|
"domain_block_modal.they_cant_follow": "Никого от този сървър не може да ви последва.",
|
||||||
"domain_block_modal.they_wont_know": "Няма да узнаят, че са били блокирани.",
|
"domain_block_modal.they_wont_know": "Няма да узнаят, че са били блокирани.",
|
||||||
"domain_block_modal.title": "Блокирате ли домейн?",
|
"domain_block_modal.title": "Блокирате ли домейн?",
|
||||||
|
"domain_block_modal.you_will_lose_followers": "Всичките ви последователи от този сървър ще се премахнат.",
|
||||||
"domain_block_modal.you_wont_see_posts": "Няма да виждате публикации или известия от потребителите на този сървър.",
|
"domain_block_modal.you_wont_see_posts": "Няма да виждате публикации или известия от потребителите на този сървър.",
|
||||||
"domain_pill.activitypub_lets_connect": "Позволява ви да се свързвате и взаимодействате с хора не само в Mastodon, но и през различни социални приложения.",
|
"domain_pill.activitypub_lets_connect": "Позволява ви да се свързвате и взаимодействате с хора не само в Mastodon, но и през различни социални приложения.",
|
||||||
"domain_pill.activitypub_like_language": "ActivityPub е като език на Mastodon, говорещ с други социални мрежи.",
|
"domain_pill.activitypub_like_language": "ActivityPub е като език на Mastodon, говорещ с други социални мрежи.",
|
||||||
|
@ -418,6 +419,8 @@
|
||||||
"keyboard_shortcuts.unfocus": "Разфокусиране на текстовото поле за съставяне/търсене",
|
"keyboard_shortcuts.unfocus": "Разфокусиране на текстовото поле за съставяне/търсене",
|
||||||
"keyboard_shortcuts.up": "Преместване нагоре в списъка",
|
"keyboard_shortcuts.up": "Преместване нагоре в списъка",
|
||||||
"lightbox.close": "Затваряне",
|
"lightbox.close": "Затваряне",
|
||||||
|
"lightbox.compress": "Свиване на полето за преглед на образи",
|
||||||
|
"lightbox.expand": "Разгъване на полето за преглед на образи",
|
||||||
"lightbox.next": "Напред",
|
"lightbox.next": "Напред",
|
||||||
"lightbox.previous": "Назад",
|
"lightbox.previous": "Назад",
|
||||||
"limited_account_hint.action": "Показване на профила въпреки това",
|
"limited_account_hint.action": "Показване на профила въпреки това",
|
||||||
|
@ -537,6 +540,8 @@
|
||||||
"notifications.column_settings.admin.report": "Нови доклади:",
|
"notifications.column_settings.admin.report": "Нови доклади:",
|
||||||
"notifications.column_settings.admin.sign_up": "Нови регистрации:",
|
"notifications.column_settings.admin.sign_up": "Нови регистрации:",
|
||||||
"notifications.column_settings.alert": "Известия на работния плот",
|
"notifications.column_settings.alert": "Известия на работния плот",
|
||||||
|
"notifications.column_settings.beta.category": "Експериментални функции",
|
||||||
|
"notifications.column_settings.beta.grouping": "Групови известия",
|
||||||
"notifications.column_settings.favourite": "Любими:",
|
"notifications.column_settings.favourite": "Любими:",
|
||||||
"notifications.column_settings.filter_bar.advanced": "Показване на всички категории",
|
"notifications.column_settings.filter_bar.advanced": "Показване на всички категории",
|
||||||
"notifications.column_settings.filter_bar.category": "Лента за бърз филтър",
|
"notifications.column_settings.filter_bar.category": "Лента за бърз филтър",
|
||||||
|
|
|
@ -338,6 +338,8 @@
|
||||||
"keyboard_shortcuts.unfocus": "Difokus an dachenn testenn/klask",
|
"keyboard_shortcuts.unfocus": "Difokus an dachenn testenn/klask",
|
||||||
"keyboard_shortcuts.up": "Pignat er roll",
|
"keyboard_shortcuts.up": "Pignat er roll",
|
||||||
"lightbox.close": "Serriñ",
|
"lightbox.close": "Serriñ",
|
||||||
|
"lightbox.compress": "Bihanaat boest hewel ar skeudenn",
|
||||||
|
"lightbox.expand": "Ledanaat boest hewel ar skeudenn",
|
||||||
"lightbox.next": "Da-heul",
|
"lightbox.next": "Da-heul",
|
||||||
"lightbox.previous": "A-raok",
|
"lightbox.previous": "A-raok",
|
||||||
"limited_account_hint.action": "Diskouez an aelad memes tra",
|
"limited_account_hint.action": "Diskouez an aelad memes tra",
|
||||||
|
|
|
@ -221,7 +221,7 @@
|
||||||
"domain_block_modal.they_cant_follow": "Ningú d'aquest servidor us pot seguir.",
|
"domain_block_modal.they_cant_follow": "Ningú d'aquest servidor us pot seguir.",
|
||||||
"domain_block_modal.they_wont_know": "No sabran que són blocats.",
|
"domain_block_modal.they_wont_know": "No sabran que són blocats.",
|
||||||
"domain_block_modal.title": "Bloquem el domini?",
|
"domain_block_modal.title": "Bloquem el domini?",
|
||||||
"domain_block_modal.you_will_lose_num_followers": "Perdreu {followersCount, plural, one {{followersCountDisplay} seguidor} other {{followersCountDisplay} seguidors}} i {followingCount, plural, one {{followingCountDisplay} persona} other {{followingCountDisplay} persones}} que seguiu.",
|
"domain_block_modal.you_will_lose_followers": "S'eliminaran tots els vostres seguidors d'aquest servidor.",
|
||||||
"domain_block_modal.you_wont_see_posts": "No veureu ni les publicacions ni les notificacions dels usuaris d'aquest servidor.",
|
"domain_block_modal.you_wont_see_posts": "No veureu ni les publicacions ni les notificacions dels usuaris d'aquest servidor.",
|
||||||
"domain_pill.activitypub_lets_connect": "Us permet connectar i interactuar amb persones a Mastodon i també a d'altres apps socials.",
|
"domain_pill.activitypub_lets_connect": "Us permet connectar i interactuar amb persones a Mastodon i també a d'altres apps socials.",
|
||||||
"domain_pill.activitypub_like_language": "ActivityPub és el llenguatge que Mastodon parla amb altres xarxes socials.",
|
"domain_pill.activitypub_like_language": "ActivityPub és el llenguatge que Mastodon parla amb altres xarxes socials.",
|
||||||
|
@ -432,10 +432,10 @@
|
||||||
"keyboard_shortcuts.unfocus": "Descentra l'àrea de composició de text/cerca",
|
"keyboard_shortcuts.unfocus": "Descentra l'àrea de composició de text/cerca",
|
||||||
"keyboard_shortcuts.up": "Apuja a la llista",
|
"keyboard_shortcuts.up": "Apuja a la llista",
|
||||||
"lightbox.close": "Tanca",
|
"lightbox.close": "Tanca",
|
||||||
|
"lightbox.compress": "Comprimeix el quadre de visualització d’imatge",
|
||||||
|
"lightbox.expand": "Amplia el quadre de visualització d’imatge",
|
||||||
"lightbox.next": "Següent",
|
"lightbox.next": "Següent",
|
||||||
"lightbox.previous": "Anterior",
|
"lightbox.previous": "Anterior",
|
||||||
"lightbox.zoom_in": "Amplia fins a la mida real",
|
|
||||||
"lightbox.zoom_out": "Amplia fins a encabir",
|
|
||||||
"limited_account_hint.action": "Mostra el perfil de totes maneres",
|
"limited_account_hint.action": "Mostra el perfil de totes maneres",
|
||||||
"limited_account_hint.title": "Aquest perfil l'han amagat els moderadors de {domain}.",
|
"limited_account_hint.title": "Aquest perfil l'han amagat els moderadors de {domain}.",
|
||||||
"link_preview.author": "Per {name}",
|
"link_preview.author": "Per {name}",
|
||||||
|
@ -559,6 +559,8 @@
|
||||||
"notifications.column_settings.admin.report": "Nous informes:",
|
"notifications.column_settings.admin.report": "Nous informes:",
|
||||||
"notifications.column_settings.admin.sign_up": "Registres nous:",
|
"notifications.column_settings.admin.sign_up": "Registres nous:",
|
||||||
"notifications.column_settings.alert": "Notificacions d'escriptori",
|
"notifications.column_settings.alert": "Notificacions d'escriptori",
|
||||||
|
"notifications.column_settings.beta.category": "Característiques experimentals",
|
||||||
|
"notifications.column_settings.beta.grouping": "Notificacions de grup",
|
||||||
"notifications.column_settings.favourite": "Favorits:",
|
"notifications.column_settings.favourite": "Favorits:",
|
||||||
"notifications.column_settings.filter_bar.advanced": "Mostra totes les categories",
|
"notifications.column_settings.filter_bar.advanced": "Mostra totes les categories",
|
||||||
"notifications.column_settings.filter_bar.category": "Barra ràpida de filtres",
|
"notifications.column_settings.filter_bar.category": "Barra ràpida de filtres",
|
||||||
|
@ -787,7 +789,6 @@
|
||||||
"status.edit": "Edita",
|
"status.edit": "Edita",
|
||||||
"status.edited": "Darrera edició {date}",
|
"status.edited": "Darrera edició {date}",
|
||||||
"status.edited_x_times": "Editat {count, plural, one {{count} vegada} other {{count} vegades}}",
|
"status.edited_x_times": "Editat {count, plural, one {{count} vegada} other {{count} vegades}}",
|
||||||
"status.embed": "Obté el codi encastat",
|
|
||||||
"status.favourite": "Favorit",
|
"status.favourite": "Favorit",
|
||||||
"status.favourites": "{count, plural, one {favorit} other {favorits}}",
|
"status.favourites": "{count, plural, one {favorit} other {favorits}}",
|
||||||
"status.filter": "Filtra aquest tut",
|
"status.filter": "Filtra aquest tut",
|
||||||
|
|
|
@ -335,6 +335,8 @@
|
||||||
"keyboard_shortcuts.unfocus": "بۆ دروستکردنی ناوچەی دەق/گەڕان",
|
"keyboard_shortcuts.unfocus": "بۆ دروستکردنی ناوچەی دەق/گەڕان",
|
||||||
"keyboard_shortcuts.up": "بۆ ئەوەی لە لیستەکەدا بڕۆیت",
|
"keyboard_shortcuts.up": "بۆ ئەوەی لە لیستەکەدا بڕۆیت",
|
||||||
"lightbox.close": "دابخە",
|
"lightbox.close": "دابخە",
|
||||||
|
"lightbox.compress": "سندوقی نیشاندانی وێنە بپەستێنە",
|
||||||
|
"lightbox.expand": "فراوانکردنی سندوقی بینینی وێنە",
|
||||||
"lightbox.next": "داهاتوو",
|
"lightbox.next": "داهاتوو",
|
||||||
"lightbox.previous": "پێشوو",
|
"lightbox.previous": "پێشوو",
|
||||||
"limited_account_hint.action": "بەهەر حاڵ پڕۆفایلی پیشان بدە",
|
"limited_account_hint.action": "بەهەر حاڵ پڕۆفایلی پیشان بدە",
|
||||||
|
|
|
@ -196,6 +196,8 @@
|
||||||
"keyboard_shortcuts.unfocus": "ùn fucalizà più l'area di testu",
|
"keyboard_shortcuts.unfocus": "ùn fucalizà più l'area di testu",
|
||||||
"keyboard_shortcuts.up": "cullà indè a lista",
|
"keyboard_shortcuts.up": "cullà indè a lista",
|
||||||
"lightbox.close": "Chjudà",
|
"lightbox.close": "Chjudà",
|
||||||
|
"lightbox.compress": "Cumprime a finestra d'affissera di i ritratti",
|
||||||
|
"lightbox.expand": "Ingrandà a finestra d'affissera di i ritratti",
|
||||||
"lightbox.next": "Siguente",
|
"lightbox.next": "Siguente",
|
||||||
"lightbox.previous": "Pricidente",
|
"lightbox.previous": "Pricidente",
|
||||||
"lists.account.add": "Aghjunghje à a lista",
|
"lists.account.add": "Aghjunghje à a lista",
|
||||||
|
|
|
@ -220,6 +220,7 @@
|
||||||
"domain_block_modal.they_cant_follow": "Nikdo z tohoto serveru vás nemůže sledovat.",
|
"domain_block_modal.they_cant_follow": "Nikdo z tohoto serveru vás nemůže sledovat.",
|
||||||
"domain_block_modal.they_wont_know": "Nebude vědět, že je zablokován*a.",
|
"domain_block_modal.they_wont_know": "Nebude vědět, že je zablokován*a.",
|
||||||
"domain_block_modal.title": "Blokovat doménu?",
|
"domain_block_modal.title": "Blokovat doménu?",
|
||||||
|
"domain_block_modal.you_will_lose_followers": "Všichni vaši sledující z tohoto serveru budou odstraněni.",
|
||||||
"domain_block_modal.you_wont_see_posts": "Neuvidíte příspěvky ani upozornění od uživatelů z tohoto serveru.",
|
"domain_block_modal.you_wont_see_posts": "Neuvidíte příspěvky ani upozornění od uživatelů z tohoto serveru.",
|
||||||
"domain_pill.activitypub_lets_connect": "Umožňuje vám spojit se a komunikovat s lidmi nejen na Mastodonu, ale i s dalšími sociálními aplikacemi.",
|
"domain_pill.activitypub_lets_connect": "Umožňuje vám spojit se a komunikovat s lidmi nejen na Mastodonu, ale i s dalšími sociálními aplikacemi.",
|
||||||
"domain_pill.activitypub_like_language": "ActivityPub je jako jazyk, kterým Mastodon mluví s jinými sociálními sítěmi.",
|
"domain_pill.activitypub_like_language": "ActivityPub je jako jazyk, kterým Mastodon mluví s jinými sociálními sítěmi.",
|
||||||
|
@ -409,6 +410,8 @@
|
||||||
"keyboard_shortcuts.unfocus": "Zrušit zaměření na nový příspěvek/hledání",
|
"keyboard_shortcuts.unfocus": "Zrušit zaměření na nový příspěvek/hledání",
|
||||||
"keyboard_shortcuts.up": "Posunout v seznamu nahoru",
|
"keyboard_shortcuts.up": "Posunout v seznamu nahoru",
|
||||||
"lightbox.close": "Zavřít",
|
"lightbox.close": "Zavřít",
|
||||||
|
"lightbox.compress": "Sbalit pole zobrazení obrázku",
|
||||||
|
"lightbox.expand": "Rozbalit pole zobrazení obrázku",
|
||||||
"lightbox.next": "Další",
|
"lightbox.next": "Další",
|
||||||
"lightbox.previous": "Předchozí",
|
"lightbox.previous": "Předchozí",
|
||||||
"limited_account_hint.action": "Přesto profil zobrazit",
|
"limited_account_hint.action": "Přesto profil zobrazit",
|
||||||
|
@ -506,6 +509,8 @@
|
||||||
"notifications.column_settings.admin.report": "Nová hlášení:",
|
"notifications.column_settings.admin.report": "Nová hlášení:",
|
||||||
"notifications.column_settings.admin.sign_up": "Nové registrace:",
|
"notifications.column_settings.admin.sign_up": "Nové registrace:",
|
||||||
"notifications.column_settings.alert": "Oznámení na počítači",
|
"notifications.column_settings.alert": "Oznámení na počítači",
|
||||||
|
"notifications.column_settings.beta.category": "Experimentální funkce",
|
||||||
|
"notifications.column_settings.beta.grouping": "Seskupit notifikace",
|
||||||
"notifications.column_settings.favourite": "Oblíbené:",
|
"notifications.column_settings.favourite": "Oblíbené:",
|
||||||
"notifications.column_settings.filter_bar.advanced": "Zobrazit všechny kategorie",
|
"notifications.column_settings.filter_bar.advanced": "Zobrazit všechny kategorie",
|
||||||
"notifications.column_settings.filter_bar.category": "Panel rychlého filtrování",
|
"notifications.column_settings.filter_bar.category": "Panel rychlého filtrování",
|
||||||
|
|
|
@ -221,6 +221,7 @@
|
||||||
"domain_block_modal.they_cant_follow": "Ni all neb o'r gweinydd hwn eich dilyn.",
|
"domain_block_modal.they_cant_follow": "Ni all neb o'r gweinydd hwn eich dilyn.",
|
||||||
"domain_block_modal.they_wont_know": "Fyddan nhw ddim yn gwybod eu bod wedi cael eu blocio.",
|
"domain_block_modal.they_wont_know": "Fyddan nhw ddim yn gwybod eu bod wedi cael eu blocio.",
|
||||||
"domain_block_modal.title": "Blocio parth?",
|
"domain_block_modal.title": "Blocio parth?",
|
||||||
|
"domain_block_modal.you_will_lose_followers": "Bydd eich holl ddilynwyr o'r gweinydd hwn yn cael eu tynnu.",
|
||||||
"domain_block_modal.you_wont_see_posts": "Fyddwch chi ddim yn gweld postiadau na hysbysiadau gan ddefnyddwyr ar y gweinydd hwn.",
|
"domain_block_modal.you_wont_see_posts": "Fyddwch chi ddim yn gweld postiadau na hysbysiadau gan ddefnyddwyr ar y gweinydd hwn.",
|
||||||
"domain_pill.activitypub_lets_connect": "Mae'n caniatáu ichi gysylltu a rhyngweithio â phobl nid yn unig ar Mastodon, ond ar draws gwahanol apiau cymdeithasol hefyd.",
|
"domain_pill.activitypub_lets_connect": "Mae'n caniatáu ichi gysylltu a rhyngweithio â phobl nid yn unig ar Mastodon, ond ar draws gwahanol apiau cymdeithasol hefyd.",
|
||||||
"domain_pill.activitypub_like_language": "Mae ActivityPub fel yr iaith y mae Mastodon yn ei siarad â rhwydweithiau cymdeithasol eraill.",
|
"domain_pill.activitypub_like_language": "Mae ActivityPub fel yr iaith y mae Mastodon yn ei siarad â rhwydweithiau cymdeithasol eraill.",
|
||||||
|
@ -431,10 +432,10 @@
|
||||||
"keyboard_shortcuts.unfocus": "Dad-ffocysu ardal cyfansoddi testun/chwilio",
|
"keyboard_shortcuts.unfocus": "Dad-ffocysu ardal cyfansoddi testun/chwilio",
|
||||||
"keyboard_shortcuts.up": "Symud yn uwch yn y rhestr",
|
"keyboard_shortcuts.up": "Symud yn uwch yn y rhestr",
|
||||||
"lightbox.close": "Cau",
|
"lightbox.close": "Cau",
|
||||||
|
"lightbox.compress": "Cywasgu blwch gweld delwedd",
|
||||||
|
"lightbox.expand": "Ehangu blwch gweld delwedd",
|
||||||
"lightbox.next": "Nesaf",
|
"lightbox.next": "Nesaf",
|
||||||
"lightbox.previous": "Blaenorol",
|
"lightbox.previous": "Blaenorol",
|
||||||
"lightbox.zoom_in": "Chwyddo i faint gwirioneddol",
|
|
||||||
"lightbox.zoom_out": "Chwyddo i ffitio",
|
|
||||||
"limited_account_hint.action": "Dangos y proffil beth bynnag",
|
"limited_account_hint.action": "Dangos y proffil beth bynnag",
|
||||||
"limited_account_hint.title": "Mae'r proffil hwn wedi cael ei guddio gan gymedrolwyr {domain}.",
|
"limited_account_hint.title": "Mae'r proffil hwn wedi cael ei guddio gan gymedrolwyr {domain}.",
|
||||||
"link_preview.author": "Gan {name}",
|
"link_preview.author": "Gan {name}",
|
||||||
|
@ -558,6 +559,8 @@
|
||||||
"notifications.column_settings.admin.report": "Adroddiadau newydd:",
|
"notifications.column_settings.admin.report": "Adroddiadau newydd:",
|
||||||
"notifications.column_settings.admin.sign_up": "Cofrestriadau newydd:",
|
"notifications.column_settings.admin.sign_up": "Cofrestriadau newydd:",
|
||||||
"notifications.column_settings.alert": "Hysbysiadau bwrdd gwaith",
|
"notifications.column_settings.alert": "Hysbysiadau bwrdd gwaith",
|
||||||
|
"notifications.column_settings.beta.category": "Nodweddion arbrofol",
|
||||||
|
"notifications.column_settings.beta.grouping": "Grŵpio hysbysiadau",
|
||||||
"notifications.column_settings.favourite": "Ffefrynnau:",
|
"notifications.column_settings.favourite": "Ffefrynnau:",
|
||||||
"notifications.column_settings.filter_bar.advanced": "Dangos pob categori",
|
"notifications.column_settings.filter_bar.advanced": "Dangos pob categori",
|
||||||
"notifications.column_settings.filter_bar.category": "Bar hidlo cyflym",
|
"notifications.column_settings.filter_bar.category": "Bar hidlo cyflym",
|
||||||
|
@ -786,7 +789,6 @@
|
||||||
"status.edit": "Golygu",
|
"status.edit": "Golygu",
|
||||||
"status.edited": "Golygwyd ddiwethaf {date}",
|
"status.edited": "Golygwyd ddiwethaf {date}",
|
||||||
"status.edited_x_times": "Golygwyd {count, plural, one {count} two {count} other {{count} gwaith}}",
|
"status.edited_x_times": "Golygwyd {count, plural, one {count} two {count} other {{count} gwaith}}",
|
||||||
"status.embed": "Cael y cod mewnblannu",
|
|
||||||
"status.favourite": "Ffafrio",
|
"status.favourite": "Ffafrio",
|
||||||
"status.favourites": "{count, plural, one {ffefryn} other {ffefryn}}",
|
"status.favourites": "{count, plural, one {ffefryn} other {ffefryn}}",
|
||||||
"status.filter": "Hidlo'r postiad hwn",
|
"status.filter": "Hidlo'r postiad hwn",
|
||||||
|
|
|
@ -221,7 +221,7 @@
|
||||||
"domain_block_modal.they_cant_follow": "Ingen fra denne server kan følge dig.",
|
"domain_block_modal.they_cant_follow": "Ingen fra denne server kan følge dig.",
|
||||||
"domain_block_modal.they_wont_know": "Vedkommende ser ikke den aktive blokering.",
|
"domain_block_modal.they_wont_know": "Vedkommende ser ikke den aktive blokering.",
|
||||||
"domain_block_modal.title": "Blokér domæne?",
|
"domain_block_modal.title": "Blokér domæne?",
|
||||||
"domain_block_modal.you_will_lose_num_followers": "Man vil miste {followersCount, plural, one {{followersCountDisplay} følger} other {{followersCountDisplay} følgere}} og {followingCount, plural, one {{followingCountDisplay} person, man følger} other {{followingCountDisplay} personer, man følger}}.",
|
"domain_block_modal.you_will_lose_followers": "Alle følgerne fra denne server fjernes.",
|
||||||
"domain_block_modal.you_wont_see_posts": "Indlæg eller notifikationer fra brugere på denne server vises ikke.",
|
"domain_block_modal.you_wont_see_posts": "Indlæg eller notifikationer fra brugere på denne server vises ikke.",
|
||||||
"domain_pill.activitypub_lets_connect": "Det muliggør at komme i forbindelse og interagere med folk ikke kun på Mastodon, men også på tværs af forskellige sociale apps.",
|
"domain_pill.activitypub_lets_connect": "Det muliggør at komme i forbindelse og interagere med folk ikke kun på Mastodon, men også på tværs af forskellige sociale apps.",
|
||||||
"domain_pill.activitypub_like_language": "ActivityPub er \"sproget\", Mastodon taler med andre sociale netværk.",
|
"domain_pill.activitypub_like_language": "ActivityPub er \"sproget\", Mastodon taler med andre sociale netværk.",
|
||||||
|
@ -432,10 +432,10 @@
|
||||||
"keyboard_shortcuts.unfocus": "Fjern fokus fra tekstskrivningsområde/søgning",
|
"keyboard_shortcuts.unfocus": "Fjern fokus fra tekstskrivningsområde/søgning",
|
||||||
"keyboard_shortcuts.up": "Flyt opad på listen",
|
"keyboard_shortcuts.up": "Flyt opad på listen",
|
||||||
"lightbox.close": "Luk",
|
"lightbox.close": "Luk",
|
||||||
|
"lightbox.compress": "Komprimér billedvisningsfelt",
|
||||||
|
"lightbox.expand": "Udvid billedvisningsfelt",
|
||||||
"lightbox.next": "Næste",
|
"lightbox.next": "Næste",
|
||||||
"lightbox.previous": "Forrige",
|
"lightbox.previous": "Forrige",
|
||||||
"lightbox.zoom_in": "Zoom til faktisk størrelse",
|
|
||||||
"lightbox.zoom_out": "Zoom for at tilpasse",
|
|
||||||
"limited_account_hint.action": "Vis profil alligevel",
|
"limited_account_hint.action": "Vis profil alligevel",
|
||||||
"limited_account_hint.title": "Denne profil er blevet skjult af {domain}-moderatorerne.",
|
"limited_account_hint.title": "Denne profil er blevet skjult af {domain}-moderatorerne.",
|
||||||
"link_preview.author": "Af {name}",
|
"link_preview.author": "Af {name}",
|
||||||
|
@ -559,6 +559,8 @@
|
||||||
"notifications.column_settings.admin.report": "Nye anmeldelser:",
|
"notifications.column_settings.admin.report": "Nye anmeldelser:",
|
||||||
"notifications.column_settings.admin.sign_up": "Nye tilmeldinger:",
|
"notifications.column_settings.admin.sign_up": "Nye tilmeldinger:",
|
||||||
"notifications.column_settings.alert": "Computernotifikationer",
|
"notifications.column_settings.alert": "Computernotifikationer",
|
||||||
|
"notifications.column_settings.beta.category": "Eksperimentelle funktioner",
|
||||||
|
"notifications.column_settings.beta.grouping": "Gruppér notifikationer",
|
||||||
"notifications.column_settings.favourite": "Favoritter:",
|
"notifications.column_settings.favourite": "Favoritter:",
|
||||||
"notifications.column_settings.filter_bar.advanced": "Vis alle kategorier",
|
"notifications.column_settings.filter_bar.advanced": "Vis alle kategorier",
|
||||||
"notifications.column_settings.filter_bar.category": "Hurtigfiltreringsbjælke",
|
"notifications.column_settings.filter_bar.category": "Hurtigfiltreringsbjælke",
|
||||||
|
|
|
@ -155,7 +155,7 @@
|
||||||
"compose_form.lock_disclaimer.lock": "geschützt",
|
"compose_form.lock_disclaimer.lock": "geschützt",
|
||||||
"compose_form.placeholder": "Was gibt’s Neues?",
|
"compose_form.placeholder": "Was gibt’s Neues?",
|
||||||
"compose_form.poll.duration": "Umfragedauer",
|
"compose_form.poll.duration": "Umfragedauer",
|
||||||
"compose_form.poll.multiple": "Mehrfachauswahl",
|
"compose_form.poll.multiple": "Multiple-Choice",
|
||||||
"compose_form.poll.option_placeholder": "Option {number}",
|
"compose_form.poll.option_placeholder": "Option {number}",
|
||||||
"compose_form.poll.single": "Einfachauswahl",
|
"compose_form.poll.single": "Einfachauswahl",
|
||||||
"compose_form.poll.switch_to_multiple": "Mehrfachauswahl erlauben",
|
"compose_form.poll.switch_to_multiple": "Mehrfachauswahl erlauben",
|
||||||
|
@ -221,7 +221,7 @@
|
||||||
"domain_block_modal.they_cant_follow": "Niemand von diesem Server wird dir folgen können.",
|
"domain_block_modal.they_cant_follow": "Niemand von diesem Server wird dir folgen können.",
|
||||||
"domain_block_modal.they_wont_know": "Es wird nicht erkennbar sein, dass diese Domain blockiert wurde.",
|
"domain_block_modal.they_wont_know": "Es wird nicht erkennbar sein, dass diese Domain blockiert wurde.",
|
||||||
"domain_block_modal.title": "Domain blockieren?",
|
"domain_block_modal.title": "Domain blockieren?",
|
||||||
"domain_block_modal.you_will_lose_num_followers": "Du wirst {followersCount, plural, one {{followersCountDisplay} Follower} other {{followersCountDisplay} Follower}} verlieren und {followingCount, plural, one {{followingCountDisplay} Profil} other {{followingCountDisplay} Profilen}} entfolgen.",
|
"domain_block_modal.you_will_lose_followers": "Alle Follower von diesem Server werden entfernt.",
|
||||||
"domain_block_modal.you_wont_see_posts": "Du wirst keine Beiträge oder Benachrichtigungen von Profilen auf diesem Server sehen.",
|
"domain_block_modal.you_wont_see_posts": "Du wirst keine Beiträge oder Benachrichtigungen von Profilen auf diesem Server sehen.",
|
||||||
"domain_pill.activitypub_lets_connect": "Somit kannst du dich nicht nur auf Mastodon mit Leuten verbinden und mit ihnen interagieren, sondern über alle sozialen Apps hinweg.",
|
"domain_pill.activitypub_lets_connect": "Somit kannst du dich nicht nur auf Mastodon mit Leuten verbinden und mit ihnen interagieren, sondern über alle sozialen Apps hinweg.",
|
||||||
"domain_pill.activitypub_like_language": "ActivityPub ist sozusagen die Sprache, die Mastodon mit anderen sozialen Netzwerken spricht.",
|
"domain_pill.activitypub_like_language": "ActivityPub ist sozusagen die Sprache, die Mastodon mit anderen sozialen Netzwerken spricht.",
|
||||||
|
@ -432,10 +432,10 @@
|
||||||
"keyboard_shortcuts.unfocus": "Eingabefeld/Suche nicht mehr fokussieren",
|
"keyboard_shortcuts.unfocus": "Eingabefeld/Suche nicht mehr fokussieren",
|
||||||
"keyboard_shortcuts.up": "Ansicht nach oben bewegen",
|
"keyboard_shortcuts.up": "Ansicht nach oben bewegen",
|
||||||
"lightbox.close": "Schließen",
|
"lightbox.close": "Schließen",
|
||||||
|
"lightbox.compress": "Bildansicht verkleinern",
|
||||||
|
"lightbox.expand": "Bildansicht vergrößern",
|
||||||
"lightbox.next": "Vor",
|
"lightbox.next": "Vor",
|
||||||
"lightbox.previous": "Zurück",
|
"lightbox.previous": "Zurück",
|
||||||
"lightbox.zoom_in": "In Originalgröße anzeigen",
|
|
||||||
"lightbox.zoom_out": "In angepasster Größe anzeigen",
|
|
||||||
"limited_account_hint.action": "Profil trotzdem anzeigen",
|
"limited_account_hint.action": "Profil trotzdem anzeigen",
|
||||||
"limited_account_hint.title": "Dieses Profil wurde von den Moderator*innen von {domain} ausgeblendet.",
|
"limited_account_hint.title": "Dieses Profil wurde von den Moderator*innen von {domain} ausgeblendet.",
|
||||||
"link_preview.author": "Von {name}",
|
"link_preview.author": "Von {name}",
|
||||||
|
@ -559,6 +559,8 @@
|
||||||
"notifications.column_settings.admin.report": "Neue Meldungen:",
|
"notifications.column_settings.admin.report": "Neue Meldungen:",
|
||||||
"notifications.column_settings.admin.sign_up": "Neue Registrierungen:",
|
"notifications.column_settings.admin.sign_up": "Neue Registrierungen:",
|
||||||
"notifications.column_settings.alert": "Desktop-Benachrichtigungen",
|
"notifications.column_settings.alert": "Desktop-Benachrichtigungen",
|
||||||
|
"notifications.column_settings.beta.category": "Experimentelle Funktionen",
|
||||||
|
"notifications.column_settings.beta.grouping": "Benachrichtigungen gruppieren",
|
||||||
"notifications.column_settings.favourite": "Favoriten:",
|
"notifications.column_settings.favourite": "Favoriten:",
|
||||||
"notifications.column_settings.filter_bar.advanced": "Alle Filterkategorien anzeigen",
|
"notifications.column_settings.filter_bar.advanced": "Alle Filterkategorien anzeigen",
|
||||||
"notifications.column_settings.filter_bar.category": "Filterleiste",
|
"notifications.column_settings.filter_bar.category": "Filterleiste",
|
||||||
|
@ -775,7 +777,7 @@
|
||||||
"status.admin_domain": "{domain} moderieren",
|
"status.admin_domain": "{domain} moderieren",
|
||||||
"status.admin_status": "Beitrag moderieren",
|
"status.admin_status": "Beitrag moderieren",
|
||||||
"status.block": "@{name} blockieren",
|
"status.block": "@{name} blockieren",
|
||||||
"status.bookmark": "Lesezeichen setzen",
|
"status.bookmark": "Beitrag als Lesezeichen setzen",
|
||||||
"status.cancel_reblog_private": "Beitrag nicht mehr teilen",
|
"status.cancel_reblog_private": "Beitrag nicht mehr teilen",
|
||||||
"status.cannot_reblog": "Dieser Beitrag kann nicht geteilt werden",
|
"status.cannot_reblog": "Dieser Beitrag kann nicht geteilt werden",
|
||||||
"status.continued_thread": "Fortgeführter Thread",
|
"status.continued_thread": "Fortgeführter Thread",
|
||||||
|
|
|
@ -97,8 +97,6 @@
|
||||||
"block_modal.title": "Αποκλεισμός χρήστη;",
|
"block_modal.title": "Αποκλεισμός χρήστη;",
|
||||||
"block_modal.you_wont_see_mentions": "Δε θα βλέπεις τις αναρτήσεις που τον αναφέρουν.",
|
"block_modal.you_wont_see_mentions": "Δε θα βλέπεις τις αναρτήσεις που τον αναφέρουν.",
|
||||||
"boost_modal.combo": "Μπορείς να πατήσεις {combo} για να το προσπεράσεις την επόμενη φορά",
|
"boost_modal.combo": "Μπορείς να πατήσεις {combo} για να το προσπεράσεις την επόμενη φορά",
|
||||||
"boost_modal.reblog": "Ενίσχυση ανάρτησης;",
|
|
||||||
"boost_modal.undo_reblog": "Αναίρεση ενίσχυσης;",
|
|
||||||
"bundle_column_error.copy_stacktrace": "Αντιγραφή αναφοράς σφάλματος",
|
"bundle_column_error.copy_stacktrace": "Αντιγραφή αναφοράς σφάλματος",
|
||||||
"bundle_column_error.error.body": "Δεν ήταν δυνατή η απόδοση της σελίδας που ζήτησες. Μπορεί να οφείλεται σε σφάλμα στον κώδικά μας ή σε πρόβλημα συμβατότητας του προγράμματος περιήγησης.",
|
"bundle_column_error.error.body": "Δεν ήταν δυνατή η απόδοση της σελίδας που ζήτησες. Μπορεί να οφείλεται σε σφάλμα στον κώδικά μας ή σε πρόβλημα συμβατότητας του προγράμματος περιήγησης.",
|
||||||
"bundle_column_error.error.title": "Ωχ όχι!",
|
"bundle_column_error.error.title": "Ωχ όχι!",
|
||||||
|
@ -194,8 +192,6 @@
|
||||||
"confirmations.unfollow.confirm": "Άρση ακολούθησης",
|
"confirmations.unfollow.confirm": "Άρση ακολούθησης",
|
||||||
"confirmations.unfollow.message": "Σίγουρα θες να πάψεις να ακολουθείς τον/την {name};",
|
"confirmations.unfollow.message": "Σίγουρα θες να πάψεις να ακολουθείς τον/την {name};",
|
||||||
"confirmations.unfollow.title": "Άρση ακολούθησης;",
|
"confirmations.unfollow.title": "Άρση ακολούθησης;",
|
||||||
"content_warning.hide": "Απόκρυψη ανάρτησης",
|
|
||||||
"content_warning.show": "Εμφάνιση ούτως ή άλλως",
|
|
||||||
"conversation.delete": "Διαγραφή συζήτησης",
|
"conversation.delete": "Διαγραφή συζήτησης",
|
||||||
"conversation.mark_as_read": "Σήμανση ως αναγνωσμένο",
|
"conversation.mark_as_read": "Σήμανση ως αναγνωσμένο",
|
||||||
"conversation.open": "Προβολή συνομιλίας",
|
"conversation.open": "Προβολή συνομιλίας",
|
||||||
|
@ -221,6 +217,7 @@
|
||||||
"domain_block_modal.they_cant_follow": "Κανείς από αυτόν τον διακομιστή δεν μπορεί να σε ακολουθήσει.",
|
"domain_block_modal.they_cant_follow": "Κανείς από αυτόν τον διακομιστή δεν μπορεί να σε ακολουθήσει.",
|
||||||
"domain_block_modal.they_wont_know": "Δεν θα ξέρουν ότι έχουν αποκλειστεί.",
|
"domain_block_modal.they_wont_know": "Δεν θα ξέρουν ότι έχουν αποκλειστεί.",
|
||||||
"domain_block_modal.title": "Αποκλεισμός τομέα;",
|
"domain_block_modal.title": "Αποκλεισμός τομέα;",
|
||||||
|
"domain_block_modal.you_will_lose_followers": "Οι ακόλουθοί σου από αυτόν τον διακομιστή θα αφαιρεθούν.",
|
||||||
"domain_block_modal.you_wont_see_posts": "Δεν θα βλέπεις αναρτήσεις ή ειδοποιήσεις από χρήστες σε αυτόν το διακομιστή.",
|
"domain_block_modal.you_wont_see_posts": "Δεν θα βλέπεις αναρτήσεις ή ειδοποιήσεις από χρήστες σε αυτόν το διακομιστή.",
|
||||||
"domain_pill.activitypub_lets_connect": "Σού επιτρέπει να συνδεθείς και να αλληλεπιδράσεις με τους ανθρώπους όχι μόνο στο Mastodon, αλλά και σε διαφορετικές κοινωνικές εφαρμογές.",
|
"domain_pill.activitypub_lets_connect": "Σού επιτρέπει να συνδεθείς και να αλληλεπιδράσεις με τους ανθρώπους όχι μόνο στο Mastodon, αλλά και σε διαφορετικές κοινωνικές εφαρμογές.",
|
||||||
"domain_pill.activitypub_like_language": "Το ActivityPub είναι σαν τη γλώσσα Mastodon μιλάει με άλλα κοινωνικά δίκτυα.",
|
"domain_pill.activitypub_like_language": "Το ActivityPub είναι σαν τη γλώσσα Mastodon μιλάει με άλλα κοινωνικά δίκτυα.",
|
||||||
|
@ -302,7 +299,6 @@
|
||||||
"filter_modal.select_filter.subtitle": "Χρησιμοποιήστε μια υπάρχουσα κατηγορία ή δημιουργήστε μια νέα",
|
"filter_modal.select_filter.subtitle": "Χρησιμοποιήστε μια υπάρχουσα κατηγορία ή δημιουργήστε μια νέα",
|
||||||
"filter_modal.select_filter.title": "Φιλτράρισμα αυτής της ανάρτησης",
|
"filter_modal.select_filter.title": "Φιλτράρισμα αυτής της ανάρτησης",
|
||||||
"filter_modal.title.status": "Φιλτράρισμα μιας ανάρτησης",
|
"filter_modal.title.status": "Φιλτράρισμα μιας ανάρτησης",
|
||||||
"filter_warning.matches_filter": "Ταιριάζει με το φίλτρο “{title}”",
|
|
||||||
"filtered_notifications_banner.pending_requests": "Από {count, plural, =0 {κανένα} one {ένα άτομο} other {# άτομα}} που μπορεί να ξέρεις",
|
"filtered_notifications_banner.pending_requests": "Από {count, plural, =0 {κανένα} one {ένα άτομο} other {# άτομα}} που μπορεί να ξέρεις",
|
||||||
"filtered_notifications_banner.title": "Φιλτραρισμένες ειδοποιήσεις",
|
"filtered_notifications_banner.title": "Φιλτραρισμένες ειδοποιήσεις",
|
||||||
"firehose.all": "Όλα",
|
"firehose.all": "Όλα",
|
||||||
|
@ -431,10 +427,10 @@
|
||||||
"keyboard_shortcuts.unfocus": "Αποεστίαση του πεδίου σύνθεσης/αναζήτησης",
|
"keyboard_shortcuts.unfocus": "Αποεστίαση του πεδίου σύνθεσης/αναζήτησης",
|
||||||
"keyboard_shortcuts.up": "Μετακίνηση προς τα πάνω στη λίστα",
|
"keyboard_shortcuts.up": "Μετακίνηση προς τα πάνω στη λίστα",
|
||||||
"lightbox.close": "Κλείσιμο",
|
"lightbox.close": "Κλείσιμο",
|
||||||
|
"lightbox.compress": "Συμπίεση πλαισίου προβολής εικόνας",
|
||||||
|
"lightbox.expand": "Ανάπτυξη πλαισίου εμφάνισης εικόνας",
|
||||||
"lightbox.next": "Επόμενο",
|
"lightbox.next": "Επόμενο",
|
||||||
"lightbox.previous": "Προηγούμενο",
|
"lightbox.previous": "Προηγούμενο",
|
||||||
"lightbox.zoom_in": "Εστίαση στο πραγματικό μέγεθος",
|
|
||||||
"lightbox.zoom_out": "Εστίαση για προσαρμογή",
|
|
||||||
"limited_account_hint.action": "Εμφάνιση προφίλ ούτως ή άλλως",
|
"limited_account_hint.action": "Εμφάνιση προφίλ ούτως ή άλλως",
|
||||||
"limited_account_hint.title": "Αυτό το προφίλ έχει αποκρυφτεί από τους διαχειριστές του διακομιστή {domain}.",
|
"limited_account_hint.title": "Αυτό το προφίλ έχει αποκρυφτεί από τους διαχειριστές του διακομιστή {domain}.",
|
||||||
"link_preview.author": "Από {name}",
|
"link_preview.author": "Από {name}",
|
||||||
|
@ -456,7 +452,6 @@
|
||||||
"lists.subheading": "Οι λίστες σου",
|
"lists.subheading": "Οι λίστες σου",
|
||||||
"load_pending": "{count, plural, one {# νέο στοιχείο} other {# νέα στοιχεία}}",
|
"load_pending": "{count, plural, one {# νέο στοιχείο} other {# νέα στοιχεία}}",
|
||||||
"loading_indicator.label": "Φόρτωση…",
|
"loading_indicator.label": "Φόρτωση…",
|
||||||
"media_gallery.hide": "Απόκρυψη",
|
|
||||||
"moved_to_account_banner.text": "Ο λογαριασμός σου {disabledAccount} είναι προσωρινά απενεργοποιημένος επειδή μεταφέρθηκες στον {movedToAccount}.",
|
"moved_to_account_banner.text": "Ο λογαριασμός σου {disabledAccount} είναι προσωρινά απενεργοποιημένος επειδή μεταφέρθηκες στον {movedToAccount}.",
|
||||||
"mute_modal.hide_from_notifications": "Απόκρυψη από ειδοποιήσεις",
|
"mute_modal.hide_from_notifications": "Απόκρυψη από ειδοποιήσεις",
|
||||||
"mute_modal.hide_options": "Απόκρυψη επιλογών",
|
"mute_modal.hide_options": "Απόκρυψη επιλογών",
|
||||||
|
@ -468,7 +463,6 @@
|
||||||
"mute_modal.you_wont_see_mentions": "Δε θα βλέπεις τις αναρτήσεις που τον αναφέρουν.",
|
"mute_modal.you_wont_see_mentions": "Δε θα βλέπεις τις αναρτήσεις που τον αναφέρουν.",
|
||||||
"mute_modal.you_wont_see_posts": "Μπορεί ακόμα να δει τις αναρτήσεις σου, αλλά δε θα βλέπεις τις δικές του.",
|
"mute_modal.you_wont_see_posts": "Μπορεί ακόμα να δει τις αναρτήσεις σου, αλλά δε θα βλέπεις τις δικές του.",
|
||||||
"navigation_bar.about": "Σχετικά με",
|
"navigation_bar.about": "Σχετικά με",
|
||||||
"navigation_bar.administration": "Διαχείριση",
|
|
||||||
"navigation_bar.advanced_interface": "Άνοιγμα σε προηγμένη διεπαφή ιστού",
|
"navigation_bar.advanced_interface": "Άνοιγμα σε προηγμένη διεπαφή ιστού",
|
||||||
"navigation_bar.blocks": "Αποκλεισμένοι χρήστες",
|
"navigation_bar.blocks": "Αποκλεισμένοι χρήστες",
|
||||||
"navigation_bar.bookmarks": "Σελιδοδείκτες",
|
"navigation_bar.bookmarks": "Σελιδοδείκτες",
|
||||||
|
@ -485,7 +479,6 @@
|
||||||
"navigation_bar.follows_and_followers": "Ακολουθείς και σε ακολουθούν",
|
"navigation_bar.follows_and_followers": "Ακολουθείς και σε ακολουθούν",
|
||||||
"navigation_bar.lists": "Λίστες",
|
"navigation_bar.lists": "Λίστες",
|
||||||
"navigation_bar.logout": "Αποσύνδεση",
|
"navigation_bar.logout": "Αποσύνδεση",
|
||||||
"navigation_bar.moderation": "Συντονισμός",
|
|
||||||
"navigation_bar.mutes": "Αποσιωπημένοι χρήστες",
|
"navigation_bar.mutes": "Αποσιωπημένοι χρήστες",
|
||||||
"navigation_bar.opened_in_classic_interface": "Δημοσιεύσεις, λογαριασμοί και άλλες συγκεκριμένες σελίδες ανοίγονται από προεπιλογή στην κλασική διεπαφή ιστού.",
|
"navigation_bar.opened_in_classic_interface": "Δημοσιεύσεις, λογαριασμοί και άλλες συγκεκριμένες σελίδες ανοίγονται από προεπιλογή στην κλασική διεπαφή ιστού.",
|
||||||
"navigation_bar.personal": "Προσωπικά",
|
"navigation_bar.personal": "Προσωπικά",
|
||||||
|
@ -558,6 +551,8 @@
|
||||||
"notifications.column_settings.admin.report": "Νέες αναφορές:",
|
"notifications.column_settings.admin.report": "Νέες αναφορές:",
|
||||||
"notifications.column_settings.admin.sign_up": "Νέες εγγραφές:",
|
"notifications.column_settings.admin.sign_up": "Νέες εγγραφές:",
|
||||||
"notifications.column_settings.alert": "Ειδοποιήσεις επιφάνειας εργασίας",
|
"notifications.column_settings.alert": "Ειδοποιήσεις επιφάνειας εργασίας",
|
||||||
|
"notifications.column_settings.beta.category": "Πειραματικές λειτουργίες",
|
||||||
|
"notifications.column_settings.beta.grouping": "Ομαδοποίηση ειδοποιήσεων",
|
||||||
"notifications.column_settings.favourite": "Αγαπημένα:",
|
"notifications.column_settings.favourite": "Αγαπημένα:",
|
||||||
"notifications.column_settings.filter_bar.advanced": "Εμφάνιση όλων των κατηγοριών",
|
"notifications.column_settings.filter_bar.advanced": "Εμφάνιση όλων των κατηγοριών",
|
||||||
"notifications.column_settings.filter_bar.category": "Μπάρα γρήγορου φίλτρου",
|
"notifications.column_settings.filter_bar.category": "Μπάρα γρήγορου φίλτρου",
|
||||||
|
@ -777,7 +772,6 @@
|
||||||
"status.bookmark": "Σελιδοδείκτης",
|
"status.bookmark": "Σελιδοδείκτης",
|
||||||
"status.cancel_reblog_private": "Ακύρωση ενίσχυσης",
|
"status.cancel_reblog_private": "Ακύρωση ενίσχυσης",
|
||||||
"status.cannot_reblog": "Αυτή η ανάρτηση δεν μπορεί να ενισχυθεί",
|
"status.cannot_reblog": "Αυτή η ανάρτηση δεν μπορεί να ενισχυθεί",
|
||||||
"status.continued_thread": "Συνεχιζόμενο νήματος",
|
|
||||||
"status.copy": "Αντιγραφή συνδέσμου ανάρτησης",
|
"status.copy": "Αντιγραφή συνδέσμου ανάρτησης",
|
||||||
"status.delete": "Διαγραφή",
|
"status.delete": "Διαγραφή",
|
||||||
"status.detailed_status": "Προβολή λεπτομερούς συζήτησης",
|
"status.detailed_status": "Προβολή λεπτομερούς συζήτησης",
|
||||||
|
@ -786,7 +780,6 @@
|
||||||
"status.edit": "Επεξεργασία",
|
"status.edit": "Επεξεργασία",
|
||||||
"status.edited": "Τελευταία επεξεργασία {date}",
|
"status.edited": "Τελευταία επεξεργασία {date}",
|
||||||
"status.edited_x_times": "Επεξεργάστηκε {count, plural, one {{count} φορά} other {{count} φορές}}",
|
"status.edited_x_times": "Επεξεργάστηκε {count, plural, one {{count} φορά} other {{count} φορές}}",
|
||||||
"status.embed": "Απόκτηση κώδικα ενσωμάτωσης",
|
|
||||||
"status.favourite": "Αγαπημένα",
|
"status.favourite": "Αγαπημένα",
|
||||||
"status.favourites": "{count, plural, one {# αγαπημένο} other {# αγαπημένα}}",
|
"status.favourites": "{count, plural, one {# αγαπημένο} other {# αγαπημένα}}",
|
||||||
"status.filter": "Φιλτράρισμα αυτής της ανάρτησης",
|
"status.filter": "Φιλτράρισμα αυτής της ανάρτησης",
|
||||||
|
@ -811,7 +804,6 @@
|
||||||
"status.reblogs.empty": "Κανείς δεν ενίσχυσε αυτή την ανάρτηση ακόμα. Μόλις το κάνει κάποιος, θα εμφανιστεί εδώ.",
|
"status.reblogs.empty": "Κανείς δεν ενίσχυσε αυτή την ανάρτηση ακόμα. Μόλις το κάνει κάποιος, θα εμφανιστεί εδώ.",
|
||||||
"status.redraft": "Σβήσε & ξαναγράψε",
|
"status.redraft": "Σβήσε & ξαναγράψε",
|
||||||
"status.remove_bookmark": "Αφαίρεση σελιδοδείκτη",
|
"status.remove_bookmark": "Αφαίρεση σελιδοδείκτη",
|
||||||
"status.replied_in_thread": "Απαντήθηκε σε νήμα",
|
|
||||||
"status.replied_to": "Απάντησε στον {name}",
|
"status.replied_to": "Απάντησε στον {name}",
|
||||||
"status.reply": "Απάντησε",
|
"status.reply": "Απάντησε",
|
||||||
"status.replyAll": "Απάντησε στο νήμα συζήτησης",
|
"status.replyAll": "Απάντησε στο νήμα συζήτησης",
|
||||||
|
|
|
@ -221,6 +221,7 @@
|
||||||
"domain_block_modal.they_cant_follow": "Nobody from this server can follow you.",
|
"domain_block_modal.they_cant_follow": "Nobody from this server can follow you.",
|
||||||
"domain_block_modal.they_wont_know": "They won't know they've been blocked.",
|
"domain_block_modal.they_wont_know": "They won't know they've been blocked.",
|
||||||
"domain_block_modal.title": "Block domain?",
|
"domain_block_modal.title": "Block domain?",
|
||||||
|
"domain_block_modal.you_will_lose_followers": "All your followers from this server will be removed.",
|
||||||
"domain_block_modal.you_wont_see_posts": "You won't see posts or notifications from users on this server.",
|
"domain_block_modal.you_wont_see_posts": "You won't see posts or notifications from users on this server.",
|
||||||
"domain_pill.activitypub_lets_connect": "It lets you connect and interact with people not just on Mastodon, but across different social apps too.",
|
"domain_pill.activitypub_lets_connect": "It lets you connect and interact with people not just on Mastodon, but across different social apps too.",
|
||||||
"domain_pill.activitypub_like_language": "ActivityPub is like the language Mastodon speaks with other social networks.",
|
"domain_pill.activitypub_like_language": "ActivityPub is like the language Mastodon speaks with other social networks.",
|
||||||
|
@ -431,10 +432,10 @@
|
||||||
"keyboard_shortcuts.unfocus": "to un-focus compose textarea/search",
|
"keyboard_shortcuts.unfocus": "to un-focus compose textarea/search",
|
||||||
"keyboard_shortcuts.up": "Move up in the list",
|
"keyboard_shortcuts.up": "Move up in the list",
|
||||||
"lightbox.close": "Close",
|
"lightbox.close": "Close",
|
||||||
|
"lightbox.compress": "Compress image view box",
|
||||||
|
"lightbox.expand": "Expand image view box",
|
||||||
"lightbox.next": "Next",
|
"lightbox.next": "Next",
|
||||||
"lightbox.previous": "Previous",
|
"lightbox.previous": "Previous",
|
||||||
"lightbox.zoom_in": "Zoom to actual size",
|
|
||||||
"lightbox.zoom_out": "Zoom to fit",
|
|
||||||
"limited_account_hint.action": "Show profile anyway",
|
"limited_account_hint.action": "Show profile anyway",
|
||||||
"limited_account_hint.title": "This profile has been hidden by the moderators of {domain}.",
|
"limited_account_hint.title": "This profile has been hidden by the moderators of {domain}.",
|
||||||
"link_preview.author": "By {name}",
|
"link_preview.author": "By {name}",
|
||||||
|
@ -558,6 +559,8 @@
|
||||||
"notifications.column_settings.admin.report": "New reports:",
|
"notifications.column_settings.admin.report": "New reports:",
|
||||||
"notifications.column_settings.admin.sign_up": "New sign-ups:",
|
"notifications.column_settings.admin.sign_up": "New sign-ups:",
|
||||||
"notifications.column_settings.alert": "Desktop notifications",
|
"notifications.column_settings.alert": "Desktop notifications",
|
||||||
|
"notifications.column_settings.beta.category": "Experimental features",
|
||||||
|
"notifications.column_settings.beta.grouping": "Group notifications",
|
||||||
"notifications.column_settings.favourite": "Favourites:",
|
"notifications.column_settings.favourite": "Favourites:",
|
||||||
"notifications.column_settings.filter_bar.advanced": "Display all categories",
|
"notifications.column_settings.filter_bar.advanced": "Display all categories",
|
||||||
"notifications.column_settings.filter_bar.category": "Quick filter bar",
|
"notifications.column_settings.filter_bar.category": "Quick filter bar",
|
||||||
|
@ -786,7 +789,6 @@
|
||||||
"status.edit": "Edit",
|
"status.edit": "Edit",
|
||||||
"status.edited": "Last edited {date}",
|
"status.edited": "Last edited {date}",
|
||||||
"status.edited_x_times": "Edited {count, plural, one {{count} time} other {{count} times}}",
|
"status.edited_x_times": "Edited {count, plural, one {{count} time} other {{count} times}}",
|
||||||
"status.embed": "Get embed code",
|
|
||||||
"status.favourite": "Favourite",
|
"status.favourite": "Favourite",
|
||||||
"status.favourites": "{count, plural, one {favorite} other {favorites}}",
|
"status.favourites": "{count, plural, one {favorite} other {favorites}}",
|
||||||
"status.filter": "Filter this post",
|
"status.filter": "Filter this post",
|
||||||
|
|
|
@ -221,7 +221,7 @@
|
||||||
"domain_block_modal.they_cant_follow": "Nobody from this server can follow you.",
|
"domain_block_modal.they_cant_follow": "Nobody from this server can follow you.",
|
||||||
"domain_block_modal.they_wont_know": "They won't know they've been blocked.",
|
"domain_block_modal.they_wont_know": "They won't know they've been blocked.",
|
||||||
"domain_block_modal.title": "Block domain?",
|
"domain_block_modal.title": "Block domain?",
|
||||||
"domain_block_modal.you_will_lose_num_followers": "You will lose {followersCount, plural, one {{followersCountDisplay} follower} other {{followersCountDisplay} followers}} and {followingCount, plural, one {{followingCountDisplay} person you follow} other {{followingCountDisplay} people you follow}}.",
|
"domain_block_modal.you_will_lose_followers": "All your followers from this server will be removed.",
|
||||||
"domain_block_modal.you_wont_see_posts": "You won't see posts or notifications from users on this server.",
|
"domain_block_modal.you_wont_see_posts": "You won't see posts or notifications from users on this server.",
|
||||||
"domain_pill.activitypub_lets_connect": "It lets you connect and interact with people not just on Mastodon, but across different social apps too.",
|
"domain_pill.activitypub_lets_connect": "It lets you connect and interact with people not just on Mastodon, but across different social apps too.",
|
||||||
"domain_pill.activitypub_like_language": "ActivityPub is like the language Mastodon speaks with other social networks.",
|
"domain_pill.activitypub_like_language": "ActivityPub is like the language Mastodon speaks with other social networks.",
|
||||||
|
@ -432,10 +432,10 @@
|
||||||
"keyboard_shortcuts.unfocus": "Unfocus compose textarea/search",
|
"keyboard_shortcuts.unfocus": "Unfocus compose textarea/search",
|
||||||
"keyboard_shortcuts.up": "Move up in the list",
|
"keyboard_shortcuts.up": "Move up in the list",
|
||||||
"lightbox.close": "Close",
|
"lightbox.close": "Close",
|
||||||
|
"lightbox.compress": "Compress image view box",
|
||||||
|
"lightbox.expand": "Expand image view box",
|
||||||
"lightbox.next": "Next",
|
"lightbox.next": "Next",
|
||||||
"lightbox.previous": "Previous",
|
"lightbox.previous": "Previous",
|
||||||
"lightbox.zoom_in": "Zoom to actual size",
|
|
||||||
"lightbox.zoom_out": "Zoom to fit",
|
|
||||||
"limited_account_hint.action": "Show profile anyway",
|
"limited_account_hint.action": "Show profile anyway",
|
||||||
"limited_account_hint.title": "This profile has been hidden by the moderators of {domain}.",
|
"limited_account_hint.title": "This profile has been hidden by the moderators of {domain}.",
|
||||||
"link_preview.author": "By {name}",
|
"link_preview.author": "By {name}",
|
||||||
|
@ -559,6 +559,8 @@
|
||||||
"notifications.column_settings.admin.report": "New reports:",
|
"notifications.column_settings.admin.report": "New reports:",
|
||||||
"notifications.column_settings.admin.sign_up": "New sign-ups:",
|
"notifications.column_settings.admin.sign_up": "New sign-ups:",
|
||||||
"notifications.column_settings.alert": "Desktop notifications",
|
"notifications.column_settings.alert": "Desktop notifications",
|
||||||
|
"notifications.column_settings.beta.category": "Experimental features",
|
||||||
|
"notifications.column_settings.beta.grouping": "Group notifications",
|
||||||
"notifications.column_settings.favourite": "Favorites:",
|
"notifications.column_settings.favourite": "Favorites:",
|
||||||
"notifications.column_settings.filter_bar.advanced": "Display all categories",
|
"notifications.column_settings.filter_bar.advanced": "Display all categories",
|
||||||
"notifications.column_settings.filter_bar.category": "Quick filter bar",
|
"notifications.column_settings.filter_bar.category": "Quick filter bar",
|
||||||
|
|
|
@ -97,8 +97,6 @@
|
||||||
"block_modal.title": "Ĉu bloki uzanton?",
|
"block_modal.title": "Ĉu bloki uzanton?",
|
||||||
"block_modal.you_wont_see_mentions": "Vi ne vidos afiŝojn, ke mencii ilin.",
|
"block_modal.you_wont_see_mentions": "Vi ne vidos afiŝojn, ke mencii ilin.",
|
||||||
"boost_modal.combo": "Vi povas premi {combo} por preterpasi sekvafoje",
|
"boost_modal.combo": "Vi povas premi {combo} por preterpasi sekvafoje",
|
||||||
"boost_modal.reblog": "Ĉu diskonigi afiŝon?",
|
|
||||||
"boost_modal.undo_reblog": "Ĉu ĉesi diskonigi afiŝon?",
|
|
||||||
"bundle_column_error.copy_stacktrace": "Kopii la eraran raporton",
|
"bundle_column_error.copy_stacktrace": "Kopii la eraran raporton",
|
||||||
"bundle_column_error.error.body": "La petita paĝo ne povas redonitis. Eble estas eraro.",
|
"bundle_column_error.error.body": "La petita paĝo ne povas redonitis. Eble estas eraro.",
|
||||||
"bundle_column_error.error.title": "Ho, ve!",
|
"bundle_column_error.error.title": "Ho, ve!",
|
||||||
|
@ -190,12 +188,8 @@
|
||||||
"confirmations.redraft.title": "Ĉu forigi kaj redakcii afiŝon?",
|
"confirmations.redraft.title": "Ĉu forigi kaj redakcii afiŝon?",
|
||||||
"confirmations.reply.confirm": "Respondi",
|
"confirmations.reply.confirm": "Respondi",
|
||||||
"confirmations.reply.message": "Respondi nun anstataŭigos la skribatan afiŝon. Ĉu vi certas, ke vi volas daŭrigi?",
|
"confirmations.reply.message": "Respondi nun anstataŭigos la skribatan afiŝon. Ĉu vi certas, ke vi volas daŭrigi?",
|
||||||
"confirmations.reply.title": "Ĉu superskribi afiŝon?",
|
|
||||||
"confirmations.unfollow.confirm": "Ne plu sekvi",
|
"confirmations.unfollow.confirm": "Ne plu sekvi",
|
||||||
"confirmations.unfollow.message": "Ĉu vi certas, ke vi volas ĉesi sekvi {name}?",
|
"confirmations.unfollow.message": "Ĉu vi certas, ke vi volas ĉesi sekvi {name}?",
|
||||||
"confirmations.unfollow.title": "Ĉu ĉesi sekvi uzanton?",
|
|
||||||
"content_warning.hide": "Kaŝi afiŝon",
|
|
||||||
"content_warning.show": "Montri ĉiukaze",
|
|
||||||
"conversation.delete": "Forigi konversacion",
|
"conversation.delete": "Forigi konversacion",
|
||||||
"conversation.mark_as_read": "Marki legita",
|
"conversation.mark_as_read": "Marki legita",
|
||||||
"conversation.open": "Vidi konversacion",
|
"conversation.open": "Vidi konversacion",
|
||||||
|
@ -215,27 +209,6 @@
|
||||||
"dismissable_banner.explore_statuses": "Ĉi tioj estas afiŝoj de socia reto kiu populariĝas hodiau.",
|
"dismissable_banner.explore_statuses": "Ĉi tioj estas afiŝoj de socia reto kiu populariĝas hodiau.",
|
||||||
"dismissable_banner.explore_tags": "Ĉi tiuj kradvostoj populariĝas en ĉi tiu kaj aliaj serviloj en la malcentraliza reto nun.",
|
"dismissable_banner.explore_tags": "Ĉi tiuj kradvostoj populariĝas en ĉi tiu kaj aliaj serviloj en la malcentraliza reto nun.",
|
||||||
"dismissable_banner.public_timeline": "Ĉi tioj estas plej lastaj publikaj afiŝoj de personoj ĉe socia reto kiu personoj ĉe {domain} sekvas.",
|
"dismissable_banner.public_timeline": "Ĉi tioj estas plej lastaj publikaj afiŝoj de personoj ĉe socia reto kiu personoj ĉe {domain} sekvas.",
|
||||||
"domain_block_modal.block": "Bloki servilon",
|
|
||||||
"domain_block_modal.block_account_instead": "Bloki @{name} anstataŭe",
|
|
||||||
"domain_block_modal.they_can_interact_with_old_posts": "Homoj de ĉi tiu servilo povas interagi kun viaj malnovaj afiŝoj.",
|
|
||||||
"domain_block_modal.they_cant_follow": "Neniu el ĉi tiu servilo povas sekvi vin.",
|
|
||||||
"domain_block_modal.they_wont_know": "Ili ne scios, ke ili estas blokitaj.",
|
|
||||||
"domain_block_modal.title": "Ĉu bloki la domajnon?",
|
|
||||||
"domain_block_modal.you_will_lose_num_followers": "Vi perdos {followersCount, plural, one {{followersCountDisplay} sekvanton} other {{followersCountDisplay} sekvantojn}} kaj {followingCount, plural, one {{followingCountDisplay} homon, kiu vi sekvas} other {{followingCountDisplay} homojn, kiuj vi sekvas}}.",
|
|
||||||
"domain_block_modal.you_wont_see_posts": "Vi ne vidos afiŝojn aŭ sciigojn de uzantoj sur ĉi tiu servilo.",
|
|
||||||
"domain_pill.activitypub_lets_connect": "Ĝi ebligas vin konekti kaj interagi kun homoj ne nur sur Mastodon, sed ankaŭ tra diversaj sociaj apoj.",
|
|
||||||
"domain_pill.activitypub_like_language": "ActivityPub estas kiel la lingvo kiun Mastodon parolas kun aliaj sociaj retoj.",
|
|
||||||
"domain_pill.server": "Servilo",
|
|
||||||
"domain_pill.their_handle": "Ilia identigo:",
|
|
||||||
"domain_pill.their_server": "Ilia cifereca hejmo, kie ĉiuj iliaj afiŝoj loĝas.",
|
|
||||||
"domain_pill.their_username": "Ilia unika identigilo sur ilia servilo. Eblas trovi uzantojn kun la sama uzantnomo sur malsamaj serviloj.",
|
|
||||||
"domain_pill.username": "Uzantnomo",
|
|
||||||
"domain_pill.whats_in_a_handle": "Kio estas en identigo?",
|
|
||||||
"domain_pill.who_they_are": "Ĉar identigoj diras, kiu iu estas kaj kie ili estas, vi povas interagi kun homoj tra la socia reto de <button>ActivityPub-funkciigitaj platformoj</button>.",
|
|
||||||
"domain_pill.who_you_are": "Ĉar via identigo diras kiu vi estas kaj kie vi estas, homoj povas interagi kun vi tra la socia reto de <button>ActivityPub-funkciigitaj platformoj</button>.",
|
|
||||||
"domain_pill.your_handle": "Via identigo:",
|
|
||||||
"domain_pill.your_server": "Via cifereca hejmo, kie loĝas ĉiuj viaj afiŝoj. Ĉu vi ne ŝatas ĉi tiun? Transloku servilojn iam ajn kaj alportu ankaŭ viajn sekvantojn.",
|
|
||||||
"domain_pill.your_username": "Via unika identigilo sur ĉi tiu servilo. Eblas trovi uzantojn kun la sama uzantnomo sur malsamaj serviloj.",
|
|
||||||
"embed.instructions": "Enkorpigu ĉi tiun afiŝon en vian retejon per kopio de la suba kodo.",
|
"embed.instructions": "Enkorpigu ĉi tiun afiŝon en vian retejon per kopio de la suba kodo.",
|
||||||
"embed.preview": "Ĝi aperos tiel:",
|
"embed.preview": "Ĝi aperos tiel:",
|
||||||
"emoji_button.activity": "Agadoj",
|
"emoji_button.activity": "Agadoj",
|
||||||
|
@ -272,7 +245,6 @@
|
||||||
"empty_column.list": "Ankoraŭ estas nenio en ĉi tiu listo. Kiam membroj de ĉi tiu listo afiŝos novajn afiŝojn, ili aperos ĉi tie.",
|
"empty_column.list": "Ankoraŭ estas nenio en ĉi tiu listo. Kiam membroj de ĉi tiu listo afiŝos novajn afiŝojn, ili aperos ĉi tie.",
|
||||||
"empty_column.lists": "Vi ankoraŭ ne havas liston. Kiam vi kreos iun, ĝi aperos ĉi tie.",
|
"empty_column.lists": "Vi ankoraŭ ne havas liston. Kiam vi kreos iun, ĝi aperos ĉi tie.",
|
||||||
"empty_column.mutes": "Vi ne ankoraŭ silentigis iun uzanton.",
|
"empty_column.mutes": "Vi ne ankoraŭ silentigis iun uzanton.",
|
||||||
"empty_column.notification_requests": "Ĉio klara! Estas nenio tie ĉi. Kiam vi ricevas novajn sciigojn, ili aperos ĉi tie laŭ viaj agordoj.",
|
|
||||||
"empty_column.notifications": "Vi ankoraŭ ne havas sciigojn. Interagu kun aliaj por komenci konversacion.",
|
"empty_column.notifications": "Vi ankoraŭ ne havas sciigojn. Interagu kun aliaj por komenci konversacion.",
|
||||||
"empty_column.public": "Estas nenio ĉi tie! Publike skribu ion, aŭ mane sekvu uzantojn de aliaj serviloj por plenigi la publikan tempolinion",
|
"empty_column.public": "Estas nenio ĉi tie! Publike skribu ion, aŭ mane sekvu uzantojn de aliaj serviloj por plenigi la publikan tempolinion",
|
||||||
"error.unexpected_crash.explanation": "Pro eraro en nia kodo, aŭ problemo de kongruo en via retumilo, ĉi tiu paĝo ne povis esti montrata ĝuste.",
|
"error.unexpected_crash.explanation": "Pro eraro en nia kodo, aŭ problemo de kongruo en via retumilo, ĉi tiu paĝo ne povis esti montrata ĝuste.",
|
||||||
|
@ -303,30 +275,12 @@
|
||||||
"filter_modal.select_filter.subtitle": "Uzu ekzistantan kategorion aŭ kreu novan",
|
"filter_modal.select_filter.subtitle": "Uzu ekzistantan kategorion aŭ kreu novan",
|
||||||
"filter_modal.select_filter.title": "Filtri ĉi tiun afiŝon",
|
"filter_modal.select_filter.title": "Filtri ĉi tiun afiŝon",
|
||||||
"filter_modal.title.status": "Filtri mesaĝon",
|
"filter_modal.title.status": "Filtri mesaĝon",
|
||||||
"filter_warning.matches_filter": "Filtrilo de kongruoj “{title}”",
|
|
||||||
"filtered_notifications_banner.pending_requests": "El {count, plural, =0 {neniu} one {unu persono} other {# homoj}} vi eble konas",
|
|
||||||
"filtered_notifications_banner.title": "Filtritaj sciigoj",
|
|
||||||
"firehose.all": "Ĉiuj",
|
"firehose.all": "Ĉiuj",
|
||||||
"firehose.local": "Ĉi tiu servilo",
|
"firehose.local": "Ĉi tiu servilo",
|
||||||
"firehose.remote": "Aliaj serviloj",
|
"firehose.remote": "Aliaj serviloj",
|
||||||
"follow_request.authorize": "Rajtigi",
|
"follow_request.authorize": "Rajtigi",
|
||||||
"follow_request.reject": "Rifuzi",
|
"follow_request.reject": "Rifuzi",
|
||||||
"follow_requests.unlocked_explanation": "Kvankam via konto ne estas ŝlosita, la dungitaro de {domain} opinias, ke vi eble volas revizii petojn pri sekvado de ĉi tiuj kontoj permane.",
|
"follow_requests.unlocked_explanation": "Kvankam via konto ne estas ŝlosita, la dungitaro de {domain} opinias, ke vi eble volas revizii petojn pri sekvado de ĉi tiuj kontoj permane.",
|
||||||
"follow_suggestions.curated_suggestion": "Elekto de stabo",
|
|
||||||
"follow_suggestions.dismiss": "Ne montri denove",
|
|
||||||
"follow_suggestions.featured_longer": "Mane elektita de la teamo de {domain}",
|
|
||||||
"follow_suggestions.friends_of_friends_longer": "Populara inter homoj, kiujn vi sekvas",
|
|
||||||
"follow_suggestions.hints.featured": "Ĉi tiu profilo estis mane elektita de la teamo de {domain}.",
|
|
||||||
"follow_suggestions.hints.friends_of_friends": "Ĉi tiu profilo estas populara inter la homoj, kiujn vi sekvas.",
|
|
||||||
"follow_suggestions.hints.most_followed": "Ĉi tiu profilo estas unu el la plej sekvataj en {domain}.",
|
|
||||||
"follow_suggestions.hints.most_interactions": "Ĉi tiu profilo lastatempe ricevis multe da atento sur {domain}.",
|
|
||||||
"follow_suggestions.hints.similar_to_recently_followed": "Ĉi tiu profilo similas al la profiloj kiujn vi plej lastatempe sekvis.",
|
|
||||||
"follow_suggestions.personalized_suggestion": "Agordita propono",
|
|
||||||
"follow_suggestions.popular_suggestion": "Popularaj proponoj",
|
|
||||||
"follow_suggestions.popular_suggestion_longer": "Populara en {domain}",
|
|
||||||
"follow_suggestions.similar_to_recently_followed_longer": "Simile al profiloj, kiujn vi lastatempe sekvis",
|
|
||||||
"follow_suggestions.view_all": "Vidi ĉiujn",
|
|
||||||
"follow_suggestions.who_to_follow": "Kiun sekvi",
|
|
||||||
"followed_tags": "Sekvataj kradvortoj",
|
"followed_tags": "Sekvataj kradvortoj",
|
||||||
"footer.about": "Pri",
|
"footer.about": "Pri",
|
||||||
"footer.directory": "Profilujo",
|
"footer.directory": "Profilujo",
|
||||||
|
@ -353,14 +307,6 @@
|
||||||
"hashtag.follow": "Sekvi la kradvorton",
|
"hashtag.follow": "Sekvi la kradvorton",
|
||||||
"hashtag.unfollow": "Ne plu sekvi la kradvorton",
|
"hashtag.unfollow": "Ne plu sekvi la kradvorton",
|
||||||
"hashtags.and_other": "…kaj {count, plural,other {# pli}}",
|
"hashtags.and_other": "…kaj {count, plural,other {# pli}}",
|
||||||
"hints.profiles.followers_may_be_missing": "Sekvantoj por ĉi tiu profilo eble mankas.",
|
|
||||||
"hints.profiles.follows_may_be_missing": "Sekvatoj de ĉi tiu profilo eble mankas.",
|
|
||||||
"hints.profiles.posts_may_be_missing": "Iuj afiŝoj de ĉi tiu profilo eble mankas.",
|
|
||||||
"hints.profiles.see_more_followers": "Vidi pli da sekvantoj sur {domain}",
|
|
||||||
"hints.profiles.see_more_follows": "Vidi pli da sekvatoj sur {domain}",
|
|
||||||
"hints.profiles.see_more_posts": "Vidi pli da afiŝoj sur {domain}",
|
|
||||||
"hints.threads.replies_may_be_missing": "Respondoj de aliaj serviloj eble mankas.",
|
|
||||||
"hints.threads.see_more": "Vidi pli da respondoj sur {domain}",
|
|
||||||
"home.column_settings.show_reblogs": "Montri diskonigojn",
|
"home.column_settings.show_reblogs": "Montri diskonigojn",
|
||||||
"home.column_settings.show_replies": "Montri respondojn",
|
"home.column_settings.show_replies": "Montri respondojn",
|
||||||
"home.hide_announcements": "Kaŝi la anoncojn",
|
"home.hide_announcements": "Kaŝi la anoncojn",
|
||||||
|
@ -368,17 +314,6 @@
|
||||||
"home.pending_critical_update.link": "Vidi ĝisdatigojn",
|
"home.pending_critical_update.link": "Vidi ĝisdatigojn",
|
||||||
"home.pending_critical_update.title": "Kritika sekurĝisdatigo estas disponebla!",
|
"home.pending_critical_update.title": "Kritika sekurĝisdatigo estas disponebla!",
|
||||||
"home.show_announcements": "Montri anoncojn",
|
"home.show_announcements": "Montri anoncojn",
|
||||||
"ignore_notifications_modal.disclaimer": "Mastodon ne povas informi uzantojn, ke vi ignoris iliajn sciigojn. Ignori sciigojn ne malhelpos la mesaĝojn mem esti senditaj.",
|
|
||||||
"ignore_notifications_modal.filter_instead": "Filtri anstataŭe",
|
|
||||||
"ignore_notifications_modal.filter_to_act_users": "Vi ankoraŭ povos akcepti, malakcepti aŭ raporti uzantojn",
|
|
||||||
"ignore_notifications_modal.filter_to_avoid_confusion": "Filtrado helpas eviti eblan konfuzon",
|
|
||||||
"ignore_notifications_modal.filter_to_review_separately": "Vi povas revizii filtritajn sciigojn aparte",
|
|
||||||
"ignore_notifications_modal.ignore": "Ignori sciigojn",
|
|
||||||
"ignore_notifications_modal.limited_accounts_title": "Ĉu ignori sciigojn de moderigitaj kontoj?",
|
|
||||||
"ignore_notifications_modal.new_accounts_title": "Ĉu ignori sciigojn de novaj kontoj?",
|
|
||||||
"ignore_notifications_modal.not_followers_title": "Ĉu ignori sciigojn de homoj, kiuj ne sekvas vin?",
|
|
||||||
"ignore_notifications_modal.not_following_title": "Ĉu ignori sciigojn de homoj, kiujn vi ne sekvas?",
|
|
||||||
"ignore_notifications_modal.private_mentions_title": "Ĉu ignori sciigojn de nepetitaj privataj mencioj?",
|
|
||||||
"interaction_modal.description.favourite": "Per konto ĉe Mastodon, vi povas stelumiti ĉi tiun afiŝon por sciigi la afiŝanton ke vi aprezigas ŝin kaj konservas por la estonteco.",
|
"interaction_modal.description.favourite": "Per konto ĉe Mastodon, vi povas stelumiti ĉi tiun afiŝon por sciigi la afiŝanton ke vi aprezigas ŝin kaj konservas por la estonteco.",
|
||||||
"interaction_modal.description.follow": "Kun konto ĉe Mastodon, vi povos sekvi {name} por vidi ties mesaĝojn en via hejmo.",
|
"interaction_modal.description.follow": "Kun konto ĉe Mastodon, vi povos sekvi {name} por vidi ties mesaĝojn en via hejmo.",
|
||||||
"interaction_modal.description.reblog": "Kun konto ĉe Mastodon, vi povas diskonigi ĉi tiun afiŝon, por ke viaj propraj sekvantoj vidu ĝin.",
|
"interaction_modal.description.reblog": "Kun konto ĉe Mastodon, vi povas diskonigi ĉi tiun afiŝon, por ke viaj propraj sekvantoj vidu ĝin.",
|
||||||
|
@ -432,15 +367,13 @@
|
||||||
"keyboard_shortcuts.unfocus": "malenfokusigi la tekstujon aŭ la serĉilon",
|
"keyboard_shortcuts.unfocus": "malenfokusigi la tekstujon aŭ la serĉilon",
|
||||||
"keyboard_shortcuts.up": "iri supren en la listo",
|
"keyboard_shortcuts.up": "iri supren en la listo",
|
||||||
"lightbox.close": "Fermi",
|
"lightbox.close": "Fermi",
|
||||||
|
"lightbox.compress": "Kunpremi bildan vidkeston",
|
||||||
|
"lightbox.expand": "Pligrandigi bildan vidkeston",
|
||||||
"lightbox.next": "Antaŭen",
|
"lightbox.next": "Antaŭen",
|
||||||
"lightbox.previous": "Malantaŭen",
|
"lightbox.previous": "Malantaŭen",
|
||||||
"lightbox.zoom_in": "Zomi al reala grandeco",
|
|
||||||
"lightbox.zoom_out": "Zomi por konveni",
|
|
||||||
"limited_account_hint.action": "Montru profilon ĉiukaze",
|
"limited_account_hint.action": "Montru profilon ĉiukaze",
|
||||||
"limited_account_hint.title": "La profilo estas kaŝita de la moderigantoj de {domain}.",
|
"limited_account_hint.title": "La profilo estas kaŝita de la moderigantoj de {domain}.",
|
||||||
"link_preview.author": "De {name}",
|
"link_preview.author": "De {name}",
|
||||||
"link_preview.more_from_author": "Pli de {name}",
|
|
||||||
"link_preview.shares": "{count, plural, one {{counter} afiŝo} other {{counter} afiŝoj}}",
|
|
||||||
"lists.account.add": "Aldoni al la listo",
|
"lists.account.add": "Aldoni al la listo",
|
||||||
"lists.account.remove": "Forigi de la listo",
|
"lists.account.remove": "Forigi de la listo",
|
||||||
"lists.delete": "Forigi la liston",
|
"lists.delete": "Forigi la liston",
|
||||||
|
@ -457,19 +390,8 @@
|
||||||
"lists.subheading": "Viaj listoj",
|
"lists.subheading": "Viaj listoj",
|
||||||
"load_pending": "{count,plural, one {# nova elemento} other {# novaj elementoj}}",
|
"load_pending": "{count,plural, one {# nova elemento} other {# novaj elementoj}}",
|
||||||
"loading_indicator.label": "Ŝargado…",
|
"loading_indicator.label": "Ŝargado…",
|
||||||
"media_gallery.hide": "Kaŝi",
|
|
||||||
"moved_to_account_banner.text": "Via konto {disabledAccount} estas malvalidigita ĉar vi movis ĝin al {movedToAccount}.",
|
"moved_to_account_banner.text": "Via konto {disabledAccount} estas malvalidigita ĉar vi movis ĝin al {movedToAccount}.",
|
||||||
"mute_modal.hide_from_notifications": "Kaŝi de sciigoj",
|
|
||||||
"mute_modal.hide_options": "Kaŝi agordojn",
|
|
||||||
"mute_modal.indefinite": "Ĝis mi malsilentas ilin",
|
|
||||||
"mute_modal.show_options": "Montri agordojn",
|
|
||||||
"mute_modal.they_can_mention_and_follow": "Ili povas mencii kaj sekvi vin, sed vi ne vidos ilin.",
|
|
||||||
"mute_modal.they_wont_know": "Ili ne scios, ke ili estas silentigitaj.",
|
|
||||||
"mute_modal.title": "Ĉu silentigi uzanton?",
|
|
||||||
"mute_modal.you_wont_see_mentions": "Vi ne vidos afiŝojn, kiuj mencias ilin.",
|
|
||||||
"mute_modal.you_wont_see_posts": "Ili ankoraŭ povas vidi viajn afiŝojn, sed vi ne vidos iliajn.",
|
|
||||||
"navigation_bar.about": "Pri",
|
"navigation_bar.about": "Pri",
|
||||||
"navigation_bar.administration": "Administrado",
|
|
||||||
"navigation_bar.advanced_interface": "Malfermi altnivelan retpaĝan interfacon",
|
"navigation_bar.advanced_interface": "Malfermi altnivelan retpaĝan interfacon",
|
||||||
"navigation_bar.blocks": "Blokitaj uzantoj",
|
"navigation_bar.blocks": "Blokitaj uzantoj",
|
||||||
"navigation_bar.bookmarks": "Legosignoj",
|
"navigation_bar.bookmarks": "Legosignoj",
|
||||||
|
@ -486,7 +408,6 @@
|
||||||
"navigation_bar.follows_and_followers": "Sekvatoj kaj sekvantoj",
|
"navigation_bar.follows_and_followers": "Sekvatoj kaj sekvantoj",
|
||||||
"navigation_bar.lists": "Listoj",
|
"navigation_bar.lists": "Listoj",
|
||||||
"navigation_bar.logout": "Adiaŭi",
|
"navigation_bar.logout": "Adiaŭi",
|
||||||
"navigation_bar.moderation": "Modereco",
|
|
||||||
"navigation_bar.mutes": "Silentigitaj uzantoj",
|
"navigation_bar.mutes": "Silentigitaj uzantoj",
|
||||||
"navigation_bar.opened_in_classic_interface": "Afiŝoj, kontoj, kaj aliaj specifaj paĝoj kiuj estas malfermititaj defaulta en la klasika reta interfaco.",
|
"navigation_bar.opened_in_classic_interface": "Afiŝoj, kontoj, kaj aliaj specifaj paĝoj kiuj estas malfermititaj defaulta en la klasika reta interfaco.",
|
||||||
"navigation_bar.personal": "Persone",
|
"navigation_bar.personal": "Persone",
|
||||||
|
@ -497,71 +418,20 @@
|
||||||
"navigation_bar.security": "Sekureco",
|
"navigation_bar.security": "Sekureco",
|
||||||
"not_signed_in_indicator.not_signed_in": "Necesas saluti por aliri tiun rimedon.",
|
"not_signed_in_indicator.not_signed_in": "Necesas saluti por aliri tiun rimedon.",
|
||||||
"notification.admin.report": "{name} raportis {target}",
|
"notification.admin.report": "{name} raportis {target}",
|
||||||
"notification.admin.report_account": "{name} raportis {count, plural, one {afiŝon} other {# afiŝojn}} de {target} por {category}",
|
|
||||||
"notification.admin.report_account_other": "{name} raportis {count, plural, one {afiŝon} other {# afiŝojn}} de {target}",
|
|
||||||
"notification.admin.report_statuses": "{name} raportis {target} por {category}",
|
|
||||||
"notification.admin.report_statuses_other": "{name} raportis {target}",
|
|
||||||
"notification.admin.sign_up": "{name} kreis konton",
|
"notification.admin.sign_up": "{name} kreis konton",
|
||||||
"notification.admin.sign_up.name_and_others": "{name} kaj {count, plural, one {# alia} other {# aliaj}} kreis konton",
|
|
||||||
"notification.favourite": "{name} stelumis vian afiŝon",
|
"notification.favourite": "{name} stelumis vian afiŝon",
|
||||||
"notification.favourite.name_and_others_with_link": "{name} kaj <a>{count, plural, one {# alia} other {# aliaj}}</a> ŝatis vian afiŝon",
|
|
||||||
"notification.follow": "{name} eksekvis vin",
|
"notification.follow": "{name} eksekvis vin",
|
||||||
"notification.follow.name_and_others": "{name} kaj {count, plural, one {# alia} other {# aliaj}} sekvis vin",
|
|
||||||
"notification.follow_request": "{name} petis sekvi vin",
|
"notification.follow_request": "{name} petis sekvi vin",
|
||||||
"notification.follow_request.name_and_others": "{name} kaj {count, plural, one {# alia} other {# aliaj}} petis sekvi vin",
|
|
||||||
"notification.label.mention": "Mencii",
|
|
||||||
"notification.label.private_mention": "Privata mencio",
|
|
||||||
"notification.label.private_reply": "Privata respondo",
|
|
||||||
"notification.label.reply": "Respondi",
|
|
||||||
"notification.mention": "Mencii",
|
|
||||||
"notification.moderation-warning.learn_more": "Lerni pli",
|
|
||||||
"notification.moderation_warning": "Vi ricevis moderigan averton",
|
|
||||||
"notification.moderation_warning.action_delete_statuses": "Kelkaj el viaj afiŝoj estis forigitaj.",
|
|
||||||
"notification.moderation_warning.action_disable": "Via konto estas malŝaltita.",
|
|
||||||
"notification.moderation_warning.action_mark_statuses_as_sensitive": "Kelkaj el viaj afiŝoj estis markitaj kiel sentemaj.",
|
|
||||||
"notification.moderation_warning.action_none": "Via konto ricevis moderigan averton.",
|
|
||||||
"notification.moderation_warning.action_sensitive": "Viaj afiŝoj estos markitaj kiel sentemaj ekde nun.",
|
|
||||||
"notification.moderation_warning.action_silence": "Via konto estis limigita.",
|
|
||||||
"notification.moderation_warning.action_suspend": "Via konto estas malakceptita.",
|
|
||||||
"notification.own_poll": "Via enketo finiĝis",
|
"notification.own_poll": "Via enketo finiĝis",
|
||||||
"notification.poll": "Balotenketo, en kiu vi voĉdonis, finiĝis",
|
|
||||||
"notification.reblog": "{name} diskonigis vian afiŝon",
|
"notification.reblog": "{name} diskonigis vian afiŝon",
|
||||||
"notification.reblog.name_and_others_with_link": "{name} kaj <a>{count, plural, one {# alia} other {# aliaj}}</a> diskonigis vian afiŝon",
|
|
||||||
"notification.relationships_severance_event": "Perditaj konektoj kun {name}",
|
|
||||||
"notification.relationships_severance_event.account_suspension": "Administranto de {from} malakceptis {target}, kio signifas, ke vi ne plu povas ricevi ĝisdatigojn de ili aŭ interagi kun ili.",
|
|
||||||
"notification.relationships_severance_event.domain_block": "Administranto de {from} blokis {target}, inkluzive de {followersCount} de viaj sekvantoj kaj {followingCount, plural, one {# konto} other {# kontoj}} kiujn vi sekvas.",
|
|
||||||
"notification.relationships_severance_event.learn_more": "Lerni pli",
|
|
||||||
"notification.relationships_severance_event.user_domain_block": "Vi blokis {target}, forigante {followersCount} de viaj sekvantoj kaj {followingCount, plural, one {# konto} other {# kontoj}} kiujn vi sekvas.",
|
|
||||||
"notification.status": "{name} ĵus afiŝis",
|
"notification.status": "{name} ĵus afiŝis",
|
||||||
"notification.update": "{name} redaktis afiŝon",
|
"notification.update": "{name} redaktis afiŝon",
|
||||||
"notification_requests.accept": "Akcepti",
|
|
||||||
"notification_requests.accept_multiple": "{count, plural, one {Akcepti # peton…} other {Akcepti # petojn…}}",
|
|
||||||
"notification_requests.confirm_accept_multiple.button": "{count, plural, one {Akcepti peton} other {Akcepti petojn}}",
|
|
||||||
"notification_requests.confirm_accept_multiple.message": "Vi estas akceptonta {count, plural, one {unu sciigan peton} other {# sciigajn petojn}}. Ĉu vi certas, ke vi volas daŭrigi?",
|
|
||||||
"notification_requests.confirm_accept_multiple.title": "Ĉu akcepti sciigajn petojn?",
|
|
||||||
"notification_requests.confirm_dismiss_multiple.button": "{count, plural, one {Malakcepti peton} other {Malakcepti petojn}}",
|
|
||||||
"notification_requests.confirm_dismiss_multiple.message": "Vi estas malakceptonta {count, plural, one {unu sciigan peton} other {# sciigajn petojn}}. Vi ne povos facile aliri {count, plural, one {ĝin} other {ilin}} denove. Ĉu vi certas, ke vi volas daŭrigi?",
|
|
||||||
"notification_requests.confirm_dismiss_multiple.title": "Ĉu malakcepti sciigajn petojn?",
|
|
||||||
"notification_requests.dismiss": "Forĵeti",
|
|
||||||
"notification_requests.dismiss_multiple": "{count, plural, one {Malakcepti # peton…} other {# Malakcepti # petojn…}}",
|
|
||||||
"notification_requests.edit_selection": "Redakti",
|
|
||||||
"notification_requests.exit_selection": "Farita",
|
|
||||||
"notification_requests.explainer_for_limited_account": "Sciigoj de ĉi tiu konto estis filtritaj ĉar la konto estis limigita de moderanto.",
|
|
||||||
"notification_requests.explainer_for_limited_remote_account": "Sciigoj de ĉi tiu konto estis filtritaj ĉar la konto aŭ ĝia servilo estis limigitaj de moderanto.",
|
|
||||||
"notification_requests.maximize": "Maksimumigi",
|
|
||||||
"notification_requests.minimize_banner": "Minimumigi filtritajn sciigojn-rubandon",
|
|
||||||
"notification_requests.notifications_from": "Sciigoj de {name}",
|
|
||||||
"notification_requests.title": "Filtritaj sciigoj",
|
|
||||||
"notification_requests.view": "Vidi sciigojn",
|
|
||||||
"notifications.clear": "Forviŝi sciigojn",
|
"notifications.clear": "Forviŝi sciigojn",
|
||||||
"notifications.clear_confirmation": "Ĉu vi certas, ke vi volas porĉiame forviŝi ĉiujn viajn sciigojn?",
|
"notifications.clear_confirmation": "Ĉu vi certas, ke vi volas porĉiame forviŝi ĉiujn viajn sciigojn?",
|
||||||
"notifications.clear_title": "Ĉu forigi sciigojn?",
|
|
||||||
"notifications.column_settings.admin.report": "Novaj raportoj:",
|
"notifications.column_settings.admin.report": "Novaj raportoj:",
|
||||||
"notifications.column_settings.admin.sign_up": "Novaj registriĝoj:",
|
"notifications.column_settings.admin.sign_up": "Novaj registriĝoj:",
|
||||||
"notifications.column_settings.alert": "Sciigoj de la retumilo",
|
"notifications.column_settings.alert": "Sciigoj de la retumilo",
|
||||||
"notifications.column_settings.favourite": "Stelumoj:",
|
"notifications.column_settings.favourite": "Stelumoj:",
|
||||||
"notifications.column_settings.filter_bar.advanced": "Montri ĉiujn kategoriojn",
|
|
||||||
"notifications.column_settings.filter_bar.category": "Rapida filtrila breto",
|
|
||||||
"notifications.column_settings.follow": "Novaj sekvantoj:",
|
"notifications.column_settings.follow": "Novaj sekvantoj:",
|
||||||
"notifications.column_settings.follow_request": "Novaj petoj de sekvado:",
|
"notifications.column_settings.follow_request": "Novaj petoj de sekvado:",
|
||||||
"notifications.column_settings.mention": "Mencioj:",
|
"notifications.column_settings.mention": "Mencioj:",
|
||||||
|
@ -577,7 +447,7 @@
|
||||||
"notifications.filter.all": "Ĉiuj",
|
"notifications.filter.all": "Ĉiuj",
|
||||||
"notifications.filter.boosts": "Diskonigoj",
|
"notifications.filter.boosts": "Diskonigoj",
|
||||||
"notifications.filter.favourites": "Stelumoj",
|
"notifications.filter.favourites": "Stelumoj",
|
||||||
"notifications.filter.follows": "Sekvatoj",
|
"notifications.filter.follows": "Sekvoj",
|
||||||
"notifications.filter.mentions": "Mencioj",
|
"notifications.filter.mentions": "Mencioj",
|
||||||
"notifications.filter.polls": "Balotenketaj rezultoj",
|
"notifications.filter.polls": "Balotenketaj rezultoj",
|
||||||
"notifications.filter.statuses": "Ĝisdatigoj de homoj, kiujn vi sekvas",
|
"notifications.filter.statuses": "Ĝisdatigoj de homoj, kiujn vi sekvas",
|
||||||
|
@ -587,23 +457,6 @@
|
||||||
"notifications.permission_denied": "Labortablaj sciigoj ne disponeblas pro peto antaŭe rifuzita de retumiloj",
|
"notifications.permission_denied": "Labortablaj sciigoj ne disponeblas pro peto antaŭe rifuzita de retumiloj",
|
||||||
"notifications.permission_denied_alert": "Labortablaj sciigoj ne povas esti ebligitaj, ĉar retumilpermeso antaŭe estis rifuzita",
|
"notifications.permission_denied_alert": "Labortablaj sciigoj ne povas esti ebligitaj, ĉar retumilpermeso antaŭe estis rifuzita",
|
||||||
"notifications.permission_required": "Labortablaj sciigoj ne disponeblas ĉar la bezonata permeso ne estis donita.",
|
"notifications.permission_required": "Labortablaj sciigoj ne disponeblas ĉar la bezonata permeso ne estis donita.",
|
||||||
"notifications.policy.accept": "Akcepti",
|
|
||||||
"notifications.policy.accept_hint": "Montri en sciigoj",
|
|
||||||
"notifications.policy.drop": "Ignori",
|
|
||||||
"notifications.policy.drop_hint": "Sendi al la malpleno, por neniam esti vidita denove",
|
|
||||||
"notifications.policy.filter": "Filtri",
|
|
||||||
"notifications.policy.filter_hint": "Sendi al filtritaj sciigoj-enirkesto",
|
|
||||||
"notifications.policy.filter_limited_accounts_hint": "Limigita de servilaj moderigantoj",
|
|
||||||
"notifications.policy.filter_limited_accounts_title": "Moderigitaj kontoj",
|
|
||||||
"notifications.policy.filter_new_accounts.hint": "Kreite en la {days, plural, one {lasta tago} other {# lastaj tagoj}}",
|
|
||||||
"notifications.policy.filter_new_accounts_title": "Novaj kontoj",
|
|
||||||
"notifications.policy.filter_not_followers_hint": "Inkluzive de homoj, kiuj sekvis vin malpli ol {days, plural, one {unu tago} other {# tagoj}}",
|
|
||||||
"notifications.policy.filter_not_followers_title": "Homoj, kiuj ne sekvas vin",
|
|
||||||
"notifications.policy.filter_not_following_hint": "Ĝis vi permane aprobas ilin",
|
|
||||||
"notifications.policy.filter_not_following_title": "Homoj, kiujn vi ne sekvas",
|
|
||||||
"notifications.policy.filter_private_mentions_hint": "Filtrite krom se ĝi respondas al via propra mencio aŭ se vi sekvas la sendinton",
|
|
||||||
"notifications.policy.filter_private_mentions_title": "Nepetitaj privataj mencioj",
|
|
||||||
"notifications.policy.title": "Administri sciigojn de…",
|
|
||||||
"notifications_permission_banner.enable": "Ŝalti retumilajn sciigojn",
|
"notifications_permission_banner.enable": "Ŝalti retumilajn sciigojn",
|
||||||
"notifications_permission_banner.how_to_control": "Por ricevi sciigojn kiam Mastodon ne estas malfermita, ebligu labortablajn sciigojn. Vi povas regi precize kiuj specoj de interagoj generas labortablajn sciigojn per la supra butono {icon} post kiam ili estas ebligitaj.",
|
"notifications_permission_banner.how_to_control": "Por ricevi sciigojn kiam Mastodon ne estas malfermita, ebligu labortablajn sciigojn. Vi povas regi precize kiuj specoj de interagoj generas labortablajn sciigojn per la supra butono {icon} post kiam ili estas ebligitaj.",
|
||||||
"notifications_permission_banner.title": "Neniam preterlasas iun ajn",
|
"notifications_permission_banner.title": "Neniam preterlasas iun ajn",
|
||||||
|
@ -613,8 +466,8 @@
|
||||||
"onboarding.actions.go_to_home": "Go to your home feed",
|
"onboarding.actions.go_to_home": "Go to your home feed",
|
||||||
"onboarding.compose.template": "Saluton #Mastodon!",
|
"onboarding.compose.template": "Saluton #Mastodon!",
|
||||||
"onboarding.follows.empty": "Bedaŭrinde, neniu rezulto estas montrebla nuntempe. Vi povas provi serĉi aŭ foliumi la esploran paĝon por trovi kontojn por sekvi, aŭ retrovi baldaŭ.",
|
"onboarding.follows.empty": "Bedaŭrinde, neniu rezulto estas montrebla nuntempe. Vi povas provi serĉi aŭ foliumi la esploran paĝon por trovi kontojn por sekvi, aŭ retrovi baldaŭ.",
|
||||||
"onboarding.follows.lead": "Via hejma fluo estas la ĉefa maniero sperti Mastodon. Ju pli da homoj vi sekvas, des pli aktiva kaj interesa ĝi estos. Por komenci, jen kelkaj sugestoj:",
|
"onboarding.follows.lead": "You curate your own home feed. The more people you follow, the more active and interesting it will be. These profiles may be a good starting point—you can always unfollow them later!",
|
||||||
"onboarding.follows.title": "Agordi vian hejman fluon",
|
"onboarding.follows.title": "Popular on Mastodon",
|
||||||
"onboarding.profile.discoverable": "Trovebligi mian profilon",
|
"onboarding.profile.discoverable": "Trovebligi mian profilon",
|
||||||
"onboarding.profile.discoverable_hint": "Kiam vi aliĝi al trovebleco ĉe Mastodon, viaj afiŝoj eble aperos en serĉaj rezultoj kaj populariĝoj, kaj via profilo eble estas sugestota al personoj kun similaj intereseoj al vi.",
|
"onboarding.profile.discoverable_hint": "Kiam vi aliĝi al trovebleco ĉe Mastodon, viaj afiŝoj eble aperos en serĉaj rezultoj kaj populariĝoj, kaj via profilo eble estas sugestota al personoj kun similaj intereseoj al vi.",
|
||||||
"onboarding.profile.display_name": "Publika nomo",
|
"onboarding.profile.display_name": "Publika nomo",
|
||||||
|
@ -635,7 +488,7 @@
|
||||||
"onboarding.start.title": "Vi atingas ĝin!",
|
"onboarding.start.title": "Vi atingas ĝin!",
|
||||||
"onboarding.steps.follow_people.body": "You curate your own feed. Lets fill it with interesting people.",
|
"onboarding.steps.follow_people.body": "You curate your own feed. Lets fill it with interesting people.",
|
||||||
"onboarding.steps.follow_people.title": "Follow {count, plural, one {one person} other {# people}}",
|
"onboarding.steps.follow_people.title": "Follow {count, plural, one {one person} other {# people}}",
|
||||||
"onboarding.steps.publish_status.body": "Salutu la mondon per teksto, fotoj, filmetoj aŭ balotenketoj {emoji}",
|
"onboarding.steps.publish_status.body": "Say hello to the world.",
|
||||||
"onboarding.steps.publish_status.title": "Fari vian unuan afiŝon",
|
"onboarding.steps.publish_status.title": "Fari vian unuan afiŝon",
|
||||||
"onboarding.steps.setup_profile.body": "Others are more likely to interact with you with a filled out profile.",
|
"onboarding.steps.setup_profile.body": "Others are more likely to interact with you with a filled out profile.",
|
||||||
"onboarding.steps.setup_profile.title": "Customize your profile",
|
"onboarding.steps.setup_profile.title": "Customize your profile",
|
||||||
|
@ -665,7 +518,6 @@
|
||||||
"privacy.private.short": "Sekvantoj",
|
"privacy.private.short": "Sekvantoj",
|
||||||
"privacy.public.long": "Ĉiujn ajn ĉe kaj ekster Mastodon",
|
"privacy.public.long": "Ĉiujn ajn ĉe kaj ekster Mastodon",
|
||||||
"privacy.public.short": "Publika",
|
"privacy.public.short": "Publika",
|
||||||
"privacy.unlisted.additional": "Ĉi tio kondutas ekzakte kiel publika, krom ke la afiŝo ne aperos en vivaj fluoj aŭ kradvortoj, esploro aŭ Mastodon-serĉo, eĉ se vi estas enskribita en la tuta konto.",
|
|
||||||
"privacy.unlisted.long": "Malpli algoritmaj fanfaroj",
|
"privacy.unlisted.long": "Malpli algoritmaj fanfaroj",
|
||||||
"privacy.unlisted.short": "Diskrete publika",
|
"privacy.unlisted.short": "Diskrete publika",
|
||||||
"privacy_policy.last_updated": "Laste ĝisdatigita en {date}",
|
"privacy_policy.last_updated": "Laste ĝisdatigita en {date}",
|
||||||
|
@ -685,9 +537,7 @@
|
||||||
"relative_time.minutes": "{number}m",
|
"relative_time.minutes": "{number}m",
|
||||||
"relative_time.seconds": "{number}s",
|
"relative_time.seconds": "{number}s",
|
||||||
"relative_time.today": "hodiaŭ",
|
"relative_time.today": "hodiaŭ",
|
||||||
"reply_indicator.attachments": "{count, plural, one {# aldonaĵo} other {# aldonaĵoj}}",
|
|
||||||
"reply_indicator.cancel": "Nuligi",
|
"reply_indicator.cancel": "Nuligi",
|
||||||
"reply_indicator.poll": "Balotenketo",
|
|
||||||
"report.block": "Bloki",
|
"report.block": "Bloki",
|
||||||
"report.block_explanation": "Vi ne vidos iliajn afiŝojn. Ili ne povos vidi viajn afiŝojn, nek sekvi vin. Ili ne scios, ke vi blokas ilin.",
|
"report.block_explanation": "Vi ne vidos iliajn afiŝojn. Ili ne povos vidi viajn afiŝojn, nek sekvi vin. Ili ne scios, ke vi blokas ilin.",
|
||||||
"report.categories.legal": "Laŭleĝa",
|
"report.categories.legal": "Laŭleĝa",
|
||||||
|
@ -730,13 +580,9 @@
|
||||||
"report.unfollow_explanation": "Vi sekvas ĉi tiun konton. Por ne plu vidi ĝiajn afiŝojn en via hejma templinio, ĉesu sekvi ĝin.",
|
"report.unfollow_explanation": "Vi sekvas ĉi tiun konton. Por ne plu vidi ĝiajn afiŝojn en via hejma templinio, ĉesu sekvi ĝin.",
|
||||||
"report_notification.attached_statuses": "{count, plural, one {{count} afiŝo almetita} other {{count} afiŝoj almetitaj}}",
|
"report_notification.attached_statuses": "{count, plural, one {{count} afiŝo almetita} other {{count} afiŝoj almetitaj}}",
|
||||||
"report_notification.categories.legal": "Laŭleĝa",
|
"report_notification.categories.legal": "Laŭleĝa",
|
||||||
"report_notification.categories.legal_sentence": "kontraŭleĝa enhavo",
|
|
||||||
"report_notification.categories.other": "Alia",
|
"report_notification.categories.other": "Alia",
|
||||||
"report_notification.categories.other_sentence": "alia",
|
|
||||||
"report_notification.categories.spam": "Trudmesaĝo",
|
"report_notification.categories.spam": "Trudmesaĝo",
|
||||||
"report_notification.categories.spam_sentence": "trudmesaĝo",
|
|
||||||
"report_notification.categories.violation": "Malobservo de la regulo",
|
"report_notification.categories.violation": "Malobservo de la regulo",
|
||||||
"report_notification.categories.violation_sentence": "malobservo de la regulo",
|
|
||||||
"report_notification.open": "Malfermi la raporton",
|
"report_notification.open": "Malfermi la raporton",
|
||||||
"search.no_recent_searches": "Neniuj lastaj serĉoj",
|
"search.no_recent_searches": "Neniuj lastaj serĉoj",
|
||||||
"search.placeholder": "Serĉi",
|
"search.placeholder": "Serĉi",
|
||||||
|
@ -764,11 +610,8 @@
|
||||||
"server_banner.about_active_users": "Personoj uzantaj ĉi tiun servilon dum la lastaj 30 tagoj (Aktivaj Uzantoj Monate)",
|
"server_banner.about_active_users": "Personoj uzantaj ĉi tiun servilon dum la lastaj 30 tagoj (Aktivaj Uzantoj Monate)",
|
||||||
"server_banner.active_users": "aktivaj uzantoj",
|
"server_banner.active_users": "aktivaj uzantoj",
|
||||||
"server_banner.administered_by": "Administrata de:",
|
"server_banner.administered_by": "Administrata de:",
|
||||||
"server_banner.is_one_of_many": "{domain} estas unu el la multaj sendependaj Mastodon-serviloj, kiujn vi povas uzi por partopreni en la fediverso.",
|
|
||||||
"server_banner.server_stats": "Statistikoj de la servilo:",
|
"server_banner.server_stats": "Statistikoj de la servilo:",
|
||||||
"sign_in_banner.create_account": "Krei konton",
|
"sign_in_banner.create_account": "Krei konton",
|
||||||
"sign_in_banner.follow_anyone": "Sekvi iun ajn tra la fediverso kaj vidi ĉion en kronologia ordo. Neniuj algoritmoj, reklamoj aŭ klakbetoj videblas.",
|
|
||||||
"sign_in_banner.mastodon_is": "Mastodonto estas la plej bona maniero por resti flank-al-flanke kun kio okazas.",
|
|
||||||
"sign_in_banner.sign_in": "Saluti",
|
"sign_in_banner.sign_in": "Saluti",
|
||||||
"sign_in_banner.sso_redirect": "Ensalutu aŭ Registriĝi",
|
"sign_in_banner.sso_redirect": "Ensalutu aŭ Registriĝi",
|
||||||
"status.admin_account": "Malfermi fasadon de moderigado por @{name}",
|
"status.admin_account": "Malfermi fasadon de moderigado por @{name}",
|
||||||
|
@ -778,18 +621,14 @@
|
||||||
"status.bookmark": "Aldoni al la legosignoj",
|
"status.bookmark": "Aldoni al la legosignoj",
|
||||||
"status.cancel_reblog_private": "Ne plu diskonigi",
|
"status.cancel_reblog_private": "Ne plu diskonigi",
|
||||||
"status.cannot_reblog": "Ĉi tiun afiŝon ne eblas diskonigi",
|
"status.cannot_reblog": "Ĉi tiun afiŝon ne eblas diskonigi",
|
||||||
"status.continued_thread": "Daŭrigis fadenon",
|
|
||||||
"status.copy": "Kopii la ligilon al la mesaĝo",
|
"status.copy": "Kopii la ligilon al la mesaĝo",
|
||||||
"status.delete": "Forigi",
|
"status.delete": "Forigi",
|
||||||
"status.detailed_status": "Detala konversacia vido",
|
"status.detailed_status": "Detala konversacia vido",
|
||||||
"status.direct": "Private mencii @{name}",
|
"status.direct": "Private mencii @{name}",
|
||||||
"status.direct_indicator": "Privata mencio",
|
"status.direct_indicator": "Privata mencio",
|
||||||
"status.edit": "Redakti",
|
"status.edit": "Redakti",
|
||||||
"status.edited": "Laste redaktita {date}",
|
|
||||||
"status.edited_x_times": "Redactita {count, plural, one {{count} fojon} other {{count} fojojn}}",
|
"status.edited_x_times": "Redactita {count, plural, one {{count} fojon} other {{count} fojojn}}",
|
||||||
"status.embed": "Akiri enkorpigan kodon",
|
|
||||||
"status.favourite": "Ŝatata",
|
"status.favourite": "Ŝatata",
|
||||||
"status.favourites": "{count, plural, one {plej ŝatata} other {plej ŝatataj}}",
|
|
||||||
"status.filter": "Filtri ĉi tiun afiŝon",
|
"status.filter": "Filtri ĉi tiun afiŝon",
|
||||||
"status.history.created": "{name} kreis {date}",
|
"status.history.created": "{name} kreis {date}",
|
||||||
"status.history.edited": "{name} redaktis {date}",
|
"status.history.edited": "{name} redaktis {date}",
|
||||||
|
@ -808,11 +647,9 @@
|
||||||
"status.reblog": "Diskonigi",
|
"status.reblog": "Diskonigi",
|
||||||
"status.reblog_private": "Diskonigi kun la sama videbleco",
|
"status.reblog_private": "Diskonigi kun la sama videbleco",
|
||||||
"status.reblogged_by": "{name} diskonigis",
|
"status.reblogged_by": "{name} diskonigis",
|
||||||
"status.reblogs": "{count, plural, one {diskonigo} other {diskonigoj}}",
|
|
||||||
"status.reblogs.empty": "Ankoraŭ neniu diskonigis tiun afiŝon. Kiam iu faras tion, ri aperos ĉi tie.",
|
"status.reblogs.empty": "Ankoraŭ neniu diskonigis tiun afiŝon. Kiam iu faras tion, ri aperos ĉi tie.",
|
||||||
"status.redraft": "Forigi kaj reskribi",
|
"status.redraft": "Forigi kaj reskribi",
|
||||||
"status.remove_bookmark": "Forigi legosignon",
|
"status.remove_bookmark": "Forigi legosignon",
|
||||||
"status.replied_in_thread": "Respondis en fadeno",
|
|
||||||
"status.replied_to": "Respondis al {name}",
|
"status.replied_to": "Respondis al {name}",
|
||||||
"status.reply": "Respondi",
|
"status.reply": "Respondi",
|
||||||
"status.replyAll": "Respondi al la fadeno",
|
"status.replyAll": "Respondi al la fadeno",
|
||||||
|
|
|
@ -221,7 +221,7 @@
|
||||||
"domain_block_modal.they_cant_follow": "Nadie de este servidor puede seguirte.",
|
"domain_block_modal.they_cant_follow": "Nadie de este servidor puede seguirte.",
|
||||||
"domain_block_modal.they_wont_know": "No sabrán que fueron bloqueados.",
|
"domain_block_modal.they_wont_know": "No sabrán que fueron bloqueados.",
|
||||||
"domain_block_modal.title": "¿Bloquear dominio?",
|
"domain_block_modal.title": "¿Bloquear dominio?",
|
||||||
"domain_block_modal.you_will_lose_num_followers": "Perderás {followersCount, plural, one {{followersCountDisplay} seguidor} other {{followersCountDisplay} seguidores}} y {followingCount, plural, one {{followingCountDisplay} persona a la que sigues} other {{followingCountDisplay} personas a las que sigues}}.",
|
"domain_block_modal.you_will_lose_followers": "Se eliminarán todos tus seguidores de este servidor.",
|
||||||
"domain_block_modal.you_wont_see_posts": "No verás mensajes ni notificaciones de usuarios en este servidor.",
|
"domain_block_modal.you_wont_see_posts": "No verás mensajes ni notificaciones de usuarios en este servidor.",
|
||||||
"domain_pill.activitypub_lets_connect": "Te permite conectar e interactuar con cuentas no solo en Mastodon, sino también a través de diferentes aplicaciones sociales.",
|
"domain_pill.activitypub_lets_connect": "Te permite conectar e interactuar con cuentas no solo en Mastodon, sino también a través de diferentes aplicaciones sociales.",
|
||||||
"domain_pill.activitypub_like_language": "ActivityPub es como el idioma que Mastodon habla con otras redes sociales.",
|
"domain_pill.activitypub_like_language": "ActivityPub es como el idioma que Mastodon habla con otras redes sociales.",
|
||||||
|
@ -432,10 +432,10 @@
|
||||||
"keyboard_shortcuts.unfocus": "Quitar el foco del área de texto de redacción o de búsqueda",
|
"keyboard_shortcuts.unfocus": "Quitar el foco del área de texto de redacción o de búsqueda",
|
||||||
"keyboard_shortcuts.up": "Subir en la lista",
|
"keyboard_shortcuts.up": "Subir en la lista",
|
||||||
"lightbox.close": "Cerrar",
|
"lightbox.close": "Cerrar",
|
||||||
|
"lightbox.compress": "Comprimir cuadro de vista de imagen",
|
||||||
|
"lightbox.expand": "Expandir cuadro de vista de imagen",
|
||||||
"lightbox.next": "Siguiente",
|
"lightbox.next": "Siguiente",
|
||||||
"lightbox.previous": "Anterior",
|
"lightbox.previous": "Anterior",
|
||||||
"lightbox.zoom_in": "Ampliar al tamaño real",
|
|
||||||
"lightbox.zoom_out": "Ampliar hasta ajustar",
|
|
||||||
"limited_account_hint.action": "Mostrar perfil de todos modos",
|
"limited_account_hint.action": "Mostrar perfil de todos modos",
|
||||||
"limited_account_hint.title": "Este perfil fue ocultado por los moderadores de {domain}.",
|
"limited_account_hint.title": "Este perfil fue ocultado por los moderadores de {domain}.",
|
||||||
"link_preview.author": "Por {name}",
|
"link_preview.author": "Por {name}",
|
||||||
|
@ -559,6 +559,8 @@
|
||||||
"notifications.column_settings.admin.report": "Nuevas denuncias:",
|
"notifications.column_settings.admin.report": "Nuevas denuncias:",
|
||||||
"notifications.column_settings.admin.sign_up": "Nuevos registros:",
|
"notifications.column_settings.admin.sign_up": "Nuevos registros:",
|
||||||
"notifications.column_settings.alert": "Notificaciones de escritorio",
|
"notifications.column_settings.alert": "Notificaciones de escritorio",
|
||||||
|
"notifications.column_settings.beta.category": "Funciones experimentales",
|
||||||
|
"notifications.column_settings.beta.grouping": "Agrupar notificaciones",
|
||||||
"notifications.column_settings.favourite": "Favoritos:",
|
"notifications.column_settings.favourite": "Favoritos:",
|
||||||
"notifications.column_settings.filter_bar.advanced": "Mostrar todas las categorías",
|
"notifications.column_settings.filter_bar.advanced": "Mostrar todas las categorías",
|
||||||
"notifications.column_settings.filter_bar.category": "Barra de filtrado rápido",
|
"notifications.column_settings.filter_bar.category": "Barra de filtrado rápido",
|
||||||
|
@ -787,7 +789,6 @@
|
||||||
"status.edit": "Editar",
|
"status.edit": "Editar",
|
||||||
"status.edited": "Última edición: {date}",
|
"status.edited": "Última edición: {date}",
|
||||||
"status.edited_x_times": "Editado {count, plural, one {{count} vez} other {{count} veces}}",
|
"status.edited_x_times": "Editado {count, plural, one {{count} vez} other {{count} veces}}",
|
||||||
"status.embed": "Obtener código para insertar",
|
|
||||||
"status.favourite": "Marcar como favorito",
|
"status.favourite": "Marcar como favorito",
|
||||||
"status.favourites": "{count, plural, one {# voto} other {# votos}}",
|
"status.favourites": "{count, plural, one {# voto} other {# votos}}",
|
||||||
"status.filter": "Filtrar este mensaje",
|
"status.filter": "Filtrar este mensaje",
|
||||||
|
|
|
@ -39,11 +39,11 @@
|
||||||
"account.following_counter": "{count, plural, one {{counter} siguiendo} other {{counter} siguiendo}}",
|
"account.following_counter": "{count, plural, one {{counter} siguiendo} other {{counter} siguiendo}}",
|
||||||
"account.follows.empty": "Este usuario todavía no sigue a nadie.",
|
"account.follows.empty": "Este usuario todavía no sigue a nadie.",
|
||||||
"account.go_to_profile": "Ir al perfil",
|
"account.go_to_profile": "Ir al perfil",
|
||||||
"account.hide_reblogs": "Ocultar impulsos de @{name}",
|
"account.hide_reblogs": "Ocultar retoots de @{name}",
|
||||||
"account.in_memoriam": "En memoria.",
|
"account.in_memoriam": "En memoria.",
|
||||||
"account.joined_short": "Se unió",
|
"account.joined_short": "Se unió",
|
||||||
"account.languages": "Cambiar idiomas suscritos",
|
"account.languages": "Cambiar idiomas suscritos",
|
||||||
"account.link_verified_on": "El proprietario de este enlace fue comprobado el {date}",
|
"account.link_verified_on": "El proprietario de este link fue comprobado el {date}",
|
||||||
"account.locked_info": "El estado de privacidad de esta cuenta està configurado como bloqueado. El proprietario debe revisar manualmente quien puede seguirle.",
|
"account.locked_info": "El estado de privacidad de esta cuenta està configurado como bloqueado. El proprietario debe revisar manualmente quien puede seguirle.",
|
||||||
"account.media": "Multimedia",
|
"account.media": "Multimedia",
|
||||||
"account.mention": "Mencionar a @{name}",
|
"account.mention": "Mencionar a @{name}",
|
||||||
|
@ -61,7 +61,7 @@
|
||||||
"account.requested": "Esperando aprobación. Haga clic para cancelar la solicitud de seguimiento",
|
"account.requested": "Esperando aprobación. Haga clic para cancelar la solicitud de seguimiento",
|
||||||
"account.requested_follow": "{name} ha solicitado seguirte",
|
"account.requested_follow": "{name} ha solicitado seguirte",
|
||||||
"account.share": "Compartir el perfil de @{name}",
|
"account.share": "Compartir el perfil de @{name}",
|
||||||
"account.show_reblogs": "Mostrar impulsos de @{name}",
|
"account.show_reblogs": "Mostrar retoots de @{name}",
|
||||||
"account.statuses_counter": "{count, plural, one {{counter} publicación} other {{counter} publicaciones}}",
|
"account.statuses_counter": "{count, plural, one {{counter} publicación} other {{counter} publicaciones}}",
|
||||||
"account.unblock": "Desbloquear a @{name}",
|
"account.unblock": "Desbloquear a @{name}",
|
||||||
"account.unblock_domain": "Mostrar a {domain}",
|
"account.unblock_domain": "Mostrar a {domain}",
|
||||||
|
@ -70,8 +70,8 @@
|
||||||
"account.unfollow": "Dejar de seguir",
|
"account.unfollow": "Dejar de seguir",
|
||||||
"account.unmute": "Dejar de silenciar a @{name}",
|
"account.unmute": "Dejar de silenciar a @{name}",
|
||||||
"account.unmute_notifications_short": "Dejar de silenciar notificaciones",
|
"account.unmute_notifications_short": "Dejar de silenciar notificaciones",
|
||||||
"account.unmute_short": "Dejar de silenciar",
|
"account.unmute_short": "Desmutear",
|
||||||
"account_note.placeholder": "Haz clic para agregar una nota",
|
"account_note.placeholder": "Clic para añadir nota",
|
||||||
"admin.dashboard.daily_retention": "Tasa de retención de usuarios por día después de unirse",
|
"admin.dashboard.daily_retention": "Tasa de retención de usuarios por día después de unirse",
|
||||||
"admin.dashboard.monthly_retention": "Tasa de retención de usuarios por mes después de unirse",
|
"admin.dashboard.monthly_retention": "Tasa de retención de usuarios por mes después de unirse",
|
||||||
"admin.dashboard.retention.average": "Promedio",
|
"admin.dashboard.retention.average": "Promedio",
|
||||||
|
@ -97,7 +97,7 @@
|
||||||
"block_modal.title": "¿Bloquear usuario?",
|
"block_modal.title": "¿Bloquear usuario?",
|
||||||
"block_modal.you_wont_see_mentions": "No verás publicaciones que los mencionen.",
|
"block_modal.you_wont_see_mentions": "No verás publicaciones que los mencionen.",
|
||||||
"boost_modal.combo": "Puedes hacer clic en {combo} para saltar este aviso la próxima vez",
|
"boost_modal.combo": "Puedes hacer clic en {combo} para saltar este aviso la próxima vez",
|
||||||
"boost_modal.reblog": "¿Deseas impulsar la publicación?",
|
"boost_modal.reblog": "¿Impulsar la publicación?",
|
||||||
"boost_modal.undo_reblog": "¿Dejar de impulsar la publicación?",
|
"boost_modal.undo_reblog": "¿Dejar de impulsar la publicación?",
|
||||||
"bundle_column_error.copy_stacktrace": "Copiar informe de error",
|
"bundle_column_error.copy_stacktrace": "Copiar informe de error",
|
||||||
"bundle_column_error.error.body": "La página solicitada no pudo ser renderizada. Podría deberse a un error en nuestro código o a un problema de compatibilidad con el navegador.",
|
"bundle_column_error.error.body": "La página solicitada no pudo ser renderizada. Podría deberse a un error en nuestro código o a un problema de compatibilidad con el navegador.",
|
||||||
|
@ -130,7 +130,7 @@
|
||||||
"column.lists": "Listas",
|
"column.lists": "Listas",
|
||||||
"column.mutes": "Usuarios silenciados",
|
"column.mutes": "Usuarios silenciados",
|
||||||
"column.notifications": "Notificaciones",
|
"column.notifications": "Notificaciones",
|
||||||
"column.pins": "Publicaciones fijadas",
|
"column.pins": "Toots fijados",
|
||||||
"column.public": "Línea de tiempo federada",
|
"column.public": "Línea de tiempo federada",
|
||||||
"column_back_button.label": "Atrás",
|
"column_back_button.label": "Atrás",
|
||||||
"column_header.hide_settings": "Ocultar configuración",
|
"column_header.hide_settings": "Ocultar configuración",
|
||||||
|
@ -148,10 +148,10 @@
|
||||||
"compose.published.body": "Publicado.",
|
"compose.published.body": "Publicado.",
|
||||||
"compose.published.open": "Abrir",
|
"compose.published.open": "Abrir",
|
||||||
"compose.saved.body": "Publicación guardada.",
|
"compose.saved.body": "Publicación guardada.",
|
||||||
"compose_form.direct_message_warning_learn_more": "Saber más",
|
"compose_form.direct_message_warning_learn_more": "Aprender mas",
|
||||||
"compose_form.encryption_warning": "Las publicaciones en Mastodon no están cifradas de extremo a extremo. No comparta ninguna información sensible en Mastodon.",
|
"compose_form.encryption_warning": "Las publicaciones en Mastodon no están cifradas de extremo a extremo. No comparta ninguna información sensible en Mastodon.",
|
||||||
"compose_form.hashtag_warning": "Esta publicación no será listada bajo ninguna etiqueta dado que no es pública. Solo publicaciones públicas pueden ser buscadas por etiqueta.",
|
"compose_form.hashtag_warning": "Este toot no será listado bajo ningún hashtag dado que no es público. Solo toots públicos pueden ser buscados por hashtag.",
|
||||||
"compose_form.lock_disclaimer": "Tu cuenta no está {locked}. Todos pueden seguirte para ver tus publicaciones solo para seguidores.",
|
"compose_form.lock_disclaimer": "Tu cuenta no está bloqueada. Todos pueden seguirte para ver tus toots solo para seguidores.",
|
||||||
"compose_form.lock_disclaimer.lock": "bloqueado",
|
"compose_form.lock_disclaimer.lock": "bloqueado",
|
||||||
"compose_form.placeholder": "¿En qué estás pensando?",
|
"compose_form.placeholder": "¿En qué estás pensando?",
|
||||||
"compose_form.poll.duration": "Duración de la encuesta",
|
"compose_form.poll.duration": "Duración de la encuesta",
|
||||||
|
@ -165,32 +165,32 @@
|
||||||
"compose_form.publish_form": "Publicar",
|
"compose_form.publish_form": "Publicar",
|
||||||
"compose_form.reply": "Respuesta",
|
"compose_form.reply": "Respuesta",
|
||||||
"compose_form.save_changes": "Actualización",
|
"compose_form.save_changes": "Actualización",
|
||||||
"compose_form.spoiler.marked": "Quitar advertencia de contenido",
|
"compose_form.spoiler.marked": "Texto oculto tras la advertencia",
|
||||||
"compose_form.spoiler.unmarked": "Añadir advertencia de contenido",
|
"compose_form.spoiler.unmarked": "Texto no oculto",
|
||||||
"compose_form.spoiler_placeholder": "Advertencia de contenido (opcional)",
|
"compose_form.spoiler_placeholder": "Advertencia de contenido (opcional)",
|
||||||
"confirmation_modal.cancel": "Cancelar",
|
"confirmation_modal.cancel": "Cancelar",
|
||||||
"confirmations.block.confirm": "Bloquear",
|
"confirmations.block.confirm": "Bloquear",
|
||||||
"confirmations.delete.confirm": "Eliminar",
|
"confirmations.delete.confirm": "Eliminar",
|
||||||
"confirmations.delete.message": "¿Estás seguro de que quieres borrar esta publicación?",
|
"confirmations.delete.message": "¿Estás seguro de que quieres borrar este toot?",
|
||||||
"confirmations.delete.title": "¿Eliminar publicación?",
|
"confirmations.delete.title": "¿Eliminar publicación?",
|
||||||
"confirmations.delete_list.confirm": "Eliminar",
|
"confirmations.delete_list.confirm": "Eliminar",
|
||||||
"confirmations.delete_list.message": "¿Seguro que quieres borrar esta lista permanentemente?",
|
"confirmations.delete_list.message": "¿Seguro que quieres borrar esta lista permanentemente?",
|
||||||
"confirmations.delete_list.title": "¿Deseas eliminar la lista?",
|
"confirmations.delete_list.title": "¿Eliminar lista?",
|
||||||
"confirmations.discard_edit_media.confirm": "Descartar",
|
"confirmations.discard_edit_media.confirm": "Descartar",
|
||||||
"confirmations.discard_edit_media.message": "Tienes cambios sin guardar en la descripción o vista previa del archivo, ¿deseas descartarlos de cualquier manera?",
|
"confirmations.discard_edit_media.message": "Tienes cambios sin guardar en la descripción o vista previa del archivo, ¿deseas descartarlos de cualquier manera?",
|
||||||
"confirmations.edit.confirm": "Editar",
|
"confirmations.edit.confirm": "Editar",
|
||||||
"confirmations.edit.message": "Editar sobrescribirá el mensaje que estás escribiendo. ¿Estás seguro de que deseas continuar?",
|
"confirmations.edit.message": "Editar sobrescribirá el mensaje que estás escribiendo. ¿Estás seguro de que deseas continuar?",
|
||||||
"confirmations.edit.title": "¿Sobreescribir publicación?",
|
"confirmations.edit.title": "¿Sobrescribir publicación?",
|
||||||
"confirmations.logout.confirm": "Cerrar sesión",
|
"confirmations.logout.confirm": "Cerrar sesión",
|
||||||
"confirmations.logout.message": "¿Estás seguro de que quieres cerrar la sesión?",
|
"confirmations.logout.message": "¿Estás seguro de querer cerrar la sesión?",
|
||||||
"confirmations.logout.title": "¿Deseas cerrar sesión?",
|
"confirmations.logout.title": "¿Cerrar sesión?",
|
||||||
"confirmations.mute.confirm": "Silenciar",
|
"confirmations.mute.confirm": "Silenciar",
|
||||||
"confirmations.redraft.confirm": "Borrar y volver a borrador",
|
"confirmations.redraft.confirm": "Borrar y volver a borrador",
|
||||||
"confirmations.redraft.message": "¿Estás seguro que quieres borrar esta publicación y editarla? Los favoritos e impulsos se perderán, y las respuestas a la publicación original quedarán separadas.",
|
"confirmations.redraft.message": "¿Estás seguro que quieres borrar esta publicación y editarla? Los favoritos e impulsos se perderán, y las respuestas a la publicación original quedarán separadas.",
|
||||||
"confirmations.redraft.title": "¿Borrar y volver a redactar la publicación?",
|
"confirmations.redraft.title": "¿Borrar y volver a redactar la publicación?",
|
||||||
"confirmations.reply.confirm": "Responder",
|
"confirmations.reply.confirm": "Responder",
|
||||||
"confirmations.reply.message": "Responder sobrescribirá el mensaje que estás escribiendo. ¿Estás seguro de que deseas continuar?",
|
"confirmations.reply.message": "Responder sobrescribirá el mensaje que estás escribiendo. ¿Estás seguro de que deseas continuar?",
|
||||||
"confirmations.reply.title": "¿Sobreescribir publicación?",
|
"confirmations.reply.title": "¿Sobrescribir publicación?",
|
||||||
"confirmations.unfollow.confirm": "Dejar de seguir",
|
"confirmations.unfollow.confirm": "Dejar de seguir",
|
||||||
"confirmations.unfollow.message": "¿Estás seguro de que quieres dejar de seguir a {name}?",
|
"confirmations.unfollow.message": "¿Estás seguro de que quieres dejar de seguir a {name}?",
|
||||||
"confirmations.unfollow.title": "¿Dejar de seguir al usuario?",
|
"confirmations.unfollow.title": "¿Dejar de seguir al usuario?",
|
||||||
|
@ -213,15 +213,15 @@
|
||||||
"dismissable_banner.dismiss": "Descartar",
|
"dismissable_banner.dismiss": "Descartar",
|
||||||
"dismissable_banner.explore_links": "Estas noticias están siendo discutidas por personas en este y otros servidores de la red descentralizada en este momento.",
|
"dismissable_banner.explore_links": "Estas noticias están siendo discutidas por personas en este y otros servidores de la red descentralizada en este momento.",
|
||||||
"dismissable_banner.explore_statuses": "Estas son las publicaciones que están en tendencia en la red ahora. Las publicaciones recientes con más impulsos y favoritos se muestran más arriba.",
|
"dismissable_banner.explore_statuses": "Estas son las publicaciones que están en tendencia en la red ahora. Las publicaciones recientes con más impulsos y favoritos se muestran más arriba.",
|
||||||
"dismissable_banner.explore_tags": "Se trata de etiquetas que están ganando adeptos en las redes sociales hoy en día. Las etiquetas que son utilizadas por más personas diferentes se clasifican mejor.",
|
"dismissable_banner.explore_tags": "Se trata de hashtags que están ganando adeptos en las redes sociales hoy en día. Los hashtags que son utilizados por más personas diferentes se clasifican mejor.",
|
||||||
"dismissable_banner.public_timeline": "Estas son las publicaciones públicas más recientes de personas en la web social a las que sigue la gente en {domain}.",
|
"dismissable_banner.public_timeline": "Estos son los toots públicos más recientes de personas en la web social a las que sigue la gente en {domain}.",
|
||||||
"domain_block_modal.block": "Bloquear servidor",
|
"domain_block_modal.block": "Bloquear servidor",
|
||||||
"domain_block_modal.block_account_instead": "Bloquear @{name} en su lugar",
|
"domain_block_modal.block_account_instead": "Bloquear @{name} en su lugar",
|
||||||
"domain_block_modal.they_can_interact_with_old_posts": "Las personas de este servidor pueden interactuar con tus publicaciones antiguas.",
|
"domain_block_modal.they_can_interact_with_old_posts": "Las personas de este servidor pueden interactuar con tus publicaciones antiguas.",
|
||||||
"domain_block_modal.they_cant_follow": "Nadie de este servidor puede seguirte.",
|
"domain_block_modal.they_cant_follow": "Nadie de este servidor puede seguirte.",
|
||||||
"domain_block_modal.they_wont_know": "No sabrán que han sido bloqueados.",
|
"domain_block_modal.they_wont_know": "No sabrán que han sido bloqueados.",
|
||||||
"domain_block_modal.title": "¿Bloquear dominio?",
|
"domain_block_modal.title": "¿Bloquear dominio?",
|
||||||
"domain_block_modal.you_will_lose_num_followers": "Perderás {followersCount, plural, one {{followersCountDisplay} seguidor} other {{followersCountDisplay} seguidores}} y {followingCount, plural, one {{followingCountDisplay} persona a la que sigues} other {{followingCountDisplay} personas a las que sigues}}.",
|
"domain_block_modal.you_will_lose_followers": "Todos tus seguidores de este servidor serán eliminados.",
|
||||||
"domain_block_modal.you_wont_see_posts": "No verás publicaciones ni notificaciones de usuarios en este servidor.",
|
"domain_block_modal.you_wont_see_posts": "No verás publicaciones ni notificaciones de usuarios en este servidor.",
|
||||||
"domain_pill.activitypub_lets_connect": "Te permite conectar e interactuar con personas no sólo en Mastodon, sino también a través de diferentes aplicaciones sociales.",
|
"domain_pill.activitypub_lets_connect": "Te permite conectar e interactuar con personas no sólo en Mastodon, sino también a través de diferentes aplicaciones sociales.",
|
||||||
"domain_pill.activitypub_like_language": "ActivityPub es como el idioma que Mastodon habla con otras redes sociales.",
|
"domain_pill.activitypub_like_language": "ActivityPub es como el idioma que Mastodon habla con otras redes sociales.",
|
||||||
|
@ -236,7 +236,7 @@
|
||||||
"domain_pill.your_handle": "Tu alias:",
|
"domain_pill.your_handle": "Tu alias:",
|
||||||
"domain_pill.your_server": "Tu hogar digital, donde residen todas tus publicaciones. ¿No te gusta este sitio? Muévete a otro servidor en cualquier momento y llévate a tus seguidores.",
|
"domain_pill.your_server": "Tu hogar digital, donde residen todas tus publicaciones. ¿No te gusta este sitio? Muévete a otro servidor en cualquier momento y llévate a tus seguidores.",
|
||||||
"domain_pill.your_username": "Tu identificador único en este servidor. Es posible encontrar usuarios con el mismo nombre de usuario en diferentes servidores.",
|
"domain_pill.your_username": "Tu identificador único en este servidor. Es posible encontrar usuarios con el mismo nombre de usuario en diferentes servidores.",
|
||||||
"embed.instructions": "Añade esta publicación a tu sitio web con el siguiente código.",
|
"embed.instructions": "Añade este toot a tu sitio web con el siguiente código.",
|
||||||
"embed.preview": "Así es como se verá:",
|
"embed.preview": "Así es como se verá:",
|
||||||
"emoji_button.activity": "Actividad",
|
"emoji_button.activity": "Actividad",
|
||||||
"emoji_button.clear": "Borrar",
|
"emoji_button.clear": "Borrar",
|
||||||
|
@ -249,16 +249,16 @@
|
||||||
"emoji_button.objects": "Objetos",
|
"emoji_button.objects": "Objetos",
|
||||||
"emoji_button.people": "Gente",
|
"emoji_button.people": "Gente",
|
||||||
"emoji_button.recent": "Usados frecuentemente",
|
"emoji_button.recent": "Usados frecuentemente",
|
||||||
"emoji_button.search": "Buscar...",
|
"emoji_button.search": "Buscar…",
|
||||||
"emoji_button.search_results": "Resultados de búsqueda",
|
"emoji_button.search_results": "Resultados de búsqueda",
|
||||||
"emoji_button.symbols": "Símbolos",
|
"emoji_button.symbols": "Símbolos",
|
||||||
"emoji_button.travel": "Viajes y lugares",
|
"emoji_button.travel": "Viajes y lugares",
|
||||||
"empty_column.account_hides_collections": "Este usuario ha elegido no hacer disponible esta información",
|
"empty_column.account_hides_collections": "Este usuario ha elegido no hacer disponible esta información",
|
||||||
"empty_column.account_suspended": "Cuenta suspendida",
|
"empty_column.account_suspended": "Cuenta suspendida",
|
||||||
"empty_column.account_timeline": "¡No hay publicaciones aquí!",
|
"empty_column.account_timeline": "¡No hay toots aquí!",
|
||||||
"empty_column.account_unavailable": "Perfil no disponible",
|
"empty_column.account_unavailable": "Perfil no disponible",
|
||||||
"empty_column.blocks": "Aún no has bloqueado a ningún usuario.",
|
"empty_column.blocks": "Aún no has bloqueado a ningún usuario.",
|
||||||
"empty_column.bookmarked_statuses": "Aún no tienes ninguna publicación guardada como marcador. Cuando guardes una, se mostrará aquí.",
|
"empty_column.bookmarked_statuses": "Aún no tienes ningún toot guardado como marcador. Cuando guardes uno, se mostrará aquí.",
|
||||||
"empty_column.community": "La línea de tiempo local está vacía. ¡Escribe algo para empezar la fiesta!",
|
"empty_column.community": "La línea de tiempo local está vacía. ¡Escribe algo para empezar la fiesta!",
|
||||||
"empty_column.direct": "Aún no tienes menciones privadas. Cuando envíes o recibas una, aparecerán aquí.",
|
"empty_column.direct": "Aún no tienes menciones privadas. Cuando envíes o recibas una, aparecerán aquí.",
|
||||||
"empty_column.domain_blocks": "Todavía no hay dominios ocultos.",
|
"empty_column.domain_blocks": "Todavía no hay dominios ocultos.",
|
||||||
|
@ -266,8 +266,8 @@
|
||||||
"empty_column.favourited_statuses": "Todavía no tienes publicaciones favoritas. Cuando le des favorito a una publicación se mostrarán acá.",
|
"empty_column.favourited_statuses": "Todavía no tienes publicaciones favoritas. Cuando le des favorito a una publicación se mostrarán acá.",
|
||||||
"empty_column.favourites": "Todavía nadie marcó como favorito esta publicación. Cuando alguien lo haga, se mostrará aquí.",
|
"empty_column.favourites": "Todavía nadie marcó como favorito esta publicación. Cuando alguien lo haga, se mostrará aquí.",
|
||||||
"empty_column.follow_requests": "No tienes ninguna petición de seguidor. Cuando recibas una, se mostrará aquí.",
|
"empty_column.follow_requests": "No tienes ninguna petición de seguidor. Cuando recibas una, se mostrará aquí.",
|
||||||
"empty_column.followed_tags": "No estás siguiendo ninguna etiqueta todavía. Cuando lo hagas, aparecerá aquí.",
|
"empty_column.followed_tags": "No estás siguiendo ningún hashtag todavía. Cuando lo hagas, aparecerá aquí.",
|
||||||
"empty_column.hashtag": "No hay nada en esta etiqueta aún.",
|
"empty_column.hashtag": "No hay nada en este hashtag aún.",
|
||||||
"empty_column.home": "No estás siguiendo a nadie aún. Visita {public} o haz búsquedas para empezar y conocer gente nueva.",
|
"empty_column.home": "No estás siguiendo a nadie aún. Visita {public} o haz búsquedas para empezar y conocer gente nueva.",
|
||||||
"empty_column.list": "No hay nada en esta lista aún. Cuando miembros de esta lista publiquen nuevos estatus, estos aparecerán qui.",
|
"empty_column.list": "No hay nada en esta lista aún. Cuando miembros de esta lista publiquen nuevos estatus, estos aparecerán qui.",
|
||||||
"empty_column.lists": "No tienes ninguna lista. cuando crees una, se mostrará aquí.",
|
"empty_column.lists": "No tienes ninguna lista. cuando crees una, se mostrará aquí.",
|
||||||
|
@ -304,7 +304,7 @@
|
||||||
"filter_modal.select_filter.title": "Filtrar esta publicación",
|
"filter_modal.select_filter.title": "Filtrar esta publicación",
|
||||||
"filter_modal.title.status": "Filtrar una publicación",
|
"filter_modal.title.status": "Filtrar una publicación",
|
||||||
"filter_warning.matches_filter": "Coincide con el filtro “{title}”",
|
"filter_warning.matches_filter": "Coincide con el filtro “{title}”",
|
||||||
"filtered_notifications_banner.pending_requests": "De {count, plural, =0 {nadie} one {una persona} other {# people}} que puede que tú conozcas",
|
"filtered_notifications_banner.pending_requests": "De {count, plural, =0 {nadie} one {una persona} other {# personas}} que puede que conozcas",
|
||||||
"filtered_notifications_banner.title": "Notificaciones filtradas",
|
"filtered_notifications_banner.title": "Notificaciones filtradas",
|
||||||
"firehose.all": "Todas",
|
"firehose.all": "Todas",
|
||||||
"firehose.local": "Este servidor",
|
"firehose.local": "Este servidor",
|
||||||
|
@ -315,7 +315,7 @@
|
||||||
"follow_suggestions.curated_suggestion": "Recomendaciones del equipo",
|
"follow_suggestions.curated_suggestion": "Recomendaciones del equipo",
|
||||||
"follow_suggestions.dismiss": "No mostrar de nuevo",
|
"follow_suggestions.dismiss": "No mostrar de nuevo",
|
||||||
"follow_suggestions.featured_longer": "Escogidos por el equipo de {domain}",
|
"follow_suggestions.featured_longer": "Escogidos por el equipo de {domain}",
|
||||||
"follow_suggestions.friends_of_friends_longer": "Popular entre las personas a las que sigues",
|
"follow_suggestions.friends_of_friends_longer": "Populares entre las personas a las que sigues",
|
||||||
"follow_suggestions.hints.featured": "Este perfil ha sido seleccionado a mano por el equipo de {domain}.",
|
"follow_suggestions.hints.featured": "Este perfil ha sido seleccionado a mano por el equipo de {domain}.",
|
||||||
"follow_suggestions.hints.friends_of_friends": "Este perfil es popular entre las personas que sigues.",
|
"follow_suggestions.hints.friends_of_friends": "Este perfil es popular entre las personas que sigues.",
|
||||||
"follow_suggestions.hints.most_followed": "Este perfil es uno de los más seguidos en {domain}.",
|
"follow_suggestions.hints.most_followed": "Este perfil es uno de los más seguidos en {domain}.",
|
||||||
|
@ -323,11 +323,11 @@
|
||||||
"follow_suggestions.hints.similar_to_recently_followed": "Este perfil es similar a los perfiles que has seguido recientemente.",
|
"follow_suggestions.hints.similar_to_recently_followed": "Este perfil es similar a los perfiles que has seguido recientemente.",
|
||||||
"follow_suggestions.personalized_suggestion": "Sugerencia personalizada",
|
"follow_suggestions.personalized_suggestion": "Sugerencia personalizada",
|
||||||
"follow_suggestions.popular_suggestion": "Sugerencia popular",
|
"follow_suggestions.popular_suggestion": "Sugerencia popular",
|
||||||
"follow_suggestions.popular_suggestion_longer": "Popular en {domain}",
|
"follow_suggestions.popular_suggestion_longer": "Populares en {domain}",
|
||||||
"follow_suggestions.similar_to_recently_followed_longer": "Similares a los perfiles que has seguido recientemente",
|
"follow_suggestions.similar_to_recently_followed_longer": "Similares a los perfiles que has seguido recientemente",
|
||||||
"follow_suggestions.view_all": "Ver todo",
|
"follow_suggestions.view_all": "Ver todo",
|
||||||
"follow_suggestions.who_to_follow": "Recomendamos seguir",
|
"follow_suggestions.who_to_follow": "Recomendamos seguir",
|
||||||
"followed_tags": "Etiquetas seguidas",
|
"followed_tags": "Hashtags seguidos",
|
||||||
"footer.about": "Acerca de",
|
"footer.about": "Acerca de",
|
||||||
"footer.directory": "Directorio de perfiles",
|
"footer.directory": "Directorio de perfiles",
|
||||||
"footer.get_app": "Obtener la aplicación",
|
"footer.get_app": "Obtener la aplicación",
|
||||||
|
@ -344,8 +344,8 @@
|
||||||
"hashtag.column_settings.select.no_options_message": "No se encontraron sugerencias",
|
"hashtag.column_settings.select.no_options_message": "No se encontraron sugerencias",
|
||||||
"hashtag.column_settings.select.placeholder": "Introducir etiquetas…",
|
"hashtag.column_settings.select.placeholder": "Introducir etiquetas…",
|
||||||
"hashtag.column_settings.tag_mode.all": "Todos estos",
|
"hashtag.column_settings.tag_mode.all": "Todos estos",
|
||||||
"hashtag.column_settings.tag_mode.any": "Cualquiera de estas",
|
"hashtag.column_settings.tag_mode.any": "Cualquiera de estos",
|
||||||
"hashtag.column_settings.tag_mode.none": "Ninguna de estas",
|
"hashtag.column_settings.tag_mode.none": "Ninguno de estos",
|
||||||
"hashtag.column_settings.tag_toggle": "Incluye etiquetas adicionales para esta columna",
|
"hashtag.column_settings.tag_toggle": "Incluye etiquetas adicionales para esta columna",
|
||||||
"hashtag.counter_by_accounts": "{count, plural, one {{counter} participante} other {{counter} participantes}}",
|
"hashtag.counter_by_accounts": "{count, plural, one {{counter} participante} other {{counter} participantes}}",
|
||||||
"hashtag.counter_by_uses": "{count, plural, one {{counter} publicación} other {{counter} publicaciones}}",
|
"hashtag.counter_by_uses": "{count, plural, one {{counter} publicación} other {{counter} publicaciones}}",
|
||||||
|
@ -361,7 +361,7 @@
|
||||||
"hints.profiles.see_more_posts": "Ver más publicaciones en {domain}",
|
"hints.profiles.see_more_posts": "Ver más publicaciones en {domain}",
|
||||||
"hints.threads.replies_may_be_missing": "Puede que no se muestren algunas respuestas de otros servidores.",
|
"hints.threads.replies_may_be_missing": "Puede que no se muestren algunas respuestas de otros servidores.",
|
||||||
"hints.threads.see_more": "Ver más respuestas en {domain}",
|
"hints.threads.see_more": "Ver más respuestas en {domain}",
|
||||||
"home.column_settings.show_reblogs": "Mostrar impulsos",
|
"home.column_settings.show_reblogs": "Mostrar retoots",
|
||||||
"home.column_settings.show_replies": "Mostrar respuestas",
|
"home.column_settings.show_replies": "Mostrar respuestas",
|
||||||
"home.hide_announcements": "Ocultar anuncios",
|
"home.hide_announcements": "Ocultar anuncios",
|
||||||
"home.pending_critical_update.body": "¡Por favor actualiza tu servidor Mastodon lo antes posible!",
|
"home.pending_critical_update.body": "¡Por favor actualiza tu servidor Mastodon lo antes posible!",
|
||||||
|
@ -369,14 +369,14 @@
|
||||||
"home.pending_critical_update.title": "¡Actualización de seguridad crítica disponible!",
|
"home.pending_critical_update.title": "¡Actualización de seguridad crítica disponible!",
|
||||||
"home.show_announcements": "Mostrar anuncios",
|
"home.show_announcements": "Mostrar anuncios",
|
||||||
"ignore_notifications_modal.disclaimer": "Mastodon no puede informar a los usuarios que has ignorado sus notificaciones. Ignorar notificaciones no impedirá que se sigan enviando los mensajes.",
|
"ignore_notifications_modal.disclaimer": "Mastodon no puede informar a los usuarios que has ignorado sus notificaciones. Ignorar notificaciones no impedirá que se sigan enviando los mensajes.",
|
||||||
"ignore_notifications_modal.filter_instead": "Filtrar en su lugar",
|
"ignore_notifications_modal.filter_instead": "Filtrar en vez de ignorar",
|
||||||
"ignore_notifications_modal.filter_to_act_users": "Aún podrás aceptar, rechazar o reportar usuarios",
|
"ignore_notifications_modal.filter_to_act_users": "Aún podrás aceptar, rechazar o reportar usuarios",
|
||||||
"ignore_notifications_modal.filter_to_avoid_confusion": "Filtrar ayuda a evitar confusiones potenciales",
|
"ignore_notifications_modal.filter_to_avoid_confusion": "Filtrar ayuda a evitar confusiones potenciales",
|
||||||
"ignore_notifications_modal.filter_to_review_separately": "Puedes revisar las notificaciones filtradas por separado",
|
"ignore_notifications_modal.filter_to_review_separately": "Puedes revisar las notificaciones filtradas por separado",
|
||||||
"ignore_notifications_modal.ignore": "Ignorar notificaciones",
|
"ignore_notifications_modal.ignore": "Ignorar notificaciones",
|
||||||
"ignore_notifications_modal.limited_accounts_title": "¿Ignorar notificaciones de cuentas moderadas?",
|
"ignore_notifications_modal.limited_accounts_title": "¿Ignorar notificaciones de cuentas moderadas?",
|
||||||
"ignore_notifications_modal.new_accounts_title": "¿Ignorar notificaciones de cuentas nuevas?",
|
"ignore_notifications_modal.new_accounts_title": "¿Ignorar notificaciones de cuentas nuevas?",
|
||||||
"ignore_notifications_modal.not_followers_title": "¿Ignorar notificaciones de personas que no te siguen?",
|
"ignore_notifications_modal.not_followers_title": "¿Ignorar notificaciones de personas que no te sigue?",
|
||||||
"ignore_notifications_modal.not_following_title": "¿Ignorar notificaciones de personas a las que no sigues?",
|
"ignore_notifications_modal.not_following_title": "¿Ignorar notificaciones de personas a las que no sigues?",
|
||||||
"ignore_notifications_modal.private_mentions_title": "¿Ignorar notificaciones de menciones privadas no solicitadas?",
|
"ignore_notifications_modal.private_mentions_title": "¿Ignorar notificaciones de menciones privadas no solicitadas?",
|
||||||
"interaction_modal.description.favourite": "Con una cuenta en Mastodon, puedes marcar como favorita esta publicación para que el autor sepa que te gusta, y guardala para más adelante.",
|
"interaction_modal.description.favourite": "Con una cuenta en Mastodon, puedes marcar como favorita esta publicación para que el autor sepa que te gusta, y guardala para más adelante.",
|
||||||
|
@ -399,13 +399,13 @@
|
||||||
"intervals.full.minutes": "{number, plural, one {# minuto} other {# minutos}}",
|
"intervals.full.minutes": "{number, plural, one {# minuto} other {# minutos}}",
|
||||||
"keyboard_shortcuts.back": "volver atrás",
|
"keyboard_shortcuts.back": "volver atrás",
|
||||||
"keyboard_shortcuts.blocked": "abrir una lista de usuarios bloqueados",
|
"keyboard_shortcuts.blocked": "abrir una lista de usuarios bloqueados",
|
||||||
"keyboard_shortcuts.boost": "Impulsar publicación",
|
"keyboard_shortcuts.boost": "retootear",
|
||||||
"keyboard_shortcuts.column": "enfocar un estado en una de las columnas",
|
"keyboard_shortcuts.column": "enfocar un estado en una de las columnas",
|
||||||
"keyboard_shortcuts.compose": "enfocar el área de texto de redacción",
|
"keyboard_shortcuts.compose": "enfocar el área de texto de redacción",
|
||||||
"keyboard_shortcuts.description": "Descripción",
|
"keyboard_shortcuts.description": "Descripción",
|
||||||
"keyboard_shortcuts.direct": "para abrir la columna de menciones privadas",
|
"keyboard_shortcuts.direct": "para abrir la columna de menciones privadas",
|
||||||
"keyboard_shortcuts.down": "mover hacia abajo en la lista",
|
"keyboard_shortcuts.down": "mover hacia abajo en la lista",
|
||||||
"keyboard_shortcuts.enter": "Abrir publicación",
|
"keyboard_shortcuts.enter": "abrir estado",
|
||||||
"keyboard_shortcuts.favourite": "Marcar como favorita la publicación",
|
"keyboard_shortcuts.favourite": "Marcar como favorita la publicación",
|
||||||
"keyboard_shortcuts.favourites": "Abrir lista de favoritos",
|
"keyboard_shortcuts.favourites": "Abrir lista de favoritos",
|
||||||
"keyboard_shortcuts.federated": "abrir el timeline federado",
|
"keyboard_shortcuts.federated": "abrir el timeline federado",
|
||||||
|
@ -419,23 +419,23 @@
|
||||||
"keyboard_shortcuts.my_profile": "abrir tu perfil",
|
"keyboard_shortcuts.my_profile": "abrir tu perfil",
|
||||||
"keyboard_shortcuts.notifications": "abrir la columna de notificaciones",
|
"keyboard_shortcuts.notifications": "abrir la columna de notificaciones",
|
||||||
"keyboard_shortcuts.open_media": "para abrir archivos multimedia",
|
"keyboard_shortcuts.open_media": "para abrir archivos multimedia",
|
||||||
"keyboard_shortcuts.pinned": "Abrir la lista de publicaciones fijadas",
|
"keyboard_shortcuts.pinned": "abrir la lista de toots destacados",
|
||||||
"keyboard_shortcuts.profile": "abrir el perfil del autor",
|
"keyboard_shortcuts.profile": "abrir el perfil del autor",
|
||||||
"keyboard_shortcuts.reply": "Responder a la publicación",
|
"keyboard_shortcuts.reply": "para responder",
|
||||||
"keyboard_shortcuts.requests": "abrir la lista de peticiones de seguidores",
|
"keyboard_shortcuts.requests": "abrir la lista de peticiones de seguidores",
|
||||||
"keyboard_shortcuts.search": "para poner el foco en la búsqueda",
|
"keyboard_shortcuts.search": "para poner el foco en la búsqueda",
|
||||||
"keyboard_shortcuts.spoilers": "para mostrar/ocultar el campo CW",
|
"keyboard_shortcuts.spoilers": "para mostrar/ocultar el campo CW",
|
||||||
"keyboard_shortcuts.start": "abrir la columna \"comenzar\"",
|
"keyboard_shortcuts.start": "abrir la columna \"comenzar\"",
|
||||||
"keyboard_shortcuts.toggle_hidden": "mostrar/ocultar texto tras aviso de contenido (CW)",
|
"keyboard_shortcuts.toggle_hidden": "mostrar/ocultar texto tras aviso de contenido (CW)",
|
||||||
"keyboard_shortcuts.toggle_sensitivity": "mostrar/ocultar medios",
|
"keyboard_shortcuts.toggle_sensitivity": "mostrar/ocultar medios",
|
||||||
"keyboard_shortcuts.toot": "Comenzar una nueva publicación",
|
"keyboard_shortcuts.toot": "para comenzar un nuevo toot",
|
||||||
"keyboard_shortcuts.unfocus": "para retirar el foco de la caja de redacción/búsqueda",
|
"keyboard_shortcuts.unfocus": "para retirar el foco de la caja de redacción/búsqueda",
|
||||||
"keyboard_shortcuts.up": "para ir hacia arriba en la lista",
|
"keyboard_shortcuts.up": "para ir hacia arriba en la lista",
|
||||||
"lightbox.close": "Cerrar",
|
"lightbox.close": "Cerrar",
|
||||||
|
"lightbox.compress": "Comprimir cuadro de visualización de imagen",
|
||||||
|
"lightbox.expand": "Expandir cuadro de visualización de imagen",
|
||||||
"lightbox.next": "Siguiente",
|
"lightbox.next": "Siguiente",
|
||||||
"lightbox.previous": "Anterior",
|
"lightbox.previous": "Anterior",
|
||||||
"lightbox.zoom_in": "Ampliar al tamaño real",
|
|
||||||
"lightbox.zoom_out": "Ampliar para ajustar",
|
|
||||||
"limited_account_hint.action": "Mostrar perfil de todos modos",
|
"limited_account_hint.action": "Mostrar perfil de todos modos",
|
||||||
"limited_account_hint.title": "Este perfil ha sido ocultado por los moderadores de {domain}.",
|
"limited_account_hint.title": "Este perfil ha sido ocultado por los moderadores de {domain}.",
|
||||||
"link_preview.author": "Por {name}",
|
"link_preview.author": "Por {name}",
|
||||||
|
@ -474,7 +474,7 @@
|
||||||
"navigation_bar.blocks": "Usuarios bloqueados",
|
"navigation_bar.blocks": "Usuarios bloqueados",
|
||||||
"navigation_bar.bookmarks": "Marcadores",
|
"navigation_bar.bookmarks": "Marcadores",
|
||||||
"navigation_bar.community_timeline": "Historia local",
|
"navigation_bar.community_timeline": "Historia local",
|
||||||
"navigation_bar.compose": "Redactar una nueva publicación",
|
"navigation_bar.compose": "Escribir un nuevo toot",
|
||||||
"navigation_bar.direct": "Menciones privadas",
|
"navigation_bar.direct": "Menciones privadas",
|
||||||
"navigation_bar.discover": "Descubrir",
|
"navigation_bar.discover": "Descubrir",
|
||||||
"navigation_bar.domain_blocks": "Dominios ocultos",
|
"navigation_bar.domain_blocks": "Dominios ocultos",
|
||||||
|
@ -482,7 +482,7 @@
|
||||||
"navigation_bar.favourites": "Favoritos",
|
"navigation_bar.favourites": "Favoritos",
|
||||||
"navigation_bar.filters": "Palabras silenciadas",
|
"navigation_bar.filters": "Palabras silenciadas",
|
||||||
"navigation_bar.follow_requests": "Solicitudes para seguirte",
|
"navigation_bar.follow_requests": "Solicitudes para seguirte",
|
||||||
"navigation_bar.followed_tags": "Etiquetas seguidas",
|
"navigation_bar.followed_tags": "Hashtags seguidos",
|
||||||
"navigation_bar.follows_and_followers": "Siguiendo y seguidores",
|
"navigation_bar.follows_and_followers": "Siguiendo y seguidores",
|
||||||
"navigation_bar.lists": "Listas",
|
"navigation_bar.lists": "Listas",
|
||||||
"navigation_bar.logout": "Cerrar sesión",
|
"navigation_bar.logout": "Cerrar sesión",
|
||||||
|
@ -490,25 +490,25 @@
|
||||||
"navigation_bar.mutes": "Usuarios silenciados",
|
"navigation_bar.mutes": "Usuarios silenciados",
|
||||||
"navigation_bar.opened_in_classic_interface": "Publicaciones, cuentas y otras páginas específicas se abren por defecto en la interfaz web clásica.",
|
"navigation_bar.opened_in_classic_interface": "Publicaciones, cuentas y otras páginas específicas se abren por defecto en la interfaz web clásica.",
|
||||||
"navigation_bar.personal": "Personal",
|
"navigation_bar.personal": "Personal",
|
||||||
"navigation_bar.pins": "Publicaciones fijadas",
|
"navigation_bar.pins": "Toots fijados",
|
||||||
"navigation_bar.preferences": "Preferencias",
|
"navigation_bar.preferences": "Preferencias",
|
||||||
"navigation_bar.public_timeline": "Historia federada",
|
"navigation_bar.public_timeline": "Historia federada",
|
||||||
"navigation_bar.search": "Buscar",
|
"navigation_bar.search": "Buscar",
|
||||||
"navigation_bar.security": "Seguridad",
|
"navigation_bar.security": "Seguridad",
|
||||||
"not_signed_in_indicator.not_signed_in": "Necesitas iniciar sesión para acceder a este recurso.",
|
"not_signed_in_indicator.not_signed_in": "Necesitas iniciar sesión para acceder a este recurso.",
|
||||||
"notification.admin.report": "{name} denunció a {target}",
|
"notification.admin.report": "{name} denunció a {target}",
|
||||||
"notification.admin.report_account": "{name} reportó {count, plural, one {una publicación} other {# publicaciones}} de {target} por {category}",
|
"notification.admin.report_account": "{name} informó de {count, plural, one {una publicación} other {# publicaciones}} de {target} por {category}",
|
||||||
"notification.admin.report_account_other": "{name} reportó {count, plural, one {una publicación} other {# publicaciones}} de {target}",
|
"notification.admin.report_account_other": "{name} informó de {count, plural, one {una publicación} other {# publicaciones}} de {target}",
|
||||||
"notification.admin.report_statuses": "{name} reportó {target} por {category}",
|
"notification.admin.report_statuses": "{name} informó de {target} por {category}",
|
||||||
"notification.admin.report_statuses_other": "{name} reportó {target}",
|
"notification.admin.report_statuses_other": "{name} informó de {target}",
|
||||||
"notification.admin.sign_up": "{name} se unio",
|
"notification.admin.sign_up": "{name} se unio",
|
||||||
"notification.admin.sign_up.name_and_others": "{name} y {count, plural, one {# otro} other {# otros}} se registraron",
|
"notification.admin.sign_up.name_and_others": "{name} y {count, plural, one {# más} other {# más}} se registraron",
|
||||||
"notification.favourite": "{name} marcó como favorita tu publicación",
|
"notification.favourite": "{name} marcó como favorita tu publicación",
|
||||||
"notification.favourite.name_and_others_with_link": "{name} y <a>{count, plural, one {# otro} other {# otros}}</a> marcaron tu publicación como favorita",
|
"notification.favourite.name_and_others_with_link": "{name} y <a>{count, plural, one {# más} other {# más}}</a> marcaron tu publicación como favorita",
|
||||||
"notification.follow": "{name} te empezó a seguir",
|
"notification.follow": "{name} te empezó a seguir",
|
||||||
"notification.follow.name_and_others": "{name} y {count, plural, one {# otro} other {# otros}} te siguieron",
|
"notification.follow.name_and_others": "{name} y {count, plural, one {# más} other {# más}} te siguieron",
|
||||||
"notification.follow_request": "{name} ha solicitado seguirte",
|
"notification.follow_request": "{name} ha solicitado seguirte",
|
||||||
"notification.follow_request.name_and_others": "{name} y {count, plural, one {# otro} other {# otros}} han solicitado seguirte",
|
"notification.follow_request.name_and_others": "{name} y {count, plural, one {# más} other {# más}} han solicitado seguirte",
|
||||||
"notification.label.mention": "Mención",
|
"notification.label.mention": "Mención",
|
||||||
"notification.label.private_mention": "Mención privada",
|
"notification.label.private_mention": "Mención privada",
|
||||||
"notification.label.private_reply": "Respuesta privada",
|
"notification.label.private_reply": "Respuesta privada",
|
||||||
|
@ -519,14 +519,14 @@
|
||||||
"notification.moderation_warning.action_delete_statuses": "Se han eliminado algunas de tus publicaciones.",
|
"notification.moderation_warning.action_delete_statuses": "Se han eliminado algunas de tus publicaciones.",
|
||||||
"notification.moderation_warning.action_disable": "Tu cuenta ha sido desactivada.",
|
"notification.moderation_warning.action_disable": "Tu cuenta ha sido desactivada.",
|
||||||
"notification.moderation_warning.action_mark_statuses_as_sensitive": "Se han marcado como sensibles algunas de tus publicaciones.",
|
"notification.moderation_warning.action_mark_statuses_as_sensitive": "Se han marcado como sensibles algunas de tus publicaciones.",
|
||||||
"notification.moderation_warning.action_none": "Tu cuenta ha recibido una advertencia de moderación.",
|
"notification.moderation_warning.action_none": "Tu cuenta ha recibido un aviso de moderación.",
|
||||||
"notification.moderation_warning.action_sensitive": "De ahora en adelante, todas tus publicaciones se marcarán como sensibles.",
|
"notification.moderation_warning.action_sensitive": "De ahora en adelante, todas tus publicaciones se marcarán como sensibles.",
|
||||||
"notification.moderation_warning.action_silence": "Tu cuenta ha sido limitada.",
|
"notification.moderation_warning.action_silence": "Tu cuenta ha sido limitada.",
|
||||||
"notification.moderation_warning.action_suspend": "Tu cuenta ha sido suspendida.",
|
"notification.moderation_warning.action_suspend": "Tu cuenta ha sido suspendida.",
|
||||||
"notification.own_poll": "Tu encuesta ha terminado",
|
"notification.own_poll": "Tu encuesta ha terminado",
|
||||||
"notification.poll": "Una encuesta en la que has votado ha terminado",
|
"notification.poll": "Una encuesta ha terminado",
|
||||||
"notification.reblog": "{name} ha impulsado tu publicación",
|
"notification.reblog": "{name} ha retooteado tu estado",
|
||||||
"notification.reblog.name_and_others_with_link": "{name} y <a>{count, plural, one {# otro} other {# otros}}</a> impulsaron tu publicación",
|
"notification.reblog.name_and_others_with_link": "{name} y <a>{count, plural, one {# más} other {# más}}</a> impulsaron tu publicación",
|
||||||
"notification.relationships_severance_event": "Conexiones perdidas con {name}",
|
"notification.relationships_severance_event": "Conexiones perdidas con {name}",
|
||||||
"notification.relationships_severance_event.account_suspension": "Un administrador de {from} ha suspendido {target}, lo que significa que ya no puedes recibir actualizaciones de sus cuentas o interactuar con ellas.",
|
"notification.relationships_severance_event.account_suspension": "Un administrador de {from} ha suspendido {target}, lo que significa que ya no puedes recibir actualizaciones de sus cuentas o interactuar con ellas.",
|
||||||
"notification.relationships_severance_event.domain_block": "Un administrador de {from} ha bloqueado {target}, incluyendo {followersCount} de tus seguidores y {followingCount, plural, one {# cuenta} other {# cuentas}} que sigues.",
|
"notification.relationships_severance_event.domain_block": "Un administrador de {from} ha bloqueado {target}, incluyendo {followersCount} de tus seguidores y {followingCount, plural, one {# cuenta} other {# cuentas}} que sigues.",
|
||||||
|
@ -536,18 +536,18 @@
|
||||||
"notification.update": "{name} editó una publicación",
|
"notification.update": "{name} editó una publicación",
|
||||||
"notification_requests.accept": "Aceptar",
|
"notification_requests.accept": "Aceptar",
|
||||||
"notification_requests.accept_multiple": "{count, plural, one {Aceptar # solicitud…} other {Aceptar # solicitudes…}}",
|
"notification_requests.accept_multiple": "{count, plural, one {Aceptar # solicitud…} other {Aceptar # solicitudes…}}",
|
||||||
"notification_requests.confirm_accept_multiple.button": "{count, plural, one {Solicitud aceptada} other {Solicitudes aceptadas}}",
|
"notification_requests.confirm_accept_multiple.button": "{count, plural, one {Aceptar solicitud} other {Aceptar solicitudes}}",
|
||||||
"notification_requests.confirm_accept_multiple.message": "Estás por aceptar {count, plural, one {una solicitud de notificación} other {# solicitudes de notificación}}. ¿Estás seguro de que quieres continuar?",
|
"notification_requests.confirm_accept_multiple.message": "Vas a aceptar {count, plural, one {una solicitud} other {# solicitudes}}. ¿Quieres continuar?",
|
||||||
"notification_requests.confirm_accept_multiple.title": "¿Deseas aceptar las solicitudes de notificación?",
|
"notification_requests.confirm_accept_multiple.title": "¿Aceptar las solicitudes?",
|
||||||
"notification_requests.confirm_dismiss_multiple.button": "{count, plural, one {Solicitud descartada} other {Solicitudes descartadas}}",
|
"notification_requests.confirm_dismiss_multiple.button": "{count, plural, one {Descartar solicitud} other {Descartar solicitudes}}",
|
||||||
"notification_requests.confirm_dismiss_multiple.message": "Estás por descartar {count, plural, one {una solicitud de notificación} other {# solicitudes de notificación}}. No serás capaz de acceder fácilmente a {count, plural, one {ella} other {ellas}} de nuevo. ¿Estás seguro de que quieres continuar?",
|
"notification_requests.confirm_dismiss_multiple.message": "Vas a descartar {count, plural, one {una solicitud} other {# solicitudes}}. No podrás volver a acceder fácilmente a {count, plural, one {ella} other {ellas}} de nuevo. ¿Seguro que quieres continuar?",
|
||||||
"notification_requests.confirm_dismiss_multiple.title": "¿Deseas descartar las solicitudes de notificación?",
|
"notification_requests.confirm_dismiss_multiple.title": "¿Descartar las solicitudes?",
|
||||||
"notification_requests.dismiss": "Descartar",
|
"notification_requests.dismiss": "Descartar",
|
||||||
"notification_requests.dismiss_multiple": "{count, plural, one {Descartar # solicitud…} other {Descartar # solicitudes…}}",
|
"notification_requests.dismiss_multiple": "{count, plural, one {Descartar # solicitud…} other {Descartar # solicitudes…}}",
|
||||||
"notification_requests.edit_selection": "Editar",
|
"notification_requests.edit_selection": "Editar",
|
||||||
"notification_requests.exit_selection": "Hecho",
|
"notification_requests.exit_selection": "Hecho",
|
||||||
"notification_requests.explainer_for_limited_account": "Las notificaciones de esta cuenta han sido filtradas, ya que la cuenta ha sido limitada por un moderador.",
|
"notification_requests.explainer_for_limited_account": "Las notificaciones de esta cuenta han sido filtradas porque la cuenta ha sido limitada por un moderador.",
|
||||||
"notification_requests.explainer_for_limited_remote_account": "Las notificaciones de esta cuenta han sido filtradas, ya que la cuenta o su servidor ha sido limitada por un moderador.",
|
"notification_requests.explainer_for_limited_remote_account": "Las notificaciones de esta cuenta han sido filtradas porque la cuenta o su servidor ha sido limitada por un moderador.",
|
||||||
"notification_requests.maximize": "Maximizar",
|
"notification_requests.maximize": "Maximizar",
|
||||||
"notification_requests.minimize_banner": "Minimizar banner de notificaciones filtradas",
|
"notification_requests.minimize_banner": "Minimizar banner de notificaciones filtradas",
|
||||||
"notification_requests.notifications_from": "Notificaciones de {name}",
|
"notification_requests.notifications_from": "Notificaciones de {name}",
|
||||||
|
@ -555,10 +555,12 @@
|
||||||
"notification_requests.view": "Ver notificaciones",
|
"notification_requests.view": "Ver notificaciones",
|
||||||
"notifications.clear": "Limpiar notificaciones",
|
"notifications.clear": "Limpiar notificaciones",
|
||||||
"notifications.clear_confirmation": "¿Seguro de querer borrar permanentemente todas tus notificaciones?",
|
"notifications.clear_confirmation": "¿Seguro de querer borrar permanentemente todas tus notificaciones?",
|
||||||
"notifications.clear_title": "¿Limpiar notificaciones?",
|
"notifications.clear_title": "¿Borrar notificaciones?",
|
||||||
"notifications.column_settings.admin.report": "Nuevas denuncias:",
|
"notifications.column_settings.admin.report": "Nuevas denuncias:",
|
||||||
"notifications.column_settings.admin.sign_up": "Registros nuevos:",
|
"notifications.column_settings.admin.sign_up": "Registros nuevos:",
|
||||||
"notifications.column_settings.alert": "Notificaciones de escritorio",
|
"notifications.column_settings.alert": "Notificaciones de escritorio",
|
||||||
|
"notifications.column_settings.beta.category": "Características experimentales",
|
||||||
|
"notifications.column_settings.beta.grouping": "Agrupar notificaciones",
|
||||||
"notifications.column_settings.favourite": "Favoritos:",
|
"notifications.column_settings.favourite": "Favoritos:",
|
||||||
"notifications.column_settings.filter_bar.advanced": "Mostrar todas las categorías",
|
"notifications.column_settings.filter_bar.advanced": "Mostrar todas las categorías",
|
||||||
"notifications.column_settings.filter_bar.category": "Barra de filtrado rápido",
|
"notifications.column_settings.filter_bar.category": "Barra de filtrado rápido",
|
||||||
|
@ -567,7 +569,7 @@
|
||||||
"notifications.column_settings.mention": "Menciones:",
|
"notifications.column_settings.mention": "Menciones:",
|
||||||
"notifications.column_settings.poll": "Resultados de la votación:",
|
"notifications.column_settings.poll": "Resultados de la votación:",
|
||||||
"notifications.column_settings.push": "Notificaciones push",
|
"notifications.column_settings.push": "Notificaciones push",
|
||||||
"notifications.column_settings.reblog": "Impulsos:",
|
"notifications.column_settings.reblog": "Retoots:",
|
||||||
"notifications.column_settings.show": "Mostrar en columna",
|
"notifications.column_settings.show": "Mostrar en columna",
|
||||||
"notifications.column_settings.sound": "Reproducir sonido",
|
"notifications.column_settings.sound": "Reproducir sonido",
|
||||||
"notifications.column_settings.status": "Nuevas publicaciones:",
|
"notifications.column_settings.status": "Nuevas publicaciones:",
|
||||||
|
@ -575,7 +577,7 @@
|
||||||
"notifications.column_settings.unread_notifications.highlight": "Destacar notificaciones no leídas",
|
"notifications.column_settings.unread_notifications.highlight": "Destacar notificaciones no leídas",
|
||||||
"notifications.column_settings.update": "Ediciones:",
|
"notifications.column_settings.update": "Ediciones:",
|
||||||
"notifications.filter.all": "Todos",
|
"notifications.filter.all": "Todos",
|
||||||
"notifications.filter.boosts": "Impulsos",
|
"notifications.filter.boosts": "Retoots",
|
||||||
"notifications.filter.favourites": "Favoritos",
|
"notifications.filter.favourites": "Favoritos",
|
||||||
"notifications.filter.follows": "Seguidores",
|
"notifications.filter.follows": "Seguidores",
|
||||||
"notifications.filter.mentions": "Menciones",
|
"notifications.filter.mentions": "Menciones",
|
||||||
|
@ -621,7 +623,7 @@
|
||||||
"onboarding.profile.display_name_hint": "Tu nombre completo o tu apodo…",
|
"onboarding.profile.display_name_hint": "Tu nombre completo o tu apodo…",
|
||||||
"onboarding.profile.lead": "Siempre puedes completar esto más tarde en los ajustes, donde hay aún más opciones de personalización disponibles.",
|
"onboarding.profile.lead": "Siempre puedes completar esto más tarde en los ajustes, donde hay aún más opciones de personalización disponibles.",
|
||||||
"onboarding.profile.note": "Biografía",
|
"onboarding.profile.note": "Biografía",
|
||||||
"onboarding.profile.note_hint": "Puedes @mencionar a otras personas o #etiquetas…",
|
"onboarding.profile.note_hint": "Puedes @mencionar a otras personas o #hashtags…",
|
||||||
"onboarding.profile.save_and_continue": "Guardar y continuar",
|
"onboarding.profile.save_and_continue": "Guardar y continuar",
|
||||||
"onboarding.profile.title": "Configuración del perfil",
|
"onboarding.profile.title": "Configuración del perfil",
|
||||||
"onboarding.profile.upload_avatar": "Subir foto de perfil",
|
"onboarding.profile.upload_avatar": "Subir foto de perfil",
|
||||||
|
@ -639,7 +641,7 @@
|
||||||
"onboarding.steps.publish_status.title": "Escribe tu primera publicación",
|
"onboarding.steps.publish_status.title": "Escribe tu primera publicación",
|
||||||
"onboarding.steps.setup_profile.body": "Si rellenas tu perfil tendrás más posibilidades de que otros interactúen contigo.",
|
"onboarding.steps.setup_profile.body": "Si rellenas tu perfil tendrás más posibilidades de que otros interactúen contigo.",
|
||||||
"onboarding.steps.setup_profile.title": "Personaliza tu perfil",
|
"onboarding.steps.setup_profile.title": "Personaliza tu perfil",
|
||||||
"onboarding.steps.share_profile.body": "Dile a tus amigos cómo encontrarte en Mastodon",
|
"onboarding.steps.share_profile.body": "¡Dile a tus amigos cómo encontrarte en Mastodon!",
|
||||||
"onboarding.steps.share_profile.title": "Comparte tu perfil",
|
"onboarding.steps.share_profile.title": "Comparte tu perfil",
|
||||||
"onboarding.tips.2fa": "<strong>¿Sabías que?</strong> Puedes proteger tu cuenta configurando la autenticación de dos factores en la configuración de su cuenta. Funciona con cualquier aplicación TOTP de su elección, ¡no necesitas número de teléfono!",
|
"onboarding.tips.2fa": "<strong>¿Sabías que?</strong> Puedes proteger tu cuenta configurando la autenticación de dos factores en la configuración de su cuenta. Funciona con cualquier aplicación TOTP de su elección, ¡no necesitas número de teléfono!",
|
||||||
"onboarding.tips.accounts_from_other_servers": "<strong>¿Sabías que?</strong> Como Mastodon es descentralizado, algunos perfiles que encuentras están alojados en servidores distintos del tuyo. Y sin embargo, ¡puedes interactuar con ellos! ¡Su servidor corresponde a la segunda mitad de su nombre de usuario!",
|
"onboarding.tips.accounts_from_other_servers": "<strong>¿Sabías que?</strong> Como Mastodon es descentralizado, algunos perfiles que encuentras están alojados en servidores distintos del tuyo. Y sin embargo, ¡puedes interactuar con ellos! ¡Su servidor corresponde a la segunda mitad de su nombre de usuario!",
|
||||||
|
@ -665,7 +667,7 @@
|
||||||
"privacy.private.short": "Seguidores",
|
"privacy.private.short": "Seguidores",
|
||||||
"privacy.public.long": "Cualquiera dentro y fuera de Mastodon",
|
"privacy.public.long": "Cualquiera dentro y fuera de Mastodon",
|
||||||
"privacy.public.short": "Público",
|
"privacy.public.short": "Público",
|
||||||
"privacy.unlisted.additional": "Esto se comporta exactamente igual que el público, excepto que el post no aparecerá en las cronologías en directo o en las etiquetas, la exploración o busquedas en Mastodon, incluso si está optado por activar la cuenta de usuario.",
|
"privacy.unlisted.additional": "Esto se comporta exactamente igual que el público, excepto que el post no aparecerá en las cronologías en directo o en los hashtags, la exploración o busquedas en Mastodon, incluso si está optado por activar la cuenta de usuario.",
|
||||||
"privacy.unlisted.long": "Menos fanfares algorítmicos",
|
"privacy.unlisted.long": "Menos fanfares algorítmicos",
|
||||||
"privacy.unlisted.short": "Público silencioso",
|
"privacy.unlisted.short": "Público silencioso",
|
||||||
"privacy_policy.last_updated": "Actualizado por última vez {date}",
|
"privacy_policy.last_updated": "Actualizado por última vez {date}",
|
||||||
|
@ -699,7 +701,7 @@
|
||||||
"report.category.title_account": "perfil",
|
"report.category.title_account": "perfil",
|
||||||
"report.category.title_status": "publicación",
|
"report.category.title_status": "publicación",
|
||||||
"report.close": "Realizado",
|
"report.close": "Realizado",
|
||||||
"report.comment.title": "¿Hay algo más que creas que deberíamos saber?",
|
"report.comment.title": "¿Hay algo más que usted cree que debamos saber?",
|
||||||
"report.forward": "Reenviar a {target}",
|
"report.forward": "Reenviar a {target}",
|
||||||
"report.forward_hint": "Esta cuenta es de otro servidor. ¿Enviar una copia anonimizada del informe allí también?",
|
"report.forward_hint": "Esta cuenta es de otro servidor. ¿Enviar una copia anonimizada del informe allí también?",
|
||||||
"report.mute": "Silenciar",
|
"report.mute": "Silenciar",
|
||||||
|
@ -776,9 +778,9 @@
|
||||||
"status.admin_status": "Abrir este estado en la interfaz de moderación",
|
"status.admin_status": "Abrir este estado en la interfaz de moderación",
|
||||||
"status.block": "Bloquear a @{name}",
|
"status.block": "Bloquear a @{name}",
|
||||||
"status.bookmark": "Añadir marcador",
|
"status.bookmark": "Añadir marcador",
|
||||||
"status.cancel_reblog_private": "Deshacer impulso",
|
"status.cancel_reblog_private": "Eliminar retoot",
|
||||||
"status.cannot_reblog": "Esta publicación no puede ser impulsada",
|
"status.cannot_reblog": "Este toot no puede retootearse",
|
||||||
"status.continued_thread": "Hilo continuado",
|
"status.continued_thread": "Continuó el hilo",
|
||||||
"status.copy": "Copiar enlace al estado",
|
"status.copy": "Copiar enlace al estado",
|
||||||
"status.delete": "Borrar",
|
"status.delete": "Borrar",
|
||||||
"status.detailed_status": "Vista de conversación detallada",
|
"status.detailed_status": "Vista de conversación detallada",
|
||||||
|
@ -787,7 +789,6 @@
|
||||||
"status.edit": "Editar",
|
"status.edit": "Editar",
|
||||||
"status.edited": "Última edición {date}",
|
"status.edited": "Última edición {date}",
|
||||||
"status.edited_x_times": "Editado {count, plural, one {{count} time} other {{count} veces}}",
|
"status.edited_x_times": "Editado {count, plural, one {{count} time} other {{count} veces}}",
|
||||||
"status.embed": "Obtener código para incrustar",
|
|
||||||
"status.favourite": "Favorito",
|
"status.favourite": "Favorito",
|
||||||
"status.favourites": "{count, plural, one {favorito} other {favoritos}}",
|
"status.favourites": "{count, plural, one {favorito} other {favoritos}}",
|
||||||
"status.filter": "Filtrar esta publicación",
|
"status.filter": "Filtrar esta publicación",
|
||||||
|
@ -803,16 +804,16 @@
|
||||||
"status.mute_conversation": "Silenciar conversación",
|
"status.mute_conversation": "Silenciar conversación",
|
||||||
"status.open": "Expandir estado",
|
"status.open": "Expandir estado",
|
||||||
"status.pin": "Fijar",
|
"status.pin": "Fijar",
|
||||||
"status.pinned": "Publicación fijada",
|
"status.pinned": "Toot fijado",
|
||||||
"status.read_more": "Leer más",
|
"status.read_more": "Leer más",
|
||||||
"status.reblog": "Impulsar",
|
"status.reblog": "Retootear",
|
||||||
"status.reblog_private": "Implusar a la audiencia original",
|
"status.reblog_private": "Implusar a la audiencia original",
|
||||||
"status.reblogged_by": "Impulsado por {name}",
|
"status.reblogged_by": "Retooteado por {name}",
|
||||||
"status.reblogs": "{count, plural, one {impulso} other {impulsos}}",
|
"status.reblogs": "{count, plural, one {impulso} other {impulsos}}",
|
||||||
"status.reblogs.empty": "Nadie impulsó esta publicación todavía. Cuando alguien lo haga, aparecerá aquí.",
|
"status.reblogs.empty": "Nadie retooteó este toot todavía. Cuando alguien lo haga, aparecerá aquí.",
|
||||||
"status.redraft": "Borrar y volver a borrador",
|
"status.redraft": "Borrar y volver a borrador",
|
||||||
"status.remove_bookmark": "Eliminar marcador",
|
"status.remove_bookmark": "Eliminar marcador",
|
||||||
"status.replied_in_thread": "Respondido en el hilo",
|
"status.replied_in_thread": "Respondió en el hilo",
|
||||||
"status.replied_to": "Respondió a {name}",
|
"status.replied_to": "Respondió a {name}",
|
||||||
"status.reply": "Responder",
|
"status.reply": "Responder",
|
||||||
"status.replyAll": "Responder al hilo",
|
"status.replyAll": "Responder al hilo",
|
||||||
|
|
|
@ -221,7 +221,7 @@
|
||||||
"domain_block_modal.they_cant_follow": "Nadie de este servidor puede seguirte.",
|
"domain_block_modal.they_cant_follow": "Nadie de este servidor puede seguirte.",
|
||||||
"domain_block_modal.they_wont_know": "No sabrán que han sido bloqueados.",
|
"domain_block_modal.they_wont_know": "No sabrán que han sido bloqueados.",
|
||||||
"domain_block_modal.title": "¿Bloquear dominio?",
|
"domain_block_modal.title": "¿Bloquear dominio?",
|
||||||
"domain_block_modal.you_will_lose_num_followers": "Perderás {followersCount, plural, one {{followersCountDisplay} seguidor} other {{followersCountDisplay} seguidores}} y {followingCount, plural, one {{followingCountDisplay} persona a la que sigues} other {{followingCountDisplay} personas a las que sigues}}.",
|
"domain_block_modal.you_will_lose_followers": "Se eliminarán todos tus seguidores de este servidor.",
|
||||||
"domain_block_modal.you_wont_see_posts": "No verás mensajes ni notificaciones de usuarios en este servidor.",
|
"domain_block_modal.you_wont_see_posts": "No verás mensajes ni notificaciones de usuarios en este servidor.",
|
||||||
"domain_pill.activitypub_lets_connect": "Te permite conectar e interactuar con personas no sólo en Mastodon, sino también a través de diferentes aplicaciones sociales.",
|
"domain_pill.activitypub_lets_connect": "Te permite conectar e interactuar con personas no sólo en Mastodon, sino también a través de diferentes aplicaciones sociales.",
|
||||||
"domain_pill.activitypub_like_language": "ActivityPub es como el idioma que Mastodon habla con otras redes sociales.",
|
"domain_pill.activitypub_like_language": "ActivityPub es como el idioma que Mastodon habla con otras redes sociales.",
|
||||||
|
@ -267,7 +267,7 @@
|
||||||
"empty_column.favourites": "Todavía nadie marcó esta publicación como favorita. Cuando alguien lo haga, se mostrarán aquí.",
|
"empty_column.favourites": "Todavía nadie marcó esta publicación como favorita. Cuando alguien lo haga, se mostrarán aquí.",
|
||||||
"empty_column.follow_requests": "No tienes ninguna petición de seguidor. Cuando recibas una, se mostrará aquí.",
|
"empty_column.follow_requests": "No tienes ninguna petición de seguidor. Cuando recibas una, se mostrará aquí.",
|
||||||
"empty_column.followed_tags": "No has seguido ninguna etiqueta todavía. Cuando lo hagas, se mostrarán aquí.",
|
"empty_column.followed_tags": "No has seguido ninguna etiqueta todavía. Cuando lo hagas, se mostrarán aquí.",
|
||||||
"empty_column.hashtag": "No hay nada en esta etiqueta todavía.",
|
"empty_column.hashtag": "No hay nada en este hashtag aún.",
|
||||||
"empty_column.home": "¡Tu línea temporal está vacía! Sigue a más personas para rellenarla.",
|
"empty_column.home": "¡Tu línea temporal está vacía! Sigue a más personas para rellenarla.",
|
||||||
"empty_column.list": "Aún no hay nada en esta lista. Cuando los miembros de esta lista publiquen nuevos estados, estos aparecerán aquí.",
|
"empty_column.list": "Aún no hay nada en esta lista. Cuando los miembros de esta lista publiquen nuevos estados, estos aparecerán aquí.",
|
||||||
"empty_column.lists": "No tienes ninguna lista. Cuando crees una, se mostrará aquí.",
|
"empty_column.lists": "No tienes ninguna lista. Cuando crees una, se mostrará aquí.",
|
||||||
|
@ -342,7 +342,7 @@
|
||||||
"hashtag.column_header.tag_mode.any": "o {additional}",
|
"hashtag.column_header.tag_mode.any": "o {additional}",
|
||||||
"hashtag.column_header.tag_mode.none": "sin {additional}",
|
"hashtag.column_header.tag_mode.none": "sin {additional}",
|
||||||
"hashtag.column_settings.select.no_options_message": "No se encontraron sugerencias",
|
"hashtag.column_settings.select.no_options_message": "No se encontraron sugerencias",
|
||||||
"hashtag.column_settings.select.placeholder": "Introduce etiquetas…",
|
"hashtag.column_settings.select.placeholder": "Introduzca hashtags…",
|
||||||
"hashtag.column_settings.tag_mode.all": "Todos estos",
|
"hashtag.column_settings.tag_mode.all": "Todos estos",
|
||||||
"hashtag.column_settings.tag_mode.any": "Cualquiera de estos",
|
"hashtag.column_settings.tag_mode.any": "Cualquiera de estos",
|
||||||
"hashtag.column_settings.tag_mode.none": "Ninguno de estos",
|
"hashtag.column_settings.tag_mode.none": "Ninguno de estos",
|
||||||
|
@ -376,7 +376,7 @@
|
||||||
"ignore_notifications_modal.ignore": "Ignorar notificaciones",
|
"ignore_notifications_modal.ignore": "Ignorar notificaciones",
|
||||||
"ignore_notifications_modal.limited_accounts_title": "¿Ignorar notificaciones de cuentas moderadas?",
|
"ignore_notifications_modal.limited_accounts_title": "¿Ignorar notificaciones de cuentas moderadas?",
|
||||||
"ignore_notifications_modal.new_accounts_title": "¿Ignorar notificaciones de cuentas nuevas?",
|
"ignore_notifications_modal.new_accounts_title": "¿Ignorar notificaciones de cuentas nuevas?",
|
||||||
"ignore_notifications_modal.not_followers_title": "¿Ignorar notificaciones de personas que no te siguen?",
|
"ignore_notifications_modal.not_followers_title": "¿Ignorar notificaciones de personas que no te sigue?",
|
||||||
"ignore_notifications_modal.not_following_title": "¿Ignorar notificaciones de personas a las que no sigues?",
|
"ignore_notifications_modal.not_following_title": "¿Ignorar notificaciones de personas a las que no sigues?",
|
||||||
"ignore_notifications_modal.private_mentions_title": "¿Ignorar notificaciones de menciones privadas no solicitadas?",
|
"ignore_notifications_modal.private_mentions_title": "¿Ignorar notificaciones de menciones privadas no solicitadas?",
|
||||||
"interaction_modal.description.favourite": "Con una cuenta en Mastodon, puedes marcar como favorita esta publicación para que el autor sepa que te gusta, y guardala para más adelante.",
|
"interaction_modal.description.favourite": "Con una cuenta en Mastodon, puedes marcar como favorita esta publicación para que el autor sepa que te gusta, y guardala para más adelante.",
|
||||||
|
@ -432,10 +432,10 @@
|
||||||
"keyboard_shortcuts.unfocus": "para retirar el foco de la caja de redacción/búsqueda",
|
"keyboard_shortcuts.unfocus": "para retirar el foco de la caja de redacción/búsqueda",
|
||||||
"keyboard_shortcuts.up": "para ir hacia arriba en la lista",
|
"keyboard_shortcuts.up": "para ir hacia arriba en la lista",
|
||||||
"lightbox.close": "Cerrar",
|
"lightbox.close": "Cerrar",
|
||||||
|
"lightbox.compress": "Comprimir cuadro de visualización de imagen",
|
||||||
|
"lightbox.expand": "Expandir cuadro de visualización de imagen",
|
||||||
"lightbox.next": "Siguiente",
|
"lightbox.next": "Siguiente",
|
||||||
"lightbox.previous": "Anterior",
|
"lightbox.previous": "Anterior",
|
||||||
"lightbox.zoom_in": "Ampliar al tamaño real",
|
|
||||||
"lightbox.zoom_out": "Ampliar para ajustar",
|
|
||||||
"limited_account_hint.action": "Mostrar perfil de todos modos",
|
"limited_account_hint.action": "Mostrar perfil de todos modos",
|
||||||
"limited_account_hint.title": "Este perfil ha sido ocultado por los moderadores de {domain}.",
|
"limited_account_hint.title": "Este perfil ha sido ocultado por los moderadores de {domain}.",
|
||||||
"link_preview.author": "Por {name}",
|
"link_preview.author": "Por {name}",
|
||||||
|
@ -559,6 +559,8 @@
|
||||||
"notifications.column_settings.admin.report": "Nuevos informes:",
|
"notifications.column_settings.admin.report": "Nuevos informes:",
|
||||||
"notifications.column_settings.admin.sign_up": "Nuevos registros:",
|
"notifications.column_settings.admin.sign_up": "Nuevos registros:",
|
||||||
"notifications.column_settings.alert": "Notificaciones de escritorio",
|
"notifications.column_settings.alert": "Notificaciones de escritorio",
|
||||||
|
"notifications.column_settings.beta.category": "Características experimentales",
|
||||||
|
"notifications.column_settings.beta.grouping": "Agrupar notificaciones",
|
||||||
"notifications.column_settings.favourite": "Favoritos:",
|
"notifications.column_settings.favourite": "Favoritos:",
|
||||||
"notifications.column_settings.filter_bar.advanced": "Mostrar todas las categorías",
|
"notifications.column_settings.filter_bar.advanced": "Mostrar todas las categorías",
|
||||||
"notifications.column_settings.filter_bar.category": "Barra de filtrado rápido",
|
"notifications.column_settings.filter_bar.category": "Barra de filtrado rápido",
|
||||||
|
@ -637,7 +639,7 @@
|
||||||
"onboarding.steps.follow_people.title": "Personaliza tu línea de inicio",
|
"onboarding.steps.follow_people.title": "Personaliza tu línea de inicio",
|
||||||
"onboarding.steps.publish_status.body": "Di hola al mundo con texto, fotos, vídeos o encuestas {emoji}",
|
"onboarding.steps.publish_status.body": "Di hola al mundo con texto, fotos, vídeos o encuestas {emoji}",
|
||||||
"onboarding.steps.publish_status.title": "Escribe tu primera publicación",
|
"onboarding.steps.publish_status.title": "Escribe tu primera publicación",
|
||||||
"onboarding.steps.setup_profile.body": "Aumenta tus interacciones con un perfil completo.",
|
"onboarding.steps.setup_profile.body": "Aumenta tus interacciones tcompletando tu perfil.",
|
||||||
"onboarding.steps.setup_profile.title": "Personaliza tu perfil",
|
"onboarding.steps.setup_profile.title": "Personaliza tu perfil",
|
||||||
"onboarding.steps.share_profile.body": "¡Dile a tus amigos cómo encontrarte en Mastodon!",
|
"onboarding.steps.share_profile.body": "¡Dile a tus amigos cómo encontrarte en Mastodon!",
|
||||||
"onboarding.steps.share_profile.title": "Comparte tu perfil de Mastodon",
|
"onboarding.steps.share_profile.title": "Comparte tu perfil de Mastodon",
|
||||||
|
@ -787,7 +789,6 @@
|
||||||
"status.edit": "Editar",
|
"status.edit": "Editar",
|
||||||
"status.edited": "Última edición {date}",
|
"status.edited": "Última edición {date}",
|
||||||
"status.edited_x_times": "Editado {count, plural, one {{count} vez} other {{count} veces}}",
|
"status.edited_x_times": "Editado {count, plural, one {{count} vez} other {{count} veces}}",
|
||||||
"status.embed": "Obtener código para incrustar",
|
|
||||||
"status.favourite": "Favorito",
|
"status.favourite": "Favorito",
|
||||||
"status.favourites": "{count, plural, one {favorito} other {favoritos}}",
|
"status.favourites": "{count, plural, one {favorito} other {favoritos}}",
|
||||||
"status.filter": "Filtrar esta publicación",
|
"status.filter": "Filtrar esta publicación",
|
||||||
|
|
|
@ -221,6 +221,7 @@
|
||||||
"domain_block_modal.they_cant_follow": "Sellest serverist ei saa keegi sind jälgida.",
|
"domain_block_modal.they_cant_follow": "Sellest serverist ei saa keegi sind jälgida.",
|
||||||
"domain_block_modal.they_wont_know": "Nad ei tea, et nad on blokeeritud.",
|
"domain_block_modal.they_wont_know": "Nad ei tea, et nad on blokeeritud.",
|
||||||
"domain_block_modal.title": "Blokeerida domeen?",
|
"domain_block_modal.title": "Blokeerida domeen?",
|
||||||
|
"domain_block_modal.you_will_lose_followers": "Kõik sinu sellest serverist pärit jälgijad eemaldatakse.",
|
||||||
"domain_block_modal.you_wont_see_posts": "Sa ei näe selle serveri kasutajate postitusi ega teavitusi.",
|
"domain_block_modal.you_wont_see_posts": "Sa ei näe selle serveri kasutajate postitusi ega teavitusi.",
|
||||||
"domain_pill.activitypub_lets_connect": "See võimaldab sul ühenduda inimestega ja nendega suhelda mitte ainult Mastodonis, vaid ka teistes suhtlusrakendustes.",
|
"domain_pill.activitypub_lets_connect": "See võimaldab sul ühenduda inimestega ja nendega suhelda mitte ainult Mastodonis, vaid ka teistes suhtlusrakendustes.",
|
||||||
"domain_pill.activitypub_like_language": "ActivityPub on nagu keel, mida Mastodon räägib teiste suhtlusvõrgustikega.",
|
"domain_pill.activitypub_like_language": "ActivityPub on nagu keel, mida Mastodon räägib teiste suhtlusvõrgustikega.",
|
||||||
|
@ -431,6 +432,8 @@
|
||||||
"keyboard_shortcuts.unfocus": "Fookus tekstialalt/otsingult ära",
|
"keyboard_shortcuts.unfocus": "Fookus tekstialalt/otsingult ära",
|
||||||
"keyboard_shortcuts.up": "Liigu loetelus üles",
|
"keyboard_shortcuts.up": "Liigu loetelus üles",
|
||||||
"lightbox.close": "Sulge",
|
"lightbox.close": "Sulge",
|
||||||
|
"lightbox.compress": "Suru kokku pildi vaatamise kast",
|
||||||
|
"lightbox.expand": "Laienda pildi vaatamise kast",
|
||||||
"lightbox.next": "Järgmine",
|
"lightbox.next": "Järgmine",
|
||||||
"lightbox.previous": "Eelmine",
|
"lightbox.previous": "Eelmine",
|
||||||
"limited_account_hint.action": "Näita profilli sellegipoolest",
|
"limited_account_hint.action": "Näita profilli sellegipoolest",
|
||||||
|
@ -454,7 +457,6 @@
|
||||||
"lists.subheading": "Sinu nimekirjad",
|
"lists.subheading": "Sinu nimekirjad",
|
||||||
"load_pending": "{count, plural, one {# uus kirje} other {# uut kirjet}}",
|
"load_pending": "{count, plural, one {# uus kirje} other {# uut kirjet}}",
|
||||||
"loading_indicator.label": "Laadimine…",
|
"loading_indicator.label": "Laadimine…",
|
||||||
"media_gallery.hide": "Peida",
|
|
||||||
"moved_to_account_banner.text": "Kontot {disabledAccount} ei ole praegu võimalik kasutada, sest kolisid kontole {movedToAccount}.",
|
"moved_to_account_banner.text": "Kontot {disabledAccount} ei ole praegu võimalik kasutada, sest kolisid kontole {movedToAccount}.",
|
||||||
"mute_modal.hide_from_notifications": "Peida teavituste hulgast",
|
"mute_modal.hide_from_notifications": "Peida teavituste hulgast",
|
||||||
"mute_modal.hide_options": "Peida valikud",
|
"mute_modal.hide_options": "Peida valikud",
|
||||||
|
@ -556,6 +558,8 @@
|
||||||
"notifications.column_settings.admin.report": "Uued teavitused:",
|
"notifications.column_settings.admin.report": "Uued teavitused:",
|
||||||
"notifications.column_settings.admin.sign_up": "Uued kasutajad:",
|
"notifications.column_settings.admin.sign_up": "Uued kasutajad:",
|
||||||
"notifications.column_settings.alert": "Töölauateated",
|
"notifications.column_settings.alert": "Töölauateated",
|
||||||
|
"notifications.column_settings.beta.category": "Eksperimentaalsed oskused",
|
||||||
|
"notifications.column_settings.beta.grouping": "Teavituste rühmitamine",
|
||||||
"notifications.column_settings.favourite": "Lemmikud:",
|
"notifications.column_settings.favourite": "Lemmikud:",
|
||||||
"notifications.column_settings.filter_bar.advanced": "Näita kõiki kategooriaid",
|
"notifications.column_settings.filter_bar.advanced": "Näita kõiki kategooriaid",
|
||||||
"notifications.column_settings.filter_bar.category": "Kiirfiltri riba",
|
"notifications.column_settings.filter_bar.category": "Kiirfiltri riba",
|
||||||
|
@ -775,7 +779,6 @@
|
||||||
"status.bookmark": "Järjehoidja",
|
"status.bookmark": "Järjehoidja",
|
||||||
"status.cancel_reblog_private": "Lõpeta jagamine",
|
"status.cancel_reblog_private": "Lõpeta jagamine",
|
||||||
"status.cannot_reblog": "Seda postitust ei saa jagada",
|
"status.cannot_reblog": "Seda postitust ei saa jagada",
|
||||||
"status.continued_thread": "Jätkatud lõim",
|
|
||||||
"status.copy": "Kopeeri postituse link",
|
"status.copy": "Kopeeri postituse link",
|
||||||
"status.delete": "Kustuta",
|
"status.delete": "Kustuta",
|
||||||
"status.detailed_status": "Detailne vestluskuva",
|
"status.detailed_status": "Detailne vestluskuva",
|
||||||
|
@ -784,7 +787,6 @@
|
||||||
"status.edit": "Muuda",
|
"status.edit": "Muuda",
|
||||||
"status.edited": "Viimati muudetud {date}",
|
"status.edited": "Viimati muudetud {date}",
|
||||||
"status.edited_x_times": "Muudetud {count, plural, one{{count} kord} other {{count} korda}}",
|
"status.edited_x_times": "Muudetud {count, plural, one{{count} kord} other {{count} korda}}",
|
||||||
"status.embed": "Hangi manustamiskood",
|
|
||||||
"status.favourite": "Lemmik",
|
"status.favourite": "Lemmik",
|
||||||
"status.favourites": "{count, plural, one {lemmik} other {lemmikud}}",
|
"status.favourites": "{count, plural, one {lemmik} other {lemmikud}}",
|
||||||
"status.filter": "Filtreeri seda postitust",
|
"status.filter": "Filtreeri seda postitust",
|
||||||
|
@ -809,7 +811,6 @@
|
||||||
"status.reblogs.empty": "Keegi pole seda postitust veel jaganud. Kui keegi seda teeb, näeb seda siin.",
|
"status.reblogs.empty": "Keegi pole seda postitust veel jaganud. Kui keegi seda teeb, näeb seda siin.",
|
||||||
"status.redraft": "Kustuta & alga uuesti",
|
"status.redraft": "Kustuta & alga uuesti",
|
||||||
"status.remove_bookmark": "Eemalda järjehoidja",
|
"status.remove_bookmark": "Eemalda järjehoidja",
|
||||||
"status.replied_in_thread": "Vastatud lõimes",
|
|
||||||
"status.replied_to": "Vastas kasutajale {name}",
|
"status.replied_to": "Vastas kasutajale {name}",
|
||||||
"status.reply": "Vasta",
|
"status.reply": "Vasta",
|
||||||
"status.replyAll": "Vasta lõimele",
|
"status.replyAll": "Vasta lõimele",
|
||||||
|
|
|
@ -221,6 +221,7 @@
|
||||||
"domain_block_modal.they_cant_follow": "Zerbitzari honetako inork ezin zaitu jarraitu.",
|
"domain_block_modal.they_cant_follow": "Zerbitzari honetako inork ezin zaitu jarraitu.",
|
||||||
"domain_block_modal.they_wont_know": "Ez dute jakingo blokeatuak izan direnik.",
|
"domain_block_modal.they_wont_know": "Ez dute jakingo blokeatuak izan direnik.",
|
||||||
"domain_block_modal.title": "Domeinua blokeatu nahi duzu?",
|
"domain_block_modal.title": "Domeinua blokeatu nahi duzu?",
|
||||||
|
"domain_block_modal.you_will_lose_followers": "Zerbitzari honetako jarraitzaile guztiak kenduko dira.",
|
||||||
"domain_block_modal.you_wont_see_posts": "Ez dituzu zerbitzari honetako erabiltzaileen argitalpenik edota jakinarazpenik ikusiko.",
|
"domain_block_modal.you_wont_see_posts": "Ez dituzu zerbitzari honetako erabiltzaileen argitalpenik edota jakinarazpenik ikusiko.",
|
||||||
"domain_pill.activitypub_lets_connect": "Mastodon-en ez ezik, beste sare sozialen aplikazioetako jendearekin konektatzea eta harremanetan jartzea uzten dizu.",
|
"domain_pill.activitypub_lets_connect": "Mastodon-en ez ezik, beste sare sozialen aplikazioetako jendearekin konektatzea eta harremanetan jartzea uzten dizu.",
|
||||||
"domain_pill.activitypub_like_language": "ActivityPub, Mastodon-ek beste sare sozialekin hitz egiteko erabiltzen duen hizkuntza bezalakoxea da.",
|
"domain_pill.activitypub_like_language": "ActivityPub, Mastodon-ek beste sare sozialekin hitz egiteko erabiltzen duen hizkuntza bezalakoxea da.",
|
||||||
|
@ -431,6 +432,8 @@
|
||||||
"keyboard_shortcuts.unfocus": "testua konposatzeko area / bilaketatik fokua kentzea",
|
"keyboard_shortcuts.unfocus": "testua konposatzeko area / bilaketatik fokua kentzea",
|
||||||
"keyboard_shortcuts.up": "zerrendan gora mugitzea",
|
"keyboard_shortcuts.up": "zerrendan gora mugitzea",
|
||||||
"lightbox.close": "Itxi",
|
"lightbox.close": "Itxi",
|
||||||
|
"lightbox.compress": "Konprimatu irudia ikusteko kaxa",
|
||||||
|
"lightbox.expand": "Zabaldu irudia ikusteko kaxa",
|
||||||
"lightbox.next": "Hurrengoa",
|
"lightbox.next": "Hurrengoa",
|
||||||
"lightbox.previous": "Aurrekoa",
|
"lightbox.previous": "Aurrekoa",
|
||||||
"limited_account_hint.action": "Erakutsi profila hala ere",
|
"limited_account_hint.action": "Erakutsi profila hala ere",
|
||||||
|
@ -454,7 +457,6 @@
|
||||||
"lists.subheading": "Zure zerrendak",
|
"lists.subheading": "Zure zerrendak",
|
||||||
"load_pending": "{count, plural, one {elementu berri #} other {# elementu berri}}",
|
"load_pending": "{count, plural, one {elementu berri #} other {# elementu berri}}",
|
||||||
"loading_indicator.label": "Kargatzen…",
|
"loading_indicator.label": "Kargatzen…",
|
||||||
"media_gallery.hide": "Ezkutatu",
|
|
||||||
"moved_to_account_banner.text": "Zure {disabledAccount} kontua desgaituta dago une honetan, {movedToAccount} kontura aldatu zinelako.",
|
"moved_to_account_banner.text": "Zure {disabledAccount} kontua desgaituta dago une honetan, {movedToAccount} kontura aldatu zinelako.",
|
||||||
"mute_modal.hide_from_notifications": "Ezkutatu jakinarazpenetatik",
|
"mute_modal.hide_from_notifications": "Ezkutatu jakinarazpenetatik",
|
||||||
"mute_modal.hide_options": "Ezkutatu aukerak",
|
"mute_modal.hide_options": "Ezkutatu aukerak",
|
||||||
|
@ -552,6 +554,8 @@
|
||||||
"notifications.column_settings.admin.report": "Txosten berriak:",
|
"notifications.column_settings.admin.report": "Txosten berriak:",
|
||||||
"notifications.column_settings.admin.sign_up": "Izen-emate berriak:",
|
"notifications.column_settings.admin.sign_up": "Izen-emate berriak:",
|
||||||
"notifications.column_settings.alert": "Mahaigaineko jakinarazpenak",
|
"notifications.column_settings.alert": "Mahaigaineko jakinarazpenak",
|
||||||
|
"notifications.column_settings.beta.category": "Ezaugarri esperimentalak",
|
||||||
|
"notifications.column_settings.beta.grouping": "Multzokatu jakinarazpenak",
|
||||||
"notifications.column_settings.favourite": "Gogokoak:",
|
"notifications.column_settings.favourite": "Gogokoak:",
|
||||||
"notifications.column_settings.filter_bar.advanced": "Bistaratu kategoria guztiak",
|
"notifications.column_settings.filter_bar.advanced": "Bistaratu kategoria guztiak",
|
||||||
"notifications.column_settings.filter_bar.category": "Iragazki-barra bizkorra",
|
"notifications.column_settings.filter_bar.category": "Iragazki-barra bizkorra",
|
||||||
|
@ -771,7 +775,6 @@
|
||||||
"status.bookmark": "Laster-marka",
|
"status.bookmark": "Laster-marka",
|
||||||
"status.cancel_reblog_private": "Kendu bultzada",
|
"status.cancel_reblog_private": "Kendu bultzada",
|
||||||
"status.cannot_reblog": "Bidalketa honi ezin zaio bultzada eman",
|
"status.cannot_reblog": "Bidalketa honi ezin zaio bultzada eman",
|
||||||
"status.continued_thread": "Harian jarraitu zuen",
|
|
||||||
"status.copy": "Kopiatu bidalketaren esteka",
|
"status.copy": "Kopiatu bidalketaren esteka",
|
||||||
"status.delete": "Ezabatu",
|
"status.delete": "Ezabatu",
|
||||||
"status.detailed_status": "Elkarrizketaren ikuspegi xehetsua",
|
"status.detailed_status": "Elkarrizketaren ikuspegi xehetsua",
|
||||||
|
@ -780,7 +783,6 @@
|
||||||
"status.edit": "Editatu",
|
"status.edit": "Editatu",
|
||||||
"status.edited": "Azken edizioa: {date}",
|
"status.edited": "Azken edizioa: {date}",
|
||||||
"status.edited_x_times": "{count, plural, one {behin} other {{count} aldiz}} editatua",
|
"status.edited_x_times": "{count, plural, one {behin} other {{count} aldiz}} editatua",
|
||||||
"status.embed": "Lortu txertatzeko kodea",
|
|
||||||
"status.favourite": "Gogokoa",
|
"status.favourite": "Gogokoa",
|
||||||
"status.favourites": "{count, plural, one {gogoko} other {gogoko}}",
|
"status.favourites": "{count, plural, one {gogoko} other {gogoko}}",
|
||||||
"status.filter": "Iragazi bidalketa hau",
|
"status.filter": "Iragazi bidalketa hau",
|
||||||
|
@ -805,7 +807,6 @@
|
||||||
"status.reblogs.empty": "Inork ez dio bultzada eman bidalketa honi oraindik. Inork egiten badu, hemen agertuko da.",
|
"status.reblogs.empty": "Inork ez dio bultzada eman bidalketa honi oraindik. Inork egiten badu, hemen agertuko da.",
|
||||||
"status.redraft": "Ezabatu eta berridatzi",
|
"status.redraft": "Ezabatu eta berridatzi",
|
||||||
"status.remove_bookmark": "Kendu laster-marka",
|
"status.remove_bookmark": "Kendu laster-marka",
|
||||||
"status.replied_in_thread": "Harian erantzun zuen",
|
|
||||||
"status.replied_to": "{name} erabiltzaileari erantzuna",
|
"status.replied_to": "{name} erabiltzaileari erantzuna",
|
||||||
"status.reply": "Erantzun",
|
"status.reply": "Erantzun",
|
||||||
"status.replyAll": "Erantzun harian",
|
"status.replyAll": "Erantzun harian",
|
||||||
|
|
|
@ -220,6 +220,7 @@
|
||||||
"domain_block_modal.they_cant_follow": "هیچکسی از این کارساز نمیتواند پیتان بگیرد.",
|
"domain_block_modal.they_cant_follow": "هیچکسی از این کارساز نمیتواند پیتان بگیرد.",
|
||||||
"domain_block_modal.they_wont_know": "نخواهند دانست که مسدود شدهاند.",
|
"domain_block_modal.they_wont_know": "نخواهند دانست که مسدود شدهاند.",
|
||||||
"domain_block_modal.title": "انسداد دامنه؟",
|
"domain_block_modal.title": "انسداد دامنه؟",
|
||||||
|
"domain_block_modal.you_will_lose_followers": "همهٔ پیگیرندگانتان از این کارساز برداشته خواهند شد.",
|
||||||
"domain_block_modal.you_wont_see_posts": "فرستهها یا آگاهیها از کاربران روی این کارساز را نخواهید دید.",
|
"domain_block_modal.you_wont_see_posts": "فرستهها یا آگاهیها از کاربران روی این کارساز را نخواهید دید.",
|
||||||
"domain_pill.server": "کارساز",
|
"domain_pill.server": "کارساز",
|
||||||
"domain_pill.their_handle": "شناسهاش:",
|
"domain_pill.their_handle": "شناسهاش:",
|
||||||
|
@ -421,6 +422,8 @@
|
||||||
"keyboard_shortcuts.unfocus": "برداشتن تمرکز از ناحیهٔ نوشتن یا جستوجو",
|
"keyboard_shortcuts.unfocus": "برداشتن تمرکز از ناحیهٔ نوشتن یا جستوجو",
|
||||||
"keyboard_shortcuts.up": "بالا بردن در سیاهه",
|
"keyboard_shortcuts.up": "بالا بردن در سیاهه",
|
||||||
"lightbox.close": "بستن",
|
"lightbox.close": "بستن",
|
||||||
|
"lightbox.compress": "فشردهسازی جعبهٔ نمایش تصویر",
|
||||||
|
"lightbox.expand": "گسترش جعبهٔ نمایش تصویر",
|
||||||
"lightbox.next": "بعدی",
|
"lightbox.next": "بعدی",
|
||||||
"lightbox.previous": "قبلی",
|
"lightbox.previous": "قبلی",
|
||||||
"limited_account_hint.action": "به هر روی نمایه نشان داده شود",
|
"limited_account_hint.action": "به هر روی نمایه نشان داده شود",
|
||||||
|
@ -531,6 +534,8 @@
|
||||||
"notifications.column_settings.admin.report": "گزارشهای جدید:",
|
"notifications.column_settings.admin.report": "گزارشهای جدید:",
|
||||||
"notifications.column_settings.admin.sign_up": "ثبت نامهای جدید:",
|
"notifications.column_settings.admin.sign_up": "ثبت نامهای جدید:",
|
||||||
"notifications.column_settings.alert": "آگاهیهای میزکار",
|
"notifications.column_settings.alert": "آگاهیهای میزکار",
|
||||||
|
"notifications.column_settings.beta.category": "ویژگیهای آزمایشی",
|
||||||
|
"notifications.column_settings.beta.grouping": "گروهبندی آگاهیها",
|
||||||
"notifications.column_settings.favourite": "برگزیدهها:",
|
"notifications.column_settings.favourite": "برگزیدهها:",
|
||||||
"notifications.column_settings.filter_bar.advanced": "نمایش همۀ دستهها",
|
"notifications.column_settings.filter_bar.advanced": "نمایش همۀ دستهها",
|
||||||
"notifications.column_settings.filter_bar.category": "نوار پالایش سریع",
|
"notifications.column_settings.filter_bar.category": "نوار پالایش سریع",
|
||||||
|
|
|
@ -221,6 +221,7 @@
|
||||||
"domain_block_modal.they_cant_follow": "Kukaan tältä palvelimelta ei voi seurata sinua.",
|
"domain_block_modal.they_cant_follow": "Kukaan tältä palvelimelta ei voi seurata sinua.",
|
||||||
"domain_block_modal.they_wont_know": "Hän ei saa tietää tulleensa estetyksi.",
|
"domain_block_modal.they_wont_know": "Hän ei saa tietää tulleensa estetyksi.",
|
||||||
"domain_block_modal.title": "Estetäänkö verkkotunnus?",
|
"domain_block_modal.title": "Estetäänkö verkkotunnus?",
|
||||||
|
"domain_block_modal.you_will_lose_followers": "Kaikki seuraajasi tältä palvelimelta poistetaan.",
|
||||||
"domain_block_modal.you_wont_see_posts": "Et enää näe julkaisuja etkä ilmoituksia tämän palvelimen käyttäjiltä.",
|
"domain_block_modal.you_wont_see_posts": "Et enää näe julkaisuja etkä ilmoituksia tämän palvelimen käyttäjiltä.",
|
||||||
"domain_pill.activitypub_lets_connect": "Sen avulla voit muodostaa yhteyden ja olla vuorovaikutuksessa ihmisten kanssa, ei vain Mastodonissa vaan myös muissa sosiaalisissa sovelluksissa.",
|
"domain_pill.activitypub_lets_connect": "Sen avulla voit muodostaa yhteyden ja olla vuorovaikutuksessa ihmisten kanssa, ei vain Mastodonissa vaan myös muissa sosiaalisissa sovelluksissa.",
|
||||||
"domain_pill.activitypub_like_language": "ActivityPub on kuin kieli, jota Mastodon puhuu muiden sosiaalisten verkostojen kanssa.",
|
"domain_pill.activitypub_like_language": "ActivityPub on kuin kieli, jota Mastodon puhuu muiden sosiaalisten verkostojen kanssa.",
|
||||||
|
@ -431,10 +432,10 @@
|
||||||
"keyboard_shortcuts.unfocus": "Poistu kirjoitus- tai hakukentästä",
|
"keyboard_shortcuts.unfocus": "Poistu kirjoitus- tai hakukentästä",
|
||||||
"keyboard_shortcuts.up": "Siirry luettelossa taaksepäin",
|
"keyboard_shortcuts.up": "Siirry luettelossa taaksepäin",
|
||||||
"lightbox.close": "Sulje",
|
"lightbox.close": "Sulje",
|
||||||
|
"lightbox.compress": "Tiivis kuvankatselunäkymä",
|
||||||
|
"lightbox.expand": "Laajennettu kuvankatselunäkymä",
|
||||||
"lightbox.next": "Seuraava",
|
"lightbox.next": "Seuraava",
|
||||||
"lightbox.previous": "Edellinen",
|
"lightbox.previous": "Edellinen",
|
||||||
"lightbox.zoom_in": "Zoomaa todelliseen kokoon",
|
|
||||||
"lightbox.zoom_out": "Zoomaa mahtumaan",
|
|
||||||
"limited_account_hint.action": "Näytä profiili joka tapauksessa",
|
"limited_account_hint.action": "Näytä profiili joka tapauksessa",
|
||||||
"limited_account_hint.title": "Palvelimen {domain} moderaattorit ovat piilottaneet tämän profiilin.",
|
"limited_account_hint.title": "Palvelimen {domain} moderaattorit ovat piilottaneet tämän profiilin.",
|
||||||
"link_preview.author": "Tehnyt {name}",
|
"link_preview.author": "Tehnyt {name}",
|
||||||
|
@ -558,6 +559,8 @@
|
||||||
"notifications.column_settings.admin.report": "Uudet raportit:",
|
"notifications.column_settings.admin.report": "Uudet raportit:",
|
||||||
"notifications.column_settings.admin.sign_up": "Uudet rekisteröitymiset:",
|
"notifications.column_settings.admin.sign_up": "Uudet rekisteröitymiset:",
|
||||||
"notifications.column_settings.alert": "Työpöytäilmoitukset",
|
"notifications.column_settings.alert": "Työpöytäilmoitukset",
|
||||||
|
"notifications.column_settings.beta.category": "Kokeelliset ominaisuudet",
|
||||||
|
"notifications.column_settings.beta.grouping": "Ryhmittele ilmoitukset",
|
||||||
"notifications.column_settings.favourite": "Suosikit:",
|
"notifications.column_settings.favourite": "Suosikit:",
|
||||||
"notifications.column_settings.filter_bar.advanced": "Näytä kaikki luokat",
|
"notifications.column_settings.filter_bar.advanced": "Näytä kaikki luokat",
|
||||||
"notifications.column_settings.filter_bar.category": "Pikasuodatuspalkki",
|
"notifications.column_settings.filter_bar.category": "Pikasuodatuspalkki",
|
||||||
|
|
|
@ -134,6 +134,7 @@
|
||||||
"dismissable_banner.public_timeline": "Ito ang mga pinakamakailang nakapublikong post mula sa mga taong nasa social web na sinusundan ng mga tao sa {domain}.",
|
"dismissable_banner.public_timeline": "Ito ang mga pinakamakailang nakapublikong post mula sa mga taong nasa social web na sinusundan ng mga tao sa {domain}.",
|
||||||
"domain_block_modal.block": "Harangan ang serbiro",
|
"domain_block_modal.block": "Harangan ang serbiro",
|
||||||
"domain_block_modal.title": "Harangan ang domain?",
|
"domain_block_modal.title": "Harangan ang domain?",
|
||||||
|
"domain_block_modal.you_will_lose_followers": "Mabubura ang iyong mga tagasunod mula sa serbirong ito.",
|
||||||
"domain_pill.server": "Serbiro",
|
"domain_pill.server": "Serbiro",
|
||||||
"embed.instructions": "I-embed ang post na ito sa iyong pook-sapot sa pamamagitan ng pagsipi ng kodigo sa ilalim.",
|
"embed.instructions": "I-embed ang post na ito sa iyong pook-sapot sa pamamagitan ng pagsipi ng kodigo sa ilalim.",
|
||||||
"embed.preview": "Ito ang magiging itsura:",
|
"embed.preview": "Ito ang magiging itsura:",
|
||||||
|
|
|
@ -221,7 +221,7 @@
|
||||||
"domain_block_modal.they_cant_follow": "Eingin frá hesum ambætara kann fylgja tær.",
|
"domain_block_modal.they_cant_follow": "Eingin frá hesum ambætara kann fylgja tær.",
|
||||||
"domain_block_modal.they_wont_know": "Tey vita ikki, at tey eru bannað.",
|
"domain_block_modal.they_wont_know": "Tey vita ikki, at tey eru bannað.",
|
||||||
"domain_block_modal.title": "Banna økisnavni?",
|
"domain_block_modal.title": "Banna økisnavni?",
|
||||||
"domain_block_modal.you_will_lose_num_followers": "Tú missir {followersCount, plural, one {{followersCountDisplay} fylgjara} other {{followersCountDisplay} fylgjarar}} og {followingCount, plural, one {{followingCountDisplay} persón, sum tú fylgir} other {{followingCountDisplay} persónar, sum tú fylgir}}.",
|
"domain_block_modal.you_will_lose_followers": "Allir tínir fylgjarar á hesum ambætara hvørva.",
|
||||||
"domain_block_modal.you_wont_see_posts": "Tú sært ongar postar ella boð frá brúkarum á hesum ambætara.",
|
"domain_block_modal.you_wont_see_posts": "Tú sært ongar postar ella boð frá brúkarum á hesum ambætara.",
|
||||||
"domain_pill.activitypub_lets_connect": "Tað letur teg fáa samband og samvirka við fólki ikki bara á Mastodon, men á øðrum sosialum appum eisini.",
|
"domain_pill.activitypub_lets_connect": "Tað letur teg fáa samband og samvirka við fólki ikki bara á Mastodon, men á øðrum sosialum appum eisini.",
|
||||||
"domain_pill.activitypub_like_language": "ActivityPub er málið, sum Mastodon tosar við onnur sosial netverk.",
|
"domain_pill.activitypub_like_language": "ActivityPub er málið, sum Mastodon tosar við onnur sosial netverk.",
|
||||||
|
@ -432,10 +432,10 @@
|
||||||
"keyboard_shortcuts.unfocus": "Tak skrivi-/leiti-økið úr miðdeplinum",
|
"keyboard_shortcuts.unfocus": "Tak skrivi-/leiti-økið úr miðdeplinum",
|
||||||
"keyboard_shortcuts.up": "Flyt upp á listanum",
|
"keyboard_shortcuts.up": "Flyt upp á listanum",
|
||||||
"lightbox.close": "Lat aftur",
|
"lightbox.close": "Lat aftur",
|
||||||
|
"lightbox.compress": "Kroyst myndavísikassa saman",
|
||||||
|
"lightbox.expand": "Víðka myndavísikassa",
|
||||||
"lightbox.next": "Fram",
|
"lightbox.next": "Fram",
|
||||||
"lightbox.previous": "Aftur",
|
"lightbox.previous": "Aftur",
|
||||||
"lightbox.zoom_in": "Suma til veruliga stødd",
|
|
||||||
"lightbox.zoom_out": "Suma, so tað passar",
|
|
||||||
"limited_account_hint.action": "Vís vangamynd kortini",
|
"limited_account_hint.action": "Vís vangamynd kortini",
|
||||||
"limited_account_hint.title": "Hesin vangin er fjaldur av kjakleiðarunum á {domain}.",
|
"limited_account_hint.title": "Hesin vangin er fjaldur av kjakleiðarunum á {domain}.",
|
||||||
"link_preview.author": "Av {name}",
|
"link_preview.author": "Av {name}",
|
||||||
|
@ -559,6 +559,8 @@
|
||||||
"notifications.column_settings.admin.report": "Nýggjar fráboðanir:",
|
"notifications.column_settings.admin.report": "Nýggjar fráboðanir:",
|
||||||
"notifications.column_settings.admin.sign_up": "Nýggjar tilmeldingar:",
|
"notifications.column_settings.admin.sign_up": "Nýggjar tilmeldingar:",
|
||||||
"notifications.column_settings.alert": "Skriviborðsfráboðanir",
|
"notifications.column_settings.alert": "Skriviborðsfráboðanir",
|
||||||
|
"notifications.column_settings.beta.category": "Royndarhentleikar",
|
||||||
|
"notifications.column_settings.beta.grouping": "Bólkafráboðanir",
|
||||||
"notifications.column_settings.favourite": "Dámdir postar:",
|
"notifications.column_settings.favourite": "Dámdir postar:",
|
||||||
"notifications.column_settings.filter_bar.advanced": "Vís allar bólkar",
|
"notifications.column_settings.filter_bar.advanced": "Vís allar bólkar",
|
||||||
"notifications.column_settings.filter_bar.category": "Skjótfilturbjálki",
|
"notifications.column_settings.filter_bar.category": "Skjótfilturbjálki",
|
||||||
|
@ -787,7 +789,6 @@
|
||||||
"status.edit": "Rætta",
|
"status.edit": "Rætta",
|
||||||
"status.edited": "Seinast broytt {date}",
|
"status.edited": "Seinast broytt {date}",
|
||||||
"status.edited_x_times": "Rættað {count, plural, one {{count} ferð} other {{count} ferð}}",
|
"status.edited_x_times": "Rættað {count, plural, one {{count} ferð} other {{count} ferð}}",
|
||||||
"status.embed": "Fá kodu at seta inn",
|
|
||||||
"status.favourite": "Dámdur postur",
|
"status.favourite": "Dámdur postur",
|
||||||
"status.favourites": "{count, plural, one {yndispostur} other {yndispostar}}",
|
"status.favourites": "{count, plural, one {yndispostur} other {yndispostar}}",
|
||||||
"status.filter": "Filtrera hendan postin",
|
"status.filter": "Filtrera hendan postin",
|
||||||
|
|
|
@ -36,7 +36,6 @@
|
||||||
"account.followers.empty": "Personne ne suit ce compte pour l'instant.",
|
"account.followers.empty": "Personne ne suit ce compte pour l'instant.",
|
||||||
"account.followers_counter": "{count, plural, one {{counter} abonné·e} other {{counter} abonné·e·s}}",
|
"account.followers_counter": "{count, plural, one {{counter} abonné·e} other {{counter} abonné·e·s}}",
|
||||||
"account.following": "Abonné·e",
|
"account.following": "Abonné·e",
|
||||||
"account.following_counter": "{count, plural, one {{counter} abonnement} other {{counter} abonnements}}",
|
|
||||||
"account.follows.empty": "Ce compte ne suit personne présentement.",
|
"account.follows.empty": "Ce compte ne suit personne présentement.",
|
||||||
"account.go_to_profile": "Voir ce profil",
|
"account.go_to_profile": "Voir ce profil",
|
||||||
"account.hide_reblogs": "Masquer les boosts de @{name}",
|
"account.hide_reblogs": "Masquer les boosts de @{name}",
|
||||||
|
@ -164,7 +163,7 @@
|
||||||
"compose_form.publish": "Publier",
|
"compose_form.publish": "Publier",
|
||||||
"compose_form.publish_form": "Publier",
|
"compose_form.publish_form": "Publier",
|
||||||
"compose_form.reply": "Répondre",
|
"compose_form.reply": "Répondre",
|
||||||
"compose_form.save_changes": "Mettre à jour",
|
"compose_form.save_changes": "Mis à jour",
|
||||||
"compose_form.spoiler.marked": "Enlever l'avertissement de contenu",
|
"compose_form.spoiler.marked": "Enlever l'avertissement de contenu",
|
||||||
"compose_form.spoiler.unmarked": "Ajouter un avertissement de contenu",
|
"compose_form.spoiler.unmarked": "Ajouter un avertissement de contenu",
|
||||||
"compose_form.spoiler_placeholder": "Avertissement de contenu (optionnel)",
|
"compose_form.spoiler_placeholder": "Avertissement de contenu (optionnel)",
|
||||||
|
@ -221,6 +220,7 @@
|
||||||
"domain_block_modal.they_cant_follow": "Personne de ce serveur ne peut vous suivre.",
|
"domain_block_modal.they_cant_follow": "Personne de ce serveur ne peut vous suivre.",
|
||||||
"domain_block_modal.they_wont_know": "Il ne saura pas qu'il a été bloqué.",
|
"domain_block_modal.they_wont_know": "Il ne saura pas qu'il a été bloqué.",
|
||||||
"domain_block_modal.title": "Bloquer le domaine ?",
|
"domain_block_modal.title": "Bloquer le domaine ?",
|
||||||
|
"domain_block_modal.you_will_lose_followers": "Tous vos abonnés de ce serveur seront supprimés.",
|
||||||
"domain_block_modal.you_wont_see_posts": "Vous ne verrez plus les publications ou les notifications des utilisateurs de ce serveur.",
|
"domain_block_modal.you_wont_see_posts": "Vous ne verrez plus les publications ou les notifications des utilisateurs de ce serveur.",
|
||||||
"domain_pill.activitypub_lets_connect": "Cela vous permet de vous connecter et d'interagir avec les autres non seulement sur Mastodon, mais également sur d'autres applications de réseaux sociaux.",
|
"domain_pill.activitypub_lets_connect": "Cela vous permet de vous connecter et d'interagir avec les autres non seulement sur Mastodon, mais également sur d'autres applications de réseaux sociaux.",
|
||||||
"domain_pill.activitypub_like_language": "ActivityPub est comme une langue que Mastodon utilise pour communiquer avec les autres réseaux sociaux.",
|
"domain_pill.activitypub_like_language": "ActivityPub est comme une langue que Mastodon utilise pour communiquer avec les autres réseaux sociaux.",
|
||||||
|
@ -311,7 +311,7 @@
|
||||||
"follow_request.authorize": "Autoriser",
|
"follow_request.authorize": "Autoriser",
|
||||||
"follow_request.reject": "Rejeter",
|
"follow_request.reject": "Rejeter",
|
||||||
"follow_requests.unlocked_explanation": "Même si votre compte n’est pas privé, l’équipe de {domain} a pensé que vous pourriez vouloir peut-être consulter manuellement les demandes d'abonnement de ces comptes.",
|
"follow_requests.unlocked_explanation": "Même si votre compte n’est pas privé, l’équipe de {domain} a pensé que vous pourriez vouloir peut-être consulter manuellement les demandes d'abonnement de ces comptes.",
|
||||||
"follow_suggestions.curated_suggestion": "Sélectionné par l'équipe",
|
"follow_suggestions.curated_suggestion": "Choix du staff",
|
||||||
"follow_suggestions.dismiss": "Ne plus afficher",
|
"follow_suggestions.dismiss": "Ne plus afficher",
|
||||||
"follow_suggestions.featured_longer": "Sélectionné par l'équipe de {domain}",
|
"follow_suggestions.featured_longer": "Sélectionné par l'équipe de {domain}",
|
||||||
"follow_suggestions.friends_of_friends_longer": "Populaire dans le cercle des personnes que vous suivez",
|
"follow_suggestions.friends_of_friends_longer": "Populaire dans le cercle des personnes que vous suivez",
|
||||||
|
@ -431,6 +431,8 @@
|
||||||
"keyboard_shortcuts.unfocus": "Ne plus se concentrer sur la zone de rédaction/barre de recherche",
|
"keyboard_shortcuts.unfocus": "Ne plus se concentrer sur la zone de rédaction/barre de recherche",
|
||||||
"keyboard_shortcuts.up": "Monter dans la liste",
|
"keyboard_shortcuts.up": "Monter dans la liste",
|
||||||
"lightbox.close": "Fermer",
|
"lightbox.close": "Fermer",
|
||||||
|
"lightbox.compress": "Compresser la fenêtre de visualisation d'images",
|
||||||
|
"lightbox.expand": "Agrandir la fenêtre de visualisation d'images",
|
||||||
"lightbox.next": "Suivant",
|
"lightbox.next": "Suivant",
|
||||||
"lightbox.previous": "Précédent",
|
"lightbox.previous": "Précédent",
|
||||||
"limited_account_hint.action": "Afficher le profil quand même",
|
"limited_account_hint.action": "Afficher le profil quand même",
|
||||||
|
@ -556,6 +558,8 @@
|
||||||
"notifications.column_settings.admin.report": "Nouveaux signalements:",
|
"notifications.column_settings.admin.report": "Nouveaux signalements:",
|
||||||
"notifications.column_settings.admin.sign_up": "Nouvelles inscriptions:",
|
"notifications.column_settings.admin.sign_up": "Nouvelles inscriptions:",
|
||||||
"notifications.column_settings.alert": "Notifications navigateur",
|
"notifications.column_settings.alert": "Notifications navigateur",
|
||||||
|
"notifications.column_settings.beta.category": "Fonctionnalités expérimentales",
|
||||||
|
"notifications.column_settings.beta.grouping": "Grouper les notifications",
|
||||||
"notifications.column_settings.favourite": "Favoris:",
|
"notifications.column_settings.favourite": "Favoris:",
|
||||||
"notifications.column_settings.filter_bar.advanced": "Afficher toutes les catégories",
|
"notifications.column_settings.filter_bar.advanced": "Afficher toutes les catégories",
|
||||||
"notifications.column_settings.filter_bar.category": "Barre de filtre rapide",
|
"notifications.column_settings.filter_bar.category": "Barre de filtre rapide",
|
||||||
|
@ -784,7 +788,6 @@
|
||||||
"status.edit": "Modifier",
|
"status.edit": "Modifier",
|
||||||
"status.edited": "Dernière modification le {date}",
|
"status.edited": "Dernière modification le {date}",
|
||||||
"status.edited_x_times": "Modifiée {count, plural, one {{count} fois} other {{count} fois}}",
|
"status.edited_x_times": "Modifiée {count, plural, one {{count} fois} other {{count} fois}}",
|
||||||
"status.embed": "Obtenir le code d'intégration",
|
|
||||||
"status.favourite": "Ajouter aux favoris",
|
"status.favourite": "Ajouter aux favoris",
|
||||||
"status.favourites": "{count, plural, one {favori} other {favoris}}",
|
"status.favourites": "{count, plural, one {favori} other {favoris}}",
|
||||||
"status.filter": "Filtrer cette publication",
|
"status.filter": "Filtrer cette publication",
|
||||||
|
@ -809,7 +812,6 @@
|
||||||
"status.reblogs.empty": "Personne n’a encore boosté cette publication. Lorsque quelqu’un le fera, elle apparaîtra ici.",
|
"status.reblogs.empty": "Personne n’a encore boosté cette publication. Lorsque quelqu’un le fera, elle apparaîtra ici.",
|
||||||
"status.redraft": "Supprimer et réécrire",
|
"status.redraft": "Supprimer et réécrire",
|
||||||
"status.remove_bookmark": "Retirer des signets",
|
"status.remove_bookmark": "Retirer des signets",
|
||||||
"status.replied_in_thread": "A répondu dans un fil de discussion",
|
|
||||||
"status.replied_to": "A répondu à {name}",
|
"status.replied_to": "A répondu à {name}",
|
||||||
"status.reply": "Répondre",
|
"status.reply": "Répondre",
|
||||||
"status.replyAll": "Répondre à cette discussion",
|
"status.replyAll": "Répondre à cette discussion",
|
||||||
|
|
|
@ -36,7 +36,6 @@
|
||||||
"account.followers.empty": "Personne ne suit cet·te utilisateur·rice pour l’instant.",
|
"account.followers.empty": "Personne ne suit cet·te utilisateur·rice pour l’instant.",
|
||||||
"account.followers_counter": "{count, plural, one {{counter} abonné·e} other {{counter} abonné·e·s}}",
|
"account.followers_counter": "{count, plural, one {{counter} abonné·e} other {{counter} abonné·e·s}}",
|
||||||
"account.following": "Abonnements",
|
"account.following": "Abonnements",
|
||||||
"account.following_counter": "{count, plural, one {{counter} abonnement} other {{counter} abonnements}}",
|
|
||||||
"account.follows.empty": "Cet·te utilisateur·rice ne suit personne pour l’instant.",
|
"account.follows.empty": "Cet·te utilisateur·rice ne suit personne pour l’instant.",
|
||||||
"account.go_to_profile": "Aller au profil",
|
"account.go_to_profile": "Aller au profil",
|
||||||
"account.hide_reblogs": "Masquer les partages de @{name}",
|
"account.hide_reblogs": "Masquer les partages de @{name}",
|
||||||
|
@ -164,7 +163,7 @@
|
||||||
"compose_form.publish": "Publier",
|
"compose_form.publish": "Publier",
|
||||||
"compose_form.publish_form": "Nouvelle publication",
|
"compose_form.publish_form": "Nouvelle publication",
|
||||||
"compose_form.reply": "Répondre",
|
"compose_form.reply": "Répondre",
|
||||||
"compose_form.save_changes": "Mettre à jour",
|
"compose_form.save_changes": "Mis à jour",
|
||||||
"compose_form.spoiler.marked": "Enlever l’avertissement de contenu",
|
"compose_form.spoiler.marked": "Enlever l’avertissement de contenu",
|
||||||
"compose_form.spoiler.unmarked": "Ajouter un avertissement de contenu",
|
"compose_form.spoiler.unmarked": "Ajouter un avertissement de contenu",
|
||||||
"compose_form.spoiler_placeholder": "Avertissement de contenu (optionnel)",
|
"compose_form.spoiler_placeholder": "Avertissement de contenu (optionnel)",
|
||||||
|
@ -221,6 +220,7 @@
|
||||||
"domain_block_modal.they_cant_follow": "Personne de ce serveur ne peut vous suivre.",
|
"domain_block_modal.they_cant_follow": "Personne de ce serveur ne peut vous suivre.",
|
||||||
"domain_block_modal.they_wont_know": "Il ne saura pas qu'il a été bloqué.",
|
"domain_block_modal.they_wont_know": "Il ne saura pas qu'il a été bloqué.",
|
||||||
"domain_block_modal.title": "Bloquer le domaine ?",
|
"domain_block_modal.title": "Bloquer le domaine ?",
|
||||||
|
"domain_block_modal.you_will_lose_followers": "Tous vos abonnés de ce serveur seront supprimés.",
|
||||||
"domain_block_modal.you_wont_see_posts": "Vous ne verrez plus les publications ou les notifications des utilisateurs de ce serveur.",
|
"domain_block_modal.you_wont_see_posts": "Vous ne verrez plus les publications ou les notifications des utilisateurs de ce serveur.",
|
||||||
"domain_pill.activitypub_lets_connect": "Cela vous permet de vous connecter et d'interagir avec les autres non seulement sur Mastodon, mais également sur d'autres applications de réseaux sociaux.",
|
"domain_pill.activitypub_lets_connect": "Cela vous permet de vous connecter et d'interagir avec les autres non seulement sur Mastodon, mais également sur d'autres applications de réseaux sociaux.",
|
||||||
"domain_pill.activitypub_like_language": "ActivityPub est comme une langue que Mastodon utilise pour communiquer avec les autres réseaux sociaux.",
|
"domain_pill.activitypub_like_language": "ActivityPub est comme une langue que Mastodon utilise pour communiquer avec les autres réseaux sociaux.",
|
||||||
|
@ -311,7 +311,7 @@
|
||||||
"follow_request.authorize": "Accepter",
|
"follow_request.authorize": "Accepter",
|
||||||
"follow_request.reject": "Rejeter",
|
"follow_request.reject": "Rejeter",
|
||||||
"follow_requests.unlocked_explanation": "Même si votre compte n’est pas privé, l’équipe de {domain} a pensé que vous pourriez vouloir consulter manuellement les demandes de suivi de ces comptes.",
|
"follow_requests.unlocked_explanation": "Même si votre compte n’est pas privé, l’équipe de {domain} a pensé que vous pourriez vouloir consulter manuellement les demandes de suivi de ces comptes.",
|
||||||
"follow_suggestions.curated_suggestion": "Sélectionné par l'équipe",
|
"follow_suggestions.curated_suggestion": "Choix du staff",
|
||||||
"follow_suggestions.dismiss": "Ne plus afficher",
|
"follow_suggestions.dismiss": "Ne plus afficher",
|
||||||
"follow_suggestions.featured_longer": "Sélectionné par l'équipe de {domain}",
|
"follow_suggestions.featured_longer": "Sélectionné par l'équipe de {domain}",
|
||||||
"follow_suggestions.friends_of_friends_longer": "Populaire dans le cercle des personnes que vous suivez",
|
"follow_suggestions.friends_of_friends_longer": "Populaire dans le cercle des personnes que vous suivez",
|
||||||
|
@ -431,6 +431,8 @@
|
||||||
"keyboard_shortcuts.unfocus": "Quitter la zone de rédaction/barre de recherche",
|
"keyboard_shortcuts.unfocus": "Quitter la zone de rédaction/barre de recherche",
|
||||||
"keyboard_shortcuts.up": "Monter dans la liste",
|
"keyboard_shortcuts.up": "Monter dans la liste",
|
||||||
"lightbox.close": "Fermer",
|
"lightbox.close": "Fermer",
|
||||||
|
"lightbox.compress": "Compresser la fenêtre de visualisation des images",
|
||||||
|
"lightbox.expand": "Agrandir la fenêtre de visualisation des images",
|
||||||
"lightbox.next": "Suivant",
|
"lightbox.next": "Suivant",
|
||||||
"lightbox.previous": "Précédent",
|
"lightbox.previous": "Précédent",
|
||||||
"limited_account_hint.action": "Afficher le profil quand même",
|
"limited_account_hint.action": "Afficher le profil quand même",
|
||||||
|
@ -556,6 +558,8 @@
|
||||||
"notifications.column_settings.admin.report": "Nouveaux signalements :",
|
"notifications.column_settings.admin.report": "Nouveaux signalements :",
|
||||||
"notifications.column_settings.admin.sign_up": "Nouvelles inscriptions :",
|
"notifications.column_settings.admin.sign_up": "Nouvelles inscriptions :",
|
||||||
"notifications.column_settings.alert": "Notifications du navigateur",
|
"notifications.column_settings.alert": "Notifications du navigateur",
|
||||||
|
"notifications.column_settings.beta.category": "Fonctionnalités expérimentales",
|
||||||
|
"notifications.column_settings.beta.grouping": "Grouper les notifications",
|
||||||
"notifications.column_settings.favourite": "Favoris :",
|
"notifications.column_settings.favourite": "Favoris :",
|
||||||
"notifications.column_settings.filter_bar.advanced": "Afficher toutes les catégories",
|
"notifications.column_settings.filter_bar.advanced": "Afficher toutes les catégories",
|
||||||
"notifications.column_settings.filter_bar.category": "Barre de filtre rapide",
|
"notifications.column_settings.filter_bar.category": "Barre de filtre rapide",
|
||||||
|
@ -784,7 +788,6 @@
|
||||||
"status.edit": "Modifier",
|
"status.edit": "Modifier",
|
||||||
"status.edited": "Dernière modification le {date}",
|
"status.edited": "Dernière modification le {date}",
|
||||||
"status.edited_x_times": "Modifié {count, plural, one {{count} fois} other {{count} fois}}",
|
"status.edited_x_times": "Modifié {count, plural, one {{count} fois} other {{count} fois}}",
|
||||||
"status.embed": "Obtenir le code d'intégration",
|
|
||||||
"status.favourite": "Ajouter aux favoris",
|
"status.favourite": "Ajouter aux favoris",
|
||||||
"status.favourites": "{count, plural, one {favori} other {favoris}}",
|
"status.favourites": "{count, plural, one {favori} other {favoris}}",
|
||||||
"status.filter": "Filtrer ce message",
|
"status.filter": "Filtrer ce message",
|
||||||
|
@ -809,7 +812,6 @@
|
||||||
"status.reblogs.empty": "Personne n’a encore partagé ce message. Lorsque quelqu’un le fera, il apparaîtra ici.",
|
"status.reblogs.empty": "Personne n’a encore partagé ce message. Lorsque quelqu’un le fera, il apparaîtra ici.",
|
||||||
"status.redraft": "Supprimer et réécrire",
|
"status.redraft": "Supprimer et réécrire",
|
||||||
"status.remove_bookmark": "Retirer des marque-pages",
|
"status.remove_bookmark": "Retirer des marque-pages",
|
||||||
"status.replied_in_thread": "A répondu dans un fil de discussion",
|
|
||||||
"status.replied_to": "En réponse à {name}",
|
"status.replied_to": "En réponse à {name}",
|
||||||
"status.reply": "Répondre",
|
"status.reply": "Répondre",
|
||||||
"status.replyAll": "Répondre au fil",
|
"status.replyAll": "Répondre au fil",
|
||||||
|
|
|
@ -221,6 +221,7 @@
|
||||||
"domain_block_modal.they_cant_follow": "Net ien op dizze server kin jo folgje.",
|
"domain_block_modal.they_cant_follow": "Net ien op dizze server kin jo folgje.",
|
||||||
"domain_block_modal.they_wont_know": "Se krije net te witten dat se blokkearre wurde.",
|
"domain_block_modal.they_wont_know": "Se krije net te witten dat se blokkearre wurde.",
|
||||||
"domain_block_modal.title": "Domein blokkearje?",
|
"domain_block_modal.title": "Domein blokkearje?",
|
||||||
|
"domain_block_modal.you_will_lose_followers": "Al jo folgers fan dizze server wurde ûntfolge.",
|
||||||
"domain_block_modal.you_wont_see_posts": "Jo sjogge gjin berjochten of meldingen mear fan brûkers op dizze server.",
|
"domain_block_modal.you_wont_see_posts": "Jo sjogge gjin berjochten of meldingen mear fan brûkers op dizze server.",
|
||||||
"domain_pill.activitypub_lets_connect": "It soarget derfoar dat jo net allinnich mar ferbine en kommunisearje kinne mei minsken op Mastodon, mar ek mei oare sosjale apps.",
|
"domain_pill.activitypub_lets_connect": "It soarget derfoar dat jo net allinnich mar ferbine en kommunisearje kinne mei minsken op Mastodon, mar ek mei oare sosjale apps.",
|
||||||
"domain_pill.activitypub_like_language": "ActivityPub is de taal dy’t Mastodon mei oare sosjale netwurken sprekt.",
|
"domain_pill.activitypub_like_language": "ActivityPub is de taal dy’t Mastodon mei oare sosjale netwurken sprekt.",
|
||||||
|
@ -431,6 +432,8 @@
|
||||||
"keyboard_shortcuts.unfocus": "to un-focus compose textarea/search",
|
"keyboard_shortcuts.unfocus": "to un-focus compose textarea/search",
|
||||||
"keyboard_shortcuts.up": "Nei boppe yn list ferpleatse",
|
"keyboard_shortcuts.up": "Nei boppe yn list ferpleatse",
|
||||||
"lightbox.close": "Slute",
|
"lightbox.close": "Slute",
|
||||||
|
"lightbox.compress": "Ofbylding passend werjaan",
|
||||||
|
"lightbox.expand": "Ofbylding grut werjaan",
|
||||||
"lightbox.next": "Folgjende",
|
"lightbox.next": "Folgjende",
|
||||||
"lightbox.previous": "Foarige",
|
"lightbox.previous": "Foarige",
|
||||||
"limited_account_hint.action": "Profyl dochs besjen",
|
"limited_account_hint.action": "Profyl dochs besjen",
|
||||||
|
@ -555,6 +558,8 @@
|
||||||
"notifications.column_settings.admin.report": "Nije rapportaazjes:",
|
"notifications.column_settings.admin.report": "Nije rapportaazjes:",
|
||||||
"notifications.column_settings.admin.sign_up": "Nije registraasjes:",
|
"notifications.column_settings.admin.sign_up": "Nije registraasjes:",
|
||||||
"notifications.column_settings.alert": "Desktopmeldingen",
|
"notifications.column_settings.alert": "Desktopmeldingen",
|
||||||
|
"notifications.column_settings.beta.category": "Eksperimintele funksjes",
|
||||||
|
"notifications.column_settings.beta.grouping": "Notifikaasjes groepearje",
|
||||||
"notifications.column_settings.favourite": "Favoriten:",
|
"notifications.column_settings.favourite": "Favoriten:",
|
||||||
"notifications.column_settings.filter_bar.advanced": "Alle kategoryen toane",
|
"notifications.column_settings.filter_bar.advanced": "Alle kategoryen toane",
|
||||||
"notifications.column_settings.filter_bar.category": "Flugge filterbalke",
|
"notifications.column_settings.filter_bar.category": "Flugge filterbalke",
|
||||||
|
|
|
@ -221,6 +221,7 @@
|
||||||
"domain_block_modal.they_cant_follow": "Ní féidir le duine ar bith ón bhfreastalaí seo tú a leanúint.",
|
"domain_block_modal.they_cant_follow": "Ní féidir le duine ar bith ón bhfreastalaí seo tú a leanúint.",
|
||||||
"domain_block_modal.they_wont_know": "Ní bheidh a fhios acu go bhfuil bac orthu.",
|
"domain_block_modal.they_wont_know": "Ní bheidh a fhios acu go bhfuil bac orthu.",
|
||||||
"domain_block_modal.title": "Blocáil fearann?",
|
"domain_block_modal.title": "Blocáil fearann?",
|
||||||
|
"domain_block_modal.you_will_lose_followers": "Bainfear do leantóirí go léir ón bhfreastalaí seo.",
|
||||||
"domain_block_modal.you_wont_see_posts": "Ní fheicfidh tú postálacha nó fógraí ó úsáideoirí ar an bhfreastalaí seo.",
|
"domain_block_modal.you_wont_see_posts": "Ní fheicfidh tú postálacha nó fógraí ó úsáideoirí ar an bhfreastalaí seo.",
|
||||||
"domain_pill.activitypub_lets_connect": "Ligeann sé duit ceangal agus idirghníomhú le daoine, ní hamháin ar Mastodon, ach thar aipeanna sóisialta éagsúla freisin.",
|
"domain_pill.activitypub_lets_connect": "Ligeann sé duit ceangal agus idirghníomhú le daoine, ní hamháin ar Mastodon, ach thar aipeanna sóisialta éagsúla freisin.",
|
||||||
"domain_pill.activitypub_like_language": "Tá GníomhaíochtPub cosúil leis an teanga a labhraíonn Mastodon le líonraí sóisialta eile.",
|
"domain_pill.activitypub_like_language": "Tá GníomhaíochtPub cosúil leis an teanga a labhraíonn Mastodon le líonraí sóisialta eile.",
|
||||||
|
@ -431,10 +432,10 @@
|
||||||
"keyboard_shortcuts.unfocus": "Unfocus cum textarea/search",
|
"keyboard_shortcuts.unfocus": "Unfocus cum textarea/search",
|
||||||
"keyboard_shortcuts.up": "Bog suas ar an liosta",
|
"keyboard_shortcuts.up": "Bog suas ar an liosta",
|
||||||
"lightbox.close": "Dún",
|
"lightbox.close": "Dún",
|
||||||
|
"lightbox.compress": "Comhbhrúigh an bosca amhairc íomhá",
|
||||||
|
"lightbox.expand": "Leathnaigh an bosca amhairc íomhá",
|
||||||
"lightbox.next": "An céad eile",
|
"lightbox.next": "An céad eile",
|
||||||
"lightbox.previous": "Roimhe seo",
|
"lightbox.previous": "Roimhe seo",
|
||||||
"lightbox.zoom_in": "Súmáil chuig an méid iarbhír",
|
|
||||||
"lightbox.zoom_out": "Súmáil a d'oirfeadh",
|
|
||||||
"limited_account_hint.action": "Taispeáin an phróifíl ar aon nós",
|
"limited_account_hint.action": "Taispeáin an phróifíl ar aon nós",
|
||||||
"limited_account_hint.title": "Tá an phróifíl seo curtha i bhfolach ag na modhnóra {domain}.",
|
"limited_account_hint.title": "Tá an phróifíl seo curtha i bhfolach ag na modhnóra {domain}.",
|
||||||
"link_preview.author": "Le {name}",
|
"link_preview.author": "Le {name}",
|
||||||
|
@ -456,7 +457,6 @@
|
||||||
"lists.subheading": "Do liostaí",
|
"lists.subheading": "Do liostaí",
|
||||||
"load_pending": "{count, plural, one {# mír nua} two {# mír nua} few {# mír nua} many {# mír nua} other {# mír nua}}",
|
"load_pending": "{count, plural, one {# mír nua} two {# mír nua} few {# mír nua} many {# mír nua} other {# mír nua}}",
|
||||||
"loading_indicator.label": "Á lódáil…",
|
"loading_indicator.label": "Á lódáil…",
|
||||||
"media_gallery.hide": "Folaigh",
|
|
||||||
"moved_to_account_banner.text": "Tá do chuntas {disabledAccount} díchumasaithe faoi láthair toisc gur bhog tú go {movedToAccount}.",
|
"moved_to_account_banner.text": "Tá do chuntas {disabledAccount} díchumasaithe faoi láthair toisc gur bhog tú go {movedToAccount}.",
|
||||||
"mute_modal.hide_from_notifications": "Folaigh ó fhógraí",
|
"mute_modal.hide_from_notifications": "Folaigh ó fhógraí",
|
||||||
"mute_modal.hide_options": "Folaigh roghanna",
|
"mute_modal.hide_options": "Folaigh roghanna",
|
||||||
|
@ -558,6 +558,8 @@
|
||||||
"notifications.column_settings.admin.report": "Tuairiscí nua:",
|
"notifications.column_settings.admin.report": "Tuairiscí nua:",
|
||||||
"notifications.column_settings.admin.sign_up": "Clárúcháin nua:",
|
"notifications.column_settings.admin.sign_up": "Clárúcháin nua:",
|
||||||
"notifications.column_settings.alert": "Fógraí deisce",
|
"notifications.column_settings.alert": "Fógraí deisce",
|
||||||
|
"notifications.column_settings.beta.category": "Gnéithe turgnamhacha",
|
||||||
|
"notifications.column_settings.beta.grouping": "Fógraí grúpa",
|
||||||
"notifications.column_settings.favourite": "Ceanáin:",
|
"notifications.column_settings.favourite": "Ceanáin:",
|
||||||
"notifications.column_settings.filter_bar.advanced": "Taispeáin gach catagóir",
|
"notifications.column_settings.filter_bar.advanced": "Taispeáin gach catagóir",
|
||||||
"notifications.column_settings.filter_bar.category": "Barra scagairí tapa",
|
"notifications.column_settings.filter_bar.category": "Barra scagairí tapa",
|
||||||
|
@ -777,7 +779,6 @@
|
||||||
"status.bookmark": "Leabharmharcanna",
|
"status.bookmark": "Leabharmharcanna",
|
||||||
"status.cancel_reblog_private": "Dímhol",
|
"status.cancel_reblog_private": "Dímhol",
|
||||||
"status.cannot_reblog": "Ní féidir an phostáil seo a mholadh",
|
"status.cannot_reblog": "Ní féidir an phostáil seo a mholadh",
|
||||||
"status.continued_thread": "Snáithe ar lean",
|
|
||||||
"status.copy": "Cóipeáil an nasc chuig an bpostáil",
|
"status.copy": "Cóipeáil an nasc chuig an bpostáil",
|
||||||
"status.delete": "Scrios",
|
"status.delete": "Scrios",
|
||||||
"status.detailed_status": "Amharc comhrá mionsonraithe",
|
"status.detailed_status": "Amharc comhrá mionsonraithe",
|
||||||
|
@ -786,7 +787,6 @@
|
||||||
"status.edit": "Cuir in eagar",
|
"status.edit": "Cuir in eagar",
|
||||||
"status.edited": "Arna chuir in eagar anuas {date}",
|
"status.edited": "Arna chuir in eagar anuas {date}",
|
||||||
"status.edited_x_times": "Curtha in eagar {count, plural, one {{count} uair amháin} two {{count} uair} few {{count} uair} many {{count} uair} other {{count} uair}}",
|
"status.edited_x_times": "Curtha in eagar {count, plural, one {{count} uair amháin} two {{count} uair} few {{count} uair} many {{count} uair} other {{count} uair}}",
|
||||||
"status.embed": "Faigh cód leabú",
|
|
||||||
"status.favourite": "Is fearr leat",
|
"status.favourite": "Is fearr leat",
|
||||||
"status.favourites": "{count, plural, one {a bhfuil grá agat do} two {gráite} few {gráite} many {gráite} other {gráite}}",
|
"status.favourites": "{count, plural, one {a bhfuil grá agat do} two {gráite} few {gráite} many {gráite} other {gráite}}",
|
||||||
"status.filter": "Déan scagadh ar an bpostáil seo",
|
"status.filter": "Déan scagadh ar an bpostáil seo",
|
||||||
|
@ -811,7 +811,6 @@
|
||||||
"status.reblogs.empty": "Níor mhol éinne an phostáil seo fós. Nuair a mholfaidh duine éigin í, taispeánfar anseo é sin.",
|
"status.reblogs.empty": "Níor mhol éinne an phostáil seo fós. Nuair a mholfaidh duine éigin í, taispeánfar anseo é sin.",
|
||||||
"status.redraft": "Scrios ⁊ athdhréachtaigh",
|
"status.redraft": "Scrios ⁊ athdhréachtaigh",
|
||||||
"status.remove_bookmark": "Bain leabharmharc",
|
"status.remove_bookmark": "Bain leabharmharc",
|
||||||
"status.replied_in_thread": "D'fhreagair sa snáithe",
|
|
||||||
"status.replied_to": "D'fhreagair {name}",
|
"status.replied_to": "D'fhreagair {name}",
|
||||||
"status.reply": "Freagair",
|
"status.reply": "Freagair",
|
||||||
"status.replyAll": "Freagair le snáithe",
|
"status.replyAll": "Freagair le snáithe",
|
||||||
|
|
|
@ -36,7 +36,7 @@
|
||||||
"account.followers.empty": "Chan eil neach sam bith a’ leantainn air a’ chleachdaiche seo fhathast.",
|
"account.followers.empty": "Chan eil neach sam bith a’ leantainn air a’ chleachdaiche seo fhathast.",
|
||||||
"account.followers_counter": "{count, plural, one {{counter} neach-leantainn} other {{counter} luchd-leantainn}}",
|
"account.followers_counter": "{count, plural, one {{counter} neach-leantainn} other {{counter} luchd-leantainn}}",
|
||||||
"account.following": "A’ leantainn",
|
"account.following": "A’ leantainn",
|
||||||
"account.following_counter": "{count, plural, one {A’ leantainn {counter}} other {A’ leantainn {counter}}}",
|
"account.following_counter": "{count, plural, one {Tha {counter} a’ leantainn} other {Tha {counter} a’ leantainn}}",
|
||||||
"account.follows.empty": "Chan eil an cleachdaiche seo a’ leantainn neach sam bith fhathast.",
|
"account.follows.empty": "Chan eil an cleachdaiche seo a’ leantainn neach sam bith fhathast.",
|
||||||
"account.go_to_profile": "Tadhail air a’ phròifil",
|
"account.go_to_profile": "Tadhail air a’ phròifil",
|
||||||
"account.hide_reblogs": "Falaich na brosnachaidhean o @{name}",
|
"account.hide_reblogs": "Falaich na brosnachaidhean o @{name}",
|
||||||
|
@ -221,6 +221,7 @@
|
||||||
"domain_block_modal.they_cant_follow": "Chan urrainn do neach sam bith a th’ air an fhrithealaiche seo do leantainn.",
|
"domain_block_modal.they_cant_follow": "Chan urrainn do neach sam bith a th’ air an fhrithealaiche seo do leantainn.",
|
||||||
"domain_block_modal.they_wont_know": "Cha bhi fios aca gun deach am bacadh.",
|
"domain_block_modal.they_wont_know": "Cha bhi fios aca gun deach am bacadh.",
|
||||||
"domain_block_modal.title": "A bheil thu airson an àrainn a bhacadh?",
|
"domain_block_modal.title": "A bheil thu airson an àrainn a bhacadh?",
|
||||||
|
"domain_block_modal.you_will_lose_followers": "Thèid a h-uile neach-leantainn agad a th’ air an fhrithealaiche seo a thoirt air falbh.",
|
||||||
"domain_block_modal.you_wont_see_posts": "Chan fhaic thu postaichean no brathan o chleachdaichean a th’ air an fhrithealaiche seo.",
|
"domain_block_modal.you_wont_see_posts": "Chan fhaic thu postaichean no brathan o chleachdaichean a th’ air an fhrithealaiche seo.",
|
||||||
"domain_pill.activitypub_lets_connect": "Leigidh e leat ceangal a dhèanamh ri daoine chan ann air Mastodon a-mhàin ach air feadh aplacaidean sòisealta eile cuideachd agus conaltradh leotha.",
|
"domain_pill.activitypub_lets_connect": "Leigidh e leat ceangal a dhèanamh ri daoine chan ann air Mastodon a-mhàin ach air feadh aplacaidean sòisealta eile cuideachd agus conaltradh leotha.",
|
||||||
"domain_pill.activitypub_like_language": "Tha ActivityPub coltach ri cànan a bhruidhneas Mastodon ri lìonraidhean sòisealta eile.",
|
"domain_pill.activitypub_like_language": "Tha ActivityPub coltach ri cànan a bhruidhneas Mastodon ri lìonraidhean sòisealta eile.",
|
||||||
|
@ -431,10 +432,10 @@
|
||||||
"keyboard_shortcuts.unfocus": "Thoir am fòcas far raon teacsa an sgrìobhaidh/an luirg",
|
"keyboard_shortcuts.unfocus": "Thoir am fòcas far raon teacsa an sgrìobhaidh/an luirg",
|
||||||
"keyboard_shortcuts.up": "Gluais suas air an liosta",
|
"keyboard_shortcuts.up": "Gluais suas air an liosta",
|
||||||
"lightbox.close": "Dùin",
|
"lightbox.close": "Dùin",
|
||||||
|
"lightbox.compress": "Co-theannaich bogsa sealladh an deilbh",
|
||||||
|
"lightbox.expand": "Leudaich bogsa sealladh an deilbh",
|
||||||
"lightbox.next": "Air adhart",
|
"lightbox.next": "Air adhart",
|
||||||
"lightbox.previous": "Air ais",
|
"lightbox.previous": "Air ais",
|
||||||
"lightbox.zoom_in": "Sùm dhan fhìor-mheud",
|
|
||||||
"lightbox.zoom_out": "Sùm fèin-obrachail",
|
|
||||||
"limited_account_hint.action": "Seall a’ phròifil co-dhiù",
|
"limited_account_hint.action": "Seall a’ phròifil co-dhiù",
|
||||||
"limited_account_hint.title": "Chaidh a’ phròifil seo fhalach le maoir {domain}.",
|
"limited_account_hint.title": "Chaidh a’ phròifil seo fhalach le maoir {domain}.",
|
||||||
"link_preview.author": "Le {name}",
|
"link_preview.author": "Le {name}",
|
||||||
|
@ -456,7 +457,6 @@
|
||||||
"lists.subheading": "Na liostaichean agad",
|
"lists.subheading": "Na liostaichean agad",
|
||||||
"load_pending": "{count, plural, one {# nì ùr} two {# nì ùr} few {# nithean ùra} other {# nì ùr}}",
|
"load_pending": "{count, plural, one {# nì ùr} two {# nì ùr} few {# nithean ùra} other {# nì ùr}}",
|
||||||
"loading_indicator.label": "’Ga luchdadh…",
|
"loading_indicator.label": "’Ga luchdadh…",
|
||||||
"media_gallery.hide": "Falaich",
|
|
||||||
"moved_to_account_banner.text": "Tha an cunntas {disabledAccount} agad à comas on a rinn thu imrich gu {movedToAccount}.",
|
"moved_to_account_banner.text": "Tha an cunntas {disabledAccount} agad à comas on a rinn thu imrich gu {movedToAccount}.",
|
||||||
"mute_modal.hide_from_notifications": "Falaich o na brathan",
|
"mute_modal.hide_from_notifications": "Falaich o na brathan",
|
||||||
"mute_modal.hide_options": "Roghainnean falaich",
|
"mute_modal.hide_options": "Roghainnean falaich",
|
||||||
|
@ -558,6 +558,8 @@
|
||||||
"notifications.column_settings.admin.report": "Gearanan ùra:",
|
"notifications.column_settings.admin.report": "Gearanan ùra:",
|
||||||
"notifications.column_settings.admin.sign_up": "Clàraidhean ùra:",
|
"notifications.column_settings.admin.sign_up": "Clàraidhean ùra:",
|
||||||
"notifications.column_settings.alert": "Brathan deasga",
|
"notifications.column_settings.alert": "Brathan deasga",
|
||||||
|
"notifications.column_settings.beta.category": "Gleusan deuchainneil",
|
||||||
|
"notifications.column_settings.beta.grouping": "Buidhnich na brathan",
|
||||||
"notifications.column_settings.favourite": "Annsachdan:",
|
"notifications.column_settings.favourite": "Annsachdan:",
|
||||||
"notifications.column_settings.filter_bar.advanced": "Seall a h-uile roinn-seòrsa",
|
"notifications.column_settings.filter_bar.advanced": "Seall a h-uile roinn-seòrsa",
|
||||||
"notifications.column_settings.filter_bar.category": "Bàr-criathraidh luath",
|
"notifications.column_settings.filter_bar.category": "Bàr-criathraidh luath",
|
||||||
|
@ -777,7 +779,6 @@
|
||||||
"status.bookmark": "Cuir ris na comharran-lìn",
|
"status.bookmark": "Cuir ris na comharran-lìn",
|
||||||
"status.cancel_reblog_private": "Na brosnaich tuilleadh",
|
"status.cancel_reblog_private": "Na brosnaich tuilleadh",
|
||||||
"status.cannot_reblog": "Cha ghabh am post seo brosnachadh",
|
"status.cannot_reblog": "Cha ghabh am post seo brosnachadh",
|
||||||
"status.continued_thread": "Pàirt de shnàithlean",
|
|
||||||
"status.copy": "Dèan lethbhreac dhen cheangal dhan phost",
|
"status.copy": "Dèan lethbhreac dhen cheangal dhan phost",
|
||||||
"status.delete": "Sguab às",
|
"status.delete": "Sguab às",
|
||||||
"status.detailed_status": "Mion-shealladh a’ chòmhraidh",
|
"status.detailed_status": "Mion-shealladh a’ chòmhraidh",
|
||||||
|
@ -786,7 +787,6 @@
|
||||||
"status.edit": "Deasaich",
|
"status.edit": "Deasaich",
|
||||||
"status.edited": "An deasachadh mu dheireadh {date}",
|
"status.edited": "An deasachadh mu dheireadh {date}",
|
||||||
"status.edited_x_times": "Chaidh a dheasachadh {count, plural, one {{count} turas} two {{count} thuras} few {{count} tursan} other {{count} turas}}",
|
"status.edited_x_times": "Chaidh a dheasachadh {count, plural, one {{count} turas} two {{count} thuras} few {{count} tursan} other {{count} turas}}",
|
||||||
"status.embed": "Faigh còd leabachaidh",
|
|
||||||
"status.favourite": "Cuir ris na h-annsachdan",
|
"status.favourite": "Cuir ris na h-annsachdan",
|
||||||
"status.favourites": "{count, plural, one {annsachd} two {annsachd} few {annsachdan} other {annsachd}}",
|
"status.favourites": "{count, plural, one {annsachd} two {annsachd} few {annsachdan} other {annsachd}}",
|
||||||
"status.filter": "Criathraich am post seo",
|
"status.filter": "Criathraich am post seo",
|
||||||
|
@ -811,7 +811,6 @@
|
||||||
"status.reblogs.empty": "Chan deach am post seo a bhrosnachadh le duine sam bith fhathast. Nuair a bhrosnaicheas cuideigin e, nochdaidh iad an-seo.",
|
"status.reblogs.empty": "Chan deach am post seo a bhrosnachadh le duine sam bith fhathast. Nuair a bhrosnaicheas cuideigin e, nochdaidh iad an-seo.",
|
||||||
"status.redraft": "Sguab às ⁊ dèan dreachd ùr",
|
"status.redraft": "Sguab às ⁊ dèan dreachd ùr",
|
||||||
"status.remove_bookmark": "Thoir an comharra-lìn air falbh",
|
"status.remove_bookmark": "Thoir an comharra-lìn air falbh",
|
||||||
"status.replied_in_thread": "Freagairt do shnàithlean",
|
|
||||||
"status.replied_to": "Air {name} fhreagairt",
|
"status.replied_to": "Air {name} fhreagairt",
|
||||||
"status.reply": "Freagair",
|
"status.reply": "Freagair",
|
||||||
"status.replyAll": "Freagair dhan t-snàithlean",
|
"status.replyAll": "Freagair dhan t-snàithlean",
|
||||||
|
|
|
@ -221,7 +221,7 @@
|
||||||
"domain_block_modal.they_cant_follow": "Ninguén deste servidor pode seguirte.",
|
"domain_block_modal.they_cant_follow": "Ninguén deste servidor pode seguirte.",
|
||||||
"domain_block_modal.they_wont_know": "Non saberá que a bloqueaches.",
|
"domain_block_modal.they_wont_know": "Non saberá que a bloqueaches.",
|
||||||
"domain_block_modal.title": "Bloquear dominio?",
|
"domain_block_modal.title": "Bloquear dominio?",
|
||||||
"domain_block_modal.you_will_lose_num_followers": "Vas perder {followersCount, plural, one {{followersCountDisplay} seguidora} other {{followersCountDisplay} seguidoras}} e {followingCount, plural, one {{followingCountDisplay} persoa que segues} other {{followingCountDisplay} persoas que segues}}.",
|
"domain_block_modal.you_will_lose_followers": "Vanse eliminar todas as túas seguidoras deste servidor.",
|
||||||
"domain_block_modal.you_wont_see_posts": "Non verás publicacións ou notificacións das usuarias deste servidor.",
|
"domain_block_modal.you_wont_see_posts": "Non verás publicacións ou notificacións das usuarias deste servidor.",
|
||||||
"domain_pill.activitypub_lets_connect": "Permíteche conectar e interactuar con persoas non só de Mastodon, se non tamén con outras sociais.",
|
"domain_pill.activitypub_lets_connect": "Permíteche conectar e interactuar con persoas non só de Mastodon, se non tamén con outras sociais.",
|
||||||
"domain_pill.activitypub_like_language": "ActivityPub é algo así como o idioma que Mastodon fala con outras redes sociais.",
|
"domain_pill.activitypub_like_language": "ActivityPub é algo así como o idioma que Mastodon fala con outras redes sociais.",
|
||||||
|
@ -368,13 +368,13 @@
|
||||||
"home.pending_critical_update.link": "Mira as actualizacións",
|
"home.pending_critical_update.link": "Mira as actualizacións",
|
||||||
"home.pending_critical_update.title": "Hai una actualización crítica de seguridade!",
|
"home.pending_critical_update.title": "Hai una actualización crítica de seguridade!",
|
||||||
"home.show_announcements": "Amosar anuncios",
|
"home.show_announcements": "Amosar anuncios",
|
||||||
"ignore_notifications_modal.disclaimer": "Mastodon non pode informar ás usuarias de que ignoraches as súas notificacións. Ao ignorar as notificacións non evitarás que as mensaxes sexan enviadas igualmente.",
|
"ignore_notifications_modal.disclaimer": "Mastodon non pode informar ás usuarias se ignoraches as súas notificacións. Ao ignorar as notificacións non evitarás que as mensaxes sexan enviadas igualmente.",
|
||||||
"ignore_notifications_modal.filter_instead": "Filtrar igualmente",
|
"ignore_notifications_modal.filter_instead": "Filtrar igualmente",
|
||||||
"ignore_notifications_modal.filter_to_act_users": "Poderás seguir aceptando, rexeitando e denunciando usuarias",
|
"ignore_notifications_modal.filter_to_act_users": "Poderás seguir aceptando, rexeitando e denunciando usuarias",
|
||||||
"ignore_notifications_modal.filter_to_avoid_confusion": "Ao filtrar axudas a evitar posibles confusións",
|
"ignore_notifications_modal.filter_to_avoid_confusion": "Ao filtrar axudas a evitar posibles confusións",
|
||||||
"ignore_notifications_modal.filter_to_review_separately": "Podes revisar por separado as notificacións filtradas",
|
"ignore_notifications_modal.filter_to_review_separately": "Podes revisar as notificacións filtradas por separado",
|
||||||
"ignore_notifications_modal.ignore": "Ignorar notificacións",
|
"ignore_notifications_modal.ignore": "Ignorar notificacións",
|
||||||
"ignore_notifications_modal.limited_accounts_title": "Ignorar notificacións desde contas limitadas?",
|
"ignore_notifications_modal.limited_accounts_title": "Ignorar notificacións desde contas moderadas?",
|
||||||
"ignore_notifications_modal.new_accounts_title": "Ignorar notificacións desde novas contas?",
|
"ignore_notifications_modal.new_accounts_title": "Ignorar notificacións desde novas contas?",
|
||||||
"ignore_notifications_modal.not_followers_title": "Ignorar notificacións de persoas que non te seguen?",
|
"ignore_notifications_modal.not_followers_title": "Ignorar notificacións de persoas que non te seguen?",
|
||||||
"ignore_notifications_modal.not_following_title": "Ignorar notificacións de persoas que non segues?",
|
"ignore_notifications_modal.not_following_title": "Ignorar notificacións de persoas que non segues?",
|
||||||
|
@ -432,10 +432,10 @@
|
||||||
"keyboard_shortcuts.unfocus": "Para deixar de destacar a área de escritura/procura",
|
"keyboard_shortcuts.unfocus": "Para deixar de destacar a área de escritura/procura",
|
||||||
"keyboard_shortcuts.up": "Para mover cara arriba na listaxe",
|
"keyboard_shortcuts.up": "Para mover cara arriba na listaxe",
|
||||||
"lightbox.close": "Fechar",
|
"lightbox.close": "Fechar",
|
||||||
|
"lightbox.compress": "Comprimir a caixa de vista da imaxe",
|
||||||
|
"lightbox.expand": "Estender a caixa de vista da imaxe",
|
||||||
"lightbox.next": "Seguinte",
|
"lightbox.next": "Seguinte",
|
||||||
"lightbox.previous": "Anterior",
|
"lightbox.previous": "Anterior",
|
||||||
"lightbox.zoom_in": "Ver tamaño real",
|
|
||||||
"lightbox.zoom_out": "Ver tamaño axustado",
|
|
||||||
"limited_account_hint.action": "Mostrar perfil igualmente",
|
"limited_account_hint.action": "Mostrar perfil igualmente",
|
||||||
"limited_account_hint.title": "Este perfil foi agochado pola moderación de {domain}.",
|
"limited_account_hint.title": "Este perfil foi agochado pola moderación de {domain}.",
|
||||||
"link_preview.author": "Por {name}",
|
"link_preview.author": "Por {name}",
|
||||||
|
@ -463,7 +463,7 @@
|
||||||
"mute_modal.hide_options": "Opcións ao ocultar",
|
"mute_modal.hide_options": "Opcións ao ocultar",
|
||||||
"mute_modal.indefinite": "Ata que as reactive",
|
"mute_modal.indefinite": "Ata que as reactive",
|
||||||
"mute_modal.show_options": "Mostrar opcións",
|
"mute_modal.show_options": "Mostrar opcións",
|
||||||
"mute_modal.they_can_mention_and_follow": "Pódete mencionar e seguirte, pero non a verás.",
|
"mute_modal.they_can_mention_and_follow": "Pódete mencionar e seguirte, pero non o verás.",
|
||||||
"mute_modal.they_wont_know": "Non saberá que a acalaches.",
|
"mute_modal.they_wont_know": "Non saberá que a acalaches.",
|
||||||
"mute_modal.title": "Acalar usuaria?",
|
"mute_modal.title": "Acalar usuaria?",
|
||||||
"mute_modal.you_wont_see_mentions": "Non verás as publicacións que a mencionen.",
|
"mute_modal.you_wont_see_mentions": "Non verás as publicacións que a mencionen.",
|
||||||
|
@ -527,7 +527,7 @@
|
||||||
"notification.poll": "Rematou a enquisa na que votaches",
|
"notification.poll": "Rematou a enquisa na que votaches",
|
||||||
"notification.reblog": "{name} compartiu a túa publicación",
|
"notification.reblog": "{name} compartiu a túa publicación",
|
||||||
"notification.reblog.name_and_others_with_link": "{name} e <a>{count, plural, one {# máis} other {# máis}}</a> promoveron a túa publicación",
|
"notification.reblog.name_and_others_with_link": "{name} e <a>{count, plural, one {# máis} other {# máis}}</a> promoveron a túa publicación",
|
||||||
"notification.relationships_severance_event": "Relacións perdidas con {name}",
|
"notification.relationships_severance_event": "Perdeuse a conexión con {name}",
|
||||||
"notification.relationships_severance_event.account_suspension": "A administración de {from} suspendeu a {target}, o que significa que xa non vas recibir actualizacións de esa conta ou interactuar con ela.",
|
"notification.relationships_severance_event.account_suspension": "A administración de {from} suspendeu a {target}, o que significa que xa non vas recibir actualizacións de esa conta ou interactuar con ela.",
|
||||||
"notification.relationships_severance_event.domain_block": "A administración de {from} bloqueou a {target}, que inclúe a {followersCount} das túas seguidoras e a {followingCount, plural, one {# conta} other {# contas}} que sigues.",
|
"notification.relationships_severance_event.domain_block": "A administración de {from} bloqueou a {target}, que inclúe a {followersCount} das túas seguidoras e a {followingCount, plural, one {# conta} other {# contas}} que sigues.",
|
||||||
"notification.relationships_severance_event.learn_more": "Saber máis",
|
"notification.relationships_severance_event.learn_more": "Saber máis",
|
||||||
|
@ -559,6 +559,8 @@
|
||||||
"notifications.column_settings.admin.report": "Novas denuncias:",
|
"notifications.column_settings.admin.report": "Novas denuncias:",
|
||||||
"notifications.column_settings.admin.sign_up": "Novas usuarias:",
|
"notifications.column_settings.admin.sign_up": "Novas usuarias:",
|
||||||
"notifications.column_settings.alert": "Notificacións de escritorio",
|
"notifications.column_settings.alert": "Notificacións de escritorio",
|
||||||
|
"notifications.column_settings.beta.category": "Características experimentais",
|
||||||
|
"notifications.column_settings.beta.grouping": "Notificacións de grupo",
|
||||||
"notifications.column_settings.favourite": "Favoritas:",
|
"notifications.column_settings.favourite": "Favoritas:",
|
||||||
"notifications.column_settings.filter_bar.advanced": "Mostrar todas as categorías",
|
"notifications.column_settings.filter_bar.advanced": "Mostrar todas as categorías",
|
||||||
"notifications.column_settings.filter_bar.category": "Barra de filtrado rápido",
|
"notifications.column_settings.filter_bar.category": "Barra de filtrado rápido",
|
||||||
|
|
|
@ -221,6 +221,7 @@
|
||||||
"domain_block_modal.they_cant_follow": "משתמש משרת זה לא יכול לעקוב אחריך.",
|
"domain_block_modal.they_cant_follow": "משתמש משרת זה לא יכול לעקוב אחריך.",
|
||||||
"domain_block_modal.they_wont_know": "הם לא ידעו כי נחסמו.",
|
"domain_block_modal.they_wont_know": "הם לא ידעו כי נחסמו.",
|
||||||
"domain_block_modal.title": "לחסום שרת?",
|
"domain_block_modal.title": "לחסום שרת?",
|
||||||
|
"domain_block_modal.you_will_lose_followers": "כל עוקביך משרת זה יוסרו.",
|
||||||
"domain_block_modal.you_wont_see_posts": "לא תוכלו לראות הודעות ממשתמשים על שרת זה.",
|
"domain_block_modal.you_wont_see_posts": "לא תוכלו לראות הודעות ממשתמשים על שרת זה.",
|
||||||
"domain_pill.activitypub_lets_connect": "מאפשר לך להתחבר ולהתרועע עם אחרים לא רק במסטודון, אלא גם ביישומים חברתיים שונים אחרים.",
|
"domain_pill.activitypub_lets_connect": "מאפשר לך להתחבר ולהתרועע עם אחרים לא רק במסטודון, אלא גם ביישומים חברתיים שונים אחרים.",
|
||||||
"domain_pill.activitypub_like_language": "אקטיביטיפאב היא למעשה השפה בה מסטודון מדבר עם רשתות חברתיות אחרות.",
|
"domain_pill.activitypub_like_language": "אקטיביטיפאב היא למעשה השפה בה מסטודון מדבר עם רשתות חברתיות אחרות.",
|
||||||
|
@ -431,10 +432,10 @@
|
||||||
"keyboard_shortcuts.unfocus": "לצאת מתיבת חיבור/חיפוש",
|
"keyboard_shortcuts.unfocus": "לצאת מתיבת חיבור/חיפוש",
|
||||||
"keyboard_shortcuts.up": "לנוע במעלה הרשימה",
|
"keyboard_shortcuts.up": "לנוע במעלה הרשימה",
|
||||||
"lightbox.close": "סגירה",
|
"lightbox.close": "סגירה",
|
||||||
|
"lightbox.compress": "דחיסת קופסת צפייה בתמונה",
|
||||||
|
"lightbox.expand": "הרחבת קופסת צפייה בתמונה",
|
||||||
"lightbox.next": "הבא",
|
"lightbox.next": "הבא",
|
||||||
"lightbox.previous": "הקודם",
|
"lightbox.previous": "הקודם",
|
||||||
"lightbox.zoom_in": "הגדלה לגודל מלא",
|
|
||||||
"lightbox.zoom_out": "התאמה לגודל המסך",
|
|
||||||
"limited_account_hint.action": "הצג חשבון בכל זאת",
|
"limited_account_hint.action": "הצג חשבון בכל זאת",
|
||||||
"limited_account_hint.title": "פרופיל המשתמש הזה הוסתר על ידי המנחים של {domain}.",
|
"limited_account_hint.title": "פרופיל המשתמש הזה הוסתר על ידי המנחים של {domain}.",
|
||||||
"link_preview.author": "מאת {name}",
|
"link_preview.author": "מאת {name}",
|
||||||
|
@ -558,6 +559,8 @@
|
||||||
"notifications.column_settings.admin.report": "דו\"חות חדשים",
|
"notifications.column_settings.admin.report": "דו\"חות חדשים",
|
||||||
"notifications.column_settings.admin.sign_up": "הרשמות חדשות:",
|
"notifications.column_settings.admin.sign_up": "הרשמות חדשות:",
|
||||||
"notifications.column_settings.alert": "התראות לשולחן העבודה",
|
"notifications.column_settings.alert": "התראות לשולחן העבודה",
|
||||||
|
"notifications.column_settings.beta.category": "יכולות ניסיוניות",
|
||||||
|
"notifications.column_settings.beta.grouping": "התראות קבוצה",
|
||||||
"notifications.column_settings.favourite": "חיבובים:",
|
"notifications.column_settings.favourite": "חיבובים:",
|
||||||
"notifications.column_settings.filter_bar.advanced": "להציג את כל הקטגוריות",
|
"notifications.column_settings.filter_bar.advanced": "להציג את כל הקטגוריות",
|
||||||
"notifications.column_settings.filter_bar.category": "שורת סינון מהיר",
|
"notifications.column_settings.filter_bar.category": "שורת סינון מהיר",
|
||||||
|
@ -786,7 +789,6 @@
|
||||||
"status.edit": "עריכה",
|
"status.edit": "עריכה",
|
||||||
"status.edited": "נערך לאחרונה {date}",
|
"status.edited": "נערך לאחרונה {date}",
|
||||||
"status.edited_x_times": "נערך {count, plural, one {פעם {count}} other {{count} פעמים}}",
|
"status.edited_x_times": "נערך {count, plural, one {פעם {count}} other {{count} פעמים}}",
|
||||||
"status.embed": "העתקת קוד להטמעה",
|
|
||||||
"status.favourite": "חיבוב",
|
"status.favourite": "חיבוב",
|
||||||
"status.favourites": "{count, plural, one {חיבוב אחד} two {זוג חיבובים} other {# חיבובים}}",
|
"status.favourites": "{count, plural, one {חיבוב אחד} two {זוג חיבובים} other {# חיבובים}}",
|
||||||
"status.filter": "סנן הודעה זו",
|
"status.filter": "סנן הודעה זו",
|
||||||
|
|
|
@ -349,6 +349,8 @@
|
||||||
"keyboard_shortcuts.unfocus": "to un-focus compose textarea/search",
|
"keyboard_shortcuts.unfocus": "to un-focus compose textarea/search",
|
||||||
"keyboard_shortcuts.up": "to move up in the list",
|
"keyboard_shortcuts.up": "to move up in the list",
|
||||||
"lightbox.close": "बंद करें",
|
"lightbox.close": "बंद करें",
|
||||||
|
"lightbox.compress": "कंप्रेस इमेज व्यू बॉक्स",
|
||||||
|
"lightbox.expand": "एक्सपैंड इमेज व्यू बॉक्स",
|
||||||
"lightbox.next": "अगला",
|
"lightbox.next": "अगला",
|
||||||
"lightbox.previous": "पिछला",
|
"lightbox.previous": "पिछला",
|
||||||
"limited_account_hint.action": "फिर भी प्रोफाइल दिखाओ",
|
"limited_account_hint.action": "फिर भी प्रोफाइल दिखाओ",
|
||||||
|
|
|
@ -221,6 +221,7 @@
|
||||||
"domain_block_modal.they_cant_follow": "Erről a kiszolgálóról senki sem követhet.",
|
"domain_block_modal.they_cant_follow": "Erről a kiszolgálóról senki sem követhet.",
|
||||||
"domain_block_modal.they_wont_know": "Nem fogja tudni, hogy letiltották.",
|
"domain_block_modal.they_wont_know": "Nem fogja tudni, hogy letiltották.",
|
||||||
"domain_block_modal.title": "Letiltsuk a domaint?",
|
"domain_block_modal.title": "Letiltsuk a domaint?",
|
||||||
|
"domain_block_modal.you_will_lose_followers": "Az ezen a kiszolgálón lévő összes követődet törölni fogjuk.",
|
||||||
"domain_block_modal.you_wont_see_posts": "Nem látsz majd bejegyzéseket vagy értesítéseket ennek a kiszolgálónak a felhasználóitól.",
|
"domain_block_modal.you_wont_see_posts": "Nem látsz majd bejegyzéseket vagy értesítéseket ennek a kiszolgálónak a felhasználóitól.",
|
||||||
"domain_pill.activitypub_lets_connect": "Lehetővé teszi, hogy kapcsolatba lépj nem csak a Mastodonon, hanem a más közösségi alkalmazásokon lévő emberekkel is.",
|
"domain_pill.activitypub_lets_connect": "Lehetővé teszi, hogy kapcsolatba lépj nem csak a Mastodonon, hanem a más közösségi alkalmazásokon lévő emberekkel is.",
|
||||||
"domain_pill.activitypub_like_language": "Az ActivityPub olyan mint egy nyelv, amelyet a Mastodon a más közösségi hálózatokkal való kommunikációra használ.",
|
"domain_pill.activitypub_like_language": "Az ActivityPub olyan mint egy nyelv, amelyet a Mastodon a más közösségi hálózatokkal való kommunikációra használ.",
|
||||||
|
@ -431,10 +432,10 @@
|
||||||
"keyboard_shortcuts.unfocus": "Szerkesztés/keresés fókuszból való kivétele",
|
"keyboard_shortcuts.unfocus": "Szerkesztés/keresés fókuszból való kivétele",
|
||||||
"keyboard_shortcuts.up": "Mozgás felfelé a listában",
|
"keyboard_shortcuts.up": "Mozgás felfelé a listában",
|
||||||
"lightbox.close": "Bezárás",
|
"lightbox.close": "Bezárás",
|
||||||
|
"lightbox.compress": "Képnéző doboz összezárása",
|
||||||
|
"lightbox.expand": "Képnéző doboz kinyitása",
|
||||||
"lightbox.next": "Következő",
|
"lightbox.next": "Következő",
|
||||||
"lightbox.previous": "Előző",
|
"lightbox.previous": "Előző",
|
||||||
"lightbox.zoom_in": "Nagyítás a tényleges méretre",
|
|
||||||
"lightbox.zoom_out": "Méretre igazítás",
|
|
||||||
"limited_account_hint.action": "Profil megjelenítése mindenképpen",
|
"limited_account_hint.action": "Profil megjelenítése mindenképpen",
|
||||||
"limited_account_hint.title": "Ezt a profilt {domain} moderátorai elrejtették.",
|
"limited_account_hint.title": "Ezt a profilt {domain} moderátorai elrejtették.",
|
||||||
"link_preview.author": "{name} szerint",
|
"link_preview.author": "{name} szerint",
|
||||||
|
@ -558,6 +559,8 @@
|
||||||
"notifications.column_settings.admin.report": "Új jelentések:",
|
"notifications.column_settings.admin.report": "Új jelentések:",
|
||||||
"notifications.column_settings.admin.sign_up": "Új regisztrálók:",
|
"notifications.column_settings.admin.sign_up": "Új regisztrálók:",
|
||||||
"notifications.column_settings.alert": "Asztali értesítések",
|
"notifications.column_settings.alert": "Asztali értesítések",
|
||||||
|
"notifications.column_settings.beta.category": "Kísérleti funkciók",
|
||||||
|
"notifications.column_settings.beta.grouping": "Csoportértesítések",
|
||||||
"notifications.column_settings.favourite": "Kedvencek:",
|
"notifications.column_settings.favourite": "Kedvencek:",
|
||||||
"notifications.column_settings.filter_bar.advanced": "Minden kategória megjelenítése",
|
"notifications.column_settings.filter_bar.advanced": "Minden kategória megjelenítése",
|
||||||
"notifications.column_settings.filter_bar.category": "Gyorsszűrő sáv",
|
"notifications.column_settings.filter_bar.category": "Gyorsszűrő sáv",
|
||||||
|
|
|
@ -271,6 +271,8 @@
|
||||||
"keyboard_shortcuts.unfocus": "տեքստի/որոնման տիրոյթից ապասեւեռուելու համար",
|
"keyboard_shortcuts.unfocus": "տեքստի/որոնման տիրոյթից ապասեւեռուելու համար",
|
||||||
"keyboard_shortcuts.up": "ցանկով վերեւ շարժուելու համար",
|
"keyboard_shortcuts.up": "ցանկով վերեւ շարժուելու համար",
|
||||||
"lightbox.close": "Փակել",
|
"lightbox.close": "Փակել",
|
||||||
|
"lightbox.compress": "Փակել պատկերի դիտման պատուհանը",
|
||||||
|
"lightbox.expand": "Բացել պատկերի դիտման պատուհանը",
|
||||||
"lightbox.next": "Յաջորդ",
|
"lightbox.next": "Յաջորդ",
|
||||||
"lightbox.previous": "Նախորդ",
|
"lightbox.previous": "Նախորդ",
|
||||||
"lists.account.add": "Աւելացնել ցանկին",
|
"lists.account.add": "Աւելացնել ցանկին",
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Reference in a new issue