Compare commits

..

101 Commits

Author SHA1 Message Date
f12473e677 12.39.1 2020-06-05 08:41:36 +09:00
e845db01bf Merge pull request #6409 from syuilo/l10n_develop
New Crowdin translations
2020-06-05 08:40:40 +09:00
7f76a73eee Revert "Revert "chore(src/docs): Fix miauth check url""
This reverts commit d44fbf58c9.
2020-06-05 08:37:41 +09:00
3c2d94ace3 Revert "fix(api): Fix #6418 (#6442)"
This reverts commit 83ec906ee7.
2020-06-05 08:37:27 +09:00
1e2239f527 New translations ja-JP.yml (Spanish) 2020-06-04 22:45:23 +09:00
1851daf9fd New translations ja-JP.yml (English) 2020-06-04 22:25:30 +09:00
f378f26e5e New translations ja-JP.yml (German) 2020-06-04 22:25:28 +09:00
cda6bc3404 New translations ja-JP.yml (Chinese Simplified) 2020-06-04 22:25:27 +09:00
071c7e6a58 feat(theme): Add mentionMe property 2020-06-04 22:19:08 +09:00
010e1b3ba4 12.39.0 2020-06-04 22:09:50 +09:00
66de51c1ca feat: Observe notification read and fix #6406 (#6407)
* Resolve https://github.com/syuilo/misskey/pull/6406#issuecomment-633203670

* Improve typing

* Observe notification read

* capture readAllNotifications

* fix

* fix

* Refactor

* Update src/client/components/notification.vue

Co-authored-by: syuilo <Syuilotan@yahoo.co.jp>

* Update src/client/components/notification.vue

Co-authored-by: syuilo <Syuilotan@yahoo.co.jp>

* missing ;

