diff --git a/.github/ISSUE_TEMPLATE/1.web_bug_report.yml b/.github/ISSUE_TEMPLATE/1.web_bug_report.yml index 36b18a1287..5d2446b7c8 100644 --- a/.github/ISSUE_TEMPLATE/1.web_bug_report.yml +++ b/.github/ISSUE_TEMPLATE/1.web_bug_report.yml @@ -47,8 +47,8 @@ body: attributes: label: Mastodon version description: | - This is displayed at the bottom of the About page, eg. `v4.4.0-alpha.1` - placeholder: v4.3.0 + This is displayed at the bottom of the About page, eg. `v4.4.0-beta.1` + placeholder: v4.4.0-beta.1 validations: required: true - type: input @@ -56,7 +56,7 @@ body: label: Browser name and version description: | What browser are you using when getting this bug? Please specify the version as well. - placeholder: Firefox 131.0.0 + placeholder: Firefox 139.0.0 validations: required: true - type: input @@ -64,7 +64,7 @@ body: label: Operating system description: | What OS are you running? Please specify the version as well. - placeholder: macOS 15.0.1 + placeholder: macOS 15.5 validations: required: true - type: textarea diff --git a/.github/ISSUE_TEMPLATE/2.server_bug_report.yml b/.github/ISSUE_TEMPLATE/2.server_bug_report.yml index 45bd689f1e..5235796b58 100644 --- a/.github/ISSUE_TEMPLATE/2.server_bug_report.yml +++ b/.github/ISSUE_TEMPLATE/2.server_bug_report.yml @@ -48,8 +48,8 @@ body: attributes: label: Mastodon version description: | - This is displayed at the bottom of the About page, eg. `v4.4.0-alpha.1` - placeholder: v4.3.0 + This is displayed at the bottom of the About page, eg. `v4.4.0-beta.1` + placeholder: v4.4.0-beta.1 validations: required: false - type: textarea @@ -59,7 +59,7 @@ body: Any additional technical details you may have, like logs or error traces value: | If this is happening on your own Mastodon server, please fill out those: - - Ruby version: (from `ruby --version`, eg. v3.4.1) - - Node.js version: (from `node --version`, eg. v20.18.0) + - Ruby version: (from `ruby --version`, eg. v3.4.4) + - Node.js version: (from `node --version`, eg. v22.16.0) validations: required: false diff --git a/.github/ISSUE_TEMPLATE/3.troubleshooting.yml b/.github/ISSUE_TEMPLATE/3.troubleshooting.yml index 1f70046ed4..72ae76af00 100644 --- a/.github/ISSUE_TEMPLATE/3.troubleshooting.yml +++ b/.github/ISSUE_TEMPLATE/3.troubleshooting.yml @@ -49,7 +49,7 @@ body: label: Mastodon version description: | This is displayed at the bottom of the About page, eg. `v4.4.0-alpha.1` - placeholder: v4.3.0 + placeholder: v4.4.0-beta.1 validations: required: false - type: textarea @@ -59,9 +59,9 @@ body: Details about your environment, like how Mastodon is deployed, if containers are used, version numbers, etc. value: | Please at least include those informations: - - Operating system: (eg. Ubuntu 22.04) - - Ruby version: (from `ruby --version`, eg. v3.4.1) - - Node.js version: (from `node --version`, eg. v20.18.0) + - Operating system: (eg. Ubuntu 24.04.2) + - Ruby version: (from `ruby --version`, eg. v3.4.4) + - Node.js version: (from `node --version`, eg. v22.16.0) validations: required: false - type: textarea diff --git a/Gemfile.lock b/Gemfile.lock index e8f8bf0513..519412dea8 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -794,7 +794,7 @@ GEM ruby-saml (1.18.0) nokogiri (>= 1.13.10) rexml - ruby-vips (2.2.3) + ruby-vips (2.2.4) ffi (~> 1.12) logger rubyzip (2.4.1) diff --git a/app/javascript/mastodon/locales/br.json b/app/javascript/mastodon/locales/br.json index d7446fdd49..49d15f9cba 100644 --- a/app/javascript/mastodon/locales/br.json +++ b/app/javascript/mastodon/locales/br.json @@ -301,6 +301,7 @@ "hashtag.follow": "Heuliañ ar ger-klik", "hashtag.unfollow": "Paouez heuliañ an hashtag", "hashtags.and_other": "…{count, plural, one {hag # all} other {ha # all}}", + "home.column_settings.show_quotes": "Diskouez an arroudennoù", "home.column_settings.show_reblogs": "Diskouez ar skignadennoù", "home.column_settings.show_replies": "Diskouez ar respontoù", "home.hide_announcements": "Kuzhat ar c'hemennoù", diff --git a/app/javascript/mastodon/locales/cs.json b/app/javascript/mastodon/locales/cs.json index 0933b65563..cfc2591276 100644 --- a/app/javascript/mastodon/locales/cs.json +++ b/app/javascript/mastodon/locales/cs.json @@ -430,6 +430,7 @@ "hints.profiles.see_more_posts": "Zobrazit další příspěvky na {domain}", "hints.threads.replies_may_be_missing": "Odpovědi z jiných serverů mohou chybět.", "hints.threads.see_more": "Zobrazit další odpovědi na {domain}", + "home.column_settings.show_quotes": "Zobrazit citace", "home.column_settings.show_reblogs": "Zobrazit boosty", "home.column_settings.show_replies": "Zobrazit odpovědi", "home.hide_announcements": "Skrýt oznámení", diff --git a/app/javascript/mastodon/locales/de.json b/app/javascript/mastodon/locales/de.json index 1aef03e323..695ed571da 100644 --- a/app/javascript/mastodon/locales/de.json +++ b/app/javascript/mastodon/locales/de.json @@ -430,6 +430,7 @@ "hints.profiles.see_more_posts": "Weitere Beiträge auf {domain} ansehen", "hints.threads.replies_may_be_missing": "Möglicherweise werden nicht alle Antworten von anderen Servern angezeigt.", "hints.threads.see_more": "Weitere Antworten auf {domain} ansehen", + "home.column_settings.show_quotes": "Zitierte Beiträge anzeigen", "home.column_settings.show_reblogs": "Geteilte Beiträge anzeigen", "home.column_settings.show_replies": "Antworten anzeigen", "home.hide_announcements": "Ankündigungen ausblenden", diff --git a/app/javascript/mastodon/locales/es-AR.json b/app/javascript/mastodon/locales/es-AR.json index a3e346e971..4c2496ec8c 100644 --- a/app/javascript/mastodon/locales/es-AR.json +++ b/app/javascript/mastodon/locales/es-AR.json @@ -430,6 +430,7 @@ "hints.profiles.see_more_posts": "Ver más mensajes en {domain}", "hints.threads.replies_may_be_missing": "Es posible que falten respuestas de otros servidores.", "hints.threads.see_more": "Ver más respuestas en {domain}", + "home.column_settings.show_quotes": "Mostrar citas", "home.column_settings.show_reblogs": "Mostrar adhesiones", "home.column_settings.show_replies": "Mostrar respuestas", "home.hide_announcements": "Ocultar anuncios", diff --git a/app/javascript/mastodon/locales/fi.json b/app/javascript/mastodon/locales/fi.json index c93a1bac73..2823ffd09d 100644 --- a/app/javascript/mastodon/locales/fi.json +++ b/app/javascript/mastodon/locales/fi.json @@ -430,6 +430,7 @@ "hints.profiles.see_more_posts": "Näytä lisää julkaisuja palvelimella {domain}", "hints.threads.replies_may_be_missing": "Muiden palvelinten vastauksia saattaa puuttua.", "hints.threads.see_more": "Näytä lisää vastauksia palvelimella {domain}", + "home.column_settings.show_quotes": "Näytä lainaukset", "home.column_settings.show_reblogs": "Näytä tehostukset", "home.column_settings.show_replies": "Näytä vastaukset", "home.hide_announcements": "Piilota tiedotteet", diff --git a/app/javascript/mastodon/locales/fo.json b/app/javascript/mastodon/locales/fo.json index 18bfe7acbd..d583ee264f 100644 --- a/app/javascript/mastodon/locales/fo.json +++ b/app/javascript/mastodon/locales/fo.json @@ -430,6 +430,7 @@ "hints.profiles.see_more_posts": "Sí fleiri postar á {domain}", "hints.threads.replies_may_be_missing": "Svar frá øðrum ambætarum mangla møguliga.", "hints.threads.see_more": "Sí fleiri svar á {domain}", + "home.column_settings.show_quotes": "Vís siteringar", "home.column_settings.show_reblogs": "Vís lyft", "home.column_settings.show_replies": "Vís svar", "home.hide_announcements": "Fjal kunngerðir", diff --git a/app/javascript/mastodon/locales/gl.json b/app/javascript/mastodon/locales/gl.json index 8fc45f84a1..6a70c8b750 100644 --- a/app/javascript/mastodon/locales/gl.json +++ b/app/javascript/mastodon/locales/gl.json @@ -1,6 +1,7 @@ { "about.blocks": "Servidores suxeitos a moderación", "about.contact": "Contacto:", + "about.default_locale": "Por defecto", "about.disclaimer": "Mastodon é software libre, de código aberto, e unha marca comercial de Mastodon gGmbH.", "about.domain_blocks.no_reason_available": "Motivo non indicado", "about.domain_blocks.preamble": "Mastodon de xeito xeral permíteche ver contidos doutros servidores do fediverso e interactuar coas súas usuarias. Estas son as excepcións que se estabeleceron neste servidor en particular.", @@ -8,6 +9,7 @@ "about.domain_blocks.silenced.title": "Limitado", "about.domain_blocks.suspended.explanation": "Non se procesarán, almacenarán nin intercambiarán datos con este servidor, o que fai imposible calquera interacción ou comunicación coas usuarias deste servidor.", "about.domain_blocks.suspended.title": "Suspendido", + "about.language_label": "Idioma", "about.not_available": "Esta información non está dispoñible neste servidor.", "about.powered_by": "Comunicación social descentralizada grazas a {mastodon}", "about.rules": "Regras do servidor", @@ -428,6 +430,7 @@ "hints.profiles.see_more_posts": "Mira máis publicacións en {domain}", "hints.threads.replies_may_be_missing": "Poderían faltar respostas desde outros servidores.", "hints.threads.see_more": "Mira máis respostas en {domain}", + "home.column_settings.show_quotes": "Mostrar citas", "home.column_settings.show_reblogs": "Amosar compartidos", "home.column_settings.show_replies": "Amosar respostas", "home.hide_announcements": "Agochar anuncios", diff --git a/app/javascript/mastodon/locales/nl.json b/app/javascript/mastodon/locales/nl.json index 071b8812ec..e28506f4fa 100644 --- a/app/javascript/mastodon/locales/nl.json +++ b/app/javascript/mastodon/locales/nl.json @@ -430,6 +430,7 @@ "hints.profiles.see_more_posts": "Bekijk meer berichten op {domain}", "hints.threads.replies_may_be_missing": "Antwoorden van andere servers kunnen ontbreken.", "hints.threads.see_more": "Bekijk meer reacties op {domain}", + "home.column_settings.show_quotes": "Citaten tonen", "home.column_settings.show_reblogs": "Boosts tonen", "home.column_settings.show_replies": "Reacties tonen", "home.hide_announcements": "Mededelingen verbergen", diff --git a/app/javascript/mastodon/locales/sq.json b/app/javascript/mastodon/locales/sq.json index 0fb5b7c075..92cca9e41d 100644 --- a/app/javascript/mastodon/locales/sq.json +++ b/app/javascript/mastodon/locales/sq.json @@ -425,6 +425,7 @@ "hints.profiles.see_more_posts": "Shihni më tepër postime në {domain}", "hints.threads.replies_may_be_missing": "Mund të mungojnë përgjigje nga shërbyes të tjerë.", "hints.threads.see_more": "Shihni më tepër përgjigje në {domain}", + "home.column_settings.show_quotes": "Shfaq thonjëza", "home.column_settings.show_reblogs": "Shfaq përforcime", "home.column_settings.show_replies": "Shfaq përgjigje", "home.hide_announcements": "Fshihi lajmërimet", diff --git a/app/javascript/mastodon/locales/tok.json b/app/javascript/mastodon/locales/tok.json index 3bf272c4e4..39b638b87c 100644 --- a/app/javascript/mastodon/locales/tok.json +++ b/app/javascript/mastodon/locales/tok.json @@ -125,8 +125,8 @@ "attachments_list.unprocessed": "(nasin open)", "audio.hide": "o len e kalama", "block_modal.remote_users_caveat": "mi pana e wile sina tawa ma {domain}. taso, o sona: ma li ken kepeken nasin len ante la pakala li ken lon. toki pi lukin ale la jan pi ma ala li ken lukin.", - "block_modal.show_less": "o pana e lili", - "block_modal.show_more": "o pana e mute", + "block_modal.show_less": "o lili e toki", + "block_modal.show_more": "o suli e toki", "block_modal.they_cant_mention": "ona li ken ala toki tawa sina li ken ala kute e sina.", "block_modal.they_cant_see_posts": "ona li ken ala lukin e toki sina. sina ken ala lukin e toki ona.", "block_modal.they_will_know": "ona li ken sona e ni: sina len e ona.", @@ -135,7 +135,7 @@ "boost_modal.combo": "sina ken luka e nena {combo} tawa ni: sina wile ala luka e nena lon tenpo kama", "boost_modal.reblog": "o wawa ala wawa e toki?", "boost_modal.undo_reblog": "o weka ala weka e wawa toki?", - "bundle_column_error.copy_stacktrace": "o awen e sona pakala lon ilo sina", + "bundle_column_error.copy_stacktrace": "o jo e sona pakala lon ilo sina", "bundle_column_error.error.body": "ilo li ken ala pana e lipu ni. ni li ken tan pakala ilo.", "bundle_column_error.error.title": "pakala a!", "bundle_column_error.network.body": "mi lukin pana e lipu la, pakala li lon. ken la, pakala li tan ilo nanpa sina. ken la, pakala li tan ilo nanpa suli pi ma kulupu ni.", @@ -143,7 +143,7 @@ "bundle_column_error.retry": "o alasa sin", "bundle_column_error.return": "o tawa open", "bundle_column_error.routing.body": "ilo li sona ala e lipu wile. sina pana ala pana e nasin pona tawa lipu?", - "bundle_column_error.routing.title": "pakala nanpa 404", + "bundle_column_error.routing.title": "pakala #404", "bundle_modal_error.close": "o pini", "bundle_modal_error.message": "ilo li wile kama e ijo ni, taso pakala li lon.", "bundle_modal_error.retry": "o alasa sin", @@ -188,26 +188,26 @@ "compose.published.body": "toki li pana.", "compose.published.open": "o lukin", "compose.saved.body": "ilo li awen e ijo pana sina.", - "compose_form.direct_message_warning_learn_more": "o kama sona e ijo ante", + "compose_form.direct_message_warning_learn_more": "o kama sona", "compose_form.encryption_warning": "toki li len ala lon ilo Masoton ꞏ o pana ala e sona suli len lon ilo Masoton", "compose_form.lock_disclaimer": "lipu sina li open, li {locked} ala. jan ale li ken kama kute e sina, li ken lukin e toki sama ni.", "compose_form.lock_disclaimer.lock": "pini", "compose_form.placeholder": "sina wile toki e seme?", "compose_form.poll.duration": "tenpo pana", - "compose_form.poll.multiple": "pana mute", + "compose_form.poll.multiple": "mute pana", "compose_form.poll.option_placeholder": "ken nanpa {number}", - "compose_form.poll.single": "toki pi wan taso", + "compose_form.poll.single": "ken pi wan taso", "compose_form.poll.switch_to_multiple": "o ante e nasin pana. pana mute o ken", "compose_form.poll.switch_to_single": "o ante e nasin pana. pana wan taso o lon", "compose_form.poll.type": "nasin", "compose_form.publish": "o toki", - "compose_form.publish_form": "o open toki sin", + "compose_form.publish_form": "o toki sin", "compose_form.reply": "o toki lon ijo ni", - "compose_form.save_changes": "o sin e ni", + "compose_form.save_changes": "o sin", "compose_form.spoiler.marked": "o weka e toki pi ijo ike ken", "compose_form.spoiler.unmarked": "o pali e toki pi ijo ike ken", "compose_form.spoiler_placeholder": "toki pi ijo ike ken (sina ken ala e ni)", - "confirmation_modal.cancel": "o weka", + "confirmation_modal.cancel": "ala", "confirmations.block.confirm": "o len", "confirmations.delete.confirm": "o weka", "confirmations.delete.message": "sina wile ala wile weka e toki ni?", @@ -225,49 +225,56 @@ "confirmations.follow_to_list.title": "sina wile ala wile kute?", "confirmations.logout.confirm": "o weka", "confirmations.logout.message": "sina wile ala wile weka", - "confirmations.logout.title": "o weka?", - "confirmations.missing_alt_text.confirm": "pana e toki pi sona lukin", + "confirmations.logout.title": "o weka ala weka?", + "confirmations.missing_alt_text.confirm": "o pana e toki pi sona lukin", "confirmations.missing_alt_text.message": "toki ni la sitelen li lon. taso toki pi sona lukin li lon ala. toki pi sona lukin li pona tan ni: jan ale li ken sona e toki.", "confirmations.missing_alt_text.secondary": "o pana a", - "confirmations.missing_alt_text.title": "o pana e toki pi sona lukin", + "confirmations.missing_alt_text.title": "o pana ala pana e toki pi sona lukin?", "confirmations.mute.confirm": "o len", "confirmations.redraft.confirm": "o weka o pali sin e toki", "confirmations.redraft.message": "pali sin e toki ni la sina wile ala wile weka e ona? sina ni la suli pi toki ni en wawa pi toki ni li weka. kin la toki lon toki ni li jo e mama ala.", "confirmations.redraft.title": "ni li weka li pali sin e toki ni.", - "confirmations.reply.confirm": "toki lon toki ni", - "confirmations.reply.message": "sina toki lon toki ni la toki pali sina li weka. sina wile ala wile e ni?", + "confirmations.remove_from_followers.confirm": "o kama kute ala e jan", + "confirmations.remove_from_followers.message": "{name} li kama kute ala e sina. sina wile ala wile e ni?", + "confirmations.remove_from_followers.title": "o kama ala kama kute ala e jan?", + "confirmations.reply.confirm": "o weka", + "confirmations.reply.message": "sina pana e toki tawa lipu ante la ni li weka e toki sina lon. sina wile ala wile weka e toki ni?", "confirmations.reply.title": "sina wile ala wile weka e toki lon?", "confirmations.unfollow.confirm": "o kute ala", "confirmations.unfollow.message": "sina o wile ala wile pini kute e jan {name}?", "confirmations.unfollow.title": "sina wile ala wile pini kute?", "content_warning.hide": "o len", - "content_warning.show": "o lukin", + "content_warning.show": "o lukin a", "content_warning.show_more": "o lukin", "conversation.delete": "o weka e toki ni", "conversation.mark_as_read": "ni o sin ala", "conversation.open": "o lukin e toki", "conversation.with": "lon {names}", - "copy_icon_button.copied": "toki li awen lon ilo sina", + "copy_icon_button.copied": "sina jo e toki", "copypaste.copied": "sina jo e toki", - "copypaste.copy_to_clipboard": "o awen lon ilo sina", + "copypaste.copy_to_clipboard": "o jo e toki", "directory.federated": "tan lipu ante sona", - "directory.local": "tan {domain} taso", + "directory.local": "tan ma {domain} taso", "directory.new_arrivals": "jan pi kama sin", "directory.recently_active": "jan lon tenpo poka", "disabled_account_banner.account_settings": "wile pi lipu jan", - "disabled_account_banner.text": "sina ken ala kepeken e lipu jan sina pi nimi {disabledAccount}.", - "dismissable_banner.community_timeline": "ni li toki pi tenpo poka tawa ale tan jan lon ma lawa pi nimi {domain}.", + "disabled_account_banner.text": "sina ken ala lon sijelo {disabledAccount}.", + "dismissable_banner.community_timeline": "ni li toki suli pi len ala lon ma {domain} tan tenpo poka.", "dismissable_banner.dismiss": "o weka", - "dismissable_banner.explore_links": "tenpo suno ni la jan pi kulupu ale li toki e ijo sin ni. ijo sin pi jan ante mute li sewi lon lipu ni.", - "dismissable_banner.explore_statuses": "jan mute li lukin e toki ni tan ma ilo weka. toki sin en toki pi wawa mute li lon sewi.", + "dismissable_banner.explore_links": "tenpo poka la jan pi kulupu ale li toki e ijo sin ni. ijo sin pi jan ante mute li sewi lon lipu ni.", + "dismissable_banner.explore_statuses": "tenpo poka la jan pi kulupu ale li toki e ijo ni. ijo sin pi jan ante mute li sewi lon lipu ni.", + "dismissable_banner.explore_tags": "tenpo poka la jan pi kulupu ale li toki e ijo ni. ijo sin pi jan ante mute li sewi lon lipu ni.", "domain_block_modal.block": "o len e ma", - "domain_block_modal.block_account_instead": "o len e @{name}", + "domain_block_modal.block_account_instead": "o len e @{name} a", + "domain_block_modal.they_can_interact_with_old_posts": "jan pi ma ni li ken ijo e toki sina.", "domain_block_modal.they_cant_follow": "jan pi ma ni li ken ala kute e sina.", "domain_block_modal.they_wont_know": "ona li sona ala e ni: sina len e ona.", "domain_block_modal.title": "sina wile ala wile len e ma?", "domain_block_modal.you_will_lose_num_followers": "{followersCount, plural, other {jan {followersCountDisplay}}} li kute e sina la, ona kama kute ala e sina. sina kute e {followingCount, plural,other {jan {followingCountDisplay}}} la, sina kama kute ala e ona.", "domain_block_modal.you_will_lose_relationships": "jan li lon kulupu ni la ona kute e sina la, ona li kama kute ala e sina. jan li lon kulupu ni la sina kute e ona la, sina kama kute ala e ona.", "domain_block_modal.you_wont_see_posts": "sina ken ala lukin e toki tan jan pi ma ni", + "domain_pill.activitypub_lets_connect": "ilo ni la sina ken toki tawa jan ante. ni li lon ma Masoton taso ala li lon ma mute a.", + "domain_pill.activitypub_like_language": "ilo Masoton li toki kepeken nasin ActivityPub tawa kulupu ilo ante.", "domain_pill.server": "ma", "domain_pill.their_handle": "nimi pi ona taso li ni:", "domain_pill.their_server": "ni li ma ona lon ilo. toki ale ona li lon ma ni.", @@ -304,8 +311,8 @@ "empty_column.favourited_statuses": "sina suli ala e toki. sina suli e toki la sina ken lukin e toki ni lon ni.", "empty_column.favourites": "jan ala li suli e toki ni. jan li suli e toki ni la sina ken lukin e ona lon ni.", "empty_column.follow_requests": "jan ala li toki pi wile kute tawa sina. jan li toki pi wile kute tawa sina la sina ken lukin e toki ni lon ni.", - "empty_column.followed_tags": "sina alasa ala e toki ꞏ sina alasa e toki la toki li lon ni", - "empty_column.hashtag": "ala li lon toki ni", + "empty_column.followed_tags": "sina kute ala e kulupu lipu. sina kute la toki li kama lon ni.", + "empty_column.hashtag": "toki ala li lon kulupu ni.", "empty_column.home": "ala a li lon lipu open sina! sina wile lon e ijo lon ni la o kute e jan pi toki suli.", "empty_column.list": "ala li lon kulupu lipu ni. jan pi kulupu lipu ni li toki sin la toki ni li lon ni.", "empty_column.mutes": "jan ala li len tawa sina.", @@ -316,6 +323,10 @@ "explore.trending_links": "sin", "explore.trending_statuses": "toki", "explore.trending_tags": "kulupu pi lipu suli", + "featured_carousel.next": "kama", + "featured_carousel.post": "toki", + "featured_carousel.previous": "pini", + "featured_carousel.slide": "lipu {total} la lipu nanpa {index}", "filter_modal.added.settings_link": "lipu lawa", "filter_modal.select_filter.expired": "tenpo pini", "filter_modal.select_filter.search": "o alasa anu pali", @@ -337,16 +348,23 @@ "footer.privacy_policy": "lawa len", "footer.source_code": "o lukin e toki ilo", "footer.status": "lon", - "generic.saved": "ni li awen", + "footer.terms_of_service": "lipu lawa", + "generic.saved": "mi awen e ni", + "getting_started.heading": "mi open", + "hashtag.admin_moderation": "o lawa e kulupu #{name}", + "hashtag.browse": "o lukin e kulupu toki #{hashtag}", + "hashtag.browse_from_account": "o lukin e kulupu toki #{hashtag} tan @{name}", "hashtag.column_header.tag_mode.all": "en {additional}", "hashtag.column_header.tag_mode.any": "anu {additional}", "hashtag.column_header.tag_mode.none": "en {additional} ala", + "hashtag.column_settings.select.placeholder": "o alasa e kulupu…", "hashtag.column_settings.tag_mode.all": "ale ni", "hashtag.column_settings.tag_mode.any": "wan ni", "hashtag.column_settings.tag_mode.none": "ala ni", "hashtag.counter_by_accounts": "{count, plural, other {jan {counter}}}", "hashtag.counter_by_uses": "{count, plural, other {toki {counter}}}", "hashtag.follow": "o kute e kulupu lipu", + "hashtag.mute": "o kute ala e kulupu #{hashtag}", "hashtag.unfollow": "o kute ala e kulupu lipu", "home.column_settings.show_reblogs": "lukin e wawa", "home.pending_critical_update.link": "o lukin e ijo ilo sin", @@ -372,6 +390,7 @@ "keyboard_shortcuts.my_profile": "o lukin e lipu sina", "keyboard_shortcuts.open_media": "o lukin e sitelen", "keyboard_shortcuts.pinned": "o lukin pi lipu sina pi toki sewi", + "keyboard_shortcuts.reply": "o toki lon ijo ni", "keyboard_shortcuts.toggle_sensitivity": "o ante e ken lukin", "keyboard_shortcuts.toot": "o toki", "keyboard_shortcuts.up": "o tawa sewi lon lipu", @@ -413,7 +432,7 @@ "notification.follow_request": "{name} li wile kute e sina", "notification.label.mention": "jan li toki e sina", "notification.label.private_mention": "jan li toki e sina lon len", - "notification.label.private_reply": "Jan li toki tawa toki sina lon len", + "notification.label.private_reply": "toki len", "notification.label.reply": "jan li toki tawa toki sina", "notification.mentioned_you": "jan {name} li toki e sina", "notification.moderation-warning.learn_more": "o kama sona e ijo ante", @@ -452,7 +471,8 @@ "relative_time.minutes": "{number}m", "relative_time.seconds": "{number}s", "relative_time.today": "tenpo suno ni", - "reply_indicator.cancel": "o ala", + "reply_indicator.attachments": "{count, plural, other {sitelen #}}", + "reply_indicator.cancel": "o pana ala", "report.block": "o len e jan", "report.block_explanation": "sina kama lukin ala e toki ona. ona li kama ala ken lukin e toki sina li kama ala ken kute e sina. ona li ken sona e kama ni.", "report.categories.other": "ante", @@ -486,7 +506,7 @@ "search_results.statuses": "toki", "server_banner.administered_by": "jan lawa:", "status.block": "o len e @{name}", - "status.cancel_reblog_private": "o pini e pana", + "status.cancel_reblog_private": "o pana ala", "status.delete": "o weka", "status.edit": "o ante", "status.favourite": "o sitelen pona", @@ -520,6 +540,7 @@ "units.short.thousand": "{count}K", "upload_button.label": "o pana e sitelen anu kalama", "upload_error.limit": "ilo li ken ala e suli pi ijo ni.", + "upload_form.drag_and_drop.on_drag_cancel": "sina wile ala pana e sitelen. mi weka e sitelen.", "upload_form.edit": "o ante", "upload_progress.label": "ilo li kama jo e ijo sina...", "upload_progress.processing": "ilo li pali…", diff --git a/app/javascript/mastodon/locales/zh-HK.json b/app/javascript/mastodon/locales/zh-HK.json index 3abfbffb56..f776439fcc 100644 --- a/app/javascript/mastodon/locales/zh-HK.json +++ b/app/javascript/mastodon/locales/zh-HK.json @@ -84,6 +84,7 @@ "alt_text_modal.cancel": "取消", "alt_text_modal.done": "完成", "announcement.announcement": "公告", + "annual_report.summary.thanks": "感謝您成為 Mastodon 的一份子!", "attachments_list.unprocessed": "(未處理)", "audio.hide": "隱藏音訊", "block_modal.remote_users_caveat": "我們會要求 {domain} 伺服器尊重你的決定。然而,由於部份伺服器可能以不同方式處理封鎖,因此無法保證一定會成功。公開帖文仍然有機會被未登入的使用者看見。", diff --git a/app/javascript/mastodon/locales/zh-TW.json b/app/javascript/mastodon/locales/zh-TW.json index ce32d89a17..6c83fb55ce 100644 --- a/app/javascript/mastodon/locales/zh-TW.json +++ b/app/javascript/mastodon/locales/zh-TW.json @@ -430,6 +430,7 @@ "hints.profiles.see_more_posts": "於 {domain} 檢視更多嘟文", "hints.threads.replies_may_be_missing": "來自其他站點之回覆或有缺失。", "hints.threads.see_more": "於 {domain} 檢視更多回覆", + "home.column_settings.show_quotes": "顯示引用嘟文", "home.column_settings.show_reblogs": "顯示轉嘟", "home.column_settings.show_replies": "顯示回覆", "home.hide_announcements": "隱藏公告", diff --git a/app/lib/activitypub/activity/create.rb b/app/lib/activitypub/activity/create.rb index dae4f0f87d..4cc49042dc 100644 --- a/app/lib/activitypub/activity/create.rb +++ b/app/lib/activitypub/activity/create.rb @@ -226,8 +226,6 @@ class ActivityPub::Activity::Create < ActivityPub::Activity end def process_quote - return unless Mastodon::Feature.inbound_quotes_enabled? - @quote_uri = @status_parser.quote_uri return if @quote_uri.blank? diff --git a/app/lib/activitypub/activity/quote_request.rb b/app/lib/activitypub/activity/quote_request.rb index 6c5d805159..2de03df158 100644 --- a/app/lib/activitypub/activity/quote_request.rb +++ b/app/lib/activitypub/activity/quote_request.rb @@ -4,7 +4,6 @@ class ActivityPub::Activity::QuoteRequest < ActivityPub::Activity include Payloadable def perform - return unless Mastodon::Feature.inbound_quotes_enabled? return if non_matching_uri_hosts?(@account.uri, @json['id']) quoted_status = status_from_uri(object_uri) diff --git a/app/lib/status_cache_hydrator.rb b/app/lib/status_cache_hydrator.rb index a06e070c3d..674945c403 100644 --- a/app/lib/status_cache_hydrator.rb +++ b/app/lib/status_cache_hydrator.rb @@ -75,25 +75,29 @@ class StatusCacheHydrator end def hydrate_quote_payload(empty_payload, quote, account_id, nested: false) - empty_payload.tap do |payload| - # Nothing to do if we're in the shallow (depth limit) case - next unless payload.key?(:quoted_status) + return unless quote&.acceptable? + empty_payload.tap do |payload| payload.delete(:quoted_status) if nested # TODO: performance improvements - if quote&.quoted_status.nil? - payload[nested ? :quoted_status_id : :quoted_status] = nil - payload[:state] = 'deleted' - elsif StatusFilter.new(quote.quoted_status, Account.find_by(id: account_id)).filtered? - payload[nested ? :quoted_status_id : :quoted_status] = nil - payload[:state] = 'unauthorized' - elsif payload[:state] == 'accepted' - if nested - payload[:quoted_status_id] = quote.quoted_status_id&.to_s + if quote.accepted? + if quote.quoted_status.nil? + payload[nested ? :quoted_status_id : :quoted_status] = nil + payload[:state] = 'deleted' + elsif StatusFilter.new(quote.quoted_status, Account.find_by(id: account_id)).filtered? + payload[nested ? :quoted_status_id : :quoted_status] = nil + payload[:state] = 'unauthorized' else - payload[:quoted_status] = StatusCacheHydrator.new(quote.quoted_status).hydrate(account_id, nested: true) + payload[:state] = 'accepted' + if nested + payload[:quoted_status_id] = quote.quoted_status_id&.to_s + else + payload[:quoted_status] = StatusCacheHydrator.new(quote.quoted_status).hydrate(account_id, nested: true) + end end + else + payload[nested ? :quoted_status_id : :quoted_status] = nil end end end diff --git a/app/services/activitypub/process_status_update_service.rb b/app/services/activitypub/process_status_update_service.rb index fd3e900433..ccf93f3aa6 100644 --- a/app/services/activitypub/process_status_update_service.rb +++ b/app/services/activitypub/process_status_update_service.rb @@ -271,8 +271,6 @@ class ActivityPub::ProcessStatusUpdateService < BaseService end def update_quote! - return unless Mastodon::Feature.inbound_quotes_enabled? - quote_uri = @status_parser.quote_uri if quote_uri.present? diff --git a/spec/lib/activitypub/activity/create_spec.rb b/spec/lib/activitypub/activity/create_spec.rb index c5b62c1df2..2686fbd4df 100644 --- a/spec/lib/activitypub/activity/create_spec.rb +++ b/spec/lib/activitypub/activity/create_spec.rb @@ -937,7 +937,7 @@ RSpec.describe ActivityPub::Activity::Create do end end - context 'with an unverifiable quote of a known post', feature: :inbound_quotes do + context 'with an unverifiable quote of a known post' do let(:quoted_status) { Fabricate(:status) } let(:object_json) do @@ -961,7 +961,7 @@ RSpec.describe ActivityPub::Activity::Create do end end - context 'with an unverifiable unknown post', feature: :inbound_quotes do + context 'with an unverifiable unknown post' do let(:unknown_post_uri) { 'https://unavailable.example.com/unavailable-post' } let(:object_json) do @@ -989,7 +989,7 @@ RSpec.describe ActivityPub::Activity::Create do end end - context 'with a verifiable quote of a known post', feature: :inbound_quotes do + context 'with a verifiable quote of a known post' do let(:quoted_account) { Fabricate(:account, domain: 'quoted.example.com') } let(:quoted_status) { Fabricate(:status, account: quoted_account) } let(:approval_uri) { 'https://quoted.example.com/quote-approval' } diff --git a/spec/lib/activitypub/activity/quote_request_spec.rb b/spec/lib/activitypub/activity/quote_request_spec.rb index bda6388b12..dac0b438cb 100644 --- a/spec/lib/activitypub/activity/quote_request_spec.rb +++ b/spec/lib/activitypub/activity/quote_request_spec.rb @@ -2,7 +2,7 @@ require 'rails_helper' -RSpec.describe ActivityPub::Activity::QuoteRequest, feature: :inbound_quotes do +RSpec.describe ActivityPub::Activity::QuoteRequest do let(:sender) { Fabricate(:account, domain: 'example.com') } let(:recipient) { Fabricate(:account) } let(:quoted_post) { Fabricate(:status, account: recipient) } diff --git a/spec/lib/status_cache_hydrator_spec.rb b/spec/lib/status_cache_hydrator_spec.rb index 073caec0fc..e56393da1d 100644 --- a/spec/lib/status_cache_hydrator_spec.rb +++ b/spec/lib/status_cache_hydrator_spec.rb @@ -56,9 +56,10 @@ RSpec.describe StatusCacheHydrator do context 'when handling an approved quote' do let(:quoted_status) { Fabricate(:status) } + let(:legacy) { false } before do - Fabricate(:quote, status: status, quoted_status: quoted_status, state: :accepted) + Fabricate(:quote, status: status, quoted_status: quoted_status, state: :accepted, legacy: legacy) end it 'renders the same attributes as full render' do @@ -75,13 +76,46 @@ RSpec.describe StatusCacheHydrator do end end + context 'when the quote post is a legacy quote' do + let(:legacy) { true } + + it 'renders the same attributes as full render' do + expect(subject).to eql(compare_to_hash) + expect(subject[:quote]).to_not be_nil + end + end + + context 'when the quoted post is a private post the viewer is not authorized to see' do + let(:quoted_status) { Fabricate(:status, account: status.account, visibility: :private) } + + it 'renders the same attributes as full render' do + expect(subject).to eql(compare_to_hash) + expect(subject[:quote]).to_not be_nil + expect(subject[:quote][:quoted_status]).to be_nil + end + end + + context 'when the quoted post is a private post the viewer is authorized to see' do + let(:quoted_status) { Fabricate(:status, account: status.account, visibility: :private) } + + before do + account.follow!(quoted_status.account) + end + + it 'renders the same attributes as full render' do + expect(subject).to eql(compare_to_hash) + expect(subject[:quote]).to_not be_nil + expect(subject[:quote][:quoted_status]).to_not be_nil + end + end + context 'when the quoted post has been deleted' do let(:quoted_status) { nil } it 'returns the same attributes as full render' do expect(subject).to eql(compare_to_hash) expect(subject[:quote]).to_not be_nil - expect(subject[:quote_status]).to be_nil + expect(subject[:quote][:quoted_status]).to be_nil end end @@ -93,7 +127,7 @@ RSpec.describe StatusCacheHydrator do it 'returns the same attributes as full render' do expect(subject).to eql(compare_to_hash) expect(subject[:quote]).to_not be_nil - expect(subject[:quote_status]).to be_nil + expect(subject[:quote][:quoted_status]).to be_nil end end diff --git a/spec/services/activitypub/process_status_update_service_spec.rb b/spec/services/activitypub/process_status_update_service_spec.rb index ed04a19fb3..6ffaeb09b5 100644 --- a/spec/services/activitypub/process_status_update_service_spec.rb +++ b/spec/services/activitypub/process_status_update_service_spec.rb @@ -435,7 +435,7 @@ RSpec.describe ActivityPub::ProcessStatusUpdateService do end end - context 'when the status has an existing unverified quote and adds an approval link', feature: :inbound_quotes do + context 'when the status has an existing unverified quote and adds an approval link' do let(:quoted_account) { Fabricate(:account, domain: 'quoted.example.com') } let(:quoted_status) { Fabricate(:status, account: quoted_account) } let!(:quote) { Fabricate(:quote, status: status, quoted_status: quoted_status, approval_uri: nil) } @@ -500,7 +500,7 @@ RSpec.describe ActivityPub::ProcessStatusUpdateService do end end - context 'when the status has an existing verified quote and removes an approval link', feature: :inbound_quotes do + context 'when the status has an existing verified quote and removes an approval link' do let(:quoted_account) { Fabricate(:account, domain: 'quoted.example.com') } let(:quoted_status) { Fabricate(:status, account: quoted_account) } let!(:quote) { Fabricate(:quote, status: status, quoted_status: quoted_status, approval_uri: approval_uri, state: :accepted) } @@ -535,7 +535,7 @@ RSpec.describe ActivityPub::ProcessStatusUpdateService do end end - context 'when the status adds a verifiable quote', feature: :inbound_quotes do + context 'when the status adds a verifiable quote' do let(:quoted_account) { Fabricate(:account, domain: 'quoted.example.com') } let(:quoted_status) { Fabricate(:status, account: quoted_account) } let(:approval_uri) { 'https://quoted.example.com/approvals/1' } @@ -600,7 +600,7 @@ RSpec.describe ActivityPub::ProcessStatusUpdateService do end end - context 'when the status adds a unverifiable quote', feature: :inbound_quotes do + context 'when the status adds a unverifiable quote' do let(:quoted_account) { Fabricate(:account, domain: 'quoted.example.com') } let(:quoted_status) { Fabricate(:status, account: quoted_account) } let(:approval_uri) { 'https://quoted.example.com/approvals/1' } @@ -635,7 +635,7 @@ RSpec.describe ActivityPub::ProcessStatusUpdateService do end end - context 'when the status removes a verified quote', feature: :inbound_quotes do + context 'when the status removes a verified quote' do let(:quoted_account) { Fabricate(:account, domain: 'quoted.example.com') } let(:quoted_status) { Fabricate(:status, account: quoted_account) } let!(:quote) { Fabricate(:quote, status: status, quoted_status: quoted_status, approval_uri: approval_uri, state: :accepted) } @@ -660,7 +660,7 @@ RSpec.describe ActivityPub::ProcessStatusUpdateService do end end - context 'when the status removes an unverified quote', feature: :inbound_quotes do + context 'when the status removes an unverified quote' do let(:quoted_account) { Fabricate(:account, domain: 'quoted.example.com') } let(:quoted_status) { Fabricate(:status, account: quoted_account) } let!(:quote) { Fabricate(:quote, status: status, quoted_status: quoted_status, approval_uri: nil, state: :pending) } @@ -684,7 +684,7 @@ RSpec.describe ActivityPub::ProcessStatusUpdateService do end end - context 'when the status swaps a verified quote with an unverifiable quote', feature: :inbound_quotes do + context 'when the status swaps a verified quote with an unverifiable quote' do let(:quoted_account) { Fabricate(:account, domain: 'quoted.example.com') } let(:quoted_status) { Fabricate(:status, account: quoted_account) } let(:second_quoted_status) { Fabricate(:status, account: quoted_account) } @@ -752,7 +752,7 @@ RSpec.describe ActivityPub::ProcessStatusUpdateService do end end - context 'when the status swaps a verified quote with another verifiable quote', feature: :inbound_quotes do + context 'when the status swaps a verified quote with another verifiable quote' do let(:quoted_account) { Fabricate(:account, domain: 'quoted.example.com') } let(:second_quoted_account) { Fabricate(:account, domain: 'second-quoted.example.com') } let(:quoted_status) { Fabricate(:status, account: quoted_account) } diff --git a/yarn.lock b/yarn.lock index abe82e88e2..57fb509bba 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4870,17 +4870,17 @@ __metadata: languageName: node linkType: hard -"browserslist@npm:^4.24.0, browserslist@npm:^4.24.4, browserslist@npm:^4.24.5": - version: 4.24.5 - resolution: "browserslist@npm:4.24.5" +"browserslist@npm:^4.24.0, browserslist@npm:^4.24.4, browserslist@npm:^4.25.0": + version: 4.25.0 + resolution: "browserslist@npm:4.25.0" dependencies: - caniuse-lite: "npm:^1.0.30001716" - electron-to-chromium: "npm:^1.5.149" + caniuse-lite: "npm:^1.0.30001718" + electron-to-chromium: "npm:^1.5.160" node-releases: "npm:^2.0.19" update-browserslist-db: "npm:^1.1.3" bin: browserslist: cli.js - checksum: 10c0/f4c1ce1a7d8fdfab5e5b88bb6e93d09e8a883c393f86801537a252da0362dbdcde4dbd97b318246c5d84c6607b2f6b47af732c1b000d6a8a881ee024bad29204 + checksum: 10c0/cc16c55b4468b18684a0e1ca303592b38635b1155d6724f172407192737a2f405b8030d87a05813729592793445b3d15e737b0055f901cdecccb29b1e580a1c5 languageName: node linkType: hard @@ -5001,10 +5001,10 @@ __metadata: languageName: node linkType: hard -"caniuse-lite@npm:^1.0.30001702, caniuse-lite@npm:^1.0.30001716": - version: 1.0.30001718 - resolution: "caniuse-lite@npm:1.0.30001718" - checksum: 10c0/67f9ad09bc16443e28d14f265d6e468480cd8dc1900d0d8b982222de80c699c4f2306599c3da8a3fa7139f110d4b30d49dbac78f215470f479abb6ffe141d5d3 +"caniuse-lite@npm:^1.0.30001702, caniuse-lite@npm:^1.0.30001718": + version: 1.0.30001721 + resolution: "caniuse-lite@npm:1.0.30001721" + checksum: 10c0/fa3a8926899824b385279f1f886fe34c5efb1321c9ece1b9df25c8d567a2706db8450cc5b4d969e769e641593e08ea644909324aba93636a43e4949a75f81c4c languageName: node linkType: hard @@ -5745,10 +5745,10 @@ __metadata: languageName: node linkType: hard -"electron-to-chromium@npm:^1.5.149": - version: 1.5.159 - resolution: "electron-to-chromium@npm:1.5.159" - checksum: 10c0/dc5b60a235ad04b1637b3b2af4914ac900c42813b02262a91a41d950223316f7b12de715697cf9c2d9f572f716f9422bf259ee65d86599cd2cc66e92c499ebd1 +"electron-to-chromium@npm:^1.5.160": + version: 1.5.165 + resolution: "electron-to-chromium@npm:1.5.165" + checksum: 10c0/20b91e67e7a8829a358c4a488e9b59b0e5f8d4cb075a70b9757bb21acf0fc751ca58ca7d9c6018bec74ac4bd42f7859e4ef37421c252a2275f642e12a32271d6 languageName: node linkType: hard @@ -9338,9 +9338,9 @@ __metadata: languageName: node linkType: hard -"postcss-custom-properties@npm:^14.0.5": - version: 14.0.5 - resolution: "postcss-custom-properties@npm:14.0.5" +"postcss-custom-properties@npm:^14.0.6": + version: 14.0.6 + resolution: "postcss-custom-properties@npm:14.0.6" dependencies: "@csstools/cascade-layer-name-parser": "npm:^2.0.5" "@csstools/css-parser-algorithms": "npm:^3.0.5" @@ -9349,7 +9349,7 @@ __metadata: postcss-value-parser: "npm:^4.2.0" peerDependencies: postcss: ^8.4 - checksum: 10c0/ddee0545075dc0888cd54a9bb5791a98719a5d4f31d1de33823841efb540fa79f65e48b7c4aaba753d3214102e419536c5bc46c72e6e1579e5352da4e042ef3b + checksum: 10c0/0eeef77bc713551f5cb8fa5982d24da4e854075f3af020f1c94366c47a23a4cc225ebfecc978bdb17f00ee0bdee9d2c784e0d01adc64a447321e408abbe2c83b languageName: node linkType: hard @@ -9530,8 +9530,8 @@ __metadata: linkType: hard "postcss-preset-env@npm:^10.1.5": - version: 10.2.0 - resolution: "postcss-preset-env@npm:10.2.0" + version: 10.2.1 + resolution: "postcss-preset-env@npm:10.2.1" dependencies: "@csstools/postcss-cascade-layers": "npm:^5.0.1" "@csstools/postcss-color-function": "npm:^4.0.10" @@ -9567,7 +9567,7 @@ __metadata: "@csstools/postcss-trigonometric-functions": "npm:^4.0.9" "@csstools/postcss-unset-value": "npm:^4.0.0" autoprefixer: "npm:^10.4.21" - browserslist: "npm:^4.24.5" + browserslist: "npm:^4.25.0" css-blank-pseudo: "npm:^7.0.1" css-has-pseudo: "npm:^7.0.2" css-prefers-color-scheme: "npm:^10.0.0" @@ -9578,7 +9578,7 @@ __metadata: postcss-color-hex-alpha: "npm:^10.0.0" postcss-color-rebeccapurple: "npm:^10.0.0" postcss-custom-media: "npm:^11.0.6" - postcss-custom-properties: "npm:^14.0.5" + postcss-custom-properties: "npm:^14.0.6" postcss-custom-selectors: "npm:^8.0.5" postcss-dir-pseudo-class: "npm:^9.0.1" postcss-double-position-gradients: "npm:^6.0.2" @@ -9599,7 +9599,7 @@ __metadata: postcss-selector-not: "npm:^8.0.1" peerDependencies: postcss: ^8.4 - checksum: 10c0/33406dcdd1d63fd3810f12cd97bf0d6a09a51917943ee7d75e2ccaf1d8cbce363abcb90ee68f14509d287d00de4afd6664dbdecaa4f4b95509e3578e27f54a24 + checksum: 10c0/1a78eb86bca8f7c2bf7686ee9ed354b21d1316a7d12ae9aec2ce4b4810f6d32e23d0787d7450e55145f14f76b715df758bb54af0ea6a151858b045bd429f596e languageName: node linkType: hard