Merge pull request 'develop' (#9032) from develop into main

Reviewed-on: https://codeberg.org/thatonecalculator/calckey/pulls/9032
This commit is contained in:
Kainoa Kanter 2022-09-14 06:43:13 +02:00
commit 6141fc17e8
392 changed files with 4963 additions and 2852 deletions

View File

@ -138,9 +138,6 @@ id: 'aid'
# Proxy remote files (default: false) # Proxy remote files (default: false)
#proxyRemoteFiles: true #proxyRemoteFiles: true
# Sign to ActivityPub GET request (default: false)
#signToActivityPubGet: true
#allowedPrivateNetworks: [ #allowedPrivateNetworks: [
# '127.0.0.1/32' # '127.0.0.1/32'
#] #]

3
.gitignore vendored
View File

@ -24,6 +24,9 @@ packages/sw/.yarn/cache
cypress/screenshots cypress/screenshots
cypress/videos cypress/videos
# Coverage
coverage
# config # config
/.config/* /.config/*
!/.config/example.yml !/.config/example.yml

View File

@ -15,6 +15,9 @@ packageExtensions:
chartjs-adapter-date-fns@*: chartjs-adapter-date-fns@*:
peerDependencies: peerDependencies:
date-fns: "*" date-fns: "*"
swiper@*:
peerDependencies:
vue: "*"
consolidate@*: consolidate@*:
dependencies: dependencies:
ejs: "*" ejs: "*"

View File

@ -3,10 +3,10 @@
## Planned ## Planned
- MFM button - MFM button
- Make more of the post clickable like every other SNS
- Better Messaging UI
- Classic mode make instance icon bring up new context menu - Classic mode make instance icon bring up new context menu
- Like/star button - Like/star button
- Backfill remote users
- User "choices" (recommended users) like Mastodon and Soapbox
- Option to publicize instance blocks - Option to publicize instance blocks
- Better intro/onboarding - Better intro/onboarding
- Fully revamp non-logged-in screen - Fully revamp non-logged-in screen
@ -21,8 +21,12 @@
## Work in progress ## Work in progress
- Better Messaging UI
- Videos can be played in DMs
- Make your password hasn't been pwned
- OCR image captioning - OCR image captioning
- Admin custom CSS - Admin custom CSS
- Add back time machine (jump to date)
- Improve accesibility score - Improve accesibility score
<details><summary>Current Misskey score is 57/100</summary> <details><summary>Current Misskey score is 57/100</summary>
@ -34,36 +38,51 @@
- Yarn 3 - Yarn 3
- Fix Dockerfile @hanna - Fix Dockerfile @hanna
- Upgrade packages with security vunrabilities
- Saner defaults - Saner defaults
- Recommended instances timeline - Recommended instances timeline
- Improve mobile UX
- Swipe through pages on mobile
- Redesigned mobile bottom nav bar
- Post button on TL
- Star as default reaction - Star as default reaction
- Rosé Pine by default (+ non-themable elements made Rosé Pine) - Rosé Pine by default (+ non-themable elements made Rosé Pine)
- Better sidebar/navbar - Better sidebar/navbar
- Add back groups
- MOTD (customizable by admins!) - MOTD (customizable by admins!)
- Custom randomized splash icons - Custom randomized splash icons
- Self hosted, newly designed error images - Self hosted, newly designed error images
- Illustrated by [Henki](https://www.youtube.com/c/Henkiwashere)! - Illustrated by [Henki](https://www.youtube.com/c/Henkiwashere)!
- Licensed under the CC-BY-SA 4.0. - Licensed under the CC-BY-SA 4.0.
- [Profile background as banner](https://codeberg.org/Freeplay/Misskey-Tweaks/src/branch/main/snippets/profile-background.styl)
- Better timeline top bar - Better timeline top bar
- Improved note style
- Make more of the post clickable like every other SNS
- No more details tag for reply attachments
- Better CW button
- Mark as read from notifications widget - Mark as read from notifications widget
- Less cluttered notification summary - Less cluttered notification summary
- Better welcome screen (not logged in) - Better welcome screen (not logged in)
- vue-plyr as video/audio player
- Ability to turn off "Connection lost" message - Ability to turn off "Connection lost" message
- Raw instance info only for moderators - Raw instance info only for moderators
- New spinner animation - New spinner animation
- Spinner instead of "Loading..." - Spinner instead of "Loading..."
- SearchX instead of Google - SearchX instead of Google
- Always signToActivityPubGet
- Spacing on group items - Spacing on group items
- Quotes have solid border - Quotes have solid border
- Reply limit bug fixed - Reply limit bug fixed
- Make showing the update popup optional - Make showing the update popup optional
- Improve PWA manifest
- Fix incoming chat scrolling globally
- Obliteration of Ai-chan - Obliteration of Ai-chan
- [Make showing ads optional](https://github.com/misskey-dev/misskey/pull/8996) - [Make showing ads optional](https://github.com/misskey-dev/misskey/pull/8996)
- [Tapping avatar in mobile opens account modal](https://github.com/misskey-dev/misskey/pull/9056)
- [OAuth bearer token authentication](https://github.com/misskey-dev/misskey/pull/9021) - [OAuth bearer token authentication](https://github.com/misskey-dev/misskey/pull/9021)
- [Styled Repair Tools](https://github.com/misskey-dev/misskey/pull/8956) - [Styled Repair Tools](https://github.com/misskey-dev/misskey/pull/8956)
- [Option to make enter send message](https://github.com/misskey-dev/misskey/pull/8954) - [Option to make enter send message](https://github.com/misskey-dev/misskey/pull/8954)
- [Autocomplete in messaging](https://github.com/misskey-dev/misskey/pull/8955) - [Autocomplete in messaging](https://github.com/misskey-dev/misskey/pull/8955)
- [Profile background as banner](https://codeberg.org/Freeplay/Misskey-Tweaks/src/branch/main/snippets/profile-background.styl)
- [Star is generic like/favorite](https://github.com/JakeMBauer/Misskey-Extras/blob/master/patches/star-is-like.patch) - [Star is generic like/favorite](https://github.com/JakeMBauer/Misskey-Extras/blob/master/patches/star-is-like.patch)
- 👍 also triggers generic like/favorite - 👍 also triggers generic like/favorite
- [Add additional background for acrylic popups if backdrop-filter is unsupported](https://github.com/misskey-dev/misskey/pull/8671) - [Add additional background for acrylic popups if backdrop-filter is unsupported](https://github.com/misskey-dev/misskey/pull/8671)
@ -89,3 +108,6 @@
- 585e4f5c42cfafb6cdf7eb601ab435d6a4d85a96: fix textarea not updating properly - 585e4f5c42cfafb6cdf7eb601ab435d6a4d85a96: fix textarea not updating properly
- 30d8bc9259cb6b72ed76d67b21dbb4cdceca8327: refactor: welcome.setup.vue to composition api - 30d8bc9259cb6b72ed76d67b21dbb4cdceca8327: refactor: welcome.setup.vue to composition api
- 751921e24f37ed707fe44a40d88eebb1299efa35: make emoji picker case insensitive - 751921e24f37ed707fe44a40d88eebb1299efa35: make emoji picker case insensitive
- 298febeb9c9501e3e3df16982c08657d1da474e0: enhance: add re-collapsing to quoted notes
- b0fdedb264db87575063abed45e52ad71ce4a6af: fix lints in folder.vue
- 6fed87f85d132304eb84b0a59b84dce299a1822f: fix pagination.vue lints

View File

@ -9,10 +9,17 @@
You should also include the user name that made the change. You should also include the user name that made the change.
--> -->
## 12.x.x (unreleased) ## 12.119.0 (2022/09/10)
### Improvements ### Improvements
- Client: Add following badge to user preview popup @nvisser - Client: Add following badge to user preview popup @nvisser
- Client: mobile twitter url can be used as widget @caipira113
- Client: Improve clock widget @syuilo
### Bugfixes
- マイグレーションに失敗する問題を修正
- Server: 他人の通知を既読にできる可能性があるのを修正 @syuilo
- Client: アクセストークン管理画面、アカウント管理画面表示できないのを修正 @futchitwo
## 12.118.1 (2022/08/08) ## 12.118.1 (2022/08/08)

View File

@ -1,7 +1,7 @@
FROM node:alpine FROM node:alpine
ENV YARN_CHECKSUM_BEHAVIOR=update ENV YARN_CHECKSUM_BEHAVIOR=update
ARG NODE_ENV=production ARG NODE_ENV=production
WORKDIR /misskey WORKDIR /calckey
# Copy Files # Copy Files
COPY . ./ COPY . ./

View File

@ -17,9 +17,13 @@
- Calckey adds many quality of life changes and bug fixes for users and instance admins alike. - Calckey adds many quality of life changes and bug fixes for users and instance admins alike.
- Read **[this document](./CALCKEY.md)** all for current and future differences. - Read **[this document](./CALCKEY.md)** all for current and future differences.
- Notable differences: - Notable differences:
- Improved UI/UX, notifications, security, and more - Improved UI/UX (especially on mobile)
- Improved notifications
- Improved instance security
- Recommended Instances timeline - Recommended Instances timeline
- New and improved Groups
- Many more user and admin settings - Many more user and admin settings
- [So much more!](./CALCKEY.md)
</div> </div>

View File

@ -154,9 +154,6 @@ id: "aid"
# Media Proxy # Media Proxy
#mediaProxy: https://example.com/proxy #mediaProxy: https://example.com/proxy
# Sign to ActivityPub GET request (default: false)
#signToActivityPubGet: true
#allowedPrivateNetworks: [ #allowedPrivateNetworks: [
# '127.0.0.1/32' # '127.0.0.1/32'
#] #]

View File

@ -206,6 +206,7 @@ instanceFollowers: "Následovníci na instanci"
instanceUsers: "Uživatelé této instance" instanceUsers: "Uživatelé této instance"
changePassword: "Změnit heslo" changePassword: "Změnit heslo"
security: "Zabezpečení" security: "Zabezpečení"
retypedNotMatch: "Zadané údaje se neshodují."
currentPassword: "Současné heslo" currentPassword: "Současné heslo"
newPassword: "Nové heslo" newPassword: "Nové heslo"
newPasswordRetype: "Nové heslo (znovu)" newPasswordRetype: "Nové heslo (znovu)"
@ -268,6 +269,7 @@ addFile: "Přidat soubor"
emptyFolder: "Tato složka je prázdná" emptyFolder: "Tato složka je prázdná"
unableToDelete: "Nelze smazat" unableToDelete: "Nelze smazat"
inputNewFileName: "Zadejte nový název" inputNewFileName: "Zadejte nový název"
inputNewFolderName: "Zadejte název nové složky"
copyUrl: "Kopírovat URL" copyUrl: "Kopírovat URL"
rename: "Přejmenovat" rename: "Přejmenovat"
avatar: "Avatar" avatar: "Avatar"
@ -310,9 +312,11 @@ pinnedUsers: "Připnutí uživatelé"
pinnedNotes: "Připnutá poznámka" pinnedNotes: "Připnutá poznámka"
hcaptcha: "hCaptcha" hcaptcha: "hCaptcha"
enableHcaptcha: "Aktivovat hCaptchu" enableHcaptcha: "Aktivovat hCaptchu"
hcaptchaSiteKey: "Klíč stránky"
hcaptchaSecretKey: "Tajný Klíč (Secret Key)" hcaptchaSecretKey: "Tajný Klíč (Secret Key)"
recaptcha: "reCAPTCHA" recaptcha: "reCAPTCHA"
enableRecaptcha: "Zapnout ReCAPTCHu" enableRecaptcha: "Zapnout ReCAPTCHu"
recaptchaSiteKey: "Klíč stránky"
recaptchaSecretKey: "Tajný Klíč (Secret Key)" recaptchaSecretKey: "Tajný Klíč (Secret Key)"
antennas: "Antény" antennas: "Antény"
manageAntennas: "Spravovat Antény" manageAntennas: "Spravovat Antény"
@ -321,6 +325,10 @@ antennaSource: "Zdroj Antény"
enableServiceworker: "Povolit ServiceWorker" enableServiceworker: "Povolit ServiceWorker"
caseSensitive: "Rozlišuje malá a velká písmena" caseSensitive: "Rozlišuje malá a velká písmena"
connectedTo: "Následující účty jsou připojeny" connectedTo: "Následující účty jsou připojeny"
notesAndReplies: "Poznámky a odpovědi"
withFiles: "Včetně souborů"
popularUsers: "Populární uživatelé"
recentlyUpdatedUsers: "Nedávno aktívni uživatelé"
popularTags: "Populární tagy" popularTags: "Populární tagy"
userList: "Seznamy" userList: "Seznamy"
about: "Informace" about: "Informace"
@ -365,10 +373,14 @@ next: "Další"
retype: "Zadejte znovu" retype: "Zadejte znovu"
noteOf: "{user} poznámky" noteOf: "{user} poznámky"
inviteToGroup: "Pozvat do skupiny" inviteToGroup: "Pozvat do skupiny"
quoteAttached: "Citace"
quoteQuestion: "Přiložit jako citaci?"
noMessagesYet: "Zatím tu nejsou žádné zprávy"
newMessageExists: "Máte novou zprávu" newMessageExists: "Máte novou zprávu"
onlyOneFileCanBeAttached: "Ke zprávě můžete přiložit jenom jeden soubor" onlyOneFileCanBeAttached: "Ke zprávě můžete přiložit jenom jeden soubor"
signinRequired: "Přihlašte se, prosím" signinRequired: "Přihlašte se, prosím"
invitations: "Pozvat" invitations: "Pozvat"
invitationCode: "Kód pozvánky"
checking: "Ověřuji" checking: "Ověřuji"
available: "K dispozici" available: "K dispozici"
unavailable: "Není k dispozici" unavailable: "Není k dispozici"
@ -382,6 +394,7 @@ passwordMatched: "Hesla se schodují"
passwordNotMatched: "Hesla se neschodují" passwordNotMatched: "Hesla se neschodují"
signinWith: "Přihlásit se s {x}" signinWith: "Přihlásit se s {x}"
signinFailed: "Nelze se přihlásit. Zkontrolujte prosím své uživatelské jméno a heslo." signinFailed: "Nelze se přihlásit. Zkontrolujte prosím své uživatelské jméno a heslo."
tapSecurityKey: "Ťukněte na bezpečnostní klíč"
or: "Nebo" or: "Nebo"
language: "Jazyk" language: "Jazyk"
uiLanguage: "Jazyk uživatelského rozhraní" uiLanguage: "Jazyk uživatelského rozhraní"
@ -411,9 +424,20 @@ accountSettings: "Nastavení účtu"
promotion: "Propagace" promotion: "Propagace"
promote: "Propagovat" promote: "Propagovat"
numberOfDays: "Počet dní" numberOfDays: "Počet dní"
objectStorageBaseUrl: "Base URL"
objectStorageBucket: "Bucket"
objectStoragePrefix: "Předpona"
objectStorageEndpoint: "Endpoint"
objectStorageRegion: "Región"
objectStorageUseSSL: "Použít SSL"
deleteAll: "Smazat vše" deleteAll: "Smazat vše"
showFixedPostForm: "Zobrazit formulář pro nové příspěvky nad časovou osou" showFixedPostForm: "Zobrazit formulář pro nové příspěvky nad časovou osou"
listen: "Poslouchat"
showInPage: "Zobrazit na stránce"
popout: "Pop-out"
volume: "Hlasitost"
masterVolume: "Celková hlasitost" masterVolume: "Celková hlasitost"
details: "Detaily"
chooseEmoji: "Vybrat emotikon" chooseEmoji: "Vybrat emotikon"
unableToProcess: "Operace nebyla dokončena." unableToProcess: "Operace nebyla dokončena."
recentUsed: "Naposledy použité" recentUsed: "Naposledy použité"
@ -434,13 +458,20 @@ deleteAllFiles: "Smazat všechny soubory"
deleteAllFilesConfirm: "Jste si jistí že chcete smazat všechny soubory?" deleteAllFilesConfirm: "Jste si jistí že chcete smazat všechny soubory?"
userSuspended: "Tomuto uživateli byl pozastaven účet." userSuspended: "Tomuto uživateli byl pozastaven účet."
menu: "Menu" menu: "Menu"
divider: "Dělící čára"
addItem: "Přidat položku" addItem: "Přidat položku"
relays: "Relay"
addRelay: "Přidat Relay"
inboxUrl: "Inbox URL" inboxUrl: "Inbox URL"
deletedNote: "Odstraněné příspěvky" deletedNote: "Odstraněné příspěvky"
invisibleNote: "Skryté příspěvky" invisibleNote: "Skryté příspěvky"
description: "Popis" description: "Popis"
author: "Autor" author: "Autor"
manage: "Administrace" manage: "Administrace"
width: "Šířka"
height: "Výška"
large: "Velké"
medium: "Střední"
small: "Malé" small: "Malé"
generateAccessToken: "Vygenerovat přístupový token" generateAccessToken: "Vygenerovat přístupový token"
permission: "Oprávnění" permission: "Oprávnění"
@ -458,11 +489,16 @@ smtpPort: "Port"
smtpUser: "Uživatelské jméno" smtpUser: "Uživatelské jméno"
smtpPass: "Heslo" smtpPass: "Heslo"
smtpSecureInfo: "Toto vypněte pokud používáte STARTTLS" smtpSecureInfo: "Toto vypněte pokud používáte STARTTLS"
testEmail: "Otestovat doručení emailů"
makeActive: "Aktivovat" makeActive: "Aktivovat"
display: "Zobrazit" display: "Zobrazit"
copy: "Kopírovat" copy: "Kopírovat"
metrics: "Metriky"
overview: "Shrnutí"
logs: "Logy" logs: "Logy"
delayed: "Prodleva"
database: "Databáze" database: "Databáze"
channel: "Kanály"
create: "Vytvořit" create: "Vytvořit"
notificationSetting: "Nastavení oznámení" notificationSetting: "Nastavení oznámení"
useGlobalSetting: "Použít globální nastavení" useGlobalSetting: "Použít globální nastavení"
@ -470,79 +506,415 @@ other: "Ostatní"
fileIdOrUrl: "ID nebo URL souboru" fileIdOrUrl: "ID nebo URL souboru"
behavior: "Chování" behavior: "Chování"
sample: "Ukázka" sample: "Ukázka"
send: "Odeslat"
openInNewTab: "Otevřít v nové kartě"
random: "Náhodně"
system: "Systém"
desktop: "Plocha"
clip: "Oříznout"
createNew: "Vytvořit nový"
optional: "Volitelné"
yes: "Ano"
no: "Ne"
notSet: "Není nastaveno"
emailVerified: "Váš e-mail byl ověřen"
contact: "Kontakt"
useSystemFont: "Použít výchozí font systému"
clips: "Oříznout"
experimentalFeatures: "Experimentální funkce"
developer: "Vývojář"
duplicate: "Duplikovat"
left: "Vlevo"
center: "Uprostřed"
wide: "Široké"
narrow: "Úzké"
clearCache: "Vyprázdnit mezipaměť" clearCache: "Vyprázdnit mezipaměť"
nUsers: "{n} užívatelů"
nNotes: "{n} poznámek"
myTheme: "Moje vzhledy"
backgroundColor: "Pozadí"
accentColor: "Akcent"
textColor: "Barva textu"
saveAs: "Uložit jako…"
advanced: "Pokročilé"
value: "Hodnota"
createdAt: "Vytvořeno"
updatedAt: "Upraveno"
saveConfirm: "Uložit změny?"
deleteConfirm: "Opravdu smazat?"
invalidValue: "Neplatná hodnota."
registry: "Registr"
info: "Informace" info: "Informace"
unknown: "Neznámý"
onlineStatus: "Online status"
hideOnlineStatus: "Skrýt Váš online status"
hideOnlineStatusDescription: "Skrytí vašeho online stavu může snížit funkcionalitu některých funkcí, například vyhledávání."
online: "Online"
active: "Aktivní"
offline: "Offline"
notRecommended: "Nedoporučuje se"
botProtection: "Bot ochrana"
instanceBlocking: "Blokované instance"
selectAccount: "Vybrat účet"
switchAccount: "Přepnout účet"
enabled: "Zapnuto"
disabled: "Vypnuto"
quickAction: "Rychlé akce"
user: "Uživatelé" user: "Uživatelé"
administration: "Administrace" administration: "Administrace"
accounts: "Účty"
switch: "Přepnout"
configure: "Nastavit"
gallery: "Galerie"
recentPosts: "Poslední příspěvky"
ads: "Reklamy"
memo: "Memo"
priority: "Priorita"
high: "Vysoká"
middle: "Střední"
low: "Nízká"
emailNotConfiguredWarning: "E-mailová adresa není nastavena."
ratio: "Poměr"
global: "Globální"
sent: "Odeslat"
hashtags: "Hashtagy"
troubleshooting: "Poradce při potížích"
whatIsNew: "Zobrazit změny"
translate: "Přeložit"
hide: "Skrýt"
smartphone: "Telefon"
tablet: "Tablet"
auto: "Auto"
size: "Velikost"
numberOfColumn: "Počet sloupců"
searchByGoogle: "Vyhledávání" searchByGoogle: "Vyhledávání"
indefinitely: "Navždy"
tenMinutes: "10 minut"
oneHour: "1 hodina"
oneDay: "1 den"
oneWeek: "1 týden"
reflectMayTakeTime: "Může trvat nějakou dobu, než se projeví změny."
cropImage: "Oříznout obrázek"
file: "Soubor(ů)" file: "Soubor(ů)"
recentNHours: "Posledních {n} hodin"
recentNDays: "Posledních {n} dnů"
recommended: "Doporučeno"
deleteAccount: "Odstranit účet"
document: "Dokumentace"
logoutConfirm: "Opravdu se chcete odhlásit?"
pleaseSelect: "Vybrat možnost"
reverse: "Otočit"
colored: "Barevné"
type: "Typ"
speed: "Rychlost"
slow: "Pomalá"
fast: "Rychlá"
account: "Účty"
_ad:
back: "Zpět"
_gallery:
my: "Moje galerie"
_email: _email:
_follow: _follow:
title: "Máte nového následovníka" title: "Máte nového následovníka"
_plugin:
install: "Instalovat plugin"
manage: "Správce pluginů"
_preferencesBackups:
list: "Vytvořit backup"
loadFile: "Načíst ze souboru"
save: "Uložit změny"
_registry:
scope: "Rozsah"
key: "Klíč"
keys: "Klíče"
domain: "Doména"
createKey: "Vytvořit klíč"
_aboutMisskey:
allContributors: "Všichni přispěvatelé"
source: "Zdrojový kód"
_mfm: _mfm:
mention: "Zmínění" mention: "Zmínění"
hashtag: "Hashtag"
link: "Odkaz"
bold: "Tučně"
quote: "Citovat" quote: "Citovat"
emoji: "Vlastní emoji" emoji: "Vlastní emoji"
search: "Vyhledávání" search: "Vyhledávání"
flip: "Otočit"
tada: "Animace (tadá)"
blur: "Rozmazání"
font: "Font"
rainbow: "Duha"
_channel:
featured: "Trendy"
_menuDisplay:
top: "Nahoru"
hide: "Skrýt"
_theme: _theme:
install: "Nainstalovat vzhled"
manage: "Správa vzhledů"
code: "Kód vzhledu"
description: "Popis" description: "Popis"
installedThemes: "Nainstalované vzhledy"
constant: "Konstanta"
defaultValue: "Výchozí hodnota"
color: "Barva"
key: "Klíč"
func: "Funkce "
keys: keys:
shadow: "Stín"
header: "Nadpis"
link: "Odkaz"
hashtag: "Hashtag"
mention: "Zmínění" mention: "Zmínění"
renote: "Přeposlat" renote: "Přeposlat"
divider: "Dělící čára"
_sfx: _sfx:
note: "Poznámky" note: "Poznámky"
notification: "Oznámení" notification: "Oznámení"
chat: "Zprávy" chat: "Zprávy"
_ago:
future: "Budoucí"
justNow: "Teď"
_time:
second: "Sekund"
minute: "Minut"
hour: "Hodin"
_2fa:
registerDevice: "Přidat zařízení"
registerKey: "Přidat bezpečnostní klíč"
_weekday:
sunday: "Neděle"
monday: "Pondělí"
tuesday: "Úterý"
wednesday: "Středa"
thursday: "Čtvrtek"
friday: "Pátek"
saturday: "Sobota"
_widgets: _widgets:
notifications: "Oznámení" notifications: "Oznámení"
timeline: "Časová osa" timeline: "Časová osa"
calendar: "Kalendář"
trends: "Trendy"
clock: "Hodiny"
rss: "RSS čtečka"
activity: "Aktivita" activity: "Aktivita"
photos: "Fotky"
digitalClock: "Digitální hodiny"
federation: "Federace" federation: "Federace"
slideshow: "Prezentace"
button: "Tlačítko"
onlineUsers: "Online uživatelé"
jobQueue: "Fronta úloh" jobQueue: "Fronta úloh"
aiscript: "AiScript conzole"
aichan: "Ai"
_cw: _cw:
hide: "Skrýt"
show: "Zobrazit více" show: "Zobrazit více"
_poll:
noMore: "Více už přidat nemůžete"
infinite: "Nikdy"
deadlineDate: "Datum ukončení"
deadlineTime: "Hodin"
duration: "Trvání"
_visibility: _visibility:
home: "Domů" home: "Domů"
followers: "Sledující" followers: "Sledující"
_postForm:
_placeholders:
f: "Čekám, až něco napíšete..."
_profile: _profile:
name: "Jméno" name: "Jméno"
username: "Uživatelské jméno" username: "Uživatelské jméno"
description: "O mně"
youCanIncludeHashtags: "V popisku o Vás můžete použít i hastagy."
metadata: "Doplňující informace"
metadataContent: "Obsah"
_exportOrImport: _exportOrImport:
allNotes: "Všechny poznámky"
followingList: "Sledovaní" followingList: "Sledovaní"
muteList: "Ztlumit" muteList: "Ztlumit"
blockingList: "Zablokovat" blockingList: "Zablokovat"
userLists: "Seznamy" userLists: "Seznamy"
_charts: _charts:
federation: "Federace" federation: "Federace"
apRequest: "Požadavek"
usersTotal: "Celkem uživatelů"
activeUsers: "Aktivní uživatelé"
notesTotal: "Celkový počet poznámek"
_timelines: _timelines:
home: "Domů" home: "Domů"
global: "Globální"
_pages: _pages:
newPage: "Vytvořit novou stránku"
editPage: "Upravit stránku"
created: "Stránka byla úspěšně vytvořena"
updated: "Stránka byla úspěšně aktualizována"
deleted: "Stránka byla úspěšně smazána"
pageSetting: "Nastavení stránky"
invalidNameText: "Ujistěte se že jméno stránky je vyplněno"
contents: "Obsah"
fontSerif: "Serif"
fontSansSerif: "Sans Serif"
chooseBlock: "Přidat blok"
selectType: "Vyberte typ"
contentBlocks: "Obsah"
inputBlocks: "Vstup"
specialBlocks: "Speciální"
blocks: blocks:
text: "Text"
textarea: "Textové pole"
section: "Sekce"
image: "Obrázky" image: "Obrázky"
button: "Tlačítko"
if: "Pokud"
_if:
variable: "Proměnná"
_post:
text: "Obsah"
canvasId: "Canvas ID"
_textInput:
name: "Jméno proměnné"
text: "Titulek"
default: "Výchozí hodnota"
_textareaInput:
name: "Jméno proměnné"
text: "Titulek"
default: "Výchozí hodnota"
_numberInput:
name: "Jméno proměnné"
text: "Titulek"
default: "Výchozí hodnota"
canvas: "Canvas"
_canvas:
id: "Canvas ID"
width: "Šířka"
height: "Výška"
_switch:
name: "Jméno proměnné"
text: "Titulek"
default: "Výchozí hodnota"
_counter:
name: "Jméno proměnné"
text: "Titulek"
inc: "Krok"
_button:
text: "Titulek"
colored: "Barevné"
_action:
_dialog:
content: "Obsah"
_radioButton:
name: "Jméno proměnné"
default: "Výchozí hodnota"
script: script:
categories: categories:
list: "Seznamy" list: "Seznamy"
blocks: blocks:
text: "Text"
_strLen:
arg1: "Text"
_strPick:
arg1: "Text"
_strReplace:
arg1: "Text"
_strReverse:
arg1: "Text"
_join: _join:
arg1: "Seznamy" arg1: "Seznamy"
_subtract:
arg1: "A"
arg2: "B"
_multiply:
arg1: "A"
arg2: "B"
_divide:
arg1: "A"
arg2: "B"
_mod:
arg1: "A"
arg2: "B"
round: "Zaokrouhlení zlomku"
_round:
arg1: "Číselná hodnota"
eq: "A a B jsou stejné"
_eq:
arg1: "A"
arg2: "B"
notEq: "A a B jsou odlišné"
_notEq:
arg1: "A"
arg2: "B"
_and:
arg1: "A"
arg2: "B"
_or:
arg1: "A"
arg2: "B"
_lt:
arg1: "A"
arg2: "B"
_gt:
arg1: "A"
arg2: "B"
_ltEq:
arg1: "A"
arg2: "B"
_gtEq:
arg1: "A"
arg2: "B"
if: "Větev"
_if:
arg1: "Pokud"
arg2: "Potom"
arg3: "Nebo"
random: "Náhodně"
_random:
arg1: "Pravděpodobnost"
rannum: "Náhodné číslo"
_rannum:
arg1: "Minimální hodnota"
arg2: "Maximální hodnota"
_randomPick: _randomPick:
arg1: "Seznamy" arg1: "Seznamy"
_dailyRandom:
arg1: "Pravděpodobnost"
_dailyRannum:
arg1: "Minimální hodnota"
arg2: "Maximální hodnota"
_dailyRandomPick: _dailyRandomPick:
arg1: "Seznamy" arg1: "Seznamy"
_seedRandom:
arg2: "Pravděpodobnost"
_seedRannum:
arg2: "Minimální hodnota"
arg3: "Maximální hodnota"
_seedRandomPick: _seedRandomPick:
arg2: "Seznamy" arg2: "Seznamy"
_pick: _pick:
arg1: "Seznamy" arg1: "Seznamy"
_listLen: _listLen:
arg1: "Seznamy" arg1: "Seznamy"
number: "Číselná hodnota"
_stringToNumber:
arg1: "Text"
_numberToString:
arg1: "Číselná hodnota"
_splitStrByLine:
arg1: "Text"
types: types:
string: "Text"
number: "Číselná hodnota"
array: "Seznamy" array: "Seznamy"
_notification: _notification:
youWereFollowed: "Máte nového následovníka" youWereFollowed: "Máte nového následovníka"
youWereInvitedToGroup: "Pozvat do skupiny" youWereInvitedToGroup: "Pozvat do skupiny"
_types: _types:
all: "Vše"
follow: "Sledovaní" follow: "Sledovaní"
mention: "Zmínění" mention: "Zmínění"
reply: "Odpovědi"
renote: "Přeposlat" renote: "Přeposlat"
quote: "Citovat" quote: "Citovat"
reaction: "Reakce" reaction: "Reakce"

View File

@ -134,7 +134,7 @@ emoji: "Emoji"
emojis: "Emoji" emojis: "Emoji"
emojiName: "Emoji name" emojiName: "Emoji name"
emojiUrl: "Emoji URL" emojiUrl: "Emoji URL"
addEmoji: "Add an emoji" addEmoji: "Add"
settingGuide: "Recommended settings" settingGuide: "Recommended settings"
cacheRemoteFiles: "Cache remote files" cacheRemoteFiles: "Cache remote files"
cacheRemoteFilesDescription: "When this setting is disabled, remote files are loaded directly from the remote instance. Disabling this will decrease storage usage, but increase traffic, as thumbnails will not be generated." cacheRemoteFilesDescription: "When this setting is disabled, remote files are loaded directly from the remote instance. Disabling this will decrease storage usage, but increase traffic, as thumbnails will not be generated."
@ -783,7 +783,7 @@ emailNotConfiguredWarning: "Email address not set."
ratio: "Ratio" ratio: "Ratio"
secureMode: "Secure Mode (Authorized Fetch)" secureMode: "Secure Mode (Authorized Fetch)"
instanceSecurity: "Instance Security" instanceSecurity: "Instance Security"
secureModeInfo: "When requesting from other instances, do not send back without proof. signToActivityPubGet must be true in the other instance's configuration file." secureModeInfo: "When requesting from other instances, do not send back without proof."
privateMode: "Private Mode" privateMode: "Private Mode"
privateModeInfo: "When enabled, only whitelisted instances can federate with your instances. All notes will be hidden from the public." privateModeInfo: "When enabled, only whitelisted instances can federate with your instances. All notes will be hidden from the public."
allowedInstances: "Whitelisted Instances" allowedInstances: "Whitelisted Instances"
@ -989,7 +989,7 @@ _registry:
domain: "Domain" domain: "Domain"
createKey: "Create key" createKey: "Create key"
_aboutMisskey: _aboutMisskey:
about: "Calckey is a fork of Misskey made by ThatOneCalculator being developed since 2022." about: "Calckeyは、2022年から開発されているThatOneCalculator社製のMisskeyのforkです。"
contributors: "Main contributors" contributors: "Main contributors"
allContributors: "All contributors" allContributors: "All contributors"
source: "Source code" source: "Source code"

View File

@ -379,7 +379,7 @@ exploreFediverse: "Fediverseを探索"
popularTags: "人気のタグ" popularTags: "人気のタグ"
userList: "リスト" userList: "リスト"
about: "情報" about: "情報"
aboutMisskey: "Misskeyについて" aboutMisskey: "Calckeyについて"
administrator: "管理者" administrator: "管理者"
token: "トークン" token: "トークン"
twoStepAuthentication: "二段階認証" twoStepAuthentication: "二段階認証"

View File

@ -562,6 +562,7 @@ author: "작성자"
leaveConfirm: "저장하지 않은 변경사항이 있습니다. 취소하시겠습니까?" leaveConfirm: "저장하지 않은 변경사항이 있습니다. 취소하시겠습니까?"
manage: "관리" manage: "관리"
plugins: "플러그인" plugins: "플러그인"
preferencesBackups: "환경설정 백업"
deck: "덱" deck: "덱"
undeck: "덱 해제" undeck: "덱 해제"
useBlurEffectForModal: "모달에 흐림 효과 사용" useBlurEffectForModal: "모달에 흐림 효과 사용"
@ -612,7 +613,7 @@ create: "생성"
notificationSetting: "알림 설정" notificationSetting: "알림 설정"
notificationSettingDesc: "표시할 알림의 종류를 선택해 주세요." notificationSettingDesc: "표시할 알림의 종류를 선택해 주세요."
useGlobalSetting: "글로벌 설정을 사용하기" useGlobalSetting: "글로벌 설정을 사용하기"
useGlobalSettingDesc: "활성화하면 계정의 알림 설정이 적용니다. 비활성화하면 개별적으로 설정할 수 있게 됩니다." useGlobalSettingDesc: "활성화하면 계정의 알림 설정이 적용니다. 비활성화하면 개별적으로 설정할 수 있게 됩니다."
other: "기타" other: "기타"
regenerateLoginToken: "로그인 토큰을 재생성" regenerateLoginToken: "로그인 토큰을 재생성"
regenerateLoginTokenDescription: "로그인할 때 사용되는 내부 토큰을 재생성합니다. 일반적으로 이 작업을 실행할 필요는 없습니다. 이 기능을 사용하면 이 계정으로 로그인한 모든 기기에서 로그아웃됩니다." regenerateLoginTokenDescription: "로그인할 때 사용되는 내부 토큰을 재생성합니다. 일반적으로 이 작업을 실행할 필요는 없습니다. 이 기능을 사용하면 이 계정으로 로그인한 모든 기기에서 로그아웃됩니다."
@ -941,6 +942,24 @@ _plugin:
install: "플러그인 설치" install: "플러그인 설치"
installWarn: "신뢰할 수 없는 플러그인은 설치하지 않는 것이 좋습니다." installWarn: "신뢰할 수 없는 플러그인은 설치하지 않는 것이 좋습니다."
manage: "플러그인 관리" manage: "플러그인 관리"
_preferencesBackups:
list: "생성한 백업"
saveNew: "새 백업 만들기"
loadFile: "파일 가져오기"
apply: "이 기기에 적용"
save: "현재 설정으로 덮어쓰기"
inputName: "백업 이름을 입력하세요"
cannotSave: "저장하지 못했습니다"
nameAlreadyExists: "\"{name}\" 백업이 이미 존재합니다. 다른 이름을 설정하여 주십시오."
applyConfirm: "\"{name}\" 백업을 현재 기기에 적용하시겠습니까? 현재 설정은 덮어 씌워집니다."
saveConfirm: "{name} 을 덮어쓰시겠습니까?"
deleteConfirm: "{name} 을(를) 삭제하시겠습니까?"
renameConfirm: "\"{old}\" 백업을 \"{new}\"(으)로 바꾸시겠습니까?"
noBackups: "저장된 백업이 없습니다. \"새 백업 만들기\"를 눌러 현재 클라이언트 설정을 서버에 백업할 수 있습니다."
createdAt: "생성 날짜: {date} {time}"
updatedAt: "갱신 날짜: {date} {time}"
cannotLoad: "가져오기에 실패했습니다"
invalidFile: "파일 형식이 올바르지 않습니다."
_registry: _registry:
scope: "범위" scope: "범위"
key: "키" key: "키"
@ -1258,6 +1277,7 @@ _widgets:
activity: "활동" activity: "활동"
photos: "사진" photos: "사진"
digitalClock: "디지털 시계" digitalClock: "디지털 시계"
unixClock: "UNIX 시계"
federation: "연합" federation: "연합"
instanceCloud: "인스턴스 구름" instanceCloud: "인스턴스 구름"
postForm: "글 입력란" postForm: "글 입력란"

View File

@ -1,5 +1,5 @@
--- ---
_lang_: "język polski" _lang_: "Polski"
headlineMisskey: "Sieć połączona wpisami" headlineMisskey: "Sieć połączona wpisami"
introMisskey: "Misskey jest serwisem mikroblogowym typu open source.\nMisskey to opensource'owy serwis mikroblogowy, w którym możesz tworzyć \"notatki\", aby dzielić się tym, co się dzieje i opowiadać wszystkim o sobie.\nMożesz również użyć funkcji \"Reakcje\", aby szybko dodać własne reakcje do notatek innych użytkowników👍.\nOdkrywaj nowy świat🚀!" introMisskey: "Misskey jest serwisem mikroblogowym typu open source.\nMisskey to opensource'owy serwis mikroblogowy, w którym możesz tworzyć \"notatki\", aby dzielić się tym, co się dzieje i opowiadać wszystkim o sobie.\nMożesz również użyć funkcji \"Reakcje\", aby szybko dodać własne reakcje do notatek innych użytkowników👍.\nOdkrywaj nowy świat🚀!"
monthAndDay: "{month}-{day}" monthAndDay: "{month}-{day}"
@ -88,7 +88,7 @@ enterListName: "Nazwa listy"
privacy: "Prywatność" privacy: "Prywatność"
makeFollowManuallyApprove: "Prośby o możliwość obserwacji wymagają zatwierdzenia" makeFollowManuallyApprove: "Prośby o możliwość obserwacji wymagają zatwierdzenia"
defaultNoteVisibility: "Domyślna widoczność" defaultNoteVisibility: "Domyślna widoczność"
follow: "Obserwowani" follow: "Obserwuj"
followRequest: "Poproś o możliwość obserwacji" followRequest: "Poproś o możliwość obserwacji"
followRequests: "Prośby o możliwość obserwacji" followRequests: "Prośby o możliwość obserwacji"
unfollow: "Przestań obserwować" unfollow: "Przestań obserwować"
@ -127,7 +127,7 @@ unsuspendConfirm: "Czy na pewno chcesz cofnąć zawieszenie tego konta?"
selectList: "Wybierz listę" selectList: "Wybierz listę"
selectAntenna: "Wybierz Antennę" selectAntenna: "Wybierz Antennę"
selectWidget: "Wybierz widżet" selectWidget: "Wybierz widżet"
editWidgets: "Edytuj widżet" editWidgets: "Edytuj widżety"
editWidgetsExit: "Gotowe" editWidgetsExit: "Gotowe"
customEmojis: "Niestandardowe emoji" customEmojis: "Niestandardowe emoji"
emoji: "Emoji" emoji: "Emoji"
@ -142,6 +142,7 @@ flagAsBot: "To konto jest botem"
flagAsBotDescription: "Jeżeli ten kanał jest kontrolowany przez jakiś program, ustaw tę opcję. Jeżeli włączona, będzie działać jako flaga informująca innych programistów, aby zapobiegać nieskończonej interakcji z różnymi botami i dostosowywać wewnętrzne systemy Misskey, traktując konto jako bota." flagAsBotDescription: "Jeżeli ten kanał jest kontrolowany przez jakiś program, ustaw tę opcję. Jeżeli włączona, będzie działać jako flaga informująca innych programistów, aby zapobiegać nieskończonej interakcji z różnymi botami i dostosowywać wewnętrzne systemy Misskey, traktując konto jako bota."
flagAsCat: "To konto jest kotem" flagAsCat: "To konto jest kotem"
flagAsCatDescription: "Przełącz tę opcję, aby konto było oznaczone jako kot." flagAsCatDescription: "Przełącz tę opcję, aby konto było oznaczone jako kot."
flagShowTimelineReplies: "Pokazuj odpowiedzi na osi czasu"
autoAcceptFollowed: "Automatycznie przyjmuj prośby o możliwość obserwacji od użytkowników, których obserwujesz" autoAcceptFollowed: "Automatycznie przyjmuj prośby o możliwość obserwacji od użytkowników, których obserwujesz"
addAccount: "Dodaj konto" addAccount: "Dodaj konto"
loginFailed: "Nie udało się zalogować" loginFailed: "Nie udało się zalogować"
@ -201,6 +202,7 @@ done: "Gotowe"
processing: "Przetwarzanie" processing: "Przetwarzanie"
preview: "Podgląd" preview: "Podgląd"
default: "Domyślne" default: "Domyślne"
defaultValueIs: "Domyślne: {value}"
noCustomEmojis: "Brak emoji" noCustomEmojis: "Brak emoji"
noJobs: "Brak zadań" noJobs: "Brak zadań"
federating: "Federowanie" federating: "Federowanie"
@ -235,6 +237,7 @@ resetAreYouSure: "Czy na pewno chcesz zresetować?"
saved: "Zapisano" saved: "Zapisano"
messaging: "Wiadomości" messaging: "Wiadomości"
upload: "Wyślij" upload: "Wyślij"
keepOriginalUploading: "Zachowaj oryginalny obraz"
fromDrive: "Z dysku" fromDrive: "Z dysku"
fromUrl: "Z adresu URL" fromUrl: "Z adresu URL"
uploadFromUrl: "Wyślij z adresu URL" uploadFromUrl: "Wyślij z adresu URL"
@ -377,6 +380,7 @@ administrator: "Admin"
token: "Token" token: "Token"
twoStepAuthentication: "Uwierzytelnianie dwuskładnikowe" twoStepAuthentication: "Uwierzytelnianie dwuskładnikowe"
moderator: "Moderator" moderator: "Moderator"
moderation: "Moderacja"
nUsersMentioned: "{n} wspomnianych użytkowników" nUsersMentioned: "{n} wspomnianych użytkowników"
securityKey: "Klucz bezpieczeństwa" securityKey: "Klucz bezpieczeństwa"
securityKeyName: "Nazwa klucza" securityKeyName: "Nazwa klucza"
@ -444,11 +448,13 @@ uiLanguage: "Język wyświetlania UI"
groupInvited: "Zaproszony(-a) do grupy" groupInvited: "Zaproszony(-a) do grupy"
aboutX: "O {x}" aboutX: "O {x}"
useOsNativeEmojis: "Używaj natywnych Emoji systemu" useOsNativeEmojis: "Używaj natywnych Emoji systemu"
disableDrawer: "Nie używaj menu w stylu szuflady"
youHaveNoGroups: "Nie masz żadnych grup" youHaveNoGroups: "Nie masz żadnych grup"
joinOrCreateGroup: "Uzyskaj zaproszenie do dołączenia do grupy lub utwórz własną grupę." joinOrCreateGroup: "Uzyskaj zaproszenie do dołączenia do grupy lub utwórz własną grupę."
noHistory: "Brak historii" noHistory: "Brak historii"
signinHistory: "Historia logowania" signinHistory: "Historia logowania"
disableAnimatedMfm: "Wyłącz MFM z animacją" disableAnimatedMfm: "Wyłącz MFM z animacją"
doing: "Przetwarzanie..."
category: "Kategoria" category: "Kategoria"
tags: "Tagi" tags: "Tagi"
docSource: "Źródło tego dokumentu" docSource: "Źródło tego dokumentu"
@ -523,6 +529,9 @@ deleteAllFilesConfirm: "Czy na pewno chcesz usunąć wszystkie pliki?"
removeAllFollowingDescription: "Przestań obserwować wszystkie konta z {host}. Wykonaj to, jeżeli instancja już nie istnieje." removeAllFollowingDescription: "Przestań obserwować wszystkie konta z {host}. Wykonaj to, jeżeli instancja już nie istnieje."
userSuspended: "To konto zostało zawieszone." userSuspended: "To konto zostało zawieszone."
userSilenced: "Ten użytkownik został wyciszony." userSilenced: "Ten użytkownik został wyciszony."
yourAccountSuspendedTitle: "To konto jest zawieszone"
yourAccountSuspendedDescription: "To konto zostało zawieszone z powodu złamania regulaminu serwera lub innych podobnych. Skontaktuj się z administratorem, jeśli chciałbyś poznać bardziej szczegółowy powód. Proszę nie zakładać nowego konta."
menu: "Menu"
divider: "Rozdzielacz" divider: "Rozdzielacz"
addItem: "Dodaj element" addItem: "Dodaj element"
relays: "Przekaźniki" relays: "Przekaźniki"
@ -541,7 +550,7 @@ disablePlayer: "Zamknij odtwarzacz wideo"
expandTweet: "Rozwiń tweet" expandTweet: "Rozwiń tweet"
themeEditor: "Edytor motywu" themeEditor: "Edytor motywu"
description: "Opis" description: "Opis"
describeFile: "dodaj podpis" describeFile: "Dodaj podpis"
enterFileDescription: "Wprowadź napis" enterFileDescription: "Wprowadź napis"
author: "Autor" author: "Autor"
leaveConfirm: "Są niezapisane zmiany. Czy chcesz je odrzucić?" leaveConfirm: "Są niezapisane zmiany. Czy chcesz je odrzucić?"
@ -578,6 +587,7 @@ emptyToDisableSmtpAuth: "Pozostaw adres e-mail i hasło puste, aby wyłączyć w
smtpSecureInfo: "Wyłącz, jeżeli używasz STARTTLS" smtpSecureInfo: "Wyłącz, jeżeli używasz STARTTLS"
testEmail: "Przetestuj dostarczanie wiadomości e-mail" testEmail: "Przetestuj dostarczanie wiadomości e-mail"
wordMute: "Wyciszenie słowa" wordMute: "Wyciszenie słowa"
instanceMute: "Wyciszone instancje"
userSaysSomething: "{name} powiedział(-a) coś" userSaysSomething: "{name} powiedział(-a) coś"
makeActive: "Aktywuj" makeActive: "Aktywuj"
display: "Wyświetlanie" display: "Wyświetlanie"
@ -607,6 +617,7 @@ fillAbuseReportDescription: "Wypełnij szczegóły zgłoszenia. Jeżeli dotyczy
abuseReported: "Twoje zgłoszenie zostało wysłane. Dziękujemy." abuseReported: "Twoje zgłoszenie zostało wysłane. Dziękujemy."
reporteeOrigin: "Pochodzenie zgłoszonego" reporteeOrigin: "Pochodzenie zgłoszonego"
reporterOrigin: "Pochodzenie zgłaszającego" reporterOrigin: "Pochodzenie zgłaszającego"
forwardReport: "Przekaż zgłoszenie do innej instancji"
send: "Wyślij" send: "Wyślij"
abuseMarkAsResolved: "Oznacz zgłoszenie jako rozwiązane" abuseMarkAsResolved: "Oznacz zgłoszenie jako rozwiązane"
openInNewTab: "Otwórz w nowej karcie" openInNewTab: "Otwórz w nowej karcie"
@ -619,8 +630,12 @@ random: "Losowe"
system: "System" system: "System"
switchUi: "Przełącz interfejs użytkownika" switchUi: "Przełącz interfejs użytkownika"
desktop: "Pulpit" desktop: "Pulpit"
clip: "Klip"
createNew: "Utwórz nowy" createNew: "Utwórz nowy"
optional: "Nieobowiązkowe" optional: "Nieobowiązkowe"
createNewClip: "Utwórz nowy klip"
unclip: "Odczep"
confirmToUnclipAlreadyClippedNote: "Ten wpis jest już częścią klipu \"{name}\". Czy chcesz ją usunąć z tego klipu?"
public: "Publiczny" public: "Publiczny"
i18nInfo: "Misskey jest tłumaczone na wiele języków przez wolontariuszy. Możesz pomóc na {link}." i18nInfo: "Misskey jest tłumaczone na wiele języków przez wolontariuszy. Możesz pomóc na {link}."
manageAccessTokens: "Zarządzaj tokenami dostępu" manageAccessTokens: "Zarządzaj tokenami dostępu"
@ -654,6 +669,7 @@ pageLikesCount: "Liczba otrzymanych polubień stron"
pageLikedCount: "Liczba polubionych stron" pageLikedCount: "Liczba polubionych stron"
contact: "Kontakt" contact: "Kontakt"
useSystemFont: "Używaj domyślnej czcionki systemu" useSystemFont: "Używaj domyślnej czcionki systemu"
clips: "Klipy"
experimentalFeatures: "Eksperymentalne funkcje" experimentalFeatures: "Eksperymentalne funkcje"
developer: "Programista" developer: "Programista"
makeExplorable: "Pokazuj konto na stronie „Eksploruj”" makeExplorable: "Pokazuj konto na stronie „Eksploruj”"
@ -725,6 +741,7 @@ notRecommended: "Nie zalecane"
botProtection: "Zabezpieczenie przed botami" botProtection: "Zabezpieczenie przed botami"
instanceBlocking: "Zablokowane instancje" instanceBlocking: "Zablokowane instancje"
selectAccount: "Wybierz konto" selectAccount: "Wybierz konto"
switchAccount: "Przełącz konto"
enabled: "Właczono" enabled: "Właczono"
disabled: "Wyłączono" disabled: "Wyłączono"
quickAction: "Szybkie działania" quickAction: "Szybkie działania"
@ -756,22 +773,103 @@ global: "Globalna"
squareAvatars: "Wyświetlaj kwadratowe awatary" squareAvatars: "Wyświetlaj kwadratowe awatary"
sent: "Wyślij" sent: "Wyślij"
received: "Otrzymane" received: "Otrzymane"
searchResult: "Wyniki wyszukiwania"
hashtags: "Hashtag" hashtags: "Hashtag"
troubleshooting: "Rozwiązywanie problemów"
useBlurEffect: "Użyj efektów rozmycia w UI"
learnMore: "Dowiedz się więcej"
misskeyUpdated: "Misskey zostało zaktualizowane!"
whatIsNew: "Pokaż zmiany"
translate: "Przetłumacz"
translatedFrom: "Przetłumaczone z {x}"
accountDeletionInProgress: "Trwa usuwanie konta"
usernameInfo: "Nazwa, która identyfikuje Twoje konto spośród innych na tym serwerze. Możesz użyć alfabetu (a~z, A~Z), cyfr (0~9) lub podkreślników (_). Nazwy użytkownika nie mogą być później zmieniane."
aiChanMode: "Tryb Ai"
keepCw: "Zostaw ostrzeżenia o zawartości"
pubSub: "Konta Pub/Sub" pubSub: "Konta Pub/Sub"
resolved: "Rozwiązane"
unresolved: "Nierozwiązane"
breakFollow: "Usuń obserwującego"
itsOn: "Włączone"
itsOff: "Wyłączone"
unread: "Nieodczytane"
filter: "Filtr"
controlPanel: "Panel sterowania"
manageAccounts: "Zarządzaj kontami"
makeReactionsPublic: "Ustawić historię reakcji jako publiczną"
makeReactionsPublicDescription: "To spowoduje, że lista wszystkich Twoich dotychczasowych reakcji będzie publicznie widoczna."
classic: "Klasyczny"
muteThread: "Wycisz wątek"
unmuteThread: "Wyłącz wyciszenie wątku"
ffVisibility: "Widoczność obserwowanych/obserwujących"
ffVisibilityDescription: "Pozwala skonfigurować, kto może zobaczyć, kogo obserwujesz i kto Cię obserwuje."
continueThread: "Pokaż kontynuację wątku"
deleteAccountConfirm: "Spowoduje to nieodwracalne usunięcie Twojego konta. Kontynuować?"
incorrectPassword: "Nieprawidłowe hasło."
voteConfirm: "Potwierdzić swój głos na \"{choice}\"?"
hide: "Ukryj" hide: "Ukryj"
leaveGroup: "Opuść grupę"
leaveGroupConfirm: "Czy na pewno chcesz opuścić \"{name}\"?"
useDrawerReactionPickerForMobile: "Wyświetlaj wybornik reakcji jako szufladę na urządzeniach mobilnych"
welcomeBackWithName: "Witaj z powrotem, {name}"
clickToFinishEmailVerification: "Kliknij [{ok}], aby zakończyć weryfikację e-mail."
overridedDeviceKind: "Typ urządzenia"
smartphone: "Smartfon"
tablet: "Tablet"
auto: "Automatycznie"
size: "Rozmiar"
numberOfColumn: "Liczba kolumn"
searchByGoogle: "Szukaj" searchByGoogle: "Szukaj"
indefinitely: "Nigdy" indefinitely: "Nigdy"
file: "Pliki" file: "Pliki"
logoutConfirm: "Czy na pewno chcesz się wylogować?"
lastActiveDate: "Ostatnio użyte w"
statusbar: "Pasek stanu"
pleaseSelect: "Wybierz opcję"
reverse: "Odwróć" reverse: "Odwróć"
colored: "Kolorowe" colored: "Kolorowe"
label: "Etykieta" label: "Etykieta"
type: "Typ"
speed: "Prędkość"
localOnly: "Lokalne tylko"
failedToUpload: "Przesyłanie nie powiodło się"
cannotUploadBecauseInappropriate: "Nie można przesłać tego pliku, ponieważ jego części zostały wykryte jako potencjalnie nieodpowiednie."
cannotUploadBecauseNoFreeSpace: "Przesyłanie nie powiodło się z powodu braku miejsca na dysku."
beta: "Beta"
enableAutoSensitive: "Automatyczne oznaczanie NSFW"
enableAutoSensitiveDescription: "Umożliwia automatyczne wykrywanie i oznaczanie zawartości NSFW za pomocą uczenia maszynowego. Nawet jeśli ta opcja jest wyłączona, może być włączona w całej instancji."
navbar: "Pasek nawigacyjny"
account: "Konta" account: "Konta"
move: "Przenieś"
_sensitiveMediaDetection:
description: "Zmniejsza wysiłek związany z moderacją serwera dzięki automatycznemu rozpoznawaniu zawartości NSFW za pomocą uczenia maszynowego. To nieznacznie zwiększy obciążenie serwera."
setSensitiveFlagAutomatically: "Oznacz jako NSFW"
_emailUnavailable:
used: "Ten adres e-mail jest już używany"
format: "Format tego adresu e-mail jest nieprawidłowy"
disposable: "Nie można używać jednorazowych adresów e-mail"
mx: "Ten serwer e-mail jest nieprawidłowy"
smtp: "Ten serwer e-mail nie odpowiada"
_ffVisibility: _ffVisibility:
public: "Publikuj" public: "Publiczne"
followers: "Widoczne tylko dla obserwujących"
private: "Prywatne"
_signup:
almostThere: "Prawie na miejscu"
emailAddressInfo: "Podaj swój adres e-mail. Nie zostanie on upubliczniony."
emailSent: "E-mail z potwierdzeniem został wysłany na Twój adres e-mail ({email}). Kliknij dołączony link, aby dokończyć tworzenie konta."
_accountDelete:
accountDelete: "Usuń konto"
mayTakeTime: "Ponieważ usuwanie konta jest procesem wymagającym dużej ilości zasobów, jego ukończenie może zająć trochę czasu, w zależności od ilości utworzonej zawartości i liczby przesłanych plików."
sendEmail: "Po zakończeniu usuwania konta na adres e-mail zarejestrowany na tym koncie zostanie wysłana wiadomość e-mail."
requestAccountDelete: "Poproś o usunięcie konta"
started: "Usuwanie się rozpoczęło."
inProgress: "Usuwanie jest obecnie w toku"
_ad: _ad:
back: "Wróć" back: "Wróć"
reduceFrequencyOfThisAd: "Pokazuj tę reklamę rzadziej" reduceFrequencyOfThisAd: "Pokazuj tę reklamę rzadziej"
_forgotPassword: _forgotPassword:
enterEmail: "Wpisz adres e-mail użyty do rejestracji. Zostanie do niego wysłany link, za pomocą którego możesz zresetować hasło."
ifNoEmail: "Jeżeli nie podano adresu e-mail podczas rejestracji, skontaktuj się z administratorem zamiast tego." ifNoEmail: "Jeżeli nie podano adresu e-mail podczas rejestracji, skontaktuj się z administratorem zamiast tego."
contactAdmin: "Jeżeli Twoja instancja nie obsługuje adresów e-mail, skontaktuj się zamiast tego z administratorem, aby zresetować hasło." contactAdmin: "Jeżeli Twoja instancja nie obsługuje adresów e-mail, skontaktuj się zamiast tego z administratorem, aby zresetować hasło."
_gallery: _gallery:
@ -788,6 +886,23 @@ _plugin:
install: "Zainstaluj wtyczki" install: "Zainstaluj wtyczki"
installWarn: "Nie instaluj niezaufanych wtyczek." installWarn: "Nie instaluj niezaufanych wtyczek."
manage: "Zarządzanie wtyczkami" manage: "Zarządzanie wtyczkami"
_preferencesBackups:
list: "Utworzone kopie zapasowe"
saveNew: "Zapisz nową kopię zapasową"
loadFile: "Załaduj z pliku"
apply: "Zastosuj do tego urządzenia"
save: "Zapisz zmiany"
inputName: "Proszę podać nazwę dla tej kopii zapasowej"
cannotSave: "Zapisanie nie powiodło się"
nameAlreadyExists: "Kopia zapasowa o nazwie \"{name}\" już istnieje. Proszę podać inną nazwę."
applyConfirm: "Czy na pewno chcesz zastosować kopię zapasową \"{name}\" na tym urządzeniu? Istniejące ustawienia tego urządzenia zostaną nadpisane."
saveConfirm: "Zapisać kopię zapasową jako {name}?"
deleteConfirm: "Usunąć kopię zapasową {name}?"
renameConfirm: "Zmienić nazwę kopii zapasowej z \"{old}\" na \"{new}\"?"
createdAt: "Utworzony w: {date} {time}"
updatedAt: "Zaktualizowano w: {date} {time}"
cannotLoad: "Ładowanie nie powiodło się"
invalidFile: "Nieprawidłowy format pliku"
_registry: _registry:
scope: "Zakres" scope: "Zakres"
key: "Klucz" key: "Klucz"
@ -822,10 +937,13 @@ _mfm:
bold: "Pogrubienie" bold: "Pogrubienie"
boldDescription: "Wyróżnia litery pogrubiając je." boldDescription: "Wyróżnia litery pogrubiając je."
small: "Małe" small: "Małe"
smallDescription: "Wyświetla treść jako małą i cienką."
center: "Wyśrodkowanie" center: "Wyśrodkowanie"
centerDescription: "Wyśrodkowuje zawartość." centerDescription: "Wyśrodkowuje zawartość."
inlineCode: "Kod (w wierszu)"
blockCode: "Kod (blok)" blockCode: "Kod (blok)"
blockCodeDescription: "Wyświetla kod z podświetlaną składnią składający się z wielu linii." blockCodeDescription: "Wyświetla kod z podświetlaną składnią składający się z wielu linii."
blockMath: "Matematyka (Blok)"
quote: "Cytuj" quote: "Cytuj"
quoteDescription: "Wyświetla treść jako cytat." quoteDescription: "Wyświetla treść jako cytat."
emoji: "Niestandardowe emoji" emoji: "Niestandardowe emoji"
@ -834,6 +952,20 @@ _mfm:
searchDescription: "Wyświetla pole wyszukiwania z wcześniej wpisanym tekstem." searchDescription: "Wyświetla pole wyszukiwania z wcześniej wpisanym tekstem."
flip: "Odwróć" flip: "Odwróć"
flipDescription: "Przerzuca treść poziomo lub pionowo." flipDescription: "Przerzuca treść poziomo lub pionowo."
jelly: "Animacja (Galaretka)"
jellyDescription: "Nadaje treści galaretowatą animację."
tada: "Animation (Tada)"
tadaDescription: "Nadaje treści animację podobną do \"Tada!\"."
jump: "Animacja (Skok)"
jumpDescription: "Nadaje treści animację skakania."
bounce: "Animacja (Odbijanie)"
bounceDescription: "Nadaje treści animację odbijania się."
shake: "Animacja (Wstrząsanie)"
shakeDescription: "Nadaje treści animację wstrząsania."
twitch: "Animacja (Drganie)"
twitchDescription: "Nadaje treści mocno drgającą animację."
spin: "Animacja (Obrót)"
spinDescription: "Nadaje treści animację obracania."
x2: "Duże" x2: "Duże"
x2Description: "Czyni treść większą." x2Description: "Czyni treść większą."
x3: "Bardzo duże" x3: "Bardzo duże"
@ -841,9 +973,17 @@ _mfm:
x4: "Ogromne" x4: "Ogromne"
x4Description: "Czyni treść jeszcze większą niż jeszcze większa." x4Description: "Czyni treść jeszcze większą niż jeszcze większa."
blur: "Rozmycie" blur: "Rozmycie"
blurDescription: "Rozmywa treść. Zostanie wyraźnie wyświetlona po najechaniu."
font: "Czcionka" font: "Czcionka"
fontDescription: "Wybiera czcionkę do wyświetlania treści." fontDescription: "Wybiera czcionkę do wyświetlania treści."
rainbow: "Tęcza"
rainbowDescription: "Sprawia, że zawartość pojawia się w kolorach tęczy."
sparkle: "Blask"
sparkleDescription: "Nadaje zawartości efekt lśniącego brokatu."
rotate: "Obróć" rotate: "Obróć"
rotateDescription: "Obraca zawartość o określony kąt."
plain: "Zwyczajny"
plainDescription: "Wyłącza efekty wszystkich MFM zawartych w tym efekcie MFM."
_instanceTicker: _instanceTicker:
none: "Nigdy nie pokazuj" none: "Nigdy nie pokazuj"
remote: "Pokaż dla zdalnych użytkowników" remote: "Pokaż dla zdalnych użytkowników"
@ -863,6 +1003,7 @@ _channel:
usersCount: "{n} uczestnicy" usersCount: "{n} uczestnicy"
notesCount: "{n} wpisy" notesCount: "{n} wpisy"
_menuDisplay: _menuDisplay:
top: "Góra"
hide: "Ukryj" hide: "Ukryj"
_wordMute: _wordMute:
muteWords: "Słowo do wyciszenia" muteWords: "Słowo do wyciszenia"
@ -870,6 +1011,9 @@ _wordMute:
soft: "Łagodny" soft: "Łagodny"
hard: "Twardy" hard: "Twardy"
mutedNotes: "Wyciszone wpisy" mutedNotes: "Wyciszone wpisy"
_instanceMute:
title: "Ukrywa wpisy z wymienionych instancji."
heading: "Lista instancji do wyciszenia"
_theme: _theme:
explore: "Przeglądaj motywy" explore: "Przeglądaj motywy"
install: "Zainstaluj motyw" install: "Zainstaluj motyw"
@ -950,6 +1094,7 @@ _sfx:
notification: "Powiadomienia" notification: "Powiadomienia"
chat: "Wiadomości" chat: "Wiadomości"
chatBg: "Rozmowy (tło)" chatBg: "Rozmowy (tło)"
antenna: "Anteny"
channel: "Powiadomienia kanału" channel: "Powiadomienia kanału"
_ago: _ago:
future: "W przyszłości" future: "W przyszłości"
@ -969,12 +1114,30 @@ _time:
_tutorial: _tutorial:
title: "Jak korzystać z Misskey" title: "Jak korzystać z Misskey"
step1_1: "Witaj!" step1_1: "Witaj!"
step1_2: "Ta strona nazywa się „oś czasu”. Pokazuje chronologicznie uporządkowane wpisy osób, które „śledzisz”."
step1_3: "Twoja oś czasu jest jeszcze pusta, ponieważ nie opublikowałeś(-aś) jeszcze żadnych wpisów i nie obserwujesz jeszcze nikogo." step1_3: "Twoja oś czasu jest jeszcze pusta, ponieważ nie opublikowałeś(-aś) jeszcze żadnych wpisów i nie obserwujesz jeszcze nikogo."
step2_1: "Ukończmy konfigurację profilu zanim utworzymy wpis lub zaczniemy kogoś obserwować." step2_1: "Ukończmy konfigurację profilu zanim utworzymy wpis lub zaczniemy kogoś obserwować."
step2_2: "Podanie pewnych informacji o tym, kim jesteś, ułatwi innym określenie, czy chcą widzieć Twoje wpisy lub Cię obserwować."
step3_1: "Zakończyłeś(-aś) konfigurację profilu?" step3_1: "Zakończyłeś(-aś) konfigurację profilu?"
step3_2: "Następnie spróbujmy opublikować wpis. Możesz to zrobić, naciskając przycisk z ikoną ołówka na ekranie."
step3_3: "Wypełnij pole i kliknij przycisk w prawym górnym rogu by wysłać post." step3_3: "Wypełnij pole i kliknij przycisk w prawym górnym rogu by wysłać post."
step3_4: "Nie masz nic do powiedzenia? Spróbuj \"ustawiam swój misskey\"!"
step4_1: "Zakończyłeś publikowanie pierwszego wpisu?"
step4_2: "Hurra! Teraz Twój pierwszy wpis powinien być wyświetlany na Twojej osi czasu."
step5_1: "Teraz spróbujmy ożywić Twoją oś czasu, przez zaobserwowanie innych ludzi."
step5_2: "{featured} pokaże Ci popularne wpisy na tej instancji. {explore} pozwoli Ci znaleźć popularnych użytkowników. Spróbuj znaleźć tam osoby, które chcesz obserwować!"
step5_3: "Aby obserwować innych użytkowników, kliknij ich ikonę i naciśnij przycisk \"Obserwuj\" na ich profilu."
step5_4: "Jeśli inny użytkownik ma ikonę kłódki obok swojej nazwy, może minąć trochę czasu, zanim ten użytkownik ręcznie zatwierdzi Twoją prośbę o obserwowanie."
step6_1: "Powinieneś teraz widzieć wpisy innych użytkowników na swojej osi czasu."
step6_2: "Możesz także umieścić „reakcje” na wpisach innych osób, aby szybko na nie odpowiedzieć."
step6_3: "Aby dodać \"reakcję\", naciśnij znak \"+\" na wpisie innego użytkownika i wybierz emotikonę, którą chcesz zareagować."
step7_1: "Gratulacje! Ukończyłeś podstawowy samouczek Misskey."
step7_2: "Jeśli chcesz dowiedzieć się więcej o Misskey, wypróbuj sekcję {help}."
step7_3: "A teraz powodzenia i baw się dobrze z Misskey! 🚀"
_2fa: _2fa:
alreadyRegistered: "Zarejestrowałeś już urządzenie do uwierzytelniania dwuskładnikowego."
registerDevice: "Zarejestruj nowe urządzenie" registerDevice: "Zarejestruj nowe urządzenie"
registerKey: "Zarejestruj klucz bezpieczeństwa"
step1: "Najpierw, zainstaluj aplikację uwierzytelniającą (taką jak {a} lub {b}) na swoim urządzeniu." step1: "Najpierw, zainstaluj aplikację uwierzytelniającą (taką jak {a} lub {b}) na swoim urządzeniu."
step2: "Następnie, zeskanuje kod QR z ekranu." step2: "Następnie, zeskanuje kod QR z ekranu."
step3: "Wprowadź token podany w aplikacji, aby ukończyć konfigurację." step3: "Wprowadź token podany w aplikacji, aby ukończyć konfigurację."
@ -990,6 +1153,7 @@ _permissions:
"write:favorites": "Edycja Twojej listy ulubionych." "write:favorites": "Edycja Twojej listy ulubionych."
"read:following": "Wyświetlanie informacji o obserwowanych" "read:following": "Wyświetlanie informacji o obserwowanych"
"write:following": "Obserwowanie lub cofanie obserwacji innych kont" "write:following": "Obserwowanie lub cofanie obserwacji innych kont"
"read:messaging": "Zobacz swoje czaty"
"read:mutes": "Wyświetlanie listy osób, które wyciszyłeś(-aś)" "read:mutes": "Wyświetlanie listy osób, które wyciszyłeś(-aś)"
"write:mutes": "Edycja listy osób, które wyciszyłeś(-aś)" "write:mutes": "Edycja listy osób, które wyciszyłeś(-aś)"
"read:notifications": "Wyświetlanie powiadomień" "read:notifications": "Wyświetlanie powiadomień"
@ -1003,6 +1167,10 @@ _permissions:
"write:page-likes": "Edycja polubień na stronach" "write:page-likes": "Edycja polubień na stronach"
"read:user-groups": "Wyświetlanie grup użytkownika" "read:user-groups": "Wyświetlanie grup użytkownika"
"write:user-groups": "Edycja lub usuwanie grup użytkownika" "write:user-groups": "Edycja lub usuwanie grup użytkownika"
"read:channels": "Zobacz swoje kanały"
"write:channels": "Edytuj swoje kanały"
"read:gallery": "Zobacz swoją galerię"
"write:gallery": "Edytuj swoją galerię"
_auth: _auth:
shareAccess: "Czy chcesz autoryzować „{name}” do dostępu do tego konta?" shareAccess: "Czy chcesz autoryzować „{name}” do dostępu do tego konta?"
permissionAsk: "Ta aplikacja wymaga następujących uprawnień:" permissionAsk: "Ta aplikacja wymaga następujących uprawnień:"
@ -1021,12 +1189,21 @@ _widgets:
calendar: "Kalendarz" calendar: "Kalendarz"
trends: "Na czasie" trends: "Na czasie"
clock: "Zegar" clock: "Zegar"
rss: "Czytnik RSS"
activity: "Aktywność" activity: "Aktywność"
photos: "Zdjęcia" photos: "Zdjęcia"
digitalClock: "Zegar cyfrowy"
unixClock: "Zegar UNIX"
federation: "Federacja" federation: "Federacja"
postForm: "Utwórz wpis" instanceCloud: "Chmura instancji"
postForm: "Formularz tworzenia wpisu"
slideshow: "Pokaz slajdów"
button: "Przycisk" button: "Przycisk"
onlineUsers: "Użytkownicy online"
jobQueue: "Kolejka zadań" jobQueue: "Kolejka zadań"
serverMetric: "Metryka serwera"
aiscript: "Konsola AiScript"
aichan: "Ai"
_cw: _cw:
hide: "Ukryj" hide: "Ukryj"
show: "Załaduj więcej" show: "Załaduj więcej"
@ -1393,9 +1570,11 @@ _notification:
youReceivedFollowRequest: "Otrzymałeś(-aś) prośbę o możliwość obserwacji" youReceivedFollowRequest: "Otrzymałeś(-aś) prośbę o możliwość obserwacji"
yourFollowRequestAccepted: "Twoja prośba o możliwość obserwacji została przyjęta" yourFollowRequestAccepted: "Twoja prośba o możliwość obserwacji została przyjęta"
youWereInvitedToGroup: "Zaproszony(-a) do grupy" youWereInvitedToGroup: "Zaproszony(-a) do grupy"
pollEnded: "Wyniki ankiety stały się dostępne"
emptyPushNotificationMessage: "Powiadomienia push zostały zaktualizowane"
_types: _types:
all: "Wszystkie" all: "Wszystkie"
follow: "Obserwowani" follow: "Nowi obserwujący"
mention: "Wspomnij" mention: "Wspomnij"
reply: "Odpowiedzi" reply: "Odpowiedzi"
renote: "Udostępnij" renote: "Udostępnij"
@ -1407,12 +1586,14 @@ _notification:
groupInvited: "Zaproszono do grup" groupInvited: "Zaproszono do grup"
app: "Powiadomienia z aplikacji" app: "Powiadomienia z aplikacji"
_actions: _actions:
followBack: "zaobserwował cię z powrotem"
reply: "Odpowiedz" reply: "Odpowiedz"
renote: "Udostępnij" renote: "Udostępnij"
_deck: _deck:
alwaysShowMainColumn: "Zawsze pokazuj główną kolumnę" alwaysShowMainColumn: "Zawsze pokazuj główną kolumnę"
columnAlign: "Wyrównaj kolumny" columnAlign: "Wyrównaj kolumny"
addColumn: "Dodaj kolumnę" addColumn: "Dodaj kolumnę"
configureColumn: "Ustawienia kolumny"
swapLeft: "Przesuń w lewo" swapLeft: "Przesuń w lewo"
swapRight: "Przesuń w prawo" swapRight: "Przesuń w prawo"
swapUp: "Zamień z powyższym" swapUp: "Zamień z powyższym"
@ -1420,6 +1601,9 @@ _deck:
stackLeft: "Przypnij do lewej" stackLeft: "Przypnij do lewej"
popRight: "Odepnij w prawo" popRight: "Odepnij w prawo"
profile: "Profil" profile: "Profil"
newProfile: "Nowy profil"
deleteProfile: "Usuń profil"
widgetsIntroduction: "Wybierz \"Edytuj widżety\" w menu kolumny i dodaj widżet."
_columns: _columns:
main: "Główna" main: "Główna"
widgets: "Widżety" widgets: "Widżety"

View File

@ -562,6 +562,7 @@ author: "Автор"
leaveConfirm: "Вы не сохранили изменения. Хотите выйти и потерять их?" leaveConfirm: "Вы не сохранили изменения. Хотите выйти и потерять их?"
manage: "Управление" manage: "Управление"
plugins: "Расширения" plugins: "Расширения"
preferencesBackups: "Резервная копия"
deck: "Пульт" deck: "Пульт"
undeck: "Покинуть пульт" undeck: "Покинуть пульт"
useBlurEffectForModal: "Размывка под формой поверх всего" useBlurEffectForModal: "Размывка под формой поверх всего"

View File

@ -562,6 +562,7 @@ author: "ผู้เขียน"
leaveConfirm: "คุณมีการเปลี่ยนแปลงที่ไม่ได้บันทึกนะ นายต้องการทิ้งการเปลี่ยนแปลงเหล่านั้นหรอ?" leaveConfirm: "คุณมีการเปลี่ยนแปลงที่ไม่ได้บันทึกนะ นายต้องการทิ้งการเปลี่ยนแปลงเหล่านั้นหรอ?"
manage: "การจัดการ" manage: "การจัดการ"
plugins: "ปลั๊กอิน" plugins: "ปลั๊กอิน"
preferencesBackups: "ตั้งค่าการสำรองข้อมูล"
deck: "เด็ค" deck: "เด็ค"
undeck: "ออกจากเด็ค" undeck: "ออกจากเด็ค"
useBlurEffectForModal: "ใช้เอฟเฟกต์เบลอสำหรับโมดอล" useBlurEffectForModal: "ใช้เอฟเฟกต์เบลอสำหรับโมดอล"
@ -598,7 +599,7 @@ wordMute: "ปิดเสียงคำ"
regexpError: "ข้อผิดพลาดของนิพจน์ทั่วไป" regexpError: "ข้อผิดพลาดของนิพจน์ทั่วไป"
regexpErrorDescription: "เกิดข้อผิดพลาดในนิพจน์ทั่วไปในบรรทัดที่ {line} ของการปิดเสียงคำ {tab} ของคุณ:" regexpErrorDescription: "เกิดข้อผิดพลาดในนิพจน์ทั่วไปในบรรทัดที่ {line} ของการปิดเสียงคำ {tab} ของคุณ:"
instanceMute: "ปิดเสียง อินสแตนซ์" instanceMute: "ปิดเสียง อินสแตนซ์"
userSaysSomething: "{ชื่อ} พูดอะไรบางอย่าง" userSaysSomething: "{name} พูดอะไรบางอย่าง"
makeActive: "เปิดใช้งาน" makeActive: "เปิดใช้งาน"
display: "แสดงผล" display: "แสดงผล"
copy: "คัดลอก" copy: "คัดลอก"
@ -913,13 +914,89 @@ _ffVisibility:
_signup: _signup:
almostThere: "เกือบจะมี" almostThere: "เกือบจะมี"
emailAddressInfo: "โปรดกรอกอีเมลของคุณ มันจะไม่เปิดเผยต่อสาธารณะ" emailAddressInfo: "โปรดกรอกอีเมลของคุณ มันจะไม่เปิดเผยต่อสาธารณะ"
emailSent: "เราได้ส่งอีเมลยืนยันไปยังที่อยู่อีเมลของคุณแล้วนะ ({email}) โปรดคลิกลิงก์ที่รวมไว้เพื่อสร้างบัญชีให้เสร็จสิ้น"
_accountDelete:
accountDelete: "ลบบัญชีผู้ใช้"
mayTakeTime: "เนื่องจากการลบบัญชีนี้จะเป็นกระบวนการที่ต้องใช้ทรัพยากรมาก จึงอาจจะต้องใช้เวลาสักครู่ถึงจะเสร็จสมบูรณ์ ทั้งนี้ขึ้นอยู่กับจำนวนเนื้อหาที่คุณสร้างและจำนวนไฟล์ที่คุณอัปโหลดนะ"
sendEmail: "เมื่อการลบบัญชีนี้เสร็จสิ้น เราอาจจะส่งอีเมลไปยังที่อยู่อีเมลของคุณที่เคยลงทะเบียนไว้กับบัญชีนี้นะ"
requestAccountDelete: "ร้องขอให้ลบบัญชี"
started: "การลบได้เริ่มต้นขึ้น"
inProgress: "ปัจจุบันกำลังดำเนินการลบอยู่"
_ad: _ad:
back: "ย้อนกลับ" back: "ย้อนกลับ"
reduceFrequencyOfThisAd: "แสดงโฆษณานี้ให้น้อยลง"
_forgotPassword:
enterEmail: "ป้อนที่อยู่อีเมลที่คุณเคยใช้ในการลงทะเบียนไว้ ลิงก์ที่คุณสามารถรีเซ็ตรหัสผ่านได้นั้นจะถูกส่งไปนะ"
ifNoEmail: "ถ้าหากคุณไม่ได้ใช้อีเมลระหว่างการลงทะเบียน กรุณาติดต่อผู้ดูแลระบบอินสแตนซ์แทนนะ"
contactAdmin: "อินสแตนซ์นี้ไม่รองรับการใช้งานที่อยู่อีเมลนี้ กรุณาติดต่อผู้ดูแลระบบอินสแตนซ์เพื่อรีเซ็ตรหัสผ่านของคุณแทน"
_gallery:
my: "แกลลอรี่ของฉัน"
liked: "โพสต์ที่ถูกใจ"
like: "ชื่นชอบ"
unlike: "ลบไลค์"
_email: _email:
_follow: _follow:
title: "ได้ติดตามคุณ" title: "ได้ติดตามคุณ"
_receiveFollowRequest:
title: "คุณได้รับคำขอติดตาม"
_plugin:
install: "ติดตั้งปลั๊กอิน"
installWarn: "กรุณาอย่าติดตั้งปลั๊กอินที่ไม่น่าเชื่อถือนะคะ"
manage: "จัดการปลั๊กอิน"
_preferencesBackups:
list: "สร้างการสำรองข้อมูล"
saveNew: "บันทึกใหม่"
loadFile: "โหลดจากไฟล์"
apply: "นำไปใช้กับอุปกรณ์นี้"
save: "บันทึก"
inputName: "กรุณาป้อนชื่อสำหรับข้อมูลสำรองนี้"
cannotSave: "การบันทึกล้มเหลว"
nameAlreadyExists: "มีข้อมูลสำรองชื่อ \"{name}\" นี้อยู่แล้ว กรุณาป้อนชื่ออื่นนะ"
applyConfirm: "คุณต้องการใช้ข้อมูลสำรอง \"{name}\" กับอุปกรณ์นี้อย่างงั้นจริงหรอ การตั้งค่าที่มีอยู่ของอุปกรณ์นี้จะถูกเขียนทับนะ"
saveConfirm: "บันทึกข้อมูลสำรองเป็น {name} มั้ย?"
deleteConfirm: "ลบข้อมูลสำรอง {name} มั้ย?"
renameConfirm: "เปลี่ยนชื่อข้อมูลสำรองนี้จาก \"{old}\" เป็น \"{new}\" หรือป่าว"
noBackups: "ไม่มีข้อมูลสำรองนะ คุณสามารถสำรองข้อมูลการตั้งค่าไคลเอนต์ของคุณบนเซิร์ฟเวอร์นี้โดยใช้ \"สร้างการสำรองข้อมูลใหม่\"ได้นะ"
createdAt: "สร้างเมื่อ: {date} {time}"
updatedAt: "อัปเดตเมื่อ: {date} {time}"
cannotLoad: "การโหลดล้มเหลว"
invalidFile: "รูปแบบไฟล์ไม่ถูกต้องนะ"
_registry:
scope: "สโคป"
key: "คีย์"
keys: "คีย์"
domain: "โดเมน"
createKey: "สร้างคีย์"
_aboutMisskey:
about: "Misskey เป็นซอฟต์แวร์โอเพ่นซอร์สที่ถูกพัฒนาโดย Syuilo ตั้งแต่ปี 2014"
contributors: "ผู้สนับสนุนหลัก"
allContributors: "ผู้มีส่วนร่วมทั้งหมด"
source: "ซอร์สโค้ด"
translation: "รับแปลภาษา Misskey"
donate: "บริจาคให้กับ Misskey"
morePatrons: "เราขอขอบคุณสำหรับความช่วยเหลือจากผู้ช่วยอื่นๆ ที่ไม่ได้ระบุไว้ที่นี่นะ ขอขอบคุณ! 🥰"
patrons: "สมาชิกพันธมิตร"
_nsfw:
respect: "ซ่อนสื่อ NSFW"
ignore: "อย่าซ่อนสื่อ NSFW"
force: "ซ่อนสื่อทั้งหมด"
_mfm: _mfm:
cheatSheet: "โค้ด MFM Cheat Sheet"
intro: "MFM เป็นภาษามาร์กอัปพิเศษเฉพาะของ Misskey ที่สามารถใช้ได้ในหลายที่ คุณยังสามารถดูรายการไวยากรณ์ MFM ที่มีอยู่ทั้งหมดได้ที่นี่นะ"
dummy: "Misskey ขยายโลกของ Fediverse"
mention: "กล่าวถึง" mention: "กล่าวถึง"
mentionDescription: "คุณสามารถระบุผู้ใช้โดยใช้ At-Symbol และชื่อผู้ใช้ได้นะ"
hashtag: "แฮชแท็ก"
hashtagDescription: "คุณสามารถระบุชื่อแฮชแท็กได้โดยใช้เครื่องหมายตัวเลขและข้อความได้นะ"
url: "URL"
urlDescription: "สามารถแสดง URL ได้นะ"
link: "ลิงก์"
linkDescription: "เจาะจงเฉพาะ ส่วนของข้อความที่สามารถแสดงเป็น URL ได้"
bold: "ตัวหนา"
boldDescription: "ไฮไลท์ตัวอักษรโดยทำให้หนาขึ้น"
small: "ขนาดเล็ก"
smallDescription: "แสดงผลเนื้อหาขนาดเล็กและบาง"
center: "เซ็นเตอร์"
centerDescription: "แสดงผลเนื้อหาเป็นศูนย์กลาง" centerDescription: "แสดงผลเนื้อหาเป็นศูนย์กลาง"
inlineCode: "โค้ด (อินไลน์)" inlineCode: "โค้ด (อินไลน์)"
inlineCodeDescription: "แสดงผลการเน้นไวยากรณ์แบบอินไลน์สำหรับโค้ด (โปรแกรม)" inlineCodeDescription: "แสดงผลการเน้นไวยากรณ์แบบอินไลน์สำหรับโค้ด (โปรแกรม)"
@ -936,9 +1013,117 @@ _mfm:
search: "ค้นหา" search: "ค้นหา"
searchDescription: "แสดงผลกล่องค้นหาพร้อมกับข้อความที่ป้อนไว้ล่วงหน้า" searchDescription: "แสดงผลกล่องค้นหาพร้อมกับข้อความที่ป้อนไว้ล่วงหน้า"
flip: "พลิก" flip: "พลิก"
flipDescription: "พลิกเนื้อหาในแนวนอนหรือแนวตั้ง"
jelly: "แอนิเมชั่น (เยลลี่)"
jellyDescription: "ให้เนื้อหาเป็นแอนิเมชั่นเหมือนเยลลี่"
tada: "แอนิเมชั่น (ธาดา)"
tadaDescription: "ให้เนื้อหาเป็นแอนิเมชั่นเหมือน \"ทาด้า!\""
jump: "อนิเมชั่น (กระโดด)"
jumpDescription: "ให้เนื้อหามีภาพเคลื่อนไหวแบบกระโดด"
bounce: "อนิเมชั่น (เด้ง)"
bounceDescription: "ให้เนื้อหามีอนิเมชั่นเด้ง"
shake: "อนิเมชั่น (เขย่า)"
shakeDescription: "ให้เนื้อหามีภาพเคลื่อนไหวสั่น"
twitch: "แอนิเมชั่น (Twitch)"
twitchDescription: "ให้เนื้อหามีแอนิเมชั่นกระตุกอย่างแรง"
spin: "แอนิเมชั่น (สปิน)"
spinDescription: "ให้เนื้อหาเป็นภาพเคลื่อนไหวแบบหมุน"
x2: "ขนาดใหญ่"
x2Description: "แสดงเนื้อหาที่ใหญ่ขึ้น"
x3: "ใหญ่มาก"
x3Description: "แสดงเนื้อหาอีเว้นท์ที่ใหญ่ขึ้น"
x4: "ใหญ่อย่างไม่น่าเชื่อ"
x4Description: "แสดงผลเนื้อหาที่ใหญ่กว่าใหญ่กว่าขนาดใหญ่"
blur: "เบลอ"
blurDescription: "เบลอเนื้อหา จะแสดงผลอย่างชัดเจนต่อเมื่อวางเมาส์เหนือ"
font: "ตัวอักษร"
fontDescription: "ตั้งค่าตัวอักษรเพื่อแสดงเนื้อหาใน"
rainbow: "สายรุ้ง"
rainbowDescription: "ทำให้เนื้อหานั้นปรากฏเป็นสีรุ้ง"
sparkle: "กลิตเตอร์"
sparkleDescription: "ให้เนื้อหานั้นมีเอฟเฟกต์แบบอนุภาคประกาย"
rotate: "หมุนหน้าจอ"
rotateDescription: "เปลี่ยนเนื้อหาตามด้วยมุมที่ระบุไว้"
plain: "เรียบง่าย"
plainDescription: "ปิดการใช้งานเอฟเฟกต์ของ MFM ทั้งหมดที่มีอยู่ในเอฟเฟกต์ MFM นี้"
_instanceTicker:
none: "ไม่ต้องแสดง"
remote: "แสดงสำหรับผู้ใช้ระยะไกล"
always: "แสดงเสมอ"
_serverDisconnectedBehavior:
reload: "โหลดใหม่โดยอัตโนมัติ"
dialog: "แสดงกล่องโต้ตอบคำเตือน"
quiet: "แสดงคำเตือนที่ไม่เป็นการรบกวน"
_channel:
create: "สร้างแชนแนลใหม่"
edit: "แก้ไขแชนแนล"
setBanner: "เซตแบนเนอร์"
removeBanner: "ลบแบนเนอร์"
featured: "เทรนด์"
owned: "เจ้าของ"
following: "ติดตามแล้ว"
usersCount: "{n} ผู้เข้าร่วม"
notesCount: "{n} โน้ต"
_menuDisplay:
sideFull: "ด้านข้าง"
sideIcon: "ด้านข้าง (ไอคอน)"
top: "ท็อป"
hide: "ซ่อน"
_wordMute:
muteWords: "ปิดเสียงคำ"
muteWordsDescription: "คั่นด้วยช่องว่างสำหรับเงื่อนไข AND หรือด้วยการขึ้นบรรทัดใหม่สำหรับเงื่อนไข OR นะ"
muteWordsDescription2: "ล้อมรอบคีย์เวิร์ดด้วยเครื่องหมายทับเพื่อใช้นิพจน์ทั่วไป"
softDescription: "ซ่อนโน้ตให้ตรงตามเงื่อนไขที่ตั้งไว้จากไทม์ไลน์"
hardDescription: "ป้องกันไม่ให้โน้ตย่อที่ตรงตามเงื่อนไขที่ตั้งไว้ไม่ให้ถูกเพิ่มลงในไทม์ไลน์ นอกจากนี้ โน้ตเหล่านี้จะไม่ถูกเพิ่มลงในไทม์ไลน์แม้ว่าจะมีการเปลี่ยนแปลงเงื่อนไขยังไงก็ตาม"
soft: "ซอฟ"
hard: "ยาก"
mutedNotes: "ปิดเสียงโน้ต"
_instanceMute:
instanceMuteDescription: "การดำเนินการนี้จะปิดเสียง\"โน้ต/รีโน้ต\"จากอินสแตนซ์ที่อยู่ในรายการ รวมถึงบันทึกของผู้ใช้ที่ตอบกลับผู้ใช้จากอินสแตนซ์ที่ปิดเสียง"
instanceMuteDescription2: "คั่นด้วยการขึ้นบรรทัดใหม่"
title: "ซ่อนโน้ตจากอินสแตนซ์ที่มีอยู่ในรายการ"
heading: "รายชื่ออินสแตนซ์ที่ถูกปิดเสียง"
_theme: _theme:
explore: "สำรวจธีม"
install: "ติดตั้งธีม"
manage: "จัดการธีม"
code: "โค้ดธีม"
description: "รายละเอียด" description: "รายละเอียด"
installed: "{name} ได้รับการติดตั้ง"
installedThemes: "ธีมที่ติดตั้ง"
builtinThemes: "ธีมในตัว"
alreadyInstalled: "ธีมนี้ได้รับการติดตั้งแล้ว"
invalid: "รูปแบบของธีมนี้ไม่ถูกต้องนะ"
make: "ทำธีม"
base: "ฐาน"
addConstant: "เพิ่มค่าคงที่"
constant: "ตัวแปร"
defaultValue: "ค่าเริ่มต้น"
color: "สี"
refProp: "อ้างอิงคุณสมบัติ"
refConst: "อ้างอิงค่าคงที่"
key: "คีย์"
func: "ฟังก์ชัน"
funcKind: "ประเภทฟังก์ชัน"
argument: "อากิวเม้นต์"
basedProp: "ทรัพย์สินอ้างอิง"
alpha: "ความทึบแสง"
darken: "มืดลง"
lighten: "สว่าง"
inputConstantName: "ป้อนชื่อสำหรับค่าคงที่นี้"
importInfo: "ถ้าหากต้องการป้อนโค้ดที่นี่ คุณยังสามารถนำเข้าไปยังโปรแกรมแก้ไขธีมได้"
deleteConstantConfirm: "คุณต้องการลบค่าคงที่ {const} หรือป่าว?"
keys: keys:
accent: "เน้น"
bg: "ภาพพื้นหลัง"
fg: "ข้อความ"
focus: "โฟกัส"
indicator: "ตัวบ่งชี้"
panel: "แผงควบคุม"
shadow: "เงา"
header: "ส่วนหัว"
navBg: "พื้นหลังแถบด้านข้าง"
navFg: "ข้อความแถบด้านข้าง"
mention: "กล่าวถึง" mention: "กล่าวถึง"
renote: "รีโน้ต" renote: "รีโน้ต"
divider: "ตัวแบ่ง" divider: "ตัวแบ่ง"

View File

@ -141,7 +141,7 @@ cacheRemoteFilesDescription: "当禁用此设定时远程文件将直接从远
flagAsBot: "这是一个机器人账号" flagAsBot: "这是一个机器人账号"
flagAsBotDescription: "如果此帐户由程序控制请启用此项。启用后此标志可以帮助其他开发人员防止机器人之间产生无限互动的行为并让Misskey的内部系统将此帐户识别为机器人。" flagAsBotDescription: "如果此帐户由程序控制请启用此项。启用后此标志可以帮助其他开发人员防止机器人之间产生无限互动的行为并让Misskey的内部系统将此帐户识别为机器人。"
flagAsCat: "将这个账户设定为一只猫" flagAsCat: "将这个账户设定为一只猫"
flagAsCatDescription: "如果您想表明此帐户是一只猫,请打开此标志。" flagAsCatDescription: "如果您想表明此帐户是一只猫,请打开此标志。\n开启后会在您的头像上出现猫耳朵并将你的帖子中的「na」替换为「nya」日文同理。"
flagShowTimelineReplies: "在时间线上显示帖子的回复" flagShowTimelineReplies: "在时间线上显示帖子的回复"
flagShowTimelineRepliesDescription: "启用时,时间线除了显示用户的帖子外,还会显示其他用户对帖子的回复。" flagShowTimelineRepliesDescription: "启用时,时间线除了显示用户的帖子外,还会显示其他用户对帖子的回复。"
autoAcceptFollowed: "自动允许关注者的关注" autoAcceptFollowed: "自动允许关注者的关注"
@ -252,7 +252,7 @@ messageRead: "已读"
noMoreHistory: "没有更多的历史记录" noMoreHistory: "没有更多的历史记录"
startMessaging: "添加聊天" startMessaging: "添加聊天"
nUsersRead: "{n}人已读" nUsersRead: "{n}人已读"
agreeTo: "{0}勾选则表示已阅读并同意" agreeTo: "勾选则表示已阅读并同意{0}"
tos: "服务条款" tos: "服务条款"
start: "开始" start: "开始"
home: "首页" home: "首页"
@ -668,7 +668,7 @@ yes: "是"
no: "否" no: "否"
driveFilesCount: "网盘的文件数" driveFilesCount: "网盘的文件数"
driveUsage: "网盘的空间用量" driveUsage: "网盘的空间用量"
noCrawle: "要求搜索引擎不索引该站点" noCrawle: "要求搜索引擎不索引该用户"
noCrawleDescription: "要求搜索引擎不要收录(索引)您的用户页面,帖子,页面等。" noCrawleDescription: "要求搜索引擎不要收录(索引)您的用户页面,帖子,页面等。"
lockedAccountInfo: "即使通过了关注请求,只要您不将帖子可见范围设置成“关注者”,任何人都可以看到您的帖子。" lockedAccountInfo: "即使通过了关注请求,只要您不将帖子可见范围设置成“关注者”,任何人都可以看到您的帖子。"
alwaysMarkSensitive: "默认将媒体文件标记为敏感内容" alwaysMarkSensitive: "默认将媒体文件标记为敏感内容"
@ -747,7 +747,7 @@ userInfo: "用户信息"
unknown: "未知" unknown: "未知"
onlineStatus: "在线状态" onlineStatus: "在线状态"
hideOnlineStatus: "隐藏在线状态" hideOnlineStatus: "隐藏在线状态"
hideOnlineStatusDescription: "隐藏在线状态后,可能会降低例如搜索等功能的便利性。" hideOnlineStatusDescription: "隐藏在线状态后,可能会降低搜索等功能的便利性。"
online: "在线" online: "在线"
active: "活动" active: "活动"
offline: "离线" offline: "离线"

View File

@ -883,8 +883,8 @@ sensitiveMediaDetection: "敏感性媒體的檢測"
localOnly: "僅限本地" localOnly: "僅限本地"
remoteOnly: "僅限遠端" remoteOnly: "僅限遠端"
failedToUpload: "上傳失敗" failedToUpload: "上傳失敗"
cannotUploadBecauseInappropriate: "由於判定可能包含不適當的內容,因此無法上。" cannotUploadBecauseInappropriate: "由於判定可能包含不適當的內容,因此無法上。"
cannotUploadBecauseNoFreeSpace: "由於雲端硬碟沒有可用空間,因此無法上船>" cannotUploadBecauseNoFreeSpace: "由於雲端硬碟沒有可用空間,因此無法上傳。"
beta: "Beta" beta: "Beta"
enableAutoSensitive: "自動NSFW判定" enableAutoSensitive: "自動NSFW判定"
enableAutoSensitiveDescription: "如果可用,請利用機器學習在媒體上自動設置 NSFW 旗標。 即使關閉此功能,依實例而定也可能會自動設置。" enableAutoSensitiveDescription: "如果可用,請利用機器學習在媒體上自動設置 NSFW 旗標。 即使關閉此功能,依實例而定也可能會自動設置。"
@ -917,7 +917,7 @@ _signup:
emailSent: "已將確認郵件發送至您輸入的電子郵件地址 ({email})。請開啟電子郵件中的連結以完成帳戶創建。" emailSent: "已將確認郵件發送至您輸入的電子郵件地址 ({email})。請開啟電子郵件中的連結以完成帳戶創建。"
_accountDelete: _accountDelete:
accountDelete: "刪除帳戶" accountDelete: "刪除帳戶"
mayTakeTime: "刪除帳戶的處理負荷較大,如果帳戶產生的內容數量上的檔案數量較多的話,就需要花费一段時間才能完成。" mayTakeTime: "刪除帳戶的處理負荷較大,如果帳戶產生的內容數量上的檔案數量較多的話,就需要花费一段時間才能完成。"
sendEmail: "帳戶删除完成後,將向註冊地電子郵件地址發送通知。" sendEmail: "帳戶删除完成後,將向註冊地電子郵件地址發送通知。"
requestAccountDelete: "刪除帳戶請求" requestAccountDelete: "刪除帳戶請求"
started: "已開始刪除作業。" started: "已開始刪除作業。"

View File

@ -1,6 +1,6 @@
{ {
"name": "misskey", "name": "calckey",
"version": "12.118.1-calc.1", "version": "12.119.0-calc",
"codename": "aqua", "codename": "aqua",
"repository": { "repository": {
"type": "git", "type": "git",
@ -41,8 +41,8 @@
"dependencies": { "dependencies": {
"@bull-board/api": "^4.2.2", "@bull-board/api": "^4.2.2",
"@bull-board/ui": "^4.2.2", "@bull-board/ui": "^4.2.2",
"@tensorflow/tfjs": "^3.18.0", "@tensorflow/tfjs": "^3.20.0",
"eslint": "^8.20.0", "eslint": "^8.23.0",
"execa": "5.1.1", "execa": "5.1.1",
"gulp": "4.0.2", "gulp": "4.0.2",
"gulp-cssnano": "2.1.3", "gulp-cssnano": "2.1.3",
@ -54,13 +54,15 @@
"seedrandom": "^3.0.5" "seedrandom": "^3.0.5"
}, },
"devDependencies": { "devDependencies": {
"@swc/core": "^1.2.248",
"@types/gulp": "4.0.9", "@types/gulp": "4.0.9",
"@types/gulp-rename": "2.0.1", "@types/gulp-rename": "2.0.1",
"@typescript-eslint/parser": "5.33.0", "@typescript-eslint/parser": "5.36.2",
"cross-env": "7.0.3", "cross-env": "7.0.3",
"cypress": "10.4.0", "cypress": "10.7.0",
"start-server-and-test": "1.14.0", "start-server-and-test": "1.14.0",
"typescript": "4.7.4", "typescript": "4.8.3",
"vue-eslint-parser": "^9.0.2" "unplugin-swc": "^1.3.2",
"vue-eslint-parser": "^9.0.3"
} }
} }

BIN
packages/backend/assets/screenshots/1.webp (Stored with Git LFS) Normal file

Binary file not shown.

BIN
packages/backend/assets/screenshots/2.webp (Stored with Git LFS) Normal file

Binary file not shown.

View File

@ -10,11 +10,15 @@
"build": "tsc -p tsconfig.json || echo done. && tsc-alias -p tsconfig.json", "build": "tsc -p tsconfig.json || echo done. && tsc-alias -p tsconfig.json",
"watch": "node watch.mjs", "watch": "node watch.mjs",
"lint": "eslint --quiet \"src/**/*.ts\"", "lint": "eslint --quiet \"src/**/*.ts\"",
"mocha": "NODE_ENV=test TS_NODE_FILES=true TS_NODE_TRANSPILE_ONLY=true TS_NODE_PROJECT=\"./test/tsconfig.json\" mocha", "mocha": "cross-env NODE_ENV=test TS_NODE_FILES=true TS_NODE_TRANSPILE_ONLY=true TS_NODE_PROJECT=\"./test/tsconfig.json\" mocha",
"test": "yarn mocha" "test": "npm run mocha"
},
"resolutions": {
"chokidar": "^3.3.1",
"lodash": "^4.17.21"
}, },
"optionalDependencies": { "optionalDependencies": {
"@tensorflow/tfjs-node": "3.19.0" "@tensorflow/tfjs-node": "3.20.0"
}, },
"dependencies": { "dependencies": {
"@bull-board/koa": "4.2.2", "@bull-board/koa": "4.2.2",
@ -30,10 +34,10 @@
"archiver": "5.3.1", "archiver": "5.3.1",
"autobind-decorator": "2.4.0", "autobind-decorator": "2.4.0",
"autwh": "0.1.0", "autwh": "0.1.0",
"aws-sdk": "2.1194.0", "aws-sdk": "2.1213.0",
"bcryptjs": "2.4.3", "bcryptjs": "2.4.3",
"blurhash": "1.1.5", "blurhash": "1.1.5",
"bull": "4.8.5", "bull": "4.9.0",
"cacheable-lookup": "6.1.0", "cacheable-lookup": "6.1.0",
"cbor": "8.1.0", "cbor": "8.1.0",
"chalk": "5.0.1", "chalk": "5.0.1",
@ -42,7 +46,7 @@
"cli-highlight": "2.1.11", "cli-highlight": "2.1.11",
"color-convert": "2.0.1", "color-convert": "2.0.1",
"content-disposition": "0.5.4", "content-disposition": "0.5.4",
"date-fns": "2.29.1", "date-fns": "2.29.2",
"deep-email-validator": "0.1.21", "deep-email-validator": "0.1.21",
"escape-regexp": "0.0.1", "escape-regexp": "0.0.1",
"feed": "4.2.2", "feed": "4.2.2",
@ -58,7 +62,7 @@
"json5": "2.2.1", "json5": "2.2.1",
"json5-loader": "4.0.1", "json5-loader": "4.0.1",
"jsonld": "6.0.0", "jsonld": "6.0.0",
"jsrsasign": "10.5.26", "jsrsasign": "10.5.27",
"koa": "2.13.4", "koa": "2.13.4",
"koa-bodyparser": "4.3.0", "koa-bodyparser": "4.3.0",
"koa-favicon": "2.1.0", "koa-favicon": "2.1.0",
@ -72,15 +76,15 @@
"mime-types": "2.1.35", "mime-types": "2.1.35",
"misskey-js": "0.0.14", "misskey-js": "0.0.14",
"mocha": "10.0.0", "mocha": "10.0.0",
"multer": "1.4.4", "multer": "1.4.4-lts.1",
"nested-property": "4.0.0", "nested-property": "4.0.0",
"node-fetch": "3.2.10", "node-fetch": "3.2.10",
"nodemailer": "6.7.8", "nodemailer": "6.7.8",
"nsfwjs": "2.4.1", "nsfwjs": "2.4.2",
"oauth": "^0.9.15", "oauth": "^0.9.15",
"os-utils": "0.0.14", "os-utils": "0.0.14",
"parse5": "7.0.0", "parse5": "7.1.1",
"pg": "8.7.3", "pg": "8.8.0",
"private-ip": "2.3.4", "private-ip": "2.3.4",
"probe-image-size": "7.2.3", "probe-image-size": "7.2.3",
"promise-limit": "2.7.0", "promise-limit": "2.7.0",
@ -99,13 +103,13 @@
"s-age": "1.1.2", "s-age": "1.1.2",
"sanitize-html": "2.7.1", "sanitize-html": "2.7.1",
"semver": "7.3.7", "semver": "7.3.7",
"sharp": "0.30.6", "sharp": "0.30.7",
"speakeasy": "2.0.0", "speakeasy": "2.0.0",
"strict-event-emitter-types": "2.0.0", "strict-event-emitter-types": "2.0.0",
"stringz": "2.1.0", "stringz": "2.1.0",
"summaly": "2.7.0", "summaly": "2.7.0",
"syslog-pro": "1.0.0", "syslog-pro": "1.0.0",
"systeminformation": "5.12.5", "systeminformation": "5.12.6",
"tinycolor2": "1.4.2", "tinycolor2": "1.4.2",
"tmp": "0.2.1", "tmp": "0.2.1",
"ts-loader": "9.3.1", "ts-loader": "9.3.1",
@ -113,17 +117,17 @@
"tsc-alias": "1.7.0", "tsc-alias": "1.7.0",
"tsconfig-paths": "4.1.0", "tsconfig-paths": "4.1.0",
"twemoji-parser": "14.0.0", "twemoji-parser": "14.0.0",
"typeorm": "0.3.7", "typeorm": "0.3.9",
"ulid": "2.3.0", "ulid": "2.3.0",
"unzipper": "0.10.11", "unzipper": "0.10.11",
"uuid": "8.3.2", "uuid": "9.0.0",
"web-push": "3.5.0", "web-push": "3.5.0",
"websocket": "1.0.34", "websocket": "1.0.34",
"ws": "8.8.1", "ws": "8.8.1",
"xev": "3.0.2" "xev": "3.0.2"
}, },
"devDependencies": { "devDependencies": {
"@redocly/openapi-core": "1.0.0-beta.106", "@redocly/openapi-core": "1.0.0-beta.108",
"@types/bcryptjs": "2.4.2", "@types/bcryptjs": "2.4.2",
"@types/bull": "3.15.9", "@types/bull": "3.15.9",
"@types/cbor": "6.0.0", "@types/cbor": "6.0.0",
@ -145,13 +149,13 @@
"@types/koa__multer": "2.0.4", "@types/koa__multer": "2.0.4",
"@types/koa__router": "8.0.11", "@types/koa__router": "8.0.11",
"@types/mocha": "9.1.1", "@types/mocha": "9.1.1",
"@types/node": "18.7.2", "@types/node": "18.7.16",
"@types/node-fetch": "3.0.3", "@types/node-fetch": "3.0.3",
"@types/nodemailer": "6.4.5", "@types/nodemailer": "6.4.5",
"@types/oauth": "0.9.1", "@types/oauth": "0.9.1",
"@types/pug": "2.0.6", "@types/pug": "2.0.6",
"@types/punycode": "2.1.0", "@types/punycode": "2.1.0",
"@types/qrcode": "1.4.2", "@types/qrcode": "1.5.0",
"@types/random-seed": "0.3.3", "@types/random-seed": "0.3.3",
"@types/ratelimiter": "3.4.3", "@types/ratelimiter": "3.4.3",
"@types/redis": "4.0.11", "@types/redis": "4.0.11",
@ -167,13 +171,12 @@
"@types/web-push": "3.3.2", "@types/web-push": "3.3.2",
"@types/websocket": "1.0.5", "@types/websocket": "1.0.5",
"@types/ws": "8.5.3", "@types/ws": "8.5.3",
"@typescript-eslint/eslint-plugin": "5.33.0", "@typescript-eslint/eslint-plugin": "5.36.2",
"@typescript-eslint/parser": "5.33.0", "@typescript-eslint/parser": "5.36.2",
"cross-env": "7.0.3", "cross-env": "7.0.3",
"eslint": "8.21.0", "eslint": "8.23.0",
"eslint-plugin-import": "2.26.0", "eslint-plugin-import": "2.26.0",
"execa": "6.1.0", "execa": "6.1.0",
"form-data": "^4.0.0", "typescript": "4.8.3"
"typescript": "4.7.4"
} }
} }

