diff --git a/Gemfile.lock b/Gemfile.lock index f4ab61acf7..e316211a25 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -190,7 +190,7 @@ GEM irb (~> 1.10) reline (>= 0.3.8) debug_inspector (1.2.0) - devise (5.0.2) + devise (5.0.3) bcrypt (~> 3.0) orm_adapter (~> 0.1) railties (>= 7.0) diff --git a/app/controllers/api/v1/donation_campaigns_controller.rb b/app/controllers/api/v1/donation_campaigns_controller.rb index 4b3d680e9a..43df1fdc3e 100644 --- a/app/controllers/api/v1/donation_campaigns_controller.rb +++ b/app/controllers/api/v1/donation_campaigns_controller.rb @@ -60,7 +60,7 @@ class Api::V1::DonationCampaignsController < Api::BaseController return JSON.parse(res.body_with_limit) if res.code == 200 end end - rescue *Mastodon::HTTP_CONNECTION_ERRORS, Oj::ParseError + rescue *Mastodon::HTTP_CONNECTION_ERRORS, JSON::ParserError nil end diff --git a/app/helpers/json_ld_helper.rb b/app/helpers/json_ld_helper.rb index 8ff77e3c57..83a083469a 100644 --- a/app/helpers/json_ld_helper.rb +++ b/app/helpers/json_ld_helper.rb @@ -314,7 +314,7 @@ module JsonLdHelper return if compare_id.present? && json['id'] != compare_id json - rescue Oj::ParseError + rescue JSON::ParserError nil end diff --git a/app/javascript/mastodon/locales/da.json b/app/javascript/mastodon/locales/da.json index 241873eea2..8299aadcfb 100644 --- a/app/javascript/mastodon/locales/da.json +++ b/app/javascript/mastodon/locales/da.json @@ -184,6 +184,15 @@ "account_edit.field_reorder_modal.drag_start": "Samlede feltet \"{item}\" op.", "account_edit.field_reorder_modal.handle_label": "Træk feltet \"{item}\"", "account_edit.field_reorder_modal.title": "Omarrangér felter", + "account_edit.image_alt_modal.add_title": "Tilføj alt-tekst", + "account_edit.image_alt_modal.details_content": "GØR GERNE: GØR IKKE: EKSEMPEL: ", + "account_edit.image_alt_modal.details_title": "Tips: Alt-tekst til profilfotos", + "account_edit.image_alt_modal.edit_title": "Rediger alt-tekst", + "account_edit.image_alt_modal.text_hint": "Alt-tekst hjælper brugere af skærmlæsere med at forstå dit indhold.", + "account_edit.image_alt_modal.text_label": "Alt-tekst", + "account_edit.image_delete_modal.confirm": "Er du sikker på, at du vil slette dette billede? Denne handling kan ikke fortrydes.", + "account_edit.image_delete_modal.delete_button": "Slet", + "account_edit.image_delete_modal.title": "Slet billede?", "account_edit.image_edit.add_button": "Tilføj billede", "account_edit.image_edit.alt_add_button": "Tilføj alt-tekst", "account_edit.image_edit.alt_edit_button": "Rediger alt-tekst", @@ -203,6 +212,16 @@ "account_edit.profile_tab.subtitle": "Tilpas fanerne på din profil og det, de viser.", "account_edit.profile_tab.title": "Indstillinger for profil-fane", "account_edit.save": "Gem", + "account_edit.upload_modal.back": "Tilbage", + "account_edit.upload_modal.done": "Færdig", + "account_edit.upload_modal.next": "Næste", + "account_edit.upload_modal.step_crop.zoom": "Zoom", + "account_edit.upload_modal.step_upload.button": "Gennemse filer", + "account_edit.upload_modal.step_upload.dragging": "Slip for at uploade", + "account_edit.upload_modal.step_upload.header": "Vælg et billede", + "account_edit.upload_modal.step_upload.hint": "WEBP, PNG, GIF eller JPG-format, op til {limit} MB.{br}Billede vil blive skaleret til {width}x{height} px.", + "account_edit.upload_modal.title_add": "Tilføj profilfoto", + "account_edit.upload_modal.title_replace": "Erstat profilfoto", "account_edit.verified_modal.details": "Øg troværdigheden af din Mastodon-profil ved at verificere links til personlige websteder. Sådan fungerer det:", "account_edit.verified_modal.invisible_link.details": "Føj linket til din header. Det vigtige er rel=\"me\", som forhindrer imitatorer på websteder med brugergenereret indhold. Du kan endda bruge et link-tag i sidens header i stedet for {tag}, men HTML-koden skal være tilgængelig uden at afvikle JavaScript.", "account_edit.verified_modal.invisible_link.summary": "Hvordan gør jeg linket usynligt?", diff --git a/app/javascript/mastodon/locales/de.json b/app/javascript/mastodon/locales/de.json index a85d9e2d52..2def40b593 100644 --- a/app/javascript/mastodon/locales/de.json +++ b/app/javascript/mastodon/locales/de.json @@ -184,6 +184,15 @@ "account_edit.field_reorder_modal.drag_start": "Das Feld „{item}“ wurde ausgewählt.", "account_edit.field_reorder_modal.handle_label": "Das Feld „{item}“ verschieben", "account_edit.field_reorder_modal.title": "Felder neu anordnen", + "account_edit.image_alt_modal.add_title": "Bildbeschreibung hinzufügen", + "account_edit.image_alt_modal.details_content": "Richtig: Falsch: Korrektes Beispiel: ", + "account_edit.image_alt_modal.details_title": "Hinweis: Bildbeschreibung für Profilbilder", + "account_edit.image_alt_modal.edit_title": "Bildbeschreibung bearbeiten", + "account_edit.image_alt_modal.text_hint": "Bildbeschreibungen können von Screenreadern erfasst werden. Dadurch können Menschen, die darauf angewiesen sind, deine Medieninhalte besser wahrnehmen.", + "account_edit.image_alt_modal.text_label": "Bildbeschreibung", + "account_edit.image_delete_modal.confirm": "Möchtest du dieses Bild wirklich löschen? Diese Aktion kann nicht rückgängig gemacht werden.", + "account_edit.image_delete_modal.delete_button": "Löschen", + "account_edit.image_delete_modal.title": "Bild löschen?", "account_edit.image_edit.add_button": "Bild hinzufügen", "account_edit.image_edit.alt_add_button": "Bildbeschreibung hinzufügen", "account_edit.image_edit.alt_edit_button": "Bildbeschreibung bearbeiten", @@ -203,6 +212,16 @@ "account_edit.profile_tab.subtitle": "Passe die Tabs deines Profils und deren Inhalte an.", "account_edit.profile_tab.title": "Profil-Tab-Einstellungen", "account_edit.save": "Speichern", + "account_edit.upload_modal.back": "Zurück", + "account_edit.upload_modal.done": "Fertig", + "account_edit.upload_modal.next": "Weiter", + "account_edit.upload_modal.step_crop.zoom": "Vergrößern", + "account_edit.upload_modal.step_upload.button": "Datei hochladen", + "account_edit.upload_modal.step_upload.dragging": "Zum Hochladen hier ablegen", + "account_edit.upload_modal.step_upload.header": "Wähle ein Bild", + "account_edit.upload_modal.step_upload.hint": "WebP, PNG, GIF oder JPG. Höchstens {limit} MB groß.{br}Das Bild wird auf {width}x{height} px skaliert.", + "account_edit.upload_modal.title_add": "Profilbild hinzufügen", + "account_edit.upload_modal.title_replace": "Profilbild ändern", "account_edit.verified_modal.details": "Beweise die Echtheit deines Mastodon-Profils, indem du verifizierte Links zu deinen persönlichen Websites ergänzt. So funktioniert’s:", "account_edit.verified_modal.invisible_link.details": "Füge den Link in den Header ein. Der wichtige Teil ist rel=\"me\". Du kannst auch den Tag link im Header (statt {tag}) verwenden, jedoch muss die Internetseite ohne JavaScript abrufbar sein.", "account_edit.verified_modal.invisible_link.summary": "Wie blende ich den Link aus?", diff --git a/app/javascript/mastodon/locales/el.json b/app/javascript/mastodon/locales/el.json index 498efe3170..cdb0312a2d 100644 --- a/app/javascript/mastodon/locales/el.json +++ b/app/javascript/mastodon/locales/el.json @@ -184,6 +184,15 @@ "account_edit.field_reorder_modal.drag_start": "Το πεδίο \"{item}\" σηκώθηκε.", "account_edit.field_reorder_modal.handle_label": "Μετακίνηση πεδίου \"{item}\"", "account_edit.field_reorder_modal.title": "Αναδιάταξη πεδίων", + "account_edit.image_alt_modal.add_title": "Προσθήκη εναλλακτικού κειμένου", + "account_edit.image_alt_modal.details_content": "ΚΑΝΕΤΕ: ΜΗΝ ΚΑΝΕΤΕ: ΠΑΡΑΔΕΙΓΜΑ: ", + "account_edit.image_alt_modal.details_title": "Συμβουλές: Εναλλακτικό κείμενο για εικόνες προφίλ", + "account_edit.image_alt_modal.edit_title": "Επεξεργασία εναλλακτικού κειμένου", + "account_edit.image_alt_modal.text_hint": "Το εναλλακτικό κείμενο βοηθά τους χρήστες με αναγνώστη οθόνης να κατανοήσουν το περιεχόμενό σας.", + "account_edit.image_alt_modal.text_label": "Εναλλακτικό κείμενο", + "account_edit.image_delete_modal.confirm": "Σίγουρα θέλετε να διαγράψετε αυτήν την εικόνα; Αυτή η ενέργεια δεν μπορεί να αναιρεθεί.", + "account_edit.image_delete_modal.delete_button": "Διαγραφή", + "account_edit.image_delete_modal.title": "Διαγραφή εικόνας;", "account_edit.image_edit.add_button": "Προσθήκη εικόνας", "account_edit.image_edit.alt_add_button": "Προσθήκη εναλλακτικού κειμένου", "account_edit.image_edit.alt_edit_button": "Επεξεργασία εναλλακτικού κειμένου", @@ -203,6 +212,15 @@ "account_edit.profile_tab.subtitle": "Προσαρμόστε τις καρτέλες στο προφίλ σας και τι εμφανίζουν.", "account_edit.profile_tab.title": "Ρυθμίσεις καρτέλας προφίλ", "account_edit.save": "Αποθήκευση", + "account_edit.upload_modal.back": "Πίσω", + "account_edit.upload_modal.done": "Έγινε", + "account_edit.upload_modal.step_crop.zoom": "Μεγέθυνση", + "account_edit.upload_modal.step_upload.button": "Περιήγηση αρχείων", + "account_edit.upload_modal.step_upload.dragging": "Αποθέστε εδώ για ανέβασμα", + "account_edit.upload_modal.step_upload.header": "Επιλέξτε μια εικόνα", + "account_edit.upload_modal.step_upload.hint": "WEBP, PNG, GIF ή JPG μορφή, μέχρι {limit}MB.{br}Η ανάλυση της εικόνας θα προσαρμοστεί στα {width}x{height}px.", + "account_edit.upload_modal.title_add": "Προσθήκη εικόνας προφίλ", + "account_edit.upload_modal.title_replace": "Αντικατάσταση εικόνας προφίλ", "account_edit.verified_modal.details": "Πρόσθεσε αξιοπιστία στο Mastodon προφίλ σας επαληθεύοντας συνδέσμους σε προσωπικές ιστοσελίδες. Ορίστε πως δουλεύει:", "account_edit.verified_modal.invisible_link.details": "Πρόσθεσε τον σύνδεσμο στην κεφαλίδα σου. Το σημαντικό μέρος είναι το rel=\"me\" που αποτρέπει την μίμηση σε ιστοσελίδες με περιεχόμενο παραγόμενο από χρήστες. Μπορείς ακόμα να χρησιμοποιήσεις μια ετικέτα link στην κεφαλίδα της σελίδας αντί για {tag}, αλλά η HTML πρέπει να είναι προσβάσιμη χωρίς την εκτέλεση JavaScript.", "account_edit.verified_modal.invisible_link.summary": "Πώς κάνω αυτόν τον σύνδεσμο αόρατο;", diff --git a/app/javascript/mastodon/locales/es-AR.json b/app/javascript/mastodon/locales/es-AR.json index 495f4a5a0d..b6fa0195e1 100644 --- a/app/javascript/mastodon/locales/es-AR.json +++ b/app/javascript/mastodon/locales/es-AR.json @@ -163,7 +163,7 @@ "account_edit.featured_hashtags.item": "etiquetas", "account_edit.featured_hashtags.placeholder": "Ayudá a otras personas a identificarte y a tener un rápido acceso a tus temas favoritos.", "account_edit.featured_hashtags.title": "Etiquetas destacadas", - "account_edit.field_delete_modal.confirm": "¿Estás seguro de que querés eliminar este campo personalizado? Esta acción no se puede deshacer.", + "account_edit.field_delete_modal.confirm": "¿De verdad querés eliminar este campo personalizado? Esta acción no se puede deshacer.", "account_edit.field_delete_modal.delete_button": "Eliminar", "account_edit.field_delete_modal.title": "¿Eliminar campo personalizado?", "account_edit.field_edit_modal.add_title": "Agregar campo personalizado", @@ -184,6 +184,15 @@ "account_edit.field_reorder_modal.drag_start": "Campo elegido «{item}».", "account_edit.field_reorder_modal.handle_label": "Arrastrá el campo «{item}»", "account_edit.field_reorder_modal.title": "Reordená los campos", + "account_edit.image_alt_modal.add_title": "Agregar texto alternativo", + "account_edit.image_alt_modal.details_content": "LO QUE VA: EVITÁ: EJEMPLO DE UNA BUENA DESCRIPCIÓN: ", + "account_edit.image_alt_modal.details_title": "Consejos: Texto alternativo para imágenes de perfil", + "account_edit.image_alt_modal.edit_title": "Editar texto alternativo", + "account_edit.image_alt_modal.text_hint": "El texto alternativo ayuda a los usuarios de lectores de pantalla a entender tu contenido.", + "account_edit.image_alt_modal.text_label": "Texto alternativo", + "account_edit.image_delete_modal.confirm": "¿De verdad querés eliminar esta imagen? Esta acción no se puede deshacer.", + "account_edit.image_delete_modal.delete_button": "Eliminar", + "account_edit.image_delete_modal.title": "¿Eliminar imagen?", "account_edit.image_edit.add_button": "Agregar imagen", "account_edit.image_edit.alt_add_button": "Agregar texto alternativo", "account_edit.image_edit.alt_edit_button": "Editar texto alternativo", @@ -203,6 +212,16 @@ "account_edit.profile_tab.subtitle": "Personalizá las pestañas en tu perfil y qué van a mostrar.", "account_edit.profile_tab.title": "Configuración de pestaña de perfil", "account_edit.save": "Guardar", + "account_edit.upload_modal.back": "Volver", + "account_edit.upload_modal.done": "Listo", + "account_edit.upload_modal.next": "Siguiente", + "account_edit.upload_modal.step_crop.zoom": "Zoom", + "account_edit.upload_modal.step_upload.button": "Explorar archivos", + "account_edit.upload_modal.step_upload.dragging": "Arrastrá para subir", + "account_edit.upload_modal.step_upload.header": "Elegí una imagen", + "account_edit.upload_modal.step_upload.hint": "Formato WEBP, PNG, GIF o JPG, hasta {limit} MB.{br}La imagen será escalada a {width}x{height} píxeles.", + "account_edit.upload_modal.title_add": "Agregar imagen de perfil", + "account_edit.upload_modal.title_replace": "Reemplazar imagen de perfil", "account_edit.verified_modal.details": "Agregá credibilidad a tu perfil de Mastodon verificando enlaces a sitios web personales. Así es cómo funciona:", "account_edit.verified_modal.invisible_link.details": "Agregá el enlace a tu encabezado. La parte importante es rel=\"yo\" que evita la suplantación en sitios web con contenido generado por el usuario. Incluso podés usar una etiqueta de enlace en el encabezado de la página en lugar de {tag}, pero el código HTML debe ser accesible sin ejecutar JavaScript.", "account_edit.verified_modal.invisible_link.summary": "¿Cómo hago el enlace invisible?", @@ -305,7 +324,7 @@ "bundle_column_error.network.title": "Error de red", "bundle_column_error.retry": "Intentá de nuevo", "bundle_column_error.return": "Volver al inicio", - "bundle_column_error.routing.body": "No se pudo encontrar la página solicitada. ¿Estás seguro que la dirección web es correcta?", + "bundle_column_error.routing.body": "No se pudo encontrar la página solicitada. ¿La dirección web es correcta?", "bundle_column_error.routing.title": "404", "bundle_modal_error.close": "Cerrar", "bundle_modal_error.message": "Algo salió mal al cargar esta pantalla.", @@ -333,7 +352,7 @@ "collections.collection_description": "Descripción", "collections.collection_name": "Nombre", "collections.collection_topic": "Tema", - "collections.confirm_account_removal": "¿Estás seguro de que querés eliminar esta cuenta de esta colección?", + "collections.confirm_account_removal": "¿De verdad querés eliminar esta cuenta de esta colección?", "collections.content_warning": "Advertencia de contenido", "collections.continue": "Continuar", "collections.create.accounts_subtitle": "Solo las cuentas que seguís —las cuales optaron por ser descubiertas— pueden ser agregadas.", @@ -417,9 +436,9 @@ "combobox.no_results_found": "No hay resultados para esta búsqueda", "combobox.open_results": "Abrir resultados", "combobox.results_available": "{count, plural, one {# sugerencia} other {# sugerencias}} disponible. Usá las teclas de flecha arriba y flecha abajo para navegar. Toca la tecla «Intro ⏎» para seleccionar.", - "community.column_settings.local_only": "Sólo local", - "community.column_settings.media_only": "Sólo medios", - "community.column_settings.remote_only": "Sólo remoto", + "community.column_settings.local_only": "Solo local", + "community.column_settings.media_only": "Solo medios", + "community.column_settings.remote_only": "Solo remoto", "compose.error.blank_post": "El mensaje no puede estar en blanco.", "compose.language.change": "Cambiar idioma", "compose.language.search": "Buscar idiomas…", @@ -428,7 +447,7 @@ "compose.saved.body": "Mensaje guardado.", "compose_form.direct_message_warning_learn_more": "Aprendé más", "compose_form.encryption_warning": "Los mensajes en Mastodon no están cifrados de extremo a extremo. No compartas ninguna información sensible al usar Mastodon.", - "compose_form.hashtag_warning": "Este mensaje no se mostrará bajo ninguna etiqueta porque no es público. Sólo los mensajes públicos se pueden buscar por etiquetas.", + "compose_form.hashtag_warning": "Este mensaje no se mostrará bajo ninguna etiqueta porque no es público. Solo los mensajes públicos se pueden buscar por etiquetas.", "compose_form.lock_disclaimer": "Tu cuenta no es {locked}. Todos pueden seguirte para ver tus mensajes marcados como \"Sólo para seguidores\".", "compose_form.lock_disclaimer.lock": "privada", "compose_form.placeholder": "¿Qué onda?", @@ -448,13 +467,13 @@ "confirmation_modal.cancel": "Cancelar", "confirmations.block.confirm": "Bloquear", "confirmations.delete.confirm": "Eliminar", - "confirmations.delete.message": "¿Estás seguro que querés eliminar este mensaje?", + "confirmations.delete.message": "¿De verdad querés eliminar este mensaje?", "confirmations.delete.title": "¿Eliminar mensaje?", "confirmations.delete_collection.confirm": "Eliminar", "confirmations.delete_collection.message": "Esta acción no se puede deshacer.", "confirmations.delete_collection.title": "¿Eliminar «{name}»?", "confirmations.delete_list.confirm": "Eliminar", - "confirmations.delete_list.message": "¿Estás seguro que querés eliminar permanentemente esta lista?", + "confirmations.delete_list.message": "¿De verdad querés eliminar permanentemente esta lista?", "confirmations.delete_list.title": "¿Eliminar lista?", "confirmations.discard_draft.confirm": "Descartar y continuar", "confirmations.discard_draft.edit.cancel": "Reanudar edición", @@ -472,7 +491,7 @@ "confirmations.follow_to_list.message": "Necesitás seguir a {name} para agregarle a una lista.", "confirmations.follow_to_list.title": "¿Querés seguirle?", "confirmations.logout.confirm": "Cerrar sesión", - "confirmations.logout.message": "¿Estás seguro que querés cerrar la sesión?", + "confirmations.logout.message": "¿De verdad querés cerrar la sesión?", "confirmations.logout.title": "¿Cerrar sesión?", "confirmations.missing_alt_text.confirm": "Agregar texto alternativo", "confirmations.missing_alt_text.message": "Tu mensaje contiene medios sin texto alternativo. Agregar descripciones ayuda a que tu contenido sea accesible para más personas.", @@ -489,10 +508,10 @@ "confirmations.quiet_post_quote_info.message": "Al citar un mensaje público pero silencioso, tu mensaje se ocultará de las líneas temporales de tendencias.", "confirmations.quiet_post_quote_info.title": "Citado de mensajes públicos pero silenciosos", "confirmations.redraft.confirm": "Eliminar mensaje original y editarlo", - "confirmations.redraft.message": "¿Estás seguro que querés eliminar este mensaje y volver a editarlo? Se perderán las veces marcadas como favorito y sus adhesiones, y las respuestas al mensaje original quedarán huérfanas.", + "confirmations.redraft.message": "¿De verdad querés eliminar este mensaje y volver a editarlo? Se perderán las veces marcadas como favorito y sus adhesiones, y las respuestas al mensaje original quedarán huérfanas.", "confirmations.redraft.title": "¿Eliminar y volver a redactar mensaje?", "confirmations.remove_from_followers.confirm": "Quitar seguidor", - "confirmations.remove_from_followers.message": "{name} dejará de seguirte. ¿Estás seguro de que querés continuar?", + "confirmations.remove_from_followers.message": "{name} dejará de seguirte. ¿De verdad querés continuar?", "confirmations.remove_from_followers.title": "¿Quitar seguidor?", "confirmations.revoke_collection_inclusion.confirm": "Quitarme", "confirmations.revoke_collection_inclusion.message": "Esta acción es permanente, y el autor no podrá volver a agregarte a la colección más adelante.", @@ -518,7 +537,7 @@ "copypaste.copied": "Copiado", "copypaste.copy_to_clipboard": "Copiar al portapapeles", "directory.federated": "Desde fediverso conocido", - "directory.local": "Sólo de {domain}", + "directory.local": "Solo de {domain}", "directory.new_arrivals": "Recién llegados", "directory.recently_active": "Recientemente activos", "disabled_account_banner.account_settings": "Config. de la cuenta", @@ -893,10 +912,10 @@ "notification_requests.accept": "Aceptar", "notification_requests.accept_multiple": "{count, plural, one {Aceptar # solicitud…} other {Aceptar # solicitudes…}}", "notification_requests.confirm_accept_multiple.button": "{count, plural, one {Aceptar solicitud} other {Aceptar solicitudes}}", - "notification_requests.confirm_accept_multiple.message": "Estás a punto de aceptar {count, plural, one {una solicitud} other {# solicitudes}}. ¿Estás seguro de que querés continuar?", + "notification_requests.confirm_accept_multiple.message": "Estás a punto de aceptar {count, plural, one {una solicitud} other {# solicitudes}}. ¿De verdad querés continuar?", "notification_requests.confirm_accept_multiple.title": "¿Aceptar solicitudes de notificación?", "notification_requests.confirm_dismiss_multiple.button": "{count, plural, one {Descartar solicitud} other {Descartar solicitudes}}", - "notification_requests.confirm_dismiss_multiple.message": "Estás a punto de descartar {count, plural, one {una solicitud} other {# solicitudes}}. No vas a poder acceder fácilmente a {count, plural, one {ella} other {ellas}} de nuevo. ¿Estás seguro de que querés continuar?", + "notification_requests.confirm_dismiss_multiple.message": "Estás a punto de descartar {count, plural, one {una solicitud} other {# solicitudes}}. No vas a poder acceder fácilmente a {count, plural, one {ella} other {ellas}} de nuevo. ¿De verdad querés continuar?", "notification_requests.confirm_dismiss_multiple.title": "¿Descartar solicitudes de notificación?", "notification_requests.dismiss": "Descartar", "notification_requests.dismiss_multiple": "{count, plural, one {Descartar # solicitud…} other {Descartar # solicitudes…}}", @@ -910,7 +929,7 @@ "notification_requests.title": "Notificaciones filtradas", "notification_requests.view": "Ver notificaciones", "notifications.clear": "Limpiar notificaciones", - "notifications.clear_confirmation": "¿Estás seguro que querés limpiar todas tus notificaciones permanentemente?", + "notifications.clear_confirmation": "¿De verdad querés limpiar todas tus notificaciones permanentemente?", "notifications.clear_title": "¿Limpiar notificaciones?", "notifications.column_settings.admin.report": "Nuevas denuncias:", "notifications.column_settings.admin.sign_up": "Nuevos registros:", @@ -1219,7 +1238,7 @@ "status.uncached_media_warning": "Previsualización no disponible", "status.unmute_conversation": "Dejar de silenciar conversación", "status.unpin": "Dejar de fijar", - "subscribed_languages.lead": "Después del cambio, sólo los mensajes en los idiomas seleccionados aparecerán en tu línea temporal Principal y en las líneas de tiempo de lista. No seleccionés ningún idioma para poder recibir mensajes en todos los idiomas.", + "subscribed_languages.lead": "Después del cambio, solo los mensajes en los idiomas seleccionados aparecerán en tu línea temporal Principal y en las líneas de tiempo de lista. No seleccionés ningún idioma para poder recibir mensajes en todos los idiomas.", "subscribed_languages.save": "Guardar cambios", "subscribed_languages.target": "Cambiar idiomas suscritos para {target}", "tabs_bar.home": "Principal", diff --git a/app/javascript/mastodon/locales/es-MX.json b/app/javascript/mastodon/locales/es-MX.json index eefc2e01db..8a92624f3f 100644 --- a/app/javascript/mastodon/locales/es-MX.json +++ b/app/javascript/mastodon/locales/es-MX.json @@ -184,6 +184,15 @@ "account_edit.field_reorder_modal.drag_start": "Recogido el campo «{item}».", "account_edit.field_reorder_modal.handle_label": "Arrastra el campo «{item}»", "account_edit.field_reorder_modal.title": "Reorganizar campos", + "account_edit.image_alt_modal.add_title": "Añadir texto alternativo", + "account_edit.image_alt_modal.details_content": "QUÉ HACER: QUÉ NO HACER: EJEMPLO: ", + "account_edit.image_alt_modal.details_title": "Consejo: Texto alternativo para las fotos de perfil", + "account_edit.image_alt_modal.edit_title": "Editar texto alternativo", + "account_edit.image_alt_modal.text_hint": "El texto alternativo ayuda a los usuarios de lectores de pantalla a entender tu contenido.", + "account_edit.image_alt_modal.text_label": "Texto alternativo", + "account_edit.image_delete_modal.confirm": "¿Estás seguro de que quieres eliminar esta imagen? Esta acción no se puede deshacer.", + "account_edit.image_delete_modal.delete_button": "Eliminar", + "account_edit.image_delete_modal.title": "¿Eliminar imagen?", "account_edit.image_edit.add_button": "Añadir imagen", "account_edit.image_edit.alt_add_button": "Añadir texto alternativo", "account_edit.image_edit.alt_edit_button": "Editar texto alternativo", @@ -203,6 +212,16 @@ "account_edit.profile_tab.subtitle": "Personaliza las pestañas de tu perfil y lo que muestran.", "account_edit.profile_tab.title": "Configuración de la pestaña de perfil", "account_edit.save": "Guardar", + "account_edit.upload_modal.back": "Volver", + "account_edit.upload_modal.done": "Hecho", + "account_edit.upload_modal.next": "Siguiente", + "account_edit.upload_modal.step_crop.zoom": "Acercar", + "account_edit.upload_modal.step_upload.button": "Explorar archivos", + "account_edit.upload_modal.step_upload.dragging": "Arrastrar para subir", + "account_edit.upload_modal.step_upload.header": "Elegir una imagen", + "account_edit.upload_modal.step_upload.hint": "Formato WEBP, PNG, GIF o JPG, con un tamaño máximo de {limit} MB.{br}La imagen se redimensionará a {width} x {height} píxeles.", + "account_edit.upload_modal.title_add": "Agregar foto de perfil", + "account_edit.upload_modal.title_replace": "Reemplazar foto de perfil", "account_edit.verified_modal.details": "Agrega credibilidad a tu perfil de Mastodon verificando los enlaces a sitios web personales. Así es como funciona:", "account_edit.verified_modal.invisible_link.details": "Agrega el enlace a tu encabezado. La parte importante es rel=\"me\", que evita la suplantación de identidad en sitios web con contenido generado por los usuarios. Incluso puedes usar una etiqueta de enlace en el encabezado de la página en lugar de {tag}, pero el HTML debe ser accesible sin ejecutar JavaScript.", "account_edit.verified_modal.invisible_link.summary": "¿Cómo hago para que el enlace sea invisible?", diff --git a/app/javascript/mastodon/locales/fi.json b/app/javascript/mastodon/locales/fi.json index dfbe5087bd..6df8f1952c 100644 --- a/app/javascript/mastodon/locales/fi.json +++ b/app/javascript/mastodon/locales/fi.json @@ -184,6 +184,13 @@ "account_edit.field_reorder_modal.drag_start": "Valittu kenttä ”{item}”.", "account_edit.field_reorder_modal.handle_label": "Siirrä kenttää ”{item}”", "account_edit.field_reorder_modal.title": "Järjestele kenttiä", + "account_edit.image_alt_modal.add_title": "Lisää tekstivastine", + "account_edit.image_alt_modal.details_title": "Vinkkejä: profiilikuvien tekstivastineet", + "account_edit.image_alt_modal.edit_title": "Muokkaa tekstivastinetta", + "account_edit.image_alt_modal.text_label": "Tekstivastine", + "account_edit.image_delete_modal.confirm": "Haluatko varmasti poistaa tämän kuvan? Tätä toimea ei voi kumota.", + "account_edit.image_delete_modal.delete_button": "Poista", + "account_edit.image_delete_modal.title": "Poistetaanko kuva?", "account_edit.image_edit.add_button": "Lisää kuva", "account_edit.image_edit.alt_add_button": "Lisää tekstivastine", "account_edit.image_edit.alt_edit_button": "Muokkaa tekstivastinetta", @@ -203,6 +210,16 @@ "account_edit.profile_tab.subtitle": "Mukauta profiilisi välilehtiä ja sitä, mitä niissä näkyy.", "account_edit.profile_tab.title": "Profiilin välilehtien asetukset", "account_edit.save": "Tallenna", + "account_edit.upload_modal.back": "Takaisin", + "account_edit.upload_modal.done": "Valmis", + "account_edit.upload_modal.next": "Seuraava", + "account_edit.upload_modal.step_crop.zoom": "Lähennä/loitonna", + "account_edit.upload_modal.step_upload.button": "Selaa tiedostoja", + "account_edit.upload_modal.step_upload.dragging": "Lähetä pudottamalla", + "account_edit.upload_modal.step_upload.header": "Valitse kuva", + "account_edit.upload_modal.step_upload.hint": "WEBP-, PNG-, GIF- tai JPG-muotoinen, enintään {limit} Mt.{br}Kuva skaalautuu kokoon {width}×{height} px.", + "account_edit.upload_modal.title_add": "Lisää profiilikuva", + "account_edit.upload_modal.title_replace": "Korvaa profiilikuva", "account_edit.verified_modal.details": "Lisää Mastodon-profiiliisi uskottavuutta vahvistamalla linkit henkilökohtaisiin verkkosivustoihin. Näin se toimii:", "account_edit.verified_modal.invisible_link.details": "Lisää linkki HTML:n head-osaan. Tärkeä kohta on rel=\"me\", joka estää toiseksi tekeytymisen sivustoilla, joilla on käyttäjien luomaa sisältöä. Voit jopa käyttää link-tunnistetta sivun head-osassa {tag}-tunnisteen sijaan, mutta HTML:n tulee olla saatavilla suorittamatta JavaScriptia.", "account_edit.verified_modal.invisible_link.summary": "Miten teen linkistä näkymättömän?", diff --git a/app/javascript/mastodon/locales/fr-CA.json b/app/javascript/mastodon/locales/fr-CA.json index ba2db8c8f3..b6990d4d22 100644 --- a/app/javascript/mastodon/locales/fr-CA.json +++ b/app/javascript/mastodon/locales/fr-CA.json @@ -203,6 +203,8 @@ "account_edit.profile_tab.subtitle": "Personnaliser les onglets de votre profil et leur contenu.", "account_edit.profile_tab.title": "Paramètres de l'onglet du profil", "account_edit.save": "Enregistrer", + "account_edit.upload_modal.back": "Retour", + "account_edit.upload_modal.done": "Terminé", "account_edit.verified_modal.details": "Ajouter de la crédibilité à votre profil Mastodon en vérifiant les liens vers vos sites Web personnels. Voici comment cela fonctionne :", "account_edit.verified_modal.invisible_link.details": "Ajouter le lien dans votre en-tête. La partie importante est « rel=\"me\" » qui empêche l'usurpation d'identité sur des sites Web ayant du contenu généré par d'autres utilisateur·rice·s. Vous pouvez aussi utiliser une balise link dans l'en-tête de la page au lieu de {tag}, mais le code HTML doit être accessible sans avoir besoin d'exécuter du JavaScript.", "account_edit.verified_modal.invisible_link.summary": "Comment rendre le lien invisible ?", diff --git a/app/javascript/mastodon/locales/fr.json b/app/javascript/mastodon/locales/fr.json index a43f69d192..da6c7e7301 100644 --- a/app/javascript/mastodon/locales/fr.json +++ b/app/javascript/mastodon/locales/fr.json @@ -203,6 +203,8 @@ "account_edit.profile_tab.subtitle": "Personnaliser les onglets de votre profil et leur contenu.", "account_edit.profile_tab.title": "Paramètres de l'onglet du profil", "account_edit.save": "Enregistrer", + "account_edit.upload_modal.back": "Retour", + "account_edit.upload_modal.done": "Terminé", "account_edit.verified_modal.details": "Ajouter de la crédibilité à votre profil Mastodon en vérifiant les liens vers vos sites Web personnels. Voici comment cela fonctionne :", "account_edit.verified_modal.invisible_link.details": "Ajouter le lien dans votre en-tête. La partie importante est « rel=\"me\" » qui empêche l'usurpation d'identité sur des sites Web ayant du contenu généré par d'autres utilisateur·rice·s. Vous pouvez aussi utiliser une balise link dans l'en-tête de la page au lieu de {tag}, mais le code HTML doit être accessible sans avoir besoin d'exécuter du JavaScript.", "account_edit.verified_modal.invisible_link.summary": "Comment rendre le lien invisible ?", diff --git a/app/javascript/mastodon/locales/gl.json b/app/javascript/mastodon/locales/gl.json index 9e8889c53f..330e7f832c 100644 --- a/app/javascript/mastodon/locales/gl.json +++ b/app/javascript/mastodon/locales/gl.json @@ -184,6 +184,15 @@ "account_edit.field_reorder_modal.drag_start": "Seleccionado o campo \"{item}\".", "account_edit.field_reorder_modal.handle_label": "Arrastra o campo \"{item}\"", "account_edit.field_reorder_modal.title": "Ordear campos", + "account_edit.image_alt_modal.add_title": "Engadir texto descritivo", + "account_edit.image_alt_modal.details_content": "COMO: NON fagas: EXEMPLO: ", + "account_edit.image_alt_modal.details_title": "Consellos: Texto descritivo para fotos de perfil", + "account_edit.image_alt_modal.edit_title": "Editar descrición", + "account_edit.image_alt_modal.text_hint": "A descrición axuda ás persoas que usan lectores de pantalla a comprender o que publicas.", + "account_edit.image_alt_modal.text_label": "Texto descritivo", + "account_edit.image_delete_modal.confirm": "Tes certeza de querer eliminar esta imaxe? Non se poderá desfacer a acción.", + "account_edit.image_delete_modal.delete_button": "Eliminar", + "account_edit.image_delete_modal.title": "Eliminar imaxe?", "account_edit.image_edit.add_button": "Engadir imaxe", "account_edit.image_edit.alt_add_button": "Engadir descrición", "account_edit.image_edit.alt_edit_button": "Editar descrición", @@ -203,6 +212,16 @@ "account_edit.profile_tab.subtitle": "Personaliza as pestanas e o seu contido no teu perfil.", "account_edit.profile_tab.title": "Perfil e axustes das pestanas", "account_edit.save": "Gardar", + "account_edit.upload_modal.back": "Volver", + "account_edit.upload_modal.done": "Feito", + "account_edit.upload_modal.next": "Seguinte", + "account_edit.upload_modal.step_crop.zoom": "Achegamento", + "account_edit.upload_modal.step_upload.button": "Explorar ficheiros", + "account_edit.upload_modal.step_upload.dragging": "Solta aquí para subir", + "account_edit.upload_modal.step_upload.header": "Escoller unha imaxe", + "account_edit.upload_modal.step_upload.hint": "Formato WEBP, PNG, GIF ou JPG, ata {limit}MB.{br}A imaxe será comprimida a {width}x{height}px.", + "account_edit.upload_modal.title_add": "Engadir foto do perfil", + "account_edit.upload_modal.title_replace": "Substituír foto do perfil", "account_edit.verified_modal.details": "Engade maior credibilidade ao teu perfil Mastodon verificando as ligazóns ás túas páxinas web persoais. Funciona así:", "account_edit.verified_modal.invisible_link.details": "Engade a ligazón ao «header» da páxina web. A parte importante é rel=\"me\", que evita a suplantación en sitios web con contido creado polas usuarias. Tamén podes usar a etiqueta «link» na cabeceira da páxina no lugar de {tag}, pero o HTML ten que ser accesible sen usar JavaScript.", "account_edit.verified_modal.invisible_link.summary": "Como fago visible a ligazón?", diff --git a/app/javascript/mastodon/locales/is.json b/app/javascript/mastodon/locales/is.json index d98649cf90..b6e192bb9f 100644 --- a/app/javascript/mastodon/locales/is.json +++ b/app/javascript/mastodon/locales/is.json @@ -184,6 +184,15 @@ "account_edit.field_reorder_modal.drag_start": "Náði reitnum \"{item}\".", "account_edit.field_reorder_modal.handle_label": "Dragðu reitinn \"{item}\"", "account_edit.field_reorder_modal.title": "Endurraða gagnasviðum", + "account_edit.image_alt_modal.add_title": "Bæta við hjálpartexta", + "account_edit.image_alt_modal.details_content": "GERÐU ÞETTA: EKKI GERA ÞETTA: DÆMI: ", + "account_edit.image_alt_modal.details_title": "Ábending: hjálpartexti fyrir auðkennismyndir", + "account_edit.image_alt_modal.edit_title": "Breyta hjálpartexta", + "account_edit.image_alt_modal.text_hint": "Hjálpartexti hjálpar fólki sem notar skjálesara að skilja efnið frá þér.", + "account_edit.image_alt_modal.text_label": "Hjálpartexti mynda", + "account_edit.image_delete_modal.confirm": "Ertu viss um að þú viljir eyða þessari mynd? Þessa aðgerð er ekki hægt að afturkalla.", + "account_edit.image_delete_modal.delete_button": "Eyða", + "account_edit.image_delete_modal.title": "Eyða mynd?", "account_edit.image_edit.add_button": "Bæta við mynd", "account_edit.image_edit.alt_add_button": "Bæta við hjálpartexta", "account_edit.image_edit.alt_edit_button": "Breyta hjálpartexta", @@ -203,6 +212,16 @@ "account_edit.profile_tab.subtitle": "Sérsníddu flipana á notandasniðinu þínu og hvað þeir birta.", "account_edit.profile_tab.title": "Stillingar notandasniðsflipa", "account_edit.save": "Vista", + "account_edit.upload_modal.back": "Til baka", + "account_edit.upload_modal.done": "Lokið", + "account_edit.upload_modal.next": "Næsta", + "account_edit.upload_modal.step_crop.zoom": "Aðdráttur", + "account_edit.upload_modal.step_upload.button": "Skoða skrár", + "account_edit.upload_modal.step_upload.dragging": "Slepptu til að senda inn", + "account_edit.upload_modal.step_upload.header": "Veldu mynd", + "account_edit.upload_modal.step_upload.hint": "WEBP, PNG, GIF eða JPG-snið, allt að {limit}MB.{br}Mynd verður kvörðuð í {width}x{height}px.", + "account_edit.upload_modal.title_add": "Bæta við auðkennismynd", + "account_edit.upload_modal.title_replace": "Skipta um auðkennismynd", "account_edit.verified_modal.details": "Auktu trúverðugleika Mastodon-aðgangsins þíns með því að bæta við staðfestingartenglum sem vísa á vefsvæðin þín. Hérna sérðu hvernig það virkar:", "account_edit.verified_modal.invisible_link.details": "Bættu tenglinum í hausinn hjá þér. Mikilvægi hlutinn er rel=\"me\" sem kemur í veg fyrir blekkingu verðandi persónuauðkenni á vefsvæðum með notandaframleiddu efni. Þú getur jafnvel notað tengimerkið í haus síðunnar í staðinn fyrir {tag}, en HTML-kóðinn verður samt að vera aðgengilegur án þess að keyra þurfi JavaScript.", "account_edit.verified_modal.invisible_link.summary": "Hvernig geri ég tengilinn ósýnilegan?", diff --git a/app/javascript/mastodon/locales/it.json b/app/javascript/mastodon/locales/it.json index 35ad6eaf10..68560bed93 100644 --- a/app/javascript/mastodon/locales/it.json +++ b/app/javascript/mastodon/locales/it.json @@ -184,6 +184,15 @@ "account_edit.field_reorder_modal.drag_start": "Campo \"{item}\" selezionato.", "account_edit.field_reorder_modal.handle_label": "Trascina il campo \"{item}\"", "account_edit.field_reorder_modal.title": "Riorganizza i campi", + "account_edit.image_alt_modal.add_title": "Aggiungi il testo alternativo", + "account_edit.image_alt_modal.details_content": "COSA FARE: COSA NON FARE: ESEMPIO: ", + "account_edit.image_alt_modal.details_title": "Suggerimenti: testo alternativo per le foto del profilo", + "account_edit.image_alt_modal.edit_title": "Modifica il testo alternativo", + "account_edit.image_alt_modal.text_hint": "Il testo alternativo aiuta gli utenti che utilizzano i lettori di schermo a comprendere i tuoi contenuti.", + "account_edit.image_alt_modal.text_label": "Testo alternativo", + "account_edit.image_delete_modal.confirm": "Si è sicuri di voler eliminare questa immagine? Questa azione non può essere annullata.", + "account_edit.image_delete_modal.delete_button": "Elimina", + "account_edit.image_delete_modal.title": "Eliminare l'immagine?", "account_edit.image_edit.add_button": "Aggiungi un'immagine", "account_edit.image_edit.alt_add_button": "Aggiungi il testo alternativo", "account_edit.image_edit.alt_edit_button": "Modifica il testo alternativo", @@ -203,6 +212,16 @@ "account_edit.profile_tab.subtitle": "Personalizza le schede del tuo profilo e ciò che mostrano.", "account_edit.profile_tab.title": "Impostazioni della scheda del profilo", "account_edit.save": "Salva", + "account_edit.upload_modal.back": "Indietro", + "account_edit.upload_modal.done": "Fatto", + "account_edit.upload_modal.next": "Avanti", + "account_edit.upload_modal.step_crop.zoom": "Ingrandimento", + "account_edit.upload_modal.step_upload.button": "Sfoglia i file", + "account_edit.upload_modal.step_upload.dragging": "Trascina per caricare", + "account_edit.upload_modal.step_upload.header": "Scegli un'immagine", + "account_edit.upload_modal.step_upload.hint": "Formato WEBP, PNG, GIF o JPG, fino a {limit}MB.{br}L'immagine verrà ridimensionata a {width}x{height}px.", + "account_edit.upload_modal.title_add": "Aggiungi la foto del profilo", + "account_edit.upload_modal.title_replace": "Sostituisci la foto del profilo", "account_edit.verified_modal.details": "Aggiungi credibilità al tuo profilo Mastodon verificando i collegamenti ai siti web personali. Ecco come funziona:", "account_edit.verified_modal.invisible_link.details": "Aggiungi il collegamento alla tua intestazione. La parte importante è rel=\"me\" che impedisce l'impersonificazione sui siti web con contenuti generati dagli utenti. Puoi anche utilizzare un link tag nell'intestazione della pagina al posto di {tag}, ma il codice HTML deve essere accessibile senza eseguire JavaScript.", "account_edit.verified_modal.invisible_link.summary": "Come faccio a rendere il collegamento invisibile?", diff --git a/app/javascript/mastodon/locales/nl.json b/app/javascript/mastodon/locales/nl.json index 08469f32d2..a17b30fa66 100644 --- a/app/javascript/mastodon/locales/nl.json +++ b/app/javascript/mastodon/locales/nl.json @@ -170,15 +170,15 @@ "account_edit.field_edit_modal.edit_title": "Aangepast veld bewerken", "account_edit.field_edit_modal.limit_header": "Aanbevolen tekenlimiet overschreden", "account_edit.field_edit_modal.limit_message": "Mobiele gebruikers zien mogelijk het veld niet volledig.", - "account_edit.field_edit_modal.link_emoji_warning": "We raden aan om aangepaste emoji in combinatie met urls te gebruiken. Aangepaste velden die beide bevatten worden alleen als tekst weergegeven in plaats van als een link, om verwarring van de gebruiker te voorkomen.", + "account_edit.field_edit_modal.link_emoji_warning": "We raden aan om geen lokale emoji in combinatie met URL's te gebruiken. Aangepaste velden die beide bevatten worden alleen als tekst weergegeven, in plaats van als een link. Dit om verwarring voor de gebruiker te voorkomen.", "account_edit.field_edit_modal.name_hint": "Bijv. \"Persoonlijke website\"", "account_edit.field_edit_modal.name_label": "Label", - "account_edit.field_edit_modal.url_warning": "Voeg {protocol} toe aan het begin om een link toe te voegen.", + "account_edit.field_edit_modal.url_warning": "Voeg {protocol} aan het begin toe om een link toe te voegen.", "account_edit.field_edit_modal.value_hint": "Bijv. \"https://example.me\"", "account_edit.field_edit_modal.value_label": "Waarde", - "account_edit.field_reorder_modal.drag_cancel": "Slepen is geannuleerd. Veld \"{item}\" is weggevallen.", - "account_edit.field_reorder_modal.drag_end": "Veld \"{item}\" was weggevallen.", - "account_edit.field_reorder_modal.drag_instructions": "Druk op spatie of enter om aangepaste velden te herschikken. Gebruik de pijltjestoetsen om het veld omhoog of omlaag te verplaatsen. Druk opnieuw op spatie of enter om het veld in zijn nieuwe positie te laten vallen, of druk op escape om te annuleren.", + "account_edit.field_reorder_modal.drag_cancel": "Slepen is geannuleerd. Veld \"{item}\" werd geschrapt.", + "account_edit.field_reorder_modal.drag_end": "Veld \"{item}\" werd geschrapt.", + "account_edit.field_reorder_modal.drag_instructions": "Druk op spatie of enter om de aangepaste velden te herschikken. Gebruik de pijltjestoetsen om het veld omhoog of omlaag te verplaatsen. Druk opnieuw op spatie of enter om het veld op diens nieuwe positie te laten vallen, of druk op escape om te annuleren.", "account_edit.field_reorder_modal.drag_move": "Veld \"{item}\" is verplaatst.", "account_edit.field_reorder_modal.drag_over": "Veld \"{item}\" is over \"{over} \" verplaatst.", "account_edit.field_reorder_modal.drag_start": "Opgepakt veld \"{item}\".", @@ -367,8 +367,8 @@ "collections.old_last_post_note": "Meer dan een week geleden voor het laatst een bericht geplaatst", "collections.remove_account": "Dit account verwijderen", "collections.report_collection": "Deze verzameling rapporteren", - "collections.revoke_collection_inclusion": "Verwijder mezelf uit deze collectie", - "collections.revoke_inclusion.confirmation": "Je bent verwijderd uit \"{collection}\"", + "collections.revoke_collection_inclusion": "Mezelf uit deze verzameling verwijderen", + "collections.revoke_inclusion.confirmation": "Je bent uit \"{collection}\" verwijderd", "collections.revoke_inclusion.error": "Er is een fout opgetreden. Probeer het later opnieuw.", "collections.search_accounts_label": "Naar accounts zoeken om toe te voegen…", "collections.search_accounts_max_reached": "Je hebt het maximum aantal accounts toegevoegd", @@ -496,7 +496,7 @@ "confirmations.remove_from_followers.title": "Volger verwijderen?", "confirmations.revoke_collection_inclusion.confirm": "Verwijder mij", "confirmations.revoke_collection_inclusion.message": "Deze actie is definitief en de curator kan je later niet opnieuw aan de verzameling toevoegen.", - "confirmations.revoke_collection_inclusion.title": "Verwijder jezelf van deze collectie?", + "confirmations.revoke_collection_inclusion.title": "Jezelf uit deze collectie verwijderen?", "confirmations.revoke_quote.confirm": "Bericht verwijderen", "confirmations.revoke_quote.message": "Deze actie kan niet ongedaan worden gemaakt.", "confirmations.revoke_quote.title": "Bericht verwijderen?", @@ -967,7 +967,7 @@ "notifications_permission_banner.title": "Mis nooit meer iets", "onboarding.follows.back": "Terug", "onboarding.follows.empty": "Helaas kunnen op dit moment geen resultaten worden getoond. Je kunt proberen te zoeken of op de verkenningspagina te bladeren om mensen te vinden die je kunt volgen, of probeer het later opnieuw.", - "onboarding.follows.next": "Volgende: stel je profiel in", + "onboarding.follows.next": "Volgende: je profiel instellen", "onboarding.follows.search": "Zoeken", "onboarding.follows.title": "Volg mensen om te beginnen", "onboarding.profile.discoverable": "Maak mijn profiel vindbaar", diff --git a/app/javascript/mastodon/locales/sq.json b/app/javascript/mastodon/locales/sq.json index b900fc650a..54f5513dae 100644 --- a/app/javascript/mastodon/locales/sq.json +++ b/app/javascript/mastodon/locales/sq.json @@ -183,6 +183,15 @@ "account_edit.field_reorder_modal.drag_start": "U mor fusha “{item}”.", "account_edit.field_reorder_modal.handle_label": "Tërhiqni fushën “{item}”", "account_edit.field_reorder_modal.title": "Risistemoni fusha", + "account_edit.image_alt_modal.add_title": "Shtoni tekst alternativ", + "account_edit.image_alt_modal.details_content": "MIRË: KEQ: SHEMBULL: ", + "account_edit.image_alt_modal.details_title": "Ndihmëza: Teskt alternativ për figura profilesh", + "account_edit.image_alt_modal.edit_title": "Përpunoni tekst alternativ", + "account_edit.image_alt_modal.text_hint": "Teskti alternativ ndihmon përdorue lexuesish ekrani të kuptojnë lëndën tuaj.", + "account_edit.image_alt_modal.text_label": "Tekst alternativ", + "account_edit.image_delete_modal.confirm": "Jeni i sigurt se doni të fshihet kjo figurë? Ky veprim s’mund të zhbëhet.", + "account_edit.image_delete_modal.delete_button": "Fshije", + "account_edit.image_delete_modal.title": "Të fshihet figura?", "account_edit.image_edit.add_button": "Shtoni figurë", "account_edit.image_edit.alt_add_button": "Shtoni tekst alternativ", "account_edit.image_edit.alt_edit_button": "Përpunoni tekst alternativ", @@ -202,6 +211,16 @@ "account_edit.profile_tab.subtitle": "Përshtatni skedat në profilin tuaj dhe ato çka shfaqet në to.", "account_edit.profile_tab.title": "Rregullime skede profili", "account_edit.save": "Ruaje", + "account_edit.upload_modal.back": "Mbrapsht", + "account_edit.upload_modal.done": "U bë", + "account_edit.upload_modal.next": "Pasuesja", + "account_edit.upload_modal.step_crop.zoom": "Zoom", + "account_edit.upload_modal.step_upload.button": "Shfletoni kartela", + "account_edit.upload_modal.step_upload.dragging": "Lëreni, që të ngarkohet", + "account_edit.upload_modal.step_upload.header": "Zgjidhni një figurë", + "account_edit.upload_modal.step_upload.hint": "Format WEBP, PNG, GIF ose JPG, deri në {limit}MB.{br}Figura do të ripërmasohet në {width}x{height}px.", + "account_edit.upload_modal.title_add": "Shtoni figurë profili", + "account_edit.upload_modal.title_replace": "Zëvendësoni figurë profili", "account_edit.verified_modal.details": "Shtoni besueshmëri te profili juaj Mastodon duke verifikuar lidhje për te sajte personalë. Ja se si funksionon:", "account_edit.verified_modal.invisible_link.details": "Shtojeni lidhjen te kryet tuaja. Pjesa e rëndësishme është rel=\"me\", e cila pengon imitime në sajte me lëndë të prodhuar nga përdoruesit. Mundeni madje të përdorni një etiketë lidhjeje te kryet e faqes në vend të {tag}, por HTML-ja duhet të jetë e përdorshme pa ekzekutim të JavaScript-it.", "account_edit.verified_modal.invisible_link.summary": "Si ta bëj lidhjen të padukshme?", diff --git a/app/javascript/mastodon/locales/tr.json b/app/javascript/mastodon/locales/tr.json index 4494be38e9..687c51507a 100644 --- a/app/javascript/mastodon/locales/tr.json +++ b/app/javascript/mastodon/locales/tr.json @@ -203,6 +203,16 @@ "account_edit.profile_tab.subtitle": "Profilinizdeki sekmeleri ve bunların görüntülediği bilgileri özelleştirin.", "account_edit.profile_tab.title": "Profil sekme ayarları", "account_edit.save": "Kaydet", + "account_edit.upload_modal.back": "Geri", + "account_edit.upload_modal.done": "Tamamlandı", + "account_edit.upload_modal.next": "İleri", + "account_edit.upload_modal.step_crop.zoom": "Yakınlaştır", + "account_edit.upload_modal.step_upload.button": "Dosyalara göz at", + "account_edit.upload_modal.step_upload.dragging": "Yüklemek için bırakın", + "account_edit.upload_modal.step_upload.header": "Bir resim seç", + "account_edit.upload_modal.step_upload.hint": "WEBP, PNG, GIF veya JPG formatında, en fazla {limit} MB.{br}Görsel {width}x{height} piksel boyutuna getirilir.", + "account_edit.upload_modal.title_add": "Profil fotoğrafı ekle", + "account_edit.upload_modal.title_replace": "Profil fotoğrafını değiştir", "account_edit.verified_modal.details": "Kişisel web sitelerine bağlantıları doğrulayarak Mastodon profilinize güvenilirlik katın. İşte böyle çalışıyor:", "account_edit.verified_modal.invisible_link.details": "Bağlantıyı başlığınıza ekleyin. Önemli olan kısım, kullanıcı tarafından oluşturulan içeriğe sahip web sitelerinde kimlik sahtekarlığını önleyen rel=\"me\" özniteliğidir. {tag} yerine sayfanın başlığında bir bağlantı etiketi bile kullanabilirsiniz, ancak HTML, JavaScript çalıştırılmadan erişilebilir olmalıdır.", "account_edit.verified_modal.invisible_link.summary": "Bağlantıyı nasıl görünmez hale getirebilirim?", @@ -374,6 +384,7 @@ "collections.search_accounts_max_reached": "Maksimum hesabı eklediniz", "collections.sensitive": "Hassas", "collections.topic_hint": "Bu koleksiyonun ana konusunu başkalarının anlamasına yardımcı olacak bir etiket ekleyin.", + "collections.topic_special_chars_hint": "Kaydederken özel karakterler silinecektir", "collections.view_collection": "Koleksiyonu görüntüle", "collections.view_other_collections_by_user": "Bu kullanıcının diğer koleksiyonlarını görüntüle", "collections.visibility_public": "Herkese açık", diff --git a/app/javascript/mastodon/locales/vi.json b/app/javascript/mastodon/locales/vi.json index 7cf66595ac..148e624219 100644 --- a/app/javascript/mastodon/locales/vi.json +++ b/app/javascript/mastodon/locales/vi.json @@ -203,6 +203,16 @@ "account_edit.profile_tab.subtitle": "Tùy chỉnh tab trên hồ sơ của bạn và những gì chúng hiển thị.", "account_edit.profile_tab.title": "Thiết lập tab hồ sơ", "account_edit.save": "Lưu", + "account_edit.upload_modal.back": "Quay lại", + "account_edit.upload_modal.done": "Xong", + "account_edit.upload_modal.next": "Kế tiếp", + "account_edit.upload_modal.step_crop.zoom": "Phóng to", + "account_edit.upload_modal.step_upload.button": "Duyệt tệp", + "account_edit.upload_modal.step_upload.dragging": "Thả để tải lên", + "account_edit.upload_modal.step_upload.header": "Chọn ảnh", + "account_edit.upload_modal.step_upload.hint": "WEBP, PNG, GIF hoặc JPG, tối đa {limit}MB.{br}Sẽ bị thu xuống {width}x{height}px.", + "account_edit.upload_modal.title_add": "Thêm ảnh đại diện", + "account_edit.upload_modal.title_replace": "Thay thế ảnh đại diện", "account_edit.verified_modal.details": "Tăng độ tin cậy cho hồ sơ Mastodon của bạn bằng cách xác minh liên kết đến trang web cá nhân. Cách thức thực hiện như sau:", "account_edit.verified_modal.invisible_link.details": "Thêm liên kết trên header của trang. Quan trọng là rel=\"me\" giúp ngăn chặn việc mạo danh trên các trang web có nội dung do người dùng tạo. Bạn cũng có thể sử dụng một thẻ link thay vì {tag}, nhưng HTML phải có thể truy cập được mà không cần thực thi JavaScript.", "account_edit.verified_modal.invisible_link.summary": "Làm thế nào để ẩn liên kết?", diff --git a/app/javascript/mastodon/locales/zh-CN.json b/app/javascript/mastodon/locales/zh-CN.json index bb2400c775..9f1689fba9 100644 --- a/app/javascript/mastodon/locales/zh-CN.json +++ b/app/javascript/mastodon/locales/zh-CN.json @@ -184,6 +184,15 @@ "account_edit.field_reorder_modal.drag_start": "已选中字段“{item}”。", "account_edit.field_reorder_modal.handle_label": "拖拽字段“{item}”", "account_edit.field_reorder_modal.title": "重新排列字段", + "account_edit.image_alt_modal.add_title": "添加替代文本", + "account_edit.image_alt_modal.details_content": "建议这么做: 不建议这么做: 示例:", + "account_edit.image_alt_modal.details_title": "小贴士:为头像添加替代文本", + "account_edit.image_alt_modal.edit_title": "编辑替代文本", + "account_edit.image_alt_modal.text_hint": "替代文本可以帮助使用屏幕阅读器的用户理解你的内容。", + "account_edit.image_alt_modal.text_label": "替代文本", + "account_edit.image_delete_modal.confirm": "确定要删除此图片吗?此操作无法撤销。", + "account_edit.image_delete_modal.delete_button": "删除", + "account_edit.image_delete_modal.title": "删除图片吗?", "account_edit.image_edit.add_button": "添加图片", "account_edit.image_edit.alt_add_button": "添加替代文本", "account_edit.image_edit.alt_edit_button": "编辑替代文本", @@ -203,6 +212,16 @@ "account_edit.profile_tab.subtitle": "自定义你个人资料的标签页及其显示的内容。", "account_edit.profile_tab.title": "个人资料标签页设置", "account_edit.save": "保存", + "account_edit.upload_modal.back": "返回", + "account_edit.upload_modal.done": "完成", + "account_edit.upload_modal.next": "下一步", + "account_edit.upload_modal.step_crop.zoom": "缩放", + "account_edit.upload_modal.step_upload.button": "浏览文件", + "account_edit.upload_modal.step_upload.dragging": "将文件拖放到此处开始上传", + "account_edit.upload_modal.step_upload.header": "选择图片", + "account_edit.upload_modal.step_upload.hint": "支持 WEBP、PNG、GIF 或 JPG 格式,最大 {limit} MB。{br}图片将被缩放至 {width}×{height}px。", + "account_edit.upload_modal.title_add": "添加头像", + "account_edit.upload_modal.title_replace": "替换头像", "account_edit.verified_modal.details": "要增加 Mastodon 个人资料的可信度,可以验证指向个人网站的链接。运作方式如下:", "account_edit.verified_modal.invisible_link.details": "将链接添加到标头(header)中。其中很重要的部分是 rel=\"me\",可以防止他人通过用户生成内容模仿。你甚至可以在页面标头中使用 link 标签而不是 {tag},但包含该部分的 HTML 必须在没有 JavaScript 执行环境下访问时依然存在。", "account_edit.verified_modal.invisible_link.summary": "如何隐藏此链接?", diff --git a/app/javascript/mastodon/locales/zh-TW.json b/app/javascript/mastodon/locales/zh-TW.json index 36e6d517a0..73b2649aac 100644 --- a/app/javascript/mastodon/locales/zh-TW.json +++ b/app/javascript/mastodon/locales/zh-TW.json @@ -184,6 +184,15 @@ "account_edit.field_reorder_modal.drag_start": "已選取欄位「{item}」。", "account_edit.field_reorder_modal.handle_label": "拖放欄位「{item}」", "account_edit.field_reorder_modal.title": "重新整理欄位", + "account_edit.image_alt_modal.add_title": "新增 ALT 說明文字", + "account_edit.image_alt_modal.details_content": "要: 不要: 範例:", + "account_edit.image_alt_modal.details_title": "小撇步:個人檔案照片的 ALT 說明文字", + "account_edit.image_alt_modal.edit_title": "編輯 ALT 說明文字", + "account_edit.image_alt_modal.text_hint": "ALT 說明文字可協助螢幕閱讀程式使用者理解您的內容。", + "account_edit.image_alt_modal.text_label": "ALT 說明文字", + "account_edit.image_delete_modal.confirm": "您確定要刪除此圖片嗎?此動作無法復原。", + "account_edit.image_delete_modal.delete_button": "刪除", + "account_edit.image_delete_modal.title": "是否刪除圖片?", "account_edit.image_edit.add_button": "新增圖片", "account_edit.image_edit.alt_add_button": "新增 ALT 說明文字", "account_edit.image_edit.alt_edit_button": "編輯 ALT 說明文字", @@ -203,6 +212,16 @@ "account_edit.profile_tab.subtitle": "自訂您個人檔案之分頁與內容。", "account_edit.profile_tab.title": "個人檔案分頁設定", "account_edit.save": "儲存", + "account_edit.upload_modal.back": "上一步", + "account_edit.upload_modal.done": "完成", + "account_edit.upload_modal.next": "下一步", + "account_edit.upload_modal.step_crop.zoom": "縮放", + "account_edit.upload_modal.step_upload.button": "瀏覽檔案", + "account_edit.upload_modal.step_upload.dragging": "拖曳以上傳", + "account_edit.upload_modal.step_upload.header": "選擇圖片", + "account_edit.upload_modal.step_upload.hint": "WEBP、PNG、GIF 或 JPG 格式,最大 {limit}MB。{br}圖片將會縮放至 {width}x{height} 像素。", + "account_edit.upload_modal.title_add": "新增個人檔案照片", + "account_edit.upload_modal.title_replace": "更換個人檔案照片", "account_edit.verified_modal.details": "藉由驗證連結至個人網站增加您 Mastodon 個人檔案之可信度。運作方式如下:", "account_edit.verified_modal.invisible_link.details": "新增連結至您的標頭 (header)。其重要的部分是 rel=\"me\" ,防止透過使用者產生內容模擬。您甚至能使用頁面標頭之 link 標籤取代頁面中的 {tag},但 HTML 必須能於不執行 JavaScript 情況下所存取。", "account_edit.verified_modal.invisible_link.summary": "如何隱藏此連結?", diff --git a/app/lib/activitypub/activity/create.rb b/app/lib/activitypub/activity/create.rb index 0bc0603a24..054e712fa8 100644 --- a/app/lib/activitypub/activity/create.rb +++ b/app/lib/activitypub/activity/create.rb @@ -440,7 +440,7 @@ class ActivityPub::Activity::Create < ActivityPub::Activity def forward_for_reply return unless @status.distributable? && @json['signature'].present? && reply_to_local? - ActivityPub::RawDistributionWorker.perform_async(Oj.dump(@json), replied_to_status.account_id, [@account.preferred_inbox_url]) + ActivityPub::RawDistributionWorker.perform_async(JSON.generate(@json), replied_to_status.account_id, [@account.preferred_inbox_url]) end def increment_voters_count! diff --git a/app/lib/activitypub/activity/feature_request.rb b/app/lib/activitypub/activity/feature_request.rb index 9e69fa2b99..180eeb492c 100644 --- a/app/lib/activitypub/activity/feature_request.rb +++ b/app/lib/activitypub/activity/feature_request.rb @@ -40,7 +40,7 @@ class ActivityPub::Activity::FeatureRequest < ActivityPub::Activity end def queue_delivery!(collection_item, serializer) - json = Oj.dump(serialize_payload(collection_item, serializer)) + json = JSON.generate(serialize_payload(collection_item, serializer)) ActivityPub::DeliveryWorker.perform_async(json, @featured_account.id, @account.inbox_url) end end diff --git a/app/lib/activitypub/forwarder.rb b/app/lib/activitypub/forwarder.rb index c5ff59fa5a..43bbe013b3 100644 --- a/app/lib/activitypub/forwarder.rb +++ b/app/lib/activitypub/forwarder.rb @@ -20,7 +20,7 @@ class ActivityPub::Forwarder private def payload - @payload ||= Oj.dump(@json) + @payload ||= JSON.generate(@json) end def reblogged_by_account_ids diff --git a/app/lib/admin/metrics/dimension/software_versions_dimension.rb b/app/lib/admin/metrics/dimension/software_versions_dimension.rb index 6c4de0e3ec..3e81579584 100644 --- a/app/lib/admin/metrics/dimension/software_versions_dimension.rb +++ b/app/lib/admin/metrics/dimension/software_versions_dimension.rb @@ -88,7 +88,7 @@ class Admin::Metrics::Dimension::SoftwareVersionsDimension < Admin::Metrics::Dim value: version, human_value: version, } - rescue Terrapin::CommandNotFoundError, Terrapin::ExitStatusError, Oj::ParseError + rescue Terrapin::CommandNotFoundError, Terrapin::ExitStatusError, JSON::ParserError nil end end diff --git a/app/lib/translation_service/deepl.rb b/app/lib/translation_service/deepl.rb index 59c255a7ce..98536fe2de 100644 --- a/app/lib/translation_service/deepl.rb +++ b/app/lib/translation_service/deepl.rb @@ -78,7 +78,7 @@ class TranslationService::DeepL < TranslationService provider: 'DeepL.com' ) end - rescue Oj::ParseError + rescue JSON::ParserError raise UnexpectedResponseError end end diff --git a/app/lib/translation_service/libre_translate.rb b/app/lib/translation_service/libre_translate.rb index b97f334233..ffcd4ed78c 100644 --- a/app/lib/translation_service/libre_translate.rb +++ b/app/lib/translation_service/libre_translate.rb @@ -55,7 +55,7 @@ class TranslationService::LibreTranslate < TranslationService provider: 'LibreTranslate' ) end - rescue Oj::ParseError + rescue JSON::ParserError raise UnexpectedResponseError end end diff --git a/app/lib/video_metadata_extractor.rb b/app/lib/video_metadata_extractor.rb index adef0edb86..3a0f506368 100644 --- a/app/lib/video_metadata_extractor.rb +++ b/app/lib/video_metadata_extractor.rb @@ -9,7 +9,7 @@ class VideoMetadataExtractor @metadata = JSON.parse(ffmpeg_command_output, symbolize_names: true) parse_metadata - rescue Terrapin::ExitStatusError, Oj::ParseError + rescue Terrapin::ExitStatusError, JSON::ParserError @invalid = true rescue Terrapin::CommandNotFoundError raise Paperclip::Errors::CommandNotFoundError, 'Could not run the `ffprobe` command. Please install ffmpeg.' # rubocop:disable I18n/RailsI18n/DecorateString -- This error is not user-facing diff --git a/app/lib/webfinger.rb b/app/lib/webfinger.rb index e887de17c7..aa5bcbe2a7 100644 --- a/app/lib/webfinger.rb +++ b/app/lib/webfinger.rb @@ -57,7 +57,7 @@ class Webfinger def perform Response.new(@uri, body_from_webfinger) - rescue Oj::ParseError + rescue JSON::ParserError raise Webfinger::Error, "Invalid JSON in response for #{@uri}" rescue Addressable::URI::InvalidURIError raise Webfinger::Error, "Invalid URI for #{@uri}" diff --git a/app/lib/webhooks/payload_renderer.rb b/app/lib/webhooks/payload_renderer.rb index a797224496..1be4842cbf 100644 --- a/app/lib/webhooks/payload_renderer.rb +++ b/app/lib/webhooks/payload_renderer.rb @@ -10,7 +10,7 @@ class Webhooks::PayloadRenderer def get(path) value = @document.dig(*parse_path(path)) - string = Oj.dump(value) + string = JSON.generate(value) # We want to make sure people can use the variable inside # other strings, so it can't be wrapped in quotes. diff --git a/app/services/activitypub/fetch_remote_actor_service.rb b/app/services/activitypub/fetch_remote_actor_service.rb index 560cf424e1..1fb3f45ce5 100644 --- a/app/services/activitypub/fetch_remote_actor_service.rb +++ b/app/services/activitypub/fetch_remote_actor_service.rb @@ -19,7 +19,7 @@ class ActivityPub::FetchRemoteActorService < BaseService else body_to_json(prefetched_body, compare_id: uri) end - rescue Oj::ParseError + rescue JSON::ParserError raise Error, "Error parsing JSON-LD document #{uri}" end diff --git a/app/services/activitypub/process_account_service.rb b/app/services/activitypub/process_account_service.rb index e23f4a15bb..fb26992bf4 100644 --- a/app/services/activitypub/process_account_service.rb +++ b/app/services/activitypub/process_account_service.rb @@ -64,7 +64,7 @@ class ActivityPub::ProcessAccountService < BaseService end @account - rescue Oj::ParseError + rescue JSON::ParserError nil end diff --git a/app/services/activitypub/process_collection_service.rb b/app/services/activitypub/process_collection_service.rb index d9ba5d5822..2b5043dc66 100644 --- a/app/services/activitypub/process_collection_service.rb +++ b/app/services/activitypub/process_collection_service.rb @@ -38,7 +38,7 @@ class ActivityPub::ProcessCollectionService < BaseService else process_items [@json] end - rescue Oj::ParseError + rescue JSON::ParserError nil end diff --git a/app/services/software_update_check_service.rb b/app/services/software_update_check_service.rb index e3bc112964..aa2eadd94c 100644 --- a/app/services/software_update_check_service.rb +++ b/app/services/software_update_check_service.rb @@ -22,7 +22,7 @@ class SoftwareUpdateCheckService < BaseService Request.new(:get, "#{api_url}?version=#{version}").add_headers('Accept' => 'application/json', 'User-Agent' => 'Mastodon update checker').perform do |res| return JSON.parse(res.body_with_limit) if res.code == 200 end - rescue *Mastodon::HTTP_CONNECTION_ERRORS, Oj::ParseError + rescue *Mastodon::HTTP_CONNECTION_ERRORS, JSON::ParserError nil end diff --git a/app/workers/scheduler/self_destruct_scheduler.rb b/app/workers/scheduler/self_destruct_scheduler.rb index d7aaef56e7..93f8d19f16 100644 --- a/app/workers/scheduler/self_destruct_scheduler.rb +++ b/app/workers/scheduler/self_destruct_scheduler.rb @@ -61,7 +61,7 @@ class Scheduler::SelfDestructScheduler adapter: ActivityPub::Adapter ).as_json - json = Oj.dump(ActivityPub::LinkedDataSignature.new(payload).sign!(account)) + json = JSON.generate(ActivityPub::LinkedDataSignature.new(payload).sign!(account)) ActivityPub::DeliveryWorker.push_bulk(inboxes, limit: 1_000) do |inbox_url| [json, account.id, inbox_url] diff --git a/config/locales/activerecord.es-AR.yml b/config/locales/activerecord.es-AR.yml index 927f9e4742..4aadbe352d 100644 --- a/config/locales/activerecord.es-AR.yml +++ b/config/locales/activerecord.es-AR.yml @@ -26,7 +26,7 @@ es-AR: fields: fields_with_values_missing_labels: contiene valores con etiquetas faltantes username: - invalid: sólo letras, números y subguiones ("_") + invalid: solo letras, números y subguiones ("_") reserved: está reservado admin/webhook: attributes: diff --git a/config/locales/devise.es-AR.yml b/config/locales/devise.es-AR.yml index a4084441a9..5e8eeead33 100644 --- a/config/locales/devise.es-AR.yml +++ b/config/locales/devise.es-AR.yml @@ -49,7 +49,7 @@ es-AR: subject: 'Mastodon: instrucciones para cambiar la contraseña' title: Cambiar contraseña two_factor_disabled: - explanation: Ahora es posible iniciar sesión utilizando sólo la dirección de correo electrónico y la contraseña. + explanation: Ahora es posible iniciar sesión utilizando solo la dirección de correo electrónico y la contraseña. subject: 'Mastodon: autenticación de dos factores, deshabilitada' subtitle: Se deshabilitó la autenticación de dos factores para tu cuenta. title: 2FA deshabilitada @@ -76,7 +76,7 @@ es-AR: title: Se eliminó una de tus llaves de seguridad webauthn_disabled: explanation: Se deshabilitó la autenticación con claves de seguridad para tu cuenta. - extra: Ahora es posible iniciar sesión utilizando sólo la clave numérica ("token") generada por la aplicación TOTP emparejada. + extra: Ahora es posible iniciar sesión utilizando solo la clave numérica ("token") generada por la aplicación TOTP emparejada. subject: 'Mastodon: autenticación con llaves de seguridad, deshabilitada' title: Llaves de seguridad deshabilitadas webauthn_enabled: diff --git a/config/locales/doorkeeper.es-AR.yml b/config/locales/doorkeeper.es-AR.yml index 2c6b17ee84..d9a6f1df5e 100644 --- a/config/locales/doorkeeper.es-AR.yml +++ b/config/locales/doorkeeper.es-AR.yml @@ -25,7 +25,7 @@ es-AR: edit: Editar submit: Enviar confirmations: - destroy: "¿Estás seguro?" + destroy: "¿Continuar?" edit: title: Editar aplicación form: @@ -69,7 +69,7 @@ es-AR: buttons: revoke: Revocar confirmations: - revoke: "¿Estás seguro?" + revoke: "¿Continuar?" index: authorized_at: Autorizado el %{date} description_html: Estas son aplicaciones que pueden acceder a tu cuenta usando la API. Si hay aplicaciones que no reconocés acá, o que funcionan de forma sospechosa, podés revocar su acceso. @@ -118,9 +118,9 @@ es-AR: notice: Aplicación revocada. grouped_scopes: access: - read: Acceso de sólo lectura + read: Acceso de solo lectura read/write: Acceso de lectura y escritura - write: Acceso de sólo escritura + write: Acceso de solo escritura title: accounts: Cuentas admin/accounts: Administración de cuentas diff --git a/config/locales/es-AR.yml b/config/locales/es-AR.yml index bbc1fd78e3..c701683e82 100644 --- a/config/locales/es-AR.yml +++ b/config/locales/es-AR.yml @@ -40,7 +40,7 @@ es-AR: add_email_domain_block: Bloquear el dominio del correo electrónico approve: Aprobar approved_msg: Se aprobó exitosamente la solicitud de registro de %{username} - are_you_sure: "¿Estás seguro?" + are_you_sure: "¿Continuar?" avatar: Avatar by_domain: Dominio change_email: @@ -144,7 +144,7 @@ es-AR: search_same_ip: Otros usuarios con la misma dirección IP security: Seguridad security_measures: - only_password: Sólo contraseña + only_password: Solo contraseña password_and_2fa: Contraseña y 2FA sensitive: Forzar como sensible sensitized: Marcado como sensible @@ -379,7 +379,7 @@ es-AR: not_permitted: No tenés permiso para realizar esta acción overwrite: Sobreescribir shortcode: Código corto - shortcode_hint: Al menos 2 caracteres, sólo caracteres alfanuméricos y subguiones ("_") + shortcode_hint: Al menos 2 caracteres, solo caracteres alfanuméricos y subguiones ("_") title: Emojis personalizados uncategorized: Sin categoría unlist: No listar @@ -559,7 +559,7 @@ es-AR: back_to_limited: Limitados back_to_warning: Advertencia by_domain: Dominio - confirm_purge: "¿Estás seguro que querés eliminar permanentemente los datos de este dominio?" + confirm_purge: "¿De verdad querés eliminar permanentemente los datos de este dominio?" content_policies: comment: Nota interna description_html: Podés definir políticas de contenido que se aplicarán a todas las cuentas de este dominio y a cualquiera de sus subdominios. @@ -675,16 +675,16 @@ es-AR: mark_as_sensitive_description_html: Los archivos de medios en los mensajes denunciados se marcarán como sensibles y se registrará un incumplimiento para ayudarte a escalar las futuras infracciones de la misma cuenta. other_description_html: Ver más opciones para controlar el comportamiento de la cuenta y personalizar la comunicación de la cuenta denunciada. resolve_description_html: No se tomarán medidas contra la cuenta denunciada, no se registrará el incumplimiento, y se cerrará la denuncia. - silence_description_html: La cuenta será visible sólo para quienes ya la siguen o la busquen manualmente, limitando severamente su alcance. Siempre puede ser revertido. Esto cierra todas las denuncias contra esta cuenta. + silence_description_html: La cuenta será visible solo para quienes ya la siguen o la busquen manualmente, limitando severamente su alcance. Siempre puede ser revertido. Esto cierra todas las denuncias contra esta cuenta. suspend_description_html: La cuenta y todos sus contenidos serán inaccesibles y finalmente eliminados, e interactuar con ella será imposible. Revertible en 30 días. Esto cierra todas las denuncias contra esta cuenta. actions_description_html: Decidí qué medidas tomar para resolver esta denuncia. Si tomás una acción punitiva contra la cuenta denunciada, se le enviará a dicha cuenta una notificación por correo electrónico, excepto cuando se seleccione la categoría Spam. - actions_description_remote_html: Decidí qué medidas tomar para resolver esta denuncia. Esto sólo afectará la forma en que tu servidor se comunica con esta cuenta remota y maneja su contenido. + actions_description_remote_html: Decidí qué medidas tomar para resolver esta denuncia. Esto solo afectará la forma en que tu servidor se comunica con esta cuenta remota y maneja su contenido. actions_no_posts: Esta denuncia no tiene ningún mensaje asociado para eliminar add_to_report: Agregar más a la denuncia already_suspended_badges: local: Ya suspendido en este servidor remote: Ya suspendido en su servidor - are_you_sure: "¿Estás seguro?" + are_you_sure: "¿Continuar?" assign_to_self: Asignármela a mí assigned: Moderador asignado by_target_domain: Dominio de la cuenta denunciada @@ -738,7 +738,7 @@ es-AR: actions: delete_html: Eliminar los mensajes ofensivos mark_as_sensitive_html: Marcar los mensajes ofensivos como sensibles - silence_html: Limitar severamente el alcance de @%{acct} haciendo que su perfil y contenido sólo sean visibles para las personas que ya lo siguen o que busquen manualmente su perfil + silence_html: Limitar severamente el alcance de @%{acct} haciendo que su perfil y contenido solo sean visibles para las personas que ya lo siguen o que busquen manualmente su perfil suspend_html: Suspender @%{acct}, haciendo su perfil y contenido inaccesibles, e imposibilitando la interacción con la cuenta close_report: 'Marcar denuncia #%{id} como resuelta' close_reports_html: Marcar todas las denuncias contra @%{acct} como resueltas @@ -1054,16 +1054,16 @@ es-AR: trends: allow: Permitir approved: Aprobadas - confirm_allow: "¿Estás seguro de que querés permitir las etiquetas seleccionadas?" - confirm_disallow: "¿Estás seguro de que no querés permitir las etiquetas seleccionadas?" + confirm_allow: "¿De verdad querés permitir las etiquetas seleccionadas?" + confirm_disallow: "¿De verdad no querés permitir las etiquetas seleccionadas?" disallow: Rechazar links: allow: Permitir enlace allow_provider: Permitir medio - confirm_allow: "¿Estás seguro de que querés permitir los enlaces seleccionados?" - confirm_allow_provider: "¿Estás seguro de que querés permitir los proveedores seleccionados?" - confirm_disallow: "¿Estás seguro de que no querés permitir los enlaces seleccionados?" - confirm_disallow_provider: "¿Estás seguro de que no querés permitir los proveedores seleccionados?" + confirm_allow: "¿De verdad querés permitir los enlaces seleccionados?" + confirm_allow_provider: "¿De verdad querés permitir los proveedores seleccionados?" + confirm_disallow: "¿De verdad no querés permitir los enlaces seleccionados?" + confirm_disallow_provider: "¿De verdad no querés permitir los proveedores seleccionados?" description_html: Estos son enlaces que actualmente están siendo muy compartidos por cuentas desde las que tu servidor ve los mensajes. Esto puede ayudar a tus usuarios a averiguar qué está pasando en el mundo. No hay enlaces que se muestren públicamente hasta que autoricés al publicador. También podés permitir o rechazar enlaces individuales. disallow: Rechazar enlace disallow_provider: Rechazar medio @@ -1076,7 +1076,7 @@ es-AR: title: Enlaces en tendencia usage_comparison: Compartido %{today} veces hoy, comparado con la/s %{yesterday} vez/veces de ayer not_allowed_to_trend: No se permite la tendencia - only_allowed: Sólo permitidas + only_allowed: Solo permitidas pending_review: Revisión pendiente preview_card_providers: allowed: Los enlaces de este medio pueden ser tendencia @@ -1087,10 +1087,10 @@ es-AR: statuses: allow: Permitir mensaje allow_account: Permitir autor - confirm_allow: "¿Estás seguro de que querés permitir los estados seleccionados?" - confirm_allow_account: "¿Estás seguro de que querés permitir las cuentas seleccionadas?" - confirm_disallow: "¿Estás seguro de que no querés permitir los estados seleccionados?" - confirm_disallow_account: "¿Estás seguro de que no querés permitir las cuentas seleccionadas?" + confirm_allow: "¿De verdad querés permitir los estados seleccionados?" + confirm_allow_account: "¿De verdad querés permitir las cuentas seleccionadas?" + confirm_disallow: "¿De verdad no querés permitir los estados seleccionados?" + confirm_disallow_account: "¿De verdad no querés permitir las cuentas seleccionadas?" description_html: Estos son mensajes que tu servidor detecta que están siendo compartidos y marcados como favoritos muchas veces en este momento. Esto puede ayudar a tus usuarios nuevos y retornantes a encontrar más cuentas para seguir. No hay mensajes que se muestren públicamente hasta que aprobés al autor, y el autor permita que su cuenta sea sugerida a otros. También podés permitir o rechazar mensajes individuales. disallow: Rechazar mensaje disallow_account: Rechazar autor @@ -1632,7 +1632,7 @@ es-AR: author_html: Por %{name} potentially_sensitive_content: action: Clic para mostrar - confirm_visit: "¿Está seguro de que querés abrir este enlace?" + confirm_visit: "¿De verdad querés abrir este enlace?" hide_button: Ocultar label: Contenido potencialmente sensible lists: @@ -1820,9 +1820,9 @@ es-AR: title: Estás dejando %{instance}. relationships: activity: Actividad de la cuenta - confirm_follow_selected_followers: "¿Estás seguro que querés seguir a los seguidores seleccionados?" - confirm_remove_selected_followers: "¿Estás seguro que querés quitar a los seguidores seleccionados?" - confirm_remove_selected_follows: "¿Estás seguro que querés quitar a las cuentas seguidas seleccionadas?" + confirm_follow_selected_followers: "¿De verdad querés seguir a los seguidores seleccionados?" + confirm_remove_selected_followers: "¿De verdad querés quitar a los seguidores seleccionados?" + confirm_remove_selected_follows: "¿De verdad querés quitar a las cuentas seguidas seleccionadas?" dormant: Inactivas follow_failure: No se pudieron seguir algunas de las cuentas seleccionadas. follow_selected_followers: Seguir a los seguidores seleccionados @@ -1965,7 +1965,7 @@ es-AR: quoted_user_not_mentioned: No se puede citar a un usuario no mencionado en un mensaje de mención privada. over_character_limit: se excedió el límite de %{max} caracteres pin_errors: - direct: Los mensajes que sólo son visibles para los usuarios mencionados no pueden ser fijados + direct: Los mensajes que solo son visibles para los usuarios mencionados no pueden ser fijados limit: Ya fijaste el número máximo de mensajes ownership: No se puede fijar el mensaje de otra cuenta reblog: No se puede fijar una adhesión @@ -2118,7 +2118,7 @@ es-AR: disable: Ya no podés usar tu cuenta, pero tu perfil y el resto de datos permanecen intactos. Podés solicitar una copia de seguridad de tus datos, cambiar la configuración de tu cuenta, o eliminarla. mark_statuses_as_sensitive: Algunos de tus mensajes fueron marcados como sensibles por los moderadores de %{instance}. Esto significa que la gente tendrá que hacer clic o darle un toque a los medios en los mensajes antes de que se muestre una vista previa. Podés marcar los medios como sensibles vos mismo cuando publiqués en el futuro. sensitive: A partir de ahora, todos tus archivos subidos serán marcados como sensibles y ocultos tras una advertencia en la que habrá que hacer clic. - silence: Todavía podés usar tu cuenta, pero sólo las personas que te están siguiendo verán tus publicaciones en este servidor, y podrías ser excluido de varias funciones de descubrimiento. Sin embargo, otras cuentas podrán seguirte manualmente. + silence: Todavía podés usar tu cuenta, pero solo las personas que te están siguiendo verán tus publicaciones en este servidor, y podrías ser excluido de varias funciones de descubrimiento. Sin embargo, otras cuentas podrán seguirte manualmente. suspend: Ya no podés usar tu cuenta, y tu perfil y el resto de datos ya no son accesibles. Todavía podés iniciar sesión para solicitar una copia de seguridad de tus datos, hasta que estos sean eliminados por completo en unos 30 días, aunque conservaremos algunos datos básicos para impedir que esquivés la suspensión. reason: 'Motivo:' statuses: 'Mensajes citados:' @@ -2200,7 +2200,7 @@ es-AR: error: Hubo un problema al agregar tu llave de seguridad. Por favor, intentá de nuevo. success: Se agregó exitosamente tu llave de seguridad. delete: Eliminar - delete_confirmation: "¿Estás seguro que querés eliminar esta llave de seguridad?" + delete_confirmation: "¿De verdad querés eliminar esta llave de seguridad?" description_html: Si habilitás la autenticación de llave de seguridad, entonces en el inicio de sesión se te pedirá que usés una de tus llaves de seguridad. destroy: error: Hubo un problema al eliminar tu llave de seguridad. Por favor, intentá de nuevo. diff --git a/config/locales/simple_form.es-AR.yml b/config/locales/simple_form.es-AR.yml index 5a70754484..62961d7817 100644 --- a/config/locales/simple_form.es-AR.yml +++ b/config/locales/simple_form.es-AR.yml @@ -31,13 +31,13 @@ es-AR: suspend: Evitá cualquier interacción desde o hacia esta cuenta y eliminá su contenido. Revertible en 30 días. Esto cierra todas las denuncias contra esta cuenta. warning_preset_id: Opcional. Todavía podés agregar texto personalizado al final del preajuste announcement: - all_day: Cuando esté seleccionado, sólo se mostrarán las fechas del rango de tiempo + all_day: Cuando esté seleccionado, solo se mostrarán las fechas del rango de tiempo ends_at: Opcional. El anuncio desaparecerá automáticamente en este momento scheduled_at: Dejar en blanco para publicar el anuncio inmediatamente starts_at: Opcional. En caso de que tu anuncio esté vinculado a un rango de tiempo específico text: Podés usar sintaxis de mensajes. Por favor, tené en cuenta el espacio que ocupará el anuncio en la pantalla del usuario appeal: - text: Sólo podés apelar un incumplimiento una vez + text: Solo podés apelar un incumplimiento una vez defaults: autofollow: Los usuarios que se registren mediante la invitación te seguirán automáticamente avatar: WEBP, PNG, GIF o JPG. Máximo %{size}. Será escalado a %{dimensions}px @@ -45,7 +45,7 @@ es-AR: context: Uno o múltiples contextos en los que debe aplicarse el filtro current_password: Por razones de seguridad, por favor, ingresá la contraseña de la cuenta actual current_username: Para confirmar, por favor, ingresá el nombre de usuario de la cuenta actual - digest: Sólo enviado tras un largo periodo de inactividad, y sólo si recibiste mensajes personales en tu ausencia + digest: Solo enviado tras un largo periodo de inactividad, y solo si recibiste mensajes personales en tu ausencia email: Se te enviará un correo electrónico de confirmación header: WEBP, PNG, GIF o JPG. Máximo %{size}. Será escalado a %{dimensions}px inbox_url: Copiá la dirección web desde la página principal del relé que querés usar @@ -55,7 +55,7 @@ es-AR: phrase: Se aplicará sin importar las mayúsculas o las advertencias de contenido de un mensaje scopes: Qué APIs de la aplicación tendrán acceso. Si seleccionás el alcance de nivel más alto, no necesitás seleccionar las individuales. setting_advanced_layout: Mostrar Mastodon como una disposición de varias columnas, permitiéndote ver la línea temporal, las notificaciones y una tercera columna de tu elección. No recomendado para pantallas pequeñas. - setting_aggregate_reblogs: No mostrar nuevas adhesiones de los mensajes que fueron recientemente adheridos (sólo afecta a las adhesiones recibidas recientemente) + setting_aggregate_reblogs: No mostrar nuevas adhesiones de los mensajes que fueron recientemente adheridos (solo afecta a las adhesiones recibidas recientemente) setting_always_send_emails: Normalmente las notificaciones por correo electrónico no se enviarán cuando estés usando Mastodon activamente setting_boost_modal: Al estar activado, la adhesión abrirá primero un diálogo de confirmación en el que podés cambiar su visibilidad. setting_default_quote_policy_private: Los mensajes solo para seguidores redactados en Mastodon no pueden ser citados por otras cuentas. @@ -70,7 +70,7 @@ es-AR: setting_use_blurhash: Los gradientes se basan en los colores de las imágenes ocultas pero haciendo borrosos los detalles setting_use_pending_items: Ocultar actualizaciones de la línea temporal detrás de un clic en lugar de desplazar automáticamente el flujo username: Podés usar letras, números y subguiones ("_") - whole_word: Cuando la palabra clave o frase es sólo alfanumérica, sólo será aplicado si coincide con toda la palabra + whole_word: Cuando la palabra clave o frase sea solo alfanumérica, solamente será aplicado si coincide con toda la palabra domain_allow: domain: Este dominio podrá recolectar datos de este servidor, y los datos entrantes serán procesados y archivados email_domain_block: @@ -97,7 +97,7 @@ es-AR: mascot: Reemplaza la ilustración en la interface web avanzada. media_cache_retention_period: Los archivos de medios de mensajes publicados por usuarios remotos se almacenan en la memoria caché en tu servidor. Cuando se establece un valor positivo, los medios se eliminarán después del número especificado de días. Si los datos multimedia se solicitan después de eliminarse, se volverán a descargar, si es que el contenido fuente todavía está disponible. Debido a restricciones en la frecuencia con la que las tarjetas de previsualización de enlace consultan a sitios web de terceros, se recomienda establecer este valor a, al menos, 14 días, o las tarjetas de previsualización de enlaces no se actualizarán a pedido antes de ese momento. min_age: Se pedirá a los usuarios que confirmen su fecha de nacimiento durante el registro - peers_api_enabled: Una lista de nombres de dominio que este servidor ha encontrado en el Fediverso. Acá no se incluye ningún dato sobre si federás con un servidor determinado, sólo que tu servidor lo conoce. Esto es usado por los servicios que recopilan estadísticas sobre la federación en un sentido general. + peers_api_enabled: Una lista de nombres de dominio que este servidor ha encontrado en el Fediverso. Acá no se incluye ningún dato sobre si federás con un servidor determinado, solo que tu servidor lo conoce. Esto es usado por los servicios que recopilan estadísticas sobre la federación en un sentido general. profile_directory: El directorio de perfiles lista a todos los usuarios que han optado a que su cuenta pueda ser descubierta. require_invite_text: Cuando registros aprobación manual, hacé que la solicitud de invitación "¿Por qué querés unirte?" sea obligatoria, en vez de opcional site_contact_email: Cómo la gente puede estar en contacto con vos para consultas legales o de ayuda. @@ -137,7 +137,7 @@ es-AR: indexable: Tu página de perfil podría aparecer en los resultados de búsqueda en Google, Bing y otros motores de búsqueda. show_application: Sin embargo, siempre podrás ver desde qué aplicación se envió tu mensaje. tag: - name: Sólo podés cambiar la capitalización de las letras, por ejemplo, para que sea más legible + name: Solo podés cambiar la capitalización de las letras, por ejemplo, para que sea más legible terms_of_service: changelog: Se puede estructurar con sintaxis Markdown. effective_date: Un plazo razonable puede oscilar entre 10 y 30 días a partir de la fecha de notificación a tus usuarios. @@ -153,7 +153,7 @@ es-AR: jurisdiction: Listá el país donde vive quien paga las facturas. Si es una empresa u otra entidad, enumerá el país donde está basada y la ciudad, región, territorio o provincia/estado, según corresponda. min_age: No debería estar por debajo de la edad mínima requerida por las leyes de su jurisdicción. user: - chosen_languages: Cuando estén marcados, sólo se mostrarán los mensajes en los idiomas seleccionados en las líneas temporales públicas + chosen_languages: Cuando estén marcados, solo se mostrarán los mensajes en los idiomas seleccionados en las líneas temporales públicas date_of_birth: one: Tenemos que asegurarnos de que al menos tenés %{count} años de edad para usar %{domain}. No almacenaremos esta información. other: Tenemos que asegurarnos de que al menos tenés %{count} años de edad para usar %{domain}. No almacenaremos esta información. @@ -163,7 +163,7 @@ es-AR: highlighted: Esto hace que el rol sea públicamente visible name: Nombre público del rol, si el rol se establece para que se muestre como una insignia permissions_as_keys: Los usuarios con este rol tendrán acceso a… - position: Un rol más alto decide la resolución de conflictos en ciertas situaciones. Ciertas acciones sólo pueden llevarse a cabo en roles con prioridad inferior + position: Un rol más alto decide la resolución de conflictos en ciertas situaciones. Ciertas acciones solo pueden llevarse a cabo en roles con prioridad inferior require_2fa: Los usuarios con este rol serán requeridos para configurar la autenticación de dos factores para usar Mastodon username_block: allow_with_approval: En lugar de impedir el registro total, los registros coincidentes requerirán tu aprobación diff --git a/config/locales/zh-CN.yml b/config/locales/zh-CN.yml index 87ada1c7ad..da5d7ae2c9 100644 --- a/config/locales/zh-CN.yml +++ b/config/locales/zh-CN.yml @@ -496,7 +496,7 @@ zh-CN: debug: callbacks: created_at: 创建于 - delete: 刪除 + delete: 删除 ip: IP 地址 request_body: 请求正文 title: 调试回调 @@ -504,7 +504,7 @@ zh-CN: active: 有效 base_url: 基础 URL callback: 回调 - delete: 刪除 + delete: 删除 edit: 编辑提供商 finish_registration: 完成注册 name: 名称 @@ -930,7 +930,7 @@ zh-CN: with_media: 含有媒体文件 strikes: actions: - delete_statuses: "%{name} 刪除了 %{target} 的嘟文" + delete_statuses: "%{name} 删除了 %{target} 的嘟文" disable: "%{name} 冻结了用户 %{target}" mark_statuses_as_sensitive: "%{name} 已将 %{target} 的嘟文标记为敏感内容" none: "%{name} 向 %{target} 发送了警告" diff --git a/db/migrate/20180608213548_reject_following_blocked_users.rb b/db/migrate/20180608213548_reject_following_blocked_users.rb index a82bff62b4..3a765803f7 100644 --- a/db/migrate/20180608213548_reject_following_blocked_users.rb +++ b/db/migrate/20180608213548_reject_following_blocked_users.rb @@ -28,7 +28,7 @@ class RejectFollowingBlockedUsers < ActiveRecord::Migration[5.2] next follow.destroy! if blocked_account.local? - reject_follow_json = Oj.dump(ActivityPub::LinkedDataSignature.new(ActiveModelSerializers::SerializableResource.new(follow, serializer: ActivityPub::RejectFollowSerializer, adapter: ActivityPub::Adapter).as_json).sign!(followed_account)) + reject_follow_json = JSON.generate(ActivityPub::LinkedDataSignature.new(ActiveModelSerializers::SerializableResource.new(follow, serializer: ActivityPub::RejectFollowSerializer, adapter: ActivityPub::Adapter).as_json).sign!(followed_account)) ActivityPub::DeliveryWorker.perform_async(reject_follow_json, followed_account, blocked_account.inbox_url) diff --git a/db/migrate/20230215074423_move_user_settings.rb b/db/migrate/20230215074423_move_user_settings.rb index e94f04138a..2a2a426713 100644 --- a/db/migrate/20230215074423_move_user_settings.rb +++ b/db/migrate/20230215074423_move_user_settings.rb @@ -90,7 +90,7 @@ class MoveUserSettings < ActiveRecord::Migration[6.1] end end - user.update_column('settings', Oj.dump(user_settings)) + user.update_column('settings', JSON.generate(user_settings)) end end end diff --git a/db/migrate/20240304090449_migrate_interaction_settings_to_policy.rb b/db/migrate/20240304090449_migrate_interaction_settings_to_policy.rb index ea4cfccdf9..1736d1b17d 100644 --- a/db/migrate/20240304090449_migrate_interaction_settings_to_policy.rb +++ b/db/migrate/20240304090449_migrate_interaction_settings_to_policy.rb @@ -21,7 +21,7 @@ class MigrateInteractionSettingsToPolicy < ActiveRecord::Migration[7.1] private def policy_for_user(user) - deserialized_settings = Oj.load(user.attributes_before_type_cast['settings']) + deserialized_settings = JSON.parse(user.attributes_before_type_cast['settings']) return if deserialized_settings.nil? requires_new_policy = false diff --git a/db/migrate/20250911163952_fill_default_quote_policy_setting.rb b/db/migrate/20250911163952_fill_default_quote_policy_setting.rb index c3d08e68c9..d1aefaf758 100644 --- a/db/migrate/20250911163952_fill_default_quote_policy_setting.rb +++ b/db/migrate/20250911163952_fill_default_quote_policy_setting.rb @@ -8,7 +8,7 @@ class FillDefaultQuotePolicySetting < ActiveRecord::Migration[8.0] def up User.where.not(settings: nil).find_each do |user| - settings = Oj.load(user.attributes_before_type_cast['settings']) + settings = JSON.parse(user.attributes_before_type_cast['settings']) next if settings.nil? should_update_settings = false @@ -26,7 +26,7 @@ class FillDefaultQuotePolicySetting < ActiveRecord::Migration[8.0] should_update_settings = true end - user.update_column('settings', Oj.dump(settings)) if should_update_settings + user.update_column('settings', JSON.generate(settings)) if should_update_settings end end end diff --git a/db/migrate/20260209143308_migrate_user_theme.rb b/db/migrate/20260209143308_migrate_user_theme.rb index 93870055db..71f69705b9 100644 --- a/db/migrate/20260209143308_migrate_user_theme.rb +++ b/db/migrate/20260209143308_migrate_user_theme.rb @@ -8,7 +8,7 @@ class MigrateUserTheme < ActiveRecord::Migration[8.0] def up User.where.not(settings: nil).find_each do |user| - settings = Oj.load(user.attributes_before_type_cast['settings']) + settings = JSON.parse(user.attributes_before_type_cast['settings']) next if settings.nil? || settings['theme'].blank? || %w(system default mastodon-light contrast).exclude?(settings['theme']) case settings['theme'] @@ -25,7 +25,7 @@ class MigrateUserTheme < ActiveRecord::Migration[8.0] settings['theme'] = 'default' - user.update_column('settings', Oj.dump(settings)) + user.update_column('settings', JSON.generate(settings)) end end end diff --git a/db/post_migrate/20230904134623_fix_kmr_locale_settings.rb b/db/post_migrate/20230904134623_fix_kmr_locale_settings.rb index 10e3f1da99..21c69c3521 100644 --- a/db/post_migrate/20230904134623_fix_kmr_locale_settings.rb +++ b/db/post_migrate/20230904134623_fix_kmr_locale_settings.rb @@ -11,11 +11,11 @@ class FixKmrLocaleSettings < ActiveRecord::Migration[7.0] MigrationUser.reset_column_information MigrationUser.where.not(settings: [nil, '{}']).find_each do |user| - user_settings = Oj.load(user.settings) + user_settings = JSON.parse(user.settings) next unless user_settings['default_language'] == 'kmr' user_settings['default_language'] = 'ku' - user.update!(settings: Oj.dump(user_settings)) + user.update!(settings: JSON.generate(user_settings)) end MigrationUser.where.not(chosen_languages: nil).where('chosen_languages && ?', '{kmr}').find_each do |user| diff --git a/db/post_migrate/20240321160706_migrate_interaction_settings_to_policy_again.rb b/db/post_migrate/20240321160706_migrate_interaction_settings_to_policy_again.rb index c789b63951..92dbd90c79 100644 --- a/db/post_migrate/20240321160706_migrate_interaction_settings_to_policy_again.rb +++ b/db/post_migrate/20240321160706_migrate_interaction_settings_to_policy_again.rb @@ -21,7 +21,7 @@ class MigrateInteractionSettingsToPolicyAgain < ActiveRecord::Migration[7.1] private def policy_for_user(user) - deserialized_settings = Oj.load(user.attributes_before_type_cast['settings']) + deserialized_settings = JSON.parse(user.attributes_before_type_cast['settings']) return if deserialized_settings.nil? return if user.notification_policy.present? diff --git a/lib/tasks/emojis.rake b/lib/tasks/emojis.rake index 053dfd83bd..3b99a102d1 100644 --- a/lib/tasks/emojis.rake +++ b/lib/tasks/emojis.rake @@ -99,7 +99,7 @@ namespace :emojis do map = map.sort { |a, b| a[0].size <=> b[0].size }.to_h - File.write(dest, Oj.dump(map)) + File.write(dest, JSON.dump(map)) puts "Wrote emojo to destination! (#{dest})" end diff --git a/spec/helpers/json_ld_helper_spec.rb b/spec/helpers/json_ld_helper_spec.rb index f216588d97..e26e9cd637 100644 --- a/spec/helpers/json_ld_helper_spec.rb +++ b/spec/helpers/json_ld_helper_spec.rb @@ -112,6 +112,11 @@ RSpec.describe JsonLdHelper do expect(fetch_resource_without_id_validation('https://host.test/')).to be_nil end + it 'returns nil if the body is not parsable' do + stub_request(:get, 'https://host.test/').to_return(status: 200, body: 'XXX', headers: { 'Content-Type': 'application/activity+json' }) + expect(fetch_resource_without_id_validation('https://host.test/')).to be_nil + end + it 'returns hash' do stub_request(:get, 'https://host.test/').to_return(status: 200, body: '{}', headers: { 'Content-Type': 'application/activity+json' }) expect(fetch_resource_without_id_validation('https://host.test/')).to eq({}) diff --git a/spec/lib/translation_service/deepl_spec.rb b/spec/lib/translation_service/deepl_spec.rb index 4797a3dc63..a6a0ad15a2 100644 --- a/spec/lib/translation_service/deepl_spec.rb +++ b/spec/lib/translation_service/deepl_spec.rb @@ -19,6 +19,19 @@ RSpec.describe TranslationService::DeepL do end describe '#translate' do + context 'with invalid body response' do + before do + stub_request(:post, 'https://api.deepl.com/v2/translate') + .with(body: 'text=Hasta+la+vista&source_lang=ES&target_lang=en&tag_handling=html') + .to_return(body: 'XXX') + end + + it 'handles error and re-raises' do + expect { service.translate(['Hasta la vista'], 'es', 'en') } + .to raise_error(TranslationService::UnexpectedResponseError) + end + end + it 'returns translation with specified source language' do stub_request(:post, 'https://api.deepl.com/v2/translate') .with(body: 'text=Hasta+la+vista&source_lang=ES&target_lang=en&tag_handling=html') diff --git a/spec/lib/translation_service/libre_translate_spec.rb b/spec/lib/translation_service/libre_translate_spec.rb index 90966a8ebf..4df2a2076c 100644 --- a/spec/lib/translation_service/libre_translate_spec.rb +++ b/spec/lib/translation_service/libre_translate_spec.rb @@ -29,6 +29,19 @@ RSpec.describe TranslationService::LibreTranslate do end describe '#translate' do + context 'with invalid body response' do + before do + stub_request(:post, 'https://libretranslate.example.com/translate') + .with(body: '{"q":["Hasta la vista"],"source":"es","target":"en","format":"html","api_key":"my-api-key"}') + .to_return(body: 'XXX') + end + + it 'handles error and re-raises' do + expect { service.translate(['Hasta la vista'], 'es', 'en') } + .to raise_error(TranslationService::UnexpectedResponseError) + end + end + it 'returns translation with specified source language' do stub_request(:post, 'https://libretranslate.example.com/translate') .with(body: '{"q":["Hasta la vista"],"source":"es","target":"en","format":"html","api_key":"my-api-key"}') diff --git a/spec/lib/webfinger_spec.rb b/spec/lib/webfinger_spec.rb index 7f2251b858..68ce841a53 100644 --- a/spec/lib/webfinger_spec.rb +++ b/spec/lib/webfinger_spec.rb @@ -37,6 +37,16 @@ RSpec.describe Webfinger do end end + context 'when response body is not parsable' do + it 'raises an error' do + stub_request(:get, 'https://example.com/.well-known/webfinger?resource=acct:alice@example.com') + .to_return(body: 'XXX', headers: { 'Content-Type': 'application/jrd+json' }) + + expect { subject } + .to raise_error(Webfinger::Error) + end + end + context 'when webfinger fails and host meta is used' do before { stub_request(:get, 'https://example.com/.well-known/webfinger?resource=acct:alice@example.com').to_return(status: 404) } diff --git a/spec/support/examples/models/concerns/account_avatar.rb b/spec/models/account/avatar_spec.rb similarity index 77% rename from spec/support/examples/models/concerns/account_avatar.rb rename to spec/models/account/avatar_spec.rb index c6cc4e75a5..05d5c16e60 100644 --- a/spec/support/examples/models/concerns/account_avatar.rb +++ b/spec/models/account/avatar_spec.rb @@ -1,24 +1,24 @@ # frozen_string_literal: true -RSpec.shared_examples 'AccountAvatar' do |fabricator| +RSpec.describe Account::Avatar do describe 'static avatars', :attachment_processing do describe 'with a square GIF' do it 'creates a png static style' do - account = Fabricate(fabricator, avatar: attachment_fixture('avatar.gif')) + account = Fabricate(:account, avatar: attachment_fixture('avatar.gif')) expect(account.avatar_static_url).to_not eq account.avatar_original_url end end describe 'with a higher-than-wide GIF' do it 'creates a png static style' do - account = Fabricate(fabricator, avatar: attachment_fixture('avatar-high.gif')) + account = Fabricate(:account, avatar: attachment_fixture('avatar-high.gif')) expect(account.avatar_static_url).to_not eq account.avatar_original_url end end describe 'when non-GIF' do it 'does not create extra static style' do - account = Fabricate(fabricator, avatar: attachment_fixture('attachment.jpg')) + account = Fabricate(:account, avatar: attachment_fixture('attachment.jpg')) expect(account.avatar_static_url).to eq account.avatar_original_url end end @@ -26,7 +26,7 @@ RSpec.shared_examples 'AccountAvatar' do |fabricator| describe 'base64-encoded files', :attachment_processing do let(:base64_attachment) { "data:image/jpeg;base64,#{Base64.encode64(attachment_fixture('attachment.jpg').read)}" } - let(:account) { Fabricate(fabricator, avatar: base64_attachment) } + let(:account) { Fabricate(:account, avatar: base64_attachment) } it 'saves avatar' do expect(account.persisted?).to be true diff --git a/spec/support/examples/models/concerns/account_header.rb b/spec/models/account/header_spec.rb similarity index 84% rename from spec/support/examples/models/concerns/account_header.rb rename to spec/models/account/header_spec.rb index af8d22d633..9faf30a3db 100644 --- a/spec/support/examples/models/concerns/account_header.rb +++ b/spec/models/account/header_spec.rb @@ -1,9 +1,9 @@ # frozen_string_literal: true -RSpec.shared_examples 'AccountHeader' do |fabricator| +RSpec.describe Account::Header do describe 'base64-encoded files', :attachment_processing do let(:base64_attachment) { "data:image/jpeg;base64,#{Base64.encode64(attachment_fixture('attachment.jpg').read)}" } - let(:account) { Fabricate(fabricator, header: base64_attachment) } + let(:account) { Fabricate(:account, header: base64_attachment) } it 'saves header' do expect(account.persisted?).to be true diff --git a/spec/support/examples/models/concerns/account/search.rb b/spec/models/account/search_spec.rb similarity index 78% rename from spec/support/examples/models/concerns/account/search.rb rename to spec/models/account/search_spec.rb index 9d9b499732..a67eddf63d 100644 --- a/spec/support/examples/models/concerns/account/search.rb +++ b/spec/models/account/search_spec.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -RSpec.shared_examples 'Account::Search' do +RSpec.describe Account::Search do describe '.search_for' do before do _missing = Fabricate( @@ -20,7 +20,7 @@ RSpec.shared_examples 'Account::Search' do suspended: true ) - results = described_class.search_for('username') + results = Account.search_for('username') expect(results).to eq [] end @@ -33,7 +33,7 @@ RSpec.shared_examples 'Account::Search' do match.user.update(approved: false) - results = described_class.search_for('username') + results = Account.search_for('username') expect(results).to eq [] end @@ -46,7 +46,7 @@ RSpec.shared_examples 'Account::Search' do match.user.update(confirmed_at: nil) - results = described_class.search_for('username') + results = Account.search_for('username') expect(results).to eq [] end @@ -58,7 +58,7 @@ RSpec.shared_examples 'Account::Search' do domain: 'example.com' ) - results = described_class.search_for('A?l\i:c e') + results = Account.search_for('A?l\i:c e') expect(results).to eq [match] end @@ -70,7 +70,7 @@ RSpec.shared_examples 'Account::Search' do domain: 'example.com' ) - results = described_class.search_for('display') + results = Account.search_for('display') expect(results).to eq [match] end @@ -82,7 +82,7 @@ RSpec.shared_examples 'Account::Search' do domain: 'example.com' ) - results = described_class.search_for('username') + results = Account.search_for('username') expect(results).to eq [match] end @@ -94,20 +94,20 @@ RSpec.shared_examples 'Account::Search' do domain: 'example.com' ) - results = described_class.search_for('example') + results = Account.search_for('example') expect(results).to eq [match] end it 'limits via constant by default' do stub_const('Account::Search::DEFAULT_LIMIT', 1) 2.times.each { Fabricate(:account, display_name: 'Display Name') } - results = described_class.search_for('display') + results = Account.search_for('display') expect(results.size).to eq 1 end it 'accepts arbitrary limits' do 2.times.each { Fabricate(:account, display_name: 'Display Name') } - results = described_class.search_for('display', limit: 1) + results = Account.search_for('display', limit: 1) expect(results.size).to eq 1 end @@ -117,7 +117,7 @@ RSpec.shared_examples 'Account::Search' do { display_name: 'Display Name', username: 'username', domain: 'example.com' }, ].map(&method(:Fabricate).curry(2).call(:account)) - results = described_class.search_for('username') + results = Account.search_for('username') expect(results).to eq matches end end @@ -135,7 +135,7 @@ RSpec.shared_examples 'Account::Search' do ) account.follow!(match) - results = described_class.advanced_search_for('A?l\i:c e', account, limit: 10, following: true) + results = Account.advanced_search_for('A?l\i:c e', account, limit: 10, following: true) expect(results).to eq [match] end @@ -147,7 +147,7 @@ RSpec.shared_examples 'Account::Search' do domain: 'example.com' ) - results = described_class.advanced_search_for('A?l\i:c e', account, limit: 10, following: true) + results = Account.advanced_search_for('A?l\i:c e', account, limit: 10, following: true) expect(results).to eq [] end @@ -160,7 +160,7 @@ RSpec.shared_examples 'Account::Search' do suspended: true ) - results = described_class.advanced_search_for('username', account, limit: 10, following: true) + results = Account.advanced_search_for('username', account, limit: 10, following: true) expect(results).to eq [] end @@ -173,7 +173,7 @@ RSpec.shared_examples 'Account::Search' do match.user.update(approved: false) - results = described_class.advanced_search_for('username', account, limit: 10, following: true) + results = Account.advanced_search_for('username', account, limit: 10, following: true) expect(results).to eq [] end @@ -186,7 +186,7 @@ RSpec.shared_examples 'Account::Search' do match.user.update(confirmed_at: nil) - results = described_class.advanced_search_for('username', account, limit: 10, following: true) + results = Account.advanced_search_for('username', account, limit: 10, following: true) expect(results).to eq [] end end @@ -200,7 +200,7 @@ RSpec.shared_examples 'Account::Search' do suspended: true ) - results = described_class.advanced_search_for('username', account) + results = Account.advanced_search_for('username', account) expect(results).to eq [] end @@ -213,7 +213,7 @@ RSpec.shared_examples 'Account::Search' do match.user.update(approved: false) - results = described_class.advanced_search_for('username', account) + results = Account.advanced_search_for('username', account) expect(results).to eq [] end @@ -226,7 +226,7 @@ RSpec.shared_examples 'Account::Search' do match.user.update(confirmed_at: nil) - results = described_class.advanced_search_for('username', account) + results = Account.advanced_search_for('username', account) expect(results).to eq [] end @@ -238,20 +238,20 @@ RSpec.shared_examples 'Account::Search' do domain: 'example.com' ) - results = described_class.advanced_search_for('A?l\i:c e', account) + results = Account.advanced_search_for('A?l\i:c e', account) expect(results).to eq [match] end it 'limits result count by default value' do stub_const('Account::Search::DEFAULT_LIMIT', 1) 2.times { Fabricate(:account, display_name: 'Display Name') } - results = described_class.advanced_search_for('display', account) + results = Account.advanced_search_for('display', account) expect(results.size).to eq 1 end it 'accepts arbitrary limits' do 2.times { Fabricate(:account, display_name: 'Display Name') } - results = described_class.advanced_search_for('display', account, limit: 1) + results = Account.advanced_search_for('display', account, limit: 1) expect(results.size).to eq 1 end @@ -260,7 +260,7 @@ RSpec.shared_examples 'Account::Search' do followed_match = Fabricate(:account, username: 'Matcher') Fabricate(:follow, account: account, target_account: followed_match) - results = described_class.advanced_search_for('match', account) + results = Account.advanced_search_for('match', account) expect(results).to eq [followed_match, match] expect(results.first.rank).to be > results.last.rank end diff --git a/spec/models/account_spec.rb b/spec/models/account_spec.rb index 2fd32d1361..bb521e234a 100644 --- a/spec/models/account_spec.rb +++ b/spec/models/account_spec.rb @@ -3,7 +3,6 @@ require 'rails_helper' RSpec.describe Account do - it_behaves_like 'Account::Search' it_behaves_like 'Reviewable' describe 'Associations' do @@ -773,9 +772,6 @@ RSpec.describe Account do end end - it_behaves_like 'AccountAvatar', :account - it_behaves_like 'AccountHeader', :account - describe '#increment_count!' do subject { Fabricate(:account) } diff --git a/spec/support/examples/models/concerns/status/visibility.rb b/spec/models/status/visibility_spec.rb similarity index 99% rename from spec/support/examples/models/concerns/status/visibility.rb rename to spec/models/status/visibility_spec.rb index dd9e0bddf0..2aaaf6a88c 100644 --- a/spec/support/examples/models/concerns/status/visibility.rb +++ b/spec/models/status/visibility_spec.rb @@ -2,7 +2,7 @@ require 'rails_helper' -RSpec.shared_examples 'Status::Visibility' do +RSpec.describe Status::Visibility do describe 'Validations' do context 'when status is a reblog' do subject { Fabricate.build :status, reblog: Fabricate(:status) } diff --git a/spec/models/status_spec.rb b/spec/models/status_spec.rb index 69686d5076..a57fa95b76 100644 --- a/spec/models/status_spec.rb +++ b/spec/models/status_spec.rb @@ -9,8 +9,6 @@ RSpec.describe Status do let(:bob) { Fabricate(:account, username: 'bob') } let(:other) { Fabricate(:status, account: bob, text: 'Skulls for the skull god! The enemy\'s gates are sideways!') } - it_behaves_like 'Status::Visibility' - describe '#local?' do it 'returns true when no remote URI is set' do expect(subject.local?).to be true diff --git a/spec/support/examples/models/concerns/user/activity.rb b/spec/models/user/activity_spec.rb similarity index 89% rename from spec/support/examples/models/concerns/user/activity.rb rename to spec/models/user/activity_spec.rb index 7e647b694a..ca86150716 100644 --- a/spec/support/examples/models/concerns/user/activity.rb +++ b/spec/models/user/activity_spec.rb @@ -2,7 +2,7 @@ require 'rails_helper' -RSpec.shared_examples 'User::Activity' do +RSpec.describe User::Activity do before { stub_const 'User::ACTIVE_DURATION', 7.days } describe 'Scopes' do @@ -11,14 +11,14 @@ RSpec.shared_examples 'User::Activity' do describe '.signed_in_recently' do it 'returns users who have signed in during the recent period' do - expect(described_class.signed_in_recently) + expect(User.signed_in_recently) .to contain_exactly(recent_sign_in_user) end end describe '.not_signed_in_recently' do it 'returns users who have not signed in during the recent period' do - expect(described_class.not_signed_in_recently) + expect(User.not_signed_in_recently) .to contain_exactly(no_recent_sign_in_user) end end diff --git a/spec/support/examples/models/concerns/user/confirmation.rb b/spec/models/user/confirmation_spec.rb similarity index 97% rename from spec/support/examples/models/concerns/user/confirmation.rb rename to spec/models/user/confirmation_spec.rb index bb4d1b52b9..eda12e2fa5 100644 --- a/spec/support/examples/models/concerns/user/confirmation.rb +++ b/spec/models/user/confirmation_spec.rb @@ -2,21 +2,21 @@ require 'rails_helper' -RSpec.shared_examples 'User::Confirmation' do +RSpec.describe User::Confirmation do describe 'Scopes' do let!(:unconfirmed_user) { Fabricate :user, confirmed_at: nil } let!(:confirmed_user) { Fabricate :user, confirmed_at: Time.now.utc } describe '.confirmed' do it 'returns users who are confirmed' do - expect(described_class.confirmed) + expect(User.confirmed) .to contain_exactly(confirmed_user) end end describe '.unconfirmed' do it 'returns users who are not confirmed' do - expect(described_class.unconfirmed) + expect(User.unconfirmed) .to contain_exactly(unconfirmed_user) end end diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb index a7ac034f0a..e4ef25bc76 100644 --- a/spec/models/user_spec.rb +++ b/spec/models/user_spec.rb @@ -10,8 +10,6 @@ RSpec.describe User do let(:account) { Fabricate(:account, username: 'alice') } it_behaves_like 'two_factor_backupable' - it_behaves_like 'User::Activity' - it_behaves_like 'User::Confirmation' describe 'otp_secret' do it 'encrypts the saved value' do diff --git a/spec/requests/api/v1/donation_campaigns_spec.rb b/spec/requests/api/v1/donation_campaigns_spec.rb index 5df360b728..90add50820 100644 --- a/spec/requests/api/v1/donation_campaigns_spec.rb +++ b/spec/requests/api/v1/donation_campaigns_spec.rb @@ -52,6 +52,19 @@ RSpec.describe 'Donation campaigns' do end end + context 'when the donation campaign returns bad response' do + before do + stub_request(:get, "#{api_url}?platform=web&seed=#{seed}&locale=en").to_return(body: 'Cats & Dogs', status: 200) + end + + it 'handles the error and returns http empty' do + get '/api/v1/donation_campaigns', headers: headers + + expect(response) + .to have_http_status(204) + end + end + context 'when the donation campaign API returns a campaign' do let(:campaign_json) do { diff --git a/spec/services/software_update_check_service_spec.rb b/spec/services/software_update_check_service_spec.rb index ac342dce94..8f04b85d58 100644 --- a/spec/services/software_update_check_service_spec.rb +++ b/spec/services/software_update_check_service_spec.rb @@ -55,6 +55,16 @@ RSpec.describe SoftwareUpdateCheckService do end end + context 'when the update server returns invalid response body' do + before do + stub_request(:get, full_update_check_url).to_return(status: 200, body: 'XXX') + end + + it 'handles the error and returns' do + expect(subject.call).to be_nil + end + end + context 'when the server returns new versions' do let(:server_json) do { diff --git a/streaming/package.json b/streaming/package.json index 4f3d4a9a8e..8d9d81f782 100644 --- a/streaming/package.json +++ b/streaming/package.json @@ -21,7 +21,7 @@ "dotenv": "^17.0.0", "express": "^5.1.0", "ioredis": "^5.3.2", - "jsdom": "^28.0.0", + "jsdom": "^29.0.0", "pg": "^8.5.0", "pg-connection-string": "^2.6.0", "pino": "^10.0.0", diff --git a/yarn.lock b/yarn.lock index 0d3ca5d095..f14c322d93 100644 --- a/yarn.lock +++ b/yarn.lock @@ -12,13 +12,6 @@ __metadata: languageName: node linkType: hard -"@acemir/cssom@npm:^0.9.31": - version: 0.9.31 - resolution: "@acemir/cssom@npm:0.9.31" - checksum: 10c0/cbfff98812642104ec3b37de1ad3a53f216ddc437e7b9276a23f46f2453844ea3c3f46c200bc4656a2f747fb26567560b3cc5183d549d119a758926551b5f566 - languageName: node - linkType: hard - "@adobe/css-tools@npm:^4.4.0": version: 4.4.3 resolution: "@adobe/css-tools@npm:4.4.3" @@ -46,29 +39,29 @@ __metadata: languageName: node linkType: hard -"@asamuzakjp/css-color@npm:^4.1.2": - version: 4.1.2 - resolution: "@asamuzakjp/css-color@npm:4.1.2" +"@asamuzakjp/css-color@npm:^5.0.1": + version: 5.0.1 + resolution: "@asamuzakjp/css-color@npm:5.0.1" dependencies: - "@csstools/css-calc": "npm:^3.0.0" - "@csstools/css-color-parser": "npm:^4.0.1" + "@csstools/css-calc": "npm:^3.1.1" + "@csstools/css-color-parser": "npm:^4.0.2" "@csstools/css-parser-algorithms": "npm:^4.0.0" "@csstools/css-tokenizer": "npm:^4.0.0" - lru-cache: "npm:^11.2.5" - checksum: 10c0/e432fdef978b37654a2ca31169a149b9173e708f70c82612acb123a36dbc7dd99913c48cbf2edd6fe3652cc627d4bc94bf87571463da0b788f15b973d4ce5b0f + lru-cache: "npm:^11.2.6" + checksum: 10c0/3e8d74a3b7f3005a325cb8e7f3da1aa32aeac4cd9ce387826dc25b16eaab4dc0e4a6faded8ccc1895959141f4a4a70e8bc38723347b89667b7b224990d16683c languageName: node linkType: hard -"@asamuzakjp/dom-selector@npm:^6.8.1": - version: 6.8.1 - resolution: "@asamuzakjp/dom-selector@npm:6.8.1" +"@asamuzakjp/dom-selector@npm:^7.0.2": + version: 7.0.3 + resolution: "@asamuzakjp/dom-selector@npm:7.0.3" dependencies: "@asamuzakjp/nwsapi": "npm:^2.3.9" bidi-js: "npm:^1.0.3" - css-tree: "npm:^3.1.0" + css-tree: "npm:^3.2.1" is-potential-custom-element-name: "npm:^1.0.1" - lru-cache: "npm:^11.2.6" - checksum: 10c0/635de2c3b11971c07e2d491fd2833d2499bafbab05b616f5d38041031718879c404456644f60c45e9ba4ca2423e5bb48bf3c46179b0c58a0ea68eaae8c61e85f + lru-cache: "npm:^11.2.7" + checksum: 10c0/c64b06a23479970ded4f38bec34069e98f4062b4ecb798b81b1fc37b5472ec6110d5bd9d8a267bfc431503f6ee3080c2e94eb3d99e30aaa1b6d9f83fbd2744fa languageName: node linkType: hard @@ -1276,7 +1269,7 @@ __metadata: languageName: node linkType: hard -"@csstools/css-calc@npm:^3.0.0, @csstools/css-calc@npm:^3.1.1": +"@csstools/css-calc@npm:^3.1.1": version: 3.1.1 resolution: "@csstools/css-calc@npm:3.1.1" peerDependencies: @@ -1286,7 +1279,7 @@ __metadata: languageName: node linkType: hard -"@csstools/css-color-parser@npm:^4.0.1, @csstools/css-color-parser@npm:^4.0.2": +"@csstools/css-color-parser@npm:^4.0.2": version: 4.0.2 resolution: "@csstools/css-color-parser@npm:4.0.2" dependencies: @@ -1308,10 +1301,15 @@ __metadata: languageName: node linkType: hard -"@csstools/css-syntax-patches-for-csstree@npm:^1.0.25, @csstools/css-syntax-patches-for-csstree@npm:^1.0.26": - version: 1.0.27 - resolution: "@csstools/css-syntax-patches-for-csstree@npm:1.0.27" - checksum: 10c0/ef3f2a639109758c0f3c04520465800ca4c830174bd6f7979795083877c82ace51ab8353857b06a818cb6c0de6d4dc88f84a86fc3b021be47f11a0f1c4b74e7e +"@csstools/css-syntax-patches-for-csstree@npm:^1.0.25, @csstools/css-syntax-patches-for-csstree@npm:^1.1.1": + version: 1.1.1 + resolution: "@csstools/css-syntax-patches-for-csstree@npm:1.1.1" + peerDependencies: + css-tree: ^3.2.1 + peerDependenciesMeta: + css-tree: + optional: true + checksum: 10c0/947f82e9e8af0512f1d6600f68da1bbe8d15112fa73435169608a68dcf20262ae517c799202c86a6c3bc889d0e9fab724ad5661a3aa98432390f8f9765b86ddc languageName: node linkType: hard @@ -2396,15 +2394,15 @@ __metadata: languageName: node linkType: hard -"@exodus/bytes@npm:^1.11.0, @exodus/bytes@npm:^1.6.0": - version: 1.11.0 - resolution: "@exodus/bytes@npm:1.11.0" +"@exodus/bytes@npm:^1.11.0, @exodus/bytes@npm:^1.15.0, @exodus/bytes@npm:^1.6.0": + version: 1.15.0 + resolution: "@exodus/bytes@npm:1.15.0" peerDependencies: "@noble/hashes": ^1.8.0 || ^2.0.0 peerDependenciesMeta: "@noble/hashes": optional: true - checksum: 10c0/85d0b296cef91ee90f89f17b3a2cd23fa33bda4ae7b96545e9b8e2e68d64c0280eb3cefb77fc3f59f82377379ee7a52a5a5b3a9f99e45fca4166e5e2fa4c0939 + checksum: 10c0/b48aad9729653385d6ed055c28cfcf0b1b1481cf5d83f4375c12abd7988f1d20f69c80b5f95d4a1cc24d9abe32b9efc352a812d53884c26efea172aca8b6356d languageName: node linkType: hard @@ -2992,7 +2990,7 @@ __metadata: express: "npm:^5.1.0" globals: "npm:^17.3.0" ioredis: "npm:^5.3.2" - jsdom: "npm:^28.0.0" + jsdom: "npm:^29.0.0" pg: "npm:^8.5.0" pg-connection-string: "npm:^2.6.0" pino: "npm:^10.0.0" @@ -6439,13 +6437,13 @@ __metadata: languageName: node linkType: hard -"css-tree@npm:^3.0.0, css-tree@npm:^3.0.1, css-tree@npm:^3.1.0": - version: 3.1.0 - resolution: "css-tree@npm:3.1.0" +"css-tree@npm:^3.0.0, css-tree@npm:^3.0.1, css-tree@npm:^3.1.0, css-tree@npm:^3.2.1": + version: 3.2.1 + resolution: "css-tree@npm:3.2.1" dependencies: - mdn-data: "npm:2.12.2" - source-map-js: "npm:^1.0.1" - checksum: 10c0/b5715852c2f397c715ca00d56ec53fc83ea596295ae112eb1ba6a1bda3b31086380e596b1d8c4b980fe6da09e7d0fc99c64d5bb7313030dd0fba9c1415f30979 + mdn-data: "npm:2.27.1" + source-map-js: "npm:^1.2.1" + checksum: 10c0/1f65e9ccaa56112a4706d6f003dd43d777f0dbcf848e66fd320f823192533581f8dd58daa906cb80622658332d50284d6be13b87a6ab4556cbbfe9ef535bbf7e languageName: node linkType: hard @@ -6472,18 +6470,6 @@ __metadata: languageName: node linkType: hard -"cssstyle@npm:^6.0.1": - version: 6.0.1 - resolution: "cssstyle@npm:6.0.1" - dependencies: - "@asamuzakjp/css-color": "npm:^4.1.2" - "@csstools/css-syntax-patches-for-csstree": "npm:^1.0.26" - css-tree: "npm:^3.1.0" - lru-cache: "npm:^11.2.5" - checksum: 10c0/92a8581bad4ce9f77d22761f1aabe72829f4457ac709f4fe1a5b45b431ba165368cd7f849b00454ee31cf0a4c838be583107883f14b6d546802cf3c76a88ca41 - languageName: node - linkType: hard - "csstype@npm:^3.0.2, csstype@npm:^3.2.2": version: 3.2.3 resolution: "csstype@npm:3.2.3" @@ -8474,7 +8460,7 @@ __metadata: languageName: node linkType: hard -"http-proxy-agent@npm:^7.0.0, http-proxy-agent@npm:^7.0.2": +"http-proxy-agent@npm:^7.0.0": version: 7.0.2 resolution: "http-proxy-agent@npm:7.0.2" dependencies: @@ -8484,7 +8470,7 @@ __metadata: languageName: node linkType: hard -"https-proxy-agent@npm:^7.0.1, https-proxy-agent@npm:^7.0.6": +"https-proxy-agent@npm:^7.0.1": version: 7.0.6 resolution: "https-proxy-agent@npm:7.0.6" dependencies: @@ -9264,37 +9250,37 @@ __metadata: languageName: node linkType: hard -"jsdom@npm:^28.0.0": - version: 28.1.0 - resolution: "jsdom@npm:28.1.0" +"jsdom@npm:^29.0.0": + version: 29.0.0 + resolution: "jsdom@npm:29.0.0" dependencies: - "@acemir/cssom": "npm:^0.9.31" - "@asamuzakjp/dom-selector": "npm:^6.8.1" + "@asamuzakjp/css-color": "npm:^5.0.1" + "@asamuzakjp/dom-selector": "npm:^7.0.2" "@bramus/specificity": "npm:^2.4.2" - "@exodus/bytes": "npm:^1.11.0" - cssstyle: "npm:^6.0.1" + "@csstools/css-syntax-patches-for-csstree": "npm:^1.1.1" + "@exodus/bytes": "npm:^1.15.0" + css-tree: "npm:^3.2.1" data-urls: "npm:^7.0.0" decimal.js: "npm:^10.6.0" html-encoding-sniffer: "npm:^6.0.0" - http-proxy-agent: "npm:^7.0.2" - https-proxy-agent: "npm:^7.0.6" is-potential-custom-element-name: "npm:^1.0.1" + lru-cache: "npm:^11.2.7" parse5: "npm:^8.0.0" saxes: "npm:^6.0.0" symbol-tree: "npm:^3.2.4" - tough-cookie: "npm:^6.0.0" - undici: "npm:^7.21.0" + tough-cookie: "npm:^6.0.1" + undici: "npm:^7.24.3" w3c-xmlserializer: "npm:^5.0.0" webidl-conversions: "npm:^8.0.1" whatwg-mimetype: "npm:^5.0.0" - whatwg-url: "npm:^16.0.0" + whatwg-url: "npm:^16.0.1" xml-name-validator: "npm:^5.0.0" peerDependencies: canvas: ^3.0.0 peerDependenciesMeta: canvas: optional: true - checksum: 10c0/341ecb4005be2dab3247dacc349a20285d7991b5cee3382301fcd69a4294b705b4147e7d9ae1ddfab466ba4b3aace97ded4f7b070de285262221cb2782965b25 + checksum: 10c0/8bbb4f89bfb7013a729bf50419fa5878086b52068a5d3836b51b99be5faf7cf9f871818954d468ce1f2f1c6b86d16af6ed5167f4084f7df7de517b104b451454 languageName: node linkType: hard @@ -9694,10 +9680,10 @@ __metadata: languageName: node linkType: hard -"lru-cache@npm:^11.0.0, lru-cache@npm:^11.2.5, lru-cache@npm:^11.2.6": - version: 11.2.6 - resolution: "lru-cache@npm:11.2.6" - checksum: 10c0/73bbffb298760e71b2bfe8ebc16a311c6a60ceddbba919cfedfd8635c2d125fbfb5a39b71818200e67973b11f8d59c5a9e31d6f90722e340e90393663a66e5cd +"lru-cache@npm:^11.0.0, lru-cache@npm:^11.2.6, lru-cache@npm:^11.2.7": + version: 11.2.7 + resolution: "lru-cache@npm:11.2.7" + checksum: 10c0/549cdb59488baa617135fc12159cafb1a97f91079f35093bb3bcad72e849fc64ace636d244212c181dfdf1a99bbfa90757ff303f98561958ee4d0f885d9bd5f7 languageName: node linkType: hard @@ -9807,17 +9793,10 @@ __metadata: languageName: node linkType: hard -"mdn-data@npm:2.12.2": - version: 2.12.2 - resolution: "mdn-data@npm:2.12.2" - checksum: 10c0/b22443b71d70f72ccc3c6ba1608035431a8fc18c3c8fc53523f06d20e05c2ac10f9b53092759a2ca85cf02f0d37036f310b581ce03e7b99ac74d388ef8152ade - languageName: node - linkType: hard - -"mdn-data@npm:^2.25.0": - version: 2.26.0 - resolution: "mdn-data@npm:2.26.0" - checksum: 10c0/e5f17f4dac247f3e260c081761628d371e23659a7ff13413f83f5bd7fd0f2d8317e72277bb77f0e13115041334ff728a5363db64aabaf376c0e1b0b31016d0b8 +"mdn-data@npm:2.27.1, mdn-data@npm:^2.25.0": + version: 2.27.1 + resolution: "mdn-data@npm:2.27.1" + checksum: 10c0/eb8abf5d22e4d1e090346f5e81b67d23cef14c83940e445da5c44541ad874dc8fb9f6ca236e8258c3a489d9fb5884188a4d7d58773adb9089ac2c0b966796393 languageName: node linkType: hard @@ -12385,11 +12364,14 @@ __metadata: linkType: hard "rollup-plugin-gzip@npm:^4.1.1": - version: 4.1.1 - resolution: "rollup-plugin-gzip@npm:4.1.1" + version: 4.2.0 + resolution: "rollup-plugin-gzip@npm:4.2.0" peerDependencies: rollup: ">=2.0.0" - checksum: 10c0/0ad79a6eb84bb8d88db15a184ca661f44aa6fb3412c98d6a97f1dec365db37945a84c3a2d0bf709ae605ae305a40a0021b2e6d5494c537b029759f3695d9ac96 + peerDependenciesMeta: + rollup: + optional: true + checksum: 10c0/05aecd5cb96f5b40ef128d87ea15d86c07e416a1fb98eb5712911254ce1a09ddf60c0128edb7fc8dc7478cbca1f94d04ab07cf4437947f5ce330ce627f80bada languageName: node linkType: hard @@ -12958,7 +12940,7 @@ __metadata: languageName: node linkType: hard -"source-map-js@npm:>=0.6.2 <2.0.0, source-map-js@npm:^1.0.1, source-map-js@npm:^1.0.2, source-map-js@npm:^1.2.1": +"source-map-js@npm:>=0.6.2 <2.0.0, source-map-js@npm:^1.0.2, source-map-js@npm:^1.2.1": version: 1.2.1 resolution: "source-map-js@npm:1.2.1" checksum: 10c0/7bda1fc4c197e3c6ff17de1b8b2c20e60af81b63a52cb32ec5a5d67a20a7d42651e2cb34ebe93833c5a2a084377e17455854fee3e21e7925c64a51b6a52b0faf @@ -13824,12 +13806,12 @@ __metadata: languageName: node linkType: hard -"tough-cookie@npm:^6.0.0": - version: 6.0.0 - resolution: "tough-cookie@npm:6.0.0" +"tough-cookie@npm:^6.0.0, tough-cookie@npm:^6.0.1": + version: 6.0.1 + resolution: "tough-cookie@npm:6.0.1" dependencies: tldts: "npm:^7.0.5" - checksum: 10c0/7b17a461e9c2ac0d0bea13ab57b93b4346d0b8c00db174c963af1e46e4ea8d04148d2a55f2358fc857db0c0c65208a98e319d0c60693e32e0c559a9d9cf20cb5 + checksum: 10c0/ec70bd6b1215efe4ed31a158f0be3e4c9088fcbd8620edc23a5860d4f3d85c757b77e274baaa700f7b25e409f4181552ed189603c2b2e1a9f88104da3a61a37d languageName: node linkType: hard @@ -14135,10 +14117,10 @@ __metadata: languageName: node linkType: hard -"undici@npm:^7.21.0": - version: 7.22.0 - resolution: "undici@npm:7.22.0" - checksum: 10c0/09777c06f3f18f761f03e3a4c9c04fd9fcca8ad02ccea43602ee4adf73fcba082806f1afb637f6ea714ef6279c5323c25b16d435814c63db720f63bfc20d316b +"undici@npm:^7.24.3": + version: 7.24.4 + resolution: "undici@npm:7.24.4" + checksum: 10c0/cb302e81fadb7f0b7946ab77595715c0961b46a025ccecae79ba599432d0bc8d1e3da4dfe7ff66bc74f115c1b8ff0f099bc4e9bf313db4562da23995872c6d17 languageName: node linkType: hard @@ -14667,14 +14649,14 @@ __metadata: languageName: node linkType: hard -"whatwg-url@npm:^16.0.0": - version: 16.0.0 - resolution: "whatwg-url@npm:16.0.0" +"whatwg-url@npm:^16.0.0, whatwg-url@npm:^16.0.1": + version: 16.0.1 + resolution: "whatwg-url@npm:16.0.1" dependencies: "@exodus/bytes": "npm:^1.11.0" tr46: "npm:^6.0.0" webidl-conversions: "npm:^8.0.1" - checksum: 10c0/9b8cb392be244d0e9687ffe543f9ea63b7aa051a98547ea362a38d182d89bfbd96e13e7ed3f40df1f7566bb7c3581f6c081ddea950cf5382532716ce33000ff4 + checksum: 10c0/e75565566abf3a2cdbd9f06c965dbcccee6ec4e9f0d3728ad5e08ceb9944279848bcaa211d35a29cb6d2df1e467dd05cfb59fbddf8a0adcd7d0bce9ffb703fd2 languageName: node linkType: hard