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)
#proxyRemoteFiles: true
# Sign to ActivityPub GET request (default: false)
#signToActivityPubGet: true
#allowedPrivateNetworks: [
# '127.0.0.1/32'
#]

3
.gitignore vendored
View file

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

View file

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

View file

@ -3,10 +3,10 @@
## Planned
- 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
- Like/star button
- Backfill remote users
- User "choices" (recommended users) like Mastodon and Soapbox
- Option to publicize instance blocks
- Better intro/onboarding
- Fully revamp non-logged-in screen
@ -21,8 +21,12 @@
## Work in progress
- Better Messaging UI
- Videos can be played in DMs
- Make your password hasn't been pwned
- OCR image captioning
- Admin custom CSS
- Add back time machine (jump to date)
- Improve accesibility score
<details><summary>Current Misskey score is 57/100</summary>
@ -34,36 +38,51 @@
- Yarn 3
- Fix Dockerfile @hanna
- Upgrade packages with security vunrabilities
- Saner defaults
- Recommended instances timeline
- Improve mobile UX
- Swipe through pages on mobile
- Redesigned mobile bottom nav bar
- Post button on TL
- Star as default reaction
- Rosé Pine by default (+ non-themable elements made Rosé Pine)
- Better sidebar/navbar
- Add back groups
- MOTD (customizable by admins!)
- Custom randomized splash icons
- Self hosted, newly designed error images
- Illustrated by [Henki](https://www.youtube.com/c/Henkiwashere)!
- 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
- 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
- Less cluttered notification summary
- Better welcome screen (not logged in)
- vue-plyr as video/audio player
- Ability to turn off "Connection lost" message
- Raw instance info only for moderators
- New spinner animation
- Spinner instead of "Loading..."
- SearchX instead of Google
- Always signToActivityPubGet
- Spacing on group items
- Quotes have solid border
- Reply limit bug fixed
- Make showing the update popup optional
- Improve PWA manifest
- Fix incoming chat scrolling globally
- Obliteration of Ai-chan
- [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)
- [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)
- [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)
- 👍 also triggers generic like/favorite
- [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
- 30d8bc9259cb6b72ed76d67b21dbb4cdceca8327: refactor: welcome.setup.vue to composition api
- 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.
-->
## 12.x.x (unreleased)
## 12.119.0 (2022/09/10)
### Improvements
- 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)

View file

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

View file

@ -17,9 +17,13 @@
- 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.
- Notable differences:
- Improved UI/UX, notifications, security, and more
- Improved UI/UX (especially on mobile)
- Improved notifications
- Improved instance security
- Recommended Instances timeline
- New and improved Groups
- Many more user and admin settings
- [So much more!](./CALCKEY.md)
</div>

View file

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

View file

@ -206,6 +206,7 @@ instanceFollowers: "Následovníci na instanci"
instanceUsers: "Uživatelé této instance"
changePassword: "Změnit heslo"
security: "Zabezpečení"
retypedNotMatch: "Zadané údaje se neshodují."
currentPassword: "Současné heslo"
newPassword: "Nové heslo"
newPasswordRetype: "Nové heslo (znovu)"
@ -268,6 +269,7 @@ addFile: "Přidat soubor"
emptyFolder: "Tato složka je prázdná"
unableToDelete: "Nelze smazat"
inputNewFileName: "Zadejte nový název"
inputNewFolderName: "Zadejte název nové složky"
copyUrl: "Kopírovat URL"
rename: "Přejmenovat"
avatar: "Avatar"
@ -310,9 +312,11 @@ pinnedUsers: "Připnutí uživatelé"
pinnedNotes: "Připnutá poznámka"
hcaptcha: "hCaptcha"
enableHcaptcha: "Aktivovat hCaptchu"
hcaptchaSiteKey: "Klíč stránky"
hcaptchaSecretKey: "Tajný Klíč (Secret Key)"
recaptcha: "reCAPTCHA"
enableRecaptcha: "Zapnout ReCAPTCHu"
recaptchaSiteKey: "Klíč stránky"
recaptchaSecretKey: "Tajný Klíč (Secret Key)"
antennas: "Antény"
manageAntennas: "Spravovat Antény"
@ -321,6 +325,10 @@ antennaSource: "Zdroj Antény"
enableServiceworker: "Povolit ServiceWorker"
caseSensitive: "Rozlišuje malá a velká písmena"
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"
userList: "Seznamy"
about: "Informace"
@ -365,10 +373,14 @@ next: "Další"
retype: "Zadejte znovu"
noteOf: "{user} poznámky"
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"
onlyOneFileCanBeAttached: "Ke zprávě můžete přiložit jenom jeden soubor"
signinRequired: "Přihlašte se, prosím"
invitations: "Pozvat"
invitationCode: "Kód pozvánky"
checking: "Ověřuji"
available: "K dispozici"
unavailable: "Není k dispozici"
@ -382,6 +394,7 @@ passwordMatched: "Hesla se schodují"
passwordNotMatched: "Hesla se neschodují"
signinWith: "Přihlásit se s {x}"
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"
language: "Jazyk"
uiLanguage: "Jazyk uživatelského rozhraní"
@ -411,9 +424,20 @@ accountSettings: "Nastavení účtu"
promotion: "Propagace"
promote: "Propagovat"
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"
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"
details: "Detaily"
chooseEmoji: "Vybrat emotikon"
unableToProcess: "Operace nebyla dokončena."
recentUsed: "Naposledy použité"
@ -434,13 +458,20 @@ deleteAllFiles: "Smazat všechny soubory"
deleteAllFilesConfirm: "Jste si jistí že chcete smazat všechny soubory?"
userSuspended: "Tomuto uživateli byl pozastaven účet."
menu: "Menu"
divider: "Dělící čára"
addItem: "Přidat položku"
relays: "Relay"
addRelay: "Přidat Relay"
inboxUrl: "Inbox URL"
deletedNote: "Odstraněné příspěvky"
invisibleNote: "Skryté příspěvky"
description: "Popis"
author: "Autor"
manage: "Administrace"
width: "Šířka"
height: "Výška"
large: "Velké"
medium: "Střední"
small: "Malé"
generateAccessToken: "Vygenerovat přístupový token"
permission: "Oprávnění"
@ -458,11 +489,16 @@ smtpPort: "Port"
smtpUser: "Uživatelské jméno"
smtpPass: "Heslo"
smtpSecureInfo: "Toto vypněte pokud používáte STARTTLS"
testEmail: "Otestovat doručení emailů"
makeActive: "Aktivovat"
display: "Zobrazit"
copy: "Kopírovat"
metrics: "Metriky"
overview: "Shrnutí"
logs: "Logy"
delayed: "Prodleva"
database: "Databáze"
channel: "Kanály"
create: "Vytvořit"
notificationSetting: "Nastavení oznámení"
useGlobalSetting: "Použít globální nastavení"
@ -470,79 +506,415 @@ other: "Ostatní"
fileIdOrUrl: "ID nebo URL souboru"
behavior: "Chování"
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ěť"
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"
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é"
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í"
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(ů)"
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:
_follow:
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:
mention: "Zmínění"
hashtag: "Hashtag"
link: "Odkaz"
bold: "Tučně"
quote: "Citovat"
emoji: "Vlastní emoji"
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:
install: "Nainstalovat vzhled"
manage: "Správa vzhledů"
code: "Kód vzhledu"
description: "Popis"
installedThemes: "Nainstalované vzhledy"
constant: "Konstanta"
defaultValue: "Výchozí hodnota"
color: "Barva"
key: "Klíč"
func: "Funkce "
keys:
shadow: "Stín"
header: "Nadpis"
link: "Odkaz"
hashtag: "Hashtag"
mention: "Zmínění"
renote: "Přeposlat"
divider: "Dělící čára"
_sfx:
note: "Poznámky"
notification: "Oznámení"
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:
notifications: "Oznámení"
timeline: "Časová osa"
calendar: "Kalendář"
trends: "Trendy"
clock: "Hodiny"
rss: "RSS čtečka"
activity: "Aktivita"
photos: "Fotky"
digitalClock: "Digitální hodiny"
federation: "Federace"
slideshow: "Prezentace"
button: "Tlačítko"
onlineUsers: "Online uživatelé"
jobQueue: "Fronta úloh"
aiscript: "AiScript conzole"
aichan: "Ai"
_cw:
hide: "Skrýt"
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:
home: "Domů"
followers: "Sledující"
_postForm:
_placeholders:
f: "Čekám, až něco napíšete..."
_profile:
name: "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:
allNotes: "Všechny poznámky"
followingList: "Sledovaní"
muteList: "Ztlumit"
blockingList: "Zablokovat"
userLists: "Seznamy"
_charts:
federation: "Federace"
apRequest: "Požadavek"
usersTotal: "Celkem uživatelů"
activeUsers: "Aktivní uživatelé"
notesTotal: "Celkový počet poznámek"
_timelines:
home: "Domů"
global: "Globální"
_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:
text: "Text"
textarea: "Textové pole"
section: "Sekce"
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:
categories:
list: "Seznamy"
blocks:
text: "Text"
_strLen:
arg1: "Text"
_strPick:
arg1: "Text"
_strReplace:
arg1: "Text"
_strReverse:
arg1: "Text"
_join:
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:
arg1: "Seznamy"
_dailyRandom:
arg1: "Pravděpodobnost"
_dailyRannum:
arg1: "Minimální hodnota"
arg2: "Maximální hodnota"
_dailyRandomPick:
arg1: "Seznamy"
_seedRandom:
arg2: "Pravděpodobnost"
_seedRannum:
arg2: "Minimální hodnota"
arg3: "Maximální hodnota"
_seedRandomPick:
arg2: "Seznamy"
_pick:
arg1: "Seznamy"
_listLen:
arg1: "Seznamy"
number: "Číselná hodnota"
_stringToNumber:
arg1: "Text"
_numberToString:
arg1: "Číselná hodnota"
_splitStrByLine:
arg1: "Text"
types:
string: "Text"
number: "Číselná hodnota"
array: "Seznamy"
_notification:
youWereFollowed: "Máte nového následovníka"
youWereInvitedToGroup: "Pozvat do skupiny"
_types:
all: "Vše"
follow: "Sledovaní"
mention: "Zmínění"
reply: "Odpovědi"
renote: "Přeposlat"
quote: "Citovat"
reaction: "Reakce"

View file

@ -134,7 +134,7 @@ emoji: "Emoji"
emojis: "Emoji"
emojiName: "Emoji name"
emojiUrl: "Emoji URL"
addEmoji: "Add an emoji"
addEmoji: "Add"
settingGuide: "Recommended settings"
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."
@ -783,7 +783,7 @@ emailNotConfiguredWarning: "Email address not set."
ratio: "Ratio"
secureMode: "Secure Mode (Authorized Fetch)"
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"
privateModeInfo: "When enabled, only whitelisted instances can federate with your instances. All notes will be hidden from the public."
allowedInstances: "Whitelisted Instances"
@ -989,7 +989,7 @@ _registry:
domain: "Domain"
createKey: "Create key"
_aboutMisskey:
about: "Calckey is a fork of Misskey made by ThatOneCalculator being developed since 2022."
about: "Calckeyは、2022年から開発されているThatOneCalculator社製のMisskeyのforkです。"
contributors: "Main contributors"
allContributors: "All contributors"
source: "Source code"

View file

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

View file

@ -562,6 +562,7 @@ author: "작성자"
leaveConfirm: "저장하지 않은 변경사항이 있습니다. 취소하시겠습니까?"
manage: "관리"
plugins: "플러그인"
preferencesBackups: "환경설정 백업"
deck: "덱"
undeck: "덱 해제"
useBlurEffectForModal: "모달에 흐림 효과 사용"
@ -612,7 +613,7 @@ create: "생성"
notificationSetting: "알림 설정"
notificationSettingDesc: "표시할 알림의 종류를 선택해 주세요."
useGlobalSetting: "글로벌 설정을 사용하기"
useGlobalSettingDesc: "활성화하면 계정의 알림 설정이 적용니다. 비활성화하면 개별적으로 설정할 수 있게 됩니다."
useGlobalSettingDesc: "활성화하면 계정의 알림 설정이 적용니다. 비활성화하면 개별적으로 설정할 수 있게 됩니다."
other: "기타"
regenerateLoginToken: "로그인 토큰을 재생성"
regenerateLoginTokenDescription: "로그인할 때 사용되는 내부 토큰을 재생성합니다. 일반적으로 이 작업을 실행할 필요는 없습니다. 이 기능을 사용하면 이 계정으로 로그인한 모든 기기에서 로그아웃됩니다."
@ -941,6 +942,24 @@ _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: "키"
@ -1258,6 +1277,7 @@ _widgets:
activity: "활동"
photos: "사진"
digitalClock: "디지털 시계"
unixClock: "UNIX 시계"
federation: "연합"
instanceCloud: "인스턴스 구름"
postForm: "글 입력란"

View file

@ -1,5 +1,5 @@
---
_lang_: "język polski"
_lang_: "Polski"
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🚀!"
monthAndDay: "{month}-{day}"
@ -88,7 +88,7 @@ enterListName: "Nazwa listy"
privacy: "Prywatność"
makeFollowManuallyApprove: "Prośby o możliwość obserwacji wymagają zatwierdzenia"
defaultNoteVisibility: "Domyślna widoczność"
follow: "Obserwowani"
follow: "Obserwuj"
followRequest: "Poproś o możliwość obserwacji"
followRequests: "Prośby o możliwość obserwacji"
unfollow: "Przestań obserwować"
@ -127,7 +127,7 @@ unsuspendConfirm: "Czy na pewno chcesz cofnąć zawieszenie tego konta?"
selectList: "Wybierz listę"
selectAntenna: "Wybierz Antennę"
selectWidget: "Wybierz widżet"
editWidgets: "Edytuj widżet"
editWidgets: "Edytuj widżety"
editWidgetsExit: "Gotowe"
customEmojis: "Niestandardowe 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."
flagAsCat: "To konto jest kotem"
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"
addAccount: "Dodaj konto"
loginFailed: "Nie udało się zalogować"
@ -201,6 +202,7 @@ done: "Gotowe"
processing: "Przetwarzanie"
preview: "Podgląd"
default: "Domyślne"
defaultValueIs: "Domyślne: {value}"
noCustomEmojis: "Brak emoji"
noJobs: "Brak zadań"
federating: "Federowanie"
@ -235,6 +237,7 @@ resetAreYouSure: "Czy na pewno chcesz zresetować?"
saved: "Zapisano"
messaging: "Wiadomości"
upload: "Wyślij"
keepOriginalUploading: "Zachowaj oryginalny obraz"
fromDrive: "Z dysku"
fromUrl: "Z adresu URL"
uploadFromUrl: "Wyślij z adresu URL"
@ -377,6 +380,7 @@ administrator: "Admin"
token: "Token"
twoStepAuthentication: "Uwierzytelnianie dwuskładnikowe"
moderator: "Moderator"
moderation: "Moderacja"
nUsersMentioned: "{n} wspomnianych użytkowników"
securityKey: "Klucz bezpieczeństwa"
securityKeyName: "Nazwa klucza"
@ -444,11 +448,13 @@ uiLanguage: "Język wyświetlania UI"
groupInvited: "Zaproszony(-a) do grupy"
aboutX: "O {x}"
useOsNativeEmojis: "Używaj natywnych Emoji systemu"
disableDrawer: "Nie używaj menu w stylu szuflady"
youHaveNoGroups: "Nie masz żadnych grup"
joinOrCreateGroup: "Uzyskaj zaproszenie do dołączenia do grupy lub utwórz własną grupę."
noHistory: "Brak historii"
signinHistory: "Historia logowania"
disableAnimatedMfm: "Wyłącz MFM z animacją"
doing: "Przetwarzanie..."
category: "Kategoria"
tags: "Tagi"
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."
userSuspended: "To konto zostało zawieszone."
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"
addItem: "Dodaj element"
relays: "Przekaźniki"
@ -541,7 +550,7 @@ disablePlayer: "Zamknij odtwarzacz wideo"
expandTweet: "Rozwiń tweet"
themeEditor: "Edytor motywu"
description: "Opis"
describeFile: "dodaj podpis"
describeFile: "Dodaj podpis"
enterFileDescription: "Wprowadź napis"
author: "Autor"
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"
testEmail: "Przetestuj dostarczanie wiadomości e-mail"
wordMute: "Wyciszenie słowa"
instanceMute: "Wyciszone instancje"
userSaysSomething: "{name} powiedział(-a) coś"
makeActive: "Aktywuj"
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."
reporteeOrigin: "Pochodzenie zgłoszonego"
reporterOrigin: "Pochodzenie zgłaszającego"
forwardReport: "Przekaż zgłoszenie do innej instancji"
send: "Wyślij"
abuseMarkAsResolved: "Oznacz zgłoszenie jako rozwiązane"
openInNewTab: "Otwórz w nowej karcie"
@ -619,8 +630,12 @@ random: "Losowe"
system: "System"
switchUi: "Przełącz interfejs użytkownika"
desktop: "Pulpit"
clip: "Klip"
createNew: "Utwórz nowy"
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"
i18nInfo: "Misskey jest tłumaczone na wiele języków przez wolontariuszy. Możesz pomóc na {link}."
manageAccessTokens: "Zarządzaj tokenami dostępu"
@ -654,6 +669,7 @@ pageLikesCount: "Liczba otrzymanych polubień stron"
pageLikedCount: "Liczba polubionych stron"
contact: "Kontakt"
useSystemFont: "Używaj domyślnej czcionki systemu"
clips: "Klipy"
experimentalFeatures: "Eksperymentalne funkcje"
developer: "Programista"
makeExplorable: "Pokazuj konto na stronie „Eksploruj”"
@ -725,6 +741,7 @@ notRecommended: "Nie zalecane"
botProtection: "Zabezpieczenie przed botami"
instanceBlocking: "Zablokowane instancje"
selectAccount: "Wybierz konto"
switchAccount: "Przełącz konto"
enabled: "Właczono"
disabled: "Wyłączono"
quickAction: "Szybkie działania"
@ -756,22 +773,103 @@ global: "Globalna"
squareAvatars: "Wyświetlaj kwadratowe awatary"
sent: "Wyślij"
received: "Otrzymane"
searchResult: "Wyniki wyszukiwania"
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"
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"
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"
indefinitely: "Nigdy"
file: "Pliki"
logoutConfirm: "Czy na pewno chcesz się wylogować?"
lastActiveDate: "Ostatnio użyte w"
statusbar: "Pasek stanu"
pleaseSelect: "Wybierz opcję"
reverse: "Odwróć"
colored: "Kolorowe"
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"
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:
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:
back: "Wróć"
reduceFrequencyOfThisAd: "Pokazuj tę reklamę rzadziej"
_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."
contactAdmin: "Jeżeli Twoja instancja nie obsługuje adresów e-mail, skontaktuj się zamiast tego z administratorem, aby zresetować hasło."
_gallery:
@ -788,6 +886,23 @@ _plugin:
install: "Zainstaluj wtyczki"
installWarn: "Nie instaluj niezaufanych wtyczek."
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:
scope: "Zakres"
key: "Klucz"
@ -822,10 +937,13 @@ _mfm:
bold: "Pogrubienie"
boldDescription: "Wyróżnia litery pogrubiając je."
small: "Małe"
smallDescription: "Wyświetla treść jako małą i cienką."
center: "Wyśrodkowanie"
centerDescription: "Wyśrodkowuje zawartość."
inlineCode: "Kod (w wierszu)"
blockCode: "Kod (blok)"
blockCodeDescription: "Wyświetla kod z podświetlaną składnią składający się z wielu linii."
blockMath: "Matematyka (Blok)"
quote: "Cytuj"
quoteDescription: "Wyświetla treść jako cytat."
emoji: "Niestandardowe emoji"
@ -834,6 +952,20 @@ _mfm:
searchDescription: "Wyświetla pole wyszukiwania z wcześniej wpisanym tekstem."
flip: "Odwróć"
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"
x2Description: "Czyni treść większą."
x3: "Bardzo duże"
@ -841,9 +973,17 @@ _mfm:
x4: "Ogromne"
x4Description: "Czyni treść jeszcze większą niż jeszcze większa."
blur: "Rozmycie"
blurDescription: "Rozmywa treść. Zostanie wyraźnie wyświetlona po najechaniu."
font: "Czcionka"
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óć"
rotateDescription: "Obraca zawartość o określony kąt."
plain: "Zwyczajny"
plainDescription: "Wyłącza efekty wszystkich MFM zawartych w tym efekcie MFM."
_instanceTicker:
none: "Nigdy nie pokazuj"
remote: "Pokaż dla zdalnych użytkowników"
@ -863,6 +1003,7 @@ _channel:
usersCount: "{n} uczestnicy"
notesCount: "{n} wpisy"
_menuDisplay:
top: "Góra"
hide: "Ukryj"
_wordMute:
muteWords: "Słowo do wyciszenia"
@ -870,6 +1011,9 @@ _wordMute:
soft: "Łagodny"
hard: "Twardy"
mutedNotes: "Wyciszone wpisy"
_instanceMute:
title: "Ukrywa wpisy z wymienionych instancji."
heading: "Lista instancji do wyciszenia"
_theme:
explore: "Przeglądaj motywy"
install: "Zainstaluj motyw"
@ -950,6 +1094,7 @@ _sfx:
notification: "Powiadomienia"
chat: "Wiadomości"
chatBg: "Rozmowy (tło)"
antenna: "Anteny"
channel: "Powiadomienia kanału"
_ago:
future: "W przyszłości"
@ -969,12 +1114,30 @@ _time:
_tutorial:
title: "Jak korzystać z Misskey"
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."
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_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_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:
alreadyRegistered: "Zarejestrowałeś już urządzenie do uwierzytelniania dwuskładnikowego."
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."
step2: "Następnie, zeskanuje kod QR z ekranu."
step3: "Wprowadź token podany w aplikacji, aby ukończyć konfigurację."
@ -990,6 +1153,7 @@ _permissions:
"write:favorites": "Edycja Twojej listy ulubionych."
"read:following": "Wyświetlanie informacji o obserwowanych"
"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ś)"
"write:mutes": "Edycja listy osób, które wyciszyłeś(-aś)"
"read:notifications": "Wyświetlanie powiadomień"
@ -1003,6 +1167,10 @@ _permissions:
"write:page-likes": "Edycja polubień na stronach"
"read:user-groups": "Wyświetlanie 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:
shareAccess: "Czy chcesz autoryzować „{name}” do dostępu do tego konta?"
permissionAsk: "Ta aplikacja wymaga następujących uprawnień:"
@ -1021,12 +1189,21 @@ _widgets:
calendar: "Kalendarz"
trends: "Na czasie"
clock: "Zegar"
rss: "Czytnik RSS"
activity: "Aktywność"
photos: "Zdjęcia"
digitalClock: "Zegar cyfrowy"
unixClock: "Zegar UNIX"
federation: "Federacja"
postForm: "Utwórz wpis"
instanceCloud: "Chmura instancji"
postForm: "Formularz tworzenia wpisu"
slideshow: "Pokaz slajdów"
button: "Przycisk"
onlineUsers: "Użytkownicy online"
jobQueue: "Kolejka zadań"
serverMetric: "Metryka serwera"
aiscript: "Konsola AiScript"
aichan: "Ai"
_cw:
hide: "Ukryj"
show: "Załaduj więcej"
@ -1393,9 +1570,11 @@ _notification:
youReceivedFollowRequest: "Otrzymałeś(-aś) prośbę o możliwość obserwacji"
yourFollowRequestAccepted: "Twoja prośba o możliwość obserwacji została przyjęta"
youWereInvitedToGroup: "Zaproszony(-a) do grupy"
pollEnded: "Wyniki ankiety stały się dostępne"
emptyPushNotificationMessage: "Powiadomienia push zostały zaktualizowane"
_types:
all: "Wszystkie"
follow: "Obserwowani"
follow: "Nowi obserwujący"
mention: "Wspomnij"
reply: "Odpowiedzi"
renote: "Udostępnij"
@ -1407,12 +1586,14 @@ _notification:
groupInvited: "Zaproszono do grup"
app: "Powiadomienia z aplikacji"
_actions:
followBack: "zaobserwował cię z powrotem"
reply: "Odpowiedz"
renote: "Udostępnij"
_deck:
alwaysShowMainColumn: "Zawsze pokazuj główną kolumnę"
columnAlign: "Wyrównaj kolumny"
addColumn: "Dodaj kolumnę"
configureColumn: "Ustawienia kolumny"
swapLeft: "Przesuń w lewo"
swapRight: "Przesuń w prawo"
swapUp: "Zamień z powyższym"
@ -1420,6 +1601,9 @@ _deck:
stackLeft: "Przypnij do lewej"
popRight: "Odepnij w prawo"
profile: "Profil"
newProfile: "Nowy profil"
deleteProfile: "Usuń profil"
widgetsIntroduction: "Wybierz \"Edytuj widżety\" w menu kolumny i dodaj widżet."
_columns:
main: "Główna"
widgets: "Widżety"

View file

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

View file

@ -562,6 +562,7 @@ author: "ผู้เขียน"
leaveConfirm: "คุณมีการเปลี่ยนแปลงที่ไม่ได้บันทึกนะ นายต้องการทิ้งการเปลี่ยนแปลงเหล่านั้นหรอ?"
manage: "การจัดการ"
plugins: "ปลั๊กอิน"
preferencesBackups: "ตั้งค่าการสำรองข้อมูล"
deck: "เด็ค"
undeck: "ออกจากเด็ค"
useBlurEffectForModal: "ใช้เอฟเฟกต์เบลอสำหรับโมดอล"
@ -598,7 +599,7 @@ wordMute: "ปิดเสียงคำ"
regexpError: "ข้อผิดพลาดของนิพจน์ทั่วไป"
regexpErrorDescription: "เกิดข้อผิดพลาดในนิพจน์ทั่วไปในบรรทัดที่ {line} ของการปิดเสียงคำ {tab} ของคุณ:"
instanceMute: "ปิดเสียง อินสแตนซ์"
userSaysSomething: "{ชื่อ} พูดอะไรบางอย่าง"
userSaysSomething: "{name} พูดอะไรบางอย่าง"
makeActive: "เปิดใช้งาน"
display: "แสดงผล"
copy: "คัดลอก"
@ -913,13 +914,89 @@ _ffVisibility:
_signup:
almostThere: "เกือบจะมี"
emailAddressInfo: "โปรดกรอกอีเมลของคุณ มันจะไม่เปิดเผยต่อสาธารณะ"
emailSent: "เราได้ส่งอีเมลยืนยันไปยังที่อยู่อีเมลของคุณแล้วนะ ({email}) โปรดคลิกลิงก์ที่รวมไว้เพื่อสร้างบัญชีให้เสร็จสิ้น"
_accountDelete:
accountDelete: "ลบบัญชีผู้ใช้"
mayTakeTime: "เนื่องจากการลบบัญชีนี้จะเป็นกระบวนการที่ต้องใช้ทรัพยากรมาก จึงอาจจะต้องใช้เวลาสักครู่ถึงจะเสร็จสมบูรณ์ ทั้งนี้ขึ้นอยู่กับจำนวนเนื้อหาที่คุณสร้างและจำนวนไฟล์ที่คุณอัปโหลดนะ"
sendEmail: "เมื่อการลบบัญชีนี้เสร็จสิ้น เราอาจจะส่งอีเมลไปยังที่อยู่อีเมลของคุณที่เคยลงทะเบียนไว้กับบัญชีนี้นะ"
requestAccountDelete: "ร้องขอให้ลบบัญชี"
started: "การลบได้เริ่มต้นขึ้น"
inProgress: "ปัจจุบันกำลังดำเนินการลบอยู่"
_ad:
back: "ย้อนกลับ"
reduceFrequencyOfThisAd: "แสดงโฆษณานี้ให้น้อยลง"
_forgotPassword:
enterEmail: "ป้อนที่อยู่อีเมลที่คุณเคยใช้ในการลงทะเบียนไว้ ลิงก์ที่คุณสามารถรีเซ็ตรหัสผ่านได้นั้นจะถูกส่งไปนะ"
ifNoEmail: "ถ้าหากคุณไม่ได้ใช้อีเมลระหว่างการลงทะเบียน กรุณาติดต่อผู้ดูแลระบบอินสแตนซ์แทนนะ"
contactAdmin: "อินสแตนซ์นี้ไม่รองรับการใช้งานที่อยู่อีเมลนี้ กรุณาติดต่อผู้ดูแลระบบอินสแตนซ์เพื่อรีเซ็ตรหัสผ่านของคุณแทน"
_gallery:
my: "แกลลอรี่ของฉัน"
liked: "โพสต์ที่ถูกใจ"
like: "ชื่นชอบ"
unlike: "ลบไลค์"
_email:
_follow:
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:
cheatSheet: "โค้ด MFM Cheat Sheet"
intro: "MFM เป็นภาษามาร์กอัปพิเศษเฉพาะของ Misskey ที่สามารถใช้ได้ในหลายที่ คุณยังสามารถดูรายการไวยากรณ์ MFM ที่มีอยู่ทั้งหมดได้ที่นี่นะ"
dummy: "Misskey ขยายโลกของ Fediverse"
mention: "กล่าวถึง"
mentionDescription: "คุณสามารถระบุผู้ใช้โดยใช้ At-Symbol และชื่อผู้ใช้ได้นะ"
hashtag: "แฮชแท็ก"
hashtagDescription: "คุณสามารถระบุชื่อแฮชแท็กได้โดยใช้เครื่องหมายตัวเลขและข้อความได้นะ"
url: "URL"
urlDescription: "สามารถแสดง URL ได้นะ"
link: "ลิงก์"
linkDescription: "เจาะจงเฉพาะ ส่วนของข้อความที่สามารถแสดงเป็น URL ได้"
bold: "ตัวหนา"
boldDescription: "ไฮไลท์ตัวอักษรโดยทำให้หนาขึ้น"
small: "ขนาดเล็ก"
smallDescription: "แสดงผลเนื้อหาขนาดเล็กและบาง"
center: "เซ็นเตอร์"
centerDescription: "แสดงผลเนื้อหาเป็นศูนย์กลาง"
inlineCode: "โค้ด (อินไลน์)"
inlineCodeDescription: "แสดงผลการเน้นไวยากรณ์แบบอินไลน์สำหรับโค้ด (โปรแกรม)"
@ -936,9 +1013,117 @@ _mfm:
search: "ค้นหา"
searchDescription: "แสดงผลกล่องค้นหาพร้อมกับข้อความที่ป้อนไว้ล่วงหน้า"
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:
explore: "สำรวจธีม"
install: "ติดตั้งธีม"
manage: "จัดการธีม"
code: "โค้ดธีม"
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:
accent: "เน้น"
bg: "ภาพพื้นหลัง"
fg: "ข้อความ"
focus: "โฟกัส"
indicator: "ตัวบ่งชี้"
panel: "แผงควบคุม"
shadow: "เงา"
header: "ส่วนหัว"
navBg: "พื้นหลังแถบด้านข้าง"
navFg: "ข้อความแถบด้านข้าง"
mention: "กล่าวถึง"
renote: "รีโน้ต"
divider: "ตัวแบ่ง"

View file

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

View file

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

View file

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

View file

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

View file

@ -1,7 +1,7 @@
import { Entity, Column, PrimaryColumn, ManyToOne, JoinColumn } from 'typeorm';
import { id } from '../id.js';
import { User } from './user.js';
import { Clip } from './clip.js';
import type { Clip } from './clip.js';
@Entity()
export class Meta {
@ -98,22 +98,22 @@ export class Meta {
public blockedHosts: string[];
@Column('boolean', {
default: false
default: false,
})
public secureMode: boolean;
@Column('boolean', {
default: false
default: false,
})
public privateMode: boolean;
@Column('varchar', {
length: 256, array: true, default: '{}'
length: 256, array: true, default: '{}',
})
public allowedHosts: string[];
@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[];

View file

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

View file

@ -12,8 +12,6 @@ export const meta = {
requireCredential: false,
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: {
type: 'array',
optional: false, nullable: false,
@ -29,20 +27,7 @@ export const paramDef = {
type: 'object',
properties: {
noteId: { type: 'string', format: 'misskey:id' },
limit: {
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,
},
limit: { type: 'integer', minimum: 1, maximum: 100, default: 10 },
sinceId: { 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
const fontSize = localStorage.getItem('fontSize');

View file

@ -327,32 +327,24 @@ router.get('/notes/:note', async (ctx, next) => {
});
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 profile = await UserProfiles.findOneByOrFail({ userId: note.userId });
const meta = await fetchMeta();
await ctx.render('note', {
note: _note,
profile,
avatarUrl: await Users.getAvatarUrl(await Users.findOneByOrFail({ id: note.userId })),
// TODO: Let locale changeable by instance setting
summary: getNoteSummary(_note),
instanceName: meta.name || 'Calckey',
icon: meta.iconUrl,
themeColor: meta.themeColor,
});
const _note = await Notes.pack(note);
const profile = await UserProfiles.findOneByOrFail({ userId: note.userId });
const meta = await fetchMeta();
await ctx.render('note', {
note: _note,
profile,
avatarUrl: await Users.getAvatarUrl(await Users.findOneByOrFail({ id: note.userId })),
// TODO: Let locale changeable by instance setting
summary: getNoteSummary(_note),
instanceName: meta.name || 'Calckey',
icon: meta.iconUrl,
privateMode: meta.privateMode,
themeColor: meta.themeColor,
});
ctx.set('Cache-Control', 'public, max-age=15');
ctx.set('Cache-Control', 'public, max-age=15');
return;
} catch (err) {
if (err.id === '9725d0ce-ba28-4dde-95a7-2cbb2c15de24') {
// note not visible to user
} else {
throw err;
}
}
return;
}
await next();
@ -530,19 +522,20 @@ router.get('(.*)', async ctx => {
if (meta.customMOTD.length > 0) {
motd = meta.customMOTD;
}
let iconUrl = meta.iconUrl;
let splashIconUrl = meta.iconUrl;
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', {
img: meta.bannerUrl,
title: meta.name || 'Calckey',
instanceName: meta.name || 'Calckey',
desc: meta.description,
icon: iconUrl,
icon: meta.iconUrl,
splashIcon: splashIconUrl,
themeColor: meta.themeColor,
privateMode: meta.privateMode,
randomMOTD: motd[Math.floor(Math.random() * motd.length)],
privateMode: meta.privateMode,
});
ctx.set('Cache-Control', 'public, max-age=3');
});

View file

@ -1,10 +1,12 @@
{
"short_name": "Calckey",
"name": "Calckey",
"description": "An open source, decentralized social media platform that's free forever!",
"start_url": "/",
"display": "standalone",
"background_color": "#6e6a86",
"background_color": "#1f1d2e",
"theme_color": "#31748f",
"orientation": "portrait-primary",
"icons": [
{
"src": "/static-assets/icons/192.png",
@ -24,5 +26,32 @@
"text": "text",
"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
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)
style
@ -77,7 +77,7 @@ html
br
| Please turn on your JavaScript
div#splash
img#splashIcon(src= icon || '/static-assets/splash.png')
img#splashIcon(src= splashIcon || '/static-assets/splash.png')
span#splashText
block randomMOTD
= randomMOTD

View file

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

View file

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

View file

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

View file

@ -2,7 +2,7 @@ extends ./base
block vars
- 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 isRenote = note.renote && note.text == null && note.fileIds.length == 0 && note.poll == null;

View file

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

View file

@ -1,7 +1,7 @@
extends ./base
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)}`;
block title

View file

@ -8,25 +8,25 @@
},
"dependencies": {
"@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-json": "4.1.0",
"@rollup/pluginutils": "^4.2.1",
"@syuilo/aiscript": "0.11.1",
"@vitejs/plugin-vue": "3.0.3",
"@vue/compiler-sfc": "3.2.37",
"@vitejs/plugin-vue": "3.1.0",
"@vue/compiler-sfc": "3.2.39",
"autobind-decorator": "2.4.0",
"autosize": "5.0.1",
"blurhash": "1.1.5",
"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",
"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",
"compare-versions": "4.1.3",
"cropperjs": "2.0.0-beta",
"date-fns": "2.29.1",
"compare-versions": "5.0.1",
"cropperjs": "2.0.0-beta.1",
"date-fns": "2.29.2",
"escape-regexp": "0.0.1",
"eventemitter3": "4.0.7",
"idb-keyval": "6.2.0",
@ -36,36 +36,40 @@
"matter-js": "0.18.0",
"mfm-js": "0.23.0",
"misskey-js": "0.0.14",
"photoswipe": "5.3.0",
"prismjs": "1.28.0",
"photoswipe": "5.3.2",
"prismjs": "1.29.0",
"punycode": "2.1.1",
"querystring": "0.2.1",
"rndstr": "1.0.0",
"s-age": "1.1.2",
"sass": "1.54.4",
"sass": "1.54.9",
"seedrandom": "3.0.5",
"strict-event-emitter-types": "2.0.0",
"stringz": "2.1.0",
"swiper": "^8.3.2",
"syuilo-password-strength": "0.0.1",
"tesseract.js": "^2.1.5",
"textarea-caret": "3.1.0",
"three": "0.143.0",
"three": "0.144.0",
"throttle-debounce": "5.0.0",
"tinycolor2": "1.4.2",
"tsc-alias": "1.7.0",
"tsconfig-paths": "4.1.0",
"twemoji-parser": "14.0.0",
"typescript": "4.7.4",
"uuid": "8.3.2",
"typescript": "4.8.3",
"uuid": "9.0.0",
"vanilla-tilt": "1.7.2",
"vite": "3.0.7",
"vue": "3.2.37",
"vite": "^3.1.0",
"vue": "3.2.39",
"vue-isyourpasswordsafe": "^2.0.0",
"vue-plyr": "^7.0.0",
"vue-prism-editor": "2.0.0-alpha.2",
"vuedraggable": "4.0.1"
"vue3-lottie": "^2.3.0",
"vuedraggable": "4.1.0"
},
"devDependencies": {
"@types/escape-regexp": "0.0.1",
"@types/glob": "7.2.0",
"@types/glob": "8.0.0",
"@types/gulp": "4.0.9",
"@types/gulp-rename": "2.0.1",
"@types/katex": "0.14.0",
@ -75,14 +79,14 @@
"@types/throttle-debounce": "5.0.0",
"@types/tinycolor2": "1.4.3",
"@types/uuid": "8.3.4",
"@typescript-eslint/eslint-plugin": "5.33.0",
"@typescript-eslint/parser": "5.33.0",
"@typescript-eslint/eslint-plugin": "5.36.2",
"@typescript-eslint/parser": "5.36.2",
"cross-env": "7.0.3",
"cypress": "10.4.0",
"eslint": "8.21.0",
"cypress": "10.7.0",
"eslint": "8.23.0",
"eslint-plugin-import": "2.26.0",
"eslint-plugin-vue": "9.3.0",
"rollup": "2.77.3",
"eslint-plugin-vue": "9.4.0",
"rollup": "2.79.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;
}, ev: MouseEvent) {
function showSigninDialog() {
popup(defineAsyncComponent(() => import('@/components/signin-dialog.vue')), {}, {
popup(defineAsyncComponent(() => import('@/components/MkSigninDialog.vue')), {}, {
done: res => {
addAccount(res.id, res.i);
success();
@ -155,7 +155,7 @@ export async function openAccountMenu(opts: {
}
function createAccount() {
popup(defineAsyncComponent(() => import('@/components/signup-dialog.vue')), {}, {
popup(defineAsyncComponent(() => import('@/components/MkSignupDialog.vue')), {}, {
done: res => {
addAccount(res.id, res.i);
switchAccountWithToken(res.i);

View file

@ -36,9 +36,9 @@
</template>
<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 MkKeyValue from '@/components/key-value.vue';
import MkKeyValue from '@/components/MkKeyValue.vue';
import { acct, userPage } from '@/filters/user';
import * as os from '@/os';
import { i18n } from '@/i18n';

View file

@ -25,9 +25,9 @@
<script setup lang="ts">
import { ref } from 'vue';
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 MkButton from '@/components/ui/button.vue';
import MkButton from '@/components/MkButton.vue';
import * as os from '@/os';
import { i18n } from '@/i18n';

View file

@ -26,6 +26,7 @@
</text>
</template>
<!--
<line
:x1="5 - (Math.sin(sAngle) * (sHandLengthRatio * handsTailLength))"
:y1="5 + (Math.cos(sAngle) * (sHandLengthRatio * handsTailLength))"
@ -35,6 +36,20 @@
:stroke-width="thickness / 2"
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
:x1="5 - (Math.sin(mAngle) * (mHandLengthRatio * handsTailLength))"
@ -59,7 +74,7 @@
</template>
<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 { globalEvents } from '@/events.js';
@ -84,6 +99,7 @@ const props = withDefaults(defineProps<{
twentyfour?: boolean;
graduations?: 'none' | 'dots' | 'numbers';
fadeGraduations?: boolean;
sAnimation?: 'none' | 'elastic' | 'easeOut';
}>(), {
numbers: false,
thickness: 0.1,
@ -91,6 +107,7 @@ const props = withDefaults(defineProps<{
twentyfour: false,
graduations: 'dots',
fadeGraduations: true,
sAnimation: 'elastic',
});
const graduationsMajor = computed(() => {
@ -125,6 +142,8 @@ let s = $ref<number>(0);
let hAngle = $ref<number>(0);
let mAngle = $ref<number>(0);
let sAngle = $ref<number>(0);
let disableSAnimate = $ref(false);
let sOneRound = false;
function tick() {
const now = new Date();
@ -134,7 +153,21 @@ function tick() {
h = now.getHours();
hAngle = Math.PI * (h % (props.twentyfour ? 24 : 12) + (m + s / 60) / 60) / (props.twentyfour ? 12 : 6);
mAngle = Math.PI * (m + s / 60) / 30;
sAngle = Math.PI * s / 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;
}
sOneRound = s === 59;
}
tick();
@ -175,5 +208,18 @@ onBeforeUnmount(() => {
<style lang="scss" scoped>
.mbcofsoe {
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>

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -38,13 +38,19 @@ const toggle = () => {
.nrvgflfu {
display: inline-block;
padding: 4px 8px;
font-size: 0.7em;
font-size: 0.8em;
color: var(--cwFg);
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 {
background: var(--cwHoverBg);
background: var(--cwFg);
color: var(--cwBg);
}
> span {

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -46,7 +46,7 @@
</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">
<button
v-for="emoji in recentlyUsedEmojis"
@ -60,11 +60,11 @@
</section>
</div>
<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>
</div>
<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>
</div>
</div>
@ -80,10 +80,10 @@
<script lang="ts" setup>
import { ref, computed, watch, onMounted } from 'vue';
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 { 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 { isTouchUsing } from '@/scripts/touch';
import { deviceKind } from '@/scripts/device-kind';

View file

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

View file

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

View file

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

View file

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

View file

@ -61,9 +61,9 @@ import FormTextarea from './form/textarea.vue';
import FormSwitch from './form/switch.vue';
import FormSelect from './form/select.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 XModalWindow from '@/components/ui/modal-window.vue';
import XModalWindow from '@/components/MkModalWindow.vue';
export default defineComponent({
components: {

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -68,7 +68,7 @@ import {
DoughnutController,
} from 'chart.js';
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 * as os from '@/os';
import { i18n } from '@/i18n';

View file

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

View file

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

View file

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

View file

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

View file

@ -24,7 +24,7 @@
import { watch } from 'vue';
import * as misskey from 'misskey-js';
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';
const props = defineProps<{

View file

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

View file

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

View file

@ -7,7 +7,7 @@
<script lang="ts" setup>
import { on } from 'events';
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 * as os from '@/os';

View file

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

View file

@ -22,7 +22,7 @@
<script lang="ts" setup>
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 copyToClipboard from '@/scripts/copy-to-clipboard';
import { url } from '@/config';

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