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.
## [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
### Added

View file

@ -505,7 +505,7 @@ GEM
parslet (2.0.0)
pastel (0.8.0)
tty-color (~> 0.5)
pg (1.5.4)
pg (1.5.5)
pghero (3.4.1)
activerecord (>= 6)
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|
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

View file

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

View file

@ -158,6 +158,7 @@
"compose_form.save_changes": "Actualisar",
"compose_form.spoiler.marked": "Remover 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",
"confirmations.block.block_and_report": "Bloccar & Raportar",
"confirmations.block.confirm": "Bloccar",
@ -276,6 +277,12 @@
"follow_request.authorize": "Autorisar",
"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_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",
"footer.about": "Information",
"footer.directory": "Profilarium",
@ -517,11 +524,15 @@
"poll_button.add_poll": "Adjunter un balotation",
"poll_button.remove_poll": "Remover balotation",
"privacy.change": "Changear li privatie del posta",
"privacy.direct.long": "Omnes mentionat in li posta",
"privacy.direct.short": "Specific persones",
"privacy.private.long": "Solmen tui sequitores",
"privacy.private.short": "Sequitores",
"privacy.public.long": "Quicunc in e ex Mastodon",
"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.title": "Politica pri Privatie",
"recommended": "Recomandat",
@ -539,7 +550,9 @@
"relative_time.minutes": "{number}m",
"relative_time.seconds": "{number}s",
"relative_time.today": "hodie",
"reply_indicator.attachments": "{count, plural, one {# atachament} other {# atachamentes}}",
"reply_indicator.cancel": "Anullar",
"reply_indicator.poll": "Balotar",
"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.categories.legal": "Legal",

View file

