Merge commit 'a3902997440c71f161e392f1ad6c5cdcf6aba95d' into glitch-soc/merge-upstream

Conflicts:
- `app/controllers/accounts_controller.rb`:
  Conflict due to glitch-soc's local-only posting feature.
  Refactored as upstream did but kept local changes.
- `app/lib/account_statuses_filter.rb`:
  Conflict due to glitch-soc's local-only posting feature.
  Refactored as upstream did but kept local changes.
pull/2699/head
Claire 2024-05-01 19:30:41 +02:00
commit 360590ecd8
62 changed files with 309 additions and 186 deletions

View File

@ -102,17 +102,17 @@ GEM
attr_required (1.0.2) attr_required (1.0.2)
awrence (1.2.1) awrence (1.2.1)
aws-eventstream (1.3.0) aws-eventstream (1.3.0)
aws-partitions (1.899.0) aws-partitions (1.914.0)
aws-sdk-core (3.191.5) aws-sdk-core (3.192.0)
aws-eventstream (~> 1, >= 1.3.0) aws-eventstream (~> 1, >= 1.3.0)
aws-partitions (~> 1, >= 1.651.0) aws-partitions (~> 1, >= 1.651.0)
aws-sigv4 (~> 1.8) aws-sigv4 (~> 1.8)
jmespath (~> 1, >= 1.6.1) jmespath (~> 1, >= 1.6.1)
aws-sdk-kms (1.78.0) aws-sdk-kms (1.79.0)
aws-sdk-core (~> 3, >= 3.191.0) aws-sdk-core (~> 3, >= 3.191.0)
aws-sigv4 (~> 1.1) aws-sigv4 (~> 1.1)
aws-sdk-s3 (1.146.1) aws-sdk-s3 (1.147.0)
aws-sdk-core (~> 3, >= 3.191.0) aws-sdk-core (~> 3, >= 3.192.0)
aws-sdk-kms (~> 1) aws-sdk-kms (~> 1)
aws-sigv4 (~> 1.8) aws-sigv4 (~> 1.8)
aws-sigv4 (1.8.0) aws-sigv4 (1.8.0)

View File

@ -46,7 +46,7 @@ class AccountsController < ApplicationController
end end
def default_statuses def default_statuses
@account.statuses.not_local_only.where(visibility: [:public, :unlisted]) @account.statuses.not_local_only.distributable_visibility
end end
def only_media_scope def only_media_scope

View File

@ -31,7 +31,7 @@ class ActivityPub::RepliesController < ActivityPub::BaseController
def set_replies def set_replies
@replies = only_other_accounts? ? Status.where.not(account_id: @account.id).joins(:account).merge(Account.without_suspended) : @account.statuses @replies = only_other_accounts? ? Status.where.not(account_id: @account.id).joins(:account).merge(Account.without_suspended) : @account.statuses
@replies = @replies.where(in_reply_to_id: @status.id, visibility: [:public, :unlisted]) @replies = @replies.distributable_visibility.where(in_reply_to_id: @status.id)
@replies = @replies.paginate_by_min_id(DESCENDANTS_LIMIT, params[:min_id]) @replies = @replies.paginate_by_min_id(DESCENDANTS_LIMIT, params[:min_id])
end end

View File

