Merge pull request #3393 from ClearlyClaire/glitch-soc/merge-upstream

Merge upstream changes up to 2774e0fbfa
This commit is contained in:
Claire
2026-02-10 18:01:36 +01:00
committed by GitHub
23 changed files with 377 additions and 67 deletions

View File

@@ -42,8 +42,7 @@ jobs:
- name: Check for missing strings in English YML
run: |
bin/i18n-tasks add-missing -l en
git diff --exit-code
bin/i18n-tasks missing -t used -l en
- name: Check for wrong string interpolations
run: bin/i18n-tasks check-consistent-interpolations

View File

@@ -43,7 +43,7 @@ jobs:
bundler-cache: true
- name: Set-up RuboCop Problem Matcher
uses: r7kamura/rubocop-problem-matchers-action@59f1a0759f50cc2649849fd850b8487594bb5a81 # v1
uses: r7kamura/rubocop-problem-matchers-action@59f1a0759f50cc2649849fd850b8487594bb5a81 # v1.2.2
- name: Run rubocop
run: bin/rubocop

View File

@@ -51,7 +51,7 @@ class Api::V1Alpha::CollectionsController < Api::BaseController
def update
authorize @collection, :update?
@collection.update!(collection_update_params) # TODO: Create a service for this to federate changes
UpdateCollectionService.new.call(@collection, collection_update_params)
render json: @collection, serializer: REST::CollectionSerializer, adapter: :json
end

View File

@@ -123,6 +123,8 @@
"account.share": "Compartir el perfil de @{name}",
"account.show_reblogs": "Mostrar impulsos de @{name}",
"account.statuses_counter": "{count, plural, one {{counter} publicación} other {{counter} publicaciones}}",
"account.timeline.pinned": "Fijada",
"account.timeline.pinned.view_all": "Ver todas las publicaciones fijadas",
"account.unblock": "Desbloquear a @{name}",
"account.unblock_domain": "Desbloquear el dominio {domain}",
"account.unblock_domain_short": "Desbloquear",
@@ -295,6 +297,11 @@
"column_header.show_settings": "Mostrar ajustes",
"column_header.unpin": "Dejar de fijar",
"column_search.cancel": "Cancelar",
"combobox.close_results": "Cerrar resultados",
"combobox.loading": "Cargando",
"combobox.no_results_found": "No hay resultados para esta búsqueda",
"combobox.open_results": "Abrir resultados",
"combobox.results_available": "{count, plural,one {# sugerencia disponible} other {# sugerencias disponibles}}. Utiliza las teclas de flecha arriba y abajo para navegar. Pulsa la tecla Intro para seleccionar.",
"community.column_settings.local_only": "Solo local",
"community.column_settings.media_only": "Solo multimedia",
"community.column_settings.remote_only": "Solo remoto",
@@ -462,6 +469,7 @@
"empty_column.notification_requests": "¡Todo limpio! No hay nada aquí. Cuando recibas nuevas notificaciones, aparecerán aquí conforme a tu configuración.",
"empty_column.notifications": "Aún no tienes ninguna notificación. Cuando otras personas interactúen contigo, aparecerán aquí.",
"empty_column.public": "¡No hay nada aquí! Escribe algo públicamente, o sigue usuarios de otras instancias manualmente para llenarlo",
"empty_state.no_results": "Sin resultados",
"error.no_hashtag_feed_access": "Únete o inicia sesión para ver y seguir esta etiqueta.",
"error.unexpected_crash.explanation": "Debido a un error en nuestro código o a un problema de compatibilidad con el navegador, esta página no se ha podido mostrar correctamente.",
"error.unexpected_crash.explanation_addons": "No se pudo mostrar correctamente esta página. Este error probablemente fue causado por un complemento del navegador web o por herramientas de traducción automática.",

View File

@@ -123,6 +123,8 @@
"account.share": "Partager le profil de @{name}",
"account.show_reblogs": "Afficher les boosts de @{name}",
"account.statuses_counter": "{count, plural, one {{counter} message} other {{counter} messages}}",
"account.timeline.pinned": "Épinglé",
"account.timeline.pinned.view_all": "Voir tous les messages épinglés",
"account.unblock": "Débloquer @{name}",
"account.unblock_domain": "Débloquer le domaine {domain}",
"account.unblock_domain_short": "Débloquer",
@@ -295,6 +297,11 @@
"column_header.show_settings": "Afficher les paramètres",
"column_header.unpin": "Désépingler",
"column_search.cancel": "Annuler",
"combobox.close_results": "Fermer les résultats",
"combobox.loading": "Chargement",
"combobox.no_results_found": "Aucun résultat pour cette recherche",
"combobox.open_results": "Ouvrir les résultats",
"combobox.results_available": "{count, plural, one {# suggestion disponibe} other {# suggestions disponibles}}. Utiliser les touches haut et bas pour naviguer. Appuyer sur Entrée pour sélectionner.",
"community.column_settings.local_only": "Local seulement",
"community.column_settings.media_only": "Média seulement",
"community.column_settings.remote_only": "À distance seulement",
@@ -462,6 +469,7 @@
"empty_column.notification_requests": "C'est fini ! Il n'y a plus rien ici. Lorsque vous recevez de nouvelles notifications, elles apparaitront ici conformément à vos préférences.",
"empty_column.notifications": "Vous n'avez pas encore de notifications. Quand d'autres personnes interagissent avec vous, vous en verrez ici.",
"empty_column.public": "Il ny a rien ici! Écrivez quelque chose publiquement, ou bien suivez manuellement des personnes dautres serveurs pour remplir le fil public",
"empty_state.no_results": "Aucun résultat",
"error.no_hashtag_feed_access": "Rejoindre ou se connecter pour voir et suivre cet hashtag.",
"error.unexpected_crash.explanation": "En raison dun bogue dans notre code ou dun problème de compatibilité avec votre navigateur, cette page na pas pu être affichée correctement.",
"error.unexpected_crash.explanation_addons": "Cette page na pas pu être affichée correctement. Cette erreur est probablement causée par une extension de navigateur ou des outils de traduction automatique.",

View File

@@ -123,6 +123,8 @@
"account.share": "Partager le profil de @{name}",
"account.show_reblogs": "Afficher les partages de @{name}",
"account.statuses_counter": "{count, plural, one {{counter} message} other {{counter} messages}}",
"account.timeline.pinned": "Épinglé",
"account.timeline.pinned.view_all": "Voir tous les messages épinglés",
"account.unblock": "Débloquer @{name}",
"account.unblock_domain": "Débloquer le domaine {domain}",
"account.unblock_domain_short": "Débloquer",
@@ -295,6 +297,11 @@
"column_header.show_settings": "Afficher les paramètres",
"column_header.unpin": "Désépingler",
"column_search.cancel": "Annuler",
"combobox.close_results": "Fermer les résultats",
"combobox.loading": "Chargement",
"combobox.no_results_found": "Aucun résultat pour cette recherche",
"combobox.open_results": "Ouvrir les résultats",
"combobox.results_available": "{count, plural, one {# suggestion disponibe} other {# suggestions disponibles}}. Utiliser les touches haut et bas pour naviguer. Appuyer sur Entrée pour sélectionner.",
"community.column_settings.local_only": "Local seulement",
"community.column_settings.media_only": "Média uniquement",
"community.column_settings.remote_only": "Distant seulement",
@@ -462,6 +469,7 @@
"empty_column.notification_requests": "C'est fini ! Il n'y a plus rien ici. Lorsque vous recevez de nouvelles notifications, elles apparaitront ici conformément à vos préférences.",
"empty_column.notifications": "Vous navez pas encore de notification. Interagissez avec dautres personnes pour débuter la conversation.",
"empty_column.public": "Il ny a rien ici! Écrivez quelque chose publiquement, ou bien suivez manuellement des personnes dautres serveurs pour remplir le fil public",
"empty_state.no_results": "Aucun résultat",
"error.no_hashtag_feed_access": "Rejoindre ou se connecter pour voir et suivre cet hashtag.",
"error.unexpected_crash.explanation": "En raison dun bug dans notre code ou dun problème de compatibilité avec votre navigateur, cette page na pas pu être affichée correctement.",
"error.unexpected_crash.explanation_addons": "Cette page na pas pu être affichée correctement. Cette erreur est probablement causée par une extension de navigateur ou des outils de traduction automatique.",