@ -11,11 +11,13 @@
"account.blocked": "Yettusewḥel",
"account.browse_more_on_origin_server": "Snirem ugar deg umeɣnu aneẓli",
"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.domain_blocked": "Taɣult yeffren",
"account.edit_profile": "Ẓreg amaɣnu",
"account.enable_notifications": "Azen-iyi-d ilɣa mi ara d-isuffeɣ @{name}",
"account.endorse": "Welleh fell-as deg umaɣnu-inek",
"account.featured_tags.last_status_never": "Ulac tisuffaɣ",
"account.follow": "Ḍfer",
"account.followers": "Imeḍfaren",
"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.retry": "Ɛreḍ tikelt-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.bookmarks": "Ticraḍ",
"column.community": "Tasuddemt tadigant",
@ -77,7 +79,7 @@
"column.lists": "Tibdarin",
"column.mutes": "Imiḍanen yettwasgugmen",
"column.notifications": "Tilɣa",
"column.pins": "Tijewwaqin yettwasenṭḍen",
"column.pins": "Tisuffaɣ yettwasenṭḍen",
"column.public": "Tasuddemt tamatut",
"column_back_button.label": "Tuɣalin",
"column_header.hide_settings": "Ffer iɣewwaṛen",
@ -88,32 +90,36 @@
"column_header.unpin": "Kkes asenteḍ",
"column_subheading.settings": "Iɣewwaṛen",
"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",
"compose.language.change": "Beddel tutlayt",
"compose.language.search": "Nadi tutlayin …",
"compose.published.open": "Ldi",
"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.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.encryption_warning": "",
"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.lock": "yettwacekkel",
"compose_form.placeholder": "D acu i itezzin deg wallaɣ?",
"compose_form.poll.duration": "Tanzagt n tefrant",
"compose_form.poll.option_placeholder": "Taxtiṛt {number}",
"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.unmarked": "Rnu aḍris yettwaffren deffir n walɣu",
"confirmation_modal.cancel": "Sefsex",
"confirmations.block.block_and_report": "Sewḥel & sewɛed",
"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.message": "Tebɣiḍ s tidet ad tekkseḍ tasuffeɣt-agi?",
"confirmations.delete_list.confirm": "Kkes",
"confirmations.delete_list.message": "Tebɣiḍ s tidet ad tekkseḍ umuɣ-agi i lebda?",
"confirmations.discard_edit_media.confirm": "Sefsex",
"confirmations.domain_block.confirm": "Ffer taɣult meṛṛa",
"confirmations.edit.confirm": "Ẓreg",
"confirmations.logout.confirm": "Ffeɣ",
"confirmations.logout.message": "D tidet tebɣiḍ ad teffɣeḍ?",
"confirmations.mute.confirm": "Sgugem",
@ -133,12 +139,13 @@
"directory.local": "Seg {domain} kan",
"directory.new_arrivals": "Imaynuten id yewḍen",
"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_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.preview": "Akka ara d-iban:",
"emoji_button.activity": "Aqeddic",
"emoji_button.clear": "Sfeḍ",
"emoji_button.custom": "Udmawan",
"emoji_button.flags": "Innayen",
"emoji_button.food": "Tegwella & Tissit",
@ -153,7 +160,7 @@
"emoji_button.symbols": "Izamulen",
"emoji_button.travel": "Imeḍqan d Yinigen",
"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.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.",
@ -174,7 +181,7 @@
"explore.suggested_follows": "Imdanen",
"explore.title": "Snirem",
"explore.trending_links": "Isallen",
"explore.trending_statuses": "Tisuffiɣin",
"explore.trending_statuses": "Tisuffaɣ",
"explore.trending_tags": "Ihacṭagen",
"filter_modal.added.settings_link": "asebter n yiɣewwaṛen",
"filter_modal.select_filter.prompt_new": "Taggayt tamaynutt : {name}",
@ -183,8 +190,9 @@
"firehose.local": "Deg uqeddac-ayi",
"follow_request.authorize": "Ssireg",
"follow_request.reject": "Agi",
"footer.about": "Γef",
"footer.directory": "Akaram n imaγnuten",
"followed_tags": "Ihacṭagen yettwaḍfaren",
"footer.about": "Ɣef",
"footer.directory": "Akaram n imaɣnuten",
"footer.get_app": "Awi-d asnas",
"footer.invite": "Ɛreḍ-d kra n yimdanen",
"footer.keyboard_shortcuts": "Inegzumen n unasiw",
@ -207,6 +215,7 @@
"home.column_settings.show_replies": "Ssken-d tiririyin",
"home.hide_announcements": "Ffer 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.title.follow": "Ḍfer {name}",
"intervals.full.days": "{number, plural, one {# n wass} other {# n wussan}}",
@ -247,8 +256,8 @@
"lightbox.close": "Mdel",
"lightbox.compress": "Ḥemmeẓ tamnaḍt n uskan n tugna",
"lightbox.expand": "Simeɣer tamnaḍt n uskan n tugna",
"lightbox.next": "Γer zdat",
"lightbox.previous": "Γer deffir",
"lightbox.next": "Ɣer zdat",
"lightbox.previous": "Ɣer deffir",
"link_preview.author": "S-ɣur {name}",
"lists.account.add": "Rnu ɣer tebdart",
"lists.account.remove": "Kkes seg tebdart",
@ -264,11 +273,12 @@
"lists.search": "Nadi gar yemdanen i teṭṭafaṛeḍ",
"lists.subheading": "Tibdarin-ik·im",
"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.hide_notifications": "Tebɣiḍ ad teffreḍ talɣutin n umseqdac-a?",
"mute_modal.indefinite": "Ur yettwasbadu ara",
"navigation_bar.about": "Γef",
"navigation_bar.about": "Ɣef",
"navigation_bar.blocks": "Imseqdacen yettusḥebsen",
"navigation_bar.bookmarks": "Ticraḍ",
"navigation_bar.community_timeline": "Tasuddemt tadigant",
@ -284,7 +294,7 @@
"navigation_bar.logout": "Ffeɣ",
"navigation_bar.mutes": "Iseqdacen yettwasusmen",
"navigation_bar.personal": "Udmawan",
"navigation_bar.pins": "Tijewwiqin yettwasentḍen",
"navigation_bar.pins": "Tisuffaɣ yettwasenṭḍen",
"navigation_bar.preferences": "Imenyafen",
"navigation_bar.public_timeline": "Tasuddemt tazayezt tamatut",
"navigation_bar.search": "Nadi",
@ -311,7 +321,7 @@
"notifications.column_settings.reblog": "Seǧhed:",
"notifications.column_settings.show": "Ssken-d tilɣa deg ujgu",
"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.boosts": "Seǧhed",
"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_banner.enable": "Rmed talɣutin n tnarit",
"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_home": "Go to your home feed",
"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.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.skip": "Want to skip right ahead?",
"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.categories.other": "Tiyyaḍ",
"report.categories.spam": "Aspam",
"report.category.title_account": "ameγnu",
"report.category.title_account": "ameɣnu",
"report.category.title_status": "tasuffeɣt",
"report.close": "Immed",
"report.forward": "Bren-it ɣeṛ {target}",
@ -383,6 +397,7 @@
"report_notification.open": "Ldi aneqqis",
"search.placeholder": "Nadi",
"search.search_or_paste": "Nadi neɣ senṭeḍ URL",
"search_popout.user": "amseqdac",
"search_results.all": "Akk",
"search_results.hashtags": "Ihacṭagen",
"search_results.statuses": "Tisuffaɣ",
@ -405,7 +420,7 @@
"status.embed": "Seddu",
"status.filtered": "Yettwasizdeg",
"status.load_more": "Sali ugar",
"status.media_hidden": "Taɣwalt tettwaffer",
"status.media_hidden": "Amidya yettwaffer",
"status.mention": "Bder-d @{name}",
"status.more": "Ugar",
"status.mute": "Sussem @{name}",
@ -425,7 +440,7 @@
"status.sensitive_warning": "Agbur amḥulfu",
"status.share": "Bḍu",
"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_all": "Ẓerr ugar lebda",
"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.resources.followers": "Imeḍfaṛen",
"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.trending_now": "Ayen mucaɛen tura",
"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.description_placeholder": "Aberraɣ arurad ineggez nnig n uqjun amuṭṭis",
"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.preview_label": "Taskant ({ratio})",
"upload_progress.label": "Asali iteddu...",

