diff --git a/CHANGELOG.md b/CHANGELOG.md index 19be8ea68e..97a7234382 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,26 @@ All notable changes to this project will be documented in this file. +## [4.4.2] - 2025-07-23 + +### Security + +- Update dependencies + +### Fixed + +- Fix menu not clickable in Firefox (#35390 and #35414 by @diondiondion) +- Add `lang` attribute to current composer language in alt text modal (#35412 by @diondiondion) +- Fix quote posts styling on notifications page (#35411 by @diondiondion) +- Improve a11y of custom select menus in notifications settings (#35403 by @diondiondion) +- Fix selected item in poll select menus is unreadable in Firefox (#35402 by @diondiondion) +- Update age limit wording (#35387 by @diondiondion) +- Fix support for quote verification in implicit status updates (#35384 by @ClearlyClaire) +- Improve `Dropdown` component accessibility (#35373 by @diondiondion) +- Fix processing some incoming quotes failing because of missing JSON-LD context (#35354 and #35380 by @ClearlyClaire) +- Make bio hashtags open the local page instead of the remote instance (#35349 by @ChaosExAnima) +- Fix styling of external log-in button (#35320 by @ClearlyClaire) + ## [4.4.1] - 2025-07-09 ### Fixed diff --git a/Gemfile.lock b/Gemfile.lock index 4c232743bf..ca95bbfdcf 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -287,7 +287,7 @@ GEM activesupport (>= 5.1) haml (>= 4.0.6) railties (>= 5.1) - haml_lint (0.65.0) + haml_lint (0.65.1) haml (>= 5.0) parallel (~> 1.10) rainbow @@ -315,7 +315,7 @@ GEM http_accept_language (2.1.1) httpclient (2.9.0) mutex_m - httplog (1.7.1) + httplog (1.7.2) rack (>= 2.0) rainbow (>= 2.0.0) i18n (1.14.7) diff --git a/app/controllers/admin/confirmations_controller.rb b/app/controllers/admin/confirmations_controller.rb index 702550eecc..5d1555796f 100644 --- a/app/controllers/admin/confirmations_controller.rb +++ b/app/controllers/admin/confirmations_controller.rb @@ -19,15 +19,13 @@ module Admin log_action :resend, @user - flash[:notice] = I18n.t('admin.accounts.resend_confirmation.success') - redirect_to admin_accounts_path + redirect_to admin_accounts_path, notice: t('admin.accounts.resend_confirmation.success') end private def redirect_confirmed_user - flash[:error] = I18n.t('admin.accounts.resend_confirmation.already_confirmed') - redirect_to admin_accounts_path + redirect_to admin_accounts_path, flash: { error: t('admin.accounts.resend_confirmation.already_confirmed') } end def user_confirmed? diff --git a/app/controllers/admin/settings_controller.rb b/app/controllers/admin/settings_controller.rb index 2ae5ec8255..a08375e0a4 100644 --- a/app/controllers/admin/settings_controller.rb +++ b/app/controllers/admin/settings_controller.rb @@ -14,8 +14,7 @@ module Admin @admin_settings = Form::AdminSettings.new(settings_params) if @admin_settings.save - flash[:notice] = I18n.t('generic.changes_saved_msg') - redirect_to after_update_redirect_path + redirect_to after_update_redirect_path, notice: t('generic.changes_saved_msg') else render :show end diff --git a/app/controllers/api/v1/push/subscriptions_controller.rb b/app/controllers/api/v1/push/subscriptions_controller.rb index f2c52f2846..3b0cda7d93 100644 --- a/app/controllers/api/v1/push/subscriptions_controller.rb +++ b/app/controllers/api/v1/push/subscriptions_controller.rb @@ -16,16 +16,7 @@ class Api::V1::Push::SubscriptionsController < Api::BaseController def create with_redis_lock("push_subscription:#{current_user.id}") do destroy_web_push_subscriptions! - - @push_subscription = Web::PushSubscription.create!( - endpoint: subscription_params[:endpoint], - key_p256dh: subscription_params[:keys][:p256dh], - key_auth: subscription_params[:keys][:auth], - standard: subscription_params[:standard] || false, - data: data_params, - user_id: current_user.id, - access_token_id: doorkeeper_token.id - ) + @push_subscription = Web::PushSubscription.create!(web_push_subscription_params) end render json: @push_subscription, serializer: REST::WebPushSubscriptionSerializer @@ -55,6 +46,18 @@ class Api::V1::Push::SubscriptionsController < Api::BaseController not_found if @push_subscription.nil? end + def web_push_subscription_params + { + access_token_id: doorkeeper_token.id, + data: data_params, + endpoint: subscription_params[:endpoint], + key_auth: subscription_params[:keys][:auth], + key_p256dh: subscription_params[:keys][:p256dh], + standard: subscription_params[:standard] || false, + user_id: current_user.id, + } + end + def subscription_params params.expect(subscription: [:endpoint, :standard, keys: [:auth, :p256dh]]) end diff --git a/app/controllers/api/web/push_subscriptions_controller.rb b/app/controllers/api/web/push_subscriptions_controller.rb index 2711071b4a..ced68d39fc 100644 --- a/app/controllers/api/web/push_subscriptions_controller.rb +++ b/app/controllers/api/web/push_subscriptions_controller.rb @@ -49,7 +49,7 @@ class Api::Web::PushSubscriptionsController < Api::Web::BaseController { policy: 'all', alerts: Notification::TYPES.index_with { alerts_enabled }, - } + }.deep_stringify_keys end def alerts_enabled diff --git a/app/controllers/auth/passwords_controller.rb b/app/controllers/auth/passwords_controller.rb index 7c1ff59671..2680a1c5fd 100644 --- a/app/controllers/auth/passwords_controller.rb +++ b/app/controllers/auth/passwords_controller.rb @@ -19,8 +19,7 @@ class Auth::PasswordsController < Devise::PasswordsController private def redirect_invalid_reset_token - flash[:error] = I18n.t('auth.invalid_reset_password_token') - redirect_to new_password_path(resource_name) + redirect_to new_password_path(resource_name), flash: { error: t('auth.invalid_reset_password_token') } end def reset_password_token_is_valid? diff --git a/app/controllers/settings/sessions_controller.rb b/app/controllers/settings/sessions_controller.rb index ee2fc5dc80..fe59bdc491 100644 --- a/app/controllers/settings/sessions_controller.rb +++ b/app/controllers/settings/sessions_controller.rb @@ -8,8 +8,7 @@ class Settings::SessionsController < Settings::BaseController def destroy @session.destroy! - flash[:notice] = I18n.t('sessions.revoke_success') - redirect_to edit_user_registration_path + redirect_to edit_user_registration_path, notice: t('sessions.revoke_success') end private diff --git a/app/controllers/settings/two_factor_authentication/webauthn_credentials_controller.rb b/app/controllers/settings/two_factor_authentication/webauthn_credentials_controller.rb index 9714d54f95..b01f08ed8f 100644 --- a/app/controllers/settings/two_factor_authentication/webauthn_credentials_controller.rb +++ b/app/controllers/settings/two_factor_authentication/webauthn_credentials_controller.rb @@ -86,13 +86,11 @@ module Settings private def redirect_invalid_otp - flash[:error] = t('webauthn_credentials.otp_required') - redirect_to settings_two_factor_authentication_methods_path + redirect_to settings_two_factor_authentication_methods_path, flash: { error: t('webauthn_credentials.otp_required') } end def redirect_invalid_webauthn - flash[:error] = t('webauthn_credentials.not_enabled') - redirect_to settings_two_factor_authentication_methods_path + redirect_to settings_two_factor_authentication_methods_path, flash: { error: t('webauthn_credentials.not_enabled') } end end end diff --git a/app/javascript/mastodon/components/account_bio.tsx b/app/javascript/mastodon/components/account_bio.tsx index cdac41b8a7..b720b4746d 100644 --- a/app/javascript/mastodon/components/account_bio.tsx +++ b/app/javascript/mastodon/components/account_bio.tsx @@ -3,8 +3,8 @@ import { useCallback } from 'react'; import { useLinks } from 'mastodon/hooks/useLinks'; import { EmojiHTML } from '../features/emoji/emoji_html'; -import { isFeatureEnabled } from '../initial_state'; import { useAppSelector } from '../store'; +import { isModernEmojiEnabled } from '../utils/environment'; interface AccountBioProps { className: string; @@ -32,9 +32,7 @@ export const AccountBio: React.FC = ({ if (!account) { return ''; } - return isFeatureEnabled('modern_emojis') - ? account.note - : account.note_emojified; + return isModernEmojiEnabled() ? account.note : account.note_emojified; }); const extraEmojis = useAppSelector((state) => { const account = state.accounts.get(accountId); diff --git a/app/javascript/mastodon/components/gifv.tsx b/app/javascript/mastodon/components/gifv.tsx index 8e3a434c14..d7d0b5f2ce 100644 --- a/app/javascript/mastodon/components/gifv.tsx +++ b/app/javascript/mastodon/components/gifv.tsx @@ -37,7 +37,6 @@ export const GIFV = forwardRef( role='button' tabIndex={0} aria-label={alt} - title={alt} lang={lang} onClick={handleClick} /> @@ -49,7 +48,6 @@ export const GIFV = forwardRef( role='button' tabIndex={0} aria-label={alt} - title={alt} lang={lang} width={width} height={height} diff --git a/app/javascript/mastodon/components/status_content.jsx b/app/javascript/mastodon/components/status_content.jsx index 02f06ec96a..e1fd7734e9 100644 --- a/app/javascript/mastodon/components/status_content.jsx +++ b/app/javascript/mastodon/components/status_content.jsx @@ -13,8 +13,9 @@ import ChevronRightIcon from '@/material-icons/400-24px/chevron_right.svg?react' import { Icon } from 'mastodon/components/icon'; import { Poll } from 'mastodon/components/poll'; import { identityContextPropShape, withIdentity } from 'mastodon/identity_context'; -import { autoPlayGif, isFeatureEnabled, languages as preloadedLanguages } from 'mastodon/initial_state'; +import { autoPlayGif, languages as preloadedLanguages } from 'mastodon/initial_state'; import { EmojiHTML } from '../features/emoji/emoji_html'; +import { isModernEmojiEnabled } from '../utils/environment'; const MAX_HEIGHT = 706; // 22px * 32 (+ 2px padding at the top) @@ -24,7 +25,7 @@ const MAX_HEIGHT = 706; // 22px * 32 (+ 2px padding at the top) * @returns {string} */ export function getStatusContent(status) { - if (isFeatureEnabled('modern_emojis')) { + if (isModernEmojiEnabled()) { return status.getIn(['translation', 'content']) || status.get('content'); } return status.getIn(['translation', 'contentHtml']) || status.get('contentHtml'); diff --git a/app/javascript/mastodon/components/status_list.jsx b/app/javascript/mastodon/components/status_list.jsx index 70b7968fba..c3055aeeab 100644 --- a/app/javascript/mastodon/components/status_list.jsx +++ b/app/javascript/mastodon/components/status_list.jsx @@ -41,9 +41,11 @@ export default class StatusList extends ImmutablePureComponent { }; componentDidMount() { - this.columnHeaderHeight = parseFloat( - getComputedStyle(this.node.node).getPropertyValue('--column-header-height') - ) || 0; + this.columnHeaderHeight = this.node?.node + ? parseFloat( + getComputedStyle(this.node.node).getPropertyValue('--column-header-height') + ) || 0 + : 0; } getFeaturedStatusCount = () => { @@ -69,8 +71,8 @@ export default class StatusList extends ImmutablePureComponent { }; _selectChild = (id, index, direction) => { - const listContainer = this.node.node; - let listItem = listContainer.querySelector( + const listContainer = this.node?.node; + let listItem = listContainer?.querySelector( // :nth-child uses 1-based indexing `.item-list > :nth-child(${index + 1 + direction})` ); diff --git a/app/javascript/mastodon/features/emoji/emoji_html.tsx b/app/javascript/mastodon/features/emoji/emoji_html.tsx index 27af2dda27..85628e6723 100644 --- a/app/javascript/mastodon/features/emoji/emoji_html.tsx +++ b/app/javascript/mastodon/features/emoji/emoji_html.tsx @@ -5,8 +5,8 @@ import type { List as ImmutableList } from 'immutable'; import { isList } from 'immutable'; import type { ApiCustomEmojiJSON } from '@/mastodon/api_types/custom_emoji'; -import { isFeatureEnabled } from '@/mastodon/initial_state'; import type { CustomEmoji } from '@/mastodon/models/custom_emoji'; +import { isModernEmojiEnabled } from '@/mastodon/utils/environment'; import { useEmojiAppState } from './hooks'; import { emojifyElement } from './render'; @@ -25,7 +25,7 @@ export const EmojiHTML: React.FC = ({ extraEmojis, ...props }) => { - if (isFeatureEnabled('modern_emojis')) { + if (isModernEmojiEnabled()) { return ( ( ): Promise { const locale = toSupportedLocaleOrCustom(localeOrCustom); - let uri: string; + // Use location.origin as this script may be loaded from a CDN domain. + const url = new URL(location.origin); if (locale === 'custom') { - uri = '/api/v1/custom_emojis'; + url.pathname = '/api/v1/custom_emojis'; } else { - uri = `/packs${isDevelopment() ? '-dev' : ''}/emoji/${locale}.json`; + url.pathname = `/packs${isDevelopment() ? '-dev' : ''}/emoji/${locale}.json`; } const oldEtag = await loadLatestEtag(locale); - const response = await fetch(uri, { + const response = await fetch(url, { headers: { 'Content-Type': 'application/json', 'If-None-Match': oldEtag ?? '', // Send the old ETag to check for modifications diff --git a/app/javascript/mastodon/features/picture_in_picture/components/footer.tsx b/app/javascript/mastodon/features/picture_in_picture/components/footer.tsx index 080aaca451..24c88f9505 100644 --- a/app/javascript/mastodon/features/picture_in_picture/components/footer.tsx +++ b/app/javascript/mastodon/features/picture_in_picture/components/footer.tsx @@ -21,6 +21,7 @@ import { openModal } from 'mastodon/actions/modal'; import { IconButton } from 'mastodon/components/icon_button'; import { useIdentity } from 'mastodon/identity_context'; import { me } from 'mastodon/initial_state'; +import type { Account } from 'mastodon/models/account'; import type { Status } from 'mastodon/models/status'; import { makeGetStatus } from 'mastodon/selectors'; import type { RootState } from 'mastodon/store'; @@ -66,10 +67,7 @@ export const Footer: React.FC<{ const dispatch = useAppDispatch(); const getStatus = useMemo(() => makeGetStatus(), []) as GetStatusSelector; const status = useAppSelector((state) => getStatus(state, { id: statusId })); - const accountId = status?.get('account') as string | undefined; - const account = useAppSelector((state) => - accountId ? state.accounts.get(accountId) : undefined, - ); + const account = status?.get('account') as Account | undefined; const askReplyConfirmation = useAppSelector( (state) => (state.compose.get('text') as string).trim().length !== 0, ); diff --git a/app/javascript/mastodon/features/ui/components/zoomable_image.tsx b/app/javascript/mastodon/features/ui/components/zoomable_image.tsx index 09b39d3efa..1297d243d0 100644 --- a/app/javascript/mastodon/features/ui/components/zoomable_image.tsx +++ b/app/javascript/mastodon/features/ui/components/zoomable_image.tsx @@ -306,10 +306,8 @@ export const ZoomableImage: React.FC = ({ Horrek jartzen zaitu top (e)an {domain} erabiltzaileen artean ", + "annual_report.summary.percentile.we_wont_tell_bernie": "Bernieri ez diogu ezer esango ;)..", "annual_report.summary.thanks": "Eskerrik asko Mastodonen parte izateagatik!", "attachments_list.unprocessed": "(prozesatu gabe)", "audio.hide": "Ezkutatu audioa", @@ -216,6 +219,7 @@ "confirmations.discard_draft.edit.message": "Jarraitzeak editatzen ari zaren mezuan egindako aldaketak baztertuko ditu.", "confirmations.discard_draft.edit.title": "Baztertu zure argitalpenari egindako aldaketak?", "confirmations.discard_draft.post.cancel": "Zirriborroa berrekin", + "confirmations.discard_draft.post.message": "Jarraituz gero, idazten ari zaren sarrera bertan behera geratuko da.", "confirmations.discard_draft.post.title": "Zure argitalpenaren zirriborroa baztertu nahi duzu?", "confirmations.discard_edit_media.confirm": "Baztertu", "confirmations.discard_edit_media.message": "Multimediaren deskribapen edo aurrebistan gorde gabeko aldaketak daude, baztertu nahi dituzu?", @@ -413,8 +417,6 @@ "hints.profiles.see_more_followers": "Ikusi jarraitzaile gehiago {domain}-(e)n", "hints.profiles.see_more_follows": "Ikusi jarraitzaile gehiago {domain}-(e)n", "hints.profiles.see_more_posts": "Ikusi bidalketa gehiago {domain}-(e)n", - "hints.threads.replies_may_be_missing": "Baliteke beste zerbitzari batzuen erantzun batzuk ez erakustea.", - "hints.threads.see_more": "Ikusi erantzun gehiago {domain}-(e)n", "home.column_settings.show_quotes": "Erakutsi aipamenak", "home.column_settings.show_reblogs": "Erakutsi bultzadak", "home.column_settings.show_replies": "Erakutsi erantzunak", @@ -435,6 +437,7 @@ "ignore_notifications_modal.not_following_title": "Jarraitzen ez dituzun pertsonen jakinarazpenei ez ikusiarena egin?", "ignore_notifications_modal.private_mentions_title": "Eskatu gabeko aipamen pribatuen jakinarazpenei ez ikusiarena egin?", "info_button.label": "Laguntza", + "info_button.what_is_alt_text": "