View File

@@ -23,6 +23,7 @@
"account.badges.domain_blocked": "Letiltott domain",
"account.badges.group": "Csoport",
"account.badges.muted": "Némítva",
"account.badges.muted_until": "Némítva eddig: {until}",
"account.block": "@{name} letiltása",
"account.block_domain": "Domain letiltása: {domain}",
"account.block_short": "Letiltás",
@@ -122,6 +123,8 @@
"account.share": "@{name} profiljának megosztása",
"account.show_reblogs": "@{name} megtolásainak mutatása",
"account.statuses_counter": "{count, plural, one {{counter} bejegyzés} other {{counter} bejegyzés}}",
"account.timeline.pinned": "Kitűzve",
"account.timeline.pinned.view_all": "Összes kitűzött bejegyzés megtekintése",
"account.unblock": "@{name} letiltásának feloldása",
"account.unblock_domain": "{domain} domain tiltásának feloldása",
"account.unblock_domain_short": "Tiltás feloldása",
@@ -236,17 +239,33 @@
"collections.collection_description": "Leírás",
"collections.collection_name": "Név",
"collections.collection_topic": "Téma",
"collections.content_warning": "Tartalmi figyelmeztetés",
"collections.continue": "Folytatás",
"collections.create.accounts_subtitle": "Csak azok a követett fiókok adhatóak hozzá, melyek engedélyezték a felfedezést.",
"collections.create.accounts_title": "Kit emelsz ki ebben a gyűjteményben?",
"collections.create.basic_details_title": "Alapvető részletek",
"collections.create.settings_title": "Beállítások",
"collections.create.steps": "{step}. lépés/{total}",
"collections.create_a_collection_hint": "Gyűjtemény létrehozása a kedvenc fiókok másoknak való ajánlásához.",
"collections.create_collection": "Gyűjtemény létrehozása",
"collections.delete_collection": "Gyűjtemény törlése",
"collections.description_length_hint": "100 karakteres korlát",
"collections.edit_details": "Alapvető részletek szerkesztése",
"collections.edit_settings": "Beállítások szerkesztése",
"collections.error_loading_collections": "Hiba történt a gyűjtemények betöltése során.",
"collections.manage_accounts": "Fiókok kezelése",
"collections.manage_accounts_in_collection": "Gyűjteményben szereplő fiókok kezelése",
"collections.mark_as_sensitive": "Megjelelölés érzénykenként",
"collections.mark_as_sensitive_hint": "Tartalmi figyelmeztetés mögé rejti a gyűjtemény leírását és a fiókokat. A gyűjtemény neve továbbra is látható lesz.",
"collections.name_length_hint": "100 karakteres korlát",
"collections.new_collection": "Új gyűjtemény",
"collections.no_collections_yet": "Még nincsenek gyűjtemények.",
"collections.topic_hint": "Egy hashtag hozzáadása segít másoknak abban, hogy megértsék a gyűjtemény fő témáját.",
"collections.view_collection": "Gyűjtemény megtekintése",
"collections.visibility_public": "Nyilvános",
"collections.visibility_title": "Láthatóság",
"collections.visibility_unlisted": "Nem listázott",
"collections.visibility_unlisted_hint": "A hivatkozással bárki számára látható. A keresési találatokban és ajánlásokban rejtve van.",
"column.about": "Névjegy",
"column.blocks": "Letiltott felhasználók",
"column.bookmarks": "Könyvjelzők",
@@ -277,6 +296,11 @@
"column_header.show_settings": "Beállítások megjelenítése",
"column_header.unpin": "Kitűzés eltávolítása",
"column_search.cancel": "Mégse",
"combobox.close_results": "Találatok bezárása",
"combobox.loading": "Betöltés",
"combobox.no_results_found": "Nincs találat ehhez a kereséshez",
"combobox.open_results": "Találatok megtekintése",
"combobox.results_available": "{count, plural, one {# javaslat} other {# javaslat}} érhető el. A navigációhoz használt a fel és le nyílbillentyűket. A kiválasztáshoz üss Entert.",
"community.column_settings.local_only": "Csak helyi",
"community.column_settings.media_only": "Csak média",
"community.column_settings.remote_only": "Csak távoli",
@@ -444,6 +468,7 @@
"empty_column.notification_requests": "Minden tiszta! Itt nincs semmi. Ha új értesítéseket kapsz, azok itt jelennek meg a beállításoknak megfelelően.",
"empty_column.notifications": "Jelenleg még nincsenek értesítéseid. Ha mások kapcsolatba lépnek veled, ezek itt lesznek láthatóak.",
"empty_column.public": "Jelenleg itt nincs semmi! Írj valamit nyilvánosan vagy kövess más kiszolgálón levő felhasználókat, hogy megtöltsd.",
"empty_state.no_results": "Nincs találat",
"error.no_hashtag_feed_access": "Csatlakozz vagy jelentkezz be, hogy megtekintsd és kövesd ezt a hashtaget.",
"error.unexpected_crash.explanation": "Egy kód- vagy böngészőkompatibilitási hiba miatt ez az oldal nem jeleníthető meg helyesen.",
"error.unexpected_crash.explanation_addons": "Ezt az oldalt nem lehet helyesen megjeleníteni. Ezt a hibát valószínűleg egy böngésző kiegészítő vagy egy automatikus fordító okozza.",

View File