View file

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

View file

@ -279,8 +279,8 @@
"follow_requests.unlocked_explanation": "แม้ว่าไม่มีการล็อคบัญชีของคุณ พนักงานของ {domain} คิดว่าคุณอาจต้องการตรวจทานคำขอติดตามจากบัญชีเหล่านี้ด้วยตนเอง",
"follow_suggestions.curated_suggestion": "คัดสรรโดยบรรณาธิการ",
"follow_suggestions.dismiss": "ไม่ต้องแสดงอีก",
"follow_suggestions.personalized_suggestion": "คำแนะนำเฉพาะบุคคล",
"follow_suggestions.popular_suggestion": "คำแนะนำยอดนิยม",
"follow_suggestions.personalized_suggestion": "ข้อเสนอแนะเฉพาะบุคคล",
"follow_suggestions.popular_suggestion": "ข้อเสนอแนะยอดนิยม",
"follow_suggestions.view_all": "ดูทั้งหมด",
"follow_suggestions.who_to_follow": "ติดตามใครดี",
"followed_tags": "แฮชแท็กที่ติดตาม",

View file

@ -2,6 +2,9 @@
"about.blocks": "ma lawa",
"about.contact": "toki:",
"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.not_available": "lon kulupu ni la sina ken alasa ala e sona ni.",
"about.rules": "lawa kulupu",
@ -32,6 +35,7 @@
"account.follows.empty": "jan ni li kute e jan ala",
"account.go_to_profile": "o tawa lipu jan",
"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.locked_info": "sina wile kute e jan ni la ona o toki e ken",
"account.media": "sitelen",
@ -53,6 +57,7 @@
"account.unblock": "o weka ala e jan {name}",
"account.unblock_domain": "o weka ala e ma {domain}",
"account.unblock_short": "o pini weka",
"account.unendorse": "lipu jan la o suli ala e ni",
"account.unfollow": "o pini kute",
"account.unmute": "o len ala e @{name}",
"account.unmute_notifications_short": "o kute e mu tan jan ni",
@ -65,6 +70,9 @@
"alert.unexpected.title": "pakala a!",
"announcement.announcement": "toki suli",
"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.network.title": "pakala la ilo sina li toki ala tawa ilo ante",
"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.retry": "o ni sin",
"closed_registrations_modal.find_another_server": "o alasa e ma ante",
"column.about": "sona",
"column.blocks": "kulupu pi jan weka",
"column.bookmarks": "awen toki",
"column.home": "lipu open",
"column.lists": "kulupu lipu",
"column.mutes": "jan len",

View file

