diff --git a/.config/example.yml b/.config/example.yml index 9664c6dfb5..22dd5f1319 100644 --- a/.config/example.yml +++ b/.config/example.yml @@ -29,7 +29,7 @@ url: https://example.com/ # The port that your Firefish server should listen on. port: 3000 -# The bind host your Calckey server should listen on. +# The bind host your Firefish server should listen on. # If unspecified, the wildcard address will be used. #bind: 127.0.0.1 diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 9d4a51d7a6..5c6cda1603 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -66,4 +66,3 @@ cache: - node_modules/ - packages/*/node_modules/ - packages/backend/native-utils/node_modules/ - - packages/backend/native-utils/target/ diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 7af8cc9257..77b10c5e9f 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -12,9 +12,6 @@ You can contribute without knowing how to code by helping translate here: [![Translation bars](https://hosted.weblate.org/widgets/firefish/-/multi-auto.svg)](https://hosted.weblate.org/engage/firefish/) -## Roadmap -See [FIREFISH.md](./FIREFISH.md) - ## Issues Before creating an issue, please check the following: - To avoid duplication, please search for similar issues before creating a new issue. diff --git a/README.md b/README.md index 187c02046b..63bc99aa96 100644 --- a/README.md +++ b/README.md @@ -23,7 +23,6 @@ - Firefish is based off of Misskey, a powerful microblogging server on ActivityPub with features such as emoji reactions, a customizable web UI, rich chatting, and much more! - Firefish adds many quality of life changes and bug fixes for users and server admins alike. -- Read **[this document](./FIREFISH.md)** all for current and future differences. - Notable differences: - Improved UI/UX (especially on mobile) - Post editing @@ -66,7 +65,7 @@ - Donate publicly to get your name on the Patron list! - 🚱 Flagship server: - 💁 Matrix support room: -- 📣 Official account: +- 📣 Official account: @firefish - 📜 Server list: - ✍ Weblate: - ïžïžđŸ“Ź Contact: diff --git a/locales/de-DE.yml b/locales/de-DE.yml index 25495c9469..67cd6f6230 100644 --- a/locales/de-DE.yml +++ b/locales/de-DE.yml @@ -953,9 +953,9 @@ driveCapOverrideCaption: "Gib einen Wert von 0 oder weniger ein, um die Kapazit auf den Standard zurĂŒckzusetzen." requireAdminForView: "Du musst dich mit einem Administratorkonto anmelden um dies zu sehen." -isSystemAccount: "Dieses Konto wird vom System erstellt und automatisch verwaltet. - Bitte moderieren, bearbeiten, löschen oder manipulieren Sie dieses Konto nicht, - da es sonst zu einem Server-Absturz kommen könnte." +isSystemAccount: "Ein Nutzerkonto, dass durch das System erstellt und automatisch + kontrolliert wird. Jede Anpassung, VerĂ€nderung oder Löschung dieses Nutzerkontos, + kann zu schwerwiegenden Fehlern auf diesem Server fĂŒhren." typeToConfirm: "Bitte gib zur BestĂ€tigung {x} ein" deleteAccount: "Nutzerkonto löschen" document: "Dokumentation" @@ -966,7 +966,7 @@ logoutConfirm: "Wirklich abmelden?" lastActiveDate: "Zuletzt verwendet am" statusbar: "Statusleiste" pleaseSelect: "WĂ€hle eine Option" -reverse: "Umkehren" +reverse: "RĂŒckgĂ€ngig machen" colored: "Farbig" refreshInterval: "Aktualisierungsintervall " label: "Beschriftung" @@ -1128,7 +1128,7 @@ _mfm: bold: "Fett" boldDescription: "Zeichen zur Betonung dicker erscheinen lassen." small: "Klein" - smallDescription: "Inhalt klein und dĂŒnn erscheinen lassen." + smallDescription: "Inhalt klein und dĂŒnn anzeigen." center: "Zentrieren" centerDescription: "Inhalt zentriert anzeigen." inlineCode: "Code (Eingebettet)" @@ -2191,3 +2191,13 @@ _skinTones: showPopup: Benutzer mit Popup benachrichtigen showWithSparkles: Mit Glitzer anzeigen removeQuote: Zitat entfernen +objectStorageS3ForcePathStyle: Verwende pfadbasierte Endpunkt-URLs +objectStorageS3ForcePathStyleDesc: Wenn aktiviert, werden Endpunkt-URLs im Format + 's3.amazonaws.com//' statt '.s3.amazonaws.com' erstellt. +origin: Herkunft +delete2fa: 2FA deaktivieren +deletePasskeys: Passkeys löschen +delete2faConfirm: Passkeys werden unwiderruflich von diesem Account gelöscht. Fortfahren? +deletePasskeysConfirm: Alle Passkeys und Security-Keys werden unwiderruflich von diesem + Account gelöscht. Fortfahren? +inputNotMatch: Eingabe stimmt nicht ĂŒberein diff --git a/locales/fr-FR.yml b/locales/fr-FR.yml index d25ab8f902..259e1b8bc0 100644 --- a/locales/fr-FR.yml +++ b/locales/fr-FR.yml @@ -1,5 +1,6 @@ _lang_: "Français" -headlineFirefish: "RĂ©seau reliĂ© par des notes" +headlineFirefish: "Une plateforme de rĂ©seaux sociaux dĂ©centralisĂ©, open source qui + est gratuit pour toujours ! 🚀" introFirefish: "Bienvenue ! Firefish est une plateforme de rĂ©seau social dĂ©centralisĂ© et open source qui est gratuite pour toujours ! 🚀" monthAndDay: "{day}/{month}" @@ -13,8 +14,8 @@ ok: "OK" gotIt: "J’ai compris !" cancel: "Annuler" enterUsername: "Entrer un nom d’utilisateur·rice" -renotedBy: "RenotĂ© par {user}" -noNotes: "Aucune note" +renotedBy: "BoostĂ© par {user}" +noNotes: "Aucun post" noNotifications: "Aucune notification" instance: "Serveur" settings: "ParamĂštres" @@ -45,8 +46,8 @@ copyContent: "Copier le contenu" copyLink: "Copier le lien" delete: "Supprimer" deleteAndEdit: "Supprimer et rĂ©Ă©crire" -deleteAndEditConfirm: "Êtes-vous sĂ»r·e de vouloir supprimer cette note et la reformuler - ? Vous perdrez toutes les rĂ©actions, renotes et rĂ©ponses y affĂ©rentes." +deleteAndEditConfirm: "Êtes-vous sĂ»r·e de vouloir supprimer ce post et le reformuler + ? Vous perdrez toutes les rĂ©actions, boosts et rĂ©ponses liĂ©es." addToList: "Ajouter Ă  une liste" sendMessage: "Envoyer un message" copyUsername: "Copier le nom d’utilisateur·rice" @@ -60,14 +61,14 @@ receiveFollowRequest: "Demande d’abonnement reçue" followRequestAccepted: "La demande d’abonnement a Ă©tĂ© acceptĂ©e" mention: "Mentionner" mentions: "Mentions" -directNotes: "Notes directes" +directNotes: "Messages directs" importAndExport: "Import et export" import: "Importer" export: "Exporter" files: "Fichiers" download: "TĂ©lĂ©charger" driveFileDeleteConfirm: "Êtes-vous sĂ»r·e de vouloir supprimer le fichier \"{name}\"\ - \ ? Il sera retirĂ© de toutes ses notes liĂ©es." + \ ? Il sera retirĂ© de tous ses posts liĂ©es." unfollowConfirm: "DĂ©sirez-vous vous dĂ©sabonner de {name} ?" exportRequested: "Vous avez demandĂ© une exportation. L’opĂ©ration pourrait prendre un peu de temps. Une terminĂ©e, le fichier rĂ©sultant sera ajoutĂ© au Drive." @@ -94,18 +95,18 @@ youShouldUpgradeClient: "Si la page ne s'affiche pas correctement, rechargez-la enterListName: "Nom de la liste" privacy: "ConfidentialitĂ©" makeFollowManuallyApprove: "Accepter manuellement les demandes d’abonnement" -defaultNoteVisibility: "VisibilitĂ© des notes par dĂ©faut" +defaultNoteVisibility: "VisibilitĂ© des posts par dĂ©faut" follow: "S’abonner" followRequest: "Demande d’abonnement" followRequests: "Demandes d’abonnement" unfollow: "Se dĂ©sabonner" followRequestPending: "Demande d'abonnement en attente de confirmation" enterEmoji: "InsĂ©rer un Ă©moji" -renote: "Renoter" -unrenote: "Annuler la Renote" -renoted: "RenotĂ©." -cantRenote: "Ce message ne peut pas ĂȘtre renotĂ©." -cantReRenote: "Impossible de renoter une Renote." +renote: "Booster" +unrenote: "Annuler le boost" +renoted: "BoostĂ©." +cantRenote: "Ce message ne peut pas ĂȘtre boostĂ©." +cantReRenote: "Impossible de partager ce boost." quote: "Citer" pinnedNote: "Note Ă©pinglĂ©e" pinned: "Épingler sur le profil" @@ -117,9 +118,9 @@ reaction: "RĂ©actions" reactionSetting: "RĂ©actions Ă  afficher dans le sĂ©lecteur de rĂ©actions" reactionSettingDescription2: "DĂ©placer pour rĂ©organiser, cliquer pour effacer, utiliser « + » pour ajouter." -rememberNoteVisibility: "Activer l'option \" se souvenir de la visibilitĂ© des notes +rememberNoteVisibility: "Activer l'option \" se souvenir de la visibilitĂ© des posts \" vous permet de rĂ©utiliser automatiquement la visibilitĂ© utilisĂ©e lors de la publication - de votre note prĂ©cĂ©dente." + de votre post prĂ©cĂ©dent." attachCancel: "Supprimer le fichier attachĂ©" markAsSensitive: "Marquer comme sensible" unmarkAsSensitive: "Supprimer le marquage comme sensible" @@ -175,9 +176,9 @@ proxyAccount: "Compte proxy" proxyAccountDescription: "Un compte proxy se comporte, dans certaines conditions, comme un·e abonné·e distant·e pour les utilisateur·rice·s d'autres serveurs. Par exemple, quand un·e utilisateur·rice local ajoute un·e utilisateur·rice distant·e - Ă  une liste, ses notes ne seront pas visibles sur le serveur si personne ne suit + Ă  une liste, ses posts ne seront pas visibles sur le serveur si personne ne suit cet·te utilisateur·rice. Le compte proxy va donc suivre cet·te utilisateur·rice - pour que ses notes soient acheminĂ©es." + pour que ses posts soient acheminĂ©es." host: "Serveur distant" selectUser: "SĂ©lectionner un·e utilisateur·rice" recipient: "Destinataire" @@ -207,7 +208,7 @@ instanceInfo: "Informations du serveur" statistics: "Statistiques" clearQueue: "Vider la file d’attente" clearQueueConfirmTitle: "Êtes-vous sĂ»r·e de vouloir vider la file d’attente ?" -clearQueueConfirmText: "Les notes non distribuĂ©es ne seront pas dĂ©livrĂ©es. Normalement, +clearQueueConfirmText: "Les posts non distribuĂ©s ne seront pas dĂ©livrĂ©s. Normalement, vous n'avez pas besoin d'effectuer cette opĂ©ration." clearCachedFiles: "Vider le cache" clearCachedFilesConfirm: "Êtes-vous sĂ»r·e de vouloir vider tout le cache de fichiers @@ -220,8 +221,8 @@ mutedUsers: "Utilisateur·rice·s en sourdine" blockedUsers: "Utilisateur·rice·s bloqué·e·s" noUsers: "Il n’y a pas d’utilisateur·rice·s" editProfile: "Modifier votre profil" -noteDeleteConfirm: "Êtes-vous sĂ»r·e de vouloir supprimer cette note ?" -pinLimitExceeded: "Vous ne pouvez pas Ă©pingler plus de notes" +noteDeleteConfirm: "Êtes-vous sĂ»r·e de vouloir supprimer ce post ?" +pinLimitExceeded: "Vous ne pouvez pas Ă©pingler plus de posts" intro: "L’installation de Firefish est terminĂ©e ! Veuillez crĂ©er un compte administrateur." done: "TerminĂ©" processing: "Traitement en cours" @@ -366,7 +367,7 @@ pinnedPages: "Pages Ă©pinglĂ©es" pinnedPagesDescription: "Inscrivez le chemin des Pages que vous souhaitez Ă©pingler en haut de la page du serveur. SĂ©parez les d'un retour Ă  la ligne." pinnedClipId: "Identifiant du clip Ă©pinglĂ©" -pinnedNotes: "Note Ă©pinglĂ©e" +pinnedNotes: "Posts Ă©pinglĂ©e" hcaptcha: "hCaptcha" enableHcaptcha: "Activer hCaptcha" hcaptchaSiteKey: "ClĂ© du site" @@ -386,14 +387,14 @@ antennaKeywords: "Mots clĂ©s Ă  recevoir" antennaExcludeKeywords: "Mots clĂ©s Ă  exclure" antennaKeywordsDescription: "SĂ©parer avec des espaces pour la condition AND. SĂ©parer avec un saut de ligne pour une condition OR." -notifyAntenna: "Je souhaite recevoir les notifications des nouvelles notes" -withFileAntenna: "Notes ayant des attachements uniquement" +notifyAntenna: "Je souhaite recevoir les notifications des nouveaux posts" +withFileAntenna: "Posts ayant des attachements uniquement" enableServiceworker: "Activer ServiceWorker" antennaUsersDescription: "Saisissez un seul nom d’utilisateur·rice par ligne" caseSensitive: "Sensible Ă  la casse" withReplies: "Inclure les rĂ©ponses" connectedTo: "Vous ĂȘtes connectĂ©s aux services suivants" -notesAndReplies: "Notes et RĂ©ponses" +notesAndReplies: "Posts et RĂ©ponses" withFiles: "Avec fichiers joints" silence: "Mettre en sourdine" silenceConfirm: "Êtes-vous sĂ»r·e de vouloir mettre l’utilisateur·rice en sourdine @@ -431,7 +432,7 @@ notFoundDescription: "Aucune page ne correspond Ă  l’URL spĂ©cifiĂ©e." uploadFolder: "Emplacement de tĂ©lĂ©versement par dĂ©faut" cacheClear: "Vider le cache" markAsReadAllNotifications: "Marquer toutes les notifications comme lues" -markAsReadAllUnreadNotes: "Marquer toutes les notes comme lues" +markAsReadAllUnreadNotes: "Marquer tous les posts comme lus" markAsReadAllTalkMessages: "Marquer toutes les discussions comme lues" help: "Aide" inputMessageHere: "Écrivez votre message ici" @@ -452,7 +453,7 @@ text: "Texte" enable: "Activer" next: "Suivant" retype: "Confirmation" -noteOf: "Notes de {user}" +noteOf: "Posts de {user}" inviteToGroup: "Inviter dans un groupe" quoteAttached: "Avec citation" quoteQuestion: "Souhaitez-vous ajouter une citation ?" @@ -512,8 +513,8 @@ accountSettings: "ParamĂštres du compte" promotion: "Promu" promote: "Promouvoir" numberOfDays: "Nombre de jours" -hideThisNote: "Masquer cette note" -showFeaturedNotesInTimeline: "Afficher les notes des Tendances dans le fil d'actualitĂ©" +hideThisNote: "Masquer ce post" +showFeaturedNotesInTimeline: "Afficher les posts des Tendances dans le fil d'actualitĂ©" objectStorage: "Stockage d'objets" useObjectStorage: "Utiliser le stockage d'objets" objectStorageBaseUrl: "Base URL" @@ -544,7 +545,7 @@ objectStorageSetPublicRead: "RĂ©gler sur « public » lors de l'envoi" serverLogs: "Journal du serveur" deleteAll: "Supprimer tout" showFixedPostForm: "Afficher le formulaire de publication en haut du fil d'actualitĂ©" -newNoteRecived: "Voir les nouvelles notes" +newNoteRecived: "Voir les nouveaux posts" sounds: "Sons" listen: "Écouter" none: "Rien" @@ -594,8 +595,8 @@ addRelay: "Ajouter un relais" inboxUrl: "Inbox URL" addedRelays: "Relais ajoutĂ©s" serviceworkerInfo: "Devrait ĂȘtre activĂ© pour les notifications push." -deletedNote: "Note supprimĂ©e" -invisibleNote: "Note invisible" +deletedNote: "Post supprimĂ©" +invisibleNote: "Post invisible" enableInfiniteScroll: "Activer le dĂ©filement infini" visibility: "VisibilitĂ©" poll: "Sondage" @@ -680,7 +681,7 @@ abuseReports: "Signalements" reportAbuse: "Signaler" reportAbuseOf: "Signaler {name}" fillAbuseReportDescription: "Veuillez expliquer les raisons du signalement. S'il s'agit - d'une note particuliĂšre, veuillez inclure le lien." + d'un post particulier, veuillez inclure le lien." abuseReported: "Le rapport est envoyĂ©. Merci." reporter: "SignalĂ© par" reporteeOrigin: "Origine du signalement" @@ -693,7 +694,7 @@ openInSideView: "Ouvrir en vue latĂ©rale" defaultNavigationBehaviour: "Navigation par dĂ©faut" editTheseSettingsMayBreakAccount: "La modification de ces paramĂštres peut endommager votre compte." -instanceTicker: "Nom du serveur d'origine des notes" +instanceTicker: "Nom du serveur d'origine des posts" waitingFor: "En attente de {x}" random: "AlĂ©atoire" system: "SystĂšme" @@ -708,11 +709,11 @@ i18nInfo: "Firefish est traduit dans diffĂ©rentes langues par des bĂ©nĂ©voles. V contribuer Ă  {link}." manageAccessTokens: "GĂ©rer les jetons d'accĂšs" accountInfo: " Informations du compte " -notesCount: "Nombre de notes" +notesCount: "Nombre de posts" repliesCount: "Nombre de rĂ©ponses envoyĂ©es" -renotesCount: "Nombre de notes que vous avez renotĂ©es" +renotesCount: "Nombre de boosts que vous avez envoyĂ©" repliedCount: "Nombre de rĂ©ponses reçues" -renotedCount: "Nombre de vos notes renotĂ©es" +renotedCount: "Nombre de vos posts boostĂ©s" followingCount: "Nombre de comptes suivis" followersCount: "Nombre d'abonnĂ©s" sentReactionsCount: "Nombre de rĂ©actions envoyĂ©es" @@ -725,9 +726,9 @@ driveFilesCount: "Nombre de fichiers dans le Drive" driveUsage: "Utilisation du Drive" noCrawle: "Refuser l'indexation par les robots" noCrawleDescription: "Demandez aux moteurs de recherche de ne pas indexer votre page - de profil, vos notes, vos pages, etc." -lockedAccountInfo: "À moins que vous ne dĂ©finissiez la visibilitĂ© de votre note sur - \"AbonnĂ©-e-s\", vos notes sont visibles par tous, mĂȘme si vous exigez que les demandes + de profil, vos posts, vos pages, etc." +lockedAccountInfo: "À moins que vous ne dĂ©finissiez la visibilitĂ© de votre post sur + \"AbonnĂ©-e-s\", vos posts sont visibles par tous, mĂȘme si vous exigez que les demandes d'abonnement soient approuvĂ©es manuellement." alwaysMarkSensitive: "Marquer les mĂ©dias comme contenu sensible par dĂ©faut" loadRawImages: "Affichage complet des images jointes au lieu des vignettes" @@ -736,7 +737,7 @@ verificationEmailSent: "Un e-mail de vĂ©rification a Ă©tĂ© envoyĂ©. Veuillez acc lien pour complĂ©ter la vĂ©rification." notSet: "Non dĂ©fini" emailVerified: "Votre adresse e-mail a Ă©tĂ© vĂ©rifiĂ©e." -noteFavoritesCount: "Nombre de notes dans les favoris" +noteFavoritesCount: "Nombre de posts dans les favoris" pageLikesCount: "Nombre de pages aimĂ©es" pageLikedCount: "Nombre de vos pages aimĂ©es" contact: "Contact" @@ -747,7 +748,7 @@ developer: "DĂ©veloppeur" makeExplorable: "Rendre le compte visible sur la page \"DĂ©couvrir\"." makeExplorableDescription: "Si vous dĂ©sactivez cette option, votre compte n'apparaĂźtra pas sur la page \"DĂ©couvrir\"." -showGapBetweenNotesInTimeline: "Afficher un Ă©cart entre les notes du fil d’actualitĂ©" +showGapBetweenNotesInTimeline: "Afficher un Ă©cart entre les posts du fil d’actualitĂ©" duplicate: "Duliquer" left: "Gauche" center: "Centrer" @@ -760,7 +761,7 @@ showTitlebar: "Afficher la barre de titre" clearCache: "Vider le cache" onlineUsersCount: "{n} utilisateur(s) en ligne" nUsers: "{n} utilisateur·rice·s" -nNotes: "{n} Notes" +nNotes: "{n} Posts" sendErrorReports: "Envoyer les rapports d’erreur" sendErrorReportsDescription: "Si vous activez l'envoi des rapports d'erreur, vous contribuerez Ă  amĂ©liorer la qualitĂ© de Firefish grĂące au partage d'informations @@ -805,8 +806,8 @@ unlikeConfirm: "Êtes-vous sĂ»r·e de ne plus vouloir aimer cette publication ?" fullView: "Plein Ă©cran" quitFullView: "Quitter le plein Ă©cran" addDescription: "Ajouter une description" -userPagePinTip: "Vous pouvez afficher des notes ici en sĂ©lectionnant l'option « Épingler - au profil » dans le menu de chaque note." +userPagePinTip: "Vous pouvez afficher des posts ici en sĂ©lectionnant l'option « Épingler + au profil » dans le menu de chaque post." notSpecifiedMentionWarning: "Vous avez mentionnĂ© des utilisateur·rice·s qui ne font pas partie de la liste des destinataires" info: "Informations" @@ -838,7 +839,7 @@ postToGallery: "Publier dans la galerie" gallery: "Galerie" recentPosts: "Les plus rĂ©centes" popularPosts: "Les plus consultĂ©es" -shareWithNote: "Partager dans une note" +shareWithNote: "Partager dans un post" ads: "BanniĂšre communautaire" expiration: "ÉchĂ©ance" memo: "Pense-bĂȘte" @@ -1121,7 +1122,7 @@ _channel: owned: "Mes canaux" following: "Abonné·e" usersCount: "{n} Participant·e·s" - notesCount: "{n} Notes" + notesCount: "{n} Posts" nameAndDescription: Nom et description nameOnly: Nom uniquement _menuDisplay: @@ -1135,20 +1136,20 @@ _wordMute: un saut de ligne pour une condition OR." muteWordsDescription2: "Pour utiliser des expressions rĂ©guliĂšres (regex), mettez les mots-clĂ©s entre barres obliques." - softDescription: "Masquez de votre fil d’actualitĂ© les notes qui rĂ©pondent aux conditions + softDescription: "Masquez de votre fil d’actualitĂ© les posts qui rĂ©pondent aux conditions dĂ©finies." - hardDescription: "EmpĂȘche les notes qui remplissent les conditions dĂ©finies d'ĂȘtre + hardDescription: "EmpĂȘche les posts qui remplissent les conditions dĂ©finies d'ĂȘtre ajoutĂ©es au fil d'actualitĂ©. Cette action est irrĂ©versible : si vous modifiez - ces conditions plus tard, les notes prĂ©cĂ©demment filtrĂ©es ne seront pas rĂ©cupĂ©rĂ©es." + ces conditions plus tard, les posts prĂ©cĂ©demment filtrĂ©es ne seront pas rĂ©cupĂ©rĂ©es." soft: "Doux" hard: "Strict" - mutedNotes: "Notes filtrĂ©es" + mutedNotes: "Posts filtrĂ©s" _instanceMute: instanceMuteDescription2: "SĂ©parer avec des sauts de lignes" - title: "Masque les notes venant des serveurs listĂ©s." + title: "Masque les posts provenant des serveurs listĂ©s." heading: "Serveurs Ă  mettre en sourdine/masquer" - instanceMuteDescription: Ceci va masquer toute publication ou partage de serveurs - listĂ©s, incluant celles des personnes rĂ©pondant Ă  des personnes des serveurs masquĂ©s. + instanceMuteDescription: Ceci va masquer toute posts ou boosts de serveurs listĂ©s, + incluant celles des personnes rĂ©pondant Ă  des personnes des serveurs masquĂ©s. _theme: explore: "Explorer les thĂšmes" install: "Installer un thĂšme" @@ -1199,7 +1200,7 @@ _theme: hashtag: "Hashtags" mention: "Mentionner" mentionMe: "Mentions (Moi)" - renote: "Renoter" + renote: "Booster" modalBg: "Modal d'arriĂšre-plan" divider: "SĂ©parateur" scrollbarHandle: "PoignĂ©e de la barre de navigation" @@ -1226,8 +1227,8 @@ _theme: accentLighten: "Plus clair" fgHighlighted: "Texte mis en Ă©vidence" _sfx: - note: "Nouvelle note" - noteMy: "Ma note" + note: "Nouveau post" + noteMy: "Mon post" notification: "Notifications" chat: "Discuter" chatBg: "Discussion (arriĂšre-plan)" @@ -1254,14 +1255,14 @@ _tutorial: step1_2: "On va vous installer. Vous serez opĂ©rationnel en un rien de temps" step2_1: "Tout d'abord, remplissez votre profil" step2_2: "En fournissant quelques informations sur qui vous ĂȘtes, il sera plus facile - pour les autres de savoir s'ils veulent voir vos notes ou vous suivre." + pour les autres de savoir s'ils veulent voir vos posts ou vous suivre." step3_1: "Maintenant il est temps de suivre des gens !" step3_2: "Vos fil d’actualitĂ© Principal et Social sont basĂ©s sur les personnes que vous suivez, alors essayez de suivre quelques comptes pour commencer.\nCliquez sur le cercle plus en haut Ă  droite d'un profil pour le suivre." step4_1: "On y va." - step4_2: "Pour votre premiĂšre note, certaines personnes aiment faire une note {introduction} - ou une simple note 'Bonjours tout le monde !'." + step4_2: "Pour votre premier post, certaines personnes aiment faire un post {introduction} + ou un simple 'Bonjours tout le monde !'" step5_1: "Des fils, des fils d’actualitĂ© partout !" step5_2: "Votre serveur a {timelines} fils diffĂ©rents disponibles !" step5_3: "Le fil {icon} Principal est l'endroit oĂč vous pouvez voir les publications @@ -1334,7 +1335,7 @@ _permissions: "write:messaging": "GĂ©rer les discussions" "read:mutes": "Voir les comptes masquĂ©s" "write:mutes": "GĂ©rer les comptes masquĂ©s" - "write:notes": "CrĂ©er / supprimer des notes" + "write:notes": "CrĂ©er / supprimer des posts" "read:notifications": "Afficher les notifications" "write:notifications": "GĂ©rer vos notifications" "read:reactions": "Lire les rĂ©actions" @@ -1363,12 +1364,12 @@ _auth: copyAsk: "Veuillez coller le code d’autorisation suivant dans l'application :" allPermissions: AccĂšs complet au compte _antennaSources: - all: "Toutes les notes" - homeTimeline: "Notes provenant des utilisateur·rice·s auxquel·les je suis abonnĂ©" - users: "Notes venant de la part d’utilisateur·rice·s prĂ©cis" - userList: "Notes venant d’une liste spĂ©cifique" - userGroup: "Notes venant d’utilisateur·rice·s du groupe spĂ©cifiĂ©" - instances: Notes de tous les utilisateurs d'un serveur + all: "Tous les posts" + homeTimeline: "Posts provenant des utilisateur·rice·s auxquel·les je suis abonnĂ©" + users: "Posts venant de la part d’utilisateur·rice·s prĂ©cis" + userList: "Posts venant d’une liste spĂ©cifique" + userGroup: "Posts venant d’utilisateur·rice·s du groupe spĂ©cifiĂ©" + instances: Posts de tous les utilisateurs d'un serveur _weekday: sunday: "Dimanche" monday: "Lundi" @@ -1401,7 +1402,7 @@ _widgets: _userList: chooseList: SĂ©lectionner une liste unixClock: Horloge UNIX - meiliIndexCount: Notes indexĂ©es + meiliIndexCount: Posts indexĂ©s serverInfo: Info serveur meiliStatus: État du serveur meiliSize: Taille de l’index @@ -1446,8 +1447,8 @@ _visibility: localOnly: "Local seulement" localOnlyDescription: "CachĂ© pour les utilisateur·rice·s distant" _postForm: - replyPlaceholder: "RĂ©pondre Ă  cette note ..." - quotePlaceholder: "Citez cette note ..." + replyPlaceholder: "RĂ©pondre Ă  ce post ..." + quotePlaceholder: "Citez ce post ..." channelPlaceholder: "Publier sur une chaĂźne
" _placeholders: a: "Quoi de neuf ?" @@ -1473,7 +1474,7 @@ _profile: locationDescription: Si vous entrez votre ville en premier, votre heure locale sera affichĂ©e aux autres utilisateur·rice·s. _exportOrImport: - allNotes: "Toutes les notes" + allNotes: "Tous les posts" followingList: "Abonnements" muteList: "Comptes masquĂ©s" blockingList: "Comptes bloquĂ©s" @@ -1486,10 +1487,10 @@ _charts: usersIncDec: "Variation du nombre d'utilisateur·rice·s" usersTotal: "Nombre des utilisateur·rice·s au total" activeUsers: "Nombre d'utilisateurices actif·ve·s" - notesIncDec: "Variation du nombre des notes" - localNotesIncDec: "Variation du nombre de notes locales" - remoteNotesIncDec: "Variation du nombre de notes distantes" - notesTotal: "Nombre total des notes" + notesIncDec: "Variation du nombre de publications" + localNotesIncDec: "Variation du nombre de publications locales" + remoteNotesIncDec: "Variation du nombre de publications distantes" + notesTotal: "Nombre total des publications" filesIncDec: "Variation du nombre de fichiers" filesTotal: "Nombre total de fichiers" storageUsageIncDec: "Variation de l'utilisation du stockage" @@ -1498,8 +1499,8 @@ _instanceCharts: requests: "RequĂȘtes" users: "Variation du nombre d'utilisateur·rice·s" usersTotal: "Total cumulĂ© du nombre d'utilisateur·rice·s" - notes: "Variation du nombre de notes" - notesTotal: "Nombre total cumulĂ© des notes" + notes: "Variation du nombre de publications" + notesTotal: "Nombre total cumulĂ© des publications" ff: "Variation des abonné·e·s / abonnements" ffTotal: "Total cumulĂ© du nombre d'abonné·e·s / abonnements" cacheSize: "Variation de la taille du cache" @@ -1587,10 +1588,10 @@ _pages: id: "Toile ID" width: "Largeur" height: "Hauteur" - note: "Note intĂ©grĂ©e" + note: "Post intĂ©grĂ©" _note: - id: "Identifiant de la note" - idDescription: "Vous pouvez aussi coller ici l'URL ici." + id: "Identifiant du post" + idDescription: "Vous pouvez aussi coller l'URL du post ici." detailed: "Afficher les dĂ©tails" switch: "Interrupteur" _switch: @@ -1813,7 +1814,7 @@ _notification: youGotMention: "{name} vous a mentionnĂ©" youGotReply: "RĂ©ponse de {name}" youGotQuote: "Cité·e par {name}" - youRenoted: "{name} vous a RenotĂ©" + youRenoted: "{name} vous a boostĂ©" youGotPoll: "{name} a participĂ© Ă  votre sondage" youGotMessagingMessageFromUser: "{name} vous envoyĂ© un message" youGotMessagingMessageFromGroup: "Un message a Ă©tĂ© envoyĂ© au groupe {name}" @@ -1828,7 +1829,7 @@ _notification: follow: "Nouvel·le abonné·e" mention: "Mentions" reply: "RĂ©ponses" - renote: "Renotes" + renote: "Boosts" quote: "Citations" reaction: "RĂ©actions" pollVote: "Votes dans des sondages" @@ -1840,9 +1841,9 @@ _notification: _actions: followBack: "Suivre" reply: "RĂ©pondre" - renote: "Renoter" + renote: "Boosts" reacted: a rĂ©agit Ă  votre Note - renoted: a boostĂ© votre Note + renoted: a boostĂ© votre post voted: a votĂ© pour votre sondage _deck: alwaysShowMainColumn: "Toujours afficher la colonne principale" @@ -1931,7 +1932,7 @@ moveAccountDescription: Ce processus est irrĂ©versible. Soyez sĂ»r⋅e que vous un alias pour ce compte sur votre nouveau compte avant de migrer. Merci d'entrer la mention du compte formatĂ© comme ceci @personne@server.com moveAccount: DĂ©placer le compte ! -seperateRenoteQuote: SĂ©parer les renotes et les boutons de citation +seperateRenoteQuote: SĂ©parer les boutons de boosts et de citation failedToFetchAccountInformation: Impossible de rĂ©cupĂ©rer les informations de compte noEmailServerWarning: Serveur mail non configurĂ©. deleteAccount: Supprimer le compte @@ -2002,7 +2003,7 @@ forwardReportIsAnonymous: À la place de votre compte, un compte systĂšme anonym affichĂ© comme rapporteur au serveur distant. noThankYou: Non merci addInstance: Ajouter un serveur -renoteMute: Mettre en silence les renotes +renoteMute: Masquer les boosts flagSpeakAsCat: Parler comme un chat flagSpeakAsCatDescription: Vos messages seront nyanifiĂ©s en mode chat hiddenTags: Hashtags cachĂ©s @@ -2059,14 +2060,14 @@ pushNotificationAlreadySubscribed: Notifications push dĂ©jĂ  activĂ©es logoImageUrl: URL de l'image du logo moveToLabel: 'Compte vers lequel vous migrez :' moveFrom: Migrer vers ce compte depuis un ancien compte -defaultReaction: Émoji de rĂ©action par dĂ©faut pour les notes entrantes et sortantes +defaultReaction: Émoji de rĂ©action par dĂ©faut pour les posts entrants et sortants license: Licence -indexPosts: Indexer les Notes +indexPosts: Indexer les Posts indexNotice: Indexation en cours. Cela prendra certainement du temps, veuillez ne pas redĂ©marrer votre serveur pour au moins une heure. customKaTeXMacro: Macros KaTeX personnalisĂ©es enableCustomKaTeXMacro: Activer les macros KaTeX personnalisĂ©es -noteId: ID de Note +noteId: ID des Posts customKaTeXMacroDescription: "DĂ©finissez des macros pour Ă©crire des expressions mathĂ©matiques simplement ! La notation se conforme aux dĂ©finitions de commandes LaTeX et s'Ă©crit \\newcommand{\\·name}{content} ou \\newcommand{\\name}[number of arguments]{content}. @@ -2085,7 +2086,7 @@ deleted: EffacĂ© editNote: Modifier note edited: 'ModifiĂ© Ă  {date} {time}' flagShowTimelineRepliesDescription: Si activĂ©, affiche dans le fil les rĂ©ponses des - utilisatieur·rice·s aux notes des autres. + utilisatieur·rice·s aux posts des autres. _experiments: alpha: Alpha beta: Beta @@ -2096,21 +2097,21 @@ _experiments: peut entraĂźner des ralentissements lors du chargement si votre file d'attente est congestionnĂ©e. findOtherInstance: Trouver un autre serveur -userSaysSomethingReasonQuote: '{name} a citĂ© une note contenant {reason}' +userSaysSomethingReasonQuote: '{name} a citĂ© un post contenant {reason}' signupsDisabled: Les inscriptions sur ce serveur sont actuellement dĂ©sactivĂ©s, mais vous pouvez toujours vous inscrire sur un autre serveur ! Si vous avez un code d'invitation pour ce serveur, entrez-le ci-dessous s'il vous plait. apps: Applications -userSaysSomethingReasonReply: '{noms} a rĂ©pondu Ă  une note contenant {raison}' +userSaysSomethingReasonReply: '{noms} a rĂ©pondu Ă  un post contenant {raison}' defaultValueIs: 'dĂ©faut : {valeur}' searchPlaceholder: Recherchez sur Firefish removeReaction: Retirer votre rĂ©action selectChannel: SĂ©lectionner une chaĂźne -expandOnNoteClick: Ouvrir la note en cliquant +expandOnNoteClick: Ouvrir le post en cliquant preventAiLearning: EmpĂȘcher le rĂ©cupĂ©ration de donnĂ©es par des IA listsDesc: Les listes vous laissent crĂ©er des fils personnalisĂ©s avec des utilisateur·rice·s spĂ©cifié·e·s. Elles sont accessibles depuis la page des fils. -indexFromDescription: Laisser vide pour indexer toutes les Notes +indexFromDescription: Laisser vide pour indexer toutes les Posts _feeds: jsonFeed: flux JSON atom: Atom @@ -2118,9 +2119,9 @@ _feeds: rss: RSS alt: ALT swipeOnMobile: Permettre le balayage entre les pages -expandOnNoteClickDesc: Si dĂ©sactivĂ©, vous pourrez toujours ouvrir les Notes dans le +expandOnNoteClickDesc: Si dĂ©sactivĂ©, vous pourrez toujours ouvrir les posts dans le menu du clic droit et en cliquant sur l’horodatage. -indexFrom: Indexer Ă  partir de l’ID des Notes +indexFrom: Indexer Ă  partir de l’ID des Posts older: plus ancien newer: plus rĂ©cent accessibility: AccessibilitĂ© @@ -2128,7 +2129,7 @@ silencedInstancesDescription: Listez les noms de domaine de serveurs que vous vo masquer. Les comptes des serveurs listĂ©s seront traitĂ©s comme "MasquĂ©s", ne pourront faire que des demandes d’abonnement, et ne pourront pas mentionner les comptes locaux si non-suivis. Cela n’affectera en rien les serveurs bloquĂ©s. -antennasDesc: "Les Antennes affichent de nouvelles notes selon les critĂšres que vous +antennasDesc: "Les Antennes affichent de nouveaux posts selon les critĂšres que vous indiquĂ©s.\nElles peuvent ĂȘtre consultĂ©es depuis la page des fils." image: Image video: VidĂ©o @@ -2138,10 +2139,10 @@ cw: Avertissement de contenu xl: XL reflectMayTakeTime: Il pourra s’écouler un certain temps avant que les changements ne soient reflĂ©tĂ©s. -userSaysSomethingReasonRenote: '{name} a boostĂ© une note contenant {reason}' +userSaysSomethingReasonRenote: '{name} a boostĂ© un post contenant {reason}' sendModMail: Envoyer un avis Ă  la modĂ©ration clipsDesc: Les clips sont comme des favoris catĂ©gorisĂ©s pouvant ĂȘtre partagĂ©s. Vous - pouvez crĂ©er des clips Ă  partir du menu de chaque note. + pouvez crĂ©er des clips Ă  partir du menu de chaque post. unclip: DĂ©-clipper secureMode: Mode sĂ©curisĂ© (Authorized Fetch) secureModeInfo: Quand sollicitĂ© depuis d'autres serveurs, ne pas rĂ©pondre sans preuve. @@ -2174,8 +2175,8 @@ isPatron: MĂ©cĂšne Firefish _filters: fromUser: De l’utilisateur withFile: Avec fichier - notesBefore: Notes avant - notesAfter: Notes aprĂšs + notesBefore: Posts avant + notesAfter: Posts aprĂšs followersOnly: AbonnĂ©s uniquement followingOnly: Abonnements uniquement fromDomain: Du domaine diff --git a/locales/id-ID.yml b/locales/id-ID.yml index a99c6c8e11..7085571aae 100644 --- a/locales/id-ID.yml +++ b/locales/id-ID.yml @@ -1,5 +1,6 @@ _lang_: "Bahasa Indonesia" -headlineFirefish: "Jaringan terhubung melalui catatan" +headlineFirefish: "Platform media sosial sumber terbuka dan terdesentralisasi yang + merdeka sepenuhnya! 🚀" introFirefish: "Selamat datang! Firefish adalah media sosial sumber terbuka dan terdesentralisasi yang selamanya bebas! 🚀" monthAndDay: "{day} {month}" @@ -93,7 +94,7 @@ youShouldUpgradeClient: "Untuk melihat halaman ini, mohon muat ulang untuk memut enterListName: "Masukkan nama daftar" privacy: "Privasi" makeFollowManuallyApprove: "Permintaan mengikuti membutuhkan persetujuan" -defaultNoteVisibility: "Privasi bawaan catatan" +defaultNoteVisibility: "Visibilitas bawaan" follow: "Ikuti" followRequest: "Permintaan Mengikuti" followRequests: "Permintaan mengikuti" @@ -743,7 +744,7 @@ developer: "Pengembang" makeExplorable: "Buat akun tampil di \"Jelajahi\"" makeExplorableDescription: "Jika kamu menonaktifkan ini, akun kamu tidak akan muncul di bagian \"Jelajahi\"." -showGapBetweenNotesInTimeline: "Tampilkan jarak diantara catatan pada linimasa" +showGapBetweenNotesInTimeline: "Tampilkan jarak diantara postingan pada linimasa" duplicate: "Duplikat" left: "Kiri" center: "Tengah" @@ -1245,8 +1246,7 @@ _tutorial: step1_2: "Ayo siapkan. Lekas mulai tanpa basa-basi!" step1_3: "Linimasa kamu kosong, karena kamu belum mencatat catatan apapun atau mengikuti siapapun." - step2_1: "Selesaikan menyetel profilmu sebelum menulis sebuah catatan atau mengikuti - seseorang." + step2_1: "Pertama, isi profilmu lebih dahulu." step2_2: "Menyediakan beberapa informasi tentang siapa kamu akan membuatnya lebih mudah bagi orang lain untuk menentukan jika mereka ingin postinganmu atau mengikutimu." step3_1: "Sekarang saatnya mengikuti beberapa orang!" @@ -1558,7 +1558,7 @@ _pages: if: "Jika" _if: variable: "Variabel" - post: "Buat catatan" + post: "Formulir posting" _post: text: "Isi" attachCanvasImage: "Posting dengan kanvas sebagai gambar" diff --git a/packages/backend/src/misc/post.ts b/packages/backend/src/misc/post.ts index 90f4f75283..dbe703d1a0 100644 --- a/packages/backend/src/misc/post.ts +++ b/packages/backend/src/misc/post.ts @@ -1,16 +1,18 @@ export type Post = { - text: string | null; + text: string | undefined; cw: string | null; localOnly: boolean; createdAt: Date; + visibility: string; }; export function parse(acct: any): Post { return { - text: acct.text, + text: acct.text || undefined, cw: acct.cw, localOnly: acct.localOnly, createdAt: new Date(acct.createdAt), + visibility: "hidden" + (acct.visibility || ""), }; } diff --git a/packages/backend/src/queue/index.ts b/packages/backend/src/queue/index.ts index 93aed7cb8b..0500737a48 100644 --- a/packages/backend/src/queue/index.ts +++ b/packages/backend/src/queue/index.ts @@ -28,6 +28,7 @@ import { backgroundQueue, } from "./queues.js"; import type { ThinUser } from "./types.js"; +import { Note } from "@/models/entities/note.js"; function renderError(e: Error): any { return { @@ -358,6 +359,7 @@ export function createImportCkPostJob( user: ThinUser, post: any, signatureCheck: boolean, + parent: Note | null = null, ) { return dbQueue.add( "importCkPost", @@ -365,6 +367,7 @@ export function createImportCkPostJob( user: user, post: post, signatureCheck: signatureCheck, + parent: parent, }, { removeOnComplete: true, diff --git a/packages/backend/src/queue/processors/db/import-firefish-post.ts b/packages/backend/src/queue/processors/db/import-firefish-post.ts index 504cf9e507..4ec88d32cc 100644 --- a/packages/backend/src/queue/processors/db/import-firefish-post.ts +++ b/packages/backend/src/queue/processors/db/import-firefish-post.ts @@ -3,7 +3,13 @@ import create from "@/services/note/create.js"; import { Users } from "@/models/index.js"; import type { DbUserImportMastoPostJobData } from "@/queue/types.js"; import { queueLogger } from "../../logger.js"; +import { uploadFromUrl } from "@/services/drive/upload-from-url.js"; +import type { DriveFile } from "@/models/entities/drive-file.js"; import type Bull from "bull"; +import { createImportCkPostJob } from "@/queue/index.js"; +import { Notes, NoteEdits } from "@/models/index.js"; +import type { Note } from "@/models/entities/note.js"; +import { genId } from "@/misc/gen-id.js"; const logger = queueLogger.createSubLogger("import-firefish-post"); @@ -17,6 +23,7 @@ export async function importCkPost( return; } const post = job.data.post; + /* if (post.replyId != null) { done(); return; @@ -29,23 +36,74 @@ export async function importCkPost( done(); return; } - const { text, cw, localOnly, createdAt } = Post.parse(post); - const note = await create(user, { + */ + const urls = (post.files || []) + .map((x: any) => x.url) + .filter((x: String) => x.startsWith("http")); + const files: DriveFile[] = []; + for (const url of urls) { + try { + const file = await uploadFromUrl({ + url: url, + user: user, + }); + files.push(file); + } catch (e) { + logger.error(`Skipped adding file to drive: ${url}`); + } + } + const { text, cw, localOnly, createdAt, visibility } = Post.parse(post); + let note = await Notes.findOneBy({ createdAt: createdAt, - files: undefined, - poll: undefined, - text: text || undefined, - reply: null, - renote: null, - cw: cw, - localOnly, - visibility: "hidden", - visibleUsers: [], - channel: null, - apMentions: new Array(0), - apHashtags: undefined, - apEmojis: undefined, + text: text, + userId: user.id, }); + + if (note && (note?.fileIds?.length || 0) < files.length) { + const update: Partial = {}; + update.fileIds = files.map((x) => x.id); + await Notes.update(note.id, update); + await NoteEdits.insert({ + id: genId(), + noteId: note.id, + text: note.text || undefined, + cw: note.cw, + fileIds: note.fileIds, + updatedAt: new Date(), + }); + logger.info(`Note file updated`); + } + if (!note) { + note = await create(user, { + createdAt: createdAt, + files: files.length == 0 ? undefined : files, + poll: undefined, + text: text || undefined, + reply: post.replyId ? job.data.parent : null, + renote: post.renoteId ? job.data.parent : null, + cw: cw, + localOnly, + visibility: visibility, + visibleUsers: [], + channel: null, + apMentions: new Array(0), + apHashtags: undefined, + apEmojis: undefined, + }); + logger.info(`Create new note`); + } else { + logger.info(`Note exist`); + } logger.succ("Imported"); + if (post.childNotes) { + for (const child of post.childNotes) { + createImportCkPostJob( + job.data.user, + child, + job.data.signatureCheck, + note, + ); + } + } done(); } diff --git a/packages/backend/src/queue/processors/db/import-masto-post.ts b/packages/backend/src/queue/processors/db/import-masto-post.ts index 1d18008a0f..9b86a5903f 100644 --- a/packages/backend/src/queue/processors/db/import-masto-post.ts +++ b/packages/backend/src/queue/processors/db/import-masto-post.ts @@ -8,6 +8,9 @@ import { resolveNote } from "@/remote/activitypub/models/note.js"; import { Note } from "@/models/entities/note.js"; import { uploadFromUrl } from "@/services/drive/upload-from-url.js"; import type { DriveFile } from "@/models/entities/drive-file.js"; +import { Notes, NoteEdits } from "@/models/index.js"; +import type { Note } from "@/models/entities/note.js"; +import { genId } from "@/misc/gen-id.js"; const logger = queueLogger.createSubLogger("import-masto-post"); @@ -67,23 +70,47 @@ export async function importMastoPost( } } } - - const note = await create(user, { + let note = await Notes.findOneBy({ createdAt: new Date(post.object.published), - files: files.length == 0 ? undefined : files, - poll: undefined, - text: text || undefined, - reply, - renote: null, - cw: post.object.sensitive ? post.object.summary : undefined, - localOnly: false, - visibility: "hidden", - visibleUsers: [], - channel: null, - apMentions: new Array(0), - apHashtags: undefined, - apEmojis: undefined, + text: text, + userId: user.id, }); + + if (note && (note?.fileIds?.length || 0) < files.length) { + const update: Partial = {}; + update.fileIds = files.map((x) => x.id); + await Notes.update(note.id, update); + await NoteEdits.insert({ + id: genId(), + noteId: note.id, + text: note.text || undefined, + cw: note.cw, + fileIds: note.fileIds, + updatedAt: new Date(), + }); + logger.info(`Note file updated`); + } + if (!note) { + note = await create(user, { + createdAt: new Date(post.object.published), + files: files.length == 0 ? undefined : files, + poll: undefined, + text: text || undefined, + reply, + renote: null, + cw: post.object.sensitive ? post.object.summary : undefined, + localOnly: false, + visibility: "hiddenpublic", + visibleUsers: [], + channel: null, + apMentions: new Array(0), + apHashtags: undefined, + apEmojis: undefined, + }); + logger.info(`Create new note`); + } else { + logger.info(`Note exist`); + } job.progress(100); done(); diff --git a/packages/backend/src/queue/processors/db/import-posts.ts b/packages/backend/src/queue/processors/db/import-posts.ts index 9bde7479ed..526489c634 100644 --- a/packages/backend/src/queue/processors/db/import-posts.ts +++ b/packages/backend/src/queue/processors/db/import-posts.ts @@ -57,7 +57,8 @@ export async function importPosts( const parsed = JSON.parse(json); if (parsed instanceof Array) { logger.info("Parsing key style posts"); - for (const post of JSON.parse(json)) { + const arr = recreateChain(parsed); + for (const post of arr) { createImportCkPostJob(job.data.user, post, job.data.signatureCheck); } } else if (parsed instanceof Object) { @@ -74,3 +75,32 @@ export async function importPosts( logger.succ("Imported"); done(); } + +function recreateChain(arr: any[]): any { + type NotesMap = { + [id: string]: any; + }; + const notesTree: any[] = []; + const lookup: NotesMap = {}; + for (const note of arr) { + lookup[`${note.id}`] = note; + note.childNotes = []; + if (note.replyId == null && note.renoteId == null) { + notesTree.push(note); + } + } + for (const note of arr) { + let parent = null; + if (note.replyId != null) { + parent = lookup[`${note.replyId}`]; + } + if (note.renoteId != null) { + parent = lookup[`${note.renoteId}`]; + } + + if (parent) { + parent.childNotes.push(note); + } + } + return notesTree; +} diff --git a/packages/backend/src/queue/types.ts b/packages/backend/src/queue/types.ts index b72b127894..6383f3fdd5 100644 --- a/packages/backend/src/queue/types.ts +++ b/packages/backend/src/queue/types.ts @@ -52,6 +52,7 @@ export type DbUserImportMastoPostJobData = { user: ThinUser; post: any; signatureCheck: boolean; + parent: Note | null; }; export type ObjectStorageJobData = diff --git a/packages/backend/src/services/note/create.ts b/packages/backend/src/services/note/create.ts index ff752e039f..6efe720ce1 100644 --- a/packages/backend/src/services/note/create.ts +++ b/packages/backend/src/services/note/create.ts @@ -174,7 +174,7 @@ export default async ( // rome-ignore lint/suspicious/noAsyncPromiseExecutor: FIXME new Promise(async (res, rej) => { const dontFederateInitially = - data.localOnly || data.visibility === "hidden"; + data.localOnly || data.visibility?.startsWith("hidden"); // If you reply outside the channel, match the scope of the target. // TODO (I think it's a process that could be done on the client side, but it's server side for now.) @@ -208,7 +208,8 @@ export default async ( if (data.channel != null) data.visibility = "public"; if (data.channel != null) data.visibleUsers = []; if (data.channel != null) data.localOnly = true; - if (data.visibility === "hidden") data.visibility = "public"; + if (data.visibility.startsWith("hidden")) + data.visibility = data.visibility.slice(6); // enforce silent clients on server if ( diff --git a/packages/client/src/components/MkAutocomplete.vue b/packages/client/src/components/MkAutocomplete.vue index 550798e218..5fcee6e5ac 100644 --- a/packages/client/src/components/MkAutocomplete.vue +++ b/packages/client/src/components/MkAutocomplete.vue @@ -430,7 +430,6 @@ function chooseUser() { onUpdated(() => { setPosition(); items.value = suggests.value?.children ?? []; - selectNext(); }); onMounted(() => { @@ -449,7 +448,6 @@ onMounted(() => { exec(); }); }, - { immediate: true }, ); }); }); diff --git a/packages/client/src/components/MkDateSeparatedList.vue b/packages/client/src/components/MkDateSeparatedList.vue index 4958d87708..bbf948e745 100644 --- a/packages/client/src/components/MkDateSeparatedList.vue +++ b/packages/client/src/components/MkDateSeparatedList.vue @@ -132,7 +132,7 @@ export default defineComponent({ display: none; } - > *:not(:last-child) { + &:not(.date-separated-list-nogap) > *:not(:last-child) { margin-bottom: var(--margin); } diff --git a/packages/client/src/pages/announcements.vue b/packages/client/src/pages/announcements.vue index cc62ce0f57..c4ef36a475 100644 --- a/packages/client/src/pages/announcements.vue +++ b/packages/client/src/pages/announcements.vue @@ -5,14 +5,15 @@ />
🆕 @@ -31,7 +32,7 @@ />