Compare commits
131 Commits
Author | SHA1 | Date | |
---|---|---|---|
df53968306 | |||
19f753c15c | |||
df530bb66d | |||
fa49427df0 | |||
6678d97cc4 | |||
e3642a8d10 | |||
f9022fdf16 | |||
1c764139bf | |||
048ed26f41 | |||
c52e30e8e0 | |||
0cb04ded36 | |||
6cfad65ac7 | |||
ed20805b10 | |||
576303cd72 | |||
0062e084f8 | |||
b90d76dcfe | |||
c95619b2bf | |||
82150bd5b8 | |||
9e03335ff8 | |||
b3c5c3f0ea | |||
65858dab3e | |||
c968633d15 | |||
39a8942daf | |||
7705a7928e | |||
d2c14b844e | |||
3e45e6c165 | |||
fe8334931f | |||
f565c5f730 | |||
c03e2febb0 | |||
c2f4fb7ba7 | |||
5f869e5d87 | |||
65f1afc4e0 | |||
aec2762bf1 | |||
a41144a00f | |||
aa28e8a7a6 | |||
a1a51ce518 | |||
90999e0ef9 | |||
2ceeb17056 | |||
18afdd6040 | |||
b9972ec6bd | |||
ebb53e87f3 | |||
9f9d7325fd | |||
742a005523 | |||
3a28c06534 | |||
46d5711071 | |||
48113f3afd | |||
be29972ddf | |||
49b3a83f76 | |||
342794c728 | |||
3739638c81 | |||
401351d9c8 | |||
6073a03967 | |||
3e3d294188 | |||
f6f96ae5bf | |||
62ccb53c24 | |||
e410e22980 | |||
fc5ceea335 | |||
38af8d4737 | |||
33b0cab596 | |||
2a47e4a1e1 | |||
46f53868c5 | |||
eac7f11aa7 | |||
e219188f46 | |||
3df8c701a7 | |||
1186813c75 | |||
645b6fdc8a | |||
ae0596a729 | |||
bb5fd3c1f2 | |||
532fa9c5f9 | |||
80a4aa6fa6 | |||
4f218f544f | |||
f261f8d7d1 | |||
e044d11782 | |||
d2da459dd8 | |||
b1e6a33d6b | |||
0d276d0d61 | |||
998936651a | |||
1bec25e8e6 | |||
f220e4183f | |||
e965b57dc2 | |||
5e6e1e237a | |||
41fe364b49 | |||
2953ba17c3 | |||
f3b3e06329 | |||
98249942d5 | |||
0fc8445425 | |||
943a1940e2 | |||
15d166e30e | |||
83619fda98 | |||
12913a16fd | |||
e23ad7833d | |||
38aa760b57 | |||
acb9244205 | |||
3182606e99 | |||
7cc8646ad3 | |||
e793fced61 | |||
248edb5dfd | |||
9414a944b7 | |||
756b8a2a29 | |||
f142ed91fb | |||
6aef54a9e0 | |||
f1c9e596e8 | |||
862ddde0db | |||
ee5a060762 | |||
42d293ee60 | |||
04e27e160e | |||
62dede02ea | |||
6d1d7b5366 | |||
55e5c12441 | |||
0b34503c8a | |||
dc69490e3a | |||
1c241776a6 | |||
6812b895e7 | |||
ab439d0ed6 | |||
c7a2c368d4 | |||
2047860e71 | |||
1dbe03b210 | |||
b59a19c144 | |||
558d288e7b | |||
e24c8b6878 | |||
1772af9583 | |||
cb42f94d9c | |||
38474c7316 | |||
49febe1764 | |||
65addc8206 | |||
28f7e48dc6 | |||
d97fc9ce4e | |||
f26aeee819 | |||
c071467b6a | |||
334ca01092 | |||
c122ec2e79 |
43
.github/PULL_REQUEST_TEMPLATE.md
vendored
43
.github/PULL_REQUEST_TEMPLATE.md
vendored
@ -1,13 +1,32 @@
|
|||||||
## Summary
|
<!-- ℹ お読みください
|
||||||
|
PRありがとうございます! PRを作成する前に、以下をご確認ください:
|
||||||
|
可能であればタイトルに、以下で示すようなPRの種類が分かるキーワードをプリフィクスしてください。
|
||||||
|
fix / refactor / feat / enhance / perf / chore
|
||||||
|
また、PRの粒度が適切であることを確認してください。ひとつのPRに複数の種類の変更や関心を含めることは避けてください。
|
||||||
|
このPRによって解決されるIssueがある場合は、そのIssue IDを本文内に記入してください。
|
||||||
|
CHANGELOG.mdに変更点を追記してください。リファクタリングなど、利用者に影響を与えない変更についてはこの限りではありません。
|
||||||
|
機能追加やバグ修正をした場合は、可能であればテストケースを追加してください。
|
||||||
|
ご協力ありがとうございます🤗
|
||||||
|
-->
|
||||||
|
<!-- ℹ README
|
||||||
|
Thank you for your PR! Before creating a PR, please check the following:
|
||||||
|
If possible, prefix the title with a keyword that identifies the type of this PR, as shown below.
|
||||||
|
fix / refactor / feat / enhance / perf / chore
|
||||||
|
Also, make sure that the granularity of this PR is appropriate. Please do not include more than one type of change or interest in a single PR.
|
||||||
|
If there is an issue to be resolved by this PR, please include the Issue ID in the text.
|
||||||
|
Please add the summary of the changes to CHANGELOG.md. However, this is not necessary for changes that do not affect the users, such as refactoring.
|
||||||
|
If you have added a feature or fixed a bug, please add a test case if possible.
|
||||||
|
Thanks for your cooperation 🤗
|
||||||
|
-->
|
||||||
|
|
||||||
<!--
|
# What
|
||||||
-
|
<!-- このPRで何をしたのか? どう変わるのか? -->
|
||||||
- * Please describe your changes here *
|
<!-- What did you do with this PR? How will it change things? -->
|
||||||
-
|
|
||||||
- If you are going to resolve some issue, please add this context.
|
# Why
|
||||||
- Resolve #ISSUE_NUMBER
|
<!-- なぜそうするのか? どういう意図なのか? 何が困っているのか? -->
|
||||||
-
|
<!-- Why do you do it? What are your intentions? What is the problem? -->
|
||||||
- If you are going to fix some bug issue, please add this context.
|
|
||||||
- Fix #ISSUE_NUMBER
|
# Additional info (optional)
|
||||||
-
|
<!-- テスト観点など -->
|
||||||
-->
|
<!-- Test perspective, etc -->
|
||||||
|
@ -2,6 +2,6 @@
|
|||||||
"extension": ["ts","js","cjs","mjs"],
|
"extension": ["ts","js","cjs","mjs"],
|
||||||
"require": ["ts-node/register", "tsconfig-paths/register"],
|
"require": ["ts-node/register", "tsconfig-paths/register"],
|
||||||
"slow": 1000,
|
"slow": 1000,
|
||||||
"timeout": 30000,
|
"timeout": 35000,
|
||||||
"exit": true
|
"exit": true
|
||||||
}
|
}
|
||||||
|
@ -28,12 +28,7 @@ If your language is not listed in Crowdin, please open an issue.
|
|||||||
|
|
||||||

|

|
||||||
|
|
||||||
## Internationalization (i18n)
|
|
||||||
Misskey uses the Vue.js plugin [Vue I18n](https://github.com/kazupon/vue-i18n).
|
|
||||||
Documentation of Vue I18n is available at http://kazupon.github.io/vue-i18n/introduction.html .
|
|
||||||
|
|
||||||
## Documentation
|
## Documentation
|
||||||
* Documents for contributors are located in [`/docs`](/docs).
|
|
||||||
* Documents for instance admins are located in [`/docs`](/docs).
|
* Documents for instance admins are located in [`/docs`](/docs).
|
||||||
* Documents for end users are located in [`/src/docs`](/src/docs).
|
* Documents for end users are located in [`/src/docs`](/src/docs).
|
||||||
|
|
||||||
@ -41,8 +36,8 @@ Documentation of Vue I18n is available at http://kazupon.github.io/vue-i18n/intr
|
|||||||
* Test codes are located in [`/test`](/test).
|
* Test codes are located in [`/test`](/test).
|
||||||
|
|
||||||
## Continuous integration
|
## Continuous integration
|
||||||
Misskey uses CircleCI for executing automated tests.
|
Misskey uses GitHub Actions for executing automated tests.
|
||||||
Configuration files are located in [`/.circleci`](/.circleci).
|
Configuration files are located in [`/.github/workflows`](/.github/workflows).
|
||||||
|
|
||||||
## Adding MisskeyRoom items
|
## Adding MisskeyRoom items
|
||||||
* Use English for material, object and texture names.
|
* Use English for material, object and texture names.
|
||||||
@ -247,6 +242,9 @@ npx ts-node ./node_modules/typeorm/cli.js migration:generate -n 変更の名前
|
|||||||
|
|
||||||
作成されたスクリプトは不必要な変更を含むため除去してください。
|
作成されたスクリプトは不必要な変更を含むため除去してください。
|
||||||
|
|
||||||
|
### コネクションには`markRaw`せよ
|
||||||
|
**Vueのコンポーネントのdataオプションとして**misskey.jsのコネクションを設定するとき、必ず`markRaw`でラップしてください。インスタンスが不必要にリアクティブ化されることで、misskey.js内の処理で不具合が発生するとともに、パフォーマンス上の問題にも繋がる。なお、Composition APIを使う場合はこの限りではない(リアクティブ化はマニュアルなため)。
|
||||||
|
|
||||||
## その他
|
## その他
|
||||||
### HTMLのクラス名で follow という単語は使わない
|
### HTMLのクラス名で follow という単語は使わない
|
||||||
広告ブロッカーで誤ってブロックされる
|
広告ブロッカーで誤ってブロックされる
|
||||||
|
@ -2,6 +2,6 @@ files:
|
|||||||
- source: /locales/ja-JP.yml
|
- source: /locales/ja-JP.yml
|
||||||
translation: /locales/%locale%.yml
|
translation: /locales/%locale%.yml
|
||||||
update_option: update_as_unapproved
|
update_option: update_as_unapproved
|
||||||
- source: /src/docs/ja-JP/*.md
|
- source: /src/docs/ja-JP/**/*.md
|
||||||
translation: /src/docs/%locale%/%original_file_name%
|
translation: /src/docs/%locale%/**/%original_file_name%
|
||||||
update_option: update_as_unapproved
|
update_option: update_as_unapproved
|
||||||
|
@ -385,7 +385,6 @@ updateRemoteUser: "تحديث المعلومات عن المستخدم البع
|
|||||||
deleteAllFiles: "حذف كافة الملفات"
|
deleteAllFiles: "حذف كافة الملفات"
|
||||||
userSuspended: "تم تعليق هذا المستخدم."
|
userSuspended: "تم تعليق هذا المستخدم."
|
||||||
userSilenced: "تم إسكات هذا المستخدم."
|
userSilenced: "تم إسكات هذا المستخدم."
|
||||||
sidebar: "الشريط الجانبي"
|
|
||||||
addItem: "إضافة عنصر"
|
addItem: "إضافة عنصر"
|
||||||
rooms: "الغرفة"
|
rooms: "الغرفة"
|
||||||
relays: "المُرَحلات"
|
relays: "المُرَحلات"
|
||||||
@ -428,8 +427,13 @@ inUse: "مستخدم"
|
|||||||
info: "عن"
|
info: "عن"
|
||||||
user: "المستخدمون"
|
user: "المستخدمون"
|
||||||
administration: "إدارة "
|
administration: "إدارة "
|
||||||
|
postToGallery: "انشر في المعرض"
|
||||||
|
gallery: "المعرض"
|
||||||
expiration: "ينتهي استطلاع الرأي في"
|
expiration: "ينتهي استطلاع الرأي في"
|
||||||
middle: "متوسط"
|
middle: "متوسط"
|
||||||
|
global: "الشامل"
|
||||||
|
_docs:
|
||||||
|
admin: "إدارة "
|
||||||
_email:
|
_email:
|
||||||
_follow:
|
_follow:
|
||||||
title: "يتابعك"
|
title: "يتابعك"
|
||||||
@ -442,9 +446,7 @@ _reversi:
|
|||||||
total: "المجموع"
|
total: "المجموع"
|
||||||
_channel:
|
_channel:
|
||||||
featured: "المتداوَلة"
|
featured: "المتداوَلة"
|
||||||
_sidebar:
|
_menuDisplay:
|
||||||
full: "كامل"
|
|
||||||
icon: "الصورة الرمزية"
|
|
||||||
hide: "إخفاء"
|
hide: "إخفاء"
|
||||||
_theme:
|
_theme:
|
||||||
explore: "استكشف قوالب المظهر"
|
explore: "استكشف قوالب المظهر"
|
||||||
|
@ -111,6 +111,7 @@ editWidgets: "Upravit widget"
|
|||||||
editWidgetsExit: "Hotovo"
|
editWidgetsExit: "Hotovo"
|
||||||
customEmojis: "Vlastní emoji"
|
customEmojis: "Vlastní emoji"
|
||||||
emoji: "Emoji"
|
emoji: "Emoji"
|
||||||
|
emojis: "Emoji"
|
||||||
emojiName: "Jméno emoji"
|
emojiName: "Jméno emoji"
|
||||||
emojiUrl: "URL obrázku"
|
emojiUrl: "URL obrázku"
|
||||||
addEmoji: "Přidat emoji"
|
addEmoji: "Přidat emoji"
|
||||||
@ -390,7 +391,6 @@ script: "Skript"
|
|||||||
deleteAllFiles: "Smazat všechny soubory"
|
deleteAllFiles: "Smazat všechny soubory"
|
||||||
deleteAllFilesConfirm: "Jste si jistí že chcete smazat všechny soubory?"
|
deleteAllFilesConfirm: "Jste si jistí že chcete smazat všechny soubory?"
|
||||||
userSuspended: "Tomuto uživateli byl pozastaven účet."
|
userSuspended: "Tomuto uživateli byl pozastaven účet."
|
||||||
sidebar: "Postranní panel"
|
|
||||||
addItem: "Přidat položku"
|
addItem: "Přidat položku"
|
||||||
rooms: "Místnost"
|
rooms: "Místnost"
|
||||||
inboxUrl: "Inbox URL"
|
inboxUrl: "Inbox URL"
|
||||||
@ -409,8 +409,6 @@ _mfm:
|
|||||||
search: "Vyhledávání"
|
search: "Vyhledávání"
|
||||||
_reversi:
|
_reversi:
|
||||||
total: "Celkem"
|
total: "Celkem"
|
||||||
_sidebar:
|
|
||||||
icon: "Avatar"
|
|
||||||
_theme:
|
_theme:
|
||||||
keys:
|
keys:
|
||||||
mention: "Zmínění"
|
mention: "Zmínění"
|
||||||
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
507
locales/eo-UY.yml
Normal file
507
locales/eo-UY.yml
Normal file
@ -0,0 +1,507 @@
|
|||||||
|
---
|
||||||
|
_lang_: "Esperanto"
|
||||||
|
headlineMisskey: "Reto ligiĝanta per notoj"
|
||||||
|
introMisskey: "Bonvenon! Misskey (Ĉi-sekve Miskejo) estas malfermitkoda malcentriza mikrobloga servo.\nKreu \"noto\"n por ke kunhavu tion kio nun okazas aŭ ke eksendu tion kio pri vi📡\nFunkcion \"reago\" vi povas uzi kaj aldoni vian reagon pri ciu noto de ĉiu homo👍\nVolu esplori nova mondo🚀"
|
||||||
|
monthAndDay: "{day}-a/{month}"
|
||||||
|
search: "Serĉi"
|
||||||
|
notifications: "Sciigoj"
|
||||||
|
username: "Uzantnomo"
|
||||||
|
password: "Pasvorto"
|
||||||
|
forgotPassword: "Ĉu vi forgesis pasvorton?"
|
||||||
|
fetchingAsApObject: "Informpetado de Fediverso..."
|
||||||
|
ok: "Akcepteble"
|
||||||
|
gotIt: "Mi konprenas!"
|
||||||
|
cancel: "Nuligi"
|
||||||
|
enterUsername: "Entajpu uzantnomon"
|
||||||
|
renotedBy: "Renoton faras {user}"
|
||||||
|
noNotes: "Neniu noto!"
|
||||||
|
noNotifications: "Vi ne havas sciigojn."
|
||||||
|
instance: "Ekzemplo"
|
||||||
|
settings: "Agordoj"
|
||||||
|
basicSettings: "Ĝeneralaj agordoj"
|
||||||
|
otherSettings: "Aliaj agordoj"
|
||||||
|
openInWindow: "Malfermi en nova fenestro"
|
||||||
|
profile: "Profilo"
|
||||||
|
timeline: "Templinio"
|
||||||
|
noAccountDescription: "Tiu uzanto ne enhavas biografion je la profilo."
|
||||||
|
login: "Ensaluti"
|
||||||
|
loggingIn: "Ensalutado..."
|
||||||
|
logout: "Elsaluti"
|
||||||
|
signup: "Krei konton"
|
||||||
|
uploading: "Alŝutado..."
|
||||||
|
save: "Konservi"
|
||||||
|
users: "Uzanto"
|
||||||
|
addUser: "Aldoni uzanton"
|
||||||
|
favorite: "Preferi"
|
||||||
|
favorites: "Preferataj"
|
||||||
|
unfavorite: "Malpreferi"
|
||||||
|
favorited: "Aldonita al preferatoj"
|
||||||
|
alreadyFavorited: "Jame aldonita al preferatoj"
|
||||||
|
cantFavorite: "Ne aldonita al preferatoj"
|
||||||
|
pin: "Alpingli sur la profilo"
|
||||||
|
unpin: "Depingli"
|
||||||
|
copyContent: "Kopii enhavon"
|
||||||
|
copyLink: "Kopii ligilon"
|
||||||
|
delete: "Forviŝi"
|
||||||
|
deleteAndEdit: "Foriginte redakti"
|
||||||
|
deleteAndEditConfirm: "Ĉu vi certas, ke vi volas forigi la noton kaj redakti ĝin? Ĉiuj reagoj, renotoj, kaj respondoj ankaŭ foriĝos."
|
||||||
|
addToList: "Aldoni al la listo"
|
||||||
|
sendMessage: "Sendi mesaĝon"
|
||||||
|
copyUsername: "Kopii uzantnomon"
|
||||||
|
searchUser: "Serĉi uzanton"
|
||||||
|
reply: "Respondi"
|
||||||
|
loadMore: "Vidu pli"
|
||||||
|
showMore: "Vidi pli"
|
||||||
|
youGotNewFollower: "Vin eksekvis"
|
||||||
|
receiveFollowRequest: "Eksekvopeton riceviĝis."
|
||||||
|
followRequestAccepted: "La eksekvopeto akceptiĝis."
|
||||||
|
mention: "Mencioj"
|
||||||
|
mentions: "Al vi"
|
||||||
|
importAndExport: "Importaĵo / Eksportaĵo"
|
||||||
|
import: "Importi"
|
||||||
|
export: "Eksporti"
|
||||||
|
files: "Dosieroj"
|
||||||
|
download: "Elŝuti"
|
||||||
|
driveFileDeleteConfirm: "Ĉu vi certas ke vi volas forviŝi la dosierujon {name}? Noto aldonita ĝin ankaŭ foriĝos."
|
||||||
|
unfollowConfirm: "Ĉu vi certas, ke vi volas ne plu sekvi {name}'(o)n?"
|
||||||
|
lists: "Listoj"
|
||||||
|
noLists: "Neniu listo"
|
||||||
|
note: "Elsendi noto"
|
||||||
|
notes: "Notoj"
|
||||||
|
following: "Sekvatoj"
|
||||||
|
followers: "Sekvantoj"
|
||||||
|
followsYou: "Vin sekvas "
|
||||||
|
createList: "Kreii liston"
|
||||||
|
error: "Eraro"
|
||||||
|
somethingHappened: "Problemo okazis."
|
||||||
|
retry: "Reprovi"
|
||||||
|
enterListName: "Entajpu nomon de la listo"
|
||||||
|
privacy: "Privateco"
|
||||||
|
follow: "Sekvi"
|
||||||
|
followRequest: "Peti akcepti de vi eksekvi"
|
||||||
|
followRequests: "Eksekvopetoj"
|
||||||
|
unfollow: "Ne plu sekvi"
|
||||||
|
enterEmoji: "Entajpu emoĵion"
|
||||||
|
renote: "Fari renoton"
|
||||||
|
unrenote: "Malfari renoton"
|
||||||
|
renoted: "Renoton fariĝis."
|
||||||
|
cantRenote: "Tiu noto ne estas renototebla."
|
||||||
|
cantReRenote: "Oni ne povas fari renoton kiu enhavas renoto."
|
||||||
|
quote: "Citi"
|
||||||
|
pinnedNote: "Pinglita noto"
|
||||||
|
pinned: "Alpingli sur la profilo"
|
||||||
|
you: "Vi"
|
||||||
|
clickToShow: "Klaku por malkaŝu"
|
||||||
|
sensitive: "Enhavo ne estas deca por laborejo (NSFW)"
|
||||||
|
add: "Aldoni"
|
||||||
|
reaction: "Reagoj"
|
||||||
|
enterFileName: "Entajpu dosiernomon"
|
||||||
|
mute: "Silentigi"
|
||||||
|
unmute: "Malsilentigi"
|
||||||
|
block: "Bloki"
|
||||||
|
unblock: "Malbloki"
|
||||||
|
suspend: "Flostigi"
|
||||||
|
unsuspend: "Fandi"
|
||||||
|
blockConfirm: "Ĉu vi certas ke vi volas bloki la uzanton?"
|
||||||
|
unblockConfirm: "Ĉu vi certas ke vi volas malbloki la uzanton?"
|
||||||
|
suspendConfirm: "Ĉu vi certas ke vi volas frostigi la uzanton?"
|
||||||
|
unsuspendConfirm: "Ĉu vi certas ke vi volas fandi la uzanton?"
|
||||||
|
selectList: "Elekti liston"
|
||||||
|
selectAntenna: "Elekti antenon"
|
||||||
|
selectWidget: "Elekti enestraĵon"
|
||||||
|
editWidgets: "Redakti fenestraĵon"
|
||||||
|
editWidgetsExit: "Fini la redaktadon"
|
||||||
|
customEmojis: "Personecigitaj emoĵioj"
|
||||||
|
emoji: "Emoĵio"
|
||||||
|
emojis: "Emoĵio"
|
||||||
|
emojiName: "Nomo de emoĵio"
|
||||||
|
emojiUrl: "URL de la bildo de emoĵio"
|
||||||
|
addEmoji: "Aldoni emoĵion"
|
||||||
|
cacheRemoteFiles: "Havi staplon por foraj dosieroj"
|
||||||
|
flagAsBot: "Tiu uzanto estas roboto"
|
||||||
|
flagAsCat: "Tiu uzanto estas kato"
|
||||||
|
addAccount: "Aldoni konton"
|
||||||
|
showOnRemote: "Vidi sur la fora ekzemplo"
|
||||||
|
general: "Ĝenerala"
|
||||||
|
searchWith: "Serĉi: {q}"
|
||||||
|
youHaveNoLists: "Vi ne havas listojn."
|
||||||
|
followConfirm: "Ĉu vi certas ke vi volas sekvi {name}'(o)n?"
|
||||||
|
selectUser: "Elekti uzanton"
|
||||||
|
annotation: "Komentarioj"
|
||||||
|
federation: "Fediverso"
|
||||||
|
instances: "Ekzemplo"
|
||||||
|
perHour: "Po horo"
|
||||||
|
perDay: "Po tago"
|
||||||
|
blockThisInstance: "Bloki tiu ekzemplo"
|
||||||
|
withNFiles: "{n} dosiero(j)"
|
||||||
|
disk: "Diskilo"
|
||||||
|
instanceInfo: "Informo pri la ekzemplo"
|
||||||
|
clearCachedFiles: "Forviŝi datumon en staplo"
|
||||||
|
clearCachedFilesConfirm: "Ĉu vi certas, ke vi volas forviŝi ĉiujn transajn dosierojn en la staplo?"
|
||||||
|
blockedInstances: "Blokataj ekzemploj"
|
||||||
|
muteAndBlock: "Silentitaj / Blokitaj"
|
||||||
|
mutedUsers: "Silentigitaj uzantoj"
|
||||||
|
blockedUsers: "Blokitaj uzantoj"
|
||||||
|
noUsers: "Sen uzantoj"
|
||||||
|
editProfile: "Redakti profilon"
|
||||||
|
noteDeleteConfirm: "Ĉu vi certas ke vi volas forviŝi la noton?"
|
||||||
|
pinLimitExceeded: "Vi ne plu povas alpingli noton."
|
||||||
|
noCustomEmojis: "Neniu emoĵio"
|
||||||
|
federating: "Konfederado"
|
||||||
|
blocked: "Blokita"
|
||||||
|
subscribing: "Abonita"
|
||||||
|
notResponding: "Alvokato ne disponeblas"
|
||||||
|
instanceFollowing: "Sekvatoj sur la ekzemplo"
|
||||||
|
instanceFollowers: "Sekvantoj el la ekzemplo"
|
||||||
|
instanceUsers: "Uzantoj de la ekzemplo"
|
||||||
|
changePassword: "Ŝanĝi pasvorton"
|
||||||
|
currentPassword: "Aktuala pasvorto"
|
||||||
|
newPassword: "Nova pasvorto"
|
||||||
|
newPasswordRetype: "Reentajpu la novan pasvorton"
|
||||||
|
attachFile: "Aldoni dosieron"
|
||||||
|
more: "Plu!"
|
||||||
|
usernameOrUserId: "Uzantnomo aŭ identigilo de uzanto"
|
||||||
|
noSuchUser: "Neniuj uzantoj trovitaj."
|
||||||
|
imageUrl: "URL de bildo"
|
||||||
|
remove: "Forigi"
|
||||||
|
removed: "Forviŝis"
|
||||||
|
removeAreYouSure: "Ĉu vi certas ke vi volas forigi \"{x}\"'(o)n?"
|
||||||
|
deleteAreYouSure: "Ĉu vi certas ke vi volas forviŝi \"{x}\"'(o)n?"
|
||||||
|
messaging: "Retbabili"
|
||||||
|
upload: "Alŝuti"
|
||||||
|
fromDrive: "De la diskingo en Miskejo"
|
||||||
|
fromUrl: "De URL"
|
||||||
|
uploadFromUrl: "Alŝuti de URL"
|
||||||
|
uploadFromUrlDescription: "URL de la dosiero kiun vi volu alŝuti"
|
||||||
|
games: "Ludoj sur Miskejo"
|
||||||
|
messageRead: "Legita"
|
||||||
|
startMessaging: "Komenci babiladon"
|
||||||
|
tos: "Kondiĉoj de Uzado"
|
||||||
|
start: "Komenciĝi"
|
||||||
|
home: "Hejmo"
|
||||||
|
remoteUserCaution: "Ĉi tiu Infomoj estas ne tute ekzakta pro distanca uzanto."
|
||||||
|
images: "Bildoj"
|
||||||
|
birthday: "Naskiĝtago"
|
||||||
|
registeredDate: "Registriĝdato"
|
||||||
|
drive: "Diskingo"
|
||||||
|
fileName: "Dosiernomo"
|
||||||
|
selectFile: "Elekti dosieron"
|
||||||
|
selectFiles: "Elekti dosieron"
|
||||||
|
renameFile: "Alinomi la dosieron"
|
||||||
|
folderName: "Nomo de la dosierujo"
|
||||||
|
renameFolder: "Alinomi la dosierujon"
|
||||||
|
deleteFolder: "Forviŝi dosierujon"
|
||||||
|
addFile: "Aldoni dosieron"
|
||||||
|
emptyDrive: "La diskingo enhavas neniun."
|
||||||
|
unableToDelete: "Ne forigebla"
|
||||||
|
inputNewFileName: "Entajpu nova dosiernomon"
|
||||||
|
inputNewFolderName: "Entajpu nova nomon de la dosierujo"
|
||||||
|
hasChildFilesOrFolders: "La dosierujo enhavas dosieron kaj ne estas forigebla."
|
||||||
|
copyUrl: "Kopii URL"
|
||||||
|
rename: "Alinomi"
|
||||||
|
avatar: "Ikono"
|
||||||
|
nsfw: "Enhavo ne estas deca por laborejo (NSFW)"
|
||||||
|
instanceName: "Nomo de la ekzemplo"
|
||||||
|
maintainerName: "Nomo de la administranto"
|
||||||
|
maintainerEmail: "Retpoŝto de la administranto"
|
||||||
|
tosUrl: "URL de kondiĉoj de uzado"
|
||||||
|
thisYear: "Ĉi-jare"
|
||||||
|
thisMonth: "Ĉi-monate"
|
||||||
|
today: "Hodiaŭ"
|
||||||
|
dayX: "{day}-a"
|
||||||
|
monthX: "{month}"
|
||||||
|
yearX: "La jaro {year}"
|
||||||
|
connectService: "Konekti"
|
||||||
|
disconnectService: "Farkonektiĝi"
|
||||||
|
driveCapacityPerLocalAccount: "Volumo de miskej-diskingo po unu loka uzanto"
|
||||||
|
driveCapacityPerRemoteAccount: "Volumo de miskej-diskingo po unu transa uzanto"
|
||||||
|
iconUrl: "URL de la ikono (retpaĝsimbolo, ktp.)"
|
||||||
|
pinnedUsers: "Alpinglita uzanto"
|
||||||
|
pinnedNotes: "Pinglita noto"
|
||||||
|
name: "Nomo"
|
||||||
|
withFileAntenna: "Nur kun aldonaĵo"
|
||||||
|
notesAndReplies: "Kun respondoj"
|
||||||
|
withFiles: "Kun aldonaĵo"
|
||||||
|
silenceConfirm: "Ĉu vi certas ke vi volas silentigi la uzanton?"
|
||||||
|
unsilenceConfirm: "Ĉu vi certas, ke vi ne plu volas ke la uzanto silentas?"
|
||||||
|
popularTags: "Popularaj kradvortoj"
|
||||||
|
userList: "Listoj"
|
||||||
|
aboutMisskey: "Pri Miskejo"
|
||||||
|
securityKeyName: "Nomo de la ŝlosilo"
|
||||||
|
passwordLessLogin: "Ensaluti sen pasvorto"
|
||||||
|
resetPassword: "Restarigi pasvorton"
|
||||||
|
newPasswordIs: "La nova pasvorto estas {password}."
|
||||||
|
cacheClear: "Forviŝi datumon en stalo"
|
||||||
|
help: "Manlibro de uzado"
|
||||||
|
inputMessageHere: "Entajpu masaĝo tie ĉi"
|
||||||
|
groupName: "Grupa nomo"
|
||||||
|
messagingWithUser: "Mesaĝado kun uzanto"
|
||||||
|
messagingWithGroup: "Mesaĝi kun grupo"
|
||||||
|
noteOf: "Noto de {user}"
|
||||||
|
noMessagesYet: "Neniu mesaĝo"
|
||||||
|
newMessageExists: "Vi ricevis novan mesaĝon."
|
||||||
|
onlyOneFileCanBeAttached: "Vi povas aldoni nur unu dosieron po unu mesaĝo."
|
||||||
|
uiLanguage: "Lingvo de la interfaco"
|
||||||
|
tags: "Etikedoj"
|
||||||
|
createAccount: "Krei konton"
|
||||||
|
existingAccount: "Ekzista konto"
|
||||||
|
noFollowRequests: "Vi ne havas eksekvopetojn."
|
||||||
|
openImageInNewTab: "Fermi la bildo sur nova tablo"
|
||||||
|
local: "Loka"
|
||||||
|
remote: "Transa"
|
||||||
|
accountSettings: "Agordoj de Konto"
|
||||||
|
numberOfDays: "Nombro de tagoj"
|
||||||
|
hideThisNote: "Kaŝi tiun noton"
|
||||||
|
objectStorageBaseUrl: "Baza URL"
|
||||||
|
deleteAll: "Forviŝi ĉiujn"
|
||||||
|
showInPage: "Vidi en paĝo"
|
||||||
|
deleteAllFiles: "Forviŝi ĉiujn dosierojn"
|
||||||
|
deleteAllFilesConfirm: "Ĉu vi certas, ke vi volas forviŝi ĉiujn viajn dosierojn?"
|
||||||
|
deletedNote: "Forviŝita noto"
|
||||||
|
invisibleNote: "Malpublika noto"
|
||||||
|
poll: "Balotujo"
|
||||||
|
emailServer: "Retpoŝta servilo"
|
||||||
|
email: "Retpoŝto"
|
||||||
|
emailAddress: "Retpoŝta adreso"
|
||||||
|
smtpUser: "Uzantnomo"
|
||||||
|
smtpPass: "Pasvorto"
|
||||||
|
userSaysSomething: "{name} parolis ion"
|
||||||
|
display: "Vidi"
|
||||||
|
database: "Datumbazo"
|
||||||
|
channel: "Kanalo"
|
||||||
|
fileIdOrUrl: "Dosiera identigilo aŭ URL"
|
||||||
|
abuseReports: "Signali"
|
||||||
|
reportAbuse: "Signali"
|
||||||
|
reportAbuseOf: "Signali {name}'(o)n"
|
||||||
|
send: "Sendi"
|
||||||
|
i18nInfo: "Misskey estas tradukata en diversaj lingvoj far volontuloj. Oni povas kontribui por la tradukado sur {link}."
|
||||||
|
followingCount: "Numero de sekvatoj"
|
||||||
|
followersCount: "Numero de sekvantoj"
|
||||||
|
yes: "Jes"
|
||||||
|
no: "Ne"
|
||||||
|
driveFilesCount: "Numero de dosieroj en la diskingo"
|
||||||
|
noteFavoritesCount: "Numero de la preferataj notoj"
|
||||||
|
makeExplorable: "Igi videbla konto sur la paĝo \"Esplorado\""
|
||||||
|
showTitlebar: "Montri titolobredon"
|
||||||
|
clearCache: "Forviŝi datumon en staplo"
|
||||||
|
onlineUsersCount: "{n} uzanto(j) estas surlinea"
|
||||||
|
nUsers: "{n} uzanto(j)"
|
||||||
|
saveAs: "Konservi kiel…"
|
||||||
|
createdAt: "Kreita je"
|
||||||
|
updatedAt: "Laste ĝisdatigita"
|
||||||
|
deleteConfirm: "Ĉu certas forviŝi?"
|
||||||
|
closeAccount: "Forigi konton"
|
||||||
|
emailNotification: "Sciigoj per retpoŝto"
|
||||||
|
publish: "Publikigi"
|
||||||
|
inChannelSearch: "Serĉi en kanalo"
|
||||||
|
typingUsers: "{users} estas entajpanta(j)..."
|
||||||
|
online: "Surkonektita"
|
||||||
|
offline: "Forkonektita"
|
||||||
|
instanceBlocking: "Blokado de ekzemplo"
|
||||||
|
selectAccount: "Elekti konton"
|
||||||
|
user: "Uzanto"
|
||||||
|
accounts: "Kontoj"
|
||||||
|
global: "Konfederacia"
|
||||||
|
sent: "Sendi"
|
||||||
|
hashtags: "Kradvorto"
|
||||||
|
_gallery:
|
||||||
|
liked: "Ŝatitaj notoj"
|
||||||
|
_email:
|
||||||
|
_follow:
|
||||||
|
title: "Vin eksekvis"
|
||||||
|
_receiveFollowRequest:
|
||||||
|
title: "Vi ricevis eksekvopeton."
|
||||||
|
_aboutMisskey:
|
||||||
|
about: "Misskey estas malfermitkoda programo evoluigata de syuilo ekde la 2014."
|
||||||
|
contributors: "Precipaj kontribuantoj"
|
||||||
|
allContributors: "Ĉiuj kontribuintoj"
|
||||||
|
source: "Fontkodo"
|
||||||
|
translation: "Traduki Miskejon"
|
||||||
|
patrons: "Mecenatoj"
|
||||||
|
_mfm:
|
||||||
|
mention: "Mencioj"
|
||||||
|
hashtag: "Kradvorto"
|
||||||
|
url: "URL"
|
||||||
|
blockCode: "Kodo (Ujo)"
|
||||||
|
blockMath: "Formulo (Ujo)"
|
||||||
|
quote: "Citi"
|
||||||
|
emoji: "Personecigitaj emoĵioj"
|
||||||
|
search: "Serĉi"
|
||||||
|
_instanceTicker:
|
||||||
|
none: "Ne montri"
|
||||||
|
remote: "Montri al transaj uzantoj"
|
||||||
|
always: "Ĉiam montri"
|
||||||
|
_channel:
|
||||||
|
create: "Krei kanalon"
|
||||||
|
edit: "Redakti kanalon"
|
||||||
|
following: "Sekvata"
|
||||||
|
_menuDisplay:
|
||||||
|
hide: "Kaŝi"
|
||||||
|
_wordMute:
|
||||||
|
muteWords: "Silentanta vorto"
|
||||||
|
mutedNotes: "Silentigataj notoj"
|
||||||
|
_theme:
|
||||||
|
keys:
|
||||||
|
hashtag: "Kradvorto"
|
||||||
|
mention: "Mencioj"
|
||||||
|
renote: "Fari renoton"
|
||||||
|
_sfx:
|
||||||
|
note: "Nova noto"
|
||||||
|
noteMy: "Mia noto"
|
||||||
|
notification: "Sciigoj"
|
||||||
|
chat: "Retbabilejo"
|
||||||
|
chatBg: "Retbabilejo (BG)"
|
||||||
|
antenna: "Ricevo de anteno"
|
||||||
|
channel: "Sciigoj de kanalo"
|
||||||
|
_ago:
|
||||||
|
secondsAgo: "Antaŭ {n} sekundoj"
|
||||||
|
minutesAgo: "Antaŭ {n} minutoj"
|
||||||
|
hoursAgo: "Antaŭ {n} horoj"
|
||||||
|
daysAgo: "Antaŭ {n} tagoj"
|
||||||
|
weeksAgo: "Antaŭ {n} semajnoj"
|
||||||
|
monthsAgo: "Antaŭ {n} monatoj"
|
||||||
|
yearsAgo: "Antaŭ {n} jaroj"
|
||||||
|
_time:
|
||||||
|
second: "sek"
|
||||||
|
minute: "min"
|
||||||
|
hour: "hor"
|
||||||
|
day: "Tago"
|
||||||
|
_tutorial:
|
||||||
|
title: "Uzado de Misskey"
|
||||||
|
step1_1: "Bonvenon."
|
||||||
|
step7_2: "Se vi volus scii pli pri Miskejon, volu rigardi la fako {help}."
|
||||||
|
_permissions:
|
||||||
|
"read:blocks": "Vidi la listo de la uzantoj kiun vi blokis."
|
||||||
|
"write:blocks": "Redakti la liston de la uzantoj kiun vi blokis."
|
||||||
|
"read:drive": "Ĉia operacio por legi la informon de dosiero en via diskingo de Miskejo"
|
||||||
|
"write:drive": "Ĉia operacio por skribi, forviŝi, aŭ alimaniere ŝanĝi la informon de dosiero en via diskingo de Miskejo"
|
||||||
|
"read:favorites": "Vidi la listo de la preferoj"
|
||||||
|
"read:following": "Vidi tion kion vi sekvas"
|
||||||
|
"write:following": "Sekvi kaj/aŭ malsekvi alian uzanton"
|
||||||
|
"read:messaging": "Vidi via retbabilado"
|
||||||
|
"write:notes": "Krei / Forviŝi noton"
|
||||||
|
"read:notifications": "Vidi sciigojn"
|
||||||
|
"read:reactions": "Vidi reagojn"
|
||||||
|
"read:pages": "Vidi via paĝojn"
|
||||||
|
"read:page-likes": "Vidi ŝatojn de paĝo"
|
||||||
|
"read:channels": "Vidi kanalojn"
|
||||||
|
_antennaSources:
|
||||||
|
homeTimeline: "Notoj far uzantoj sekvataj de vi"
|
||||||
|
_weekday:
|
||||||
|
sunday: "dimanĉo"
|
||||||
|
monday: "lundo"
|
||||||
|
tuesday: "mardo"
|
||||||
|
wednesday: "merkredo"
|
||||||
|
thursday: "ĵaŭdo"
|
||||||
|
friday: "vendredo"
|
||||||
|
saturday: "sabato"
|
||||||
|
_widgets:
|
||||||
|
notifications: "Sciigoj"
|
||||||
|
timeline: "Templinio"
|
||||||
|
clock: "Horloĝo"
|
||||||
|
federation: "Fediverso"
|
||||||
|
onlineUsers: "Surkonektita uzanto"
|
||||||
|
_cw:
|
||||||
|
show: "Vidu pli"
|
||||||
|
files: "{count} dosiero(j)"
|
||||||
|
_poll:
|
||||||
|
choiceN: "Balotilo {n}"
|
||||||
|
noMore: "Oni ne plu povas aldoni."
|
||||||
|
infinite: "Neniam"
|
||||||
|
deadlineTime: "hor"
|
||||||
|
votesCount: "{n} balotiloj"
|
||||||
|
vote: "Baloti"
|
||||||
|
closed: "Oni jam balotis ĝin"
|
||||||
|
_visibility:
|
||||||
|
publicDescription: "Via noto aperiĝos sur la konfederacia templinio"
|
||||||
|
home: "Hejmo"
|
||||||
|
homeDescription: "Elsendi nur sur la hejmtemplinio"
|
||||||
|
followers: "Sekvantoj"
|
||||||
|
followersDescription: "Elsendi nur al sekvantoj al mi"
|
||||||
|
localOnly: "Nur loka"
|
||||||
|
localOnlyDescription: "Ne montri al transaj uzantoj"
|
||||||
|
_postForm:
|
||||||
|
replyPlaceholder: "Respondado al tiu noto..."
|
||||||
|
quotePlaceholder: "Citado tiun noton..."
|
||||||
|
channelPlaceholder: "Sendi sur la kanalo"
|
||||||
|
_profile:
|
||||||
|
name: "Nomo"
|
||||||
|
username: "Uzantnomo"
|
||||||
|
changeAvatar: "Ŝanĝi profilbildon"
|
||||||
|
_exportOrImport:
|
||||||
|
followingList: "Sekvataj"
|
||||||
|
muteList: "Silentigado"
|
||||||
|
blockingList: "Blokado"
|
||||||
|
userLists: "Listoj"
|
||||||
|
_timelines:
|
||||||
|
home: "Hejmo"
|
||||||
|
local: "Loka"
|
||||||
|
social: "Sociala"
|
||||||
|
global: "Konfederacia"
|
||||||
|
_rooms:
|
||||||
|
translate: "Movi"
|
||||||
|
chooseImage: "Elekti bildon"
|
||||||
|
_furnitures:
|
||||||
|
server: "Servilo"
|
||||||
|
moon: "La luno"
|
||||||
|
_pages:
|
||||||
|
deleted: "La paĝo estas forigita."
|
||||||
|
viewPage: "Vidi via paĝojn"
|
||||||
|
my: "Miaj paĝoj"
|
||||||
|
content: "Blokado de paĝo"
|
||||||
|
url: "URL de paĝo"
|
||||||
|
chooseBlock: "Aldoni ujon"
|
||||||
|
blocks:
|
||||||
|
image: "Bildoj"
|
||||||
|
_post:
|
||||||
|
canvasId: "Kanvasa identigilo"
|
||||||
|
_canvas:
|
||||||
|
id: "Kanvasa identigilo"
|
||||||
|
_note:
|
||||||
|
id: "Identigilo de noto"
|
||||||
|
_button:
|
||||||
|
_action:
|
||||||
|
_pushEvent:
|
||||||
|
event: "Nomo de la evento"
|
||||||
|
script:
|
||||||
|
categories:
|
||||||
|
list: "Listoj"
|
||||||
|
blocks:
|
||||||
|
_join:
|
||||||
|
arg1: "Listoj"
|
||||||
|
_randomPick:
|
||||||
|
arg1: "Listoj"
|
||||||
|
_dailyRandomPick:
|
||||||
|
arg1: "Listoj"
|
||||||
|
_seedRandomPick:
|
||||||
|
arg2: "Listoj"
|
||||||
|
pick: "Elekti de la listo"
|
||||||
|
_pick:
|
||||||
|
arg1: "Listoj"
|
||||||
|
_listLen:
|
||||||
|
arg1: "Listoj"
|
||||||
|
types:
|
||||||
|
array: "Listoj"
|
||||||
|
stringArray: "List de teksto"
|
||||||
|
_notification:
|
||||||
|
fileUploaded: "La dosiero sukcese alŝutiĝis."
|
||||||
|
youGotPoll: "{name} balotis"
|
||||||
|
youGotMessagingMessageFromUser: "{name} sentis mesaĝon al vi."
|
||||||
|
youWereFollowed: "Vin eksekvis"
|
||||||
|
youReceivedFollowRequest: "Vi ricevis eksekvopeton."
|
||||||
|
yourFollowRequestAccepted: "Via eksekvopeto estas akceptita."
|
||||||
|
_types:
|
||||||
|
follow: "Sekvatoj"
|
||||||
|
mention: "Mencioj"
|
||||||
|
renote: "Fari renoton"
|
||||||
|
quote: "Citi"
|
||||||
|
reaction: "Reagoj"
|
||||||
|
receiveFollowRequest: "Eksekvopeto ricevita"
|
||||||
|
followRequestAccepted: "Eksekvopeto akceptiĝis."
|
||||||
|
_deck:
|
||||||
|
profile: "Agordaro"
|
||||||
|
_columns:
|
||||||
|
notifications: "Sciigoj"
|
||||||
|
tl: "Templinio"
|
||||||
|
list: "Listoj"
|
||||||
|
mentions: "Al vi"
|
@ -127,6 +127,7 @@ editWidgets: "Editar widgets"
|
|||||||
editWidgetsExit: "Terminar edición"
|
editWidgetsExit: "Terminar edición"
|
||||||
customEmojis: "Emojis personalizados"
|
customEmojis: "Emojis personalizados"
|
||||||
emoji: "Emoji"
|
emoji: "Emoji"
|
||||||
|
emojis: "Emoji"
|
||||||
emojiName: "Nombre del emoji"
|
emojiName: "Nombre del emoji"
|
||||||
emojiUrl: "URL de la imágen del emoji"
|
emojiUrl: "URL de la imágen del emoji"
|
||||||
addEmoji: "Agregar emoji"
|
addEmoji: "Agregar emoji"
|
||||||
@ -523,7 +524,6 @@ removeAllFollowing: "Retener todos los siguientes"
|
|||||||
removeAllFollowingDescription: "Cancelar todos los siguientes del servidor {host}. Ejecutar en caso de que esta instancia haya dejado de existir"
|
removeAllFollowingDescription: "Cancelar todos los siguientes del servidor {host}. Ejecutar en caso de que esta instancia haya dejado de existir"
|
||||||
userSuspended: "Este usuario ha sido suspendido."
|
userSuspended: "Este usuario ha sido suspendido."
|
||||||
userSilenced: "Este usuario ha sido silenciado."
|
userSilenced: "Este usuario ha sido silenciado."
|
||||||
sidebar: "Barra lateral"
|
|
||||||
divider: "Divisor"
|
divider: "Divisor"
|
||||||
addItem: "Agregar elemento"
|
addItem: "Agregar elemento"
|
||||||
rooms: "Cuartos"
|
rooms: "Cuartos"
|
||||||
@ -665,6 +665,11 @@ user: "Usuarios"
|
|||||||
administration: "Administrar"
|
administration: "Administrar"
|
||||||
expiration: "Termina el"
|
expiration: "Termina el"
|
||||||
middle: "Mediano"
|
middle: "Mediano"
|
||||||
|
global: "Global"
|
||||||
|
sent: "Enviar"
|
||||||
|
hashtags: "Hashtag"
|
||||||
|
_docs:
|
||||||
|
admin: "Administrar"
|
||||||
_ad:
|
_ad:
|
||||||
back: "Deseleccionar"
|
back: "Deseleccionar"
|
||||||
_gallery:
|
_gallery:
|
||||||
@ -744,9 +749,7 @@ _channel:
|
|||||||
following: "Siguiendo"
|
following: "Siguiendo"
|
||||||
usersCount: "{n} participantes"
|
usersCount: "{n} participantes"
|
||||||
notesCount: "{n} notas"
|
notesCount: "{n} notas"
|
||||||
_sidebar:
|
_menuDisplay:
|
||||||
full: "Completo"
|
|
||||||
icon: "Avatar"
|
|
||||||
hide: "Ocultar"
|
hide: "Ocultar"
|
||||||
_wordMute:
|
_wordMute:
|
||||||
muteWords: "Palabras que silenciar"
|
muteWords: "Palabras que silenciar"
|
||||||
|
@ -128,6 +128,7 @@ editWidgets: "Modifier les widgets"
|
|||||||
editWidgetsExit: "Valider les modifications"
|
editWidgetsExit: "Valider les modifications"
|
||||||
customEmojis: "Émojis personnalisés"
|
customEmojis: "Émojis personnalisés"
|
||||||
emoji: "Émoji"
|
emoji: "Émoji"
|
||||||
|
emojis: "Émoji"
|
||||||
emojiName: "Nom de l’émoji"
|
emojiName: "Nom de l’émoji"
|
||||||
emojiUrl: "URL de l’émoji"
|
emojiUrl: "URL de l’émoji"
|
||||||
addEmoji: "Ajouter un émoji"
|
addEmoji: "Ajouter un émoji"
|
||||||
@ -326,6 +327,7 @@ driveCapacityPerRemoteAccount: "Volume du Drive par utilisateur distant"
|
|||||||
inMb: "en mégaoctets"
|
inMb: "en mégaoctets"
|
||||||
iconUrl: "URL de l'icône"
|
iconUrl: "URL de l'icône"
|
||||||
bannerUrl: "URL de l’image de la bannière"
|
bannerUrl: "URL de l’image de la bannière"
|
||||||
|
backgroundImageUrl: "URL de l'image d'arrière-plan"
|
||||||
basicInfo: "Informations basiques"
|
basicInfo: "Informations basiques"
|
||||||
pinnedUsers: "Utilisateur·rice épinglé·e"
|
pinnedUsers: "Utilisateur·rice épinglé·e"
|
||||||
pinnedUsersDescription: "Listez les utilisateur·rice·s que vous souhaitez voir épinglé·e·s sur la page \"Découvrir\", un·e par ligne."
|
pinnedUsersDescription: "Listez les utilisateur·rice·s que vous souhaitez voir épinglé·e·s sur la page \"Découvrir\", un·e par ligne."
|
||||||
@ -527,7 +529,7 @@ removeAllFollowing: "Retenir tous les abonnements"
|
|||||||
removeAllFollowingDescription: "Se désabonner de tous les comptes de {host}. Veuillez lancer cette action uniquement si l’instance n’existe plus."
|
removeAllFollowingDescription: "Se désabonner de tous les comptes de {host}. Veuillez lancer cette action uniquement si l’instance n’existe plus."
|
||||||
userSuspended: "Cet·te utilisateur·rice a été suspendu·e."
|
userSuspended: "Cet·te utilisateur·rice a été suspendu·e."
|
||||||
userSilenced: "Cette utilisateur·trice a été mis·e en sourdine."
|
userSilenced: "Cette utilisateur·trice a été mis·e en sourdine."
|
||||||
sidebar: "Barre latérale"
|
menu: "Menu"
|
||||||
divider: "Séparateur"
|
divider: "Séparateur"
|
||||||
addItem: "Ajouter un élément"
|
addItem: "Ajouter un élément"
|
||||||
rooms: "Chambre"
|
rooms: "Chambre"
|
||||||
@ -760,6 +762,19 @@ middle: "Moyen"
|
|||||||
low: "Basse"
|
low: "Basse"
|
||||||
emailNotConfiguredWarning: "Vous n'avez pas configuré d'adresse e-mail."
|
emailNotConfiguredWarning: "Vous n'avez pas configuré d'adresse e-mail."
|
||||||
ratio: "Ratio"
|
ratio: "Ratio"
|
||||||
|
customCss: "CSS personnalisé"
|
||||||
|
customCssWarn: "Utilisez cette fonctionnalité uniquement si vous savez exactement ce que vous faites. Une configuration inadaptée peut empêcher le client de s'exécuter normalement."
|
||||||
|
global: "Global"
|
||||||
|
squareAvatars: "Avatars carrés"
|
||||||
|
sent: "Envoyer"
|
||||||
|
hashtags: "Hashtags"
|
||||||
|
troubleshooting: "Résolution de problèmes"
|
||||||
|
_docs:
|
||||||
|
continueReading: "Lire plus"
|
||||||
|
features: "Fonctionnalités"
|
||||||
|
generalTopics: "Sujets généraux"
|
||||||
|
advancedTopics: "Sujets avancés"
|
||||||
|
admin: "Gestion"
|
||||||
_ad:
|
_ad:
|
||||||
back: "Retour"
|
back: "Retour"
|
||||||
reduceFrequencyOfThisAd: "Voir cette publicité moins souvent"
|
reduceFrequencyOfThisAd: "Voir cette publicité moins souvent"
|
||||||
@ -858,6 +873,8 @@ _mfm:
|
|||||||
blurDescription: "Le contenu peut être flouté ; il sera visible en le survolant avec le curseur."
|
blurDescription: "Le contenu peut être flouté ; il sera visible en le survolant avec le curseur."
|
||||||
font: "Police de caractères"
|
font: "Police de caractères"
|
||||||
fontDescription: "Il est possible de choisir la police."
|
fontDescription: "Il est possible de choisir la police."
|
||||||
|
rainbow: "Arc-en-ciel"
|
||||||
|
rainbowDescription: "Permet d'afficher le contenu en couleurs arc-en-ciel."
|
||||||
_reversi:
|
_reversi:
|
||||||
reversi: "Reversi"
|
reversi: "Reversi"
|
||||||
gameSettings: "Réglages de la partie"
|
gameSettings: "Réglages de la partie"
|
||||||
@ -909,9 +926,10 @@ _channel:
|
|||||||
following: "Abonné·e"
|
following: "Abonné·e"
|
||||||
usersCount: "{n} Participant·e·s"
|
usersCount: "{n} Participant·e·s"
|
||||||
notesCount: "{n} Notes"
|
notesCount: "{n} Notes"
|
||||||
_sidebar:
|
_menuDisplay:
|
||||||
full: "Complet"
|
sideFull: "Latéral"
|
||||||
icon: "Icônes"
|
sideIcon: "Latéral (icônes)"
|
||||||
|
top: "Haut de page"
|
||||||
hide: "Masquer"
|
hide: "Masquer"
|
||||||
_wordMute:
|
_wordMute:
|
||||||
muteWords: "Mots à filtrer"
|
muteWords: "Mots à filtrer"
|
||||||
@ -1591,11 +1609,11 @@ _notification:
|
|||||||
youWereInvitedToGroup: "Invité·e au groupe"
|
youWereInvitedToGroup: "Invité·e au groupe"
|
||||||
_types:
|
_types:
|
||||||
all: "Toutes"
|
all: "Toutes"
|
||||||
follow: "Abonnements"
|
follow: "Nouvel·le abonné·e"
|
||||||
mention: "Mentions"
|
mention: "Mentions"
|
||||||
reply: "Réponses"
|
reply: "Réponses"
|
||||||
renote: "Partager"
|
renote: "Renotes"
|
||||||
quote: "Citer"
|
quote: "Citations"
|
||||||
reaction: "Réactions"
|
reaction: "Réactions"
|
||||||
pollVote: "Votes dans des sondages"
|
pollVote: "Votes dans des sondages"
|
||||||
receiveFollowRequest: "Demande d'abonnement reçue"
|
receiveFollowRequest: "Demande d'abonnement reçue"
|
||||||
|
@ -1,10 +1,10 @@
|
|||||||
---
|
---
|
||||||
_lang_: "Bahasa Indonesia"
|
_lang_: "Bahasa Indonesia"
|
||||||
headlineMisskey: "Jaringan terhubung melalui note"
|
headlineMisskey: "Jaringan terhubung melalui catatan"
|
||||||
introMisskey: "Selamat datang! Misskey adalah perangkat mikroblog tercatu bersifat sumber terbuka.\nMulailah menuliskan catatan, bagikan peristiwa terkini, serta ceritakan segala tentangmu.📡\nTunjukkan juga reaksimu pada catatan pengguna lain.👍\nMari jelajahi dunia baru🚀"
|
introMisskey: "Selamat datang! Misskey adalah perangkat mikroblog tercatu bersifat sumber terbuka.\nMulailah menuliskan catatan, bagikan peristiwa terkini, serta ceritakan segala tentangmu.📡\nTunjukkan juga reaksimu pada catatan pengguna lain.👍\nMari jelajahi dunia baru🚀"
|
||||||
monthAndDay: "{day} {month}"
|
monthAndDay: "{day} {month}"
|
||||||
search: "Pencarian"
|
search: "Penelusuran"
|
||||||
notifications: "Notifikasi"
|
notifications: "Pemberitahuan"
|
||||||
username: "Nama Pengguna"
|
username: "Nama Pengguna"
|
||||||
password: "Kata sandi"
|
password: "Kata sandi"
|
||||||
forgotPassword: "Lupa Kata Sandi"
|
forgotPassword: "Lupa Kata Sandi"
|
||||||
@ -14,8 +14,8 @@ gotIt: "Saya mengerti"
|
|||||||
cancel: "Batalkan"
|
cancel: "Batalkan"
|
||||||
enterUsername: "Masukkan nama pengguna"
|
enterUsername: "Masukkan nama pengguna"
|
||||||
renotedBy: "direnote oleh {user}"
|
renotedBy: "direnote oleh {user}"
|
||||||
noNotes: "Tidak ada notes"
|
noNotes: "Tidak ada catatan"
|
||||||
noNotifications: "Tidak ada notifikasi"
|
noNotifications: "Tidak ada pemberitahuan"
|
||||||
instance: "Instansi"
|
instance: "Instansi"
|
||||||
settings: "Pengaturan"
|
settings: "Pengaturan"
|
||||||
basicSettings: "Pengaturan umum"
|
basicSettings: "Pengaturan umum"
|
||||||
@ -52,25 +52,25 @@ searchUser: "Cari pengguna"
|
|||||||
reply: "Balas"
|
reply: "Balas"
|
||||||
loadMore: "Selebihnya"
|
loadMore: "Selebihnya"
|
||||||
showMore: "Selebihnya"
|
showMore: "Selebihnya"
|
||||||
youGotNewFollower: "Sedang mengikuti"
|
youGotNewFollower: "Mengikuti kamu"
|
||||||
receiveFollowRequest: "Permintaan mengikuti terkirim"
|
receiveFollowRequest: "Ingin mengikuti kamu"
|
||||||
followRequestAccepted: "Permintaan diikuti telah diterima"
|
followRequestAccepted: "Permintaan mengikuti telah disetujui"
|
||||||
mention: "Sebutan"
|
mention: "Sebut"
|
||||||
mentions: "Sebutan"
|
mentions: "Sebutan"
|
||||||
directNotes: "Note langsung"
|
directNotes: "Catatan langsung"
|
||||||
importAndExport: "Impor & Ekspor"
|
importAndExport: "Impor & Ekspor"
|
||||||
import: "Impor"
|
import: "Impor"
|
||||||
export: "Ekspor"
|
export: "Ekspor"
|
||||||
files: "Berkas"
|
files: "Berkas"
|
||||||
download: "Unduh"
|
download: "Unduh"
|
||||||
driveFileDeleteConfirm: "Hapus {name}? Note dengan berkas terkait juga akan terhapus."
|
driveFileDeleteConfirm: "Hapus {name}? Catatan dengan berkas terkait juga akan terhapus."
|
||||||
unfollowConfirm: "Berhenti mengikuti {name}?"
|
unfollowConfirm: "Berhenti mengikuti {name}?"
|
||||||
exportRequested: "Kamu telah meminta ekspor. Ini akan memakan waktu sesaat. Setelah ekspor selesai, berkas yang dihasilkan akan ditambahkan ke Drive"
|
exportRequested: "Kamu telah meminta ekspor. Ini akan memakan waktu sesaat. Setelah ekspor selesai, berkas yang dihasilkan akan ditambahkan ke Drive"
|
||||||
importRequested: "Kamu telah meminta impor. Ini akan memakan waktu sesaat."
|
importRequested: "Kamu telah meminta impor. Ini akan memakan waktu sesaat."
|
||||||
lists: "Daftar"
|
lists: "Daftar"
|
||||||
noLists: "Kamu tidak memiliki daftar apapun"
|
noLists: "Kamu tidak memiliki daftar apapun"
|
||||||
note: "Catatan"
|
note: "Catat"
|
||||||
notes: "Note"
|
notes: "Catatan"
|
||||||
following: "Ikuti"
|
following: "Ikuti"
|
||||||
followers: "Pengikut"
|
followers: "Pengikut"
|
||||||
followsYou: "Mengikuti kamu"
|
followsYou: "Mengikuti kamu"
|
||||||
@ -83,13 +83,13 @@ pageLoadError: "Gagal memuat halaman."
|
|||||||
pageLoadErrorDescription: "Umumnya disebabkan jaringan atau tembolok perambah. Cobalah bersihkan tembolok peramban lalu tunggu sesaat sebelum mencoba kembali."
|
pageLoadErrorDescription: "Umumnya disebabkan jaringan atau tembolok perambah. Cobalah bersihkan tembolok peramban lalu tunggu sesaat sebelum mencoba kembali."
|
||||||
enterListName: "Masukkan nama daftar"
|
enterListName: "Masukkan nama daftar"
|
||||||
privacy: "Privasi"
|
privacy: "Privasi"
|
||||||
makeFollowManuallyApprove: "Permintaan ikuti membutuhkan persetujuan"
|
makeFollowManuallyApprove: "Permintaan mengikuti membutuhkan persetujuan"
|
||||||
defaultNoteVisibility: "Privasi bawaan Note"
|
defaultNoteVisibility: "Privasi bawaan catatan"
|
||||||
follow: "Ikuti"
|
follow: "Ikuti"
|
||||||
followRequest: "Minta ikuti"
|
followRequest: "Permintaan mengikuti"
|
||||||
followRequests: "Permintaan ikuti"
|
followRequests: "Permintaan mengikuti"
|
||||||
unfollow: "Berhenti mengikuti"
|
unfollow: "Berhenti mengikuti"
|
||||||
followRequestPending: "Permintaan ikuti yang menunggu"
|
followRequestPending: "Permintaan mengikuti yang menunggu"
|
||||||
enterEmoji: "Masukkan emoji"
|
enterEmoji: "Masukkan emoji"
|
||||||
renote: "Renote"
|
renote: "Renote"
|
||||||
unrenote: "Hapus renote"
|
unrenote: "Hapus renote"
|
||||||
@ -97,16 +97,16 @@ renoted: "Telah direnote"
|
|||||||
cantRenote: "Postingan ini tidak dapat direnote"
|
cantRenote: "Postingan ini tidak dapat direnote"
|
||||||
cantReRenote: "Renote tidak dapat direnote"
|
cantReRenote: "Renote tidak dapat direnote"
|
||||||
quote: "Kutip"
|
quote: "Kutip"
|
||||||
pinnedNote: "Note yang disematkan"
|
pinnedNote: "Catatan yang disematkan"
|
||||||
pinned: "Sematkan ke profil"
|
pinned: "Sematkan ke profil"
|
||||||
you: "Anda"
|
you: "Kamu"
|
||||||
clickToShow: "Klik untuk melihat"
|
clickToShow: "Klik untuk melihat"
|
||||||
sensitive: "Konten sensitif"
|
sensitive: "Konten sensitif"
|
||||||
add: "Tambahkan"
|
add: "Tambahkan"
|
||||||
reaction: "Reaksi"
|
reaction: "Reaksi"
|
||||||
reactionSettingDescription: "Masukkan reaksi favorit yang ingin anda sematkan pada bilah reaksi"
|
reactionSettingDescription: "Masukkan reaksi favorit yang ingin kamu sematkan pada bilah reaksi"
|
||||||
reactionSettingDescription2: "Geser untuk memindah urutkan, klik untuk menghapus, tekan \"+\" untuk menambahkan"
|
reactionSettingDescription2: "Geser untuk memindah urutkan, klik untuk menghapus, tekan \"+\" untuk menambahkan"
|
||||||
rememberNoteVisibility: "Ingat pengaturan visibilitas note"
|
rememberNoteVisibility: "Ingat pengaturan visibilitas catatan"
|
||||||
attachCancel: "Hapus lampiran"
|
attachCancel: "Hapus lampiran"
|
||||||
markAsSensitive: "Tandai sebagai konten sensitif"
|
markAsSensitive: "Tandai sebagai konten sensitif"
|
||||||
unmarkAsSensitive: "Hapus tanda konten sensitif"
|
unmarkAsSensitive: "Hapus tanda konten sensitif"
|
||||||
@ -117,10 +117,10 @@ block: "Blokir"
|
|||||||
unblock: "Buka blokir"
|
unblock: "Buka blokir"
|
||||||
suspend: "Bekukan"
|
suspend: "Bekukan"
|
||||||
unsuspend: "Buka pembekuan"
|
unsuspend: "Buka pembekuan"
|
||||||
blockConfirm: "Apakah anda yakin ingin memblokir akun ini?"
|
blockConfirm: "Apakah kamu yakin ingin memblokir akun ini?"
|
||||||
unblockConfirm: "Apakah anda yakin ingin membuka blokir akun ini?"
|
unblockConfirm: "Apakah kamu yakin ingin membuka blokir akun ini?"
|
||||||
suspendConfirm: "Apakah anda yakin ingin membekukan akun ini?"
|
suspendConfirm: "Apakah kamu yakin ingin membekukan akun ini?"
|
||||||
unsuspendConfirm: "Apakah anda yakin ingin membuka pembekuan akun ini?"
|
unsuspendConfirm: "Apakah kamu yakin ingin membuka pembekuan akun ini?"
|
||||||
selectList: "Pilih daftar"
|
selectList: "Pilih daftar"
|
||||||
selectAntenna: "Pilih Antena"
|
selectAntenna: "Pilih Antena"
|
||||||
selectWidget: "Pilih gawit"
|
selectWidget: "Pilih gawit"
|
||||||
@ -128,6 +128,7 @@ editWidgets: "Sunting gawit"
|
|||||||
editWidgetsExit: "Selesai"
|
editWidgetsExit: "Selesai"
|
||||||
customEmojis: "Emoji kustom"
|
customEmojis: "Emoji kustom"
|
||||||
emoji: "Emoji"
|
emoji: "Emoji"
|
||||||
|
emojis: "Emoji"
|
||||||
emojiName: "Nama emoji"
|
emojiName: "Nama emoji"
|
||||||
emojiUrl: "URL Emoji"
|
emojiUrl: "URL Emoji"
|
||||||
addEmoji: "Tambahkan emoji"
|
addEmoji: "Tambahkan emoji"
|
||||||
@ -138,7 +139,7 @@ flagAsBot: "Atur akun ini sebagai Bot"
|
|||||||
flagAsBotDescription: "Jika akun ini dikendalikan oleh program, tetapkanlah opsi ini. Jika diaktifkan, ini akan berfungsi sebagai tanda bagi pengembang lain untuk mencegah interaksi berantai dengan bot lain dan menyesuaikan sistem internal Misskey untuk memperlakukan akun ini sebagai bot."
|
flagAsBotDescription: "Jika akun ini dikendalikan oleh program, tetapkanlah opsi ini. Jika diaktifkan, ini akan berfungsi sebagai tanda bagi pengembang lain untuk mencegah interaksi berantai dengan bot lain dan menyesuaikan sistem internal Misskey untuk memperlakukan akun ini sebagai bot."
|
||||||
flagAsCat: "Atur akun ini sebagai kucing"
|
flagAsCat: "Atur akun ini sebagai kucing"
|
||||||
flagAsCatDescription: "Nyalakan tanda ini untuk menandai akun ini sebagai kucing."
|
flagAsCatDescription: "Nyalakan tanda ini untuk menandai akun ini sebagai kucing."
|
||||||
autoAcceptFollowed: "Setujui otomatis permintaan mengikuti dari pengguna yang anda ikuti"
|
autoAcceptFollowed: "Setujui otomatis permintaan mengikuti dari pengguna yang kamu ikuti"
|
||||||
addAccount: "Tambahkan akun"
|
addAccount: "Tambahkan akun"
|
||||||
loginFailed: "Gagal untuk masuk"
|
loginFailed: "Gagal untuk masuk"
|
||||||
showOnRemote: "Lihat profil asli"
|
showOnRemote: "Lihat profil asli"
|
||||||
@ -154,7 +155,7 @@ proxyAccountDescription: "Akun proksi merupakan sebuah akun yang bertindak sebag
|
|||||||
host: "Host"
|
host: "Host"
|
||||||
selectUser: "Pilih pengguna"
|
selectUser: "Pilih pengguna"
|
||||||
recipient: "Penerima"
|
recipient: "Penerima"
|
||||||
annotation: "Komentar"
|
annotation: "Keterangan konten"
|
||||||
federation: "Federasi"
|
federation: "Federasi"
|
||||||
instances: "Instansi"
|
instances: "Instansi"
|
||||||
registeredAt: "Terdaftar"
|
registeredAt: "Terdaftar"
|
||||||
@ -226,8 +227,8 @@ announcements: "Pengumuman"
|
|||||||
imageUrl: "URL Gambar"
|
imageUrl: "URL Gambar"
|
||||||
remove: "Hapus"
|
remove: "Hapus"
|
||||||
removed: "Telah dihapus"
|
removed: "Telah dihapus"
|
||||||
removeAreYouSure: "Apakah anda yakin ingin menghapus \"{x}\"?"
|
removeAreYouSure: "Apakah kamu yakin ingin menghapus \"{x}\"?"
|
||||||
deleteAreYouSure: "Apakah anda yakin ingin menghapus \"{x}\"?"
|
deleteAreYouSure: "Apakah kamu yakin ingin menghapus \"{x}\"?"
|
||||||
resetAreYouSure: "Yakin mau atur ulang?"
|
resetAreYouSure: "Yakin mau atur ulang?"
|
||||||
saved: "Telah disimpan"
|
saved: "Telah disimpan"
|
||||||
messaging: "Pesan"
|
messaging: "Pesan"
|
||||||
@ -235,7 +236,7 @@ upload: "Unggah"
|
|||||||
fromDrive: "Dari Drive"
|
fromDrive: "Dari Drive"
|
||||||
fromUrl: "Dari URL"
|
fromUrl: "Dari URL"
|
||||||
uploadFromUrl: "Unggah dari URL"
|
uploadFromUrl: "Unggah dari URL"
|
||||||
uploadFromUrlDescription: "URL berkas yang ingin anda unggah"
|
uploadFromUrlDescription: "URL berkas yang ingin kamu unggah"
|
||||||
uploadFromUrlRequested: "Pengunggahan telah diminta"
|
uploadFromUrlRequested: "Pengunggahan telah diminta"
|
||||||
uploadFromUrlMayTakeTime: "Membutuhkan beberapa waktu hingga pengunggahan selesai"
|
uploadFromUrlMayTakeTime: "Membutuhkan beberapa waktu hingga pengunggahan selesai"
|
||||||
explore: "Jelajahi"
|
explore: "Jelajahi"
|
||||||
@ -251,7 +252,7 @@ home: "Beranda"
|
|||||||
remoteUserCaution: "Informasi ini mungkin tidak mutakhir, karena pengguna ini berasal dari instansi luar."
|
remoteUserCaution: "Informasi ini mungkin tidak mutakhir, karena pengguna ini berasal dari instansi luar."
|
||||||
activity: "Aktivitas"
|
activity: "Aktivitas"
|
||||||
images: "Gambar"
|
images: "Gambar"
|
||||||
birthday: "Hari Lahir"
|
birthday: "Tanggal lahir"
|
||||||
yearsOld: "{age} tahun"
|
yearsOld: "{age} tahun"
|
||||||
registeredDate: "Bergabung pada"
|
registeredDate: "Bergabung pada"
|
||||||
location: "Lokasi"
|
location: "Lokasi"
|
||||||
@ -279,6 +280,7 @@ emptyDrive: "Drive kosong"
|
|||||||
emptyFolder: "Folder kosong"
|
emptyFolder: "Folder kosong"
|
||||||
unableToDelete: "Tidak dapat menghapus"
|
unableToDelete: "Tidak dapat menghapus"
|
||||||
inputNewFileName: "Masukkan nama berkas yang baru"
|
inputNewFileName: "Masukkan nama berkas yang baru"
|
||||||
|
inputNewDescription: "Masukkan keterangan disini"
|
||||||
inputNewFolderName: "Masukkan nama folder yang baru"
|
inputNewFolderName: "Masukkan nama folder yang baru"
|
||||||
circularReferenceFolder: "Folder tujuan adalah subfolder dari folder yang ingin kamu pindahkan."
|
circularReferenceFolder: "Folder tujuan adalah subfolder dari folder yang ingin kamu pindahkan."
|
||||||
hasChildFilesOrFolders: "Karena folder ini tidak kosong, maka tidak dapat dihapus."
|
hasChildFilesOrFolders: "Karena folder ini tidak kosong, maka tidak dapat dihapus."
|
||||||
@ -310,6 +312,8 @@ monthX: "{month}"
|
|||||||
yearX: "{year}"
|
yearX: "{year}"
|
||||||
pages: "Halaman"
|
pages: "Halaman"
|
||||||
integration: "Integrasi"
|
integration: "Integrasi"
|
||||||
|
connectService: "Sambungkan"
|
||||||
|
disconnectService: "Putuskan"
|
||||||
enableLocalTimeline: "Nyalakan linimasa lokal"
|
enableLocalTimeline: "Nyalakan linimasa lokal"
|
||||||
enableGlobalTimeline: "Nyalakan linimasa global"
|
enableGlobalTimeline: "Nyalakan linimasa global"
|
||||||
disablingTimelinesInfo: "Admin dan Moderator akan selalu memiliki akses ke semua linimasa meskipun linimasa tersebut tidak diaktifkan."
|
disablingTimelinesInfo: "Admin dan Moderator akan selalu memiliki akses ke semua linimasa meskipun linimasa tersebut tidak diaktifkan."
|
||||||
@ -323,13 +327,14 @@ driveCapacityPerRemoteAccount: "Kapasitas drive per pengguna remote"
|
|||||||
inMb: "dalam Megabytes"
|
inMb: "dalam Megabytes"
|
||||||
iconUrl: "URL Gambar ikon"
|
iconUrl: "URL Gambar ikon"
|
||||||
bannerUrl: "URL Banner"
|
bannerUrl: "URL Banner"
|
||||||
|
backgroundImageUrl: "URL Gambar latar"
|
||||||
basicInfo: "Informasi Umum"
|
basicInfo: "Informasi Umum"
|
||||||
pinnedUsers: "Pengguna yang disematkan"
|
pinnedUsers: "Pengguna yang disematkan"
|
||||||
pinnedUsersDescription: "Tuliskan satu nama pengguna dalam satu baris. Pengguna yang dituliskan disini akan disematkan dalam bilah \"Jelajahi\"."
|
pinnedUsersDescription: "Tuliskan satu nama pengguna dalam satu baris. Pengguna yang dituliskan disini akan disematkan dalam bilah \"Jelajahi\"."
|
||||||
pinnedPages: "Halaman yang disematkan"
|
pinnedPages: "Halaman yang disematkan"
|
||||||
pinnedPagesDescription: "Masukkan tautan dari halaman yang kamu ingin sematkan ke halaman utama dari instansi ini, dipisah dengan membuat baris baru."
|
pinnedPagesDescription: "Masukkan tautan dari halaman yang kamu ingin sematkan ke halaman utama dari instansi ini, dipisah dengan membuat baris baru."
|
||||||
pinnedClipId: "ID dari klip yang disematkan"
|
pinnedClipId: "ID dari klip yang disematkan"
|
||||||
pinnedNotes: "Note yang disematkan"
|
pinnedNotes: "Catatan yang disematkan"
|
||||||
hcaptcha: "hCaptcha"
|
hcaptcha: "hCaptcha"
|
||||||
enableHcaptcha: "Nyalakan hCaptcha"
|
enableHcaptcha: "Nyalakan hCaptcha"
|
||||||
hcaptchaSiteKey: "Site Key"
|
hcaptchaSiteKey: "Site Key"
|
||||||
@ -346,14 +351,14 @@ antennaSource: "Sumber Antenna"
|
|||||||
antennaKeywords: "Kata kunci yang diterima"
|
antennaKeywords: "Kata kunci yang diterima"
|
||||||
antennaExcludeKeywords: "Kata kunci yang dikecualikan"
|
antennaExcludeKeywords: "Kata kunci yang dikecualikan"
|
||||||
antennaKeywordsDescription: "Pisahkan dengan spasi untuk kondisi AND. Pisahkan dengan baris baru untuk kondisi OR."
|
antennaKeywordsDescription: "Pisahkan dengan spasi untuk kondisi AND. Pisahkan dengan baris baru untuk kondisi OR."
|
||||||
notifyAntenna: "Beritahu untuk note baru"
|
notifyAntenna: "Beritahu untuk catatan baru"
|
||||||
withFileAntenna: "Hanya tampilkan note dengan berkas yang dilampirkan"
|
withFileAntenna: "Hanya tampilkan catatan dengan berkas yang dilampirkan"
|
||||||
enableServiceworker: "Aktifkan ServiceWorker"
|
enableServiceworker: "Aktifkan ServiceWorker"
|
||||||
antennaUsersDescription: "Tuliskan satu nama pengguna per baris"
|
antennaUsersDescription: "Tuliskan satu nama pengguna per baris"
|
||||||
caseSensitive: "Peka huruf besar dan huruf kecil"
|
caseSensitive: "Peka huruf besar dan huruf kecil"
|
||||||
withReplies: "Termasuk balasan"
|
withReplies: "Termasuk balasan"
|
||||||
connectedTo: "Akun yang mengikuti telah terhubung"
|
connectedTo: "Akun yang mengikuti telah terhubung"
|
||||||
notesAndReplies: "Note dan balasan"
|
notesAndReplies: "Catatan dan balasan"
|
||||||
withFiles: "Media"
|
withFiles: "Media"
|
||||||
silence: "Bungkam"
|
silence: "Bungkam"
|
||||||
silenceConfirm: "Apakah kamu yakin ingin membungkam pengguna ini?"
|
silenceConfirm: "Apakah kamu yakin ingin membungkam pengguna ini?"
|
||||||
@ -389,7 +394,7 @@ notFoundDescription: "Tidak ada halaman sesuai dengan URL yang ditentukan."
|
|||||||
uploadFolder: "Lokasi unggah folder bawaan"
|
uploadFolder: "Lokasi unggah folder bawaan"
|
||||||
cacheClear: "Bersihkan tembolok"
|
cacheClear: "Bersihkan tembolok"
|
||||||
markAsReadAllNotifications: "Tandai semua pemberitahuan telah dibaca"
|
markAsReadAllNotifications: "Tandai semua pemberitahuan telah dibaca"
|
||||||
markAsReadAllUnreadNotes: "Tandai semua note telah dibaca"
|
markAsReadAllUnreadNotes: "Tandai semua catatan telah dibaca"
|
||||||
markAsReadAllTalkMessages: "Tandai semua pesan telah dibaca"
|
markAsReadAllTalkMessages: "Tandai semua pesan telah dibaca"
|
||||||
help: "Bantuan"
|
help: "Bantuan"
|
||||||
inputMessageHere: "Ketik pesan disini"
|
inputMessageHere: "Ketik pesan disini"
|
||||||
@ -410,9 +415,9 @@ text: "Teks"
|
|||||||
enable: "Aktifkan"
|
enable: "Aktifkan"
|
||||||
next: "Selanjutnya"
|
next: "Selanjutnya"
|
||||||
retype: "Masukkan ulang"
|
retype: "Masukkan ulang"
|
||||||
noteOf: "Note milik {user}"
|
noteOf: "Catatan milik {user}"
|
||||||
inviteToGroup: "Undang ke grup"
|
inviteToGroup: "Undang ke grup"
|
||||||
maxNoteTextLength: "Batas karakter dari note"
|
maxNoteTextLength: "Batas karakter catatan"
|
||||||
quoteAttached: "Dikutip"
|
quoteAttached: "Dikutip"
|
||||||
quoteQuestion: "Apakah kamu ingin menambahkan kutipan?"
|
quoteQuestion: "Apakah kamu ingin menambahkan kutipan?"
|
||||||
noMessagesYet: "Tidak ada pesan"
|
noMessagesYet: "Tidak ada pesan"
|
||||||
@ -524,7 +529,7 @@ removeAllFollowing: "Tahan semua mengikuti"
|
|||||||
removeAllFollowingDescription: "Batal mengikuti semua akun dari {host}. Mohon jalankan ini ketika instansi sudah tidak ada lagi."
|
removeAllFollowingDescription: "Batal mengikuti semua akun dari {host}. Mohon jalankan ini ketika instansi sudah tidak ada lagi."
|
||||||
userSuspended: "Pengguna ini telah dibekukan."
|
userSuspended: "Pengguna ini telah dibekukan."
|
||||||
userSilenced: "Pengguna ini telah dibungkam."
|
userSilenced: "Pengguna ini telah dibungkam."
|
||||||
sidebar: "Bilah samping"
|
menu: "Menu"
|
||||||
divider: "Pembagi"
|
divider: "Pembagi"
|
||||||
addItem: "Tambahkan item"
|
addItem: "Tambahkan item"
|
||||||
rooms: "Ruang"
|
rooms: "Ruang"
|
||||||
@ -533,8 +538,8 @@ addRelay: "Tambahkan relay"
|
|||||||
inboxUrl: "URL Kotak masuk"
|
inboxUrl: "URL Kotak masuk"
|
||||||
addedRelays: "Relay yang ditambahkan"
|
addedRelays: "Relay yang ditambahkan"
|
||||||
serviceworkerInfo: "Harus diaktifkan untuk pemberitahuan push."
|
serviceworkerInfo: "Harus diaktifkan untuk pemberitahuan push."
|
||||||
deletedNote: "Note yang dihapus"
|
deletedNote: "Catatan yang dihapus"
|
||||||
invisibleNote: "Postingan yang disembunyikan"
|
invisibleNote: "Catatan yang disembunyikan"
|
||||||
enableInfiniteScroll: "Aktifkan gulir tak terbatas"
|
enableInfiniteScroll: "Aktifkan gulir tak terbatas"
|
||||||
visibility: "Visibilitas"
|
visibility: "Visibilitas"
|
||||||
poll: "Angket"
|
poll: "Angket"
|
||||||
@ -544,6 +549,8 @@ disablePlayer: "Tutup pemutar video"
|
|||||||
expandTweet: "Perluas utas"
|
expandTweet: "Perluas utas"
|
||||||
themeEditor: "Penyunting tema"
|
themeEditor: "Penyunting tema"
|
||||||
description: "Deskripsi"
|
description: "Deskripsi"
|
||||||
|
describeFile: "Tambahkan keterangan"
|
||||||
|
enterFileDescription: "Masukkan keterangan"
|
||||||
author: "Pembuat"
|
author: "Pembuat"
|
||||||
leaveConfirm: "Ada perubahan yang belum disimpan. Apakah kamu ingin membuangnya?"
|
leaveConfirm: "Ada perubahan yang belum disimpan. Apakah kamu ingin membuangnya?"
|
||||||
manage: "Manajemen"
|
manage: "Manajemen"
|
||||||
@ -595,7 +602,7 @@ create: "Buat"
|
|||||||
notificationSetting: "Pengaturan Pemberitahuan"
|
notificationSetting: "Pengaturan Pemberitahuan"
|
||||||
notificationSettingDesc: "Pilih tipe pemberitahuan untuk ditampilkan"
|
notificationSettingDesc: "Pilih tipe pemberitahuan untuk ditampilkan"
|
||||||
useGlobalSetting: "Gunakan setelan global"
|
useGlobalSetting: "Gunakan setelan global"
|
||||||
useGlobalSettingDesc: "Jika dinyalakan, setelan pemberitahuan akun anda akan digunakan. Jika dimatikan, konfigurasi secara individu dapat dibuat."
|
useGlobalSettingDesc: "Jika dinyalakan, setelan pemberitahuan akun kamu akan digunakan. Jika dimatikan, konfigurasi secara individu dapat dibuat."
|
||||||
other: "Lainnya"
|
other: "Lainnya"
|
||||||
regenerateLoginToken: "Perbarui token login"
|
regenerateLoginToken: "Perbarui token login"
|
||||||
regenerateLoginTokenDescription: "Perbarui token yang digunakan secara internal saat login. Normalnya aksi ini tidak diperlukan. Jika diperbarui, semua perangkat akan dilogout."
|
regenerateLoginTokenDescription: "Perbarui token yang digunakan secara internal saat login. Normalnya aksi ini tidak diperlukan. Jika diperbarui, semua perangkat akan dilogout."
|
||||||
@ -629,7 +636,7 @@ public: "Publik"
|
|||||||
i18nInfo: "Misskey diterjemahkan ke dalam banyak bahasa oleh sukarelawan. Kamu dapat ikut membantu di {link}."
|
i18nInfo: "Misskey diterjemahkan ke dalam banyak bahasa oleh sukarelawan. Kamu dapat ikut membantu di {link}."
|
||||||
manageAccessTokens: "Kelola access token"
|
manageAccessTokens: "Kelola access token"
|
||||||
accountInfo: "Informasi akun"
|
accountInfo: "Informasi akun"
|
||||||
notesCount: "Jumlah note"
|
notesCount: "Jumlah catatan"
|
||||||
repliesCount: "Jumlah balasan terkirim"
|
repliesCount: "Jumlah balasan terkirim"
|
||||||
renotesCount: "Jumlah renote terkirim"
|
renotesCount: "Jumlah renote terkirim"
|
||||||
repliedCount: "Jumlah balasan diterima"
|
repliedCount: "Jumlah balasan diterima"
|
||||||
@ -645,15 +652,15 @@ no: "Tidak"
|
|||||||
driveFilesCount: "Jumlah berkas drive"
|
driveFilesCount: "Jumlah berkas drive"
|
||||||
driveUsage: "Penggunaan ruang penyimpanan drive"
|
driveUsage: "Penggunaan ruang penyimpanan drive"
|
||||||
noCrawle: "Tolak pengindeksan crawler"
|
noCrawle: "Tolak pengindeksan crawler"
|
||||||
noCrawleDescription: "Meminta mesin pencari untuk tidak mengindeks halaman profil kamu, note, Halaman, dll."
|
noCrawleDescription: "Meminta mesin pencari untuk tidak mengindeks halaman profil kamu, catatan, Halaman, dll."
|
||||||
lockedAccountInfo: "Kecuali kamu menyetel visibilitas note milikmu ke \"Hanya pengikut\", note milikmu akan dapat dilihat oleh siapa saja, bahkan jika kamu memerlukan pengikut untuk disetujui secara manual."
|
lockedAccountInfo: "Kecuali kamu menyetel visibilitas catatan milikmu ke \"Hanya pengikut\", catatan milikmu akan dapat dilihat oleh siapa saja, bahkan jika kamu memerlukan pengikut untuk disetujui secara manual."
|
||||||
alwaysMarkSensitive: "Tandai NSFW sebagai bawaan"
|
alwaysMarkSensitive: "Tandai media dalam catatan sebagai media sensitif"
|
||||||
loadRawImages: "Tampilkan lampiran gambar secara penuh daripada thumbnail"
|
loadRawImages: "Tampilkan lampiran gambar secara penuh daripada thumbnail"
|
||||||
disableShowingAnimatedImages: "Jangan mainkan gambar bergerak"
|
disableShowingAnimatedImages: "Jangan mainkan gambar bergerak"
|
||||||
verificationEmailSent: "Surel verifikasi telah dikirimkan. Mohon akses tautan yang telah disertakan untuk menyelesaikan verifikasi."
|
verificationEmailSent: "Surel verifikasi telah dikirimkan. Mohon akses tautan yang telah disertakan untuk menyelesaikan verifikasi."
|
||||||
notSet: "Tidak disetel"
|
notSet: "Tidak disetel"
|
||||||
emailVerified: "Surel telah diverifikasi"
|
emailVerified: "Surel telah diverifikasi"
|
||||||
noteFavoritesCount: "Jumlah note yang difavoritkan"
|
noteFavoritesCount: "Jumlah catatan yang difavoritkan"
|
||||||
pageLikesCount: "Jumlah suka yang diterima Halaman"
|
pageLikesCount: "Jumlah suka yang diterima Halaman"
|
||||||
pageLikedCount: "Jumlah Halaman yang disukai"
|
pageLikedCount: "Jumlah Halaman yang disukai"
|
||||||
reversiCount: "Jumlah pertandingan Reversi"
|
reversiCount: "Jumlah pertandingan Reversi"
|
||||||
@ -664,7 +671,7 @@ experimentalFeatures: "Fitur eksperimental"
|
|||||||
developer: "Pengembang"
|
developer: "Pengembang"
|
||||||
makeExplorable: "Buat akun tampil di \"Jelajahi\""
|
makeExplorable: "Buat akun tampil di \"Jelajahi\""
|
||||||
makeExplorableDescription: "Jika kamu mematikan ini, akun kamu tidak akan muncul di bagian \"Jelajahi:"
|
makeExplorableDescription: "Jika kamu mematikan ini, akun kamu tidak akan muncul di bagian \"Jelajahi:"
|
||||||
showGapBetweenNotesInTimeline: "Tampilkan jarak diantara postingan pada linimasa"
|
showGapBetweenNotesInTimeline: "Tampilkan jarak diantara catatan pada linimasa"
|
||||||
duplicate: "Duplikat"
|
duplicate: "Duplikat"
|
||||||
left: "Kiri"
|
left: "Kiri"
|
||||||
center: "Tengah"
|
center: "Tengah"
|
||||||
@ -716,8 +723,8 @@ unlikeConfirm: "Yakin ingin hapus sukamu?"
|
|||||||
fullView: "Tampilan penuh"
|
fullView: "Tampilan penuh"
|
||||||
quitFullView: "Keluar tampilan penuh"
|
quitFullView: "Keluar tampilan penuh"
|
||||||
addDescription: "Tambahkan deskripsi"
|
addDescription: "Tambahkan deskripsi"
|
||||||
userPagePinTip: "Kamu dapat membuat note untuk ditampilkan disini dengan memilih \"Sematkan ke profil\" dari menu pada note individu."
|
userPagePinTip: "Kamu dapat membuat catatan untuk ditampilkan disini dengan memilih \"Sematkan ke profil\" dari menu pada catatan individu."
|
||||||
notSpecifiedMentionWarning: "Note ini mengandung sebutan dari pengguna yang tidak dimuat sebagai penerima"
|
notSpecifiedMentionWarning: "Catatan ini mengandung sebutan dari pengguna yang tidak dimuat sebagai penerima"
|
||||||
info: "Informasi"
|
info: "Informasi"
|
||||||
userInfo: "Informasi pengguna"
|
userInfo: "Informasi pengguna"
|
||||||
unknown: "Tidak diketahui"
|
unknown: "Tidak diketahui"
|
||||||
@ -745,7 +752,7 @@ postToGallery: "Posting ke galeri"
|
|||||||
gallery: "Galeri"
|
gallery: "Galeri"
|
||||||
recentPosts: "Postingan terbaru"
|
recentPosts: "Postingan terbaru"
|
||||||
popularPosts: "Postingan populer"
|
popularPosts: "Postingan populer"
|
||||||
shareWithNote: "Bagikan dengan note"
|
shareWithNote: "Bagikan dengan catatan"
|
||||||
ads: "Iklan"
|
ads: "Iklan"
|
||||||
expiration: "Batas akhir"
|
expiration: "Batas akhir"
|
||||||
memo: "Memo"
|
memo: "Memo"
|
||||||
@ -755,6 +762,14 @@ middle: "Sedang"
|
|||||||
low: "Rendah"
|
low: "Rendah"
|
||||||
emailNotConfiguredWarning: "Alamat surel tidak disetel."
|
emailNotConfiguredWarning: "Alamat surel tidak disetel."
|
||||||
ratio: "Rasio"
|
ratio: "Rasio"
|
||||||
|
customCss: "Custom CSS"
|
||||||
|
customCssWarn: "Pengaturan ini seharusnya digunakan jika kamu tahu cara kerjanya. Memasukkan nilai yang tidak tepat dapat menyebabkan klien tidak berfungsi semestinya."
|
||||||
|
global: "Global"
|
||||||
|
squareAvatars: "Tampilkan avatar sebagai persegi"
|
||||||
|
sent: "Kirim"
|
||||||
|
hashtags: "Tagar"
|
||||||
|
_docs:
|
||||||
|
admin: "Manajemen"
|
||||||
_ad:
|
_ad:
|
||||||
back: "Kembali"
|
back: "Kembali"
|
||||||
reduceFrequencyOfThisAd: "Tampilkan iklan ini lebih sedikit"
|
reduceFrequencyOfThisAd: "Tampilkan iklan ini lebih sedikit"
|
||||||
@ -769,7 +784,7 @@ _gallery:
|
|||||||
unlike: "Hapus suka"
|
unlike: "Hapus suka"
|
||||||
_email:
|
_email:
|
||||||
_follow:
|
_follow:
|
||||||
title: "Sedang mengikuti"
|
title: "Mengikuti kamu"
|
||||||
_receiveFollowRequest:
|
_receiveFollowRequest:
|
||||||
title: "Kamu menerima permintaan mengikuti"
|
title: "Kamu menerima permintaan mengikuti"
|
||||||
_plugin:
|
_plugin:
|
||||||
@ -799,7 +814,7 @@ _mfm:
|
|||||||
cheatSheet: "Contekan MFM"
|
cheatSheet: "Contekan MFM"
|
||||||
intro: "MFM adalah Misskey-exclusive Markup Language yang dapat digunakan di banyak tempat. Berikut kamu bisa melihat daftar dari syntax MFM yang ada."
|
intro: "MFM adalah Misskey-exclusive Markup Language yang dapat digunakan di banyak tempat. Berikut kamu bisa melihat daftar dari syntax MFM yang ada."
|
||||||
dummy: "Misskey membentangkan dunia Fediverse"
|
dummy: "Misskey membentangkan dunia Fediverse"
|
||||||
mention: "Sebutan"
|
mention: "Sebut"
|
||||||
mentionDescription: "Kamu dapat menentukan pengguna tertentu dengan menggunakan simbol-At dan nama engguna mereka."
|
mentionDescription: "Kamu dapat menentukan pengguna tertentu dengan menggunakan simbol-At dan nama engguna mereka."
|
||||||
hashtag: "Tagar"
|
hashtag: "Tagar"
|
||||||
hashtagDescription: "Kamu dapat menentukan tagar dengan menggunakan angka dan teks."
|
hashtagDescription: "Kamu dapat menentukan tagar dengan menggunakan angka dan teks."
|
||||||
@ -825,7 +840,7 @@ _mfm:
|
|||||||
quoteDescription: "Menampilkan konten sebagai kutipan."
|
quoteDescription: "Menampilkan konten sebagai kutipan."
|
||||||
emoji: "Emoji kustom"
|
emoji: "Emoji kustom"
|
||||||
emojiDescription: "Emoji kustom dapat ditampilkan dengan mengurung nama emoji kustom menggunakan tanda titik dua."
|
emojiDescription: "Emoji kustom dapat ditampilkan dengan mengurung nama emoji kustom menggunakan tanda titik dua."
|
||||||
search: "Pencarian"
|
search: "Penelusuran"
|
||||||
searchDescription: "Menampilkan kotak pencarian dengan teks yang sudah dimasukkan."
|
searchDescription: "Menampilkan kotak pencarian dengan teks yang sudah dimasukkan."
|
||||||
flip: "Balik"
|
flip: "Balik"
|
||||||
flipDescription: "Balikkan konten secara horizontal atau vertikal."
|
flipDescription: "Balikkan konten secara horizontal atau vertikal."
|
||||||
@ -903,20 +918,21 @@ _channel:
|
|||||||
owned: "Dimiliki"
|
owned: "Dimiliki"
|
||||||
following: "Mengikuti"
|
following: "Mengikuti"
|
||||||
usersCount: "{n} Partisipan"
|
usersCount: "{n} Partisipan"
|
||||||
notesCount: "{n} Note"
|
notesCount: "terdapat {n} catatan"
|
||||||
_sidebar:
|
_menuDisplay:
|
||||||
full: "Penuh"
|
sideFull: "Horisontal"
|
||||||
icon: "Avatar"
|
sideIcon: "Horisontal (Ikon)"
|
||||||
|
top: "Atas"
|
||||||
hide: "Sembunyikan"
|
hide: "Sembunyikan"
|
||||||
_wordMute:
|
_wordMute:
|
||||||
muteWords: "Kata yang dibisukan"
|
muteWords: "Kata yang dibisukan"
|
||||||
muteWordsDescription: "Pisahkan dengan spasi untuk kondisi AND. Pisahkan dengan baris baru untuk kondisi OR."
|
muteWordsDescription: "Pisahkan dengan spasi untuk kondisi AND. Pisahkan dengan baris baru untuk kondisi OR."
|
||||||
muteWordsDescription2: "Kurung kata kunci dengan garis miring untuk menggunakan regular expressions."
|
muteWordsDescription2: "Kurung kata kunci dengan garis miring untuk menggunakan regular expressions."
|
||||||
softDescription: "Sembunyikan note yang memenuhi aturan kondisi dari linimasa."
|
softDescription: "Sembunyikan catatan yang memenuhi aturan kondisi dari linimasa."
|
||||||
hardDescription: "Cegah note memenuhi aturan kondisi dari ditambahkan ke linimasa. Dengan tambahan, note berikut tidak akan ditambahkan ke linimasa meskipun jika kondisi tersebut diubah."
|
hardDescription: "Cegah catatan memenuhi aturan kondisi dari ditambahkan ke linimasa. Dengan tambahan, catatan berikut tidak akan ditambahkan ke linimasa meskipun jika kondisi tersebut diubah."
|
||||||
soft: "Lembut"
|
soft: "Lembut"
|
||||||
hard: "Keras"
|
hard: "Keras"
|
||||||
mutedNotes: "Note yang dibisukan"
|
mutedNotes: "Catatan yang dibisukan"
|
||||||
_theme:
|
_theme:
|
||||||
explore: "Jelajahi tema"
|
explore: "Jelajahi tema"
|
||||||
install: "Pasang tema"
|
install: "Pasang tema"
|
||||||
@ -963,7 +979,7 @@ _theme:
|
|||||||
navIndicator: "Indikator bilah samping"
|
navIndicator: "Indikator bilah samping"
|
||||||
link: "Tautan"
|
link: "Tautan"
|
||||||
hashtag: "Tagar"
|
hashtag: "Tagar"
|
||||||
mention: "Sebutan"
|
mention: "Sebut"
|
||||||
mentionMe: "Sebutan (saya)"
|
mentionMe: "Sebutan (saya)"
|
||||||
renote: "Renote"
|
renote: "Renote"
|
||||||
modalBg: "Latar belakang modal"
|
modalBg: "Latar belakang modal"
|
||||||
@ -992,9 +1008,9 @@ _theme:
|
|||||||
accentLighten: "Aksen (Terang)"
|
accentLighten: "Aksen (Terang)"
|
||||||
fgHighlighted: "Teks yang disorot"
|
fgHighlighted: "Teks yang disorot"
|
||||||
_sfx:
|
_sfx:
|
||||||
note: "Note"
|
note: "Catatan"
|
||||||
noteMy: "Note (Saya)"
|
noteMy: "Catatan (Saya)"
|
||||||
notification: "Notifikasi"
|
notification: "Pemberitahuan"
|
||||||
chat: "Pesan"
|
chat: "Pesan"
|
||||||
chatBg: "Obrolan (Latar Belakang)"
|
chatBg: "Obrolan (Latar Belakang)"
|
||||||
antenna: "Penerimaan Antenna"
|
antenna: "Penerimaan Antenna"
|
||||||
@ -1005,13 +1021,13 @@ _ago:
|
|||||||
unknown: "Tidak diketahui"
|
unknown: "Tidak diketahui"
|
||||||
future: "Masa depan"
|
future: "Masa depan"
|
||||||
justNow: "Baru saja"
|
justNow: "Baru saja"
|
||||||
secondsAgo: "{n} detik yang lalu"
|
secondsAgo: "{n} detik lalu"
|
||||||
minutesAgo: "{n} menit yang lalu"
|
minutesAgo: "{n} menit lalu"
|
||||||
hoursAgo: "{n} jam yang lalu"
|
hoursAgo: "{n} jam lalu"
|
||||||
daysAgo: "{n} hari yang lalu"
|
daysAgo: "{n} hari lalu"
|
||||||
weeksAgo: "{n} minggu yang lalu"
|
weeksAgo: "{n} minggu lalu"
|
||||||
monthsAgo: "{n} bulan yang lalu"
|
monthsAgo: "{n} bulan lalu"
|
||||||
yearsAgo: "{n} tahun yang lalu"
|
yearsAgo: "{n} tahun lalu"
|
||||||
_time:
|
_time:
|
||||||
second: "detik"
|
second: "detik"
|
||||||
minute: "menit"
|
minute: "menit"
|
||||||
@ -1020,23 +1036,23 @@ _time:
|
|||||||
_tutorial:
|
_tutorial:
|
||||||
title: "Cara menggunakan Misskey"
|
title: "Cara menggunakan Misskey"
|
||||||
step1_1: "Selamat datang!"
|
step1_1: "Selamat datang!"
|
||||||
step1_2: "Halaman ini disebut \"linimasa\". Halaman ini menampilkan \"note\" yang diurutkan secara kronologis dari orang-orang yang kamu \"ikuti\"."
|
step1_2: "Halaman ini disebut \"linimasa\". Halaman ini menampilkan \"catatan\" yang diurutkan secara kronologis dari orang-orang yang kamu \"ikuti\"."
|
||||||
step1_3: "Linimasa kamu kosong, karena kamu belum memposting note apapun atau mengikuti siapapun."
|
step1_3: "Linimasa kamu kosong, karena kamu belum mencatat catatan apapun atau mengikuti siapapun."
|
||||||
step2_1: "Selesaikan menyetel profilmu sebelum menulis sebuah note atau mengikuti seseorang."
|
step2_1: "Selesaikan menyetel profilmu sebelum menulis sebuah catatan atau mengikuti seseorang."
|
||||||
step2_2: "Menyediakan beberapa informasi tentang siapa kamu akan membuat orang lain mudah untuk mengikutimu kembali."
|
step2_2: "Menyediakan beberapa informasi tentang siapa kamu akan membuat orang lain mudah untuk mengikutimu kembali."
|
||||||
step3_1: "Selesai menyetel profil kamu?"
|
step3_1: "Selesai menyetel profil kamu?"
|
||||||
step3_2: "Langkah selanjutnya adalah membuat note. Kamu bisa lakukan ini dengan mengklik ikon pensil pada layar kamu."
|
step3_2: "Langkah selanjutnya adalah membuat catatan. Kamu bisa lakukan ini dengan mengklik ikon pensil pada layar kamu."
|
||||||
step3_3: "Isilah di dalam modal dan tekan tombol pada atas kanan untuk memposting note kamu."
|
step3_3: "Isilah di dalam modal dan tekan tombol pada atas kanan untuk memcatat catatan kamu."
|
||||||
step3_4: "Bingung tidak berpikiran untuk mengatakan sesuatu? Coba saja \"baru aja ikutan bikin akun misskey punyaku\"!"
|
step3_4: "Bingung tidak berpikiran untuk mengatakan sesuatu? Coba saja \"baru aja ikutan bikin akun misskey punyaku\"!"
|
||||||
step4_1: "Selesai memposting note pertamamu?"
|
step4_1: "Selesai mencatat catatan pertamamu?"
|
||||||
step4_2: "Horee! Sekarang note pertamamu sudah ditampilkan di linimasa milikmu."
|
step4_2: "Horee! Sekarang catatan pertamamu sudah ditampilkan di linimasa milikmu."
|
||||||
step5_1: "Sekarang, mari mencoba untuk membuat linimasamu lebih hidup dengan mengikuti orang lain."
|
step5_1: "Sekarang, mari mencoba untuk membuat linimasamu lebih hidup dengan mengikuti orang lain."
|
||||||
step5_2: "{featured} akan memperlihatkan note yang sedang tren saat ini untuk kamu. {explore} akan membantumu untuk mencari pengguna yang sedang tren juga saat ini. Coba ikuti seseorang yang kamu suka!"
|
step5_2: "{featured} akan memperlihatkan catatan yang sedang tren saat ini untuk kamu. {explore} akan membantumu untuk mencari pengguna yang sedang tren juga saat ini. Coba ikuti seseorang yang kamu suka!"
|
||||||
step5_3: "Untuk mengikuti pengguna lain, klik pada ikon mereka dan tekan tombol follow pada profil mereka."
|
step5_3: "Untuk mengikuti pengguna lain, klik pada ikon mereka dan tekan tombol follow pada profil mereka."
|
||||||
step5_4: "Jika pengguna lain memiliki ikon gembok di sebelah nama mereka, maka pengguna rersebut harus menyetujui permintaan mengikuti dari kamu secara manual."
|
step5_4: "Jika pengguna lain memiliki ikon gembok di sebelah nama mereka, maka pengguna rersebut harus menyetujui permintaan mengikuti dari kamu secara manual."
|
||||||
step6_1: "Sekarang kamu dapat melihat note pengguna lain pada linimasamu."
|
step6_1: "Sekarang kamu dapat melihat catatan pengguna lain pada linimasamu."
|
||||||
step6_2: "Kamu juga bisa memberikan \"reaksi\" ke note orang lain untuk merespon dengan cepat."
|
step6_2: "Kamu juga bisa memberikan \"reaksi\" ke catatan orang lain untuk merespon dengan cepat."
|
||||||
step6_3: "Untuk memberikan \"reaksi\", tekan tanda \"+\" pada note pengguna lain dan pilih emoji yang kamu suka untuk memberikan reaksimu kepada mereka."
|
step6_3: "Untuk memberikan \"reaksi\", tekan tanda \"+\" pada catatan pengguna lain dan pilih emoji yang kamu suka untuk memberikan reaksimu kepada mereka."
|
||||||
step7_1: "Yay, Selamat! Kamu sudah menyelesaikan tutorial dasar Misskey."
|
step7_1: "Yay, Selamat! Kamu sudah menyelesaikan tutorial dasar Misskey."
|
||||||
step7_2: "Jika kamu ingin mempelajari lebih lanjut tentang Misskey, cobalah berkunjung ke bagian {help}."
|
step7_2: "Jika kamu ingin mempelajari lebih lanjut tentang Misskey, cobalah berkunjung ke bagian {help}."
|
||||||
step7_3: "Semoga berhasil dan bersenang-senanglah! 🚀"
|
step7_3: "Semoga berhasil dan bersenang-senanglah! 🚀"
|
||||||
@ -1064,7 +1080,7 @@ _permissions:
|
|||||||
"write:messaging": "Buat atau hapus obrolan"
|
"write:messaging": "Buat atau hapus obrolan"
|
||||||
"read:mutes": "Lihat daftar orang yang dibisukan"
|
"read:mutes": "Lihat daftar orang yang dibisukan"
|
||||||
"write:mutes": "Sunting daftar orang yang dibisukan"
|
"write:mutes": "Sunting daftar orang yang dibisukan"
|
||||||
"write:notes": "Buat atau hapus note"
|
"write:notes": "Buat atau hapus catatan"
|
||||||
"read:notifications": "Lihat pemberitahuan"
|
"read:notifications": "Lihat pemberitahuan"
|
||||||
"write:notifications": "Sunting pemberitahuan"
|
"write:notifications": "Sunting pemberitahuan"
|
||||||
"read:reactions": "Lihat reaksi"
|
"read:reactions": "Lihat reaksi"
|
||||||
@ -1086,11 +1102,11 @@ _auth:
|
|||||||
callback: "Mengembalikan kamu ke aplikasi"
|
callback: "Mengembalikan kamu ke aplikasi"
|
||||||
denied: "Akses ditolak"
|
denied: "Akses ditolak"
|
||||||
_antennaSources:
|
_antennaSources:
|
||||||
all: "Semua note"
|
all: "Semua catatan"
|
||||||
homeTimeline: "Note dari pengguna yang diikuti"
|
homeTimeline: "Catatan dari pengguna yang diikuti"
|
||||||
users: "Note dari pengguna tertentu"
|
users: "Catatan dari pengguna tertentu"
|
||||||
userList: "Note dari daftar tertentu"
|
userList: "Catatan dari daftar tertentu"
|
||||||
userGroup: "Note dari pengguna dalam grup yang ditentukan"
|
userGroup: "Catatan dari pengguna dalam grup yang ditentukan"
|
||||||
_weekday:
|
_weekday:
|
||||||
sunday: "Minggu"
|
sunday: "Minggu"
|
||||||
monday: "Senin"
|
monday: "Senin"
|
||||||
@ -1101,7 +1117,7 @@ _weekday:
|
|||||||
saturday: "Sabtu"
|
saturday: "Sabtu"
|
||||||
_widgets:
|
_widgets:
|
||||||
memo: "Catatan memo"
|
memo: "Catatan memo"
|
||||||
notifications: "Notifikasi"
|
notifications: "Pemberitahuan"
|
||||||
timeline: "Linimasa"
|
timeline: "Linimasa"
|
||||||
calendar: "Kalender"
|
calendar: "Kalender"
|
||||||
trends: "Tren"
|
trends: "Tren"
|
||||||
@ -1111,7 +1127,7 @@ _widgets:
|
|||||||
photos: "Foto"
|
photos: "Foto"
|
||||||
digitalClock: "Jam digital"
|
digitalClock: "Jam digital"
|
||||||
federation: "Federasi"
|
federation: "Federasi"
|
||||||
postForm: "Buat note"
|
postForm: "Buat catatan"
|
||||||
slideshow: "Slideshow"
|
slideshow: "Slideshow"
|
||||||
button: "Tombol"
|
button: "Tombol"
|
||||||
onlineUsers: "Pengguna online"
|
onlineUsers: "Pengguna online"
|
||||||
@ -1147,18 +1163,18 @@ _poll:
|
|||||||
remainingSeconds: "Berakhir dalam {s} detik"
|
remainingSeconds: "Berakhir dalam {s} detik"
|
||||||
_visibility:
|
_visibility:
|
||||||
public: "Publik"
|
public: "Publik"
|
||||||
publicDescription: "Note kamu akan muncul di linimasa global"
|
publicDescription: "Catat ke linimasa global"
|
||||||
home: "Beranda"
|
home: "Beranda"
|
||||||
homeDescription: "Posting hanya ke linimasa beranda saja"
|
homeDescription: "Catat ke linimasa beranda saja"
|
||||||
followers: "Pengikut"
|
followers: "Pengikut"
|
||||||
followersDescription: "Posting hanya ke pengikut saja"
|
followersDescription: "Catat ke pengikut saja"
|
||||||
specified: "Direct"
|
specified: "Langsung"
|
||||||
specifiedDescription: "Posting hanya ke pengguna yang ditentukan saja"
|
specifiedDescription: "Catat ke pengguna yang ditentukan saja"
|
||||||
localOnly: "Hanya lokal"
|
localOnly: "Hanya lokal"
|
||||||
localOnlyDescription: "Tidak dapat dilihat oleh pengguna luar"
|
localOnlyDescription: "Hanya dapat dilihat di instansi lokal"
|
||||||
_postForm:
|
_postForm:
|
||||||
replyPlaceholder: "Balas ke note ini..."
|
replyPlaceholder: "Balas ke catatan ini..."
|
||||||
quotePlaceholder: "Kutip note ini..."
|
quotePlaceholder: "Kutip catatan ini..."
|
||||||
channelPlaceholder: "Posting ke kanal"
|
channelPlaceholder: "Posting ke kanal"
|
||||||
_placeholders:
|
_placeholders:
|
||||||
a: "Sedang apa kamu saat ini?"
|
a: "Sedang apa kamu saat ini?"
|
||||||
@ -1180,7 +1196,7 @@ _profile:
|
|||||||
changeAvatar: "Ubah avatar"
|
changeAvatar: "Ubah avatar"
|
||||||
changeBanner: "Ubah header"
|
changeBanner: "Ubah header"
|
||||||
_exportOrImport:
|
_exportOrImport:
|
||||||
allNotes: "Semua note"
|
allNotes: "Semua catatan"
|
||||||
followingList: "Ikuti"
|
followingList: "Ikuti"
|
||||||
muteList: "Bisukan"
|
muteList: "Bisukan"
|
||||||
blockingList: "Blokir"
|
blockingList: "Blokir"
|
||||||
@ -1191,10 +1207,10 @@ _charts:
|
|||||||
usersIncDec: "Perbedaan dalam # pengguna"
|
usersIncDec: "Perbedaan dalam # pengguna"
|
||||||
usersTotal: "Jumlah # pengguna"
|
usersTotal: "Jumlah # pengguna"
|
||||||
activeUsers: "Pengguna aktif"
|
activeUsers: "Pengguna aktif"
|
||||||
notesIncDec: "Perbedaan # dalam note"
|
notesIncDec: "Perbedaan # dalam catatan"
|
||||||
localNotesIncDec: "Perbedaan # dalam note lokal"
|
localNotesIncDec: "Perbedaan # dalam catatan lokal"
|
||||||
remoteNotesIncDec: "Perbedaan # dalam note luar"
|
remoteNotesIncDec: "Perbedaan # dalam catatan luar"
|
||||||
notesTotal: "Total # note"
|
notesTotal: "Total # catatan"
|
||||||
filesIncDec: "Perbedaan # dalam berkas"
|
filesIncDec: "Perbedaan # dalam berkas"
|
||||||
filesTotal: "Jumlah # berkas"
|
filesTotal: "Jumlah # berkas"
|
||||||
storageUsageIncDec: "Perbedaan dalam penggunaan penyimpanan"
|
storageUsageIncDec: "Perbedaan dalam penggunaan penyimpanan"
|
||||||
@ -1203,8 +1219,8 @@ _instanceCharts:
|
|||||||
requests: "Permintaan"
|
requests: "Permintaan"
|
||||||
users: "Perbedaan dalam # pengguna"
|
users: "Perbedaan dalam # pengguna"
|
||||||
usersTotal: "Jumlah # pengguna kumulatif"
|
usersTotal: "Jumlah # pengguna kumulatif"
|
||||||
notes: "Perbedaan # dalam note"
|
notes: "Perbedaan # dalam catatan"
|
||||||
notesTotal: "Jumlah # note kumulatif"
|
notesTotal: "Jumlah # catatan kumulatif"
|
||||||
ff: "Perbedaan jumlah # dalam pengikut"
|
ff: "Perbedaan jumlah # dalam pengikut"
|
||||||
ffTotal: "Jumlah # pengikut kumulatif"
|
ffTotal: "Jumlah # pengikut kumulatif"
|
||||||
cacheSize: "Perbedaan dalam ukuran tembolok"
|
cacheSize: "Perbedaan dalam ukuran tembolok"
|
||||||
@ -1327,7 +1343,7 @@ _pages:
|
|||||||
if: "Jika"
|
if: "Jika"
|
||||||
_if:
|
_if:
|
||||||
variable: "Variabel"
|
variable: "Variabel"
|
||||||
post: "Buat note"
|
post: "Buat catatan"
|
||||||
_post:
|
_post:
|
||||||
text: "Isi"
|
text: "Isi"
|
||||||
attachCanvasImage: "Posting dengan kanvas sebagai gambar"
|
attachCanvasImage: "Posting dengan kanvas sebagai gambar"
|
||||||
@ -1352,10 +1368,10 @@ _pages:
|
|||||||
id: "ID Kanvas"
|
id: "ID Kanvas"
|
||||||
width: "Lebar"
|
width: "Lebar"
|
||||||
height: "Tinggi"
|
height: "Tinggi"
|
||||||
note: "Note yang ditanam"
|
note: "Catatan yang ditanam"
|
||||||
_note:
|
_note:
|
||||||
id: "ID Note"
|
id: "ID Catatan"
|
||||||
idDescription: "Kamu dapat menyetel ini dengan menempelkan tautan URL Note."
|
idDescription: "Kamu dapat menyetel ini dengan menempelkan tautan URL Catatan."
|
||||||
detailed: "Tampilan rincian"
|
detailed: "Tampilan rincian"
|
||||||
switch: "Beralih"
|
switch: "Beralih"
|
||||||
_switch:
|
_switch:
|
||||||
@ -1580,14 +1596,14 @@ _notification:
|
|||||||
youGotPoll: "{name} memilih di angket kamu"
|
youGotPoll: "{name} memilih di angket kamu"
|
||||||
youGotMessagingMessageFromUser: "{name} mengirimi kamu pesan"
|
youGotMessagingMessageFromUser: "{name} mengirimi kamu pesan"
|
||||||
youGotMessagingMessageFromGroup: "Sebuah pesan telah dikirim ke grup {name}"
|
youGotMessagingMessageFromGroup: "Sebuah pesan telah dikirim ke grup {name}"
|
||||||
youWereFollowed: "Sedang mengikuti"
|
youWereFollowed: "Mengikuti kamu"
|
||||||
youReceivedFollowRequest: "Kamu menerima permintaan mengikuti"
|
youReceivedFollowRequest: "Kamu menerima permintaan mengikuti"
|
||||||
yourFollowRequestAccepted: "Permintaan mengikuti kamu telah diterima"
|
yourFollowRequestAccepted: "Permintaan mengikuti kamu telah diterima"
|
||||||
youWereInvitedToGroup: "Telah diundang ke grup"
|
youWereInvitedToGroup: "Telah diundang ke grup"
|
||||||
_types:
|
_types:
|
||||||
all: "Semua"
|
all: "Semua"
|
||||||
follow: "Ikuti"
|
follow: "Ikuti"
|
||||||
mention: "Sebutan"
|
mention: "Sebut"
|
||||||
reply: "Balasan"
|
reply: "Balasan"
|
||||||
renote: "Renote"
|
renote: "Renote"
|
||||||
quote: "Kutip"
|
quote: "Kutip"
|
||||||
@ -1613,9 +1629,9 @@ _deck:
|
|||||||
_columns:
|
_columns:
|
||||||
main: "Utama"
|
main: "Utama"
|
||||||
widgets: "Widget"
|
widgets: "Widget"
|
||||||
notifications: "Notifikasi"
|
notifications: "Pemberitahuan"
|
||||||
tl: "Linimasa"
|
tl: "Linimasa"
|
||||||
antenna: "Antena"
|
antenna: "Antena"
|
||||||
list: "Daftar"
|
list: "Daftar"
|
||||||
mentions: "Sebutan"
|
mentions: "Sebutan"
|
||||||
direct: "Direct"
|
direct: "Langsung"
|
||||||
|
@ -127,6 +127,7 @@ editWidgets: "Modifica i widget"
|
|||||||
editWidgetsExit: "Modifica fine"
|
editWidgetsExit: "Modifica fine"
|
||||||
customEmojis: "Emoji personalizzati"
|
customEmojis: "Emoji personalizzati"
|
||||||
emoji: "Emoji"
|
emoji: "Emoji"
|
||||||
|
emojis: "Emoji"
|
||||||
emojiName: "Nome dell'emoji"
|
emojiName: "Nome dell'emoji"
|
||||||
emojiUrl: "URL dell'emoji"
|
emojiUrl: "URL dell'emoji"
|
||||||
addEmoji: "Aggiungi un emoji"
|
addEmoji: "Aggiungi un emoji"
|
||||||
@ -514,7 +515,6 @@ removeAllFollowing: "Cancella tutti i follows"
|
|||||||
removeAllFollowingDescription: "Cancella tutti i follows del server {host}. Per favore, esegui se, ad esempio, l'istanza non esiste più."
|
removeAllFollowingDescription: "Cancella tutti i follows del server {host}. Per favore, esegui se, ad esempio, l'istanza non esiste più."
|
||||||
userSuspended: "L'utente è sospes@."
|
userSuspended: "L'utente è sospes@."
|
||||||
userSilenced: "L'utente è silenziat@."
|
userSilenced: "L'utente è silenziat@."
|
||||||
sidebar: "Barra laterale"
|
|
||||||
divider: "Linea di separazione"
|
divider: "Linea di separazione"
|
||||||
addItem: "Aggiungi elemento"
|
addItem: "Aggiungi elemento"
|
||||||
rooms: "Camera"
|
rooms: "Camera"
|
||||||
@ -741,6 +741,14 @@ middle: "Media"
|
|||||||
low: "Bassa"
|
low: "Bassa"
|
||||||
emailNotConfiguredWarning: "Non hai impostato nessun indirizzo e-mail."
|
emailNotConfiguredWarning: "Non hai impostato nessun indirizzo e-mail."
|
||||||
ratio: "Rapporto"
|
ratio: "Rapporto"
|
||||||
|
global: "Federata"
|
||||||
|
sent: "Inviare"
|
||||||
|
hashtags: "Hashtag"
|
||||||
|
troubleshooting: "Risoluzione problemi"
|
||||||
|
_docs:
|
||||||
|
continueReading: "Leggi di più"
|
||||||
|
features: "Funzionalità"
|
||||||
|
admin: "Gestione"
|
||||||
_ad:
|
_ad:
|
||||||
back: "Indietro"
|
back: "Indietro"
|
||||||
reduceFrequencyOfThisAd: "Visualizza questa pubblicità meno spesso"
|
reduceFrequencyOfThisAd: "Visualizza questa pubblicità meno spesso"
|
||||||
@ -799,6 +807,7 @@ _mfm:
|
|||||||
blur: "Sfocatura"
|
blur: "Sfocatura"
|
||||||
font: "Tipo di carattere"
|
font: "Tipo di carattere"
|
||||||
fontDescription: "Puoi scegliere il tipo di carattere per il contenuto."
|
fontDescription: "Puoi scegliere il tipo di carattere per il contenuto."
|
||||||
|
rainbow: "Arcobaleno"
|
||||||
_reversi:
|
_reversi:
|
||||||
reversi: "Reversi"
|
reversi: "Reversi"
|
||||||
gameSettings: "Impostazioni di gioco"
|
gameSettings: "Impostazioni di gioco"
|
||||||
@ -825,9 +834,7 @@ _channel:
|
|||||||
following: "Seguiti"
|
following: "Seguiti"
|
||||||
usersCount: "{n} partecipanti"
|
usersCount: "{n} partecipanti"
|
||||||
notesCount: "{n} note"
|
notesCount: "{n} note"
|
||||||
_sidebar:
|
_menuDisplay:
|
||||||
full: "Intera"
|
|
||||||
icon: "Icone"
|
|
||||||
hide: "Nascondere"
|
hide: "Nascondere"
|
||||||
_wordMute:
|
_wordMute:
|
||||||
muteWords: "Parole da filtrare"
|
muteWords: "Parole da filtrare"
|
||||||
@ -1388,12 +1395,12 @@ _notification:
|
|||||||
youWereInvitedToGroup: "Invitat@ al gruppo"
|
youWereInvitedToGroup: "Invitat@ al gruppo"
|
||||||
_types:
|
_types:
|
||||||
all: "Tutto"
|
all: "Tutto"
|
||||||
follow: "Follows"
|
follow: "Nuovə follower"
|
||||||
mention: "Menzioni"
|
mention: "Menzioni"
|
||||||
reply: "Rispondi"
|
reply: "Risposte"
|
||||||
renote: "Rinota"
|
renote: "Rinota"
|
||||||
quote: "Cita"
|
quote: "Cita"
|
||||||
reaction: "Reazione"
|
reaction: "Reazioni"
|
||||||
pollVote: "Voti ricevuti"
|
pollVote: "Voti ricevuti"
|
||||||
receiveFollowRequest: "Richiesta di follow ricevuta"
|
receiveFollowRequest: "Richiesta di follow ricevuta"
|
||||||
followRequestAccepted: "Richiesta di follow accettata"
|
followRequestAccepted: "Richiesta di follow accettata"
|
||||||
|
@ -128,6 +128,7 @@ editWidgets: "ウィジェットを編集"
|
|||||||
editWidgetsExit: "編集を終了"
|
editWidgetsExit: "編集を終了"
|
||||||
customEmojis: "カスタム絵文字"
|
customEmojis: "カスタム絵文字"
|
||||||
emoji: "絵文字"
|
emoji: "絵文字"
|
||||||
|
emojis: "絵文字"
|
||||||
emojiName: "絵文字名"
|
emojiName: "絵文字名"
|
||||||
emojiUrl: "絵文字画像URL"
|
emojiUrl: "絵文字画像URL"
|
||||||
addEmoji: "絵文字を追加"
|
addEmoji: "絵文字を追加"
|
||||||
@ -528,7 +529,7 @@ removeAllFollowing: "フォローを全解除"
|
|||||||
removeAllFollowingDescription: "{host}からのフォローをすべて解除します。そのインスタンスがもう存在しなくなった場合などに実行してください。"
|
removeAllFollowingDescription: "{host}からのフォローをすべて解除します。そのインスタンスがもう存在しなくなった場合などに実行してください。"
|
||||||
userSuspended: "このユーザーは凍結されています。"
|
userSuspended: "このユーザーは凍結されています。"
|
||||||
userSilenced: "このユーザーはサイレンスされています。"
|
userSilenced: "このユーザーはサイレンスされています。"
|
||||||
sidebar: "サイドバー"
|
menu: "メニュー"
|
||||||
divider: "分割線"
|
divider: "分割線"
|
||||||
addItem: "項目を追加"
|
addItem: "項目を追加"
|
||||||
rooms: "ルーム"
|
rooms: "ルーム"
|
||||||
@ -761,6 +762,22 @@ middle: "中"
|
|||||||
low: "低"
|
low: "低"
|
||||||
emailNotConfiguredWarning: "メールアドレスの設定がされていません。"
|
emailNotConfiguredWarning: "メールアドレスの設定がされていません。"
|
||||||
ratio: "比率"
|
ratio: "比率"
|
||||||
|
customCss: "カスタムCSS"
|
||||||
|
customCssWarn: "この設定は必ず知識のある方が行ってください。不適切な設定を行うとクライアントが正常に使用できなくなる恐れがあります。"
|
||||||
|
global: "グローバル"
|
||||||
|
squareAvatars: "アイコンを四角形で表示"
|
||||||
|
sent: "送信"
|
||||||
|
received: "受信"
|
||||||
|
searchResult: "検索結果"
|
||||||
|
hashtags: "ハッシュタグ"
|
||||||
|
troubleshooting: "トラブルシューティング"
|
||||||
|
|
||||||
|
_docs:
|
||||||
|
continueReading: "続きを読む"
|
||||||
|
features: "機能"
|
||||||
|
generalTopics: "一般的なトピック"
|
||||||
|
advancedTopics: "高度なトピック"
|
||||||
|
admin: "管理"
|
||||||
|
|
||||||
_ad:
|
_ad:
|
||||||
back: "戻る"
|
back: "戻る"
|
||||||
@ -868,6 +885,8 @@ _mfm:
|
|||||||
blurDescription: "内容をぼかすことができます。ポインターを上に乗せるとはっきり見えるようになります。"
|
blurDescription: "内容をぼかすことができます。ポインターを上に乗せるとはっきり見えるようになります。"
|
||||||
font: "フォント"
|
font: "フォント"
|
||||||
fontDescription: "内容のフォントを指定することができます。"
|
fontDescription: "内容のフォントを指定することができます。"
|
||||||
|
rainbow: "レインボー"
|
||||||
|
rainbowDescription: "内容をレインボーにします。"
|
||||||
|
|
||||||
_reversi:
|
_reversi:
|
||||||
reversi: "リバーシ"
|
reversi: "リバーシ"
|
||||||
@ -924,9 +943,10 @@ _channel:
|
|||||||
usersCount: "{n}人が参加中"
|
usersCount: "{n}人が参加中"
|
||||||
notesCount: "{n}投稿があります"
|
notesCount: "{n}投稿があります"
|
||||||
|
|
||||||
_sidebar:
|
_menuDisplay:
|
||||||
full: "フル"
|
sideFull: "横"
|
||||||
icon: "アイコン"
|
sideIcon: "横(アイコン)"
|
||||||
|
top: "上部"
|
||||||
hide: "隠す"
|
hide: "隠す"
|
||||||
|
|
||||||
_wordMute:
|
_wordMute:
|
||||||
|
@ -127,6 +127,7 @@ editWidgets: "ウィジェットをいじる"
|
|||||||
editWidgetsExit: "編集終ったで"
|
editWidgetsExit: "編集終ったで"
|
||||||
customEmojis: "カスタム絵文字"
|
customEmojis: "カスタム絵文字"
|
||||||
emoji: "絵文字"
|
emoji: "絵文字"
|
||||||
|
emojis: "絵文字"
|
||||||
emojiName: "絵文字名"
|
emojiName: "絵文字名"
|
||||||
emojiUrl: "絵文字画像URL"
|
emojiUrl: "絵文字画像URL"
|
||||||
addEmoji: "絵文字を追加"
|
addEmoji: "絵文字を追加"
|
||||||
@ -511,7 +512,6 @@ removeAllFollowing: "フォローを全解除"
|
|||||||
removeAllFollowingDescription: "{host}からのフォローをすべて解除するで。そのインスタンスが消えて無くなった時とかには便利な機能やで。"
|
removeAllFollowingDescription: "{host}からのフォローをすべて解除するで。そのインスタンスが消えて無くなった時とかには便利な機能やで。"
|
||||||
userSuspended: "このユーザーは...凍結されとる。"
|
userSuspended: "このユーザーは...凍結されとる。"
|
||||||
userSilenced: "このユーザーは...サイレンスされとる。"
|
userSilenced: "このユーザーは...サイレンスされとる。"
|
||||||
sidebar: "サイドバー"
|
|
||||||
divider: "分割線"
|
divider: "分割線"
|
||||||
rooms: "ルーム"
|
rooms: "ルーム"
|
||||||
relays: "リレー"
|
relays: "リレー"
|
||||||
@ -647,6 +647,11 @@ memo: "メモ"
|
|||||||
high: "高い"
|
high: "高い"
|
||||||
middle: "中"
|
middle: "中"
|
||||||
low: "低い"
|
low: "低い"
|
||||||
|
global: "グローバル"
|
||||||
|
sent: "送信"
|
||||||
|
hashtags: "ハッシュタグ"
|
||||||
|
_docs:
|
||||||
|
admin: "管理"
|
||||||
_ad:
|
_ad:
|
||||||
back: "戻る"
|
back: "戻る"
|
||||||
_gallery:
|
_gallery:
|
||||||
@ -731,9 +736,7 @@ _channel:
|
|||||||
removeBanner: "バナーを削除"
|
removeBanner: "バナーを削除"
|
||||||
featured: "トレンド"
|
featured: "トレンド"
|
||||||
notesCount: "{n}こ投稿があるで"
|
notesCount: "{n}こ投稿があるで"
|
||||||
_sidebar:
|
_menuDisplay:
|
||||||
full: "フル"
|
|
||||||
icon: "アイコン"
|
|
||||||
hide: "隠す"
|
hide: "隠す"
|
||||||
_wordMute:
|
_wordMute:
|
||||||
soft: "ソフト"
|
soft: "ソフト"
|
||||||
|
1
locales/jbo-EN.yml
Normal file
1
locales/jbo-EN.yml
Normal file
@ -0,0 +1 @@
|
|||||||
|
---
|
@ -7,7 +7,9 @@ username: "Isem n umseqdac"
|
|||||||
password: "Awal uffir"
|
password: "Awal uffir"
|
||||||
ok: "IH"
|
ok: "IH"
|
||||||
settings: "Iɣewwaṛen"
|
settings: "Iɣewwaṛen"
|
||||||
|
otherSettings: "Iɣewwaren nniḍen"
|
||||||
profile: "Amaɣnu"
|
profile: "Amaɣnu"
|
||||||
|
signup: "Jerred"
|
||||||
save: "Sekles"
|
save: "Sekles"
|
||||||
delete: "Kkes"
|
delete: "Kkes"
|
||||||
addToList: "Rnu ɣer tebdart"
|
addToList: "Rnu ɣer tebdart"
|
||||||
@ -27,15 +29,31 @@ followers: "Imeḍfaṛen"
|
|||||||
followsYou: "Yeṭṭafaṛ-ik·em-id"
|
followsYou: "Yeṭṭafaṛ-ik·em-id"
|
||||||
createList: "Snulfu-d tabdart"
|
createList: "Snulfu-d tabdart"
|
||||||
enterListName: "Isem n tebdart"
|
enterListName: "Isem n tebdart"
|
||||||
|
privacy: "Tabaḍnit"
|
||||||
follow: "Ḍfeṛ"
|
follow: "Ḍfeṛ"
|
||||||
you: "Kečči·mmi"
|
you: "Kečči·mmi"
|
||||||
selectList: "Fren tabdart"
|
selectList: "Fren tabdart"
|
||||||
youHaveNoLists: "Ulac ɣur-k·m ula d yiwet n tabdart"
|
youHaveNoLists: "Ulac ɣur-k·m ula d yiwet n tabdart"
|
||||||
|
security: "Taɣellist"
|
||||||
remove: "Kkes"
|
remove: "Kkes"
|
||||||
userList: "Tibdarin"
|
userList: "Tibdarin"
|
||||||
|
securityKey: "Tasarutt n tɣellist"
|
||||||
|
securityKeyName: "Isem n tsarutt"
|
||||||
|
signinRequired: "Ttxil jerred"
|
||||||
|
signinWith: "Tuqqna s {x}"
|
||||||
|
tapSecurityKey: "Sekcem tasarutt-ik·im n tɣellist"
|
||||||
uiLanguage: "Tutlayt n wegrudem"
|
uiLanguage: "Tutlayt n wegrudem"
|
||||||
|
accountSettings: "Iɣewwaṛen n umiḍan"
|
||||||
|
plugins: "Izegrar"
|
||||||
|
email: "Imayl"
|
||||||
|
emailAddress: "Tansa imayl"
|
||||||
smtpUser: "Isem n umseqdac"
|
smtpUser: "Isem n umseqdac"
|
||||||
smtpPass: "Awal uffir"
|
smtpPass: "Awal uffir"
|
||||||
|
other: "Wiyyaḍ"
|
||||||
|
accountInfo: "Talɣut n umiḍan"
|
||||||
|
emailNotification: "Ilɣa imayl"
|
||||||
|
selectAccount: "Fren amiḍan"
|
||||||
|
accounts: "Imiḍan"
|
||||||
_email:
|
_email:
|
||||||
_follow:
|
_follow:
|
||||||
title: "Yeṭṭafaṛ-ik·em-id"
|
title: "Yeṭṭafaṛ-ik·em-id"
|
||||||
@ -48,6 +66,8 @@ _theme:
|
|||||||
mention: "Bder"
|
mention: "Bder"
|
||||||
_sfx:
|
_sfx:
|
||||||
notification: "Ilɣuyen"
|
notification: "Ilɣuyen"
|
||||||
|
_permissions:
|
||||||
|
"write:account": "Ẓreg talɣut n umiḍan-ik·im"
|
||||||
_widgets:
|
_widgets:
|
||||||
notifications: "Ilɣuyen"
|
notifications: "Ilɣuyen"
|
||||||
_cw:
|
_cw:
|
||||||
|
@ -128,6 +128,7 @@ editWidgets: "위젯 편집"
|
|||||||
editWidgetsExit: "편집 종료"
|
editWidgetsExit: "편집 종료"
|
||||||
customEmojis: "커스텀 이모지"
|
customEmojis: "커스텀 이모지"
|
||||||
emoji: "이모지"
|
emoji: "이모지"
|
||||||
|
emojis: "이모지"
|
||||||
emojiName: "이모지 이름"
|
emojiName: "이모지 이름"
|
||||||
emojiUrl: "이모지 URL"
|
emojiUrl: "이모지 URL"
|
||||||
addEmoji: "이모지 추가"
|
addEmoji: "이모지 추가"
|
||||||
@ -528,7 +529,7 @@ removeAllFollowing: "모든 팔로잉 해제"
|
|||||||
removeAllFollowingDescription: "{host}(으)로부터 모든 팔로잉을 해제합니다. 해당 인스턴스가 더 이상 존재하지 않게 된 경우 등에 실행해 주세요."
|
removeAllFollowingDescription: "{host}(으)로부터 모든 팔로잉을 해제합니다. 해당 인스턴스가 더 이상 존재하지 않게 된 경우 등에 실행해 주세요."
|
||||||
userSuspended: "이 계정은 정지된 상태입니다."
|
userSuspended: "이 계정은 정지된 상태입니다."
|
||||||
userSilenced: "이 계정은 사일런스된 상태입니다."
|
userSilenced: "이 계정은 사일런스된 상태입니다."
|
||||||
sidebar: "사이드바"
|
menu: "메뉴"
|
||||||
divider: "구분선"
|
divider: "구분선"
|
||||||
addItem: "항목 추가"
|
addItem: "항목 추가"
|
||||||
rooms: "방"
|
rooms: "방"
|
||||||
@ -761,6 +762,21 @@ middle: "보통"
|
|||||||
low: "낮음"
|
low: "낮음"
|
||||||
emailNotConfiguredWarning: "메일 주소가 설정되어 있지 않습니다."
|
emailNotConfiguredWarning: "메일 주소가 설정되어 있지 않습니다."
|
||||||
ratio: "비율"
|
ratio: "비율"
|
||||||
|
customCss: "CSS 사용자화"
|
||||||
|
customCssWarn: "이 설정은 기능을 알고 있는 경우에만 사용해야 합니다. 잘못된 값을 입력하면 클라이언트가 정상적으로 작동하지 않을 수 있습니다."
|
||||||
|
global: "글로벌"
|
||||||
|
squareAvatars: "프로필 아이콘을 사각형으로 표시"
|
||||||
|
sent: "전송"
|
||||||
|
received: "수신"
|
||||||
|
searchResult: "검색 결과"
|
||||||
|
hashtags: "해시태그"
|
||||||
|
troubleshooting: "트러블 슈팅"
|
||||||
|
_docs:
|
||||||
|
continueReading: "계속 읽기"
|
||||||
|
features: "기능"
|
||||||
|
generalTopics: "일반 주제"
|
||||||
|
advancedTopics: "심화 주제"
|
||||||
|
admin: "관리"
|
||||||
_ad:
|
_ad:
|
||||||
back: "뒤로"
|
back: "뒤로"
|
||||||
reduceFrequencyOfThisAd: "이 광고의 표시 빈도 낮추기"
|
reduceFrequencyOfThisAd: "이 광고의 표시 빈도 낮추기"
|
||||||
@ -859,6 +875,8 @@ _mfm:
|
|||||||
blurDescription: "내용이 흐리게 보입니다. 마우스를 위에 올려두면 내용이 보입니다."
|
blurDescription: "내용이 흐리게 보입니다. 마우스를 위에 올려두면 내용이 보입니다."
|
||||||
font: "폰트"
|
font: "폰트"
|
||||||
fontDescription: "내용의 글꼴을 지정할 수 있습니다."
|
fontDescription: "내용의 글꼴을 지정할 수 있습니다."
|
||||||
|
rainbow: "무지개"
|
||||||
|
rainbowDescription: "내용을 무지개로 표시합니다."
|
||||||
_reversi:
|
_reversi:
|
||||||
reversi: "리버시"
|
reversi: "리버시"
|
||||||
gameSettings: "대국 설정"
|
gameSettings: "대국 설정"
|
||||||
@ -910,9 +928,10 @@ _channel:
|
|||||||
following: "팔로잉"
|
following: "팔로잉"
|
||||||
usersCount: "{n}명 참여 중"
|
usersCount: "{n}명 참여 중"
|
||||||
notesCount: "{n}노트"
|
notesCount: "{n}노트"
|
||||||
_sidebar:
|
_menuDisplay:
|
||||||
full: "전체"
|
sideFull: "가로"
|
||||||
icon: "아이콘"
|
sideIcon: "가로(아이콘)"
|
||||||
|
top: "상단"
|
||||||
hide: "숨기기"
|
hide: "숨기기"
|
||||||
_wordMute:
|
_wordMute:
|
||||||
muteWords: "뮤트할 단어"
|
muteWords: "뮤트할 단어"
|
||||||
|
@ -128,6 +128,7 @@ editWidgets: "Edytuj widżet"
|
|||||||
editWidgetsExit: "Gotowe"
|
editWidgetsExit: "Gotowe"
|
||||||
customEmojis: "Niestandardowe emoji"
|
customEmojis: "Niestandardowe emoji"
|
||||||
emoji: "Emoji"
|
emoji: "Emoji"
|
||||||
|
emojis: "Emoji"
|
||||||
emojiName: "Nazwa emoji"
|
emojiName: "Nazwa emoji"
|
||||||
emojiUrl: "Adres URL emoji"
|
emojiUrl: "Adres URL emoji"
|
||||||
addEmoji: "Dodaj emoji"
|
addEmoji: "Dodaj emoji"
|
||||||
@ -513,7 +514,6 @@ deleteAllFilesConfirm: "Czy na pewno chcesz usunąć wszystkie pliki?"
|
|||||||
removeAllFollowingDescription: "Przestań obserwować wszystkie konta z {host}. Wykonaj to, jeżeli instancja już nie istnieje."
|
removeAllFollowingDescription: "Przestań obserwować wszystkie konta z {host}. Wykonaj to, jeżeli instancja już nie istnieje."
|
||||||
userSuspended: "To konto zostało zawieszone."
|
userSuspended: "To konto zostało zawieszone."
|
||||||
userSilenced: "Ten użytkownik został wyciszony."
|
userSilenced: "Ten użytkownik został wyciszony."
|
||||||
sidebar: "Pasek boczny"
|
|
||||||
divider: "Rozdzielacz"
|
divider: "Rozdzielacz"
|
||||||
addItem: "Dodaj element"
|
addItem: "Dodaj element"
|
||||||
rooms: "Pokój"
|
rooms: "Pokój"
|
||||||
@ -735,6 +735,11 @@ middle: "Średnie"
|
|||||||
low: "Niski"
|
low: "Niski"
|
||||||
emailNotConfiguredWarning: "Nie podano adresu e-mail"
|
emailNotConfiguredWarning: "Nie podano adresu e-mail"
|
||||||
ratio: "Stosunek"
|
ratio: "Stosunek"
|
||||||
|
global: "Globalna"
|
||||||
|
sent: "Wyślij"
|
||||||
|
hashtags: "Hashtag"
|
||||||
|
_docs:
|
||||||
|
admin: "Zarządzanie"
|
||||||
_ad:
|
_ad:
|
||||||
back: "Wróć"
|
back: "Wróć"
|
||||||
reduceFrequencyOfThisAd: "Pokazuj tę reklamę rzadziej"
|
reduceFrequencyOfThisAd: "Pokazuj tę reklamę rzadziej"
|
||||||
@ -858,9 +863,7 @@ _channel:
|
|||||||
following: "Śledzeni"
|
following: "Śledzeni"
|
||||||
usersCount: "{n} uczestnicy"
|
usersCount: "{n} uczestnicy"
|
||||||
notesCount: "{n} wpisy"
|
notesCount: "{n} wpisy"
|
||||||
_sidebar:
|
_menuDisplay:
|
||||||
full: "Pełne"
|
|
||||||
icon: "Awatar"
|
|
||||||
hide: "Ukryj"
|
hide: "Ukryj"
|
||||||
_wordMute:
|
_wordMute:
|
||||||
muteWords: "Słowo do wyciszenia"
|
muteWords: "Słowo do wyciszenia"
|
||||||
|
@ -6,25 +6,72 @@ notifications: "Notificações"
|
|||||||
username: "Nome de usuário"
|
username: "Nome de usuário"
|
||||||
password: "Senha"
|
password: "Senha"
|
||||||
ok: "OK"
|
ok: "OK"
|
||||||
|
gotIt: "Entendi"
|
||||||
cancel: "Cancelar"
|
cancel: "Cancelar"
|
||||||
enterUsername: "Digite o nome de usuário"
|
enterUsername: "Digite o nome de usuário"
|
||||||
renotedBy: "Repostado por {user}"
|
renotedBy: "Repostado por {user}"
|
||||||
|
noNotes: "Sem posts"
|
||||||
settings: "Configurações"
|
settings: "Configurações"
|
||||||
basicSettings: "Configurações básicas"
|
basicSettings: "Configurações básicas"
|
||||||
otherSettings: "Outras configurações"
|
otherSettings: "Outras configurações"
|
||||||
profile: "Perfil"
|
profile: "Perfil"
|
||||||
timeline: "Timeline"
|
timeline: "Timeline"
|
||||||
|
logout: "Sair"
|
||||||
|
users: "Usuários"
|
||||||
|
favorite: "Favoritar"
|
||||||
|
favorites: "Favoritar"
|
||||||
|
showMore: "Ver mais"
|
||||||
|
youGotNewFollower: "Você tem um novo seguidor"
|
||||||
|
followRequestAccepted: "Pedido de seguir aceito"
|
||||||
|
note: "Post"
|
||||||
|
notes: "Posts"
|
||||||
|
enterEmoji: "Inserir emoji"
|
||||||
|
renote: "Repostar"
|
||||||
|
renoted: "Repostado"
|
||||||
|
cantRenote: "Não pode repostar"
|
||||||
|
cantReRenote: "Não pode repostar este repost"
|
||||||
|
pinnedNote: "Post fixado"
|
||||||
|
sensitive: "Conteúdo sensível"
|
||||||
|
mute: "Silenciar"
|
||||||
|
unmute: "Dessilenciar"
|
||||||
|
settingGuide: "Guia de configuração"
|
||||||
|
instances: "Instância"
|
||||||
|
registeredAt: "Registrado em"
|
||||||
|
perHour: "por hora"
|
||||||
|
perDay: "por dia"
|
||||||
|
noUsers: "Sem usuários"
|
||||||
|
messageRead: "Lida"
|
||||||
|
lightThemes: "Tema claro"
|
||||||
|
darkThemes: "Tema escuro"
|
||||||
|
addFile: "Adicionar arquivo"
|
||||||
|
nsfw: "Conteúdo sensível"
|
||||||
|
monthX: "mês de {month}"
|
||||||
|
pinnedNotes: "Post fixado"
|
||||||
smtpUser: "Nome de usuário"
|
smtpUser: "Nome de usuário"
|
||||||
smtpPass: "Senha"
|
smtpPass: "Senha"
|
||||||
|
user: "Usuários"
|
||||||
|
_email:
|
||||||
|
_follow:
|
||||||
|
title: "Você tem um novo seguidor"
|
||||||
_mfm:
|
_mfm:
|
||||||
search: "Pesquisar"
|
search: "Pesquisar"
|
||||||
|
_theme:
|
||||||
|
keys:
|
||||||
|
renote: "Repostar"
|
||||||
_sfx:
|
_sfx:
|
||||||
|
note: "Posts"
|
||||||
notification: "Notificações"
|
notification: "Notificações"
|
||||||
_widgets:
|
_widgets:
|
||||||
notifications: "Notificações"
|
notifications: "Notificações"
|
||||||
timeline: "Timeline"
|
timeline: "Timeline"
|
||||||
_profile:
|
_profile:
|
||||||
username: "Nome de usuário"
|
username: "Nome de usuário"
|
||||||
|
_exportOrImport:
|
||||||
|
muteList: "Silenciar"
|
||||||
|
_notification:
|
||||||
|
youWereFollowed: "Você tem um novo seguidor"
|
||||||
|
_types:
|
||||||
|
renote: "Repostar"
|
||||||
_deck:
|
_deck:
|
||||||
_columns:
|
_columns:
|
||||||
notifications: "Notificações"
|
notifications: "Notificações"
|
||||||
|
@ -7,6 +7,7 @@ search: "Поиск"
|
|||||||
notifications: "Уведомления"
|
notifications: "Уведомления"
|
||||||
username: "Имя пользователя"
|
username: "Имя пользователя"
|
||||||
password: "Пароль"
|
password: "Пароль"
|
||||||
|
forgotPassword: "Пароль забыт"
|
||||||
fetchingAsApObject: "Приём с других сайтов"
|
fetchingAsApObject: "Приём с других сайтов"
|
||||||
ok: "Окей"
|
ok: "Окей"
|
||||||
gotIt: "Ясно!"
|
gotIt: "Ясно!"
|
||||||
@ -127,6 +128,7 @@ editWidgets: "Редактировать виджеты"
|
|||||||
editWidgetsExit: "Готово"
|
editWidgetsExit: "Готово"
|
||||||
customEmojis: "Эмодзи пользователя"
|
customEmojis: "Эмодзи пользователя"
|
||||||
emoji: "Эмодзи"
|
emoji: "Эмодзи"
|
||||||
|
emojis: "Эмодзи"
|
||||||
emojiName: "Название эмодзи"
|
emojiName: "Название эмодзи"
|
||||||
emojiUrl: "URL эмодзи"
|
emojiUrl: "URL эмодзи"
|
||||||
addEmoji: "Добавить эмодзи"
|
addEmoji: "Добавить эмодзи"
|
||||||
@ -278,6 +280,7 @@ emptyDrive: "Диск пуст"
|
|||||||
emptyFolder: "Папка пуста"
|
emptyFolder: "Папка пуста"
|
||||||
unableToDelete: "Удаление невозможно"
|
unableToDelete: "Удаление невозможно"
|
||||||
inputNewFileName: "Введите имя нового файла"
|
inputNewFileName: "Введите имя нового файла"
|
||||||
|
inputNewDescription: "Введите новую подпись"
|
||||||
inputNewFolderName: "Пожалуйста, введите новое имя папки!"
|
inputNewFolderName: "Пожалуйста, введите новое имя папки!"
|
||||||
circularReferenceFolder: "Вы пытаетесь переместить папку внутрь себя."
|
circularReferenceFolder: "Вы пытаетесь переместить папку внутрь себя."
|
||||||
hasChildFilesOrFolders: "Эта папка не пуста и не может быть удалена."
|
hasChildFilesOrFolders: "Эта папка не пуста и не может быть удалена."
|
||||||
@ -309,6 +312,8 @@ monthX: "{month} месяц"
|
|||||||
yearX: "{year} год"
|
yearX: "{year} год"
|
||||||
pages: "Страницы"
|
pages: "Страницы"
|
||||||
integration: "Интеграция"
|
integration: "Интеграция"
|
||||||
|
connectService: "Подключиться"
|
||||||
|
disconnectService: "Отключиться"
|
||||||
enableLocalTimeline: "Включить локальную ленту"
|
enableLocalTimeline: "Включить локальную ленту"
|
||||||
enableGlobalTimeline: "Включить глобальную ленту"
|
enableGlobalTimeline: "Включить глобальную ленту"
|
||||||
disablingTimelinesInfo: "У администраторов и модераторов есть доступ ко всем лентам, даже если они отключены."
|
disablingTimelinesInfo: "У администраторов и модераторов есть доступ ко всем лентам, даже если они отключены."
|
||||||
@ -322,6 +327,7 @@ driveCapacityPerRemoteAccount: "Объём диска на одного поль
|
|||||||
inMb: "В мегабайтах"
|
inMb: "В мегабайтах"
|
||||||
iconUrl: "Ссылка на аватар"
|
iconUrl: "Ссылка на аватар"
|
||||||
bannerUrl: "Ссылка на изображение в шапке"
|
bannerUrl: "Ссылка на изображение в шапке"
|
||||||
|
backgroundImageUrl: "Ссылка на фоновое изображение"
|
||||||
basicInfo: "Общая информация"
|
basicInfo: "Общая информация"
|
||||||
pinnedUsers: "Прикреплённый пользователь"
|
pinnedUsers: "Прикреплённый пользователь"
|
||||||
pinnedUsersDescription: "Перечислите по одному имени пользователя в строке. Пользователи, перечисленные здесь, будут привязаны к закладке \"Изучение\"."
|
pinnedUsersDescription: "Перечислите по одному имени пользователя в строке. Пользователи, перечисленные здесь, будут привязаны к закладке \"Изучение\"."
|
||||||
@ -523,7 +529,6 @@ removeAllFollowing: "Удалить всех подписчиков"
|
|||||||
removeAllFollowingDescription: "Отменить все подписки с домена {host}? Пожалуйста, применяйте это действие, если инстанс больше не существует."
|
removeAllFollowingDescription: "Отменить все подписки с домена {host}? Пожалуйста, применяйте это действие, если инстанс больше не существует."
|
||||||
userSuspended: "Эта учётная запись заморожена"
|
userSuspended: "Эта учётная запись заморожена"
|
||||||
userSilenced: "Этот пользователь был заглушен"
|
userSilenced: "Этот пользователь был заглушен"
|
||||||
sidebar: "Боковая панель"
|
|
||||||
divider: "Линия-разделитель"
|
divider: "Линия-разделитель"
|
||||||
addItem: "Добавить элемент"
|
addItem: "Добавить элемент"
|
||||||
rooms: "Комната"
|
rooms: "Комната"
|
||||||
@ -543,6 +548,8 @@ disablePlayer: "Выключить проигрыватель"
|
|||||||
expandTweet: "Развернуть твит"
|
expandTweet: "Развернуть твит"
|
||||||
themeEditor: "Редактор темы оформления"
|
themeEditor: "Редактор темы оформления"
|
||||||
description: "Описание"
|
description: "Описание"
|
||||||
|
describeFile: "Добавить подпись"
|
||||||
|
enterFileDescription: "Введите подпись"
|
||||||
author: "Автор"
|
author: "Автор"
|
||||||
leaveConfirm: "Вы не сохранили изменения. Хотите выйти и потерять их?"
|
leaveConfirm: "Вы не сохранили изменения. Хотите выйти и потерять их?"
|
||||||
manage: "Управление"
|
manage: "Управление"
|
||||||
@ -745,10 +752,31 @@ gallery: "Галерея"
|
|||||||
recentPosts: "Недавние публикации"
|
recentPosts: "Недавние публикации"
|
||||||
popularPosts: "Популярные публикации"
|
popularPosts: "Популярные публикации"
|
||||||
shareWithNote: "Поделиться заметкой"
|
shareWithNote: "Поделиться заметкой"
|
||||||
|
ads: "Реклама"
|
||||||
expiration: "Опрос длится"
|
expiration: "Опрос длится"
|
||||||
|
memo: "Памятка"
|
||||||
|
priority: "Приоритет"
|
||||||
|
high: "Высокий"
|
||||||
middle: "Средне"
|
middle: "Средне"
|
||||||
|
low: "Низкий"
|
||||||
|
emailNotConfiguredWarning: "Не указан адрес электронной почты"
|
||||||
|
ratio: "Соотношение"
|
||||||
|
global: "Всеобщая"
|
||||||
|
sent: "Отправить"
|
||||||
|
hashtags: "Хэштег"
|
||||||
|
_docs:
|
||||||
|
continueReading: "Читать подробнее"
|
||||||
|
features: "Возможности"
|
||||||
|
generalTopics: "Основные темы"
|
||||||
|
advancedTopics: "Дополнительные темы"
|
||||||
|
admin: "Управление"
|
||||||
_ad:
|
_ad:
|
||||||
back: "Выход"
|
back: "Выход"
|
||||||
|
reduceFrequencyOfThisAd: "Реже показывать эту рекламу"
|
||||||
|
_forgotPassword:
|
||||||
|
enterEmail: "Введите адрес электронной почты, который ввели при регистрации. На неё будет выслана ссылка для смены пароля."
|
||||||
|
ifNoEmail: "Если вы не ввели свой адрес электронной почты, свяжитесь с администратором ресурса, чтобы сменить пароль."
|
||||||
|
contactAdmin: "Здесь не используются адреса электронной почты, так что свяжитесь с администратором, чтобы поменять пароль."
|
||||||
_gallery:
|
_gallery:
|
||||||
my: "Личная"
|
my: "Личная"
|
||||||
liked: "Понравившееся"
|
liked: "Понравившееся"
|
||||||
@ -840,6 +868,8 @@ _mfm:
|
|||||||
blurDescription: "Размывает текст до нечитаемости, будто его поместили за матовое стекло. Наведение указателя мыши на размытый текст возвращает чёткость."
|
blurDescription: "Размывает текст до нечитаемости, будто его поместили за матовое стекло. Наведение указателя мыши на размытый текст возвращает чёткость."
|
||||||
font: "Шрифт"
|
font: "Шрифт"
|
||||||
fontDescription: "Так можно писать произвольным шрифтом."
|
fontDescription: "Так можно писать произвольным шрифтом."
|
||||||
|
rainbow: "Радуга"
|
||||||
|
rainbowDescription: "Заставлять содержимое отображаться в цветах радуги."
|
||||||
_reversi:
|
_reversi:
|
||||||
reversi: "Реверси"
|
reversi: "Реверси"
|
||||||
gameSettings: "Настройки игры"
|
gameSettings: "Настройки игры"
|
||||||
@ -891,9 +921,10 @@ _channel:
|
|||||||
following: "Подписки"
|
following: "Подписки"
|
||||||
usersCount: "Участников: {n}"
|
usersCount: "Участников: {n}"
|
||||||
notesCount: "Заметок: {n}"
|
notesCount: "Заметок: {n}"
|
||||||
_sidebar:
|
_menuDisplay:
|
||||||
full: "Полностью"
|
sideFull: "Сторона"
|
||||||
icon: "Только значки"
|
sideIcon: "Сторона (иконки)"
|
||||||
|
top: "Вверх"
|
||||||
hide: "Спрятать"
|
hide: "Спрятать"
|
||||||
_wordMute:
|
_wordMute:
|
||||||
muteWords: "Скрыть слово"
|
muteWords: "Скрыть слово"
|
||||||
|
@ -127,6 +127,7 @@ editWidgets: "Редагувати віджети"
|
|||||||
editWidgetsExit: "Готово"
|
editWidgetsExit: "Готово"
|
||||||
customEmojis: "Кастомні емоджі"
|
customEmojis: "Кастомні емоджі"
|
||||||
emoji: "Емоджі"
|
emoji: "Емоджі"
|
||||||
|
emojis: "Емоджі"
|
||||||
emojiName: "Назва емоджі"
|
emojiName: "Назва емоджі"
|
||||||
emojiUrl: "URL емодзі"
|
emojiUrl: "URL емодзі"
|
||||||
addEmoji: "Додати емодзі"
|
addEmoji: "Додати емодзі"
|
||||||
@ -517,7 +518,6 @@ removeAllFollowing: "Скасувати всі підписки"
|
|||||||
removeAllFollowingDescription: "Скасувати підписку на всі акаунти з {host}. Будь ласка, робіть це, якщо інстанс більше не існує."
|
removeAllFollowingDescription: "Скасувати підписку на всі акаунти з {host}. Будь ласка, робіть це, якщо інстанс більше не існує."
|
||||||
userSuspended: "Обліковий запис заблокований."
|
userSuspended: "Обліковий запис заблокований."
|
||||||
userSilenced: "Обліковий запис приглушений."
|
userSilenced: "Обліковий запис приглушений."
|
||||||
sidebar: "Бокова панель"
|
|
||||||
divider: "Розділювач"
|
divider: "Розділювач"
|
||||||
addItem: "Додати елемент"
|
addItem: "Додати елемент"
|
||||||
rooms: "Кімнати"
|
rooms: "Кімнати"
|
||||||
@ -689,6 +689,11 @@ user: "Користувачі"
|
|||||||
administration: "Управління"
|
administration: "Управління"
|
||||||
expiration: "Опитування закінчується"
|
expiration: "Опитування закінчується"
|
||||||
middle: "Середній"
|
middle: "Середній"
|
||||||
|
global: "Глобальна"
|
||||||
|
sent: "Відправити"
|
||||||
|
hashtags: "Хештеґ"
|
||||||
|
_docs:
|
||||||
|
admin: "Управління"
|
||||||
_ad:
|
_ad:
|
||||||
back: "Назад"
|
back: "Назад"
|
||||||
_gallery:
|
_gallery:
|
||||||
@ -816,9 +821,7 @@ _channel:
|
|||||||
following: "Підписки"
|
following: "Підписки"
|
||||||
usersCount: "{n} учасників"
|
usersCount: "{n} учасників"
|
||||||
notesCount: "{n} дописів"
|
notesCount: "{n} дописів"
|
||||||
_sidebar:
|
_menuDisplay:
|
||||||
full: "Повна"
|
|
||||||
icon: "Аватар"
|
|
||||||
hide: "Сховати"
|
hide: "Сховати"
|
||||||
_wordMute:
|
_wordMute:
|
||||||
muteWords: "Заглушені слова"
|
muteWords: "Заглушені слова"
|
||||||
|
@ -1,13 +1,13 @@
|
|||||||
---
|
---
|
||||||
_lang_: "中文(简体)"
|
_lang_: "中文(简体)"
|
||||||
headlineMisskey: "通过帖子连接在一起的网络"
|
headlineMisskey: "通过帖子连接在一起的网络"
|
||||||
introMisskey: "欢迎!Misskey是一个开源的、去中心化的“微博客”服务。\n通过编写「帖文」来和大家分享你的以及你周围的事情吧!📡\n通过「回应」功能,可以让你快速地对大家的帖文表达反馈👍\n来探索新的世界吧!🚀"
|
introMisskey: "欢迎!Misskey是一个开源的、去中心化的“微博客”服务。\n通过编写「帖子」来和大家分享你的以及你周围的事情吧!📡\n通过「回应」功能,可以让你快速地对大家的帖子表达反馈👍\n来探索新的世界吧!🚀"
|
||||||
monthAndDay: "{month}月 {day}日"
|
monthAndDay: "{month}月 {day}日"
|
||||||
search: "搜索"
|
search: "搜索"
|
||||||
notifications: "通知"
|
notifications: "通知"
|
||||||
username: "用户名"
|
username: "用户名"
|
||||||
password: "密码"
|
password: "密码"
|
||||||
forgotPassword: "忘记密码"
|
forgotPassword: "重置密码"
|
||||||
fetchingAsApObject: "联合查询中"
|
fetchingAsApObject: "联合查询中"
|
||||||
ok: "OK"
|
ok: "OK"
|
||||||
gotIt: "我明白了"
|
gotIt: "我明白了"
|
||||||
@ -63,33 +63,33 @@ import: "导入"
|
|||||||
export: "导出"
|
export: "导出"
|
||||||
files: "文件"
|
files: "文件"
|
||||||
download: "下载"
|
download: "下载"
|
||||||
driveFileDeleteConfirm: "要删除「{name}」文件吗?附加此文件的帖子也会消失。"
|
driveFileDeleteConfirm: "要删除「{name}」文件吗?附加此文件的帖子也会被删除。"
|
||||||
unfollowConfirm: "要取消对{name}的关注吗?"
|
unfollowConfirm: "要取消对{name}的关注吗?"
|
||||||
exportRequested: "导出请求已提交。可能需要花一些时间。导出的文件将保存到网盘中。"
|
exportRequested: "导出请求已提交,这可能需要花一些时间,导出的文件将保存到网盘中。"
|
||||||
importRequested: "导入请求已提交。这可能需要花一点时间。"
|
importRequested: "导入请求已提交,这可能需要花一点时间。"
|
||||||
lists: "列表"
|
lists: "列表"
|
||||||
noLists: "列表为空"
|
noLists: "列表为空"
|
||||||
note: "帖子"
|
note: "帖子"
|
||||||
notes: "帖子"
|
notes: "帖子"
|
||||||
following: "关注中"
|
following: "关注中"
|
||||||
followers: "关注者"
|
followers: "关注者"
|
||||||
followsYou: "关注了你"
|
followsYou: "正在关注你"
|
||||||
createList: "创建列表"
|
createList: "创建列表"
|
||||||
manageLists: "管理列表"
|
manageLists: "管理列表"
|
||||||
error: "错误"
|
error: "错误"
|
||||||
somethingHappened: "出现了问题"
|
somethingHappened: "出现了一些问题!"
|
||||||
retry: "重试"
|
retry: "重试"
|
||||||
pageLoadError: "页面加载失败。"
|
pageLoadError: "页面加载失败。"
|
||||||
pageLoadErrorDescription: "这通常是由于网络或浏览器缓存的原因。请清除缓存或等待片刻后重试。"
|
pageLoadErrorDescription: "这通常是由于网络或浏览器缓存的原因。请清除缓存或等待片刻后重试。"
|
||||||
enterListName: "输入列表名称"
|
enterListName: "输入列表名称"
|
||||||
privacy: "隐私"
|
privacy: "隐私"
|
||||||
makeFollowManuallyApprove: "关注者请求需要批准"
|
makeFollowManuallyApprove: "关注者的关注请求需要批准"
|
||||||
defaultNoteVisibility: "默认可见性"
|
defaultNoteVisibility: "默认可见性"
|
||||||
follow: "关注"
|
follow: "关注"
|
||||||
followRequest: "关注申请"
|
followRequest: "关注申请"
|
||||||
followRequests: "关注申请"
|
followRequests: "关注申请"
|
||||||
unfollow: "取消关注"
|
unfollow: "取消关注"
|
||||||
followRequestPending: "发送关注申请"
|
followRequestPending: "发送关注请求"
|
||||||
enterEmoji: "输入表情符号"
|
enterEmoji: "输入表情符号"
|
||||||
renote: "转发"
|
renote: "转发"
|
||||||
unrenote: "取消转发"
|
unrenote: "取消转发"
|
||||||
@ -106,7 +106,7 @@ add: "添加"
|
|||||||
reaction: "回应"
|
reaction: "回应"
|
||||||
reactionSettingDescription: "选择您想要置顶的回应。"
|
reactionSettingDescription: "选择您想要置顶的回应。"
|
||||||
reactionSettingDescription2: "拖动重新排序,单击删除,点击 + 添加。"
|
reactionSettingDescription2: "拖动重新排序,单击删除,点击 + 添加。"
|
||||||
rememberNoteVisibility: "记录公开范围"
|
rememberNoteVisibility: "保存上次设置的可见性"
|
||||||
attachCancel: "删除附件"
|
attachCancel: "删除附件"
|
||||||
markAsSensitive: "标记为敏感内容"
|
markAsSensitive: "标记为敏感内容"
|
||||||
unmarkAsSensitive: "取消标记为敏感内容"
|
unmarkAsSensitive: "取消标记为敏感内容"
|
||||||
@ -128,17 +128,18 @@ editWidgets: "编辑小工具"
|
|||||||
editWidgetsExit: "完成编辑"
|
editWidgetsExit: "完成编辑"
|
||||||
customEmojis: "自定义表情符号"
|
customEmojis: "自定义表情符号"
|
||||||
emoji: "表情符号"
|
emoji: "表情符号"
|
||||||
|
emojis: "表情符号"
|
||||||
emojiName: "表情符号名称"
|
emojiName: "表情符号名称"
|
||||||
emojiUrl: "表情符号地址"
|
emojiUrl: "表情符号地址"
|
||||||
addEmoji: "添加表情符号"
|
addEmoji: "添加表情符号"
|
||||||
settingGuide: "推荐配置"
|
settingGuide: "推荐配置"
|
||||||
cacheRemoteFiles: "远程文件缓存"
|
cacheRemoteFiles: "远程文件缓存"
|
||||||
cacheRemoteFilesDescription: "当禁用此设定时远程文件将直接从远程实例载入。禁用后会减小储存空间需求,但是会增加流量,因为缩略图不会被生成。"
|
cacheRemoteFilesDescription: "当禁用此设定时远程文件将直接从远程实例载入。禁用后会减小储存空间需求,但是会增加流量,因为缩略图不会被生成。"
|
||||||
flagAsBot: "这个账户是Bot"
|
flagAsBot: "这是一个机器人账号"
|
||||||
flagAsBotDescription: "如果此帐户由程序控制,请启用此项。启用后,此标志可以帮助其他开发人员防止机器人之间产生无限互动的行为,并让Misskey的内部系统将此帐户识别为机器人。"
|
flagAsBotDescription: "如果此帐户由程序控制,请启用此项。启用后,此标志可以帮助其他开发人员防止机器人之间产生无限互动的行为,并让Misskey的内部系统将此帐户识别为机器人。"
|
||||||
flagAsCat: "这个账户是Cat"
|
flagAsCat: "这个账户是一只猫"
|
||||||
flagAsCatDescription: "如果您想表明此帐户是一只猫,请打开此标志。"
|
flagAsCatDescription: "如果您想表明此帐户是一只猫,请打开此标志。\n开启后,会在您的头像上出现猫耳朵,并将你的帖子中的「na」替换为「nya」,日文同理。"
|
||||||
autoAcceptFollowed: "自动允许关注"
|
autoAcceptFollowed: "自动允许关注者的关注"
|
||||||
addAccount: "添加账户"
|
addAccount: "添加账户"
|
||||||
loginFailed: "登录失败"
|
loginFailed: "登录失败"
|
||||||
showOnRemote: "转到所在实例显示"
|
showOnRemote: "转到所在实例显示"
|
||||||
@ -172,7 +173,7 @@ software: "软件"
|
|||||||
version: "版本"
|
version: "版本"
|
||||||
metadata: "元数据"
|
metadata: "元数据"
|
||||||
withNFiles: "{n}个文件"
|
withNFiles: "{n}个文件"
|
||||||
monitor: "监视器"
|
monitor: "服务器状态"
|
||||||
jobQueue: "作业队列"
|
jobQueue: "作业队列"
|
||||||
cpuAndMemory: "CPU和内存"
|
cpuAndMemory: "CPU和内存"
|
||||||
network: "网络"
|
network: "网络"
|
||||||
@ -211,7 +212,7 @@ instanceFollowing: "关注实例"
|
|||||||
instanceFollowers: "关注实例"
|
instanceFollowers: "关注实例"
|
||||||
instanceUsers: "实例用户"
|
instanceUsers: "实例用户"
|
||||||
changePassword: "修改密码"
|
changePassword: "修改密码"
|
||||||
security: "安全性"
|
security: "安全"
|
||||||
retypedNotMatch: "两次输入不一致!"
|
retypedNotMatch: "两次输入不一致!"
|
||||||
currentPassword: "现在的密码"
|
currentPassword: "现在的密码"
|
||||||
newPassword: "新密码"
|
newPassword: "新密码"
|
||||||
@ -231,18 +232,18 @@ deleteAreYouSure: "要删掉「{x}」吗?"
|
|||||||
resetAreYouSure: "恢复默认设置?"
|
resetAreYouSure: "恢复默认设置?"
|
||||||
saved: "已保存"
|
saved: "已保存"
|
||||||
messaging: "聊天"
|
messaging: "聊天"
|
||||||
upload: "上传"
|
upload: "本地上传"
|
||||||
fromDrive: "从网盘中"
|
fromDrive: "从网盘中"
|
||||||
fromUrl: "从 URL"
|
fromUrl: "从 URL"
|
||||||
uploadFromUrl: "从网址上传"
|
uploadFromUrl: "从网址上传"
|
||||||
uploadFromUrlDescription: "要上传的文件的URL"
|
uploadFromUrlDescription: "输入文件的URL"
|
||||||
uploadFromUrlRequested: "请求上传"
|
uploadFromUrlRequested: "请求上传"
|
||||||
uploadFromUrlMayTakeTime: "上传可能需要一些时间完成。"
|
uploadFromUrlMayTakeTime: "上传可能需要一些时间完成。"
|
||||||
explore: "发现"
|
explore: "发现"
|
||||||
games: "Misskey游戏"
|
games: "Misskey游戏"
|
||||||
messageRead: "已读"
|
messageRead: "已读"
|
||||||
noMoreHistory: "没有更多的历史记录"
|
noMoreHistory: "没有更多的历史记录"
|
||||||
startMessaging: "开始聊天"
|
startMessaging: "添加聊天"
|
||||||
nUsersRead: "{n}人已读"
|
nUsersRead: "{n}人已读"
|
||||||
agreeTo: "{0}人同意"
|
agreeTo: "{0}人同意"
|
||||||
tos: "服务条款"
|
tos: "服务条款"
|
||||||
@ -260,8 +261,8 @@ themeForLightMode: "在浅色模式下使用的主题"
|
|||||||
themeForDarkMode: "在深色模式下使用的主题"
|
themeForDarkMode: "在深色模式下使用的主题"
|
||||||
light: "浅色"
|
light: "浅色"
|
||||||
dark: "深色"
|
dark: "深色"
|
||||||
lightThemes: "亮色主题"
|
lightThemes: "浅色主题"
|
||||||
darkThemes: "暗色主题"
|
darkThemes: "深色主题"
|
||||||
syncDeviceDarkMode: "将深色模式与设备设置同步"
|
syncDeviceDarkMode: "将深色模式与设备设置同步"
|
||||||
drive: "网盘"
|
drive: "网盘"
|
||||||
fileName: "文件名称"
|
fileName: "文件名称"
|
||||||
@ -275,24 +276,24 @@ createFolder: "创建文件夹"
|
|||||||
renameFolder: "重命名文件夹"
|
renameFolder: "重命名文件夹"
|
||||||
deleteFolder: "删除文件夹"
|
deleteFolder: "删除文件夹"
|
||||||
addFile: "添加文件"
|
addFile: "添加文件"
|
||||||
emptyDrive: "驱动器为空"
|
emptyDrive: "网盘中无文件"
|
||||||
emptyFolder: "空文件夹"
|
emptyFolder: "此文件夹中无文件"
|
||||||
unableToDelete: "无法删除"
|
unableToDelete: "无法删除"
|
||||||
inputNewFileName: "请输入新文件名"
|
inputNewFileName: "请输入新文件名"
|
||||||
inputNewDescription: "请输入新标题"
|
inputNewDescription: "请输入新标题"
|
||||||
inputNewFolderName: "请输入新文件名"
|
inputNewFolderName: "请输入新文件夹名"
|
||||||
circularReferenceFolder: "目标文件夹是您要移动的文件夹的子文件夹。"
|
circularReferenceFolder: "目标文件夹是您要移动的文件夹的子文件夹。"
|
||||||
hasChildFilesOrFolders: "此文件夹不为空,无法删除。"
|
hasChildFilesOrFolders: "此文件夹中有文件,无法删除。"
|
||||||
copyUrl: "复制链接"
|
copyUrl: "复制链接"
|
||||||
rename: "重命名"
|
rename: "重命名"
|
||||||
avatar: "头像"
|
avatar: "头像"
|
||||||
banner: "Banner"
|
banner: "横幅"
|
||||||
nsfw: "敏感内容"
|
nsfw: "敏感内容"
|
||||||
whenServerDisconnected: "与服务器连接中断时"
|
whenServerDisconnected: "与服务器连接中断时"
|
||||||
disconnectedFromServer: "已从服务器断开连接"
|
disconnectedFromServer: "已和服务器断开连接"
|
||||||
reload: "重新加载"
|
reload: "重新加载"
|
||||||
doNothing: "什么都不做"
|
doNothing: "关闭弹窗"
|
||||||
reloadConfirm: "确定要重新加载吗"
|
reloadConfirm: "确定要重新加载吗?"
|
||||||
watch: "关注"
|
watch: "关注"
|
||||||
unwatch: "取消关注"
|
unwatch: "取消关注"
|
||||||
accept: "允许"
|
accept: "允许"
|
||||||
@ -325,14 +326,14 @@ driveCapacityPerLocalAccount: "每个用户的网盘空间"
|
|||||||
driveCapacityPerRemoteAccount: "每个远程用户的网盘容量"
|
driveCapacityPerRemoteAccount: "每个远程用户的网盘容量"
|
||||||
inMb: "以兆字节(MegaByte)为单位"
|
inMb: "以兆字节(MegaByte)为单位"
|
||||||
iconUrl: "图标URL"
|
iconUrl: "图标URL"
|
||||||
bannerUrl: "Banner URL"
|
bannerUrl: "横幅URL"
|
||||||
backgroundImageUrl: "背景图URL"
|
backgroundImageUrl: "背景图URL"
|
||||||
basicInfo: "基本信息"
|
basicInfo: "基本信息"
|
||||||
pinnedUsers: "置顶用户"
|
pinnedUsers: "置顶用户"
|
||||||
pinnedUsersDescription: "在「发现」页面中使用换行标记想要置顶的用户。"
|
pinnedUsersDescription: "在「发现」页面中使用换行标记想要置顶的用户。"
|
||||||
pinnedPages: "固定页面"
|
pinnedPages: "固定页面"
|
||||||
pinnedPagesDescription: "输入您要固定到实例首页的页面路径,以换行符分隔。"
|
pinnedPagesDescription: "输入您要固定到实例首页的页面路径,以换行符分隔。"
|
||||||
pinnedClipId: "置顶的片段ID"
|
pinnedClipId: "置顶的书签ID"
|
||||||
pinnedNotes: "已置顶的帖子"
|
pinnedNotes: "已置顶的帖子"
|
||||||
hcaptcha: "hCaptcha"
|
hcaptcha: "hCaptcha"
|
||||||
enableHcaptcha: "启用 hCaptcha"
|
enableHcaptcha: "启用 hCaptcha"
|
||||||
@ -350,13 +351,13 @@ antennaSource: "接收来源"
|
|||||||
antennaKeywords: "包含关键字"
|
antennaKeywords: "包含关键字"
|
||||||
antennaExcludeKeywords: "排除关键字"
|
antennaExcludeKeywords: "排除关键字"
|
||||||
antennaKeywordsDescription: "使用空格分隔会产生AND规范,并且使用换行符分隔会产生OR规范"
|
antennaKeywordsDescription: "使用空格分隔会产生AND规范,并且使用换行符分隔会产生OR规范"
|
||||||
notifyAntenna: "通知新帖子"
|
notifyAntenna: "开启通知"
|
||||||
withFileAntenna: "仅带有附件的帖子"
|
withFileAntenna: "仅带有附件的帖子"
|
||||||
enableServiceworker: "启用ServiceWorker"
|
enableServiceworker: "启用ServiceWorker"
|
||||||
antennaUsersDescription: "指定用户名,用换行符分隔"
|
antennaUsersDescription: "指定用户名,用换行符分隔"
|
||||||
caseSensitive: "区分大小写"
|
caseSensitive: "区分大小写"
|
||||||
withReplies: "包括回复"
|
withReplies: "包括回复"
|
||||||
connectedTo: "您的账号已连到接以下社交账号"
|
connectedTo: "您的账号已连到接以下第三方账号"
|
||||||
notesAndReplies: "帖子与回复"
|
notesAndReplies: "帖子与回复"
|
||||||
withFiles: "附件"
|
withFiles: "附件"
|
||||||
silence: "禁言"
|
silence: "禁言"
|
||||||
@ -364,8 +365,8 @@ silenceConfirm: "确认要禁言吗?"
|
|||||||
unsilence: "解除禁言"
|
unsilence: "解除禁言"
|
||||||
unsilenceConfirm: "要解除禁言吗?"
|
unsilenceConfirm: "要解除禁言吗?"
|
||||||
popularUsers: "热门用户"
|
popularUsers: "热门用户"
|
||||||
recentlyUpdatedUsers: "最近投稿用户"
|
recentlyUpdatedUsers: "最近投稿的用户"
|
||||||
recentlyRegisteredUsers: "最近登录用户"
|
recentlyRegisteredUsers: "最近登录的用户"
|
||||||
recentlyDiscoveredUsers: "最近发现的用户"
|
recentlyDiscoveredUsers: "最近发现的用户"
|
||||||
exploreUsersCount: "有{count}个用户"
|
exploreUsersCount: "有{count}个用户"
|
||||||
exploreFediverse: "探索Fediverse"
|
exploreFediverse: "探索Fediverse"
|
||||||
@ -374,9 +375,9 @@ userList: "列表"
|
|||||||
about: "关于"
|
about: "关于"
|
||||||
aboutMisskey: "关于 Misskey"
|
aboutMisskey: "关于 Misskey"
|
||||||
administrator: "管理员"
|
administrator: "管理员"
|
||||||
token: "令牌"
|
token: "Token (令牌)"
|
||||||
twoStepAuthentication: "两步验证"
|
twoStepAuthentication: "两步验证"
|
||||||
moderator: "版主"
|
moderator: "监察员"
|
||||||
nUsersMentioned: "{n} 被提到"
|
nUsersMentioned: "{n} 被提到"
|
||||||
securityKey: "安全密钥"
|
securityKey: "安全密钥"
|
||||||
securityKeyName: "密钥名称"
|
securityKeyName: "密钥名称"
|
||||||
@ -418,7 +419,7 @@ noteOf: "{user}的帖子"
|
|||||||
inviteToGroup: "群组邀请"
|
inviteToGroup: "群组邀请"
|
||||||
maxNoteTextLength: "帖子的字数限制"
|
maxNoteTextLength: "帖子的字数限制"
|
||||||
quoteAttached: "已引用"
|
quoteAttached: "已引用"
|
||||||
quoteQuestion: "是否将其作为引用附上?"
|
quoteQuestion: "是否引用此链接内容?"
|
||||||
noMessagesYet: "现在没有新的聊天"
|
noMessagesYet: "现在没有新的聊天"
|
||||||
newMessageExists: "新信息"
|
newMessageExists: "新信息"
|
||||||
onlyOneFileCanBeAttached: "只能添加一个附件"
|
onlyOneFileCanBeAttached: "只能添加一个附件"
|
||||||
@ -442,9 +443,9 @@ tapSecurityKey: "轻触硬件安全密钥"
|
|||||||
or: "或者"
|
or: "或者"
|
||||||
language: "语言"
|
language: "语言"
|
||||||
uiLanguage: "显示语言"
|
uiLanguage: "显示语言"
|
||||||
groupInvited: "群组招待"
|
groupInvited: "您有新的群组邀请"
|
||||||
aboutX: "关于 {x}"
|
aboutX: "关于 {x}"
|
||||||
useOsNativeEmojis: "使用OS原生表情符号"
|
useOsNativeEmojis: "使用系统的原生表情符号"
|
||||||
youHaveNoGroups: "没有群组"
|
youHaveNoGroups: "没有群组"
|
||||||
joinOrCreateGroup: "请加入一个现有的群组,或者创建新群组。"
|
joinOrCreateGroup: "请加入一个现有的群组,或者创建新群组。"
|
||||||
noHistory: "没有历史记录"
|
noHistory: "没有历史记录"
|
||||||
@ -460,7 +461,7 @@ regenerate: "重新生成"
|
|||||||
fontSize: "字体大小"
|
fontSize: "字体大小"
|
||||||
noFollowRequests: "没有关注申请"
|
noFollowRequests: "没有关注申请"
|
||||||
openImageInNewTab: "在新标签页中打开图片"
|
openImageInNewTab: "在新标签页中打开图片"
|
||||||
dashboard: "Dashboard"
|
dashboard: "管理面板"
|
||||||
local: "本地"
|
local: "本地"
|
||||||
remote: "远程"
|
remote: "远程"
|
||||||
total: "总计"
|
total: "总计"
|
||||||
@ -492,12 +493,12 @@ objectStorageUseProxy: "使用代理"
|
|||||||
objectStorageUseProxyDesc: "如果您不使用代理进行API连接,请将其关闭。"
|
objectStorageUseProxyDesc: "如果您不使用代理进行API连接,请将其关闭。"
|
||||||
objectStorageSetPublicRead: "上传时设置为public-read"
|
objectStorageSetPublicRead: "上传时设置为public-read"
|
||||||
serverLogs: "服务器日志"
|
serverLogs: "服务器日志"
|
||||||
deleteAll: "删除全部"
|
deleteAll: "全部删除"
|
||||||
showFixedPostForm: "在时间线顶部显示帖子表单"
|
showFixedPostForm: "在时间线顶部显示发帖框"
|
||||||
newNoteRecived: "有新的帖子"
|
newNoteRecived: "有新的帖子"
|
||||||
sounds: "声音"
|
sounds: "提示音"
|
||||||
listen: "听"
|
listen: "试听"
|
||||||
none: "空"
|
none: "无"
|
||||||
showInPage: "在页面中显示"
|
showInPage: "在页面中显示"
|
||||||
popout: "弹窗"
|
popout: "弹窗"
|
||||||
volume: "音量"
|
volume: "音量"
|
||||||
@ -509,15 +510,15 @@ recentUsed: "最近使用"
|
|||||||
install: "安装"
|
install: "安装"
|
||||||
uninstall: "卸载"
|
uninstall: "卸载"
|
||||||
installedApps: "已授权的应用"
|
installedApps: "已授权的应用"
|
||||||
nothing: "没什么"
|
nothing: "没有"
|
||||||
installedDate: "授权日期"
|
installedDate: "授权日期"
|
||||||
lastUsedDate: "最近使用"
|
lastUsedDate: "最近使用"
|
||||||
state: "状态"
|
state: "状态"
|
||||||
sort: "排序"
|
sort: "排序"
|
||||||
ascendingOrder: "升序"
|
ascendingOrder: "升序"
|
||||||
descendingOrder: "降序"
|
descendingOrder: "降序"
|
||||||
scratchpad: "便签本"
|
scratchpad: "AiScript控制台"
|
||||||
scratchpadDescription: "便签本为AiScript提供了实验环境。您可以编写代码以与Misskey交互,运行它并查看结果。"
|
scratchpadDescription: "AiScript控制台为AiScript提供了实验环境。您可以编写代码以与Misskey交互,运行它并查看结果。"
|
||||||
output: "输出"
|
output: "输出"
|
||||||
script: "脚本"
|
script: "脚本"
|
||||||
disablePagesScript: "禁用页面脚本"
|
disablePagesScript: "禁用页面脚本"
|
||||||
@ -528,7 +529,7 @@ removeAllFollowing: "取消所有关注"
|
|||||||
removeAllFollowingDescription: "取消{host}的所有关注者。当实例不存在时执行。"
|
removeAllFollowingDescription: "取消{host}的所有关注者。当实例不存在时执行。"
|
||||||
userSuspended: "该用户已被冻结。"
|
userSuspended: "该用户已被冻结。"
|
||||||
userSilenced: "该用户已被禁言。"
|
userSilenced: "该用户已被禁言。"
|
||||||
sidebar: "侧边栏"
|
menu: "菜单"
|
||||||
divider: "分割线"
|
divider: "分割线"
|
||||||
addItem: "添加项目"
|
addItem: "添加项目"
|
||||||
rooms: "房间"
|
rooms: "房间"
|
||||||
@ -545,7 +546,7 @@ poll: "调查问卷"
|
|||||||
useCw: "隐藏内容"
|
useCw: "隐藏内容"
|
||||||
enablePlayer: "打开播放器"
|
enablePlayer: "打开播放器"
|
||||||
disablePlayer: "关闭播放器"
|
disablePlayer: "关闭播放器"
|
||||||
expandTweet: "展开贴文"
|
expandTweet: "展开帖子"
|
||||||
themeEditor: "主题编辑器"
|
themeEditor: "主题编辑器"
|
||||||
description: "描述"
|
description: "描述"
|
||||||
describeFile: "添加标题"
|
describeFile: "添加标题"
|
||||||
@ -591,10 +592,10 @@ userSaysSomething: "{name}说了什么"
|
|||||||
makeActive: "启用"
|
makeActive: "启用"
|
||||||
display: "显示"
|
display: "显示"
|
||||||
copy: "复制"
|
copy: "复制"
|
||||||
metrics: "指标"
|
metrics: "服务器监控"
|
||||||
overview: "概述"
|
overview: "服务器概况"
|
||||||
logs: "日志"
|
logs: "日志"
|
||||||
delayed: "延迟"
|
delayed: "滞后"
|
||||||
database: "数据库"
|
database: "数据库"
|
||||||
channel: "频道"
|
channel: "频道"
|
||||||
create: "创建"
|
create: "创建"
|
||||||
@ -627,17 +628,17 @@ random: "随机"
|
|||||||
system: "系统"
|
system: "系统"
|
||||||
switchUi: "切换界面"
|
switchUi: "切换界面"
|
||||||
desktop: "桌面"
|
desktop: "桌面"
|
||||||
clip: "片段"
|
clip: "书签"
|
||||||
createNew: "新建"
|
createNew: "新建"
|
||||||
optional: "可选"
|
optional: "可选"
|
||||||
createNewClip: "新建片段"
|
createNewClip: "新建书签"
|
||||||
public: "公开"
|
public: "公开"
|
||||||
i18nInfo: "Misskey已经被志愿者们翻译到了各种语言。如果你也有兴趣,可以通过{link}帮助翻译。"
|
i18nInfo: "Misskey已经被志愿者们翻译到了各种语言。如果你也有兴趣,可以通过{link}帮助翻译。"
|
||||||
manageAccessTokens: "管理 Access Tokens"
|
manageAccessTokens: "管理 Access Tokens"
|
||||||
accountInfo: "帐户信息"
|
accountInfo: "帐户信息"
|
||||||
notesCount: "贴文数量"
|
notesCount: "帖子数量"
|
||||||
repliesCount: "回复数量"
|
repliesCount: "回复数量"
|
||||||
renotesCount: "转贴数量"
|
renotesCount: "转帖数量"
|
||||||
repliedCount: "回复数"
|
repliedCount: "回复数"
|
||||||
renotedCount: "转发数"
|
renotedCount: "转发数"
|
||||||
followingCount: "正在关注数量"
|
followingCount: "正在关注数量"
|
||||||
@ -648,9 +649,9 @@ pollVotesCount: "问卷调查的投票数"
|
|||||||
pollVotedCount: "问卷调查的被投票数"
|
pollVotedCount: "问卷调查的被投票数"
|
||||||
yes: "是"
|
yes: "是"
|
||||||
no: "否"
|
no: "否"
|
||||||
driveFilesCount: "磁盘文件数"
|
driveFilesCount: "网盘的文件数"
|
||||||
driveUsage: "磁盘空间用量"
|
driveUsage: "网盘的空间用量"
|
||||||
noCrawle: "拒绝搜索器的索引"
|
noCrawle: "拒绝搜索引擎的索引"
|
||||||
noCrawleDescription: "要求搜索引擎不要收录(索引)您的用户页面,帖子,页面等。"
|
noCrawleDescription: "要求搜索引擎不要收录(索引)您的用户页面,帖子,页面等。"
|
||||||
lockedAccountInfo: "即使通过了关注请求,只要您不将帖子可见范围设置成“关注者”,任何人都可以看到您的帖子。"
|
lockedAccountInfo: "即使通过了关注请求,只要您不将帖子可见范围设置成“关注者”,任何人都可以看到您的帖子。"
|
||||||
alwaysMarkSensitive: "默认将媒体文件标记为敏感内容"
|
alwaysMarkSensitive: "默认将媒体文件标记为敏感内容"
|
||||||
@ -665,7 +666,7 @@ pageLikedCount: "页面被点赞次数"
|
|||||||
reversiCount: "黑白棋对战次数"
|
reversiCount: "黑白棋对战次数"
|
||||||
contact: "联系人"
|
contact: "联系人"
|
||||||
useSystemFont: "使用系统默认字体"
|
useSystemFont: "使用系统默认字体"
|
||||||
clips: "片段"
|
clips: "书签"
|
||||||
experimentalFeatures: "实验性功能"
|
experimentalFeatures: "实验性功能"
|
||||||
developer: "开发者"
|
developer: "开发者"
|
||||||
makeExplorable: "使账号可见。"
|
makeExplorable: "使账号可见。"
|
||||||
@ -697,7 +698,7 @@ saveConfirm: "确定保存?"
|
|||||||
deleteConfirm: "确定删除?"
|
deleteConfirm: "确定删除?"
|
||||||
invalidValue: "无效值。"
|
invalidValue: "无效值。"
|
||||||
registry: "注册表"
|
registry: "注册表"
|
||||||
closeAccount: "关闭账户"
|
closeAccount: "永久注销账户"
|
||||||
currentVersion: "当前版本"
|
currentVersion: "当前版本"
|
||||||
latestVersion: "最新版本"
|
latestVersion: "最新版本"
|
||||||
youAreRunningUpToDateClient: "您所使用的客户端已经是最新的。"
|
youAreRunningUpToDateClient: "您所使用的客户端已经是最新的。"
|
||||||
@ -761,13 +762,28 @@ middle: "中"
|
|||||||
low: "低"
|
low: "低"
|
||||||
emailNotConfiguredWarning: "电子邮件地址未设置。"
|
emailNotConfiguredWarning: "电子邮件地址未设置。"
|
||||||
ratio: "比率"
|
ratio: "比率"
|
||||||
|
customCss: "自定义 CSS"
|
||||||
|
customCssWarn: "这些设置必须有相关的基础知识,不当的配置可能导致客户端无法正常使用!"
|
||||||
|
global: "全局"
|
||||||
|
squareAvatars: "显示方形头像图标"
|
||||||
|
sent: "发送"
|
||||||
|
received: "收取"
|
||||||
|
searchResult: "搜索结果"
|
||||||
|
hashtags: "话题标签"
|
||||||
|
troubleshooting: "故障排除"
|
||||||
|
_docs:
|
||||||
|
continueReading: "继续阅读"
|
||||||
|
features: "特性"
|
||||||
|
generalTopics: "通常提示"
|
||||||
|
advancedTopics: "进阶提示"
|
||||||
|
admin: "管理"
|
||||||
_ad:
|
_ad:
|
||||||
back: "返回"
|
back: "返回"
|
||||||
reduceFrequencyOfThisAd: "减少此广告的频率"
|
reduceFrequencyOfThisAd: "减少此广告的频率"
|
||||||
_forgotPassword:
|
_forgotPassword:
|
||||||
enterEmail: "请输入您用来注册帐户的电子邮件地址。密码重置链接将发送到该地址。"
|
enterEmail: "请输入您验证账号时用的电子邮箱地址,密码重置链接将发送至该邮箱上。"
|
||||||
ifNoEmail: "如果您没有使用电子邮件地址注册,请联系管理员。"
|
ifNoEmail: "如果您没有使用电子邮件地址进行验证,请联系管理员。"
|
||||||
contactAdmin: "该实例不支持电子邮件。如果您想重设密码,请联系管理员。"
|
contactAdmin: "该实例不支持发送电子邮件。如果您想重设密码,请联系管理员。"
|
||||||
_gallery:
|
_gallery:
|
||||||
my: "我的图库"
|
my: "我的图库"
|
||||||
liked: "喜欢的图片"
|
liked: "喜欢的图片"
|
||||||
@ -777,7 +793,7 @@ _email:
|
|||||||
_follow:
|
_follow:
|
||||||
title: "你有新的关注者"
|
title: "你有新的关注者"
|
||||||
_receiveFollowRequest:
|
_receiveFollowRequest:
|
||||||
title: "收到关注请求"
|
title: "收到了关注请求"
|
||||||
_plugin:
|
_plugin:
|
||||||
install: "安装插件"
|
install: "安装插件"
|
||||||
installWarn: "请不要安装不可信的插件。"
|
installWarn: "请不要安装不可信的插件。"
|
||||||
@ -859,6 +875,8 @@ _mfm:
|
|||||||
blurDescription: "产生模糊效果。将鼠标指针放在上面即可将内容显示出来。"
|
blurDescription: "产生模糊效果。将鼠标指针放在上面即可将内容显示出来。"
|
||||||
font: "字体"
|
font: "字体"
|
||||||
fontDescription: "可以设置内容所使用的字体。"
|
fontDescription: "可以设置内容所使用的字体。"
|
||||||
|
rainbow: "彩虹"
|
||||||
|
rainbowDescription: "用彩虹色来显示内容。"
|
||||||
_reversi:
|
_reversi:
|
||||||
reversi: "黑白棋"
|
reversi: "黑白棋"
|
||||||
gameSettings: "对局设置"
|
gameSettings: "对局设置"
|
||||||
@ -910,19 +928,20 @@ _channel:
|
|||||||
following: "正在关注"
|
following: "正在关注"
|
||||||
usersCount: "有{n}人参与"
|
usersCount: "有{n}人参与"
|
||||||
notesCount: "有{n}个帖子"
|
notesCount: "有{n}个帖子"
|
||||||
_sidebar:
|
_menuDisplay:
|
||||||
full: "全部"
|
sideFull: "横向"
|
||||||
icon: "图标"
|
sideIcon: "横向(图标)"
|
||||||
|
top: "顶部"
|
||||||
hide: "隐藏"
|
hide: "隐藏"
|
||||||
_wordMute:
|
_wordMute:
|
||||||
muteWords: "禁用词"
|
muteWords: "禁用词"
|
||||||
muteWordsDescription: "使用空格分隔表示AND逻辑,使用换行符分隔表示OR逻辑。"
|
muteWordsDescription: "使用空格分隔表示AND逻辑,使用换行符分隔表示OR逻辑。"
|
||||||
muteWordsDescription2: "将关键字用斜线括起来表示正则表达式。"
|
muteWordsDescription2: "将关键字用斜线括起来表示正则表达式。"
|
||||||
softDescription: "隐藏时间线中指定条件的帖文。"
|
softDescription: "隐藏时间线中指定条件的帖子。"
|
||||||
hardDescription: "防止将具有指定条件的帖文添加到时间线。 即使您更改条件,未添加的帖文也会被排除在外。"
|
hardDescription: "防止将具有指定条件的帖子添加到时间线。 即使您更改条件,未添加的帖文也会被排除在外。"
|
||||||
soft: "软屏蔽"
|
soft: "软屏蔽"
|
||||||
hard: "硬屏蔽"
|
hard: "硬屏蔽"
|
||||||
mutedNotes: "被屏蔽的帖文"
|
mutedNotes: "被屏蔽的帖子"
|
||||||
_theme:
|
_theme:
|
||||||
explore: "寻找主题"
|
explore: "寻找主题"
|
||||||
install: "安装主题"
|
install: "安装主题"
|
||||||
@ -948,8 +967,8 @@ _theme:
|
|||||||
argument: "参数"
|
argument: "参数"
|
||||||
basedProp: "基于的属性名称"
|
basedProp: "基于的属性名称"
|
||||||
alpha: "不透明度"
|
alpha: "不透明度"
|
||||||
darken: "暗色"
|
darken: "深色"
|
||||||
lighten: "亮色"
|
lighten: "浅色"
|
||||||
inputConstantName: "请输入常量名称"
|
inputConstantName: "请输入常量名称"
|
||||||
importInfo: "您可以在此处粘贴主题代码,将其导入到编辑器中"
|
importInfo: "您可以在此处粘贴主题代码,将其导入到编辑器中"
|
||||||
deleteConstantConfirm: "确定要删除常量{const}吗?"
|
deleteConstantConfirm: "确定要删除常量{const}吗?"
|
||||||
@ -984,18 +1003,18 @@ _theme:
|
|||||||
cwBg: "CW 按钮背景"
|
cwBg: "CW 按钮背景"
|
||||||
cwFg: "CW 按钮文本"
|
cwFg: "CW 按钮文本"
|
||||||
cwHoverBg: "CW 按钮背景(悬停)"
|
cwHoverBg: "CW 按钮背景(悬停)"
|
||||||
toastBg: "吐司通知背景"
|
toastBg: "Toast通知背景"
|
||||||
toastFg: "吐司通知文本"
|
toastFg: "Toast通知文本"
|
||||||
buttonBg: "按钮背景"
|
buttonBg: "按钮背景"
|
||||||
buttonHoverBg: "按钮背景(悬停)"
|
buttonHoverBg: "按钮背景(悬停)"
|
||||||
inputBorder: "输入框边框"
|
inputBorder: "输入框边框"
|
||||||
listItemHoverBg: "下拉列表项目背景(悬停)"
|
listItemHoverBg: "下拉列表项目背景(悬停)"
|
||||||
driveFolderBg: "驱动器文件夹背景"
|
driveFolderBg: "网盘的文件夹背景"
|
||||||
wallpaperOverlay: "壁纸叠加层"
|
wallpaperOverlay: "壁纸叠加层"
|
||||||
badge: "徽章"
|
badge: "徽章"
|
||||||
messageBg: "聊天背景"
|
messageBg: "聊天背景"
|
||||||
accentDarken: "强调色(暗)"
|
accentDarken: "强调色(深)"
|
||||||
accentLighten: "强调色(亮)"
|
accentLighten: "强调色(浅)"
|
||||||
fgHighlighted: "高亮显示文本"
|
fgHighlighted: "高亮显示文本"
|
||||||
_sfx:
|
_sfx:
|
||||||
note: "帖子"
|
note: "帖子"
|
||||||
@ -1094,9 +1113,9 @@ _auth:
|
|||||||
_antennaSources:
|
_antennaSources:
|
||||||
all: "所有帖子"
|
all: "所有帖子"
|
||||||
homeTimeline: "已关注用户的帖子"
|
homeTimeline: "已关注用户的帖子"
|
||||||
users: "来自特定用户的帖子"
|
users: "来自指定用户的帖子"
|
||||||
userList: "来自特定清单中的帖子"
|
userList: "来自指定列表中的帖子"
|
||||||
userGroup: "来自特定组中用户的帖子"
|
userGroup: "来自指定群组中用户的帖子"
|
||||||
_weekday:
|
_weekday:
|
||||||
sunday: "星期日"
|
sunday: "星期日"
|
||||||
monday: "星期一"
|
monday: "星期一"
|
||||||
@ -1122,7 +1141,7 @@ _widgets:
|
|||||||
button: "按钮"
|
button: "按钮"
|
||||||
onlineUsers: "在线用户"
|
onlineUsers: "在线用户"
|
||||||
jobQueue: "作业队列"
|
jobQueue: "作业队列"
|
||||||
serverMetric: "服务器指标"
|
serverMetric: "服务器监控"
|
||||||
aiscript: "AiScript控制台"
|
aiscript: "AiScript控制台"
|
||||||
_cw:
|
_cw:
|
||||||
hide: "隐藏"
|
hide: "隐藏"
|
||||||
@ -1135,7 +1154,7 @@ _poll:
|
|||||||
noMore: "无法再添加更多了"
|
noMore: "无法再添加更多了"
|
||||||
canMultipleVote: "允许多个投票"
|
canMultipleVote: "允许多个投票"
|
||||||
expiration: "截止时间"
|
expiration: "截止时间"
|
||||||
infinite: "无限期"
|
infinite: "不限时间"
|
||||||
at: "指定日期"
|
at: "指定日期"
|
||||||
after: "指定时间"
|
after: "指定时间"
|
||||||
deadlineDate: "截止日期"
|
deadlineDate: "截止日期"
|
||||||
@ -1174,7 +1193,7 @@ _postForm:
|
|||||||
e: "请写下来吧"
|
e: "请写下来吧"
|
||||||
f: "等待您的发布..."
|
f: "等待您的发布..."
|
||||||
_profile:
|
_profile:
|
||||||
name: "名称"
|
name: "昵称"
|
||||||
username: "用户名"
|
username: "用户名"
|
||||||
description: "个人简介"
|
description: "个人简介"
|
||||||
youCanIncludeHashtags: "您可以包含一个哈希标签。"
|
youCanIncludeHashtags: "您可以包含一个哈希标签。"
|
||||||
@ -1287,7 +1306,7 @@ _rooms:
|
|||||||
_pages:
|
_pages:
|
||||||
newPage: "创建页面"
|
newPage: "创建页面"
|
||||||
editPage: "编辑页面"
|
editPage: "编辑页面"
|
||||||
readPage: "查看源"
|
readPage: "查看页面"
|
||||||
created: "页面已创建"
|
created: "页面已创建"
|
||||||
updated: "页面已更新"
|
updated: "页面已更新"
|
||||||
deleted: "该页面已被删除"
|
deleted: "该页面已被删除"
|
||||||
@ -1600,7 +1619,7 @@ _notification:
|
|||||||
reaction: "回应"
|
reaction: "回应"
|
||||||
pollVote: "问卷调查被投票"
|
pollVote: "问卷调查被投票"
|
||||||
receiveFollowRequest: "收到关注请求"
|
receiveFollowRequest: "收到关注请求"
|
||||||
followRequestAccepted: "关注请求已接受"
|
followRequestAccepted: "关注请求已通过"
|
||||||
groupInvited: "加入群组邀请"
|
groupInvited: "加入群组邀请"
|
||||||
app: "关联应用的通知"
|
app: "关联应用的通知"
|
||||||
_deck:
|
_deck:
|
||||||
|
@ -14,7 +14,7 @@ gotIt: "知道了"
|
|||||||
cancel: "取消"
|
cancel: "取消"
|
||||||
enterUsername: "輸入使用者名稱"
|
enterUsername: "輸入使用者名稱"
|
||||||
renotedBy: "{user} 轉傳了"
|
renotedBy: "{user} 轉傳了"
|
||||||
noNotes: "貼文不可用。"
|
noNotes: "無貼文。"
|
||||||
noNotifications: "沒有通知"
|
noNotifications: "沒有通知"
|
||||||
instance: "實例"
|
instance: "實例"
|
||||||
settings: "設定"
|
settings: "設定"
|
||||||
@ -47,8 +47,8 @@ deleteAndEdit: "刪除並編輯"
|
|||||||
deleteAndEditConfirm: "要刪除並再次編輯嗎?此貼文的所有情感、轉發和回覆也將會消失。"
|
deleteAndEditConfirm: "要刪除並再次編輯嗎?此貼文的所有情感、轉發和回覆也將會消失。"
|
||||||
addToList: "加入至清單"
|
addToList: "加入至清單"
|
||||||
sendMessage: "發送訊息"
|
sendMessage: "發送訊息"
|
||||||
copyUsername: "複製用戶名"
|
copyUsername: "複製使用者名稱"
|
||||||
searchUser: "搜尋用戶"
|
searchUser: "搜尋使用者"
|
||||||
reply: "回覆"
|
reply: "回覆"
|
||||||
loadMore: "載入更多"
|
loadMore: "載入更多"
|
||||||
showMore: "載入更多"
|
showMore: "載入更多"
|
||||||
@ -128,6 +128,7 @@ editWidgets: "編輯小工具"
|
|||||||
editWidgetsExit: "完成"
|
editWidgetsExit: "完成"
|
||||||
customEmojis: "自訂表情符號"
|
customEmojis: "自訂表情符號"
|
||||||
emoji: "表情符號"
|
emoji: "表情符號"
|
||||||
|
emojis: "表情符號"
|
||||||
emojiName: "表情符號名稱"
|
emojiName: "表情符號名稱"
|
||||||
emojiUrl: "表情符號URL"
|
emojiUrl: "表情符號URL"
|
||||||
addEmoji: "加入表情符號"
|
addEmoji: "加入表情符號"
|
||||||
@ -279,6 +280,7 @@ emptyDrive: "雲端硬碟為空"
|
|||||||
emptyFolder: "資料夾為空"
|
emptyFolder: "資料夾為空"
|
||||||
unableToDelete: "無法刪除"
|
unableToDelete: "無法刪除"
|
||||||
inputNewFileName: "輸入檔案名稱"
|
inputNewFileName: "輸入檔案名稱"
|
||||||
|
inputNewDescription: "請輸入新標題 "
|
||||||
inputNewFolderName: "輸入新資料夾的名稱"
|
inputNewFolderName: "輸入新資料夾的名稱"
|
||||||
circularReferenceFolder: "目標文件夾是您要移動的文件夾的子文件夾。"
|
circularReferenceFolder: "目標文件夾是您要移動的文件夾的子文件夾。"
|
||||||
hasChildFilesOrFolders: "此文件夾不是空的,無法刪除。"
|
hasChildFilesOrFolders: "此文件夾不是空的,無法刪除。"
|
||||||
@ -310,6 +312,8 @@ monthX: "{month}月"
|
|||||||
yearX: "{year}年"
|
yearX: "{year}年"
|
||||||
pages: "頁面"
|
pages: "頁面"
|
||||||
integration: "整合"
|
integration: "整合"
|
||||||
|
connectService: "己連結"
|
||||||
|
disconnectService: "己斷開 "
|
||||||
enableLocalTimeline: "開啟本地時間軸"
|
enableLocalTimeline: "開啟本地時間軸"
|
||||||
enableGlobalTimeline: "啟用公開時間軸"
|
enableGlobalTimeline: "啟用公開時間軸"
|
||||||
disablingTimelinesInfo: "即使您關閉了時間線功能,管理員和協調人仍可以繼續使用,以方便您。"
|
disablingTimelinesInfo: "即使您關閉了時間線功能,管理員和協調人仍可以繼續使用,以方便您。"
|
||||||
@ -323,6 +327,7 @@ driveCapacityPerRemoteAccount: "每個非本地用戶的雲端容量"
|
|||||||
inMb: "以Mbps為單位"
|
inMb: "以Mbps為單位"
|
||||||
iconUrl: "圖像URL"
|
iconUrl: "圖像URL"
|
||||||
bannerUrl: "橫幅圖像URL"
|
bannerUrl: "橫幅圖像URL"
|
||||||
|
backgroundImageUrl: "背景圖片的來源網址 "
|
||||||
basicInfo: "基本資訊"
|
basicInfo: "基本資訊"
|
||||||
pinnedUsers: "置頂用戶"
|
pinnedUsers: "置頂用戶"
|
||||||
pinnedUsersDescription: "在「發現」頁面中使用換行標記想要置頂的使用者。"
|
pinnedUsersDescription: "在「發現」頁面中使用換行標記想要置頂的使用者。"
|
||||||
@ -474,7 +479,9 @@ objectStorage: "Object Storage (物件儲存)"
|
|||||||
useObjectStorage: "使用Object Storage"
|
useObjectStorage: "使用Object Storage"
|
||||||
objectStorageBaseUrl: "Base URL"
|
objectStorageBaseUrl: "Base URL"
|
||||||
objectStorageBucket: "儲存空間(Bucket)"
|
objectStorageBucket: "儲存空間(Bucket)"
|
||||||
|
objectStorageBucketDesc: "請指定您正在使用的服務的存儲桶名稱。 "
|
||||||
objectStoragePrefix: "前綴"
|
objectStoragePrefix: "前綴"
|
||||||
|
objectStoragePrefixDesc: "它存儲在此前綴目錄下。"
|
||||||
objectStorageEndpoint: "端點(Endpoint)"
|
objectStorageEndpoint: "端點(Endpoint)"
|
||||||
objectStorageEndpointDesc: "如要使用AWS S3,請留空。否則請依照你使用的服務商的說明書進行設定,以'<host>'或 '<host>:<port>'的形式設定端點(Endpoint)。"
|
objectStorageEndpointDesc: "如要使用AWS S3,請留空。否則請依照你使用的服務商的說明書進行設定,以'<host>'或 '<host>:<port>'的形式設定端點(Endpoint)。"
|
||||||
objectStorageRegion: "地域(Region)"
|
objectStorageRegion: "地域(Region)"
|
||||||
@ -517,7 +524,6 @@ removeAllFollowing: "解除所有追蹤"
|
|||||||
removeAllFollowingDescription: "解除{host}所有的追蹤。在實例不再存在時執行。"
|
removeAllFollowingDescription: "解除{host}所有的追蹤。在實例不再存在時執行。"
|
||||||
userSuspended: "該使用者已被停用"
|
userSuspended: "該使用者已被停用"
|
||||||
userSilenced: "該用戶已被禁言。"
|
userSilenced: "該用戶已被禁言。"
|
||||||
sidebar: "側邊列"
|
|
||||||
divider: "分割線"
|
divider: "分割線"
|
||||||
addItem: "新增項目"
|
addItem: "新增項目"
|
||||||
rooms: "房間"
|
rooms: "房間"
|
||||||
@ -537,6 +543,8 @@ disablePlayer: "關閉播放器"
|
|||||||
expandTweet: "展開推文"
|
expandTweet: "展開推文"
|
||||||
themeEditor: "主題編輯器"
|
themeEditor: "主題編輯器"
|
||||||
description: "描述"
|
description: "描述"
|
||||||
|
describeFile: "添加標題 "
|
||||||
|
enterFileDescription: "輸入標題 "
|
||||||
author: "作者"
|
author: "作者"
|
||||||
leaveConfirm: "有未保存的更改。要放棄嗎?"
|
leaveConfirm: "有未保存的更改。要放棄嗎?"
|
||||||
manage: "管理"
|
manage: "管理"
|
||||||
@ -730,12 +738,35 @@ switch: "切換"
|
|||||||
noMaintainerInformationWarning: "尚未設定管理員信息。"
|
noMaintainerInformationWarning: "尚未設定管理員信息。"
|
||||||
noBotProtectionWarning: "尚未設定Bot防護。"
|
noBotProtectionWarning: "尚未設定Bot防護。"
|
||||||
configure: "設定"
|
configure: "設定"
|
||||||
|
postToGallery: "發佈到相簿"
|
||||||
|
gallery: "相簿"
|
||||||
|
recentPosts: "最新貼文"
|
||||||
|
popularPosts: "熱門的貼文"
|
||||||
|
ads: "廣告"
|
||||||
expiration: "期限"
|
expiration: "期限"
|
||||||
|
memo: "備忘錄"
|
||||||
|
priority: "優先級"
|
||||||
|
high: "高"
|
||||||
middle: "中"
|
middle: "中"
|
||||||
|
low: "低"
|
||||||
emailNotConfiguredWarning: "沒有設定電子郵件地址"
|
emailNotConfiguredWarning: "沒有設定電子郵件地址"
|
||||||
|
ratio: "%"
|
||||||
|
global: "公開"
|
||||||
|
sent: "發送"
|
||||||
|
hashtags: "#tag"
|
||||||
|
_docs:
|
||||||
|
admin: "管理"
|
||||||
_ad:
|
_ad:
|
||||||
back: "返回"
|
back: "返回"
|
||||||
|
reduceFrequencyOfThisAd: "降低此廣告的頻率 "
|
||||||
|
_forgotPassword:
|
||||||
|
enterEmail: "請輸入您的帳戶註冊的電子郵件地址。 密碼重置連結將被發送到該電子郵件地址。"
|
||||||
|
ifNoEmail: "如果您還沒有註冊您的電子郵件地址,請聯繫管理員。 "
|
||||||
|
contactAdmin: "此實例不支持電子郵件,請聯繫您的管理員重置您的密碼。 "
|
||||||
_gallery:
|
_gallery:
|
||||||
|
my: "我的貼文"
|
||||||
|
liked: "喜歡的貼文"
|
||||||
|
like: "讚"
|
||||||
unlike: "收回喜歡"
|
unlike: "收回喜歡"
|
||||||
_email:
|
_email:
|
||||||
_follow:
|
_follow:
|
||||||
@ -776,6 +807,7 @@ _mfm:
|
|||||||
url: "URL"
|
url: "URL"
|
||||||
urlDescription: "可以展示URL位址。"
|
urlDescription: "可以展示URL位址。"
|
||||||
link: "鏈接"
|
link: "鏈接"
|
||||||
|
linkDescription: "您可以將特定範圍的文章與 URL 相關聯。 "
|
||||||
bold: "粗體"
|
bold: "粗體"
|
||||||
small: "縮小"
|
small: "縮小"
|
||||||
center: "置中"
|
center: "置中"
|
||||||
@ -786,7 +818,9 @@ _mfm:
|
|||||||
blockMath: "數學公式(方塊)"
|
blockMath: "數學公式(方塊)"
|
||||||
quote: "引用"
|
quote: "引用"
|
||||||
emoji: "自訂表情符號"
|
emoji: "自訂表情符號"
|
||||||
|
emojiDescription: "您可以通過將自定義表情符號名稱括在冒號中來顯示自定義表情符號。 "
|
||||||
search: "搜尋"
|
search: "搜尋"
|
||||||
|
searchDescription: "您可以顯示所輸入的搜索框。"
|
||||||
flip: "翻轉"
|
flip: "翻轉"
|
||||||
flipDescription: "將內容上下或左右翻轉。"
|
flipDescription: "將內容上下或左右翻轉。"
|
||||||
jelly: "動畫(果凍)"
|
jelly: "動畫(果凍)"
|
||||||
@ -855,9 +889,7 @@ _channel:
|
|||||||
following: "關注中"
|
following: "關注中"
|
||||||
usersCount: "有{n}人參與"
|
usersCount: "有{n}人參與"
|
||||||
notesCount: "有{n}個貼文"
|
notesCount: "有{n}個貼文"
|
||||||
_sidebar:
|
_menuDisplay:
|
||||||
full: "全部"
|
|
||||||
icon: "大頭貼"
|
|
||||||
hide: "隱藏"
|
hide: "隱藏"
|
||||||
_wordMute:
|
_wordMute:
|
||||||
muteWords: "加入靜音文字"
|
muteWords: "加入靜音文字"
|
||||||
@ -879,17 +911,27 @@ _theme:
|
|||||||
constant: "常數"
|
constant: "常數"
|
||||||
defaultValue: "預設值"
|
defaultValue: "預設值"
|
||||||
color: "顏色"
|
color: "顏色"
|
||||||
|
refProp: "查看屬性 "
|
||||||
|
key: "按鍵"
|
||||||
func: "函数"
|
func: "函数"
|
||||||
funcKind: "功能類型"
|
funcKind: "功能類型"
|
||||||
argument: "參數"
|
argument: "參數"
|
||||||
|
basedProp: "要基於的屬性的名稱 "
|
||||||
alpha: "透明度"
|
alpha: "透明度"
|
||||||
darken: "暗度"
|
darken: "暗度"
|
||||||
lighten: "亮度"
|
lighten: "亮度"
|
||||||
keys:
|
keys:
|
||||||
|
accent: "重點色彩"
|
||||||
bg: "背景"
|
bg: "背景"
|
||||||
fg: "文本"
|
fg: "文本"
|
||||||
|
focus: "聚焦"
|
||||||
|
indicator: "指標"
|
||||||
panel: "面板"
|
panel: "面板"
|
||||||
shadow: "陰影"
|
shadow: "陰影"
|
||||||
|
header: "標題"
|
||||||
|
navBg: "側邊欄的背景 "
|
||||||
|
navFg: "側邊欄的文字"
|
||||||
|
navHoverFg: "側邊欄文字(懸停) "
|
||||||
navActive: "側邊欄文本 (活動)"
|
navActive: "側邊欄文本 (活動)"
|
||||||
navIndicator: "側邊欄指示符"
|
navIndicator: "側邊欄指示符"
|
||||||
link: "鏈接"
|
link: "鏈接"
|
||||||
@ -971,6 +1013,7 @@ _tutorial:
|
|||||||
_2fa:
|
_2fa:
|
||||||
alreadyRegistered: "此設備已經被註冊過了"
|
alreadyRegistered: "此設備已經被註冊過了"
|
||||||
registerDevice: "註冊裝置"
|
registerDevice: "註冊裝置"
|
||||||
|
registerKey: "註冊鍵"
|
||||||
step1: "首先,在您的設備上安裝二步驗證程式,例如{a}或{b}。"
|
step1: "首先,在您的設備上安裝二步驗證程式,例如{a}或{b}。"
|
||||||
step2: "然後,掃描螢幕上的QR code。"
|
step2: "然後,掃描螢幕上的QR code。"
|
||||||
_permissions:
|
_permissions:
|
||||||
@ -1040,6 +1083,7 @@ _widgets:
|
|||||||
button: "按鈕"
|
button: "按鈕"
|
||||||
onlineUsers: "線上的用戶"
|
onlineUsers: "線上的用戶"
|
||||||
jobQueue: "佇列"
|
jobQueue: "佇列"
|
||||||
|
serverMetric: "服務器指標 "
|
||||||
_cw:
|
_cw:
|
||||||
hide: "隱藏"
|
hide: "隱藏"
|
||||||
show: "瀏覽更多"
|
show: "瀏覽更多"
|
||||||
@ -1053,6 +1097,7 @@ _poll:
|
|||||||
expiration: "期限"
|
expiration: "期限"
|
||||||
infinite: "無期限"
|
infinite: "無期限"
|
||||||
at: "結束時間"
|
at: "結束時間"
|
||||||
|
after: "進度指定 "
|
||||||
deadlineDate: "截止日期"
|
deadlineDate: "截止日期"
|
||||||
deadlineTime: "小時"
|
deadlineTime: "小時"
|
||||||
duration: "時長"
|
duration: "時長"
|
||||||
@ -1067,6 +1112,7 @@ _poll:
|
|||||||
remainingSeconds: "{s}秒後截止"
|
remainingSeconds: "{s}秒後截止"
|
||||||
_visibility:
|
_visibility:
|
||||||
public: "公開"
|
public: "公開"
|
||||||
|
publicDescription: "發布給所有用戶 "
|
||||||
home: "首頁"
|
home: "首頁"
|
||||||
followers: "追隨者"
|
followers: "追隨者"
|
||||||
specified: "指定使用者"
|
specified: "指定使用者"
|
||||||
@ -1180,6 +1226,7 @@ _rooms:
|
|||||||
cube: "立方體"
|
cube: "立方體"
|
||||||
tv: "電視"
|
tv: "電視"
|
||||||
pinguin: "企鵝蠟像"
|
pinguin: "企鵝蠟像"
|
||||||
|
rubik-cube: "魔術方塊"
|
||||||
poster-h: "海報(橫向)"
|
poster-h: "海報(橫向)"
|
||||||
poster-v: "海報(直向)"
|
poster-v: "海報(直向)"
|
||||||
sofa: " 沙發"
|
sofa: " 沙發"
|
||||||
@ -1242,6 +1289,7 @@ _pages:
|
|||||||
post: "發佈窗口"
|
post: "發佈窗口"
|
||||||
_post:
|
_post:
|
||||||
text: "内容"
|
text: "内容"
|
||||||
|
attachCanvasImage: "附加相簿圖像 "
|
||||||
canvasId: "畫布ID"
|
canvasId: "畫布ID"
|
||||||
textInput: "插入字串"
|
textInput: "插入字串"
|
||||||
_textInput:
|
_textInput:
|
||||||
@ -1266,6 +1314,7 @@ _pages:
|
|||||||
note: "嵌式貼文"
|
note: "嵌式貼文"
|
||||||
_note:
|
_note:
|
||||||
id: "貼文ID"
|
id: "貼文ID"
|
||||||
|
idDescription: "您也可以粘貼筆記 URL 並進行設置。 "
|
||||||
detailed: "顯示詳細內容"
|
detailed: "顯示詳細內容"
|
||||||
switch: "開關"
|
switch: "開關"
|
||||||
_switch:
|
_switch:
|
||||||
@ -1282,12 +1331,15 @@ _pages:
|
|||||||
colored: "彩色"
|
colored: "彩色"
|
||||||
action: "按下按鈕後發生的行為"
|
action: "按下按鈕後發生的行為"
|
||||||
_action:
|
_action:
|
||||||
|
dialog: "顯示對話框 "
|
||||||
_dialog:
|
_dialog:
|
||||||
content: "内容"
|
content: "内容"
|
||||||
resetRandom: "重設亂數"
|
resetRandom: "重設亂數"
|
||||||
pushEvent: "發送事件"
|
pushEvent: "發送事件"
|
||||||
_pushEvent:
|
_pushEvent:
|
||||||
event: "事件名稱"
|
event: "事件名稱"
|
||||||
|
message: "按下時顯示的消息 "
|
||||||
|
variable: "要發送的變數"
|
||||||
no-variable: "沒有"
|
no-variable: "沒有"
|
||||||
callAiScript: "調用AiScript"
|
callAiScript: "調用AiScript"
|
||||||
_callAiScript:
|
_callAiScript:
|
||||||
@ -1296,6 +1348,7 @@ _pages:
|
|||||||
_radioButton:
|
_radioButton:
|
||||||
name: "變數名稱"
|
name: "變數名稱"
|
||||||
title: "標題"
|
title: "標題"
|
||||||
|
values: "由換行符分隔的選項"
|
||||||
default: "預設值"
|
default: "預設值"
|
||||||
script:
|
script:
|
||||||
categories:
|
categories:
|
||||||
@ -1313,6 +1366,8 @@ _pages:
|
|||||||
text: "字串"
|
text: "字串"
|
||||||
multiLineText: "字串(多行)"
|
multiLineText: "字串(多行)"
|
||||||
textList: "字串串列"
|
textList: "字串串列"
|
||||||
|
_textList:
|
||||||
|
info: "請分開每個換行符 "
|
||||||
strLen: "字串長度"
|
strLen: "字串長度"
|
||||||
_strLen:
|
_strLen:
|
||||||
arg1: "字串"
|
arg1: "字串"
|
||||||
@ -1323,6 +1378,8 @@ _pages:
|
|||||||
strReplace: "替換字串"
|
strReplace: "替換字串"
|
||||||
_strReplace:
|
_strReplace:
|
||||||
arg1: "字串"
|
arg1: "字串"
|
||||||
|
arg2: "替換前"
|
||||||
|
arg3: "替換後"
|
||||||
strReverse: "倒轉字串"
|
strReverse: "倒轉字串"
|
||||||
_strReverse:
|
_strReverse:
|
||||||
arg1: "字串"
|
arg1: "字串"
|
||||||
@ -1389,6 +1446,7 @@ _pages:
|
|||||||
_if:
|
_if:
|
||||||
arg1: "如果"
|
arg1: "如果"
|
||||||
arg2: "如果"
|
arg2: "如果"
|
||||||
|
arg3: "除此以外 "
|
||||||
not: "否"
|
not: "否"
|
||||||
_not:
|
_not:
|
||||||
arg1: "否"
|
arg1: "否"
|
||||||
@ -1399,13 +1457,17 @@ _pages:
|
|||||||
_rannum:
|
_rannum:
|
||||||
arg1: "下限"
|
arg1: "下限"
|
||||||
arg2: "上限"
|
arg2: "上限"
|
||||||
|
randomPick: "從列表中隨機選擇 "
|
||||||
_randomPick:
|
_randomPick:
|
||||||
arg1: "清單"
|
arg1: "清單"
|
||||||
|
dailyRandom: "隨機(使用者每日變化 )"
|
||||||
_dailyRandom:
|
_dailyRandom:
|
||||||
arg1: "機率"
|
arg1: "機率"
|
||||||
|
dailyRannum: "亂數(使用者每日變化)"
|
||||||
_dailyRannum:
|
_dailyRannum:
|
||||||
arg1: "下限"
|
arg1: "下限"
|
||||||
arg2: "上限"
|
arg2: "上限"
|
||||||
|
dailyRandomPick: "從列表中隨機選擇(使用者每日變化 ) "
|
||||||
_dailyRandomPick:
|
_dailyRandomPick:
|
||||||
arg1: "清單"
|
arg1: "清單"
|
||||||
seedRandom: "隨機抽選種子碼"
|
seedRandom: "隨機抽選種子碼"
|
||||||
@ -1444,7 +1506,10 @@ _pages:
|
|||||||
aiScriptVar: "AiScript的變數"
|
aiScriptVar: "AiScript的變數"
|
||||||
fn: "函数"
|
fn: "函数"
|
||||||
_fn:
|
_fn:
|
||||||
|
slots: "欄位"
|
||||||
|
slots-info: "用換行符分隔每個欄位"
|
||||||
arg1: "輸出"
|
arg1: "輸出"
|
||||||
|
for: "重複 "
|
||||||
_for:
|
_for:
|
||||||
arg1: "重複次數"
|
arg1: "重複次數"
|
||||||
arg2: "處理"
|
arg2: "處理"
|
||||||
@ -1454,13 +1519,16 @@ _pages:
|
|||||||
boolean: "標記"
|
boolean: "標記"
|
||||||
array: "清單"
|
array: "清單"
|
||||||
stringArray: "字串列表"
|
stringArray: "字串列表"
|
||||||
|
emptySlot: "空欄位"
|
||||||
enviromentVariables: "環境變數"
|
enviromentVariables: "環境變數"
|
||||||
pageVariables: "頁面元素"
|
pageVariables: "頁面元素"
|
||||||
|
argVariables: "輸入欄位"
|
||||||
_relayStatus:
|
_relayStatus:
|
||||||
requesting: "等待核准"
|
requesting: "等待核准"
|
||||||
accepted: "已通過核准"
|
accepted: "已通過核准"
|
||||||
rejected: "已拒絕"
|
rejected: "已拒絕"
|
||||||
_notification:
|
_notification:
|
||||||
|
fileUploaded: "上傳檔案成功。"
|
||||||
youGotMention: "{name}提及到您"
|
youGotMention: "{name}提及到您"
|
||||||
youGotReply: "{name}回覆了您"
|
youGotReply: "{name}回覆了您"
|
||||||
youGotQuote: "{name}引用了您"
|
youGotQuote: "{name}引用了您"
|
||||||
|
161
package.json
161
package.json
@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "misskey",
|
"name": "misskey",
|
||||||
"author": "syuilo <syuilotan@yahoo.co.jp>",
|
"author": "syuilo <syuilotan@yahoo.co.jp>",
|
||||||
"version": "12.83.0",
|
"version": "12.85.1",
|
||||||
"codename": "indigo",
|
"codename": "indigo",
|
||||||
"repository": {
|
"repository": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
@ -30,14 +30,11 @@
|
|||||||
"format": "gulp format"
|
"format": "gulp format"
|
||||||
},
|
},
|
||||||
"resolutions": {
|
"resolutions": {
|
||||||
"mfm-js/twemoji-parser": "13.1.x",
|
|
||||||
"chokidar": "^3.3.1",
|
"chokidar": "^3.3.1",
|
||||||
"constantinople": "^4.0.1",
|
"lodash": "^4.17.21"
|
||||||
"jsonld/rdf-canonize/node-forge": "0.10.0",
|
|
||||||
"lodash": "^4.17.20"
|
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@babel/plugin-transform-runtime": "7.14.3",
|
"@babel/plugin-transform-runtime": "7.14.5",
|
||||||
"@elastic/elasticsearch": "7.11.0",
|
"@elastic/elasticsearch": "7.11.0",
|
||||||
"@koa/cors": "3.1.0",
|
"@koa/cors": "3.1.0",
|
||||||
"@koa/multer": "3.0.0",
|
"@koa/multer": "3.0.0",
|
||||||
@ -47,94 +44,94 @@
|
|||||||
"@sinonjs/fake-timers": "7.1.2",
|
"@sinonjs/fake-timers": "7.1.2",
|
||||||
"@syuilo/aiscript": "0.11.1",
|
"@syuilo/aiscript": "0.11.1",
|
||||||
"@types/bcryptjs": "2.4.2",
|
"@types/bcryptjs": "2.4.2",
|
||||||
"@types/bull": "3.15.1",
|
"@types/bull": "3.15.2",
|
||||||
"@types/cbor": "6.0.0",
|
"@types/cbor": "6.0.0",
|
||||||
"@types/dateformat": "3.0.1",
|
"@types/dateformat": "3.0.1",
|
||||||
"@types/escape-regexp": "0.0.0",
|
"@types/escape-regexp": "0.0.0",
|
||||||
"@types/glob": "7.1.3",
|
"@types/glob": "7.1.4",
|
||||||
"@types/gulp": "4.0.8",
|
"@types/gulp": "4.0.9",
|
||||||
"@types/gulp-rename": "2.0.0",
|
"@types/gulp-rename": "2.0.1",
|
||||||
"@types/is-url": "1.2.29",
|
"@types/is-url": "1.2.30",
|
||||||
"@types/js-yaml": "4.0.1",
|
"@types/js-yaml": "4.0.2",
|
||||||
"@types/jsdom": "16.2.10",
|
"@types/jsdom": "16.2.13",
|
||||||
"@types/jsonld": "1.5.5",
|
"@types/jsonld": "1.5.6",
|
||||||
"@types/katex": "0.11.0",
|
"@types/katex": "0.11.1",
|
||||||
"@types/koa": "2.13.3",
|
"@types/koa": "2.13.4",
|
||||||
"@types/koa-bodyparser": "4.3.1",
|
"@types/koa-bodyparser": "4.3.2",
|
||||||
"@types/koa-cors": "0.0.0",
|
"@types/koa-cors": "0.0.1",
|
||||||
"@types/koa-favicon": "2.0.19",
|
"@types/koa-favicon": "2.0.21",
|
||||||
"@types/koa-logger": "3.1.1",
|
"@types/koa-logger": "3.1.1",
|
||||||
"@types/koa-mount": "4.0.0",
|
"@types/koa-mount": "4.0.0",
|
||||||
"@types/koa-send": "4.1.2",
|
"@types/koa-send": "4.1.3",
|
||||||
"@types/koa-views": "7.0.0",
|
"@types/koa-views": "7.0.0",
|
||||||
"@types/koa__cors": "3.0.2",
|
"@types/koa__cors": "3.0.3",
|
||||||
"@types/koa__multer": "2.0.2",
|
"@types/koa__multer": "2.0.3",
|
||||||
"@types/koa__router": "8.0.4",
|
"@types/koa__router": "8.0.7",
|
||||||
"@types/markdown-it": "12.0.2",
|
"@types/markdown-it": "12.0.3",
|
||||||
"@types/matter-js": "0.14.12",
|
"@types/matter-js": "0.17.3",
|
||||||
"@types/mocha": "8.2.2",
|
"@types/mocha": "8.2.3",
|
||||||
"@types/node": "15.12.2",
|
"@types/node": "16.3.3",
|
||||||
"@types/node-fetch": "2.5.10",
|
"@types/node-fetch": "2.5.11",
|
||||||
"@types/nodemailer": "6.4.2",
|
"@types/nodemailer": "6.4.4",
|
||||||
"@types/nprogress": "0.2.0",
|
"@types/nprogress": "0.2.0",
|
||||||
"@types/oauth": "0.9.1",
|
"@types/oauth": "0.9.1",
|
||||||
"@types/parse5": "6.0.0",
|
"@types/parse5": "6.0.1",
|
||||||
"@types/parsimmon": "1.10.6",
|
"@types/parsimmon": "1.10.6",
|
||||||
"@types/portscanner": "2.1.0",
|
"@types/portscanner": "2.1.1",
|
||||||
"@types/pug": "2.0.4",
|
"@types/pug": "2.0.5",
|
||||||
"@types/punycode": "2.1.0",
|
"@types/punycode": "2.1.0",
|
||||||
"@types/qrcode": "1.4.0",
|
"@types/qrcode": "1.4.1",
|
||||||
"@types/random-seed": "0.3.3",
|
"@types/random-seed": "0.3.3",
|
||||||
"@types/ratelimiter": "3.4.1",
|
"@types/ratelimiter": "3.4.2",
|
||||||
"@types/redis": "2.8.29",
|
"@types/redis": "2.8.31",
|
||||||
"@types/rename": "1.0.3",
|
"@types/rename": "1.0.4",
|
||||||
"@types/request-stats": "3.0.0",
|
"@types/request-stats": "3.0.0",
|
||||||
"@types/rimraf": "3.0.0",
|
"@types/rimraf": "3.0.1",
|
||||||
"@types/seedrandom": "2.4.28",
|
"@types/seedrandom": "2.4.28",
|
||||||
"@types/sharp": "0.28.3",
|
"@types/sharp": "0.28.4",
|
||||||
"@types/sinonjs__fake-timers": "6.0.2",
|
"@types/sinonjs__fake-timers": "6.0.3",
|
||||||
"@types/speakeasy": "2.0.5",
|
"@types/speakeasy": "2.0.6",
|
||||||
"@types/throttle-debounce": "2.1.0",
|
"@types/throttle-debounce": "2.1.0",
|
||||||
"@types/tinycolor2": "1.4.2",
|
"@types/tinycolor2": "1.4.3",
|
||||||
"@types/tmp": "0.2.0",
|
"@types/tmp": "0.2.1",
|
||||||
"@types/uuid": "8.3.0",
|
"@types/uuid": "8.3.1",
|
||||||
"@types/web-push": "3.3.0",
|
"@types/web-push": "3.3.2",
|
||||||
"@types/webpack": "5.28.0",
|
"@types/webpack": "5.28.0",
|
||||||
"@types/webpack-stream": "3.2.12",
|
"@types/webpack-stream": "3.2.12",
|
||||||
"@types/websocket": "1.0.2",
|
"@types/websocket": "1.0.3",
|
||||||
"@types/ws": "7.4.4",
|
"@types/ws": "7.4.6",
|
||||||
"@typescript-eslint/parser": "4.26.1",
|
"@typescript-eslint/parser": "4.28.3",
|
||||||
"@vue/compiler-sfc": "3.1.1",
|
"@vue/compiler-sfc": "3.1.5",
|
||||||
"abort-controller": "3.0.0",
|
"abort-controller": "3.0.0",
|
||||||
"apexcharts": "3.27.1",
|
"apexcharts": "3.27.2",
|
||||||
"autobind-decorator": "2.4.0",
|
"autobind-decorator": "2.4.0",
|
||||||
"autosize": "4.0.4",
|
"autosize": "4.0.4",
|
||||||
"autwh": "0.1.0",
|
"autwh": "0.1.0",
|
||||||
"aws-sdk": "2.923.0",
|
"aws-sdk": "2.948.0",
|
||||||
"bcryptjs": "2.4.3",
|
"bcryptjs": "2.4.3",
|
||||||
"blurhash": "1.1.3",
|
"blurhash": "1.1.3",
|
||||||
"broadcast-channel": "3.6.0",
|
"broadcast-channel": "3.7.0",
|
||||||
"bull": "3.22.7",
|
"bull": "3.26.0",
|
||||||
"cafy": "15.2.1",
|
"cafy": "15.2.1",
|
||||||
"cbor": "7.0.5",
|
"cbor": "7.0.6",
|
||||||
"chalk": "4.1.1",
|
"chalk": "4.1.1",
|
||||||
"chart.js": "2.9.4",
|
"chart.js": "2.9.4",
|
||||||
"cli-highlight": "2.1.11",
|
"cli-highlight": "2.1.11",
|
||||||
"commander": "7.2.0",
|
"commander": "7.2.0",
|
||||||
"concurrently": "6.2.0",
|
"concurrently": "6.2.0",
|
||||||
"content-disposition": "0.5.3",
|
"content-disposition": "0.5.3",
|
||||||
"core-js": "3.14.0",
|
"core-js": "3.15.2",
|
||||||
"crc-32": "1.2.0",
|
"crc-32": "1.2.0",
|
||||||
"css-loader": "5.2.6",
|
"css-loader": "6.0.0",
|
||||||
"cssnano": "5.0.5",
|
"cssnano": "5.0.6",
|
||||||
"dateformat": "4.5.1",
|
"dateformat": "4.5.1",
|
||||||
"diskusage": "1.1.3",
|
"diskusage": "1.1.3",
|
||||||
"escape-regexp": "0.0.1",
|
"escape-regexp": "0.0.1",
|
||||||
"eslint": "7.28.0",
|
"eslint": "7.30.0",
|
||||||
"eslint-plugin-vue": "7.10.0",
|
"eslint-plugin-vue": "7.13.0",
|
||||||
"eventemitter3": "4.0.7",
|
"eventemitter3": "4.0.7",
|
||||||
"feed": "4.2.2",
|
"feed": "4.2.2",
|
||||||
"file-type": "16.5.0",
|
"file-type": "16.5.1",
|
||||||
"fluent-ffmpeg": "2.1.2",
|
"fluent-ffmpeg": "2.1.2",
|
||||||
"glob": "7.1.7",
|
"glob": "7.1.7",
|
||||||
"got": "11.8.2",
|
"got": "11.8.2",
|
||||||
@ -157,7 +154,7 @@
|
|||||||
"jsdom": "16.6.0",
|
"jsdom": "16.6.0",
|
||||||
"json5": "2.2.0",
|
"json5": "2.2.0",
|
||||||
"json5-loader": "4.0.1",
|
"json5-loader": "4.0.1",
|
||||||
"jsonld": "4.0.1",
|
"jsonld": "5.2.0",
|
||||||
"jsrsasign": "8.0.20",
|
"jsrsasign": "8.0.20",
|
||||||
"katex": "0.13.11",
|
"katex": "0.13.11",
|
||||||
"koa": "2.13.1",
|
"koa": "2.13.1",
|
||||||
@ -171,26 +168,26 @@
|
|||||||
"koa-views": "7.0.1",
|
"koa-views": "7.0.1",
|
||||||
"langmap": "0.0.16",
|
"langmap": "0.0.16",
|
||||||
"lookup-dns-cache": "2.1.0",
|
"lookup-dns-cache": "2.1.0",
|
||||||
"markdown-it": "12.0.6",
|
"markdown-it": "12.1.0",
|
||||||
"markdown-it-anchor": "7.1.0",
|
"markdown-it-anchor": "7.1.0",
|
||||||
"matter-js": "0.17.1",
|
"matter-js": "0.17.1",
|
||||||
"mfm-js": "0.18.0",
|
"mfm-js": "0.19.0",
|
||||||
"misskey-js": "0.0.4",
|
"misskey-js": "0.0.6",
|
||||||
"mocha": "8.4.0",
|
"mocha": "8.4.0",
|
||||||
"moji": "0.5.1",
|
"moji": "0.5.1",
|
||||||
"ms": "2.1.3",
|
"ms": "2.1.3",
|
||||||
"multer": "1.4.2",
|
"multer": "1.4.2",
|
||||||
"nested-property": "4.0.0",
|
"nested-property": "4.0.0",
|
||||||
"node-fetch": "2.6.1",
|
"node-fetch": "2.6.1",
|
||||||
"nodemailer": "6.6.1",
|
"nodemailer": "6.6.3",
|
||||||
"object-assign-deep": "0.4.0",
|
"object-assign-deep": "0.4.0",
|
||||||
"os-utils": "0.0.14",
|
"os-utils": "0.0.14",
|
||||||
"parse5": "6.0.1",
|
"parse5": "6.0.1",
|
||||||
"pg": "8.6.0",
|
"pg": "8.6.0",
|
||||||
"portscanner": "2.2.0",
|
"portscanner": "2.2.0",
|
||||||
"postcss": "8.3.0",
|
"postcss": "8.3.5",
|
||||||
"postcss-loader": "5.3.0",
|
"postcss-loader": "6.1.1",
|
||||||
"prismjs": "1.23.0",
|
"prismjs": "1.24.1",
|
||||||
"probe-image-size": "7.2.1",
|
"probe-image-size": "7.2.1",
|
||||||
"promise-limit": "2.7.0",
|
"promise-limit": "2.7.0",
|
||||||
"promise-sequential": "1.1.1",
|
"promise-sequential": "1.1.1",
|
||||||
@ -212,16 +209,16 @@
|
|||||||
"rimraf": "3.0.2",
|
"rimraf": "3.0.2",
|
||||||
"rndstr": "1.0.0",
|
"rndstr": "1.0.0",
|
||||||
"s-age": "1.1.2",
|
"s-age": "1.1.2",
|
||||||
"sass": "1.34.1",
|
"sass": "1.35.2",
|
||||||
"sass-loader": "12.0.0",
|
"sass-loader": "12.1.0",
|
||||||
"seedrandom": "3.0.5",
|
"seedrandom": "3.0.5",
|
||||||
"sharp": "0.28.3",
|
"sharp": "0.28.3",
|
||||||
"speakeasy": "2.0.0",
|
"speakeasy": "2.0.0",
|
||||||
"stringz": "2.1.0",
|
"stringz": "2.1.0",
|
||||||
"style-loader": "2.0.0",
|
"style-loader": "3.1.0",
|
||||||
"summaly": "2.4.0",
|
"summaly": "2.4.0",
|
||||||
"syslog-pro": "1.0.0",
|
"syslog-pro": "1.0.0",
|
||||||
"systeminformation": "5.7.4",
|
"systeminformation": "5.7.7",
|
||||||
"syuilo-password-strength": "0.0.1",
|
"syuilo-password-strength": "0.0.1",
|
||||||
"textarea-caret": "3.1.0",
|
"textarea-caret": "3.1.0",
|
||||||
"three": "0.117.1",
|
"three": "0.117.1",
|
||||||
@ -229,32 +226,32 @@
|
|||||||
"tinycolor2": "1.4.2",
|
"tinycolor2": "1.4.2",
|
||||||
"tmp": "0.2.1",
|
"tmp": "0.2.1",
|
||||||
"ts-loader": "9.2.3",
|
"ts-loader": "9.2.3",
|
||||||
"ts-node": "10.0.0",
|
"ts-node": "10.1.0",
|
||||||
"tsc-alias": "1.3.2",
|
"tsc-alias": "1.3.7",
|
||||||
"tsconfig-paths": "3.9.0",
|
"tsconfig-paths": "3.10.1",
|
||||||
"tslint": "6.1.3",
|
"tslint": "6.1.3",
|
||||||
"tslint-sonarts": "1.9.0",
|
"tslint-sonarts": "1.9.0",
|
||||||
"twemoji-parser": "13.1.0",
|
"twemoji-parser": "13.1.0",
|
||||||
"typeorm": "0.2.34",
|
"typeorm": "0.2.32",
|
||||||
"typescript": "4.3.2",
|
"typescript": "4.3.5",
|
||||||
"ulid": "2.3.0",
|
"ulid": "2.3.0",
|
||||||
"uuid": "8.3.2",
|
"uuid": "8.3.2",
|
||||||
"v-debounce": "0.1.2",
|
"v-debounce": "0.1.2",
|
||||||
"vanilla-tilt": "1.7.0",
|
"vanilla-tilt": "1.7.0",
|
||||||
"vue": "3.1.1",
|
"vue": "3.1.5",
|
||||||
"vue-color": "2.8.1",
|
"vue-color": "2.8.1",
|
||||||
"vue-json-pretty": "1.7.1",
|
"vue-json-pretty": "1.8.1",
|
||||||
"vue-loader": "16.1.2",
|
"vue-loader": "16.3.1",
|
||||||
"vue-prism-editor": "2.0.0-alpha.2",
|
"vue-prism-editor": "2.0.0-alpha.2",
|
||||||
"vue-router": "4.0.5",
|
"vue-router": "4.0.5",
|
||||||
"vue-style-loader": "4.1.3",
|
"vue-style-loader": "4.1.3",
|
||||||
"vue-svg-loader": "0.17.0-beta.2",
|
"vue-svg-loader": "0.17.0-beta.2",
|
||||||
"vuedraggable": "4.0.1",
|
"vuedraggable": "4.0.1",
|
||||||
"web-push": "3.4.4",
|
"web-push": "3.4.5",
|
||||||
"webpack": "5.38.1",
|
"webpack": "5.45.1",
|
||||||
"webpack-cli": "4.7.2",
|
"webpack-cli": "4.7.2",
|
||||||
"websocket": "1.0.34",
|
"websocket": "1.0.34",
|
||||||
"ws": "7.4.6",
|
"ws": "7.5.3",
|
||||||
"xev": "2.0.1"
|
"xev": "2.0.1"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
|
@ -8,6 +8,8 @@ import { unisonReload } from '@client/scripts/unison-reload';
|
|||||||
type Account = {
|
type Account = {
|
||||||
id: string;
|
id: string;
|
||||||
token: string;
|
token: string;
|
||||||
|
isModerator: boolean;
|
||||||
|
isAdmin: boolean;
|
||||||
};
|
};
|
||||||
|
|
||||||
const data = localStorage.getItem('account');
|
const data = localStorage.getItem('account');
|
||||||
@ -45,7 +47,7 @@ function fetchAccount(token): Promise<Account> {
|
|||||||
})
|
})
|
||||||
.then(res => {
|
.then(res => {
|
||||||
// When failed to authenticate user
|
// When failed to authenticate user
|
||||||
if (res.status !== 200 && res.status < 500) {
|
if (res.status >= 400 && res.status < 500) {
|
||||||
return signout();
|
return signout();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -10,9 +10,9 @@
|
|||||||
</template>
|
</template>
|
||||||
<div class="dpvffvvy _monolithic_">
|
<div class="dpvffvvy _monolithic_">
|
||||||
<div class="_section">
|
<div class="_section">
|
||||||
<MkTextarea v-model:value="comment">
|
<MkTextarea v-model="comment">
|
||||||
<span>{{ $ts.details }}</span>
|
<template #label>{{ $ts.details }}</template>
|
||||||
<template #desc>{{ $ts.fillAbuseReportDescription }}</template>
|
<template #caption>{{ $ts.fillAbuseReportDescription }}</template>
|
||||||
</MkTextarea>
|
</MkTextarea>
|
||||||
</div>
|
</div>
|
||||||
<div class="_section">
|
<div class="_section">
|
||||||
|
@ -5,7 +5,8 @@
|
|||||||
:cy="5 - (Math.cos(angle) * (5 - graduationsPadding))"
|
:cy="5 - (Math.cos(angle) * (5 - graduationsPadding))"
|
||||||
:r="i % 5 == 0 ? 0.125 : 0.05"
|
:r="i % 5 == 0 ? 0.125 : 0.05"
|
||||||
:fill="i % 5 == 0 ? majorGraduationColor : minorGraduationColor"
|
:fill="i % 5 == 0 ? majorGraduationColor : minorGraduationColor"
|
||||||
:key="i"/>
|
:key="i"
|
||||||
|
/>
|
||||||
|
|
||||||
<line
|
<line
|
||||||
:x1="5 - (Math.sin(sAngle) * (sHandLengthRatio * handsTailLength))"
|
:x1="5 - (Math.sin(sAngle) * (sHandLengthRatio * handsTailLength))"
|
||||||
@ -13,7 +14,9 @@
|
|||||||
:x2="5 + (Math.sin(sAngle) * ((sHandLengthRatio * 5) - handsPadding))"
|
:x2="5 + (Math.sin(sAngle) * ((sHandLengthRatio * 5) - handsPadding))"
|
||||||
:y2="5 - (Math.cos(sAngle) * ((sHandLengthRatio * 5) - handsPadding))"
|
:y2="5 - (Math.cos(sAngle) * ((sHandLengthRatio * 5) - handsPadding))"
|
||||||
:stroke="sHandColor"
|
:stroke="sHandColor"
|
||||||
stroke-width="0.05"/>
|
:stroke-width="thickness / 2"
|
||||||
|
stroke-linecap="round"
|
||||||
|
/>
|
||||||
|
|
||||||
<line
|
<line
|
||||||
:x1="5 - (Math.sin(mAngle) * (mHandLengthRatio * handsTailLength))"
|
:x1="5 - (Math.sin(mAngle) * (mHandLengthRatio * handsTailLength))"
|
||||||
@ -21,7 +24,9 @@
|
|||||||
:x2="5 + (Math.sin(mAngle) * ((mHandLengthRatio * 5) - handsPadding))"
|
:x2="5 + (Math.sin(mAngle) * ((mHandLengthRatio * 5) - handsPadding))"
|
||||||
:y2="5 - (Math.cos(mAngle) * ((mHandLengthRatio * 5) - handsPadding))"
|
:y2="5 - (Math.cos(mAngle) * ((mHandLengthRatio * 5) - handsPadding))"
|
||||||
:stroke="mHandColor"
|
:stroke="mHandColor"
|
||||||
stroke-width="0.1"/>
|
:stroke-width="thickness"
|
||||||
|
stroke-linecap="round"
|
||||||
|
/>
|
||||||
|
|
||||||
<line
|
<line
|
||||||
:x1="5 - (Math.sin(hAngle) * (hHandLengthRatio * handsTailLength))"
|
:x1="5 - (Math.sin(hAngle) * (hHandLengthRatio * handsTailLength))"
|
||||||
@ -29,16 +34,24 @@
|
|||||||
:x2="5 + (Math.sin(hAngle) * ((hHandLengthRatio * 5) - handsPadding))"
|
:x2="5 + (Math.sin(hAngle) * ((hHandLengthRatio * 5) - handsPadding))"
|
||||||
:y2="5 - (Math.cos(hAngle) * ((hHandLengthRatio * 5) - handsPadding))"
|
:y2="5 - (Math.cos(hAngle) * ((hHandLengthRatio * 5) - handsPadding))"
|
||||||
:stroke="hHandColor"
|
:stroke="hHandColor"
|
||||||
stroke-width="0.1"/>
|
:stroke-width="thickness"
|
||||||
|
stroke-linecap="round"
|
||||||
|
/>
|
||||||
</svg>
|
</svg>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { defineComponent } from 'vue';
|
import { defineComponent } from 'vue';
|
||||||
import * as tinycolor from 'tinycolor2';
|
import * as tinycolor from 'tinycolor2';
|
||||||
import * as os from '@client/os';
|
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
|
props: {
|
||||||
|
thickness: {
|
||||||
|
type: Number,
|
||||||
|
default: 0.1
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
now: new Date(),
|
now: new Date(),
|
||||||
|
@ -14,8 +14,8 @@
|
|||||||
</div>
|
</div>
|
||||||
<header v-if="title"><Mfm :text="title"/></header>
|
<header v-if="title"><Mfm :text="title"/></header>
|
||||||
<div class="body" v-if="text"><Mfm :text="text"/></div>
|
<div class="body" v-if="text"><Mfm :text="text"/></div>
|
||||||
<MkInput v-if="input" v-model:value="inputValue" autofocus :type="input.type || 'text'" :placeholder="input.placeholder" @keydown="onInputKeydown"></MkInput>
|
<MkInput v-if="input" v-model="inputValue" autofocus :type="input.type || 'text'" :placeholder="input.placeholder" @keydown="onInputKeydown"></MkInput>
|
||||||
<MkSelect v-if="select" v-model:value="selectedValue" autofocus>
|
<MkSelect v-if="select" v-model="selectedValue" autofocus>
|
||||||
<template v-if="select.items">
|
<template v-if="select.items">
|
||||||
<option v-for="item in select.items" :value="item.value">{{ item.text }}</option>
|
<option v-for="item in select.items" :value="item.value">{{ item.text }}</option>
|
||||||
</template>
|
</template>
|
||||||
|
@ -114,7 +114,7 @@ export default defineComponent({
|
|||||||
if (this.selectMode) {
|
if (this.selectMode) {
|
||||||
this.$emit('chosen', this.file);
|
this.$emit('chosen', this.file);
|
||||||
} else {
|
} else {
|
||||||
os.modalMenu(this.getMenu(), ev.currentTarget || ev.target);
|
os.popupMenu(this.getMenu(), ev.currentTarget || ev.target);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@ -10,6 +10,7 @@
|
|||||||
<span class="separator" v-if="folder != null"><i class="fas fa-angle-right"></i></span>
|
<span class="separator" v-if="folder != null"><i class="fas fa-angle-right"></i></span>
|
||||||
<span class="folder current" v-if="folder != null">{{ folder.name }}</span>
|
<span class="folder current" v-if="folder != null">{{ folder.name }}</span>
|
||||||
</div>
|
</div>
|
||||||
|
<button @click="showMenu" class="menu _button"><i class="fas fa-ellipsis-h"></i></button>
|
||||||
</nav>
|
</nav>
|
||||||
<div class="main" :class="{ uploading: uploadings.length > 0, fetching }"
|
<div class="main" :class="{ uploading: uploadings.length > 0, fetching }"
|
||||||
ref="main"
|
ref="main"
|
||||||
@ -46,7 +47,7 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { defineComponent } from 'vue';
|
import { defineComponent, markRaw } from 'vue';
|
||||||
import XNavFolder from './drive.nav-folder.vue';
|
import XNavFolder from './drive.nav-folder.vue';
|
||||||
import XFolder from './drive.folder.vue';
|
import XFolder from './drive.folder.vue';
|
||||||
import XFile from './drive.file.vue';
|
import XFile from './drive.file.vue';
|
||||||
@ -139,7 +140,7 @@ export default defineComponent({
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
this.connection = os.stream.useChannel('drive');
|
this.connection = markRaw(os.stream.useChannel('drive'));
|
||||||
|
|
||||||
this.connection.on('fileCreated', this.onStreamDriveFileCreated);
|
this.connection.on('fileCreated', this.onStreamDriveFileCreated);
|
||||||
this.connection.on('fileUpdated', this.onStreamDriveFileUpdated);
|
this.connection.on('fileUpdated', this.onStreamDriveFileUpdated);
|
||||||
@ -627,8 +628,12 @@ export default defineComponent({
|
|||||||
}];
|
}];
|
||||||
},
|
},
|
||||||
|
|
||||||
onContextmenu(e) {
|
showMenu(ev) {
|
||||||
os.contextMenu(this.getMenu(), e);
|
os.popupMenu(this.getMenu(), ev.currentTarget || ev.target);
|
||||||
|
},
|
||||||
|
|
||||||
|
onContextmenu(ev) {
|
||||||
|
os.contextMenu(this.getMenu(), ev);
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@ -641,7 +646,7 @@ export default defineComponent({
|
|||||||
height: 100%;
|
height: 100%;
|
||||||
|
|
||||||
> nav {
|
> nav {
|
||||||
display: block;
|
display: flex;
|
||||||
z-index: 2;
|
z-index: 2;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
padding: 0 8px;
|
padding: 0 8px;
|
||||||
@ -696,6 +701,10 @@ export default defineComponent({
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
> .menu {
|
||||||
|
margin-left: auto;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
> .main {
|
> .main {
|
||||||
|
@ -1,17 +1,17 @@
|
|||||||
<template>
|
<template>
|
||||||
<MkModal ref="modal" :manual-showing="manualShowing" :src="src" :front="true" @click="$refs.modal.close()" @opening="opening" @close="$emit('close')" @closed="$emit('closed')">
|
<MkPopup ref="popup" :manual-showing="manualShowing" :src="src" :front="true" @click="$refs.popup.close()" @opening="opening" @close="$emit('close')" @closed="$emit('closed')" #default="{point}">
|
||||||
<MkEmojiPicker :show-pinned="showPinned" :as-reaction-picker="asReactionPicker" @chosen="chosen" ref="picker"/>
|
<MkEmojiPicker class="ryghynhb _popup _shadow" :class="{ pointer: point === 'top' }" :show-pinned="showPinned" :as-reaction-picker="asReactionPicker" @chosen="chosen" ref="picker"/>
|
||||||
</MkModal>
|
</MkPopup>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { defineComponent, markRaw } from 'vue';
|
import { defineComponent, markRaw } from 'vue';
|
||||||
import MkModal from '@client/components/ui/modal.vue';
|
import MkPopup from '@client/components/ui/popup.vue';
|
||||||
import MkEmojiPicker from '@client/components/emoji-picker.vue';
|
import MkEmojiPicker from '@client/components/emoji-picker.vue';
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
components: {
|
components: {
|
||||||
MkModal,
|
MkPopup,
|
||||||
MkEmojiPicker,
|
MkEmojiPicker,
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -33,7 +33,7 @@ export default defineComponent({
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
||||||
emits: ['done', 'closed'],
|
emits: ['done', 'close', 'closed'],
|
||||||
|
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
@ -44,7 +44,7 @@ export default defineComponent({
|
|||||||
methods: {
|
methods: {
|
||||||
chosen(emoji: any) {
|
chosen(emoji: any) {
|
||||||
this.$emit('done', emoji);
|
this.$emit('done', emoji);
|
||||||
this.$refs.modal.close();
|
this.$refs.popup.close();
|
||||||
},
|
},
|
||||||
|
|
||||||
opening() {
|
opening() {
|
||||||
@ -56,145 +56,20 @@ export default defineComponent({
|
|||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="scss" scoped>
|
<style lang="scss" scoped>
|
||||||
.omfetrab {
|
.ryghynhb {
|
||||||
$pad: 8px;
|
&.pointer {
|
||||||
--eachSize: 40px;
|
&:before {
|
||||||
|
--size: 8px;
|
||||||
display: flex;
|
content: '';
|
||||||
flex-direction: column;
|
display: block;
|
||||||
contain: content;
|
position: absolute;
|
||||||
|
top: calc(0px - (var(--size) * 2));
|
||||||
&.big {
|
left: 0;
|
||||||
--eachSize: 44px;
|
right: 0;
|
||||||
}
|
width: 0;
|
||||||
|
margin: auto;
|
||||||
&.w1 {
|
border: solid var(--size) transparent;
|
||||||
width: calc((var(--eachSize) * 5) + (#{$pad} * 2));
|
border-bottom-color: var(--popup);
|
||||||
}
|
|
||||||
|
|
||||||
&.w2 {
|
|
||||||
width: calc((var(--eachSize) * 6) + (#{$pad} * 2));
|
|
||||||
}
|
|
||||||
|
|
||||||
&.w3 {
|
|
||||||
width: calc((var(--eachSize) * 7) + (#{$pad} * 2));
|
|
||||||
}
|
|
||||||
|
|
||||||
&.h1 {
|
|
||||||
--height: calc((var(--eachSize) * 4) + (#{$pad} * 2));
|
|
||||||
}
|
|
||||||
|
|
||||||
&.h2 {
|
|
||||||
--height: calc((var(--eachSize) * 6) + (#{$pad} * 2));
|
|
||||||
}
|
|
||||||
|
|
||||||
&.h3 {
|
|
||||||
--height: calc((var(--eachSize) * 8) + (#{$pad} * 2));
|
|
||||||
}
|
|
||||||
|
|
||||||
> .search {
|
|
||||||
width: 100%;
|
|
||||||
padding: 12px;
|
|
||||||
box-sizing: border-box;
|
|
||||||
font-size: 1em;
|
|
||||||
outline: none;
|
|
||||||
border: none;
|
|
||||||
background: transparent;
|
|
||||||
color: var(--fg);
|
|
||||||
|
|
||||||
&:not(.filled) {
|
|
||||||
order: 1;
|
|
||||||
z-index: 2;
|
|
||||||
box-shadow: 0px -1px 0 0px var(--divider);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
> .emojis {
|
|
||||||
height: var(--height);
|
|
||||||
overflow-y: auto;
|
|
||||||
overflow-x: hidden;
|
|
||||||
|
|
||||||
scrollbar-width: none;
|
|
||||||
|
|
||||||
&::-webkit-scrollbar {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
> .index {
|
|
||||||
min-height: var(--height);
|
|
||||||
position: relative;
|
|
||||||
border-bottom: solid 0.5px var(--divider);
|
|
||||||
|
|
||||||
> .arrow {
|
|
||||||
position: absolute;
|
|
||||||
bottom: 0;
|
|
||||||
left: 0;
|
|
||||||
width: 100%;
|
|
||||||
padding: 16px 0;
|
|
||||||
text-align: center;
|
|
||||||
opacity: 0.5;
|
|
||||||
pointer-events: none;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
section {
|
|
||||||
> header {
|
|
||||||
position: sticky;
|
|
||||||
top: 0;
|
|
||||||
left: 0;
|
|
||||||
z-index: 1;
|
|
||||||
padding: 8px;
|
|
||||||
font-size: 12px;
|
|
||||||
}
|
|
||||||
|
|
||||||
> div {
|
|
||||||
padding: $pad;
|
|
||||||
|
|
||||||
> button {
|
|
||||||
position: relative;
|
|
||||||
padding: 0;
|
|
||||||
width: var(--eachSize);
|
|
||||||
height: var(--eachSize);
|
|
||||||
border-radius: 4px;
|
|
||||||
|
|
||||||
&:focus {
|
|
||||||
outline: solid 2px var(--focus);
|
|
||||||
z-index: 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
&:hover {
|
|
||||||
background: rgba(0, 0, 0, 0.05);
|
|
||||||
}
|
|
||||||
|
|
||||||
&:active {
|
|
||||||
background: var(--accent);
|
|
||||||
box-shadow: inset 0 0.15em 0.3em rgba(27, 31, 35, 0.15);
|
|
||||||
}
|
|
||||||
|
|
||||||
> * {
|
|
||||||
font-size: 24px;
|
|
||||||
height: 1.25em;
|
|
||||||
vertical-align: -.25em;
|
|
||||||
pointer-events: none;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
&.result {
|
|
||||||
border-bottom: solid 0.5px var(--divider);
|
|
||||||
|
|
||||||
&:empty {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
&.unicode {
|
|
||||||
min-height: 384px;
|
|
||||||
}
|
|
||||||
|
|
||||||
&.custom {
|
|
||||||
min-height: 64px;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="omfetrab _popup" :class="['w' + width, 'h' + height, { big }]">
|
<div class="omfetrab" :class="['w' + width, 'h' + height, { big }]">
|
||||||
<input ref="search" class="search" data-prevent-emoji-insert :class="{ filled: q != null && q != '' }" v-model.trim="q" :placeholder="$ts.search" @paste.stop="paste" @keyup.enter="done()">
|
<input ref="search" class="search" data-prevent-emoji-insert :class="{ filled: q != null && q != '' }" v-model.trim="q" :placeholder="$ts.search" @paste.stop="paste" @keyup.enter="done()">
|
||||||
<div class="emojis" ref="emojis">
|
<div class="emojis" ref="emojis">
|
||||||
<section class="result">
|
<section class="result">
|
||||||
@ -346,7 +346,6 @@ export default defineComponent({
|
|||||||
|
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
contain: content;
|
|
||||||
|
|
||||||
&.big {
|
&.big {
|
||||||
--eachSize: 44px;
|
--eachSize: 44px;
|
||||||
|
@ -28,7 +28,7 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { defineComponent } from 'vue';
|
import { defineComponent, markRaw } from 'vue';
|
||||||
import * as os from '@client/os';
|
import * as os from '@client/os';
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
@ -71,7 +71,7 @@ export default defineComponent({
|
|||||||
},
|
},
|
||||||
|
|
||||||
mounted() {
|
mounted() {
|
||||||
this.connection = os.stream.useChannel('main');
|
this.connection = markRaw(os.stream.useChannel('main'));
|
||||||
|
|
||||||
this.connection.on('follow', this.onFollowChange);
|
this.connection.on('follow', this.onFollowChange);
|
||||||
this.connection.on('unfollow', this.onFollowChange);
|
this.connection.on('unfollow', this.onFollowChange);
|
||||||
|
@ -9,14 +9,14 @@
|
|||||||
|
|
||||||
<form class="_monolithic_" @submit.prevent="onSubmit" v-if="$instance.enableEmail">
|
<form class="_monolithic_" @submit.prevent="onSubmit" v-if="$instance.enableEmail">
|
||||||
<div class="_section">
|
<div class="_section">
|
||||||
<MkInput v-model:value="username" type="text" pattern="^[a-zA-Z0-9_]+$" spellcheck="false" autofocus required>
|
<MkInput v-model="username" type="text" pattern="^[a-zA-Z0-9_]+$" spellcheck="false" autofocus required>
|
||||||
<span>{{ $ts.username }}</span>
|
<template #label>{{ $ts.username }}</template>
|
||||||
<template #prefix>@</template>
|
<template #prefix>@</template>
|
||||||
</MkInput>
|
</MkInput>
|
||||||
|
|
||||||
<MkInput v-model:value="email" type="email" spellcheck="false" required>
|
<MkInput v-model="email" type="email" spellcheck="false" required>
|
||||||
<span>{{ $ts.emailAddress }}</span>
|
<template #label>{{ $ts.emailAddress }}</template>
|
||||||
<template #desc>{{ $ts._forgotPassword.enterEmail }}</template>
|
<template #caption>{{ $ts._forgotPassword.enterEmail }}</template>
|
||||||
</MkInput>
|
</MkInput>
|
||||||
|
|
||||||
<MkButton type="submit" :disabled="processing" primary style="margin: 0 auto;">{{ $ts.send }}</MkButton>
|
<MkButton type="submit" :disabled="processing" primary style="margin: 0 auto;">{{ $ts.send }}</MkButton>
|
||||||
|
@ -34,6 +34,10 @@
|
|||||||
<template #label><span v-text="form[item].label || item"></span><span v-if="form[item].required === false"> ({{ $ts.optional }})</span></template>
|
<template #label><span v-text="form[item].label || item"></span><span v-if="form[item].required === false"> ({{ $ts.optional }})</span></template>
|
||||||
<option v-for="item in form[item].enum" :value="item.value" :key="item.value">{{ item.label }}</option>
|
<option v-for="item in form[item].enum" :value="item.value" :key="item.value">{{ item.label }}</option>
|
||||||
</FormSelect>
|
</FormSelect>
|
||||||
|
<FormRadios v-else-if="form[item].type === 'radio'" v-model="values[item]">
|
||||||
|
<template #desc><span v-text="form[item].label || item"></span><span v-if="form[item].required === false"> ({{ $ts.optional }})</span></template>
|
||||||
|
<option v-for="item in form[item].options" :value="item.value" :key="item.value">{{ item.label }}</option>
|
||||||
|
</FormRadios>
|
||||||
<FormRange v-else-if="form[item].type === 'range'" v-model:value="values[item]" :min="form[item].mim" :max="form[item].max" :step="form[item].step">
|
<FormRange v-else-if="form[item].type === 'range'" v-model:value="values[item]" :min="form[item].mim" :max="form[item].max" :step="form[item].step">
|
||||||
<template #label><span v-text="form[item].label || item"></span><span v-if="form[item].required === false"> ({{ $ts.optional }})</span></template>
|
<template #label><span v-text="form[item].label || item"></span><span v-if="form[item].required === false"> ({{ $ts.optional }})</span></template>
|
||||||
<template v-if="form[item].description" #desc>{{ form[item].description }}</template>
|
<template v-if="form[item].description" #desc>{{ form[item].description }}</template>
|
||||||
@ -56,6 +60,7 @@ import FormSwitch from './form/switch.vue';
|
|||||||
import FormSelect from './form/select.vue';
|
import FormSelect from './form/select.vue';
|
||||||
import FormRange from './form/range.vue';
|
import FormRange from './form/range.vue';
|
||||||
import FormButton from './form/button.vue';
|
import FormButton from './form/button.vue';
|
||||||
|
import FormRadios from './form/radios.vue';
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
components: {
|
components: {
|
||||||
@ -67,6 +72,7 @@ export default defineComponent({
|
|||||||
FormSelect,
|
FormSelect,
|
||||||
FormRange,
|
FormRange,
|
||||||
FormButton,
|
FormButton,
|
||||||
|
FormRadios,
|
||||||
},
|
},
|
||||||
|
|
||||||
props: {
|
props: {
|
||||||
|
@ -27,7 +27,10 @@ export default defineComponent({
|
|||||||
},
|
},
|
||||||
render() {
|
render() {
|
||||||
const label = this.$slots.desc();
|
const label = this.$slots.desc();
|
||||||
const options = this.$slots.default();
|
let options = this.$slots.default();
|
||||||
|
|
||||||
|
// なぜかFragmentになることがあるため
|
||||||
|
if (options.length === 1 && options[0].props == null) options = options[0].children;
|
||||||
|
|
||||||
return h('div', {
|
return h('div', {
|
||||||
class: 'cnklmpwm _formItem'
|
class: 'cnklmpwm _formItem'
|
||||||
@ -37,7 +40,7 @@ export default defineComponent({
|
|||||||
}, label),
|
}, label),
|
||||||
...options.map(option => h('button', {
|
...options.map(option => h('button', {
|
||||||
class: '_button _formPanel _formClickable',
|
class: '_button _formPanel _formClickable',
|
||||||
key: option.props.value,
|
key: option.key,
|
||||||
onClick: () => this.value = option.props.value,
|
onClick: () => this.value = option.props.value,
|
||||||
}, [h('span', {
|
}, [h('span', {
|
||||||
class: ['check', { checked: this.value === option.props.value }],
|
class: ['check', { checked: this.value === option.props.value }],
|
||||||
|
@ -1,9 +1,9 @@
|
|||||||
<template>
|
<template>
|
||||||
<span class="eiwwqkts _noSelect" :class="{ cat }" :title="acct(user)" v-if="disableLink" v-user-preview="disablePreview ? undefined : user.id" @click="onClick">
|
<span class="eiwwqkts _noSelect" :class="{ cat, square: $store.state.squareAvatars }" :title="acct(user)" v-if="disableLink" v-user-preview="disablePreview ? undefined : user.id" @click="onClick">
|
||||||
<img class="inner" :src="url" decoding="async"/>
|
<img class="inner" :src="url" decoding="async"/>
|
||||||
<MkUserOnlineIndicator v-if="showIndicator" class="indicator" :user="user"/>
|
<MkUserOnlineIndicator v-if="showIndicator" class="indicator" :user="user"/>
|
||||||
</span>
|
</span>
|
||||||
<MkA class="eiwwqkts _noSelect" :class="{ cat }" :to="userPage(user)" :title="acct(user)" :target="target" v-else v-user-preview="disablePreview ? undefined : user.id">
|
<MkA class="eiwwqkts _noSelect" :class="{ cat, square: $store.state.squareAvatars }" :to="userPage(user)" :title="acct(user)" :target="target" v-else v-user-preview="disablePreview ? undefined : user.id">
|
||||||
<img class="inner" :src="url" decoding="async"/>
|
<img class="inner" :src="url" decoding="async"/>
|
||||||
<MkUserOnlineIndicator v-if="showIndicator" class="indicator" :user="user"/>
|
<MkUserOnlineIndicator v-if="showIndicator" class="indicator" :user="user"/>
|
||||||
</MkA>
|
</MkA>
|
||||||
@ -81,28 +81,6 @@ export default defineComponent({
|
|||||||
border-radius: 100%;
|
border-radius: 100%;
|
||||||
line-height: 16px;
|
line-height: 16px;
|
||||||
|
|
||||||
&.cat {
|
|
||||||
&:before, &:after {
|
|
||||||
background: #df548f;
|
|
||||||
border: solid 4px currentColor;
|
|
||||||
box-sizing: border-box;
|
|
||||||
content: '';
|
|
||||||
display: inline-block;
|
|
||||||
height: 50%;
|
|
||||||
width: 50%;
|
|
||||||
}
|
|
||||||
|
|
||||||
&:before {
|
|
||||||
border-radius: 0 75% 75%;
|
|
||||||
transform: rotate(37.5deg) skew(30deg);
|
|
||||||
}
|
|
||||||
|
|
||||||
&:after {
|
|
||||||
border-radius: 75% 0 75% 75%;
|
|
||||||
transform: rotate(-37.5deg) skew(-30deg);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
> .inner {
|
> .inner {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
bottom: 0;
|
bottom: 0;
|
||||||
@ -125,5 +103,35 @@ export default defineComponent({
|
|||||||
width: 20%;
|
width: 20%;
|
||||||
height: 20%;
|
height: 20%;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
&.square {
|
||||||
|
border-radius: 20%;
|
||||||
|
|
||||||
|
> .inner {
|
||||||
|
border-radius: 20%;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&.cat {
|
||||||
|
&:before, &:after {
|
||||||
|
background: #df548f;
|
||||||
|
border: solid 4px currentColor;
|
||||||
|
box-sizing: border-box;
|
||||||
|
content: '';
|
||||||
|
display: inline-block;
|
||||||
|
height: 50%;
|
||||||
|
width: 50%;
|
||||||
|
}
|
||||||
|
|
||||||
|
&:before {
|
||||||
|
border-radius: 0 75% 75%;
|
||||||
|
transform: rotate(37.5deg) skew(30deg);
|
||||||
|
}
|
||||||
|
|
||||||
|
&:after {
|
||||||
|
border-radius: 75% 0 75% 75%;
|
||||||
|
transform: rotate(-37.5deg) skew(-30deg);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
@ -117,6 +117,11 @@ export default defineComponent({
|
|||||||
75% { transform: scale3d(1.05, 0.95, 1); }
|
75% { transform: scale3d(1.05, 0.95, 1); }
|
||||||
to { transform: scale3d(1, 1, 1); }
|
to { transform: scale3d(1, 1, 1); }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@keyframes mfm-rainbow {
|
||||||
|
0% { filter: hue-rotate(0deg) contrast(150%) saturate(150%); }
|
||||||
|
100% { filter: hue-rotate(360deg) contrast(150%) saturate(150%); }
|
||||||
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
<style lang="scss" scoped>
|
<style lang="scss" scoped>
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="zbcjwnqg" style="margin-top: -8px;">
|
<div class="zbcjwnqg" style="margin-top: -8px;">
|
||||||
<div class="selects" style="display: flex;">
|
<div class="selects" style="display: flex;">
|
||||||
<MkSelect v-model:value="chartSrc" style="margin: 0; flex: 1;">
|
<MkSelect v-model="chartSrc" style="margin: 0; flex: 1;">
|
||||||
<optgroup :label="$ts.federation">
|
<optgroup :label="$ts.federation">
|
||||||
<option value="federation-instances">{{ $ts._charts.federationInstancesIncDec }}</option>
|
<option value="federation-instances">{{ $ts._charts.federationInstancesIncDec }}</option>
|
||||||
<option value="federation-instances-total">{{ $ts._charts.federationInstancesTotal }}</option>
|
<option value="federation-instances-total">{{ $ts._charts.federationInstancesTotal }}</option>
|
||||||
@ -24,7 +24,7 @@
|
|||||||
<option value="drive-total">{{ $ts._charts.storageUsageTotal }}</option>
|
<option value="drive-total">{{ $ts._charts.storageUsageTotal }}</option>
|
||||||
</optgroup>
|
</optgroup>
|
||||||
</MkSelect>
|
</MkSelect>
|
||||||
<MkSelect v-model:value="chartSpan" style="margin: 0;">
|
<MkSelect v-model="chartSpan" style="margin: 0;">
|
||||||
<option value="hour">{{ $ts.perHour }}</option>
|
<option value="hour">{{ $ts.perHour }}</option>
|
||||||
<option value="day">{{ $ts.perDay }}</option>
|
<option value="day">{{ $ts.perDay }}</option>
|
||||||
</MkSelect>
|
</MkSelect>
|
||||||
|
@ -36,7 +36,7 @@
|
|||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { defineComponent } from 'vue';
|
import { defineComponent } from 'vue';
|
||||||
import MkModal from '@client/components/ui/modal.vue';
|
import MkModal from '@client/components/ui/modal.vue';
|
||||||
import { sidebarDef } from '@client/sidebar';
|
import { menuDef } from '@client/menu';
|
||||||
import { instanceName } from '@client/config';
|
import { instanceName } from '@client/config';
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
@ -48,7 +48,7 @@ export default defineComponent({
|
|||||||
|
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
menuDef: sidebarDef,
|
menuDef: menuDef,
|
||||||
items: [],
|
items: [],
|
||||||
instanceName,
|
instanceName,
|
||||||
};
|
};
|
||||||
|
@ -9,7 +9,6 @@
|
|||||||
<video
|
<video
|
||||||
:poster="video.thumbnailUrl"
|
:poster="video.thumbnailUrl"
|
||||||
:title="video.name"
|
:title="video.name"
|
||||||
crossorigin="anonymous"
|
|
||||||
preload="none"
|
preload="none"
|
||||||
controls
|
controls
|
||||||
>
|
>
|
||||||
|
@ -165,6 +165,10 @@ export default defineComponent({
|
|||||||
class: '_mfm_blur_',
|
class: '_mfm_blur_',
|
||||||
}, genEl(token.children));
|
}, genEl(token.children));
|
||||||
}
|
}
|
||||||
|
case 'rainbow': {
|
||||||
|
style = this.$store.state.animatedMfm ? 'animation: mfm-rainbow 1s linear infinite;' : '';
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (style == null) {
|
if (style == null) {
|
||||||
return h('span', {}, ['[', token.props.name, ...genEl(token.children), ']']);
|
return h('span', {}, ['[', token.props.name, ...genEl(token.children), ']']);
|
||||||
|
@ -1,13 +1,10 @@
|
|||||||
<template>
|
<template>
|
||||||
<MkModal ref="modal" @click="$emit('click')" @closed="$emit('closed')">
|
<MkModal ref="modal" @click="$emit('click')" @closed="$emit('closed')">
|
||||||
<div class="hrmcaedk _popup _narrow_" :style="{ width: `${width}px`, height: (height ? `min(${height}px, 100%)` : '100%') }">
|
<div class="hrmcaedk _window _narrow_" :style="{ width: `${width}px`, height: (height ? `min(${height}px, 100%)` : '100%') }">
|
||||||
<div class="header" @contextmenu="onContextmenu">
|
<div class="header" @contextmenu="onContextmenu">
|
||||||
<button class="_button" @click="back()" v-if="history.length > 0"><i class="fas fa-chevron-left"></i></button>
|
|
||||||
<button class="_button" style="pointer-events: none;" v-else><!-- マージンのバランスを取るためのダミー --></button>
|
|
||||||
<span class="title">
|
<span class="title">
|
||||||
<XHeader :info="pageInfo" :with-back="false"/>
|
<XHeader :info="pageInfo" :back-button="history.length > 0" @back="back()" :close-button="true" @close="$refs.modal.close()"/>
|
||||||
</span>
|
</span>
|
||||||
<button class="_button" @click="$refs.modal.close()"><i class="fas fa-times"></i></button>
|
|
||||||
</div>
|
</div>
|
||||||
<div class="body _flat_">
|
<div class="body _flat_">
|
||||||
<keep-alive>
|
<keep-alive>
|
||||||
@ -177,35 +174,19 @@ export default defineComponent({
|
|||||||
flex-shrink: 0;
|
flex-shrink: 0;
|
||||||
box-shadow: 0px 1px var(--divider);
|
box-shadow: 0px 1px var(--divider);
|
||||||
|
|
||||||
> button {
|
|
||||||
height: $height;
|
|
||||||
width: $height;
|
|
||||||
|
|
||||||
@media (max-width: 500px) {
|
|
||||||
height: $height-narrow;
|
|
||||||
width: $height-narrow;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
> .title {
|
> .title {
|
||||||
flex: 1;
|
flex: 1;
|
||||||
line-height: $height;
|
height: $height;
|
||||||
padding-left: 32px;
|
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
white-space: nowrap;
|
white-space: nowrap;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
text-overflow: ellipsis;
|
text-overflow: ellipsis;
|
||||||
pointer-events: none;
|
|
||||||
|
|
||||||
@media (max-width: 500px) {
|
@media (max-width: 500px) {
|
||||||
line-height: $height-narrow;
|
height: $height-narrow;
|
||||||
padding-left: 16px;
|
padding-left: 16px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
> button + .title {
|
|
||||||
padding-left: 0;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
> .body {
|
> .body {
|
||||||
|
@ -454,7 +454,7 @@ export default defineComponent({
|
|||||||
renote(viaKeyboard = false) {
|
renote(viaKeyboard = false) {
|
||||||
pleaseLogin();
|
pleaseLogin();
|
||||||
this.blur();
|
this.blur();
|
||||||
os.modalMenu([{
|
os.popupMenu([{
|
||||||
text: this.$ts.renote,
|
text: this.$ts.renote,
|
||||||
icon: 'fas fa-retweet',
|
icon: 'fas fa-retweet',
|
||||||
action: () => {
|
action: () => {
|
||||||
@ -743,14 +743,14 @@ export default defineComponent({
|
|||||||
},
|
},
|
||||||
|
|
||||||
menu(viaKeyboard = false) {
|
menu(viaKeyboard = false) {
|
||||||
os.modalMenu(this.getMenu(), this.$refs.menuButton, {
|
os.popupMenu(this.getMenu(), this.$refs.menuButton, {
|
||||||
viaKeyboard
|
viaKeyboard
|
||||||
}).then(this.focus);
|
}).then(this.focus);
|
||||||
},
|
},
|
||||||
|
|
||||||
showRenoteMenu(viaKeyboard = false) {
|
showRenoteMenu(viaKeyboard = false) {
|
||||||
if (!this.isMyRenote) return;
|
if (!this.isMyRenote) return;
|
||||||
os.modalMenu([{
|
os.popupMenu([{
|
||||||
text: this.$ts.unrenote,
|
text: this.$ts.unrenote,
|
||||||
icon: 'fas fa-trash-alt',
|
icon: 'fas fa-trash-alt',
|
||||||
danger: true,
|
danger: true,
|
||||||
@ -794,7 +794,7 @@ export default defineComponent({
|
|||||||
|
|
||||||
async clip() {
|
async clip() {
|
||||||
const clips = await os.api('clips/list');
|
const clips = await os.api('clips/list');
|
||||||
os.modalMenu([{
|
os.popupMenu([{
|
||||||
icon: 'fas fa-plus',
|
icon: 'fas fa-plus',
|
||||||
text: this.$ts.createNew,
|
text: this.$ts.createNew,
|
||||||
action: async () => {
|
action: async () => {
|
||||||
|
@ -24,8 +24,8 @@
|
|||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { defineComponent } from 'vue';
|
import { defineComponent } from 'vue';
|
||||||
import notePage from '../filters/note';
|
import notePage from '@client/filters/note';
|
||||||
import { userPage } from '../filters/user';
|
import { userPage } from '@client/filters/user';
|
||||||
import * as os from '@client/os';
|
import * as os from '@client/os';
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
|
@ -429,7 +429,7 @@ export default defineComponent({
|
|||||||
renote(viaKeyboard = false) {
|
renote(viaKeyboard = false) {
|
||||||
pleaseLogin();
|
pleaseLogin();
|
||||||
this.blur();
|
this.blur();
|
||||||
os.modalMenu([{
|
os.popupMenu([{
|
||||||
text: this.$ts.renote,
|
text: this.$ts.renote,
|
||||||
icon: 'fas fa-retweet',
|
icon: 'fas fa-retweet',
|
||||||
action: () => {
|
action: () => {
|
||||||
@ -718,14 +718,14 @@ export default defineComponent({
|
|||||||
},
|
},
|
||||||
|
|
||||||
menu(viaKeyboard = false) {
|
menu(viaKeyboard = false) {
|
||||||
os.modalMenu(this.getMenu(), this.$refs.menuButton, {
|
os.popupMenu(this.getMenu(), this.$refs.menuButton, {
|
||||||
viaKeyboard
|
viaKeyboard
|
||||||
}).then(this.focus);
|
}).then(this.focus);
|
||||||
},
|
},
|
||||||
|
|
||||||
showRenoteMenu(viaKeyboard = false) {
|
showRenoteMenu(viaKeyboard = false) {
|
||||||
if (!this.isMyRenote) return;
|
if (!this.isMyRenote) return;
|
||||||
os.modalMenu([{
|
os.popupMenu([{
|
||||||
text: this.$ts.unrenote,
|
text: this.$ts.unrenote,
|
||||||
icon: 'fas fa-trash-alt',
|
icon: 'fas fa-trash-alt',
|
||||||
danger: true,
|
danger: true,
|
||||||
@ -769,7 +769,7 @@ export default defineComponent({
|
|||||||
|
|
||||||
async clip() {
|
async clip() {
|
||||||
const clips = await os.api('clips/list');
|
const clips = await os.api('clips/list');
|
||||||
os.modalMenu([{
|
os.popupMenu([{
|
||||||
icon: 'fas fa-plus',
|
icon: 'fas fa-plus',
|
||||||
text: this.$ts.createNew,
|
text: this.$ts.createNew,
|
||||||
action: async () => {
|
action: async () => {
|
||||||
|
@ -11,16 +11,16 @@
|
|||||||
<template #header>{{ $ts.notificationSetting }}</template>
|
<template #header>{{ $ts.notificationSetting }}</template>
|
||||||
<div class="_monolithic_">
|
<div class="_monolithic_">
|
||||||
<div v-if="showGlobalToggle" class="_section">
|
<div v-if="showGlobalToggle" class="_section">
|
||||||
<MkSwitch v-model:value="useGlobalSetting">
|
<MkSwitch v-model="useGlobalSetting">
|
||||||
{{ $ts.useGlobalSetting }}
|
{{ $ts.useGlobalSetting }}
|
||||||
<template #desc>{{ $ts.useGlobalSettingDesc }}</template>
|
<template #caption>{{ $ts.useGlobalSettingDesc }}</template>
|
||||||
</MkSwitch>
|
</MkSwitch>
|
||||||
</div>
|
</div>
|
||||||
<div v-if="!useGlobalSetting" class="_section">
|
<div v-if="!useGlobalSetting" class="_section">
|
||||||
<MkInfo>{{ $ts.notificationSettingDesc }}</MkInfo>
|
<MkInfo>{{ $ts.notificationSettingDesc }}</MkInfo>
|
||||||
<MkButton inline @click="disableAll">{{ $ts.disableAll }}</MkButton>
|
<MkButton inline @click="disableAll">{{ $ts.disableAll }}</MkButton>
|
||||||
<MkButton inline @click="enableAll">{{ $ts.enableAll }}</MkButton>
|
<MkButton inline @click="enableAll">{{ $ts.enableAll }}</MkButton>
|
||||||
<MkSwitch v-for="type in notificationTypes" :key="type" v-model:value="typesMap[type]">{{ $t(`_notification._types.${type}`) }}</MkSwitch>
|
<MkSwitch v-for="type in notificationTypes" :key="type" v-model="typesMap[type]">{{ $t(`_notification._types.${type}`) }}</MkSwitch>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</XModalWindow>
|
</XModalWindow>
|
||||||
|
@ -58,12 +58,12 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { defineComponent } from 'vue';
|
import { defineComponent, markRaw } from 'vue';
|
||||||
import { getNoteSummary } from '@/misc/get-note-summary';
|
import { getNoteSummary } from '@/misc/get-note-summary';
|
||||||
import XReactionIcon from './reaction-icon.vue';
|
import XReactionIcon from './reaction-icon.vue';
|
||||||
import MkFollowButton from './follow-button.vue';
|
import MkFollowButton from './follow-button.vue';
|
||||||
import notePage from '../filters/note';
|
import notePage from '@client/filters/note';
|
||||||
import { userPage } from '../filters/user';
|
import { userPage } from '@client/filters/user';
|
||||||
import { i18n } from '@client/i18n';
|
import { i18n } from '@client/i18n';
|
||||||
import * as os from '@client/os';
|
import * as os from '@client/os';
|
||||||
|
|
||||||
@ -109,7 +109,7 @@ export default defineComponent({
|
|||||||
|
|
||||||
this.readObserver.observe(this.$el);
|
this.readObserver.observe(this.$el);
|
||||||
|
|
||||||
this.connection = os.stream.useChannel('main');
|
this.connection = markRaw(os.stream.useChannel('main'));
|
||||||
this.connection.on('readAllNotifications', () => this.readObserver.unobserve(this.$el));
|
this.connection.on('readAllNotifications', () => this.readObserver.unobserve(this.$el));
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
@ -21,7 +21,7 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { defineComponent, PropType } from 'vue';
|
import { defineComponent, PropType, markRaw } from 'vue';
|
||||||
import paging from '@client/scripts/paging';
|
import paging from '@client/scripts/paging';
|
||||||
import XNotification from './notification.vue';
|
import XNotification from './notification.vue';
|
||||||
import XList from './date-separated-list.vue';
|
import XList from './date-separated-list.vue';
|
||||||
@ -89,7 +89,7 @@ export default defineComponent({
|
|||||||
},
|
},
|
||||||
|
|
||||||
mounted() {
|
mounted() {
|
||||||
this.connection = os.stream.useChannel('main');
|
this.connection = markRaw(os.stream.useChannel('main'));
|
||||||
this.connection.on('notification', this.onNotification);
|
this.connection.on('notification', this.onNotification);
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@ -16,7 +16,7 @@
|
|||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { defineComponent } from 'vue';
|
import { defineComponent } from 'vue';
|
||||||
import { userName } from '../filters/user';
|
import { userName } from '@client/filters/user';
|
||||||
import * as os from '@client/os';
|
import * as os from '@client/os';
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
|
@ -3,16 +3,12 @@
|
|||||||
:initial-width="500"
|
:initial-width="500"
|
||||||
:initial-height="500"
|
:initial-height="500"
|
||||||
:can-resize="true"
|
:can-resize="true"
|
||||||
:close-right="true"
|
:close-button="false"
|
||||||
:contextmenu="contextmenu"
|
:contextmenu="contextmenu"
|
||||||
@closed="$emit('closed')"
|
@closed="$emit('closed')"
|
||||||
>
|
>
|
||||||
<template #header>
|
<template #header>
|
||||||
<XHeader :info="pageInfo" :with-back="false"/>
|
<XHeader :info="pageInfo" :back-button="history.length > 0" @back="back()" :close-button="true" @close="close()"/>
|
||||||
</template>
|
|
||||||
<template #buttons>
|
|
||||||
<button class="_button" @click="back()" v-if="history.length > 0"><i class="fas fa-chevron-left"></i></button>
|
|
||||||
<button class="_button" style="pointer-events: none;" v-else><!-- マージンのバランスを取るためのダミー --></button>
|
|
||||||
</template>
|
</template>
|
||||||
<div class="yrolvcoq _flat_">
|
<div class="yrolvcoq _flat_">
|
||||||
<component :is="component" v-bind="props" :ref="changePage"/>
|
<component :is="component" v-bind="props" :ref="changePage"/>
|
||||||
@ -139,6 +135,10 @@ export default defineComponent({
|
|||||||
this.navigate(this.history.pop(), false);
|
this.navigate(this.history.pop(), false);
|
||||||
},
|
},
|
||||||
|
|
||||||
|
close() {
|
||||||
|
this.$refs.window.close();
|
||||||
|
},
|
||||||
|
|
||||||
expand() {
|
expand() {
|
||||||
this.$router.push(this.path);
|
this.$router.push(this.path);
|
||||||
this.$refs.window.close();
|
this.$refs.window.close();
|
||||||
@ -155,6 +155,5 @@ export default defineComponent({
|
|||||||
<style lang="scss" scoped>
|
<style lang="scss" scoped>
|
||||||
.yrolvcoq {
|
.yrolvcoq {
|
||||||
min-height: 100%;
|
min-height: 100%;
|
||||||
background: var(--bg);
|
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
@ -1,6 +1,8 @@
|
|||||||
<template>
|
<template>
|
||||||
<div>
|
<div>
|
||||||
<MkInput class="kudkigyw" :value="value" @update:value="updateValue($event)" type="number">{{ hpml.interpolate(block.text) }}</MkInput>
|
<MkInput class="kudkigyw" :model-value="value" @update:modelValue="updateValue($event)" type="number">
|
||||||
|
<template #label>{{ hpml.interpolate(block.text) }}</template>
|
||||||
|
</MkInput>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="ngbfujlo">
|
<div class="ngbfujlo">
|
||||||
<MkTextarea :value="text" readonly style="margin: 0;"></MkTextarea>
|
<MkTextarea :model-value="text" readonly style="margin: 0;"></MkTextarea>
|
||||||
<MkButton class="button" primary @click="post()" :disabled="posting || posted">
|
<MkButton class="button" primary @click="post()" :disabled="posting || posted">
|
||||||
<i v-if="posted" class="fas fa-check"></i>
|
<i v-if="posted" class="fas fa-check"></i>
|
||||||
<i v-else class="fas fa-paper-plane"></i>
|
<i v-else class="fas fa-paper-plane"></i>
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="hkcxmtwj">
|
<div class="hkcxmtwj">
|
||||||
<MkSwitch :value="value" @update:value="updateValue($event)">{{ hpml.interpolate(block.text) }}</MkSwitch>
|
<MkSwitch :model-value="value" @update:modelValue="updateValue($event)">{{ hpml.interpolate(block.text) }}</MkSwitch>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
|
@ -1,6 +1,8 @@
|
|||||||
<template>
|
<template>
|
||||||
<div>
|
<div>
|
||||||
<MkInput class="kudkigyw" :value="value" @update:value="updateValue($event)" type="text">{{ hpml.interpolate(block.text) }}</MkInput>
|
<MkInput class="kudkigyw" :model-value="value" @update:modelValue="updateValue($event)" type="text">
|
||||||
|
<template #label>{{ hpml.interpolate(block.text) }}</template>
|
||||||
|
</MkInput>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
|
@ -1,6 +1,8 @@
|
|||||||
<template>
|
<template>
|
||||||
<div>
|
<div>
|
||||||
<MkTextarea :value="value" @update:value="updateValue($event)">{{ hpml.interpolate(block.text) }}</MkTextarea>
|
<MkTextarea :model-value="value" @update:modelValue="updateValue($event)">
|
||||||
|
<template #label>{{ hpml.interpolate(block.text) }}</template>
|
||||||
|
</MkTextarea>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
<template>
|
<template>
|
||||||
<MkTextarea :value="text" readonly></MkTextarea>
|
<MkTextarea :model-value="text" readonly></MkTextarea>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
|
@ -5,8 +5,7 @@
|
|||||||
</p>
|
</p>
|
||||||
<ul ref="choices">
|
<ul ref="choices">
|
||||||
<li v-for="(choice, i) in choices" :key="i">
|
<li v-for="(choice, i) in choices" :key="i">
|
||||||
<MkInput class="input" :value="choice" @update:value="onInput(i, $event)">
|
<MkInput class="input" :model-value="choice" @update:modelValue="onInput(i, $event)" :placeholder="$t('_poll.choiceN', { n: i + 1 })">
|
||||||
<span>{{ $t('_poll.choiceN', { n: i + 1 }) }}</span>
|
|
||||||
</MkInput>
|
</MkInput>
|
||||||
<button @click="remove(i)" class="_button">
|
<button @click="remove(i)" class="_button">
|
||||||
<i class="fas fa-times"></i>
|
<i class="fas fa-times"></i>
|
||||||
@ -16,27 +15,27 @@
|
|||||||
<MkButton class="add" v-if="choices.length < 10" @click="add">{{ $ts.add }}</MkButton>
|
<MkButton class="add" v-if="choices.length < 10" @click="add">{{ $ts.add }}</MkButton>
|
||||||
<MkButton class="add" v-else disabled>{{ $ts._poll.noMore }}</MkButton>
|
<MkButton class="add" v-else disabled>{{ $ts._poll.noMore }}</MkButton>
|
||||||
<section>
|
<section>
|
||||||
<MkSwitch v-model:value="multiple">{{ $ts._poll.canMultipleVote }}</MkSwitch>
|
<MkSwitch v-model="multiple">{{ $ts._poll.canMultipleVote }}</MkSwitch>
|
||||||
<div>
|
<div>
|
||||||
<MkSelect v-model:value="expiration">
|
<MkSelect v-model="expiration">
|
||||||
<template #label>{{ $ts._poll.expiration }}</template>
|
<template #label>{{ $ts._poll.expiration }}</template>
|
||||||
<option value="infinite">{{ $ts._poll.infinite }}</option>
|
<option value="infinite">{{ $ts._poll.infinite }}</option>
|
||||||
<option value="at">{{ $ts._poll.at }}</option>
|
<option value="at">{{ $ts._poll.at }}</option>
|
||||||
<option value="after">{{ $ts._poll.after }}</option>
|
<option value="after">{{ $ts._poll.after }}</option>
|
||||||
</MkSelect>
|
</MkSelect>
|
||||||
<section v-if="expiration === 'at'">
|
<section v-if="expiration === 'at'">
|
||||||
<MkInput v-model:value="atDate" type="date" class="input">
|
<MkInput v-model="atDate" type="date" class="input">
|
||||||
<span>{{ $ts._poll.deadlineDate }}</span>
|
<template #label>{{ $ts._poll.deadlineDate }}</template>
|
||||||
</MkInput>
|
</MkInput>
|
||||||
<MkInput v-model:value="atTime" type="time" class="input">
|
<MkInput v-model="atTime" type="time" class="input">
|
||||||
<span>{{ $ts._poll.deadlineTime }}</span>
|
<template #label>{{ $ts._poll.deadlineTime }}</template>
|
||||||
</MkInput>
|
</MkInput>
|
||||||
</section>
|
</section>
|
||||||
<section v-if="expiration === 'after'">
|
<section v-if="expiration === 'after'">
|
||||||
<MkInput v-model:value="after" type="number" class="input">
|
<MkInput v-model="after" type="number" class="input">
|
||||||
<span>{{ $ts._poll.duration }}</span>
|
<template #label>{{ $ts._poll.duration }}</template>
|
||||||
</MkInput>
|
</MkInput>
|
||||||
<MkSelect v-model:value="unit">
|
<MkSelect v-model="unit">
|
||||||
<option value="second">{{ $ts._time.second }}</option>
|
<option value="second">{{ $ts._time.second }}</option>
|
||||||
<option value="minute">{{ $ts._time.minute }}</option>
|
<option value="minute">{{ $ts._time.minute }}</option>
|
||||||
<option value="hour">{{ $ts._time.hour }}</option>
|
<option value="hour">{{ $ts._time.hour }}</option>
|
||||||
|
@ -10,7 +10,7 @@
|
|||||||
</span>
|
</span>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
<p>
|
<p v-if="!readOnly">
|
||||||
<span>{{ $t('_poll.totalVotes', { n: total }) }}</span>
|
<span>{{ $t('_poll.totalVotes', { n: total }) }}</span>
|
||||||
<span> · </span>
|
<span> · </span>
|
||||||
<a v-if="!closed && !isVoted" @click="toggleShowResult">{{ showResult ? $ts._poll.vote : $ts._poll.showResult }}</a>
|
<a v-if="!closed && !isVoted" @click="toggleShowResult">{{ showResult ? $ts._poll.vote : $ts._poll.showResult }}</a>
|
||||||
@ -31,6 +31,11 @@ export default defineComponent({
|
|||||||
note: {
|
note: {
|
||||||
type: Object,
|
type: Object,
|
||||||
required: true
|
required: true
|
||||||
|
},
|
||||||
|
readOnly: {
|
||||||
|
type: Boolean,
|
||||||
|
required: false,
|
||||||
|
default: false,
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
data() {
|
data() {
|
||||||
@ -65,7 +70,7 @@ export default defineComponent({
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
created() {
|
created() {
|
||||||
this.showResult = this.isVoted;
|
this.showResult = this.readOnly || this.isVoted;
|
||||||
|
|
||||||
if (this.note.poll.expiresAt) {
|
if (this.note.poll.expiresAt) {
|
||||||
const update = () => {
|
const update = () => {
|
||||||
@ -83,7 +88,7 @@ export default defineComponent({
|
|||||||
this.showResult = !this.showResult;
|
this.showResult = !this.showResult;
|
||||||
},
|
},
|
||||||
vote(id) {
|
vote(id) {
|
||||||
if (this.closed || !this.poll.multiple && this.poll.choices.some(c => c.isVoted)) return;
|
if (this.readOnly || this.closed || !this.poll.multiple && this.poll.choices.some(c => c.isVoted)) return;
|
||||||
os.api('notes/polls/vote', {
|
os.api('notes/polls/vote', {
|
||||||
noteId: this.note.id,
|
noteId: this.note.id,
|
||||||
choice: id
|
choice: id
|
||||||
|
@ -112,7 +112,7 @@ export default defineComponent({
|
|||||||
|
|
||||||
showFileMenu(file, ev: MouseEvent) {
|
showFileMenu(file, ev: MouseEvent) {
|
||||||
if (this.menu) return;
|
if (this.menu) return;
|
||||||
this.menu = os.modalMenu([{
|
this.menu = os.popupMenu([{
|
||||||
text: this.$ts.renameFile,
|
text: this.$ts.renameFile,
|
||||||
icon: 'fas fa-i-cursor',
|
icon: 'fas fa-i-cursor',
|
||||||
action: () => { this.rename(file) }
|
action: () => { this.rename(file) }
|
||||||
|
@ -37,6 +37,7 @@
|
|||||||
<MkInfo warn v-if="hasNotSpecifiedMentions" class="hasNotSpecifiedMentions">{{ $ts.notSpecifiedMentionWarning }} - <button class="_textButton" @click="addMissingMention()">{{ $ts.add }}</button></MkInfo>
|
<MkInfo warn v-if="hasNotSpecifiedMentions" class="hasNotSpecifiedMentions">{{ $ts.notSpecifiedMentionWarning }} - <button class="_textButton" @click="addMissingMention()">{{ $ts.add }}</button></MkInfo>
|
||||||
<input v-show="useCw" ref="cw" class="cw" v-model="cw" :placeholder="$ts.annotation" @keydown="onKeydown">
|
<input v-show="useCw" ref="cw" class="cw" v-model="cw" :placeholder="$ts.annotation" @keydown="onKeydown">
|
||||||
<textarea v-model="text" class="text" :class="{ withCw: useCw }" ref="text" :disabled="posting" :placeholder="placeholder" @keydown="onKeydown" @paste="onPaste" @compositionupdate="onCompositionUpdate" @compositionend="onCompositionEnd" />
|
<textarea v-model="text" class="text" :class="{ withCw: useCw }" ref="text" :disabled="posting" :placeholder="placeholder" @keydown="onKeydown" @paste="onPaste" @compositionupdate="onCompositionUpdate" @compositionend="onCompositionEnd" />
|
||||||
|
<input v-show="withHashtags" ref="hashtags" class="hashtags" v-model="hashtags" :placeholder="$ts.hashtags" list="hashtags">
|
||||||
<XPostFormAttaches class="attaches" :files="files" @updated="updateFiles" @detach="detachFile" @changeSensitive="updateFileSensitive" @changeName="updateFileName"/>
|
<XPostFormAttaches class="attaches" :files="files" @updated="updateFiles" @detach="detachFile" @changeSensitive="updateFileSensitive" @changeName="updateFileName"/>
|
||||||
<XPollEditor v-if="poll" :poll="poll" @destroyed="poll = null" @updated="onPollUpdate"/>
|
<XPollEditor v-if="poll" :poll="poll" @destroyed="poll = null" @updated="onPollUpdate"/>
|
||||||
<footer>
|
<footer>
|
||||||
@ -44,9 +45,13 @@
|
|||||||
<button class="_button" @click="togglePoll" :class="{ active: poll }" v-tooltip="$ts.poll"><i class="fas fa-poll-h"></i></button>
|
<button class="_button" @click="togglePoll" :class="{ active: poll }" v-tooltip="$ts.poll"><i class="fas fa-poll-h"></i></button>
|
||||||
<button class="_button" @click="useCw = !useCw" :class="{ active: useCw }" v-tooltip="$ts.useCw"><i class="fas fa-eye-slash"></i></button>
|
<button class="_button" @click="useCw = !useCw" :class="{ active: useCw }" v-tooltip="$ts.useCw"><i class="fas fa-eye-slash"></i></button>
|
||||||
<button class="_button" @click="insertMention" v-tooltip="$ts.mention"><i class="fas fa-at"></i></button>
|
<button class="_button" @click="insertMention" v-tooltip="$ts.mention"><i class="fas fa-at"></i></button>
|
||||||
|
<button class="_button" @click="withHashtags = !withHashtags" v-tooltip="$ts.hashtags"><i class="fas fa-hashtag"></i></button>
|
||||||
<button class="_button" @click="insertEmoji" v-tooltip="$ts.emoji"><i class="fas fa-laugh-squint"></i></button>
|
<button class="_button" @click="insertEmoji" v-tooltip="$ts.emoji"><i class="fas fa-laugh-squint"></i></button>
|
||||||
<button class="_button" @click="showActions" v-tooltip="$ts.plugin" v-if="postFormActions.length > 0"><i class="fas fa-plug"></i></button>
|
<button class="_button" @click="showActions" v-tooltip="$ts.plugin" v-if="postFormActions.length > 0"><i class="fas fa-plug"></i></button>
|
||||||
</footer>
|
</footer>
|
||||||
|
<datalist id="hashtags">
|
||||||
|
<option v-for="hashtag in recentHashtags" :value="hashtag" :key="hashtag"/>
|
||||||
|
</datalist>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
@ -61,16 +66,17 @@ import * as mfm from 'mfm-js';
|
|||||||
import { host, url } from '@client/config';
|
import { host, url } from '@client/config';
|
||||||
import { erase, unique } from '../../prelude/array';
|
import { erase, unique } from '../../prelude/array';
|
||||||
import { extractMentions } from '@/misc/extract-mentions';
|
import { extractMentions } from '@/misc/extract-mentions';
|
||||||
import getAcct from '@/misc/acct/render';
|
import { getAcct } from '@/misc/acct';
|
||||||
import { formatTimeString } from '@/misc/format-time-string';
|
import { formatTimeString } from '@/misc/format-time-string';
|
||||||
import { Autocomplete } from '@client/scripts/autocomplete';
|
import { Autocomplete } from '@client/scripts/autocomplete';
|
||||||
import { noteVisibilities } from '../../types';
|
import { noteVisibilities } from '../../types';
|
||||||
import * as os from '@client/os';
|
import * as os from '@client/os';
|
||||||
import { selectFile } from '@client/scripts/select-file';
|
import { selectFile } from '@client/scripts/select-file';
|
||||||
import { notePostInterruptors, postFormActions } from '@client/store';
|
import { defaultStore, notePostInterruptors, postFormActions } from '@client/store';
|
||||||
import { isMobile } from '@client/scripts/is-mobile';
|
import { isMobile } from '@client/scripts/is-mobile';
|
||||||
import { throttle } from 'throttle-debounce';
|
import { throttle } from 'throttle-debounce';
|
||||||
import MkInfo from '@client/components/ui/info.vue';
|
import MkInfo from '@client/components/ui/info.vue';
|
||||||
|
import { defaultStore } from '@client/store';
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
components: {
|
components: {
|
||||||
@ -212,7 +218,10 @@ export default defineComponent({
|
|||||||
|
|
||||||
max(): number {
|
max(): number {
|
||||||
return this.$instance ? this.$instance.maxNoteTextLength : 1000;
|
return this.$instance ? this.$instance.maxNoteTextLength : 1000;
|
||||||
}
|
},
|
||||||
|
|
||||||
|
withHashtags: defaultStore.makeGetterSetter('postFormWithHashtags'),
|
||||||
|
hashtags: defaultStore.makeGetterSetter('postFormHashtags'),
|
||||||
},
|
},
|
||||||
|
|
||||||
watch: {
|
watch: {
|
||||||
@ -303,6 +312,7 @@ export default defineComponent({
|
|||||||
// TODO: detach when unmount
|
// TODO: detach when unmount
|
||||||
new Autocomplete(this.$refs.text, this, { model: 'text' });
|
new Autocomplete(this.$refs.text, this, { model: 'text' });
|
||||||
new Autocomplete(this.$refs.cw, this, { model: 'cw' });
|
new Autocomplete(this.$refs.cw, this, { model: 'cw' });
|
||||||
|
new Autocomplete(this.$refs.hashtags, this, { model: 'hashtags' });
|
||||||
|
|
||||||
this.$nextTick(() => {
|
this.$nextTick(() => {
|
||||||
// 書きかけの投稿を復元
|
// 書きかけの投稿を復元
|
||||||
@ -605,6 +615,11 @@ export default defineComponent({
|
|||||||
viaMobile: isMobile
|
viaMobile: isMobile
|
||||||
};
|
};
|
||||||
|
|
||||||
|
if (this.withHashtags) {
|
||||||
|
const hashtags = this.hashtags.trim().split(' ').map(x => x.startsWith('#') ? x : '#' + x).join(' ');
|
||||||
|
data.text = data.text ? `${data.text} ${hashtags}` : hashtags;
|
||||||
|
}
|
||||||
|
|
||||||
// plugin
|
// plugin
|
||||||
if (notePostInterruptors.length > 0) {
|
if (notePostInterruptors.length > 0) {
|
||||||
for (const interruptor of notePostInterruptors) {
|
for (const interruptor of notePostInterruptors) {
|
||||||
@ -618,8 +633,8 @@ export default defineComponent({
|
|||||||
this.$nextTick(() => {
|
this.$nextTick(() => {
|
||||||
this.deleteDraft();
|
this.deleteDraft();
|
||||||
this.$emit('posted');
|
this.$emit('posted');
|
||||||
if (this.text && this.text != '') {
|
if (data.text && data.text != '') {
|
||||||
const hashtags = mfm.parse(this.text).filter(x => x.type === 'hashtag').map(x => x.props.hashtag);
|
const hashtags = mfm.parse(data.text).filter(x => x.type === 'hashtag').map(x => x.props.hashtag);
|
||||||
const history = JSON.parse(localStorage.getItem('hashtags') || '[]') as string[];
|
const history = JSON.parse(localStorage.getItem('hashtags') || '[]') as string[];
|
||||||
localStorage.setItem('hashtags', JSON.stringify(unique(hashtags.concat(history))));
|
localStorage.setItem('hashtags', JSON.stringify(unique(hashtags.concat(history))));
|
||||||
}
|
}
|
||||||
@ -649,7 +664,7 @@ export default defineComponent({
|
|||||||
},
|
},
|
||||||
|
|
||||||
showActions(ev) {
|
showActions(ev) {
|
||||||
os.modalMenu(postFormActions.map(action => ({
|
os.popupMenu(postFormActions.map(action => ({
|
||||||
text: action.title,
|
text: action.title,
|
||||||
action: () => {
|
action: () => {
|
||||||
action.handler({
|
action.handler({
|
||||||
@ -785,6 +800,7 @@ export default defineComponent({
|
|||||||
}
|
}
|
||||||
|
|
||||||
> .cw,
|
> .cw,
|
||||||
|
> .hashtags,
|
||||||
> .text {
|
> .text {
|
||||||
display: block;
|
display: block;
|
||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
@ -813,6 +829,13 @@ export default defineComponent({
|
|||||||
border-bottom: solid 0.5px var(--divider);
|
border-bottom: solid 0.5px var(--divider);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
> .hashtags {
|
||||||
|
z-index: 1;
|
||||||
|
padding-top: 8px;
|
||||||
|
padding-bottom: 8px;
|
||||||
|
border-top: solid 0.5px var(--divider);
|
||||||
|
}
|
||||||
|
|
||||||
> .text {
|
> .text {
|
||||||
max-width: 100%;
|
max-width: 100%;
|
||||||
min-width: 100%;
|
min-width: 100%;
|
||||||
@ -872,6 +895,7 @@ export default defineComponent({
|
|||||||
}
|
}
|
||||||
|
|
||||||
> .cw,
|
> .cw,
|
||||||
|
> .hashtags,
|
||||||
> .text {
|
> .text {
|
||||||
padding: 0 16px;
|
padding: 0 16px;
|
||||||
}
|
}
|
||||||
|
@ -170,7 +170,7 @@ export default defineComponent({
|
|||||||
}
|
}
|
||||||
|
|
||||||
> span {
|
> span {
|
||||||
color: #fff;
|
color: var(--fgOnAccent);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,10 +1,10 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="_card">
|
<div class="_card">
|
||||||
<div class="_content">
|
<div class="_content">
|
||||||
<MkInput v-model:value="text">
|
<MkInput v-model="text">
|
||||||
<span>Text</span>
|
<template #label>Text</template>
|
||||||
</MkInput>
|
</MkInput>
|
||||||
<MkSwitch v-model:value="flag">
|
<MkSwitch v-model="flag">
|
||||||
<span>Switch is now {{ flag ? 'on' : 'off' }}</span>
|
<span>Switch is now {{ flag ? 'on' : 'off' }}</span>
|
||||||
</MkSwitch>
|
</MkSwitch>
|
||||||
<div style="margin: 32px 0;">
|
<div style="margin: 32px 0;">
|
||||||
@ -93,7 +93,7 @@ export default defineComponent({
|
|||||||
},
|
},
|
||||||
|
|
||||||
async openMenu(ev) {
|
async openMenu(ev) {
|
||||||
os.modalMenu([{
|
os.popupMenu([{
|
||||||
type: 'label',
|
type: 'label',
|
||||||
text: 'Fruits'
|
text: 'Fruits'
|
||||||
}, {
|
}, {
|
||||||
|
@ -3,15 +3,13 @@
|
|||||||
<div class="auth _section">
|
<div class="auth _section">
|
||||||
<div class="avatar" :style="{ backgroundImage: user ? `url('${ user.avatarUrl }')` : null }" v-show="withAvatar"></div>
|
<div class="avatar" :style="{ backgroundImage: user ? `url('${ user.avatarUrl }')` : null }" v-show="withAvatar"></div>
|
||||||
<div class="normal-signin" v-if="!totpLogin">
|
<div class="normal-signin" v-if="!totpLogin">
|
||||||
<MkInput v-model:value="username" type="text" pattern="^[a-zA-Z0-9_]+$" spellcheck="false" autofocus required @update:value="onUsernameChange">
|
<MkInput v-model="username" :placeholder="$ts.username" type="text" pattern="^[a-zA-Z0-9_]+$" spellcheck="false" autofocus required @update:modelValue="onUsernameChange">
|
||||||
<span>{{ $ts.username }}</span>
|
|
||||||
<template #prefix>@</template>
|
<template #prefix>@</template>
|
||||||
<template #suffix>@{{ host }}</template>
|
<template #suffix>@{{ host }}</template>
|
||||||
</MkInput>
|
</MkInput>
|
||||||
<MkInput v-model:value="password" type="password" :with-password-toggle="true" v-if="!user || user && !user.usePasswordLessLogin" required>
|
<MkInput v-model="password" :placeholder="$ts.password" type="password" :with-password-toggle="true" v-if="!user || user && !user.usePasswordLessLogin" required>
|
||||||
<span>{{ $ts.password }}</span>
|
|
||||||
<template #prefix><i class="fas fa-lock"></i></template>
|
<template #prefix><i class="fas fa-lock"></i></template>
|
||||||
<template #desc><button class="_textButton" @click="resetPassword">{{ $ts.forgotPassword }}</button></template>
|
<template #caption><button class="_textButton" @click="resetPassword" type="button">{{ $ts.forgotPassword }}</button></template>
|
||||||
</MkInput>
|
</MkInput>
|
||||||
<MkButton type="submit" primary :disabled="signing" style="margin: 0 auto;">{{ signing ? $ts.loggingIn : $ts.login }}</MkButton>
|
<MkButton type="submit" primary :disabled="signing" style="margin: 0 auto;">{{ signing ? $ts.loggingIn : $ts.login }}</MkButton>
|
||||||
</div>
|
</div>
|
||||||
@ -27,12 +25,12 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="twofa-group totp-group">
|
<div class="twofa-group totp-group">
|
||||||
<p style="margin-bottom:0;">{{ $ts.twoStepAuthentication }}</p>
|
<p style="margin-bottom:0;">{{ $ts.twoStepAuthentication }}</p>
|
||||||
<MkInput v-model:value="password" type="password" :with-password-toggle="true" v-if="user && user.usePasswordLessLogin" required>
|
<MkInput v-model="password" type="password" :with-password-toggle="true" v-if="user && user.usePasswordLessLogin" required>
|
||||||
<span>{{ $ts.password }}</span>
|
<template #label>{{ $ts.password }}</template>
|
||||||
<template #prefix><i class="fas fa-lock"></i></template>
|
<template #prefix><i class="fas fa-lock"></i></template>
|
||||||
</MkInput>
|
</MkInput>
|
||||||
<MkInput v-model:value="token" type="text" pattern="^[0-9]{6}$" autocomplete="off" spellcheck="false" required>
|
<MkInput v-model="token" type="text" pattern="^[0-9]{6}$" autocomplete="off" spellcheck="false" required>
|
||||||
<span>{{ $ts.token }}</span>
|
<template #label>{{ $ts.token }}</template>
|
||||||
<template #prefix><i class="fas fa-gavel"></i></template>
|
<template #prefix><i class="fas fa-gavel"></i></template>
|
||||||
</MkInput>
|
</MkInput>
|
||||||
<MkButton type="submit" :disabled="signing" primary style="margin: 0 auto;">{{ signing ? $ts.loggingIn : $ts.login }}</MkButton>
|
<MkButton type="submit" :disabled="signing" primary style="margin: 0 auto;">{{ signing ? $ts.loggingIn : $ts.login }}</MkButton>
|
||||||
|
@ -1,39 +1,39 @@
|
|||||||
<template>
|
<template>
|
||||||
<form class="mk-signup" @submit.prevent="onSubmit" :autocomplete="Math.random()">
|
<form class="mk-signup" @submit.prevent="onSubmit" :autocomplete="Math.random()">
|
||||||
<template v-if="meta">
|
<template v-if="meta">
|
||||||
<MkInput v-if="meta.disableRegistration" v-model:value="invitationCode" type="text" :autocomplete="Math.random()" spellcheck="false" required>
|
<MkInput v-if="meta.disableRegistration" v-model="invitationCode" type="text" :autocomplete="Math.random()" spellcheck="false" required>
|
||||||
<span>{{ $ts.invitationCode }}</span>
|
<template #label>{{ $ts.invitationCode }}</template>
|
||||||
<template #prefix><i class="fas fa-key"></i></template>
|
<template #prefix><i class="fas fa-key"></i></template>
|
||||||
</MkInput>
|
</MkInput>
|
||||||
<MkInput v-model:value="username" type="text" pattern="^[a-zA-Z0-9_]{1,20}$" :autocomplete="Math.random()" spellcheck="false" required @update:value="onChangeUsername">
|
<MkInput v-model="username" type="text" pattern="^[a-zA-Z0-9_]{1,20}$" :autocomplete="Math.random()" spellcheck="false" required @update:modelValue="onChangeUsername">
|
||||||
<span>{{ $ts.username }}</span>
|
<template #label>{{ $ts.username }}</template>
|
||||||
<template #prefix>@</template>
|
<template #prefix>@</template>
|
||||||
<template #suffix>@{{ host }}</template>
|
<template #suffix>@{{ host }}</template>
|
||||||
<template #desc>
|
<template #caption>
|
||||||
<span v-if="usernameState == 'wait'" style="color:#999"><i class="fas fa-spinner fa-pulse fa-fw"></i> {{ $ts.checking }}</span>
|
<span v-if="usernameState == 'wait'" style="color:#999"><i class="fas fa-spinner fa-pulse fa-fw"></i> {{ $ts.checking }}</span>
|
||||||
<span v-if="usernameState == 'ok'" style="color:#3CB7B5"><i class="fas fa-check fa-fw"></i> {{ $ts.available }}</span>
|
<span v-if="usernameState == 'ok'" style="color: var(--success)"><i class="fas fa-check fa-fw"></i> {{ $ts.available }}</span>
|
||||||
<span v-if="usernameState == 'unavailable'" style="color:#FF1161"><i class="fas fa-exclamation-triangle fa-fw"></i> {{ $ts.unavailable }}</span>
|
<span v-if="usernameState == 'unavailable'" style="color: var(--error)"><i class="fas fa-exclamation-triangle fa-fw"></i> {{ $ts.unavailable }}</span>
|
||||||
<span v-if="usernameState == 'error'" style="color:#FF1161"><i class="fas fa-exclamation-triangle fa-fw"></i> {{ $ts.error }}</span>
|
<span v-if="usernameState == 'error'" style="color: var(--error)"><i class="fas fa-exclamation-triangle fa-fw"></i> {{ $ts.error }}</span>
|
||||||
<span v-if="usernameState == 'invalid-format'" style="color:#FF1161"><i class="fas fa-exclamation-triangle fa-fw"></i> {{ $ts.usernameInvalidFormat }}</span>
|
<span v-if="usernameState == 'invalid-format'" style="color: var(--error)"><i class="fas fa-exclamation-triangle fa-fw"></i> {{ $ts.usernameInvalidFormat }}</span>
|
||||||
<span v-if="usernameState == 'min-range'" style="color:#FF1161"><i class="fas fa-exclamation-triangle fa-fw"></i> {{ $ts.tooShort }}</span>
|
<span v-if="usernameState == 'min-range'" style="color: var(--error)"><i class="fas fa-exclamation-triangle fa-fw"></i> {{ $ts.tooShort }}</span>
|
||||||
<span v-if="usernameState == 'max-range'" style="color:#FF1161"><i class="fas fa-exclamation-triangle fa-fw"></i> {{ $ts.tooLong }}</span>
|
<span v-if="usernameState == 'max-range'" style="color: var(--error)"><i class="fas fa-exclamation-triangle fa-fw"></i> {{ $ts.tooLong }}</span>
|
||||||
</template>
|
</template>
|
||||||
</MkInput>
|
</MkInput>
|
||||||
<MkInput v-model:value="password" type="password" :autocomplete="Math.random()" required @update:value="onChangePassword">
|
<MkInput v-model="password" type="password" :autocomplete="Math.random()" required @update:modelValue="onChangePassword">
|
||||||
<span>{{ $ts.password }}</span>
|
<template #label>{{ $ts.password }}</template>
|
||||||
<template #prefix><i class="fas fa-lock"></i></template>
|
<template #prefix><i class="fas fa-lock"></i></template>
|
||||||
<template #desc>
|
<template #caption>
|
||||||
<p v-if="passwordStrength == 'low'" style="color:#FF1161"><i class="fas fa-exclamation-triangle fa-fw"></i> {{ $ts.weakPassword }}</p>
|
<span v-if="passwordStrength == 'low'" style="color: var(--error)"><i class="fas fa-exclamation-triangle fa-fw"></i> {{ $ts.weakPassword }}</span>
|
||||||
<p v-if="passwordStrength == 'medium'" style="color:#3CB7B5"><i class="fas fa-check fa-fw"></i> {{ $ts.normalPassword }}</p>
|
<span v-if="passwordStrength == 'medium'" style="color: var(--warn)"><i class="fas fa-check fa-fw"></i> {{ $ts.normalPassword }}</span>
|
||||||
<p v-if="passwordStrength == 'high'" style="color:#3CB7B5"><i class="fas fa-check fa-fw"></i> {{ $ts.strongPassword }}</p>
|
<span v-if="passwordStrength == 'high'" style="color: var(--success)"><i class="fas fa-check fa-fw"></i> {{ $ts.strongPassword }}</span>
|
||||||
</template>
|
</template>
|
||||||
</MkInput>
|
</MkInput>
|
||||||
<MkInput v-model:value="retypedPassword" type="password" :autocomplete="Math.random()" required @update:value="onChangePasswordRetype">
|
<MkInput v-model="retypedPassword" type="password" :autocomplete="Math.random()" required @update:modelValue="onChangePasswordRetype">
|
||||||
<span>{{ $ts.password }} ({{ $ts.retype }})</span>
|
<template #label>{{ $ts.password }} ({{ $ts.retype }})</template>
|
||||||
<template #prefix><i class="fas fa-lock"></i></template>
|
<template #prefix><i class="fas fa-lock"></i></template>
|
||||||
<template #desc>
|
<template #caption>
|
||||||
<p v-if="passwordRetypeState == 'match'" style="color:#3CB7B5"><i class="fas fa-check fa-fw"></i> {{ $ts.passwordMatched }}</p>
|
<span v-if="passwordRetypeState == 'match'" style="color: var(--success)"><i class="fas fa-check fa-fw"></i> {{ $ts.passwordMatched }}</span>
|
||||||
<p v-if="passwordRetypeState == 'not-match'" style="color:#FF1161"><i class="fas fa-exclamation-triangle fa-fw"></i> {{ $ts.passwordNotMatched }}</p>
|
<span v-if="passwordRetypeState == 'not-match'" style="color: var(--error)"><i class="fas fa-exclamation-triangle fa-fw"></i> {{ $ts.passwordNotMatched }}</span>
|
||||||
</template>
|
</template>
|
||||||
</MkInput>
|
</MkInput>
|
||||||
<label v-if="meta.tosUrl" class="tou">
|
<label v-if="meta.tosUrl" class="tou">
|
||||||
|
@ -14,7 +14,7 @@ export default defineComponent({
|
|||||||
class: 'pxhvhrfw',
|
class: 'pxhvhrfw',
|
||||||
}, options.map(option => withDirectives(h('button', {
|
}, options.map(option => withDirectives(h('button', {
|
||||||
class: ['_button', { active: this.value === option.props.value }],
|
class: ['_button', { active: this.value === option.props.value }],
|
||||||
key: option.props.value,
|
key: option.key,
|
||||||
disabled: this.value === option.props.value,
|
disabled: this.value === option.props.value,
|
||||||
onClick: () => {
|
onClick: () => {
|
||||||
this.$emit('update:value', option.props.value);
|
this.$emit('update:value', option.props.value);
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { defineComponent } from 'vue';
|
import { defineComponent, markRaw } from 'vue';
|
||||||
import XNotes from './notes.vue';
|
import XNotes from './notes.vue';
|
||||||
import * as os from '@client/os';
|
import * as os from '@client/os';
|
||||||
import * as sound from '@client/scripts/sound';
|
import * as sound from '@client/scripts/sound';
|
||||||
@ -92,33 +92,33 @@ export default defineComponent({
|
|||||||
this.query = {
|
this.query = {
|
||||||
antennaId: this.antenna
|
antennaId: this.antenna
|
||||||
};
|
};
|
||||||
this.connection = os.stream.useChannel('antenna', {
|
this.connection = markRaw(os.stream.useChannel('antenna', {
|
||||||
antennaId: this.antenna
|
antennaId: this.antenna
|
||||||
});
|
}));
|
||||||
this.connection.on('note', prepend);
|
this.connection.on('note', prepend);
|
||||||
} else if (this.src == 'home') {
|
} else if (this.src == 'home') {
|
||||||
endpoint = 'notes/timeline';
|
endpoint = 'notes/timeline';
|
||||||
this.connection = os.stream.useChannel('homeTimeline');
|
this.connection = markRaw(os.stream.useChannel('homeTimeline'));
|
||||||
this.connection.on('note', prepend);
|
this.connection.on('note', prepend);
|
||||||
|
|
||||||
this.connection2 = os.stream.useChannel('main');
|
this.connection2 = markRaw(os.stream.useChannel('main'));
|
||||||
this.connection2.on('follow', onChangeFollowing);
|
this.connection2.on('follow', onChangeFollowing);
|
||||||
this.connection2.on('unfollow', onChangeFollowing);
|
this.connection2.on('unfollow', onChangeFollowing);
|
||||||
} else if (this.src == 'local') {
|
} else if (this.src == 'local') {
|
||||||
endpoint = 'notes/local-timeline';
|
endpoint = 'notes/local-timeline';
|
||||||
this.connection = os.stream.useChannel('localTimeline');
|
this.connection = markRaw(os.stream.useChannel('localTimeline'));
|
||||||
this.connection.on('note', prepend);
|
this.connection.on('note', prepend);
|
||||||
} else if (this.src == 'social') {
|
} else if (this.src == 'social') {
|
||||||
endpoint = 'notes/hybrid-timeline';
|
endpoint = 'notes/hybrid-timeline';
|
||||||
this.connection = os.stream.useChannel('hybridTimeline');
|
this.connection = markRaw(os.stream.useChannel('hybridTimeline'));
|
||||||
this.connection.on('note', prepend);
|
this.connection.on('note', prepend);
|
||||||
} else if (this.src == 'global') {
|
} else if (this.src == 'global') {
|
||||||
endpoint = 'notes/global-timeline';
|
endpoint = 'notes/global-timeline';
|
||||||
this.connection = os.stream.useChannel('globalTimeline');
|
this.connection = markRaw(os.stream.useChannel('globalTimeline'));
|
||||||
this.connection.on('note', prepend);
|
this.connection.on('note', prepend);
|
||||||
} else if (this.src == 'mentions') {
|
} else if (this.src == 'mentions') {
|
||||||
endpoint = 'notes/mentions';
|
endpoint = 'notes/mentions';
|
||||||
this.connection = os.stream.useChannel('main');
|
this.connection = markRaw(os.stream.useChannel('main'));
|
||||||
this.connection.on('mention', prepend);
|
this.connection.on('mention', prepend);
|
||||||
} else if (this.src == 'directs') {
|
} else if (this.src == 'directs') {
|
||||||
endpoint = 'notes/mentions';
|
endpoint = 'notes/mentions';
|
||||||
@ -130,16 +130,16 @@ export default defineComponent({
|
|||||||
prepend(note);
|
prepend(note);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
this.connection = os.stream.useChannel('main');
|
this.connection = markRaw(os.stream.useChannel('main'));
|
||||||
this.connection.on('mention', onNote);
|
this.connection.on('mention', onNote);
|
||||||
} else if (this.src == 'list') {
|
} else if (this.src == 'list') {
|
||||||
endpoint = 'notes/user-list-timeline';
|
endpoint = 'notes/user-list-timeline';
|
||||||
this.query = {
|
this.query = {
|
||||||
listId: this.list
|
listId: this.list
|
||||||
};
|
};
|
||||||
this.connection = os.stream.useChannel('userList', {
|
this.connection = markRaw(os.stream.useChannel('userList', {
|
||||||
listId: this.list
|
listId: this.list
|
||||||
});
|
}));
|
||||||
this.connection.on('note', prepend);
|
this.connection.on('note', prepend);
|
||||||
this.connection.on('userAdded', onUserAdded);
|
this.connection.on('userAdded', onUserAdded);
|
||||||
this.connection.on('userRemoved', onUserRemoved);
|
this.connection.on('userRemoved', onUserRemoved);
|
||||||
@ -148,9 +148,9 @@ export default defineComponent({
|
|||||||
this.query = {
|
this.query = {
|
||||||
channelId: this.channel
|
channelId: this.channel
|
||||||
};
|
};
|
||||||
this.connection = os.stream.useChannel('channel', {
|
this.connection = markRaw(os.stream.useChannel('channel', {
|
||||||
channelId: this.channel
|
channelId: this.channel
|
||||||
});
|
}));
|
||||||
this.connection.on('note', prepend);
|
this.connection.on('note', prepend);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -14,13 +14,15 @@
|
|||||||
<MkInfo warn>{{ information }}</MkInfo>
|
<MkInfo warn>{{ information }}</MkInfo>
|
||||||
</div>
|
</div>
|
||||||
<div class="_section">
|
<div class="_section">
|
||||||
<MkInput v-model:value="name">{{ $ts.name }}</MkInput>
|
<MkInput v-model="name">
|
||||||
|
<template #label>{{ $ts.name }}</template>
|
||||||
|
</MkInput>
|
||||||
</div>
|
</div>
|
||||||
<div class="_section">
|
<div class="_section">
|
||||||
<div style="margin-bottom: 16px;"><b>{{ $ts.permission }}</b></div>
|
<div style="margin-bottom: 16px;"><b>{{ $ts.permission }}</b></div>
|
||||||
<MkButton inline @click="disableAll">{{ $ts.disableAll }}</MkButton>
|
<MkButton inline @click="disableAll">{{ $ts.disableAll }}</MkButton>
|
||||||
<MkButton inline @click="enableAll">{{ $ts.enableAll }}</MkButton>
|
<MkButton inline @click="enableAll">{{ $ts.enableAll }}</MkButton>
|
||||||
<MkSwitch v-for="kind in (initialPermissions || kinds)" :key="kind" v-model:value="permissions[kind]">{{ $t(`_permissions.${kind}`) }}</MkSwitch>
|
<MkSwitch v-for="kind in (initialPermissions || kinds)" :key="kind" v-model="permissions[kind]">{{ $t(`_permissions.${kind}`) }}</MkSwitch>
|
||||||
</div>
|
</div>
|
||||||
</XModalWindow>
|
</XModalWindow>
|
||||||
</template>
|
</template>
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
<template>
|
<template>
|
||||||
<component class="bghgjjyj _button"
|
<component class="bghgjjyj _button"
|
||||||
:is="link ? 'a' : 'button'"
|
:is="link ? 'MkA' : 'button'"
|
||||||
:class="{ inline, primary, danger, full }"
|
:class="{ inline, primary, danger, full }"
|
||||||
:type="type"
|
:type="type"
|
||||||
@click="$emit('click', $event)"
|
@click="$emit('click', $event)"
|
||||||
@ -115,6 +115,7 @@ export default defineComponent({
|
|||||||
z-index: 1; // 他コンポーネントのbox-shadowに隠されないようにするため
|
z-index: 1; // 他コンポーネントのbox-shadowに隠されないようにするため
|
||||||
display: block;
|
display: block;
|
||||||
min-width: 100px;
|
min-width: 100px;
|
||||||
|
width: max-content;
|
||||||
padding: 8px 14px;
|
padding: 8px 14px;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
font-weight: normal;
|
font-weight: normal;
|
||||||
@ -125,6 +126,8 @@ export default defineComponent({
|
|||||||
background: var(--buttonBg);
|
background: var(--buttonBg);
|
||||||
border-radius: 999px;
|
border-radius: 999px;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
|
box-sizing: border-box;
|
||||||
|
transition: background 0.1s ease;
|
||||||
|
|
||||||
&:not(:disabled):hover {
|
&:not(:disabled):hover {
|
||||||
background: var(--buttonHoverBg);
|
background: var(--buttonHoverBg);
|
||||||
@ -140,7 +143,7 @@ export default defineComponent({
|
|||||||
|
|
||||||
&.primary {
|
&.primary {
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
color: #fff !important;
|
color: var(--fgOnAccent) !important;
|
||||||
background: var(--accent);
|
background: var(--accent);
|
||||||
|
|
||||||
&:not(:disabled):hover {
|
&:not(:disabled):hover {
|
||||||
|
@ -191,6 +191,8 @@ export default defineComponent({
|
|||||||
}
|
}
|
||||||
|
|
||||||
> .content {
|
> .content {
|
||||||
|
--stickyTop: 0px;
|
||||||
|
|
||||||
&.omitted {
|
&.omitted {
|
||||||
position: relative;
|
position: relative;
|
||||||
max-height: var(--maxHeight);
|
max-height: var(--maxHeight);
|
||||||
|
@ -99,9 +99,12 @@ export default defineComponent({
|
|||||||
z-index: 10;
|
z-index: 10;
|
||||||
position: sticky;
|
position: sticky;
|
||||||
top: var(--stickyTop, 0px);
|
top: var(--stickyTop, 0px);
|
||||||
|
background: var(--panel);
|
||||||
|
/* TODO panelの半透明バージョンをプログラマティックに作りたい
|
||||||
background: var(--X17);
|
background: var(--X17);
|
||||||
-webkit-backdrop-filter: blur(8px);
|
-webkit-backdrop-filter: blur(8px);
|
||||||
backdrop-filter: blur(20px);
|
backdrop-filter: blur(20px);
|
||||||
|
*/
|
||||||
|
|
||||||
> .title {
|
> .title {
|
||||||
margin: 0;
|
margin: 0;
|
||||||
|
@ -1,32 +1,9 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="juejbjww" :class="{ focused, filled, inline, disabled }">
|
<div class="matxzzsk">
|
||||||
<div class="icon" ref="icon"><slot name="icon"></slot></div>
|
<div class="label" @click="focus"><slot name="label"></slot></div>
|
||||||
<div class="input">
|
<div class="input" :class="{ inline, disabled, focused }">
|
||||||
<span class="label" ref="labelEl"><slot></slot></span>
|
|
||||||
<span class="title" ref="title">
|
|
||||||
<slot name="title"></slot>
|
|
||||||
<span class="warning" v-if="invalid"><i class="fas fa-exclamation-circle"></i>{{ $refs.input.validationMessage }}</span>
|
|
||||||
</span>
|
|
||||||
<div class="prefix" ref="prefixEl"><slot name="prefix"></slot></div>
|
<div class="prefix" ref="prefixEl"><slot name="prefix"></slot></div>
|
||||||
<input v-if="debounce" ref="inputEl"
|
<input ref="inputEl"
|
||||||
v-debounce="500"
|
|
||||||
:type="type"
|
|
||||||
v-model.lazy="v"
|
|
||||||
:disabled="disabled"
|
|
||||||
:required="required"
|
|
||||||
:readonly="readonly"
|
|
||||||
:placeholder="placeholder"
|
|
||||||
:pattern="pattern"
|
|
||||||
:autocomplete="autocomplete"
|
|
||||||
:spellcheck="spellcheck"
|
|
||||||
:step="step"
|
|
||||||
@focus="focused = true"
|
|
||||||
@blur="focused = false"
|
|
||||||
@keydown="onKeydown($event)"
|
|
||||||
@input="onInput"
|
|
||||||
:list="id"
|
|
||||||
>
|
|
||||||
<input v-else ref="inputEl"
|
|
||||||
:type="type"
|
:type="type"
|
||||||
v-model="v"
|
v-model="v"
|
||||||
:disabled="disabled"
|
:disabled="disabled"
|
||||||
@ -48,23 +25,25 @@
|
|||||||
</datalist>
|
</datalist>
|
||||||
<div class="suffix" ref="suffixEl"><slot name="suffix"></slot></div>
|
<div class="suffix" ref="suffixEl"><slot name="suffix"></slot></div>
|
||||||
</div>
|
</div>
|
||||||
<button class="save _textButton" v-if="save && changed" @click="() => { changed = false; save(); }">{{ $ts.save }}</button>
|
<div class="caption"><slot name="caption"></slot></div>
|
||||||
<div class="desc _caption"><slot name="desc"></slot></div>
|
|
||||||
|
<MkButton v-if="manualSave && changed" @click="updated" primary><i class="fas fa-save"></i> {{ $ts.save }}</MkButton>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { defineComponent, onMounted, onUnmounted, nextTick, ref, watch, computed, toRefs } from 'vue';
|
import { defineComponent, onMounted, onUnmounted, nextTick, ref, watch, computed, toRefs } from 'vue';
|
||||||
import debounce from 'v-debounce';
|
import MkButton from './button.vue';
|
||||||
import * as os from '@client/os';
|
import { debounce } from 'throttle-debounce';
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
directives: {
|
components: {
|
||||||
debounce
|
MkButton,
|
||||||
},
|
},
|
||||||
|
|
||||||
props: {
|
props: {
|
||||||
value: {
|
modelValue: {
|
||||||
required: false
|
required: true
|
||||||
},
|
},
|
||||||
type: {
|
type: {
|
||||||
type: String,
|
type: String,
|
||||||
@ -104,9 +83,6 @@ export default defineComponent({
|
|||||||
step: {
|
step: {
|
||||||
required: false
|
required: false
|
||||||
},
|
},
|
||||||
debounce: {
|
|
||||||
required: false
|
|
||||||
},
|
|
||||||
datalist: {
|
datalist: {
|
||||||
type: Array,
|
type: Array,
|
||||||
required: false,
|
required: false,
|
||||||
@ -116,15 +92,23 @@ export default defineComponent({
|
|||||||
required: false,
|
required: false,
|
||||||
default: false
|
default: false
|
||||||
},
|
},
|
||||||
save: {
|
debounce: {
|
||||||
type: Function,
|
type: Boolean,
|
||||||
required: false,
|
required: false,
|
||||||
|
default: false
|
||||||
|
},
|
||||||
|
manualSave: {
|
||||||
|
type: Boolean,
|
||||||
|
required: false,
|
||||||
|
default: false
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
emits: ['change', 'keydown', 'enter'],
|
|
||||||
|
emits: ['change', 'keydown', 'enter', 'update:modelValue'],
|
||||||
|
|
||||||
setup(props, context) {
|
setup(props, context) {
|
||||||
const { value, type, autofocus } = toRefs(props);
|
const { modelValue, type, autofocus } = toRefs(props);
|
||||||
const v = ref(value.value);
|
const v = ref(modelValue.value);
|
||||||
const id = Math.random().toString(); // TODO: uuid?
|
const id = Math.random().toString(); // TODO: uuid?
|
||||||
const focused = ref(false);
|
const focused = ref(false);
|
||||||
const changed = ref(false);
|
const changed = ref(false);
|
||||||
@ -133,7 +117,6 @@ export default defineComponent({
|
|||||||
const inputEl = ref(null);
|
const inputEl = ref(null);
|
||||||
const prefixEl = ref(null);
|
const prefixEl = ref(null);
|
||||||
const suffixEl = ref(null);
|
const suffixEl = ref(null);
|
||||||
const labelEl = ref(null);
|
|
||||||
|
|
||||||
const focus = () => inputEl.value.focus();
|
const focus = () => inputEl.value.focus();
|
||||||
const onInput = (ev) => {
|
const onInput = (ev) => {
|
||||||
@ -148,15 +131,28 @@ export default defineComponent({
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
watch(value, newValue => {
|
const updated = () => {
|
||||||
|
changed.value = false;
|
||||||
|
if (type?.value === 'number') {
|
||||||
|
context.emit('update:modelValue', parseFloat(v.value));
|
||||||
|
} else {
|
||||||
|
context.emit('update:modelValue', v.value);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const debouncedUpdated = debounce(1000, updated);
|
||||||
|
|
||||||
|
watch(modelValue, newValue => {
|
||||||
v.value = newValue;
|
v.value = newValue;
|
||||||
});
|
});
|
||||||
|
|
||||||
watch(v, newValue => {
|
watch(v, newValue => {
|
||||||
if (type?.value === 'number') {
|
if (!props.manualSave) {
|
||||||
context.emit('update:value', parseFloat(newValue));
|
if (props.debounce) {
|
||||||
} else {
|
debouncedUpdated();
|
||||||
context.emit('update:value', newValue);
|
} else {
|
||||||
|
updated();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
invalid.value = inputEl.value.validity.badInput;
|
invalid.value = inputEl.value.validity.badInput;
|
||||||
@ -172,7 +168,6 @@ export default defineComponent({
|
|||||||
// 非表示状態だと要素の幅などは0になってしまうので、定期的に計算する
|
// 非表示状態だと要素の幅などは0になってしまうので、定期的に計算する
|
||||||
const clock = setInterval(() => {
|
const clock = setInterval(() => {
|
||||||
if (prefixEl.value) {
|
if (prefixEl.value) {
|
||||||
labelEl.value.style.left = (prefixEl.value.offsetLeft + prefixEl.value.offsetWidth) + 'px';
|
|
||||||
if (prefixEl.value.offsetWidth) {
|
if (prefixEl.value.offsetWidth) {
|
||||||
inputEl.value.style.paddingLeft = prefixEl.value.offsetWidth + 'px';
|
inputEl.value.style.paddingLeft = prefixEl.value.offsetWidth + 'px';
|
||||||
}
|
}
|
||||||
@ -200,148 +195,78 @@ export default defineComponent({
|
|||||||
inputEl,
|
inputEl,
|
||||||
prefixEl,
|
prefixEl,
|
||||||
suffixEl,
|
suffixEl,
|
||||||
labelEl,
|
|
||||||
focus,
|
focus,
|
||||||
onInput,
|
onInput,
|
||||||
onKeydown,
|
onKeydown,
|
||||||
|
updated,
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="scss" scoped>
|
<style lang="scss" scoped>
|
||||||
.juejbjww {
|
.matxzzsk {
|
||||||
position: relative;
|
margin: 1.5em 0;
|
||||||
margin: 32px 0;
|
|
||||||
|
|
||||||
&:not(.inline):first-child {
|
> .label {
|
||||||
margin-top: 8px;
|
font-size: 0.85em;
|
||||||
|
padding: 0 0 8px 12px;
|
||||||
|
user-select: none;
|
||||||
|
|
||||||
|
&:empty {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
&:not(.inline):last-child {
|
> .caption {
|
||||||
margin-bottom: 8px;
|
font-size: 0.8em;
|
||||||
}
|
padding: 8px 0 0 12px;
|
||||||
|
color: var(--fgTransparentWeak);
|
||||||
|
|
||||||
> .icon {
|
&:empty {
|
||||||
position: absolute;
|
display: none;
|
||||||
top: 0;
|
|
||||||
left: 0;
|
|
||||||
width: 24px;
|
|
||||||
text-align: center;
|
|
||||||
line-height: 32px;
|
|
||||||
|
|
||||||
&:not(:empty) + .input {
|
|
||||||
margin-left: 28px;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
> .input {
|
> .input {
|
||||||
|
$height: 42px;
|
||||||
position: relative;
|
position: relative;
|
||||||
|
|
||||||
&:before {
|
|
||||||
content: '';
|
|
||||||
display: block;
|
|
||||||
position: absolute;
|
|
||||||
bottom: 0;
|
|
||||||
left: 0;
|
|
||||||
right: 0;
|
|
||||||
height: 1px;
|
|
||||||
background: var(--inputBorder);
|
|
||||||
}
|
|
||||||
|
|
||||||
&:after {
|
|
||||||
content: '';
|
|
||||||
display: block;
|
|
||||||
position: absolute;
|
|
||||||
bottom: 0;
|
|
||||||
left: 0;
|
|
||||||
right: 0;
|
|
||||||
height: 2px;
|
|
||||||
background: var(--accent);
|
|
||||||
opacity: 0;
|
|
||||||
transform: scaleX(0.12);
|
|
||||||
transition: border 0.3s cubic-bezier(0.4, 0, 0.2, 1), opacity 0.3s cubic-bezier(0.4, 0, 0.2, 1), transform 0.3s cubic-bezier(0.4, 0, 0.2, 1);
|
|
||||||
will-change: border opacity transform;
|
|
||||||
}
|
|
||||||
|
|
||||||
> .label {
|
|
||||||
position: absolute;
|
|
||||||
z-index: 1;
|
|
||||||
top: 0;
|
|
||||||
left: 0;
|
|
||||||
pointer-events: none;
|
|
||||||
transition: 0.4s cubic-bezier(0.25, 0.8, 0.25, 1);
|
|
||||||
transition-duration: 0.3s;
|
|
||||||
font-size: 1em;
|
|
||||||
line-height: 32px;
|
|
||||||
color: var(--inputLabel);
|
|
||||||
pointer-events: none;
|
|
||||||
//will-change transform
|
|
||||||
transform-origin: top left;
|
|
||||||
transform: scale(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
> .title {
|
|
||||||
position: absolute;
|
|
||||||
z-index: 1;
|
|
||||||
top: -17px;
|
|
||||||
left: 0 !important;
|
|
||||||
pointer-events: none;
|
|
||||||
font-size: 1em;
|
|
||||||
line-height: 32px;
|
|
||||||
color: var(--inputLabel);
|
|
||||||
pointer-events: none;
|
|
||||||
//will-change transform
|
|
||||||
transform-origin: top left;
|
|
||||||
transform: scale(.75);
|
|
||||||
white-space: nowrap;
|
|
||||||
width: 133%;
|
|
||||||
overflow: hidden;
|
|
||||||
text-overflow: ellipsis;
|
|
||||||
|
|
||||||
> .warning {
|
|
||||||
margin-left: 0.5em;
|
|
||||||
color: var(--infoWarnFg);
|
|
||||||
|
|
||||||
> svg {
|
|
||||||
margin-right: 0.1em;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
> input {
|
> input {
|
||||||
$height: 32px;
|
appearance: none;
|
||||||
|
-webkit-appearance: none;
|
||||||
display: block;
|
display: block;
|
||||||
height: $height;
|
height: $height;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
margin: 0;
|
margin: 0;
|
||||||
padding: 0;
|
padding: 0 12px;
|
||||||
font: inherit;
|
font: inherit;
|
||||||
font-weight: normal;
|
font-weight: normal;
|
||||||
font-size: 1em;
|
font-size: 1em;
|
||||||
line-height: $height;
|
color: var(--fg);
|
||||||
color: var(--inputText);
|
background: var(--panel);
|
||||||
background: transparent;
|
border: solid 1px var(--inputBorder);
|
||||||
border: none;
|
border-radius: 6px;
|
||||||
border-radius: 0;
|
|
||||||
outline: none;
|
outline: none;
|
||||||
box-shadow: none;
|
box-shadow: none;
|
||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
|
transition: border-color 0.1s ease-out;
|
||||||
|
|
||||||
&[type='file'] {
|
&:hover {
|
||||||
display: none;
|
border-color: var(--inputBorderHover);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
> .prefix,
|
> .prefix,
|
||||||
> .suffix {
|
> .suffix {
|
||||||
display: block;
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
position: absolute;
|
position: absolute;
|
||||||
z-index: 1;
|
z-index: 1;
|
||||||
top: 0;
|
top: 0;
|
||||||
|
padding: 0 12px;
|
||||||
font-size: 1em;
|
font-size: 1em;
|
||||||
line-height: 32px;
|
height: $height;
|
||||||
color: var(--inputLabel);
|
|
||||||
pointer-events: none;
|
pointer-events: none;
|
||||||
|
|
||||||
&:empty {
|
&:empty {
|
||||||
@ -360,67 +285,33 @@ export default defineComponent({
|
|||||||
|
|
||||||
> .prefix {
|
> .prefix {
|
||||||
left: 0;
|
left: 0;
|
||||||
padding-right: 4px;
|
padding-right: 6px;
|
||||||
}
|
}
|
||||||
|
|
||||||
> .suffix {
|
> .suffix {
|
||||||
right: 0;
|
right: 0;
|
||||||
padding-left: 4px;
|
padding-left: 6px;
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
> .save {
|
|
||||||
margin: 6px 0 0 0;
|
|
||||||
font-size: 0.8em;
|
|
||||||
}
|
|
||||||
|
|
||||||
> .desc {
|
|
||||||
margin: 6px 0 0 0;
|
|
||||||
|
|
||||||
&:empty {
|
|
||||||
display: none;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
* {
|
&.inline {
|
||||||
|
display: inline-block;
|
||||||
margin: 0;
|
margin: 0;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
&.focused {
|
&.focused {
|
||||||
> .input {
|
> input {
|
||||||
&:after {
|
border-color: var(--accent);
|
||||||
opacity: 1;
|
//box-shadow: 0 0 0 4px var(--focus);
|
||||||
transform: scaleX(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
> .label {
|
|
||||||
color: var(--accent);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
&.focused,
|
&.disabled {
|
||||||
&.filled {
|
opacity: 0.7;
|
||||||
> .input {
|
|
||||||
> .label {
|
&, * {
|
||||||
top: -17px;
|
cursor: not-allowed !important;
|
||||||
left: 0 !important;
|
|
||||||
transform: scale(0.75);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
&.inline {
|
|
||||||
display: inline-block;
|
|
||||||
margin: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
&.disabled {
|
|
||||||
opacity: 0.7;
|
|
||||||
|
|
||||||
&, * {
|
|
||||||
cursor: not-allowed !important;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="rrevdjwt" :class="{ left: align === 'left' }"
|
<div class="rrevdjwt" :class="{ left: align === 'left', pointer: point === 'top' }"
|
||||||
ref="items"
|
ref="items"
|
||||||
@contextmenu.self="e => e.preventDefault()"
|
@contextmenu.self="e => e.preventDefault()"
|
||||||
v-hotkey="keymap"
|
v-hotkey="keymap"
|
||||||
@ -58,7 +58,11 @@ export default defineComponent({
|
|||||||
align: {
|
align: {
|
||||||
type: String,
|
type: String,
|
||||||
requried: false
|
requried: false
|
||||||
}
|
},
|
||||||
|
point: {
|
||||||
|
type: String,
|
||||||
|
requried: false
|
||||||
|
},
|
||||||
},
|
},
|
||||||
emits: ['close'],
|
emits: ['close'],
|
||||||
data() {
|
data() {
|
||||||
@ -137,6 +141,22 @@ export default defineComponent({
|
|||||||
.rrevdjwt {
|
.rrevdjwt {
|
||||||
padding: 8px 0;
|
padding: 8px 0;
|
||||||
|
|
||||||
|
&.pointer {
|
||||||
|
&:before {
|
||||||
|
--size: 8px;
|
||||||
|
content: '';
|
||||||
|
display: block;
|
||||||
|
position: absolute;
|
||||||
|
top: calc(0px - (var(--size) * 2));
|
||||||
|
left: 0;
|
||||||
|
right: 0;
|
||||||
|
width: 0;
|
||||||
|
margin: auto;
|
||||||
|
border: solid var(--size) transparent;
|
||||||
|
border-bottom-color: var(--popup);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
&.left {
|
&.left {
|
||||||
> .item {
|
> .item {
|
||||||
text-align: left;
|
text-align: left;
|
||||||
@ -171,13 +191,13 @@ export default defineComponent({
|
|||||||
}
|
}
|
||||||
|
|
||||||
&:hover {
|
&:hover {
|
||||||
color: #fff;
|
color: var(--fgOnAccent);
|
||||||
background: var(--accent);
|
background: var(--accent);
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
&:active {
|
&:active {
|
||||||
color: #fff;
|
color: var(--fgOnAccent);
|
||||||
background: var(--accentDarken);
|
background: var(--accentDarken);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
<template>
|
<template>
|
||||||
<MkModal ref="modal" @click="$emit('click')" @closed="$emit('closed')">
|
<MkModal ref="modal" @click="$emit('click')" @closed="$emit('closed')">
|
||||||
<div class="ebkgoccj _popup _narrow_" @keydown="onKeydown" :style="{ width: `${width}px`, height: scroll ? (height ? `${height}px` : null) : (height ? `min(${height}px, 100%)` : '100%') }">
|
<div class="ebkgoccj _window _narrow_" @keydown="onKeydown" :style="{ width: `${width}px`, height: scroll ? (height ? `${height}px` : null) : (height ? `min(${height}px, 100%)` : '100%') }">
|
||||||
<div class="header">
|
<div class="header">
|
||||||
<button class="_button" v-if="withOkButton" @click="$emit('close')"><i class="fas fa-times"></i></button>
|
<button class="_button" v-if="withOkButton" @click="$emit('close')"><i class="fas fa-times"></i></button>
|
||||||
<span class="title">
|
<span class="title">
|
||||||
|
@ -1,19 +1,20 @@
|
|||||||
<template>
|
<template>
|
||||||
<MkModal ref="modal" :src="src" @click="$refs.modal.close()" @closed="$emit('closed')">
|
<MkPopup ref="popup" :src="src" @closed="$emit('closed')" #default="{point}">
|
||||||
<MkMenu :items="items" :align="align" @close="$refs.modal.close()" class="_popup"/>
|
<MkMenu :items="items" :align="align" :point="point" @close="$refs.popup.close()" class="_popup _shadow"/>
|
||||||
</MkModal>
|
</MkPopup>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { defineComponent } from 'vue';
|
import { defineComponent } from 'vue';
|
||||||
import MkModal from './modal.vue';
|
import MkPopup from './popup.vue';
|
||||||
import MkMenu from './menu.vue';
|
import MkMenu from './menu.vue';
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
components: {
|
components: {
|
||||||
MkModal,
|
MkPopup,
|
||||||
MkMenu,
|
MkMenu,
|
||||||
},
|
},
|
||||||
|
|
||||||
props: {
|
props: {
|
||||||
items: {
|
items: {
|
||||||
type: Array,
|
type: Array,
|
||||||
@ -31,17 +32,7 @@ export default defineComponent({
|
|||||||
required: false
|
required: false
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
emits: ['closed'],
|
|
||||||
computed: {
|
emits: ['close', 'closed'],
|
||||||
keymap(): any {
|
|
||||||
return {
|
|
||||||
'esc': () => this.$refs.modal.close(),
|
|
||||||
};
|
|
||||||
},
|
|
||||||
},
|
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="scss" scoped>
|
|
||||||
|
|
||||||
</style>
|
|
216
src/client/components/ui/popup.vue
Normal file
216
src/client/components/ui/popup.vue
Normal file
@ -0,0 +1,216 @@
|
|||||||
|
<template>
|
||||||
|
<transition :name="$store.state.animation ? 'popup-menu' : ''" :duration="$store.state.animation ? 300 : 0" appear @after-leave="onClosed" @enter="$emit('opening')" @after-enter="childRendered">
|
||||||
|
<div v-show="manualShowing != null ? manualShowing : showing" class="ccczpooj" :class="{ front, fixed, top: position === 'top' }" ref="content" :style="{ pointerEvents: (manualShowing != null ? manualShowing : showing) ? 'auto' : 'none', '--transformOrigin': transformOrigin }">
|
||||||
|
<slot :point="point"></slot>
|
||||||
|
</div>
|
||||||
|
</transition>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts">
|
||||||
|
import { defineComponent, PropType } from 'vue';
|
||||||
|
|
||||||
|
function getFixedContainer(el: Element | null): Element | null {
|
||||||
|
if (el == null || el.tagName === 'BODY') return null;
|
||||||
|
const position = window.getComputedStyle(el).getPropertyValue('position');
|
||||||
|
if (position === 'fixed') {
|
||||||
|
return el;
|
||||||
|
} else {
|
||||||
|
return getFixedContainer(el.parentElement);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export default defineComponent({
|
||||||
|
props: {
|
||||||
|
manualShowing: {
|
||||||
|
type: Boolean,
|
||||||
|
required: false,
|
||||||
|
default: null,
|
||||||
|
},
|
||||||
|
srcCenter: {
|
||||||
|
type: Boolean,
|
||||||
|
required: false
|
||||||
|
},
|
||||||
|
src: {
|
||||||
|
type: Object as PropType<HTMLElement>,
|
||||||
|
required: false,
|
||||||
|
},
|
||||||
|
position: {
|
||||||
|
required: false
|
||||||
|
},
|
||||||
|
front: {
|
||||||
|
type: Boolean,
|
||||||
|
required: false,
|
||||||
|
default: false,
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
emits: ['opening', 'click', 'esc', 'close', 'closed'],
|
||||||
|
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
showing: true,
|
||||||
|
fixed: false,
|
||||||
|
transformOrigin: 'center',
|
||||||
|
contentClicking: false,
|
||||||
|
point: null,
|
||||||
|
};
|
||||||
|
},
|
||||||
|
|
||||||
|
mounted() {
|
||||||
|
this.$watch('src', () => {
|
||||||
|
if (this.src) {
|
||||||
|
this.src.style.pointerEvents = 'none';
|
||||||
|
}
|
||||||
|
this.fixed = getFixedContainer(this.src) != null;
|
||||||
|
this.$nextTick(() => {
|
||||||
|
this.align();
|
||||||
|
});
|
||||||
|
}, { immediate: true });
|
||||||
|
|
||||||
|
this.$nextTick(() => {
|
||||||
|
const popover = this.$refs.content as any;
|
||||||
|
new ResizeObserver((entries, observer) => {
|
||||||
|
this.align();
|
||||||
|
}).observe(popover);
|
||||||
|
});
|
||||||
|
|
||||||
|
document.addEventListener('mousedown', this.onDocumentClick, { passive: true });
|
||||||
|
},
|
||||||
|
|
||||||
|
beforeUnmount() {
|
||||||
|
document.removeEventListener('mousedown', this.onDocumentClick);
|
||||||
|
},
|
||||||
|
|
||||||
|
methods: {
|
||||||
|
align() {
|
||||||
|
if (this.src == null) return;
|
||||||
|
|
||||||
|
const popover = this.$refs.content as any;
|
||||||
|
|
||||||
|
if (popover == null) return;
|
||||||
|
|
||||||
|
const rect = this.src.getBoundingClientRect();
|
||||||
|
|
||||||
|
const width = popover.offsetWidth;
|
||||||
|
const height = popover.offsetHeight;
|
||||||
|
|
||||||
|
let left;
|
||||||
|
let top;
|
||||||
|
|
||||||
|
if (this.srcCenter) {
|
||||||
|
const x = rect.left + (this.fixed ? 0 : window.pageXOffset) + (this.src.offsetWidth / 2);
|
||||||
|
const y = rect.top + (this.fixed ? 0 : window.pageYOffset) + (this.src.offsetHeight / 2);
|
||||||
|
left = (x - (width / 2));
|
||||||
|
top = (y - (height / 2));
|
||||||
|
} else {
|
||||||
|
const x = rect.left + (this.fixed ? 0 : window.pageXOffset) + (this.src.offsetWidth / 2);
|
||||||
|
const y = rect.top + (this.fixed ? 0 : window.pageYOffset) + this.src.offsetHeight;
|
||||||
|
left = (x - (width / 2));
|
||||||
|
top = y;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.fixed) {
|
||||||
|
if (left + width > window.innerWidth) {
|
||||||
|
left = window.innerWidth - width;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (top + height > window.innerHeight) {
|
||||||
|
top = window.innerHeight - height;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (left + width - window.pageXOffset > window.innerWidth) {
|
||||||
|
left = window.innerWidth - width + window.pageXOffset - 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (top + height - window.pageYOffset > window.innerHeight) {
|
||||||
|
top = window.innerHeight - height + window.pageYOffset - 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (top < 0) {
|
||||||
|
top = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (left < 0) {
|
||||||
|
left = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (top > rect.top + (this.fixed ? 0 : window.pageYOffset)) {
|
||||||
|
this.point = 'top';
|
||||||
|
this.transformOrigin = 'center top';
|
||||||
|
} else {
|
||||||
|
this.point = null;
|
||||||
|
this.transformOrigin = 'center';
|
||||||
|
}
|
||||||
|
|
||||||
|
popover.style.left = left + 'px';
|
||||||
|
popover.style.top = top + 'px';
|
||||||
|
},
|
||||||
|
|
||||||
|
childRendered() {
|
||||||
|
// モーダルコンテンツにマウスボタンが押され、コンテンツ外でマウスボタンが離されたときにモーダルバックグラウンドクリックと判定させないためにマウスイベントを監視しフラグ管理する
|
||||||
|
const content = this.$refs.content.children[0];
|
||||||
|
content.addEventListener('mousedown', e => {
|
||||||
|
this.contentClicking = true;
|
||||||
|
window.addEventListener('mouseup', e => {
|
||||||
|
// click イベントより先に mouseup イベントが発生するかもしれないのでちょっと待つ
|
||||||
|
setTimeout(() => {
|
||||||
|
this.contentClicking = false;
|
||||||
|
}, 100);
|
||||||
|
}, { passive: true, once: true });
|
||||||
|
}, { passive: true });
|
||||||
|
},
|
||||||
|
|
||||||
|
close() {
|
||||||
|
if (this.src) this.src.style.pointerEvents = 'auto';
|
||||||
|
this.showing = false;
|
||||||
|
this.$emit('close');
|
||||||
|
},
|
||||||
|
|
||||||
|
onClosed() {
|
||||||
|
this.$emit('closed');
|
||||||
|
},
|
||||||
|
|
||||||
|
onDocumentClick(ev) {
|
||||||
|
const flyoutElement = this.$refs.content;
|
||||||
|
let targetElement = ev.target;
|
||||||
|
do {
|
||||||
|
if (targetElement === flyoutElement) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
targetElement = targetElement.parentNode;
|
||||||
|
} while (targetElement);
|
||||||
|
this.close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
.popup-menu-enter-active {
|
||||||
|
transform-origin: var(--transformOrigin);
|
||||||
|
transition: opacity 0.2s cubic-bezier(0, 0, 0.2, 1), transform 0.2s cubic-bezier(0, 0, 0.2, 1) !important;
|
||||||
|
}
|
||||||
|
.popup-menu-leave-active {
|
||||||
|
transform-origin: var(--transformOrigin);
|
||||||
|
transition: opacity 0.2s cubic-bezier(0.4, 0, 1, 1), transform 0.2s cubic-bezier(0.4, 0, 1, 1) !important;
|
||||||
|
}
|
||||||
|
.popup-menu-enter-from, .popup-menu-leave-to {
|
||||||
|
pointer-events: none;
|
||||||
|
opacity: 0;
|
||||||
|
transform: scale(0.9);
|
||||||
|
}
|
||||||
|
|
||||||
|
.ccczpooj {
|
||||||
|
position: absolute;
|
||||||
|
z-index: 10000;
|
||||||
|
|
||||||
|
&.fixed {
|
||||||
|
position: fixed;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.front {
|
||||||
|
z-index: 20000;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
@ -23,14 +23,17 @@ export default defineComponent({
|
|||||||
},
|
},
|
||||||
render() {
|
render() {
|
||||||
const label = this.$slots.desc();
|
const label = this.$slots.desc();
|
||||||
const options = this.$slots.default();
|
let options = this.$slots.default();
|
||||||
|
|
||||||
|
// なぜかFragmentになることがあるため
|
||||||
|
if (options.length === 1 && options[0].props == null) options = options[0].children;
|
||||||
|
|
||||||
return h('div', {
|
return h('div', {
|
||||||
class: 'novjtcto'
|
class: 'novjtcto'
|
||||||
}, [
|
}, [
|
||||||
h('div', label),
|
h('div', label),
|
||||||
...options.map(option => h(MkRadio, {
|
...options.map(option => h(MkRadio, {
|
||||||
key: option.props.value,
|
key: option.key,
|
||||||
value: option.props.value,
|
value: option.props.value,
|
||||||
modelValue: this.value,
|
modelValue: this.value,
|
||||||
'onUpdate:modelValue': value => this.value = value,
|
'onUpdate:modelValue': value => this.value = value,
|
||||||
|
@ -1,185 +1,218 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="eiipwacr" :class="{ focused, disabled, filled, inline }">
|
<div class="vblkjoeq">
|
||||||
<div class="icon" ref="icon"><slot name="icon"></slot></div>
|
<div class="label" @click="focus"><slot name="label"></slot></div>
|
||||||
<div class="input" @click="focus">
|
<div class="input" :class="{ inline, disabled, focused }">
|
||||||
<span class="label" ref="label"><slot name="label"></slot></span>
|
<div class="prefix" ref="prefixEl"><slot name="prefix"></slot></div>
|
||||||
<div class="prefix" ref="prefix"><slot name="prefix"></slot></div>
|
<select ref="inputEl"
|
||||||
<select ref="input"
|
|
||||||
v-model="v"
|
v-model="v"
|
||||||
:required="required"
|
|
||||||
:disabled="disabled"
|
:disabled="disabled"
|
||||||
|
:required="required"
|
||||||
|
:readonly="readonly"
|
||||||
|
:placeholder="placeholder"
|
||||||
@focus="focused = true"
|
@focus="focused = true"
|
||||||
@blur="focused = false"
|
@blur="focused = false"
|
||||||
|
@input="onInput"
|
||||||
>
|
>
|
||||||
<slot></slot>
|
<slot></slot>
|
||||||
</select>
|
</select>
|
||||||
<div class="suffix">
|
<div class="suffix" ref="suffixEl"><i class="fas fa-chevron-down"></i></div>
|
||||||
<slot name="suffix">
|
|
||||||
<i class="fas fa-chevron-down"></i>
|
|
||||||
</slot>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
<div class="text"><slot name="text"></slot></div>
|
<div class="caption"><slot name="caption"></slot></div>
|
||||||
|
|
||||||
|
<MkButton v-if="manualSave && changed" @click="updated" primary><i class="fas fa-save"></i> {{ $ts.save }}</MkButton>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { defineComponent } from 'vue';
|
import { defineComponent, onMounted, onUnmounted, nextTick, ref, watch, computed, toRefs } from 'vue';
|
||||||
|
import MkButton from './button.vue';
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
|
components: {
|
||||||
|
MkButton,
|
||||||
|
},
|
||||||
|
|
||||||
props: {
|
props: {
|
||||||
value: {
|
modelValue: {
|
||||||
required: false
|
required: true
|
||||||
},
|
},
|
||||||
required: {
|
required: {
|
||||||
type: Boolean,
|
type: Boolean,
|
||||||
required: false
|
required: false
|
||||||
},
|
},
|
||||||
|
readonly: {
|
||||||
|
type: Boolean,
|
||||||
|
required: false
|
||||||
|
},
|
||||||
disabled: {
|
disabled: {
|
||||||
type: Boolean,
|
type: Boolean,
|
||||||
required: false
|
required: false
|
||||||
},
|
},
|
||||||
|
placeholder: {
|
||||||
|
type: String,
|
||||||
|
required: false
|
||||||
|
},
|
||||||
|
autofocus: {
|
||||||
|
type: Boolean,
|
||||||
|
required: false,
|
||||||
|
default: false
|
||||||
|
},
|
||||||
inline: {
|
inline: {
|
||||||
type: Boolean,
|
type: Boolean,
|
||||||
required: false,
|
required: false,
|
||||||
default: false
|
default: false
|
||||||
},
|
},
|
||||||
|
manualSave: {
|
||||||
|
type: Boolean,
|
||||||
|
required: false,
|
||||||
|
default: false
|
||||||
|
},
|
||||||
},
|
},
|
||||||
data() {
|
|
||||||
|
emits: ['change', 'update:modelValue'],
|
||||||
|
|
||||||
|
setup(props, context) {
|
||||||
|
const { modelValue, autofocus } = toRefs(props);
|
||||||
|
const v = ref(modelValue.value);
|
||||||
|
const focused = ref(false);
|
||||||
|
const changed = ref(false);
|
||||||
|
const invalid = ref(false);
|
||||||
|
const filled = computed(() => v.value !== '' && v.value != null);
|
||||||
|
const inputEl = ref(null);
|
||||||
|
const prefixEl = ref(null);
|
||||||
|
const suffixEl = ref(null);
|
||||||
|
|
||||||
|
const focus = () => inputEl.value.focus();
|
||||||
|
const onInput = (ev) => {
|
||||||
|
changed.value = true;
|
||||||
|
context.emit('change', ev);
|
||||||
|
};
|
||||||
|
|
||||||
|
const updated = () => {
|
||||||
|
changed.value = false;
|
||||||
|
context.emit('update:modelValue', v.value);
|
||||||
|
};
|
||||||
|
|
||||||
|
watch(modelValue, newValue => {
|
||||||
|
v.value = newValue;
|
||||||
|
});
|
||||||
|
|
||||||
|
watch(v, newValue => {
|
||||||
|
if (!props.manualSave) {
|
||||||
|
updated();
|
||||||
|
}
|
||||||
|
|
||||||
|
invalid.value = inputEl.value.validity.badInput;
|
||||||
|
});
|
||||||
|
|
||||||
|
onMounted(() => {
|
||||||
|
nextTick(() => {
|
||||||
|
if (autofocus.value) {
|
||||||
|
focus();
|
||||||
|
}
|
||||||
|
|
||||||
|
// このコンポーネントが作成された時、非表示状態である場合がある
|
||||||
|
// 非表示状態だと要素の幅などは0になってしまうので、定期的に計算する
|
||||||
|
const clock = setInterval(() => {
|
||||||
|
if (prefixEl.value) {
|
||||||
|
if (prefixEl.value.offsetWidth) {
|
||||||
|
inputEl.value.style.paddingLeft = prefixEl.value.offsetWidth + 'px';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (suffixEl.value) {
|
||||||
|
if (suffixEl.value.offsetWidth) {
|
||||||
|
inputEl.value.style.paddingRight = suffixEl.value.offsetWidth + 'px';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}, 100);
|
||||||
|
|
||||||
|
onUnmounted(() => {
|
||||||
|
clearInterval(clock);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
return {
|
return {
|
||||||
focused: false,
|
v,
|
||||||
|
focused,
|
||||||
|
invalid,
|
||||||
|
changed,
|
||||||
|
filled,
|
||||||
|
inputEl,
|
||||||
|
prefixEl,
|
||||||
|
suffixEl,
|
||||||
|
focus,
|
||||||
|
onInput,
|
||||||
|
updated,
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
computed: {
|
|
||||||
v: {
|
|
||||||
get() {
|
|
||||||
return this.value;
|
|
||||||
},
|
|
||||||
set(v) {
|
|
||||||
this.$emit('update:value', v);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
filled(): boolean {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
},
|
|
||||||
mounted() {
|
|
||||||
if (this.$refs.prefix) {
|
|
||||||
this.$refs.label.style.left = (this.$refs.prefix.offsetLeft + this.$refs.prefix.offsetWidth) + 'px';
|
|
||||||
}
|
|
||||||
},
|
|
||||||
methods: {
|
|
||||||
focus() {
|
|
||||||
this.$refs.input.focus();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="scss" scoped>
|
<style lang="scss" scoped>
|
||||||
.eiipwacr {
|
.vblkjoeq {
|
||||||
position: relative;
|
margin: 1.5em 0;
|
||||||
margin: 32px 0;
|
|
||||||
|
|
||||||
&:not(.inline):first-child {
|
> .label {
|
||||||
margin-top: 8px;
|
font-size: 0.85em;
|
||||||
|
padding: 0 0 8px 12px;
|
||||||
|
user-select: none;
|
||||||
|
|
||||||
|
&:empty {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
&:not(.inline):last-child {
|
> .caption {
|
||||||
margin-bottom: 8px;
|
font-size: 0.8em;
|
||||||
}
|
padding: 8px 0 0 12px;
|
||||||
|
color: var(--fgTransparentWeak);
|
||||||
|
|
||||||
> .icon {
|
&:empty {
|
||||||
position: absolute;
|
display: none;
|
||||||
top: 0;
|
|
||||||
left: 0;
|
|
||||||
width: 24px;
|
|
||||||
text-align: center;
|
|
||||||
line-height: 32px;
|
|
||||||
|
|
||||||
&:not(:empty) + .input {
|
|
||||||
margin-left: 28px;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
> .input {
|
> .input {
|
||||||
display: flex;
|
$height: 42px;
|
||||||
position: relative;
|
position: relative;
|
||||||
|
|
||||||
&:before {
|
|
||||||
content: '';
|
|
||||||
display: block;
|
|
||||||
position: absolute;
|
|
||||||
bottom: 0;
|
|
||||||
left: 0;
|
|
||||||
right: 0;
|
|
||||||
height: 1px;
|
|
||||||
background: var(--inputBorder);
|
|
||||||
}
|
|
||||||
|
|
||||||
&:after {
|
|
||||||
content: '';
|
|
||||||
display: block;
|
|
||||||
position: absolute;
|
|
||||||
bottom: 0;
|
|
||||||
left: 0;
|
|
||||||
right: 0;
|
|
||||||
height: 2px;
|
|
||||||
background: var(--accent);
|
|
||||||
opacity: 0;
|
|
||||||
transform: scaleX(0.12);
|
|
||||||
transition: border 0.3s cubic-bezier(0.4, 0, 0.2, 1), opacity 0.3s cubic-bezier(0.4, 0, 0.2, 1), transform 0.3s cubic-bezier(0.4, 0, 0.2, 1);
|
|
||||||
will-change: border opacity transform;
|
|
||||||
}
|
|
||||||
|
|
||||||
> .label {
|
|
||||||
position: absolute;
|
|
||||||
top: 0;
|
|
||||||
left: 0;
|
|
||||||
pointer-events: none;
|
|
||||||
transition: 0.4s cubic-bezier(0.25, 0.8, 0.25, 1);
|
|
||||||
transition-duration: 0.3s;
|
|
||||||
font-size: 1em;
|
|
||||||
line-height: 32px;
|
|
||||||
pointer-events: none;
|
|
||||||
//will-change transform
|
|
||||||
transform-origin: top left;
|
|
||||||
transform: scale(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
> select {
|
> select {
|
||||||
|
appearance: none;
|
||||||
|
-webkit-appearance: none;
|
||||||
display: block;
|
display: block;
|
||||||
flex: 1;
|
height: $height;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
padding: 0;
|
margin: 0;
|
||||||
|
padding: 0 12px;
|
||||||
font: inherit;
|
font: inherit;
|
||||||
font-weight: normal;
|
font-weight: normal;
|
||||||
font-size: 1em;
|
font-size: 1em;
|
||||||
height: 32px;
|
color: var(--fg);
|
||||||
background: none;
|
background: var(--panel);
|
||||||
border: none;
|
border: solid 1px var(--inputBorder);
|
||||||
border-radius: 0;
|
border-radius: 6px;
|
||||||
outline: none;
|
outline: none;
|
||||||
box-shadow: none;
|
box-shadow: none;
|
||||||
appearance: none;
|
box-sizing: border-box;
|
||||||
-webkit-appearance: none;
|
cursor: pointer;
|
||||||
color: var(--fg);
|
transition: border-color 0.1s ease-out;
|
||||||
|
|
||||||
option,
|
&:hover {
|
||||||
optgroup {
|
border-color: var(--inputBorderHover);
|
||||||
color: var(--fg);
|
|
||||||
background: var(--bg);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
> .prefix,
|
> .prefix,
|
||||||
> .suffix {
|
> .suffix {
|
||||||
display: block;
|
display: flex;
|
||||||
align-self: center;
|
align-items: center;
|
||||||
justify-self: center;
|
position: absolute;
|
||||||
|
z-index: 1;
|
||||||
|
top: 0;
|
||||||
|
padding: 0 12px;
|
||||||
font-size: 1em;
|
font-size: 1em;
|
||||||
line-height: 32px;
|
height: $height;
|
||||||
color: var(--inputLabel);
|
|
||||||
pointer-events: none;
|
pointer-events: none;
|
||||||
|
|
||||||
&:empty {
|
&:empty {
|
||||||
@ -187,53 +220,41 @@ export default defineComponent({
|
|||||||
}
|
}
|
||||||
|
|
||||||
> * {
|
> * {
|
||||||
display: block;
|
display: inline-block;
|
||||||
min-width: 16px;
|
min-width: 16px;
|
||||||
|
max-width: 150px;
|
||||||
|
overflow: hidden;
|
||||||
|
white-space: nowrap;
|
||||||
|
text-overflow: ellipsis;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
> .prefix {
|
> .prefix {
|
||||||
padding-right: 4px;
|
left: 0;
|
||||||
|
padding-right: 6px;
|
||||||
}
|
}
|
||||||
|
|
||||||
> .suffix {
|
> .suffix {
|
||||||
padding-left: 4px;
|
right: 0;
|
||||||
}
|
padding-left: 6px;
|
||||||
}
|
|
||||||
|
|
||||||
> .text {
|
|
||||||
margin: 6px 0;
|
|
||||||
font-size: 0.8em;
|
|
||||||
|
|
||||||
&:empty {
|
|
||||||
display: none;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
* {
|
&.inline {
|
||||||
|
display: inline-block;
|
||||||
margin: 0;
|
margin: 0;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
&.focused {
|
&.focused {
|
||||||
> .input {
|
> select {
|
||||||
&:after {
|
border-color: var(--accent);
|
||||||
opacity: 1;
|
|
||||||
transform: scaleX(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
> .label {
|
|
||||||
color: var(--accent);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
&.focused,
|
&.disabled {
|
||||||
&.filled {
|
opacity: 0.7;
|
||||||
> .input {
|
|
||||||
> .label {
|
&, * {
|
||||||
top: -17px;
|
cursor: not-allowed !important;
|
||||||
left: 0 !important;
|
|
||||||
transform: scale(0.75);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -18,7 +18,7 @@
|
|||||||
</span>
|
</span>
|
||||||
<span class="label">
|
<span class="label">
|
||||||
<span><slot></slot></span>
|
<span><slot></slot></span>
|
||||||
<p><slot name="desc"></slot></p>
|
<p><slot name="caption"></slot></p>
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
@ -28,7 +28,7 @@ import { defineComponent } from 'vue';
|
|||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
props: {
|
props: {
|
||||||
value: {
|
modelValue: {
|
||||||
type: Boolean,
|
type: Boolean,
|
||||||
default: false
|
default: false
|
||||||
},
|
},
|
||||||
@ -39,13 +39,13 @@ export default defineComponent({
|
|||||||
},
|
},
|
||||||
computed: {
|
computed: {
|
||||||
checked(): boolean {
|
checked(): boolean {
|
||||||
return this.value;
|
return this.modelValue;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
toggle() {
|
toggle() {
|
||||||
if (this.disabled) return;
|
if (this.disabled) return;
|
||||||
this.$emit('update:value', !this.checked);
|
this.$emit('update:modelValue', !this.checked);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@ -136,7 +136,7 @@ export default defineComponent({
|
|||||||
|
|
||||||
> p {
|
> p {
|
||||||
margin: 0;
|
margin: 0;
|
||||||
opacity: 0.7;
|
color: var(--fgTransparentWeak);
|
||||||
font-size: 90%;
|
font-size: 90%;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,30 +1,45 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="adhpbeos" :class="{ focused, filled, tall, pre }">
|
<div class="adhpbeos">
|
||||||
<div class="input">
|
<div class="label" @click="focus"><slot name="label"></slot></div>
|
||||||
<span class="label" ref="label"><slot></slot></span>
|
<div class="input" :class="{ disabled, focused, tall, pre }">
|
||||||
<textarea ref="input" :class="{ code, _monospace: code }"
|
<textarea ref="inputEl"
|
||||||
:value="value"
|
:class="{ code, _monospace: code }"
|
||||||
|
v-model="v"
|
||||||
|
:disabled="disabled"
|
||||||
:required="required"
|
:required="required"
|
||||||
:readonly="readonly"
|
:readonly="readonly"
|
||||||
|
:placeholder="placeholder"
|
||||||
:pattern="pattern"
|
:pattern="pattern"
|
||||||
:autocomplete="autocomplete"
|
:autocomplete="autocomplete"
|
||||||
:spellcheck="!code"
|
:spellcheck="spellcheck"
|
||||||
@input="onInput"
|
|
||||||
@focus="focused = true"
|
@focus="focused = true"
|
||||||
@blur="focused = false"
|
@blur="focused = false"
|
||||||
|
@keydown="onKeydown($event)"
|
||||||
|
@input="onInput"
|
||||||
></textarea>
|
></textarea>
|
||||||
</div>
|
</div>
|
||||||
<button class="save _textButton" v-if="save && changed" @click="() => { changed = false; save(); }">{{ $ts.save }}</button>
|
<div class="caption"><slot name="caption"></slot></div>
|
||||||
<div class="desc _caption"><slot name="desc"></slot></div>
|
|
||||||
|
<MkButton v-if="manualSave && changed" @click="updated" primary><i class="fas fa-save"></i> {{ $ts.save }}</MkButton>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { defineComponent } from 'vue';
|
import { defineComponent, onMounted, onUnmounted, nextTick, ref, watch, computed, toRefs } from 'vue';
|
||||||
|
import MkButton from './button.vue';
|
||||||
|
import { debounce } from 'throttle-debounce';
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
|
components: {
|
||||||
|
MkButton,
|
||||||
|
},
|
||||||
|
|
||||||
props: {
|
props: {
|
||||||
value: {
|
modelValue: {
|
||||||
|
required: true
|
||||||
|
},
|
||||||
|
type: {
|
||||||
|
type: String,
|
||||||
required: false
|
required: false
|
||||||
},
|
},
|
||||||
required: {
|
required: {
|
||||||
@ -35,14 +50,29 @@ export default defineComponent({
|
|||||||
type: Boolean,
|
type: Boolean,
|
||||||
required: false
|
required: false
|
||||||
},
|
},
|
||||||
|
disabled: {
|
||||||
|
type: Boolean,
|
||||||
|
required: false
|
||||||
|
},
|
||||||
pattern: {
|
pattern: {
|
||||||
type: String,
|
type: String,
|
||||||
required: false
|
required: false
|
||||||
},
|
},
|
||||||
autocomplete: {
|
placeholder: {
|
||||||
type: String,
|
type: String,
|
||||||
required: false
|
required: false
|
||||||
},
|
},
|
||||||
|
autofocus: {
|
||||||
|
type: Boolean,
|
||||||
|
required: false,
|
||||||
|
default: false
|
||||||
|
},
|
||||||
|
autocomplete: {
|
||||||
|
required: false
|
||||||
|
},
|
||||||
|
spellcheck: {
|
||||||
|
required: false
|
||||||
|
},
|
||||||
code: {
|
code: {
|
||||||
type: Boolean,
|
type: Boolean,
|
||||||
required: false
|
required: false
|
||||||
@ -57,169 +87,164 @@ export default defineComponent({
|
|||||||
required: false,
|
required: false,
|
||||||
default: false
|
default: false
|
||||||
},
|
},
|
||||||
save: {
|
debounce: {
|
||||||
type: Function,
|
type: Boolean,
|
||||||
required: false,
|
required: false,
|
||||||
|
default: false
|
||||||
|
},
|
||||||
|
manualSave: {
|
||||||
|
type: Boolean,
|
||||||
|
required: false,
|
||||||
|
default: false
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
data() {
|
|
||||||
|
emits: ['change', 'keydown', 'enter', 'update:modelValue'],
|
||||||
|
|
||||||
|
setup(props, context) {
|
||||||
|
const { modelValue, autofocus } = toRefs(props);
|
||||||
|
const v = ref(modelValue.value);
|
||||||
|
const focused = ref(false);
|
||||||
|
const changed = ref(false);
|
||||||
|
const invalid = ref(false);
|
||||||
|
const filled = computed(() => v.value !== '' && v.value != null);
|
||||||
|
const inputEl = ref(null);
|
||||||
|
|
||||||
|
const focus = () => inputEl.value.focus();
|
||||||
|
const onInput = (ev) => {
|
||||||
|
changed.value = true;
|
||||||
|
context.emit('change', ev);
|
||||||
|
};
|
||||||
|
const onKeydown = (ev: KeyboardEvent) => {
|
||||||
|
context.emit('keydown', ev);
|
||||||
|
|
||||||
|
if (ev.code === 'Enter') {
|
||||||
|
context.emit('enter');
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const updated = () => {
|
||||||
|
changed.value = false;
|
||||||
|
context.emit('update:modelValue', v.value);
|
||||||
|
};
|
||||||
|
|
||||||
|
const debouncedUpdated = debounce(1000, updated);
|
||||||
|
|
||||||
|
watch(modelValue, newValue => {
|
||||||
|
v.value = newValue;
|
||||||
|
});
|
||||||
|
|
||||||
|
watch(v, newValue => {
|
||||||
|
if (!props.manualSave) {
|
||||||
|
if (props.debounce) {
|
||||||
|
debouncedUpdated();
|
||||||
|
} else {
|
||||||
|
updated();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
invalid.value = inputEl.value.validity.badInput;
|
||||||
|
});
|
||||||
|
|
||||||
|
onMounted(() => {
|
||||||
|
nextTick(() => {
|
||||||
|
if (autofocus.value) {
|
||||||
|
focus();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
return {
|
return {
|
||||||
focused: false,
|
v,
|
||||||
changed: false,
|
focused,
|
||||||
}
|
invalid,
|
||||||
|
changed,
|
||||||
|
filled,
|
||||||
|
inputEl,
|
||||||
|
focus,
|
||||||
|
onInput,
|
||||||
|
onKeydown,
|
||||||
|
updated,
|
||||||
|
};
|
||||||
},
|
},
|
||||||
computed: {
|
|
||||||
filled(): boolean {
|
|
||||||
return this.value != '' && this.value != null;
|
|
||||||
}
|
|
||||||
},
|
|
||||||
methods: {
|
|
||||||
focus() {
|
|
||||||
this.$refs.input.focus();
|
|
||||||
},
|
|
||||||
onInput(ev) {
|
|
||||||
this.changed = true;
|
|
||||||
this.$emit('update:value', ev.target.value);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="scss" scoped>
|
<style lang="scss" scoped>
|
||||||
.adhpbeos {
|
.adhpbeos {
|
||||||
margin: 42px 0 32px 0;
|
margin: 1.5em 0;
|
||||||
position: relative;
|
|
||||||
|
|
||||||
&:first-child {
|
> .label {
|
||||||
margin-top: 16px;
|
font-size: 0.85em;
|
||||||
|
padding: 0 0 8px 12px;
|
||||||
|
user-select: none;
|
||||||
|
|
||||||
|
&:empty {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
&:last-child {
|
> .caption {
|
||||||
margin-bottom: 0;
|
font-size: 0.8em;
|
||||||
|
padding: 8px 0 0 12px;
|
||||||
|
color: var(--fgTransparentWeak);
|
||||||
|
|
||||||
|
&:empty {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
> .input {
|
> .input {
|
||||||
position: relative;
|
position: relative;
|
||||||
|
|
||||||
&:before {
|
|
||||||
content: '';
|
|
||||||
display: block;
|
|
||||||
position: absolute;
|
|
||||||
top: 0;
|
|
||||||
bottom: 0;
|
|
||||||
left: 0;
|
|
||||||
right: 0;
|
|
||||||
background: none;
|
|
||||||
border: solid 1px var(--inputBorder);
|
|
||||||
border-radius: 3px;
|
|
||||||
pointer-events: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
&:after {
|
|
||||||
content: '';
|
|
||||||
display: block;
|
|
||||||
position: absolute;
|
|
||||||
top: 0;
|
|
||||||
bottom: 0;
|
|
||||||
left: 0;
|
|
||||||
right: 0;
|
|
||||||
background: none;
|
|
||||||
border: solid 2px var(--accent);
|
|
||||||
border-radius: 3px;
|
|
||||||
opacity: 0;
|
|
||||||
transition: opacity 0.3s cubic-bezier(0.4, 0, 0.2, 1);
|
|
||||||
pointer-events: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
> .label {
|
|
||||||
position: absolute;
|
|
||||||
top: 6px;
|
|
||||||
left: 12px;
|
|
||||||
pointer-events: none;
|
|
||||||
transition: 0.4s cubic-bezier(0.25, 0.8, 0.25, 1);
|
|
||||||
transition-duration: 0.3s;
|
|
||||||
font-size: 1em;
|
|
||||||
line-height: 32px;
|
|
||||||
pointer-events: none;
|
|
||||||
//will-change transform
|
|
||||||
transform-origin: top left;
|
|
||||||
transform: scale(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
> textarea {
|
> textarea {
|
||||||
|
appearance: none;
|
||||||
|
-webkit-appearance: none;
|
||||||
display: block;
|
display: block;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
min-width: 100%;
|
min-width: 100%;
|
||||||
max-width: 100%;
|
max-width: 100%;
|
||||||
min-height: 130px;
|
min-height: 130px;
|
||||||
|
margin: 0;
|
||||||
padding: 12px;
|
padding: 12px;
|
||||||
box-sizing: border-box;
|
|
||||||
font: inherit;
|
font: inherit;
|
||||||
font-weight: normal;
|
font-weight: normal;
|
||||||
font-size: 1em;
|
font-size: 1em;
|
||||||
background: transparent;
|
color: var(--fg);
|
||||||
border: none;
|
background: var(--panel);
|
||||||
border-radius: 0;
|
border: solid 1px var(--inputBorder);
|
||||||
|
border-radius: 6px;
|
||||||
outline: none;
|
outline: none;
|
||||||
box-shadow: none;
|
box-shadow: none;
|
||||||
color: var(--fg);
|
box-sizing: border-box;
|
||||||
|
transition: border-color 0.1s ease-out;
|
||||||
|
|
||||||
&.code {
|
&:hover {
|
||||||
tab-size: 2;
|
border-color: var(--inputBorderHover);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
> .save {
|
&.focused {
|
||||||
margin: 6px 0 0 0;
|
> textarea {
|
||||||
font-size: 0.8em;
|
border-color: var(--accent);
|
||||||
}
|
|
||||||
|
|
||||||
> .desc {
|
|
||||||
margin: 6px 0 0 0;
|
|
||||||
|
|
||||||
&:empty {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
* {
|
|
||||||
margin: 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
&.focused {
|
|
||||||
> .input {
|
|
||||||
&:after {
|
|
||||||
opacity: 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
> .label {
|
|
||||||
color: var(--accent);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
&.focused,
|
&.disabled {
|
||||||
&.filled {
|
opacity: 0.7;
|
||||||
> .input {
|
|
||||||
> .label {
|
&, * {
|
||||||
top: -24px;
|
cursor: not-allowed !important;
|
||||||
left: 0 !important;
|
|
||||||
transform: scale(0.75);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
&.tall {
|
&.tall {
|
||||||
> .input {
|
|
||||||
> textarea {
|
> textarea {
|
||||||
min-height: 200px;
|
min-height: 200px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
&.pre {
|
&.pre {
|
||||||
> .input {
|
|
||||||
> textarea {
|
> textarea {
|
||||||
white-space: pre;
|
white-space: pre;
|
||||||
}
|
}
|
||||||
|
@ -1,17 +1,13 @@
|
|||||||
<template>
|
<template>
|
||||||
<transition :name="$store.state.animation ? 'window' : ''" appear @after-leave="$emit('closed')">
|
<transition :name="$store.state.animation ? 'window' : ''" appear @after-leave="$emit('closed')">
|
||||||
<div class="ebkgocck" :class="{ front }" v-if="showing">
|
<div class="ebkgocck" :class="{ front }" v-if="showing">
|
||||||
<div class="body _popup _shadow _narrow_" @mousedown="onBodyMousedown" @keydown="onKeydown">
|
<div class="body _window _shadow _narrow_" @mousedown="onBodyMousedown" @keydown="onKeydown">
|
||||||
<div class="header" :class="{ mini }" @contextmenu.prevent.stop="onContextmenu">
|
<div class="header" :class="{ mini }" @contextmenu.prevent.stop="onContextmenu">
|
||||||
<slot v-if="closeRight" name="buttons"><button class="_button" style="pointer-events: none;"></button></slot>
|
<button v-if="closeButton" class="_button" @click="close()"><i class="fas fa-times"></i></button>
|
||||||
<button v-else class="_button" @click="close()"><i class="fas fa-times"></i></button>
|
|
||||||
|
|
||||||
<span class="title" @mousedown.prevent="onHeaderMousedown" @touchstart.prevent="onHeaderMousedown">
|
<span class="title" @mousedown.prevent="onHeaderMousedown" @touchstart.prevent="onHeaderMousedown">
|
||||||
<slot name="header"></slot>
|
<slot name="header"></slot>
|
||||||
</span>
|
</span>
|
||||||
|
|
||||||
<button v-if="closeRight" class="_button" @click="close()"><i class="fas fa-times"></i></button>
|
|
||||||
<slot v-else name="buttons"><button class="_button" style="pointer-events: none;"></button></slot>
|
|
||||||
</div>
|
</div>
|
||||||
<div class="body" v-if="padding">
|
<div class="body" v-if="padding">
|
||||||
<div class="_section">
|
<div class="_section">
|
||||||
@ -86,10 +82,10 @@ export default defineComponent({
|
|||||||
required: false,
|
required: false,
|
||||||
default: false,
|
default: false,
|
||||||
},
|
},
|
||||||
closeRight: {
|
closeButton: {
|
||||||
type: Boolean,
|
type: Boolean,
|
||||||
required: false,
|
required: false,
|
||||||
default: false,
|
default: true,
|
||||||
},
|
},
|
||||||
mini: {
|
mini: {
|
||||||
type: Boolean,
|
type: Boolean,
|
||||||
@ -420,6 +416,7 @@ export default defineComponent({
|
|||||||
flex-shrink: 0;
|
flex-shrink: 0;
|
||||||
user-select: none;
|
user-select: none;
|
||||||
height: var(--height);
|
height: var(--height);
|
||||||
|
border-bottom: solid 1px var(--divider);
|
||||||
|
|
||||||
> ::v-deep(button) {
|
> ::v-deep(button) {
|
||||||
height: var(--height);
|
height: var(--height);
|
||||||
|
@ -29,9 +29,9 @@
|
|||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { defineComponent } from 'vue';
|
import { defineComponent } from 'vue';
|
||||||
import parseAcct from '@/misc/acct/parse';
|
import { parseAcct } from '@/misc/acct';
|
||||||
import MkFollowButton from './follow-button.vue';
|
import MkFollowButton from './follow-button.vue';
|
||||||
import { userPage } from '../filters/user';
|
import { userPage } from '@client/filters/user';
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
components: {
|
components: {
|
||||||
|
@ -18,7 +18,7 @@
|
|||||||
import { defineComponent } from 'vue';
|
import { defineComponent } from 'vue';
|
||||||
import paging from '@client/scripts/paging';
|
import paging from '@client/scripts/paging';
|
||||||
import MkUserInfo from './user-info.vue';
|
import MkUserInfo from './user-info.vue';
|
||||||
import { userPage } from '../filters/user';
|
import { userPage } from '@client/filters/user';
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
components: {
|
components: {
|
||||||
|
@ -33,9 +33,9 @@
|
|||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { defineComponent } from 'vue';
|
import { defineComponent } from 'vue';
|
||||||
import parseAcct from '@/misc/acct/parse';
|
import { parseAcct } from '@/misc/acct';
|
||||||
import MkFollowButton from './follow-button.vue';
|
import MkFollowButton from './follow-button.vue';
|
||||||
import { userPage } from '../filters/user';
|
import { userPage } from '@client/filters/user';
|
||||||
import * as os from '@client/os';
|
import * as os from '@client/os';
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
|
@ -10,9 +10,15 @@
|
|||||||
<template #header>{{ $ts.selectUser }}</template>
|
<template #header>{{ $ts.selectUser }}</template>
|
||||||
<div class="tbhwbxda _monolithic_">
|
<div class="tbhwbxda _monolithic_">
|
||||||
<div class="_section">
|
<div class="_section">
|
||||||
<div class="inputs">
|
<div class="_inputSplit _inputNoTopMargin _inputNoBottomMargin">
|
||||||
<MkInput v-model:value="username" class="input" @update:value="search" ref="username"><span>{{ $ts.username }}</span><template #prefix>@</template></MkInput>
|
<MkInput v-model="username" class="input" @update:modelValue="search" ref="username">
|
||||||
<MkInput v-model:value="host" class="input" @update:value="search"><span>{{ $ts.host }}</span><template #prefix>@</template></MkInput>
|
<template #label>{{ $ts.username }}</template>
|
||||||
|
<template #prefix>@</template>
|
||||||
|
</MkInput>
|
||||||
|
<MkInput v-model="host" class="input" @update:modelValue="search">
|
||||||
|
<template #label>{{ $ts.host }}</template>
|
||||||
|
<template #prefix>@</template>
|
||||||
|
</MkInput>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="_section result" v-if="username != '' || host != ''" :class="{ hit: users.length > 0 }">
|
<div class="_section result" v-if="username != '' || host != ''" :class="{ hit: users.length > 0 }">
|
||||||
@ -138,14 +144,6 @@ export default defineComponent({
|
|||||||
padding: 0;
|
padding: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
> .inputs {
|
|
||||||
> .input {
|
|
||||||
display: inline-block;
|
|
||||||
width: 50%;
|
|
||||||
margin: 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
> .users {
|
> .users {
|
||||||
flex: 1;
|
flex: 1;
|
||||||
overflow: auto;
|
overflow: auto;
|
||||||
|
@ -28,7 +28,7 @@
|
|||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { defineComponent } from 'vue';
|
import { defineComponent } from 'vue';
|
||||||
import paging from '@client/scripts/paging';
|
import paging from '@client/scripts/paging';
|
||||||
import { userPage } from '../filters/user';
|
import { userPage } from '@client/filters/user';
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
mixins: [
|
mixins: [
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
<div class="vjoppmmu">
|
<div class="vjoppmmu">
|
||||||
<template v-if="edit">
|
<template v-if="edit">
|
||||||
<header>
|
<header>
|
||||||
<MkSelect v-model:value="widgetAdderSelected" style="margin-bottom: var(--margin)">
|
<MkSelect v-model="widgetAdderSelected" style="margin-bottom: var(--margin)">
|
||||||
<template #label>{{ $ts.selectWidget }}</template>
|
<template #label>{{ $ts.selectWidget }}</template>
|
||||||
<option v-for="widget in widgetDefs" :value="widget" :key="widget">{{ $t(`_widgets.${widget}`) }}</option>
|
<option v-for="widget in widgetDefs" :value="widget" :key="widget">{{ $t(`_widgets.${widget}`) }}</option>
|
||||||
</MkSelect>
|
</MkSelect>
|
||||||
@ -43,6 +43,7 @@ export default defineComponent({
|
|||||||
|
|
||||||
props: {
|
props: {
|
||||||
widgets: {
|
widgets: {
|
||||||
|
type: Array,
|
||||||
required: true,
|
required: true,
|
||||||
},
|
},
|
||||||
edit: {
|
edit: {
|
||||||
|
@ -6,7 +6,7 @@ export default {
|
|||||||
|
|
||||||
const header = src.children[0];
|
const header = src.children[0];
|
||||||
const currentStickyTop = getComputedStyle(src).getPropertyValue('--stickyTop') || '0px';
|
const currentStickyTop = getComputedStyle(src).getPropertyValue('--stickyTop') || '0px';
|
||||||
src.style.setProperty('--stickyTop', `${parseInt(currentStickyTop) + header.offsetHeight}px`);
|
src.style.setProperty('--stickyTop', `calc(${currentStickyTop} + ${header.offsetHeight}px)`);
|
||||||
header.style.setProperty('--stickyTop', currentStickyTop);
|
header.style.setProperty('--stickyTop', currentStickyTop);
|
||||||
header.style.position = 'sticky';
|
header.style.position = 'sticky';
|
||||||
header.style.top = 'var(--stickyTop)';
|
header.style.top = 'var(--stickyTop)';
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
import getAcct from '@/misc/acct/render';
|
import { getAcct } from '@/misc/acct';
|
||||||
import getUserName from '@/misc/get-user-name';
|
import getUserName from '@/misc/get-user-name';
|
||||||
import { url } from '@client/config';
|
import { url } from '@client/config';
|
||||||
|
|
||||||
|
@ -6,7 +6,7 @@ import '@client/style.scss';
|
|||||||
|
|
||||||
import * as Sentry from '@sentry/browser';
|
import * as Sentry from '@sentry/browser';
|
||||||
import { Integrations } from '@sentry/tracing';
|
import { Integrations } from '@sentry/tracing';
|
||||||
import { computed, createApp, watch } from 'vue';
|
import { computed, createApp, watch, markRaw } from 'vue';
|
||||||
|
|
||||||
import widgets from '@client/widgets';
|
import widgets from '@client/widgets';
|
||||||
import directives from '@client/directives';
|
import directives from '@client/directives';
|
||||||
@ -34,18 +34,6 @@ console.info(`Misskey v${version}`);
|
|||||||
window.onerror = null;
|
window.onerror = null;
|
||||||
window.onunhandledrejection = null;
|
window.onunhandledrejection = null;
|
||||||
|
|
||||||
// 後方互換性のため。
|
|
||||||
// TODO: そのうち消す
|
|
||||||
if ((typeof ColdDeviceStorage.get('lightTheme') === 'string') || (typeof ColdDeviceStorage.get('darkTheme') === 'string')) {
|
|
||||||
ColdDeviceStorage.set('lightTheme', require('@client/themes/l-light.json5'));
|
|
||||||
ColdDeviceStorage.set('darkTheme', require('@client/themes/d-dark.json5'));
|
|
||||||
}
|
|
||||||
const link = document.createElement('link');
|
|
||||||
link.rel = 'stylesheet';
|
|
||||||
link.href = 'https://use.fontawesome.com/releases/v5.15.3/css/all.css';
|
|
||||||
document.head.appendChild(link);
|
|
||||||
// TODOここまで
|
|
||||||
|
|
||||||
if (_DEV_) {
|
if (_DEV_) {
|
||||||
console.warn('Development mode!!!');
|
console.warn('Development mode!!!');
|
||||||
|
|
||||||
@ -294,7 +282,7 @@ if ($i) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const main = stream.useChannel('main', null, 'System');
|
const main = markRaw(stream.useChannel('main', null, 'System'));
|
||||||
|
|
||||||
// 自分の情報が更新されたとき
|
// 自分の情報が更新されたとき
|
||||||
main.on('meUpdated', i => {
|
main.on('meUpdated', i => {
|
||||||
|
@ -5,7 +5,7 @@ import { i18n } from '@client/i18n';
|
|||||||
import { $i } from './account';
|
import { $i } from './account';
|
||||||
import { unisonReload } from '@client/scripts/unison-reload';
|
import { unisonReload } from '@client/scripts/unison-reload';
|
||||||
|
|
||||||
export const sidebarDef = {
|
export const menuDef = {
|
||||||
notifications: {
|
notifications: {
|
||||||
title: 'notifications',
|
title: 'notifications',
|
||||||
icon: 'fas fa-bell',
|
icon: 'fas fa-bell',
|
||||||
@ -113,6 +113,16 @@ export const sidebarDef = {
|
|||||||
icon: 'fas fa-satellite-dish',
|
icon: 'fas fa-satellite-dish',
|
||||||
to: '/channels',
|
to: '/channels',
|
||||||
},
|
},
|
||||||
|
federation: {
|
||||||
|
title: 'federation',
|
||||||
|
icon: 'fas fa-globe',
|
||||||
|
to: '/federation',
|
||||||
|
},
|
||||||
|
emojis: {
|
||||||
|
title: 'emojis',
|
||||||
|
icon: 'fas fa-laugh',
|
||||||
|
to: '/emojis',
|
||||||
|
},
|
||||||
games: {
|
games: {
|
||||||
title: 'games',
|
title: 'games',
|
||||||
icon: 'fas fa-gamepad',
|
icon: 'fas fa-gamepad',
|
||||||
@ -133,7 +143,7 @@ export const sidebarDef = {
|
|||||||
title: 'switchUi',
|
title: 'switchUi',
|
||||||
icon: 'fas fa-columns',
|
icon: 'fas fa-columns',
|
||||||
action: (ev) => {
|
action: (ev) => {
|
||||||
os.modalMenu([{
|
os.popupMenu([{
|
||||||
text: i18n.locale.default,
|
text: i18n.locale.default,
|
||||||
action: () => {
|
action: () => {
|
||||||
localStorage.setItem('ui', 'default');
|
localStorage.setItem('ui', 'default');
|
@ -368,10 +368,10 @@ export async function openEmojiPicker(src?: HTMLElement, opts, initialTextarea:
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
export function modalMenu(items: any[], src?: HTMLElement, options?: { align?: string; viaKeyboard?: boolean }) {
|
export function popupMenu(items: any[], src?: HTMLElement, options?: { align?: string; viaKeyboard?: boolean }) {
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
let dispose;
|
let dispose;
|
||||||
popup(import('@client/components/ui/modal-menu.vue'), {
|
popup(import('@client/components/ui/popup-menu.vue'), {
|
||||||
items,
|
items,
|
||||||
src,
|
src,
|
||||||
align: options?.align,
|
align: options?.align,
|
||||||
|
@ -1,11 +1,11 @@
|
|||||||
<template>
|
<template>
|
||||||
<transition :name="$store.state.animation ? 'zoom' : ''" appear>
|
<transition :name="$store.state.animation ? 'zoom' : ''" appear>
|
||||||
<div class="_section">
|
<div class="mjndxjch">
|
||||||
<div class="mjndxjch _content">
|
<img src="https://xn--931a.moe/assets/error.jpg" class="_ghost"/>
|
||||||
<img src="https://xn--931a.moe/assets/error.jpg" class="_ghost"/>
|
<p><b><i class="fas fa-exclamation-triangle"></i> {{ $ts.pageLoadError }}</b></p>
|
||||||
<p><i class="fas fa-exclamation-triangle"></i> {{ $ts.pageLoadError }}</p>
|
<p>{{ $ts.pageLoadErrorDescription }}</p>
|
||||||
<p>{{ $ts.pageLoadErrorDescription }}</p>
|
<p><MkA to="/docs/general/troubleshooting" class="_link">{{ $ts.troubleshooting }}</MkA></p>
|
||||||
</div>
|
<p v-if="error" class="error">ERROR: {{ error }}</p>
|
||||||
</div>
|
</div>
|
||||||
</transition>
|
</transition>
|
||||||
</template>
|
</template>
|
||||||
@ -19,6 +19,11 @@ export default defineComponent({
|
|||||||
components: {
|
components: {
|
||||||
MkButton,
|
MkButton,
|
||||||
},
|
},
|
||||||
|
props: {
|
||||||
|
error: {
|
||||||
|
required: false,
|
||||||
|
}
|
||||||
|
},
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
[symbols.PAGE_INFO]: {
|
[symbols.PAGE_INFO]: {
|
||||||
@ -32,10 +37,11 @@ export default defineComponent({
|
|||||||
|
|
||||||
<style lang="scss" scoped>
|
<style lang="scss" scoped>
|
||||||
.mjndxjch {
|
.mjndxjch {
|
||||||
|
padding: 32px;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
|
|
||||||
> p {
|
> p {
|
||||||
margin: 0 0 8px 0;
|
margin: 0 0 12px 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
> .button {
|
> .button {
|
||||||
@ -45,8 +51,12 @@ export default defineComponent({
|
|||||||
> img {
|
> img {
|
||||||
vertical-align: bottom;
|
vertical-align: bottom;
|
||||||
height: 128px;
|
height: 128px;
|
||||||
margin-bottom: 16px;
|
margin-bottom: 24px;
|
||||||
border-radius: 16px;
|
border-radius: 16px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
> .error {
|
||||||
|
opacity: 0.7;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
@ -272,7 +272,7 @@ export default defineComponent({
|
|||||||
|
|
||||||
showTypeMenu(e: MouseEvent) {
|
showTypeMenu(e: MouseEvent) {
|
||||||
return new Promise<ThemeValue>((resolve) => {
|
return new Promise<ThemeValue>((resolve) => {
|
||||||
os.modalMenu([{
|
os.popupMenu([{
|
||||||
text: this.$ts._theme.defaultValue,
|
text: this.$ts._theme.defaultValue,
|
||||||
action: () => resolve(null),
|
action: () => resolve(null),
|
||||||
}, {
|
}, {
|
||||||
|
@ -1,13 +1,13 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="_root">
|
<div class="_root">
|
||||||
<div class="_block" style="padding: 24px;">
|
<div class="_block" style="padding: 24px;">
|
||||||
<MkInput v-model:value="endpoint" :datalist="endpoints" @update:value="onEndpointChange()">
|
<MkInput v-model="endpoint" :datalist="endpoints" @update:modelValue="onEndpointChange()">
|
||||||
<span>Endpoint</span>
|
<template #label>Endpoint</template>
|
||||||
</MkInput>
|
</MkInput>
|
||||||
<MkTextarea v-model:value="body" code>
|
<MkTextarea v-model="body" code>
|
||||||
<span>Params (JSON or JSON5)</span>
|
<template #label>Params (JSON or JSON5)</template>
|
||||||
</MkTextarea>
|
</MkTextarea>
|
||||||
<MkSwitch v-model:value="withCredential">
|
<MkSwitch v-model="withCredential">
|
||||||
With credential
|
With credential
|
||||||
</MkSwitch>
|
</MkSwitch>
|
||||||
<MkButton primary full @click="send" :disabled="sending">
|
<MkButton primary full @click="send" :disabled="sending">
|
||||||
@ -16,8 +16,8 @@
|
|||||||
</MkButton>
|
</MkButton>
|
||||||
</div>
|
</div>
|
||||||
<div v-if="res" class="_block" style="padding: 24px;">
|
<div v-if="res" class="_block" style="padding: 24px;">
|
||||||
<MkTextarea v-model:value="res" code readonly tall>
|
<MkTextarea v-model="res" code readonly tall>
|
||||||
<span>Response</span>
|
<template #label>Response</template>
|
||||||
</MkTextarea>
|
</MkTextarea>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -2,9 +2,13 @@
|
|||||||
<div>
|
<div>
|
||||||
<div class="_section">
|
<div class="_section">
|
||||||
<div class="_content">
|
<div class="_content">
|
||||||
<MkInput v-model:value="name">{{ $ts.name }}</MkInput>
|
<MkInput v-model="name">
|
||||||
|
<template #label>{{ $ts.name }}</template>
|
||||||
|
</MkInput>
|
||||||
|
|
||||||
<MkTextarea v-model:value="description">{{ $ts.description }}</MkTextarea>
|
<MkTextarea v-model="description">
|
||||||
|
<template #label>{{ $ts.description }}</template>
|
||||||
|
</MkTextarea>
|
||||||
|
|
||||||
<div class="banner">
|
<div class="banner">
|
||||||
<MkButton v-if="bannerId == null" @click="setBannerImage"><i class="fas fa-plus"></i> {{ $ts._channel.setBanner }}</MkButton>
|
<MkButton v-if="bannerId == null" @click="setBannerImage"><i class="fas fa-plus"></i> {{ $ts._channel.setBanner }}</MkButton>
|
||||||
|
@ -79,7 +79,7 @@ export default defineComponent({
|
|||||||
|
|
||||||
methods: {
|
methods: {
|
||||||
menu(ev) {
|
menu(ev) {
|
||||||
os.modalMenu([this.isOwned ? {
|
os.popupMenu([this.isOwned ? {
|
||||||
icon: 'fas fa-pencil-alt',
|
icon: 'fas fa-pencil-alt',
|
||||||
text: this.$ts.edit,
|
text: this.$ts.edit,
|
||||||
action: async () => {
|
action: async () => {
|
||||||
|
@ -1,9 +1,11 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="qyqbqfal" v-size="{ max: [500] }">
|
<div class="qyqbqfal" v-size="{ max: [500] }">
|
||||||
<div class="title">{{ title }}</div>
|
<div class="main">
|
||||||
<div class="body" v-html="body"></div>
|
<div class="title">{{ title }}</div>
|
||||||
<div class="footer">
|
<div class="body" v-html="body"></div>
|
||||||
<MkLink :url="`https://github.com/misskey-dev/misskey/blob/master/src/docs/${lang}/${doc}.md`" class="at">{{ $ts.docSource }}</MkLink>
|
<div class="footer">
|
||||||
|
<MkLink :url="`https://github.com/misskey-dev/misskey/blob/master/src/docs/${lang}/${doc}.md`" class="at">{{ $ts.docSource }}</MkLink>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
@ -62,6 +64,10 @@ export default defineComponent({
|
|||||||
fetchDoc() {
|
fetchDoc() {
|
||||||
fetch(`${url}/doc-assets/${lang}/${this.doc}.md`).then(res => res.text()).then(md => {
|
fetch(`${url}/doc-assets/${lang}/${this.doc}.md`).then(res => res.text()).then(md => {
|
||||||
this.parse(md);
|
this.parse(md);
|
||||||
|
}).catch(() => {
|
||||||
|
fetch(`${url}/doc-assets/ja-JP/${this.doc}.md`).then(res => res.text()).then(md => {
|
||||||
|
this.parse(md);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -105,102 +111,129 @@ export default defineComponent({
|
|||||||
<style lang="scss" scoped>
|
<style lang="scss" scoped>
|
||||||
.qyqbqfal {
|
.qyqbqfal {
|
||||||
padding: 32px;
|
padding: 32px;
|
||||||
max-width: 800px;
|
background: var(--panel);
|
||||||
margin: 0 auto;
|
line-height: 1.5;
|
||||||
|
|
||||||
&.max-width_500px {
|
&.max-width_500px {
|
||||||
padding: 16px;
|
padding: 24px;
|
||||||
}
|
}
|
||||||
|
|
||||||
> .title {
|
> .main {
|
||||||
font-size: 1.5em;
|
max-width: 800px;
|
||||||
font-weight: bold;
|
margin: 0 auto;
|
||||||
padding: 0 0 0.75em 0;
|
|
||||||
margin: 0 0 1em 0;
|
|
||||||
border-bottom: solid 2px var(--divider);
|
|
||||||
}
|
|
||||||
|
|
||||||
> .body {
|
> .title {
|
||||||
> *:first-child {
|
font-size: 1.5em;
|
||||||
margin-top: 0;
|
font-weight: bold;
|
||||||
|
padding: 0 0 0.75em 0;
|
||||||
|
margin: 0 0 1em 0;
|
||||||
|
border-bottom: solid 2px var(--divider);
|
||||||
}
|
}
|
||||||
|
|
||||||
> *:last-child {
|
> .body {
|
||||||
margin-bottom: 0;
|
> *:first-child {
|
||||||
}
|
margin-top: 0;
|
||||||
|
}
|
||||||
|
|
||||||
::v-deep(a) {
|
> *:last-child {
|
||||||
color: var(--link);
|
margin-bottom: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
::v-deep(blockquote) {
|
::v-deep(a) {
|
||||||
display: block;
|
color: var(--link);
|
||||||
margin: 8px;
|
}
|
||||||
padding: 6px 0 6px 12px;
|
|
||||||
color: var(--fg);
|
|
||||||
border-left: solid 3px var(--fg);
|
|
||||||
opacity: 0.7;
|
|
||||||
|
|
||||||
p {
|
::v-deep(blockquote) {
|
||||||
margin: 0;
|
display: block;
|
||||||
|
margin: 8px;
|
||||||
|
padding: 6px 0 6px 12px;
|
||||||
|
color: var(--fg);
|
||||||
|
border-left: solid 3px var(--fg);
|
||||||
|
opacity: 0.7;
|
||||||
|
|
||||||
|
p {
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
::v-deep(h2) {
|
||||||
|
font-size: 1.25em;
|
||||||
|
padding: 0 0 0.5em 0;
|
||||||
|
margin: 1.5em 0 1em 0;
|
||||||
|
border-bottom: solid 0.5px var(--divider);
|
||||||
|
}
|
||||||
|
|
||||||
|
::v-deep(h3) {
|
||||||
|
margin: 1.25em 0 0.5em 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
::v-deep(table) {
|
||||||
|
width: 100%;
|
||||||
|
max-width: 100%;
|
||||||
|
overflow: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
::v-deep(kbd.group) {
|
||||||
|
display: inline-block;
|
||||||
|
padding: 2px;
|
||||||
|
border: 1px solid var(--divider);
|
||||||
|
border-radius: 4px;
|
||||||
|
box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1);
|
||||||
|
}
|
||||||
|
|
||||||
|
::v-deep(kbd.key) {
|
||||||
|
display: inline-block;
|
||||||
|
padding: 6px 8px;
|
||||||
|
border: solid 0.5px var(--divider);
|
||||||
|
border-radius: 4px;
|
||||||
|
box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1);
|
||||||
|
}
|
||||||
|
|
||||||
|
::v-deep(code) {
|
||||||
|
display: inline-block;
|
||||||
|
font-family: Fira code, Fira Mono, Consolas, Menlo, Courier, monospace;
|
||||||
|
tab-size: 2;
|
||||||
|
background: #272822;
|
||||||
|
color: #f8f8f2;
|
||||||
|
border-radius: 6px;
|
||||||
|
padding: 4px 6px;
|
||||||
|
}
|
||||||
|
|
||||||
|
::v-deep(pre) {
|
||||||
|
background: #272822;
|
||||||
|
color: #f8f8f2;
|
||||||
|
border-radius: 6px;
|
||||||
|
padding: 12px 16px;
|
||||||
|
|
||||||
|
> code {
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
::v-deep(.info) {
|
||||||
|
font-size: 90%;
|
||||||
|
background: var(--infoBg);
|
||||||
|
color: var(--infoFg);
|
||||||
|
padding: 1em;
|
||||||
|
margin: 0.75em 0;
|
||||||
|
border-radius: 6px;
|
||||||
|
}
|
||||||
|
|
||||||
|
::v-deep(.warn) {
|
||||||
|
font-size: 90%;
|
||||||
|
background: var(--infoWarnBg);
|
||||||
|
color: var(--infoWarnFg);
|
||||||
|
padding: 1em;
|
||||||
|
margin: 0.75em 0;
|
||||||
|
border-radius: 6px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
::v-deep(h2) {
|
> .footer {
|
||||||
font-size: 1.25em;
|
padding: 1.5em 0 0 0;
|
||||||
padding: 0 0 0.5em 0;
|
margin: 1.5em 0 0 0;
|
||||||
margin: 1.5em 0 1em 0;
|
border-top: solid 2px var(--divider);
|
||||||
border-bottom: solid 0.5px var(--divider);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
::v-deep(table) {
|
|
||||||
width: 100%;
|
|
||||||
max-width: 100%;
|
|
||||||
overflow: auto;
|
|
||||||
}
|
|
||||||
|
|
||||||
::v-deep(kbd.group) {
|
|
||||||
display: inline-block;
|
|
||||||
padding: 2px;
|
|
||||||
border: 1px solid var(--divider);
|
|
||||||
border-radius: 4px;
|
|
||||||
box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1);
|
|
||||||
}
|
|
||||||
|
|
||||||
::v-deep(kbd.key) {
|
|
||||||
display: inline-block;
|
|
||||||
padding: 6px 8px;
|
|
||||||
border: solid 0.5px var(--divider);
|
|
||||||
border-radius: 4px;
|
|
||||||
box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1);
|
|
||||||
}
|
|
||||||
|
|
||||||
::v-deep(code) {
|
|
||||||
display: inline-block;
|
|
||||||
font-family: Fira code, Fira Mono, Consolas, Menlo, Courier, monospace;
|
|
||||||
tab-size: 2;
|
|
||||||
background: #272822;
|
|
||||||
color: #f8f8f2;
|
|
||||||
border-radius: 6px;
|
|
||||||
padding: 4px 6px;
|
|
||||||
}
|
|
||||||
|
|
||||||
::v-deep(pre) {
|
|
||||||
background: #272822;
|
|
||||||
color: #f8f8f2;
|
|
||||||
border-radius: 6px;
|
|
||||||
padding: 12px 16px;
|
|
||||||
|
|
||||||
> code {
|
|
||||||
padding: 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
> .footer {
|
|
||||||
padding: 1.5em 0 0 0;
|
|
||||||
margin: 1.5em 0 0 0;
|
|
||||||
border-top: solid 2px var(--divider);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
@ -1,14 +1,50 @@
|
|||||||
<template>
|
<template>
|
||||||
<div>
|
<div class="vtaihdtm">
|
||||||
<main class="_section">
|
<div class="search">
|
||||||
<div class="_content">
|
<MkInput v-model="query" :debounce="true" type="search" class="_inputNoTopMargin _inputNoBottomMargin" :placeholder="$ts.search">
|
||||||
<ul>
|
<template #prefix><i class="fas fa-search"></i></template>
|
||||||
<li v-for="doc in docs" :key="doc.path">
|
</MkInput>
|
||||||
<MkA :to="`/docs/${doc.path}`">{{ doc.title }}</MkA>
|
</div>
|
||||||
</li>
|
<MkFolder>
|
||||||
</ul>
|
<template #header>{{ $ts._docs.generalTopics }}</template>
|
||||||
|
<div class="docs">
|
||||||
|
<MkA v-for="doc in docs.filter(doc => doc.path.startsWith('general/'))" :key="doc.path" :to="`/docs/${doc.path}`" class="doc">
|
||||||
|
<div class="title">{{ doc.title }}</div>
|
||||||
|
<div class="summary">{{ doc.summary }}</div>
|
||||||
|
<div class="read">{{ $ts._docs.continueReading }}</div>
|
||||||
|
</MkA>
|
||||||
</div>
|
</div>
|
||||||
</main>
|
</MkFolder>
|
||||||
|
<MkFolder>
|
||||||
|
<template #header>{{ $ts._docs.features }}</template>
|
||||||
|
<div class="docs">
|
||||||
|
<MkA v-for="doc in docs.filter(doc => doc.path.startsWith('features/'))" :key="doc.path" :to="`/docs/${doc.path}`" class="doc">
|
||||||
|
<div class="title">{{ doc.title }}</div>
|
||||||
|
<div class="summary">{{ doc.summary }}</div>
|
||||||
|
<div class="read">{{ $ts._docs.continueReading }}</div>
|
||||||
|
</MkA>
|
||||||
|
</div>
|
||||||
|
</MkFolder>
|
||||||
|
<MkFolder>
|
||||||
|
<template #header>{{ $ts._docs.advancedTopics }}</template>
|
||||||
|
<div class="docs">
|
||||||
|
<MkA v-for="doc in docs.filter(doc => doc.path.startsWith('advanced/'))" :key="doc.path" :to="`/docs/${doc.path}`" class="doc">
|
||||||
|
<div class="title">{{ doc.title }}</div>
|
||||||
|
<div class="summary">{{ doc.summary }}</div>
|
||||||
|
<div class="read">{{ $ts._docs.continueReading }}</div>
|
||||||
|
</MkA>
|
||||||
|
</div>
|
||||||
|
</MkFolder>
|
||||||
|
<MkFolder>
|
||||||
|
<template #header>{{ $ts._docs.admin }}</template>
|
||||||
|
<div class="docs">
|
||||||
|
<MkA v-for="doc in docs.filter(doc => doc.path.startsWith('admin/'))" :key="doc.path" :to="`/docs/${doc.path}`" class="doc">
|
||||||
|
<div class="title">{{ doc.title }}</div>
|
||||||
|
<div class="summary">{{ doc.summary }}</div>
|
||||||
|
<div class="read">{{ $ts._docs.continueReading }}</div>
|
||||||
|
</MkA>
|
||||||
|
</div>
|
||||||
|
</MkFolder>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
@ -16,8 +52,15 @@
|
|||||||
import { defineComponent } from 'vue';
|
import { defineComponent } from 'vue';
|
||||||
import { url, lang } from '@client/config';
|
import { url, lang } from '@client/config';
|
||||||
import * as symbols from '@client/symbols';
|
import * as symbols from '@client/symbols';
|
||||||
|
import MkFolder from '@client/components/ui/folder.vue';
|
||||||
|
import MkInput from '@client/components/ui/input.vue';
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
|
components: {
|
||||||
|
MkFolder,
|
||||||
|
MkInput,
|
||||||
|
},
|
||||||
|
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
[symbols.PAGE_INFO]: {
|
[symbols.PAGE_INFO]: {
|
||||||
@ -25,13 +68,72 @@ export default defineComponent({
|
|||||||
icon: 'fas fa-question-circle'
|
icon: 'fas fa-question-circle'
|
||||||
},
|
},
|
||||||
docs: [],
|
docs: [],
|
||||||
|
query: null,
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
watch: {
|
||||||
|
query() {
|
||||||
|
fetch(`${url}/docs.json?lang=${lang}&q=${this.query}`).then(res => res.json()).then(docs => {
|
||||||
|
this.docs = docs;
|
||||||
|
});
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
created() {
|
created() {
|
||||||
fetch(`${url}/docs.json?lang=${lang}`).then(res => res.json()).then(docs => {
|
fetch(`${url}/docs.json?lang=ja-JP`).then(res => res.json()).then(jaDocs => {
|
||||||
this.docs = docs;
|
fetch(`${url}/docs.json?lang=${lang}`).then(res => res.json()).then(docs => {
|
||||||
|
this.docs = jaDocs.map(doc => {
|
||||||
|
const exist = docs.find(d => d.path === doc.path);
|
||||||
|
return exist || doc;
|
||||||
|
});
|
||||||
|
});
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
.vtaihdtm {
|
||||||
|
background: var(--panel);
|
||||||
|
|
||||||
|
> .search {
|
||||||
|
padding: 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.docs {
|
||||||
|
display: grid;
|
||||||
|
grid-template-columns: repeat(auto-fill, minmax(270px, 1fr));
|
||||||
|
grid-gap: 12px;
|
||||||
|
margin: 0 16px 16px 16px;
|
||||||
|
|
||||||
|
> .doc {
|
||||||
|
display: inline-block;
|
||||||
|
padding: 16px;
|
||||||
|
border: solid 1px var(--divider);
|
||||||
|
border-radius: 6px;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
border: solid 1px var(--accent);
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
> .title {
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
> .summary {
|
||||||
|
white-space: nowrap;
|
||||||
|
overflow: hidden;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
font-size: 0.9em;
|
||||||
|
}
|
||||||
|
|
||||||
|
> .read {
|
||||||
|
color: var(--link);
|
||||||
|
font-size: 0.9em;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user