@ -44,7 +44,7 @@ class FetchResourceService < BaseService
@response_code = response.code
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
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.
subject: "%{username} hat Einspruch gegen eine Moderationsentscheidung auf %{instance} erhoben"
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!
new_pending_account:
body: Die Details von diesem neuem Konto sind unten. Du kannst die Anfrage akzeptieren oder ablehnen.
@ -1023,7 +1023,7 @@ de:
salutation: "%{name},"
settings: 'E-Mail-Einstellungen ändern: %{link}'
unsubscribe: Abbestellen
view: 'Hier überprüfen:'
view: 'Siehe:'
view_profile: Profil anzeigen
view_status: Beitrag anschauen
applications:

View file

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

View file

@ -14,6 +14,7 @@ ca:
last_attempt: Tens un intent més abans no es bloqui el teu compte.
locked: El teu compte s'ha blocat.
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ó.
timeout: La teva sessió ha expirat. Torna a iniciar-la per a 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.
locked: Din konto er låst.
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.
timeout: Session udløbet. Log ind igen 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.
locked: Dein Konto ist gesperrt.
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.
timeout: Deine Sitzung ist abgelaufen. Bitte melde dich erneut an, um fortzufahren.
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.
locked: Se bloqueó tu cuenta.
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.
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.

View file

@ -12,6 +12,7 @@ eu:
last_attempt: Saiakera bat geratzen zaizu zure kontua giltzapetu aurretik.
locked: Zure kontua giltzapetuta dago.
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.
timeout: Zure saioa iraungitu da. Hasi saioa berriro jarraitzeko.
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.
locked: Tilisi on lukittu.
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.
timeout: Istuntosi on vanhentunut. Jatkaaksesi käyttöä, kirjaudu uudelleen.
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.
locked: Kontan hjá tær er læst.
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.
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.

View file

@ -12,6 +12,7 @@ fy:
last_attempt: Jo hawwe noch ien besykjen oer eardat jo account blokkearre wurdt.
locked: Jo account is blokkearre.
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.
timeout: Jo sesje is ferrûn. Meld jo opnij oan om troch te gean.
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.
locked: A túa conta está bloqueada.
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.
timeout: A túa sesión caducou. Accede outra vez para continuar.
unauthenticated: Precisas iniciar sesión ou rexistrarte antes de continuar.

View file

@ -12,6 +12,7 @@ he:
last_attempt: יש לך עוד ניסיון אחד לפני נעילת החשבון.
locked: חשבון זה נעול.
not_found_in_database: "%{authentication_keys} או סיסמה לא נכונים."
omniauth_user_creation_failure: שגיאה ביצירת חשבון לזהות הזו.
pending: חשבונך נמצא עדיין בבדיקה.
timeout: פג תוקף השהיה בחשבון. נא להכנס מחדש על מנת להמשיך.
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.
locked: A fiókodat zároltuk.
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.
timeout: A munkameneted lejárt. A folytatáshoz jelentkezz be újra.
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.
locked: Tui conto es serrat.
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.
timeout: Tui session ha expirat. Ples reintrar denov por 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.
locked: Notandaaðgangurinn þinn er læstur.
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.
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ð.

View file

@ -12,6 +12,7 @@ it:
last_attempt: Hai un altro tentativo, prima che il tuo profilo venga bloccato.
locked: Il tuo profilo è bloccato.
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.
timeout: La tua sessione è scaduta. Sei pregato di accedere nuovamente per continuare.
unauthenticated: Devi accedere o registrarti, per continuare.

View file

@ -13,13 +13,13 @@ kab:
locked: Amiḍan-ik yettwargel.
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.
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ḍ.
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ḍ.
unconfirmed: Ilaq ad wekdeḍ tansa-inek imayl akken ad tkemmelḍ.
mailer:
confirmation_instructions:
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_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>.
@ -87,7 +87,7 @@ kab:
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_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:
messages:
already_confirmed: ittwasentem yakan, ttxil εreḍ ad teqneḍ

View file

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

View file

@ -12,6 +12,7 @@ lad:
last_attempt: Aprova una vez mas antes de ke tu kuento sea blokado.
locked: Tu kuento esta blokado.
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.
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.

View file