Co-authored-by: syuilo <Syuilotan@yahoo.co.jp>
2020-06-04 22:07:39 +09:00
265d6bda15 ローカルのみボタンを公開範囲ピッカーに統合 (#6428)
* ローカルのみを公開範囲ピッカーに統合

* デザイン調整

* 🎨

Co-authored-by: syuilo <syuilotan@yahoo.co.jp>
2020-06-04 22:06:38 +09:00
fecb12bae1 missing ; 2020-06-04 19:13:24 +09:00
83ec906ee7 fix(api): Fix #6418 (#6442) 2020-06-04 16:17:36 +09:00
d44fbf58c9 Revert "chore(src/docs): Fix miauth check url"
This reverts commit ddf92c3e2c.
2020-06-04 09:10:38 +09:00
9c4a789a4e Use insert for creating Note (#6440) 2020-06-04 08:59:03 +09:00
bfa1705bad New translations ja-JP.yml (French) 2020-06-04 03:33:34 +09:00
2876f2188c New translations ja-JP.yml (Spanish) 2020-06-03 23:36:32 +09:00
579c0043c3 New translations ja-JP.yml (Arabic) 2020-06-03 22:26:01 +09:00
0fa57957a4 New translations ja-JP.yml (Arabic) 2020-06-03 22:14:27 +09:00
05cb0b0ec5 New translations ja-JP.yml (Chinese Simplified) 2020-06-03 21:53:19 +09:00
4b24e96dfb New translations ja-JP.yml (Chinese Simplified) 2020-06-03 21:44:53 +09:00
c7eab37177 New translations ja-JP.yml (French) 2020-06-03 18:23:57 +09:00
c7d0b6cb29 New translations ja-JP.yml (English) 2020-06-03 17:11:02 +09:00
22ee087bb9 New translations ja-JP.yml (German) 2020-06-03 16:47:29 +09:00
2480fcdc53 Update src/client/components/notification.vue
Co-authored-by: syuilo <Syuilotan@yahoo.co.jp>
2020-06-03 13:42:32 +09:00
7e093aee5e Update src/client/components/notification.vue
Co-authored-by: syuilo <Syuilotan@yahoo.co.jp>
2020-06-03 13:42:26 +09:00
dd8413a485 New translations ja-JP.yml (Uyghur) 2020-06-03 13:32:48 +09:00
925f2912a9 New translations ja-JP.yml (German) 2020-06-03 13:32:47 +09:00
ed00ea0865 New translations ja-JP.yml (Spanish) 2020-06-03 13:32:45 +09:00
3f19d221b7 New translations ja-JP.yml (Czech) 2020-06-03 13:32:43 +09:00
808271838b New translations ja-JP.yml (Danish) 2020-06-03 13:32:42 +09:00
ac0950fdef New translations ja-JP.yml (Korean) 2020-06-03 13:32:40 +09:00
38f306ba73 New translations ja-JP.yml (Dutch) 2020-06-03 13:32:38 +09:00
5c1748d63d New translations ja-JP.yml (Norwegian) 2020-06-03 13:32:37 +09:00
c00cddf5b0 New translations ja-JP.yml (French) 2020-06-03 13:32:35 +09:00
baf3274748 New translations ja-JP.yml (Polish) 2020-06-03 13:32:33 +09:00
9e0515e563 New translations ja-JP.yml (Russian) 2020-06-03 13:32:32 +09:00
9c0404c407 New translations ja-JP.yml (Chinese Traditional) 2020-06-03 13:32:30 +09:00
0b85177690 New translations ja-JP.yml (English) 2020-06-03 13:32:28 +09:00
7ec28ced40 New translations ja-JP.yml (Kannada) 2020-06-03 13:32:27 +09:00
19ae3b66ec New translations ja-JP.yml (Japanese, Kansai) 2020-06-03 13:32:25 +09:00
0118dee3e5 New translations ja-JP.yml (Arabic) 2020-06-03 13:32:23 +09:00
9201714313 New translations ja-JP.yml (Portuguese) 2020-06-03 13:32:22 +09:00
8b9c1efd7e New translations ja-JP.yml (Chinese Simplified) 2020-06-03 13:32:20 +09:00
111eb43fd9 feat(client): 投稿フォームのボタンの説明を表示するように (#6408)
* Add title attr with buttons on the post form

* fix

* tooltip

* missing ;

* remove title attr

* fix bug

* Update reactions-viewer.details.vue

* help wip

* ok!

* i18n

Co-authored-by: syuilo <Syuilotan@yahoo.co.jp>
2020-06-03 13:30:17 +09:00
f2964101d1 fix(server): Fix #6433 2020-06-03 13:20:54 +09:00
6b2c289029 fix(api): Fix #6419
Close #6434
2020-06-03 13:19:07 +09:00
fd2573c068 署名検証失敗はリトライしないように (#6437) 2020-06-03 09:12:54 +09:00
df0e9d75fe Update README.md [AUTOGEN] (#6339) 2020-06-02 09:27:42 +09:00
2bc86756c8 iOS Safari 上で アイコンおよびバナーのアップロードができない不具合を修正 (#6427)
* fix #6076

* 参考文献を明記
2020-05-31 22:19:28 +09:00
fb91ab4080 Merge branch 'develop' into notification-visibility-read-2 2020-05-31 21:53:56 +09:00
0b4d29ed1e New translations ja-JP.yml (English) 2020-05-31 17:22:15 +09:00
2a8c65e2c3 New translations ja-JP.yml (German) 2020-05-31 17:22:13 +09:00
ffc7f42efc fix(client): 全既読系ボタンのAPIの指定が間違っているのを修正 (#6424) 2020-05-31 15:48:37 +09:00
7c38cda8ee Refactor 2020-05-31 14:57:22 +09:00
d3f5001679 fix 2020-05-31 14:54:04 +09:00
83d9a4b6d9 chore(client):🎨 Make font-size of note-preview em (#6414) 2020-05-31 14:46:50 +09:00
9760e08af4 New translations ja-JP.yml (Chinese Simplified) 2020-05-31 13:12:19 +09:00
8d48e4c76e feat(client): Convert text mfm node to text (v)dom node instead of span tag (#6399)
* Convert text mfm node to text (v)dom node
instead of span tag

* Update mfm.ts

Co-authored-by: syuilo <Syuilotan@yahoo.co.jp>
2020-05-31 12:57:21 +09:00
a1e0c866aa feat(client): 自動でもっと見るオプション (#6403)
* wip

* ugokanai

* wip

* implement setting subscribing

* fix lint

* ✌️

* Update notifications.vue

Co-authored-by: syuilo <Syuilotan@yahoo.co.jp>
2020-05-31 12:53:06 +09:00
8380222baf New translations ja-JP.yml (English) 2020-05-31 05:06:59 +09:00
eda7d60c26 Resolve #6412 (#6416) 2020-05-30 08:00:02 +09:00
ddf92c3e2c chore(src/docs): Fix miauth check url
Fix #6418
2020-05-29 22:36:01 +09:00
9bb528eb6e New translations ja-JP.yml (Arabic) 2020-05-26 19:26:54 +09:00
9756957ac1 New translations ja-JP.yml (French) 2020-05-26 19:26:52 +09:00
af0205b77d New translations ja-JP.yml (Arabic) 2020-05-26 19:14:21 +09:00
3f0da5453d New translations ja-JP.yml (Arabic) 2020-05-26 19:05:54 +09:00
923c3071f0 New translations ja-JP.yml (Arabic) 2020-05-26 18:56:03 +09:00
a8584973e2 New translations ja-JP.yml (Arabic) 2020-05-26 18:54:43 +09:00
886766cca5 fix 2020-05-26 15:04:44 +09:00
974abbe826 capture readAllNotifications 2020-05-26 15:00:15 +09:00
61bdf51e90 Observe notification read 2020-05-26 14:34:49 +09:00
9bee9d20f7 Improve typing 2020-05-26 14:33:55 +09:00
7aee3b88eb New translations ja-JP.yml (French) 2020-05-26 05:16:23 +09:00
d08184f5fe New translations ja-JP.yml (Arabic) 2020-05-26 04:12:58 +09:00
ae08232bfb New translations ja-JP.yml (French) 2020-05-26 04:12:56 +09:00
2b5e4b57bd New translations ja-JP.yml (Arabic) 2020-05-26 04:02:44 +09:00
35ae13a490 New translations ja-JP.yml (Arabic) 2020-05-26 03:52:45 +09:00
74f55b4d3f New translations ja-JP.yml (Arabic) 2020-05-26 03:42:53 +09:00
abe9440021 New translations ja-JP.yml (Arabic) 2020-05-26 03:32:52 +09:00
6a95b94aaa New translations ja-JP.yml (Arabic) 2020-05-26 03:16:43 +09:00
21ee38d813 New translations ja-JP.yml (Arabic) 2020-05-26 03:03:21 +09:00
9681a906d5 New translations ja-JP.yml (Arabic) 2020-05-26 02:48:09 +09:00
2ca760bee6 New translations ja-JP.yml (French) 2020-05-26 02:48:08 +09:00
da9f916daa New translations ja-JP.yml (French) 2020-05-26 02:32:29 +09:00
bc05b83a24 New translations ja-JP.yml (Spanish) 2020-05-26 01:32:56 +09:00
620e0a9df6 New translations ja-JP.yml (Spanish) 2020-05-26 01:22:45 +09:00
38ad4f7098 New translations ja-JP.yml (Spanish) 2020-05-26 01:13:00 +09:00
05c7cacdd1 Resolve https://github.com/syuilo/misskey/pull/6406#issuecomment-633203670 2020-05-24 18:41:40 +09:00
baa49271df 12.38.1 2020-05-24 18:15:56 +09:00
e2cbe70966 New Crowdin translations (#6379)
* New translations ja-JP.yml (Chinese Simplified)

* New translations ja-JP.yml (Korean)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (French)

* New translations ja-JP.yml (French)

* New translations ja-JP.yml (French)

* New translations ja-JP.yml (Arabic)

* New translations ja-JP.yml (Uyghur)

* New translations ja-JP.yml (Arabic)

* New translations ja-JP.yml (Arabic)

* New translations ja-JP.yml (French)

* New translations ja-JP.yml (Arabic)

* New translations ja-JP.yml (French)

* New translations ja-JP.yml (Chinese Simplified)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (Uyghur)

* New translations ja-JP.yml (French)

* New translations ja-JP.yml (French)

* New translations ja-JP.yml (French)

* New translations ja-JP.yml (French)

* New translations ja-JP.yml (French)

* New translations ja-JP.yml (Japanese, Kansai)

* New translations ja-JP.yml (Japanese, Kansai)

* New translations ja-JP.yml (Japanese, Kansai)

* New translations ja-JP.yml (Japanese, Kansai)

* New translations ja-JP.yml (Japanese, Kansai)

* New translations ja-JP.yml (Japanese, Kansai)

* New translations ja-JP.yml (Arabic)

* New translations ja-JP.yml (Arabic)

* New translations ja-JP.yml (Arabic)

* New translations ja-JP.yml (French)

* New translations ja-JP.yml (Arabic)

* New translations ja-JP.yml (French)

* New translations ja-JP.yml (Japanese, Kansai)

* New translations ja-JP.yml (French)

* New translations ja-JP.yml (Japanese, Kansai)

* New translations ja-JP.yml (French)

* New translations ja-JP.yml (French)

* New translations ja-JP.yml (French)

* New translations ja-JP.yml (Chinese Simplified)

* New translations ja-JP.yml (Arabic)

* New translations ja-JP.yml (Japanese, Kansai)

* New translations ja-JP.yml (Kannada)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (Chinese Traditional)

* New translations ja-JP.yml (French)

* New translations ja-JP.yml (Korean)

* New translations ja-JP.yml (Spanish)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (Chinese Simplified)

* New translations ja-JP.yml (Chinese Simplified)

* New translations ja-JP.yml (Chinese Simplified)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (German)
2020-05-24 18:15:00 +09:00
6a98301cc9 chore(deps): Update dependencies 🚀 2020-05-24 17:48:24 +09:00
81f1df7472 Resolve #6405 (#6406) 2020-05-24 13:53:31 +09:00
abc296cdcc refactor: use Object.fromEntries() instead of in-house implementation (#6401)
* refactor: use Object.fromEntries()
instead of in-house implementation

* Remove extra type assertions
2020-05-23 23:21:09 +09:00
4df5ec82ce Drop support for Node v11, v13 (#6402) 2020-05-23 23:19:16 +09:00
3963ed8ff7 feat(client): 翻訳をIndexedDBに保存・プッシュ通知を翻訳 (#6396)
* wip

* tabun ok

* better msg

* oops

* fix lint

* Update gulpfile.ts

Co-authored-by: Acid Chicken (硫酸鶏) <root@acid-chicken.com>

* Update src/client/scripts/set-i18n-contexts.ts

Co-authored-by: Acid Chicken (硫酸鶏) <root@acid-chicken.com>

* refactor

Co-authored-by: acid-chicken <root@acid-chicken.com>

* 

* wip

* fix lint

* たぶんおk

* fix flush

* Translate Notification

* remove console.log

* fix

* add notifications

* remove san

* wip

* ok

* ✌️

* Update src/prelude/array.ts

Co-authored-by: Acid Chicken (硫酸鶏) <root@acid-chicken.com>

* wip

* i18n refactor

* Update init.ts

* ✌️

Co-authored-by: Acid Chicken (硫酸鶏) <root@acid-chicken.com>
Co-authored-by: syuilo <syuilotan@yahoo.co.jp>
2020-05-23 13:19:31 +09:00
11141c878c fix(i18n): Fix missing translation 2020-05-20 11:16:10 +09:00
b1a2046a7f Update CHANGELOG.md 2020-05-18 14:26:55 +09:00
e44322c9bf Update CHANGELOG.md 2020-05-18 14:25:36 +09:00
2e6462bf1b Update CHANGELOG.md 2020-05-18 14:21:07 +09:00
197 changed files with 1849 additions and 869 deletions

View File

@ -12,7 +12,7 @@ jobs:
strategy:
matrix:
node-version: [11.10.x, 12.x, 13.x, 14.x]
node-version: [12.x, 14.x]
services:
postgres:

View File

@ -1,6 +1,27 @@
ChangeLog
=========
12.38.0 (2020/5/17)
-------------------
### ✨Improvements
* Renoteの削除をわかりやすく [#6366](https://github.com/syuilo/misskey/pull/6366), [#6373](https://github.com/syuilo/misskey/pull/6373)
* Unicode 13.0の絵文字に対応 [#6365](https://github.com/syuilo/misskey/pull/6365)
* リレーのHTTP-Signatureは投稿者の鍵でするように [#6357](https://github.com/syuilo/misskey/pull/6357)
* 追加のAPオブジェクトをキャッシュ出来るように [#6349](https://github.com/syuilo/misskey/pull/6349)
* ローカルのみボタンを公開範囲ボタンの横に移動 [51cf097](https://github.com/syuilo/misskey/commit/51cf0970b3b990cd67c94c5fcc5d7c1c3f7f13df)
* 公開範囲がローカルのみであることを表示するように [#6291](https://github.com/syuilo/misskey/pull/6291)
* Roomに藍ちゃん人形と札束を追加 [#6350](https://github.com/syuilo/misskey/pull/6350), [6cee608](https://github.com/syuilo/misskey/commit/6cee608c91850c035c35f605296410e72d1ef793), [7dd8dbe](https://github.com/syuilo/misskey/commit/7dd8dbeb5b2f33b679248ecc2138f556b72d9a06)
* ユーザーページの画像欄の画像をクリックしたとき、UIが再読み込みされないように [ca2a33e](https://github.com/syuilo/misskey/commit/ca2a33edc928c0dfe59f50502d3eedb9e97e88db)
### 🐛Fixes
* reCAPTCHAが動かなくなっているのを修正 [#6367](https://github.com/syuilo/misskey/pull/6367)
* インスタンスブロックがリレーに適用されない問題を修正 [#6355](https://github.com/syuilo/misskey/pull/6355)
* リレーに不正なURLを追加できてしまう問題を修正 [#6351](https://github.com/syuilo/misskey/pull/6351)
* Pages: Mk:api関数にトークンを渡せない問題を修正 [9244efe](https://github.com/syuilo/misskey/commit/9244efe3513dd72be04d7588dea8ec27509e96d1)
* nyaizeが適用されるとMFMのオプションが失われるのを修正 [#6371](https://github.com/syuilo/misskey/pull/6371)
* 上流ノートの削除に伴うノートの削除が連合リレーに伝達されない問題を修正 [#6374](https://github.com/syuilo/misskey/pull/6374)
* 引用元の削除に伴う引用RNの削除がリモートに伝達されない問題を修正 [#6374](https://github.com/syuilo/misskey/pull/6374)
12.37.0 (2020/5/10)
-------------------
### ✨Improvements

View File

@ -114,6 +114,7 @@ Please see the [Contribution Guide](./CONTRIBUTING.md).
<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/19045173/cb91c0f345c24d4ebfd05f19906d5e26/1.png?token-time=2145916800&token-hash=o_zKBytJs_AxHwSYw_5R8eD0eSJe3RoTR3kR3Q0syN0%3D" alt="kiritan " width="100"></td>
<td><img src="https://c8.patreon.com/2/200/27648259" alt="みなしま " 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>
</tr><tr>
<td><a href="https://www.patreon.com/user?u=20832595">Roujo </a></td>
@ -121,10 +122,12 @@ Please see the [Contribution Guide](./CONTRIBUTING.md).
<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/user?u=19045173">kiritan </a></td>
<td><a href="https://www.patreon.com/user?u=27648259">みなしま </a></td>
<td><a href="https://www.patreon.com/user?u=24430516">Eduardo Quiros</a></td>
</tr></table>
<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/14215107/1cbe1912c26143919fa0faca16f12ce1/4.jpg?token-time=2145916800&token-hash=BslMqDjTjz8KYANLvxL87agHTugHa0dMPUzT-hwR6Vk%3D" alt="Nesakko" width="100"></td>
<td><img src="https://c8.patreon.com/2/200/776209" alt="Demogrognard" 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://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>
@ -133,9 +136,9 @@ Please see the [Contribution Guide](./CONTRIBUTING.md).
<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/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>
</tr><tr>
<td><a href="https://www.patreon.com/user?u=776209">Denshi </a></td>
<td><a href="https://www.patreon.com/Nesakko">Nesakko</a></td>
<td><a href="https://www.patreon.com/user?u=776209">Demogrognard</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=23915207">kabo2468y </a></td>
@ -144,9 +147,9 @@ Please see the [Contribution Guide](./CONTRIBUTING.md).
<td><a href="https://www.patreon.com/osapon">osapon </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>
</tr></table>
<table><tr>
<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/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/17866454" alt="sikyosyounin " width="100"></td>
@ -154,9 +157,8 @@ Please see the [Contribution Guide](./CONTRIBUTING.md).
<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/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>
</tr><tr>
<td><a href="https://www.patreon.com/hs_sh_net">mewl hayabusa</a></td>
<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=17866454">sikyosyounin </a></td>
@ -164,10 +166,10 @@ Please see the [Contribution Guide](./CONTRIBUTING.md).
<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=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>
</tr></table>
<table><tr>
<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/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>
@ -178,8 +180,9 @@ Please see the [Contribution Guide](./CONTRIBUTING.md).
<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/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>
</tr><tr>
<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/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>
@ -190,21 +193,22 @@ Please see the [Contribution Guide](./CONTRIBUTING.md).
<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/hekovic">Hekovic </a></td>
<td><a href="https://www.patreon.com/user?u=24641572">uroco @99</a></td>
</tr></table>
<table><tr>
<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/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://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>
<td><a href="https://www.patreon.com/user?u=24641572">uroco @99</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/efertone">Efertone </a></td>
<td><a href="https://www.patreon.com/user?u=12531784">Takashi Shibuya</a></td>
</tr></table>
**Last updated:** Thu, 07 May 2020 18:00:08 UTC
**Last updated:** Tue, 02 Jun 2020 00:00:08 UTC
<!-- PATREON_END -->
[backer-url]: #backers

View File

@ -22,8 +22,8 @@ adduser --disabled-password --disabled-login misskey
Please install and setup these softwares:
#### Dependencies :package:
* **[Node.js](https://nodejs.org/en/)** >= 11.10.1
* **[PostgreSQL](https://www.postgresql.org/)** >= 10
* **[Node.js](https://nodejs.org/en/)** (12.x, 14.x)
* **[PostgreSQL](https://www.postgresql.org/)** (>= 10)
* **[Redis](https://redis.io/)**
##### Optional

View File

@ -22,8 +22,8 @@ adduser --disabled-password --disabled-login misskey
Installez les paquets suivants :
#### Dépendences :package:
* **[Node.js](https://nodejs.org/en/)** >= 11.10.1
* **[PostgreSQL](https://www.postgresql.org/)** >= 10
* **[Node.js](https://nodejs.org/en/)** (12.x, 14.x)
* **[PostgreSQL](https://www.postgresql.org/)** (>= 10)
* **[Redis](https://redis.io/)**
##### Optionnels

View File

@ -22,7 +22,7 @@ adduser --disabled-password --disabled-login misskey
これらのソフトウェアをインストール・設定してください:
#### 依存関係 :package:
* **[Node.js](https://nodejs.org/en/)** (11.10.1以上)
* **[Node.js](https://nodejs.org/en/)** (12.x, 14.x)
* **[PostgreSQL](https://www.postgresql.org/)** (10以上)
* **[Redis](https://redis.io/)**

View File

@ -11,7 +11,7 @@ const cleanCSS = require('gulp-clean-css');
const sass = require('gulp-dart-sass');
const fiber = require('fibers');
const locales = require('./locales');
const locales: { [x: string]: any } = require('./locales');
const meta = require('./package.json');
gulp.task('build:ts', () => {
@ -31,8 +31,10 @@ gulp.task('build:copy:views', () =>
gulp.task('build:copy:locales', cb => {
fs.mkdirSync('./built/client/assets/locales', { recursive: true });
const v = { '_version_': meta.version };
for (const [lang, locale] of Object.entries(locales)) {
fs.writeFileSync(`./built/client/assets/locales/${lang}.${meta.version}.json`, JSON.stringify(locale), 'utf-8');
fs.writeFileSync(`./built/client/assets/locales/${lang}.${meta.version}.json`, JSON.stringify({ ...locale, ...v }), 'utf-8');
}
cb();

411
locales/ar-SA.yml Normal file
View File

@ -0,0 +1,411 @@
---
_lang_: "العربية"
monthAndDay: "{day}/{month}"
search: "البحث"
notifications: "الإشعارات"
username: "اسم المستخدم"
password: "الكلمة السرية"
fetchingAsApObject: "جارٍ جلبه مِن الفديفرس…"
ok: " حسناً"
gotIt: "فهِمت"
cancel: " إلغاء"
enterUsername: "أدخِل إسم مسخدم"
noNotes: "لم يتم العثور على أية ملاحظات"
noNotifications: "ليس هناك أية اشعارات"
instance: "مثيل الخادم"
settings: "الاعدادات"
profile: "الملف التعريفي"
timeline: "الخيط الزمني"
login: "لِج"
loggingIn: "جارٍ تسجيل الدخول"
logout: "الخروج"
signup: "أنشئ حسابًا"
uploading: "عملية الإرسال جارية"
save: "حفظ"
users: "المستخدمون"
addUser: "اضافة مستخدم"
favorite: "إضافة إلى المفضلة"
favorites: "المفضلات"
unfavorite: "إزالة من المفضلة"
pin: "دبّسها على الصفحة الشخصية"
delete: "حذف"
deleteAndEdit: "إزالة وإعادة الصياغة"
addToList: "أضفه إلى قائمة"
reply: "رد"
loadMore: "عرض المزيد"
youGotNewFollower: "يتابعك"
import: "استيراد"
export: "تصدير"
files: "الملفات"
download: "تنزيل"
lists: "القوائم"
noLists: "ليس لديك أية قائمة"
note: "ملاحظة"
notes: "الملاحظات"
following: "المتابَعون"
followers: "المتابِعين"
followsYou: "يتابعك"
createList: "إنشاء قائمة"
manageLists: "إدارة القوائم"
error: "حدث خطأ ما"
retry: "حاول مجددًا"
enterListName: "اسم القائمة"
privacy: "الخصوصية"
makeFollowManuallyApprove: "القبول يدويا طلبات الإشتراك"
follow: "تابِع"
followRequest: "طلب اشتراك"
followRequests: "طلبات الإشتراك"
unfollow: "إلغاء الاشتراك"
followRequestPending: "طلبات الإشتراك المعلّقة"
quote: "اقتبس"
pinnedNote: "ملاحظة مدبسة"
you: "أنت"
clickToShow: "اضغط للعرض"
sensitive: "محتوى حساس"
add: "إضافة"
enterFileName: "ادخل اسم الملف"
mute: "اكتم"
unmute: "إلغاء الكتم"
block: "احجب"
unblock: "إلغاء الحجب"
selectList: "اختر قائمة"
customEmojis: "إيموجي مخصص"
addEmoji: "إضافة إيموجي"
addAcount: "إضافة حساب"
general: "الرئيسية"
wallpaper: "خلفية الشاشة"
setWallpaper: "استخدم خلفية الشاشة"
removeWallpaper: "إزالة خلفية الشاشة"
searchWith: "البحث: {q}"
youHaveNoLists: "لا تمتلك أية قائمة"
proxyAccount: "حساب وكيل البروكسي"
host: "المضيف"
selectUser: "حدّد مستخدمًا"
recipient: "المرسَل إليه·ها"
annotation: "التعليقات"
federation: "الفديرالية"
instances: "مثيل الخادم"
latestRequestSentAt: "آخر طلب أرسِل في"
charts: "المنحنيات البيانية"
perHour: "في الساعة"
perDay: "في اليوم"
stopActivityDelivery: "وقف إرسال النشاط"
blockThisInstance: "احجب مثيل الخادم هذا"
operations: "الإجراءات"
software: "البرنامج"
version: "الإصدار"
metadata: "البيانات الوصفية"
withNFiles: "{n} ملف (ملفات)"
monitor: "شاشة التحكم"
jobQueue: "قائمة الانتظار"
cpuAndMemory: "وحدة المعالجة المركزية والذاكرة"
network: "الشبكة"
disk: "قرص التخزين"
instanceInfo: "معلومات مثيل الخادم"
statistics: "الإحصائيات"
clearQueue: "تفريغ قائمة الإنتظار"
muteAndBlock: "تم كتمها / تم حجبها"
mutedUsers: "الحسابات التي تم كتمها"
blockedUsers: "الحسابات التي تم حظرها"
noUsers: "ليس هناك مستخدمون"
editProfile: "تعديل الملف التعريفي"
noteDeleteConfirm: "هل تريد حذف هذه الملاحظة؟"
pinLimitExceeded: "لا يمكنك تدبيس الملاحظات بعد الآن."
intro: "لقد انتهت عملية تنصيب Misskey. الرجاء إنشاء حساب إداري."
done: "تمّ"
processing: "المعالجة جارية"
preview: "معاينة"
default: "افتراضي"
noCustomEmojis: "ليس هناك إيموجيات"
customEmojisOfRemote: "الإيموجيات القادمة مِن مثيلات الخوادم الأخرى"
federating: "الفديرالية جارية"
blocked: "محجوب"
suspended: "مُعلّق"
all: "الكل"
notResponding: "لا يستجيب"
security: "الأمان"
more: "المزيد!"
lookup: "البحث"
announcements: "الإعلانات"
imageUrl: "عنوان URL للصورة"
remove: "حذف"
removed: "تم حذفه بنجاح"
messaging: "الدردشة"
upload: "تحميل"
fromDrive: "من المخزن"
fromUrl: "من عنوان URL"
explore: "استكشاف"
games: "ألعاب Misskey"
messageRead: "مقروءة"
tos: "شروط الخدمة"
start: "البداية"
home: "الرئيسي"
activity: "النشاط"
images: "الصور"
yearsOld: "{age} سنة"
registeredDate: "انظم في"
location: "المكان"
theme: "المظهر"
themeForLightMode: "الحلة في الوضع الفاتح"
themeForDarkMode: "الحلة في الوضع الداكن"
light: "فاتح"
dark: "داكن"
lightThemes: "الحلة الفاتحة"
darkThemes: "الحلة الداكنة"
addFile: "إضافة ملف"
inputNewFileName: "ادخل الإسم الجديد للملف"
inputNewFolderName: "ادخل الإسم الجديد للمجلد"
rename: "إعادة التسمية"
avatar: "الصورة الرمزية"
banner: "الصورة الرأسية"
nsfw: "محتوى حساس"
reload: "انعش"
doNothing: "تجاهل"
watch: "راقب"
unwatch: "إلغاء المراقبة"
accept: "السماح"
reject: "رفض"
normal: "عادي"
instanceName: "اسم مثيل الخادم"
instanceDescription: "وصف مثيل الخادم"
maintainerName: "المدير"
maintainerEmail: "عنوان بريد المدير الإلكتروني"
tosUrl: "عنوان URL لشروط الخدمة"
thisYear: "هذا العام"
thisMonth: "هذا الشهر"
today: "اليوم"
dayX: "{day}"
monthX: "{month}"
yearX: "{year}"
pages: "الصفحات"
connectSerice: "أوصل"
disconnectSerice: "قطع الاتصال"
enableLocalTimeline: "تفعيل الخيط المحلي"
enableGlobalTimeline: "تفعيل الخيط الزمني الشامل"
registration: "إنشاء حساب"
enableRegistration: "تفعيل إنشاء الحسابات الجديدة"
invite: "دعوة"
basicInfo: "المعلومات الأساسية "
hcaptchaSiteKey: "مفتاح الموقع"
hcaptchaSecretKey: "المفتاح السري"
recaptcha: "reCAPTCHA"
enableRecaptcha: "تمكين reCAPTCHA"
recaptchaSiteKey: "مفتاح الموقع"
recaptchaSecretKey: "المفتاح السري"
antennas: "الهوائيات"
manageAntennas: "إدارة الهوائيات"
name: "الإسم"
antennaSource: "مصدر الهوائي"
antennaKeywords: "الكلمات المفتاحية للإستقبال"
notesAndReplies: "الملاحظات والردود"
withFiles: "بالمرفقات"
silence: "اكتم"
unsilence: "إلغاء الكتم"
popularUsers: "المستخدمون الشائعون"
exploreFediverse: "استكشف الفديفرس"
userList: "القوائم"
about: "عن"
aboutMisskey: "عن Misskey"
patrons: "الداعمون"
administrator: "المدير"
token: "الرمز المميز"
twoStepAuthentication: "الإستيثاق بعاملَيْن"
moderator: "مشرِف"
securityKey: "مفتاح الأمان"
securityKeyName: "اسم المفتاح"
lastUsed: "آخر استخدام"
passwordLessLogin: "لِج مِن دون كلمة سرية"
resetPassword: "أعد تعيين كلمتك السرية"
newPasswordIs: "كلمتك السرية الجديدة هي {password}"
share: "شارِك"
notFound: "غير موجود"
help: "المساعدة"
inputMessageHere: "اكتب رسالتك هنا"
close: "اغلق"
group: "الفريق"
groups: "الفِرَق"
createGroup: "انشئ فريقًا"
invites: "دعوة"
groupName: "اسم الفريق"
members: "الأعضاء"
transfer: "نقل"
title: "العنوان"
text: "النص"
enable: "تشغيل"
next: "التالية"
retype: "أعد الكتابة"
noteOf: "ملاحظات {user}"
inviteToGroup: "دعوة إلى فريق"
invitationCode: "رمز الدعوة"
checking: "التحقق جارٍ"
available: "متوفر"
unavailable: "غير متوفر"
tooShort: "قصير جدًا"
tooLong: "طويل جدًا"
weakPassword: "الكلمة السرية ضعيفة"
normalPassword: "الكلمة السرية جيدة"
strongPassword: "الكلمة السرية قوية"
passwordMatched: "التطابق صحيح!"
passwordNotMatched: "غير متطابقتان"
signinWith: "الولوج عبر {x}"
or: "أو"
uiLanguage: "لغة واجهة المستخدم"
doing: "انتظر لحظة"
category: "الفئات"
tags: "الوسوم"
docSource: "مصدر هذا المستند"
createAccount: "أنشئ حسابًا"
existingAcount: "الحسابات الموجودة"
regenerate: "أعِد التوليد"
fontSize: "حجم الخط"
dashboard: "لوحة التحكم"
local: "المحلي"
remote: "بُعدي"
total: "المجموع"
weekOverWeekChanges: "أسبوعيا"
dayOverDayChanges: "يوميا"
clinetSettings: "إعدادات التطبيق"
accountSettings: "إعدادات الحساب"
promotion: "ترقية"
promote: "روِّج"
numberOfDays: "عدد الأيام"
hideThisNote: "إخفاء هذه الملاحظة"
deleteAll: "حذف الكل"
sounds: "الرنات"
listen: "استمع"
none: "لا شيء"
volume: "مستوى الصوت"
details: "التفاصيل"
chooseEmoji: "اختر إيموجي"
recentUsed: "المستخدمة مؤخرا"
install: "التثبيت"
uninstall: "إلغاء التثبيت"
installedApps: "التطبيقات المُخوّلة"
lastUsedDate: "آخر استخدام"
state: "الحالة"
sort: "ترتيب حسب"
output: "الخارجة"
sidebar: "الشريط الجانبي"
addItem: "إضافة عنصر"
rooms: "الغرفة"
relays: "المُرَحلات"
addRelay: "إضافة مُرحّل"
addedRelays: "المرحلات التي تم إضافتها"
_theme:
explore: "استكشف قوالب المظهر"
_sfx:
note: "الملاحظات"
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: "مرحبًا!"
_2fa:
registerKey: "تسجيل مفتاح أمان جديد"
_permissions:
"write:account": "تعديل معلومات حسابك"
"read:notifications": "اظهر الإشعارات"
_weekday:
sunday: "الأحد"
monday: "الإثنين"
tuesday: "الثلاثاء"
wednesday: "الأربعاء"
thursday: "الخميس"
friday: "الجمعة"
saturday: "السبت"
_widgets:
memo: "ملاحظة لاصقة"
notifications: "الإشعارات"
timeline: "الخيط الزمني"
calendar: "التقويم"
trends: "المتداوَلة"
clock: "الساعة"
rss: "تدفق RSS"
activity: "النشاط"
photos: "الصور"
_cw:
hide: "إخفاء"
show: "عرض المزيد"
chars: "{count} أحرف"
files: "{count} ملفات"
_poll:
at: "تاريخ الإنتهاء"
deadlineDate: "تاريخ الانتهاء"
deadlineTime: "سا"
duration: "المدة"
vote: "قم بالتصويت"
showResult: "اعرض النتائج"
closed: "انتهى"
remainingDays: "{d} أيام و {h} ساعات متبقية"
remainingHours: "{h} ساعات و {m} دقائق متبقية"
remainingMinutes: "{m} دقائق و {s} ثوانٍ متبقية"
remainingSeconds: "{s} ثوانٍ متبقية"
_visibility:
public: "للعامة"
home: "الرئيسي"
followers: "المتابِعين"
specified: "مباشرة"
localOnly: "المحلي فقط"
_postForm:
replyPlaceholder: "رد على هذه الملاحظة…"
quotePlaceholder: "اقتبس هذه الملاحظة…"
_profile:
name: "الإسم"
username: "اسم المستخدم"
_exportOrImport:
followingList: "المتابَعون"
muteList: "اكتم"
blockingList: "احجب"
userLists: "القوائم"
_timelines:
home: "الرئيسي"
local: "المحلي"
social: "الاجتماعي"
global: "الشامل"
_rooms:
_roomType:
default: "افتراضي"
_furnitures:
monitor: "شاشة التحكم"
_pages:
blocks:
image: "الصور"
script:
categories:
list: "القوائم"
blocks:
_join:
arg1: "القوائم"
arg2: "فاصل"
add: "إضافة"
_randomPick:
arg1: "القوائم"
_dailyRandomPick:
arg1: "القوائم"
_seedRandomPick:
arg2: "القوائم"
_pick:
arg1: "القوائم"
_listLen:
arg1: "القوائم"
types:
array: "القوائم"
_notification:
youWereFollowed: "يتابعك"

View File

@ -1,2 +1,3 @@
---
_lang_: "Čeština"

View File

@ -1,2 +1,3 @@
---
_lang_: "Dansk"

View File

@ -43,8 +43,9 @@ copyUsername: "Benutzernamen kopieren"
reply: "Antworten"
loadMore: "Mehr anzeigen"
youGotNewFollower: "Du hast einen neuen Follower"
receiveFollowRequest: "Follow-Anfrage erhalten."
receiveFollowRequest: "Follow-Anfrage erhalten"
followRequestAccepted: "Follow-Anfrage akzeptiert"
mention: "Erwähnung"
mentions: "Erwähnungen"
directNotes: "Direktnachrichten"
importAndExport: "Importieren und Exportieren"
@ -104,6 +105,7 @@ suspendConfirm: "Möchtest du diesen Benutzer wirklich sperren?"
unsuspendConfirm: "Möchtest du die Sperrung dieses Benutzers wirklich aufheben?"
selectList: "Wähle eine Liste aus"
customEmojis: "Benutzerdefinierte Emojis"
emoji: "Emoji"
emojiName: "Emojiname"
emojiUrl: "Emoji-URL"
addEmoji: "Emoji hinzufügen"
@ -506,6 +508,13 @@ relays: "Relays"
addRelay: "Relay hinzufügen"
inboxUrl: "inbox-URL"
addedRelays: "Hinzugefügte Relays"
serviceworkerInfo: "Muss für Push-Benachrichtigungen aktiviert sein."
deletedNote: "Gelöschte Notiz"
invisibleNote: "Private Notiz"
enableInfiniteScroll: "Automatisch mehr Notizen laden"
visibility: "Sichtbarkeit"
poll: "Umfrage"
useCw: "Inhalt verstecken"
_theme:
explore: "Themen erforschen"
install: "Thema installieren"
@ -632,7 +641,6 @@ _cw:
show: "Mehr anzeigen"
chars: "{count} Zeichen"
files: "{count} Dateien"
poll: "Umfrage"
_poll:
noOnlyOneChoice: "Mindestens zwei Antwortmöglichkeiten werden benötigt."
choiceN: "Auswahl {n}"
@ -665,6 +673,7 @@ _visibility:
specified: "Direkt"
specifiedDescription: "Nur für bestimmte Benutzer sichtbar"
localOnly: "Nur Lokal"
localOnlyDescription: "Unsichtbar für Benutzer anderer Instanzen"
_postForm:
replyPlaceholder: "Dieser Notiz antworten..."
quotePlaceholder: "Diese Notiz zitieren..."
@ -781,6 +790,7 @@ _rooms:
holo-display: "Holographischer Bildschirm"
energy-drink: "Energy Drink"
doll-ai: "Ai-Puppe"
banknote: "Geldscheine"
_pages:
newPage: "Seite erstellen"
editPage: "Diese Seite bearbeiten"
@ -1066,3 +1076,17 @@ _relayStatus:
requesting: "Ausstehend"
accepted: "Akzeptiert"
rejected: "Abgelehnt"
_notification:
fileUploaded: "Datei erfolgreich hochgeladen"
youGotMention: "{name} hat dich erwähnt"
youGotReply: "{name} hat dir geantwortet"
youGotQuote: "{name} hat dich zitiert"
youRenoted: "Renote deiner Notiz von {name}"
youGotPoll: "{name} hat auf deiner Umfrage abgestimmt"
youGotMessagingMessageFromUser: "{name} hat dir eine Privatnachricht gesendet"
youGotMessagingMessageFromGroup: "In die Gruppe {name} wurde eine Privatnachricht gesendet"
youWereFollowed: "Du hast einen neuen Follower"
youReceivedFollowRequest: "Du hast eine Follow-Anfrage erhalten"
yourFollowRequestAccepted: "Deine Follow-Anfrage wurde akzeptiert"
youWereInvitedToGroup: "Du wurdest in eine Gruppe eingeladen"

View File

@ -45,6 +45,7 @@ loadMore: "Load more"
youGotNewFollower: "Followed you"
receiveFollowRequest: "Follow request received"
followRequestAccepted: "Follow request accepted"
mention: "Mention"
mentions: "Mentions"
directNotes: "Direct notes"
importAndExport: "Import / Export"
@ -104,6 +105,7 @@ suspendConfirm: "Are you sure that you want to suspend this account?"
unsuspendConfirm: "Are you sure you that want to unsuspend this account?"
selectList: "Select a list"
customEmojis: "Custom Emoji"
emoji: "Emoji"
emojiName: "Emoji name"
emojiUrl: "Emoji URL"
addEmoji: "Add an emoji"
@ -506,6 +508,13 @@ relays: "Relays"
addRelay: "Add Relay"
inboxUrl: "Inbox URL"
addedRelays: "Added Relays"
serviceworkerInfo: "Must be enabled for push notifications."
deletedNote: "Deleted note"
invisibleNote: "Invisible note"
enableInfiniteScroll: "Enable infinite scrolling"
visibility: "Visiblility"
poll: "Poll"
useCw: "Hide content"
_theme:
explore: "Explore Themes"
install: "Install theme"
@ -632,7 +641,6 @@ _cw:
show: "Load more"
chars: "{count} characters"
files: "{count} file(s)"
poll: "Poll"
_poll:
noOnlyOneChoice: "At least two choices are needed"
choiceN: "Choice {n}"
@ -665,6 +673,7 @@ _visibility:
specified: "Direct"
specifiedDescription: "Post to specified users only"
localOnly: "Local only"
localOnlyDescription: "Not visible to remote users"
_postForm:
replyPlaceholder: "Reply to this note..."
quotePlaceholder: "Quote this note..."
@ -780,6 +789,8 @@ _rooms:
cup-noodle: "Cup noodle"
holo-display: "Holographic display"
energy-drink: "Energy drink"
doll-ai: "Ai doll"
banknote: "Pile of money"
_pages:
newPage: "Create a page"
editPage: "Edit this page"
@ -1065,3 +1076,17 @@ _relayStatus:
requesting: "Pending"
accepted: "Accepted"
rejected: "Rejected"
_notification:
fileUploaded: "File successfully uploaded"
youGotMention: "{name} mentioned you"
youGotReply: "{name} replied to you"
youGotQuote: "{name} quoted you"
youRenoted: "{name} renoted you"
youGotPoll: "{name} voted on your poll"
youGotMessagingMessageFromUser: "{name} sent you a message"
youGotMessagingMessageFromGroup: "A message was sent to the {name} group"
youWereFollowed: "Followed you"
youReceivedFollowRequest: "You've received a follow request"
yourFollowRequestAccepted: "Your follow request was accepted"
youWereInvitedToGroup: "Invited to group"

View File

@ -45,6 +45,7 @@ loadMore: "Ver más"
youGotNewFollower: "te ha seguido"
receiveFollowRequest: "Recibiste una solicitud de seguimiento"
followRequestAccepted: "La solicitud de seguimiento fue aceptada"
mention: "Menciones"
mentions: "Menciones"
directNotes: "Notas directas"
importAndExport: "Importar y Exportar"
@ -104,6 +105,7 @@ suspendConfirm: "¿Quiere suspender esta cuenta?"
unsuspendConfirm: "¿Quiere dejar de suspender esta cuenta?"
selectList: "Seleccione una lista"
customEmojis: "Emojis personalizados"
emoji: "Emoji"
emojiName: "Nombre del emoji"
emojiUrl: "URL de la imágen del emoji"
addEmoji: "Añadir emoji"
@ -506,6 +508,13 @@ relays: "Relés"
addRelay: "Agregar relé"
inboxUrl: "Inbox URL"
addedRelays: "Relés añadidos"
serviceworkerInfo: "Se necesita activar para usar las notificaciones push"
deletedNote: "Nota eliminada"
invisibleNote: "Nota oculta"
enableInfiniteScroll: "Activar scroll infinito"
visibility: "Visibilidad"
poll: "Encuesta"
useCw: "Esconder contenidos"
_theme:
explore: "Explorar temas"
install: "Instalar tema"
@ -632,7 +641,6 @@ _cw:
show: "Ver más"
chars: "{count} caracteres"
files: "{count} archivos"
poll: "Encuesta"
_poll:
noOnlyOneChoice: "Se necesitan al menos 2 opciones"
choiceN: "Opción {n}"
@ -665,6 +673,7 @@ _visibility:
specified: "Mensaje directo"
specifiedDescription: "Visible sólo para los usuarios elegidos"
localOnly: "Solo local"
localOnlyDescription: "Oculto para usuarios remotos"
_postForm:
replyPlaceholder: "Responder a esta nota"
quotePlaceholder: "Citar esta nota"
@ -780,6 +789,8 @@ _rooms:
cup-noodle: "Taza de sopa de fideos"
holo-display: "Poster holográfico"
energy-drink: "Bebida energética"
doll-ai: "Muñeca"
banknote: "Billetes"
_pages:
newPage: "Crear página"
editPage: "Editar página"
@ -1065,3 +1076,17 @@ _relayStatus:
requesting: "Pendiente"
accepted: "Aceptar"
rejected: "Rechazada"
_notification:
fileUploaded: "Archivo subido"
youGotMention: "Mención de {name}"
youGotReply: "Respuesta de {name}"
youGotQuote: "Citado por {name}"
youRenoted: "Renotado por {name}"
youGotPoll: "Encuestado por {name}"
youGotMessagingMessageFromUser: "{name} comenzó un chat contigo"
youGotMessagingMessageFromGroup: "Tienes un chat de {name}"
youWereFollowed: "te ha seguido"
youReceivedFollowRequest: "Has mandado una solicitud de seguimiento"
yourFollowRequestAccepted: "Tu solicitud de seguimiento fue aceptada"
youWereInvitedToGroup: "Invitado al grupo"

View File

@ -1,28 +1,28 @@
---
_lang_: "Français"
introMisskey: "Bienvenue ! Misskey est un service de microblogage décentralisé et open-source.\nÉcrivez des « notes » pour partager ce qui se passe, ou pour parler de vous à tout le monde 📡\nAvec la fonction « réactions », vous pouvez également ajouter une réaction rapide aux notes de chacun 👍\nExplorez un nouveau monde 🚀"
introMisskey: "Bienvenue ! Misskey est un service de microblogage décentralisé, libre et ouvert.\nÉcrivez des « notes » et partagez ce qui se passe à linstant présent, autour de vous avec les autres 📡\nLa fonction « réactions », vous permet également dajouter une réaction rapide aux notes des autres utilisateur·rice·s 👍\nExplorons un nouveau monde 🚀"
monthAndDay: "{day}/{month}"
search: "Rechercher"
notifications: "Notifications"
username: "Nom d'utilisateur·rice"
username: "Nom dutilisateur·rice"
password: "Mot de passe"
fetchingAsApObject: "Récupération depuis le Fediverse"
ok: "Soumettre"
gotIt: "J'ai compris !"
fetchingAsApObject: "Récupération depuis le diverse"
ok: "OK"
gotIt: "Jai compris !"
cancel: "Annuler"
enterUsername: "Entrer un nom d'utilisateur·rice"
enterUsername: "Entrer un nom dutilisateur·rice"
renotedBy: "Renoté par {user}"
noNotes: "Pas de notes"
noNotifications: "Pas de notifications"
noNotes: "Aucune note"
noNotifications: "Aucune notification"
instance: "Instance"
settings: "Paramètres"
profile: "Profil"
timeline: "Fil d'actualité"
noAccountDescription: "L'utilisateur·rice n'a pas encore renseigné de présentation sur son profil"
timeline: "Fil"
noAccountDescription: "Lutilisateur·rice na pas encore renseigné de biographie de présentation sur son profil."
login: "Se connecter"
loggingIn: "Connexion en cours"
logout: "Se déconnecter"
signup: "S'inscrire"
signup: "Sinscrire"
uploading: "Envoi en cours"
save: "Enregistrer"
users: "Utilisateur·rice·s"
@ -36,29 +36,30 @@ copyContent: "Copier le contenu"
copyLink: "Copier le lien"
delete: "Supprimer"
deleteAndEdit: "Supprimer et réécrire"
deleteAndEditConfirm: "Êtes-vous sûr·e de vouloir effacer cette note et la modifier ? Vous perdrez toutes les réactions, renotes et réponses."
deleteAndEditConfirm: "Êtes-vous sûr·e de vouloir supprimer cette note et la reformuler ? Vous perdrez toutes les réactions, renotes et réponses y afférentes."
addToList: "Ajouter à une liste"
sendMessage: "Envoyer un message"
copyUsername: "Copier le nom d'utilisateur"
copyUsername: "Copier le nom dutilisateur·rice"
reply: "Répondre"
loadMore: "Voir plus"
loadMore: "Afficher plus"
youGotNewFollower: "Vous suit"
receiveFollowRequest: "Demande de suivi reçue"
followRequestAccepted: "La demande d'abonnement a été acceptée"
receiveFollowRequest: "Demande dabonnement reçue"
followRequestAccepted: "La demande dabonnement a été acceptée"
mention: "Mentionner"
mentions: "Mentions"
directNotes: "Messages directs"
directNotes: "Notes directes"
importAndExport: "Import et export"
import: "Importer"
export: "Exporter"
files: "Fichiers"
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."
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."
unfollowConfirm: "Désirez-vous vous désabonner de {name} ?"
exportRequested: "Vous avez demandé une exportation. Lopération pourrait prendre un peu de temps. Une terminée, le fichier résultant sera ajouté au Drive."
importRequested: "Vous avez initié un import. Cela pourrait prendre un peu de temps."
lists: "Listes"
noLists: "Aucune liste"
note: "Note"
noLists: "Vous navez aucune liste"
note: "Notes"
notes: "Notes"
following: "Abonnements"
followers: "Abonné·e·s"
@ -69,10 +70,10 @@ error: "Une erreur est survenue"
retry: "Réessayer"
enterListName: "Nom de la liste"
privacy: "Confidentialité"
makeFollowManuallyApprove: "Approuver manuellement les demandes de suivi"
makeFollowManuallyApprove: "Accepter manuellement les demandes dabonnement"
defaultNoteVisibility: "Visibilité par défaut"
follow: "S'abonner"
followRequest: "Demande de suivi"
follow: "Sabonner"
followRequest: "Demande dabonnement"
followRequests: "Demandes dabonnement"
unfollow: "Se désabonner"
followRequestPending: "En attente dapprobation"
@ -86,7 +87,7 @@ clickToShow: "Cliquer pour afficher"
sensitive: "Contenu sensible"
add: "Ajouter"
reaction: "Réactions"
reactionSettingDescription: "Choisissez vos réactions préférées que vous souhaitez épingler dans le sélecteur de réaction."
reactionSettingDescription: "Choisissez vos réactions préférées que vous souhaitez épingler dans le sélecteur de réactions."
rememberNoteVisibility: "Se souvenir de la visibilité des notes"
attachCancel: "Supprimer le fichier attaché"
markAsSensitive: "Marquer comme sensible"
@ -104,22 +105,23 @@ suspendConfirm: "Êtes-vous sûr·e de vouloir suspendre ce compte ?"
unsuspendConfirm: "Êtes-vous sûr·e de vouloir annuler la suspension de ce compte ?"
selectList: "Sélectionner une liste"
customEmojis: "Émojis personnalisés"
emoji: "Émoji"
emojiName: "Nom de lémoji"
emojiUrl: "URL de lémoji"
addEmoji: "Ajouter un émoji"
settingGuide: "Configuration suggérée"
settingGuide: "Configuration proposée"
cacheRemoteFiles: "Mise en cache des fichiers distants"
cacheRemoteFilesDescription: "Quand ce paramètre est désactivé, les fichiers distants sont chargés directement depuis l'instance distante. Désactiver cela diminuera l'utilisation du stockage, mais augmentera le trafic réseau, puisque les miniatures ne seront pas générées."
cacheRemoteFilesDescription: "Lorsque cette option est désactivée, les fichiers distants sont chargés directement depuis linstance distante. La désactiver diminuera certes lutilisation de lespace de stockage local mais augmentera le trafic réseau puisque les miniatures ne seront plus générées."
flagAsBot: "Ce compte est un robot"
flagAsCat: "Ce compte est un chat"
autoAcceptFollowed: "Approuver automatiquement les demandes de suivi venant d'utilisateur·rice·s que vous suivez"
autoAcceptFollowed: "Accepter automatiquement les demandes dabonnement venant dutilisateur·rice·s que vous suivez"
addAcount: "Ajouter un compte"
loginFailed: "Échec de la connexion"
showOnRemote: "Voir sur l'instance distante"
showOnRemote: "Voir sur linstance distante"
general: "Général"
wallpaper: "Fond d'écran"
setWallpaper: "Définir le fond d'écran"
removeWallpaper: "Supprimer le fond d'écran"
wallpaper: "Fond décran"
setWallpaper: "Définir le fond décran"
removeWallpaper: "Supprimer le fond décran"
searchWith: "Recherche : {q}"
youHaveNoLists: "Vous n'avez aucune liste"
followConfirm: "Êtes-vous sûr·e de vouloir suivre {name} ?"
@ -139,7 +141,7 @@ storageUsage: "Stockage utilisé"
charts: "Graphiques"
perHour: "par heure"
perDay: "par jour"
stopActivityDelivery: "Arrêter l'envoi d'activités"
stopActivityDelivery: "Arrêter lenvoi de lactivité"
blockThisInstance: "Bloquer cette instance"
operations: "Opérations"
software: "Logiciel"
@ -151,7 +153,7 @@ jobQueue: "File dattente"
cpuAndMemory: "Processeur et mémoire"
network: "Réseau"
disk: "Disque"
instanceInfo: "Informations sur l'instance"
instanceInfo: "Informations sur linstance"
statistics: "Statistiques"
clearQueue: "Vider la file d'attente"
clearQueueConfirmTitle: "Êtes-vous sûr·e de vouloir vider la file d'attente ?"
@ -163,17 +165,17 @@ blockedInstancesDescription: "Listez les instances que vous désirez bloquer, un
muteAndBlock: "Masqué·e·s / Bloqué·e·s"
mutedUsers: "Utilisateur·rice·s en sourdine"
blockedUsers: "Utilisateur·rice·s bloqué·e·s"
noUsers: "Il n'y a aucun utilisateur·rice"
noUsers: "Il ny a pas dutilisateur·rice·s"
editProfile: "Modifier votre profil"
noteDeleteConfirm: "Êtes-vous sûr·e de vouloir supprimer cette note ?"
pinLimitExceeded: "Vous ne pouvez plus épingler d'autres notes."
intro: "L'installation de Misskey est terminée ! Créons le compte administrateur."
intro: "Linstallation de Misskey est terminée ! Veuillez créer un compte administrateur."
done: "Terminé"
processing: "Traitement en cours"
preview: "Prévisualisation"
default: "Par défaut"
noCustomEmojis: "Il n'y a pas démoji"
customEmojisOfRemote: "Émojis d'autres instances"
customEmojisOfRemote: "Émojis venant des autres instances"
noJobs: "Il n'y a aucune tâche planifiée"
federating: "En cours de fédération"
blocked: "Bloqué·e"
@ -183,8 +185,8 @@ subscribing: "Abonné"
publishing: "Publié"
notResponding: "Ne répond pas"
instanceFollowing: "Abonnements une instance"
instanceFollowers: "Abonné·e·s de l'instance"
instanceUsers: "Utilisateur·rice·s de l'instance"
instanceFollowers: "Abonné·e·s de linstance"
instanceUsers: "Utilisateur·rice·s de cette linstance"
changePassword: "Modifier votre mot de passe"
security: "Sécurité"
retypedNotMatch: "Les saisies ne correspondent pas."
@ -221,8 +223,8 @@ agreeTo: "J'accepte {0}"
tos: "les conditions dutilisation"
start: "Commencer"
home: "Principal"
remoteUserCaution: "Les informations peuvent être incomplètes, parce que l'utilisateur·rice est d'une instance distante."
activity: "Activités"
remoteUserCaution: "Les informations de ce compte risqueraient dêtre incomplètes du fait que lutilisateur·rice provient dune instance distante."
activity: "Activité"
images: "Images"
birthday: "Date de naissance"
yearsOld: "{age} ans"
@ -271,12 +273,12 @@ reject: "Refuser"
normal: "Normal"
instanceName: "Nom de linstance"
instanceDescription: "Description de linstance"
maintainerName: "Nom de l'administrateur·rice"
maintainerEmail: "Email de l'administrateur·rice"
maintainerName: "Ladministrateur·rice"
maintainerEmail: "Email de ladministrateur·rice"
tosUrl: "URL des conditions dutilisation"
thisYear: "Cette année"
thisMonth: "Ce mois-ci"
today: "Aujourd'hui"
today: "Aujourdhui"
dayX: "{day}"
monthX: "{month}"
yearX: "{year}"
@ -287,16 +289,16 @@ disconnectSerice: "Déconnecter"
enableLocalTimeline: "Activer le fil local"
enableGlobalTimeline: "Activer le fil global"
disablingTimelinesInfo: "Si vous désactivez ces fils, les administrateurs et les modérateurs pourront toujours y accéder."
registration: "S'inscrire"
enableRegistration: "Autoriser nimporte qui à sinscrire"
registration: "Sinscrire"
enableRegistration: "Autoriser les nouvelles inscriptions"
invite: "Inviter"
proxyRemoteFiles: "Proxy fichiers distants"
proxyRemoteFilesDescription: "Si vous activez ce paramètre, les fichiers distants non stockés ou supprimés en raison d'une capacité excédentaire seront affichés via un proxy local et généreront une miniature. Cela n'affectera pas le stockage du serveur."
driveCapacityPerLocalAccount: "Volume du Drive par utilisateur local"
driveCapacityPerRemoteAccount: "Volume du Drive par utilisateur distant"
inMb: "en mégaoctets"
iconUrl: "URL de l'image de l'icône"
bannerUrl: "URL de l'image de la bannière"
iconUrl: "URL de limage de lavatar"
bannerUrl: "URL de limage de la bannière"
basicInfo: "Informations basiques"
pinnedUsers: "Utilisateur·rice épinglé·e"
pinnedUsersDescription: "Listez les utilisateur·rice·s que vous souhaitez voir épinglé·e·s sur la page \"Découvrir\", un·e par ligne."
@ -308,26 +310,26 @@ recaptcha: "reCAPTCHA"
enableRecaptcha: "Activer reCAPTCHA"
recaptchaSiteKey: "Clé du site"
recaptchaSecretKey: "Clé secrète"
avoidMultiCaptchaConfirm: "L'utilisation de plusieurs Captchas peut provoquer des interférences. Souhaitez-vous désactiver l'autre Captcha? Vous pouvez laisser plusieurs Captcha activés en appuyant sur Annuler."
antennas: "Antenne"
manageAntennas: "Gestion d'antenne"
avoidMultiCaptchaConfirm: "Lutilisation de plusieurs Captchas peut provoquer des interférences. Souhaitez-vous désactiver lautre Captcha ? Vous pouvez laisser plusieurs Captcha activés en appuyant sur Annuler."
antennas: "Antennes"
manageAntennas: "Gestion des antennes"
name: "Nom"
antennaSource: "Recevoir la source"
antennaSource: "Source de lantenne"
antennaKeywords: "Mots clés à recevoir"
antennaExcludeKeywords: "Mots clés à exclure"
antennaKeywordsDescription: "Séparez avec des espaces pour une condition ET. Séparez avec un saut de ligne pour une condition OU."
notifyAntenna: "Notifier les nouvelles notes"
withFileAntenna: "Notes uniquement avec fichiers joints"
antennaKeywordsDescription: "Séparer avec des espaces pour la condition AND. Séparer avec un saut de ligne pour une condition OR."
notifyAntenna: "Me notifier pour les nouvelles notes"
withFileAntenna: "Notes ayant des attachements uniquement"
serviceworker: "ServiceWorker"
enableServiceworker: "Activer ServiceWorker"
antennaUsersDescription: "Spécifiez les noms d'utilisateurs séparés par des sauts de ligne"
antennaUsersDescription: "Saisissez un seul nom dutilisateur·rice par ligne"
caseSensitive: "Sensible à la casse"
withReplies: "Inclure les réponses"
connectedTo: "Vous êtes connectés aux services suivants"
notesAndReplies: "Notes et Réponses"
withFiles: "Avec fichiers joints"
silence: "Mettre en sourdine"
silenceConfirm: "Êtes-vous sûr·e de vouloir mettre l'utilisateur·rice en sourdine ?"
silenceConfirm: "Êtes-vous sûr·e de vouloir mettre lutilisateur·rice en sourdine ?"
unsilence: "Annuler la mise en sourdine"
unsilenceConfirm: "Êtes-vous sûr·e de vouloir annuler la mise en sourdine de cette utilisateur·rice ?"
popularUsers: "Utilisateur·rice·s populaires"
@ -340,10 +342,10 @@ popularTags: "Mots-clés populaires"
userList: "Listes"
about: "Informations"
aboutMisskey: "À propos de Misskey"
aboutMisskeyText: "Misskey est un logiciel open source, développé par syuilo depuis 2014."
aboutMisskeyText: "Misskey est un logiciel libre et ouvert, développé par syuilo depuis 2014."
misskeyMembers: "Il est développé et maintenu par les membres listés ci-dessous :"
misskeySource: "Le code source est disponible ici:"
misskeyTranslation: "Aidez-nous avec votre contribution à traduire Misskey:"
misskeyTranslation: "Aidez-nous en contribuant à traduire Misskey :"
misskeyDonate: "Vous pouvez contribuer au développement de Misskey en faisant un don ici:"
morePatrons: "Nous apprécions vraiment le soutien de nombreuses autres personnes non mentionnées ici. Merci à toutes et à tous ! 🥰"
patrons: "Supporteurs"
@ -361,12 +363,12 @@ passwordLessLogin: "Connectez-vous sans mot de passe"
resetPassword: "Réinitialiser mot de passe"
newPasswordIs: "Votre nouveau mot de passe est \"{password}\""
autoReloadWhenDisconnected: "Rechargement automatique lorsque le serveur se déconnecte"
autoNoteWatch: "Surveiller automatique pour les notes"
autoNoteWatch: "Surveiller les notes automatiquement"
autoNoteWatchDescription: "Soyez informé des notes auxquelles vous avez réagi ou répondu."
reduceUiAnimation: "Réduire l'animation de l'interface"
reduceUiAnimation: "Réduire les animations dans linterface"
share: "Partager"
notFound: "Non trouvé"
notFoundDescription: "Aucune page ne correspond à l'URL spécifiée."
notFoundDescription: "Aucune page ne correspond à lURL spécifiée."
uploadFolder: "Emplacement de téléversement par défaut"
cacheClear: "Vider le cache"
markAsReadAllNotifications: "Marquer toutes les notifications comme lues"
@ -398,7 +400,7 @@ quoteAttached: "Avec citation"
quoteQuestion: "Souhaitez-vous ajoutez une citation ?"
noMessagesYet: "Pas encore discuté"
newMessageExists: "Vous avez un nouveau message"
onlyOneFileCanBeAttached: "Vous ne pouvez joindre qu'un seul fichier au message"
onlyOneFileCanBeAttached: "Vous ne pouvez joindre quun seul fichier au message"
signinRequired: "Veuillez vous connecter"
invitationCode: "Code dinvitation"
checking: "Vérification"
@ -416,14 +418,14 @@ signinWith: "Connectez-vous avec {x}"
signinFailed: "Échec dauthentification. Veuillez vérifier que votre nom dutilisateur et mot de passe sont corrects."
tapSecurityKey: "Touchez la clé de sécurité"
or: "OU"
uiLanguage: "Langue d'affichage de l'interface"
uiLanguage: "Langue daffichage de linterface"
groupInvited: "Invité au groupe"
aboutX: "À propos de {x}"
useOsNativeEmojis: "Utiliser les émojis natifs du système"
youHaveNoGroups: "Vous n'avez aucune groupe"
joinOrCreateGroup: "Soyez invité à rejoindre les groupes ou vous pouvez créer votre propre groupe."
noHistory: "Pas d'historique"
disableAnimatedMfm: "Désactiver MFM qui a des animations"
disableAnimatedMfm: "Désactiver MFM ayant des animations"
doing: "Attends une seconde"
category: "Catégories"
tags: "Étiquettes"
@ -433,7 +435,7 @@ existingAcount: "Comptes existants"
regenerate: "Régénérer"
fontSize: "Taille de la police"
noFollowRequests: "Vous navez aucune demande dabonnement en attente"
openImageInNewTab: "Ouvrir l'image dans un nouvel onglet"
openImageInNewTab: "Ouvrir les images dans un nouvel onglet"
dashboard: "Tableau de bord"
local: "Local"
remote: "Distant"
@ -451,7 +453,7 @@ 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."
objectStorageBaseUrlDesc: "Préfixe dURL utilisé pour construire lURL vers le référencement dobjet (média). Spécifiez son URL si vous utilisez un CDN ou un proxy, sinon spécifiez ladresse accessible au public selon le guide de service que vous allez utiliser. P.ex. '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"
@ -474,7 +476,7 @@ none: "Rien"
volume: "Volume"
details: "Détails"
chooseEmoji: "Choisissez un émoji"
unableToProcess: "L'opération n'a pas pu être complétée"
unableToProcess: "Lopération na pas pu être complétée."
recentUsed: "Récemment utilisé"
install: "Installation"
uninstall: "Désinstaller"
@ -495,7 +497,7 @@ updateRemoteUser: "Mettre à jour les informations de lutilisateur·rice dist
deleteAllFiles: "Supprimer tous les fichiers"
deleteAllFilesConfirm: "Êtes vous surs de vouloir supprimer tous les fichiers ?"
removeAllFollowing: "Retenir tous les abonnements"
removeAllFollowingDescription: "Se désabonner de tous les comptes de {host}. Exécutez cette commande si l'instance n'existe plus."
removeAllFollowingDescription: "Se désabonner de tous les comptes de {host}. Veuillez lancer cette action uniquement si linstance nexiste plus."
userSuspended: "Cette utilisateur·trice a été suspendue."
userSilenced: "Cette utilisateur·trice a été masquer."
sidebar: "Barre latérale"
@ -506,6 +508,12 @@ relays: "Relais"
addRelay: "Ajouter un relais"
inboxUrl: "Inbox URL"
addedRelays: "Relais ajoutés"
serviceworkerInfo: "Devrait être activé pour les notifications push."
deletedNote: "Note supprimée"
invisibleNote: "Note invisible"
visibility: "Visibilité"
poll: "Sondage"
useCw: "Masquer le contenu"
_theme:
explore: "Explorer les thèmes"
install: "Installer un thème"
@ -520,7 +528,7 @@ _sfx:
notification: "Notifications"
chat: "Discuter"
chatBg: "Discuter (De fond)"
antenna: "Réception d'antenne"
antenna: "Réception de lantenne"
_ago:
unknown: "Inconnu"
future: "Futur"
@ -541,9 +549,9 @@ _tutorial:
title: "Comment utiliser Misskey"
step1_1: "Bienvenue,"
step1_2: "Cette page est appelée « un fil ». Elle affiche les « notes » des personnes auxquelles vous êtes abonné dans un 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é."
step1_3: "Votre fil est actuellement vide vu que vous ne suivez aucun compte et que vous navez publié aucune note, pour linstant."
step2_1: "Procédons dabord à la préparation de votre profil avant décrire une note et/ou de vous abonner à un compte."
step2_2: "En fournissant quelques informations sur vous, il sera plus facile pour les autres de vous abonne."
step2_2: "En fournissant quelques informations sur vous, il sera plus facile pour les autres de sabonner à votre compte."
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 licône crayon sur lécran."
step3_3: "Remplissez le cadran et cliquez sur le bouton en haut à droite pour envoyer."
@ -551,7 +559,7 @@ _tutorial:
step4_1: "Avez-vous publié votre première note ?"
step4_2: "Youpi ! Celle-ci est maintenant affiché sur votre fil dactualité."
step5_1: "Maintenant, essayons de nous abonner à dautres personnes afin de rendre votre fil plus vivant."
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_2: "La page {featured} affiche les notes en tendance sur la présente instance et {explore} vous permet de trouver des utilisateur·rice·s en tendance. Essayez de vous abonner aux gens que vous aimez !"
step5_3: "Pour pouvoir suivre dautres utilisateur·rice, cliquez sur leur avatar afin dafficher la page du profil utilisateur ensuite appuyez sur le bouton « Sabonner »."
step5_4: "Si lautre utilisateur possède une icône sous forme dun cadenas à côté de son nom, il devra accepter votre demande dabonnement manuellement."
step6_1: "Maintenant, vous êtes en mesure de voir safficher les notes des autres utilisateur·rice·s sur votre propre fil."
@ -562,11 +570,11 @@ _tutorial:
step7_3: "Bon courage et amusez-vous bien sur Misskey 🚀"
_2fa:
alreadyRegistered: "Cette étape à déjà été complétée"
registerDevice: "Ajouter un appareil"
registerDevice: "Ajouter un nouvel appareil"
registerKey: "Sinscrire la clé"
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."
step3: "Entrez le jeton affiché sur l'application et vous avez terminé."
step2: "Ensuite, scannez le code QR affiché sur lécran."
step3: "Entrez le jeton affiché sur votre application pour compléter la configuration."
step4: "Lorsque vous vous connectez, entrez le jeton de la même manière."
securityKeyInfo: "Vous pouvez configurer l'authentification WebAuthN pour sécuriser davantage le processus de connexion avec non seulement la clé de sécurité matérielle qui prend en charge FIDO2, mais également l'authentification par empreinte digitale ou PIN sur votre appareil."
_permissions:
@ -578,7 +586,7 @@ _permissions:
"write:drive": "Écrire sur le Drive"
"read:favorites": "Afficher les favoris"
"write:favorites": "Écrire des favoris"
"read:following": "Voir les informations de l'abonné"
"read:following": "Voir les informations de vos abonnements"
"write:following": "Abonnements/Se désabonner"
"read:messaging": "Cherche à discuter"
"write:messaging": "Contrôler le discuter"
@ -599,16 +607,16 @@ _permissions:
_auth:
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 "
pleaseGoBack: "Veillez retourner à l'application"
permissionAsk: "Cette application nécessite les autorisations suivantes :"
pleaseGoBack: "Veuillez retourner à lapplication"
callback: "Retour vers lapplication"
denied: "Accès refusé"
_antennaSources:
all: "Toutes les notes"
homeTimeline: "Notes de l'utilisateur auquel je m'abonne"
users: "Notes des un ou plusieurs utilisateurs spécifiés"
userList: "Notes pour les utilisateurs de la liste spécifiée"
userGroup: "Notes pour les utilisateurs de la groupe spécifiée"
homeTimeline: "Notes venant des utilisateur·rice·s auxquel·les je suis abonné"
users: "Notes venant de la part dutilisateur·rice·s précis"
userList: "Notes venant dune liste spécifique"
userGroup: "Notes venant dutilisateur·rice·s du groupe spécifié"
_weekday:
sunday: "Dimanche"
monday: "Lundi"
@ -620,19 +628,18 @@ _weekday:
_widgets:
memo: "Note collante"
notifications: "Notifications"
timeline: "Fil d'actualité"
timeline: "Fil"
calendar: "Calendrier"
trends: "Tendances"
clock: "Horloge"
rss: "Lecteur de flux RSS"
activity: "Activités"
activity: "Activité"
photos: "Photos"
_cw:
hide: "Masquer"
show: "Voir plus"
show: "Afficher plus"
chars: "{count} caractères"
files: "{count} fichiers"
poll: "Sondage"
_poll:
noOnlyOneChoice: "Au moins 2 réponses nécéssaires"
choiceN: "Choix {n}"
@ -641,7 +648,7 @@ _poll:
expiration: "Fin du sondage"
infinite: "Illimité"
at: "Choisir une date"
after: "Chosir une durée"
after: "Choisir la durée"
deadlineDate: "Date de fin"
deadlineTime: "Heure de fin"
duration: "Durée"
@ -669,7 +676,7 @@ _postForm:
replyPlaceholder: "Répondre à cette note ..."
quotePlaceholder: "Citez cette note ..."
_placeholders:
a: "Qu'est-ce qu'il se passe ?"
a: "Quoi de neuf ?"
b: "Quoi de neuf ?"
c: "Quavez-vous en tête ?"
d: "Désirez-vous publier quelques mots ?"
@ -677,7 +684,7 @@ _postForm:
f: "En attente de vos écrits ..."
_profile:
name: "Nom"
username: "Nom d'utilisateur·rice"
username: "Nom dutilisateur·rice"
description: "À propos de moi"
youCanIncludeHashtags: "Vous pouvez également inclure des hashtags."
metadata: "Informations complémentaires"
@ -695,10 +702,10 @@ _charts:
usersIncDec: "Variation du nombre d'utilisateur·rice·s"
usersTotal: "Nombre d'utilisateur·rice·s au total"
activeUsers: "Utilisateur·rice·s actif·ve·s"
notesIncDec: "Variation du nombre d'notes"
notesIncDec: "Variation du nombre des notes"
localNotesIncDec: "Variation du nombre de notes local"
remoteNotesIncDec: "Variation du nombre dnotes distant"
notesTotal: "Nombre d'notes au total"
notesTotal: "Nombre total des notes"
filesIncDec: "Variation du nombre de fichiers"
filesTotal: "Nombre de fichiers au total"
storageUsageIncDec: "Variation de l'utilisation du stockage"
@ -707,8 +714,8 @@ _instanceCharts:
requests: "Requêtes"
users: "Variation du nombre d'utilisateur·rice·s"
usersTotal: "Nombre d'utilisateur·rice·s au total cumulé"
notes: "Variation du nombre d'notes"
notesTotal: "Nombre d'notes au total cumulé"
notes: "Variation du nombre des notes"
notesTotal: "Nombre total cumulé des notes"
ff: "Variation des abonné·e·s"
ffTotal: "Nombre d'abonné·e·s au total cumulé"
cacheSize: "Variation de la taille du cache"
@ -780,6 +787,8 @@ _rooms:
cup-noodle: "Bol de nouilles"
holo-display: "Affichage holographique"
energy-drink: "Boisson énergétique"
doll-ai: "Poupée Ai"
banknote: "Billets de banque"
_pages:
newPage: "Créer une page"
editPage: "Modifier une page"
@ -789,7 +798,7 @@ _pages:
deleted: "La page a bien été supprimée"
nameAlreadyExists: "La URL de page spécifiée existe déjà"
invalidNameTitle: "La URL de la page spécifiée nest pas valide"
invalidNameText: "Assurez-vous qu'il n'est pas vide"
invalidNameText: "Assurez-vous quil nest pas vide"
editThisPage: "Éditer cette page"
viewSource: "Afficher la source"
viewPage: "Afficher la page"
@ -812,7 +821,7 @@ _pages:
eyeCatchingImageRemove: "Supprimer une image attirante"
chooseBlock: "Ajouter un bloc"
selectType: "Choisir un type"
enterVariableName: "Veuillez entrer un nom de variable"
enterVariableName: "Veuillez entrer un nom pour votre variable"
variableNameIsAlreadyUsed: "Cette variable est déjà utilisée"
contentBlocks: "Contenu"
inputBlocks: "Entrée"
@ -872,7 +881,7 @@ _pages:
resetRandom: "Réinitialiser le nombre aléatoire"
pushEvent: "Envoyer un évènement"
_pushEvent:
event: "Nom de l'évènement"
event: "Nom de lévènement"
message: "Message à afficher lorsque appuyé"
variable: "Variable à envoyer"
no-variable: "Rien"
@ -902,8 +911,8 @@ _pages:
multiLineText: "Texte (Multi-lignes)"
textList: "Liste de texte"
_textList:
info: "Veuillez séparer chacun avec une nouvelle ligne"
strLen: "Longueur d'un texte"
info: "Veuillez séparer chaque entrée avec un saut de ligne"
strLen: "Longueur du texte"
_strLen:
arg1: "Texte"
strPick: "Extraire un caractère"
@ -1065,3 +1074,16 @@ _relayStatus:
requesting: "En attente"
accepted: "Accepté"
rejected: "Refusée"
_notification:
fileUploaded: "Le fichier a été téléversé !"
youGotMention: "{name} vous a mentionné"
youGotReply: "Réponse de {name}"
youGotQuote: "Cité·e par {name}"
youGotPoll: "{name} a participé à votre sondage"
youGotMessagingMessageFromUser: "{name} vous envoyé un message"
youGotMessagingMessageFromGroup: "Un message a été envoyé au groupe {name}"
youWereFollowed: "Vous suit"
youReceivedFollowRequest: "Vous avez reçu une demande dabonnement"
yourFollowRequestAccepted: "Votre demande dabonnement a été accepté"
youWereInvitedToGroup: "Invité au groupe"

View File

@ -14,6 +14,7 @@ const merge = (...args) => args.reduce((a, c) => ({
}), {});
const languages = [
'ar-SA',
//'cs-CZ',
//'da-DK',
'de-DE',

View File

@ -45,6 +45,7 @@ loadMore: "もっと見る"
youGotNewFollower: "フォローされました"
receiveFollowRequest: "フォローリクエストされました"
followRequestAccepted: "フォローが承認されました"
mention: "メンション"
mentions: "あなた宛て"
directNotes: "ダイレクト投稿"
importAndExport: "インポートとエクスポート"
@ -104,6 +105,7 @@ suspendConfirm: "凍結しますか?"
unsuspendConfirm: "解凍しますか?"
selectList: "リストを選択"
customEmojis: "カスタム絵文字"
emoji: "絵文字"
emojiName: "絵文字名"
emojiUrl: "絵文字画像URL"
addEmoji: "絵文字を追加"
@ -506,6 +508,13 @@ relays: "リレー"
addRelay: "リレーの追加"
inboxUrl: "inboxのURL"
addedRelays: "追加済みのリレー"
serviceworkerInfo: "プッシュ通知を行うには有効する必要があります。"
deletedNote: "削除された投稿"
invisibleNote: "非公開の投稿"
enableInfiniteScroll: "自動でもっと見る"
visibility: "公開範囲"
poll: "アンケート"
useCw: "内容を隠す"
_theme:
explore: "テーマを探す"
@ -644,7 +653,6 @@ _cw:
show: "もっと見る"
chars: "{count}文字"
files: "{count}ファイル"
poll: "アンケート"
_poll:
noOnlyOneChoice: "選択肢は最低2つ必要です"
@ -679,6 +687,7 @@ _visibility:
specified: "ダイレクト"
specifiedDescription: "指定したユーザーのみに公開"
localOnly: "ローカルのみ"
localOnlyDescription: "リモートユーザーには非公開"
_postForm:
replyPlaceholder: "このノートに返信..."
@ -1101,3 +1110,18 @@ _relayStatus:
requesting: "承認待ち"
accepted: "承認済み"
rejected: "拒否済み"
_notification:
fileUploaded: "ファイルがアップロードされました"
youGotMention: "{name}からのメンション"
youGotReply: "{name}からのリプライ"
youGotQuote: "{name}による引用"
youRenoted: "{name}がRenoteしました"
youGotPoll: "{name}が投票しました"
youGotMessagingMessageFromUser: "{name}からのチャットがあります"
youGotMessagingMessageFromGroup: "{name}のチャットがあります"
youWereFollowed: "フォローされました"
youReceivedFollowRequest: "フォローリクエストが来ました"
yourFollowRequestAccepted: "フォローリクエストが承認されました"
youWereInvitedToGroup: "グループに招待されました"

View File

@ -38,6 +38,8 @@ delete: "ほかす"
deleteAndEdit: "ほかして直す"
deleteAndEditConfirm: "このートをほかしてもっかい直すこのートへのリアクション、Remote、返信も全部消えんで"
addToList: "リストに入れたる"
sendMessage: "メッセージを送る"
copyUsername: "ユーザー名をコピー"
reply: "返す"
loadMore: "もっとあるやろ!"
youGotNewFollower: "フォローされたで"
@ -45,14 +47,26 @@ receiveFollowRequest: "フォローリクエストされたで"
followRequestAccepted: "フォローが承認されたで"
mentions: "あんた宛て"
directNotes: "ダイレクト投稿"
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: "他人のフォローは許可してからや!"
@ -60,13 +74,20 @@ defaultNoteVisibility: "もとからの公開範囲"
follow: "フォロー"
followRequest: "フォロー許してくれや!言うてみる"
followRequests: "フォロー許してくれや!"
unfollow: "フォローやめる"
followRequestPending: "フォロー許してくれるん待っとる"
enterEmoji: "絵文字を入れてや"
renote: "Renote"
unrenote: "Renoteやめる"
quote: "引用"
pinnedNote: "ピン留めされたノート"
you: "あんた"
clickToShow: "押してみ、見せたるわ"
sensitive: "見たらあかんで"
add: "増やす"
reaction: "リアクション"
reactionSettingDescription: "リアクションピッカーに出しとくリアクションを選んでや。"
rememberNoteVisibility: "公開範囲覚えといて"
attachCancel: "くっつけるのやめよか"
markAsSensitive: "ちょっと見せられへんわ"
unmarkAsSensitive: "別にええんじゃね?"
@ -77,45 +98,264 @@ block: "ブロック"
unblock: "ブロックやめたる"
suspend: "凍結"
unsuspend: "溶かす"
blockConfirm: "ブロックしてしもうてええか?"
unblockConfirm: "ブロックすんのやめるけどええか?"
suspendConfirm: "凍結してしもうてええか?"
unsuspendConfirm: "解凍するけどええか?"
selectList: "リストを選ぶ"
customEmojis: "カスタム絵文字"
emojiName: "絵文字名"
emojiUrl: "絵文字画像URL"
addEmoji: "絵文字を追加"
settingGuide: "ええ感じの設定"
cacheRemoteFiles: "リモートのファイルをキャッシュする"
cacheRemoteFilesDescription: "この設定をチャラにすると、リモートファイルをキャッシュせず直リンクするようになります。サーバーのストレージを節約できますが、サムネイルが生成されへんので通信量が増加します。"
flagAsBot: "Botやでと言っとく"
flagAsCat: "Catやでと言っとく"
autoAcceptFollowed: "フォローしとるユーザーからのフォロリクは全部勝手にええでって言うで"
addAcount: "アカウント追加"
loginFailed: "ログインに失敗してん"
showOnRemote: "リモートで見る"
general: "全般"
wallpaper: "壁紙"
setWallpaper: "壁紙を設定"
removeWallpaper: "壁紙ほかす"
searchWith: "検索: {q}"
youHaveNoLists: "リストはあらへん"
followConfirm: "{name}をフォローしてええか?"
proxyAccount: "プロキシアカウント"
proxyAccountDescription: "プロキシアカウントは、代わりにフォローしてくれるアカウントや。例えば、551に豚まんが無いときやったり、ユーザーがリモートユーザーをアカウントに入れたとき、リストに入れられたユーザーが誰からもフォローされてないと寂しいやん。寂しいし、アクティビティも配達されへんから、プロキシアカウントがフォローしてくれるで。ええやつやん…"
host: "ホスト"
selectUser: "ユーザーを選ぶ"
recipient: "宛先"
annotation: "注釈"
federation: "連合"
instances: "インスタンス"
registeredAt: "一見さんになった日"
latestRequestSentAt: "ちょっと前のリクエスト送信"
latestRequestReceivedAt: "ちょっと前のリクエスト受信"
latestStatus: "ちょっと前のステータス"
storageUsage: "ストレージ使うた量"
charts: "チャート"
perHour: "1時間ごと"
perDay: "1日ごと"
stopActivityDelivery: "アクティビティの配送をやめる"
blockThisInstance: "このインスタンスをブロック"
operations: "操作"
software: "ソフトウェア"
version: "バージョン"
metadata: "メタデータ"
withNFiles: "{n}個のファイル"
monitor: "モニター"
jobQueue: "ジョブキュー"
cpuAndMemory: "CPUとメモリ"
network: "ネットワーク"
disk: "ディスク"
instanceInfo: "インスタンス情報"
statistics: "統計"
clearQueue: "キューにさいなら"
clearQueueConfirmTitle: "キューをクリアしまっか?"
clearQueueConfirmText: "未配達の投稿は配送されなくなるで。通常この操作を行う必要はあらへんや。"
clearCachedFiles: "キャッシュにさいなら"
clearCachedFilesConfirm: "キャッシュされとるリモートファイルを全部削除しまっか?"
blockedInstances: "インスタンスブロック"
blockedInstancesDescription: "ブロックしたいインスタンスのホストを改行で区切って設定してな。ブロックされてもうたインスタンスとはもう金輪際やり取りできひんくなるで。"
muteAndBlock: "ミュートとブロック"
mutedUsers: "ミュートしたユーザー"
blockedUsers: "ブロックしたユーザー"
noUsers: "ユーザーはおらへん"
editProfile: "プロフィールをいじる"
noteDeleteConfirm: "このノートを削除しまっか?"
pinLimitExceeded: "これ以上ピン留めできひん"
intro: "Misskeyのインストールが完了してん管理者アカウントを作ってや。"
done: "でけた"
processing: "処理しとる"
preview: "プレビュー"
default: "デフォルト"
noCustomEmojis: "絵文字はあらへん"
customEmojisOfRemote: "リモートの絵文字"
noJobs: "ジョブはあらへん"
federating: "連合しとる"
blocked: "ブロックしとる"
suspended: "配信せぇへん"
all: "みな"
subscribing: "購読しとる"
publishing: "配信しとる"
notResponding: "応答してへんで"
instanceFollowing: "インスタンスのフォロー"
instanceFollowers: "インスタンスのフォロワー\n"
instanceUsers: "インスタンスのユーザー"
changePassword: "パスワード変える"
security: "セキュリティ"
retypedNotMatch: "そやないねん。"
currentPassword: "今のパスワード"
newPassword: "今度のパスワード"
newPasswordRetype: "今度のパスワード(もっぺん入れて)"
attachFile: "ファイルくっつけて"
more: "他ないんか!"
featured: "ハイライト"
usernameOrUserId: "ユーザー名かユーザーID"
noSuchUser: "ユーザーが見つからへんで"
lookup: "見てきて"
announcements: "これ知っといてな"
imageUrl: "画像URL"
remove: "ほかす"
removed: "削除したで!"
removeAreYouSure: "「{x}」はなおしてしもてええか?"
saved: "保存したで!"
messaging: "チャット"
upload: "アップロード"
fromDrive: "ドライブから"
fromUrl: "URLから"
uploadFromUrl: "URLアップロード"
uploadFromUrlDescription: "このURLのファイルをアップロードしたいねん"
uploadFromUrlRequested: "アップロードしたい言うといたで"
uploadFromUrlMayTakeTime: "アップロード終わるんにちょい時間かかるかもしれへんわ。"
explore: "みつける"
games: "Misskey Games"
messageRead: "もう読んだ"
noMoreHistory: "これより過去の履歴はあらへんで"
startMessaging: "チャットやるで"
nUsersRead: "{n}人が読んでもうた"
agreeTo: "{0}はええで"
tos: "利用規約"
start: "始める"
home: "ホーム"
remoteUserCaution: "リモートユーザーやから、ちゃんとした情報とちゃうで。"
activity: "アクティビティ"
images: "画像"
birthday: "生まれた日"
yearsOld: "{age}歳"
registeredDate: "始めた日"
location: "場所"
theme: "テーマ"
themeForLightMode: "ライトモードではこのテーマつこて"
themeForDarkMode: "ダークモードではこのテーマつこて"
light: "ライト"
dark: "ダーク"
lightThemes: "デイゲーム"
darkThemes: "ナイトゲーム"
syncDeviceDarkMode: "試合開始時間はデバイスのダークモードと一緒や"
drive: "ドライブ"
fileName: "ファイル名"
selectFile: "ファイル選んでや"
selectFiles: "ファイル選んでや"
selectFolder: "フォルダ選んでや"
selectFolders: "フォルダ選んでや"
renameFile: "ファイル名をいらう"
folderName: "フォルダー名"
createFolder: "フォルダー作る"
renameFolder: "フォルダー名を変える"
deleteFolder: "フォルダーを消してまう"
addFile: "ファイルを追加"
emptyDrive: "ドライブにはなんも残っとらん"
emptyFolder: "ふぉろだーにはなんも残っとらん"
unableToDelete: "消そうおもってんけどな、あかんかったわ"
inputNewFileName: "今度のファイル名は何にするん?"
inputNewFolderName: "今度のフォルダ名は何にするん?"
circularReferenceFolder: "移動先のフォルダーは、移動するフォルダーのサブフォルダーや。"
hasChildFilesOrFolders: "このフォルダ、まだなんか入っとるから消されへん"
copyUrl: "URLをコピー"
rename: "名前を変えるで"
avatar: "アイコン"
banner: "バナー"
nsfw: "見たらあかんで"
disconnectedFromServer: "サーバーが機嫌悪いねん"
reload: "リロード"
doNothing: "何もせんとく"
reloadConfirm: "リロードしてええか?"
watch: "ウォッチ"
unwatch: "ウォッチやめる"
accept: "ええで"
reject: "あかん"
normal: "ええ感じ"
instanceName: "インスタンス名"
instanceDescription: "インスタンスの紹介"
maintainerName: "管理者の名前"
maintainerEmail: "管理者のメールアドレス"
tosUrl: "利用規約のURL"
thisYear: "今年"
thisMonth: "今月"
today: "今日"
dayX: "{day}日"
monthX: "{month}月"
yearX: "{year}年"
pages: "ページ"
integration: "つないで"
connectSerice: "つなげる"
disconnectSerice: "切ってまう"
enableLocalTimeline: "ローカルタイムラインを使えるようにする"
enableGlobalTimeline: "グローバルタイムラインを使えるようにする"
disablingTimelinesInfo: "ここらへんのタイムラインを使えんようにしてしもても、管理者とモデレーターは使えるままになってるで、そうやなかったら不便やからな。"
registration: "登録"
enableRegistration: "一見さんでも誰でもいらっしゃ~い"
invite: "来てや"
proxyRemoteFiles: "リモートのファイルをプロキシする"
proxyRemoteFilesDescription: "この設定を入れると、保存しとらんかったり、お腹いっぱいになってしもたせいで保存できんかったリモートファイルをローカルでプロキシして、サムネイル作ってもらうことができるで。サーバーの腹具合には影響せんけどな。"
driveCapacityPerLocalAccount: "ローカルユーザーひとりあたりのドライブ容量"
driveCapacityPerRemoteAccount: "リモートユーザーひとりあたりのドライブ容量"
inMb: "メガバイト単位"
avoidMultiCaptchaConfirm: "ぎょうさんのCaptchaをつこてしまうと、仲良うせんことがあるんや。他のCaptchaをなおしとこか別にキャンセルしてもろうたらCaptchaは消されへんで済むけど知らんで。"
antennas: "アンテナ"
manageAntennas: "アンテナいじる"
name: "名前"
antennaSource: "受信ソース(このソースは食われへん)"
antennaKeywords: "受信キーワード"
antennaExcludeKeywords: "除外キーワード"
antennaKeywordsDescription: "スペースで区切ったるとAND指定で、改行で区切ったるとOR指定や"
notifyAntenna: "新しいノートを追加すんで"
withFileAntenna: "なんか添付されたノートだけ"
serviceworker: "ServiceWorker"
enableServiceworker: "ServiceWorkerをつこて"
antennaUsersDescription: "ユーザー名を改行で区切ったってな"
caseSensitive: "大文字と小文字は別もんや"
withReplies: "返信も入れたって"
connectedTo: "次のアカウントに繋がっとるで"
notesAndReplies: "投稿と返信"
withFiles: "ファイル付いとる"
silence: "サイレンス"
silenceConfirm: "サイレンスしよか?"
unsilence: "サイレンスやめるで"
unsilenceConfirm: "サイレンスやめよか?"
popularUsers: "人気のユーザー"
recentlyUpdatedUsers: "ちょっと前に投稿したばっかりのユーザー"
recentlyRegisteredUsers: "ちょっと前に始めたばっかりのユーザー"
recentlyDiscoveredUsers: "最近見っけたユーザー"
exploreUsersCount: "{count}もユーザーおるで"
exploreFediverse: "Fediverseを探ってみる"
popularTags: "人気のタグ"
userList: "リスト"
about: "情報"
aboutMisskey: "Misskeyってなんや"
aboutMisskeyText: "Misskeyはsyuiloいう人が2014年からずっと作ってはる、オープンソースなソフトウェアや。"
misskeyMembers: "今んとここんだけのメンバーが作って、メンテナンスしてはる:"
misskeySource: "ソースコードはこっから見てな:"
misskeyTranslation: "Misskeyの翻訳手伝うてくれへん:"
misskeyDonate: "Misskeyにお金あげたら開発のサポートになるで:"
morePatrons: "他にもぎょうさんの人からサポートしてもろてんねん。ほんまおおきに🥰"
patrons: "支援者"
administrator: "管理者"
token: "トークン"
twoStepAuthentication: "二段階認証"
moderator: "モデレーター"
nUsersMentioned: "{n}人が投稿"
securityKey: "セキュリティキー"
securityKeyName: "キーの名前"
registerSecurityKey: "セキュリティキーを登録するで"
lastUsed: "最後につこうた日"
unregister: "登録やめる"
passwordLessLogin: "パスワード無くてもログインできるようにする"
resetPassword: "パスワードをリセット"
newPasswordIs: "今度のパスワードは「{password}」や"
autoReloadWhenDisconnected: "サーバーが調子悪いときには自動でリロードしたる"
notFoundDescription: "指定されたURLに該当するページはあらへんやった。"
close: "さいなら"
joinedGroups: "参加しとるグループ"
invites: "来てや"
_sfx:
note: "ノート"
notification: "通知"
chat: "チャット"
_ago:
unknown: "謎"
future: "未来"
@ -142,6 +382,7 @@ _antennaSources:
_widgets:
notifications: "通知"
timeline: "タイムライン"
activity: "アクティビティ"
_cw:
show: "もっとあるやろ!"
_poll:
@ -149,14 +390,27 @@ _poll:
deadlineTime: "時間"
_visibility:
publicDescription: "みなのユーザーに公開"
home: "ホーム"
followers: "フォロワー"
_profile:
name: "名前"
username: "ユーザー名"
_exportOrImport:
allNotes: "全てのノート"
followingList: "フォロー"
muteList: "ミュート"
blockingList: "ブロック"
userLists: "リスト"
_timelines:
home: "ホーム"
_rooms:
_roomType:
default: "デフォルト"
_furnitures:
monitor: "モニター"
_pages:
blocks:
image: "画像"
script:
categories:
list: "リスト"
@ -175,3 +429,6 @@ _pages:
arg1: "リスト"
types:
array: "リスト"
_notification:
youWereFollowed: "フォローされたで"

View File

@ -63,3 +63,6 @@ _cw:
show: "ಇನ್ನಷ್ಟು ನೋಡು"
_profile:
username: "ಬಳಕೆಹೆಸರು"
_notification:
youWereFollowed: "ಹಿಂಬಾಲಿಸಿದರು"

View File

@ -632,7 +632,6 @@ _cw:
show: "더 보기"
chars: "{count} 문자"
files: "{count} 파일"
poll: "투표"
_poll:
noOnlyOneChoice: "투표 항목이 최소 2개 필요합니다"
choiceN: "선택지 {n}"
@ -780,6 +779,8 @@ _rooms:
cup-noodle: "컵라면"
holo-display: "홀로그램"
energy-drink: "에너지 드링크"
doll-ai: "아이쨩 인형"
banknote: "지폐뭉치"
_pages:
newPage: "페이지 만들기"
editPage: "페이지 수정"
@ -1065,3 +1066,7 @@ _relayStatus:
requesting: "대기 중"
accepted: "승인됨"
rejected: "거절됨"
_notification:
youWereFollowed: "새로운 팔로워가 있습니다"
youWereInvitedToGroup: "그룹에 초대되었습니다"

View File

@ -1,2 +1,3 @@
---
_lang_: "Nederlands"

View File

@ -1,2 +1,3 @@
---
_lang_: "Norsk Bokmål"

View File

@ -1,2 +1,3 @@
---
_lang_: "język polski"

View File

@ -1,2 +1,3 @@
---
_lang_: "Português"

View File

@ -34,3 +34,4 @@ _widgets:
timeline: "Лента"
_cw:
show: "Показать еще"

4
locales/ug-CN.yml Normal file
View File

@ -0,0 +1,4 @@
---
_lang_: "ياپونچە"
search: "ئىزدەش"

View File

@ -36,7 +36,7 @@ copyContent: "复制内容"
copyLink: "复制链接"
delete: "删除"
deleteAndEdit: "删除和编辑"
deleteAndEditConfirm: "要删除此帖并再次编辑吗?对此帖的所有回应,转和回复也将被删除。"
deleteAndEditConfirm: "要删除此帖并再次编辑吗?对此帖的所有回应,转和回复也将被删除。"
addToList: "添加至列表"
sendMessage: "发送"
copyUsername: "复制用户名"
@ -45,6 +45,7 @@ loadMore: "查看更多"
youGotNewFollower: "你有新的关注者"
receiveFollowRequest: "收到关注请求"
followRequestAccepted: "同意关注请求"
mention: "提及"
mentions: "提及"
directNotes: "指定用户可见"
importAndExport: "导入和导出"
@ -104,6 +105,7 @@ suspendConfirm: "要冻结吗?"
unsuspendConfirm: "要解除冻结吗?"
selectList: "选择列表"
customEmojis: "自定义Emoji"
emoji: "表情符号"
emojiName: "Emoji 名称"
emojiUrl: "emoji 地址"
addEmoji: "添加Emoji"
@ -506,6 +508,13 @@ relays: "中继"
addRelay: "添加中继"
inboxUrl: "Inbox URL"
addedRelays: "已添加的中继"
serviceworkerInfo: "您需要启用推送通知"
deletedNote: "已删除的帖子"
invisibleNote: "隐藏的帖子"
enableInfiniteScroll: "启用自动滚动页面模式"
visibility: "可见性"
poll: "调查问卷"
useCw: "隐藏内容"
_theme:
explore: "寻找主题"
install: "安装主题"
@ -632,7 +641,6 @@ _cw:
show: "查看更多"
chars: "{count}个字符"
files: "{count} 个文件"
poll: "投票"
_poll:
noOnlyOneChoice: "需要至少两个选项"
choiceN: "选择{n}"
@ -665,6 +673,7 @@ _visibility:
specified: "指定用户"
specifiedDescription: "仅发送至指定用户"
localOnly: "仅限本地"
localOnlyDescription: "对远程用户不可见"
_postForm:
replyPlaceholder: "回复这个帖子..."
quotePlaceholder: "引用这个帖子..."
@ -781,6 +790,7 @@ _rooms:
holo-display: "全息显示器"
energy-drink: "能量饮料"
doll-ai: "小蓝的玩偶"
banknote: "钞票"
_pages:
newPage: "创建页面"
editPage: "编辑页面"
@ -1066,3 +1076,17 @@ _relayStatus:
requesting: "待批准"
accepted: "已批准"
rejected: "已拒绝"
_notification:
fileUploaded: "文件已上传"
youGotMention: "来自{name}的提及"
youGotReply: "来自{name}的回复"
youGotQuote: "来自{name}的引用"
youRenoted: "来自{name}的转发"
youGotPoll: "来自{name}的投票"
youGotMessagingMessageFromUser: "来自{name}的聊天"
youGotMessagingMessageFromGroup: "来自{name}的群聊"
youWereFollowed: "您有新的关注者"
youReceivedFollowRequest: "您有新的关注请求"
yourFollowRequestAccepted: "您的关注请求已通过"
youWereInvitedToGroup: "您有新的群组邀请"

View File

@ -391,3 +391,6 @@ _pages:
arg1: "清單"
types:
array: "清單"
_notification:
youWereFollowed: "您有新的追隨者"

View File

@ -1,7 +1,7 @@
{
"name": "misskey",
"author": "syuilo <syuilotan@yahoo.co.jp>",
"version": "12.38.0",
"version": "12.39.1",
"codename": "indigo",
"repository": {
"type": "git",
@ -43,7 +43,7 @@
"@fortawesome/free-solid-svg-icons": "5.13.0",
"@fortawesome/vue-fontawesome": "0.1.9",
"@juggle/resize-observer": "3.1.3",
"@koa/cors": "3.0.0",
"@koa/cors": "3.1.0",
"@koa/multer": "2.0.2",
"@koa/router": "8.0.8",
"@sinonjs/fake-timers": "6.0.1",
@ -76,7 +76,7 @@
"@types/koa__router": "8.0.2",
"@types/markdown-it": "10.0.1",
"@types/mocha": "7.0.2",
"@types/node": "14.0.1",
"@types/node": "14.0.5",
"@types/node-fetch": "2.5.7",
"@types/nodemailer": "6.4.0",
"@types/nprogress": "0.2.0",
@ -98,7 +98,7 @@
"@types/speakeasy": "2.0.5",
"@types/tinycolor2": "1.4.2",
"@types/tmp": "0.2.0",
"@types/uuid": "7.0.3",
"@types/uuid": "8.0.0",
"@types/web-push": "3.3.0",
"@types/webpack": "4.41.13",
"@types/webpack-stream": "3.2.11",
@ -106,11 +106,11 @@
"@types/ws": "7.2.4",
"@typescript-eslint/parser": "2.33.0",
"abort-controller": "3.0.0",
"apexcharts": "3.19.0",
"apexcharts": "3.19.2",
"autobind-decorator": "2.4.0",
"autosize": "4.0.2",
"autwh": "0.1.0",
"aws-sdk": "2.678.0",
"aws-sdk": "2.683.0",
"bcryptjs": "2.4.3",
"bull": "3.14.0",
"cafy": "15.2.1",
@ -125,6 +125,7 @@
"css-loader": "3.5.3",
"cssnano": "4.1.10",
"dateformat": "3.0.3",
"deep-entries": "3.1.0",
"diskusage": "1.1.3",
"double-ended-queue": "2.1.0-0",
"escape-regexp": "0.0.1",
@ -133,7 +134,7 @@
"eventemitter3": "4.0.4",
"feed": "4.1.0",
"fibers": "5.0.0",
"file-type": "14.4.0",
"file-type": "14.5.0",
"fluent-ffmpeg": "2.1.2",
"glob": "7.1.6",
"gulp": "4.0.2",
@ -151,17 +152,18 @@
"http-proxy-agent": "4.0.1",
"http-signature": "1.3.4",
"https-proxy-agent": "5.0.0",
"idb-keyval": "3.2.0",
"insert-text-at-cursor": "0.3.0",
"is-root": "2.1.0",
"is-svg": "4.2.1",
"js-yaml": "3.13.1",
"js-yaml": "3.14.0",
"jsdom": "16.2.2",
"json5": "2.1.3",
"json5-loader": "4.0.0",
"jsonld": "3.1.0",
"jsonld": "3.1.1",
"jsrsasign": "8.0.15",
"katex": "0.11.1",
"koa": "2.11.0",
"koa": "2.12.0",
"koa-bodyparser": "4.3.0",
"koa-favicon": "2.1.0",
"koa-json-body": "5.3.0",
@ -172,9 +174,9 @@
"koa-views": "6.2.2",
"langmap": "0.0.16",
"lookup-dns-cache": "2.1.0",
"markdown-it": "10.0.0",
"markdown-it": "11.0.0",
"markdown-it-anchor": "5.3.0",
"mocha": "7.1.2",
"mocha": "7.2.0",
"moji": "0.5.1",
"ms": "2.1.2",
"multer": "1.4.2",
@ -216,13 +218,13 @@
"sass": "1.26.5",
"sass-loader": "8.0.2",
"seedrandom": "3.0.5",
"sharp": "0.25.2",
"sharp": "0.25.3",
"speakeasy": "2.0.0",
"stringz": "2.1.0",
"style-loader": "1.2.1",
"summaly": "2.3.1",
"summaly": "2.4.0",
"syslog-pro": "1.0.0",
"systeminformation": "4.26.1",
"systeminformation": "4.26.4",
"syuilo-password-strength": "0.0.1",
"textarea-caret": "3.1.0",
"three": "0.116.1",
@ -232,25 +234,25 @@
"ts-node": "8.10.1",
"tslint": "6.1.2",
"tslint-sonarts": "1.9.0",
"typeorm": "0.2.24",
"typescript": "3.9.2",
"typeorm": "0.2.25",
"typescript": "3.9.3",
"ulid": "2.3.0",
"url-loader": "4.1.0",
"uuid": "8.0.0",
"uuid": "8.1.0",
"v-animate-css": "0.0.3",
"v-debounce": "0.1.2",
"vue": "2.6.11",
"vue-color": "2.7.1",
"vue-content-loading": "1.6.0",
"vue-cropperjs": "4.1.0",
"vue-i18n": "8.17.6",
"vue-i18n": "8.17.7",
"vue-json-pretty": "1.6.3",
"vue-loader": "15.9.2",
"vue-marquee-text-component": "1.1.1",
"vue-meta": "2.3.3",
"vue-prism-component": "1.2.0",
"vue-prism-editor": "0.6.1",
"vue-router": "3.1.6",
"vue-router": "3.2.0",
"vue-style-loader": "4.1.2",
"vue-svg-inline-loader-corejs3": "1.5.0",
"vue-template-compiler": "2.6.11",

View File

@ -136,15 +136,12 @@ import { faGripVertical, faChevronLeft, faHashtag, faBroadcastTower, faFireAlt,
import { faBell, faEnvelope, faLaugh, faComments } from '@fortawesome/free-regular-svg-icons';
import { ResizeObserver } from '@juggle/resize-observer';
import { v4 as uuid } from 'uuid';
import i18n from './i18n';
import { host, instanceName } from './config';
import { search } from './scripts/search';
const DESKTOP_THRESHOLD = 1100;
export default Vue.extend({
i18n,
components: {
XClock: () => import('./components/header-clock.vue').then(m => m.default),
MkButton: () => import('./components/ui/button.vue').then(m => m.default),
@ -503,8 +500,7 @@ export default Vue.extend({
},
async onNotification(notification) {
// TODO: ユーザーが画面を見てないと思われるとき(ブラウザやタブがアクティブじゃないなど)は送信しない
if (true) {
if (document.visibilityState === 'visible') {
this.$root.stream.send('readNotification', {
id: notification.id
});

View File

@ -7,7 +7,6 @@
<script lang="ts">
import Vue from 'vue';
import i18n from '../i18n';
type Captcha = {
render(container: string | Node, options: {
@ -31,7 +30,6 @@ declare global {
}
export default Vue.extend({
i18n,
props: {
provider: {
type: String,

View File

@ -7,13 +7,10 @@
<script lang="ts">
import Vue from 'vue';
import i18n from '../i18n';
import { length } from 'stringz';
import { concat } from '../../prelude/array';
export default Vue.extend({
i18n,
props: {
value: {
type: Boolean,
@ -30,7 +27,7 @@ export default Vue.extend({
return concat([
this.note.text ? [this.$t('_cw.chars', { count: length(this.note.text) })] : [],
this.note.files && this.note.files.length !== 0 ? [this.$t('_cw.files', { count: this.note.files.length }) ] : [],
this.note.poll != null ? [this.$t('_cw.poll')] : []
this.note.poll != null ? [this.$t('poll')] : []
] as string[][]).join(' / ');
}
},

View File

@ -15,11 +15,8 @@
<script lang="ts">
import Vue from 'vue';
import { faAngleUp, faAngleDown } from '@fortawesome/free-solid-svg-icons';
import i18n from '../i18n';
export default Vue.extend({
i18n,
props: {
items: {
type: Array,

View File

@ -57,11 +57,8 @@ import MkInput from './ui/input.vue';
import MkSelect from './ui/select.vue';
import MkSignin from './signin.vue';
import parseAcct from '../../misc/acct/parse';
import i18n from '../i18n';
export default Vue.extend({
i18n,
components: {
MkButton,
MkInput,

View File

@ -12,13 +12,10 @@
<script lang="ts">
import Vue from 'vue';
import i18n from '../i18n';
import XDrive from './drive.vue';
import XWindow from './window.vue';
export default Vue.extend({
i18n,
components: {
XDrive,
XWindow,

View File

@ -32,7 +32,6 @@
<script lang="ts">
import Vue from 'vue';
import { faEye, faEyeSlash } from '@fortawesome/free-regular-svg-icons';
import i18n from '../i18n';
import copyToClipboard from '../scripts/copy-to-clipboard';
//import updateAvatar from '../api/update-avatar';
//import updateBanner from '../api/update-banner';
@ -40,8 +39,6 @@ import XFileThumbnail from './drive-file-thumbnail.vue';
import { faDownload, faLink, faICursor, faTrashAlt } from '@fortawesome/free-solid-svg-icons';
export default Vue.extend({
i18n,
components: {
XFileThumbnail
},

View File

@ -28,11 +28,8 @@
<script lang="ts">
import Vue from 'vue';
import { faFolder, faFolderOpen } from '@fortawesome/free-regular-svg-icons';
import i18n from '../i18n';
export default Vue.extend({
i18n,
props: {
folder: {
type: Object,

View File

@ -15,11 +15,8 @@
<script lang="ts">
import Vue from 'vue';
import { faCloud } from '@fortawesome/free-solid-svg-icons';
import i18n from '../i18n';
export default Vue.extend({
i18n,
props: {
folder: {
type: Object,

View File

@ -19,17 +19,17 @@
@drop.prevent.stop="onDrop"
>
<div class="contents" ref="contents">
<div class="folders" ref="foldersContainer" v-if="folders.length > 0">
<div class="folders" ref="foldersContainer" v-show="folders.length > 0">
<x-folder v-for="f in folders" :key="f.id" class="folder" :folder="f" :select-mode="select === 'folder'" :is-selected="selectedFolders.some(x => x.id === f.id)" @chosen="chooseFolder"/>
<!-- SEE: https://stackoverflow.com/questions/18744164/flex-box-align-last-row-to-grid -->
<div class="padding" v-for="(n, i) in 16" :key="i"></div>
<mk-button v-if="moreFolders">{{ $t('loadMore') }}</mk-button>
<mk-button ref="moreFolders" v-if="moreFolders">{{ $t('loadMore') }}</mk-button>
</div>
<div class="files" ref="filesContainer" v-if="files.length > 0">
<div class="files" ref="filesContainer" v-show="files.length > 0">
<x-file v-for="file in files" :key="file.id" class="file" :file="file" :select-mode="select === 'file'" :is-selected="selectedFiles.some(x => x.id === file.id)" @chosen="chooseFile"/>
<!-- SEE: https://stackoverflow.com/questions/18744164/flex-box-align-last-row-to-grid -->
<div class="padding" v-for="(n, i) in 16" :key="i"></div>
<mk-button v-if="moreFiles" @click="fetchMoreFiles">{{ $t('loadMore') }}</mk-button>
<mk-button ref="loadMoreFiles" @click="fetchMoreFiles" v-show="moreFiles">{{ $t('loadMore') }}</mk-button>
</div>
<div class="empty" v-if="files.length == 0 && folders.length == 0 && !fetching">
<p v-if="draghover">{{ $t('empty-draghover') }}</p>
@ -48,7 +48,6 @@
<script lang="ts">
import Vue from 'vue';
import { faAngleRight } from '@fortawesome/free-solid-svg-icons';
import i18n from '../i18n';
import XNavFolder from './drive.nav-folder.vue';
import XFolder from './drive.folder.vue';
import XFile from './drive.file.vue';
@ -56,8 +55,6 @@ import XUploader from './uploader.vue';
import MkButton from './ui/button.vue';
export default Vue.extend({
i18n,
components: {
XNavFolder,
XFolder,
@ -119,6 +116,13 @@ export default Vue.extend({
fetching: true,
ilFilesObserver: new IntersectionObserver(
(entries) => entries.some((entry) => entry.isIntersecting)
&& !this.fetching && this.moreFiles &&
this.fetchMoreFiles()
),
moreFilesElement: null as Element,
faAngleRight
};
},
@ -130,6 +134,12 @@ export default Vue.extend({
},
mounted() {
if (this.$store.state.device.enableInfiniteScroll && this.$refs.loadMoreFiles) {
this.$nextTick(() => {
this.ilFilesObserver.observe((this.$refs.loadMoreFiles as Vue).$el)
});
}
this.connection = this.$root.stream.useSharedConnection('drive');
this.connection.on('fileCreated', this.onStreamDriveFileCreated);
@ -146,8 +156,17 @@ export default Vue.extend({
}
},
activated() {
if (this.$store.state.device.enableInfiniteScroll) {
this.$nextTick(() => {
this.ilFilesObserver.observe((this.$refs.loadMoreFiles as Vue).$el)
});
}
},
beforeDestroy() {
this.connection.dispose();
this.ilFilesObserver.disconnect();
},
methods: {

View File

@ -64,7 +64,6 @@
<script lang="ts">
import Vue from 'vue';
import i18n from '../i18n';
import { emojilist } from '../../misc/emojilist';
import { getStaticImageUrl } from '../scripts/get-static-image-url';
import { faAsterisk, faLeaf, faUtensils, faFutbol, faCity, faDice, faGlobe, faHistory, faUser } from '@fortawesome/free-solid-svg-icons';
@ -73,8 +72,6 @@ import { groupByX } from '../../prelude/array';
import XPopup from './popup.vue';
export default Vue.extend({
i18n,
components: {
XPopup,
},

View File

@ -9,11 +9,9 @@
<script lang="ts">
import Vue from 'vue';
import { faExclamationTriangle } from '@fortawesome/free-solid-svg-icons';
import i18n from '../i18n';
import MkButton from './ui/button.vue';
export default Vue.extend({
i18n,
components: {
MkButton,
},

View File

@ -30,12 +30,9 @@
<script lang="ts">
import Vue from 'vue';
import i18n from '../i18n';
import { faSpinner, faPlus, faMinus, faHourglassHalf } from '@fortawesome/free-solid-svg-icons';
export default Vue.extend({
i18n,
props: {
user: {
type: Object,

View File

@ -8,10 +8,8 @@
<script lang="ts">
import Vue from 'vue';
import { faSearch } from '@fortawesome/free-solid-svg-icons';
import i18n from '../i18n';
export default Vue.extend({
i18n,
props: ['q'],
data() {
return {

View File

@ -6,12 +6,9 @@
<script lang="ts">
import Vue from 'vue';
import i18n from '../i18n';
import XModal from './modal.vue';
export default Vue.extend({
i18n,
components: {
XModal,
},

View File

@ -125,7 +125,6 @@
import Vue from 'vue';
import { faChartBar, faUser, faPencilAlt } from '@fortawesome/free-solid-svg-icons';
import Chart from 'chart.js';
import i18n from '../i18n';
import MkSelect from './ui/select.vue';
const chartLimit = 90;
@ -140,8 +139,6 @@ const alpha = (hex, a) => {
};
export default Vue.extend({
i18n,
components: {
MkSelect
},

View File

@ -62,13 +62,13 @@ export default Vue.extend({
}
},
onMouseover() {
if (isDeviceTouch()) return;
if (isDeviceTouch) return;
clearTimeout(this.showTimer);
clearTimeout(this.hideTimer);
this.showTimer = setTimeout(this.showPreview, 500);
},
onMouseleave() {
if (isDeviceTouch()) return;
if (isDeviceTouch) return;
clearTimeout(this.showTimer);
clearTimeout(this.hideTimer);
this.hideTimer = setTimeout(this.closePreview, 500);

View File

@ -28,10 +28,8 @@
<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: {
media: {
type: Object,

View File

@ -21,12 +21,10 @@
<script lang="ts">
import Vue from 'vue';
import { faExclamationTriangle, faEyeSlash } from '@fortawesome/free-solid-svg-icons';
import i18n from '../i18n';
import { getStaticImageUrl } from '../scripts/get-static-image-url';
import ImageViewer from './image-viewer.vue';
export default Vue.extend({
i18n,
props: {
image: {
type: Object,

View File

@ -23,10 +23,8 @@
import Vue from 'vue';
import { faPlayCircle } from '@fortawesome/free-regular-svg-icons';
import { faExclamationTriangle, faEyeSlash } from '@fortawesome/free-solid-svg-icons';
import i18n from '../i18n';
export default Vue.extend({
i18n,
props: {
video: {
type: Object,

View File

@ -1,5 +1,5 @@
<template>
<router-link class="ldlomzub" :to="url" v-user-preview="canonical" v-if="url.startsWith('/')">
<router-link class="ldlomzub" :class="{ isMe }" :to="url" v-user-preview="canonical" v-if="url.startsWith('/')">
<span class="me" v-if="isMe">{{ $t('you') }}</span>
<span class="main">
<span class="username">@{{ username }}</span>
@ -16,12 +16,10 @@
<script lang="ts">
import Vue from 'vue';
import i18n from '../i18n';
import { toUnicode } from 'punycode';
import { host as localHost } from '../config';
export default Vue.extend({
i18n,
props: {
username: {
type: String,
@ -65,6 +63,10 @@ export default Vue.extend({
<style lang="scss" scoped>
.ldlomzub {
color: var(--mention);
&.isMe {
color: var(--mentionMe);
}
> .me {
pointer-events: none;

View File

@ -1,5 +1,5 @@
import Vue, { VNode } from 'vue';
import { MfmForest } from '../../mfm/types';
import { MfmForest } from '../../mfm/prelude';
import { parse, parsePlain } from '../../mfm/parse';
import MkUrl from './url.vue';
import MkLink from './link.vue';
@ -53,11 +53,11 @@ export default Vue.component('misskey-flavored-markdown', {
if (!this.plain) {
const x = text.split('\n')
.map(t => t == '' ? [createElement('br')] : [createElement('span', t), createElement('br')]);
.map(t => t == '' ? [createElement('br')] : [this._v(t), createElement('br')]); // NOTE: this._vはHACK SEE: https://github.com/syuilo/misskey/pull/6399#issuecomment-632820283
x[x.length - 1].pop();
return x;
} else {
return [createElement('span', text.replace(/\n/g, ' '))];
return [this._v(text.replace(/\n/g, ' '))];
}
}

View File

@ -50,15 +50,7 @@ export default Vue.extend({
margin: 0;
padding: 0;
overflow: hidden;
font-size: 10px;
@media (min-width: 350px) {
font-size: 12px;
}
@media (min-width: 500px) {
font-size: 14px;
}
font-size: 0.95em;
> .avatar {

View File

@ -93,7 +93,6 @@ import { faBolt, faTimes, faBullhorn, faStar, faLink, faExternalLinkSquareAlt, f
import { faCopy, faTrashAlt, faEdit, faEye, faEyeSlash } from '@fortawesome/free-regular-svg-icons';
import { parse } from '../../mfm/parse';
import { sum, unique } from '../../prelude/array';
import i18n from '../i18n';
import XSub from './note.sub.vue';
import XNoteHeader from './note-header.vue';
import XNotePreview from './note-preview.vue';
@ -109,7 +108,6 @@ import { url } from '../config';
import copyToClipboard from '../scripts/copy-to-clipboard';
export default Vue.extend({
i18n,
components: {
XSub,

View File

@ -7,8 +7,8 @@
<mk-error v-if="error" @retry="init()"/>
<div v-if="more && reversed" style="margin-bottom: var(--margin);">
<button class="_panel _button" :disabled="moreFetching" :style="{ cursor: moreFetching ? 'wait' : 'pointer' }" @click="fetchMore()">
<div v-show="more && reversed" style="margin-bottom: var(--margin);">
<button class="_panel _button" ref="loadMore" :disabled="moreFetching" :style="{ cursor: moreFetching ? 'wait' : 'pointer' }">
<template v-if="!moreFetching">{{ $t('loadMore') }}</template>
<template v-if="moreFetching"><mk-loading inline/></template>
</button>
@ -18,8 +18,8 @@
<x-note :note="note" :detail="detail" :key="note._featuredId_ || note._prId_ || note.id"/>
</x-list>
<div v-if="more && !reversed" style="margin-top: var(--margin);">
<button class="_panel _button" :disabled="moreFetching" :style="{ cursor: moreFetching ? 'wait' : 'pointer' }" @click="fetchMore()">
<div v-show="more && !reversed" style="margin-top: var(--margin);">
<button class="_panel _button" ref="loadMore" :disabled="moreFetching" :style="{ cursor: moreFetching ? 'wait' : 'pointer' }">
<template v-if="!moreFetching">{{ $t('loadMore') }}</template>
<template v-if="moreFetching"><mk-loading inline/></template>
</button>
@ -29,15 +29,12 @@
<script lang="ts">
import Vue from 'vue';
import i18n from '../i18n';
import paging from '../scripts/paging';
import XNote from './note.vue';
import XList from './date-separated-list.vue';
import MkButton from './ui/button.vue';
export default Vue.extend({
i18n,
components: {
XNote, XList, MkButton
},

View File

@ -61,13 +61,11 @@
import Vue from 'vue';
import { faIdCardAlt, faPlus, faQuoteLeft, faQuoteRight, faRetweet, faReply, faAt, faCheck, faPollH } from '@fortawesome/free-solid-svg-icons';
import { faClock } from '@fortawesome/free-regular-svg-icons';
import getNoteSummary from '../../misc/get-note-summary';
import noteSummary from '../../misc/get-note-summary';
import XReactionIcon from './reaction-icon.vue';
import MkFollowButton from './follow-button.vue';
import i18n from '../i18n';
export default Vue.extend({
i18n,
components: {
XReactionIcon, MkFollowButton
},
@ -89,12 +87,39 @@ export default Vue.extend({
},
data() {
return {
getNoteSummary,
getNoteSummary: (text: string) => noteSummary(text, this.$root.i18n.messages[this.$root.i18n.locale]),
followRequestDone: false,
groupInviteDone: false,
connection: null,
readObserver: null,
faIdCardAlt, faPlus, faQuoteLeft, faQuoteRight, faRetweet, faReply, faAt, faClock, faCheck, faPollH
};
},
mounted() {
if (!this.notification.isRead) {
this.readObserver = new IntersectionObserver((entries, observer) => {
if (!entries.some(entry => entry.isIntersecting)) return;
this.$root.stream.send('readNotification', {
id: this.notification.id
});
entries.map(({ target }) => observer.unobserve(target));
});
this.readObserver.observe(this.$el);
this.connection = this.$root.stream.useSharedConnection('main');
this.connection.on('readAllNotifications', () => this.readObserver.unobserve(this.$el));
}
},
beforeDestroy() {
if (!this.notification.isRead) {
this.readObserver.unobserve(this.$el);
this.connection.dispose();
}
},
methods: {
acceptFollowRequest() {
this.followRequestDone = true;

View File

@ -5,7 +5,7 @@
<x-notification v-else :notification="notification" :with-time="true" :full="true" class="_panel notification" :key="notification.id"/>
</x-list>
<button class="_panel _button" v-if="more" @click="fetchMore" :disabled="moreFetching">
<button class="_panel _button" ref="loadMore" v-show="more" :disabled="moreFetching" :style="{ cursor: moreFetching ? 'wait' : 'pointer' }">
<template v-if="!moreFetching">{{ $t('loadMore') }}</template>
<template v-if="moreFetching"><mk-loading inline/></template>
</button>
@ -18,15 +18,12 @@
<script lang="ts">
import Vue from 'vue';
import i18n from '../i18n';
import paging from '../scripts/paging';
import XNotification from './notification.vue';
import XList from './date-separated-list.vue';
import XNote from './note.vue';
export default Vue.extend({
i18n,
components: {
XNotification,
XList,
@ -74,10 +71,13 @@ export default Vue.extend({
methods: {
onNotification(notification) {
// TODO: ユーザーが画面を見てないと思われるとき(ブラウザやタブがアクティブじゃないなど)は送信しない
this.$root.stream.send('readNotification', {
id: notification.id
});
if (document.visibilityState === 'visible') {
this.$root.stream.send('readNotification', {
id: notification.id
});
notification.isRead = true;
}
this.prepend(notification);
},

View File

@ -8,13 +8,11 @@
<script lang="ts">
import Vue from 'vue';
import { faCheck, faPaperPlane } from '@fortawesome/free-solid-svg-icons';
import i18n from '../../i18n';
import MkTextarea from '../ui/textarea.vue';
import MkButton from '../ui/button.vue';
import { apiUrl } from '../../config';
export default Vue.extend({
i18n,
components: {
MkTextarea,
MkButton,

View File

@ -9,14 +9,11 @@ import Vue from 'vue';
import { parse } from '@syuilo/aiscript';
import { faHeart as faHeartS } from '@fortawesome/free-solid-svg-icons';
import { faHeart } from '@fortawesome/free-regular-svg-icons';
import i18n from '../../i18n';
import XBlock from './page.block.vue';
import { Hpml } from '../../scripts/hpml/evaluator';
import { url } from '../../config';
export default Vue.extend({
i18n,
components: {
XBlock
},

View File

@ -51,7 +51,6 @@
<script lang="ts">
import Vue from 'vue';
import { faExclamationTriangle, faTimes } from '@fortawesome/free-solid-svg-icons';
import i18n from '../i18n';
import { erase } from '../../prelude/array';
import { addTime } from '../../prelude/time';
import { formatDateTimeString } from '../../misc/format-time-string';
@ -61,7 +60,6 @@ import MkSwitch from './ui/switch.vue';
import MkButton from './ui/button.vue';
export default Vue.extend({
i18n,
components: {
MkInput,
MkSelect,

View File

@ -24,11 +24,9 @@
<script lang="ts">
import Vue from 'vue';
import { faCheck } from '@fortawesome/free-solid-svg-icons';
import i18n from '../i18n';
import { sum } from '../../prelude/array';
export default Vue.extend({
i18n,
props: {
note: {
type: Object,

View File

@ -14,15 +14,12 @@
<script lang="ts">
import Vue from 'vue';
import i18n from '../i18n';
import * as XDraggable from 'vuedraggable';
import { faTimesCircle, faEye, faEyeSlash } from '@fortawesome/free-regular-svg-icons';
import { faExclamationTriangle, faICursor } from '@fortawesome/free-solid-svg-icons';
import XFileThumbnail from './drive-file-thumbnail.vue'
export default Vue.extend({
i18n,
components: {
XDraggable,
XFileThumbnail

View File

@ -8,14 +8,14 @@
<header>
<button v-if="!fixed" class="cancel _button" @click="cancel"><fa :icon="faTimes"/></button>
<div>
<span class="local-only" v-if="localOnly" v-text="$t('_visibility.localOnly')" />
<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" v-tooltip="$t('visibility')">
<span v-if="visibility === 'public'"><fa :icon="faGlobe"/></span>
<span v-if="visibility === 'home'"><fa :icon="faHome"/></span>
<span v-if="visibility === 'followers'"><fa :icon="faUnlock"/></span>
<span v-if="visibility === 'specified'"><fa :icon="faEnvelope"/></span>
</button>
<button class="_button localOnly" v-if="visibility !== 'specified'" @click="localOnly = !localOnly" :class="{ active: localOnly }"><fa :icon="faBiohazard"/></button>
<button class="submit _buttonPrimary" :disabled="!canPost" @click="post">{{ submitText }}<fa :icon="reply ? faReply : renote ? faQuoteRight : faPaperPlane"/></button>
</div>
</header>
@ -26,7 +26,7 @@
<div v-if="visibility === 'specified'" class="to-specified">
<span style="margin-right: 8px;">{{ $t('recipient') }}</span>
<div class="visibleUsers">
<span v-for="u in visibleUsers">
<span v-for="u in visibleUsers" :key="u.id">
<mk-acct :user="u"/>
<button class="_button" @click="removeVisibleUser(u)"><fa :icon="faTimes"/></button>
</span>
@ -39,11 +39,11 @@
<x-poll-editor v-if="poll" ref="poll" @destroyed="poll = false" @updated="onPollUpdate()"/>
<x-uploader ref="uploader" @uploaded="attachMedia" @change="onChangeUploadings"/>
<footer>
<button class="_button" @click="chooseFileFrom"><fa :icon="faPhotoVideo"/></button>
<button class="_button" @click="poll = !poll" :class="{ active: poll }"><fa :icon="faPollH"/></button>
<button class="_button" @click="useCw = !useCw" :class="{ active: useCw }"><fa :icon="faEyeSlash"/></button>
<button class="_button" @click="insertMention"><fa :icon="faAt"/></button>
<button class="_button" @click="insertEmoji"><fa :icon="faLaughSquint"/></button>
<button class="_button" @click="chooseFileFrom" v-tooltip="$t('attachFile')"><fa :icon="faPhotoVideo"/></button>
<button class="_button" @click="poll = !poll" :class="{ active: poll }" v-tooltip="$t('poll')"><fa :icon="faPollH"/></button>
<button class="_button" @click="useCw = !useCw" :class="{ active: useCw }" v-tooltip="$t('useCw')"><fa :icon="faEyeSlash"/></button>
<button class="_button" @click="insertMention" v-tooltip="$t('mention')"><fa :icon="faAt"/></button>
<button class="_button" @click="insertEmoji" v-tooltip="$t('emoji')"><fa :icon="faLaughSquint"/></button>
</footer>
<input ref="file" class="file _button" type="file" multiple="multiple" @change="onChangeFile"/>
</div>
@ -57,7 +57,6 @@ import { faEyeSlash, faLaughSquint } from '@fortawesome/free-regular-svg-icons';
import insertTextAtCursor from 'insert-text-at-cursor';
import { length } from 'stringz';
import { toASCII } from 'punycode';
import i18n from '../i18n';
import MkVisibilityChooser from './visibility-chooser.vue';
import MkUserSelect from './user-select.vue';
import XNotePreview from './note-preview.vue';
@ -68,10 +67,9 @@ import extractMentions from '../../misc/extract-mentions';
import getAcct from '../../misc/acct/render';
import { formatTimeString } from '../../misc/format-time-string';
import { selectDriveFile } from '../scripts/select-drive-file';
import { noteVisibilities } from '../../types';
export default Vue.extend({
i18n,
components: {
XNotePreview,
XUploader: () => import('./uploader.vue').then(m => m.default),
@ -400,15 +398,17 @@ export default Vue.extend({
setVisibility() {
const w = this.$root.new(MkVisibilityChooser, {
source: this.$refs.visibilityButton,
currentVisibility: this.visibility
currentVisibility: this.visibility,
currentLocalOnly: this.localOnly
});
w.$once('chosen', v => {
this.applyVisibility(v);
w.$once('chosen', ({ visibility, localOnly }) => {
this.applyVisibility(visibility);
this.localOnly = localOnly;
});
},
applyVisibility(v: string) {
this.visibility = ['public', 'home', 'followers', 'specified'].includes(v) ? v : 'public'; // v11互換性のため
this.visibility = (noteVisibilities as unknown as string[]).includes(v) ? v : 'public'; // v11互換性のため
},
addVisibleUser() {
@ -579,7 +579,7 @@ export default Vue.extend({
insertTextAtCursor(this.$refs.text, emoji);
vm.close();
});
}
},
}
});
</script>
@ -631,15 +631,9 @@ export default Vue.extend({
margin-left: 0 !important;
}
}
> .localOnly {
height: 34px;
width: 34px;
.local-only {
margin: 0 8px;
&.active {
color: var(--accent);
}
}
> .submit {

View File

@ -4,9 +4,7 @@
<script lang="ts">
import Vue from 'vue';
import i18n from '../i18n';
export default Vue.extend({
i18n,
props: {
reaction: {
type: String,

View File

@ -11,14 +11,11 @@
<script lang="ts">
import Vue from 'vue';
import i18n from '../i18n';
import { emojiRegex } from '../../misc/emoji-regex';
import XReactionIcon from './reaction-icon.vue';
import XPopup from './popup.vue';
export default Vue.extend({
i18n,
components: {
XPopup,
XReactionIcon,

View File

@ -1,29 +1,29 @@
<template>
<transition name="zoom-in-top">
<div class="buebdbiu" ref="popover" v-if="show">
<template v-if="users.length <= 10">
<b v-for="u in users" :key="u.id" style="margin-right: 12px;">
<mk-avatar :user="u" style="width: 24px; height: 24px; margin-right: 2px;"/>
<mk-user-name :user="u" :nowrap="false" style="line-height: 24px;"/>
</b>
</template>
<template v-if="10 < users.length">
<b v-for="u in users" :key="u.id" style="margin-right: 12px;">
<mk-avatar :user="u" style="width: 24px; height: 24px; margin-right: 2px;"/>
<mk-user-name :user="u" :nowrap="false" style="line-height: 24px;"/>
</b>
<span slot="omitted">+{{ count - 10 }}</span>
</template>
</div>
</transition>
<mk-tooltip :source="source" ref="tooltip">
<template v-if="users.length <= 10">
<b v-for="u in users" :key="u.id" style="margin-right: 12px;">
<mk-avatar :user="u" style="width: 24px; height: 24px; margin-right: 2px;"/>
<mk-user-name :user="u" :nowrap="false" style="line-height: 24px;"/>
</b>
</template>
<template v-if="10 < users.length">
<b v-for="u in users" :key="u.id" style="margin-right: 12px;">
<mk-avatar :user="u" style="width: 24px; height: 24px; margin-right: 2px;"/>
<mk-user-name :user="u" :nowrap="false" style="line-height: 24px;"/>
</b>
<span slot="omitted">+{{ count - 10 }}</span>
</template>
</mk-tooltip>
</template>
<script lang="ts">
import Vue from 'vue';
import i18n from '../i18n';
import MkTooltip from './ui/tooltip.vue';
export default Vue.extend({
i18n,
components: {
MkTooltip
},
props: {
reaction: {
type: String,
@ -41,77 +41,11 @@ export default Vue.extend({
required: true,
}
},
data() {
return {
show: false
};
},
mounted() {
this.show = true;
this.$nextTick(() => {
const popover = this.$refs.popover as any;
if (this.source == null) {
this.destroyDom();
return;
}
const rect = this.source.getBoundingClientRect();
const x = rect.left + window.pageXOffset + (this.source.offsetWidth / 2);
const y = rect.top + window.pageYOffset + this.source.offsetHeight;
popover.style.left = (x - 28) + 'px';
popover.style.top = (y + 16) + 'px';
});
}
methods: {
close() {
this.show = false;
setTimeout(this.destroyDom, 300);
this.$refs.tooltip.close();
}
}
})
</script>
<style lang="scss" scoped>
.buebdbiu {
z-index: 10000;
display: block;
position: absolute;
max-width: 240px;
font-size: 0.8em;
padding: 6px 8px;
background: var(--panel);
text-align: center;
border-radius: 4px;
box-shadow: 0 2px 8px rgba(0,0,0,0.25);
pointer-events: none;
transform-origin: center -16px;
&:before {
content: "";
pointer-events: none;
display: block;
position: absolute;
top: -28px;
left: 12px;
border-top: solid 14px transparent;
border-right: solid 14px transparent;
border-bottom: solid 14px rgba(0,0,0,0.1);
border-left: solid 14px transparent;
}
&:after {
content: "";
pointer-events: none;
display: block;
position: absolute;
top: -27px;
left: 12px;
border-top: solid 14px transparent;
border-right: solid 14px transparent;
border-bottom: solid 14px var(--panel);
border-left: solid 14px transparent;
}
}
</style>

View File

@ -4,8 +4,10 @@
:class="{ reacted: note.myReaction == reaction, canToggle }"
@click="toggleReaction(reaction)"
v-if="count > 0"
@touchstart="onMouseover"
@mouseover="onMouseover"
@mouseleave="onMouseleave"
@touchend="onMouseleave"
ref="reaction"
v-particle
>
@ -90,16 +92,17 @@ export default Vue.extend({
}
},
onMouseover() {
if (this.isHovering) return;
this.isHovering = true;
this.detailsTimeoutId = setTimeout(this.openDetails, 300);
},
onMouseleave() {
if (!this.isHovering) return;
this.isHovering = false;
clearTimeout(this.detailsTimeoutId);
this.closeDetails();
},
openDetails() {
if (this.$root.isMobile) return;
this.$root.api('notes/reactions', {
noteId: this.note.id,
type: this.reaction,

View File

@ -5,10 +5,8 @@
<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,

View File

@ -7,13 +7,10 @@
<script lang="ts">
import Vue from 'vue';
import i18n from '../i18n';
import XWindow from './window.vue';
import MkSignin from './signin.vue';
export default Vue.extend({
i18n,
components: {
MkSignin,
XWindow,

View File

@ -49,13 +49,10 @@ import { faLock, faGavel } from '@fortawesome/free-solid-svg-icons';
import { faTwitter, faDiscord, faGithub } from '@fortawesome/free-brands-svg-icons';
import MkButton from './ui/button.vue';
import MkInput from './ui/input.vue';
import i18n from '../i18n';
import { apiUrl, host } from '../config';
import { byteify, hexify } from '../scripts/2fa';
export default Vue.extend({
i18n,
components: {
MkButton,
MkInput,

View File

@ -7,13 +7,10 @@
<script lang="ts">
import Vue from 'vue';
import i18n from '../i18n';
import XWindow from './window.vue';
import XSignup from './signup.vue';
export default Vue.extend({
i18n,
components: {
XSignup,
XWindow,

View File

@ -53,15 +53,12 @@ import Vue from 'vue';
import { faLock, faExclamationTriangle, faSpinner, faCheck, faKey } from '@fortawesome/free-solid-svg-icons';
const getPasswordStrength = require('syuilo-password-strength');
import { toUnicode } from 'punycode';
import i18n from '../i18n';
import { host, url } from '../config';
import MkButton from './ui/button.vue';
import MkInput from './ui/input.vue';
import MkSwitch from './ui/switch.vue';
export default Vue.extend({
i18n,
components: {
MkButton,
MkInput,

View File

@ -10,10 +10,8 @@
<script lang="ts">
import Vue from 'vue';
import i18n from '../i18n';
export default Vue.extend({
i18n,
data() {
return {
hasDisconnected: false,

View File

@ -21,12 +21,10 @@
<script lang="ts">
import Vue from 'vue';
import { faReply } from '@fortawesome/free-solid-svg-icons';
import i18n from '../i18n';
import XPoll from './poll.vue';
import XMediaList from './media-list.vue';
export default Vue.extend({
i18n,
components: {
XPoll,
XMediaList,

View File

@ -8,10 +8,8 @@
<script lang="ts">
import Vue from 'vue';
import i18n from '../i18n';
export default Vue.extend({
i18n,
props: {
time: {
type: [Date, String],

View File

@ -4,8 +4,8 @@
<div class="empty" v-if="empty" key="_empty_">
<slot name="empty"></slot>
</div>
<div class="more" v-if="more" key="_more_">
<mk-button class="button" :disabled="moreFetching" :style="{ cursor: moreFetching ? 'wait' : 'pointer' }" @click="fetchMore()" primary>
<div class="more" v-show="more" key="_more_">
<mk-button class="button" ref="loadMore" :disabled="moreFetching" :style="{ cursor: moreFetching ? 'wait' : 'pointer' }" primary>
<template v-if="!moreFetching">{{ $t('loadMore') }}</template>
<template v-if="moreFetching"><mk-loading inline/></template>
</mk-button>

View File

@ -0,0 +1,96 @@
<template>
<transition name="zoom-in-top" appear>
<div class="buebdbiu" v-if="show">
<slot>{{ text }}</slot>
</div>
</transition>
</template>
<script lang="ts">
import Vue from 'vue';
export default Vue.extend({
props: {
source: {
required: true,
},
text: {
type: String,
required: false
}
},
data() {
return {
show: false
};
},
mounted() {
this.show = true;
this.$nextTick(() => {
if (this.source == null) {
this.destroyDom();
return;
}
const rect = this.source.getBoundingClientRect();
const x = rect.left + window.pageXOffset + (this.source.offsetWidth / 2);
const y = rect.top + window.pageYOffset + this.source.offsetHeight;
this.$el.style.left = (x - 28) + 'px';
this.$el.style.top = (y + 16) + 'px';
});
},
methods: {
close() {
this.show = false;
setTimeout(this.destroyDom, 300);
}
}
})
</script>
<style lang="scss" scoped>
.buebdbiu {
z-index: 11000;
display: block;
position: absolute;
max-width: 240px;
font-size: 0.8em;
padding: 6px 8px;
background: var(--panel);
text-align: center;
border-radius: 4px;
box-shadow: 0 2px 8px rgba(0,0,0,0.25);
pointer-events: none;
transform-origin: center -16px;
&:before {
content: "";
pointer-events: none;
display: block;
position: absolute;
top: -28px;
left: 12px;
border-top: solid 14px transparent;
border-right: solid 14px transparent;
border-bottom: solid 14px rgba(0,0,0,0.1);
border-left: solid 14px transparent;
}
&:after {
content: "";
pointer-events: none;
display: block;
position: absolute;
top: -27px;
left: 12px;
border-top: solid 14px transparent;
border-right: solid 14px transparent;
border-bottom: solid 14px var(--panel);
border-left: solid 14px transparent;
}
}
</style>

View File

@ -21,13 +21,11 @@
<script lang="ts">
import Vue from 'vue';
import i18n from '../i18n';
import { apiUrl } from '../config';
//import getMD5 from '../../scripts/get-md5';
import { faSpinner } from '@fortawesome/free-solid-svg-icons';
export default Vue.extend({
i18n,
data() {
return {
uploads: [],

View File

@ -6,12 +6,9 @@
<script lang="ts">
import Vue from 'vue';
import i18n from '../i18n';
import MkUrlPreview from './url-preview.vue';
export default Vue.extend({
i18n,
components: {
MkUrlPreview
},

View File

@ -32,12 +32,9 @@
<script lang="ts">
import Vue from 'vue';
import { faPlayCircle } from '@fortawesome/free-regular-svg-icons';
import i18n from '../i18n';
import { url as local, lang } from '../config';
export default Vue.extend({
i18n,
props: {
url: {
type: String,

View File

@ -93,13 +93,13 @@ export default Vue.extend({
}
},
onMouseover() {
if (isDeviceTouch()) return;
if (isDeviceTouch) return;
clearTimeout(this.showTimer);
clearTimeout(this.hideTimer);
this.showTimer = setTimeout(this.showPreview, 500);
},
onMouseleave() {
if (isDeviceTouch()) return;
if (isDeviceTouch) return;
clearTimeout(this.showTimer);
clearTimeout(this.hideTimer);
this.hideTimer = setTimeout(this.closePreview, 500);

View File

@ -22,7 +22,7 @@
</div>
<mk-follow-button class="koudoku-button" v-if="$store.getters.isSignedIn && user.id != $store.state.i.id" :user="user" mini/>
</div>
<button class="more" :class="{ fetching: moreFetching }" v-if="more" @click="fetchMore()" :disabled="moreFetching">
<button class="more" ref="loadMore" :class="{ fetching: moreFetching }" v-show="more" :disabled="moreFetching">
<template v-if="moreFetching"><fa icon="spinner" pulse fixed-width/></template>{{ moreFetching ? $t('loading') : $t('loadMore') }}
</button>
</div>
@ -31,14 +31,11 @@
<script lang="ts">
import Vue from 'vue';
import i18n from '../i18n';
import paging from '../scripts/paging';
import MkContainer from './ui/container.vue';
import MkFollowButton from './follow-button.vue';
export default Vue.extend({
i18n,
components: {
MkContainer,
MkFollowButton,

View File

@ -6,15 +6,12 @@
import Vue from 'vue';
import { faAt, faListUl, faEye, faEyeSlash, faBan, faPencilAlt, faComments, faUsers, faMicrophoneSlash } from '@fortawesome/free-solid-svg-icons';
import { faSnowflake, faEnvelope } from '@fortawesome/free-regular-svg-icons';
import i18n from '../i18n';
import XMenu from './menu.vue';
import copyToClipboard from '../scripts/copy-to-clipboard';
import { host } from '../config';
import getAcct from '../../misc/acct/render';
export default Vue.extend({
i18n,
components: {
XMenu
},

View File

@ -28,13 +28,10 @@
<script lang="ts">
import Vue from 'vue';
import i18n from '../i18n';
import parseAcct from '../../misc/acct/parse';
import MkFollowButton from './follow-button.vue';
export default Vue.extend({
i18n,
components: {
MkFollowButton
},

View File

@ -21,14 +21,11 @@
<script lang="ts">
import Vue from 'vue';
import i18n from '../i18n';
import { faTimes, faCheck } from '@fortawesome/free-solid-svg-icons';
import MkInput from './ui/input.vue';
import XWindow from './window.vue';
export default Vue.extend({
i18n,
components: {
MkInput,
XWindow,

View File

@ -15,8 +15,7 @@
</div>
</router-link>
</div>
<button class="more _button" v-if="more" @click="fetchMore" :disabled="moreFetching">
<button class="more _button" ref="loadMore" v-show="more" @click="fetchMore" :disabled="moreFetching">
<template v-if="!moreFetching">{{ $t('loadMore') }}</template>
<template v-if="moreFetching"><fa :icon="faSpinner" pulse fixed-width/></template>
</button>
@ -31,13 +30,10 @@
<script lang="ts">
import Vue from 'vue';
import { faTimes } from '@fortawesome/free-solid-svg-icons';
import i18n from '../i18n';
import paging from '../scripts/paging';
import XModal from './modal.vue';
export default Vue.extend({
i18n,
components: {
XModal,
},

View File

@ -1,5 +1,5 @@
<template>
<x-popup :source="source" ref="popup" @closed="() => { $emit('closed'); destroyDom(); }">
<x-popup :source="source" ref="popup" @closed="closed">
<div class="gqyayizv">
<button class="_button" @click="choose('public')" :class="{ active: v == 'public' }" data-index="1" key="public">
<div><fa :icon="faGlobe"/></div>
@ -22,26 +22,33 @@
<span>{{ $t('_visibility.followersDescription') }}</span>
</div>
</button>
<button class="_button" @click="choose('specified')" :class="{ active: v == 'specified' }" data-index="4" key="specified">
<button :disabled="localOnly" class="_button" @click="choose('specified')" :class="{ active: v == 'specified' }" data-index="4" key="specified">
<div><fa :icon="faEnvelope"/></div>
<div>
<span>{{ $t('_visibility.specified') }}</span>
<span>{{ $t('_visibility.specifiedDescription') }}</span>
</div>
</button>
<div class="divider"></div>
<button class="_button localOnly" @click="localOnly = !localOnly" :class="{ active: localOnly }" data-index="5" key="localOnly">
<div><fa :icon="faBiohazard"/></div>
<div>
<span>{{ $t('_visibility.localOnly') }}</span>
<span>{{ $t('_visibility.localOnlyDescription') }}</span>
</div>
<div><fa :icon="localOnly ? faToggleOn : faToggleOff"/></div>
</button>
</div>
</x-popup>
</template>
<script lang="ts">
import Vue from 'vue';
import { faGlobe, faUnlock, faHome } from '@fortawesome/free-solid-svg-icons';
import { faGlobe, faUnlock, faHome, faBiohazard, faToggleOn, faToggleOff } from '@fortawesome/free-solid-svg-icons';
import { faEnvelope } from '@fortawesome/free-regular-svg-icons';
import i18n from '../i18n';
import XPopup from './popup.vue';
export default Vue.extend({
i18n,
components: {
XPopup
},
@ -52,12 +59,17 @@ export default Vue.extend({
currentVisibility: {
type: String,
required: false
},
currentLocalOnly: {
type: Boolean,
required: false
}
},
data() {
return {
v: this.$store.state.settings.rememberNoteVisibility ? this.$store.state.deviceUser.visibility : (this.currentVisibility || this.$store.state.settings.defaultNoteVisibility),
faGlobe, faUnlock, faEnvelope, faHome
localOnly: this.currentLocalOnly,
faGlobe, faUnlock, faEnvelope, faHome, faBiohazard, faToggleOn, faToggleOff
}
},
methods: {
@ -65,9 +77,15 @@ export default Vue.extend({
if (this.$store.state.settings.rememberNoteVisibility) {
this.$store.commit('deviceUser/setVisibility', visibility);
}
this.$emit('chosen', visibility);
this.$emit('chosen', { visibility, localOnly: this.localOnly });
this.destroyDom();
},
closed() {
this.$emit('closed');
// localOnly フラグの更新の為に chosen イベントも呼ぶ
this.choose(this.v);
this.destroyDom();
}
}
});
</script>
@ -77,6 +95,11 @@ export default Vue.extend({
width: 240px;
padding: 8px 0;
> .divider {
margin: 8px 0;
border-top: solid 1px var(--divider);
}
> button {
display: flex;
padding: 8px 14px;
@ -98,7 +121,12 @@ export default Vue.extend({
background: var(--accent);
}
> *:first-child {
&.localOnly.active {
color: var(--accent);
background: inherit;
}
> *:nth-child(1) {
display: flex;
justify-content: center;
align-items: center;
@ -110,8 +138,11 @@ export default Vue.extend({
margin-bottom: auto;
}
> *:last-child {
> *:nth-child(2) {
flex: 1 1 auto;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
> span:first-child {
display: block;
@ -122,6 +153,18 @@ export default Vue.extend({
opacity: 0.6;
}
}
> *:nth-child(3) {
display: flex;
justify-content: center;
align-items: center;
margin-left: 10px;
width: 16px;
top: 0;
bottom: 0;
margin-top: auto;
margin-bottom: auto;
}
}
}
</style>

View File

@ -20,12 +20,9 @@
<script lang="ts">
import Vue from 'vue';
import { faTimes, faCheck } from '@fortawesome/free-solid-svg-icons';
import i18n from '../i18n';
import XModal from './modal.vue';
export default Vue.extend({
i18n,
components: {
XModal,
},

View File

@ -1,3 +1,5 @@
import { clientDb, entries } from './db';
declare const _LANGS_: string[];
declare const _VERSION_: string;
declare const _ENV_: string;
@ -12,7 +14,7 @@ export const apiUrl = url + '/api';
export const wsUrl = url.replace('http://', 'ws://').replace('https://', 'wss://') + '/streaming';
export const lang = localStorage.getItem('lang');
export const langs = _LANGS_;
export const locale = JSON.parse(localStorage.getItem('locale'));
export const getLocale = async () => Object.fromEntries((await entries(clientDb.i18n)) as [string, string][]);
export const version = _VERSION_;
export const env = _ENV_;
export const instanceName = siteName === 'Misskey' ? null : siteName;

68
src/client/db.ts Normal file
View File

@ -0,0 +1,68 @@
import { Store } from 'idb-keyval';
// Provide functions from idb-keyval
export { get, set, del, clear, keys } from 'idb-keyval';
//#region Construct DB
export const clientDb = {
i18n: new Store('MisskeyClient', 'i18n')
};
//#endregion
//#region Provide some tool functions
function openTransaction(store: Store, mode: IDBTransactionMode): Promise<IDBTransaction>{
return store._dbp.then(db => db.transaction(store.storeName, mode));
}
export function entries(store: Store): Promise<[IDBValidKey, unknown][]> {
const entries: [IDBValidKey, unknown][] = [];
return store._withIDBStore('readonly', store => {
store.openCursor().onsuccess = function () {
if (!this.result) return;
entries.push([this.result.key, this.result.value]);
this.result.continue();
};
}).then(() => entries);
}
export async function bulkGet(keys: IDBValidKey[], store: Store): Promise<[IDBValidKey, unknown][]> {
const valPromises: Promise<[IDBValidKey, unknown]>[] = [];
const tx = await openTransaction(store, 'readwrite');
const st = tx.objectStore(store.storeName);
for (const key of keys) {
valPromises.push(new Promise((resolve, reject) => {
const getting = st.get(key);
getting.onsuccess = function (e) {
return resolve([key, this.result]);
};
getting.onerror = function (e) {
return reject(this.error);
};
}));
}
return new Promise((resolve, reject) => {
tx.oncomplete = () => resolve(Promise.all(valPromises));
tx.abort = tx.onerror = () => reject(tx.error);
});
}
export async function bulkSet(map: [IDBValidKey, any][], store: Store): Promise<void> {
const tx = await openTransaction(store, 'readwrite');
const st = tx.objectStore(store.storeName);
for (const [key, value] of map) {
st.put(value, key);
}
return new Promise((resolve, reject) => {
tx.oncomplete = () => resolve();
tx.abort = tx.onerror = () => reject(tx.error);
});
}
export function count(store: Store): Promise<number> {
let req: IDBRequest<number>;
return store._withIDBStore('readonly', store => {
req = store.count();
}).then(() => req.result);
}
//#endregion

View File

@ -4,9 +4,11 @@ import userPreview from './user-preview';
import autocomplete from './autocomplete';
import size from './size';
import particle from './particle';
import tooltip from './tooltip';
Vue.directive('autocomplete', autocomplete);
Vue.directive('userPreview', userPreview);
Vue.directive('user-preview', userPreview);
Vue.directive('size', size);
Vue.directive('particle', particle);
Vue.directive('tooltip', tooltip);

View File

@ -0,0 +1,62 @@
import MkTooltip from '../components/ui/tooltip.vue';
import { isDeviceTouch } from '../scripts/is-device-touch';
const start = isDeviceTouch ? 'touchstart' : 'mouseover';
const end = isDeviceTouch ? 'touchend' : 'mouseleave';
export default {
bind(el: HTMLElement, binding, vn) {
const self = (el as any)._tooltipDirective_ = {} as any;
self.text = binding.value as string;
self.tag = null;
self.showTimer = null;
self.hideTimer = null;
self.checkTimer = null;
self.close = () => {
if (self.tag) {
clearInterval(self.checkTimer);
self.tag.close();
self.tag = null;
}
};
const show = e => {
if (!document.body.contains(el)) return;
if (self.tag) return;
self.tag = new MkTooltip({
parent: vn.context,
propsData: {
text: self.text,
source: el
}
}).$mount();
document.body.appendChild(self.tag.$el);
};
el.addEventListener(start, () => {
clearTimeout(self.showTimer);
clearTimeout(self.hideTimer);
self.showTimer = setTimeout(show, 300);
});
el.addEventListener(end, () => {
clearTimeout(self.showTimer);
clearTimeout(self.hideTimer);
self.hideTimer = setTimeout(self.close, 300);
});
el.addEventListener('click', () => {
clearTimeout(self.showTimer);
self.close();
});
},
unbind(el, binding, vn) {
const self = el._tooltipDirective_;
clearInterval(self.checkTimer);
},
};

View File

@ -1,12 +0,0 @@
import Vue from 'vue';
import VueI18n from 'vue-i18n';
import { lang, locale } from './config';
Vue.use(VueI18n);
export default new VueI18n({
locale: lang,
messages: {
[lang]: locale
}
});

View File

@ -7,13 +7,13 @@ import Vuex from 'vuex';
import VueMeta from 'vue-meta';
import PortalVue from 'portal-vue';
import VAnimateCss from 'v-animate-css';
import VueI18n from 'vue-i18n';
import { FontAwesomeIcon } from '@fortawesome/vue-fontawesome';
import i18n from './i18n';
import VueHotkey from './scripts/hotkey';
import App from './app.vue';
import MiOS from './mios';
import { version, langs, instanceName } from './config';
import { version, langs, instanceName, getLocale } from './config';
import PostFormDialog from './components/post-form-dialog.vue';
import Dialog from './components/dialog.vue';
import Menu from './components/menu.vue';
@ -21,12 +21,15 @@ import { router } from './router';
import { applyTheme, lightTheme } from './theme';
import { isDeviceDarkmode } from './scripts/is-device-darkmode';
import createStore from './store';
import { clientDb, get, count } from './db';
import { setI18nContexts } from './scripts/set-i18n-contexts';
Vue.use(Vuex);
Vue.use(VueHotkey);
Vue.use(VueMeta);
Vue.use(PortalVue);
Vue.use(VAnimateCss);
Vue.use(VueI18n);
Vue.component('fa', FontAwesomeIcon);
require('./directives');
@ -56,8 +59,6 @@ if (localStorage.getItem('kyoppie') === 'yuppie') {
location.reload(true);
}
window.history.scrollRestoration = 'manual';
if (localStorage.getItem('theme') == null) {
applyTheme(lightTheme);
}
@ -96,27 +97,6 @@ if (isMobile || window.innerWidth <= 1024) {
head.appendChild(viewport);
}
//#region Fetch locale data
const cachedLocale = localStorage.getItem('locale');
if (cachedLocale == null) {
fetch(`/assets/locales/${lang}.${version}.json`)
.then(response => response.json()).then(locale => {
localStorage.setItem('locale', JSON.stringify(locale));
i18n.locale = lang;
i18n.setLocaleMessage(lang, locale);
});
} else {
// TODO: 古い時だけ更新
setTimeout(() => {
fetch(`/assets/locales/${lang}.${version}.json`)
.then(response => response.json()).then(locale => {
localStorage.setItem('locale', JSON.stringify(locale));
});
}, 1000 * 5);
}
//#endregion
//#region Set lang attr
const html = document.documentElement;
html.setAttribute('lang', lang);
@ -167,6 +147,18 @@ os.init(async () => {
});
//#endregion
//#region Fetch locale data
const i18n = new VueI18n();
await count(clientDb.i18n).then(async n => {
if (n === 0) return setI18nContexts(lang, version, i18n);
if ((await get('_version_', clientDb.i18n) !== version)) return setI18nContexts(lang, version, i18n, true);
i18n.locale = lang;
i18n.setLocaleMessage(lang, await getLocale());
});
//#endregion
if ('Notification' in window && store.getters.isSignedIn) {
// 許可を得ていなかったらリクエスト
if (Notification.permission === 'default') {
@ -176,6 +168,7 @@ os.init(async () => {
const app = new Vue({
store: store,
i18n,
metaInfo: {
title: null,
titleTemplate: title => title ? `${title} | ${(instanceName || 'Misskey')}` : (instanceName || 'Misskey')
@ -183,7 +176,8 @@ os.init(async () => {
data() {
return {
stream: os.stream,
isMobile: isMobile
isMobile: isMobile,
i18n // TODO: 消せないか考える SEE: https://github.com/syuilo/misskey/pull/6396#discussion_r429511030
};
},
methods: {

View File

@ -63,12 +63,9 @@
import Vue from 'vue';
import { faInfoCircle } from '@fortawesome/free-solid-svg-icons';
import { version } from '../config';
import i18n from '../i18n';
import MkLink from '../components/link.vue';
export default Vue.extend({
i18n,
components: {
MkLink
},

View File

@ -25,12 +25,9 @@
import Vue from 'vue';
import { faInfoCircle } from '@fortawesome/free-solid-svg-icons';
import { version } from '../config';
import i18n from '../i18n';
import MkInstanceStats from '../components/instance-stats.vue';
export default Vue.extend({
i18n,
metaInfo() {
return {
title: this.$t('instance') as string

View File

@ -21,13 +21,10 @@
<script lang="ts">
import Vue from 'vue';
import { faCheck, faBroadcastTower } from '@fortawesome/free-solid-svg-icons';
import i18n from '../i18n';
import MkPagination from '../components/ui/pagination.vue';
import MkButton from '../components/ui/button.vue';
export default Vue.extend({
i18n,
metaInfo() {
return {
title: this.$t('announcements') as string

View File

@ -23,11 +23,9 @@
<script lang="ts">
import Vue from 'vue';
import i18n from '../i18n';
import MkButton from '../components/ui/button.vue';
export default Vue.extend({
i18n,
components: {
MkButton
},

View File

@ -30,12 +30,10 @@
<script lang="ts">
import Vue from 'vue';
import i18n from '../i18n';
import XForm from './auth.form.vue';
import MkSignin from '../components/signin.vue';
export default Vue.extend({
i18n,
components: {
XForm,
MkSignin,

View File

@ -19,7 +19,6 @@ import Vue from 'vue';
import { faFileAlt } from '@fortawesome/free-solid-svg-icons'
import MarkdownIt from 'markdown-it';
import MarkdownItAnchor from 'markdown-it-anchor';
import i18n from '../i18n';
import { url, lang } from '../config';
import MkLink from '../components/link.vue';
@ -32,8 +31,6 @@ markdown.use(MarkdownItAnchor, {
});
export default Vue.extend({
i18n,
metaInfo() {
return {
title: this.title,

View File

@ -57,13 +57,10 @@
import Vue from 'vue';
import { faChartLine, faPlus, faHashtag, faRocket } from '@fortawesome/free-solid-svg-icons';
import { faBookmark, faCommentAlt } from '@fortawesome/free-regular-svg-icons';
import i18n from '../i18n';
import XUserList from '../components/user-list.vue';
import MkContainer from '../components/ui/container.vue';
export default Vue.extend({
i18n,
metaInfo() {
return {
title: this.$t('explore') as string

View File

@ -5,11 +5,8 @@
<script lang="ts">
import Vue from 'vue';
import i18n from '../i18n';
export default Vue.extend({
i18n,
created() {
const acct = new URL(location.href).searchParams.get('acct');
if (acct == null) return;

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