@ -23,7 +23,7 @@ class Api::V1::Statuses::RebloggedByAccountsController < Api::V1::Statuses::Base
end end
def paginated_statuses def paginated_statuses
Status.where(reblog_of_id: @status.id).where(visibility: [:public, :unlisted]).paginate_by_max_id( Status.where(reblog_of_id: @status.id).distributable_visibility.paginate_by_max_id(
limit_param(DEFAULT_ACCOUNTS_LIMIT), limit_param(DEFAULT_ACCOUNTS_LIMIT),
params[:max_id], params[:max_id],
params[:since_id] params[:since_id]

View File

@ -298,7 +298,6 @@
"filter_modal.select_filter.title": "Филтриране на публ.", "filter_modal.select_filter.title": "Филтриране на публ.",
"filter_modal.title.status": "Филтриране на публ.", "filter_modal.title.status": "Филтриране на публ.",
"filtered_notifications_banner.pending_requests": "Известията от {count, plural, =0 {никого, когото може да познавате} one {едно лице, което може да познавате} other {# души, които може да познавате}}", "filtered_notifications_banner.pending_requests": "Известията от {count, plural, =0 {никого, когото може да познавате} one {едно лице, което може да познавате} other {# души, които може да познавате}}",
"filtered_notifications_banner.private_mentions": "{count, plural, one {частно споменаване} other {частни споменавания}}",
"filtered_notifications_banner.title": "Филтрирани известия", "filtered_notifications_banner.title": "Филтрирани известия",
"firehose.all": "Всичко", "firehose.all": "Всичко",
"firehose.local": "Този сървър", "firehose.local": "Този сървър",

View File

@ -256,6 +256,7 @@
"filter_modal.select_filter.subtitle": "Implijout ur rummad a zo anezhañ pe krouiñ unan nevez", "filter_modal.select_filter.subtitle": "Implijout ur rummad a zo anezhañ pe krouiñ unan nevez",
"filter_modal.select_filter.title": "Silañ an toud-mañ", "filter_modal.select_filter.title": "Silañ an toud-mañ",
"filter_modal.title.status": "Silañ un toud", "filter_modal.title.status": "Silañ un toud",
"filtered_notifications_banner.mentions": "{count, plural, one {meneg} two {veneg} few {meneg} other {a venegoù}}",
"firehose.all": "Pep tra", "firehose.all": "Pep tra",
"firehose.local": "Ar servijer-mañ", "firehose.local": "Ar servijer-mañ",
"firehose.remote": "Servijerioù all", "firehose.remote": "Servijerioù all",

View File

@ -297,8 +297,8 @@
"filter_modal.select_filter.subtitle": "Usa una categoria existent o crea'n una de nova", "filter_modal.select_filter.subtitle": "Usa una categoria existent o crea'n una de nova",
"filter_modal.select_filter.title": "Filtra aquest tut", "filter_modal.select_filter.title": "Filtra aquest tut",
"filter_modal.title.status": "Filtra un tut", "filter_modal.title.status": "Filtra un tut",
"filtered_notifications_banner.mentions": "{count, plural, one {menció} other {mencions}}",
"filtered_notifications_banner.pending_requests": "Notificacions {count, plural, =0 {de ningú} one {d'una persona} other {de # persones}} que potser coneixes", "filtered_notifications_banner.pending_requests": "Notificacions {count, plural, =0 {de ningú} one {d'una persona} other {de # persones}} que potser coneixes",
"filtered_notifications_banner.private_mentions": "{count, plural, one {menció privada} other {mencions privades}}",
"filtered_notifications_banner.title": "Notificacions filtrades", "filtered_notifications_banner.title": "Notificacions filtrades",
"firehose.all": "Tots", "firehose.all": "Tots",
"firehose.local": "Aquest servidor", "firehose.local": "Aquest servidor",

View File

@ -89,6 +89,14 @@
"announcement.announcement": "Oznámení", "announcement.announcement": "Oznámení",
"attachments_list.unprocessed": "(nezpracováno)", "attachments_list.unprocessed": "(nezpracováno)",
"audio.hide": "Skrýt zvuk", "audio.hide": "Skrýt zvuk",
"block_modal.remote_users_caveat": "Požádáme server {domain}, aby respektoval vaše rozhodnutí. Úplné dodržování nastavení však není zaručeno, protože některé servery mohou řešit blokování různě. Veřejné příspěvky mohou být stále viditelné pro nepřihlášené uživatele.",
"block_modal.show_less": "Zobrazit méně",
"block_modal.show_more": "Zobrazit více",
"block_modal.they_cant_mention": "Nemůže vás zmiňovat ani sledovat.",
"block_modal.they_cant_see_posts": "Nemůže vidět vaše příspěvky a vy neuvidíte jeho.",
"block_modal.they_will_know": "Může vidět, že je zablokovaný.",
"block_modal.title": "Zablokovat uživatele?",
"block_modal.you_wont_see_mentions": "Neuvidíte příspěvky, které ho zmiňují.",
"boost_modal.combo": "Příště můžete pro přeskočení stisknout {combo}", "boost_modal.combo": "Příště můžete pro přeskočení stisknout {combo}",
"bundle_column_error.copy_stacktrace": "Zkopírovat zprávu o chybě", "bundle_column_error.copy_stacktrace": "Zkopírovat zprávu o chybě",
"bundle_column_error.error.body": "Požadovanou stránku nelze vykreslit. Může to být způsobeno chybou v našem kódu nebo problémem s kompatibilitou prohlížeče.", "bundle_column_error.error.body": "Požadovanou stránku nelze vykreslit. Může to být způsobeno chybou v našem kódu nebo problémem s kompatibilitou prohlížeče.",
@ -169,6 +177,7 @@
"confirmations.delete_list.message": "Opravdu chcete tento seznam navždy smazat?", "confirmations.delete_list.message": "Opravdu chcete tento seznam navždy smazat?",
"confirmations.discard_edit_media.confirm": "Zahodit", "confirmations.discard_edit_media.confirm": "Zahodit",
"confirmations.discard_edit_media.message": "Máte neuložené změny popisku médií nebo náhledu, chcete je přesto zahodit?", "confirmations.discard_edit_media.message": "Máte neuložené změny popisku médií nebo náhledu, chcete je přesto zahodit?",
"confirmations.domain_block.confirm": "Blokovat server",
"confirmations.domain_block.message": "Opravdu chcete blokovat celou doménu {domain}? Ve většině případů stačí blokovat nebo skrýt pár konkrétních uživatelů, což také doporučujeme. Z této domény neuvidíte obsah v žádné veřejné časové ose ani v oznámeních. Vaši sledující z této domény budou odstraněni.", "confirmations.domain_block.message": "Opravdu chcete blokovat celou doménu {domain}? Ve většině případů stačí blokovat nebo skrýt pár konkrétních uživatelů, což také doporučujeme. Z této domény neuvidíte obsah v žádné veřejné časové ose ani v oznámeních. Vaši sledující z této domény budou odstraněni.",
"confirmations.edit.confirm": "Upravit", "confirmations.edit.confirm": "Upravit",
"confirmations.edit.message": "Editovat teď znamená přepsání zprávy, kterou právě tvoříte. Opravdu chcete pokračovat?", "confirmations.edit.message": "Editovat teď znamená přepsání zprávy, kterou právě tvoříte. Opravdu chcete pokračovat?",
@ -200,6 +209,27 @@
"dismissable_banner.explore_statuses": "Toto jsou příspěvky ze sociálních sítí, které dnes získávají na popularitě. Novější příspěvky s větším počtem boostů a oblíbení jsou hodnoceny výše.", "dismissable_banner.explore_statuses": "Toto jsou příspěvky ze sociálních sítí, které dnes získávají na popularitě. Novější příspěvky s větším počtem boostů a oblíbení jsou hodnoceny výše.",
"dismissable_banner.explore_tags": "Tyto hashtagy právě teď získávají na popularitě mezi lidmi na tomto a dalších serverech decentralizované sítě.", "dismissable_banner.explore_tags": "Tyto hashtagy právě teď získávají na popularitě mezi lidmi na tomto a dalších serverech decentralizované sítě.",
"dismissable_banner.public_timeline": "Toto jsou nejnovější veřejné příspěvky od lidí na sociální síti, které sledují lidé na {domain}.", "dismissable_banner.public_timeline": "Toto jsou nejnovější veřejné příspěvky od lidí na sociální síti, které sledují lidé na {domain}.",
"domain_block_modal.block": "Blokovat server",
"domain_block_modal.block_account_instead": "Raději blokovat @{name}",
"domain_block_modal.they_can_interact_with_old_posts": "Lidé z tohoto serveru mohou interagovat s vašimi starými příspěvky.",
"domain_block_modal.they_cant_follow": "Nikdo z tohoto serveru vás nemůže sledovat.",
"domain_block_modal.they_wont_know": "Nebude vědět, že je zablokován.",
"domain_block_modal.title": "Blokovat doménu?",
"domain_block_modal.you_will_lose_followers": "Všichni vaši sledující z tohoto serveru budou odstraněni.",
"domain_block_modal.you_wont_see_posts": "Neuvidíte příspěvky ani upozornění od uživatelů z tohoto serveru.",
"domain_pill.activitypub_lets_connect": "Umožňuje vám spojit se a komunikovat s lidmi nejen na Mastodonu, ale i s dalšími sociálními aplikacemi.",
"domain_pill.activitypub_like_language": "ActivityPub je jako jazyk, kterým Mastodon mluví s jinými sociálními sítěmi.",
"domain_pill.server": "Server",
"domain_pill.their_handle": "Handle:",
"domain_pill.their_server": "Digitální domov, kde žijí všechny příspěvky.",
"domain_pill.their_username": "Jedinečný identikátor na serveru. Je možné najít uživatele se stejným uživatelským jménem na různých serverech.",
"domain_pill.username": "Uživatelské jméno",
"domain_pill.whats_in_a_handle": "Co obsahuje handle?",
"domain_pill.who_they_are": "Protože handle říkají kdo je kdo a také kde, je možné interagovat s lidmi napříč sociálními weby <button>platforem postavených na ActivityPub</button>.",
"domain_pill.who_you_are": "Protože handle říká kdo jsi a kde jsi, mohou s tebou lidé komunikovat napříč sociálními weby <button>platforem postavených na ActivityPub</button>.",
"domain_pill.your_handle": "Tvůj handle:",
"domain_pill.your_server": "Tvůj digitální domov, kde žijí všechny tvé příspěvky. Nelíbí se ti? Kdykoliv se přesuň na jiný server a vezmi si sebou i své sledující.",
"domain_pill.your_username": "Tvůj jedinečný identifikátor na tomto serveru. Je možné najít uživatele se stejným uživatelským jménem na jiných serverech.",
"embed.instructions": "Pro přidání příspěvku na vaši webovou stránku zkopírujte níže uvedený kód.", "embed.instructions": "Pro přidání příspěvku na vaši webovou stránku zkopírujte níže uvedený kód.",
"embed.preview": "Takhle to bude vypadat:", "embed.preview": "Takhle to bude vypadat:",
"emoji_button.activity": "Aktivita", "emoji_button.activity": "Aktivita",
@ -236,6 +266,7 @@
"empty_column.list": "V tomto seznamu zatím nic není. Až nějaký člen z tohoto seznamu zveřejní nový příspěvek, objeví se zde.", "empty_column.list": "V tomto seznamu zatím nic není. Až nějaký člen z tohoto seznamu zveřejní nový příspěvek, objeví se zde.",
"empty_column.lists": "Zatím nemáte žádné seznamy. Až nějaký vytvoříte, zobrazí se zde.", "empty_column.lists": "Zatím nemáte žádné seznamy. Až nějaký vytvoříte, zobrazí se zde.",
"empty_column.mutes": "Zatím jste neskryli žádného uživatele.", "empty_column.mutes": "Zatím jste neskryli žádného uživatele.",
"empty_column.notification_requests": "Vyčištěno! Nic tu není. Jakmile obdržíš nové notifikace, objeví se zde podle tvého nastavení.",
"empty_column.notifications": "Zatím nemáte žádná oznámení. Až s vámi někdo bude interagovat, uvidíte to zde.", "empty_column.notifications": "Zatím nemáte žádná oznámení. Až s vámi někdo bude interagovat, uvidíte to zde.",
"empty_column.public": "Tady nic není! Napište něco veřejně, nebo začněte ručně sledovat uživatele z jiných serverů, aby tu něco přibylo", "empty_column.public": "Tady nic není! Napište něco veřejně, nebo začněte ručně sledovat uživatele z jiných serverů, aby tu něco přibylo",
"error.unexpected_crash.explanation": "Kvůli chybě v našem kódu nebo problému s kompatibilitou prohlížeče nemohla být tato stránka správně zobrazena.", "error.unexpected_crash.explanation": "Kvůli chybě v našem kódu nebo problému s kompatibilitou prohlížeče nemohla být tato stránka správně zobrazena.",
@ -266,6 +297,7 @@
"filter_modal.select_filter.subtitle": "Použít existující kategorii nebo vytvořit novou kategorii", "filter_modal.select_filter.subtitle": "Použít existující kategorii nebo vytvořit novou kategorii",
"filter_modal.select_filter.title": "Filtrovat tento příspěvek", "filter_modal.select_filter.title": "Filtrovat tento příspěvek",
"filter_modal.title.status": "Filtrovat příspěvek", "filter_modal.title.status": "Filtrovat příspěvek",
"filtered_notifications_banner.title": "Filtrovaná oznámení",
"firehose.all": "Vše", "firehose.all": "Vše",
"firehose.local": "Tento server", "firehose.local": "Tento server",
"firehose.remote": "Ostatní servery", "firehose.remote": "Ostatní servery",
@ -394,6 +426,8 @@
"loading_indicator.label": "Načítání…", "loading_indicator.label": "Načítání…",
"media_gallery.toggle_visible": "{number, plural, one {Skrýt obrázek} few {Skrýt obrázky} many {Skrýt obrázky} other {Skrýt obrázky}}", "media_gallery.toggle_visible": "{number, plural, one {Skrýt obrázek} few {Skrýt obrázky} many {Skrýt obrázky} other {Skrýt obrázky}}",
"moved_to_account_banner.text": "Váš účet {disabledAccount} je momentálně deaktivován, protože jste se přesunul/a na {movedToAccount}.", "moved_to_account_banner.text": "Váš účet {disabledAccount} je momentálně deaktivován, protože jste se přesunul/a na {movedToAccount}.",
"mute_modal.hide_from_notifications": "Skrýt z notifikací",
"mute_modal.title": "Ztlumit uživatele?",
"navigation_bar.about": "O aplikaci", "navigation_bar.about": "O aplikaci",
"navigation_bar.advanced_interface": "Otevřít pokročilé webové rozhraní", "navigation_bar.advanced_interface": "Otevřít pokročilé webové rozhraní",
"navigation_bar.blocks": "Blokovaní uživatelé", "navigation_bar.blocks": "Blokovaní uživatelé",
@ -429,8 +463,11 @@
"notification.own_poll": "Vaše anketa skončila", "notification.own_poll": "Vaše anketa skončila",
"notification.poll": "Anketa, ve které jste hlasovali, skončila", "notification.poll": "Anketa, ve které jste hlasovali, skončila",
"notification.reblog": "Uživatel {name} boostnul váš příspěvek", "notification.reblog": "Uživatel {name} boostnul váš příspěvek",
"notification.relationships_severance_event.learn_more": "Zjistit více",
"notification.status": "Uživatel {name} právě přidal příspěvek", "notification.status": "Uživatel {name} právě přidal příspěvek",
"notification.update": "Uživatel {name} upravil příspěvek", "notification.update": "Uživatel {name} upravil příspěvek",
"notification_requests.accept": "Přijmout",
"notification_requests.dismiss": "Zamítnout",
"notifications.clear": "Vyčistit oznámení", "notifications.clear": "Vyčistit oznámení",
"notifications.clear_confirmation": "Opravdu chcete trvale smazat všechna vaše oznámení?", "notifications.clear_confirmation": "Opravdu chcete trvale smazat všechna vaše oznámení?",
"notifications.column_settings.admin.report": "Nová hlášení:", "notifications.column_settings.admin.report": "Nová hlášení:",

View File

@ -295,8 +295,8 @@
"filter_modal.select_filter.subtitle": "Vælg en eksisterende kategori eller opret en ny", "filter_modal.select_filter.subtitle": "Vælg en eksisterende kategori eller opret en ny",
"filter_modal.select_filter.title": "Filtrér dette indlæg", "filter_modal.select_filter.title": "Filtrér dette indlæg",
"filter_modal.title.status": "Filtrér et indlæg", "filter_modal.title.status": "Filtrér et indlæg",
"filtered_notifications_banner.mentions": "{count, plural, one {omtale} other {omtaler}}",
"filtered_notifications_banner.pending_requests": "Notifikationer fra {count, plural, =0 {ingen} one {én person} other {# personer}} du måske kender", "filtered_notifications_banner.pending_requests": "Notifikationer fra {count, plural, =0 {ingen} one {én person} other {# personer}} du måske kender",
"filtered_notifications_banner.private_mentions": "{count, plural, one {privat omtale} other {private omtaler}}",
"filtered_notifications_banner.title": "Filtrerede notifikationer", "filtered_notifications_banner.title": "Filtrerede notifikationer",
"firehose.all": "Alle", "firehose.all": "Alle",
"firehose.local": "Denne server", "firehose.local": "Denne server",

View File

@ -297,8 +297,8 @@
"filter_modal.select_filter.subtitle": "Einem vorhandenen Filter hinzufügen oder einen neuen erstellen", "filter_modal.select_filter.subtitle": "Einem vorhandenen Filter hinzufügen oder einen neuen erstellen",
"filter_modal.select_filter.title": "Diesen Beitrag filtern", "filter_modal.select_filter.title": "Diesen Beitrag filtern",
"filter_modal.title.status": "Beitrag per Filter ausblenden", "filter_modal.title.status": "Beitrag per Filter ausblenden",
"filtered_notifications_banner.mentions": "{count, plural, one {Erwähnung} other {Erwähnungen}}",
"filtered_notifications_banner.pending_requests": "Benachrichtigungen von {count, plural, =0 {keinem Profil, das du möglicherweise kennst} one {einem Profil, das du möglicherweise kennst} other {# Profilen, die du möglicherweise kennst}}", "filtered_notifications_banner.pending_requests": "Benachrichtigungen von {count, plural, =0 {keinem Profil, das du möglicherweise kennst} one {einem Profil, das du möglicherweise kennst} other {# Profilen, die du möglicherweise kennst}}",
"filtered_notifications_banner.private_mentions": "{count, plural, one {private Erwähnung} other {private Erwähnungen}}",
"filtered_notifications_banner.title": "Gefilterte Benachrichtigungen", "filtered_notifications_banner.title": "Gefilterte Benachrichtigungen",
"firehose.all": "Alles", "firehose.all": "Alles",
"firehose.local": "Dieser Server", "firehose.local": "Dieser Server",

View File

@ -297,8 +297,8 @@
"filter_modal.select_filter.subtitle": "Usar una categoría existente o crear una nueva", "filter_modal.select_filter.subtitle": "Usar una categoría existente o crear una nueva",
"filter_modal.select_filter.title": "Filtrar este mensaje", "filter_modal.select_filter.title": "Filtrar este mensaje",
"filter_modal.title.status": "Filtrar un mensaje", "filter_modal.title.status": "Filtrar un mensaje",
"filtered_notifications_banner.mentions": "{count, plural, one {mención} other {menciones}}",
"filtered_notifications_banner.pending_requests": "Notificaciones de {count, plural, =0 {nadie} one {una persona} other {# personas}} que podrías conocer", "filtered_notifications_banner.pending_requests": "Notificaciones de {count, plural, =0 {nadie} one {una persona} other {# personas}} que podrías conocer",
"filtered_notifications_banner.private_mentions": "{count, plural, one {mención privada} other {menciones privadas}}",
"filtered_notifications_banner.title": "Notificaciones filtradas", "filtered_notifications_banner.title": "Notificaciones filtradas",
"firehose.all": "Todos", "firehose.all": "Todos",
"firehose.local": "Este servidor", "firehose.local": "Este servidor",

View File

@ -298,7 +298,6 @@
"filter_modal.select_filter.title": "Filtrar esta publicación", "filter_modal.select_filter.title": "Filtrar esta publicación",
"filter_modal.title.status": "Filtrar una publicación", "filter_modal.title.status": "Filtrar una publicación",
"filtered_notifications_banner.pending_requests": "Notificaciones de {count, plural, =0 {nadie} one {una persona} other {# personas}} que podrías conocer", "filtered_notifications_banner.pending_requests": "Notificaciones de {count, plural, =0 {nadie} one {una persona} other {# personas}} que podrías conocer",
"filtered_notifications_banner.private_mentions": "{count, plural, one {mención privada} other {menciones privadas}}",
"filtered_notifications_banner.title": "Notificaciones filtradas", "filtered_notifications_banner.title": "Notificaciones filtradas",
"firehose.all": "Todas", "firehose.all": "Todas",
"firehose.local": "Este servidor", "firehose.local": "Este servidor",

View File

@ -298,7 +298,6 @@
"filter_modal.select_filter.title": "Filtrar esta publicación", "filter_modal.select_filter.title": "Filtrar esta publicación",
"filter_modal.title.status": "Filtrar una publicación", "filter_modal.title.status": "Filtrar una publicación",
"filtered_notifications_banner.pending_requests": "Notificaciones de {count, plural, =0 {nadie} one {una persona} other {# personas}} que podrías conocer", "filtered_notifications_banner.pending_requests": "Notificaciones de {count, plural, =0 {nadie} one {una persona} other {# personas}} que podrías conocer",
"filtered_notifications_banner.private_mentions": "{count, plural, one {mención privada} other {menciones privadas}}",
"filtered_notifications_banner.title": "Notificaciones filtradas", "filtered_notifications_banner.title": "Notificaciones filtradas",
"firehose.all": "Todas", "firehose.all": "Todas",
"firehose.local": "Este servidor", "firehose.local": "Este servidor",

View File

@ -298,7 +298,6 @@
"filter_modal.select_filter.title": "Filtreeri seda postitust", "filter_modal.select_filter.title": "Filtreeri seda postitust",
"filter_modal.title.status": "Postituse filtreerimine", "filter_modal.title.status": "Postituse filtreerimine",
"filtered_notifications_banner.pending_requests": "Teateid {count, plural, =0 {mitte üheltki} one {ühelt} other {#}} inimeselt, keda võid teada", "filtered_notifications_banner.pending_requests": "Teateid {count, plural, =0 {mitte üheltki} one {ühelt} other {#}} inimeselt, keda võid teada",
"filtered_notifications_banner.private_mentions": "{count, plural, one {privaatne teavitus} other {privaatsed teavitused}}",
"filtered_notifications_banner.title": "Filtreeritud teavitused", "filtered_notifications_banner.title": "Filtreeritud teavitused",
"firehose.all": "Kõik", "firehose.all": "Kõik",
"firehose.local": "See server", "firehose.local": "See server",

View File

@ -297,6 +297,7 @@
"filter_modal.select_filter.subtitle": "Hautatu lehendik dagoen kategoria bat edo sortu berria", "filter_modal.select_filter.subtitle": "Hautatu lehendik dagoen kategoria bat edo sortu berria",
"filter_modal.select_filter.title": "Iragazi bidalketa hau", "filter_modal.select_filter.title": "Iragazi bidalketa hau",
"filter_modal.title.status": "Iragazi bidalketa bat", "filter_modal.title.status": "Iragazi bidalketa bat",
"filtered_notifications_banner.mentions": "{count, plural, one {aipamen} other {aipamen}}",
"filtered_notifications_banner.pending_requests": "Ezagutu {count, plural, =0 {dezakezun inoren} one {dezakezun pertsona baten} other {ditzakezun # pertsonen}} jakinarazpenak", "filtered_notifications_banner.pending_requests": "Ezagutu {count, plural, =0 {dezakezun inoren} one {dezakezun pertsona baten} other {ditzakezun # pertsonen}} jakinarazpenak",
"filtered_notifications_banner.title": "Iragazitako jakinarazpenak", "filtered_notifications_banner.title": "Iragazitako jakinarazpenak",
"firehose.all": "Guztiak", "firehose.all": "Guztiak",

View File

@ -297,8 +297,8 @@
"filter_modal.select_filter.subtitle": "Käytä olemassa olevaa luokkaa tai luo uusi", "filter_modal.select_filter.subtitle": "Käytä olemassa olevaa luokkaa tai luo uusi",
"filter_modal.select_filter.title": "Suodata tämä julkaisu", "filter_modal.select_filter.title": "Suodata tämä julkaisu",
"filter_modal.title.status": "Suodata julkaisu", "filter_modal.title.status": "Suodata julkaisu",
"filtered_notifications_banner.mentions": "{count, plural, one {maininta} other {mainintaa}}",
"filtered_notifications_banner.pending_requests": "Ilmoitukset {count, plural, =0 {ei keltään} one {yhdeltä henkilöltä} other {# henkilöltä}}, jonka saatat tuntea", "filtered_notifications_banner.pending_requests": "Ilmoitukset {count, plural, =0 {ei keltään} one {yhdeltä henkilöltä} other {# henkilöltä}}, jonka saatat tuntea",
"filtered_notifications_banner.private_mentions": "{count, plural, one {yksityismaininta} other {yksityismainintaa}}",
"filtered_notifications_banner.title": "Suodatetut ilmoitukset", "filtered_notifications_banner.title": "Suodatetut ilmoitukset",
"firehose.all": "Kaikki", "firehose.all": "Kaikki",
"firehose.local": "Tämä palvelin", "firehose.local": "Tämä palvelin",

View File

@ -297,8 +297,8 @@
"filter_modal.select_filter.subtitle": "Brúka ein verandi bólk ella skapa ein nýggjan", "filter_modal.select_filter.subtitle": "Brúka ein verandi bólk ella skapa ein nýggjan",
"filter_modal.select_filter.title": "Filtrera hendan postin", "filter_modal.select_filter.title": "Filtrera hendan postin",
"filter_modal.title.status": "Filtrera ein post", "filter_modal.title.status": "Filtrera ein post",
"filtered_notifications_banner.mentions": "{count, plural, one {umrøða} other {umrøður}}",
"filtered_notifications_banner.pending_requests": "Fráboðanir frá {count, plural, =0 {ongum} one {einum persóni} other {# persónum}}, sum tú kanska kennir", "filtered_notifications_banner.pending_requests": "Fráboðanir frá {count, plural, =0 {ongum} one {einum persóni} other {# persónum}}, sum tú kanska kennir",
"filtered_notifications_banner.private_mentions": "{count, plural, one {privat umrøða} other {privatar umrøður}}",
"filtered_notifications_banner.title": "Sáldaðar fráboðanir", "filtered_notifications_banner.title": "Sáldaðar fráboðanir",
"firehose.all": "Allar", "firehose.all": "Allar",
"firehose.local": "Hesin ambætarin", "firehose.local": "Hesin ambætarin",

View File

@ -298,7 +298,6 @@
"filter_modal.select_filter.title": "Filtrer cette publication", "filter_modal.select_filter.title": "Filtrer cette publication",
"filter_modal.title.status": "Filtrer une publication", "filter_modal.title.status": "Filtrer une publication",
"filtered_notifications_banner.pending_requests": "Notifications {count, plural, =0 {de personne} one {dune personne} other {de # personnes}} que vous pouvez connaitre", "filtered_notifications_banner.pending_requests": "Notifications {count, plural, =0 {de personne} one {dune personne} other {de # personnes}} que vous pouvez connaitre",
"filtered_notifications_banner.private_mentions": "{count, plural, one {mention privée} other {mentions privées}}",
"filtered_notifications_banner.title": "Notifications filtrées", "filtered_notifications_banner.title": "Notifications filtrées",
"firehose.all": "Tout", "firehose.all": "Tout",
"firehose.local": "Ce serveur", "firehose.local": "Ce serveur",

View File

@ -298,7 +298,6 @@
"filter_modal.select_filter.title": "Filtrer ce message", "filter_modal.select_filter.title": "Filtrer ce message",
"filter_modal.title.status": "Filtrer un message", "filter_modal.title.status": "Filtrer un message",
"filtered_notifications_banner.pending_requests": "Notifications {count, plural, =0 {de personne} one {dune personne} other {de # personnes}} que vous pouvez connaitre", "filtered_notifications_banner.pending_requests": "Notifications {count, plural, =0 {de personne} one {dune personne} other {de # personnes}} que vous pouvez connaitre",
"filtered_notifications_banner.private_mentions": "{count, plural, one {mention privée} other {mentions privées}}",
"filtered_notifications_banner.title": "Notifications filtrées", "filtered_notifications_banner.title": "Notifications filtrées",
"firehose.all": "Tout", "firehose.all": "Tout",
"firehose.local": "Ce serveur", "firehose.local": "Ce serveur",

View File

@ -298,7 +298,6 @@
"filter_modal.select_filter.title": "Criathraich am post seo", "filter_modal.select_filter.title": "Criathraich am post seo",
"filter_modal.title.status": "Criathraich post", "filter_modal.title.status": "Criathraich post",
"filtered_notifications_banner.pending_requests": "{count, plural, =0 {Chan eil brath ann o dhaoine} one {Tha brathan ann o # neach} two {Tha brathan ann o # neach} few {Tha brathan ann o # daoine} other {Tha brathan ann o # duine}} air a bheil thu eòlach s dòcha", "filtered_notifications_banner.pending_requests": "{count, plural, =0 {Chan eil brath ann o dhaoine} one {Tha brathan ann o # neach} two {Tha brathan ann o # neach} few {Tha brathan ann o # daoine} other {Tha brathan ann o # duine}} air a bheil thu eòlach s dòcha",
"filtered_notifications_banner.private_mentions": "{count, plural, one {iomradh prìobhaideach} two {iomradh prìobhaideach} few {iomraidhean prìobhaideach} other {iomradh prìobhaideach}}",
"filtered_notifications_banner.title": "Brathan criathraichte", "filtered_notifications_banner.title": "Brathan criathraichte",
"firehose.all": "Na h-uile", "firehose.all": "Na h-uile",
"firehose.local": "Am frithealaiche seo", "firehose.local": "Am frithealaiche seo",

View File

@ -297,8 +297,8 @@
"filter_modal.select_filter.subtitle": "Usar unha categoría existente ou crear unha nova", "filter_modal.select_filter.subtitle": "Usar unha categoría existente ou crear unha nova",
"filter_modal.select_filter.title": "Filtrar esta publicación", "filter_modal.select_filter.title": "Filtrar esta publicación",
"filter_modal.title.status": "Filtrar unha publicación", "filter_modal.title.status": "Filtrar unha publicación",
"filtered_notifications_banner.mentions": "{count, plural, one {mención} other {mencións}}",
"filtered_notifications_banner.pending_requests": "Notificacións de {count, plural, =0 {ninguén} one {unha persoa} other {# persoas}} que poderías coñecer", "filtered_notifications_banner.pending_requests": "Notificacións de {count, plural, =0 {ninguén} one {unha persoa} other {# persoas}} que poderías coñecer",
"filtered_notifications_banner.private_mentions": "{count, plural, one {mención privada} other {mencións privadas}}",
"filtered_notifications_banner.title": "Notificacións filtradas", "filtered_notifications_banner.title": "Notificacións filtradas",
"firehose.all": "Todo", "firehose.all": "Todo",
"firehose.local": "Este servidor", "firehose.local": "Este servidor",

View File

@ -297,8 +297,8 @@
"filter_modal.select_filter.subtitle": "שימוש בקטגורייה קיימת או יצירת אחת חדשה", "filter_modal.select_filter.subtitle": "שימוש בקטגורייה קיימת או יצירת אחת חדשה",
"filter_modal.select_filter.title": "סינון ההודעה הזו", "filter_modal.select_filter.title": "סינון ההודעה הזו",
"filter_modal.title.status": "סנן הודעה", "filter_modal.title.status": "סנן הודעה",
"filtered_notifications_banner.mentions": "{count, plural, one {איזכור} other {איזכורים} two {איזכוריים}}",
"filtered_notifications_banner.pending_requests": "{count, plural,=0 {אין התראות ממשתמשים ה}one {התראה אחת ממישהו/מישהי ה}two {יש התראותיים ממשתמשים }other {יש # התראות ממשתמשים }}מוכרים לך", "filtered_notifications_banner.pending_requests": "{count, plural,=0 {אין התראות ממשתמשים ה}one {התראה אחת ממישהו/מישהי ה}two {יש התראותיים ממשתמשים }other {יש # התראות ממשתמשים }}מוכרים לך",
"filtered_notifications_banner.private_mentions": "{count, plural, one {איזכור פרטי} other {איזכורים פרטיים}}",
"filtered_notifications_banner.title": "התראות מסוננות", "filtered_notifications_banner.title": "התראות מסוננות",
"firehose.all": "הכל", "firehose.all": "הכל",
"firehose.local": "שרת זה", "firehose.local": "שרת זה",

View File

@ -297,8 +297,8 @@
"filter_modal.select_filter.subtitle": "Válassz egy meglévő kategóriát, vagy hozz létre egy újat", "filter_modal.select_filter.subtitle": "Válassz egy meglévő kategóriát, vagy hozz létre egy újat",
"filter_modal.select_filter.title": "E bejegyzés szűrése", "filter_modal.select_filter.title": "E bejegyzés szűrése",
"filter_modal.title.status": "Egy bejegyzés szűrése", "filter_modal.title.status": "Egy bejegyzés szűrése",
"filtered_notifications_banner.mentions": "{count, plural, one {említés} other {említés}}",
"filtered_notifications_banner.pending_requests": "Értesítések {count, plural, =0 {nincsenek} one {egy valósztínűleg ismerős személytől} other {# valószínűleg ismerős személytől}}", "filtered_notifications_banner.pending_requests": "Értesítések {count, plural, =0 {nincsenek} one {egy valósztínűleg ismerős személytől} other {# valószínűleg ismerős személytől}}",
"filtered_notifications_banner.private_mentions": "{count, plural, one {privát említés} other {privát említés}}",
"filtered_notifications_banner.title": "Szűrt értesítések", "filtered_notifications_banner.title": "Szűrt értesítések",
"firehose.all": "Összes", "firehose.all": "Összes",
"firehose.local": "Ez a kiszolgáló", "firehose.local": "Ez a kiszolgáló",

View File

@ -287,7 +287,6 @@
"filter_modal.select_filter.title": "Filtrar ti-ci posta", "filter_modal.select_filter.title": "Filtrar ti-ci posta",
"filter_modal.title.status": "Filtrar un posta", "filter_modal.title.status": "Filtrar un posta",
"filtered_notifications_banner.pending_requests": "Notificationes de {count, plural, =0 {nequi} one {un person} other {# persones}} quel tu possibilmen conosse", "filtered_notifications_banner.pending_requests": "Notificationes de {count, plural, =0 {nequi} one {un person} other {# persones}} quel tu possibilmen conosse",
"filtered_notifications_banner.private_mentions": "{count, plural, one {privat mention} other {privat mentiones}}",
"filtered_notifications_banner.title": "Filtrat notificationes", "filtered_notifications_banner.title": "Filtrat notificationes",
"firehose.all": "Omno", "firehose.all": "Omno",
"firehose.local": "Ti-ci servitor", "firehose.local": "Ti-ci servitor",

View File

@ -297,8 +297,8 @@
"filter_modal.select_filter.subtitle": "Notaðu fyrirliggjandi flokk eða útbúðu nýjan", "filter_modal.select_filter.subtitle": "Notaðu fyrirliggjandi flokk eða útbúðu nýjan",
"filter_modal.select_filter.title": "Sía þessa færslu", "filter_modal.select_filter.title": "Sía þessa færslu",
"filter_modal.title.status": "Sía færslu", "filter_modal.title.status": "Sía færslu",
"filtered_notifications_banner.mentions": "{count, plural, one {tilvísun} other {tilvísanir}}",
"filtered_notifications_banner.pending_requests": "Tilkynningar frá {count, plural, =0 {engum} one {einum aðila} other {# aðilum}} sem þú gætir þekkt", "filtered_notifications_banner.pending_requests": "Tilkynningar frá {count, plural, =0 {engum} one {einum aðila} other {# aðilum}} sem þú gætir þekkt",
"filtered_notifications_banner.private_mentions": "{count, plural, one {einkaspjall} other {einkaspjöll}}",
"filtered_notifications_banner.title": "Síaðar tilkynningar", "filtered_notifications_banner.title": "Síaðar tilkynningar",
"firehose.all": "Allt", "firehose.all": "Allt",
"firehose.local": "þessum netþjóni", "firehose.local": "þessum netþjóni",

View File

@ -297,8 +297,8 @@
"filter_modal.select_filter.subtitle": "Usa una categoria esistente o creane una nuova", "filter_modal.select_filter.subtitle": "Usa una categoria esistente o creane una nuova",
"filter_modal.select_filter.title": "Filtra questo post", "filter_modal.select_filter.title": "Filtra questo post",
"filter_modal.title.status": "Filtra un post", "filter_modal.title.status": "Filtra un post",
"filtered_notifications_banner.mentions": "{count, plural, one {menzione} other {menzioni}}",
"filtered_notifications_banner.pending_requests": "Notifiche da {count, plural, =0 {nessuno} one {una persona} other {# persone}} che potresti conoscere", "filtered_notifications_banner.pending_requests": "Notifiche da {count, plural, =0 {nessuno} one {una persona} other {# persone}} che potresti conoscere",
"filtered_notifications_banner.private_mentions": "{count, plural,one {menzione privata} other {menzioni private}}",
"filtered_notifications_banner.title": "Notifiche filtrate", "filtered_notifications_banner.title": "Notifiche filtrate",
"firehose.all": "Tutto", "firehose.all": "Tutto",
"firehose.local": "Questo server", "firehose.local": "Questo server",

View File

@ -297,8 +297,8 @@
"filter_modal.select_filter.subtitle": "기존의 카테고리를 사용하거나 새로 하나를 만듧니다", "filter_modal.select_filter.subtitle": "기존의 카테고리를 사용하거나 새로 하나를 만듧니다",
"filter_modal.select_filter.title": "이 게시물을 필터", "filter_modal.select_filter.title": "이 게시물을 필터",
"filter_modal.title.status": "게시물 필터", "filter_modal.title.status": "게시물 필터",
"filtered_notifications_banner.mentions": "{count, plural, other {멘션}}",
"filtered_notifications_banner.pending_requests": "알 수도 있는 {count, plural, =0 {0 명} one {한 명} other {# 명}}의 사람들로부터의 알림", "filtered_notifications_banner.pending_requests": "알 수도 있는 {count, plural, =0 {0 명} one {한 명} other {# 명}}의 사람들로부터의 알림",
"filtered_notifications_banner.private_mentions": "{count, plural, other {개인적인 멘션}}",
"filtered_notifications_banner.title": "걸러진 알림", "filtered_notifications_banner.title": "걸러진 알림",
"firehose.all": "모두", "firehose.all": "모두",
"firehose.local": "이 서버", "firehose.local": "이 서버",

View File

@ -457,6 +457,7 @@
"notification.own_poll": "Tu anketa eskapo", "notification.own_poll": "Tu anketa eskapo",
"notification.poll": "Anketa en ke votates eskapo", "notification.poll": "Anketa en ke votates eskapo",
"notification.reblog": "{name} repartajo tu publikasyon", "notification.reblog": "{name} repartajo tu publikasyon",
"notification.relationships_severance_event": "Koneksyones pedridas kon {name}",
"notification.relationships_severance_event.learn_more": "Ambezate mas", "notification.relationships_severance_event.learn_more": "Ambezate mas",
"notification.status": "{name} publiko algo", "notification.status": "{name} publiko algo",
"notification.update": "{name} edito una publikasyon", "notification.update": "{name} edito una publikasyon",

View File

@ -282,7 +282,6 @@
"filter_modal.select_filter.subtitle": "Naudok esamą kategoriją arba sukurk naują.", "filter_modal.select_filter.subtitle": "Naudok esamą kategoriją arba sukurk naują.",
"filter_modal.select_filter.title": "Filtruoti šį įrašą", "filter_modal.select_filter.title": "Filtruoti šį įrašą",
"filter_modal.title.status": "Filtruoti įrašą", "filter_modal.title.status": "Filtruoti įrašą",
"filtered_notifications_banner.private_mentions": "{count, plural, one {privatus paminėjimas} few {privatūs paminėjimai} many {privataus paminėjimo} other {privačių paminėjimų}}",
"firehose.all": "Visi", "firehose.all": "Visi",
"firehose.local": "Šis serveris", "firehose.local": "Šis serveris",
"firehose.remote": "Kiti serveriai", "firehose.remote": "Kiti serveriai",

View File

@ -297,8 +297,8 @@
"filter_modal.select_filter.subtitle": "Een bestaande categorie gebruiken of een nieuwe aanmaken", "filter_modal.select_filter.subtitle": "Een bestaande categorie gebruiken of een nieuwe aanmaken",
"filter_modal.select_filter.title": "Dit bericht filteren", "filter_modal.select_filter.title": "Dit bericht filteren",
"filter_modal.title.status": "Een bericht filteren", "filter_modal.title.status": "Een bericht filteren",
"filtered_notifications_banner.mentions": "{count, plural, one {vermelding} other {vermeldingen}}",
"filtered_notifications_banner.pending_requests": "Meldingen van {count, plural, =0 {niemand} one {één persoon} other {# mensen}} die je misschien kent", "filtered_notifications_banner.pending_requests": "Meldingen van {count, plural, =0 {niemand} one {één persoon} other {# mensen}} die je misschien kent",
"filtered_notifications_banner.private_mentions": "{count, plural, one {privébericht} other {privéberichten}}",
"filtered_notifications_banner.title": "Gefilterde meldingen", "filtered_notifications_banner.title": "Gefilterde meldingen",
"firehose.all": "Alles", "firehose.all": "Alles",
"firehose.local": "Deze server", "firehose.local": "Deze server",

View File

@ -298,7 +298,6 @@
"filter_modal.select_filter.title": "Filtrer dette innlegget", "filter_modal.select_filter.title": "Filtrer dette innlegget",
"filter_modal.title.status": "Filtrer eit innlegg", "filter_modal.title.status": "Filtrer eit innlegg",
"filtered_notifications_banner.pending_requests": "Varsel frå {count, plural, =0 {ingen} one {ein person} other {# folk}} du kanskje kjenner", "filtered_notifications_banner.pending_requests": "Varsel frå {count, plural, =0 {ingen} one {ein person} other {# folk}} du kanskje kjenner",
"filtered_notifications_banner.private_mentions": "{count, plural, one {privat omtale} other {private omtaler}}",
"filtered_notifications_banner.title": "Filtrerte varslingar", "filtered_notifications_banner.title": "Filtrerte varslingar",
"firehose.all": "Alle", "firehose.all": "Alle",
"firehose.local": "Denne tenaren", "firehose.local": "Denne tenaren",

View File

@ -297,8 +297,8 @@
"filter_modal.select_filter.subtitle": "Użyj istniejącej kategorii lub utwórz nową", "filter_modal.select_filter.subtitle": "Użyj istniejącej kategorii lub utwórz nową",
"filter_modal.select_filter.title": "Filtruj ten wpis", "filter_modal.select_filter.title": "Filtruj ten wpis",
"filter_modal.title.status": "Filtruj wpis", "filter_modal.title.status": "Filtruj wpis",
"filtered_notifications_banner.mentions": "{count, plural, one {wzmianka} few {wzmianki} other {wzmianek}}",
"filtered_notifications_banner.pending_requests": "Powiadomienia od {count, plural, =0 {żadnej osoby którą możesz znać} one {# osoby którą możesz znać} other {# osób które możesz znać}}", "filtered_notifications_banner.pending_requests": "Powiadomienia od {count, plural, =0 {żadnej osoby którą możesz znać} one {# osoby którą możesz znać} other {# osób które możesz znać}}",
"filtered_notifications_banner.private_mentions": "{count, plural, one {prywatna wzmianka} few {prywatne wzmianki} other {prywatnych wzmianek}}",
"filtered_notifications_banner.title": "Powiadomienia filtrowane", "filtered_notifications_banner.title": "Powiadomienia filtrowane",
"firehose.all": "Wszystko", "firehose.all": "Wszystko",
"firehose.local": "Ten serwer", "firehose.local": "Ten serwer",

View File

@ -298,7 +298,6 @@
"filter_modal.select_filter.title": "Filtrar esta publicação", "filter_modal.select_filter.title": "Filtrar esta publicação",
"filter_modal.title.status": "Filtrar uma publicação", "filter_modal.title.status": "Filtrar uma publicação",
"filtered_notifications_banner.pending_requests": "Notificações de {count, plural, =0 {no one} one {one person} other {# people}} que você talvez conheça", "filtered_notifications_banner.pending_requests": "Notificações de {count, plural, =0 {no one} one {one person} other {# people}} que você talvez conheça",
"filtered_notifications_banner.private_mentions": "{count, plural, one {private mention} other {private mentions}}",
"filtered_notifications_banner.title": "Notificações filtradas", "filtered_notifications_banner.title": "Notificações filtradas",
"firehose.all": "Tudo", "firehose.all": "Tudo",
"firehose.local": "Este servidor", "firehose.local": "Este servidor",

View File

@ -297,8 +297,8 @@
"filter_modal.select_filter.subtitle": "Utilize uma categoria existente ou crie uma nova", "filter_modal.select_filter.subtitle": "Utilize uma categoria existente ou crie uma nova",
"filter_modal.select_filter.title": "Filtrar esta publicação", "filter_modal.select_filter.title": "Filtrar esta publicação",
"filter_modal.title.status": "Filtrar uma publicação", "filter_modal.title.status": "Filtrar uma publicação",
"filtered_notifications_banner.mentions": "{count, plural, one {menção} other {menções}}",
"filtered_notifications_banner.pending_requests": "Notificações de {count, plural, =0 {ninguém} one {uma pessoa} other {# pessoas}} que talvez conheça", "filtered_notifications_banner.pending_requests": "Notificações de {count, plural, =0 {ninguém} one {uma pessoa} other {# pessoas}} que talvez conheça",
"filtered_notifications_banner.private_mentions": "{count, plural,one {menção privada} other {menções privadas}}",
"filtered_notifications_banner.title": "Notificações filtradas", "filtered_notifications_banner.title": "Notificações filtradas",
"firehose.all": "Todas", "firehose.all": "Todas",
"firehose.local": "Este servidor", "firehose.local": "Este servidor",

View File

@ -298,7 +298,6 @@
"filter_modal.select_filter.title": "Фильтровать этот пост", "filter_modal.select_filter.title": "Фильтровать этот пост",
"filter_modal.title.status": "Фильтровать пост", "filter_modal.title.status": "Фильтровать пост",
"filtered_notifications_banner.pending_requests": "Уведомления от {count, plural, =0 {никого} one {# человека} other {# других людей, с кем вы можете быть знакомы}}", "filtered_notifications_banner.pending_requests": "Уведомления от {count, plural, =0 {никого} one {# человека} other {# других людей, с кем вы можете быть знакомы}}",
"filtered_notifications_banner.private_mentions": "{count, plural, one {личное упоминание} other {личные упоминания}}",
"filtered_notifications_banner.title": "Отфильтрованные уведомления", "filtered_notifications_banner.title": "Отфильтрованные уведомления",
"firehose.all": "Все", "firehose.all": "Все",
"firehose.local": "Текущий сервер", "firehose.local": "Текущий сервер",

View File

@ -297,8 +297,8 @@
"filter_modal.select_filter.subtitle": "Uporabite obstoječo kategorijo ali ustvarite novo", "filter_modal.select_filter.subtitle": "Uporabite obstoječo kategorijo ali ustvarite novo",
"filter_modal.select_filter.title": "Filtriraj to objavo", "filter_modal.select_filter.title": "Filtriraj to objavo",
"filter_modal.title.status": "Filtrirajte objavo", "filter_modal.title.status": "Filtrirajte objavo",
"filtered_notifications_banner.mentions": "{count, plural, one {omemba} two {omembi} few {omembe} other {omemb}}",
"filtered_notifications_banner.pending_requests": "Obvestila od {count, plural, =0 {nikogar, ki bi ga} one {# človeka, ki bi ga} two {# ljudi, ki bi ju} few {# ljudi, ki bi jih} other {# ljudi, ki bi jih}} lahko poznali", "filtered_notifications_banner.pending_requests": "Obvestila od {count, plural, =0 {nikogar, ki bi ga} one {# človeka, ki bi ga} two {# ljudi, ki bi ju} few {# ljudi, ki bi jih} other {# ljudi, ki bi jih}} lahko poznali",
"filtered_notifications_banner.private_mentions": "{count, plural, one {zasebna omemba} two {zasebni omembi} few {zasebne omembe} other {zasebnih omemb}}",
"filtered_notifications_banner.title": "Filtrirana obvestila", "filtered_notifications_banner.title": "Filtrirana obvestila",
"firehose.all": "Vse", "firehose.all": "Vse",
"firehose.local": "Ta strežnik", "firehose.local": "Ta strežnik",

View File

@ -298,7 +298,6 @@
"filter_modal.select_filter.title": "Filtroje këtë postim", "filter_modal.select_filter.title": "Filtroje këtë postim",
"filter_modal.title.status": "Filtroni një postim", "filter_modal.title.status": "Filtroni një postim",
"filtered_notifications_banner.pending_requests": "Njoftime prej {count, plural, =0 {askujt} one {një personi} other {# vetësh}} që mund të njihni", "filtered_notifications_banner.pending_requests": "Njoftime prej {count, plural, =0 {askujt} one {një personi} other {# vetësh}} që mund të njihni",
"filtered_notifications_banner.private_mentions": "{count, plural, one {përmendje private} other {përmendje private}}",
"filtered_notifications_banner.title": "Njoftime të filtruar", "filtered_notifications_banner.title": "Njoftime të filtruar",
"firehose.all": "Krejt", "firehose.all": "Krejt",
"firehose.local": "Këtë shërbyes", "firehose.local": "Këtë shërbyes",

View File

@ -13,14 +13,14 @@
"about.rules": "Pravila servera", "about.rules": "Pravila servera",
"account.account_note_header": "Napomena", "account.account_note_header": "Napomena",
"account.add_or_remove_from_list": "Dodaj ili ukloni sa lista", "account.add_or_remove_from_list": "Dodaj ili ukloni sa lista",
"account.badges.bot": "Bot", "account.badges.bot": "Automatizovano",
"account.badges.group": "Grupa", "account.badges.group": "Grupa",
"account.block": "Blokiraj @{name}", "account.block": "Blokiraj @{name}",
"account.block_domain": "Blokiraj domen {domain}", "account.block_domain": "Blokiraj domen {domain}",
"account.block_short": "Blokiraj", "account.block_short": "Blokiraj",
"account.blocked": "Blokiran", "account.blocked": "Blokiran",
"account.browse_more_on_origin_server": "Pregledajte još na originalnom profilu", "account.browse_more_on_origin_server": "Pregledajte još na originalnom profilu",
"account.cancel_follow_request": "Povuci zahtev za praćenje", "account.cancel_follow_request": "Otkaži praćenje",
"account.copy": "Kopiraj vezu u profil", "account.copy": "Kopiraj vezu u profil",
"account.direct": "Privatno pomeni @{name}", "account.direct": "Privatno pomeni @{name}",
"account.disable_notifications": "Zaustavi obaveštavanje za objave korisnika @{name}", "account.disable_notifications": "Zaustavi obaveštavanje za objave korisnika @{name}",
@ -89,6 +89,14 @@
"announcement.announcement": "Najava", "announcement.announcement": "Najava",
"attachments_list.unprocessed": "(neobrađeno)", "attachments_list.unprocessed": "(neobrađeno)",
"audio.hide": "Sakrij audio", "audio.hide": "Sakrij audio",
"block_modal.remote_users_caveat": "Zamolićemo server {domain} da poštuje vašu odluku. Međutim, usklađenost nije zagarantovana jer neki serveri mogu drugačije da obrađuju blokove. Javne objave mogu i dalje biti vidljive korisnicima koji nisu prijavljeni.",
"block_modal.show_less": "Prikaži manje",
"block_modal.show_more": "Prikaži više",
"block_modal.they_cant_mention": "Ne mogu da vas pominju ili prate.",
"block_modal.they_cant_see_posts": "Ne mogu da vide vaše objave, a vi nećete videti njihove.",
"block_modal.they_will_know": "Mogu da vide da su blokirani.",
"block_modal.title": "Blokirati korisnika?",
"block_modal.you_wont_see_mentions": "Nećete videti objave koje ih pominju.",
"boost_modal.combo": "Možete pritisnuti {combo} da preskočite ovo sledeći put", "boost_modal.combo": "Možete pritisnuti {combo} da preskočite ovo sledeći put",
"bundle_column_error.copy_stacktrace": "Kopiraj izveštaj o grešci", "bundle_column_error.copy_stacktrace": "Kopiraj izveštaj o grešci",
"bundle_column_error.error.body": "Nije moguće prikazati traženu stranicu. Razlog može biti greška u našem kodu ili problem sa kompatibilnošću pretraživača.", "bundle_column_error.error.body": "Nije moguće prikazati traženu stranicu. Razlog može biti greška u našem kodu ili problem sa kompatibilnošću pretraživača.",
@ -153,7 +161,7 @@
"compose_form.poll.switch_to_single": "Promenite anketu da biste omogućili jedan izbor", "compose_form.poll.switch_to_single": "Promenite anketu da biste omogućili jedan izbor",
"compose_form.poll.type": "Stil", "compose_form.poll.type": "Stil",
"compose_form.publish": "Objavi", "compose_form.publish": "Objavi",
"compose_form.publish_form": "Objavi", "compose_form.publish_form": "Nova objava",
"compose_form.reply": "Odgovori", "compose_form.reply": "Odgovori",
"compose_form.save_changes": "Ažuriraj", "compose_form.save_changes": "Ažuriraj",
"compose_form.spoiler.marked": "Ukloni upozorenje o sadržaju", "compose_form.spoiler.marked": "Ukloni upozorenje o sadržaju",
@ -169,6 +177,7 @@
"confirmations.delete_list.message": "Da li ste sigurni da želite da trajno izbrišete ovu listu?", "confirmations.delete_list.message": "Da li ste sigurni da želite da trajno izbrišete ovu listu?",
"confirmations.discard_edit_media.confirm": "Odbaci", "confirmations.discard_edit_media.confirm": "Odbaci",
"confirmations.discard_edit_media.message": "Imate nesačuvane promene u opisu ili pregledu medija, da li ipak hoćete da ih odbacite?", "confirmations.discard_edit_media.message": "Imate nesačuvane promene u opisu ili pregledu medija, da li ipak hoćete da ih odbacite?",
"confirmations.domain_block.confirm": "Blokiraj server",
"confirmations.domain_block.message": "Da li ste zaista sigurni da želite da blokirate ceo domen {domain}? U većini slučajeva, dovoljno je i poželjno nekoliko ciljanih blokiranja ili ignorisanja. Nećete videti sadržaj sa tog domena ni u jednoj javnoj vremenskoj liniji ili u vašim obaveštenjima. Vaši pratioci sa tog domena će biti uklonjeni.", "confirmations.domain_block.message": "Da li ste zaista sigurni da želite da blokirate ceo domen {domain}? U većini slučajeva, dovoljno je i poželjno nekoliko ciljanih blokiranja ili ignorisanja. Nećete videti sadržaj sa tog domena ni u jednoj javnoj vremenskoj liniji ili u vašim obaveštenjima. Vaši pratioci sa tog domena će biti uklonjeni.",
"confirmations.edit.confirm": "Uredi", "confirmations.edit.confirm": "Uredi",
"confirmations.edit.message": "Uređivanjem će se obrisati poruka koju trenutno sastavljate. Da li ste sigurni da želite da nastavite?", "confirmations.edit.message": "Uređivanjem će se obrisati poruka koju trenutno sastavljate. Da li ste sigurni da želite da nastavite?",
@ -196,10 +205,31 @@
"disabled_account_banner.text": "Vaš nalog {disabledAccount} je trenutno onemogućen.", "disabled_account_banner.text": "Vaš nalog {disabledAccount} je trenutno onemogućen.",
"dismissable_banner.community_timeline": "Ovo su najnovije javne objave ljudi čije naloge hostuje {domain}.", "dismissable_banner.community_timeline": "Ovo su najnovije javne objave ljudi čije naloge hostuje {domain}.",
"dismissable_banner.dismiss": "Odbaci", "dismissable_banner.dismiss": "Odbaci",
"dismissable_banner.explore_links": "O ovim vestima trenutno razgovaraju ljudi na ovom i drugim serverima decentralizovane mreže.", "dismissable_banner.explore_links": "Ovo su vesti koje se danas najviše dele na društvenoj mreži. Novije vesti koje je objavilo više različitih ljudi su bolje rangirane.",
"dismissable_banner.explore_statuses": "Ovo su objave širom društvenog veba koje danas postaju sve popularnije. Novije objave sa više podržavanja i omiljene su rangirane više.", "dismissable_banner.explore_statuses": "Ovo su objave širom društvenog veba koje danas postaju sve popularnije. Novije objave sa više podržavanja i omiljene su rangirane više.",
"dismissable_banner.explore_tags": "Ove heš oznake postaju sve popularnije među ljudima na ovom i drugim serverima decentralizovane mreže.", "dismissable_banner.explore_tags": "Ovo su heš oznake koje danas postaju sve popularnije na društvenoj mreži. Heš oznake koje koristi više različitih ljudi su rangirane više.",
"dismissable_banner.public_timeline": "Ovo su najnovije javne objave ljudi sa društvenog veba koje ljudi na {domain}-u prate.", "dismissable_banner.public_timeline": "Ovo su najnovije javne objave ljudi sa društvenog veba koje ljudi na {domain}-u prate.",
"domain_block_modal.block": "Blokiraj server",
"domain_block_modal.block_account_instead": "Umesto toga, blokiraj @{name}",
"domain_block_modal.they_can_interact_with_old_posts": "Ljudi sa ovog servera mogu da imaju interakciju sa vašim starim objavama.",
"domain_block_modal.they_cant_follow": "Niko sa ovog servera ne može da vas prati.",
"domain_block_modal.they_wont_know": "Neće znati da su blokirani.",
"domain_block_modal.title": "Blokirati domen?",
"domain_block_modal.you_will_lose_followers": "Svi vaši pratioci sa ovog servera će biti uklonjeni.",
"domain_block_modal.you_wont_see_posts": "Nećete videti objave ili obaveštenja korisnika na ovom serveru.",
"domain_pill.activitypub_lets_connect": "Omogućuje vam da se povežete i komunicirate sa ljudima ne samo na Mastodon-u, već i u različitim društvenim aplikacijama.",
"domain_pill.activitypub_like_language": "ActivityPub je kao jezik kojim Mastodon govori sa drugim društvenim mrežama.",
"domain_pill.server": "Server",
"domain_pill.their_handle": "Njegov regulator:",
"domain_pill.their_server": "Njihov digitalni dom, gde žive sve njihove objave.",
"domain_pill.their_username": "Njihov jedinstveni identifikator na njihovom serveru. Moguće je pronaći korisnike sa istim korisničkim imenom na različitim serverima.",
"domain_pill.username": "Korisničko ime",
"domain_pill.whats_in_a_handle": "Šta je regulator?",
"domain_pill.who_they_are": "Pošto regulatori govore ko je neko i gde se nalazi, možete da komunicirate sa ljudima širom društvenog veba na <button>platformama koje pokreće ActivityPub</button>.",
"domain_pill.who_you_are": "Pošto vaši regulatori govori ko ste i gde ste, ljudi mogu da komuniciraju sa vama širom društvenog veba na <button>platformama koje pokreće ActivityPub</button>.",
"domain_pill.your_handle": "Vaš regulator:",
"domain_pill.your_server": "Vaš digitalni dom, gde žive sve vaše objave. Ne sviđa vam se ovaj? Prenesite servere u bilo koje vreme i dovedite i svoje pratioce.",
"domain_pill.your_username": "Njihov jedinstveni identifikator na njihovom serveru. Moguće je pronaći korisnike sa istim korisničkim imenom na različitim serverima.",
"embed.instructions": "Ugradite ovu objavu na svoj veb sajt kopiranjem koda ispod.", "embed.instructions": "Ugradite ovu objavu na svoj veb sajt kopiranjem koda ispod.",
"embed.preview": "Evo kako će to izgledati:", "embed.preview": "Evo kako će to izgledati:",
"emoji_button.activity": "Aktivnosti", "emoji_button.activity": "Aktivnosti",
@ -232,11 +262,11 @@
"empty_column.follow_requests": "Još uvek nemate nijedan zahtev za praćenje. Kada primite zahtev, on će se pojaviti ovde.", "empty_column.follow_requests": "Još uvek nemate nijedan zahtev za praćenje. Kada primite zahtev, on će se pojaviti ovde.",
"empty_column.followed_tags": "Još uvek niste zapratili nijednu heš oznaku. Kada to uradite, one će se pojaviti ovde.", "empty_column.followed_tags": "Još uvek niste zapratili nijednu heš oznaku. Kada to uradite, one će se pojaviti ovde.",
"empty_column.hashtag": "Još uvek nema ničega u ovoj heš oznaci.", "empty_column.hashtag": "Još uvek nema ničega u ovoj heš oznaci.",
"empty_column.home": "Vaša početna vremenska linija je prazna! Pratite više ljudi da biste je popunili. {suggestions}", "empty_column.home": "Vaša početna vremenska linija je prazna! Pratite više ljudi da biste je popunili.",
"empty_column.list": "U ovoj listi još nema ničega. Kada članovi ove liste objave nešto novo, pojaviće se ovde.", "empty_column.list": "U ovoj listi još nema ničega. Kada članovi ove liste objave nešto novo, pojaviće se ovde.",
"empty_column.lists": "Još uvek nemate nijednu listu. Kada napravite jednu, ona će se pojaviti ovde.", "empty_column.lists": "Još uvek nemate nijednu listu. Kada napravite jednu, ona će se pojaviti ovde.",
"empty_column.mutes": "Još uvek ne ignorišete nijednog korisnika.", "empty_column.mutes": "Još uvek ne ignorišete nijednog korisnika.",
"empty_column.notification_requests": "Sve je čisto! Ovde nema ničega. Kada dobijete nova obaveštenja, ona e se pojaviti ovde u skladu sa vašim podešavanjima.", "empty_column.notification_requests": "Sve je čisto! Ovde nema ničega. Kada dobijete nova obaveštenja, ona će se pojaviti ovde u skladu sa vašim podešavanjima.",
"empty_column.notifications": "Još uvek nemate nikakva obaveštenja. Kada drugi ljudi budu u interakciji sa vama, videćete to ovde.", "empty_column.notifications": "Još uvek nemate nikakva obaveštenja. Kada drugi ljudi budu u interakciji sa vama, videćete to ovde.",
"empty_column.public": "Ovde nema ničega! Napišite nešto javno ili ručno pratite korisnike sa drugih servera da biste ovo popunili", "empty_column.public": "Ovde nema ničega! Napišite nešto javno ili ručno pratite korisnike sa drugih servera da biste ovo popunili",
"error.unexpected_crash.explanation": "Zbog greške u našem kodu ili problema sa kompatibilnošću pregledača, ova stranica se nije mogla pravilno prikazati.", "error.unexpected_crash.explanation": "Zbog greške u našem kodu ili problema sa kompatibilnošću pregledača, ova stranica se nije mogla pravilno prikazati.",
@ -267,6 +297,7 @@
"filter_modal.select_filter.subtitle": "Koristite postojeću kategoriju ili kreirajte novu", "filter_modal.select_filter.subtitle": "Koristite postojeću kategoriju ili kreirajte novu",
"filter_modal.select_filter.title": "Filtriraj ovu objavu", "filter_modal.select_filter.title": "Filtriraj ovu objavu",
"filter_modal.title.status": "Filtriraj objavu", "filter_modal.title.status": "Filtriraj objavu",
"filtered_notifications_banner.mentions": "{count, plural, one {pominjanje} few {pominjanja} other {pominjanja}}",
"filtered_notifications_banner.pending_requests": "Obaveštenja od {count, plural, =0 {nikoga koga možda poznajete} one {# osobe koju možda poznajete} few {# osobe koje možda poznajete} other {# osoba koje možda poznajete}}", "filtered_notifications_banner.pending_requests": "Obaveštenja od {count, plural, =0 {nikoga koga možda poznajete} one {# osobe koju možda poznajete} few {# osobe koje možda poznajete} other {# osoba koje možda poznajete}}",
"filtered_notifications_banner.title": "Filtrirana obaveštenja", "filtered_notifications_banner.title": "Filtrirana obaveštenja",
"firehose.all": "Sve", "firehose.all": "Sve",
@ -279,7 +310,7 @@
"follow_suggestions.dismiss": "Ne prikazuj ponovo", "follow_suggestions.dismiss": "Ne prikazuj ponovo",
"follow_suggestions.hints.featured": "Ovaj profil je ručno izabrao tim {domain}.", "follow_suggestions.hints.featured": "Ovaj profil je ručno izabrao tim {domain}.",
"follow_suggestions.hints.friends_of_friends": "Ovaj profil je popularan među ljudima koje pratite.", "follow_suggestions.hints.friends_of_friends": "Ovaj profil je popularan među ljudima koje pratite.",
"follow_suggestions.hints.most_followed": "Ovaj profil je jedan od najpraenijih na {domain}.", "follow_suggestions.hints.most_followed": "Ovaj profil je jedan od najpraćenijih na {domain}.",
"follow_suggestions.hints.most_interactions": "Ovaj profil je nedavno dobio veliku pažnju na {domain}.", "follow_suggestions.hints.most_interactions": "Ovaj profil je nedavno dobio veliku pažnju na {domain}.",
"follow_suggestions.hints.similar_to_recently_followed": "Ovaj profil je sličan profilima koje ste nedavno zapratili.", "follow_suggestions.hints.similar_to_recently_followed": "Ovaj profil je sličan profilima koje ste nedavno zapratili.",
"follow_suggestions.personalized_suggestion": "Personalizovani predlog", "follow_suggestions.personalized_suggestion": "Personalizovani predlog",
@ -315,7 +346,7 @@
"home.column_settings.show_reblogs": "Prikaži podržavanja", "home.column_settings.show_reblogs": "Prikaži podržavanja",
"home.column_settings.show_replies": "Prikaži odgovore", "home.column_settings.show_replies": "Prikaži odgovore",
"home.hide_announcements": "Sakrij najave", "home.hide_announcements": "Sakrij najave",
"home.pending_critical_update.body": "Ažurirajte svoj Mastodon server što je pre mogue!", "home.pending_critical_update.body": "Ažurirajte svoj Mastodon server što je pre moguće!",
"home.pending_critical_update.link": "Pogledajte ažuriranja", "home.pending_critical_update.link": "Pogledajte ažuriranja",
"home.pending_critical_update.title": "Dostupno je kritično bezbednosno ažuriranje!", "home.pending_critical_update.title": "Dostupno je kritično bezbednosno ažuriranje!",
"home.show_announcements": "Prijaži najave", "home.show_announcements": "Prijaži najave",
@ -329,7 +360,7 @@
"interaction_modal.on_another_server": "Na drugom serveru", "interaction_modal.on_another_server": "Na drugom serveru",
"interaction_modal.on_this_server": "Na ovom serveru", "interaction_modal.on_this_server": "Na ovom serveru",
"interaction_modal.sign_in": "Niste prijavljeni na ovaj server. Gde je hostovan vaš nalog?", "interaction_modal.sign_in": "Niste prijavljeni na ovaj server. Gde je hostovan vaš nalog?",
"interaction_modal.sign_in_hint": "Savet: To je veb sajt na kome ste se registrovali. Ako se ne seate, potražite e-poruku dobrodošlice u svom prijemnom sandučetu. Takođe možete uneti svoje puno korisničko ime! (npr. @Mastodon@mastodon.social)", "interaction_modal.sign_in_hint": "Savet: To je veb sajt na kome ste se registrovali. Ako se ne sećate, potražite e-poruku dobrodošlice u svom prijemnom sandučetu. Takođe možete uneti svoje puno korisničko ime! (npr. @Mastodon@mastodon.social)",
"interaction_modal.title.favourite": "Označi objavu korisnika {name} kao omiljenu", "interaction_modal.title.favourite": "Označi objavu korisnika {name} kao omiljenu",
"interaction_modal.title.follow": "Zaprati {name}", "interaction_modal.title.follow": "Zaprati {name}",
"interaction_modal.title.reblog": "Podrži objavu korisnika {name}", "interaction_modal.title.reblog": "Podrži objavu korisnika {name}",
@ -397,6 +428,15 @@
"loading_indicator.label": "Učitavanje…", "loading_indicator.label": "Učitavanje…",
"media_gallery.toggle_visible": "{number, plural, one {Sakrij sliku} few {Sakrij slike} other {Sakrij slike}}", "media_gallery.toggle_visible": "{number, plural, one {Sakrij sliku} few {Sakrij slike} other {Sakrij slike}}",
"moved_to_account_banner.text": "Vaš nalog {disabledAccount} je trenutno onemogućen jer ste prešli na {movedToAccount}.", "moved_to_account_banner.text": "Vaš nalog {disabledAccount} je trenutno onemogućen jer ste prešli na {movedToAccount}.",
"mute_modal.hide_from_notifications": "Sakrij iz obaveštenja",
"mute_modal.hide_options": "Sakrij opcije",
"mute_modal.indefinite": "Dok ih ne uklonim iz ignorisanih",
"mute_modal.show_options": "Prikaži opcije",
"mute_modal.they_can_mention_and_follow": "Mogu da vas pominju i prate, ali ih nećete videti.",
"mute_modal.they_wont_know": "Neće znati da su ignorisani.",
"mute_modal.title": "Ignorisati korisnika?",
"mute_modal.you_wont_see_mentions": "Nećete videti objave koje ga pominju.",
"mute_modal.you_wont_see_posts": "I dalje može da vidi vaše objave, ali vi nećete videti njegove.",
"navigation_bar.about": "Osnovni podaci", "navigation_bar.about": "Osnovni podaci",
"navigation_bar.advanced_interface": "Otvori u naprednom veb okruženju", "navigation_bar.advanced_interface": "Otvori u naprednom veb okruženju",
"navigation_bar.blocks": "Blokirani korisnici", "navigation_bar.blocks": "Blokirani korisnici",
@ -432,6 +472,11 @@
"notification.own_poll": "Vaša anketa je završena", "notification.own_poll": "Vaša anketa je završena",
"notification.poll": "Završena je anketa u kojoj ste glasali", "notification.poll": "Završena je anketa u kojoj ste glasali",
"notification.reblog": "{name} je podržao vašu objavu", "notification.reblog": "{name} je podržao vašu objavu",
"notification.relationships_severance_event": "Izgubljena veza sa {name}",
"notification.relationships_severance_event.account_suspension": "Administrator sa {from} je suspendovao {target}, što znači da više ne možete da primate ažuriranja od njih niti da komunicirate sa njima.",
"notification.relationships_severance_event.domain_block": "Administrator sa {from} je blokirao {target}, uključujući vaše pratioce: {followersCount} i {followingCount, plural, one {# nalog} few {# naloga} other {# naloga}} koje pratite.",
"notification.relationships_severance_event.learn_more": "Saznajte više",
"notification.relationships_severance_event.user_domain_block": "Blokirači ste {target}, uključujući vaše pratioce: {followersCount} i {followingCount, plural, one {# nalog} few {# naloga} other {# naloga}} koje pratite.",
"notification.status": "{name} je upravo objavio", "notification.status": "{name} je upravo objavio",
"notification.update": "{name} je uredio objavu", "notification.update": "{name} je uredio objavu",
"notification_requests.accept": "Prihvati", "notification_requests.accept": "Prihvati",
@ -444,6 +489,8 @@
"notifications.column_settings.admin.sign_up": "Nove ragistracije:", "notifications.column_settings.admin.sign_up": "Nove ragistracije:",
"notifications.column_settings.alert": "Obaveštenja na radnoj površini", "notifications.column_settings.alert": "Obaveštenja na radnoj površini",
"notifications.column_settings.favourite": "Omiljeno:", "notifications.column_settings.favourite": "Omiljeno:",
"notifications.column_settings.filter_bar.advanced": "Prikaži sve kategorije",
"notifications.column_settings.filter_bar.category": "Traka za brzo filtriranje",
"notifications.column_settings.follow": "Novi pratioci:", "notifications.column_settings.follow": "Novi pratioci:",
"notifications.column_settings.follow_request": "Novi zahtevi za praćenje:", "notifications.column_settings.follow_request": "Novi zahtevi za praćenje:",
"notifications.column_settings.mention": "Pominjanja:", "notifications.column_settings.mention": "Pominjanja:",
@ -471,7 +518,7 @@
"notifications.permission_required": "Obaveštenja na radnoj površini nisu dostupna jer potrebna dozvola nije dodeljena.", "notifications.permission_required": "Obaveštenja na radnoj površini nisu dostupna jer potrebna dozvola nije dodeljena.",
"notifications.policy.filter_new_accounts.hint": "Kreirano {days, plural, one {u poslednjeg # dana} few {u poslednja # dana} other {u poslednjih # dana}}", "notifications.policy.filter_new_accounts.hint": "Kreirano {days, plural, one {u poslednjeg # dana} few {u poslednja # dana} other {u poslednjih # dana}}",
"notifications.policy.filter_new_accounts_title": "Novi nalozi", "notifications.policy.filter_new_accounts_title": "Novi nalozi",
"notifications.policy.filter_not_followers_hint": "Uključujui ljude koji su vas pratili manje od {days, plural, one {# dana} few {# dana} other {# dana}}", "notifications.policy.filter_not_followers_hint": "Uključujući ljude koji su vas pratili manje od {days, plural, one {# dana} few {# dana} other {# dana}}",
"notifications.policy.filter_not_followers_title": "Ljudi koji vas ne prate", "notifications.policy.filter_not_followers_title": "Ljudi koji vas ne prate",
"notifications.policy.filter_not_following_hint": "Dok ih ručno ne odobrite", "notifications.policy.filter_not_following_hint": "Dok ih ručno ne odobrite",
"notifications.policy.filter_not_following_title": "Ljudi koje ne pratite", "notifications.policy.filter_not_following_title": "Ljudi koje ne pratite",
@ -483,14 +530,14 @@
"notifications_permission_banner.title": "Nikada ništa ne propustite", "notifications_permission_banner.title": "Nikada ništa ne propustite",
"onboarding.action.back": "Vrati me nazad", "onboarding.action.back": "Vrati me nazad",
"onboarding.actions.back": "Vrati me nazad", "onboarding.actions.back": "Vrati me nazad",
"onboarding.actions.go_to_explore": "Pogledaj šta je u trendu", "onboarding.actions.go_to_explore": "Odvedi me u trending",
"onboarding.actions.go_to_home": "Idi na početnu stranicu", "onboarding.actions.go_to_home": "Odvedi me na početnu stranicu",
"onboarding.compose.template": "Zdravo #Mastodon!", "onboarding.compose.template": "Zdravo #Mastodon!",
"onboarding.follows.empty": "Nažalost, trenutno se ne mogu prikazati rezultati. Možete pokušati sa korišćenjem pretrage ili pregledanjem stranice za istraživanje da biste pronašli ljude koje ćete pratiti ili pokušajte ponovo kasnije.", "onboarding.follows.empty": "Nažalost, trenutno se ne mogu prikazati rezultati. Možete pokušati sa korišćenjem pretrage ili pregledanjem stranice za istraživanje da biste pronašli ljude koje ćete pratiti ili pokušajte ponovo kasnije.",
"onboarding.follows.lead": "Vi sami birate svoju početnu stranicu. Što više ljudi pratite, to će biti aktivnije i zanimljivije. Ovi profili mogu biti dobra polazna tačka—uvek možete da ih prestanete pratiti kasnije!", "onboarding.follows.lead": "Vaša početna stranica je primarni način da doživite Mastodon. Što više ljudi budete pratili, to će biti aktivnije i zanimljivije. Da biste započeli, evo nekoliko predloga:",
"onboarding.follows.title": "Personalizujte svoju početnu stranicu", "onboarding.follows.title": "Personalizujte svoju početnu stranicu",
"onboarding.profile.discoverable": "Neka se moj profil može otkriti drugima", "onboarding.profile.discoverable": "Neka se moj profil može otkriti drugima",
"onboarding.profile.discoverable_hint": "Kada omogućite mogućnost otkrivanja na Mastodon-u, vaše objave se mogu pojaviti u rezultatima pretrage i u trendu, a vaš profil može biti predložen ljudima sa sličnim interesovanjima.", "onboarding.profile.discoverable_hint": "Kada omogućite mogućnost otkrivanja na Mastodon-u, vaše objave se mogu pojaviti u rezultatima pretrage i u trendu, a vaš profil može biti predložen ljudima sa sličnim interesovanjima.",
"onboarding.profile.display_name": "Ime za prikaz", "onboarding.profile.display_name": "Ime za prikaz",
"onboarding.profile.display_name_hint": "Vaše puno ime ili nadimak…", "onboarding.profile.display_name_hint": "Vaše puno ime ili nadimak…",
"onboarding.profile.lead": "Ovo možete uvek dovršiti kasnije u podešavanjima, gde je dostupno još više opcija prilagođavanja.", "onboarding.profile.lead": "Ovo možete uvek dovršiti kasnije u podešavanjima, gde je dostupno još više opcija prilagođavanja.",
@ -504,17 +551,17 @@
"onboarding.share.message": "Ja sam {username} na #Mastodon-u! Pratite me na {url}", "onboarding.share.message": "Ja sam {username} na #Mastodon-u! Pratite me na {url}",
"onboarding.share.next_steps": "Mogući sledeći koraci:", "onboarding.share.next_steps": "Mogući sledeći koraci:",
"onboarding.share.title": "Podelite svoj profil", "onboarding.share.title": "Podelite svoj profil",
"onboarding.start.lead": "Vaš novi Mastodon nalog je spreman. Evo kako to možete iskoristiti na najbolji način:", "onboarding.start.lead": "Sada ste deo Mastodon-a, jedinstvene, decentralizovane platforme društvenih medija na kojoj vi a ne algoritam birate svoje iskustvo. Hajde da počnemo na ovoj novoj društvenoj granici:",
"onboarding.start.skip": "Želite da preskočite?", "onboarding.start.skip": "Ne treba vam pomoć za početak?",
"onboarding.start.title": "Uspeli ste!", "onboarding.start.title": "Uspeli ste!",
"onboarding.steps.follow_people.body": "Vi sami birate svoju početnu stranicu. Hajde da ga ispunimo zanimljivim ljudima.", "onboarding.steps.follow_people.body": "Praćenje zanimljivih ljudi je ono o čemu se radi u Mastodon-u.",
"onboarding.steps.follow_people.title": "Personalizujte svoju početnu stranicu", "onboarding.steps.follow_people.title": "Personalizujte svoju početnu stranicu",
"onboarding.steps.publish_status.body": "Reci zdravo svetu.", "onboarding.steps.publish_status.body": "Pozdravite svet tekstom, slikama, video snimcima ili anketama {emoji}",
"onboarding.steps.publish_status.title": "Napišite svoju prvu objavu", "onboarding.steps.publish_status.title": "Napišite svoju prvu objavu",
"onboarding.steps.setup_profile.body": "Veća je verovatnoća da će drugi komunicirati sa vama sa popunjenim profilom.", "onboarding.steps.setup_profile.body": "Pojačajte svoje interakcije tako što ćete imati sveobuhvatan profil.",
"onboarding.steps.setup_profile.title": "Prilagodite svoj profil", "onboarding.steps.setup_profile.title": "Personalizujte svoj profil",
"onboarding.steps.share_profile.body": "Neka vaši prijatelji znaju kako da vas pronađu na Mastodon-u!", "onboarding.steps.share_profile.body": "Neka vaši prijatelji znaju kako da vas pronađu na Mastodon-u!",
"onboarding.steps.share_profile.title": "Podelite svoj profil", "onboarding.steps.share_profile.title": "Podelite svoj Mastodon profil",
"onboarding.tips.2fa": "<strong>Da li ste znali?</strong> Možete da zaštitite svoj nalog podešavanjem dvostruke potvrde identiteta u podešavanjima naloga. Radi sa bilo kojom TOTP aplikacijom po vašem izboru, nije potreban broj telefona!", "onboarding.tips.2fa": "<strong>Da li ste znali?</strong> Možete da zaštitite svoj nalog podešavanjem dvostruke potvrde identiteta u podešavanjima naloga. Radi sa bilo kojom TOTP aplikacijom po vašem izboru, nije potreban broj telefona!",
"onboarding.tips.accounts_from_other_servers": "<strong>Da li ste znali?</strong> Pošto je Mastodon decentralizovan, neki profili na koje naiđete biće smešteni na serverima različitim od vašeg. A ipak možete da komunicirate sa njima besprekorno! Njihov server je u drugoj polovini njihovog korisničkog imena!", "onboarding.tips.accounts_from_other_servers": "<strong>Da li ste znali?</strong> Pošto je Mastodon decentralizovan, neki profili na koje naiđete biće smešteni na serverima različitim od vašeg. A ipak možete da komunicirate sa njima besprekorno! Njihov server je u drugoj polovini njihovog korisničkog imena!",
"onboarding.tips.migration": "<strong>Da li ste znali?</strong> Ako smatrate da {domain} nije odličan izbor servera za vas u budućnosti, možete da pređete na drugi Mastodon server bez gubitka pratilaca. Možete čak i da hostujete sopstveni server!", "onboarding.tips.migration": "<strong>Da li ste znali?</strong> Ako smatrate da {domain} nije odličan izbor servera za vas u budućnosti, možete da pređete na drugi Mastodon server bez gubitka pratilaca. Možete čak i da hostujete sopstveni server!",
@ -539,7 +586,7 @@
"privacy.private.short": "Pratioci", "privacy.private.short": "Pratioci",
"privacy.public.long": "Bilo ko na Mastodon-u i van njega", "privacy.public.long": "Bilo ko na Mastodon-u i van njega",
"privacy.public.short": "Javno", "privacy.public.short": "Javno",
"privacy.unlisted.additional": "Ovo se ponaša potpuno kao javno, osim što se objava nee pojavljivati u izvorima uživo ili heš oznakama, istraživanjima ili pretrazi Mastodon-a, čak i ako ste uključeni u celom nalogu.", "privacy.unlisted.additional": "Ovo se ponaša potpuno kao javno, osim što se objava neće pojavljivati u izvorima uživo ili heš oznakama, istraživanjima ili pretrazi Mastodon-a, čak i ako ste uključeni u celom nalogu.",
"privacy.unlisted.long": "Manje algoritamskih fanfara", "privacy.unlisted.long": "Manje algoritamskih fanfara",
"privacy.unlisted.short": "Tiha javnost", "privacy.unlisted.short": "Tiha javnost",
"privacy_policy.last_updated": "Poslednje ažuriranje {date}", "privacy_policy.last_updated": "Poslednje ažuriranje {date}",

View File

@ -220,7 +220,16 @@
"domain_pill.activitypub_lets_connect": "Омогућује вам да се повежете и комуницирате са људима не само на Mastodon-у, већ и у различитим друштвеним апликацијама.", "domain_pill.activitypub_lets_connect": "Омогућује вам да се повежете и комуницирате са људима не само на Mastodon-у, већ и у различитим друштвеним апликацијама.",
"domain_pill.activitypub_like_language": "ActivityPub је као језик којим Mastodon говори са другим друштвеним мрежама.", "domain_pill.activitypub_like_language": "ActivityPub је као језик којим Mastodon говори са другим друштвеним мрежама.",
"domain_pill.server": "Сервер", "domain_pill.server": "Сервер",
"domain_pill.their_handle": "Његов регулатор:",
"domain_pill.their_server": "Њихов дигитални дом, где живе све њихове објаве.",
"domain_pill.their_username": "Њихов јединствени идентификатор на њиховом серверу. Могуће је пронаћи кориснике са истим корисничким именом на различитим серверима.",
"domain_pill.username": "Корисничко име", "domain_pill.username": "Корисничко име",
"domain_pill.whats_in_a_handle": "Шта је регулатор?",
"domain_pill.who_they_are": "Пошто регулатори говоре ко је неко и где се налази, можете да комуницирате са људима широм друштвеног веба на <button>платформама које покреће ActivityPub</button>.",
"domain_pill.who_you_are": "Пошто ваши регулатори говори ко сте и где сте, људи могу да комуницирају са вама широм друштвеног веба на <button>платформама које покреће ActivityPub</button>.",
"domain_pill.your_handle": "Ваш регулатор:",
"domain_pill.your_server": "Ваш дигитални дом, где живе све ваше објаве. Не свиђа вам се овај? Пренесите сервере у било које време и доведите и своје пратиоце.",
"domain_pill.your_username": "Њихов јединствени идентификатор на њиховом серверу. Могуће је пронаћи кориснике са истим корисничким именом на различитим серверима.",
"embed.instructions": "Уградите ову објаву на свој веб сајт копирањем кода испод.", "embed.instructions": "Уградите ову објаву на свој веб сајт копирањем кода испод.",
"embed.preview": "Ево како ће то изгледати:", "embed.preview": "Ево како ће то изгледати:",
"emoji_button.activity": "Активности", "emoji_button.activity": "Активности",
@ -288,6 +297,7 @@
"filter_modal.select_filter.subtitle": "Користите постојећу категорију или креирајте нову", "filter_modal.select_filter.subtitle": "Користите постојећу категорију или креирајте нову",
"filter_modal.select_filter.title": "Филтрирај ову објаву", "filter_modal.select_filter.title": "Филтрирај ову објаву",
"filter_modal.title.status": "Филтрирај објаву", "filter_modal.title.status": "Филтрирај објаву",
"filtered_notifications_banner.mentions": "{count, plural, one {помињање} few {помињања} other {помињања}}",
"filtered_notifications_banner.pending_requests": "Обавештења од {count, plural, =0 {никога кога можда познајете} one {# особе коју можда познајете} few {# особе које можда познајете} other {# особа које можда познајете}}", "filtered_notifications_banner.pending_requests": "Обавештења од {count, plural, =0 {никога кога можда познајете} one {# особе коју можда познајете} few {# особе које можда познајете} other {# особа које можда познајете}}",
"filtered_notifications_banner.title": "Филтрирана обавештења", "filtered_notifications_banner.title": "Филтрирана обавештења",
"firehose.all": "Све", "firehose.all": "Све",
@ -462,7 +472,11 @@
"notification.own_poll": "Ваша анкета је завршена", "notification.own_poll": "Ваша анкета је завршена",
"notification.poll": "Завршена је анкета у којој сте гласали", "notification.poll": "Завршена је анкета у којој сте гласали",
"notification.reblog": "{name} је подржао вашу објаву", "notification.reblog": "{name} је подржао вашу објаву",
"notification.relationships_severance_event": "Изгубљена веза са {name}",
"notification.relationships_severance_event.account_suspension": "Администратор са {from} је суспендовао {target}, што значи да више не можете да примате ажурирања од њих нити да комуницирате са њима.",
"notification.relationships_severance_event.domain_block": "Администратор са {from} је блокирао {target}, укључујући ваше пратиоце: {followersCount} и {followingCount, plural, one {# налог} few {# налогa} other {# налога}} које пратите.",
"notification.relationships_severance_event.learn_more": "Сазнајте више", "notification.relationships_severance_event.learn_more": "Сазнајте више",
"notification.relationships_severance_event.user_domain_block": "Блокирачи сте {target}, укључујући ваше пратиоце: {followersCount} и {followingCount, plural, one {# налог} few {# налогa} other {# налога}} које пратите.",
"notification.status": "{name} је управо објавио", "notification.status": "{name} је управо објавио",
"notification.update": "{name} је уредио објаву", "notification.update": "{name} је уредио објаву",
"notification_requests.accept": "Прихвати", "notification_requests.accept": "Прихвати",
@ -476,6 +490,7 @@
"notifications.column_settings.alert": "Обавештења на радној површини", "notifications.column_settings.alert": "Обавештења на радној површини",
"notifications.column_settings.favourite": "Омиљено:", "notifications.column_settings.favourite": "Омиљено:",
"notifications.column_settings.filter_bar.advanced": "Прикажи све категорије", "notifications.column_settings.filter_bar.advanced": "Прикажи све категорије",
"notifications.column_settings.filter_bar.category": "Трака за брзо филтрирање",
"notifications.column_settings.follow": "Нови пратиоци:", "notifications.column_settings.follow": "Нови пратиоци:",
"notifications.column_settings.follow_request": "Нови захтеви за праћење:", "notifications.column_settings.follow_request": "Нови захтеви за праћење:",
"notifications.column_settings.mention": "Помињања:", "notifications.column_settings.mention": "Помињања:",

View File

@ -298,7 +298,6 @@
"filter_modal.select_filter.title": "Filtrera detta inlägg", "filter_modal.select_filter.title": "Filtrera detta inlägg",
"filter_modal.title.status": "Filtrera ett inlägg", "filter_modal.title.status": "Filtrera ett inlägg",
"filtered_notifications_banner.pending_requests": "Aviseringar från {count, plural, =0 {ingen} one {en person} other {# personer}} du kanske känner", "filtered_notifications_banner.pending_requests": "Aviseringar från {count, plural, =0 {ingen} one {en person} other {# personer}} du kanske känner",
"filtered_notifications_banner.private_mentions": "{count, plural, one {privat omnämnande} other {privat omnämnande}}",
"filtered_notifications_banner.title": "Filtrerade aviseringar", "filtered_notifications_banner.title": "Filtrerade aviseringar",
"firehose.all": "Allt", "firehose.all": "Allt",
"firehose.local": "Denna server", "firehose.local": "Denna server",

View File

@ -298,7 +298,6 @@
"filter_modal.select_filter.title": "กรองโพสต์นี้", "filter_modal.select_filter.title": "กรองโพสต์นี้",
"filter_modal.title.status": "กรองโพสต์", "filter_modal.title.status": "กรองโพสต์",
"filtered_notifications_banner.pending_requests": "การแจ้งเตือนจาก {count, plural, =0 {ไม่มีใคร} other {# คน}} ที่คุณอาจรู้จัก", "filtered_notifications_banner.pending_requests": "การแจ้งเตือนจาก {count, plural, =0 {ไม่มีใคร} other {# คน}} ที่คุณอาจรู้จัก",
"filtered_notifications_banner.private_mentions": "{count, plural, other {การกล่าวถึงแบบส่วนตัว}}",
"filtered_notifications_banner.title": "การแจ้งเตือนที่กรองอยู่", "filtered_notifications_banner.title": "การแจ้งเตือนที่กรองอยู่",
"firehose.all": "ทั้งหมด", "firehose.all": "ทั้งหมด",
"firehose.local": "เซิร์ฟเวอร์นี้", "firehose.local": "เซิร์ฟเวอร์นี้",

View File

@ -297,8 +297,8 @@
"filter_modal.select_filter.subtitle": "Mevcut bir kategoriyi kullan veya yeni bir tane oluştur", "filter_modal.select_filter.subtitle": "Mevcut bir kategoriyi kullan veya yeni bir tane oluştur",
"filter_modal.select_filter.title": "Bu gönderiyi süzgeçle", "filter_modal.select_filter.title": "Bu gönderiyi süzgeçle",
"filter_modal.title.status": "Bir gönderi süzgeçle", "filter_modal.title.status": "Bir gönderi süzgeçle",
"filtered_notifications_banner.mentions": "{count, plural, one {bahsetme} other {bahsetme}}",
"filtered_notifications_banner.pending_requests": "Bildiğiniz {count, plural, =0 {hiç kimseden} one {bir kişiden} other {# kişiden}} bildirim", "filtered_notifications_banner.pending_requests": "Bildiğiniz {count, plural, =0 {hiç kimseden} one {bir kişiden} other {# kişiden}} bildirim",
"filtered_notifications_banner.private_mentions": "{count, plural, one {özel değinme} other {özel değinme}}",
"filtered_notifications_banner.title": "Filtrelenmiş bildirimler", "filtered_notifications_banner.title": "Filtrelenmiş bildirimler",
"firehose.all": "Tümü", "firehose.all": "Tümü",
"firehose.local": "Bu sunucu", "firehose.local": "Bu sunucu",
@ -468,7 +468,7 @@
"notification.favourite": "{name} gönderinizi beğendi", "notification.favourite": "{name} gönderinizi beğendi",
"notification.follow": "{name} seni takip etti", "notification.follow": "{name} seni takip etti",
"notification.follow_request": "{name} size takip isteği gönderdi", "notification.follow_request": "{name} size takip isteği gönderdi",
"notification.mention": "{name} sana değindi", "notification.mention": "{name} senden bahsetti",
"notification.own_poll": "Anketiniz sona erdi", "notification.own_poll": "Anketiniz sona erdi",
"notification.poll": "Oy verdiğiniz bir anket sona erdi", "notification.poll": "Oy verdiğiniz bir anket sona erdi",
"notification.reblog": "{name} gönderini yeniden paylaştı", "notification.reblog": "{name} gönderini yeniden paylaştı",
@ -493,7 +493,7 @@
"notifications.column_settings.filter_bar.category": "Hızlı filtre çubuğu", "notifications.column_settings.filter_bar.category": "Hızlı filtre çubuğu",
"notifications.column_settings.follow": "Yeni takipçiler:", "notifications.column_settings.follow": "Yeni takipçiler:",
"notifications.column_settings.follow_request": "Yeni takip istekleri:", "notifications.column_settings.follow_request": "Yeni takip istekleri:",
"notifications.column_settings.mention": "Değinmeler:", "notifications.column_settings.mention": "Bahsetmeler:",
"notifications.column_settings.poll": "Anket sonuçları:", "notifications.column_settings.poll": "Anket sonuçları:",
"notifications.column_settings.push": "Anlık bildirimler", "notifications.column_settings.push": "Anlık bildirimler",
"notifications.column_settings.reblog": "Yeniden paylaşanlar:", "notifications.column_settings.reblog": "Yeniden paylaşanlar:",
@ -507,7 +507,7 @@
"notifications.filter.boosts": "Yeniden paylaşımlar", "notifications.filter.boosts": "Yeniden paylaşımlar",
"notifications.filter.favourites": "Favorilerin", "notifications.filter.favourites": "Favorilerin",
"notifications.filter.follows": "Takip edilenler", "notifications.filter.follows": "Takip edilenler",
"notifications.filter.mentions": "Değinmeler", "notifications.filter.mentions": "Bahsetmeler",
"notifications.filter.polls": "Anket sonuçları", "notifications.filter.polls": "Anket sonuçları",
"notifications.filter.statuses": "Takip ettiğiniz kişilerden gelen güncellemeler", "notifications.filter.statuses": "Takip ettiğiniz kişilerden gelen güncellemeler",
"notifications.grant_permission": "İzin ver.", "notifications.grant_permission": "İzin ver.",

View File

@ -287,7 +287,6 @@
"filter_modal.select_filter.title": "Фільтрувати цей допис", "filter_modal.select_filter.title": "Фільтрувати цей допис",
"filter_modal.title.status": "Фільтрувати допис", "filter_modal.title.status": "Фільтрувати допис",
"filtered_notifications_banner.pending_requests": "Сповіщення від {count, plural, =0 {жодної особи} one {однієї особи} few {# осіб} many {# осіб} other {# особи}}, котрих ви можете знати", "filtered_notifications_banner.pending_requests": "Сповіщення від {count, plural, =0 {жодної особи} one {однієї особи} few {# осіб} many {# осіб} other {# особи}}, котрих ви можете знати",
"filtered_notifications_banner.private_mentions": "{count, plural, one {приватна згадка} few {приватні згадки} many {приватні згадки} other {приватна згадка}}",
"filtered_notifications_banner.title": "Відфільтровані сповіщення", "filtered_notifications_banner.title": "Відфільтровані сповіщення",
"firehose.all": "Всі", "firehose.all": "Всі",
"firehose.local": "Цей сервер", "firehose.local": "Цей сервер",

View File

@ -297,8 +297,8 @@
"filter_modal.select_filter.subtitle": "Sử dụng một danh mục hiện có hoặc tạo một danh mục mới", "filter_modal.select_filter.subtitle": "Sử dụng một danh mục hiện có hoặc tạo một danh mục mới",
"filter_modal.select_filter.title": "Lọc tút này", "filter_modal.select_filter.title": "Lọc tút này",
"filter_modal.title.status": "Lọc một tút", "filter_modal.title.status": "Lọc một tút",
"filtered_notifications_banner.mentions": "{count, plural, other {lượt nhắc}}",
"filtered_notifications_banner.pending_requests": "Thông báo từ {count, plural, =0 {không ai} other {# người}} bạn có thể biết", "filtered_notifications_banner.pending_requests": "Thông báo từ {count, plural, =0 {không ai} other {# người}} bạn có thể biết",
"filtered_notifications_banner.private_mentions": "{count, plural, other {lượt nhắc}}",
"filtered_notifications_banner.title": "Thông báo đã lọc", "filtered_notifications_banner.title": "Thông báo đã lọc",
"firehose.all": "Toàn bộ", "firehose.all": "Toàn bộ",
"firehose.local": "Máy chủ này", "firehose.local": "Máy chủ này",

View File

@ -297,8 +297,8 @@
"filter_modal.select_filter.subtitle": "使用一个已存在类别,或创建一个新类别", "filter_modal.select_filter.subtitle": "使用一个已存在类别,或创建一个新类别",
"filter_modal.select_filter.title": "过滤此嘟文", "filter_modal.select_filter.title": "过滤此嘟文",
"filter_modal.title.status": "过滤一条嘟文", "filter_modal.title.status": "过滤一条嘟文",
"filtered_notifications_banner.mentions": "{count, plural, other {提及}}",
"filtered_notifications_banner.pending_requests": "来自你可能认识的 {count, plural, =0 {0 个人} other {# 个人}}的通知", "filtered_notifications_banner.pending_requests": "来自你可能认识的 {count, plural, =0 {0 个人} other {# 个人}}的通知",
"filtered_notifications_banner.private_mentions": "{count, plural, other {私下提及}}",
"filtered_notifications_banner.title": "通知(已过滤)", "filtered_notifications_banner.title": "通知(已过滤)",
"firehose.all": "全部", "firehose.all": "全部",
"firehose.local": "此服务器", "firehose.local": "此服务器",

View File

@ -298,7 +298,6 @@
"filter_modal.select_filter.title": "過濾此帖文", "filter_modal.select_filter.title": "過濾此帖文",
"filter_modal.title.status": "過濾一則帖文", "filter_modal.title.status": "過濾一則帖文",
"filtered_notifications_banner.pending_requests": "來自 {count, plural, =0 {0 位} other {# 位}}你可能認識的人的通知", "filtered_notifications_banner.pending_requests": "來自 {count, plural, =0 {0 位} other {# 位}}你可能認識的人的通知",
"filtered_notifications_banner.private_mentions": "{count, plural, one {則私人提及} other {則私人提及}}",
"filtered_notifications_banner.title": "已過濾之通知", "filtered_notifications_banner.title": "已過濾之通知",
"firehose.all": "全部", "firehose.all": "全部",
"firehose.local": "本伺服器", "firehose.local": "本伺服器",

View File

@ -297,8 +297,8 @@
"filter_modal.select_filter.subtitle": "使用既有的類別或是新增", "filter_modal.select_filter.subtitle": "使用既有的類別或是新增",
"filter_modal.select_filter.title": "過濾此嘟文", "filter_modal.select_filter.title": "過濾此嘟文",
"filter_modal.title.status": "過濾一則嘟文", "filter_modal.title.status": "過濾一則嘟文",
"filtered_notifications_banner.mentions": "{count, plural, other {# 則提及}}",
"filtered_notifications_banner.pending_requests": "來自您可能認識的 {count, plural, =0 {0 人} other {# 人}} 之通知", "filtered_notifications_banner.pending_requests": "來自您可能認識的 {count, plural, =0 {0 人} other {# 人}} 之通知",
"filtered_notifications_banner.private_mentions": "{count, plural, other {# 則私訊}}",
"filtered_notifications_banner.title": "已過濾之通知", "filtered_notifications_banner.title": "已過濾之通知",
"firehose.all": "全部", "firehose.all": "全部",
"firehose.local": "本站", "firehose.local": "本站",

View File

@ -35,7 +35,7 @@ class AccountStatusesFilter
return Status.none if account.unavailable? return Status.none if account.unavailable?
if anonymous? if anonymous?
account.statuses.not_local_only.where(visibility: %i(public unlisted)) account.statuses.not_local_only.distributable_visibility
elsif author? elsif author?
account.statuses.all # NOTE: #merge! does not work without the #all account.statuses.all # NOTE: #merge! does not work without the #all
elsif blocked? elsif blocked?

View File

@ -16,7 +16,7 @@ class Admin::StatusFilter
end end
def results def results
scope = @account.statuses.where(visibility: [:public, :unlisted]) scope = @account.statuses.distributable_visibility
params.each do |key, value| params.each do |key, value|
next if IGNORED_PARAMS.include?(key.to_s) next if IGNORED_PARAMS.include?(key.to_s)

View File

@ -59,11 +59,13 @@ class Announcement < ApplicationRecord
end end
def statuses def statuses
@statuses ||= if status_ids.nil? @statuses ||= begin
[] if status_ids.nil?
else []
Status.where(id: status_ids, visibility: [:public, :unlisted]) else
end Status.with_includes.distributable_visibility.where(id: status_ids)
end
end
end end
def tags def tags

View File

@ -35,40 +35,11 @@ module Account::Counters
raise ArgumentError, "Invalid key #{key}" unless ALLOWED_COUNTER_KEYS.include?(key) raise ArgumentError, "Invalid key #{key}" unless ALLOWED_COUNTER_KEYS.include?(key)
raise ArgumentError, 'Do not call update_count! on dirty objects' if association(:account_stat).loaded? && account_stat&.changed? && account_stat.changed_attribute_names_to_save == %w(id) raise ArgumentError, 'Do not call update_count! on dirty objects' if association(:account_stat).loaded? && account_stat&.changed? && account_stat.changed_attribute_names_to_save == %w(id)
value = value.to_i result = updated_account_stat(key, value.to_i)
default_value = value.positive? ? value : 0
# We do an upsert using manually written SQL, as Rails' upsert method does
# not seem to support writing expressions in the UPDATE clause, but only
# re-insert the provided values instead.
# Even ARel seem to be missing proper handling of upserts.
sql = if value.positive? && key == :statuses_count
<<-SQL.squish
INSERT INTO account_stats(account_id, #{key}, created_at, updated_at, last_status_at)
VALUES (:account_id, :default_value, now(), now(), now())
ON CONFLICT (account_id) DO UPDATE
SET #{key} = account_stats.#{key} + :value,
last_status_at = now(),
updated_at = now()
RETURNING id;
SQL
else
<<-SQL.squish
INSERT INTO account_stats(account_id, #{key}, created_at, updated_at)
VALUES (:account_id, :default_value, now(), now())
ON CONFLICT (account_id) DO UPDATE
SET #{key} = account_stats.#{key} + :value,
updated_at = now()
RETURNING id;
SQL
end
sql = AccountStat.sanitize_sql([sql, account_id: id, default_value: default_value, value: value])
account_stat_id = AccountStat.connection.exec_query(sql)[0]['id']
# Reload account_stat if it was loaded, taking into account newly-created unsaved records # Reload account_stat if it was loaded, taking into account newly-created unsaved records
if association(:account_stat).loaded? if association(:account_stat).loaded?
account_stat.id = account_stat_id if account_stat.new_record? account_stat.id = result.first['id'] if account_stat.new_record?
account_stat.reload account_stat.reload
end end
end end
@ -79,6 +50,28 @@ module Account::Counters
private private
def updated_account_stat(key, value)
AccountStat.upsert(
initial_values(key, value),
on_duplicate: Arel.sql(
duplicate_values(key, value).join(', ')
),
unique_by: :account_id
)
end
def initial_values(key, value)
{ :account_id => id, key => [value, 0].max }.tap do |values|
values.merge!(last_status_at: Time.current) if key == :statuses_count
end
end
def duplicate_values(key, value)
["#{key} = (account_stats.#{key} + #{value})", 'updated_at = CURRENT_TIMESTAMP'].tap do |values|
values << 'last_status_at = CURRENT_TIMESTAMP' if key == :statuses_count && value.positive?
end
end
def save_account_stat def save_account_stat
return unless association(:account_stat).loaded? && account_stat&.changed? return unless association(:account_stat).loaded? && account_stat&.changed?

View File

@ -12,7 +12,7 @@ module Status::ThreadingConcern
end end
def self_replies(limit) def self_replies(limit)
account.statuses.where(in_reply_to_id: id, visibility: [:public, :unlisted]).reorder(id: :asc).limit(limit) account.statuses.distributable_visibility.where(in_reply_to_id: id).reorder(id: :asc).limit(limit)
end end
private private

View File

@ -74,6 +74,6 @@ class FeaturedTag < ApplicationRecord
end end
def visible_tagged_account_statuses def visible_tagged_account_statuses
account.statuses.where(visibility: %i(public unlisted)).tagged_with(tag) account.statuses.distributable_visibility.tagged_with(tag)
end end
end end

View File

@ -124,6 +124,7 @@ class Status < ApplicationRecord
scope :tagged_with_none, lambda { |tag_ids| scope :tagged_with_none, lambda { |tag_ids|
where('NOT EXISTS (SELECT * FROM statuses_tags forbidden WHERE forbidden.status_id = statuses.id AND forbidden.tag_id IN (?))', tag_ids) where('NOT EXISTS (SELECT * FROM statuses_tags forbidden WHERE forbidden.status_id = statuses.id AND forbidden.tag_id IN (?))', tag_ids)
} }
scope :distributable_visibility, -> { where(visibility: %i(public unlisted)) }
scope :list_eligible_visibility, -> { where(visibility: %i(public unlisted private)) } scope :list_eligible_visibility, -> { where(visibility: %i(public unlisted private)) }
scope :not_local_only, -> { where(local_only: [false, nil]) } scope :not_local_only, -> { where(local_only: [false, nil]) }

View File

@ -9,7 +9,7 @@ class REST::AnnouncementSerializer < ActiveModel::Serializer
attribute :read, if: :current_user? attribute :read, if: :current_user?
has_many :mentions has_many :mentions
has_many :statuses has_many :statuses, serializer: REST::StatusSerializer
has_many :tags, serializer: REST::StatusSerializer::TagSerializer has_many :tags, serializer: REST::StatusSerializer::TagSerializer
has_many :emojis, serializer: REST::CustomEmojiSerializer has_many :emojis, serializer: REST::CustomEmojiSerializer
has_many :reactions, serializer: REST::ReactionSerializer has_many :reactions, serializer: REST::ReactionSerializer
@ -49,16 +49,4 @@ class REST::AnnouncementSerializer < ActiveModel::Serializer
object.pretty_acct object.pretty_acct
end end
end end
class StatusSerializer < ActiveModel::Serializer
attributes :id, :url
def id
object.id.to_s
end
def url
ActivityPub::TagManager.instance.url_for(object)
end
end
end end

View File

@ -609,6 +609,9 @@ sr-Latn:
actions_description_html: Odlučite koju radnju da sprovedete radi rešavanja ove prijave. Ukoliko sprovedete kaznenu radnju protiv prijavljenog naloga, vlasnik naloga će biti obavešten putem i-mejla, osim ukoliko oznaka <strong>„Nepoželjne poruke”</strong> nije odabrana. actions_description_html: Odlučite koju radnju da sprovedete radi rešavanja ove prijave. Ukoliko sprovedete kaznenu radnju protiv prijavljenog naloga, vlasnik naloga će biti obavešten putem i-mejla, osim ukoliko oznaka <strong>„Nepoželjne poruke”</strong> nije odabrana.
actions_description_remote_html: Odlučite koju radnju da preduzmete radi rešavanja ove prijave. Ovo će uticati samo na to kako <strong>Vaš</strong> server komunicira sa ovim udaljenim nalogom i obrađuje njegov sadržaj. actions_description_remote_html: Odlučite koju radnju da preduzmete radi rešavanja ove prijave. Ovo će uticati samo na to kako <strong>Vaš</strong> server komunicira sa ovim udaljenim nalogom i obrađuje njegov sadržaj.
add_to_report: Dodaj još u prijavu add_to_report: Dodaj još u prijavu
already_suspended_badges:
local: Već suspendovan na ovom serveru
remote: Već suspendovan na njihovom serveru
are_you_sure: Da li ste sigurni? are_you_sure: Da li ste sigurni?
assign_to_self: Dodeli meni assign_to_self: Dodeli meni
assigned: Dodeljeni moderator assigned: Dodeljeni moderator
@ -1678,13 +1681,26 @@ sr-Latn:
import: Uvoz import: Uvoz
import_and_export: Uvoz i izvoz import_and_export: Uvoz i izvoz
migrate: Prebacivanje naloga migrate: Prebacivanje naloga
notifications: Obaveštenja e-poštom
preferences: Podešavanja preferences: Podešavanja
profile: Javni profil profile: Javni profil
relationships: Praćenja i pratioci relationships: Praćenja i pratioci
severed_relationships: Prekinute veze
statuses_cleanup: Automatsko brisanje objava statuses_cleanup: Automatsko brisanje objava
strikes: Moderacijski prestupi strikes: Moderacijski prestupi
two_factor_authentication: Dvofaktorska identifikacija two_factor_authentication: Dvofaktorska identifikacija
webauthn_authentication: Sigurnosni ključevi webauthn_authentication: Sigurnosni ključevi
severed_relationships:
download: Preuzmi (%{count})
event_type:
account_suspension: Suspenzija naloga (%{target_name})
domain_block: Suspenzija servera (%{target_name})
user_domain_block: Blokirali ste %{target_name}
lost_followers: Izgubljeni pratioci
lost_follows: Izgubljena praćenja
preamble: Možete izgubiti praćenja i pratioce kada blokirate domen ili kada vaši moderatori odluče da suspenduju udaljeni server. Kada se to desi, moći ćete da preuzmete liste prekinutih veza, koje treba pregledati i eventualno uvesti na drugi server.
purged: Administratori vašeg servera su obrisali informacije o ovom serveru.
type: Događaj
statuses: statuses:
attached: attached:
audio: audio:
@ -1784,6 +1800,7 @@ sr-Latn:
contrast: Veliki kontrast contrast: Veliki kontrast
default: Mastodon (tamna) default: Mastodon (tamna)
mastodon-light: Mastodon (svetla) mastodon-light: Mastodon (svetla)
system: Automatski (korišćenje sistemske teme)
time: time:
formats: formats:
default: "%d %b %Y, %H:%M" default: "%d %b %Y, %H:%M"
@ -1896,6 +1913,10 @@ sr-Latn:
follows_subtitle: Pratite dobro poznate naloge follows_subtitle: Pratite dobro poznate naloge
follows_title: Koga pratiti follows_title: Koga pratiti
follows_view_more: Pogledajte još ljudi za praćenje follows_view_more: Pogledajte još ljudi za praćenje
hashtags_recent_count:
few: "%{people} osobe u poslednja 2 dana"
one: "%{people} osoba u poslednja 2 dana"
other: "%{people} osoba u poslednja 2 dana"
hashtags_subtitle: Istražite šta je u trendu u poslednja 2 dana hashtags_subtitle: Istražite šta je u trendu u poslednja 2 dana
hashtags_title: Heš oznake u trendu hashtags_title: Heš oznake u trendu
hashtags_view_more: Pogledajte još heš oznaka u trendu hashtags_view_more: Pogledajte još heš oznaka u trendu

View File

@ -609,6 +609,9 @@ sr:
actions_description_html: Одлучите коју радњу да спроведете ради решавања ове пријаве. Уколико спроведете казнену радњу против пријављеног налога, власник налога ће бити обавештен путем и-мејла, осим уколико ознака <strong>„Непожељне поруке”</strong> није одабрана. actions_description_html: Одлучите коју радњу да спроведете ради решавања ове пријаве. Уколико спроведете казнену радњу против пријављеног налога, власник налога ће бити обавештен путем и-мејла, осим уколико ознака <strong>„Непожељне поруке”</strong> није одабрана.
actions_description_remote_html: Одлучите коју радњу да предузмете ради решавања ове пријаве. Ово ће утицати само на то како <strong>Ваш</strong> сервер комуницира са овим удаљеним налогом и обрађује његов садржај. actions_description_remote_html: Одлучите коју радњу да предузмете ради решавања ове пријаве. Ово ће утицати само на то како <strong>Ваш</strong> сервер комуницира са овим удаљеним налогом и обрађује његов садржај.
add_to_report: Додај још у пријаву add_to_report: Додај још у пријаву
already_suspended_badges:
local: Већ суспендован на овом серверу
remote: Већ суспендован на њиховом серверу
are_you_sure: Да ли сте сигурни? are_you_sure: Да ли сте сигурни?
assign_to_self: Додели мени assign_to_self: Додели мени
assigned: Додељени модератор assigned: Додељени модератор
@ -1678,13 +1681,26 @@ sr:
import: Увоз import: Увоз
import_and_export: Увоз и извоз import_and_export: Увоз и извоз
migrate: Пребацивање налога migrate: Пребацивање налога
notifications: Обавештења е-поштом
preferences: Подешавања preferences: Подешавања
profile: Јавни профил profile: Јавни профил
relationships: Праћења и пратиоци relationships: Праћења и пратиоци
severed_relationships: Прекинуте везе
statuses_cleanup: Аутоматско брисање објава statuses_cleanup: Аутоматско брисање објава
strikes: Модерацијски преступи strikes: Модерацијски преступи
two_factor_authentication: Двофакторска идентификација two_factor_authentication: Двофакторска идентификација
webauthn_authentication: Сигурносни кључеви webauthn_authentication: Сигурносни кључеви
severed_relationships:
download: Преузми (%{count})
event_type:
account_suspension: Суспензија налога (%{target_name})
domain_block: Суспензија сервера (%{target_name})
user_domain_block: Блокирали сте %{target_name}
lost_followers: Изгубљени пратиоци
lost_follows: Изгубљена праћења
preamble: Можете изгубити праћења и пратиоце када блокирате домен или када ваши модератори одлуче да суспендују удаљени сервер. Када се то деси, моћи ћете да преузмете листе прекинутих веза, које треба прегледати и евентуално увести на други сервер.
purged: Администратори вашег сервера су обрисали информације о овом серверу.
type: Догађај
statuses: statuses:
attached: attached:
audio: audio:
@ -1784,6 +1800,7 @@ sr:
contrast: Велики контраст contrast: Велики контраст
default: Mastodon (тамна) default: Mastodon (тамна)
mastodon-light: Mastodon (светла) mastodon-light: Mastodon (светла)
system: Аутоматски (коришћење системске теме)
time: time:
formats: formats:
default: "%d %b %Y, %H:%M" default: "%d %b %Y, %H:%M"

View File

@ -7,5 +7,7 @@ if Rails.env.development?
admin = Account.where(username: 'admin').first_or_initialize(username: 'admin') admin = Account.where(username: 'admin').first_or_initialize(username: 'admin')
admin.save(validate: false) admin.save(validate: false)
User.where(email: "admin@#{domain}").first_or_initialize(email: "admin@#{domain}", password: 'mastodonadmin', password_confirmation: 'mastodonadmin', confirmed_at: Time.now.utc, role: UserRole.find_by(name: 'Owner'), account: admin, agreement: true, approved: true).save! user = User.where(email: "admin@#{domain}").first_or_initialize(email: "admin@#{domain}", password: 'mastodonadmin', password_confirmation: 'mastodonadmin', confirmed_at: Time.now.utc, role: UserRole.find_by(name: 'Owner'), account: admin, agreement: true, approved: true)
user.save!
user.approve!
end end

View File

@ -254,7 +254,7 @@ module Mastodon::CLI
say 'Deduplicating accounts… for local accounts, you will be asked to chose which account to keep unchanged.' say 'Deduplicating accounts… for local accounts, you will be asked to chose which account to keep unchanged.'
find_duplicate_accounts.each do |row| duplicate_record_ids(:accounts, "lower(username), COALESCE(lower(domain), '')").each do |row|
accounts = Account.where(id: row['ids'].split(',')) accounts = Account.where(id: row['ids'].split(','))
if accounts.first.local? if accounts.first.local?
@ -306,7 +306,7 @@ module Mastodon::CLI
end end
def deduplicate_users_process_email def deduplicate_users_process_email
database_connection.select_all("SELECT string_agg(id::text, ',') AS ids FROM users GROUP BY email HAVING count(*) > 1").each do |row| duplicate_record_ids(:users, 'email').each do |row|
users = User.where(id: row['ids'].split(',')).order(updated_at: :desc).includes(:account).to_a users = User.where(id: row['ids'].split(',')).order(updated_at: :desc).includes(:account).to_a
ref_user = users.shift ref_user = users.shift
say "Multiple users registered with e-mail address #{ref_user.email}.", :yellow say "Multiple users registered with e-mail address #{ref_user.email}.", :yellow
@ -320,7 +320,7 @@ module Mastodon::CLI
end end
def deduplicate_users_process_confirmation_token def deduplicate_users_process_confirmation_token
database_connection.select_all("SELECT string_agg(id::text, ',') AS ids FROM users WHERE confirmation_token IS NOT NULL GROUP BY confirmation_token HAVING count(*) > 1").each do |row| duplicate_record_ids_without_nulls(:users, 'confirmation_token').each do |row|
users = User.where(id: row['ids'].split(',')).order(created_at: :desc).includes(:account).to_a.drop(1) users = User.where(id: row['ids'].split(',')).order(created_at: :desc).includes(:account).to_a.drop(1)
say "Unsetting confirmation token for those accounts: #{users.map { |user| user.account.acct }.join(', ')}", :yellow say "Unsetting confirmation token for those accounts: #{users.map { |user| user.account.acct }.join(', ')}", :yellow
@ -332,7 +332,7 @@ module Mastodon::CLI
def deduplicate_users_process_remember_token def deduplicate_users_process_remember_token
if migrator_version < 2022_01_18_183010 if migrator_version < 2022_01_18_183010
database_connection.select_all("SELECT string_agg(id::text, ',') AS ids FROM users WHERE remember_token IS NOT NULL GROUP BY remember_token HAVING count(*) > 1").each do |row| duplicate_record_ids_without_nulls(:users, 'remember_token').each do |row|
users = User.where(id: row['ids'].split(',')).order(updated_at: :desc).to_a.drop(1) users = User.where(id: row['ids'].split(',')).order(updated_at: :desc).to_a.drop(1)
say "Unsetting remember token for those accounts: #{users.map { |user| user.account.acct }.join(', ')}", :yellow say "Unsetting remember token for those accounts: #{users.map { |user| user.account.acct }.join(', ')}", :yellow
@ -344,7 +344,7 @@ module Mastodon::CLI
end end
def deduplicate_users_process_password_token def deduplicate_users_process_password_token
database_connection.select_all("SELECT string_agg(id::text, ',') AS ids FROM users WHERE reset_password_token IS NOT NULL GROUP BY reset_password_token HAVING count(*) > 1").each do |row| duplicate_record_ids_without_nulls(:users, 'reset_password_token').each do |row|
users = User.where(id: row['ids'].split(',')).order(updated_at: :desc).includes(:account).to_a.drop(1) users = User.where(id: row['ids'].split(',')).order(updated_at: :desc).includes(:account).to_a.drop(1)
say "Unsetting password reset token for those accounts: #{users.map { |user| user.account.acct }.join(', ')}", :yellow say "Unsetting password reset token for those accounts: #{users.map { |user| user.account.acct }.join(', ')}", :yellow
@ -358,7 +358,7 @@ module Mastodon::CLI
remove_index_if_exists!(:account_domain_blocks, 'index_account_domain_blocks_on_account_id_and_domain') remove_index_if_exists!(:account_domain_blocks, 'index_account_domain_blocks_on_account_id_and_domain')
say 'Removing duplicate account domain blocks…' say 'Removing duplicate account domain blocks…'
database_connection.select_all("SELECT string_agg(id::text, ',') AS ids FROM account_domain_blocks GROUP BY account_id, domain HAVING count(*) > 1").each do |row| duplicate_record_ids(:account_domain_blocks, 'account_id, domain').each do |row|
AccountDomainBlock.where(id: row['ids'].split(',').drop(1)).delete_all AccountDomainBlock.where(id: row['ids'].split(',').drop(1)).delete_all
end end
@ -372,7 +372,7 @@ module Mastodon::CLI
remove_index_if_exists!(:account_identity_proofs, 'index_account_proofs_on_account_and_provider_and_username') remove_index_if_exists!(:account_identity_proofs, 'index_account_proofs_on_account_and_provider_and_username')
say 'Removing duplicate account identity proofs…' say 'Removing duplicate account identity proofs…'
database_connection.select_all("SELECT string_agg(id::text, ',') AS ids FROM account_identity_proofs GROUP BY account_id, provider, provider_username HAVING count(*) > 1").each do |row| duplicate_record_ids(:account_identity_proofs, 'account_id, provider, provider_username').each do |row|
AccountIdentityProof.where(id: row['ids'].split(',')).order(id: :desc).to_a.drop(1).each(&:destroy) AccountIdentityProof.where(id: row['ids'].split(',')).order(id: :desc).to_a.drop(1).each(&:destroy)
end end
@ -386,7 +386,7 @@ module Mastodon::CLI
remove_index_if_exists!(:announcement_reactions, 'index_announcement_reactions_on_account_id_and_announcement_id') remove_index_if_exists!(:announcement_reactions, 'index_announcement_reactions_on_account_id_and_announcement_id')
say 'Removing duplicate announcement reactions…' say 'Removing duplicate announcement reactions…'
database_connection.select_all("SELECT string_agg(id::text, ',') AS ids FROM announcement_reactions GROUP BY account_id, announcement_id, name HAVING count(*) > 1").each do |row| duplicate_record_ids(:announcement_reactions, 'account_id, announcement_id, name').each do |row|
AnnouncementReaction.where(id: row['ids'].split(',')).order(id: :desc).to_a.drop(1).each(&:destroy) AnnouncementReaction.where(id: row['ids'].split(',')).order(id: :desc).to_a.drop(1).each(&:destroy)
end end
@ -398,7 +398,7 @@ module Mastodon::CLI
remove_index_if_exists!(:conversations, 'index_conversations_on_uri') remove_index_if_exists!(:conversations, 'index_conversations_on_uri')
say 'Deduplicating conversations…' say 'Deduplicating conversations…'
database_connection.select_all("SELECT string_agg(id::text, ',') AS ids FROM conversations WHERE uri IS NOT NULL GROUP BY uri HAVING count(*) > 1").each do |row| duplicate_record_ids_without_nulls(:conversations, 'uri').each do |row|
conversations = Conversation.where(id: row['ids'].split(',')).order(id: :desc).to_a conversations = Conversation.where(id: row['ids'].split(',')).order(id: :desc).to_a
ref_conversation = conversations.shift ref_conversation = conversations.shift
@ -421,7 +421,7 @@ module Mastodon::CLI
remove_index_if_exists!(:custom_emojis, 'index_custom_emojis_on_shortcode_and_domain') remove_index_if_exists!(:custom_emojis, 'index_custom_emojis_on_shortcode_and_domain')
say 'Deduplicating custom_emojis…' say 'Deduplicating custom_emojis…'
database_connection.select_all("SELECT string_agg(id::text, ',') AS ids FROM custom_emojis GROUP BY shortcode, domain HAVING count(*) > 1").each do |row| duplicate_record_ids(:custom_emojis, 'shortcode, domain').each do |row|
emojis = CustomEmoji.where(id: row['ids'].split(',')).order(id: :desc).to_a emojis = CustomEmoji.where(id: row['ids'].split(',')).order(id: :desc).to_a
ref_emoji = emojis.shift ref_emoji = emojis.shift
@ -440,7 +440,7 @@ module Mastodon::CLI
remove_index_if_exists!(:custom_emoji_categories, 'index_custom_emoji_categories_on_name') remove_index_if_exists!(:custom_emoji_categories, 'index_custom_emoji_categories_on_name')
say 'Deduplicating custom_emoji_categories…' say 'Deduplicating custom_emoji_categories…'
database_connection.select_all("SELECT string_agg(id::text, ',') AS ids FROM custom_emoji_categories GROUP BY name HAVING count(*) > 1").each do |row| duplicate_record_ids(:custom_emoji_categories, 'name').each do |row|
categories = CustomEmojiCategory.where(id: row['ids'].split(',')).order(id: :desc).to_a categories = CustomEmojiCategory.where(id: row['ids'].split(',')).order(id: :desc).to_a
ref_category = categories.shift ref_category = categories.shift
@ -459,7 +459,7 @@ module Mastodon::CLI
remove_index_if_exists!(:domain_allows, 'index_domain_allows_on_domain') remove_index_if_exists!(:domain_allows, 'index_domain_allows_on_domain')
say 'Deduplicating domain_allows…' say 'Deduplicating domain_allows…'
database_connection.select_all("SELECT string_agg(id::text, ',') AS ids FROM domain_allows GROUP BY domain HAVING count(*) > 1").each do |row| duplicate_record_ids(:domain_allows, 'domain').each do |row|
DomainAllow.where(id: row['ids'].split(',')).order(id: :desc).to_a.drop(1).each(&:destroy) DomainAllow.where(id: row['ids'].split(',')).order(id: :desc).to_a.drop(1).each(&:destroy)
end end
@ -471,7 +471,7 @@ module Mastodon::CLI
remove_index_if_exists!(:domain_blocks, 'index_domain_blocks_on_domain') remove_index_if_exists!(:domain_blocks, 'index_domain_blocks_on_domain')
say 'Deduplicating domain_blocks…' say 'Deduplicating domain_blocks…'
database_connection.select_all("SELECT string_agg(id::text, ',') AS ids FROM domain_blocks GROUP BY domain HAVING count(*) > 1").each do |row| duplicate_record_ids(:domain_blocks, 'domain').each do |row|
domain_blocks = DomainBlock.where(id: row['ids'].split(',')).by_severity.reverse.to_a domain_blocks = DomainBlock.where(id: row['ids'].split(',')).by_severity.reverse.to_a
reject_media = domain_blocks.any?(&:reject_media?) reject_media = domain_blocks.any?(&:reject_media?)
@ -497,7 +497,7 @@ module Mastodon::CLI
remove_index_if_exists!(:unavailable_domains, 'index_unavailable_domains_on_domain') remove_index_if_exists!(:unavailable_domains, 'index_unavailable_domains_on_domain')
say 'Deduplicating unavailable_domains…' say 'Deduplicating unavailable_domains…'
database_connection.select_all("SELECT string_agg(id::text, ',') AS ids FROM unavailable_domains GROUP BY domain HAVING count(*) > 1").each do |row| duplicate_record_ids(:unavailable_domains, 'domain').each do |row|
UnavailableDomain.where(id: row['ids'].split(',')).order(id: :desc).to_a.drop(1).each(&:destroy) UnavailableDomain.where(id: row['ids'].split(',')).order(id: :desc).to_a.drop(1).each(&:destroy)
end end
@ -509,7 +509,7 @@ module Mastodon::CLI
remove_index_if_exists!(:email_domain_blocks, 'index_email_domain_blocks_on_domain') remove_index_if_exists!(:email_domain_blocks, 'index_email_domain_blocks_on_domain')
say 'Deduplicating email_domain_blocks…' say 'Deduplicating email_domain_blocks…'
database_connection.select_all("SELECT string_agg(id::text, ',') AS ids FROM email_domain_blocks GROUP BY domain HAVING count(*) > 1").each do |row| duplicate_record_ids(:email_domain_blocks, 'domain').each do |row|
domain_blocks = EmailDomainBlock.where(id: row['ids'].split(',')).order(EmailDomainBlock.arel_table[:parent_id].asc.nulls_first).to_a domain_blocks = EmailDomainBlock.where(id: row['ids'].split(',')).order(EmailDomainBlock.arel_table[:parent_id].asc.nulls_first).to_a
domain_blocks.drop(1).each(&:destroy) domain_blocks.drop(1).each(&:destroy)
end end
@ -522,7 +522,7 @@ module Mastodon::CLI
remove_index_if_exists!(:media_attachments, 'index_media_attachments_on_shortcode') remove_index_if_exists!(:media_attachments, 'index_media_attachments_on_shortcode')
say 'Deduplicating media_attachments…' say 'Deduplicating media_attachments…'
database_connection.select_all("SELECT string_agg(id::text, ',') AS ids FROM media_attachments WHERE shortcode IS NOT NULL GROUP BY shortcode HAVING count(*) > 1").each do |row| duplicate_record_ids_without_nulls(:media_attachments, 'shortcode').each do |row|
MediaAttachment.where(id: row['ids'].split(',').drop(1)).update_all(shortcode: nil) MediaAttachment.where(id: row['ids'].split(',').drop(1)).update_all(shortcode: nil)
end end
@ -538,7 +538,7 @@ module Mastodon::CLI
remove_index_if_exists!(:preview_cards, 'index_preview_cards_on_url') remove_index_if_exists!(:preview_cards, 'index_preview_cards_on_url')
say 'Deduplicating preview_cards…' say 'Deduplicating preview_cards…'
database_connection.select_all("SELECT string_agg(id::text, ',') AS ids FROM preview_cards GROUP BY url HAVING count(*) > 1").each do |row| duplicate_record_ids(:preview_cards, 'url').each do |row|
PreviewCard.where(id: row['ids'].split(',')).order(id: :desc).to_a.drop(1).each(&:destroy) PreviewCard.where(id: row['ids'].split(',')).order(id: :desc).to_a.drop(1).each(&:destroy)
end end
@ -550,7 +550,7 @@ module Mastodon::CLI
remove_index_if_exists!(:statuses, 'index_statuses_on_uri') remove_index_if_exists!(:statuses, 'index_statuses_on_uri')
say 'Deduplicating statuses…' say 'Deduplicating statuses…'
database_connection.select_all("SELECT string_agg(id::text, ',') AS ids FROM statuses WHERE uri IS NOT NULL GROUP BY uri HAVING count(*) > 1").each do |row| duplicate_record_ids_without_nulls(:statuses, 'uri').each do |row|
statuses = Status.where(id: row['ids'].split(',')).order(id: :asc).to_a statuses = Status.where(id: row['ids'].split(',')).order(id: :asc).to_a
ref_status = statuses.shift ref_status = statuses.shift
statuses.each do |status| statuses.each do |status|
@ -572,7 +572,7 @@ module Mastodon::CLI
remove_index_if_exists!(:tags, 'index_tags_on_name_lower_btree') remove_index_if_exists!(:tags, 'index_tags_on_name_lower_btree')
say 'Deduplicating tags…' say 'Deduplicating tags…'
database_connection.select_all("SELECT string_agg(id::text, ',') AS ids FROM tags GROUP BY lower((name)::text) HAVING count(*) > 1").each do |row| duplicate_record_ids(:tags, 'lower((name)::text)').each do |row|
tags = Tag.where(id: row['ids'].split(',')).order(Arel.sql('(usable::int + trendable::int + listable::int) desc')).to_a tags = Tag.where(id: row['ids'].split(',')).order(Arel.sql('(usable::int + trendable::int + listable::int) desc')).to_a
ref_tag = tags.shift ref_tag = tags.shift
tags.each do |tag| tags.each do |tag|
@ -595,7 +595,7 @@ module Mastodon::CLI
remove_index_if_exists!(:webauthn_credentials, 'index_webauthn_credentials_on_external_id') remove_index_if_exists!(:webauthn_credentials, 'index_webauthn_credentials_on_external_id')
say 'Deduplicating webauthn_credentials…' say 'Deduplicating webauthn_credentials…'
database_connection.select_all("SELECT string_agg(id::text, ',') AS ids FROM webauthn_credentials GROUP BY external_id HAVING count(*) > 1").each do |row| duplicate_record_ids(:webauthn_credentials, 'external_id').each do |row|
WebauthnCredential.where(id: row['ids'].split(',')).order(id: :desc).to_a.drop(1).each(&:destroy) WebauthnCredential.where(id: row['ids'].split(',')).order(id: :desc).to_a.drop(1).each(&:destroy)
end end
@ -609,7 +609,7 @@ module Mastodon::CLI
remove_index_if_exists!(:webhooks, 'index_webhooks_on_url') remove_index_if_exists!(:webhooks, 'index_webhooks_on_url')
say 'Deduplicating webhooks…' say 'Deduplicating webhooks…'
database_connection.select_all("SELECT string_agg(id::text, ',') AS ids FROM webhooks GROUP BY url HAVING count(*) > 1").each do |row| duplicate_record_ids(:webhooks, 'url').each do |row|
Webhook.where(id: row['ids'].split(',')).order(id: :desc).drop(1).each(&:destroy) Webhook.where(id: row['ids'].split(',')).order(id: :desc).drop(1).each(&:destroy)
end end
@ -746,8 +746,23 @@ module Mastodon::CLI
ActiveRecord::Migrator.current_version ActiveRecord::Migrator.current_version
end end
def find_duplicate_accounts def duplicate_record_ids_without_nulls(table, group_by)
database_connection.select_all("SELECT string_agg(id::text, ',') AS ids FROM accounts GROUP BY lower(username), COALESCE(lower(domain), '') HAVING count(*) > 1") database_connection.select_all(<<~SQL.squish)
SELECT string_agg(id::text, ',') AS ids
FROM #{table}
WHERE #{group_by} IS NOT NULL
GROUP BY #{group_by}
HAVING COUNT(*) > 1
SQL
end
def duplicate_record_ids(table, group_by)
database_connection.select_all(<<~SQL.squish)
SELECT string_agg(id::text, ',') AS ids
FROM #{table}
GROUP BY #{group_by}
HAVING COUNT(*) > 1
SQL
end end
def remove_index_if_exists!(table, name) def remove_index_if_exists!(table, name)

View File

@ -44,5 +44,18 @@ describe Account::Counters do
expect(account.statuses_count).to eq 5 expect(account.statuses_count).to eq 5
end end
it 'preserves last_status_at when decrementing statuses_count' do
account_stat = Fabricate(
:account_stat,
account: account,
last_status_at: 3.days.ago,
statuses_count: 10
)
expect { account.decrement_count!(:statuses_count) }
.to change(account_stat.reload, :statuses_count).by(-1)
.and not_change(account_stat.reload, :last_status_at)
end
end end
end end

View File

@ -95,23 +95,27 @@ RSpec.describe BulkImportRowService do
context 'when importing a list row' do context 'when importing a list row' do
let(:import_type) { 'lists' } let(:import_type) { 'lists' }
let(:target_account) { Fabricate(:account) } let(:target_account) { Fabricate(:account) }
let(:list_name) { 'my list' }
let(:data) do let(:data) do
{ 'acct' => target_account.acct, 'list_name' => 'my list' } { 'acct' => target_account.acct, 'list_name' => list_name }
end end
shared_examples 'common behavior' do shared_examples 'common behavior' do
shared_examples 'row import success and list addition' do
it 'returns true and adds the target account to the list' do
result = nil
expect { result = subject.call(import_row) }
.to change { result }.from(nil).to(true)
.and add_target_account_to_list
end
end
context 'when the target account is already followed' do context 'when the target account is already followed' do
before do before do
account.follow!(target_account) account.follow!(target_account)
end end
it 'returns true' do include_examples 'row import success and list addition'
expect(subject.call(import_row)).to be true
end
it 'adds the target account to the list' do
expect { subject.call(import_row) }.to add_target_account_to_list
end
end end
context 'when the user already requested to follow the target account' do context 'when the user already requested to follow the target account' do
@ -119,35 +123,17 @@ RSpec.describe BulkImportRowService do
account.request_follow!(target_account) account.request_follow!(target_account)
end end
it 'returns true' do include_examples 'row import success and list addition'
expect(subject.call(import_row)).to be true
end
it 'adds the target account to the list' do
expect { subject.call(import_row) }.to add_target_account_to_list
end
end end
context 'when the target account is neither followed nor requested' do context 'when the target account is neither followed nor requested' do
it 'returns true' do include_examples 'row import success and list addition'
expect(subject.call(import_row)).to be true
end
it 'adds the target account to the list' do
expect { subject.call(import_row) }.to add_target_account_to_list
end
end end
context 'when the target account is the user themself' do context 'when the target account is the user themself' do
let(:target_account) { account } let(:target_account) { account }
it 'returns true' do include_examples 'row import success and list addition'
expect(subject.call(import_row)).to be true
end
it 'adds the target account to the list' do
expect { subject.call(import_row) }.to add_target_account_to_list
end
end end
def add_target_account_to_list def add_target_account_to_list
@ -161,7 +147,7 @@ RSpec.describe BulkImportRowService do
.joins(:list) .joins(:list)
.exists?( .exists?(
account_id: target_account.id, account_id: target_account.id,
list: { title: 'my list' } list: { title: list_name }
) )
end end
end end
@ -172,7 +158,7 @@ RSpec.describe BulkImportRowService do
context 'when the list exists' do context 'when the list exists' do
before do before do
Fabricate(:list, account: account, title: 'my list') Fabricate(:list, account: account, title: list_name)
end end
include_examples 'common behavior' include_examples 'common behavior'
@ -180,7 +166,7 @@ RSpec.describe BulkImportRowService do
it 'does not create a new list' do it 'does not create a new list' do
account.follow!(target_account) account.follow!(target_account)
expect { subject.call(import_row) }.to_not(change { List.where(title: 'my list').count }) expect { subject.call(import_row) }.to_not(change { List.where(title: list_name).count })
end end
end end
end end

View File

@ -6322,9 +6322,9 @@ __metadata:
linkType: hard linkType: hard
"core-js@npm:^3.30.2": "core-js@npm:^3.30.2":
version: 3.36.1 version: 3.37.0
resolution: "core-js@npm:3.36.1" resolution: "core-js@npm:3.37.0"
checksum: 10c0/4f0ad2464535d809ba659226feca15bff14b9b5452518bddff8d81b9c94b0227b3027d9838f22f1dce664958acb4107b935cc0037695ae545edc2a303bca98bf checksum: 10c0/7e00331f346318ca3f595c08ce9e74ddae744715aef137486c1399163afd79792fb94c3161280863adfdc3e30f8026912d56bd3036f93cacfc689d33e185f2ee
languageName: node languageName: node
linkType: hard linkType: hard
@ -9613,8 +9613,8 @@ __metadata:
linkType: hard linkType: hard
"ioredis@npm:^5.3.2": "ioredis@npm:^5.3.2":
version: 5.3.2 version: 5.4.0
resolution: "ioredis@npm:5.3.2" resolution: "ioredis@npm:5.4.0"
dependencies: dependencies:
"@ioredis/commands": "npm:^1.1.1" "@ioredis/commands": "npm:^1.1.1"
cluster-key-slot: "npm:^1.1.0" cluster-key-slot: "npm:^1.1.0"
@ -9625,7 +9625,7 @@ __metadata:
redis-errors: "npm:^1.2.0" redis-errors: "npm:^1.2.0"
redis-parser: "npm:^3.0.0" redis-parser: "npm:^3.0.0"
standard-as-callback: "npm:^2.1.0" standard-as-callback: "npm:^2.1.0"
checksum: 10c0/0dd2b5b8004e891f5b62edf18ac223194f1f5204698ec827c903e789ea05b0b36f73395491749ec63c66470485bdfb228ccdf1714fbf631a0f78f33211f2c883 checksum: 10c0/a0214a004928cd35f7103179c8d236a8df609265994d554046fd130446b9989125b7133177936015a31925190f66c90bec4de7303819fe81383dc4576d947d47
languageName: node languageName: node
linkType: hard linkType: hard