Compare commits
39 Commits
13.14.0-be
...
revert-mod
Author | SHA1 | Date | |
---|---|---|---|
![]() |
b6b300a12a | ||
![]() |
e5fce15ba5 | ||
![]() |
c59a9c6f84 | ||
![]() |
545b5cab96 | ||
![]() |
fe13755be8 | ||
![]() |
9208cfd5f3 | ||
![]() |
81ba841fb8 | ||
![]() |
0404d9c103 | ||
![]() |
c1a19ff900 | ||
![]() |
ac6a8edf0b | ||
![]() |
8851e90316 | ||
![]() |
fca6ae9403 | ||
![]() |
4f4f15a6a4 | ||
![]() |
7097d553e4 | ||
![]() |
b8973a6f19 | ||
![]() |
50de2e76b4 | ||
![]() |
40c5699d93 | ||
![]() |
a87dd5ddec | ||
![]() |
561683f097 | ||
![]() |
c9b9db13c7 | ||
![]() |
a8cd8ed99e | ||
![]() |
b3358f0a8b | ||
![]() |
af2368bd2b | ||
![]() |
2cb8e8a748 | ||
![]() |
c40f52b262 | ||
![]() |
2801946226 | ||
![]() |
0d2e3df061 | ||
![]() |
64c142b1ca | ||
![]() |
df2b61fcc6 | ||
![]() |
509e3f979e | ||
![]() |
b546d4108f | ||
![]() |
46f86a9146 | ||
![]() |
2191479c76 | ||
![]() |
0a06eb27da | ||
![]() |
47b684100d | ||
![]() |
7d6ea74288 | ||
![]() |
8e11a30c36 | ||
![]() |
5dc8f63a07 | ||
![]() |
e6fca72171 |
@@ -82,6 +82,8 @@ redis:
|
||||
#pass: example-pass
|
||||
#prefix: example-prefix
|
||||
#db: 1
|
||||
# You can specify more ioredis options...
|
||||
#username: example-username
|
||||
|
||||
#redisForPubsub:
|
||||
# host: localhost
|
||||
@@ -90,6 +92,8 @@ redis:
|
||||
# #pass: example-pass
|
||||
# #prefix: example-prefix
|
||||
# #db: 1
|
||||
# # You can specify more ioredis options...
|
||||
# #username: example-username
|
||||
|
||||
#redisForJobQueue:
|
||||
# host: localhost
|
||||
@@ -98,6 +102,8 @@ redis:
|
||||
# #pass: example-pass
|
||||
# #prefix: example-prefix
|
||||
# #db: 1
|
||||
# # You can specify more ioredis options...
|
||||
# #username: example-username
|
||||
|
||||
# ┌───────────────────────────┐
|
||||
#───┘ MeiliSearch configuration └─────────────────────────────
|
||||
|
25
CHANGELOG.md
25
CHANGELOG.md
@@ -8,12 +8,24 @@
|
||||
-
|
||||
|
||||
### Server
|
||||
-
|
||||
- Fix: 外部サーバーの投稿がタイムラインに表示されないことがある問題を修正
|
||||
|
||||
-->
|
||||
|
||||
## 13.x.x (unreleased)
|
||||
|
||||
### General
|
||||
-
|
||||
|
||||
### Client
|
||||
- リストTLで、ユーザーが追加・削除されてもTLを初期化しないように
|
||||
- Fix: モバイル表示のときページ下部がナビゲーションバーに隠れる問題を修正
|
||||
- Fix: Selecting all emojis in Custom emoji is impossible
|
||||
|
||||
### Server
|
||||
- Fix: APIのオフセットが壊れていたせいで「もっと見る」でもっと見れない問題を修正
|
||||
|
||||
## 13.14.1
|
||||
|
||||
### General
|
||||
- 招待機能を改善しました
|
||||
* 過去に発行した招待コードを確認できるようになりました
|
||||
@@ -27,6 +39,7 @@
|
||||
- deck UIのカラムのメニューからアンテナとリストの編集画面を開けるように
|
||||
- ドライブファイルのメニューで画像をクロップできるように
|
||||
- 画像を動画と同様に簡単に隠せるように
|
||||
- Enhance: ノートの埋め込みが複数画像と動画を表示されるように
|
||||
- オリジナル画像を保持せずにアップロードする場合webpでアップロードされるように(Safari以外)
|
||||
- 見たことのあるRenoteを省略して表示をオンのときに自分のnoteのrenoteを省略するように
|
||||
- フォルダーやファイルに対しても開発者モード使用時、IDをコピーできるように
|
||||
@@ -42,6 +55,8 @@
|
||||
- ロール設定画面でロールIDを確認できるように
|
||||
- コンテキストメニュー表示時のパフォーマンスを改善
|
||||
- フォロー/フォロワー非公開時の表示を改善
|
||||
- 本文にMFMが含まれている場合に自動でたたまれる機能が、返信先や引用RNにも適用されるように
|
||||
- position は対象外になりました
|
||||
- AiScriptを0.15.0に更新
|
||||
- Fix: サーバーメトリクスが90度傾いている
|
||||
- Fix: 非ログイン時にクレデンシャルが必要なページに行くとエラーが出る問題を修正
|
||||
@@ -59,15 +74,19 @@
|
||||
- nsfwjs のモデルロードを排他することで、重複ロードによってメモリ使用量が増加しないように
|
||||
- 連合の配送ジョブのパフォーマンスを向上(ロック機構の見直し、Redisキャッシュの活用)
|
||||
- featuredノートのsignedGet回数を減らしました
|
||||
- リモートサーバーからのNSFW映像のキャッシュだけを無効化できるオプションを追加
|
||||
- ActivityPubの署名用鍵長を2048bitに変更しパフォーマンスを向上(新規アカウントのみ)
|
||||
- リモートサーバーのセンシティブなファイルのキャッシュだけを無効化できるオプションを追加
|
||||
- MeilisearchにIndexするノートの範囲を設定できるように
|
||||
- Export notes with file detail
|
||||
- Add unix socket support
|
||||
- 設定ファイルでioredisの全てのオプションを指定可能に
|
||||
- Fix: エクスポートしたカスタム絵文字のzipが大きいと読み込めない問題を修正
|
||||
- Fix: リモートサーバーに無意味なActivityPubの配信を行うことがあるのを修正
|
||||
- Fix: Remove Meilisearch index when notes are deleted
|
||||
- Fix: 非英語環境でのPostgreSQLのエラーハンドリングを修正
|
||||
- Fix: インスタンスのアイコンがbase64の場合の挙動を修正
|
||||
- Fix: ローカルの `Person` を指す `acct` URI を解析するときのバグを修正しました
|
||||
- Fix: 無効化されたアンテナが再度有効化されないことがある問題を修正
|
||||
|
||||
## 13.13.2
|
||||
|
||||
|
@@ -214,30 +214,13 @@ Misskey uses [Storybook](https://storybook.js.org/) for UI development.
|
||||
|
||||
### Setup & Run
|
||||
|
||||
#### Universal
|
||||
|
||||
##### Setup
|
||||
|
||||
```bash
|
||||
pnpm --filter misskey-js build
|
||||
pnpm --filter frontend tsc -p .storybook && (node packages/frontend/.storybook/preload-locale.js & node packages/frontend/.storybook/preload-theme.js)
|
||||
```
|
||||
|
||||
##### Run
|
||||
|
||||
```bash
|
||||
node packages/frontend/.storybook/generate.js && pnpm --filter frontend storybook dev
|
||||
```
|
||||
|
||||
#### macOS & Linux
|
||||
|
||||
##### Setup
|
||||
#### Setup
|
||||
|
||||
```bash
|
||||
pnpm --filter misskey-js build
|
||||
```
|
||||
|
||||
##### Run
|
||||
#### Run
|
||||
|
||||
```bash
|
||||
pnpm --filter frontend storybook-dev
|
||||
|
@@ -2,6 +2,7 @@
|
||||
_lang_: "Čeština"
|
||||
headlineMisskey: "Síť propojená poznámkami"
|
||||
introMisskey: "Vítejte! Misskey je otevřený a decentralizovaný microblogový servis.\n\"Poznámkami\" můžete sdílet co se zrovna děje se všemi ve Vašem okolí. 📡\nPomocí \"reakcí\" můžete sdílet své názory a pocity na ostatní poznámky. 👍\nPojďte objevovat nový svět! 🚀"
|
||||
poweredByMisskeyDescription: "{name} je jeden ze serverů využívající open source platformu <b>Misskey<b> (nazývaná \"Misskey instance\")."
|
||||
monthAndDay: "{day}. {month}."
|
||||
search: "Vyhledávání"
|
||||
notifications: "Oznámení"
|
||||
@@ -48,8 +49,15 @@ delete: "Smazat"
|
||||
deleteAndEdit: "Smazat a upravit"
|
||||
deleteAndEditConfirm: "Jste si jistí že chcete smazat tuto poznámku a editovat ji? Ztratíte tím všechny reakce, sdílení a odpovědi na ni."
|
||||
addToList: "Přidat do seznamu"
|
||||
addToAntenna: "Přidat do antény"
|
||||
sendMessage: "Odeslat zprávu"
|
||||
copyRSS: "Kopírovat RSS"
|
||||
copyUsername: "Kopírovat uživatelské jméno"
|
||||
copyUserId: "Kopírovat ID uživatele"
|
||||
copyNoteId: "Kopírovat ID poznámky"
|
||||
copyFileId: "Kopírovat ID souboru"
|
||||
copyFolderId: "Kopírovat ID složky"
|
||||
copyProfileUrl: "Kopírovat URL profilu"
|
||||
searchUser: "Vyhledat uživatele"
|
||||
reply: "Odpovědět"
|
||||
loadMore: "Zobrazit více"
|
||||
@@ -60,6 +68,7 @@ receiveFollowRequest: "Žádost o sledování přijata"
|
||||
followRequestAccepted: "Žádost o sledování přijata"
|
||||
mention: "Zmínění"
|
||||
mentions: "Zmínění"
|
||||
directNotes: "Přímé poznámky"
|
||||
importAndExport: "Import a export"
|
||||
import: "Importovat"
|
||||
export: "Exportovat"
|
||||
@@ -82,6 +91,7 @@ error: "Chyba"
|
||||
somethingHappened: "Jejda. Něco se nepovedlo."
|
||||
retry: "Opakovat"
|
||||
pageLoadError: "Nepodařilo se načíst stránku"
|
||||
pageLoadErrorDescription: "Tohle je obvykle způsobeno chybou sítě nebo mezipaměti prohlížeče. Zkuste vymazat mezipaměť a po chvíli čekání to zkuste znovu."
|
||||
serverIsDead: "Server neodpovídá. Počkejte chvíli a zkuste to znovu."
|
||||
youShouldUpgradeClient: "Pro zobrazení této stránky obnovte stránku pro aktualizaci klienta."
|
||||
enterListName: "Jméno seznamu"
|
||||
@@ -100,6 +110,8 @@ renoted: "Přeposláno"
|
||||
cantRenote: "Tento příspěvek nelze přeposlat."
|
||||
cantReRenote: "Odpověď nemůže být odstraněna."
|
||||
quote: "Citovat"
|
||||
inChannelRenote: "Přeposlání v kanálu"
|
||||
inChannelQuote: "Citace v kanálu"
|
||||
pinnedNote: "Připnutá poznámka"
|
||||
pinned: "Připnout"
|
||||
you: "Vy"
|
||||
@@ -108,6 +120,7 @@ sensitive: "NSFW"
|
||||
add: "Přidat"
|
||||
reaction: "Reakce"
|
||||
reactions: "Reakce"
|
||||
reactionSetting: "Reakce zobrazené ve výběru reakcí"
|
||||
reactionSettingDescription2: "Přetažením změníte pořadí, kliknutím smažete, zmáčkněte \"+\" k přidání"
|
||||
rememberNoteVisibility: "Zapamatovat nastavení zobrazení poznámky"
|
||||
attachCancel: "Odstranit přílohu"
|
||||
@@ -116,6 +129,8 @@ unmarkAsSensitive: "Odznačit jako NSFW"
|
||||
enterFileName: "Zadejte název souboru"
|
||||
mute: "Ztlumit"
|
||||
unmute: "Odmlčet"
|
||||
renoteMute: "Ztlumit poznámky"
|
||||
renoteUnmute: "Zrušit ztlumení poznámek"
|
||||
block: "Zablokovat"
|
||||
unblock: "Odblokovat"
|
||||
suspend: "Zmrazit"
|
||||
@@ -125,7 +140,10 @@ unblockConfirm: "Jste si jistí že chcete odblokovat tento účet?"
|
||||
suspendConfirm: "Jste si jistí že chcete suspendovat tenhle účet?"
|
||||
unsuspendConfirm: "Jste si jistí že chcete obnovit tenhle účet?"
|
||||
selectList: "Vybrat seznam"
|
||||
editList: "Upravit seznam"
|
||||
selectChannel: "Vybrat kanál"
|
||||
selectAntenna: "Vyberte Anténu"
|
||||
editAntenna: "Upravit anténu"
|
||||
selectWidget: "Zvolte widget"
|
||||
editWidgets: "Upravit widget"
|
||||
editWidgetsExit: "Hotovo"
|
||||
@@ -138,6 +156,8 @@ addEmoji: "Přidat emoji"
|
||||
settingGuide: "Doporučené nastavení"
|
||||
cacheRemoteFiles: "Ukládání vzdálených souborů do mezipaměti"
|
||||
cacheRemoteFilesDescription: "Zakázání tohoto nastavení způsobí, že vzdálené soubory budou odkazovány přímo, místo aby byly ukládány do mezipaměti. Tím se ušetří úložiště na serveru, ale zvýší se provoz, protože se negenerují miniatury."
|
||||
cacheRemoteSensitiveFiles: "Uložit do mezipaměti vzdálené citlivé soubory"
|
||||
cacheRemoteSensitiveFilesDescription: "Když je tohle nastavení zrušeno, tak jsou vzdálené citlivé soubory načítány přímo ze vzdálených instancí bez uložení do mezipaměti."
|
||||
flagAsBot: "Tento účet je bot"
|
||||
flagAsBotDescription: "Pokud je tento účet kontrolován programem zaškrtněte tuto možnost. To označí tento účet jako bot pro ostatní vývojáře a zabrání tak nekonečným interakcím s ostatními boty a upraví Misskey systém aby se choval k tomuhle účtu jako bot."
|
||||
flagAsCat: "Tenhle účet je kočka"
|
||||
@@ -146,6 +166,7 @@ flagShowTimelineReplies: "Zobrazovat odpovědi na časové ose"
|
||||
flagShowTimelineRepliesDescription: "Je-li zapnuto, zobrazí odpovědi uživatelů na poznámky jiných uživatelů na vaší časové ose."
|
||||
autoAcceptFollowed: "Automaticky akceptovat následování od účtů které sledujete"
|
||||
addAccount: "Přidat účet"
|
||||
reloadAccountsList: "Obnovit list účtů"
|
||||
loginFailed: "Přihlášení se nezdařilo."
|
||||
showOnRemote: "Více na původním profilu"
|
||||
general: "Obecně"
|
||||
@@ -186,17 +207,26 @@ instanceInfo: "Informace o instanci"
|
||||
statistics: "Statistiky"
|
||||
clearQueue: "Vyčistit frontu"
|
||||
clearQueueConfirmTitle: "Jste si jisti že zrušit všechny úlohy ve frontě?"
|
||||
clearQueueConfirmText: "Jakékoliv nedoručené poznámky ve frontě nebudou sdružovány. Většinou tahle operace není zapotřebí."
|
||||
clearCachedFiles: "Vyprázdnit mezipaměť"
|
||||
clearCachedFilesConfirm: "Jste jistí že chcete smazat všechny vzdálené soubory v mezipaměti?"
|
||||
blockedInstances: "Blokované instance"
|
||||
blockedInstancesDescription: "Vypište názvy hostitelů instancí, které chcete blokovat odděleně řádkovými zlomky. Uvedené instance již nebudou moci s touto instancí komunikovat."
|
||||
muteAndBlock: "Ztlumení a blokování"
|
||||
mutedUsers: "Zltumení uživatelé"
|
||||
blockedUsers: "Blokovaní uživatelé"
|
||||
noUsers: "Žádní uživatelé"
|
||||
editProfile: "Upravit můj profil"
|
||||
noteDeleteConfirm: "Jste si jistí že chcete smazat tuhle poznámku?"
|
||||
pinLimitExceeded: "Nemůžete připnout další poznámky."
|
||||
intro: "Instalace Misskey byla dokončena! Prosím vytvořte admina."
|
||||
done: "Hotovo"
|
||||
processing: "Zpracovávám"
|
||||
preview: "Náhled"
|
||||
default: "Výchozí"
|
||||
defaultValueIs: "Základní hodnota: {value}"
|
||||
noCustomEmojis: "Bez Emoji"
|
||||
federating: "Sdružování"
|
||||
blocked: "Blokováno"
|
||||
suspended: "Suspendováno"
|
||||
all: "Vše"
|
||||
@@ -217,6 +247,7 @@ more: "Více!"
|
||||
featured: "Oblíbené poznámky"
|
||||
usernameOrUserId: "Uživatelské jméno nebo uživatelské id"
|
||||
noSuchUser: "Uživatel nebyl nalezen"
|
||||
lookup: "Vyhledat"
|
||||
announcements: "Oznámení"
|
||||
imageUrl: "URL obrázku"
|
||||
remove: "Smazat"
|
||||
@@ -227,10 +258,13 @@ resetAreYouSure: "Opravdu resetovat?"
|
||||
saved: "Uloženo"
|
||||
messaging: "Zprávy"
|
||||
upload: "Nahrát soubory"
|
||||
keepOriginalUploading: "Ponechat originální obrázek"
|
||||
keepOriginalUploadingDescription: "Uloží původní nahraný obrázek jak je. Pokud je to vypnuté, vygeneruje se zobrazení verze na webu při nahrátí."
|
||||
fromDrive: "Z disku"
|
||||
fromUrl: "Z URL"
|
||||
uploadFromUrl: "Nahrát z URL adresy"
|
||||
uploadFromUrlDescription: "URL adresa souboru, který chcete nahrát"
|
||||
uploadFromUrlRequested: "Upload zažádán"
|
||||
uploadFromUrlMayTakeTime: "Může trvat nějakou dobu, dokud nebude dokončeno nahrávání."
|
||||
explore: "Objevovat"
|
||||
messageRead: "Přečtené"
|
||||
@@ -238,6 +272,10 @@ noMoreHistory: "To je vše"
|
||||
startMessaging: "Zahájit chat"
|
||||
nUsersRead: "přečteno {n} uživateli"
|
||||
agreeTo: "Souhlasím s {0}"
|
||||
agree: "Souhlasím"
|
||||
agreeBelow: "Souhlasím s následným"
|
||||
basicNotesBeforeCreateAccount: "Důležité poznámky"
|
||||
termsOfService: "Podmínky užívání"
|
||||
start: "Začít"
|
||||
home: "Domů"
|
||||
remoteUserCaution: "Tyto informace nemusí být aktuální jelikož uživatel je ze vzdálené instance."
|
||||
@@ -268,17 +306,24 @@ createFolder: "Vytvořit složku"
|
||||
renameFolder: "Přejmenovat složku"
|
||||
deleteFolder: "Odstranit složku"
|
||||
addFile: "Přidat soubor"
|
||||
emptyDrive: "Váš disk je prázdný"
|
||||
emptyFolder: "Tato složka je prázdná"
|
||||
unableToDelete: "Nelze smazat"
|
||||
inputNewFileName: "Zadejte nový název"
|
||||
inputNewDescription: "Zadejte nový popisek"
|
||||
inputNewFolderName: "Zadejte název nové složky"
|
||||
circularReferenceFolder: "Koncová složka je podsložka složky, kterou chcete přesunout."
|
||||
hasChildFilesOrFolders: "Nemůžete odstranit složku, která není prázdná."
|
||||
copyUrl: "Kopírovat URL"
|
||||
rename: "Přejmenovat"
|
||||
avatar: "Avatar"
|
||||
banner: "Baner"
|
||||
displayOfSensitiveMedia: "Zobrazit citlivé média"
|
||||
whenServerDisconnected: "Když ztratíte spojení se serverem"
|
||||
disconnectedFromServer: "Spojení bylo přerušeno"
|
||||
reload: "Aktualizovat"
|
||||
doNothing: "Ignorovat"
|
||||
reloadConfirm: "Chcete obnovit časovou osu?"
|
||||
watch: "Sledovat"
|
||||
unwatch: "Přestat sledovat"
|
||||
accept: "Souhlasím"
|
||||
@@ -301,15 +346,22 @@ connectService: "Připojit"
|
||||
disconnectService: "Odpojit"
|
||||
enableLocalTimeline: "Povolit lokální čas"
|
||||
enableGlobalTimeline: "Povolit globální čas"
|
||||
disablingTimelinesInfo: "Administrátoři a Moderátoři budou mít stálý přístup ke všem časovým osám i přes to že nejsou zapnuté."
|
||||
registration: "Registrace"
|
||||
enableRegistration: "Povolit registraci novým uživatelům"
|
||||
invite: "Pozvat"
|
||||
driveCapacityPerLocalAccount: "Kapacita disku na lokálního uživatele"
|
||||
driveCapacityPerRemoteAccount: "Kapacita disku na vzdáleného uživatele"
|
||||
inMb: "V megabajtech"
|
||||
iconUrl: "Favicon URL"
|
||||
bannerUrl: "Baner URL"
|
||||
backgroundImageUrl: "Adresa URL obrázku pozadí"
|
||||
basicInfo: "Základní informace"
|
||||
pinnedUsers: "Připnutí uživatelé"
|
||||
pinnedUsersDescription: "Seznam uživatelských přezdívek oddělených řádkami bude připnutý v záložce \"Objevit\"."
|
||||
pinnedPages: "Připnutý stránky"
|
||||
pinnedPagesDescription: "Zadejte cesty stránek oddělené řádkami, které si přejete mít přípnutý na vrcholu téhle instance."
|
||||
pinnedClipId: "ID připnutého klipu"
|
||||
pinnedNotes: "Připnutá poznámka"
|
||||
hcaptcha: "hCaptcha"
|
||||
enableHcaptcha: "Aktivovat hCaptchu"
|
||||
@@ -319,30 +371,56 @@ recaptcha: "reCAPTCHA"
|
||||
enableRecaptcha: "Zapnout ReCAPTCHu"
|
||||
recaptchaSiteKey: "Klíč stránky"
|
||||
recaptchaSecretKey: "Tajný Klíč (Secret Key)"
|
||||
turnstile: "Turnstile"
|
||||
enableTurnstile: "Povolit Turnstile"
|
||||
turnstileSiteKey: "Klíč stránky"
|
||||
turnstileSecretKey: "Tajný Klíč (Secret Key)"
|
||||
avoidMultiCaptchaConfirm: "Používání několik Captcha systému může způsobit konflikt mezi nimi. Chtěli byste vypnout ostatní aktivní Captcha systémy? Pokud je chcete nechat zapnuté, stiskněte zrušit."
|
||||
antennas: "Antény"
|
||||
manageAntennas: "Spravovat Antény"
|
||||
name: "Jméno"
|
||||
antennaSource: "Zdroj Antény"
|
||||
antennaKeywords: "Klíčová slova na poslech"
|
||||
antennaExcludeKeywords: "Vyloučená klíčová slova"
|
||||
antennaKeywordsDescription: "Oddělte mezerami pro AND kondice nebo řádkami pro OR kondice."
|
||||
notifyAntenna: "Upozornit na nové poznámky"
|
||||
withFileAntenna: "Poznámky jenom se souborama"
|
||||
enableServiceworker: "Povolit ServiceWorker"
|
||||
antennaUsersDescription: "Vypsat jednoho uživatele na řádek"
|
||||
caseSensitive: "Rozlišuje malá a velká písmena"
|
||||
withReplies: "Zahrnout odpovědi"
|
||||
connectedTo: "Následující účty jsou připojeny"
|
||||
notesAndReplies: "Poznámky a odpovědi"
|
||||
withFiles: "Včetně souborů"
|
||||
silence: "Ztlumení"
|
||||
silenceConfirm: "Jste si jistí že chcete ztlumit tohoto uživatele?"
|
||||
unsilence: "Zrušit ztlumení"
|
||||
unsilenceConfirm: "Jste jistí že chcete vrátit zltumení tohoto uživatele?"
|
||||
popularUsers: "Populární uživatelé"
|
||||
recentlyUpdatedUsers: "Nedávno aktívni uživatelé"
|
||||
recentlyRegisteredUsers: "Nově připojený uživatelé"
|
||||
recentlyDiscoveredUsers: "Nově objevený uživatelé"
|
||||
exploreUsersCount: "Existuje {count} uživatelů"
|
||||
exploreFediverse: "Objevovat Fediverse"
|
||||
popularTags: "Populární tagy"
|
||||
userList: "Seznamy"
|
||||
about: "Informace"
|
||||
aboutMisskey: "O Misskey"
|
||||
administrator: "Administrátor"
|
||||
token: "Token"
|
||||
2fa: "Dvoufázové ověření"
|
||||
totp: "Ověřovací aplikace"
|
||||
totpDescription: "Použít ověřovací aplikaci pro použití jednorázových hesel"
|
||||
moderator: "Moderátor"
|
||||
moderation: "Moderování"
|
||||
nUsersMentioned: "{n} uživatelů zmínilo"
|
||||
securityKeyAndPasskey: "Bezpečnostní klíče a tokeny"
|
||||
securityKey: "Bezpečnostní klíč"
|
||||
lastUsed: "Naposledy použito"
|
||||
lastUsedAt: "Naposledy použito: {t}"
|
||||
unregister: "Odstranit"
|
||||
passwordLessLogin: "Přihlášení bez hesla"
|
||||
passwordLessLoginDescription: "Umožní bez-heslové přihlášení pomocí bezpečnostního klíče či tokenu"
|
||||
resetPassword: "Resetovat heslo"
|
||||
newPasswordIs: "Nové heslo je \"{password}\""
|
||||
reduceUiAnimation: "Snížit UI animace"
|
||||
@@ -391,14 +469,25 @@ or: "Nebo"
|
||||
language: "Jazyk"
|
||||
uiLanguage: "Jazyk uživatelského rozhraní"
|
||||
aboutX: "O {x}"
|
||||
emojiStyle: "Styl emoji"
|
||||
native: "Výchozí"
|
||||
disableDrawer: "Nepoužívat šuplíkové menu"
|
||||
showNoteActionsOnlyHover: "Zobrazit akce poznámky jenom při naběhnutí myši"
|
||||
noHistory: "Žádná historie"
|
||||
signinHistory: "Historie přihlášení"
|
||||
enableAdvancedMfm: "Zapnout pokročilé MFM"
|
||||
enableAnimatedMfm: "Zapnout animované MFM"
|
||||
doing: "Procesuju..."
|
||||
category: "Kategorie"
|
||||
tags: "Štítky"
|
||||
docSource: "Zdroj tohoto dokumentu"
|
||||
createAccount: "Vytvořit účet"
|
||||
existingAccount: "Existující účet"
|
||||
regenerate: "Obnovit"
|
||||
fontSize: "Velikost písma"
|
||||
mediaListWithOneImageAppearance: "Výška seznamu médií s jedním obrázkem"
|
||||
limitTo: "Omezeno na {x}"
|
||||
noFollowRequests: "Nemáte žádné žádosti o sledování"
|
||||
openImageInNewTab: "Otevřít obrázek v novém panelu"
|
||||
dashboard: "Přehled"
|
||||
local: "Lokální"
|
||||
@@ -412,15 +501,35 @@ accountSettings: "Nastavení účtu"
|
||||
promotion: "Propagace"
|
||||
promote: "Propagovat"
|
||||
numberOfDays: "Počet dní"
|
||||
hideThisNote: "Skrýt tuto poznámku"
|
||||
showFeaturedNotesInTimeline: "Zobrazit významné poznámky v časové ose"
|
||||
objectStorage: "Úložiště objektů"
|
||||
useObjectStorage: "Použít úložiště objektů"
|
||||
objectStorageBaseUrl: "Base URL"
|
||||
objectStorageBaseUrlDesc: "URL použitá jako reference. Upřesněte URL vlastní CDN nebo Proxy pokud používáte jeden z nich. Pro S3 použijte 'https://<bucket>.s3.amazonaws.com' a pro GCS nebo ekvivalentní služby použijte 'https://storage.googleapis.com/<bucket>', apd."
|
||||
objectStorageBucket: "Bucket"
|
||||
objectStorageBucketDesc: "Prosím upřesněte název bucketu používaný poskytovatelem."
|
||||
objectStoragePrefix: "Předpona"
|
||||
objectStoragePrefixDesc: "Soubory budou ukládány pod složkama s tímhle prefixem."
|
||||
objectStorageEndpoint: "Endpoint"
|
||||
objectStorageEndpointDesc: "Ponechte tohle prázdné pokud používáte AWS S3, jinak upřesněte endpoint jako \"<host>\" nebo \"<host>:<port>\", podle toho jakou službu používáte."
|
||||
objectStorageRegion: "Región"
|
||||
objectStorageRegionDesc: "Upřesněte region jako například \"xx-east-1\". Pokud vlastní služba nerozlišuje mezi regiony, zadejte \"us-east-1\". Zanechte prázdné pokud používáte AWS konfiguraci či proměnné veličiny."
|
||||
objectStorageUseSSL: "Použít SSL"
|
||||
objectStorageUseSSLDesc: "Vypněte to pokud nebudete používat HTTPS pro API připojení"
|
||||
objectStorageUseProxy: "Připojení skrze Proxy"
|
||||
objectStorageUseProxyDesc: "Vypněte to pokud nebudete používat Proxy pro API připojení."
|
||||
objectStorageSetPublicRead: "Při nahrátí nastavit na \"public-read\""
|
||||
s3ForcePathStyleDesc: "Pokud je povolena funkce s3ForcePathStyle, musí být název Bucketu zahrnut do cesty k adrese URL, nikoli do názvu hostitele adresy URL. Toto nastavení může být nutné povolit při používání služeb, jako je například samostatně hostovaná instance Minio."
|
||||
serverLogs: "Logy serveru"
|
||||
deleteAll: "Smazat vše"
|
||||
showFixedPostForm: "Zobrazit formulář pro nové příspěvky nad časovou osou"
|
||||
showFixedPostFormInChannel: "Zobrazit vkládací formulář na vrcholu časové osy (Kanály)"
|
||||
newNoteRecived: "Jsou k dispozici nové poznámky"
|
||||
sounds: "Zvuky"
|
||||
sound: "Zvuky"
|
||||
listen: "Poslouchat"
|
||||
none: "Žádný"
|
||||
showInPage: "Zobrazit na stránce"
|
||||
popout: "Pop-out"
|
||||
volume: "Hlasitost"
|
||||
@@ -433,29 +542,61 @@ install: "Nainstalovat"
|
||||
uninstall: "Odinstalovat"
|
||||
installedApps: "Autorizované aplikace"
|
||||
nothing: "Nic nebylo nalezeno"
|
||||
installedDate: "Datum autorizace"
|
||||
lastUsedDate: "Poslední použití"
|
||||
state: "Stav"
|
||||
sort: "Seřadit"
|
||||
ascendingOrder: "Vzestupně"
|
||||
descendingOrder: "Sestupně"
|
||||
scratchpad: "Zápisník"
|
||||
scratchpadDescription: "Scratchpad poskytuje rozhraní pro AiScript experimenty. Můžete psát, spustit či zkontrolovat výsledky jeho interakce s Misskey."
|
||||
output: "Výstup"
|
||||
script: "Skript"
|
||||
disablePagesScript: "Vypnout AiScript na stránkách"
|
||||
updateRemoteUser: "Aktualizovat informace o vzdáleném účtu"
|
||||
deleteAllFiles: "Smazat všechny soubory"
|
||||
deleteAllFilesConfirm: "Jste si jistí že chcete smazat všechny soubory?"
|
||||
removeAllFollowing: "Přestat sledovat všechny sledované uživatele"
|
||||
removeAllFollowingDescription: "Spuštěním přestanete sledovat všechny účty z {host}. Prosíme spustěte tohle v případě že instance už neexistuje. "
|
||||
userSuspended: "Tomuto uživateli byl pozastaven účet."
|
||||
userSilenced: "Tenhle uživatel je umlčen."
|
||||
yourAccountSuspendedTitle: "Tenhle účet je zmrazený"
|
||||
yourAccountSuspendedDescription: "Tenhle účet byl zmrazen z důvodu porušení smluvní podmínky serveru. Pro přesnější informace kontaktujte administrátora. Prosíme nezakládejte si nový účet."
|
||||
tokenRevoked: "Nesprávný token"
|
||||
tokenRevokedDescription: "Tenhle token vyprchal. Prosíme přihlašte se znova."
|
||||
accountDeleted: "Účet smazán"
|
||||
accountDeletedDescription: "Tenhle účet byl smazán."
|
||||
menu: "Menu"
|
||||
divider: "Dělící čára"
|
||||
addItem: "Přidat položku"
|
||||
rearrange: "Přeřadit"
|
||||
relays: "Relay"
|
||||
addRelay: "Přidat Relay"
|
||||
inboxUrl: "Inbox URL"
|
||||
addedRelays: "Přidané přenosy"
|
||||
serviceworkerInfo: "Musí být zapnut pro push notifikace."
|
||||
deletedNote: "Odstraněné příspěvky"
|
||||
invisibleNote: "Skryté příspěvky"
|
||||
enableInfiniteScroll: "Automaticky načítat více"
|
||||
visibility: "Viditelnost"
|
||||
poll: "Anketa"
|
||||
useCw: "Schovat obsah"
|
||||
enablePlayer: "Otevřít video přehrávač"
|
||||
disablePlayer: "Zavřít video přehrávač"
|
||||
expandTweet: "Rozbalit tweet"
|
||||
themeEditor: "Editor témat"
|
||||
description: "Popis"
|
||||
describeFile: "Přidat popisek"
|
||||
enterFileDescription: "Vložit popisek"
|
||||
author: "Autor"
|
||||
leaveConfirm: "Máte neuložené změny. Opravdu je chcete zahodit?"
|
||||
manage: "Administrace"
|
||||
plugins: "Pluginy"
|
||||
preferencesBackups: "Zálohy nastavení"
|
||||
deck: "Deck"
|
||||
undeck: "Opustit Deck"
|
||||
useBlurEffectForModal: "Použít efekt rozostření na okna"
|
||||
useFullReactionPicker: "Používat plnou velikost výběru emoji"
|
||||
width: "Šířka"
|
||||
height: "Výška"
|
||||
large: "Velké"
|
||||
@@ -465,10 +606,13 @@ generateAccessToken: "Vygenerovat přístupový token"
|
||||
permission: "Oprávnění"
|
||||
enableAll: "Povolit vše"
|
||||
disableAll: "Vypnout vše"
|
||||
tokenRequested: "Povolit přístup k účtu"
|
||||
pluginTokenRequestedDescription: "Tenhle plugin bude moct používat oprávnění nastavená zde."
|
||||
notificationType: "Typy oznámení"
|
||||
edit: "Upravit"
|
||||
emailServer: "Mailový server"
|
||||
enableEmail: "Zapnout email dystribuci"
|
||||
emailConfigInfo: "Používá se na ověření emailové adresy během registrace nebo při zapomenutí hesla."
|
||||
email: "Email"
|
||||
emailAddress: "Emailová adresa"
|
||||
smtpConfig: "Konfigurace SMTP serveru"
|
||||
@@ -476,8 +620,15 @@ smtpHost: "Hostitel"
|
||||
smtpPort: "Port"
|
||||
smtpUser: "Uživatelské jméno"
|
||||
smtpPass: "Heslo"
|
||||
emptyToDisableSmtpAuth: "Zanechte uživatelské jméno a heslo prázdné pro vypnutí SMTP verifikace."
|
||||
smtpSecure: "Použít implicitní SSL/TLS pro SMTP připojení"
|
||||
smtpSecureInfo: "Toto vypněte pokud používáte STARTTLS"
|
||||
testEmail: "Otestovat doručení emailů"
|
||||
wordMute: "Ztlumené slova"
|
||||
regexpError: "Chyba v regulérním výrazu"
|
||||
regexpErrorDescription: "Došlo k chybě v regulérním výrazu v řádku {line} tabulky {tab} ztlumených slov:"
|
||||
instanceMute: "Ztlumené instance"
|
||||
userSaysSomething: "{name} řekl/a něco"
|
||||
makeActive: "Aktivovat"
|
||||
display: "Zobrazit"
|
||||
copy: "Kopírovat"
|
||||
@@ -489,21 +640,66 @@ database: "Databáze"
|
||||
channel: "Kanály"
|
||||
create: "Vytvořit"
|
||||
notificationSetting: "Nastavení oznámení"
|
||||
notificationSettingDesc: "Vyberte typy oznámení k zobrazení."
|
||||
useGlobalSetting: "Použít globální nastavení"
|
||||
useGlobalSettingDesc: "Pokud je to zapnuté, tak nastavení oznámení účtu bude použito. Pokud je to vypnuté, tak se bude moct použít jednotlivá nastavení."
|
||||
other: "Ostatní"
|
||||
regenerateLoginToken: "Přegenerovat přihlašovací token"
|
||||
regenerateLoginTokenDescription: "Přegeneruje token interně používaný během přihlášení. Běžně tahle akce není nutná. Pokud bude token přegenerovaný, tak se všechna přihlášená zařízení odhlásí."
|
||||
setMultipleBySeparatingWithSpace: "Oddělení více položek mezerami."
|
||||
fileIdOrUrl: "ID nebo URL souboru"
|
||||
behavior: "Chování"
|
||||
sample: "Ukázka"
|
||||
abuseReports: "Nahlášení"
|
||||
reportAbuse: "Nahlášení"
|
||||
reportAbuseOf: "Nahlásit {name}"
|
||||
fillAbuseReportDescription: "Prosíme vyplňte všechny detaily ohledně tohodle nahlášení. Pokud jde o specifickou poznámku, prosíme o přiložení její URL."
|
||||
abuseReported: "Nahlášení bylo odesláno. Děkujeme převelice."
|
||||
reporter: "Nahlásil"
|
||||
reporteeOrigin: "Původ nahlášení"
|
||||
reporterOrigin: "Původ nahlasovače"
|
||||
forwardReport: "Přeposlat nahlášení do vzdálené instance"
|
||||
send: "Odeslat"
|
||||
openInNewTab: "Otevřít v nové kartě"
|
||||
openInSideView: "Otevřít v bočním panelu"
|
||||
defaultNavigationBehaviour: "Výchozí chování navigace"
|
||||
instanceTicker: "Informace instance o poznámkách"
|
||||
waitingFor: "Čeká se na {x}"
|
||||
random: "Náhodně"
|
||||
system: "Systém"
|
||||
switchUi: "Přepnout UI"
|
||||
desktop: "Plocha"
|
||||
clip: "Oříznout"
|
||||
createNew: "Vytvořit nový"
|
||||
optional: "Volitelné"
|
||||
createNewClip: "Vytvořit nový klip"
|
||||
unclip: "Odepnout"
|
||||
confirmToUnclipAlreadyClippedNote: "Tahle poznámku je už součásti \"{name}\" klipu. Chcete ji místo toho odepnout z tohodle klipu?"
|
||||
public: "Veřejný"
|
||||
i18nInfo: "Misskey je překládán do jiných jazyků dobrovolníkama. Můžete pomoci na {link}."
|
||||
manageAccessTokens: "Spravovat přístupové tokeny"
|
||||
accountInfo: "Informace o účtu"
|
||||
notesCount: "Počet poznámek"
|
||||
repliesCount: "Počet odeslaných odpovědí"
|
||||
renotesCount: "Počet přeposlaných poznámek"
|
||||
repliedCount: "Počet přijatých odpovědí"
|
||||
renotedCount: "Počet přijatých přeposlaných poznámek"
|
||||
followingCount: "Počet sledovaných účtů"
|
||||
followersCount: "Počet sledujících"
|
||||
sentReactionsCount: "Počet odeslaných reakcí"
|
||||
receivedReactionsCount: "Počet přijatých reakcí"
|
||||
pollVotesCount: "Počet odeslaných anketových hlasů"
|
||||
pollVotedCount: "Počet přijatých anketových hlasů"
|
||||
yes: "Ano"
|
||||
no: "Ne"
|
||||
driveFilesCount: "Počet souborů na disku"
|
||||
driveUsage: "Využití disku"
|
||||
noCrawle: "Odmítat indexování crawleru"
|
||||
lockedAccountInfo: "Pokud nenastavíte viditelnost poznámek na \"Pouze pro sledující\", budou poznámky viditelné všem i přesto že vyžadujete manuální potvrzení pro sledování."
|
||||
alwaysMarkSensitive: "Výchozně označovat jako citlivý"
|
||||
loadRawImages: "Načítat originální obrázky místo náhledů"
|
||||
disableShowingAnimatedImages: "Nepřehrávat animované obrázky"
|
||||
verificationEmailSent: "Ověřovací email byl zaslán. Ověření dokončíte kliknutím na odkaz v emailu."
|
||||
notSet: "Není nastaveno"
|
||||
emailVerified: "Váš e-mail byl ověřen"
|
||||
contact: "Kontakt"
|
||||
|
@@ -1091,6 +1091,9 @@ usedAt: "Usada el"
|
||||
unused: "Sin usar"
|
||||
used: "Usada"
|
||||
expired: "Caducada"
|
||||
doYouAgree: "¿Está de acuerdo?"
|
||||
beSureToReadThisAsItIsImportant: "Por favor lea esto que es importante"
|
||||
iHaveReadXCarefullyAndAgree: "He leído el texto {x} y estoy de acuerdo"
|
||||
_initialAccountSetting:
|
||||
accountCreated: "¡La cuenta ha sido creada!"
|
||||
letsStartAccountSetup: "Para empezar, creemos tu perfil."
|
||||
|
@@ -49,6 +49,7 @@ delete: "Supprimer"
|
||||
deleteAndEdit: "Supprimer et réécrire"
|
||||
deleteAndEditConfirm: "Êtes-vous sûr·e de vouloir supprimer cette note et la reformuler ? Vous perdrez toutes les réactions, renotes et réponses y afférentes."
|
||||
addToList: "Ajouter à une liste"
|
||||
addToAntenna: "Ajouter à l’antenne"
|
||||
sendMessage: "Envoyer un message"
|
||||
copyRSS: "Copier le RSS"
|
||||
copyUsername: "Copier le nom d’utilisateur·rice"
|
||||
|
1
locales/hu-HU.yml
Normal file
1
locales/hu-HU.yml
Normal file
@@ -0,0 +1 @@
|
||||
---
|
@@ -49,11 +49,15 @@ delete: "ほかす"
|
||||
deleteAndEdit: "ほかして直す"
|
||||
deleteAndEditConfirm: "このノートをほかしてもっかい直す?このノートへのツッコミ、Renote、返信も全部消えるんやけどそれでもええん?"
|
||||
addToList: "リストに入れたる"
|
||||
addToAntenna: "アンテナに追加"
|
||||
sendMessage: "メッセージを送る"
|
||||
copyRSS: "RSSをコピー"
|
||||
copyUsername: "ユーザー名をコピー"
|
||||
copyUserId: "ユーザーIDをコピー"
|
||||
copyNoteId: "ノートIDをコピー"
|
||||
copyFileId: "ファイルIDをコピー"
|
||||
copyFolderId: "フォルダーIDをコピー"
|
||||
copyProfileUrl: "プロフィールURLをコピー"
|
||||
searchUser: "ユーザーを検索"
|
||||
reply: "返事"
|
||||
loadMore: "まだまだあるで!"
|
||||
@@ -152,6 +156,8 @@ addEmoji: "絵文字を追加"
|
||||
settingGuide: "ええ感じの設定"
|
||||
cacheRemoteFiles: "リモートのファイルをキャッシュする"
|
||||
cacheRemoteFilesDescription: "この設定を切っとったら、リモートファイルをキャッシュせんと直リンクするようになるで。サーバーの容量は節約できるけど、サムネイルを作らんなるから通信量が増えるで。"
|
||||
cacheRemoteSensitiveFiles: "リモートのセンシティブなファイルをキャッシュする"
|
||||
cacheRemoteSensitiveFilesDescription: "この設定を無効にすると、リモートのセンシティブなファイルはキャッシュせず直リンクするようになるで。"
|
||||
flagAsBot: "Botにするで"
|
||||
flagAsBotDescription: "もしこのアカウントをプログラム使うて運用するんやったら、このフラグをオンにしてや。オンにすれば、反応がバーッて連鎖せんように開発者が使うたり、Misskeyのシステム上での扱いがBotに合ったもんになるからな。"
|
||||
flagAsCat: "Catやで"
|
||||
@@ -313,6 +319,7 @@ copyUrl: "URLをコピー"
|
||||
rename: "名前を変えるで"
|
||||
avatar: "アイコン"
|
||||
banner: "バナー"
|
||||
displayOfSensitiveMedia: "センシティブなメディアの表示"
|
||||
whenServerDisconnected: "サーバーとの接続が失くなってしもうたとき"
|
||||
disconnectedFromServer: "サーバーが機嫌悪いねん"
|
||||
reload: "リロード"
|
||||
@@ -1067,11 +1074,26 @@ branding: "あ"
|
||||
enableServerMachineStats: "サーバーのマシン情報見せびらかすで"
|
||||
enableIdenticonGeneration: "ユーザーごとのIdenticon生成を有効にする"
|
||||
turnOffToImprovePerformance: "オフにしたらえらい軽うなるで。"
|
||||
createInviteCode: "招待コードを作成"
|
||||
createWithOptions: "オプションを指定して作成"
|
||||
createCount: "作成数"
|
||||
inviteCodeCreated: "招待コード作ったで"
|
||||
inviteLimitExceeded: "招待コード作りすぎやで。"
|
||||
createLimitRemaining: "作成できる招待コード: 残り {limit} 個やで"
|
||||
inviteLimitResetCycle: "{time}で最大 {limit} 個の招待コードを作成できるで。"
|
||||
expirationDate: "有効期限"
|
||||
noExpirationDate: "有効期限を設けへん"
|
||||
inviteCodeUsedAt: "招待コードが使用された日時"
|
||||
registeredUserUsingInviteCode: "招待コードを使用したユーザー"
|
||||
waitingForMailAuth: "メール認証待ち"
|
||||
inviteCodeCreator: "招待コードを作成したユーザー"
|
||||
usedAt: "使用日時"
|
||||
unused: "つこてへん"
|
||||
used: "もうつこてる"
|
||||
expired: "期限切れ"
|
||||
doYouAgree: "同意するんか?"
|
||||
beSureToReadThisAsItIsImportant: "重要やから絶対読んでや。"
|
||||
iHaveReadXCarefullyAndAgree: "「{x}」の内容をよう読んで、同意するで。"
|
||||
_initialAccountSetting:
|
||||
accountCreated: "アカウント作り終わったで。"
|
||||
letsStartAccountSetup: "アカウントの初期設定をしよか。"
|
||||
@@ -1382,6 +1404,9 @@ _role:
|
||||
ltlAvailable: "ローカルタイムラインの閲覧"
|
||||
canPublicNote: "パブリック投稿の許可"
|
||||
canInvite: "サーバー招待コードの発行"
|
||||
inviteLimit: "招待コードの作成可能数"
|
||||
inviteLimitCycle: "招待コードの発行間隔"
|
||||
inviteExpirationTime: "招待コードの有効期限"
|
||||
canManageCustomEmojis: "カスタム絵文字の管理"
|
||||
driveCapacity: "ドライブ容量"
|
||||
alwaysMarkNsfw: "勝手にファイルにNSFWをくっつける"
|
||||
@@ -1444,6 +1469,7 @@ _ad:
|
||||
back: "戻る"
|
||||
reduceFrequencyOfThisAd: "この広告の表示頻度を下げるで"
|
||||
hide: "表示せん"
|
||||
timezoneinfo: "曜日はサーバーのタイムゾーンを元に指定されるで。"
|
||||
_forgotPassword:
|
||||
enterEmail: "アカウントに登録したメールアドレスをここに入力してや。そのアドレス宛に、パスワードリセット用のリンクが送られるから待っててな~。"
|
||||
ifNoEmail: "メールアドレスを登録してへんのやったら、管理者まで教えてな~。"
|
||||
@@ -1973,6 +1999,7 @@ _deck:
|
||||
introduction: "カラムを組み合わせて自分だけのインターフェイスを作りましょ!"
|
||||
introduction2: "画面の右にある + を押して、いつでもカラムを追加できるで。"
|
||||
widgetsIntroduction: "カラムのメニューから、「ウィジェットの編集」を選んでウィジェットを追加してなー"
|
||||
useSimpleUiForNonRootPages: "非ルートページは簡易UIで表示"
|
||||
_columns:
|
||||
main: "メイン"
|
||||
widgets: "ウィジェット"
|
||||
|
File diff suppressed because it is too large
Load Diff
@@ -49,6 +49,7 @@ delete: "Удалить"
|
||||
deleteAndEdit: "Удалить и отредактировать"
|
||||
deleteAndEditConfirm: "Удалить эту заметку и создать отредактированную? Все реакции, ссылки и ответы на существующую будут будут потеряны."
|
||||
addToList: "Добавить в список"
|
||||
addToAntenna: "Добавить к антенне"
|
||||
sendMessage: "Отправить сообщение"
|
||||
copyRSS: "Скопировать RSS"
|
||||
copyUsername: "Скопировать имя пользователя"
|
||||
@@ -155,6 +156,8 @@ addEmoji: "Добавить эмодзи"
|
||||
settingGuide: "Рекомендуемые настройки"
|
||||
cacheRemoteFiles: "Кешировать внешние файлы"
|
||||
cacheRemoteFilesDescription: "Когда эта настройка отключена, файлы с других сайтов будут загружаться прямо оттуда. Это сэкономит место на сервере, но увеличит трафик, так как не будут создаваться эскизы."
|
||||
cacheRemoteSensitiveFiles: "Кешировать внешние файлы"
|
||||
cacheRemoteSensitiveFilesDescription: "Описание удаленных внешних файлов в кэше"
|
||||
flagAsBot: "Аккаунт бота"
|
||||
flagAsBotDescription: "Включите, если этот аккаунт управляется программой. Это позволит системе Misskey учитывать это, а также поможет разработчикам других ботов предотвратить бесконечные циклы взаимодействия."
|
||||
flagAsCat: "Аккаунт кота"
|
||||
@@ -316,6 +319,7 @@ copyUrl: "Копировать ссылку"
|
||||
rename: "Переименовать"
|
||||
avatar: "Аватар"
|
||||
banner: "Шапка"
|
||||
displayOfSensitiveMedia: "Определение деликатного контента"
|
||||
whenServerDisconnected: "Когда соединение с сервером потеряно"
|
||||
disconnectedFromServer: "Разорвано соединение с сервером"
|
||||
reload: "Перезагрузить"
|
||||
@@ -840,6 +844,8 @@ breakFollow: "Отписка"
|
||||
breakFollowConfirm: "Удалить из подписок пользователя ?"
|
||||
itsOn: "Включено"
|
||||
itsOff: "Выключено"
|
||||
on: "Вкл"
|
||||
off: "Выкл"
|
||||
emailRequiredForSignup: "Для регистрации учётной записи нужен адрес электронной почты"
|
||||
unread: "Непрочитанное"
|
||||
filter: "Фильтры"
|
||||
@@ -994,6 +1000,7 @@ cannotBeChangedLater: "Это нельзя изменить позже"
|
||||
reactionAcceptance: "Принятие реакций"
|
||||
likeOnly: "Только лайки"
|
||||
likeOnlyForRemote: "Только лайки с удалённых серверов"
|
||||
nonSensitiveOnly: "Безопасный серфинг"
|
||||
rolesAssignedToMe: "Мои роли"
|
||||
resetPasswordConfirm: "Сбросить пароль?"
|
||||
sensitiveWords: "Чувствительные слова"
|
||||
@@ -1014,7 +1021,15 @@ noteIdOrUrl: "ID или ссылка на заметку"
|
||||
video: "Видео"
|
||||
videos: "Видео"
|
||||
dataSaver: "Экономия трафика"
|
||||
accountMigration: "Перенести учётную запись"
|
||||
accountMoved: "Учетная запись перенесена"
|
||||
operationForbidden: "Эта операция невозможна."
|
||||
addMemo: "Добавить заметку"
|
||||
editMemo: "Редактировать заметку"
|
||||
reactionsList: "Реакции"
|
||||
renotesList: "Репосты"
|
||||
notificationDisplay: "Отображение уведомления"
|
||||
leftTop: "Верхний левый угол"
|
||||
horizontal: "Сбоку"
|
||||
youFollowing: "Подписки"
|
||||
options: "Настройки ролей"
|
||||
|
@@ -389,10 +389,13 @@ help: "Hjälp"
|
||||
close: "Stäng"
|
||||
invites: "Inbjudan"
|
||||
members: "Medlemmar"
|
||||
transfer: "Överför"
|
||||
text: "Text"
|
||||
enable: "Aktivera"
|
||||
next: "Nästa"
|
||||
invitations: "Inbjudan"
|
||||
invitationCode: "Inbjudningskod"
|
||||
available: "Tillgängligt"
|
||||
weakPassword: "Svagt Lösenord"
|
||||
normalPassword: "Medel Lösenord"
|
||||
strongPassword: "Starkt Lösenord"
|
||||
|
@@ -98,7 +98,7 @@ enterListName: "ใส่ชื่อสำหรับรายการลิ
|
||||
privacy: "ความเป็นส่วนตัว"
|
||||
makeFollowManuallyApprove: "ติดตามคำขอที่ต้องได้รับการอนุมัติ"
|
||||
defaultNoteVisibility: "การมองเห็นที่เป็นค่าเริ่มต้น"
|
||||
follow: "กำลังติดตาม"
|
||||
follow: "ติดตาม"
|
||||
followRequest: "ส่งคำขอติดตาม"
|
||||
followRequests: "ส่งคำขอติดตาม"
|
||||
unfollow: "เลิกติดตาม"
|
||||
@@ -183,7 +183,7 @@ selectUser: "เลือกผู้ใช้งาน"
|
||||
recipient: "ผู้รับ"
|
||||
annotation: "ความคิดเห็น"
|
||||
federation: "เฟดิเวิร์ส"
|
||||
instances: "ตัวอย่าง"
|
||||
instances: "Server"
|
||||
registeredAt: "จดทะเบียนที่"
|
||||
latestRequestReceivedAt: "ได้รับคำขอล่าสุดไปแล้ว"
|
||||
latestStatus: "สถานะล่าสุด"
|
||||
@@ -1091,6 +1091,9 @@ usedAt: "ใช้แล้วที่"
|
||||
unused: "ไม่ใช้แล้ว"
|
||||
used: "ใช้แล้ว"
|
||||
expired: "หมดอายุแล้ว"
|
||||
doYouAgree: "ยอมรับมั้ย?"
|
||||
beSureToReadThisAsItIsImportant: "กรุณาอ่านข้อมูลที่สำคัญอันนี้"
|
||||
iHaveReadXCarefullyAndAgree: "ฉันได้อ่านข้อความ \"{x}\" และยินยอม"
|
||||
_initialAccountSetting:
|
||||
accountCreated: "คุณได้สร้างบัญชีของคุณสำเร็จเรียบร้อยแล้ว!"
|
||||
letsStartAccountSetup: "สำหรับผู้เริ่มต้นมาตั้งค่าโปรไฟล์ของคุณกันเถอะ"
|
||||
|
634
locales/uz-UZ.yml
Normal file
634
locales/uz-UZ.yml
Normal file
@@ -0,0 +1,634 @@
|
||||
---
|
||||
_lang_: "O'zbek tili "
|
||||
headlineMisskey: "Qaydlar bilan bog'langan tarmoq"
|
||||
introMisskey: "Xush kelibsiz! Misskey ochiq kodli, markazlashmagan mikroblogging xizmati.\nO'zingizni fikrlaringizni atrofingizdagilar bilan ulashish uchun \"Qaydlar\" yarating. 📡\nUstiga-ustak, \"Reaktsiyalar\" yordamida siz boshqalarning xatlari haqidagi o'zingizni xissiyotlaringizni tez ravishda bildiring. 👍\nQani, yangi dunyoni kashf qilaylik! 🚀"
|
||||
poweredByMisskeyDescription: "{name} ochiq manbali <b>Misskey</b>(\"Misskey instance\" deb ataladi) platformasi tomonidan qurilgan servislardan biri. "
|
||||
monthAndDay: "{day}/{month}"
|
||||
search: "Izlash"
|
||||
notifications: "Xabarnomalar"
|
||||
username: "Foydalanuvchi nomi"
|
||||
password: "Parol"
|
||||
forgotPassword: "Parolni unutib qo'ydim"
|
||||
fetchingAsApObject: "Fediversedan olib kelinmoqda..."
|
||||
ok: "Ho'p"
|
||||
gotIt: "Tushunarli!"
|
||||
cancel: "Bekor qilish"
|
||||
noThankYou: "Hozir emas"
|
||||
enterUsername: "Foydalanuvchini nomini kiriting"
|
||||
renotedBy: "{user} tomonidan qayta qayd etildi"
|
||||
noNotes: "Qaydlar mavjud emas"
|
||||
noNotifications: "Xabarnomalar mavjud emas"
|
||||
instance: "Server"
|
||||
settings: "Sozalamalar"
|
||||
notificationSettings: "Xabarnomalar sozlamalari"
|
||||
basicSettings: "Asosiy sozlamalar"
|
||||
otherSettings: "Qo‘shimcha sozlamalar"
|
||||
openInWindow: "Yangi oynada ochish"
|
||||
profile: "Profil"
|
||||
timeline: "Xronologiya"
|
||||
noAccountDescription: "Ushbu foydalanuvchi hali o'zi haqida ma'lumot yozmagan."
|
||||
login: "Kirish"
|
||||
loggingIn: "Kirilmoqda"
|
||||
logout: "Chiqish"
|
||||
signup: "Ro'yxatdan o'tish"
|
||||
uploading: "Yuklanmoqda..."
|
||||
save: "Saqlash"
|
||||
users: "Foydalanuvchilar"
|
||||
addUser: "Foydalanuvchi qo'shish"
|
||||
favorite: "Sevimli"
|
||||
favorites: "Sevimli"
|
||||
unfavorite: "Sevimlidan chiqarish"
|
||||
favorited: "sevimli"
|
||||
alreadyFavorited: "allaqachon sevimlilar orasida"
|
||||
cantFavorite: "sevimlilarga qo'shib bo'lmadi"
|
||||
pin: "Profilga qadab qo'yish"
|
||||
unpin: "Profildan olib tashlash"
|
||||
copyContent: "Tarkibini nusxalash"
|
||||
copyLink: "Havolani nuxalash"
|
||||
delete: "O'chirib tashlash"
|
||||
deleteAndEdit: "O'chirish va tahrirlash"
|
||||
deleteAndEditConfirm: "O'chirib, tahrirlamoqchiligingizga ishonchingiz komilmi? Siz bu qaydga tegishli barcha reaktsiyalar, qayta qaydlar va javoblarni yo'qotasiz."
|
||||
addToList: "Ro‘yxatga qo‘shish"
|
||||
addToAntenna: "Antennaga qo'shish"
|
||||
sendMessage: "Xabar yuborish"
|
||||
copyRSS: "RSS'ni nusxalash"
|
||||
copyUsername: "Foydalanuvchi nomini nusxalash"
|
||||
copyUserId: "Foydalanuvchi IDsini nusxalash"
|
||||
copyNoteId: "Qayd IDsini ko'chirish"
|
||||
copyFileId: "Fayl ID raqamini nusxalash"
|
||||
copyFolderId: "Jild ID raqamini nusxalash"
|
||||
copyProfileUrl: "Profil manzilini nusxalash"
|
||||
searchUser: "Foydalanuvchini izlash"
|
||||
reply: "Javob berish"
|
||||
loadMore: "Ko‘proq ko‘rish"
|
||||
showMore: "Ko‘proq ko‘rish"
|
||||
showLess: "Yopish"
|
||||
youGotNewFollower: "sizga obuna bo'ldi"
|
||||
receiveFollowRequest: "Obuna bo'lishga ruxsat qabul qilindi"
|
||||
followRequestAccepted: "Obuna bo'lishga ruxsat berildi"
|
||||
mention: "Murojat"
|
||||
mentions: "Eslatib o'tish"
|
||||
directNotes: "Bevosita qaydlar"
|
||||
importAndExport: "Import/eksport"
|
||||
import: "Import"
|
||||
export: "Eksport"
|
||||
files: "Fayllar"
|
||||
download: "Yuklab olish"
|
||||
driveFileDeleteConfirm: "\"{name}\" o'chirib tashlamoqchimisiz? Buni ishlatadihan kontentni hammasidan o'chadi"
|
||||
unfollowConfirm: "{name}ga obunani bekor qilmoqchimisiz?"
|
||||
exportRequested: "Eksport so'raldi. Bu ozgina vaqt olishi mumkin. Tugatilgandan so'ng sizning Diskingizga qo'shiladi"
|
||||
importRequested: "Import so'raldi. Bu ozgina vaqt olishi mumkin."
|
||||
lists: "Ro'yxatlar"
|
||||
noLists: "Hech qanday ro'yxatlar mavjud emas"
|
||||
note: "Qayd"
|
||||
notes: "Qaydlar"
|
||||
following: "Obuna bo‘lish"
|
||||
followers: "Obunachilar"
|
||||
followsYou: "Sizning obunachingiz."
|
||||
createList: "Ro'yxat yaratish"
|
||||
manageLists: "Ro'yxatlarni boshqarish."
|
||||
error: "Xato"
|
||||
somethingHappened: "Xatolik yuz berdi"
|
||||
retry: "Qayta urinib ko'rish"
|
||||
pageLoadError: "Sahifani yuklayotganda xatolik yuz berdi"
|
||||
pageLoadErrorDescription: "Buni odatda tarmoq muammolari yoki browser keshi keltirib chiqaradi. Keshni tozalab, keyinroq urinib ko'ring"
|
||||
serverIsDead: "Server javob bermayabdi. Iltimos kuting va keyinroq urinib ko'ring"
|
||||
youShouldUpgradeClient: "Iltimos, ushbu sahifani ko'rish uchun sahifani yangilang."
|
||||
enterListName: "Ro'yxatga nom kiriting"
|
||||
privacy: "Maxfiylik"
|
||||
makeFollowManuallyApprove: "Yopiq akkaunt"
|
||||
follow: "Obuna bo‘lish"
|
||||
followRequest: "Obuna bo'lish uchun ruxsat olish"
|
||||
followRequests: "Obuna bo'lmoqchilar"
|
||||
unfollow: "obunani bker qilish"
|
||||
followRequestPending: "obuna bo'lishga ruxsat kutilmoqda"
|
||||
enterEmoji: "Emojini kiriting"
|
||||
renote: "Qayta qaydetish"
|
||||
unrenote: "Qayta qayd etishni bekor qilish"
|
||||
renoted: "Qayta qaydetildi"
|
||||
cantRenote: "Qyta qayd etish mumkin emas"
|
||||
quote: "Iqtibos keltirish"
|
||||
inChannelRenote: "Faqat kanalga qayta qayd etish"
|
||||
inChannelQuote: "Kanaldagi eslatmalar"
|
||||
pinnedNote: "Qadanlgan qayd"
|
||||
pinned: "Profilga qadab qo'yish"
|
||||
you: "Siz"
|
||||
clickToShow: "Ko'rsatish uchun bosing"
|
||||
sensitive: "Sezuvchan"
|
||||
add: "Qo'shish"
|
||||
reaction: "Reaktsiyalar"
|
||||
reactions: "Reaktsiyalar"
|
||||
reactionSetting: "Reaksiyalar ro'yxatingiz "
|
||||
rememberNoteVisibility: "Qaydning ko'rinish sozlamarini eslab qolish"
|
||||
attachCancel: "Qo'shimchani olib tashlash"
|
||||
enterFileName: "Fayl nomini kiriting"
|
||||
mute: "Ovozni o‘chirish"
|
||||
unmute: "Ovozni yoqish"
|
||||
renoteMute: "Qayta qaydlarni ovozini o'chirish"
|
||||
renoteUnmute: "Qayta qaydlarni ovozini yoqish"
|
||||
block: "Bloklash"
|
||||
unblock: "Blokdan chiqarish"
|
||||
suspend: "To'xtatish"
|
||||
unsuspend: "Blokdan chiqarish"
|
||||
blockConfirm: "Haqiqatdan ham quyidagi hisobni bloklashni xohlaysizmi? "
|
||||
unblockConfirm: "Haqiqatdan ham quyidagi hisobni blokdan chiqarishni xohlaysizmi? "
|
||||
suspendConfirm: "Bu hisobni to‘xtatib qo‘ymoqchi ekanligingizga ishonchingiz komilmi?"
|
||||
unsuspendConfirm: "Tasdiqlashni to'xtatib turish"
|
||||
selectList: "Ro'yxat tanlash"
|
||||
editList: "Roʻyxatni tahrirlash"
|
||||
selectChannel: "Kanalni tanlang"
|
||||
selectAntenna: "Antennani tanlang"
|
||||
editAntenna: "Antennani tahrirlang"
|
||||
selectWidget: "Vidjet tanlash"
|
||||
editWidgets: "Vidjetni tahrirlash"
|
||||
editWidgetsExit: "Tugadi"
|
||||
customEmojis: "Maxsus emoji"
|
||||
emoji: "Emoji"
|
||||
emojis: "Emoji"
|
||||
emojiName: "Emoji nomi"
|
||||
emojiUrl: "Emoji URL'i"
|
||||
addEmoji: "Emoji qo'shish"
|
||||
settingGuide: "Tavsiya qilingan sozlamalar"
|
||||
cacheRemoteFiles: "Tashqi fayllarni keshlash"
|
||||
cacheRemoteFilesDescription: "Ushbu sozlama o'chirilgan bo'lsa tashqi fayllar bevosita tashqi serverdan yuklanadi. Buni o'chirish ombor ishlatilishini kamaytiradi, lekin traffikni ko'paytiradi, chunki eskizlar generatsiya qilinmaydi."
|
||||
cacheRemoteSensitiveFiles: "Tashqi fayllarni keshlash"
|
||||
flagAsBot: "Ushbu akkauntni bot sifatida belgilash"
|
||||
flagAsBotDescription: "Agar bu akkaunt bot tomonidan boshqaralayotgan bo'ls, bu sozlamani yoqing. Sozlama yoqilganda, boshqa foydalanuvchilar uchun belgi sifatida ishlaydi, va Misskey ichki tizimlari bu akkauntni bot ekanini biladi."
|
||||
flagAsCat: "Bu akkauntni mushuk sifatida belgilash"
|
||||
flagAsCatDescription: "Ushbu akkauntni mushuk sifatida belgilash uchun ushbu sozlamani yoqing."
|
||||
flagShowTimelineReplies: "Javbolarni xronogoliya bo'yicha ko'rsatish"
|
||||
addAccount: "Akkaunt qo'shish"
|
||||
reloadAccountsList: "Hisoblar ro'yxatini yangilash"
|
||||
loginFailed: "Tizimga kirishda xatolik yuz berdi"
|
||||
showOnRemote: "Masofaviy boshqaruvni ko'rish"
|
||||
general: "Asosiy"
|
||||
wallpaper: "Fon rasmi"
|
||||
setWallpaper: "Fon rasmini o'rnatish"
|
||||
removeWallpaper: "Fon rasmini olib tashlash"
|
||||
searchWith: "Izlash: {q}"
|
||||
youHaveNoLists: "Sizda hech qanday ro'yxatlar mavjud emas"
|
||||
followConfirm: "{name} ga obuna bo'lmoqchimisiz?"
|
||||
proxyAccount: "Proksi hisob"
|
||||
host: "Host"
|
||||
selectUser: "Foydalanuvchini tanlang"
|
||||
recipient: "Qabul qiluvchi"
|
||||
annotation: "Izohlar"
|
||||
federation: "Federatsiya"
|
||||
instances: "Serverlar"
|
||||
registeredAt: "Ro'yhatdan o'tgan"
|
||||
latestStatus: "So'nggi holat"
|
||||
storageUsage: "Ishlatilgan xotira"
|
||||
charts: "Diagrammalar"
|
||||
perHour: "Soatbay"
|
||||
perDay: "Kunbay"
|
||||
stopActivityDelivery: "Faollikni jo'natishi to'xtatish"
|
||||
blockThisInstance: "Ko;rsatilgan serverni bloklash"
|
||||
operations: "Amallar"
|
||||
software: "Dastur"
|
||||
version: "Versiya"
|
||||
metadata: "Meta ma'lumot"
|
||||
withNFiles: "{n} ta fayl(lar)"
|
||||
monitor: "Kuzatish"
|
||||
jobQueue: "Vazifalar navbati"
|
||||
cpuAndMemory: "CPU va Xotira"
|
||||
network: "Tarmoq"
|
||||
disk: "Disk"
|
||||
instanceInfo: "Instans haqida ma'lumot"
|
||||
statistics: "Statistika"
|
||||
clearQueue: "Navbatni tozalash"
|
||||
clearQueueConfirmTitle: "Navbatni tozalamoqchimisiz?"
|
||||
clearCachedFiles: "Keshni tozalash"
|
||||
blockedInstances: "Bloklangan serverlar"
|
||||
muteAndBlock: "Ovozsiz va Bloklangan"
|
||||
mutedUsers: "Ovozsiz foydalanuvchilar"
|
||||
blockedUsers: "Bloklangan foydalanuvchilar"
|
||||
noUsers: "Foydalanuvchilar yo‘q"
|
||||
editProfile: "Profilni o'zgartirish"
|
||||
noteDeleteConfirm: "Haqiqatan ham bu qaydni oʻchirib tashlamoqchimisiz?"
|
||||
pinLimitExceeded: "Siz boshqa qaydlarni mahkamlay olmaysiz"
|
||||
intro: "Misskeyni o'rnatish tugallandi! Iltimos, administrator foydalanuvchi yarating."
|
||||
done: "Bajarildi"
|
||||
processing: "Amaliyotda"
|
||||
preview: "Ko'rish"
|
||||
default: "Odatiy"
|
||||
defaultValueIs: "Sukut bo'yicha: {value}"
|
||||
noCustomEmojis: "Emojilar mavjud emas"
|
||||
noJobs: "Vazifalar yo'q"
|
||||
blocked: "Bloklangan"
|
||||
suspended: "To'xtatilgan"
|
||||
all: "Barcha"
|
||||
subscribing: "Obuna bo'lish"
|
||||
publishing: "Yuborilmoqda"
|
||||
notResponding: "Javob bermayapti"
|
||||
changePassword: "Parolni o‘zgartirish"
|
||||
security: "Xavfsizlik"
|
||||
retypedNotMatch: "Maydonlar mos kelmayapti"
|
||||
currentPassword: "Joriy parol"
|
||||
newPassword: "Yangi parol"
|
||||
newPasswordRetype: "Yangi parolni boshqatdan tering"
|
||||
attachFile: "Fayl biriktirish"
|
||||
more: "Ko'proq!"
|
||||
noSuchUser: "Foydalanuvchi topilmadi"
|
||||
lookup: "So'rov"
|
||||
announcements: "Bildirishnomalar"
|
||||
imageUrl: "Rasm URL"
|
||||
remove: "O'chirib tashlash"
|
||||
removed: "Muvaffaqiyatli o'chirildi"
|
||||
removeAreYouSure: "“{x}”ni olib tashlamoqchi ekanligingizga ishonchingiz komilmi?"
|
||||
deleteAreYouSure: "“{x}”ni chindan ham yo'q qilmoqchimisiz?"
|
||||
resetAreYouSure: "Haqiqatan ham qayta tiklansinmi?"
|
||||
saved: "Saqlandi"
|
||||
messaging: "Suhbat"
|
||||
upload: "Yuklash"
|
||||
keepOriginalUploading: "Asl rasmni saqlang"
|
||||
uploadFromUrlDescription: "Yuklamoqchi bo'lgan faylingizga havola"
|
||||
explore: "Ko'rib chiqish"
|
||||
messageRead: "O‘qildi"
|
||||
startMessaging: "Yangi suhbatni boshlash"
|
||||
nUsersRead: "{n} tomonidan o'qildi"
|
||||
agreeTo: "Men {0} ga roziman"
|
||||
agree: "Rozi bo'lish"
|
||||
agreeBelow: "Men quyidagilarga roziman"
|
||||
basicNotesBeforeCreateAccount: "Muhim qaydlar"
|
||||
termsOfService: "Foydalanish shartlari"
|
||||
start: "Boshlash"
|
||||
home: "Bosh sahifa"
|
||||
activity: "Faollik"
|
||||
images: "Rasmlar"
|
||||
image: "Rasm"
|
||||
birthday: "Tug'ilgan kun"
|
||||
yearsOld: "{age} yashar"
|
||||
registeredDate: "Ro'yxatdan o'tgan sanasi"
|
||||
location: "Manzil"
|
||||
theme: "Rang sxemasi"
|
||||
themeForLightMode: "Yorug' rejim uchun rang sxemasi"
|
||||
themeForDarkMode: "Qorong'i rejim uchun rang sxemasi"
|
||||
light: "Yorug'"
|
||||
dark: "Qorongʻi"
|
||||
lightThemes: "Yorug‘ rang sxemasi"
|
||||
darkThemes: "Qorong'i rang sxemasi"
|
||||
drive: "Disk"
|
||||
fileName: "Fayl nomi"
|
||||
selectFile: "Faylni tanlang"
|
||||
selectFiles: "Fayllarni tanlang"
|
||||
selectFolder: "Jildni tanlang"
|
||||
selectFolders: "Jildlarni tanlang"
|
||||
renameFile: "Faylni nomini tahrirlash"
|
||||
folderName: "Jild nomi"
|
||||
createFolder: "Papka qo'shish"
|
||||
renameFolder: "Papka nomini o‘zgartirish"
|
||||
deleteFolder: "Papkani o‘chirish"
|
||||
addFile: "Fayl qo‘shish"
|
||||
emptyDrive: "Diskingiz bo'sh"
|
||||
emptyFolder: "Ushbu papka bo'sh"
|
||||
unableToDelete: "O'chirilmadi"
|
||||
inputNewFileName: "Yangi fayl nomini kiriting"
|
||||
inputNewFolderName: "Yangi papka nomini kiriting"
|
||||
copyUrl: "Bog'lamadan nusxa olish"
|
||||
rename: "Qayta nomlash"
|
||||
avatar: "Avatar"
|
||||
banner: "Banner"
|
||||
disconnectedFromServer: "Server bilan ulanish uzulib qoldi"
|
||||
reload: "Yangilash"
|
||||
doNothing: "E'tiborsiz qoldirish"
|
||||
reloadConfirm: "Timeline'ni yangilashni xohlaysizmi?"
|
||||
watch: "Kuzatmoq"
|
||||
unwatch: "Kuzatishni to'xtatish"
|
||||
accept: "Ruxsat"
|
||||
reject: "Rad etish"
|
||||
normal: "Yaxshi"
|
||||
instanceName: "Server nomi"
|
||||
instanceDescription: "Server tavsifi"
|
||||
maintainerName: "Qo'llab-quvvatlovchi"
|
||||
maintainerEmail: "Administratorning elektron pochtasi"
|
||||
tosUrl: "Foydalanish shartlariga havola"
|
||||
thisYear: "Joriy yil"
|
||||
thisMonth: "Shu oy"
|
||||
today: "Bugun"
|
||||
dayX: "{day}"
|
||||
monthX: "{month}"
|
||||
yearX: "{year}"
|
||||
pages: "Sahifalar"
|
||||
integration: "Integratsiya"
|
||||
connectService: "Ulash"
|
||||
disconnectService: "Uzish"
|
||||
enableLocalTimeline: "Mahalliy vaqt mintaqasini yoqing"
|
||||
enableGlobalTimeline: "Global vaqt mintaqasini yoqing"
|
||||
registration: "Ro'yxatdan o'tish"
|
||||
enableRegistration: "Ro'yxatdan o'tishni yoqing"
|
||||
invite: "Taklif qilish"
|
||||
inMb: "Megabaytlarda"
|
||||
basicInfo: "Asosiy ma'lumot"
|
||||
pinnedUsers: "Qadalgan foydalanuvchilar"
|
||||
pinnedPages: "Qadalgan Sahifalar"
|
||||
pinnedNotes: "Qadanlgan qayd"
|
||||
hcaptcha: "hCaptcha"
|
||||
enableHcaptcha: "hCaptchani yoqish"
|
||||
hcaptchaSiteKey: "Sayt kaliti"
|
||||
hcaptchaSecretKey: "Mahfiy kalit"
|
||||
recaptcha: "reCAPTCHA"
|
||||
enableRecaptcha: "reCAPTCHA ni yoqish"
|
||||
recaptchaSiteKey: "Sayt kaliti"
|
||||
recaptchaSecretKey: "Maxfiy kalit"
|
||||
turnstileSiteKey: "Sayt kaliti"
|
||||
turnstileSecretKey: "Maxfiy kalit"
|
||||
antennas: "Antennalar"
|
||||
manageAntennas: "Antennalarni boshqarish"
|
||||
name: "Ism"
|
||||
antennaSource: "Antenna manbai"
|
||||
silence: "Sukunat"
|
||||
exploreUsersCount: "{count} ta foydalanuvchi bor"
|
||||
popularTags: "Ommabop teglar"
|
||||
userList: "Ro'yxatlar"
|
||||
about: "Haqida"
|
||||
aboutMisskey: "Misskey haqida"
|
||||
administrator: "Administrator"
|
||||
token: "Tasdiqlash"
|
||||
2fa: "Ikki faktorli autentifikatsiya"
|
||||
totp: "Autentifikatsiya ilovasi"
|
||||
totpDescription: "Bir martalik parollarni kiritish uchun autentifikatsiya ilovasidan foydalaning"
|
||||
moderator: "Moderator"
|
||||
resetPassword: "Parolni tiklash"
|
||||
share: "Yuborish"
|
||||
notFound: "Topilmadi"
|
||||
uploadFolder: "Jildni yuklash"
|
||||
cacheClear: "Keshni tozalash"
|
||||
help: "Yordam"
|
||||
inputMessageHere: "Xabar kiriting"
|
||||
close: "Yopish"
|
||||
invites: "Taklif qilish"
|
||||
members: "A'zolar"
|
||||
title: "Sarlavha"
|
||||
text: "Matn"
|
||||
enable: "Yoqish"
|
||||
invitations: "Taklif qilish"
|
||||
dashboard: "Boshqaruv paneli"
|
||||
local: "Mahalliy"
|
||||
total: "Jami"
|
||||
weekOverWeekChanges: "Oxirgi haftadagi o'zgarishlar"
|
||||
dayOverDayChanges: "Kecha bo'lgan o'zgarishlar"
|
||||
appearance: "Tasgqi ko'rinish"
|
||||
clientSettings: "Klient sozlamalari"
|
||||
accountSettings: "Profil sozlamalari"
|
||||
sounds: "Tovushlar"
|
||||
sound: "ovoz"
|
||||
none: "Hechnima"
|
||||
volume: "Ovoz balandligi"
|
||||
details: "Batafsil"
|
||||
output: "Chiqish"
|
||||
menu: "Menyu"
|
||||
divider: "Ajratrmoq"
|
||||
addItem: "Element qo'shish"
|
||||
themeEditor: "Rang sxemasi muharriri"
|
||||
enableAll: "Yoqish"
|
||||
edit: "Tahrirlash"
|
||||
email: "Email"
|
||||
smtpHost: "Host"
|
||||
smtpUser: "Foydalanuvchi nomi"
|
||||
smtpPass: "Parol"
|
||||
copy: "Nusxa olish"
|
||||
notificationSetting: "Bildirishnoma sozlamalari"
|
||||
other: "Qo‘shimcha"
|
||||
behavior: "Hatti-harakatlar"
|
||||
sample: "Namuna"
|
||||
public: "Ommaviy"
|
||||
clearCache: "Keshni tozalash"
|
||||
onlineUsersCount: "Faol userlar"
|
||||
myTheme: "Mening rang sxemam"
|
||||
backgroundColor: "Fon"
|
||||
accentColor: "Urg'u"
|
||||
textColor: "Matn"
|
||||
info: "Haqida"
|
||||
user: "Foydalanuvchilar"
|
||||
global: "Global"
|
||||
squareAvatars: "Kvadrat avatarkalar"
|
||||
searchByGoogle: "Izlash"
|
||||
indefinitely: "Hech qachon"
|
||||
file: "Fayllar"
|
||||
label: "Yorliq"
|
||||
color: "Rang"
|
||||
_achievements:
|
||||
_types:
|
||||
_viewInstanceChart:
|
||||
title: "Tahlilchi"
|
||||
_ad:
|
||||
hide: "Boshqa ko'rsatilmasin"
|
||||
_email:
|
||||
_follow:
|
||||
title: "sizga obuna bo'ldi"
|
||||
_registry:
|
||||
key: "Kalit"
|
||||
keys: "Kalit"
|
||||
_instanceTicker:
|
||||
none: "Boshqa ko'rsatilmasin"
|
||||
always: "Doimo ko'rsatilsin"
|
||||
_theme:
|
||||
install: "Rang sxemasini o'rnatish"
|
||||
manage: "Rang sxemalarini boshqarish"
|
||||
code: "Rang sxemasining kodi"
|
||||
description: "Tavsif"
|
||||
installed: "{name} o'rnatildi"
|
||||
installedThemes: "O'rnatilgan rang sxemalari"
|
||||
alreadyInstalled: "Ushbu rang sxemasi allaqachon o'rnatilgan"
|
||||
invalid: "Ushbu rang sxemasining formati yaroqsiz"
|
||||
make: "Rang sxemasini yasash"
|
||||
base: "Asos"
|
||||
addConstant: "O'zgarmas qo'shish"
|
||||
constant: "O'zgarmas"
|
||||
color: "Rang"
|
||||
key: "Kalit"
|
||||
func: "Funksiyalar"
|
||||
funcKind: "Funksiya turi"
|
||||
argument: "Argument"
|
||||
darken: "Qoraytirish"
|
||||
lighten: "Yoritish"
|
||||
inputConstantName: "Ushbu o'zgarmas uchun nom kiriting"
|
||||
deleteConstantConfirm: "Siz rostdan ham {const} o'zgarmasni o'chirmoqchimisiz?"
|
||||
keys:
|
||||
accent: "Urg'u"
|
||||
bg: "Fon"
|
||||
fg: "Matn"
|
||||
focus: "Fokus"
|
||||
panel: "Panel"
|
||||
shadow: "Soya"
|
||||
header: "Sarlavha"
|
||||
navBg: "Yon panel foni"
|
||||
navFg: "Yon panel matni"
|
||||
mention: "Murojat"
|
||||
renote: "Qayta qaydetish"
|
||||
divider: "Ajratrmoq"
|
||||
accentDarken: "Urg'u (Qoraytirilgan)"
|
||||
accentLighten: "Urg'u (Yoritilgan)"
|
||||
fgHighlighted: "Belgilangan matn"
|
||||
_sfx:
|
||||
note: "Qaydlar"
|
||||
notification: "Xabarnomalar"
|
||||
chat: "Suhbat"
|
||||
_2fa:
|
||||
renewTOTPCancel: "Hozir emas"
|
||||
_permissions:
|
||||
"read:blocks": "Bloklangan foydalanuvchilar roʻyxatini koʻring"
|
||||
"write:blocks": "Bloklangan foydalanuvchilar roʻyxatini tahrirlang"
|
||||
_weekday:
|
||||
saturday: "Shanba"
|
||||
_widgets:
|
||||
profile: "Profil"
|
||||
instanceInfo: "Instans haqida ma'lumot"
|
||||
notifications: "Xabarnomalar"
|
||||
timeline: "Xronologiya"
|
||||
clock: "Soat"
|
||||
activity: "Faollik"
|
||||
photos: "Rasmlar"
|
||||
digitalClock: "Raqamli soat"
|
||||
unixClock: "UNIX soat"
|
||||
federation: "Federatsiya"
|
||||
button: "Tugma"
|
||||
jobQueue: "Vazifalar navbati"
|
||||
_userList:
|
||||
chooseList: "Ro'yxat tanlash"
|
||||
_cw:
|
||||
show: "Ko‘proq ko‘rish"
|
||||
chars: "{count} ta belgi(lar)"
|
||||
files: "{count} ta fayl(lar)"
|
||||
_poll:
|
||||
noOnlyOneChoice: "Kamida ikkita tanvol kerak"
|
||||
infinite: "Hech qachon"
|
||||
at: "...da tugatish"
|
||||
after: "...dan keyin tugatish"
|
||||
deadlineTime: "Vaqt"
|
||||
duration: "Davomiylik"
|
||||
votesCount: "{n} ovozlar"
|
||||
totalVotes: "Umuman {n} ovozlar"
|
||||
vote: "Ovoz berish"
|
||||
showResult: "Natijalarni ko'rish"
|
||||
voted: "Ovoz berildi"
|
||||
closed: "Yakunladi"
|
||||
remainingDays: "{d} kun {h} soat qoldi"
|
||||
remainingHours: "{h} soat {m} daqiqa qoldi"
|
||||
remainingMinutes: "{m} daqiqa {s} sekund qoldi"
|
||||
remainingSeconds: "{s} sekund qoldi"
|
||||
_visibility:
|
||||
public: "Ommaviy"
|
||||
publicDescription: "Sizning ovozingiz barcha foydalanuvchilarga ko'rinadi"
|
||||
home: "Bosh sahifa"
|
||||
followers: "Obunachilar"
|
||||
specified: "Bevosita"
|
||||
_profile:
|
||||
name: "Ism"
|
||||
username: "Foydalanuvchi nomi"
|
||||
description: "Biografiya"
|
||||
metadata: "Qo'shimcha ma'lumot"
|
||||
metadataLabel: "Yorliq"
|
||||
metadataContent: "Tarkib"
|
||||
changeBanner: "Bannerni o'zgartirish"
|
||||
_exportOrImport:
|
||||
allNotes: "Barcha qaydlar"
|
||||
followingList: "Obuna bo‘lish"
|
||||
muteList: "Ovozni o‘chirish"
|
||||
blockingList: "Bloklangan foydalanuvchilar"
|
||||
userLists: "Ro'yxatlar"
|
||||
_charts:
|
||||
federation: "Federatsiya"
|
||||
apRequest: "So'rovlar"
|
||||
usersTotal: "Foydalanuvchilarning umumiy soni"
|
||||
activeUsers: "Faol foydalanuvchilar"
|
||||
notesTotal: "Qaydlarning umumiy soni"
|
||||
filesTotal: "Fayllarning umumiy soni"
|
||||
_instanceCharts:
|
||||
requests: "So'rovlar"
|
||||
notes: "Qaydlar sonidagi farq"
|
||||
cacheSize: "Kesh hajmidagi farq"
|
||||
files: "Fayllar sonidagi farq"
|
||||
_timelines:
|
||||
home: "Bosh sahifa"
|
||||
local: "Mahalliy"
|
||||
social: "Ijtimoiy"
|
||||
global: "Global"
|
||||
_play:
|
||||
featured: "Mashhur"
|
||||
title: "Sarlavha"
|
||||
script: "Skript"
|
||||
summary: "Tavsif"
|
||||
_pages:
|
||||
newPage: "Yangi Sahifa yaratish"
|
||||
editPage: "Ushbu Sahifani tahrirlash"
|
||||
created: "Sahifa muvaffaqiyatli yaratildi"
|
||||
updated: "Sahifa muvaffaqiyatli tahrirlandi"
|
||||
deleted: "Sahifa muvaffaqiyatli o'chirildi"
|
||||
pageSetting: "Sahifa sozlamalari"
|
||||
nameAlreadyExists: "Ko'rsatilgan Sahifa URL'i allaqachon mavjud"
|
||||
invalidNameTitle: "Ko'rsatilgan Sahifa URL'i yaroqsiz"
|
||||
editThisPage: "Ushbu Sahifani tahrirlash"
|
||||
viewPage: "Sizning Sahifalaringizni ko'rish"
|
||||
my: "Mening Sahifalarim"
|
||||
featured: "Mashhur"
|
||||
contents: "Tarkib"
|
||||
title: "Sarlavha"
|
||||
url: "Sahifa URL'i"
|
||||
summary: "Sahifa bayoni"
|
||||
font: "Shrift"
|
||||
fontSerif: "Serif"
|
||||
fontSansSerif: "Sans Serif"
|
||||
selectType: "Turni tanlang"
|
||||
contentBlocks: "Tarkib"
|
||||
blocks:
|
||||
text: "Matn"
|
||||
textarea: "Matn maydoni"
|
||||
section: "Bo'lim"
|
||||
image: "Rasmlar"
|
||||
button: "Tugma"
|
||||
note: "Biriktirilgan qayd"
|
||||
_note:
|
||||
id: "Qayd ID"
|
||||
detailed: "Batafsil ko'rinishi"
|
||||
_relayStatus:
|
||||
requesting: "Kutilmoqda"
|
||||
accepted: "Tasdiqlandi"
|
||||
rejected: "Rad etildi"
|
||||
_notification:
|
||||
fileUploaded: "Fayl muvaffaqiyatli yuklandi"
|
||||
youGotMention: "{name} sizni eslab o'tdi"
|
||||
youGotReply: "{name} sizga javob berdi"
|
||||
youGotQuote: "{name} sizdan iqtibos keltirdi"
|
||||
youRenoted: "{name} dan qayta qayd qilish"
|
||||
youWereFollowed: "sizga obuna bo'ldi"
|
||||
unreadAntennaNote: "Antenna {name}"
|
||||
_types:
|
||||
all: "Barchasi"
|
||||
follow: "Obuna bo‘lish"
|
||||
mention: "Murojat"
|
||||
renote: "Qayta qaydetish"
|
||||
quote: "Iqtibos keltirish"
|
||||
reaction: "Reaktsiyalar"
|
||||
receiveFollowRequest: "Qabul qilingan kuzatuv so'rovlari"
|
||||
_actions:
|
||||
reply: "Javob berish"
|
||||
renote: "Qayta qayd qilish"
|
||||
_deck:
|
||||
alwaysShowMainColumn: "Har doim asosiy ustunni ko'rsatish"
|
||||
columnAlign: "Ustunlarni tekislash"
|
||||
addColumn: "Ustun qo'shish"
|
||||
configureColumn: "Ustun sozlamalari"
|
||||
swapLeft: "Chapdagi ustun bilan joyni almashtirish"
|
||||
swapRight: "O'ngdagi ustun bilan joyni almashtirish"
|
||||
swapUp: "Yuqoridagi ustun bilan joyni almashtirish"
|
||||
swapDown: "Quyidagi ustun bilan joyni almashtirish"
|
||||
profile: "Profil"
|
||||
newProfile: "Yangi profil"
|
||||
deleteProfile: "Profilni o‘chirib tashlash"
|
||||
_columns:
|
||||
main: "Asosiy"
|
||||
notifications: "Xabarnomalar"
|
||||
tl: "Xronologiya"
|
||||
antenna: "Antennalar"
|
||||
list: "Ro‘yxat"
|
||||
channel: "Kanal"
|
||||
mentions: "Eslatib o'tish"
|
||||
direct: "Bevosita qaydlar"
|
||||
roleTimeline: "Rol xronologiyasi"
|
||||
_webhookSettings:
|
||||
name: "Ism"
|
||||
active: "Yoqilgan"
|
||||
_events:
|
||||
renote: "Qayta qayd qilinganda"
|
||||
mention: "Eslanganda"
|
@@ -1091,6 +1091,9 @@ usedAt: "使用时间"
|
||||
unused: "未使用"
|
||||
used: "已使用"
|
||||
expired: "已过期"
|
||||
doYouAgree: "你同意吗?"
|
||||
beSureToReadThisAsItIsImportant: "请好好阅读,这真的很重要。"
|
||||
iHaveReadXCarefullyAndAgree: "我已经仔细阅读并同意了「{x}」的内容。"
|
||||
_initialAccountSetting:
|
||||
accountCreated: "账户创建完成了!"
|
||||
letsStartAccountSetup: "来进行帐户的初始设置吧。"
|
||||
|
@@ -1,7 +1,7 @@
|
||||
---
|
||||
_lang_: "繁體中文"
|
||||
headlineMisskey: "貼文連繫網絡"
|
||||
introMisskey: "歡迎! Misskey是一個開源且去中心化的社群網絡。\n通過「貼文」分享周邊新鮮事,並告訴其他人您的想法!📡\n透過「情感」功能,對大家的貼文表達情感!👍\n一起來探索這個新的世界吧!🚀"
|
||||
introMisskey: "歡迎!Misskey 是一個開源且去中心化的社群網路服務。\n發佈「貼文」向身邊的人分享您的想法!📡\n利用「反應」表達您對貼文的感覺!👍\n讓我們一起探索新的世界吧!🚀"
|
||||
poweredByMisskeyDescription: "{name}是使用開放原始碼平台<b>Misskey</b>的服務之一(稱為 Misskey 伺服器)。\n"
|
||||
monthAndDay: "{month}月 {day}日"
|
||||
search: "搜尋"
|
||||
|
@@ -1,12 +1,12 @@
|
||||
{
|
||||
"name": "misskey",
|
||||
"version": "13.14.0-beta.7",
|
||||
"version": "13.14.1",
|
||||
"codename": "nasubi",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/misskey-dev/misskey.git"
|
||||
},
|
||||
"packageManager": "pnpm@8.6.0",
|
||||
"packageManager": "pnpm@8.6.9",
|
||||
"workspaces": [
|
||||
"packages/frontend",
|
||||
"packages/backend",
|
||||
|
@@ -2,14 +2,7 @@ import Redis from 'ioredis';
|
||||
import { loadConfig } from './built/config.js';
|
||||
|
||||
const config = loadConfig();
|
||||
const redis = new Redis({
|
||||
port: config.redis.port,
|
||||
host: config.redis.host,
|
||||
family: config.redis.family == null ? 0 : config.redis.family,
|
||||
password: config.redis.pass,
|
||||
keyPrefix: `${config.redis.prefix}:`,
|
||||
db: config.redis.db ?? 0,
|
||||
});
|
||||
const redis = new Redis(config.redis);
|
||||
|
||||
redis.on('connect', () => redis.disconnect());
|
||||
redis.on('error', (e) => {
|
||||
|
@@ -154,7 +154,6 @@
|
||||
"typeorm": "0.3.17",
|
||||
"typescript": "5.1.6",
|
||||
"ulid": "2.3.0",
|
||||
"unzipper": "0.10.14",
|
||||
"vary": "1.1.2",
|
||||
"web-push": "3.6.3",
|
||||
"ws": "8.13.0",
|
||||
@@ -194,7 +193,6 @@
|
||||
"@types/sinonjs__fake-timers": "8.1.2",
|
||||
"@types/tinycolor2": "1.4.3",
|
||||
"@types/tmp": "0.2.3",
|
||||
"@types/unzipper": "0.10.6",
|
||||
"@types/vary": "1.1.0",
|
||||
"@types/web-push": "3.3.2",
|
||||
"@types/ws": "8.5.5",
|
||||
|
@@ -41,14 +41,7 @@ const $meilisearch: Provider = {
|
||||
const $redis: Provider = {
|
||||
provide: DI.redis,
|
||||
useFactory: (config: Config) => {
|
||||
return new Redis.Redis({
|
||||
port: config.redis.port,
|
||||
host: config.redis.host,
|
||||
family: config.redis.family == null ? 0 : config.redis.family,
|
||||
password: config.redis.pass,
|
||||
keyPrefix: `${config.redis.prefix}:`,
|
||||
db: config.redis.db ?? 0,
|
||||
});
|
||||
return new Redis.Redis(config.redis);
|
||||
},
|
||||
inject: [DI.config],
|
||||
};
|
||||
@@ -56,14 +49,7 @@ const $redis: Provider = {
|
||||
const $redisForPub: Provider = {
|
||||
provide: DI.redisForPub,
|
||||
useFactory: (config: Config) => {
|
||||
const redis = new Redis.Redis({
|
||||
port: config.redisForPubsub.port,
|
||||
host: config.redisForPubsub.host,
|
||||
family: config.redisForPubsub.family == null ? 0 : config.redisForPubsub.family,
|
||||
password: config.redisForPubsub.pass,
|
||||
keyPrefix: `${config.redisForPubsub.prefix}:`,
|
||||
db: config.redisForPubsub.db ?? 0,
|
||||
});
|
||||
const redis = new Redis.Redis(config.redisForPubsub);
|
||||
return redis;
|
||||
},
|
||||
inject: [DI.config],
|
||||
@@ -72,14 +58,7 @@ const $redisForPub: Provider = {
|
||||
const $redisForSub: Provider = {
|
||||
provide: DI.redisForSub,
|
||||
useFactory: (config: Config) => {
|
||||
const redis = new Redis.Redis({
|
||||
port: config.redisForPubsub.port,
|
||||
host: config.redisForPubsub.host,
|
||||
family: config.redisForPubsub.family == null ? 0 : config.redisForPubsub.family,
|
||||
password: config.redisForPubsub.pass,
|
||||
keyPrefix: `${config.redisForPubsub.prefix}:`,
|
||||
db: config.redisForPubsub.db ?? 0,
|
||||
});
|
||||
const redis = new Redis.Redis(config.redisForPubsub);
|
||||
redis.subscribe(config.host);
|
||||
return redis;
|
||||
},
|
||||
|
@@ -6,6 +6,16 @@ import * as fs from 'node:fs';
|
||||
import { fileURLToPath } from 'node:url';
|
||||
import { dirname, resolve } from 'node:path';
|
||||
import * as yaml from 'js-yaml';
|
||||
import type { RedisOptions } from 'ioredis';
|
||||
|
||||
type RedisOptionsSource = Partial<RedisOptions> & {
|
||||
host: string;
|
||||
port: number;
|
||||
family?: number;
|
||||
pass: string;
|
||||
db?: number;
|
||||
prefix?: string;
|
||||
};
|
||||
|
||||
/**
|
||||
* ユーザーが設定する必要のある情報
|
||||
@@ -35,30 +45,9 @@ export type Source = {
|
||||
user: string;
|
||||
pass: string;
|
||||
}[];
|
||||
redis: {
|
||||
host: string;
|
||||
port: number;
|
||||
family?: number;
|
||||
pass: string;
|
||||
db?: number;
|
||||
prefix?: string;
|
||||
};
|
||||
redisForPubsub?: {
|
||||
host: string;
|
||||
port: number;
|
||||
family?: number;
|
||||
pass: string;
|
||||
db?: number;
|
||||
prefix?: string;
|
||||
};
|
||||
redisForJobQueue?: {
|
||||
host: string;
|
||||
port: number;
|
||||
family?: number;
|
||||
pass: string;
|
||||
db?: number;
|
||||
prefix?: string;
|
||||
};
|
||||
redis: RedisOptionsSource;
|
||||
redisForPubsub?: RedisOptionsSource;
|
||||
redisForJobQueue?: RedisOptionsSource;
|
||||
meilisearch?: {
|
||||
host: string;
|
||||
port: string;
|
||||
@@ -119,8 +108,9 @@ export type Mixin = {
|
||||
mediaProxy: string;
|
||||
externalMediaProxyEnabled: boolean;
|
||||
videoThumbnailGenerator: string | null;
|
||||
redisForPubsub: NonNullable<Source['redisForPubsub']>;
|
||||
redisForJobQueue: NonNullable<Source['redisForJobQueue']>;
|
||||
redis: RedisOptions & RedisOptionsSource;
|
||||
redisForPubsub: RedisOptions & RedisOptionsSource;
|
||||
redisForJobQueue: RedisOptions & RedisOptionsSource;
|
||||
};
|
||||
|
||||
export type Config = Source & Mixin;
|
||||
@@ -182,9 +172,9 @@ export function loadConfig() {
|
||||
config.videoThumbnailGenerator.endsWith('/') ? config.videoThumbnailGenerator.substring(0, config.videoThumbnailGenerator.length - 1) : config.videoThumbnailGenerator
|
||||
: null;
|
||||
|
||||
if (!config.redis.prefix) config.redis.prefix = mixin.host;
|
||||
if (config.redisForPubsub == null) config.redisForPubsub = config.redis;
|
||||
if (config.redisForJobQueue == null) config.redisForJobQueue = config.redis;
|
||||
mixin.redis = convertRedisOptions(config.redis, mixin.host);
|
||||
mixin.redisForPubsub = config.redisForPubsub ? convertRedisOptions(config.redisForPubsub, mixin.host) : mixin.redis;
|
||||
mixin.redisForJobQueue = config.redisForJobQueue ? convertRedisOptions(config.redisForJobQueue, mixin.host) : mixin.redis;
|
||||
|
||||
return Object.assign(config, mixin);
|
||||
}
|
||||
@@ -196,3 +186,14 @@ function tryCreateUrl(url: string) {
|
||||
throw new Error(`url="${url}" is not a valid URL.`);
|
||||
}
|
||||
}
|
||||
|
||||
function convertRedisOptions(options: RedisOptionsSource, host: string): RedisOptions & RedisOptionsSource {
|
||||
return {
|
||||
...options,
|
||||
password: options.pass,
|
||||
prefix: options.prefix ?? host,
|
||||
family: options.family == null ? 0 : options.family,
|
||||
keyPrefix: `${options.prefix ?? host}:`,
|
||||
db: options.db ?? 0,
|
||||
};
|
||||
}
|
||||
|
@@ -33,7 +33,7 @@ export class CreateSystemUserService {
|
||||
// Generate secret
|
||||
const secret = generateNativeUserToken();
|
||||
|
||||
const keyPair = await genRsaKeyPair(4096);
|
||||
const keyPair = await genRsaKeyPair();
|
||||
|
||||
let account!: User;
|
||||
|
||||
|
@@ -108,7 +108,7 @@ export class QueueService {
|
||||
removeOnFail: true,
|
||||
};
|
||||
|
||||
await this.deliverQueue.addBulk(Array.from(inboxes.entries()).map(d => ({
|
||||
await this.deliverQueue.addBulk(Array.from(inboxes.entries(), d => ({
|
||||
name: d[0],
|
||||
data: {
|
||||
user,
|
||||
|
@@ -92,7 +92,7 @@ export class SignupService {
|
||||
|
||||
const keyPair = await new Promise<string[]>((res, rej) =>
|
||||
generateKeyPair('rsa', {
|
||||
modulusLength: 4096,
|
||||
modulusLength: 2048,
|
||||
publicKeyEncoding: {
|
||||
type: 'spki',
|
||||
format: 'pem',
|
||||
|
@@ -95,7 +95,7 @@ export class ApAudienceService {
|
||||
private isPublic(id: string): boolean {
|
||||
return [
|
||||
'https://www.w3.org/ns/activitystreams#Public',
|
||||
'as#Public',
|
||||
'as:Public',
|
||||
'Public',
|
||||
].includes(id);
|
||||
}
|
||||
|
@@ -15,11 +15,8 @@ export const QUEUE = {
|
||||
export function baseQueueOptions(config: Config, queueName: typeof QUEUE[keyof typeof QUEUE]): Bull.QueueOptions {
|
||||
return {
|
||||
connection: {
|
||||
port: config.redisForJobQueue.port,
|
||||
host: config.redisForJobQueue.host,
|
||||
family: config.redisForJobQueue.family == null ? 0 : config.redisForJobQueue.family,
|
||||
password: config.redisForJobQueue.pass,
|
||||
db: config.redisForJobQueue.db ?? 0,
|
||||
...config.redisForJobQueue,
|
||||
keyPrefix: undefined
|
||||
},
|
||||
prefix: config.redisForJobQueue.prefix ? `${config.redisForJobQueue.prefix}:queue:${queueName}` : `queue:${queueName}`,
|
||||
};
|
||||
|
@@ -1,7 +1,7 @@
|
||||
import * as fs from 'node:fs';
|
||||
import { Inject, Injectable } from '@nestjs/common';
|
||||
import { ZipReader } from 'slacc';
|
||||
import { DataSource } from 'typeorm';
|
||||
import unzipper from 'unzipper';
|
||||
import { DI } from '@/di-symbols.js';
|
||||
import type { EmojisRepository, DriveFilesRepository, UsersRepository } from '@/models/index.js';
|
||||
import type { Config } from '@/config.js';
|
||||
@@ -72,9 +72,9 @@ export class ImportCustomEmojisProcessorService {
|
||||
}
|
||||
|
||||
const outputPath = path + '/emojis';
|
||||
const unzipStream = fs.createReadStream(destPath);
|
||||
const extractor = unzipper.Extract({ path: outputPath });
|
||||
extractor.on('close', async () => {
|
||||
try {
|
||||
this.logger.succ(`Unzipping to ${outputPath}`);
|
||||
ZipReader.withDestinationPath(outputPath).viaBuffer(await fs.promises.readFile(destPath));
|
||||
const metaRaw = fs.readFileSync(outputPath + '/meta.json', 'utf-8');
|
||||
const meta = JSON.parse(metaRaw);
|
||||
|
||||
@@ -115,8 +115,12 @@ export class ImportCustomEmojisProcessorService {
|
||||
cleanup();
|
||||
|
||||
this.logger.succ('Imported');
|
||||
});
|
||||
unzipStream.pipe(extractor);
|
||||
this.logger.succ(`Unzipping to ${outputPath}`);
|
||||
} catch (e) {
|
||||
if (e instanceof Error || typeof e === 'string') {
|
||||
this.logger.error(e);
|
||||
}
|
||||
cleanup();
|
||||
throw e;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -4,6 +4,7 @@ import type { DriveFilesRepository } from '@/models/index.js';
|
||||
import { DI } from '@/di-symbols.js';
|
||||
import { CustomEmojiService } from '@/core/CustomEmojiService.js';
|
||||
import { ModerationLogService } from '@/core/ModerationLogService.js';
|
||||
import { EmojiEntityService } from '@/core/entities/EmojiEntityService.js';
|
||||
import { ApiError } from '../../../error.js';
|
||||
|
||||
export const meta = {
|
||||
@@ -55,6 +56,7 @@ export default class extends Endpoint<typeof meta, typeof paramDef> {
|
||||
|
||||
private customEmojiService: CustomEmojiService,
|
||||
|
||||
private emojiEntityService: EmojiEntityService,
|
||||
private moderationLogService: ModerationLogService,
|
||||
) {
|
||||
super(meta, paramDef, async (ps, me) => {
|
||||
@@ -77,9 +79,7 @@ export default class extends Endpoint<typeof meta, typeof paramDef> {
|
||||
emojiId: emoji.id,
|
||||
});
|
||||
|
||||
return {
|
||||
id: emoji.id,
|
||||
};
|
||||
return this.emojiEntityService.packDetailed(emoji);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
@@ -60,7 +60,7 @@ export default class extends Endpoint<typeof meta, typeof paramDef> {
|
||||
}
|
||||
|
||||
query.limit(ps.limit);
|
||||
query.skip(ps.offset);
|
||||
query.offset(ps.offset);
|
||||
|
||||
const tickets = await query.getMany();
|
||||
|
||||
|
@@ -105,7 +105,7 @@ export default class extends Endpoint<typeof meta, typeof paramDef> {
|
||||
}
|
||||
|
||||
query.limit(ps.limit);
|
||||
query.skip(ps.offset);
|
||||
query.offset(ps.offset);
|
||||
|
||||
const users = await query.getMany();
|
||||
|
||||
|
@@ -76,6 +76,11 @@ export default class extends Endpoint<typeof meta, typeof paramDef> {
|
||||
throw new ApiError(meta.errors.noSuchAntenna);
|
||||
}
|
||||
|
||||
this.antennasRepository.update(antenna.id, {
|
||||
isActive: true,
|
||||
lastUsedAt: new Date(),
|
||||
});
|
||||
|
||||
const limit = ps.limit + (ps.untilId ? 1 : 0) + (ps.sinceId ? 1 : 0); // untilIdに指定したものも含まれるため+1
|
||||
const noteIdsRes = await this.redisClient.xrevrange(
|
||||
`antennaTimeline:${antenna.id}`,
|
||||
@@ -112,11 +117,6 @@ export default class extends Endpoint<typeof meta, typeof paramDef> {
|
||||
this.noteReadService.read(me.id, notes);
|
||||
}
|
||||
|
||||
this.antennasRepository.update(antenna.id, {
|
||||
isActive: true,
|
||||
lastUsedAt: new Date(),
|
||||
});
|
||||
|
||||
return await this.noteEntityService.packMany(notes, me);
|
||||
});
|
||||
}
|
||||
|
@@ -112,6 +112,8 @@ export default class extends Endpoint<typeof meta, typeof paramDef> {
|
||||
withReplies: ps.withReplies,
|
||||
withFile: ps.withFile,
|
||||
notify: ps.notify,
|
||||
isActive: true,
|
||||
lastUsedAt: new Date(),
|
||||
});
|
||||
|
||||
this.globalEventService.publishInternalEvent('antennaUpdated', await this.antennasRepository.findOneByOrFail({ id: antenna.id }));
|
||||
|
@@ -126,7 +126,7 @@ export default class extends Endpoint<typeof meta, typeof paramDef> {
|
||||
query.andWhere('instance.host like :host', { host: '%' + sqlLikeEscape(ps.host.toLowerCase()) + '%' });
|
||||
}
|
||||
|
||||
const instances = await query.limit(ps.limit).skip(ps.offset).getMany();
|
||||
const instances = await query.limit(ps.limit).offset(ps.offset).getMany();
|
||||
|
||||
return await this.instanceEntityService.packMany(instances);
|
||||
});
|
||||
|
@@ -42,7 +42,7 @@ export default class extends Endpoint<typeof meta, typeof paramDef> {
|
||||
.orderBy('tag.count', 'DESC')
|
||||
.groupBy('tag.id')
|
||||
.limit(ps.limit)
|
||||
.skip(ps.offset)
|
||||
.offset(ps.offset)
|
||||
.getMany();
|
||||
|
||||
return hashtags.map(tag => tag.name);
|
||||
|
@@ -103,7 +103,7 @@ export default class extends Endpoint<typeof meta, typeof paramDef> {
|
||||
const procedures = this.twoFactorAuthenticationService.getProcedures();
|
||||
|
||||
if (!(procedures as any)[attestation.fmt]) {
|
||||
throw new Error('unsupported fmt');
|
||||
throw new Error(`unsupported fmt: ${attestation.fmt}. Supported ones: ${Object.keys(procedures)}`);
|
||||
}
|
||||
|
||||
const verificationData = (procedures as any)[attestation.fmt].verify({
|
||||
|
@@ -83,7 +83,7 @@ export default class extends Endpoint<typeof meta, typeof paramDef> {
|
||||
const polls = await query
|
||||
.orderBy('poll.noteId', 'DESC')
|
||||
.limit(ps.limit)
|
||||
.skip(ps.offset)
|
||||
.offset(ps.offset)
|
||||
.getMany();
|
||||
|
||||
if (polls.length === 0) return [];
|
||||
|
@@ -81,7 +81,7 @@ export default class extends Endpoint<typeof meta, typeof paramDef> {
|
||||
if (me) this.queryService.generateBlockQueryForUsers(query, me);
|
||||
|
||||
query.limit(ps.limit);
|
||||
query.skip(ps.offset);
|
||||
query.offset(ps.offset);
|
||||
|
||||
const users = await query.getMany();
|
||||
|
||||
|
@@ -70,7 +70,7 @@ export default class extends Endpoint<typeof meta, typeof paramDef> {
|
||||
|
||||
query.setParameters(followingQuery.getParameters());
|
||||
|
||||
const users = await query.limit(ps.limit).skip(ps.offset).getMany();
|
||||
const users = await query.limit(ps.limit).offset(ps.offset).getMany();
|
||||
|
||||
return await this.userEntityService.packMany(users, me, { detail: true });
|
||||
});
|
||||
|
@@ -75,7 +75,7 @@ export default class extends Endpoint<typeof meta, typeof paramDef> {
|
||||
users = await usernameQuery
|
||||
.orderBy('user.updatedAt', 'DESC', 'NULLS LAST')
|
||||
.limit(ps.limit)
|
||||
.skip(ps.offset)
|
||||
.offset(ps.offset)
|
||||
.getMany();
|
||||
} else {
|
||||
const nameQuery = this.usersRepository.createQueryBuilder('user')
|
||||
@@ -102,7 +102,7 @@ export default class extends Endpoint<typeof meta, typeof paramDef> {
|
||||
users = await nameQuery
|
||||
.orderBy('user.updatedAt', 'DESC', 'NULLS LAST')
|
||||
.limit(ps.limit)
|
||||
.skip(ps.offset)
|
||||
.offset(ps.offset)
|
||||
.getMany();
|
||||
|
||||
if (users.length < ps.limit) {
|
||||
@@ -128,7 +128,7 @@ export default class extends Endpoint<typeof meta, typeof paramDef> {
|
||||
users = users.concat(await query
|
||||
.orderBy('user.updatedAt', 'DESC', 'NULLS LAST')
|
||||
.limit(ps.limit)
|
||||
.skip(ps.offset)
|
||||
.offset(ps.offset)
|
||||
.getMany(),
|
||||
);
|
||||
}
|
||||
|
@@ -3,7 +3,7 @@ import { dirname } from 'node:path';
|
||||
import { fileURLToPath } from 'node:url';
|
||||
import { Inject, Injectable } from '@nestjs/common';
|
||||
import { createBullBoard } from '@bull-board/api';
|
||||
import { BullAdapter } from '@bull-board/api/bullAdapter.js';
|
||||
import { BullMQAdapter } from '@bull-board/api/bullMQAdapter.js';
|
||||
import { FastifyAdapter } from '@bull-board/fastify';
|
||||
import ms from 'ms';
|
||||
import sharp from 'sharp';
|
||||
@@ -168,7 +168,7 @@ export class ClientServerService {
|
||||
this.dbQueue,
|
||||
this.objectStorageQueue,
|
||||
this.webhookDeliverQueue,
|
||||
].map(q => new BullAdapter(q)),
|
||||
].map(q => new BullMQAdapter(q)),
|
||||
serverAdapter,
|
||||
});
|
||||
|
||||
|
@@ -16,8 +16,12 @@ block og
|
||||
meta(property='og:title' content= title)
|
||||
meta(property='og:description' content= post.description)
|
||||
meta(property='og:url' content= url)
|
||||
meta(property='og:image' content= post.files[0].thumbnailUrl)
|
||||
meta(property='twitter:card' content='summary_large_image')
|
||||
if post.isSensitive
|
||||
meta(property='og:image' content= avatarUrl)
|
||||
meta(property='twitter:card' content='summary')
|
||||
else
|
||||
meta(property='og:image' content= post.files[0].thumbnailUrl)
|
||||
meta(property='twitter:card' content='summary_large_image')
|
||||
|
||||
block meta
|
||||
if user.host || profile.noCrawle
|
||||
|
@@ -5,8 +5,8 @@ block vars
|
||||
- const title = user.name ? `${user.name} (@${user.username})` : `@${user.username}`;
|
||||
- const url = `${config.url}/notes/${note.id}`;
|
||||
- const isRenote = note.renote && note.text == null && note.fileIds.length == 0 && note.poll == null;
|
||||
- const image = (note.files || []).find(file => file.type.startsWith('image/') && !file.isSensitive)
|
||||
- const video = (note.files || []).find(file => file.type.startsWith('video/') && !file.isSensitive)
|
||||
- const images = (note.files || []).filter(file => file.type.startsWith('image/') && !file.isSensitive)
|
||||
- const videos = (note.files || []).filter(file => file.type.startsWith('video/') && !file.isSensitive)
|
||||
|
||||
block title
|
||||
= `${title} | ${instanceName}`
|
||||
@@ -19,15 +19,17 @@ block og
|
||||
meta(property='og:title' content= title)
|
||||
meta(property='og:description' content= summary)
|
||||
meta(property='og:url' content= url)
|
||||
if video
|
||||
meta(property='og:video:url' content= video.url)
|
||||
meta(property='og:video:secure_url' content= video.url)
|
||||
meta(property='og:video:type' content= video.type)
|
||||
// FIXME: add width and height
|
||||
// FIXME: add embed player for Twitter
|
||||
if image
|
||||
if videos.length
|
||||
each video in videos
|
||||
meta(property='og:video:url' content= video.url)
|
||||
meta(property='og:video:secure_url' content= video.url)
|
||||
meta(property='og:video:type' content= video.type)
|
||||
// FIXME: add width and height
|
||||
// FIXME: add embed player for Twitter
|
||||
if images.length
|
||||
meta(property='twitter:card' content='summary_large_image')
|
||||
meta(property='og:image' content= image.url)
|
||||
each image in images
|
||||
meta(property='og:image' content= image.url)
|
||||
else
|
||||
meta(property='twitter:card' content='summary')
|
||||
meta(property='og:image' content= avatarUrl)
|
||||
|
@@ -4,8 +4,9 @@
|
||||
"scripts": {
|
||||
"watch": "vite",
|
||||
"build": "vite build",
|
||||
"storybook-dev": "chokidar 'src/**/*.{mdx,ts,vue}' -d 1000 -t 1000 --initial -i '**/*.stories.ts' -c 'pkill -f node_modules/storybook/index.js; node_modules/.bin/tsc -p .storybook && node .storybook/generate.js && node .storybook/preload-locale.js && node .storybook/preload-theme.js && node_modules/.bin/storybook dev -p 6006 --ci'",
|
||||
"build-storybook": "tsc -p .storybook && node .storybook/generate.js && node .storybook/preload-locale.js && node .storybook/preload-theme.js && storybook build",
|
||||
"storybook-dev": "nodemon --verbose --watch src --ext \"mdx,ts,vue\" --ignore \"*.stories.ts\" --exec \"pnpm build-storybook-pre && pnpm exec storybook dev -p 6006 --ci\"",
|
||||
"build-storybook-pre": "tsc -p .storybook && node .storybook/generate.js && node .storybook/preload-locale.js && node .storybook/preload-theme.js",
|
||||
"build-storybook": "pnpm build-storybook-pre && storybook build",
|
||||
"chromatic": "chromatic",
|
||||
"test": "vitest --run",
|
||||
"test-and-coverage": "vitest --run --coverage",
|
||||
@@ -116,7 +117,6 @@
|
||||
"@vitest/coverage-v8": "0.33.0",
|
||||
"@vue/runtime-core": "3.3.4",
|
||||
"acorn": "8.10.0",
|
||||
"chokidar-cli": "3.0.0",
|
||||
"cross-env": "7.0.3",
|
||||
"cypress": "12.17.1",
|
||||
"eslint": "8.45.0",
|
||||
@@ -127,6 +127,7 @@
|
||||
"micromatch": "4.0.5",
|
||||
"msw": "1.2.2",
|
||||
"msw-storybook-addon": "1.8.0",
|
||||
"nodemon": "3.0.1",
|
||||
"prettier": "3.0.0",
|
||||
"react": "18.2.0",
|
||||
"react-dom": "18.2.0",
|
||||
|
@@ -19,7 +19,7 @@
|
||||
</div>
|
||||
<div v-if="file.isSensitive" :class="[$style.label, $style.red]">
|
||||
<img :class="$style.labelImg" src="/client-assets/label-red.svg"/>
|
||||
<p :class="$style.labelText">NSFW</p>
|
||||
<p :class="$style.labelText">{{ i18n.ts.sensitive }}</p>
|
||||
</div>
|
||||
|
||||
<MkDriveFileThumbnail :class="$style.thumbnail" :file="file" fit="contain"/>
|
||||
|
@@ -108,8 +108,7 @@ function waitForDecode() {
|
||||
.then(() => {
|
||||
loaded = true;
|
||||
}, error => {
|
||||
console.error('Error occurred during decoding image', img.value, error);
|
||||
throw Error(error);
|
||||
console.log('Error occurred during decoding image', img.value, error);
|
||||
});
|
||||
} else {
|
||||
loaded = false;
|
||||
|
@@ -20,7 +20,7 @@
|
||||
<template v-if="hide">
|
||||
<div :class="$style.hiddenText">
|
||||
<div :class="$style.hiddenTextWrapper">
|
||||
<b v-if="image.isSensitive" style="display: block;"><i class="ti ti-alert-triangle"></i> {{ i18n.ts.sensitive }}{{ defaultStore.state.enableDataSaverMode ? ` (${i18n.ts.image}${image.size ? ' ' + bytes(image.size) : ''})` : '' }}</b>
|
||||
<b v-if="image.isSensitive" style="display: block;"><i class="ti ti-eye-exclamation"></i> {{ i18n.ts.sensitive }}{{ defaultStore.state.enableDataSaverMode ? ` (${i18n.ts.image}${image.size ? ' ' + bytes(image.size) : ''})` : '' }}</b>
|
||||
<b v-else style="display: block;"><i class="ti ti-photo"></i> {{ defaultStore.state.enableDataSaverMode && image.size ? bytes(image.size) : i18n.ts.image }}</b>
|
||||
<span style="display: block;">{{ i18n.ts.clickToShow }}</span>
|
||||
</div>
|
||||
@@ -30,7 +30,7 @@
|
||||
<div :class="$style.indicators">
|
||||
<div v-if="['image/gif', 'image/apng'].includes(image.type)" :class="$style.indicator">GIF</div>
|
||||
<div v-if="image.comment" :class="$style.indicator">ALT</div>
|
||||
<div v-if="image.isSensitive" :class="$style.indicator" style="color: var(--warn);">NSFW</div>
|
||||
<div v-if="image.isSensitive" :class="$style.indicator" style="color: var(--warn);" :title="i18n.ts.sensitive"><i class="ti ti-eye-exclamation"></i></div>
|
||||
</div>
|
||||
<button :class="$style.menu" class="_button" @click.stop="showMenu"><i class="ti ti-dots" style="vertical-align: middle;"></i></button>
|
||||
<i class="ti ti-eye-off" :class="$style.hide" @click.stop="hide = true"></i>
|
||||
|
@@ -1,5 +1,5 @@
|
||||
<template>
|
||||
<div>
|
||||
<div ref="root">
|
||||
<XBanner v-for="media in mediaList.filter(media => !previewable(media))" :key="media.id" :media="media"/>
|
||||
<div v-if="mediaList.filter(media => previewable(media)).length > 0" :class="$style.container">
|
||||
<div
|
||||
@@ -23,7 +23,7 @@
|
||||
</template>
|
||||
|
||||
<script lang="ts" setup>
|
||||
import { onMounted, watch, shallowRef } from 'vue';
|
||||
import { onMounted, shallowRef } from 'vue';
|
||||
import * as misskey from 'misskey-js';
|
||||
import PhotoSwipeLightbox from 'photoswipe/lightbox';
|
||||
import PhotoSwipe from 'photoswipe';
|
||||
@@ -34,19 +34,26 @@ import XVideo from '@/components/MkMediaVideo.vue';
|
||||
import * as os from '@/os';
|
||||
import { FILE_TYPE_BROWSERSAFE } from '@/const';
|
||||
import { defaultStore } from '@/store';
|
||||
import { getScrollContainer, getBodyScrollHeight } from '@/scripts/scroll';
|
||||
|
||||
const props = defineProps<{
|
||||
mediaList: misskey.entities.DriveFile[];
|
||||
raw?: boolean;
|
||||
}>();
|
||||
|
||||
const root = shallowRef<HTMLDivElement>();
|
||||
const container = shallowRef<HTMLElement | null | undefined>(undefined);
|
||||
const gallery = shallowRef<HTMLDivElement>();
|
||||
const pswpZIndex = os.claimZIndex('middle');
|
||||
document.documentElement.style.setProperty('--mk-pswp-root-z-index', pswpZIndex.toString());
|
||||
const count = $computed(() => props.mediaList.filter(media => previewable(media)).length);
|
||||
|
||||
/**
|
||||
* アスペクト比をmediaListWithOneImageAppearanceに基づいていい感じに調整する
|
||||
* aspect-ratioではなくheightを使う
|
||||
*/
|
||||
function calcAspectRatio() {
|
||||
if (!gallery.value) return;
|
||||
if (!gallery.value || !root.value) return;
|
||||
|
||||
let img = props.mediaList[0];
|
||||
|
||||
@@ -55,28 +62,46 @@ function calcAspectRatio() {
|
||||
return;
|
||||
}
|
||||
|
||||
// アスペクト比上限設定では、横長の場合は高さを縮小させる
|
||||
const ratioMax = (ratio: number) => `${Math.max(ratio, img.properties.width / img.properties.height).toString()} / 1`;
|
||||
const width = gallery.value.clientWidth;
|
||||
|
||||
const heightMin = (ratio: number) => {
|
||||
const imgResizeRatio = width / img.properties.width;
|
||||
const imgDrawHeight = img.properties.height * imgResizeRatio;
|
||||
const maxHeight = width * ratio;
|
||||
const height = Math.min(imgDrawHeight, maxHeight);
|
||||
if (_DEV_) console.log('Image height calculated:', { width, properties: img.properties, imgResizeRatio, imgDrawHeight, maxHeight, height });
|
||||
return `${height}px`;
|
||||
};
|
||||
|
||||
switch (defaultStore.state.mediaListWithOneImageAppearance) {
|
||||
case '16_9':
|
||||
gallery.value.style.aspectRatio = ratioMax(16 / 9);
|
||||
gallery.value.style.height = heightMin(9 / 16);
|
||||
break;
|
||||
case '1_1':
|
||||
gallery.value.style.aspectRatio = ratioMax(1);
|
||||
gallery.value.style.height = heightMin(1);
|
||||
break;
|
||||
case '2_3':
|
||||
gallery.value.style.aspectRatio = ratioMax(2 / 3);
|
||||
gallery.value.style.height = heightMin(3 / 2);
|
||||
break;
|
||||
default:
|
||||
gallery.value.style.aspectRatio = '';
|
||||
default: {
|
||||
if (!container.value) container.value = getScrollContainer(root.value);
|
||||
const maxHeight = Math.max(64, (container.value ? container.value.clientHeight : getBodyScrollHeight()) * 0.5 || 360);
|
||||
if (width === 0 || !maxHeight) return;
|
||||
const imgResizeRatio = width / img.properties.width;
|
||||
const imgDrawHeight = img.properties.height * imgResizeRatio;
|
||||
gallery.value.style.height = `${Math.max(64, Math.min(imgDrawHeight, maxHeight))}px`;
|
||||
gallery.value.style.minHeight = 'initial';
|
||||
gallery.value.style.maxHeight = 'initial';
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
gallery.value.style.aspectRatio = 'initial';
|
||||
}
|
||||
|
||||
watch([defaultStore.reactiveState.mediaListWithOneImageAppearance, gallery], () => calcAspectRatio());
|
||||
|
||||
onMounted(() => {
|
||||
calcAspectRatio();
|
||||
|
||||
const lightbox = new PhotoSwipeLightbox({
|
||||
dataSource: props.mediaList
|
||||
.filter(media => {
|
||||
@@ -203,7 +228,7 @@ const previewable = (file: misskey.entities.DriveFile): boolean => {
|
||||
&.n1 {
|
||||
grid-template-rows: 1fr;
|
||||
|
||||
// default (expand)
|
||||
// default but fallback (expand)
|
||||
min-height: 64px;
|
||||
max-height: clamp(
|
||||
64px,
|
||||
@@ -212,20 +237,20 @@ const previewable = (file: misskey.entities.DriveFile): boolean => {
|
||||
);
|
||||
|
||||
&.n116_9 {
|
||||
min-height: none;
|
||||
max-height: none;
|
||||
min-height: initial;
|
||||
max-height: initial;
|
||||
aspect-ratio: 16 / 9; // fallback
|
||||
}
|
||||
|
||||
&.n11_1{
|
||||
min-height: none;
|
||||
max-height: none;
|
||||
min-height: initial;
|
||||
max-height: initial;
|
||||
aspect-ratio: 1 / 1; // fallback
|
||||
}
|
||||
|
||||
&.n12_3 {
|
||||
min-height: none;
|
||||
max-height: none;
|
||||
min-height: initial;
|
||||
max-height: initial;
|
||||
aspect-ratio: 2 / 3; // fallback
|
||||
}
|
||||
}
|
||||
|
@@ -431,9 +431,15 @@ defineExpose({
|
||||
margin: auto;
|
||||
padding: 32px;
|
||||
display: flex;
|
||||
// TODO: mask-imageはiOSだとやたら重い。なんとかしたい
|
||||
-webkit-mask-image: linear-gradient(0deg, rgba(0,0,0,0) 0%, rgba(0,0,0,1) 32px, rgba(0,0,0,1) calc(100% - 32px), rgba(0,0,0,0) 100%);
|
||||
mask-image: linear-gradient(0deg, rgba(0,0,0,0) 0%, rgba(0,0,0,1) 32px, rgba(0,0,0,1) calc(100% - 32px), rgba(0,0,0,0) 100%);
|
||||
overflow: auto;
|
||||
|
||||
@media (max-width: 500px) {
|
||||
padding: 16px;
|
||||
-webkit-mask-image: linear-gradient(0deg, rgba(0,0,0,0) 0%, rgba(0,0,0,1) 16px, rgba(0,0,0,1) calc(100% - 16px), rgba(0,0,0,0) 100%);
|
||||
mask-image: linear-gradient(0deg, rgba(0,0,0,0) 0%, rgba(0,0,0,1) 16px, rgba(0,0,0,1) calc(100% - 16px), rgba(0,0,0,0) 100%);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -165,6 +165,7 @@ import { getNoteSummary } from '@/scripts/get-note-summary';
|
||||
import { MenuItem } from '@/types/menu';
|
||||
import MkRippleEffect from '@/components/MkRippleEffect.vue';
|
||||
import { showMovedDialog } from '@/scripts/show-moved-dialog';
|
||||
import { shouldCollapsed } from '@/scripts/collapsed';
|
||||
|
||||
const props = defineProps<{
|
||||
note: misskey.entities.Note;
|
||||
@@ -204,17 +205,7 @@ let appearNote = $computed(() => isRenote ? note.renote as misskey.entities.Note
|
||||
const isMyRenote = $i && ($i.id === note.userId);
|
||||
const showContent = ref(false);
|
||||
const urls = appearNote.text ? extractUrlFromMfm(mfm.parse(appearNote.text)) : null;
|
||||
const isLong = (appearNote.cw == null && appearNote.text != null && (
|
||||
(appearNote.text.includes('$[x2')) ||
|
||||
(appearNote.text.includes('$[x3')) ||
|
||||
(appearNote.text.includes('$[x4')) ||
|
||||
(appearNote.text.includes('$[scale')) ||
|
||||
(appearNote.text.includes('$[position')) ||
|
||||
(appearNote.text.split('\n').length > 9) ||
|
||||
(appearNote.text.length > 500) ||
|
||||
(appearNote.files.length >= 5) ||
|
||||
(urls && urls.length >= 4)
|
||||
));
|
||||
const isLong = shouldCollapsed(appearNote);
|
||||
const collapsed = ref(appearNote.cw == null && isLong);
|
||||
const isDeleted = ref(false);
|
||||
const muted = ref(checkWordMute(appearNote, $i, defaultStore.state.mutedWords));
|
||||
|
@@ -540,7 +540,7 @@ function onCompositionEnd(ev: CompositionEvent) {
|
||||
}
|
||||
|
||||
async function onPaste(ev: ClipboardEvent) {
|
||||
for (const { item, i } of Array.from(ev.clipboardData.items).map((item, i) => ({ item, i }))) {
|
||||
for (const { item, i } of Array.from(ev.clipboardData.items, (item, i) => ({ item, i }))) {
|
||||
if (item.kind === 'file') {
|
||||
const file = item.getAsFile();
|
||||
const lio = file.name.lastIndexOf('.');
|
||||
|
@@ -5,7 +5,7 @@
|
||||
<div :class="$style.file" @click="showFileMenu(element, $event)" @contextmenu.prevent="showFileMenu(element, $event)">
|
||||
<MkDriveFileThumbnail :data-id="element.id" :class="$style.thumbnail" :file="element" fit="cover"/>
|
||||
<div v-if="element.isSensitive" :class="$style.sensitive">
|
||||
<i class="ti ti-alert-triangle" style="margin: auto;"></i>
|
||||
<i class="ti ti-eye-exclamation" style="margin: auto;"></i>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
@@ -31,16 +31,13 @@ import MkMediaList from '@/components/MkMediaList.vue';
|
||||
import MkPoll from '@/components/MkPoll.vue';
|
||||
import { i18n } from '@/i18n';
|
||||
import { $i } from '@/account';
|
||||
import { shouldCollapsed } from '@/scripts/collapsed';
|
||||
|
||||
const props = defineProps<{
|
||||
note: misskey.entities.Note;
|
||||
}>();
|
||||
|
||||
const isLong =
|
||||
props.note.cw == null && props.note.text != null && (
|
||||
(props.note.text.split('\n').length > 9) ||
|
||||
(props.note.text.length > 500)
|
||||
);
|
||||
const isLong = shouldCollapsed(props.note);
|
||||
|
||||
const collapsed = $ref(isLong);
|
||||
</script>
|
||||
|
@@ -16,8 +16,8 @@ import tinycolor from 'tinycolor2';
|
||||
const loaded = !!window.TagCanvas;
|
||||
const SAFE_FOR_HTML_ID = 'abcdefghijklmnopqrstuvwxyz';
|
||||
const computedStyle = getComputedStyle(document.documentElement);
|
||||
const idForCanvas = Array.from(Array(16)).map(() => SAFE_FOR_HTML_ID[Math.floor(Math.random() * SAFE_FOR_HTML_ID.length)]).join('');
|
||||
const idForTags = Array.from(Array(16)).map(() => SAFE_FOR_HTML_ID[Math.floor(Math.random() * SAFE_FOR_HTML_ID.length)]).join('');
|
||||
const idForCanvas = Array.from({ length: 16 }, () => SAFE_FOR_HTML_ID[Math.floor(Math.random() * SAFE_FOR_HTML_ID.length)]).join('');
|
||||
const idForTags = Array.from({ length: 16 }, () => SAFE_FOR_HTML_ID[Math.floor(Math.random() * SAFE_FOR_HTML_ID.length)]).join('');
|
||||
let available = $ref(false);
|
||||
let rootEl = $shallowRef<HTMLElement | null>(null);
|
||||
let canvasEl = $shallowRef<HTMLCanvasElement | null>(null);
|
||||
|
@@ -38,14 +38,6 @@ const prepend = note => {
|
||||
}
|
||||
};
|
||||
|
||||
const onUserAdded = () => {
|
||||
tlComponent.pagingComponent?.reload();
|
||||
};
|
||||
|
||||
const onUserRemoved = () => {
|
||||
tlComponent.pagingComponent?.reload();
|
||||
};
|
||||
|
||||
let endpoint;
|
||||
let query;
|
||||
let connection;
|
||||
@@ -125,8 +117,6 @@ if (props.src === 'antenna') {
|
||||
listId: props.list,
|
||||
});
|
||||
connection.on('note', prepend);
|
||||
connection.on('userAdded', onUserAdded);
|
||||
connection.on('userRemoved', onUserRemoved);
|
||||
} else if (props.src === 'channel') {
|
||||
endpoint = 'channels/timeline';
|
||||
query = {
|
||||
|
@@ -52,19 +52,21 @@
|
||||
</footer>
|
||||
</article>
|
||||
</component>
|
||||
<div v-if="tweetId" :class="$style.action">
|
||||
<MkButton :small="true" inline @click="tweetExpanded = true">
|
||||
<i class="ti ti-brand-twitter"></i> {{ i18n.ts.expandTweet }}
|
||||
</MkButton>
|
||||
</div>
|
||||
<div v-if="!playerEnabled && player.url" :class="$style.action">
|
||||
<MkButton :small="true" inline @click="playerEnabled = true">
|
||||
<i class="ti ti-player-play"></i> {{ i18n.ts.enablePlayer }}
|
||||
</MkButton>
|
||||
<MkButton v-if="!isMobile" :small="true" inline @click="openPlayer()">
|
||||
<i class="ti ti-picture-in-picture"></i> {{ i18n.ts.openInWindow }}
|
||||
</MkButton>
|
||||
</div>
|
||||
<template v-if="showActions">
|
||||
<div v-if="tweetId" :class="$style.action">
|
||||
<MkButton :small="true" inline @click="tweetExpanded = true">
|
||||
<i class="ti ti-brand-twitter"></i> {{ i18n.ts.expandTweet }}
|
||||
</MkButton>
|
||||
</div>
|
||||
<div v-if="!playerEnabled && player.url" :class="$style.action">
|
||||
<MkButton :small="true" inline @click="playerEnabled = true">
|
||||
<i class="ti ti-player-play"></i> {{ i18n.ts.enablePlayer }}
|
||||
</MkButton>
|
||||
<MkButton v-if="!isMobile" :small="true" inline @click="openPlayer()">
|
||||
<i class="ti ti-picture-in-picture"></i> {{ i18n.ts.openInWindow }}
|
||||
</MkButton>
|
||||
</div>
|
||||
</template>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
@@ -85,9 +87,11 @@ const props = withDefaults(defineProps<{
|
||||
url: string;
|
||||
detail?: boolean;
|
||||
compact?: boolean;
|
||||
showActions?: boolean;
|
||||
}>(), {
|
||||
detail: false,
|
||||
compact: false,
|
||||
showActions: true,
|
||||
});
|
||||
|
||||
const MOBILE_THRESHOLD = 500;
|
||||
|
@@ -1,7 +1,7 @@
|
||||
<template>
|
||||
<div :class="$style.root" :style="{ zIndex, top: top + 'px', left: left + 'px' }">
|
||||
<Transition :name="defaultStore.state.animation ? '_transition_zoom' : ''" @afterLeave="emit('closed')">
|
||||
<MkUrlPreview v-if="showing" class="_popup _shadow" :url="url"/>
|
||||
<MkUrlPreview v-if="showing" class="_popup _shadow" :url="url" :showActions="false"/>
|
||||
</Transition>
|
||||
</div>
|
||||
</template>
|
||||
|
@@ -4,6 +4,9 @@ import { userEvent, waitFor, within } from '@storybook/testing-library';
|
||||
import { StoryObj } from '@storybook/vue3';
|
||||
import MkAd from './MkAd.vue';
|
||||
import { i18n } from '@/i18n';
|
||||
|
||||
let lock: Promise<undefined> | undefined;
|
||||
|
||||
const common = {
|
||||
render(args) {
|
||||
return {
|
||||
@@ -25,41 +28,57 @@ const common = {
|
||||
template: '<MkAd v-bind="props" />',
|
||||
};
|
||||
},
|
||||
/* FIXME: disabled because it still didn’t pass after applying #11267
|
||||
async play({ canvasElement, args }) {
|
||||
const canvas = within(canvasElement);
|
||||
const a = canvas.getByRole<HTMLAnchorElement>('link');
|
||||
await expect(a.href).toMatch(/^https?:\/\/.*#test$/);
|
||||
const img = within(a).getByRole('img');
|
||||
await expect(img).toBeInTheDocument();
|
||||
let buttons = canvas.getAllByRole<HTMLButtonElement>('button');
|
||||
await expect(buttons).toHaveLength(1);
|
||||
const i = buttons[0];
|
||||
await expect(i).toBeInTheDocument();
|
||||
await userEvent.click(i);
|
||||
await waitFor(() => expect(canvasElement).toHaveTextContent(i18n.ts._ad.back));
|
||||
await expect(a).not.toBeInTheDocument();
|
||||
await expect(i).not.toBeInTheDocument();
|
||||
buttons = canvas.getAllByRole<HTMLButtonElement>('button');
|
||||
await expect(buttons).toHaveLength(args.__hasReduce ? 2 : 1);
|
||||
const reduce = args.__hasReduce ? buttons[0] : null;
|
||||
const back = buttons[args.__hasReduce ? 1 : 0];
|
||||
if (reduce) {
|
||||
await expect(reduce).toBeInTheDocument();
|
||||
await expect(reduce).toHaveTextContent(i18n.ts._ad.reduceFrequencyOfThisAd);
|
||||
if (lock) {
|
||||
console.warn('This test is unexpectedly running twice in parallel, fix it!');
|
||||
console.warn('See also: https://github.com/misskey-dev/misskey/issues/11267');
|
||||
await lock;
|
||||
}
|
||||
await expect(back).toBeInTheDocument();
|
||||
await expect(back).toHaveTextContent(i18n.ts._ad.back);
|
||||
await userEvent.click(back);
|
||||
await waitFor(() => expect(canvas.queryByRole('img')).toBeTruthy());
|
||||
if (reduce) {
|
||||
await expect(reduce).not.toBeInTheDocument();
|
||||
|
||||
let resolve: (value?: any) => void;
|
||||
lock = new Promise(r => resolve = r);
|
||||
|
||||
try {
|
||||
const canvas = within(canvasElement);
|
||||
const a = canvas.getByRole<HTMLAnchorElement>('link');
|
||||
await expect(a.href).toMatch(/^https?:\/\/.*#test$/);
|
||||
const img = within(a).getByRole('img');
|
||||
await expect(img).toBeInTheDocument();
|
||||
let buttons = canvas.getAllByRole<HTMLButtonElement>('button');
|
||||
await expect(buttons).toHaveLength(1);
|
||||
const i = buttons[0];
|
||||
await expect(i).toBeInTheDocument();
|
||||
await userEvent.click(i);
|
||||
await waitFor(() => expect(canvasElement).toHaveTextContent(i18n.ts._ad.back));
|
||||
await expect(a).not.toBeInTheDocument();
|
||||
await expect(i).not.toBeInTheDocument();
|
||||
buttons = canvas.getAllByRole<HTMLButtonElement>('button');
|
||||
await expect(buttons).toHaveLength(args.__hasReduce ? 2 : 1);
|
||||
const reduce = args.__hasReduce ? buttons[0] : null;
|
||||
const back = buttons[args.__hasReduce ? 1 : 0];
|
||||
if (reduce) {
|
||||
await expect(reduce).toBeInTheDocument();
|
||||
await expect(reduce).toHaveTextContent(i18n.ts._ad.reduceFrequencyOfThisAd);
|
||||
}
|
||||
await expect(back).toBeInTheDocument();
|
||||
await expect(back).toHaveTextContent(i18n.ts._ad.back);
|
||||
await userEvent.click(back);
|
||||
await waitFor(() => expect(canvas.queryByRole('img')).toBeTruthy());
|
||||
if (reduce) {
|
||||
await expect(reduce).not.toBeInTheDocument();
|
||||
}
|
||||
await expect(back).not.toBeInTheDocument();
|
||||
const aAgain = canvas.getByRole<HTMLAnchorElement>('link');
|
||||
await expect(aAgain).toBeInTheDocument();
|
||||
const imgAgain = within(aAgain).getByRole('img');
|
||||
await expect(imgAgain).toBeInTheDocument();
|
||||
} finally {
|
||||
resolve!();
|
||||
lock = undefined;
|
||||
}
|
||||
await expect(back).not.toBeInTheDocument();
|
||||
const aAgain = canvas.getByRole<HTMLAnchorElement>('link');
|
||||
await expect(aAgain).toBeInTheDocument();
|
||||
const imgAgain = within(aAgain).getByRole('img');
|
||||
await expect(imgAgain).toBeInTheDocument();
|
||||
},
|
||||
*/
|
||||
args: {
|
||||
prefer: [],
|
||||
specify: {
|
||||
|
@@ -32,7 +32,7 @@
|
||||
<MkUserCardMini :user="file.user"/>
|
||||
</MkA>
|
||||
<div>
|
||||
<MkSwitch v-model="isSensitive" @update:modelValue="toggleIsSensitive">NSFW</MkSwitch>
|
||||
<MkSwitch v-model="isSensitive" @update:modelValue="toggleIsSensitive">{{ i18n.ts.sensitive }}</MkSwitch>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
|
@@ -110,7 +110,7 @@ const selectAll = () => {
|
||||
if (selectedEmojis.value.length > 0) {
|
||||
selectedEmojis.value = [];
|
||||
} else {
|
||||
selectedEmojis.value = emojisPaginationComponent.value.items.map(item => item.id);
|
||||
selectedEmojis.value = Array.from(emojisPaginationComponent.value.items.values()).map(item => item.id);
|
||||
}
|
||||
};
|
||||
|
||||
|
@@ -26,7 +26,7 @@
|
||||
</div>
|
||||
</div>
|
||||
<MkButton rounded style="margin: 0 auto;" @click="changeImage">{{ i18n.ts.selectFile }}</MkButton>
|
||||
<MkInput v-model="name">
|
||||
<MkInput v-model="name" pattern="[a-z0-9_]">
|
||||
<template #label>{{ i18n.ts.name }}</template>
|
||||
</MkInput>
|
||||
<MkInput v-model="category" :datalist="customEmojiCategories">
|
||||
@@ -70,6 +70,7 @@
|
||||
|
||||
<script lang="ts" setup>
|
||||
import { computed, watch } from 'vue';
|
||||
import * as misskey from 'misskey-js';
|
||||
import MkModalWindow from '@/components/MkModalWindow.vue';
|
||||
import MkButton from '@/components/MkButton.vue';
|
||||
import MkInput from '@/components/MkInput.vue';
|
||||
@@ -95,7 +96,7 @@ let isSensitive = $ref(props.emoji ? props.emoji.isSensitive : false);
|
||||
let localOnly = $ref(props.emoji ? props.emoji.localOnly : false);
|
||||
let roleIdsThatCanBeUsedThisEmojiAsReaction = $ref(props.emoji ? props.emoji.roleIdsThatCanBeUsedThisEmojiAsReaction : []);
|
||||
let rolesThatCanBeUsedThisEmojiAsReaction = $ref([]);
|
||||
let file = $ref();
|
||||
let file = $ref<misskey.entities.DriveFile>();
|
||||
|
||||
watch($$(roleIdsThatCanBeUsedThisEmojiAsReaction), async () => {
|
||||
rolesThatCanBeUsedThisEmojiAsReaction = (await Promise.all(roleIdsThatCanBeUsedThisEmojiAsReaction.map((id) => os.api('admin/roles/show', { roleId: id }).catch(() => null)))).filter(x => x != null);
|
||||
@@ -110,6 +111,10 @@ const emit = defineEmits<{
|
||||
|
||||
async function changeImage(ev) {
|
||||
file = await selectFile(ev.currentTarget ?? ev.target, null);
|
||||
const candidate = file.name.replace(/\.(.+)$/, '');
|
||||
if (candidate.match(/^[a-z0-9_]+$/)) {
|
||||
name = candidate;
|
||||
}
|
||||
}
|
||||
|
||||
async function addRole() {
|
||||
|
@@ -258,6 +258,7 @@ watch([
|
||||
showGapBetweenNotesInTimeline,
|
||||
instanceTicker,
|
||||
overridedDeviceKind,
|
||||
mediaListWithOneImageAppearance,
|
||||
], async () => {
|
||||
await reloadAsk();
|
||||
});
|
||||
|
19
packages/frontend/src/scripts/collapsed.ts
Normal file
19
packages/frontend/src/scripts/collapsed.ts
Normal file
@@ -0,0 +1,19 @@
|
||||
import * as mfm from 'mfm-js';
|
||||
import * as misskey from 'misskey-js';
|
||||
import { extractUrlFromMfm } from './extract-url-from-mfm';
|
||||
|
||||
export function shouldCollapsed(note: misskey.entities.Note): boolean {
|
||||
const urls = note.text ? extractUrlFromMfm(mfm.parse(note.text)) : null;
|
||||
const collapsed = note.cw == null && note.text != null && (
|
||||
(note.text.includes('$[x2')) ||
|
||||
(note.text.includes('$[x3')) ||
|
||||
(note.text.includes('$[x4')) ||
|
||||
(note.text.includes('$[scale')) ||
|
||||
(note.text.split('\n').length > 9) ||
|
||||
(note.text.length > 500) ||
|
||||
(note.files.length >= 5) ||
|
||||
(!!urls && urls.length >= 4)
|
||||
);
|
||||
|
||||
return collapsed;
|
||||
}
|
@@ -2,7 +2,7 @@ const twemojiSvgBase = '/twemoji';
|
||||
const fluentEmojiPngBase = '/fluent-emoji';
|
||||
|
||||
export function char2twemojiFilePath(char: string): string {
|
||||
let codes = Array.from(char).map(x => x.codePointAt(0)?.toString(16));
|
||||
let codes = Array.from(char, x => x.codePointAt(0)?.toString(16));
|
||||
if (!codes.includes('200d')) codes = codes.filter(x => x !== 'fe0f');
|
||||
codes = codes.filter(x => x && x.length);
|
||||
const fileName = codes.join('-');
|
||||
@@ -10,7 +10,7 @@ export function char2twemojiFilePath(char: string): string {
|
||||
}
|
||||
|
||||
export function char2fluentEmojiFilePath(char: string): string {
|
||||
let codes = Array.from(char).map(x => x.codePointAt(0)?.toString(16));
|
||||
let codes = Array.from(char, x => x.codePointAt(0)?.toString(16));
|
||||
// Fluent Emojiは国旗非対応 https://github.com/microsoft/fluentui-emoji/issues/25
|
||||
if (codes[0]?.startsWith('1f1')) return char2twemojiFilePath(char);
|
||||
if (!codes.includes('200d')) codes = codes.filter(x => x !== 'fe0f');
|
||||
|
@@ -1,3 +1,20 @@
|
||||
const requestIdleCallback: typeof globalThis.requestIdleCallback = globalThis.requestIdleCallback ?? ((callback) => {
|
||||
const start = performance.now();
|
||||
const timeoutId = setTimeout(() => {
|
||||
callback({
|
||||
didTimeout: false, // polyfill でタイムアウト発火することはない
|
||||
timeRemaining() {
|
||||
const diff = performance.now() - start;
|
||||
return Math.max(0, 50 - diff); // <https://www.w3.org/TR/requestidlecallback/#idle-periods>
|
||||
},
|
||||
});
|
||||
});
|
||||
return timeoutId;
|
||||
});
|
||||
const cancelIdleCallback: typeof globalThis.cancelIdleCallback = globalThis.cancelIdleCallback ?? ((timeoutId) => {
|
||||
clearTimeout(timeoutId);
|
||||
});
|
||||
|
||||
class IdlingRenderScheduler {
|
||||
#renderers: Set<FrameRequestCallback>;
|
||||
#rafId: number;
|
||||
|
@@ -12,7 +12,8 @@ export function chooseFileFromPc(multiple: boolean, keepOriginal = false): Promi
|
||||
input.type = 'file';
|
||||
input.multiple = multiple;
|
||||
input.onchange = () => {
|
||||
const promises = Array.from(input.files).map(file => uploadFile(file, defaultStore.state.uploadFolder, undefined, keepOriginal));
|
||||
if (!input.files) return res([]);
|
||||
const promises = Array.from(input.files, file => uploadFile(file, defaultStore.state.uploadFolder, undefined, keepOriginal));
|
||||
|
||||
Promise.all(promises).then(driveFiles => {
|
||||
res(driveFiles);
|
||||
|
@@ -6,11 +6,13 @@
|
||||
--marginHalf: 10px;
|
||||
|
||||
--margin: var(--marginFull);
|
||||
--minBottomSpacing: 0px;
|
||||
|
||||
// switch dynamically
|
||||
--minBottomSpacingMobile: calc(72px + max(12px, env(safe-area-inset-bottom, 0px)));
|
||||
--minBottomSpacing: var(--minBottomSpacingMobile);
|
||||
|
||||
@media (max-width: 500px) {
|
||||
--margin: var(--marginHalf);
|
||||
--minBottomSpacing: calc(72px + max(12px, env(safe-area-inset-bottom, 0px)));
|
||||
}
|
||||
|
||||
//--ad: rgb(255 169 0 / 10%);
|
||||
|
@@ -207,9 +207,11 @@ watch($$(navFooter), () => {
|
||||
if (navFooter) {
|
||||
navFooterHeight = navFooter.offsetHeight;
|
||||
document.body.style.setProperty('--stickyBottom', `${navFooterHeight}px`);
|
||||
document.body.style.setProperty('--minBottomSpacing', 'var(--minBottomSpacingMobile)');
|
||||
} else {
|
||||
navFooterHeight = 0;
|
||||
document.body.style.setProperty('--stickyBottom', '0px');
|
||||
document.body.style.setProperty('--minBottomSpacing', '0px');
|
||||
}
|
||||
}, {
|
||||
immediate: true,
|
||||
|
246
pnpm-lock.yaml
generated
246
pnpm-lock.yaml
generated
@@ -368,9 +368,6 @@ importers:
|
||||
ulid:
|
||||
specifier: 2.3.0
|
||||
version: 2.3.0
|
||||
unzipper:
|
||||
specifier: 0.10.14
|
||||
version: 0.10.14
|
||||
vary:
|
||||
specifier: 1.1.2
|
||||
version: 1.1.2
|
||||
@@ -565,9 +562,6 @@ importers:
|
||||
'@types/tmp':
|
||||
specifier: 0.2.3
|
||||
version: 0.2.3
|
||||
'@types/unzipper':
|
||||
specifier: 0.10.6
|
||||
version: 0.10.6
|
||||
'@types/vary':
|
||||
specifier: 1.1.0
|
||||
version: 1.1.0
|
||||
@@ -908,9 +902,6 @@ importers:
|
||||
acorn:
|
||||
specifier: 8.10.0
|
||||
version: 8.10.0
|
||||
chokidar-cli:
|
||||
specifier: 3.0.0
|
||||
version: 3.0.0
|
||||
cross-env:
|
||||
specifier: 7.0.3
|
||||
version: 7.0.3
|
||||
@@ -941,6 +932,9 @@ importers:
|
||||
msw-storybook-addon:
|
||||
specifier: 1.8.0
|
||||
version: 1.8.0(msw@1.2.2)
|
||||
nodemon:
|
||||
specifier: 3.0.1
|
||||
version: 3.0.1
|
||||
prettier:
|
||||
specifier: 3.0.0
|
||||
version: 3.0.0
|
||||
@@ -8381,12 +8375,6 @@ packages:
|
||||
resolution: {integrity: sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==}
|
||||
dev: true
|
||||
|
||||
/@types/unzipper@0.10.6:
|
||||
resolution: {integrity: sha512-zcBj329AHgKLQyz209N/S9R0GZqXSkUQO4tJSYE3x02qg4JuDFpgKMj50r82Erk1natCWQDIvSccDddt7jPzjA==}
|
||||
dependencies:
|
||||
'@types/node': 20.4.2
|
||||
dev: true
|
||||
|
||||
/@types/uuid@9.0.2:
|
||||
resolution: {integrity: sha512-kNnC1GFBLuhImSnV7w4njQkUiJi0ZXUycu1rUaouPqiKlXkh77JKgdRnTAp1x5eBwcIwbtI+3otwzuIDEuDoxQ==}
|
||||
dev: true
|
||||
@@ -9048,11 +9036,6 @@ packages:
|
||||
engines: {node: '>=0.10.0'}
|
||||
dev: false
|
||||
|
||||
/ansi-regex@4.1.1:
|
||||
resolution: {integrity: sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==}
|
||||
engines: {node: '>=6'}
|
||||
dev: true
|
||||
|
||||
/ansi-regex@5.0.1:
|
||||
resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==}
|
||||
engines: {node: '>=8'}
|
||||
@@ -9731,6 +9714,7 @@ packages:
|
||||
/big-integer@1.6.51:
|
||||
resolution: {integrity: sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==}
|
||||
engines: {node: '>=0.6'}
|
||||
dev: true
|
||||
|
||||
/bin-check@4.1.0:
|
||||
resolution: {integrity: sha512-b6weQyEUKsDGFlACWSIOfveEnImkJyK/FGW6FAG42loyoquvjdtOIqO6yBFzHyqyVVhNgNkQxxx09SFLK28YnA==}
|
||||
@@ -9761,13 +9745,6 @@ packages:
|
||||
resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==}
|
||||
engines: {node: '>=8'}
|
||||
|
||||
/binary@0.3.0:
|
||||
resolution: {integrity: sha512-D4H1y5KYwpJgK8wk1Cue5LLPgmwHKYSChkbspQg5JtVuR5ulGckxfR62H3AE9UDkdMC8yyXlqYihuz3Aqg2XZg==}
|
||||
dependencies:
|
||||
buffers: 0.1.1
|
||||
chainsaw: 0.1.0
|
||||
dev: false
|
||||
|
||||
/binaryextensions@2.3.0:
|
||||
resolution: {integrity: sha512-nAihlQsYGyc5Bwq6+EsubvANYGExeJKHDO3RjnvwU042fawQTQfM3Kxn7IHUXQOz4bzfwsGYYHGSvXyW4zOGLg==}
|
||||
engines: {node: '>=0.8'}
|
||||
@@ -9784,10 +9761,6 @@ packages:
|
||||
resolution: {integrity: sha512-T7JQa+zsXXEa6/8ZhHcQEW1UFfVM49Ts65uBkFL6fz2QmrElqmbajIDJvuA0tEhRe5eIjpV9ZF+0RfZR9voJFQ==}
|
||||
dev: true
|
||||
|
||||
/bluebird@3.4.7:
|
||||
resolution: {integrity: sha512-iD3898SR7sWVRHbiQv+sHUtHnMvC1o3nW5rAcqnq3uOn07DSAppZYUkIGslDz6gXC7HfunPe7YVBgoEJASPcHA==}
|
||||
dev: false
|
||||
|
||||
/bluebird@3.7.2:
|
||||
resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==}
|
||||
dev: true
|
||||
@@ -9930,11 +9903,6 @@ packages:
|
||||
/buffer-from@1.1.2:
|
||||
resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==}
|
||||
|
||||
/buffer-indexof-polyfill@1.0.2:
|
||||
resolution: {integrity: sha512-I7wzHwA3t1/lwXQh+A5PbNvJxgfo5r3xulgpYDB5zckTu/Z9oUK9biouBKQUjEqzaz3HnAT6TYoovmE+GqSf7A==}
|
||||
engines: {node: '>=0.10'}
|
||||
dev: false
|
||||
|
||||
/buffer-writer@2.0.0:
|
||||
resolution: {integrity: sha512-a7ZpuTZU1TRtnwyCNW3I5dc0wWNC3VR9S++Ewyk2HHZdrO3CQJqSpd+95Us590V6AL7JqUAH2IwZ/398PmNFgw==}
|
||||
engines: {node: '>=4'}
|
||||
@@ -9960,11 +9928,6 @@ packages:
|
||||
ieee754: 1.2.1
|
||||
dev: false
|
||||
|
||||
/buffers@0.1.1:
|
||||
resolution: {integrity: sha512-9q/rDEGSb/Qsvv2qvzIzdluL5k7AaJOTrw23z9reQthrbF7is4CtlT0DXyO1oei2DCp4uojjzQ7igaSHp1kAEQ==}
|
||||
engines: {node: '>=0.2.0'}
|
||||
dev: false
|
||||
|
||||
/bufferutil@4.0.7:
|
||||
resolution: {integrity: sha512-kukuqc39WOHtdxtw4UScxF/WVnMFVSQVKhtx3AjZJzhd0RGZZldcrfSEbVsWWe6KNH253574cq5F+wpv0G9pJw==}
|
||||
engines: {node: '>=6.14.2'}
|
||||
@@ -10185,12 +10148,6 @@ packages:
|
||||
type-detect: 4.0.8
|
||||
dev: true
|
||||
|
||||
/chainsaw@0.1.0:
|
||||
resolution: {integrity: sha512-75kWfWt6MEKNC8xYXIdRpDehRYY/tNSgwKaJq+dbbDcxORuVrrQ+SEHoWsniVn9XPYfP4gmdWIeDk/4YNp1rNQ==}
|
||||
dependencies:
|
||||
traverse: 0.3.9
|
||||
dev: false
|
||||
|
||||
/chalk-template@1.1.0:
|
||||
resolution: {integrity: sha512-T2VJbcDuZQ0Tb2EWwSotMPJjgpy1/tGee1BTpUNsGZ/qgNjV2t7Mvu+d4600U564nbLesN1x2dPL+xii174Ekg==}
|
||||
engines: {node: '>=14.16'}
|
||||
@@ -10344,17 +10301,6 @@ packages:
|
||||
parse5: 7.1.2
|
||||
parse5-htmlparser2-tree-adapter: 7.0.0
|
||||
|
||||
/chokidar-cli@3.0.0:
|
||||
resolution: {integrity: sha512-xVW+Qeh7z15uZRxHOkP93Ux8A0xbPzwK4GaqD8dQOYc34TlkqUhVSS59fK36DOp5WdJlrRzlYSy02Ht99FjZqQ==}
|
||||
engines: {node: '>= 8.10.0'}
|
||||
hasBin: true
|
||||
dependencies:
|
||||
chokidar: 3.5.3
|
||||
lodash.debounce: 4.0.8
|
||||
lodash.throttle: 4.1.1
|
||||
yargs: 13.3.2
|
||||
dev: true
|
||||
|
||||
/chokidar@3.5.3:
|
||||
resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==}
|
||||
engines: {node: '>= 8.10.0'}
|
||||
@@ -10465,14 +10411,6 @@ packages:
|
||||
wrap-ansi: 2.1.0
|
||||
dev: false
|
||||
|
||||
/cliui@5.0.0:
|
||||
resolution: {integrity: sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==}
|
||||
dependencies:
|
||||
string-width: 3.1.0
|
||||
strip-ansi: 5.2.0
|
||||
wrap-ansi: 5.1.0
|
||||
dev: true
|
||||
|
||||
/cliui@6.0.0:
|
||||
resolution: {integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==}
|
||||
dependencies:
|
||||
@@ -11081,6 +11019,17 @@ packages:
|
||||
dependencies:
|
||||
ms: 2.0.0
|
||||
|
||||
/debug@3.2.7(supports-color@5.5.0):
|
||||
resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==}
|
||||
peerDependencies:
|
||||
supports-color: '*'
|
||||
peerDependenciesMeta:
|
||||
supports-color:
|
||||
optional: true
|
||||
dependencies:
|
||||
ms: 2.1.3
|
||||
supports-color: 5.5.0
|
||||
|
||||
/debug@3.2.7(supports-color@8.1.1):
|
||||
resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==}
|
||||
peerDependencies:
|
||||
@@ -11091,6 +11040,7 @@ packages:
|
||||
dependencies:
|
||||
ms: 2.1.3
|
||||
supports-color: 8.1.1
|
||||
dev: true
|
||||
|
||||
/debug@4.3.4(supports-color@8.1.1):
|
||||
resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==}
|
||||
@@ -11446,12 +11396,6 @@ packages:
|
||||
resolution: {integrity: sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==}
|
||||
engines: {node: '>=12'}
|
||||
|
||||
/duplexer2@0.1.4:
|
||||
resolution: {integrity: sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==}
|
||||
dependencies:
|
||||
readable-stream: 2.3.7
|
||||
dev: false
|
||||
|
||||
/duplexer@0.1.2:
|
||||
resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==}
|
||||
dev: true
|
||||
@@ -11516,10 +11460,6 @@ packages:
|
||||
engines: {node: '>=12'}
|
||||
dev: true
|
||||
|
||||
/emoji-regex@7.0.3:
|
||||
resolution: {integrity: sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==}
|
||||
dev: true
|
||||
|
||||
/emoji-regex@8.0.0:
|
||||
resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==}
|
||||
|
||||
@@ -11829,7 +11769,7 @@ packages:
|
||||
/eslint-import-resolver-node@0.3.7:
|
||||
resolution: {integrity: sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA==}
|
||||
dependencies:
|
||||
debug: 3.2.7(supports-color@8.1.1)
|
||||
debug: 3.2.7(supports-color@5.5.0)
|
||||
is-core-module: 2.11.0
|
||||
resolve: 1.22.1
|
||||
transitivePeerDependencies:
|
||||
@@ -11858,7 +11798,7 @@ packages:
|
||||
optional: true
|
||||
dependencies:
|
||||
'@typescript-eslint/parser': 5.61.0(eslint@8.45.0)(typescript@5.1.6)
|
||||
debug: 3.2.7(supports-color@8.1.1)
|
||||
debug: 3.2.7(supports-color@5.5.0)
|
||||
eslint: 8.45.0
|
||||
eslint-import-resolver-node: 0.3.7
|
||||
transitivePeerDependencies:
|
||||
@@ -11879,7 +11819,7 @@ packages:
|
||||
array-includes: 3.1.6
|
||||
array.prototype.flat: 1.3.1
|
||||
array.prototype.flatmap: 1.3.1
|
||||
debug: 3.2.7(supports-color@8.1.1)
|
||||
debug: 3.2.7(supports-color@5.5.0)
|
||||
doctrine: 2.1.0
|
||||
eslint: 8.45.0
|
||||
eslint-import-resolver-node: 0.3.7
|
||||
@@ -12921,16 +12861,6 @@ packages:
|
||||
requiresBuild: true
|
||||
optional: true
|
||||
|
||||
/fstream@1.0.12:
|
||||
resolution: {integrity: sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==}
|
||||
engines: {node: '>=0.6'}
|
||||
dependencies:
|
||||
graceful-fs: 4.2.11
|
||||
inherits: 2.0.4
|
||||
mkdirp: 0.5.6
|
||||
rimraf: 2.7.1
|
||||
dev: false
|
||||
|
||||
/function-bind@1.1.1:
|
||||
resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==}
|
||||
|
||||
@@ -13498,7 +13428,6 @@ packages:
|
||||
/has-flag@3.0.0:
|
||||
resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==}
|
||||
engines: {node: '>=4'}
|
||||
dev: true
|
||||
|
||||
/has-flag@4.0.0:
|
||||
resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==}
|
||||
@@ -13715,7 +13644,7 @@ packages:
|
||||
engines: {node: '>= 4.5.0'}
|
||||
dependencies:
|
||||
agent-base: 4.3.0
|
||||
debug: 3.2.7(supports-color@8.1.1)
|
||||
debug: 3.2.7(supports-color@5.5.0)
|
||||
transitivePeerDependencies:
|
||||
- supports-color
|
||||
dev: false
|
||||
@@ -13788,6 +13717,10 @@ packages:
|
||||
/ieee754@1.2.1:
|
||||
resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==}
|
||||
|
||||
/ignore-by-default@1.0.1:
|
||||
resolution: {integrity: sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==}
|
||||
dev: true
|
||||
|
||||
/ignore@5.2.4:
|
||||
resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==}
|
||||
engines: {node: '>= 4'}
|
||||
@@ -14143,11 +14076,6 @@ packages:
|
||||
number-is-nan: 1.0.1
|
||||
dev: false
|
||||
|
||||
/is-fullwidth-code-point@2.0.0:
|
||||
resolution: {integrity: sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==}
|
||||
engines: {node: '>=4'}
|
||||
dev: true
|
||||
|
||||
/is-fullwidth-code-point@3.0.0:
|
||||
resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==}
|
||||
engines: {node: '>=8'}
|
||||
@@ -15466,10 +15394,6 @@ packages:
|
||||
resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==}
|
||||
dev: true
|
||||
|
||||
/listenercount@1.0.1:
|
||||
resolution: {integrity: sha512-3mk/Zag0+IJxeDrxSgaDPy4zZ3w05PRZeJNnlWhzFz5OkX49J4krc+A8X2d2M69vGMBEX0uyl8M+W+8gH+kBqQ==}
|
||||
dev: false
|
||||
|
||||
/listr2@3.14.0(enquirer@2.3.6):
|
||||
resolution: {integrity: sha512-TyWI8G99GX9GjE54cJ+RrNMcIFBfwMPxc3XTFiAYGN4s10hWROGtOg7+O6u6LE3mNkyld7RSLE6nrKBvTfcs3g==}
|
||||
engines: {node: '>=10.0.0'}
|
||||
@@ -15569,10 +15493,6 @@ packages:
|
||||
resolution: {integrity: sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==}
|
||||
dev: true
|
||||
|
||||
/lodash.throttle@4.1.1:
|
||||
resolution: {integrity: sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==}
|
||||
dev: true
|
||||
|
||||
/lodash.union@4.6.0:
|
||||
resolution: {integrity: sha512-c4pB2CdGrGdjMKYLA+XiRDO7Y0PRQbm/Gzg8qMj+QH+pFVAoTp5sBpO0odL3FjoPCGjK96p6qsP+yQoiLoOBcw==}
|
||||
dev: false
|
||||
@@ -16318,7 +16238,7 @@ packages:
|
||||
resolution: {integrity: sha512-6R9fqJ5Zcmf+uYaFgdIHmLwNldn5HbK8L5ybn7Uz+ylX/rnOsSp1AHcvQSrCaFN+qNM1wpymHqD7mVasEOlHGQ==}
|
||||
engines: {node: '>= 4.4.x'}
|
||||
dependencies:
|
||||
debug: 3.2.7(supports-color@8.1.1)
|
||||
debug: 3.2.7(supports-color@5.5.0)
|
||||
iconv-lite: 0.4.24
|
||||
sax: 1.2.4
|
||||
transitivePeerDependencies:
|
||||
@@ -16461,10 +16381,34 @@ packages:
|
||||
engines: {node: '>=6.0.0'}
|
||||
dev: false
|
||||
|
||||
/nodemon@3.0.1:
|
||||
resolution: {integrity: sha512-g9AZ7HmkhQkqXkRc20w+ZfQ73cHLbE8hnPbtaFbFtCumZsjyMhKk9LajQ07U5Ux28lvFjZ5X7HvWR1xzU8jHVw==}
|
||||
engines: {node: '>=10'}
|
||||
hasBin: true
|
||||
dependencies:
|
||||
chokidar: 3.5.3
|
||||
debug: 3.2.7(supports-color@5.5.0)
|
||||
ignore-by-default: 1.0.1
|
||||
minimatch: 3.1.2
|
||||
pstree.remy: 1.1.8
|
||||
semver: 7.5.4
|
||||
simple-update-notifier: 2.0.0
|
||||
supports-color: 5.5.0
|
||||
touch: 3.1.0
|
||||
undefsafe: 2.0.5
|
||||
dev: true
|
||||
|
||||
/nofilter@3.1.0:
|
||||
resolution: {integrity: sha512-l2NNj07e9afPnhAhvgVrCD/oy2Ai1yfLpuo3EpiO1jFTsB4sFz6oIfAfSZyQzVpkZQ9xS8ZS5g1jCBgq4Hwo0g==}
|
||||
engines: {node: '>=12.19'}
|
||||
|
||||
/nopt@1.0.10:
|
||||
resolution: {integrity: sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==}
|
||||
hasBin: true
|
||||
dependencies:
|
||||
abbrev: 1.1.1
|
||||
dev: true
|
||||
|
||||
/nopt@5.0.0:
|
||||
resolution: {integrity: sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==}
|
||||
engines: {node: '>=6'}
|
||||
@@ -17869,6 +17813,10 @@ packages:
|
||||
/psl@1.9.0:
|
||||
resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==}
|
||||
|
||||
/pstree.remy@1.1.8:
|
||||
resolution: {integrity: sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==}
|
||||
dev: true
|
||||
|
||||
/pug-attrs@3.0.0:
|
||||
resolution: {integrity: sha512-azINV9dUtzPMFQktvTXciNAfAuVh/L/JCl0vtPCwvOA21uZrC08K/UnmrL+SXGEVc1FwzjW62+xw5S/uaLj6cA==}
|
||||
dependencies:
|
||||
@@ -18631,6 +18579,7 @@ packages:
|
||||
|
||||
/require-main-filename@2.0.0:
|
||||
resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==}
|
||||
dev: false
|
||||
|
||||
/requires-port@1.0.0:
|
||||
resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==}
|
||||
@@ -19126,6 +19075,13 @@ packages:
|
||||
semver: 7.0.0
|
||||
dev: true
|
||||
|
||||
/simple-update-notifier@2.0.0:
|
||||
resolution: {integrity: sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==}
|
||||
engines: {node: '>=10'}
|
||||
dependencies:
|
||||
semver: 7.5.4
|
||||
dev: true
|
||||
|
||||
/sinon@14.0.2:
|
||||
resolution: {integrity: sha512-PDpV0ZI3ZCS3pEqx0vpNp6kzPhHrLx72wA0G+ZLaaJjLIYeE0n8INlgaohKuGy7hP0as5tbUd23QWu5U233t+w==}
|
||||
dependencies:
|
||||
@@ -19652,15 +19608,6 @@ packages:
|
||||
strip-ansi: 3.0.1
|
||||
dev: false
|
||||
|
||||
/string-width@3.1.0:
|
||||
resolution: {integrity: sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==}
|
||||
engines: {node: '>=6'}
|
||||
dependencies:
|
||||
emoji-regex: 7.0.3
|
||||
is-fullwidth-code-point: 2.0.0
|
||||
strip-ansi: 5.2.0
|
||||
dev: true
|
||||
|
||||
/string-width@4.2.3:
|
||||
resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==}
|
||||
engines: {node: '>=8'}
|
||||
@@ -19721,13 +19668,6 @@ packages:
|
||||
ansi-regex: 2.1.1
|
||||
dev: false
|
||||
|
||||
/strip-ansi@5.2.0:
|
||||
resolution: {integrity: sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==}
|
||||
engines: {node: '>=6'}
|
||||
dependencies:
|
||||
ansi-regex: 4.1.1
|
||||
dev: true
|
||||
|
||||
/strip-ansi@6.0.1:
|
||||
resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==}
|
||||
engines: {node: '>=8'}
|
||||
@@ -19826,7 +19766,6 @@ packages:
|
||||
engines: {node: '>=4'}
|
||||
dependencies:
|
||||
has-flag: 3.0.0
|
||||
dev: true
|
||||
|
||||
/supports-color@7.2.0:
|
||||
resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==}
|
||||
@@ -20194,6 +20133,13 @@ packages:
|
||||
ieee754: 1.2.1
|
||||
dev: false
|
||||
|
||||
/touch@3.1.0:
|
||||
resolution: {integrity: sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==}
|
||||
hasBin: true
|
||||
dependencies:
|
||||
nopt: 1.0.10
|
||||
dev: true
|
||||
|
||||
/tough-cookie@2.5.0:
|
||||
resolution: {integrity: sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==}
|
||||
engines: {node: '>=0.8'}
|
||||
@@ -20224,10 +20170,6 @@ packages:
|
||||
/trace-redirect@1.0.6:
|
||||
resolution: {integrity: sha512-UUfa1DjjU5flcjMdaFIiIEGDTyu2y/IiMjOX4uGXa7meKBS4vD4f2Uy/tken9Qkd4Jsm4sRsfZcIIPqrRVF3Mg==}
|
||||
|
||||
/traverse@0.3.9:
|
||||
resolution: {integrity: sha512-iawgk0hLP3SxGKDfnDJf8wTz4p2qImnyihM5Hh/sGvQ3K37dPi/w8sRhdNIxYA1TwFwc5mDhIJq+O0RsvXBKdQ==}
|
||||
dev: false
|
||||
|
||||
/trim-newlines@3.0.1:
|
||||
resolution: {integrity: sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==}
|
||||
engines: {node: '>=8'}
|
||||
@@ -20526,6 +20468,10 @@ packages:
|
||||
engines: {node: '>=0.10.0'}
|
||||
dev: false
|
||||
|
||||
/undefsafe@2.0.5:
|
||||
resolution: {integrity: sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==}
|
||||
dev: true
|
||||
|
||||
/undertaker-registry@1.0.1:
|
||||
resolution: {integrity: sha512-UR1khWeAjugW3548EfQmL9Z7pGMlBgXteQpr1IZeZBtnkCJQJIJ1Scj0mb9wQaPvUZ9Q17XqW6TIaPchJkyfqw==}
|
||||
engines: {node: '>= 0.10'}
|
||||
@@ -20700,21 +20646,6 @@ packages:
|
||||
engines: {node: '>=8'}
|
||||
dev: true
|
||||
|
||||
/unzipper@0.10.14:
|
||||
resolution: {integrity: sha512-ti4wZj+0bQTiX2KmKWuwj7lhV+2n//uXEotUmGuQqrbVZSEGFMbI68+c6JCQ8aAmUWYvtHEz2A8K6wXvueR/6g==}
|
||||
dependencies:
|
||||
big-integer: 1.6.51
|
||||
binary: 0.3.0
|
||||
bluebird: 3.4.7
|
||||
buffer-indexof-polyfill: 1.0.2
|
||||
duplexer2: 0.1.4
|
||||
fstream: 1.0.12
|
||||
graceful-fs: 4.2.11
|
||||
listenercount: 1.0.1
|
||||
readable-stream: 2.3.7
|
||||
setimmediate: 1.0.5
|
||||
dev: false
|
||||
|
||||
/update-browserslist-db@1.0.11(browserslist@4.21.9):
|
||||
resolution: {integrity: sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==}
|
||||
hasBin: true
|
||||
@@ -21285,6 +21216,7 @@ packages:
|
||||
|
||||
/which-module@2.0.0:
|
||||
resolution: {integrity: sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==}
|
||||
dev: false
|
||||
|
||||
/which-typed-array@1.1.9:
|
||||
resolution: {integrity: sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==}
|
||||
@@ -21352,15 +21284,6 @@ packages:
|
||||
strip-ansi: 3.0.1
|
||||
dev: false
|
||||
|
||||
/wrap-ansi@5.1.0:
|
||||
resolution: {integrity: sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==}
|
||||
engines: {node: '>=6'}
|
||||
dependencies:
|
||||
ansi-styles: 3.2.1
|
||||
string-width: 3.1.0
|
||||
strip-ansi: 5.2.0
|
||||
dev: true
|
||||
|
||||
/wrap-ansi@6.2.0:
|
||||
resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==}
|
||||
engines: {node: '>=8'}
|
||||
@@ -21475,6 +21398,7 @@ packages:
|
||||
|
||||
/y18n@4.0.3:
|
||||
resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==}
|
||||
dev: false
|
||||
|
||||
/y18n@5.0.8:
|
||||
resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==}
|
||||
@@ -21494,13 +21418,6 @@ packages:
|
||||
engines: {node: '>= 14'}
|
||||
dev: false
|
||||
|
||||
/yargs-parser@13.1.2:
|
||||
resolution: {integrity: sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==}
|
||||
dependencies:
|
||||
camelcase: 5.3.1
|
||||
decamelize: 1.2.0
|
||||
dev: true
|
||||
|
||||
/yargs-parser@18.1.3:
|
||||
resolution: {integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==}
|
||||
engines: {node: '>=6'}
|
||||
@@ -21524,21 +21441,6 @@ packages:
|
||||
object.assign: 4.1.4
|
||||
dev: false
|
||||
|
||||
/yargs@13.3.2:
|
||||
resolution: {integrity: sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==}
|
||||
dependencies:
|
||||
cliui: 5.0.0
|
||||
find-up: 3.0.0
|
||||
get-caller-file: 2.0.5
|
||||
require-directory: 2.1.1
|
||||
require-main-filename: 2.0.0
|
||||
set-blocking: 2.0.0
|
||||
string-width: 3.1.0
|
||||
which-module: 2.0.0
|
||||
y18n: 4.0.3
|
||||
yargs-parser: 13.1.2
|
||||
dev: true
|
||||
|
||||
/yargs@15.4.1:
|
||||
resolution: {integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==}
|
||||
engines: {node: '>=8'}
|
||||
|
Reference in New Issue
Block a user