@@ -9,9 +9,16 @@
"about.not_available": "ਇਹ ਜਾਣਕਾਰੀ ਨੂੰ ਇਸ ਸਰਵਰ ਉੱਤੇ ਉਪਲੱਬਧ ਨਹੀਂ ਕੀਤਾ ਗਿਆ ਹੈ।",
"about.rules": "ਸਰਵਰ ਨਿਯਮ",
"account.account_note_header": "ਨਿੱਜੀ ਨੋਟ",
"account.activity": "ਸਰਗਰਮੀ",
"account.add_note": "ਕੋਈ ਨਿੱਜੀ ਨੋਟ ਜੋੜੋ",
"account.add_or_remove_from_list": "ਸੂਚੀ ਵਿੱਚ ਜੋੜੋ ਜਾਂ ਹਟਾਓ",
"account.badges.admin": "ਪ੍ਰਸ਼ਾਸਕ",
"account.badges.blocked": "ਪਾਬੰਦੀਸ਼ੁਦਾ",
"account.badges.bot": "ਆਟੋਮੇਟ ਕੀਤਾ",
"account.badges.domain_blocked": "ਪਾਬੰਦੀ ਲਾਏ ਡੋਮੇਨ",
"account.badges.group": "ਗਰੁੱਪ",
"account.badges.muted": "ਮੌਨ ਕੀਤੇ",
"account.badges.muted_until": "{until} ਤੱਕ ਮੌਨ ਕੀਤੇ",
"account.block": "@{name} ਉੱਤੇ ਪਾਬੰਦੀ ਲਾਓ",
"account.block_domain": "{domain} ਡੋਮੇਨ ਉੱਤੇ ਪਾਬੰਦੀ ਲਾਓ",
"account.block_short": "ਪਾਬੰਦੀ",
@@ -22,6 +29,7 @@
"account.direct": "ਨਿੱਜੀ ਜ਼ਿਕਰ @{name}",
"account.disable_notifications": "ਜਦੋਂ {name} ਕੋਈ ਪੋਸਟ ਕਰੇ ਤਾਂ ਮੈਨੂੰ ਸੂਚਨਾ ਨਾ ਦਿਓ",
"account.domain_blocking": "ਡੋਮੇਨ ਉੱਤੇ ਪਾਬੰਦੀ",
"account.edit_note": "ਨਿੱਜੀ ਨੋਟ ਨੂੰ ਸੋਧੋ",
"account.edit_profile": "ਪਰੋਫਾਈਲ ਨੂੰ ਸੋਧੋ",
"account.edit_profile_short": "ਸੋਧੋ",
"account.enable_notifications": "ਜਦੋਂ {name} ਪੋਸਟ ਕਰੇ ਤਾਂ ਮੈਨੂੰ ਸੂਚਨਾ ਦਿਓ",
@@ -33,6 +41,12 @@
"account.featured.hashtags": "ਹੈਸ਼ਟੈਗ",
"account.featured_tags.last_status_at": "{date} ਨੂੰ ਆਖਰੀ ਪੋਸਟ",
"account.featured_tags.last_status_never": "ਕੋਈ ਪੋਸਟ ਨਹੀਂ",
"account.fields.scroll_next": "ਅਗਲਾ ਵੇਖੋ",
"account.fields.scroll_prev": "ਪਿਛਲਾ ਵੇਖੋ",
"account.filters.all": "ਸਾਰੀਆਂ ਸਰਗਰਮੀਆਂ",
"account.filters.posts_only": "ਪੋਸਟਾਂ",
"account.filters.posts_replies": "ਪੋਸਟਾਂ ਅਤੇ ਜਵਾਬ",
"account.filters.replies_toggle": "ਜਵਾਬਾਂ ਨੂੰ ਵੇਖੋ",
"account.follow": "ਫ਼ਾਲੋ",
"account.follow_back": "ਵਾਪਸ ਫਾਲ਼ੋ ਕਰੋ",
"account.follow_back_short": "ਵਾਪਸ ਫਾਲ਼ੋ ਕਰੋ",
@@ -53,12 +67,31 @@
"account.joined_short": "ਜੁਆਇਨ ਕੀਤਾ",
"account.media": "ਮੀਡੀਆ",
"account.mention": "@{name} ਦਾ ਜ਼ਿਕਰ",
"account.menu.block": "ਖਾਤੇ ਉੱਤੇ ਪਾਬੰਦੀ ਲਾਓ",
"account.menu.block_domain": "{domain} ਉੱਤੇ ਪਾਬੰਦੀ ਲਾਓ",
"account.menu.copied": "ਖਾਤਾ ਲਿੰਕ ਨੂੰ ਕਲਿੱਪਬੋਰਡ ਨੂੰ ਕਾਪੀ ਕੀਤਾ",
"account.menu.copy": "ਲਿੰਕ ਨੂੰ ਕਾਪੀ ਕਰੋ",
"account.menu.direct": "ਨਿੱਜੀ ਜ਼ਿਕਰ",
"account.menu.mention": "ਜ਼ਿਕਰ",
"account.menu.mute": "ਖਾਤੇ ਨੂੰ ਮੌਨ ਕਰੋ",
"account.menu.open_original_page": "{domain} ਉੱਤੇ ਵੇਖੋ",
"account.menu.remove_follower": "ਫ਼ਾਲੋਅਰ ਨੂੰ ਹਟਾਓ",
"account.menu.report": "ਖਾਤੇ ਬਾਰੇ ਰਿਪੋਰਟ ਕਰੋ",
"account.menu.share": "…ਸਾਂਝਾ ਕਰੋ",
"account.menu.unblock": "ਖਾਤੇ ਉੱਤੇ ਪਾਬੰਦੀ ਨੂੰ ਹਟਾਓ",
"account.menu.unblock_domain": "{domain} ਤੋਂ ਪਾਬੰਦੀ ਨੂੰ ਹਟਾਓ",
"account.mute": "{name} ਨੂੰ ਮੌਨ ਕਰੋ",
"account.mute_notifications_short": "ਨੋਟਫਿਕੇਸ਼ਨਾਂ ਨੂੰ ਮੌਨ ਕਰੋ",
"account.mute_short": "ਮੌਨ ਕਰੋ",
"account.muted": "ਮੌਨ ਕੀਤੀਆਂ",
"account.mutual": "ਤੁਸੀਂ ਇੱਕ ਦੂਜੇ ਨੂੰ ਫ਼ਾਲੋ ਕਰਦੇ ਹੋ",
"account.no_bio": "ਕੋਈ ਵਰਣਨ ਨਹੀਂ ਦਿੱਤਾ।",
"account.node_modal.edit_title": "ਨਿੱਜੀ ਨੋਟ ਨੂੰ ਸੋਧੋ",
"account.node_modal.field_label": "ਨਿੱਜੀ ਨੋਟ",
"account.node_modal.save": "ਸੰਭਾਲੋ",
"account.node_modal.title": "ਕੋਈ ਨਿੱਜੀ ਨੋਟ ਜੋੜੋ",
"account.note.edit_button": "ਸੋਧੋ",
"account.note.title": "ਨਿੱਜੀ ਨੋਟ (ਸਿਰਫ਼ ਤੁਹਾਨੂੰ ਹੀ ਦਿਖਾਈ ਦਿੰਦਾ ਹੈ)",
"account.open_original_page": "ਅਸਲ ਸਫ਼ੇ ਨੂੰ ਖੋਲ੍ਹੋ",
"account.posts": "ਪੋਸਟਾਂ",
"account.posts_with_replies": "ਪੋਸਟਾਂ ਅਤੇ ਜਵਾਬ",
@@ -67,7 +100,10 @@
"account.requested_follow": "{name} ਨੇ ਤੁਹਾਨੂੰ ਫ਼ਾਲੋ ਕਰਨ ਦੀ ਬੇਨਤੀ ਕੀਤੀ ਹੈ",
"account.requests_to_follow_you": "ਤੁਹਾਨੂੰ ਫ਼ਾਲੋ ਕਰਨ ਦੀਆਂ ਬੇਨਤੀਆਂ",
"account.share": "{name} ਦਾ ਪਰੋਫ਼ਾਇਲ ਸਾਂਝਾ ਕਰੋ",
"account.show_reblogs": "@{name} ਵਲੋਂ ਬੂਸਟ ਨੂੰ ਵੇਖਾਓ",
"account.statuses_counter": "{count, plural, one {{counter} ਪੋਸਟ} other {{counter} ਪੋਸਟਾਂ}}",
"account.timeline.pinned": "ਟੰਗੇ ਹੋਏ",
"account.timeline.pinned.view_all": "ਸਭ ਟੰਗੀਆਂ ਹੋਈਆਂ ਪੋਸਟਾਂ ਨੂੰ ਵੇਖੋ",
"account.unblock": "@{name} ਤੋਂ ਪਾਬੰਦੀ ਹਟਾਓ",
"account.unblock_domain": "{domain} ਡੋਮੇਨ ਤੋਂ ਪਾਬੰਦੀ ਹਟਾਓ",
"account.unblock_domain_short": "ਪਾਬੰਦੀ ਹਟਾਓ",
@@ -92,6 +128,7 @@
"annual_report.summary.archetype.die_drei_fragezeichen": "???",
"annual_report.summary.close": "ਬੰਦ ਕਰੋ",
"annual_report.summary.copy_link": "ਲਿੰਕ ਨੂੰ ਕਾਪੀ ਕਰੋ",
"annual_report.summary.followers.new_followers": "{count, plural, one {ਨਵਾਂ ਫ਼ਾਲੋਅਰ} other {ਨਵੇਂ ਫ਼ਾਲੋਅਰ}}",
"annual_report.summary.highlighted_post.title": "ਸਭ ਤੋਂ ਵੱਧ ਹਰਮਨਪਿਆਰੀ ਪੋਸਟ",
"annual_report.summary.most_used_app.most_used_app": "ਸਭ ਤੋਂ ਵੱਧ ਵਰਤੀ ਐਪ",
"annual_report.summary.new_posts.new_posts": "ਨਵੀਆਂ ਪੋਸਟਾਂ",
@@ -108,13 +145,29 @@
"bundle_column_error.routing.title": "404",
"bundle_modal_error.close": "ਬੰਦ ਕਰੋ",
"bundle_modal_error.retry": "ਮੁੜ-ਕੋਸ਼ਿਸ਼ ਕਰੋ",
"callout.dismiss": "ਖ਼ਾਰਜ ਕਰੋ",
"carousel.current": "<sr>ਸਲਾਈਡ</sr> {current, number} / {max, number}",
"carousel.slide": "{max, number} ਵਿੱਚੋਂ {current, number} ਸਲਾਈਡ",
"closed_registrations_modal.find_another_server": "ਹੋਰ ਸਰਵਰ ਲੱਭੋ",
"closed_registrations_modal.title": "Mastodon ਲਈ ਸਾਈਨ ਅੱਪ ਕਰੋ",
"collections.collection_description": "ਵਰਣਨ",
"collections.collection_name": "ਨਾਂ",
"collections.collection_topic": "ਵਿਸ਼ਾ",
"collections.content_warning": "ਸਮੱਗਰੀ ਬਾਰੇ ਚੇਤਾਵਨੀ",
"collections.continue": "ਜਾਰੀ ਰੱਖੋ",
"collections.create.basic_details_title": "ਮੁ਼ੱਢਲੇ ਵੇਰਵੇ",
"collections.create.settings_title": "ਸੈਟਿੰਗਾਂ",
"collections.create.steps": "ਪੜਾਅ {step}/{total}",
"collections.edit_details": "ਮੁੱਢਲੇ ਵੇਰਵਿਆਂ ਨੂੰ ਸੋਧੋ",
"collections.edit_settings": "ਸੈਟਿੰਗਾਂ ਨੂੰ ਸੋਧੋ",
"collections.name_length_hint": "100 ਅੱਖਰਾਂ ਦੀ ਹੱਦ",
"collections.view_collection": "ਭੰਡਾਰ ਨੂੰ ਵੇਖੋ",
"collections.visibility_public": "ਜਨਤਕ",
"collections.visibility_title": "ਦਿੱਖ",
"column.about": "ਸਾਡੇ ਬਾਰੇ",
"column.blocks": "ਪਾਬੰਦੀ ਲਾਏ ਵਰਤੋਂਕਾਰ",
"column.bookmarks": "ਬੁੱਕਮਾਰਕ",
"column.collections": "ਮੇਰਾ ਭੰਡਾਰ",
"column.community": "ਲੋਕਲ ਸਮਾਂ-ਲਾਈਨ",
"column.create_list": "ਸੂਚੀ ਬਣਾਓ",
"column.direct": "ਨਿੱਜੀ ਜ਼ਿਕਰ",
@@ -139,6 +192,9 @@
"column_header.show_settings": "ਸੈਟਿੰਗਾਂ ਦਿਖਾਓ",
"column_header.unpin": "ਲਾਹੋ",
"column_search.cancel": "ਰੱਦ ਕਰੋ",
"combobox.loading": "ਲੋਡ ਹੋ ਰਿਹਾ ਹੈ",
"combobox.no_results_found": "ਇਸ ਖੋਜ ਲਈ ਕੋਈ ਨਤੀਜੇ ਨਹੀਂ ਹਨ",
"combobox.open_results": "ਨਤੀਜਿਆਂ ਨੂੰ ਵੇਖੋ",
"community.column_settings.local_only": "ਸਿਰਫ ਲੋਕਲ ਹੀ",
"community.column_settings.media_only": "ਸਿਰਫ ਮੀਡੀਆ ਹੀ",
"community.column_settings.remote_only": "ਸਿਰਫ਼ ਰਿਮੋਟ ਹੀ",
@@ -170,6 +226,9 @@
"confirmations.delete.confirm": "ਹਟਾਓ",
"confirmations.delete.message": "ਕੀ ਤੁਸੀਂ ਇਹ ਪੋਸਟ ਨੂੰ ਹਟਾਉਣਾ ਚਾਹੁੰਦੇ ਹੋ?",
"confirmations.delete.title": "ਪੋਸਟ ਨੂੰ ਹਟਾਉਣਾ ਹੈ?",
"confirmations.delete_collection.confirm": "ਹਟਾਓ",
"confirmations.delete_collection.message": "ਇਸ ਕਾਰਵਾਈ ਨੂੰ ਵਾਪਸ ਨਹੀਂ ਪਰਤਾਇਆ ਜਾ ਸਕਦਾ ਹੈ।",
"confirmations.delete_collection.title": "\"{name}\" ਨੂੰ ਹਟਾਉਣਾ ਹੈ?",
"confirmations.delete_list.confirm": "ਹਟਾਓ",
"confirmations.delete_list.message": "ਕੀ ਤੁਸੀਂ ਇਸ ਸੂਚੀ ਨੂੰ ਪੱਕੇ ਤੌਰ ਉੱਤੇ ਹਟਾਉਣਾ ਚਾਹੁੰਦੇ ਹੋ?",
"confirmations.delete_list.title": "ਸੂਚੀ ਨੂੰ ਹਟਾਉਣਾ ਹੈ?",
@@ -187,6 +246,7 @@
"confirmations.missing_alt_text.title": "ਬਦਲਵੀ ਲਿਖਤ ਜੋੜਨੀ ਹੈ?",
"confirmations.mute.confirm": "ਮੌਨ ਕਰੋ",
"confirmations.private_quote_notify.cancel": "ਸੋਧ ਕਰਨ ਉੱਤੇ ਵਾਪਸ ਜਾਓ",
"confirmations.private_quote_notify.confirm": "ਜਨਤਕ ਪੋਸਟ",
"confirmations.private_quote_notify.do_not_show_again": "ਮੈਨੂੰ ਇਹ ਸੁਨੇਹਾ ਫੇਰ ਨਾ ਦਿਖਾਓ",
"confirmations.quiet_post_quote_info.dismiss": "ਮੈਨੂੰ ਮੁੜ ਕੇ ਯਾਦ ਨਾ ਕਰਵਾਓ",
"confirmations.quiet_post_quote_info.got_it": "ਸਮਝ ਗਏ",
@@ -258,6 +318,8 @@
"explore.trending_statuses": "ਪੋਸਟਾਂ",
"explore.trending_tags": "ਹੈਸ਼ਟੈਗ",
"featured_carousel.header": "{count, plural, one {ਟੰਗੀ ਹੋਈ ਪੋਸਟ} other {ਟੰਗੀਆਂ ਹੋਈਆਂ ਪੋਸਟਾਂ}}",
"featured_carousel.slide": "{max, number} ਵਿੱਚੋਂ {current, number} ਪੋਸਟ",
"featured_tags.more_items": "+{count}",
"filter_modal.added.expired_title": "ਫਿਲਟਰ ਦੀ ਮਿਆਦ ਪੁੱਗੀ!",
"filter_modal.added.review_and_configure_title": "ਫਿਲਟਰ ਸੈਟਿੰਗਾਂ",
"filter_modal.added.settings_link": "ਸੈਟਿੰਗਾਂ ਸਫ਼ਾ",
@@ -291,6 +353,7 @@
"footer.source_code": "ਸਰੋਤ ਕੋਡ ਵੇਖੋ",
"footer.status": "ਹਾਲਤ",
"footer.terms_of_service": "ਸੇਵਾ ਦੀਆਂ ਸ਼ਰਤਾਂ",
"form_field.optional": "(ਚੋਣਵਾਂ)",
"generic.saved": "ਸਾਂਭੀ ਗਈ",
"getting_started.heading": "ਸ਼ੁਰੂ ਕਰੀਏ",
"hashtag.browse": "#{hashtag} ਵਿੱਚ ਪੋਸਟਾਂ ਨੂੰ ਵੇਖੋ",
@@ -303,10 +366,13 @@
"hashtag.column_settings.tag_mode.any": "ਇਹਨਾਂ ਵਿੱਚੋਂ ਕੋਈ",
"hashtag.column_settings.tag_mode.none": "ਇਹਨਾਂ ਵਿੱਚੋਂ ਕੋਈ ਨਹੀਂ",
"hashtag.column_settings.tag_toggle": "Include additional tags in this column",
"hashtag.counter_by_accounts": "{count, plural, one {{counter} ਹਿੱਸੇਦਾਰ} other {{counter} ਹਿੱਸੇਦਾਰ}}",
"hashtag.feature": "ਪਰੋਫਾਇਲ ਉੱਤੇ ਫ਼ੀਚਰ",
"hashtag.follow": "ਹੈਸ਼ਟੈਗ ਨੂੰ ਫ਼ਾਲੋ ਕਰੋ",
"hashtag.mute": "#{hashtag} ਨੂੰ ਮੌਨ ਕਰੋ",
"hashtag.unfeature": "ਪਰੋਫਾਇਲ ਉੱਤੇ ਫ਼ੀਚਰ ਨਾ ਕਰੋ",
"hashtag.unfollow": "ਹੈਸ਼ਟੈਗ ਨੂੰ ਅਣ-ਫ਼ਾਲੋ ਕਰੋ",
"hashtags.and_other": "…ਅਤੇ {count, plural, one {}other {# ਹੋਰ}}",
"hints.profiles.see_more_followers": "{domain} ਉੱਤੇ ਹੋਰ ਫ਼ਾਲੋਅਰ ਵੇਖੋ",
"hints.profiles.see_more_follows": "{domain} ਉੱਤੇ ਹੋਰ ਫ਼ਾਲੋ ਨੂੰ ਵੇਖੋ",
"hints.profiles.see_more_posts": "{domain} ਉੱਤੇ ਹੋਰ ਪੋਸਟਾਂ ਨੂੰ ਵੇਖੋ",
@@ -421,6 +487,7 @@
"navigation_bar.search_trends": "ਖੋਜ / ਰੁਝਾਨ",
"not_signed_in_indicator.not_signed_in": "ਇਹ ਸਰੋਤ ਵਰਤਣ ਲਈ ਤੁਹਾਨੂੰ ਲਾਗਇਨ ਕਰਨ ਦੀ ਲੋੜ ਹੈ।",
"notification.admin.sign_up": "{name} ਨੇ ਸਾਈਨ ਅੱਪ ਕੀਤਾ",
"notification.annual_report.view": "#Wrapstodon ਨੂੰ ਵੇਖੋ",
"notification.favourite": "{name} ਨੇ ਤੁਹਾਡੀ ਪੋਸਟ ਨੂੰ ਪਸੰਦ ਕੀਤਾ",
"notification.favourite_pm": "{name} ਨੇ ਤੁਹਾਡੇ ਨਿੱਜੀ ਜ਼ਿਕਰ ਨੂੰ ਪਸੰਦ ਕੀਤਾ",
"notification.follow": "{name} ਨੇ ਤੁਹਾਨੂੰ ਫ਼ਾਲੋ ਕੀਤਾ",

