mirror of
https://git.joinsharkey.org/Sharkey/Sharkey.git
synced 2024-11-24 00:03:07 +02:00
Merge branch 'develop'
This commit is contained in:
commit
31dcf713cc
19 changed files with 1279 additions and 200 deletions
|
@ -9,6 +9,15 @@
|
||||||
You should also include the user name that made the change.
|
You should also include the user name that made the change.
|
||||||
-->
|
-->
|
||||||
|
|
||||||
|
## 13.1.1 (2023/01/22)
|
||||||
|
|
||||||
|
### Improvements
|
||||||
|
- ローカルのカスタム絵文字を表示する際のパフォーマンスを改善
|
||||||
|
- Client: 瞬間的に大量の実績を解除した際の挙動を改善
|
||||||
|
|
||||||
|
### Bugfixes
|
||||||
|
- Client: アップデート時にローカリゼーションデータが更新されないことがあるのを修正
|
||||||
|
|
||||||
## 13.1.0 (2023/01/21)
|
## 13.1.0 (2023/01/21)
|
||||||
|
|
||||||
### Improvements
|
### Improvements
|
||||||
|
|
|
@ -938,6 +938,234 @@ cannotPerformTemporary: "Vorübergehend nicht verfügbar"
|
||||||
cannotPerformTemporaryDescription: "Diese Aktion ist wegen des Überschreitenes des Ausführungslimits temporär nicht verfügbar. Bitte versuche es nach einiger Zeit erneut."
|
cannotPerformTemporaryDescription: "Diese Aktion ist wegen des Überschreitenes des Ausführungslimits temporär nicht verfügbar. Bitte versuche es nach einiger Zeit erneut."
|
||||||
preset: "Vorlage"
|
preset: "Vorlage"
|
||||||
selectFromPresets: "Aus Vorlagen wählen"
|
selectFromPresets: "Aus Vorlagen wählen"
|
||||||
|
achievements: "Errungenschaften"
|
||||||
|
_achievements:
|
||||||
|
earnedAt: "Freigeschaltet am"
|
||||||
|
_types:
|
||||||
|
_notes1:
|
||||||
|
title: "Hallo Misskey!"
|
||||||
|
description: "Sende deine erste Notiz"
|
||||||
|
flavor: "Hab eine schöne Zeit mit Misskey!"
|
||||||
|
_notes10:
|
||||||
|
title: "Ein paar Notizen"
|
||||||
|
description: "10 Notizen gesendet"
|
||||||
|
_notes100:
|
||||||
|
title: "Viele Notizen"
|
||||||
|
description: "100 Notizen gesendet"
|
||||||
|
_notes500:
|
||||||
|
title: "Überschüttet mit Notizen"
|
||||||
|
description: "500 Notizen gesendet"
|
||||||
|
_notes1000:
|
||||||
|
title: "Berg an Notizen"
|
||||||
|
description: "1.000 Notizen gesendet"
|
||||||
|
_notes5000:
|
||||||
|
title: "Überquellende Notizen"
|
||||||
|
description: "5.000 Notizen gesendet"
|
||||||
|
_notes10000:
|
||||||
|
title: "Supernotiz"
|
||||||
|
description: "10.000 Notizen gesendet"
|
||||||
|
_notes20000:
|
||||||
|
title: "Brauche... mehr... Notizen"
|
||||||
|
description: "20.000 Notizen gesendet"
|
||||||
|
_notes30000:
|
||||||
|
title: "Notizen, Notizen, Notizen"
|
||||||
|
description: "30.000 Notizen gesendet"
|
||||||
|
_notes40000:
|
||||||
|
title: "Notizfabrik"
|
||||||
|
description: "40.000 Notizen gesendet"
|
||||||
|
_notes50000:
|
||||||
|
title: "Planet der Notizen"
|
||||||
|
description: "50.000 Notizen gesendet"
|
||||||
|
_notes60000:
|
||||||
|
title: "Notizquasar"
|
||||||
|
description: "60.000 Notizen gesendet"
|
||||||
|
_notes70000:
|
||||||
|
title: "Schwarzes Notizloch"
|
||||||
|
description: "70.000 Notizen gesendet"
|
||||||
|
_notes80000:
|
||||||
|
title: "Notizgalaxie"
|
||||||
|
description: "80.000 Notizen gesendet"
|
||||||
|
_notes90000:
|
||||||
|
title: "Notizversum"
|
||||||
|
description: "90.000 Notizen gesendet"
|
||||||
|
_notes100000:
|
||||||
|
title: "ALL YOUR NOTE ARE BELONG TO US"
|
||||||
|
description: "100.000 Notizen gesendet"
|
||||||
|
flavor: "Du hast wirklich viel zu sagen."
|
||||||
|
_login3:
|
||||||
|
title: "Anfänger Ⅰ"
|
||||||
|
description: "An 3 Tagen eingeloggt"
|
||||||
|
flavor: "Nenn' mich ab heute Misskist"
|
||||||
|
_login7:
|
||||||
|
title: "Anfänger Ⅱ"
|
||||||
|
description: "An 7 Tagen eingeloggt"
|
||||||
|
flavor: "Na, eingewöht?"
|
||||||
|
_login15:
|
||||||
|
title: "Anfänger Ⅲ"
|
||||||
|
description: "An 15 Tagen eingeloggt"
|
||||||
|
_login30:
|
||||||
|
title: "Misskist Ⅰ"
|
||||||
|
description: "An 30 Tagen eingeloggt"
|
||||||
|
_login60:
|
||||||
|
title: "Misskist Ⅱ"
|
||||||
|
description: "An 60 Tagen eingeloggt"
|
||||||
|
_login100:
|
||||||
|
title: "Misskist Ⅲ"
|
||||||
|
description: "An 100 Tagen eingeloggt"
|
||||||
|
flavor: "Violent Misskist"
|
||||||
|
_login200:
|
||||||
|
title: "Stammbesucher Ⅰ"
|
||||||
|
description: "An 200 Tagen eingeloggt"
|
||||||
|
_login300:
|
||||||
|
title: "Stammbesucher Ⅱ"
|
||||||
|
description: "An 300 Tagen eingeloggt"
|
||||||
|
_login400:
|
||||||
|
title: "Stammbesucher Ⅲ"
|
||||||
|
description: "An 400 Tagen eingeloggt"
|
||||||
|
_login500:
|
||||||
|
title: "Veteran Ⅰ"
|
||||||
|
description: "An 500 Tagen eingeloggt"
|
||||||
|
flavor: "Meine Kameraden, ich liebe sie, die Notizen."
|
||||||
|
_login600:
|
||||||
|
title: "Veteran Ⅱ"
|
||||||
|
description: "An 600 Tagen eingeloggt"
|
||||||
|
_login700:
|
||||||
|
title: "Veteran Ⅲ"
|
||||||
|
description: "An 700 Tagen eingeloggt"
|
||||||
|
_login800:
|
||||||
|
title: "Meister der Notizen Ⅰ"
|
||||||
|
description: "An 800 Tagen eingeloggt"
|
||||||
|
_login900:
|
||||||
|
title: "Meister der Notizen Ⅱ"
|
||||||
|
description: "An 900 Tagen eingeloggt"
|
||||||
|
_login1000:
|
||||||
|
title: "Meister der Notizen Ⅲ"
|
||||||
|
description: "An 1000 Tagen eingeloggt"
|
||||||
|
flavor: "Danke, dass du Misskey nutzt!"
|
||||||
|
_noteClipped1:
|
||||||
|
title: "Muss... clippen..."
|
||||||
|
description: "Die erste Notiz geclippt"
|
||||||
|
_noteFavorited1:
|
||||||
|
title: "Sternengucker"
|
||||||
|
description: "Eine Notiz als Favorit markiert"
|
||||||
|
_profileFilled:
|
||||||
|
title: "Perfekte Vorbereitung"
|
||||||
|
description: "Fülle dein Profil aus"
|
||||||
|
_markedAsCat:
|
||||||
|
title: "Ich der Kater"
|
||||||
|
description: "Markiere dein Konto als Katze"
|
||||||
|
flavor: "Einen Namen bekommst du später. "
|
||||||
|
_following1:
|
||||||
|
title: "Das Folgen beginnt"
|
||||||
|
description: "Du folgst deiner ersten Person"
|
||||||
|
_following10:
|
||||||
|
title: "Folge ihnen... folge ihnen..."
|
||||||
|
description: "Du folgst über 10 Leuten"
|
||||||
|
_following50:
|
||||||
|
title: "Viele Freunde"
|
||||||
|
description: "Du folgst über 50 Leuten"
|
||||||
|
_following100:
|
||||||
|
title: "100 Freunde"
|
||||||
|
description: "Du folgst über 100 Leuten"
|
||||||
|
_following300:
|
||||||
|
title: "Freundeüberschuss"
|
||||||
|
description: "Du folgst über 300 Leuten"
|
||||||
|
_followers1:
|
||||||
|
title: "Der erste Follower"
|
||||||
|
description: "Du hast deinen ersten Follower erhalten"
|
||||||
|
_followers10:
|
||||||
|
title: "Mir nach!"
|
||||||
|
description: "Die Anzahl deiner Follower hat 10 überschritten"
|
||||||
|
_followers50:
|
||||||
|
title: "Wirrwarr"
|
||||||
|
description: "Die Anzahl deiner Follower hat 50 überschritten"
|
||||||
|
_followers100:
|
||||||
|
title: "Beliebt"
|
||||||
|
description: "Die Anzahl deiner Follower hat 100 überschritten"
|
||||||
|
_followers300:
|
||||||
|
title: "Stellt euch bitte in einer Reihe auf"
|
||||||
|
description: "Die Anzahl deiner Follower hat 300 überschritten"
|
||||||
|
_followers500:
|
||||||
|
title: "Funkmast"
|
||||||
|
description: "Die Anzahl deiner Follower hat 500 überschritten"
|
||||||
|
_followers1000:
|
||||||
|
title: "Influencer"
|
||||||
|
description: "Die Anzahl deiner Follower hat 1000 überschritten"
|
||||||
|
_collectAchievements30:
|
||||||
|
title: "Sammler der Errungenschaften"
|
||||||
|
description: "Schalte 30 Errungenschaften frei"
|
||||||
|
_viewAchievements3min:
|
||||||
|
title: "Fan von Errungenschaften"
|
||||||
|
description: "Schau dir die Liste deiner Errungenschaften für mindestens 3 Minuten an"
|
||||||
|
_iLoveMisskey:
|
||||||
|
title: "I Love Misskey"
|
||||||
|
description: "Sende \"I ❤ #Misskey\""
|
||||||
|
flavor: "Danke, dass du Misskey verwendest! - vom Entwicklerteam"
|
||||||
|
_client30min:
|
||||||
|
title: "Kleine Pause"
|
||||||
|
description: "Seit dem Öffnen deines Clients sind 30 Minuten vergangen"
|
||||||
|
_noteDeletedWithin1min:
|
||||||
|
title: "Ups"
|
||||||
|
description: "Lösche eine Notiz innerhalb von 1 Minute nachdem sie gesendet wurde"
|
||||||
|
_postedAtLateNight:
|
||||||
|
title: "Nachtaktiv"
|
||||||
|
description: "Sende mitten in der Nacht eine Notiz"
|
||||||
|
flavor: "Geh bald schlafen."
|
||||||
|
_postedAt0min0sec:
|
||||||
|
title: "Zeitansage"
|
||||||
|
description: "Sende um 00:00 eine Notiz"
|
||||||
|
flavor: "Klick Klick Klick Dooong"
|
||||||
|
_selfQuote:
|
||||||
|
title: "Selbstzitat"
|
||||||
|
description: "Zitiere eine eigene Notiz"
|
||||||
|
_htl20npm:
|
||||||
|
title: "Fließende Chronik"
|
||||||
|
description: "Deine Startseitenchronik erreicht eine Geschwindigkeit von 20 npm (Notizen pro Minute)"
|
||||||
|
_outputHelloWorldOnScratchpad:
|
||||||
|
title: "Hallo Welt!"
|
||||||
|
description: "Gib \"hello world\" in der Testumgebung aus"
|
||||||
|
_open3windows:
|
||||||
|
title: "Splitscreen"
|
||||||
|
description: "Habe zur gleichen Zeit mindestens 3 Fenster offen"
|
||||||
|
_driveFolderCircularReference:
|
||||||
|
title: "Zyklischer Verweis"
|
||||||
|
description: "Versuche, in Drive einen Zirkelbezug von Ordnern herzustellen"
|
||||||
|
_reactWithoutRead:
|
||||||
|
title: "Hast du das wirklich gelesen?"
|
||||||
|
description: "Reagiere auf eine Notiz mit mindestens 100 Zeichen innerhalb von 3 Sekunden der Erstellung der Notiz"
|
||||||
|
_clickedClickHere:
|
||||||
|
title: "Klicke hier"
|
||||||
|
description: "Du hast hier geklickt"
|
||||||
|
_justPlainLucky:
|
||||||
|
title: "Pures Glück"
|
||||||
|
description: "Kann alle 10 Sekunden mit einer Warscheinlichkeit von 0.01% erhalten werden"
|
||||||
|
_setNameToSyuilo:
|
||||||
|
title: "Gottkomplex"
|
||||||
|
description: "Setze deinen Namen auf \"syuilo\""
|
||||||
|
_passedSinceAccountCreated1:
|
||||||
|
title: "Einjahresjubiläum"
|
||||||
|
description: "Seit der Erstellung deines Kontos ist 1 Jahr vergangen"
|
||||||
|
_passedSinceAccountCreated2:
|
||||||
|
title: "Zweijahresjubiläum"
|
||||||
|
description: "Seit der Erstellung deines Kontos sind 2 Jahre vergangen"
|
||||||
|
_passedSinceAccountCreated3:
|
||||||
|
title: "Dreijahresjubiläum"
|
||||||
|
description: "Seit der Erstellung deines Kontos sind 3 Jahre vergangen"
|
||||||
|
_loggedInOnBirthday:
|
||||||
|
title: "Alles Gute Zum Geburtstag"
|
||||||
|
description: "Logge dich an deinem Geburtstag ein"
|
||||||
|
_loggedInOnNewYearsDay:
|
||||||
|
title: "Frohes Neujahr"
|
||||||
|
description: "Logge dich am Neujahrstag ein"
|
||||||
|
flavor: "Auf ein weiteres tolles Jahr in dieser Instanz"
|
||||||
|
_cookieClicked:
|
||||||
|
title: "Ein Spiel, in dem du auf einen Keks klickst"
|
||||||
|
description: "Den Keks geklickt"
|
||||||
|
flavor: "Bist du hier richtig?"
|
||||||
|
_brainDiver:
|
||||||
|
title: "Brain Diver"
|
||||||
|
description: "Sende den Link zu Brain Diver"
|
||||||
|
flavor: "Misskey-Misskey La-Tu-Ma"
|
||||||
_role:
|
_role:
|
||||||
new: "Rolle erstellen"
|
new: "Rolle erstellen"
|
||||||
edit: "Rolle bearbeiten"
|
edit: "Rolle bearbeiten"
|
||||||
|
@ -1587,6 +1815,7 @@ _notification:
|
||||||
pollEnded: "Umfrageergebnisse sind verfügbar"
|
pollEnded: "Umfrageergebnisse sind verfügbar"
|
||||||
unreadAntennaNote: "Antenne {name}"
|
unreadAntennaNote: "Antenne {name}"
|
||||||
emptyPushNotificationMessage: "Push-Benachrichtigungen wurden aktualisiert"
|
emptyPushNotificationMessage: "Push-Benachrichtigungen wurden aktualisiert"
|
||||||
|
achievementEarned: "Errungenschaft freigeschaltet"
|
||||||
_types:
|
_types:
|
||||||
all: "Alle"
|
all: "Alle"
|
||||||
follow: "Neue Follower"
|
follow: "Neue Follower"
|
||||||
|
|
|
@ -938,8 +938,198 @@ cannotPerformTemporary: "Temporarily unavailable"
|
||||||
cannotPerformTemporaryDescription: "This action cannot be performed temporarily due to exceeding the execution limit. Please wait for a while and then try again."
|
cannotPerformTemporaryDescription: "This action cannot be performed temporarily due to exceeding the execution limit. Please wait for a while and then try again."
|
||||||
preset: "Preset"
|
preset: "Preset"
|
||||||
selectFromPresets: "Choose from presets"
|
selectFromPresets: "Choose from presets"
|
||||||
|
achievements: "Achievements"
|
||||||
_achievements:
|
_achievements:
|
||||||
|
earnedAt: "Unlocked at"
|
||||||
_types:
|
_types:
|
||||||
|
_notes1:
|
||||||
|
title: "just setting up my msky"
|
||||||
|
description: "Post your first note"
|
||||||
|
flavor: "Have a good Misskey life!"
|
||||||
|
_notes10:
|
||||||
|
title: "Some notes"
|
||||||
|
description: "Post 10 notes"
|
||||||
|
_notes100:
|
||||||
|
title: "A lot of notes"
|
||||||
|
description: "Post 100 notes"
|
||||||
|
_notes500:
|
||||||
|
title: "Covered in notes"
|
||||||
|
description: "Post 500 notes"
|
||||||
|
_notes1000:
|
||||||
|
title: "A mountain of notes"
|
||||||
|
description: "Post 1,000 notes"
|
||||||
|
_notes5000:
|
||||||
|
title: "Overflowing notes"
|
||||||
|
description: "Post 5,000 notes"
|
||||||
|
_notes10000:
|
||||||
|
title: "Supernote"
|
||||||
|
description: "Post 10,000 notes"
|
||||||
|
_notes20000:
|
||||||
|
title: "Need... more... notes..."
|
||||||
|
description: "Post 20,000 notes"
|
||||||
|
_notes30000:
|
||||||
|
title: "Notes notes notes!"
|
||||||
|
description: "Post 30,000 notes"
|
||||||
|
_notes40000:
|
||||||
|
title: "Note factory"
|
||||||
|
description: "Post 40,000 notes"
|
||||||
|
_notes50000:
|
||||||
|
title: "Planet of notes"
|
||||||
|
description: "Post 50,000 notes"
|
||||||
|
_notes60000:
|
||||||
|
title: "Note quasar"
|
||||||
|
description: "Post 60,000 notes"
|
||||||
|
_notes70000:
|
||||||
|
title: "Note black hole"
|
||||||
|
description: "Post 70,000 notes"
|
||||||
|
_notes80000:
|
||||||
|
title: "Note galaxy"
|
||||||
|
description: "Post 80,000 notes"
|
||||||
|
_notes90000:
|
||||||
|
title: "Note universe"
|
||||||
|
description: "Post 90,000 notes"
|
||||||
|
_notes100000:
|
||||||
|
title: "ALL YOUR NOTE ARE BELONG TO US"
|
||||||
|
description: "Post 100,000 notes"
|
||||||
|
flavor: "You sure have a lot to say."
|
||||||
|
_login3:
|
||||||
|
title: "Beginner I"
|
||||||
|
description: "Log in for a total of 3 days"
|
||||||
|
flavor: "Starting today, just call me Misskist"
|
||||||
|
_login7:
|
||||||
|
title: "Beginner II"
|
||||||
|
description: "Log in for a total of 7 days"
|
||||||
|
flavor: "Feel like you've gotten the hang of things yet?"
|
||||||
|
_login15:
|
||||||
|
title: "Beginner III"
|
||||||
|
description: "Log in for a total of 15 days"
|
||||||
|
_login30:
|
||||||
|
title: "Misskist I"
|
||||||
|
description: "Log in for a total of 30 days"
|
||||||
|
_login60:
|
||||||
|
title: "Misskist II"
|
||||||
|
description: "Log in for a total of 60 days"
|
||||||
|
_login100:
|
||||||
|
title: "Misskist III"
|
||||||
|
description: "Log in for a total of 100 days"
|
||||||
|
flavor: "Violent Misskist"
|
||||||
|
_login200:
|
||||||
|
title: "Regular I"
|
||||||
|
description: "Log in for a total of 200 days"
|
||||||
|
_login300:
|
||||||
|
title: "Regular II"
|
||||||
|
description: "Log in for a total of 300 days"
|
||||||
|
_login400:
|
||||||
|
title: "Regular III"
|
||||||
|
description: "Log in for a total of 400 days"
|
||||||
|
_login500:
|
||||||
|
title: "Expert I"
|
||||||
|
description: "Log in for a total of 500 days"
|
||||||
|
flavor: "My friends, it has often been said that I like notes"
|
||||||
|
_login600:
|
||||||
|
title: "Expert II"
|
||||||
|
description: "Log in for a total of 600 days"
|
||||||
|
_login700:
|
||||||
|
title: "Expert III"
|
||||||
|
description: "Log in for a total of 700 days"
|
||||||
|
_login800:
|
||||||
|
title: "Master of Notes I"
|
||||||
|
description: "Log in for a total of 800 days"
|
||||||
|
_login900:
|
||||||
|
title: "Master of Notes II"
|
||||||
|
description: "Log in for a total of 900 days"
|
||||||
|
_login1000:
|
||||||
|
title: "Master of Notes III"
|
||||||
|
description: "Log in for a total of 1,000 days"
|
||||||
|
flavor: "Thank you for using Misskey!"
|
||||||
|
_noteClipped1:
|
||||||
|
title: "Must... clip..."
|
||||||
|
description: "Clip your first note"
|
||||||
|
_noteFavorited1:
|
||||||
|
title: "Stargazer"
|
||||||
|
description: "Favorite your first note"
|
||||||
|
_profileFilled:
|
||||||
|
title: "Well-prepared"
|
||||||
|
description: "Set up your profile"
|
||||||
|
_markedAsCat:
|
||||||
|
title: "I Am a Cat"
|
||||||
|
description: "Mark your account as a cat"
|
||||||
|
flavor: "I'll give you a name later."
|
||||||
|
_following1:
|
||||||
|
title: "Following your first user"
|
||||||
|
description: "Follow a user"
|
||||||
|
_following10:
|
||||||
|
title: "Keep up... keep up..."
|
||||||
|
description: "Follow 10 users"
|
||||||
|
_following50:
|
||||||
|
title: "Lots of friends"
|
||||||
|
description: "Follow 50 accounts"
|
||||||
|
_following100:
|
||||||
|
title: "100 Friends"
|
||||||
|
description: "Follow 100 accounts"
|
||||||
|
_following300:
|
||||||
|
title: "Friend overload"
|
||||||
|
description: "Follow 300 accounts"
|
||||||
|
_followers1:
|
||||||
|
title: "First follower"
|
||||||
|
description: "Gain 1 follower"
|
||||||
|
_followers10:
|
||||||
|
title: "Follow me!"
|
||||||
|
description: "Gain 10 followers"
|
||||||
|
_followers50:
|
||||||
|
title: "Coming in crowds"
|
||||||
|
description: "Gain 50 followers"
|
||||||
|
_followers100:
|
||||||
|
title: "Popular"
|
||||||
|
description: "Gain 100 followers"
|
||||||
|
_followers300:
|
||||||
|
title: "Please form a single line"
|
||||||
|
description: "Gain 300 followers"
|
||||||
|
_followers500:
|
||||||
|
title: "Radio Tower"
|
||||||
|
description: "Gain 500 followers"
|
||||||
|
_followers1000:
|
||||||
|
title: "Influencer"
|
||||||
|
description: "Gain 1,000 followers"
|
||||||
|
_collectAchievements30:
|
||||||
|
title: "Achievement Collector"
|
||||||
|
description: "Earn 30 achievements"
|
||||||
|
_viewAchievements3min:
|
||||||
|
title: "Likes Achievements"
|
||||||
|
description: "Look at your list of achievements for at least 3 minutes"
|
||||||
|
_iLoveMisskey:
|
||||||
|
title: "I Love Misskey"
|
||||||
|
description: "Post \"I ❤ #Misskey\""
|
||||||
|
flavor: "Misskey's development team greatly appreciates your support!"
|
||||||
|
_client30min:
|
||||||
|
title: "Short break"
|
||||||
|
description: "Spend 30 minutes on Misskey"
|
||||||
|
_noteDeletedWithin1min:
|
||||||
|
title: "Nevermind"
|
||||||
|
description: "Delete a note within a minute of posting it"
|
||||||
|
_postedAtLateNight:
|
||||||
|
title: "Nocturnal"
|
||||||
|
description: "Post a note late at night"
|
||||||
|
flavor: "It's about time to go to bed."
|
||||||
|
_postedAt0min0sec:
|
||||||
|
title: "Speaking Clock"
|
||||||
|
description: "Post a note at 00:00"
|
||||||
|
flavor: "Click Click Click Claaang"
|
||||||
|
_selfQuote:
|
||||||
|
title: "Self-Reference"
|
||||||
|
description: "Quote your own note"
|
||||||
|
_htl20npm:
|
||||||
|
title: "Flowing Timeline"
|
||||||
|
description: "Have the speed of your home timeline exceed 20 npm (notes per minute)"
|
||||||
|
_outputHelloWorldOnScratchpad:
|
||||||
|
title: "Hello, world!"
|
||||||
|
description: "Output \"hello world\" in the Scratchpad"
|
||||||
|
_open3windows:
|
||||||
|
title: "Multi-Window"
|
||||||
|
description: "Have at least 3 windows open at the same time"
|
||||||
|
_driveFolderCircularReference:
|
||||||
|
title: "Circular Reference"
|
||||||
|
description: "Attempt to create a recursively nested folder in Drive"
|
||||||
_reactWithoutRead:
|
_reactWithoutRead:
|
||||||
title: "Did you really read that?"
|
title: "Did you really read that?"
|
||||||
description: "React on a note that's over 100 characters long within 3 seconds of it being posted"
|
description: "React on a note that's over 100 characters long within 3 seconds of it being posted"
|
||||||
|
@ -963,10 +1153,15 @@ _achievements:
|
||||||
description: "Three years have passed since your account was created"
|
description: "Three years have passed since your account was created"
|
||||||
_loggedInOnBirthday:
|
_loggedInOnBirthday:
|
||||||
title: "Happy Birthday"
|
title: "Happy Birthday"
|
||||||
description: "Logged in on your birthday"
|
description: "Log in on your birthday"
|
||||||
|
_loggedInOnNewYearsDay:
|
||||||
|
title: "Happy New Year!"
|
||||||
|
description: "Logged in on the first day of the year"
|
||||||
|
flavor: "To another great year on this instance"
|
||||||
_cookieClicked:
|
_cookieClicked:
|
||||||
title: "A game in which you click cookies"
|
title: "A game in which you click cookies"
|
||||||
description: "Clicked the cookie"
|
description: "Clicked the cookie"
|
||||||
|
flavor: "Wait, are you on the correct website?"
|
||||||
_brainDiver:
|
_brainDiver:
|
||||||
title: "Brain Diver"
|
title: "Brain Diver"
|
||||||
description: "Post the link to Brain Diver"
|
description: "Post the link to Brain Diver"
|
||||||
|
|
|
@ -1094,6 +1094,9 @@ _achievements:
|
||||||
_collectAchievements30:
|
_collectAchievements30:
|
||||||
title: "도전과제 콜렉터"
|
title: "도전과제 콜렉터"
|
||||||
description: "30개의 도전과제를 획득했습니다"
|
description: "30개의 도전과제를 획득했습니다"
|
||||||
|
_viewAchievements3min:
|
||||||
|
title: "저 도전과제 좋아해요"
|
||||||
|
description: "도전과제 목록을 3분 이상 보세요"
|
||||||
_iLoveMisskey:
|
_iLoveMisskey:
|
||||||
title: "I Love Misskey"
|
title: "I Love Misskey"
|
||||||
description: "\"I ❤ #Misskey\"를 포스트했습니다"
|
description: "\"I ❤ #Misskey\"를 포스트했습니다"
|
||||||
|
@ -1118,6 +1121,12 @@ _achievements:
|
||||||
_htl20npm:
|
_htl20npm:
|
||||||
title: "타임라인 폭주 중"
|
title: "타임라인 폭주 중"
|
||||||
description: "1분 사이에 홈 타임라인에 노트가 20개 넘게 생성되었습니다"
|
description: "1분 사이에 홈 타임라인에 노트가 20개 넘게 생성되었습니다"
|
||||||
|
_outputHelloWorldOnScratchpad:
|
||||||
|
title: "Hello, world!"
|
||||||
|
description: "스크래치패드에서 hello world를 출력하세요"
|
||||||
|
_open3windows:
|
||||||
|
title: "멀티 윈도우"
|
||||||
|
description: "3개 이상의 창을 여세요"
|
||||||
_driveFolderCircularReference:
|
_driveFolderCircularReference:
|
||||||
title: "순환 참조"
|
title: "순환 참조"
|
||||||
description: "드라이브 폴더를 자신을 가리키도록 만드려 시도했습니다"
|
description: "드라이브 폴더를 자신을 가리키도록 만드려 시도했습니다"
|
||||||
|
@ -1145,6 +1154,10 @@ _achievements:
|
||||||
_loggedInOnBirthday:
|
_loggedInOnBirthday:
|
||||||
title: "생일 축하합니다!"
|
title: "생일 축하합니다!"
|
||||||
description: "설정한 생일에 로그인했습니다"
|
description: "설정한 생일에 로그인했습니다"
|
||||||
|
_loggedInOnNewYearsDay:
|
||||||
|
title: "새해 복 많이 받으세요"
|
||||||
|
description: "새해 첫 날에 로그인했습니다"
|
||||||
|
flavor: "올해에도 저희 인스턴스에 관심을 가져 주셔서 감사합니다"
|
||||||
_cookieClicked:
|
_cookieClicked:
|
||||||
title: "쿠키 클리커 게임"
|
title: "쿠키 클리커 게임"
|
||||||
description: "쿠키를 클릭했습니다"
|
description: "쿠키를 클릭했습니다"
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
_lang_: "Русский"
|
_lang_: "Русский"
|
||||||
headlineMisskey: "Сеть, сплетённая из заметок"
|
headlineMisskey: "Сеть, сплетённая из заметок"
|
||||||
introMisskey: "Добро пожаловать! Misskey — это децентрализованный сервис микроблогов с открытым исходным кодом.\nПишите «заметки» — делитесь со всеми происходящим вокруг или рассказывайте о себе 📡\nСтавьте «реакции» — выражайте свои чувства и эмоции от заметок других 👍\nОткройте для себя новый мир 🚀"
|
introMisskey: "Добро пожаловать! Misskey — это децентрализованный сервис микроблогов с открытым исходным кодом.\nПишите «заметки» — делитесь со всеми происходящим вокруг или рассказывайте о себе 📡\nСтавьте «реакции» — выражайте свои чувства и эмоции от заметок других 👍\nОткройте для себя новый мир 🚀"
|
||||||
|
poweredByMisskeyDescription: "{name} – один из инстансов (также называемый экземпляром Misskey), использующий платформу с открытым исходным кодом <b>Misskey</b>."
|
||||||
monthAndDay: "{day}.{month}"
|
monthAndDay: "{day}.{month}"
|
||||||
search: "Поиск"
|
search: "Поиск"
|
||||||
notifications: "Уведомления"
|
notifications: "Уведомления"
|
||||||
|
@ -12,6 +13,7 @@ fetchingAsApObject: "Приём с других сайтов"
|
||||||
ok: "Окей"
|
ok: "Окей"
|
||||||
gotIt: "Ясно!"
|
gotIt: "Ясно!"
|
||||||
cancel: "Отмена"
|
cancel: "Отмена"
|
||||||
|
noThankYou: "Нет, спасибо"
|
||||||
enterUsername: "Введите имя пользователя"
|
enterUsername: "Введите имя пользователя"
|
||||||
renotedBy: "{user} делится"
|
renotedBy: "{user} делится"
|
||||||
noNotes: "Нет ни одной заметки"
|
noNotes: "Нет ни одной заметки"
|
||||||
|
@ -47,6 +49,7 @@ deleteAndEdit: "Удалить и отредактировать"
|
||||||
deleteAndEditConfirm: "Удалить эту заметку и создать отредактированную? Все реакции, ссылки и ответы на существующую будут будут потеряны."
|
deleteAndEditConfirm: "Удалить эту заметку и создать отредактированную? Все реакции, ссылки и ответы на существующую будут будут потеряны."
|
||||||
addToList: "Добавить в список"
|
addToList: "Добавить в список"
|
||||||
sendMessage: "Отправить сообщение"
|
sendMessage: "Отправить сообщение"
|
||||||
|
copyRSS: "Скопировать RSS"
|
||||||
copyUsername: "Скопировать имя пользователя"
|
copyUsername: "Скопировать имя пользователя"
|
||||||
searchUser: "Поиск людей"
|
searchUser: "Поиск людей"
|
||||||
reply: "Ответить"
|
reply: "Ответить"
|
||||||
|
@ -452,6 +455,7 @@ language: "Язык"
|
||||||
uiLanguage: "Язык интерфейса"
|
uiLanguage: "Язык интерфейса"
|
||||||
groupInvited: "Приглашение в группу"
|
groupInvited: "Приглашение в группу"
|
||||||
aboutX: "Описание {x}"
|
aboutX: "Описание {x}"
|
||||||
|
emojiStyle: "Стиль эмодзи"
|
||||||
disableDrawer: "Не использовать выдвижные меню"
|
disableDrawer: "Не использовать выдвижные меню"
|
||||||
youHaveNoGroups: "У вас нет ни одной группы"
|
youHaveNoGroups: "У вас нет ни одной группы"
|
||||||
joinOrCreateGroup: "Получайте приглашения в группы или создавайте свои собственные"
|
joinOrCreateGroup: "Получайте приглашения в группы или создавайте свои собственные"
|
||||||
|
@ -709,6 +713,7 @@ accentColor: "Акцент"
|
||||||
textColor: "Текст"
|
textColor: "Текст"
|
||||||
saveAs: "Сохранить под названием…"
|
saveAs: "Сохранить под названием…"
|
||||||
advanced: "Для продвинутых"
|
advanced: "Для продвинутых"
|
||||||
|
advancedSettings: "Расширенные настройки "
|
||||||
value: "Значения"
|
value: "Значения"
|
||||||
createdAt: "Создано"
|
createdAt: "Создано"
|
||||||
updatedAt: "Обновлено"
|
updatedAt: "Обновлено"
|
||||||
|
@ -840,34 +845,254 @@ numberOfColumn: "Количество столбцов"
|
||||||
searchByGoogle: "Поиск"
|
searchByGoogle: "Поиск"
|
||||||
instanceDefaultLightTheme: "Светлая тема по умолчанию"
|
instanceDefaultLightTheme: "Светлая тема по умолчанию"
|
||||||
instanceDefaultDarkTheme: "Темная тема по умолчанию"
|
instanceDefaultDarkTheme: "Темная тема по умолчанию"
|
||||||
|
instanceDefaultThemeDescription: "Описание темы по умолчанию для инстанса"
|
||||||
mutePeriod: "Продолжительность скрытия"
|
mutePeriod: "Продолжительность скрытия"
|
||||||
indefinitely: "вечно"
|
indefinitely: "вечно"
|
||||||
tenMinutes: "10 минут"
|
tenMinutes: "10 минут"
|
||||||
oneHour: "1 час"
|
oneHour: "1 час"
|
||||||
oneDay: "1 день"
|
oneDay: "1 день"
|
||||||
oneWeek: "1 неделя"
|
oneWeek: "1 неделя"
|
||||||
|
reflectMayTakeTime: "Изменения могут занять время для отображения"
|
||||||
|
failedToFetchAccountInformation: "Не удалось получить информацию об аккаунте"
|
||||||
cropImage: "Кадрирование"
|
cropImage: "Кадрирование"
|
||||||
cropImageAsk: "Нужно ли кадрировать изображение?"
|
cropImageAsk: "Нужно ли кадрировать изображение?"
|
||||||
file: "Файлы"
|
file: "Файлы"
|
||||||
recentNHours: "Последние {n} ч"
|
recentNHours: "Последние {n} ч"
|
||||||
recentNDays: "Последние {n} сут"
|
recentNDays: "Последние {n} сут"
|
||||||
|
noEmailServerWarning: "Почтовый сервер не установлен "
|
||||||
|
thereIsUnresolvedAbuseReportWarning: "Остались нерешённые жалобы"
|
||||||
recommended: "Рекомендуем"
|
recommended: "Рекомендуем"
|
||||||
check: "Проверить"
|
check: "Проверить"
|
||||||
driveCapOverrideLabel: "Изменение лимита дискового пространства для этого пользователя"
|
driveCapOverrideLabel: "Изменение лимита дискового пространства для этого пользователя"
|
||||||
|
driveCapOverrideCaption: "Укажите меньше или равное нулю для отмены"
|
||||||
|
requireAdminForView: "Для просмотра необходимо иметь аккаунт администратора"
|
||||||
|
isSystemAccount: "Данная учётная запись создана автоматически и управляется системой"
|
||||||
|
typeToConfirm: "Введите {x} для продолжения"
|
||||||
deleteAccount: "Удаление учётной записи"
|
deleteAccount: "Удаление учётной записи"
|
||||||
|
document: "Документ"
|
||||||
|
numberOfPageCache: "Количество сохранённых страниц в кэше"
|
||||||
|
numberOfPageCacheDescription: "Описание количества страниц в кэше"
|
||||||
|
logoutConfirm: "Вы хотите выйти из аккаунта?"
|
||||||
|
lastActiveDate: "Последняя дата использования"
|
||||||
|
statusbar: "Статусбар"
|
||||||
|
pleaseSelect: "Пожалуйста, выберите"
|
||||||
reverse: "Переворот"
|
reverse: "Переворот"
|
||||||
colored: "Выделена цветом"
|
colored: "Выделена цветом"
|
||||||
|
refreshInterval: "Интервал перезагрузки"
|
||||||
label: "Метка"
|
label: "Метка"
|
||||||
|
type: "Тип"
|
||||||
|
speed: "Скорость"
|
||||||
|
sensitiveMediaDetection: "Определение содержимого деликатного характера"
|
||||||
localOnly: "Локально"
|
localOnly: "Локально"
|
||||||
|
remoteOnly: "Только удалённо"
|
||||||
|
failedToUpload: "Сбой выгрузки"
|
||||||
|
cannotUploadBecauseInappropriate: "Файл не может быть загружен, так как было установлено, что он может содержать неприемлемое содержимое."
|
||||||
|
cannotUploadBecauseNoFreeSpace: "Файл не может быть загружен, так как не осталось места на диске"
|
||||||
beta: "Бета"
|
beta: "Бета"
|
||||||
enableAutoSensitive: "Автоматическое определение NSFW"
|
enableAutoSensitive: "Автоматическое определение NSFW"
|
||||||
enableAutoSensitiveDescription: "Если доступно, используйте машинное обучение для автоматической установки флага NSFW на носителе. Даже если эта функция отключена, она может быть установлена автоматически в зависимости от инстанта."
|
enableAutoSensitiveDescription: "Если доступно, используйте машинное обучение для автоматической установки флага NSFW на носителе. Даже если эта функция отключена, она может быть установлена автоматически в зависимости от инстанта."
|
||||||
account: "Учётные записи"
|
account: "Учётные записи"
|
||||||
windowMaximize: "Развернуть"
|
windowMaximize: "Развернуть"
|
||||||
windowRestore: "Восстановить"
|
windowRestore: "Восстановить"
|
||||||
|
loggedInAsBot: "Вы под аккаунтом бота!"
|
||||||
like: "Нравится!"
|
like: "Нравится!"
|
||||||
|
unlike: "Отменить «нравится»"
|
||||||
show: "Отображение"
|
show: "Отображение"
|
||||||
|
pleaseDonate: "Сайт {host} работает на Misskey. Это бесплатное программное обеспечение, и ваши пожертвования очень бы помогли продолжать его разработку!"
|
||||||
color: "Цвет"
|
color: "Цвет"
|
||||||
|
_achievements:
|
||||||
|
_types:
|
||||||
|
_notes1:
|
||||||
|
title: "Первые шаги в Misskey"
|
||||||
|
description: "Опубликована первая заметка"
|
||||||
|
_notes10:
|
||||||
|
title: "Несколько заметок"
|
||||||
|
description: "Опубликовано 10 заметок"
|
||||||
|
_notes100:
|
||||||
|
title: "Много заметок"
|
||||||
|
description: "Опубликовано 100 заметок"
|
||||||
|
_notes500:
|
||||||
|
title: "Всё в заметках"
|
||||||
|
description: "Опубликовано 500 заметок"
|
||||||
|
_notes1000:
|
||||||
|
title: "Гора заметок"
|
||||||
|
description: "Опубликовано 1000 заметок"
|
||||||
|
_notes5000:
|
||||||
|
title: "Заметки льются рекой"
|
||||||
|
description: "Опубликовано 5000 заметок"
|
||||||
|
_notes10000:
|
||||||
|
title: "Превосходство в заметках"
|
||||||
|
description: "Опубликовано 10 000 заметок"
|
||||||
|
_notes20000:
|
||||||
|
title: "Нужно больше заметок!"
|
||||||
|
description: "Опубликовано 20 000 заметок"
|
||||||
|
_notes30000:
|
||||||
|
title: "Заметки, заметки, заметки"
|
||||||
|
description: "Опубликовано 30 000 заметок"
|
||||||
|
_notes40000:
|
||||||
|
title: "Фабрика заметок"
|
||||||
|
description: "Опубликовано 40 000 заметок"
|
||||||
|
_notes50000:
|
||||||
|
title: "Планета заметок"
|
||||||
|
description: "Опубликовано 50 000 заметок"
|
||||||
|
_notes60000:
|
||||||
|
title: "Замет-квазар"
|
||||||
|
description: "Опубликовано 60 000 заметок"
|
||||||
|
_notes70000:
|
||||||
|
title: "Чёрная дыра из заметок"
|
||||||
|
description: "Опубликовано 70 000 заметок"
|
||||||
|
_notes80000:
|
||||||
|
title: "Галактика заметок"
|
||||||
|
description: "Опубликовано 80 000 заметок"
|
||||||
|
_notes90000:
|
||||||
|
title: "Вселенная заметок"
|
||||||
|
description: "Опубликовано 90 000 заметок"
|
||||||
|
_notes100000:
|
||||||
|
title: "ALL YOUR NOTE ARE BELONG TO US"
|
||||||
|
description: "Опубликовано 100 000 заметок"
|
||||||
|
_login3:
|
||||||
|
title: "Новичок Ⅰ"
|
||||||
|
description: "3 дня на сайте"
|
||||||
|
_login7:
|
||||||
|
title: "Новичок Ⅱ"
|
||||||
|
description: "Неделя на сайте"
|
||||||
|
flavor: "Кажется, вы начали свыкаться с этим, нет?"
|
||||||
|
_login15:
|
||||||
|
title: "Новичок Ⅲ"
|
||||||
|
description: "15 дней на сайте"
|
||||||
|
_login30:
|
||||||
|
title: "Мискиец Ⅰ"
|
||||||
|
description: "30 дней на сайте"
|
||||||
|
_login60:
|
||||||
|
title: "Мискиец Ⅱ"
|
||||||
|
description: "60 дней на сайте"
|
||||||
|
_login100:
|
||||||
|
title: "Мискиец Ⅲ"
|
||||||
|
description: "100 дней на сайте"
|
||||||
|
_login200:
|
||||||
|
title: "Завсегдатай Ⅰ"
|
||||||
|
description: "200 дней на сайте"
|
||||||
|
_login300:
|
||||||
|
title: "Завсегдатай Ⅱ"
|
||||||
|
description: "300 дней на сайте"
|
||||||
|
_login400:
|
||||||
|
title: "Завсегдатай Ⅲ"
|
||||||
|
description: "400 дней на сайте"
|
||||||
|
_login500:
|
||||||
|
title: "Ветеран Ⅰ"
|
||||||
|
description: "500 дней на сайте"
|
||||||
|
_login600:
|
||||||
|
title: "Ветеран Ⅱ"
|
||||||
|
description: "600 дней на сайте"
|
||||||
|
_login700:
|
||||||
|
title: "Ветеран Ⅲ"
|
||||||
|
description: "700 дней на сайте"
|
||||||
|
_login800:
|
||||||
|
title: "Повелитель заметок Ⅰ"
|
||||||
|
description: "800 дней на сайте"
|
||||||
|
_login900:
|
||||||
|
title: "Повелитель заметок Ⅱ"
|
||||||
|
description: "900 дней на сайте"
|
||||||
|
_login1000:
|
||||||
|
title: "Повелитель заметок Ⅲ"
|
||||||
|
description: "1000 дней на сайте"
|
||||||
|
_noteClipped1:
|
||||||
|
title: "Нельзя не сохранить"
|
||||||
|
description: "Первая заметка в подборке"
|
||||||
|
_noteFavorited1:
|
||||||
|
title: "Смотрящий на звёзды"
|
||||||
|
description: "Первое добавление в избранное"
|
||||||
|
_profileFilled:
|
||||||
|
title: "Приготовления закончены"
|
||||||
|
description: "Заполнен профиль"
|
||||||
|
_markedAsCat:
|
||||||
|
description: "Включена опция «Аккаунт кота»"
|
||||||
|
_followers50:
|
||||||
|
title: "Один за другим"
|
||||||
|
description: "Подписчиков больше 50"
|
||||||
|
_followers100:
|
||||||
|
title: "Всеобщий любимец"
|
||||||
|
description: "Подписчиков больше 100"
|
||||||
|
_followers300:
|
||||||
|
title: "В очередь!"
|
||||||
|
description: "Подписчиков больше 300"
|
||||||
|
_followers500:
|
||||||
|
title: "Радиостанция"
|
||||||
|
description: "Подписчиков больше 300"
|
||||||
|
_followers1000:
|
||||||
|
title: "Авторитет"
|
||||||
|
description: "Подписчиков больше 1000"
|
||||||
|
_collectAchievements30:
|
||||||
|
title: "Достигатор"
|
||||||
|
description: "Получено 30 достижений"
|
||||||
|
_viewAchievements3min:
|
||||||
|
title: "Любовь к успехам"
|
||||||
|
description: "Более 3 минут любования достижениями"
|
||||||
|
_iLoveMisskey:
|
||||||
|
title: "Я люблю Misskey"
|
||||||
|
description: "Написана заметка «I ❤ #Misskey»"
|
||||||
|
_client30min:
|
||||||
|
title: "Перерыв на обед"
|
||||||
|
description: "Прошло 30 минут с момента запуска клиента"
|
||||||
|
_noteDeletedWithin1min:
|
||||||
|
title: "Ой, нет!"
|
||||||
|
description: "Заметка удалена через минуту после публикации"
|
||||||
|
_postedAtLateNight:
|
||||||
|
title: "Житель ночи"
|
||||||
|
description: "Заметка опубликована в глухую ночь"
|
||||||
|
_postedAt0min0sec:
|
||||||
|
title: "Говорящие часы"
|
||||||
|
description: "Заметка опубликована ровно в 0 минут 0 секунд"
|
||||||
|
flavor: "Дин-дон дин-дон"
|
||||||
|
_selfQuote:
|
||||||
|
title: "Самовоспроизведение"
|
||||||
|
description: "Процитирована собственная заметка"
|
||||||
|
_htl20npm:
|
||||||
|
title: "В потоке"
|
||||||
|
description: "Достигнута скорость домашней ленты в 20 з/мин (заметок минуту)"
|
||||||
|
_outputHelloWorldOnScratchpad:
|
||||||
|
title: "Привет, мир!"
|
||||||
|
description: "Выведен текст «hello world» в Когтеточке"
|
||||||
|
_open3windows:
|
||||||
|
title: "Многооконный"
|
||||||
|
description: "Открыто одновременно 3 окна"
|
||||||
|
_driveFolderCircularReference:
|
||||||
|
description: "Попытка создать на «диске» рекурсивно вложенную папку"
|
||||||
|
_reactWithoutRead:
|
||||||
|
title: "Не читай @ отвечай!"
|
||||||
|
description: "На заметку более чем 100 знаков написан ответ в первые же 3 секунды с её появления."
|
||||||
|
_clickedClickHere:
|
||||||
|
title: "Нажмите здесь"
|
||||||
|
description: "Нажато здесь"
|
||||||
|
_justPlainLucky:
|
||||||
|
title: "Чистая удача"
|
||||||
|
description: "Может достаться с вероятностью 0,01% каждые 10 секунд."
|
||||||
|
_setNameToSyuilo:
|
||||||
|
title: "Комплекс бога"
|
||||||
|
description: "Установлено «syuilo» в качестве имени"
|
||||||
|
_passedSinceAccountCreated1:
|
||||||
|
title: "Первая годовщина"
|
||||||
|
description: "Прошёл 1 год с момента регистрации"
|
||||||
|
_passedSinceAccountCreated2:
|
||||||
|
title: "Вторая годовщина"
|
||||||
|
description: "Прошло 2 года с момента регистрации"
|
||||||
|
_passedSinceAccountCreated3:
|
||||||
|
title: "Третья годовщина"
|
||||||
|
description: "Прошло 3 года с момента регистрации"
|
||||||
|
_loggedInOnBirthday:
|
||||||
|
title: "С днём рождения!"
|
||||||
|
description: "Вход на сайт в свой день рождения"
|
||||||
|
_loggedInOnNewYearsDay:
|
||||||
|
title: "С Новым годом!"
|
||||||
|
description: "Вход на сайт в первый день года"
|
||||||
|
_cookieClicked:
|
||||||
|
title: "Игра, в которой вы щёлкаете по печенькам"
|
||||||
|
description: "Нажато печенье"
|
||||||
|
flavor: "Стоп, вы вообще на том сайте-то?"
|
||||||
|
_brainDiver:
|
||||||
|
title: "Brain Diver"
|
||||||
|
description: "Опубликована ссылка на песню «Brain Diver»"
|
||||||
|
flavor: "Мисски-Мисски Ла-Ту-Ма"
|
||||||
_role:
|
_role:
|
||||||
priority: "Приоритет"
|
priority: "Приоритет"
|
||||||
_priority:
|
_priority:
|
||||||
|
|
|
@ -938,6 +938,82 @@ cannotPerformTemporary: "暂时不可用"
|
||||||
cannotPerformTemporaryDescription: "因操作过于频繁,暂时不可用,请稍后再试。"
|
cannotPerformTemporaryDescription: "因操作过于频繁,暂时不可用,请稍后再试。"
|
||||||
preset: "預設值"
|
preset: "預設值"
|
||||||
selectFromPresets: "從預設值中選擇"
|
selectFromPresets: "從預設值中選擇"
|
||||||
|
achievements: "成就"
|
||||||
|
_achievements:
|
||||||
|
earnedAt: "达成时间"
|
||||||
|
_types:
|
||||||
|
_notes1:
|
||||||
|
title: "初来乍到"
|
||||||
|
description: "第一次发帖"
|
||||||
|
flavor: "祝您在Misskey玩的愉快~"
|
||||||
|
_notes10:
|
||||||
|
title: "一些帖子"
|
||||||
|
description: "发布了10篇帖子"
|
||||||
|
_notes100:
|
||||||
|
title: "很多帖子"
|
||||||
|
description: "发布了100篇帖子"
|
||||||
|
_notes500:
|
||||||
|
title: "满是帖子"
|
||||||
|
description: "发布了500篇帖子"
|
||||||
|
_notes1000:
|
||||||
|
title: "帖子成山"
|
||||||
|
description: "发布了1,000篇帖子"
|
||||||
|
_notes5000:
|
||||||
|
title: "帖如泉涌"
|
||||||
|
description: "发布了5,000篇帖子"
|
||||||
|
_notes10000:
|
||||||
|
title: "超级帖"
|
||||||
|
description: "发布了10,000篇帖子"
|
||||||
|
_notes20000:
|
||||||
|
title: "还想要更多帖子"
|
||||||
|
description: "发布了20,000篇帖子"
|
||||||
|
_notes30000:
|
||||||
|
title: "帖子帖子帖子"
|
||||||
|
description: "发布了30,000篇帖子"
|
||||||
|
_notes40000:
|
||||||
|
title: "帖子工厂"
|
||||||
|
description: "发布了40,000篇帖子"
|
||||||
|
_notes50000:
|
||||||
|
title: "帖子星球"
|
||||||
|
description: "发布了50,000篇帖子"
|
||||||
|
_notes60000:
|
||||||
|
title: "帖子类星体"
|
||||||
|
description: "发布了60,000篇帖子"
|
||||||
|
_notes70000:
|
||||||
|
title: "帖子黑洞"
|
||||||
|
description: "发布了70,000篇帖子"
|
||||||
|
_notes80000:
|
||||||
|
title: "帖子星系"
|
||||||
|
description: "发布了80,000篇帖子"
|
||||||
|
_notes90000:
|
||||||
|
title: "帖子起源"
|
||||||
|
description: "发布了90,000篇帖子"
|
||||||
|
_notes100000:
|
||||||
|
title: "ALL YOUR NOTE ARE BELONG TO US"
|
||||||
|
description: "发布了100,000篇帖子"
|
||||||
|
flavor: "真的有那么多可以写的东西吗?"
|
||||||
|
_login1000:
|
||||||
|
flavor: "感谢您使用Misskey!"
|
||||||
|
_noteFavorited1:
|
||||||
|
title: "观星者"
|
||||||
|
_markedAsCat:
|
||||||
|
title: "我是猫"
|
||||||
|
_following50:
|
||||||
|
title: "我的朋友很多"
|
||||||
|
_viewAchievements3min:
|
||||||
|
description: "盯着成就看三分钟"
|
||||||
|
_iLoveMisskey:
|
||||||
|
title: "I Love Misskey"
|
||||||
|
description: "发布\"I ❤ #Misskey\"帖子"
|
||||||
|
flavor: "感谢您使用 Misskey ! by 开发团队"
|
||||||
|
_outputHelloWorldOnScratchpad:
|
||||||
|
title: "Hello, world!"
|
||||||
|
_loggedInOnBirthday:
|
||||||
|
title: "生日快乐"
|
||||||
|
description: "在生日当天登录"
|
||||||
|
_loggedInOnNewYearsDay:
|
||||||
|
title: "恭贺新禧"
|
||||||
|
description: "在元旦登入"
|
||||||
_role:
|
_role:
|
||||||
new: "创建角色"
|
new: "创建角色"
|
||||||
edit: "编辑角色"
|
edit: "编辑角色"
|
||||||
|
@ -1587,6 +1663,7 @@ _notification:
|
||||||
pollEnded: "问卷调查结果已生成。"
|
pollEnded: "问卷调查结果已生成。"
|
||||||
unreadAntennaNote: "天线 {name}"
|
unreadAntennaNote: "天线 {name}"
|
||||||
emptyPushNotificationMessage: "推送通知已更新"
|
emptyPushNotificationMessage: "推送通知已更新"
|
||||||
|
achievementEarned: "获得成就"
|
||||||
_types:
|
_types:
|
||||||
all: "全部"
|
all: "全部"
|
||||||
follow: "关注中"
|
follow: "关注中"
|
||||||
|
|
|
@ -989,11 +989,115 @@ _achievements:
|
||||||
title: "貼文宇宙"
|
title: "貼文宇宙"
|
||||||
description: "發表了90000則貼文"
|
description: "發表了90000則貼文"
|
||||||
_notes100000:
|
_notes100000:
|
||||||
|
title: "ALL YOUR NOTE ARE BELONG TO US"
|
||||||
description: "發表了100,000則貼文"
|
description: "發表了100,000則貼文"
|
||||||
flavor: "有這麼多東西要寫嗎?"
|
flavor: "有這麼多東西要寫嗎?"
|
||||||
_login3:
|
_login3:
|
||||||
title: "初學者 I"
|
title: "初學者Ⅰ"
|
||||||
description: "總登入天數為3天"
|
description: "總登入天數為3天"
|
||||||
|
flavor: "從今天開始,我就是Misskeyist"
|
||||||
|
_login7:
|
||||||
|
title: "初學者ⅠⅠ"
|
||||||
|
description: "總登入天數為7天"
|
||||||
|
flavor: "您開始習慣了嗎?"
|
||||||
|
_login15:
|
||||||
|
title: "初學者III"
|
||||||
|
description: "總登入天數為15天"
|
||||||
|
_login30:
|
||||||
|
title: "Misskeyist Ⅰ"
|
||||||
|
description: "總登入天數為30天"
|
||||||
|
_login60:
|
||||||
|
title: "Misskeyist ⅠⅠ"
|
||||||
|
description: "總登入天數為60天"
|
||||||
|
_login100:
|
||||||
|
title: "Misskeyist ⅠⅠⅠ"
|
||||||
|
description: "總登入天數為100天"
|
||||||
|
flavor: "辣個 Misskeyist 用戶"
|
||||||
|
_login200:
|
||||||
|
title: "普通Ⅰ"
|
||||||
|
description: "總登入天數為200天"
|
||||||
|
_login300:
|
||||||
|
title: "普通IⅠ"
|
||||||
|
description: "總登入天數為300天"
|
||||||
|
_login400:
|
||||||
|
title: "普通IIⅠ"
|
||||||
|
description: "總登入天數為400天"
|
||||||
|
_login500:
|
||||||
|
title: "老兵Ⅰ"
|
||||||
|
description: "總登入天數為500天"
|
||||||
|
flavor: "諸君,我喜歡貼文"
|
||||||
|
_login600:
|
||||||
|
title: "老兵ⅠⅠ"
|
||||||
|
description: "總登入天數為600天"
|
||||||
|
_login700:
|
||||||
|
title: "老兵ⅠⅠⅠ"
|
||||||
|
description: "總登入天數為700天"
|
||||||
|
_login800:
|
||||||
|
title: "貼文大師Ⅰ"
|
||||||
|
description: "總登入天數為800天"
|
||||||
|
_login900:
|
||||||
|
title: "貼文大師ⅠⅠ"
|
||||||
|
description: "總登入天數為900天"
|
||||||
|
_login1000:
|
||||||
|
title: "貼文大師ⅠⅠⅠ"
|
||||||
|
description: "總登入天數為1,000天"
|
||||||
|
flavor: "感謝您使用Misskey!"
|
||||||
|
_followers500:
|
||||||
|
title: "基站"
|
||||||
|
description: "超過500名追隨者"
|
||||||
|
_followers1000:
|
||||||
|
title: "影響者"
|
||||||
|
description: "超過1000名追隨者"
|
||||||
|
_collectAchievements30:
|
||||||
|
title: "成就收藏家"
|
||||||
|
description: "獲得30個以上的成就"
|
||||||
|
_viewAchievements3min:
|
||||||
|
title: "喜愛成就"
|
||||||
|
description: "看成就列表要花了3分鐘以上"
|
||||||
|
_iLoveMisskey:
|
||||||
|
title: "I Love Misskey"
|
||||||
|
description: "發布「I ❤ #Misskey」"
|
||||||
|
flavor: "感謝您使用Misskey! by 開發團隊"
|
||||||
|
_client30min:
|
||||||
|
title: "休息一下"
|
||||||
|
description: "用戶端啟動已超過30分鐘"
|
||||||
|
_noteDeletedWithin1min:
|
||||||
|
title: "現在沒有"
|
||||||
|
description: "發文後1分鐘內刪文"
|
||||||
|
_postedAtLateNight:
|
||||||
|
title: "夜行性"
|
||||||
|
description: "在深夜發佈貼文"
|
||||||
|
flavor: "該去睡覺了。"
|
||||||
|
_postedAt0min0sec:
|
||||||
|
title: "報時"
|
||||||
|
description: "在0分0秒發佈貼文"
|
||||||
|
_selfQuote:
|
||||||
|
title: "自我引用"
|
||||||
|
description: "引用了自己的貼文"
|
||||||
|
_htl20npm:
|
||||||
|
title: "流動的TL"
|
||||||
|
description: "在首頁時間軸的流速超過20npm"
|
||||||
|
_outputHelloWorldOnScratchpad:
|
||||||
|
title: "Hello world!"
|
||||||
|
description: "在暫存記憶體輸出了 hello world"
|
||||||
|
_open3windows:
|
||||||
|
title: "多重視窗"
|
||||||
|
description: "開啟3個以上的視窗"
|
||||||
|
_driveFolderCircularReference:
|
||||||
|
title: "循環引用"
|
||||||
|
description: "試圖遞迴套入雲端硬碟資料夾"
|
||||||
|
_reactWithoutRead:
|
||||||
|
title: "有好好讀過嗎?"
|
||||||
|
description: "對包含100字以上內容的貼文做出情感反應"
|
||||||
|
_clickedClickHere:
|
||||||
|
title: "點擊這裡"
|
||||||
|
description: "已點擊這裡了"
|
||||||
|
_justPlainLucky:
|
||||||
|
title: "只是運氣好"
|
||||||
|
description: "每10秒有0.01%的機率獲得"
|
||||||
|
_setNameToSyuilo:
|
||||||
|
title: "神的情結"
|
||||||
|
description: "將名稱設定為 syuilo"
|
||||||
_role:
|
_role:
|
||||||
new: "建立角色"
|
new: "建立角色"
|
||||||
edit: "編輯角色"
|
edit: "編輯角色"
|
||||||
|
|
|
@ -54,11 +54,11 @@
|
||||||
"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.48.1",
|
"@typescript-eslint/eslint-plugin": "5.48.2",
|
||||||
"@typescript-eslint/parser": "5.48.1",
|
"@typescript-eslint/parser": "5.48.2",
|
||||||
"cross-env": "7.0.3",
|
"cross-env": "7.0.3",
|
||||||
"cypress": "12.3.0",
|
"cypress": "12.3.0",
|
||||||
"eslint": "^8.31.0",
|
"eslint": "^8.32.0",
|
||||||
"start-server-and-test": "1.15.2"
|
"start-server-and-test": "1.15.2"
|
||||||
},
|
},
|
||||||
"optionalDependencies": {
|
"optionalDependencies": {
|
||||||
|
|
|
@ -58,9 +58,9 @@
|
||||||
"date-fns": "2.29.3",
|
"date-fns": "2.29.3",
|
||||||
"deep-email-validator": "0.1.21",
|
"deep-email-validator": "0.1.21",
|
||||||
"escape-regexp": "0.0.1",
|
"escape-regexp": "0.0.1",
|
||||||
"fastify": "4.11.0",
|
"fastify": "4.12.0",
|
||||||
"feed": "4.2.2",
|
"feed": "4.2.2",
|
||||||
"file-type": "18.1.0",
|
"file-type": "18.2.0",
|
||||||
"fluent-ffmpeg": "2.1.2",
|
"fluent-ffmpeg": "2.1.2",
|
||||||
"form-data": "^4.0.0",
|
"form-data": "^4.0.0",
|
||||||
"got": "12.5.3",
|
"got": "12.5.3",
|
||||||
|
@ -89,7 +89,7 @@
|
||||||
"probe-image-size": "7.2.3",
|
"probe-image-size": "7.2.3",
|
||||||
"promise-limit": "2.7.0",
|
"promise-limit": "2.7.0",
|
||||||
"pug": "3.0.2",
|
"pug": "3.0.2",
|
||||||
"punycode": "2.2.0",
|
"punycode": "2.3.0",
|
||||||
"pureimage": "0.3.15",
|
"pureimage": "0.3.15",
|
||||||
"qrcode": "1.5.1",
|
"qrcode": "1.5.1",
|
||||||
"random-seed": "0.3.0",
|
"random-seed": "0.3.0",
|
||||||
|
@ -120,7 +120,7 @@
|
||||||
"typeorm": "0.3.11",
|
"typeorm": "0.3.11",
|
||||||
"typescript": "4.9.4",
|
"typescript": "4.9.4",
|
||||||
"ulid": "2.3.0",
|
"ulid": "2.3.0",
|
||||||
"undici": "^5.15.0",
|
"undici": "^5.15.1",
|
||||||
"unzipper": "0.10.11",
|
"unzipper": "0.10.11",
|
||||||
"uuid": "9.0.0",
|
"uuid": "9.0.0",
|
||||||
"vary": "1.1.2",
|
"vary": "1.1.2",
|
||||||
|
@ -132,7 +132,7 @@
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@redocly/openapi-core": "1.0.0-beta.120",
|
"@redocly/openapi-core": "1.0.0-beta.120",
|
||||||
"@swc/cli": "^0.1.59",
|
"@swc/cli": "^0.1.59",
|
||||||
"@swc/core": "1.3.26",
|
"@swc/core": "1.3.27",
|
||||||
"@swc/jest": "0.2.24",
|
"@swc/jest": "0.2.24",
|
||||||
"@types/accepts": "1.3.5",
|
"@types/accepts": "1.3.5",
|
||||||
"@types/archiver": "5.3.1",
|
"@types/archiver": "5.3.1",
|
||||||
|
@ -144,7 +144,7 @@
|
||||||
"@types/escape-regexp": "0.0.1",
|
"@types/escape-regexp": "0.0.1",
|
||||||
"@types/fluent-ffmpeg": "2.1.20",
|
"@types/fluent-ffmpeg": "2.1.20",
|
||||||
"@types/ioredis": "4.28.10",
|
"@types/ioredis": "4.28.10",
|
||||||
"@types/jest": "29.2.5",
|
"@types/jest": "29.2.6",
|
||||||
"@types/js-yaml": "4.0.5",
|
"@types/js-yaml": "4.0.5",
|
||||||
"@types/jsdom": "20.0.1",
|
"@types/jsdom": "20.0.1",
|
||||||
"@types/jsonld": "1.5.8",
|
"@types/jsonld": "1.5.8",
|
||||||
|
@ -176,11 +176,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.48.1",
|
"@typescript-eslint/eslint-plugin": "5.48.2",
|
||||||
"@typescript-eslint/parser": "5.48.1",
|
"@typescript-eslint/parser": "5.48.2",
|
||||||
"cross-env": "7.0.3",
|
"cross-env": "7.0.3",
|
||||||
"eslint": "8.31.0",
|
"eslint": "8.32.0",
|
||||||
"eslint-plugin-import": "2.27.4",
|
"eslint-plugin-import": "2.27.5",
|
||||||
"execa": "6.1.0",
|
"execa": "6.1.0",
|
||||||
"jest": "29.3.1",
|
"jest": "29.3.1",
|
||||||
"jest-mock": "^29.3.1",
|
"jest-mock": "^29.3.1",
|
||||||
|
|
|
@ -22,7 +22,7 @@ export class EmojiEntityService {
|
||||||
@bindThis
|
@bindThis
|
||||||
public async pack(
|
public async pack(
|
||||||
src: Emoji['id'] | Emoji,
|
src: Emoji['id'] | Emoji,
|
||||||
opts: { omitHost?: boolean; omitId?: boolean; } = {},
|
opts: { omitHost?: boolean; omitId?: boolean; withUrl?: boolean; } = {},
|
||||||
): Promise<Packed<'Emoji'>> {
|
): Promise<Packed<'Emoji'>> {
|
||||||
const emoji = typeof src === 'object' ? src : await this.emojisRepository.findOneByOrFail({ id: src });
|
const emoji = typeof src === 'object' ? src : await this.emojisRepository.findOneByOrFail({ id: src });
|
||||||
|
|
||||||
|
@ -32,13 +32,15 @@ export class EmojiEntityService {
|
||||||
name: emoji.name,
|
name: emoji.name,
|
||||||
category: emoji.category,
|
category: emoji.category,
|
||||||
host: opts.omitHost ? undefined : emoji.host,
|
host: opts.omitHost ? undefined : emoji.host,
|
||||||
|
// ?? emoji.originalUrl してるのは後方互換性のため
|
||||||
|
url: opts.withUrl ? (emoji.publicUrl ?? emoji.originalUrl) : undefined,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
@bindThis
|
@bindThis
|
||||||
public packMany(
|
public packMany(
|
||||||
emojis: any[],
|
emojis: any[],
|
||||||
opts: { omitHost?: boolean; omitId?: boolean; } = {},
|
opts: { omitHost?: boolean; omitId?: boolean; withUrl?: boolean; } = {},
|
||||||
) {
|
) {
|
||||||
return Promise.all(emojis.map(x => this.pack(x, opts)));
|
return Promise.all(emojis.map(x => this.pack(x, opts)));
|
||||||
}
|
}
|
||||||
|
|
|
@ -29,5 +29,9 @@ export const packedEmojiSchema = {
|
||||||
optional: true, nullable: true,
|
optional: true, nullable: true,
|
||||||
description: 'The local host is represented with `null`.',
|
description: 'The local host is represented with `null`.',
|
||||||
},
|
},
|
||||||
|
url: {
|
||||||
|
type: 'string',
|
||||||
|
optional: true, nullable: false,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
} as const;
|
} as const;
|
||||||
|
|
|
@ -83,6 +83,7 @@ export default class extends Endpoint<typeof meta, typeof paramDef> {
|
||||||
emojis: await this.emojiEntityService.packMany(emojis, {
|
emojis: await this.emojiEntityService.packMany(emojis, {
|
||||||
omitId: true,
|
omitId: true,
|
||||||
omitHost: true,
|
omitHost: true,
|
||||||
|
withUrl: true,
|
||||||
}),
|
}),
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
|
|
|
@ -8,7 +8,7 @@
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@discordapp/twemoji": "14.0.2",
|
"@discordapp/twemoji": "14.0.2",
|
||||||
"@rollup/plugin-alias": "4.0.2",
|
"@rollup/plugin-alias": "4.0.3",
|
||||||
"@rollup/plugin-json": "6.0.0",
|
"@rollup/plugin-json": "6.0.0",
|
||||||
"@rollup/pluginutils": "5.0.2",
|
"@rollup/pluginutils": "5.0.2",
|
||||||
"@syuilo/aiscript": "0.12.2",
|
"@syuilo/aiscript": "0.12.2",
|
||||||
|
@ -18,10 +18,10 @@
|
||||||
"autobind-decorator": "2.4.0",
|
"autobind-decorator": "2.4.0",
|
||||||
"autosize": "5.0.2",
|
"autosize": "5.0.2",
|
||||||
"blurhash": "2.0.4",
|
"blurhash": "2.0.4",
|
||||||
"broadcast-channel": "4.20.1",
|
"broadcast-channel": "4.20.2",
|
||||||
"browser-image-resizer": "git+https://github.com/misskey-dev/browser-image-resizer#v2.2.1-misskey.3",
|
"browser-image-resizer": "git+https://github.com/misskey-dev/browser-image-resizer#v2.2.1-misskey.3",
|
||||||
"canvas-confetti": "^1.6.0",
|
"canvas-confetti": "^1.6.0",
|
||||||
"chart.js": "4.1.2",
|
"chart.js": "4.2.0",
|
||||||
"chartjs-adapter-date-fns": "3.0.0",
|
"chartjs-adapter-date-fns": "3.0.0",
|
||||||
"chartjs-chart-matrix": "^1.3.0",
|
"chartjs-chart-matrix": "^1.3.0",
|
||||||
"chartjs-plugin-gradient": "0.6.1",
|
"chartjs-plugin-gradient": "0.6.1",
|
||||||
|
@ -41,10 +41,10 @@
|
||||||
"misskey-js": "0.0.14",
|
"misskey-js": "0.0.14",
|
||||||
"photoswipe": "5.3.4",
|
"photoswipe": "5.3.4",
|
||||||
"prismjs": "1.29.0",
|
"prismjs": "1.29.0",
|
||||||
"punycode": "2.2.0",
|
"punycode": "2.3.0",
|
||||||
"querystring": "0.2.1",
|
"querystring": "0.2.1",
|
||||||
"rndstr": "1.0.0",
|
"rndstr": "1.0.0",
|
||||||
"rollup": "3.10.0",
|
"rollup": "3.10.1",
|
||||||
"s-age": "1.1.2",
|
"s-age": "1.1.2",
|
||||||
"sanitize-html": "^2.8.1",
|
"sanitize-html": "^2.8.1",
|
||||||
"sass": "1.57.1",
|
"sass": "1.57.1",
|
||||||
|
@ -69,7 +69,7 @@
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@types/escape-regexp": "0.0.1",
|
"@types/escape-regexp": "0.0.1",
|
||||||
"@types/glob": "8.0.0",
|
"@types/glob": "8.0.1",
|
||||||
"@types/gulp": "4.0.10",
|
"@types/gulp": "4.0.10",
|
||||||
"@types/gulp-rename": "2.0.1",
|
"@types/gulp-rename": "2.0.1",
|
||||||
"@types/matter-js": "0.18.2",
|
"@types/matter-js": "0.18.2",
|
||||||
|
@ -82,13 +82,13 @@
|
||||||
"@types/uuid": "9.0.0",
|
"@types/uuid": "9.0.0",
|
||||||
"@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.48.1",
|
"@typescript-eslint/eslint-plugin": "5.48.2",
|
||||||
"@typescript-eslint/parser": "5.48.1",
|
"@typescript-eslint/parser": "5.48.2",
|
||||||
"@vue/runtime-core": "3.2.45",
|
"@vue/runtime-core": "3.2.45",
|
||||||
"cross-env": "7.0.3",
|
"cross-env": "7.0.3",
|
||||||
"cypress": "12.3.0",
|
"cypress": "12.3.0",
|
||||||
"eslint": "8.31.0",
|
"eslint": "8.32.0",
|
||||||
"eslint-plugin-import": "2.27.4",
|
"eslint-plugin-import": "2.27.5",
|
||||||
"eslint-plugin-vue": "9.9.0",
|
"eslint-plugin-vue": "9.9.0",
|
||||||
"start-server-and-test": "1.15.2",
|
"start-server-and-test": "1.15.2",
|
||||||
"vue-eslint-parser": "^9.1.0",
|
"vue-eslint-parser": "^9.1.0",
|
||||||
|
|
|
@ -12,6 +12,7 @@ import { getStaticImageUrl } from '@/scripts/media-proxy';
|
||||||
import { char2twemojiFilePath, char2fluentEmojiFilePath } from '@/scripts/emoji-base';
|
import { char2twemojiFilePath, char2fluentEmojiFilePath } from '@/scripts/emoji-base';
|
||||||
import { defaultStore } from '@/store';
|
import { defaultStore } from '@/store';
|
||||||
import { getEmojiName } from '@/scripts/emojilist';
|
import { getEmojiName } from '@/scripts/emojilist';
|
||||||
|
import { customEmojis } from '@/custom-emojis';
|
||||||
|
|
||||||
const props = defineProps<{
|
const props = defineProps<{
|
||||||
emoji: string;
|
emoji: string;
|
||||||
|
@ -30,6 +31,9 @@ const useOsNativeEmojis = computed(() => defaultStore.state.emojiStyle === 'nati
|
||||||
const url = computed(() => {
|
const url = computed(() => {
|
||||||
if (char.value) {
|
if (char.value) {
|
||||||
return char2path(char.value);
|
return char2path(char.value);
|
||||||
|
} else if (props.host == null) {
|
||||||
|
const found = customEmojis.find(x => x.name === customEmojiName);
|
||||||
|
return found ? found.url : null;
|
||||||
} else {
|
} else {
|
||||||
const rawUrl = props.host ? `/emoji/${customEmojiName}@${props.host}.webp` : `/emoji/${customEmojiName}.webp`;
|
const rawUrl = props.host ? `/emoji/${customEmojiName}@${props.host}.webp` : `/emoji/${customEmojiName}.webp`;
|
||||||
return defaultStore.state.disableShowingAnimatedImages
|
return defaultStore.state.disableShowingAnimatedImages
|
||||||
|
@ -38,7 +42,7 @@ const url = computed(() => {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
const alt = computed(() => isCustom.value ? `:${customEmojiName}:` : char.value);
|
const alt = computed(() => isCustom.value ? `:${customEmojiName}:` : char.value);
|
||||||
let errored = $ref(false);
|
let errored = $ref(isCustom.value && url.value == null);
|
||||||
|
|
||||||
// Searching from an array with 2000 items for every emoji felt like too energy-consuming, so I decided to do it lazily on pointerenter
|
// Searching from an array with 2000 items for every emoji felt like too energy-consuming, so I decided to do it lazily on pointerenter
|
||||||
function computeTitle(event: PointerEvent): void {
|
function computeTitle(event: PointerEvent): void {
|
||||||
|
|
|
@ -2,14 +2,17 @@ import { api } from './os';
|
||||||
import { miLocalStorage } from './local-storage';
|
import { miLocalStorage } from './local-storage';
|
||||||
|
|
||||||
const storageCache = miLocalStorage.getItem('emojis');
|
const storageCache = miLocalStorage.getItem('emojis');
|
||||||
export let customEmojis = storageCache ? JSON.parse(storageCache) : [];
|
export let customEmojis: {
|
||||||
|
name: string;
|
||||||
fetchCustomEmojis();
|
aliases: string[];
|
||||||
|
category: string;
|
||||||
|
url: string;
|
||||||
|
}[] = storageCache ? JSON.parse(storageCache) : [];
|
||||||
|
|
||||||
export async function fetchCustomEmojis() {
|
export async function fetchCustomEmojis() {
|
||||||
const now = Date.now();
|
const now = Date.now();
|
||||||
const lastFetchedAt = miLocalStorage.getItem('lastEmojisFetchedAt');
|
const lastFetchedAt = miLocalStorage.getItem('lastEmojisFetchedAt');
|
||||||
if (lastFetchedAt && (now - parseInt(lastFetchedAt)) < 1000 * 60 * 60) return;
|
if (lastFetchedAt && (now - parseInt(lastFetchedAt)) < 1000 * 60 * 60 * 24) return;
|
||||||
|
|
||||||
const res = await api('emojis', {});
|
const res = await api('emojis', {});
|
||||||
|
|
||||||
|
|
|
@ -45,6 +45,7 @@ import { getUrlWithoutLoginId } from '@/scripts/login-id';
|
||||||
import { getAccountFromId } from '@/scripts/get-account-from-id';
|
import { getAccountFromId } from '@/scripts/get-account-from-id';
|
||||||
import { miLocalStorage } from './local-storage';
|
import { miLocalStorage } from './local-storage';
|
||||||
import { claimAchievement, claimedAchievements } from './scripts/achievements';
|
import { claimAchievement, claimedAchievements } from './scripts/achievements';
|
||||||
|
import { fetchCustomEmojis } from './custom-emojis';
|
||||||
|
|
||||||
(async () => {
|
(async () => {
|
||||||
console.info(`Misskey v${version}`);
|
console.info(`Misskey v${version}`);
|
||||||
|
@ -80,6 +81,19 @@ import { claimAchievement, claimedAchievements } from './scripts/achievements';
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//#region Detect language & fetch translations
|
||||||
|
const localeVersion = miLocalStorage.getItem('localeVersion');
|
||||||
|
const localeOutdated = (localeVersion == null || localeVersion !== version);
|
||||||
|
if (localeOutdated) {
|
||||||
|
const res = await window.fetch(`/assets/locales/${lang}.${version}.json`);
|
||||||
|
if (res.status === 200) {
|
||||||
|
miLocalStorage.setItem('locale', await res.text());
|
||||||
|
miLocalStorage.setItem('localeVersion', version);
|
||||||
|
location.reload();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//#endregion
|
||||||
|
|
||||||
// タッチデバイスでCSSの:hoverを機能させる
|
// タッチデバイスでCSSの:hoverを機能させる
|
||||||
document.addEventListener('touchend', () => {}, { passive: true });
|
document.addEventListener('touchend', () => {}, { passive: true });
|
||||||
|
|
||||||
|
@ -165,6 +179,10 @@ import { claimAchievement, claimedAchievements } from './scripts/achievements';
|
||||||
initializeSw();
|
initializeSw();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
try {
|
||||||
|
await fetchCustomEmojis();
|
||||||
|
} catch (err) {}
|
||||||
|
|
||||||
const app = createApp(
|
const app = createApp(
|
||||||
window.location.search === '?zen' ? defineAsyncComponent(() => import('@/ui/zen.vue')) :
|
window.location.search === '?zen' ? defineAsyncComponent(() => import('@/ui/zen.vue')) :
|
||||||
!$i ? defineAsyncComponent(() => import('@/ui/visitor.vue')) :
|
!$i ? defineAsyncComponent(() => import('@/ui/visitor.vue')) :
|
||||||
|
|
|
@ -19,6 +19,7 @@ type Keys =
|
||||||
'fontSize' |
|
'fontSize' |
|
||||||
'ui' |
|
'ui' |
|
||||||
'locale' |
|
'locale' |
|
||||||
|
'localeVersion' |
|
||||||
'theme' |
|
'theme' |
|
||||||
'customCss' |
|
'customCss' |
|
||||||
'message_drafts' |
|
'message_drafts' |
|
||||||
|
|
|
@ -433,16 +433,22 @@ export const ACHIEVEMENT_BADGES = {
|
||||||
|
|
||||||
export const claimedAchievements = ($i && $i.achievements) ? $i.achievements.map(x => x.name) : [];
|
export const claimedAchievements = ($i && $i.achievements) ? $i.achievements.map(x => x.name) : [];
|
||||||
|
|
||||||
export function claimAchievement(type: typeof ACHIEVEMENT_TYPES[number]) {
|
const claimingQueue = new Set<string>();
|
||||||
|
|
||||||
|
export async function claimAchievement(type: typeof ACHIEVEMENT_TYPES[number]) {
|
||||||
if (claimedAchievements.includes(type)) return;
|
if (claimedAchievements.includes(type)) return;
|
||||||
os.api('i/claim-achievement', { name: type });
|
claimingQueue.add(type);
|
||||||
claimedAchievements.push(type);
|
claimedAchievements.push(type);
|
||||||
|
await new Promise(resolve => setTimeout(resolve, (claimingQueue.size - 1) * 500));
|
||||||
|
window.setTimeout(() => {
|
||||||
|
claimingQueue.delete(type);
|
||||||
|
}, 500);
|
||||||
|
os.api('i/claim-achievement', { name: type });
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_DEV_) {
|
if (_DEV_) {
|
||||||
(window as any).unlockAllAchievements = async () => {
|
(window as any).unlockAllAchievements = () => {
|
||||||
for (const t of ACHIEVEMENT_TYPES) {
|
for (const t of ACHIEVEMENT_TYPES) {
|
||||||
await new Promise(resolve => setTimeout(resolve, 100));
|
|
||||||
claimAchievement(t);
|
claimAchievement(t);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
516
pnpm-lock.yaml
516
pnpm-lock.yaml
File diff suppressed because it is too large
Load diff
Loading…
Reference in a new issue