@ -12,6 +12,7 @@ nl:
last_attempt: Je hebt nog één poging over voordat jouw account wordt opgeschort.
locked: Jouw account is opgeschort.
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.
timeout: Jouw sessie is verlopen, log opnieuw in.
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.
locked: Twoje konto zostało zablokowane.
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.
timeout: Twoja sesja wygasła. Zaloguj się ponownie, 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.
locked: A tua conta está bloqueada.
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.
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.

View file

@ -12,6 +12,7 @@ sk:
last_attempt: Máš posledný pokus pred zamknutím tvojho účtu.
locked: Tvoj účet je zamknutý.
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ý.
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ť.

View file

@ -12,6 +12,7 @@ sl:
last_attempt: Pred zaklepom računa imate še en poskus.
locked: Vaš račun je zaklenjen.
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.
timeout: Vaša seja je potekla. Če želite nadaljevati, se znova prijavite.
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.
locked: Llogaria juaj është e kyçur.
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.
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.

View file

@ -12,6 +12,7 @@ sr-Latn:
last_attempt: Imate još jedan pokušaj pre nego što Vaš nalog bude zaključan.
locked: Vaš nalog je zaključan.
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.
timeout: Vreme trajanja Vaše sesije je isteklo. Za nastavak prijavite se ponovo.
unauthenticated: Za nastavak se morate prijaviti ili registrovati.

View file

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

View file

@ -12,6 +12,7 @@ tr:
last_attempt: Hesabınız kilitlenmeden önce bir kez daha denemeniz gerekir.
locked: Hesabınız kilitlendi.
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.
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.

View file

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

View file

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

View file

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

View file

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

View file

@ -36,7 +36,7 @@ kab:
application: Asnas
callback_url: URL n tririt n wawal
delete: Kkes
empty: Ulac γur-ek·em isnasen.
empty: Ulac ɣur-k·m isnasen.
name: Isem
new: Asnas amaynut
show: Ẓer
@ -57,7 +57,7 @@ kab:
new:
title: Tlaq tsiregt
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:
buttons:
revoke: Ḥwi
@ -113,13 +113,13 @@ kab:
read:notifications: ẓer tilγa-ik
read:reports: ẓer ineqqisen-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:accounts: ẓreg amaγnu-ik
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:follows: ḍfeṛ imdanen
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

View file

@ -1793,6 +1793,12 @@ ie:
extra: It es ja pret a descargar!
subject: Tui archive es pret por descargar
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:
change_password: changear tui passa-parol
details: 'Vi li detallies del apertion de session:'

View file

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

View file

@ -12,7 +12,7 @@ kab:
defaults:
autofollow: Imdanen ara ijerrden s usnebgi-inek, ad k-ḍefṛen s wudem awurman
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
password: Seqdec ma drus 8 n yisekkilen
setting_display_media_default: Ffer teywalt yettwacreḍ d tanafrit
@ -69,12 +69,12 @@ kab:
setting_display_media_show_all: Ssken kullec
setting_hide_network: Ffer azetta-k·m
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
title: Azwel
type: Anaw n uktar
username: Isem n useqdac
username_or_email: Isem n useqdac neγ imal
username_or_email: Isem n useqdac neɣ imal
whole_word: Awal akk
featured_tag:
name: Ahacṭag
@ -84,7 +84,7 @@ kab:
invite:
comment: Awennit
invite_request:
text: Acimi tebγiḍ ad ternuḍ iman-ik?
text: Acimi tebɣiḍ ad ternuḍ iman-ik?
ip_block:
comment: Awennit
ip: IP

View file

@ -188,7 +188,7 @@ sq:
create_user_role: Krijoni Rol
demote_user: Zhgradoje Përdoruesin
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_domain_allow: Fshi Lejim 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}"
update_announcement_html: "%{name} përditësoi lajmërimin %{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_status_html: "%{name} përditësoi gjendjen me %{target}"
update_user_role_html: "%{name} ndryshoi rolin për %{target}"

View file

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

View file

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

View file