View File

@@ -23,6 +23,7 @@
"account.badges.domain_blocked": "Domínio bloqueado",
"account.badges.group": "Grupo",
"account.badges.muted": "Silenciado",
"account.badges.muted_until": "Silenciado até {until}",
"account.block": "Bloquear @{name}",
"account.block_domain": "Bloquear domínio {domain}",
"account.block_short": "Bloquear",
@@ -122,6 +123,8 @@
"account.share": "Partilhar o perfil @{name}",
"account.show_reblogs": "Mostrar partilhas de @{name}",
"account.statuses_counter": "{count, plural, one {{counter} publicação} other {{counter} publicações}}",
"account.timeline.pinned": "Fixado",
"account.timeline.pinned.view_all": "Ver todos as publicações fixadas",
"account.unblock": "Desbloquear @{name}",
"account.unblock_domain": "Desbloquear o domínio {domain}",
"account.unblock_domain_short": "Desbloquear",
@@ -236,17 +239,34 @@
"collections.collection_description": "Descrição",
"collections.collection_name": "Nome",
"collections.collection_topic": "Tópico",
"collections.content_warning": "Aviso de conteúdo",
"collections.continue": "Continuar",
"collections.create.accounts_subtitle": "Apenas as contas que segue e que optaram por ser descobertas podem ser adicionadas.",
"collections.create.accounts_title": "Quem vai destacar nesta coleção?",
"collections.create.basic_details_title": "Informações básicas",
"collections.create.settings_title": "Definições",
"collections.create.steps": "Passo {step}/{total}",
"collections.create_a_collection_hint": "Crie uma coleção para recomendar ou partilhar as suas contas favoritas com outras pessoas.",
"collections.create_collection": "Criar coleção",
"collections.delete_collection": "Eliminar coleção",
"collections.description_length_hint": "Limite de 100 caracteres",
"collections.edit_details": "Editar informações básicas",
"collections.edit_settings": "Editar definições",
"collections.error_loading_collections": "Ocorreu um erro ao tentar carregar as suas coleções.",
"collections.manage_accounts": "Gerir contas",
"collections.manage_accounts_in_collection": "Gerir contas nesta coleção",
"collections.mark_as_sensitive": "Marcar como sensível",
"collections.mark_as_sensitive_hint": "Oculta a descrição e as contas da coleção por trás de um aviso de conteúdo. O nome da coleção ainda estará visível.",
"collections.name_length_hint": "Limite de 100 caracteres",
"collections.new_collection": "Nova coleção",
"collections.no_collections_yet": "Ainda não existem coleções.",
"collections.topic_hint": "Adicione uma etiqueta para ajudar outros a entender o tópico principal desta coleção.",
"collections.view_collection": "Ver coleções",
"collections.visibility_public": "Pública",
"collections.visibility_public_hint": "Visível nos resultados de pesquisa e outras áreas onde aparecem recomendações.",
"collections.visibility_title": "Visibilidade",
"collections.visibility_unlisted": "Não listada",
"collections.visibility_unlisted_hint": "Visível para qualquer pessoa com uma hiperligação. Não aparece nos resultados de pesquisa e recomendações.",
"column.about": "Sobre",
"column.blocks": "Utilizadores bloqueados",
"column.bookmarks": "Marcadores",
@@ -277,6 +297,11 @@
"column_header.show_settings": "Mostrar configurações",
"column_header.unpin": "Desafixar",
"column_search.cancel": "Cancelar",
"combobox.close_results": "Fechar resultados",
"combobox.loading": "A carregar",
"combobox.no_results_found": "Nenhum resultado para esta pesquisa",
"combobox.open_results": "Ver resultados",
"combobox.results_available": "{count, plural, one {# sugestão disponível} other {# sugestões disponíveis}}. Utilize as setas para cima e para baixo para navegar. Pressione a tecla Enter para selecionar.",
"community.column_settings.local_only": "Apenas local",
"community.column_settings.media_only": "Apenas multimédia",
"community.column_settings.remote_only": "Apenas remoto",
@@ -444,6 +469,7 @@
"empty_column.notification_requests": "Tudo limpo! Não há nada aqui. Quando receberes novas notificações, elas aparecerão aqui conforme as tuas configurações.",
"empty_column.notifications": "Ainda não tens quaisquer notificações. Quando outras pessoas interagirem contigo, verás isso aqui.",
"empty_column.public": "Não há nada aqui! Escreve algo publicamente ou segue outros utilizadores para veres aqui os conteúdos públicos",
"empty_state.no_results": "Sem resultados",
"error.no_hashtag_feed_access": "Inscreva-se ou inicie sessão para ver e seguir esta etiqueta.",
"error.unexpected_crash.explanation": "Devido a um erro no nosso código ou a um problema de compatibilidade do navegador, esta página não pode ser apresentada corretamente.",
"error.unexpected_crash.explanation_addons": "Esta página não pode ser mostrada corretamente. Este erro provavelmente é causado por um complemento do navegador ou ferramentas de tradução automática.",

