Merge branch 'develop' into feat/scylladb
This commit is contained in:
commit
b8d8e2e5f5
18 changed files with 298 additions and 168 deletions
|
@ -29,7 +29,7 @@ url: https://example.com/
|
||||||
# The port that your Firefish server should listen on.
|
# The port that your Firefish server should listen on.
|
||||||
port: 3000
|
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.
|
# If unspecified, the wildcard address will be used.
|
||||||
#bind: 127.0.0.1
|
#bind: 127.0.0.1
|
||||||
|
|
||||||
|
|
|
@ -66,4 +66,3 @@ cache:
|
||||||
- node_modules/
|
- node_modules/
|
||||||
- packages/*/node_modules/
|
- packages/*/node_modules/
|
||||||
- packages/backend/native-utils/node_modules/
|
- packages/backend/native-utils/node_modules/
|
||||||
- packages/backend/native-utils/target/
|
|
||||||
|
|
|
@ -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/)
|
[![Translation bars](https://hosted.weblate.org/widgets/firefish/-/multi-auto.svg)](https://hosted.weblate.org/engage/firefish/)
|
||||||
|
|
||||||
## Roadmap
|
|
||||||
See [FIREFISH.md](./FIREFISH.md)
|
|
||||||
|
|
||||||
## Issues
|
## Issues
|
||||||
Before creating an issue, please check the following:
|
Before creating an issue, please check the following:
|
||||||
- To avoid duplication, please search for similar issues before creating a new issue.
|
- To avoid duplication, please search for similar issues before creating a new issue.
|
||||||
|
|
|
@ -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 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.
|
- 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:
|
- Notable differences:
|
||||||
- Improved UI/UX (especially on mobile)
|
- Improved UI/UX (especially on mobile)
|
||||||
- Post editing
|
- Post editing
|
||||||
|
@ -66,7 +65,7 @@
|
||||||
- Donate publicly to get your name on the Patron list!
|
- Donate publicly to get your name on the Patron list!
|
||||||
- 🚢 Flagship server: <https://firefish.social>
|
- 🚢 Flagship server: <https://firefish.social>
|
||||||
- 💁 Matrix support room: <https://matrix.to/#/#firefish:matrix.fedibird.com>
|
- 💁 Matrix support room: <https://matrix.to/#/#firefish:matrix.fedibird.com>
|
||||||
- 📣 Official account: <https://i.firefish.cloud/@firefish>
|
- 📣 Official account: <a href="https://fedi.software/@firefish" rel="me">@firefish</a>
|
||||||
- 📜 Server list: <https://joinfirefish.org/join>
|
- 📜 Server list: <https://joinfirefish.org/join>
|
||||||
- ✍️ Weblate: <https://hosted.weblate.org/engage/firefish/>
|
- ✍️ Weblate: <https://hosted.weblate.org/engage/firefish/>
|
||||||
- ️️📬 Contact: <https://joinfirefish.org/contact/>
|
- ️️📬 Contact: <https://joinfirefish.org/contact/>
|
||||||
|
|
|
@ -953,9 +953,9 @@ driveCapOverrideCaption: "Gib einen Wert von 0 oder weniger ein, um die Kapazit
|
||||||
auf den Standard zurückzusetzen."
|
auf den Standard zurückzusetzen."
|
||||||
requireAdminForView: "Du musst dich mit einem Administratorkonto anmelden um dies
|
requireAdminForView: "Du musst dich mit einem Administratorkonto anmelden um dies
|
||||||
zu sehen."
|
zu sehen."
|
||||||
isSystemAccount: "Dieses Konto wird vom System erstellt und automatisch verwaltet.
|
isSystemAccount: "Ein Nutzerkonto, dass durch das System erstellt und automatisch
|
||||||
Bitte moderieren, bearbeiten, löschen oder manipulieren Sie dieses Konto nicht,
|
kontrolliert wird. Jede Anpassung, Veränderung oder Löschung dieses Nutzerkontos,
|
||||||
da es sonst zu einem Server-Absturz kommen könnte."
|
kann zu schwerwiegenden Fehlern auf diesem Server führen."
|
||||||
typeToConfirm: "Bitte gib zur Bestätigung {x} ein"
|
typeToConfirm: "Bitte gib zur Bestätigung {x} ein"
|
||||||
deleteAccount: "Nutzerkonto löschen"
|
deleteAccount: "Nutzerkonto löschen"
|
||||||
document: "Dokumentation"
|
document: "Dokumentation"
|
||||||
|
@ -966,7 +966,7 @@ logoutConfirm: "Wirklich abmelden?"
|
||||||
lastActiveDate: "Zuletzt verwendet am"
|
lastActiveDate: "Zuletzt verwendet am"
|
||||||
statusbar: "Statusleiste"
|
statusbar: "Statusleiste"
|
||||||
pleaseSelect: "Wähle eine Option"
|
pleaseSelect: "Wähle eine Option"
|
||||||
reverse: "Umkehren"
|
reverse: "Rückgängig machen"
|
||||||
colored: "Farbig"
|
colored: "Farbig"
|
||||||
refreshInterval: "Aktualisierungsintervall "
|
refreshInterval: "Aktualisierungsintervall "
|
||||||
label: "Beschriftung"
|
label: "Beschriftung"
|
||||||
|
@ -1128,7 +1128,7 @@ _mfm:
|
||||||
bold: "Fett"
|
bold: "Fett"
|
||||||
boldDescription: "Zeichen zur Betonung dicker erscheinen lassen."
|
boldDescription: "Zeichen zur Betonung dicker erscheinen lassen."
|
||||||
small: "Klein"
|
small: "Klein"
|
||||||
smallDescription: "Inhalt klein und dünn erscheinen lassen."
|
smallDescription: "Inhalt klein und dünn anzeigen."
|
||||||
center: "Zentrieren"
|
center: "Zentrieren"
|
||||||
centerDescription: "Inhalt zentriert anzeigen."
|
centerDescription: "Inhalt zentriert anzeigen."
|
||||||
inlineCode: "Code (Eingebettet)"
|
inlineCode: "Code (Eingebettet)"
|
||||||
|
@ -2191,3 +2191,13 @@ _skinTones:
|
||||||
showPopup: Benutzer mit Popup benachrichtigen
|
showPopup: Benutzer mit Popup benachrichtigen
|
||||||
showWithSparkles: Mit Glitzer anzeigen
|
showWithSparkles: Mit Glitzer anzeigen
|
||||||
removeQuote: Zitat entfernen
|
removeQuote: Zitat entfernen
|
||||||
|
objectStorageS3ForcePathStyle: Verwende pfadbasierte Endpunkt-URLs
|
||||||
|
objectStorageS3ForcePathStyleDesc: Wenn aktiviert, werden Endpunkt-URLs im Format
|
||||||
|
's3.amazonaws.com/<bucket>/' statt '<bucket>.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
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
_lang_: "Français"
|
_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é
|
introFirefish: "Bienvenue ! Firefish est une plateforme de réseau social décentralisé
|
||||||
et open source qui est gratuite pour toujours ! 🚀"
|
et open source qui est gratuite pour toujours ! 🚀"
|
||||||
monthAndDay: "{day}/{month}"
|
monthAndDay: "{day}/{month}"
|
||||||
|
@ -13,8 +14,8 @@ ok: "OK"
|
||||||
gotIt: "J’ai compris !"
|
gotIt: "J’ai compris !"
|
||||||
cancel: "Annuler"
|
cancel: "Annuler"
|
||||||
enterUsername: "Entrer un nom d’utilisateur·rice"
|
enterUsername: "Entrer un nom d’utilisateur·rice"
|
||||||
renotedBy: "Renoté par {user}"
|
renotedBy: "Boosté par {user}"
|
||||||
noNotes: "Aucune note"
|
noNotes: "Aucun post"
|
||||||
noNotifications: "Aucune notification"
|
noNotifications: "Aucune notification"
|
||||||
instance: "Serveur"
|
instance: "Serveur"
|
||||||
settings: "Paramètres"
|
settings: "Paramètres"
|
||||||
|
@ -45,8 +46,8 @@ copyContent: "Copier le contenu"
|
||||||
copyLink: "Copier le lien"
|
copyLink: "Copier le lien"
|
||||||
delete: "Supprimer"
|
delete: "Supprimer"
|
||||||
deleteAndEdit: "Supprimer et réécrire"
|
deleteAndEdit: "Supprimer et réécrire"
|
||||||
deleteAndEditConfirm: "Êtes-vous sûr·e de vouloir supprimer cette note et la reformuler
|
deleteAndEditConfirm: "Êtes-vous sûr·e de vouloir supprimer ce post et le reformuler
|
||||||
? Vous perdrez toutes les réactions, renotes et réponses y afférentes."
|
? Vous perdrez toutes les réactions, boosts et réponses liées."
|
||||||
addToList: "Ajouter à une liste"
|
addToList: "Ajouter à une liste"
|
||||||
sendMessage: "Envoyer un message"
|
sendMessage: "Envoyer un message"
|
||||||
copyUsername: "Copier le nom d’utilisateur·rice"
|
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"
|
followRequestAccepted: "La demande d’abonnement a été acceptée"
|
||||||
mention: "Mentionner"
|
mention: "Mentionner"
|
||||||
mentions: "Mentions"
|
mentions: "Mentions"
|
||||||
directNotes: "Notes directes"
|
directNotes: "Messages directs"
|
||||||
importAndExport: "Import et export"
|
importAndExport: "Import et export"
|
||||||
import: "Importer"
|
import: "Importer"
|
||||||
export: "Exporter"
|
export: "Exporter"
|
||||||
files: "Fichiers"
|
files: "Fichiers"
|
||||||
download: "Télécharger"
|
download: "Télécharger"
|
||||||
driveFileDeleteConfirm: "Êtes-vous sûr·e de vouloir supprimer le fichier \"{name}\"\
|
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} ?"
|
unfollowConfirm: "Désirez-vous vous désabonner de {name} ?"
|
||||||
exportRequested: "Vous avez demandé une exportation. L’opération pourrait prendre
|
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."
|
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"
|
enterListName: "Nom de la liste"
|
||||||
privacy: "Confidentialité"
|
privacy: "Confidentialité"
|
||||||
makeFollowManuallyApprove: "Accepter manuellement les demandes d’abonnement"
|
makeFollowManuallyApprove: "Accepter manuellement les demandes d’abonnement"
|
||||||
defaultNoteVisibility: "Visibilité des notes par défaut"
|
defaultNoteVisibility: "Visibilité des posts par défaut"
|
||||||
follow: "S’abonner"
|
follow: "S’abonner"
|
||||||
followRequest: "Demande d’abonnement"
|
followRequest: "Demande d’abonnement"
|
||||||
followRequests: "Demandes d’abonnement"
|
followRequests: "Demandes d’abonnement"
|
||||||
unfollow: "Se désabonner"
|
unfollow: "Se désabonner"
|
||||||
followRequestPending: "Demande d'abonnement en attente de confirmation"
|
followRequestPending: "Demande d'abonnement en attente de confirmation"
|
||||||
enterEmoji: "Insérer un émoji"
|
enterEmoji: "Insérer un émoji"
|
||||||
renote: "Renoter"
|
renote: "Booster"
|
||||||
unrenote: "Annuler la Renote"
|
unrenote: "Annuler le boost"
|
||||||
renoted: "Renoté."
|
renoted: "Boosté."
|
||||||
cantRenote: "Ce message ne peut pas être renoté."
|
cantRenote: "Ce message ne peut pas être boosté."
|
||||||
cantReRenote: "Impossible de renoter une Renote."
|
cantReRenote: "Impossible de partager ce boost."
|
||||||
quote: "Citer"
|
quote: "Citer"
|
||||||
pinnedNote: "Note épinglée"
|
pinnedNote: "Note épinglée"
|
||||||
pinned: "Épingler sur le profil"
|
pinned: "Épingler sur le profil"
|
||||||
|
@ -117,9 +118,9 @@ reaction: "Réactions"
|
||||||
reactionSetting: "Réactions à afficher dans le sélecteur de réactions"
|
reactionSetting: "Réactions à afficher dans le sélecteur de réactions"
|
||||||
reactionSettingDescription2: "Déplacer pour réorganiser, cliquer pour effacer, utiliser
|
reactionSettingDescription2: "Déplacer pour réorganiser, cliquer pour effacer, utiliser
|
||||||
« + » pour ajouter."
|
« + » 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
|
\" 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é"
|
attachCancel: "Supprimer le fichier attaché"
|
||||||
markAsSensitive: "Marquer comme sensible"
|
markAsSensitive: "Marquer comme sensible"
|
||||||
unmarkAsSensitive: "Supprimer le marquage comme sensible"
|
unmarkAsSensitive: "Supprimer le marquage comme sensible"
|
||||||
|
@ -175,9 +176,9 @@ proxyAccount: "Compte proxy"
|
||||||
proxyAccountDescription: "Un compte proxy se comporte, dans certaines conditions,
|
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
|
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
|
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
|
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"
|
host: "Serveur distant"
|
||||||
selectUser: "Sélectionner un·e utilisateur·rice"
|
selectUser: "Sélectionner un·e utilisateur·rice"
|
||||||
recipient: "Destinataire"
|
recipient: "Destinataire"
|
||||||
|
@ -207,7 +208,7 @@ instanceInfo: "Informations du serveur"
|
||||||
statistics: "Statistiques"
|
statistics: "Statistiques"
|
||||||
clearQueue: "Vider la file d’attente"
|
clearQueue: "Vider la file d’attente"
|
||||||
clearQueueConfirmTitle: "Êtes-vous sûr·e de vouloir 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."
|
vous n'avez pas besoin d'effectuer cette opération."
|
||||||
clearCachedFiles: "Vider le cache"
|
clearCachedFiles: "Vider le cache"
|
||||||
clearCachedFilesConfirm: "Êtes-vous sûr·e de vouloir vider tout le cache de fichiers
|
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"
|
blockedUsers: "Utilisateur·rice·s bloqué·e·s"
|
||||||
noUsers: "Il n’y a pas d’utilisateur·rice·s"
|
noUsers: "Il n’y a pas d’utilisateur·rice·s"
|
||||||
editProfile: "Modifier votre profil"
|
editProfile: "Modifier votre profil"
|
||||||
noteDeleteConfirm: "Êtes-vous sûr·e de vouloir supprimer cette note ?"
|
noteDeleteConfirm: "Êtes-vous sûr·e de vouloir supprimer ce post ?"
|
||||||
pinLimitExceeded: "Vous ne pouvez pas épingler plus de notes"
|
pinLimitExceeded: "Vous ne pouvez pas épingler plus de posts"
|
||||||
intro: "L’installation de Firefish est terminée ! Veuillez créer un compte administrateur."
|
intro: "L’installation de Firefish est terminée ! Veuillez créer un compte administrateur."
|
||||||
done: "Terminé"
|
done: "Terminé"
|
||||||
processing: "Traitement en cours"
|
processing: "Traitement en cours"
|
||||||
|
@ -366,7 +367,7 @@ pinnedPages: "Pages épinglées"
|
||||||
pinnedPagesDescription: "Inscrivez le chemin des Pages que vous souhaitez épingler
|
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."
|
en haut de la page du serveur. Séparez les d'un retour à la ligne."
|
||||||
pinnedClipId: "Identifiant du clip épinglé"
|
pinnedClipId: "Identifiant du clip épinglé"
|
||||||
pinnedNotes: "Note épinglée"
|
pinnedNotes: "Posts épinglée"
|
||||||
hcaptcha: "hCaptcha"
|
hcaptcha: "hCaptcha"
|
||||||
enableHcaptcha: "Activer hCaptcha"
|
enableHcaptcha: "Activer hCaptcha"
|
||||||
hcaptchaSiteKey: "Clé du site"
|
hcaptchaSiteKey: "Clé du site"
|
||||||
|
@ -386,14 +387,14 @@ antennaKeywords: "Mots clés à recevoir"
|
||||||
antennaExcludeKeywords: "Mots clés à exclure"
|
antennaExcludeKeywords: "Mots clés à exclure"
|
||||||
antennaKeywordsDescription: "Séparer avec des espaces pour la condition AND. Séparer
|
antennaKeywordsDescription: "Séparer avec des espaces pour la condition AND. Séparer
|
||||||
avec un saut de ligne pour une condition OR."
|
avec un saut de ligne pour une condition OR."
|
||||||
notifyAntenna: "Je souhaite recevoir les notifications des nouvelles notes"
|
notifyAntenna: "Je souhaite recevoir les notifications des nouveaux posts"
|
||||||
withFileAntenna: "Notes ayant des attachements uniquement"
|
withFileAntenna: "Posts ayant des attachements uniquement"
|
||||||
enableServiceworker: "Activer ServiceWorker"
|
enableServiceworker: "Activer ServiceWorker"
|
||||||
antennaUsersDescription: "Saisissez un seul nom d’utilisateur·rice par ligne"
|
antennaUsersDescription: "Saisissez un seul nom d’utilisateur·rice par ligne"
|
||||||
caseSensitive: "Sensible à la casse"
|
caseSensitive: "Sensible à la casse"
|
||||||
withReplies: "Inclure les réponses"
|
withReplies: "Inclure les réponses"
|
||||||
connectedTo: "Vous êtes connectés aux services suivants"
|
connectedTo: "Vous êtes connectés aux services suivants"
|
||||||
notesAndReplies: "Notes et Réponses"
|
notesAndReplies: "Posts et Réponses"
|
||||||
withFiles: "Avec fichiers joints"
|
withFiles: "Avec fichiers joints"
|
||||||
silence: "Mettre en sourdine"
|
silence: "Mettre en sourdine"
|
||||||
silenceConfirm: "Êtes-vous sûr·e de vouloir mettre l’utilisateur·rice 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"
|
uploadFolder: "Emplacement de téléversement par défaut"
|
||||||
cacheClear: "Vider le cache"
|
cacheClear: "Vider le cache"
|
||||||
markAsReadAllNotifications: "Marquer toutes les notifications comme lues"
|
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"
|
markAsReadAllTalkMessages: "Marquer toutes les discussions comme lues"
|
||||||
help: "Aide"
|
help: "Aide"
|
||||||
inputMessageHere: "Écrivez votre message ici"
|
inputMessageHere: "Écrivez votre message ici"
|
||||||
|
@ -452,7 +453,7 @@ text: "Texte"
|
||||||
enable: "Activer"
|
enable: "Activer"
|
||||||
next: "Suivant"
|
next: "Suivant"
|
||||||
retype: "Confirmation"
|
retype: "Confirmation"
|
||||||
noteOf: "Notes de {user}"
|
noteOf: "Posts de {user}"
|
||||||
inviteToGroup: "Inviter dans un groupe"
|
inviteToGroup: "Inviter dans un groupe"
|
||||||
quoteAttached: "Avec citation"
|
quoteAttached: "Avec citation"
|
||||||
quoteQuestion: "Souhaitez-vous ajouter une citation ?"
|
quoteQuestion: "Souhaitez-vous ajouter une citation ?"
|
||||||
|
@ -512,8 +513,8 @@ accountSettings: "Paramètres du compte"
|
||||||
promotion: "Promu"
|
promotion: "Promu"
|
||||||
promote: "Promouvoir"
|
promote: "Promouvoir"
|
||||||
numberOfDays: "Nombre de jours"
|
numberOfDays: "Nombre de jours"
|
||||||
hideThisNote: "Masquer cette note"
|
hideThisNote: "Masquer ce post"
|
||||||
showFeaturedNotesInTimeline: "Afficher les notes des Tendances dans le fil d'actualité"
|
showFeaturedNotesInTimeline: "Afficher les posts des Tendances dans le fil d'actualité"
|
||||||
objectStorage: "Stockage d'objets"
|
objectStorage: "Stockage d'objets"
|
||||||
useObjectStorage: "Utiliser le stockage d'objets"
|
useObjectStorage: "Utiliser le stockage d'objets"
|
||||||
objectStorageBaseUrl: "Base URL"
|
objectStorageBaseUrl: "Base URL"
|
||||||
|
@ -544,7 +545,7 @@ objectStorageSetPublicRead: "Régler sur « public » lors de l'envoi"
|
||||||
serverLogs: "Journal du serveur"
|
serverLogs: "Journal du serveur"
|
||||||
deleteAll: "Supprimer tout"
|
deleteAll: "Supprimer tout"
|
||||||
showFixedPostForm: "Afficher le formulaire de publication en haut du fil d'actualité"
|
showFixedPostForm: "Afficher le formulaire de publication en haut du fil d'actualité"
|
||||||
newNoteRecived: "Voir les nouvelles notes"
|
newNoteRecived: "Voir les nouveaux posts"
|
||||||
sounds: "Sons"
|
sounds: "Sons"
|
||||||
listen: "Écouter"
|
listen: "Écouter"
|
||||||
none: "Rien"
|
none: "Rien"
|
||||||
|
@ -594,8 +595,8 @@ addRelay: "Ajouter un relais"
|
||||||
inboxUrl: "Inbox URL"
|
inboxUrl: "Inbox URL"
|
||||||
addedRelays: "Relais ajoutés"
|
addedRelays: "Relais ajoutés"
|
||||||
serviceworkerInfo: "Devrait être activé pour les notifications push."
|
serviceworkerInfo: "Devrait être activé pour les notifications push."
|
||||||
deletedNote: "Note supprimée"
|
deletedNote: "Post supprimé"
|
||||||
invisibleNote: "Note invisible"
|
invisibleNote: "Post invisible"
|
||||||
enableInfiniteScroll: "Activer le défilement infini"
|
enableInfiniteScroll: "Activer le défilement infini"
|
||||||
visibility: "Visibilité"
|
visibility: "Visibilité"
|
||||||
poll: "Sondage"
|
poll: "Sondage"
|
||||||
|
@ -680,7 +681,7 @@ abuseReports: "Signalements"
|
||||||
reportAbuse: "Signaler"
|
reportAbuse: "Signaler"
|
||||||
reportAbuseOf: "Signaler {name}"
|
reportAbuseOf: "Signaler {name}"
|
||||||
fillAbuseReportDescription: "Veuillez expliquer les raisons du signalement. S'il s'agit
|
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."
|
abuseReported: "Le rapport est envoyé. Merci."
|
||||||
reporter: "Signalé par"
|
reporter: "Signalé par"
|
||||||
reporteeOrigin: "Origine du signalement"
|
reporteeOrigin: "Origine du signalement"
|
||||||
|
@ -693,7 +694,7 @@ openInSideView: "Ouvrir en vue latérale"
|
||||||
defaultNavigationBehaviour: "Navigation par défaut"
|
defaultNavigationBehaviour: "Navigation par défaut"
|
||||||
editTheseSettingsMayBreakAccount: "La modification de ces paramètres peut endommager
|
editTheseSettingsMayBreakAccount: "La modification de ces paramètres peut endommager
|
||||||
votre compte."
|
votre compte."
|
||||||
instanceTicker: "Nom du serveur d'origine des notes"
|
instanceTicker: "Nom du serveur d'origine des posts"
|
||||||
waitingFor: "En attente de {x}"
|
waitingFor: "En attente de {x}"
|
||||||
random: "Aléatoire"
|
random: "Aléatoire"
|
||||||
system: "Système"
|
system: "Système"
|
||||||
|
@ -708,11 +709,11 @@ i18nInfo: "Firefish est traduit dans différentes langues par des bénévoles. V
|
||||||
contribuer à {link}."
|
contribuer à {link}."
|
||||||
manageAccessTokens: "Gérer les jetons d'accès"
|
manageAccessTokens: "Gérer les jetons d'accès"
|
||||||
accountInfo: " Informations du compte "
|
accountInfo: " Informations du compte "
|
||||||
notesCount: "Nombre de notes"
|
notesCount: "Nombre de posts"
|
||||||
repliesCount: "Nombre de réponses envoyées"
|
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"
|
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"
|
followingCount: "Nombre de comptes suivis"
|
||||||
followersCount: "Nombre d'abonnés"
|
followersCount: "Nombre d'abonnés"
|
||||||
sentReactionsCount: "Nombre de réactions envoyées"
|
sentReactionsCount: "Nombre de réactions envoyées"
|
||||||
|
@ -725,9 +726,9 @@ driveFilesCount: "Nombre de fichiers dans le Drive"
|
||||||
driveUsage: "Utilisation du Drive"
|
driveUsage: "Utilisation du Drive"
|
||||||
noCrawle: "Refuser l'indexation par les robots"
|
noCrawle: "Refuser l'indexation par les robots"
|
||||||
noCrawleDescription: "Demandez aux moteurs de recherche de ne pas indexer votre page
|
noCrawleDescription: "Demandez aux moteurs de recherche de ne pas indexer votre page
|
||||||
de profil, vos notes, vos pages, etc."
|
de profil, vos posts, vos pages, etc."
|
||||||
lockedAccountInfo: "À moins que vous ne définissiez la visibilité de votre note sur
|
lockedAccountInfo: "À moins que vous ne définissiez la visibilité de votre post sur
|
||||||
\"Abonné-e-s\", vos notes sont visibles par tous, même si vous exigez que les demandes
|
\"Abonné-e-s\", vos posts sont visibles par tous, même si vous exigez que les demandes
|
||||||
d'abonnement soient approuvées manuellement."
|
d'abonnement soient approuvées manuellement."
|
||||||
alwaysMarkSensitive: "Marquer les médias comme contenu sensible par défaut"
|
alwaysMarkSensitive: "Marquer les médias comme contenu sensible par défaut"
|
||||||
loadRawImages: "Affichage complet des images jointes au lieu des vignettes"
|
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."
|
lien pour compléter la vérification."
|
||||||
notSet: "Non défini"
|
notSet: "Non défini"
|
||||||
emailVerified: "Votre adresse e-mail a été vérifiée."
|
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"
|
pageLikesCount: "Nombre de pages aimées"
|
||||||
pageLikedCount: "Nombre de vos pages aimées"
|
pageLikedCount: "Nombre de vos pages aimées"
|
||||||
contact: "Contact"
|
contact: "Contact"
|
||||||
|
@ -747,7 +748,7 @@ developer: "Développeur"
|
||||||
makeExplorable: "Rendre le compte visible sur la page \"Découvrir\"."
|
makeExplorable: "Rendre le compte visible sur la page \"Découvrir\"."
|
||||||
makeExplorableDescription: "Si vous désactivez cette option, votre compte n'apparaîtra
|
makeExplorableDescription: "Si vous désactivez cette option, votre compte n'apparaîtra
|
||||||
pas sur la page \"Découvrir\"."
|
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"
|
duplicate: "Duliquer"
|
||||||
left: "Gauche"
|
left: "Gauche"
|
||||||
center: "Centrer"
|
center: "Centrer"
|
||||||
|
@ -760,7 +761,7 @@ showTitlebar: "Afficher la barre de titre"
|
||||||
clearCache: "Vider le cache"
|
clearCache: "Vider le cache"
|
||||||
onlineUsersCount: "{n} utilisateur(s) en ligne"
|
onlineUsersCount: "{n} utilisateur(s) en ligne"
|
||||||
nUsers: "{n} utilisateur·rice·s"
|
nUsers: "{n} utilisateur·rice·s"
|
||||||
nNotes: "{n} Notes"
|
nNotes: "{n} Posts"
|
||||||
sendErrorReports: "Envoyer les rapports d’erreur"
|
sendErrorReports: "Envoyer les rapports d’erreur"
|
||||||
sendErrorReportsDescription: "Si vous activez l'envoi des rapports d'erreur, vous
|
sendErrorReportsDescription: "Si vous activez l'envoi des rapports d'erreur, vous
|
||||||
contribuerez à améliorer la qualité de Firefish grâce au partage d'informations
|
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"
|
fullView: "Plein écran"
|
||||||
quitFullView: "Quitter le plein écran"
|
quitFullView: "Quitter le plein écran"
|
||||||
addDescription: "Ajouter une description"
|
addDescription: "Ajouter une description"
|
||||||
userPagePinTip: "Vous pouvez afficher des notes ici en sélectionnant l'option « Épingler
|
userPagePinTip: "Vous pouvez afficher des posts ici en sélectionnant l'option « Épingler
|
||||||
au profil » dans le menu de chaque note."
|
au profil » dans le menu de chaque post."
|
||||||
notSpecifiedMentionWarning: "Vous avez mentionné des utilisateur·rice·s qui ne font
|
notSpecifiedMentionWarning: "Vous avez mentionné des utilisateur·rice·s qui ne font
|
||||||
pas partie de la liste des destinataires"
|
pas partie de la liste des destinataires"
|
||||||
info: "Informations"
|
info: "Informations"
|
||||||
|
@ -838,7 +839,7 @@ postToGallery: "Publier dans la galerie"
|
||||||
gallery: "Galerie"
|
gallery: "Galerie"
|
||||||
recentPosts: "Les plus récentes"
|
recentPosts: "Les plus récentes"
|
||||||
popularPosts: "Les plus consultées"
|
popularPosts: "Les plus consultées"
|
||||||
shareWithNote: "Partager dans une note"
|
shareWithNote: "Partager dans un post"
|
||||||
ads: "Bannière communautaire"
|
ads: "Bannière communautaire"
|
||||||
expiration: "Échéance"
|
expiration: "Échéance"
|
||||||
memo: "Pense-bête"
|
memo: "Pense-bête"
|
||||||
|
@ -1121,7 +1122,7 @@ _channel:
|
||||||
owned: "Mes canaux"
|
owned: "Mes canaux"
|
||||||
following: "Abonné·e"
|
following: "Abonné·e"
|
||||||
usersCount: "{n} Participant·e·s"
|
usersCount: "{n} Participant·e·s"
|
||||||
notesCount: "{n} Notes"
|
notesCount: "{n} Posts"
|
||||||
nameAndDescription: Nom et description
|
nameAndDescription: Nom et description
|
||||||
nameOnly: Nom uniquement
|
nameOnly: Nom uniquement
|
||||||
_menuDisplay:
|
_menuDisplay:
|
||||||
|
@ -1135,20 +1136,20 @@ _wordMute:
|
||||||
un saut de ligne pour une condition OR."
|
un saut de ligne pour une condition OR."
|
||||||
muteWordsDescription2: "Pour utiliser des expressions régulières (regex), mettez
|
muteWordsDescription2: "Pour utiliser des expressions régulières (regex), mettez
|
||||||
les mots-clés entre barres obliques."
|
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."
|
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
|
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"
|
soft: "Doux"
|
||||||
hard: "Strict"
|
hard: "Strict"
|
||||||
mutedNotes: "Notes filtrées"
|
mutedNotes: "Posts filtrés"
|
||||||
_instanceMute:
|
_instanceMute:
|
||||||
instanceMuteDescription2: "Séparer avec des sauts de lignes"
|
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"
|
heading: "Serveurs à mettre en sourdine/masquer"
|
||||||
instanceMuteDescription: Ceci va masquer toute publication ou partage de serveurs
|
instanceMuteDescription: Ceci va masquer toute posts ou boosts de serveurs listés,
|
||||||
listés, incluant celles des personnes répondant à des personnes des serveurs masqués.
|
incluant celles des personnes répondant à des personnes des serveurs masqués.
|
||||||
_theme:
|
_theme:
|
||||||
explore: "Explorer les thèmes"
|
explore: "Explorer les thèmes"
|
||||||
install: "Installer un thème"
|
install: "Installer un thème"
|
||||||
|
@ -1199,7 +1200,7 @@ _theme:
|
||||||
hashtag: "Hashtags"
|
hashtag: "Hashtags"
|
||||||
mention: "Mentionner"
|
mention: "Mentionner"
|
||||||
mentionMe: "Mentions (Moi)"
|
mentionMe: "Mentions (Moi)"
|
||||||
renote: "Renoter"
|
renote: "Booster"
|
||||||
modalBg: "Modal d'arrière-plan"
|
modalBg: "Modal d'arrière-plan"
|
||||||
divider: "Séparateur"
|
divider: "Séparateur"
|
||||||
scrollbarHandle: "Poignée de la barre de navigation"
|
scrollbarHandle: "Poignée de la barre de navigation"
|
||||||
|
@ -1226,8 +1227,8 @@ _theme:
|
||||||
accentLighten: "Plus clair"
|
accentLighten: "Plus clair"
|
||||||
fgHighlighted: "Texte mis en évidence"
|
fgHighlighted: "Texte mis en évidence"
|
||||||
_sfx:
|
_sfx:
|
||||||
note: "Nouvelle note"
|
note: "Nouveau post"
|
||||||
noteMy: "Ma note"
|
noteMy: "Mon post"
|
||||||
notification: "Notifications"
|
notification: "Notifications"
|
||||||
chat: "Discuter"
|
chat: "Discuter"
|
||||||
chatBg: "Discussion (arrière-plan)"
|
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"
|
step1_2: "On va vous installer. Vous serez opérationnel en un rien de temps"
|
||||||
step2_1: "Tout d'abord, remplissez votre profil"
|
step2_1: "Tout d'abord, remplissez votre profil"
|
||||||
step2_2: "En fournissant quelques informations sur qui vous êtes, il sera plus facile
|
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_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
|
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
|
vous suivez, alors essayez de suivre quelques comptes pour commencer.\nCliquez
|
||||||
sur le cercle plus en haut à droite d'un profil pour le suivre."
|
sur le cercle plus en haut à droite d'un profil pour le suivre."
|
||||||
step4_1: "On y va."
|
step4_1: "On y va."
|
||||||
step4_2: "Pour votre première note, certaines personnes aiment faire une note {introduction}
|
step4_2: "Pour votre premier post, certaines personnes aiment faire un post {introduction}
|
||||||
ou une simple note 'Bonjours tout le monde !'."
|
ou un simple 'Bonjours tout le monde !'"
|
||||||
step5_1: "Des fils, des fils d’actualité partout !"
|
step5_1: "Des fils, des fils d’actualité partout !"
|
||||||
step5_2: "Votre serveur a {timelines} fils différents disponibles !"
|
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
|
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"
|
"write:messaging": "Gérer les discussions"
|
||||||
"read:mutes": "Voir les comptes masqués"
|
"read:mutes": "Voir les comptes masqués"
|
||||||
"write:mutes": "Gérer 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"
|
"read:notifications": "Afficher les notifications"
|
||||||
"write:notifications": "Gérer vos notifications"
|
"write:notifications": "Gérer vos notifications"
|
||||||
"read:reactions": "Lire les réactions"
|
"read:reactions": "Lire les réactions"
|
||||||
|
@ -1363,12 +1364,12 @@ _auth:
|
||||||
copyAsk: "Veuillez coller le code d’autorisation suivant dans l'application :"
|
copyAsk: "Veuillez coller le code d’autorisation suivant dans l'application :"
|
||||||
allPermissions: Accès complet au compte
|
allPermissions: Accès complet au compte
|
||||||
_antennaSources:
|
_antennaSources:
|
||||||
all: "Toutes les notes"
|
all: "Tous les posts"
|
||||||
homeTimeline: "Notes provenant des utilisateur·rice·s auxquel·les je suis abonné"
|
homeTimeline: "Posts provenant des utilisateur·rice·s auxquel·les je suis abonné"
|
||||||
users: "Notes venant de la part d’utilisateur·rice·s précis"
|
users: "Posts venant de la part d’utilisateur·rice·s précis"
|
||||||
userList: "Notes venant d’une liste spécifique"
|
userList: "Posts venant d’une liste spécifique"
|
||||||
userGroup: "Notes venant d’utilisateur·rice·s du groupe spécifié"
|
userGroup: "Posts venant d’utilisateur·rice·s du groupe spécifié"
|
||||||
instances: Notes de tous les utilisateurs d'un serveur
|
instances: Posts de tous les utilisateurs d'un serveur
|
||||||
_weekday:
|
_weekday:
|
||||||
sunday: "Dimanche"
|
sunday: "Dimanche"
|
||||||
monday: "Lundi"
|
monday: "Lundi"
|
||||||
|
@ -1401,7 +1402,7 @@ _widgets:
|
||||||
_userList:
|
_userList:
|
||||||
chooseList: Sélectionner une liste
|
chooseList: Sélectionner une liste
|
||||||
unixClock: Horloge UNIX
|
unixClock: Horloge UNIX
|
||||||
meiliIndexCount: Notes indexées
|
meiliIndexCount: Posts indexés
|
||||||
serverInfo: Info serveur
|
serverInfo: Info serveur
|
||||||
meiliStatus: État du serveur
|
meiliStatus: État du serveur
|
||||||
meiliSize: Taille de l’index
|
meiliSize: Taille de l’index
|
||||||
|
@ -1446,8 +1447,8 @@ _visibility:
|
||||||
localOnly: "Local seulement"
|
localOnly: "Local seulement"
|
||||||
localOnlyDescription: "Caché pour les utilisateur·rice·s distant"
|
localOnlyDescription: "Caché pour les utilisateur·rice·s distant"
|
||||||
_postForm:
|
_postForm:
|
||||||
replyPlaceholder: "Répondre à cette note ..."
|
replyPlaceholder: "Répondre à ce post ..."
|
||||||
quotePlaceholder: "Citez cette note ..."
|
quotePlaceholder: "Citez ce post ..."
|
||||||
channelPlaceholder: "Publier sur une chaîne…"
|
channelPlaceholder: "Publier sur une chaîne…"
|
||||||
_placeholders:
|
_placeholders:
|
||||||
a: "Quoi de neuf ?"
|
a: "Quoi de neuf ?"
|
||||||
|
@ -1473,7 +1474,7 @@ _profile:
|
||||||
locationDescription: Si vous entrez votre ville en premier, votre heure locale sera
|
locationDescription: Si vous entrez votre ville en premier, votre heure locale sera
|
||||||
affichée aux autres utilisateur·rice·s.
|
affichée aux autres utilisateur·rice·s.
|
||||||
_exportOrImport:
|
_exportOrImport:
|
||||||
allNotes: "Toutes les notes"
|
allNotes: "Tous les posts"
|
||||||
followingList: "Abonnements"
|
followingList: "Abonnements"
|
||||||
muteList: "Comptes masqués"
|
muteList: "Comptes masqués"
|
||||||
blockingList: "Comptes bloqués"
|
blockingList: "Comptes bloqués"
|
||||||
|
@ -1486,10 +1487,10 @@ _charts:
|
||||||
usersIncDec: "Variation du nombre d'utilisateur·rice·s"
|
usersIncDec: "Variation du nombre d'utilisateur·rice·s"
|
||||||
usersTotal: "Nombre des utilisateur·rice·s au total"
|
usersTotal: "Nombre des utilisateur·rice·s au total"
|
||||||
activeUsers: "Nombre d'utilisateurices actif·ve·s"
|
activeUsers: "Nombre d'utilisateurices actif·ve·s"
|
||||||
notesIncDec: "Variation du nombre des notes"
|
notesIncDec: "Variation du nombre de publications"
|
||||||
localNotesIncDec: "Variation du nombre de notes locales"
|
localNotesIncDec: "Variation du nombre de publications locales"
|
||||||
remoteNotesIncDec: "Variation du nombre de notes distantes"
|
remoteNotesIncDec: "Variation du nombre de publications distantes"
|
||||||
notesTotal: "Nombre total des notes"
|
notesTotal: "Nombre total des publications"
|
||||||
filesIncDec: "Variation du nombre de fichiers"
|
filesIncDec: "Variation du nombre de fichiers"
|
||||||
filesTotal: "Nombre total de fichiers"
|
filesTotal: "Nombre total de fichiers"
|
||||||
storageUsageIncDec: "Variation de l'utilisation du stockage"
|
storageUsageIncDec: "Variation de l'utilisation du stockage"
|
||||||
|
@ -1498,8 +1499,8 @@ _instanceCharts:
|
||||||
requests: "Requêtes"
|
requests: "Requêtes"
|
||||||
users: "Variation du nombre d'utilisateur·rice·s"
|
users: "Variation du nombre d'utilisateur·rice·s"
|
||||||
usersTotal: "Total cumulé du nombre d'utilisateur·rice·s"
|
usersTotal: "Total cumulé du nombre d'utilisateur·rice·s"
|
||||||
notes: "Variation du nombre de notes"
|
notes: "Variation du nombre de publications"
|
||||||
notesTotal: "Nombre total cumulé des notes"
|
notesTotal: "Nombre total cumulé des publications"
|
||||||
ff: "Variation des abonné·e·s / abonnements"
|
ff: "Variation des abonné·e·s / abonnements"
|
||||||
ffTotal: "Total cumulé du nombre d'abonné·e·s / abonnements"
|
ffTotal: "Total cumulé du nombre d'abonné·e·s / abonnements"
|
||||||
cacheSize: "Variation de la taille du cache"
|
cacheSize: "Variation de la taille du cache"
|
||||||
|
@ -1587,10 +1588,10 @@ _pages:
|
||||||
id: "Toile ID"
|
id: "Toile ID"
|
||||||
width: "Largeur"
|
width: "Largeur"
|
||||||
height: "Hauteur"
|
height: "Hauteur"
|
||||||
note: "Note intégrée"
|
note: "Post intégré"
|
||||||
_note:
|
_note:
|
||||||
id: "Identifiant de la note"
|
id: "Identifiant du post"
|
||||||
idDescription: "Vous pouvez aussi coller ici l'URL ici."
|
idDescription: "Vous pouvez aussi coller l'URL du post ici."
|
||||||
detailed: "Afficher les détails"
|
detailed: "Afficher les détails"
|
||||||
switch: "Interrupteur"
|
switch: "Interrupteur"
|
||||||
_switch:
|
_switch:
|
||||||
|
@ -1813,7 +1814,7 @@ _notification:
|
||||||
youGotMention: "{name} vous a mentionné"
|
youGotMention: "{name} vous a mentionné"
|
||||||
youGotReply: "Réponse de {name}"
|
youGotReply: "Réponse de {name}"
|
||||||
youGotQuote: "Cité·e par {name}"
|
youGotQuote: "Cité·e par {name}"
|
||||||
youRenoted: "{name} vous a Renoté"
|
youRenoted: "{name} vous a boosté"
|
||||||
youGotPoll: "{name} a participé à votre sondage"
|
youGotPoll: "{name} a participé à votre sondage"
|
||||||
youGotMessagingMessageFromUser: "{name} vous envoyé un message"
|
youGotMessagingMessageFromUser: "{name} vous envoyé un message"
|
||||||
youGotMessagingMessageFromGroup: "Un message a été envoyé au groupe {name}"
|
youGotMessagingMessageFromGroup: "Un message a été envoyé au groupe {name}"
|
||||||
|
@ -1828,7 +1829,7 @@ _notification:
|
||||||
follow: "Nouvel·le abonné·e"
|
follow: "Nouvel·le abonné·e"
|
||||||
mention: "Mentions"
|
mention: "Mentions"
|
||||||
reply: "Réponses"
|
reply: "Réponses"
|
||||||
renote: "Renotes"
|
renote: "Boosts"
|
||||||
quote: "Citations"
|
quote: "Citations"
|
||||||
reaction: "Réactions"
|
reaction: "Réactions"
|
||||||
pollVote: "Votes dans des sondages"
|
pollVote: "Votes dans des sondages"
|
||||||
|
@ -1840,9 +1841,9 @@ _notification:
|
||||||
_actions:
|
_actions:
|
||||||
followBack: "Suivre"
|
followBack: "Suivre"
|
||||||
reply: "Répondre"
|
reply: "Répondre"
|
||||||
renote: "Renoter"
|
renote: "Boosts"
|
||||||
reacted: a réagit à votre Note
|
reacted: a réagit à votre Note
|
||||||
renoted: a boosté votre Note
|
renoted: a boosté votre post
|
||||||
voted: a voté pour votre sondage
|
voted: a voté pour votre sondage
|
||||||
_deck:
|
_deck:
|
||||||
alwaysShowMainColumn: "Toujours afficher la colonne principale"
|
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
|
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
|
la mention du compte formaté comme ceci @personne@server.com
|
||||||
moveAccount: Déplacer le compte !
|
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
|
failedToFetchAccountInformation: Impossible de récupérer les informations de compte
|
||||||
noEmailServerWarning: Serveur mail non configuré.
|
noEmailServerWarning: Serveur mail non configuré.
|
||||||
deleteAccount: Supprimer le compte
|
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.
|
affiché comme rapporteur au serveur distant.
|
||||||
noThankYou: Non merci
|
noThankYou: Non merci
|
||||||
addInstance: Ajouter un serveur
|
addInstance: Ajouter un serveur
|
||||||
renoteMute: Mettre en silence les renotes
|
renoteMute: Masquer les boosts
|
||||||
flagSpeakAsCat: Parler comme un chat
|
flagSpeakAsCat: Parler comme un chat
|
||||||
flagSpeakAsCatDescription: Vos messages seront nyanifiés en mode chat
|
flagSpeakAsCatDescription: Vos messages seront nyanifiés en mode chat
|
||||||
hiddenTags: Hashtags cachés
|
hiddenTags: Hashtags cachés
|
||||||
|
@ -2059,14 +2060,14 @@ pushNotificationAlreadySubscribed: Notifications push déjà activées
|
||||||
logoImageUrl: URL de l'image du logo
|
logoImageUrl: URL de l'image du logo
|
||||||
moveToLabel: 'Compte vers lequel vous migrez :'
|
moveToLabel: 'Compte vers lequel vous migrez :'
|
||||||
moveFrom: Migrer vers ce compte depuis un ancien compte
|
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
|
license: Licence
|
||||||
indexPosts: Indexer les Notes
|
indexPosts: Indexer les Posts
|
||||||
indexNotice: Indexation en cours. Cela prendra certainement du temps, veuillez ne
|
indexNotice: Indexation en cours. Cela prendra certainement du temps, veuillez ne
|
||||||
pas redémarrer votre serveur pour au moins une heure.
|
pas redémarrer votre serveur pour au moins une heure.
|
||||||
customKaTeXMacro: Macros KaTeX personnalisées
|
customKaTeXMacro: Macros KaTeX personnalisées
|
||||||
enableCustomKaTeXMacro: Activer les 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
|
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
|
simplement ! La notation se conforme aux définitions de commandes LaTeX et s'écrit
|
||||||
\\newcommand{\\·name}{content} ou \\newcommand{\\name}[number of arguments]{content}.
|
\\newcommand{\\·name}{content} ou \\newcommand{\\name}[number of arguments]{content}.
|
||||||
|
@ -2085,7 +2086,7 @@ deleted: Effacé
|
||||||
editNote: Modifier note
|
editNote: Modifier note
|
||||||
edited: 'Modifié à {date} {time}'
|
edited: 'Modifié à {date} {time}'
|
||||||
flagShowTimelineRepliesDescription: Si activé, affiche dans le fil les réponses des
|
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:
|
_experiments:
|
||||||
alpha: Alpha
|
alpha: Alpha
|
||||||
beta: Beta
|
beta: Beta
|
||||||
|
@ -2096,21 +2097,21 @@ _experiments:
|
||||||
peut entraîner des ralentissements lors du chargement si votre file d'attente
|
peut entraîner des ralentissements lors du chargement si votre file d'attente
|
||||||
est congestionnée.
|
est congestionnée.
|
||||||
findOtherInstance: Trouver un autre serveur
|
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
|
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
|
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.
|
pour ce serveur, entrez-le ci-dessous s'il vous plait.
|
||||||
apps: Applications
|
apps: Applications
|
||||||
userSaysSomethingReasonReply: '{noms} a répondu à une note contenant {raison}'
|
userSaysSomethingReasonReply: '{noms} a répondu à un post contenant {raison}'
|
||||||
defaultValueIs: 'défaut : {valeur}'
|
defaultValueIs: 'défaut : {valeur}'
|
||||||
searchPlaceholder: Recherchez sur Firefish
|
searchPlaceholder: Recherchez sur Firefish
|
||||||
removeReaction: Retirer votre réaction
|
removeReaction: Retirer votre réaction
|
||||||
selectChannel: Sélectionner une chaîne
|
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
|
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
|
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.
|
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:
|
_feeds:
|
||||||
jsonFeed: flux JSON
|
jsonFeed: flux JSON
|
||||||
atom: Atom
|
atom: Atom
|
||||||
|
@ -2118,9 +2119,9 @@ _feeds:
|
||||||
rss: RSS
|
rss: RSS
|
||||||
alt: ALT
|
alt: ALT
|
||||||
swipeOnMobile: Permettre le balayage entre les pages
|
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.
|
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
|
older: plus ancien
|
||||||
newer: plus récent
|
newer: plus récent
|
||||||
accessibility: Accessibilité
|
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
|
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
|
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.
|
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."
|
indiqués.\nElles peuvent être consultées depuis la page des fils."
|
||||||
image: Image
|
image: Image
|
||||||
video: Vidéo
|
video: Vidéo
|
||||||
|
@ -2138,10 +2139,10 @@ cw: Avertissement de contenu
|
||||||
xl: XL
|
xl: XL
|
||||||
reflectMayTakeTime: Il pourra s’écouler un certain temps avant que les changements
|
reflectMayTakeTime: Il pourra s’écouler un certain temps avant que les changements
|
||||||
ne soient reflétés.
|
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
|
sendModMail: Envoyer un avis à la modération
|
||||||
clipsDesc: Les clips sont comme des favoris catégorisés pouvant être partagés. Vous
|
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
|
unclip: Dé-clipper
|
||||||
secureMode: Mode sécurisé (Authorized Fetch)
|
secureMode: Mode sécurisé (Authorized Fetch)
|
||||||
secureModeInfo: Quand sollicité depuis d'autres serveurs, ne pas répondre sans preuve.
|
secureModeInfo: Quand sollicité depuis d'autres serveurs, ne pas répondre sans preuve.
|
||||||
|
@ -2174,8 +2175,8 @@ isPatron: Mécène Firefish
|
||||||
_filters:
|
_filters:
|
||||||
fromUser: De l’utilisateur
|
fromUser: De l’utilisateur
|
||||||
withFile: Avec fichier
|
withFile: Avec fichier
|
||||||
notesBefore: Notes avant
|
notesBefore: Posts avant
|
||||||
notesAfter: Notes après
|
notesAfter: Posts après
|
||||||
followersOnly: Abonnés uniquement
|
followersOnly: Abonnés uniquement
|
||||||
followingOnly: Abonnements uniquement
|
followingOnly: Abonnements uniquement
|
||||||
fromDomain: Du domaine
|
fromDomain: Du domaine
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
_lang_: "Bahasa Indonesia"
|
_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
|
introFirefish: "Selamat datang! Firefish adalah media sosial sumber terbuka dan terdesentralisasi
|
||||||
yang selamanya bebas! 🚀"
|
yang selamanya bebas! 🚀"
|
||||||
monthAndDay: "{day} {month}"
|
monthAndDay: "{day} {month}"
|
||||||
|
@ -93,7 +94,7 @@ youShouldUpgradeClient: "Untuk melihat halaman ini, mohon muat ulang untuk memut
|
||||||
enterListName: "Masukkan nama daftar"
|
enterListName: "Masukkan nama daftar"
|
||||||
privacy: "Privasi"
|
privacy: "Privasi"
|
||||||
makeFollowManuallyApprove: "Permintaan mengikuti membutuhkan persetujuan"
|
makeFollowManuallyApprove: "Permintaan mengikuti membutuhkan persetujuan"
|
||||||
defaultNoteVisibility: "Privasi bawaan catatan"
|
defaultNoteVisibility: "Visibilitas bawaan"
|
||||||
follow: "Ikuti"
|
follow: "Ikuti"
|
||||||
followRequest: "Permintaan Mengikuti"
|
followRequest: "Permintaan Mengikuti"
|
||||||
followRequests: "Permintaan mengikuti"
|
followRequests: "Permintaan mengikuti"
|
||||||
|
@ -743,7 +744,7 @@ developer: "Pengembang"
|
||||||
makeExplorable: "Buat akun tampil di \"Jelajahi\""
|
makeExplorable: "Buat akun tampil di \"Jelajahi\""
|
||||||
makeExplorableDescription: "Jika kamu menonaktifkan ini, akun kamu tidak akan muncul
|
makeExplorableDescription: "Jika kamu menonaktifkan ini, akun kamu tidak akan muncul
|
||||||
di bagian \"Jelajahi\"."
|
di bagian \"Jelajahi\"."
|
||||||
showGapBetweenNotesInTimeline: "Tampilkan jarak diantara catatan pada linimasa"
|
showGapBetweenNotesInTimeline: "Tampilkan jarak diantara postingan pada linimasa"
|
||||||
duplicate: "Duplikat"
|
duplicate: "Duplikat"
|
||||||
left: "Kiri"
|
left: "Kiri"
|
||||||
center: "Tengah"
|
center: "Tengah"
|
||||||
|
@ -1245,8 +1246,7 @@ _tutorial:
|
||||||
step1_2: "Ayo siapkan. Lekas mulai tanpa basa-basi!"
|
step1_2: "Ayo siapkan. Lekas mulai tanpa basa-basi!"
|
||||||
step1_3: "Linimasa kamu kosong, karena kamu belum mencatat catatan apapun atau mengikuti
|
step1_3: "Linimasa kamu kosong, karena kamu belum mencatat catatan apapun atau mengikuti
|
||||||
siapapun."
|
siapapun."
|
||||||
step2_1: "Selesaikan menyetel profilmu sebelum menulis sebuah catatan atau mengikuti
|
step2_1: "Pertama, isi profilmu lebih dahulu."
|
||||||
seseorang."
|
|
||||||
step2_2: "Menyediakan beberapa informasi tentang siapa kamu akan membuatnya lebih
|
step2_2: "Menyediakan beberapa informasi tentang siapa kamu akan membuatnya lebih
|
||||||
mudah bagi orang lain untuk menentukan jika mereka ingin postinganmu atau mengikutimu."
|
mudah bagi orang lain untuk menentukan jika mereka ingin postinganmu atau mengikutimu."
|
||||||
step3_1: "Sekarang saatnya mengikuti beberapa orang!"
|
step3_1: "Sekarang saatnya mengikuti beberapa orang!"
|
||||||
|
@ -1558,7 +1558,7 @@ _pages:
|
||||||
if: "Jika"
|
if: "Jika"
|
||||||
_if:
|
_if:
|
||||||
variable: "Variabel"
|
variable: "Variabel"
|
||||||
post: "Buat catatan"
|
post: "Formulir posting"
|
||||||
_post:
|
_post:
|
||||||
text: "Isi"
|
text: "Isi"
|
||||||
attachCanvasImage: "Posting dengan kanvas sebagai gambar"
|
attachCanvasImage: "Posting dengan kanvas sebagai gambar"
|
||||||
|
|
|
@ -1,16 +1,18 @@
|
||||||
export type Post = {
|
export type Post = {
|
||||||
text: string | null;
|
text: string | undefined;
|
||||||
cw: string | null;
|
cw: string | null;
|
||||||
localOnly: boolean;
|
localOnly: boolean;
|
||||||
createdAt: Date;
|
createdAt: Date;
|
||||||
|
visibility: string;
|
||||||
};
|
};
|
||||||
|
|
||||||
export function parse(acct: any): Post {
|
export function parse(acct: any): Post {
|
||||||
return {
|
return {
|
||||||
text: acct.text,
|
text: acct.text || undefined,
|
||||||
cw: acct.cw,
|
cw: acct.cw,
|
||||||
localOnly: acct.localOnly,
|
localOnly: acct.localOnly,
|
||||||
createdAt: new Date(acct.createdAt),
|
createdAt: new Date(acct.createdAt),
|
||||||
|
visibility: "hidden" + (acct.visibility || ""),
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -28,6 +28,7 @@ import {
|
||||||
backgroundQueue,
|
backgroundQueue,
|
||||||
} from "./queues.js";
|
} from "./queues.js";
|
||||||
import type { ThinUser } from "./types.js";
|
import type { ThinUser } from "./types.js";
|
||||||
|
import { Note } from "@/models/entities/note.js";
|
||||||
|
|
||||||
function renderError(e: Error): any {
|
function renderError(e: Error): any {
|
||||||
return {
|
return {
|
||||||
|
@ -358,6 +359,7 @@ export function createImportCkPostJob(
|
||||||
user: ThinUser,
|
user: ThinUser,
|
||||||
post: any,
|
post: any,
|
||||||
signatureCheck: boolean,
|
signatureCheck: boolean,
|
||||||
|
parent: Note | null = null,
|
||||||
) {
|
) {
|
||||||
return dbQueue.add(
|
return dbQueue.add(
|
||||||
"importCkPost",
|
"importCkPost",
|
||||||
|
@ -365,6 +367,7 @@ export function createImportCkPostJob(
|
||||||
user: user,
|
user: user,
|
||||||
post: post,
|
post: post,
|
||||||
signatureCheck: signatureCheck,
|
signatureCheck: signatureCheck,
|
||||||
|
parent: parent,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
removeOnComplete: true,
|
removeOnComplete: true,
|
||||||
|
|
|
@ -3,7 +3,13 @@ import create from "@/services/note/create.js";
|
||||||
import { Users } from "@/models/index.js";
|
import { Users } from "@/models/index.js";
|
||||||
import type { DbUserImportMastoPostJobData } from "@/queue/types.js";
|
import type { DbUserImportMastoPostJobData } from "@/queue/types.js";
|
||||||
import { queueLogger } from "../../logger.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 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");
|
const logger = queueLogger.createSubLogger("import-firefish-post");
|
||||||
|
|
||||||
|
@ -17,6 +23,7 @@ export async function importCkPost(
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const post = job.data.post;
|
const post = job.data.post;
|
||||||
|
/*
|
||||||
if (post.replyId != null) {
|
if (post.replyId != null) {
|
||||||
done();
|
done();
|
||||||
return;
|
return;
|
||||||
|
@ -29,23 +36,74 @@ export async function importCkPost(
|
||||||
done();
|
done();
|
||||||
return;
|
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,
|
createdAt: createdAt,
|
||||||
files: undefined,
|
text: text,
|
||||||
poll: undefined,
|
userId: user.id,
|
||||||
text: text || undefined,
|
|
||||||
reply: null,
|
|
||||||
renote: null,
|
|
||||||
cw: cw,
|
|
||||||
localOnly,
|
|
||||||
visibility: "hidden",
|
|
||||||
visibleUsers: [],
|
|
||||||
channel: null,
|
|
||||||
apMentions: new Array(0),
|
|
||||||
apHashtags: undefined,
|
|
||||||
apEmojis: undefined,
|
|
||||||
});
|
});
|
||||||
|
|
||||||
|
if (note && (note?.fileIds?.length || 0) < files.length) {
|
||||||
|
const update: Partial<Note> = {};
|
||||||
|
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");
|
logger.succ("Imported");
|
||||||
|
if (post.childNotes) {
|
||||||
|
for (const child of post.childNotes) {
|
||||||
|
createImportCkPostJob(
|
||||||
|
job.data.user,
|
||||||
|
child,
|
||||||
|
job.data.signatureCheck,
|
||||||
|
note,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
done();
|
done();
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,6 +8,9 @@ import { resolveNote } from "@/remote/activitypub/models/note.js";
|
||||||
import { Note } from "@/models/entities/note.js";
|
import { Note } from "@/models/entities/note.js";
|
||||||
import { uploadFromUrl } from "@/services/drive/upload-from-url.js";
|
import { uploadFromUrl } from "@/services/drive/upload-from-url.js";
|
||||||
import type { DriveFile } from "@/models/entities/drive-file.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");
|
const logger = queueLogger.createSubLogger("import-masto-post");
|
||||||
|
|
||||||
|
@ -67,23 +70,47 @@ export async function importMastoPost(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
let note = await Notes.findOneBy({
|
||||||
const note = await create(user, {
|
|
||||||
createdAt: new Date(post.object.published),
|
createdAt: new Date(post.object.published),
|
||||||
files: files.length == 0 ? undefined : files,
|
text: text,
|
||||||
poll: undefined,
|
userId: user.id,
|
||||||
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,
|
|
||||||
});
|
});
|
||||||
|
|
||||||
|
if (note && (note?.fileIds?.length || 0) < files.length) {
|
||||||
|
const update: Partial<Note> = {};
|
||||||
|
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);
|
job.progress(100);
|
||||||
done();
|
done();
|
||||||
|
|
||||||
|
|
|
@ -57,7 +57,8 @@ export async function importPosts(
|
||||||
const parsed = JSON.parse(json);
|
const parsed = JSON.parse(json);
|
||||||
if (parsed instanceof Array) {
|
if (parsed instanceof Array) {
|
||||||
logger.info("Parsing key style posts");
|
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);
|
createImportCkPostJob(job.data.user, post, job.data.signatureCheck);
|
||||||
}
|
}
|
||||||
} else if (parsed instanceof Object) {
|
} else if (parsed instanceof Object) {
|
||||||
|
@ -74,3 +75,32 @@ export async function importPosts(
|
||||||
logger.succ("Imported");
|
logger.succ("Imported");
|
||||||
done();
|
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;
|
||||||
|
}
|
||||||
|
|
|
@ -52,6 +52,7 @@ export type DbUserImportMastoPostJobData = {
|
||||||
user: ThinUser;
|
user: ThinUser;
|
||||||
post: any;
|
post: any;
|
||||||
signatureCheck: boolean;
|
signatureCheck: boolean;
|
||||||
|
parent: Note | null;
|
||||||
};
|
};
|
||||||
|
|
||||||
export type ObjectStorageJobData =
|
export type ObjectStorageJobData =
|
||||||
|
|
|
@ -174,7 +174,7 @@ export default async (
|
||||||
// rome-ignore lint/suspicious/noAsyncPromiseExecutor: FIXME
|
// rome-ignore lint/suspicious/noAsyncPromiseExecutor: FIXME
|
||||||
new Promise<Note>(async (res, rej) => {
|
new Promise<Note>(async (res, rej) => {
|
||||||
const dontFederateInitially =
|
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.
|
// 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.)
|
// 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.visibility = "public";
|
||||||
if (data.channel != null) data.visibleUsers = [];
|
if (data.channel != null) data.visibleUsers = [];
|
||||||
if (data.channel != null) data.localOnly = true;
|
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
|
// enforce silent clients on server
|
||||||
if (
|
if (
|
||||||
|
|
|
@ -430,7 +430,6 @@ function chooseUser() {
|
||||||
onUpdated(() => {
|
onUpdated(() => {
|
||||||
setPosition();
|
setPosition();
|
||||||
items.value = suggests.value?.children ?? [];
|
items.value = suggests.value?.children ?? [];
|
||||||
selectNext();
|
|
||||||
});
|
});
|
||||||
|
|
||||||
onMounted(() => {
|
onMounted(() => {
|
||||||
|
@ -449,7 +448,6 @@ onMounted(() => {
|
||||||
exec();
|
exec();
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
{ immediate: true },
|
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
|
@ -132,7 +132,7 @@ export default defineComponent({
|
||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
> *:not(:last-child) {
|
&:not(.date-separated-list-nogap) > *:not(:last-child) {
|
||||||
margin-bottom: var(--margin);
|
margin-bottom: var(--margin);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -5,14 +5,15 @@
|
||||||
/></template>
|
/></template>
|
||||||
<MkSpacer :content-max="800">
|
<MkSpacer :content-max="800">
|
||||||
<MkPagination
|
<MkPagination
|
||||||
|
ref="paginationEl"
|
||||||
v-slot="{ items }"
|
v-slot="{ items }"
|
||||||
:pagination="pagination"
|
:pagination="pagination"
|
||||||
class="ruryvtyk _content"
|
class="ruryvtyk _gaps_m"
|
||||||
>
|
>
|
||||||
<section
|
<section
|
||||||
v-for="(announcement, i) in items"
|
v-for="announcement in items"
|
||||||
:key="announcement.id"
|
:key="announcement.id"
|
||||||
class="_card announcement"
|
class="announcement _panel"
|
||||||
>
|
>
|
||||||
<div class="_title">
|
<div class="_title">
|
||||||
<span v-if="$i && !announcement.isRead">🆕 </span>
|
<span v-if="$i && !announcement.isRead">🆕 </span>
|
||||||
|
@ -31,7 +32,7 @@
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<div v-if="$i && !announcement.isRead" class="_footer">
|
<div v-if="$i && !announcement.isRead" class="_footer">
|
||||||
<MkButton primary @click="read(items, announcement, i)"
|
<MkButton primary @click="read(announcement.id)"
|
||||||
><i class="ph-check ph-bold ph-lg"></i>
|
><i class="ph-check ph-bold ph-lg"></i>
|
||||||
{{ i18n.ts.gotIt }}</MkButton
|
{{ i18n.ts.gotIt }}</MkButton
|
||||||
>
|
>
|
||||||
|
@ -43,7 +44,7 @@
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts" setup>
|
<script lang="ts" setup>
|
||||||
import {} from "vue";
|
import { ref } from "vue";
|
||||||
import MkPagination from "@/components/MkPagination.vue";
|
import MkPagination from "@/components/MkPagination.vue";
|
||||||
import MkButton from "@/components/MkButton.vue";
|
import MkButton from "@/components/MkButton.vue";
|
||||||
import * as os from "@/os";
|
import * as os from "@/os";
|
||||||
|
@ -55,13 +56,14 @@ const pagination = {
|
||||||
limit: 10,
|
limit: 10,
|
||||||
};
|
};
|
||||||
|
|
||||||
// TODO: これは実質的に親コンポーネントから子コンポーネントのプロパティを変更してるのでなんとかしたい
|
const paginationEl = ref<InstanceType<typeof MkPagination>>();
|
||||||
function read(items, announcement, i) {
|
function read(id: string) {
|
||||||
items[i] = {
|
if (!paginationEl.value) return;
|
||||||
...announcement,
|
paginationEl.value.updateItem(id, (announcement) => {
|
||||||
isRead: true,
|
announcement.isRead = true;
|
||||||
};
|
return announcement;
|
||||||
os.api("i/read-announcement", { announcementId: announcement.id });
|
});
|
||||||
|
os.api("i/read-announcement", { announcementId: id });
|
||||||
}
|
}
|
||||||
|
|
||||||
const headerActions = $computed(() => []);
|
const headerActions = $computed(() => []);
|
||||||
|
|
|
@ -46,6 +46,8 @@ html {
|
||||||
tab-size: 2;
|
tab-size: 2;
|
||||||
scroll-padding: 60px;
|
scroll-padding: 60px;
|
||||||
overflow-x: clip;
|
overflow-x: clip;
|
||||||
|
text-size-adjust: none;
|
||||||
|
-webkit-text-size-adjust: none;
|
||||||
|
|
||||||
&.useCJKFont {
|
&.useCJKFont {
|
||||||
font-family: "Hiragino Maru Gothic Pro", "BIZ UDGothic", Roboto,
|
font-family: "Hiragino Maru Gothic Pro", "BIZ UDGothic", Roboto,
|
||||||
|
|
Loading…
Reference in a new issue