@ -31,7 +31,7 @@ module Mastodon
end
def default_prerelease
'alpha.2'
'alpha.3'
end
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
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
click_on I18n.t('challenge.confirm')
expect(user.reload.confirmed?).to be true
expect { click_on I18n.t('challenge.confirm') }
.to change { user.reload.confirmed? }.from(false).to(true)
expect(page).to have_current_path(/\A#{client_app.confirmation_redirect_uri}/, url: true)
# 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"
# 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).to have_link(I18n.t('auth.confirmations.clicking_this_link'), href: client_app.confirmation_redirect_uri)
expect(page)
.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

View file

@ -56,15 +56,15 @@ describe JsonLdHelper do
describe '#fetch_resource' 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
stub_request(:get, 'https://bob.test/').to_return body: '{"id": "https://alice.test/"}'
stub_request(:get, 'https://alice.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/"}', headers: { 'Content-Type': 'application/activity+json' })
expect(fetch_resource('https://bob.test/', false)).to eq({ 'id' => 'https://alice.test/' })
end
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://marvin.test/').to_return body: '{"id": "https://alice.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/"}', headers: { 'Content-Type': 'application/activity+json' })
expect(fetch_resource('https://mallory.test/', false)).to be_nil
end
@ -72,7 +72,7 @@ describe JsonLdHelper do
context 'when the second argument is true' 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
end
end
@ -80,12 +80,12 @@ describe JsonLdHelper do
describe '#fetch_resource_without_id_validation' 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
end
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({})
end
end

View file

@ -35,7 +35,7 @@ RSpec.describe ActivityPub::Activity::Announce do
context 'when sender is followed by a local account' do
before do
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
end
@ -120,7 +120,7 @@ RSpec.describe ActivityPub::Activity::Announce do
let(:object_json) { 'https://example.com/actor/hello-world' }
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
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/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/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)
end
@ -1158,10 +1158,10 @@ RSpec.describe ActivityPub::Activity::Create do
end
before do
stub_request(:get, 'https://foo.test').to_return(status: 200, body: Oj.dump(actor_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').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), headers: { 'Content-Type': 'application/activity+json' })
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
end
@ -2145,12 +2145,15 @@ RSpec.describe ActivityPub::Activity::Create do
it 'creates an encrypted message' do
encrypted_message = target_device.encrypted_messages.reload.first
expect(encrypted_message).to_not be_nil
expect(encrypted_message.from_device_id).to eq '1234'
expect(encrypted_message.from_account).to eq sender
expect(encrypted_message.type).to eq 1
expect(encrypted_message.body).to eq 'Foo'
expect(encrypted_message.digest).to eq 'Foo123'
expect(encrypted_message)
.to be_present
.and have_attributes(
from_device_id: eq('1234'),
from_account: eq(sender),
type: eq(1),
body: eq('Foo'),
digest: eq('Foo123')
)
end
it 'creates a message franking' do

View file

@ -64,8 +64,8 @@ RSpec.describe ActivityPub::Activity::Like do
before do
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, 'https://example.com/aaa').to_return(status: 200, body: Oj.dump(original_emoji))
stub_request(:get, 'https://example.com/invalid').to_return(status: 200, body: Oj.dump(original_invalid_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), headers: { 'Content-Type': 'application/activity+json' })
end
let(:json) do

View file

@ -72,11 +72,11 @@ RSpec.describe ActivityPub::FetchFeaturedCollectionService, type: :service do
shared_examples 'sets pinned posts' 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/unknown-inlined').to_return(status: 200, body: Oj.dump(status_json_pinned_unknown_inlined))
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), 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-reachable').to_return(status: 200, body: Oj.dump(status_json_pinned_unknown_reachable))
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/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), headers: { 'Content-Type': 'application/activity+json' })
subject.call(actor, note: true, hashtag: false)
end
@ -94,7 +94,7 @@ RSpec.describe ActivityPub::FetchFeaturedCollectionService, type: :service do
describe '#call' do
context 'when the endpoint is a Collection' 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
it_behaves_like 'sets pinned posts'
@ -111,7 +111,7 @@ RSpec.describe ActivityPub::FetchFeaturedCollectionService, type: :service do
end
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
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' }
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)
end
@ -147,7 +147,7 @@ RSpec.describe ActivityPub::FetchFeaturedCollectionService, type: :service do
end
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
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' }
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)
end

View file

@ -38,7 +38,7 @@ RSpec.describe ActivityPub::FetchFeaturedTagsCollectionService, type: :service d
describe '#call' do
context 'when the endpoint is a Collection' 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
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
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: 'baz')
@ -67,7 +67,7 @@ RSpec.describe ActivityPub::FetchFeaturedTagsCollectionService, type: :service d
end
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
it_behaves_like 'sets featured tags'
@ -88,7 +88,7 @@ RSpec.describe ActivityPub::FetchFeaturedTagsCollectionService, type: :service d
end
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
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) }
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
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) }
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
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) }
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
it 'first 8 items are returned' do