View File

@@ -123,6 +123,8 @@
"account.share": "@{name} adlı kişinin profilini paylaş",
"account.show_reblogs": "@{name} kişisinin yeniden paylaşımlarını göster",
"account.statuses_counter": "{count, plural, one {{counter} gönderi} other {{counter} gönderi}}",
"account.timeline.pinned": "Sabitlendi",
"account.timeline.pinned.view_all": "Tüm sabitlenmiş gönderileri görüntüle",
"account.unblock": "@{name} adlı kişinin engelini kaldır",
"account.unblock_domain": "{domain} alan adının engelini kaldır",
"account.unblock_domain_short": "Engeli kaldır",
@@ -295,6 +297,11 @@
"column_header.show_settings": "Ayarları göster",
"column_header.unpin": "Sabitlemeyi kaldır",
"column_search.cancel": "İptal",
"combobox.close_results": "Sonuçları kapat",
"combobox.loading": "Yükleniyor",
"combobox.no_results_found": "Bu arama için hiçbir sonuç bulunamadı",
"combobox.open_results": "Sonuçları aç",
"combobox.results_available": "{count, plural, one {# öneri} other {# öneri}} var. Önerileri görmek için yukarı ve aşağı ok tuşlarını kullanın. Seçmek için Enter tuşuna basın.",
"community.column_settings.local_only": "Sadece yerel",
"community.column_settings.media_only": "Sadece medya",
"community.column_settings.remote_only": "Sadece uzak",
@@ -462,6 +469,7 @@
"empty_column.notification_requests": "Hepsi tamam! Burada yeni bir şey yok. Yeni bildirim aldığınızda, ayarlarınıza göre burada görüntülenecekler.",
"empty_column.notifications": "Henüz bildiriminiz yok. Sohbete başlamak için başkalarıyla etkileşim kurun.",
"empty_column.public": "Burada hiçbir şey yok! Herkese açık bir şeyler yazın veya burayı doldurmak için diğer sunuculardaki kullanıcıları takip edin",
"empty_state.no_results": "Sonuç yok",
"error.no_hashtag_feed_access": "Bu etiketi görüntülemek ve takip etmek için katılın veya giriş yapın.",
"error.unexpected_crash.explanation": "Bizim kodumuzdaki bir hatadan ya da tarayıcı uyumluluk sorunundan dolayı, bu sayfa düzgün görüntülenemedi.",
"error.unexpected_crash.explanation_addons": "Bu sayfa doğru görüntülenemedi. Bu hata büyük olasılıkla bir tarayıcı eklentisinden veya otomatik çeviri araçlarından kaynaklanır.",

