Merge pull request #566 from kmycode/upstream-20240216

Upstream 20240216
This commit is contained in:
KMY(雪あすか) 2024-02-16 22:50:00 +09:00 committed by GitHub
commit 5424567aef
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
67 changed files with 415 additions and 189 deletions

View file

@ -2,6 +2,101 @@
All notable changes to this project will be documented in this file. All notable changes to this project will be documented in this file.
## [4.2.7] - 2024-02-16
### Fixed
- Fix OmniAuth tests and edge cases in error handling ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/29201), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/29207))
- Fix new installs by upgrading to the latest release of the `nsa` gem, instead of a no longer existing commit ([mjankowski](https://github.com/mastodon/mastodon/pull/29065))
### Security
- Fix insufficient checking of remote posts ([GHSA-jhrq-qvrm-qr36](https://github.com/mastodon/mastodon/security/advisories/GHSA-jhrq-qvrm-qr36))
## [4.2.6] - 2024-02-14
### Security
- Update the `sidekiq-unique-jobs` dependency (see [GHSA-cmh9-rx85-xj38](https://github.com/mhenrixon/sidekiq-unique-jobs/security/advisories/GHSA-cmh9-rx85-xj38))
In addition, we have disabled the web interface for `sidekiq-unique-jobs` out of caution.
If you need it, you can re-enable it by setting `ENABLE_SIDEKIQ_UNIQUE_JOBS_UI=true`.
If you only need to clear all locks, you can now use `bundle exec rake sidekiq_unique_jobs:delete_all_locks`.
- Update the `nokogiri` dependency (see [GHSA-xc9x-jj77-9p9j](https://github.com/sparklemotion/nokogiri/security/advisories/GHSA-xc9x-jj77-9p9j))
- Disable administrative Doorkeeper routes ([ThisIsMissEm](https://github.com/mastodon/mastodon/pull/29187))
- Fix ongoing streaming sessions not being invalidated when applications get deleted in some cases ([GHSA-7w3c-p9j8-mq3x](https://github.com/mastodon/mastodon/security/advisories/GHSA-7w3c-p9j8-mq3x))
In some rare cases, the streaming server was not notified of access tokens revocation on application deletion.
- Change external authentication behavior to never reattach a new identity to an existing user by default ([GHSA-vm39-j3vx-pch3](https://github.com/mastodon/mastodon/security/advisories/GHSA-vm39-j3vx-pch3))
Up until now, Mastodon has allowed new identities from external authentication providers to attach to an existing local user based on their verified e-mail address.
This allowed upgrading users from a database-stored password to an external authentication provider, or move from one authentication provider to another.
However, this behavior may be unexpected, and means that when multiple authentication providers are configured, the overall security would be that of the least secure authentication provider.
For these reasons, this behavior is now locked under the `ALLOW_UNSAFE_AUTH_PROVIDER_REATTACH` environment variable.
In addition, regardless of this environment variable, Mastodon will refuse to attach two identities from the same authentication provider to the same account.
## [4.2.5] - 2024-02-01
### Security
- Fix insufficient origin validation (CVE-2024-23832, [GHSA-3fjr-858r-92rw](https://github.com/mastodon/mastodon/security/advisories/GHSA-3fjr-858r-92rw))
## [4.2.4] - 2024-01-24
### Fixed
- Fix error when processing remote files with unusually long names ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/28823))
- Fix processing of compacted single-item JSON-LD collections ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/28816))
- Retry 401 errors on replies fetching ([ShadowJonathan](https://github.com/mastodon/mastodon/pull/28788))
- Fix `RecordNotUnique` errors in LinkCrawlWorker ([tribela](https://github.com/mastodon/mastodon/pull/28748))
- Fix Mastodon not correctly processing HTTP Signatures with query strings ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/28443), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/28476))
- Fix potential redirection loop of streaming endpoint ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/28665))
- Fix streaming API redirection ignoring the port of `streaming_api_base_url` ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/28558))
- Fix error when processing link preview with an array as `inLanguage` ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/28252))
- Fix unsupported time zone or locale preventing sign-up ([Gargron](https://github.com/mastodon/mastodon/pull/28035))
- Fix "Hide these posts from home" list setting not refreshing when switching lists ([brianholley](https://github.com/mastodon/mastodon/pull/27763))
- Fix missing background behind dismissable banner in web UI ([Gargron](https://github.com/mastodon/mastodon/pull/27479))
- Fix line wrapping of language selection button with long locale codes ([gunchleoc](https://github.com/mastodon/mastodon/pull/27100), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/27127))
- Fix `Undo Announce` activity not being sent to non-follower authors ([MitarashiDango](https://github.com/mastodon/mastodon/pull/18482))
- Fix N+1s because of association preloaders not actually getting called ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/28339))
- Fix empty column explainer getting cropped under certain conditions ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/28337))
- Fix `LinkCrawlWorker` error when encountering empty OEmbed response ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/28268))
- Fix call to inefficient `delete_matched` cache method in domain blocks ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/28367))
### Security
- Add rate-limit of TOTP authentication attempts at controller level ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/28801))
## [4.2.3] - 2023-12-05
### Fixed
- Fix dependency on `json-canonicalization` version that has been made unavailable since last release
## [4.2.2] - 2023-12-04
### Changed
- Change dismissed banners to be stored server-side ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/27055))
- Change GIF max matrix size error to explicitly mention GIF files ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/27927))
- Change `Follow` activities delivery to bypass availability check ([ShadowJonathan](https://github.com/mastodon/mastodon/pull/27586))
- Change single-column navigation notice to be displayed outside of the logo container ([renchap](https://github.com/mastodon/mastodon/pull/27462), [renchap](https://github.com/mastodon/mastodon/pull/27476))
- Change Content-Security-Policy to be tighter on media paths ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/26889))
- Change post language code to include country code when relevant ([gunchleoc](https://github.com/mastodon/mastodon/pull/27099), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/27207))
### Fixed
- Fix upper border radius of onboarding columns ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/27890))
- Fix incoming status creation date not being restricted to standard ISO8601 ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/27655), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/28081))
- Fix some posts from threads received out-of-order sometimes not being inserted into timelines ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/27653))
- Fix posts from force-sensitized accounts being able to trend ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/27620))
- Fix error when trying to delete already-deleted file with OpenStack Swift ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/27569))
- Fix batch attachment deletion when using OpenStack Swift ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/27554))
- Fix processing LDSigned activities from actors with unknown public keys ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/27474))
- Fix error and incorrect URLs in `/api/v1/accounts/:id/featured_tags` for remote accounts ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/27459))
- Fix report processing notice not mentioning the report number when performing a custom action ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/27442))
- Fix handling of `inLanguage` attribute in preview card processing ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/27423))
- Fix own posts being removed from home timeline when unfollowing a used hashtag ([kmycode](https://github.com/mastodon/mastodon/pull/27391))
- Fix some link anchors being recognized as hashtags ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/27271), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/27584))
- Fix format-dependent redirects being cached regardless of requested format ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/27634))
## [4.2.1] - 2023-10-10 ## [4.2.1] - 2023-10-10
### Added ### Added

View file

@ -505,7 +505,7 @@ GEM
parslet (2.0.0) parslet (2.0.0)
pastel (0.8.0) pastel (0.8.0)
tty-color (~> 0.5) tty-color (~> 0.5)
pg (1.5.4) pg (1.5.5)
pghero (3.4.1) pghero (3.4.1)
activerecord (>= 6) activerecord (>= 6)
posix-spawn (0.3.15) posix-spawn (0.3.15)

View file

@ -182,7 +182,19 @@ module JsonLdHelper
build_request(uri, on_behalf_of, options: request_options).perform do |response| build_request(uri, on_behalf_of, options: request_options).perform do |response|
raise Mastodon::UnexpectedResponseError, response unless response_successful?(response) || response_error_unsalvageable?(response) || !raise_on_temporary_error raise Mastodon::UnexpectedResponseError, response unless response_successful?(response) || response_error_unsalvageable?(response) || !raise_on_temporary_error
body_to_json(response.body_with_limit) if response.code == 200 body_to_json(response.body_with_limit) if response.code == 200 && valid_activitypub_content_type?(response)
end
end
def valid_activitypub_content_type?(response)
return true if response.mime_type == 'application/activity+json'
# When the mime type is `application/ld+json`, we need to check the profile,
# but `http.rb` does not parse it for us.
return false unless response.mime_type == 'application/ld+json'
response.headers[HTTP::Headers::CONTENT_TYPE]&.split(';')&.map(&:strip)&.any? do |str|
str.start_with?('profile="') && str[9...-1].split.include?('https://www.w3.org/ns/activitystreams')
end end
end end

View file

@ -201,7 +201,7 @@
"disabled_account_banner.text": "Вашият акаунт {disabledAccount} сега е изключен.", "disabled_account_banner.text": "Вашият акаунт {disabledAccount} сега е изключен.",
"dismissable_banner.community_timeline": "Ето най-скорошните публични публикации от хора, чиито акаунти са разположени в {domain}.", "dismissable_banner.community_timeline": "Ето най-скорошните публични публикации от хора, чиито акаунти са разположени в {domain}.",
"dismissable_banner.dismiss": "Отхвърляне", "dismissable_banner.dismiss": "Отхвърляне",
"dismissable_banner.explore_links": "Тези новини се разказват от хората в този и други сървъри на децентрализираната мрежа точно сега.", "dismissable_banner.explore_links": "Това са най-споделяните новини в социалната мрежа днес. По-нови истории, споделени от повече хора се показват по-напред.",
"dismissable_banner.explore_statuses": "Има публикации през социалната мрежа, които днес набират популярност. По-новите публикации с повече подсилвания и любими са класирани по-високо.", "dismissable_banner.explore_statuses": "Има публикации през социалната мрежа, които днес набират популярност. По-новите публикации с повече подсилвания и любими са класирани по-високо.",
"dismissable_banner.explore_tags": "Тези хаштагове сега набират популярност сред хората в този и други сървъри на децентрализирата мрежа.", "dismissable_banner.explore_tags": "Тези хаштагове сега набират популярност сред хората в този и други сървъри на децентрализирата мрежа.",
"dismissable_banner.public_timeline": "Ето най-новите обществени публикации от хора в социална мрежа, която хората в {domain} следват.", "dismissable_banner.public_timeline": "Ето най-новите обществени публикации от хора в социална мрежа, която хората в {domain} следват.",
@ -231,7 +231,7 @@
"empty_column.community": "Локалният инфопоток е празен. Публикувайте нещо, за да започнете!", "empty_column.community": "Локалният инфопоток е празен. Публикувайте нещо, за да започнете!",
"empty_column.direct": "Още нямате никакви частни споменавания. Тук ще се показват, изпращайки или получавайки едно.", "empty_column.direct": "Още нямате никакви частни споменавания. Тук ще се показват, изпращайки или получавайки едно.",
"empty_column.domain_blocks": "Още няма блокирани домейни.", "empty_column.domain_blocks": "Още няма блокирани домейни.",
"empty_column.explore_statuses": "Няма нищо налагащо се в момента. Проверете пак по-късно!", "empty_column.explore_statuses": "Няма тенденции в момента. Проверете пак по-късно!",
"empty_column.favourited_statuses": "Още нямате никакви любими публикации. Правейки любима, то тя ще се покаже тук.", "empty_column.favourited_statuses": "Още нямате никакви любими публикации. Правейки любима, то тя ще се покаже тук.",
"empty_column.favourites": "Още никого не е слагал публикацията в любими. Когато някой го направи, този човек ще се покаже тук.", "empty_column.favourites": "Още никого не е слагал публикацията в любими. Когато някой го направи, този човек ще се покаже тук.",
"empty_column.follow_requests": "Още нямате заявки за последване. Получавайки такава, то тя ще се покаже тук.", "empty_column.follow_requests": "Още нямате заявки за последване. Получавайки такава, то тя ще се покаже тук.",
@ -407,7 +407,7 @@
"navigation_bar.direct": "Частни споменавания", "navigation_bar.direct": "Частни споменавания",
"navigation_bar.discover": "Откриване", "navigation_bar.discover": "Откриване",
"navigation_bar.domain_blocks": "Блокирани домейни", "navigation_bar.domain_blocks": "Блокирани домейни",
"navigation_bar.explore": "Изследване", "navigation_bar.explore": "Разглеждане",
"navigation_bar.favourites": "Любими", "navigation_bar.favourites": "Любими",
"navigation_bar.filters": "Заглушени думи", "navigation_bar.filters": "Заглушени думи",
"navigation_bar.follow_requests": "Заявки за последване", "navigation_bar.follow_requests": "Заявки за последване",
@ -474,10 +474,10 @@
"notifications_permission_banner.title": "Никога не пропускате нещо", "notifications_permission_banner.title": "Никога не пропускате нещо",
"onboarding.action.back": "Върнете ме обратно", "onboarding.action.back": "Върнете ме обратно",
"onboarding.actions.back": "Върнете ме обратно", "onboarding.actions.back": "Върнете ме обратно",
"onboarding.actions.go_to_explore": "Вижте какво изгрява", "onboarding.actions.go_to_explore": "Виж тенденции",
"onboarding.actions.go_to_home": "Към началния ви инфоканал", "onboarding.actions.go_to_home": "Към началния ви инфоканал",
"onboarding.compose.template": "Здравейте, #Mastodon!", "onboarding.compose.template": "Здравейте, #Mastodon!",
"onboarding.follows.empty": "За съжаление, в момента не могат да се показват резултати. Може да опитате да употребявате търсене или да прегледате страницата за изследване, за да намерите страница за последване, или да опитате пак по-късно.", "onboarding.follows.empty": "За съжаление, в момента не могат да бъдат показани резултати. Може да опитате да търсите или да разгледате, за да намерите кого да последвате, или опитайте отново по-късно.",
"onboarding.follows.lead": "Може да бъдете куратор на началния си инфоканал. Последвайки повече хора, по-деен и по-интересен ще става. Тези профили може да са добра начална точка, от която винаги по-късно да спрете да следвате!", "onboarding.follows.lead": "Може да бъдете куратор на началния си инфоканал. Последвайки повече хора, по-деен и по-интересен ще става. Тези профили може да са добра начална точка, от която винаги по-късно да спрете да следвате!",
"onboarding.follows.title": "Популярно в Mastodon", "onboarding.follows.title": "Популярно в Mastodon",
"onboarding.profile.discoverable": "Правене на моя профил откриваем", "onboarding.profile.discoverable": "Правене на моя профил откриваем",
@ -530,7 +530,7 @@
"privacy.private.short": "Последователи", "privacy.private.short": "Последователи",
"privacy.public.long": "Всеки във и извън Mastodon", "privacy.public.long": "Всеки във и извън Mastodon",
"privacy.public.short": "Публично", "privacy.public.short": "Публично",
"privacy.unlisted.additional": "Това поведение е точно като публичното, с изключение на това, че публикацията няма да се появява в каналите на живо, хаштаговете, проучването или търсенето в Mastodon, дори ако сте се включили в целия акаунт.", "privacy.unlisted.additional": "Това действие е точно като публичното, с изключение на това, че публикацията няма да се появява в каналите на живо, хаштаговете, разглеждането или търсенето в Mastodon, дори ако сте избрали да се публично видими на ниво акаунт.",
"privacy.unlisted.long": "По-малко алгоритмични фанфари", "privacy.unlisted.long": "По-малко алгоритмични фанфари",
"privacy.unlisted.short": "Тиха публика", "privacy.unlisted.short": "Тиха публика",
"privacy_policy.last_updated": "Последно осъвременяване на {date}", "privacy_policy.last_updated": "Последно осъвременяване на {date}",

View file

@ -158,6 +158,7 @@
"compose_form.save_changes": "Actualisar", "compose_form.save_changes": "Actualisar",
"compose_form.spoiler.marked": "Remover avise pri li contenete", "compose_form.spoiler.marked": "Remover avise pri li contenete",
"compose_form.spoiler.unmarked": "Adjunter avise pri li contenete", "compose_form.spoiler.unmarked": "Adjunter avise pri li contenete",
"compose_form.spoiler_placeholder": "Advertiment de contenete (optional)",
"confirmation_modal.cancel": "Anullar", "confirmation_modal.cancel": "Anullar",
"confirmations.block.block_and_report": "Bloccar & Raportar", "confirmations.block.block_and_report": "Bloccar & Raportar",
"confirmations.block.confirm": "Bloccar", "confirmations.block.confirm": "Bloccar",
@ -276,6 +277,12 @@
"follow_request.authorize": "Autorisar", "follow_request.authorize": "Autorisar",
"follow_request.reject": "Rejecter", "follow_request.reject": "Rejecter",
"follow_requests.unlocked_explanation": "Benque tu conto ne es cludet, li administratores de {domain} pensat que tu fórsan vell voler tractar seque-petitiones de tis-ci contos manualmen.", "follow_requests.unlocked_explanation": "Benque tu conto ne es cludet, li administratores de {domain} pensat que tu fórsan vell voler tractar seque-petitiones de tis-ci contos manualmen.",
"follow_suggestions.curated_suggestion": "Selection del Servitor",
"follow_suggestions.dismiss": "Ne monstrar plu",
"follow_suggestions.personalized_suggestion": "Personalisat suggestion",
"follow_suggestions.popular_suggestion": "Populari suggestion",
"follow_suggestions.view_all": "Vider omnicos",
"follow_suggestions.who_to_follow": "Persones a sequer",
"followed_tags": "Sequet hashtags", "followed_tags": "Sequet hashtags",
"footer.about": "Information", "footer.about": "Information",
"footer.directory": "Profilarium", "footer.directory": "Profilarium",
@ -517,11 +524,15 @@
"poll_button.add_poll": "Adjunter un balotation", "poll_button.add_poll": "Adjunter un balotation",
"poll_button.remove_poll": "Remover balotation", "poll_button.remove_poll": "Remover balotation",
"privacy.change": "Changear li privatie del posta", "privacy.change": "Changear li privatie del posta",
"privacy.direct.long": "Omnes mentionat in li posta",
"privacy.direct.short": "Specific persones", "privacy.direct.short": "Specific persones",
"privacy.private.long": "Solmen tui sequitores", "privacy.private.long": "Solmen tui sequitores",
"privacy.private.short": "Sequitores", "privacy.private.short": "Sequitores",
"privacy.public.long": "Quicunc in e ex Mastodon", "privacy.public.long": "Quicunc in e ex Mastodon",
"privacy.public.short": "Public", "privacy.public.short": "Public",
"privacy.unlisted.additional": "It acte just quam public, except que li posta ne va aparir in tendentie o hashtags, explorar, o sercha de Mastodon, mem si tu ha optet por les sur tui tot conto.",
"privacy.unlisted.long": "Minu fanfare algoritmic",
"privacy.unlisted.short": "Quiet public",
"privacy_policy.last_updated": "Ultimmen actualisat ye {date}", "privacy_policy.last_updated": "Ultimmen actualisat ye {date}",
"privacy_policy.title": "Politica pri Privatie", "privacy_policy.title": "Politica pri Privatie",
"recommended": "Recomandat", "recommended": "Recomandat",
@ -539,7 +550,9 @@
"relative_time.minutes": "{number}m", "relative_time.minutes": "{number}m",
"relative_time.seconds": "{number}s", "relative_time.seconds": "{number}s",
"relative_time.today": "hodie", "relative_time.today": "hodie",
"reply_indicator.attachments": "{count, plural, one {# atachament} other {# atachamentes}}",
"reply_indicator.cancel": "Anullar", "reply_indicator.cancel": "Anullar",
"reply_indicator.poll": "Balotar",
"report.block": "Bloccar", "report.block": "Bloccar",
"report.block_explanation": "Tu ne va vider su postas. Li usator ni va posser vider tui postas, ni sequer te, ni va posser saver pri li statu de esser bloccat.", "report.block_explanation": "Tu ne va vider su postas. Li usator ni va posser vider tui postas, ni sequer te, ni va posser saver pri li statu de esser bloccat.",
"report.categories.legal": "Legal", "report.categories.legal": "Legal",

View file