View file

@ -38,7 +38,7 @@ RSpec.describe ActivityPub::FetchRemoteAccountService, type: :service do
before do
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/nodeinfo').to_return(body: '{}')
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' }] } }
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/nodeinfo').to_return(body: '{}')
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' }] } }
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://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: '{}')
@ -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' }] } }
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/nodeinfo').to_return(body: '{}')
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' }] } }
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://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: '{}')

View file

@ -38,7 +38,7 @@ RSpec.describe ActivityPub::FetchRemoteActorService, type: :service do
before do
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/nodeinfo').to_return(body: '{}')
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' }] } }
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/nodeinfo').to_return(body: '{}')
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' }] } }
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://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: '{}')
@ -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' }] } }
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/nodeinfo').to_return(body: '{}')
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' }] } }
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://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: '{}')

View file

@ -50,7 +50,7 @@ RSpec.describe ActivityPub::FetchRemoteKeyService, type: :service do
end
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/nodeinfo').to_return(body: '{}')
end
@ -60,7 +60,7 @@ RSpec.describe ActivityPub::FetchRemoteKeyService, type: :service do
context 'when the key is a sub-object from the actor' 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
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' }
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
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' }
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
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
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
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
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
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
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
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
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

View file

@ -60,7 +60,7 @@ RSpec.describe ActivityPub::SynchronizeFollowersService, type: :service do
describe '#call' do
context 'when the endpoint is a Collection of actor URIs' 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
it_behaves_like 'synchronizes followers'
@ -77,7 +77,7 @@ RSpec.describe ActivityPub::SynchronizeFollowersService, type: :service do
end
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
it_behaves_like 'synchronizes followers'
@ -98,7 +98,7 @@ RSpec.describe ActivityPub::SynchronizeFollowersService, type: :service do
end
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
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!(:previous_status) { Fabricate(:status, account: account) }
it 'schedules a status' 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
it 'schedules a status for future creation and does not create one immediately' do
media = Fabricate(:media_attachment, account: account)
status = subject.call(account, text: 'Hi future!', media_ids: [media.id], scheduled_at: future)
expect(status).to be_a ScheduledStatus
expect(status.scheduled_at).to eq future
expect(status.params['text']).to eq 'Hi future!'
expect(status.params['media_ids']).to eq [media.id]
expect(status)
.to be_a(ScheduledStatus)
.and have_attributes(
scheduled_at: eq(future),
params: include(
'text' => eq('Hi future!'),
'media_ids' => contain_exactly(media.id)
)
)
expect(media.reload.status).to be_nil
expect(Status.where(text: 'Hi future!')).to_not exist
end
it 'does not change statuses count' do
expect { subject.call(account, text: 'Hi future!', scheduled_at: future, thread: previous_status) }.to_not(change { [account.statuses_count, previous_status.replies_count] })
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 }
.and(not_change { previous_status.replies_count })
end
end

View file

@ -4,7 +4,7 @@ require 'rails_helper'
RSpec.describe BlacklistedEmailValidator 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(:errors) { instance_double(ActiveModel::Errors, add: nil) }
@ -18,7 +18,8 @@ RSpec.describe BlacklistedEmailValidator do
let(:blocked_email) { true }
it 'adds error' do
described_class.new.validate(user)
subject
expect(errors).to have_received(:add).with(:email, :blocked).once
end
end
@ -27,7 +28,8 @@ RSpec.describe BlacklistedEmailValidator do
let(:blocked_email) { false }
it 'does not add errors' do
described_class.new.validate(user)
subject
expect(errors).to_not have_received(:add)
end
@ -39,7 +41,8 @@ RSpec.describe BlacklistedEmailValidator do
end
it 'adds error' do
described_class.new.validate(user)
subject
expect(errors).to have_received(:add).with(:email, :taken).once
end
end

View file

@ -21,7 +21,7 @@ describe ActivityPub::FetchRepliesWorker do
describe 'perform' 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')
expect(a_request(:get, 'https://example.com/statuses_replies/1')).to have_been_made.once
end