Compare commits
314 Commits
Author | SHA1 | Date | |
---|---|---|---|
bb7edfee04 | |||
caa14c70ef | |||
3a0f72867f | |||
10d72742f5 | |||
1b9f8a87d3 | |||
d4a630902d | |||
fef5ec874b | |||
f2e347fec1 | |||
cd3c2484ee | |||
6a396ef5e3 | |||
eec1af1f52 | |||
99fc77b678 | |||
8bb311df51 | |||
a77df249c2 | |||
2883bca257 | |||
dd3af6886b | |||
33bcf2d1ea | |||
795fb0eb60 | |||
9e9d378bf1 | |||
4a6b0edce6 | |||
356225af14 | |||
331305e6c7 | |||
917b9475a5 | |||
e895fc954b | |||
6d3e18a6a1 | |||
79354f4faf | |||
28f8933c3c | |||
10356b4041 | |||
6a732ab1cd | |||
47322b35ff | |||
4c6d0386b9 | |||
a448172952 | |||
244ef0cb8f | |||
cc66a1f9c7 | |||
e2183400e5 | |||
afc531bd26 | |||
02cc1891f2 | |||
09e3ddbd57 | |||
d0fff562ea | |||
8ce5366e80 | |||
bfcda7cc02 | |||
c52aeb6618 | |||
f5ebfdca61 | |||
db93838729 | |||
bb835a6e8a | |||
52feba0e3a | |||
a1076c3108 | |||
bad068b20e | |||
ec41d461c0 | |||
a826cd6845 | |||
a950b6193a | |||
2cc4de2b23 | |||
03ef6996ff | |||
d1e5def30e | |||
02fbda2154 | |||
c21694a24a | |||
cb98336b0a | |||
97d25bc6a3 | |||
b36a1a9d0e | |||
cd44ff0aaa | |||
032571c326 | |||
6b890e3f82 | |||
9998845b21 | |||
7ee4385deb | |||
695277c9eb | |||
f014a79f8d | |||
1a6d47a633 | |||
12eed8f859 | |||
549092d9aa | |||
b245393bc4 | |||
dcd43a17ba | |||
b8088dc01a | |||
8e1b90ab43 | |||
614a1d74dd | |||
9ea1ed8559 | |||
3e1e234799 | |||
62f5ecd278 | |||
27733e2119 | |||
6be127e18b | |||
4bf1c23b3c | |||
608b8bb741 | |||
ef01eec36e | |||
5dbdd0e685 | |||
5273050ab3 | |||
fae3b02e5a | |||
3489e4af1e | |||
8e9bd0bbd5 | |||
3725b5bc34 | |||
998a59aa5e | |||
86c017674a | |||
cbae87cd11 | |||
5bc1f8d468 | |||
d3a355e164 | |||
45413c9d28 | |||
082ee8836f | |||
2f5bd5e6d7 | |||
639e0137cc | |||
2f898aa037 | |||
a43a225740 | |||
833c39969b | |||
e25dea27e7 | |||
dac962580b | |||
b12bf78c6d | |||
a44b005f7c | |||
4ea65dbe41 | |||
90ba51ee9c | |||
ecf44084dc | |||
9f49c663f8 | |||
c8c9a67485 | |||
837358df66 | |||
498bc7cebe | |||
9c3a4eb947 | |||
de1ecbaef4 | |||
4eb05efa7c | |||
ffa40227ec | |||
b44e1820a2 | |||
eb461481ed | |||
92f47cc9cb | |||
f82c6f7ab4 | |||
9f32e46921 | |||
eba96282d6 | |||
dd8423fbb5 | |||
76f992906d | |||
402d6de02d | |||
43e3ce1ed5 | |||
15050018f2 | |||
71d6394bc8 | |||
1d6791e4c2 | |||
7f0084a7ed | |||
1374a12f89 | |||
92937b8b3c | |||
d0ed5a8b59 | |||
2b318a1021 | |||
903e93ae01 | |||
06c7fe669c | |||
e2c0ee66e4 | |||
c6c62f956b | |||
8fa27fea6c | |||
03c56f388c | |||
4090922e7e | |||
8061dedba1 | |||
da2112b659 | |||
ed5386771a | |||
d248828523 | |||
fc0b86fe19 | |||
346036ec88 | |||
a5e1ce0e0b | |||
67b39b1a98 | |||
6fb7721798 | |||
0018fd469e | |||
019f7480e8 | |||
8e0b088deb | |||
452005381f | |||
9722ed99a3 | |||
ee6311e83d | |||
1471e52307 | |||
f1fc12d9cc | |||
ebbc42bebc | |||
4785ee8c32 | |||
ab40756c1a | |||
c88e737a84 | |||
def5ea7978 | |||
e69ab45044 | |||
25d0b4bbf1 | |||
f86f5ac6cc | |||
07ce365bfd | |||
f31c94e2ea | |||
933638d035 | |||
b0151afa9a | |||
5bbd4ae703 | |||
f2f7f532a0 | |||
80eedf7449 | |||
1b48e0d6e0 | |||
0420c548da | |||
6e98b75d13 | |||
e772cb00d1 | |||
b5d5275e9b | |||
a2d3d22b6e | |||
1ad8603cc2 | |||
aeaf535ea2 | |||
917726fecc | |||
49a5b4eb14 | |||
8946f3ea18 | |||
1947835c51 | |||
c7c537c8b8 | |||
4e2f954683 | |||
abb0184329 | |||
ee483ecfd3 | |||
99384b4c22 | |||
65503bc68d | |||
ec6aadb5ce | |||
5f642886d9 | |||
4c26e3c54d | |||
3ca3712bae | |||
a471e4b783 | |||
20ac7e62e9 | |||
3e61aa0835 | |||
c18f6fde80 | |||
8b9397a0ce | |||
678ff17d0f | |||
ea2016c208 | |||
b5bdf266d3 | |||
2309680c38 | |||
e99bf569c5 | |||
d3fd0f810a | |||
484dc9b08a | |||
3bd827d7da | |||
d425c72134 | |||
969cd16638 | |||
569be15705 | |||
03f54c5b02 | |||
06ddc8ec50 | |||
1528935008 | |||
7121bdef6b | |||
f6c376f20d | |||
241769d6fc | |||
7727651871 | |||
ce331826ac | |||
ae92c52d61 | |||
54aef5fe6f | |||
d22148b418 | |||
5dc75c9cea | |||
200e82decb | |||
50359dbaf4 | |||
7165f21a62 | |||
8aab828c65 | |||
c9f8c12f5b | |||
a347f8fa49 | |||
2d76bdd0f8 | |||
c5cdd56edb | |||
6901ab39ed | |||
b851b7f431 | |||
ccaa99115c | |||
813de15e85 | |||
fa33181fa9 | |||
d4324dc0cb | |||
ccc27bcc14 | |||
014c1673c6 | |||
3a3319ff52 | |||
5b54ec8fb5 | |||
e690556286 | |||
660956917f | |||
3a5201747b | |||
b338e8a83f | |||
5584d56b6a | |||
c925498120 | |||
75615cf503 | |||
39f708b0fc | |||
ac32077221 | |||
a5902acacd | |||
c7c08b7511 | |||
7de915d47b | |||
9107547501 | |||
95dc76ca19 | |||
49c2a9b372 | |||
b378cabfc7 | |||
4263dbef31 | |||
32fc6ae2eb | |||
238cb0077f | |||
f5a06b6494 | |||
2c01329085 | |||
502de89ab1 | |||
128de6750c | |||
e59e2d9f0b | |||
2504b8391b | |||
330ea7d210 | |||
1edd173a29 | |||
98d873a7f9 | |||
09175b84df | |||
177e19632a | |||
8e6207f3e9 | |||
ff3a97f6cf | |||
b8e155ab40 | |||
b8e7df198d | |||
34311e3181 | |||
46115d3f04 | |||
c1d25d2394 | |||
880cea5a56 | |||
e7205d9cc2 | |||
f456feb3ff | |||
3f83beedb7 | |||
e6c9b1d9bd | |||
b46114f4fa | |||
8d77e2ba22 | |||
cb3900921f | |||
ae2021583d | |||
36cd88e6b7 | |||
517b0908da | |||
b23b3e4d21 | |||
883fc5dde0 | |||
9d044329f6 | |||
d1e9e74cb8 | |||
98a87ee75f | |||
331491077d | |||
913c3a6636 | |||
fbaf5fe355 | |||
804c932f60 | |||
cef6d1d1b6 | |||
e4e7ab1135 | |||
6ca30df8c4 | |||
a340d4ed8e | |||
ca7cb94358 | |||
54779b25f5 | |||
44d7652171 | |||
c9ed15b682 | |||
8faad646ae | |||
1d50bc3382 | |||
da4af041af | |||
e2ff408f2f | |||
f799375635 | |||
65704bbf01 | |||
9cb3882efa | |||
a0833ca691 | |||
a4f197f608 |
@ -88,7 +88,9 @@ redis:
|
|||||||
#elasticsearch:
|
#elasticsearch:
|
||||||
# host: localhost
|
# host: localhost
|
||||||
# port: 9200
|
# port: 9200
|
||||||
# pass: null
|
# ssl: false
|
||||||
|
# user:
|
||||||
|
# pass:
|
||||||
|
|
||||||
# ┌───────────────┐
|
# ┌───────────────┐
|
||||||
#───┘ ID generation └───────────────────────────────────────────
|
#───┘ ID generation └───────────────────────────────────────────
|
||||||
|
11
.github/workflows/nodejs.yml
vendored
@ -21,6 +21,7 @@ jobs:
|
|||||||
- 5432:5432
|
- 5432:5432
|
||||||
env:
|
env:
|
||||||
POSTGRES_DB: test-misskey
|
POSTGRES_DB: test-misskey
|
||||||
|
POSTGRES_HOST_AUTH_METHOD: trust
|
||||||
redis:
|
redis:
|
||||||
image: redis:alpine
|
image: redis:alpine
|
||||||
ports:
|
ports:
|
||||||
@ -40,3 +41,13 @@ jobs:
|
|||||||
run: yarn build
|
run: yarn build
|
||||||
- name: Test
|
- name: Test
|
||||||
run: yarn test
|
run: yarn test
|
||||||
|
|
||||||
|
lint:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v2
|
||||||
|
- uses: actions/setup-node@v1
|
||||||
|
with:
|
||||||
|
node-version: 12.x
|
||||||
|
- run: yarn install
|
||||||
|
- run: yarn lint
|
||||||
|
4
.mocharc.json
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
{
|
||||||
|
"timeout": 30000,
|
||||||
|
"slow": 1000
|
||||||
|
}
|
201
CHANGELOG.md
@ -1,6 +1,207 @@
|
|||||||
ChangeLog
|
ChangeLog
|
||||||
=========
|
=========
|
||||||
|
|
||||||
|
12.28.0 (2020/3/29)
|
||||||
|
-------------------
|
||||||
|
### ✨Improvements
|
||||||
|
* インストールされたアプリのページでアプリの権限を確認できるように
|
||||||
|
* API: api/meta.features.miauthを追加
|
||||||
|
MiAuthに対応しているかどうかを確認するために利用できます。
|
||||||
|
値はつねにtrueを取ります。
|
||||||
|
* インスタンス一覧でソートできるように
|
||||||
|
|
||||||
|
12.27.1 (2020/03/28)
|
||||||
|
-------------------
|
||||||
|
|
||||||
|
### ✨Improvements
|
||||||
|
* MiAuthのバグを修正
|
||||||
|
|
||||||
|
12.27.0 (2020/03/28)
|
||||||
|
-------------------
|
||||||
|
|
||||||
|
### ✨Improvements
|
||||||
|
* サードパーティーアプリケーションの認証方法にMiAuthを追加 ([Misskey API ドキュメント](https://github.com/syuilo/misskey/blob/b8088dc01a0c53b264c0697082ff5b16b06c4cda/src/docs/api.ja-JP.md#%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%A8%E3%81%97%E3%81%A6%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E3%83%88%E3%83%BC%E3%82%AF%E3%83%B3%E3%82%92%E5%8F%96%E5%BE%97%E3%81%99%E3%82%8B))
|
||||||
|
従来の、API `app/create` => `auth/session/generate` => `auth/session/userkey` を使用する方法は依然として使用可能です。
|
||||||
|
UIからアプリを作成する画面 (`/dev/apps`) は廃止されました、同等の操作を行いたい場合は API `app/create` で可能です。
|
||||||
|
MiAuthに対応しているかどうかは`api/meta.features.miauth`で確認できます(12.28.0~)。
|
||||||
|
* テーマをインポートする前にプレビューできるように
|
||||||
|
* アプリから通知を作成できるように
|
||||||
|
* インストールしたアプリを見たり削除したりできるように
|
||||||
|
|
||||||
|
12.26.0 (2020/03/25)
|
||||||
|
-------------------
|
||||||
|
|
||||||
|
### ✨Improvements
|
||||||
|
* ロゴが新しく
|
||||||
|
* インスタンス設定の「ユーザー」が登録の逆順で表示されるように
|
||||||
|
|
||||||
|
### 🐛Fixes
|
||||||
|
* 新規登録フォームの「利用規約」のリンク色が通常の文字と同じだった問題を修正
|
||||||
|
* ダークモードの同期の問題を修正
|
||||||
|
|
||||||
|
12.25.0 (2020/03/24)
|
||||||
|
-------------------
|
||||||
|
|
||||||
|
### ✨Improvements
|
||||||
|
* テーマインポート機能を実装
|
||||||
|
|
||||||
|
### 🐛Fixes
|
||||||
|
* 誰もフォローしていないときにタイムラインの読み込みが遅い問題を修正
|
||||||
|
|
||||||
|
|
||||||
|
12.24.2 (2020/03/22)
|
||||||
|
-------------------
|
||||||
|
|
||||||
|
### 🐛Fixes
|
||||||
|
* ダークモードの同期を修正
|
||||||
|
|
||||||
|
12.24.1 (2020/03/22)
|
||||||
|
-------------------
|
||||||
|
|
||||||
|
### ✨Improvements
|
||||||
|
* SVG形式のアイコンファイルを追加
|
||||||
|
|
||||||
|
### 🐛Fixes
|
||||||
|
* iOSで起動できない問題を修正
|
||||||
|
* Pages画面にタイトルがない問題を修正
|
||||||
|
|
||||||
|
12.24.0 (2020/03/22)
|
||||||
|
-------------------
|
||||||
|
|
||||||
|
### ✨Improvements
|
||||||
|
* クライアント設定にアカウント設定へのリンクを追加
|
||||||
|
* ダークモードの同期を強化
|
||||||
|
|
||||||
|
### 🐛Fixes
|
||||||
|
* 画面が小さいとメニューがすべて見えない問題を修正
|
||||||
|
|
||||||
|
12.23.0 (2020/03/22)
|
||||||
|
-------------------
|
||||||
|
|
||||||
|
### ✨Improvements
|
||||||
|
* 削除して編集できるように
|
||||||
|
* 基底テーマ分離
|
||||||
|
* 端末がダークモードか否かでテーマを切り替えられるように
|
||||||
|
|
||||||
|
### 🐛Fixes
|
||||||
|
* ユーザー名のサジェストをアクティブであるユーザー順に表示するのがうまくいっていないのを修正
|
||||||
|
* 招待コードが発行できない問題を修正
|
||||||
|
* CIが通らない問題を修正
|
||||||
|
|
||||||
|
12.22.0 (2020/03/21)
|
||||||
|
-------------------
|
||||||
|
|
||||||
|
### ✨Improvements
|
||||||
|
* Web UI のデザインを大幅に変更
|
||||||
|
* 通知のポップアップ表示を廃止
|
||||||
|
* リモートユーザーであっても投稿数、フォロー・フォロワー数を表示
|
||||||
|
* リモートユーザーであるという警告を投稿ページでも表示
|
||||||
|
* ユーザー名のサジェストをアクティブであるユーザー順に表示
|
||||||
|
* 通知音の音量スライダーなど、スライダーへのデザイン適用
|
||||||
|
* リアクション設定機能を刷新
|
||||||
|
* 同じホットキーが連続で発動しないように
|
||||||
|
* 同じノートを何回リノートしても一回として数えるように
|
||||||
|
* ElasticSearch で認証ができるように
|
||||||
|
|
||||||
|
### 🐛Fixes
|
||||||
|
|
||||||
|
* ユーザー名を設定していないユーザーのノートページのタイトルが「のノート」になる問題を修正
|
||||||
|
* ソーシャルアカウントでの連携ログインができない問題を修正
|
||||||
|
* アプリ認証画面でログインしたときに正常に遷移できない問題を修正
|
||||||
|
* オブジェクトストレージでS3のvirtual-host形式のサポートなど
|
||||||
|
* GIF 画像のバッジの色合いを修正
|
||||||
|
* ノートのテキストがMFMの使い方によってははみ出る問題を修正
|
||||||
|
* ダークテーマ利用時にセレクトが使いにくくなる問題を修正
|
||||||
|
* ボリュームを0にしてもサウンドが鳴動している問題を修正
|
||||||
|
* 検索窓のスタイルが適用されていなかった問題を修正
|
||||||
|
|
||||||
|
12.21.0 (2020/02/23)
|
||||||
|
-------------------
|
||||||
|
### ✨Improvements
|
||||||
|
* タイムラインに挿入されるおすすめノートに自分がリアクションしたものは含めないように
|
||||||
|
* ノートのメニューに詳細ページへのリンクを追加
|
||||||
|
* UIの調整
|
||||||
|
|
||||||
|
### 🐛Fixes
|
||||||
|
* チャットで自分の送信したURLが視認しにくい問題を修正
|
||||||
|
* ノートの内のインラインコードが横に突き抜ける問題を修正
|
||||||
|
* (新しいノートがあります)表示中にタイムラインを切り替えると、表示が消えなくなってしまう問題を修正
|
||||||
|
* 引用RNフォームを開いた時だけ、textareaにフォーカスが当たっていない問題を修正
|
||||||
|
|
||||||
|
12.20.0 (2020/02/22)
|
||||||
|
-------------------
|
||||||
|
### ✨Improvements
|
||||||
|
* UIの調整
|
||||||
|
|
||||||
|
### 🐛Fixes
|
||||||
|
* 複数タブで開いてるときに動作がおかしい問題を修正
|
||||||
|
* メディア付きノートの詳細表示をした後TLに戻るとノートがバグる問題を修正
|
||||||
|
|
||||||
|
12.19.0 (2020/02/21)
|
||||||
|
-------------------
|
||||||
|
### ✨Improvements
|
||||||
|
* アンテナで除外キーワードを設定できるように
|
||||||
|
|
||||||
|
### 🐛Fixes
|
||||||
|
* ハッシュタグをもっと見るできないのを修正
|
||||||
|
* 無効になっているタイムラインでも使用できるかのように表示される問題を修正
|
||||||
|
* バックグラウンドで受信したノートの画像が表示されない問題を修正
|
||||||
|
* サインインフォームが表示されない場所がある問題を修正
|
||||||
|
* ボリュームが0のときサウンドを鳴らさないように
|
||||||
|
|
||||||
|
12.18.1 (2020/02/20)
|
||||||
|
-------------------
|
||||||
|
### 🐛Fixes
|
||||||
|
* タイムラインのハイライトに自分のノートは含めないように
|
||||||
|
* ハッシュタグの集計に関する問題を修正
|
||||||
|
|
||||||
|
12.18.0 (2020/02/20)
|
||||||
|
-------------------
|
||||||
|
### ✨Improvements
|
||||||
|
* 効果音設定を強化
|
||||||
|
* UIの調整
|
||||||
|
|
||||||
|
### 🐛Fixes
|
||||||
|
* ユーザープレビューが稀に画面上から消えなくなってしまう問題を修正
|
||||||
|
* ハッシュタグ検索が遅い問題を修正
|
||||||
|
|
||||||
|
12.17.0 (2020/02/20)
|
||||||
|
-------------------
|
||||||
|
### ✨Improvements
|
||||||
|
* 効果音を実装
|
||||||
|
* 切断時ダイアログを控えめに
|
||||||
|
|
||||||
|
### 🐛Fixes
|
||||||
|
* 新しいノートの通知が崩れる問題を修正
|
||||||
|
* LegacyReaction変換にstarを追加
|
||||||
|
* ユーザープレビューが稀に画面上から消えなくなってしまう問題を修正
|
||||||
|
* media-listのgridの高さがsub-note-detailsのdetailsの中だと287pxになってしまっていたのを修正
|
||||||
|
|
||||||
|
12.16.0 (2020/02/19)
|
||||||
|
-------------------
|
||||||
|
### ✨Improvements
|
||||||
|
* 通知一覧をポップアップではなくページで表示できるように
|
||||||
|
* 返信、引用、メンションの通知を直接ノートとして表示するように
|
||||||
|
|
||||||
|
### 🐛Fixes
|
||||||
|
* v12以前のリアクションが表示されない問題を修正
|
||||||
|
|
||||||
|
12.15.0 (2020/02/19)
|
||||||
|
-------------------
|
||||||
|
### ✨Improvements
|
||||||
|
* 固定投稿フォームを実装
|
||||||
|
* ページ遷移のトランジションを無しに
|
||||||
|
* スクロールしてるときに新しいノートが来たときにわかるように表示するように
|
||||||
|
|
||||||
|
### 🐛Fixes
|
||||||
|
* ページのいいねボタンを修正
|
||||||
|
|
||||||
|
12.14.0 (2020/02/18)
|
||||||
|
-------------------
|
||||||
|
### ✨Improvements
|
||||||
|
* オブジェクトストレージの設定を実装
|
||||||
|
* サーバーログビューア実装
|
||||||
|
|
||||||
12.13.0 (2020/02/18)
|
12.13.0 (2020/02/18)
|
||||||
-------------------
|
-------------------
|
||||||
### ✨Improvements
|
### ✨Improvements
|
||||||
|
120
README.md
@ -89,6 +89,9 @@ Please see the [Contribution Guide](./CONTRIBUTING.md).
|
|||||||
<td><img src="https://avatars1.githubusercontent.com/u/30769358?s=460&v=4" alt="mei23" width="100"></td>
|
<td><img src="https://avatars1.githubusercontent.com/u/30769358?s=460&v=4" alt="mei23" width="100"></td>
|
||||||
<td><img src="https://avatars2.githubusercontent.com/u/20679825?s=460&v=4" alt="acid-chicken" width="100"></td>
|
<td><img src="https://avatars2.githubusercontent.com/u/20679825?s=460&v=4" alt="acid-chicken" width="100"></td>
|
||||||
<td><img src="https://avatars2.githubusercontent.com/u/6533808?s=460&v=4" alt="rinsuki" width="100"></td>
|
<td><img src="https://avatars2.githubusercontent.com/u/6533808?s=460&v=4" alt="rinsuki" width="100"></td>
|
||||||
|
<td><img src="https://avatars0.githubusercontent.com/u/7973572?s=460&v=4" alt="tamaina" width="100"></td>
|
||||||
|
<td><img src="https://avatars1.githubusercontent.com/u/7106976?s=460&v=4" alt="Xeltica" width="100"></td>
|
||||||
|
<td><img src="https://avatars1.githubusercontent.com/u/17376330?s=460&v=4" alt="u1-liquid" width="100"></td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td align="center"><a href="https://github.com/syuilo">@syuilo</a></td>
|
<td align="center"><a href="https://github.com/syuilo">@syuilo</a></td>
|
||||||
@ -96,6 +99,9 @@ Please see the [Contribution Guide](./CONTRIBUTING.md).
|
|||||||
<td align="center"><a href="https://github.com/mei23">@mei23</a></td>
|
<td align="center"><a href="https://github.com/mei23">@mei23</a></td>
|
||||||
<td align="center"><a href="https://github.com/acid-chicken">@acid-chicken</a></td>
|
<td align="center"><a href="https://github.com/acid-chicken">@acid-chicken</a></td>
|
||||||
<td align="center"><a href="https://github.com/rinsuki">@rinsuki</a></td>
|
<td align="center"><a href="https://github.com/rinsuki">@rinsuki</a></td>
|
||||||
|
<td align="center"><a href="https://github.com/tamaina">@tamaina</a></td>
|
||||||
|
<td align="center"><a href="https://github.com/Xeltica">@Xeltica</a></td>
|
||||||
|
<td align="center"><a href="https://github.com/u1-liquid">@u1-liquid</a></td>
|
||||||
</tr>
|
</tr>
|
||||||
</table>
|
</table>
|
||||||
|
|
||||||
@ -103,94 +109,102 @@ Please see the [Contribution Guide](./CONTRIBUTING.md).
|
|||||||
----------------------------------------------------------------
|
----------------------------------------------------------------
|
||||||
<!-- PATREON_START -->
|
<!-- PATREON_START -->
|
||||||
<table><tr>
|
<table><tr>
|
||||||
<td><img src="https://c8.patreon.com/2/200/20832595" alt="Roujo" width="100"></td>
|
<td><img src="https://c8.patreon.com/2/200/20832595" alt="Roujo " width="100"></td>
|
||||||
<td><img src="https://c8.patreon.com/2/200/27956229" alt="Oliver Maximilian Seidel" width="100"></td>
|
<td><img src="https://c8.patreon.com/2/200/27956229" alt="Oliver Maximilian Seidel" width="100"></td>
|
||||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/12190916/fb7fa7983c14425f890369535b1506a4/3.png?token-time=2145916800&token-hash=oH_i7gJjNT7Ot6j9JiVwy7ZJIBqACVnzLqlz4YrDAZA%3D" alt="weepjp" width="100"></td>
|
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/12190916/fb7fa7983c14425f890369535b1506a4/3.png?token-time=2145916800&token-hash=oH_i7gJjNT7Ot6j9JiVwy7ZJIBqACVnzLqlz4YrDAZA%3D" alt="weepjp " width="100"></td>
|
||||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/605366/c9dc408fdcbf412fb183ca5b06235f8d/1.jpeg?token-time=2145916800&token-hash=oaqsjLqOFjWN5I9hm2epOaTXaEtKwQUy5OW-EpAz6-g%3D" alt="Jon Leibowitz" width="100"></td>
|
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/605366/c9dc408fdcbf412fb183ca5b06235f8d/1.jpeg?token-time=2145916800&token-hash=oaqsjLqOFjWN5I9hm2epOaTXaEtKwQUy5OW-EpAz6-g%3D" alt="Jon Leibowitz" width="100"></td>
|
||||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/19045173/cb91c0f345c24d4ebfd05f19906d5e26/1.png?token-time=2145916800&token-hash=o_zKBytJs_AxHwSYw_5R8eD0eSJe3RoTR3kR3Q0syN0%3D" alt="kiritan" width="100"></td>
|
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/19045173/cb91c0f345c24d4ebfd05f19906d5e26/1.png?token-time=2145916800&token-hash=o_zKBytJs_AxHwSYw_5R8eD0eSJe3RoTR3kR3Q0syN0%3D" alt="kiritan " width="100"></td>
|
||||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/24430516/b1964ac5b9f746d2a12ff53dbc9aa40a/1.jpg?token-time=2145916800&token-hash=bmEiMGYpp3bS7hCCbymjGGsHBZM3AXuBOFO3Kro37PU%3D" alt="Eduardo Quiros" width="100"></td>
|
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/24430516/b1964ac5b9f746d2a12ff53dbc9aa40a/1.jpg?token-time=2145916800&token-hash=bmEiMGYpp3bS7hCCbymjGGsHBZM3AXuBOFO3Kro37PU%3D" alt="Eduardo Quiros" width="100"></td>
|
||||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/14215107/1cbe1912c26143919fa0faca16f12ce1/3.png?token-time=2145916800&token-hash=Zq1TCK2tdY7xudEm_aV70bc_wxmol6pNj3ZWbpFUNbI%3D" alt="Nesakko" width="100"></td>
|
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/14215107/1cbe1912c26143919fa0faca16f12ce1/3.png?token-time=2145916800&token-hash=Zq1TCK2tdY7xudEm_aV70bc_wxmol6pNj3ZWbpFUNbI%3D" alt="Nesakko " width="100"></td>
|
||||||
<td><img src="https://c8.patreon.com/2/200/776209" alt="Denshi" width="100"></td>
|
|
||||||
</tr><tr>
|
</tr><tr>
|
||||||
<td><a href="https://www.patreon.com/user?u=20832595">Roujo</a></td>
|
<td><a href="https://www.patreon.com/user?u=20832595">Roujo </a></td>
|
||||||
<td><a href="https://www.patreon.com/user?u=27956229">Oliver Maximilian Seidel</a></td>
|
<td><a href="https://www.patreon.com/user?u=27956229">Oliver Maximilian Seidel</a></td>
|
||||||
<td><a href="https://www.patreon.com/weepjp">weepjp</a></td>
|
<td><a href="https://www.patreon.com/weepjp">weepjp </a></td>
|
||||||
<td><a href="https://www.patreon.com/jonleibowitz">Jon Leibowitz</a></td>
|
<td><a href="https://www.patreon.com/jonleibowitz">Jon Leibowitz</a></td>
|
||||||
<td><a href="https://www.patreon.com/user?u=19045173">kiritan</a></td>
|
<td><a href="https://www.patreon.com/user?u=19045173">kiritan </a></td>
|
||||||
<td><a href="https://www.patreon.com/user?u=24430516">Eduardo Quiros</a></td>
|
<td><a href="https://www.patreon.com/user?u=24430516">Eduardo Quiros</a></td>
|
||||||
<td><a href="https://www.patreon.com/Nesakko">Nesakko</a></td>
|
<td><a href="https://www.patreon.com/Nesakko">Nesakko </a></td>
|
||||||
<td><a href="https://www.patreon.com/user?u=776209">Denshi</a></td>
|
|
||||||
</tr></table>
|
</tr></table>
|
||||||
<table><tr>
|
<table><tr>
|
||||||
|
<td><img src="https://c8.patreon.com/2/200/776209" alt="Denshi " width="100"></td>
|
||||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/3075183/c2ae575c604e420297f000ccc396e395/1.jpeg?token-time=2145916800&token-hash=O9qmPtpo6wWb0OuvnkEekhk_1WO2MTdytLr7ZgsAr80%3D" alt="Liaizon Wakest" width="100"></td>
|
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/3075183/c2ae575c604e420297f000ccc396e395/1.jpeg?token-time=2145916800&token-hash=O9qmPtpo6wWb0OuvnkEekhk_1WO2MTdytLr7ZgsAr80%3D" alt="Liaizon Wakest" width="100"></td>
|
||||||
<td><img src="https://c8.patreon.com/2/200/557245" alt="mkatze" width="100"></td>
|
<td><img src="https://c8.patreon.com/2/200/557245" alt="mkatze " width="100"></td>
|
||||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/23915207/25428766ecd745478e600b3d7f871eb2/1.png?token-time=2145916800&token-hash=urCLLA4KjJZX92Y1CxcBP4d8bVTHGkiaPnQZp-Tqz68%3D" alt="kabo2468y" width="100"></td>
|
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/23915207/25428766ecd745478e600b3d7f871eb2/1.png?token-time=2145916800&token-hash=urCLLA4KjJZX92Y1CxcBP4d8bVTHGkiaPnQZp-Tqz68%3D" alt="kabo2468y " width="100"></td>
|
||||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/8249688/4aacf36b6b244ab1bc6653591b6640df/2.png?token-time=2145916800&token-hash=1ZEf2w6L34253cZXS_HlVevLEENWS9QqrnxGUAYblPo%3D" alt="AureoleArk" width="100"></td>
|
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/8249688/4aacf36b6b244ab1bc6653591b6640df/2.png?token-time=2145916800&token-hash=1ZEf2w6L34253cZXS_HlVevLEENWS9QqrnxGUAYblPo%3D" alt="AureoleArk " width="100"></td>
|
||||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/5670915/ee175f0bfb6347ffa4ea101a8c097bff/1.jpg?token-time=2145916800&token-hash=mPLM9CA-riFHx-myr3bLZJuH2xBRHA9se5VbHhLIOuA%3D" alt="osapon" width="100"></td>
|
<td><img src="https://c8.patreon.com/2/200/21285325" alt="Nie(sha) " width="100"></td>
|
||||||
<td><img src="https://c8.patreon.com/2/200/16869916" alt="見当かなみ" width="100"></td>
|
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/5670915/ee175f0bfb6347ffa4ea101a8c097bff/1.jpg?token-time=2145916800&token-hash=mPLM9CA-riFHx-myr3bLZJuH2xBRHA9se5VbHhLIOuA%3D" alt="osapon " width="100"></td>
|
||||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/18899730/6a22797f68254034a854d69ea2445fc8/1.png?token-time=2145916800&token-hash=b_uj57yxo5VzkSOUS7oXE_762dyOTB_oxzbO6lFNG3k%3D" alt="YuzuRyo61" width="100"></td>
|
<td><img src="https://c8.patreon.com/2/200/16869916" alt="見当かなみ " width="100"></td>
|
||||||
|
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/18899730/6a22797f68254034a854d69ea2445fc8/1.png?token-time=2145916800&token-hash=b_uj57yxo5VzkSOUS7oXE_762dyOTB_oxzbO6lFNG3k%3D" alt="YuzuRyo61 " width="100"></td>
|
||||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/5788159/af42076ab3354bb49803cfba65f94bee/1.jpg?token-time=2145916800&token-hash=iSaxp_Yr2-ZiU2YVi9rcpZZj9mj3UvNSMrZr4CU4qtA%3D" alt="mewl hayabusa" width="100"></td>
|
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/5788159/af42076ab3354bb49803cfba65f94bee/1.jpg?token-time=2145916800&token-hash=iSaxp_Yr2-ZiU2YVi9rcpZZj9mj3UvNSMrZr4CU4qtA%3D" alt="mewl hayabusa" width="100"></td>
|
||||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/11357794/923ce94cd8c44ba788ee931907881839/1.png?token-time=2145916800&token-hash=9nEQje_eMvUjq9a7L3uBqW-MQbS-rRMaMgd7UYVoFNM%3D" alt="mydarkstar" width="100"></td>
|
|
||||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/28779508/3cd4cb7f017f4ee0864341e3464d42f9/1.png?token-time=2145916800&token-hash=eGQtR15be44kgvh8fw2Jx8Db4Bv15YBp2ldxh0EKRxA%3D" alt="S Y" width="100"></td>
|
|
||||||
</tr><tr>
|
</tr><tr>
|
||||||
|
<td><a href="https://www.patreon.com/user?u=776209">Denshi </a></td>
|
||||||
<td><a href="https://www.patreon.com/wakest">Liaizon Wakest</a></td>
|
<td><a href="https://www.patreon.com/wakest">Liaizon Wakest</a></td>
|
||||||
<td><a href="https://www.patreon.com/user?u=557245">mkatze</a></td>
|
<td><a href="https://www.patreon.com/user?u=557245">mkatze </a></td>
|
||||||
<td><a href="https://www.patreon.com/user?u=23915207">kabo2468y</a></td>
|
<td><a href="https://www.patreon.com/user?u=23915207">kabo2468y </a></td>
|
||||||
<td><a href="https://www.patreon.com/AureoleArk">AureoleArk</a></td>
|
<td><a href="https://www.patreon.com/AureoleArk">AureoleArk </a></td>
|
||||||
<td><a href="https://www.patreon.com/osapon">osapon</a></td>
|
<td><a href="https://www.patreon.com/user?u=21285325">Nie(sha) </a></td>
|
||||||
<td><a href="https://www.patreon.com/user?u=16869916">見当かなみ</a></td>
|
<td><a href="https://www.patreon.com/osapon">osapon </a></td>
|
||||||
<td><a href="https://www.patreon.com/Yuzulia">YuzuRyo61</a></td>
|
<td><a href="https://www.patreon.com/user?u=16869916">見当かなみ </a></td>
|
||||||
|
<td><a href="https://www.patreon.com/Yuzulia">YuzuRyo61 </a></td>
|
||||||
<td><a href="https://www.patreon.com/hs_sh_net">mewl hayabusa</a></td>
|
<td><a href="https://www.patreon.com/hs_sh_net">mewl hayabusa</a></td>
|
||||||
<td><a href="https://www.patreon.com/mydarkstar">mydarkstar</a></td>
|
|
||||||
<td><a href="https://www.patreon.com/user?u=28779508">S Y</a></td>
|
|
||||||
</tr></table>
|
</tr></table>
|
||||||
<table><tr>
|
<table><tr>
|
||||||
|
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/28779508/3cd4cb7f017f4ee0864341e3464d42f9/1.png?token-time=2145916800&token-hash=eGQtR15be44kgvh8fw2Jx8Db4Bv15YBp2ldxh0EKRxA%3D" alt="S Y" width="100"></td>
|
||||||
<td><img src="https://c8.patreon.com/2/200/16542964" alt="Takumi Sugita" width="100"></td>
|
<td><img src="https://c8.patreon.com/2/200/16542964" alt="Takumi Sugita" width="100"></td>
|
||||||
<td><img src="https://c8.patreon.com/2/200/17866454" alt="sikyosyounin" width="100"></td>
|
<td><img src="https://c8.patreon.com/2/200/17866454" alt="sikyosyounin " width="100"></td>
|
||||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/5881381/6235ca5d3fb04c8e95ef5b4ff2abcc18/3.png?token-time=2145916800&token-hash=KjfQL8nf3AIf6WqzLshBYAyX44piAqOAZiYXgZS_H6A%3D" alt="YUKIMOCHI" width="100"></td>
|
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/5881381/6235ca5d3fb04c8e95ef5b4ff2abcc18/3.png?token-time=2145916800&token-hash=KjfQL8nf3AIf6WqzLshBYAyX44piAqOAZiYXgZS_H6A%3D" alt="YUKIMOCHI " width="100"></td>
|
||||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/26340354/08834cf767b3449e93098ef73a434e2f/2.png?token-time=2145916800&token-hash=nyM8DnKRL8hR47HQ619mUzsqVRpkWZjgtgBU9RY15Uc%3D" alt="totokoro" width="100"></td>
|
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/26340354/08834cf767b3449e93098ef73a434e2f/2.png?token-time=2145916800&token-hash=nyM8DnKRL8hR47HQ619mUzsqVRpkWZjgtgBU9RY15Uc%3D" alt="totokoro " width="100"></td>
|
||||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/19356899/496b4681d33b4520bd7688e0fd19c04d/2.jpeg?token-time=2145916800&token-hash=_sTj3dUBOhn9qwiJ7F19Qd-yWWfUqJC_0jG1h0agEqQ%3D" alt="sheeta.s" width="100"></td>
|
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/19356899/496b4681d33b4520bd7688e0fd19c04d/2.jpeg?token-time=2145916800&token-hash=_sTj3dUBOhn9qwiJ7F19Qd-yWWfUqJC_0jG1h0agEqQ%3D" alt="sheeta.s " width="100"></td>
|
||||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/5827393/59893c191dda408f9cabd0f20a3a5627/1.jpeg?token-time=2145916800&token-hash=i9N05vOph-eP1LTLb9_npATjYOpntL0ZsHNaZFSsPmE%3D" alt="motcha" width="100"></td>
|
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/5827393/59893c191dda408f9cabd0f20a3a5627/1.jpeg?token-time=2145916800&token-hash=i9N05vOph-eP1LTLb9_npATjYOpntL0ZsHNaZFSsPmE%3D" alt="motcha " width="100"></td>
|
||||||
|
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/20494440/540beaf2445f408ea6597bc61e077bb3/1.png?token-time=2145916800&token-hash=UJ0JQge64Bx9XmN_qYA1inMQhrWf4U91fqz7VAKJeSg%3D" alt="axtuki1 " width="100"></td>
|
||||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/13737140/1adf7835017d479280d90fe8d30aade2/1.png?token-time=2145916800&token-hash=0pdle8h5pDZrww0BDOjdz6zO-HudeGTh36a3qi1biVU%3D" alt="Satsuki Yanagi" width="100"></td>
|
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/13737140/1adf7835017d479280d90fe8d30aade2/1.png?token-time=2145916800&token-hash=0pdle8h5pDZrww0BDOjdz6zO-HudeGTh36a3qi1biVU%3D" alt="Satsuki Yanagi" width="100"></td>
|
||||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/17880724/311738c8a48f4a6b9443c2445a75adde/1.jpg?token-time=2145916800&token-hash=nVAntpybQrznE0rg05keLrSE6ogPKJXB13rmrJng42c%3D" alt="takimura" width="100"></td>
|
|
||||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/13100201/fc5be4fa90444f09a9c8a06f72385272/1.png?token-time=2145916800&token-hash=i8PjlgfOB2LPEdbtWyx8ZPsBKhGcNZqcw_FQmH71UGU%3D" alt="aqz tamaina" width="100"></td>
|
|
||||||
</tr><tr>
|
</tr><tr>
|
||||||
|
<td><a href="https://www.patreon.com/user?u=28779508">S Y</a></td>
|
||||||
<td><a href="https://www.patreon.com/user?u=16542964">Takumi Sugita</a></td>
|
<td><a href="https://www.patreon.com/user?u=16542964">Takumi Sugita</a></td>
|
||||||
<td><a href="https://www.patreon.com/user?u=17866454">sikyosyounin</a></td>
|
<td><a href="https://www.patreon.com/user?u=17866454">sikyosyounin </a></td>
|
||||||
<td><a href="https://www.patreon.com/yukimochi">YUKIMOCHI</a></td>
|
<td><a href="https://www.patreon.com/yukimochi">YUKIMOCHI </a></td>
|
||||||
<td><a href="https://www.patreon.com/user?u=26340354">totokoro</a></td>
|
<td><a href="https://www.patreon.com/user?u=26340354">totokoro </a></td>
|
||||||
<td><a href="https://www.patreon.com/user?u=19356899">sheeta.s</a></td>
|
<td><a href="https://www.patreon.com/user?u=19356899">sheeta.s </a></td>
|
||||||
<td><a href="https://www.patreon.com/user?u=5827393">motcha</a></td>
|
<td><a href="https://www.patreon.com/user?u=5827393">motcha </a></td>
|
||||||
|
<td><a href="https://www.patreon.com/user?u=20494440">axtuki1 </a></td>
|
||||||
<td><a href="https://www.patreon.com/user?u=13737140">Satsuki Yanagi</a></td>
|
<td><a href="https://www.patreon.com/user?u=13737140">Satsuki Yanagi</a></td>
|
||||||
<td><a href="https://www.patreon.com/takimura">takimura</a></td>
|
|
||||||
<td><a href="https://www.patreon.com/aqz">aqz tamaina</a></td>
|
|
||||||
</tr></table>
|
</tr></table>
|
||||||
<table><tr>
|
<table><tr>
|
||||||
|
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/17880724/311738c8a48f4a6b9443c2445a75adde/1.jpg?token-time=2145916800&token-hash=nVAntpybQrznE0rg05keLrSE6ogPKJXB13rmrJng42c%3D" alt="takimura " width="100"></td>
|
||||||
|
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/13100201/fc5be4fa90444f09a9c8a06f72385272/1.png?token-time=2145916800&token-hash=i8PjlgfOB2LPEdbtWyx8ZPsBKhGcNZqcw_FQmH71UGU%3D" alt="aqz tamaina" width="100"></td>
|
||||||
|
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/28295158/cd2451bfb94a449dbf705ef4718cd355/2.jpeg?token-time=2145916800&token-hash=MRv3BxufHPuCyiBSxU5UYmLGvD6YZlhtSFRfMWg2k4U%3D" alt="012 " width="100"></td>
|
||||||
|
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/9109588/e3cffc48d20a4e43afe04123e696781d/3.png?token-time=2145916800&token-hash=T_VIUA0IFIbleZv4pIjiszZGnQonwn34sLCYFIhakBo%3D" alt="nafuchoco " width="100"></td>
|
||||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/16900731/619ab87cc08448439222631ebb26802f/1.gif?token-time=2145916800&token-hash=o27K7M02s1z-LkDUEO5Oa7cu-GviRXeOXxryi4o_6VU%3D" alt="Atsuko Tominaga" width="100"></td>
|
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/16900731/619ab87cc08448439222631ebb26802f/1.gif?token-time=2145916800&token-hash=o27K7M02s1z-LkDUEO5Oa7cu-GviRXeOXxryi4o_6VU%3D" alt="Atsuko Tominaga" width="100"></td>
|
||||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/4389829/9f709180ac714651a70f74a82f3ffdb9/3.png?token-time=2145916800&token-hash=FTm3WVom4dJ9NwWMU4OpCL_8Yc13WiwEbKrDPyTZTPs%3D" alt="natalie" width="100"></td>
|
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/4389829/9f709180ac714651a70f74a82f3ffdb9/3.png?token-time=2145916800&token-hash=FTm3WVom4dJ9NwWMU4OpCL_8Yc13WiwEbKrDPyTZTPs%3D" alt="natalie " width="100"></td>
|
||||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/5923936/2a743cbfbff946c2af3f09026047c0da/2.png?token-time=2145916800&token-hash=h6yphW1qnM0n_NOWaf8qtszMRLXEwIxfk5beu4RxdT0%3D" alt="noellabo" width="100"></td>
|
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/5923936/2a743cbfbff946c2af3f09026047c0da/2.png?token-time=2145916800&token-hash=h6yphW1qnM0n_NOWaf8qtszMRLXEwIxfk5beu4RxdT0%3D" alt="noellabo " width="100"></td>
|
||||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/2384390/5681180e1efb46a8b28e0e8d4c8b9037/1.jpg?token-time=2145916800&token-hash=SJcMy-Q1BcS940-LFUVOMfR7-5SgrzsEQGhYb3yowFk%3D" alt="CG" width="100"></td>
|
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/2384390/5681180e1efb46a8b28e0e8d4c8b9037/1.jpg?token-time=2145916800&token-hash=SJcMy-Q1BcS940-LFUVOMfR7-5SgrzsEQGhYb3yowFk%3D" alt="CG " width="100"></td>
|
||||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/18072312/98e894d960314fa7bc236a72a39488fe/1.jpg?token-time=2145916800&token-hash=7bkMqTwHPRsJPGAq42PYdDXDZBVGLqdgr1ZmBxX8GFQ%3D" alt="Hekovic" width="100"></td>
|
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/18072312/98e894d960314fa7bc236a72a39488fe/1.jpg?token-time=2145916800&token-hash=7bkMqTwHPRsJPGAq42PYdDXDZBVGLqdgr1ZmBxX8GFQ%3D" alt="Hekovic " width="100"></td>
|
||||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/24641572/b4fd175424814f15b0ca9178d2d2d2e4/1.png?token-time=2145916800&token-hash=e2fyqdbuJbpCckHcwux7rbuW6OPkKdERcus0u2wIEWU%3D" alt="uroco @99" width="100"></td>
|
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/24641572/b4fd175424814f15b0ca9178d2d2d2e4/1.png?token-time=2145916800&token-hash=e2fyqdbuJbpCckHcwux7rbuW6OPkKdERcus0u2wIEWU%3D" alt="uroco @99" width="100"></td>
|
||||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/4503830/ccf2cc867ea64de0b524bb2e24b9a1cb/1.jpeg?token-time=2145916800&token-hash=L55UhJ0rcuNAH3w_ryeeGN4hC6taoOixyAhraEi0bzw%3D" alt="dansup" width="100"></td>
|
|
||||||
</tr><tr>
|
</tr><tr>
|
||||||
|
<td><a href="https://www.patreon.com/takimura">takimura </a></td>
|
||||||
|
<td><a href="https://www.patreon.com/aqz">aqz tamaina</a></td>
|
||||||
|
<td><a href="https://www.patreon.com/user?u=28295158">012 </a></td>
|
||||||
|
<td><a href="https://www.patreon.com/nijimiss">nafuchoco </a></td>
|
||||||
<td><a href="https://www.patreon.com/user?u=16900731">Atsuko Tominaga</a></td>
|
<td><a href="https://www.patreon.com/user?u=16900731">Atsuko Tominaga</a></td>
|
||||||
<td><a href="https://www.patreon.com/user?u=4389829">natalie</a></td>
|
<td><a href="https://www.patreon.com/user?u=4389829">natalie </a></td>
|
||||||
<td><a href="https://www.patreon.com/noellabo">noellabo</a></td>
|
<td><a href="https://www.patreon.com/noellabo">noellabo </a></td>
|
||||||
<td><a href="https://www.patreon.com/Corset">CG</a></td>
|
<td><a href="https://www.patreon.com/Corset">CG </a></td>
|
||||||
<td><a href="https://www.patreon.com/hekovic">Hekovic</a></td>
|
<td><a href="https://www.patreon.com/hekovic">Hekovic </a></td>
|
||||||
<td><a href="https://www.patreon.com/user?u=24641572">uroco @99</a></td>
|
<td><a href="https://www.patreon.com/user?u=24641572">uroco @99</a></td>
|
||||||
<td><a href="https://www.patreon.com/dansup">dansup</a></td>
|
|
||||||
</tr></table>
|
</tr></table>
|
||||||
<table><tr>
|
<table><tr>
|
||||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/5731881/4b6038e6cda34c04b83a5fcce3806a93/1.png?token-time=2145916800&token-hash=hBayGfOmQH3kRMdNnDe4oCZD_9fsJWSt29xXR3KRMVk%3D" alt="Nokotaro Takeda" width="100"></td>
|
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/5731881/4b6038e6cda34c04b83a5fcce3806a93/1.png?token-time=2145916800&token-hash=hBayGfOmQH3kRMdNnDe4oCZD_9fsJWSt29xXR3KRMVk%3D" alt="Nokotaro Takeda" width="100"></td>
|
||||||
<td><img src="https://c8.patreon.com/2/200/23932002" alt="nenohi" width="100"></td>
|
<td><img src="https://c8.patreon.com/2/200/23932002" alt="nenohi " width="100"></td>
|
||||||
|
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/9481273/7fa89168e72943859c3d3c96e424ed31/4.jpeg?token-time=2145916800&token-hash=5w1QV1qXe-NdWbdFmp1H7O_-QBsSiV0haumk3XTHIEg%3D" alt="Efertone " width="100"></td>
|
||||||
|
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/12531784/93a45137841849329ba692da92ac7c60/1.jpeg?token-time=2145916800&token-hash=vGe7wXGqmA8Q7m-kDNb6fyGdwk-Dxk4F-ut8ZZu51RM%3D" alt="Takashi Shibuya" width="100"></td>
|
||||||
</tr><tr>
|
</tr><tr>
|
||||||
<td><a href="https://www.patreon.com/takenoko">Nokotaro Takeda</a></td>
|
<td><a href="https://www.patreon.com/takenoko">Nokotaro Takeda</a></td>
|
||||||
<td><a href="https://www.patreon.com/user?u=23932002">nenohi</a></td>
|
<td><a href="https://www.patreon.com/user?u=23932002">nenohi </a></td>
|
||||||
|
<td><a href="https://www.patreon.com/efertone">Efertone </a></td>
|
||||||
|
<td><a href="https://www.patreon.com/user?u=12531784">Takashi Shibuya</a></td>
|
||||||
</tr></table>
|
</tr></table>
|
||||||
|
|
||||||
**Last updated:** Wed, 05 Feb 2020 00:42:12 UTC
|
**Last updated:** Fri, 03 Apr 2020 11:52:08 UTC
|
||||||
<!-- PATREON_END -->
|
<!-- PATREON_END -->
|
||||||
|
|
||||||
[backer-url]: #backers
|
[backer-url]: #backers
|
||||||
|
Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 9.3 KiB |
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 7.2 KiB |
27
assets/icon.svg
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||||
|
<svg width="100%" height="100%" viewBox="0 0 256 256" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;">
|
||||||
|
<g transform="matrix(0.413372,0,0,0.469741,64.564,40.5821)">
|
||||||
|
<rect x="-156.189" y="-86.393" width="619.297" height="544.981" style="fill:rgb(27,30,31);"/>
|
||||||
|
</g>
|
||||||
|
<g transform="matrix(0.898356,0,0,0.898356,-130.722,-120.968)">
|
||||||
|
<g transform="matrix(0.5,0.866025,-0.866025,0.5,288,-166.277)">
|
||||||
|
<path d="M390.877,136.653C389.457,134.193 386.831,132.677 383.99,132.677C381.149,132.677 378.524,134.193 377.103,136.653C373.093,143.599 368.146,152.168 364.604,158.303C361.749,163.248 361.749,169.34 364.604,174.285C368.142,180.414 373.084,188.972 377.092,195.915C378.515,198.379 381.144,199.898 383.99,199.898C386.836,199.898 389.466,198.379 390.889,195.915C394.897,188.972 399.838,180.414 403.377,174.284C406.232,169.34 406.232,163.248 403.377,158.303C399.835,152.168 394.888,143.599 390.877,136.653Z" style="fill:white;"/>
|
||||||
|
</g>
|
||||||
|
<g transform="matrix(1,0,0,1,-96,166.277)">
|
||||||
|
<path d="M390.877,136.653C389.457,134.193 386.831,132.677 383.99,132.677C381.149,132.677 378.524,134.193 377.103,136.653C373.093,143.599 368.146,152.168 364.604,158.303C361.749,163.248 361.749,169.34 364.604,174.285C368.142,180.414 373.084,188.972 377.092,195.915C378.515,198.379 381.144,199.898 383.99,199.898C386.836,199.898 389.466,198.379 390.889,195.915C394.897,188.972 399.838,180.414 403.377,174.284C406.232,169.34 406.232,163.248 403.377,158.303C399.835,152.168 394.888,143.599 390.877,136.653Z" style="fill:white;"/>
|
||||||
|
</g>
|
||||||
|
<g transform="matrix(0.5,-0.866025,0.866025,0.5,-96,498.831)">
|
||||||
|
<path d="M390.877,136.653C389.457,134.193 386.831,132.677 383.99,132.677C381.149,132.677 378.524,134.193 377.103,136.653C373.093,143.599 368.146,152.168 364.604,158.303C361.749,163.248 361.749,169.34 364.604,174.285C368.142,180.414 373.084,188.972 377.092,195.915C378.515,198.379 381.144,199.898 383.99,199.898C386.836,199.898 389.466,198.379 390.889,195.915C394.897,188.972 399.838,180.414 403.377,174.284C406.232,169.34 406.232,163.248 403.377,158.303C399.835,152.168 394.888,143.599 390.877,136.653Z" style="fill:white;"/>
|
||||||
|
</g>
|
||||||
|
<g transform="matrix(1,0,0,1,-95.9902,55.4086)">
|
||||||
|
<path d="M390.877,136.653C389.457,134.193 386.831,132.677 383.99,132.677C381.149,132.677 378.524,134.193 377.103,136.653C373.093,143.599 368.146,152.168 364.604,158.303C361.749,163.248 361.749,169.34 364.604,174.285C368.142,180.414 373.084,188.972 377.092,195.915C378.515,198.379 381.144,199.898 383.99,199.898C386.836,199.898 389.466,198.379 390.889,195.915C394.897,188.972 399.838,180.414 403.377,174.284C406.232,169.34 406.232,163.248 403.377,158.303C399.835,152.168 394.888,143.599 390.877,136.653ZM385.681,139.653C385.332,139.049 384.688,138.677 383.99,138.677C383.293,138.677 382.648,139.049 382.299,139.653C378.289,146.599 373.342,155.168 369.8,161.303C368.017,164.391 368.017,168.196 369.8,171.285C373.339,177.414 378.28,185.972 382.288,192.915C382.639,193.523 383.288,193.898 383.99,193.898C384.692,193.898 385.341,193.523 385.692,192.915C389.701,185.972 394.642,177.414 398.181,171.284C399.964,168.196 399.964,164.391 398.181,161.303L385.681,139.653Z" style="fill:rgb(150,208,74);"/>
|
||||||
|
</g>
|
||||||
|
<g transform="matrix(0.5,-0.866025,0.866025,0.5,-2.64322e-11,554.256)">
|
||||||
|
<path d="M390.877,136.653C389.457,134.193 386.831,132.677 383.99,132.677C381.149,132.677 378.524,134.193 377.103,136.653C373.093,143.599 368.146,152.168 364.604,158.303C361.749,163.248 361.749,169.34 364.604,174.285C368.142,180.414 373.084,188.972 377.092,195.915C378.515,198.379 381.144,199.898 383.99,199.898C386.836,199.898 389.466,198.379 390.889,195.915C394.897,188.972 399.838,180.414 403.377,174.284C406.232,169.34 406.232,163.248 403.377,158.303C399.835,152.168 394.888,143.599 390.877,136.653ZM385.681,139.653C385.332,139.049 384.688,138.677 383.99,138.677C383.293,138.677 382.648,139.049 382.299,139.653C378.289,146.599 373.342,155.168 369.8,161.303C368.017,164.391 368.017,168.196 369.8,171.285C373.339,177.414 378.28,185.972 382.288,192.915C382.639,193.523 383.288,193.898 383.99,193.898C384.692,193.898 385.341,193.523 385.692,192.915C389.701,185.972 394.642,177.414 398.181,171.284C399.964,168.196 399.964,164.391 398.181,161.303L385.681,139.653Z" style="fill:rgb(150,208,74);"/>
|
||||||
|
</g>
|
||||||
|
<g transform="matrix(0.5,0.866025,-0.866025,0.5,192,-110.851)">
|
||||||
|
<path d="M390.877,136.653C389.457,134.193 386.831,132.677 383.99,132.677C381.149,132.677 378.524,134.193 377.103,136.653C373.093,143.599 368.146,152.168 364.604,158.303C361.749,163.248 361.749,169.34 364.604,174.285C368.142,180.414 373.084,188.972 377.092,195.915C378.515,198.379 381.144,199.898 383.99,199.898C386.836,199.898 389.466,198.379 390.889,195.915C394.897,188.972 399.838,180.414 403.377,174.284C406.232,169.34 406.232,163.248 403.377,158.303C399.835,152.168 394.888,143.599 390.877,136.653ZM385.681,139.653C385.332,139.049 384.688,138.677 383.99,138.677C383.293,138.677 382.648,139.049 382.299,139.653C378.289,146.599 373.342,155.168 369.8,161.303C368.017,164.391 368.017,168.196 369.8,171.285C373.339,177.414 378.28,185.972 382.288,192.915C382.639,193.523 383.288,193.898 383.99,193.898C384.692,193.898 385.341,193.523 385.692,192.915C389.701,185.972 394.642,177.414 398.181,171.284C399.964,168.196 399.964,164.391 398.181,161.303L385.681,139.653Z" style="fill:rgb(150,208,74);"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 5.7 KiB |
Before Width: | Height: | Size: 9.8 KiB After Width: | Height: | Size: 7.2 KiB |
Before Width: | Height: | Size: 47 KiB After Width: | Height: | Size: 18 KiB |
@ -26,14 +26,828 @@ uploading: "Upload läuft"
|
|||||||
save: "Speichern"
|
save: "Speichern"
|
||||||
users: "Benutzer"
|
users: "Benutzer"
|
||||||
addUser: "Benutzer hinzufügen"
|
addUser: "Benutzer hinzufügen"
|
||||||
|
favorite: "Favoriten"
|
||||||
|
favorites: "Favoriten"
|
||||||
|
unfavorite: "Aus Favoriten entfernen"
|
||||||
|
pin: "Anheften"
|
||||||
|
unpin: "Lösen"
|
||||||
|
copyContent: "Inhalt kopieren"
|
||||||
|
copyLink: "Link kopieren"
|
||||||
|
delete: "Löschen"
|
||||||
|
deleteAndEdit: "Löschen und Bearbeiten"
|
||||||
|
deleteAndEditConfirm: "Möchtest du diese Notiz wirklich löschen und bearbeiten? Alle Reaktionen, Renotes und Antworten dieser Notiz werden verloren gehen."
|
||||||
|
addToList: "Zur Liste hinzufügen"
|
||||||
|
sendMessage: "Nachricht senden"
|
||||||
copyUsername: "Benutzernamen kopieren"
|
copyUsername: "Benutzernamen kopieren"
|
||||||
|
reply: "Antworten"
|
||||||
|
loadMore: "Zeige mehr"
|
||||||
|
youGotNewFollower: "Sie haben einen neuen Follower"
|
||||||
|
receiveFollowRequest: "Follow-Anfrage erhalten."
|
||||||
|
followRequestAccepted: "Follow-Anfrage akzeptiert"
|
||||||
|
mentions: "Erwähnungen"
|
||||||
|
directNotes: "Direktnachrichten"
|
||||||
|
importAndExport: "Importieren und Exportieren"
|
||||||
|
import: "Importieren"
|
||||||
|
export: "Exportieren"
|
||||||
|
files: "Dateien"
|
||||||
|
download: "Download"
|
||||||
|
driveFileDeleteConfirm: "Möchtest du die Datei \"{name}\" löschen? Die zugehörige Notiz wird ebenso verschwinden."
|
||||||
|
unfollowConfirm: "Möchtest du {name} nicht mehr folgen?"
|
||||||
|
exportRequested: "Du hast einen Export angefragt. Dies kann etwas Zeit in Anspruch nehmen. Sobald der Export abgeschlossen ist, wird er deiner Drive hinzugefügt."
|
||||||
|
importRequested: "Du hast einen Import angefragt. Dies kann etwas Zeit in Anspruch nehmen."
|
||||||
|
lists: "Listen"
|
||||||
|
noLists: "Keine Liste!"
|
||||||
|
note: "Notiz"
|
||||||
|
notes: "Notizen"
|
||||||
|
following: "Folgen"
|
||||||
|
followers: "Folgende"
|
||||||
|
followsYou: "Folgt dir"
|
||||||
|
createList: "Liste erstellen"
|
||||||
|
manageLists: "Liste verwalten"
|
||||||
|
error: "Ein Problem ist aufgetreten"
|
||||||
|
retry: "Wiederholen"
|
||||||
|
enterListName: "Listennamen eingeben"
|
||||||
|
privacy: "Privatsphäre"
|
||||||
|
makeFollowManuallyApprove: "Folgeanfragen benötigen Bestätigung"
|
||||||
|
defaultNoteVisibility: "Die Standardsichtbarkeit"
|
||||||
|
follow: "Folgen"
|
||||||
|
followRequest: "Follower-Anfragen"
|
||||||
|
followRequests: "Follower-Anfragen"
|
||||||
|
unfollow: "Nicht mehr folgen"
|
||||||
|
followRequestPending: "Ausstehend"
|
||||||
|
enterEmoji: "Gib ein Emoji ein"
|
||||||
|
renote: "Renote"
|
||||||
|
unrenote: "Renote zurücknehmen"
|
||||||
|
quote: "Zitieren"
|
||||||
|
pinnedNote: "Angepinnte Notiz"
|
||||||
|
you: "Du"
|
||||||
|
clickToShow: "Klicke zum den Inhalt anzusehen"
|
||||||
|
sensitive: "Dieser Inhalt ist NSFW"
|
||||||
|
add: "Hinzufügen"
|
||||||
|
reaction: "Reaktionen"
|
||||||
|
reactionSettingDescription: "Weisen Sie Ihre lieblings reaktionen zu, die Sie in den Reaktionenswähler stecken möchten."
|
||||||
|
rememberNoteVisibility: "Notizsichtbarkeit merken"
|
||||||
|
attachCancel: "Anhängen abbrechen"
|
||||||
|
markAsSensitive: "Als sensitiv markieren"
|
||||||
|
unmarkAsSensitive: "Markierung als sensitiv zurücknehmen"
|
||||||
|
enterFileName: "Dateinamen eingeben"
|
||||||
|
mute: "Stummschalten"
|
||||||
|
unmute: "Stummschaltung aufheben"
|
||||||
|
block: "Blockieren"
|
||||||
|
unblock: "Blockierung aufheben"
|
||||||
|
suspend: "Sperren"
|
||||||
|
unsuspend: "Sperrung aufheben"
|
||||||
|
blockConfirm: "Möchtest du diesen Account wirklich blockieren?"
|
||||||
|
unblockConfirm: "Möchtest du diese Blockierung wirklich aufheben?"
|
||||||
|
suspendConfirm: "Möchtest du diesen Account wirklich sperren?"
|
||||||
|
unsuspendConfirm: "Möchtest du die Sperrung dieses Accounts wirklich aufheben?"
|
||||||
|
selectList: "Wähle eine Liste aus"
|
||||||
|
customEmojis: "Benutzerdefinierte Emojis"
|
||||||
|
emojiName: "Emojiname"
|
||||||
|
emojiUrl: "Emoji-URL"
|
||||||
|
addEmoji: "Emoji hinzufügen"
|
||||||
|
flagAsBot: "Als Bot markieren"
|
||||||
|
flagAsCat: "Als Katze markieren"
|
||||||
|
autoAcceptFollowed: "Folgeanfragen automatisch akzeptieren"
|
||||||
|
addAcount: "Benutzerkonto hinzufügen"
|
||||||
|
loginFailed: "Login fehlgeschlagen"
|
||||||
|
general: "Allgemein"
|
||||||
|
wallpaper: "Hintergrund"
|
||||||
|
setWallpaper: "Hintergrund festlegen"
|
||||||
|
removeWallpaper: "Hintergrund entfernen"
|
||||||
|
searchWith: "Suche: {q}"
|
||||||
|
youHaveNoLists: "Du hast keine Listen"
|
||||||
|
followConfirm: "Möchtest du {name} wirklich folgen?"
|
||||||
|
proxyAccount: "Proxy-Benutzerkonto"
|
||||||
|
host: "Host"
|
||||||
selectUser: "Benutzer wählen"
|
selectUser: "Benutzer wählen"
|
||||||
|
recipient: "Empfänger"
|
||||||
|
annotation: "Anmerkung"
|
||||||
|
federation: "Föderation"
|
||||||
instances: "Instanz"
|
instances: "Instanz"
|
||||||
|
registeredAt: "Registriert am"
|
||||||
|
latestRequestSentAt: "Letzte Anfrage gesendet am"
|
||||||
|
latestRequestReceivedAt: "Letzte Anfrage erhalten am"
|
||||||
|
latestStatus: "Neuester Status"
|
||||||
|
storageUsage: "Speicherplatzverbrauch"
|
||||||
|
charts: "Charts"
|
||||||
|
perHour: "Pro Stunde"
|
||||||
|
perDay: "Pro Tag"
|
||||||
|
stopActivityDelivery: "Senden von Aktivitäten einstellen"
|
||||||
|
blockThisInstance: "Diese Instanz blockieren"
|
||||||
|
software: "Software"
|
||||||
|
version: "Version"
|
||||||
|
metadata: "Metadaten"
|
||||||
|
withNFiles: "{n} Datei(en)"
|
||||||
|
monitor: "Beobachten"
|
||||||
|
jobQueue: "Job-Warteschlange"
|
||||||
|
cpuAndMemory: "CPU und Arbeitsspeicher"
|
||||||
|
network: "Netzwerk"
|
||||||
|
disk: "Festplatte"
|
||||||
|
instanceInfo: "Instanzinformationen"
|
||||||
|
statistics: "Statistiken"
|
||||||
|
clearQueue: "Warteschlange leeren"
|
||||||
|
clearQueueConfirmTitle: "Möchtest du die Warteschlange wirklich leeren?"
|
||||||
|
clearQueueConfirmText: "Jegliche Notizen, die sich noch in der Warteschlange befinden, werden hierdurch nicht föderiert. Diese Aktion wird normalerweise NICHT benötigt."
|
||||||
|
clearCachedFiles: "Cache leeren"
|
||||||
|
blockedInstances: "Blockierte Instanzen"
|
||||||
|
blockedInstancesDescription: "Gib den Hostnamen der Instanz an, die blockiert werden soll. Blockierte Instanzen können nicht mehr mit dieser kommunizieren."
|
||||||
|
muteAndBlock: "Stummgeschaltet / Blockiert"
|
||||||
mutedUsers: "Stummgestellte Benutzer"
|
mutedUsers: "Stummgestellte Benutzer"
|
||||||
blockedUsers: "Blockierte Benutzer"
|
blockedUsers: "Blockierte Benutzer"
|
||||||
noUsers: "Keine Benutzer"
|
noUsers: "Keine Benutzer"
|
||||||
|
editProfile: "Profil bearbeiten"
|
||||||
|
noteDeleteConfirm: "Möchtest du diese Notiz wirklich löschen?"
|
||||||
|
pinLimitExceeded: "Du kannst nicht noch mehr Notizen anpinnen."
|
||||||
|
intro: "Misskey Installation abgeschlossen! Lass uns nun ein Administratorkonto erstellen."
|
||||||
|
done: "Fertig"
|
||||||
|
processing: "In Bearbeitung"
|
||||||
|
preview: "Vorschau"
|
||||||
|
default: "Standard"
|
||||||
|
noCustomEmojis: "Es existieren keine Emojis"
|
||||||
|
noJobs: "Es gibt keine Jobs"
|
||||||
|
federating: "Föderiert"
|
||||||
|
blocked: "Blockiert"
|
||||||
|
suspended: "Gesperrt"
|
||||||
|
all: "Alles"
|
||||||
|
notResponding: "Antwortet nicht"
|
||||||
|
changePassword: "Passwort ändern"
|
||||||
|
security: "Sicherheit"
|
||||||
|
retypedNotMatch: "Eingaben stimmen nicht überein."
|
||||||
|
currentPassword: "Momentanes Passwort"
|
||||||
|
newPassword: "Neues Passwort"
|
||||||
|
newPasswordRetype: "Neues Passwort (wiederholen)"
|
||||||
|
attachFile: "Datei anhängen"
|
||||||
|
more: "Mehr!"
|
||||||
|
featured: "Hervorgehoben"
|
||||||
|
usernameOrUserId: "Benutzername oder Benutzer-ID"
|
||||||
|
noSuchUser: "Benutzer nicht gefunden"
|
||||||
|
announcements: "Ankündigungen"
|
||||||
|
imageUrl: "Bild-URL"
|
||||||
|
remove: "Löschen"
|
||||||
|
removed: "Erfolgreich gelöscht"
|
||||||
|
removeAreYouSure: "Möchtest du \"{x}\" wirklich löschen?"
|
||||||
|
saved: "Gespeichert"
|
||||||
|
messaging: "Nachrichten"
|
||||||
|
upload: "Hochladen"
|
||||||
|
fromDrive: "Aus Drive"
|
||||||
|
fromUrl: "Von einer URL"
|
||||||
|
uploadFromUrl: "Von einer URL hochladen"
|
||||||
|
uploadFromUrlDescription: "URL der hochzuladenden Datei"
|
||||||
|
uploadFromUrlRequested: "Upload angefordert"
|
||||||
|
uploadFromUrlMayTakeTime: "Es kann eine Weile dauern, bis der Upload abgeschlossen ist."
|
||||||
|
explore: "Erkunden"
|
||||||
|
games: "Misskey Spiele"
|
||||||
|
messageRead: "Gelesen"
|
||||||
|
noMoreHistory: "Kein weiterer Verlauf vorhanden"
|
||||||
|
nUsersRead: "Von {n} gelesen"
|
||||||
|
agreeTo: "Ich stimme {0} zu"
|
||||||
|
tos: "Nutzungsbedingungen"
|
||||||
|
start: "Anfangen"
|
||||||
|
home: "Startseite"
|
||||||
|
activity: "Aktivität"
|
||||||
|
images: "Bilder"
|
||||||
|
birthday: "Geburtstag"
|
||||||
|
yearsOld: "{age} Jahre alt"
|
||||||
|
registeredDate: "Registrationsdatum"
|
||||||
|
location: "Ort"
|
||||||
|
theme: "Farbthemen"
|
||||||
|
themeForLightMode: "Farbthema, das im Hellmodus genutzt wird"
|
||||||
|
themeForDarkMode: "Farbthema, das im Dunkelmodus genutzt wird"
|
||||||
|
light: "Hell"
|
||||||
|
dark: "Dunkel"
|
||||||
|
lightThemes: "Helle Farbthemen"
|
||||||
|
darkThemes: "Dunkle Farbthemen"
|
||||||
|
drive: "Drive"
|
||||||
|
fileName: "Dateiname"
|
||||||
|
selectFile: "Datei auswählen"
|
||||||
|
selectFiles: "Dateien auswählen"
|
||||||
|
renameFile: "Datei umbenennen"
|
||||||
|
folderName: "Ordnername"
|
||||||
|
createFolder: "Ordner erstellen"
|
||||||
|
renameFolder: "Ordner umbenennen"
|
||||||
|
deleteFolder: "Ordner löschen"
|
||||||
|
addFile: "Datei hinzufügen"
|
||||||
|
emptyDrive: "Drive ist leer"
|
||||||
|
emptyFolder: "Der Ordner ist leer"
|
||||||
|
unableToDelete: "Nicht löschbar"
|
||||||
|
inputNewFileName: "Gib einen neuen Dateinamen ein"
|
||||||
|
inputNewFolderName: "Gib einen neuen Ordnernamen ein"
|
||||||
|
circularReferenceFolder: "Der Zielordner ist ein Unterorder des Ordners, den du verschieben möchtest."
|
||||||
|
hasChildFilesOrFolders: "Dieser Ordner kann nicht gelöscht werden, da er nicht leer ist."
|
||||||
|
copyUrl: "URL kopieren"
|
||||||
|
rename: "Umbenennen"
|
||||||
|
avatar: "Profilbild"
|
||||||
|
banner: "Banner"
|
||||||
|
nsfw: "Dieser Inhalt ist NSFW"
|
||||||
|
disconnectedFromServer: "Verbindung zum Server wurde getrennt"
|
||||||
|
reload: "Aktualisieren"
|
||||||
|
doNothing: "Ignorieren"
|
||||||
|
watch: "Beobachten"
|
||||||
|
unwatch: "Nicht mehr beobachten"
|
||||||
|
accept: "Akzeptieren"
|
||||||
|
reject: "Ablehnen"
|
||||||
|
instanceName: "Name der Instanz"
|
||||||
|
instanceDescription: "Beschreibung der Instanz"
|
||||||
|
maintainerName: "Betreiber"
|
||||||
|
maintainerEmail: "Betreiberemail"
|
||||||
|
tosUrl: "URL der Nutzungsbedingungen"
|
||||||
|
thisYear: "Dieses Jahr"
|
||||||
|
thisMonth: "Dieser Monat"
|
||||||
|
today: "Heute"
|
||||||
|
dayX: "{day}"
|
||||||
|
monthX: "{month}"
|
||||||
|
yearX: "{year}"
|
||||||
|
pages: "Seiten"
|
||||||
|
integration: "Integration"
|
||||||
|
connectSerice: "Verbinden"
|
||||||
|
disconnectSerice: "Trennen"
|
||||||
|
registration: "Registrieren"
|
||||||
|
enableRegistration: "Registration neuer Benutzer erlauben"
|
||||||
|
invite: "Einladen"
|
||||||
|
driveCapacityPerLocalAccount: "Drivekapazität pro lokales Benutzerkonto"
|
||||||
|
inMb: "In Megabytes"
|
||||||
|
iconUrl: "Icon-URL"
|
||||||
|
bannerUrl: "Banner-URL"
|
||||||
|
basicInfo: "Basisdaten"
|
||||||
|
pinnedUsers: "Angepinnte Benutzer"
|
||||||
|
pinnedUsersDescription: "Gib einen Benutzernamen pro Zeile ein. Diese werden im \"Erkunden\" Tab angezeigt."
|
||||||
|
recaptcha: "reCAPTCHA"
|
||||||
|
enableRecaptcha: "reCAPTCHA aktivieren"
|
||||||
|
recaptchaSecretKey: "Secret key"
|
||||||
|
antennas: "Antennen"
|
||||||
|
manageAntennas: "Antennen verwalten"
|
||||||
|
name: "Name"
|
||||||
|
antennaSource: "Antennenquelle"
|
||||||
|
antennaKeywords: "Schlüsselwörter, die beobachtet werden sollen"
|
||||||
|
antennaExcludeKeywords: "Schlüsselwörter, die ignoriert werden sollen"
|
||||||
|
antennaKeywordsDescription: "Mit Leerzeichen für eine \"UND\"-Verknüpfung trennen, durch Zeilenumbrüche für eine \"ODER\"-Verknüpfung trennen."
|
||||||
|
notifyAntenna: "Über neue Notizen benachrichtigen"
|
||||||
|
withFileAntenna: "Nur Notizen mit Dateien"
|
||||||
|
serviceworker: "ServiceWorker"
|
||||||
|
enableServiceworker: "ServiceWorker aktivieren"
|
||||||
|
antennaUsersDescription: "Benutzernamen getrennt durch Zeilenumbrüche angeben"
|
||||||
|
caseSensitive: "Groß-/Kleinschreibung unterscheiden"
|
||||||
|
withReplies: "Antworten beinhalten"
|
||||||
|
connectedTo: "Mit folgenden Benutzerkonten verknüpft"
|
||||||
|
notesAndReplies: "Notizen und Antworten"
|
||||||
|
withFiles: "Dateien beinhalten"
|
||||||
|
popularUsers: "Beliebte Benutzer"
|
||||||
|
recentlyUpdatedUsers: "Vor kurzem aktive Benutzer"
|
||||||
|
recentlyRegisteredUsers: "Vor kurzem registrierte Benutzer"
|
||||||
|
recentlyDiscoveredUsers: "Vor kurzem gefundene Benutzer"
|
||||||
|
exploreUsersCount: "Es gibt {count} Benutzer"
|
||||||
|
exploreFediverse: "Das Fediverse erkunden"
|
||||||
|
popularTags: "Beliebte Schlagwörter"
|
||||||
|
userList: "Listen"
|
||||||
|
about: "Über"
|
||||||
|
aboutMisskey: "Über Misskey"
|
||||||
|
misskeySource: "Der Quelltext ist hier verfügbar:"
|
||||||
|
misskeyTranslation: "Hilf dabei, Misskey zu übersetzen:"
|
||||||
|
misskeyDonate: "Spende an Misskey, um die Weiterentwicklung zu unterstützen:"
|
||||||
|
morePatrons: "Wir schätzen ebenso die Unterstützung vieler anderer hier nicht gelisteter Personen sehr. Danke! 🥰"
|
||||||
|
patrons: "UnterstützerInnen"
|
||||||
|
administrator: "Administrator"
|
||||||
|
twoStepAuthentication: "Zwei-Faktor-Authentifizierung"
|
||||||
|
moderator: "Moderator"
|
||||||
|
nUsersMentioned: "{n} Benutzer erwähnt"
|
||||||
|
securityKey: "Sicherheitsschlüssel"
|
||||||
|
securityKeyName: "Schlüsselname"
|
||||||
|
registerSecurityKey: "Sicherheitsschlüssel registrieren"
|
||||||
|
lastUsed: "Zuletzt benutzt"
|
||||||
|
passwordLessLogin: "Passwortloses Anmelden einrichten"
|
||||||
|
resetPassword: "Passwort zurücksetzen"
|
||||||
|
newPasswordIs: "Das neue Passwort ist \"{password}\""
|
||||||
|
posted: "Gesendet"
|
||||||
|
autoReloadWhenDisconnected: "Automatisch aktualisieren wenn die Serververbindung getrennt wird"
|
||||||
|
autoNoteWatch: "Notiz automatisch beobachten"
|
||||||
|
autoNoteWatchDescription: "Werde über Notizen, auf die du reagiert oder geantwortet hast, informiert"
|
||||||
|
reduceUiAnimation: "Animationen der Benutzeroberfläche reduzieren"
|
||||||
|
share: "Teilen"
|
||||||
|
notFound: "Nicht gefunden"
|
||||||
|
notFoundDescription: "Es konnte keine Seite unter dieser URL gefunden werden."
|
||||||
|
uploadFolder: "Standardordner für Uploads"
|
||||||
|
cacheClear: "Cache leeren"
|
||||||
|
markAsReadAllNotifications: "Alle Benachrichtigungen als gelesen markieren"
|
||||||
|
markAsReadAllUnreadNotes: "Alle Notizen als gelesen markieren"
|
||||||
|
help: "Hilfe"
|
||||||
|
inputMessageHere: "Hier Nachricht eingeben"
|
||||||
|
close: "Schließen"
|
||||||
|
group: "Gruppe"
|
||||||
|
groups: "Gruppen"
|
||||||
|
createGroup: "Gruppe erstellen"
|
||||||
|
ownedGroups: "Eigene Gruppen"
|
||||||
|
joinedGroups: "Beigetretene Gruppen"
|
||||||
|
invites: "Einladen"
|
||||||
|
groupName: "Gruppenname"
|
||||||
|
members: "Mitglieder"
|
||||||
|
transfer: "Übertragen"
|
||||||
|
title: "Betreff"
|
||||||
|
text: "Text"
|
||||||
|
enable: "Aktivieren"
|
||||||
|
next: "Weiter"
|
||||||
|
retype: "Erneut eingeben"
|
||||||
|
noteOf: "Notiz von {user}"
|
||||||
|
inviteToGroup: "Zu Gruppe einladen"
|
||||||
|
maxNoteTextLength: "Maximale Länge von Notizen"
|
||||||
|
quoteAttached: "Zitiert"
|
||||||
|
quoteQuestion: "Als Zitat anfügen?"
|
||||||
|
noMessagesYet: "Noch keine Nachrichten"
|
||||||
|
newMessageExists: "Du hast eine neue Nachricht"
|
||||||
|
onlyOneFileCanBeAttached: "Es kann pro Nachricht nur eine Datei angehängt werden"
|
||||||
|
signinRequired: "Anmeldung erforderlich"
|
||||||
|
invitationCode: "Einladungscode"
|
||||||
|
checking: "Wird überprüft..."
|
||||||
|
available: "Verfügbar"
|
||||||
|
unavailable: "Unverfügbar"
|
||||||
|
usernameInvalidFormat: "Buchstaben, Zahlen und Unterstriche sind verwendbar."
|
||||||
|
tooShort: "Zu kurz"
|
||||||
|
tooLong: "Zu lang"
|
||||||
|
weakPassword: "Schwaches Passwort"
|
||||||
|
normalPassword: "Standardpasswort"
|
||||||
|
strongPassword: "Starkes Passwort"
|
||||||
|
passwordMatched: "Stimmt überein"
|
||||||
|
passwordNotMatched: "Stimmt nicht überein"
|
||||||
|
signinWith: "Mit {x} anmelden"
|
||||||
|
signinFailed: "Anmeldung fehlgeschlagen. Überprüfe Benutzername und Passswort."
|
||||||
|
tapSecurityKey: "Tippe deinen Sicherheitsschlüssel an"
|
||||||
|
or: "Oder"
|
||||||
|
uiLanguage: "Sprache der Benutzeroberfläche"
|
||||||
|
groupInvited: "Du wurdest in eine Gruppe eingeladen"
|
||||||
|
aboutX: "Über {x}"
|
||||||
|
useOsNativeEmojis: "Eingebaute Emojis des Betriebssystems benutzen"
|
||||||
|
youHaveNoGroups: "Keine Gruppen vorhanden"
|
||||||
|
joinOrCreateGroup: "Lass dich zu einer Gruppe einladen oder erstelle deine eigene."
|
||||||
|
noHistory: "Kein Verlauf"
|
||||||
|
disableAnimatedMfm: "MFM, die Animationen enthalten, deaktivieren"
|
||||||
|
doing: "In Bearbeitung"
|
||||||
|
category: "Kategorie"
|
||||||
|
tags: "Schlagwörter"
|
||||||
|
docSource: "Quelle dieses Dokuments"
|
||||||
|
createAccount: "Benutzerkonto erstellen"
|
||||||
|
existingAcount: "Bestehendes Benutzerkonto"
|
||||||
|
regenerate: "Regenerieren"
|
||||||
|
fontSize: "Schriftgröße"
|
||||||
|
noFollowRequests: "Du hast keine Follow-Anfragen"
|
||||||
|
openImageInNewTab: "Bilder in neuem Tab öffnen"
|
||||||
|
dashboard: "Dashboard"
|
||||||
|
local: "Lokal"
|
||||||
|
total: "Gesamt"
|
||||||
|
weekOverWeekChanges: "Wöchentlich"
|
||||||
|
dayOverDayChanges: "Täglich"
|
||||||
|
accessibility: "Barrierefreiheit"
|
||||||
|
clinetSettings: "Client-Einstellungen"
|
||||||
|
accountSettings: "Benutzerkontoeinstellungen"
|
||||||
|
promotion: "Hervorgehoben"
|
||||||
|
promote: "Hervorheben"
|
||||||
|
numberOfDays: "Anzahl der Tage"
|
||||||
|
hideThisNote: "Diese Notiz verstecken"
|
||||||
|
objectStorage: "Objektspeicher"
|
||||||
|
useObjectStorage: "Objektspeicher verwenden"
|
||||||
|
objectStorageBaseUrl: "Basis-URL"
|
||||||
|
objectStorageBucket: "Bucket"
|
||||||
|
objectStoragePrefix: "Prefix"
|
||||||
|
objectStorageEndpoint: "Endpoint"
|
||||||
|
objectStorageRegion: "Region"
|
||||||
|
objectStorageUseSSL: "SSL verwenden"
|
||||||
|
serverLogs: "Serverprotokolle"
|
||||||
|
deleteAll: "Alle löschen"
|
||||||
|
newNoteRecived: "Du hast eine neue Notiz empfangen"
|
||||||
|
sounds: "Töne"
|
||||||
|
listen: "Anhören"
|
||||||
|
none: "Keine"
|
||||||
|
volume: "Lautstärke"
|
||||||
|
details: "Details"
|
||||||
|
chooseEmoji: "Wähle ein Emoji"
|
||||||
|
unableToProcess: "Der Vorgang konnte nicht abgeschlossen werden."
|
||||||
|
recentUsed: "Vor kurzem verwendet"
|
||||||
|
install: "Installieren"
|
||||||
|
uninstall: "Uninstallieren"
|
||||||
|
installedApps: "Authorisierte Anwendungen"
|
||||||
|
nothing: "Hier gibt es nichts zu sehen"
|
||||||
|
installedDate: "Authorisiert"
|
||||||
|
lastUsedDate: "Zuletzt verwendet"
|
||||||
|
state: "Status"
|
||||||
|
sort: "Sortieren"
|
||||||
|
ascendingOrder: "Aufsteigende Reihenfolge"
|
||||||
|
descendingOrder: "Absteigende Reihenfolge"
|
||||||
|
_theme:
|
||||||
|
explore: "Themen erforschen"
|
||||||
|
install: "Thema installieren"
|
||||||
|
manage: "Themaverwaltung"
|
||||||
|
code: "Themencode"
|
||||||
|
installed: "{name} wurde installiert"
|
||||||
|
alreadyInstalled: "Dieses Thema ist bereits installiert"
|
||||||
|
invalid: "Themenformat ist ungültig"
|
||||||
|
_sfx:
|
||||||
|
note: "Notizen"
|
||||||
|
noteMy: "Meine Notizen"
|
||||||
|
notification: "Benachrichtigungen"
|
||||||
|
chat: "Nachrichten"
|
||||||
|
chatBg: "Nachrichten (Hintergrund)"
|
||||||
|
antenna: "Antennen"
|
||||||
|
_ago:
|
||||||
|
unknown: "Unbekannt"
|
||||||
|
future: "Zukunft"
|
||||||
|
justNow: "Gerade eben"
|
||||||
|
secondsAgo: "vor {n} Sekunde(n)"
|
||||||
|
minutesAgo: "vor {n} Minute(n)"
|
||||||
|
hoursAgo: "vor {n} Stunde(n)"
|
||||||
|
daysAgo: "vor {n} Tag(en)"
|
||||||
|
weeksAgo: "vor {n} Woche(n)"
|
||||||
|
monthsAgo: "vor {n} Monat(en)"
|
||||||
|
yearsAgo: "vor {n} Jahr(en)"
|
||||||
|
_time:
|
||||||
|
second: "Sekunde"
|
||||||
|
minute: "Minute"
|
||||||
|
hour: "Stunde"
|
||||||
|
day: "t"
|
||||||
|
_2fa:
|
||||||
|
alreadyRegistered: "Du hast bereits ein Gerät für Zwei-Faktor-Authentifizierung registriert"
|
||||||
|
registerDevice: "Neues Gerät registrieren"
|
||||||
|
registerKey: "Neuen Sicherheitsschlüssel registrieren"
|
||||||
|
_permissions:
|
||||||
|
"read:account": "Deine Benutzerkontoinformationen lesen"
|
||||||
|
"write:account": "Deine Benutzerkontoinformationen bearbeiten"
|
||||||
|
"read:blocks": "Die Liste deiner blockierten Benutzer lesen"
|
||||||
|
"write:blocks": "Die Liste deiner blockierten Benutzer bearbeiten"
|
||||||
|
"read:drive": "Deine Drive-Dateien und Ordner lesen"
|
||||||
|
"write:drive": "Deine Drive-Dateien und Ordner bearbeiten oder löschen"
|
||||||
|
"read:favorites": "Deine Favoriten-Liste lesen"
|
||||||
|
"write:favorites": "Deine Favoriten-Liste bearbeiten"
|
||||||
|
"read:following": "Deine Follower-Liste lesen"
|
||||||
|
"write:following": "Anderen Benutzern folgen oder entfolgen"
|
||||||
|
"read:messaging": "Nachrichten lesen"
|
||||||
|
"write:messaging": "Nachrichten schicken oder löschen"
|
||||||
|
"read:mutes": "Stummschaltungen sehen"
|
||||||
|
"write:mutes": "Stummschaltungen bearbeiten"
|
||||||
|
"write:notes": "Notizen schreiben oder löschen"
|
||||||
|
"read:notifications": "Benachrichtigungen lesen"
|
||||||
|
"write:notifications": "Mit Benachrichtigungen arbeiten"
|
||||||
|
"read:reactions": "Reaktionen sehen"
|
||||||
|
"write:reactions": "Reaktionen hinzufügen und bearbeiten"
|
||||||
|
"write:votes": "In Umfragen abstimmen"
|
||||||
|
"read:pages": "Deine Seiten lesen"
|
||||||
|
"write:pages": "Deine Seiten bearbeiten oder löschen"
|
||||||
|
"read:page-likes": "Seiten-Likes lesen"
|
||||||
|
"write:page-likes": "Seiten-Likes bearbeiten"
|
||||||
|
"read:user-groups": "Deine Benutzergruppen lesen"
|
||||||
|
"write:user-groups": "Benutzergruppen bearbeiten oder löschen"
|
||||||
|
_auth:
|
||||||
|
shareAccess: "Möchtest du \"{name}\" authorisieren, auf dieses Benuzerkonto zugreifen zu können?"
|
||||||
|
shareAccessAsk: "Bist du dir sicher, dass du diese Anwendung authorisieren möchtest, auf dein Benutzerkonto zugreifen zu können?"
|
||||||
|
permissionAsk: "Diese Anwendung erfordert folgende Berechtigungen:"
|
||||||
|
pleaseGoBack: "Bitte gehe zurück zur Anwendung"
|
||||||
|
callback: "Rückkehr zur Anwendung"
|
||||||
|
denied: "Zugriff verweigert"
|
||||||
|
_antennaSources:
|
||||||
|
all: "Alle Notizen"
|
||||||
|
_weekday:
|
||||||
|
sunday: "Sonntag"
|
||||||
|
monday: "Montag"
|
||||||
|
tuesday: "Dienstag"
|
||||||
|
wednesday: "Mittwoch"
|
||||||
|
thursday: "Donnerstag"
|
||||||
|
friday: "Freitag"
|
||||||
|
saturday: "Samstag"
|
||||||
_widgets:
|
_widgets:
|
||||||
|
memo: "Memo"
|
||||||
notifications: "Benachrichtigungen"
|
notifications: "Benachrichtigungen"
|
||||||
timeline: "Zeitleiste"
|
timeline: "Zeitleiste"
|
||||||
|
calendar: "Kalender"
|
||||||
|
trends: "Trends"
|
||||||
|
clock: "Uhr"
|
||||||
|
rss: "RSS-Reader"
|
||||||
|
activity: "Aktivität"
|
||||||
|
photos: "Fotos"
|
||||||
|
_cw:
|
||||||
|
hide: "Ausblenden"
|
||||||
|
show: "Zeige mehr"
|
||||||
|
chars: "{count} Zeichen"
|
||||||
|
files: "{count} Dateien"
|
||||||
|
poll: "Umfrage"
|
||||||
|
_poll:
|
||||||
|
noOnlyOneChoice: "Mindestens zwei Antwortmöglichkeiten werden benötigt."
|
||||||
|
choiceN: "Auswahl {n}"
|
||||||
|
noMore: "Du kannst keine weiteren Auswahlen hinzufügen"
|
||||||
|
canMultipleVote: "Mehrfachantworten erlauben"
|
||||||
|
expiration: "Abstimmung endet am"
|
||||||
|
infinite: "Nie"
|
||||||
|
at: "Beenden am..."
|
||||||
|
after: "Beenden nach..."
|
||||||
|
deadlineDate: "Enddatum"
|
||||||
|
deadlineTime: "Stunde"
|
||||||
|
duration: "Laufzeit"
|
||||||
|
votesCount: "{n} Stimmen"
|
||||||
|
totalVotes: "Insgesamt {n} Stimmen"
|
||||||
|
vote: "Abstimmen"
|
||||||
|
showResult: "Ergebnis anzeigen"
|
||||||
|
voted: "Abgestimmt"
|
||||||
|
closed: "Beendet"
|
||||||
|
remainingDays: "{d} Tage {h} Stunden verbleibend"
|
||||||
|
remainingHours: "{h} Stunden {m} Minuten verbleibend"
|
||||||
|
remainingMinutes: "{m} Minuten {s} Sekunden verbleibend"
|
||||||
|
remainingSeconds: "{s} Sekunden verbleibend"
|
||||||
|
_visibility:
|
||||||
|
public: "Öffentlich"
|
||||||
|
publicDescription: "Deine Notiz wird global sichtbar sein"
|
||||||
|
home: "Startseite"
|
||||||
|
followers: "Folgende"
|
||||||
|
followersDescription: "Nur für Follower sichtbar"
|
||||||
|
specified: "Direkt"
|
||||||
|
specifiedDescription: "Nur für erwähnte Benutzer sichtbar"
|
||||||
|
localOnly: "Nur Lokal"
|
||||||
|
_postForm:
|
||||||
|
replyPlaceholder: "Dieser Notiz antworten..."
|
||||||
|
quotePlaceholder: "Diese Notiz zitieren..."
|
||||||
|
_placeholders:
|
||||||
|
a: "Was machst du momentan?"
|
||||||
|
b: "Was ist um dich herum los?"
|
||||||
|
c: "Was geht dir durch den Kopf?"
|
||||||
|
d: "Was möchtest du sagen?"
|
||||||
|
e: "Fang an zu schreiben..."
|
||||||
|
f: "Ich warte darauf, dass du schreibst..."
|
||||||
_profile:
|
_profile:
|
||||||
|
name: "Name"
|
||||||
username: "Benutzername"
|
username: "Benutzername"
|
||||||
|
description: "Über mich"
|
||||||
|
youCanIncludeHashtags: "Du kannst auch Hashtags in deiner Beschreibung verwenden."
|
||||||
|
metadata: "Andere Informationen"
|
||||||
|
metadataLabel: "Name"
|
||||||
|
metadataContent: "Inhalt"
|
||||||
|
_exportOrImport:
|
||||||
|
allNotes: "Alle Notizen"
|
||||||
|
followingList: "Folgen"
|
||||||
|
muteList: "Stummschalten"
|
||||||
|
blockingList: "Blockieren"
|
||||||
|
userLists: "Listen"
|
||||||
|
_charts:
|
||||||
|
federationInstancesIncDec: "Unterschied in der Anzahl von förderierenden Instanzen"
|
||||||
|
federationInstancesTotal: "Anzahl aller föderierenden Instanzen"
|
||||||
|
usersIncDec: "Unterschied in der Anzahl von Benutzern"
|
||||||
|
usersTotal: "Anzahl aller Benutzer"
|
||||||
|
activeUsers: "Aktive Benutzer"
|
||||||
|
notesIncDec: "Unterschied in der Anzahl von Notizen"
|
||||||
|
localNotesIncDec: "Unterschied in der Anzahl von lokalen Notizen"
|
||||||
|
notesTotal: "Anzahl aller Notizen"
|
||||||
|
filesIncDec: "Unterschied in der Anzahl von Dateien"
|
||||||
|
filesTotal: "Anzahl aller Dateien"
|
||||||
|
storageUsageIncDec: "Unterschied in der Höhe der Speichernutzung"
|
||||||
|
storageUsageTotal: "Gesamte Speichernutzung"
|
||||||
|
_instanceCharts:
|
||||||
|
requests: "Anfragen"
|
||||||
|
users: "Unterschied in der Anzahl von Benutzern"
|
||||||
|
notes: "Unterschied in der Anzahl von Notizen"
|
||||||
|
ff: "Unterschied in der Anzahl von Followern"
|
||||||
|
cacheSize: "Unterschied in der Größe des Caches"
|
||||||
|
files: "Unterschied in der Anzahl der Dateien"
|
||||||
|
_timelines:
|
||||||
|
home: "Startseite"
|
||||||
|
local: "Lokal"
|
||||||
|
social: "Sozial"
|
||||||
|
global: "Global"
|
||||||
|
_pages:
|
||||||
|
viewPage: "Deine Seiten lesen"
|
||||||
|
content: "Inhalt"
|
||||||
|
title: "Titel"
|
||||||
|
url: "Seiten-URL"
|
||||||
|
summary: "Zusammenfassung"
|
||||||
|
alignCenter: "Mittig ausrichten"
|
||||||
|
hideTitleWhenPinned: "Seitentitel ausblenden, wenn an dein Profil angepinnt "
|
||||||
|
font: "Schriftart"
|
||||||
|
fontSerif: "Serif"
|
||||||
|
fontSansSerif: "Sans Serif"
|
||||||
|
eyeCatchingImageSet: "Vorschaubild festlegen"
|
||||||
|
eyeCatchingImageRemove: "Vorschaubild entfernen"
|
||||||
|
chooseBlock: "Block hinzufügen"
|
||||||
|
selectType: "Wähle einen Typ"
|
||||||
|
enterVariableName: "Gib einen Namen für deine Variable ein"
|
||||||
|
variableNameIsAlreadyUsed: "Dieser Name wird bereits von einer anderen Variable verwendet"
|
||||||
|
contentBlocks: "Inhalt"
|
||||||
|
inputBlocks: "Eingabe"
|
||||||
|
specialBlocks: "Spezial"
|
||||||
|
blocks:
|
||||||
|
text: "Text"
|
||||||
|
textarea: "Textfeld"
|
||||||
|
section: "Abschnitt"
|
||||||
|
image: "Bilder"
|
||||||
|
button: "Knopf"
|
||||||
|
if: "Falls"
|
||||||
|
_if:
|
||||||
|
variable: "Variable"
|
||||||
|
post: "Neue Notiz anfertigen"
|
||||||
|
_post:
|
||||||
|
text: "Inhalt"
|
||||||
|
textInput: "Texteingabe"
|
||||||
|
_textInput:
|
||||||
|
name: "Variablenname"
|
||||||
|
text: "Titel"
|
||||||
|
default: "Standardwert"
|
||||||
|
textareaInput: "Eingabe des mehrzeiligen Textfelds"
|
||||||
|
_textareaInput:
|
||||||
|
name: "Variablenname"
|
||||||
|
text: "Titel"
|
||||||
|
default: "Standardwert"
|
||||||
|
numberInput: "Nummereingabe"
|
||||||
|
_numberInput:
|
||||||
|
name: "Variablenname"
|
||||||
|
text: "Titel"
|
||||||
|
default: "Standardwert"
|
||||||
|
switch: "Fallunterscheidung"
|
||||||
|
_switch:
|
||||||
|
name: "Variablenname"
|
||||||
|
text: "Titel"
|
||||||
|
default: "Standardwert"
|
||||||
|
counter: "Zähler"
|
||||||
|
_counter:
|
||||||
|
name: "Variablenname"
|
||||||
|
text: "Titel"
|
||||||
|
inc: "Erhöhen um"
|
||||||
|
_button:
|
||||||
|
text: "Titel"
|
||||||
|
colored: "Farbig"
|
||||||
|
action: "Aktion, die beim Knopfdruck ausgeführt werden soll"
|
||||||
|
_action:
|
||||||
|
dialog: "Zeige ein Dialogfenster"
|
||||||
|
_dialog:
|
||||||
|
content: "Inhalt"
|
||||||
|
resetRandom: "Setze den Zufallswert zurück"
|
||||||
|
pushEvent: "Sende ein Event"
|
||||||
|
_pushEvent:
|
||||||
|
event: "Eventname"
|
||||||
|
message: "Nachricht, die bei Aktivierung gezeigt werden soll"
|
||||||
|
variable: "Variable, die gesendet werden soll"
|
||||||
|
no-variable: "Keine"
|
||||||
|
radioButton: "Optionsfeld"
|
||||||
|
_radioButton:
|
||||||
|
name: "Variablenname"
|
||||||
|
title: "Titel"
|
||||||
|
values: "Auswahlmöglichkeiten (getrennt durch Zeilenumbrüche)"
|
||||||
|
default: "Standardwert"
|
||||||
|
script:
|
||||||
|
categories:
|
||||||
|
logical: "Logische Operationen"
|
||||||
|
operation: "Berechnungen"
|
||||||
|
comparison: "Vergleiche"
|
||||||
|
random: "Zufällig"
|
||||||
|
value: "Werte"
|
||||||
|
fn: "Funktionen"
|
||||||
|
text: "Textoperationen"
|
||||||
|
convert: "Konvertierung"
|
||||||
|
list: "Listen"
|
||||||
|
blocks:
|
||||||
|
text: "Text"
|
||||||
|
multiLineText: "Text (Mehrzeilig)"
|
||||||
|
textList: "Textliste"
|
||||||
|
_textList:
|
||||||
|
info: "Trenne jeden Eintrag mit einem Zeilenumbruch"
|
||||||
|
strLen: "Textlänge"
|
||||||
|
_strLen:
|
||||||
|
arg1: "Text"
|
||||||
|
strPick: "Zeichen extrahieren"
|
||||||
|
_strPick:
|
||||||
|
arg1: "Text"
|
||||||
|
arg2: "Zeichenposition"
|
||||||
|
strReplace: "Textersetzung"
|
||||||
|
_strReplace:
|
||||||
|
arg1: "Text"
|
||||||
|
arg2: "Zu ersetzender Text"
|
||||||
|
arg3: "Ersetzen mit"
|
||||||
|
strReverse: "Text umkehren"
|
||||||
|
_strReverse:
|
||||||
|
arg1: "Text"
|
||||||
|
join: "Text zusammenfügen"
|
||||||
|
_join:
|
||||||
|
arg1: "Listen"
|
||||||
|
arg2: "Trennzeichen"
|
||||||
|
add: "Addieren"
|
||||||
|
_add:
|
||||||
|
arg1: "A"
|
||||||
|
arg2: "B"
|
||||||
|
subtract: "Subtrahieren"
|
||||||
|
_subtract:
|
||||||
|
arg1: "A"
|
||||||
|
arg2: "B"
|
||||||
|
multiply: "Multiplizieren"
|
||||||
|
_multiply:
|
||||||
|
arg1: "A"
|
||||||
|
arg2: "B"
|
||||||
|
divide: "Teilen"
|
||||||
|
_divide:
|
||||||
|
arg1: "A"
|
||||||
|
arg2: "B"
|
||||||
|
mod: "Rest"
|
||||||
|
_mod:
|
||||||
|
arg1: "A"
|
||||||
|
arg2: "B"
|
||||||
|
round: "Runden"
|
||||||
|
_round:
|
||||||
|
arg1: "Nummer"
|
||||||
|
eq: "A und B sind gleich"
|
||||||
|
_eq:
|
||||||
|
arg1: "A"
|
||||||
|
arg2: "B"
|
||||||
|
notEq: "A und B sind nicht gleich"
|
||||||
|
_notEq:
|
||||||
|
arg1: "A"
|
||||||
|
arg2: "B"
|
||||||
|
and: "A UND B"
|
||||||
|
_and:
|
||||||
|
arg1: "A"
|
||||||
|
arg2: "B"
|
||||||
|
or: "A ODER B"
|
||||||
|
_or:
|
||||||
|
arg1: "A"
|
||||||
|
arg2: "B"
|
||||||
|
lt: "< A ist kleiner als B"
|
||||||
|
_lt:
|
||||||
|
arg1: "A"
|
||||||
|
arg2: "B"
|
||||||
|
gt: "> A ist größer als B"
|
||||||
|
_gt:
|
||||||
|
arg1: "A"
|
||||||
|
arg2: "B"
|
||||||
|
ltEq: "<= A ist kleiner als oder gleich B"
|
||||||
|
_ltEq:
|
||||||
|
arg1: "A"
|
||||||
|
arg2: "B"
|
||||||
|
gtEq: ">= A ist größer als oder gleich B"
|
||||||
|
_gtEq:
|
||||||
|
arg1: "A"
|
||||||
|
arg2: "B"
|
||||||
|
if: "Kondition"
|
||||||
|
_if:
|
||||||
|
arg1: "Falls"
|
||||||
|
arg2: "Wenn wahr"
|
||||||
|
arg3: "Sonst"
|
||||||
|
not: "NICHT"
|
||||||
|
_not:
|
||||||
|
arg1: "NICHT"
|
||||||
|
random: "Zufällig"
|
||||||
|
_random:
|
||||||
|
arg1: "Warscheinlichkeit"
|
||||||
|
rannum: "Zufallsnummer"
|
||||||
|
_rannum:
|
||||||
|
arg1: "Minimum"
|
||||||
|
arg2: "Maximum"
|
||||||
|
randomPick: "Zufallswahl aus Liste"
|
||||||
|
_randomPick:
|
||||||
|
arg1: "Listen"
|
||||||
|
dailyRandom: "Zufallswahl (Läuft für einen Tag)"
|
||||||
|
_dailyRandom:
|
||||||
|
arg1: "Warscheinlichkeit"
|
||||||
|
dailyRannum: "Zufallsnummer (Läuft für einen Tag)"
|
||||||
|
_dailyRannum:
|
||||||
|
arg1: "Minimum"
|
||||||
|
arg2: "Maximum"
|
||||||
|
dailyRandomPick: "Zufallswahl aus Liste (Läuft für einen Tag)"
|
||||||
|
_dailyRandomPick:
|
||||||
|
arg1: "Listen"
|
||||||
|
seedRandom: "Zufällig (mit Startwert / Seed)"
|
||||||
|
_seedRandom:
|
||||||
|
arg1: "Startwert / Seed"
|
||||||
|
arg2: "Warscheinlichkeit"
|
||||||
|
seedRannum: "Zufallsnummer (mit Startwert / Seed)"
|
||||||
|
_seedRannum:
|
||||||
|
arg1: "Startwert / Seed"
|
||||||
|
arg2: "Minimum"
|
||||||
|
arg3: "Maximum"
|
||||||
|
seedRandomPick: "Zufallswahl aus Liste (mit Startwert / Seed)"
|
||||||
|
_seedRandomPick:
|
||||||
|
arg1: "Startwert / Seed"
|
||||||
|
arg2: "Listen"
|
||||||
|
DRPWPM: "Zufallswahl aus gewichteter Liste (Läuft für einen Tag)"
|
||||||
|
_DRPWPM:
|
||||||
|
arg1: "Textliste"
|
||||||
|
pick: "Aus einer Liste wählen"
|
||||||
|
_pick:
|
||||||
|
arg1: "Listen"
|
||||||
|
arg2: "Position"
|
||||||
|
listLen: "Listenlänge abrufen"
|
||||||
|
_listLen:
|
||||||
|
arg1: "Listen"
|
||||||
|
number: "Nummer"
|
||||||
|
stringToNumber: "Text zu Nummer"
|
||||||
|
_stringToNumber:
|
||||||
|
arg1: "Text"
|
||||||
|
numberToString: "Nummer zu Text"
|
||||||
|
_numberToString:
|
||||||
|
arg1: "Nummer"
|
||||||
|
splitStrByLine: "Text nach Zeilenumbrüchen aufteilen"
|
||||||
|
_splitStrByLine:
|
||||||
|
arg1: "Text"
|
||||||
|
ref: "Variablen"
|
||||||
|
fn: "Funktionen"
|
||||||
|
_fn:
|
||||||
|
arg1: "Ausgabe"
|
||||||
|
for: "Wiederholen"
|
||||||
|
_for:
|
||||||
|
arg1: "Anzahl der Wiederholungen"
|
||||||
|
arg2: "Aktion"
|
||||||
|
types:
|
||||||
|
string: "Text"
|
||||||
|
number: "Nummer"
|
||||||
|
array: "Listen"
|
||||||
|
stringArray: "Textliste"
|
||||||
|
enviromentVariables: "Umgebungsvariable"
|
||||||
|
pageVariables: "Seitenelement"
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
---
|
---
|
||||||
_lang_: "English"
|
_lang_: "English"
|
||||||
introMisskey: "Welcome! Misskey is an open source and also decentralized microblogging service.\nWrite the \"notes\" to share what is happening now, or send out your own words to everyone 📡\nWith the \"reactions\", you can add your feelings to everyone's notes faster than anyone 👍\nLet's explore the new world 🚀"
|
introMisskey: "Welcome! Misskey is an open source, and also a decentralized microblogging service.\nCreate \"notes\" to share what is happening now, or to share it with everyone around you 📡\nWith \"reactions\", you can also quickly express your feelings about everyone's notes 👍\nLet's explore a new world 🚀"
|
||||||
monthAndDay: "{month}/{day}"
|
monthAndDay: "{month}/{day}"
|
||||||
search: "Search"
|
search: "Search"
|
||||||
notifications: "Notifications"
|
notifications: "Notifications"
|
||||||
@ -18,7 +18,7 @@ instance: "Instance"
|
|||||||
settings: "Settings"
|
settings: "Settings"
|
||||||
profile: "Profile"
|
profile: "Profile"
|
||||||
timeline: "Timeline"
|
timeline: "Timeline"
|
||||||
noAccountDescription: "This user has not created their bio yet."
|
noAccountDescription: "This user has not written their bio yet."
|
||||||
login: "Sign In"
|
login: "Sign In"
|
||||||
loggingIn: "Signing In"
|
loggingIn: "Signing In"
|
||||||
logout: "Sign Out"
|
logout: "Sign Out"
|
||||||
@ -35,6 +35,8 @@ unpin: "Unpin from profile"
|
|||||||
copyContent: "Copy contents"
|
copyContent: "Copy contents"
|
||||||
copyLink: "Copy link"
|
copyLink: "Copy link"
|
||||||
delete: "Delete"
|
delete: "Delete"
|
||||||
|
deleteAndEdit: "Delete and Edit"
|
||||||
|
deleteAndEditConfirm: "Are you sure you want to delete this note and edit it? You will lose all reactions, renotes and replies to it."
|
||||||
addToList: "Add to list"
|
addToList: "Add to list"
|
||||||
sendMessage: "Send a message"
|
sendMessage: "Send a message"
|
||||||
copyUsername: "Copy username"
|
copyUsername: "Copy username"
|
||||||
@ -84,9 +86,8 @@ clickToShow: "Click to show"
|
|||||||
sensitive: "NSFW"
|
sensitive: "NSFW"
|
||||||
add: "Add"
|
add: "Add"
|
||||||
reaction: "Reaction"
|
reaction: "Reaction"
|
||||||
reactionSettingDescription: "Customize reaction picker emojis (separated by line breaks)"
|
reactionSettingDescription: "Assign your favorite reactions which want to pin in reaction picker."
|
||||||
rememberNoteVisibility: "Remember note visibility settings"
|
rememberNoteVisibility: "Remember note visibility settings"
|
||||||
renameFile: "Rename file"
|
|
||||||
attachCancel: "Remove attachment"
|
attachCancel: "Remove attachment"
|
||||||
markAsSensitive: "Mark as NSFW"
|
markAsSensitive: "Mark as NSFW"
|
||||||
unmarkAsSensitive: "Undo NSFW"
|
unmarkAsSensitive: "Undo NSFW"
|
||||||
@ -116,6 +117,7 @@ loginFailed: "Failed to sign in"
|
|||||||
showOnRemote: "View on remote instance"
|
showOnRemote: "View on remote instance"
|
||||||
general: "General"
|
general: "General"
|
||||||
wallpaper: "Wallpaper"
|
wallpaper: "Wallpaper"
|
||||||
|
setWallpaper: "Set wallpaper"
|
||||||
removeWallpaper: "Remove wallpaper"
|
removeWallpaper: "Remove wallpaper"
|
||||||
searchWith: "Search: {q}"
|
searchWith: "Search: {q}"
|
||||||
youHaveNoLists: "You don't have any lists"
|
youHaveNoLists: "You don't have any lists"
|
||||||
@ -168,6 +170,7 @@ intro: "Installation of Misskey has been finished! Please create an admin user."
|
|||||||
done: "Done"
|
done: "Done"
|
||||||
processing: "Processing"
|
processing: "Processing"
|
||||||
preview: "Preview"
|
preview: "Preview"
|
||||||
|
default: "Default"
|
||||||
noCustomEmojis: "There are no emojis"
|
noCustomEmojis: "There are no emojis"
|
||||||
customEmojisOfRemote: "Emojis from other instances"
|
customEmojisOfRemote: "Emojis from other instances"
|
||||||
noJobs: "There are no jobs"
|
noJobs: "There are no jobs"
|
||||||
@ -203,10 +206,13 @@ messaging: "Messaging"
|
|||||||
upload: "Upload"
|
upload: "Upload"
|
||||||
fromDrive: "From Drive"
|
fromDrive: "From Drive"
|
||||||
fromUrl: "From URL"
|
fromUrl: "From URL"
|
||||||
|
uploadFromUrl: "Upload from a URL"
|
||||||
|
uploadFromUrlDescription: "URL of the file you want to upload"
|
||||||
|
uploadFromUrlRequested: "Upload requested"
|
||||||
|
uploadFromUrlMayTakeTime: "It may take some time until the upload is complete."
|
||||||
explore: "Explore"
|
explore: "Explore"
|
||||||
games: "Misskey Games"
|
games: "Misskey Games"
|
||||||
messageRead: "Read"
|
messageRead: "Read"
|
||||||
recentUsedEmojis: "Recently used emojis"
|
|
||||||
noMoreHistory: "There is no further history"
|
noMoreHistory: "There is no further history"
|
||||||
startMessaging: "Start messaging"
|
startMessaging: "Start messaging"
|
||||||
nUsersRead: "read by {n}"
|
nUsersRead: "read by {n}"
|
||||||
@ -222,23 +228,38 @@ yearsOld: "{age} years old"
|
|||||||
registeredDate: "Joined on"
|
registeredDate: "Joined on"
|
||||||
location: "Location"
|
location: "Location"
|
||||||
theme: "Theme"
|
theme: "Theme"
|
||||||
|
themeForLightMode: "Theme to use in Light Mode"
|
||||||
|
themeForDarkMode: "Theme to use in Dark Mode"
|
||||||
|
light: "Light"
|
||||||
|
dark: "Dark"
|
||||||
lightThemes: "Light theme"
|
lightThemes: "Light theme"
|
||||||
darkThemes: "Dark theme"
|
darkThemes: "Dark theme"
|
||||||
|
syncDeviceDarkMode: "Sync Dark Mode with your device settings"
|
||||||
drive: "Drive"
|
drive: "Drive"
|
||||||
|
fileName: "Filename"
|
||||||
selectFile: "Select a file"
|
selectFile: "Select a file"
|
||||||
selectFiles: "Select files"
|
selectFiles: "Select files"
|
||||||
renameFolder: "Rename this folder"
|
renameFile: "Rename file"
|
||||||
|
folderName: "Folder name"
|
||||||
createFolder: "Create a folder"
|
createFolder: "Create a folder"
|
||||||
|
renameFolder: "Rename this folder"
|
||||||
deleteFolder: "Delete this folder"
|
deleteFolder: "Delete this folder"
|
||||||
addFile: "Add a file"
|
addFile: "Add a file"
|
||||||
emptyDrive: "The drive is empty"
|
emptyDrive: "The drive is empty"
|
||||||
emptyFolder: "This folder is empty"
|
emptyFolder: "This folder is empty"
|
||||||
|
unableToDelete: "Unable to delete"
|
||||||
|
inputNewFileName: "Enter a new filename"
|
||||||
|
inputNewFolderName: "Enter a new folder name"
|
||||||
|
circularReferenceFolder: "The destination folder is a subfolder of the folder you wish to move."
|
||||||
|
hasChildFilesOrFolders: "Since this folder is not empty, it can not be deleted."
|
||||||
copyUrl: "Copy URL"
|
copyUrl: "Copy URL"
|
||||||
rename: "Rename"
|
rename: "Rename"
|
||||||
avatar: "Avatar"
|
avatar: "Avatar"
|
||||||
banner: "Banner"
|
banner: "Banner"
|
||||||
nsfw: "NSFW"
|
nsfw: "NSFW"
|
||||||
disconnectedFromServer: "Connection to the server was inturrupted"
|
disconnectedFromServer: "Connection to the server was interrupted."
|
||||||
|
reload: "Refresh"
|
||||||
|
doNothing: "Ignore"
|
||||||
reloadConfirm: "Would you like to retry?"
|
reloadConfirm: "Would you like to retry?"
|
||||||
watch: "Watch"
|
watch: "Watch"
|
||||||
unwatch: "Undo Watch"
|
unwatch: "Undo Watch"
|
||||||
@ -283,7 +304,8 @@ antennas: "Antennas"
|
|||||||
manageAntennas: "Manage Antennas"
|
manageAntennas: "Manage Antennas"
|
||||||
name: "Name"
|
name: "Name"
|
||||||
antennaSource: "Antenna source"
|
antennaSource: "Antenna source"
|
||||||
antennaKeywords: "Antenna keywords"
|
antennaKeywords: "Keywords to receive"
|
||||||
|
antennaExcludeKeywords: "Keywords to exclude"
|
||||||
antennaKeywordsDescription: "Separate with spaces for AND condition. Separate with line breaks for OR."
|
antennaKeywordsDescription: "Separate with spaces for AND condition. Separate with line breaks for OR."
|
||||||
notifyAntenna: "Notify newer notes"
|
notifyAntenna: "Notify newer notes"
|
||||||
withFileAntenna: "Filter only notes with file attached"
|
withFileAntenna: "Filter only notes with file attached"
|
||||||
@ -309,7 +331,7 @@ userList: "Lists"
|
|||||||
about: "About"
|
about: "About"
|
||||||
aboutMisskey: "About Misskey"
|
aboutMisskey: "About Misskey"
|
||||||
aboutMisskeyText: "Misskey is an open-source software developed by syuilo since 2014."
|
aboutMisskeyText: "Misskey is an open-source software developed by syuilo since 2014."
|
||||||
misskeyMembers: "It is currently developed an maintained by the members listed below:"
|
misskeyMembers: "It is currently developed and maintained by the members listed below:"
|
||||||
misskeySource: "Source code is available here:"
|
misskeySource: "Source code is available here:"
|
||||||
misskeyTranslation: "Help us with your contribution to translate Misskey:"
|
misskeyTranslation: "Help us with your contribution to translate Misskey:"
|
||||||
misskeyDonate: "Help us to keep improving the software by donating here:"
|
misskeyDonate: "Help us to keep improving the software by donating here:"
|
||||||
@ -328,12 +350,12 @@ unregister: "Unregister"
|
|||||||
passwordLessLogin: "Set up password-less login"
|
passwordLessLogin: "Set up password-less login"
|
||||||
resetPassword: "Reset password"
|
resetPassword: "Reset password"
|
||||||
newPasswordIs: "The new password is \"{password}\""
|
newPasswordIs: "The new password is \"{password}\""
|
||||||
post: "Notes"
|
post: "Post"
|
||||||
posted: "Posted!"
|
posted: "Posted!"
|
||||||
autoReloadWhenDisconnected: "Auto reload when disconnected with server"
|
autoReloadWhenDisconnected: "Auto reload when disconnected from server"
|
||||||
autoNoteWatch: "Watch note automatically"
|
autoNoteWatch: "Watch note automatically"
|
||||||
autoNoteWatchDescription: "Get notified about the notes which you reactioned or replied."
|
autoNoteWatchDescription: "Get notified about the notes which you reactioned or replied."
|
||||||
reduceUiAnimation: "Reduce animations of User Interface"
|
reduceUiAnimation: "Reduce UI animation"
|
||||||
share: "Share"
|
share: "Share"
|
||||||
notFound: "Not found"
|
notFound: "Not found"
|
||||||
notFoundDescription: "There was no page corresponding to the specified URL."
|
notFoundDescription: "There was no page corresponding to the specified URL."
|
||||||
@ -383,16 +405,17 @@ strongPassword: "Strong password"
|
|||||||
passwordMatched: "Matched"
|
passwordMatched: "Matched"
|
||||||
passwordNotMatched: "Doesn't match"
|
passwordNotMatched: "Doesn't match"
|
||||||
signinWith: "Sign in with {x}"
|
signinWith: "Sign in with {x}"
|
||||||
|
signinFailed: "Unable to sign in. The username or password you entered is incorrect."
|
||||||
tapSecurityKey: "Tap your security key"
|
tapSecurityKey: "Tap your security key"
|
||||||
or: "Or"
|
or: "Or"
|
||||||
uiLanguage: "UI display language"
|
uiLanguage: "UI display language"
|
||||||
groupInvited: "Invited to group"
|
groupInvited: "Invited to group"
|
||||||
aboutX: "About {x}"
|
aboutX: "About {x}"
|
||||||
useOsNativeEmojis: "Use the OS native Emojis"
|
useOsNativeEmojis: "Use OS native Emojis"
|
||||||
noGroups: "No groups"
|
youHaveNoGroups: "You have no groups"
|
||||||
joinOrCreateGroup: "Get invited to join the groups or you can create your own group."
|
joinOrCreateGroup: "Get invited to join the groups or you can create your own group."
|
||||||
noHistory: "No history items"
|
noHistory: "No history items"
|
||||||
disableAnimatedMfm: "Disable MFM which has animations"
|
disableAnimatedMfm: "Disable MFM with animation"
|
||||||
doing: "On my way"
|
doing: "On my way"
|
||||||
category: "Category"
|
category: "Category"
|
||||||
tags: "Tags"
|
tags: "Tags"
|
||||||
@ -412,6 +435,62 @@ dayOverDayChanges: "Daily"
|
|||||||
accessibility: "Accessibility"
|
accessibility: "Accessibility"
|
||||||
clinetSettings: "Client Settings"
|
clinetSettings: "Client Settings"
|
||||||
accountSettings: "Account Settings"
|
accountSettings: "Account Settings"
|
||||||
|
promotion: "Promoted"
|
||||||
|
promote: "Promote"
|
||||||
|
numberOfDays: "Amount of days"
|
||||||
|
hideThisNote: "Hide this note"
|
||||||
|
showFeaturedNotesInTimeline: "Show Featured notes in Timeline"
|
||||||
|
objectStorage: "Object Storage"
|
||||||
|
useObjectStorage: "Use object storage"
|
||||||
|
objectStorageBaseUrl: "Base URL"
|
||||||
|
objectStorageBaseUrlDesc: "URL prefix used for construct URL to object (media) referencing. Specify its URL if you are using a CDN or Proxy, otherwise specify the address that publicly accessible according to the guide of service that you're going to use. i.g 'https://<bucket>.s3.amazonaws.com' for AWS S3, and 'https://storage.googleapis.com/<bucket>' for GCS."
|
||||||
|
objectStorageBucket: "Bucket"
|
||||||
|
objectStorageBucketDesc: "Please specify the bucket name used on configured service."
|
||||||
|
objectStoragePrefix: "Prefix"
|
||||||
|
objectStoragePrefixDesc: "Files will stored under the directory of this prefix."
|
||||||
|
objectStorageEndpoint: "Endpoint"
|
||||||
|
objectStorageEndpointDesc: "Leave this empty if you are using AWS S3, otherwise specify the endpoint as '<host>' or '<host>:<port>' according to the guide of service that you're going to use."
|
||||||
|
objectStorageRegion: "Region"
|
||||||
|
objectStorageRegionDesc: "Specify a region like 'xx-east-1'. If your service does not have distinction about regions, leave it blank or fill with 'us-east-1'."
|
||||||
|
objectStorageUseSSL: "Use SSL"
|
||||||
|
objectStorageUseSSLDesc: "Turn off this if you are not going to use HTTPS for API connection"
|
||||||
|
serverLogs: "Server logs"
|
||||||
|
deleteAll: "Delete all"
|
||||||
|
showFixedPostForm: "Display the posting form at the top of the timeline"
|
||||||
|
newNoteRecived: "You've got a new note"
|
||||||
|
sounds: "Sounds"
|
||||||
|
listen: "Listen"
|
||||||
|
none: "None"
|
||||||
|
volume: "Volume"
|
||||||
|
details: "Details"
|
||||||
|
chooseEmoji: "Choose an emoji"
|
||||||
|
unableToProcess: "The operation could not be completed."
|
||||||
|
recentUsed: "Recently used"
|
||||||
|
install: "Install"
|
||||||
|
uninstall: "Uninstall"
|
||||||
|
installedApps: "Authorized Applications"
|
||||||
|
nothing: "There's nothing to see here"
|
||||||
|
installedDate: "Authorized"
|
||||||
|
lastUsedDate: "Last used"
|
||||||
|
state: "State"
|
||||||
|
sort: "Sort"
|
||||||
|
ascendingOrder: "Ascending"
|
||||||
|
descendingOrder: "Descending"
|
||||||
|
_theme:
|
||||||
|
explore: "Explore Themes"
|
||||||
|
install: "Install theme"
|
||||||
|
manage: "Themes manager"
|
||||||
|
code: "Theme code"
|
||||||
|
installed: "{name} has been installed"
|
||||||
|
alreadyInstalled: "The theme is already installed"
|
||||||
|
invalid: "Theme format is invalid"
|
||||||
|
_sfx:
|
||||||
|
note: "New note"
|
||||||
|
noteMy: "My note"
|
||||||
|
notification: "Notifications"
|
||||||
|
chat: "Messaging"
|
||||||
|
chatBg: "Messaging (Background)"
|
||||||
|
antenna: "Antenna Reception"
|
||||||
_ago:
|
_ago:
|
||||||
unknown: "Unknown"
|
unknown: "Unknown"
|
||||||
future: "Future"
|
future: "Future"
|
||||||
@ -432,11 +511,11 @@ _tutorial:
|
|||||||
title: "How to use Misskey"
|
title: "How to use Misskey"
|
||||||
step1_1: "Welcome!"
|
step1_1: "Welcome!"
|
||||||
step1_2: "This page is called \"timeline\". It shows chronologically ordered \"notes\" of people who you \"follow\"."
|
step1_2: "This page is called \"timeline\". It shows chronologically ordered \"notes\" of people who you \"follow\"."
|
||||||
step1_3: "Your timeline is currently empty, since you have not posed any notes or followed anyone yet."
|
step1_3: "Your timeline is currently empty, since you have not posted any notes or followed anyone yet."
|
||||||
step2_1: "Let's finish setting up your profile before writing a note or following anyone."
|
step2_1: "Let's finish setting up your profile before writing a note or following anyone."
|
||||||
step2_2: "Providing some information about who you are will make it easier for others to follow you back."
|
step2_2: "Providing some information about who you are will make it easier for others to follow you back."
|
||||||
step3_1: "Finished setting up your profile?"
|
step3_1: "Finished setting up your profile?"
|
||||||
step3_2: "The next step is to post a note. You can do this by pressing a pencil icon on the screen."
|
step3_2: "The next step is to post a note. You can do this by pressing the pencil icon on the screen."
|
||||||
step3_3: "Fill in the modal and press the button on the right top to post."
|
step3_3: "Fill in the modal and press the button on the right top to post."
|
||||||
step3_4: "Have nothing to say? Try \"just setting up my msky\"!"
|
step3_4: "Have nothing to say? Try \"just setting up my msky\"!"
|
||||||
step4_1: "Finished posting your first note?"
|
step4_1: "Finished posting your first note?"
|
||||||
@ -447,7 +526,7 @@ _tutorial:
|
|||||||
step5_4: "If the other user has a lock icon next to their name, that user will have to manually approve your follow request."
|
step5_4: "If the other user has a lock icon next to their name, that user will have to manually approve your follow request."
|
||||||
step6_1: "Now you will be able to see other users' notes on your timeline."
|
step6_1: "Now you will be able to see other users' notes on your timeline."
|
||||||
step6_2: "You can also put \"reactions\" on other people's notes to quickly respond."
|
step6_2: "You can also put \"reactions\" on other people's notes to quickly respond."
|
||||||
step6_3: "To attach a \"reaction\", press \"+\" mark on other user's note and choose an emoji you'd like to react with."
|
step6_3: "To attach a \"reaction\", press the \"+\" mark on another user's note and choose an emoji you'd like to react with."
|
||||||
step7_1: "Congratulations! You have now finished Misskey's basic tutorial."
|
step7_1: "Congratulations! You have now finished Misskey's basic tutorial."
|
||||||
step7_2: "If you would like to learn more about Misskey, try the {help} section."
|
step7_2: "If you would like to learn more about Misskey, try the {help} section."
|
||||||
step7_3: "Good luck and have fun! 🚀"
|
step7_3: "Good luck and have fun! 🚀"
|
||||||
@ -489,7 +568,11 @@ _permissions:
|
|||||||
"write:user-groups": "Edit or delete user groups"
|
"write:user-groups": "Edit or delete user groups"
|
||||||
_auth:
|
_auth:
|
||||||
shareAccess: "Would you like to authorize \"{name}\" to access this account?"
|
shareAccess: "Would you like to authorize \"{name}\" to access this account?"
|
||||||
|
shareAccessAsk: "Are you sure you want to authorize this application to access your account?"
|
||||||
permissionAsk: "This application requires following permissions:"
|
permissionAsk: "This application requires following permissions:"
|
||||||
|
pleaseGoBack: "Please go back to the application"
|
||||||
|
callback: "Returning back to the application"
|
||||||
|
denied: "Access Denied"
|
||||||
_antennaSources:
|
_antennaSources:
|
||||||
all: "All notes"
|
all: "All notes"
|
||||||
homeTimeline: "Notes from following users"
|
homeTimeline: "Notes from following users"
|
||||||
@ -513,6 +596,7 @@ _widgets:
|
|||||||
clock: "Clock"
|
clock: "Clock"
|
||||||
rss: "RSS reader"
|
rss: "RSS reader"
|
||||||
activity: "Activity"
|
activity: "Activity"
|
||||||
|
photos: "Photos"
|
||||||
_cw:
|
_cw:
|
||||||
hide: "Hide"
|
hide: "Hide"
|
||||||
show: "Load more"
|
show: "Load more"
|
||||||
@ -592,15 +676,15 @@ _charts:
|
|||||||
_instanceCharts:
|
_instanceCharts:
|
||||||
requests: "Requests"
|
requests: "Requests"
|
||||||
users: "Difference in # of users"
|
users: "Difference in # of users"
|
||||||
usersTotal: "Total # of users"
|
usersTotal: "Cumulative total # of users"
|
||||||
notes: "Difference in # of notes"
|
notes: "Difference in # of notes"
|
||||||
notesTotal: "Total # of notes"
|
notesTotal: "Cumulative total # of notes"
|
||||||
ff: "Difference in # of followers"
|
ff: "Difference in # of followers"
|
||||||
ffTotal: "Total # of followers"
|
ffTotal: "Cumulative total # of followers"
|
||||||
cacheSize: "Difference in cache size"
|
cacheSize: "Difference in cache size"
|
||||||
cacheSizeTotal: "Total accumulated cache"
|
cacheSizeTotal: "Cumulative total cache size"
|
||||||
files: "Difference in # of files"
|
files: "Difference in # of files"
|
||||||
filesTotal: "Total # of files"
|
filesTotal: "Cumulative total # of files"
|
||||||
_timelines:
|
_timelines:
|
||||||
home: "Home"
|
home: "Home"
|
||||||
local: "Local"
|
local: "Local"
|
||||||
@ -610,45 +694,39 @@ _pages:
|
|||||||
newPage: "Create a page"
|
newPage: "Create a page"
|
||||||
editPage: "Edit this page"
|
editPage: "Edit this page"
|
||||||
readPage: "Source view activated"
|
readPage: "Source view activated"
|
||||||
page-created: "Successfully created a page!"
|
created: "Successfully created a page!"
|
||||||
page-updated: "Successfully updated the page!"
|
updated: "Successfully updated the page!"
|
||||||
name-already-exists: "Specified page URL already exists."
|
deleted: "The page has been deleted"
|
||||||
title-invalid-name: "The specified page URL is invalid."
|
nameAlreadyExists: "The specified page URL already exists"
|
||||||
text-invalid-name: "Please double-check if it is not empty."
|
invalidNameTitle: "The specified page URL is invalid"
|
||||||
|
invalidNameText: "Check whether that is not a blank"
|
||||||
editThisPage: "Edit this page"
|
editThisPage: "Edit this page"
|
||||||
viewSource: "View source"
|
viewSource: "View source"
|
||||||
viewPage: "View your pages"
|
viewPage: "View your pages"
|
||||||
like: "Like"
|
like: "Like"
|
||||||
unlike: "Undo like"
|
unlike: "Undo like"
|
||||||
liked-pages: "Liked pages"
|
my: "My pages"
|
||||||
my-pages: "My pages"
|
liked: "Liked pages"
|
||||||
inspector: "Inspector"
|
inspector: "Inspector"
|
||||||
content: "Page block"
|
content: "Page block"
|
||||||
variables: "Variables"
|
variables: "Variables"
|
||||||
variables-info: "You can make your page more interactive by using variables. If you write down <b>{ variable name }</b> in the text, you can embed the value of the variable. For example, source text <b>Hello { thing } world!</b> with <b> ai </b> as the value of variable 'thing' will result in the text being <b>Hello ai world!</b>."
|
|
||||||
variables-info2: "Because the evaluation of variables are performed from top to bottom, the variable cannot refer to another variables which appear on later lines. For example, when defining three variables <b>A</b>, <b>B</b> and <b>C</b>, variable <b>C</b> <i>can</i> refer to variables <b>A</b> and <b>B</b> in its expression. However, variable <b>A</b> <i>cannot</i> refer to variables <b>B</b> or <b>C</b> in its expression."
|
|
||||||
variables-info3: "To get an input from user, insert \"user input\" block with your desired variable name (that variable will be declared automatically). You could then use that variable to perform actions on your page."
|
|
||||||
variables-info4: "Functions make it easier to perform repetitive tasks. To create a function, declare a variable of \"Function\" type. A function can have a slot (argument/parameter) which can be used inside the function as a variable. Thanks to AiScript specification, you can also use function itself as a parameter for other functions. (Search \"callback functions\" on google for more details)."
|
|
||||||
more-details: "More information"
|
|
||||||
title: "Title"
|
title: "Title"
|
||||||
url: "Page URL"
|
url: "Page URL"
|
||||||
summary: "Page summary"
|
summary: "Page summary"
|
||||||
alignCenter: "Center elements"
|
alignCenter: "Center elements"
|
||||||
hide-title-when-pinned: "Hide page title when pinned"
|
hideTitleWhenPinned: "Hide page title when pinned to profile"
|
||||||
font: "Font"
|
font: "Font"
|
||||||
fontSerif: "Serif"
|
fontSerif: "Serif"
|
||||||
fontSansSerif: "Sans serif"
|
fontSansSerif: "Sans serif"
|
||||||
set-eye-catching-image: "Set thumbnail image"
|
eyeCatchingImageSet: "Set the eye-catching image"
|
||||||
remove-eye-catching-image: "Remove thumbnail image"
|
eyeCatchingImageRemove: "Delete the eye-catching image"
|
||||||
chooseBlock: "Add a block"
|
chooseBlock: "Add a block"
|
||||||
selectType: "Select a type"
|
selectType: "Select a type"
|
||||||
enterVariableName: "Please enter a name for your variable"
|
enterVariableName: "Please enter a name for your variable"
|
||||||
the-variable-name-is-already-used: "This name is already being used by other variable"
|
variableNameIsAlreadyUsed: "This name is already being used by other variable"
|
||||||
content-blocks: "Content"
|
contentBlocks: "Content"
|
||||||
input-blocks: "Input"
|
inputBlocks: "Input"
|
||||||
special-blocks: "Special"
|
specialBlocks: "Special"
|
||||||
post-from-post-form: "Post this content"
|
|
||||||
posted-from-post-form: "Successfully posted!"
|
|
||||||
blocks:
|
blocks:
|
||||||
text: "Text"
|
text: "Text"
|
||||||
textarea: "Text area"
|
textarea: "Text area"
|
||||||
|
@ -35,6 +35,8 @@ unpin: "Desfijar"
|
|||||||
copyContent: "Copiar contenido"
|
copyContent: "Copiar contenido"
|
||||||
copyLink: "Copiar enlace"
|
copyLink: "Copiar enlace"
|
||||||
delete: "Borrar"
|
delete: "Borrar"
|
||||||
|
deleteAndEdit: "Borrar y editar"
|
||||||
|
deleteAndEditConfirm: "¿Quieres borrar y editar este nota? Las reacciones, renotes, respuestas y todo desaparecerán."
|
||||||
addToList: "Agregar a lista"
|
addToList: "Agregar a lista"
|
||||||
sendMessage: "Énviar mensaje"
|
sendMessage: "Énviar mensaje"
|
||||||
copyUsername: "Copiar nombre de usuario"
|
copyUsername: "Copiar nombre de usuario"
|
||||||
@ -84,9 +86,8 @@ clickToShow: "Click para ver"
|
|||||||
sensitive: "Marcado como sensible"
|
sensitive: "Marcado como sensible"
|
||||||
add: "Añadir"
|
add: "Añadir"
|
||||||
reaction: "Reacción"
|
reaction: "Reacción"
|
||||||
reactionSettingDescription: "Elegir las reacciones mostradas en el seleccionador de reacciones, separadas por una nueva linea"
|
reactionSettingDescription: "Asigne sus reacción favoritas que desean anclar en el selector de reacciones."
|
||||||
rememberNoteVisibility: "Recordar visibilidad"
|
rememberNoteVisibility: "Recordar visibilidad"
|
||||||
renameFile: "Renombrar archivo"
|
|
||||||
attachCancel: "Quitar adjunto"
|
attachCancel: "Quitar adjunto"
|
||||||
markAsSensitive: "Marcar como sensible"
|
markAsSensitive: "Marcar como sensible"
|
||||||
unmarkAsSensitive: "Desmarcar como sensible"
|
unmarkAsSensitive: "Desmarcar como sensible"
|
||||||
@ -116,6 +117,7 @@ loginFailed: "Error al iniciar sesión."
|
|||||||
showOnRemote: "Ver en una instancia remota"
|
showOnRemote: "Ver en una instancia remota"
|
||||||
general: "General"
|
general: "General"
|
||||||
wallpaper: "Fondo de pantalla"
|
wallpaper: "Fondo de pantalla"
|
||||||
|
setWallpaper: "Establecer fondo de pantalla"
|
||||||
removeWallpaper: "Quitar fondo de pantalla"
|
removeWallpaper: "Quitar fondo de pantalla"
|
||||||
searchWith: "Buscar: {q}"
|
searchWith: "Buscar: {q}"
|
||||||
youHaveNoLists: "No tienes listas"
|
youHaveNoLists: "No tienes listas"
|
||||||
@ -168,6 +170,7 @@ intro: "¡La instalación de Misskey ha terminado! Crea el usuario administrador
|
|||||||
done: "Terminado"
|
done: "Terminado"
|
||||||
processing: "Procesando"
|
processing: "Procesando"
|
||||||
preview: "Vista previa"
|
preview: "Vista previa"
|
||||||
|
default: "Predeterminado"
|
||||||
noCustomEmojis: "No hay emojis personalizados"
|
noCustomEmojis: "No hay emojis personalizados"
|
||||||
customEmojisOfRemote: "Emojis remotos"
|
customEmojisOfRemote: "Emojis remotos"
|
||||||
noJobs: "No hay trabajos"
|
noJobs: "No hay trabajos"
|
||||||
@ -203,10 +206,13 @@ messaging: "Chat"
|
|||||||
upload: "Subir"
|
upload: "Subir"
|
||||||
fromDrive: "Desde el drive"
|
fromDrive: "Desde el drive"
|
||||||
fromUrl: "Desde la URL"
|
fromUrl: "Desde la URL"
|
||||||
|
uploadFromUrl: "Subir desde una URL"
|
||||||
|
uploadFromUrlDescription: "URL del fichero que quieres subir"
|
||||||
|
uploadFromUrlRequested: "Subida solicitada"
|
||||||
|
uploadFromUrlMayTakeTime: "Subir el fichero puede tardar un tiempo."
|
||||||
explore: "Explorar"
|
explore: "Explorar"
|
||||||
games: "Misskey Games"
|
games: "Misskey Games"
|
||||||
messageRead: "Ya leído"
|
messageRead: "Ya leído"
|
||||||
recentUsedEmojis: "Emojis usados recientemente"
|
|
||||||
noMoreHistory: "El historial se ha acabado"
|
noMoreHistory: "El historial se ha acabado"
|
||||||
startMessaging: "Iniciar chat"
|
startMessaging: "Iniciar chat"
|
||||||
nUsersRead: "Leído por {n} personas"
|
nUsersRead: "Leído por {n} personas"
|
||||||
@ -222,23 +228,38 @@ yearsOld: "{age} años"
|
|||||||
registeredDate: "Fecha de registro"
|
registeredDate: "Fecha de registro"
|
||||||
location: "Lugar"
|
location: "Lugar"
|
||||||
theme: "Tema"
|
theme: "Tema"
|
||||||
|
themeForLightMode: "Tema para usar en Modo Linterna"
|
||||||
|
themeForDarkMode: "Tema para usar en Modo Oscuro"
|
||||||
|
light: "Linterna"
|
||||||
|
dark: "Oscuro"
|
||||||
lightThemes: "Tema claro"
|
lightThemes: "Tema claro"
|
||||||
darkThemes: "Tema oscuro"
|
darkThemes: "Tema oscuro"
|
||||||
|
syncDeviceDarkMode: "Sincronice el Modo Oscuro con la configuración de su dispositivo"
|
||||||
drive: "Drive"
|
drive: "Drive"
|
||||||
|
fileName: "Nombre de archivo"
|
||||||
selectFile: "Elegir archivo"
|
selectFile: "Elegir archivo"
|
||||||
selectFiles: "Elegir archivos"
|
selectFiles: "Elegir archivos"
|
||||||
renameFolder: "Renombrar carpeta"
|
renameFile: "Renombrar archivo"
|
||||||
|
folderName: "Nombre de la carpeta"
|
||||||
createFolder: "Crear carpeta"
|
createFolder: "Crear carpeta"
|
||||||
|
renameFolder: "Renombrar carpeta"
|
||||||
deleteFolder: "Borrar carpeta"
|
deleteFolder: "Borrar carpeta"
|
||||||
addFile: "Añadir archivo"
|
addFile: "Añadir archivo"
|
||||||
emptyDrive: "El drive está vacío"
|
emptyDrive: "El drive está vacío"
|
||||||
emptyFolder: "La carpeta está vacía"
|
emptyFolder: "La carpeta está vacía"
|
||||||
|
unableToDelete: "No se puede borrar"
|
||||||
|
inputNewFileName: "Ingrese un nuevo nombre de archivo"
|
||||||
|
inputNewFolderName: "Ingrese un nuevo nombre de la carpeta"
|
||||||
|
circularReferenceFolder: "La carpeta de destino es una sub-carpeta de la carpeta que quieres mover."
|
||||||
|
hasChildFilesOrFolders: "No se puede borrar esta carpeta. No está vacía."
|
||||||
copyUrl: "Copiar URL"
|
copyUrl: "Copiar URL"
|
||||||
rename: "Renombrar"
|
rename: "Renombrar"
|
||||||
avatar: "Avatar"
|
avatar: "Avatar"
|
||||||
banner: "Banner"
|
banner: "Banner"
|
||||||
nsfw: "Marcado como sensible"
|
nsfw: "Marcado como sensible"
|
||||||
disconnectedFromServer: "Desconectado del servidor"
|
disconnectedFromServer: "Desconectado del servidor"
|
||||||
|
reload: "Recargar"
|
||||||
|
doNothing: "No hacer nada"
|
||||||
reloadConfirm: "¿Desea recargar?"
|
reloadConfirm: "¿Desea recargar?"
|
||||||
watch: "Ver"
|
watch: "Ver"
|
||||||
unwatch: "Dejar de ver"
|
unwatch: "Dejar de ver"
|
||||||
@ -283,7 +304,8 @@ antennas: "Antenas"
|
|||||||
manageAntennas: "Administrar antenas"
|
manageAntennas: "Administrar antenas"
|
||||||
name: "Nombre"
|
name: "Nombre"
|
||||||
antennaSource: "Origen de la antena"
|
antennaSource: "Origen de la antena"
|
||||||
antennaKeywords: "Palabras clave de la antena"
|
antennaKeywords: "Palabras clave para recibir"
|
||||||
|
antennaExcludeKeywords: "Palabras clave para excluir"
|
||||||
antennaKeywordsDescription: "Separar con espacios es una declaración AND, separar con una linea nueva es una declaración OR"
|
antennaKeywordsDescription: "Separar con espacios es una declaración AND, separar con una linea nueva es una declaración OR"
|
||||||
notifyAntenna: "Notificar nueva nota"
|
notifyAntenna: "Notificar nueva nota"
|
||||||
withFileAntenna: "Sólo notas con archivos adjuntados"
|
withFileAntenna: "Sólo notas con archivos adjuntados"
|
||||||
@ -383,13 +405,14 @@ strongPassword: "Muy buena contraseña"
|
|||||||
passwordMatched: "Correcto"
|
passwordMatched: "Correcto"
|
||||||
passwordNotMatched: "Las contraseñas no son las mismas"
|
passwordNotMatched: "Las contraseñas no son las mismas"
|
||||||
signinWith: "Inicie sesión con {x}"
|
signinWith: "Inicie sesión con {x}"
|
||||||
|
signinFailed: "Autenticación fallida. Asegúrate de haber usado el nombre de usuario y contraseña correctos."
|
||||||
tapSecurityKey: "Toque la clave de seguridad"
|
tapSecurityKey: "Toque la clave de seguridad"
|
||||||
or: "O"
|
or: "O"
|
||||||
uiLanguage: "Idioma de visualización de la interfaz"
|
uiLanguage: "Idioma de visualización de la interfaz"
|
||||||
groupInvited: "Invitado al grupo"
|
groupInvited: "Invitado al grupo"
|
||||||
aboutX: "Acerca de {x}"
|
aboutX: "Acerca de {x}"
|
||||||
useOsNativeEmojis: "Usa los emojis nativos de la plataforma"
|
useOsNativeEmojis: "Usa los emojis nativos de la plataforma"
|
||||||
noGroups: "Sin grupos"
|
youHaveNoGroups: "Sin grupos"
|
||||||
joinOrCreateGroup: "Obtenga una invitación para unirse al grupos o puede crear su propio grupo."
|
joinOrCreateGroup: "Obtenga una invitación para unirse al grupos o puede crear su propio grupo."
|
||||||
noHistory: "No hay datos en el historial"
|
noHistory: "No hay datos en el historial"
|
||||||
disableAnimatedMfm: "Deshabilitar MFM que tiene animaciones"
|
disableAnimatedMfm: "Deshabilitar MFM que tiene animaciones"
|
||||||
@ -412,6 +435,62 @@ dayOverDayChanges: "Dif diaria"
|
|||||||
accessibility: "Accesibilidad"
|
accessibility: "Accesibilidad"
|
||||||
clinetSettings: "Ajustes del cliente"
|
clinetSettings: "Ajustes del cliente"
|
||||||
accountSettings: "Ajustes de cuenta"
|
accountSettings: "Ajustes de cuenta"
|
||||||
|
promotion: "Promovido"
|
||||||
|
promote: "Promover"
|
||||||
|
numberOfDays: "Cantidad de dias"
|
||||||
|
hideThisNote: "Ocultar esta nota"
|
||||||
|
showFeaturedNotesInTimeline: "Mostrar notas destacadas en la línea de tiempo"
|
||||||
|
objectStorage: "Almacenamiento de objetos"
|
||||||
|
useObjectStorage: "Usar almacenamiento de objetos"
|
||||||
|
objectStorageBaseUrl: "Base URL"
|
||||||
|
objectStorageBaseUrlDesc: "Prefijo de URL utilizado para construir URL para hacer referencia a objetos (medios). Especifique su URL si está utilizando un CDN o Proxy; de lo contrario, especifique la dirección a la que se puede acceder públicamente de acuerdo con la guía de servicio que va a utilizar. i.g 'https://<bucket>.s3.amazonaws.com' para AWS S3 y 'https://storage.googleapis.com/<bucket>' para GCS."
|
||||||
|
objectStorageBucket: "Bucket"
|
||||||
|
objectStorageBucketDesc: "Especifique el nombre del depósito utilizado en el servicio configurado."
|
||||||
|
objectStoragePrefix: "Prefix"
|
||||||
|
objectStoragePrefixDesc: "Los archivos se almacenarán en el directorio de este prefijo."
|
||||||
|
objectStorageEndpoint: "Endpoint"
|
||||||
|
objectStorageEndpointDesc: "Deje esto en blanco si está utilizando AWS S3; de lo contrario, especifique el punto final como '<host>' o '<host>: <port>' de acuerdo con la guía de servicio que va a utilizar."
|
||||||
|
objectStorageRegion: "Region"
|
||||||
|
objectStorageRegionDesc: "Especifique una región como 'xx-east-1'. Si su servicio no tiene distinción sobre regiones, déjelo en blanco o complete con 'us-east-1'."
|
||||||
|
objectStorageUseSSL: "Usar SSL"
|
||||||
|
objectStorageUseSSLDesc: "Desactive esto si no va a usar HTTPS para la conexión API"
|
||||||
|
serverLogs: "Registros del servidor"
|
||||||
|
deleteAll: "Eliminar todos"
|
||||||
|
showFixedPostForm: "Mostrar el formulario de las entradas encima de la línea de tiempo"
|
||||||
|
newNoteRecived: "Tienes una nota nuevo"
|
||||||
|
sounds: "Sonidos"
|
||||||
|
listen: "Escuchar"
|
||||||
|
none: "Ninguna"
|
||||||
|
volume: "Volumen"
|
||||||
|
details: "Detalles"
|
||||||
|
chooseEmoji: "Elije un emoji"
|
||||||
|
unableToProcess: "La operación no se puede llevar a cabo"
|
||||||
|
recentUsed: "Usado recientemente"
|
||||||
|
install: "Instalación"
|
||||||
|
uninstall: "Desinstalar"
|
||||||
|
installedApps: "Aplicaciones Autorizadas"
|
||||||
|
nothing: "No hay nada que ver aqui"
|
||||||
|
installedDate: "Autorizado"
|
||||||
|
lastUsedDate: "Utilizado el"
|
||||||
|
state: "Estado"
|
||||||
|
sort: "Ordenar"
|
||||||
|
ascendingOrder: "Ascendente"
|
||||||
|
descendingOrder: "Descendente"
|
||||||
|
_theme:
|
||||||
|
explore: "Explorar temas"
|
||||||
|
install: "Instalar tema"
|
||||||
|
manage: "Gestor de temas"
|
||||||
|
code: "Código del tema"
|
||||||
|
installed: "{name} ha sido instalado"
|
||||||
|
alreadyInstalled: "Este tema ya está instalado"
|
||||||
|
invalid: "El formato del tema no es válido"
|
||||||
|
_sfx:
|
||||||
|
note: "Notas"
|
||||||
|
noteMy: "Nota (a mí mismo)"
|
||||||
|
notification: "Notificaciones"
|
||||||
|
chat: "Chat"
|
||||||
|
chatBg: "Chat (Fondo)"
|
||||||
|
antenna: "Antena receptora"
|
||||||
_ago:
|
_ago:
|
||||||
unknown: "Desconocido"
|
unknown: "Desconocido"
|
||||||
future: "Futuro"
|
future: "Futuro"
|
||||||
@ -489,7 +568,11 @@ _permissions:
|
|||||||
"write:user-groups": "Administrar grupos de usuarios"
|
"write:user-groups": "Administrar grupos de usuarios"
|
||||||
_auth:
|
_auth:
|
||||||
shareAccess: "¿Desea permitir el acceso a la cuenta \"{name}\"?"
|
shareAccess: "¿Desea permitir el acceso a la cuenta \"{name}\"?"
|
||||||
|
shareAccessAsk: "¿Está seguro de que desea autorizar esta aplicación para acceder a su cuenta?"
|
||||||
permissionAsk: "Esta aplicación requiere los siguientes permisos"
|
permissionAsk: "Esta aplicación requiere los siguientes permisos"
|
||||||
|
pleaseGoBack: "Por favor, vuelve a la aplicación"
|
||||||
|
callback: "Volviendo a la aplicación"
|
||||||
|
denied: "Acceso denegado"
|
||||||
_antennaSources:
|
_antennaSources:
|
||||||
all: "Todas las notas"
|
all: "Todas las notas"
|
||||||
homeTimeline: "Notas de los usuarios que sigues"
|
homeTimeline: "Notas de los usuarios que sigues"
|
||||||
@ -513,6 +596,7 @@ _widgets:
|
|||||||
clock: "Reloj"
|
clock: "Reloj"
|
||||||
rss: "Lector RSS"
|
rss: "Lector RSS"
|
||||||
activity: "Actividad"
|
activity: "Actividad"
|
||||||
|
photos: "Fotos"
|
||||||
_cw:
|
_cw:
|
||||||
hide: "Ocultar"
|
hide: "Ocultar"
|
||||||
show: "Ver más"
|
show: "Ver más"
|
||||||
@ -592,15 +676,15 @@ _charts:
|
|||||||
_instanceCharts:
|
_instanceCharts:
|
||||||
requests: "Pedidos"
|
requests: "Pedidos"
|
||||||
users: "Variación de usuarios"
|
users: "Variación de usuarios"
|
||||||
usersTotal: "Total de usuarios"
|
usersTotal: "Total acumulado de usuarios"
|
||||||
notes: "Variación de la cantidad de notas"
|
notes: "Variación de la cantidad de notas"
|
||||||
notesTotal: "Estimación de notas"
|
notesTotal: "Total acumulado de la cantidad de notas"
|
||||||
ff: "Variación de cantidad de seguidos/seguidores"
|
ff: "Variación de cantidad de seguidos/seguidores"
|
||||||
ffTotal: "Total de seguidos/seguidores"
|
ffTotal: "Total acumulado de cantidad de seguidos/seguidores"
|
||||||
cacheSize: "Variación del tamaño de la caché"
|
cacheSize: "Variación del tamaño de la caché"
|
||||||
cacheSizeTotal: "Total del tamaño de la caché"
|
cacheSizeTotal: "Total acumulado del tamaño de la caché"
|
||||||
files: "Variación de cantidad de archivos"
|
files: "Variación de cantidad de archivos"
|
||||||
filesTotal: "Total de archivos"
|
filesTotal: "Total acumulado de cantidad de archivos"
|
||||||
_timelines:
|
_timelines:
|
||||||
home: "Inicio"
|
home: "Inicio"
|
||||||
local: "Local"
|
local: "Local"
|
||||||
@ -610,45 +694,39 @@ _pages:
|
|||||||
newPage: "Crear página"
|
newPage: "Crear página"
|
||||||
editPage: "Editar página"
|
editPage: "Editar página"
|
||||||
readPage: "Viendo la fuente"
|
readPage: "Viendo la fuente"
|
||||||
page-created: "La página fue creada"
|
created: "La página fue creada"
|
||||||
page-updated: "La página fue actualizada"
|
updated: "La página fue actualizada"
|
||||||
name-already-exists: "La URL de la página seleccionada ya existe"
|
deleted: "La página borrada"
|
||||||
title-invalid-name: "URL inválida"
|
nameAlreadyExists: "La URL de la página especificada ya existe"
|
||||||
text-invalid-name: "Verifique que no tenga espacios en blanco"
|
invalidNameTitle: "URL inválida"
|
||||||
|
invalidNameText: "Verifique que no tenga espacios en blanco"
|
||||||
editThisPage: "Editar esta página"
|
editThisPage: "Editar esta página"
|
||||||
viewSource: "Ver la fuente"
|
viewSource: "Ver la fuente"
|
||||||
viewPage: "Ver página"
|
viewPage: "Ver página"
|
||||||
like: "Me gusta"
|
like: "Me gusta"
|
||||||
unlike: "Quitar me gusta"
|
unlike: "Quitar me gusta"
|
||||||
liked-pages: "Páginas que me gustan"
|
my: "Mis páginas"
|
||||||
my-pages: "Mis páginas"
|
liked: "Páginas que me gustan"
|
||||||
inspector: "Inspector"
|
inspector: "Inspector"
|
||||||
content: "Bloque de página"
|
content: "Bloque de página"
|
||||||
variables: "Variables"
|
variables: "Variables"
|
||||||
variables-info: "Puedes crear una página dinámica usando variables. Al escribir el <b>{ nombre de la variable }</b> dentro del texto, se puede embeber el valor de la variable allí. Por ejemplo, si en el texto <b>¡Hola { thing } mundo!</b> el valor de la variable (thing) es <b>ai</b>, el texto se vuelve <b>¡Hola ai mundo!</b>"
|
|
||||||
variables-info2: "La evaluación de las variables (el cálculo de los valores) se hace de arriba a abajo, por eso una variable no puede referenciar a otra que esté debajo. Por ejemplo, cuando se definen las variables <b>A、B、C</b>, <b>C</b> puede referenciar a <b>A</b> o <b>B</b>, pero <b>A</b> no puede referenciar a <b>B</b> ni a <b>C</b>."
|
|
||||||
variables-info3: "Para recibir la entrada del usuario, agregue un bloque \"entrada de usuario\" en la página, y configure el nombre de las variables que desea almacenar en el campo \"nombre de variables\" (Las variables se crearán automáticamente). Se ejecutaran acciones en base a la entrada del usuario de esas variables."
|
|
||||||
variables-info4: "Al usar funciones, se pueden agrupar el cálculo de valores de forma reutilizable. Para crear una función, se crea una variable de tipo \"función\". A la función de le puede configurar un slot (argumento), y el valor del slot está disponible como variable dentro de la función. También existen funciones que usan funciones como argumentos bajo el estandar AiScript (llamadas funciones de orden superior). Además de las funciones definidas previamente, se pueden definir funciones al momento en los slots de las funciones de orden superior."
|
|
||||||
more-details: "Más detalles"
|
|
||||||
title: "Título"
|
title: "Título"
|
||||||
url: "URL de la página"
|
url: "URL de la página"
|
||||||
summary: "Resumen de la página"
|
summary: "Resumen de la página"
|
||||||
alignCenter: "Centrar"
|
alignCenter: "Centrar"
|
||||||
hide-title-when-pinned: "Ocultar el título de la página al fijarse"
|
hideTitleWhenPinned: "Ocultar el título de la página al fijarse"
|
||||||
font: "Fuente"
|
font: "Fuente"
|
||||||
fontSerif: "Serif"
|
fontSerif: "Serif"
|
||||||
fontSansSerif: "Sans Serif"
|
fontSansSerif: "Sans Serif"
|
||||||
set-eye-catching-image: "Elegir imagen llamativa"
|
eyeCatchingImageSet: "Elegir imagen llamativa"
|
||||||
remove-eye-catching-image: "Borrar imagen llamativa"
|
eyeCatchingImageRemove: "Borrar imagen llamativa"
|
||||||
chooseBlock: "Agregar bloque"
|
chooseBlock: "Agregar bloque"
|
||||||
selectType: "Elegir tipo"
|
selectType: "Elegir tipo"
|
||||||
enterVariableName: "Ingrese el nombre de la variable"
|
enterVariableName: "Ingrese el nombre de la variable"
|
||||||
the-variable-name-is-already-used: "El nombre de la variable ya está en uso"
|
variableNameIsAlreadyUsed: "El nombre de la variable ya está en uso"
|
||||||
content-blocks: "Contenido"
|
contentBlocks: "Contenido"
|
||||||
input-blocks: "Entrada"
|
inputBlocks: "Entrada"
|
||||||
special-blocks: "Especial"
|
specialBlocks: "Especial"
|
||||||
post-from-post-form: "Postear este contenido"
|
|
||||||
posted-from-post-form: "Posteado"
|
|
||||||
blocks:
|
blocks:
|
||||||
text: "Texto"
|
text: "Texto"
|
||||||
textarea: "Área de texto"
|
textarea: "Área de texto"
|
||||||
|
@ -35,14 +35,16 @@ unpin: "Désépingler"
|
|||||||
copyContent: "Copier le contenu"
|
copyContent: "Copier le contenu"
|
||||||
copyLink: "Copier le lien"
|
copyLink: "Copier le lien"
|
||||||
delete: "Supprimer"
|
delete: "Supprimer"
|
||||||
|
deleteAndEdit: "Supprimer et réécrire"
|
||||||
|
deleteAndEditConfirm: "Êtes-vous sûr de vouloir effacer cette note et la modifier ? Vous perdrez toutes les réactions, renotes et réponses."
|
||||||
addToList: "Ajouter à une liste"
|
addToList: "Ajouter à une liste"
|
||||||
sendMessage: "Envoyer un message"
|
sendMessage: "Envoyer un message"
|
||||||
copyUsername: "Copier le nom d'utilisateur"
|
copyUsername: "Copier le nom d'utilisateur"
|
||||||
reply: "Répondre"
|
reply: "Répondre"
|
||||||
loadMore: "Voir plus"
|
loadMore: "Voir plus"
|
||||||
youGotNewFollower: "Vous a suivi"
|
youGotNewFollower: "Vous suit"
|
||||||
receiveFollowRequest: "Demande de suivi reçue"
|
receiveFollowRequest: "Demande de suivi reçue"
|
||||||
followRequestAccepted: "Suivre la demande acceptée"
|
followRequestAccepted: "L'abonne la demande acceptée"
|
||||||
mentions: "Mentions"
|
mentions: "Mentions"
|
||||||
directNotes: "Messages directs"
|
directNotes: "Messages directs"
|
||||||
importAndExport: "Import et export"
|
importAndExport: "Import et export"
|
||||||
@ -51,7 +53,7 @@ export: "Exporter"
|
|||||||
files: "Fichier·s"
|
files: "Fichier·s"
|
||||||
download: "Télécharger"
|
download: "Télécharger"
|
||||||
driveFileDeleteConfirm: "Êtes-vous sûr·e de vouloir supprimer le fichier \"{name}\" ? Les notes avec ce fichier joint seront aussi supprimées."
|
driveFileDeleteConfirm: "Êtes-vous sûr·e de vouloir supprimer le fichier \"{name}\" ? Les notes avec ce fichier joint seront aussi supprimées."
|
||||||
unfollowConfirm: "Êtes-vous sûr·e ne plus vouloir suivre {name} ?"
|
unfollowConfirm: "Se désabonner de {name} ?"
|
||||||
exportRequested: "Vous avez demandé une exportation. Cela pourrait prendre un peu de temps. Une fois l'exportation terminée, le fichier résultant sera ajouté dans le Drive."
|
exportRequested: "Vous avez demandé une exportation. Cela pourrait prendre un peu de temps. Une fois l'exportation terminée, le fichier résultant sera ajouté dans le Drive."
|
||||||
importRequested: "Vous avez initié un import. Cela pourrait prendre un peu de temps."
|
importRequested: "Vous avez initié un import. Cela pourrait prendre un peu de temps."
|
||||||
lists: "Listes"
|
lists: "Listes"
|
||||||
@ -60,17 +62,17 @@ note: "Note"
|
|||||||
notes: "Notes"
|
notes: "Notes"
|
||||||
following: "Abonnements"
|
following: "Abonnements"
|
||||||
followers: "Abonné·e·s"
|
followers: "Abonné·e·s"
|
||||||
followsYou: "Votre abonné"
|
followsYou: "Vous suit"
|
||||||
createList: "Créer une liste"
|
createList: "Créer une liste"
|
||||||
manageLists: "Gérer les listes"
|
manageLists: "Gérer les listes"
|
||||||
error: "Une erreur est survenue"
|
error: "Une erreur est survenue"
|
||||||
retry: "Réessayer"
|
retry: "Réessayer"
|
||||||
enterListName: "Nom de la liste"
|
enterListName: "Nom de la liste"
|
||||||
privacy: "Vie privée"
|
privacy: "Vie privée"
|
||||||
makeFollowManuallyApprove: "Demandes d’abonnements requiert l’approbation"
|
makeFollowManuallyApprove: "Demandes d’suivi requiert l'approbation"
|
||||||
defaultNoteVisibility: "Visibilité par défaut"
|
defaultNoteVisibility: "Visibilité par défaut"
|
||||||
follow: "Abonnement"
|
follow: "Suivre"
|
||||||
followRequest: "Demande d’abonnement"
|
followRequest: "Demande d’suivre"
|
||||||
followRequests: "Demandes d’abonnement"
|
followRequests: "Demandes d’abonnement"
|
||||||
unfollow: "Se désabonner"
|
unfollow: "Se désabonner"
|
||||||
followRequestPending: "En attente d’approbation"
|
followRequestPending: "En attente d’approbation"
|
||||||
@ -84,9 +86,8 @@ clickToShow: "Cliquer pour afficher"
|
|||||||
sensitive: "Contenu sensible"
|
sensitive: "Contenu sensible"
|
||||||
add: "Ajouter"
|
add: "Ajouter"
|
||||||
reaction: "Réactions"
|
reaction: "Réactions"
|
||||||
reactionSettingDescription: "Personnaliser les émojis à afficher dans le sélecteur de réactions, délimités par les sauts de ligne."
|
reactionSettingDescription: "Attribuez vos réactions préférées qui souhaitent épingler le sélecteur de réaction."
|
||||||
rememberNoteVisibility: "Se souvenir de la visibilité des notes"
|
rememberNoteVisibility: "Se souvenir de la visibilité des notes"
|
||||||
renameFile: "Renommer le ficher"
|
|
||||||
attachCancel: "Enlever le fichier attaché"
|
attachCancel: "Enlever le fichier attaché"
|
||||||
markAsSensitive: "Marquer comme sensible"
|
markAsSensitive: "Marquer comme sensible"
|
||||||
unmarkAsSensitive: "Enlever le marquage comme sensible"
|
unmarkAsSensitive: "Enlever le marquage comme sensible"
|
||||||
@ -116,12 +117,13 @@ loginFailed: "Échec de la connexion"
|
|||||||
showOnRemote: "Voir sur l'instance distante"
|
showOnRemote: "Voir sur l'instance distante"
|
||||||
general: "Général"
|
general: "Général"
|
||||||
wallpaper: "Arrière plan"
|
wallpaper: "Arrière plan"
|
||||||
|
setWallpaper: "Définir le fond d'écran"
|
||||||
removeWallpaper: "Supprimer l'arrière plan"
|
removeWallpaper: "Supprimer l'arrière plan"
|
||||||
searchWith: "Recherche : {q}"
|
searchWith: "Recherche : {q}"
|
||||||
youHaveNoLists: "Vous n'avez aucune liste"
|
youHaveNoLists: "Vous n'avez aucune liste"
|
||||||
followConfirm: "Désirez-vous suivre {name} ?"
|
followConfirm: "Désirez-vous suivre {name} ?"
|
||||||
proxyAccount: "Compte proxy"
|
proxyAccount: "Compte proxy"
|
||||||
proxyAccountDescription: "Un compte proxy se comporte, dans certaines conditions, comme un·e abonné·e distant pour les utilisateurs d'autres instances.\nExemple : quand un·e utilisateur·rice distant·e est ajouté·e à une liste, ses notes ne serait pas visibles sur l'instance si personne ne le·la suit. Le compte proxy va donc le·la suivre pour que ses notes soient acheminées."
|
proxyAccountDescription: "Un compte proxy se comporte, dans certaines conditions, comme un·e abonné·e distant pour les utilisateurs d'autres instances.\nExemple : quand un·e utilisateur·rice distant·e est ajouté·e à une liste, ses notes ne serait pas visibles sur l'instance si personne ne le·la abonné. Le compte proxy va donc le·la abonne pour que ses notes soient acheminées."
|
||||||
host: "Hôte"
|
host: "Hôte"
|
||||||
selectUser: "Sélectionner un·e utilisateur·rice"
|
selectUser: "Sélectionner un·e utilisateur·rice"
|
||||||
recipient: "Correspondant·e"
|
recipient: "Correspondant·e"
|
||||||
@ -168,6 +170,7 @@ intro: "L'installation de Misskey est terminée! Créons le compte administrateu
|
|||||||
done: "Terminé"
|
done: "Terminé"
|
||||||
processing: "Traitement en cours"
|
processing: "Traitement en cours"
|
||||||
preview: "Prévisualisation"
|
preview: "Prévisualisation"
|
||||||
|
default: "Par défaut"
|
||||||
noCustomEmojis: "Il a pas d’émoji"
|
noCustomEmojis: "Il a pas d’émoji"
|
||||||
customEmojisOfRemote: "Émojis l'instance distante"
|
customEmojisOfRemote: "Émojis l'instance distante"
|
||||||
noJobs: "Il n'y a aucune tâche planifiée"
|
noJobs: "Il n'y a aucune tâche planifiée"
|
||||||
@ -189,7 +192,7 @@ newPassword: "Nouveau mot de passe"
|
|||||||
newPasswordRetype: "Nouveau mot de passe (répéter)"
|
newPasswordRetype: "Nouveau mot de passe (répéter)"
|
||||||
attachFile: "Joindre un fichier"
|
attachFile: "Joindre un fichier"
|
||||||
more: "Plus !"
|
more: "Plus !"
|
||||||
featured: "Surlignage"
|
featured: "Tendances"
|
||||||
usernameOrUserId: "Nom d'utilisateur ou ID utilisateur"
|
usernameOrUserId: "Nom d'utilisateur ou ID utilisateur"
|
||||||
noSuchUser: "Utilisateur non trouvé"
|
noSuchUser: "Utilisateur non trouvé"
|
||||||
lookup: "Recherche"
|
lookup: "Recherche"
|
||||||
@ -203,12 +206,15 @@ messaging: "Discuter"
|
|||||||
upload: "Téléchargez"
|
upload: "Téléchargez"
|
||||||
fromDrive: "Depuis le Drive"
|
fromDrive: "Depuis le Drive"
|
||||||
fromUrl: "De l'URL"
|
fromUrl: "De l'URL"
|
||||||
|
uploadFromUrl: "Téléverser via une URL"
|
||||||
|
uploadFromUrlDescription: "URL du fichier que vous souhaitez téléverser"
|
||||||
|
uploadFromUrlRequested: "Téléversement demandé"
|
||||||
|
uploadFromUrlMayTakeTime: "Le téléversement de votre fichier peut prendre un certain temps."
|
||||||
explore: "Découvrir"
|
explore: "Découvrir"
|
||||||
games: "Jeux de Misskey"
|
games: "Jeux de Misskey"
|
||||||
messageRead: "Lus"
|
messageRead: "Lus"
|
||||||
recentUsedEmojis: "Emoji récemment utilisé"
|
|
||||||
noMoreHistory: "Plus d'histoire passée"
|
noMoreHistory: "Plus d'histoire passée"
|
||||||
startMessaging: "Commencer à écrire un discutez"
|
startMessaging: "Commencer à discuter"
|
||||||
nUsersRead: "{n} personnes ont lu"
|
nUsersRead: "{n} personnes ont lu"
|
||||||
agreeTo: "D'accord {0}"
|
agreeTo: "D'accord {0}"
|
||||||
tos: "Conditions d'utilisation"
|
tos: "Conditions d'utilisation"
|
||||||
@ -222,23 +228,38 @@ yearsOld: "{age} ans"
|
|||||||
registeredDate: "Date de création"
|
registeredDate: "Date de création"
|
||||||
location: "Localisation"
|
location: "Localisation"
|
||||||
theme: "Thème"
|
theme: "Thème"
|
||||||
|
themeForLightMode: "Thème à utiliser en Mode Lumière"
|
||||||
|
themeForDarkMode: "Thème à utiliser en Mode Sombre"
|
||||||
|
light: "Lumière"
|
||||||
|
dark: "Sombre"
|
||||||
lightThemes: "Thème lumineux"
|
lightThemes: "Thème lumineux"
|
||||||
darkThemes: "Thème sombre"
|
darkThemes: "Thème sombre"
|
||||||
|
syncDeviceDarkMode: "Synchronisez le mode sombre avec les paramètres de votre appareil"
|
||||||
drive: "Drive"
|
drive: "Drive"
|
||||||
|
fileName: "Nom du fichier"
|
||||||
selectFile: "Choisir le fichier"
|
selectFile: "Choisir le fichier"
|
||||||
selectFiles: "Choisir le fichiers"
|
selectFiles: "Choisir le fichiers"
|
||||||
renameFolder: "Renommer le dossier"
|
renameFile: "Renommer le ficher"
|
||||||
|
folderName: "Nom du dossier"
|
||||||
createFolder: "Créer un dossier"
|
createFolder: "Créer un dossier"
|
||||||
|
renameFolder: "Renommer le dossier"
|
||||||
deleteFolder: "Supprimer le dossier"
|
deleteFolder: "Supprimer le dossier"
|
||||||
addFile: "Ajoutez un fichier"
|
addFile: "Ajoutez un fichier"
|
||||||
emptyDrive: "Le Drive est vide"
|
emptyDrive: "Le Drive est vide"
|
||||||
emptyFolder: "Le dossier est vide"
|
emptyFolder: "Le dossier est vide"
|
||||||
|
unableToDelete: "Ne peut pas être supprimé"
|
||||||
|
inputNewFileName: "Entrez un nouveau nom de fichier"
|
||||||
|
inputNewFolderName: "Entrez un nouveau nom de dossier"
|
||||||
|
circularReferenceFolder: "Le dossier de destination est un sous-dossier du dossier que vous souhaitez déplacer."
|
||||||
|
hasChildFilesOrFolders: "Ce dossier n'est pas vide, il ne peut pas être supprimé"
|
||||||
copyUrl: "Copier l’URL"
|
copyUrl: "Copier l’URL"
|
||||||
rename: "Renommer"
|
rename: "Renommer"
|
||||||
avatar: "Avatar"
|
avatar: "Avatar"
|
||||||
banner: "Bannière"
|
banner: "Bannière"
|
||||||
nsfw: "Contenu sensible"
|
nsfw: "Contenu sensible"
|
||||||
disconnectedFromServer: "Déconnecté du serveur"
|
disconnectedFromServer: "Déconnecté du serveur"
|
||||||
|
reload: "Rafraîchir"
|
||||||
|
doNothing: "Ignorer"
|
||||||
reloadConfirm: "Voulez-vous recharger?"
|
reloadConfirm: "Voulez-vous recharger?"
|
||||||
watch: "Surveiller"
|
watch: "Surveiller"
|
||||||
unwatch: "Ne plus surveiller"
|
unwatch: "Ne plus surveiller"
|
||||||
@ -283,7 +304,8 @@ antennas: "Antenne"
|
|||||||
manageAntennas: "Gestion d'antenne"
|
manageAntennas: "Gestion d'antenne"
|
||||||
name: "Nom"
|
name: "Nom"
|
||||||
antennaSource: "Recevoir la source"
|
antennaSource: "Recevoir la source"
|
||||||
antennaKeywords: "Mots clés entrants"
|
antennaKeywords: "Mots clés à recevoir"
|
||||||
|
antennaExcludeKeywords: "Mots clés à exclure"
|
||||||
antennaKeywordsDescription: "Lorsqu'il est séparé par un espace, il devient une spécification ET, et lorsqu'il est séparé par un saut de ligne, il devient une spécification OU."
|
antennaKeywordsDescription: "Lorsqu'il est séparé par un espace, il devient une spécification ET, et lorsqu'il est séparé par un saut de ligne, il devient une spécification OU."
|
||||||
notifyAntenna: "Notifier les nouvelles notes"
|
notifyAntenna: "Notifier les nouvelles notes"
|
||||||
withFileAntenna: "Notes uniquement avec fichiers joints"
|
withFileAntenna: "Notes uniquement avec fichiers joints"
|
||||||
@ -309,11 +331,11 @@ userList: "Listes"
|
|||||||
about: "Informations"
|
about: "Informations"
|
||||||
aboutMisskey: "À propos de Misskey"
|
aboutMisskey: "À propos de Misskey"
|
||||||
aboutMisskeyText: "Misskey est un logiciel open source, développé par syuilo depuis 2014."
|
aboutMisskeyText: "Misskey est un logiciel open source, développé par syuilo depuis 2014."
|
||||||
misskeyMembers: "Il est développé et maintenu par les membres répertoriés ici:"
|
misskeyMembers: "Il est développé et maintenu par les membres listés ci-dessous :"
|
||||||
misskeySource: "Le code source est disponible ici:"
|
misskeySource: "Le code source est disponible ici:"
|
||||||
misskeyTranslation: "Aidez-nous avec votre contribution à traduire Misskey:"
|
misskeyTranslation: "Aidez-nous avec votre contribution à traduire Misskey:"
|
||||||
misskeyDonate: "Vous pouvez contribuer au développement de Misskey en faisant un don ici:"
|
misskeyDonate: "Vous pouvez contribuer au développement de Misskey en faisant un don ici:"
|
||||||
morePatrons: "Nous apprécions vraiment le soutien de nombreux autres les soutiens non répertoriés ici. Merci beaucoup à tous! 🥰"
|
morePatrons: "Nous apprécions vraiment le soutien de nombreuses autres personnes non mentionnées ici. Merci à toutes et à tous ! 🥰"
|
||||||
patrons: "Supporteurs"
|
patrons: "Supporteurs"
|
||||||
administrator: "Administrateur"
|
administrator: "Administrateur"
|
||||||
token: "Jeton"
|
token: "Jeton"
|
||||||
@ -328,7 +350,7 @@ unregister: "Se désinscrire"
|
|||||||
passwordLessLogin: "Connectez-vous sans mot de passe"
|
passwordLessLogin: "Connectez-vous sans mot de passe"
|
||||||
resetPassword: "Réinitialiser mot de passe"
|
resetPassword: "Réinitialiser mot de passe"
|
||||||
newPasswordIs: "Votre nouveau mot de passe est \"{password}\""
|
newPasswordIs: "Votre nouveau mot de passe est \"{password}\""
|
||||||
post: "Notes"
|
post: "Publier"
|
||||||
posted: "Publié !"
|
posted: "Publié !"
|
||||||
autoReloadWhenDisconnected: "Rechargement automatique lorsque le serveur se déconnecte"
|
autoReloadWhenDisconnected: "Rechargement automatique lorsque le serveur se déconnecte"
|
||||||
autoNoteWatch: "Surveiller automatique pour les notes"
|
autoNoteWatch: "Surveiller automatique pour les notes"
|
||||||
@ -383,13 +405,14 @@ strongPassword: "Fort mot de passe"
|
|||||||
passwordMatched: "Correcte"
|
passwordMatched: "Correcte"
|
||||||
passwordNotMatched: "Ne correspond pas"
|
passwordNotMatched: "Ne correspond pas"
|
||||||
signinWith: "Connectez-vous avec {x}"
|
signinWith: "Connectez-vous avec {x}"
|
||||||
|
signinFailed: "Échec d’authentification. Veuillez vérifier que votre nom d’utilisateur et mot de passe sont corrects."
|
||||||
tapSecurityKey: "Touchez la clé de sécurité"
|
tapSecurityKey: "Touchez la clé de sécurité"
|
||||||
or: "OU"
|
or: "OU"
|
||||||
uiLanguage: "Langue d'affichage de l'interface"
|
uiLanguage: "Langue d'affichage de l'interface"
|
||||||
groupInvited: "Invité au groupe"
|
groupInvited: "Invité au groupe"
|
||||||
aboutX: "À propos de {x}"
|
aboutX: "À propos de {x}"
|
||||||
useOsNativeEmojis: "Utilisez les emojis natifs de la plateforme"
|
useOsNativeEmojis: "Utilisez les emojis natifs de la plateforme"
|
||||||
noGroups: "Pas de groupes"
|
youHaveNoGroups: "Vous n'avez aucune groupe"
|
||||||
joinOrCreateGroup: "Soyez invité à rejoindre les groupes ou vous pouvez créer votre propre groupe."
|
joinOrCreateGroup: "Soyez invité à rejoindre les groupes ou vous pouvez créer votre propre groupe."
|
||||||
noHistory: "Pas d'historique"
|
noHistory: "Pas d'historique"
|
||||||
disableAnimatedMfm: "Désactiver MFM qui a des animations"
|
disableAnimatedMfm: "Désactiver MFM qui a des animations"
|
||||||
@ -401,7 +424,7 @@ createAccount: "Créer compte"
|
|||||||
existingAcount: "Comptes existants"
|
existingAcount: "Comptes existants"
|
||||||
regenerate: "Régénérer"
|
regenerate: "Régénérer"
|
||||||
fontSize: "Taille de la police"
|
fontSize: "Taille de la police"
|
||||||
noFollowRequests: "Vous n'avez aucune demandes d'abonnement en attente"
|
noFollowRequests: "Vous n’avez aucune demande d’abonnement en attente"
|
||||||
openImageInNewTab: "Ouvrir l'image dans un nouvel onglet"
|
openImageInNewTab: "Ouvrir l'image dans un nouvel onglet"
|
||||||
dashboard: "Tableau de bord"
|
dashboard: "Tableau de bord"
|
||||||
local: "Local"
|
local: "Local"
|
||||||
@ -412,6 +435,62 @@ dayOverDayChanges: "Diff quotidien"
|
|||||||
accessibility: "Accessibilité"
|
accessibility: "Accessibilité"
|
||||||
clinetSettings: "Paramètres du client"
|
clinetSettings: "Paramètres du client"
|
||||||
accountSettings: "Paramètres du compte"
|
accountSettings: "Paramètres du compte"
|
||||||
|
promotion: "Promu"
|
||||||
|
promote: "Promouvoir"
|
||||||
|
numberOfDays: "Nombre de jours"
|
||||||
|
hideThisNote: "Masquer cette note"
|
||||||
|
showFeaturedNotesInTimeline: "Afficher les notes en vedette dans fil d'actualité"
|
||||||
|
objectStorage: "Stockage d'objets"
|
||||||
|
useObjectStorage: "Utiliser le stockage d'objets"
|
||||||
|
objectStorageBaseUrl: "Base URL"
|
||||||
|
objectStorageBaseUrlDesc: "Préfixe d'URL utilisé pour construire l'URL vers le référencement d'objet (média). Spécifiez son URL si vous utilisez un CDN ou un proxy, sinon spécifiez l'adresse accessible au public selon le guide de service que vous allez utiliser. i.g 'https://<bucket>.s3.amazonaws.com' pour AWS S3 et 'https://storage.googleapis.com/<bucket>' pour GCS."
|
||||||
|
objectStorageBucket: "Bucket"
|
||||||
|
objectStorageBucketDesc: "Veuillez spécifier le nom du compartiment utilisé sur le service configuré."
|
||||||
|
objectStoragePrefix: "Prefix"
|
||||||
|
objectStoragePrefixDesc: "Les fichiers seront stockés sous le répertoire de ce préfixe."
|
||||||
|
objectStorageEndpoint: "Endpoint"
|
||||||
|
objectStorageEndpointDesc: "Laissez ce champ vide si vous utilisez AWS S3, sinon spécifiez le point de terminaison comme '<host>' ou '<host>: <port>' selon le guide de service que vous allez utiliser."
|
||||||
|
objectStorageRegion: "Region"
|
||||||
|
objectStorageRegionDesc: "Spécifiez une région comme 'xx-east-1'. Si votre service ne fait pas de distinction entre les régions, laissez-le vide ou remplissez 'us-east-1'."
|
||||||
|
objectStorageUseSSL: "Utiliser SSL"
|
||||||
|
objectStorageUseSSLDesc: "Désactivez-le si vous n'utilisez pas HTTPS pour la connexion API"
|
||||||
|
serverLogs: "Journaux serveur"
|
||||||
|
deleteAll: "Supprimer tout"
|
||||||
|
showFixedPostForm: "Afficher le formulaire en haut du fil d'actualité"
|
||||||
|
newNoteRecived: "Vous avez une nouvelle note"
|
||||||
|
sounds: "Sons"
|
||||||
|
listen: "Écouter"
|
||||||
|
none: "Rien"
|
||||||
|
volume: "Volume"
|
||||||
|
details: "Détails"
|
||||||
|
chooseEmoji: "Choisissez des emojis"
|
||||||
|
unableToProcess: "L'opération n'a pas pu être complétée"
|
||||||
|
recentUsed: "Récemment utilisé"
|
||||||
|
install: "Installation"
|
||||||
|
uninstall: "Désinstaller"
|
||||||
|
installedApps: "Applications Autorisées"
|
||||||
|
nothing: "Il n'y a rien à voir ici"
|
||||||
|
installedDate: "Autorisé"
|
||||||
|
lastUsedDate: "Dernière utilisation"
|
||||||
|
state: "État"
|
||||||
|
sort: "Trier"
|
||||||
|
ascendingOrder: "Ascendant"
|
||||||
|
descendingOrder: "Descendant"
|
||||||
|
_theme:
|
||||||
|
explore: "Explorer les thèmes"
|
||||||
|
install: "Installer un thème"
|
||||||
|
manage: "Gestion des thèmes"
|
||||||
|
code: "Code du thème"
|
||||||
|
installed: "{name} a été installé"
|
||||||
|
alreadyInstalled: "Ce thème est déjà installé"
|
||||||
|
invalid: "Le format du thème n'est pas valide"
|
||||||
|
_sfx:
|
||||||
|
note: "Nouvelle note"
|
||||||
|
noteMy: "Ma note"
|
||||||
|
notification: "Notifications"
|
||||||
|
chat: "Discuter"
|
||||||
|
chatBg: "Discuter (De fond)"
|
||||||
|
antenna: "Réception d'antenne"
|
||||||
_ago:
|
_ago:
|
||||||
unknown: "Inconnu"
|
unknown: "Inconnu"
|
||||||
future: "Futur"
|
future: "Futur"
|
||||||
@ -431,9 +510,29 @@ _time:
|
|||||||
_tutorial:
|
_tutorial:
|
||||||
title: "Comment utiliser Misskey"
|
title: "Comment utiliser Misskey"
|
||||||
step1_1: "Bienvenue,"
|
step1_1: "Bienvenue,"
|
||||||
|
step1_2: "Cette page est appelée \"fil d'actualité\". Elle montre les \"notes\" des personnes que vous \"abonne\" dans l'ordre chronologique."
|
||||||
|
step1_3: "Vous n'avez pas encore publier de notes et personne n'est encore abonnements, vous ne devriez donc rien voir dans fil d'actualité."
|
||||||
|
step2_1: "Finissons de créer votre profil avant d'écrire une note ou de abonne quelqu'un."
|
||||||
|
step2_2: "En fournissant quelques informations sur vous, il sera plus facile pour les autres de vous abonne."
|
||||||
|
step3_1: "Vous avez fini de créer votre profil ?"
|
||||||
|
step3_2: "L’étape suivante consiste à créer une note. Vous pouvez commencer en cliquant sur l’icône crayon sur l’écran."
|
||||||
|
step3_3: "Remplissez le cadran et cliquez sur le bouton en haut à droite pour envoyer."
|
||||||
|
step3_4: "Vous n'avez rien à dire ? Essayez de dire \"J'ai commencé à utiliser Misskey\"."
|
||||||
|
step4_1: "Avez-vous posté votre première notes ?"
|
||||||
|
step4_2: "Votre première note est maintenant affiché sur votre fil d'actualité."
|
||||||
|
step5_1: "Ensuite, abonnons-nous d'autres personnes et rendre la fil d'actualité en savoir plus vivante."
|
||||||
|
step5_2: "{featured} affiche les notes en tendance sur cette instance. {explore} vous permet de trouver les utilisateur·rice·s en tendance. Essayez de vous abonner aux gens que vous aimez !"
|
||||||
|
step5_3: "Pour abonne un utilisateur, cliquez sur l'icône de l'utilisateur pour afficher la page de l'utilisateur et appuyez sur le bouton \"Abonnement\"."
|
||||||
|
step5_4: "Selon l'utilisateur, il peut s'écouler un certain temps avant que la abonner ne soit approuvé."
|
||||||
|
step6_1: "Si vous voyez la notes d'un autre utilisateur sur fil d'actualité, c'était réussi."
|
||||||
|
step6_2: "Vous pouvez ajouter des \"réactions\" aux notes des autres afin de pouvoir facilement dire votre émotion."
|
||||||
|
step6_3: "Pour ajouter une réaction, cliquez sur la marque \"+\" sur la note et sélectionnez la réaction souhaitée."
|
||||||
|
step7_1: "Tu as bien travaillé ! Ceci conclut l'explication de l'utilisation de base de Misskey."
|
||||||
|
step7_2: "Pour plus d'informations sur Misskey, voir {help}."
|
||||||
|
step7_3: "Alors, profitez de Misskey 🚀"
|
||||||
_2fa:
|
_2fa:
|
||||||
alreadyRegistered: "Cette étape à déjà été complétée"
|
alreadyRegistered: "Cette étape à déjà été complétée"
|
||||||
registerDevice: "S’inscrire l'appareil"
|
registerDevice: "Ajouter un appareil"
|
||||||
registerKey: "S’inscrire la clé"
|
registerKey: "S’inscrire la clé"
|
||||||
step1: "Tout d'abord, installez une application d'authentification, telle que {a} ou {b}, sur votre appareil."
|
step1: "Tout d'abord, installez une application d'authentification, telle que {a} ou {b}, sur votre appareil."
|
||||||
step2: "Ensuite, scannez le code QR affiché avec l'application."
|
step2: "Ensuite, scannez le code QR affiché avec l'application."
|
||||||
@ -469,7 +568,11 @@ _permissions:
|
|||||||
"write:user-groups": "Éditer les groupes des utilisateur·rice·s"
|
"write:user-groups": "Éditer les groupes des utilisateur·rice·s"
|
||||||
_auth:
|
_auth:
|
||||||
shareAccess: "Autoriser \"{name}\" à accéder à votre compte ?"
|
shareAccess: "Autoriser \"{name}\" à accéder à votre compte ?"
|
||||||
|
shareAccessAsk: "Voulez-vous vraiment autoriser cette application à accéder à votre compte?"
|
||||||
permissionAsk: "Cette application nécessite les autorisations suivantes "
|
permissionAsk: "Cette application nécessite les autorisations suivantes "
|
||||||
|
pleaseGoBack: "Veillez retourner à l'application"
|
||||||
|
callback: "Retour vers l’application"
|
||||||
|
denied: "Accès refusé"
|
||||||
_antennaSources:
|
_antennaSources:
|
||||||
all: "Toutes les notes"
|
all: "Toutes les notes"
|
||||||
homeTimeline: "Notes de l'utilisateur auquel je m'abonne"
|
homeTimeline: "Notes de l'utilisateur auquel je m'abonne"
|
||||||
@ -493,6 +596,7 @@ _widgets:
|
|||||||
clock: "Horloge"
|
clock: "Horloge"
|
||||||
rss: "Lecteur de flux RSS"
|
rss: "Lecteur de flux RSS"
|
||||||
activity: "Activités"
|
activity: "Activités"
|
||||||
|
photos: "Photos"
|
||||||
_cw:
|
_cw:
|
||||||
hide: "Masquer"
|
hide: "Masquer"
|
||||||
show: "Voir plus"
|
show: "Voir plus"
|
||||||
@ -559,7 +663,7 @@ _charts:
|
|||||||
federationInstancesIncDec: "Variation du nombre d'instances"
|
federationInstancesIncDec: "Variation du nombre d'instances"
|
||||||
federationInstancesTotal: "Nombre d'instances au total"
|
federationInstancesTotal: "Nombre d'instances au total"
|
||||||
usersIncDec: "Variation du nombre d'utilisateur·rice·s"
|
usersIncDec: "Variation du nombre d'utilisateur·rice·s"
|
||||||
usersTotal: "Nombre d'utilsateur·rice·s au total"
|
usersTotal: "Nombre d'utilisateur·rice·s au total"
|
||||||
activeUsers: "Utilisateur·rice·s actif·ve·s"
|
activeUsers: "Utilisateur·rice·s actif·ve·s"
|
||||||
notesIncDec: "Variation du nombre d'notes"
|
notesIncDec: "Variation du nombre d'notes"
|
||||||
localNotesIncDec: "Variation du nombre de notes local"
|
localNotesIncDec: "Variation du nombre de notes local"
|
||||||
@ -572,15 +676,15 @@ _charts:
|
|||||||
_instanceCharts:
|
_instanceCharts:
|
||||||
requests: "Requêtes"
|
requests: "Requêtes"
|
||||||
users: "Variation du nombre d'utilisateur·rice·s"
|
users: "Variation du nombre d'utilisateur·rice·s"
|
||||||
usersTotal: "Somme du nombre d'utilisateur·rice·s accumulés"
|
usersTotal: "Nombre d'utilisateur·rice·s au total cumulé"
|
||||||
notes: "Variation du nombre d'notes"
|
notes: "Variation du nombre d'notes"
|
||||||
notesTotal: "Somme du nombre d’notes accumulés"
|
notesTotal: "Nombre d'notes au total cumulé"
|
||||||
ff: "Variation des abonné·e·s"
|
ff: "Variation des abonné·e·s"
|
||||||
ffTotal: "Somme du nombre d'abonnements accumulés"
|
ffTotal: "Nombre d'abonné·e·s au total cumulé"
|
||||||
cacheSize: "Variation de la taille du cache"
|
cacheSize: "Variation de la taille du cache"
|
||||||
cacheSizeTotal: "Somme de la taille du cache accumulé"
|
cacheSizeTotal: "La taille du cache au total cumulé"
|
||||||
files: "Variation du nombre de fichiers"
|
files: "Variation du nombre de fichiers"
|
||||||
filesTotal: "Somme du nombre de fichiers accumulés"
|
filesTotal: "Nombre de fichiers au total cumulé"
|
||||||
_timelines:
|
_timelines:
|
||||||
home: "Principal"
|
home: "Principal"
|
||||||
local: "Local"
|
local: "Local"
|
||||||
@ -590,45 +694,39 @@ _pages:
|
|||||||
newPage: "Créer une page"
|
newPage: "Créer une page"
|
||||||
editPage: "Modifier une page"
|
editPage: "Modifier une page"
|
||||||
readPage: "Voir la source"
|
readPage: "Voir la source"
|
||||||
page-created: "Page a été créée !"
|
created: "La page a été créée !"
|
||||||
page-updated: "A mis à jour la page"
|
updated: "La page a été mise à jour !"
|
||||||
name-already-exists: "Une page portant le même nom existe déjà"
|
deleted: "La page a bien été supprimée"
|
||||||
title-invalid-name: "L’URL de la page spécifiée n’est pas valide"
|
nameAlreadyExists: "La URL de page spécifiée existe déjà"
|
||||||
text-invalid-name: "Assurez-vous qu'il n'est pas vide"
|
invalidNameTitle: "La URL de la page spécifiée n’est pas valide"
|
||||||
|
invalidNameText: "Assurez-vous qu'il n'est pas vide"
|
||||||
editThisPage: "Éditer cette page"
|
editThisPage: "Éditer cette page"
|
||||||
viewSource: "Afficher la source"
|
viewSource: "Afficher la source"
|
||||||
viewPage: "Afficher la page"
|
viewPage: "Afficher la page"
|
||||||
like: "Favori"
|
like: "Favori"
|
||||||
unlike: "Je n’favoris pas"
|
unlike: "Je n’favoris pas"
|
||||||
liked-pages: "Pages favoris"
|
my: "Mes pages"
|
||||||
my-pages: "Mes pages"
|
liked: "Pages favoris"
|
||||||
inspector: "Inspecteur"
|
inspector: "Inspecteur"
|
||||||
content: "Bloc de page"
|
content: "Bloc de page"
|
||||||
variables: "Variables"
|
variables: "Variables"
|
||||||
variables-info: "Vous pouvez créer une page dynamique à l'aide de variables. En tapant le <b>{nom de variable}</b> dans le texte, vous pouvez y incorporer la valeur de la variable. Par exemple, si dans le texte <b>Bonjour {chose} monde!</b> la valeur de la variable (chose) est <b>ai</b>, le texte devient est <b>Bonjour ai monde!</b>."
|
|
||||||
variables-info2: "L'évaluation des variables (le calcul des valeurs) se fait de haut en bas, donc l'variable ne peut pas se référer à une autre qui est en dessous. Par exemple, lorsque les variables <b>A、B、C</b> sont définies, <b>C</b> peut faire référence à <b>A</b> ou <b>B</b>, mais <b>A</b> ne peut pas faire référence à <b>B</b> ou <b>C</b>."
|
|
||||||
variables-info3: "Pour recevoir une entrée utilisateur, ajoutez un bloc \"Entrée\" sur la page et définissez le nom des variables que vous souhaitez stocker dans le champ \"Nom de la variable\" (les variables seront créées automatiquement). Les actions seront exécutées en fonction de l'entrée utilisateur de ces variables."
|
|
||||||
variables-info4: "Les fonctions vous permettent d'organiser le processus de calcul des valeurs sous une forme réutilisable. Pour créer une fonction, créez une variable de type \"fonction\". Une fonction peut avoir un slot (argument) et sa valeur peut être utilisée comme variable dans la fonction. Il existe également une fonction qui prend une fonction comme argument dans la norme AiScript (appelée fonction d'ordre supérieur). En plus des fonctions prédéfinies, elles peuvent être définies instantanément dans ces emplacements de fonction d'ordre supérieur."
|
|
||||||
more-details: "Description"
|
|
||||||
title: "Titre"
|
title: "Titre"
|
||||||
url: "URL de page"
|
url: "URL de page"
|
||||||
summary: "Résumé de page"
|
summary: "Résumé de page"
|
||||||
alignCenter: "Centrée"
|
alignCenter: "Centrée"
|
||||||
hide-title-when-pinned: "Masquer le titre de la page lorsque celle-ci est épinglée au profil"
|
hideTitleWhenPinned: "Masquer le titre de la page lorsque celle-ci est épinglée au profil"
|
||||||
font: "Police de caractères"
|
font: "Police de caractères"
|
||||||
fontSerif: "Serif"
|
fontSerif: "Serif"
|
||||||
fontSansSerif: "Sans Serif"
|
fontSansSerif: "Sans Serif"
|
||||||
set-eye-catching-image: "Définir une image attirante"
|
eyeCatchingImageSet: "Définir une image attirante"
|
||||||
remove-eye-catching-image: "Supprimer une image attirante"
|
eyeCatchingImageRemove: "Supprimer une image attirante"
|
||||||
chooseBlock: "Ajouter un bloc"
|
chooseBlock: "Ajouter un bloc"
|
||||||
selectType: "Choisir un type"
|
selectType: "Choisir un type"
|
||||||
enterVariableName: "Veuillez entrer un nom de variable"
|
enterVariableName: "Veuillez entrer un nom de variable"
|
||||||
the-variable-name-is-already-used: "Cette variable est déjà utilisée"
|
variableNameIsAlreadyUsed: "Cette variable est déjà utilisée"
|
||||||
content-blocks: "Contenu"
|
contentBlocks: "Contenu"
|
||||||
input-blocks: "Entrée"
|
inputBlocks: "Entrée"
|
||||||
special-blocks: "Spécial"
|
specialBlocks: "Spécial"
|
||||||
post-from-post-form: "Publier ce contenu"
|
|
||||||
posted-from-post-form: "Publié !"
|
|
||||||
blocks:
|
blocks:
|
||||||
text: "Texte"
|
text: "Texte"
|
||||||
textarea: "Zone de texte"
|
textarea: "Zone de texte"
|
||||||
|
@ -35,6 +35,8 @@ unpin: "ピン留め解除"
|
|||||||
copyContent: "内容をコピー"
|
copyContent: "内容をコピー"
|
||||||
copyLink: "リンクをコピー"
|
copyLink: "リンクをコピー"
|
||||||
delete: "削除"
|
delete: "削除"
|
||||||
|
deleteAndEdit: "削除して編集"
|
||||||
|
deleteAndEditConfirm: "このノートを削除してもう一度編集しますか?このノートへのリアクション、Renote、返信も全て削除されます。"
|
||||||
addToList: "リストに追加"
|
addToList: "リストに追加"
|
||||||
sendMessage: "メッセージを送信"
|
sendMessage: "メッセージを送信"
|
||||||
copyUsername: "ユーザー名をコピー"
|
copyUsername: "ユーザー名をコピー"
|
||||||
@ -84,9 +86,8 @@ clickToShow: "クリックして表示"
|
|||||||
sensitive: "閲覧注意"
|
sensitive: "閲覧注意"
|
||||||
add: "追加"
|
add: "追加"
|
||||||
reaction: "リアクション"
|
reaction: "リアクション"
|
||||||
reactionSettingDescription: "リアクションピッカーに表示するリアクションを改行で区切って設定します。"
|
reactionSettingDescription: "リアクションピッカーに表示するリアクションを設定します。"
|
||||||
rememberNoteVisibility: "公開範囲を記憶する"
|
rememberNoteVisibility: "公開範囲を記憶する"
|
||||||
renameFile: "ファイル名を変更"
|
|
||||||
attachCancel: "添付取り消し"
|
attachCancel: "添付取り消し"
|
||||||
markAsSensitive: "閲覧注意にする"
|
markAsSensitive: "閲覧注意にする"
|
||||||
unmarkAsSensitive: "閲覧注意を解除する"
|
unmarkAsSensitive: "閲覧注意を解除する"
|
||||||
@ -116,6 +117,7 @@ loginFailed: "ログインに失敗しました"
|
|||||||
showOnRemote: "リモートで表示"
|
showOnRemote: "リモートで表示"
|
||||||
general: "全般"
|
general: "全般"
|
||||||
wallpaper: "壁紙"
|
wallpaper: "壁紙"
|
||||||
|
setWallpaper: "壁紙を設定"
|
||||||
removeWallpaper: "壁紙を削除"
|
removeWallpaper: "壁紙を削除"
|
||||||
searchWith: "検索: {q}"
|
searchWith: "検索: {q}"
|
||||||
youHaveNoLists: "リストがありません"
|
youHaveNoLists: "リストがありません"
|
||||||
@ -168,6 +170,7 @@ intro: "Misskeyのインストールが完了しました!管理者アカウ
|
|||||||
done: "完了"
|
done: "完了"
|
||||||
processing: "処理中"
|
processing: "処理中"
|
||||||
preview: "プレビュー"
|
preview: "プレビュー"
|
||||||
|
default: "デフォルト"
|
||||||
noCustomEmojis: "絵文字はありません"
|
noCustomEmojis: "絵文字はありません"
|
||||||
customEmojisOfRemote: "リモートの絵文字"
|
customEmojisOfRemote: "リモートの絵文字"
|
||||||
noJobs: "ジョブはありません"
|
noJobs: "ジョブはありません"
|
||||||
@ -203,10 +206,13 @@ messaging: "チャット"
|
|||||||
upload: "アップロード"
|
upload: "アップロード"
|
||||||
fromDrive: "ドライブから"
|
fromDrive: "ドライブから"
|
||||||
fromUrl: "URLから"
|
fromUrl: "URLから"
|
||||||
|
uploadFromUrl: "URLアップロード"
|
||||||
|
uploadFromUrlDescription: "アップロードしたいファイルのURL"
|
||||||
|
uploadFromUrlRequested: "アップロードをリクエストしました"
|
||||||
|
uploadFromUrlMayTakeTime: "アップロードが完了するまで時間がかかる場合があります。"
|
||||||
explore: "みつける"
|
explore: "みつける"
|
||||||
games: "Misskey Games"
|
games: "Misskey Games"
|
||||||
messageRead: "既読"
|
messageRead: "既読"
|
||||||
recentUsedEmojis: "最近使用した絵文字"
|
|
||||||
noMoreHistory: "これより過去の履歴はありません"
|
noMoreHistory: "これより過去の履歴はありません"
|
||||||
startMessaging: "チャットを開始"
|
startMessaging: "チャットを開始"
|
||||||
nUsersRead: "{n}人が読みました"
|
nUsersRead: "{n}人が読みました"
|
||||||
@ -222,23 +228,38 @@ yearsOld: "{age}歳"
|
|||||||
registeredDate: "登録日"
|
registeredDate: "登録日"
|
||||||
location: "場所"
|
location: "場所"
|
||||||
theme: "テーマ"
|
theme: "テーマ"
|
||||||
|
themeForLightMode: "ライトモードで使うテーマ"
|
||||||
|
themeForDarkMode: "ダークモードで使うテーマ"
|
||||||
|
light: "ライト"
|
||||||
|
dark: "ダーク"
|
||||||
lightThemes: "明るいテーマ"
|
lightThemes: "明るいテーマ"
|
||||||
darkThemes: "暗いテーマ"
|
darkThemes: "暗いテーマ"
|
||||||
|
syncDeviceDarkMode: "デバイスのダークモードと同期する"
|
||||||
drive: "ドライブ"
|
drive: "ドライブ"
|
||||||
|
fileName: "ファイル名"
|
||||||
selectFile: "ファイルを選択"
|
selectFile: "ファイルを選択"
|
||||||
selectFiles: "ファイルを選択"
|
selectFiles: "ファイルを選択"
|
||||||
renameFolder: "フォルダー名を変更"
|
renameFile: "ファイル名を変更"
|
||||||
|
folderName: "フォルダー名"
|
||||||
createFolder: "フォルダーを作成"
|
createFolder: "フォルダーを作成"
|
||||||
|
renameFolder: "フォルダー名を変更"
|
||||||
deleteFolder: "フォルダーを削除"
|
deleteFolder: "フォルダーを削除"
|
||||||
addFile: "ファイルを追加"
|
addFile: "ファイルを追加"
|
||||||
emptyDrive: "ドライブは空です"
|
emptyDrive: "ドライブは空です"
|
||||||
emptyFolder: "フォルダーは空です"
|
emptyFolder: "フォルダーは空です"
|
||||||
|
unableToDelete: "削除できません"
|
||||||
|
inputNewFileName: "新しいファイル名を入力してください"
|
||||||
|
inputNewFolderName: "新しいフォルダ名を入力してください"
|
||||||
|
circularReferenceFolder: "移動先のフォルダーは、移動するフォルダーのサブフォルダーです。"
|
||||||
|
hasChildFilesOrFolders: "このフォルダは空でないため、削除できません。"
|
||||||
copyUrl: "URLをコピー"
|
copyUrl: "URLをコピー"
|
||||||
rename: "名前を変更"
|
rename: "名前を変更"
|
||||||
avatar: "アイコン"
|
avatar: "アイコン"
|
||||||
banner: "バナー"
|
banner: "バナー"
|
||||||
nsfw: "閲覧注意"
|
nsfw: "閲覧注意"
|
||||||
disconnectedFromServer: "サーバーから切断されました"
|
disconnectedFromServer: "サーバーから切断されました"
|
||||||
|
reload: "リロード"
|
||||||
|
doNothing: "なにもしない"
|
||||||
reloadConfirm: "リロードしますか?"
|
reloadConfirm: "リロードしますか?"
|
||||||
watch: "ウォッチ"
|
watch: "ウォッチ"
|
||||||
unwatch: "ウォッチ解除"
|
unwatch: "ウォッチ解除"
|
||||||
@ -284,6 +305,7 @@ manageAntennas: "アンテナの管理"
|
|||||||
name: "名前"
|
name: "名前"
|
||||||
antennaSource: "受信ソース"
|
antennaSource: "受信ソース"
|
||||||
antennaKeywords: "受信キーワード"
|
antennaKeywords: "受信キーワード"
|
||||||
|
antennaExcludeKeywords: "除外キーワード"
|
||||||
antennaKeywordsDescription: "スペースで区切るとAND指定になり、改行で区切るとOR指定になります"
|
antennaKeywordsDescription: "スペースで区切るとAND指定になり、改行で区切るとOR指定になります"
|
||||||
notifyAntenna: "新しいノートを通知する"
|
notifyAntenna: "新しいノートを通知する"
|
||||||
withFileAntenna: "ファイルが添付されたノートのみ"
|
withFileAntenna: "ファイルが添付されたノートのみ"
|
||||||
@ -383,13 +405,14 @@ strongPassword: "強いパスワード"
|
|||||||
passwordMatched: "一致しました"
|
passwordMatched: "一致しました"
|
||||||
passwordNotMatched: "一致していません"
|
passwordNotMatched: "一致していません"
|
||||||
signinWith: "{x}でログイン"
|
signinWith: "{x}でログイン"
|
||||||
|
signinFailed: "ログインできませんでした。ユーザー名とパスワードを確認してください。"
|
||||||
tapSecurityKey: "セキュリティーキーにタッチ"
|
tapSecurityKey: "セキュリティーキーにタッチ"
|
||||||
or: "もしくは"
|
or: "もしくは"
|
||||||
uiLanguage: "UIの表示言語"
|
uiLanguage: "UIの表示言語"
|
||||||
groupInvited: "グループに招待されました"
|
groupInvited: "グループに招待されました"
|
||||||
aboutX: "{x}について"
|
aboutX: "{x}について"
|
||||||
useOsNativeEmojis: "OSネイティブの絵文字を使用"
|
useOsNativeEmojis: "OSネイティブの絵文字を使用"
|
||||||
noGroups: "グループがありません"
|
youHaveNoGroups: "グループがありません"
|
||||||
joinOrCreateGroup: "既存のグループに招待してもらうか、新しくグループを作成してください。"
|
joinOrCreateGroup: "既存のグループに招待してもらうか、新しくグループを作成してください。"
|
||||||
noHistory: "履歴はありません"
|
noHistory: "履歴はありません"
|
||||||
disableAnimatedMfm: "動きのあるMFMを無効にする"
|
disableAnimatedMfm: "動きのあるMFMを無効にする"
|
||||||
@ -417,6 +440,59 @@ promote: "プロモート"
|
|||||||
numberOfDays: "日数"
|
numberOfDays: "日数"
|
||||||
hideThisNote: "このノートを非表示"
|
hideThisNote: "このノートを非表示"
|
||||||
showFeaturedNotesInTimeline: "タイムラインにおすすめのノートを表示する"
|
showFeaturedNotesInTimeline: "タイムラインにおすすめのノートを表示する"
|
||||||
|
objectStorage: "オブジェクトストレージ"
|
||||||
|
useObjectStorage: "オブジェクトストレージを使用"
|
||||||
|
objectStorageBaseUrl: "Base URL"
|
||||||
|
objectStorageBaseUrlDesc: "参照に使用するURL。CDNやProxyを使用している場合はそのURL、S3: 'https://<bucket>.s3.amazonaws.com'、GCS等: 'https://storage.googleapis.com/<bucket>'。"
|
||||||
|
objectStorageBucket: "Bucket"
|
||||||
|
objectStorageBucketDesc: "使用サービスのbucket名を指定してください。"
|
||||||
|
objectStoragePrefix: "Prefix"
|
||||||
|
objectStoragePrefixDesc: "このprefixのディレクトリ下に格納されます。"
|
||||||
|
objectStorageEndpoint: "Endpoint"
|
||||||
|
objectStorageEndpointDesc: "S3の場合は空、それ以外の場合は各サービスのendpointを指定してください。'<host>'または'<host>:<port>'のように指定します。"
|
||||||
|
objectStorageRegion: "Region"
|
||||||
|
objectStorageRegionDesc: "'xx-east-1'のようなregionを指定してください。使用サービスにregionの概念がない場合は、空または'us-east-1'にしてください。"
|
||||||
|
objectStorageUseSSL: "SSLを使用する"
|
||||||
|
objectStorageUseSSLDesc: "API接続にhttpsを使用しない場合はオフにしてください"
|
||||||
|
serverLogs: "サーバーログ"
|
||||||
|
deleteAll: "全て削除"
|
||||||
|
showFixedPostForm: "タイムライン上部に投稿フォームを表示する"
|
||||||
|
newNoteRecived: "新しいノートがあります"
|
||||||
|
sounds: "サウンド"
|
||||||
|
listen: "聴く"
|
||||||
|
none: "なし"
|
||||||
|
volume: "音量"
|
||||||
|
details: "詳細"
|
||||||
|
chooseEmoji: "絵文字を選択"
|
||||||
|
unableToProcess: "操作を完了できません"
|
||||||
|
recentUsed: "最近使用"
|
||||||
|
install: "インストール"
|
||||||
|
uninstall: "アンインストール"
|
||||||
|
installedApps: "インストールされたアプリ"
|
||||||
|
nothing: "ありません"
|
||||||
|
installedDate: "インストール日時"
|
||||||
|
lastUsedDate: "最終使用日時"
|
||||||
|
state: "状態"
|
||||||
|
sort: "ソート"
|
||||||
|
ascendingOrder: "昇順"
|
||||||
|
descendingOrder: "降順"
|
||||||
|
|
||||||
|
_theme:
|
||||||
|
explore: "テーマを探す"
|
||||||
|
install: "テーマのインストール"
|
||||||
|
manage: "テーマの管理"
|
||||||
|
code: "テーマコード"
|
||||||
|
installed: "{name}をインストールしました"
|
||||||
|
alreadyInstalled: "そのテーマは既にインストールされています"
|
||||||
|
invalid: "テーマの形式が間違っています"
|
||||||
|
|
||||||
|
_sfx:
|
||||||
|
note: "ノート"
|
||||||
|
noteMy: "ノート(自分)"
|
||||||
|
notification: "通知"
|
||||||
|
chat: "チャット"
|
||||||
|
chatBg: "チャット(バックグラウンド)"
|
||||||
|
antenna: "アンテナ受信"
|
||||||
|
|
||||||
_ago:
|
_ago:
|
||||||
unknown: "謎"
|
unknown: "謎"
|
||||||
@ -500,7 +576,11 @@ _permissions:
|
|||||||
|
|
||||||
_auth:
|
_auth:
|
||||||
shareAccess: "「{name}」がアカウントにアクセスすることを許可しますか?"
|
shareAccess: "「{name}」がアカウントにアクセスすることを許可しますか?"
|
||||||
|
shareAccessAsk: "アカウントへのアクセスを許可しますか?"
|
||||||
permissionAsk: "このアプリは次の権限を要求しています"
|
permissionAsk: "このアプリは次の権限を要求しています"
|
||||||
|
pleaseGoBack: "アプリケーションに戻ってやっていってください"
|
||||||
|
callback: "アプリケーションに戻っています"
|
||||||
|
denied: "アクセスを拒否しました"
|
||||||
|
|
||||||
_antennaSources:
|
_antennaSources:
|
||||||
all: "全てのノート"
|
all: "全てのノート"
|
||||||
@ -615,15 +695,15 @@ _charts:
|
|||||||
_instanceCharts:
|
_instanceCharts:
|
||||||
requests: "リクエスト"
|
requests: "リクエスト"
|
||||||
users: "ユーザーの増減"
|
users: "ユーザーの増減"
|
||||||
usersTotal: "ユーザーの積算"
|
usersTotal: "ユーザーの累積"
|
||||||
notes: "ノートの増減"
|
notes: "ノートの増減"
|
||||||
notesTotal: "ノートの積算"
|
notesTotal: "ノートの累積"
|
||||||
ff: "フォロー/フォロワーの増減"
|
ff: "フォロー/フォロワーの増減"
|
||||||
ffTotal: "フォロー/フォロワーの積算"
|
ffTotal: "フォロー/フォロワーの累積"
|
||||||
cacheSize: "キャッシュサイズの増減"
|
cacheSize: "キャッシュサイズの増減"
|
||||||
cacheSizeTotal: "キャッシュサイズの積算"
|
cacheSizeTotal: "キャッシュサイズの累積"
|
||||||
files: "ファイル数の増減"
|
files: "ファイル数の増減"
|
||||||
filesTotal: "ファイル数の積算"
|
filesTotal: "ファイル数の累積"
|
||||||
|
|
||||||
_timelines:
|
_timelines:
|
||||||
home: "ホーム"
|
home: "ホーム"
|
||||||
@ -635,45 +715,39 @@ _pages:
|
|||||||
newPage: "ページの作成"
|
newPage: "ページの作成"
|
||||||
editPage: "ページの編集"
|
editPage: "ページの編集"
|
||||||
readPage: "ソースを表示中"
|
readPage: "ソースを表示中"
|
||||||
page-created: "ページを作成しました"
|
created: "ページを作成しました"
|
||||||
page-updated: "ページを更新しました"
|
updated: "ページを更新しました"
|
||||||
name-already-exists: "指定されたページURLは既に存在しています"
|
deleted: "ページを削除しました"
|
||||||
title-invalid-name: "不正なページURLです"
|
nameAlreadyExists: "指定されたページURLは既に存在しています"
|
||||||
text-invalid-name: "空白でないか確認してください"
|
invalidNameTitle: "不正なページURLです"
|
||||||
|
invalidNameText: "空白でないか確認してください"
|
||||||
editThisPage: "このページを編集"
|
editThisPage: "このページを編集"
|
||||||
viewSource: "ソースを表示"
|
viewSource: "ソースを表示"
|
||||||
viewPage: "ページを見る"
|
viewPage: "ページを見る"
|
||||||
like: "いいね"
|
like: "いいね"
|
||||||
unlike: "いいね解除"
|
unlike: "いいね解除"
|
||||||
liked-pages: "いいねしたページ"
|
my: "自分のページ"
|
||||||
my-pages: "自分のページ"
|
liked: "いいねしたページ"
|
||||||
inspector: "インスペクター"
|
inspector: "インスペクター"
|
||||||
content: "ページブロック"
|
content: "ページブロック"
|
||||||
variables: "変数"
|
variables: "変数"
|
||||||
variables-info: "変数を使うことで動的なページを作成できます。テキスト内で <b>{ 変数名 }</b> と書くとそこに変数の値を埋め込めます。例えば <b>Hello { thing } world!</b> というテキストで、変数(thing)の値が <b>ai</b> だった場合、テキストは <b>Hello ai world!</b> になります。"
|
|
||||||
variables-info2: "変数の評価(値を算出すること)は上から下に行われるので、ある変数の中で自分より下の変数を参照することはできません。例えば上から <b>A、B、C</b> と3つの変数を定義したとき、<b>C</b>の中で<b>A</b>や<b>B</b>を参照することはできますが、<b>A</b>の中で<b>B</b>や<b>C</b>を参照することはできません。"
|
|
||||||
variables-info3: "ユーザーからの入力を受け取るには、ページに「ユーザー入力」ブロックを設置し、「変数名」に入力を格納したい変数名を設定します(変数は自動で作成されます)。その変数を使ってユーザー入力に応じた動作を行えます。"
|
|
||||||
variables-info4: "関数を使うと、値の算出処理を再利用可能な形にまとめることができます。関数を作るには、「関数」タイプの変数を作成します。関数にはスロット(引数)を設定することができ、スロットの値は関数内で変数として利用可能です。また、AiScript標準で関数を引数に取る関数(高階関数と呼ばれます)も存在します。関数は予め定義しておくほかに、このような高階関数のスロットに即席でセットすることもできます。"
|
|
||||||
more-details: "詳しい説明"
|
|
||||||
title: "タイトル"
|
title: "タイトル"
|
||||||
url: "ページURL"
|
url: "ページURL"
|
||||||
summary: "ページの要約"
|
summary: "ページの要約"
|
||||||
alignCenter: "中央寄せ"
|
alignCenter: "中央寄せ"
|
||||||
hide-title-when-pinned: "ピン留めされているときにタイトルを非表示"
|
hideTitleWhenPinned: "ピン留めされているときにタイトルを非表示"
|
||||||
font: "フォント"
|
font: "フォント"
|
||||||
fontSerif: "セリフ"
|
fontSerif: "セリフ"
|
||||||
fontSansSerif: "サンセリフ"
|
fontSansSerif: "サンセリフ"
|
||||||
set-eye-catching-image: "アイキャッチ画像を設定"
|
eyeCatchingImageSet: "アイキャッチ画像を設定"
|
||||||
remove-eye-catching-image: "アイキャッチ画像を削除"
|
eyeCatchingImageRemove: "アイキャッチ画像を削除"
|
||||||
chooseBlock: "ブロックを追加"
|
chooseBlock: "ブロックを追加"
|
||||||
selectType: "種類を選択"
|
selectType: "種類を選択"
|
||||||
enterVariableName: "変数名を決めてください"
|
enterVariableName: "変数名を決めてください"
|
||||||
the-variable-name-is-already-used: "その変数名は既に使われています"
|
variableNameIsAlreadyUsed: "その変数名は既に使われています"
|
||||||
content-blocks: "コンテンツ"
|
contentBlocks: "コンテンツ"
|
||||||
input-blocks: "入力"
|
inputBlocks: "入力"
|
||||||
special-blocks: "特殊"
|
specialBlocks: "特殊"
|
||||||
post-from-post-form: "この内容を投稿"
|
|
||||||
posted-from-post-form: "投稿しました"
|
|
||||||
blocks:
|
blocks:
|
||||||
text: "テキスト"
|
text: "テキスト"
|
||||||
textarea: "テキストエリア"
|
textarea: "テキストエリア"
|
||||||
|
@ -62,7 +62,6 @@ clickToShow: "押してみ、見せたるわ"
|
|||||||
sensitive: "見たらあかんで"
|
sensitive: "見たらあかんで"
|
||||||
add: "増やす"
|
add: "増やす"
|
||||||
reaction: "リアクション"
|
reaction: "リアクション"
|
||||||
renameFile: "ファイル名をいらう"
|
|
||||||
attachCancel: "くっつけるのやめよか"
|
attachCancel: "くっつけるのやめよか"
|
||||||
markAsSensitive: "ちょっと見せられへんわ"
|
markAsSensitive: "ちょっと見せられへんわ"
|
||||||
unmarkAsSensitive: "別にええんじゃね?"
|
unmarkAsSensitive: "別にええんじゃね?"
|
||||||
@ -102,6 +101,7 @@ all: "みな"
|
|||||||
retypedNotMatch: "そやないねん。"
|
retypedNotMatch: "そやないねん。"
|
||||||
remove: "ほかす"
|
remove: "ほかす"
|
||||||
noMoreHistory: "これより過去の履歴はあらへんで"
|
noMoreHistory: "これより過去の履歴はあらへんで"
|
||||||
|
renameFile: "ファイル名をいらう"
|
||||||
nsfw: "見たらあかんで"
|
nsfw: "見たらあかんで"
|
||||||
userList: "リスト"
|
userList: "リスト"
|
||||||
about: "情報"
|
about: "情報"
|
||||||
@ -109,6 +109,8 @@ aboutMisskey: "Misskeyってなんや?"
|
|||||||
notFoundDescription: "指定されたURLに該当するページはあらへんやった。"
|
notFoundDescription: "指定されたURLに該当するページはあらへんやった。"
|
||||||
close: "さいなら"
|
close: "さいなら"
|
||||||
joinedGroups: "参加しとるグループ"
|
joinedGroups: "参加しとるグループ"
|
||||||
|
_sfx:
|
||||||
|
notification: "通知"
|
||||||
_ago:
|
_ago:
|
||||||
unknown: "謎"
|
unknown: "謎"
|
||||||
future: "未来"
|
future: "未来"
|
||||||
|
@ -23,9 +23,43 @@ login: "ಪ್ರವೇಶ"
|
|||||||
loggingIn: "ಪ್ರವೇಶಿಸುತ್ತಾ..."
|
loggingIn: "ಪ್ರವೇಶಿಸುತ್ತಾ..."
|
||||||
logout: "ಆಚೆಗೆ"
|
logout: "ಆಚೆಗೆ"
|
||||||
signup: "ನೋಂದಣಿ"
|
signup: "ನೋಂದಣಿ"
|
||||||
|
uploading: "ಅಪ್ಲೋಡಾಗುತ್ತಿದೆ"
|
||||||
|
save: "ಉಳಿಸಿ"
|
||||||
|
users: "ಬಳಕೆದಾರ"
|
||||||
|
addUser: "ಬಳಕೆದಾರರನ್ನು ಸೇರಿಸಿ"
|
||||||
|
favorite: "ಮೆಚ್ಚಿನ"
|
||||||
|
favorites: "ಮೆಚ್ಚಿನವುಗಳು"
|
||||||
|
unfavorite: "ಮೆಚ್ಚುಗೆ ಅಳಿಸು"
|
||||||
|
pin: "ಪ್ರೊಫ಼ೈಲಿಗೆ ಅಂಟಿಸು"
|
||||||
|
unpin: "ಪ್ರೊಫ಼ೈಲಿಂದ ಅಂಟುತೆಗೆ"
|
||||||
|
copyContent: "ವಿಷಯವನ್ನು ನಕಲಿಸು"
|
||||||
|
copyLink: "ಲಿಂಕನ್ನು ನಕಲಿಸು"
|
||||||
|
delete: "ಅಳಿಸು"
|
||||||
|
addToList: "ಪಟ್ಟಿಗೆ ಸೇರಿಸು"
|
||||||
|
sendMessage: "ಸಂದೇಶ ಕಳುಹಿಸು"
|
||||||
|
copyUsername: "ಬಳಕೆಹೆಸರು ನಕಲಿಸು"
|
||||||
|
reply: "ಉತ್ತರಿಸು"
|
||||||
|
loadMore: "ಇನ್ನಷ್ಟು ನೋಡು"
|
||||||
|
youGotNewFollower: "ಹಿಂಬಾಲಿಸಿದರು"
|
||||||
|
receiveFollowRequest: "ಹಿಂಬಾಲನೆ ವಿನಂತಿ ಬಂದಿದೆ"
|
||||||
|
followRequestAccepted: "ಹಿಂಬಾಲನೆ ವಿನಂತಿ ಸ್ವೀಕರಿಸಲಾಯಿತು"
|
||||||
|
mentions: "ಹೆಸರಿಸಿದ"
|
||||||
|
directNotes: "ನೇರ ಟಿಪ್ಪಣಿಗಳು"
|
||||||
|
importAndExport: "ಆಮದು/ರಫ್ತು"
|
||||||
|
import: "ಆಮದು"
|
||||||
|
export: "ರಫ್ತು"
|
||||||
|
files: "ಕಡತಗಳು"
|
||||||
|
download: "ಜಾಲದಿಂದಿಳಿಸು"
|
||||||
|
driveFileDeleteConfirm: "\"{name}\" ಕಡತವನ್ನು ಅಳಿಸಲು ನೀವು ಬಯಸುವಿರಾ? ಈ ನೋಡಿರಿ ಲಗತ್ತಿಸಲಾದ ಟಿಪ್ಪಣಿ ಸಹ ಕಣ್ಮರೆಯಾಗುತ್ತದೆ."
|
||||||
|
unfollowConfirm: "{name}ಅನ್ನು ಹಿಂಬಾಲಿಸದಿರುವುದೇ?"
|
||||||
instances: "ನಿದರ್ಶನ"
|
instances: "ನಿದರ್ಶನ"
|
||||||
|
remove: "ಅಳಿಸು"
|
||||||
|
_sfx:
|
||||||
|
notification: "ಅಧಿಸೂಚನೆಗಳು"
|
||||||
_widgets:
|
_widgets:
|
||||||
notifications: "ಅಧಿಸೂಚನೆಗಳು"
|
notifications: "ಅಧಿಸೂಚನೆಗಳು"
|
||||||
timeline: "ಸಮಯಸಾಲು"
|
timeline: "ಸಮಯಸಾಲು"
|
||||||
|
_cw:
|
||||||
|
show: "ಇನ್ನಷ್ಟು ನೋಡು"
|
||||||
_profile:
|
_profile:
|
||||||
username: "ಬಳಕೆಹೆಸರು"
|
username: "ಬಳಕೆಹೆಸರು"
|
||||||
|
@ -35,6 +35,8 @@ unpin: "프로필에서 고정 해제"
|
|||||||
copyContent: "내용 복사"
|
copyContent: "내용 복사"
|
||||||
copyLink: "링크 복사"
|
copyLink: "링크 복사"
|
||||||
delete: "삭제"
|
delete: "삭제"
|
||||||
|
deleteAndEdit: "삭제 후 편집"
|
||||||
|
deleteAndEditConfirm: "이 노트를 삭제한 뒤 다시 편집하시겠습니까? 이 노트에 대한 리액션, 리노트, 답글 또한 모두 삭제됩니다."
|
||||||
addToList: "리스트에 추가"
|
addToList: "리스트에 추가"
|
||||||
sendMessage: "메시지 보내기"
|
sendMessage: "메시지 보내기"
|
||||||
copyUsername: "유저명 복사"
|
copyUsername: "유저명 복사"
|
||||||
@ -84,9 +86,8 @@ clickToShow: "클릭하여 보기"
|
|||||||
sensitive: "열람주의"
|
sensitive: "열람주의"
|
||||||
add: "추가"
|
add: "추가"
|
||||||
reaction: "리액션"
|
reaction: "리액션"
|
||||||
reactionSettingDescription: "리액션 선택창에 표시할 리액션을 줄바꿈으로 구분해 설정합니다."
|
reactionSettingDescription: "리액션 선택 상자에 표시할 리액션을 설정합니다."
|
||||||
rememberNoteVisibility: "공개 범위를 기억하기"
|
rememberNoteVisibility: "공개 범위를 기억하기"
|
||||||
renameFile: "파일 이름 변경"
|
|
||||||
attachCancel: "첨부 취소"
|
attachCancel: "첨부 취소"
|
||||||
markAsSensitive: "열람주의로 설정"
|
markAsSensitive: "열람주의로 설정"
|
||||||
unmarkAsSensitive: "열람주의 해제"
|
unmarkAsSensitive: "열람주의 해제"
|
||||||
@ -116,6 +117,7 @@ loginFailed: "로그인에 실패했습니다"
|
|||||||
showOnRemote: "리모트에서 보기"
|
showOnRemote: "리모트에서 보기"
|
||||||
general: "일반"
|
general: "일반"
|
||||||
wallpaper: "배경"
|
wallpaper: "배경"
|
||||||
|
setWallpaper: "배경화면 설정"
|
||||||
removeWallpaper: "배경 제거"
|
removeWallpaper: "배경 제거"
|
||||||
searchWith: "검색: {q}"
|
searchWith: "검색: {q}"
|
||||||
youHaveNoLists: "리스트가 없습니다"
|
youHaveNoLists: "리스트가 없습니다"
|
||||||
@ -168,6 +170,7 @@ intro: "Misskey의 설치가 완료되었습니다! 관리자 계정을 생성
|
|||||||
done: "완료"
|
done: "완료"
|
||||||
processing: "처리중"
|
processing: "처리중"
|
||||||
preview: "미리보기"
|
preview: "미리보기"
|
||||||
|
default: "기본값"
|
||||||
noCustomEmojis: "이모지가 없습니다"
|
noCustomEmojis: "이모지가 없습니다"
|
||||||
customEmojisOfRemote: "다른 인스턴스들의 이모지"
|
customEmojisOfRemote: "다른 인스턴스들의 이모지"
|
||||||
noJobs: "작업이 없습니다"
|
noJobs: "작업이 없습니다"
|
||||||
@ -203,10 +206,13 @@ messaging: "대화"
|
|||||||
upload: "업로드"
|
upload: "업로드"
|
||||||
fromDrive: "드라이브에서"
|
fromDrive: "드라이브에서"
|
||||||
fromUrl: "URL로부터"
|
fromUrl: "URL로부터"
|
||||||
|
uploadFromUrl: "URL 업로드"
|
||||||
|
uploadFromUrlDescription: "업로드하려는 파일의 URL"
|
||||||
|
uploadFromUrlRequested: "업로드를 요청했습니다"
|
||||||
|
uploadFromUrlMayTakeTime: "업로드가 완료될 때까지 시간이 소요될 수 있습니다."
|
||||||
explore: "발견하기"
|
explore: "발견하기"
|
||||||
games: "Misskey Games"
|
games: "Misskey Games"
|
||||||
messageRead: "읽음"
|
messageRead: "읽음"
|
||||||
recentUsedEmojis: "최근에 사용한 이모지"
|
|
||||||
noMoreHistory: "이것보다 과거의 기록이 없습니다"
|
noMoreHistory: "이것보다 과거의 기록이 없습니다"
|
||||||
startMessaging: "대화 시작하기"
|
startMessaging: "대화 시작하기"
|
||||||
nUsersRead: "{n}명이 읽음"
|
nUsersRead: "{n}명이 읽음"
|
||||||
@ -222,23 +228,38 @@ yearsOld: "{age}세"
|
|||||||
registeredDate: "등록일"
|
registeredDate: "등록일"
|
||||||
location: "장소"
|
location: "장소"
|
||||||
theme: "테마"
|
theme: "테마"
|
||||||
|
themeForLightMode: "라이트 모드에서 사용할 테마"
|
||||||
|
themeForDarkMode: "다크 모드에서 사용할 테마"
|
||||||
|
light: "라이트"
|
||||||
|
dark: "다크"
|
||||||
lightThemes: "밝은 테마"
|
lightThemes: "밝은 테마"
|
||||||
darkThemes: "어두운 테마"
|
darkThemes: "어두운 테마"
|
||||||
|
syncDeviceDarkMode: "디바이스의 다크 모드 설정과 동기화"
|
||||||
drive: "드라이브"
|
drive: "드라이브"
|
||||||
|
fileName: "파일명"
|
||||||
selectFile: "파일 선택"
|
selectFile: "파일 선택"
|
||||||
selectFiles: "파일 선택"
|
selectFiles: "파일 선택"
|
||||||
renameFolder: "폴더 이름 바꾸기"
|
renameFile: "파일 이름 변경"
|
||||||
|
folderName: "폴더명"
|
||||||
createFolder: "폴더 만들기"
|
createFolder: "폴더 만들기"
|
||||||
|
renameFolder: "폴더 이름 바꾸기"
|
||||||
deleteFolder: "폴더 삭제"
|
deleteFolder: "폴더 삭제"
|
||||||
addFile: "파일 추가"
|
addFile: "파일 추가"
|
||||||
emptyDrive: "드라이브가 비어 있습니다"
|
emptyDrive: "드라이브가 비어 있습니다"
|
||||||
emptyFolder: "폴더가 비어 있습니다"
|
emptyFolder: "폴더가 비어 있습니다"
|
||||||
|
unableToDelete: "삭제할 수 없습니다"
|
||||||
|
inputNewFileName: "바꿀 파일명을 입력해 주세요"
|
||||||
|
inputNewFolderName: "바꿀 폴더명을 입력해 주세요"
|
||||||
|
circularReferenceFolder: "지정한 폴더가 이동할 폴더의 하위 폴더입니다."
|
||||||
|
hasChildFilesOrFolders: "이 폴더는 비어있지 않기 때문에 삭제할 수 없습니다."
|
||||||
copyUrl: "URL 복사"
|
copyUrl: "URL 복사"
|
||||||
rename: "이름 변경"
|
rename: "이름 변경"
|
||||||
avatar: "아바타"
|
avatar: "아바타"
|
||||||
banner: "배너"
|
banner: "배너"
|
||||||
nsfw: "열람주의"
|
nsfw: "열람주의"
|
||||||
disconnectedFromServer: "서버와의 연결이 끊어졌습니다"
|
disconnectedFromServer: "서버와의 연결이 끊어졌습니다"
|
||||||
|
reload: "새로고침"
|
||||||
|
doNothing: "무시하기"
|
||||||
reloadConfirm: "새로고침 하시겠습니까?"
|
reloadConfirm: "새로고침 하시겠습니까?"
|
||||||
watch: "지켜보기"
|
watch: "지켜보기"
|
||||||
unwatch: "지켜보기 해제"
|
unwatch: "지켜보기 해제"
|
||||||
@ -284,6 +305,7 @@ manageAntennas: "안테나 관리"
|
|||||||
name: "이름"
|
name: "이름"
|
||||||
antennaSource: "받을 소스"
|
antennaSource: "받을 소스"
|
||||||
antennaKeywords: "받을 키워드"
|
antennaKeywords: "받을 키워드"
|
||||||
|
antennaExcludeKeywords: "제외할 키워드"
|
||||||
antennaKeywordsDescription: "공백으로 구분하는 경우 AND, 줄바꿈으로 구분하는 경우 OR로 지정됩니다"
|
antennaKeywordsDescription: "공백으로 구분하는 경우 AND, 줄바꿈으로 구분하는 경우 OR로 지정됩니다"
|
||||||
notifyAntenna: "새로운 노트를 알림"
|
notifyAntenna: "새로운 노트를 알림"
|
||||||
withFileAntenna: "파일이 첨부된 노트만"
|
withFileAntenna: "파일이 첨부된 노트만"
|
||||||
@ -383,13 +405,14 @@ strongPassword: "강한 비밀번호"
|
|||||||
passwordMatched: "일치합니다"
|
passwordMatched: "일치합니다"
|
||||||
passwordNotMatched: "일치하지 않습니다"
|
passwordNotMatched: "일치하지 않습니다"
|
||||||
signinWith: "{x}로 로그인"
|
signinWith: "{x}로 로그인"
|
||||||
|
signinFailed: "로그인할 수 없습니다. 사용자명과 비밀번호를 확인하여 주십시오."
|
||||||
tapSecurityKey: "보안 키를 터치"
|
tapSecurityKey: "보안 키를 터치"
|
||||||
or: "혹은"
|
or: "혹은"
|
||||||
uiLanguage: "UI 표시 언어"
|
uiLanguage: "UI 표시 언어"
|
||||||
groupInvited: "그룹에 초대되었습니다"
|
groupInvited: "그룹에 초대되었습니다"
|
||||||
aboutX: "{x}에 대하여"
|
aboutX: "{x}에 대하여"
|
||||||
useOsNativeEmojis: "OS 기본 이모지를 사용"
|
useOsNativeEmojis: "OS 기본 이모지를 사용"
|
||||||
noGroups: "그룹이 없습니다"
|
youHaveNoGroups: "그룹이 없습니다"
|
||||||
joinOrCreateGroup: "다른 그룹의 초대를 받거나, 직접 새 그룹을 만들어 보세요."
|
joinOrCreateGroup: "다른 그룹의 초대를 받거나, 직접 새 그룹을 만들어 보세요."
|
||||||
noHistory: "기록이 없습니다"
|
noHistory: "기록이 없습니다"
|
||||||
disableAnimatedMfm: "움직임이 있는 MFM을 비활성화"
|
disableAnimatedMfm: "움직임이 있는 MFM을 비활성화"
|
||||||
@ -412,6 +435,62 @@ dayOverDayChanges: "어제보다"
|
|||||||
accessibility: "접근성"
|
accessibility: "접근성"
|
||||||
clinetSettings: "클라이언트 설정"
|
clinetSettings: "클라이언트 설정"
|
||||||
accountSettings: "계정 설정"
|
accountSettings: "계정 설정"
|
||||||
|
promotion: "프로모션"
|
||||||
|
promote: "프로모션하기"
|
||||||
|
numberOfDays: "며칠동안"
|
||||||
|
hideThisNote: "이 노트를 숨기기"
|
||||||
|
showFeaturedNotesInTimeline: "타임라인에 추천 노트를 표시"
|
||||||
|
objectStorage: "오브젝트 스토리지"
|
||||||
|
useObjectStorage: "오브젝트 스토리지를 사용"
|
||||||
|
objectStorageBaseUrl: "Base URL"
|
||||||
|
objectStorageBaseUrlDesc: "오브젝트 (미디어) 참조 URL 을 만들 때 사용되는 URL입니다. CDN 또는 프록시를 사용하는 경우 그 URL을 지정하고, 그 외의 경우 사용할 서비스의 가이드에 따라 공개적으로 액세스 할 수 있는 주소를 지정해 주세요. 예를 들어, AWS S3의 경우 'https://<bucket>.s3.amazonaws.com', GCS등의 경우 'https://storage.googleapis.com/<bucket>' 와 같이 지정합니다."
|
||||||
|
objectStorageBucket: "Bucket"
|
||||||
|
objectStorageBucketDesc: "사용 서비스의 bucket명을 지정해주세요."
|
||||||
|
objectStoragePrefix: "Prefix"
|
||||||
|
objectStoragePrefixDesc: "이 Prefix 의 디렉토리 아래에 파일이 저장됩니다."
|
||||||
|
objectStorageEndpoint: "Endpoint"
|
||||||
|
objectStorageEndpointDesc: "AWS S3의 경우 공란, 다른 서비스의 경우 각 서비스의 가이드에 맞게 endpoint를 설정해주세요. '<host>' 혹은 '<host>:<port>' 와 같이 지정합니다."
|
||||||
|
objectStorageRegion: "Region"
|
||||||
|
objectStorageRegionDesc: "'xx-east-1'와 같이 region을 지정해주세요. 사용하는 서비스에 region 개념이 없는 경우, 비워 두거나 'us-east-1'으로 설정해 주세요."
|
||||||
|
objectStorageUseSSL: "SSL 사용"
|
||||||
|
objectStorageUseSSLDesc: "API 호출시 HTTPS 를 사용하지 않는 경우 OFF 로 설정해 주세요"
|
||||||
|
serverLogs: "서버 로그"
|
||||||
|
deleteAll: "모두 삭제"
|
||||||
|
showFixedPostForm: "타임라인 상단에 글 작성란을 표시"
|
||||||
|
newNoteRecived: "새 노트가 있습니다"
|
||||||
|
sounds: "소리"
|
||||||
|
listen: "듣기"
|
||||||
|
none: "없음"
|
||||||
|
volume: "음량"
|
||||||
|
details: "자세히"
|
||||||
|
chooseEmoji: "이모지 선택"
|
||||||
|
unableToProcess: "작업을 완료할 수 없습니다"
|
||||||
|
recentUsed: "최근 사용"
|
||||||
|
install: "설치"
|
||||||
|
uninstall: "삭제"
|
||||||
|
installedApps: "인증된 애플리케이션"
|
||||||
|
nothing: "아무것도 없습니다"
|
||||||
|
installedDate: "승인한 날짜"
|
||||||
|
lastUsedDate: "마지막 사용"
|
||||||
|
state: "상태"
|
||||||
|
sort: "정렬"
|
||||||
|
ascendingOrder: "오름차순"
|
||||||
|
descendingOrder: "내림차순"
|
||||||
|
_theme:
|
||||||
|
explore: "테마 찾아보기"
|
||||||
|
install: "테마 설치"
|
||||||
|
manage: "테마 관리"
|
||||||
|
code: "테마 코드"
|
||||||
|
installed: "{name} 테마가 설치되었습니다"
|
||||||
|
alreadyInstalled: "이미 설치된 테마입니다"
|
||||||
|
invalid: "테마 형식이 올바르지 않습니다"
|
||||||
|
_sfx:
|
||||||
|
note: "새 노트"
|
||||||
|
noteMy: "내 노트"
|
||||||
|
notification: "알림"
|
||||||
|
chat: "대화"
|
||||||
|
chatBg: "대화 (백그라운드)"
|
||||||
|
antenna: "안테나 수신"
|
||||||
_ago:
|
_ago:
|
||||||
unknown: "알 수 없음"
|
unknown: "알 수 없음"
|
||||||
future: "미래"
|
future: "미래"
|
||||||
@ -489,7 +568,11 @@ _permissions:
|
|||||||
"write:user-groups": "유저 그룹을 만들거나, 초대하거나, 이름을 변경하거나, 양도하거나, 삭제합니다"
|
"write:user-groups": "유저 그룹을 만들거나, 초대하거나, 이름을 변경하거나, 양도하거나, 삭제합니다"
|
||||||
_auth:
|
_auth:
|
||||||
shareAccess: "\"{name}\" 이 계정에 접근하는 것을 허용하시겠습니까?"
|
shareAccess: "\"{name}\" 이 계정에 접근하는 것을 허용하시겠습니까?"
|
||||||
|
shareAccessAsk: "이 애플리케이션이 계정에 접근하는 것을 허용하시겠습니까?"
|
||||||
permissionAsk: "이 앱은 다음의 권한을 요청합니다"
|
permissionAsk: "이 앱은 다음의 권한을 요청합니다"
|
||||||
|
pleaseGoBack: "앱으로 돌아가서 시도해 주세요"
|
||||||
|
callback: "앱으로 돌아갑니다"
|
||||||
|
denied: "접근이 거부되었습니다"
|
||||||
_antennaSources:
|
_antennaSources:
|
||||||
all: "모든 노트"
|
all: "모든 노트"
|
||||||
homeTimeline: "팔로우중인 유저의 노트"
|
homeTimeline: "팔로우중인 유저의 노트"
|
||||||
@ -513,6 +596,7 @@ _widgets:
|
|||||||
clock: "시계"
|
clock: "시계"
|
||||||
rss: "RSS 리더"
|
rss: "RSS 리더"
|
||||||
activity: "활동"
|
activity: "활동"
|
||||||
|
photos: "사진"
|
||||||
_cw:
|
_cw:
|
||||||
hide: "숨기기"
|
hide: "숨기기"
|
||||||
show: "더 보기"
|
show: "더 보기"
|
||||||
@ -577,26 +661,26 @@ _exportOrImport:
|
|||||||
userLists: "리스트"
|
userLists: "리스트"
|
||||||
_charts:
|
_charts:
|
||||||
federationInstancesIncDec: "연합 인스턴스 수 증감"
|
federationInstancesIncDec: "연합 인스턴스 수 증감"
|
||||||
federationInstancesTotal: "총 연합 인스턴스 수"
|
federationInstancesTotal: "연합 인스턴스 수 합계"
|
||||||
usersIncDec: "유저 수 증감"
|
usersIncDec: "유저 수 증감"
|
||||||
usersTotal: "유저 수 합계"
|
usersTotal: "유저 수 합계"
|
||||||
activeUsers: "활성 유저 수"
|
activeUsers: "활성 유저 수"
|
||||||
notesIncDec: "노트 수 증감"
|
notesIncDec: "노트 수 증감"
|
||||||
localNotesIncDec: "로컬 노트 수 증감"
|
localNotesIncDec: "로컬 노트 수 증감"
|
||||||
remoteNotesIncDec: "리모트 노트 수 증감"
|
remoteNotesIncDec: "리모트 노트 수 증감"
|
||||||
notesTotal: "총 노트 수"
|
notesTotal: "노트 수 합계"
|
||||||
filesIncDec: "파일 수 증감"
|
filesIncDec: "파일 수 증감"
|
||||||
filesTotal: "총 파일 수"
|
filesTotal: "파일 수 합계"
|
||||||
storageUsageIncDec: "스토리지 사용량 증감"
|
storageUsageIncDec: "스토리지 사용량 증감"
|
||||||
storageUsageTotal: "총 스토리지 사용량"
|
storageUsageTotal: "스토리지 사용량 합계"
|
||||||
_instanceCharts:
|
_instanceCharts:
|
||||||
requests: "요청"
|
requests: "요청"
|
||||||
users: "유저 수 증감"
|
users: "유저 수 증감"
|
||||||
usersTotal: "누적 유저 수"
|
usersTotal: "누적 유저 수"
|
||||||
notes: "노트 수 증감"
|
notes: "노트 수 증감"
|
||||||
notesTotal: "총 노트 수"
|
notesTotal: "누적 노트 수"
|
||||||
ff: "팔로잉/팔로워 증감"
|
ff: "팔로잉/팔로워 증감"
|
||||||
ffTotal: "팔로잉/팔로워 누적"
|
ffTotal: "누적 팔로잉/팔로워 수"
|
||||||
cacheSize: "캐시 용량 증감"
|
cacheSize: "캐시 용량 증감"
|
||||||
cacheSizeTotal: "누적 캐시 용량"
|
cacheSizeTotal: "누적 캐시 용량"
|
||||||
files: "파일 수 증감"
|
files: "파일 수 증감"
|
||||||
@ -610,45 +694,39 @@ _pages:
|
|||||||
newPage: "페이지 만들기"
|
newPage: "페이지 만들기"
|
||||||
editPage: "페이지 수정"
|
editPage: "페이지 수정"
|
||||||
readPage: "소스 표시 중"
|
readPage: "소스 표시 중"
|
||||||
page-created: "페이지를 만들었습니다"
|
created: "페이지를 만들었습니다"
|
||||||
page-updated: "페이지를 수정했습니다"
|
updated: "페이지를 수정했습니다"
|
||||||
name-already-exists: "지정한 페이지 URL이 이미 존재합니다"
|
deleted: "페이지가 삭제되었습니다"
|
||||||
title-invalid-name: "유효하지 않은 페이지 URL입니다"
|
nameAlreadyExists: "지정한 페이지 URL이 이미 존재합니다"
|
||||||
text-invalid-name: "비어있지 않은지 확인해주세요"
|
invalidNameTitle: "유효하지 않은 페이지 URL입니다"
|
||||||
|
invalidNameText: "비어있지 않은지 확인해주세요"
|
||||||
editThisPage: "이 페이지를 편집"
|
editThisPage: "이 페이지를 편집"
|
||||||
viewSource: "소스 보기"
|
viewSource: "소스 보기"
|
||||||
viewPage: "페이지 보기"
|
viewPage: "페이지 보기"
|
||||||
like: "좋아요"
|
like: "좋아요"
|
||||||
unlike: "좋아요 해제"
|
unlike: "좋아요 해제"
|
||||||
liked-pages: "좋아요한 페이지"
|
my: "내 페이지"
|
||||||
my-pages: "내 페이지"
|
liked: "좋아요한 페이지"
|
||||||
inspector: "인스펙터"
|
inspector: "인스펙터"
|
||||||
content: "페이지 블록"
|
content: "페이지 블록"
|
||||||
variables: "변수"
|
variables: "변수"
|
||||||
variables-info: "변수를 사용하면 동적인 페이지를 만들 수 있습니다. 텍스트에 <b>{ 변수명 }</b>을 적으면 그 위치에 변수의 값을 집어넣습니다. 예를 들어, <b>Hello { thing } world!</b> 라는 텍스트가 있을 때, 변수(thing)의 값이 <b>ai</b>인 경우 텍스트는 <b>Hello ai world!</b>가 됩니다."
|
|
||||||
variables-info2: "변수의 평가(값을 계산해내는 것)는 위에서부터 아래로 진행되므로 어떤 변수의 내부에서 자신보다 아래에 있는 변수를 참조할 수는 없습니다. 예를 들자면 위에서부터 <b>A, B, C</b>의 3개의 변수가 정의되어 있을 때, <b>C</b>의 내부에 <b>A</b>나 <b>B</b>를 참조할 수는 있지만, <b>A</b>의 내부에서 <b>B</b>나 <b>C</b>를 참조할 수는 없습니다."
|
|
||||||
variables-info3: "사용자로부터 입력을 받으려면, 페이지에 \"사용자 입력\" 블록을 삽입하고 \"변수명\" 에 입력받은 값을 저장하고 싶은 변수명을 설정합니다 (변수는 자동으로 생성됩니다). 그 변수를 사용하여 사용자 입력에 따라 동작할 수 있습니다."
|
|
||||||
variables-info4: "함수를 사용하면 반복되는 작업을 손쉽게 처리할 수 있습니다. 함수를 만드시려면 \"함수\" 타입의 변수를 만듭니다. 함수에서 슬롯(인수)를 받도록 설정하면, 함수를 사용할 때 슬롯에 입력된 값을 함수 안에서 변수로써 이용할 수 있게 됩니다. 또한, AiScript 표준에는 함수를 인수로 받는 함수(고차함수)도 존재합니다. 함수를 미리 정의하는 것 외에, 이와 같은 고차함수를 즉석으로 설정할 수 있습니다."
|
|
||||||
more-details: "자세한 설명"
|
|
||||||
title: "제목"
|
title: "제목"
|
||||||
url: "페이지 URL"
|
url: "페이지 URL"
|
||||||
summary: "페이지 요약"
|
summary: "페이지 요약"
|
||||||
alignCenter: "가운데 정렬"
|
alignCenter: "가운데 정렬"
|
||||||
hide-title-when-pinned: "프로필에 고정할 때 타이틀을 표시하지 않음"
|
hideTitleWhenPinned: "프로필에 고정해놓은 경우 타이틀을 표시하지 않음"
|
||||||
font: "폰트"
|
font: "폰트"
|
||||||
fontSerif: "명조체"
|
fontSerif: "명조체"
|
||||||
fontSansSerif: "고딕체"
|
fontSansSerif: "고딕체"
|
||||||
set-eye-catching-image: "아이캐치 이미지를 설정"
|
eyeCatchingImageSet: "아이캐치 이미지를 설정"
|
||||||
remove-eye-catching-image: "아이캐치 이미지 삭제"
|
eyeCatchingImageRemove: "아이캐치 이미지를 삭제"
|
||||||
chooseBlock: "블록 추가"
|
chooseBlock: "블록 추가"
|
||||||
selectType: "종류 선택"
|
selectType: "종류 선택"
|
||||||
enterVariableName: "변수명을 지정해주세요"
|
enterVariableName: "변수명을 지정해주세요"
|
||||||
the-variable-name-is-already-used: "해당 변수명은 이미 사용중입니다"
|
variableNameIsAlreadyUsed: "해당 변수명은 이미 사용중입니다"
|
||||||
content-blocks: "컨텐츠"
|
contentBlocks: "콘텐츠"
|
||||||
input-blocks: "입력"
|
inputBlocks: "입력"
|
||||||
special-blocks: "특수"
|
specialBlocks: "특수"
|
||||||
post-from-post-form: "이 내용을 올리기"
|
|
||||||
posted-from-post-form: "게시하였습니다"
|
|
||||||
blocks:
|
blocks:
|
||||||
text: "텍스트"
|
text: "텍스트"
|
||||||
textarea: "텍스트 영역"
|
textarea: "텍스트 영역"
|
||||||
|
@ -1,2 +1,36 @@
|
|||||||
---
|
---
|
||||||
_lang_: "Русский язык"
|
_lang_: "Русский язык"
|
||||||
|
search: "Поиск"
|
||||||
|
notifications: "Уведомления"
|
||||||
|
password: "Пароль"
|
||||||
|
ok: "Окей"
|
||||||
|
cancel: "Отмена"
|
||||||
|
instance: "Экземпляр"
|
||||||
|
settings: "Настройки"
|
||||||
|
profile: "Профиль"
|
||||||
|
timeline: "Лента"
|
||||||
|
login: "Войти"
|
||||||
|
logout: "Выйти"
|
||||||
|
signup: "Регистрация"
|
||||||
|
save: "Сохранить"
|
||||||
|
favorite: "Избранное"
|
||||||
|
favorites: "Избранное"
|
||||||
|
unfavorite: "Удалить из избранных"
|
||||||
|
pin: "Закрепить"
|
||||||
|
unpin: "Открепить"
|
||||||
|
copyLink: "Скопировать ссылку"
|
||||||
|
delete: "Удалить"
|
||||||
|
addToList: "Добавить в список"
|
||||||
|
reply: "Ответить"
|
||||||
|
loadMore: "Показать еще"
|
||||||
|
importAndExport: "Импорт / Экспорт"
|
||||||
|
files: "Файл"
|
||||||
|
instances: "Экземпляр"
|
||||||
|
remove: "Удалить"
|
||||||
|
_sfx:
|
||||||
|
notification: "Уведомления"
|
||||||
|
_widgets:
|
||||||
|
notifications: "Уведомления"
|
||||||
|
timeline: "Лента"
|
||||||
|
_cw:
|
||||||
|
show: "Показать еще"
|
||||||
|
@ -11,7 +11,7 @@ ok: "OK"
|
|||||||
gotIt: "我明白了"
|
gotIt: "我明白了"
|
||||||
cancel: "取消"
|
cancel: "取消"
|
||||||
enterUsername: "输入用户名"
|
enterUsername: "输入用户名"
|
||||||
renotedBy: "由 {user} 转推"
|
renotedBy: "由 {user} 转贴"
|
||||||
noNotes: "没有投稿"
|
noNotes: "没有投稿"
|
||||||
noNotifications: "无通知"
|
noNotifications: "无通知"
|
||||||
instance: "实例"
|
instance: "实例"
|
||||||
@ -35,6 +35,8 @@ unpin: "取消置顶"
|
|||||||
copyContent: "复制内容"
|
copyContent: "复制内容"
|
||||||
copyLink: "复制链接"
|
copyLink: "复制链接"
|
||||||
delete: "删除"
|
delete: "删除"
|
||||||
|
deleteAndEdit: "删除和编辑"
|
||||||
|
deleteAndEditConfirm: "要删除此帖并再次编辑吗?对此帖的所有回应,转推和回复也将被删除。"
|
||||||
addToList: "添加至列表"
|
addToList: "添加至列表"
|
||||||
sendMessage: "发送"
|
sendMessage: "发送"
|
||||||
copyUsername: "复制用户名"
|
copyUsername: "复制用户名"
|
||||||
@ -84,9 +86,8 @@ clickToShow: "点击以显示"
|
|||||||
sensitive: "阅读注意"
|
sensitive: "阅读注意"
|
||||||
add: "添加"
|
add: "添加"
|
||||||
reaction: "反应"
|
reaction: "反应"
|
||||||
reactionSettingDescription: "快速选择回应中的自定义表情符号,以换行符分隔。"
|
reactionSettingDescription: "选择您想要固定在反应选择器中的反应。"
|
||||||
rememberNoteVisibility: "记录公开范围"
|
rememberNoteVisibility: "记录公开范围"
|
||||||
renameFile: "重命名文件"
|
|
||||||
attachCancel: "删除附件"
|
attachCancel: "删除附件"
|
||||||
markAsSensitive: "阅读注意"
|
markAsSensitive: "阅读注意"
|
||||||
unmarkAsSensitive: "取消标记为敏感内容"
|
unmarkAsSensitive: "取消标记为敏感内容"
|
||||||
@ -116,6 +117,7 @@ loginFailed: "登录失败"
|
|||||||
showOnRemote: "转到所在实例显示"
|
showOnRemote: "转到所在实例显示"
|
||||||
general: "常规设置"
|
general: "常规设置"
|
||||||
wallpaper: "壁纸"
|
wallpaper: "壁纸"
|
||||||
|
setWallpaper: "设置壁纸"
|
||||||
removeWallpaper: "移除壁纸"
|
removeWallpaper: "移除壁纸"
|
||||||
searchWith: "搜索:{q}"
|
searchWith: "搜索:{q}"
|
||||||
youHaveNoLists: "列表为空"
|
youHaveNoLists: "列表为空"
|
||||||
@ -168,6 +170,7 @@ intro: "Misskey的部署结束啦!填写管理员账号吧!"
|
|||||||
done: "完成"
|
done: "完成"
|
||||||
processing: "处理中"
|
processing: "处理中"
|
||||||
preview: "预览"
|
preview: "预览"
|
||||||
|
default: "默认"
|
||||||
noCustomEmojis: "无自定义Emoji"
|
noCustomEmojis: "无自定义Emoji"
|
||||||
customEmojisOfRemote: "远程Emoji"
|
customEmojisOfRemote: "远程Emoji"
|
||||||
noJobs: "没有任务"
|
noJobs: "没有任务"
|
||||||
@ -203,10 +206,13 @@ messaging: "聊天"
|
|||||||
upload: "上传"
|
upload: "上传"
|
||||||
fromDrive: "从网盘中"
|
fromDrive: "从网盘中"
|
||||||
fromUrl: "从 URL"
|
fromUrl: "从 URL"
|
||||||
|
uploadFromUrl: "从网址上传"
|
||||||
|
uploadFromUrlDescription: "要上传的文件的URL"
|
||||||
|
uploadFromUrlRequested: "请求上传"
|
||||||
|
uploadFromUrlMayTakeTime: "上传完成可能需要一些时间。"
|
||||||
explore: "发现"
|
explore: "发现"
|
||||||
games: "Misskey游戏"
|
games: "Misskey游戏"
|
||||||
messageRead: "已读"
|
messageRead: "已读"
|
||||||
recentUsedEmojis: "最近使用的Emoji表情"
|
|
||||||
noMoreHistory: "没有更多的历史记录"
|
noMoreHistory: "没有更多的历史记录"
|
||||||
startMessaging: "开始聊天"
|
startMessaging: "开始聊天"
|
||||||
nUsersRead: "{n}人已读"
|
nUsersRead: "{n}人已读"
|
||||||
@ -222,23 +228,38 @@ yearsOld: "{age}岁"
|
|||||||
registeredDate: "注册于"
|
registeredDate: "注册于"
|
||||||
location: "位置"
|
location: "位置"
|
||||||
theme: "主题"
|
theme: "主题"
|
||||||
|
themeForLightMode: "在轻便模式下使用的主题"
|
||||||
|
themeForDarkMode: "在黑暗模式下使用的主题"
|
||||||
|
light: "浅色"
|
||||||
|
dark: "深色"
|
||||||
lightThemes: "亮色主题"
|
lightThemes: "亮色主题"
|
||||||
darkThemes: "暗色主题"
|
darkThemes: "暗色主题"
|
||||||
|
syncDeviceDarkMode: "将黑暗模式与设备设置同步"
|
||||||
drive: "网盘"
|
drive: "网盘"
|
||||||
|
fileName: "文件名称"
|
||||||
selectFile: "选择文件"
|
selectFile: "选择文件"
|
||||||
selectFiles: "选择文件"
|
selectFiles: "选择文件"
|
||||||
renameFolder: "重命名文件夹"
|
renameFile: "重命名文件"
|
||||||
|
folderName: "文件夹名称"
|
||||||
createFolder: "创建文件夹"
|
createFolder: "创建文件夹"
|
||||||
|
renameFolder: "重命名文件夹"
|
||||||
deleteFolder: "删除文件夹"
|
deleteFolder: "删除文件夹"
|
||||||
addFile: "添加文件"
|
addFile: "添加文件"
|
||||||
emptyDrive: "驱动器为空"
|
emptyDrive: "驱动器为空"
|
||||||
emptyFolder: "空文件夹"
|
emptyFolder: "空文件夹"
|
||||||
|
unableToDelete: "无法删除"
|
||||||
|
inputNewFileName: "请输入新文件名"
|
||||||
|
inputNewFolderName: "请输入新文件名"
|
||||||
|
circularReferenceFolder: "目标文件夹是您要移动的文件夹的子文件夹。"
|
||||||
|
hasChildFilesOrFolders: "此文件夹不为空,无法删除。"
|
||||||
copyUrl: "复制链接"
|
copyUrl: "复制链接"
|
||||||
rename: "重命名"
|
rename: "重命名"
|
||||||
avatar: "头像"
|
avatar: "头像"
|
||||||
banner: "Banner"
|
banner: "Banner"
|
||||||
nsfw: "阅读注意"
|
nsfw: "阅读注意"
|
||||||
disconnectedFromServer: "已从服务器断开连接"
|
disconnectedFromServer: "已从服务器断开连接"
|
||||||
|
reload: "重新加载"
|
||||||
|
doNothing: "什么都不做"
|
||||||
reloadConfirm: "确定要重新加载吗"
|
reloadConfirm: "确定要重新加载吗"
|
||||||
watch: "关注"
|
watch: "关注"
|
||||||
unwatch: "取消关注"
|
unwatch: "取消关注"
|
||||||
@ -280,11 +301,19 @@ enableRecaptcha: "启用 reCAPTCHA\n(请注意, 此功能在中国大陆不可
|
|||||||
recaptchaSiteKey: "网站密钥"
|
recaptchaSiteKey: "网站密钥"
|
||||||
recaptchaSecretKey: "reCAPTCHA 密钥"
|
recaptchaSecretKey: "reCAPTCHA 密钥"
|
||||||
antennas: "天线"
|
antennas: "天线"
|
||||||
|
manageAntennas: "天线管理"
|
||||||
name: "名称"
|
name: "名称"
|
||||||
|
antennaSource: "接收来源"
|
||||||
|
antennaKeywords: "包含关键字"
|
||||||
|
antennaExcludeKeywords: "排除关键字"
|
||||||
antennaKeywordsDescription: "使用空格分隔会产生AND规范,并且使用换行符分隔会产生OR规范"
|
antennaKeywordsDescription: "使用空格分隔会产生AND规范,并且使用换行符分隔会产生OR规范"
|
||||||
|
notifyAntenna: "通知新帖子"
|
||||||
|
withFileAntenna: "仅带有附件的帖子"
|
||||||
serviceworker: "ServiceWorker"
|
serviceworker: "ServiceWorker"
|
||||||
enableServiceworker: "启用ServiceWorker"
|
enableServiceworker: "启用ServiceWorker"
|
||||||
|
antennaUsersDescription: "指定用户名,用换行符分隔"
|
||||||
caseSensitive: "区分大小写"
|
caseSensitive: "区分大小写"
|
||||||
|
withReplies: "包括回复"
|
||||||
connectedTo: "您的账号已连到接以下社交账号"
|
connectedTo: "您的账号已连到接以下社交账号"
|
||||||
notesAndReplies: "帖子与回复"
|
notesAndReplies: "帖子与回复"
|
||||||
withFiles: "附件"
|
withFiles: "附件"
|
||||||
@ -315,8 +344,10 @@ moderator: "版主"
|
|||||||
nUsersMentioned: "{n} 被提到"
|
nUsersMentioned: "{n} 被提到"
|
||||||
securityKey: "安全密钥"
|
securityKey: "安全密钥"
|
||||||
securityKeyName: "密钥名称"
|
securityKeyName: "密钥名称"
|
||||||
|
registerSecurityKey: "注册安全密钥"
|
||||||
lastUsed: "最后使用:"
|
lastUsed: "最后使用:"
|
||||||
unregister: "删除账户"
|
unregister: "删除账户"
|
||||||
|
passwordLessLogin: "无密码登录"
|
||||||
resetPassword: "重置密码"
|
resetPassword: "重置密码"
|
||||||
newPasswordIs: "新的密码是「{password}」"
|
newPasswordIs: "新的密码是「{password}」"
|
||||||
post: "投稿"
|
post: "投稿"
|
||||||
@ -327,10 +358,12 @@ autoNoteWatchDescription: "让您能够收到关于「反应」和回复其他
|
|||||||
reduceUiAnimation: "减少UI动画"
|
reduceUiAnimation: "减少UI动画"
|
||||||
share: "分享"
|
share: "分享"
|
||||||
notFound: "未找到"
|
notFound: "未找到"
|
||||||
|
notFoundDescription: "没有与指定URL对应的页面。"
|
||||||
uploadFolder: "默认上传文件夹"
|
uploadFolder: "默认上传文件夹"
|
||||||
cacheClear: "清空缓存"
|
cacheClear: "清空缓存"
|
||||||
markAsReadAllNotifications: "将所有通知标为已读"
|
markAsReadAllNotifications: "将所有通知标为已读"
|
||||||
markAsReadAllUnreadNotes: "将所有帖子标记为已读"
|
markAsReadAllUnreadNotes: "将所有帖子标记为已读"
|
||||||
|
markAsReadAllTalkMessages: "将所有聊天标记为已读"
|
||||||
help: "帮助"
|
help: "帮助"
|
||||||
inputMessageHere: "在此键入信息"
|
inputMessageHere: "在此键入信息"
|
||||||
close: "关闭"
|
close: "关闭"
|
||||||
@ -343,6 +376,8 @@ invites: "邀请"
|
|||||||
groupName: "群组名"
|
groupName: "群组名"
|
||||||
members: "成员"
|
members: "成员"
|
||||||
transfer: "转让"
|
transfer: "转让"
|
||||||
|
messagingWithUser: "与用户聊天"
|
||||||
|
messagingWithGroup: "与群组聊天"
|
||||||
title: "标题"
|
title: "标题"
|
||||||
text: "文本"
|
text: "文本"
|
||||||
enable: "启用"
|
enable: "启用"
|
||||||
@ -353,6 +388,7 @@ inviteToGroup: "群组邀请"
|
|||||||
maxNoteTextLength: "帖子的字数限制"
|
maxNoteTextLength: "帖子的字数限制"
|
||||||
quoteAttached: "已引用"
|
quoteAttached: "已引用"
|
||||||
quoteQuestion: "是否将其作为引用附上?"
|
quoteQuestion: "是否将其作为引用附上?"
|
||||||
|
noMessagesYet: "现在没有新的聊天"
|
||||||
newMessageExists: "新信息"
|
newMessageExists: "新信息"
|
||||||
onlyOneFileCanBeAttached: "只能添加一个附件"
|
onlyOneFileCanBeAttached: "只能添加一个附件"
|
||||||
signinRequired: "请先登录"
|
signinRequired: "请先登录"
|
||||||
@ -368,18 +404,22 @@ normalPassword: "密码强度:中等"
|
|||||||
strongPassword: "密码强度:强"
|
strongPassword: "密码强度:强"
|
||||||
passwordMatched: "密码一致"
|
passwordMatched: "密码一致"
|
||||||
passwordNotMatched: "密码不一致"
|
passwordNotMatched: "密码不一致"
|
||||||
|
signinWith: "以{x}登录"
|
||||||
|
signinFailed: "无法登录。请检查您的用户名和密码。"
|
||||||
|
tapSecurityKey: "点击安全密钥"
|
||||||
or: "或者"
|
or: "或者"
|
||||||
uiLanguage: "显示语言"
|
uiLanguage: "显示语言"
|
||||||
groupInvited: "群组招待"
|
groupInvited: "群组招待"
|
||||||
aboutX: "关于 {x}"
|
aboutX: "关于 {x}"
|
||||||
useOsNativeEmojis: "使用OS原生Emoji"
|
useOsNativeEmojis: "使用OS原生Emoji"
|
||||||
noGroups: "没有组"
|
youHaveNoGroups: "没有组"
|
||||||
joinOrCreateGroup: "加入或者创建群组"
|
joinOrCreateGroup: "加入或者创建群组"
|
||||||
noHistory: "没有历史记录"
|
noHistory: "没有历史记录"
|
||||||
disableAnimatedMfm: "禁用MFM动画"
|
disableAnimatedMfm: "禁用MFM动画"
|
||||||
doing: "正在进行"
|
doing: "正在进行"
|
||||||
category: "类别"
|
category: "类别"
|
||||||
tags: "标签"
|
tags: "标签"
|
||||||
|
docSource: "文件来源"
|
||||||
createAccount: "注册账户"
|
createAccount: "注册账户"
|
||||||
existingAcount: "现有的帐户"
|
existingAcount: "现有的帐户"
|
||||||
regenerate: "重新生成"
|
regenerate: "重新生成"
|
||||||
@ -395,6 +435,62 @@ dayOverDayChanges: "与前一日相比"
|
|||||||
accessibility: "辅助功能"
|
accessibility: "辅助功能"
|
||||||
clinetSettings: "客户端设置"
|
clinetSettings: "客户端设置"
|
||||||
accountSettings: "账户设置"
|
accountSettings: "账户设置"
|
||||||
|
promotion: "推广"
|
||||||
|
promote: "推广"
|
||||||
|
numberOfDays: "天数"
|
||||||
|
hideThisNote: "隐藏这条帖子"
|
||||||
|
showFeaturedNotesInTimeline: "在时间线上显示热门推荐"
|
||||||
|
objectStorage: "对象存储"
|
||||||
|
useObjectStorage: "使用对象存储"
|
||||||
|
objectStorageBaseUrl: "基本网址"
|
||||||
|
objectStorageBaseUrlDesc: "供参考的URL。如果使用CDN或Proxy,则其URL为S3:\"https://<bucket>.s3.amazonaws.com\"、GCS等:\"https://storage-googleapis.proxy.ustclug.org/<bucket>\"。"
|
||||||
|
objectStorageBucket: "存储桶"
|
||||||
|
objectStorageBucketDesc: "请指定使用的对象存储服务的存储桶名称。"
|
||||||
|
objectStoragePrefix: "前缀"
|
||||||
|
objectStoragePrefixDesc: "它将存储在此前缀的目录下。"
|
||||||
|
objectStorageEndpoint: "端点"
|
||||||
|
objectStorageEndpointDesc: "S3默认情况下为空,否则请为每个服务指定端点。 指定为“<host>”或“<host>:<port>”。"
|
||||||
|
objectStorageRegion: "可用区"
|
||||||
|
objectStorageRegionDesc: "指定一个可用区,例如“xx-east-1”。 如果您的对象存储服务没有可用区概念,请将其留空或填写“us-east-1”。"
|
||||||
|
objectStorageUseSSL: "使用SSL"
|
||||||
|
objectStorageUseSSLDesc: "如果不使用https进行API连接,请关闭。"
|
||||||
|
serverLogs: "服务器日志"
|
||||||
|
deleteAll: "删除全部"
|
||||||
|
showFixedPostForm: "在时间线顶部显示帖子表单"
|
||||||
|
newNoteRecived: "有新的帖子"
|
||||||
|
sounds: "声音"
|
||||||
|
listen: "听"
|
||||||
|
none: "空"
|
||||||
|
volume: "音量"
|
||||||
|
details: "详情"
|
||||||
|
chooseEmoji: "选择表情符号"
|
||||||
|
unableToProcess: "操作无法完成"
|
||||||
|
recentUsed: "最近使用"
|
||||||
|
install: "安装"
|
||||||
|
uninstall: "卸载"
|
||||||
|
installedApps: "已授权的应用"
|
||||||
|
nothing: "没什么"
|
||||||
|
installedDate: "授权日期"
|
||||||
|
lastUsedDate: "最近使用"
|
||||||
|
state: "状态"
|
||||||
|
sort: "排序"
|
||||||
|
ascendingOrder: "升序"
|
||||||
|
descendingOrder: "降序"
|
||||||
|
_theme:
|
||||||
|
explore: "寻找主题"
|
||||||
|
install: "安装主题"
|
||||||
|
manage: "主题管理"
|
||||||
|
code: "主题代码"
|
||||||
|
installed: "{name} 已安装"
|
||||||
|
alreadyInstalled: "此主题已经安装"
|
||||||
|
invalid: "主题格式错误"
|
||||||
|
_sfx:
|
||||||
|
note: "帖子"
|
||||||
|
noteMy: "我的帖子"
|
||||||
|
notification: "通知"
|
||||||
|
chat: "聊天"
|
||||||
|
chatBg: "聊天背景"
|
||||||
|
antenna: "天线接收"
|
||||||
_ago:
|
_ago:
|
||||||
unknown: "未知"
|
unknown: "未知"
|
||||||
future: "未来"
|
future: "未来"
|
||||||
@ -414,11 +510,35 @@ _time:
|
|||||||
_tutorial:
|
_tutorial:
|
||||||
title: "Misskey的使用方法"
|
title: "Misskey的使用方法"
|
||||||
step1_1: "欢迎!"
|
step1_1: "欢迎!"
|
||||||
|
step1_2: "这个页面叫做「时间线」,它会按照时间顺序显示所有你「关注」的人所发的「帖子」。"
|
||||||
|
step1_3: "如果你并没有发布任何帖子,也没有关注其他的人,你的时间线页面应当什么都没有显示。"
|
||||||
|
step2_1: "在你想发布一些帖子之前,让我们先进行一下个人资料设置。"
|
||||||
|
step2_2: "如果别人能够更加的了解你,关注你的概率也会得到提升。"
|
||||||
|
step3_1: "已经设置完个人资料了吗?"
|
||||||
|
step3_2: "那么接下来,试着写一些什么东西来发布吧。你可以通过点击屏幕上的铅笔图标来打开投稿页面。"
|
||||||
|
step3_3: "写完内容后,点击窗口右上方的按钮就可以投稿。"
|
||||||
|
step3_4: "不知道说些什么好吗?那就写下「Misskey我来啦!」这样的话吧。"
|
||||||
|
step4_1: "将你的话语发布出去了吗?"
|
||||||
|
step4_2: "太棒了!现在你可以在你的时间线中看到你刚刚发布的帖子了。"
|
||||||
|
step5_1: "接下来,关注其他人来使时间线更生动吧。"
|
||||||
|
step5_2: "{featured}将向您展示热门趋势的帖子。 {explore}将让您找到热门用户。 尝试关注您喜欢的人!"
|
||||||
|
step5_3: "要关注其他用户,请单击他的头像,然后在他的个人资料上按下“关注”按钮。"
|
||||||
|
step5_4: "如果用户的名称旁边有锁定图标,则该用户需要手动批准您的关注请求。"
|
||||||
|
step6_1: "现在,您将可以在时间线上看到其他用户的帖子。"
|
||||||
|
step6_2: "您还可以在其他人的帖子上进行「反应」,以快速做出简单回复。"
|
||||||
|
step6_3: "在他人的贴子上按下「+」图标,即可选择想要的表情来进行「反应」。"
|
||||||
|
step7_1: "对Misskey基本操作的简单介绍,到此结束了。 辛苦了!"
|
||||||
|
step7_2: "如果你想了解更多有关Misskey的信息,请参见{help}。"
|
||||||
step7_3: "接下来,享受Misskey带来的乐趣吧🚀"
|
step7_3: "接下来,享受Misskey带来的乐趣吧🚀"
|
||||||
_2fa:
|
_2fa:
|
||||||
alreadyRegistered: "此设备已被注册"
|
alreadyRegistered: "此设备已被注册"
|
||||||
registerDevice: "注册设备"
|
registerDevice: "注册设备"
|
||||||
registerKey: "注册密钥"
|
registerKey: "注册密钥"
|
||||||
|
step1: "首先,在您的设备上安装二步验证应用程序,例如{a}或{b}。"
|
||||||
|
step2: "然后,扫描屏幕上显示的二维码。"
|
||||||
|
step3: "输入您的应用提供的动态口令以完成设置。"
|
||||||
|
step4: "从现在开始,任何登录操作都将要求您提供动态口令。"
|
||||||
|
securityKeyInfo: "您可以设置使用支持FIDO2的硬件安全密钥、指纹或设备上的PIN来保护您的登录过程。"
|
||||||
_permissions:
|
_permissions:
|
||||||
"read:account": "查看账户信息"
|
"read:account": "查看账户信息"
|
||||||
"write:account": "更改帐户信息"
|
"write:account": "更改帐户信息"
|
||||||
@ -430,8 +550,11 @@ _permissions:
|
|||||||
"write:favorites": "编辑收藏夹"
|
"write:favorites": "编辑收藏夹"
|
||||||
"read:following": "查看关注信息"
|
"read:following": "查看关注信息"
|
||||||
"write:following": "关注/取消关注"
|
"write:following": "关注/取消关注"
|
||||||
|
"read:messaging": "查看消息"
|
||||||
|
"write:messaging": "撰写或删除消息"
|
||||||
"read:mutes": "查看屏蔽列表"
|
"read:mutes": "查看屏蔽列表"
|
||||||
"write:mutes": "编辑屏蔽列表"
|
"write:mutes": "编辑屏蔽列表"
|
||||||
|
"write:notes": "撰写或删除帖子"
|
||||||
"read:notifications": "查看通知"
|
"read:notifications": "查看通知"
|
||||||
"write:notifications": "管理通知"
|
"write:notifications": "管理通知"
|
||||||
"read:reactions": "查看回应"
|
"read:reactions": "查看回应"
|
||||||
@ -444,9 +567,18 @@ _permissions:
|
|||||||
"read:user-groups": "查看用户组"
|
"read:user-groups": "查看用户组"
|
||||||
"write:user-groups": "操作用户组"
|
"write:user-groups": "操作用户组"
|
||||||
_auth:
|
_auth:
|
||||||
|
shareAccess: "您要授权允许“{name}”访问您的帐户吗?"
|
||||||
|
shareAccessAsk: "您确定要授权此应用程序访问您的帐户吗?"
|
||||||
permissionAsk: "这个应用程序需要以下权限"
|
permissionAsk: "这个应用程序需要以下权限"
|
||||||
|
pleaseGoBack: "请返回到应用程序"
|
||||||
|
callback: "回到应用程序"
|
||||||
|
denied: "拒绝访问"
|
||||||
_antennaSources:
|
_antennaSources:
|
||||||
all: "所有帖子"
|
all: "所有帖子"
|
||||||
|
homeTimeline: "已关注用户的帖子"
|
||||||
|
users: "来自特定用户的帖子"
|
||||||
|
userList: "来自特定清单中的帖子"
|
||||||
|
userGroup: "来自特定组中用户的帖子"
|
||||||
_weekday:
|
_weekday:
|
||||||
sunday: "星期日"
|
sunday: "星期日"
|
||||||
monday: "星期一"
|
monday: "星期一"
|
||||||
@ -464,6 +596,7 @@ _widgets:
|
|||||||
clock: "时钟"
|
clock: "时钟"
|
||||||
rss: "RSS阅读器"
|
rss: "RSS阅读器"
|
||||||
activity: "活动"
|
activity: "活动"
|
||||||
|
photos: "照片"
|
||||||
_cw:
|
_cw:
|
||||||
hide: "隐藏"
|
hide: "隐藏"
|
||||||
show: "查看更多"
|
show: "查看更多"
|
||||||
@ -494,6 +627,7 @@ _poll:
|
|||||||
remainingSeconds: "{s}秒后截止"
|
remainingSeconds: "{s}秒后截止"
|
||||||
_visibility:
|
_visibility:
|
||||||
public: "公开"
|
public: "公开"
|
||||||
|
publicDescription: "您的帖子将出现在全局时间线上"
|
||||||
home: "首页"
|
home: "首页"
|
||||||
homeDescription: "仅发送至首页的时间线"
|
homeDescription: "仅发送至首页的时间线"
|
||||||
followers: "关注者"
|
followers: "关注者"
|
||||||
@ -532,15 +666,25 @@ _charts:
|
|||||||
usersTotal: "用户总数"
|
usersTotal: "用户总数"
|
||||||
activeUsers: "活跃用户数"
|
activeUsers: "活跃用户数"
|
||||||
notesIncDec: "帖子:增加/减少"
|
notesIncDec: "帖子:增加/减少"
|
||||||
|
localNotesIncDec: "本地帖子量增减"
|
||||||
|
remoteNotesIncDec: "远程帖子量增减"
|
||||||
notesTotal: "帖子总数"
|
notesTotal: "帖子总数"
|
||||||
|
filesIncDec: "文件总数增减"
|
||||||
|
filesTotal: "合计文件总数"
|
||||||
|
storageUsageIncDec: "存储空间用量增减"
|
||||||
|
storageUsageTotal: "合计存储空间用量"
|
||||||
_instanceCharts:
|
_instanceCharts:
|
||||||
|
requests: "请求"
|
||||||
users: "用户数量:增加/减少"
|
users: "用户数量:增加/减少"
|
||||||
usersTotal: "用户总数"
|
usersTotal: "用户总计"
|
||||||
notes: "帖子:增加/减少"
|
notes: "帖子:增加/减少"
|
||||||
notesTotal: "帖子:总数"
|
notesTotal: "帖子总计"
|
||||||
ff: "关注/被关注:数量变化"
|
ff: "关注/被关注:数量变化"
|
||||||
ffTotal: "关注/被关注:总数"
|
ffTotal: "关注/被关注者总计"
|
||||||
cacheSize: "缓存大小:增加/减少"
|
cacheSize: "缓存大小:增加/减少"
|
||||||
|
cacheSizeTotal: "缓存大小总计"
|
||||||
|
files: "文件总数增减"
|
||||||
|
filesTotal: "文件数总计"
|
||||||
_timelines:
|
_timelines:
|
||||||
home: "首页"
|
home: "首页"
|
||||||
local: "本地"
|
local: "本地"
|
||||||
@ -550,45 +694,39 @@ _pages:
|
|||||||
newPage: "创建页面"
|
newPage: "创建页面"
|
||||||
editPage: "编辑页面"
|
editPage: "编辑页面"
|
||||||
readPage: "查看源"
|
readPage: "查看源"
|
||||||
page-created: "页面已创建"
|
created: "页面已创建"
|
||||||
page-updated: "页面已更新"
|
updated: "页面已更新"
|
||||||
name-already-exists: "该页面URL已存在"
|
deleted: "该页面已被删除"
|
||||||
title-invalid-name: "无效的页面URL"
|
nameAlreadyExists: "该页面URL已存在"
|
||||||
text-invalid-name: "请确认该项不为空"
|
invalidNameTitle: "无效的页面URL"
|
||||||
|
invalidNameText: "请确认该项不为空"
|
||||||
editThisPage: "编辑此页面"
|
editThisPage: "编辑此页面"
|
||||||
viewSource: "查看源代码"
|
viewSource: "查看源代码"
|
||||||
viewPage: "查看页面"
|
viewPage: "查看页面"
|
||||||
like: "赞"
|
like: "赞"
|
||||||
unlike: "取消赞"
|
unlike: "取消赞"
|
||||||
liked-pages: "喜欢的页面"
|
my: "我的页面"
|
||||||
my-pages: "我的页面"
|
liked: "喜欢的页面"
|
||||||
inspector: "检查器"
|
inspector: "检查器"
|
||||||
content: "页面内容"
|
content: "页面内容"
|
||||||
variables: "变量"
|
variables: "变量"
|
||||||
variables-info: "您可以使用变量创建动态页面。在文本中通过<b>{变量名}</b>的写法来嵌入变量值。例如在文本<b>Hello { thing } world!</b>中,如果变量(thing)的值为<b>ai</b>,那么该文本会成为<b>Hello ai world!</b>。"
|
|
||||||
variables-info2: "因为变量的计算(计算变量值)是从上到下执行的,所以不能在变量中引用下面的变量。例如从上到下依次定义了<b>A,B,C</b>3个变量,那么<b>C</b>中可以引用<b>A</b>或<b>B</b>,但是<b>A</b>无法引用<b>B</b>或<b>C</b>。"
|
|
||||||
variables-info3: "为了接收来自用户的输入,页面上设有“用户输入”块,在“变量名称”中设置要在其中保存输入值的变量名(变量会自动创建)。您可以使用该变量执行操作以响应用户输入。"
|
|
||||||
variables-info4: "通过使用函数,您可以将数值计算过程组合成可重用的形式。要创建函数,需要创建一个“函数”类型的变量。你可以将函数设定为槽函数(参数)的格式,槽函数的值可作为函数中的变量使用。另外,AiScript标准中还有一些函数会将函数作为参数(称为高阶函数)。\n除了已经预先定义的函数外,您也可以将它们设置为这些高阶函数的槽函数。"
|
|
||||||
more-details: "详细说明"
|
|
||||||
title: "标题"
|
title: "标题"
|
||||||
url: "页面URL"
|
url: "页面URL"
|
||||||
summary: "页面摘要"
|
summary: "页面摘要"
|
||||||
alignCenter: "居中"
|
alignCenter: "居中"
|
||||||
hide-title-when-pinned: "置顶时隐藏标题"
|
hideTitleWhenPinned: "置顶时隐藏标题"
|
||||||
font: "字体"
|
font: "字体"
|
||||||
fontSerif: "衬线字体"
|
fontSerif: "衬线字体"
|
||||||
fontSansSerif: "无衬线字体"
|
fontSansSerif: "无衬线字体"
|
||||||
set-eye-catching-image: "设置封面图片"
|
eyeCatchingImageSet: "设置封面图片"
|
||||||
remove-eye-catching-image: "删除封面图片"
|
eyeCatchingImageRemove: "删除封面图片"
|
||||||
chooseBlock: "添加块"
|
chooseBlock: "添加块"
|
||||||
selectType: "选择类型"
|
selectType: "选择类型"
|
||||||
enterVariableName: "请输入变量名"
|
enterVariableName: "请输入变量名"
|
||||||
the-variable-name-is-already-used: "变量名已使用"
|
variableNameIsAlreadyUsed: "变量名已使用"
|
||||||
content-blocks: "内容"
|
contentBlocks: "内容"
|
||||||
input-blocks: "输入"
|
inputBlocks: "输入"
|
||||||
special-blocks: "特殊"
|
specialBlocks: "特殊"
|
||||||
post-from-post-form: "发布此内容"
|
|
||||||
posted-from-post-form: "已发布"
|
|
||||||
blocks:
|
blocks:
|
||||||
text: "文本"
|
text: "文本"
|
||||||
textarea: "文本区域"
|
textarea: "文本区域"
|
||||||
|
@ -1,2 +1,390 @@
|
|||||||
---
|
---
|
||||||
_lang_: "中文(繁体)"
|
_lang_: "中文(繁体)"
|
||||||
|
monthAndDay: "{month}月 {day}日"
|
||||||
|
search: "搜尋"
|
||||||
|
notifications: "通知"
|
||||||
|
username: "用戶名"
|
||||||
|
password: "密碼"
|
||||||
|
fetchingAsApObject: "從Fediverse尋找中..."
|
||||||
|
ok: "OK"
|
||||||
|
gotIt: "知道了"
|
||||||
|
cancel: "取消"
|
||||||
|
enterUsername: "輸入用戶名"
|
||||||
|
renotedBy: "由{user}轉發"
|
||||||
|
noNotes: "沒有筆記"
|
||||||
|
noNotifications: "沒有通知"
|
||||||
|
settings: "設定"
|
||||||
|
profile: "個人檔案"
|
||||||
|
timeline: "時間軸"
|
||||||
|
noAccountDescription: "此用戶還沒有自我介紹"
|
||||||
|
login: "登入"
|
||||||
|
loggingIn: "登入中"
|
||||||
|
logout: "登出"
|
||||||
|
signup: "註冊"
|
||||||
|
uploading: "上傳中"
|
||||||
|
save: "保存"
|
||||||
|
users: "用戶"
|
||||||
|
addUser: "新增用戶"
|
||||||
|
favorite: "收藏"
|
||||||
|
favorites: "收藏"
|
||||||
|
unfavorite: "取消收藏"
|
||||||
|
pin: "置頂"
|
||||||
|
unpin: "取消置頂"
|
||||||
|
copyContent: "複製內容"
|
||||||
|
copyLink: "複製連結"
|
||||||
|
delete: "刪除"
|
||||||
|
addToList: "添加至清單"
|
||||||
|
sendMessage: "發送訊息"
|
||||||
|
copyUsername: "複製用戶名"
|
||||||
|
reply: "回覆"
|
||||||
|
loadMore: "載入更多"
|
||||||
|
youGotNewFollower: "您有新的追隨者"
|
||||||
|
receiveFollowRequest: "收到追隨請求"
|
||||||
|
followRequestAccepted: "追隨請求已接受"
|
||||||
|
mentions: "提及"
|
||||||
|
importAndExport: "匯入 / 匯出"
|
||||||
|
import: "匯入"
|
||||||
|
export: "匯出"
|
||||||
|
files: "檔案"
|
||||||
|
download: "下載"
|
||||||
|
driveFileDeleteConfirm: "確定要刪除檔案「{name}」嗎?附加此檔案的筆記也會跟著不見。"
|
||||||
|
unfollowConfirm: "確定要取消對{name}的追隨嗎?"
|
||||||
|
exportRequested: "已請求匯出。這可能會花一點時間。結束後檔案將會被放到雲端裡。"
|
||||||
|
importRequested: "已請求匯入。這可能會花一點時間"
|
||||||
|
lists: "清單"
|
||||||
|
noLists: "沒有清單"
|
||||||
|
note: "筆記"
|
||||||
|
notes: "筆記"
|
||||||
|
following: "關注中"
|
||||||
|
followers: "追隨者"
|
||||||
|
followsYou: "追隨你的人"
|
||||||
|
createList: "建立清單"
|
||||||
|
manageLists: "管理清單"
|
||||||
|
error: "發生錯誤"
|
||||||
|
retry: "重試"
|
||||||
|
enterListName: "輸入清單名稱"
|
||||||
|
privacy: "隱私"
|
||||||
|
makeFollowManuallyApprove: "手動審核追隨請求"
|
||||||
|
defaultNoteVisibility: "預設的筆記隱私權"
|
||||||
|
follow: "追隨"
|
||||||
|
followRequest: "追隨請求"
|
||||||
|
followRequests: "追隨請求"
|
||||||
|
unfollow: "取消追隨"
|
||||||
|
followRequestPending: "追隨許可批准中"
|
||||||
|
enterEmoji: "輸入表情符號"
|
||||||
|
renote: "轉發筆記"
|
||||||
|
unrenote: "取消轉發筆記"
|
||||||
|
quote: "引用"
|
||||||
|
pinnedNote: "已置頂筆記"
|
||||||
|
you: "您"
|
||||||
|
clickToShow: "點擊查看"
|
||||||
|
sensitive: "敏感內容"
|
||||||
|
add: "新增"
|
||||||
|
reaction: "反應"
|
||||||
|
rememberNoteVisibility: "記住筆記隱私設定"
|
||||||
|
attachCancel: "移除附件"
|
||||||
|
markAsSensitive: "標記為敏感內容"
|
||||||
|
unmarkAsSensitive: "取消標記為敏感內容"
|
||||||
|
enterFileName: "請輸入檔案名稱"
|
||||||
|
mute: "禁言"
|
||||||
|
unmute: "解除禁言"
|
||||||
|
block: "封鎖"
|
||||||
|
unblock: "解除封鎖"
|
||||||
|
suspend: "凍結"
|
||||||
|
unsuspend: "解凍"
|
||||||
|
blockConfirm: "確定要封鎖此用戶?"
|
||||||
|
unblockConfirm: "確定解除封鎖此用戶?"
|
||||||
|
suspendConfirm: "確定凍結此帳號?"
|
||||||
|
unsuspendConfirm: "確定解凍此帳號?"
|
||||||
|
selectList: "選擇清單"
|
||||||
|
customEmojis: "自訂表情符號"
|
||||||
|
emojiName: "表情符號名稱"
|
||||||
|
emojiUrl: "表情符號URL"
|
||||||
|
addEmoji: "新增表情符號"
|
||||||
|
flagAsBot: "此帳戶是Bot"
|
||||||
|
flagAsCat: "此帳戶是Cat"
|
||||||
|
autoAcceptFollowed: "自動許可關注"
|
||||||
|
addAcount: "新增帳戶"
|
||||||
|
loginFailed: "登入失敗"
|
||||||
|
general: "一般"
|
||||||
|
wallpaper: "壁紙"
|
||||||
|
removeWallpaper: "移除壁紙"
|
||||||
|
searchWith: "搜尋: {q}"
|
||||||
|
youHaveNoLists: "你沒有任何清單"
|
||||||
|
followConfirm: "你真的要關注{name}嗎?"
|
||||||
|
host: "主機"
|
||||||
|
selectUser: "選擇用戶"
|
||||||
|
recipient: "收件人"
|
||||||
|
annotation: "註解"
|
||||||
|
federation: "整合"
|
||||||
|
latestStatus: "最後狀態"
|
||||||
|
storageUsage: "已使用容量"
|
||||||
|
charts: "圖表"
|
||||||
|
perHour: "每小時"
|
||||||
|
perDay: "每日"
|
||||||
|
operations: "操作"
|
||||||
|
software: "軟體"
|
||||||
|
version: "版本"
|
||||||
|
withNFiles: "{n}個檔案"
|
||||||
|
monitor: "監視器"
|
||||||
|
network: "網路"
|
||||||
|
statistics: "統計"
|
||||||
|
clearQueue: "清除佇列"
|
||||||
|
clearQueueConfirmTitle: "確定要清除佇列嗎?"
|
||||||
|
clearCachedFiles: "清除快取資料"
|
||||||
|
muteAndBlock: "禁言 / 封鎖"
|
||||||
|
mutedUsers: "已禁言用戶"
|
||||||
|
blockedUsers: "已封鎖用戶"
|
||||||
|
noUsers: "無用戶"
|
||||||
|
editProfile: "編輯個人檔案"
|
||||||
|
noteDeleteConfirm: "確定刪除此筆記嗎?"
|
||||||
|
pinLimitExceeded: "不能再置頂更多筆記了"
|
||||||
|
intro: "Misskey安裝作業完成!請創立管理員用戶"
|
||||||
|
done: "完成"
|
||||||
|
processing: "處理中"
|
||||||
|
preview: "預覽"
|
||||||
|
noCustomEmojis: "沒有表情符號"
|
||||||
|
federating: "整合檢索中"
|
||||||
|
blocked: "已封鎖"
|
||||||
|
suspended: "已凍結"
|
||||||
|
all: "全部"
|
||||||
|
subscribing: "訂閱中"
|
||||||
|
notResponding: "沒有回應"
|
||||||
|
changePassword: "修改密碼"
|
||||||
|
security: "安全性"
|
||||||
|
retypedNotMatch: "不相符的輸入內容"
|
||||||
|
currentPassword: "現在的密碼"
|
||||||
|
newPassword: "新的密碼"
|
||||||
|
newPasswordRetype: "新的密碼(再輸入一次)"
|
||||||
|
attachFile: "添加附件"
|
||||||
|
more: "更多!"
|
||||||
|
featured: "精選"
|
||||||
|
usernameOrUserId: "用戶名或用戶ID"
|
||||||
|
noSuchUser: "用戶不存在"
|
||||||
|
announcements: "公告"
|
||||||
|
imageUrl: "圖片URL"
|
||||||
|
remove: "刪除"
|
||||||
|
removed: "成功移除"
|
||||||
|
removeAreYouSure: "確定要刪掉「{x}」嗎?"
|
||||||
|
saved: "已保存"
|
||||||
|
messaging: "傳送訊息"
|
||||||
|
upload: "上傳"
|
||||||
|
fromDrive: "從雲端"
|
||||||
|
fromUrl: "從URL"
|
||||||
|
explore: "探索"
|
||||||
|
games: "Misskey 遊戲"
|
||||||
|
messageRead: "已讀"
|
||||||
|
noMoreHistory: "沒有更多歷史紀錄"
|
||||||
|
startMessaging: "開始傳送訊息"
|
||||||
|
nUsersRead: "{n}人已讀"
|
||||||
|
tos: "使用條款"
|
||||||
|
start: "開始"
|
||||||
|
home: "首頁"
|
||||||
|
activity: "動態"
|
||||||
|
birthday: "生日"
|
||||||
|
yearsOld: "{age}歲"
|
||||||
|
registeredDate: "註冊日期"
|
||||||
|
location: "位置"
|
||||||
|
theme: "外觀主題"
|
||||||
|
lightThemes: "明亮主題"
|
||||||
|
darkThemes: "灰暗主題"
|
||||||
|
drive: "雲端硬碟"
|
||||||
|
selectFile: "選擇檔案"
|
||||||
|
selectFiles: "選擇檔案"
|
||||||
|
renameFile: "重新命名檔案"
|
||||||
|
createFolder: "新增資料夾"
|
||||||
|
renameFolder: "重新命名資料夾"
|
||||||
|
deleteFolder: "刪除資料夾"
|
||||||
|
addFile: "添加檔案"
|
||||||
|
emptyDrive: "雲端硬碟為空"
|
||||||
|
emptyFolder: "空的資料夾"
|
||||||
|
copyUrl: "複製URL"
|
||||||
|
rename: "重新命名"
|
||||||
|
avatar: "頭像"
|
||||||
|
banner: "橫幅"
|
||||||
|
nsfw: "敏感內容"
|
||||||
|
disconnectedFromServer: "與伺服器中斷連線"
|
||||||
|
reload: "重新載入"
|
||||||
|
doNothing: "無視"
|
||||||
|
reloadConfirm: "確定要重新嘗試嗎?"
|
||||||
|
watch: "關注"
|
||||||
|
unwatch: "取消關注"
|
||||||
|
accept: "接受"
|
||||||
|
reject: "拒絕"
|
||||||
|
maintainerName: "管理員名稱"
|
||||||
|
maintainerEmail: "管理員信箱"
|
||||||
|
tosUrl: "服務條款URL"
|
||||||
|
thisYear: "今年"
|
||||||
|
thisMonth: "本月"
|
||||||
|
today: "本日"
|
||||||
|
dayX: "{day}天"
|
||||||
|
monthX: "{month}月"
|
||||||
|
yearX: "{year}年"
|
||||||
|
pages: "頁面"
|
||||||
|
connectSerice: "連線"
|
||||||
|
disconnectSerice: "中斷連線"
|
||||||
|
enableLocalTimeline: "開啟本地時間軸"
|
||||||
|
enableGlobalTimeline: "開啟全球時間軸"
|
||||||
|
registration: "註冊"
|
||||||
|
enableRegistration: "開啟新用戶註冊"
|
||||||
|
invite: "邀請"
|
||||||
|
proxyRemoteFiles: "代理遠程檔案"
|
||||||
|
driveCapacityPerLocalAccount: "每個本地用戶的雲端容量"
|
||||||
|
inMb: "以Mbps為單位"
|
||||||
|
iconUrl: "圖像URL"
|
||||||
|
bannerUrl: "橫幅圖片URL"
|
||||||
|
basicInfo: "基本資訊"
|
||||||
|
pinnedUsers: "置頂用戶"
|
||||||
|
recaptcha: "reCAPTCHA"
|
||||||
|
enableRecaptcha: "啟用 reCAPTCHA"
|
||||||
|
recaptchaSiteKey: "網站金鑰"
|
||||||
|
recaptchaSecretKey: "金鑰"
|
||||||
|
name: "名稱"
|
||||||
|
serviceworker: "ServiceWorker"
|
||||||
|
enableServiceworker: "開啟 ServiceWorker"
|
||||||
|
caseSensitive: "區分大小寫"
|
||||||
|
notesAndReplies: "貼文與回覆"
|
||||||
|
withFiles: "附件"
|
||||||
|
silence: "禁言"
|
||||||
|
silenceConfirm: "確定要禁言此用戶嗎?"
|
||||||
|
unsilenceConfirm: "確定要解除禁言嗎?"
|
||||||
|
popularUsers: "熱門用戶"
|
||||||
|
recentlyUpdatedUsers: "最近發文的用戶"
|
||||||
|
recentlyRegisteredUsers: "新加入用戶"
|
||||||
|
recentlyDiscoveredUsers: "最近發現的用戶"
|
||||||
|
userList: "清單"
|
||||||
|
passwordLessLogin: "設置無密碼登入"
|
||||||
|
resetPassword: "重置密碼"
|
||||||
|
newPasswordIs: "新密碼為「{password}」"
|
||||||
|
post: "投稿"
|
||||||
|
posted: "投稿完成"
|
||||||
|
autoReloadWhenDisconnected: "和伺服器斷線時自動重新載入"
|
||||||
|
autoNoteWatch: "自動關注筆記"
|
||||||
|
autoNoteWatchDescription: "收到反應或回覆過的筆記的通知"
|
||||||
|
reduceUiAnimation: "減少介面的動態視覺"
|
||||||
|
share: "分享"
|
||||||
|
notFound: "找不到"
|
||||||
|
notFoundDescription: "找不到與指定URL回應的頁面"
|
||||||
|
uploadFolder: "預設上傳資料夾"
|
||||||
|
cacheClear: "清除暫存"
|
||||||
|
markAsReadAllNotifications: "標記所有通知為已讀"
|
||||||
|
markAsReadAllUnreadNotes: "標記所有筆記為已讀"
|
||||||
|
markAsReadAllTalkMessages: "標記所有訊息為已讀"
|
||||||
|
help: "幫助"
|
||||||
|
inputMessageHere: "在此輸入訊息"
|
||||||
|
close: "關閉"
|
||||||
|
group: "群組"
|
||||||
|
groups: "群組"
|
||||||
|
createGroup: "創建群組"
|
||||||
|
joinedGroups: "群組成員"
|
||||||
|
invites: "邀請"
|
||||||
|
groupName: "群組名稱"
|
||||||
|
members: "成員"
|
||||||
|
transfer: "轉讓"
|
||||||
|
messagingWithUser: "傳送訊息給其他用戶"
|
||||||
|
messagingWithGroup: "發送訊息至群組"
|
||||||
|
title: "標題"
|
||||||
|
text: "文字"
|
||||||
|
enable: "啟用"
|
||||||
|
next: "下一步"
|
||||||
|
retype: "重新輸入"
|
||||||
|
noteOf: "{user}的筆記"
|
||||||
|
inviteToGroup: "邀請至群組"
|
||||||
|
maxNoteTextLength: "筆記的字數限制"
|
||||||
|
quoteAttached: "引用"
|
||||||
|
quoteQuestion: "是否要引用?"
|
||||||
|
noMessagesYet: "沒有訊息"
|
||||||
|
newMessageExists: "有新的訊息"
|
||||||
|
onlyOneFileCanBeAttached: "只能添加一個附件"
|
||||||
|
signinRequired: "請先登入"
|
||||||
|
invitationCode: "邀請碼"
|
||||||
|
checking: "確認中"
|
||||||
|
available: "可用的"
|
||||||
|
unavailable: "不可用的"
|
||||||
|
usernameInvalidFormat: "可使用大小寫英文字母、數字和底線"
|
||||||
|
tooShort: "過短"
|
||||||
|
none: "無"
|
||||||
|
volume: "音量"
|
||||||
|
details: "詳細資訊"
|
||||||
|
_sfx:
|
||||||
|
note: "筆記"
|
||||||
|
noteMy: "我的筆記"
|
||||||
|
notification: "通知"
|
||||||
|
chat: "傳送訊息"
|
||||||
|
_ago:
|
||||||
|
unknown: "未知"
|
||||||
|
future: "未來"
|
||||||
|
justNow: "剛剛"
|
||||||
|
secondsAgo: "{n}秒前"
|
||||||
|
minutesAgo: "{n}分鐘前"
|
||||||
|
hoursAgo: "{n}小時前"
|
||||||
|
daysAgo: "{n}天前"
|
||||||
|
weeksAgo: "{n}周前"
|
||||||
|
monthsAgo: "{n}個月前"
|
||||||
|
yearsAgo: "{n}年前"
|
||||||
|
_time:
|
||||||
|
second: "秒"
|
||||||
|
minute: "分鐘"
|
||||||
|
hour: "小時"
|
||||||
|
day: "天"
|
||||||
|
_tutorial:
|
||||||
|
title: "Misskey使用方法"
|
||||||
|
step1_1: "歡迎!"
|
||||||
|
step1_2: "此為「時間軸」頁面,它會按照時間順序顯示你「追隨」的人的「筆記」"
|
||||||
|
step1_3: "由於你沒有發布任何筆記,也沒有追隨任何人,所以你的時間軸目前是空的。"
|
||||||
|
step2_1: "在發文或追隨其他人之前先讓我們設定一下個人資料吧。"
|
||||||
|
step2_2: "提供一些關於自己的資訊來讓其他人更有追隨你的意願。"
|
||||||
|
step3_1: "個人資料都打理好了嗎?"
|
||||||
|
step3_2: "下一步讓我們來試試看發個文,按一下畫面上的鉛筆圖示來開始"
|
||||||
|
step3_3: "輸入完內容後,按視窗右上角的按鈕來發文"
|
||||||
|
step3_4: "不知道該寫什麼內容嗎?試試看「開始使用Misskey了」如何。"
|
||||||
|
step4_1: "筆記發出去了嗎?"
|
||||||
|
step4_2: "如果你的筆記有顯示在時間軸上,就代表已經發文成功。"
|
||||||
|
step5_1: "現在試試看追隨其他人來讓你的時間軸變得更生動吧。"
|
||||||
|
step5_3: "想要追隨其他人,只要點擊他們的頭像並按「追隨」即可。"
|
||||||
|
step5_4: "如果使用者的名字旁有鎖頭的圖示,代表他們需要手動核准你的追隨請求。"
|
||||||
|
step6_1: "現在你可以在時間軸上看到其他用戶的貼文"
|
||||||
|
step6_2: "你也可以在其他人的貼文上進行「反應」來表達簡單的回覆。"
|
||||||
|
step6_3: "在他人的貼文按下「+」的圖示即可選擇想要的表情符號來進行「反應」。"
|
||||||
|
step7_1: "以上為Misskey的基本操作說明,教學在此告一段落。辛苦了。"
|
||||||
|
step7_2: "歡迎到{help}來瞭解更多Misskey相關介紹。"
|
||||||
|
_widgets:
|
||||||
|
notifications: "通知"
|
||||||
|
timeline: "時間軸"
|
||||||
|
activity: "動態"
|
||||||
|
_cw:
|
||||||
|
show: "載入更多"
|
||||||
|
_poll:
|
||||||
|
deadlineTime: "小時"
|
||||||
|
_visibility:
|
||||||
|
home: "首頁"
|
||||||
|
followers: "追隨者"
|
||||||
|
_profile:
|
||||||
|
name: "名稱"
|
||||||
|
username: "用戶名"
|
||||||
|
_exportOrImport:
|
||||||
|
followingList: "關注中"
|
||||||
|
muteList: "禁言"
|
||||||
|
blockingList: "封鎖"
|
||||||
|
userLists: "清單"
|
||||||
|
_timelines:
|
||||||
|
home: "首頁"
|
||||||
|
_pages:
|
||||||
|
script:
|
||||||
|
categories:
|
||||||
|
list: "清單"
|
||||||
|
blocks:
|
||||||
|
_join:
|
||||||
|
arg1: "清單"
|
||||||
|
_randomPick:
|
||||||
|
arg1: "清單"
|
||||||
|
_dailyRandomPick:
|
||||||
|
arg1: "清單"
|
||||||
|
_seedRandomPick:
|
||||||
|
arg2: "清單"
|
||||||
|
_pick:
|
||||||
|
arg1: "清單"
|
||||||
|
_listLen:
|
||||||
|
arg1: "清單"
|
||||||
|
types:
|
||||||
|
array: "清單"
|
||||||
|
14
migration/1582210532752-antenna-exclude.ts
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
import {MigrationInterface, QueryRunner} from "typeorm";
|
||||||
|
|
||||||
|
export class antennaExclude1582210532752 implements MigrationInterface {
|
||||||
|
name = 'antennaExclude1582210532752'
|
||||||
|
|
||||||
|
public async up(queryRunner: QueryRunner): Promise<any> {
|
||||||
|
await queryRunner.query(`ALTER TABLE "antenna" ADD "excludeKeywords" jsonb NOT NULL DEFAULT '[]'`, undefined);
|
||||||
|
}
|
||||||
|
|
||||||
|
public async down(queryRunner: QueryRunner): Promise<any> {
|
||||||
|
await queryRunner.query(`ALTER TABLE "antenna" DROP COLUMN "excludeKeywords"`, undefined);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
14
migration/1582875306439-note-reaction-length.ts
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
import {MigrationInterface, QueryRunner} from "typeorm";
|
||||||
|
|
||||||
|
export class noteReactionLength1582875306439 implements MigrationInterface {
|
||||||
|
name = 'noteReactionLength1582875306439'
|
||||||
|
|
||||||
|
public async up(queryRunner: QueryRunner): Promise<any> {
|
||||||
|
await queryRunner.query(`ALTER TABLE "note_reaction" ALTER COLUMN "reaction" TYPE character varying(130)`, undefined);
|
||||||
|
}
|
||||||
|
|
||||||
|
public async down(queryRunner: QueryRunner): Promise<any> {
|
||||||
|
await queryRunner.query(`ALTER TABLE "note_reaction" ALTER COLUMN "reaction" TYPE character varying(128)`, undefined);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
36
migration/1585361548360-miauth.ts
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
import {MigrationInterface, QueryRunner} from "typeorm";
|
||||||
|
|
||||||
|
export class miauth1585361548360 implements MigrationInterface {
|
||||||
|
name = 'miauth1585361548360'
|
||||||
|
|
||||||
|
public async up(queryRunner: QueryRunner): Promise<any> {
|
||||||
|
await queryRunner.query(`ALTER TABLE "access_token" ADD "lastUsedAt" TIMESTAMP WITH TIME ZONE DEFAULT null`, undefined);
|
||||||
|
await queryRunner.query(`ALTER TABLE "access_token" ADD "session" character varying(128) DEFAULT null`, undefined);
|
||||||
|
await queryRunner.query(`ALTER TABLE "access_token" ADD "name" character varying(128) DEFAULT null`, undefined);
|
||||||
|
await queryRunner.query(`ALTER TABLE "access_token" ADD "description" character varying(512) DEFAULT null`, undefined);
|
||||||
|
await queryRunner.query(`ALTER TABLE "access_token" ADD "iconUrl" character varying(512) DEFAULT null`, undefined);
|
||||||
|
await queryRunner.query(`ALTER TABLE "access_token" ADD "permission" character varying(64) array NOT NULL DEFAULT '{}'::varchar[]`, undefined);
|
||||||
|
await queryRunner.query(`ALTER TABLE "access_token" ADD "fetched" boolean NOT NULL DEFAULT false`, undefined);
|
||||||
|
await queryRunner.query(`ALTER TABLE "access_token" DROP CONSTRAINT "FK_a3ff16c90cc87a82a0b5959e560"`, undefined);
|
||||||
|
await queryRunner.query(`ALTER TABLE "access_token" ALTER COLUMN "appId" DROP NOT NULL`, undefined);
|
||||||
|
await queryRunner.query(`ALTER TABLE "access_token" ALTER COLUMN "appId" SET DEFAULT null`, undefined);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_bf3a053c07d9fb5d87317c56ee" ON "access_token" ("session") `, undefined);
|
||||||
|
await queryRunner.query(`ALTER TABLE "access_token" ADD CONSTRAINT "FK_a3ff16c90cc87a82a0b5959e560" FOREIGN KEY ("appId") REFERENCES "app"("id") ON DELETE CASCADE ON UPDATE NO ACTION`, undefined);
|
||||||
|
}
|
||||||
|
|
||||||
|
public async down(queryRunner: QueryRunner): Promise<any> {
|
||||||
|
await queryRunner.query(`ALTER TABLE "access_token" DROP CONSTRAINT "FK_a3ff16c90cc87a82a0b5959e560"`, undefined);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_bf3a053c07d9fb5d87317c56ee"`, undefined);
|
||||||
|
await queryRunner.query(`ALTER TABLE "access_token" ALTER COLUMN "appId" DROP DEFAULT`, undefined);
|
||||||
|
await queryRunner.query(`ALTER TABLE "access_token" ALTER COLUMN "appId" SET NOT NULL`, undefined);
|
||||||
|
await queryRunner.query(`ALTER TABLE "access_token" ADD CONSTRAINT "FK_a3ff16c90cc87a82a0b5959e560" FOREIGN KEY ("appId") REFERENCES "app"("id") ON DELETE CASCADE ON UPDATE NO ACTION`, undefined);
|
||||||
|
await queryRunner.query(`ALTER TABLE "access_token" DROP COLUMN "fetched"`, undefined);
|
||||||
|
await queryRunner.query(`ALTER TABLE "access_token" DROP COLUMN "permission"`, undefined);
|
||||||
|
await queryRunner.query(`ALTER TABLE "access_token" DROP COLUMN "iconUrl"`, undefined);
|
||||||
|
await queryRunner.query(`ALTER TABLE "access_token" DROP COLUMN "description"`, undefined);
|
||||||
|
await queryRunner.query(`ALTER TABLE "access_token" DROP COLUMN "name"`, undefined);
|
||||||
|
await queryRunner.query(`ALTER TABLE "access_token" DROP COLUMN "session"`, undefined);
|
||||||
|
await queryRunner.query(`ALTER TABLE "access_token" DROP COLUMN "lastUsedAt"`, undefined);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
48
migration/1585385921215-custom-notification.ts
Normal file
@ -0,0 +1,48 @@
|
|||||||
|
import {MigrationInterface, QueryRunner} from "typeorm";
|
||||||
|
|
||||||
|
export class customNotification1585385921215 implements MigrationInterface {
|
||||||
|
name = 'customNotification1585385921215'
|
||||||
|
|
||||||
|
public async up(queryRunner: QueryRunner): Promise<any> {
|
||||||
|
await queryRunner.query(`ALTER TABLE "notification" ADD "customBody" character varying(2048)`, undefined);
|
||||||
|
await queryRunner.query(`ALTER TABLE "notification" ADD "customHeader" character varying(256)`, undefined);
|
||||||
|
await queryRunner.query(`ALTER TABLE "notification" ADD "customIcon" character varying(1024)`, undefined);
|
||||||
|
await queryRunner.query(`ALTER TABLE "notification" ADD "appAccessTokenId" character varying(32)`, undefined);
|
||||||
|
await queryRunner.query(`ALTER TABLE "notification" DROP CONSTRAINT "FK_3b4e96eec8d36a8bbb9d02aa710"`, undefined);
|
||||||
|
await queryRunner.query(`ALTER TABLE "notification" ALTER COLUMN "notifierId" DROP NOT NULL`, undefined);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "notification"."notifierId" IS 'The ID of sender user of the Notification.'`, undefined);
|
||||||
|
await queryRunner.query(`ALTER TYPE "public"."notification_type_enum" RENAME TO "notification_type_enum_old"`, undefined);
|
||||||
|
await queryRunner.query(`CREATE TYPE "notification_type_enum" AS ENUM('follow', 'mention', 'reply', 'renote', 'quote', 'reaction', 'pollVote', 'receiveFollowRequest', 'followRequestAccepted', 'groupInvited', 'app')`, undefined);
|
||||||
|
await queryRunner.query(`ALTER TABLE "notification" ALTER COLUMN "type" TYPE "notification_type_enum" USING "type"::"text"::"notification_type_enum"`, undefined);
|
||||||
|
await queryRunner.query(`DROP TYPE "notification_type_enum_old"`, undefined);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "notification"."type" IS 'The type of the Notification.'`, undefined);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_3b4e96eec8d36a8bbb9d02aa71" ON "notification" ("notifierId") `, undefined);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_33f33cc8ef29d805a97ff4628b" ON "notification" ("type") `, undefined);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_080ab397c379af09b9d2169e5b" ON "notification" ("isRead") `, undefined);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_e22bf6bda77b6adc1fd9e75c8c" ON "notification" ("appAccessTokenId") `, undefined);
|
||||||
|
await queryRunner.query(`ALTER TABLE "notification" ADD CONSTRAINT "FK_3b4e96eec8d36a8bbb9d02aa710" FOREIGN KEY ("notifierId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE NO ACTION`, undefined);
|
||||||
|
await queryRunner.query(`ALTER TABLE "notification" ADD CONSTRAINT "FK_e22bf6bda77b6adc1fd9e75c8c9" FOREIGN KEY ("appAccessTokenId") REFERENCES "access_token"("id") ON DELETE CASCADE ON UPDATE NO ACTION`, undefined);
|
||||||
|
}
|
||||||
|
|
||||||
|
public async down(queryRunner: QueryRunner): Promise<any> {
|
||||||
|
await queryRunner.query(`ALTER TABLE "notification" DROP CONSTRAINT "FK_e22bf6bda77b6adc1fd9e75c8c9"`, undefined);
|
||||||
|
await queryRunner.query(`ALTER TABLE "notification" DROP CONSTRAINT "FK_3b4e96eec8d36a8bbb9d02aa710"`, undefined);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_e22bf6bda77b6adc1fd9e75c8c"`, undefined);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_080ab397c379af09b9d2169e5b"`, undefined);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_33f33cc8ef29d805a97ff4628b"`, undefined);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_3b4e96eec8d36a8bbb9d02aa71"`, undefined);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "notification"."type" IS ''`, undefined);
|
||||||
|
await queryRunner.query(`CREATE TYPE "notification_type_enum_old" AS ENUM('follow', 'mention', 'reply', 'renote', 'quote', 'reaction', 'pollVote', 'receiveFollowRequest', 'followRequestAccepted', 'groupInvited')`, undefined);
|
||||||
|
await queryRunner.query(`ALTER TABLE "notification" ALTER COLUMN "type" TYPE "notification_type_enum_old" USING "type"::"text"::"notification_type_enum_old"`, undefined);
|
||||||
|
await queryRunner.query(`DROP TYPE "notification_type_enum"`, undefined);
|
||||||
|
await queryRunner.query(`ALTER TYPE "notification_type_enum_old" RENAME TO "notification_type_enum"`, undefined);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "notification"."notifierId" IS ''`, undefined);
|
||||||
|
await queryRunner.query(`ALTER TABLE "notification" ALTER COLUMN "notifierId" SET NOT NULL`, undefined);
|
||||||
|
await queryRunner.query(`ALTER TABLE "notification" ADD CONSTRAINT "FK_3b4e96eec8d36a8bbb9d02aa710" FOREIGN KEY ("notifierId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE NO ACTION`, undefined);
|
||||||
|
await queryRunner.query(`ALTER TABLE "notification" DROP COLUMN "appAccessTokenId"`, undefined);
|
||||||
|
await queryRunner.query(`ALTER TABLE "notification" DROP COLUMN "customIcon"`, undefined);
|
||||||
|
await queryRunner.query(`ALTER TABLE "notification" DROP COLUMN "customHeader"`, undefined);
|
||||||
|
await queryRunner.query(`ALTER TABLE "notification" DROP COLUMN "customBody"`, undefined);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
15
migration/1585772678853-ap-url.ts
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
/* tslint:disable:quotemark class-name indent */
|
||||||
|
import {MigrationInterface, QueryRunner} from "typeorm";
|
||||||
|
|
||||||
|
export class apUrl1585772678853 implements MigrationInterface {
|
||||||
|
name = 'apUrl1585772678853'
|
||||||
|
|
||||||
|
public async up(queryRunner: QueryRunner): Promise<any> {
|
||||||
|
await queryRunner.query(`ALTER TABLE "note" ADD "url" character varying(512)`, undefined);
|
||||||
|
}
|
||||||
|
|
||||||
|
public async down(queryRunner: QueryRunner): Promise<any> {
|
||||||
|
await queryRunner.query(`ALTER TABLE "note" DROP COLUMN "url"`, undefined);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
125
package.json
@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "misskey",
|
"name": "misskey",
|
||||||
"author": "syuilo <syuilotan@yahoo.co.jp>",
|
"author": "syuilo <syuilotan@yahoo.co.jp>",
|
||||||
"version": "12.13.0",
|
"version": "12.29.0",
|
||||||
"codename": "indigo",
|
"codename": "indigo",
|
||||||
"repository": {
|
"repository": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
@ -11,17 +11,19 @@
|
|||||||
"private": true,
|
"private": true,
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"start": "node ./index.js",
|
"start": "node ./index.js",
|
||||||
|
"start-product": "cross-env NODE_ENV=production node ./index.js",
|
||||||
"init": "npm run migrate",
|
"init": "npm run migrate",
|
||||||
"ormconfig": "node ./built/ormconfig.js",
|
"ormconfig": "node ./built/ormconfig.js",
|
||||||
"migrate": "ts-node ./node_modules/typeorm/cli.js migration:run",
|
"migrate": "ts-node ./node_modules/typeorm/cli.js migration:run",
|
||||||
"migrateandstart": "npm run migrate && npm run start",
|
"migrateandstart": "npm run migrate && npm run start",
|
||||||
"build": "webpack && gulp build",
|
"build": "webpack && gulp build",
|
||||||
|
"build-product": "cross-env NODE_ENV=production webpack && gulp build",
|
||||||
"webpack": "webpack",
|
"webpack": "webpack",
|
||||||
"watch": "webpack --watch",
|
"watch": "webpack --watch",
|
||||||
"gulp": "gulp build",
|
"gulp": "gulp build",
|
||||||
"clean": "gulp clean",
|
"clean": "gulp clean",
|
||||||
"cleanall": "gulp cleanall",
|
"cleanall": "gulp cleanall",
|
||||||
"lint": "gulp lint",
|
"lint": "tslint 'src/**/*.ts'",
|
||||||
"test": "cross-env TS_NODE_FILES=true gulp test",
|
"test": "cross-env TS_NODE_FILES=true gulp test",
|
||||||
"format": "gulp format"
|
"format": "gulp format"
|
||||||
},
|
},
|
||||||
@ -30,18 +32,18 @@
|
|||||||
"lodash": "^4.17.13"
|
"lodash": "^4.17.13"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@elastic/elasticsearch": "7.6.0",
|
"@elastic/elasticsearch": "7.6.1",
|
||||||
"@fortawesome/fontawesome-svg-core": "1.2.27",
|
"@fortawesome/fontawesome-svg-core": "1.2.28",
|
||||||
"@fortawesome/free-brands-svg-icons": "5.12.1",
|
"@fortawesome/free-brands-svg-icons": "5.13.0",
|
||||||
"@fortawesome/free-regular-svg-icons": "5.12.1",
|
"@fortawesome/free-regular-svg-icons": "5.13.0",
|
||||||
"@fortawesome/free-solid-svg-icons": "5.12.1",
|
"@fortawesome/free-solid-svg-icons": "5.13.0",
|
||||||
"@fortawesome/vue-fontawesome": "0.1.9",
|
"@fortawesome/vue-fontawesome": "0.1.9",
|
||||||
"@juggle/resize-observer": "3.0.2",
|
"@juggle/resize-observer": "3.1.3",
|
||||||
"@koa/cors": "3.0.0",
|
"@koa/cors": "3.0.0",
|
||||||
"@koa/multer": "2.0.2",
|
"@koa/multer": "2.0.2",
|
||||||
"@koa/router": "8.0.8",
|
"@koa/router": "8.0.8",
|
||||||
"@types/bcryptjs": "2.4.2",
|
"@types/bcryptjs": "2.4.2",
|
||||||
"@types/bull": "3.12.0",
|
"@types/bull": "3.12.1",
|
||||||
"@types/cbor": "5.0.0",
|
"@types/cbor": "5.0.0",
|
||||||
"@types/dateformat": "3.0.1",
|
"@types/dateformat": "3.0.1",
|
||||||
"@types/double-ended-queue": "2.1.1",
|
"@types/double-ended-queue": "2.1.1",
|
||||||
@ -51,10 +53,10 @@
|
|||||||
"@types/gulp-rename": "0.0.33",
|
"@types/gulp-rename": "0.0.33",
|
||||||
"@types/gulp-replace": "0.0.31",
|
"@types/gulp-replace": "0.0.31",
|
||||||
"@types/is-url": "1.2.28",
|
"@types/is-url": "1.2.28",
|
||||||
"@types/js-yaml": "3.12.2",
|
"@types/js-yaml": "3.12.3",
|
||||||
"@types/jsdom": "12.2.4",
|
"@types/jsdom": "16.2.0",
|
||||||
"@types/katex": "0.11.0",
|
"@types/katex": "0.11.0",
|
||||||
"@types/koa": "2.11.1",
|
"@types/koa": "2.11.3",
|
||||||
"@types/koa-bodyparser": "4.3.0",
|
"@types/koa-bodyparser": "4.3.0",
|
||||||
"@types/koa-compress": "2.0.9",
|
"@types/koa-compress": "2.0.9",
|
||||||
"@types/koa-cors": "0.0.0",
|
"@types/koa-cors": "0.0.0",
|
||||||
@ -68,8 +70,8 @@
|
|||||||
"@types/koa__router": "8.0.2",
|
"@types/koa__router": "8.0.2",
|
||||||
"@types/lolex": "5.1.0",
|
"@types/lolex": "5.1.0",
|
||||||
"@types/markdown-it": "0.0.9",
|
"@types/markdown-it": "0.0.9",
|
||||||
"@types/mocha": "7.0.1",
|
"@types/mocha": "7.0.2",
|
||||||
"@types/node": "13.7.1",
|
"@types/node": "13.11.0",
|
||||||
"@types/nodemailer": "6.4.0",
|
"@types/nodemailer": "6.4.0",
|
||||||
"@types/nprogress": "0.2.0",
|
"@types/nprogress": "0.2.0",
|
||||||
"@types/oauth": "0.9.1",
|
"@types/oauth": "0.9.1",
|
||||||
@ -80,7 +82,7 @@
|
|||||||
"@types/qrcode": "1.3.4",
|
"@types/qrcode": "1.3.4",
|
||||||
"@types/random-seed": "0.3.3",
|
"@types/random-seed": "0.3.3",
|
||||||
"@types/ratelimiter": "2.1.28",
|
"@types/ratelimiter": "2.1.28",
|
||||||
"@types/redis": "2.8.15",
|
"@types/redis": "2.8.17",
|
||||||
"@types/rename": "1.0.1",
|
"@types/rename": "1.0.1",
|
||||||
"@types/request": "2.48.4",
|
"@types/request": "2.48.4",
|
||||||
"@types/request-promise-native": "1.0.17",
|
"@types/request-promise-native": "1.0.17",
|
||||||
@ -93,26 +95,26 @@
|
|||||||
"@types/systeminformation": "3.54.1",
|
"@types/systeminformation": "3.54.1",
|
||||||
"@types/tinycolor2": "1.4.2",
|
"@types/tinycolor2": "1.4.2",
|
||||||
"@types/tmp": "0.1.0",
|
"@types/tmp": "0.1.0",
|
||||||
"@types/uuid": "3.4.7",
|
"@types/uuid": "7.0.2",
|
||||||
"@types/web-push": "3.3.0",
|
"@types/web-push": "3.3.0",
|
||||||
"@types/webpack": "4.41.6",
|
"@types/webpack": "4.41.10",
|
||||||
"@types/webpack-stream": "3.2.10",
|
"@types/webpack-stream": "3.2.10",
|
||||||
"@types/websocket": "1.0.0",
|
"@types/websocket": "1.0.0",
|
||||||
"@types/ws": "7.2.1",
|
"@types/ws": "7.2.3",
|
||||||
"@typescript-eslint/parser": "2.19.2",
|
"@typescript-eslint/parser": "2.26.0",
|
||||||
"agentkeepalive": "4.1.0",
|
"agentkeepalive": "4.1.0",
|
||||||
"animejs": "3.1.0",
|
"animejs": "3.1.0",
|
||||||
"apexcharts": "3.15.6",
|
"apexcharts": "3.17.1",
|
||||||
"autobind-decorator": "2.4.0",
|
"autobind-decorator": "2.4.0",
|
||||||
"autosize": "4.0.2",
|
"autosize": "4.0.2",
|
||||||
"autwh": "0.1.0",
|
"autwh": "0.1.0",
|
||||||
"aws-sdk": "2.617.0",
|
"aws-sdk": "2.653.0",
|
||||||
"bcryptjs": "2.4.3",
|
"bcryptjs": "2.4.3",
|
||||||
"bull": "3.12.1",
|
"bull": "3.13.0",
|
||||||
"cafy": "15.2.1",
|
"cafy": "15.2.1",
|
||||||
"cbor": "5.0.1",
|
"cbor": "5.0.1",
|
||||||
"chai": "4.2.0",
|
"chai": "4.2.0",
|
||||||
"chalk": "3.0.0",
|
"chalk": "4.0.0",
|
||||||
"chart.js": "2.9.3",
|
"chart.js": "2.9.3",
|
||||||
"cli-highlight": "2.1.4",
|
"cli-highlight": "2.1.4",
|
||||||
"commander": "4.1.1",
|
"commander": "4.1.1",
|
||||||
@ -124,16 +126,16 @@
|
|||||||
"diskusage": "1.1.3",
|
"diskusage": "1.1.3",
|
||||||
"double-ended-queue": "2.1.0-0",
|
"double-ended-queue": "2.1.0-0",
|
||||||
"eslint": "6.8.0",
|
"eslint": "6.8.0",
|
||||||
"eslint-plugin-vue": "6.1.2",
|
"eslint-plugin-vue": "6.2.2",
|
||||||
"eventemitter3": "4.0.0",
|
"eventemitter3": "4.0.0",
|
||||||
"feed": "4.1.0",
|
"feed": "4.1.0",
|
||||||
"fibers": "4.0.2",
|
"fibers": "4.0.2",
|
||||||
"file-type": "14.1.2",
|
"file-type": "14.1.4",
|
||||||
"fluent-ffmpeg": "2.1.2",
|
"fluent-ffmpeg": "2.1.2",
|
||||||
"glob": "7.1.6",
|
"glob": "7.1.6",
|
||||||
"gulp": "4.0.2",
|
"gulp": "4.0.2",
|
||||||
"gulp-clean-css": "4.2.0",
|
"gulp-clean-css": "4.3.0",
|
||||||
"gulp-dart-sass": "0.9.1",
|
"gulp-dart-sass": "1.0.0",
|
||||||
"gulp-mocha": "7.0.2",
|
"gulp-mocha": "7.0.2",
|
||||||
"gulp-rename": "2.0.0",
|
"gulp-rename": "2.0.0",
|
||||||
"gulp-replace": "1.0.0",
|
"gulp-replace": "1.0.0",
|
||||||
@ -143,21 +145,21 @@
|
|||||||
"gulp-typescript": "5.0.1",
|
"gulp-typescript": "5.0.1",
|
||||||
"hard-source-webpack-plugin": "0.13.1",
|
"hard-source-webpack-plugin": "0.13.1",
|
||||||
"html-minifier": "4.0.0",
|
"html-minifier": "4.0.0",
|
||||||
"http-signature": "1.3.1",
|
"http-signature": "1.3.4",
|
||||||
"https-proxy-agent": "5.0.0",
|
"https-proxy-agent": "5.0.0",
|
||||||
"insert-text-at-cursor": "0.3.0",
|
"insert-text-at-cursor": "0.3.0",
|
||||||
"is-root": "2.1.0",
|
"is-root": "2.1.0",
|
||||||
"is-svg": "4.2.1",
|
"is-svg": "4.2.1",
|
||||||
"js-yaml": "3.13.1",
|
"js-yaml": "3.13.1",
|
||||||
"jsdom": "16.1.0",
|
"jsdom": "16.2.2",
|
||||||
"json5": "2.1.1",
|
"json5": "2.1.2",
|
||||||
"json5-loader": "3.0.0",
|
"json5-loader": "3.0.0",
|
||||||
"jsrsasign": "8.0.12",
|
"jsrsasign": "8.0.13",
|
||||||
"katex": "0.11.1",
|
"katex": "0.11.1",
|
||||||
"koa": "2.11.0",
|
"koa": "2.11.0",
|
||||||
"koa-bodyparser": "4.2.1",
|
"koa-bodyparser": "4.3.0",
|
||||||
"koa-compress": "3.0.0",
|
"koa-compress": "3.0.0",
|
||||||
"koa-favicon": "2.0.1",
|
"koa-favicon": "2.1.0",
|
||||||
"koa-json-body": "5.3.0",
|
"koa-json-body": "5.3.0",
|
||||||
"koa-logger": "3.2.1",
|
"koa-logger": "3.2.1",
|
||||||
"koa-mount": "4.0.0",
|
"koa-mount": "4.0.0",
|
||||||
@ -165,23 +167,23 @@
|
|||||||
"koa-slow": "2.1.0",
|
"koa-slow": "2.1.0",
|
||||||
"koa-views": "6.2.1",
|
"koa-views": "6.2.1",
|
||||||
"langmap": "0.0.16",
|
"langmap": "0.0.16",
|
||||||
"loader-utils": "1.2.3",
|
|
||||||
"lolex": "5.1.2",
|
"lolex": "5.1.2",
|
||||||
"lookup-dns-cache": "2.1.0",
|
"lookup-dns-cache": "2.1.0",
|
||||||
"markdown-it": "10.0.0",
|
"markdown-it": "10.0.0",
|
||||||
"mocha": "7.0.1",
|
"markdown-it-anchor": "5.2.7",
|
||||||
|
"mocha": "7.1.1",
|
||||||
"moji": "0.5.1",
|
"moji": "0.5.1",
|
||||||
"ms": "2.1.2",
|
"ms": "2.1.2",
|
||||||
"multer": "1.4.2",
|
"multer": "1.4.2",
|
||||||
"nested-property": "1.0.4",
|
"nested-property": "1.0.4",
|
||||||
"node-fetch": "2.6.0",
|
"node-fetch": "2.6.0",
|
||||||
"nodemailer": "6.4.2",
|
"nodemailer": "6.4.6",
|
||||||
"nprogress": "0.2.0",
|
"nprogress": "0.2.0",
|
||||||
"object-assign-deep": "0.4.0",
|
"object-assign-deep": "0.4.0",
|
||||||
"os-utils": "0.0.14",
|
"os-utils": "0.0.14",
|
||||||
"parse5": "5.1.1",
|
"parse5": "5.1.1",
|
||||||
"parsimmon": "1.13.0",
|
"parsimmon": "1.13.0",
|
||||||
"pg": "7.18.1",
|
"pg": "8.0.0",
|
||||||
"portal-vue": "2.1.7",
|
"portal-vue": "2.1.7",
|
||||||
"portscanner": "2.2.0",
|
"portscanner": "2.2.0",
|
||||||
"postcss-loader": "3.0.0",
|
"postcss-loader": "3.0.0",
|
||||||
@ -192,11 +194,11 @@
|
|||||||
"promise-sequential": "1.1.1",
|
"promise-sequential": "1.1.1",
|
||||||
"pug": "2.0.4",
|
"pug": "2.0.4",
|
||||||
"punycode": "2.1.1",
|
"punycode": "2.1.1",
|
||||||
"pureimage": "0.1.6",
|
"pureimage": "0.2.1",
|
||||||
"qrcode": "1.4.4",
|
"qrcode": "1.4.4",
|
||||||
"random-seed": "0.3.0",
|
"random-seed": "0.3.0",
|
||||||
"randomcolor": "0.5.4",
|
"randomcolor": "0.5.4",
|
||||||
"ratelimiter": "3.4.0",
|
"ratelimiter": "3.4.1",
|
||||||
"recaptcha-promise": "0.1.3",
|
"recaptcha-promise": "0.1.3",
|
||||||
"reconnecting-websocket": "4.4.0",
|
"reconnecting-websocket": "4.4.0",
|
||||||
"redis": "3.0.2",
|
"redis": "3.0.2",
|
||||||
@ -210,58 +212,57 @@
|
|||||||
"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.25.0",
|
"sass": "1.26.3",
|
||||||
"sass-loader": "8.0.2",
|
"sass-loader": "8.0.2",
|
||||||
"seedrandom": "3.0.5",
|
"seedrandom": "3.0.5",
|
||||||
"sharp": "0.24.0",
|
"sharp": "0.25.2",
|
||||||
"showdown": "1.9.1",
|
"showdown": "1.9.1",
|
||||||
"showdown-highlightjs-extension": "0.1.2",
|
"showdown-highlightjs-extension": "0.1.2",
|
||||||
"speakeasy": "2.0.0",
|
"speakeasy": "2.0.0",
|
||||||
"stringz": "2.0.0",
|
"stringz": "2.1.0",
|
||||||
"style-loader": "1.1.3",
|
"style-loader": "1.1.3",
|
||||||
"summaly": "2.3.1",
|
"summaly": "2.3.1",
|
||||||
"syslog-pro": "1.0.0",
|
"syslog-pro": "1.0.0",
|
||||||
"systeminformation": "4.21.2",
|
"systeminformation": "4.23.1",
|
||||||
"syuilo-password-strength": "0.0.1",
|
"syuilo-password-strength": "0.0.1",
|
||||||
"terser-webpack-plugin": "2.3.4",
|
"terser-webpack-plugin": "2.3.5",
|
||||||
"textarea-caret": "3.1.0",
|
"textarea-caret": "3.1.0",
|
||||||
"three": "0.113.2",
|
"three": "0.115.0",
|
||||||
"tinycolor2": "1.4.1",
|
"tinycolor2": "1.4.1",
|
||||||
"tmp": "0.1.0",
|
"tmp": "0.1.0",
|
||||||
"ts-loader": "6.2.1",
|
"ts-loader": "6.2.2",
|
||||||
"ts-node": "8.6.2",
|
"ts-node": "8.8.1",
|
||||||
"tslint": "6.0.0",
|
"tslint": "6.1.1",
|
||||||
"tslint-sonarts": "1.9.0",
|
"tslint-sonarts": "1.9.0",
|
||||||
"typeorm": "0.2.22",
|
"typeorm": "0.2.24",
|
||||||
"typescript": "3.7.5",
|
"typescript": "3.8.3",
|
||||||
"ulid": "2.3.0",
|
"ulid": "2.3.0",
|
||||||
"url-loader": "3.0.0",
|
"url-loader": "3.0.0",
|
||||||
"uuid": "3.4.0",
|
"uuid": "7.0.3",
|
||||||
"v-animate-css": "0.0.3",
|
"v-animate-css": "0.0.3",
|
||||||
"v-debounce": "0.1.2",
|
"v-debounce": "0.1.2",
|
||||||
"vue": "2.6.11",
|
"vue": "2.6.11",
|
||||||
"vue-color": "2.7.0",
|
"vue-color": "2.7.1",
|
||||||
"vue-content-loading": "1.6.0",
|
"vue-content-loading": "1.6.0",
|
||||||
"vue-cropperjs": "4.0.1",
|
"vue-cropperjs": "4.0.1",
|
||||||
"vue-i18n": "8.15.3",
|
"vue-i18n": "8.16.0",
|
||||||
"vue-json-pretty": "1.6.3",
|
"vue-json-pretty": "1.6.3",
|
||||||
"vue-loader": "15.9.0",
|
"vue-loader": "15.9.1",
|
||||||
"vue-marquee-text-component": "1.1.1",
|
"vue-marquee-text-component": "1.1.1",
|
||||||
"vue-meta": "2.3.2",
|
"vue-meta": "2.3.3",
|
||||||
"vue-prism-component": "1.1.1",
|
"vue-prism-component": "1.1.1",
|
||||||
"vue-router": "3.1.5",
|
"vue-router": "3.1.6",
|
||||||
"vue-sequential-entrance": "1.1.3",
|
|
||||||
"vue-style-loader": "4.1.2",
|
"vue-style-loader": "4.1.2",
|
||||||
"vue-svg-inline-loader": "1.4.5",
|
"vue-svg-inline-loader": "1.5.0",
|
||||||
"vue-template-compiler": "2.6.11",
|
"vue-template-compiler": "2.6.11",
|
||||||
"vuedraggable": "2.23.2",
|
"vuedraggable": "2.23.2",
|
||||||
"vuex": "3.1.2",
|
"vuex": "3.1.3",
|
||||||
"vuex-persistedstate": "2.7.1",
|
"vuex-persistedstate": "3.0.1",
|
||||||
"web-push": "3.4.3",
|
"web-push": "3.4.3",
|
||||||
"webpack": "4.41.6",
|
"webpack": "4.42.1",
|
||||||
"webpack-cli": "3.3.11",
|
"webpack-cli": "3.3.11",
|
||||||
"websocket": "1.0.31",
|
"websocket": "1.0.31",
|
||||||
"ws": "7.2.1",
|
"ws": "7.2.3",
|
||||||
"xev": "2.0.1"
|
"xev": "2.0.1"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
|
9
src/@types/jsrsasign.d.ts
vendored
@ -171,6 +171,7 @@ declare module 'jsrsasign' {
|
|||||||
|
|
||||||
public static getTLVbyList(h: ASN1S, currentIndex: Idx<ASN1ObjectString>, nthList: Mutable<Nth[]>, checkingTag?: string): ASN1TLV;
|
public static getTLVbyList(h: ASN1S, currentIndex: Idx<ASN1ObjectString>, nthList: Mutable<Nth[]>, checkingTag?: string): ASN1TLV;
|
||||||
|
|
||||||
|
// tslint:disable-next-line:bool-param-default
|
||||||
public static getVbyList(h: ASN1S, currentIndex: Idx<ASN1ObjectString>, nthList: Mutable<Nth[]>, checkingTag?: string, removeUnusedbits?: boolean): ASN1V;
|
public static getVbyList(h: ASN1S, currentIndex: Idx<ASN1ObjectString>, nthList: Mutable<Nth[]>, checkingTag?: string, removeUnusedbits?: boolean): ASN1V;
|
||||||
|
|
||||||
public static hextooidstr(hex: ASN1OIDV): OID;
|
public static hextooidstr(hex: ASN1OIDV): OID;
|
||||||
@ -620,9 +621,7 @@ declare module 'jsrsasign' {
|
|||||||
|
|
||||||
public encrypt(text: string): HexString | null;
|
public encrypt(text: string): HexString | null;
|
||||||
|
|
||||||
public encryptOAEP(text: string, hash?: string, hashLen?: number): HexString | null;
|
public encryptOAEP(text: string, hash?: string | ((s: string) => string), hashLen?: number): HexString | null;
|
||||||
|
|
||||||
public encryptOAEP(text: string, hash?: (s: string) => string, hashLen?: number): HexString | null;
|
|
||||||
|
|
||||||
//// RSA PRIVATE
|
//// RSA PRIVATE
|
||||||
|
|
||||||
@ -638,9 +637,7 @@ declare module 'jsrsasign' {
|
|||||||
|
|
||||||
public decrypt(ctext: HexString): string;
|
public decrypt(ctext: HexString): string;
|
||||||
|
|
||||||
public decryptOAEP(ctext: HexString, hash?: string, hashLen?: number): string | null;
|
public decryptOAEP(ctext: HexString, hash?: string | ((s: string) => string), hashLen?: number): string | null;
|
||||||
|
|
||||||
public encryptOAEP(ctext: HexString, hash?: (s: string) => string, hashLen?: number): string | null;
|
|
||||||
|
|
||||||
//// RSA PEM
|
//// RSA PEM
|
||||||
|
|
||||||
|
@ -99,7 +99,7 @@ async function isPortAvailable(port: number): Promise<boolean> {
|
|||||||
function showEnvironment(): void {
|
function showEnvironment(): void {
|
||||||
const env = process.env.NODE_ENV;
|
const env = process.env.NODE_ENV;
|
||||||
const logger = bootLogger.createSubLogger('env');
|
const logger = bootLogger.createSubLogger('env');
|
||||||
logger.info(typeof env == 'undefined' ? 'NODE_ENV is not set' : `NODE_ENV: ${env}`);
|
logger.info(typeof env === 'undefined' ? 'NODE_ENV is not set' : `NODE_ENV: ${env}`);
|
||||||
|
|
||||||
if (env !== 'production') {
|
if (env !== 'production') {
|
||||||
logger.warn('The environment is not in production mode.');
|
logger.warn('The environment is not in production mode.');
|
||||||
|
@ -43,28 +43,29 @@
|
|||||||
<button class="item _button account" @click="openAccountMenu" v-if="$store.getters.isSignedIn">
|
<button class="item _button account" @click="openAccountMenu" v-if="$store.getters.isSignedIn">
|
||||||
<mk-avatar :user="$store.state.i" class="avatar"/><mk-acct class="text" :user="$store.state.i"/>
|
<mk-avatar :user="$store.state.i" class="avatar"/><mk-acct class="text" :user="$store.state.i"/>
|
||||||
</button>
|
</button>
|
||||||
<div class="divider"></div>
|
|
||||||
<button class="item _button index active" @click="top()" v-if="$route.name === 'index'">
|
<button class="item _button index active" @click="top()" v-if="$route.name === 'index'">
|
||||||
<fa :icon="faHome" fixed-width/><span class="text">{{ $store.getters.isSignedIn ? $t('timeline') : $t('home') }}</span>
|
<fa :icon="faHome" fixed-width/><span class="text">{{ $store.getters.isSignedIn ? $t('timeline') : $t('home') }}</span>
|
||||||
</button>
|
</button>
|
||||||
<router-link class="item index" active-class="active" to="/" exact v-else>
|
<router-link class="item index" active-class="active" to="/" exact v-else>
|
||||||
<fa :icon="faHome" fixed-width/><span class="text">{{ $store.getters.isSignedIn ? $t('timeline') : $t('home') }}</span>
|
<fa :icon="faHome" fixed-width/><span class="text">{{ $store.getters.isSignedIn ? $t('timeline') : $t('home') }}</span>
|
||||||
</router-link>
|
</router-link>
|
||||||
<button class="item _button notifications" @click="notificationsOpen = !notificationsOpen" ref="notificationButton" v-if="$store.getters.isSignedIn">
|
<template v-if="$store.getters.isSignedIn">
|
||||||
<fa :icon="faBell" fixed-width/><span class="text">{{ $t('notifications') }}</span>
|
<router-link class="item notifications" active-class="active" to="/my/notifications" ref="notificationButton">
|
||||||
<i v-if="$store.state.i.hasUnreadNotification"><fa :icon="faCircle"/></i>
|
<fa :icon="faBell" fixed-width/><span class="text">{{ $t('notifications') }}</span>
|
||||||
</button>
|
<i v-if="$store.state.i.hasUnreadNotification"><fa :icon="faCircle"/></i>
|
||||||
<router-link class="item" active-class="active" to="/my/messaging" v-if="$store.getters.isSignedIn">
|
</router-link>
|
||||||
<fa :icon="faComments" fixed-width/><span class="text">{{ $t('messaging') }}</span>
|
<router-link class="item" active-class="active" to="/my/messaging">
|
||||||
<i v-if="$store.state.i.hasUnreadMessagingMessage"><fa :icon="faCircle"/></i>
|
<fa :icon="faComments" fixed-width/><span class="text">{{ $t('messaging') }}</span>
|
||||||
</router-link>
|
<i v-if="$store.state.i.hasUnreadMessagingMessage"><fa :icon="faCircle"/></i>
|
||||||
<router-link class="item" active-class="active" to="/my/drive" v-if="$store.getters.isSignedIn">
|
</router-link>
|
||||||
<fa :icon="faCloud" fixed-width/><span class="text">{{ $t('drive') }}</span>
|
<router-link class="item" active-class="active" to="/my/drive">
|
||||||
</router-link>
|
<fa :icon="faCloud" fixed-width/><span class="text">{{ $t('drive') }}</span>
|
||||||
<router-link class="item" active-class="active" to="/my/follow-requests" v-if="$store.getters.isSignedIn && $store.state.i.isLocked">
|
</router-link>
|
||||||
<fa :icon="faUserClock" fixed-width/><span class="text">{{ $t('followRequests') }}</span>
|
<router-link class="item" active-class="active" to="/my/follow-requests" v-if="$store.state.i.isLocked">
|
||||||
<i v-if="$store.state.i.hasPendingReceivedFollowRequest"><fa :icon="faCircle"/></i>
|
<fa :icon="faUserClock" fixed-width/><span class="text">{{ $t('followRequests') }}</span>
|
||||||
</router-link>
|
<i v-if="$store.state.i.hasPendingReceivedFollowRequest"><fa :icon="faCircle"/></i>
|
||||||
|
</router-link>
|
||||||
|
</template>
|
||||||
<div class="divider"></div>
|
<div class="divider"></div>
|
||||||
<router-link class="item" active-class="active" to="/featured">
|
<router-link class="item" active-class="active" to="/featured">
|
||||||
<fa :icon="faFireAlt" fixed-width/><span class="text">{{ $t('featured') }}</span>
|
<fa :icon="faFireAlt" fixed-width/><span class="text">{{ $t('featured') }}</span>
|
||||||
@ -87,7 +88,7 @@
|
|||||||
<fa :icon="faEllipsisH" fixed-width/><span class="text">{{ $t('more') }}</span>
|
<fa :icon="faEllipsisH" fixed-width/><span class="text">{{ $t('more') }}</span>
|
||||||
<i v-if="$store.getters.isSignedIn && ($store.state.i.hasUnreadMentions || $store.state.i.hasUnreadSpecifiedNotes)"><fa :icon="faCircle"/></i>
|
<i v-if="$store.getters.isSignedIn && ($store.state.i.hasUnreadMentions || $store.state.i.hasUnreadSpecifiedNotes)"><fa :icon="faCircle"/></i>
|
||||||
</button>
|
</button>
|
||||||
<router-link class="item" active-class="active" to="/settings">
|
<router-link class="item" active-class="active" to="/preferences">
|
||||||
<fa :icon="faCog" fixed-width/><span class="text">{{ $t('settings') }}</span>
|
<fa :icon="faCog" fixed-width/><span class="text">{{ $t('settings') }}</span>
|
||||||
</router-link>
|
</router-link>
|
||||||
</div>
|
</div>
|
||||||
@ -143,15 +144,13 @@
|
|||||||
<button class="button nav _button" @click="showNav = true" ref="navButton"><fa :icon="faBars"/><i v-if="$store.getters.isSignedIn && ($store.state.i.hasUnreadSpecifiedNotes || $store.state.i.hasPendingReceivedFollowRequest || $store.state.i.hasUnreadMessagingMessage || $store.state.i.hasUnreadAnnouncement)"><fa :icon="faCircle"/></i></button>
|
<button class="button nav _button" @click="showNav = true" ref="navButton"><fa :icon="faBars"/><i v-if="$store.getters.isSignedIn && ($store.state.i.hasUnreadSpecifiedNotes || $store.state.i.hasPendingReceivedFollowRequest || $store.state.i.hasUnreadMessagingMessage || $store.state.i.hasUnreadAnnouncement)"><fa :icon="faCircle"/></i></button>
|
||||||
<button v-if="$route.name === 'index'" class="button home _button" @click="top()"><fa :icon="faHome"/></button>
|
<button v-if="$route.name === 'index'" class="button home _button" @click="top()"><fa :icon="faHome"/></button>
|
||||||
<button v-else class="button home _button" @click="$router.push('/')"><fa :icon="faHome"/></button>
|
<button v-else class="button home _button" @click="$router.push('/')"><fa :icon="faHome"/></button>
|
||||||
<button v-if="$store.getters.isSignedIn" class="button notifications _button" @click="notificationsOpen = !notificationsOpen" ref="notificationButton2"><fa :icon="notificationsOpen ? faTimes : faBell"/><i v-if="$store.state.i.hasUnreadNotification"><fa :icon="faCircle"/></i></button>
|
<button v-if="$store.getters.isSignedIn" class="button notifications _button" @click="$router.push('/my/notifications')" ref="notificationButton2"><fa :icon="faBell"/><i v-if="$store.state.i.hasUnreadNotification"><fa :icon="faCircle"/></i></button>
|
||||||
<button v-if="$store.getters.isSignedIn" class="button post _buttonPrimary" @click="post()"><fa :icon="faPencilAlt"/></button>
|
<button v-if="$store.getters.isSignedIn" class="button post _buttonPrimary" @click="post()"><fa :icon="faPencilAlt"/></button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<button v-if="$store.getters.isSignedIn" class="post _buttonPrimary" @click="post()"><fa :icon="faPencilAlt"/></button>
|
<button v-if="$store.getters.isSignedIn" class="post _buttonPrimary" @click="post()"><fa :icon="faPencilAlt"/></button>
|
||||||
|
|
||||||
<transition name="zoom-in-top">
|
<stream-indicator v-if="$store.getters.isSignedIn"/>
|
||||||
<x-notifications v-if="notificationsOpen" class="notifications" ref="notifications"/>
|
|
||||||
</transition>
|
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
@ -164,7 +163,6 @@ import { v4 as uuid } from 'uuid';
|
|||||||
import i18n from './i18n';
|
import i18n from './i18n';
|
||||||
import { host, instanceName } from './config';
|
import { host, instanceName } from './config';
|
||||||
import { search } from './scripts/search';
|
import { search } from './scripts/search';
|
||||||
import contains from './scripts/contains';
|
|
||||||
import MkToast from './components/toast.vue';
|
import MkToast from './components/toast.vue';
|
||||||
|
|
||||||
const DESKTOP_THRESHOLD = 1100;
|
const DESKTOP_THRESHOLD = 1100;
|
||||||
@ -174,7 +172,6 @@ export default Vue.extend({
|
|||||||
|
|
||||||
components: {
|
components: {
|
||||||
XClock: () => import('./components/header-clock.vue').then(m => m.default),
|
XClock: () => import('./components/header-clock.vue').then(m => m.default),
|
||||||
XNotifications: () => import('./components/notifications.vue').then(m => m.default),
|
|
||||||
MkButton: () => import('./components/ui/button.vue').then(m => m.default),
|
MkButton: () => import('./components/ui/button.vue').then(m => m.default),
|
||||||
XDraggable: () => import('vuedraggable'),
|
XDraggable: () => import('vuedraggable'),
|
||||||
},
|
},
|
||||||
@ -185,7 +182,6 @@ export default Vue.extend({
|
|||||||
pageKey: 0,
|
pageKey: 0,
|
||||||
showNav: false,
|
showNav: false,
|
||||||
searching: false,
|
searching: false,
|
||||||
notificationsOpen: false,
|
|
||||||
accounts: [],
|
accounts: [],
|
||||||
lists: [],
|
lists: [],
|
||||||
connection: null,
|
connection: null,
|
||||||
@ -194,7 +190,6 @@ export default Vue.extend({
|
|||||||
widgetsEditMode: false,
|
widgetsEditMode: false,
|
||||||
isDesktop: window.innerWidth >= DESKTOP_THRESHOLD,
|
isDesktop: window.innerWidth >= DESKTOP_THRESHOLD,
|
||||||
canBack: false,
|
canBack: false,
|
||||||
disconnectedDialog: null as Promise<void> | null,
|
|
||||||
wallpaper: localStorage.getItem('wallpaper') != null,
|
wallpaper: localStorage.getItem('wallpaper') != null,
|
||||||
faGripVertical, faChevronLeft, faComments, faHashtag, faBroadcastTower, faFireAlt, faEllipsisH, faPencilAlt, faBars, faTimes, faBell, faSearch, faUserCog, faCog, faUser, faHome, faStar, faCircle, faAt, faEnvelope, faListUl, faPlus, faUserClock, faLaugh, faUsers, faTachometerAlt, faExchangeAlt, faGlobe, faChartBar, faCloud, faServer
|
faGripVertical, faChevronLeft, faComments, faHashtag, faBroadcastTower, faFireAlt, faEllipsisH, faPencilAlt, faBars, faTimes, faBell, faSearch, faUserCog, faCog, faUser, faHome, faStar, faCircle, faAt, faEnvelope, faListUl, faPlus, faUserClock, faLaugh, faUsers, faTachometerAlt, faExchangeAlt, faGlobe, faChartBar, faCloud, faServer
|
||||||
};
|
};
|
||||||
@ -218,23 +213,10 @@ export default Vue.extend({
|
|||||||
watch:{
|
watch:{
|
||||||
$route(to, from) {
|
$route(to, from) {
|
||||||
this.pageKey++;
|
this.pageKey++;
|
||||||
this.notificationsOpen = false;
|
|
||||||
this.showNav = false;
|
this.showNav = false;
|
||||||
this.canBack = (window.history.length > 0 && !['index'].includes(to.name));
|
this.canBack = (window.history.length > 0 && !['index'].includes(to.name));
|
||||||
},
|
},
|
||||||
|
|
||||||
notificationsOpen(open) {
|
|
||||||
if (open) {
|
|
||||||
for (const el of Array.from(document.querySelectorAll('*'))) {
|
|
||||||
el.addEventListener('mousedown', this.onMousedown);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
for (const el of Array.from(document.querySelectorAll('*'))) {
|
|
||||||
el.removeEventListener('mousedown', this.onMousedown);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
isDesktop() {
|
isDesktop() {
|
||||||
if (this.isDesktop) this.adjustWidgetsWidth();
|
if (this.isDesktop) this.adjustWidgetsWidth();
|
||||||
}
|
}
|
||||||
@ -258,37 +240,16 @@ export default Vue.extend({
|
|||||||
}]);
|
}]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
this.$root.stream.on('_disconnected_', () => {
|
|
||||||
if (this.disconnectedDialog) return;
|
|
||||||
if (this.$store.state.device.autoReload) {
|
|
||||||
location.reload();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
setTimeout(() => {
|
|
||||||
if (this.$root.stream.state !== 'reconnecting') return;
|
|
||||||
|
|
||||||
this.disconnectedDialog = this.$root.dialog({
|
|
||||||
type: 'warning',
|
|
||||||
showCancelButton: true,
|
|
||||||
title: this.$t('disconnectedFromServer'),
|
|
||||||
text: this.$t('reloadConfirm'),
|
|
||||||
}).then(({ canceled }) => {
|
|
||||||
if (!canceled) {
|
|
||||||
location.reload();
|
|
||||||
}
|
|
||||||
this.disconnectedDialog = null;
|
|
||||||
});
|
|
||||||
}, 150)
|
|
||||||
});
|
|
||||||
},
|
},
|
||||||
|
|
||||||
mounted() {
|
mounted() {
|
||||||
if (this.isDesktop) this.adjustWidgetsWidth();
|
if (this.isDesktop) this.adjustWidgetsWidth();
|
||||||
|
|
||||||
const adjustTitlePosition = () => {
|
const adjustTitlePosition = () => {
|
||||||
this.$refs.title.style.left = (this.$refs.main.getBoundingClientRect().left - this.$refs.nav.offsetWidth) + 'px';
|
const left = this.$refs.main.getBoundingClientRect().left - this.$refs.nav.offsetWidth;
|
||||||
|
if (left >= 0) {
|
||||||
|
this.$refs.title.style.left = left + 'px';
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
adjustTitlePosition();
|
adjustTitlePosition();
|
||||||
@ -349,7 +310,7 @@ export default Vue.extend({
|
|||||||
title: this.$t('search'),
|
title: this.$t('search'),
|
||||||
input: true
|
input: true
|
||||||
}).then(async ({ canceled, result: query }) => {
|
}).then(async ({ canceled, result: query }) => {
|
||||||
if (canceled || query == null || query == '') return;
|
if (canceled || query == null || query === '') return;
|
||||||
|
|
||||||
this.searching = true;
|
this.searching = true;
|
||||||
search(this, query).finally(() => {
|
search(this, query).finally(() => {
|
||||||
@ -359,7 +320,7 @@ export default Vue.extend({
|
|||||||
},
|
},
|
||||||
|
|
||||||
searchKeypress(e) {
|
searchKeypress(e) {
|
||||||
if (e.keyCode == 13) {
|
if (e.keyCode === 13) {
|
||||||
this.searchWait = true;
|
this.searchWait = true;
|
||||||
search(this, this.searchQuery).finally(() => {
|
search(this, this.searchQuery).finally(() => {
|
||||||
this.searchWait = false;
|
this.searchWait = false;
|
||||||
@ -571,22 +532,17 @@ export default Vue.extend({
|
|||||||
|
|
||||||
onNotification(notification) {
|
onNotification(notification) {
|
||||||
// TODO: ユーザーが画面を見てないと思われるとき(ブラウザやタブがアクティブじゃないなど)は送信しない
|
// TODO: ユーザーが画面を見てないと思われるとき(ブラウザやタブがアクティブじゃないなど)は送信しない
|
||||||
this.$root.stream.send('readNotification', {
|
if (true) {
|
||||||
id: notification.id
|
this.$root.stream.send('readNotification', {
|
||||||
});
|
id: notification.id
|
||||||
|
});
|
||||||
|
|
||||||
this.$root.new(MkToast, {
|
this.$root.new(MkToast, {
|
||||||
notification
|
notification
|
||||||
});
|
});
|
||||||
},
|
}
|
||||||
|
|
||||||
onMousedown(e) {
|
this.$root.sound('notification');
|
||||||
e.preventDefault();
|
|
||||||
if (!contains(this.$refs.notifications.$el, e.target) &&
|
|
||||||
!contains(this.$refs.notificationButton, e.target) &&
|
|
||||||
!contains(this.$refs.notificationButton2, e.target)
|
|
||||||
) this.notificationsOpen = false;
|
|
||||||
return false;
|
|
||||||
},
|
},
|
||||||
|
|
||||||
widgetFunc(id) {
|
widgetFunc(id) {
|
||||||
@ -638,30 +594,6 @@ export default Vue.extend({
|
|||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="scss" scoped>
|
<style lang="scss" scoped>
|
||||||
.header-enter-active, .header-leave-active {
|
|
||||||
transition: opacity 0.5s, transform 0.5s !important;
|
|
||||||
}
|
|
||||||
.header-enter {
|
|
||||||
opacity: 0;
|
|
||||||
transform: scale(0.9);
|
|
||||||
}
|
|
||||||
.header-leave-to {
|
|
||||||
opacity: 0;
|
|
||||||
transform: scale(0.9);
|
|
||||||
}
|
|
||||||
|
|
||||||
.page-enter-active, .page-leave-active {
|
|
||||||
transition: opacity 0.5s, transform 0.5s !important;
|
|
||||||
}
|
|
||||||
.page-enter {
|
|
||||||
opacity: 0;
|
|
||||||
transform: translateY(-32px);
|
|
||||||
}
|
|
||||||
.page-leave-to {
|
|
||||||
opacity: 0;
|
|
||||||
transform: translateY(32px);
|
|
||||||
}
|
|
||||||
|
|
||||||
.nav-enter-active,
|
.nav-enter-active,
|
||||||
.nav-leave-active {
|
.nav-leave-active {
|
||||||
opacity: 1;
|
opacity: 1;
|
||||||
@ -687,12 +619,12 @@ export default Vue.extend({
|
|||||||
.mk-app {
|
.mk-app {
|
||||||
$header-height: 60px;
|
$header-height: 60px;
|
||||||
$nav-width: 250px;
|
$nav-width: 250px;
|
||||||
$nav-icon-only-width: 74px;
|
$nav-icon-only-width: 80px;
|
||||||
$main-width: 700px;
|
$main-width: 650px;
|
||||||
$ui-font-size: 1em;
|
$ui-font-size: 1em;
|
||||||
$nav-icon-only-threshold: 1300px;
|
$nav-icon-only-threshold: 1300px;
|
||||||
$nav-hide-threshold: 700px;
|
$nav-hide-threshold: 650px;
|
||||||
$side-hide-threshold: 1100px;
|
$side-hide-threshold: 1070px;
|
||||||
|
|
||||||
min-height: 100vh;
|
min-height: 100vh;
|
||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
@ -887,8 +819,6 @@ export default Vue.extend({
|
|||||||
z-index: 1001;
|
z-index: 1001;
|
||||||
width: $nav-width;
|
width: $nav-width;
|
||||||
height: 100vh;
|
height: 100vh;
|
||||||
padding: 16px 0;
|
|
||||||
padding-bottom: calc(3.7rem + 24px);
|
|
||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
overflow: auto;
|
overflow: auto;
|
||||||
background: var(--navBg);
|
background: var(--navBg);
|
||||||
@ -901,13 +831,21 @@ export default Vue.extend({
|
|||||||
|
|
||||||
@media (max-width: $nav-icon-only-threshold) and (min-width: $nav-hide-threshold + 1px) {
|
@media (max-width: $nav-icon-only-threshold) and (min-width: $nav-hide-threshold + 1px) {
|
||||||
width: $nav-icon-only-width;
|
width: $nav-icon-only-width;
|
||||||
padding: 8px 0;
|
|
||||||
padding-bottom: calc(3.7rem + 24px);
|
|
||||||
|
|
||||||
> .divider {
|
> .divider {
|
||||||
margin: 8px auto;
|
margin: 8px auto;
|
||||||
width: calc(100% - 32px);
|
width: calc(100% - 32px);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
> .item {
|
||||||
|
&:first-child {
|
||||||
|
margin-bottom: 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
&:last-child {
|
||||||
|
margin-top: 8px;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
> .item {
|
> .item {
|
||||||
@ -957,15 +895,26 @@ export default Vue.extend({
|
|||||||
color: var(--navActive);
|
color: var(--navActive);
|
||||||
}
|
}
|
||||||
|
|
||||||
&:last-child {
|
&:first-child, &:last-child {
|
||||||
position: fixed;
|
position: sticky;
|
||||||
bottom: 0;
|
z-index: 1;
|
||||||
width: inherit;
|
|
||||||
padding-top: 8px;
|
padding-top: 8px;
|
||||||
padding-bottom: 8px;
|
padding-bottom: 8px;
|
||||||
background: var(--navBg);
|
background: var(--wboyroyc);
|
||||||
|
-webkit-backdrop-filter: blur(8px);
|
||||||
|
backdrop-filter: blur(8px);
|
||||||
|
}
|
||||||
|
|
||||||
|
&:first-child {
|
||||||
|
top: 0;
|
||||||
|
margin-bottom: 16px;
|
||||||
|
border-bottom: solid 1px var(--divider);
|
||||||
|
}
|
||||||
|
|
||||||
|
&:last-child {
|
||||||
|
bottom: 0;
|
||||||
|
margin-top: 16px;
|
||||||
border-top: solid 1px var(--divider);
|
border-top: solid 1px var(--divider);
|
||||||
border-right: solid 1px var(--divider);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@media (max-width: $nav-icon-only-threshold) and (min-width: $nav-hide-threshold + 1px) {
|
@media (max-width: $nav-icon-only-threshold) and (min-width: $nav-hide-threshold + 1px) {
|
||||||
@ -1011,17 +960,25 @@ export default Vue.extend({
|
|||||||
> main {
|
> main {
|
||||||
width: $main-width;
|
width: $main-width;
|
||||||
min-width: $main-width;
|
min-width: $main-width;
|
||||||
|
box-shadow: 1px 0 0 0 var(--divider), -1px 0 0 0 var(--divider);
|
||||||
|
|
||||||
@media (max-width: $side-hide-threshold) {
|
@media (max-width: $side-hide-threshold) {
|
||||||
min-width: 0;
|
min-width: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
> .content {
|
> .content {
|
||||||
padding: 16px;
|
> * {
|
||||||
box-sizing: border-box;
|
&:not(.full) {
|
||||||
|
padding: var(--margin) 0;
|
||||||
|
}
|
||||||
|
|
||||||
@media (max-width: 500px) {
|
&:not(.naked) {
|
||||||
padding: 8px;
|
background: var(--pageBg);
|
||||||
|
}
|
||||||
|
|
||||||
|
&.naked {
|
||||||
|
background: var(--bg);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1059,6 +1016,7 @@ export default Vue.extend({
|
|||||||
|
|
||||||
> .widgets {
|
> .widgets {
|
||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
|
margin-left: var(--margin);
|
||||||
|
|
||||||
@media (max-width: $side-hide-threshold) {
|
@media (max-width: $side-hide-threshold) {
|
||||||
display: none;
|
display: none;
|
||||||
@ -1211,32 +1169,5 @@ export default Vue.extend({
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
> .notifications {
|
|
||||||
position: fixed;
|
|
||||||
top: 32px;
|
|
||||||
left: 0;
|
|
||||||
right: 0;
|
|
||||||
margin: 0 auto;
|
|
||||||
z-index: 10001;
|
|
||||||
width: 350px;
|
|
||||||
height: 400px;
|
|
||||||
background: var(--vocsgcxy);
|
|
||||||
-webkit-backdrop-filter: blur(12px);
|
|
||||||
backdrop-filter: blur(12px);
|
|
||||||
border-radius: 6px;
|
|
||||||
box-shadow: 0 3px 12px rgba(27, 31, 35, 0.15);
|
|
||||||
overflow: hidden;
|
|
||||||
|
|
||||||
@media (max-width: 800px) {
|
|
||||||
width: 320px;
|
|
||||||
height: 350px;
|
|
||||||
}
|
|
||||||
|
|
||||||
@media (max-width: 500px) {
|
|
||||||
width: 290px;
|
|
||||||
height: 310px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
BIN
src/client/assets/fedi.jpg
Normal file
After Width: | Height: | Size: 76 KiB |
@ -18,7 +18,7 @@
|
|||||||
</style>
|
</style>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<redoc spec-url='/api.json'></redoc>
|
<redoc spec-url="/api.json" expand-responses="200" expand-single-schema-field="true"></redoc>
|
||||||
<script src="https://cdn.jsdelivr.net/npm/redoc@next/bundles/redoc.standalone.js"> </script>
|
<script src="https://cdn.jsdelivr.net/npm/redoc@next/bundles/redoc.standalone.js"> </script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
BIN
src/client/assets/sounds/aisha/1.mp3
Normal file
BIN
src/client/assets/sounds/aisha/2.mp3
Normal file
BIN
src/client/assets/sounds/aisha/3.mp3
Normal file
BIN
src/client/assets/sounds/noizenecio/kick_gaba.mp3
Normal file
BIN
src/client/assets/sounds/syuilo/down.mp3
Normal file
BIN
src/client/assets/sounds/syuilo/poi1.mp3
Normal file
BIN
src/client/assets/sounds/syuilo/poi2.mp3
Normal file
BIN
src/client/assets/sounds/syuilo/pope1.mp3
Normal file
BIN
src/client/assets/sounds/syuilo/pope2.mp3
Normal file
BIN
src/client/assets/sounds/syuilo/popo.mp3
Normal file
BIN
src/client/assets/sounds/syuilo/triple.mp3
Normal file
BIN
src/client/assets/sounds/syuilo/up.mp3
Normal file
BIN
src/client/assets/sounds/syuilo/waon.mp3
Normal file
7
src/client/assets/unread.svg
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!-- Generator: Adobe Illustrator 16.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||||
|
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||||
|
<svg version="1.1" id="レイヤー_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
|
||||||
|
y="0px" width="32px" height="32px" viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
|
||||||
|
<circle fill="#3AA2DC" cx="16.5" cy="16.5" r="6"/>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 536 B |
@ -38,13 +38,6 @@ import Vue from 'vue';
|
|||||||
import * as tinycolor from 'tinycolor2';
|
import * as tinycolor from 'tinycolor2';
|
||||||
|
|
||||||
export default Vue.extend({
|
export default Vue.extend({
|
||||||
props: {
|
|
||||||
smooth: {
|
|
||||||
type: Boolean,
|
|
||||||
default: false
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
now: new Date(),
|
now: new Date(),
|
||||||
@ -83,9 +76,6 @@ export default Vue.extend({
|
|||||||
return tinycolor(this.computedStyle.getPropertyValue('--accent')).toHexString();
|
return tinycolor(this.computedStyle.getPropertyValue('--accent')).toHexString();
|
||||||
},
|
},
|
||||||
|
|
||||||
ms(): number {
|
|
||||||
return this.now.getMilliseconds() * (this.smooth ? 1 : 0);
|
|
||||||
},
|
|
||||||
s(): number {
|
s(): number {
|
||||||
return this.now.getSeconds();
|
return this.now.getSeconds();
|
||||||
},
|
},
|
||||||
@ -97,13 +87,13 @@ export default Vue.extend({
|
|||||||
},
|
},
|
||||||
|
|
||||||
hAngle(): number {
|
hAngle(): number {
|
||||||
return Math.PI * (this.h % 12 + (this.m + (this.s + this.ms / 1000) / 60) / 60) / 6;
|
return Math.PI * (this.h % 12 + (this.m + this.s / 60) / 60) / 6;
|
||||||
},
|
},
|
||||||
mAngle(): number {
|
mAngle(): number {
|
||||||
return Math.PI * (this.m + (this.s + this.ms / 1000) / 60) / 30;
|
return Math.PI * (this.m + this.s / 60) / 30;
|
||||||
},
|
},
|
||||||
sAngle(): number {
|
sAngle(): number {
|
||||||
return Math.PI * (this.s + this.ms / 1000) / 30;
|
return Math.PI * this.s / 30;
|
||||||
},
|
},
|
||||||
|
|
||||||
graduations(): any {
|
graduations(): any {
|
||||||
@ -121,7 +111,7 @@ export default Vue.extend({
|
|||||||
const update = () => {
|
const update = () => {
|
||||||
if (this.enabled) {
|
if (this.enabled) {
|
||||||
this.tick();
|
this.tick();
|
||||||
requestAnimationFrame(update);
|
setTimeout(update, 1000);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
update();
|
update();
|
||||||
|
@ -1,15 +1,15 @@
|
|||||||
<template>
|
<template>
|
||||||
<sequential-entrance class="sqadhkmv" ref="list" :direction="direction" :reversed="reversed">
|
<component :is="$store.state.device.animation ? 'transition-group' : 'div'" class="sqadhkmv" name="list" tag="div" :data-direction="direction" :data-reversed="reversed ? 'true' : 'false'">
|
||||||
<template v-for="(item, i) in items">
|
<template v-for="(item, i) in items">
|
||||||
<slot :item="item" :i="i"></slot>
|
<slot :item="item"></slot>
|
||||||
<div class="separator" :key="item.id + '_date'" v-if="showDate(i, item)">
|
<div class="separator" v-if="showDate(i, item)" :key="item.id + '_date'">
|
||||||
<p class="date">
|
<p class="date">
|
||||||
<span><fa class="icon" :icon="faAngleUp"/>{{ getDateText(item.createdAt) }}</span>
|
<span><fa class="icon" :icon="faAngleUp"/>{{ getDateText(item.createdAt) }}</span>
|
||||||
<span>{{ getDateText(items[i + 1].createdAt) }}<fa class="icon" :icon="faAngleDown"/></span>
|
<span>{{ getDateText(items[i + 1].createdAt) }}<fa class="icon" :icon="faAngleDown"/></span>
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
</sequential-entrance>
|
</component>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
@ -27,7 +27,8 @@ export default Vue.extend({
|
|||||||
},
|
},
|
||||||
direction: {
|
direction: {
|
||||||
type: String,
|
type: String,
|
||||||
required: false
|
required: false,
|
||||||
|
default: 'down'
|
||||||
},
|
},
|
||||||
reversed: {
|
reversed: {
|
||||||
type: Boolean,
|
type: Boolean,
|
||||||
@ -63,12 +64,38 @@ export default Vue.extend({
|
|||||||
},
|
},
|
||||||
|
|
||||||
focus() {
|
focus() {
|
||||||
this.$refs.list.focus();
|
this.$slots.default[0].elm.focus();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss">
|
||||||
|
.sqadhkmv {
|
||||||
|
> .list-move {
|
||||||
|
transition: transform 0.7s cubic-bezier(0.23, 1, 0.32, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
> .list-enter-active {
|
||||||
|
transition: transform 0.7s cubic-bezier(0.23, 1, 0.32, 1), opacity 0.7s cubic-bezier(0.23, 1, 0.32, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
&[data-direction="up"] {
|
||||||
|
> .list-enter {
|
||||||
|
opacity: 0;
|
||||||
|
transform: translateY(64px);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&[data-direction="down"] {
|
||||||
|
> .list-enter {
|
||||||
|
opacity: 0;
|
||||||
|
transform: translateY(-64px);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
||||||
<style lang="scss" scoped>
|
<style lang="scss" scoped>
|
||||||
.sqadhkmv {
|
.sqadhkmv {
|
||||||
> .separator {
|
> .separator {
|
||||||
@ -82,8 +109,6 @@ export default Vue.extend({
|
|||||||
line-height: 32px;
|
line-height: 32px;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
font-size: 12px;
|
font-size: 12px;
|
||||||
border-radius: 64px;
|
|
||||||
background: var(--dateLabelBg);
|
|
||||||
color: var(--dateLabelFg);
|
color: var(--dateLabelFg);
|
||||||
|
|
||||||
> span {
|
> span {
|
||||||
|
@ -55,6 +55,7 @@ import { faTimesCircle, faQuestionCircle } from '@fortawesome/free-regular-svg-i
|
|||||||
import MkButton from './ui/button.vue';
|
import MkButton from './ui/button.vue';
|
||||||
import MkInput from './ui/input.vue';
|
import MkInput from './ui/input.vue';
|
||||||
import MkSelect from './ui/select.vue';
|
import MkSelect from './ui/select.vue';
|
||||||
|
import MkSignin from './signin.vue';
|
||||||
import parseAcct from '../../misc/acct/parse';
|
import parseAcct from '../../misc/acct/parse';
|
||||||
import i18n from '../i18n';
|
import i18n from '../i18n';
|
||||||
|
|
||||||
@ -65,6 +66,7 @@ export default Vue.extend({
|
|||||||
MkButton,
|
MkButton,
|
||||||
MkInput,
|
MkInput,
|
||||||
MkSelect,
|
MkSelect,
|
||||||
|
MkSignin,
|
||||||
},
|
},
|
||||||
|
|
||||||
props: {
|
props: {
|
||||||
|
@ -105,16 +105,6 @@ export default Vue.extend({
|
|||||||
text: this.$t('delete'),
|
text: this.$t('delete'),
|
||||||
icon: faTrashAlt,
|
icon: faTrashAlt,
|
||||||
action: this.deleteFile
|
action: this.deleteFile
|
||||||
}, null, {
|
|
||||||
type: 'nest',
|
|
||||||
text: this.$t('contextmenu.else-files'),
|
|
||||||
menu: [{
|
|
||||||
text: this.$t('contextmenu.set-as-avatar'),
|
|
||||||
action: this.setAsAvatar
|
|
||||||
}, {
|
|
||||||
text: this.$t('contextmenu.set-as-banner'),
|
|
||||||
action: this.setAsBanner
|
|
||||||
}]
|
|
||||||
}],
|
}],
|
||||||
source: ev.currentTarget || ev.target,
|
source: ev.currentTarget || ev.target,
|
||||||
});
|
});
|
||||||
@ -149,9 +139,9 @@ export default Vue.extend({
|
|||||||
|
|
||||||
rename() {
|
rename() {
|
||||||
this.$root.dialog({
|
this.$root.dialog({
|
||||||
title: this.$t('contextmenu.rename-file'),
|
title: this.$t('renameFile'),
|
||||||
input: {
|
input: {
|
||||||
placeholder: this.$t('contextmenu.input-new-file-name'),
|
placeholder: this.$t('inputNewFileName'),
|
||||||
default: this.file.name,
|
default: this.file.name,
|
||||||
allowEmpty: false
|
allowEmpty: false
|
||||||
}
|
}
|
||||||
|
@ -137,14 +137,14 @@ export default Vue.extend({
|
|||||||
switch (err) {
|
switch (err) {
|
||||||
case 'detected-circular-definition':
|
case 'detected-circular-definition':
|
||||||
this.$root.dialog({
|
this.$root.dialog({
|
||||||
title: this.$t('unable-to-process'),
|
title: this.$t('unableToProcess'),
|
||||||
text: this.$t('circular-reference-detected')
|
text: this.$t('circularReferenceFolder')
|
||||||
});
|
});
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
this.$root.dialog({
|
this.$root.dialog({
|
||||||
type: 'error',
|
type: 'error',
|
||||||
text: this.$t('unhandled-error')
|
text: this.$t('error')
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@ -177,9 +177,9 @@ export default Vue.extend({
|
|||||||
|
|
||||||
rename() {
|
rename() {
|
||||||
this.$root.dialog({
|
this.$root.dialog({
|
||||||
title: this.$t('contextmenu.rename-folder'),
|
title: this.$t('renameFolder'),
|
||||||
input: {
|
input: {
|
||||||
placeholder: this.$t('contextmenu.input-new-folder-name'),
|
placeholder: this.$t('inputNewFolderName'),
|
||||||
default: this.folder.name
|
default: this.folder.name
|
||||||
}
|
}
|
||||||
}).then(({ canceled, result: name }) => {
|
}).then(({ canceled, result: name }) => {
|
||||||
@ -206,14 +206,14 @@ export default Vue.extend({
|
|||||||
case 'b0fc8a17-963c-405d-bfbc-859a487295e1':
|
case 'b0fc8a17-963c-405d-bfbc-859a487295e1':
|
||||||
this.$root.dialog({
|
this.$root.dialog({
|
||||||
type: 'error',
|
type: 'error',
|
||||||
title: this.$t('unable-to-delete'),
|
title: this.$t('unableToDelete'),
|
||||||
text: this.$t('has-child-files-or-folders')
|
text: this.$t('hasChildFilesOrFolders')
|
||||||
});
|
});
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
this.$root.dialog({
|
this.$root.dialog({
|
||||||
type: 'error',
|
type: 'error',
|
||||||
text: this.$t('unable-to-delete')
|
text: this.$t('unableToDelete')
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
@ -263,14 +263,14 @@ export default Vue.extend({
|
|||||||
switch (err) {
|
switch (err) {
|
||||||
case 'detected-circular-definition':
|
case 'detected-circular-definition':
|
||||||
this.$root.dialog({
|
this.$root.dialog({
|
||||||
title: this.$t('unable-to-process'),
|
title: this.$t('unableToProcess'),
|
||||||
text: this.$t('circular-reference-detected')
|
text: this.$t('circularReferenceFolder')
|
||||||
});
|
});
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
this.$root.dialog({
|
this.$root.dialog({
|
||||||
type: 'error',
|
type: 'error',
|
||||||
text: this.$t('unhandled-error')
|
text: this.$t('error')
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@ -284,9 +284,9 @@ export default Vue.extend({
|
|||||||
|
|
||||||
urlUpload() {
|
urlUpload() {
|
||||||
this.$root.dialog({
|
this.$root.dialog({
|
||||||
title: this.$t('url-upload'),
|
title: this.$t('uploadFromUrl'),
|
||||||
input: {
|
input: {
|
||||||
placeholder: this.$t('url-of-file')
|
placeholder: this.$t('uploadFromUrlDescription')
|
||||||
}
|
}
|
||||||
}).then(({ canceled, result: url }) => {
|
}).then(({ canceled, result: url }) => {
|
||||||
if (canceled) return;
|
if (canceled) return;
|
||||||
@ -296,17 +296,17 @@ export default Vue.extend({
|
|||||||
});
|
});
|
||||||
|
|
||||||
this.$root.dialog({
|
this.$root.dialog({
|
||||||
title: this.$t('url-upload-requested'),
|
title: this.$t('uploadFromUrlRequested'),
|
||||||
text: this.$t('may-take-time')
|
text: this.$t('uploadFromUrlMayTakeTime')
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
createFolder() {
|
createFolder() {
|
||||||
this.$root.dialog({
|
this.$root.dialog({
|
||||||
title: this.$t('create-folder'),
|
title: this.$t('createFolder'),
|
||||||
input: {
|
input: {
|
||||||
placeholder: this.$t('folder-name')
|
placeholder: this.$t('folderName')
|
||||||
}
|
}
|
||||||
}).then(({ canceled, result: name }) => {
|
}).then(({ canceled, result: name }) => {
|
||||||
if (canceled) return;
|
if (canceled) return;
|
||||||
@ -321,9 +321,9 @@ export default Vue.extend({
|
|||||||
|
|
||||||
renameFolder(folder) {
|
renameFolder(folder) {
|
||||||
this.$root.dialog({
|
this.$root.dialog({
|
||||||
title: this.$t('contextmenu.rename-folder'),
|
title: this.$t('renameFolder'),
|
||||||
input: {
|
input: {
|
||||||
placeholder: this.$t('contextmenu.input-new-folder-name'),
|
placeholder: this.$t('inputNewFolderName'),
|
||||||
default: folder.name
|
default: folder.name
|
||||||
}
|
}
|
||||||
}).then(({ canceled, result: name }) => {
|
}).then(({ canceled, result: name }) => {
|
||||||
@ -349,14 +349,14 @@ export default Vue.extend({
|
|||||||
case 'b0fc8a17-963c-405d-bfbc-859a487295e1':
|
case 'b0fc8a17-963c-405d-bfbc-859a487295e1':
|
||||||
this.$root.dialog({
|
this.$root.dialog({
|
||||||
type: 'error',
|
type: 'error',
|
||||||
title: this.$t('unable-to-delete'),
|
title: this.$t('unableToDelete'),
|
||||||
text: this.$t('has-child-files-or-folders')
|
text: this.$t('hasChildFilesOrFolders')
|
||||||
});
|
});
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
this.$root.dialog({
|
this.$root.dialog({
|
||||||
type: 'error',
|
type: 'error',
|
||||||
text: this.$t('unable-to-delete')
|
text: this.$t('unableToDelete')
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
@ -2,12 +2,11 @@
|
|||||||
<x-popup :source="source" ref="popup" @closed="() => { $emit('closed'); destroyDom(); }">
|
<x-popup :source="source" ref="popup" @closed="() => { $emit('closed'); destroyDom(); }">
|
||||||
<div class="omfetrab">
|
<div class="omfetrab">
|
||||||
<header>
|
<header>
|
||||||
<button v-for="category in categories"
|
<button v-for="(category, i) in categories"
|
||||||
class="_button"
|
class="_button"
|
||||||
:title="category.text"
|
|
||||||
@click="go(category)"
|
@click="go(category)"
|
||||||
:class="{ active: category.isActive }"
|
:class="{ active: category.isActive }"
|
||||||
:key="category.text"
|
:key="i"
|
||||||
>
|
>
|
||||||
<fa :icon="category.icon" fixed-width/>
|
<fa :icon="category.icon" fixed-width/>
|
||||||
</button>
|
</button>
|
||||||
@ -15,7 +14,7 @@
|
|||||||
|
|
||||||
<div class="emojis">
|
<div class="emojis">
|
||||||
<template v-if="categories[0].isActive">
|
<template v-if="categories[0].isActive">
|
||||||
<header class="category"><fa :icon="faHistory" fixed-width/> {{ $t('recentUsedEmojis') }}</header>
|
<header class="category"><fa :icon="faHistory" fixed-width/> {{ $t('recentUsed') }}</header>
|
||||||
<div class="list">
|
<div class="list">
|
||||||
<button v-for="(emoji, i) in ($store.state.device.recentEmojis || [])"
|
<button v-for="(emoji, i) in ($store.state.device.recentEmojis || [])"
|
||||||
class="_button"
|
class="_button"
|
||||||
@ -27,9 +26,10 @@
|
|||||||
<img v-else :src="$store.state.device.disableShowingAnimatedImages ? getStaticImageUrl(emoji.url) : emoji.url"/>
|
<img v-else :src="$store.state.device.disableShowingAnimatedImages ? getStaticImageUrl(emoji.url) : emoji.url"/>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<header class="category"><fa :icon="faAsterisk" fixed-width/> {{ $t('customEmojis') }}</header>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<header class="category"><fa :icon="categories.find(x => x.isActive).icon" fixed-width/> {{ categories.find(x => x.isActive).text }}</header>
|
|
||||||
<template v-if="categories.find(x => x.isActive).name">
|
<template v-if="categories.find(x => x.isActive).name">
|
||||||
<div class="list">
|
<div class="list">
|
||||||
<button v-for="emoji in emojilist.filter(e => e.category === categories.find(x => x.isActive).name)"
|
<button v-for="emoji in emojilist.filter(e => e.category === categories.find(x => x.isActive).name)"
|
||||||
@ -92,47 +92,38 @@ export default Vue.extend({
|
|||||||
customEmojis: {},
|
customEmojis: {},
|
||||||
faGlobe, faHistory,
|
faGlobe, faHistory,
|
||||||
categories: [{
|
categories: [{
|
||||||
text: this.$t('customEmoji'),
|
|
||||||
icon: faAsterisk,
|
icon: faAsterisk,
|
||||||
isActive: true
|
isActive: true
|
||||||
}, {
|
}, {
|
||||||
name: 'people',
|
name: 'people',
|
||||||
text: this.$t('people'),
|
|
||||||
icon: faLaugh,
|
icon: faLaugh,
|
||||||
isActive: false
|
isActive: false
|
||||||
}, {
|
}, {
|
||||||
name: 'animals_and_nature',
|
name: 'animals_and_nature',
|
||||||
text: this.$t('animals-and-nature'),
|
|
||||||
icon: faLeaf,
|
icon: faLeaf,
|
||||||
isActive: false
|
isActive: false
|
||||||
}, {
|
}, {
|
||||||
name: 'food_and_drink',
|
name: 'food_and_drink',
|
||||||
text: this.$t('food-and-drink'),
|
|
||||||
icon: faUtensils,
|
icon: faUtensils,
|
||||||
isActive: false
|
isActive: false
|
||||||
}, {
|
}, {
|
||||||
name: 'activity',
|
name: 'activity',
|
||||||
text: this.$t('activity'),
|
|
||||||
icon: faFutbol,
|
icon: faFutbol,
|
||||||
isActive: false
|
isActive: false
|
||||||
}, {
|
}, {
|
||||||
name: 'travel_and_places',
|
name: 'travel_and_places',
|
||||||
text: this.$t('travel-and-places'),
|
|
||||||
icon: faCity,
|
icon: faCity,
|
||||||
isActive: false
|
isActive: false
|
||||||
}, {
|
}, {
|
||||||
name: 'objects',
|
name: 'objects',
|
||||||
text: this.$t('objects'),
|
|
||||||
icon: faDice,
|
icon: faDice,
|
||||||
isActive: false
|
isActive: false
|
||||||
}, {
|
}, {
|
||||||
name: 'symbols',
|
name: 'symbols',
|
||||||
text: this.$t('symbols'),
|
|
||||||
icon: faHeart,
|
icon: faHeart,
|
||||||
isActive: false
|
isActive: false
|
||||||
}, {
|
}, {
|
||||||
name: 'flags',
|
name: 'flags',
|
||||||
text: this.$t('flags'),
|
|
||||||
icon: faFlag,
|
icon: faFlag,
|
||||||
isActive: false
|
isActive: false
|
||||||
}]
|
}]
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="mjndxjcg _panel">
|
<div class="mjndxjcg _panel">
|
||||||
<img src="https://xn--931a.moe/assets/error.png" class="_ghost"/>
|
<img src="https://xn--931a.moe/assets/error.jpg" class="_ghost"/>
|
||||||
<p><fa :icon="faExclamationTriangle"/> {{ $t('error') }}</p>
|
<p><fa :icon="faExclamationTriangle"/> {{ $t('error') }}</p>
|
||||||
<mk-button @click="() => $emit('retry')" class="button">{{ $t('retry') }}</mk-button>
|
<mk-button @click="() => $emit('retry')" class="button">{{ $t('retry') }}</mk-button>
|
||||||
</div>
|
</div>
|
||||||
@ -27,8 +27,6 @@ export default Vue.extend({
|
|||||||
|
|
||||||
<style lang="scss" scoped>
|
<style lang="scss" scoped>
|
||||||
.mjndxjcg {
|
.mjndxjcg {
|
||||||
max-width: 350px;
|
|
||||||
margin: 0 auto;
|
|
||||||
padding: 32px;
|
padding: 32px;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
|
|
||||||
|
@ -1,12 +1,13 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="mk-google">
|
<div class="mk-google">
|
||||||
<input type="search" v-model="query" :placeholder="q">
|
<input type="search" v-model="query" :placeholder="q">
|
||||||
<button @click="search"><fa icon="search"/> {{ $t('search') }}</button>
|
<button @click="search"><fa :icon="faSearch"/> {{ $t('search') }}</button>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import Vue from 'vue';
|
import Vue from 'vue';
|
||||||
|
import { faSearch } from '@fortawesome/free-solid-svg-icons';
|
||||||
import i18n from '../i18n';
|
import i18n from '../i18n';
|
||||||
|
|
||||||
export default Vue.extend({
|
export default Vue.extend({
|
||||||
@ -14,7 +15,8 @@ export default Vue.extend({
|
|||||||
props: ['q'],
|
props: ['q'],
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
query: null
|
query: null,
|
||||||
|
faSearch
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
mounted() {
|
mounted() {
|
||||||
@ -42,27 +44,17 @@ export default Vue.extend({
|
|||||||
width: 100%;
|
width: 100%;
|
||||||
height: 40px;
|
height: 40px;
|
||||||
font-size: 16px;
|
font-size: 16px;
|
||||||
color: var(--googleSearchFg);
|
border: solid 1px var(--divider);
|
||||||
background: var(--googleSearchBg);
|
|
||||||
border: solid 1px var(--googleSearchBorder);
|
|
||||||
border-radius: 4px 0 0 4px;
|
border-radius: 4px 0 0 4px;
|
||||||
|
|
||||||
&:hover {
|
|
||||||
border-color: var(--googleSearchHoverBorder);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
> button {
|
> button {
|
||||||
flex-shrink: 0;
|
flex-shrink: 0;
|
||||||
padding: 0 16px;
|
padding: 0 16px;
|
||||||
border: solid 1px var(--googleSearchBorder);
|
border: solid 1px var(--divider);
|
||||||
border-left: none;
|
border-left: none;
|
||||||
border-radius: 0 4px 4px 0;
|
border-radius: 0 4px 4px 0;
|
||||||
|
|
||||||
&:hover {
|
|
||||||
background-color: var(--googleSearchHoverButton);
|
|
||||||
}
|
|
||||||
|
|
||||||
&:active {
|
&:active {
|
||||||
box-shadow: 0 2px 4px rgba(#000, 0.15) inset;
|
box-shadow: 0 2px 4px rgba(#000, 0.15) inset;
|
||||||
}
|
}
|
||||||
|
@ -9,8 +9,8 @@ import ellipsis from './ellipsis.vue';
|
|||||||
import time from './time.vue';
|
import time from './time.vue';
|
||||||
import url from './url.vue';
|
import url from './url.vue';
|
||||||
import loading from './loading.vue';
|
import loading from './loading.vue';
|
||||||
import SequentialEntrance from './sequential-entrance.vue';
|
|
||||||
import error from './error.vue';
|
import error from './error.vue';
|
||||||
|
import streamIndicator from './stream-indicator.vue';
|
||||||
|
|
||||||
Vue.component('mfm', mfm);
|
Vue.component('mfm', mfm);
|
||||||
Vue.component('mk-acct', acct);
|
Vue.component('mk-acct', acct);
|
||||||
@ -22,4 +22,4 @@ Vue.component('mk-time', time);
|
|||||||
Vue.component('mk-url', url);
|
Vue.component('mk-url', url);
|
||||||
Vue.component('mk-loading', loading);
|
Vue.component('mk-loading', loading);
|
||||||
Vue.component('mk-error', error);
|
Vue.component('mk-error', error);
|
||||||
Vue.component('sequential-entrance', SequentialEntrance);
|
Vue.component('stream-indicator', streamIndicator);
|
||||||
|
@ -13,7 +13,7 @@
|
|||||||
import Vue from 'vue';
|
import Vue from 'vue';
|
||||||
import { faExternalLinkSquareAlt } from '@fortawesome/free-solid-svg-icons';
|
import { faExternalLinkSquareAlt } from '@fortawesome/free-solid-svg-icons';
|
||||||
import { url as local } from '../config';
|
import { url as local } from '../config';
|
||||||
import XUrlPreview from './url-preview-popup.vue';
|
import MkUrlPreview from './url-preview-popup.vue';
|
||||||
|
|
||||||
export default Vue.extend({
|
export default Vue.extend({
|
||||||
props: {
|
props: {
|
||||||
@ -44,7 +44,7 @@ export default Vue.extend({
|
|||||||
if (!document.body.contains(this.$el)) return;
|
if (!document.body.contains(this.$el)) return;
|
||||||
if (this.preview) return;
|
if (this.preview) return;
|
||||||
|
|
||||||
this.preview = new XUrlPreview({
|
this.preview = new MkUrlPreview({
|
||||||
parent: this,
|
parent: this,
|
||||||
propsData: {
|
propsData: {
|
||||||
url: this.url,
|
url: this.url,
|
||||||
|
@ -90,7 +90,7 @@ export default Vue.extend({
|
|||||||
> div {
|
> div {
|
||||||
background-color: var(--fg);
|
background-color: var(--fg);
|
||||||
border-radius: 6px;
|
border-radius: 6px;
|
||||||
color: var(--secondary);
|
color: var(--accentLighten);
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
font-size: 14px;
|
font-size: 14px;
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
|
@ -3,8 +3,8 @@
|
|||||||
<template v-for="media in mediaList.filter(media => !previewable(media))">
|
<template v-for="media in mediaList.filter(media => !previewable(media))">
|
||||||
<x-banner :media="media" :key="media.id"/>
|
<x-banner :media="media" :key="media.id"/>
|
||||||
</template>
|
</template>
|
||||||
<div v-if="mediaList.filter(media => previewable(media)).length > 0" class="gird-container">
|
<div v-if="mediaList.filter(media => previewable(media)).length > 0" class="gird-container" ref="gridOuter">
|
||||||
<div :data-count="mediaList.filter(media => previewable(media)).length" ref="grid">
|
<div :data-count="mediaList.filter(media => previewable(media)).length" :style="gridInnerStyle">
|
||||||
<template v-for="media in mediaList">
|
<template v-for="media in mediaList">
|
||||||
<x-video :video="media" :key="media.id" v-if="media.type.startsWith('video')"/>
|
<x-video :video="media" :key="media.id" v-if="media.type.startsWith('video')"/>
|
||||||
<x-image :image="media" :key="media.id" v-else-if="media.type.startsWith('image')" :raw="raw"/>
|
<x-image :image="media" :key="media.id" v-else-if="media.type.startsWith('image')" :raw="raw"/>
|
||||||
@ -32,19 +32,56 @@ export default Vue.extend({
|
|||||||
},
|
},
|
||||||
raw: {
|
raw: {
|
||||||
default: false
|
default: false
|
||||||
|
},
|
||||||
|
// specify the parent element
|
||||||
|
parentElement: {
|
||||||
|
type: Object
|
||||||
|
}
|
||||||
|
},
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
gridInnerStyle: {},
|
||||||
|
sizeWaiting: false
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
mounted() {
|
mounted() {
|
||||||
//#region for Safari bug
|
this.size();
|
||||||
if (this.$refs.grid) {
|
window.addEventListener('resize', this.size);
|
||||||
this.$refs.grid.style.height = this.$refs.grid.clientHeight ? `${this.$refs.grid.clientHeight}px`
|
},
|
||||||
: '287px';
|
beforeDestroy() {
|
||||||
}
|
window.removeEventListener('resize', this.size);
|
||||||
//#endregion
|
},
|
||||||
|
activated() {
|
||||||
|
this.size();
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
previewable(file) {
|
previewable(file) {
|
||||||
return file.type.startsWith('video') || file.type.startsWith('image');
|
return file.type.startsWith('video') || file.type.startsWith('image');
|
||||||
|
},
|
||||||
|
size() {
|
||||||
|
// for Safari bug
|
||||||
|
if (this.sizeWaiting) return;
|
||||||
|
|
||||||
|
this.sizeWaiting = true;
|
||||||
|
|
||||||
|
window.requestAnimationFrame(() => {
|
||||||
|
this.sizeWaiting = false;
|
||||||
|
|
||||||
|
if (this.$refs.gridOuter) {
|
||||||
|
let height = 287;
|
||||||
|
const parent = this.$props.parentElement || this.$parent.$el;
|
||||||
|
|
||||||
|
if (this.$refs.gridOuter.clientHeight) {
|
||||||
|
height = this.$refs.gridOuter.clientHeight;
|
||||||
|
} else if (parent) {
|
||||||
|
height = parent.getBoundingClientRect().width * 9 / 16;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.gridInnerStyle = { height: `${height}px` };
|
||||||
|
} else {
|
||||||
|
this.gridInnerStyle = {};
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
<template>
|
<template>
|
||||||
<x-popup :source="source" :no-center="noCenter" :fixed="fixed" :width="width" ref="popup" @closed="() => { $emit('closed'); destroyDom(); }" v-hotkey.global="keymap">
|
<x-popup :source="source" :no-center="noCenter" :fixed="fixed" :width="width" ref="popup" @closed="() => { $emit('closed'); destroyDom(); }" v-hotkey.global="keymap">
|
||||||
<sequential-entrance class="rrevdjwt" :class="{ left: align === 'left' }" :delay="15" :direction="direction" ref="items">
|
<div class="rrevdjwt" :class="{ left: align === 'left' }" ref="items">
|
||||||
<template v-for="(item, i) in items.filter(item => item !== undefined)">
|
<template v-for="(item, i) in items.filter(item => item !== undefined)">
|
||||||
<div v-if="item === null" class="divider" :key="i"></div>
|
<div v-if="item === null" class="divider" :key="i"></div>
|
||||||
<span v-else-if="item.type === 'label'" class="label item" :key="i">
|
<span v-else-if="item.type === 'label'" class="label item" :key="i">
|
||||||
@ -28,7 +28,7 @@
|
|||||||
<i v-if="item.indicate"><fa :icon="faCircle"/></i>
|
<i v-if="item.indicate"><fa :icon="faCircle"/></i>
|
||||||
</button>
|
</button>
|
||||||
</template>
|
</template>
|
||||||
</sequential-entrance>
|
</div>
|
||||||
</x-popup>
|
</x-popup>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
@ -91,7 +91,7 @@ export default Vue.extend({
|
|||||||
mounted() {
|
mounted() {
|
||||||
if (this.viaKeyboard) {
|
if (this.viaKeyboard) {
|
||||||
this.$nextTick(() => {
|
this.$nextTick(() => {
|
||||||
focusNext(this.$refs.items.$slots.default[0].elm, true);
|
focusNext(this.$refs.items.children[0], true);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
@ -37,6 +37,10 @@ export default Vue.extend({
|
|||||||
font-size: 0.8em;
|
font-size: 0.8em;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
::v-deep > code {
|
||||||
|
word-break: break-all;
|
||||||
|
}
|
||||||
|
|
||||||
::v-deep .title {
|
::v-deep .title {
|
||||||
text-align: center;
|
text-align: center;
|
||||||
border-bottom: solid 1px var(--divider);
|
border-bottom: solid 1px var(--divider);
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="zlrxdaqttccpwhpaagdmkawtzklsccam">
|
<div class="wrpstxzv" v-size="[{ max: 450 }]">
|
||||||
<mk-avatar class="avatar" :user="note.user"/>
|
<mk-avatar class="avatar" :user="note.user"/>
|
||||||
<div class="main">
|
<div class="main">
|
||||||
<x-note-header class="header" :note="note" :mini="true"/>
|
<x-note-header class="header" :note="note" :mini="true"/>
|
||||||
@ -56,13 +56,12 @@ export default Vue.extend({
|
|||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="scss" scoped>
|
<style lang="scss" scoped>
|
||||||
.zlrxdaqttccpwhpaagdmkawtzklsccam {
|
.wrpstxzv {
|
||||||
display: flex;
|
display: flex;
|
||||||
padding: 16px 32px;
|
padding: 16px 32px;
|
||||||
font-size: 0.9em;
|
font-size: 0.9em;
|
||||||
background: rgba(0, 0, 0, 0.03);
|
|
||||||
|
|
||||||
@media (max-width: 450px) {
|
&.max-width_450px {
|
||||||
padding: 14px 16px;
|
padding: 14px 16px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -49,7 +49,7 @@
|
|||||||
<x-media-list :media-list="appearNote.files"/>
|
<x-media-list :media-list="appearNote.files"/>
|
||||||
</div>
|
</div>
|
||||||
<x-poll v-if="appearNote.poll" :note="appearNote" ref="pollViewer"/>
|
<x-poll v-if="appearNote.poll" :note="appearNote" ref="pollViewer"/>
|
||||||
<x-url-preview v-for="url in urls" :url="url" :key="url" :compact="true" class="url-preview"/>
|
<mk-url-preview v-for="url in urls" :url="url" :key="url" :compact="true" class="url-preview"/>
|
||||||
<div class="renote" v-if="appearNote.renote"><x-note-preview :note="appearNote.renote"/></div>
|
<div class="renote" v-if="appearNote.renote"><x-note-preview :note="appearNote.renote"/></div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -79,14 +79,14 @@
|
|||||||
<div class="deleted" v-if="appearNote.deletedAt != null">{{ $t('deleted') }}</div>
|
<div class="deleted" v-if="appearNote.deletedAt != null">{{ $t('deleted') }}</div>
|
||||||
</div>
|
</div>
|
||||||
</article>
|
</article>
|
||||||
<x-sub v-for="note in replies" :key="note.id" :note="note"/>
|
<x-sub v-for="note in replies" :key="note.id" :note="note" class="reply"/>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import Vue from 'vue';
|
import Vue from 'vue';
|
||||||
import { faBolt, faTimes, faBullhorn, faStar, faLink, faExternalLinkSquareAlt, faPlus, faMinus, faRetweet, faReply, faReplyAll, faEllipsisH, faHome, faUnlock, faEnvelope, faThumbtack, faBan, faQuoteRight } from '@fortawesome/free-solid-svg-icons';
|
import { faBolt, faTimes, faBullhorn, faStar, faLink, faExternalLinkSquareAlt, faPlus, faMinus, faRetweet, faReply, faReplyAll, faEllipsisH, faHome, faUnlock, faEnvelope, faThumbtack, faBan, faQuoteRight, faInfoCircle } from '@fortawesome/free-solid-svg-icons';
|
||||||
import { faCopy, faTrashAlt, faEye, faEyeSlash } from '@fortawesome/free-regular-svg-icons';
|
import { faCopy, faTrashAlt, faEdit, faEye, faEyeSlash } from '@fortawesome/free-regular-svg-icons';
|
||||||
import { parse } from '../../mfm/parse';
|
import { parse } from '../../mfm/parse';
|
||||||
import { sum, unique } from '../../prelude/array';
|
import { sum, unique } from '../../prelude/array';
|
||||||
import i18n from '../i18n';
|
import i18n from '../i18n';
|
||||||
@ -97,7 +97,7 @@ import XReactionsViewer from './reactions-viewer.vue';
|
|||||||
import XMediaList from './media-list.vue';
|
import XMediaList from './media-list.vue';
|
||||||
import XCwButton from './cw-button.vue';
|
import XCwButton from './cw-button.vue';
|
||||||
import XPoll from './poll.vue';
|
import XPoll from './poll.vue';
|
||||||
import XUrlPreview from './url-preview.vue';
|
import MkUrlPreview from './url-preview.vue';
|
||||||
import MkReactionPicker from './reaction-picker.vue';
|
import MkReactionPicker from './reaction-picker.vue';
|
||||||
import pleaseLogin from '../scripts/please-login';
|
import pleaseLogin from '../scripts/please-login';
|
||||||
import { focusPrev, focusNext } from '../scripts/focus';
|
import { focusPrev, focusNext } from '../scripts/focus';
|
||||||
@ -115,7 +115,7 @@ export default Vue.extend({
|
|||||||
XMediaList,
|
XMediaList,
|
||||||
XCwButton,
|
XCwButton,
|
||||||
XPoll,
|
XPoll,
|
||||||
XUrlPreview,
|
MkUrlPreview,
|
||||||
},
|
},
|
||||||
|
|
||||||
props: {
|
props: {
|
||||||
@ -142,7 +142,7 @@ export default Vue.extend({
|
|||||||
replies: [],
|
replies: [],
|
||||||
showContent: false,
|
showContent: false,
|
||||||
hideThisNote: false,
|
hideThisNote: false,
|
||||||
faBolt, faTimes, faBullhorn, faPlus, faMinus, faRetweet, faReply, faReplyAll, faEllipsisH, faHome, faUnlock, faEnvelope, faThumbtack, faBan
|
faEdit, faBolt, faTimes, faBullhorn, faPlus, faMinus, faRetweet, faReply, faReplyAll, faEllipsisH, faHome, faUnlock, faEnvelope, faThumbtack, faBan
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -392,7 +392,7 @@ export default Vue.extend({
|
|||||||
}]
|
}]
|
||||||
source: this.$refs.renoteButton,
|
source: this.$refs.renoteButton,
|
||||||
viaKeyboard
|
viaKeyboard
|
||||||
}).then(this.focus);
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
renoteDirectly() {
|
renoteDirectly() {
|
||||||
@ -460,6 +460,22 @@ export default Vue.extend({
|
|||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
|
delEdit() {
|
||||||
|
this.$root.dialog({
|
||||||
|
type: 'warning',
|
||||||
|
text: this.$t('deleteAndEditConfirm'),
|
||||||
|
showCancelButton: true
|
||||||
|
}).then(({ canceled }) => {
|
||||||
|
if (canceled) return;
|
||||||
|
|
||||||
|
this.$root.api('notes/delete', {
|
||||||
|
noteId: this.appearNote.id
|
||||||
|
});
|
||||||
|
|
||||||
|
this.$root.post({ initialNote: this.appearNote, renote: this.appearNote.renote, reply: this.appearNote.reply });
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
toggleFavorite(favorite: boolean) {
|
toggleFavorite(favorite: boolean) {
|
||||||
this.$root.api(favorite ? 'notes/favorites/create' : 'notes/favorites/delete', {
|
this.$root.api(favorite ? 'notes/favorites/create' : 'notes/favorites/delete', {
|
||||||
noteId: this.appearNote.id
|
noteId: this.appearNote.id
|
||||||
@ -489,6 +505,11 @@ export default Vue.extend({
|
|||||||
noteId: this.appearNote.id
|
noteId: this.appearNote.id
|
||||||
});
|
});
|
||||||
menu = [{
|
menu = [{
|
||||||
|
type: 'link',
|
||||||
|
icon: faInfoCircle,
|
||||||
|
text: this.$t('details'),
|
||||||
|
to: '/notes/' + this.appearNote.id
|
||||||
|
}, null, {
|
||||||
icon: faCopy,
|
icon: faCopy,
|
||||||
text: this.$t('copyContent'),
|
text: this.$t('copyContent'),
|
||||||
action: this.copyContent
|
action: this.copyContent
|
||||||
@ -496,11 +517,11 @@ export default Vue.extend({
|
|||||||
icon: faLink,
|
icon: faLink,
|
||||||
text: this.$t('copyLink'),
|
text: this.$t('copyLink'),
|
||||||
action: this.copyLink
|
action: this.copyLink
|
||||||
}, this.appearNote.uri ? {
|
}, (this.appearNote.url || this.appearNote.uri) ? {
|
||||||
icon: faExternalLinkSquareAlt,
|
icon: faExternalLinkSquareAlt,
|
||||||
text: this.$t('showOnRemote'),
|
text: this.$t('showOnRemote'),
|
||||||
action: () => {
|
action: () => {
|
||||||
window.open(this.appearNote.uri, '_blank');
|
window.open(this.appearNote.url || this.appearNote.uri, '_blank');
|
||||||
}
|
}
|
||||||
} : undefined,
|
} : undefined,
|
||||||
null,
|
null,
|
||||||
@ -542,6 +563,11 @@ export default Vue.extend({
|
|||||||
),
|
),
|
||||||
...(this.appearNote.userId == this.$store.state.i.id ? [
|
...(this.appearNote.userId == this.$store.state.i.id ? [
|
||||||
null,
|
null,
|
||||||
|
{
|
||||||
|
icon: faEdit,
|
||||||
|
text: this.$t('deleteAndEdit'),
|
||||||
|
action: this.delEdit
|
||||||
|
},
|
||||||
{
|
{
|
||||||
icon: faTrashAlt,
|
icon: faTrashAlt,
|
||||||
text: this.$t('delete'),
|
text: this.$t('delete'),
|
||||||
@ -559,11 +585,11 @@ export default Vue.extend({
|
|||||||
icon: faLink,
|
icon: faLink,
|
||||||
text: this.$t('copyLink'),
|
text: this.$t('copyLink'),
|
||||||
action: this.copyLink
|
action: this.copyLink
|
||||||
}, this.appearNote.uri ? {
|
}, (this.appearNote.url || this.appearNote.uri) ? {
|
||||||
icon: faExternalLinkSquareAlt,
|
icon: faExternalLinkSquareAlt,
|
||||||
text: this.$t('showOnRemote'),
|
text: this.$t('showOnRemote'),
|
||||||
action: () => {
|
action: () => {
|
||||||
window.open(this.appearNote.uri, '_blank');
|
window.open(this.appearNote.url || this.appearNote.uri, '_blank');
|
||||||
}
|
}
|
||||||
} : undefined]
|
} : undefined]
|
||||||
.filter(x => x !== undefined);
|
.filter(x => x !== undefined);
|
||||||
@ -679,6 +705,7 @@ export default Vue.extend({
|
|||||||
.note {
|
.note {
|
||||||
position: relative;
|
position: relative;
|
||||||
transition: box-shadow 0.1s ease;
|
transition: box-shadow 0.1s ease;
|
||||||
|
overflow: hidden;
|
||||||
|
|
||||||
&.max-width_500px {
|
&.max-width_500px {
|
||||||
font-size: 0.9em;
|
font-size: 0.9em;
|
||||||
@ -744,14 +771,6 @@ export default Vue.extend({
|
|||||||
opacity: 1;
|
opacity: 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
> *:first-child {
|
|
||||||
border-radius: var(--radius) var(--radius) 0 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
> *:last-child {
|
|
||||||
border-radius: 0 0 var(--radius) var(--radius);
|
|
||||||
}
|
|
||||||
|
|
||||||
> .info {
|
> .info {
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
@ -779,6 +798,11 @@ export default Vue.extend({
|
|||||||
padding-top: 8px;
|
padding-top: 8px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
> .reply-to {
|
||||||
|
opacity: 0.7;
|
||||||
|
padding-bottom: 0;
|
||||||
|
}
|
||||||
|
|
||||||
> .renote {
|
> .renote {
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
@ -932,5 +956,9 @@ export default Vue.extend({
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
> .reply {
|
||||||
|
border-top: solid 1px var(--divider);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
@ -1,28 +1,28 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="mk-notes" v-size="[{ max: 500 }]">
|
<div class="mk-notes" v-size="[{ max: 500 }]">
|
||||||
<div class="empty" v-if="empty">
|
<div class="_fullinfo" v-if="empty">
|
||||||
<img src="https://xn--931a.moe/assets/info.png" class="_ghost"/>
|
<img src="https://xn--931a.moe/assets/info.jpg" class="_ghost"/>
|
||||||
<div>{{ $t('noNotes') }}</div>
|
<div>{{ $t('noNotes') }}</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<mk-error v-if="error" @retry="init()"/>
|
<mk-error v-if="error" @retry="init()"/>
|
||||||
|
|
||||||
<div class="more" v-if="more && reversed" style="margin-bottom: var(--margin);">
|
<div v-if="more && reversed" style="margin-bottom: var(--margin);">
|
||||||
<mk-button class="button" :disabled="moreFetching" :style="{ cursor: moreFetching ? 'wait' : 'pointer' }" @click="fetchMore()" primary>
|
<button class="_panel _button" :disabled="moreFetching" :style="{ cursor: moreFetching ? 'wait' : 'pointer' }" @click="fetchMore()">
|
||||||
<template v-if="!moreFetching">{{ $t('loadMore') }}</template>
|
<template v-if="!moreFetching">{{ $t('loadMore') }}</template>
|
||||||
<template v-if="moreFetching"><mk-loading inline/></template>
|
<template v-if="moreFetching"><mk-loading inline/></template>
|
||||||
</mk-button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<x-list ref="notes" class="notes" :items="notes" v-slot="{ item: note }" :direction="reversed ? 'up' : 'down'" :reversed="reversed">
|
<x-list ref="notes" class="notes" :items="notes" v-slot="{ item: note }" :direction="reversed ? 'up' : 'down'" :reversed="reversed">
|
||||||
<x-note :note="note" :detail="detail" :key="note._featuredId_ || note._prId_ || note.id"/>
|
<x-note :note="note" :detail="detail" :key="note._featuredId_ || note._prId_ || note.id"/>
|
||||||
</x-list>
|
</x-list>
|
||||||
|
|
||||||
<div class="more" v-if="more && !reversed" style="margin-top: var(--margin);">
|
<div v-if="more && !reversed" style="margin-top: var(--margin);">
|
||||||
<mk-button class="button" :disabled="moreFetching" :style="{ cursor: moreFetching ? 'wait' : 'pointer' }" @click="fetchMore()" primary>
|
<button class="_panel _button" :disabled="moreFetching" :style="{ cursor: moreFetching ? 'wait' : 'pointer' }" @click="fetchMore()">
|
||||||
<template v-if="!moreFetching">{{ $t('loadMore') }}</template>
|
<template v-if="!moreFetching">{{ $t('loadMore') }}</template>
|
||||||
<template v-if="moreFetching"><mk-loading inline/></template>
|
<template v-if="moreFetching"><mk-loading inline/></template>
|
||||||
</mk-button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
@ -90,18 +90,6 @@ export default Vue.extend({
|
|||||||
|
|
||||||
<style lang="scss" scoped>
|
<style lang="scss" scoped>
|
||||||
.mk-notes {
|
.mk-notes {
|
||||||
> .empty {
|
|
||||||
padding: 32px;
|
|
||||||
text-align: center;
|
|
||||||
|
|
||||||
> img {
|
|
||||||
vertical-align: bottom;
|
|
||||||
height: 128px;
|
|
||||||
margin-bottom: 16px;
|
|
||||||
border-radius: 16px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
> .notes {
|
> .notes {
|
||||||
> ::v-deep *:not(:last-child) {
|
> ::v-deep *:not(:last-child) {
|
||||||
margin-bottom: var(--marginFull);
|
margin-bottom: var(--marginFull);
|
||||||
@ -111,16 +99,10 @@ export default Vue.extend({
|
|||||||
&.max-width_500px {
|
&.max-width_500px {
|
||||||
> .notes {
|
> .notes {
|
||||||
> ::v-deep *:not(:last-child) {
|
> ::v-deep *:not(:last-child) {
|
||||||
margin-bottom: var(--marginHalf);
|
//margin-bottom: var(--marginHalf);
|
||||||
|
margin-bottom: 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
> .more > .button {
|
|
||||||
margin-left: auto;
|
|
||||||
margin-right: auto;
|
|
||||||
height: 48px;
|
|
||||||
width: 100%;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
@ -1,22 +1,24 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="mk-notification" :class="notification.type">
|
<div class="mk-notification" :class="notification.type" v-size="[{ max: 500 }, { max: 600 }]">
|
||||||
<div class="head">
|
<div class="head">
|
||||||
<mk-avatar class="avatar" :user="notification.user"/>
|
<mk-avatar v-if="notification.user" class="icon" :user="notification.user"/>
|
||||||
<div class="icon" :class="notification.type">
|
<img v-else class="icon" :src="notification.icon" alt=""/>
|
||||||
|
<div class="sub-icon" :class="notification.type">
|
||||||
<fa :icon="faPlus" v-if="notification.type === 'follow'"/>
|
<fa :icon="faPlus" v-if="notification.type === 'follow'"/>
|
||||||
<fa :icon="faClock" v-if="notification.type === 'receiveFollowRequest'"/>
|
<fa :icon="faClock" v-else-if="notification.type === 'receiveFollowRequest'"/>
|
||||||
<fa :icon="faCheck" v-if="notification.type === 'followRequestAccepted'"/>
|
<fa :icon="faCheck" v-else-if="notification.type === 'followRequestAccepted'"/>
|
||||||
<fa :icon="faIdCardAlt" v-if="notification.type === 'groupInvited'"/>
|
<fa :icon="faIdCardAlt" v-else-if="notification.type === 'groupInvited'"/>
|
||||||
<fa :icon="faRetweet" v-if="notification.type === 'renote'"/>
|
<fa :icon="faRetweet" v-else-if="notification.type === 'renote'"/>
|
||||||
<fa :icon="faReply" v-if="notification.type === 'reply'"/>
|
<fa :icon="faReply" v-else-if="notification.type === 'reply'"/>
|
||||||
<fa :icon="faAt" v-if="notification.type === 'mention'"/>
|
<fa :icon="faAt" v-else-if="notification.type === 'mention'"/>
|
||||||
<fa :icon="faQuoteLeft" v-if="notification.type === 'quote'"/>
|
<fa :icon="faQuoteLeft" v-else-if="notification.type === 'quote'"/>
|
||||||
<x-reaction-icon v-if="notification.type === 'reaction'" :reaction="notification.reaction" :no-style="true"/>
|
<x-reaction-icon v-else-if="notification.type === 'reaction'" :reaction="notification.reaction" :no-style="true"/>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="tail">
|
<div class="tail">
|
||||||
<header>
|
<header>
|
||||||
<router-link class="name" :to="notification.user | userPage" v-user-preview="notification.user.id"><mk-user-name :user="notification.user"/></router-link>
|
<router-link v-if="notification.user" class="name" :to="notification.user | userPage" v-user-preview="notification.user.id"><mk-user-name :user="notification.user"/></router-link>
|
||||||
|
<span v-else>{{ notification.header }}</span>
|
||||||
<mk-time :time="notification.createdAt" v-if="withTime"/>
|
<mk-time :time="notification.createdAt" v-if="withTime"/>
|
||||||
</header>
|
</header>
|
||||||
<router-link v-if="notification.type === 'reaction'" class="text" :to="notification.note | notePage" :title="getNoteSummary(notification.note)">
|
<router-link v-if="notification.type === 'reaction'" class="text" :to="notification.note | notePage" :title="getNoteSummary(notification.note)">
|
||||||
@ -42,6 +44,9 @@
|
|||||||
<span v-if="notification.type === 'followRequestAccepted'" class="text" style="opacity: 0.6;">{{ $t('followRequestAccepted') }}</span>
|
<span v-if="notification.type === 'followRequestAccepted'" class="text" style="opacity: 0.6;">{{ $t('followRequestAccepted') }}</span>
|
||||||
<span v-if="notification.type === 'receiveFollowRequest'" class="text" style="opacity: 0.6;">{{ $t('receiveFollowRequest') }}<div v-if="full && !followRequestDone"><button class="_textButton" @click="acceptFollowRequest()">{{ $t('accept') }}</button> | <button class="_textButton" @click="rejectFollowRequest()">{{ $t('reject') }}</button></div></span>
|
<span v-if="notification.type === 'receiveFollowRequest'" class="text" style="opacity: 0.6;">{{ $t('receiveFollowRequest') }}<div v-if="full && !followRequestDone"><button class="_textButton" @click="acceptFollowRequest()">{{ $t('accept') }}</button> | <button class="_textButton" @click="rejectFollowRequest()">{{ $t('reject') }}</button></div></span>
|
||||||
<span v-if="notification.type === 'groupInvited'" class="text" style="opacity: 0.6;">{{ $t('groupInvited') }}: <b>{{ notification.invitation.group.name }}</b><div v-if="full && !groupInviteDone"><button class="_textButton" @click="acceptGroupInvitation()">{{ $t('accept') }}</button> | <button class="_textButton" @click="rejectGroupInvitation()">{{ $t('reject') }}</button></div></span>
|
<span v-if="notification.type === 'groupInvited'" class="text" style="opacity: 0.6;">{{ $t('groupInvited') }}: <b>{{ notification.invitation.group.name }}</b><div v-if="full && !groupInviteDone"><button class="_textButton" @click="acceptGroupInvitation()">{{ $t('accept') }}</button> | <button class="_textButton" @click="rejectGroupInvitation()">{{ $t('reject') }}</button></div></span>
|
||||||
|
<span v-if="notification.type === 'app'" class="text">
|
||||||
|
<mfm :text="notification.body" :nowrap="!full"/>
|
||||||
|
</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
@ -113,12 +118,17 @@ export default Vue.extend({
|
|||||||
.mk-notification {
|
.mk-notification {
|
||||||
position: relative;
|
position: relative;
|
||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
padding: 16px;
|
padding: 24px 32px;
|
||||||
font-size: 0.9em;
|
font-size: 0.9em;
|
||||||
overflow-wrap: break-word;
|
overflow-wrap: break-word;
|
||||||
display: flex;
|
display: flex;
|
||||||
|
|
||||||
@media (max-width: 500px) {
|
&.max-width_600px {
|
||||||
|
padding: 16px;
|
||||||
|
font-size: 0.9em;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.max-width_500px {
|
||||||
padding: 12px;
|
padding: 12px;
|
||||||
font-size: 0.8em;
|
font-size: 0.8em;
|
||||||
}
|
}
|
||||||
@ -137,14 +147,14 @@ export default Vue.extend({
|
|||||||
height: 42px;
|
height: 42px;
|
||||||
margin-right: 8px;
|
margin-right: 8px;
|
||||||
|
|
||||||
> .avatar {
|
> .icon {
|
||||||
display: block;
|
display: block;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
height: 100%;
|
height: 100%;
|
||||||
border-radius: 6px;
|
border-radius: 6px;
|
||||||
}
|
}
|
||||||
|
|
||||||
> .icon {
|
> .sub-icon {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
z-index: 1;
|
z-index: 1;
|
||||||
bottom: -2px;
|
bottom: -2px;
|
||||||
@ -158,6 +168,10 @@ export default Vue.extend({
|
|||||||
font-size: 12px;
|
font-size: 12px;
|
||||||
pointer-events: none;
|
pointer-events: none;
|
||||||
|
|
||||||
|
&:empty {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
> * {
|
> * {
|
||||||
color: #fff;
|
color: #fff;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
|
@ -1,29 +1,28 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="mk-notifications">
|
<div class="mk-notifications">
|
||||||
<div class="contents">
|
<x-list class="notifications" :items="items" v-slot="{ item: notification }">
|
||||||
<x-list class="notifications" :items="items" v-slot="{ item: notification, i }">
|
<x-note v-if="['reply', 'quote', 'mention'].includes(notification.type)" :note="notification.note" :key="notification.id"/>
|
||||||
<x-notification :notification="notification" :with-time="true" :full="true" class="notification" :key="notification.id"/>
|
<x-notification v-else :notification="notification" :with-time="true" :full="true" class="_panel notification" :key="notification.id"/>
|
||||||
</x-list>
|
</x-list>
|
||||||
|
|
||||||
<button class="more _button" v-if="more" @click="fetchMore" :disabled="moreFetching">
|
<button class="_panel _button" v-if="more" @click="fetchMore" :disabled="moreFetching">
|
||||||
<template v-if="!moreFetching">{{ $t('loadMore') }}</template>
|
<template v-if="!moreFetching">{{ $t('loadMore') }}</template>
|
||||||
<template v-if="moreFetching"><fa :icon="faSpinner" pulse fixed-width/></template>
|
<template v-if="moreFetching"><mk-loading inline/></template>
|
||||||
</button>
|
</button>
|
||||||
|
|
||||||
<p class="empty" v-if="empty">{{ $t('noNotifications') }}</p>
|
<p class="empty" v-if="empty">{{ $t('noNotifications') }}</p>
|
||||||
|
|
||||||
<mk-error v-if="error" @retry="init()"/>
|
<mk-error v-if="error" @retry="init()"/>
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import Vue from 'vue';
|
import Vue from 'vue';
|
||||||
import { faSpinner } from '@fortawesome/free-solid-svg-icons';
|
|
||||||
import i18n from '../i18n';
|
import i18n from '../i18n';
|
||||||
import paging from '../scripts/paging';
|
import paging from '../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';
|
||||||
|
import XNote from './note.vue';
|
||||||
|
|
||||||
export default Vue.extend({
|
export default Vue.extend({
|
||||||
i18n,
|
i18n,
|
||||||
@ -31,6 +30,7 @@ export default Vue.extend({
|
|||||||
components: {
|
components: {
|
||||||
XNotification,
|
XNotification,
|
||||||
XList,
|
XList,
|
||||||
|
XNote,
|
||||||
},
|
},
|
||||||
|
|
||||||
mixins: [
|
mixins: [
|
||||||
@ -42,11 +42,6 @@ export default Vue.extend({
|
|||||||
type: String,
|
type: String,
|
||||||
required: false
|
required: false
|
||||||
},
|
},
|
||||||
wide: {
|
|
||||||
type: Boolean,
|
|
||||||
required: false,
|
|
||||||
default: false
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
|
|
||||||
data() {
|
data() {
|
||||||
@ -59,7 +54,6 @@ export default Vue.extend({
|
|||||||
includeTypes: this.type ? [this.type] : undefined
|
includeTypes: this.type ? [this.type] : undefined
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
faSpinner
|
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -93,44 +87,23 @@ export default Vue.extend({
|
|||||||
|
|
||||||
<style lang="scss" scoped>
|
<style lang="scss" scoped>
|
||||||
.mk-notifications {
|
.mk-notifications {
|
||||||
> .contents {
|
> .notifications {
|
||||||
overflow: auto;
|
> ::v-deep * {
|
||||||
height: 100%;
|
//margin-bottom: var(--margin);
|
||||||
padding: 8px 8px 0 8px;
|
margin-bottom: 0;
|
||||||
|
|
||||||
> .notifications {
|
|
||||||
> ::v-deep * {
|
|
||||||
margin-bottom: 8px;
|
|
||||||
}
|
|
||||||
|
|
||||||
> .notification {
|
|
||||||
background: var(--panel);
|
|
||||||
border-radius: 6px;
|
|
||||||
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
> .more {
|
> .empty {
|
||||||
display: block;
|
margin: 0;
|
||||||
width: 100%;
|
padding: 16px;
|
||||||
padding: 16px;
|
text-align: center;
|
||||||
|
color: var(--fg);
|
||||||
|
}
|
||||||
|
|
||||||
> [data-icon] {
|
> .placeholder {
|
||||||
margin-right: 4px;
|
padding: 32px;
|
||||||
}
|
opacity: 0.3;
|
||||||
}
|
|
||||||
|
|
||||||
> .empty {
|
|
||||||
margin: 0;
|
|
||||||
padding: 16px;
|
|
||||||
text-align: center;
|
|
||||||
color: var(--fg);
|
|
||||||
}
|
|
||||||
|
|
||||||
> .placeholder {
|
|
||||||
padding: 32px;
|
|
||||||
opacity: 0.3;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
@ -35,6 +35,7 @@ export default Vue.extend({
|
|||||||
border: solid var(--lineWidth) var(--urlPreviewBorder);
|
border: solid var(--lineWidth) var(--urlPreviewBorder);
|
||||||
border-radius: 4px;
|
border-radius: 4px;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
|
border: 1px solid var(--divider);
|
||||||
|
|
||||||
&:hover {
|
&:hover {
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
@ -42,9 +43,8 @@ export default Vue.extend({
|
|||||||
}
|
}
|
||||||
|
|
||||||
> .thumbnail {
|
> .thumbnail {
|
||||||
position: absolute;
|
width: 100%;
|
||||||
width: 100px;
|
height: 200px;
|
||||||
height: 100%;
|
|
||||||
background-position: center;
|
background-position: center;
|
||||||
background-size: cover;
|
background-size: cover;
|
||||||
display: flex;
|
display: flex;
|
||||||
|
108
src/client/components/particle.vue
Normal file
@ -0,0 +1,108 @@
|
|||||||
|
<template>
|
||||||
|
<div class="vswabwbm" :style="{ top: `${y - 64}px`, left: `${x - 64}px` }" :class="{ active }">
|
||||||
|
<svg width="128" height="128" viewBox="0 0 128 128" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<circle fill="none" cx="64" cy="64">
|
||||||
|
<animate attributeName="r"
|
||||||
|
begin="0s" dur="0.5s"
|
||||||
|
values="4; 32"
|
||||||
|
calcMode="spline"
|
||||||
|
keyTimes="0; 1"
|
||||||
|
keySplines="0.165, 0.84, 0.44, 1"
|
||||||
|
repeatCount="1" />
|
||||||
|
<animate attributeName="stroke-width"
|
||||||
|
begin="0s" dur="0.5s"
|
||||||
|
values="16; 0"
|
||||||
|
calcMode="spline"
|
||||||
|
keyTimes="0; 1"
|
||||||
|
keySplines="0.3, 0.61, 0.355, 1"
|
||||||
|
repeatCount="1" />
|
||||||
|
</circle>
|
||||||
|
<g fill="none" fill-rule="evenodd">
|
||||||
|
<circle v-for="(particle, i) in particles" :key="i" :fill="particle.color">
|
||||||
|
<animate attributeName="r"
|
||||||
|
begin="0s" dur="0.8s"
|
||||||
|
:values="`${particle.size}; 0`"
|
||||||
|
calcMode="spline"
|
||||||
|
keyTimes="0; 1"
|
||||||
|
keySplines="0.165, 0.84, 0.44, 1"
|
||||||
|
repeatCount="1" />
|
||||||
|
<animate attributeName="cx"
|
||||||
|
begin="0s" dur="0.8s"
|
||||||
|
:values="`${particle.xA}; ${particle.xB}`"
|
||||||
|
calcMode="spline"
|
||||||
|
keyTimes="0; 1"
|
||||||
|
keySplines="0.3, 0.61, 0.355, 1"
|
||||||
|
repeatCount="1" />
|
||||||
|
<animate attributeName="cy"
|
||||||
|
begin="0s" dur="0.8s"
|
||||||
|
:values="`${particle.yA}; ${particle.yB}`"
|
||||||
|
calcMode="spline"
|
||||||
|
keyTimes="0; 1"
|
||||||
|
keySplines="0.3, 0.61, 0.355, 1"
|
||||||
|
repeatCount="1" />
|
||||||
|
</circle>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts">
|
||||||
|
import Vue from 'vue';
|
||||||
|
|
||||||
|
export default Vue.extend({
|
||||||
|
props: {
|
||||||
|
x: {
|
||||||
|
type: Number,
|
||||||
|
required: true
|
||||||
|
},
|
||||||
|
y: {
|
||||||
|
type: Number,
|
||||||
|
required: true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
data() {
|
||||||
|
const particles = [];
|
||||||
|
const origin = 64;
|
||||||
|
const colors = ['#FF1493', '#00FFFF', '#FFE202'];
|
||||||
|
|
||||||
|
for (let i = 0; i < 12; i++) {
|
||||||
|
const angle = Math.random() * (Math.PI * 2);
|
||||||
|
const pos = Math.random() * 16;
|
||||||
|
const velocity = 16 + (Math.random() * 48);
|
||||||
|
particles.push({
|
||||||
|
size: 4 + (Math.random() * 8),
|
||||||
|
xA: origin + (Math.sin(angle) * pos),
|
||||||
|
yA: origin + (Math.cos(angle) * pos),
|
||||||
|
xB: origin + (Math.sin(angle) * (pos + velocity)),
|
||||||
|
yB: origin + (Math.cos(angle) * (pos + velocity)),
|
||||||
|
color: colors[Math.floor(Math.random() * colors.length)]
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
particles
|
||||||
|
};
|
||||||
|
},
|
||||||
|
mounted() {
|
||||||
|
setTimeout(() => {
|
||||||
|
this.destroyDom();
|
||||||
|
}, 1100);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
.vswabwbm {
|
||||||
|
pointer-events: none;
|
||||||
|
position: fixed;
|
||||||
|
z-index: 1000000;
|
||||||
|
width: 128px;
|
||||||
|
height: 128px;
|
||||||
|
|
||||||
|
> svg {
|
||||||
|
> circle {
|
||||||
|
stroke: var(--accent);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
@ -53,7 +53,7 @@ import Vue from 'vue';
|
|||||||
import { faExclamationTriangle, faTimes } from '@fortawesome/free-solid-svg-icons';
|
import { faExclamationTriangle, faTimes } from '@fortawesome/free-solid-svg-icons';
|
||||||
import i18n from '../i18n';
|
import i18n from '../i18n';
|
||||||
import { erase } from '../../prelude/array';
|
import { erase } from '../../prelude/array';
|
||||||
import { addTimespan } from '../../prelude/time';
|
import { addTime } from '../../prelude/time';
|
||||||
import { formatDateTimeString } from '../../misc/format-time-string';
|
import { formatDateTimeString } from '../../misc/format-time-string';
|
||||||
import MkInput from './ui/input.vue';
|
import MkInput from './ui/input.vue';
|
||||||
import MkSelect from './ui/select.vue';
|
import MkSelect from './ui/select.vue';
|
||||||
@ -73,7 +73,7 @@ export default Vue.extend({
|
|||||||
choices: ['', ''],
|
choices: ['', ''],
|
||||||
multiple: false,
|
multiple: false,
|
||||||
expiration: 'infinite',
|
expiration: 'infinite',
|
||||||
atDate: formatDateTimeString(addTimespan(new Date(), 1, 'days'), 'yyyy-MM-dd'),
|
atDate: formatDateTimeString(addTime(new Date(), 1, 'day'), 'yyyy-MM-dd'),
|
||||||
atTime: '00:00',
|
atTime: '00:00',
|
||||||
after: 0,
|
after: 0,
|
||||||
unit: 'second',
|
unit: 'second',
|
||||||
|
@ -112,8 +112,7 @@ export default Vue.extend({
|
|||||||
margin: 4px 0;
|
margin: 4px 0;
|
||||||
padding: 4px 8px;
|
padding: 4px 8px;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
color: var(--pollChoiceText);
|
border: solid 1px var(--divider);
|
||||||
border: solid 1px var(--pollChoiceBorder);
|
|
||||||
border-radius: 4px;
|
border-radius: 4px;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="ulveipglmagnxfgvitaxyszerjwiqmwl">
|
<div class="ulveipglmagnxfgvitaxyszerjwiqmwl">
|
||||||
<transition :name="$store.state.device.animation ? 'form-fade' : ''" appear>
|
<transition :name="$store.state.device.animation ? 'form-fade' : ''" appear @after-leave="$emit('closed');">
|
||||||
<div class="bg" ref="bg" v-if="show" @click="close()"></div>
|
<div class="bg" ref="bg" v-if="show" @click="close()"></div>
|
||||||
</transition>
|
</transition>
|
||||||
<div class="main" ref="main" @click.self="close()" @keydown="onKeydown">
|
<div class="main" ref="main" @click.self="close()" @keydown="onKeydown">
|
||||||
@ -17,7 +17,8 @@
|
|||||||
:initial-note="initialNote"
|
:initial-note="initialNote"
|
||||||
:instant="instant"
|
:instant="instant"
|
||||||
@posted="onPosted"
|
@posted="onPosted"
|
||||||
@cancel="onCanceled"/>
|
@cancel="onCanceled"
|
||||||
|
style="border-radius: var(--radius);"/>
|
||||||
</transition>
|
</transition>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
@drop.stop="onDrop"
|
@drop.stop="onDrop"
|
||||||
>
|
>
|
||||||
<header>
|
<header>
|
||||||
<button class="cancel _button" @click="cancel"><fa :icon="faTimes"/></button>
|
<button v-if="!fixed" class="cancel _button" @click="cancel"><fa :icon="faTimes"/></button>
|
||||||
<div>
|
<div>
|
||||||
<span class="text-count" :class="{ over: trimmedLength(text) > max }">{{ max - trimmedLength(text) }}</span>
|
<span class="text-count" :class="{ over: trimmedLength(text) > max }">{{ max - trimmedLength(text) }}</span>
|
||||||
<button class="_button visibility" @click="setVisibility" ref="visibilityButton">
|
<button class="_button visibility" @click="setVisibility" ref="visibilityButton">
|
||||||
@ -18,7 +18,7 @@
|
|||||||
<button class="submit _buttonPrimary" :disabled="!canPost" @click="post">{{ submitText }}<fa :icon="reply ? faReply : renote ? faQuoteRight : faPaperPlane"/></button>
|
<button class="submit _buttonPrimary" :disabled="!canPost" @click="post">{{ submitText }}<fa :icon="reply ? faReply : renote ? faQuoteRight : faPaperPlane"/></button>
|
||||||
</div>
|
</div>
|
||||||
</header>
|
</header>
|
||||||
<div class="form">
|
<div class="form" :class="{ fixed }">
|
||||||
<x-note-preview class="preview" v-if="reply" :note="reply"/>
|
<x-note-preview class="preview" v-if="reply" :note="reply"/>
|
||||||
<x-note-preview class="preview" v-if="renote" :note="renote"/>
|
<x-note-preview class="preview" v-if="renote" :note="renote"/>
|
||||||
<div class="with-quote" v-if="quoteId"><fa icon="quote-left"/> {{ $t('quoteAttached') }}<button @click="quoteId = null"><fa icon="times"/></button></div>
|
<div class="with-quote" v-if="quoteId"><fa icon="quote-left"/> {{ $t('quoteAttached') }}<button @click="quoteId = null"><fa icon="times"/></button></div>
|
||||||
@ -108,6 +108,11 @@ export default Vue.extend({
|
|||||||
type: Boolean,
|
type: Boolean,
|
||||||
required: false,
|
required: false,
|
||||||
default: false
|
default: false
|
||||||
|
},
|
||||||
|
fixed: {
|
||||||
|
type: Boolean,
|
||||||
|
required: false,
|
||||||
|
default: false
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -295,6 +300,7 @@ export default Vue.extend({
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
this.visibility = init.visibility;
|
this.visibility = init.visibility;
|
||||||
|
this.localOnly = init.localOnly;
|
||||||
this.quoteId = init.renote ? init.renote.id : null;
|
this.quoteId = init.renote ? init.renote.id : null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -581,8 +587,6 @@ export default Vue.extend({
|
|||||||
<style lang="scss" scoped>
|
<style lang="scss" scoped>
|
||||||
.gafaadew {
|
.gafaadew {
|
||||||
background: var(--panel);
|
background: var(--panel);
|
||||||
border-radius: var(--radius);
|
|
||||||
box-shadow: 0 0 2px rgba(#000, 0.1);
|
|
||||||
|
|
||||||
> header {
|
> header {
|
||||||
z-index: 1000;
|
z-index: 1000;
|
||||||
@ -651,6 +655,10 @@ export default Vue.extend({
|
|||||||
max-width: 500px;
|
max-width: 500px;
|
||||||
margin: 0 auto;
|
margin: 0 auto;
|
||||||
|
|
||||||
|
&.fixed {
|
||||||
|
max-width: unset;
|
||||||
|
}
|
||||||
|
|
||||||
> .preview {
|
> .preview {
|
||||||
padding: 16px;
|
padding: 16px;
|
||||||
}
|
}
|
||||||
|
@ -1,20 +1,9 @@
|
|||||||
<template>
|
<template>
|
||||||
<x-popup :source="source" ref="popup" @closed="() => { $emit('closed'); destroyDom(); }" v-hotkey.global="keymap">
|
<x-popup :source="source" ref="popup" @closed="() => { $emit('closed'); destroyDom(); }" v-hotkey.global="keymap">
|
||||||
<div class="rdfaahpb">
|
<div class="rdfaahpb">
|
||||||
<transition-group
|
<div class="buttons" ref="buttons" :class="{ showFocus }">
|
||||||
name="reaction-fade"
|
<button class="_button" v-for="(reaction, i) in rs" :key="reaction" @click="react(reaction)" :tabindex="i + 1" :title="reaction" v-particle><x-reaction-icon :reaction="reaction"/></button>
|
||||||
tag="div"
|
</div>
|
||||||
class="buttons"
|
|
||||||
ref="buttons"
|
|
||||||
:class="{ showFocus }"
|
|
||||||
:css="false"
|
|
||||||
@before-enter="beforeEnter"
|
|
||||||
@enter="enter"
|
|
||||||
mode="out-in"
|
|
||||||
appear
|
|
||||||
>
|
|
||||||
<button class="_button" v-for="(reaction, i) in rs" :key="reaction" @click="react(reaction)" :tabindex="i + 1" :title="reaction"><x-reaction-icon :reaction="reaction"/></button>
|
|
||||||
</transition-group>
|
|
||||||
<input class="text" v-model="text" :placeholder="$t('enterEmoji')" @keyup.enter="reactText" @input="tryReactText" v-autocomplete="{ model: 'text' }">
|
<input class="text" v-model="text" :placeholder="$t('enterEmoji')" @keyup.enter="reactText" @input="tryReactText" v-autocomplete="{ model: 'text' }">
|
||||||
</div>
|
</div>
|
||||||
</x-popup>
|
</x-popup>
|
||||||
@ -84,7 +73,7 @@ export default Vue.extend({
|
|||||||
|
|
||||||
watch: {
|
watch: {
|
||||||
focus(i) {
|
focus(i) {
|
||||||
this.$refs.buttons.children[i].elm.focus();
|
this.$refs.buttons.children[i].focus();
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -129,21 +118,7 @@ export default Vue.extend({
|
|||||||
},
|
},
|
||||||
|
|
||||||
choose() {
|
choose() {
|
||||||
this.$refs.buttons.children[this.focus].elm.click();
|
this.$refs.buttons.children[this.focus].click();
|
||||||
},
|
|
||||||
|
|
||||||
beforeEnter(el) {
|
|
||||||
el.style.opacity = 0;
|
|
||||||
el.style.transform = 'scale(0.7)';
|
|
||||||
},
|
|
||||||
|
|
||||||
enter(el, done) {
|
|
||||||
el.style.transition = [getComputedStyle(el).transition, 'transform 1s cubic-bezier(0.23, 1, 0.32, 1)', 'opacity 0.7s cubic-bezier(0.23, 1, 0.32, 1)'].filter(x => x != '').join(',');
|
|
||||||
setTimeout(() => {
|
|
||||||
el.style.opacity = 1;
|
|
||||||
el.style.transform = 'scale(1)';
|
|
||||||
setTimeout(done, 1000);
|
|
||||||
}, 0 * el.dataset.index)
|
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
@ -1,16 +1,17 @@
|
|||||||
<template>
|
<template>
|
||||||
<span
|
<button
|
||||||
class="reaction _button"
|
class="hkzvhatu _button"
|
||||||
:class="{ reacted: note.myReaction == reaction }"
|
:class="{ reacted: note.myReaction == reaction }"
|
||||||
@click="toggleReaction(reaction)"
|
@click="toggleReaction(reaction)"
|
||||||
v-if="count > 0"
|
v-if="count > 0"
|
||||||
@mouseover="onMouseover"
|
@mouseover="onMouseover"
|
||||||
@mouseleave="onMouseleave"
|
@mouseleave="onMouseleave"
|
||||||
ref="reaction"
|
ref="reaction"
|
||||||
|
v-particle
|
||||||
>
|
>
|
||||||
<x-reaction-icon :reaction="reaction" ref="icon"/>
|
<x-reaction-icon :reaction="reaction" ref="icon"/>
|
||||||
<span>{{ count }}</span>
|
<span>{{ count }}</span>
|
||||||
</span>
|
</button>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
@ -136,7 +137,7 @@ export default Vue.extend({
|
|||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="scss" scoped>
|
<style lang="scss" scoped>
|
||||||
.reaction {
|
.hkzvhatu {
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
height: 32px;
|
height: 32px;
|
||||||
margin: 2px;
|
margin: 2px;
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="mk-reactions-viewer" :class="{ isMe }">
|
<div class="tdflqwzn" :class="{ isMe }">
|
||||||
<x-reaction v-for="(count, reaction) in note.reactions" :reaction="reaction" :count="count" :is-initial="initialReactions.has(reaction)" :note="note" :key="reaction"/>
|
<x-reaction v-for="(count, reaction) in note.reactions" :reaction="reaction" :count="count" :is-initial="initialReactions.has(reaction)" :note="note" :key="reaction"/>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
@ -32,7 +32,7 @@ export default Vue.extend({
|
|||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="scss" scoped>
|
<style lang="scss" scoped>
|
||||||
.mk-reactions-viewer {
|
.tdflqwzn {
|
||||||
margin: 4px -2px 0 -2px;
|
margin: 4px -2px 0 -2px;
|
||||||
|
|
||||||
&:empty {
|
&:empty {
|
||||||
|
36
src/client/components/remote-caution.vue
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
<template>
|
||||||
|
<div class="jmgmzlwq _panel"><fa :icon="faExclamationTriangle" style="margin-right: 8px;"/>{{ $t('remoteUserCaution') }}<a :href="href" rel="nofollow noopener" target="_blank">{{ $t('showOnRemote') }}</a></div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts">
|
||||||
|
import Vue from 'vue';
|
||||||
|
import { faExclamationTriangle } from '@fortawesome/free-solid-svg-icons';
|
||||||
|
import i18n from '../i18n';
|
||||||
|
|
||||||
|
export default Vue.extend({
|
||||||
|
i18n,
|
||||||
|
props: {
|
||||||
|
href: {
|
||||||
|
type: String,
|
||||||
|
required: true
|
||||||
|
},
|
||||||
|
},
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
faExclamationTriangle
|
||||||
|
};
|
||||||
|
}
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
.jmgmzlwq {
|
||||||
|
font-size: 0.8em;
|
||||||
|
padding: 16px;
|
||||||
|
|
||||||
|
> a {
|
||||||
|
margin-left: 4px;
|
||||||
|
color: var(--accent);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
@ -1,80 +0,0 @@
|
|||||||
<template>
|
|
||||||
<transition-group v-if="$store.state.device.animation"
|
|
||||||
class="uupnnhew"
|
|
||||||
:data-direction="direction"
|
|
||||||
:data-reversed="reversed ? 'true' : 'false'"
|
|
||||||
name="staggered"
|
|
||||||
tag="div"
|
|
||||||
appear
|
|
||||||
>
|
|
||||||
<slot></slot>
|
|
||||||
</transition-group>
|
|
||||||
<div v-else>
|
|
||||||
<slot></slot>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script lang="ts">
|
|
||||||
import Vue from 'vue';
|
|
||||||
|
|
||||||
export default Vue.extend({
|
|
||||||
props: {
|
|
||||||
delay: {
|
|
||||||
type: Number,
|
|
||||||
required: false,
|
|
||||||
default: 40
|
|
||||||
},
|
|
||||||
direction: {
|
|
||||||
type: String,
|
|
||||||
required: false,
|
|
||||||
default: 'down'
|
|
||||||
},
|
|
||||||
reversed: {
|
|
||||||
type: Boolean,
|
|
||||||
required: false,
|
|
||||||
default: false
|
|
||||||
}
|
|
||||||
},
|
|
||||||
methods: {
|
|
||||||
focus() {
|
|
||||||
this.$slots.default[0].elm.focus();
|
|
||||||
}
|
|
||||||
},
|
|
||||||
});
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<style lang="scss">
|
|
||||||
.staggered-move {
|
|
||||||
transition: transform 0.7s cubic-bezier(0.23, 1, 0.32, 1) !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
.uupnnhew[data-direction="up"] {
|
|
||||||
.staggered-enter {
|
|
||||||
opacity: 0;
|
|
||||||
transform: translateY(64px);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.uupnnhew[data-direction="down"] {
|
|
||||||
.staggered-enter {
|
|
||||||
opacity: 0;
|
|
||||||
transform: translateY(-64px);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.uupnnhew[data-reversed="true"] {
|
|
||||||
@for $i from 1 through 30 {
|
|
||||||
.staggered-enter-active:nth-last-child(#{$i}) {
|
|
||||||
transition: transform 0.7s cubic-bezier(0.23, 1, 0.32, 1) (15ms * ($i - 1)), opacity 0.7s cubic-bezier(0.23, 1, 0.32, 1) (15ms * ($i - 1));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.uupnnhew[data-reversed="false"] {
|
|
||||||
@for $i from 1 through 30 {
|
|
||||||
.staggered-enter-active:nth-child(#{$i}) {
|
|
||||||
transition: transform 0.7s cubic-bezier(0.23, 1, 0.32, 1) (15ms * ($i - 1)), opacity 0.7s cubic-bezier(0.23, 1, 0.32, 1) (15ms * ($i - 1));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</style>
|
|
@ -1,7 +1,7 @@
|
|||||||
<template>
|
<template>
|
||||||
<x-window ref="window" @closed="() => { $emit('closed'); destroyDom(); }">
|
<x-window ref="window" @closed="() => { $emit('closed'); destroyDom(); }">
|
||||||
<template #header>{{ $t('login') }}</template>
|
<template #header>{{ $t('login') }}</template>
|
||||||
<x-signin :auto-set="autoSet" @login="onLogin"/>
|
<mk-signin :auto-set="autoSet" @login="onLogin"/>
|
||||||
</x-window>
|
</x-window>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
@ -9,13 +9,13 @@
|
|||||||
import Vue from 'vue';
|
import Vue from 'vue';
|
||||||
import i18n from '../i18n';
|
import i18n from '../i18n';
|
||||||
import XWindow from './window.vue';
|
import XWindow from './window.vue';
|
||||||
import XSignin from './signin.vue';
|
import MkSignin from './signin.vue';
|
||||||
|
|
||||||
export default Vue.extend({
|
export default Vue.extend({
|
||||||
i18n,
|
i18n,
|
||||||
|
|
||||||
components: {
|
components: {
|
||||||
XSignin,
|
MkSignin,
|
||||||
XWindow,
|
XWindow,
|
||||||
},
|
},
|
||||||
|
|
||||||
|
10
src/client/components/signin.vue
Normal file → Executable file
@ -12,9 +12,9 @@
|
|||||||
<template #prefix><fa :icon="faLock"/></template>
|
<template #prefix><fa :icon="faLock"/></template>
|
||||||
</mk-input>
|
</mk-input>
|
||||||
<mk-button type="submit" primary :disabled="signing" style="margin: 0 auto;">{{ signing ? $t('loggingIn') : $t('login') }}</mk-button>
|
<mk-button type="submit" primary :disabled="signing" style="margin: 0 auto;">{{ signing ? $t('loggingIn') : $t('login') }}</mk-button>
|
||||||
<p v-if="meta && meta.enableTwitterIntegration" style="margin: 8px 0;"><a :href="`${apiUrl}/signin/twitter`"><fa :icon="faTwitter"/> {{ $t('signinWith', { x: 'Twitter' }) }}</a></p>
|
<a class="_panel _button" style="margin: 8px auto;" v-if="meta && meta.enableTwitterIntegration" :href="`${apiUrl}/signin/twitter`"><fa :icon="faTwitter" style="margin-right: 4px;"/>{{ $t('signinWith', { x: 'Twitter' }) }}</a>
|
||||||
<p v-if="meta && meta.enableGithubIntegration" style="margin: 8px 0;"><a :href="`${apiUrl}/signin/github`"><fa :icon="faGithub"/> {{ $t('signinWith', { x: 'GitHub' }) }}</a></p>
|
<a class="_panel _button" style="margin: 8px auto;" v-if="meta && meta.enableGithubIntegration" :href="`${apiUrl}/signin/github`"><fa :icon="faGithub" style="margin-right: 4px;"/>{{ $t('signinWith', { x: 'GitHub' }) }}</a>
|
||||||
<p v-if="meta && meta.enableDiscordIntegration" style="margin: 8px 0;"><a :href="`${apiUrl}/signin/discord`"><fa :icon="faDiscord"/> {{ $t('signinWith', { x: 'Discord' }) }}</a></p>
|
<a class="_panel _button" style="margin: 8px auto;" v-if="meta && meta.enableDiscordIntegration" :href="`${apiUrl}/signin/discord`"><fa :icon="faDiscord" style="margin-right: 4px;"/>{{ $t('signinWith', { x: 'Discord' }) }}</a>
|
||||||
</div>
|
</div>
|
||||||
<div class="2fa-signin" v-if="totpLogin" :class="{ securityKeys: user && user.securityKeys }">
|
<div class="2fa-signin" v-if="totpLogin" :class="{ securityKeys: user && user.securityKeys }">
|
||||||
<div v-if="user && user.securityKeys" class="twofa-group tap-group">
|
<div v-if="user && user.securityKeys" class="twofa-group tap-group">
|
||||||
@ -155,7 +155,7 @@ export default Vue.extend({
|
|||||||
if (err === null) return;
|
if (err === null) return;
|
||||||
this.$root.dialog({
|
this.$root.dialog({
|
||||||
type: 'error',
|
type: 'error',
|
||||||
text: this.$t('login-failed')
|
text: this.$t('signinFailed')
|
||||||
});
|
});
|
||||||
this.signing = false;
|
this.signing = false;
|
||||||
});
|
});
|
||||||
@ -176,7 +176,7 @@ export default Vue.extend({
|
|||||||
}).catch(() => {
|
}).catch(() => {
|
||||||
this.$root.dialog({
|
this.$root.dialog({
|
||||||
type: 'error',
|
type: 'error',
|
||||||
text: this.$t('login-failed')
|
text: this.$t('signinFailed')
|
||||||
});
|
});
|
||||||
this.challengeData = null;
|
this.challengeData = null;
|
||||||
this.totpLogin = false;
|
this.totpLogin = false;
|
||||||
|
@ -38,7 +38,7 @@
|
|||||||
</mk-input>
|
</mk-input>
|
||||||
<mk-switch v-model="ToSAgreement" v-if="meta.tosUrl">
|
<mk-switch v-model="ToSAgreement" v-if="meta.tosUrl">
|
||||||
<i18n path="agreeTo">
|
<i18n path="agreeTo">
|
||||||
<a :href="meta.tosUrl" target="_blank">{{ $t('tos') }}</a>
|
<a :href="meta.tosUrl" class="_link" target="_blank">{{ $t('tos') }}</a>
|
||||||
</i18n>
|
</i18n>
|
||||||
</mk-switch>
|
</mk-switch>
|
||||||
<div v-if="meta.enableRecaptcha" class="g-recaptcha" :data-sitekey="meta.recaptchaSiteKey" style="margin: 16px 0;"></div>
|
<div v-if="meta.enableRecaptcha" class="g-recaptcha" :data-sitekey="meta.recaptchaSiteKey" style="margin: 16px 0;"></div>
|
||||||
|
80
src/client/components/stream-indicator.vue
Normal file
@ -0,0 +1,80 @@
|
|||||||
|
<template>
|
||||||
|
<div class="nsbbhtug" v-if="hasDisconnected" @click="resetDisconnected">
|
||||||
|
<div>{{ $t('disconnectedFromServer') }}</div>
|
||||||
|
<div class="command">
|
||||||
|
<button class="_textButton" @click="reload">{{ $t('reload') }}</button>
|
||||||
|
<button class="_textButton">{{ $t('doNothing') }}</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts">
|
||||||
|
import Vue from 'vue';
|
||||||
|
import i18n from '../i18n';
|
||||||
|
|
||||||
|
export default Vue.extend({
|
||||||
|
i18n,
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
hasDisconnected: false,
|
||||||
|
}
|
||||||
|
},
|
||||||
|
computed: {
|
||||||
|
stream() {
|
||||||
|
return this.$root.stream;
|
||||||
|
},
|
||||||
|
},
|
||||||
|
created() {
|
||||||
|
this.$root.stream.on('_connected_', this.onConnected);
|
||||||
|
this.$root.stream.on('_disconnected_', this.onDisconnected);
|
||||||
|
},
|
||||||
|
beforeDestroy() {
|
||||||
|
this.$root.stream.off('_connected_', this.onConnected);
|
||||||
|
this.$root.stream.off('_disconnected_', this.onDisconnected);
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
onConnected() {
|
||||||
|
if (this.hasDisconnected) {
|
||||||
|
if (this.$store.state.device.autoReload) {
|
||||||
|
this.reload();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
onDisconnected() {
|
||||||
|
this.hasDisconnected = true;
|
||||||
|
},
|
||||||
|
resetDisconnected() {
|
||||||
|
this.hasDisconnected = false;
|
||||||
|
},
|
||||||
|
reload() {
|
||||||
|
location.reload();
|
||||||
|
},
|
||||||
|
}
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
.nsbbhtug {
|
||||||
|
position: fixed;
|
||||||
|
z-index: 16385;
|
||||||
|
bottom: 8px;
|
||||||
|
right: 8px;
|
||||||
|
margin: 0;
|
||||||
|
padding: 6px 12px;
|
||||||
|
font-size: 0.9em;
|
||||||
|
color: #fff;
|
||||||
|
background: #000;
|
||||||
|
opacity: 0.8;
|
||||||
|
border-radius: 4px;
|
||||||
|
max-width: 320px;
|
||||||
|
|
||||||
|
> .command {
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-around;
|
||||||
|
|
||||||
|
> button {
|
||||||
|
padding: 0.7em;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
@ -1,5 +1,5 @@
|
|||||||
<template>
|
<template>
|
||||||
<x-notes ref="tl" :pagination="pagination" @before="$emit('before')" @after="e => $emit('after', e)"/>
|
<x-notes ref="tl" :pagination="pagination" @before="$emit('before')" @after="e => $emit('after', e)" @queue="$emit('queue', $event)"/>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
@ -21,6 +21,11 @@ export default Vue.extend({
|
|||||||
},
|
},
|
||||||
antenna: {
|
antenna: {
|
||||||
required: false
|
required: false
|
||||||
|
},
|
||||||
|
sound: {
|
||||||
|
type: Boolean,
|
||||||
|
required: false,
|
||||||
|
default: false,
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -46,6 +51,10 @@ export default Vue.extend({
|
|||||||
|
|
||||||
const prepend = note => {
|
const prepend = note => {
|
||||||
(this.$refs.tl as any).prepend(note);
|
(this.$refs.tl as any).prepend(note);
|
||||||
|
|
||||||
|
if (this.sound) {
|
||||||
|
this.$root.sound(note.userId === this.$store.state.i.id ? 'noteMy' : 'note');
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
const onUserAdded = () => {
|
const onUserAdded = () => {
|
||||||
|
@ -124,7 +124,6 @@ export default Vue.extend({
|
|||||||
&.primary {
|
&.primary {
|
||||||
color: #fff;
|
color: #fff;
|
||||||
background: var(--accent);
|
background: var(--accent);
|
||||||
box-shadow: 0 6px 16px var(--accentShadow);
|
|
||||||
|
|
||||||
&:not(:disabled):hover {
|
&:not(:disabled):hover {
|
||||||
background: var(--jkhztclx);
|
background: var(--jkhztclx);
|
||||||
|
@ -110,6 +110,7 @@ export default Vue.extend({
|
|||||||
> header {
|
> header {
|
||||||
position: relative;
|
position: relative;
|
||||||
box-shadow: 0 1px 0 0 var(--divider);
|
box-shadow: 0 1px 0 0 var(--divider);
|
||||||
|
z-index: 1;
|
||||||
|
|
||||||
> .title {
|
> .title {
|
||||||
margin: 0;
|
margin: 0;
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
<template>
|
<template>
|
||||||
<sequential-entrance class="cxiknjgy" :class="{ autoMargin }">
|
<div class="cxiknjgy" :class="{ autoMargin }">
|
||||||
<slot :items="items"></slot>
|
<slot :items="items"></slot>
|
||||||
<div class="empty" v-if="empty" key="_empty_">
|
<div class="empty" v-if="empty" key="_empty_">
|
||||||
<slot name="empty"></slot>
|
<slot name="empty"></slot>
|
||||||
@ -10,7 +10,7 @@
|
|||||||
<template v-if="moreFetching"><mk-loading inline/></template>
|
<template v-if="moreFetching"><mk-loading inline/></template>
|
||||||
</mk-button>
|
</mk-button>
|
||||||
</div>
|
</div>
|
||||||
</sequential-entrance>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
|
138
src/client/components/ui/range.vue
Normal file
@ -0,0 +1,138 @@
|
|||||||
|
<template>
|
||||||
|
<div class="timctyfi" :class="{ focused, disabled }">
|
||||||
|
<div class="icon"><slot name="icon"></slot></div>
|
||||||
|
<span class="title"><slot name="title"></slot></span>
|
||||||
|
<input
|
||||||
|
type="range"
|
||||||
|
ref="input"
|
||||||
|
v-model="v"
|
||||||
|
:disabled="disabled"
|
||||||
|
:min="min"
|
||||||
|
:max="max"
|
||||||
|
:step="step"
|
||||||
|
:autofocus="autofocus"
|
||||||
|
@focus="focused = true"
|
||||||
|
@blur="focused = false"
|
||||||
|
@input="$emit('input', $event.target.value)"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts">
|
||||||
|
import Vue from "vue";
|
||||||
|
export default Vue.extend({
|
||||||
|
props: {
|
||||||
|
value: {
|
||||||
|
type: Number,
|
||||||
|
required: false,
|
||||||
|
default: 0
|
||||||
|
},
|
||||||
|
disabled: {
|
||||||
|
type: Boolean,
|
||||||
|
required: false,
|
||||||
|
default: false
|
||||||
|
},
|
||||||
|
min: {
|
||||||
|
type: Number,
|
||||||
|
required: false,
|
||||||
|
default: 0
|
||||||
|
},
|
||||||
|
max: {
|
||||||
|
type: Number,
|
||||||
|
required: false,
|
||||||
|
default: 100
|
||||||
|
},
|
||||||
|
step: {
|
||||||
|
type: Number,
|
||||||
|
required: false,
|
||||||
|
default: 1
|
||||||
|
},
|
||||||
|
autofocus: {
|
||||||
|
type: Boolean,
|
||||||
|
required: false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
v: this.value,
|
||||||
|
focused: false
|
||||||
|
};
|
||||||
|
},
|
||||||
|
watch: {
|
||||||
|
value(v) {
|
||||||
|
this.v = parseFloat(v);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
mounted() {
|
||||||
|
if (this.autofocus) {
|
||||||
|
this.$nextTick(() => {
|
||||||
|
this.$refs.input.focus();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
.timctyfi {
|
||||||
|
position: relative;
|
||||||
|
margin: 8px;
|
||||||
|
|
||||||
|
> .icon {
|
||||||
|
display: inline-block;
|
||||||
|
width: 24px;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
> .title {
|
||||||
|
pointer-events: none;
|
||||||
|
font-size: 16px;
|
||||||
|
color: var(--inputLabel);
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
> input {
|
||||||
|
-webkit-appearance: none;
|
||||||
|
-moz-appearance: none;
|
||||||
|
appearance: none;
|
||||||
|
background: var(--xxubwiul);
|
||||||
|
height: 7px;
|
||||||
|
margin: 0 8px;
|
||||||
|
outline: 0;
|
||||||
|
border: 0;
|
||||||
|
border-radius: 7px;
|
||||||
|
|
||||||
|
&.disabled {
|
||||||
|
opacity: 0.6;
|
||||||
|
cursor: not-allowed;
|
||||||
|
}
|
||||||
|
|
||||||
|
&::-webkit-slider-thumb {
|
||||||
|
-webkit-appearance: none;
|
||||||
|
appearance: none;
|
||||||
|
cursor: pointer;
|
||||||
|
width: 20px;
|
||||||
|
height: 20px;
|
||||||
|
display: block;
|
||||||
|
border-radius: 50%;
|
||||||
|
border: none;
|
||||||
|
background: var(--accent);
|
||||||
|
box-shadow: 0 0 6px rgba(0, 0, 0, 0.3);
|
||||||
|
box-sizing: content-box;
|
||||||
|
}
|
||||||
|
|
||||||
|
&::-moz-range-thumb {
|
||||||
|
-moz-appearance: none;
|
||||||
|
appearance: none;
|
||||||
|
cursor: pointer;
|
||||||
|
width: 20px;
|
||||||
|
height: 20px;
|
||||||
|
display: block;
|
||||||
|
border-radius: 50%;
|
||||||
|
border: none;
|
||||||
|
background: var(--accent);
|
||||||
|
box-shadow: 0 0 6px rgba(0, 0, 0, 0.3);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
@ -56,7 +56,7 @@ export default Vue.extend({
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
filled(): boolean {
|
filled(): boolean {
|
||||||
return this.v != '' && this.v != null;
|
return true;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
mounted() {
|
mounted() {
|
||||||
@ -100,6 +100,7 @@ export default Vue.extend({
|
|||||||
|
|
||||||
> .input {
|
> .input {
|
||||||
display: flex;
|
display: flex;
|
||||||
|
position: relative;
|
||||||
|
|
||||||
&:before {
|
&:before {
|
||||||
content: '';
|
content: '';
|
||||||
@ -151,12 +152,17 @@ export default Vue.extend({
|
|||||||
font-weight: normal;
|
font-weight: normal;
|
||||||
font-size: 16px;
|
font-size: 16px;
|
||||||
height: 32px;
|
height: 32px;
|
||||||
background: var(--panel);
|
background: none;
|
||||||
border: none;
|
border: none;
|
||||||
border-radius: 0;
|
border-radius: 0;
|
||||||
outline: none;
|
outline: none;
|
||||||
box-shadow: none;
|
box-shadow: none;
|
||||||
color: var(--fg);
|
color: var(--fg);
|
||||||
|
|
||||||
|
option,
|
||||||
|
optgroup {
|
||||||
|
background: var(--bg);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
> .prefix,
|
> .prefix,
|
||||||
|
@ -1,19 +1,19 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="fgmtyycl _panel" :style="{ top: top + 'px', left: left + 'px' }">
|
<div class="fgmtyycl _panel" :style="{ top: top + 'px', left: left + 'px' }">
|
||||||
<x-url-preview :url="url"/>
|
<mk-url-preview :url="url"/>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import Vue from 'vue';
|
import Vue from 'vue';
|
||||||
import i18n from '../i18n';
|
import i18n from '../i18n';
|
||||||
import XUrlPreview from './url-preview.vue';
|
import MkUrlPreview from './url-preview.vue';
|
||||||
|
|
||||||
export default Vue.extend({
|
export default Vue.extend({
|
||||||
i18n,
|
i18n,
|
||||||
|
|
||||||
components: {
|
components: {
|
||||||
XUrlPreview
|
MkUrlPreview
|
||||||
},
|
},
|
||||||
|
|
||||||
props: {
|
props: {
|
||||||
|
@ -230,8 +230,8 @@ export default Vue.extend({
|
|||||||
position: relative;
|
position: relative;
|
||||||
display: block;
|
display: block;
|
||||||
font-size: 14px;
|
font-size: 14px;
|
||||||
box-shadow: 0 1px 4px var(--tyvedwbe);
|
box-shadow: 0 0 0 1px var(--divider);
|
||||||
border-radius: 4px;
|
border-radius: 6px;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
|
|
||||||
&:hover {
|
&:hover {
|
||||||
|
@ -23,7 +23,7 @@ import Vue from 'vue';
|
|||||||
import { faExternalLinkSquareAlt } from '@fortawesome/free-solid-svg-icons';
|
import { faExternalLinkSquareAlt } from '@fortawesome/free-solid-svg-icons';
|
||||||
import { toUnicode as decodePunycode } from 'punycode';
|
import { toUnicode as decodePunycode } from 'punycode';
|
||||||
import { url as local } from '../config';
|
import { url as local } from '../config';
|
||||||
import XUrlPreview from './url-preview-popup.vue';
|
import MkUrlPreview from './url-preview-popup.vue';
|
||||||
|
|
||||||
export default Vue.extend({
|
export default Vue.extend({
|
||||||
props: {
|
props: {
|
||||||
@ -51,6 +51,7 @@ export default Vue.extend({
|
|||||||
target: self ? null : '_blank',
|
target: self ? null : '_blank',
|
||||||
showTimer: null,
|
showTimer: null,
|
||||||
hideTimer: null,
|
hideTimer: null,
|
||||||
|
checkTimer: null,
|
||||||
preview: null,
|
preview: null,
|
||||||
faExternalLinkSquareAlt
|
faExternalLinkSquareAlt
|
||||||
};
|
};
|
||||||
@ -69,7 +70,7 @@ export default Vue.extend({
|
|||||||
if (!document.body.contains(this.$el)) return;
|
if (!document.body.contains(this.$el)) return;
|
||||||
if (this.preview) return;
|
if (this.preview) return;
|
||||||
|
|
||||||
this.preview = new XUrlPreview({
|
this.preview = new MkUrlPreview({
|
||||||
parent: this,
|
parent: this,
|
||||||
propsData: {
|
propsData: {
|
||||||
url: this.url,
|
url: this.url,
|
||||||
@ -78,9 +79,14 @@ export default Vue.extend({
|
|||||||
}).$mount();
|
}).$mount();
|
||||||
|
|
||||||
document.body.appendChild(this.preview.$el);
|
document.body.appendChild(this.preview.$el);
|
||||||
|
|
||||||
|
this.checkTimer = setInterval(() => {
|
||||||
|
if (!document.body.contains(this.$el)) this.closePreview();
|
||||||
|
}, 1000);
|
||||||
},
|
},
|
||||||
closePreview() {
|
closePreview() {
|
||||||
if (this.preview) {
|
if (this.preview) {
|
||||||
|
clearInterval(this.checkTimer);
|
||||||
this.preview.destroyDom();
|
this.preview.destroyDom();
|
||||||
this.preview = null;
|
this.preview = null;
|
||||||
}
|
}
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
|
|
||||||
<div class="efvhhmdq">
|
<div class="efvhhmdq">
|
||||||
<div class="no-users" v-if="empty">
|
<div class="no-users" v-if="empty">
|
||||||
<p>{{ $t('no-users') }}</p>
|
<p>{{ $t('noUsers') }}</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="user" v-for="user in users" :key="user.id">
|
<div class="user" v-for="user in users" :key="user.id">
|
||||||
<mk-avatar class="avatar" :user="user"/>
|
<mk-avatar class="avatar" :user="user"/>
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
<template #header><mk-user-name :user="user"/></template>
|
<template #header><mk-user-name :user="user"/></template>
|
||||||
<div class="vrcsvlkm">
|
<div class="vrcsvlkm">
|
||||||
<mk-button @click="resetPassword()" primary>{{ $t('resetPassword') }}</mk-button>
|
<mk-button @click="resetPassword()" primary>{{ $t('resetPassword') }}</mk-button>
|
||||||
<mk-switch v-if="$store.state.i.isAdmin && !user.isAdmin" @change="toggleModerator()" v-model="moderator">{{ $t('moderator') }}</mk-switch>
|
<mk-switch v-if="$store.state.i.isAdmin && (this.moderator || !user.isAdmin)" @change="toggleModerator()" v-model="moderator">{{ $t('moderator') }}</mk-switch>
|
||||||
<mk-switch @change="toggleSilence()" v-model="silenced">{{ $t('silence') }}</mk-switch>
|
<mk-switch @change="toggleSilence()" v-model="silenced">{{ $t('silence') }}</mk-switch>
|
||||||
<mk-switch @change="toggleSuspend()" v-model="suspended">{{ $t('suspend') }}</mk-switch>
|
<mk-switch @change="toggleSuspend()" v-model="suspended">{{ $t('suspend') }}</mk-switch>
|
||||||
</div>
|
</div>
|
||||||
|
@ -53,6 +53,7 @@ export default Vue.extend({
|
|||||||
return {
|
return {
|
||||||
u: null,
|
u: null,
|
||||||
show: false,
|
show: false,
|
||||||
|
closed: false,
|
||||||
top: 0,
|
top: 0,
|
||||||
left: 0,
|
left: 0,
|
||||||
};
|
};
|
||||||
@ -68,6 +69,7 @@ export default Vue.extend({
|
|||||||
{ userId: this.user };
|
{ userId: this.user };
|
||||||
|
|
||||||
this.$root.api('users/show', query).then(user => {
|
this.$root.api('users/show', query).then(user => {
|
||||||
|
if (this.closed) return;
|
||||||
this.u = user;
|
this.u = user;
|
||||||
this.show = true;
|
this.show = true;
|
||||||
});
|
});
|
||||||
@ -83,6 +85,7 @@ export default Vue.extend({
|
|||||||
|
|
||||||
methods: {
|
methods: {
|
||||||
close() {
|
close() {
|
||||||
|
this.closed = true;
|
||||||
this.show = false;
|
this.show = false;
|
||||||
if (this.$refs.content) (this.$refs.content as any).style.pointerEvents = 'none';
|
if (this.$refs.content) (this.$refs.content as any).style.pointerEvents = 'none';
|
||||||
}
|
}
|
||||||
|
@ -6,15 +6,15 @@
|
|||||||
<button class="_button" @click="close()"><fa :icon="faTimes"/></button>
|
<button class="_button" @click="close()"><fa :icon="faTimes"/></button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<sequential-entrance class="users">
|
<div class="users">
|
||||||
<router-link v-for="(item, i) in items" class="user" :key="item.id" :to="extract ? extract(item) : item | userPage">
|
<router-link v-for="item in items" class="user" :key="item.id" :to="extract ? extract(item) : item | userPage">
|
||||||
<mk-avatar :user="extract ? extract(item) : item" class="avatar" :disable-link="true"/>
|
<mk-avatar :user="extract ? extract(item) : item" class="avatar" :disable-link="true"/>
|
||||||
<div class="body">
|
<div class="body">
|
||||||
<mk-user-name :user="extract ? extract(item) : item" class="name"/>
|
<mk-user-name :user="extract ? extract(item) : item" class="name"/>
|
||||||
<mk-acct :user="extract ? extract(item) : item" class="acct"/>
|
<mk-acct :user="extract ? extract(item) : item" class="acct"/>
|
||||||
</div>
|
</div>
|
||||||
</router-link>
|
</router-link>
|
||||||
</sequential-entrance>
|
</div>
|
||||||
|
|
||||||
<button class="more _button" v-if="more" @click="fetchMore" :disabled="moreFetching">
|
<button class="more _button" v-if="more" @click="fetchMore" :disabled="moreFetching">
|
||||||
<template v-if="!moreFetching">{{ $t('loadMore') }}</template>
|
<template v-if="!moreFetching">{{ $t('loadMore') }}</template>
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
<template>
|
<template>
|
||||||
<x-popup :source="source" ref="popup" @closed="() => { $emit('closed'); destroyDom(); }">
|
<x-popup :source="source" ref="popup" @closed="() => { $emit('closed'); destroyDom(); }">
|
||||||
<sequential-entrance class="gqyayizv" :delay="30">
|
<div class="gqyayizv">
|
||||||
<button class="_button" @click="choose('public')" :class="{ active: v == 'public' }" data-index="1" key="public">
|
<button class="_button" @click="choose('public')" :class="{ active: v == 'public' }" data-index="1" key="public">
|
||||||
<div><fa :icon="faGlobe"/></div>
|
<div><fa :icon="faGlobe"/></div>
|
||||||
<div>
|
<div>
|
||||||
@ -29,7 +29,7 @@
|
|||||||
<span>{{ $t('_visibility.specifiedDescription') }}</span>
|
<span>{{ $t('_visibility.specifiedDescription') }}</span>
|
||||||
</div>
|
</div>
|
||||||
</button>
|
</button>
|
||||||
</sequential-entrance>
|
</div>
|
||||||
</x-popup>
|
</x-popup>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
|
@ -3,8 +3,10 @@ import Vue from 'vue';
|
|||||||
import userPreview from './user-preview';
|
import userPreview from './user-preview';
|
||||||
import autocomplete from './autocomplete';
|
import autocomplete from './autocomplete';
|
||||||
import size from './size';
|
import size from './size';
|
||||||
|
import particle from './particle';
|
||||||
|
|
||||||
Vue.directive('autocomplete', autocomplete);
|
Vue.directive('autocomplete', autocomplete);
|
||||||
Vue.directive('userPreview', userPreview);
|
Vue.directive('userPreview', userPreview);
|
||||||
Vue.directive('user-preview', userPreview);
|
Vue.directive('user-preview', userPreview);
|
||||||
Vue.directive('size', size);
|
Vue.directive('size', size);
|
||||||
|
Vue.directive('particle', particle);
|
||||||
|
22
src/client/directives/particle.ts
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
import Particle from '../components/particle.vue';
|
||||||
|
|
||||||
|
export default {
|
||||||
|
bind(el, binding, vn) {
|
||||||
|
el.addEventListener('click', () => {
|
||||||
|
const rect = el.getBoundingClientRect();
|
||||||
|
|
||||||
|
const x = rect.left + (el.clientWidth / 2);
|
||||||
|
const y = rect.top + (el.clientHeight / 2);
|
||||||
|
|
||||||
|
const particle = new Particle({
|
||||||
|
parent: vn.context,
|
||||||
|
propsData: {
|
||||||
|
x,
|
||||||
|
y
|
||||||
|
}
|
||||||
|
}).$mount();
|
||||||
|
|
||||||
|
document.body.appendChild(particle.$el);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
@ -59,7 +59,7 @@ export default {
|
|||||||
const ro = new ResizeObserver((entries, observer) => {
|
const ro = new ResizeObserver((entries, observer) => {
|
||||||
calc();
|
calc();
|
||||||
});
|
});
|
||||||
|
|
||||||
ro.observe(el);
|
ro.observe(el);
|
||||||
|
|
||||||
el._ro_ = ro;
|
el._ro_ = ro;
|
||||||
|
@ -8,9 +8,11 @@ export default {
|
|||||||
self.tag = null;
|
self.tag = null;
|
||||||
self.showTimer = null;
|
self.showTimer = null;
|
||||||
self.hideTimer = null;
|
self.hideTimer = null;
|
||||||
|
self.checkTimer = null;
|
||||||
|
|
||||||
self.close = () => {
|
self.close = () => {
|
||||||
if (self.tag) {
|
if (self.tag) {
|
||||||
|
clearInterval(self.checkTimer);
|
||||||
self.tag.close();
|
self.tag.close();
|
||||||
self.tag = null;
|
self.tag = null;
|
||||||
}
|
}
|
||||||
@ -38,6 +40,14 @@ export default {
|
|||||||
});
|
});
|
||||||
|
|
||||||
document.body.appendChild(self.tag.$el);
|
document.body.appendChild(self.tag.$el);
|
||||||
|
|
||||||
|
self.checkTimer = setInterval(() => {
|
||||||
|
if (!document.body.contains(el)) {
|
||||||
|
clearTimeout(self.showTimer);
|
||||||
|
clearTimeout(self.hideTimer);
|
||||||
|
self.close();
|
||||||
|
}
|
||||||
|
}, 1000);
|
||||||
};
|
};
|
||||||
|
|
||||||
el.addEventListener('mouseover', () => {
|
el.addEventListener('mouseover', () => {
|
||||||
@ -60,8 +70,6 @@ export default {
|
|||||||
|
|
||||||
unbind(el, binding, vn) {
|
unbind(el, binding, vn) {
|
||||||
const self = el._userPreviewDirective_;
|
const self = el._userPreviewDirective_;
|
||||||
clearTimeout(self.showTimer);
|
clearInterval(self.checkTimer);
|
||||||
clearTimeout(self.hideTimer);
|
|
||||||
self.close();
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|