diff --git a/.autogen/check_pr.jq b/.autogen/check_pr.jq deleted file mode 100644 index 0adb0b503d..0000000000 --- a/.autogen/check_pr.jq +++ /dev/null @@ -1,3 +0,0 @@ -.[] -.head -.label diff --git a/.autogen/next_url.jq b/.autogen/next_url.jq deleted file mode 100644 index b4c3b819a5..0000000000 --- a/.autogen/next_url.jq +++ /dev/null @@ -1,2 +0,0 @@ -.links -.next diff --git a/.autogen/patreon.jq b/.autogen/patreon.jq deleted file mode 100644 index c761d587b8..0000000000 --- a/.autogen/patreon.jq +++ /dev/null @@ -1,39 +0,0 @@ -( - .data | - map( - select( - .relationships - .currently_entitled_tiers - .data[] - ) - ) | - map( - .relationships - .user - .data - .id - ) -) as $data | -.included | -map( - select( - .id as $id | - $data | - contains( - [ - $id - ] - ) - ) -) | -map( - .attributes | - [ - .full_name, - .thumb_url, - .url - ] | - @tsv -) | -.[] | -@text diff --git a/.autogen/update_readme_patreon.sh b/.autogen/update_readme_patreon.sh deleted file mode 100755 index 7a108c2b67..0000000000 --- a/.autogen/update_readme_patreon.sh +++ /dev/null @@ -1,87 +0,0 @@ -#!/usr/bin/env bash -# __MISSKEY_BEARER_TOKEN= -# __MISSKEY_CAMPAIGN_ID= -# __MISSKEY_GITHUB_TOKEN= -# __MISSKEY_HEAD=syuilo:patch-autogen -# __MISSKEY_REPO=syuilo/misskey -# __MISSKEY_BRANCH=develop -test "$(curl -LSs -w '\n' -- "https://api.github.com/repos/$REPO/pulls?access_token=$__MISSKEY_GITHUB_TOKEN" | jq -r -f check_pr.jq | grep $__MISSKEY_HEAD)" && exit 1 -cd "$(dirname $0)/.." && \ -touch null.cache && \ -rm *.cache && \ -git checkout $__MISSKEY_BRANCH && \ -git pull origin $__MISSKEY_BRANCH && \ -git pull upstream $__MISSKEY_BRANCH && \ -git stash && \ -git rebase -f upstream/$__MISSKEY_BRANCH && \ -git branch patch-autogen && \ -git checkout patch-autogen && \ -git reset --hard HEAD || \ -exit 1 -touch patreon.md.cache && \ -rm patreon.md.cache && \ -echo '' > patreon.md.cache && \ -url="https://www.patreon.com/api/oauth2/v2/campaigns/$__MISSKEY_CAMPAIGN_ID/members?include=currently_entitled_tiers,user&fields%5Btier%5D=title&fields%5Buser%5D=full_name,thumb_url,url,hide_pledges" -while : - do - touch patreon.raw.cache && \ - rm patreon.raw.cache && \ - curl -LSs -w '\n' -H "Authorization: Bearer $__MISSKEY_BEARER_TOKEN" -- $url > patreon.raw.cache && \ - touch patreon.cache && \ - rm patreon.cache && \ - cat patreon.raw.cache | \ - jq -r -f patreon.jq >> patreon.cache && \ - echo '' >> patreon.md.cache && \ - cat patreon.cache | \ - awk -F'\t' '{print $2,$1}' | \ - sed -e 's/ /\\" alt=\\"/' | \ - xargs -I% echo '' >> patreon.md.cache && \ - echo '' >> patreon.md.cache && \ - cat patreon.cache | \ - awk -F'\t' '{print $3,$1}' | \ - sed -e 's/ /\\">/' | \ - xargs -I% echo '
" >> patreon.md.cache && \ -touch README.md && \ -touch .autogen/README.md && \ -rm .autogen/README.md && \ -mv README.md .autogen/README.md && \ -cat .autogen/README.md | while IFS= read line; - do - if [[ -z "$ignore" ]] - then - if [[ "$line" = '' ]] - then - ignore='PATREON_INSIDE' - else - echo "$line" >> README.md - fi - else - if [[ "$LINE" = '' ]] - then - ignore= - cat patreon.md.cache >> README.md - fi - fi -done -cat patreon.md.cache -touch null.cache && \ -rm *.cache && \ -diff .autogen/README.md README.md > diff.cache -cat diff.cache && \ -test 4 -lt $(cat diff.cache | wc -l) && \ -git add README.md && \ -git commit -m 'Update README.md [AUTOGEN]' && \ -git push -f origin patch-autogen && \ -curl -LSs -w '\n' -X POST -d '{"title":"[AUTOMATED] Update README.md","body":"*This pull request was created by a tool.*","head":"'$__MISSKEY_HEAD'","base":"'$__MISSKEY_BRANCH'"}' -- "https://api.github.com/repos/$__MISSKEY_REPO/pulls?access_token=$__MISSKEY_GITHUB_TOKEN" -git stash -git checkout $__MISSKEY_BRANCH -git branch -D patch-autogen diff --git a/.eslintrc b/.eslintrc index 3a220319e5..3e5b59cb04 100644 --- a/.eslintrc +++ b/.eslintrc @@ -3,29 +3,11 @@ "parser": "@typescript-eslint/parser" }, "extends": [ - "eslint:recommended", - "plugin:vue/recommended" + "eslint:recommended" ], "rules": { - "vue/require-v-for-key": 0, - "vue/max-attributes-per-line": 0, - "vue/html-indent": 0, - "vue/html-self-closing": 0, - "vue/no-unused-vars": 0, - "vue/attributes-order": 0, - "vue/require-prop-types": 0, - "vue/require-default-prop": 0, - "vue/html-closing-bracket-spacing": 0, - "vue/singleline-html-element-content-newline": 0, - "vue/no-v-html": 0, "no-console": 0, "no-unused-vars": 0, "no-empty": 0 - }, - "globals": { - "ENV": true, - "VERSION": true, - "API": true, - "LANGS": true } } diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000000..1fd048e8ea --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1 @@ +see [releases](https://github.com/syuilo/misskey/releases) diff --git a/assets/favicon.ico b/assets/favicon.ico new file mode 100644 index 0000000000..9be1ff6295 Binary files /dev/null and b/assets/favicon.ico differ diff --git a/assets/redoc.html b/assets/redoc.html index 4d2360fb20..9ee5a95c05 100644 --- a/assets/redoc.html +++ b/assets/redoc.html @@ -19,6 +19,6 @@ - + diff --git a/gulpfile.ts b/gulpfile.ts index 95b2394887..771a5c0e32 100644 --- a/gulpfile.ts +++ b/gulpfile.ts @@ -14,7 +14,7 @@ const locales: { [x: string]: any } = require('./locales'); const meta = require('./package.json'); gulp.task('build:ts', () => { - const tsProject = ts.createProject('./tsconfig.json'); + const tsProject = ts.createProject('./src/tsconfig.json'); return tsProject .src() @@ -64,7 +64,6 @@ gulp.task('build:client:style', () => { gulp.task('build:copy', gulp.parallel('build:copy:locales', 'build:copy:views', 'build:client:script', 'build:client:style', 'build:copy:fonts', () => gulp.src([ './src/emojilist.json', - './src/server/web/views/**/*', './src/**/assets/**/*', '!./src/client/assets/**/*' ]).pipe(gulp.dest('./built/')) @@ -78,17 +77,16 @@ gulp.task('cleanall', gulp.parallel('clean', cb => rimraf('./node_modules', cb) )); -gulp.task('copy:docs', () => - gulp.src([ - './src/docs/**/*', - ]) - .pipe(gulp.dest('./built/assets/docs/')) -); - gulp.task('build', gulp.parallel( 'build:ts', 'build:copy', - 'copy:docs', )); gulp.task('default', gulp.task('build')); + +gulp.task('watch', () => { + gulp.watch([ + './src/**/*', + '!./src/client/**/*' + ], { ignoreInitial: false }, gulp.task('build')); +}); diff --git a/locales/fr-FR.yml b/locales/fr-FR.yml index 16815ab25d..1b3ccbbb0c 100644 --- a/locales/fr-FR.yml +++ b/locales/fr-FR.yml @@ -110,7 +110,7 @@ attachCancel: "Supprimer le fichier attaché" markAsSensitive: "Marquer comme sensible" unmarkAsSensitive: "Supprimer le marquage comme sensible" enterFileName: "Entrer le nom du fichier" -mute: "Mettre en sourdine" +mute: "Masquer" unmute: "Ne plus masquer" block: "Bloquer" unblock: "Débloquer" @@ -206,7 +206,7 @@ all: "Tous" subscribing: "Abonné" publishing: "Publié" notResponding: "Ne répond pas" -instanceFollowing: "Suivre une instance" +instanceFollowing: "Abonnements de l'instance" instanceFollowers: "Abonné·e·s de l’instance" instanceUsers: "Utilisateur·rice·s de cette l’instance" changePassword: "Modifier votre mot de passe" @@ -317,12 +317,12 @@ disablingTimelinesInfo: "Même si vous désactivez ces fils, les administrateur registration: "S’inscrire" enableRegistration: "Autoriser les nouvelles inscriptions" invite: "Inviter" -proxyRemoteFiles: "Proxy fichiers distants" +proxyRemoteFiles: "Utiliser les fichiers distants comme proxy" proxyRemoteFilesDescription: "Si vous activez ce paramètre, les fichiers distants non stockés ou supprimés en raison d'une capacité excédentaire seront affichés via un proxy local et généreront une miniature. Cela n'affectera pas le stockage du serveur." driveCapacityPerLocalAccount: "Volume du Drive par utilisateur local" driveCapacityPerRemoteAccount: "Volume du Drive par utilisateur distant" inMb: "en mégaoctets" -iconUrl: "URL de l’image de l’avatar" +iconUrl: "URL de l'icône" bannerUrl: "URL de l’image de la bannière" basicInfo: "Informations basiques" pinnedUsers: "Utilisateur·rice épinglé·e" @@ -491,7 +491,7 @@ objectStorageUseProxyDesc: "Désactivez cette option si vous n'utilisez pas Prox objectStorageSetPublicRead: "Régler sur « public » lors de l'envoi" serverLogs: "Journal du serveur" deleteAll: "Supprimer tout" -showFixedPostForm: "Afficher le formulaire en haut du fil d'actualité" +showFixedPostForm: "Afficher le formulaire de publication en haut du fil d'actualité" newNoteRecived: "Vous avez reçu une nouvelle note" sounds: "Sons" listen: "Écouter" @@ -616,12 +616,14 @@ openInNewTab: "Ouvrir dans un nouvel onglet" openInSideView: "Ouvrir en vue latérale" defaultNavigationBehaviour: "Navigation par défaut" editTheseSettingsMayBreakAccount: "La modification de ces paramètres peut endommager votre compte." +instanceTicker: "Nom de l'instance d'origine des notes" waitingFor: "En attente de {x}" random: "Aléatoire" system: "Système" switchUi: "Modifier l'interface utilisateur" desktop: "Bureau" clip: "Clip" +createNew: "Créer nouveau" optional: "Facultatif" createNewClip: "Créer un nouveau clip" public: "Public" @@ -806,6 +808,7 @@ _reversi: canPutEverywhere: "Les pions peuvent être placés partout " _instanceTicker: none: "Cacher " + remote: "Montrer pour les utilisateur·ice·s distant·e·s" always: "Toujours afficher" _serverDisconnectedBehavior: reload: "Rechargement automatique" @@ -823,11 +826,12 @@ _channel: notesCount: "{n} Notes" _sidebar: full: "Complet" - icon: "Avatar" + icon: "Icônes" hide: "Masquer" _wordMute: muteWords: "Mots à filtrer" muteWordsDescription: "Séparer avec des espaces pour la condition AND. Séparer avec 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 les notes de votre fil selon les paramètres que vous définissez." hardDescription: "Empêchez votre fil de charger les notes selon les paramètres que vous définissez. Cette action est irréversible : si vous modifiez ces paramètres plus tard, les notes précédemment filtrées ne seront pas récupérées." soft: "Doux" @@ -902,6 +906,8 @@ _sfx: chatBg: "Discuter (De fond)" antenna: "Réception de l’antenne" channel: "Notifications de canal" + reversiPutBlack: "Reversi : les pions noirs ont joué" + reversiPutWhite: "Reversi : les pions blancs ont joué" _ago: unknown: "Inconnu" future: "Futur" @@ -953,12 +959,12 @@ _2fa: _permissions: "read:account": "Afficher les informations du compte" "write:account": "Mettre à jour les informations de votre compte" - "read:blocks": "Voir les blocs" - "write:blocks": "Écrire des blocs" + "read:blocks": "Voir les comptes bloqués" + "write:blocks": "Gérer les comptes bloqués" "read:drive": "Parcourir le Drive" "write:drive": "Écrire sur le Drive" "read:favorites": "Afficher les favoris" - "write:favorites": "Écrire des favoris" + "write:favorites": "Gérer les favoris" "read:following": "Voir les informations de vos abonnements" "write:following": "Abonnements/Se désabonner" "read:messaging": "Cherche à discuter" @@ -1012,7 +1018,7 @@ _widgets: photos: "Photos" digitalClock: "Horloge numérique" federation: "Fédération" - postForm: "Formulaire à publier" + postForm: "Formulaire de publication" slideshow: "Diaporama" button: "Bouton" onlineUsers: "Utilisateurs en ligne" @@ -1083,8 +1089,8 @@ _profile: _exportOrImport: allNotes: "Toutes les notes" followingList: "Abonnements" - muteList: "Liste des comptes maqués" - blockingList: "Bloquer" + muteList: "Comptes masqués" + blockingList: "Comptes bloqués" userLists: "Listes" _charts: federationInstancesIncDec: "Variation du nombre des instances fédérées" @@ -1228,17 +1234,17 @@ _pages: if: "Si" _if: variable: "Variables" - post: "Formulaire à publier" + post: "Formulaire de publication" _post: text: "Contenu" attachCanvasImage: "Publier avec Toile comme image" canvasId: "Toile ID" - textInput: "Entrée de textuelle" + textInput: "Entrée textuelle" _textInput: name: "Nom de la variable" text: "Titre" default: "Valeur par défaut" - textareaInput: "Entrée de textuelle multiligne" + textareaInput: "Entrée textuelle multi-ligne" _textareaInput: name: "Nom de la variable" text: "Titre" @@ -1253,10 +1259,12 @@ _pages: id: "Toile ID" width: "Largeur" height: "Hauteur" + note: "Note intégrée" _note: id: "Identifiant de la note" + idDescription: "Pour configurer la note, vous pouvez aussi coller ici l'URL correspondante." detailed: "Afficher les détails" - switch: "Basculer" + switch: "Interrupteur" _switch: name: "Nom de la variable" text: "Titre" @@ -1265,16 +1273,16 @@ _pages: _counter: name: "Nom de la variable" text: "Titre" - inc: "Augmenter le chiffre" + inc: "Augmenter de" _button: text: "Titre" colored: "Coloré" - action: "L'opération lorsque le bouton sera pressé" + action: "Opération à effectuer lorsque le bouton est pressé" _action: dialog: "Afficher une fenêtre de dialogue" _dialog: content: "Contenu" - resetRandom: "Réinitialiser le nombre aléatoire" + resetRandom: "Réinitialiser un nombre aléatoire" pushEvent: "Envoyer un évènement" _pushEvent: event: "Nom de l’évènement" @@ -1288,7 +1296,7 @@ _pages: _radioButton: name: "Nom de la variable" title: "Titre" - values: "Choix séparés par des sauts de ligne" + values: "Liste des choix (un par ligne)" default: "Valeur par défaut" script: categories: @@ -1304,7 +1312,7 @@ _pages: list: "Listes" blocks: text: "Texte" - multiLineText: "Texte (Multi-lignes)" + multiLineText: "Texte (multi-ligne)" textList: "Liste de texte" _textList: info: "Veuillez séparer chaque entrée avec un saut de ligne" @@ -1347,10 +1355,10 @@ _pages: _mod: arg1: "A" arg2: "B" - round: "Décimal rond" + round: "Arrondir les décimales" _round: arg1: "Numérique" - eq: "A et B sont équivalents" + eq: "A et B sont égaux" _eq: arg1: "A" arg2: "B" @@ -1366,7 +1374,7 @@ _pages: _or: arg1: "A" arg2: "B" - lt: "A est plus petit que B" + lt: "A est inférieur à B" _lt: arg1: "A" arg2: "B" @@ -1374,7 +1382,7 @@ _pages: _gt: arg1: "A" arg2: "B" - ltEq: "A est plus petit ou égal à B" + ltEq: "A est inférieur ou égal à B" _ltEq: arg1: "A" arg2: "B" @@ -1440,7 +1448,7 @@ _pages: numberToString: "Convertir du numérique en texte" _numberToString: arg1: "Numérique" - splitStrByLine: "Séparer le texte par lignes" + splitStrByLine: "Séparer le texte par des sauts de lignes" _splitStrByLine: arg1: "Texte" ref: "Variables" @@ -1448,7 +1456,7 @@ _pages: fn: "Fonction" _fn: slots: "Slots" - slots-info: "Veuillez délimiter chaque slot par un saut de ligne" + slots-info: "Veuillez insérer un seul slot par ligne" arg1: "Sortie" for: "Répéter" _for: @@ -1482,18 +1490,19 @@ _notification: youWereFollowed: "Vous suit" youReceivedFollowRequest: "Vous avez reçu une demande d’abonnement" yourFollowRequestAccepted: "Votre demande d’abonnement a été accepté" - youWereInvitedToGroup: "Invité au groupe" + youWereInvitedToGroup: "Invité·e au groupe" _types: all: "Toutes" follow: "Abonnements" - mention: "Mentionner" + mention: "Mentions" reply: "Réponses" renote: "Partager" quote: "Citer" reaction: "Réactions" + pollVote: "Votes dans des sondages" receiveFollowRequest: "Demande d'abonnement reçue" followRequestAccepted: "Demande d'abonnement acceptée" - groupInvited: "Invité aux groupes" + groupInvited: "Invitation à un groupe" app: "Notifications provenant des apps" _deck: alwaysShowMainColumn: "Toujours afficher la colonne principale" diff --git a/locales/it-IT.yml b/locales/it-IT.yml index 4e2e4a5353..25ee8c6f6b 100644 --- a/locales/it-IT.yml +++ b/locales/it-IT.yml @@ -1,6 +1,7 @@ --- _lang_: "Italiano" headlineMisskey: "Rete collegata tramite note" +introMisskey: "Benvenut@! Misskey è un servizio di microblogging decentralizzato, libero e aperto. \nScrivi \"note\" per condividere ciò che sta succedendo adesso o per dire a tutti qualcosa di te. 📡\nGrazie alla funzione \"reazioni\" puoi anche mandare reazioni rapide alle note delle altre persone del Fediverso. 👍\nEsplora un nuovo mondo! 🚀" monthAndDay: "{day}/{month}" search: "Cerca" notifications: "Notifiche" @@ -11,7 +12,7 @@ ok: "OK" gotIt: "Capito!" cancel: "Annulla" enterUsername: "Inserisci un nome utente" -renotedBy: "Condiviso da {user}" +renotedBy: "Rinotato da {user}" noNotes: "Nessuna nota!" noNotifications: "Nessuna notifica" instance: "Istanza" @@ -21,6 +22,7 @@ otherSettings: "Altre impostazioni" openInWindow: "Apri in una finestra" profile: "Profilo" timeline: "Timeline" +noAccountDescription: "L'utente non ha ancora scritto niente nella biografia di profilo." login: "Accedi" loggingIn: "Accesso in corso..." logout: "Esci" @@ -32,15 +34,16 @@ addUser: "Aggiungi utente" favorite: "Preferiti" favorites: "Preferiti" unfavorite: "Rimuovi nota dai preferiti" -favorited: "Aggiunta ai preferiti." -alreadyFavorited: "Già tra i preferiti." -cantFavorite: "Impossibile aggiungere ai Preferiti." +favorited: "Aggiunta ai tuoi preferiti." +alreadyFavorited: "Già tra i tuoi preferiti." +cantFavorite: "Impossibile aggiungere la nota ai preferiti." pin: "Fissa sul profilo" unpin: "Non fissare sul profilo" copyContent: "Copia il contenuto" -copyLink: "Copia link" +copyLink: "Copia il link" delete: "Elimina" -deleteAndEdit: "Elimina & Modifica" +deleteAndEdit: "Elimina e modifica" +deleteAndEditConfirm: "Vuoi davvero cancellare questa nota e scriverla di nuovo? Verrano eliminate anche tutte le reazioni, Rinote e risposte collegate." addToList: "Aggiungi alla lista" sendMessage: "Invia messaggio" copyUsername: "Copia nome utente" @@ -49,65 +52,104 @@ reply: "Rispondi" loadMore: "Mostra di più" showMore: "Mostra di più" youGotNewFollower: "Ha iniziato a seguirti" -receiveFollowRequest: "Nuova richiesta di essere seguito" +receiveFollowRequest: "Hai ricevuto una richiesta di follow." +followRequestAccepted: "Richiesta di follow accettata" mention: "Menzioni" mentions: "Menzioni" directNotes: "Note dirette" -importAndExport: "Importa ed Esporta" +importAndExport: "Importa ed esporta" import: "Importa" export: "Esporta" -files: "Allegato" +files: "Allegati" download: "Scarica" +driveFileDeleteConfirm: "Vuoi davvero eliminare il file「{name}? Anche gli allegati verranno eliminati." +unfollowConfirm: "Vuoi davvero smettere di seguire {name}?" +exportRequested: "Hai richiesto un'esportazione, e potrebbe volerci tempo. Quando sarà compiuta, il file verrà aggiunto direttamente al Drive." +importRequested: "Hai richiesto un'importazione. Può volerci tempo. " lists: "Liste" -noLists: "Qui non c'è ancora niente" +noLists: "Nessuna lista" note: "Nota" notes: "Note" -following: "Seiguiti" -followers: "Seguaci" +following: "Follows" +followers: "Followers" followsYou: "Ti segue" -createList: "Crea una nuova lista" -manageLists: "Modifica lista" +createList: "Aggiungi una nuova lista" +manageLists: "Gestisci liste" error: "Errore" -somethingHappened: "Qualcosa è andato storto." +somethingHappened: "Si è verificato un problema" retry: "Riprova" -enterListName: "Inserisci il nome della lista" +pageLoadError: "Caricamento pagina non riuscito. " +enterListName: "Nome della lista" privacy: "Privacy" +makeFollowManuallyApprove: "Richiedi di approvare i follower manualmente" +defaultNoteVisibility: "Privacy predefinita delle note" follow: "Segui" -followRequest: "Richiesta di seguire" -followRequests: "Richiesta di seguire" +followRequest: "Richiesta di follow" +followRequests: "Richieste di follow" unfollow: "Smetti di seguire" -followRequestPending: "In sospeso" +followRequestPending: "La richiesta di follow deve essere approvata" enterEmoji: "Inserisci emoji" renote: "Rinota" unrenote: "Annulla rinota" -renoted: "Condiviso!" -cantReRenote: "È impossibile rinota una condivisione." +renoted: "Rinotato!" +cantRenote: "È impossibile rinotare questa nota." +cantReRenote: "È impossibile rinotare una Rinota." quote: "Cita" +pinnedNote: "Nota fissata" pinned: "Fissa sul profilo" you: "Tu" clickToShow: "Clicca per visualizzare" sensitive: "Contenuto sensibile" add: "Aggiungi" reaction: "Reazione" +reactionSettingDescription: "Scegli le reazioni che preferisci e fissale nel pannello di reazioni." +reactionSettingDescription2: "Trascina per riorganizzare, clicca per cancellare, usa il pulsante \"+\" per aggiungere." +rememberNoteVisibility: "Ricordare le impostazioni di visibilità delle note" attachCancel: "Rimuovi allegato" markAsSensitive: "Segna come sensibile" unmarkAsSensitive: "Segna come non sensibile" +enterFileName: "Nome del file" mute: "Silenzia" unmute: "Riattiva" block: "Blocca" unblock: "Sblocca" suspend: "Sospendi" unsuspend: "Annulla la sospensione dell'account" -blockConfirm: "Vuoi bloccare?" -unblockConfirm: "Vuoi sbloccare?" +blockConfirm: "Vuoi davvero bloccare l'account?" +unblockConfirm: "Vuoi davvero sbloccare l'account?" +suspendConfirm: "Vuoi davvero sospendere questo account?" +unsuspendConfirm: "Vuoi annullare la sospensione dell'account?" +selectList: "Seleziona una lista" +selectAntenna: "Scegli un'antenna" +selectWidget: "Seleziona widget" +editWidgets: "Modifica i widget" editWidgetsExit: "Modifica fine" +customEmojis: "Emoji personalizzati" emoji: "Emoji" -addAcount: "Aggiungi un account esistente" +emojiName: "Nome dell'emoji" +emojiUrl: "URL dell'emoji" +addEmoji: "Aggiungi un emoji" +settingGuide: "Configurazione suggerita" +cacheRemoteFiles: "Memorizzazione nella cache dei file remoti" +flagAsBot: "Io sono un robot" +flagAsBotDescription: "Se l'account esegue principalmente operazioni automatiche, attiva quest'opzione. Quando attivata, opera come un segnalatore per gli altri sviluppatori allo scopo di prevenire catene d’interazione senza fine con altri bot, e di adeguare i sistemi interni di Misskey perché trattino questo account come un bot." +flagAsCat: "Io sono un gatto" +flagAsCatDescription: "Abilita l'opzione \"Io sono un gatto\" per l'account." +autoAcceptFollowed: "Accetta automaticamente le richieste di follow da utenti che già segui" +addAcount: "Aggiungi account" +loginFailed: "Accesso non riuscito" +showOnRemote: "Sfoglia sull'istanza remota" general: "Generali" wallpaper: "Sfondo" setWallpaper: "Imposta sfondo" removeWallpaper: "Elimina lo sfondo" searchWith: "Cerca: {q}" +youHaveNoLists: "Non hai ancora creato nessuna lista" +followConfirm: "Sei sicur@ di voler seguire {name}?" +proxyAccount: "Account proxy" +host: "Server remoto" +selectUser: "Seleziona utente" +recipient: "Destinatario" annotation: "Descrizione" federation: "Federazione" instances: "Istanza" @@ -115,36 +157,62 @@ storageUsage: "Volume di dischi" charts: "Grafici" perHour: "All'ora" perDay: "al giorno" +blockThisInstance: "Blocca l'istanza" +operations: "Operazioni" software: "Software" version: "Versione" metadata: "Metadato" +withNFiles: "{n} file in allegato" +monitor: "Monitorare" +jobQueue: "Coda di lavoro" cpuAndMemory: "CPU e Memoria" network: "Rete" disk: "Disco" -instanceInfo: "Informazioni di istanza" +instanceInfo: "Informazioni sull'istanza" statistics: "Statistiche" -clearQueue: "Cancella coda" -clearQueueConfirmTitle: "Cancella coda?" -blockedInstances: "Istanza bloccati" -muteAndBlock: "Silenziamento e blocco" +clearQueue: "Svuota coda" +clearQueueConfirmTitle: "Vuoi davvero svuotare la coda?" +clearCachedFiles: "Svuota cache" +clearCachedFilesConfirm: "Vuoi davvero svuotare la cache da tutti i file remoti?" +blockedInstances: "Istanze bloccate" +blockedInstancesDescription: "Elenca le istanze che vuoi bloccare, una per riga. Esse non potranno più interagire con la tua istanza." +muteAndBlock: "Silenziati / Bloccati" mutedUsers: "Account silenziati" blockedUsers: "Account bloccati" +noUsers: "Nessun utente trovato" editProfile: "Modifica profilo" noteDeleteConfirm: "Eliminare questo Nota?" +pinLimitExceeded: "Non puoi fissare altre note " +intro: "L'installazione di Misskey è finita! Si prega di creare un account amministratore." done: "Fine" processing: "In elaborazione" -blocked: "Bloccati" +preview: "Anteprima" +default: "Predefinito" +noCustomEmojis: "Nessun emoji" +noJobs: "Nessun lavoro" +federating: "Federando" +blocked: "Bloccato" +suspended: "Sospes@" all: "Tutti" +subscribing: "Iscrivendo" +publishing: "Pubblicando" notResponding: "Nessuna risposta" +instanceFollowing: "Seguiti dall'istanza" +instanceFollowers: "Followers dell'istanza" +instanceUsers: "Utenti dell'istanza" changePassword: "Aggiorna Password" security: "Sicurezza" retypedNotMatch: "Le password non corrispondono." currentPassword: "Password attuale" newPassword: "Nuova Password" -newPasswordRetype: "Conferma nuova password" +newPasswordRetype: "Conferma password" +attachFile: "Allega file" more: "Altri!" +featured: "Tendenze" +usernameOrUserId: "Nome utente o ID utente" +noSuchUser: "Nessun utente trovato" lookup: "Cercare" -announcements: "Annuncio" +announcements: "Annunci" imageUrl: "URL dell'immagine" remove: "Elimina" removed: "Il tuo Tweet è stato eliminato" @@ -154,31 +222,66 @@ resetAreYouSure: "Reimposta" saved: "Salvato" messaging: "Messaggi" upload: "Carica" +fromDrive: "Dal Drive" +fromUrl: "Dall'URL" uploadFromUrl: "Incolla URL immagine" +uploadFromUrlDescription: "URL del file che vuoi caricare" +uploadFromUrlRequested: "Caricamento richiesto" +uploadFromUrlMayTakeTime: "Il caricamento del file può richiedere tempo." explore: "Esplora" games: "Misskey Giochi" messageRead: "Visualizzato" +noMoreHistory: "Non c'è più cronologia da visualizzare" startMessaging: "Nuovo messaggio" +nUsersRead: "Letto da {n} persone" +agreeTo: "Sono d'accordo con {0}" tos: "Termini di servizio" +start: "Inizia!" home: "Home" +remoteUserCaution: "Può darsi che le informazioni siano incomplete perché questo è un utente remoto." +activity: "Attività" images: "Immagini" birthday: "Compleanno" yearsOld: "{age}Anni" registeredDate: "Iscrizione a.." location: "Posizione" theme: "Tema" +themeForLightMode: "Tema da utilizzare per il modo chiaro" +themeForDarkMode: "Tema da utilizzare per il modo scuro" light: "Chiaro" dark: "Scuro" lightThemes: "Tema Chiaro" darkThemes: "Tema Scuro" +syncDeviceDarkMode: "Sincronizza il tema scuro con le impostazioni del dispositivo" drive: "Drive" fileName: "Nome dell'allegato" +selectFile: "Scelta allegato" +selectFiles: "Scelta allegato" +selectFolder: "Seleziona cartella" +selectFolders: "Seleziona cartella" +renameFile: "Rinomina file" +folderName: "Nome della cartella" +createFolder: "Nuova cartella" +renameFolder: "Rinominare cartella" +deleteFolder: "Elimina cartella" +addFile: "Allega" +emptyDrive: "Il Drive è vuoto" +emptyFolder: "La cartella è vuota" +unableToDelete: "Eliminazione impossibile" +inputNewFileName: "Inserisci nome del nuovo file" +inputNewFolderName: "Inserisci nome della nuova cartella" +circularReferenceFolder: "La cartella di destinazione è una sottocartella della cartella che vuoi spostare." +hasChildFilesOrFolders: "Impossibile eliminare la cartella perché non è vuota" copyUrl: "Copia URL" rename: "Modifica nome" avatar: "Foto del profilo" -banner: "Foto d'intestazione" +banner: "Intestazione" nsfw: "Contenuti sensibili" +whenServerDisconnected: "Quando la connessione col server è persa" +disconnectedFromServer: "Disconness@ dal server" reload: "Ricarica" +doNothing: "Nessun'azione" +reloadConfirm: "Vuoi ricaricare?" watch: "Osserva" unwatch: "Smetti di Osserva" accept: "Accetta" @@ -195,21 +298,64 @@ today: "Oggi" dayX: "{day}" monthX: "{month}" yearX: "{year}" +pages: "Pagine" integration: "App collegate" connectSerice: "Connetti" disconnectSerice: "Disconnetti" +enableLocalTimeline: "Abilita Timeline locale" +enableGlobalTimeline: "Abilita Timeline federata" +disablingTimelinesInfo: "Anche se disabiliti queste timeline, gli amministratori e i moderatori potranno sempre accederci." registration: "Iscriviti" +enableRegistration: "Permettere nuove registrazioni" invite: "Invita" -bannerUrl: "indirizzo Foto d'intestazione" +proxyRemoteFiles: "Usare file remoti come proxy" +driveCapacityPerLocalAccount: "Volume del Drive per utente locale" +driveCapacityPerRemoteAccount: "Volume del Drive per utente remoto" +inMb: "in Megabytes" +iconUrl: "URL di icona (favicon, ecc.)" +bannerUrl: "URL dell'immagine d'intestazione" basicInfo: "Informazioni fondamentali" +pinnedUsers: "Utenti in evidenza" +pinnedUsersDescription: "Elenca gli/le utenti che vuoi fissare in cima alla pagina \"Esplora\", un@ per riga." +pinnedPages: "Pagine in evidenza" +pinnedPagesDescription: "Specifica il percorso delle pagine che vuoi fissare in cima alla pagina dell'istanza. Una pagina per riga." +pinnedClipId: "ID della clip in evidenza" +pinnedNotes: "Nota fissata" hcaptcha: "hCaptcha" enableHcaptcha: "Abilita hCaptcha" +hcaptchaSiteKey: "Chiave del sito" +hcaptchaSecretKey: "Chiave segreta" recaptcha: "reCAPTCHA" enableRecaptcha: "Abilita reCAPTCHA" +recaptchaSiteKey: "Chiave del sito" +recaptchaSecretKey: "Chiave segreta" +antennas: "Antenne" +manageAntennas: "Gestore delle antenne" name: "Nome" +antennaSource: "Fonte dell'antenna" +antennaKeywords: "Parole chiavi da ricevere" +antennaExcludeKeywords: "Parole chiavi da escludere" +antennaKeywordsDescription: "Separare con uno spazio indica la condizione \"E\". Separare con un'interruzzione riga indica la condizione \"O\"." +notifyAntenna: "Invia notifiche delle nuove note" +withFileAntenna: "Solo note con file in allegato" serviceworker: "ServiceWorker" +enableServiceworker: "Abilita ServiceWorker" +antennaUsersDescription: "Inserisci solo un nome utente per riga" +caseSensitive: "Sensibile alla distinzione tra maiuscole e minuscole" +withReplies: "Includere le risposte" +connectedTo: "Sei conness@ agli account qui sotto:" notesAndReplies: "Note e risposte" -exploreFediverse: "Esplora Fediverse" +withFiles: "Con file in allegato" +silence: "Silenzia" +silenceConfirm: "Vuoi davvero silenziare l'utente?" +unsilence: "Riattiva" +unsilenceConfirm: "Vuoi davvero riattivare l'utente?" +popularUsers: "Utenti popolari" +recentlyUpdatedUsers: "Utenti attivi di recente" +recentlyRegisteredUsers: "Utenti registrati di recente" +recentlyDiscoveredUsers: "Utenti scoperti di recente" +exploreUsersCount: "Ci sono {count} utenti" +exploreFediverse: "Esplora il Fediverso" popularTags: "Tag di tendenza" userList: "Liste" about: "Informazioni" @@ -218,96 +364,243 @@ administrator: "Amministratore" token: "Token" twoStepAuthentication: "Autenticazione a due fattori" moderator: "Moderatore" +nUsersMentioned: "{n} utenti menzionatə" +securityKey: "Chiave di sicurezza" +securityKeyName: "Nome della chiave" +registerSecurityKey: "Registra una chiave di sicurezza" lastUsed: "Ultima attività" -unregister: "Disattiva account" +unregister: "Annulla l'iscrizione" +passwordLessLogin: "Accedi senza password" resetPassword: "Reimposta password" -share: "Renota" +newPasswordIs: "La tua nuova password è「{password}」" +reduceUiAnimation: "Ridurre le animazioni dell'interfaccia" +share: "Condividi" +notFound: "Non trovato" +notFoundDescription: "Nessuna pagina corrisponde all'URL indicata." +uploadFolder: "Destinazione caricamento predefinita" cacheClear: "Svuota cache" +markAsReadAllNotifications: "Segna tutte le notifiche come lette" +markAsReadAllUnreadNotes: "Segna tutte le note come lette" +markAsReadAllTalkMessages: "Segna tutte le chat come lette" help: "Guida" +inputMessageHere: "Scrivi messaggio qui" close: "Chiudi" group: "Gruppo" groups: "Gruppi" createGroup: "Nuovo gruppo" -invites: "Invita" +ownedGroups: "I miei gruppi" +joinedGroups: "Gruppi a cui mi sono unit@" +invites: "Inviti" +groupName: "Nome del gruppo" +members: "Membri" transfer: "Trasferisci" +messagingWithUser: "Iniziare una chat con un altr@ utente" +messagingWithGroup: "Chattare in gruppo" title: "Titolo" +text: "Testo" +enable: "Abilita" next: "Avanti" +retype: "Conferma" noteOf: "Note di {user}" +inviteToGroup: "Invitare al gruppo" +maxNoteTextLength: "Lunghezza massima delle note" +quoteAttached: "Citazione allegata" +quoteQuestion: "Vuoi aggiungere una citazione?" +noMessagesYet: "Ancora nessuna chat" +newMessageExists: "Hai ricevuto un nuovo messaggio" +onlyOneFileCanBeAttached: "È possibile allegare al messaggio soltanto uno file" +signinRequired: "Devi essere registrat@ nel tuo account" invitations: "Invita" invitationCode: "Codice di invito" +checking: "Confermando" available: "Consigliati" unavailable: "Il nome utente è già in uso" usernameInvalidFormat: "Il nome utente può contenere solo lettere, numeri e '_'" tooShort: "Troppo breve" tooLong: "Troppo lungo" +weakPassword: "Password debole" +normalPassword: "Password buona" +strongPassword: "Password forte" +passwordMatched: "Corretta" passwordNotMatched: "Le password non corrispondono." +signinWith: "Accedi con {x}" +signinFailed: "Autenticazione non riuscita. Controlla la tua password e nome utente." +tapSecurityKey: "Premi la chiave di sicurezza" +or: "oppure" +language: "Lingua" +uiLanguage: "Lingua di visualizzazione dell'interfaccia" +groupInvited: "Invitat@ al gruppo" +aboutX: "Informazioni su {x}" +useOsNativeEmojis: "Usare le emoji native del sistema operativo" +youHaveNoGroups: "Nessun gruppo" +joinOrCreateGroup: "Puoi creare il tuo gruppo o essere invitat@ a gruppi che già esistono." +noHistory: "Nessuna cronologia" signinHistory: "Cronologia di accesso all'account" +category: "Categoria" tags: "Tag" +docSource: "Sorgente della scheda" createAccount: "Crea il tuo account" existingAcount: "Account esistente" +regenerate: "Generare di nuovo" +fontSize: "Dimensione carattere" +noFollowRequests: "Non hai alcuna richiesta di follow" +openImageInNewTab: "Aprire immagini in una nuova scheda" +dashboard: "Pannello di controllo" local: "Locale" remote: "Remoto" -accountSettings: "Impostazioni Account" +total: "Totale" +weekOverWeekChanges: "Settimanale" +dayOverDayChanges: "Giornaliero" +appearance: "Aspetto" +clientSettings: "Impostazioni client" +accountSettings: "Impostazioni account" +promotion: "Promossa" promote: "Pubblicizza" +numberOfDays: "Numero di giorni" +hideThisNote: "Nasconda la nota" +showFeaturedNotesInTimeline: "Mostrare le note di tendenza nella tua timeline" +objectStorage: "Stoccaggio oggetti" +useObjectStorage: "Utilizza stoccaggio oggetti" objectStorageBaseUrl: "Base URL" objectStorageBucket: "Bucket" +objectStoragePrefix: "Prefix" +objectStoragePrefixDesc: "I file saranno conservati sotto la directory di questo prefisso." objectStorageEndpoint: "Endpoint" objectStorageRegion: "Region" objectStorageUseSSL: "Usare SSL" serverLogs: "Log del server" deleteAll: "Cancella cronologia" -sounds: "Effetti sonori" +showFixedPostForm: "Visualizzare la finestra di pubblicazione in cima alla timeline" +newNoteRecived: "Nuova nota ricevuta" +sounds: "Impostazioni suoni" listen: "Ascolta" none: "Niente" +showInPage: "Visualizza in pagina" +popout: "Finestra pop-out" volume: "Volume" +masterVolume: "Volume principale" details: "Dettagli" +chooseEmoji: "Scegli emoji" +unableToProcess: "Impossibile compiere l'operazione" +recentUsed: "Usato di recente" install: "Installa" uninstall: "Disinstalla" +installedApps: "Applicazioni installate" +nothing: "Niente da visualizzare" installedDate: "Data installazione" +lastUsedDate: "Data di ultimo uso" state: "Stato" sort: "Ordina per" -visibility: "Privacy dei post" +ascendingOrder: "Ascendente" +descendingOrder: "Discendente" +scratchpad: "ScratchPad" +output: "Uscita" +script: "Script" +disablePagesScript: "Disabilita AiScript nelle pagine" +updateRemoteUser: "Aggiornare le informazioni di utente remoto" +deleteAllFiles: "Elimina tutti i file" +deleteAllFilesConfirm: "Vuoi davvero eliminare tutti i file?" +removeAllFollowing: "Cancella tutti i follows" +removeAllFollowingDescription: "Cancella tutti i follows del server {host}. Per favore, esegui se, ad esempio, l'istanza non esiste più." +userSuspended: "L'utente è sospes@." +userSilenced: "L'utente è silenziat@." +sidebar: "Barra laterale" +divider: "Linea di separazione" +addItem: "Aggiungi elemento" +rooms: "Camera" +serviceworkerInfo: "Deve essere abilitato per le notifiche push. " +deletedNote: "Nota eliminata" +invisibleNote: "Nota invisibile" +enableInfiniteScroll: "Abilita scorrimento infinito" +visibility: "Visibilità" poll: "Sondaggio" useCw: "Nascondere media" +expandTweet: "Espandi tweet" +themeEditor: "Editor di temi" description: "Descrizione" author: "Autore" +leaveConfirm: "Ci sono delle modifiche ancora non salvate. Vuoi cancellarle?" +manage: "Gestione" +useFullReactionPicker: "Usa la totalità del pannello di reazioni" width: "Larghezza" height: "Altezza" large: "Grande" medium: "Predefinito" small: "Piccolo" +enableAll: "Abilita tutto" +disableAll: "Disabilita tutto" +tokenRequested: "Autorizza accesso all'account" +notificationType: "Tipo di notifiche" edit: "Modifica" +useStarForReactionFallback: "Se è sconosciuto l'emoji di reazione, usare la ★ come alternativa." +emailConfig: "Impostazioni server email" email: "Email" +smtpHost: "Server remoto" smtpUser: "Nome utente" smtpPass: "Password" -wordMute: "Parole silenziate" +wordMute: "Filtri parole" +userSaysSomething: "{name} ha detto qualcosa" display: "Visualizza" copy: "Copia" logs: "Log" database: "Base di dati" channel: "Canale" -notificationSetting: "impostazioni delle notifiche" +create: "Crea" +notificationSetting: "Impostazioni notifiche" +notificationSettingDesc: "Seleziona il tipo di notifiche da visualizzare." other: "Avanzate" +fileIdOrUrl: "ID o URL del file" abuseReports: "Segnala" reportAbuse: "Segnala" reportAbuseOf: "Segnala {name}" send: "Inviare" openInNewTab: "Apri in una nuova scheda" +editTheseSettingsMayBreakAccount: "Modificare queste impostazioni può danneggiare l'account." +waitingFor: "Aspettando {x}" random: "Casuale" system: "Sistema" +switchUi: "Cambiare interfaccia utente" desktop: "Desktop" +clip: "Clip" +createNew: "Crea nuov@" optional: "Opzionale" -public: "Pubblico" +createNewClip: "Nuova clip" +public: "Pubblica" +i18nInfo: "Misskey è tradotto in diverse lingue da volontari. Anche tu puoi contribuire su {link}." +notesCount: "Conteggio note" +repliesCount: "Numero di risposte inviate" +renotesCount: "Numero di note che hai ricondiviso" +repliedCount: "Numero di risposte ricevute" +renotedCount: "Numero delle tue note ricondivise" +followingCount: "Numero di account seguiti" +followersCount: "Numero di account che ti seguono" +sentReactionsCount: "Numero di reazioni inviate" +receivedReactionsCount: "Numero di reazioni ricevute" +pollVotesCount: "Numero di voti inviati" +pollVotedCount: "Numero di voti ricevuti" yes: "Sì" no: "No" +driveFilesCount: "Numero di file nel Drive" +noteFavoritesCount: "Conteggio note tra i preferiti" +pageLikesCount: "Numero di pagine che ti piacciono" +pageLikedCount: "Numero delle tue pagine che hanno ricevuto \"Mi piace\"" +reversiCount: "Numero di partite a Reversi" contact: "Contatti" +clips: "Clip" +experimentalFeatures: "Funzioni sperimentali" developer: "Sviluppatore" +showGapBetweenNotesInTimeline: "Mostrare un intervallo tra le note sulla timeline" duplicate: "Duplica" left: "Sinistra" center: "Centro" wide: "Largo" +clearCache: "Svuota cache" +onlineUsersCount: "{n} utenti online" +nUsers: "{n} utenti" nNotes: "{n}Note" +myTheme: "I miei temi" backgroundColor: "Sfondo" +textColor: "Testo" value: "Valore" saveConfirm: "Vuoi salvare le modifiche?" deleteConfirm: "Rimuovere?" @@ -317,45 +610,103 @@ currentVersion: "Versione attuale" latestVersion: "Ultima versione" editCode: "Modifica codice" apply: "Applica" +emailNotification: "Eventi per notifiche via mail" +inChannelSearch: "Cerca in canale" +useReactionPickerForContextMenu: "Cliccare sul tasto destro per aprire il pannello di reazioni" +typingUsers: "{users} sta(nno) scrivendo" +showingPastTimeline: "Stai visualizzando una vecchia timeline" _email: _follow: title: "Ha iniziato a seguirti" + _receiveFollowRequest: + title: "Hai ricevuto una richiesta di follow" _registry: key: "Dati" keys: "Dati" + createKey: "Crea chiave" _aboutMisskey: + source: "Codice sorgente" morePatrons: "Ci sono molti altri che ci sostengono. Grazie 🥰" _mfm: mention: "Menzioni" + mentionDescription: "Si può menzionare un utente specifico digitando il suo nome utente subito dopo il segno @." + hashtag: "Hashtag" url: "URL" link: "Link" bold: "Grassetto" - blockCode: "Codice(blocco)" + blockCode: "Codice (blocco)" inlineMath: "Espressione matematica(Immersione)" - blockMath: "Espressione matematica(blocco)" + blockMath: "Formula matematica (blocco)" quote: "Cita il nota" + emoji: "Emoji personalizzati" search: "Cerca" blur: "Sfocatura" font: "Tipo di carattere" _reversi: + gameSettings: "Impostazioni di gioco" + botSettings: "Opzioni del bot" black: "Nero" white: "Bianco" + total: "Totale" ended: "Esci" +_instanceTicker: + none: "Nascondi" + remote: "Mostra solo per gli/le utenti remotə" + always: "Mostra sempre" _channel: + create: "Nuovo canale" + edit: "Gerisci canale" + setBanner: "Scegli intestazione" + removeBanner: "Rimuovi intestazione" featured: "Tendenze" + owned: "I miei canali" + following: "Seguiti" + usersCount: "{n} partecipanti" + notesCount: "{n} note" _sidebar: - icon: "Foto del profilo" + icon: "Icone" hide: "Nascondere" +_wordMute: + muteWords: "Parole da silenziare" + muteWordsDescription: "Separare con uno spazio indica la condizione \"E\". Separare con un'interruzzione riga indica la condizione \"O\"." + muteWordsDescription2: "Metti le parole chiavi tra slash per usare espressioni regolari (regexp)." + mutedNotes: "Note silenziate" _theme: + explore: "Esplora temi" + install: "Installa un tema" + manage: "Gerisci temi" + code: "Codice tema" + installed: "{name} è installato" + installedThemes: "Temi installati" + builtinThemes: "Temi integrati" + alreadyInstalled: "Questo tema è già installato" + invalid: "Il formato tema non è valido" + make: "Crea un tema" + base: "Base" + addConstant: "Aggiungi costante" constant: "Costante" defaultValue: "Valore predefinito" color: "Colore" + key: "Chiave" func: "Funzione" + argument: "Argomento" darken: "Scuro" lighten: "Chiaro" keys: bg: "Sfondo" + fg: "Testo" + focus: "Focalizzazione" + indicator: "Indicatore" + panel: "Pannello" shadow: "Ombra" + header: "Intestazione" + navBg: "Sfondo della barra laterale" + navFg: "Testo della barra laterale" + navHoverFg: "Testo della barra laterale (al passaggio del mouse)" + navActive: "Testo della barra laterale (attivo)" + navIndicator: "Indicatore di barra laterale" + link: "Link" + hashtag: "Hashtag" mention: "Menzioni" renote: "Rinota" divider: "Interruzione di linea" @@ -363,6 +714,8 @@ _sfx: note: "Nota" notification: "Notifiche" chat: "Messaggi" + antenna: "Ricezione dell'antenna" + channel: "Notifiche di canale" _ago: unknown: "Sconosciuto" future: "Futuro" @@ -381,14 +734,51 @@ _time: day: "giorni" _tutorial: title: "Come usare Misskey" - step1_1: "Benvenuto" + step1_1: "Benvenuto/a!" + step1_2: "Questa pagina si chiama una \" Timeline \". Mostra in ordine cronologico le \" note \" delle persone che segui." + step1_3: "Attualmente la tua Timeline è vuota perché non segui alcun account e non hai pubblicato alcuna nota ancora." + step2_1: "Prima di scrivere una nota o di seguire un account, imposta il tuo profilo!" + step2_2: "Aggiungere qualche informazione su di te aumenterà le tue possibilità di essere seguit@ da altre persone. " + step3_1: "Hai finito di impostare il tuo profilo?" + step3_2: "Ora, puoi pubblicare una nota. Facciamo una prova! Premi il pulsante a forma di penna in cima allo schermo per aprire una finestra di dialogo. " + step3_3: "Scritto il testo della nota, puoi pubblicarla premendo il pulsante nella parte superiore destra della finestra di dialogo." + step3_4: "Non ti viene niente in mente? Perché non scrivi semplicemente \"Ho appena cominciato a usare Misskey\"?" + step4_1: "Hai pubblicato qualcosa?" + step4_2: "Se puoi visualizzare la tua nota sulla timeline, ce l'hai fatta!" + step5_1: "Adesso, cerca di seguire altre persone per vivacizzare la tua timeline. " + step5_2: "La pagina {featured} mostra le note di tendenza su questa istanza e, sfogliandole, magari toverai degli account che ti piacciono e che vorrai seguire. Oppure, potrai trovare utenti popolari usando {explore}." + step5_3: "Per seguire altrə utenti, clicca sul loro avatar per aprire la pagina di profilo dove puoi premere il pulsante \"Seguire\". " + step5_4: "Alcunə utenti scelgono di confermare manualmente le richieste di follow che ricevono, quindi a seconda delle persone potrebbe volerci un pò prima che la tua richiesta sia accolta." + step6_1: "Ora, se puoi visualizzare le note di altrə utenti sulla tua timeline, ce l'hai fatta!" + step6_2: "Puoi inviare una risposta rapida alle note di altrə utenti mandando loro \"reazioni\"." + step6_3: "Per inviare una reazione, premi l'icona + della nota e scegli l'emoji che vuoi mandare." + step7_1: "Complimenti! Sei arrivat@ alla fine dell'esercitazione di base su come usare Misskey. " + step7_2: "Se vuoi saperne di più su Misskey, puoi dare un'occhiata alla sezione {help}." + step7_3: "Da ultimo, buon divertimento su Misskey! 🚀" _permissions: - "read:blocks": "Visualizza gli account che hai bloccato." - "write:blocks": "Gestisci gli account che hai bloccato." - "read:favorites": "Visualizza Preferiti" - "write:favorites": "Gestisci Preferiti" + "read:blocks": "Visualizza gli account bloccati" + "write:blocks": "Gestisci gli account bloccati" + "read:favorites": "Visualizza i tuoi preferiti" + "write:favorites": "Gestisci i tuoi preferiti" + "read:following": "Vedi le informazioni di follow" "write:following": "Seguiti/ Smetti di seguire" + "read:mutes": "Vedi account silenziati" + "write:mutes": "Gerisci account silenziati" + "write:notes": "Creare / Eliminare note" "read:notifications": "Visualizza notifiche" + "write:notifications": "Gerisci notifiche" + "read:reactions": "Vedi reazioni" + "write:reactions": "Gerisci reazioni" + "read:user-groups": "Vedi gruppi di utenti" + "write:user-groups": "Gestisci gruppi di utenti" + "read:channels": "Visualizza canali" + "write:channels": "Gerisci canali" +_antennaSources: + all: "Tutte le note" + homeTimeline: "Note dagli utenti che segui" + users: "Note dagli utenti selezionati" + userList: "Note dagli utenti della lista selezionata" + userGroup: "Note dagli utenti del gruppo selezionato" _weekday: sunday: "Domenica" monday: "Lunedì" @@ -409,6 +799,9 @@ _widgets: photos: "Foto" digitalClock: "Orologio digitale" federation: "Federazione" + button: "Pulsante" + onlineUsers: "Utenti online" + jobQueue: "Coda di lavoro" _cw: hide: "Nascondere" show: "Mostra di più" @@ -422,14 +815,20 @@ _poll: voted: "Votato" closed: "Terminato" _visibility: - public: "Pubblico" + public: "Pubblica" + publicDescription: "Visibile per tutti sul Fediverso" home: "Home" - followers: "Seguaci" - localOnly: "Solo Locale" - localOnlyDescription: "Solo locale" + homeDescription: "Visibile solo sulla timeline \"Home\"" + followers: "Followers" + followersDescription: "Visibile solo per i tuoi followers" + specified: "Diretta" + specifiedDescription: "Visibile solo per gli/le utenti menzionatə" + localOnly: "Soltanto locale" + localOnlyDescription: "Nascosta per gli/le utenti remotə" _postForm: replyPlaceholder: "Nota la tua risposta.." quotePlaceholder: "Cita Nota..." + channelPlaceholder: "Pubblica in canale" _profile: name: "Nome" username: "Nome utente" @@ -437,16 +836,29 @@ _profile: metadata: "Metadati" metadataLabel: "Etichetta" metadataContent: "Contenuto" + changeBanner: "Cambia intestazione" _exportOrImport: - followingList: "Seiguiti" - muteList: "Silenzia" - blockingList: "Blocca" + allNotes: "Tutte le note" + followingList: "Follows" + muteList: "Account silenziati" + blockingList: "Account bloccati" userLists: "Liste" +_charts: + usersIncDec: "Variazione del numero di utenti" + usersTotal: "Numero totale di utenti" + activeUsers: "Numero di utenti attivi" + notesTotal: "Conteggio totale di note" +_instanceCharts: + users: "Variazione del numero di utenti" + usersTotal: "Totale cumulativo di utenti" _timelines: home: "Home" local: "Locale" + social: "Sociale" _rooms: + roomOf: "Camera di {user}" _roomType: + default: "Predefinito" washitsu: "Washitsu" _furnitures: milk: "Cartone del latte" @@ -477,31 +889,59 @@ _rooms: photoframe: "Cornice" cube: "Cubo" tv: "Televisore" - pinguin: "Pinguini" + pinguin: "Pinguino" bin: "Cestino" cup-noodle: "Noodle istantanei" _pages: + created: "Pagina creata!" + pageSetting: "Impostazioni pagina" + viewSource: "Visualizza sorgente" like: "Mi piace" unlike: "Togli Mi piace" + featured: "Popolari" + content: "Blocco di pagina" variables: "Variabili" title: "Titolo" + hideTitleWhenPinned: "Nascondere il titolo pagina quando è fissata in cima al profilo." font: "Tipo di carattere" + chooseBlock: "Aggiungi blocco" blocks: + text: "Testo" + textarea: "Area di testo" + section: "Sezione" image: "Immagini" + button: "Pulsante" if: "Se" _if: variable: "Variabili" _post: text: "Contenuto" _textInput: + name: "Nome della variabile" text: "Titolo" + default: "Valore predefinito" _textareaInput: + name: "Nome della variabile" text: "Titolo" + default: "Valore predefinito" _numberInput: + name: "Nome della variabile" text: "Titolo" + default: "Valore predefinito" + _canvas: + width: "Larghezza" + height: "Altezza" + note: "Nota integrata" + _note: + id: "ID nota" + idDescription: "Qui puoi anche incollare l'URL della nota che vuoi impostare." + detailed: "Visualizzazione dettagliata" _switch: + name: "Nome della variabile" text: "Titolo" + default: "Valore predefinito" _counter: + name: "Nome della variabile" text: "Titolo" _button: text: "Titolo" @@ -509,7 +949,9 @@ _pages: _dialog: content: "Contenuto" _radioButton: + name: "Nome della variabile" title: "Titolo" + default: "Valore predefinito" script: categories: comparison: "Metodo comparativo" @@ -518,6 +960,15 @@ _pages: fn: "Funzione" list: "Liste" blocks: + text: "Testo" + _strLen: + arg1: "Testo" + _strPick: + arg1: "Testo" + _strReplace: + arg1: "Testo" + _strReverse: + arg1: "Testo" _join: arg1: "Liste" _add: @@ -575,26 +1026,46 @@ _pages: arg1: "Liste" _listLen: arg1: "Liste" + _stringToNumber: + arg1: "Testo" + _splitStrByLine: + arg1: "Testo" ref: "Variabili" fn: "Funzione" types: + string: "Testo" array: "Liste" _notification: + fileUploaded: "File caricato correttamente" + youGotMention: "{name} ti ha menzionato" + youGotReply: "{name} ti ha risposto" youGotQuote: "{name} ha citato il tuo Nota e ha detto" - youRenoted: "{name} ha rinota" + youRenoted: "{name} ha rinotato" youGotPoll: "{name} ha volluto." + youGotMessagingMessageFromUser: "{name} ti ha mandato un messaggio" + youGotMessagingMessageFromGroup: "{name} ti ha mandato un messaggio nella chat" youWereFollowed: "Ha iniziato a seguirti" + youReceivedFollowRequest: "Hai ricevuto una richiesta di follow" + yourFollowRequestAccepted: "La tua richiesta di follow è stata accettata" + youWereInvitedToGroup: "Invitat@ al gruppo" _types: all: "Tutto" - follow: "Seiguiti" + follow: "Follows" mention: "Menzioni" reply: "Rispondi" renote: "Rinota" quote: "Cita" reaction: "Reazione" + pollVote: "Voti ricevuti" + receiveFollowRequest: "Richiesta di follow ricevuta" + followRequestAccepted: "Richiesta di follow accettata" + groupInvited: "Invito a un gruppo" + app: "Notifiche da applicazioni" _deck: _columns: notifications: "Notifiche" tl: "Timeline" + antenna: "Antenne" list: "Liste" mentions: "Menzioni" + direct: "Diretta" diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml index e5700fe059..5729da8da8 100644 --- a/locales/ja-JP.yml +++ b/locales/ja-JP.yml @@ -322,7 +322,7 @@ proxyRemoteFilesDescription: "この設定を有効にすると、未保存ま driveCapacityPerLocalAccount: "ローカルユーザーひとりあたりのドライブ容量" driveCapacityPerRemoteAccount: "リモートユーザーひとりあたりのドライブ容量" inMb: "メガバイト単位" -iconUrl: "アイコン画像のURL" +iconUrl: "アイコン画像のURL (faviconなど)" bannerUrl: "バナー画像のURL" basicInfo: "基本情報" pinnedUsers: "ピン留めユーザー" diff --git a/locales/ja-KS.yml b/locales/ja-KS.yml index 0015db07b9..1a7001269a 100644 --- a/locales/ja-KS.yml +++ b/locales/ja-KS.yml @@ -81,7 +81,7 @@ pageLoadError: "ページの読み込みに失敗してしもうたで…" pageLoadErrorDescription: "これは普通、ネットワークかブラウザキャッシュが原因やからね。キャッシュをクリアするか、もうちっとだけ待ってくれへんか?" enterListName: "リスト名を入れてや" privacy: "プライバシー" -makeFollowManuallyApprove: "ええって言わなフォローできへんようにする" +makeFollowManuallyApprove: "自分が認めた人だけがこのアカウントをフォローできるようにする" defaultNoteVisibility: "もとからの公開範囲" follow: "フォロー" followRequest: "フォローを頼む" @@ -308,7 +308,7 @@ monthX: "{month}月" yearX: "{year}年" pages: "ページ" integration: "連携" -connectSerice: "つなげる" +connectSerice: "つなぐ" disconnectSerice: "切ってまう" enableLocalTimeline: "ローカルタイムラインを使えるようにする" enableGlobalTimeline: "グローバルタイムラインを使えるようにする" @@ -392,7 +392,7 @@ markAsReadAllUnreadNotes: "投稿は全て読んだわっ" markAsReadAllTalkMessages: "チャットはもうぜんぶ読んだわっ" help: "ヘルプ" inputMessageHere: "ここにメッセージ書いてや" -close: "さいなら" +close: "閉じる" group: "グループ" groups: "グループ" createGroup: "グループを作るで" diff --git a/locales/ru-RU.yml b/locales/ru-RU.yml index eb392a27bb..6893213409 100644 --- a/locales/ru-RU.yml +++ b/locales/ru-RU.yml @@ -241,7 +241,7 @@ explore: "Обзор" games: "Игры Misskey" messageRead: "Прочитали" noMoreHistory: "История закончилась" -startMessaging: "Отправить сообщение" +startMessaging: "Начать общение" nUsersRead: "Прочитали {n}" agreeTo: "Я соглашаюсь с {0}" tos: "Пользовательское соглашение" @@ -329,7 +329,7 @@ pinnedUsers: "Прикреплённый пользователь" pinnedUsersDescription: "Перечислите по одному имени пользователя в строке. Пользователи, перечисленные здесь, будут привязаны к закладке \"Изучение\"." pinnedPages: "Закрепленные страницы" pinnedPagesDescription: "Если хотите закрепить страницы на главной сайта, сюда можно добавить пути к ним, каждый в отдельной строке." -pinnedClipId: "Идентификатор закреплённой памятки" +pinnedClipId: "Идентификатор закреплённой подборки" pinnedNotes: "Закреплённая заметка" hcaptcha: "hCaptcha" enableHcaptcha: "Включить hCaptcha" @@ -405,8 +405,8 @@ invites: "Приглашения" groupName: "Название группы" members: "Участники" transfer: "Отдать" -messagingWithUser: "Сообщения пользователей" -messagingWithGroup: "Чат в группе" +messagingWithUser: "Общение с другим пользователем" +messagingWithGroup: "Общение в группе" title: "Заголовок" text: "Текст" enable: "Включить" @@ -471,7 +471,7 @@ promotion: "Продвинуто" promote: "Продвинуть" numberOfDays: "Количество дней" hideThisNote: "Спрятать эту запись" -showFeaturedNotesInTimeline: "Показывать в ленте заметки из подборки сайта" +showFeaturedNotesInTimeline: "Показывать в ленте заметки из «Горячего»" objectStorage: "Хранилище" useObjectStorage: "Занято в хранилище" objectStorageBaseUrl: "Базовый адрес" @@ -524,7 +524,7 @@ deleteAllFiles: "Удалить все файлы" deleteAllFilesConfirm: "Вы хотите удалить все файлы?" removeAllFollowing: "Удалить всех подписчиков" removeAllFollowingDescription: "Отменить все подписки с домена {host}? Пожалуйста, применяйте это действие, если инстанс больше не существует." -userSuspended: "Этот пользователь был заморожен" +userSuspended: "Эта учётная запись заморожена" userSilenced: "Этот пользователь был заглушен" sidebar: "Боковая панель" divider: "Линия-разделитель" @@ -623,30 +623,30 @@ random: "Случайные" system: "Система" switchUi: "Выбор вида" desktop: "Стол" -clip: "В памятку" +clip: "В подборку" createNew: "Новый документ" optional: "Необязательно" -createNewClip: "Новая памятка" +createNewClip: "Новая подборка" public: "Общедоступно" i18nInfo: "Misskey переводят на разные языки добровольцы со всего света. Ваша помощь тоже пригодится здесь: {link}." manageAccessTokens: "Управление токенами доступа" accountInfo: "Сведения об учётной записи" notesCount: "Количество заметок" repliesCount: "Сколько раз пользователь кому-то ответил" -renotesCount: "Сколько раз пользователь передал чужие заметки" +renotesCount: "Сколько раз пользователь делился заметками" repliedCount: "Сколько раз ответили пользователю" -renotedCount: "Сколько раз передавали заметки пользователя" +renotedCount: "Сколько раз делились заметками пользователя" followingCount: "Количество подписок" followersCount: "Количество подписавшихся" -sentReactionsCount: "Сколько раз пользователь отреагировал" -receivedReactionsCount: "Сколько раз отреагировали на заметки пользователя" -pollVotesCount: "Сколько раз участвовал в опросах" +sentReactionsCount: "Количество реакций пользователя" +receivedReactionsCount: "Количество реакций на заметки пользователя" +pollVotesCount: "Сколько раз пользователь участвовал в опросах" pollVotedCount: "Сколько раз участвовали в опросах пользователя" yes: "Да" no: "Нет" driveFilesCount: "Количество файлов на диске" -driveUsage: "Сколько места занято на диске" -noCrawle: "Паукам вход воспрещён" +driveUsage: "Занято места на диске" +noCrawle: "Запретить паукам индексировать сайт" noCrawleDescription: "Просьба поисковым системам не ходить по вашему профилю, по заметкам, страницам и не индексировать их." lockedAccountInfo: "Даже если вы вручную подтверждаете подписки, кто угодно может читать ваши заметки, если вы не отмечаете их «для подписчиков»." alwaysMarkSensitive: "Отмечать файлы как «содержимое не для всех» по умолчанию" @@ -661,7 +661,7 @@ pageLikedCount: "Количество страниц, понравившихся reversiCount: "Количество сыгранных игр в реверси" contact: "Как связаться" useSystemFont: "Использовать шрифт, предлагаемый системой" -clips: "Памятки" +clips: "Подборки" experimentalFeatures: "Экспериментальные функции" developer: "Разработчик" makeExplorable: "Опубликовать профиль в «Обзоре»." @@ -983,7 +983,7 @@ _tutorial: step7_2: "Хотите изучить Misskey глубже — добро пожаловать в раздел «{help}»." step7_3: "Приятно вам провести время с Misskey🚀" _2fa: - alreadyRegistered: "Настройка завершена" + alreadyRegistered: "Двухфакторная аутентификация уже настроена." registerDevice: "Зарегистрируйте ваше устройство" registerKey: "Зарегистрировать ключ" step1: "Прежде всего, установите на устройство приложение для аутентификации, например, {a} или {b}." @@ -1240,7 +1240,7 @@ _pages: liked: "Понравившиеся страницы" featured: "Популярные" inspector: "Инспектор" - contents: "Содержательные" + contents: "Содержимое" content: "Содержимое" variables: "Переменные" title: "Заголовок" diff --git a/locales/zh-CN.yml b/locales/zh-CN.yml index c13cf12220..d6da577982 100644 --- a/locales/zh-CN.yml +++ b/locales/zh-CN.yml @@ -579,7 +579,7 @@ smtpPort: "端口" smtpUser: "用户名" smtpPass: "密码" emptyToDisableSmtpAuth: "用户名和密码留空可以禁用SMTP验证" -smtpSecure: "在 SMTP 连接中默认使用 SSL / TLS" +smtpSecure: "在 SMTP 连接中使用隐式 SSL / TLS" smtpSecureInfo: "使用STARTTLS时关闭。" testEmail: "邮件发送测试" wordMute: "文字屏蔽" diff --git a/locales/zh-TW.yml b/locales/zh-TW.yml index 9d95c958d1..dfae988f1b 100644 --- a/locales/zh-TW.yml +++ b/locales/zh-TW.yml @@ -438,6 +438,7 @@ signinWith: "以{x}登錄" signinFailed: "登入失敗。 請檢查用戶名和密碼。" tapSecurityKey: "點擊安全密鑰" or: "或者" +language: "語言" uiLanguage: "介面語言" groupInvited: "您有新的群組邀請" aboutX: "關於{x}" @@ -677,9 +678,12 @@ newVersionOfClientAvailable: "新版本的用戶端可用。" usageAmount: "使用量" capacity: "容量" inUse: "已使用" +clear: "清除" _email: _follow: title: "您有新的追隨者" +_plugin: + manage: "管理插件" _registry: scope: "範圍" key: "機碼" @@ -702,7 +706,9 @@ _nsfw: _mfm: cheatSheet: "MFM代碼小抄" intro: "MFM是Misskey專用的標記語言,可以在Misskey中的各個位置使用。 您可以這裏看到MFM可用語法列表。" + dummy: "通過Misskey擴展Fediverse的世界" mention: "提及" + mentionDescription: "透過 @+用戶名 來標示特定使用者。" hashtag: "#tag" url: "URL" link: "鏈接" diff --git a/migration/1615965918224-chart-v2.ts b/migration/1615965918224-chart-v2.ts new file mode 100644 index 0000000000..cacbd1945b --- /dev/null +++ b/migration/1615965918224-chart-v2.ts @@ -0,0 +1,218 @@ +import {MigrationInterface, QueryRunner} from "typeorm"; + +export class chartV21615965918224 implements MigrationInterface { + name = 'chartV21615965918224' + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query(`DELETE FROM "__chart__active_users" WHERE "span" = 'day'`); + await queryRunner.query(`DELETE FROM "__chart__drive" WHERE "span" = 'day'`); + await queryRunner.query(`DELETE FROM "__chart__federation" WHERE "span" = 'day'`); + await queryRunner.query(`DELETE FROM "__chart__hashtag" WHERE "span" = 'day'`); + await queryRunner.query(`DELETE FROM "__chart__instance" WHERE "span" = 'day'`); + await queryRunner.query(`DELETE FROM "__chart__network" WHERE "span" = 'day'`); + await queryRunner.query(`DELETE FROM "__chart__notes" WHERE "span" = 'day'`); + await queryRunner.query(`DELETE FROM "__chart__per_user_drive" WHERE "span" = 'day'`); + await queryRunner.query(`DELETE FROM "__chart__per_user_following" WHERE "span" = 'day'`); + await queryRunner.query(`DELETE FROM "__chart__per_user_notes" WHERE "span" = 'day'`); + await queryRunner.query(`DELETE FROM "__chart__per_user_reaction" WHERE "span" = 'day'`); + await queryRunner.query(`DELETE FROM "__chart__test" WHERE "span" = 'day'`); + await queryRunner.query(`DELETE FROM "__chart__test_grouped" WHERE "span" = 'day'`); + await queryRunner.query(`DELETE FROM "__chart__test_unique" WHERE "span" = 'day'`); + await queryRunner.query(`DELETE FROM "__chart__users" WHERE "span" = 'day'`); + + await queryRunner.query(`DROP INDEX "IDX_15e91a03aeeac9dbccdf43fc06"`); + await queryRunner.query(`DROP INDEX "IDX_20f57cc8f142c131340ee16742"`); + await queryRunner.query(`DROP INDEX "IDX_c26e2c1cbb6e911e0554b27416"`); + await queryRunner.query(`DROP INDEX "IDX_3fa0d0f17ca72e3dc80999a032"`); + await queryRunner.query(`DROP INDEX "IDX_6e1df243476e20cbf86572ecc0"`); + await queryRunner.query(`DROP INDEX "IDX_06690fc959f1c9fdaf21928222"`); + await queryRunner.query(`DROP INDEX "IDX_e447064455928cf627590ef527"`); + await queryRunner.query(`DROP INDEX "IDX_2d416e6af791a82e338c79d480"`); + await queryRunner.query(`DROP INDEX "IDX_e9cd07672b37d8966cf3709283"`); + await queryRunner.query(`DROP INDEX "IDX_fcc181fb8283009c61cc4083ef"`); + await queryRunner.query(`DROP INDEX "IDX_49975586f50ed7b800fdd88fbd"`); + await queryRunner.query(`DROP INDEX "IDX_6d6f156ceefc6bc5f273a0e370"`); + await queryRunner.query(`DROP INDEX "IDX_c12f0af4a66cdd30c2287ce8aa"`); + await queryRunner.query(`DROP INDEX "IDX_d0a4f79af5a97b08f37b547197"`); + await queryRunner.query(`DROP INDEX "IDX_f5448d9633cff74208d850aabe"`); + await queryRunner.query(`DROP INDEX "IDX_f8dd01baeded2ffa833e0a610a"`); + await queryRunner.query(`DROP INDEX "IDX_08fac0eb3b11f04c200c0b40dd"`); + await queryRunner.query(`DROP INDEX "IDX_9ff6944f01acb756fdc92d7563"`); + await queryRunner.query(`DROP INDEX "IDX_e69096589f11e3baa98ddd64d0"`); + await queryRunner.query(`DROP INDEX "IDX_0c9a159c5082cbeef3ca6706b5"`); + await queryRunner.query(`DROP INDEX "IDX_924fc196c80ca24bae01dd37e4"`); + await queryRunner.query(`DROP INDEX "IDX_328f259961e60c4fa0bfcf55ca"`); + await queryRunner.query(`DROP INDEX "IDX_42ea9381f0fda8dfe0fa1c8b53"`); + await queryRunner.query(`DROP INDEX "IDX_f2aeafde2ae6fbad38e857631b"`); + await queryRunner.query(`DROP INDEX "IDX_f92dd6d03f8d994f29987f6214"`); + await queryRunner.query(`DROP INDEX "IDX_57b5458d0d3d6d1e7f13d4e57f"`); + await queryRunner.query(`DROP INDEX "IDX_4db3b84c7be0d3464714f3e0b1"`); + await queryRunner.query(`DROP INDEX "IDX_8d2cbbc8114d90d19b44d626b6"`); + await queryRunner.query(`DROP INDEX "IDX_046feeb12e9ef5f783f409866a"`); + await queryRunner.query(`DROP INDEX "IDX_f68a5ab958f9f5fa17a32ac23b"`); + await queryRunner.query(`DROP INDEX "IDX_65633a106bce43fc7c5c30a5c7"`); + await queryRunner.query(`DROP INDEX "IDX_edeb73c09c3143a81bcb34d569"`); + await queryRunner.query(`DROP INDEX "IDX_e316f01a6d24eb31db27f88262"`); + await queryRunner.query(`DROP INDEX "IDX_2be7ec6cebddc14dc11e206686"`); + await queryRunner.query(`DROP INDEX "IDX_a5133470f4825902e170328ca5"`); + await queryRunner.query(`DROP INDEX "IDX_84e661abb7bd1e51b690d4b017"`); + await queryRunner.query(`DROP INDEX "IDX_5c73bf61da4f6e6f15bae88ed1"`); + await queryRunner.query(`DROP INDEX "IDX_d70c86baedc68326be11f9c0ce"`); + await queryRunner.query(`DROP INDEX "IDX_66e1e1ecd2f29e57778af35b59"`); + await queryRunner.query(`DROP INDEX "IDX_92255988735563f0fe4aba1f05"`); + await queryRunner.query(`DROP INDEX "IDX_c5870993e25c3d5771f91f5003"`); + await queryRunner.query(`DROP INDEX "IDX_f170de677ea75ad4533de2723e"`); + await queryRunner.query(`DROP INDEX "IDX_7c184198ecf66a8d3ecb253ab3"`); + await queryRunner.query(`DROP INDEX "IDX_f091abb24193d50c653c6b77fc"`); + await queryRunner.query(`DROP INDEX "IDX_a770a57c70e668cc61590c9161"`); + await queryRunner.query(`ALTER TABLE "__chart__active_users" DROP COLUMN "span"`); + await queryRunner.query(`DROP TYPE "public"."__chart__active_users_span_enum"`); + await queryRunner.query(`ALTER TABLE "__chart__active_users" DROP COLUMN "unique"`); + await queryRunner.query(`ALTER TABLE "__chart__active_users" DROP COLUMN "___local_count"`); + await queryRunner.query(`ALTER TABLE "__chart__active_users" DROP COLUMN "___remote_count"`); + await queryRunner.query(`ALTER TABLE "__chart__drive" DROP COLUMN "span"`); + await queryRunner.query(`DROP TYPE "public"."__chart__drive_span_enum"`); + await queryRunner.query(`ALTER TABLE "__chart__drive" DROP COLUMN "unique"`); + await queryRunner.query(`ALTER TABLE "__chart__federation" DROP COLUMN "span"`); + await queryRunner.query(`DROP TYPE "public"."__chart__federation_span_enum"`); + await queryRunner.query(`ALTER TABLE "__chart__federation" DROP COLUMN "unique"`); + await queryRunner.query(`ALTER TABLE "__chart__hashtag" DROP COLUMN "span"`); + await queryRunner.query(`DROP TYPE "public"."__chart__hashtag_span_enum"`); + await queryRunner.query(`ALTER TABLE "__chart__hashtag" DROP COLUMN "unique"`); + await queryRunner.query(`ALTER TABLE "__chart__hashtag" DROP COLUMN "___local_count"`); + await queryRunner.query(`ALTER TABLE "__chart__hashtag" DROP COLUMN "___remote_count"`); + await queryRunner.query(`ALTER TABLE "__chart__instance" DROP COLUMN "span"`); + await queryRunner.query(`DROP TYPE "public"."__chart__instance_span_enum"`); + await queryRunner.query(`ALTER TABLE "__chart__instance" DROP COLUMN "unique"`); + await queryRunner.query(`ALTER TABLE "__chart__network" DROP COLUMN "span"`); + await queryRunner.query(`DROP TYPE "public"."__chart__network_span_enum"`); + await queryRunner.query(`ALTER TABLE "__chart__network" DROP COLUMN "unique"`); + await queryRunner.query(`ALTER TABLE "__chart__notes" DROP COLUMN "span"`); + await queryRunner.query(`DROP TYPE "public"."__chart__notes_span_enum"`); + await queryRunner.query(`ALTER TABLE "__chart__notes" DROP COLUMN "unique"`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_drive" DROP COLUMN "span"`); + await queryRunner.query(`DROP TYPE "public"."__chart__per_user_drive_span_enum"`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_drive" DROP COLUMN "unique"`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_following" DROP COLUMN "span"`); + await queryRunner.query(`DROP TYPE "public"."__chart__per_user_following_span_enum"`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_following" DROP COLUMN "unique"`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_notes" DROP COLUMN "span"`); + await queryRunner.query(`DROP TYPE "public"."__chart__per_user_notes_span_enum"`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_notes" DROP COLUMN "unique"`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_reaction" DROP COLUMN "span"`); + await queryRunner.query(`DROP TYPE "public"."__chart__per_user_reaction_span_enum"`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_reaction" DROP COLUMN "unique"`); + await queryRunner.query(`ALTER TABLE "__chart__test_grouped" DROP COLUMN "span"`); + await queryRunner.query(`DROP TYPE "public"."__chart__test_grouped_span_enum"`); + await queryRunner.query(`ALTER TABLE "__chart__test_grouped" DROP COLUMN "unique"`); + await queryRunner.query(`ALTER TABLE "__chart__test_unique" DROP COLUMN "span"`); + await queryRunner.query(`DROP TYPE "public"."__chart__test_unique_span_enum"`); + await queryRunner.query(`ALTER TABLE "__chart__test_unique" DROP COLUMN "unique"`); + await queryRunner.query(`ALTER TABLE "__chart__test_unique" DROP COLUMN "___foo"`); + await queryRunner.query(`ALTER TABLE "__chart__test" DROP COLUMN "span"`); + await queryRunner.query(`DROP TYPE "public"."__chart__test_span_enum"`); + await queryRunner.query(`ALTER TABLE "__chart__test" DROP COLUMN "unique"`); + await queryRunner.query(`ALTER TABLE "__chart__users" DROP COLUMN "span"`); + await queryRunner.query(`DROP TYPE "public"."__chart__users_span_enum"`); + await queryRunner.query(`ALTER TABLE "__chart__users" DROP COLUMN "unique"`); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query(`ALTER TABLE "__chart__users" ADD "unique" jsonb NOT NULL DEFAULT '{}'`); + await queryRunner.query(`CREATE TYPE "public"."__chart__users_span_enum" AS ENUM('hour', 'day')`); + await queryRunner.query(`ALTER TABLE "__chart__users" ADD "span" "__chart__users_span_enum" NOT NULL`); + await queryRunner.query(`ALTER TABLE "__chart__test" ADD "unique" jsonb NOT NULL DEFAULT '{}'`); + await queryRunner.query(`CREATE TYPE "public"."__chart__test_span_enum" AS ENUM('hour', 'day')`); + await queryRunner.query(`ALTER TABLE "__chart__test" ADD "span" "__chart__test_span_enum" NOT NULL`); + await queryRunner.query(`ALTER TABLE "__chart__test_unique" ADD "___foo" bigint NOT NULL`); + await queryRunner.query(`ALTER TABLE "__chart__test_unique" ADD "unique" jsonb NOT NULL DEFAULT '{}'`); + await queryRunner.query(`CREATE TYPE "public"."__chart__test_unique_span_enum" AS ENUM('hour', 'day')`); + await queryRunner.query(`ALTER TABLE "__chart__test_unique" ADD "span" "__chart__test_unique_span_enum" NOT NULL`); + await queryRunner.query(`ALTER TABLE "__chart__test_grouped" ADD "unique" jsonb NOT NULL DEFAULT '{}'`); + await queryRunner.query(`CREATE TYPE "public"."__chart__test_grouped_span_enum" AS ENUM('hour', 'day')`); + await queryRunner.query(`ALTER TABLE "__chart__test_grouped" ADD "span" "__chart__test_grouped_span_enum" NOT NULL`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_reaction" ADD "unique" jsonb NOT NULL DEFAULT '{}'`); + await queryRunner.query(`CREATE TYPE "public"."__chart__per_user_reaction_span_enum" AS ENUM('hour', 'day')`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_reaction" ADD "span" "__chart__per_user_reaction_span_enum" NOT NULL`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_notes" ADD "unique" jsonb NOT NULL DEFAULT '{}'`); + await queryRunner.query(`CREATE TYPE "public"."__chart__per_user_notes_span_enum" AS ENUM('hour', 'day')`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_notes" ADD "span" "__chart__per_user_notes_span_enum" NOT NULL`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_following" ADD "unique" jsonb NOT NULL DEFAULT '{}'`); + await queryRunner.query(`CREATE TYPE "public"."__chart__per_user_following_span_enum" AS ENUM('hour', 'day')`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_following" ADD "span" "__chart__per_user_following_span_enum" NOT NULL`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_drive" ADD "unique" jsonb NOT NULL DEFAULT '{}'`); + await queryRunner.query(`CREATE TYPE "public"."__chart__per_user_drive_span_enum" AS ENUM('hour', 'day')`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_drive" ADD "span" "__chart__per_user_drive_span_enum" NOT NULL`); + await queryRunner.query(`ALTER TABLE "__chart__notes" ADD "unique" jsonb NOT NULL DEFAULT '{}'`); + await queryRunner.query(`CREATE TYPE "public"."__chart__notes_span_enum" AS ENUM('hour', 'day')`); + await queryRunner.query(`ALTER TABLE "__chart__notes" ADD "span" "__chart__notes_span_enum" NOT NULL`); + await queryRunner.query(`ALTER TABLE "__chart__network" ADD "unique" jsonb NOT NULL DEFAULT '{}'`); + await queryRunner.query(`CREATE TYPE "public"."__chart__network_span_enum" AS ENUM('hour', 'day')`); + await queryRunner.query(`ALTER TABLE "__chart__network" ADD "span" "__chart__network_span_enum" NOT NULL`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ADD "unique" jsonb NOT NULL DEFAULT '{}'`); + await queryRunner.query(`CREATE TYPE "public"."__chart__instance_span_enum" AS ENUM('hour', 'day')`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ADD "span" "__chart__instance_span_enum" NOT NULL`); + await queryRunner.query(`ALTER TABLE "__chart__hashtag" ADD "___remote_count" bigint NOT NULL`); + await queryRunner.query(`ALTER TABLE "__chart__hashtag" ADD "___local_count" bigint NOT NULL`); + await queryRunner.query(`ALTER TABLE "__chart__hashtag" ADD "unique" jsonb NOT NULL DEFAULT '{}'`); + await queryRunner.query(`CREATE TYPE "public"."__chart__hashtag_span_enum" AS ENUM('hour', 'day')`); + await queryRunner.query(`ALTER TABLE "__chart__hashtag" ADD "span" "__chart__hashtag_span_enum" NOT NULL`); + await queryRunner.query(`ALTER TABLE "__chart__federation" ADD "unique" jsonb NOT NULL DEFAULT '{}'`); + await queryRunner.query(`CREATE TYPE "public"."__chart__federation_span_enum" AS ENUM('hour', 'day')`); + await queryRunner.query(`ALTER TABLE "__chart__federation" ADD "span" "__chart__federation_span_enum" NOT NULL`); + await queryRunner.query(`ALTER TABLE "__chart__drive" ADD "unique" jsonb NOT NULL DEFAULT '{}'`); + await queryRunner.query(`CREATE TYPE "public"."__chart__drive_span_enum" AS ENUM('hour', 'day')`); + await queryRunner.query(`ALTER TABLE "__chart__drive" ADD "span" "__chart__drive_span_enum" NOT NULL`); + await queryRunner.query(`ALTER TABLE "__chart__active_users" ADD "___remote_count" bigint NOT NULL`); + await queryRunner.query(`ALTER TABLE "__chart__active_users" ADD "___local_count" bigint NOT NULL`); + await queryRunner.query(`ALTER TABLE "__chart__active_users" ADD "unique" jsonb NOT NULL DEFAULT '{}'`); + await queryRunner.query(`CREATE TYPE "public"."__chart__active_users_span_enum" AS ENUM('hour', 'day')`); + await queryRunner.query(`ALTER TABLE "__chart__active_users" ADD "span" "__chart__active_users_span_enum" NOT NULL`); + await queryRunner.query(`CREATE INDEX "IDX_a770a57c70e668cc61590c9161" ON "__chart__users" ("date", "group", "span") `); + await queryRunner.query(`CREATE INDEX "IDX_f091abb24193d50c653c6b77fc" ON "__chart__users" ("date", "span") `); + await queryRunner.query(`CREATE INDEX "IDX_7c184198ecf66a8d3ecb253ab3" ON "__chart__users" ("span") `); + await queryRunner.query(`CREATE INDEX "IDX_f170de677ea75ad4533de2723e" ON "__chart__test" ("date", "group", "span") `); + await queryRunner.query(`CREATE INDEX "IDX_c5870993e25c3d5771f91f5003" ON "__chart__test" ("date", "span") `); + await queryRunner.query(`CREATE INDEX "IDX_92255988735563f0fe4aba1f05" ON "__chart__test" ("span") `); + await queryRunner.query(`CREATE INDEX "IDX_66e1e1ecd2f29e57778af35b59" ON "__chart__test_unique" ("date", "group", "span") `); + await queryRunner.query(`CREATE INDEX "IDX_d70c86baedc68326be11f9c0ce" ON "__chart__test_unique" ("date", "span") `); + await queryRunner.query(`CREATE INDEX "IDX_5c73bf61da4f6e6f15bae88ed1" ON "__chart__test_unique" ("span") `); + await queryRunner.query(`CREATE INDEX "IDX_84e661abb7bd1e51b690d4b017" ON "__chart__test_grouped" ("date", "group", "span") `); + await queryRunner.query(`CREATE INDEX "IDX_a5133470f4825902e170328ca5" ON "__chart__test_grouped" ("date", "span") `); + await queryRunner.query(`CREATE INDEX "IDX_2be7ec6cebddc14dc11e206686" ON "__chart__test_grouped" ("span") `); + await queryRunner.query(`CREATE INDEX "IDX_e316f01a6d24eb31db27f88262" ON "__chart__per_user_reaction" ("date", "group", "span") `); + await queryRunner.query(`CREATE INDEX "IDX_edeb73c09c3143a81bcb34d569" ON "__chart__per_user_reaction" ("date", "span") `); + await queryRunner.query(`CREATE INDEX "IDX_65633a106bce43fc7c5c30a5c7" ON "__chart__per_user_reaction" ("span") `); + await queryRunner.query(`CREATE INDEX "IDX_f68a5ab958f9f5fa17a32ac23b" ON "__chart__per_user_notes" ("date", "group", "span") `); + await queryRunner.query(`CREATE INDEX "IDX_046feeb12e9ef5f783f409866a" ON "__chart__per_user_notes" ("date", "span") `); + await queryRunner.query(`CREATE INDEX "IDX_8d2cbbc8114d90d19b44d626b6" ON "__chart__per_user_notes" ("span") `); + await queryRunner.query(`CREATE INDEX "IDX_4db3b84c7be0d3464714f3e0b1" ON "__chart__per_user_following" ("date", "group", "span") `); + await queryRunner.query(`CREATE INDEX "IDX_57b5458d0d3d6d1e7f13d4e57f" ON "__chart__per_user_following" ("date", "span") `); + await queryRunner.query(`CREATE INDEX "IDX_f92dd6d03f8d994f29987f6214" ON "__chart__per_user_following" ("span") `); + await queryRunner.query(`CREATE INDEX "IDX_f2aeafde2ae6fbad38e857631b" ON "__chart__per_user_drive" ("date", "group", "span") `); + await queryRunner.query(`CREATE INDEX "IDX_42ea9381f0fda8dfe0fa1c8b53" ON "__chart__per_user_drive" ("date", "span") `); + await queryRunner.query(`CREATE INDEX "IDX_328f259961e60c4fa0bfcf55ca" ON "__chart__per_user_drive" ("span") `); + await queryRunner.query(`CREATE INDEX "IDX_924fc196c80ca24bae01dd37e4" ON "__chart__notes" ("date", "group", "span") `); + await queryRunner.query(`CREATE INDEX "IDX_0c9a159c5082cbeef3ca6706b5" ON "__chart__notes" ("date", "span") `); + await queryRunner.query(`CREATE INDEX "IDX_e69096589f11e3baa98ddd64d0" ON "__chart__notes" ("span") `); + await queryRunner.query(`CREATE INDEX "IDX_9ff6944f01acb756fdc92d7563" ON "__chart__network" ("date", "group", "span") `); + await queryRunner.query(`CREATE INDEX "IDX_08fac0eb3b11f04c200c0b40dd" ON "__chart__network" ("date", "span") `); + await queryRunner.query(`CREATE INDEX "IDX_f8dd01baeded2ffa833e0a610a" ON "__chart__network" ("span") `); + await queryRunner.query(`CREATE INDEX "IDX_f5448d9633cff74208d850aabe" ON "__chart__instance" ("date", "group", "span") `); + await queryRunner.query(`CREATE INDEX "IDX_d0a4f79af5a97b08f37b547197" ON "__chart__instance" ("date", "span") `); + await queryRunner.query(`CREATE INDEX "IDX_c12f0af4a66cdd30c2287ce8aa" ON "__chart__instance" ("span") `); + await queryRunner.query(`CREATE INDEX "IDX_6d6f156ceefc6bc5f273a0e370" ON "__chart__hashtag" ("date", "group", "span") `); + await queryRunner.query(`CREATE INDEX "IDX_49975586f50ed7b800fdd88fbd" ON "__chart__hashtag" ("date", "span") `); + await queryRunner.query(`CREATE INDEX "IDX_fcc181fb8283009c61cc4083ef" ON "__chart__hashtag" ("span") `); + await queryRunner.query(`CREATE INDEX "IDX_e9cd07672b37d8966cf3709283" ON "__chart__federation" ("date", "group", "span") `); + await queryRunner.query(`CREATE INDEX "IDX_2d416e6af791a82e338c79d480" ON "__chart__federation" ("date", "span") `); + await queryRunner.query(`CREATE INDEX "IDX_e447064455928cf627590ef527" ON "__chart__federation" ("span") `); + await queryRunner.query(`CREATE INDEX "IDX_06690fc959f1c9fdaf21928222" ON "__chart__drive" ("date", "group", "span") `); + await queryRunner.query(`CREATE INDEX "IDX_6e1df243476e20cbf86572ecc0" ON "__chart__drive" ("date", "span") `); + await queryRunner.query(`CREATE INDEX "IDX_3fa0d0f17ca72e3dc80999a032" ON "__chart__drive" ("span") `); + await queryRunner.query(`CREATE INDEX "IDX_c26e2c1cbb6e911e0554b27416" ON "__chart__active_users" ("date", "group", "span") `); + await queryRunner.query(`CREATE INDEX "IDX_20f57cc8f142c131340ee16742" ON "__chart__active_users" ("date", "span") `); + await queryRunner.query(`CREATE INDEX "IDX_15e91a03aeeac9dbccdf43fc06" ON "__chart__active_users" ("span") `); + } + +} diff --git a/migration/1615966519402-chart-v2-2.ts b/migration/1615966519402-chart-v2-2.ts new file mode 100644 index 0000000000..a694f9542a --- /dev/null +++ b/migration/1615966519402-chart-v2-2.ts @@ -0,0 +1,22 @@ +import {MigrationInterface, QueryRunner} from "typeorm"; + +export class chartV221615966519402 implements MigrationInterface { + name = 'chartV221615966519402' + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query(`ALTER TABLE "__chart__active_users" ADD "___local_users" character varying array NOT NULL DEFAULT '{}'::varchar[]`); + await queryRunner.query(`ALTER TABLE "__chart__active_users" ADD "___remote_users" character varying array NOT NULL DEFAULT '{}'::varchar[]`); + await queryRunner.query(`ALTER TABLE "__chart__hashtag" ADD "___local_users" character varying array NOT NULL DEFAULT '{}'::varchar[]`); + await queryRunner.query(`ALTER TABLE "__chart__hashtag" ADD "___remote_users" character varying array NOT NULL DEFAULT '{}'::varchar[]`); + await queryRunner.query(`ALTER TABLE "__chart__test_unique" ADD "___foo" character varying array NOT NULL DEFAULT '{}'::varchar[]`); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query(`ALTER TABLE "__chart__test_unique" DROP COLUMN "___foo"`); + await queryRunner.query(`ALTER TABLE "__chart__hashtag" DROP COLUMN "___remote_users"`); + await queryRunner.query(`ALTER TABLE "__chart__hashtag" DROP COLUMN "___local_users"`); + await queryRunner.query(`ALTER TABLE "__chart__active_users" DROP COLUMN "___remote_users"`); + await queryRunner.query(`ALTER TABLE "__chart__active_users" DROP COLUMN "___local_users"`); + } + +} diff --git a/package.json b/package.json index 2c0525b605..0f40837a6f 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "misskey", "author": "syuilo ", - "version": "12.74.1", + "version": "12.75.0", "codename": "indigo", "repository": { "type": "git", @@ -11,20 +11,20 @@ "private": true, "scripts": { "start": "node ./index.js", - "start-product": "cross-env NODE_ENV=production node ./index.js", "init": "npm run migrate", "ormconfig": "node ./built/ormconfig.js", "migrate": "ts-node ./node_modules/typeorm/cli.js migration:run", "migrateandstart": "npm run migrate && npm run start", - "build": "webpack && gulp build", - "build-product": "cross-env NODE_ENV=production webpack && gulp build", - "webpack": "webpack", - "watch": "webpack --watch", - "gulp": "gulp build", + "build": "npm run build-webpack && npm run build-gulp", + "build-webpack": "webpack", + "build-gulp": "gulp build", + "watch": "concurrently \"npm:watch-*\"", + "watch-webpack": "webpack --watch", + "watch-gulp": "gulp watch", "clean": "gulp clean", "cleanall": "gulp cleanall", "lint": "tslint 'src/**/*.ts'", - "test": "cross-env TS_NODE_FILES=true TS_NODE_TRANSPILE_ONLY=true TS_NODE_COMPILER_OPTIONS=\"{\\\"target\\\":\\\"es2017\\\",\\\"module\\\":\\\"commonjs\\\",\\\"typeRoots\\\":[\\\"node_modules/@types\\\",\\\"src/@types\\\"]}\" mocha", + "test": "cross-env TS_NODE_FILES=true TS_NODE_TRANSPILE_ONLY=true TS_NODE_PROJECT=\"./test/tsconfig.json\" mocha", "format": "gulp format" }, "resolutions": { @@ -35,25 +35,24 @@ "lodash": "^4.17.20" }, "dependencies": { - "@babel/plugin-transform-runtime": "7.13.9", + "@babel/plugin-transform-runtime": "7.13.10", "@elastic/elasticsearch": "7.11.0", - "@fortawesome/fontawesome-svg-core": "1.2.34", - "@fortawesome/free-brands-svg-icons": "5.15.2", - "@fortawesome/free-regular-svg-icons": "5.15.2", - "@fortawesome/free-solid-svg-icons": "5.15.2", + "@fortawesome/fontawesome-svg-core": "1.2.35", + "@fortawesome/free-brands-svg-icons": "5.15.3", + "@fortawesome/free-regular-svg-icons": "5.15.3", + "@fortawesome/free-solid-svg-icons": "5.15.3", "@fortawesome/vue-fontawesome": "3.0.0-3", "@koa/cors": "3.1.0", "@koa/multer": "3.0.0", "@koa/router": "9.0.1", "@sentry/browser": "5.29.2", "@sentry/tracing": "5.29.2", - "@sinonjs/fake-timers": "6.0.1", + "@sinonjs/fake-timers": "7.0.2", "@syuilo/aiscript": "0.11.1", "@types/bcryptjs": "2.4.2", "@types/bull": "3.15.0", "@types/cbor": "5.0.1", "@types/dateformat": "3.0.1", - "@types/double-ended-queue": "2.1.1", "@types/escape-regexp": "0.0.0", "@types/glob": "7.1.3", "@types/gulp": "4.0.8", @@ -61,10 +60,10 @@ "@types/gulp-replace": "0.0.31", "@types/is-url": "1.2.28", "@types/js-yaml": "4.0.0", - "@types/jsdom": "16.2.6", - "@types/jsonld": "1.5.4", + "@types/jsdom": "16.2.7", + "@types/jsonld": "1.5.5", "@types/katex": "0.11.0", - "@types/koa": "2.13.0", + "@types/koa": "2.13.1", "@types/koa-bodyparser": "4.3.0", "@types/koa-cors": "0.0.0", "@types/koa-favicon": "2.0.19", @@ -78,9 +77,9 @@ "@types/markdown-it": "12.0.1", "@types/matter-js": "0.14.10", "@types/mocha": "8.2.1", - "@types/node": "14.14.31", + "@types/node": "14.14.35", "@types/node-fetch": "2.5.8", - "@types/nodemailer": "6.4.0", + "@types/nodemailer": "6.4.1", "@types/nprogress": "0.2.0", "@types/oauth": "0.9.1", "@types/parse5": "6.0.0", @@ -105,44 +104,44 @@ "@types/web-push": "3.3.0", "@types/webpack": "4.41.26", "@types/webpack-stream": "3.2.11", - "@types/websocket": "1.0.1", + "@types/websocket": "1.0.2", "@types/ws": "7.4.0", - "@typescript-eslint/parser": "4.16.1", - "@vue/compiler-sfc": "3.0.5", + "@typescript-eslint/parser": "4.18.0", + "@vue/compiler-sfc": "3.0.7", "abort-controller": "3.0.0", - "apexcharts": "3.25.0", + "apexcharts": "3.26.0", "autobind-decorator": "2.4.0", "autosize": "4.0.2", "autwh": "0.1.0", - "aws-sdk": "2.848.0", + "aws-sdk": "2.867.0", "bcryptjs": "2.4.3", "blurhash": "1.1.3", - "broadcast-channel": "3.4.1", - "bull": "3.20.1", + "broadcast-channel": "3.5.3", + "bull": "3.21.1", "cafy": "15.2.1", - "cbor": "7.0.3", + "cbor": "7.0.4", "chalk": "4.1.0", "chart.js": "2.9.4", "cli-highlight": "2.1.10", "commander": "4.1.1", + "concurrently": "6.0.0", "content-disposition": "0.5.3", - "core-js": "3.9.0", + "core-js": "3.9.1", "crc-32": "1.2.0", - "css-loader": "5.0.2", + "css-loader": "5.1.3", "cssnano": "4.1.10", "dateformat": "4.5.1", "diskusage": "1.1.3", - "double-ended-queue": "2.1.0-0", "escape-regexp": "0.0.1", - "eslint": "7.21.0", - "eslint-plugin-vue": "7.6.0", + "eslint": "7.22.0", + "eslint-plugin-vue": "7.7.0", "eventemitter3": "4.0.7", "feed": "4.2.2", "fibers": "5.0.0", - "file-type": "16.2.0", + "file-type": "16.3.0", "fluent-ffmpeg": "2.1.2", "glob": "7.1.6", - "got": "11.8.1", + "got": "11.8.2", "gulp": "4.0.2", "gulp-cssnano": "2.1.3", "gulp-rename": "2.0.0", @@ -155,17 +154,17 @@ "http-proxy-agent": "4.0.1", "http-signature": "1.3.5", "https-proxy-agent": "5.0.0", - "idb-keyval": "5.0.2", + "idb-keyval": "5.0.4", "insert-text-at-cursor": "0.3.0", "is-root": "2.1.0", - "is-svg": "4.2.1", + "is-svg": "4.3.1", "js-yaml": "4.0.0", - "jsdom": "16.4.0", + "jsdom": "16.5.1", "json5": "2.2.0", "json5-loader": "4.0.1", "jsonld": "4.0.1", "jsrsasign": "8.0.20", - "katex": "0.12.0", + "katex": "0.13.0", "koa": "2.13.1", "koa-bodyparser": "4.3.0", "koa-favicon": "2.1.0", @@ -174,13 +173,13 @@ "koa-mount": "4.0.0", "koa-send": "5.0.1", "koa-slow": "2.1.0", - "koa-views": "6.3.1", + "koa-views": "7.0.1", "langmap": "0.0.16", "lookup-dns-cache": "2.1.0", "markdown-it": "12.0.4", - "markdown-it-anchor": "7.0.2", + "markdown-it-anchor": "7.1.0", "matter-js": "0.16.1", - "mocha": "8.3.0", + "mocha": "8.3.2", "moji": "0.5.1", "ms": "2.1.3", "multer": "1.4.2", @@ -189,20 +188,19 @@ "nodemailer": "6.5.0", "object-assign-deep": "0.4.0", "os-utils": "0.0.14", - "p-cancelable": "2.0.0", "parse5": "6.0.1", "parsimmon": "1.16.0", "pg": "8.5.1", "portscanner": "2.2.0", - "postcss": "8.2.7", - "postcss-loader": "5.0.0", + "postcss": "8.2.8", + "postcss-loader": "5.2.0", "prismjs": "1.23.0", - "probe-image-size": "6.0.0", + "probe-image-size": "7.0.1", "promise-limit": "2.7.0", "promise-sequential": "1.1.1", - "pug": "2.0.4", + "pug": "3.0.2", "punycode": "2.1.1", - "pureimage": "0.2.5", + "pureimage": "0.2.7", "qrcode": "1.4.4", "random-seed": "0.3.0", "ratelimiter": "3.4.1", @@ -221,49 +219,49 @@ "sass": "1.32.8", "sass-loader": "11.0.1", "seedrandom": "3.0.5", - "sharp": "0.27.1", + "sharp": "0.27.2", "speakeasy": "2.0.0", "stringz": "2.1.0", "style-loader": "2.0.0", "summaly": "2.4.0", "syslog-pro": "1.0.0", - "systeminformation": "5.6.1", + "systeminformation": "5.6.7", "syuilo-password-strength": "0.0.1", "textarea-caret": "3.1.0", "three": "0.117.1", "throttle-debounce": "3.0.1", "tinycolor2": "1.4.2", "tmp": "0.2.1", - "ts-loader": "8.0.17", + "ts-loader": "8.0.18", "ts-node": "9.1.1", "tslint": "6.1.3", "tslint-sonarts": "1.9.0", "typeorm": "0.2.31", - "typescript": "4.1.5", + "typescript": "4.2.3", "ulid": "2.3.0", "url-loader": "4.1.1", "uuid": "8.3.2", "v-debounce": "0.1.2", "vanilla-tilt": "1.7.0", - "vue": "3.0.5", + "vue": "3.0.7", "vue-color": "2.8.1", "vue-json-pretty": "1.7.1", "vue-loader": "16.1.2", "vue-prism-editor": "2.0.0-alpha.2", - "vue-router": "4.0.4", + "vue-router": "4.0.5", "vue-style-loader": "4.1.3", "vuedraggable": "4.0.1", "web-push": "3.4.4", - "webpack": "5.24.2", + "webpack": "5.26.3", "webpack-cli": "4.5.0", "websocket": "1.0.33", - "ws": "7.4.3", + "ws": "7.4.4", "xev": "2.0.1" }, "devDependencies": { "@types/chai": "4.2.15", "@types/fluent-ffmpeg": "2.1.16", - "chai": "4.3.0", + "chai": "4.3.4", "cross-env": "7.0.3" } } diff --git a/src/.eslintrc b/src/.eslintrc new file mode 100644 index 0000000000..d54e20f6b6 --- /dev/null +++ b/src/.eslintrc @@ -0,0 +1,6 @@ +{ + "env": { + "node": true, + "commonjs": true + } +} diff --git a/src/client/.eslintrc b/src/client/.eslintrc index 8829472b49..fffa28d9e4 100644 --- a/src/client/.eslintrc +++ b/src/client/.eslintrc @@ -1,4 +1,24 @@ { + "env": { + "node": false, + }, + "extends": [ + "eslint:recommended", + "plugin:vue/recommended" + ], + "rules": { + "vue/require-v-for-key": 0, + "vue/max-attributes-per-line": 0, + "vue/html-indent": 0, + "vue/html-self-closing": 0, + "vue/no-unused-vars": 0, + "vue/attributes-order": 0, + "vue/require-prop-types": 0, + "vue/require-default-prop": 0, + "vue/html-closing-bracket-spacing": 0, + "vue/singleline-html-element-content-newline": 0, + "vue/no-v-html": 0 + }, "globals": { "_DEV_": false, "_LANGS_": false, diff --git a/src/client/components/note-detailed.vue b/src/client/components/note-detailed.vue index 1ef3f43389..ea26d31100 100644 --- a/src/client/components/note-detailed.vue +++ b/src/client/components/note-detailed.vue @@ -350,7 +350,8 @@ export default defineComponent({ capture(withHandler = false) { if (this.$i) { - this.connection.send(document.body.contains(this.$el) ? 'sn' : 's', { id: this.appearNote.id }); + // TODO: このノートがストリーミング経由で流れてきた場合のみ sr する + this.connection.send(document.body.contains(this.$el) ? 'sr' : 's', { id: this.appearNote.id }); if (withHandler) this.connection.on('noteUpdated', this.onStreamNoteUpdated); } }, diff --git a/src/client/components/note.vue b/src/client/components/note.vue index 65e09b7802..70f49fef7e 100644 --- a/src/client/components/note.vue +++ b/src/client/components/note.vue @@ -325,7 +325,8 @@ export default defineComponent({ capture(withHandler = false) { if (this.$i) { - this.connection.send(document.body.contains(this.$el) ? 'sn' : 's', { id: this.appearNote.id }); + // TODO: このノートがストリーミング経由で流れてきた場合のみ sr する + this.connection.send(document.body.contains(this.$el) ? 'sr' : 's', { id: this.appearNote.id }); if (withHandler) this.connection.on('noteUpdated', this.onStreamNoteUpdated); } }, diff --git a/src/client/components/ui/modal.vue b/src/client/components/ui/modal.vue index ff5b98d39f..db6564bacc 100644 --- a/src/client/components/ui/modal.vue +++ b/src/client/components/ui/modal.vue @@ -1,7 +1,7 @@