mirror of
https://iceshrimp.dev/iceshrimp/iceshrimp
synced 2024-12-30 06:28:04 +09:00
Merge pull request 'develop' (#9032) from develop into main
Reviewed-on: https://codeberg.org/thatonecalculator/calckey/pulls/9032
This commit is contained in:
commit
6141fc17e8
@ -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
3
.gitignore
vendored
@ -24,6 +24,9 @@ packages/sw/.yarn/cache
|
||||
cypress/screenshots
|
||||
cypress/videos
|
||||
|
||||
# Coverage
|
||||
coverage
|
||||
|
||||
# config
|
||||
/.config/*
|
||||
!/.config/example.yml
|
||||
|
@ -15,6 +15,9 @@ packageExtensions:
|
||||
chartjs-adapter-date-fns@*:
|
||||
peerDependencies:
|
||||
date-fns: "*"
|
||||
swiper@*:
|
||||
peerDependencies:
|
||||
vue: "*"
|
||||
consolidate@*:
|
||||
dependencies:
|
||||
ejs: "*"
|
||||
|
28
CALCKEY.md
28
CALCKEY.md
@ -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
|
||||
|
@ -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)
|
||||
|
||||
|
@ -1,7 +1,7 @@
|
||||
FROM node:alpine
|
||||
ENV YARN_CHECKSUM_BEHAVIOR=update
|
||||
ARG NODE_ENV=production
|
||||
WORKDIR /misskey
|
||||
WORKDIR /calckey
|
||||
|
||||
# Copy Files
|
||||
COPY . ./
|
||||
|
@ -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>
|
||||
|
||||
|
@ -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'
|
||||
#]
|
||||
|
@ -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"
|
||||
|
@ -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"
|
||||
|
@ -379,7 +379,7 @@ exploreFediverse: "Fediverseを探索"
|
||||
popularTags: "人気のタグ"
|
||||
userList: "リスト"
|
||||
about: "情報"
|
||||
aboutMisskey: "Misskeyについて"
|
||||
aboutMisskey: "Calckeyについて"
|
||||
administrator: "管理者"
|
||||
token: "トークン"
|
||||
twoStepAuthentication: "二段階認証"
|
||||
|
@ -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: "글 입력란"
|
||||
|
@ -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"
|
||||
|
@ -562,6 +562,7 @@ author: "Автор"
|
||||
leaveConfirm: "Вы не сохранили изменения. Хотите выйти и потерять их?"
|
||||
manage: "Управление"
|
||||
plugins: "Расширения"
|
||||
preferencesBackups: "Резервная копия"
|
||||
deck: "Пульт"
|
||||
undeck: "Покинуть пульт"
|
||||
useBlurEffectForModal: "Размывка под формой поверх всего"
|
||||
|
@ -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: "ตัวแบ่ง"
|
||||
|
@ -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: "离线"
|
||||
|
@ -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: "已開始刪除作業。"
|
||||
|
18
package.json
18
package.json
@ -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
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
BIN
packages/backend/assets/screenshots/2.webp
(Stored with Git LFS)
Normal file
Binary file not shown.
@ -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"
|
||||
}
|
||||
}
|
||||
|
@ -63,8 +63,6 @@ export type Source = {
|
||||
|
||||
mediaProxy?: string;
|
||||
proxyRemoteFiles?: boolean;
|
||||
|
||||
signToActivityPubGet?: boolean;
|
||||
};
|
||||
|
||||
/**
|
||||
|
@ -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[];
|
||||
|
||||
|
@ -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,
|
||||
|
@ -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' },
|
||||
},
|
||||
|
@ -92,6 +92,10 @@
|
||||
}
|
||||
}
|
||||
}
|
||||
const colorSchema = localStorage.getItem('colorSchema');
|
||||
if (colorSchema) {
|
||||
document.documentElement.style.setProperty('color-schema', colorSchema);
|
||||
}
|
||||
//#endregion
|
||||
|
||||
const fontSize = localStorage.getItem('fontSize');
|
||||
|
@ -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');
|
||||
});
|
||||
|
@ -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"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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"
|
||||
}
|
||||
}
|
||||
|
@ -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);
|
||||
|
@ -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';
|
@ -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';
|
||||
|
@ -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>
|
@ -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>
|
@ -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;
|
@ -11,5 +11,5 @@ defineProps<{
|
||||
inline?: boolean;
|
||||
}>();
|
||||
|
||||
const XCode = defineAsyncComponent(() => import('./code-core.vue'));
|
||||
const XCode = defineAsyncComponent(() => import('@/components/MkCode.core.vue'));
|
||||
</script>
|
@ -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';
|
@ -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';
|
@ -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 {
|
@ -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>
|
||||
|
@ -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';
|
@ -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>
|
@ -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',
|
@ -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';
|
@ -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;
|
@ -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';
|
||||
|
@ -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<{
|
@ -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';
|
@ -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<{
|
@ -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;
|
@ -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';
|
@ -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';
|
@ -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: {
|
@ -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>
|
@ -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>
|
@ -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;
|
@ -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>
|
@ -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<{
|
@ -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';
|
@ -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';
|
@ -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,
|
@ -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 {
|
@ -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';
|
||||
|
@ -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<{
|
@ -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';
|
@ -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;
|
@ -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';
|
||||
|
@ -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[];
|
@ -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
Loading…
Reference in New Issue
Block a user