@ -11,11 +11,13 @@
"account.blocked": "Yettusewḥel", "account.blocked": "Yettusewḥel",
"account.browse_more_on_origin_server": "Snirem ugar deg umeɣnu aneẓli", "account.browse_more_on_origin_server": "Snirem ugar deg umeɣnu aneẓli",
"account.cancel_follow_request": "Withdraw follow request", "account.cancel_follow_request": "Withdraw follow request",
"account.copy": "Nɣel assaɣ ɣer umaɣnu",
"account.disable_notifications": "Ḥbes ur iyi-d-ttazen ara ilɣa mi ara d-isuffeɣ @{name}", "account.disable_notifications": "Ḥbes ur iyi-d-ttazen ara ilɣa mi ara d-isuffeɣ @{name}",
"account.domain_blocked": "Taɣult yeffren", "account.domain_blocked": "Taɣult yeffren",
"account.edit_profile": "Ẓreg amaɣnu", "account.edit_profile": "Ẓreg amaɣnu",
"account.enable_notifications": "Azen-iyi-d ilɣa mi ara d-isuffeɣ @{name}", "account.enable_notifications": "Azen-iyi-d ilɣa mi ara d-isuffeɣ @{name}",
"account.endorse": "Welleh fell-as deg umaɣnu-inek", "account.endorse": "Welleh fell-as deg umaɣnu-inek",
"account.featured_tags.last_status_never": "Ulac tisuffaɣ",
"account.follow": "Ḍfer", "account.follow": "Ḍfer",
"account.followers": "Imeḍfaren", "account.followers": "Imeḍfaren",
"account.followers.empty": "Ar tura, ulac yiwen i yeṭṭafaṛen amseqdac-agi.", "account.followers.empty": "Ar tura, ulac yiwen i yeṭṭafaṛen amseqdac-agi.",
@ -65,7 +67,7 @@
"bundle_modal_error.message": "Tella-d kra n tuccḍa mi d-yettali ugbur-agi.", "bundle_modal_error.message": "Tella-d kra n tuccḍa mi d-yettali ugbur-agi.",
"bundle_modal_error.retry": "Ɛreḍ tikelt-nniḍen", "bundle_modal_error.retry": "Ɛreḍ tikelt-nniḍen",
"closed_registrations_modal.find_another_server": "Aff-d aqeddac nniḍen", "closed_registrations_modal.find_another_server": "Aff-d aqeddac nniḍen",
"column.about": "Γef", "column.about": "Ɣef",
"column.blocks": "Imiḍanen yettusḥebsen", "column.blocks": "Imiḍanen yettusḥebsen",
"column.bookmarks": "Ticraḍ", "column.bookmarks": "Ticraḍ",
"column.community": "Tasuddemt tadigant", "column.community": "Tasuddemt tadigant",
@ -77,7 +79,7 @@
"column.lists": "Tibdarin", "column.lists": "Tibdarin",
"column.mutes": "Imiḍanen yettwasgugmen", "column.mutes": "Imiḍanen yettwasgugmen",
"column.notifications": "Tilɣa", "column.notifications": "Tilɣa",
"column.pins": "Tijewwaqin yettwasenṭḍen", "column.pins": "Tisuffaɣ yettwasenṭḍen",
"column.public": "Tasuddemt tamatut", "column.public": "Tasuddemt tamatut",
"column_back_button.label": "Tuɣalin", "column_back_button.label": "Tuɣalin",
"column_header.hide_settings": "Ffer iɣewwaṛen", "column_header.hide_settings": "Ffer iɣewwaṛen",
@ -88,32 +90,36 @@
"column_header.unpin": "Kkes asenteḍ", "column_header.unpin": "Kkes asenteḍ",
"column_subheading.settings": "Iɣewwaṛen", "column_subheading.settings": "Iɣewwaṛen",
"community.column_settings.local_only": "Adigan kan", "community.column_settings.local_only": "Adigan kan",
"community.column_settings.media_only": "Allal n teywalt kan", "community.column_settings.media_only": "Imidyaten kan",
"community.column_settings.remote_only": "Anmeggag kan", "community.column_settings.remote_only": "Anmeggag kan",
"compose.language.change": "Beddel tutlayt", "compose.language.change": "Beddel tutlayt",
"compose.language.search": "Nadi tutlayin …", "compose.language.search": "Nadi tutlayin …",
"compose.published.open": "Ldi", "compose.published.open": "Ldi",
"compose_form.direct_message_warning_learn_more": "Issin ugar", "compose_form.direct_message_warning_learn_more": "Issin ugar",
"compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.", "compose_form.encryption_warning": "",
"compose_form.hashtag_warning": "This post won't be listed under any hashtag as it is unlisted. Only public posts can be searched by hashtag.", "compose_form.hashtag_warning": "",
"compose_form.lock_disclaimer": "Amiḍan-ik·im ur yelli ara {locked}. Menwala yezmer ad k·kem-yeḍfeṛ akken ad iẓer acu tbeṭṭuḍ akked yimeḍfaṛen-ik·im.", "compose_form.lock_disclaimer": "Amiḍan-ik·im ur yelli ara {locked}. Menwala yezmer ad k·kem-yeḍfeṛ akken ad iẓer acu tbeṭṭuḍ akked yimeḍfaṛen-ik·im.",
"compose_form.lock_disclaimer.lock": "yettwacekkel", "compose_form.lock_disclaimer.lock": "yettwacekkel",
"compose_form.placeholder": "D acu i itezzin deg wallaɣ?", "compose_form.placeholder": "D acu i itezzin deg wallaɣ?",
"compose_form.poll.duration": "Tanzagt n tefrant", "compose_form.poll.duration": "Tanzagt n tefrant",
"compose_form.poll.option_placeholder": "Taxtiṛt {number}",
"compose_form.poll.single": "Fren yiwen", "compose_form.poll.single": "Fren yiwen",
"compose_form.publish_form": "Suffeɣ", "compose_form.publish_form": "Tasuffeɣt tamaynut",
"compose_form.reply": "Err",
"compose_form.save_changes": "Leqqem",
"compose_form.spoiler.marked": "Kkes aḍris yettwaffren deffir n walɣu", "compose_form.spoiler.marked": "Kkes aḍris yettwaffren deffir n walɣu",
"compose_form.spoiler.unmarked": "Rnu aḍris yettwaffren deffir n walɣu", "compose_form.spoiler.unmarked": "Rnu aḍris yettwaffren deffir n walɣu",
"confirmation_modal.cancel": "Sefsex", "confirmation_modal.cancel": "Sefsex",
"confirmations.block.block_and_report": "Sewḥel & sewɛed", "confirmations.block.block_and_report": "Sewḥel & sewɛed",
"confirmations.block.confirm": "Sewḥel", "confirmations.block.confirm": "Sewḥel",
"confirmations.block.message": "Tebγiḍ s tidet ad tesḥebseḍ {name}?", "confirmations.block.message": "Tebɣiḍ s tidet ad tesḥebseḍ {name}?",
"confirmations.delete.confirm": "Kkes", "confirmations.delete.confirm": "Kkes",
"confirmations.delete.message": "Tebɣiḍ s tidet ad tekkseḍ tasuffeɣt-agi?", "confirmations.delete.message": "Tebɣiḍ s tidet ad tekkseḍ tasuffeɣt-agi?",
"confirmations.delete_list.confirm": "Kkes", "confirmations.delete_list.confirm": "Kkes",
"confirmations.delete_list.message": "Tebɣiḍ s tidet ad tekkseḍ umuɣ-agi i lebda?", "confirmations.delete_list.message": "Tebɣiḍ s tidet ad tekkseḍ umuɣ-agi i lebda?",
"confirmations.discard_edit_media.confirm": "Sefsex", "confirmations.discard_edit_media.confirm": "Sefsex",
"confirmations.domain_block.confirm": "Ffer taɣult meṛṛa", "confirmations.domain_block.confirm": "Ffer taɣult meṛṛa",
"confirmations.edit.confirm": "Ẓreg",
"confirmations.logout.confirm": "Ffeɣ", "confirmations.logout.confirm": "Ffeɣ",
"confirmations.logout.message": "D tidet tebɣiḍ ad teffɣeḍ?", "confirmations.logout.message": "D tidet tebɣiḍ ad teffɣeḍ?",
"confirmations.mute.confirm": "Sgugem", "confirmations.mute.confirm": "Sgugem",
@ -133,12 +139,13 @@
"directory.local": "Seg {domain} kan", "directory.local": "Seg {domain} kan",
"directory.new_arrivals": "Imaynuten id yewḍen", "directory.new_arrivals": "Imaynuten id yewḍen",
"directory.recently_active": "Yermed xas melmi kan", "directory.recently_active": "Yermed xas melmi kan",
"disabled_account_banner.account_settings": "Iγewwaṛen n umiḍan", "disabled_account_banner.account_settings": "Iɣewwaṛen n umiḍan",
"dismissable_banner.explore_links": "These news stories are being talked about by people on this and other servers of the decentralized network right now.", "dismissable_banner.explore_links": "These news stories are being talked about by people on this and other servers of the decentralized network right now.",
"dismissable_banner.explore_tags": "These hashtags are gaining traction among people on this and other servers of the decentralized network right now.", "dismissable_banner.explore_tags": "These hashtags are gaining traction among people on this and other servers of the decentralized network right now.",
"embed.instructions": "Ẓẓu addad-agi deg usmel-inek s wenγal n tangalt yellan sdaw-agi.", "embed.instructions": "Ẓẓu addad-agi deg usmel-inek s wenγal n tangalt yellan sdaw-agi.",
"embed.preview": "Akka ara d-iban:", "embed.preview": "Akka ara d-iban:",
"emoji_button.activity": "Aqeddic", "emoji_button.activity": "Aqeddic",
"emoji_button.clear": "Sfeḍ",
"emoji_button.custom": "Udmawan", "emoji_button.custom": "Udmawan",
"emoji_button.flags": "Innayen", "emoji_button.flags": "Innayen",
"emoji_button.food": "Tegwella & Tissit", "emoji_button.food": "Tegwella & Tissit",
@ -153,7 +160,7 @@
"emoji_button.symbols": "Izamulen", "emoji_button.symbols": "Izamulen",
"emoji_button.travel": "Imeḍqan d Yinigen", "emoji_button.travel": "Imeḍqan d Yinigen",
"empty_column.account_suspended": "Amiḍan yettwaḥbas", "empty_column.account_suspended": "Amiḍan yettwaḥbas",
"empty_column.account_timeline": "Ulac tijewwaqin dagi!", "empty_column.account_timeline": "Ulac tisuffaɣ da !",
"empty_column.account_unavailable": "Ur nufi ara amaɣnu-ayi", "empty_column.account_unavailable": "Ur nufi ara amaɣnu-ayi",
"empty_column.blocks": "Ur tesḥebseḍ ula yiwen n umseqdac ar tura.", "empty_column.blocks": "Ur tesḥebseḍ ula yiwen n umseqdac ar tura.",
"empty_column.bookmarked_statuses": "Ulac tijewwaqin i terniḍ ɣer yismenyifen-ik ar tura. Ticki terniḍ yiwet, ad d-tettwasken da.", "empty_column.bookmarked_statuses": "Ulac tijewwaqin i terniḍ ɣer yismenyifen-ik ar tura. Ticki terniḍ yiwet, ad d-tettwasken da.",
@ -174,7 +181,7 @@
"explore.suggested_follows": "Imdanen", "explore.suggested_follows": "Imdanen",
"explore.title": "Snirem", "explore.title": "Snirem",
"explore.trending_links": "Isallen", "explore.trending_links": "Isallen",
"explore.trending_statuses": "Tisuffiɣin", "explore.trending_statuses": "Tisuffaɣ",
"explore.trending_tags": "Ihacṭagen", "explore.trending_tags": "Ihacṭagen",
"filter_modal.added.settings_link": "asebter n yiɣewwaṛen", "filter_modal.added.settings_link": "asebter n yiɣewwaṛen",
"filter_modal.select_filter.prompt_new": "Taggayt tamaynutt : {name}", "filter_modal.select_filter.prompt_new": "Taggayt tamaynutt : {name}",
@ -183,8 +190,9 @@
"firehose.local": "Deg uqeddac-ayi", "firehose.local": "Deg uqeddac-ayi",
"follow_request.authorize": "Ssireg", "follow_request.authorize": "Ssireg",
"follow_request.reject": "Agi", "follow_request.reject": "Agi",
"footer.about": "Γef", "followed_tags": "Ihacṭagen yettwaḍfaren",
"footer.directory": "Akaram n imaγnuten", "footer.about": "Ɣef",
"footer.directory": "Akaram n imaɣnuten",
"footer.get_app": "Awi-d asnas", "footer.get_app": "Awi-d asnas",
"footer.invite": "Ɛreḍ-d kra n yimdanen", "footer.invite": "Ɛreḍ-d kra n yimdanen",
"footer.keyboard_shortcuts": "Inegzumen n unasiw", "footer.keyboard_shortcuts": "Inegzumen n unasiw",
@ -207,6 +215,7 @@
"home.column_settings.show_replies": "Ssken-d tiririyin", "home.column_settings.show_replies": "Ssken-d tiririyin",
"home.hide_announcements": "Ffer ulɣuyen", "home.hide_announcements": "Ffer ulɣuyen",
"home.show_announcements": "Ssken-d ulɣuyen", "home.show_announcements": "Ssken-d ulɣuyen",
"interaction_modal.no_account_yet": "Ulac-ik·ikem deg Maṣṭudun?",
"interaction_modal.on_this_server": "Deg uqeddac-ayi", "interaction_modal.on_this_server": "Deg uqeddac-ayi",
"interaction_modal.title.follow": "Ḍfer {name}", "interaction_modal.title.follow": "Ḍfer {name}",
"intervals.full.days": "{number, plural, one {# n wass} other {# n wussan}}", "intervals.full.days": "{number, plural, one {# n wass} other {# n wussan}}",
@ -247,8 +256,8 @@
"lightbox.close": "Mdel", "lightbox.close": "Mdel",
"lightbox.compress": "Ḥemmeẓ tamnaḍt n uskan n tugna", "lightbox.compress": "Ḥemmeẓ tamnaḍt n uskan n tugna",
"lightbox.expand": "Simeɣer tamnaḍt n uskan n tugna", "lightbox.expand": "Simeɣer tamnaḍt n uskan n tugna",
"lightbox.next": "Γer zdat", "lightbox.next": "Ɣer zdat",
"lightbox.previous": "Γer deffir", "lightbox.previous": "Ɣer deffir",
"link_preview.author": "S-ɣur {name}", "link_preview.author": "S-ɣur {name}",
"lists.account.add": "Rnu ɣer tebdart", "lists.account.add": "Rnu ɣer tebdart",
"lists.account.remove": "Kkes seg tebdart", "lists.account.remove": "Kkes seg tebdart",
@ -264,11 +273,12 @@
"lists.search": "Nadi gar yemdanen i teṭṭafaṛeḍ", "lists.search": "Nadi gar yemdanen i teṭṭafaṛeḍ",
"lists.subheading": "Tibdarin-ik·im", "lists.subheading": "Tibdarin-ik·im",
"load_pending": "{count, plural, one {# n uferdis amaynut} other {# n yiferdisen imaynuten}}", "load_pending": "{count, plural, one {# n uferdis amaynut} other {# n yiferdisen imaynuten}}",
"media_gallery.toggle_visible": "Ffer {number, plural, one {tugna} other {tugniwin}}", "loading_indicator.label": "Yessalay-d …",
"media_gallery.toggle_visible": "{number, plural, one {Ffer tugna} other {Ffer tugniwin}}",
"mute_modal.duration": "Tanzagt", "mute_modal.duration": "Tanzagt",
"mute_modal.hide_notifications": "Tebɣiḍ ad teffreḍ talɣutin n umseqdac-a?", "mute_modal.hide_notifications": "Tebɣiḍ ad teffreḍ talɣutin n umseqdac-a?",
"mute_modal.indefinite": "Ur yettwasbadu ara", "mute_modal.indefinite": "Ur yettwasbadu ara",
"navigation_bar.about": "Γef", "navigation_bar.about": "Ɣef",
"navigation_bar.blocks": "Imseqdacen yettusḥebsen", "navigation_bar.blocks": "Imseqdacen yettusḥebsen",
"navigation_bar.bookmarks": "Ticraḍ", "navigation_bar.bookmarks": "Ticraḍ",
"navigation_bar.community_timeline": "Tasuddemt tadigant", "navigation_bar.community_timeline": "Tasuddemt tadigant",
@ -284,7 +294,7 @@
"navigation_bar.logout": "Ffeɣ", "navigation_bar.logout": "Ffeɣ",
"navigation_bar.mutes": "Iseqdacen yettwasusmen", "navigation_bar.mutes": "Iseqdacen yettwasusmen",
"navigation_bar.personal": "Udmawan", "navigation_bar.personal": "Udmawan",
"navigation_bar.pins": "Tijewwiqin yettwasentḍen", "navigation_bar.pins": "Tisuffaɣ yettwasenṭḍen",
"navigation_bar.preferences": "Imenyafen", "navigation_bar.preferences": "Imenyafen",
"navigation_bar.public_timeline": "Tasuddemt tazayezt tamatut", "navigation_bar.public_timeline": "Tasuddemt tazayezt tamatut",
"navigation_bar.search": "Nadi", "navigation_bar.search": "Nadi",
@ -311,7 +321,7 @@
"notifications.column_settings.reblog": "Seǧhed:", "notifications.column_settings.reblog": "Seǧhed:",
"notifications.column_settings.show": "Ssken-d tilɣa deg ujgu", "notifications.column_settings.show": "Ssken-d tilɣa deg ujgu",
"notifications.column_settings.sound": "Rmed imesli", "notifications.column_settings.sound": "Rmed imesli",
"notifications.column_settings.status": "Tiẓenẓunin timaynutin:", "notifications.column_settings.status": "Tisuffaɣ timaynutin :",
"notifications.filter.all": "Akk", "notifications.filter.all": "Akk",
"notifications.filter.boosts": "Seǧhed", "notifications.filter.boosts": "Seǧhed",
"notifications.filter.favourites": "Imenyafen", "notifications.filter.favourites": "Imenyafen",
@ -325,11 +335,15 @@
"notifications.permission_denied": "D awezɣi ad yili wermad n yilɣa n tnarit axateṛ turagt tettwagdel.", "notifications.permission_denied": "D awezɣi ad yili wermad n yilɣa n tnarit axateṛ turagt tettwagdel.",
"notifications_permission_banner.enable": "Rmed talɣutin n tnarit", "notifications_permission_banner.enable": "Rmed talɣutin n tnarit",
"notifications_permission_banner.title": "Ur zeggel acemma", "notifications_permission_banner.title": "Ur zeggel acemma",
"onboarding.action.back": "Tuɣalin ɣer deffir",
"onboarding.actions.back": "Tuɣalin ɣer deffir",
"onboarding.actions.go_to_explore": "See what's trending", "onboarding.actions.go_to_explore": "See what's trending",
"onboarding.actions.go_to_home": "Go to your home feed", "onboarding.actions.go_to_home": "Go to your home feed",
"onboarding.compose.template": "Azul a #Mastodon!", "onboarding.compose.template": "Azul a #Mastodon!",
"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.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": "Popular on Mastodon", "onboarding.follows.title": "Popular on Mastodon",
"onboarding.profile.display_name": "Isem ara d-yettwaskanen",
"onboarding.share.title": "Bḍu amaɣnu-inek·inem",
"onboarding.start.lead": "Your new Mastodon account is ready to go. Here's how you can make the most of it:", "onboarding.start.lead": "Your new Mastodon account is ready to go. Here's how you can make the most of it:",
"onboarding.start.skip": "Want to skip right ahead?", "onboarding.start.skip": "Want to skip right ahead?",
"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.",
@ -365,7 +379,7 @@
"report.block": "Sewḥel", "report.block": "Sewḥel",
"report.categories.other": "Tiyyaḍ", "report.categories.other": "Tiyyaḍ",
"report.categories.spam": "Aspam", "report.categories.spam": "Aspam",
"report.category.title_account": "ameγnu", "report.category.title_account": "ameɣnu",
"report.category.title_status": "tasuffeɣt", "report.category.title_status": "tasuffeɣt",
"report.close": "Immed", "report.close": "Immed",
"report.forward": "Bren-it ɣeṛ {target}", "report.forward": "Bren-it ɣeṛ {target}",
@ -383,6 +397,7 @@
"report_notification.open": "Ldi aneqqis", "report_notification.open": "Ldi aneqqis",
"search.placeholder": "Nadi", "search.placeholder": "Nadi",
"search.search_or_paste": "Nadi neɣ senṭeḍ URL", "search.search_or_paste": "Nadi neɣ senṭeḍ URL",
"search_popout.user": "amseqdac",
"search_results.all": "Akk", "search_results.all": "Akk",
"search_results.hashtags": "Ihacṭagen", "search_results.hashtags": "Ihacṭagen",
"search_results.statuses": "Tisuffaɣ", "search_results.statuses": "Tisuffaɣ",
@ -405,7 +420,7 @@
"status.embed": "Seddu", "status.embed": "Seddu",
"status.filtered": "Yettwasizdeg", "status.filtered": "Yettwasizdeg",
"status.load_more": "Sali ugar", "status.load_more": "Sali ugar",
"status.media_hidden": "Taɣwalt tettwaffer", "status.media_hidden": "Amidya yettwaffer",
"status.mention": "Bder-d @{name}", "status.mention": "Bder-d @{name}",
"status.more": "Ugar", "status.more": "Ugar",
"status.mute": "Sussem @{name}", "status.mute": "Sussem @{name}",
@ -425,7 +440,7 @@
"status.sensitive_warning": "Agbur amḥulfu", "status.sensitive_warning": "Agbur amḥulfu",
"status.share": "Bḍu", "status.share": "Bḍu",
"status.show_less": "Ssken-d drus", "status.show_less": "Ssken-d drus",
"status.show_less_all": "Semẓi akk tisuffγin", "status.show_less_all": "Semẓi akk tisuffɣin",
"status.show_more": "Ssken-d ugar", "status.show_more": "Ssken-d ugar",
"status.show_more_all": "Ẓerr ugar lebda", "status.show_more_all": "Ẓerr ugar lebda",
"status.title.with_attachments": "{user} posted {attachmentCount, plural, one {an attachment} other {# attachments}}", "status.title.with_attachments": "{user} posted {attachmentCount, plural, one {an attachment} other {# attachments}}",
@ -444,7 +459,7 @@
"timeline_hint.remote_resource_not_displayed": "{resource} seg yiqeddacen-nniḍen ur d-ttwaskanent ara.", "timeline_hint.remote_resource_not_displayed": "{resource} seg yiqeddacen-nniḍen ur d-ttwaskanent ara.",
"timeline_hint.resources.followers": "Imeḍfaṛen", "timeline_hint.resources.followers": "Imeḍfaṛen",
"timeline_hint.resources.follows": "T·Yeṭafaṛ", "timeline_hint.resources.follows": "T·Yeṭafaṛ",
"timeline_hint.resources.statuses": "Tijewwaqin tiqdimin", "timeline_hint.resources.statuses": "Tisuffaɣ tiqdimin",
"trends.counter_by_accounts": "{count, plural, one {{counter} person} other {{counter} people}} in the past {days, plural, one {day} other {# days}}", "trends.counter_by_accounts": "{count, plural, one {{counter} person} other {{counter} people}} in the past {days, plural, one {day} other {# days}}",
"trends.trending_now": "Ayen mucaɛen tura", "trends.trending_now": "Ayen mucaɛen tura",
"ui.beforeunload": "Arewway-ik·im ad iruḥ ma yella tefeɣ-d deg Maṣṭudun.", "ui.beforeunload": "Arewway-ik·im ad iruḥ ma yella tefeɣ-d deg Maṣṭudun.",
@ -465,7 +480,7 @@
"upload_modal.choose_image": "Fren tugna", "upload_modal.choose_image": "Fren tugna",
"upload_modal.description_placeholder": "Aberraɣ arurad ineggez nnig n uqjun amuṭṭis", "upload_modal.description_placeholder": "Aberraɣ arurad ineggez nnig n uqjun amuṭṭis",
"upload_modal.detect_text": "Sefru-d aḍris seg tugna", "upload_modal.detect_text": "Sefru-d aḍris seg tugna",
"upload_modal.edit_media": "Ẓreg taɣwalt", "upload_modal.edit_media": "Ẓreg amidya",
"upload_modal.preparing_ocr": "Aheyyi n OCR…", "upload_modal.preparing_ocr": "Aheyyi n OCR…",
"upload_modal.preview_label": "Taskant ({ratio})", "upload_modal.preview_label": "Taskant ({ratio})",
"upload_progress.label": "Asali iteddu...", "upload_progress.label": "Asali iteddu...",

