', itd."
objectStorageBucket: "Bucket"
objectStorageBucketDesc: "Podaj nazwę „wiadra” używaną przez konfigurowaną usługę."
objectStoragePrefix: "Prefiks"
@@ -492,9 +541,13 @@ objectStorageUseSSL: "Użyj SSL"
objectStorageUseSSLDesc: "Wyłącz, jeżeli nie zamierzasz używać HTTPS dla połączenia z API"
objectStorageUseProxy: "Połącz przez proxy"
objectStorageUseProxyDesc: "Wyłącz, jeżeli nie zamierzasz używać proxy dla połączenia z pamięcią blokową"
+objectStorageSetPublicRead: "Ustaw opcję \"public-read\" przy przesyłaniu"
+s3ForcePathStyleDesc: "Jeśli opcja s3ForcePathStyle jest włączona, nazwa Bucket'u musi być zawarta w ścieżce adresu URL, a nie w nazwie hosta adresu URL. Włączenie tego ustawienia może być konieczne w przypadku użycia usług takich jak self-hosted instancja Minio."
serverLogs: "Dziennik zdarzeń"
deleteAll: "Usuń wszystkie"
showFixedPostForm: "Wyświetlaj formularz tworzenia wpisu w górnej części osi czasu"
+showFixedPostFormInChannel: "Wyświetl formularz postowania w górnej części osi czasu (Kanały)"
+withRepliesByDefaultForNewlyFollowed: "Domyślnie uwzględnij odpowiedzi nowo obserwowanych użytkowników w osi czasu"
newNoteRecived: "Masz nowy wpis"
sounds: "Dźwięk"
sound: "Dźwięki"
@@ -504,6 +557,8 @@ showInPage: "Pokaż na stronie"
popout: "Popout"
volume: "Głośność"
masterVolume: "Głośność główna"
+notUseSound: "Wyłącz dźwięk"
+useSoundOnlyWhenActive: "Puszczaj dźwięki tylko, gdy Misskey jest aktywne."
details: "Szczegóły"
chooseEmoji: "Wybierz emoji"
unableToProcess: "Nie udało się dokończyć działania."
@@ -524,6 +579,10 @@ output: "Wyjście"
script: "Skrypt"
disablePagesScript: "Wyłącz AiScript na Stronach"
updateRemoteUser: "Aktualizuj zdalne dane o użytkowniku"
+unsetUserAvatar: "Usuń awatar"
+unsetUserAvatarConfirm: "Czy na pewno chcesz usunąć awatar tego użytkownika?"
+unsetUserBanner: "Usuń baner"
+unsetUserBannerConfirm: "Czy na pewno chcesz usunąć baner?"
deleteAllFiles: "Usuń wszystkie pliki"
deleteAllFilesConfirm: "Czy na pewno chcesz usunąć wszystkie pliki?"
removeAllFollowing: "Przestań obserwować"
@@ -539,6 +598,7 @@ accountDeletedDescription: "Opis konta usuniętego"
menu: "Menu"
divider: "Rozdzielacz"
addItem: "Dodaj element"
+rearrange: "Posortuj"
relays: "Przekaźniki"
addRelay: "Dodaj przekaźnik"
inboxUrl: "Adres URL skrzynki nadawczej"
@@ -573,6 +633,7 @@ medium: "Średnie"
small: "Małe"
generateAccessToken: "Generuj token dostępu"
permission: "Uprawnienia"
+adminPermission: "Uprawnienia administracyjne"
enableAll: "Włącz wszystko"
disableAll: "Wyłącz wszystko"
tokenRequested: "Przydziel dostęp do konta"
@@ -590,9 +651,12 @@ smtpPort: "Port"
smtpUser: "Nazwa użytkownika"
smtpPass: "Hasło"
emptyToDisableSmtpAuth: "Pozostaw adres e-mail i hasło puste, aby wyłączyć weryfikację SMTP"
+smtpSecure: "Użyj niejawnego SSL/TLS dla połączeń SMTP"
smtpSecureInfo: "Wyłącz, jeżeli używasz STARTTLS"
testEmail: "Przetestuj dostarczanie wiadomości e-mail"
wordMute: "Wyciszenie słowa"
+regexpError: "Błąd wyrażenia regularnego"
+regexpErrorDescription: "Wystąpił błąd w wyrażeniu regularnym w linii {line} twoich {tab} wyciszeń:"
instanceMute: "Wyciszone instancje"
userSaysSomething: "{name} powiedział(-a) coś"
makeActive: "Aktywuj"
@@ -612,18 +676,22 @@ useGlobalSettingDesc: "Jeżeli włączone, zostaną wykorzystane ustawienia powi
other: "Inne"
regenerateLoginToken: "Generuj token logowania ponownie"
regenerateLoginTokenDescription: "Regeneruje token używany wewnętrznie podczas logowania. Zazwyczaj nie jest to konieczne. Po regeneracji wszystkie urządzenia zostaną wylogowane."
+theKeywordWhenSearchingForCustomEmoji: "To jest słowo kluczowe używane podczas wyszukiwania customowych Emoji."
setMultipleBySeparatingWithSpace: "Możesz ustawić wiele, oddzielając je spacjami."
fileIdOrUrl: "ID pliku albo URL"
behavior: "Zachowanie"
sample: "Przykład"
abuseReports: "Zgłoszenia"
reportAbuse: "Zgłoś"
+reportAbuseRenote: "Zgłoś renote"
reportAbuseOf: "Zgłoś {name}"
fillAbuseReportDescription: "Wypełnij szczegóły zgłoszenia. Jeżeli dotyczy ono określonego wpisu, uwzględnij jego adres URL."
abuseReported: "Twoje zgłoszenie zostało wysłane. Dziękujemy."
+reporter: "Zgłaszający"
reporteeOrigin: "Pochodzenie zgłoszonego"
reporterOrigin: "Pochodzenie zgłaszającego"
forwardReport: "Przekaż zgłoszenie do innej instancji"
+forwardReportIsAnonymous: "Zamiast twojego konta, anonimowe konto systemowe będzie wyświetlone jako zgłaszający na instancji zdalnej."
send: "Wyślij"
abuseMarkAsResolved: "Oznacz zgłoszenie jako rozwiązane"
openInNewTab: "Otwórz w nowej karcie"
@@ -668,6 +736,7 @@ lockedAccountInfo: "Dopóki nie ustawisz widoczności wpisu na \"Obserwujący\",
alwaysMarkSensitive: "Oznacz domyślnie jako NSFW"
loadRawImages: "Wyświetlaj zdjęcia w załącznikach w całości zamiast miniatur"
disableShowingAnimatedImages: "Nie odtwarzaj animowanych obrazów"
+highlightSensitiveMedia: "Podkreśl wrażliwą zawartość"
verificationEmailSent: "Wiadomość weryfikacyjna została wysłana. Odwiedź uwzględniony odnośnik, aby ukończyć weryfikację."
notSet: "Nie ustawiono"
emailVerified: "Adres e-mail został potwierdzony"
@@ -678,6 +747,8 @@ contact: "Kontakt"
useSystemFont: "Używaj domyślnej czcionki systemu"
clips: "Klipy"
experimentalFeatures: "Eksperymentalne funkcje"
+experimental: "Eksperymentalne"
+thisIsExperimentalFeature: "Ta funkcja jest eksperymentalna. Jej funkcjonalność może ulec zmianie, i może ona nie funkcjonować tak, jak zamierzono."
developer: "Programista"
makeExplorable: "Pokazuj konto na stronie „Eksploruj”"
makeExplorableDescription: "Jeżeli wyłączysz tę opcję, Twoje konto nie będzie wyświetlać się w sekcji „Eksploruj”."
@@ -695,12 +766,14 @@ onlineUsersCount: "{n} osób jest online"
nUsers: "{n} użytkowników"
nNotes: "{n} wpisów"
sendErrorReports: "Wyślij raporty o błędach"
+sendErrorReportsDescription: "Gdy włączone, jeśli wystąpi problem, szczegółowe informacje o błędach będą udostępniane Misskey, pomagając ulepszyć jakość Misskey.\nBędzie to zawierało informacje takie jak wersja twojego systemu operacyjnego, jakiej przeglądarki używasz, twoja aktywność w Misskey, itd."
myTheme: "Mój motyw"
backgroundColor: "Tło"
accentColor: "Akcent"
textColor: "Tekst"
saveAs: "Zapisz jako…"
advanced: "Zaawansowane"
+advancedSettings: "Zaawansowane ustawienia"
value: "Wartość"
createdAt: "Utworzono"
updatedAt: "Zaktualizowano"
@@ -760,12 +833,14 @@ noMaintainerInformationWarning: "Informacje o administratorze nie są skonfiguro
noBotProtectionWarning: "Zabezpieczenie przed botami nie jest skonfigurowane."
configure: "Skonfiguruj"
postToGallery: "Opublikuj w galerii"
+postToHashtag: "Postuj do tego hashtagu"
gallery: "Galeria"
recentPosts: "Ostatnie wpisy"
popularPosts: "Popularne wpisy"
shareWithNote: "Udostępnij z wpisem"
ads: "Reklamy"
expiration: "Ankieta kończy się"
+startingperiod: "Początek"
memo: "Notatki"
priority: "Priorytet"
high: "Wysoki"
@@ -792,13 +867,19 @@ translatedFrom: "Przetłumaczone z {x}"
accountDeletionInProgress: "Trwa usuwanie konta"
usernameInfo: "Nazwa, która identyfikuje Twoje konto spośród innych na tym serwerze. Możesz użyć alfabetu (a~z, A~Z), cyfr (0~9) lub podkreślników (_). Nazwy użytkownika nie mogą być później zmieniane."
aiChanMode: "Tryb Ai"
+devMode: "Tryb programisty"
keepCw: "Zostaw ostrzeżenia o zawartości"
pubSub: "Konta Pub/Sub"
+lastCommunication: "Ostatnia komunikacja"
resolved: "Rozwiązane"
unresolved: "Nierozwiązane"
breakFollow: "Usuń obserwującego"
+breakFollowConfirm: "Czy na pewno usunąć tego obserwującego?"
itsOn: "Włączone"
itsOff: "Wyłączone"
+on: "Włączone"
+off: "Wyłączone"
+emailRequiredForSignup: "Wymagaj adresu e-mail do rejestracji"
unread: "Nieodczytane"
filter: "Filtr"
controlPanel: "Panel sterowania"
@@ -808,6 +889,8 @@ makeReactionsPublicDescription: "To spowoduje, że lista wszystkich Twoich dotyc
classic: "Klasyczny"
muteThread: "Wycisz wątek"
unmuteThread: "Wyłącz wyciszenie wątku"
+followingVisibility: "Widoczność obserwacji"
+followersVisibility: "Widoczność obserwujących"
continueThread: "Pokaż kontynuację wątku"
deleteAccountConfirm: "Spowoduje to nieodwracalne usunięcie Twojego konta. Kontynuować?"
incorrectPassword: "Nieprawidłowe hasło."
@@ -820,9 +903,14 @@ overridedDeviceKind: "Typ urządzenia"
smartphone: "Smartfon"
tablet: "Tablet"
auto: "Automatycznie"
+themeColor: "Motyw kolorystyczny"
size: "Rozmiar"
numberOfColumn: "Liczba kolumn"
searchByGoogle: "Szukaj"
+instanceDefaultLightTheme: "Domyślny motyw dla trybu jasnego"
+instanceDefaultDarkTheme: "Domyślny motyw dla trybu ciemnego"
+instanceDefaultThemeDescription: "Opis domyślnego motywu instancji"
+mutePeriod: "Okres wyciszenia"
period: "Ankieta kończy się"
indefinitely: "Nigdy"
tenMinutes: "10 minut"
@@ -831,29 +919,50 @@ oneDay: "1 dzień"
oneWeek: "1 tydzień"
oneMonth: "jeden miesiąc"
failedToFetchAccountInformation: "Nie udało się uzyskać informacji o koncie"
+rateLimitExceeded: "Limit szybkości przekroczony"
+cropImage: "Przytnij obraz"
+cropImageAsk: "Czy chcesz przyciąć obrazek?"
+cropYes: "Tak, przytnij"
+cropNo: "Nie chce przycinać"
file: "Pliki"
+recentNHours: "W ciągu ostatnich {n} godzin"
+recentNDays: "W ciągu ostatnich {n} dni"
+noEmailServerWarning: "Serwer Email nie jest skonfigurowany"
recommended: "Zalecane"
check: "Zweryfikuj"
+driveCapOverrideLabel: "Zmień limit pojemności dysku użytkownika"
+requireAdminForView: "Aby to zobaczyć, musisz być administratorem"
+isSystemAccount: "To jest konto stworzone i zarządzane przez system"
+typeToConfirm: "Wielki chuj "
deleteAccount: "Usuń konto"
document: "Dokumentacja"
numberOfPageCache: "Ilość stron w cache"
+numberOfPageCacheDescription: "Zwiększenie tej liczby polepszy wygodę, ale spowoduje większe obciążenie jako użycie pamięci na urządzeniu użytkownika."
logoutConfirm: "Czy na pewno chcesz się wylogować?"
lastActiveDate: "Ostatnio użyte w"
statusbar: "Pasek stanu"
pleaseSelect: "Wybierz opcję"
reverse: "Odwróć"
colored: "Kolorowe"
+refreshInterval: "Okres aktualizacji"
label: "Etykieta"
type: "Typ"
speed: "Prędkość"
+slow: "Wolny"
+fast: "Szybki"
+sensitiveMediaDetection: "Detekcja wrażliwej zawartości"
localOnly: "Lokalne tylko"
+remoteOnly: "Tylko zdalne instancje"
failedToUpload: "Przesyłanie nie powiodło się"
cannotUploadBecauseInappropriate: "Nie można przesłać tego pliku, ponieważ jego części zostały wykryte jako potencjalnie nieodpowiednie."
cannotUploadBecauseNoFreeSpace: "Przesyłanie nie powiodło się z powodu braku miejsca na dysku."
+cannotUploadBecauseExceedsFileSizeLimit: "Nie można przesłać pliku, ponieważ wykracza on poza limit wielkości pliku."
beta: "Beta"
enableAutoSensitive: "Automatyczne oznaczanie NSFW"
enableAutoSensitiveDescription: "Umożliwia automatyczne wykrywanie i oznaczanie zawartości NSFW za pomocą uczenia maszynowego. Nawet jeśli ta opcja jest wyłączona, może być włączona w całej instancji."
+activeEmailValidationDescription: "Włącza bardziej restrykcyjną walidację adresów e-mail, co obejmuje sprawdzanie adresów jednorazowych i czy komunikacja z tym adresem jest możliwa. Gdy wyłączone, tylko format adresu e-mail jest sprawdzany."
navbar: "Pasek nawigacyjny"
+shuffle: "Mieszaj"
account: "Konta"
move: "Przenieś"
pushNotification: "Powiadomienia"
@@ -863,22 +972,70 @@ pushNotificationAlreadySubscribed: "Powiadomienia push są włączone"
pushNotificationNotSupported: "Przeglądarka lub instancja nie obsługuje powiadomień push"
sendPushNotificationReadMessage: "Usuń powiadomienia push po przeczytaniu powiadomień i wiadomości."
sendPushNotificationReadMessageCaption: "Chwilowo pojawi się powiadomienie \"{emptyPushNotificationMessage}\". Może wzrosnąć zużycie baterii urządzenia."
+windowMaximize: "Maksymalizuj"
+windowMinimize: "Minimalizuj"
+windowRestore: "Przywróć"
+caption: "Legenda"
loggedInAsBot: "Jesteś obecnie zalogowany/a jako bot"
+tools: "Narzędzia"
+cannotLoad: "Nie można wczytać"
+numberOfProfileView: "Wyświetlenia profilu"
like: "Polub"
+unlike: "Usuń polubienie"
+numberOfLikes: "Liczba polubień"
show: "Wyświetlanie"
+neverShow: "Nie pokazuj ponownie"
+remindMeLater: "Przypomnij później"
+didYouLikeMisskey: "Czy Misskey się tobie spodobało?"
+pleaseDonate: "{host} używa darmowego oprogramowania — Misskey. Bylibyśmy bardzo wdzięczni za datki, które pozwolą na kontynuację rozwoju Misskey!"
+correspondingSourceIsAvailable: "Odpowiedni kod źródłowy jest dostępny pod {anchor}."
+roles: "Role"
+role: "Rola"
+noRole: "Rola nie znaleziona"
+normalUser: "Normalny użytkownik"
+undefined: "Niezdefiniowane"
+assign: "Przydziel"
+unassign: "Cofnij przydzielenie"
color: "Kolor"
+manageCustomEmojis: "Zarządzaj niestandardowymi Emoji"
+manageAvatarDecorations: "Zarządzaj dekoracjami awatara"
+invalidParamError: "Błąd parametrów"
+permissionDeniedError: "Odrzucono operacje"
+permissionDeniedErrorDescription: "Konto nie posiada uprawnień"
+preset: "Konfiguracja"
+selectFromPresets: "Wybierz konfiguracje"
+achievements: "Osiągnięcia"
+thisPostMayBeAnnoyingCancel: "Odrzuć"
+internalServerError: "Wewnętrzny błąd serwera"
+internalServerErrorDescription: "Niespodziewany błąd po stronie serwera"
+copyErrorInfo: "Kopiuj informacje o błędzie"
+joinThisServer: "Dołącz do chaty"
+disableFederationOk: "Wyłącz federacje"
+invitationRequiredToRegister: "Ten serwer wymaga zaproszenia. Tylko osoby z zaproszeniem mogą się zarejestrować"
+emailNotSupported: "Wysyłanie wiadomości E-mail nie jest obsługiwane na tym serwerze"
+postToTheChannel: "Publikuj na kanale"
youFollowing: "Śledzeni"
icon: "Awatar"
replies: "Odpowiedz"
renotes: "Udostępnij"
sourceCode: "Kod źródłowy"
flip: "Odwróć"
+lastNDays: "W ciągu ostatnich {n} dni"
+surrender: "Odrzuć"
+gameRetry: "Spróbuj ponownie"
+_bubbleGame:
+ _score:
+ score: "Wynik"
_role:
+ assignTarget: "Przydziel"
priority: "Priorytet"
_priority:
low: "Niski"
middle: "Średnie"
high: "Wysoki"
+ _options:
+ canManageCustomEmojis: "Zarządzaj niestandardowymi Emoji"
+ canManageAvatarDecorations: "Zarządzaj dekoracjami awatara"
_sensitiveMediaDetection:
description: "Zmniejsza wysiłek związany z moderacją serwera dzięki automatycznemu rozpoznawaniu zawartości NSFW za pomocą uczenia maszynowego. To nieznacznie zwiększy obciążenie serwera."
setSensitiveFlagAutomatically: "Oznacz jako NSFW"
@@ -1400,4 +1557,3 @@ _moderationLogTypes:
resetPassword: "Zresetuj hasło"
_reversi:
total: "Łącznie"
-
diff --git a/locales/pt-PT.yml b/locales/pt-PT.yml
index f62557fb23..e00f5750dd 100644
--- a/locales/pt-PT.yml
+++ b/locales/pt-PT.yml
@@ -733,9 +733,9 @@ reloadToApplySetting: "As configurações serão refletidas após recarregar a p
needReloadToApply: "É necessário recarregar a página para refletir as alterações."
showTitlebar: "Exibir barra de título"
clearCache: "Limpar o cache"
-onlineUsersCount: "Pessoas Online"
-nUsers: "Usuários"
-nNotes: "Notas"
+onlineUsersCount: "{n} Pessoas Online"
+nUsers: "{n} Usuários"
+nNotes: "{n} Notas"
sendErrorReports: "Enviar relatórios de erro"
sendErrorReportsDescription: "Ao ativar essa opção, informações detalhadas de erro serão compartilhadas com o Misskey em caso de problemas, o que pode ajudar a melhorar a qualidade do software. As informações de erro podem incluir a versão do sistema operacional, o tipo de navegador e o sua atividade no Misskey."
myTheme: "Meu tema"
@@ -767,7 +767,7 @@ emailNotification: "Notificações por e-mail"
publish: "Publicar"
inChannelSearch: "Pesquisar no canal"
useReactionPickerForContextMenu: "Clique com o botão direito do mouse para abrir o seletor de reações."
-typingUsers: "digitando"
+typingUsers: "{users} pessoas digitando"
jumpToSpecifiedDate: "Pular para uma data específica"
showingPastTimeline: "Visualizar linha de tempo anterior"
clear: "Limpar"
@@ -834,7 +834,7 @@ learnMore: "Saiba mais"
misskeyUpdated: "Misskey foi atualizado!"
whatIsNew: "Ver atualizações"
translate: "Traduzir"
-translatedFrom: "Traduzido de"
+translatedFrom: "Traduzido de {x}"
accountDeletionInProgress: "Encerramento de conta em andamento"
usernameInfo: "O nome para identificar exclusivamente a sua conta no servidor. Pode conter letras (az, AZ), números (0~9) e sublinhados (_). O nome de usuário não pode ser alterado posteriormente."
aiChanMode: "Modo AI-chan"
@@ -1301,8 +1301,8 @@ _preferencesBackups:
_channel:
featured: "Destaques"
following: "Seguindo"
- usersCount: "usuários ativos"
- notesCount: "notas"
+ usersCount: "{n} usuários ativos"
+ notesCount: "{n} notas"
nameAndDescription: "Nome e descrição"
_menuDisplay:
sideFull: "Exibir painel lateral inteiro"
@@ -1501,4 +1501,3 @@ _moderationLogTypes:
resetPassword: "Redefinir senha"
_reversi:
total: "Total"
-
diff --git a/locales/ro-RO.yml b/locales/ro-RO.yml
index c1158e47b7..695eb2501f 100644
--- a/locales/ro-RO.yml
+++ b/locales/ro-RO.yml
@@ -729,4 +729,3 @@ _moderationLogTypes:
resetPassword: "Resetează parola"
_reversi:
total: "Total"
-
diff --git a/locales/ru-RU.yml b/locales/ru-RU.yml
index d666b69490..66e032f16f 100644
--- a/locales/ru-RU.yml
+++ b/locales/ru-RU.yml
@@ -17,7 +17,7 @@ noThankYou: "Нет, спасибо"
enterUsername: "Введите имя пользователя"
renotedBy: "{user} делится"
noNotes: "Нет ни одной заметки"
-noNotifications: "Нет ни одного уведомления"
+noNotifications: "Нет уведомлений"
instance: "Инстанс"
settings: "Настройки"
notificationSettings: "Настройки уведомлений"
@@ -129,6 +129,7 @@ overwriteFromPinnedEmojis: "Заменить на эмодзи из общего
reactionSettingDescription2: "Расставляйте перетаскиванием, удаляйте нажатием, добавляйте кнопкой «+»."
rememberNoteVisibility: "Запоминать видимость заметок"
attachCancel: "Удалить вложение"
+deleteFile: "Удалить файл"
markAsSensitive: "Отметить как «не для всех»"
unmarkAsSensitive: "Снять отметку «не для всех»"
enterFileName: "Введите имя файла"
@@ -312,6 +313,7 @@ folderName: "Имя папки"
createFolder: "Создать папку"
renameFolder: "Переименовать папку"
deleteFolder: "Удалить папку"
+folder: "Папка"
addFile: "Добавить файл"
emptyDrive: "Диск пуст"
emptyFolder: "Папка пуста"
@@ -373,6 +375,8 @@ hcaptcha: "hCaptcha"
enableHcaptcha: "Включить hCaptcha"
hcaptchaSiteKey: "Ключ сайта"
hcaptchaSecretKey: "Секретный ключ"
+mcaptcha: "mCaptcha"
+enableMcaptcha: "Включить mCaptcha"
mcaptchaSiteKey: "Ключ сайта"
mcaptchaSecretKey: "Секретный ключ"
recaptcha: "reCAPTCHA"
@@ -542,6 +546,8 @@ showInPage: "Показать страницу"
popout: "Развернуть"
volume: "Громкость"
masterVolume: "Основная регулировка громкости"
+notUseSound: "Выключить звук"
+useSoundOnlyWhenActive: "Использовать звук, когда Misskey активен."
details: "Подробнее"
chooseEmoji: "Выберите эмодзи"
unableToProcess: "Не удаётся завершить операцию"
@@ -562,6 +568,10 @@ output: "Выходы"
script: "Скрипт"
disablePagesScript: "Отключить скрипты на «Страницах»"
updateRemoteUser: "Обновить данные пользователя с его сервера"
+unsetUserAvatar: "Убрать аватар"
+unsetUserAvatarConfirm: "Вы точно хотите убрать аватар?"
+unsetUserBanner: "Убрать баннер"
+unsetUserBannerConfirm: "Вы точно хотите убрать баннер?"
deleteAllFiles: "Удалить все файлы"
deleteAllFilesConfirm: "Вы хотите удалить все файлы?"
removeAllFollowing: "Удалить всех подписчиков"
@@ -612,6 +622,7 @@ medium: "Средне"
small: "Мелко"
generateAccessToken: "Создать токен доступа"
permission: "Разрешения"
+adminPermission: "Доступ администратора"
enableAll: "Включить все"
disableAll: "Выключить всё"
tokenRequested: "Открыть доступ к учётной записи"
@@ -633,6 +644,7 @@ smtpSecure: "Использовать SSL/TLS для SMTP-соединений"
smtpSecureInfo: "Выключите при использовании STARTTLS."
testEmail: "Проверка доставки электронной почты"
wordMute: "Скрытие слов"
+hardWordMute: ""
regexpError: "Ошибка в регулярном выражении"
regexpErrorDescription: "В списке {tab} скрытых слов, в строке {line} обнаружена синтаксическая ошибка:"
instanceMute: "Глушение инстансов"
@@ -1084,6 +1096,7 @@ renotes: "Репост"
loadReplies: "Показать ответы"
sourceCode: "Исходный код"
flip: "Переворот"
+code: "Код"
lastNDays: "Последние {n} сут"
surrender: "Этот пост не может быть отменен."
_initialAccountSetting:
@@ -1626,7 +1639,6 @@ _2fa:
registerTOTP: "Начните настраивать приложение-аутентификатор"
step1: "Прежде всего, установите на устройство приложение для аутентификации, например, {a} или {b}."
step2: "Далее отсканируйте отображаемый QR-код при помощи приложения."
- step2Click: "Нажав на QR-код, вы можете зарегистрироваться с помощью приложения для аутентификации или брелка для ключей, установленного на вашем устройстве."
step3Title: "Введите проверочный код"
step3: "И наконец, введите код, который покажет приложение."
step4: "Теперь при каждом входе на сайт вам нужно будет вводить код из приложения аналогичным образом."
@@ -1975,4 +1987,3 @@ _moderationLogTypes:
resetPassword: "Сброс пароля:"
_reversi:
total: "Всего"
-
diff --git a/locales/si-LK.yml b/locales/si-LK.yml
index cd21505a47..e130d68ed8 100644
--- a/locales/si-LK.yml
+++ b/locales/si-LK.yml
@@ -1,2 +1,19 @@
---
-
+_lang_: "සිංහල"
+monthAndDay: "{month}-{day}"
+username: "පරිශීලක නාමය"
+password: "මුරපදය"
+cancel: "අවලංගු කරන්න"
+instance: "සර්වර්"
+login: "පිවිසෙන්න"
+users: "පරිශීලක"
+note: "නෝට්"
+notes: "නෝට්"
+instances: "සර්වර්"
+smtpUser: "පරිශීලක නාමය"
+smtpPass: "මුරපදය"
+user: "පරිශීලක"
+_sfx:
+ note: "නෝට්"
+_profile:
+ username: "පරිශීලක නාමය"
diff --git a/locales/sk-SK.yml b/locales/sk-SK.yml
index 251496b10b..0978701e55 100644
--- a/locales/sk-SK.yml
+++ b/locales/sk-SK.yml
@@ -1448,4 +1448,3 @@ _moderationLogTypes:
resetPassword: "Resetovať heslo"
_reversi:
total: "Celkom"
-
diff --git a/locales/sv-SE.yml b/locales/sv-SE.yml
index 07d5509a6a..62bc71a13d 100644
--- a/locales/sv-SE.yml
+++ b/locales/sv-SE.yml
@@ -576,4 +576,3 @@ _webhookSettings:
_moderationLogTypes:
suspend: "Suspendera"
resetPassword: "Återställ Lösenord"
-
diff --git a/locales/th-TH.yml b/locales/th-TH.yml
index c0e79d5e16..020b954854 100644
--- a/locales/th-TH.yml
+++ b/locales/th-TH.yml
@@ -33,7 +33,7 @@ logout: "ออกจากระบบ"
signup: "สร้างบัญชีผู้ใช้"
uploading: "กำลังอัปโหลด"
save: "บันทึก"
-users: "ผู้ใช้งาน"
+users: "ผู้ใช้"
addUser: "เพิ่มผู้ใช้"
favorite: "รายการโปรด"
favorites: "รายการโปรด"
@@ -400,6 +400,7 @@ name: "ชื่อ"
antennaSource: "แหล่งเสาอากาศ"
antennaKeywords: "คีย์เวิร์ดที่ควรฟัง"
antennaExcludeKeywords: "คีย์เวิร์ดที่จะยกเว้น"
+antennaExcludeBots: "ยกเว้นบัญชีบอต"
antennaKeywordsDescription: "คั่นด้วยช่องว่างสำหรับเงื่อนไข AND หรือด้วยการขึ้นบรรทัดใหม่สำหรับเงื่อนไข OR"
notifyAntenna: "แจ้งเตือนเกี่ยวกับโน้ตใหม่"
withFileAntenna: "เฉพาะโน้ตที่มีไฟล์"
@@ -494,6 +495,7 @@ emojiStyle: "สไตล์เอโมจิ"
native: "ภาษาแม่"
disableDrawer: "อย่าใช้ลิ้นชักสไตล์เมนู"
showNoteActionsOnlyHover: "แสดงการดำเนินการเฉพาะโน้ตเมื่อโฮเวอร์"
+showReactionsCount: "แสดงจำนวนรีแอกชั่นในโน้ต"
noHistory: "ไม่มีประวัติ"
signinHistory: "ประวัติการเข้าสู่ระบบ"
enableAdvancedMfm: "เปิดใช้งาน MFM ขั้นสูง"
@@ -825,7 +827,7 @@ switchAccount: "สลับบัญชีผู้ใช้"
enabled: "เปิดใช้งาน"
disabled: "ปิดการใช้งาน"
quickAction: "ปุ่มลัด"
-user: "ผู้ใช้งาน"
+user: "ผู้ใช้"
administration: "การจัดการ"
accounts: "บัญชีผู้ใช้"
switch: "สลับ"
@@ -1223,6 +1225,16 @@ enableHorizontalSwipe: "ปัดเพื่อสลับแท็บ"
loading: "กำลังโหลด"
surrender: "ยอมแพ้"
gameRetry: "เริ่มเกมใหม่"
+notUsePleaseLeaveBlank: "หากไม่ได้ใช้กรุณาเว้นว่างไว้"
+useTotp: "ใช้รหัสผ่านแบบใช้ครั้งเดียว (TOTP)"
+useBackupCode: "ใช้รหัสสำรอง"
+launchApp: "เริ่มแอป"
+useNativeUIForVideoAudioPlayer: "ใช้ UI ของเบราว์เซอร์เพื่อเล่นวิดีโอ/เสียง"
+keepOriginalFilename: "คงชื่อไฟล์เดิมไว้"
+keepOriginalFilenameDescription: "หากปิดการตั้งค่านี้ ในระหว่างการอัปโหลดชื่อไฟล์จะถูกแทนที่ด้วยสตริงแบบสุ่มโดยอัตโนมัติ"
+noDescription: "ไม่มีข้อความอธิบาย"
+alwaysConfirmFollow: "แสดงข้อความยืนยันเมื่อกดติดตาม"
+inquiry: "ติดต่อเรา"
_bubbleGame:
howToPlay: "วิธีเล่น"
hold: "หยุดชั่วคราว"
@@ -1351,7 +1363,7 @@ _serverSettings:
_accountMigration:
moveFrom: "ย้ายข้อมูลบัญชีอื่นไปยังอีกบัญชีนี้หนึ่ง"
moveFromSub: "สร้างนามแฝงไปยังบัญชีอื่น"
- moveFromLabel: "บัญชีที่จะย้ายจาก:"
+ moveFromLabel: "บัญชีที่จะย้ายจาก #{n}"
moveFromDescription: "ถ้าหากคุณต้องการโอนข้อมูล คุณจำเป็นต้องสร้างบัญชีสำรองสำหรับการย้ายบัญชี หลังจากนั้นป้อนบัญชีที่จะย้ายไปในรูปแบบต่อไปนี้: @person@instance.com"
moveTo: "ย้ายข้อมูลบัญชีนี้ไปยังบัญชีอีกหนึ่ง"
moveToLabel: "บัญชีที่จะย้ายไปที่:"
@@ -1682,6 +1694,11 @@ _role:
roleAssignedTo: "มอบหมายให้มีบทบาทแบบทำมือ"
isLocal: "ผู้ใช้ในพื้นที่"
isRemote: "ผู้ใช้ระยะไกล"
+ isCat: "ผู้ใช้ที่เป็นแมว"
+ isBot: "ผู้ใช้ที่เป็นบอต"
+ isSuspended: "ผู้ใช้ที่ถูกระงับ"
+ isLocked: "ผู้ใช้บัญชีไม่เปิดเผยสาธารณะ"
+ isExplorable: "ผู้ใช้ที่เปิดใช้งาน “ทำให้บัญชีของฉันค้นหาได้ง่ายขึ้น”"
createdLessThan: "สร้างน้อยกว่า"
createdMoreThan: "สร้างมากกว่า"
followersLessThanOrEq: "จำนวนผู้ติดตามน้อยกว่าหรือเท่ากับ\n"
@@ -1751,6 +1768,7 @@ _plugin:
installWarn: "กรุณาอย่าติดตั้งปลั๊กอินที่ไม่น่าเชื่อถือนะคะ"
manage: "จัดการปลั๊กอิน"
viewSource: "ดูต้นฉบับ"
+ viewLog: "แสดงปูม"
_preferencesBackups:
list: "สร้างการสำรองข้อมูล"
saveNew: "บันทึกข้อมูลสำรองใหม่"
@@ -1940,7 +1958,6 @@ _2fa:
registerTOTP: "ลงทะเบียนแอพตัวตรวจสอบสิทธิ์"
step1: "ขั้นตอนแรก ติดตั้งแอปยืนยันตัวตน (เช่น {a} หรือ {b}) บนอุปกรณ์ของคุณ"
step2: "จากนั้นสแกนรหัส QR ที่แสดงบนหน้าจอนี้"
- step2Click: "การคลิกที่รหัส QR นี้จะช่วยให้คุณนั้นสามารถลงทะเบียน 2FA กับคีย์ความปลอดภัยหรือแอปตรวจสอบความถูกต้องของโทรศัพท์ได้"
step2Uri: "ป้อนใส่ URL ดังต่อไปนี้ถ้าหากคุณใช้โปรแกรมเดสก์ท็อป"
step3Title: "ป้อนรหัสยืนยัน"
step3: "ป้อนโทเค็นที่แอปของคุณให้มาเพื่อเสร็จสิ้นการตั้งค่า"
@@ -1964,6 +1981,7 @@ _2fa:
backupCodesDescription: "หากแอปยืนยันตัวตนของคุณไม่พร้อมใช้งาน คุณสามารถใช้รหัสสำรองด้านล่างเพื่อเข้าถึงบัญชีของคุณได้ อย่าลืมเก็บรหัสเหล่านี้ไว้ในที่ปลอดภัย แต่ละรหัสสามารถใช้ได้เพียงครั้งเดียวเท่านั้น"
backupCodeUsedWarning: "มีการใช้รหัสสำรองแล้ว โปรดกรุณากำหนดค่าการตรวจสอบสิทธิ์แบบสองปัจจัยโดยเร็วที่สุดถ้าหากคุณยังไม่สามารถใช้งานได้อีก"
backupCodesExhaustedWarning: "รหัสสำรองทั้งหมดถูกใช้แล้ว ถ้าหากคุณยังสูญเสียการเข้าถึงแอปการตรวจสอบสิทธิ์แบบสองปัจจัยคุณจะยังไม่สามารถเข้าถึงบัญชีนี้ได้ กรุณากำหนดค่าการรับรองความถูกต้องด้วยการยืนยันสองชั้น"
+ moreDetailedGuideHere: "คลิกที่นี่เพื่อดูคำแนะนำโดยละเอียด"
_permissions:
"read:account": "ดูข้อมูลบัญชีของคุณ"
"write:account": "แก้ไขข้อมูลบัญชีของคุณ"
@@ -2225,6 +2243,7 @@ _play:
title: "หัวข้อ"
script: "สคริปต์"
summary: "รายละเอียด"
+ visibilityDescription: "หากตั้งค่าเป็นส่วนตัว มันจะไม่ปรากฏในโปรไฟล์อีกต่อไป แต่ผู้ที่ทราบ URL ของมันจะยังสามารถเข้าถึงได้"
_pages:
newPage: "สร้างหน้าเพจใหม่"
editPage: "แก้ไขหน้าเพจ"
@@ -2269,6 +2288,8 @@ _pages:
section: "ประเภท"
image: "รูปภาพ"
button: "ปุ่ม"
+ dynamic: "บล็อกแบบไดนามิก"
+ dynamicDescription: "บล็อกนี้ล้าสมัยแล้ว โปรดใช้ {play} แทน นับจากนี้เป็นต้นไป"
note: "โน้ตที่ฝังตัว"
_note:
id: "โน้ต ID"
@@ -2298,6 +2319,7 @@ _notification:
sendTestNotification: "ส่งทดสอบการแจ้งเตือน"
notificationWillBeDisplayedLikeThis: "การแจ้งเตือนมีลักษณะแบบนี้"
reactedBySomeUsers: "ถูกรีแอคชั่นโดยผู้ใช้ {n} ราย"
+ likedBySomeUsers: "{n} คนถูกใจ"
renotedBySomeUsers: "รีโน้ตจากผู้ใช้ {n} ราย"
followedBySomeUsers: "มีผู้ติดตาม {n} ราย"
flushNotification: "ล้างประวัติการแจ้งเตือน"
@@ -2524,4 +2546,21 @@ _reversi:
_offlineScreen:
title: "ออฟไลน์ - ไม่สามารถเชื่อมต่อกับเซิร์ฟเวอร์ได้"
header: "ไม่สามารถเชื่อมต่อกับเซิร์ฟเวอร์ได้"
-
+_urlPreviewSetting:
+ title: "การตั้งค่าการแสดงตัวอย่าง URL"
+ enable: "เปิดใช้งานการแสดงตัวอย่าง URL"
+ timeout: "เวลาจำกัดในการโหลดตัวอย่าง URL (ms)"
+ timeoutDescription: "หากเวลาที่ใช้ในการโหลดเกินค่านี้ จะไม่มีการสร้างการแสดงตัวอย่าง"
+ maximumContentLength: "ค่าสูงสุดของ Content-Length (byte)"
+ maximumContentLengthDescription: "หาก Content-Length เกินค่านี้ จะไม่มีการสร้างการแสดงตัวอย่าง"
+ requireContentLength: "สร้างการแสดงตัวอย่างเฉพาะในกรณีที่รับ Content-Length ไหว"
+ requireContentLengthDescription: "หากเซิร์ฟเวอร์อื่นไม่ส่งคืน Content-Length จะไม่มีการสร้างการแสดงตัวอย่าง"
+ userAgent: "User-Agent"
+ userAgentDescription: "ตั้งค่า User-Agent ที่ใช้ในการรับการแสดงตัวอย่าง หากเว้นว่างไว้ ระบบจะใช้ User-Agent เริ่มต้น"
+ summaryProxy: "endpoint ของพร็อกซีที่สร้างการแสดงตัวอย่าง"
+ summaryProxyDescription: "สร้างการแสดงตัวอย่างด้วย summary Proxy แทนที่จะใช้เนื้อหา Misskey"
+ summaryProxyDescription2: "พารามิเตอร์ต่อไปนี้จะถูกใช้เป็นสตริงการสืบค้นเพื่อเชื่อมต่อกับพร็อกซี หากฝั่งพร็อกซีไม่รองรับการตั้งค่าเหล่านี้จะถูกละเว้น"
+_mediaControls:
+ pip: "รูปภาพในรูปภาม"
+ playbackRate: "ความเร็วในการเล่น"
+ loop: "เล่นวนซ้ำ"
diff --git a/locales/tr-TR.yml b/locales/tr-TR.yml
index e93a6e43e1..0793592d34 100644
--- a/locales/tr-TR.yml
+++ b/locales/tr-TR.yml
@@ -455,4 +455,3 @@ _deck:
_moderationLogTypes:
suspend: "askıya al"
resetPassword: "Şifre sıfırlama"
-
diff --git a/locales/ug-CN.yml b/locales/ug-CN.yml
index e06cee11a2..e48f64511c 100644
--- a/locales/ug-CN.yml
+++ b/locales/ug-CN.yml
@@ -17,4 +17,3 @@ _2fa:
renewTOTPCancel: "ئۇنى توختىتىڭ"
_widgets:
profile: "profile"
-
diff --git a/locales/uk-UA.yml b/locales/uk-UA.yml
index df36f43c06..0ce5dc1202 100644
--- a/locales/uk-UA.yml
+++ b/locales/uk-UA.yml
@@ -1623,4 +1623,3 @@ _moderationLogTypes:
resetPassword: "Скинути пароль"
_reversi:
total: "Всього"
-
diff --git a/locales/uz-UZ.yml b/locales/uz-UZ.yml
index b87b596925..809e785492 100644
--- a/locales/uz-UZ.yml
+++ b/locales/uz-UZ.yml
@@ -1090,4 +1090,3 @@ _moderationLogTypes:
resetPassword: "Parolni tiklash"
_reversi:
total: "Jami"
-
diff --git a/locales/verify.js b/locales/verify.js
new file mode 100644
index 0000000000..a8e9875d6e
--- /dev/null
+++ b/locales/verify.js
@@ -0,0 +1,53 @@
+import locales from './index.js';
+
+let valid = true;
+
+function writeError(type, lang, tree, data) {
+ process.stderr.write(JSON.stringify({ type, lang, tree, data }));
+ process.stderr.write('\n');
+ valid = false;
+}
+
+function verify(expected, actual, lang, trace) {
+ for (let key in expected) {
+ if (!Object.prototype.hasOwnProperty.call(actual, key)) {
+ continue;
+ }
+ if (typeof expected[key] === 'object') {
+ if (typeof actual[key] !== 'object') {
+ writeError('mismatched_type', lang, trace ? `${trace}.${key}` : key, { expected: 'object', actual: typeof actual[key] });
+ continue;
+ }
+ verify(expected[key], actual[key], lang, trace ? `${trace}.${key}` : key);
+ } else if (typeof expected[key] === 'string') {
+ switch (typeof actual[key]) {
+ case 'object':
+ writeError('mismatched_type', lang, trace ? `${trace}.${key}` : key, { expected: 'string', actual: 'object' });
+ break;
+ case 'undefined':
+ continue;
+ case 'string':
+ const expectedParameters = new Set(expected[key].match(/\{[^}]+\}/g)?.map((s) => s.slice(1, -1)));
+ const actualParameters = new Set(actual[key].match(/\{[^}]+\}/g)?.map((s) => s.slice(1, -1)));
+ for (let parameter of expectedParameters) {
+ if (!actualParameters.has(parameter)) {
+ writeError('missing_parameter', lang, trace ? `${trace}.${key}` : key, { parameter });
+ }
+ }
+ }
+ }
+ }
+}
+
+const { ['ja-JP']: original, ...verifiees } = locales;
+
+for (let lang in verifiees) {
+ if (!Object.prototype.hasOwnProperty.call(locales, lang)) {
+ continue;
+ }
+ verify(original, verifiees[lang], lang);
+}
+
+if (!valid) {
+ process.exit(1);
+}
diff --git a/locales/vi-VN.yml b/locales/vi-VN.yml
index 59883f4a6c..d9c21d29ad 100644
--- a/locales/vi-VN.yml
+++ b/locales/vi-VN.yml
@@ -121,9 +121,11 @@ sensitive: "Nhạy cảm"
add: "Thêm"
reaction: "Biểu cảm"
reactions: "Biểu cảm"
+emojiPicker: "Bộ chọn biểu tượng cảm xúc"
reactionSettingDescription2: "Kéo để sắp xếp, nhấn để xóa, nhấn \"+\" để thêm."
rememberNoteVisibility: "Lưu kiểu tút mặc định"
attachCancel: "Gỡ tập tin đính kèm"
+deleteFile: "Xoá tệp tin"
markAsSensitive: "Đánh dấu là nhạy cảm"
unmarkAsSensitive: "Bỏ đánh dấu nhạy cảm"
enterFileName: "Nhập tên tập tin"
@@ -257,6 +259,7 @@ removed: "Đã xóa"
removeAreYouSure: "Bạn có chắc muốn gỡ \"{x}\"?"
deleteAreYouSure: "Bạn có chắc muốn xóa \"{x}\"?"
resetAreYouSure: "Bạn có chắc muốn đặt lại?"
+areYouSure: "Bạn chắc chứ?"
saved: "Đã lưu"
messaging: "Trò chuyện"
upload: "Tải lên"
@@ -307,6 +310,7 @@ folderName: "Tên thư mục"
createFolder: "Tạo thư mục"
renameFolder: "Đổi tên thư mục"
deleteFolder: "Xóa thư mục"
+folder: "Thư mục"
addFile: "Thêm tập tin"
emptyDrive: "Ổ đĩa của bạn trống trơn"
emptyFolder: "Thư mục trống"
@@ -368,6 +372,8 @@ hcaptcha: "hCaptcha"
enableHcaptcha: "Bật hCaptcha"
hcaptchaSiteKey: "Khóa của trang"
hcaptchaSecretKey: "Khóa bí mật"
+mcaptcha: "mCaptcha"
+enableMcaptcha: "Bật mCaptcha"
mcaptchaSiteKey: "Khóa của trang"
mcaptchaSecretKey: "Khóa bí mật"
recaptcha: "reCAPTCHA"
@@ -385,6 +391,7 @@ name: "Tên"
antennaSource: "Nguồn trạm phát sóng"
antennaKeywords: "Từ khóa để nghe"
antennaExcludeKeywords: "Từ khóa để lọc ra"
+antennaExcludeBots: "Loại trừ các tài khoản bot"
antennaKeywordsDescription: "Phân cách bằng dấu cách cho điều kiện AND hoặc bằng xuống dòng cho điều kiện OR."
notifyAntenna: "Thông báo có tút mới"
withFileAntenna: "Chỉ những tút có media"
@@ -537,6 +544,7 @@ showInPage: "Hiện trong trang"
popout: "Pop-out"
volume: "Âm lượng"
masterVolume: "Âm thanh chung"
+notUseSound: "Tắt tiếng"
details: "Chi tiết"
chooseEmoji: "Chọn emoji"
unableToProcess: "Không thể hoàn tất hành động"
@@ -557,6 +565,10 @@ output: "Nguồn ra"
script: "Kịch bản"
disablePagesScript: "Tắt AiScript trên Trang"
updateRemoteUser: "Cập nhật thông tin người dùng ở máy chủ khác"
+unsetUserAvatar: "Gỡ ảnh đại diện"
+unsetUserAvatarConfirm: "Bạn có chắc muốn gỡ ảnh đại diện?"
+unsetUserBanner: "Gỡ ảnh bìa"
+unsetUserBannerConfirm: "Bạn có chắc muốn gỡ ảnh bìa?"
deleteAllFiles: "Xóa toàn bộ tập tin"
deleteAllFilesConfirm: "Bạn có chắc xóa toàn bộ tập tin?"
removeAllFollowing: "Ngưng theo dõi tất cả mọi người"
@@ -859,6 +871,8 @@ makeReactionsPublicDescription: "Điều này sẽ hiển thị công khai danh
classic: "Cổ điển"
muteThread: "Không quan tâm nữa"
unmuteThread: "Quan tâm tút này"
+followingVisibility: "Hiển thị lượt theo dõi"
+followersVisibility: "Hiển thị người theo dõi"
continueThread: "Tiếp tục xem chuỗi tút"
deleteAccountConfirm: "Điều này sẽ khiến tài khoản bị xóa vĩnh viễn. Vẫn tiếp tục?"
incorrectPassword: "Sai mật khẩu."
@@ -968,6 +982,7 @@ assign: "Phân công"
unassign: "Hủy phân công"
color: "Màu sắc"
manageCustomEmojis: "Quản lý CustomEmoji"
+manageAvatarDecorations: "Quản lý trang trí ảnh đại diện"
youCannotCreateAnymore: "Bạn đã tới giới hạn tạo."
cannotPerformTemporary: "Tạm thời không sử dụng được"
cannotPerformTemporaryDescription: "Tạm thời không sử dụng được vì lần số điều kiện quá giới hạn. Thử lại sau mọt lát nữa."
@@ -991,18 +1006,24 @@ copyErrorInfo: "Sao chép thông tin lỗi"
joinThisServer: "Đăng ký trên chủ máy này"
exploreOtherServers: "Tìm chủ máy khác"
letsLookAtTimeline: "Thử xem Timeline"
+disableFederationOk: "Vô hiệu hoá"
emailNotSupported: "Máy chủ này không hỗ trợ gửi email"
postToTheChannel: "Đăng lên kênh"
cannotBeChangedLater: "Không thể thay đổi sau này."
+likeOnly: "Chỉ lượt thích"
rolesAssignedToMe: "Vai trò được giao cho tôi"
resetPasswordConfirm: "Bạn thực sự muốn đặt lại mật khẩu?"
sensitiveWords: "Các từ nhạy cảm"
+prohibitedWords: "Các từ bị cấm"
license: "Giấy phép"
unfavoriteConfirm: "Bạn thực sự muốn xoá khỏi mục yêu thích?"
+retryAllQueuesConfirmTitle: "Bạn có muốn thử lại?"
retryAllQueuesConfirmText: "Điều này sẽ tạm thời làm tăng mức độ tải của máy chủ."
enableChartsForRemoteUser: "Tạo biểu đồ người dùng từ xa"
video: "Video"
videos: "Các video"
+audio: "Âm thanh"
+audioFiles: "Âm thanh"
dataSaver: "Tiết kiệm dung lượng"
accountMigration: "Chuyển tài khoản"
accountMoved: "Người dùng này đã chuyển sang một tài khoản mới:"
@@ -1019,34 +1040,82 @@ vertical: "Dọc"
horizontal: "Thanh bên"
position: "Vị trí"
serverRules: "Luật của máy chủ"
+pleaseConfirmBelowBeforeSignup: "Để đăng ký trên máy chủ này, bạn phải xem xét và đồng ý với những điều sau."
+pleaseAgreeAllToContinue: "Bạn phải đồng ý tất cả điều trên để tiếp tục."
+continue: "Tiếp tục"
+archive: "Lưu trữ"
+thisChannelArchived: "Kênh này đã được lưu trữ."
+initialAccountSetting: "Thiết lập hồ sơ"
youFollowing: "Đang theo dõi"
+preventAiLearning: "Từ chối sử dụng công nghệ Máy Học (AI Sáng Tạo)"
+options: "Tùy chọn"
+specifyUser: "Người dùng chỉ định"
+failedToPreviewUrl: "Không thể xem trước"
+update: "Cập nhật"
later: "Để sau"
goToMisskey: "Tới Misskey"
installed: "Đã tải xuống"
branding: "Thương hiệu"
turnOffToImprovePerformance: "Tắt mục này có thể cải thiện hiệu năng."
+createInviteCode: "Tạo lời mời"
+createWithOptions: "Tạo cùng tùy chọn"
+createCount: "Số lượng mời"
+inviteCodeCreated: "Lời mời đã được tạo"
+inviteLimitExceeded: "Bạn đã vượt quá số lượng mời mà bạn có thể tạo."
+createLimitRemaining: "Giới hạn lượt mời: Còn lại {limit}"
+inviteLimitResetCycle: "Giới hạn này sẽ được đặt lại về {limit} lúc {time}."
expirationDate: "Ngày hết hạn"
noExpirationDate: "Vô thời hạn"
+inviteCodeUsedAt: "Mã mời đã được sử dụng lúc"
+registeredUserUsingInviteCode: "Lời mời đã được sử dụng bởi"
waitingForMailAuth: "Đang chờ xác nhận email"
+inviteCodeCreator: "Lời mời đã được tạo bởi"
+usedAt: "Sử dụng vào lúc"
unused: "Chưa được sử dụng"
used: "Đã được sử dụng"
expired: "Đã hết hạn"
doYouAgree: "Đồng ý?"
-iHaveReadXCarefullyAndAgree: "Tôi đã đọc và đồng ý với \"x\"."
+beSureToReadThisAsItIsImportant: "Hãy đọc kỹ vì nó rất quan trọng."
+iHaveReadXCarefullyAndAgree: "Tôi đã đọc và đồng ý với \"{x}\"."
dialog: "Hộp thoại"
icon: "Ảnh đại diện"
forYou: "Dành cho bạn"
currentAnnouncements: "Thông báo hiện tại"
pastAnnouncements: "Thông báo trước đó"
youHaveUnreadAnnouncements: "Có thông báo chưa đọc."
+useSecurityKey: "Làm theo hướng dẫn trên trình duyệt hoặc thiết bị của bạn để sử dụng khóa bảo mật hoặc mật mã."
replies: "Trả lời"
renotes: "Đăng lại"
loadReplies: "Hiển thị các trả lời"
+loadConversation: "Xem cuộc trò chuyện"
pinnedList: "Các mục đã được ghim"
keepScreenOn: "Giữ màn hình luôn bật"
verifiedLink: "Chúng tôi đã xác nhận bạn là chủ sở hữu của đường dẫn này"
+authentication: "Xác thực"
+authenticationRequiredToContinue: "Vui lòng xác thực để tiếp tục"
+dateAndTime: "Ngày và giờ"
+edited: "Đã chỉnh sửa"
+notificationRecieveConfig: "Cài đặt thông báo"
+mutualFollow: "Theo dõi lẫn nhau"
+followingOrFollower: "Đang theo dõi hoặc người theo dõi"
+externalServices: "Các dịch vụ bên ngoài"
sourceCode: "Mã nguồn"
+feedback: "Phản hồi"
+feedbackUrl: "URL phản hồi"
+privacyPolicy: "Chính sách bảo mật"
+privacyPolicyUrl: "URL Chính sách bảo mật"
+tosAndPrivacyPolicy: "Điều khoản sử dụng và Chính sách bảo mật"
+avatarDecorations: "Trang trí ảnh đại diện"
+attach: "Mặc"
+detach: "Bỏ"
+detachAll: "Bỏ tất cả"
+angle: "Góc"
flip: "Lật"
+showAvatarDecorations: "Hiển thị trang trí ảnh đại diện"
+releaseToRefresh: "Thả để làm mới"
+refreshing: "Đang làm mới"
+pullDownToRefresh: "Kéo xuống để làm mới"
+cwNotationRequired: "Nếu \"Ẩn nội dung\" được bật thì cần phải có chú thích."
lastNDays: "{n} ngày trước"
surrender: "Từ chối"
_announcement:
@@ -1280,6 +1349,7 @@ _role:
ltlAvailable: "Xem Timeline trong máy chủ này"
canPublicNote: "Cho phép đăng bài công khai"
canManageCustomEmojis: "Quản lý CustomEmoji"
+ canManageAvatarDecorations: "Quản lý trang trí ảnh đại diện"
driveCapacity: "Dữ liệu Drive"
pinMax: "Giới hạn ghim bài viết"
antennaMax: "Giới hạn tạo ăng ten"
@@ -1508,7 +1578,6 @@ _2fa:
registerTOTP: "Đăng ký ứng dụng xác thực"
step1: "Trước tiên, hãy cài đặt một ứng dụng xác minh (chẳng hạn như {a} hoặc {b}) trên thiết bị của bạn."
step2: "Sau đó, quét mã QR hiển thị trên màn hình này."
- step2Click: "Quét mã QR trên ứng dụng xác thực (Authy, Google authenticator, v.v.)"
step3Title: "Nhập mã xác thực"
step3: "Nhập mã token do ứng dụng của bạn cung cấp để hoàn tất thiết lập."
step4: "Kể từ bây giờ, những lần đăng nhập trong tương lai sẽ yêu cầu mã token đăng nhập đó."
@@ -1790,7 +1859,7 @@ _notification:
youReceivedFollowRequest: "Bạn vừa có một yêu cầu theo dõi"
yourFollowRequestAccepted: "Yêu cầu theo dõi của bạn đã được chấp nhận"
pollEnded: "Cuộc bình chọn đã kết thúc"
- unreadAntennaNote: "Ăng ten"
+ unreadAntennaNote: "Ăng ten {name}"
emptyPushNotificationMessage: "Đã cập nhật thông báo đẩy"
achievementEarned: "Hoàn thành Achievement"
_types:
@@ -1852,6 +1921,6 @@ _webhookSettings:
_moderationLogTypes:
suspend: "Vô hiệu hóa"
resetPassword: "Đặt lại mật khẩu"
+ createInvitation: "Tạo lời mời"
_reversi:
total: "Tổng cộng"
-
diff --git a/locales/zh-CN.yml b/locales/zh-CN.yml
index 17ad6e7150..fb1ffc5a99 100644
--- a/locales/zh-CN.yml
+++ b/locales/zh-CN.yml
@@ -58,7 +58,7 @@ copyUserId: "复制用户 ID"
copyNoteId: "复制帖子 ID"
copyFileId: "复制文件ID"
copyFolderId: "复制文件夹ID"
-copyProfileUrl: "复制配置文件URL"
+copyProfileUrl: "复制个人资料URL"
searchUser: "搜索用户"
reply: "回复"
loadMore: "查看更多"
@@ -400,6 +400,7 @@ name: "名称"
antennaSource: "接收来源"
antennaKeywords: "包含关键字"
antennaExcludeKeywords: "排除关键字"
+antennaExcludeBots: "排除机器人账户"
antennaKeywordsDescription: "AND 条件用空格分隔,OR 条件用换行符分隔。"
notifyAntenna: "开启通知"
withFileAntenna: "仅带有附件的帖子"
@@ -494,6 +495,7 @@ emojiStyle: "表情符号的样式"
native: "原生"
disableDrawer: "不显示抽屉菜单"
showNoteActionsOnlyHover: "仅在悬停时显示帖子操作"
+showReactionsCount: "显示帖子的回应数"
noHistory: "没有历史记录"
signinHistory: "登录历史"
enableAdvancedMfm: "启用扩展 MFM"
@@ -614,7 +616,7 @@ disablePlayer: "关闭播放器"
expandTweet: "展开帖子"
themeEditor: "主题编辑器"
description: "描述"
-describeFile: "添加标题"
+describeFile: "添加描述"
enterFileDescription: "输入标题"
author: "作者"
leaveConfirm: "存在未保存的更改。要放弃更改吗?"
@@ -1201,7 +1203,7 @@ code: "代码"
reloadRequiredToApplySettings: "需要重新载入来使设置生效"
remainingN: "剩余:{n}"
overwriteContentConfirm: "将覆盖现有内容。确定吗?"
-seasonalScreenEffect: "应景的画面效果"
+seasonalScreenEffect: "符合当前季节的画面效果"
decorate: "装饰"
addMfmFunction: "添加装饰"
enableQuickAddMfmFunction: "显示高级 MFM 选择器"
@@ -1223,6 +1225,16 @@ enableHorizontalSwipe: "滑动切换标签页"
loading: "读取中"
surrender: "取消"
gameRetry: "重试"
+notUsePleaseLeaveBlank: "如不使用请留空"
+useTotp: "使用一次性代码"
+useBackupCode: "使用备用代码"
+launchApp: "启动应用"
+useNativeUIForVideoAudioPlayer: "使用浏览器的 UI 播放动画及音频"
+keepOriginalFilename: "保持原文件名"
+keepOriginalFilenameDescription: "若关闭此设置,上传文件时文件名将被替换为随机字符。"
+noDescription: "没有描述"
+alwaysConfirmFollow: "总是确认关注"
+inquiry: "联系我们"
_bubbleGame:
howToPlay: "游戏说明"
hold: "抓住"
@@ -1233,6 +1245,7 @@ _bubbleGame:
maxChain: "最高连击数"
yen: "{yen} 日元"
estimatedQty: "约 {qty} 个"
+ scoreSweets: "相当于 {onigiriQtyWithUnit} 饭团"
_howToPlay:
section1: "对准位置将Emoji投入盒子。"
section2: "相同的Emoji相互接触合成后会得到新的Emoji,以此获得分数。"
@@ -1350,7 +1363,7 @@ _serverSettings:
_accountMigration:
moveFrom: "从别的账号迁移到此账户"
moveFromSub: "为另一个账户建立别名"
- moveFromLabel: "迁移前的账户"
+ moveFromLabel: "迁移前的账户 #{n}"
moveFromDescription: "如果迁移时需要继承其他账户的关注者,你需要创建一个别名。此操作需要在迁移前完成!\n请像这样输入要迁移的账户:@username@server.example.com\n如果要删除,请将输入字段留空,并保存(不推荐)。"
moveTo: "把这个账户迁移到新的账户"
moveToLabel: "迁移后的账户"
@@ -1680,6 +1693,9 @@ _role:
roleAssignedTo: "已分配给手动角色"
isLocal: "是本地用户"
isRemote: "是远程用户"
+ isBot: "机器人用户"
+ isSuspended: "停用的用户"
+ isExplorable: "启用“使账号可见”的用户"
createdLessThan: "账户创建时间少于"
createdMoreThan: "账户创建时间超过"
followersLessThanOrEq: "关注者不多于"
@@ -1749,6 +1765,7 @@ _plugin:
installWarn: "请不要安装不可信的插件。"
manage: "管理插件..."
viewSource: "查看源代码"
+ viewLog: "显示日志"
_preferencesBackups:
list: "已创建的备份"
saveNew: "另存为"
@@ -1938,7 +1955,6 @@ _2fa:
registerTOTP: "开始设置认证应用"
step1: "首先,在您的设备上安装验证应用,例如 {a} 或 {b}。"
step2: "然后,扫描屏幕上显示的二维码。"
- step2Click: "通过点击二维码,您可以使用设备上安装的身份验证器应用程序或密钥环进行注册"
step2Uri: "如果使用桌面应用程序的话,请输入下面的 URI"
step3Title: "输入验证码"
step3: "输入您的应用提供的动态口令以完成设置。"
@@ -1962,6 +1978,7 @@ _2fa:
backupCodesDescription: "如果无法使用认证应用,可以使用以下的备用代码来访问账户。请务必将这些代码保存在安全的地方。每个代码仅可使用一次。"
backupCodeUsedWarning: "已使用备用代码。如果无法使用认证应用,请尽快重新设定。"
backupCodesExhaustedWarning: "已使用完所有的备用代码。如果无法使用认证应用,将无法再访问您的账户。请再次设定认证应用。"
+ moreDetailedGuideHere: "此处为详细指南"
_permissions:
"read:account": "查看账户信息"
"write:account": "更改帐户信息"
@@ -2223,6 +2240,7 @@ _play:
title: "标题"
script: "脚本"
summary: "描述"
+ visibilityDescription: "设置为不公开后资料将不再显示,但知道 URL 的人仍可继续访问。"
_pages:
newPage: "创建页面"
editPage: "编辑页面"
@@ -2267,6 +2285,8 @@ _pages:
section: "章节"
image: "图片"
button: "按钮"
+ dynamic: "动态区块"
+ dynamicDescription: "这个区块已经废弃。以后请使用{play}。"
note: "嵌入的帖子"
_note:
id: "帖子 ID"
@@ -2296,6 +2316,7 @@ _notification:
sendTestNotification: "发送测试通知"
notificationWillBeDisplayedLikeThis: "通知将会这样表示"
reactedBySomeUsers: "{n} 人回应了"
+ likedBySomeUsers: "{n}人赞了你的帖子"
renotedBySomeUsers: "{n} 人转发了"
followedBySomeUsers: "被 {n} 人关注"
flushNotification: "重置通知历史"
@@ -2478,6 +2499,7 @@ _hemisphere:
_reversi:
reversi: "黑白棋"
gameSettings: "对局设置"
+ chooseBoard: "选择棋盘"
blackOrWhite: "先手/后手"
blackIs: "{name}执黑(先手)"
rules: "规则"
@@ -2504,6 +2526,8 @@ _reversi:
allGames: "所有对局"
ended: "结束"
playing: "对局中"
+ isLlotheo: "落子少的一方获胜(又名奥赛罗)"
+ loopedMap: "循环棋盘"
canPutEverywhere: "无限制放置模式"
timeLimitForEachTurn: "1回合的时间限制"
freeMatch: "自由匹配"
@@ -2519,4 +2543,21 @@ _reversi:
_offlineScreen:
title: "离线——无法连接到服务器"
header: "无法连接到服务器"
-
+_urlPreviewSetting:
+ title: "设置 URL 预览"
+ enable: "启用 URL 预览"
+ timeout: "超时阈值(ms)"
+ timeoutDescription: "如果获取预览所用时间超过这个值,则不生成预览。"
+ maximumContentLength: "Content-Length 的最大值(byte)"
+ maximumContentLengthDescription: "如果 Content-Length 超过这个值,则不生成预览。"
+ requireContentLength: "仅在能取得 Content-Length 时生成预览"
+ requireContentLengthDescription: "如果目标服务器不返回 Content-Length,则不生成预览。"
+ userAgent: "User-Agent"
+ userAgentDescription: "设定获取预览时使用的 User-Agent。留空时将使用默认的 User-Agent。"
+ summaryProxy: "用来生成预览的代理的 endpoint。"
+ summaryProxyDescription: "不使用 Misskey 本体,而是通过 Summaly Proxy 生成预览。"
+ summaryProxyDescription2: "下面的参数将作为查询字符串发送至代理。代理侧如果不支持此设置,则忽略设定值。"
+_mediaControls:
+ pip: "画中画"
+ playbackRate: "播放速度"
+ loop: "循环播放"
diff --git a/locales/zh-TW.yml b/locales/zh-TW.yml
index 5cdecc10ac..8cde13052f 100644
--- a/locales/zh-TW.yml
+++ b/locales/zh-TW.yml
@@ -205,7 +205,7 @@ silenceThisInstance: "禁言此伺服器"
operations: "操作"
software: "軟體"
version: "版本"
-metadata: "元資料"
+metadata: "詮釋資料"
withNFiles: "{n} 個檔案"
monitor: "監視器"
jobQueue: "佇列"
@@ -400,6 +400,7 @@ name: "名稱"
antennaSource: "接收來源"
antennaKeywords: "包含關鍵字"
antennaExcludeKeywords: "排除關鍵字"
+antennaExcludeBots: "排除機器人帳戶"
antennaKeywordsDescription: "空格代表「以及」(AND),換行代表「或者」(OR)"
notifyAntenna: "通知有新貼文"
withFileAntenna: "僅帶有附件的貼文"
@@ -494,6 +495,7 @@ emojiStyle: "表情符號的風格"
native: "原生"
disableDrawer: "不顯示下拉式選單"
showNoteActionsOnlyHover: "僅在游標停留時顯示貼文的操作選項"
+showReactionsCount: "顯示貼文的反應數目"
noHistory: "沒有歷史紀錄"
signinHistory: "登入歷史"
enableAdvancedMfm: "啟用進階 MFM"
@@ -750,7 +752,7 @@ experimentalFeatures: "實驗中的功能"
experimental: "實驗性"
thisIsExperimentalFeature: "這是實驗性的功能。可能會有變更規格和不能正常動作的可能性。"
developer: "開發者"
-makeExplorable: "使自己的帳戶能夠在「探索」頁面中顯示"
+makeExplorable: "使自己的帳戶更容易被找到"
makeExplorableDescription: "如果關閉,帳戶將不會被顯示在「探索」頁面中。"
showGapBetweenNotesInTimeline: "分開顯示時間軸上的貼文"
duplicate: "複製"
@@ -1223,6 +1225,16 @@ enableHorizontalSwipe: "滑動切換時間軸"
loading: "載入中"
surrender: "退出"
gameRetry: "再試一次"
+notUsePleaseLeaveBlank: "如不使用,請留空"
+useTotp: "使用一次性密碼"
+useBackupCode: "使用備用驗證碼"
+launchApp: "啟動 App"
+useNativeUIForVideoAudioPlayer: "使用瀏覽器的 UI 播放影片與音訊"
+keepOriginalFilename: "保留原始檔名"
+keepOriginalFilenameDescription: "如果關閉此設置,上傳時檔案名稱會自動替換為隨機字串。"
+noDescription: "沒有說明文字"
+alwaysConfirmFollow: "點擊追隨時總是顯示確認訊息"
+inquiry: "聯絡我們"
_bubbleGame:
howToPlay: "玩法說明"
hold: "保留"
@@ -1351,7 +1363,7 @@ _serverSettings:
_accountMigration:
moveFrom: "從其他帳戶遷移到這個帳戶"
moveFromSub: "為另一個帳戶建立別名"
- moveFromLabel: "要遷移過來的帳戶:"
+ moveFromLabel: "要遷移過來的帳戶 #{n}"
moveFromDescription: "如果你想把追隨者從別的帳戶遷移過來,必須先在這裡建立別名。請務必在執行遷移之前建立別名!請像這樣輸入要遷移的帳戶:@person@instance.com"
moveTo: "將這個帳戶遷移至新的帳戶"
moveToLabel: "要遷移到的帳戶:"
@@ -1682,6 +1694,11 @@ _role:
roleAssignedTo: "手動指派角色完成"
isLocal: "本地使用者"
isRemote: "遠端使用者"
+ isCat: "使用者是貓"
+ isBot: "使用者是機器人"
+ isSuspended: "被停權的使用者"
+ isLocked: "上鎖的使用者"
+ isExplorable: "開啟了「使您的帳戶更容易被找到」功能的使用者"
createdLessThan: "帳戶加入時間不超過"
createdMoreThan: "帳戶加入時間已超過"
followersLessThanOrEq: "追隨者人數在~以下"
@@ -1751,6 +1768,7 @@ _plugin:
installWarn: "請不要安裝來源不明的外掛。"
manage: "管理外掛"
viewSource: "檢視原始碼"
+ viewLog: "顯示記錄 "
_preferencesBackups:
list: "已備份的設定檔"
saveNew: "另存新檔"
@@ -1940,7 +1958,6 @@ _2fa:
registerTOTP: "開始設定驗證應用程式"
step1: "首先,在您的裝置上安裝驗證程式,例如 {a} 或 {b}。"
step2: "然後,掃描螢幕上的 QR 碼。"
- step2Click: "您可以點擊 QR 碼,以使用裝置上的驗證應用程式或金鑰環註冊。"
step2Uri: "使用桌面版應用程式時,請輸入以下的 URI"
step3Title: "輸入驗證碼"
step3: "輸入應用程式所提供的權杖以完成設定。"
@@ -1964,6 +1981,7 @@ _2fa:
backupCodesDescription: "如果驗證應用程式不能用了,可以使用以下的備用驗證碼存取您的帳戶。請務必妥善保管這個驗證碼。每個驗證碼只能使用一次。"
backupCodeUsedWarning: "已使用備用驗證碼。如果無法使用驗證應用程式,請盡快重新設定。"
backupCodesExhaustedWarning: "已使用所有備用驗證碼。如果無法使用驗證應用程式,則將無法再存取您的帳戶。請重新設定您的驗證應用程式。"
+ moreDetailedGuideHere: "請點擊此處查看詳細說明。"
_permissions:
"read:account": "查看我的帳戶資訊"
"write:account": "更改我的帳戶資訊"
@@ -2007,7 +2025,7 @@ _permissions:
"read:admin:index-stats": "查看資料庫索引的相關資訊"
"read:admin:table-stats": "查看資料庫表格的相關資訊"
"read:admin:user-ips": "查看使用者的 IP 位址"
- "read:admin:meta": "查看實例的元資料"
+ "read:admin:meta": "查看實例的詮釋資料"
"write:admin:reset-password": "重設使用者的密碼"
"write:admin:resolve-abuse-user-report": "解決來自使用者的檢舉"
"write:admin:send-email": "發送郵件"
@@ -2019,7 +2037,7 @@ _permissions:
"write:admin:unset-user-avatar": "刪除使用者的頭像"
"write:admin:unset-user-banner": "刪除使用者的橫幅"
"write:admin:unsuspend-user": "解除凍結使用者"
- "write:admin:meta": "編輯實例的元資料"
+ "write:admin:meta": "編輯實例的詮釋資料"
"write:admin:user-note": "編輯審查筆記"
"write:admin:roles": "編輯角色"
"read:admin:roles": "查看角色"
@@ -2188,7 +2206,7 @@ _charts:
notesIncDec: "貼文増減"
localNotesIncDec: "本地貼文増減"
remoteNotesIncDec: "遠端貼文數目增减"
- notesTotal: "貼文合共"
+ notesTotal: "貼文總數"
filesIncDec: "檔案增減"
filesTotal: "檔案總數"
storageUsageIncDec: "儲存空間增減"
@@ -2225,6 +2243,7 @@ _play:
title: "標題"
script: "腳本"
summary: "描述"
+ visibilityDescription: "如果您將其設為私密,它將不再顯示在您的個人資料中,但知道該 URL 的人仍然可以存取它。"
_pages:
newPage: "建立頁面"
editPage: "編輯頁面"
@@ -2269,6 +2288,8 @@ _pages:
section: "區段"
image: "圖片"
button: "按鈕"
+ dynamic: "動態方塊"
+ dynamicDescription: "這個方塊已經廢止,現在開始請使用 {play}。"
note: "嵌式貼文"
_note:
id: "貼文ID"
@@ -2298,6 +2319,7 @@ _notification:
sendTestNotification: "發送測試通知"
notificationWillBeDisplayedLikeThis: "通知會以這樣的方式顯示"
reactedBySomeUsers: "{n}人做出了反應"
+ likedBySomeUsers: "{n} 人按了讚"
renotedBySomeUsers: "{n}人做了轉發"
followedBySomeUsers: "被{n}人追隨了"
flushNotification: "重置通知歷史紀錄"
@@ -2524,4 +2546,21 @@ _reversi:
_offlineScreen:
title: "離線-無法連接伺服器"
header: "無法連接伺服器"
-
+_urlPreviewSetting:
+ title: "URL 預覽設定"
+ enable: "啟用 URL 預覽"
+ timeout: "取得預覽的逾時時間 (ms)"
+ timeoutDescription: "若取得預覽所需的時間超過這個值,則不會產生預覽。"
+ maximumContentLength: "Content-Length 的最大値 (byte)"
+ maximumContentLengthDescription: "若 Content-Length 超過這個值,則不會產生預覽。"
+ requireContentLength: "僅在能夠取得 Content-Length 時,才產生預覽。"
+ requireContentLengthDescription: "若對方的伺服器未回傳 Content -Length,則不會產生預覽。"
+ userAgent: "User-Agent"
+ userAgentDescription: "設定獲取預覽時使用的 User-Agent 。如果留空,將使用預設的 User-Agent 。"
+ summaryProxy: "產生預覽的代理端點"
+ summaryProxyDescription: "使用摘要代理程式而不是 Misskey 本身產生預覽。"
+ summaryProxyDescription2: "以下參數會作為查詢字串連結到代理。如果代理端不支援,這些設定將被忽略。"
+_mediaControls:
+ pip: "畫中畫"
+ playbackRate: "播放速度"
+ loop: "循環播放"
diff --git a/packages/backend/package.json b/packages/backend/package.json
index 23b3bfdb8b..8e29252d75 100644
--- a/packages/backend/package.json
+++ b/packages/backend/package.json
@@ -117,7 +117,7 @@
"fluent-ffmpeg": "2.1.2",
"form-data": "4.0.0",
"got": "14.2.1",
- "happy-dom": "14.7.1",
+ "happy-dom": "10.0.3",
"hpagent": "1.2.0",
"htmlescape": "1.1.1",
"http-link-header": "1.1.3",
diff --git a/packages/backend/src/misc/json-schema.ts b/packages/backend/src/misc/json-schema.ts
index a620d7c94b..41e5bfe9e4 100644
--- a/packages/backend/src/misc/json-schema.ts
+++ b/packages/backend/src/misc/json-schema.ts
@@ -228,7 +228,7 @@ export type SchemaTypeDef =
p['items']['allOf'] extends ReadonlyArray ? UnionToIntersection>>[] :
never
) :
- p['items'] extends NonNullable ? SchemaTypeDef[] :
+ p['items'] extends NonNullable ? SchemaType[] :
any[]
) :
p['anyOf'] extends ReadonlyArray ? UnionSchemaType & PartialIntersection> :
diff --git a/packages/backend/src/server/api/endpoints/users/show.ts b/packages/backend/src/server/api/endpoints/users/show.ts
index bd81989cb9..26cfa921c5 100644
--- a/packages/backend/src/server/api/endpoints/users/show.ts
+++ b/packages/backend/src/server/api/endpoints/users/show.ts
@@ -110,9 +110,11 @@ export default class extends Endpoint { // eslint-
});
// リクエストされた通りに並べ替え
+ // 順番は保持されるけど数は減ってる可能性がある
const _users: MiUser[] = [];
for (const id of ps.userIds) {
- _users.push(users.find(x => x.id === id)!);
+ const user = users.find(x => x.id === id);
+ if (user != null) _users.push(user);
}
return await Promise.all(_users.map(u => this.userEntityService.pack(u, me, {
diff --git a/packages/backend/src/server/web/ClientServerService.ts b/packages/backend/src/server/web/ClientServerService.ts
index 1394616752..f35ec8ba31 100644
--- a/packages/backend/src/server/web/ClientServerService.ts
+++ b/packages/backend/src/server/web/ClientServerService.ts
@@ -438,7 +438,7 @@ export class ClientServerService {
//#endregion
- const renderBase = async (reply: FastifyReply) => {
+ const renderBase = async (reply: FastifyReply, data: { [key: string]: any } = {}) => {
const meta = await this.metaService.fetch();
reply.header('Cache-Control', 'public, max-age=30');
return await reply.view('base', {
@@ -447,6 +447,7 @@ export class ClientServerService {
title: meta.name ?? 'Misskey',
desc: meta.description,
...await this.generateCommonPugData(meta),
+ ...data,
});
};
@@ -744,6 +745,18 @@ export class ClientServerService {
});
//#endregion
+ //region noindex pages
+ // Tags
+ fastify.get<{ Params: { clip: string; } }>('/tags/:tag', async (request, reply) => {
+ return await renderBase(reply, { noindex: true });
+ });
+
+ // User with Tags
+ fastify.get<{ Params: { clip: string; } }>('/user-tags/:tag', async (request, reply) => {
+ return await renderBase(reply, { noindex: true });
+ });
+ //endregion
+
fastify.get('/_info_card_', async (request, reply) => {
const meta = await this.metaService.fetch(true);
diff --git a/packages/backend/src/server/web/views/base.pug b/packages/backend/src/server/web/views/base.pug
index 1d9146e22a..ec1325e4e9 100644
--- a/packages/backend/src/server/web/views/base.pug
+++ b/packages/backend/src/server/web/views/base.pug
@@ -50,6 +50,9 @@ html
block title
= title || 'Misskey'
+ if noindex
+ meta(name='robots' content='noindex')
+
block desc
meta(name='description' content= desc || '✨🌎✨ A interplanetary communication platform ✨🚀✨')
diff --git a/packages/frontend/package.json b/packages/frontend/package.json
index a482373200..56b824c0c5 100644
--- a/packages/frontend/package.json
+++ b/packages/frontend/package.json
@@ -29,7 +29,7 @@
"@twemoji/parser": "15.1.1",
"@vitejs/plugin-vue": "5.0.4",
"@vue/compiler-sfc": "3.4.26",
- "aiscript-vscode": "github:aiscript-dev/aiscript-vscode#v0.1.4",
+ "aiscript-vscode": "github:aiscript-dev/aiscript-vscode#v0.1.9",
"astring": "1.8.6",
"broadcast-channel": "7.0.0",
"buraha": "0.0.1",
@@ -119,7 +119,7 @@
"eslint-plugin-import": "2.29.1",
"eslint-plugin-vue": "9.25.0",
"fast-glob": "3.3.2",
- "happy-dom": "14.7.1",
+ "happy-dom": "10.0.3",
"intersection-observer": "0.12.2",
"micromatch": "4.0.5",
"msw": "2.2.14",
diff --git a/packages/frontend/src/components/MkPostForm.vue b/packages/frontend/src/components/MkPostForm.vue
index 7dbc127298..41d603e40f 100644
--- a/packages/frontend/src/components/MkPostForm.vue
+++ b/packages/frontend/src/components/MkPostForm.vue
@@ -190,7 +190,7 @@ const localOnly = ref(props.initialLocalOnly ?? (defaultStore.state.rememberNote
const visibility = ref(props.initialVisibility ?? (defaultStore.state.rememberNoteVisibility ? defaultStore.state.visibility : defaultStore.state.defaultNoteVisibility));
const visibleUsers = ref([]);
if (props.initialVisibleUsers) {
- props.initialVisibleUsers.forEach(pushVisibleUser);
+ props.initialVisibleUsers.forEach(u => pushVisibleUser(u));
}
const reactionAcceptance = ref(defaultStore.state.reactionAcceptance);
const autocomplete = ref(null);
@@ -336,7 +336,7 @@ if (props.reply && ['home', 'followers', 'specified'].includes(props.reply.visib
misskeyApi('users/show', {
userIds: props.reply.visibleUserIds.filter(uid => uid !== $i.id && uid !== props.reply?.userId),
}).then(users => {
- users.forEach(pushVisibleUser);
+ users.forEach(u => pushVisibleUser(u));
});
}
@@ -967,11 +967,7 @@ onMounted(() => {
}
if (draft.data.visibleUserIds) {
misskeyApi('users/show', { userIds: draft.data.visibleUserIds }).then(users => {
- for (let i = 0; i < users.length; i++) {
- if (users[i].id === draft.data.visibleUserIds[i]) {
- pushVisibleUser(users[i]);
- }
- }
+ users.forEach(u => pushVisibleUser(u));
});
}
}
diff --git a/packages/frontend/src/pages/about-misskey.vue b/packages/frontend/src/pages/about-misskey.vue
index 92accd0117..b55ae220d8 100644
--- a/packages/frontend/src/pages/about-misskey.vue
+++ b/packages/frontend/src/pages/about-misskey.vue
@@ -231,6 +231,15 @@ const patronsWithIcon = [{
}, {
name: 'Takeno',
icon: 'https://assets.misskey-hub.net/patrons/6fba81536aea48fe94a30909c502dfa1.jpg',
+}, {
+ name: 'くびすじ',
+ icon: 'https://assets.misskey-hub.net/patrons/aa5789850b2149aeb5b89ebe2e9083db.jpg',
+}, {
+ name: '古道京紗@ぷらいべったー',
+ icon: 'https://assets.misskey-hub.net/patrons/18346d0519704963a4beabe6abc170af.jpg',
+}, {
+ name: '越貝鯛丸',
+ icon: 'https://assets.misskey-hub.net/patrons/86c7374de37849b882d8ebbc833dc968.jpg',
}];
const patrons = [
diff --git a/packages/frontend/src/pages/share.vue b/packages/frontend/src/pages/share.vue
index 680934e7ce..37f6558d64 100644
--- a/packages/frontend/src/pages/share.vue
+++ b/packages/frontend/src/pages/share.vue
@@ -64,7 +64,34 @@ async function init() {
// Googleニュース対策
if (text?.startsWith(`${title.value}.\n`)) noteText += text.replace(`${title.value}.\n`, '');
else if (text && title.value !== text) noteText += `${text}\n`;
- if (url) noteText += `${url}`;
+ if (url) {
+ try {
+ // Normalize the URL to URL-encoded and puny-coded from with the URL constructor.
+ //
+ // It's common to use unicode characters in the URL for better visibility of URL
+ // like: https://ja.wikipedia.org/wiki/ミスキー
+ // or like: https://藍.moe/
+ // However, in the MFM, the unicode characters must be URL-encoded to be parsed as `url` node
+ // like: https://ja.wikipedia.org/wiki/%E3%83%9F%E3%82%B9%E3%82%AD%E3%83%BC
+ // or like: https://xn--931a.moe/
+ // Therefore, we need to normalize the URL to URL-encoded form.
+ //
+ // The URL constructor will parse the URL and normalize unicode characters
+ // in the host to punycode and in the path component to URL-encoded form.
+ // (see url.spec.whatwg.org)
+ //
+ // In addition, the current MFM renderer decodes the URL-encoded path and / punycode encoded host name so
+ // this normalization doesn't make the visible URL ugly.
+ // (see MkUrl.vue)
+
+ noteText += new URL(url).href;
+ } catch {
+ // fallback to original URL if the URL is invalid.
+ // note that this is extremely rare since the `url` parameter is designed to share a URL and
+ // the URL constructor will throw TypeError only if failure, which means the URL is not valid.
+ noteText += url;
+ }
+ }
initialText.value = noteText.trim();
if (visibility.value === 'specified') {
diff --git a/packages/frontend/src/scripts/get-note-menu.ts b/packages/frontend/src/scripts/get-note-menu.ts
index 2cd21c1edc..e7c9a848e0 100644
--- a/packages/frontend/src/scripts/get-note-menu.ts
+++ b/packages/frontend/src/scripts/get-note-menu.ts
@@ -518,6 +518,7 @@ export function getRenoteMenu(props: {
const channelRenoteItems: MenuItem[] = [];
const normalRenoteItems: MenuItem[] = [];
+ const normalExternalChannelRenoteItems: MenuItem[] = [];
if (appearNote.channel) {
channelRenoteItems.push(...[{
@@ -596,12 +597,49 @@ export function getRenoteMenu(props: {
});
},
}]);
+
+ normalExternalChannelRenoteItems.push({
+ type: 'parent',
+ icon: 'ti ti-repeat',
+ text: appearNote.channel ? i18n.ts.renoteToOtherChannel : i18n.ts.renoteToChannel,
+ children: async () => {
+ const channels = await misskeyApi('channels/my-favorites', {
+ limit: 30,
+ });
+ return channels.filter((channel) => {
+ if (!appearNote.channelId) return true;
+ return channel.id !== appearNote.channelId;
+ }).map((channel) => ({
+ text: channel.name,
+ action: () => {
+ const el = props.renoteButton.value;
+ if (el) {
+ const rect = el.getBoundingClientRect();
+ const x = rect.left + (el.offsetWidth / 2);
+ const y = rect.top + (el.offsetHeight / 2);
+ os.popup(MkRippleEffect, { x, y }, {}, 'end');
+ }
+
+ if (!props.mock) {
+ misskeyApi('notes/create', {
+ renoteId: appearNote.id,
+ channelId: channel.id,
+ }).then(() => {
+ os.toast(i18n.tsx.renotedToX({ name: channel.name }));
+ });
+ }
+ },
+ }));
+ },
+ });
}
const renoteItems = [
...normalRenoteItems,
...(channelRenoteItems.length > 0 && normalRenoteItems.length > 0) ? [{ type: 'divider' }] as MenuItem[] : [],
...channelRenoteItems,
+ ...(normalExternalChannelRenoteItems.length > 0 && (normalRenoteItems.length > 0 || channelRenoteItems.length > 0)) ? [{ type: 'divider' }] as MenuItem[] : [],
+ ...normalExternalChannelRenoteItems,
];
return {
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 9ddc1f1160..465539b834 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -234,8 +234,8 @@ importers:
specifier: 14.2.1
version: 14.2.1
happy-dom:
- specifier: 14.7.1
- version: 14.7.1
+ specifier: 10.0.3
+ version: 10.0.3
hpagent:
specifier: 1.2.0
version: 1.2.0
@@ -722,8 +722,8 @@ importers:
specifier: 3.4.26
version: 3.4.26
aiscript-vscode:
- specifier: github:aiscript-dev/aiscript-vscode#v0.1.4
- version: https://codeload.github.com/aiscript-dev/aiscript-vscode/tar.gz/3f79d6f0550369267220aa67702287948d885424
+ specifier: github:aiscript-dev/aiscript-vscode#v0.1.9
+ version: https://codeload.github.com/aiscript-dev/aiscript-vscode/tar.gz/34bf4e1530efcf1efa855bd04e2dab39735e1b02
astring:
specifier: 1.8.6
version: 1.8.6
@@ -871,7 +871,7 @@ importers:
version: 8.0.9(@types/react@18.0.28)(encoding@0.1.13)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
'@storybook/addon-interactions':
specifier: 8.0.9
- version: 8.0.9(@jest/globals@29.7.0)(@types/jest@29.5.12)(jest@29.7.0(@types/node@20.12.7))(vitest@0.34.6(happy-dom@14.7.1)(jsdom@24.0.0(bufferutil@4.0.7)(utf-8-validate@6.0.3))(sass@1.76.0)(terser@5.30.3))
+ version: 8.0.9(@jest/globals@29.7.0)(@types/jest@29.5.12)(jest@29.7.0(@types/node@20.12.7))(vitest@0.34.6(happy-dom@10.0.3)(jsdom@24.0.0(bufferutil@4.0.7)(utf-8-validate@6.0.3))(sass@1.76.0)(terser@5.30.3))
'@storybook/addon-links':
specifier: 8.0.9
version: 8.0.9(react@18.3.1)
@@ -904,7 +904,7 @@ importers:
version: 8.0.9(encoding@0.1.13)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.17.2)(typescript@5.4.5)(vite@5.2.11(@types/node@20.12.7)(sass@1.76.0)(terser@5.30.3))
'@storybook/test':
specifier: 8.0.9
- version: 8.0.9(@jest/globals@29.7.0)(@types/jest@29.5.12)(jest@29.7.0(@types/node@20.12.7))(vitest@0.34.6(happy-dom@14.7.1)(jsdom@24.0.0(bufferutil@4.0.7)(utf-8-validate@6.0.3))(sass@1.76.0)(terser@5.30.3))
+ version: 8.0.9(@jest/globals@29.7.0)(@types/jest@29.5.12)(jest@29.7.0(@types/node@20.12.7))(vitest@0.34.6(happy-dom@10.0.3)(jsdom@24.0.0(bufferutil@4.0.7)(utf-8-validate@6.0.3))(sass@1.76.0)(terser@5.30.3))
'@storybook/theming':
specifier: 8.0.9
version: 8.0.9(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
@@ -919,7 +919,7 @@ importers:
version: 8.0.9(bufferutil@4.0.7)(encoding@0.1.13)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(utf-8-validate@6.0.3)(vite@5.2.11(@types/node@20.12.7)(sass@1.76.0)(terser@5.30.3))(vue@3.4.26(typescript@5.4.5))
'@testing-library/vue':
specifier: 8.0.3
- version: 8.0.3(@vue/compiler-sfc@3.4.26)(@vue/server-renderer@3.4.25(vue@3.4.26(typescript@5.4.5)))(vue@3.4.26(typescript@5.4.5))
+ version: 8.0.3(@vue/compiler-sfc@3.4.26)(@vue/server-renderer@3.4.26(vue@3.4.26(typescript@5.4.5)))(vue@3.4.26(typescript@5.4.5))
'@types/escape-regexp':
specifier: 0.0.3
version: 0.0.3
@@ -961,7 +961,7 @@ importers:
version: 7.7.1(eslint@8.57.0)(typescript@5.4.5)
'@vitest/coverage-v8':
specifier: 0.34.6
- version: 0.34.6(vitest@0.34.6(happy-dom@14.7.1)(jsdom@24.0.0(bufferutil@4.0.7)(utf-8-validate@6.0.3))(sass@1.76.0)(terser@5.30.3))
+ version: 0.34.6(vitest@0.34.6(happy-dom@10.0.3)(jsdom@24.0.0(bufferutil@4.0.7)(utf-8-validate@6.0.3))(sass@1.76.0)(terser@5.30.3))
'@vue/runtime-core':
specifier: 3.4.26
version: 3.4.26
@@ -987,8 +987,8 @@ importers:
specifier: 3.3.2
version: 3.3.2
happy-dom:
- specifier: 14.7.1
- version: 14.7.1
+ specifier: 10.0.3
+ version: 10.0.3
intersection-observer:
specifier: 0.12.2
version: 0.12.2
@@ -1027,10 +1027,10 @@ importers:
version: 1.0.3
vitest:
specifier: 0.34.6
- version: 0.34.6(happy-dom@14.7.1)(jsdom@24.0.0(bufferutil@4.0.7)(utf-8-validate@6.0.3))(sass@1.76.0)(terser@5.30.3)
+ version: 0.34.6(happy-dom@10.0.3)(jsdom@24.0.0(bufferutil@4.0.7)(utf-8-validate@6.0.3))(sass@1.76.0)(terser@5.30.3)
vitest-fetch-mock:
specifier: 0.2.2
- version: 0.2.2(encoding@0.1.13)(vitest@0.34.6(happy-dom@14.7.1)(jsdom@24.0.0(bufferutil@4.0.7)(utf-8-validate@6.0.3))(sass@1.76.0)(terser@5.30.3))
+ version: 0.2.2(encoding@0.1.13)(vitest@0.34.6(happy-dom@10.0.3)(jsdom@24.0.0(bufferutil@4.0.7)(utf-8-validate@6.0.3))(sass@1.76.0)(terser@5.30.3))
vue-component-type-helpers:
specifier: 2.0.16
version: 2.0.16
@@ -4819,9 +4819,6 @@ packages:
'@vue/compiler-sfc@3.4.26':
resolution: {integrity: sha512-It1dp+FAOCgluYSVYlDn5DtZBxk1NCiJJfu2mlQqa/b+k8GL6NG/3/zRbJnHdhV2VhxFghaDq5L4K+1dakW6cw==}
- '@vue/compiler-ssr@3.4.25':
- resolution: {integrity: sha512-H2ohvM/Pf6LelGxDBnfbbXFPyM4NE3hrw0e/EpwuSiYu8c819wx+SVGdJ65p/sFrYDd6OnSDxN1MB2mN07hRSQ==}
-
'@vue/compiler-ssr@3.4.26':
resolution: {integrity: sha512-FNwLfk7LlEPRY/g+nw2VqiDKcnDTVdCfBREekF8X74cPLiWHUX6oldktf/Vx28yh4STNy7t+/yuLoMBBF7YDiQ==}
@@ -4845,11 +4842,6 @@ packages:
'@vue/runtime-dom@3.4.26':
resolution: {integrity: sha512-UftYA2hUXR2UOZD/Fc3IndZuCOOJgFxJsWOxDkhfVcwLbsfh2CdXE2tG4jWxBZuDAs9J9PzRTUFt1PgydEtItw==}
- '@vue/server-renderer@3.4.25':
- resolution: {integrity: sha512-8VTwq0Zcu3K4dWV0jOwIVINESE/gha3ifYCOKEhxOj6MEl5K5y8J8clQncTcDhKF+9U765nRw4UdUEXvrGhyVQ==}
- peerDependencies:
- vue: 3.4.25
-
'@vue/server-renderer@3.4.26':
resolution: {integrity: sha512-xoGAqSjYDPGAeRWxeoYwqJFD/gw7mpgzOvSxEmjWaFO2rE6qpbD1PC172YRpvKhrihkyHJkNDADFXTfCyVGhKw==}
peerDependencies:
@@ -4959,9 +4951,9 @@ packages:
resolution: {integrity: sha512-gOsf2YwSlleG6IjRYG2A7k0HmBMEo6qVNk9Bp/EaLgAJT5ngH6PXbqa4ItvnEwCm/velL5jAnQgsHsWnjhGmvw==}
engines: {node: '>=18'}
- aiscript-vscode@https://codeload.github.com/aiscript-dev/aiscript-vscode/tar.gz/3f79d6f0550369267220aa67702287948d885424:
- resolution: {tarball: https://codeload.github.com/aiscript-dev/aiscript-vscode/tar.gz/3f79d6f0550369267220aa67702287948d885424}
- version: 0.1.4
+ aiscript-vscode@https://codeload.github.com/aiscript-dev/aiscript-vscode/tar.gz/34bf4e1530efcf1efa855bd04e2dab39735e1b02:
+ resolution: {tarball: https://codeload.github.com/aiscript-dev/aiscript-vscode/tar.gz/34bf4e1530efcf1efa855bd04e2dab39735e1b02}
+ version: 0.1.9
engines: {vscode: ^1.83.0}
ajv-draft-04@1.0.0:
@@ -6906,9 +6898,8 @@ packages:
engines: {node: '>=0.4.7'}
hasBin: true
- happy-dom@14.7.1:
- resolution: {integrity: sha512-v60Q0evZ4clvMcrAh5/F8EdxDdfHdFrtffz/CNe10jKD+nFweZVxM91tW+UyY2L4AtpgIaXdZ7TQmiO1pfcwbg==}
- engines: {node: '>=16.0.0'}
+ happy-dom@10.0.3:
+ resolution: {integrity: sha512-WkCP+Z5fX6U5PY+yHP3ElV5D9PoxRAHRWPFq3pG9rg/6Hjf5ak7dozAgSCywsTRUq2qfa8vV8OQvUy5pRXy8EQ==}
har-schema@2.0.0:
resolution: {integrity: sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==}
@@ -10875,6 +10866,9 @@ packages:
vue-component-type-helpers@2.0.16:
resolution: {integrity: sha512-qisL/iAfdO++7w+SsfYQJVPj6QKvxp4i1MMxvsNO41z/8zu3KuAw9LkhKUfP/kcOWGDxESp+pQObWppXusejCA==}
+ vue-component-type-helpers@2.0.19:
+ resolution: {integrity: sha512-cN3f1aTxxKo4lzNeQAkVopswuImUrb5Iurll9Gaw5cqpnbTAxtEMM1mgi6ou4X79OCyqYv1U1mzBHJkzmiK82w==}
+
vue-demi@0.14.7:
resolution: {integrity: sha512-EOG8KXDQNwkJILkx/gPcoL/7vH+hORoBaKgGe+6W7VFMvCYJfmF2dGbvgDroVnI8LU7/kTu8mbjRZGBU1z9NTA==}
engines: {node: '>=12'}
@@ -10972,6 +10966,10 @@ packages:
webpack-virtual-modules@0.5.0:
resolution: {integrity: sha512-kyDivFZ7ZM0BVOUteVbDFhlRt7Ah/CSPwJdi8hBpkK7QLumUqdLtVfm/PX/hkcnrvr0i77fO5+TjZ94Pe+C9iw==}
+ whatwg-encoding@2.0.0:
+ resolution: {integrity: sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==}
+ engines: {node: '>=12'}
+
whatwg-encoding@3.1.1:
resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==}
engines: {node: '>=18'}
@@ -14380,11 +14378,11 @@ snapshots:
dependencies:
'@storybook/global': 5.0.0
- '@storybook/addon-interactions@8.0.9(@jest/globals@29.7.0)(@types/jest@29.5.12)(jest@29.7.0(@types/node@20.12.7))(vitest@0.34.6(happy-dom@14.7.1)(jsdom@24.0.0(bufferutil@4.0.7)(utf-8-validate@6.0.3))(sass@1.76.0)(terser@5.30.3))':
+ '@storybook/addon-interactions@8.0.9(@jest/globals@29.7.0)(@types/jest@29.5.12)(jest@29.7.0(@types/node@20.12.7))(vitest@0.34.6(happy-dom@10.0.3)(jsdom@24.0.0(bufferutil@4.0.7)(utf-8-validate@6.0.3))(sass@1.76.0)(terser@5.30.3))':
dependencies:
'@storybook/global': 5.0.0
'@storybook/instrumenter': 8.0.9
- '@storybook/test': 8.0.9(@jest/globals@29.7.0)(@types/jest@29.5.12)(jest@29.7.0(@types/node@20.12.7))(vitest@0.34.6(happy-dom@14.7.1)(jsdom@24.0.0(bufferutil@4.0.7)(utf-8-validate@6.0.3))(sass@1.76.0)(terser@5.30.3))
+ '@storybook/test': 8.0.9(@jest/globals@29.7.0)(@types/jest@29.5.12)(jest@29.7.0(@types/node@20.12.7))(vitest@0.34.6(happy-dom@10.0.3)(jsdom@24.0.0(bufferutil@4.0.7)(utf-8-validate@6.0.3))(sass@1.76.0)(terser@5.30.3))
'@storybook/types': 8.0.9
polished: 4.2.2
ts-dedent: 2.2.0
@@ -14888,14 +14886,14 @@ snapshots:
- encoding
- supports-color
- '@storybook/test@8.0.9(@jest/globals@29.7.0)(@types/jest@29.5.12)(jest@29.7.0(@types/node@20.12.7))(vitest@0.34.6(happy-dom@14.7.1)(jsdom@24.0.0(bufferutil@4.0.7)(utf-8-validate@6.0.3))(sass@1.76.0)(terser@5.30.3))':
+ '@storybook/test@8.0.9(@jest/globals@29.7.0)(@types/jest@29.5.12)(jest@29.7.0(@types/node@20.12.7))(vitest@0.34.6(happy-dom@10.0.3)(jsdom@24.0.0(bufferutil@4.0.7)(utf-8-validate@6.0.3))(sass@1.76.0)(terser@5.30.3))':
dependencies:
'@storybook/client-logger': 8.0.9
'@storybook/core-events': 8.0.9
'@storybook/instrumenter': 8.0.9
'@storybook/preview-api': 8.0.9
'@testing-library/dom': 9.3.4
- '@testing-library/jest-dom': 6.4.2(@jest/globals@29.7.0)(@types/jest@29.5.12)(jest@29.7.0(@types/node@20.12.7))(vitest@0.34.6(happy-dom@14.7.1)(jsdom@24.0.0(bufferutil@4.0.7)(utf-8-validate@6.0.3))(sass@1.76.0)(terser@5.30.3))
+ '@testing-library/jest-dom': 6.4.2(@jest/globals@29.7.0)(@types/jest@29.5.12)(jest@29.7.0(@types/node@20.12.7))(vitest@0.34.6(happy-dom@10.0.3)(jsdom@24.0.0(bufferutil@4.0.7)(utf-8-validate@6.0.3))(sass@1.76.0)(terser@5.30.3))
'@testing-library/user-event': 14.5.2(@testing-library/dom@9.3.4)
'@vitest/expect': 1.3.1
'@vitest/spy': 1.6.0
@@ -14956,7 +14954,7 @@ snapshots:
ts-dedent: 2.2.0
type-fest: 2.19.0
vue: 3.4.26(typescript@5.4.5)
- vue-component-type-helpers: 2.0.16
+ vue-component-type-helpers: 2.0.19
transitivePeerDependencies:
- encoding
- supports-color
@@ -15197,7 +15195,7 @@ snapshots:
lz-string: 1.5.0
pretty-format: 27.5.1
- '@testing-library/jest-dom@6.4.2(@jest/globals@29.7.0)(@types/jest@29.5.12)(jest@29.7.0(@types/node@20.12.7))(vitest@0.34.6(happy-dom@14.7.1)(jsdom@24.0.0(bufferutil@4.0.7)(utf-8-validate@6.0.3))(sass@1.76.0)(terser@5.30.3))':
+ '@testing-library/jest-dom@6.4.2(@jest/globals@29.7.0)(@types/jest@29.5.12)(jest@29.7.0(@types/node@20.12.7))(vitest@0.34.6(happy-dom@10.0.3)(jsdom@24.0.0(bufferutil@4.0.7)(utf-8-validate@6.0.3))(sass@1.76.0)(terser@5.30.3))':
dependencies:
'@adobe/css-tools': 4.3.3
'@babel/runtime': 7.23.4
@@ -15211,17 +15209,17 @@ snapshots:
'@jest/globals': 29.7.0
'@types/jest': 29.5.12
jest: 29.7.0(@types/node@20.12.7)
- vitest: 0.34.6(happy-dom@14.7.1)(jsdom@24.0.0(bufferutil@4.0.7)(utf-8-validate@6.0.3))(sass@1.76.0)(terser@5.30.3)
+ vitest: 0.34.6(happy-dom@10.0.3)(jsdom@24.0.0(bufferutil@4.0.7)(utf-8-validate@6.0.3))(sass@1.76.0)(terser@5.30.3)
'@testing-library/user-event@14.5.2(@testing-library/dom@9.3.4)':
dependencies:
'@testing-library/dom': 9.3.4
- '@testing-library/vue@8.0.3(@vue/compiler-sfc@3.4.26)(@vue/server-renderer@3.4.25(vue@3.4.26(typescript@5.4.5)))(vue@3.4.26(typescript@5.4.5))':
+ '@testing-library/vue@8.0.3(@vue/compiler-sfc@3.4.26)(@vue/server-renderer@3.4.26(vue@3.4.26(typescript@5.4.5)))(vue@3.4.26(typescript@5.4.5))':
dependencies:
'@babel/runtime': 7.23.4
'@testing-library/dom': 9.3.3
- '@vue/test-utils': 2.4.1(@vue/server-renderer@3.4.25(vue@3.4.26(typescript@5.4.5)))(vue@3.4.26(typescript@5.4.5))
+ '@vue/test-utils': 2.4.1(@vue/server-renderer@3.4.26(vue@3.4.26(typescript@5.4.5)))(vue@3.4.26(typescript@5.4.5))
vue: 3.4.26(typescript@5.4.5)
optionalDependencies:
'@vue/compiler-sfc': 3.4.26
@@ -15875,7 +15873,7 @@ snapshots:
vite: 5.2.11(@types/node@20.12.7)(sass@1.76.0)(terser@5.30.3)
vue: 3.4.26(typescript@5.4.5)
- '@vitest/coverage-v8@0.34.6(vitest@0.34.6(happy-dom@14.7.1)(jsdom@24.0.0(bufferutil@4.0.7)(utf-8-validate@6.0.3))(sass@1.76.0)(terser@5.30.3))':
+ '@vitest/coverage-v8@0.34.6(vitest@0.34.6(happy-dom@10.0.3)(jsdom@24.0.0(bufferutil@4.0.7)(utf-8-validate@6.0.3))(sass@1.76.0)(terser@5.30.3))':
dependencies:
'@ampproject/remapping': 2.2.1
'@bcoe/v8-coverage': 0.2.3
@@ -15888,7 +15886,7 @@ snapshots:
std-env: 3.7.0
test-exclude: 6.0.0
v8-to-istanbul: 9.2.0
- vitest: 0.34.6(happy-dom@14.7.1)(jsdom@24.0.0(bufferutil@4.0.7)(utf-8-validate@6.0.3))(sass@1.76.0)(terser@5.30.3)
+ vitest: 0.34.6(happy-dom@10.0.3)(jsdom@24.0.0(bufferutil@4.0.7)(utf-8-validate@6.0.3))(sass@1.76.0)(terser@5.30.3)
transitivePeerDependencies:
- supports-color
@@ -16012,12 +16010,6 @@ snapshots:
postcss: 8.4.38
source-map-js: 1.2.0
- '@vue/compiler-ssr@3.4.25':
- dependencies:
- '@vue/compiler-dom': 3.4.25
- '@vue/shared': 3.4.25
- optional: true
-
'@vue/compiler-ssr@3.4.26':
dependencies:
'@vue/compiler-dom': 3.4.26
@@ -16052,13 +16044,6 @@ snapshots:
'@vue/shared': 3.4.26
csstype: 3.1.3
- '@vue/server-renderer@3.4.25(vue@3.4.26(typescript@5.4.5))':
- dependencies:
- '@vue/compiler-ssr': 3.4.25
- '@vue/shared': 3.4.25
- vue: 3.4.26(typescript@5.4.5)
- optional: true
-
'@vue/server-renderer@3.4.26(vue@3.4.26(typescript@5.4.5))':
dependencies:
'@vue/compiler-ssr': 3.4.26
@@ -16071,13 +16056,13 @@ snapshots:
'@vue/shared@3.4.26': {}
- '@vue/test-utils@2.4.1(@vue/server-renderer@3.4.25(vue@3.4.26(typescript@5.4.5)))(vue@3.4.26(typescript@5.4.5))':
+ '@vue/test-utils@2.4.1(@vue/server-renderer@3.4.26(vue@3.4.26(typescript@5.4.5)))(vue@3.4.26(typescript@5.4.5))':
dependencies:
js-beautify: 1.14.9
vue: 3.4.26(typescript@5.4.5)
vue-component-type-helpers: 1.8.4
optionalDependencies:
- '@vue/server-renderer': 3.4.25(vue@3.4.26(typescript@5.4.5))
+ '@vue/server-renderer': 3.4.26(vue@3.4.26(typescript@5.4.5))
'@webgpu/types@0.1.30': {}
@@ -16159,7 +16144,7 @@ snapshots:
clean-stack: 5.2.0
indent-string: 5.0.0
- aiscript-vscode@https://codeload.github.com/aiscript-dev/aiscript-vscode/tar.gz/3f79d6f0550369267220aa67702287948d885424:
+ aiscript-vscode@https://codeload.github.com/aiscript-dev/aiscript-vscode/tar.gz/34bf4e1530efcf1efa855bd04e2dab39735e1b02:
dependencies:
'@aiscript-dev/aiscript-languageserver': https://github.com/aiscript-dev/aiscript-languageserver/releases/download/0.1.6/aiscript-dev-aiscript-languageserver-0.1.6.tgz
vscode-languageclient: 9.0.1
@@ -18816,10 +18801,13 @@ snapshots:
optionalDependencies:
uglify-js: 3.17.4
- happy-dom@14.7.1:
+ happy-dom@10.0.3:
dependencies:
+ css.escape: 1.5.1
entities: 4.5.0
+ iconv-lite: 0.6.3
webidl-conversions: 7.0.0
+ whatwg-encoding: 2.0.0
whatwg-mimetype: 3.0.0
har-schema@2.0.0: {}
@@ -23142,14 +23130,14 @@ snapshots:
sass: 1.76.0
terser: 5.30.3
- vitest-fetch-mock@0.2.2(encoding@0.1.13)(vitest@0.34.6(happy-dom@14.7.1)(jsdom@24.0.0(bufferutil@4.0.7)(utf-8-validate@6.0.3))(sass@1.76.0)(terser@5.30.3)):
+ vitest-fetch-mock@0.2.2(encoding@0.1.13)(vitest@0.34.6(happy-dom@10.0.3)(jsdom@24.0.0(bufferutil@4.0.7)(utf-8-validate@6.0.3))(sass@1.76.0)(terser@5.30.3)):
dependencies:
cross-fetch: 3.1.6(encoding@0.1.13)
- vitest: 0.34.6(happy-dom@14.7.1)(jsdom@24.0.0(bufferutil@4.0.7)(utf-8-validate@6.0.3))(sass@1.76.0)(terser@5.30.3)
+ vitest: 0.34.6(happy-dom@10.0.3)(jsdom@24.0.0(bufferutil@4.0.7)(utf-8-validate@6.0.3))(sass@1.76.0)(terser@5.30.3)
transitivePeerDependencies:
- encoding
- vitest@0.34.6(happy-dom@14.7.1)(jsdom@24.0.0(bufferutil@4.0.7)(utf-8-validate@6.0.3))(sass@1.76.0)(terser@5.30.3):
+ vitest@0.34.6(happy-dom@10.0.3)(jsdom@24.0.0(bufferutil@4.0.7)(utf-8-validate@6.0.3))(sass@1.76.0)(terser@5.30.3):
dependencies:
'@types/chai': 4.3.11
'@types/chai-subset': 1.3.5
@@ -23176,7 +23164,7 @@ snapshots:
vite-node: 0.34.6(@types/node@20.12.7)(sass@1.76.0)(terser@5.30.3)
why-is-node-running: 2.2.2
optionalDependencies:
- happy-dom: 14.7.1
+ happy-dom: 10.0.3
jsdom: 24.0.0(bufferutil@4.0.7)(utf-8-validate@6.0.3)
transitivePeerDependencies:
- less
@@ -23223,6 +23211,8 @@ snapshots:
vue-component-type-helpers@2.0.16: {}
+ vue-component-type-helpers@2.0.19: {}
+
vue-demi@0.14.7(vue@3.4.26(typescript@5.4.5)):
dependencies:
vue: 3.4.26(typescript@5.4.5)
@@ -23340,6 +23330,10 @@ snapshots:
webpack-virtual-modules@0.5.0: {}
+ whatwg-encoding@2.0.0:
+ dependencies:
+ iconv-lite: 0.6.3
+
whatwg-encoding@3.1.1:
dependencies:
iconv-lite: 0.6.3