View File

@@ -441,7 +441,7 @@
"interaction_modal.on_another_server": "На іншому сервері",
"interaction_modal.on_this_server": "На цьому сервері",
"interaction_modal.title": "Увійдіть, щоб продовжити",
"interaction_modal.username_prompt": "Наприклад, %{example}",
"interaction_modal.username_prompt": "Наприклад, {example}",
"intervals.full.days": "{number, plural, one {# день} few {# дні} other {# днів}}",
"intervals.full.hours": "{number, plural, one {# година} few {# години} other {# годин}}",
"intervals.full.minutes": "{number, plural, one {# хвилина} few {# хвилини} other {# хвилин}}",

View File

@@ -0,0 +1,23 @@
# frozen_string_literal: true
class ActivityPub::UpdateFeaturedCollectionSerializer < ActivityPub::Serializer
attributes :id, :type, :actor, :to
has_one :object, serializer: ActivityPub::FeaturedCollectionSerializer
def id
[ActivityPub::TagManager.instance.uri_for(object), '#updates/', object.updated_at.to_i].join
end
def type
'Update'
end
def actor
ActivityPub::TagManager.instance.uri_for(object.account)
end
def to
[ActivityPub::TagManager::COLLECTIONS[:public]]
end
end

View File

@@ -0,0 +1,28 @@
# frozen_string_literal: true
class UpdateCollectionService
UPDATEABLE_PARAMS = %w(name description language sensitive discoverable tag_id).freeze
def call(collection, params)
@collection = collection
@collection.update!(params)
distribute_update_activity if Mastodon::Feature.collections_federation_enabled?
end
private
def distribute_update_activity
return unless relevant_attributes_changed?
ActivityPub::AccountRawDistributionWorker.perform_async(activity_json, @collection.account.id)
end
def activity_json
ActiveModelSerializers::SerializableResource.new(@collection, serializer: ActivityPub::UpdateFeaturedCollectionSerializer, adapter: ActivityPub::Adapter).to_json
end
def relevant_attributes_changed?
(@collection.saved_changes.keys & UPDATEABLE_PARAMS).any?
end
end

View File

@@ -245,7 +245,7 @@ el:
update_user_role: Ενημέρωση ρόλου
update_username_block: Ενημέρωση Κανόνα Ονόματος Χρήστη
actions:
approve_appeal_html: Ο/Η %{name} ενέκρινε την ένσταση της απόφασης των συντονιστών από %{target}
approve_appeal_html: Ο/Η %{name} ενέκρινε την έφεση της απόφασης των συντονιστών από %{target}
approve_user_html: Ο/Η %{name} ενέκρινε την εγγραφή του χρήστη %{target}
assigned_to_self_report_html: Ο/Η %{name} ανάθεσε την αναφορά %{target} στον εαυτό του/της
change_email_user_html: Ο χρήστης %{name} άλλαξε τη διεύθυνση email του χρήστη %{target}
@@ -289,7 +289,7 @@ el:
memorialize_account_html: O/H %{name} μετέτρεψε τον λογαριασμό του %{target} σε σελίδα εις μνήμην
promote_user_html: Ο/Η %{name} προβίβασε το χρήστη %{target}
publish_terms_of_service_html: Ο χρήστης %{name} δημοσίευσε ενημερώσεις για τους όρους της υπηρεσίας
reject_appeal_html: Ο/Η %{name} απέρριψε την ένσταση της απόφασης των συντονιστών από %{target}
reject_appeal_html: Ο/Η %{name} απέρριψε την έφεση της απόφασης των συντονιστών από %{target}
reject_user_html: Ο/Η %{name} απέρριψε την εγγραφή του χρήστη %{target}
remove_avatar_user_html: Ο/Η %{name} αφαίρεσε το άβαταρ του/της %{target}
reopen_report_html: Ο/Η %{name} ξανάνοιξε την αναφορά %{target}
@@ -403,7 +403,7 @@ el:
website: Ιστοσελίδα
disputes:
appeals:
empty: Καμία ένσταση.
empty: Δε βρέθηκαν εφέσεις.
title: Εφέσεις
domain_allows:
add_new: Έγκριση τομέα
@@ -1166,7 +1166,7 @@ el:
mark_statuses_as_sensitive: να επισημάνουν τις αναρτήσεις τους ως ευαίσθητες
none: μια προειδοποίηση
sensitive: να επισημάνουν τον λογαριασμό του ως ευαίσθητο
silence: να περιορίσουν το λογαριασμό του
silence: να περιορίσουν τον λογαριασμό του
suspend: να αναστείλουν τον λογαριασμό του
body: 'Ο/Η %{target} κάνει έφεση στην απόφαση συντονισμού που έγινε από τον/την %{action_taken_by} στις %{date}, η οποία ήταν %{type}. Έγραψαν:'
next_steps: Μπορείς να εγκρίνεις την έφεση για να αναιρέσεις την απόφαση της ομάδας συντονισμού ή να την αγνοήσεις.
@@ -2095,7 +2095,7 @@ el:
title: Σημαντική ενημέρωση
warning:
appeal: Υποβολή έφεσης
appeal_description: Αν πιστεύεις ότι έγινε λάθος, μπορείς να υποβάλεις μια αίτηση στο προσωπικό του %{instance}.
appeal_description: Αν πιστεύεις ότι έγινε λάθος, μπορείς να υποβάλεις μια έφεση στο προσωπικό του %{instance}.
categories:
spam: Ανεπιθύμητο
violation: Το περιεχόμενο παραβιάζει τις ακόλουθες οδηγίες κοινότητας