View file

@ -523,6 +523,7 @@
"poll_button.add_poll": "Pridaj anketu", "poll_button.add_poll": "Pridaj anketu",
"poll_button.remove_poll": "Odstráň anketu", "poll_button.remove_poll": "Odstráň anketu",
"privacy.change": "Uprav súkromie príspevku", "privacy.change": "Uprav súkromie príspevku",
"privacy.direct.long": "Všetci spomenutí v príspevku",
"privacy.direct.short": "Konkrétni ľudia", "privacy.direct.short": "Konkrétni ľudia",
"privacy.private.long": "Iba tvoji nasledovatelia", "privacy.private.long": "Iba tvoji nasledovatelia",
"privacy.private.short": "Sledovatelia", "privacy.private.short": "Sledovatelia",

View file

@ -279,8 +279,8 @@
"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.personalized_suggestion": "คำแนะนำเฉพาะบุคคล", "follow_suggestions.personalized_suggestion": "ข้อเสนอแนะเฉพาะบุคคล",
"follow_suggestions.popular_suggestion": "คำแนะนำยอดนิยม", "follow_suggestions.popular_suggestion": "ข้อเสนอแนะยอดนิยม",
"follow_suggestions.view_all": "ดูทั้งหมด", "follow_suggestions.view_all": "ดูทั้งหมด",
"follow_suggestions.who_to_follow": "ติดตามใครดี", "follow_suggestions.who_to_follow": "ติดตามใครดี",
"followed_tags": "แฮชแท็กที่ติดตาม", "followed_tags": "แฮชแท็กที่ติดตาม",

View file

@ -2,6 +2,9 @@
"about.blocks": "ma lawa", "about.blocks": "ma lawa",
"about.contact": "toki:", "about.contact": "toki:",
"about.domain_blocks.no_reason_available": "mi sona ala e tan", "about.domain_blocks.no_reason_available": "mi sona ala e tan",
"about.domain_blocks.preamble": "ilo Masoton li ken e ni: sina lukin e toki jan pi ma ilo mute. sina ken toki tawa ona lon kulupu ma. taso, ma ni li ken ala e ni tawa ma ni:",
"about.domain_blocks.silenced.explanation": "sina lukin ala e toki e jan tan ma ni. taso, sina wile la, sina ken ni.",
"about.domain_blocks.silenced.title": "ken lili lukin",
"about.domain_blocks.suspended.title": "weka", "about.domain_blocks.suspended.title": "weka",
"about.not_available": "lon kulupu ni la sina ken alasa ala e sona ni.", "about.not_available": "lon kulupu ni la sina ken alasa ala e sona ni.",
"about.rules": "lawa kulupu", "about.rules": "lawa kulupu",
@ -32,6 +35,7 @@
"account.follows.empty": "jan ni li kute e jan ala", "account.follows.empty": "jan ni li kute e jan ala",
"account.go_to_profile": "o tawa lipu jan", "account.go_to_profile": "o tawa lipu jan",
"account.hide_reblogs": "o lukin ala e pana toki tan @{name}", "account.hide_reblogs": "o lukin ala e pana toki tan @{name}",
"account.in_memoriam": "jan ni li moli. pona o tawa ona.",
"account.languages": "sina wile lukin e sitelen pi toki seme", "account.languages": "sina wile lukin e sitelen pi toki seme",
"account.locked_info": "sina wile kute e jan ni la ona o toki e ken", "account.locked_info": "sina wile kute e jan ni la ona o toki e ken",
"account.media": "sitelen", "account.media": "sitelen",
@ -53,6 +57,7 @@
"account.unblock": "o weka ala e jan {name}", "account.unblock": "o weka ala e jan {name}",
"account.unblock_domain": "o weka ala e ma {domain}", "account.unblock_domain": "o weka ala e ma {domain}",
"account.unblock_short": "o pini weka", "account.unblock_short": "o pini weka",
"account.unendorse": "lipu jan la o suli ala e ni",
"account.unfollow": "o pini kute", "account.unfollow": "o pini kute",
"account.unmute": "o len ala e @{name}", "account.unmute": "o len ala e @{name}",
"account.unmute_notifications_short": "o kute e mu tan jan ni", "account.unmute_notifications_short": "o kute e mu tan jan ni",
@ -65,6 +70,9 @@
"alert.unexpected.title": "pakala a!", "alert.unexpected.title": "pakala a!",
"announcement.announcement": "toki suli", "announcement.announcement": "toki suli",
"audio.hide": "o len e kalama", "audio.hide": "o len e kalama",
"boost_modal.combo": "sina ken luka e nena {combo} tawa ni: sina wile ala luka e nena lon tenpo kama",
"bundle_column_error.copy_stacktrace": "o awen e sona pakala lon ilo sina",
"bundle_column_error.error.body": "ilo li ken ala pana e lipu ni. ni li ken tan pakala ilo.",
"bundle_column_error.error.title": "ike a!", "bundle_column_error.error.title": "ike a!",
"bundle_column_error.network.title": "pakala la ilo sina li toki ala tawa ilo ante", "bundle_column_error.network.title": "pakala la ilo sina li toki ala tawa ilo ante",
"bundle_column_error.retry": "o ni sin", "bundle_column_error.retry": "o ni sin",
@ -75,7 +83,9 @@
"bundle_modal_error.message": "ilo li wile kama e ijo ni, taso pakala li lon.", "bundle_modal_error.message": "ilo li wile kama e ijo ni, taso pakala li lon.",
"bundle_modal_error.retry": "o ni sin", "bundle_modal_error.retry": "o ni sin",
"closed_registrations_modal.find_another_server": "o alasa e ma ante", "closed_registrations_modal.find_another_server": "o alasa e ma ante",
"column.about": "sona",
"column.blocks": "kulupu pi jan weka", "column.blocks": "kulupu pi jan weka",
"column.bookmarks": "awen toki",
"column.home": "lipu open", "column.home": "lipu open",
"column.lists": "kulupu lipu", "column.lists": "kulupu lipu",
"column.mutes": "jan len", "column.mutes": "jan len",

View file

@ -44,7 +44,7 @@ class FetchResourceService < BaseService
@response_code = response.code @response_code = response.code
return nil if response.code != 200 return nil if response.code != 200
if ['application/activity+json', 'application/ld+json'].include?(response.mime_type) if valid_activitypub_content_type?(response)
body = response.body_with_limit body = response.body_with_limit
json = body_to_json(body) json = body_to_json(body)

View file

@ -979,7 +979,7 @@ de:
next_steps: Du kannst dem Einspruch zustimmen, um die Moderationsentscheidung rückgängig zu machen, oder ihn ignorieren. next_steps: Du kannst dem Einspruch zustimmen, um die Moderationsentscheidung rückgängig zu machen, oder ihn ignorieren.
subject: "%{username} hat Einspruch gegen eine Moderationsentscheidung auf %{instance} erhoben" subject: "%{username} hat Einspruch gegen eine Moderationsentscheidung auf %{instance} erhoben"
new_critical_software_updates: new_critical_software_updates:
body: Kritische Updates wurden für Mastodon veröffentlicht du solltest so schnell wie möglich aktualisieren! body: ein neues Sicherheitsupdate wurde veröffentlicht. Du solltest Mastodon so schnell wie möglich aktualisieren!
subject: Kritische Mastodon-Updates sind für %{instance} verfügbar! subject: Kritische Mastodon-Updates sind für %{instance} verfügbar!
new_pending_account: new_pending_account:
body: Die Details von diesem neuem Konto sind unten. Du kannst die Anfrage akzeptieren oder ablehnen. body: Die Details von diesem neuem Konto sind unten. Du kannst die Anfrage akzeptieren oder ablehnen.
@ -1023,7 +1023,7 @@ de:
salutation: "%{name}," salutation: "%{name},"
settings: 'E-Mail-Einstellungen ändern: %{link}' settings: 'E-Mail-Einstellungen ändern: %{link}'
unsubscribe: Abbestellen unsubscribe: Abbestellen
view: 'Hier überprüfen:' view: 'Siehe:'
view_profile: Profil anzeigen view_profile: Profil anzeigen
view_status: Beitrag anschauen view_status: Beitrag anschauen
applications: applications:

View file

@ -12,6 +12,7 @@ be:
last_attempt: У вас ёсць яшчэ адна спроба, перш чым ваш рахунак будзе заблакаваны last_attempt: У вас ёсць яшчэ адна спроба, перш чым ваш рахунак будзе заблакаваны
locked: Ваш уліковы запіс заблакіраваны. locked: Ваш уліковы запіс заблакіраваны.
not_found_in_database: Няправільны %{authentication_keys} або пароль. not_found_in_database: Няправільны %{authentication_keys} або пароль.
omniauth_user_creation_failure: Памылка пры стварэнні ўліковага запісу для гэтай асобы.
pending: Ваш уліковы запіс яшчэ разглядаецца. pending: Ваш уліковы запіс яшчэ разглядаецца.
timeout: Ваш сеанс скончыўся. Каб працягнуць, увайдзіце яшчэ раз. timeout: Ваш сеанс скончыўся. Каб працягнуць, увайдзіце яшчэ раз.
unauthenticated: Вам патрэбна зайсьці альбо зарэгістравацца, каб працягнуць unauthenticated: Вам патрэбна зайсьці альбо зарэгістравацца, каб працягнуць

View file

@ -14,6 +14,7 @@ ca:
last_attempt: Tens un intent més abans no es bloqui el teu compte. last_attempt: Tens un intent més abans no es bloqui el teu compte.
locked: El teu compte s'ha blocat. locked: El teu compte s'ha blocat.
not_found_in_database: "%{authentication_keys} o contrasenya no són vàlids." not_found_in_database: "%{authentication_keys} o contrasenya no són vàlids."
omniauth_user_creation_failure: S'ha produït un error en crear un compte per a aquesta identitat.
pending: El teu compte encara està en revisió. pending: El teu compte encara està en revisió.
timeout: La teva sessió ha expirat. Torna a iniciar-la per a continuar. timeout: La teva sessió ha expirat. Torna a iniciar-la per a continuar.
unauthenticated: Necessites iniciar sessió o registrar-te abans de continuar. unauthenticated: Necessites iniciar sessió o registrar-te abans de continuar.

View file

@ -12,6 +12,7 @@ da:
last_attempt: Du har ét forsøg mere, før din konto bliver låst. last_attempt: Du har ét forsøg mere, før din konto bliver låst.
locked: Din konto er låst. locked: Din konto er låst.
not_found_in_database: Ugyldig %{authentication_keys} eller adgangskode. not_found_in_database: Ugyldig %{authentication_keys} eller adgangskode.
omniauth_user_creation_failure: Fejl under oprettelse af konto for denne identitet.
pending: Din konto er stadig under revision. pending: Din konto er stadig under revision.
timeout: Session udløbet. Log ind igen for at fortsætte. timeout: Session udløbet. Log ind igen for at fortsætte.
unauthenticated: Log ind eller tilmeld dig for at fortsætte. unauthenticated: Log ind eller tilmeld dig for at fortsætte.

View file

@ -12,6 +12,7 @@ de:
last_attempt: Du hast nur noch einen Versuch, bevor dein Zugang gesperrt wird. last_attempt: Du hast nur noch einen Versuch, bevor dein Zugang gesperrt wird.
locked: Dein Konto ist gesperrt. locked: Dein Konto ist gesperrt.
not_found_in_database: "%{authentication_keys} oder Passwort ungültig." not_found_in_database: "%{authentication_keys} oder Passwort ungültig."
omniauth_user_creation_failure: Fehler beim Erstellen eines Kontos für diese Identität.
pending: Dein Konto wird weiterhin überprüft. pending: Dein Konto wird weiterhin überprüft.
timeout: Deine Sitzung ist abgelaufen. Bitte melde dich erneut an, um fortzufahren. timeout: Deine Sitzung ist abgelaufen. Bitte melde dich erneut an, um fortzufahren.
unauthenticated: Du musst dich anmelden oder registrieren, bevor du fortfahren kannst. unauthenticated: Du musst dich anmelden oder registrieren, bevor du fortfahren kannst.

View file

@ -12,6 +12,7 @@ es-AR:
last_attempt: Tenés un intento más antes de que se bloquee tu cuenta. last_attempt: Tenés un intento más antes de que se bloquee tu cuenta.
locked: Se bloqueó tu cuenta. locked: Se bloqueó tu cuenta.
not_found_in_database: "%{authentication_keys} o contraseña no válidas." not_found_in_database: "%{authentication_keys} o contraseña no válidas."
omniauth_user_creation_failure: Error al crear una cuenta para esta identidad.
pending: Tu cuenta todavía está bajo revisión. pending: Tu cuenta todavía está bajo revisión.
timeout: Venció tu sesión. Por favor, volvé a iniciar sesión para continuar. timeout: Venció tu sesión. Por favor, volvé a iniciar sesión para continuar.
unauthenticated: Necesitás iniciar sesión o registrarte antes de continuar. unauthenticated: Necesitás iniciar sesión o registrarte antes de continuar.

View file

@ -12,6 +12,7 @@ eu:
last_attempt: Saiakera bat geratzen zaizu zure kontua giltzapetu aurretik. last_attempt: Saiakera bat geratzen zaizu zure kontua giltzapetu aurretik.
locked: Zure kontua giltzapetuta dago. locked: Zure kontua giltzapetuta dago.
not_found_in_database: Baliogabeko %{authentication_keys} edo pasahitza. not_found_in_database: Baliogabeko %{authentication_keys} edo pasahitza.
omniauth_user_creation_failure: Errorea identitate honen kontu bat sortzean.
pending: Zure kontua oraindik berrikusteke dago. pending: Zure kontua oraindik berrikusteke dago.
timeout: Zure saioa iraungitu da. Hasi saioa berriro jarraitzeko. timeout: Zure saioa iraungitu da. Hasi saioa berriro jarraitzeko.
unauthenticated: Saioa hasi edo izena eman behar duzu jarraitu aurretik. unauthenticated: Saioa hasi edo izena eman behar duzu jarraitu aurretik.

View file

@ -12,6 +12,7 @@ fi:
last_attempt: Sinulla on vielä yksi yritys ennen kuin tilisi lukitaan. last_attempt: Sinulla on vielä yksi yritys ennen kuin tilisi lukitaan.
locked: Tilisi on lukittu. locked: Tilisi on lukittu.
not_found_in_database: Virheellinen %{authentication_keys} tai salasana. not_found_in_database: Virheellinen %{authentication_keys} tai salasana.
omniauth_user_creation_failure: Virhe luotaessa tiliä tälle henkilöllisyydelle.
pending: Tilisi on vielä tarkistamatta. pending: Tilisi on vielä tarkistamatta.
timeout: Istuntosi on vanhentunut. Jatkaaksesi käyttöä, kirjaudu uudelleen. timeout: Istuntosi on vanhentunut. Jatkaaksesi käyttöä, kirjaudu uudelleen.
unauthenticated: Sinun on kirjauduttava tai rekisteröidyttävä ennen kuin voit jatkaa. unauthenticated: Sinun on kirjauduttava tai rekisteröidyttävä ennen kuin voit jatkaa.

View file

