Merge branch 'develop' into refine-moderation-log
This commit is contained in:
commit
bcacebc89f
15 changed files with 717 additions and 454 deletions
|
@ -1060,6 +1060,8 @@ cancelReactionConfirm: "Möchtest du deine Reaktion wirklich löschen?"
|
||||||
changeReactionConfirm: "Möchtest du deine Reaktion wirklich ändern?"
|
changeReactionConfirm: "Möchtest du deine Reaktion wirklich ändern?"
|
||||||
later: "Später"
|
later: "Später"
|
||||||
goToMisskey: "Zu Misskey"
|
goToMisskey: "Zu Misskey"
|
||||||
|
additionalEmojiDictionary: "Zusätzliche Emoji-Wörterbücher"
|
||||||
|
installed: "Installiert"
|
||||||
_initialAccountSetting:
|
_initialAccountSetting:
|
||||||
accountCreated: "Dein Konto wurde erfolgreich erstellt!"
|
accountCreated: "Dein Konto wurde erfolgreich erstellt!"
|
||||||
letsStartAccountSetup: "Lass uns nun dein Konto einrichten."
|
letsStartAccountSetup: "Lass uns nun dein Konto einrichten."
|
||||||
|
|
|
@ -1060,6 +1060,8 @@ cancelReactionConfirm: "Really delete your reaction?"
|
||||||
changeReactionConfirm: "Really change your reaction?"
|
changeReactionConfirm: "Really change your reaction?"
|
||||||
later: "Later"
|
later: "Later"
|
||||||
goToMisskey: "To Misskey"
|
goToMisskey: "To Misskey"
|
||||||
|
additionalEmojiDictionary: "Additional emoji dictionaries"
|
||||||
|
installed: "Installed"
|
||||||
_initialAccountSetting:
|
_initialAccountSetting:
|
||||||
accountCreated: "Your account was successfully created!"
|
accountCreated: "Your account was successfully created!"
|
||||||
letsStartAccountSetup: "For starters, let's set up your profile."
|
letsStartAccountSetup: "For starters, let's set up your profile."
|
||||||
|
|
|
@ -1060,6 +1060,8 @@ cancelReactionConfirm: "리액션을 취소하시겠습니까?"
|
||||||
changeReactionConfirm: "리액션을 변경하시겠습니까?"
|
changeReactionConfirm: "리액션을 변경하시겠습니까?"
|
||||||
later: "나중에"
|
later: "나중에"
|
||||||
goToMisskey: "Misskey로"
|
goToMisskey: "Misskey로"
|
||||||
|
additionalEmojiDictionary: "이모지 추가 사전"
|
||||||
|
installed: "설치됨"
|
||||||
_initialAccountSetting:
|
_initialAccountSetting:
|
||||||
accountCreated: "계정 생성이 완료되었습니다!"
|
accountCreated: "계정 생성이 완료되었습니다!"
|
||||||
letsStartAccountSetup: "계정의 초기 설정을 진행합니다."
|
letsStartAccountSetup: "계정의 초기 설정을 진행합니다."
|
||||||
|
@ -1085,7 +1087,7 @@ _accountMigration:
|
||||||
moveTo: "이 계정에서 다른 계정으로 이사"
|
moveTo: "이 계정에서 다른 계정으로 이사"
|
||||||
moveToLabel: "이사할 계정:"
|
moveToLabel: "이사할 계정:"
|
||||||
moveCannotBeUndone: "한 번 이사하면, 두 번 다시 되돌릴 수 없습니다."
|
moveCannotBeUndone: "한 번 이사하면, 두 번 다시 되돌릴 수 없습니다."
|
||||||
moveAccountDescription: "새 계정으로 이전합니다.\n ・팔로워가 새 계정을 자동으로 팔로우 합니다\n ・이 계정에서 팔로우는 모두 해제됩니다\n ・이 계정으로는 노트 작성 등을 할 수 없게 됩니다\n\n팔로워의 이전은 자동이지만, 팔로우는 수동으로 진행해야 합니다. 이전하기 전에 이 계정에서 팔로우를 내보내고, 이전 후에는 즉시 이전한 계정에서 가져오기를 진행하십시오.\n리스트・뮤트・차단에 대해서도 마찬가지이므로 수동으로 이전해야 합니다.\n\n(이 설명은 이 서버(Misskey v13.12.0 이후)의 사양입니다. Mastodon 등의 다른 ActivityPub 소프트웨어에서는 작동이 다를 수 있습니다.)"
|
moveAccountDescription: "새 계정으로 이전합니다.\n ・팔로워가 새 계정을 자동으로 팔로우 합니다\n ・이 계정에서 팔로우는 모두 해제됩니다\n ・이 계정으로는 노트 작성 등을 할 수 없게 됩니다\n\n팔로워는 자동으로 이전되지만, 팔로우는 수동으로 진행해야 합니다. 이전하기 전에 이 계정에서 팔로우를 내보내고, 이전 후에는 즉시 이전한 계정에서 가져오기를 진행하십시오.\n리스트・뮤트・차단에 대해서도 마찬가지이므로 수동으로 이전해야 합니다.\n\n(이 설명은 이 서버(Misskey v13.12.0 이후)의 사양입니다. Mastodon 등의 다른 ActivityPub 소프트웨어에서는 작동이 다를 수 있습니다.)"
|
||||||
moveAccountHowTo: "계정을 이사하려면 우선 이사갈 계정에서 이 계정에 대한 별칭을 지정해야 합니다.\n별칭을 작성한 다음, 이사갈 계정을 다음과 같이 입력하십시오:\n@username@server.example.com"
|
moveAccountHowTo: "계정을 이사하려면 우선 이사갈 계정에서 이 계정에 대한 별칭을 지정해야 합니다.\n별칭을 작성한 다음, 이사갈 계정을 다음과 같이 입력하십시오:\n@username@server.example.com"
|
||||||
startMigration: "이사하기"
|
startMigration: "이사하기"
|
||||||
migrationConfirm: "정말로 이 계정을 {account} 으로 이전하시겠습니까? 한 번 이전한 다음에는 취소할 수 없으며, 두 번 다시 원래 상태로 복구할 수 없습니다.\n이사할 계정에서 계정 별칭을 지정하였는지 다시 한 번 확인하십시오."
|
migrationConfirm: "정말로 이 계정을 {account} 으로 이전하시겠습니까? 한 번 이전한 다음에는 취소할 수 없으며, 두 번 다시 원래 상태로 복구할 수 없습니다.\n이사할 계정에서 계정 별칭을 지정하였는지 다시 한 번 확인하십시오."
|
||||||
|
|
|
@ -25,7 +25,7 @@ otherSettings: "Andre innstillinger"
|
||||||
openInWindow: "Åpne i vindu"
|
openInWindow: "Åpne i vindu"
|
||||||
profile: "Profil"
|
profile: "Profil"
|
||||||
timeline: "Tidslinje"
|
timeline: "Tidslinje"
|
||||||
noAccountDescription: "Denne brukeren har ikke skrevet sin bio ennå."
|
noAccountDescription: "Denne brukeren har ikke skrevet sin biografi ennå."
|
||||||
login: "Logg inn"
|
login: "Logg inn"
|
||||||
loggingIn: "Logget inn"
|
loggingIn: "Logget inn"
|
||||||
logout: "Logg ut"
|
logout: "Logg ut"
|
||||||
|
@ -81,6 +81,7 @@ pageLoadError: "Kunne ikke hente side."
|
||||||
serverIsDead: "Denne serveren svarer ikke. Vennligst vent en stund og prøv igjen."
|
serverIsDead: "Denne serveren svarer ikke. Vennligst vent en stund og prøv igjen."
|
||||||
enterListName: "Skriv inn et navn på listen"
|
enterListName: "Skriv inn et navn på listen"
|
||||||
privacy: "Personvern"
|
privacy: "Personvern"
|
||||||
|
defaultNoteVisibility: "Standard synlighet"
|
||||||
follow: "Følg"
|
follow: "Følg"
|
||||||
followRequest: "Følgeforespørsel"
|
followRequest: "Følgeforespørsel"
|
||||||
followRequests: "Følgeforespørsel"
|
followRequests: "Følgeforespørsel"
|
||||||
|
@ -92,6 +93,8 @@ renoted: "Renotet."
|
||||||
cantRenote: "Dette innlegget kan ikke renotes."
|
cantRenote: "Dette innlegget kan ikke renotes."
|
||||||
cantReRenote: "En Renote kan ikke renotes."
|
cantReRenote: "En Renote kan ikke renotes."
|
||||||
quote: "Sitat"
|
quote: "Sitat"
|
||||||
|
inChannelRenote: "Renote kun for kanal"
|
||||||
|
inChannelQuote: "Sitat kun for kanal"
|
||||||
pinnedNote: "Festet Note"
|
pinnedNote: "Festet Note"
|
||||||
pinned: "Fest til profil"
|
pinned: "Fest til profil"
|
||||||
you: "Du"
|
you: "Du"
|
||||||
|
@ -145,14 +148,18 @@ instances: "Servere"
|
||||||
registeredAt: "Registrerte seg"
|
registeredAt: "Registrerte seg"
|
||||||
latestRequestReceivedAt: "Siste forespørsel mottatt"
|
latestRequestReceivedAt: "Siste forespørsel mottatt"
|
||||||
latestStatus: "Siste status"
|
latestStatus: "Siste status"
|
||||||
|
charts: "Diagrammer"
|
||||||
perHour: "Per time"
|
perHour: "Per time"
|
||||||
perDay: "Per dag"
|
perDay: "Per dag"
|
||||||
stopActivityDelivery: "Slutt å sende aktiviteter"
|
stopActivityDelivery: "Slutt å sende aktiviteter"
|
||||||
blockThisInstance: "Blokker denne serveren"
|
blockThisInstance: "Blokker denne serveren"
|
||||||
|
operations: "Operasjoner"
|
||||||
software: "Programvare"
|
software: "Programvare"
|
||||||
version: "Versjon"
|
version: "Versjon"
|
||||||
|
metadata: "Metadata"
|
||||||
withNFiles: "{n} fil(er)"
|
withNFiles: "{n} fil(er)"
|
||||||
network: "Nettverk"
|
network: "Nettverk"
|
||||||
|
instanceInfo: "Serverinformasjon"
|
||||||
statistics: "Statistikk"
|
statistics: "Statistikk"
|
||||||
clearQueue: "Tøm kø"
|
clearQueue: "Tøm kø"
|
||||||
clearQueueConfirmTitle: "Er du sikker på at du vil tømme køen?"
|
clearQueueConfirmTitle: "Er du sikker på at du vil tømme køen?"
|
||||||
|
@ -167,6 +174,8 @@ noteDeleteConfirm: "Er du sikker på at du vil slette denne Noten?"
|
||||||
pinLimitExceeded: "Du kan ikke feste flere."
|
pinLimitExceeded: "Du kan ikke feste flere."
|
||||||
intro: "Installasjonen av Misskey er ferdig! Vennligst opprett en administratorkonto."
|
intro: "Installasjonen av Misskey er ferdig! Vennligst opprett en administratorkonto."
|
||||||
done: "Ferdig"
|
done: "Ferdig"
|
||||||
|
default: "Standard"
|
||||||
|
defaultValueIs: "Standard: {value}"
|
||||||
noCustomEmojis: "Det er ingen emoji"
|
noCustomEmojis: "Det er ingen emoji"
|
||||||
noJobs: "Det er ingen jobber"
|
noJobs: "Det er ingen jobber"
|
||||||
blocked: "Blokkert"
|
blocked: "Blokkert"
|
||||||
|
@ -175,10 +184,13 @@ all: "Alle"
|
||||||
notResponding: "Svarer ikke"
|
notResponding: "Svarer ikke"
|
||||||
changePassword: "Endre passord"
|
changePassword: "Endre passord"
|
||||||
security: "Sikkerhet"
|
security: "Sikkerhet"
|
||||||
|
retypedNotMatch: "Inngangene stemmer ikke overens."
|
||||||
|
currentPassword: "Nåværende passord"
|
||||||
newPassword: "Nytt passord"
|
newPassword: "Nytt passord"
|
||||||
newPasswordRetype: "Nytt passord (gjenta)"
|
newPasswordRetype: "Nytt passord (gjenta)"
|
||||||
attachFile: "Legg ved filer"
|
attachFile: "Legg ved filer"
|
||||||
more: "Mer!"
|
more: "Mer!"
|
||||||
|
noSuchUser: "Bruker ikke funnet"
|
||||||
announcements: "Kunngjøringer"
|
announcements: "Kunngjøringer"
|
||||||
remove: "Slett"
|
remove: "Slett"
|
||||||
removed: "Vellykket slettet"
|
removed: "Vellykket slettet"
|
||||||
|
@ -188,9 +200,15 @@ saved: "Lagret"
|
||||||
upload: "Laste opp"
|
upload: "Laste opp"
|
||||||
keepOriginalUploading: "Behold originalbildet"
|
keepOriginalUploading: "Behold originalbildet"
|
||||||
fromUrl: "Fra URL"
|
fromUrl: "Fra URL"
|
||||||
|
uploadFromUrl: "Last opp fra en URL"
|
||||||
|
uploadFromUrlDescription: "URL til filen du vil laste opp"
|
||||||
explore: "Utforsk"
|
explore: "Utforsk"
|
||||||
messageRead: "Lest"
|
messageRead: "Lest"
|
||||||
agree: "Jeg godtar"
|
nUsersRead: "lest av {n}"
|
||||||
|
agreeTo: "Jeg godtar {0}"
|
||||||
|
agree: "Godta"
|
||||||
|
agreeBelow: "Jeg godtar følgende"
|
||||||
|
basicNotesBeforeCreateAccount: "Viktige merknader"
|
||||||
termsOfService: "Vilkår for bruk"
|
termsOfService: "Vilkår for bruk"
|
||||||
home: "Hjem"
|
home: "Hjem"
|
||||||
activity: "Aktivitet"
|
activity: "Aktivitet"
|
||||||
|
@ -198,8 +216,12 @@ images: "Bilder"
|
||||||
image: "Bilde"
|
image: "Bilde"
|
||||||
birthday: "Bursdag"
|
birthday: "Bursdag"
|
||||||
yearsOld: "{age} år gammel"
|
yearsOld: "{age} år gammel"
|
||||||
|
theme: "Temaer"
|
||||||
light: "Lys"
|
light: "Lys"
|
||||||
dark: "Mørk"
|
dark: "Mørk"
|
||||||
|
lightThemes: "Lyse temaer"
|
||||||
|
darkThemes: "Mørke temaer"
|
||||||
|
syncDeviceDarkMode: "Synkroniser mørkmodus med enhetens innstillinger"
|
||||||
fileName: "Filnavn"
|
fileName: "Filnavn"
|
||||||
selectFile: "Velg en fil"
|
selectFile: "Velg en fil"
|
||||||
selectFiles: "Velg filer"
|
selectFiles: "Velg filer"
|
||||||
|
@ -213,6 +235,9 @@ deleteFolder: "Slett denne mappen"
|
||||||
addFile: "Legg til en fil"
|
addFile: "Legg til en fil"
|
||||||
emptyFolder: "Denne mappen er tom"
|
emptyFolder: "Denne mappen er tom"
|
||||||
unableToDelete: "Kan ikke slette"
|
unableToDelete: "Kan ikke slette"
|
||||||
|
inputNewFileName: "Skriv inn et nytt filnavn"
|
||||||
|
inputNewDescription: "Skriv inn ny bildetekst"
|
||||||
|
inputNewFolderName: "Skriv inn et nytt mappenavn"
|
||||||
circularReferenceFolder: "Målmappen er en undermappe til mappen du ønsker å flytte."
|
circularReferenceFolder: "Målmappen er en undermappe til mappen du ønsker å flytte."
|
||||||
hasChildFilesOrFolders: "Siden denne mappen ikke er tom, kan den ikke slettes."
|
hasChildFilesOrFolders: "Siden denne mappen ikke er tom, kan den ikke slettes."
|
||||||
copyUrl: "Kopier URL"
|
copyUrl: "Kopier URL"
|
||||||
|
@ -251,13 +276,23 @@ turnstile: "Turnstile"
|
||||||
enableTurnstile: "Aktiver Turnstile"
|
enableTurnstile: "Aktiver Turnstile"
|
||||||
antennas: "Antenner"
|
antennas: "Antenner"
|
||||||
name: "Navn"
|
name: "Navn"
|
||||||
|
antennaSource: "Antennekilde"
|
||||||
|
notifyAntenna: "Varsle om nye Notes"
|
||||||
|
withFileAntenna: "Bare Notes med filer"
|
||||||
|
notesAndReplies: "Notes og svar"
|
||||||
popularUsers: "Populære brukere"
|
popularUsers: "Populære brukere"
|
||||||
exploreUsersCount: "Det finnes {count} brukere"
|
exploreUsersCount: "Det finnes {count} brukere"
|
||||||
|
exploreFediverse: "Utforsk Fediverse"
|
||||||
userList: "Lister"
|
userList: "Lister"
|
||||||
about: "Infomasjon"
|
about: "Informasjon"
|
||||||
aboutMisskey: "Om Misskey"
|
aboutMisskey: "Om Misskey"
|
||||||
|
newPasswordIs: "Det nye passordet er \"{password}\"."
|
||||||
share: "Del"
|
share: "Del"
|
||||||
|
notFound: "Ikke funnet"
|
||||||
|
markAsReadAllNotifications: "Merk alle varsler som lest"
|
||||||
|
markAsReadAllUnreadNotes: "Merk alle Notes som lest"
|
||||||
help: "Hjelp"
|
help: "Hjelp"
|
||||||
|
inputMessageHere: "Skriv inn melding her"
|
||||||
close: "Lukk"
|
close: "Lukk"
|
||||||
invites: "Inviter"
|
invites: "Inviter"
|
||||||
members: "Medlemmer"
|
members: "Medlemmer"
|
||||||
|
@ -265,6 +300,10 @@ title: "Tittel"
|
||||||
text: "Tekst"
|
text: "Tekst"
|
||||||
next: "Neste"
|
next: "Neste"
|
||||||
retype: "Gjenta"
|
retype: "Gjenta"
|
||||||
|
quoteAttached: "Sitat"
|
||||||
|
noMessagesYet: "Ingen meldinger ennå"
|
||||||
|
newMessageExists: "Det er nye meldinger"
|
||||||
|
onlyOneFileCanBeAttached: "Du kan bare legge ved én fil i en melding"
|
||||||
invitations: "Inviter"
|
invitations: "Inviter"
|
||||||
available: "Tilgjengelig"
|
available: "Tilgjengelig"
|
||||||
unavailable: "Utilgjengelig"
|
unavailable: "Utilgjengelig"
|
||||||
|
@ -564,6 +603,7 @@ _time:
|
||||||
day: "Dager"
|
day: "Dager"
|
||||||
_timelineTutorial:
|
_timelineTutorial:
|
||||||
title: "Hvordan bruke Misskey"
|
title: "Hvordan bruke Misskey"
|
||||||
|
step2_2: "Hva med å skrive en selvpresentasjon, eller bare \"Hei {name}!\" hvis du ikke har lyst?"
|
||||||
_2fa:
|
_2fa:
|
||||||
renewTOTPCancel: "Avbryt"
|
renewTOTPCancel: "Avbryt"
|
||||||
_weekday:
|
_weekday:
|
||||||
|
@ -576,6 +616,7 @@ _weekday:
|
||||||
saturday: "Lørdag"
|
saturday: "Lørdag"
|
||||||
_widgets:
|
_widgets:
|
||||||
profile: "Profil"
|
profile: "Profil"
|
||||||
|
instanceInfo: "Serverinformasjon"
|
||||||
notifications: "Varsler"
|
notifications: "Varsler"
|
||||||
timeline: "Tidslinje"
|
timeline: "Tidslinje"
|
||||||
calendar: "Kalender"
|
calendar: "Kalender"
|
||||||
|
@ -611,6 +652,7 @@ _postForm:
|
||||||
_profile:
|
_profile:
|
||||||
name: "Navn"
|
name: "Navn"
|
||||||
username: "Brukernavn"
|
username: "Brukernavn"
|
||||||
|
description: "Biografi"
|
||||||
metadataContent: "Innhold"
|
metadataContent: "Innhold"
|
||||||
_exportOrImport:
|
_exportOrImport:
|
||||||
followingList: "Følg"
|
followingList: "Følg"
|
||||||
|
@ -652,12 +694,14 @@ _pages:
|
||||||
button: "Knapp"
|
button: "Knapp"
|
||||||
_notification:
|
_notification:
|
||||||
youWereFollowed: "fulgte deg"
|
youWereFollowed: "fulgte deg"
|
||||||
|
unreadAntennaNote: "Antenne {name}"
|
||||||
|
achievementEarned: "Prestasjon låst opp"
|
||||||
_types:
|
_types:
|
||||||
follow: "Følg"
|
follow: "Nye følgere"
|
||||||
reply: "Svar"
|
reply: "Svar"
|
||||||
renote: "Renote"
|
renote: "Renotes"
|
||||||
quote: "Sitat"
|
quote: "Sitater"
|
||||||
reaction: "Reaksjon"
|
reaction: "Reaksjoner"
|
||||||
_actions:
|
_actions:
|
||||||
reply: "Svar"
|
reply: "Svar"
|
||||||
renote: "Renote"
|
renote: "Renote"
|
||||||
|
|
|
@ -1060,6 +1060,7 @@ cancelReactionConfirm: "要取消回应吗?"
|
||||||
changeReactionConfirm: "要更改回应吗?"
|
changeReactionConfirm: "要更改回应吗?"
|
||||||
later: "一会再说"
|
later: "一会再说"
|
||||||
goToMisskey: "去往Misskey"
|
goToMisskey: "去往Misskey"
|
||||||
|
installed: "已安装"
|
||||||
_initialAccountSetting:
|
_initialAccountSetting:
|
||||||
accountCreated: "账户创建完成了!"
|
accountCreated: "账户创建完成了!"
|
||||||
letsStartAccountSetup: "来进行帐户的初始设置吧。"
|
letsStartAccountSetup: "来进行帐户的初始设置吧。"
|
||||||
|
|
|
@ -51,16 +51,16 @@
|
||||||
"gulp-replace": "1.1.4",
|
"gulp-replace": "1.1.4",
|
||||||
"gulp-terser": "2.1.0",
|
"gulp-terser": "2.1.0",
|
||||||
"js-yaml": "4.1.0",
|
"js-yaml": "4.1.0",
|
||||||
"typescript": "5.0.4"
|
"typescript": "5.1.3"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@types/gulp": "4.0.10",
|
"@types/gulp": "4.0.10",
|
||||||
"@types/gulp-rename": "2.0.1",
|
"@types/gulp-rename": "2.0.1",
|
||||||
"@typescript-eslint/eslint-plugin": "5.59.5",
|
"@typescript-eslint/eslint-plugin": "5.59.8",
|
||||||
"@typescript-eslint/parser": "5.59.5",
|
"@typescript-eslint/parser": "5.59.8",
|
||||||
"cross-env": "7.0.3",
|
"cross-env": "7.0.3",
|
||||||
"cypress": "12.13.0",
|
"cypress": "12.13.0",
|
||||||
"eslint": "8.40.0",
|
"eslint": "8.41.0",
|
||||||
"start-server-and-test": "2.0.0"
|
"start-server-and-test": "2.0.0"
|
||||||
},
|
},
|
||||||
"optionalDependencies": {
|
"optionalDependencies": {
|
||||||
|
|
|
@ -60,27 +60,27 @@
|
||||||
"@discordapp/twemoji": "14.1.2",
|
"@discordapp/twemoji": "14.1.2",
|
||||||
"@fastify/accepts": "4.1.0",
|
"@fastify/accepts": "4.1.0",
|
||||||
"@fastify/cookie": "8.3.0",
|
"@fastify/cookie": "8.3.0",
|
||||||
"@fastify/cors": "8.2.1",
|
"@fastify/cors": "8.3.0",
|
||||||
"@fastify/http-proxy": "9.1.0",
|
"@fastify/http-proxy": "9.1.0",
|
||||||
"@fastify/multipart": "7.6.0",
|
"@fastify/multipart": "7.6.0",
|
||||||
"@fastify/static": "6.10.1",
|
"@fastify/static": "6.10.2",
|
||||||
"@fastify/view": "7.4.1",
|
"@fastify/view": "7.4.1",
|
||||||
"@nestjs/common": "9.4.2",
|
"@nestjs/common": "9.4.2",
|
||||||
"@nestjs/core": "9.4.2",
|
"@nestjs/core": "9.4.2",
|
||||||
"@nestjs/testing": "9.4.2",
|
"@nestjs/testing": "9.4.2",
|
||||||
"@peertube/http-signature": "1.7.0",
|
"@peertube/http-signature": "1.7.0",
|
||||||
"@sinonjs/fake-timers": "10.0.2",
|
"@sinonjs/fake-timers": "10.2.0",
|
||||||
"@swc/cli": "0.1.62",
|
"@swc/cli": "0.1.62",
|
||||||
"@swc/core": "1.3.59",
|
"@swc/core": "1.3.61",
|
||||||
"accepts": "1.3.8",
|
"accepts": "1.3.8",
|
||||||
"ajv": "8.12.0",
|
"ajv": "8.12.0",
|
||||||
"archiver": "5.3.1",
|
"archiver": "5.3.1",
|
||||||
"autwh": "0.1.0",
|
"autwh": "0.1.0",
|
||||||
"bcryptjs": "2.4.3",
|
"bcryptjs": "2.4.3",
|
||||||
"blurhash": "2.0.5",
|
"blurhash": "2.0.5",
|
||||||
"bullmq": "3.14.1",
|
"bullmq": "3.15.0",
|
||||||
"cacheable-lookup": "6.1.0",
|
"cacheable-lookup": "6.1.0",
|
||||||
"cbor": "8.1.0",
|
"cbor": "9.0.0",
|
||||||
"chalk": "5.2.0",
|
"chalk": "5.2.0",
|
||||||
"chalk-template": "0.4.0",
|
"chalk-template": "0.4.0",
|
||||||
"chokidar": "3.5.3",
|
"chokidar": "3.5.3",
|
||||||
|
@ -96,24 +96,24 @@
|
||||||
"fluent-ffmpeg": "2.1.2",
|
"fluent-ffmpeg": "2.1.2",
|
||||||
"form-data": "4.0.0",
|
"form-data": "4.0.0",
|
||||||
"got": "12.6.0",
|
"got": "12.6.0",
|
||||||
"happy-dom": "9.19.2",
|
"happy-dom": "9.20.3",
|
||||||
"hpagent": "1.2.0",
|
"hpagent": "1.2.0",
|
||||||
"ioredis": "5.3.2",
|
"ioredis": "5.3.2",
|
||||||
"ip-cidr": "3.1.0",
|
"ip-cidr": "3.1.0",
|
||||||
"is-svg": "4.3.2",
|
"is-svg": "4.3.2",
|
||||||
"js-yaml": "4.1.0",
|
"js-yaml": "4.1.0",
|
||||||
"jsdom": "21.1.1",
|
"jsdom": "22.1.0",
|
||||||
"json5": "2.2.3",
|
"json5": "2.2.3",
|
||||||
"jsonld": "8.1.1",
|
"jsonld": "8.2.0",
|
||||||
"jsrsasign": "10.8.6",
|
"jsrsasign": "10.8.6",
|
||||||
"meilisearch": "0.32.4",
|
"meilisearch": "0.32.5",
|
||||||
"mfm-js": "0.23.3",
|
"mfm-js": "0.23.3",
|
||||||
"mime-types": "2.1.35",
|
"mime-types": "2.1.35",
|
||||||
"misskey-js": "workspace:*",
|
"misskey-js": "workspace:*",
|
||||||
"ms": "3.0.0-canary.1",
|
"ms": "3.0.0-canary.1",
|
||||||
"nested-property": "4.0.0",
|
"nested-property": "4.0.0",
|
||||||
"node-fetch": "3.3.1",
|
"node-fetch": "3.3.1",
|
||||||
"nodemailer": "6.9.2",
|
"nodemailer": "6.9.3",
|
||||||
"nsfwjs": "2.4.2",
|
"nsfwjs": "2.4.2",
|
||||||
"oauth": "0.10.0",
|
"oauth": "0.10.0",
|
||||||
"os-utils": "0.0.14",
|
"os-utils": "0.0.14",
|
||||||
|
@ -129,7 +129,7 @@
|
||||||
"qrcode": "1.5.3",
|
"qrcode": "1.5.3",
|
||||||
"random-seed": "0.3.0",
|
"random-seed": "0.3.0",
|
||||||
"ratelimiter": "3.4.1",
|
"ratelimiter": "3.4.1",
|
||||||
"re2": "1.18.0",
|
"re2": "1.19.0",
|
||||||
"redis-lock": "0.1.4",
|
"redis-lock": "0.1.4",
|
||||||
"reflect-metadata": "0.1.13",
|
"reflect-metadata": "0.1.13",
|
||||||
"rename": "1.0.4",
|
"rename": "1.0.4",
|
||||||
|
@ -146,16 +146,16 @@
|
||||||
"strict-event-emitter-types": "2.0.0",
|
"strict-event-emitter-types": "2.0.0",
|
||||||
"stringz": "2.1.0",
|
"stringz": "2.1.0",
|
||||||
"summaly": "github:misskey-dev/summaly",
|
"summaly": "github:misskey-dev/summaly",
|
||||||
"systeminformation": "5.17.12",
|
"systeminformation": "5.17.16",
|
||||||
"tinycolor2": "1.6.0",
|
"tinycolor2": "1.6.0",
|
||||||
"tmp": "0.2.1",
|
"tmp": "0.2.1",
|
||||||
"tsc-alias": "1.8.6",
|
"tsc-alias": "1.8.6",
|
||||||
"tsconfig-paths": "4.2.0",
|
"tsconfig-paths": "4.2.0",
|
||||||
"twemoji-parser": "14.0.0",
|
"twemoji-parser": "14.0.0",
|
||||||
"typeorm": "0.3.16",
|
"typeorm": "0.3.16",
|
||||||
"typescript": "5.0.4",
|
"typescript": "5.1.3",
|
||||||
"ulid": "2.3.0",
|
"ulid": "2.3.0",
|
||||||
"unzipper": "0.10.11",
|
"unzipper": "0.10.14",
|
||||||
"uuid": "9.0.0",
|
"uuid": "9.0.0",
|
||||||
"vary": "1.1.2",
|
"vary": "1.1.2",
|
||||||
"web-push": "3.6.1",
|
"web-push": "3.6.1",
|
||||||
|
@ -173,13 +173,13 @@
|
||||||
"@types/content-disposition": "0.5.5",
|
"@types/content-disposition": "0.5.5",
|
||||||
"@types/escape-regexp": "0.0.1",
|
"@types/escape-regexp": "0.0.1",
|
||||||
"@types/fluent-ffmpeg": "2.1.21",
|
"@types/fluent-ffmpeg": "2.1.21",
|
||||||
"@types/jest": "29.5.1",
|
"@types/jest": "29.5.2",
|
||||||
"@types/js-yaml": "4.0.5",
|
"@types/js-yaml": "4.0.5",
|
||||||
"@types/jsdom": "21.1.1",
|
"@types/jsdom": "21.1.1",
|
||||||
"@types/jsonld": "1.5.8",
|
"@types/jsonld": "1.5.8",
|
||||||
"@types/jsrsasign": "10.5.8",
|
"@types/jsrsasign": "10.5.8",
|
||||||
"@types/mime-types": "2.1.1",
|
"@types/mime-types": "2.1.1",
|
||||||
"@types/node": "20.2.3",
|
"@types/node": "20.2.5",
|
||||||
"@types/node-fetch": "3.0.3",
|
"@types/node-fetch": "3.0.3",
|
||||||
"@types/nodemailer": "6.4.8",
|
"@types/nodemailer": "6.4.8",
|
||||||
"@types/oauth": "0.9.1",
|
"@types/oauth": "0.9.1",
|
||||||
|
@ -203,11 +203,11 @@
|
||||||
"@types/web-push": "3.3.2",
|
"@types/web-push": "3.3.2",
|
||||||
"@types/websocket": "1.0.5",
|
"@types/websocket": "1.0.5",
|
||||||
"@types/ws": "8.5.4",
|
"@types/ws": "8.5.4",
|
||||||
"@typescript-eslint/eslint-plugin": "5.59.5",
|
"@typescript-eslint/eslint-plugin": "5.59.8",
|
||||||
"@typescript-eslint/parser": "5.59.5",
|
"@typescript-eslint/parser": "5.59.8",
|
||||||
"aws-sdk-client-mock": "2.1.1",
|
"aws-sdk-client-mock": "2.1.1",
|
||||||
"cross-env": "7.0.3",
|
"cross-env": "7.0.3",
|
||||||
"eslint": "8.40.0",
|
"eslint": "8.41.0",
|
||||||
"eslint-plugin-import": "2.27.5",
|
"eslint-plugin-import": "2.27.5",
|
||||||
"execa": "6.1.0",
|
"execa": "6.1.0",
|
||||||
"jest": "29.5.0",
|
"jest": "29.5.0",
|
||||||
|
|
|
@ -19,6 +19,8 @@ import type * as http from 'node:http';
|
||||||
@Injectable()
|
@Injectable()
|
||||||
export class StreamingApiServerService {
|
export class StreamingApiServerService {
|
||||||
#wss: WebSocket.WebSocketServer;
|
#wss: WebSocket.WebSocketServer;
|
||||||
|
#connections = new Map<WebSocket.WebSocket, number>();
|
||||||
|
#cleanConnectionsIntervalId: NodeJS.Timeout | null = null;
|
||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
@Inject(DI.config)
|
@Inject(DI.config)
|
||||||
|
@ -109,7 +111,9 @@ export class StreamingApiServerService {
|
||||||
|
|
||||||
await stream.listen(ev, connection);
|
await stream.listen(ev, connection);
|
||||||
|
|
||||||
const intervalId = user ? setInterval(() => {
|
this.#connections.set(connection, Date.now());
|
||||||
|
|
||||||
|
const userUpdateIntervalId = user ? setInterval(() => {
|
||||||
this.usersRepository.update(user.id, {
|
this.usersRepository.update(user.id, {
|
||||||
lastActiveDate: new Date(),
|
lastActiveDate: new Date(),
|
||||||
});
|
});
|
||||||
|
@ -124,19 +128,34 @@ export class StreamingApiServerService {
|
||||||
ev.removeAllListeners();
|
ev.removeAllListeners();
|
||||||
stream.dispose();
|
stream.dispose();
|
||||||
this.redisForSub.off('message', onRedisMessage);
|
this.redisForSub.off('message', onRedisMessage);
|
||||||
if (intervalId) clearInterval(intervalId);
|
if (userUpdateIntervalId) clearInterval(userUpdateIntervalId);
|
||||||
});
|
});
|
||||||
|
|
||||||
connection.on('message', async (data) => {
|
connection.on('message', async (data) => {
|
||||||
|
this.#connections.set(connection, Date.now());
|
||||||
if (data.toString() === 'ping') {
|
if (data.toString() === 'ping') {
|
||||||
connection.send('pong');
|
connection.send('pong');
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
this.#cleanConnectionsIntervalId = setInterval(() => {
|
||||||
|
const now = Date.now();
|
||||||
|
for (const [connection, lastActive] of this.#connections.entries()) {
|
||||||
|
if (now - lastActive > 1000 * 60 * 5) {
|
||||||
|
connection.terminate();
|
||||||
|
this.#connections.delete(connection);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}, 1000 * 60 * 5);
|
||||||
}
|
}
|
||||||
|
|
||||||
@bindThis
|
@bindThis
|
||||||
public detach(): Promise<void> {
|
public detach(): Promise<void> {
|
||||||
|
if (this.#cleanConnectionsIntervalId) {
|
||||||
|
clearInterval(this.#cleanConnectionsIntervalId);
|
||||||
|
this.#cleanConnectionsIntervalId = null;
|
||||||
|
}
|
||||||
return new Promise((resolve) => {
|
return new Promise((resolve) => {
|
||||||
this.#wss.close(() => resolve());
|
this.#wss.close(() => resolve());
|
||||||
});
|
});
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
import { promisify } from 'node:util';
|
import { promisify } from 'node:util';
|
||||||
import bcrypt from 'bcryptjs';
|
import bcrypt from 'bcryptjs';
|
||||||
import * as cbor from 'cbor';
|
import cbor from 'cbor';
|
||||||
import { Inject, Injectable } from '@nestjs/common';
|
import { Inject, Injectable } from '@nestjs/common';
|
||||||
import { Endpoint } from '@/server/api/endpoint-base.js';
|
import { Endpoint } from '@/server/api/endpoint-base.js';
|
||||||
import { UserEntityService } from '@/core/entities/UserEntityService.js';
|
import { UserEntityService } from '@/core/entities/UserEntityService.js';
|
||||||
|
|
|
@ -35,7 +35,7 @@ html
|
||||||
link(rel='prefetch' href='https://xn--931a.moe/assets/not-found.jpg')
|
link(rel='prefetch' href='https://xn--931a.moe/assets/not-found.jpg')
|
||||||
link(rel='prefetch' href='https://xn--931a.moe/assets/error.jpg')
|
link(rel='prefetch' href='https://xn--931a.moe/assets/error.jpg')
|
||||||
//- https://github.com/misskey-dev/misskey/issues/9842
|
//- https://github.com/misskey-dev/misskey/issues/9842
|
||||||
link(rel='stylesheet' href='/assets/tabler-icons/tabler-icons.min.css?v2.17.0')
|
link(rel='stylesheet' href='/assets/tabler-icons/tabler-icons.min.css?v2.21.0')
|
||||||
link(rel='modulepreload' href=`/vite/${clientEntry.file}`)
|
link(rel='modulepreload' href=`/vite/${clientEntry.file}`)
|
||||||
|
|
||||||
if !config.clientManifestExists
|
if !config.clientManifestExists
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
<link rel="preload" href="https://github.com/misskey-dev/misskey/blob/master/packages/frontend/assets/about-icon.png?raw=true" as="image" type="image/png" crossorigin="anonymous">
|
<link rel="preload" href="https://github.com/misskey-dev/misskey/blob/master/packages/frontend/assets/about-icon.png?raw=true" as="image" type="image/png" crossorigin="anonymous">
|
||||||
<link rel="preload" href="https://github.com/misskey-dev/misskey/blob/master/packages/frontend/assets/fedi.jpg?raw=true" as="image" type="image/jpeg" crossorigin="anonymous">
|
<link rel="preload" href="https://github.com/misskey-dev/misskey/blob/master/packages/frontend/assets/fedi.jpg?raw=true" as="image" type="image/jpeg" crossorigin="anonymous">
|
||||||
<link rel="stylesheet" href="https://unpkg.com/@tabler/icons-webfont@2.12.0/tabler-icons.min.css">
|
<link rel="stylesheet" href="https://unpkg.com/@tabler/icons-webfont@2.21.0/tabler-icons.min.css">
|
||||||
<link rel="stylesheet" href="https://unpkg.com/@fontsource/m-plus-rounded-1c/index.css">
|
<link rel="stylesheet" href="https://unpkg.com/@fontsource/m-plus-rounded-1c/index.css">
|
||||||
<style>
|
<style>
|
||||||
html {
|
html {
|
||||||
|
|
|
@ -20,13 +20,13 @@
|
||||||
"@rollup/plugin-replace": "5.0.2",
|
"@rollup/plugin-replace": "5.0.2",
|
||||||
"@rollup/pluginutils": "5.0.2",
|
"@rollup/pluginutils": "5.0.2",
|
||||||
"@syuilo/aiscript": "0.13.3",
|
"@syuilo/aiscript": "0.13.3",
|
||||||
"@tabler/icons-webfont": "2.17.0",
|
"@tabler/icons-webfont": "2.21.0",
|
||||||
"@vitejs/plugin-vue": "4.2.3",
|
"@vitejs/plugin-vue": "4.2.3",
|
||||||
"@vue-macros/reactivity-transform": "0.3.8",
|
"@vue-macros/reactivity-transform": "0.3.9",
|
||||||
"@vue/compiler-sfc": "3.3.4",
|
"@vue/compiler-sfc": "3.3.4",
|
||||||
"astring": "1.8.5",
|
"astring": "1.8.6",
|
||||||
"autosize": "6.0.1",
|
"autosize": "6.0.1",
|
||||||
"broadcast-channel": "4.20.2",
|
"broadcast-channel": "5.1.0",
|
||||||
"browser-image-resizer": "github:misskey-dev/browser-image-resizer#v2.2.1-misskey.3",
|
"browser-image-resizer": "github:misskey-dev/browser-image-resizer#v2.2.1-misskey.3",
|
||||||
"buraha": "github:misskey-dev/buraha",
|
"buraha": "github:misskey-dev/buraha",
|
||||||
"canvas-confetti": "1.6.0",
|
"canvas-confetti": "1.6.0",
|
||||||
|
@ -35,7 +35,7 @@
|
||||||
"chartjs-chart-matrix": "2.0.1",
|
"chartjs-chart-matrix": "2.0.1",
|
||||||
"chartjs-plugin-gradient": "0.6.1",
|
"chartjs-plugin-gradient": "0.6.1",
|
||||||
"chartjs-plugin-zoom": "2.0.1",
|
"chartjs-plugin-zoom": "2.0.1",
|
||||||
"chromatic": "6.17.4",
|
"chromatic": "6.18.0",
|
||||||
"compare-versions": "5.0.3",
|
"compare-versions": "5.0.3",
|
||||||
"cropperjs": "2.0.0-beta.2",
|
"cropperjs": "2.0.0-beta.2",
|
||||||
"date-fns": "2.30.0",
|
"date-fns": "2.30.0",
|
||||||
|
@ -63,13 +63,13 @@
|
||||||
"strict-event-emitter-types": "2.0.0",
|
"strict-event-emitter-types": "2.0.0",
|
||||||
"syuilo-password-strength": "0.0.1",
|
"syuilo-password-strength": "0.0.1",
|
||||||
"textarea-caret": "3.1.0",
|
"textarea-caret": "3.1.0",
|
||||||
"three": "0.151.3",
|
"three": "0.153.0",
|
||||||
"throttle-debounce": "5.0.0",
|
"throttle-debounce": "5.0.0",
|
||||||
"tinycolor2": "1.6.0",
|
"tinycolor2": "1.6.0",
|
||||||
"tsc-alias": "1.8.6",
|
"tsc-alias": "1.8.6",
|
||||||
"tsconfig-paths": "4.2.0",
|
"tsconfig-paths": "4.2.0",
|
||||||
"twemoji-parser": "14.0.0",
|
"twemoji-parser": "14.0.0",
|
||||||
"typescript": "5.0.4",
|
"typescript": "5.1.3",
|
||||||
"uuid": "9.0.0",
|
"uuid": "9.0.0",
|
||||||
"vanilla-tilt": "1.8.0",
|
"vanilla-tilt": "1.8.0",
|
||||||
"vite": "4.3.9",
|
"vite": "4.3.9",
|
||||||
|
@ -114,19 +114,19 @@
|
||||||
"@types/uuid": "9.0.1",
|
"@types/uuid": "9.0.1",
|
||||||
"@types/websocket": "1.0.5",
|
"@types/websocket": "1.0.5",
|
||||||
"@types/ws": "8.5.4",
|
"@types/ws": "8.5.4",
|
||||||
"@typescript-eslint/eslint-plugin": "5.59.5",
|
"@typescript-eslint/eslint-plugin": "5.59.8",
|
||||||
"@typescript-eslint/parser": "5.59.5",
|
"@typescript-eslint/parser": "5.59.8",
|
||||||
"@vitest/coverage-c8": "0.31.1",
|
"@vitest/coverage-c8": "0.31.4",
|
||||||
"@vue/runtime-core": "3.3.4",
|
"@vue/runtime-core": "3.3.4",
|
||||||
"acorn": "^8.8.2",
|
"acorn": "^8.8.2",
|
||||||
"chokidar-cli": "3.0.0",
|
"chokidar-cli": "3.0.0",
|
||||||
"cross-env": "7.0.3",
|
"cross-env": "7.0.3",
|
||||||
"cypress": "12.13.0",
|
"cypress": "12.13.0",
|
||||||
"eslint": "8.40.0",
|
"eslint": "8.41.0",
|
||||||
"eslint-plugin-import": "2.27.5",
|
"eslint-plugin-import": "2.27.5",
|
||||||
"eslint-plugin-vue": "9.14.1",
|
"eslint-plugin-vue": "9.14.1",
|
||||||
"fast-glob": "3.2.12",
|
"fast-glob": "3.2.12",
|
||||||
"happy-dom": "9.19.2",
|
"happy-dom": "9.20.3",
|
||||||
"micromatch": "3.1.10",
|
"micromatch": "3.1.10",
|
||||||
"msw": "1.2.1",
|
"msw": "1.2.1",
|
||||||
"msw-storybook-addon": "1.8.0",
|
"msw-storybook-addon": "1.8.0",
|
||||||
|
@ -138,7 +138,7 @@
|
||||||
"storybook-addon-misskey-theme": "github:misskey-dev/storybook-addon-misskey-theme",
|
"storybook-addon-misskey-theme": "github:misskey-dev/storybook-addon-misskey-theme",
|
||||||
"summaly": "github:misskey-dev/summaly",
|
"summaly": "github:misskey-dev/summaly",
|
||||||
"vite-plugin-turbosnap": "1.0.2",
|
"vite-plugin-turbosnap": "1.0.2",
|
||||||
"vitest": "0.31.1",
|
"vitest": "0.31.4",
|
||||||
"vitest-fetch-mock": "0.2.2",
|
"vitest-fetch-mock": "0.2.2",
|
||||||
"vue-eslint-parser": "9.3.0",
|
"vue-eslint-parser": "9.3.0",
|
||||||
"vue-tsc": "1.6.5"
|
"vue-tsc": "1.6.5"
|
||||||
|
|
|
@ -32,7 +32,7 @@
|
||||||
<div v-if="image.comment" :class="$style.indicator">ALT</div>
|
<div v-if="image.comment" :class="$style.indicator">ALT</div>
|
||||||
<div v-if="image.isSensitive" :class="$style.indicator" style="color: var(--warn);">NSFW</div>
|
<div v-if="image.isSensitive" :class="$style.indicator" style="color: var(--warn);">NSFW</div>
|
||||||
</div>
|
</div>
|
||||||
<button :class="$style.menu" class="_button" @click.stop="showMenu"><i class="ti ti-dots"></i></button>
|
<button :class="$style.menu" class="_button" @click.stop="showMenu"><i class="ti ti-dots" style="vertical-align: middle;"></i></button>
|
||||||
</template>
|
</template>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
@ -131,13 +131,14 @@ function showMenu(ev: MouseEvent) {
|
||||||
.menu {
|
.menu {
|
||||||
display: block;
|
display: block;
|
||||||
position: absolute;
|
position: absolute;
|
||||||
border-radius: 6px;
|
border-radius: 999px;
|
||||||
background-color: rgba(0, 0, 0, 0.3);
|
background-color: rgba(0, 0, 0, 0.3);
|
||||||
-webkit-backdrop-filter: var(--blur, blur(15px));
|
-webkit-backdrop-filter: var(--blur, blur(15px));
|
||||||
backdrop-filter: var(--blur, blur(15px));
|
backdrop-filter: var(--blur, blur(15px));
|
||||||
color: #fff;
|
color: #fff;
|
||||||
font-size: 0.8em;
|
font-size: 0.8em;
|
||||||
padding: 6px 8px;
|
width: 32px;
|
||||||
|
height: 32px;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
bottom: 10px;
|
bottom: 10px;
|
||||||
right: 10px;
|
right: 10px;
|
||||||
|
|
|
@ -8,7 +8,7 @@
|
||||||
</div>
|
</div>
|
||||||
<span v-if="$i && $i.id !== user.id && user.isFollowed" :class="$style.followed">{{ i18n.ts.followsYou }}</span>
|
<span v-if="$i && $i.id !== user.id && user.isFollowed" :class="$style.followed">{{ i18n.ts.followsYou }}</span>
|
||||||
<div :class="$style.description">
|
<div :class="$style.description">
|
||||||
<div v-if="user.description" class="mfm">
|
<div v-if="user.description" :class="$style.mfm">
|
||||||
<Mfm :text="user.description" :author="user" :i="$i"/>
|
<Mfm :text="user.description" :author="user" :i="$i"/>
|
||||||
</div>
|
</div>
|
||||||
<span v-else style="opacity: 0.7;">{{ i18n.ts.noAccountDescription }}</span>
|
<span v-else style="opacity: 0.7;">{{ i18n.ts.noAccountDescription }}</span>
|
||||||
|
|
990
pnpm-lock.yaml
990
pnpm-lock.yaml
File diff suppressed because it is too large
Load diff
Loading…
Reference in a new issue