Zer da Alt testua?

Alt testuak irudiak deskribatzeko aukera ematen du, ikusmen-urritasunak, banda-zabalera txikiko konexioak edo testuinguru gehigarria nahi duten pertsonentzat.

Alt testu argi, zehatz eta objektiboen bidez, guztion irisgarritasuna eta ulermena hobetu ditzakezu.

  • Hartu elementu garrantzitsuenak
  • Laburbildu irudietako testua
  • Erabili esaldien egitura erregularra
  • Baztertu informazio erredundantea.
  • Enfokatu joeretan eta funtsezko elementuetan irudi konplexuetan (diagrametan edo mapetan, adibidez)
", "interaction_modal.action.favourite": "Jarraitzeko, zure kontutik atsegindu behar duzu.", "interaction_modal.action.follow": "Jarraitzeko zure kontutik jarraitu behar duzu.", "interaction_modal.action.reply": "Jarraitzeko zure kontutik erantzun behar duzu.", @@ -903,6 +906,7 @@ "video.hide": "Ezkutatu bideoa", "video.pause": "Pausatu", "video.play": "Jo", + "video.skip_forward": "Jauzi aurrerantz", "video.unmute": "Soinua ezarri", "video.volume_down": "Bolumena jaitsi", "video.volume_up": "Bolumena Igo" diff --git a/app/javascript/mastodon/locales/fa.json b/app/javascript/mastodon/locales/fa.json index fadbb24700..c35687e031 100644 --- a/app/javascript/mastodon/locales/fa.json +++ b/app/javascript/mastodon/locales/fa.json @@ -424,8 +424,6 @@ "hints.profiles.see_more_followers": "دیدن پی‌گیرندگان بیش‌تر روی {domain}", "hints.profiles.see_more_follows": "دیدن پی‌گرفته‌های بیش‌تر روی {domain}", "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": "نمایش پاسخ‌ها", diff --git a/app/javascript/mastodon/locales/fi.json b/app/javascript/mastodon/locales/fi.json index 7de3fc07ea..36fcfd4e94 100644 --- a/app/javascript/mastodon/locales/fi.json +++ b/app/javascript/mastodon/locales/fi.json @@ -424,8 +424,6 @@ "hints.profiles.see_more_followers": "Näytä lisää seuraajia palvelimella {domain}", "hints.profiles.see_more_follows": "Näytä lisää seurattavia palvelimella {domain}", "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", @@ -847,6 +845,8 @@ "status.bookmark": "Lisää kirjanmerkki", "status.cancel_reblog_private": "Peru tehostus", "status.cannot_reblog": "Tätä julkaisua ei voi tehostaa", + "status.context.load_new_replies": "Uusia vastauksia saatavilla", + "status.context.loading": "Tarkistetaan lisävastauksia", "status.continued_thread": "Jatkoi ketjua", "status.copy": "Kopioi linkki julkaisuun", "status.delete": "Poista", diff --git a/app/javascript/mastodon/locales/fo.json b/app/javascript/mastodon/locales/fo.json index afd75afc42..1bdccaeae8 100644 --- a/app/javascript/mastodon/locales/fo.json +++ b/app/javascript/mastodon/locales/fo.json @@ -424,8 +424,6 @@ "hints.profiles.see_more_followers": "Sí fleiri fylgjarar á {domain}", "hints.profiles.see_more_follows": "Sí fleiri, ið viðkomandi fylgir, á {domain}", "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", @@ -847,6 +845,8 @@ "status.bookmark": "Goym", "status.cancel_reblog_private": "Strika stimbran", "status.cannot_reblog": "Tað ber ikki til at stimbra hendan postin", + "status.context.load_new_replies": "Nýggj svar tøk", + "status.context.loading": "Kanni um tað eru fleiri svar", "status.continued_thread": "Framhaldandi tráður", "status.copy": "Kopiera leinki til postin", "status.delete": "Strika", diff --git a/app/javascript/mastodon/locales/fr-CA.json b/app/javascript/mastodon/locales/fr-CA.json index 0fdd593859..840b0e508d 100644 --- a/app/javascript/mastodon/locales/fr-CA.json +++ b/app/javascript/mastodon/locales/fr-CA.json @@ -423,8 +423,6 @@ "hints.profiles.see_more_followers": "Afficher plus d'abonné·e·s sur {domain}", "hints.profiles.see_more_follows": "Afficher plus d'abonné·e·s sur {domain}", "hints.profiles.see_more_posts": "Voir plus de messages sur {domain}", - "hints.threads.replies_may_be_missing": "Les réponses provenant des autres serveurs pourraient être manquantes.", - "hints.threads.see_more": "Afficher plus de réponses sur {domain}", "home.column_settings.show_quotes": "Afficher les citations", "home.column_settings.show_reblogs": "Afficher boosts", "home.column_settings.show_replies": "Afficher réponses", diff --git a/app/javascript/mastodon/locales/fr.json b/app/javascript/mastodon/locales/fr.json index 6f1bbae61c..c0c9580a46 100644 --- a/app/javascript/mastodon/locales/fr.json +++ b/app/javascript/mastodon/locales/fr.json @@ -423,8 +423,6 @@ "hints.profiles.see_more_followers": "Afficher plus d'abonné·e·s sur {domain}", "hints.profiles.see_more_follows": "Afficher plus d'abonné·e·s sur {domain}", "hints.profiles.see_more_posts": "Voir plus de messages sur {domain}", - "hints.threads.replies_may_be_missing": "Les réponses provenant des autres serveurs pourraient être manquantes.", - "hints.threads.see_more": "Afficher plus de réponses sur {domain}", "home.column_settings.show_quotes": "Afficher les citations", "home.column_settings.show_reblogs": "Afficher les partages", "home.column_settings.show_replies": "Afficher les réponses", diff --git a/app/javascript/mastodon/locales/fy.json b/app/javascript/mastodon/locales/fy.json index 33c6d89d19..25f5c0cc01 100644 --- a/app/javascript/mastodon/locales/fy.json +++ b/app/javascript/mastodon/locales/fy.json @@ -424,8 +424,6 @@ "hints.profiles.see_more_followers": "Besjoch mear folgers op {domain}", "hints.profiles.see_more_follows": "Besjoch mear folge accounts op {domain}", "hints.profiles.see_more_posts": "Besjoch mear berjochten op {domain}", - "hints.threads.replies_may_be_missing": "Antwurden fan oare servers kinne ûntbrekke.", - "hints.threads.see_more": "Besjoch mear reaksjes op {domain}", "home.column_settings.show_quotes": "Sitaten toane", "home.column_settings.show_reblogs": "Boosts toane", "home.column_settings.show_replies": "Reaksjes toane", diff --git a/app/javascript/mastodon/locales/ga.json b/app/javascript/mastodon/locales/ga.json index 92d06a05cf..bca4ed8d1e 100644 --- a/app/javascript/mastodon/locales/ga.json +++ b/app/javascript/mastodon/locales/ga.json @@ -424,8 +424,6 @@ "hints.profiles.see_more_followers": "Féach ar a thuilleadh leantóirí ar {domain}", "hints.profiles.see_more_follows": "Féach tuilleadh seo a leanas ar {domain}", "hints.profiles.see_more_posts": "Féach ar a thuilleadh postálacha ar {domain}", - "hints.threads.replies_may_be_missing": "Seans go bhfuil freagraí ó fhreastalaithe eile in easnamh.", - "hints.threads.see_more": "Féach ar a thuilleadh freagraí ar {domain}", "home.column_settings.show_quotes": "Taispeáin Sleachta", "home.column_settings.show_reblogs": "Taispeáin moltaí", "home.column_settings.show_replies": "Taispeán freagraí", diff --git a/app/javascript/mastodon/locales/gd.json b/app/javascript/mastodon/locales/gd.json index 208e117037..c783182cd5 100644 --- a/app/javascript/mastodon/locales/gd.json +++ b/app/javascript/mastodon/locales/gd.json @@ -424,8 +424,6 @@ "hints.profiles.see_more_followers": "Faic barrachd luchd-leantainn air {domain}", "hints.profiles.see_more_follows": "Faic barrachd a tha 'gan leantainn air {domain}", "hints.profiles.see_more_posts": "Faic barrachd phostaichean air {domain}", - "hints.threads.replies_may_be_missing": "Dh’fhaoidte gu bheil freagairtean o fhrithealaichean eile a dhìth.", - "hints.threads.see_more": "Faic barrachd fhreagairtean air {domain}", "home.column_settings.show_quotes": "Seall luaidhean", "home.column_settings.show_reblogs": "Seall na brosnachaidhean", "home.column_settings.show_replies": "Seall na freagairtean", diff --git a/app/javascript/mastodon/locales/gl.json b/app/javascript/mastodon/locales/gl.json index 7cb227215e..6a8570c1d0 100644 --- a/app/javascript/mastodon/locales/gl.json +++ b/app/javascript/mastodon/locales/gl.json @@ -424,8 +424,6 @@ "hints.profiles.see_more_followers": "Mira máis seguidoras en {domain}", "hints.profiles.see_more_follows": "Mira máis seguimentos en {domain}", "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", @@ -847,6 +845,8 @@ "status.bookmark": "Marcar", "status.cancel_reblog_private": "Desfacer compartido", "status.cannot_reblog": "Esta publicación non pode ser promovida", + "status.context.load_new_replies": "Non hai respostas dispoñibles", + "status.context.loading": "Mirando se hai máis respostas", "status.continued_thread": "Continua co fío", "status.copy": "Copiar ligazón á publicación", "status.delete": "Eliminar", diff --git a/app/javascript/mastodon/locales/he.json b/app/javascript/mastodon/locales/he.json index cb5ffb52db..715ec36f54 100644 --- a/app/javascript/mastodon/locales/he.json +++ b/app/javascript/mastodon/locales/he.json @@ -424,8 +424,6 @@ "hints.profiles.see_more_followers": "צפיה בעוד עוקבים משרת {domain}", "hints.profiles.see_more_follows": "צפיה בעוד נעקבים בשרת {domain}", "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": "הצגת תגובות", @@ -847,6 +845,8 @@ "status.bookmark": "סימניה", "status.cancel_reblog_private": "הסרת הדהוד", "status.cannot_reblog": "לא ניתן להדהד חצרוץ זה", + "status.context.load_new_replies": "הגיעו תגובות חדשות", + "status.context.loading": "מחפש תגובות חדשות", "status.continued_thread": "שרשור מתמשך", "status.copy": "העתק/י קישור להודעה זו", "status.delete": "מחיקה", diff --git a/app/javascript/mastodon/locales/hu.json b/app/javascript/mastodon/locales/hu.json index abd9b8ad11..06a8bf8846 100644 --- a/app/javascript/mastodon/locales/hu.json +++ b/app/javascript/mastodon/locales/hu.json @@ -424,8 +424,6 @@ "hints.profiles.see_more_followers": "További követők megtekintése itt: {domain}", "hints.profiles.see_more_follows": "További követések megtekintése itt: {domain}", "hints.profiles.see_more_posts": "További bejegyzések megtekintése itt: {domain}", - "hints.threads.replies_may_be_missing": "A más kiszolgálókról érkező válaszok lehet, hogy hiányoznak.", - "hints.threads.see_more": "További válaszok megtekintése itt: {domain}", "home.column_settings.show_quotes": "Idézetek megjelenítése", "home.column_settings.show_reblogs": "Megtolások megjelenítése", "home.column_settings.show_replies": "Válaszok megjelenítése", @@ -847,6 +845,8 @@ "status.bookmark": "Könyvjelzőzés", "status.cancel_reblog_private": "Megtolás visszavonása", "status.cannot_reblog": "Ezt a bejegyzést nem lehet megtolni", + "status.context.load_new_replies": "Új válaszok érhetőek el", + "status.context.loading": "További válaszok keresése", "status.continued_thread": "Folytatott szál", "status.copy": "Link másolása bejegyzésbe", "status.delete": "Törlés", diff --git a/app/javascript/mastodon/locales/ia.json b/app/javascript/mastodon/locales/ia.json index f9deb2f859..2edb77b7f3 100644 --- a/app/javascript/mastodon/locales/ia.json +++ b/app/javascript/mastodon/locales/ia.json @@ -404,8 +404,6 @@ "hints.profiles.see_more_followers": "Vider plus de sequitores sur {domain}", "hints.profiles.see_more_follows": "Vider plus de sequites sur {domain}", "hints.profiles.see_more_posts": "Vider plus de messages sur {domain}", - "hints.threads.replies_may_be_missing": "Responsas de altere servitores pote mancar.", - "hints.threads.see_more": "Vider plus de responsas sur {domain}", "home.column_settings.show_reblogs": "Monstrar impulsos", "home.column_settings.show_replies": "Monstrar responsas", "home.hide_announcements": "Celar annuncios", diff --git a/app/javascript/mastodon/locales/io.json b/app/javascript/mastodon/locales/io.json index 69e549ea88..deb1cab89a 100644 --- a/app/javascript/mastodon/locales/io.json +++ b/app/javascript/mastodon/locales/io.json @@ -383,8 +383,6 @@ "hints.profiles.see_more_followers": "Vidar plu multa sequanti sur {domain}", "hints.profiles.see_more_follows": "Vidar plu multa sequati sur {domain}", "hints.profiles.see_more_posts": "Vidar plu multa posti sur {domain}", - "hints.threads.replies_may_be_missing": "Respondi de altra servili forsan ne esas hike.", - "hints.threads.see_more": "Vidar plu multa demandi sur {domain}", "home.column_settings.show_reblogs": "Montrar repeti", "home.column_settings.show_replies": "Montrar respondi", "home.hide_announcements": "Celez anunci", diff --git a/app/javascript/mastodon/locales/is.json b/app/javascript/mastodon/locales/is.json index 52b3f5d97d..54aec7cbee 100644 --- a/app/javascript/mastodon/locales/is.json +++ b/app/javascript/mastodon/locales/is.json @@ -424,8 +424,6 @@ "hints.profiles.see_more_followers": "Sjá fleiri fylgjendur á {domain}", "hints.profiles.see_more_follows": "Sjá fleiri sem þú fylgist með á {domain}", "hints.profiles.see_more_posts": "Sjá fleiri færslur á {domain}", - "hints.threads.replies_may_be_missing": "Svör af öðrum netþjónum gæti vantað.", - "hints.threads.see_more": "Sjá fleiri svör á {domain}", "home.column_settings.show_quotes": "Birta tilvitnanir", "home.column_settings.show_reblogs": "Sýna endurbirtingar", "home.column_settings.show_replies": "Birta svör", @@ -847,6 +845,8 @@ "status.bookmark": "Bókamerki", "status.cancel_reblog_private": "Taka úr endurbirtingu", "status.cannot_reblog": "Þessa færslu er ekki hægt að endurbirta", + "status.context.load_new_replies": "Ný svör hafa borist", + "status.context.loading": "Athuga með fleiri svör", "status.continued_thread": "Hélt samtali áfram", "status.copy": "Afrita tengil í færslu", "status.delete": "Eyða", diff --git a/app/javascript/mastodon/locales/it.json b/app/javascript/mastodon/locales/it.json index f39862e7cc..5134b39e67 100644 --- a/app/javascript/mastodon/locales/it.json +++ b/app/javascript/mastodon/locales/it.json @@ -424,8 +424,6 @@ "hints.profiles.see_more_followers": "Vedi altri seguaci su {domain}", "hints.profiles.see_more_follows": "Vedi altri profili seguiti su {domain}", "hints.profiles.see_more_posts": "Vedi altri post su {domain}", - "hints.threads.replies_may_be_missing": "Le risposte da altri server potrebbero essere mancanti.", - "hints.threads.see_more": "Vedi altre risposte su {domain}", "home.column_settings.show_quotes": "Mostra le citazioni", "home.column_settings.show_reblogs": "Mostra reblog", "home.column_settings.show_replies": "Mostra risposte", @@ -847,6 +845,8 @@ "status.bookmark": "Aggiungi segnalibro", "status.cancel_reblog_private": "Annulla reblog", "status.cannot_reblog": "Questo post non può essere condiviso", + "status.context.load_new_replies": "Nuove risposte disponibili", + "status.context.loading": "Controllo per altre risposte", "status.continued_thread": "Discussione continua", "status.copy": "Copia link al post", "status.delete": "Elimina", diff --git a/app/javascript/mastodon/locales/ja.json b/app/javascript/mastodon/locales/ja.json index ff12bf1dd1..59ed074012 100644 --- a/app/javascript/mastodon/locales/ja.json +++ b/app/javascript/mastodon/locales/ja.json @@ -423,8 +423,6 @@ "hints.profiles.see_more_followers": "{domain} で正確な情報を見る", "hints.profiles.see_more_follows": "{domain} で正確な情報を見る", "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": "返信表示", diff --git a/app/javascript/mastodon/locales/kab.json b/app/javascript/mastodon/locales/kab.json index 0c2faa120e..0bc4665a25 100644 --- a/app/javascript/mastodon/locales/kab.json +++ b/app/javascript/mastodon/locales/kab.json @@ -297,8 +297,6 @@ "hashtag.follow": "Ḍfeṛ ahacṭag", "hashtag.mute": "Sgugem #{hashtag}", "hashtags.and_other": "…d {count, plural, one {}other {# nniḍen}}", - "hints.threads.replies_may_be_missing": "Tiririyin d-yusan deg iqeddacen nniḍen, yezmer ur d-ddant ara.", - "hints.threads.see_more": "Wali ugar n tririt deg {domain}", "home.column_settings.show_reblogs": "Ssken-d beṭṭu", "home.column_settings.show_replies": "Ssken-d tiririyin", "home.hide_announcements": "Ffer ulɣuyen", diff --git a/app/javascript/mastodon/locales/ko.json b/app/javascript/mastodon/locales/ko.json index 6c2cc7ea14..cfb3ba8c61 100644 --- a/app/javascript/mastodon/locales/ko.json +++ b/app/javascript/mastodon/locales/ko.json @@ -424,8 +424,6 @@ "hints.profiles.see_more_followers": "{domain}에서 더 많은 팔로워 보기", "hints.profiles.see_more_follows": "{domain}에서 더 많은 팔로우 보기", "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": "답글 표시", diff --git a/app/javascript/mastodon/locales/ku.json b/app/javascript/mastodon/locales/ku.json index 63110fda87..f628721f47 100644 --- a/app/javascript/mastodon/locales/ku.json +++ b/app/javascript/mastodon/locales/ku.json @@ -272,7 +272,6 @@ "hashtag.column_settings.tag_toggle": "Ji bo vê stûnê hin pêvekan tevlî bike", "hashtag.follow": "Hashtagê bişopîne", "hashtag.unfollow": "Hashtagê neşopîne", - "hints.threads.replies_may_be_missing": "Beriv ji rajekarên din dibe ku wendayî bin.", "home.column_settings.show_reblogs": "Bilindkirinan nîşan bike", "home.column_settings.show_replies": "Bersivan nîşan bide", "home.hide_announcements": "Reklaman veşêre", diff --git a/app/javascript/mastodon/locales/lad.json b/app/javascript/mastodon/locales/lad.json index 83ffe1834b..7c6ce24a8f 100644 --- a/app/javascript/mastodon/locales/lad.json +++ b/app/javascript/mastodon/locales/lad.json @@ -368,8 +368,6 @@ "hints.profiles.see_more_followers": "Ve mas suivantes en {domain}", "hints.profiles.see_more_follows": "Ve mas segidos en {domain}", "hints.profiles.see_more_posts": "Ve mas puvlikasyones en {domain}", - "hints.threads.replies_may_be_missing": "Puede mankar repuestas de otros sirvidores.", - "hints.threads.see_more": "Ve mas repuestas en {domain}", "home.column_settings.show_reblogs": "Amostra repartajasyones", "home.column_settings.show_replies": "Amostra repuestas", "home.hide_announcements": "Eskonde pregones", diff --git a/app/javascript/mastodon/locales/lt.json b/app/javascript/mastodon/locales/lt.json index 944ab8d964..ed5fa83171 100644 --- a/app/javascript/mastodon/locales/lt.json +++ b/app/javascript/mastodon/locales/lt.json @@ -396,8 +396,6 @@ "hints.profiles.see_more_followers": "Žiūrėti daugiau sekėjų serveryje {domain}", "hints.profiles.see_more_follows": "Žiūrėti daugiau sekimų serveryje {domain}", "hints.profiles.see_more_posts": "Žiūrėti daugiau įrašų serveryje {domain}", - "hints.threads.replies_may_be_missing": "Atsakymai iš kitų serverių gali būti nepateikti.", - "hints.threads.see_more": "Žiūrėti daugiau atsakymų serveryje {domain}", "home.column_settings.show_reblogs": "Rodyti pakėlimus", "home.column_settings.show_replies": "Rodyti atsakymus", "home.hide_announcements": "Slėpti skelbimus", diff --git a/app/javascript/mastodon/locales/lv.json b/app/javascript/mastodon/locales/lv.json index 104528c0e1..ee3c143412 100644 --- a/app/javascript/mastodon/locales/lv.json +++ b/app/javascript/mastodon/locales/lv.json @@ -386,8 +386,6 @@ "hints.profiles.see_more_followers": "Skatīt vairāk sekotāju {domain}", "hints.profiles.see_more_follows": "Skatīt vairāk sekojumu {domain}", "hints.profiles.see_more_posts": "Skatīt vairāk ierakstu {domain}", - "hints.threads.replies_may_be_missing": "Var trūkt atbilžu no citiem serveriem.", - "hints.threads.see_more": "Skatīt vairāk atbilžu {domain}", "home.column_settings.show_quotes": "Rādīt citātus", "home.column_settings.show_reblogs": "Rādīt pastiprinātos ierakstus", "home.column_settings.show_replies": "Rādīt atbildes", diff --git a/app/javascript/mastodon/locales/nan.json b/app/javascript/mastodon/locales/nan.json index 48e1b75c2b..e7e8d2c0cd 100644 --- a/app/javascript/mastodon/locales/nan.json +++ b/app/javascript/mastodon/locales/nan.json @@ -424,8 +424,6 @@ "hints.profiles.see_more_followers": "佇 {domain} 看koh khah tsē跟tuè lí ê", "hints.profiles.see_more_follows": "佇 {domain} 看koh khah tsē lí跟tuè ê", "hints.profiles.see_more_posts": "佇 {domain} 看koh khah tsē ê PO文", - "hints.threads.replies_may_be_missing": "Tuì其他ê服侍器來ê回應可能有phah m̄見。", - "hints.threads.see_more": "佇 {domain} 看koh khah tsē ê回應", "home.column_settings.show_quotes": "顯示引用", "home.column_settings.show_reblogs": "顯示轉PO", "home.column_settings.show_replies": "顯示回應", diff --git a/app/javascript/mastodon/locales/nl.json b/app/javascript/mastodon/locales/nl.json index 90593ac205..04ceb2591b 100644 --- a/app/javascript/mastodon/locales/nl.json +++ b/app/javascript/mastodon/locales/nl.json @@ -424,8 +424,6 @@ "hints.profiles.see_more_followers": "Bekijk meer volgers op {domain}", "hints.profiles.see_more_follows": "Bekijk meer gevolgde accounts op {domain}", "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", @@ -847,6 +845,8 @@ "status.bookmark": "Bladwijzer toevoegen", "status.cancel_reblog_private": "Niet langer boosten", "status.cannot_reblog": "Dit bericht kan niet geboost worden", + "status.context.load_new_replies": "Nieuwe reacties beschikbaar", + "status.context.loading": "Op nieuwe reacties aan het controleren", "status.continued_thread": "Vervolg van gesprek", "status.copy": "Link naar bericht kopiëren", "status.delete": "Verwijderen", diff --git a/app/javascript/mastodon/locales/nn.json b/app/javascript/mastodon/locales/nn.json index b739208ab3..b5b97007c8 100644 --- a/app/javascript/mastodon/locales/nn.json +++ b/app/javascript/mastodon/locales/nn.json @@ -424,8 +424,6 @@ "hints.profiles.see_more_followers": "Sjå fleire fylgjarar på {domain}", "hints.profiles.see_more_follows": "Sjå fleire fylgjer på {domain}", "hints.profiles.see_more_posts": "Sjå fleire innlegg på {domain}", - "hints.threads.replies_may_be_missing": "Svar frå andre tenarar manglar kanskje.", - "hints.threads.see_more": "Sjå fleire svar på {domain}", "home.column_settings.show_quotes": "Vis sitat", "home.column_settings.show_reblogs": "Vis framhevingar", "home.column_settings.show_replies": "Vis svar", diff --git a/app/javascript/mastodon/locales/no.json b/app/javascript/mastodon/locales/no.json index ca7c43e1e9..8ef9b6a481 100644 --- a/app/javascript/mastodon/locales/no.json +++ b/app/javascript/mastodon/locales/no.json @@ -417,8 +417,6 @@ "hints.profiles.see_more_followers": "Se flere følgere på {domain}", "hints.profiles.see_more_follows": "Se flere som følger på {domain}", "hints.profiles.see_more_posts": "Se flere innlegg på {domain}", - "hints.threads.replies_may_be_missing": "Svar fra andre servere mangler kanskje.", - "hints.threads.see_more": "Se flere svar på {domain}", "home.column_settings.show_quotes": "Vis sitater", "home.column_settings.show_reblogs": "Vis fremhevinger", "home.column_settings.show_replies": "Vis svar", diff --git a/app/javascript/mastodon/locales/pa.json b/app/javascript/mastodon/locales/pa.json index 5236d246c0..50756eebbf 100644 --- a/app/javascript/mastodon/locales/pa.json +++ b/app/javascript/mastodon/locales/pa.json @@ -276,7 +276,6 @@ "hints.profiles.see_more_followers": "{domain} ਉੱਤੇ ਹੋਰ ਫ਼ਾਲੋਅਰ ਵੇਖੋ", "hints.profiles.see_more_follows": "{domain} ਉੱਤੇ ਹੋਰ ਫ਼ਾਲੋ ਨੂੰ ਵੇਖੋ", "hints.profiles.see_more_posts": "{domain} ਉੱਤੇ ਹੋਰ ਪੋਸਟਾਂ ਨੂੰ ਵੇਖੋ", - "hints.threads.see_more": "{domain} ਤੋਂ ਹੋਰ ਜਵਾਬਾਂ ਨੂੰ ਵੇਖੋ", "home.column_settings.show_reblogs": "ਬੂਸਟਾਂ ਨੂੰ ਵੇਖੋ", "home.column_settings.show_replies": "ਜਵਾਬਾਂ ਨੂੰ ਵੇਖੋ", "home.hide_announcements": "ਐਲਾਨਾਂ ਨੂੰ ਓਹਲੇ ਕਰੋ", diff --git a/app/javascript/mastodon/locales/pl.json b/app/javascript/mastodon/locales/pl.json index 1967a2333c..bbe5789d2a 100644 --- a/app/javascript/mastodon/locales/pl.json +++ b/app/javascript/mastodon/locales/pl.json @@ -383,8 +383,6 @@ "hints.profiles.see_more_followers": "Zobacz więcej obserwujących na {domain}", "hints.profiles.see_more_follows": "Zobacz więcej obserwowanych na {domain}", "hints.profiles.see_more_posts": "Zobacz więcej wpisów na {domain}", - "hints.threads.replies_may_be_missing": "Komentarze z innych serwerów mogą być niewidoczne.", - "hints.threads.see_more": "Zobacz więcej komentarzy na {domain}", "home.column_settings.show_reblogs": "Pokazuj podbicia", "home.column_settings.show_replies": "Pokazuj odpowiedzi", "home.hide_announcements": "Ukryj ogłoszenia", diff --git a/app/javascript/mastodon/locales/pt-BR.json b/app/javascript/mastodon/locales/pt-BR.json index b437786b9b..f576270193 100644 --- a/app/javascript/mastodon/locales/pt-BR.json +++ b/app/javascript/mastodon/locales/pt-BR.json @@ -414,8 +414,6 @@ "hints.profiles.see_more_followers": "Ver mais seguidores no {domain}", "hints.profiles.see_more_follows": "Ver mais seguidores no {domain}", "hints.profiles.see_more_posts": "Ver mais publicações em {domain}", - "hints.threads.replies_may_be_missing": "Respostas de outros servidores podem estar faltando.", - "hints.threads.see_more": "Ver mais respostas no {domain}", "home.column_settings.show_reblogs": "Mostrar boosts", "home.column_settings.show_replies": "Mostrar respostas", "home.hide_announcements": "Ocultar comunicados", diff --git a/app/javascript/mastodon/locales/pt-PT.json b/app/javascript/mastodon/locales/pt-PT.json index 424e48ef2e..15ccc7cb32 100644 --- a/app/javascript/mastodon/locales/pt-PT.json +++ b/app/javascript/mastodon/locales/pt-PT.json @@ -424,8 +424,6 @@ "hints.profiles.see_more_followers": "Ver mais seguidores em {domain}", "hints.profiles.see_more_follows": "Ver mais perfis seguidos em {domain}", "hints.profiles.see_more_posts": "Ver mais publicações em {domain}", - "hints.threads.replies_may_be_missing": "É possível que não estejam a ser mostradas todas as respostas de outros servidores.", - "hints.threads.see_more": "Ver mais respostas em {domain}", "home.column_settings.show_quotes": "Mostrar citações", "home.column_settings.show_reblogs": "Mostrar impulsos", "home.column_settings.show_replies": "Mostrar respostas", diff --git a/app/javascript/mastodon/locales/ru.json b/app/javascript/mastodon/locales/ru.json index e2022b52d9..40d8341713 100644 --- a/app/javascript/mastodon/locales/ru.json +++ b/app/javascript/mastodon/locales/ru.json @@ -45,7 +45,7 @@ "account.followers_counter": "{count, plural, one {{counter} подписчик} few {{counter} подписчика} other {{counter} подписчиков}}", "account.followers_you_know_counter": "{count, plural, one {{counter} ваш знакомый} other {{counter} ваших знакомых}}", "account.following": "Подписки", - "account.following_counter": "{count, plural, one {# подписка} many {# подписок} other {# подписки}}", + "account.following_counter": "{count, plural, one {{counter} подписка} few {{counter} подписки} many {{counter} подписок} other {{counter} подписок}}", "account.follows.empty": "Этот пользователь пока ни на кого не подписался.", "account.follows_you": "Подписан(а) на вас", "account.go_to_profile": "Перейти к профилю", @@ -273,7 +273,7 @@ "domain_block_modal.they_cant_follow": "Пользователи с этого сервера не смогут подписаться на вас.", "domain_block_modal.they_wont_know": "Пользователи с этого сервера не будут знать, что вы их блокируете.", "domain_block_modal.title": "Заблокировать домен?", - "domain_block_modal.you_will_lose_num_followers": "Вы потеряете {followersCount, plural, one {{followersCountDisplay} подписчика} few {{followersCountDisplay} подписчика} other {{followersCountDisplay} подписчиков}} и {followingCount, plural, one {{followingCountDisplay} подписку} few {{followingCountDisplay} подписки} other {{followingCountDisplay} подписок}}.", + "domain_block_modal.you_will_lose_num_followers": "Вы потеряете {followersCount, plural, one {{followersCountDisplay} подписчика} few {{followersCountDisplay} подписчиков} other {{followersCountDisplay} подписчиков}} и {followingCount, plural, one {{followingCountDisplay} подписку} few {{followingCountDisplay} подписки} other {{followingCountDisplay} подписок}}.", "domain_block_modal.you_will_lose_relationships": "Вы потеряете все подписки и всех подписчиков с этого сервера.", "domain_block_modal.you_wont_see_posts": "Вы не будете видеть посты и уведомления от пользователей с этого сервера.", "domain_pill.activitypub_lets_connect": "Благодаря ему вы можете связываться и взаимодействовать не только с пользователями Mastodon, но и с пользователями других платформ.", @@ -424,8 +424,6 @@ "hints.profiles.see_more_followers": "Перейдите на {domain}, чтобы увидеть всех подписчиков", "hints.profiles.see_more_follows": "Перейдите на {domain}, чтобы увидеть все подписки", "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": "Показывать ответы", diff --git a/app/javascript/mastodon/locales/sc.json b/app/javascript/mastodon/locales/sc.json index d893bc2a0d..fb856ba8a1 100644 --- a/app/javascript/mastodon/locales/sc.json +++ b/app/javascript/mastodon/locales/sc.json @@ -313,8 +313,6 @@ "hashtags.and_other": "… e {count, plural, one {un'àteru} other {àteros #}}", "hints.profiles.posts_may_be_missing": "Podet èssere chi ammanchent tzertas publicatziones de custu profilu.", "hints.profiles.see_more_posts": "Bide prus publicatziones a {domain}", - "hints.threads.replies_may_be_missing": "Podet èssere chi ammanchent rispostas dae àteros serbidores.", - "hints.threads.see_more": "Bide prus rispostas a {domain}", "home.column_settings.show_reblogs": "Ammustra is cumpartziduras", "home.column_settings.show_replies": "Ammustra rispostas", "home.hide_announcements": "Cua annùntzios", diff --git a/app/javascript/mastodon/locales/si.json b/app/javascript/mastodon/locales/si.json index 9f9bd1590f..438ca0b735 100644 --- a/app/javascript/mastodon/locales/si.json +++ b/app/javascript/mastodon/locales/si.json @@ -406,8 +406,6 @@ "hints.profiles.see_more_followers": "{domain}හි තවත් අනුගාමිකයින් බලන්න", "hints.profiles.see_more_follows": "{domain}හි තවත් පහත ඒවා බලන්න.", "hints.profiles.see_more_posts": "{domain}හි තවත් සටහන් බලන්න", - "hints.threads.replies_may_be_missing": "අනෙකුත් සේවාදායකයන්ගෙන් ලැබෙන පිළිතුරු අස්ථානගත වී තිබිය හැක.", - "hints.threads.see_more": "{domain}හි තවත් පිළිතුරු බලන්න.", "home.column_settings.show_reblogs": "බූස්ට් පෙන්වන්න", "home.column_settings.show_replies": "පිළිතුරු පෙන්වන්න", "home.hide_announcements": "නිවේදන සඟවන්න", diff --git a/app/javascript/mastodon/locales/sk.json b/app/javascript/mastodon/locales/sk.json index 63fd556f79..091ddf8ca2 100644 --- a/app/javascript/mastodon/locales/sk.json +++ b/app/javascript/mastodon/locales/sk.json @@ -365,8 +365,6 @@ "hints.profiles.see_more_followers": "Pozri viac nasledovateľov na {domain}", "hints.profiles.see_more_follows": "Pozri viac nasledovateľov na {domain}", "hints.profiles.see_more_posts": "Pozri viac príspevkov na {domain}", - "hints.threads.replies_may_be_missing": "Odpovede z ostatných serverov môžu chýbať.", - "hints.threads.see_more": "Pozri viac odpovedí na {domain}", "home.column_settings.show_reblogs": "Zobraziť zdieľania", "home.column_settings.show_replies": "Zobraziť odpovede", "home.hide_announcements": "Skryť oznámenia", diff --git a/app/javascript/mastodon/locales/sl.json b/app/javascript/mastodon/locales/sl.json index 7213af3666..c256318fee 100644 --- a/app/javascript/mastodon/locales/sl.json +++ b/app/javascript/mastodon/locales/sl.json @@ -383,8 +383,6 @@ "hints.profiles.see_more_followers": "Pokaži več sledilcev na {domain}", "hints.profiles.see_more_follows": "Pokaži več sledenih ljudi na zbirališču {domain}", "hints.profiles.see_more_posts": "Pokaži več objav na {domain}", - "hints.threads.replies_may_be_missing": "Odgovori z drugih strežnikov morda manjkajo.", - "hints.threads.see_more": "Pokaži več odgovorov na {domain}", "home.column_settings.show_reblogs": "Pokaži izpostavitve", "home.column_settings.show_replies": "Pokaži odgovore", "home.hide_announcements": "Skrij obvestila", diff --git a/app/javascript/mastodon/locales/sq.json b/app/javascript/mastodon/locales/sq.json index b5a7cb0e88..75c0068160 100644 --- a/app/javascript/mastodon/locales/sq.json +++ b/app/javascript/mastodon/locales/sq.json @@ -419,8 +419,6 @@ "hints.profiles.see_more_followers": "Shihni më tepër ndjekës në {domain}", "hints.profiles.see_more_follows": "Shihni më tepër ndjekje në {domain}", "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", diff --git a/app/javascript/mastodon/locales/sv.json b/app/javascript/mastodon/locales/sv.json index 0808963e5f..48f15b28b8 100644 --- a/app/javascript/mastodon/locales/sv.json +++ b/app/javascript/mastodon/locales/sv.json @@ -424,8 +424,6 @@ "hints.profiles.see_more_followers": "Se fler följare på {domain}", "hints.profiles.see_more_follows": "Se fler följare på {domain}", "hints.profiles.see_more_posts": "Se fler inlägg på {domain}", - "hints.threads.replies_may_be_missing": "Det kan saknas svar från andra servrar.", - "hints.threads.see_more": "Se fler svar på {domain}", "home.column_settings.show_quotes": "Visa citat", "home.column_settings.show_reblogs": "Visa boostar", "home.column_settings.show_replies": "Visa svar", diff --git a/app/javascript/mastodon/locales/th.json b/app/javascript/mastodon/locales/th.json index 603c1ab61f..03faba8a66 100644 --- a/app/javascript/mastodon/locales/th.json +++ b/app/javascript/mastodon/locales/th.json @@ -397,8 +397,6 @@ "hints.profiles.see_more_followers": "ดูผู้ติดตามเพิ่มเติมใน {domain}", "hints.profiles.see_more_follows": "ดูการติดตามเพิ่มเติมใน {domain}", "hints.profiles.see_more_posts": "ดูโพสต์เพิ่มเติมใน {domain}", - "hints.threads.replies_may_be_missing": "การตอบกลับจากเซิร์ฟเวอร์อื่น ๆ อาจขาดหายไป", - "hints.threads.see_more": "ดูการตอบกลับเพิ่มเติมใน {domain}", "home.column_settings.show_reblogs": "แสดงการดัน", "home.column_settings.show_replies": "แสดงการตอบกลับ", "home.hide_announcements": "ซ่อนประกาศ", diff --git a/app/javascript/mastodon/locales/tok.json b/app/javascript/mastodon/locales/tok.json index c48ffa5fe2..cabee09314 100644 --- a/app/javascript/mastodon/locales/tok.json +++ b/app/javascript/mastodon/locales/tok.json @@ -371,8 +371,6 @@ "hints.profiles.see_more_followers": "o lukin e jan ni lon ma {domain}: ona li kute e jan ni.", "hints.profiles.see_more_follows": "o lukin e jan ni lon ma {domain}: jan ni li kute e ona.", "hints.profiles.see_more_posts": "o lukin e toki ante lon ma {domain}", - "hints.threads.replies_may_be_missing": "toki pi ma ante li weka lon ken.", - "hints.threads.see_more": "o lukin e toki ante lon ma {domain}", "home.column_settings.show_reblogs": "o lukin e pana toki", "home.hide_announcements": "o lukin ala e toki lawa suli", "home.pending_critical_update.body": "o sin e ilo Mastodon lon tenpo lili a!", diff --git a/app/javascript/mastodon/locales/tr.json b/app/javascript/mastodon/locales/tr.json index a45acff11f..c50ac3cbaa 100644 --- a/app/javascript/mastodon/locales/tr.json +++ b/app/javascript/mastodon/locales/tr.json @@ -424,8 +424,6 @@ "hints.profiles.see_more_followers": "{domain} adresinde daha fazla takipçi gör", "hints.profiles.see_more_follows": "{domain} adresinde daha fazla takip edilen gör", "hints.profiles.see_more_posts": "{domain} adresinde daha fazla gönderi gör", - "hints.threads.replies_may_be_missing": "Diğer sunuculardan yanıtlar eksik olabilir.", - "hints.threads.see_more": "{domain} adresinde daha fazla yanıt gör", "home.column_settings.show_quotes": "Alıntıları göster", "home.column_settings.show_reblogs": "Yeniden paylaşımları göster", "home.column_settings.show_replies": "Yanıtları göster", diff --git a/app/javascript/mastodon/locales/uk.json b/app/javascript/mastodon/locales/uk.json index 56ff3444f4..e956bd05e7 100644 --- a/app/javascript/mastodon/locales/uk.json +++ b/app/javascript/mastodon/locales/uk.json @@ -395,8 +395,6 @@ "hints.profiles.see_more_followers": "Переглянути більше підписників на {domain}", "hints.profiles.see_more_follows": "Переглянути більше підписок на {domain}", "hints.profiles.see_more_posts": "Переглянути більше дописів на {domain}", - "hints.threads.replies_may_be_missing": "Відповіді з інших серверів можуть бути не показані.", - "hints.threads.see_more": "Переглянути більше відповідей на {domain}", "home.column_settings.show_reblogs": "Показувати поширення", "home.column_settings.show_replies": "Показувати відповіді", "home.hide_announcements": "Приховати оголошення", diff --git a/app/javascript/mastodon/locales/vi.json b/app/javascript/mastodon/locales/vi.json index ec6e7188f2..b5c8c3ec23 100644 --- a/app/javascript/mastodon/locales/vi.json +++ b/app/javascript/mastodon/locales/vi.json @@ -424,8 +424,6 @@ "hints.profiles.see_more_followers": "Xem thêm người theo dõi ở {domain}", "hints.profiles.see_more_follows": "Xem thêm người mà người này theo dõi ở {domain}", "hints.profiles.see_more_posts": "Xem thêm tút ở {domain}", - "hints.threads.replies_may_be_missing": "Những trả lời từ máy chủ khác có thể không đầy đủ.", - "hints.threads.see_more": "Xem thêm ở {domain}", "home.column_settings.show_quotes": "Hiện những trích dẫn", "home.column_settings.show_reblogs": "Hiện những lượt đăng lại", "home.column_settings.show_replies": "Hiện những tút dạng trả lời", @@ -847,6 +845,8 @@ "status.bookmark": "Lưu", "status.cancel_reblog_private": "Bỏ đăng lại", "status.cannot_reblog": "Không thể đăng lại tút này", + "status.context.load_new_replies": "Có những trả lời mới", + "status.context.loading": "Kiểm tra nhiều trả lời hơn", "status.continued_thread": "Tiếp tục chủ đề", "status.copy": "Sao chép URL", "status.delete": "Xóa", diff --git a/app/javascript/mastodon/locales/zh-CN.json b/app/javascript/mastodon/locales/zh-CN.json index 8928f253b1..c6e0aa7f27 100644 --- a/app/javascript/mastodon/locales/zh-CN.json +++ b/app/javascript/mastodon/locales/zh-CN.json @@ -412,8 +412,6 @@ "hints.profiles.see_more_followers": "在 {domain} 查看更多关注者", "hints.profiles.see_more_follows": "在 {domain} 查看更多关注", "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": "显示回复", diff --git a/app/javascript/mastodon/locales/zh-TW.json b/app/javascript/mastodon/locales/zh-TW.json index 8fe9f71a69..40eed25a49 100644 --- a/app/javascript/mastodon/locales/zh-TW.json +++ b/app/javascript/mastodon/locales/zh-TW.json @@ -424,8 +424,6 @@ "hints.profiles.see_more_followers": "於 {domain} 檢視更多跟隨者", "hints.profiles.see_more_follows": "於 {domain} 檢視更多正在跟隨", "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": "顯示回覆", @@ -847,6 +845,8 @@ "status.bookmark": "書籤", "status.cancel_reblog_private": "取消轉嘟", "status.cannot_reblog": "這則嘟文無法被轉嘟", + "status.context.load_new_replies": "有新回嘟", + "status.context.loading": "正在檢查更多回嘟", "status.continued_thread": "接續討論串", "status.copy": "複製嘟文連結", "status.delete": "刪除", diff --git a/app/javascript/mastodon/main.tsx b/app/javascript/mastodon/main.tsx index e840429c41..dcc71bdb84 100644 --- a/app/javascript/mastodon/main.tsx +++ b/app/javascript/mastodon/main.tsx @@ -4,12 +4,16 @@ import { Globals } from '@react-spring/web'; import { setupBrowserNotifications } from 'mastodon/actions/notifications'; import Mastodon from 'mastodon/containers/mastodon'; -import { isFeatureEnabled, me, reduceMotion } from 'mastodon/initial_state'; +import { me, reduceMotion } from 'mastodon/initial_state'; import * as perf from 'mastodon/performance'; import ready from 'mastodon/ready'; import { store } from 'mastodon/store'; -import { isProduction, isDevelopment } from './utils/environment'; +import { + isProduction, + isDevelopment, + isModernEmojiEnabled, +} from './utils/environment'; function main() { perf.start('main()'); @@ -29,7 +33,7 @@ function main() { }); } - if (isFeatureEnabled('modern_emojis')) { + if (isModernEmojiEnabled()) { const { initializeEmoji } = await import('@/mastodon/features/emoji'); await initializeEmoji(); } diff --git a/app/javascript/mastodon/utils/environment.ts b/app/javascript/mastodon/utils/environment.ts index 5ccd4d27e3..457da5c736 100644 --- a/app/javascript/mastodon/utils/environment.ts +++ b/app/javascript/mastodon/utils/environment.ts @@ -1,3 +1,5 @@ +import initialState from '../initial_state'; + export function isDevelopment() { if (typeof process !== 'undefined') return process.env.NODE_ENV === 'development'; @@ -9,3 +11,13 @@ export function isProduction() { return process.env.NODE_ENV === 'production'; else return import.meta.env.PROD; } + +export type Features = 'modern_emojis'; + +export function isFeatureEnabled(feature: Features) { + return initialState?.features.includes(feature) ?? false; +} + +export function isModernEmojiEnabled() { + return isFeatureEnabled('modern_emojis') && isDevelopment(); +} diff --git a/app/javascript/mastodon/utils/workers.ts b/app/javascript/mastodon/utils/workers.ts new file mode 100644 index 0000000000..02dd66d86e --- /dev/null +++ b/app/javascript/mastodon/utils/workers.ts @@ -0,0 +1,29 @@ +/** + * Loads Web Worker that is compatible with cross-origin scripts for CDNs. + * + * Returns null if the environment doesn't support web workers. + */ +export function loadWorker(url: string | URL, options: WorkerOptions = {}) { + if (!('Worker' in window)) { + return null; + } + + try { + // Check if the script origin and the window origin are the same. + const scriptUrl = new URL(import.meta.url); + if (location.origin === scriptUrl.origin) { + // Not cross-origin, can just load normally. + return new Worker(url, options); + } + } catch (err) { + // In case the URL parsing fails. + console.warn('Error instantiating Worker:', err); + } + + // Import the worker script from a same-origin Blob. + const contents = `import ${JSON.stringify(url)};`; + const blob = URL.createObjectURL( + new Blob([contents], { type: 'text/javascript' }), + ); + return new Worker(blob, options); +} diff --git a/app/models/trends/statuses.rb b/app/models/trends/statuses.rb index 680bae8b28..0fe95f63f4 100644 --- a/app/models/trends/statuses.rb +++ b/app/models/trends/statuses.rb @@ -90,14 +90,28 @@ class Trends::Statuses < Trends::Base def eligible?(status) status.created_at.past? && - status.public_visibility? && - status.account.discoverable? && - !status.account.silenced? && - !status.account.sensitized? && - (status.spoiler_text.blank? || Setting.trending_status_cw) && - !status.sensitive? && + opted_into_trends?(status) && + !sensitive_content?(status) && !status.reply? && - valid_locale?(status.language) + valid_locale?(status.language) && + (status.quote.nil? || trendable_quote?(status.quote)) + end + + def opted_into_trends?(status) + status.public_visibility? && + status.account.discoverable? && + !status.account.silenced? + end + + def sensitive_content?(status) + status.account.sensitized? || (status.spoiler_text.present? && !Setting.trending_status_cw) || status.sensitive? + end + + def trendable_quote?(quote) + quote.acceptable? && + quote.quoted_status.present? && + opted_into_trends?(quote.quoted_status) && + !sensitive_content?(quote.quoted_status) end def calculate_scores(statuses, at_time) diff --git a/app/views/settings/preferences/other/show.html.haml b/app/views/settings/preferences/other/show.html.haml index 65abe9090b..b26b6251f1 100644 --- a/app/views/settings/preferences/other/show.html.haml +++ b/app/views/settings/preferences/other/show.html.haml @@ -21,6 +21,7 @@ .fields-group.fields-row__column.fields-row__column-6 = ff.input :default_privacy, collection: Status.selectable_visibilities, + selected: current_user.setting_default_privacy, hint: false, include_blank: false, label_method: ->(visibility) { safe_join([I18n.t("statuses.visibilities.#{visibility}"), I18n.t("statuses.visibilities.#{visibility}_long")], ' - ') }, diff --git a/config/environments/development.rb b/config/environments/development.rb index ca9e876e26..79b491869c 100644 --- a/config/environments/development.rb +++ b/config/environments/development.rb @@ -19,6 +19,9 @@ Rails.application.configure do # Enable server timing. config.server_timing = true + # Enable serving of images, stylesheets, and JavaScripts from an asset server. + config.asset_host = ENV['CDN_HOST'] if ENV['CDN_HOST'].present? + # Enable/disable caching. By default caching is disabled. # Run rails dev:cache to toggle caching. if Rails.root.join('tmp', 'caching-dev.txt').exist? diff --git a/config/locales/ru.yml b/config/locales/ru.yml index 971846789b..f961e0fba4 100644 --- a/config/locales/ru.yml +++ b/config/locales/ru.yml @@ -1477,56 +1477,56 @@ ru: other: Проверьте введённые вами данные! Далее по странице вы можете увидеть %{count} сообщений об ошибке imports: errors: - empty: Пустой CSV-файл - incompatible_type: Несовместимость с выбранным типом импорта - invalid_csv_file: 'Неверный файл CSV. Ошибка: %{error}' + empty: Файл CSV пуст + incompatible_type: Несовместим с выбранным типом данных для импорта + invalid_csv_file: 'Ошибка при чтении файла CSV: %{error}' over_rows_processing_limit: содержит более %{count} строк too_large: Файл слишком большой failures: Ошибки - imported: Импортирован - mismatched_types_warning: Возможно, вы выбрали неверный тип для этого импорта, пожалуйста, перепроверьте. + imported: Импортировано + mismatched_types_warning: По-видимому, вы выбрали неверный тип данных для импорта. Проверьте всё внимательно! modes: merge: Объединить - merge_long: Сохранить имеющиеся данные и добавить новые. - overwrite: Перезаписать - overwrite_long: Перезаписать имеющиеся данные новыми. + merge_long: Добавить новые данные к уже имеющимся + overwrite: Заменить + overwrite_long: Заменить имеющиеся данные новыми overwrite_preambles: blocking_html: - few: Вы собираетесь заменить свой список блокировки, в котором сейчас %{count} аккаунта, из файла %{filename}. - many: Вы собираетесь заменить свой список блокировки, в котором сейчас %{count} аккаунов, из файла %{filename}. - one: Вы собираетесь заменить свой список блокировки, в котором сейчас %{count} аккаунт, из файла %{filename}. - other: Вы собираетесь заменить свой список блокировки, в котором сейчас %{count} аккаунтов, из файла %{filename}. + few: Вы собираетесь заменить свой список заблокированных пользователей данными из файла %{filename}, после чего вы будете блокировать %{count} пользователей. + many: Вы собираетесь заменить свой список заблокированных пользователей данными из файла %{filename}, после чего вы будете блокировать %{count} пользователей. + one: Вы собираетесь заменить свой список заблокированных пользователей данными из файла %{filename}, после чего вы будете блокировать %{count} пользователя. + other: Вы собираетесь заменить свой список заблокированных пользователей данными из файла %{filename}, после чего вы будете блокировать %{count} пользователей. bookmarks_html: - few: Вы собираетесь заменить свои закладки, в которых сейчас %{count} поста, из файла %{filename}. - many: Вы собираетесь заменить свои закладки, в которых сейчас %{count} постов, из файла %{filename}. - one: Вы собираетесь заменить свои закладки, в которых сейчас %{count} пост, из файла %{filename}. - other: Вы собираетесь заменить свои закладки, в которых сейчас %{count} постов, из файла %{filename}. + few: Вы собираетесь заменить свои закладки данными из файла %{filename}, после чего у вас в закладках будет %{count} поста. + many: Вы собираетесь заменить свои закладки данными из файла %{filename}, после чего у вас в закладках будет %{count} постов. + one: Вы собираетесь заменить свои закладки данными из файла %{filename}, после чего у вас в закладках будет %{count} пост. + other: Вы собираетесь заменить свои закладки данными из файла %{filename}, после чего у вас в закладках будет %{count} постов. domain_blocking_html: - few: Вы собираетесь заменить свой список доменных блокировок, в котором сейчас %{count} домена, из файла %{filename}. - many: Вы собираетесь заменить свой список доменных блокировок, в котором сейчас %{count} доменов, из файла %{filename}. - one: Вы собираетесь заменить свой список доменных блокировок, в котором сейчас %{count} домен, из файла %{filename}. - other: Вы собираетесь заменить свой список доменных блокировок, в котором сейчас %{count} доменов, из файла %{filename}. + few: Вы собираетесь заменить свой список заблокированных доменов данными из файла %{filename}, после чего вы будете блокировать %{count} домена. + many: Вы собираетесь заменить свой список заблокированных доменов данными из файла %{filename}, после чего вы будете блокировать %{count} доменов. + one: Вы собираетесь заменить свой список заблокированных доменов данными из файла %{filename}, после чего вы будете блокировать %{count} домен. + other: Вы собираетесь заменить свой список заблокированных доменов данными из файла %{filename}, после чего вы будете блокировать %{count} доменов. following_html: - few: Вы собираетесь подписаться на %{count} аккаунта из файла %{filename} и отписаться от всех прочих. - many: Вы собираетесь подписаться на %{count} аккаунтов из файла %{filename} и отписаться от всех прочих. - one: Вы собираетесь подписаться на %{count} аккаунт из файла %{filename} и отписаться от всех прочих. - other: Вы собираетесь подписаться на %{count} аккаунтов из файла %{filename} и отписаться от всех прочих. + few: Вы собираетесь подписаться на %{count} пользователей из файла %{filename} и отписаться от всех прочих. + many: Вы собираетесь подписаться на %{count} пользователей из файла %{filename} и отписаться от всех прочих. + one: Вы собираетесь подписаться на %{count} пользователя из файла %{filename} и отписаться от всех прочих. + other: Вы собираетесь подписаться на %{count} пользователей из файла %{filename} и отписаться от всех прочих. lists_html: - few: Вы собираетесь заменить свои списки содержимым файла %{filename}. В новые списки будут добавлены %{count} аккаунта. - many: Вы собираетесь заменить свои списки содержимым файла %{filename}. В новые списки будут добавлены %{count} аккаунтов. - one: Вы собираетесь заменить свои списки содержимым файла %{filename}. В новые списки будет добавлен %{count} аккаунт. - other: Вы собираетесь заменить свои списки содержимым файла %{filename}. В новые списки будут добавлены %{count} аккаунтов. + few: Вы собираетесь заменить свои списки содержимым файла %{filename}. В новые списки будут добавлены %{count} пользователя. + many: Вы собираетесь заменить свои списки содержимым файла %{filename}. В новые списки будут добавлены %{count} пользователей. + one: Вы собираетесь заменить свои списки содержимым файла %{filename}. В новые списки будет добавлен %{count} пользователь. + other: Вы собираетесь заменить свои списки содержимым файла %{filename}. В новые списки будут добавлены %{count} пользователей. muting_html: - few: Вы собираетесь заменить свой список игнорируемых пользователей списком из %{count} аккаунтов из файла %{filename}. - many: Вы собираетесь заменить свой список игнорируемых пользователей списком из %{count} аккаунтов из файла %{filename}. - one: Вы собираетесь заменить свой список игнорируемых пользователей списком из %{count} аккаунта из файла %{filename}. - other: Вы собираетесь заменить свой список игнорируемых пользователей списком из %{count} аккаунтов из файла %{filename}. + few: Вы собираетесь заменить свой список игнорируемых пользователей данными из файла %{filename}, после чего вы будете игнорировать %{count} пользователей. + many: Вы собираетесь заменить свой список игнорируемых пользователей данными из файла %{filename}, после чего вы будете игнорировать %{count} пользователей. + one: Вы собираетесь заменить свой список игнорируемых пользователей данными из файла %{filename}, после чего вы будете игнорировать %{count} пользователя. + other: Вы собираетесь заменить свой список игнорируемых пользователей данными из файла %{filename}, после чего вы будете игнорировать %{count} пользователей. preambles: blocking_html: - few: Вы собираетесь заблокировать %{count} аккаунта из файла %{filename}. - many: Вы собираетесь заблокировать %{count} аккаунтов из файла %{filename}. - one: Вы собираетесь заблокировать %{count} аккаунт из файла %{filename}. - other: Вы собираетесь заблокировать %{count} аккаунтов из файла %{filename}. + few: Вы собираетесь заблокировать %{count} пользователей из файла %{filename}. + many: Вы собираетесь заблокировать %{count} пользователей из файла %{filename}. + one: Вы собираетесь заблокировать %{count} пользователя из файла %{filename}. + other: Вы собираетесь заблокировать %{count} пользователей из файла %{filename}. bookmarks_html: few: Вы собираетесь добавить %{count} поста из файла %{filename} в свои закладки. many: Вы собираетесь добавить %{count} постов из файла %{filename} в свои закладки. @@ -1538,20 +1538,20 @@ ru: one: Вы собираетесь заблокировать %{count} домен из файла %{filename}. other: Вы собираетесь заблокировать %{count} доменов из файла %{filename}. following_html: - few: Вы собираетесь подписаться на %{count} аккаунта из файла %{filename}. - many: Вы собираетесь подписаться на %{count} аккаунтов из файла %{filename}. - one: Вы собираетесь подписаться на %{count} аккаунт из файла %{filename}. - other: Вы собираетесь подписаться на %{count} аккаунтов из файла %{filename}. + few: Вы собираетесь подписаться на %{count} пользователей из файла %{filename}. + many: Вы собираетесь подписаться на %{count} пользователей из файла %{filename}. + one: Вы собираетесь подписаться на %{count} пользователя из файла %{filename}. + other: Вы собираетесь подписаться на %{count} пользователей из файла %{filename}. lists_html: - few: Вы собираетесь добавить %{count} аккаунта из файла %{filename} в свои списки. Если соответствующих списков нет, они будут созданы. - many: Вы собираетесь добавить %{count} аккаунтов из файла %{filename} в свои списки. Если соответствующих списков нет, они будут созданы. - one: Вы собираетесь добавить %{count} аккаунт из файла %{filename} в свои списки. Если соответствующих списков нет, они будут созданы. - other: Вы собираетесь добавить %{count} аккаунтов из файла %{filename} в свои списки. Если соответствующих списков нет, они будут созданы. + few: Вы собираетесь добавить %{count} пользователей из файла %{filename} в свои списки. Если соответствующих списков нет, они будут созданы. + many: Вы собираетесь добавить %{count} пользователей из файла %{filename} в свои списки. Если соответствующих списков нет, они будут созданы. + one: Вы собираетесь добавить %{count} пользователя из файла %{filename} в свои списки. Если соответствующих списков нет, они будут созданы. + other: Вы собираетесь добавить %{count} пользователей из файла %{filename} в свои списки. Если соответствующих списков нет, они будут созданы. muting_html: - few: Вы собираетесь начать игнорировать %{count} аккаунта из файла %{filename}. - many: Вы собираетесь начать игнорировать %{count} аккаунтов из файла %{filename}. - one: Вы собираетесь начать игнорировать %{count} аккаунт из файла %{filename}. - other: Вы собираетесь начать игнорировать %{count} аккаунтов из файла %{filename}. + few: Вы собираетесь игнорировать %{count} пользователей из файла %{filename}. + many: Вы собираетесь игнорировать %{count} пользователей из файла %{filename}. + one: Вы собираетесь игнорировать %{count} пользователя из файла %{filename}. + other: Вы собираетесь игнорировать %{count} пользователей из файла %{filename}. preface: Вы можете загрузить некоторые данные, например, списки людей, на которых Вы подписаны или которых блокируете, в Вашу учётную запись на этом узле из файлов, экспортированных с другого узла. recent_imports: Недавно импортированное states: @@ -1563,23 +1563,23 @@ ru: success: Ваши данные были успешно загружены и будут обработаны с должной скоростью time_started: Началось в titles: - blocking: Импорт заблокированных аккаунтов + blocking: Импорт списка заблокированных пользователей bookmarks: Импорт закладок - domain_blocking: Импорт заблокированных доменов - following: Импорт последующих аккаунтов - lists: Импортировать список - muting: Импорт отключенных аккаунтов + domain_blocking: Импорт списка заблокированных доменов + following: Импорт подписок + lists: Импорт списков + muting: Импорт списка игнорируемых пользователей type: Тип импорта type_groups: constructive: Подписки и закладки destructive: Блокировки и игнорируемые types: - blocking: Список блокировки + blocking: Заблокированные пользователи bookmarks: Закладки - domain_blocking: Список доменных блокировок + domain_blocking: Заблокированные домены following: Подписки lists: Списки - muting: Список глушения + muting: Игнорируемые пользователи upload: Загрузить invites: delete: Удалить diff --git a/docker-compose.yml b/docker-compose.yml index fb84eb96a1..7aa1b1c951 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -59,7 +59,7 @@ services: web: # You can uncomment the following line if you want to not use the prebuilt image, for example if you have local code changes # build: . - image: ghcr.io/glitch-soc/mastodon:v4.4.1 + image: ghcr.io/glitch-soc/mastodon:v4.4.2 restart: always env_file: .env.production command: bundle exec puma -C config/puma.rb @@ -83,7 +83,7 @@ services: # build: # dockerfile: ./streaming/Dockerfile # context: . - image: ghcr.io/glitch-soc/mastodon-streaming:v4.4.1 + image: ghcr.io/glitch-soc/mastodon-streaming:v4.4.2 restart: always env_file: .env.production command: node ./streaming/index.js @@ -102,7 +102,7 @@ services: sidekiq: # You can uncomment the following line if you want to not use the prebuilt image, for example if you have local code changes # build: . - image: ghcr.io/glitch-soc/mastodon:v4.4.1 + image: ghcr.io/glitch-soc/mastodon:v4.4.2 restart: always env_file: .env.production command: bundle exec sidekiq diff --git a/spec/controllers/api/web/push_subscriptions_controller_spec.rb b/spec/controllers/api/web/push_subscriptions_controller_spec.rb deleted file mode 100644 index 1e01709262..0000000000 --- a/spec/controllers/api/web/push_subscriptions_controller_spec.rb +++ /dev/null @@ -1,124 +0,0 @@ -# frozen_string_literal: true - -require 'rails_helper' - -RSpec.describe Api::Web::PushSubscriptionsController do - render_views - - let(:user) { Fabricate(:user) } - - let(:create_payload) do - { - subscription: { - endpoint: 'https://fcm.googleapis.com/fcm/send/fiuH06a27qE:APA91bHnSiGcLwdaxdyqVXNDR9w1NlztsHb6lyt5WDKOC_Z_Q8BlFxQoR8tWFSXUIDdkyw0EdvxTu63iqamSaqVSevW5LfoFwojws8XYDXv_NRRLH6vo2CdgiN4jgHv5VLt2A8ah6lUX', - keys: { - p256dh: 'BEm_a0bdPDhf0SOsrnB2-ategf1hHoCnpXgQsFj5JCkcoMrMt2WHoPfEYOYPzOIs9mZE8ZUaD7VA5vouy0kEkr8=', - auth: 'eH_C8rq2raXqlcBVDa1gLg==', - }, - standard: standard, - }, - } - end - - let(:alerts_payload) do - { - data: { - policy: 'all', - - alerts: { - follow: true, - follow_request: false, - favourite: false, - reblog: true, - mention: false, - poll: true, - status: false, - }, - }, - } - end - let(:standard) { '1' } - - before do - sign_in(user) - - stub_request(:post, create_payload[:subscription][:endpoint]).to_return(status: 200) - end - - describe 'POST #create' do - it 'saves push subscriptions' do - post :create, format: :json, params: create_payload - - expect(response).to have_http_status(200) - - user.reload - - expect(created_push_subscription) - .to have_attributes( - endpoint: eq(create_payload[:subscription][:endpoint]), - key_p256dh: eq(create_payload[:subscription][:keys][:p256dh]), - key_auth: eq(create_payload[:subscription][:keys][:auth]) - ) - .and be_standard - expect(user.session_activations.first.web_push_subscription).to eq(created_push_subscription) - end - - context 'when standard is provided as false value' do - let(:standard) { '0' } - - it 'saves push subscription with standard as false' do - post :create, format: :json, params: create_payload - - expect(created_push_subscription) - .to_not be_standard - end - end - - context 'with a user who has a session with a prior subscription' do - let!(:prior_subscription) { Fabricate(:web_push_subscription, session_activation: user.session_activations.last) } - - it 'destroys prior subscription when creating new one' do - post :create, format: :json, params: create_payload - - expect(response).to have_http_status(200) - expect { prior_subscription.reload }.to raise_error(ActiveRecord::RecordNotFound) - end - end - - context 'with initial data' do - it 'saves alert settings' do - post :create, format: :json, params: create_payload.merge(alerts_payload) - - expect(response).to have_http_status(200) - - expect(created_push_subscription.data['policy']).to eq 'all' - - %w(follow follow_request favourite reblog mention poll status).each do |type| - expect(created_push_subscription.data['alerts'][type]).to eq(alerts_payload[:data][:alerts][type.to_sym].to_s) - end - end - end - end - - describe 'PUT #update' do - it 'changes alert settings' do - post :create, format: :json, params: create_payload - - expect(response).to have_http_status(200) - - alerts_payload[:id] = created_push_subscription.id - - put :update, format: :json, params: alerts_payload - - expect(created_push_subscription.data['policy']).to eq 'all' - - %w(follow follow_request favourite reblog mention poll status).each do |type| - expect(created_push_subscription.data['alerts'][type]).to eq(alerts_payload[:data][:alerts][type.to_sym].to_s) - end - end - end - - def created_push_subscription - Web::PushSubscription.find_by(endpoint: create_payload[:subscription][:endpoint]) - end -end diff --git a/spec/models/trends/statuses_spec.rb b/spec/models/trends/statuses_spec.rb index 3983901042..54b227dad0 100644 --- a/spec/models/trends/statuses_spec.rb +++ b/spec/models/trends/statuses_spec.rb @@ -111,12 +111,16 @@ RSpec.describe Trends::Statuses do let!(:yesterday) { today - 1.day } let!(:status_foo) { Fabricate(:status, text: 'Foo', language: 'en', trendable: true, created_at: yesterday) } - let!(:status_bar) { Fabricate(:status, text: 'Bar', language: 'en', trendable: true, created_at: today) } + let!(:status_bar) { Fabricate(:status, text: 'Bar', language: 'en', trendable: true, created_at: today, quote: Quote.new(state: :accepted, quoted_status: status_foo)) } let!(:status_baz) { Fabricate(:status, text: 'Baz', language: 'en', trendable: true, created_at: today) } + let!(:untrendable) { Fabricate(:status, text: 'Untrendable', language: 'en', trendable: true, visibility: :unlisted) } + let!(:untrendable_quote) { Fabricate(:status, text: 'Untrendable quote!', language: 'en', trendable: true, created_at: today, quote: Quote.new(state: :accepted, quoted_status: untrendable)) } before do default_threshold_value.times { reblog(status_foo, today) } default_threshold_value.times { reblog(status_bar, today) } + default_threshold_value.times { reblog(untrendable, today) } + default_threshold_value.times { reblog(untrendable_quote, today) } (default_threshold_value - 1).times { reblog(status_baz, today) } end @@ -129,7 +133,7 @@ RSpec.describe Trends::Statuses do results = subject.query.limit(10).to_a expect(results).to eq [status_bar, status_foo] - expect(results).to_not include(status_baz) + expect(results).to_not include(status_baz, untrendable, untrendable_quote) end end diff --git a/spec/requests/api/v1/push/subscriptions_spec.rb b/spec/requests/api/v1/push/subscriptions_spec.rb index 359de9d95c..bccbda6fa2 100644 --- a/spec/requests/api/v1/push/subscriptions_spec.rb +++ b/spec/requests/api/v1/push/subscriptions_spec.rb @@ -166,17 +166,30 @@ RSpec.describe 'API V1 Push Subscriptions' do describe 'GET /api/v1/push/subscription' do subject { get '/api/v1/push/subscription', headers: headers } - before { create_subscription_with_token } + context 'with a subscription' do + before { create_subscription_with_token } - it 'shows subscription details' do - subject + it 'shows subscription details' do + subject - expect(response) - .to have_http_status(200) - expect(response.content_type) - .to start_with('application/json') - expect(response.parsed_body) - .to include(endpoint: endpoint) + expect(response) + .to have_http_status(200) + expect(response.content_type) + .to start_with('application/json') + expect(response.parsed_body) + .to include(endpoint: endpoint) + end + end + + context 'without a subscription' do + it 'returns not found' do + subject + + expect(response) + .to have_http_status(404) + expect(response.content_type) + .to start_with('application/json') + end end end diff --git a/spec/requests/api/web/push_subscriptions_spec.rb b/spec/requests/api/web/push_subscriptions_spec.rb index 42545b3d6e..91d7b85bc5 100644 --- a/spec/requests/api/web/push_subscriptions_spec.rb +++ b/spec/requests/api/web/push_subscriptions_spec.rb @@ -3,6 +3,38 @@ require 'rails_helper' RSpec.describe 'API Web Push Subscriptions' do + let(:create_payload) do + { + subscription: { + endpoint: 'https://fcm.googleapis.com/fcm/send/fiuH06a27qE:APA91bHnSiGcLwdaxdyqVXNDR9w1NlztsHb6lyt5WDKOC_Z_Q8BlFxQoR8tWFSXUIDdkyw0EdvxTu63iqamSaqVSevW5LfoFwojws8XYDXv_NRRLH6vo2CdgiN4jgHv5VLt2A8ah6lUX', + keys: { + p256dh: 'BEm_a0bdPDhf0SOsrnB2-ategf1hHoCnpXgQsFj5JCkcoMrMt2WHoPfEYOYPzOIs9mZE8ZUaD7VA5vouy0kEkr8=', + auth: 'eH_C8rq2raXqlcBVDa1gLg==', + }, + standard: standard, + }, + } + end + + let(:alerts_payload) do + { + data: { + policy: 'all', + + alerts: { + follow: true, + follow_request: false, + favourite: false, + reblog: true, + mention: false, + poll: true, + status: false, + }, + }, + } + end + let(:standard) { '1' } + describe 'DELETE /api/web/push_subscriptions/:id' do subject { delete api_web_push_subscription_path(token) } @@ -54,7 +86,9 @@ RSpec.describe 'API Web Push Subscriptions' do end describe 'POST /api/web/push_subscriptions' do - before { sign_in Fabricate :user } + before { sign_in(user) } + + let(:user) { Fabricate :user } it 'gracefully handles invalid nested params' do post api_web_push_subscriptions_path, params: { subscription: 'invalid' } @@ -62,6 +96,69 @@ RSpec.describe 'API Web Push Subscriptions' do expect(response) .to have_http_status(400) end + + it 'saves push subscriptions with valid params' do + post api_web_push_subscriptions_path, params: create_payload + expect(response) + .to have_http_status(200) + + expect(created_push_subscription) + .to have_attributes( + endpoint: eq(create_payload[:subscription][:endpoint]), + key_p256dh: eq(create_payload[:subscription][:keys][:p256dh]), + key_auth: eq(create_payload[:subscription][:keys][:auth]) + ) + .and be_standard + expect(user.session_activations.first.web_push_subscription) + .to eq(created_push_subscription) + end + + context 'when standard is provided as false value' do + let(:standard) { '0' } + + it 'saves push subscription with standard as false' do + post api_web_push_subscriptions_path, params: create_payload + + expect(created_push_subscription) + .to_not be_standard + end + end + + context 'with a user who has a session with a prior subscription' do + before do + # Trigger creation of a `SessionActivation` for the user so that the + # prior_subscription setup and verification works as expected + get about_path + end + + let!(:prior_subscription) { Fabricate(:web_push_subscription, user:, session_activation: user.session_activations.last) } + + it 'destroys prior subscription when creating new one' do + post api_web_push_subscriptions_path, params: create_payload + + expect(response) + .to have_http_status(200) + expect { prior_subscription.reload } + .to raise_error(ActiveRecord::RecordNotFound) + end + end + + context 'with initial data' do + it 'saves alert settings' do + post api_web_push_subscriptions_path, params: create_payload.merge(alerts_payload) + + expect(response) + .to have_http_status(200) + + expect(created_push_subscription.data['policy']) + .to eq 'all' + + alert_types.each do |type| + expect(created_push_subscription.data['alerts'][type]) + .to eq(alerts_payload[:data][:alerts][type.to_sym].to_s) + end + end + end end describe 'PUT /api/web/push_subscriptions' do @@ -75,5 +172,30 @@ RSpec.describe 'API Web Push Subscriptions' do expect(response) .to have_http_status(400) end + + it 'changes existing alert settings' do + # Create record this way to correctly associate a `SessionActivation` + # during full POST->create cycle + post api_web_push_subscriptions_path params: create_payload + expect(response) + .to have_http_status(200) + + put api_web_push_subscription_path(created_push_subscription), params: alerts_payload + expect(created_push_subscription.data['policy']) + .to eq 'all' + alert_types.each do |type| + expect(created_push_subscription.data['alerts'][type]) + .to eq(alerts_payload[:data][:alerts][type.to_sym].to_s) + end + end + end + + def created_push_subscription + Web::PushSubscription + .find_by(endpoint: create_payload[:subscription][:endpoint]) + end + + def alert_types + Notification::LEGACY_TYPE_CLASS_MAP.values.map(&:to_s) end end diff --git a/vite.config.mts b/vite.config.mts index 460c851dcd..b12f46a652 100644 --- a/vite.config.mts +++ b/vite.config.mts @@ -65,6 +65,11 @@ export const config: UserConfigFnPromise = async ({ mode, command }) => { // but it needs to be scoped to the whole domain 'Service-Worker-Allowed': '/', }, + hmr: { + // Forcing the protocol to be insecure helps if you are proxying your dev server with SSL, + // because Vite still tries to connect to localhost. + protocol: 'ws', + }, port: 3036, }, build: { diff --git a/yarn.lock b/yarn.lock index a2495c7644..ccdb5b907d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -73,39 +73,39 @@ __metadata: languageName: node linkType: hard -"@babel/core@npm:^7.18.9, @babel/core@npm:^7.21.3, @babel/core@npm:^7.24.4, @babel/core@npm:^7.26.10, @babel/core@npm:^7.27.4": - version: 7.27.4 - resolution: "@babel/core@npm:7.27.4" +"@babel/core@npm:^7.18.9, @babel/core@npm:^7.21.3, @babel/core@npm:^7.24.4, @babel/core@npm:^7.26.10, @babel/core@npm:^7.28.0": + version: 7.28.0 + resolution: "@babel/core@npm:7.28.0" dependencies: "@ampproject/remapping": "npm:^2.2.0" "@babel/code-frame": "npm:^7.27.1" - "@babel/generator": "npm:^7.27.3" + "@babel/generator": "npm:^7.28.0" "@babel/helper-compilation-targets": "npm:^7.27.2" "@babel/helper-module-transforms": "npm:^7.27.3" - "@babel/helpers": "npm:^7.27.4" - "@babel/parser": "npm:^7.27.4" + "@babel/helpers": "npm:^7.27.6" + "@babel/parser": "npm:^7.28.0" "@babel/template": "npm:^7.27.2" - "@babel/traverse": "npm:^7.27.4" - "@babel/types": "npm:^7.27.3" + "@babel/traverse": "npm:^7.28.0" + "@babel/types": "npm:^7.28.0" convert-source-map: "npm:^2.0.0" debug: "npm:^4.1.0" gensync: "npm:^1.0.0-beta.2" json5: "npm:^2.2.3" semver: "npm:^6.3.1" - checksum: 10c0/d2d17b106a8d91d3eda754bb3f26b53a12eb7646df73c2b2d2e9b08d90529186bc69e3823f70a96ec6e5719dc2372fb54e14ad499da47ceeb172d2f7008787b5 + checksum: 10c0/423302e7c721e73b1c096217880272e02020dfb697a55ccca60ad01bba90037015f84d0c20c6ce297cf33a19bb704bc5c2b3d3095f5284dfa592bd1de0b9e8c3 languageName: node linkType: hard -"@babel/generator@npm:^7.27.3": - version: 7.27.3 - resolution: "@babel/generator@npm:7.27.3" +"@babel/generator@npm:^7.28.0": + version: 7.28.0 + resolution: "@babel/generator@npm:7.28.0" dependencies: - "@babel/parser": "npm:^7.27.3" - "@babel/types": "npm:^7.27.3" - "@jridgewell/gen-mapping": "npm:^0.3.5" - "@jridgewell/trace-mapping": "npm:^0.3.25" + "@babel/parser": "npm:^7.28.0" + "@babel/types": "npm:^7.28.0" + "@jridgewell/gen-mapping": "npm:^0.3.12" + "@jridgewell/trace-mapping": "npm:^0.3.28" jsesc: "npm:^3.0.2" - checksum: 10c0/341622e17c61d008fc746b655ab95ef7febb543df8efb4148f57cf06e60ade1abe091ed7d6811df17b064d04d64f69bb7f35ab0654137116d55c54a73145a61a + checksum: 10c0/1b3d122268ea3df50fde707ad864d9a55c72621357d5cebb972db3dd76859c45810c56e16ad23123f18f80cc2692f5a015d2858361300f0f224a05dc43d36a92 languageName: node linkType: hard @@ -176,6 +176,13 @@ __metadata: languageName: node linkType: hard +"@babel/helper-globals@npm:^7.28.0": + version: 7.28.0 + resolution: "@babel/helper-globals@npm:7.28.0" + checksum: 10c0/5a0cd0c0e8c764b5f27f2095e4243e8af6fa145daea2b41b53c0c1414fe6ff139e3640f4e2207ae2b3d2153a1abd346f901c26c290ee7cb3881dd922d4ee9232 + languageName: node + linkType: hard + "@babel/helper-member-expression-to-functions@npm:^7.27.1": version: 7.27.1 resolution: "@babel/helper-member-expression-to-functions@npm:7.27.1" @@ -293,24 +300,24 @@ __metadata: languageName: node linkType: hard -"@babel/helpers@npm:^7.27.4": - version: 7.27.4 - resolution: "@babel/helpers@npm:7.27.4" +"@babel/helpers@npm:^7.27.6": + version: 7.27.6 + resolution: "@babel/helpers@npm:7.27.6" dependencies: "@babel/template": "npm:^7.27.2" - "@babel/types": "npm:^7.27.3" - checksum: 10c0/3463551420926b3f403c1a30d66ac67bba5c4f73539a8ccb71544da129c4709ac37c57fac740ed8a261b3e6bbbf353b05e03b36ea1a6bf1081604b2a94ca43c1 + "@babel/types": "npm:^7.27.6" + checksum: 10c0/448bac96ef8b0f21f2294a826df9de6bf4026fd023f8a6bb6c782fe3e61946801ca24381490b8e58d861fee75cd695a1882921afbf1f53b0275ee68c938bd6d3 languageName: node linkType: hard -"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.25.4, @babel/parser@npm:^7.27.2, @babel/parser@npm:^7.27.3, @babel/parser@npm:^7.27.4": - version: 7.27.4 - resolution: "@babel/parser@npm:7.27.4" +"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.25.4, @babel/parser@npm:^7.27.2, @babel/parser@npm:^7.28.0": + version: 7.28.0 + resolution: "@babel/parser@npm:7.28.0" dependencies: - "@babel/types": "npm:^7.27.3" + "@babel/types": "npm:^7.28.0" bin: parser: ./bin/babel-parser.js - checksum: 10c0/d1bf17e7508585235e2a76594ba81828e48851877112bb8abbecd7161a31fb66654e993e458ddaedb18a3d5fa31970e5f3feca5ae2900f51e6d8d3d35da70dbf + checksum: 10c0/c2ef81d598990fa949d1d388429df327420357cb5200271d0d0a2784f1e6d54afc8301eb8bdf96d8f6c77781e402da93c7dc07980fcc136ac5b9d5f1fce701b5 languageName: node linkType: hard @@ -1157,28 +1164,28 @@ __metadata: languageName: node linkType: hard -"@babel/traverse@npm:^7.18.9, @babel/traverse@npm:^7.26.10, @babel/traverse@npm:^7.27.1, @babel/traverse@npm:^7.27.3, @babel/traverse@npm:^7.27.4": - version: 7.27.4 - resolution: "@babel/traverse@npm:7.27.4" +"@babel/traverse@npm:^7.18.9, @babel/traverse@npm:^7.26.10, @babel/traverse@npm:^7.27.1, @babel/traverse@npm:^7.27.3, @babel/traverse@npm:^7.28.0": + version: 7.28.0 + resolution: "@babel/traverse@npm:7.28.0" dependencies: "@babel/code-frame": "npm:^7.27.1" - "@babel/generator": "npm:^7.27.3" - "@babel/parser": "npm:^7.27.4" + "@babel/generator": "npm:^7.28.0" + "@babel/helper-globals": "npm:^7.28.0" + "@babel/parser": "npm:^7.28.0" "@babel/template": "npm:^7.27.2" - "@babel/types": "npm:^7.27.3" + "@babel/types": "npm:^7.28.0" debug: "npm:^4.3.1" - globals: "npm:^11.1.0" - checksum: 10c0/6de8aa2a0637a6ee6d205bf48b9e923928a02415771fdec60085ed754dcdf605e450bb3315c2552fa51c31a4662275b45d5ae4ad527ce55a7db9acebdbbbb8ed + checksum: 10c0/32794402457827ac558173bcebdcc0e3a18fa339b7c41ca35621f9f645f044534d91bb923ff385f5f960f2e495f56ce18d6c7b0d064d2f0ccb55b285fa6bc7b9 languageName: node linkType: hard -"@babel/types@npm:^7.0.0, @babel/types@npm:^7.18.9, @babel/types@npm:^7.20.7, @babel/types@npm:^7.21.3, @babel/types@npm:^7.25.4, @babel/types@npm:^7.26.10, @babel/types@npm:^7.27.1, @babel/types@npm:^7.27.3, @babel/types@npm:^7.4.4": - version: 7.27.3 - resolution: "@babel/types@npm:7.27.3" +"@babel/types@npm:^7.0.0, @babel/types@npm:^7.18.9, @babel/types@npm:^7.20.7, @babel/types@npm:^7.21.3, @babel/types@npm:^7.25.4, @babel/types@npm:^7.26.10, @babel/types@npm:^7.27.1, @babel/types@npm:^7.27.6, @babel/types@npm:^7.28.0, @babel/types@npm:^7.4.4": + version: 7.28.1 + resolution: "@babel/types@npm:7.28.1" dependencies: "@babel/helper-string-parser": "npm:^7.27.1" "@babel/helper-validator-identifier": "npm:^7.27.1" - checksum: 10c0/bafdfc98e722a6b91a783b6f24388f478fd775f0c0652e92220e08be2cc33e02d42088542f1953ac5e5ece2ac052172b3dadedf12bec9aae57899e92fb9a9757 + checksum: 10c0/5e99b346c11ee42ffb0cadc28159fe0b184d865a2cc1593df79b199772a534f6453969b4942aa5e4a55a3081863096e1cc3fc1c724d826926dc787cf229b845d languageName: node linkType: hard @@ -2542,14 +2549,13 @@ __metadata: languageName: node linkType: hard -"@jridgewell/gen-mapping@npm:^0.3.5": - version: 0.3.5 - resolution: "@jridgewell/gen-mapping@npm:0.3.5" +"@jridgewell/gen-mapping@npm:^0.3.12, @jridgewell/gen-mapping@npm:^0.3.5": + version: 0.3.12 + resolution: "@jridgewell/gen-mapping@npm:0.3.12" dependencies: - "@jridgewell/set-array": "npm:^1.2.1" - "@jridgewell/sourcemap-codec": "npm:^1.4.10" + "@jridgewell/sourcemap-codec": "npm:^1.5.0" "@jridgewell/trace-mapping": "npm:^0.3.24" - checksum: 10c0/1be4fd4a6b0f41337c4f5fdf4afc3bd19e39c3691924817108b82ffcb9c9e609c273f936932b9fba4b3a298ce2eb06d9bff4eb1cc3bd81c4f4ee1b4917e25feb + checksum: 10c0/32f771ae2467e4d440be609581f7338d786d3d621bac3469e943b9d6d116c23c4becb36f84898a92bbf2f3c0511365c54a945a3b86a83141547a2a360a5ec0c7 languageName: node linkType: hard @@ -2560,13 +2566,6 @@ __metadata: languageName: node linkType: hard -"@jridgewell/set-array@npm:^1.2.1": - version: 1.2.1 - resolution: "@jridgewell/set-array@npm:1.2.1" - checksum: 10c0/2a5aa7b4b5c3464c895c802d8ae3f3d2b92fcbe84ad12f8d0bfbb1f5ad006717e7577ee1fd2eac00c088abe486c7adb27976f45d2941ff6b0b92b2c3302c60f4 - languageName: node - linkType: hard - "@jridgewell/source-map@npm:^0.3.3": version: 0.3.6 resolution: "@jridgewell/source-map@npm:0.3.6" @@ -2577,20 +2576,20 @@ __metadata: languageName: node linkType: hard -"@jridgewell/sourcemap-codec@npm:^1.4.10, @jridgewell/sourcemap-codec@npm:^1.4.14, @jridgewell/sourcemap-codec@npm:^1.5.0": +"@jridgewell/sourcemap-codec@npm:^1.4.14, @jridgewell/sourcemap-codec@npm:^1.5.0": version: 1.5.0 resolution: "@jridgewell/sourcemap-codec@npm:1.5.0" checksum: 10c0/2eb864f276eb1096c3c11da3e9bb518f6d9fc0023c78344cdc037abadc725172c70314bdb360f2d4b7bffec7f5d657ce006816bc5d4ecb35e61b66132db00c18 languageName: node linkType: hard -"@jridgewell/trace-mapping@npm:^0.3.23, @jridgewell/trace-mapping@npm:^0.3.24, @jridgewell/trace-mapping@npm:^0.3.25": - version: 0.3.25 - resolution: "@jridgewell/trace-mapping@npm:0.3.25" +"@jridgewell/trace-mapping@npm:^0.3.23, @jridgewell/trace-mapping@npm:^0.3.24, @jridgewell/trace-mapping@npm:^0.3.25, @jridgewell/trace-mapping@npm:^0.3.28": + version: 0.3.29 + resolution: "@jridgewell/trace-mapping@npm:0.3.29" dependencies: "@jridgewell/resolve-uri": "npm:^3.1.0" "@jridgewell/sourcemap-codec": "npm:^1.4.14" - checksum: 10c0/3d1ce6ebc69df9682a5a8896b414c6537e428a1d68b02fcc8363b04284a8ca0df04d0ee3013132252ab14f2527bc13bea6526a912ecb5658f0e39fd2860b4df4 + checksum: 10c0/fb547ba31658c4d74eb17e7389f4908bf7c44cef47acb4c5baa57289daf68e6fe53c639f41f751b3923aca67010501264f70e7b49978ad1f040294b22c37b333 languageName: node linkType: hard @@ -3213,10 +3212,10 @@ __metadata: languageName: node linkType: hard -"@rolldown/pluginutils@npm:1.0.0-beta.19": - version: 1.0.0-beta.19 - resolution: "@rolldown/pluginutils@npm:1.0.0-beta.19" - checksum: 10c0/e4205df56e6231a347ac601d044af365639741d51b5bea4e91ecc37e19e9777cb79d1daa924b8709ddf1f743ed6922e4e68e2445126434c4d420d9f4416f4feb +"@rolldown/pluginutils@npm:1.0.0-beta.27": + version: 1.0.0-beta.27 + resolution: "@rolldown/pluginutils@npm:1.0.0-beta.27" + checksum: 10c0/9658f235b345201d4f6bfb1f32da9754ca164f892d1cb68154fe5f53c1df42bd675ecd409836dff46884a7847d6c00bdc38af870f7c81e05bba5c2645eb4ab9c languageName: node linkType: hard @@ -4737,18 +4736,18 @@ __metadata: linkType: hard "@vitejs/plugin-react@npm:^4.2.1": - version: 4.6.0 - resolution: "@vitejs/plugin-react@npm:4.6.0" + version: 4.7.0 + resolution: "@vitejs/plugin-react@npm:4.7.0" dependencies: - "@babel/core": "npm:^7.27.4" + "@babel/core": "npm:^7.28.0" "@babel/plugin-transform-react-jsx-self": "npm:^7.27.1" "@babel/plugin-transform-react-jsx-source": "npm:^7.27.1" - "@rolldown/pluginutils": "npm:1.0.0-beta.19" + "@rolldown/pluginutils": "npm:1.0.0-beta.27" "@types/babel__core": "npm:^7.20.5" react-refresh: "npm:^0.17.0" peerDependencies: - vite: ^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0-beta.0 - checksum: 10c0/73b8f271978a0337debb255afd1667f49c2018c118962a8613120383375c4038255a5315cee2ef210dc7fd07cd30d5b12271077ad47db29980f8156b8a49be2c + vite: ^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 + checksum: 10c0/692f23960972879485d647713663ec299c478222c96567d60285acf7c7dc5c178e71abfe9d2eefddef1eeb01514dacbc2ed68aad84628debf9c7116134734253 languageName: node linkType: hard