@ -12,6 +12,7 @@ fo:
last_attempt: Tú kanst royna einaferð afturat áðrenn kontan verður stongd. last_attempt: Tú kanst royna einaferð afturat áðrenn kontan verður stongd.
locked: Kontan hjá tær er læst. locked: Kontan hjá tær er læst.
not_found_in_database: Ogyldigur %{authentication_keys} ella loyniorð. not_found_in_database: Ogyldigur %{authentication_keys} ella loyniorð.
omniauth_user_creation_failure: Feilur í sambandi við, at ein konta fyri hendan samleikan bleiv stovnað.
pending: Kontan hjá tær verður kannað enn. pending: Kontan hjá tær verður kannað enn.
timeout: Tín innritan er útgingin. Innrita av nýggjum, fyri at hada fram. timeout: Tín innritan er útgingin. Innrita av nýggjum, fyri at hada fram.
unauthenticated: Tú mást skriva teg inn aftur fyri at halda fram. unauthenticated: Tú mást skriva teg inn aftur fyri at halda fram.

View file

@ -12,6 +12,7 @@ fy:
last_attempt: Jo hawwe noch ien besykjen oer eardat jo account blokkearre wurdt. last_attempt: Jo hawwe noch ien besykjen oer eardat jo account blokkearre wurdt.
locked: Jo account is blokkearre. locked: Jo account is blokkearre.
not_found_in_database: "%{authentication_keys} of wachtwurd ûnjildich." not_found_in_database: "%{authentication_keys} of wachtwurd ûnjildich."
omniauth_user_creation_failure: Flater by it oanmeitsjen fan in account foar dizze identiteit.
pending: Jo account moat noch hieltyd beoardiele wurde. pending: Jo account moat noch hieltyd beoardiele wurde.
timeout: Jo sesje is ferrûn. Meld jo opnij oan om troch te gean. timeout: Jo sesje is ferrûn. Meld jo opnij oan om troch te gean.
unauthenticated: Jo moatte oanmelde of registrearje. unauthenticated: Jo moatte oanmelde of registrearje.

View file

@ -12,6 +12,7 @@ gl:
last_attempt: Tes un intento máis antes de que a túa conta fique bloqueada. last_attempt: Tes un intento máis antes de que a túa conta fique bloqueada.
locked: A túa conta está bloqueada. locked: A túa conta está bloqueada.
not_found_in_database: "%{authentication_keys} ou contrasinal non válidos." not_found_in_database: "%{authentication_keys} ou contrasinal non válidos."
omniauth_user_creation_failure: Erro ao crear unha conta para esta identidade.
pending: A túa conta aínda está baixo revisión. pending: A túa conta aínda está baixo revisión.
timeout: A túa sesión caducou. Accede outra vez para continuar. timeout: A túa sesión caducou. Accede outra vez para continuar.
unauthenticated: Precisas iniciar sesión ou rexistrarte antes de continuar. unauthenticated: Precisas iniciar sesión ou rexistrarte antes de continuar.

View file

@ -12,6 +12,7 @@ he:
last_attempt: יש לך עוד ניסיון אחד לפני נעילת החשבון. last_attempt: יש לך עוד ניסיון אחד לפני נעילת החשבון.
locked: חשבון זה נעול. locked: חשבון זה נעול.
not_found_in_database: "%{authentication_keys} או סיסמה לא נכונים." not_found_in_database: "%{authentication_keys} או סיסמה לא נכונים."
omniauth_user_creation_failure: שגיאה ביצירת חשבון לזהות הזו.
pending: חשבונך נמצא עדיין בבדיקה. pending: חשבונך נמצא עדיין בבדיקה.
timeout: פג תוקף השהיה בחשבון. נא להכנס מחדש על מנת להמשיך. timeout: פג תוקף השהיה בחשבון. נא להכנס מחדש על מנת להמשיך.
unauthenticated: יש להרשם או להכנס לחשבון על מנת להמשיך. unauthenticated: יש להרשם או להכנס לחשבון על מנת להמשיך.

View file

@ -12,6 +12,7 @@ hu:
last_attempt: Már csak egy próbálkozásod maradt, mielőtt a fiókodat zároljuk. last_attempt: Már csak egy próbálkozásod maradt, mielőtt a fiókodat zároljuk.
locked: A fiókodat zároltuk. locked: A fiókodat zároltuk.
not_found_in_database: Helytelen %{authentication_keys} vagy jelszó. not_found_in_database: Helytelen %{authentication_keys} vagy jelszó.
omniauth_user_creation_failure: Hiba történt a fiók létrehozása során ehhez az identitáshoz.
pending: A fiókod még engedélyezésre vár. pending: A fiókod még engedélyezésre vár.
timeout: A munkameneted lejárt. A folytatáshoz jelentkezz be újra. timeout: A munkameneted lejárt. A folytatáshoz jelentkezz be újra.
unauthenticated: A folytatás előtt be kell jelentkezned vagy regisztrálnod kell. unauthenticated: A folytatás előtt be kell jelentkezned vagy regisztrálnod kell.

View file

@ -12,6 +12,7 @@ ie:
last_attempt: Hay solmen un prova ante que tui conto deveni serrat. last_attempt: Hay solmen un prova ante que tui conto deveni serrat.
locked: Tui conto es serrat. locked: Tui conto es serrat.
not_found_in_database: Ínvalid %{authentication_keys} o passa-parol. not_found_in_database: Ínvalid %{authentication_keys} o passa-parol.
omniauth_user_creation_failure: Errore in li creation de un conto por ti-ci identitá.
pending: Tui conto es ancor sub revision. pending: Tui conto es ancor sub revision.
timeout: Tui session ha expirat. Ples reintrar denov por continuar. timeout: Tui session ha expirat. Ples reintrar denov por continuar.
unauthenticated: Tu deve intrar o registrar te ante continuar. unauthenticated: Tu deve intrar o registrar te ante continuar.

View file

@ -12,6 +12,7 @@ is:
last_attempt: Þú getur reynt einu sinni í viðbót áður en aðgangnum þínum verður læst. last_attempt: Þú getur reynt einu sinni í viðbót áður en aðgangnum þínum verður læst.
locked: Notandaaðgangurinn þinn er læstur. locked: Notandaaðgangurinn þinn er læstur.
not_found_in_database: Ógilt %{authentication_keys} eða lykilorð. not_found_in_database: Ógilt %{authentication_keys} eða lykilorð.
omniauth_user_creation_failure: Villa við að útbúa aðgang fyrir þetta auðkenni.
pending: Notandaaðgangurinn þinn er enn til yfirferðar. pending: Notandaaðgangurinn þinn er enn til yfirferðar.
timeout: Setan þín er útrunnin. Skráðu þig aftur inn til að halda áfram. timeout: Setan þín er útrunnin. Skráðu þig aftur inn til að halda áfram.
unauthenticated: Þú þarft að skrá þig inn eða nýskrá þig áður en lengra er haldið. unauthenticated: Þú þarft að skrá þig inn eða nýskrá þig áður en lengra er haldið.

View file

@ -12,6 +12,7 @@ it:
last_attempt: Hai un altro tentativo, prima che il tuo profilo venga bloccato. last_attempt: Hai un altro tentativo, prima che il tuo profilo venga bloccato.
locked: Il tuo profilo è bloccato. locked: Il tuo profilo è bloccato.
not_found_in_database: "%{authentication_keys} o password non valida." not_found_in_database: "%{authentication_keys} o password non valida."
omniauth_user_creation_failure: Errore nella creazione di un account per questa identità.
pending: Il tuo profilo è ancora in revisione. pending: Il tuo profilo è ancora in revisione.
timeout: La tua sessione è scaduta. Sei pregato di accedere nuovamente per continuare. timeout: La tua sessione è scaduta. Sei pregato di accedere nuovamente per continuare.
unauthenticated: Devi accedere o registrarti, per continuare. unauthenticated: Devi accedere o registrarti, per continuare.

View file

@ -13,13 +13,13 @@ kab:
locked: Amiḍan-ik yettwargel. locked: Amiḍan-ik yettwargel.
not_found_in_database: Tella tuccḍa deg %{authentication_keys} neγ deg wawal uffir. not_found_in_database: Tella tuccḍa deg %{authentication_keys} neγ deg wawal uffir.
pending: Amiḍan-inek mazal-it deg ɛiwed n tmuγli. pending: Amiḍan-inek mazal-it deg ɛiwed n tmuγli.
timeout: Tiγimit n tuqqna tezri. Ma ulac aγilif ɛiwed tuqqna akken ad tkemmleḍ. timeout: Tiɣimit n tuqqna tezri. Ma ulac aɣilif ɛiwed tuqqna akken ad tkemmleḍ.
unauthenticated: Ilaq ad teqqneḍ neγ ad tjerrḍeḍ akken ad tkemmelḍ. unauthenticated: Ilaq ad teqqneḍ neɣ ad tjerrḍeḍ akken ad tkemmelḍ.
unconfirmed: Ilaq ad wekdeḍ tansa-inek imayl akken ad tkemmelḍ. unconfirmed: Ilaq ad wekdeḍ tansa-inek imayl akken ad tkemmelḍ.
mailer: mailer:
confirmation_instructions: confirmation_instructions:
action: Senqed tansa-inek imayl action: Senqed tansa-inek imayl
action_with_app: Wekked sakkin uγal γer %{app} action_with_app: Sentem sakkin uɣal ɣer %{app}
explanation: Aqla-k terniḍ amiḍan deg %{host} s tansa imayl-agi. Mazal-ak yiwen utekki akken ad t-tremdeḍ. Ma mačči d kečč i yessutren ay-agi, ttxil-k ssinef izen-a. explanation: Aqla-k terniḍ amiḍan deg %{host} s tansa imayl-agi. Mazal-ak yiwen utekki akken ad t-tremdeḍ. Ma mačči d kečč i yessutren ay-agi, ttxil-k ssinef izen-a.
explanation_when_pending: Tsutreḍ-d ajerred deg %{host} s tansa-agi imayl. Ad nγeṛ asuter-ik ticki tsentmeḍ tansa-ik imayl. Send asentem, ur tezmireḍ ara ad teqqneḍ γer umiḍan-ik. Ma yella nugi asuter-ik, isefka-ik ad ttwakksen seg uqeddac, ihi ulac tigawt-nniḍen ara k-d-yettuqeblen. Ma mačči d kečč i yellan deffir n usuter-agi, ttxil-k ssinef izen-agi. explanation_when_pending: Tsutreḍ-d ajerred deg %{host} s tansa-agi imayl. Ad nγeṛ asuter-ik ticki tsentmeḍ tansa-ik imayl. Send asentem, ur tezmireḍ ara ad teqqneḍ γer umiḍan-ik. Ma yella nugi asuter-ik, isefka-ik ad ttwakksen seg uqeddac, ihi ulac tigawt-nniḍen ara k-d-yettuqeblen. Ma mačči d kečč i yellan deffir n usuter-agi, ttxil-k ssinef izen-agi.
extra_html: Ttxil-k ẓer daγen <a href="%{terms_path}">ilugan n uqeddac</a> akked <a href="%{policy_path}">twetlin n useqdec-nneγ</a>. extra_html: Ttxil-k ẓer daγen <a href="%{terms_path}">ilugan n uqeddac</a> akked <a href="%{policy_path}">twetlin n useqdec-nneγ</a>.
@ -87,7 +87,7 @@ kab:
unlocks: unlocks:
send_instructions: Deg kra n tesdatin, ad teṭṭfeḍ imayl deg-s iwellihen i yilaqen i userreḥ n umiḍan-ik·im. Ma yella ur tufiḍ ara izen-agi, ttxil-k·m ẓer deg ukaram spam. send_instructions: Deg kra n tesdatin, ad teṭṭfeḍ imayl deg-s iwellihen i yilaqen i userreḥ n umiḍan-ik·im. Ma yella ur tufiḍ ara izen-agi, ttxil-k·m ẓer deg ukaram spam.
send_paranoid_instructions: Ma yella umiḍan-ik·im yella, ad teṭṭfeḍ imayl deg tesdatin i d-iteddun, deg-s iwellihen i yilaqen i userreḥ n umiḍan-ik·im. Ma yella ur tufiḍ ara izen-agi, ttxil-k·m ẓer deg ukaram spam. send_paranoid_instructions: Ma yella umiḍan-ik·im yella, ad teṭṭfeḍ imayl deg tesdatin i d-iteddun, deg-s iwellihen i yilaqen i userreḥ n umiḍan-ik·im. Ma yella ur tufiḍ ara izen-agi, ttxil-k·m ẓer deg ukaram spam.
unlocked: Iserreḥ umiḍan-ik·im akken iwata. ttxil qqen akken ad tkemleḍ. unlocked: Iserreḥ umiḍan-ik·im akken iwata. Ttxil qqen akken ad tkemleḍ.
errors: errors:
messages: messages:
already_confirmed: ittwasentem yakan, ttxil εreḍ ad teqneḍ already_confirmed: ittwasentem yakan, ttxil εreḍ ad teqneḍ

View file

@ -12,6 +12,7 @@ ko:
last_attempt: 계정이 잠기기까지 한 번의 시도가 남았습니다. last_attempt: 계정이 잠기기까지 한 번의 시도가 남았습니다.
locked: 계정이 잠겼습니다. locked: 계정이 잠겼습니다.
not_found_in_database: 올바르지 않은 %{authentication_keys} 혹은 암호입니다. not_found_in_database: 올바르지 않은 %{authentication_keys} 혹은 암호입니다.
omniauth_user_creation_failure: 이 신원으로 계정을 만드는데 실패했습니다.
pending: 이 계정은 아직 검토 중입니다. pending: 이 계정은 아직 검토 중입니다.
timeout: 세션이 만료되었습니다. 다시 로그인 하세요. timeout: 세션이 만료되었습니다. 다시 로그인 하세요.
unauthenticated: 계속 하려면 로그인을 해야 합니다. unauthenticated: 계속 하려면 로그인을 해야 합니다.

View file

@ -12,6 +12,7 @@ lad:
last_attempt: Aprova una vez mas antes de ke tu kuento sea blokado. last_attempt: Aprova una vez mas antes de ke tu kuento sea blokado.
locked: Tu kuento esta blokado. locked: Tu kuento esta blokado.
not_found_in_database: Inkorekto %{authentication_keys} o kod. not_found_in_database: Inkorekto %{authentication_keys} o kod.
omniauth_user_creation_failure: Ay un error en kriyar un kuento para esta identita.
pending: Tu kuento ainda esta basho revizyon. pending: Tu kuento ainda esta basho revizyon.
timeout: Tu sesyon tiene kadukado. Por favor konektate kon tu kuento de muevo para kontinuar. timeout: Tu sesyon tiene kadukado. Por favor konektate kon tu kuento de muevo para kontinuar.
unauthenticated: Kale konektarte kon tu kuento o enregistrarte antes de kontinuar. unauthenticated: Kale konektarte kon tu kuento o enregistrarte antes de kontinuar.

View file

@ -12,6 +12,7 @@ nl:
last_attempt: Je hebt nog één poging over voordat jouw account wordt opgeschort. last_attempt: Je hebt nog één poging over voordat jouw account wordt opgeschort.
locked: Jouw account is opgeschort. locked: Jouw account is opgeschort.
not_found_in_database: "%{authentication_keys} of wachtwoord ongeldig." not_found_in_database: "%{authentication_keys} of wachtwoord ongeldig."
omniauth_user_creation_failure: Fout bij het aanmaken van een account voor deze identiteit.
pending: Jouw account moet nog steeds worden beoordeeld. pending: Jouw account moet nog steeds worden beoordeeld.
timeout: Jouw sessie is verlopen, log opnieuw in. timeout: Jouw sessie is verlopen, log opnieuw in.
unauthenticated: Je dient in te loggen of te registreren. unauthenticated: Je dient in te loggen of te registreren.

View file

@ -12,6 +12,7 @@ pl:
last_attempt: Masz jeszcze jedną próbę; Twoje konto zostanie zablokowane jeśli się nie powiedzie. last_attempt: Masz jeszcze jedną próbę; Twoje konto zostanie zablokowane jeśli się nie powiedzie.
locked: Twoje konto zostało zablokowane. locked: Twoje konto zostało zablokowane.
not_found_in_database: Nieprawidłowy %{authentication_keys} lub hasło. not_found_in_database: Nieprawidłowy %{authentication_keys} lub hasło.
omniauth_user_creation_failure: Błąd przy tworzeniu konta dla tej tożsamości.
pending: Twoje konto oczekuje na przegląd. pending: Twoje konto oczekuje na przegląd.
timeout: Twoja sesja wygasła. Zaloguj się ponownie, aby kontynuować.. timeout: Twoja sesja wygasła. Zaloguj się ponownie, aby kontynuować..
unauthenticated: Zapisz się lub zaloguj, aby kontynuować. unauthenticated: Zapisz się lub zaloguj, aby kontynuować.

View file

@ -12,6 +12,7 @@ pt-PT:
last_attempt: Tem só mais uma tentativa antes da sua conta ser bloqueada. last_attempt: Tem só mais uma tentativa antes da sua conta ser bloqueada.
locked: A tua conta está bloqueada. locked: A tua conta está bloqueada.
not_found_in_database: "%{authentication_keys} ou palavra-passe inválida." not_found_in_database: "%{authentication_keys} ou palavra-passe inválida."
omniauth_user_creation_failure: Erro ao criar uma conta para esta identidade.
pending: A sua conta está ainda a aguardar revisão. pending: A sua conta está ainda a aguardar revisão.
timeout: A tua sessão expirou. Por favor, entra de novo para continuares. timeout: A tua sessão expirou. Por favor, entra de novo para continuares.
unauthenticated: Precisas de entrar na tua conta ou de te registares antes de continuar. unauthenticated: Precisas de entrar na tua conta ou de te registares antes de continuar.

View file

@ -12,6 +12,7 @@ sk:
last_attempt: Máš posledný pokus pred zamknutím tvojho účtu. last_attempt: Máš posledný pokus pred zamknutím tvojho účtu.
locked: Tvoj účet je zamknutý. locked: Tvoj účet je zamknutý.
not_found_in_database: Nesprávny %{authentication_keys}, alebo heslo. not_found_in_database: Nesprávny %{authentication_keys}, alebo heslo.
omniauth_user_creation_failure: Chyba pri vytváraní účtu pre túto identitu.
pending: Tvoj účet je stále prehodnocovaný. pending: Tvoj účet je stále prehodnocovaný.
timeout: Tvoja aktívna sezóna vypršala. Pre pokračovanie sa prosím prihlás znovu. timeout: Tvoja aktívna sezóna vypršala. Pre pokračovanie sa prosím prihlás znovu.
unauthenticated: K pokračovaniu sa musíš zaregistrovať alebo prihlásiť. unauthenticated: K pokračovaniu sa musíš zaregistrovať alebo prihlásiť.

View file

@ -12,6 +12,7 @@ sl:
last_attempt: Pred zaklepom računa imate še en poskus. last_attempt: Pred zaklepom računa imate še en poskus.
locked: Vaš račun je zaklenjen. locked: Vaš račun je zaklenjen.
not_found_in_database: Neveljavno %{authentication_keys} ali geslo. not_found_in_database: Neveljavno %{authentication_keys} ali geslo.
omniauth_user_creation_failure: Napaka pri ustvarjanju računa za to identiteto.
pending: Vaš račun je še vedno pod drobnogledom. pending: Vaš račun je še vedno pod drobnogledom.
timeout: Vaša seja je potekla. Če želite nadaljevati, se znova prijavite. timeout: Vaša seja je potekla. Če želite nadaljevati, se znova prijavite.
unauthenticated: Pred nadaljevanjem se morate prijaviti ali vpisati. unauthenticated: Pred nadaljevanjem se morate prijaviti ali vpisati.

View file

@ -12,6 +12,7 @@ sq:
last_attempt: Mund të provoni edhe një herë, përpara se llogaria juaj të kyçet. last_attempt: Mund të provoni edhe një herë, përpara se llogaria juaj të kyçet.
locked: Llogaria juaj është e kyçur. locked: Llogaria juaj është e kyçur.
not_found_in_database: "%{authentication_keys} ose fjalëkalim i pavlefshëm." not_found_in_database: "%{authentication_keys} ose fjalëkalim i pavlefshëm."
omniauth_user_creation_failure: Gabim në krijim llogarie për këtë identitet.
pending: Llogaria juaj është ende nën shqyrtim. pending: Llogaria juaj është ende nën shqyrtim.
timeout: Sesioni juaj ka skaduar. Ju lutemi, që të vazhdohet, ribëni hyrjen. timeout: Sesioni juaj ka skaduar. Ju lutemi, që të vazhdohet, ribëni hyrjen.
unauthenticated: Përpara se të vazhdohet më tej, lypset të bëni hyrjen ose të regjistroheni. unauthenticated: Përpara se të vazhdohet më tej, lypset të bëni hyrjen ose të regjistroheni.