View File

@@ -12,6 +12,9 @@ es:
followers:
one: Seguidor
other: Seguidores
following:
one: Siguiendo
other: Siguiendo
instance_actor_flash: Esta cuenta es un actor virtual utilizado para representar al propio servidor y no a ningún usuario individual. Se utiliza con fines de federación y no debe suspenderse.
last_active: última conexión
link_verified_on: La propiedad de este vínculo fue verificada el %{date}
@@ -1999,9 +2002,9 @@ es:
'63113904': 2 años
'7889238': 3 meses
min_age_label: Umbral de tiempo
min_favs: Mantener mensajes con un número de favoritos mayor que
min_favs: Mantener publicaciones con un número de favoritos de al menos
min_favs_hint: No borra ninguna de las publicaciones que hayan recibido al menos esta cantidad de favoritos. Deja en blanco para eliminar publicaciones sin importar el número de favoritos
min_reblogs: Mantener publicaciones reblogueadas más de
min_reblogs: Mantener publicaciones impulsadas al menos
min_reblogs_hint: No borra ninguna de las publicaciones que hayan sido impulsadas más de este número de veces. Deja en blanco para eliminar publicaciones sin importar el número de impulsos
stream_entries:
sensitive_content: Contenido sensible

View File

@@ -12,6 +12,9 @@ hu:
followers:
one: Követő
other: Követő
following:
one: Követve
other: Követve
instance_actor_flash: Ez a fiók virtuális, magát a kiszolgálót reprezentálja, nem pedig konkrét felhasználót. Föderációs célokra szolgál, nem szabad tehát felfüggeszteni.
last_active: utoljára aktív
link_verified_on: 'A hivatkozás tulajdonosa ekkor volt ellenőrizve: %{date}'

View File

@@ -12,6 +12,9 @@ nl:
followers:
one: Volger
other: Volgers
following:
one: Volgend
other: Volgend
instance_actor_flash: Dit account is een 'virtual actor' waarmee de server zichzelf vertegenwoordigt en is dus geen individuele gebruiker. Het wordt voor federatiedoeleinden gebruikt en moet niet worden opgeschort.
last_active: laatst actief
link_verified_on: Eigendom van deze link is gecontroleerd op %{date}

View File

@@ -12,6 +12,9 @@ pt-PT:
followers:
one: Seguidor
other: Seguidores
following:
one: A seguir
other: A seguir
instance_actor_flash: Esta conta é um ator virtual utilizado para representar o servidor em si e não um utilizador individual. É utilizada para efeitos de federação e não deve ser suspensa.
last_active: última atividade
link_verified_on: A posse desta hiperligação foi verificada em %{date}

View File

@@ -5,6 +5,10 @@ const config = {
'*.{css,scss}': 'stylelint --fix',
'*.haml': 'bin/haml-lint -a',
'**/*.ts?(x)': () => 'tsc -p tsconfig.json --noEmit',
'app/javascript/**/*.{js,jsx,ts,tsx}': () => [
`yarn i18n:extract`,
'git diff --exit-code app/javascript/mastodon/locales/en.json',
],
};
module.exports = config;

View File

@@ -0,0 +1,27 @@
# frozen_string_literal: true
require 'rails_helper'
RSpec.describe ActivityPub::UpdateFeaturedCollectionSerializer do
subject { serialized_record_json(collection, described_class, adapter: ActivityPub::Adapter) }
let(:tag_manager) { ActivityPub::TagManager.instance }
let(:collection) { Fabricate(:collection) }
it 'serializes to the expected json' do
expect(subject).to include({
'id' => "#{tag_manager.uri_for(collection)}#updates/#{collection.updated_at.to_i}",
'type' => 'Update',
'actor' => tag_manager.uri_for(collection.account),
'to' => ['https://www.w3.org/ns/activitystreams#Public'],
'object' => a_hash_including({
'id' => tag_manager.uri_for(collection),
'type' => 'FeaturedCollection',
}),
})
expect(subject).to_not have_key('published')
expect(subject).to_not have_key('cc')
expect(subject).to_not have_key('target')
end
end

View File

@@ -0,0 +1,43 @@
# frozen_string_literal: true
require 'rails_helper'
RSpec.describe UpdateCollectionService do
subject { described_class.new }
let(:collection) { Fabricate(:collection) }
describe '#call' do
context 'when given valid parameters' do
it 'updates the collection' do
subject.call(collection, { name: 'Newly updated name' })
expect(collection.name).to eq 'Newly updated name'
end
context 'when something actually changed' do
it 'federates an `Update` activity', feature: :collections_federation do
subject.call(collection, { name: 'updated' })
expect(ActivityPub::AccountRawDistributionWorker).to have_enqueued_sidekiq_job
end
end
context 'when nothing changed' do
it 'does not federate an activity', feature: :collections_federation do
subject.call(collection, { name: collection.name })
expect(ActivityPub::AccountRawDistributionWorker).to_not have_enqueued_sidekiq_job
end
end
end
context 'when given invalid parameters' do
it 'raises an exception' do
expect do
subject.call(collection, { name: '' })
end.to raise_error(ActiveRecord::RecordInvalid)
end
end
end
end

View File