View File

@ -63,8 +63,6 @@ export type Source = {
mediaProxy?: string; mediaProxy?: string;
proxyRemoteFiles?: boolean; proxyRemoteFiles?: boolean;
signToActivityPubGet?: boolean;
}; };
/** /**

View File

@ -1,7 +1,7 @@
import { Entity, Column, PrimaryColumn, ManyToOne, JoinColumn } from 'typeorm'; import { Entity, Column, PrimaryColumn, ManyToOne, JoinColumn } from 'typeorm';
import { id } from '../id.js'; import { id } from '../id.js';
import { User } from './user.js'; import { User } from './user.js';
import { Clip } from './clip.js'; import type { Clip } from './clip.js';
@Entity() @Entity()
export class Meta { export class Meta {
@ -98,22 +98,22 @@ export class Meta {
public blockedHosts: string[]; public blockedHosts: string[];
@Column('boolean', { @Column('boolean', {
default: false default: false,
}) })
public secureMode: boolean; public secureMode: boolean;
@Column('boolean', { @Column('boolean', {
default: false default: false,
}) })
public privateMode: boolean; public privateMode: boolean;
@Column('varchar', { @Column('varchar', {
length: 256, array: true, default: '{}' length: 256, array: true, default: '{}',
}) })
public allowedHosts: string[]; public allowedHosts: string[];
@Column('varchar', { @Column('varchar', {
length: 512, array: true, default: '{/featured,/channels,/explore,/pages,/about-misskey}', length: 512, array: true, default: '{/featured,/channels,/explore,/pages,/about-calckey}',
}) })
public pinnedPages: string[]; public pinnedPages: string[];

View File

@ -1,18 +1,19 @@
import { In } from 'typeorm';
import { publishMainStream } from '@/services/stream.js'; import { publishMainStream } from '@/services/stream.js';
import { pushNotification } from '@/services/push-notification.js'; import { pushNotification } from '@/services/push-notification.js';
import { User } from '@/models/entities/user.js'; import { User } from '@/models/entities/user.js';
import { Notification } from '@/models/entities/notification.js'; import { Notification } from '@/models/entities/notification.js';
import { Notifications, Users } from '@/models/index.js'; import { Notifications, Users } from '@/models/index.js';
import { In } from 'typeorm';
export async function readNotification( export async function readNotification(
userId: User['id'], userId: User['id'],
notificationIds: Notification['id'][] notificationIds: Notification['id'][],
) { ) {
if (notificationIds.length === 0) return; if (notificationIds.length === 0) return;
// Update documents // Update documents
const result = await Notifications.update({ const result = await Notifications.update({
notifieeId: userId,
id: In(notificationIds), id: In(notificationIds),
isRead: false, isRead: false,
}, { }, {
@ -27,7 +28,7 @@ export async function readNotification(
export async function readNotificationByQuery( export async function readNotificationByQuery(
userId: User['id'], userId: User['id'],
query: Record<string, any> query: Record<string, any>,
) { ) {
const notificationIds = await Notifications.findBy({ const notificationIds = await Notifications.findBy({
...query, ...query,

View File

@ -12,8 +12,6 @@ export const meta = {
requireCredential: false, requireCredential: false,
requireCredentialPrivateMode: true, requireCredentialPrivateMode: true,
description: 'Get a list of children of a notes. Children includes replies as well as quote renotes that quote the respective post. A post will not be duplicated if it is a reply and a quote of a note in this thread. For depths larger than 1 the threading has to be computed by the client.',
res: { res: {
type: 'array', type: 'array',
optional: false, nullable: false, optional: false, nullable: false,
@ -29,20 +27,7 @@ export const paramDef = {
type: 'object', type: 'object',
properties: { properties: {
noteId: { type: 'string', format: 'misskey:id' }, noteId: { type: 'string', format: 'misskey:id' },
limit: { limit: { type: 'integer', minimum: 1, maximum: 100, default: 10 },
description: 'The maximum number of replies/quotes to show per parent note, i.e. the maximum number of children each note may have.',
type: 'integer',
minimum: 1,
maximum: 100,
default: 10,
},
depth: {
description: 'The number of layers of replies to fetch at once. Defaults to 1 for backward compatibility.',
type: 'integer',
minimum: 1,
maximum: 100,
default: 1,
},
sinceId: { type: 'string', format: 'misskey:id' }, sinceId: { type: 'string', format: 'misskey:id' },
untilId: { type: 'string', format: 'misskey:id' }, untilId: { type: 'string', format: 'misskey:id' },
}, },

View File

@ -92,6 +92,10 @@
} }
} }
} }
const colorSchema = localStorage.getItem('colorSchema');
if (colorSchema) {
document.documentElement.style.setProperty('color-schema', colorSchema);
}
//#endregion //#endregion
const fontSize = localStorage.getItem('fontSize'); const fontSize = localStorage.getItem('fontSize');

View File

@ -327,8 +327,6 @@ router.get('/notes/:note', async (ctx, next) => {
}); });
if (note) { if (note) {
try {
// FIXME: packing with detail may throw an error if the reply or renote is not visible (#8774)
const _note = await Notes.pack(note); const _note = await Notes.pack(note);
const profile = await UserProfiles.findOneByOrFail({ userId: note.userId }); const profile = await UserProfiles.findOneByOrFail({ userId: note.userId });
const meta = await fetchMeta(); const meta = await fetchMeta();
@ -340,19 +338,13 @@ router.get('/notes/:note', async (ctx, next) => {
summary: getNoteSummary(_note), summary: getNoteSummary(_note),
instanceName: meta.name || 'Calckey', instanceName: meta.name || 'Calckey',
icon: meta.iconUrl, icon: meta.iconUrl,
privateMode: meta.privateMode,
themeColor: meta.themeColor, themeColor: meta.themeColor,
}); });
ctx.set('Cache-Control', 'public, max-age=15'); ctx.set('Cache-Control', 'public, max-age=15');
return; return;
} catch (err) {
if (err.id === '9725d0ce-ba28-4dde-95a7-2cbb2c15de24') {
// note not visible to user
} else {
throw err;
}
}
} }
await next(); await next();
@ -530,19 +522,20 @@ router.get('(.*)', async ctx => {
if (meta.customMOTD.length > 0) { if (meta.customMOTD.length > 0) {
motd = meta.customMOTD; motd = meta.customMOTD;
} }
let iconUrl = meta.iconUrl; let splashIconUrl = meta.iconUrl;
if (meta.customSplashIcons.length > 0) { if (meta.customSplashIcons.length > 0) {
iconUrl = meta.customSplashIcons[Math.floor(Math.random() * meta.customSplashIcons.length)]; splashIconUrl = meta.customSplashIcons[Math.floor(Math.random() * meta.customSplashIcons.length)];
} }
await ctx.render('base', { await ctx.render('base', {
img: meta.bannerUrl, img: meta.bannerUrl,
title: meta.name || 'Calckey', title: meta.name || 'Calckey',
instanceName: meta.name || 'Calckey', instanceName: meta.name || 'Calckey',
desc: meta.description, desc: meta.description,
icon: iconUrl, icon: meta.iconUrl,
splashIcon: splashIconUrl,
themeColor: meta.themeColor, themeColor: meta.themeColor,
privateMode: meta.privateMode,
randomMOTD: motd[Math.floor(Math.random() * motd.length)], randomMOTD: motd[Math.floor(Math.random() * motd.length)],
privateMode: meta.privateMode,
}); });
ctx.set('Cache-Control', 'public, max-age=3'); ctx.set('Cache-Control', 'public, max-age=3');
}); });

View File

@ -1,10 +1,12 @@
{ {
"short_name": "Calckey", "short_name": "Calckey",
"name": "Calckey", "name": "Calckey",
"description": "An open source, decentralized social media platform that's free forever!",
"start_url": "/", "start_url": "/",
"display": "standalone", "display": "standalone",
"background_color": "#6e6a86", "background_color": "#1f1d2e",
"theme_color": "#31748f", "theme_color": "#31748f",
"orientation": "portrait-primary",
"icons": [ "icons": [
{ {
"src": "/static-assets/icons/192.png", "src": "/static-assets/icons/192.png",
@ -24,5 +26,32 @@
"text": "text", "text": "text",
"url": "url" "url": "url"
} }
},
"screenshots" : [
{
"src": "/static-assets/screenshots/1.webp",
"sizes": "1195x579",
"type": "image/webp",
"platform": "narrow",
"label": "Profile page"
},
{
"src": "/static-assets/screenshots/2.webp",
"sizes": "1195x579",
"type": "image/webp",
"platform": "narrow",
"label": "Posts"
} }
],
"shortcuts" : [
{
"name": "Notifications",
"short_name": "Notifs",
"url": "/my/notifications"
},
{
"name": "Chats",
"url": "/my/messaging"
}
]
} }

View File

@ -58,7 +58,7 @@ html
block og block og
meta(property='og:title' content= title || 'Calckey') meta(property='og:title' content= title || 'Calckey')
meta(property='og:description' content= desc || '✨🌎 A interplanetary communication platform 🚀✨') meta(property='og:description' content= desc || '✨🌎 A interplanetary communication platform 🚀✨')
meta(property='og:image' content= img) meta(property='og:image' content= img)
style style
@ -77,7 +77,7 @@ html
br br
| Please turn on your JavaScript | Please turn on your JavaScript
div#splash div#splash
img#splashIcon(src= icon || '/static-assets/splash.png') img#splashIcon(src= splashIcon || '/static-assets/splash.png')
span#splashText span#splashText
block randomMOTD block randomMOTD
= randomMOTD = randomMOTD

View File

@ -1,7 +1,7 @@
extends ./base extends ./base
block vars block vars
- const title = privateMode ? '非公開インスタンス' : channel.name; - const title = privateMode ? instanceName : channel.name;
- const url = `${config.url}/channels/${channel.id}`; - const url = `${config.url}/channels/${channel.id}`;
block title block title

View File

@ -2,7 +2,7 @@ extends ./base
block vars block vars
- const user = clip.user; - const user = clip.user;
- const title = privateMode ? '非公開インスタンス' : clip.name; - const title = privateMode ? instanceName : clip.name;
- const url = `${config.url}/clips/${clip.id}`; - const url = `${config.url}/clips/${clip.id}`;
block title block title

View File

@ -2,7 +2,7 @@ extends ./base
block vars block vars
- const user = post.user; - const user = post.user;
- const title = privateMode ? '非公開インスタンス' : post.title; - const title = privateMode ? instanceName : post.title;
- const url = `${config.url}/gallery/${post.id}`; - const url = `${config.url}/gallery/${post.id}`;
block title block title

View File

@ -2,7 +2,7 @@ extends ./base
block vars block vars
- const user = note.user; - const user = note.user;
- const title = privateMode ? '非公開インスタンス' : (user.name ? `${user.name} (@${user.username})` : `@${user.username}`); - const title = privateMode ? instanceName : (user.name ? `${user.name} (@${user.username})` : `@${user.username}`);
- const url = `${config.url}/notes/${note.id}`; - const url = `${config.url}/notes/${note.id}`;
- const isRenote = note.renote && note.text == null && note.fileIds.length == 0 && note.poll == null; - const isRenote = note.renote && note.text == null && note.fileIds.length == 0 && note.poll == null;

View File

@ -2,7 +2,7 @@ extends ./base
block vars block vars
- const user = page.user; - const user = page.user;
- const title = privateMode ? '非公開インスタンス' : page.title; - const title = privateMode ? instanceName : page.title;
- const url = `${config.url}/@${user.username}/${page.name}`; - const url = `${config.url}/@${user.username}/${page.name}`;
block title block title

View File

@ -1,7 +1,7 @@
extends ./base extends ./base
block vars block vars
- const title = privateMode ? '非公開インスタンス' : (user.name ? `${user.name} (@${user.username})` : `@${user.username}`); - const title = privateMode ? instanceName : (user.name ? `${user.name} (@${user.username})` : `@${user.username}`);
- const url = `${config.url}/@${(user.host ? `${user.username}@${user.host}` : user.username)}`; - const url = `${config.url}/@${(user.host ? `${user.username}@${user.host}` : user.username)}`;
block title block title

View File

@ -8,25 +8,25 @@
}, },
"dependencies": { "dependencies": {
"@discordapp/twemoji": "14.0.2", "@discordapp/twemoji": "14.0.2",
"@fortawesome/fontawesome-free": "6.1.2", "@fortawesome/fontawesome-free": "6.2.0",
"@rollup/plugin-alias": "3.1.9", "@rollup/plugin-alias": "3.1.9",
"@rollup/plugin-json": "4.1.0", "@rollup/plugin-json": "4.1.0",
"@rollup/pluginutils": "^4.2.1", "@rollup/pluginutils": "^4.2.1",
"@syuilo/aiscript": "0.11.1", "@syuilo/aiscript": "0.11.1",
"@vitejs/plugin-vue": "3.0.3", "@vitejs/plugin-vue": "3.1.0",
"@vue/compiler-sfc": "3.2.37", "@vue/compiler-sfc": "3.2.39",
"autobind-decorator": "2.4.0", "autobind-decorator": "2.4.0",
"autosize": "5.0.1", "autosize": "5.0.1",
"blurhash": "1.1.5", "blurhash": "1.1.5",
"broadcast-channel": "4.14.0", "broadcast-channel": "4.14.0",
"browser-image-resizer": "git+https://github.com/misskey-dev/browser-image-resizer#v2.2.1-misskey.2", "browser-image-resizer": "https://github.com/misskey-dev/browser-image-resizer",
"chart.js": "3.9.1", "chart.js": "3.9.1",
"chartjs-adapter-date-fns": "2.0.0", "chartjs-adapter-date-fns": "2.0.0",
"chartjs-plugin-gradient": "0.5.0", "chartjs-plugin-gradient": "0.5.1",
"chartjs-plugin-zoom": "1.2.1", "chartjs-plugin-zoom": "1.2.1",
"compare-versions": "4.1.3", "compare-versions": "5.0.1",
"cropperjs": "2.0.0-beta", "cropperjs": "2.0.0-beta.1",
"date-fns": "2.29.1", "date-fns": "2.29.2",
"escape-regexp": "0.0.1", "escape-regexp": "0.0.1",
"eventemitter3": "4.0.7", "eventemitter3": "4.0.7",
"idb-keyval": "6.2.0", "idb-keyval": "6.2.0",
@ -36,36 +36,40 @@
"matter-js": "0.18.0", "matter-js": "0.18.0",
"mfm-js": "0.23.0", "mfm-js": "0.23.0",
"misskey-js": "0.0.14", "misskey-js": "0.0.14",
"photoswipe": "5.3.0", "photoswipe": "5.3.2",
"prismjs": "1.28.0", "prismjs": "1.29.0",
"punycode": "2.1.1", "punycode": "2.1.1",
"querystring": "0.2.1", "querystring": "0.2.1",
"rndstr": "1.0.0", "rndstr": "1.0.0",
"s-age": "1.1.2", "s-age": "1.1.2",
"sass": "1.54.4", "sass": "1.54.9",
"seedrandom": "3.0.5", "seedrandom": "3.0.5",
"strict-event-emitter-types": "2.0.0", "strict-event-emitter-types": "2.0.0",
"stringz": "2.1.0", "stringz": "2.1.0",
"swiper": "^8.3.2",
"syuilo-password-strength": "0.0.1", "syuilo-password-strength": "0.0.1",
"tesseract.js": "^2.1.5", "tesseract.js": "^2.1.5",
"textarea-caret": "3.1.0", "textarea-caret": "3.1.0",
"three": "0.143.0", "three": "0.144.0",
"throttle-debounce": "5.0.0", "throttle-debounce": "5.0.0",
"tinycolor2": "1.4.2", "tinycolor2": "1.4.2",
"tsc-alias": "1.7.0", "tsc-alias": "1.7.0",
"tsconfig-paths": "4.1.0", "tsconfig-paths": "4.1.0",
"twemoji-parser": "14.0.0", "twemoji-parser": "14.0.0",
"typescript": "4.7.4", "typescript": "4.8.3",
"uuid": "8.3.2", "uuid": "9.0.0",
"vanilla-tilt": "1.7.2", "vanilla-tilt": "1.7.2",
"vite": "3.0.7", "vite": "^3.1.0",
"vue": "3.2.37", "vue": "3.2.39",
"vue-isyourpasswordsafe": "^2.0.0",
"vue-plyr": "^7.0.0",
"vue-prism-editor": "2.0.0-alpha.2", "vue-prism-editor": "2.0.0-alpha.2",
"vuedraggable": "4.0.1" "vue3-lottie": "^2.3.0",
"vuedraggable": "4.1.0"
}, },
"devDependencies": { "devDependencies": {
"@types/escape-regexp": "0.0.1", "@types/escape-regexp": "0.0.1",
"@types/glob": "7.2.0", "@types/glob": "8.0.0",
"@types/gulp": "4.0.9", "@types/gulp": "4.0.9",
"@types/gulp-rename": "2.0.1", "@types/gulp-rename": "2.0.1",
"@types/katex": "0.14.0", "@types/katex": "0.14.0",
@ -75,14 +79,14 @@
"@types/throttle-debounce": "5.0.0", "@types/throttle-debounce": "5.0.0",
"@types/tinycolor2": "1.4.3", "@types/tinycolor2": "1.4.3",
"@types/uuid": "8.3.4", "@types/uuid": "8.3.4",
"@typescript-eslint/eslint-plugin": "5.33.0", "@typescript-eslint/eslint-plugin": "5.36.2",
"@typescript-eslint/parser": "5.33.0", "@typescript-eslint/parser": "5.36.2",
"cross-env": "7.0.3", "cross-env": "7.0.3",
"cypress": "10.4.0", "cypress": "10.7.0",
"eslint": "8.21.0", "eslint": "8.23.0",
"eslint-plugin-import": "2.26.0", "eslint-plugin-import": "2.26.0",
"eslint-plugin-vue": "9.3.0", "eslint-plugin-vue": "9.4.0",
"rollup": "2.77.3", "rollup": "2.79.0",
"start-server-and-test": "1.14.0" "start-server-and-test": "1.14.0"
} }
} }

View File

@ -146,7 +146,7 @@ export async function openAccountMenu(opts: {
onChoose?: (account: misskey.entities.UserDetailed) => void; onChoose?: (account: misskey.entities.UserDetailed) => void;
}, ev: MouseEvent) { }, ev: MouseEvent) {
function showSigninDialog() { function showSigninDialog() {
popup(defineAsyncComponent(() => import('@/components/signin-dialog.vue')), {}, { popup(defineAsyncComponent(() => import('@/components/MkSigninDialog.vue')), {}, {
done: res => { done: res => {
addAccount(res.id, res.i); addAccount(res.id, res.i);
success(); success();
@ -155,7 +155,7 @@ export async function openAccountMenu(opts: {
} }
function createAccount() { function createAccount() {
popup(defineAsyncComponent(() => import('@/components/signup-dialog.vue')), {}, { popup(defineAsyncComponent(() => import('@/components/MkSignupDialog.vue')), {}, {
done: res => { done: res => {
addAccount(res.id, res.i); addAccount(res.id, res.i);
switchAccountWithToken(res.i); switchAccountWithToken(res.i);

View File

@ -36,9 +36,9 @@
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import MkButton from '@/components/ui/button.vue'; import MkButton from '@/components/MkButton.vue';
import MkSwitch from '@/components/form/switch.vue'; import MkSwitch from '@/components/form/switch.vue';
import MkKeyValue from '@/components/key-value.vue'; import MkKeyValue from '@/components/MkKeyValue.vue';
import { acct, userPage } from '@/filters/user'; import { acct, userPage } from '@/filters/user';
import * as os from '@/os'; import * as os from '@/os';
import { i18n } from '@/i18n'; import { i18n } from '@/i18n';

View File

@ -25,9 +25,9 @@
<script setup lang="ts"> <script setup lang="ts">
import { ref } from 'vue'; import { ref } from 'vue';
import * as Misskey from 'misskey-js'; import * as Misskey from 'misskey-js';
import XWindow from '@/components/ui/window.vue'; import XWindow from '@/components/MkWindow.vue';
import MkTextarea from '@/components/form/textarea.vue'; import MkTextarea from '@/components/form/textarea.vue';
import MkButton from '@/components/ui/button.vue'; import MkButton from '@/components/MkButton.vue';
import * as os from '@/os'; import * as os from '@/os';
import { i18n } from '@/i18n'; import { i18n } from '@/i18n';

View File

@ -26,6 +26,7 @@
</text> </text>
</template> </template>
<!--
<line <line
:x1="5 - (Math.sin(sAngle) * (sHandLengthRatio * handsTailLength))" :x1="5 - (Math.sin(sAngle) * (sHandLengthRatio * handsTailLength))"
:y1="5 + (Math.cos(sAngle) * (sHandLengthRatio * handsTailLength))" :y1="5 + (Math.cos(sAngle) * (sHandLengthRatio * handsTailLength))"
@ -35,6 +36,20 @@
:stroke-width="thickness / 2" :stroke-width="thickness / 2"
stroke-linecap="round" stroke-linecap="round"
/> />
-->
<line
class="s"
:class="{ animate: !disableSAnimate && sAnimation !== 'none', elastic: sAnimation === 'elastic', easeOut: sAnimation === 'easeOut' }"
:x1="5 - (0 * (sHandLengthRatio * handsTailLength))"
:y1="5 + (1 * (sHandLengthRatio * handsTailLength))"
:x2="5 + (0 * ((sHandLengthRatio * 5) - handsPadding))"
:y2="5 - (1 * ((sHandLengthRatio * 5) - handsPadding))"
:stroke="sHandColor"
:stroke-width="thickness / 2"
:style="`transform: rotateZ(${sAngle}rad)`"
stroke-linecap="round"
/>
<line <line
:x1="5 - (Math.sin(mAngle) * (mHandLengthRatio * handsTailLength))" :x1="5 - (Math.sin(mAngle) * (mHandLengthRatio * handsTailLength))"
@ -59,7 +74,7 @@
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import { ref, computed, onMounted, onBeforeUnmount, shallowRef } from 'vue'; import { ref, computed, onMounted, onBeforeUnmount, shallowRef, nextTick } from 'vue';
import tinycolor from 'tinycolor2'; import tinycolor from 'tinycolor2';
import { globalEvents } from '@/events.js'; import { globalEvents } from '@/events.js';
@ -84,6 +99,7 @@ const props = withDefaults(defineProps<{
twentyfour?: boolean; twentyfour?: boolean;
graduations?: 'none' | 'dots' | 'numbers'; graduations?: 'none' | 'dots' | 'numbers';
fadeGraduations?: boolean; fadeGraduations?: boolean;
sAnimation?: 'none' | 'elastic' | 'easeOut';
}>(), { }>(), {
numbers: false, numbers: false,
thickness: 0.1, thickness: 0.1,
@ -91,6 +107,7 @@ const props = withDefaults(defineProps<{
twentyfour: false, twentyfour: false,
graduations: 'dots', graduations: 'dots',
fadeGraduations: true, fadeGraduations: true,
sAnimation: 'elastic',
}); });
const graduationsMajor = computed(() => { const graduationsMajor = computed(() => {
@ -125,6 +142,8 @@ let s = $ref<number>(0);
let hAngle = $ref<number>(0); let hAngle = $ref<number>(0);
let mAngle = $ref<number>(0); let mAngle = $ref<number>(0);
let sAngle = $ref<number>(0); let sAngle = $ref<number>(0);
let disableSAnimate = $ref(false);
let sOneRound = false;
function tick() { function tick() {
const now = new Date(); const now = new Date();
@ -134,7 +153,21 @@ function tick() {
h = now.getHours(); h = now.getHours();
hAngle = Math.PI * (h % (props.twentyfour ? 24 : 12) + (m + s / 60) / 60) / (props.twentyfour ? 12 : 6); hAngle = Math.PI * (h % (props.twentyfour ? 24 : 12) + (m + s / 60) / 60) / (props.twentyfour ? 12 : 6);
mAngle = Math.PI * (m + s / 60) / 30; mAngle = Math.PI * (m + s / 60) / 30;
if (sOneRound) { // (59->0)
sAngle = Math.PI * 60 / 30;
window.setTimeout(() => {
disableSAnimate = true;
window.setTimeout(() => {
sAngle = 0;
window.setTimeout(() => {
disableSAnimate = false;
}, 100);
}, 100);
}, 700);
} else {
sAngle = Math.PI * s / 30; sAngle = Math.PI * s / 30;
}
sOneRound = s === 59;
} }
tick(); tick();
@ -175,5 +208,18 @@ onBeforeUnmount(() => {
<style lang="scss" scoped> <style lang="scss" scoped>
.mbcofsoe { .mbcofsoe {
display: block; display: block;
> .s {
will-change: transform;
transform-origin: 50% 50%;
&.animate.elastic {
transition: transform .2s cubic-bezier(.4,2.08,.55,.44);
}
&.animate.easeOut {
transition: transform .7s cubic-bezier(0,.7,.3,1);
}
}
} }
</style> </style>

View File

@ -3,7 +3,7 @@
v-if="!link" class="bghgjjyj _button" v-if="!link" class="bghgjjyj _button"
:class="{ inline, primary, gradate, danger, rounded, full }" :class="{ inline, primary, gradate, danger, rounded, full }"
:type="type" :type="type"
@click="$emit('click', $event)" @click="emit('click', $event)"
@mousedown="onMousedown" @mousedown="onMousedown"
> >
<div ref="ripples" class="ripples"></div> <div ref="ripples" class="ripples"></div>
@ -24,100 +24,65 @@
</MkA> </MkA>
</template> </template>
<script lang="ts"> <script lang="ts" setup>
import { defineComponent } from 'vue'; import { nextTick, onMounted } from 'vue';
export default defineComponent({ const props = defineProps<{
props: { type?: 'button' | 'submit' | 'reset';
type: { primary?: boolean;
type: String, gradate?: boolean;
required: false, rounded?: boolean;
}, inline?: boolean;
primary: { link?: boolean;
type: Boolean, to?: string;
required: false, autofocus?: boolean;
default: false, wait?: boolean;
}, danger?: boolean;
gradate: { full?: boolean;
type: Boolean, }>();
required: false,
default: false, const emit = defineEmits<{
}, (ev: 'click', payload: MouseEvent): void;
rounded: { }>();
type: Boolean,
required: false, let el = $ref<HTMLElement | null>(null);
default: true, let ripples = $ref<HTMLElement | null>(null);
},
inline: { onMounted(() => {
type: Boolean, if (props.autofocus) {
required: false, nextTick(() => {
default: false, el!.focus();
},
link: {
type: Boolean,
required: false,
default: false,
},
to: {
type: String,
required: false,
},
autofocus: {
type: Boolean,
required: false,
default: false,
},
wait: {
type: Boolean,
required: false,
default: false,
},
danger: {
type: Boolean,
required: false,
default: false,
},
full: {
type: Boolean,
required: false,
default: false,
},
},
emits: ['click'],
mounted() {
if (this.autofocus) {
this.$nextTick(() => {
this.$el.focus();
}); });
} }
}, });
methods: {
onMousedown(evt: MouseEvent) {
function distance(p, q) {
return Math.hypot(p.x - q.x, p.y - q.y);
}
function calcCircleScale(boxW, boxH, circleCenterX, circleCenterY) { function distance(p, q): number {
return Math.hypot(p.x - q.x, p.y - q.y);
}
function calcCircleScale(boxW, boxH, circleCenterX, circleCenterY): number {
const origin = { x: circleCenterX, y: circleCenterY }; const origin = { x: circleCenterX, y: circleCenterY };
const dist1 = distance({ x: 0, y: 0 }, origin); const dist1 = distance({ x: 0, y: 0 }, origin);
const dist2 = distance({ x: boxW, y: 0 }, origin); const dist2 = distance({ x: boxW, y: 0 }, origin);
const dist3 = distance({ x: 0, y: boxH }, origin); const dist3 = distance({ x: 0, y: boxH }, origin);
const dist4 = distance({ x: boxW, y: boxH }, origin); const dist4 = distance({ x: boxW, y: boxH }, origin);
return Math.max(dist1, dist2, dist3, dist4) * 2; return Math.max(dist1, dist2, dist3, dist4) * 2;
} }
const rect = evt.target.getBoundingClientRect(); function onMousedown(evt: MouseEvent): void {
const target = evt.target! as HTMLElement;
const rect = target.getBoundingClientRect();
const ripple = document.createElement('div'); const ripple = document.createElement('div');
ripple.style.top = (evt.clientY - rect.top - 1).toString() + 'px'; ripple.style.top = (evt.clientY - rect.top - 1).toString() + 'px';
ripple.style.left = (evt.clientX - rect.left - 1).toString() + 'px'; ripple.style.left = (evt.clientX - rect.left - 1).toString() + 'px';
this.$refs.ripples.appendChild(ripple); ripples!.appendChild(ripple);
const circleCenterX = evt.clientX - rect.left; const circleCenterX = evt.clientX - rect.left;
const circleCenterY = evt.clientY - rect.top; const circleCenterY = evt.clientY - rect.top;
const scale = calcCircleScale(evt.target.clientWidth, evt.target.clientHeight, circleCenterX, circleCenterY); const scale = calcCircleScale(target.clientWidth, target.clientHeight, circleCenterX, circleCenterY);
window.setTimeout(() => { window.setTimeout(() => {
ripple.style.transform = 'scale(' + (scale / 2) + ')'; ripple.style.transform = 'scale(' + (scale / 2) + ')';
@ -127,11 +92,9 @@ export default defineComponent({
ripple.style.opacity = '0'; ripple.style.opacity = '0';
}, 1000); }, 1000);
window.setTimeout(() => { window.setTimeout(() => {
if (this.$refs.ripples) this.$refs.ripples.removeChild(ripple); if (ripples) ripples.removeChild(ripple);
}, 2000); }, 2000);
}, }
},
});
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>

View File

@ -14,7 +14,7 @@
<script lang="ts" setup> <script lang="ts" setup>
import { } from 'vue'; import { } from 'vue';
import MkTooltip from './ui/tooltip.vue'; import MkTooltip from './MkTooltip.vue';
const props = defineProps<{ const props = defineProps<{
showing: boolean; showing: boolean;

View File

@ -11,5 +11,5 @@ defineProps<{
inline?: boolean; inline?: boolean;
}>(); }>();
const XCode = defineAsyncComponent(() => import('./code-core.vue')); const XCode = defineAsyncComponent(() => import('@/components/MkCode.core.vue'));
</script> </script>

View File

@ -8,7 +8,7 @@
<script lang="ts" setup> <script lang="ts" setup>
import { onMounted, onBeforeUnmount } from 'vue'; import { onMounted, onBeforeUnmount } from 'vue';
import MkMenu from './menu.vue'; import MkMenu from './MkMenu.vue';
import { MenuItem } from './types/menu.vue'; import { MenuItem } from './types/menu.vue';
import contains from '@/scripts/contains'; import contains from '@/scripts/contains';
import * as os from '@/os'; import * as os from '@/os';

View File

@ -30,7 +30,7 @@ import { nextTick, onMounted } from 'vue';
import * as misskey from 'misskey-js'; import * as misskey from 'misskey-js';
import Cropper from 'cropperjs'; import Cropper from 'cropperjs';
import tinycolor from 'tinycolor2'; import tinycolor from 'tinycolor2';
import XModalWindow from '@/components/ui/modal-window.vue'; import XModalWindow from '@/components/MkModalWindow.vue';
import * as os from '@/os'; import * as os from '@/os';
import { $i } from '@/account'; import { $i } from '@/account';
import { defaultStore } from '@/store'; import { defaultStore } from '@/store';

View File

@ -38,13 +38,19 @@ const toggle = () => {
.nrvgflfu { .nrvgflfu {
display: inline-block; display: inline-block;
padding: 4px 8px; padding: 4px 8px;
font-size: 0.7em; font-size: 0.8em;
color: var(--cwFg); color: var(--cwFg);
background: var(--cwBg); background: var(--cwBg);
border-radius: 2px; padding: 6px 10px;
width: 90%;
border-radius: 10px;
margin-top: 10px;
margin-bottom: 10px;
transition: background-color 0.25s ease-in-out;
&:hover { &:hover {
background: var(--cwHoverBg); background: var(--cwFg);
color: var(--cwBg);
} }
> span { > span {

View File

@ -1,6 +1,6 @@
<script lang="ts"> <script lang="ts">
import { defineComponent, h, PropType, TransitionGroup } from 'vue'; import { defineComponent, h, PropType, TransitionGroup } from 'vue';
import MkAd from '@/components/global/ad.vue'; import MkAd from '@/components/global/MkAd.vue';
import { i18n } from '@/i18n'; import { i18n } from '@/i18n';
import { defaultStore } from '@/store'; import { defaultStore } from '@/store';
@ -13,22 +13,22 @@ export default defineComponent({
direction: { direction: {
type: String, type: String,
required: false, required: false,
default: 'down' default: 'down',
}, },
reversed: { reversed: {
type: Boolean, type: Boolean,
required: false, required: false,
default: false default: false,
}, },
noGap: { noGap: {
type: Boolean, type: Boolean,
required: false, required: false,
default: false default: false,
}, },
ad: { ad: {
type: Boolean, type: Boolean,
required: false, required: false,
default: false default: false,
}, },
}, },
@ -38,7 +38,7 @@ export default defineComponent({
const month = new Date(time).getMonth() + 1; const month = new Date(time).getMonth() + 1;
return i18n.t('monthAndDay', { return i18n.t('monthAndDay', {
month: month.toString(), month: month.toString(),
day: date.toString() day: date.toString(),
}); });
} }
@ -48,7 +48,7 @@ export default defineComponent({
if (!slots || !slots.default) return; if (!slots || !slots.default) return;
const el = slots.default({ const el = slots.default({
item: item item: item,
})[0]; })[0];
if (el.key == null && item.id) el.key = item.id; if (el.key == null && item.id) el.key = item.id;
@ -60,20 +60,20 @@ export default defineComponent({
class: 'separator', class: 'separator',
key: item.id + ':separator', key: item.id + ':separator',
}, h('p', { }, h('p', {
class: 'date' class: 'date',
}, [ }, [
h('span', [ h('span', [
h('i', { h('i', {
class: 'fas fa-angle-up icon', class: 'fas fa-angle-up icon',
}), }),
getDateText(item.createdAt) getDateText(item.createdAt),
]), ]),
h('span', [ h('span', [
getDateText(props.items[i + 1].createdAt), getDateText(props.items[i + 1].createdAt),
h('i', { h('i', {
class: 'fas fa-angle-down icon', class: 'fas fa-angle-down icon',
}) }),
]) ]),
])); ]));
return [el, separator]; return [el, separator];
@ -102,7 +102,7 @@ export default defineComponent({
class: 'sqadhkmv' + (props.noGap ? ' noGap' : ''), class: 'sqadhkmv' + (props.noGap ? ' noGap' : ''),
}, },
{ default: renderChildren }); { default: renderChildren });
} },
}); });
</script> </script>

View File

@ -40,8 +40,8 @@
<script lang="ts" setup> <script lang="ts" setup>
import { onBeforeUnmount, onMounted, ref } from 'vue'; import { onBeforeUnmount, onMounted, ref } from 'vue';
import MkModal from '@/components/ui/modal.vue'; import MkModal from '@/components/MkModal.vue';
import MkButton from '@/components/ui/button.vue'; import MkButton from '@/components/MkButton.vue';
import MkInput from '@/components/form/input.vue'; import MkInput from '@/components/form/input.vue';
import MkSelect from '@/components/form/select.vue'; import MkSelect from '@/components/form/select.vue';
import { i18n } from '@/i18n'; import { i18n } from '@/i18n';

View File

@ -1,5 +1,6 @@
<template> <template>
<div class="ncvczrfv" <div
class="ncvczrfv"
:class="{ isSelected }" :class="{ isSelected }"
draggable="true" draggable="true"
:title="title" :title="title"
@ -34,7 +35,7 @@
import { computed, defineAsyncComponent, ref } from 'vue'; import { computed, defineAsyncComponent, ref } from 'vue';
import * as Misskey from 'misskey-js'; import * as Misskey from 'misskey-js';
import copyToClipboard from '@/scripts/copy-to-clipboard'; import copyToClipboard from '@/scripts/copy-to-clipboard';
import MkDriveFileThumbnail from './drive-file-thumbnail.vue'; import MkDriveFileThumbnail from '@/components/MkDriveFileThumbnail.vue';
import bytes from '@/filters/bytes'; import bytes from '@/filters/bytes';
import * as os from '@/os'; import * as os from '@/os';
import { i18n } from '@/i18n'; import { i18n } from '@/i18n';
@ -63,31 +64,31 @@ function getMenu() {
return [{ return [{
text: i18n.ts.rename, text: i18n.ts.rename,
icon: 'fas fa-i-cursor', icon: 'fas fa-i-cursor',
action: rename action: rename,
}, { }, {
text: props.file.isSensitive ? i18n.ts.unmarkAsSensitive : i18n.ts.markAsSensitive, text: props.file.isSensitive ? i18n.ts.unmarkAsSensitive : i18n.ts.markAsSensitive,
icon: props.file.isSensitive ? 'fas fa-eye' : 'fas fa-eye-slash', icon: props.file.isSensitive ? 'fas fa-eye' : 'fas fa-eye-slash',
action: toggleSensitive action: toggleSensitive,
}, { }, {
text: i18n.ts.describeFile, text: i18n.ts.describeFile,
icon: 'fas fa-i-cursor', icon: 'fas fa-i-cursor',
action: describe action: describe,
}, null, { }, null, {
text: i18n.ts.copyUrl, text: i18n.ts.copyUrl,
icon: 'fas fa-link', icon: 'fas fa-link',
action: copyUrl action: copyUrl,
}, { }, {
type: 'a', type: 'a',
href: props.file.url, href: props.file.url,
target: '_blank', target: '_blank',
text: i18n.ts.download, text: i18n.ts.download,
icon: 'fas fa-download', icon: 'fas fa-download',
download: props.file.name download: props.file.name,
}, null, { }, null, {
text: i18n.ts.delete, text: i18n.ts.delete,
icon: 'fas fa-trash-alt', icon: 'fas fa-trash-alt',
danger: true, danger: true,
action: deleteFile action: deleteFile,
}]; }];
} }
@ -127,35 +128,35 @@ function rename() {
if (canceled) return; if (canceled) return;
os.api('drive/files/update', { os.api('drive/files/update', {
fileId: props.file.id, fileId: props.file.id,
name: name name: name,
}); });
}); });
} }
function describe() { function describe() {
os.popup(defineAsyncComponent(() => import('@/components/media-caption.vue')), { os.popup(defineAsyncComponent(() => import('@/components/MkMediaCaption.vue')), {
title: i18n.ts.describeFile, title: i18n.ts.describeFile,
input: { input: {
placeholder: i18n.ts.inputNewDescription, placeholder: i18n.ts.inputNewDescription,
default: props.file.comment != null ? props.file.comment : '', default: props.file.comment != null ? props.file.comment : '',
}, },
image: props.file image: props.file,
}, { }, {
done: result => { done: result => {
if (!result || result.canceled) return; if (!result || result.canceled) return;
let comment = result.result; let comment = result.result;
os.api('drive/files/update', { os.api('drive/files/update', {
fileId: props.file.id, fileId: props.file.id,
comment: comment.length === 0 ? null : comment comment: comment.length === 0 ? null : comment,
}); });
} },
}, 'closed'); }, 'closed');
} }
function toggleSensitive() { function toggleSensitive() {
os.api('drive/files/update', { os.api('drive/files/update', {
fileId: props.file.id, fileId: props.file.id,
isSensitive: !props.file.isSensitive isSensitive: !props.file.isSensitive,
}); });
} }
@ -176,7 +177,7 @@ async function deleteFile() {
if (canceled) return; if (canceled) return;
os.api('drive/files/delete', { os.api('drive/files/delete', {
fileId: props.file.id fileId: props.file.id,
}); });
} }
</script> </script>

View File

@ -1,5 +1,6 @@
<template> <template>
<div class="rghtznwe" <div
class="rghtznwe"
:class="{ draghover }" :class="{ draghover }"
draggable="true" draggable="true"
:title="title" :title="title"
@ -123,7 +124,7 @@ function onDrop(ev: DragEvent) {
emit('removeFile', file.id); emit('removeFile', file.id);
os.api('drive/files/update', { os.api('drive/files/update', {
fileId: file.id, fileId: file.id,
folderId: props.folder.id folderId: props.folder.id,
}); });
} }
//#endregion //#endregion
@ -139,7 +140,7 @@ function onDrop(ev: DragEvent) {
emit('removeFolder', folder.id); emit('removeFolder', folder.id);
os.api('drive/folders/update', { os.api('drive/folders/update', {
folderId: folder.id, folderId: folder.id,
parentId: props.folder.id parentId: props.folder.id,
}).then(() => { }).then(() => {
// noop // noop
}).catch(err => { }).catch(err => {
@ -147,13 +148,13 @@ function onDrop(ev: DragEvent) {
case 'detected-circular-definition': case 'detected-circular-definition':
os.alert({ os.alert({
title: i18n.ts.unableToProcess, title: i18n.ts.unableToProcess,
text: i18n.ts.circularReferenceFolder text: i18n.ts.circularReferenceFolder,
}); });
break; break;
default: default:
os.alert({ os.alert({
type: 'error', type: 'error',
text: i18n.ts.somethingHappened text: i18n.ts.somethingHappened,
}); });
} }
}); });
@ -186,19 +187,19 @@ function rename() {
os.inputText({ os.inputText({
title: i18n.ts.renameFolder, title: i18n.ts.renameFolder,
placeholder: i18n.ts.inputNewFolderName, placeholder: i18n.ts.inputNewFolderName,
default: props.folder.name default: props.folder.name,
}).then(({ canceled, result: name }) => { }).then(({ canceled, result: name }) => {
if (canceled) return; if (canceled) return;
os.api('drive/folders/update', { os.api('drive/folders/update', {
folderId: props.folder.id, folderId: props.folder.id,
name: name name: name,
}); });
}); });
} }
function deleteFolder() { function deleteFolder() {
os.api('drive/folders/delete', { os.api('drive/folders/delete', {
folderId: props.folder.id folderId: props.folder.id,
}).then(() => { }).then(() => {
if (defaultStore.state.uploadFolder === props.folder.id) { if (defaultStore.state.uploadFolder === props.folder.id) {
defaultStore.set('uploadFolder', null); defaultStore.set('uploadFolder', null);
@ -209,13 +210,13 @@ function deleteFolder() {
os.alert({ os.alert({
type: 'error', type: 'error',
title: i18n.ts.unableToDelete, title: i18n.ts.unableToDelete,
text: i18n.ts.hasChildFilesOrFolders text: i18n.ts.hasChildFilesOrFolders,
}); });
break; break;
default: default:
os.alert({ os.alert({
type: 'error', type: 'error',
text: i18n.ts.unableToDelete text: i18n.ts.unableToDelete,
}); });
} }
}); });
@ -230,11 +231,11 @@ function onContextmenu(ev: MouseEvent) {
text: i18n.ts.openInWindow, text: i18n.ts.openInWindow,
icon: 'fas fa-window-restore', icon: 'fas fa-window-restore',
action: () => { action: () => {
os.popup(defineAsyncComponent(() => import('./drive-window.vue')), { os.popup(defineAsyncComponent(() => import('@/components/MkDriveWindow.vue')), {
initialFolder: props.folder initialFolder: props.folder,
}, { }, {
}, 'closed'); }, 'closed');
} },
}, null, { }, null, {
text: i18n.ts.rename, text: i18n.ts.rename,
icon: 'fas fa-i-cursor', icon: 'fas fa-i-cursor',

View File

@ -90,10 +90,10 @@
<script lang="ts" setup> <script lang="ts" setup>
import { markRaw, nextTick, onActivated, onBeforeUnmount, onMounted, ref, watch } from 'vue'; import { markRaw, nextTick, onActivated, onBeforeUnmount, onMounted, ref, watch } from 'vue';
import * as Misskey from 'misskey-js'; import * as Misskey from 'misskey-js';
import XNavFolder from './drive.nav-folder.vue'; import MkButton from './MkButton.vue';
import XFolder from './drive.folder.vue'; import XNavFolder from '@/components/MkDrive.navFolder.vue';
import XFile from './drive.file.vue'; import XFolder from '@/components/MkDrive.folder.vue';
import MkButton from './ui/button.vue'; import XFile from '@/components/MkDrive.file.vue';
import * as os from '@/os'; import * as os from '@/os';
import { stream } from '@/stream'; import { stream } from '@/stream';
import { defaultStore } from '@/store'; import { defaultStore } from '@/store';

View File

@ -17,7 +17,7 @@
<script lang="ts" setup> <script lang="ts" setup>
import { computed } from 'vue'; import { computed } from 'vue';
import * as Misskey from 'misskey-js'; import * as Misskey from 'misskey-js';
import ImgWithBlurhash from '@/components/img-with-blurhash.vue'; import ImgWithBlurhash from '@/components/MkImgWithBlurhash.vue';
const props = defineProps<{ const props = defineProps<{
file: Misskey.entities.DriveFile; file: Misskey.entities.DriveFile;

View File

@ -1,5 +1,6 @@
<template> <template>
<XModalWindow ref="dialog" <XModalWindow
ref="dialog"
:width="800" :width="800"
:height="500" :height="500"
:with-ok-button="true" :with-ok-button="true"
@ -20,8 +21,8 @@
<script lang="ts" setup> <script lang="ts" setup>
import { ref } from 'vue'; import { ref } from 'vue';
import * as Misskey from 'misskey-js'; import * as Misskey from 'misskey-js';
import XDrive from './drive.vue'; import XDrive from '@/components/MkDrive.vue';
import XModalWindow from '@/components/ui/modal-window.vue'; import XModalWindow from '@/components/MkModalWindow.vue';
import number from '@/filters/number'; import number from '@/filters/number';
import { i18n } from '@/i18n'; import { i18n } from '@/i18n';

View File

@ -1,5 +1,6 @@
<template> <template>
<XWindow ref="window" <XWindow
ref="window"
:initial-width="800" :initial-width="800"
:initial-height="500" :initial-height="500"
:can-resize="true" :can-resize="true"
@ -15,8 +16,8 @@
<script lang="ts" setup> <script lang="ts" setup>
import { } from 'vue'; import { } from 'vue';
import * as Misskey from 'misskey-js'; import * as Misskey from 'misskey-js';
import XDrive from './drive.vue'; import XDrive from '@/components/MkDrive.vue';
import XWindow from '@/components/ui/window.vue'; import XWindow from '@/components/MkWindow.vue';
import { i18n } from '@/i18n'; import { i18n } from '@/i18n';
defineProps<{ defineProps<{

View File

@ -46,7 +46,7 @@
</section> </section>
<section> <section>
<header class="_acrylic"><i class="far fa-clock fa-fw"></i> {{ i18n.ts.recentUsed }}</header> <header><i class="far fa-clock fa-fw"></i> {{ i18n.ts.recentUsed }}</header>
<div class="body"> <div class="body">
<button <button
v-for="emoji in recentlyUsedEmojis" v-for="emoji in recentlyUsedEmojis"
@ -60,11 +60,11 @@
</section> </section>
</div> </div>
<div v-once class="group"> <div v-once class="group">
<header class="_acrylic">{{ i18n.ts.customEmojis }}</header> <header>{{ i18n.ts.customEmojis }}</header>
<XSection v-for="category in customEmojiCategories" :key="'custom:' + category" :initial-shown="false" :emojis="customEmojis.filter(e => e.category === category).map(e => ':' + e.name + ':')" @chosen="chosen">{{ category || i18n.ts.other }}</XSection> <XSection v-for="category in customEmojiCategories" :key="'custom:' + category" :initial-shown="false" :emojis="customEmojis.filter(e => e.category === category).map(e => ':' + e.name + ':')" @chosen="chosen">{{ category || i18n.ts.other }}</XSection>
</div> </div>
<div v-once class="group"> <div v-once class="group">
<header class="_acrylic">{{ i18n.ts.emoji }}</header> <header>{{ i18n.ts.emoji }}</header>
<XSection v-for="category in categories" :key="category" :emojis="emojilist.filter(e => e.category === category).map(e => e.char)" @chosen="chosen">{{ category }}</XSection> <XSection v-for="category in categories" :key="category" :emojis="emojilist.filter(e => e.category === category).map(e => e.char)" @chosen="chosen">{{ category }}</XSection>
</div> </div>
</div> </div>
@ -80,10 +80,10 @@
<script lang="ts" setup> <script lang="ts" setup>
import { ref, computed, watch, onMounted } from 'vue'; import { ref, computed, watch, onMounted } from 'vue';
import * as Misskey from 'misskey-js'; import * as Misskey from 'misskey-js';
import XSection from './emoji-picker.section.vue'; import XSection from '@/components/MkEmojiPicker.section.vue';
import { emojilist, UnicodeEmojiDef, unicodeEmojiCategories as categories } from '@/scripts/emojilist'; import { emojilist, UnicodeEmojiDef, unicodeEmojiCategories as categories } from '@/scripts/emojilist';
import { getStaticImageUrl } from '@/scripts/get-static-image-url'; import { getStaticImageUrl } from '@/scripts/get-static-image-url';
import Ripple from '@/components/ripple.vue'; import Ripple from '@/components/MkRipple.vue';
import * as os from '@/os'; import * as os from '@/os';
import { isTouchUsing } from '@/scripts/touch'; import { isTouchUsing } from '@/scripts/touch';
import { deviceKind } from '@/scripts/device-kind'; import { deviceKind } from '@/scripts/device-kind';

View File

@ -27,8 +27,8 @@
<script lang="ts" setup> <script lang="ts" setup>
import { ref } from 'vue'; import { ref } from 'vue';
import MkModal from '@/components/ui/modal.vue'; import MkModal from '@/components/MkModal.vue';
import MkEmojiPicker from '@/components/emoji-picker.vue'; import MkEmojiPicker from '@/components/MkEmojiPicker.vue';
import { defaultStore } from '@/store'; import { defaultStore } from '@/store';
withDefaults(defineProps<{ withDefaults(defineProps<{

View File

@ -13,8 +13,8 @@
<script lang="ts" setup> <script lang="ts" setup>
import { } from 'vue'; import { } from 'vue';
import MkWindow from '@/components/ui/window.vue'; import MkWindow from '@/components/MkWindow.vue';
import MkEmojiPicker from '@/components/emoji-picker.vue'; import MkEmojiPicker from '@/components/MkEmojiPicker.vue';
withDefaults(defineProps<{ withDefaults(defineProps<{
src?: HTMLElement; src?: HTMLElement;

View File

@ -35,8 +35,8 @@
import { computed } from 'vue'; import { computed } from 'vue';
import * as Acct from 'misskey-js/built/acct'; import * as Acct from 'misskey-js/built/acct';
import MkSwitch from '@/components/ui/switch.vue'; import MkSwitch from '@/components/ui/switch.vue';
import MkPagination from '@/components/ui/pagination.vue'; import MkPagination from '@/components/MkPagination.vue';
import MkDriveFileThumbnail from '@/components/drive-file-thumbnail.vue'; import MkDriveFileThumbnail from '@/components/MkDriveFileThumbnail.vue';
import bytes from '@/filters/bytes'; import bytes from '@/filters/bytes';
import * as os from '@/os'; import * as os from '@/os';
import { i18n } from '@/i18n'; import { i18n } from '@/i18n';

View File

@ -33,8 +33,8 @@
<script lang="ts" setup> <script lang="ts" setup>
import { } from 'vue'; import { } from 'vue';
import XModalWindow from '@/components/ui/modal-window.vue'; import XModalWindow from '@/components/MkModalWindow.vue';
import MkButton from '@/components/ui/button.vue'; import MkButton from '@/components/MkButton.vue';
import MkInput from '@/components/form/input.vue'; import MkInput from '@/components/form/input.vue';
import * as os from '@/os'; import * as os from '@/os';
import { instance } from '@/instance'; import { instance } from '@/instance';

View File

@ -61,9 +61,9 @@ import FormTextarea from './form/textarea.vue';
import FormSwitch from './form/switch.vue'; import FormSwitch from './form/switch.vue';
import FormSelect from './form/select.vue'; import FormSelect from './form/select.vue';
import FormRange from './form/range.vue'; import FormRange from './form/range.vue';
import MkButton from './ui/button.vue'; import MkButton from './MkButton.vue';
import FormRadios from './form/radios.vue'; import FormRadios from './form/radios.vue';
import XModalWindow from '@/components/ui/modal-window.vue'; import XModalWindow from '@/components/MkModalWindow.vue';
export default defineComponent({ export default defineComponent({
components: { components: {

View File

@ -1,5 +1,5 @@
<template> <template>
<XFormula :formula="formula" :block="block" /> <XFormula :formula="formula" :block="block"/>
</template> </template>
<script lang="ts"> <script lang="ts">
@ -8,17 +8,17 @@ import * as os from '@/os';
export default defineComponent({ export default defineComponent({
components: { components: {
XFormula: defineAsyncComponent(() => import('./formula-core.vue')) XFormula: defineAsyncComponent(() => import('@/components/MkFormulaCore.vue')),
}, },
props: { props: {
formula: { formula: {
type: String, type: String,
required: true required: true,
}, },
block: { block: {
type: Boolean, type: Boolean,
required: true required: true,
} },
} },
}); });
</script> </script>

View File

@ -14,26 +14,14 @@
</MkA> </MkA>
</template> </template>
<script lang="ts"> <script lang="ts" setup>
import { defineComponent } from 'vue'; import { } from 'vue';
import { userName } from '@/filters/user'; import { userName } from '@/filters/user';
import ImgWithBlurhash from '@/components/img-with-blurhash.vue'; import ImgWithBlurhash from '@/components/MkImgWithBlurhash.vue';
import * as os from '@/os';
export default defineComponent({ const props = defineProps<{
components: { post: any;
ImgWithBlurhash }>();
},
props: {
post: {
type: Object,
required: true
},
},
methods: {
userName,
}
});
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>

View File

@ -17,7 +17,7 @@ import { } from 'vue';
import * as misskey from 'misskey-js'; import * as misskey from 'misskey-js';
import bytes from '@/filters/bytes'; import bytes from '@/filters/bytes';
import number from '@/filters/number'; import number from '@/filters/number';
import MkModal from '@/components/ui/modal.vue'; import MkModal from '@/components/MkModal.vue';
const props = withDefaults(defineProps<{ const props = withDefaults(defineProps<{
image: misskey.entities.DriveFile; image: misskey.entities.DriveFile;

View File

@ -6,23 +6,12 @@
</div> </div>
</template> </template>
<script lang="ts"> <script lang="ts" setup>
import { defineComponent } from 'vue'; import { } from 'vue';
import * as os from '@/os';
export default defineComponent({ const props = defineProps<{
props: { warn?: boolean;
warn: { }>();
type: Boolean,
required: false,
default: false
},
},
data() {
return {
};
}
});
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>

View File

@ -11,7 +11,7 @@
<script lang="ts" setup> <script lang="ts" setup>
import * as misskey from 'misskey-js'; import * as misskey from 'misskey-js';
import MkMiniChart from '@/components/mini-chart.vue'; import MkMiniChart from '@/components/MkMiniChart.vue';
import * as os from '@/os'; import * as os from '@/os';
const props = defineProps<{ const props = defineProps<{

View File

@ -68,7 +68,7 @@ import {
DoughnutController, DoughnutController,
} from 'chart.js'; } from 'chart.js';
import MkSelect from '@/components/form/select.vue'; import MkSelect from '@/components/form/select.vue';
import MkChart from '@/components/chart.vue'; import MkChart from '@/components/MkChart.vue';
import { useChartTooltip } from '@/scripts/use-chart-tooltip'; import { useChartTooltip } from '@/scripts/use-chart-tooltip';
import * as os from '@/os'; import * as os from '@/os';
import { i18n } from '@/i18n'; import { i18n } from '@/i18n';

View File

@ -21,7 +21,7 @@
<script lang="ts" setup> <script lang="ts" setup>
import { } from 'vue'; import { } from 'vue';
import MkModal from '@/components/ui/modal.vue'; import MkModal from '@/components/MkModal.vue';
import { navbarItemDef } from '@/navbar'; import { navbarItemDef } from '@/navbar';
import { instanceName } from '@/config'; import { instanceName } from '@/config';
import { defaultStore } from '@/store'; import { defaultStore } from '@/store';

View File

@ -26,7 +26,7 @@ const target = self ? null : '_blank';
const el = $ref(); const el = $ref();
useTooltip($$(el), (showing) => { useTooltip($$(el), (showing) => {
os.popup(defineAsyncComponent(() => import('@/components/url-preview-popup.vue')), { os.popup(defineAsyncComponent(() => import('@/components/MkUrlPreviewPopup.vue')), {
showing, showing,
url: props.url, url: props.url,
source: el, source: el,

View File

@ -6,6 +6,7 @@
<span>{{ $ts.clickToShow }}</span> <span>{{ $ts.clickToShow }}</span>
</div> </div>
<div v-else-if="media.type.startsWith('audio') && media.type !== 'audio/midi'" class="audio"> <div v-else-if="media.type.startsWith('audio') && media.type !== 'audio/midi'" class="audio">
<VuePlyr>
<audio ref="audioEl" <audio ref="audioEl"
class="audio" class="audio"
:src="media.url" :src="media.url"
@ -13,6 +14,7 @@
controls controls
preload="metadata" preload="metadata"
@volumechange="volumechange" /> @volumechange="volumechange" />
</VuePlyr>
</div> </div>
<a v-else class="download" <a v-else class="download"
:href="media.url" :href="media.url"
@ -28,7 +30,9 @@
<script lang="ts" setup> <script lang="ts" setup>
import { onMounted } from 'vue'; import { onMounted } from 'vue';
import * as misskey from 'misskey-js'; import * as misskey from 'misskey-js';
import VuePlyr from 'vue-plyr';
import { ColdDeviceStorage } from '@/store'; import { ColdDeviceStorage } from '@/store';
import 'vue-plyr/dist/vue-plyr.css';
const props = withDefaults(defineProps<{ const props = withDefaults(defineProps<{
media: misskey.entities.DriveFile; media: misskey.entities.DriveFile;
@ -53,6 +57,7 @@ onMounted(() => {
border-radius: 4px; border-radius: 4px;
margin-top: 4px; margin-top: 4px;
overflow: hidden; overflow: hidden;
--plyr-color-main: var(--accent);
> .download, > .download,
> .sensitive { > .sensitive {

View File

@ -34,8 +34,8 @@
import { defineComponent } from 'vue'; import { defineComponent } from 'vue';
import { length } from 'stringz'; import { length } from 'stringz';
import Tesseract from 'tesseract.js'; import Tesseract from 'tesseract.js';
import MkModal from '@/components/ui/modal.vue'; import MkModal from '@/components/MkModal.vue';
import MkButton from '@/components/ui/button.vue'; import MkButton from '@/components/MkButton.vue';
import bytes from '@/filters/bytes'; import bytes from '@/filters/bytes';
import number from '@/filters/number'; import number from '@/filters/number';

View File

@ -24,7 +24,7 @@
import { watch } from 'vue'; import { watch } from 'vue';
import * as misskey from 'misskey-js'; import * as misskey from 'misskey-js';
import { getStaticImageUrl } from '@/scripts/get-static-image-url'; import { getStaticImageUrl } from '@/scripts/get-static-image-url';
import ImgWithBlurhash from '@/components/img-with-blurhash.vue'; import ImgWithBlurhash from '@/components/MkImgWithBlurhash.vue';
import { defaultStore } from '@/store'; import { defaultStore } from '@/store';
const props = defineProps<{ const props = defineProps<{

View File

@ -18,9 +18,9 @@ import * as misskey from 'misskey-js';
import PhotoSwipeLightbox from 'photoswipe/lightbox'; import PhotoSwipeLightbox from 'photoswipe/lightbox';
import PhotoSwipe from 'photoswipe'; import PhotoSwipe from 'photoswipe';
import 'photoswipe/style.css'; import 'photoswipe/style.css';
import XBanner from './media-banner.vue'; import XBanner from '@/components/MkMediaBanner.vue';
import XImage from './media-image.vue'; import XImage from '@/components/MkMediaImage.vue';
import XVideo from './media-video.vue'; import XVideo from '@/components/MkMediaVideo.vue';
import * as os from '@/os'; import * as os from '@/os';
import { FILE_TYPE_BROWSERSAFE } from '@/const'; import { FILE_TYPE_BROWSERSAFE } from '@/const';
import { defaultStore } from '@/store'; import { defaultStore } from '@/store';

View File

@ -6,10 +6,12 @@
</div> </div>
</div> </div>
<div v-else class="kkjnbbplepmiyuadieoenjgutgcmtsvu"> <div v-else class="kkjnbbplepmiyuadieoenjgutgcmtsvu">
<VuePlyr>
<video <video
:poster="video.thumbnailUrl" :poster="video.thumbnailUrl"
:title="video.comment" :title="video.comment"
:alt="video.comment" :alt="video.comment"
:download="video.url"
preload="none" preload="none"
controls controls
@contextmenu.stop @contextmenu.stop
@ -19,6 +21,7 @@
:type="video.type" :type="video.type"
> >
</video> </video>
</VuePlyr>
<i class="fas fa-eye-slash" @click="hide = true"></i> <i class="fas fa-eye-slash" @click="hide = true"></i>
</div> </div>
</template> </template>
@ -26,7 +29,9 @@
<script lang="ts" setup> <script lang="ts" setup>
import { ref } from 'vue'; import { ref } from 'vue';
import * as misskey from 'misskey-js'; import * as misskey from 'misskey-js';
import VuePlyr from 'vue-plyr';
import { defaultStore } from '@/store'; import { defaultStore } from '@/store';
import 'vue-plyr/dist/vue-plyr.css';
const props = defineProps<{ const props = defineProps<{
video: misskey.entities.DriveFile; video: misskey.entities.DriveFile;
@ -38,6 +43,7 @@ const hide = ref((defaultStore.state.nsfw === 'force') ? true : props.video.isSe
<style lang="scss" scoped> <style lang="scss" scoped>
.kkjnbbplepmiyuadieoenjgutgcmtsvu { .kkjnbbplepmiyuadieoenjgutgcmtsvu {
position: relative; position: relative;
--plyr-color-main: var(--accent);
> i { > i {
display: block; display: block;

View File

@ -7,7 +7,7 @@
<script lang="ts" setup> <script lang="ts" setup>
import { on } from 'events'; import { on } from 'events';
import { nextTick, onBeforeUnmount, onMounted, onUnmounted, ref, watch } from 'vue'; import { nextTick, onBeforeUnmount, onMounted, onUnmounted, ref, watch } from 'vue';
import MkMenu from './menu.vue'; import MkMenu from './MkMenu.vue';
import { MenuItem } from '@/types/menu'; import { MenuItem } from '@/types/menu';
import * as os from '@/os'; import * as os from '@/os';

View File

@ -63,7 +63,7 @@ import { MenuItem, InnerMenuItem, MenuPending, MenuAction } from '@/types/menu';
import * as os from '@/os'; import * as os from '@/os';
import { i18n } from '@/i18n'; import { i18n } from '@/i18n';
const XChild = defineAsyncComponent(() => import('./menu.child.vue')); const XChild = defineAsyncComponent(() => import('./MkMenu.child.vue'));
const props = defineProps<{ const props = defineProps<{
items: MenuItem[]; items: MenuItem[];

View File

@ -22,7 +22,7 @@
<script lang="ts" setup> <script lang="ts" setup>
import { ComputedRef, provide } from 'vue'; import { ComputedRef, provide } from 'vue';
import MkModal from '@/components/ui/modal.vue'; import MkModal from '@/components/MkModal.vue';
import { popout as _popout } from '@/scripts/popout'; import { popout as _popout } from '@/scripts/popout';
import copyToClipboard from '@/scripts/copy-to-clipboard'; import copyToClipboard from '@/scripts/copy-to-clipboard';
import { url } from '@/config'; import { url } from '@/config';

Some files were not shown because too many files have changed in this diff Show More