View file

@ -12,6 +12,7 @@ sr-Latn:
last_attempt: Imate još jedan pokušaj pre nego što Vaš nalog bude zaključan. last_attempt: Imate još jedan pokušaj pre nego što Vaš nalog bude zaključan.
locked: Vaš nalog je zaključan. locked: Vaš nalog je zaključan.
not_found_in_database: Neispravna %{authentication_keys} ili lozinka. not_found_in_database: Neispravna %{authentication_keys} ili lozinka.
omniauth_user_creation_failure: Greška pri kreiranju naloga za ovaj identitet.
pending: Vaš račun je još uvek u pregledu. pending: Vaš račun je još uvek u pregledu.
timeout: Vreme trajanja Vaše sesije je isteklo. Za nastavak prijavite se ponovo. timeout: Vreme trajanja Vaše sesije je isteklo. Za nastavak prijavite se ponovo.
unauthenticated: Za nastavak se morate prijaviti ili registrovati. unauthenticated: Za nastavak se morate prijaviti ili registrovati.

View file

@ -12,6 +12,7 @@ sr:
last_attempt: Имате још један покушај пре него што Ваш налог буде закључан. last_attempt: Имате још један покушај пре него што Ваш налог буде закључан.
locked: Ваш налог је закључан. locked: Ваш налог је закључан.
not_found_in_database: Неисправна %{authentication_keys} или лозинка. not_found_in_database: Неисправна %{authentication_keys} или лозинка.
omniauth_user_creation_failure: Грешка при креирању налога за овај идентитет.
pending: Ваш налог се још увек прегледа. pending: Ваш налог се још увек прегледа.
timeout: Ваша сесија је истекла. Пријавите се поново да бисте наставили. timeout: Ваша сесија је истекла. Пријавите се поново да бисте наставили.
unauthenticated: Морате да се пријавите или региструјете пре него што наставите. unauthenticated: Морате да се пријавите или региструјете пре него што наставите.

View file

@ -12,6 +12,7 @@ tr:
last_attempt: Hesabınız kilitlenmeden önce bir kez daha denemeniz gerekir. last_attempt: Hesabınız kilitlenmeden önce bir kez daha denemeniz gerekir.
locked: Hesabınız kilitlendi. locked: Hesabınız kilitlendi.
not_found_in_database: Geçersiz %{authentication_keys} ya da parola. not_found_in_database: Geçersiz %{authentication_keys} ya da parola.
omniauth_user_creation_failure: Bu kimlik için hesap oluşturmada hata.
pending: Hesabınız hala inceleniyor. pending: Hesabınız hala inceleniyor.
timeout: Oturum süreniz sona erdi. Lütfen devam etmek için tekrar giriş yapınız. timeout: Oturum süreniz sona erdi. Lütfen devam etmek için tekrar giriş yapınız.
unauthenticated: Devam etmeden önce oturum açmanız veya kayıt olmanız gerek. unauthenticated: Devam etmeden önce oturum açmanız veya kayıt olmanız gerek.

View file

@ -12,6 +12,7 @@ uk:
last_attempt: У вас залишилась ще одна спроба, після якої ваш обліковий запис буде заблоковано. last_attempt: У вас залишилась ще одна спроба, після якої ваш обліковий запис буде заблоковано.
locked: Ваш обліковий запис заблоковано. locked: Ваш обліковий запис заблоковано.
not_found_in_database: Неправильний %{authentication_keys} або пароль. not_found_in_database: Неправильний %{authentication_keys} або пароль.
omniauth_user_creation_failure: Помилка створення облікового запису для цієї особи.
pending: Ваш обліковий запис ще перебуває на розгляді. pending: Ваш обліковий запис ще перебуває на розгляді.
timeout: Час сеансу минув. Будь ласка, увійдіть знову, щоб продовжити. timeout: Час сеансу минув. Будь ласка, увійдіть знову, щоб продовжити.
unauthenticated: Щоб продовжити, увійдіть або зареєструйтеся. unauthenticated: Щоб продовжити, увійдіть або зареєструйтеся.

View file

@ -12,6 +12,7 @@ zh-CN:
last_attempt: 你只有最后一次尝试机会,若未通过,帐号将被锁定。 last_attempt: 你只有最后一次尝试机会,若未通过,帐号将被锁定。
locked: 你的账户已被锁定。 locked: 你的账户已被锁定。
not_found_in_database: "%{authentication_keys}或密码错误。" not_found_in_database: "%{authentication_keys}或密码错误。"
omniauth_user_creation_failure: 为此身份创建账户时出错。
pending: 你的账号仍在审核中。 pending: 你的账号仍在审核中。
timeout: 你的会话已过期。请重新登录再继续操作。 timeout: 你的会话已过期。请重新登录再继续操作。
unauthenticated: 继续操作前请注册或者登录。 unauthenticated: 继续操作前请注册或者登录。

View file

@ -12,6 +12,7 @@ zh-HK:
last_attempt: 若你再一次嘗試失敗,我們將鎖定你的帳號,以策安全。 last_attempt: 若你再一次嘗試失敗,我們將鎖定你的帳號,以策安全。
locked: 你的帳號已被鎖定。 locked: 你的帳號已被鎖定。
not_found_in_database: 不正確的%{authentication_keys}或密碼。 not_found_in_database: 不正確的%{authentication_keys}或密碼。
omniauth_user_creation_failure: 為此身份建立帳號時出錯。
pending: 你的帳號仍在審核中 pending: 你的帳號仍在審核中
timeout: 你的登入階段已經過期,請重新登入以繼續使用。 timeout: 你的登入階段已經過期,請重新登入以繼續使用。
unauthenticated: 你必須先登入或登記,以繼續使用。 unauthenticated: 你必須先登入或登記,以繼續使用。

View file

@ -12,6 +12,7 @@ zh-TW:
last_attempt: 帳號鎖定前,您還有最後一次嘗試機會。 last_attempt: 帳號鎖定前,您還有最後一次嘗試機會。
locked: 已鎖定您的帳號。 locked: 已鎖定您的帳號。
not_found_in_database: 無效的 %{authentication_keys} 或密碼。 not_found_in_database: 無效的 %{authentication_keys} 或密碼。
omniauth_user_creation_failure: 以此身分新增帳號時發生錯誤。
pending: 您的帳號仍在審核中。 pending: 您的帳號仍在審核中。
timeout: 登入階段逾時。請重新登入以繼續。 timeout: 登入階段逾時。請重新登入以繼續。
unauthenticated: 您必須先登入或註冊才能繼續使用。 unauthenticated: 您必須先登入或註冊才能繼續使用。

View file

@ -36,7 +36,7 @@ kab:
application: Asnas application: Asnas
callback_url: URL n tririt n wawal callback_url: URL n tririt n wawal
delete: Kkes delete: Kkes
empty: Ulac γur-ek·em isnasen. empty: Ulac ɣur-k·m isnasen.
name: Isem name: Isem
new: Asnas amaynut new: Asnas amaynut
show: Ẓer show: Ẓer
@ -57,7 +57,7 @@ kab:
new: new:
title: Tlaq tsiregt title: Tlaq tsiregt
show: show:
title: Nγel tangalt n wurag sakkin senteḍ-itt deg usnas. title: Nɣel tangalt n wurag sakkin senteḍ-itt deg usnas.
authorized_applications: authorized_applications:
buttons: buttons:
revoke: Ḥwi revoke: Ḥwi
@ -113,13 +113,13 @@ kab:
read:notifications: ẓer tilγa-ik read:notifications: ẓer tilγa-ik
read:reports: ẓer ineqqisen-ik·im read:reports: ẓer ineqqisen-ik·im
read:search: anadi deg umkan-ik·im read:search: anadi deg umkan-ik·im
read:statuses: ẓer meṛṛa tisuffaγ read:statuses: ẓer meṛṛa tisuffaɣ
write: beddel meṛṛa isefka n umiḍan-ik write: beddel meṛṛa isefka n umiḍan-ik
write:accounts: ẓreg amaγnu-ik write:accounts: ẓreg amaγnu-ik
write:blocks: seḥbes imiḍanen d tγula write:blocks: seḥbes imiḍanen d tγula
write:bookmarks: ad yernu tisuffγin γer ticraḍ write:bookmarks: ad yernu tisuffaɣ ɣer ticraḍ
write:filters: rnu-d imsizedgen write:filters: rnu-d imsizedgen
write:follows: ḍfeṛ imdanen write:follows: ḍfeṛ imdanen
write:lists: ad yesnulfu tibdarin write:lists: ad yesnulfu tibdarin
write:media: ad yessali ifayluyen n teγwalt write:media: ad yessali ifuyla n umidya
write:notifications: sfeḍ tilɣa-k·m write:notifications: sfeḍ tilɣa-k·m

View file

@ -1793,6 +1793,12 @@ ie:
extra: It es ja pret a descargar! extra: It es ja pret a descargar!
subject: Tui archive es pret por descargar subject: Tui archive es pret por descargar
title: Descargar archive title: Descargar archive
failed_2fa:
details: 'Vi li detallies del prova de intrar:'
explanation: Alqui provat accesser tui conto ma usat un ínvalid duesim factor de autentication.
further_actions_html: Si it ne esset tu, noi recomanda que tu strax %{action} nam li conto posse esser compromisset.
subject: Falliment de autentication de duesim factor
title: Fallit autentication de duesim factor
suspicious_sign_in: suspicious_sign_in:
change_password: changear tui passa-parol change_password: changear tui passa-parol
details: 'Vi li detallies del apertion de session:' details: 'Vi li detallies del apertion de session:'

View file