@@ -3,75 +3,95 @@
require 'rails_helper'
RSpec.describe EmailMxValidator do
describe '#validate' do
let(:user) { instance_double(User, email: 'foo@example.com', sign_up_ip: '1.2.3.4', errors: instance_double(ActiveModel::Errors, add: nil)) }
let(:resolv_dns_double) { instance_double(Resolv::DNS) }
let(:user) { Fabricate.build :user, email: }
let(:email) { 'foo@example.com' }
let(:resolv_dns_double) { instance_double(Resolv::DNS) }
context 'with an e-mail domain that is explicitly allowed' do
around do |block|
tmp = Rails.configuration.x.email_domains_allowlist
Rails.configuration.x.email_domains_allowlist = 'example.com'
block.call
Rails.configuration.x.email_domains_allowlist = tmp
end
context 'with an e-mail domain that is explicitly allowed' do
around do |example|
original = Rails.configuration.x.email_domains_allowlist
Rails.configuration.x.email_domains_allowlist = 'example.com'
example.run
Rails.configuration.x.email_domains_allowlist = original
end
it 'does not add errors if there are no DNS records' do
configure_resolver('example.com')
context 'when there are not DNS records' do
before { configure_resolver('example.com') }
it 'does not add errors to record' do
subject.validate(user)
expect(user.errors).to_not have_received(:add)
expect(user.errors).to be_empty
end
end
end
it 'adds no error if there are DNS records for the e-mail domain' do
configure_resolver('example.com', a: resolv_double_a('192.0.2.42'))
context 'when there are DNS records for the domain' do
before { configure_resolver('example.com', a: resolv_double_a('192.0.2.42')) }
it 'does not add errors to record' do
subject.validate(user)
expect(user.errors).to_not have_received(:add)
expect(user.errors).to be_empty
end
end
context 'when the TagManager fails to normalize the domain' do
before do
allow(TagManager).to receive(:instance).and_return(tag_manage_double)
allow(tag_manage_double).to receive(:normalize_domain).with('example.com').and_raise(Addressable::URI::InvalidURIError)
end
it 'adds an error if the TagManager fails to normalize domain' do
double = instance_double(TagManager)
allow(TagManager).to receive(:instance).and_return(double)
allow(double).to receive(:normalize_domain).with('example.com').and_raise(Addressable::URI::InvalidURIError)
let(:tag_manage_double) { instance_double(TagManager) }
user = instance_double(User, email: 'foo@example.com', errors: instance_double(ActiveModel::Errors, add: nil))
it 'adds errors to record' do
subject.validate(user)
expect(user.errors).to have_received(:add)
expect(user.errors).to be_present
end
end
it 'adds an error if the domain email portion is blank' do
user = instance_double(User, email: 'foo@', errors: instance_double(ActiveModel::Errors, add: nil))
context 'when the email portion is blank' do
let(:email) { 'foo@' }
it 'adds errors to record' do
subject.validate(user)
expect(user.errors).to have_received(:add)
expect(user.errors).to be_present
end
end
it 'adds an error if the email domain name contains empty labels' do
configure_resolver('example..com', a: resolv_double_a('192.0.2.42'))
context 'when the email domain contains empty labels' do
let(:email) { 'foo@example..com' }
user = instance_double(User, email: 'foo@example..com', sign_up_ip: '1.2.3.4', errors: instance_double(ActiveModel::Errors, add: nil))
before { configure_resolver('example..com', a: resolv_double_a('192.0.2.42')) }
it 'adds errors to record' do
subject.validate(user)
expect(user.errors).to have_received(:add)
expect(user.errors).to be_present
end
end
it 'adds an error if there are no DNS records for the e-mail domain' do
configure_resolver('example.com')
context 'when there are no DNS records for the email domain' do
before { configure_resolver('example.com') }
it 'adds errors to record' do
subject.validate(user)
expect(user.errors).to have_received(:add)
expect(user.errors).to be_present
end
end
it 'adds an error if a MX record does not lead to an IP' do
context 'when MX record does not lead to an IP' do
before do
configure_resolver('example.com', mx: resolv_double_mx('mail.example.com'))
configure_resolver('mail.example.com')
subject.validate(user)
expect(user.errors).to have_received(:add)
end
it 'adds an error if the MX record has an email domain block' do
EmailDomainBlock.create!(domain: 'mail.example.com')
it 'adds errors to record' do
subject.validate(user)
expect(user.errors).to be_present
end
end
context 'when the MX record has an email domain block' do
before do
Fabricate :email_domain_block, domain: 'mail.example.com'
configure_resolver(
'example.com',
mx: resolv_double_mx('mail.example.com')
@@ -81,12 +101,16 @@ RSpec.describe EmailMxValidator do
a: instance_double(Resolv::DNS::Resource::IN::A, address: '2.3.4.5'),
aaaa: instance_double(Resolv::DNS::Resource::IN::AAAA, address: 'fd00::2')
)
end
it 'adds errors to record' do
subject.validate(user)
expect(user.errors).to have_received(:add)
expect(user.errors).to be_present
end
end
private
def configure_resolver(domain, options = {})
allow(resolv_dns_double)
.to receive(:getresources)

View File

@@ -5536,13 +5536,13 @@ __metadata:
linkType: hard
"axios@npm:^1.4.0":
version: 1.13.4
resolution: "axios@npm:1.13.4"
version: 1.13.5
resolution: "axios@npm:1.13.5"
dependencies:
follow-redirects: "npm:^1.15.6"
form-data: "npm:^4.0.4"
follow-redirects: "npm:^1.15.11"
form-data: "npm:^4.0.5"
proxy-from-env: "npm:^1.1.0"
checksum: 10c0/474c00b7d71f4de4ad562589dae6b615149df7c2583bbc5ebba96229f3f85bfb0775d23705338df072f12e48d3e85685c065a3cf6855d58968a672d19214c728
checksum: 10c0/abf468c34f2d145f3dc7dbc0f1be67e520630624307bda69a41bbe8d386bd672d87b4405c4ee77f9ff54b235ab02f96a9968fb00e75b13ce64706e352a3068fd
languageName: node
linkType: hard
@@ -7740,13 +7740,13 @@ __metadata:
languageName: node
linkType: hard
"follow-redirects@npm:^1.15.6":
version: 1.15.6
resolution: "follow-redirects@npm:1.15.6"
"follow-redirects@npm:^1.15.11":
version: 1.15.11
resolution: "follow-redirects@npm:1.15.11"
peerDependenciesMeta:
debug:
optional: true
checksum: 10c0/9ff767f0d7be6aa6870c82ac79cf0368cd73e01bbc00e9eb1c2a16fbb198ec105e3c9b6628bb98e9f3ac66fe29a957b9645bcb9a490bb7aa0d35f908b6b85071
checksum: 10c0/d301f430542520a54058d4aeeb453233c564aaccac835d29d15e050beb33f339ad67d9bddbce01739c5dc46a6716dbe3d9d0d5134b1ca203effa11a7ef092343
languageName: node
linkType: hard
@@ -7769,16 +7769,16 @@ __metadata:
languageName: node
linkType: hard
"form-data@npm:^4.0.4":
version: 4.0.4
resolution: "form-data@npm:4.0.4"
"form-data@npm:^4.0.5":
version: 4.0.5
resolution: "form-data@npm:4.0.5"
dependencies:
asynckit: "npm:^0.4.0"
combined-stream: "npm:^1.0.8"
es-set-tostringtag: "npm:^2.1.0"
hasown: "npm:^2.0.2"
mime-types: "npm:^2.1.12"
checksum: 10c0/373525a9a034b9d57073e55eab79e501a714ffac02e7a9b01be1c820780652b16e4101819785e1e18f8d98f0aee866cc654d660a435c378e16a72f2e7cac9695
checksum: 10c0/dd6b767ee0bbd6d84039db12a0fa5a2028160ffbfaba1800695713b46ae974a5f6e08b3356c3195137f8530dcd9dfcb5d5ae1eeff53d0db1e5aad863b619ce3b
languageName: node
linkType: hard
@@ -14264,15 +14264,15 @@ __metadata:
linkType: hard
"vite-tsconfig-paths@npm:^6.0.0":
version: 6.0.5
resolution: "vite-tsconfig-paths@npm:6.0.5"
version: 6.1.0
resolution: "vite-tsconfig-paths@npm:6.1.0"
dependencies:
debug: "npm:^4.1.1"
globrex: "npm:^0.1.2"
tsconfck: "npm:^3.0.3"
peerDependencies:
vite: "*"
checksum: 10c0/c62dd84804b9d2d35460146bda0bb752d270043d805df0e806ade6a9bbf37c5ad5da8a29d822b89931821545c201bc7ca07c594f245aebabe92d51d0cd1b63df
checksum: 10c0/b2c9edb43592f4c4e4c4b9f1a613a196e78b727a8ffdd77a4bad1833dcf903fb9a8b23eabf5113f800585f87c2e8e9f93cba9a0e21cfe9a7e58edc7e9edcb3f5
languageName: node
linkType: hard