@ -5,7 +5,7 @@ kab:
contact_missing: Ur yettusbadu ara contact_missing: Ur yettusbadu ara
contact_unavailable: Wlac contact_unavailable: Wlac
hosted_on: Maṣṭudun yersen deg %{domain} hosted_on: Maṣṭudun yersen deg %{domain}
title: Γef title: Ɣef
accounts: accounts:
follow: Ḍfeṛ follow: Ḍfeṛ
followers: followers:
@ -15,9 +15,9 @@ kab:
last_active: armud aneggaru last_active: armud aneggaru
nothing_here: Ulac kra da! nothing_here: Ulac kra da!
posts: posts:
one: Tajewwiqt one: Tasuffeɣt
other: Tijewwiqin other: Tisuffaɣ
posts_tab_heading: Tijewwiqin posts_tab_heading: Tisuffaɣ
admin: admin:
account_actions: account_actions:
action: Eg tigawt action: Eg tigawt
@ -47,7 +47,7 @@ kab:
disable_two_factor_authentication: Gdel 2FA disable_two_factor_authentication: Gdel 2FA
disabled: Yensa disabled: Yensa
display_name: Isem ara d-yettwaskanen display_name: Isem ara d-yettwaskanen
domain: Taγult domain: Taɣult
edit: Ẓreg edit: Ẓreg
email: Imayl email: Imayl
email_status: Addad n imayl email_status: Addad n imayl
@ -111,7 +111,7 @@ kab:
targeted_reports: Yettwazen uneqqis sɣur wiyaḍ targeted_reports: Yettwazen uneqqis sɣur wiyaḍ
silence: Sgugem silence: Sgugem
silenced: Yettwasgugem silenced: Yettwasgugem
statuses: Tisuffɣin statuses: Tisuffaɣ
subscribe: Jerred subscribe: Jerred
suspended: Yeḥbes suspended: Yeḥbes
title: Imiḍanen title: Imiḍanen
@ -203,22 +203,22 @@ kab:
announcements: announcements:
destroyed_msg: Tamselɣut tettwakkes akken iwata! destroyed_msg: Tamselɣut tettwakkes akken iwata!
edit: edit:
title: Ẓreg ulγu title: Ẓreg ulɣu
empty: Ulac kra n ulγuyen. empty: Ulac kra n yilɣa yettwafen.
live: Srid live: Srid
new: new:
create: Rnu-d ulγu create: Snlufu-d ulɣu
title: Ulγu amaynut title: Ulɣu amaynut
publish: Sufeɣ publish: Sufeɣ
published_msg: Tamselɣut tettwasufeɣ-d akken iwata! published_msg: Tamselɣut tettwasufeɣ-d akken iwata!
scheduled_for: Yettusɣiwsen i %{time} scheduled_for: Yettusɣiwsen i %{time}
scheduled_msg: Tamselɣut tettusɣiwes i usufeɣ! scheduled_msg: Tamselɣut tettusɣiwes i usufeɣ!
title: Ulγuyen title: Ilɣa
custom_emojis: custom_emojis:
assign_category: Efk taggayt assign_category: Efk taggayt
by_domain: Taγult by_domain: Taɣult
copied_msg: Takna tadigant n imuji yettwarna-d mebla ugur copied_msg: Takna tadigant n imuji yettwarna-d mebla ugur
copy: Nγel copy: Nɣel
create_new_category: Rnu-d taggayt tamaynut create_new_category: Rnu-d taggayt tamaynut
created_msg: Imuji yettwarna-d mebla ugur! created_msg: Imuji yettwarna-d mebla ugur!
delete: Kkes delete: Kkes
@ -229,7 +229,7 @@ kab:
enable: Rmed enable: Rmed
enabled: Yermed enabled: Yermed
enabled_msg: Imuji yermed mebla ugur enabled_msg: Imuji yermed mebla ugur
list: Umuγ list: Tabdart
new: new:
title: Timerna n imuji udmawan amaynut title: Timerna n imuji udmawan amaynut
overwrite: Semselsi overwrite: Semselsi
@ -256,7 +256,7 @@ kab:
add_new: Rni iḥder amaynut n taɣult add_new: Rni iḥder amaynut n taɣult
confirm_suspension: confirm_suspension:
cancel: Sefsex cancel: Sefsex
domain: Taγult domain: Taɣult
export: Sifeḍ export: Sifeḍ
import: Kter import: Kter
new: new:
@ -274,9 +274,9 @@ kab:
email_domain_blocks: email_domain_blocks:
add_new: Rnu amaynut add_new: Rnu amaynut
delete: Kkes delete: Kkes
domain: Taγult domain: Taɣult
new: new:
create: Rnu taγult create: Rnu taɣult
title: Timerna n taɣult tamaynut n imayl ɣer tebdart taberkant title: Timerna n taɣult tamaynut n imayl ɣer tebdart taberkant
title: Tabdart taberkant n imayl title: Tabdart taberkant n imayl
follow_recommendations: follow_recommendations:
@ -286,8 +286,8 @@ kab:
instances: instances:
back_to_all: Akk back_to_all: Akk
back_to_limited: Ɣur-s talast back_to_limited: Ɣur-s talast
back_to_warning: Γur-wat back_to_warning: Ɣur-wat
by_domain: Taγult by_domain: Taɣult
content_policies: content_policies:
policy: Tasertit policy: Tasertit
delivery: delivery:
@ -306,7 +306,7 @@ kab:
private_comment: Awennit uslig private_comment: Awennit uslig
public_comment: Awennit azayez public_comment: Awennit azayez
title: Tamatut title: Tamatut
total_blocked_by_us: Ttwasḥebsen sγur-neγ total_blocked_by_us: Ttwasḥebsen sɣur-neɣ
total_followed_by_them: Ṭtafaṛen-t total_followed_by_them: Ṭtafaṛen-t
total_followed_by_us: Neṭṭafaṛ-it total_followed_by_us: Neṭṭafaṛ-it
total_reported: Ineqqisen fell-asen total_reported: Ineqqisen fell-asen
@ -354,12 +354,15 @@ kab:
other: "%{count} n timawin" other: "%{count} n timawin"
action_taken_by: Tigawt yettwaṭṭfen sɣur action_taken_by: Tigawt yettwaṭṭfen sɣur
are_you_sure: Tetḥaq-eḍ? are_you_sure: Tetḥaq-eḍ?
cancel: Sefsex
category: Taggayt category: Taggayt
comment: comment:
none: Ula yiwen none: Ula yiwen
confirm: Sentem confirm: Sentem
delete_and_resolve: Kkes tisuffaɣ
mark_as_resolved: Creḍ-it yefra mark_as_resolved: Creḍ-it yefra
mark_as_unresolved: Creḍ-it ur yefra ara mark_as_unresolved: Creḍ-it ur yefra ara
no_one_assigned: Ula yiwen
notes: notes:
create: Rnu tazmilt create: Rnu tazmilt
create_and_resolve: Fru s tamawt create_and_resolve: Fru s tamawt
@ -390,16 +393,16 @@ kab:
title: Ilugan n uqeddac title: Ilugan n uqeddac
settings: settings:
about: about:
title: Γef title: Ɣef
appearance: appearance:
title: Udem title: Udem
discovery: discovery:
profile_directory: Akaram n imaγnuten profile_directory: Akaram n imaɣnuten
trends: Ayen mucaɛen trends: Ayen mucaɛen
domain_blocks: domain_blocks:
all: I medden akk all: I medden akk
disabled: Γef ula yiwen disabled: Ɣef ula yiwen
users: Γef yimseqdacen idiganen i yeqqnen users: Ɣef yimseqdacen idiganen i yeqqnen
registrations: registrations:
title: Ajerred title: Ajerred
registrations_mode: registrations_mode:
@ -408,19 +411,26 @@ kab:
open: Zemren akk ad jerden open: Zemren akk ad jerden
site_uploads: site_uploads:
delete: Kkes afaylu yulin delete: Kkes afaylu yulin
software_updates:
documentation_link: Issin ugar
statuses: statuses:
application: Asnas application: Asnas
back_to_account: Tuγalin γer usebter n umiḍan back_to_account: Tuɣalin ɣer usebter n umiḍan
deleted: Yettwakkes deleted: Yettwakkes
favourites: Imenyafen favourites: Imenyafen
language: Tutlayt language: Tutlayt
media: media:
title: Taγwalt title: Amidya
title: Tisuffiγin n umiḍan title: Tisuffaɣ n umiḍan
with_media: S taγwalt trending: Ayen mucaɛen
visibility: Abani
with_media: S umidya
title: Tadbelt title: Tadbelt
trends: trends:
allow: Sireg allow: Sireg
statuses:
title: Tisuffaɣ mucaɛen
trending: Ayen mucaɛen
warning_presets: warning_presets:
add_new: Rnu amaynut add_new: Rnu amaynut
delete: Kkes delete: Kkes
@ -431,7 +441,11 @@ kab:
new_report: new_report:
body: "%{reporter} yettwazen ɣef %{target}" body: "%{reporter} yettwazen ɣef %{target}"
subject: Aneqqis amaynut i %{instance} (#%{id}) subject: Aneqqis amaynut i %{instance} (#%{id})
new_trends:
new_trending_statuses:
title: Tisuffaɣ mucaɛen
appearance: appearance:
advanced_web_interface: Agrudem n web leqqayen
discovery: Asnirem discovery: Asnirem
localization: localization:
guide_link: https://crowdin.com/project/mastodon guide_link: https://crowdin.com/project/mastodon
@ -448,6 +462,8 @@ kab:
your_token: Ajiṭun-ik·im n unekcum your_token: Ajiṭun-ik·im n unekcum
auth: auth:
apply_for_account: Suter amiḍan apply_for_account: Suter amiḍan
confirmations:
welcome_title: Ansuf yessek·em, %{name}!
delete_account: Kkes amiḍan delete_account: Kkes amiḍan
description: description:
prefix_invited_by_user: "@%{name} inced-ik·ikem ad ternuḍ ɣer uqeddac-a n Mastodon!" prefix_invited_by_user: "@%{name} inced-ik·ikem ad ternuḍ ɣer uqeddac-a n Mastodon!"
@ -455,9 +471,11 @@ kab:
forgot_password: Tettud awal-ik uffir? forgot_password: Tettud awal-ik uffir?
log_in_with: Qqen s log_in_with: Qqen s
login: Qqen login: Qqen
logout: Ffeγ logout: Ffeɣ
migrate_account: Gujj γer umiḍan nniḍen migrate_account: Gujj ɣer umiḍan nniḍen
or_log_in_with: Neγ eqqen s or_log_in_with: Neɣ eqqen s
progress:
confirm: Sentem imayl
providers: providers:
cas: CAS cas: CAS
saml: SAML saml: SAML
@ -466,8 +484,11 @@ kab:
reset_password: Wennez awal uffir reset_password: Wennez awal uffir
rules: rules:
back: Tuɣalin back: Tuɣalin
security: Taγellist security: Taɣellist
set_new_password: Egr-d awal uffir amaynut set_new_password: Egr-d awal uffir amaynut
sign_in:
preamble_html: Kcem ar <strong>%{domain}</strong> s inekcam-inek n tuqqna. Ma yella yezga-d umiḍan-ik deg uqeddac-nniḍen, ur tezmireḍ ara ad tkecmeḍ sya.
title: Akeččum ɣer %{domain}
status: status:
account_status: Addad n umiḍan account_status: Addad n umiḍan
use_security_key: Seqdec tasarut n teɣlist use_security_key: Seqdec tasarut n teɣlist
@ -498,16 +519,21 @@ kab:
warning: warning:
username_available: Isem-ik·im n useqdac ad yuɣal yella i tikkelt-nniḍen username_available: Isem-ik·im n useqdac ad yuɣal yella i tikkelt-nniḍen
username_unavailable: Isem-ik·im n useqdac ad yeqqim ulac-it username_unavailable: Isem-ik·im n useqdac ad yeqqim ulac-it
disputes:
strikes:
status: 'Tasuffeɣt #%{id}'
title_actions:
none: Ɣur-wat
errors: errors:
'500': '500':
title: Asebter-ayi d arameγtu title: Asebter-ayi d arameɣtu
existing_username_validator: existing_username_validator:
not_found_multiple: ur yezmir ara ad yaf %{usernames} not_found_multiple: ur yezmir ara ad yaf %{usernames}
exports: exports:
archive_takeout: archive_takeout:
date: Azemz date: Azemz
download: Sider-d aḥraz-ik·im download: Sider-d aḥraz-ik·im
size: Teγzi size: Teɣzi
bookmarks: Ticraḍ bookmarks: Ticraḍ
csv: CSV csv: CSV
lists: Tibdarin lists: Tibdarin
@ -516,8 +542,8 @@ kab:
add_new: Rnu amaynut add_new: Rnu amaynut
filters: filters:
contexts: contexts:
account: Imuγna account: Imuɣna
notifications: Tilγa notifications: Ilɣa
thread: Idiwenniyen thread: Idiwenniyen
edit: edit:
title: Ẓreg amzizdig title: Ẓreg amzizdig
@ -534,8 +560,10 @@ kab:
remove: Kkes seg umsizdeg remove: Kkes seg umsizdeg
generic: generic:
all: Akk all: Akk
cancel: Sefsex
changes_saved_msg: Ttwaskelsen ibelliden-ik·im akken ilaq! changes_saved_msg: Ttwaskelsen ibelliden-ik·im akken ilaq!
copy: Nγel confirm: Sentem
copy: Nɣel
delete: Kkes delete: Kkes
order_by: Sizwer s order_by: Sizwer s
save_changes: Sekles ibeddilen save_changes: Sekles ibeddilen
@ -575,7 +603,7 @@ kab:
sign_in_token: tangalt n tɣellist n tansa imayl sign_in_token: tangalt n tɣellist n tansa imayl
webauthn: tisura n tɣellist webauthn: tisura n tɣellist
migrations: migrations:
acct: Ibeddel γer acct: Ibeddel ɣer
incoming_migrations: Tusiḍ-d seg umiḍan nniḍen incoming_migrations: Tusiḍ-d seg umiḍan nniḍen
proceed_with_move: Awid imeḍfaṛen-ik proceed_with_move: Awid imeḍfaṛen-ik
moderation: moderation:
@ -597,7 +625,7 @@ kab:
reblog: reblog:
subject: "%{name} yesselha addad-ik·im" subject: "%{name} yesselha addad-ik·im"
notifications: notifications:
other_settings: Iγewwaṛen nniḍen n tilγa other_settings: Iɣewwaṛen nniḍen n yilɣa
number: number:
human: human:
decimal_units: decimal_units:
@ -611,11 +639,13 @@ kab:
setup: Sbadu setup: Sbadu
pagination: pagination:
newer: Amaynut newer: Amaynut
next: Γer zdat next: Ɣer zdat
older: Aqbuṛ older: Aqbuṛ
prev: Win iɛeddan prev: Win iɛeddan
preferences: preferences:
other: Wiyaḍ other: Wiyaḍ
privacy:
privacy: Tabaḍnit
privacy_policy: privacy_policy:
title: Tasertit tabaḍnit title: Tasertit tabaḍnit
relationships: relationships:
@ -634,6 +664,7 @@ kab:
browser: Iminig browser: Iminig
browsers: browsers:
alipay: Alipay alipay: Alipay
blackberry: BlackBerry
chrome: Chrome chrome: Chrome
edge: Microsoft Edge edge: Microsoft Edge
electron: Electron electron: Electron
@ -648,37 +679,41 @@ kab:
qq: Iminig QQ qq: Iminig QQ
safari: Safari safari: Safari
weibo: Weibo weibo: Weibo
current_session: Tiγimit tamirant current_session: Tiɣimit tamirant
date: Azemz
description: "%{browser} s %{platform}" description: "%{browser} s %{platform}"
ip: IP ip: IP
platforms: platforms:
adobe_air: Adobe Air adobe_air: Adobe Air
android: Android android: Android
blackberry: BlackBerry
chrome_os: ChromeOS
firefox_os: Firefox OS firefox_os: Firefox OS
ios: iOS ios: iOS
kai_os: KaiOS
linux: Linux linux: Linux
mac: macOS mac: macOS
windows: Windows windows: Windows
windows_mobile: Windows Mobile windows_mobile: Windows Mobile
windows_phone: Tiliγri Windows Phone windows_phone: Tiliɣri Windows Phone
revoke: Ḥwi revoke: Ḥwi
title: Tiɣimiyin title: Tiɣimiyin
settings: settings:
account: Amiḍan account: Amiḍan
account_settings: Iγewwaṛen n umiḍan account_settings: Iɣewwaṛen n umiḍan
appearance: Udem appearance: Udem
authorized_apps: Isnasen yettussirgen authorized_apps: Isnasen yettussirgen
back: Uγal γer Maṣṭudun back: Uɣal ɣer Maṣṭudun
delete: Tukksa n umiḍan delete: Tukksa n umiḍan
development: Taneflit development: Taneflit
edit_profile: Ẓreg amaγnu edit_profile: Ẓreg amaɣnu
export: Taktert n yisefka export: Taktert n yisefka
import: Kter import: Kter
import_and_export: Taktert d usifeḍ import_and_export: Taktert d usifeḍ
migrate: Tunigin n umiḍan migrate: Tunigin n umiḍan
notifications: Tilγa notifications: Ilɣa
preferences: Imenyafen preferences: Imenyafen
profile: Ameγnu profile: Ameɣnu
relationships: Imeḍfaṛen akked wid i teṭṭafaṛeḍ relationships: Imeḍfaṛen akked wid i teṭṭafaṛeḍ
statuses_cleanup: Tukksa tawurmant n tsuffaɣ statuses_cleanup: Tukksa tawurmant n tsuffaɣ
two_factor_authentication: Asesteb s snat n tarrayin two_factor_authentication: Asesteb s snat n tarrayin
@ -745,22 +780,25 @@ kab:
otp: Asnas n usesteb otp: Asnas n usesteb
webauthn: Tisura n teɣlist webauthn: Tisura n teɣlist
user_mailer: user_mailer:
appeal_approved:
action: Iɣewwaṛen n umiḍan
warning: warning:
categories: categories:
spam: Aspam spam: Aspam
title: title:
disable: Amiḍan i igersen disable: Amiḍan i igersen
none: Γur-wat none: Ɣur-wat
silence: Amiḍan yesɛa talast silence: Amiḍan yesɛa talast
suspend: Amiḍan yettwaḥbas suspend: Amiḍan yettwaḥbas
welcome: welcome:
final_action: Bdu asuffeɣ final_action: Bdu asuffeɣ
full_handle: Tansa umiḍan-ik takemmalit full_handle: Tansa umiḍan-ik takemmalit
subject: Ansuf γer Maṣṭudun subject: Ansuf ɣer Maṣṭudun
title: Ansuf yessek·em, %{name}! title: Ansuf yessek·em, %{name}!
users: users:
signed_in_as: 'Teqqneḍ amzun d:' signed_in_as: 'Teqqneḍ amzun d:'
verification: verification:
here_is_how: Ha-t-a amek
verification: Asenqed verification: Asenqed
webauthn_credentials: webauthn_credentials:
add: Rnu tasarut n teɣlist tamaynut add: Rnu tasarut n teɣlist tamaynut

View file

@ -12,7 +12,7 @@ kab:
defaults: defaults:
autofollow: Imdanen ara ijerrden s usnebgi-inek, ad k-ḍefṛen s wudem awurman autofollow: Imdanen ara ijerrden s usnebgi-inek, ad k-ḍefṛen s wudem awurman
email: Ad n-teṭṭfeḍ imayl i usentem email: Ad n-teṭṭfeḍ imayl i usentem
irreversible: Tijewwaqin i tessazedgeḍ ad ttwakksent i lebda, ula ma tekkseḍ imsizdeg-nni ar zdat irreversible: Tisuffaɣ i tessazedgeḍ ad ttwakksent i lebda, ula ma tekkseḍ imsizdeg-nni ar zdat
locale: Tutlayt n ugrudem, imaylen d tilγa locale: Tutlayt n ugrudem, imaylen d tilγa
password: Seqdec ma drus 8 n yisekkilen password: Seqdec ma drus 8 n yisekkilen
setting_display_media_default: Ffer teywalt yettwacreḍ d tanafrit setting_display_media_default: Ffer teywalt yettwacreḍ d tanafrit
@ -69,12 +69,12 @@ kab:
setting_display_media_show_all: Ssken kullec setting_display_media_show_all: Ssken kullec
setting_hide_network: Ffer azetta-k·m setting_hide_network: Ffer azetta-k·m
setting_theme: Asental n wesmel setting_theme: Asental n wesmel
setting_use_pending_items: Askar aleγwayan setting_use_pending_items: Askar aleɣwayan
sign_in_token_attempt: Tangalt n tɣellist sign_in_token_attempt: Tangalt n tɣellist
title: Azwel title: Azwel
type: Anaw n uktar type: Anaw n uktar
username: Isem n useqdac username: Isem n useqdac
username_or_email: Isem n useqdac neγ imal username_or_email: Isem n useqdac neɣ imal
whole_word: Awal akk whole_word: Awal akk
featured_tag: featured_tag:
name: Ahacṭag name: Ahacṭag
@ -84,7 +84,7 @@ kab:
invite: invite:
comment: Awennit comment: Awennit
invite_request: invite_request:
text: Acimi tebγiḍ ad ternuḍ iman-ik? text: Acimi tebɣiḍ ad ternuḍ iman-ik?
ip_block: ip_block:
comment: Awennit comment: Awennit
ip: IP ip: IP

View file

@ -188,7 +188,7 @@ sq:
create_user_role: Krijoni Rol create_user_role: Krijoni Rol
demote_user: Zhgradoje Përdoruesin demote_user: Zhgradoje Përdoruesin
destroy_announcement: Fshije Lajmërimin destroy_announcement: Fshije Lajmërimin
destroy_canonical_email_block: Fshi Bllokim El-esh destroy_canonical_email_block: Fshi Bllokim Email-esh
destroy_custom_emoji: Fshi Emotikon Vetjak destroy_custom_emoji: Fshi Emotikon Vetjak
destroy_domain_allow: Fshi Lejim Përkatësie destroy_domain_allow: Fshi Lejim Përkatësie
destroy_domain_block: Fshi Bllokim Përkatësie destroy_domain_block: Fshi Bllokim Përkatësie
@ -283,7 +283,7 @@ sq:
unsuspend_account_html: "%{name} hoqi pezullimin për llogarinë e %{target}" unsuspend_account_html: "%{name} hoqi pezullimin për llogarinë e %{target}"
update_announcement_html: "%{name} përditësoi lajmërimin %{target}" update_announcement_html: "%{name} përditësoi lajmërimin %{target}"
update_custom_emoji_html: "%{name} përditësoi emoxhin %{target}" update_custom_emoji_html: "%{name} përditësoi emoxhin %{target}"
update_domain_block_html: "%{name} përditësoi bllokimin e përkatësish për %{target}" update_domain_block_html: "%{name} përditësoi bllokim përkatësish për %{target}"
update_ip_block_html: "%{name} ndryshoi rregull për IP-në %{target}" update_ip_block_html: "%{name} ndryshoi rregull për IP-në %{target}"
update_status_html: "%{name} përditësoi gjendjen me %{target}" update_status_html: "%{name} përditësoi gjendjen me %{target}"
update_user_role_html: "%{name} ndryshoi rolin për %{target}" update_user_role_html: "%{name} ndryshoi rolin për %{target}"

View file

@ -452,7 +452,7 @@ th:
title: นำเข้าการปิดกั้นโดเมน title: นำเข้าการปิดกั้นโดเมน
no_file: ไม่ได้เลือกไฟล์ no_file: ไม่ได้เลือกไฟล์
follow_recommendations: follow_recommendations:
description_html: "<strong>คำแนะนำการติดตามช่วยให้ผู้ใช้ใหม่ค้นหาเนื้อหาที่น่าสนใจได้อย่างรวดเร็ว</strong> เมื่อผู้ใช้ไม่ได้โต้ตอบกับผู้อื่นมากพอที่จะสร้างคำแนะนำการติดตามส่วนบุคคล จะแนะนำบัญชีเหล่านี้แทน จะคำนวณคำแนะนำใหม่เป็นประจำทุกวันจากบัญชีต่าง ๆ ที่มีการมีส่วนร่วมล่าสุดสูงสุดและจำนวนผู้ติดตามในเซิร์ฟเวอร์สูงสุดสำหรับภาษาที่กำหนด" description_html: "<strong>คำแนะนำการติดตามช่วยให้ผู้ใช้ใหม่ค้นหาเนื้อหาที่น่าสนใจได้อย่างรวดเร็ว</strong> เมื่อผู้ใช้ไม่ได้โต้ตอบกับผู้อื่นมากพอที่จะสร้างคำแนะนำการติดตามเฉพาะบุคคล จะแนะนำบัญชีเหล่านี้แทน จะคำนวณคำแนะนำใหม่เป็นประจำทุกวันจากบัญชีต่าง ๆ ที่มีการมีส่วนร่วมล่าสุดสูงสุดและจำนวนผู้ติดตามในเซิร์ฟเวอร์สูงสุดสำหรับภาษาที่กำหนด"
language: สำหรับภาษา language: สำหรับภาษา
status: สถานะ status: สถานะ
suppress: ระงับคำแนะนำการติดตาม suppress: ระงับคำแนะนำการติดตาม

View file

@ -56,7 +56,7 @@ services:
web: web:
build: . build: .
image: ghcr.io/mastodon/mastodon:v4.2.1 image: ghcr.io/mastodon/mastodon:v4.2.7
restart: always restart: always
env_file: .env.production env_file: .env.production
command: bundle exec puma -C config/puma.rb command: bundle exec puma -C config/puma.rb
@ -77,7 +77,7 @@ services:
streaming: streaming:
build: . build: .
image: ghcr.io/mastodon/mastodon:v4.2.1 image: ghcr.io/mastodon/mastodon:v4.2.7
restart: always restart: always
env_file: .env.production env_file: .env.production
command: node ./streaming command: node ./streaming
@ -95,7 +95,7 @@ services:
sidekiq: sidekiq:
build: . build: .
image: ghcr.io/mastodon/mastodon:v4.2.1 image: ghcr.io/mastodon/mastodon:v4.2.7
restart: always restart: always
env_file: .env.production env_file: .env.production
command: bundle exec sidekiq command: bundle exec sidekiq

View file

@ -31,7 +31,7 @@ module Mastodon
end end
def default_prerelease def default_prerelease
'alpha.2' 'alpha.3'
end end
def prerelease def prerelease

View file

@ -19,12 +19,10 @@ describe 'email confirmation flow when captcha is enabled' do
# It presents the user with a captcha form # It presents the user with a captcha form
expect(page).to have_title(I18n.t('auth.captcha_confirmation.title')) expect(page).to have_title(I18n.t('auth.captcha_confirmation.title'))
# It does not confirm the user just yet
expect(user.reload.confirmed?).to be false
# It redirects to app and confirms user # It redirects to app and confirms user
click_on I18n.t('challenge.confirm') expect { click_on I18n.t('challenge.confirm') }
expect(user.reload.confirmed?).to be true .to change { user.reload.confirmed? }.from(false).to(true)
expect(page).to have_current_path(/\A#{client_app.confirmation_redirect_uri}/, url: true) expect(page).to have_current_path(/\A#{client_app.confirmation_redirect_uri}/, url: true)
# Browsers will generally reload the original page upon redirection # Browsers will generally reload the original page upon redirection
@ -32,8 +30,9 @@ describe 'email confirmation flow when captcha is enabled' do
visit "/auth/confirmation?confirmation_token=#{user.confirmation_token}&redirect_to_app=true" visit "/auth/confirmation?confirmation_token=#{user.confirmation_token}&redirect_to_app=true"
# It presents a page with a link to the app callback # It presents a page with a link to the app callback
expect(page).to have_content(I18n.t('auth.confirmations.registration_complete', domain: 'cb6e6126.ngrok.io')) expect(page)
expect(page).to have_link(I18n.t('auth.confirmations.clicking_this_link'), href: client_app.confirmation_redirect_uri) .to have_content(I18n.t('auth.confirmations.registration_complete', domain: 'cb6e6126.ngrok.io'))
.and have_link(I18n.t('auth.confirmations.clicking_this_link'), href: client_app.confirmation_redirect_uri)
end end
end end

View file

@ -56,15 +56,15 @@ describe JsonLdHelper do
describe '#fetch_resource' do describe '#fetch_resource' do
context 'when the second argument is false' do context 'when the second argument is false' do
it 'returns resource even if the retrieved ID and the given URI does not match' do it 'returns resource even if the retrieved ID and the given URI does not match' do
stub_request(:get, 'https://bob.test/').to_return body: '{"id": "https://alice.test/"}' stub_request(:get, 'https://bob.test/').to_return(body: '{"id": "https://alice.test/"}', headers: { 'Content-Type': 'application/activity+json' })
stub_request(:get, 'https://alice.test/').to_return body: '{"id": "https://alice.test/"}' stub_request(:get, 'https://alice.test/').to_return(body: '{"id": "https://alice.test/"}', headers: { 'Content-Type': 'application/activity+json' })
expect(fetch_resource('https://bob.test/', false)).to eq({ 'id' => 'https://alice.test/' }) expect(fetch_resource('https://bob.test/', false)).to eq({ 'id' => 'https://alice.test/' })
end end
it 'returns nil if the object identified by the given URI and the object identified by the retrieved ID does not match' do it 'returns nil if the object identified by the given URI and the object identified by the retrieved ID does not match' do
stub_request(:get, 'https://mallory.test/').to_return body: '{"id": "https://marvin.test/"}' stub_request(:get, 'https://mallory.test/').to_return(body: '{"id": "https://marvin.test/"}', headers: { 'Content-Type': 'application/activity+json' })
stub_request(:get, 'https://marvin.test/').to_return body: '{"id": "https://alice.test/"}' stub_request(:get, 'https://marvin.test/').to_return(body: '{"id": "https://alice.test/"}', headers: { 'Content-Type': 'application/activity+json' })
expect(fetch_resource('https://mallory.test/', false)).to be_nil expect(fetch_resource('https://mallory.test/', false)).to be_nil
end end
@ -72,7 +72,7 @@ describe JsonLdHelper do
context 'when the second argument is true' do context 'when the second argument is true' do
it 'returns nil if the retrieved ID and the given URI does not match' do it 'returns nil if the retrieved ID and the given URI does not match' do
stub_request(:get, 'https://mallory.test/').to_return body: '{"id": "https://alice.test/"}' stub_request(:get, 'https://mallory.test/').to_return(body: '{"id": "https://alice.test/"}', headers: { 'Content-Type': 'application/activity+json' })
expect(fetch_resource('https://mallory.test/', true)).to be_nil expect(fetch_resource('https://mallory.test/', true)).to be_nil
end end
end end
@ -80,12 +80,12 @@ describe JsonLdHelper do
describe '#fetch_resource_without_id_validation' do describe '#fetch_resource_without_id_validation' do
it 'returns nil if the status code is not 200' do it 'returns nil if the status code is not 200' do
stub_request(:get, 'https://host.test/').to_return status: 400, body: '{}' stub_request(:get, 'https://host.test/').to_return(status: 400, body: '{}', headers: { 'Content-Type': 'application/activity+json' })
expect(fetch_resource_without_id_validation('https://host.test/')).to be_nil expect(fetch_resource_without_id_validation('https://host.test/')).to be_nil
end end
it 'returns hash' do it 'returns hash' do
stub_request(:get, 'https://host.test/').to_return status: 200, body: '{}' stub_request(:get, 'https://host.test/').to_return(status: 200, body: '{}', headers: { 'Content-Type': 'application/activity+json' })
expect(fetch_resource_without_id_validation('https://host.test/')).to eq({}) expect(fetch_resource_without_id_validation('https://host.test/')).to eq({})
end end
end end

View file

@ -35,7 +35,7 @@ RSpec.describe ActivityPub::Activity::Announce do
context 'when sender is followed by a local account' do context 'when sender is followed by a local account' do
before do before do
Fabricate(:account).follow!(sender) Fabricate(:account).follow!(sender)
stub_request(:get, 'https://example.com/actor/hello-world').to_return(body: Oj.dump(unknown_object_json)) stub_request(:get, 'https://example.com/actor/hello-world').to_return(body: Oj.dump(unknown_object_json), headers: { 'Content-Type': 'application/activity+json' })
subject.perform subject.perform
end end
@ -120,7 +120,7 @@ RSpec.describe ActivityPub::Activity::Announce do
let(:object_json) { 'https://example.com/actor/hello-world' } let(:object_json) { 'https://example.com/actor/hello-world' }
before do before do
stub_request(:get, 'https://example.com/actor/hello-world').to_return(body: Oj.dump(unknown_object_json)) stub_request(:get, 'https://example.com/actor/hello-world').to_return(body: Oj.dump(unknown_object_json), headers: { 'Content-Type': 'application/activity+json' })
end end
context 'when the relay is enabled' do context 'when the relay is enabled' do

View file

@ -30,7 +30,7 @@ RSpec.describe ActivityPub::Activity::Create do
stub_request(:get, 'http://example.com/attachment.png').to_return(request_fixture('avatar.txt')) stub_request(:get, 'http://example.com/attachment.png').to_return(request_fixture('avatar.txt'))
stub_request(:get, 'http://example.com/emoji.png').to_return(body: attachment_fixture('emojo.png')) stub_request(:get, 'http://example.com/emoji.png').to_return(body: attachment_fixture('emojo.png'))
stub_request(:get, 'http://example.com/emojib.png').to_return(body: attachment_fixture('emojo.png'), headers: { 'Content-Type' => 'application/octet-stream' }) stub_request(:get, 'http://example.com/emojib.png').to_return(body: attachment_fixture('emojo.png'), headers: { 'Content-Type' => 'application/octet-stream' })
stub_request(:get, 'http://example.com/conversation').to_return(body: Oj.dump(conversation)) stub_request(:get, 'http://example.com/conversation').to_return(body: Oj.dump(conversation), headers: { 'Content-Type': 'application/activity+json' })
stub_request(:get, 'http://example.com/invalid-conversation').to_return(status: 404) stub_request(:get, 'http://example.com/invalid-conversation').to_return(status: 404)
end end
@ -1158,10 +1158,10 @@ RSpec.describe ActivityPub::Activity::Create do
end end
before do before do
stub_request(:get, 'https://foo.test').to_return(status: 200, body: Oj.dump(actor_json)) stub_request(:get, 'https://foo.test').to_return(status: 200, body: Oj.dump(actor_json), headers: { 'Content-Type': 'application/activity+json' })
stub_request(:get, 'https://foo.test/.well-known/webfinger?resource=acct:actor@foo.test').to_return(status: 200, body: Oj.dump(webfinger)) stub_request(:get, 'https://foo.test/.well-known/webfinger?resource=acct:actor@foo.test').to_return(status: 200, body: Oj.dump(webfinger), headers: { 'Content-Type': 'application/activity+json' })
stub_request(:post, 'https://foo.test/inbox').to_return(status: 200) stub_request(:post, 'https://foo.test/inbox').to_return(status: 200)
stub_request(:get, 'https://foo.test/.well-known/nodeinfo').to_return(status: 200) stub_request(:get, 'https://foo.test/.well-known/nodeinfo').to_return(status: 200, headers: { 'Content-Type': 'application/activity+json' })
subject.perform subject.perform
end end
@ -2145,12 +2145,15 @@ RSpec.describe ActivityPub::Activity::Create do
it 'creates an encrypted message' do it 'creates an encrypted message' do
encrypted_message = target_device.encrypted_messages.reload.first encrypted_message = target_device.encrypted_messages.reload.first
expect(encrypted_message).to_not be_nil expect(encrypted_message)
expect(encrypted_message.from_device_id).to eq '1234' .to be_present
expect(encrypted_message.from_account).to eq sender .and have_attributes(
expect(encrypted_message.type).to eq 1 from_device_id: eq('1234'),
expect(encrypted_message.body).to eq 'Foo' from_account: eq(sender),
expect(encrypted_message.digest).to eq 'Foo123' type: eq(1),
body: eq('Foo'),
digest: eq('Foo123')
)
end end
it 'creates a message franking' do it 'creates a message franking' do

View file

@ -64,8 +64,8 @@ RSpec.describe ActivityPub::Activity::Like do
before do before do
stub_request(:get, 'http://example.com/emoji.png').to_return(body: attachment_fixture('emojo.png')) stub_request(:get, 'http://example.com/emoji.png').to_return(body: attachment_fixture('emojo.png'))
stub_request(:get, 'http://foo.bar/emoji2.png').to_return(body: attachment_fixture('emojo.png')) stub_request(:get, 'http://foo.bar/emoji2.png').to_return(body: attachment_fixture('emojo.png'))
stub_request(:get, 'https://example.com/aaa').to_return(status: 200, body: Oj.dump(original_emoji)) stub_request(:get, 'https://example.com/aaa').to_return(status: 200, body: Oj.dump(original_emoji), headers: { 'Content-Type': 'application/activity+json' })
stub_request(:get, 'https://example.com/invalid').to_return(status: 200, body: Oj.dump(original_invalid_emoji)) stub_request(:get, 'https://example.com/invalid').to_return(status: 200, body: Oj.dump(original_invalid_emoji), headers: { 'Content-Type': 'application/activity+json' })
end end
let(:json) do let(:json) do

View file

@ -72,11 +72,11 @@ RSpec.describe ActivityPub::FetchFeaturedCollectionService, type: :service do
shared_examples 'sets pinned posts' do shared_examples 'sets pinned posts' do
before do before do
stub_request(:get, 'https://example.com/account/pinned/known').to_return(status: 200, body: Oj.dump(status_json_pinned_known)) stub_request(:get, 'https://example.com/account/pinned/known').to_return(status: 200, body: Oj.dump(status_json_pinned_known), headers: { 'Content-Type': 'application/activity+json' })
stub_request(:get, 'https://example.com/account/pinned/unknown-inlined').to_return(status: 200, body: Oj.dump(status_json_pinned_unknown_inlined)) stub_request(:get, 'https://example.com/account/pinned/unknown-inlined').to_return(status: 200, body: Oj.dump(status_json_pinned_unknown_inlined), headers: { 'Content-Type': 'application/activity+json' })
stub_request(:get, 'https://example.com/account/pinned/unknown-unreachable').to_return(status: 404) stub_request(:get, 'https://example.com/account/pinned/unknown-unreachable').to_return(status: 404)
stub_request(:get, 'https://example.com/account/pinned/unknown-reachable').to_return(status: 200, body: Oj.dump(status_json_pinned_unknown_reachable)) stub_request(:get, 'https://example.com/account/pinned/unknown-reachable').to_return(status: 200, body: Oj.dump(status_json_pinned_unknown_reachable), headers: { 'Content-Type': 'application/activity+json' })
stub_request(:get, 'https://example.com/account/collections/featured').to_return(status: 200, body: Oj.dump(featured_with_null)) stub_request(:get, 'https://example.com/account/collections/featured').to_return(status: 200, body: Oj.dump(featured_with_null), headers: { 'Content-Type': 'application/activity+json' })
subject.call(actor, note: true, hashtag: false) subject.call(actor, note: true, hashtag: false)
end end
@ -94,7 +94,7 @@ RSpec.describe ActivityPub::FetchFeaturedCollectionService, type: :service do
describe '#call' do describe '#call' do
context 'when the endpoint is a Collection' do context 'when the endpoint is a Collection' do
before do before do
stub_request(:get, actor.featured_collection_url).to_return(status: 200, body: Oj.dump(payload)) stub_request(:get, actor.featured_collection_url).to_return(status: 200, body: Oj.dump(payload), headers: { 'Content-Type': 'application/activity+json' })
end end
it_behaves_like 'sets pinned posts' it_behaves_like 'sets pinned posts'
@ -111,7 +111,7 @@ RSpec.describe ActivityPub::FetchFeaturedCollectionService, type: :service do
end end
before do before do
stub_request(:get, actor.featured_collection_url).to_return(status: 200, body: Oj.dump(payload)) stub_request(:get, actor.featured_collection_url).to_return(status: 200, body: Oj.dump(payload), headers: { 'Content-Type': 'application/activity+json' })
end end
it_behaves_like 'sets pinned posts' it_behaves_like 'sets pinned posts'
@ -120,7 +120,7 @@ RSpec.describe ActivityPub::FetchFeaturedCollectionService, type: :service do
let(:items) { 'https://example.com/account/pinned/unknown-reachable' } let(:items) { 'https://example.com/account/pinned/unknown-reachable' }
before do before do
stub_request(:get, 'https://example.com/account/pinned/unknown-reachable').to_return(status: 200, body: Oj.dump(status_json_pinned_unknown_reachable)) stub_request(:get, 'https://example.com/account/pinned/unknown-reachable').to_return(status: 200, body: Oj.dump(status_json_pinned_unknown_reachable), headers: { 'Content-Type': 'application/activity+json' })
subject.call(actor, note: true, hashtag: false) subject.call(actor, note: true, hashtag: false)
end end
@ -147,7 +147,7 @@ RSpec.describe ActivityPub::FetchFeaturedCollectionService, type: :service do
end end
before do before do
stub_request(:get, actor.featured_collection_url).to_return(status: 200, body: Oj.dump(payload)) stub_request(:get, actor.featured_collection_url).to_return(status: 200, body: Oj.dump(payload), headers: { 'Content-Type': 'application/activity+json' })
end end
it_behaves_like 'sets pinned posts' it_behaves_like 'sets pinned posts'
@ -156,7 +156,7 @@ RSpec.describe ActivityPub::FetchFeaturedCollectionService, type: :service do
let(:items) { 'https://example.com/account/pinned/unknown-reachable' } let(:items) { 'https://example.com/account/pinned/unknown-reachable' }
before do before do
stub_request(:get, 'https://example.com/account/pinned/unknown-reachable').to_return(status: 200, body: Oj.dump(status_json_pinned_unknown_reachable)) stub_request(:get, 'https://example.com/account/pinned/unknown-reachable').to_return(status: 200, body: Oj.dump(status_json_pinned_unknown_reachable), headers: { 'Content-Type': 'application/activity+json' })
subject.call(actor, note: true, hashtag: false) subject.call(actor, note: true, hashtag: false)
end end

View file

@ -38,7 +38,7 @@ RSpec.describe ActivityPub::FetchFeaturedTagsCollectionService, type: :service d
describe '#call' do describe '#call' do
context 'when the endpoint is a Collection' do context 'when the endpoint is a Collection' do
before do before do
stub_request(:get, collection_url).to_return(status: 200, body: Oj.dump(payload)) stub_request(:get, collection_url).to_return(status: 200, body: Oj.dump(payload), headers: { 'Content-Type': 'application/activity+json' })
end end
it_behaves_like 'sets featured tags' it_behaves_like 'sets featured tags'
@ -46,7 +46,7 @@ RSpec.describe ActivityPub::FetchFeaturedTagsCollectionService, type: :service d
context 'when the account already has featured tags' do context 'when the account already has featured tags' do
before do before do
stub_request(:get, collection_url).to_return(status: 200, body: Oj.dump(payload)) stub_request(:get, collection_url).to_return(status: 200, body: Oj.dump(payload), headers: { 'Content-Type': 'application/activity+json' })
actor.featured_tags.create!(name: 'FoO') actor.featured_tags.create!(name: 'FoO')
actor.featured_tags.create!(name: 'baz') actor.featured_tags.create!(name: 'baz')
@ -67,7 +67,7 @@ RSpec.describe ActivityPub::FetchFeaturedTagsCollectionService, type: :service d
end end
before do before do
stub_request(:get, collection_url).to_return(status: 200, body: Oj.dump(payload)) stub_request(:get, collection_url).to_return(status: 200, body: Oj.dump(payload), headers: { 'Content-Type': 'application/activity+json' })
end end
it_behaves_like 'sets featured tags' it_behaves_like 'sets featured tags'
@ -88,7 +88,7 @@ RSpec.describe ActivityPub::FetchFeaturedTagsCollectionService, type: :service d
end end
before do before do
stub_request(:get, collection_url).to_return(status: 200, body: Oj.dump(payload)) stub_request(:get, collection_url).to_return(status: 200, body: Oj.dump(payload), headers: { 'Content-Type': 'application/activity+json' })
end end
it_behaves_like 'sets featured tags' it_behaves_like 'sets featured tags'

View file

@ -54,7 +54,7 @@ RSpec.describe ActivityPub::FetchReferencesService, type: :service do
subject { described_class.new.call(status, collection_uri) } subject { described_class.new.call(status, collection_uri) }
before do before do
stub_request(:get, collection_uri).to_return(status: 200, body: Oj.dump(payload)) stub_request(:get, collection_uri).to_return(status: 200, body: Oj.dump(payload), headers: { 'Content-Type': 'application/activity+json' })
end end
it 'first 8 items are returned' do it 'first 8 items are returned' do
@ -83,7 +83,7 @@ RSpec.describe ActivityPub::FetchReferencesService, type: :service do
subject { described_class.new.call(status, collection_uri) } subject { described_class.new.call(status, collection_uri) }
before do before do
stub_request(:get, collection_uri).to_return(status: 200, body: Oj.dump(payload)) stub_request(:get, collection_uri).to_return(status: 200, body: Oj.dump(payload), headers: { 'Content-Type': 'application/activity+json' })
end end
it 'first 8 items are returned' do it 'first 8 items are returned' do
@ -116,7 +116,7 @@ RSpec.describe ActivityPub::FetchReferencesService, type: :service do
subject { described_class.new.call(status, collection_uri) } subject { described_class.new.call(status, collection_uri) }
before do before do
stub_request(:get, collection_uri).to_return(status: 200, body: Oj.dump(payload)) stub_request(:get, collection_uri).to_return(status: 200, body: Oj.dump(payload), headers: { 'Content-Type': 'application/activity+json' })
end end
it 'first 8 items are returned' do it 'first 8 items are returned' do

View file

@ -38,7 +38,7 @@ RSpec.describe ActivityPub::FetchRemoteAccountService, type: :service do
before do before do
actor[:inbox] = nil actor[:inbox] = nil
stub_request(:get, 'https://example.com/alice').to_return(body: Oj.dump(actor)) stub_request(:get, 'https://example.com/alice').to_return(body: Oj.dump(actor), headers: { 'Content-Type': 'application/activity+json' })
stub_request(:get, 'https://example.com/.well-known/webfinger?resource=acct:alice@example.com').to_return(body: Oj.dump(webfinger), headers: { 'Content-Type': 'application/jrd+json' }) stub_request(:get, 'https://example.com/.well-known/webfinger?resource=acct:alice@example.com').to_return(body: Oj.dump(webfinger), headers: { 'Content-Type': 'application/jrd+json' })
stub_request(:get, 'https://example.com/.well-known/nodeinfo').to_return(body: '{}') stub_request(:get, 'https://example.com/.well-known/nodeinfo').to_return(body: '{}')
end end
@ -55,7 +55,7 @@ RSpec.describe ActivityPub::FetchRemoteAccountService, type: :service do
let!(:webfinger) { { subject: 'acct:alice@example.com', links: [{ rel: 'self', href: 'https://example.com/alice' }] } } let!(:webfinger) { { subject: 'acct:alice@example.com', links: [{ rel: 'self', href: 'https://example.com/alice' }] } }
before do before do
stub_request(:get, 'https://example.com/alice').to_return(body: Oj.dump(actor)) stub_request(:get, 'https://example.com/alice').to_return(body: Oj.dump(actor), headers: { 'Content-Type': 'application/activity+json' })
stub_request(:get, 'https://example.com/.well-known/webfinger?resource=acct:alice@example.com').to_return(body: Oj.dump(webfinger), headers: { 'Content-Type': 'application/jrd+json' }) stub_request(:get, 'https://example.com/.well-known/webfinger?resource=acct:alice@example.com').to_return(body: Oj.dump(webfinger), headers: { 'Content-Type': 'application/jrd+json' })
stub_request(:get, 'https://example.com/.well-known/nodeinfo').to_return(body: '{}') stub_request(:get, 'https://example.com/.well-known/nodeinfo').to_return(body: '{}')
end end
@ -77,7 +77,7 @@ RSpec.describe ActivityPub::FetchRemoteAccountService, type: :service do
let!(:webfinger) { { subject: 'acct:alice@iscool.af', links: [{ rel: 'self', href: 'https://example.com/alice' }] } } let!(:webfinger) { { subject: 'acct:alice@iscool.af', links: [{ rel: 'self', href: 'https://example.com/alice' }] } }
before do before do
stub_request(:get, 'https://example.com/alice').to_return(body: Oj.dump(actor)) stub_request(:get, 'https://example.com/alice').to_return(body: Oj.dump(actor), headers: { 'Content-Type': 'application/activity+json' })
stub_request(:get, 'https://example.com/.well-known/webfinger?resource=acct:alice@example.com').to_return(body: Oj.dump(webfinger), headers: { 'Content-Type': 'application/jrd+json' }) stub_request(:get, 'https://example.com/.well-known/webfinger?resource=acct:alice@example.com').to_return(body: Oj.dump(webfinger), headers: { 'Content-Type': 'application/jrd+json' })
stub_request(:get, 'https://iscool.af/.well-known/webfinger?resource=acct:alice@iscool.af').to_return(body: Oj.dump(webfinger), headers: { 'Content-Type': 'application/jrd+json' }) stub_request(:get, 'https://iscool.af/.well-known/webfinger?resource=acct:alice@iscool.af').to_return(body: Oj.dump(webfinger), headers: { 'Content-Type': 'application/jrd+json' })
stub_request(:get, 'https://iscool.af/.well-known/nodeinfo').to_return(body: '{}') stub_request(:get, 'https://iscool.af/.well-known/nodeinfo').to_return(body: '{}')
@ -101,7 +101,7 @@ RSpec.describe ActivityPub::FetchRemoteAccountService, type: :service do
let!(:webfinger) { { subject: 'acct:alice@example.com', links: [{ rel: 'self', href: 'https://example.com/bob' }] } } let!(:webfinger) { { subject: 'acct:alice@example.com', links: [{ rel: 'self', href: 'https://example.com/bob' }] } }
before do before do
stub_request(:get, 'https://example.com/alice').to_return(body: Oj.dump(actor)) stub_request(:get, 'https://example.com/alice').to_return(body: Oj.dump(actor), headers: { 'Content-Type': 'application/activity+json' })
stub_request(:get, 'https://example.com/.well-known/webfinger?resource=acct:alice@example.com').to_return(body: Oj.dump(webfinger), headers: { 'Content-Type': 'application/jrd+json' }) stub_request(:get, 'https://example.com/.well-known/webfinger?resource=acct:alice@example.com').to_return(body: Oj.dump(webfinger), headers: { 'Content-Type': 'application/jrd+json' })
stub_request(:get, 'https://example.com/.well-known/nodeinfo').to_return(body: '{}') stub_request(:get, 'https://example.com/.well-known/nodeinfo').to_return(body: '{}')
end end
@ -118,7 +118,7 @@ RSpec.describe ActivityPub::FetchRemoteAccountService, type: :service do
let!(:webfinger) { { subject: 'acct:alice@iscool.af', links: [{ rel: 'self', href: 'https://example.com/bob' }] } } let!(:webfinger) { { subject: 'acct:alice@iscool.af', links: [{ rel: 'self', href: 'https://example.com/bob' }] } }
before do before do
stub_request(:get, 'https://example.com/alice').to_return(body: Oj.dump(actor)) stub_request(:get, 'https://example.com/alice').to_return(body: Oj.dump(actor), headers: { 'Content-Type': 'application/activity+json' })
stub_request(:get, 'https://example.com/.well-known/webfinger?resource=acct:alice@example.com').to_return(body: Oj.dump(webfinger), headers: { 'Content-Type': 'application/jrd+json' }) stub_request(:get, 'https://example.com/.well-known/webfinger?resource=acct:alice@example.com').to_return(body: Oj.dump(webfinger), headers: { 'Content-Type': 'application/jrd+json' })
stub_request(:get, 'https://iscool.af/.well-known/webfinger?resource=acct:alice@iscool.af').to_return(body: Oj.dump(webfinger), headers: { 'Content-Type': 'application/jrd+json' }) stub_request(:get, 'https://iscool.af/.well-known/webfinger?resource=acct:alice@iscool.af').to_return(body: Oj.dump(webfinger), headers: { 'Content-Type': 'application/jrd+json' })
stub_request(:get, 'https://iscool.af/.well-known/nodeinfo').to_return(body: '{}') stub_request(:get, 'https://iscool.af/.well-known/nodeinfo').to_return(body: '{}')

View file

@ -38,7 +38,7 @@ RSpec.describe ActivityPub::FetchRemoteActorService, type: :service do
before do before do
actor[:inbox] = nil actor[:inbox] = nil
stub_request(:get, 'https://example.com/alice').to_return(body: Oj.dump(actor)) stub_request(:get, 'https://example.com/alice').to_return(body: Oj.dump(actor), headers: { 'Content-Type': 'application/activity+json' })
stub_request(:get, 'https://example.com/.well-known/webfinger?resource=acct:alice@example.com').to_return(body: Oj.dump(webfinger), headers: { 'Content-Type': 'application/jrd+json' }) stub_request(:get, 'https://example.com/.well-known/webfinger?resource=acct:alice@example.com').to_return(body: Oj.dump(webfinger), headers: { 'Content-Type': 'application/jrd+json' })
stub_request(:get, 'https://example.com/.well-known/nodeinfo').to_return(body: '{}') stub_request(:get, 'https://example.com/.well-known/nodeinfo').to_return(body: '{}')
end end
@ -55,7 +55,7 @@ RSpec.describe ActivityPub::FetchRemoteActorService, type: :service do
let!(:webfinger) { { subject: 'acct:alice@example.com', links: [{ rel: 'self', href: 'https://example.com/alice' }] } } let!(:webfinger) { { subject: 'acct:alice@example.com', links: [{ rel: 'self', href: 'https://example.com/alice' }] } }
before do before do
stub_request(:get, 'https://example.com/alice').to_return(body: Oj.dump(actor)) stub_request(:get, 'https://example.com/alice').to_return(body: Oj.dump(actor), headers: { 'Content-Type': 'application/activity+json' })
stub_request(:get, 'https://example.com/.well-known/webfinger?resource=acct:alice@example.com').to_return(body: Oj.dump(webfinger), headers: { 'Content-Type': 'application/jrd+json' }) stub_request(:get, 'https://example.com/.well-known/webfinger?resource=acct:alice@example.com').to_return(body: Oj.dump(webfinger), headers: { 'Content-Type': 'application/jrd+json' })
stub_request(:get, 'https://example.com/.well-known/nodeinfo').to_return(body: '{}') stub_request(:get, 'https://example.com/.well-known/nodeinfo').to_return(body: '{}')
end end
@ -77,7 +77,7 @@ RSpec.describe ActivityPub::FetchRemoteActorService, type: :service do
let!(:webfinger) { { subject: 'acct:alice@iscool.af', links: [{ rel: 'self', href: 'https://example.com/alice' }] } } let!(:webfinger) { { subject: 'acct:alice@iscool.af', links: [{ rel: 'self', href: 'https://example.com/alice' }] } }
before do before do
stub_request(:get, 'https://example.com/alice').to_return(body: Oj.dump(actor)) stub_request(:get, 'https://example.com/alice').to_return(body: Oj.dump(actor), headers: { 'Content-Type': 'application/activity+json' })
stub_request(:get, 'https://example.com/.well-known/webfinger?resource=acct:alice@example.com').to_return(body: Oj.dump(webfinger), headers: { 'Content-Type': 'application/jrd+json' }) stub_request(:get, 'https://example.com/.well-known/webfinger?resource=acct:alice@example.com').to_return(body: Oj.dump(webfinger), headers: { 'Content-Type': 'application/jrd+json' })
stub_request(:get, 'https://iscool.af/.well-known/webfinger?resource=acct:alice@iscool.af').to_return(body: Oj.dump(webfinger), headers: { 'Content-Type': 'application/jrd+json' }) stub_request(:get, 'https://iscool.af/.well-known/webfinger?resource=acct:alice@iscool.af').to_return(body: Oj.dump(webfinger), headers: { 'Content-Type': 'application/jrd+json' })
stub_request(:get, 'https://iscool.af/.well-known/nodeinfo').to_return(body: '{}') stub_request(:get, 'https://iscool.af/.well-known/nodeinfo').to_return(body: '{}')
@ -101,7 +101,7 @@ RSpec.describe ActivityPub::FetchRemoteActorService, type: :service do
let!(:webfinger) { { subject: 'acct:alice@example.com', links: [{ rel: 'self', href: 'https://example.com/bob' }] } } let!(:webfinger) { { subject: 'acct:alice@example.com', links: [{ rel: 'self', href: 'https://example.com/bob' }] } }
before do before do
stub_request(:get, 'https://example.com/alice').to_return(body: Oj.dump(actor)) stub_request(:get, 'https://example.com/alice').to_return(body: Oj.dump(actor), headers: { 'Content-Type': 'application/activity+json' })
stub_request(:get, 'https://example.com/.well-known/webfinger?resource=acct:alice@example.com').to_return(body: Oj.dump(webfinger), headers: { 'Content-Type': 'application/jrd+json' }) stub_request(:get, 'https://example.com/.well-known/webfinger?resource=acct:alice@example.com').to_return(body: Oj.dump(webfinger), headers: { 'Content-Type': 'application/jrd+json' })
stub_request(:get, 'https://example.com/.well-known/nodeinfo').to_return(body: '{}') stub_request(:get, 'https://example.com/.well-known/nodeinfo').to_return(body: '{}')
end end
@ -118,7 +118,7 @@ RSpec.describe ActivityPub::FetchRemoteActorService, type: :service do
let!(:webfinger) { { subject: 'acct:alice@iscool.af', links: [{ rel: 'self', href: 'https://example.com/bob' }] } } let!(:webfinger) { { subject: 'acct:alice@iscool.af', links: [{ rel: 'self', href: 'https://example.com/bob' }] } }
before do before do
stub_request(:get, 'https://example.com/alice').to_return(body: Oj.dump(actor)) stub_request(:get, 'https://example.com/alice').to_return(body: Oj.dump(actor), headers: { 'Content-Type': 'application/activity+json' })
stub_request(:get, 'https://example.com/.well-known/webfinger?resource=acct:alice@example.com').to_return(body: Oj.dump(webfinger), headers: { 'Content-Type': 'application/jrd+json' }) stub_request(:get, 'https://example.com/.well-known/webfinger?resource=acct:alice@example.com').to_return(body: Oj.dump(webfinger), headers: { 'Content-Type': 'application/jrd+json' })
stub_request(:get, 'https://iscool.af/.well-known/webfinger?resource=acct:alice@iscool.af').to_return(body: Oj.dump(webfinger), headers: { 'Content-Type': 'application/jrd+json' }) stub_request(:get, 'https://iscool.af/.well-known/webfinger?resource=acct:alice@iscool.af').to_return(body: Oj.dump(webfinger), headers: { 'Content-Type': 'application/jrd+json' })
stub_request(:get, 'https://iscool.af/.well-known/nodeinfo').to_return(body: '{}') stub_request(:get, 'https://iscool.af/.well-known/nodeinfo').to_return(body: '{}')

View file

@ -50,7 +50,7 @@ RSpec.describe ActivityPub::FetchRemoteKeyService, type: :service do
end end
before do before do
stub_request(:get, 'https://example.com/alice').to_return(body: Oj.dump(actor)) stub_request(:get, 'https://example.com/alice').to_return(body: Oj.dump(actor), headers: { 'Content-Type': 'application/activity+json' })
stub_request(:get, 'https://example.com/.well-known/webfinger?resource=acct:alice@example.com').to_return(body: Oj.dump(webfinger), headers: { 'Content-Type': 'application/jrd+json' }) stub_request(:get, 'https://example.com/.well-known/webfinger?resource=acct:alice@example.com').to_return(body: Oj.dump(webfinger), headers: { 'Content-Type': 'application/jrd+json' })
stub_request(:get, 'https://example.com/.well-known/nodeinfo').to_return(body: '{}') stub_request(:get, 'https://example.com/.well-known/nodeinfo').to_return(body: '{}')
end end
@ -60,7 +60,7 @@ RSpec.describe ActivityPub::FetchRemoteKeyService, type: :service do
context 'when the key is a sub-object from the actor' do context 'when the key is a sub-object from the actor' do
before do before do
stub_request(:get, public_key_id).to_return(body: Oj.dump(actor)) stub_request(:get, public_key_id).to_return(body: Oj.dump(actor), headers: { 'Content-Type': 'application/activity+json' })
end end
it 'returns the expected account' do it 'returns the expected account' do
@ -72,7 +72,7 @@ RSpec.describe ActivityPub::FetchRemoteKeyService, type: :service do
let(:public_key_id) { 'https://example.com/alice-public-key.json' } let(:public_key_id) { 'https://example.com/alice-public-key.json' }
before do before do
stub_request(:get, public_key_id).to_return(body: Oj.dump(key_json.merge({ '@context': ['https://www.w3.org/ns/activitystreams', 'https://w3id.org/security/v1'] }))) stub_request(:get, public_key_id).to_return(body: Oj.dump(key_json.merge({ '@context': ['https://www.w3.org/ns/activitystreams', 'https://w3id.org/security/v1'] })), headers: { 'Content-Type': 'application/activity+json' })
end end
it 'returns the expected account' do it 'returns the expected account' do
@ -85,7 +85,7 @@ RSpec.describe ActivityPub::FetchRemoteKeyService, type: :service do
let(:actor_public_key) { 'https://example.com/alice-public-key.json' } let(:actor_public_key) { 'https://example.com/alice-public-key.json' }
before do before do
stub_request(:get, public_key_id).to_return(body: Oj.dump(key_json.merge({ '@context': ['https://www.w3.org/ns/activitystreams', 'https://w3id.org/security/v1'] }))) stub_request(:get, public_key_id).to_return(body: Oj.dump(key_json.merge({ '@context': ['https://www.w3.org/ns/activitystreams', 'https://w3id.org/security/v1'] })), headers: { 'Content-Type': 'application/activity+json' })
end end
it 'returns the nil' do it 'returns the nil' do

View file

@ -58,7 +58,7 @@ RSpec.describe ActivityPub::FetchRepliesService, type: :service do
context 'when passing the URL to the collection' do context 'when passing the URL to the collection' do
before do before do
stub_request(:get, collection_uri).to_return(status: 200, body: Oj.dump(payload)) stub_request(:get, collection_uri).to_return(status: 200, body: Oj.dump(payload), headers: { 'Content-Type': 'application/activity+json' })
end end
it 'spawns workers for up to 5 replies on the same server' do it 'spawns workers for up to 5 replies on the same server' do
@ -93,7 +93,7 @@ RSpec.describe ActivityPub::FetchRepliesService, type: :service do
context 'when passing the URL to the collection' do context 'when passing the URL to the collection' do
before do before do
stub_request(:get, collection_uri).to_return(status: 200, body: Oj.dump(payload)) stub_request(:get, collection_uri).to_return(status: 200, body: Oj.dump(payload), headers: { 'Content-Type': 'application/activity+json' })
end end
it 'spawns workers for up to 5 replies on the same server' do it 'spawns workers for up to 5 replies on the same server' do
@ -132,7 +132,7 @@ RSpec.describe ActivityPub::FetchRepliesService, type: :service do
context 'when passing the URL to the collection' do context 'when passing the URL to the collection' do
before do before do
stub_request(:get, collection_uri).to_return(status: 200, body: Oj.dump(payload)) stub_request(:get, collection_uri).to_return(status: 200, body: Oj.dump(payload), headers: { 'Content-Type': 'application/activity+json' })
end end
it 'spawns workers for up to 5 replies on the same server' do it 'spawns workers for up to 5 replies on the same server' do

View file

@ -224,7 +224,8 @@ RSpec.describe ActivityPub::ProcessStatusUpdateService, type: :service do
end end
it 'does not update the text, spoiler_text or edited_at' do it 'does not update the text, spoiler_text or edited_at' do
expect { subject.call(status, json, json) }.to_not(change { s = status.reload; [s.text, s.spoiler_text, s.edited_at] }) expect { subject.call(status, json, json) }
.to_not(change { status.reload.attributes.slice('text', 'spoiler_text', 'edited_at').values })
end end
end end

View file

@ -60,7 +60,7 @@ RSpec.describe ActivityPub::SynchronizeFollowersService, type: :service do
describe '#call' do describe '#call' do
context 'when the endpoint is a Collection of actor URIs' do context 'when the endpoint is a Collection of actor URIs' do
before do before do
stub_request(:get, collection_uri).to_return(status: 200, body: Oj.dump(payload)) stub_request(:get, collection_uri).to_return(status: 200, body: Oj.dump(payload), headers: { 'Content-Type': 'application/activity+json' })
end end
it_behaves_like 'synchronizes followers' it_behaves_like 'synchronizes followers'
@ -77,7 +77,7 @@ RSpec.describe ActivityPub::SynchronizeFollowersService, type: :service do
end end
before do before do
stub_request(:get, collection_uri).to_return(status: 200, body: Oj.dump(payload)) stub_request(:get, collection_uri).to_return(status: 200, body: Oj.dump(payload), headers: { 'Content-Type': 'application/activity+json' })
end end
it_behaves_like 'synchronizes followers' it_behaves_like 'synchronizes followers'
@ -98,7 +98,7 @@ RSpec.describe ActivityPub::SynchronizeFollowersService, type: :service do
end end
before do before do
stub_request(:get, collection_uri).to_return(status: 200, body: Oj.dump(payload)) stub_request(:get, collection_uri).to_return(status: 200, body: Oj.dump(payload), headers: { 'Content-Type': 'application/activity+json' })
end end
it_behaves_like 'synchronizes followers' it_behaves_like 'synchronizes followers'

View file

@ -32,27 +32,27 @@ RSpec.describe PostStatusService, type: :service do
let!(:future) { Time.now.utc + 2.hours } let!(:future) { Time.now.utc + 2.hours }
let!(:previous_status) { Fabricate(:status, account: account) } let!(:previous_status) { Fabricate(:status, account: account) }
it 'schedules a status' do it 'schedules a status for future creation and does not create one immediately' do
status = subject.call(account, text: 'Hi future!', scheduled_at: future)
expect(status).to be_a ScheduledStatus
expect(status.scheduled_at).to eq future
expect(status.params['text']).to eq 'Hi future!'
end
it 'does not immediately create a status' do
media = Fabricate(:media_attachment, account: account) media = Fabricate(:media_attachment, account: account)
status = subject.call(account, text: 'Hi future!', media_ids: [media.id], scheduled_at: future) status = subject.call(account, text: 'Hi future!', media_ids: [media.id], scheduled_at: future)
expect(status).to be_a ScheduledStatus expect(status)
expect(status.scheduled_at).to eq future .to be_a(ScheduledStatus)
expect(status.params['text']).to eq 'Hi future!' .and have_attributes(
expect(status.params['media_ids']).to eq [media.id] scheduled_at: eq(future),
params: include(
'text' => eq('Hi future!'),
'media_ids' => contain_exactly(media.id)
)
)
expect(media.reload.status).to be_nil expect(media.reload.status).to be_nil
expect(Status.where(text: 'Hi future!')).to_not exist expect(Status.where(text: 'Hi future!')).to_not exist
end end
it 'does not change statuses count' do it 'does not change statuses_count of account or replies_count of thread previous status' do
expect { subject.call(account, text: 'Hi future!', scheduled_at: future, thread: previous_status) }.to_not(change { [account.statuses_count, previous_status.replies_count] }) expect { subject.call(account, text: 'Hi future!', scheduled_at: future, thread: previous_status) }
.to not_change { account.statuses_count }
.and(not_change { previous_status.replies_count })
end end
end end

View file

@ -4,7 +4,7 @@ require 'rails_helper'
RSpec.describe BlacklistedEmailValidator do RSpec.describe BlacklistedEmailValidator do
describe '#validate' do describe '#validate' do
subject { described_class.new.validate(user); errors } subject { described_class.new.validate(user) }
let(:user) { instance_double(User, email: 'info@mail.com', sign_up_ip: '1.2.3.4', errors: errors) } let(:user) { instance_double(User, email: 'info@mail.com', sign_up_ip: '1.2.3.4', errors: errors) }
let(:errors) { instance_double(ActiveModel::Errors, add: nil) } let(:errors) { instance_double(ActiveModel::Errors, add: nil) }
@ -18,7 +18,8 @@ RSpec.describe BlacklistedEmailValidator do
let(:blocked_email) { true } let(:blocked_email) { true }
it 'adds error' do it 'adds error' do
described_class.new.validate(user) subject
expect(errors).to have_received(:add).with(:email, :blocked).once expect(errors).to have_received(:add).with(:email, :blocked).once
end end
end end
@ -27,7 +28,8 @@ RSpec.describe BlacklistedEmailValidator do
let(:blocked_email) { false } let(:blocked_email) { false }
it 'does not add errors' do it 'does not add errors' do
described_class.new.validate(user) subject
expect(errors).to_not have_received(:add) expect(errors).to_not have_received(:add)
end end
@ -39,7 +41,8 @@ RSpec.describe BlacklistedEmailValidator do
end end
it 'adds error' do it 'adds error' do
described_class.new.validate(user) subject
expect(errors).to have_received(:add).with(:email, :taken).once expect(errors).to have_received(:add).with(:email, :taken).once
end end
end end

View file

@ -21,7 +21,7 @@ describe ActivityPub::FetchRepliesWorker do
describe 'perform' do describe 'perform' do
it 'performs a request if the collection URI is from the same host' do it 'performs a request if the collection URI is from the same host' do
stub_request(:get, 'https://example.com/statuses_replies/1').to_return(status: 200, body: json) stub_request(:get, 'https://example.com/statuses_replies/1').to_return(status: 200, body: json, headers: { 'Content-Type': 'application/activity+json' })
subject.perform(status.id, 'https://example.com/statuses_replies/1') subject.perform(status.id, 'https://example.com/statuses_replies/1')
expect(a_request(:get, 'https://example.com/statuses_replies/1')).to have_been_made.once expect(a_request(:get, 'https://example.com/statuses_replies/1')).to have_been_made.once
end end