Compare commits
227 Commits
Author | SHA1 | Date | |
---|---|---|---|
![]() |
4b48ba4e8c | ||
![]() |
bf7bacceab | ||
![]() |
a56f461895 | ||
![]() |
e21ff916b0 | ||
![]() |
da20675ada | ||
![]() |
7364fb84ef | ||
![]() |
48f46333f8 | ||
![]() |
8407702b38 | ||
![]() |
e1a8b158e0 | ||
![]() |
7e30910ab8 | ||
![]() |
7fbee704ec | ||
![]() |
b1f94c7bc6 | ||
![]() |
90411967d6 | ||
![]() |
5719c623a4 | ||
![]() |
e210ec782a | ||
![]() |
229780f6ff | ||
![]() |
6490a9829b | ||
![]() |
6384d0708d | ||
![]() |
db1fde2956 | ||
![]() |
c86720a331 | ||
![]() |
2af158be26 | ||
![]() |
7115bd46ff | ||
![]() |
f84483896e | ||
![]() |
fe7bc174fb | ||
![]() |
e967d9ded3 | ||
![]() |
c3b55b6849 | ||
![]() |
3e193c9864 | ||
![]() |
d64e25e449 | ||
![]() |
c4707c612d | ||
![]() |
9d3448c880 | ||
![]() |
dad6a77645 | ||
![]() |
f64d3942d7 | ||
![]() |
45fe754759 | ||
![]() |
98f1d93628 | ||
![]() |
8785e1c3a4 | ||
![]() |
f00ceedae4 | ||
![]() |
7387e010c2 | ||
![]() |
a59dfff12f | ||
![]() |
f6128dd3ff | ||
![]() |
eeff88ece2 | ||
![]() |
bae1282f74 | ||
![]() |
d2007add75 | ||
![]() |
802db92d98 | ||
![]() |
a53e1e4ec3 | ||
![]() |
fd1ef4a62d | ||
![]() |
8ab9068d8e | ||
![]() |
47dd30d3b2 | ||
![]() |
fcdd042b02 | ||
![]() |
04855f9201 | ||
![]() |
cf0a5d5735 | ||
![]() |
bb2db1cf76 | ||
![]() |
0e69091455 | ||
![]() |
3cb5ed167a | ||
![]() |
1ffee15b83 | ||
![]() |
75b9f31acf | ||
![]() |
fc56b12690 | ||
![]() |
60e768436e | ||
![]() |
84f2192cde | ||
![]() |
97f2675d40 | ||
![]() |
6d881d4570 | ||
![]() |
42cc93dd0f | ||
![]() |
e9f34a0f09 | ||
![]() |
b9cb6d1c10 | ||
![]() |
7bf517e990 | ||
![]() |
ab54e147f2 | ||
![]() |
e677540fd6 | ||
![]() |
31e3aaeda0 | ||
![]() |
938fc317c9 | ||
![]() |
4c431c5432 | ||
![]() |
881b914c6a | ||
![]() |
df67836c1a | ||
![]() |
6a3a8ba4d0 | ||
![]() |
9e535c341e | ||
![]() |
17fa4ba804 | ||
![]() |
dd9a3c91fc | ||
![]() |
7015df37e3 | ||
![]() |
7ebdd4739a | ||
![]() |
c4bcb31a00 | ||
![]() |
0a18ee24ac | ||
![]() |
37d10b108e | ||
![]() |
b5cadeca2e | ||
![]() |
c8e93054bc | ||
![]() |
def32107af | ||
![]() |
1b84ae9f3f | ||
![]() |
73ce1f61a8 | ||
![]() |
8661cd1ee7 | ||
![]() |
53f55defda | ||
![]() |
d60dc60bc9 | ||
![]() |
bf1d7e6252 | ||
![]() |
c96b2767b9 | ||
![]() |
6c1f03eefd | ||
![]() |
cced83024b | ||
![]() |
1cd6ba3c1d | ||
![]() |
2365761ba5 | ||
![]() |
d3b4b70bfc | ||
![]() |
f95d5701a2 | ||
![]() |
a8c56afd0f | ||
![]() |
4de30aa47e | ||
![]() |
f05f7c920e | ||
![]() |
5f86509abc | ||
![]() |
1561391293 | ||
![]() |
60553a8a5e | ||
![]() |
e656074de4 | ||
![]() |
b81ff340b1 | ||
![]() |
77456ae0bc | ||
![]() |
9fd0e90850 | ||
![]() |
ab01cf1881 | ||
![]() |
0d10ca02db | ||
![]() |
0627df8116 | ||
![]() |
c88ea7150c | ||
![]() |
555954c71e | ||
![]() |
f231f02329 | ||
![]() |
b8af5dfde0 | ||
![]() |
ef3710fdc2 | ||
![]() |
bde114ad13 | ||
![]() |
9d138aa282 | ||
![]() |
42c4ea38cc | ||
![]() |
c0ba71c368 | ||
![]() |
7b2cb30a9d | ||
![]() |
0f55e65701 | ||
![]() |
aeb24b96eb | ||
![]() |
ad4700b3b1 | ||
![]() |
b2e5ade5ac | ||
![]() |
90a7b9b551 | ||
![]() |
31b6ab9b23 | ||
![]() |
4149c7782f | ||
![]() |
227f52d758 | ||
![]() |
baa2a871f1 | ||
![]() |
5bb619fe7b | ||
![]() |
fff3c552e2 | ||
![]() |
e19cc8bebf | ||
![]() |
f4f8debb92 | ||
![]() |
ea6b8b599f | ||
![]() |
c30f02ae4c | ||
![]() |
09450ba544 | ||
![]() |
df53968306 | ||
![]() |
19f753c15c | ||
![]() |
df530bb66d | ||
![]() |
fa49427df0 | ||
![]() |
6678d97cc4 | ||
![]() |
e3642a8d10 | ||
![]() |
f9022fdf16 | ||
![]() |
1c764139bf | ||
![]() |
048ed26f41 | ||
![]() |
c52e30e8e0 | ||
![]() |
0cb04ded36 | ||
![]() |
6cfad65ac7 | ||
![]() |
ed20805b10 | ||
![]() |
576303cd72 | ||
![]() |
0062e084f8 | ||
![]() |
b90d76dcfe | ||
![]() |
c95619b2bf | ||
![]() |
82150bd5b8 | ||
![]() |
9e03335ff8 | ||
![]() |
b3c5c3f0ea | ||
![]() |
65858dab3e | ||
![]() |
c968633d15 | ||
![]() |
39a8942daf | ||
![]() |
7705a7928e | ||
![]() |
d2c14b844e | ||
![]() |
3e45e6c165 | ||
![]() |
fe8334931f | ||
![]() |
f565c5f730 | ||
![]() |
c03e2febb0 | ||
![]() |
c2f4fb7ba7 | ||
![]() |
5f869e5d87 | ||
![]() |
65f1afc4e0 | ||
![]() |
aec2762bf1 | ||
![]() |
a41144a00f | ||
![]() |
aa28e8a7a6 | ||
![]() |
a1a51ce518 | ||
![]() |
90999e0ef9 | ||
![]() |
2ceeb17056 | ||
![]() |
18afdd6040 | ||
![]() |
b9972ec6bd | ||
![]() |
ebb53e87f3 | ||
![]() |
9f9d7325fd | ||
![]() |
742a005523 | ||
![]() |
3a28c06534 | ||
![]() |
46d5711071 | ||
![]() |
48113f3afd | ||
![]() |
be29972ddf | ||
![]() |
49b3a83f76 | ||
![]() |
342794c728 | ||
![]() |
3739638c81 | ||
![]() |
401351d9c8 | ||
![]() |
6073a03967 | ||
![]() |
3e3d294188 | ||
![]() |
f6f96ae5bf | ||
![]() |
62ccb53c24 | ||
![]() |
e410e22980 | ||
![]() |
fc5ceea335 | ||
![]() |
38af8d4737 | ||
![]() |
33b0cab596 | ||
![]() |
2a47e4a1e1 | ||
![]() |
46f53868c5 | ||
![]() |
eac7f11aa7 | ||
![]() |
e219188f46 | ||
![]() |
3df8c701a7 | ||
![]() |
1186813c75 | ||
![]() |
645b6fdc8a | ||
![]() |
ae0596a729 | ||
![]() |
bb5fd3c1f2 | ||
![]() |
532fa9c5f9 | ||
![]() |
80a4aa6fa6 | ||
![]() |
4f218f544f | ||
![]() |
f261f8d7d1 | ||
![]() |
e044d11782 | ||
![]() |
d2da459dd8 | ||
![]() |
b1e6a33d6b | ||
![]() |
0d276d0d61 | ||
![]() |
998936651a | ||
![]() |
1bec25e8e6 | ||
![]() |
f220e4183f | ||
![]() |
e965b57dc2 | ||
![]() |
5e6e1e237a | ||
![]() |
41fe364b49 | ||
![]() |
2953ba17c3 | ||
![]() |
f3b3e06329 | ||
![]() |
98249942d5 | ||
![]() |
0fc8445425 | ||
![]() |
943a1940e2 | ||
![]() |
15d166e30e | ||
![]() |
83619fda98 | ||
![]() |
12913a16fd | ||
![]() |
e23ad7833d | ||
![]() |
38aa760b57 |
13
.babelrc
13
.babelrc
@@ -1,13 +0,0 @@
|
|||||||
{
|
|
||||||
"plugins": [
|
|
||||||
[
|
|
||||||
"@babel/plugin-transform-runtime",
|
|
||||||
{
|
|
||||||
"corejs": {
|
|
||||||
"version": 3,
|
|
||||||
"proposals": true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
]
|
|
||||||
]
|
|
||||||
}
|
|
@@ -157,3 +157,10 @@ id: 'aid'
|
|||||||
|
|
||||||
# Sign to ActivityPub GET request (default: false)
|
# Sign to ActivityPub GET request (default: false)
|
||||||
#signToActivityPubGet: true
|
#signToActivityPubGet: true
|
||||||
|
|
||||||
|
#allowedPrivateNetworks: [
|
||||||
|
# '127.0.0.1/32'
|
||||||
|
#]
|
||||||
|
|
||||||
|
# Upload or download file size limits (bytes)
|
||||||
|
#maxFileSize: 262144000
|
||||||
|
7
.github/ISSUE_TEMPLATE/config.yml
vendored
Normal file
7
.github/ISSUE_TEMPLATE/config.yml
vendored
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
contact_links:
|
||||||
|
- name: 👪 Misskey Forum
|
||||||
|
url: https://forum.misskey.io/
|
||||||
|
about: Ask questions and share knowledge
|
||||||
|
- name: 💬 Misskey official Discord
|
||||||
|
url: https://discord.gg/Wp8gVStHW3
|
||||||
|
about: Chat freely about Misskey
|
31
.github/PULL_REQUEST_TEMPLATE.md
vendored
31
.github/PULL_REQUEST_TEMPLATE.md
vendored
@@ -1,13 +1,20 @@
|
|||||||
## Summary
|
<!-- ℹ お読みください
|
||||||
|
PRありがとうございます! PRを作成する前に、コントリビューションガイドをご確認ください:
|
||||||
|
https://github.com/misskey-dev/misskey/blob/develop/CONTRIBUTING.md
|
||||||
|
-->
|
||||||
|
<!-- ℹ README
|
||||||
|
Thank you for your PR! Before creating a PR, please check the contribution guide:
|
||||||
|
https://github.com/misskey-dev/misskey/blob/develop/docs/CONTRIBUTING.en.md
|
||||||
|
-->
|
||||||
|
|
||||||
<!--
|
# What
|
||||||
-
|
<!-- このPRで何をしたのか? どう変わるのか? -->
|
||||||
- * Please describe your changes here *
|
<!-- What did you do with this PR? How will it change things? -->
|
||||||
-
|
|
||||||
- If you are going to resolve some issue, please add this context.
|
# Why
|
||||||
- Resolve #ISSUE_NUMBER
|
<!-- なぜそうするのか? どういう意図なのか? 何が困っているのか? -->
|
||||||
-
|
<!-- Why do you do it? What are your intentions? What is the problem? -->
|
||||||
- If you are going to fix some bug issue, please add this context.
|
|
||||||
- Fix #ISSUE_NUMBER
|
# Additional info (optional)
|
||||||
-
|
<!-- テスト観点など -->
|
||||||
-->
|
<!-- Test perspective, etc -->
|
||||||
|
11
.github/dependabot.yml
vendored
Normal file
11
.github/dependabot.yml
vendored
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
# To get started with Dependabot version updates, you'll need to specify which
|
||||||
|
# package ecosystems to update and where the package manifests are located.
|
||||||
|
# Please see the documentation for all configuration options:
|
||||||
|
# https://help.github.com/github/administering-a-repository/configuration-options-for-dependency-updates
|
||||||
|
|
||||||
|
version: 2
|
||||||
|
updates:
|
||||||
|
- package-ecosystem: "npm" # See documentation for possible values
|
||||||
|
directory: "/" # Location of package manifests
|
||||||
|
schedule:
|
||||||
|
interval: "daily"
|
6
.github/workflows/nodejs.yml
vendored
6
.github/workflows/nodejs.yml
vendored
@@ -29,12 +29,16 @@ jobs:
|
|||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v2
|
||||||
|
with:
|
||||||
|
submodules: true
|
||||||
- name: Use Node.js ${{ matrix.node-version }}
|
- name: Use Node.js ${{ matrix.node-version }}
|
||||||
uses: actions/setup-node@v1
|
uses: actions/setup-node@v1
|
||||||
with:
|
with:
|
||||||
node-version: ${{ matrix.node-version }}
|
node-version: ${{ matrix.node-version }}
|
||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
run: yarn install
|
run: yarn install
|
||||||
|
- name: Check yarn.lock
|
||||||
|
run: git diff --exit-code yarn.lock
|
||||||
- name: Copy Configure
|
- name: Copy Configure
|
||||||
run: cp .circleci/misskey/*.yml .config
|
run: cp .circleci/misskey/*.yml .config
|
||||||
- name: Build
|
- name: Build
|
||||||
@@ -46,6 +50,8 @@ jobs:
|
|||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v2
|
||||||
|
with:
|
||||||
|
submodules: true
|
||||||
- uses: actions/setup-node@v1
|
- uses: actions/setup-node@v1
|
||||||
with:
|
with:
|
||||||
node-version: 12.x
|
node-version: 12.x
|
||||||
|
3
.gitmodules
vendored
Normal file
3
.gitmodules
vendored
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
[submodule "misskey-assets"]
|
||||||
|
path = misskey-assets
|
||||||
|
url = https://github.com/misskey-dev/assets.git
|
@@ -1 +1 @@
|
|||||||
v16.2.0
|
v16.6.2
|
||||||
|
107
CHANGELOG.md
107
CHANGELOG.md
@@ -1 +1,106 @@
|
|||||||
see [releases](https://github.com/misskey-dev/misskey/releases)
|
<!--
|
||||||
|
## 12.x.x (unreleased)
|
||||||
|
|
||||||
|
### Improvements
|
||||||
|
|
||||||
|
### Bugfixes
|
||||||
|
|
||||||
|
-->
|
||||||
|
|
||||||
|
## 12.90.0 (2021/09/04)
|
||||||
|
|
||||||
|
### Improvements
|
||||||
|
- 藍モード、および藍ウィジェット
|
||||||
|
- クライアントに藍ちゃんを召喚することができるようになりました。
|
||||||
|
- URLからのアップロード, APの添付ファイル, 外部ファイルのプロキシ等では、Privateアドレス等へのリクエストは拒否されるようになりました。
|
||||||
|
- developmentで動作している場合は、この制限は適用されません。
|
||||||
|
- Proxy使用時には、この制限は適用されません。
|
||||||
|
Proxy使用時に同等の制限を行いたい場合は、Proxy側で設定を行う必要があります。
|
||||||
|
- `default.yml`にて`allowedPrivateNetworks`にCIDRを追加することにより、宛先ネットワークを指定してこの制限から除外することが出来ます。
|
||||||
|
- アップロード, ダウンロード出来るファイルサイズにハードリミットが適用されるようになりました。(約250MB)
|
||||||
|
- `default.yml`にて`maxFileSize`を変更することにより、制限値を変更することが出来ます。
|
||||||
|
|
||||||
|
### Bugfixes
|
||||||
|
- 管理者が最初にサインアップするページでログインされないのを修正
|
||||||
|
- CWを維持する設定を復活
|
||||||
|
- クライアントの表示を修正
|
||||||
|
|
||||||
|
## 12.89.2 (2021/08/24)
|
||||||
|
|
||||||
|
### Bugfixes
|
||||||
|
- カスタムCSSを有効にしているとエラーになる問題を修正
|
||||||
|
|
||||||
|
## 12.89.1 (2021/08/24)
|
||||||
|
|
||||||
|
### Improvements
|
||||||
|
- クライアントのデザインの調整
|
||||||
|
|
||||||
|
### Bugfixes
|
||||||
|
- 翻訳でDeepLのProアカウントに対応していない問題を修正
|
||||||
|
- インスタンス設定でDeepLのAuth Keyが空で表示される問題を修正
|
||||||
|
- セキュリティの向上
|
||||||
|
|
||||||
|
## 12.89.0 (2021/08/21)
|
||||||
|
|
||||||
|
### Improvements
|
||||||
|
- アカウント削除の安定性を向上
|
||||||
|
- 絵文字オートコンプリートの挙動を改修
|
||||||
|
- localStorageのaccountsはindexedDBで保持するように
|
||||||
|
- ActivityPub: ジョブキューの試行タイミングを調整 (#7635)
|
||||||
|
- API: sw/unregisterを追加
|
||||||
|
- ワードミュートのドキュメントを追加
|
||||||
|
- クライアントのデザインの調整
|
||||||
|
- 依存関係の更新
|
||||||
|
|
||||||
|
### Bugfixes
|
||||||
|
- チャンネルを作成しているとアカウントを削除できないのを修正
|
||||||
|
- ノートの「削除して編集」をするとアンケートの選択肢が[object Object]になる問題を修正
|
||||||
|
|
||||||
|
## 12.88.0 (2021/08/17)
|
||||||
|
|
||||||
|
### Features
|
||||||
|
- ノートの翻訳機能を追加
|
||||||
|
- 有効にするには、サーバー管理者がDeepLの無料アカウントを登録し、取得した認証キーを「インスタンス設定 > その他 > DeepL Auth Key」に設定する必要があります。
|
||||||
|
- Misskey更新時にダイアログを表示するように
|
||||||
|
- ジョブキューウィジェットに警報音を鳴らす設定を追加
|
||||||
|
|
||||||
|
### Improvements
|
||||||
|
- ブロックの挙動を改修
|
||||||
|
- ブロックされたユーザーがブロックしたユーザーに対してアクション出来ないようになりました。詳細はドキュメントをご確認ください。
|
||||||
|
- UIデザインの調整
|
||||||
|
- データベースのインデックスを最適化
|
||||||
|
- Proxy使用時にKeep-Aliveをサポート
|
||||||
|
- DNSキャッシュでネガティブキャッシュをサポート
|
||||||
|
- 依存関係の更新
|
||||||
|
|
||||||
|
### Bugfixes
|
||||||
|
- タッチ操作でウィンドウを閉じることができない問題を修正
|
||||||
|
- Renoteされた時刻が投稿された時刻のように表示される問題を修正
|
||||||
|
- コントロールパネルでファイルを削除した際の表示を修正
|
||||||
|
- ActivityPub: 長いユーザーの名前や自己紹介の対応
|
||||||
|
|
||||||
|
## 12.87.0 (2021/08/12)
|
||||||
|
|
||||||
|
### Improvements
|
||||||
|
- 絵文字オートコンプリートで一文字目は最近使った絵文字をサジェストするように
|
||||||
|
- 絵文字オートコンプリートのパフォーマンスを改善
|
||||||
|
- about-misskeyページにドキュメントへのリンクを追加
|
||||||
|
- Docker: Node.jsを16.6.2に
|
||||||
|
- 依存関係の更新
|
||||||
|
- 翻訳の更新
|
||||||
|
|
||||||
|
### Bugfixes
|
||||||
|
- Misskey更新時、テーマキャッシュの影響でスタイルがおかしくなる問題を修正
|
||||||
|
|
||||||
|
## 12.86.0 (2021/08/11)
|
||||||
|
|
||||||
|
### Improvements
|
||||||
|
- ドキュメントの更新
|
||||||
|
- ドキュメントにchangelogを追加
|
||||||
|
- ぼかし効果のオプションを追加
|
||||||
|
- Vueを3.2.1に更新
|
||||||
|
- UIの調整
|
||||||
|
|
||||||
|
### Bugfixes
|
||||||
|
- ハッシュタグ入力が空のときに#が付くのを修正
|
||||||
|
- フォローリクエストのEメール通知を修正
|
||||||
|
175
CONTRIBUTING.md
175
CONTRIBUTING.md
@@ -1,22 +1,41 @@
|
|||||||
# Contribution guide
|
# Contribution guide
|
||||||
:v: Thanks for your contributions :v:
|
**[✨ English version available](/docs/CONTRIBUTING.en.md)**
|
||||||
|
|
||||||
## When you contribute...
|
プロジェクトに興味を持っていただきありがとうございます! このドキュメントでは、プロジェクトに貢献する際に必要な情報をまとめています。
|
||||||
- 任意のIssueについて、せっかく実装してくださっても、実装方法や設計の認識が揃ってないとマージできない/しないことになりかねないので、初めにそのIssue上で着手することを宣言し、必要に応じて他メンバーと実装方法や設計のすり合わせを行ってください。宣言することは作業が他の人と被るのを防止する効果もあります。
|
|
||||||
- 設計に迷った時はプロジェクトリーダーの判断を仰いでください。
|
|
||||||
- 時間や優先度の都合上、提出してくださったPRが長期間放置されることもありますがご理解ください。
|
|
||||||
- 温度感高めで見てほしいものは責付いてください。
|
|
||||||
|
|
||||||
## Issues
|
## Issues
|
||||||
Feature suggestions and bug reports are filed in https://github.com/misskey-dev/misskey/issues .
|
Issueを作成する前に、以下をご確認ください:
|
||||||
|
- 重複を防ぐため、既に同様の内容のIssueが作成されていないか検索してから新しいIssueを作ってください。
|
||||||
|
- Issueを質問に使わないでください。
|
||||||
|
- Issueは、要望、提案、問題の報告にのみ使用してください。
|
||||||
|
- 質問は、[Misskey Forum](https://forum.misskey.io/)や[Discord](https://discord.gg/Wp8gVStHW3)でお願いします。
|
||||||
|
|
||||||
* Please search existing issues to avoid duplication. If your issue is already filed, please add your reaction or comment to the existing one.
|
## 実装をする前に
|
||||||
* If you have multiple independent issues, please submit them separately.
|
機能追加やバグ修正をしたいときは、まずIssueで設計、方針をレビューしてもらいましょう(無い場合は作ってください)。このステップがないと、せっかく実装してもPRがマージされない可能性が高くなります。
|
||||||
|
|
||||||
## Branches
|
また、実装に取り掛かるときは当該Issueに自分をアサインしてください(自分でできない場合は他メンバーに自分をアサインしてもらうようお願いしてください)。
|
||||||
* **master** branch is tracking the latest release and used for production purposes.
|
自分が実装するという意思表示をすることで、作業がバッティングするのを防ぎます。
|
||||||
* **develop** branch is where we work for the next release.
|
|
||||||
* **l10n_develop** branch is reserved for localization management.
|
## PRの作成
|
||||||
|
PRありがとうございます! PRを作成する前に、以下をご確認ください:
|
||||||
|
- 可能であればタイトルに、以下で示すようなPRの種類が分かるキーワードをプリフィクスしてください。
|
||||||
|
- `fix` / `refactor` / `feat` / `enhance` / `perf` / `chore` など
|
||||||
|
- また、PRの粒度が適切であることを確認してください。ひとつのPRに複数の種類の変更や関心を含めることは避けてください。
|
||||||
|
- このPRによって解決されるIssueがある場合は、そのIssueへの参照を本文内に含めてください。
|
||||||
|
- [`CHANGELOG.md`](/CHANGELOG.md)に変更点を追記してください。リファクタリングなど、利用者に影響を与えない変更についてはこの限りではありません。
|
||||||
|
- この変更により新たに作成、もしくは更新すべきドキュメントがないか確認してください。
|
||||||
|
- 機能追加やバグ修正をした場合は、可能であればテストケースを追加してください。
|
||||||
|
- テスト、Lintが通っていることを予め確認してください。
|
||||||
|
- `npm run test`、`npm run lint`でぞれぞれ実施可能です。[詳細](#testing)
|
||||||
|
- UIに変更がある場合はスクリーンショットを本文内に添付してください。
|
||||||
|
|
||||||
|
ご協力ありがとうございます🤗
|
||||||
|
|
||||||
|
## ブランチ
|
||||||
|
- **`master`** branch is tracking the latest release and used for production purposes.
|
||||||
|
- **`develop`** branch is where we work for the next release.
|
||||||
|
- PRを作成するときは、基本的にこのブランチに向けてください。
|
||||||
|
- **`l10n_develop`** branch is reserved for localization management.
|
||||||
|
|
||||||
## Localization (l10n)
|
## Localization (l10n)
|
||||||
Misskey uses [Crowdin](https://crowdin.com/project/misskey) for localization management.
|
Misskey uses [Crowdin](https://crowdin.com/project/misskey) for localization management.
|
||||||
@@ -32,8 +51,21 @@ If your language is not listed in Crowdin, please open an issue.
|
|||||||
* Documents for instance admins are located in [`/docs`](/docs).
|
* Documents for instance admins are located in [`/docs`](/docs).
|
||||||
* Documents for end users are located in [`/src/docs`](/src/docs).
|
* Documents for end users are located in [`/src/docs`](/src/docs).
|
||||||
|
|
||||||
## Test
|
## Testing
|
||||||
* Test codes are located in [`/test`](/test).
|
- Test codes are located in [`/test`](/test).
|
||||||
|
|
||||||
|
### Run test
|
||||||
|
```
|
||||||
|
npm run test
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Run specify test
|
||||||
|
```
|
||||||
|
npx cross-env TS_NODE_FILES=true TS_NODE_TRANSPILE_ONLY=true TS_NODE_PROJECT="./test/tsconfig.json" npx mocha test/foo.ts --require ts-node/register
|
||||||
|
```
|
||||||
|
|
||||||
|
### e2e tests
|
||||||
|
TODO
|
||||||
|
|
||||||
## Continuous integration
|
## Continuous integration
|
||||||
Misskey uses GitHub Actions for executing automated tests.
|
Misskey uses GitHub Actions for executing automated tests.
|
||||||
@@ -50,116 +82,11 @@ Configuration files are located in [`/.github/workflows`](/.github/workflows).
|
|||||||
If you have no experience on 3D modeling, we suggest to use the free 3DCG software [Blender](https://www.blender.org/).
|
If you have no experience on 3D modeling, we suggest to use the free 3DCG software [Blender](https://www.blender.org/).
|
||||||
You can find information on glTF 2.0 at [glTF 2.0 — Blender Manual]( https://docs.blender.org/manual/en/dev/addons/io_scene_gltf2.html).
|
You can find information on glTF 2.0 at [glTF 2.0 — Blender Manual]( https://docs.blender.org/manual/en/dev/addons/io_scene_gltf2.html).
|
||||||
|
|
||||||
## FAQ
|
## Notes
|
||||||
### How to resolve conflictions occurred at yarn.lock?
|
### How to resolve conflictions occurred at yarn.lock?
|
||||||
|
|
||||||
Just execute `yarn` to fix it.
|
Just execute `yarn` to fix it.
|
||||||
|
|
||||||
## Glossary
|
|
||||||
### AP
|
|
||||||
Stands for _**A**ctivity**P**ub_.
|
|
||||||
|
|
||||||
### MFM
|
|
||||||
Stands for _**M**isskey **F**lavored **M**arkdown_.
|
|
||||||
|
|
||||||
### Mk
|
|
||||||
Stands for _**M**iss**k**ey_.
|
|
||||||
|
|
||||||
### SW
|
|
||||||
Stands for _**S**ervice**W**orker_.
|
|
||||||
|
|
||||||
### Nyaize
|
|
||||||
Convert な(na) to にゃ(nya)
|
|
||||||
|
|
||||||
#### Denyaize
|
|
||||||
Revert Nyaize
|
|
||||||
|
|
||||||
## TypeScript Coding Style
|
|
||||||
### Do not omit semicolons
|
|
||||||
This is to avoid Automatic Semicolon Insertion (ASI) hazard.
|
|
||||||
|
|
||||||
Ref:
|
|
||||||
* https://www.ecma-international.org/ecma-262/#sec-automatic-semicolon-insertion
|
|
||||||
* https://github.com/tc39/ecma262/pull/1062
|
|
||||||
|
|
||||||
### Do not omit curly brackets
|
|
||||||
Bad:
|
|
||||||
``` ts
|
|
||||||
if (foo)
|
|
||||||
bar;
|
|
||||||
else
|
|
||||||
baz;
|
|
||||||
```
|
|
||||||
|
|
||||||
Good:
|
|
||||||
``` ts
|
|
||||||
if (foo) {
|
|
||||||
bar;
|
|
||||||
} else {
|
|
||||||
baz;
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
As a special case, you can omit the curly brackets if
|
|
||||||
|
|
||||||
* the body of the `if`-statement have only one statement and,
|
|
||||||
* the `if`-statement does not have `else`-clause.
|
|
||||||
|
|
||||||
Good:
|
|
||||||
``` ts
|
|
||||||
if (foo) bar;
|
|
||||||
```
|
|
||||||
|
|
||||||
Make sure that the condition and the body statement are on the same line.
|
|
||||||
|
|
||||||
### Do not use `==` when it can simply be replaced with `===`.
|
|
||||||
🥰
|
|
||||||
|
|
||||||
### Use only boolean (or null related) values in the condition of an `if`-statement.
|
|
||||||
Bad:
|
|
||||||
``` ts
|
|
||||||
if (foo.length)
|
|
||||||
```
|
|
||||||
|
|
||||||
Good:
|
|
||||||
``` ts
|
|
||||||
if (foo.length > 0)
|
|
||||||
```
|
|
||||||
|
|
||||||
### Do not use `export default`
|
|
||||||
This is because the current language support does not work well with `export default`.
|
|
||||||
|
|
||||||
Ref:
|
|
||||||
* https://basarat.gitbooks.io/typescript/docs/tips/defaultIsBad.html
|
|
||||||
* https://gfx.hatenablog.com/entry/2017/11/24/135343
|
|
||||||
|
|
||||||
Bad:
|
|
||||||
``` ts
|
|
||||||
export default function(foo: string): string {
|
|
||||||
```
|
|
||||||
|
|
||||||
Good:
|
|
||||||
``` ts
|
|
||||||
export function something(foo: string): string {
|
|
||||||
```
|
|
||||||
|
|
||||||
## Directory structure
|
|
||||||
```
|
|
||||||
src ... Source code
|
|
||||||
@types ... Type definitions
|
|
||||||
prelude ... Independence utils for coding JavaScript without side effects
|
|
||||||
misc ... Independence utils for Misskey without side effects
|
|
||||||
service ... Common functions with side effects
|
|
||||||
queue ... Job queues and Jobs
|
|
||||||
server ... Web Server
|
|
||||||
client ... Client
|
|
||||||
mfm ... MFM
|
|
||||||
|
|
||||||
test ... Test code
|
|
||||||
|
|
||||||
```
|
|
||||||
|
|
||||||
## Notes
|
|
||||||
### placeholder
|
### placeholder
|
||||||
SQLをクエリビルダで組み立てる際、使用するプレースホルダは重複してはならない
|
SQLをクエリビルダで組み立てる際、使用するプレースホルダは重複してはならない
|
||||||
例えば
|
例えば
|
||||||
@@ -242,6 +169,12 @@ npx ts-node ./node_modules/typeorm/cli.js migration:generate -n 変更の名前
|
|||||||
|
|
||||||
作成されたスクリプトは不必要な変更を含むため除去してください。
|
作成されたスクリプトは不必要な変更を含むため除去してください。
|
||||||
|
|
||||||
|
### コネクションには`markRaw`せよ
|
||||||
|
**Vueのコンポーネントのdataオプションとして**misskey.jsのコネクションを設定するとき、必ず`markRaw`でラップしてください。インスタンスが不必要にリアクティブ化されることで、misskey.js内の処理で不具合が発生するとともに、パフォーマンス上の問題にも繋がる。なお、Composition APIを使う場合はこの限りではない(リアクティブ化はマニュアルなため)。
|
||||||
|
|
||||||
|
### JSONのimportに気を付けよう
|
||||||
|
TypeScriptでjsonをimportすると、tscでコンパイルするときにそのjsonファイルも一緒にdistディレクトリに吐き出されてしまう。この挙動により、意図せずファイルの書き換えが発生することがあるので、jsonをimportするときは書き換えられても良いものかどうか確認すること。書き換えされて欲しくない場合は、importで読み込むのではなく、`fs.readFileSync`などの関数を使って読み込むようにすればよい。
|
||||||
|
|
||||||
## その他
|
## その他
|
||||||
### HTMLのクラス名で follow という単語は使わない
|
### HTMLのクラス名で follow という単語は使わない
|
||||||
広告ブロッカーで誤ってブロックされる
|
広告ブロッカーで誤ってブロックされる
|
||||||
|
10
Dockerfile
10
Dockerfile
@@ -1,4 +1,4 @@
|
|||||||
FROM node:16.2.0-alpine3.13 AS base
|
FROM node:16.6.2-alpine3.13 AS base
|
||||||
|
|
||||||
ENV NODE_ENV=production
|
ENV NODE_ENV=production
|
||||||
|
|
||||||
@@ -18,10 +18,9 @@ RUN apk add --no-cache \
|
|||||||
nasm \
|
nasm \
|
||||||
pkgconfig \
|
pkgconfig \
|
||||||
python3 \
|
python3 \
|
||||||
zlib-dev \
|
zlib-dev
|
||||||
vips-dev \
|
|
||||||
vips
|
|
||||||
|
|
||||||
|
RUN git submodule update --init
|
||||||
COPY package.json yarn.lock .yarnrc ./
|
COPY package.json yarn.lock .yarnrc ./
|
||||||
RUN yarn install
|
RUN yarn install
|
||||||
COPY . ./
|
COPY . ./
|
||||||
@@ -31,8 +30,7 @@ FROM base AS runner
|
|||||||
|
|
||||||
RUN apk add --no-cache \
|
RUN apk add --no-cache \
|
||||||
ffmpeg \
|
ffmpeg \
|
||||||
tini \
|
tini
|
||||||
vips
|
|
||||||
|
|
||||||
ENTRYPOINT ["/sbin/tini", "--"]
|
ENTRYPOINT ["/sbin/tini", "--"]
|
||||||
|
|
||||||
|
BIN
assets/client/sounds/syuilo/queue-jammed.mp3
Normal file
BIN
assets/client/sounds/syuilo/queue-jammed.mp3
Normal file
Binary file not shown.
@@ -2,6 +2,6 @@ files:
|
|||||||
- source: /locales/ja-JP.yml
|
- source: /locales/ja-JP.yml
|
||||||
translation: /locales/%locale%.yml
|
translation: /locales/%locale%.yml
|
||||||
update_option: update_as_unapproved
|
update_option: update_as_unapproved
|
||||||
- source: /src/docs/ja-JP/*.md
|
- source: /src/docs/ja-JP/**/*.md
|
||||||
translation: /src/docs/%locale%/%original_file_name%
|
translation: /src/docs/%locale%/**/%original_file_name%
|
||||||
update_option: update_as_unapproved
|
update_option: update_as_unapproved
|
||||||
|
3
cypress.json
Normal file
3
cypress.json
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
{
|
||||||
|
"baseUrl": "http://localhost"
|
||||||
|
}
|
5
cypress/fixtures/example.json
Normal file
5
cypress/fixtures/example.json
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
{
|
||||||
|
"name": "Using fixtures to represent data",
|
||||||
|
"email": "hello@cypress.io",
|
||||||
|
"body": "Fixtures are a great way to mock data for responses to routes"
|
||||||
|
}
|
69
cypress/integration/basic.js
Normal file
69
cypress/integration/basic.js
Normal file
@@ -0,0 +1,69 @@
|
|||||||
|
describe('Basic', () => {
|
||||||
|
before(() => {
|
||||||
|
cy.request('POST', '/api/reset-db');
|
||||||
|
});
|
||||||
|
|
||||||
|
beforeEach(() => {
|
||||||
|
cy.reload(true);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('successfully loads', () => {
|
||||||
|
cy.visit('/');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('setup instance', () => {
|
||||||
|
cy.visit('/');
|
||||||
|
|
||||||
|
cy.get('[data-cy-admin-username] input').type('admin');
|
||||||
|
|
||||||
|
cy.get('[data-cy-admin-password] input').type('admin1234');
|
||||||
|
|
||||||
|
cy.get('[data-cy-admin-ok]').click();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('signup', () => {
|
||||||
|
cy.visit('/');
|
||||||
|
|
||||||
|
cy.get('[data-cy-signup]').click();
|
||||||
|
|
||||||
|
cy.get('[data-cy-signup-username] input').type('alice');
|
||||||
|
|
||||||
|
cy.get('[data-cy-signup-password] input').type('alice1234');
|
||||||
|
|
||||||
|
cy.get('[data-cy-signup-password-retype] input').type('alice1234');
|
||||||
|
|
||||||
|
cy.get('[data-cy-signup-submit]').click();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('signin', () => {
|
||||||
|
cy.visit('/');
|
||||||
|
|
||||||
|
cy.get('[data-cy-signin]').click();
|
||||||
|
|
||||||
|
cy.get('[data-cy-signin-username] input').type('alice');
|
||||||
|
|
||||||
|
// Enterキーでサインインできるかの確認も兼ねる
|
||||||
|
cy.get('[data-cy-signin-password] input').type('alice1234{enter}');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('note', () => {
|
||||||
|
cy.visit('/');
|
||||||
|
|
||||||
|
//#region TODO: この辺はUI操作ではなくAPI操作でログインする
|
||||||
|
cy.get('[data-cy-signin]').click();
|
||||||
|
|
||||||
|
cy.get('[data-cy-signin-username] input').type('alice');
|
||||||
|
|
||||||
|
// Enterキーでサインインできるかの確認も兼ねる
|
||||||
|
cy.get('[data-cy-signin-password] input').type('alice1234{enter}');
|
||||||
|
//#endregion
|
||||||
|
|
||||||
|
cy.get('[data-cy-open-post-form]').click();
|
||||||
|
|
||||||
|
cy.get('[data-cy-post-form-text]').type('Hello, Misskey!');
|
||||||
|
|
||||||
|
cy.get('[data-cy-open-post-form-submit]').click();
|
||||||
|
|
||||||
|
// TODO: 投稿した文字列が画面内にあるか(=タイムラインに流れてきたか)のテスト
|
||||||
|
});
|
||||||
|
});
|
22
cypress/plugins/index.js
Normal file
22
cypress/plugins/index.js
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
/// <reference types="cypress" />
|
||||||
|
// ***********************************************************
|
||||||
|
// This example plugins/index.js can be used to load plugins
|
||||||
|
//
|
||||||
|
// You can change the location of this file or turn off loading
|
||||||
|
// the plugins file with the 'pluginsFile' configuration option.
|
||||||
|
//
|
||||||
|
// You can read more here:
|
||||||
|
// https://on.cypress.io/plugins-guide
|
||||||
|
// ***********************************************************
|
||||||
|
|
||||||
|
// This function is called when a project is opened or re-opened (e.g. due to
|
||||||
|
// the project's config changing)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @type {Cypress.PluginConfig}
|
||||||
|
*/
|
||||||
|
// eslint-disable-next-line no-unused-vars
|
||||||
|
module.exports = (on, config) => {
|
||||||
|
// `on` is used to hook into various events Cypress emits
|
||||||
|
// `config` is the resolved Cypress config
|
||||||
|
}
|
25
cypress/support/commands.js
Normal file
25
cypress/support/commands.js
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
// ***********************************************
|
||||||
|
// This example commands.js shows you how to
|
||||||
|
// create various custom commands and overwrite
|
||||||
|
// existing commands.
|
||||||
|
//
|
||||||
|
// For more comprehensive examples of custom
|
||||||
|
// commands please read more here:
|
||||||
|
// https://on.cypress.io/custom-commands
|
||||||
|
// ***********************************************
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// -- This is a parent command --
|
||||||
|
// Cypress.Commands.add('login', (email, password) => { ... })
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// -- This is a child command --
|
||||||
|
// Cypress.Commands.add('drag', { prevSubject: 'element'}, (subject, options) => { ... })
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// -- This is a dual command --
|
||||||
|
// Cypress.Commands.add('dismiss', { prevSubject: 'optional'}, (subject, options) => { ... })
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// -- This will overwrite an existing command --
|
||||||
|
// Cypress.Commands.overwrite('visit', (originalFn, url, options) => { ... })
|
20
cypress/support/index.js
Normal file
20
cypress/support/index.js
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
// ***********************************************************
|
||||||
|
// This example support/index.js is processed and
|
||||||
|
// loaded automatically before your test files.
|
||||||
|
//
|
||||||
|
// This is a great place to put global configuration and
|
||||||
|
// behavior that modifies Cypress.
|
||||||
|
//
|
||||||
|
// You can change the location of this file or turn off
|
||||||
|
// automatically serving support files with the
|
||||||
|
// 'supportFile' configuration option.
|
||||||
|
//
|
||||||
|
// You can read more here:
|
||||||
|
// https://on.cypress.io/configuration
|
||||||
|
// ***********************************************************
|
||||||
|
|
||||||
|
// Import commands.js using ES2015 syntax:
|
||||||
|
import './commands'
|
||||||
|
|
||||||
|
// Alternatively you can use CommonJS syntax:
|
||||||
|
// require('./commands')
|
66
docs/CONTRIBUTING.en.md
Normal file
66
docs/CONTRIBUTING.en.md
Normal file
@@ -0,0 +1,66 @@
|
|||||||
|
# Contribution guide
|
||||||
|
:v: Thanks for your contributions :v:
|
||||||
|
|
||||||
|
**ℹ️ Important:** This project uses Japanese as its major language, **but you do not need to translate and write the Issues/PRs in Japanese.**
|
||||||
|
Also, you might receive comments on your Issue/PR in Japanese, but you do not need to reply to them in Japanese as well.\
|
||||||
|
The accuracy of translation into Japanese is not high, so it will be easier for us to understand if you write it in the original language.
|
||||||
|
It will also allow the reader to use the translation tool of their preference if necessary.
|
||||||
|
|
||||||
|
## Issues
|
||||||
|
Before creating an issue, please check the following:
|
||||||
|
- To avoid duplication, please search for similar issues before creating a new issue.
|
||||||
|
- Do not use Issues as a question.
|
||||||
|
- Issues should only be used to feature requests, suggestions, and report problems.
|
||||||
|
- Please ask questions in the [Misskey Forum](https://forum.misskey.io/) or [Discord](https://discord.gg/Wp8gVStHW3).
|
||||||
|
|
||||||
|
## Before implementation
|
||||||
|
When you want to add a feature or fix a bug, first have the design and policy reviewed in an Issue (if it is not there, please make one). Without this step, there is a high possibility that the PR will not be merged even if it is implemented.
|
||||||
|
|
||||||
|
Also, when you start implementation, assign yourself to the Issue (if you cannot do it yourself, ask another member to assign you). By expressing your intention to work the Issue, you can prevent conflicts in the work.
|
||||||
|
|
||||||
|
## Well-known branches
|
||||||
|
- **`master`** branch is tracking the latest release and used for production purposes.
|
||||||
|
- **`develop`** branch is where we work for the next release.
|
||||||
|
- When you create a PR, basically target it to this branch.
|
||||||
|
- **`l10n_develop`** branch is reserved for localization management.
|
||||||
|
|
||||||
|
## Creating a PR
|
||||||
|
Thank you for your PR! Before creating a PR, please check the following:
|
||||||
|
- If possible, prefix the title with a keyword that identifies the type of this PR, as shown below.
|
||||||
|
- `fix` / `refactor` / `feat` / `enhance` / `perf` / `chore` etc
|
||||||
|
- Also, make sure that the granularity of this PR is appropriate. Please do not include more than one type of change or interest in a single PR.
|
||||||
|
- If there is an Issue which will be resolved by this PR, please include a reference to the Issue in the text.
|
||||||
|
- Please add the summary of the changes to [`CHANGELOG.md`](/CHANGELOG.md). However, this is not necessary for changes that do not affect the users, such as refactoring.
|
||||||
|
- Check if there are any documents that need to be created or updated due to this change.
|
||||||
|
- If you have added a feature or fixed a bug, please add a test case if possible.
|
||||||
|
- Please make sure that tests and Lint are passed in advance.
|
||||||
|
- You can run it with `npm run test` and `npm run lint`. [See more info](#testing)
|
||||||
|
- If this PR includes UI changes, please attach a screenshot in the text.
|
||||||
|
|
||||||
|
Thanks for your cooperation 🤗
|
||||||
|
|
||||||
|
## Localization (l10n)
|
||||||
|
Misskey uses [Crowdin](https://crowdin.com/project/misskey) for localization management.
|
||||||
|
You can improve our translations with your Crowdin account.
|
||||||
|
Your changes in Crowdin are automatically submitted as a PR (with the title "New Crowdin translations") to the repository.
|
||||||
|
The owner [@syuilo](https://github.com/syuilo) merges the PR into the develop branch before the next release.
|
||||||
|
|
||||||
|
If your language is not listed in Crowdin, please open an issue.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
## Testing
|
||||||
|
- Test codes are located in [`/test`](/test).
|
||||||
|
|
||||||
|
### Run test
|
||||||
|
```
|
||||||
|
npm run test
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Run specify test
|
||||||
|
```
|
||||||
|
npx cross-env TS_NODE_FILES=true TS_NODE_TRANSPILE_ONLY=true TS_NODE_PROJECT="./test/tsconfig.json" npx mocha test/foo.ts --require ts-node/register
|
||||||
|
```
|
||||||
|
|
||||||
|
### e2e tests
|
||||||
|
TODO
|
@@ -83,10 +83,11 @@ Just `docker-compose up -d`. GLHF!
|
|||||||
1. `git stash`
|
1. `git stash`
|
||||||
2. `git checkout master`
|
2. `git checkout master`
|
||||||
3. `git pull`
|
3. `git pull`
|
||||||
4. `git stash pop`
|
4. `git submodule update --init`
|
||||||
5. `docker-compose build`
|
5. `git stash pop`
|
||||||
6. Check [ChangeLog](../CHANGELOG.md) for migration information
|
6. `docker-compose build`
|
||||||
7. `docker-compose stop && docker-compose up -d`
|
7. Check [ChangeLog](../CHANGELOG.md) for migration information
|
||||||
|
8. `docker-compose stop && docker-compose up -d`
|
||||||
|
|
||||||
### How to execute [cli commands](manage.en.md):
|
### How to execute [cli commands](manage.en.md):
|
||||||
`docker-compose run --rm web node built/tools/mark-admin @example`
|
`docker-compose run --rm web node built/tools/mark-admin @example`
|
||||||
|
@@ -50,10 +50,11 @@ Utilisez la commande `docker-compose up -d`. GLHF!
|
|||||||
1. `git stash`
|
1. `git stash`
|
||||||
2. `git checkout master`
|
2. `git checkout master`
|
||||||
3. `git pull`
|
3. `git pull`
|
||||||
4. `git stash pop`
|
4. `git submodule update --init`
|
||||||
5. `docker-compose build`
|
5. `git stash pop`
|
||||||
6. Consultez le [ChangeLog](../CHANGELOG.md) pour avoir les éventuelles informations de migration
|
6. `docker-compose build`
|
||||||
7. `docker-compose stop && docker-compose up -d`
|
7. Consultez le [ChangeLog](../CHANGELOG.md) pour avoir les éventuelles informations de migration
|
||||||
|
8. `docker-compose stop && docker-compose up -d`
|
||||||
|
|
||||||
### Comment exécuter des [commandes](manage.fr.md)
|
### Comment exécuter des [commandes](manage.fr.md)
|
||||||
`docker-compose run --rm web node built/tools/mark-admin @example`
|
`docker-compose run --rm web node built/tools/mark-admin @example`
|
||||||
|
@@ -83,10 +83,11 @@ docker-compose run --rm web yarn run init
|
|||||||
1. `git stash`
|
1. `git stash`
|
||||||
2. `git checkout master`
|
2. `git checkout master`
|
||||||
3. `git pull`
|
3. `git pull`
|
||||||
4. `git stash pop`
|
4. `git submodule update --init`
|
||||||
5. `docker-compose build`
|
5. `git stash pop`
|
||||||
6. [ChangeLog](../CHANGELOG.md)でマイグレーション情報を確認する
|
6. `docker-compose build`
|
||||||
7. `docker-compose stop && docker-compose up -d`
|
7. [ChangeLog](../CHANGELOG.md)でマイグレーション情報を確認する
|
||||||
|
8. `docker-compose stop && docker-compose up -d`
|
||||||
|
|
||||||
### cliコマンドを実行する方法:
|
### cliコマンドを実行する方法:
|
||||||
|
|
||||||
|
@@ -83,10 +83,11 @@ docker-compose run --rm web yarn run init
|
|||||||
1. `git stash`
|
1. `git stash`
|
||||||
2. `git checkout master`
|
2. `git checkout master`
|
||||||
3. `git pull`
|
3. `git pull`
|
||||||
4. `git stash pop`
|
4. `git submodule update --init`
|
||||||
5. `docker-compose build`
|
5. `git stash pop`
|
||||||
6. 检查 [更新日志](../CHANGELOG.md) 以获取升级迁移信息。
|
6. `docker-compose build`
|
||||||
7. `docker-compose stop && docker-compose up -d`
|
7. 检查 [更新日志](../CHANGELOG.md) 以获取升级迁移信息。
|
||||||
|
8. `docker-compose stop && docker-compose up -d`
|
||||||
|
|
||||||
### 如何执行 [控制台指令](manage.zh.md):
|
### 如何执行 [控制台指令](manage.zh.md):
|
||||||
`docker-compose run --rm web node built/tools/mark-admin @example`
|
`docker-compose run --rm web node built/tools/mark-admin @example`
|
||||||
|
@@ -24,7 +24,7 @@ Please install and setup these softwares:
|
|||||||
|
|
||||||
#### Dependencies :package:
|
#### Dependencies :package:
|
||||||
* **[Node.js](https://nodejs.org/en/)** (12.x, 14.x)
|
* **[Node.js](https://nodejs.org/en/)** (12.x, 14.x)
|
||||||
* **[PostgreSQL](https://www.postgresql.org/)** (>= 10)
|
* **[PostgreSQL](https://www.postgresql.org/)** (12.x / 13.x is preferred)
|
||||||
* **[Redis](https://redis.io/)**
|
* **[Redis](https://redis.io/)**
|
||||||
|
|
||||||
##### Optional
|
##### Optional
|
||||||
@@ -131,11 +131,12 @@ You can check if the service is running with `systemctl status misskey`.
|
|||||||
### How to update your Misskey server to the latest version
|
### How to update your Misskey server to the latest version
|
||||||
1. `git checkout master`
|
1. `git checkout master`
|
||||||
2. `git pull`
|
2. `git pull`
|
||||||
3. `yarn install`
|
3. `git submodule update --init`
|
||||||
4. `NODE_ENV=production yarn build`
|
4. `yarn install`
|
||||||
5. `yarn migrate`
|
5. `NODE_ENV=production yarn build`
|
||||||
6. Restart your Misskey process to apply changes
|
6. `yarn migrate`
|
||||||
7. Enjoy
|
7. Restart your Misskey process to apply changes
|
||||||
|
8. Enjoy
|
||||||
|
|
||||||
If you encounter any problems with updating, please try the following:
|
If you encounter any problems with updating, please try the following:
|
||||||
1. `yarn clean` or `yarn cleanall`
|
1. `yarn clean` or `yarn cleanall`
|
||||||
|
@@ -126,9 +126,10 @@ Vous pouvez vérifier si le service a démarré en utilisant la commande `system
|
|||||||
### Méthode de mise à jour vers la plus récente version de Misskey
|
### Méthode de mise à jour vers la plus récente version de Misskey
|
||||||
1. `git checkout master`
|
1. `git checkout master`
|
||||||
2. `git pull`
|
2. `git pull`
|
||||||
3. `yarn install`
|
3. `git submodule update --init`
|
||||||
4. `NODE_ENV=production yarn build`
|
4. `yarn install`
|
||||||
5. `yarn migrate`
|
5. `NODE_ENV=production yarn build`
|
||||||
|
6. `yarn migrate`
|
||||||
|
|
||||||
----------------------------------------------------------------
|
----------------------------------------------------------------
|
||||||
|
|
||||||
|
@@ -133,9 +133,10 @@ yarn run init
|
|||||||
### Misskeyを最新バージョンにアップデートする方法:
|
### Misskeyを最新バージョンにアップデートする方法:
|
||||||
1. `git checkout master`
|
1. `git checkout master`
|
||||||
2. `git pull`
|
2. `git pull`
|
||||||
3. `yarn install`
|
3. `git submodule update --init`
|
||||||
4. `NODE_ENV=production yarn build`
|
4. `yarn install`
|
||||||
5. `yarn migrate`
|
5. `NODE_ENV=production yarn build`
|
||||||
|
6. `yarn migrate`
|
||||||
|
|
||||||
なにか問題が発生した場合は、`yarn clean`または`yarn cleanall`すると直る場合があります。
|
なにか問題が発生した場合は、`yarn clean`または`yarn cleanall`すると直る場合があります。
|
||||||
|
|
||||||
|
@@ -131,11 +131,12 @@ yarn run init
|
|||||||
### 如何将您的 Misskey 服务器升级至最新版本
|
### 如何将您的 Misskey 服务器升级至最新版本
|
||||||
1. `git checkout master`
|
1. `git checkout master`
|
||||||
2. `git pull`
|
2. `git pull`
|
||||||
3. `yarn install`
|
3. `git submodule update --init`
|
||||||
4. `NODE_ENV=production yarn build`
|
4. `yarn install`
|
||||||
5. `yarn migrate`
|
5. `NODE_ENV=production yarn build`
|
||||||
6. 重启您的 Misskey 进程来应用改变。
|
6. `yarn migrate`
|
||||||
7. 尽情享受吧!
|
7. 重启您的 Misskey 进程来应用改变。
|
||||||
|
8. 尽情享受吧!
|
||||||
|
|
||||||
如果您在更新时遇到任何问题,请尝试以下操作:
|
如果您在更新时遇到任何问题,请尝试以下操作:
|
||||||
1. `yarn clean` 或是 `yarn cleanall`
|
1. `yarn clean` 或是 `yarn cleanall`
|
||||||
|
10
index.js
10
index.js
@@ -1,3 +1,13 @@
|
|||||||
|
/*
|
||||||
|
import * as fs from 'fs';
|
||||||
|
|
||||||
|
if (fs.existsSync('./built')) {
|
||||||
|
import('./built/index.js').then(built => built());
|
||||||
|
} else {
|
||||||
|
console.log('Built code is not found. Probably an error occurred during a build or you just forgot to build.');
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
const fs = require('fs');
|
const fs = require('fs');
|
||||||
|
|
||||||
if (fs.existsSync('./built')) {
|
if (fs.existsSync('./built')) {
|
||||||
|
@@ -427,9 +427,13 @@ inUse: "مستخدم"
|
|||||||
info: "عن"
|
info: "عن"
|
||||||
user: "المستخدمون"
|
user: "المستخدمون"
|
||||||
administration: "إدارة "
|
administration: "إدارة "
|
||||||
|
postToGallery: "انشر في المعرض"
|
||||||
|
gallery: "المعرض"
|
||||||
expiration: "ينتهي استطلاع الرأي في"
|
expiration: "ينتهي استطلاع الرأي في"
|
||||||
middle: "متوسط"
|
middle: "متوسط"
|
||||||
global: "الشامل"
|
global: "الشامل"
|
||||||
|
_docs:
|
||||||
|
admin: "إدارة "
|
||||||
_email:
|
_email:
|
||||||
_follow:
|
_follow:
|
||||||
title: "يتابعك"
|
title: "يتابعك"
|
||||||
|
@@ -111,6 +111,7 @@ editWidgets: "Upravit widget"
|
|||||||
editWidgetsExit: "Hotovo"
|
editWidgetsExit: "Hotovo"
|
||||||
customEmojis: "Vlastní emoji"
|
customEmojis: "Vlastní emoji"
|
||||||
emoji: "Emoji"
|
emoji: "Emoji"
|
||||||
|
emojis: "Emoji"
|
||||||
emojiName: "Jméno emoji"
|
emojiName: "Jméno emoji"
|
||||||
emojiUrl: "URL obrázku"
|
emojiUrl: "URL obrázku"
|
||||||
addEmoji: "Přidat emoji"
|
addEmoji: "Přidat emoji"
|
||||||
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -1,97 +1,106 @@
|
|||||||
---
|
---
|
||||||
_lang_: "Esperanto"
|
_lang_: "Esperanto"
|
||||||
headlineMisskey: "Reto ligiĝas per notoj"
|
headlineMisskey: "Reto ligata per notoj"
|
||||||
introMisskey: "Bonvenon! Miskejo estas malferma kodaの分散型マイクロブログサービスです。\nBonvolu Krei「noto」、いま起こっていることを共有したり、あなたについて皆に発信しよう📡\n「 reaktigoj 」機能で、皆のnotojに素早く反応を追加することもできます👍\n新しい世界を探検しよう🚀"
|
introMisskey: "Bonvenon! Misskey estas malfermitkoda malcentraliza mikrobloga servo.\nKreu \"noto\"n por diskonigu ke nun okazas, aŭ por dissendu pri vi. 📡\nPer la funkcio \"reago\", vi ankaŭ povas rapide esprimi vian senton pri ĉies noto. 👍\nEsploru novan mondon. 🚀"
|
||||||
monthAndDay: "{day}-a/{month}"
|
monthAndDay: "{day}a/{month}"
|
||||||
search: "Serĉi"
|
search: "Serĉi"
|
||||||
notifications: "Sciigoj"
|
notifications: "Sciigoj"
|
||||||
username: "Uzantonomo"
|
username: "Uzantnomo"
|
||||||
password: "Pasvorto"
|
password: "Pasvorto"
|
||||||
forgotPassword: "Ĉu vi forgesis pasvorton?"
|
forgotPassword: "Ĉu vi forgesis pasvorton?"
|
||||||
fetchingAsApObject: "Informpetado de fediverso..."
|
fetchingAsApObject: "Informpetado de Fediverso..."
|
||||||
ok: "Okej"
|
ok: "Akcepteble"
|
||||||
gotIt: "Mi konprenas!"
|
gotIt: "Mi komprenas"
|
||||||
cancel: "Nuligi"
|
cancel: "Nuligi"
|
||||||
enterUsername: "Entajpu uzantonomon"
|
enterUsername: "Entajpu uzantnomon"
|
||||||
renotedBy: "Renotigojn faras {user}"
|
renotedBy: "Renoto farita de {user}"
|
||||||
noNotes: "Neniu noto!"
|
noNotes: "Neniu noto!"
|
||||||
noNotifications: "Vi ne havas sciigojn."
|
noNotifications: "Vi ne havas sciigojn."
|
||||||
instance: "Ekzemplo"
|
instance: "Nodo"
|
||||||
settings: "Agordoj"
|
settings: "Agordoj"
|
||||||
basicSettings: "Ĝeneralaj agordoj"
|
basicSettings: "Ĝeneralaj agordoj"
|
||||||
otherSettings: "Aliaj agordoj"
|
otherSettings: "Aliaj agordoj"
|
||||||
openInWindow: "Malfermi en nova fenestro"
|
openInWindow: "Malfermi en nova fenestro"
|
||||||
profile: "Profilo"
|
profile: "Profilo"
|
||||||
timeline: "Tempolinio"
|
timeline: "Templinio"
|
||||||
|
noAccountDescription: "Tiu uzanto ne skribis biografieton"
|
||||||
login: "Ensaluti"
|
login: "Ensaluti"
|
||||||
loggingIn: "Ensalutado..."
|
loggingIn: "Ensalutado..."
|
||||||
logout: "Elsaluti"
|
logout: "Elsaluti"
|
||||||
signup: "Krei konton"
|
signup: "Krei konton"
|
||||||
uploading: "Alŝutado..."
|
uploading: "Alŝutado..."
|
||||||
save: "Konservi"
|
save: "Konservi"
|
||||||
users: "Uzanto"
|
users: "Uzantoj"
|
||||||
addUser: "Aldoni uzanton"
|
addUser: "Aldoni uzanton"
|
||||||
favorite: "Preferi"
|
favorite: "Preferi"
|
||||||
favorites: "Preferataj"
|
favorites: "Preferataĵoj"
|
||||||
unfavorite: "Malpreferi"
|
unfavorite: "Malpreferi"
|
||||||
favorited: "Aldonita al preferatoj"
|
favorited: "Aldonita al preferataĵoj"
|
||||||
alreadyFavorited: "Jame aldonita al preferatoj"
|
cantFavorite: "Ne aldonita al preferataĵoj"
|
||||||
cantFavorite: "Ne aldonita al preferatoj"
|
pin: "Alpingli al la profilo"
|
||||||
pin: "Alpingli sur la profilo"
|
|
||||||
unpin: "Depingli"
|
unpin: "Depingli"
|
||||||
copyContent: "Kopii enhavon"
|
copyContent: "Kopii enhavon"
|
||||||
copyLink: "Kopii ligilon"
|
copyLink: "Kopii ligilon"
|
||||||
delete: "Forviŝi"
|
delete: "Forviŝi"
|
||||||
deleteAndEdit: "Forviŝi kaj redakti"
|
deleteAndEdit: "Forviŝi kaj redakti"
|
||||||
deleteAndEditConfirm: "Ĉu vi certas, ke vi volas forviŝi la noton? La reaktigoj, renotigoj, kaj respondoj ankaŭ forigiĝos."
|
deleteAndEditConfirm: "Ĉu vi certas, ke vi volas forigi kaj redakti la noton? Ankaŭ ĉiuj reagoj, renotoj, kaj respondoj al ĝi foriĝos."
|
||||||
addToList: "Aldoni al listo"
|
addToList: "Aldoni al listo"
|
||||||
sendMessage: "Sendi mesaĝon"
|
sendMessage: "Sendi mesaĝon"
|
||||||
copyUsername: "Kopii uzantonomon"
|
copyUsername: "Kopii uzantnomon"
|
||||||
searchUser: "Serĉi uzanton"
|
searchUser: "Serĉi uzanton"
|
||||||
reply: "Respondi"
|
reply: "Respondi"
|
||||||
loadMore: "Vidu plu"
|
loadMore: "Vidu pli"
|
||||||
showMore: "Vidi plu"
|
showMore: "Vidi pli"
|
||||||
youGotNewFollower: "Vi estas eksekvita."
|
youGotNewFollower: "sksekvis vin"
|
||||||
|
receiveFollowRequest: "Peto de sekvado estas ricevita"
|
||||||
|
followRequestAccepted: "La peto de sekvado akceptita"
|
||||||
mention: "Mencioj"
|
mention: "Mencioj"
|
||||||
mentions: "Mencioj"
|
mentions: "Al vi"
|
||||||
directNotes: "Senperaj notoj"
|
directNotes: "Notoj rektaj"
|
||||||
importAndExport: "Importaĵo / Eksportaĵo"
|
importAndExport: "Importi/eksporti"
|
||||||
import: "Importi"
|
import: "Importi"
|
||||||
export: "Eksporti"
|
export: "Eksporti"
|
||||||
files: "Dosieroj"
|
files: "Dosieroj"
|
||||||
download: "Elŝuti"
|
download: "Elŝuti"
|
||||||
driveFileDeleteConfirm: "Ĉu vi certas ke vi volas forviŝi la dosieron \"{name}\"? La notoj kun la aldonaĵo ankaŭ forviŝiĝos."
|
driveFileDeleteConfirm: "Ĉu vi certas, ke vi volas forviŝi la dosieron \"{name}\"? Ankaŭ notoj kiuj enhavas ĝin forviŝiĝos."
|
||||||
unfollowConfirm: "Ĉu vi certas, ke vi volas ne plu sekvi {name}?"
|
unfollowConfirm: "Ĉu vi certas, ke vi volas ne plu sekvi {name}'(o)n?"
|
||||||
lists: "Listoj"
|
lists: "Listoj"
|
||||||
noLists: "Neniu listo"
|
noLists: "Neniu listo"
|
||||||
note: "Elsendi noto"
|
note: "Elsendi noto"
|
||||||
notes: "Notoj"
|
notes: "Notoj"
|
||||||
following: "Sekvi"
|
following: "Sekvatoj"
|
||||||
followers: "Sekvantoj"
|
followers: "Sekvantoj"
|
||||||
followsYou: "Sekvas vin"
|
followsYou: "Sekvas vin"
|
||||||
createList: "Kreii liston"
|
createList: "Kreii liston"
|
||||||
|
manageLists: "Administri liston"
|
||||||
error: "Eraro"
|
error: "Eraro"
|
||||||
somethingHappened: "Problemo okazis."
|
somethingHappened: "Problemo okazis."
|
||||||
retry: "Reprovi"
|
retry: "Reprovi"
|
||||||
enterListName: "Entajpu nomon de la listo"
|
enterListName: "Entajpu nomon de la listo"
|
||||||
privacy: "Privateco"
|
privacy: "Privateco"
|
||||||
follow: "Sekvi"
|
follow: "Sekvi"
|
||||||
followRequest: "Peti eksekvi"
|
followRequest: "Peti de sekvado"
|
||||||
followRequests: "Eksekvopetoj"
|
followRequests: "Petoj de sekvado"
|
||||||
unfollow: "Ne plu sekvi"
|
unfollow: "Malsekvi"
|
||||||
renote: "Renotici"
|
enterEmoji: "Entajpu emoĵion"
|
||||||
unrenote: "Forigi renotici"
|
renote: "Fari renoton"
|
||||||
cantRenote: "Tiu noto estas renototebla."
|
unrenote: "Malfari renoton"
|
||||||
cantReRenote: "Renotigo ne estas renotigebla."
|
renoted: "Renoto fariĝis."
|
||||||
|
cantRenote: "Tiu noto ne estas resendebla."
|
||||||
|
cantReRenote: "Renotoj ne estas renotebla."
|
||||||
quote: "Citi"
|
quote: "Citi"
|
||||||
pinnedNote: "Pinglita noto"
|
pinnedNote: "Alpinglita noto"
|
||||||
pinned: "Alpingli sur la profilo"
|
pinned: "Alpingli al la profilo"
|
||||||
you: "Vi"
|
you: "Vi"
|
||||||
clickToShow: "Klaku por malkaŝu"
|
clickToShow: "Klaku por malkaŝu"
|
||||||
sensitive: "Enhavo ne estas deca por laborejo (NSFW)"
|
sensitive: "Enhavo ne estas deca por laborejo (NSFW)"
|
||||||
add: "Aldoni"
|
add: "Aldoni"
|
||||||
reaction: "Reagoj"
|
reaction: "Reagoj"
|
||||||
enterFileName: "Entajpu dosiernomon"
|
rememberNoteVisibility: "Rememori la videblecon de la noto laste sendita"
|
||||||
|
attachCancel: "Deigi aldonaĵon"
|
||||||
|
markAsSensitive: "Troviĝi NSFW"
|
||||||
|
unmarkAsSensitive: "Ne troviĝi NSFW"
|
||||||
|
enterFileName: "Entajpu nomon de dosiero"
|
||||||
mute: "Silentigi"
|
mute: "Silentigi"
|
||||||
unmute: "Malsilentigi"
|
unmute: "Malsilentigi"
|
||||||
block: "Bloki"
|
block: "Bloki"
|
||||||
@@ -103,205 +112,608 @@ unblockConfirm: "Ĉu vi certas ke vi volas malbloki la uzanton?"
|
|||||||
suspendConfirm: "Ĉu vi certas ke vi volas frostigi la uzanton?"
|
suspendConfirm: "Ĉu vi certas ke vi volas frostigi la uzanton?"
|
||||||
unsuspendConfirm: "Ĉu vi certas ke vi volas fandi la uzanton?"
|
unsuspendConfirm: "Ĉu vi certas ke vi volas fandi la uzanton?"
|
||||||
selectList: "Elekti liston"
|
selectList: "Elekti liston"
|
||||||
emojiUrl: "Retadreso de la emoĵio"
|
selectAntenna: "Elekti antenon"
|
||||||
flagAsBot: "Tiu uzanto estas roboto"
|
selectWidget: "Elekti enestraĵon"
|
||||||
flagAsCat: "Tiu uzanto estas kato"
|
editWidgets: "Redakti fenestraĵon"
|
||||||
|
editWidgetsExit: "Fini la redaktadon"
|
||||||
|
customEmojis: "Personecigitaj emoĵioj"
|
||||||
|
emoji: "Emoĵio"
|
||||||
|
emojis: "Emoĵio"
|
||||||
|
emojiName: "Nomo de emoĵio"
|
||||||
|
emojiUrl: "URL de la emoĵio"
|
||||||
|
addEmoji: "Aldoni emoĵion"
|
||||||
|
settingGuide: "Agordaj rekomendoj"
|
||||||
|
cacheRemoteFiles: "Havi staplon de transaj dosieroj"
|
||||||
|
flagAsBot: "Agordo por robota uzanto"
|
||||||
|
flagAsCat: "Agordo de katiĝa uzanto"
|
||||||
addAccount: "Aldoni konton"
|
addAccount: "Aldoni konton"
|
||||||
showOnRemote: "Vidi sur la transa ekzemplo"
|
showOnRemote: "Vidi sur la fora nodo"
|
||||||
general: "Ĝenerala"
|
general: "Ĝenerala"
|
||||||
|
wallpaper: "Ekranfonoj"
|
||||||
|
setWallpaper: "Apliki ekranfonon"
|
||||||
|
removeWallpaper: "Forviŝi ekranfonon. "
|
||||||
searchWith: "Serĉi: {q}"
|
searchWith: "Serĉi: {q}"
|
||||||
youHaveNoLists: "Vi ne havas listojn."
|
youHaveNoLists: "Vi ne havas listojn."
|
||||||
followConfirm: "Ĉu vi certas, ke vi volas sekvi {name}'n?"
|
followConfirm: "Ĉu vi certas ke vi volas sekvi {name}'(o)n?"
|
||||||
selectUser: "Elekti uzanton"
|
selectUser: "Elekti uzanton"
|
||||||
annotation: "Komentarioj"
|
annotation: "Komentarioj"
|
||||||
federation: "Fediverso"
|
federation: "Kunfederaĵo"
|
||||||
instances: "Ekzemplo"
|
instances: "Nodo"
|
||||||
blockThisInstance: "Bloki tiu ekzemplo"
|
perHour: "Po horo"
|
||||||
|
perDay: "Po tago"
|
||||||
|
blockThisInstance: "Bloki tiun nodon"
|
||||||
|
version: "Versio"
|
||||||
|
withNFiles: "{n} dosiero(j)"
|
||||||
disk: "Diskilo"
|
disk: "Diskilo"
|
||||||
blockedInstances: "Blokitaj ekzemploj"
|
instanceInfo: "Informoj pri la nodo"
|
||||||
muteAndBlock: "Silentitaj / Blokitaj"
|
clearCachedFiles: "Malplenigi la staplon"
|
||||||
|
clearCachedFilesConfirm: "Ĉu vi certas, ke vi volas forviŝi ĉiujn transajn dosierojn en la staplo?"
|
||||||
|
blockedInstances: "Blokitaj nodoj"
|
||||||
|
muteAndBlock: "Silentigitoj kaj blokitoj"
|
||||||
mutedUsers: "Silentigitaj uzantoj"
|
mutedUsers: "Silentigitaj uzantoj"
|
||||||
blockedUsers: "Blokitaj uzantoj"
|
blockedUsers: "Blokitaj uzantoj"
|
||||||
noUsers: "Sen uzantoj"
|
noUsers: "Sen uzantoj"
|
||||||
editProfile: "Redakti profilon"
|
editProfile: "Redakti profilon"
|
||||||
noteDeleteConfirm: "Ĉu vi certas ke vi volas forviŝi la noton?"
|
noteDeleteConfirm: "Ĉu vi certas ke vi volas forviŝi la noton?"
|
||||||
pinLimitExceeded: "Vi ne plu povas alpingli noton."
|
pinLimitExceeded: "Vi povas alpingli ne pli noton."
|
||||||
|
processing: "Prilaborado..."
|
||||||
noCustomEmojis: "Neniu emoĵio"
|
noCustomEmojis: "Neniu emoĵio"
|
||||||
federating: "Konfederado"
|
federating: "Nun kunfederanta"
|
||||||
blocked: "Blokita"
|
blocked: "Blokita"
|
||||||
subscribing: "Abonita"
|
suspended: "Suspendita"
|
||||||
|
all: "Ĉiuj"
|
||||||
|
subscribing: "Abonata"
|
||||||
|
publishing: "Al kiu dissendas"
|
||||||
notResponding: "Alvokato ne disponeblas"
|
notResponding: "Alvokato ne disponeblas"
|
||||||
instanceFollowing: "Sekvi ekzemplon"
|
instanceFollowing: "Sekvatoj el la nodo"
|
||||||
instanceFollowers: "Sekvantoj de la ekzemplo"
|
instanceFollowers: "Sekvantoj el la nodo"
|
||||||
instanceUsers: "Uzantoj de la ekzemplo"
|
instanceUsers: "Uzantoj de ĉi tiu nodo"
|
||||||
changePassword: "Ŝanĝi pasvorton"
|
changePassword: "Ŝanĝi pasvorton"
|
||||||
|
security: "Sekureco"
|
||||||
currentPassword: "Aktuala pasvorto"
|
currentPassword: "Aktuala pasvorto"
|
||||||
newPassword: "Nova pasvorto"
|
newPassword: "Nova pasvorto"
|
||||||
newPasswordRetype: "Reentajpu la novan pasvorton"
|
newPasswordRetype: "Reentajpu la novan pasvorton"
|
||||||
attachFile: "Aldoni dosieron"
|
attachFile: "Aldoni dosieron"
|
||||||
more: "Plu!"
|
more: "Plu!"
|
||||||
usernameOrUserId: "Uzantonomo aŭ ID de uzanto"
|
featured: "Maksimumi"
|
||||||
|
usernameOrUserId: "Uzantnomo aŭ identigilo de uzanto"
|
||||||
noSuchUser: "Neniuj uzantoj trovitaj."
|
noSuchUser: "Neniuj uzantoj trovitaj."
|
||||||
remove: "Forviŝi"
|
lookup: "Informpeti"
|
||||||
|
announcements: "Novaĵoj"
|
||||||
|
imageUrl: "URL de bildo"
|
||||||
|
remove: "Forigi"
|
||||||
removed: "Forviŝis"
|
removed: "Forviŝis"
|
||||||
removeAreYouSure: "Ĉu vi certas ke vi volas forigi \"{x}\"?"
|
removeAreYouSure: "Ĉu vi certas ke vi volas forigi \"{x}\"'(o)n?"
|
||||||
deleteAreYouSure: "Ĉu vi certas ke vi volas forigi \"{x}\"?"
|
deleteAreYouSure: "Ĉu vi certas ke vi volas forviŝi \"{x}\"'(o)n?"
|
||||||
messaging: "Babilejoj"
|
saved: "Konservita"
|
||||||
|
messaging: "Retbabili"
|
||||||
upload: "Alŝuti"
|
upload: "Alŝuti"
|
||||||
fromDrive: "De la diskilo"
|
fromDrive: "De la disko"
|
||||||
fromUrl: "De retadreso"
|
fromUrl: "De URL"
|
||||||
uploadFromUrl: "Aldoni de retadreso"
|
uploadFromUrl: "Alŝuti de URL"
|
||||||
uploadFromUrlDescription: "Retadreso de la dosiero kiun vi volu alŝuti"
|
uploadFromUrlDescription: "URL de la dosiero kiun vi volas alŝuti"
|
||||||
games: "Ludoj sur Miskejo"
|
explore: "Esplori"
|
||||||
|
games: "Miskiaj Ludoj"
|
||||||
messageRead: "Legita"
|
messageRead: "Legita"
|
||||||
startMessaging: "Komenci babiladon"
|
startMessaging: "Komenci babiladon"
|
||||||
tos: "Kondiĉoj de Uzado"
|
nUsersRead: "Legita de {n} homoj"
|
||||||
|
tos: "Kondiĉoj de uzado"
|
||||||
start: "Komenciĝi"
|
start: "Komenciĝi"
|
||||||
home: "Ĉefpaĝo"
|
home: "Hejma"
|
||||||
drive: "Diskilo"
|
remoteUserCaution: "Tiu infomoj estas ne tute ekzakta pro distanca uzanto."
|
||||||
|
activity: "Aktiveco"
|
||||||
|
images: "Bildoj"
|
||||||
|
birthday: "Naskiĝdato"
|
||||||
|
registeredDate: "Registriĝdato"
|
||||||
|
location: "Loko"
|
||||||
|
theme: "Koloraro"
|
||||||
|
light: "Luma"
|
||||||
|
dark: "Malluma"
|
||||||
|
drive: "Disko"
|
||||||
fileName: "Dosiernomo"
|
fileName: "Dosiernomo"
|
||||||
selectFile: "Elekti dosieron"
|
selectFile: "Elekti dosieron"
|
||||||
selectFiles: "Elekti dosieron"
|
selectFiles: "Elekti dosieron"
|
||||||
renameFile: "Renomigi dosieron"
|
selectFolder: "Elekti dosierujon"
|
||||||
|
selectFolders: "Elekti dosierujon"
|
||||||
|
renameFile: "Alinomi la dosieron"
|
||||||
|
folderName: "Nomo de la dosierujo"
|
||||||
|
createFolder: "Krei dosierujon"
|
||||||
|
renameFolder: "Alinomi la dosierujon"
|
||||||
deleteFolder: "Forviŝi dosierujon"
|
deleteFolder: "Forviŝi dosierujon"
|
||||||
addFile: "Aldoni dosieron"
|
addFile: "Aldoni dosieron"
|
||||||
emptyDrive: "La diskilo enhavas neniun."
|
emptyDrive: "La disko malplenas"
|
||||||
|
emptyFolder: "La dosierujo malplenas"
|
||||||
unableToDelete: "Ne forigebla"
|
unableToDelete: "Ne forigebla"
|
||||||
inputNewFileName: "Entajpu nova dosiernomon"
|
inputNewFileName: "Entajpu nova nomon de la dosiero"
|
||||||
hasChildFilesOrFolders: "La dosierujo estas neforviŝebla pro tio, ke ĝi enhavas dosieron."
|
inputNewFolderName: "Entajpu nova nomon de la dosierujo"
|
||||||
copyUrl: "Kopii retadreson"
|
hasChildFilesOrFolders: "La dosierujo ne estas forviŝebla, ĉar ĝi ne malplenas."
|
||||||
|
copyUrl: "Kopii URL"
|
||||||
|
rename: "Alinomi"
|
||||||
|
avatar: "Ikono"
|
||||||
|
banner: "Standardo"
|
||||||
nsfw: "Enhavo ne estas deca por laborejo (NSFW)"
|
nsfw: "Enhavo ne estas deca por laborejo (NSFW)"
|
||||||
instanceName: "Nomo de la ekzemplo"
|
reload: "Reŝargi"
|
||||||
|
watch: "Observi"
|
||||||
|
unwatch: "Malobservi"
|
||||||
|
accept: "Permesi"
|
||||||
|
normal: "Normala"
|
||||||
|
instanceName: "Nomo de la nodo"
|
||||||
|
maintainerName: "Nomo de la administranto"
|
||||||
|
maintainerEmail: "Retpoŝto de la administranto"
|
||||||
|
tosUrl: "URL de kondiĉoj de uzado"
|
||||||
|
thisYear: "Ĉi-jare"
|
||||||
|
thisMonth: "Ĉi-monate"
|
||||||
|
today: "Hodiaŭ"
|
||||||
|
dayX: "{day}a"
|
||||||
|
monthX: "{month}"
|
||||||
|
yearX: "La jaro {year}"
|
||||||
|
pages: "Paĝoj"
|
||||||
connectService: "Konekti"
|
connectService: "Konekti"
|
||||||
disconnectService: "Farkonektiĝi"
|
disconnectService: "Farkonektiĝi"
|
||||||
driveCapacityPerLocalAccount: "Volumo po unu loka-uzanto"
|
enableLocalTimeline: "Ebligi lokan templinion"
|
||||||
driveCapacityPerRemoteAccount: "Volumo po unu transa uzanto"
|
enableGlobalTimeline: "Ebligi mallokan templinion"
|
||||||
|
registration: "Registri"
|
||||||
|
driveCapacityPerLocalAccount: "Volumo de disko po unu loka uzanto"
|
||||||
|
driveCapacityPerRemoteAccount: "Volumo de disko po unu transa uzanto"
|
||||||
|
iconUrl: "URL de la ikono (retpaĝsimbolo, ktp)"
|
||||||
|
bannerUrl: "URL de standardo"
|
||||||
|
backgroundImageUrl: "URL de fona bildo"
|
||||||
|
basicInfo: "Baza informo"
|
||||||
pinnedUsers: "Alpinglita uzanto"
|
pinnedUsers: "Alpinglita uzanto"
|
||||||
pinnedNotes: "Pinglita noto"
|
pinnedPages: "Alpinglitaj paĝoj"
|
||||||
|
pinnedNotes: "Alpinglita noto"
|
||||||
|
antennas: "Antenoj"
|
||||||
|
manageAntennas: "Administri antenojn"
|
||||||
|
name: "Nomo"
|
||||||
|
notifyAntenna: "Oni sciigos novajn notojn"
|
||||||
withFileAntenna: "Nur kun aldonaĵo"
|
withFileAntenna: "Nur kun aldonaĵo"
|
||||||
|
withReplies: "Inkluzive respondoj"
|
||||||
|
connectedTo: "Sekva konto estas konektita"
|
||||||
notesAndReplies: "Kun respondoj"
|
notesAndReplies: "Kun respondoj"
|
||||||
withFiles: "Kun aldonaĵo"
|
withFiles: "Kun aldonaĵo"
|
||||||
silenceConfirm: "Ĉu vi certas ke vi volas silentigi la uzanton?"
|
silence: "Mutigi"
|
||||||
unsilenceConfirm: "Ĉu vi certas ke vi volas malsilentigi la uzanton?"
|
silenceConfirm: "Ĉu vi certas ke vi volas mutigi la uzanton?"
|
||||||
|
unsilence: "Malmutigi"
|
||||||
|
unsilenceConfirm: "Ĉu vi certas ke vi volas malmutigi la uzanton?"
|
||||||
|
popularUsers: "Popularaj uzantoj"
|
||||||
|
recentlyUpdatedUsers: "Uzantoj kiuj lastatempe sendis noton"
|
||||||
|
recentlyRegisteredUsers: "Novaliĝintaj uzantoj"
|
||||||
|
exploreUsersCount: "Tiuj estas {count} uzantoj"
|
||||||
|
exploreFediverse: "Esplori la Fediverson"
|
||||||
|
popularTags: "Popularaj kradvortoj"
|
||||||
userList: "Listoj"
|
userList: "Listoj"
|
||||||
aboutMisskey: "Pri Miskejo"
|
about: "Informoj"
|
||||||
|
aboutMisskey: "Pri Misskey"
|
||||||
|
administrator: "Administranto"
|
||||||
|
moderator: "Kontrolisto"
|
||||||
|
nUsersMentioned: "{n} uzanto(j) menciis"
|
||||||
|
securityKey: "Sekureca ŝlosilo"
|
||||||
|
securityKeyName: "Nomo de la ŝlosilo"
|
||||||
|
lastUsed: "Plej malnove uzita"
|
||||||
passwordLessLogin: "Ensaluti sen pasvorto"
|
passwordLessLogin: "Ensaluti sen pasvorto"
|
||||||
resetPassword: "Restarigi pasvorton"
|
resetPassword: "Restarigi pasvorton"
|
||||||
newPasswordIs: "La nova pasvorto estas {password}."
|
newPasswordIs: "La nova pasvorto estas {password}."
|
||||||
|
share: "Diskonigi"
|
||||||
|
notFound: "Ne trovita"
|
||||||
|
cacheClear: "Malplenigi staplon"
|
||||||
|
help: "Manlibro de uzado"
|
||||||
inputMessageHere: "Entajpu masaĝo tie ĉi"
|
inputMessageHere: "Entajpu masaĝo tie ĉi"
|
||||||
|
close: "Fermi"
|
||||||
|
group: "Grupo"
|
||||||
|
groups: "Grupoj"
|
||||||
|
createGroup: "Krei grupon"
|
||||||
|
groupName: "Grupa nomo"
|
||||||
|
members: "Membroj"
|
||||||
|
messagingWithUser: "Babili private"
|
||||||
|
messagingWithGroup: "Babili grupe"
|
||||||
|
title: "Titolo"
|
||||||
|
text: "Teksto"
|
||||||
|
enable: "Ebligi"
|
||||||
|
next: "Sekve"
|
||||||
noteOf: "Noto de {user}"
|
noteOf: "Noto de {user}"
|
||||||
|
noMessagesYet: "Ankoraŭ neniu mesaĝo"
|
||||||
newMessageExists: "Vi ricevis novan mesaĝon."
|
newMessageExists: "Vi ricevis novan mesaĝon."
|
||||||
onlyOneFileCanBeAttached: "Vi povas aldoni nur unu dosieron po unu mesaĝo."
|
onlyOneFileCanBeAttached: "Vi povas aldoni nur unu dosieron po unu mesaĝo."
|
||||||
uiLanguage: "Lingvo de la interfaco"
|
invitationCode: "Kodo de invito"
|
||||||
noFollowRequests: "Vi ne havas eksekvopetojn."
|
or: "Aŭ"
|
||||||
|
language: "Lingvo"
|
||||||
|
uiLanguage: "Lingvo de la fasado"
|
||||||
|
aboutX: "Pri {x}"
|
||||||
|
useOsNativeEmojis: "Oni uzas la emoĵioj de la denaska sistemo"
|
||||||
|
youHaveNoGroups: "Neniuj grupoj"
|
||||||
|
category: "Kategorio"
|
||||||
|
tags: "Etikedoj"
|
||||||
|
createAccount: "Krei konton"
|
||||||
|
existingAccount: "Ekzista konto"
|
||||||
|
fontSize: "Tipara grando"
|
||||||
|
noFollowRequests: "Vi ne havas peto de sekvado"
|
||||||
|
openImageInNewTab: "Fermi la bildon en nova tablo"
|
||||||
|
dashboard: "Stirpanelo"
|
||||||
local: "Loka"
|
local: "Loka"
|
||||||
remote: "Transa"
|
remote: "Transa"
|
||||||
|
total: "Entute"
|
||||||
|
clientSettings: "Agordoj de kliento"
|
||||||
|
accountSettings: "Agordoj de Konto"
|
||||||
|
numberOfDays: "Nombro de tagoj"
|
||||||
hideThisNote: "Kaŝi tiun noton"
|
hideThisNote: "Kaŝi tiun noton"
|
||||||
deleteAllFiles: "Forvisi ĉiujn dosierojn"
|
objectStorageBaseUrl: "Baza URL"
|
||||||
|
objectStorageRegion: "Regiono"
|
||||||
|
objectStorageUseSSL: "Oni uzas SSL"
|
||||||
|
serverLogs: "Servila protokolo"
|
||||||
|
deleteAll: "Forviŝi ĉiujn"
|
||||||
|
newNoteRecived: "Jen estas novaj notoj"
|
||||||
|
sounds: "Sonoj"
|
||||||
|
listen: "Aŭdi"
|
||||||
|
none: "Neniu"
|
||||||
|
showInPage: "Vidi en paĝo"
|
||||||
|
deleteAllFiles: "Forviŝi ĉiujn dosierojn"
|
||||||
deleteAllFilesConfirm: "Ĉu vi certas, ke vi volas forviŝi ĉiujn viajn dosierojn?"
|
deleteAllFilesConfirm: "Ĉu vi certas, ke vi volas forviŝi ĉiujn viajn dosierojn?"
|
||||||
|
userSuspended: "Ĉi tiu uzanto estas flostigita."
|
||||||
|
userSilenced: "Ĉi tiu uzanto estas mutigita."
|
||||||
|
menu: "Menuo"
|
||||||
|
deletedNote: "Forviŝita noto"
|
||||||
invisibleNote: "Malpublika noto"
|
invisibleNote: "Malpublika noto"
|
||||||
|
visibility: "Videbleco"
|
||||||
|
poll: "Balotujo"
|
||||||
|
useCw: "Kaŝi enhavo"
|
||||||
|
enablePlayer: "Vidi videon"
|
||||||
|
disablePlayer: "Fermi videon"
|
||||||
|
themeEditor: "Redaktilo de koloraroj"
|
||||||
|
description: "Priskribe"
|
||||||
|
describeFile: "Priskribi la bildon"
|
||||||
|
author: "Aŭtoro"
|
||||||
|
manage: "Administro"
|
||||||
|
plugins: "Kromaĵoj"
|
||||||
|
deck: "Kartaro"
|
||||||
|
medium: "Meza"
|
||||||
|
small: "Malgranda"
|
||||||
|
edit: "Redakti"
|
||||||
emailServer: "Retpoŝta servilo"
|
emailServer: "Retpoŝta servilo"
|
||||||
email: "Retpoŝto"
|
email: "Retpoŝto"
|
||||||
emailAddress: "Retpoŝtadreso"
|
emailAddress: "Retpoŝta adreso"
|
||||||
smtpUser: "Uzantonomo"
|
smtpConfig: "Agordoj de la servilo SMTP"
|
||||||
|
smtpPort: "Pordo"
|
||||||
|
smtpUser: "Uzantnomo"
|
||||||
smtpPass: "Pasvorto"
|
smtpPass: "Pasvorto"
|
||||||
|
wordMute: "Silentigi specifajn vortojn"
|
||||||
userSaysSomething: "{name} parolis ion"
|
userSaysSomething: "{name} parolis ion"
|
||||||
|
makeActive: "Aktivigi"
|
||||||
|
display: "Vidi"
|
||||||
|
copy: "Kopii"
|
||||||
database: "Datumbazo"
|
database: "Datumbazo"
|
||||||
channel: "Kanalo"
|
channel: "Kanalo"
|
||||||
fileIdOrUrl: "Dosirero ID aŭ retadreso"
|
create: "Krei"
|
||||||
|
notificationSetting: "Agordoj de sciigoj"
|
||||||
|
useGlobalSetting: "Oni uzas malloka agordo"
|
||||||
|
fileIdOrUrl: "Dosiera identigilo aŭ URL"
|
||||||
|
abuseReports: "Signaloj"
|
||||||
|
reportAbuse: "Signalo"
|
||||||
|
reportAbuseOf: "Signali kontraŭ {name}'(o)"
|
||||||
send: "Sendi"
|
send: "Sendi"
|
||||||
i18nInfo: "Tradukojn de Misskey en diversaj lingvoj faras volontuloj. Vi povus kunlabori en tradukado sur {link}, se vi volus."
|
openInNewTab: "Malfermi en nova langeto"
|
||||||
driveFilesCount: "Numero de dosieroj en la diskilo"
|
editTheseSettingsMayBreakAccount: "Redakti tiujn agordojn estas eble damaĝi konton."
|
||||||
onlineUsersCount: "{n} uzanto(j) estas surkonektita"
|
public: "Publika"
|
||||||
|
i18nInfo: "Misskey estas tradukata en diversaj lingvoj far volontuloj. Oni povas kontribui por la tradukado ĉe {link}."
|
||||||
|
accountInfo: "Kontaj Informoj"
|
||||||
|
notesCount: "Numero de notoj"
|
||||||
|
repliesCount: "Numero de respondoj senditaj"
|
||||||
|
renotesCount: "Numero de renotoj kiun vi sendis"
|
||||||
|
repliedCount: "Numero de respondoj ricevitaj"
|
||||||
|
renotedCount: "Numero de renotoj kiun vi ricevis"
|
||||||
|
followingCount: "Numero de sekvatoj"
|
||||||
|
followersCount: "Numero de sekvantoj"
|
||||||
|
sentReactionsCount: "Numero de sentitaj reagoj"
|
||||||
|
receivedReactionsCount: "Numero de ricevitaj reagoj"
|
||||||
|
yes: "Jes"
|
||||||
|
no: "Ne"
|
||||||
|
driveFilesCount: "Numero de dosieroj sur la disko"
|
||||||
|
notSet: "Ne elektita"
|
||||||
|
noteFavoritesCount: "Numero de la preferataj notoj"
|
||||||
|
contact: "Kontakto"
|
||||||
|
makeExplorable: "Videbligi konton sur la paĝo \"Esplori\""
|
||||||
|
duplicate: "Duobligi"
|
||||||
|
left: "Maldekstra"
|
||||||
|
center: "Centra"
|
||||||
|
showTitlebar: "Videbligi titolan stangon"
|
||||||
|
clearCache: "Malplenigi staplon"
|
||||||
|
onlineUsersCount: "{n} uzanto(j) estas surlinea"
|
||||||
nUsers: "{n} uzanto(j)"
|
nUsers: "{n} uzanto(j)"
|
||||||
|
nNotes: "{n} notoj"
|
||||||
|
myTheme: "Miaj koloraroj"
|
||||||
|
backgroundColor: "Fona koloro"
|
||||||
|
textColor: "Teksto"
|
||||||
|
saveAs: "Konservi kiel…"
|
||||||
|
value: "Valoro"
|
||||||
|
createdAt: "Kreita je"
|
||||||
|
updatedAt: "Laste ĝisdatigita"
|
||||||
|
deleteConfirm: "Ĉu certas forviŝi?"
|
||||||
|
closeAccount: "Forigi konton"
|
||||||
|
currentVersion: "Nuna versio"
|
||||||
|
latestVersion: "Plej nova versio"
|
||||||
|
youAreRunningUpToDateClient: "Vi uzas la plej novan version de via kliento."
|
||||||
|
newVersionOfClientAvailable: "Nova versio de via kliento estas disponebla."
|
||||||
|
inUse: "Uzata"
|
||||||
|
editCode: "Redakti kodon"
|
||||||
emailNotification: "Sciigoj per retpoŝto"
|
emailNotification: "Sciigoj per retpoŝto"
|
||||||
publish: "Publikigi"
|
publish: "Publikigi"
|
||||||
inChannelSearch: "Serĉi en kanalo"
|
inChannelSearch: "Serĉi en kanalo"
|
||||||
|
useReactionPickerForContextMenu: "Oni malfermas reago-elektilon per dekstro-kliki"
|
||||||
typingUsers: "{users} estas entajpanta(j)..."
|
typingUsers: "{users} estas entajpanta(j)..."
|
||||||
|
addDescription: "Priskribi"
|
||||||
|
info: "Informoj"
|
||||||
|
userInfo: "Informoj de uzanto"
|
||||||
|
unknown: "Nekonata"
|
||||||
online: "Surkonektita"
|
online: "Surkonektita"
|
||||||
offline: "Forkonektita"
|
offline: "Forkonektita"
|
||||||
instanceBlocking: "Ekzempla blokado"
|
instanceBlocking: "Blokado de nodoj"
|
||||||
user: "Uzanto"
|
selectAccount: "Elekti konton"
|
||||||
|
user: "Uzantoj"
|
||||||
|
administration: "Administro"
|
||||||
|
accounts: "Kontoj"
|
||||||
|
high: "Alta"
|
||||||
|
middle: "Meza"
|
||||||
|
low: "Malalta"
|
||||||
|
customCss: "Uzantula CSS"
|
||||||
|
global: "Malloka"
|
||||||
|
sent: "Sendi"
|
||||||
|
received: "Ricevita"
|
||||||
|
searchResult: "Serĉorezultoj"
|
||||||
|
hashtags: "Kradvorto"
|
||||||
|
learnMore: "Lernu pli"
|
||||||
|
translate: "Traduki"
|
||||||
|
translatedFrom: "Tradukita el {x}"
|
||||||
|
_docs:
|
||||||
|
continueReading: "Legi plu"
|
||||||
|
features: "Funkcioj"
|
||||||
|
admin: "Administro"
|
||||||
_gallery:
|
_gallery:
|
||||||
liked: "Ŝatitaj notoj"
|
liked: "Ŝatitaj notoj"
|
||||||
|
like: "Ŝati"
|
||||||
_email:
|
_email:
|
||||||
_follow:
|
_follow:
|
||||||
title: "Vi estas eksekvita."
|
title: "Vi estas eksekvita"
|
||||||
_receiveFollowRequest:
|
_receiveFollowRequest:
|
||||||
title: "Vi ricevis eksekvopeton."
|
title: "Vi ricevis peton de sekvado"
|
||||||
|
_plugin:
|
||||||
|
install: "Instali kromaĵon"
|
||||||
|
manage: "Administri kromaĵojn"
|
||||||
|
_registry:
|
||||||
|
key: "Ŝlosilo"
|
||||||
|
keys: "Ŝlosiloj"
|
||||||
|
domain: "Nomregno"
|
||||||
|
createKey: "Krei ŝlosilon"
|
||||||
_aboutMisskey:
|
_aboutMisskey:
|
||||||
about: "Misskey estas malferma koda programo evoluigata far syuilo ekde la 2014."
|
about: "Misskey estas malfermitkoda programo evoluigata de syuilo ekde la 2014."
|
||||||
|
contributors: "Precipaj kontribuantoj"
|
||||||
|
allContributors: "Ĉiuj kontribuintoj"
|
||||||
source: "Fontkodo"
|
source: "Fontkodo"
|
||||||
translation: "Traduki Misskey'on"
|
translation: "Traduki Misskey'on"
|
||||||
|
patrons: "Mecenatoj"
|
||||||
_mfm:
|
_mfm:
|
||||||
|
dummy: "Misskey evoluigas la mondon de Fediverso"
|
||||||
mention: "Mencioj"
|
mention: "Mencioj"
|
||||||
url: "Retadreso"
|
hashtag: "Kradvorto"
|
||||||
blockCode: "Kodo (Ujo)"
|
url: "URL"
|
||||||
blockMath: "Formulo (Ujo)"
|
link: "Ligilo"
|
||||||
|
bold: "Grasa"
|
||||||
|
small: "Malgrande"
|
||||||
|
center: "Centrigi"
|
||||||
|
inlineCode: "Kodo (en linio)"
|
||||||
|
blockCode: "Kodo (bloko)"
|
||||||
|
inlineMath: "Formulo (en linio)"
|
||||||
|
blockMath: "Formulo (bloko)"
|
||||||
quote: "Citi"
|
quote: "Citi"
|
||||||
|
emoji: "Personecigitaj emoĵioj"
|
||||||
search: "Serĉi"
|
search: "Serĉi"
|
||||||
|
flip: "Inversa"
|
||||||
|
x2: "Granda"
|
||||||
|
x3: "Grandega"
|
||||||
|
x4: "Pli grandega"
|
||||||
|
_reversi:
|
||||||
|
total: "Entute"
|
||||||
_instanceTicker:
|
_instanceTicker:
|
||||||
none: "Ne montri"
|
none: "Ne montri"
|
||||||
remote: "Montri al transaj uzantoj"
|
remote: "Montri al transaj uzantoj"
|
||||||
|
always: "Ĉiam montri"
|
||||||
_channel:
|
_channel:
|
||||||
create: "Krei kanalon"
|
create: "Krei kanalon"
|
||||||
edit: "Redakti kanalon"
|
edit: "Redakti kanalon"
|
||||||
following: "Sekvaton"
|
owned: "Posedaĵo"
|
||||||
|
following: "Sekvante"
|
||||||
|
usersCount: "{n} partoprenanto(j)"
|
||||||
|
_menuDisplay:
|
||||||
|
hide: "Kaŝi"
|
||||||
|
_wordMute:
|
||||||
|
muteWords: "Silentigitaj vortoj"
|
||||||
|
mutedNotes: "Silentigitaj notoj"
|
||||||
_theme:
|
_theme:
|
||||||
|
manage: "Administri kolorarojn"
|
||||||
|
code: "Kodo de koloraro"
|
||||||
|
description: "Priskribe"
|
||||||
|
darken: "Malbrileco"
|
||||||
|
lighten: "Brileco"
|
||||||
keys:
|
keys:
|
||||||
|
bg: "Fono"
|
||||||
|
navBg: "Fono de flanka stango"
|
||||||
|
hashtag: "Kradvorto"
|
||||||
mention: "Mencioj"
|
mention: "Mencioj"
|
||||||
renote: "Renotici"
|
renote: "Renoto"
|
||||||
|
buttonBg: "Fono de butono"
|
||||||
|
driveFolderBg: "Fono de dosierujo de la disko"
|
||||||
|
messageBg: "Fono de retbabilejo"
|
||||||
_sfx:
|
_sfx:
|
||||||
note: "Nova noto"
|
note: "Nova noto"
|
||||||
|
noteMy: "Mia noto"
|
||||||
notification: "Sciigoj"
|
notification: "Sciigoj"
|
||||||
chat: "Babilejoj"
|
chat: "Retbabili"
|
||||||
channel: "Kanala sciigoj"
|
chatBg: "Retbabili (BG)"
|
||||||
|
antenna: "Ricevo de anteno"
|
||||||
|
channel: "Sciigoj de kanalo"
|
||||||
|
_ago:
|
||||||
|
future: "Futuro"
|
||||||
|
justNow: "Ĵus"
|
||||||
|
secondsAgo: "Antaŭ {n} sekundo(j)"
|
||||||
|
minutesAgo: "Antaŭ {n} minutoj"
|
||||||
|
hoursAgo: "Antaŭ {n} horo(j)"
|
||||||
|
daysAgo: "Antaŭ {n} tagoj"
|
||||||
|
weeksAgo: "Antaŭ {n} semajnoj"
|
||||||
|
monthsAgo: "Antaŭ {n} monatoj"
|
||||||
|
yearsAgo: "Antaŭ {n} jaroj"
|
||||||
|
_time:
|
||||||
|
second: "sek"
|
||||||
|
minute: "min"
|
||||||
|
hour: "hor"
|
||||||
|
day: "Tago"
|
||||||
_tutorial:
|
_tutorial:
|
||||||
title: "Uzado de Miskejo"
|
title: "Uzado de Misskey"
|
||||||
|
step1_1: "Bonvenon."
|
||||||
|
step7_2: "Se vi volas scii pli pri Misskey, rigardu la fakon {help}."
|
||||||
|
step7_3: "Do, bonvolu amuziĝi Misskey'on🚀"
|
||||||
_permissions:
|
_permissions:
|
||||||
"read:blocks": "Vidi la listo de la uzantoj kiun vi blokis."
|
"write:account": "Redakti Informojn de via konto"
|
||||||
"read:drive": "Vidi dosierojn en la diskilo"
|
"read:blocks": "Vidi vian liston de uzantoj blokitaj"
|
||||||
"read:channels": "Legi kanalon"
|
"write:blocks": "Redakti vian liston de uzantoj blokitaj"
|
||||||
|
"read:drive": "Operacio por legi la informon de dosiero en via disko de Misskey"
|
||||||
|
"write:drive": "Ĉia operacio por skribi, forviŝi, aŭ alimaniere ŝanĝi la informon de dosiero en via disko de Misskey"
|
||||||
|
"read:favorites": "Vidi vian liston de preferataĵoj"
|
||||||
|
"write:favorites": "Redakti vian liston de preferataĵoj."
|
||||||
|
"read:following": "Vidi tiun kiun vi sekvas"
|
||||||
|
"write:following": "Sekvi aŭ malsekvi alian uzanton"
|
||||||
|
"read:messaging": "Vidi vian retbabiladon"
|
||||||
|
"read:mutes": "Vidi vian liston de silentigoj"
|
||||||
|
"write:mutes": "Redakti vian liston de silentigoj"
|
||||||
|
"write:notes": "Krei / Forviŝi noton"
|
||||||
|
"read:notifications": "Vidi sciigojn"
|
||||||
|
"read:reactions": "Vidi reagojn"
|
||||||
|
"write:reactions": "Redakti viajn reagojn"
|
||||||
|
"read:pages": "Vidi via paĝojn"
|
||||||
|
"read:page-likes": "Vidi ŝatojn de paĝo"
|
||||||
|
"read:channels": "Vidi kanalojn"
|
||||||
|
_antennaSources:
|
||||||
|
all: "Ĉiuj notoj"
|
||||||
|
homeTimeline: "Notoj far uzantoj, kiujn vi sekvas"
|
||||||
|
_weekday:
|
||||||
|
sunday: "dimanĉo"
|
||||||
|
monday: "lundo"
|
||||||
|
tuesday: "mardo"
|
||||||
|
wednesday: "merkredo"
|
||||||
|
thursday: "ĵaŭdo"
|
||||||
|
friday: "vendredo"
|
||||||
|
saturday: "sabato"
|
||||||
_widgets:
|
_widgets:
|
||||||
notifications: "Sciigoj"
|
notifications: "Sciigoj"
|
||||||
timeline: "Tempolinio"
|
timeline: "Templinio"
|
||||||
federation: "Fediverso"
|
clock: "Horloĝo"
|
||||||
|
activity: "Aktiveco"
|
||||||
|
federation: "Kunfederaĵo"
|
||||||
|
slideshow: "Bildoprezento"
|
||||||
|
button: "Butono"
|
||||||
onlineUsers: "Surkonektita uzanto"
|
onlineUsers: "Surkonektita uzanto"
|
||||||
|
aichan: "Ai"
|
||||||
_cw:
|
_cw:
|
||||||
show: "Vidu plu"
|
show: "Vidu pli"
|
||||||
files: "{count} dosiero(j)"
|
files: "{count} dosiero(j)"
|
||||||
|
_poll:
|
||||||
|
choiceN: "Balotilo {n}"
|
||||||
|
noMore: "Oni ne povas aldoni pli."
|
||||||
|
infinite: "Neniam"
|
||||||
|
deadlineTime: "hor"
|
||||||
|
votesCount: "{n} balotiloj"
|
||||||
|
vote: "Baloti"
|
||||||
|
closed: "Oni jam balotis ĝin"
|
||||||
_visibility:
|
_visibility:
|
||||||
publicDescription: "Via noto aperiĝos sur konfederacia tempolinio"
|
publicDescription: "Via noto aperiĝos sur la templinio Malloka"
|
||||||
home: "Ĉefpaĝo"
|
home: "Hejma"
|
||||||
homeDescription: "Elsendi nur sur hejma tempolinio"
|
homeDescription: "Elsendi nur sur la templinio Hejmo"
|
||||||
followers: "Sekvantoj"
|
followers: "Sekvantoj"
|
||||||
followersDescription: "Elsendi nur al sekvantoj de mi"
|
followersDescription: "Nur al sekvantoj al mi"
|
||||||
|
specified: "Rekta"
|
||||||
localOnly: "Nur loka"
|
localOnly: "Nur loka"
|
||||||
localOnlyDescription: "Nelegabla al transaj uzantoj"
|
localOnlyDescription: "Ne montri al transaj uzantoj"
|
||||||
_postForm:
|
_postForm:
|
||||||
channelPlaceholder: "Elsendi sur la kanalo"
|
replyPlaceholder: "Respondi al tiu noto..."
|
||||||
|
quotePlaceholder: "Citado tiun noton..."
|
||||||
|
channelPlaceholder: "Sendi sur la kanalo"
|
||||||
_profile:
|
_profile:
|
||||||
username: "Uzantonomo"
|
name: "Nomo"
|
||||||
|
username: "Uzantnomo"
|
||||||
|
metadataEdit: "Redakti kromaj informoj"
|
||||||
|
changeAvatar: "Ŝanĝi profilbildon"
|
||||||
|
changeBanner: "Ŝanĝi standardon"
|
||||||
_exportOrImport:
|
_exportOrImport:
|
||||||
followingList: "Sekvi"
|
allNotes: "Ĉiuj notoj"
|
||||||
muteList: "Silentigi"
|
followingList: "Sekvataj uzantoj"
|
||||||
blockingList: "Blokado"
|
muteList: "Silentigoj"
|
||||||
|
blockingList: "Blokitaj uzantoj"
|
||||||
userLists: "Listoj"
|
userLists: "Listoj"
|
||||||
|
_charts:
|
||||||
|
federationInstancesTotal: "Tuta numero de nodoj kunfederantaj"
|
||||||
|
usersTotal: "Tuta numero de uzantoj"
|
||||||
|
activeUsers: "Numero de aktivaj uzantoj"
|
||||||
|
notesTotal: "Tuta numero de notoj"
|
||||||
|
filesTotal: "Tuta numero de dosieroj"
|
||||||
_timelines:
|
_timelines:
|
||||||
home: "Hejmo"
|
home: "Hejma"
|
||||||
local: "Loka"
|
local: "Loka"
|
||||||
social: "Hejmo kaj loka"
|
social: "Sociala"
|
||||||
|
global: "Malloka"
|
||||||
_rooms:
|
_rooms:
|
||||||
|
translate: "Movi"
|
||||||
|
chooseImage: "Elekti bildon"
|
||||||
_furnitures:
|
_furnitures:
|
||||||
server: "Servilo"
|
server: "Servilo"
|
||||||
|
moon: "La luno"
|
||||||
_pages:
|
_pages:
|
||||||
|
editPage: "Redakti paĝon"
|
||||||
|
deleted: "La paĝo estas forigita."
|
||||||
|
editThisPage: "Redakti la paĝon"
|
||||||
|
viewPage: "Vidi via paĝojn"
|
||||||
|
my: "Miaj paĝoj"
|
||||||
|
featured: "Ravaĵoj"
|
||||||
|
contents: "Enhavo"
|
||||||
content: "Blokado de paĝo"
|
content: "Blokado de paĝo"
|
||||||
url: "Retadreso de la paĝo"
|
url: "URL de paĝo"
|
||||||
chooseBlock: "Aldoni blokado"
|
alignCenter: "Centrigi"
|
||||||
|
chooseBlock: "Aldoni blokon"
|
||||||
|
contentBlocks: "Enhavo"
|
||||||
|
blocks:
|
||||||
|
text: "Teksto"
|
||||||
|
textarea: "Areo de teksto"
|
||||||
|
image: "Bildo"
|
||||||
|
button: "Butono"
|
||||||
|
_post:
|
||||||
|
canvasId: "Kanvasa identigilo"
|
||||||
|
textInput: "Enigo el teksto"
|
||||||
|
textareaInput: "Enigo el teksto en multaj linioj"
|
||||||
|
_numberInput:
|
||||||
|
text: "Titolo"
|
||||||
|
_canvas:
|
||||||
|
id: "Kanvasa identigilo"
|
||||||
|
_note:
|
||||||
|
id: "Identigilo de noto"
|
||||||
|
_counter:
|
||||||
|
text: "Titolo"
|
||||||
|
_button:
|
||||||
|
text: "Titolo"
|
||||||
|
_action:
|
||||||
|
_pushEvent:
|
||||||
|
event: "Nomo de la evento"
|
||||||
script:
|
script:
|
||||||
categories:
|
categories:
|
||||||
|
text: "Manipulo de teksto"
|
||||||
list: "Listoj"
|
list: "Listoj"
|
||||||
blocks:
|
blocks:
|
||||||
|
text: "Teksto"
|
||||||
|
multiLineText: "Teksto (multaj linioj)"
|
||||||
|
textList: "List de teksto"
|
||||||
|
_strLen:
|
||||||
|
arg1: "Teksto"
|
||||||
|
_strPick:
|
||||||
|
arg1: "Teksto"
|
||||||
|
_strReplace:
|
||||||
|
arg1: "Teksto"
|
||||||
|
_strReverse:
|
||||||
|
arg1: "Teksto"
|
||||||
_join:
|
_join:
|
||||||
arg1: "Listoj"
|
arg1: "Listoj"
|
||||||
_randomPick:
|
_randomPick:
|
||||||
@@ -310,28 +722,44 @@ _pages:
|
|||||||
arg1: "Listoj"
|
arg1: "Listoj"
|
||||||
_seedRandomPick:
|
_seedRandomPick:
|
||||||
arg2: "Listoj"
|
arg2: "Listoj"
|
||||||
|
_DRPWPM:
|
||||||
|
arg1: "List de teksto"
|
||||||
pick: "Elekti de la listo"
|
pick: "Elekti de la listo"
|
||||||
_pick:
|
_pick:
|
||||||
arg1: "Listoj"
|
arg1: "Listoj"
|
||||||
_listLen:
|
_listLen:
|
||||||
arg1: "Listoj"
|
arg1: "Listoj"
|
||||||
|
_stringToNumber:
|
||||||
|
arg1: "Teksto"
|
||||||
|
_splitStrByLine:
|
||||||
|
arg1: "Teksto"
|
||||||
types:
|
types:
|
||||||
|
string: "Teksto"
|
||||||
array: "Listoj"
|
array: "Listoj"
|
||||||
|
stringArray: "List de teksto"
|
||||||
_notification:
|
_notification:
|
||||||
fileUploaded: "La dosiero sukcese alŝutiĝis."
|
fileUploaded: "La dosiero sukcese alŝutiĝis."
|
||||||
youWereFollowed: "Vi estas eksekvita."
|
youRenoted: "Renoto farita de {name}"
|
||||||
youReceivedFollowRequest: "Vi ricevis eksekvopeton."
|
youGotPoll: "{name} balotis"
|
||||||
yourFollowRequestAccepted: "Via eksekvopeto estas akceptita."
|
youGotMessagingMessageFromUser: "{name} sentis mesaĝon al vi."
|
||||||
|
youGotMessagingMessageFromGroup: "Retbabilan mesaĝon oni sendis al la grupo {name}"
|
||||||
|
youWereFollowed: "sksekvis vin"
|
||||||
|
youReceivedFollowRequest: "Vi ricevis peton de sekvado"
|
||||||
|
yourFollowRequestAccepted: "Via peto por sekvado estis akceptita."
|
||||||
_types:
|
_types:
|
||||||
follow: "Sekvi"
|
follow: "Sekvatoj"
|
||||||
mention: "Mencioj"
|
mention: "Mencioj"
|
||||||
renote: "Renotici"
|
renote: "Fari renoton"
|
||||||
quote: "Citi"
|
quote: "Citi"
|
||||||
reaction: "Reagoj"
|
reaction: "Reagoj"
|
||||||
receiveFollowRequest: "Eksekvopeto ricevita"
|
receiveFollowRequest: "Ricevita peton de sekvado"
|
||||||
|
followRequestAccepted: "Akceptita peto por sekvado"
|
||||||
_deck:
|
_deck:
|
||||||
|
profile: "Agordaro"
|
||||||
_columns:
|
_columns:
|
||||||
notifications: "Sciigoj"
|
notifications: "Sciigoj"
|
||||||
tl: "Tempolinio"
|
tl: "Templinio"
|
||||||
|
antenna: "Antenoj"
|
||||||
list: "Listoj"
|
list: "Listoj"
|
||||||
mentions: "Mencioj"
|
mentions: "Al vi"
|
||||||
|
direct: "Notoj rektaj"
|
||||||
|
@@ -127,6 +127,7 @@ editWidgets: "Editar widgets"
|
|||||||
editWidgetsExit: "Terminar edición"
|
editWidgetsExit: "Terminar edición"
|
||||||
customEmojis: "Emojis personalizados"
|
customEmojis: "Emojis personalizados"
|
||||||
emoji: "Emoji"
|
emoji: "Emoji"
|
||||||
|
emojis: "Emoji"
|
||||||
emojiName: "Nombre del emoji"
|
emojiName: "Nombre del emoji"
|
||||||
emojiUrl: "URL de la imágen del emoji"
|
emojiUrl: "URL de la imágen del emoji"
|
||||||
addEmoji: "Agregar emoji"
|
addEmoji: "Agregar emoji"
|
||||||
@@ -665,6 +666,10 @@ administration: "Administrar"
|
|||||||
expiration: "Termina el"
|
expiration: "Termina el"
|
||||||
middle: "Mediano"
|
middle: "Mediano"
|
||||||
global: "Global"
|
global: "Global"
|
||||||
|
sent: "Enviar"
|
||||||
|
hashtags: "Hashtag"
|
||||||
|
_docs:
|
||||||
|
admin: "Administrar"
|
||||||
_ad:
|
_ad:
|
||||||
back: "Deseleccionar"
|
back: "Deseleccionar"
|
||||||
_gallery:
|
_gallery:
|
||||||
|
@@ -91,11 +91,11 @@ followRequests: "Demandes d’abonnement"
|
|||||||
unfollow: "Se désabonner"
|
unfollow: "Se désabonner"
|
||||||
followRequestPending: "Demande d'abonnement en attente de confirmation"
|
followRequestPending: "Demande d'abonnement en attente de confirmation"
|
||||||
enterEmoji: "Insérer un émoji"
|
enterEmoji: "Insérer un émoji"
|
||||||
renote: "Partager"
|
renote: "Renoter"
|
||||||
unrenote: "Annuler le partage"
|
unrenote: "Annuler la Renote"
|
||||||
renoted: "Republié !"
|
renoted: "Renoté !"
|
||||||
cantRenote: "Ce message ne peut pas être republié."
|
cantRenote: "Ce message ne peut pas être renoté."
|
||||||
cantReRenote: "Impossible de repartager un partage."
|
cantReRenote: "Impossible de renoter une Renote."
|
||||||
quote: "Citer"
|
quote: "Citer"
|
||||||
pinnedNote: "Note épinglée"
|
pinnedNote: "Note épinglée"
|
||||||
pinned: "Épingler sur le profil"
|
pinned: "Épingler sur le profil"
|
||||||
@@ -128,6 +128,7 @@ editWidgets: "Modifier les widgets"
|
|||||||
editWidgetsExit: "Valider les modifications"
|
editWidgetsExit: "Valider les modifications"
|
||||||
customEmojis: "Émojis personnalisés"
|
customEmojis: "Émojis personnalisés"
|
||||||
emoji: "Émoji"
|
emoji: "Émoji"
|
||||||
|
emojis: "Émoji"
|
||||||
emojiName: "Nom de l’émoji"
|
emojiName: "Nom de l’émoji"
|
||||||
emojiUrl: "URL de l’émoji"
|
emojiUrl: "URL de l’émoji"
|
||||||
addEmoji: "Ajouter un émoji"
|
addEmoji: "Ajouter un émoji"
|
||||||
@@ -428,7 +429,7 @@ invitationCode: "Code d’invitation"
|
|||||||
checking: "Vérification en cours..."
|
checking: "Vérification en cours..."
|
||||||
available: "Disponible"
|
available: "Disponible"
|
||||||
unavailable: "Non disponible"
|
unavailable: "Non disponible"
|
||||||
usernameInvalidFormat: "Le nom d'utilisateur peut contenir uniquement des lettres, des chiffres et des _"
|
usernameInvalidFormat: "Le nom d'utilisateur peut contenir uniquement des lettres (minuscules et/ou majuscules), des chiffres et des _"
|
||||||
tooShort: "Trop court"
|
tooShort: "Trop court"
|
||||||
tooLong: "Trop long"
|
tooLong: "Trop long"
|
||||||
weakPassword: "Mot de passe faible"
|
weakPassword: "Mot de passe faible"
|
||||||
@@ -528,6 +529,7 @@ removeAllFollowing: "Retenir tous les abonnements"
|
|||||||
removeAllFollowingDescription: "Se désabonner de tous les comptes de {host}. Veuillez lancer cette action uniquement si l’instance n’existe plus."
|
removeAllFollowingDescription: "Se désabonner de tous les comptes de {host}. Veuillez lancer cette action uniquement si l’instance n’existe plus."
|
||||||
userSuspended: "Cet·te utilisateur·rice a été suspendu·e."
|
userSuspended: "Cet·te utilisateur·rice a été suspendu·e."
|
||||||
userSilenced: "Cette utilisateur·trice a été mis·e en sourdine."
|
userSilenced: "Cette utilisateur·trice a été mis·e en sourdine."
|
||||||
|
menu: "Menu"
|
||||||
divider: "Séparateur"
|
divider: "Séparateur"
|
||||||
addItem: "Ajouter un élément"
|
addItem: "Ajouter un élément"
|
||||||
rooms: "Chambre"
|
rooms: "Chambre"
|
||||||
@@ -636,9 +638,9 @@ manageAccessTokens: "Gérer les jetons d'accès"
|
|||||||
accountInfo: " Informations du compte "
|
accountInfo: " Informations du compte "
|
||||||
notesCount: "Nombre de notes"
|
notesCount: "Nombre de notes"
|
||||||
repliesCount: "Nombre de réponses envoyées"
|
repliesCount: "Nombre de réponses envoyées"
|
||||||
renotesCount: "Nombre de notes repartagées"
|
renotesCount: "Nombre de notes que vous avez renotées"
|
||||||
repliedCount: "Nombre de réponses reçues"
|
repliedCount: "Nombre de réponses reçues"
|
||||||
renotedCount: "Nombre de Renotes"
|
renotedCount: "Nombre de vos notes renotées"
|
||||||
followingCount: "Nombre de comptes suivis"
|
followingCount: "Nombre de comptes suivis"
|
||||||
followersCount: "Nombre d'abonnés"
|
followersCount: "Nombre d'abonnés"
|
||||||
sentReactionsCount: "Nombre de réactions envoyées"
|
sentReactionsCount: "Nombre de réactions envoyées"
|
||||||
@@ -760,7 +762,37 @@ middle: "Moyen"
|
|||||||
low: "Basse"
|
low: "Basse"
|
||||||
emailNotConfiguredWarning: "Vous n'avez pas configuré d'adresse e-mail."
|
emailNotConfiguredWarning: "Vous n'avez pas configuré d'adresse e-mail."
|
||||||
ratio: "Ratio"
|
ratio: "Ratio"
|
||||||
|
customCss: "CSS personnalisé"
|
||||||
|
customCssWarn: "Utilisez cette fonctionnalité uniquement si vous savez exactement ce que vous faites. Une configuration inadaptée peut empêcher le client de s'exécuter normalement."
|
||||||
global: "Global"
|
global: "Global"
|
||||||
|
squareAvatars: "Avatars carrés"
|
||||||
|
sent: "Envoyer"
|
||||||
|
searchResult: "Résultats de la recherche"
|
||||||
|
hashtags: "Hashtags"
|
||||||
|
troubleshooting: "Résolution de problèmes"
|
||||||
|
useBlurEffect: "Utiliser des effets de flou dans l'interface"
|
||||||
|
learnMore: "Plus d'informations"
|
||||||
|
misskeyUpdated: "Misskey a été mis à jour !"
|
||||||
|
whatIsNew: "Voir les derniers changements"
|
||||||
|
translate: "Traduire"
|
||||||
|
translatedFrom: "Traduit depuis {x}"
|
||||||
|
accountDeletionInProgress: "La suppression de votre compte est en cours"
|
||||||
|
usernameInfo: "C'est un nom qui identifie votre compte sur l'instance de manière unique. Vous pouvez utiliser des lettres de l'alphabet (minuscules et majuscules), des chiffres (de 0 à 9), ou bien le tiret « _ ». Vous ne pourrez pas modifier votre nom d'utilisateur·rice par la suite."
|
||||||
|
keepCw: "Garder le CW"
|
||||||
|
_accountDelete:
|
||||||
|
accountDelete: "Supprimer le compte"
|
||||||
|
mayTakeTime: "La suppression de compte nécessitant beaucoup de ressources, l'exécution du processus peut prendre du temps, en fonction de la quantité de contenus que vous avez créés et du nombre de fichiers que vous avez téléversés."
|
||||||
|
sendEmail: "Une fois la suppression de votre compte effectuée, un courriel sera envoyé à l'adresse que vous aviez enregistrée."
|
||||||
|
requestAccountDelete: "Demander la suppression de votre compte"
|
||||||
|
started: "La procédure de suppression a commencé."
|
||||||
|
inProgress: "Suppression en cours"
|
||||||
|
_docs:
|
||||||
|
continueReading: "Lire plus"
|
||||||
|
features: "Fonctionnalités"
|
||||||
|
generalTopics: "Sujets généraux"
|
||||||
|
advancedTopics: "Sujets avancés"
|
||||||
|
admin: "Gestion"
|
||||||
|
translateWarn: "Ceci est une traduction dont le contenu peut différer du texte original."
|
||||||
_ad:
|
_ad:
|
||||||
back: "Retour"
|
back: "Retour"
|
||||||
reduceFrequencyOfThisAd: "Voir cette publicité moins souvent"
|
reduceFrequencyOfThisAd: "Voir cette publicité moins souvent"
|
||||||
@@ -859,6 +891,8 @@ _mfm:
|
|||||||
blurDescription: "Le contenu peut être flouté ; il sera visible en le survolant avec le curseur."
|
blurDescription: "Le contenu peut être flouté ; il sera visible en le survolant avec le curseur."
|
||||||
font: "Police de caractères"
|
font: "Police de caractères"
|
||||||
fontDescription: "Il est possible de choisir la police."
|
fontDescription: "Il est possible de choisir la police."
|
||||||
|
rainbow: "Arc-en-ciel"
|
||||||
|
rainbowDescription: "Permet d'afficher le contenu en couleurs arc-en-ciel."
|
||||||
_reversi:
|
_reversi:
|
||||||
reversi: "Reversi"
|
reversi: "Reversi"
|
||||||
gameSettings: "Réglages de la partie"
|
gameSettings: "Réglages de la partie"
|
||||||
@@ -911,6 +945,9 @@ _channel:
|
|||||||
usersCount: "{n} Participant·e·s"
|
usersCount: "{n} Participant·e·s"
|
||||||
notesCount: "{n} Notes"
|
notesCount: "{n} Notes"
|
||||||
_menuDisplay:
|
_menuDisplay:
|
||||||
|
sideFull: "Latéral"
|
||||||
|
sideIcon: "Latéral (icônes)"
|
||||||
|
top: "Haut de page"
|
||||||
hide: "Masquer"
|
hide: "Masquer"
|
||||||
_wordMute:
|
_wordMute:
|
||||||
muteWords: "Mots à filtrer"
|
muteWords: "Mots à filtrer"
|
||||||
@@ -969,7 +1006,7 @@ _theme:
|
|||||||
hashtag: "Hashtags"
|
hashtag: "Hashtags"
|
||||||
mention: "Mentionner"
|
mention: "Mentionner"
|
||||||
mentionMe: "Mentions (Moi)"
|
mentionMe: "Mentions (Moi)"
|
||||||
renote: "Partager"
|
renote: "Renoter"
|
||||||
modalBg: "Modal d'arrière-plan"
|
modalBg: "Modal d'arrière-plan"
|
||||||
divider: "Séparateur"
|
divider: "Séparateur"
|
||||||
scrollbarHandle: "Poignée de la barre de navigation"
|
scrollbarHandle: "Poignée de la barre de navigation"
|
||||||
@@ -1590,11 +1627,11 @@ _notification:
|
|||||||
youWereInvitedToGroup: "Invité·e au groupe"
|
youWereInvitedToGroup: "Invité·e au groupe"
|
||||||
_types:
|
_types:
|
||||||
all: "Toutes"
|
all: "Toutes"
|
||||||
follow: "Abonnements"
|
follow: "Nouvel·le abonné·e"
|
||||||
mention: "Mentions"
|
mention: "Mentions"
|
||||||
reply: "Réponses"
|
reply: "Réponses"
|
||||||
renote: "Partager"
|
renote: "Renotes"
|
||||||
quote: "Citer"
|
quote: "Citations"
|
||||||
reaction: "Réactions"
|
reaction: "Réactions"
|
||||||
pollVote: "Votes dans des sondages"
|
pollVote: "Votes dans des sondages"
|
||||||
receiveFollowRequest: "Demande d'abonnement reçue"
|
receiveFollowRequest: "Demande d'abonnement reçue"
|
||||||
|
@@ -128,6 +128,7 @@ editWidgets: "Sunting gawit"
|
|||||||
editWidgetsExit: "Selesai"
|
editWidgetsExit: "Selesai"
|
||||||
customEmojis: "Emoji kustom"
|
customEmojis: "Emoji kustom"
|
||||||
emoji: "Emoji"
|
emoji: "Emoji"
|
||||||
|
emojis: "Emoji"
|
||||||
emojiName: "Nama emoji"
|
emojiName: "Nama emoji"
|
||||||
emojiUrl: "URL Emoji"
|
emojiUrl: "URL Emoji"
|
||||||
addEmoji: "Tambahkan emoji"
|
addEmoji: "Tambahkan emoji"
|
||||||
@@ -528,6 +529,7 @@ removeAllFollowing: "Tahan semua mengikuti"
|
|||||||
removeAllFollowingDescription: "Batal mengikuti semua akun dari {host}. Mohon jalankan ini ketika instansi sudah tidak ada lagi."
|
removeAllFollowingDescription: "Batal mengikuti semua akun dari {host}. Mohon jalankan ini ketika instansi sudah tidak ada lagi."
|
||||||
userSuspended: "Pengguna ini telah dibekukan."
|
userSuspended: "Pengguna ini telah dibekukan."
|
||||||
userSilenced: "Pengguna ini telah dibungkam."
|
userSilenced: "Pengguna ini telah dibungkam."
|
||||||
|
menu: "Menu"
|
||||||
divider: "Pembagi"
|
divider: "Pembagi"
|
||||||
addItem: "Tambahkan item"
|
addItem: "Tambahkan item"
|
||||||
rooms: "Ruang"
|
rooms: "Ruang"
|
||||||
@@ -760,7 +762,38 @@ middle: "Sedang"
|
|||||||
low: "Rendah"
|
low: "Rendah"
|
||||||
emailNotConfiguredWarning: "Alamat surel tidak disetel."
|
emailNotConfiguredWarning: "Alamat surel tidak disetel."
|
||||||
ratio: "Rasio"
|
ratio: "Rasio"
|
||||||
|
customCss: "Custom CSS"
|
||||||
|
customCssWarn: "Pengaturan ini seharusnya digunakan jika kamu tahu cara kerjanya. Memasukkan nilai yang tidak tepat dapat menyebabkan klien tidak berfungsi semestinya."
|
||||||
global: "Global"
|
global: "Global"
|
||||||
|
squareAvatars: "Tampilkan avatar sebagai persegi"
|
||||||
|
sent: "Kirim"
|
||||||
|
received: "Diterima"
|
||||||
|
searchResult: "Hasil Penelusuran"
|
||||||
|
hashtags: "Tagar"
|
||||||
|
troubleshooting: "Penyelesaian Masalah"
|
||||||
|
useBlurEffect: "Gunakan efek blur pada antarmuka"
|
||||||
|
learnMore: "Pelajari lebih lanjut"
|
||||||
|
misskeyUpdated: "Misskey telah dimutakhirkan!"
|
||||||
|
whatIsNew: "Lihat perubahan pemutakhiran"
|
||||||
|
translate: "Terjemahkan"
|
||||||
|
translatedFrom: "Terjemahkan dari {x}"
|
||||||
|
accountDeletionInProgress: "Penghapusan akun sedang dalam proses"
|
||||||
|
usernameInfo: "Nama yang mengidentifikasikan akun kamu dari yang lain pada server ini. Kamu dapat menggunakan alfabet (a~z, A~Z), digit (0~9) atau garis bawah (_). Username tidak dapat diubah setelahnya."
|
||||||
|
keepCw: "Biarkan Peringatan Konten"
|
||||||
|
_accountDelete:
|
||||||
|
accountDelete: "Hapus akun"
|
||||||
|
mayTakeTime: "Karena penghapusan akun merupakan proses yang berat dan intensif, kemungkinan dapat membutuhkan waktu untuk menyelesaikan tergantung daripada berapa banyak konten yang kamu buat dan berapa banyak berkas yang telah kamu unggah."
|
||||||
|
sendEmail: "Setelah penghapusan akun selesai, pemberitahuan akan dikirimkan ke alamat surel yang terdaftarkan pada akun ini."
|
||||||
|
requestAccountDelete: "Minta penghapusan akun"
|
||||||
|
started: "Penghapusan telah dimulai"
|
||||||
|
inProgress: "Penghapusan sedang dalam proses"
|
||||||
|
_docs:
|
||||||
|
continueReading: "Baca lebih lanjut"
|
||||||
|
features: "Fitur"
|
||||||
|
generalTopics: "Topik umum"
|
||||||
|
advancedTopics: "Topik tingkat lanjut"
|
||||||
|
admin: "Manajemen"
|
||||||
|
translateWarn: "Ini merupakan dokumen terjemahan. Konten di dalamnya kemungkinan dapat berbeda dari yang aslinya."
|
||||||
_ad:
|
_ad:
|
||||||
back: "Kembali"
|
back: "Kembali"
|
||||||
reduceFrequencyOfThisAd: "Tampilkan iklan ini lebih sedikit"
|
reduceFrequencyOfThisAd: "Tampilkan iklan ini lebih sedikit"
|
||||||
@@ -859,6 +892,8 @@ _mfm:
|
|||||||
blurDescription: "Konten dapat diburamkan dengan efek ini. Konten dapat ditampilkan dengan jelas dengan melayangkan kursor tetikus di atasnya."
|
blurDescription: "Konten dapat diburamkan dengan efek ini. Konten dapat ditampilkan dengan jelas dengan melayangkan kursor tetikus di atasnya."
|
||||||
font: "Font"
|
font: "Font"
|
||||||
fontDescription: "Setel font yang ditampilkan untuk konten."
|
fontDescription: "Setel font yang ditampilkan untuk konten."
|
||||||
|
rainbow: "Pelangi"
|
||||||
|
rainbowDescription: "Membuat konten muncul dalam warna pelangi."
|
||||||
_reversi:
|
_reversi:
|
||||||
reversi: "Reversi"
|
reversi: "Reversi"
|
||||||
gameSettings: "Pengaturan permainan"
|
gameSettings: "Pengaturan permainan"
|
||||||
@@ -911,6 +946,9 @@ _channel:
|
|||||||
usersCount: "{n} Partisipan"
|
usersCount: "{n} Partisipan"
|
||||||
notesCount: "terdapat {n} catatan"
|
notesCount: "terdapat {n} catatan"
|
||||||
_menuDisplay:
|
_menuDisplay:
|
||||||
|
sideFull: "Horisontal"
|
||||||
|
sideIcon: "Horisontal (Ikon)"
|
||||||
|
top: "Atas"
|
||||||
hide: "Sembunyikan"
|
hide: "Sembunyikan"
|
||||||
_wordMute:
|
_wordMute:
|
||||||
muteWords: "Kata yang dibisukan"
|
muteWords: "Kata yang dibisukan"
|
||||||
@@ -1122,6 +1160,7 @@ _widgets:
|
|||||||
jobQueue: "Antrian kerja"
|
jobQueue: "Antrian kerja"
|
||||||
serverMetric: "Statistik server"
|
serverMetric: "Statistik server"
|
||||||
aiscript: "Konsol AiScript"
|
aiscript: "Konsol AiScript"
|
||||||
|
aichan: "Ai"
|
||||||
_cw:
|
_cw:
|
||||||
hide: "Sembunyikan"
|
hide: "Sembunyikan"
|
||||||
show: "Lihat konten"
|
show: "Lihat konten"
|
||||||
|
@@ -127,6 +127,7 @@ editWidgets: "Modifica i widget"
|
|||||||
editWidgetsExit: "Modifica fine"
|
editWidgetsExit: "Modifica fine"
|
||||||
customEmojis: "Emoji personalizzati"
|
customEmojis: "Emoji personalizzati"
|
||||||
emoji: "Emoji"
|
emoji: "Emoji"
|
||||||
|
emojis: "Emoji"
|
||||||
emojiName: "Nome dell'emoji"
|
emojiName: "Nome dell'emoji"
|
||||||
emojiUrl: "URL dell'emoji"
|
emojiUrl: "URL dell'emoji"
|
||||||
addEmoji: "Aggiungi un emoji"
|
addEmoji: "Aggiungi un emoji"
|
||||||
@@ -741,6 +742,13 @@ low: "Bassa"
|
|||||||
emailNotConfiguredWarning: "Non hai impostato nessun indirizzo e-mail."
|
emailNotConfiguredWarning: "Non hai impostato nessun indirizzo e-mail."
|
||||||
ratio: "Rapporto"
|
ratio: "Rapporto"
|
||||||
global: "Federata"
|
global: "Federata"
|
||||||
|
sent: "Inviare"
|
||||||
|
hashtags: "Hashtag"
|
||||||
|
troubleshooting: "Risoluzione problemi"
|
||||||
|
_docs:
|
||||||
|
continueReading: "Leggi di più"
|
||||||
|
features: "Funzionalità"
|
||||||
|
admin: "Gestione"
|
||||||
_ad:
|
_ad:
|
||||||
back: "Indietro"
|
back: "Indietro"
|
||||||
reduceFrequencyOfThisAd: "Visualizza questa pubblicità meno spesso"
|
reduceFrequencyOfThisAd: "Visualizza questa pubblicità meno spesso"
|
||||||
@@ -799,6 +807,7 @@ _mfm:
|
|||||||
blur: "Sfocatura"
|
blur: "Sfocatura"
|
||||||
font: "Tipo di carattere"
|
font: "Tipo di carattere"
|
||||||
fontDescription: "Puoi scegliere il tipo di carattere per il contenuto."
|
fontDescription: "Puoi scegliere il tipo di carattere per il contenuto."
|
||||||
|
rainbow: "Arcobaleno"
|
||||||
_reversi:
|
_reversi:
|
||||||
reversi: "Reversi"
|
reversi: "Reversi"
|
||||||
gameSettings: "Impostazioni di gioco"
|
gameSettings: "Impostazioni di gioco"
|
||||||
@@ -1386,12 +1395,12 @@ _notification:
|
|||||||
youWereInvitedToGroup: "Invitat@ al gruppo"
|
youWereInvitedToGroup: "Invitat@ al gruppo"
|
||||||
_types:
|
_types:
|
||||||
all: "Tutto"
|
all: "Tutto"
|
||||||
follow: "Follows"
|
follow: "Nuovə follower"
|
||||||
mention: "Menzioni"
|
mention: "Menzioni"
|
||||||
reply: "Rispondi"
|
reply: "Risposte"
|
||||||
renote: "Rinota"
|
renote: "Rinota"
|
||||||
quote: "Cita"
|
quote: "Cita"
|
||||||
reaction: "Reazione"
|
reaction: "Reazioni"
|
||||||
pollVote: "Voti ricevuti"
|
pollVote: "Voti ricevuti"
|
||||||
receiveFollowRequest: "Richiesta di follow ricevuta"
|
receiveFollowRequest: "Richiesta di follow ricevuta"
|
||||||
followRequestAccepted: "Richiesta di follow accettata"
|
followRequestAccepted: "Richiesta di follow accettata"
|
||||||
|
@@ -128,6 +128,7 @@ editWidgets: "ウィジェットを編集"
|
|||||||
editWidgetsExit: "編集を終了"
|
editWidgetsExit: "編集を終了"
|
||||||
customEmojis: "カスタム絵文字"
|
customEmojis: "カスタム絵文字"
|
||||||
emoji: "絵文字"
|
emoji: "絵文字"
|
||||||
|
emojis: "絵文字"
|
||||||
emojiName: "絵文字名"
|
emojiName: "絵文字名"
|
||||||
emojiUrl: "絵文字画像URL"
|
emojiUrl: "絵文字画像URL"
|
||||||
addEmoji: "絵文字を追加"
|
addEmoji: "絵文字を追加"
|
||||||
@@ -765,6 +766,41 @@ customCss: "カスタムCSS"
|
|||||||
customCssWarn: "この設定は必ず知識のある方が行ってください。不適切な設定を行うとクライアントが正常に使用できなくなる恐れがあります。"
|
customCssWarn: "この設定は必ず知識のある方が行ってください。不適切な設定を行うとクライアントが正常に使用できなくなる恐れがあります。"
|
||||||
global: "グローバル"
|
global: "グローバル"
|
||||||
squareAvatars: "アイコンを四角形で表示"
|
squareAvatars: "アイコンを四角形で表示"
|
||||||
|
sent: "送信"
|
||||||
|
received: "受信"
|
||||||
|
searchResult: "検索結果"
|
||||||
|
hashtags: "ハッシュタグ"
|
||||||
|
troubleshooting: "トラブルシューティング"
|
||||||
|
useBlurEffect: "UIにぼかし効果を使用"
|
||||||
|
learnMore: "詳しく"
|
||||||
|
misskeyUpdated: "Misskeyが更新されました!"
|
||||||
|
whatIsNew: "更新情報を見る"
|
||||||
|
translate: "翻訳"
|
||||||
|
translatedFrom: "{x}から翻訳"
|
||||||
|
accountDeletionInProgress: "アカウントの削除が進行中です"
|
||||||
|
usernameInfo: "サーバー上であなたのアカウントを一意に識別するための名前。アルファベット(a~z, A~Z)、数字(0~9)、およびアンダーバー(_)が使用できます。ユーザー名は後から変更することは出来ません。"
|
||||||
|
aiChanMode: "藍モード"
|
||||||
|
keepCw: "CWを維持する"
|
||||||
|
pubSub: "Pub/Subのアカウント"
|
||||||
|
lastCommunication: "直近の通信"
|
||||||
|
resolved: "解決済み"
|
||||||
|
unresolved: "未解決"
|
||||||
|
|
||||||
|
_accountDelete:
|
||||||
|
accountDelete: "アカウントの削除"
|
||||||
|
mayTakeTime: "アカウントの削除は負荷のかかる処理であるため、作成したコンテンツの数やアップロードしたファイルの数が多いと完了までに時間がかかることがあります。"
|
||||||
|
sendEmail: "アカウントの削除が完了する際は、登録してあったメールアドレス宛に通知を送信します。"
|
||||||
|
requestAccountDelete: "アカウント削除をリクエスト"
|
||||||
|
started: "削除処理が開始されました。"
|
||||||
|
inProgress: "削除が進行中"
|
||||||
|
|
||||||
|
_docs:
|
||||||
|
continueReading: "続きを読む"
|
||||||
|
features: "機能"
|
||||||
|
generalTopics: "一般的なトピック"
|
||||||
|
advancedTopics: "高度なトピック"
|
||||||
|
admin: "管理"
|
||||||
|
translateWarn: "このドキュメントは翻訳されたものです。オリジナルとは内容が異なる場合があります。"
|
||||||
|
|
||||||
_ad:
|
_ad:
|
||||||
back: "戻る"
|
back: "戻る"
|
||||||
@@ -872,6 +908,8 @@ _mfm:
|
|||||||
blurDescription: "内容をぼかすことができます。ポインターを上に乗せるとはっきり見えるようになります。"
|
blurDescription: "内容をぼかすことができます。ポインターを上に乗せるとはっきり見えるようになります。"
|
||||||
font: "フォント"
|
font: "フォント"
|
||||||
fontDescription: "内容のフォントを指定することができます。"
|
fontDescription: "内容のフォントを指定することができます。"
|
||||||
|
rainbow: "レインボー"
|
||||||
|
rainbowDescription: "内容をレインボーにします。"
|
||||||
|
|
||||||
_reversi:
|
_reversi:
|
||||||
reversi: "リバーシ"
|
reversi: "リバーシ"
|
||||||
@@ -1156,6 +1194,7 @@ _widgets:
|
|||||||
jobQueue: "ジョブキュー"
|
jobQueue: "ジョブキュー"
|
||||||
serverMetric: "サーバーメトリクス"
|
serverMetric: "サーバーメトリクス"
|
||||||
aiscript: "AiScriptコンソール"
|
aiscript: "AiScriptコンソール"
|
||||||
|
aichan: "藍"
|
||||||
|
|
||||||
_cw:
|
_cw:
|
||||||
hide: "隠す"
|
hide: "隠す"
|
||||||
|
@@ -7,6 +7,7 @@ search: "探す"
|
|||||||
notifications: "通知"
|
notifications: "通知"
|
||||||
username: "ユーザー名"
|
username: "ユーザー名"
|
||||||
password: "パスワード"
|
password: "パスワード"
|
||||||
|
forgotPassword: "パスワード忘れてん"
|
||||||
fetchingAsApObject: "今ちと連合に照会しとるで"
|
fetchingAsApObject: "今ちと連合に照会しとるで"
|
||||||
ok: "OKや"
|
ok: "OKや"
|
||||||
gotIt: "ほい"
|
gotIt: "ほい"
|
||||||
@@ -127,6 +128,7 @@ editWidgets: "ウィジェットをいじる"
|
|||||||
editWidgetsExit: "編集終ったで"
|
editWidgetsExit: "編集終ったで"
|
||||||
customEmojis: "カスタム絵文字"
|
customEmojis: "カスタム絵文字"
|
||||||
emoji: "絵文字"
|
emoji: "絵文字"
|
||||||
|
emojis: "絵文字"
|
||||||
emojiName: "絵文字名"
|
emojiName: "絵文字名"
|
||||||
emojiUrl: "絵文字画像URL"
|
emojiUrl: "絵文字画像URL"
|
||||||
addEmoji: "絵文字を追加"
|
addEmoji: "絵文字を追加"
|
||||||
@@ -138,6 +140,7 @@ flagAsBotDescription: "もしこのアカウントがプログラムによって
|
|||||||
flagAsCat: "Catやで"
|
flagAsCat: "Catやで"
|
||||||
flagAsCatDescription: "ワレ、猫ちゃんならこのフラグをつけてみ?"
|
flagAsCatDescription: "ワレ、猫ちゃんならこのフラグをつけてみ?"
|
||||||
autoAcceptFollowed: "フォローしとるユーザーからのフォローリクエストを勝手に許可しとく"
|
autoAcceptFollowed: "フォローしとるユーザーからのフォローリクエストを勝手に許可しとく"
|
||||||
|
addAccount: "アカウントを追加"
|
||||||
loginFailed: "ログインに失敗してしもうた…"
|
loginFailed: "ログインに失敗してしもうた…"
|
||||||
showOnRemote: "リモートで見る"
|
showOnRemote: "リモートで見る"
|
||||||
general: "全般"
|
general: "全般"
|
||||||
@@ -277,6 +280,7 @@ emptyDrive: "ドライブにはなんも残っとらん"
|
|||||||
emptyFolder: "ふぉろだーにはなんも残っとらん"
|
emptyFolder: "ふぉろだーにはなんも残っとらん"
|
||||||
unableToDelete: "消そうおもってんけどな、あかんかったわ"
|
unableToDelete: "消そうおもってんけどな、あかんかったわ"
|
||||||
inputNewFileName: "今度のファイル名は何にするん?"
|
inputNewFileName: "今度のファイル名は何にするん?"
|
||||||
|
inputNewDescription: "新しいキャプションを入力しましょ"
|
||||||
inputNewFolderName: "今度のフォルダ名は何にするん?"
|
inputNewFolderName: "今度のフォルダ名は何にするん?"
|
||||||
circularReferenceFolder: "移動先のフォルダーは、移動するフォルダーのサブフォルダーや。"
|
circularReferenceFolder: "移動先のフォルダーは、移動するフォルダーのサブフォルダーや。"
|
||||||
hasChildFilesOrFolders: "このフォルダ、まだなんか入っとるから消されへん"
|
hasChildFilesOrFolders: "このフォルダ、まだなんか入っとるから消されへん"
|
||||||
@@ -647,6 +651,10 @@ high: "高い"
|
|||||||
middle: "中"
|
middle: "中"
|
||||||
low: "低い"
|
low: "低い"
|
||||||
global: "グローバル"
|
global: "グローバル"
|
||||||
|
sent: "送信"
|
||||||
|
hashtags: "ハッシュタグ"
|
||||||
|
_docs:
|
||||||
|
admin: "管理"
|
||||||
_ad:
|
_ad:
|
||||||
back: "戻る"
|
back: "戻る"
|
||||||
_gallery:
|
_gallery:
|
||||||
|
@@ -7,7 +7,9 @@ username: "Isem n umseqdac"
|
|||||||
password: "Awal uffir"
|
password: "Awal uffir"
|
||||||
ok: "IH"
|
ok: "IH"
|
||||||
settings: "Iɣewwaṛen"
|
settings: "Iɣewwaṛen"
|
||||||
|
otherSettings: "Iɣewwaren nniḍen"
|
||||||
profile: "Amaɣnu"
|
profile: "Amaɣnu"
|
||||||
|
signup: "Jerred"
|
||||||
save: "Sekles"
|
save: "Sekles"
|
||||||
delete: "Kkes"
|
delete: "Kkes"
|
||||||
addToList: "Rnu ɣer tebdart"
|
addToList: "Rnu ɣer tebdart"
|
||||||
@@ -27,15 +29,32 @@ followers: "Imeḍfaṛen"
|
|||||||
followsYou: "Yeṭṭafaṛ-ik·em-id"
|
followsYou: "Yeṭṭafaṛ-ik·em-id"
|
||||||
createList: "Snulfu-d tabdart"
|
createList: "Snulfu-d tabdart"
|
||||||
enterListName: "Isem n tebdart"
|
enterListName: "Isem n tebdart"
|
||||||
|
privacy: "Tabaḍnit"
|
||||||
follow: "Ḍfeṛ"
|
follow: "Ḍfeṛ"
|
||||||
you: "Kečči·mmi"
|
you: "Kečči·mmi"
|
||||||
selectList: "Fren tabdart"
|
selectList: "Fren tabdart"
|
||||||
youHaveNoLists: "Ulac ɣur-k·m ula d yiwet n tabdart"
|
youHaveNoLists: "Ulac ɣur-k·m ula d yiwet n tabdart"
|
||||||
|
security: "Taɣellist"
|
||||||
remove: "Kkes"
|
remove: "Kkes"
|
||||||
|
connectService: "Qqen"
|
||||||
userList: "Tibdarin"
|
userList: "Tibdarin"
|
||||||
|
securityKey: "Tasarutt n tɣellist"
|
||||||
|
securityKeyName: "Isem n tsarutt"
|
||||||
|
signinRequired: "Ttxil jerred"
|
||||||
|
signinWith: "Tuqqna s {x}"
|
||||||
|
tapSecurityKey: "Sekcem tasarutt-ik·im n tɣellist"
|
||||||
uiLanguage: "Tutlayt n wegrudem"
|
uiLanguage: "Tutlayt n wegrudem"
|
||||||
|
accountSettings: "Iɣewwaṛen n umiḍan"
|
||||||
|
plugins: "Izegrar"
|
||||||
|
email: "Imayl"
|
||||||
|
emailAddress: "Tansa imayl"
|
||||||
smtpUser: "Isem n umseqdac"
|
smtpUser: "Isem n umseqdac"
|
||||||
smtpPass: "Awal uffir"
|
smtpPass: "Awal uffir"
|
||||||
|
other: "Wiyyaḍ"
|
||||||
|
accountInfo: "Talɣut n umiḍan"
|
||||||
|
emailNotification: "Ilɣa imayl"
|
||||||
|
selectAccount: "Fren amiḍan"
|
||||||
|
accounts: "Imiḍan"
|
||||||
_email:
|
_email:
|
||||||
_follow:
|
_follow:
|
||||||
title: "Yeṭṭafaṛ-ik·em-id"
|
title: "Yeṭṭafaṛ-ik·em-id"
|
||||||
@@ -48,6 +67,8 @@ _theme:
|
|||||||
mention: "Bder"
|
mention: "Bder"
|
||||||
_sfx:
|
_sfx:
|
||||||
notification: "Ilɣuyen"
|
notification: "Ilɣuyen"
|
||||||
|
_permissions:
|
||||||
|
"write:account": "Ẓreg talɣut n umiḍan-ik·im"
|
||||||
_widgets:
|
_widgets:
|
||||||
notifications: "Ilɣuyen"
|
notifications: "Ilɣuyen"
|
||||||
_cw:
|
_cw:
|
||||||
|
@@ -128,6 +128,7 @@ editWidgets: "위젯 편집"
|
|||||||
editWidgetsExit: "편집 종료"
|
editWidgetsExit: "편집 종료"
|
||||||
customEmojis: "커스텀 이모지"
|
customEmojis: "커스텀 이모지"
|
||||||
emoji: "이모지"
|
emoji: "이모지"
|
||||||
|
emojis: "이모지"
|
||||||
emojiName: "이모지 이름"
|
emojiName: "이모지 이름"
|
||||||
emojiUrl: "이모지 URL"
|
emojiUrl: "이모지 URL"
|
||||||
addEmoji: "이모지 추가"
|
addEmoji: "이모지 추가"
|
||||||
@@ -528,6 +529,7 @@ removeAllFollowing: "모든 팔로잉 해제"
|
|||||||
removeAllFollowingDescription: "{host}(으)로부터 모든 팔로잉을 해제합니다. 해당 인스턴스가 더 이상 존재하지 않게 된 경우 등에 실행해 주세요."
|
removeAllFollowingDescription: "{host}(으)로부터 모든 팔로잉을 해제합니다. 해당 인스턴스가 더 이상 존재하지 않게 된 경우 등에 실행해 주세요."
|
||||||
userSuspended: "이 계정은 정지된 상태입니다."
|
userSuspended: "이 계정은 정지된 상태입니다."
|
||||||
userSilenced: "이 계정은 사일런스된 상태입니다."
|
userSilenced: "이 계정은 사일런스된 상태입니다."
|
||||||
|
menu: "메뉴"
|
||||||
divider: "구분선"
|
divider: "구분선"
|
||||||
addItem: "항목 추가"
|
addItem: "항목 추가"
|
||||||
rooms: "방"
|
rooms: "방"
|
||||||
@@ -760,7 +762,37 @@ middle: "보통"
|
|||||||
low: "낮음"
|
low: "낮음"
|
||||||
emailNotConfiguredWarning: "메일 주소가 설정되어 있지 않습니다."
|
emailNotConfiguredWarning: "메일 주소가 설정되어 있지 않습니다."
|
||||||
ratio: "비율"
|
ratio: "비율"
|
||||||
|
customCss: "CSS 사용자화"
|
||||||
|
customCssWarn: "이 설정은 기능을 알고 있는 경우에만 사용해야 합니다. 잘못된 값을 입력하면 클라이언트가 정상적으로 작동하지 않을 수 있습니다."
|
||||||
global: "글로벌"
|
global: "글로벌"
|
||||||
|
squareAvatars: "프로필 아이콘을 사각형으로 표시"
|
||||||
|
sent: "전송"
|
||||||
|
received: "수신"
|
||||||
|
searchResult: "검색 결과"
|
||||||
|
hashtags: "해시태그"
|
||||||
|
troubleshooting: "문제 해결"
|
||||||
|
useBlurEffect: "UI에 흐림 효과 사용"
|
||||||
|
learnMore: "자세히"
|
||||||
|
misskeyUpdated: "Misskey가 업데이트 되었습니다!"
|
||||||
|
whatIsNew: "패치 정보 보기"
|
||||||
|
translate: "번역"
|
||||||
|
translatedFrom: "{x}에서 번역"
|
||||||
|
accountDeletionInProgress: "계정 삭제 작업을 진행하고 있습니다"
|
||||||
|
usernameInfo: "서버상에서 계정을 식별하기 위한 이름. 알파벳(a~z, A~Z), 숫자(0~9) 및 언더바(_)를 사용할 수 있습니다. 사용자명은 나중에 변경할 수 없습니다."
|
||||||
|
_accountDelete:
|
||||||
|
accountDelete: "계정 삭제"
|
||||||
|
mayTakeTime: "계정 삭제는 서버에 부하를 가하기 때문에, 작성한 콘텐츠나 업로드한 파일의 수가 많으면 완료까지 시간이 걸릴 수 있습니다."
|
||||||
|
sendEmail: "계정 삭제가 완료되면 등록된 이메일 주소로 알림을 보냅니다."
|
||||||
|
requestAccountDelete: "계정 삭제 요청"
|
||||||
|
started: "삭제 작업이 시작되었습니다."
|
||||||
|
inProgress: "삭제 진행 중"
|
||||||
|
_docs:
|
||||||
|
continueReading: "계속 읽기"
|
||||||
|
features: "기능"
|
||||||
|
generalTopics: "일반 주제"
|
||||||
|
advancedTopics: "심화 주제"
|
||||||
|
admin: "관리"
|
||||||
|
translateWarn: "이 문서는 번역되었기 때문에 원본과는 내용이 다를 수 있습니다."
|
||||||
_ad:
|
_ad:
|
||||||
back: "뒤로"
|
back: "뒤로"
|
||||||
reduceFrequencyOfThisAd: "이 광고의 표시 빈도 낮추기"
|
reduceFrequencyOfThisAd: "이 광고의 표시 빈도 낮추기"
|
||||||
@@ -859,6 +891,8 @@ _mfm:
|
|||||||
blurDescription: "내용이 흐리게 보입니다. 마우스를 위에 올려두면 내용이 보입니다."
|
blurDescription: "내용이 흐리게 보입니다. 마우스를 위에 올려두면 내용이 보입니다."
|
||||||
font: "폰트"
|
font: "폰트"
|
||||||
fontDescription: "내용의 글꼴을 지정할 수 있습니다."
|
fontDescription: "내용의 글꼴을 지정할 수 있습니다."
|
||||||
|
rainbow: "무지개"
|
||||||
|
rainbowDescription: "내용을 무지개로 표시합니다."
|
||||||
_reversi:
|
_reversi:
|
||||||
reversi: "리버시"
|
reversi: "리버시"
|
||||||
gameSettings: "대국 설정"
|
gameSettings: "대국 설정"
|
||||||
@@ -911,6 +945,9 @@ _channel:
|
|||||||
usersCount: "{n}명 참여 중"
|
usersCount: "{n}명 참여 중"
|
||||||
notesCount: "{n}노트"
|
notesCount: "{n}노트"
|
||||||
_menuDisplay:
|
_menuDisplay:
|
||||||
|
sideFull: "가로"
|
||||||
|
sideIcon: "가로(아이콘)"
|
||||||
|
top: "상단"
|
||||||
hide: "숨기기"
|
hide: "숨기기"
|
||||||
_wordMute:
|
_wordMute:
|
||||||
muteWords: "뮤트할 단어"
|
muteWords: "뮤트할 단어"
|
||||||
|
@@ -128,6 +128,7 @@ editWidgets: "Edytuj widżet"
|
|||||||
editWidgetsExit: "Gotowe"
|
editWidgetsExit: "Gotowe"
|
||||||
customEmojis: "Niestandardowe emoji"
|
customEmojis: "Niestandardowe emoji"
|
||||||
emoji: "Emoji"
|
emoji: "Emoji"
|
||||||
|
emojis: "Emoji"
|
||||||
emojiName: "Nazwa emoji"
|
emojiName: "Nazwa emoji"
|
||||||
emojiUrl: "Adres URL emoji"
|
emojiUrl: "Adres URL emoji"
|
||||||
addEmoji: "Dodaj emoji"
|
addEmoji: "Dodaj emoji"
|
||||||
@@ -735,6 +736,10 @@ low: "Niski"
|
|||||||
emailNotConfiguredWarning: "Nie podano adresu e-mail"
|
emailNotConfiguredWarning: "Nie podano adresu e-mail"
|
||||||
ratio: "Stosunek"
|
ratio: "Stosunek"
|
||||||
global: "Globalna"
|
global: "Globalna"
|
||||||
|
sent: "Wyślij"
|
||||||
|
hashtags: "Hashtag"
|
||||||
|
_docs:
|
||||||
|
admin: "Zarządzanie"
|
||||||
_ad:
|
_ad:
|
||||||
back: "Wróć"
|
back: "Wróć"
|
||||||
reduceFrequencyOfThisAd: "Pokazuj tę reklamę rzadziej"
|
reduceFrequencyOfThisAd: "Pokazuj tę reklamę rzadziej"
|
||||||
|
@@ -128,6 +128,7 @@ editWidgets: "Редактировать виджеты"
|
|||||||
editWidgetsExit: "Готово"
|
editWidgetsExit: "Готово"
|
||||||
customEmojis: "Эмодзи пользователя"
|
customEmojis: "Эмодзи пользователя"
|
||||||
emoji: "Эмодзи"
|
emoji: "Эмодзи"
|
||||||
|
emojis: "Эмодзи"
|
||||||
emojiName: "Название эмодзи"
|
emojiName: "Название эмодзи"
|
||||||
emojiUrl: "URL эмодзи"
|
emojiUrl: "URL эмодзи"
|
||||||
addEmoji: "Добавить эмодзи"
|
addEmoji: "Добавить эмодзи"
|
||||||
@@ -528,6 +529,7 @@ removeAllFollowing: "Удалить всех подписчиков"
|
|||||||
removeAllFollowingDescription: "Отменить все подписки с домена {host}? Пожалуйста, применяйте это действие, если инстанс больше не существует."
|
removeAllFollowingDescription: "Отменить все подписки с домена {host}? Пожалуйста, применяйте это действие, если инстанс больше не существует."
|
||||||
userSuspended: "Эта учётная запись заморожена"
|
userSuspended: "Эта учётная запись заморожена"
|
||||||
userSilenced: "Этот пользователь был заглушен"
|
userSilenced: "Этот пользователь был заглушен"
|
||||||
|
menu: "Меню"
|
||||||
divider: "Линия-разделитель"
|
divider: "Линия-разделитель"
|
||||||
addItem: "Добавить элемент"
|
addItem: "Добавить элемент"
|
||||||
rooms: "Комната"
|
rooms: "Комната"
|
||||||
@@ -760,7 +762,26 @@ middle: "Средне"
|
|||||||
low: "Низкий"
|
low: "Низкий"
|
||||||
emailNotConfiguredWarning: "Не указан адрес электронной почты"
|
emailNotConfiguredWarning: "Не указан адрес электронной почты"
|
||||||
ratio: "Соотношение"
|
ratio: "Соотношение"
|
||||||
|
customCss: "Индивидуальный CSS"
|
||||||
|
customCssWarn: "Используйте эту настройку только если знаете, что делаете. Ошибки здесь чреваты тем, что сайт перестанет нормально работать у вас."
|
||||||
global: "Всеобщая"
|
global: "Всеобщая"
|
||||||
|
squareAvatars: "Квадратные аватарки"
|
||||||
|
sent: "Отправить"
|
||||||
|
received: "Получено"
|
||||||
|
searchResult: "Результаты поиска"
|
||||||
|
hashtags: "Хэштег"
|
||||||
|
troubleshooting: "Разрешение проблем"
|
||||||
|
useBlurEffect: "Размытие в интерфейсе"
|
||||||
|
learnMore: "Подробнее"
|
||||||
|
misskeyUpdated: "Misskey обновился!"
|
||||||
|
whatIsNew: "Что новенького?"
|
||||||
|
_docs:
|
||||||
|
continueReading: "Читать подробнее"
|
||||||
|
features: "Возможности"
|
||||||
|
generalTopics: "Основные темы"
|
||||||
|
advancedTopics: "Дополнительные темы"
|
||||||
|
admin: "Управление"
|
||||||
|
translateWarn: "Это перевод документа. Он может неточно отражать содержимое оригинала."
|
||||||
_ad:
|
_ad:
|
||||||
back: "Выход"
|
back: "Выход"
|
||||||
reduceFrequencyOfThisAd: "Реже показывать эту рекламу"
|
reduceFrequencyOfThisAd: "Реже показывать эту рекламу"
|
||||||
@@ -859,6 +880,8 @@ _mfm:
|
|||||||
blurDescription: "Размывает текст до нечитаемости, будто его поместили за матовое стекло. Наведение указателя мыши на размытый текст возвращает чёткость."
|
blurDescription: "Размывает текст до нечитаемости, будто его поместили за матовое стекло. Наведение указателя мыши на размытый текст возвращает чёткость."
|
||||||
font: "Шрифт"
|
font: "Шрифт"
|
||||||
fontDescription: "Так можно писать произвольным шрифтом."
|
fontDescription: "Так можно писать произвольным шрифтом."
|
||||||
|
rainbow: "Радуга"
|
||||||
|
rainbowDescription: "Заставлять содержимое отображаться в цветах радуги."
|
||||||
_reversi:
|
_reversi:
|
||||||
reversi: "Реверси"
|
reversi: "Реверси"
|
||||||
gameSettings: "Настройки игры"
|
gameSettings: "Настройки игры"
|
||||||
@@ -911,6 +934,9 @@ _channel:
|
|||||||
usersCount: "Участников: {n}"
|
usersCount: "Участников: {n}"
|
||||||
notesCount: "Заметок: {n}"
|
notesCount: "Заметок: {n}"
|
||||||
_menuDisplay:
|
_menuDisplay:
|
||||||
|
sideFull: "Сторона"
|
||||||
|
sideIcon: "Сторона (иконки)"
|
||||||
|
top: "Вверх"
|
||||||
hide: "Спрятать"
|
hide: "Спрятать"
|
||||||
_wordMute:
|
_wordMute:
|
||||||
muteWords: "Скрыть слово"
|
muteWords: "Скрыть слово"
|
||||||
@@ -1122,6 +1148,7 @@ _widgets:
|
|||||||
jobQueue: "Очередь заданий"
|
jobQueue: "Очередь заданий"
|
||||||
serverMetric: "Показатели сервера"
|
serverMetric: "Показатели сервера"
|
||||||
aiscript: "Консоль AiScript"
|
aiscript: "Консоль AiScript"
|
||||||
|
aichan: "Ай"
|
||||||
_cw:
|
_cw:
|
||||||
hide: "Спрятать"
|
hide: "Спрятать"
|
||||||
show: "Показать еще"
|
show: "Показать еще"
|
||||||
|
@@ -127,6 +127,7 @@ editWidgets: "Редагувати віджети"
|
|||||||
editWidgetsExit: "Готово"
|
editWidgetsExit: "Готово"
|
||||||
customEmojis: "Кастомні емоджі"
|
customEmojis: "Кастомні емоджі"
|
||||||
emoji: "Емоджі"
|
emoji: "Емоджі"
|
||||||
|
emojis: "Емоджі"
|
||||||
emojiName: "Назва емоджі"
|
emojiName: "Назва емоджі"
|
||||||
emojiUrl: "URL емодзі"
|
emojiUrl: "URL емодзі"
|
||||||
addEmoji: "Додати емодзі"
|
addEmoji: "Додати емодзі"
|
||||||
@@ -689,6 +690,10 @@ administration: "Управління"
|
|||||||
expiration: "Опитування закінчується"
|
expiration: "Опитування закінчується"
|
||||||
middle: "Середній"
|
middle: "Середній"
|
||||||
global: "Глобальна"
|
global: "Глобальна"
|
||||||
|
sent: "Відправити"
|
||||||
|
hashtags: "Хештеґ"
|
||||||
|
_docs:
|
||||||
|
admin: "Управління"
|
||||||
_ad:
|
_ad:
|
||||||
back: "Назад"
|
back: "Назад"
|
||||||
_gallery:
|
_gallery:
|
||||||
|
@@ -128,6 +128,7 @@ editWidgets: "编辑小工具"
|
|||||||
editWidgetsExit: "完成编辑"
|
editWidgetsExit: "完成编辑"
|
||||||
customEmojis: "自定义表情符号"
|
customEmojis: "自定义表情符号"
|
||||||
emoji: "表情符号"
|
emoji: "表情符号"
|
||||||
|
emojis: "表情符号"
|
||||||
emojiName: "表情符号名称"
|
emojiName: "表情符号名称"
|
||||||
emojiUrl: "表情符号地址"
|
emojiUrl: "表情符号地址"
|
||||||
addEmoji: "添加表情符号"
|
addEmoji: "添加表情符号"
|
||||||
@@ -765,6 +766,37 @@ customCss: "自定义 CSS"
|
|||||||
customCssWarn: "这些设置必须有相关的基础知识,不当的配置可能导致客户端无法正常使用!"
|
customCssWarn: "这些设置必须有相关的基础知识,不当的配置可能导致客户端无法正常使用!"
|
||||||
global: "全局"
|
global: "全局"
|
||||||
squareAvatars: "显示方形头像图标"
|
squareAvatars: "显示方形头像图标"
|
||||||
|
sent: "发送"
|
||||||
|
received: "收取"
|
||||||
|
searchResult: "搜索结果"
|
||||||
|
hashtags: "话题标签"
|
||||||
|
troubleshooting: "故障排除"
|
||||||
|
useBlurEffect: "在UI上使用模糊效果"
|
||||||
|
learnMore: "更多信息"
|
||||||
|
misskeyUpdated: "Misskey更新完成!"
|
||||||
|
whatIsNew: "显示更新信息"
|
||||||
|
translate: "翻译"
|
||||||
|
translatedFrom: "从 {x} 翻译"
|
||||||
|
accountDeletionInProgress: "正在删除账户"
|
||||||
|
usernameInfo: "在服务器上唯一标识您的帐户的名称。您可以使用字母 (a ~ z, A ~ Z)、数字 (0 ~ 9) 和下划线 (_)。用户名以后不能更改。"
|
||||||
|
keepCw: "保留CW"
|
||||||
|
pubSub: "Pub/Sub账户"
|
||||||
|
resolved: "已解决"
|
||||||
|
unresolved: "未解决"
|
||||||
|
_accountDelete:
|
||||||
|
accountDelete: "删除帐户"
|
||||||
|
mayTakeTime: "删除账号是一个性能损耗较大的处理,如果账号持有的内容数量和上传的文件数量较多的话,完成需要花费一段时间。"
|
||||||
|
sendEmail: "账户删除完成后,将向注册的电子邮件地址发送通知。"
|
||||||
|
requestAccountDelete: "请求删除账户"
|
||||||
|
started: "账户删除过程已开始。"
|
||||||
|
inProgress: "正在删除"
|
||||||
|
_docs:
|
||||||
|
continueReading: "继续阅读"
|
||||||
|
features: "特性"
|
||||||
|
generalTopics: "通常提示"
|
||||||
|
advancedTopics: "进阶提示"
|
||||||
|
admin: "管理"
|
||||||
|
translateWarn: "本文档是翻译后的文档。内容可能与原文有所不同。"
|
||||||
_ad:
|
_ad:
|
||||||
back: "返回"
|
back: "返回"
|
||||||
reduceFrequencyOfThisAd: "减少此广告的频率"
|
reduceFrequencyOfThisAd: "减少此广告的频率"
|
||||||
@@ -863,6 +895,8 @@ _mfm:
|
|||||||
blurDescription: "产生模糊效果。将鼠标指针放在上面即可将内容显示出来。"
|
blurDescription: "产生模糊效果。将鼠标指针放在上面即可将内容显示出来。"
|
||||||
font: "字体"
|
font: "字体"
|
||||||
fontDescription: "可以设置内容所使用的字体。"
|
fontDescription: "可以设置内容所使用的字体。"
|
||||||
|
rainbow: "彩虹"
|
||||||
|
rainbowDescription: "用彩虹色来显示内容。"
|
||||||
_reversi:
|
_reversi:
|
||||||
reversi: "黑白棋"
|
reversi: "黑白棋"
|
||||||
gameSettings: "对局设置"
|
gameSettings: "对局设置"
|
||||||
@@ -1129,6 +1163,7 @@ _widgets:
|
|||||||
jobQueue: "作业队列"
|
jobQueue: "作业队列"
|
||||||
serverMetric: "服务器监控"
|
serverMetric: "服务器监控"
|
||||||
aiscript: "AiScript控制台"
|
aiscript: "AiScript控制台"
|
||||||
|
aichan: "蓝"
|
||||||
_cw:
|
_cw:
|
||||||
hide: "隐藏"
|
hide: "隐藏"
|
||||||
show: "查看更多"
|
show: "查看更多"
|
||||||
|
@@ -128,6 +128,7 @@ editWidgets: "編輯小工具"
|
|||||||
editWidgetsExit: "完成"
|
editWidgetsExit: "完成"
|
||||||
customEmojis: "自訂表情符號"
|
customEmojis: "自訂表情符號"
|
||||||
emoji: "表情符號"
|
emoji: "表情符號"
|
||||||
|
emojis: "表情符號"
|
||||||
emojiName: "表情符號名稱"
|
emojiName: "表情符號名稱"
|
||||||
emojiUrl: "表情符號URL"
|
emojiUrl: "表情符號URL"
|
||||||
addEmoji: "加入表情符號"
|
addEmoji: "加入表情符號"
|
||||||
@@ -751,6 +752,10 @@ low: "低"
|
|||||||
emailNotConfiguredWarning: "沒有設定電子郵件地址"
|
emailNotConfiguredWarning: "沒有設定電子郵件地址"
|
||||||
ratio: "%"
|
ratio: "%"
|
||||||
global: "公開"
|
global: "公開"
|
||||||
|
sent: "發送"
|
||||||
|
hashtags: "#tag"
|
||||||
|
_docs:
|
||||||
|
admin: "管理"
|
||||||
_ad:
|
_ad:
|
||||||
back: "返回"
|
back: "返回"
|
||||||
reduceFrequencyOfThisAd: "降低此廣告的頻率 "
|
reduceFrequencyOfThisAd: "降低此廣告的頻率 "
|
||||||
|
182
migration/1629004542760-chart-reindex.ts
Normal file
182
migration/1629004542760-chart-reindex.ts
Normal file
@@ -0,0 +1,182 @@
|
|||||||
|
import {MigrationInterface, QueryRunner} from "typeorm";
|
||||||
|
|
||||||
|
export class chartReindex1629004542760 implements MigrationInterface {
|
||||||
|
name = 'chartReindex1629004542760'
|
||||||
|
|
||||||
|
public async up(queryRunner: QueryRunner): Promise<void> {
|
||||||
|
await queryRunner.query(`DELETE FROM "__chart__active_users" a USING "__chart__active_users" b WHERE a.id < b.id AND ((a.group IS NULL AND b.group IS NULL) OR a.group = b.group) AND a.date = b.date;`);
|
||||||
|
await queryRunner.query(`DELETE FROM "__chart__drive" a USING "__chart__drive" b WHERE a.id < b.id AND ((a.group IS NULL AND b.group IS NULL) OR a.group = b.group) AND a.date = b.date;`);
|
||||||
|
await queryRunner.query(`DELETE FROM "__chart__federation" a USING "__chart__federation" b WHERE a.id < b.id AND ((a.group IS NULL AND b.group IS NULL) OR a.group = b.group) AND a.date = b.date;`);
|
||||||
|
await queryRunner.query(`DELETE FROM "__chart__hashtag" a USING "__chart__hashtag" b WHERE a.id < b.id AND ((a.group IS NULL AND b.group IS NULL) OR a.group = b.group) AND a.date = b.date;`);
|
||||||
|
await queryRunner.query(`DELETE FROM "__chart__instance" a USING "__chart__instance" b WHERE a.id < b.id AND ((a.group IS NULL AND b.group IS NULL) OR a.group = b.group) AND a.date = b.date;`);
|
||||||
|
await queryRunner.query(`DELETE FROM "__chart__network" a USING "__chart__network" b WHERE a.id < b.id AND ((a.group IS NULL AND b.group IS NULL) OR a.group = b.group) AND a.date = b.date;`);
|
||||||
|
await queryRunner.query(`DELETE FROM "__chart__notes" a USING "__chart__notes" b WHERE a.id < b.id AND ((a.group IS NULL AND b.group IS NULL) OR a.group = b.group) AND a.date = b.date;`);
|
||||||
|
await queryRunner.query(`DELETE FROM "__chart__per_user_drive" a USING "__chart__per_user_drive" b WHERE a.id < b.id AND ((a.group IS NULL AND b.group IS NULL) OR a.group = b.group) AND a.date = b.date;`);
|
||||||
|
await queryRunner.query(`DELETE FROM "__chart__per_user_following" a USING "__chart__per_user_following" b WHERE a.id < b.id AND ((a.group IS NULL AND b.group IS NULL) OR a.group = b.group) AND a.date = b.date;`);
|
||||||
|
await queryRunner.query(`DELETE FROM "__chart__per_user_notes" a USING "__chart__per_user_notes" b WHERE a.id < b.id AND ((a.group IS NULL AND b.group IS NULL) OR a.group = b.group) AND a.date = b.date;`);
|
||||||
|
await queryRunner.query(`DELETE FROM "__chart__per_user_reaction" a USING "__chart__per_user_reaction" b WHERE a.id < b.id AND ((a.group IS NULL AND b.group IS NULL) OR a.group = b.group) AND a.date = b.date;`);
|
||||||
|
await queryRunner.query(`DELETE FROM "__chart__test_grouped" a USING "__chart__test_grouped" b WHERE a.id < b.id AND ((a.group IS NULL AND b.group IS NULL) OR a.group = b.group) AND a.date = b.date;`);
|
||||||
|
await queryRunner.query(`DELETE FROM "__chart__test_unique" a USING "__chart__test_unique" b WHERE a.id < b.id AND ((a.group IS NULL AND b.group IS NULL) OR a.group = b.group) AND a.date = b.date;`);
|
||||||
|
await queryRunner.query(`DELETE FROM "__chart__users" a USING "__chart__users" b WHERE a.id < b.id AND ((a.group IS NULL AND b.group IS NULL) OR a.group = b.group) AND a.date = b.date;`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_0ad37b7ef50f4ddc84363d7ccc"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_00ed5f86db1f7efafb1978bf21"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_9a3ed15a30ab7e3a37702e6e08"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_13565815f618a1ff53886c5b28"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_7a170f67425e62a8fabb76c872"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_3313d7288855ec105b5bbf6c21"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_36cb699c49580d4e6c2e6159f9"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_76e87c7bfc5d925fcbba405d84"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_dd907becf76104e4b656659e6b"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_07747a1038c05f532a718fe1de"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_99a7d2faaef84a6f728d714ad6"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_25a97c02003338124b2b75fdbc"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_6b8f34a1a64b06014b6fb66824"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_da8a46ba84ca1d8bb5a29bfb63"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_39ee857ab2f23493037c6b6631"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_a1efd3e0048a5f2793a47360dc"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_7b5da130992ec9df96712d4290"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_0a905b992fecd2b5c3fb98759e"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_42eb716a37d381cdf566192b2b"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_7036f2957151588b813185c794"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_f09d543e3acb16c5976bdb31fa"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_5f86db6492274e07c1a3cdf286"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_e496ca8096d28f6b9b509264dc"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_30bf67687f483ace115c5ca642"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_7af07790712aa3438ff6773f3b"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_4b3593098b6edc9c5afe36b18b"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_b77d4dd9562c3a899d9a286fcd"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_84234bd1abb873f07329681c83"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_55bf20f366979f2436de99206b"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_5048e9daccbbbc6d567bb142d3"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_f7bf4c62059764c2c2bb40fdab"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_8cf3156fd7a6b15c43459c6e3b"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_229a41ad465f9205f1f5703291"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_0c641990ecf47d2545df4edb75"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_234dff3c0b56a6150b95431ab9"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_b14489029e4b3aaf4bba5fb524"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_437bab3c6061d90f6bb65fd2cc"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_bbfa573a8181018851ed0b6357"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_a0cd75442dd10d0643a17c4a49"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_b070a906db04b44c67c6c2144d"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_d41cce6aee1a50bfc062038f9b"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_a319e5dbf47e8a17497623beae"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_845254b3eaf708ae8a6cac3026"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_ed9b95919c672a13008e9487ee"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_337e9599f278bd7537fe30876f"`);
|
||||||
|
await queryRunner.query(`CREATE UNIQUE INDEX "IDX_9a3ed15a30ab7e3a37702e6e08" ON "__chart__active_users" ("date", "group") `);
|
||||||
|
await queryRunner.query(`CREATE UNIQUE INDEX "IDX_60c5c6e7e538c09aa274ecd1cf" ON "__chart__active_users" ("date") WHERE "group" IS NULL`);
|
||||||
|
await queryRunner.query(`CREATE UNIQUE INDEX "IDX_3313d7288855ec105b5bbf6c21" ON "__chart__drive" ("date", "group") `);
|
||||||
|
await queryRunner.query(`CREATE UNIQUE INDEX "IDX_ceab80a6729f8e2e6f5b8a1a3d" ON "__chart__drive" ("date") WHERE "group" IS NULL`);
|
||||||
|
await queryRunner.query(`CREATE UNIQUE INDEX "IDX_dd907becf76104e4b656659e6b" ON "__chart__federation" ("date", "group") `);
|
||||||
|
await queryRunner.query(`CREATE UNIQUE INDEX "IDX_eddfed8fb40305a04c6f941050" ON "__chart__federation" ("date") WHERE "group" IS NULL`);
|
||||||
|
await queryRunner.query(`CREATE UNIQUE INDEX "IDX_25a97c02003338124b2b75fdbc" ON "__chart__hashtag" ("date", "group") `);
|
||||||
|
await queryRunner.query(`CREATE UNIQUE INDEX "IDX_53a3604b939e2b479eb2cfaac8" ON "__chart__hashtag" ("date") WHERE "group" IS NULL`);
|
||||||
|
await queryRunner.query(`CREATE UNIQUE INDEX "IDX_39ee857ab2f23493037c6b6631" ON "__chart__instance" ("date", "group") `);
|
||||||
|
await queryRunner.query(`CREATE UNIQUE INDEX "IDX_8111b817b9818c04d7eb8475b1" ON "__chart__instance" ("date") WHERE "group" IS NULL`);
|
||||||
|
await queryRunner.query(`CREATE UNIQUE INDEX "IDX_0a905b992fecd2b5c3fb98759e" ON "__chart__network" ("date", "group") `);
|
||||||
|
await queryRunner.query(`CREATE UNIQUE INDEX "IDX_2082327b2699ce924fa654afc5" ON "__chart__network" ("date") WHERE "group" IS NULL`);
|
||||||
|
await queryRunner.query(`CREATE UNIQUE INDEX "IDX_f09d543e3acb16c5976bdb31fa" ON "__chart__notes" ("date", "group") `);
|
||||||
|
await queryRunner.query(`CREATE UNIQUE INDEX "IDX_e60c358aaced5aab8900a4af31" ON "__chart__notes" ("date") WHERE "group" IS NULL`);
|
||||||
|
await queryRunner.query(`CREATE UNIQUE INDEX "IDX_30bf67687f483ace115c5ca642" ON "__chart__per_user_drive" ("date", "group") `);
|
||||||
|
await queryRunner.query(`CREATE UNIQUE INDEX "IDX_a9a806d466b314f253a1a611c4" ON "__chart__per_user_drive" ("date") WHERE "group" IS NULL`);
|
||||||
|
await queryRunner.query(`CREATE UNIQUE INDEX "IDX_b77d4dd9562c3a899d9a286fcd" ON "__chart__per_user_following" ("date", "group") `);
|
||||||
|
await queryRunner.query(`CREATE UNIQUE INDEX "IDX_dabbb38a51ab86ee3cab291326" ON "__chart__per_user_following" ("date") WHERE "group" IS NULL`);
|
||||||
|
await queryRunner.query(`CREATE UNIQUE INDEX "IDX_5048e9daccbbbc6d567bb142d3" ON "__chart__per_user_notes" ("date", "group") `);
|
||||||
|
await queryRunner.query(`CREATE UNIQUE INDEX "IDX_583a157ed0cf0ed1b5ec2a833f" ON "__chart__per_user_notes" ("date") WHERE "group" IS NULL`);
|
||||||
|
await queryRunner.query(`CREATE UNIQUE INDEX "IDX_229a41ad465f9205f1f5703291" ON "__chart__per_user_reaction" ("date", "group") `);
|
||||||
|
await queryRunner.query(`CREATE UNIQUE INDEX "IDX_3b7697a96f522d0478972e6d6f" ON "__chart__per_user_reaction" ("date") WHERE "group" IS NULL`);
|
||||||
|
await queryRunner.query(`CREATE UNIQUE INDEX "IDX_b14489029e4b3aaf4bba5fb524" ON "__chart__test_grouped" ("date", "group") `);
|
||||||
|
await queryRunner.query(`CREATE UNIQUE INDEX "IDX_da522b4008a9f5d7743b87ad55" ON "__chart__test_grouped" ("date") WHERE "group" IS NULL`);
|
||||||
|
await queryRunner.query(`CREATE UNIQUE INDEX "IDX_a0cd75442dd10d0643a17c4a49" ON "__chart__test_unique" ("date", "group") `);
|
||||||
|
await queryRunner.query(`CREATE UNIQUE INDEX "IDX_16effb2e888f6763673b579f80" ON "__chart__test_unique" ("date") WHERE "group" IS NULL`);
|
||||||
|
await queryRunner.query(`CREATE UNIQUE INDEX "IDX_a319e5dbf47e8a17497623beae" ON "__chart__test" ("date", "group") `);
|
||||||
|
await queryRunner.query(`CREATE UNIQUE INDEX "IDX_dab383a36f3c9db4a0c9b02cf3" ON "__chart__test" ("date") WHERE "group" IS NULL`);
|
||||||
|
await queryRunner.query(`CREATE UNIQUE INDEX "IDX_337e9599f278bd7537fe30876f" ON "__chart__users" ("date", "group") `);
|
||||||
|
await queryRunner.query(`CREATE UNIQUE INDEX "IDX_66feba81e1795d176d06c0b1e6" ON "__chart__users" ("date") WHERE "group" IS NULL`);
|
||||||
|
}
|
||||||
|
|
||||||
|
public async down(queryRunner: QueryRunner): Promise<void> {
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_66feba81e1795d176d06c0b1e6"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_337e9599f278bd7537fe30876f"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_dab383a36f3c9db4a0c9b02cf3"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_a319e5dbf47e8a17497623beae"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_16effb2e888f6763673b579f80"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_a0cd75442dd10d0643a17c4a49"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_da522b4008a9f5d7743b87ad55"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_b14489029e4b3aaf4bba5fb524"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_3b7697a96f522d0478972e6d6f"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_229a41ad465f9205f1f5703291"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_583a157ed0cf0ed1b5ec2a833f"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_5048e9daccbbbc6d567bb142d3"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_dabbb38a51ab86ee3cab291326"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_b77d4dd9562c3a899d9a286fcd"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_a9a806d466b314f253a1a611c4"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_30bf67687f483ace115c5ca642"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_e60c358aaced5aab8900a4af31"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_f09d543e3acb16c5976bdb31fa"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_2082327b2699ce924fa654afc5"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_0a905b992fecd2b5c3fb98759e"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_8111b817b9818c04d7eb8475b1"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_39ee857ab2f23493037c6b6631"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_53a3604b939e2b479eb2cfaac8"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_25a97c02003338124b2b75fdbc"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_eddfed8fb40305a04c6f941050"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_dd907becf76104e4b656659e6b"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_ceab80a6729f8e2e6f5b8a1a3d"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_3313d7288855ec105b5bbf6c21"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_60c5c6e7e538c09aa274ecd1cf"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_9a3ed15a30ab7e3a37702e6e08"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_a9021cc2e1feb5f72d3db6e9f5"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_f22169eb10657bded6d875ac8f"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_c8cc87bd0f2f4487d17c651fbf"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_754499f9b2642336433769518d"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_315c779174fe8247ab324f036e"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_c5d46cbfda48b1c33ed852e21b"`);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_337e9599f278bd7537fe30876f" ON "__chart__users" ("date", "group") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_ed9b95919c672a13008e9487ee" ON "__chart__users" ("group") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_845254b3eaf708ae8a6cac3026" ON "__chart__users" ("date") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_a319e5dbf47e8a17497623beae" ON "__chart__test" ("date", "group") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_d41cce6aee1a50bfc062038f9b" ON "__chart__test" ("group") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_b070a906db04b44c67c6c2144d" ON "__chart__test" ("date") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_a0cd75442dd10d0643a17c4a49" ON "__chart__test_unique" ("date", "group") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_bbfa573a8181018851ed0b6357" ON "__chart__test_unique" ("group") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_437bab3c6061d90f6bb65fd2cc" ON "__chart__test_unique" ("date") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_b14489029e4b3aaf4bba5fb524" ON "__chart__test_grouped" ("date", "group") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_234dff3c0b56a6150b95431ab9" ON "__chart__test_grouped" ("group") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_0c641990ecf47d2545df4edb75" ON "__chart__test_grouped" ("date") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_229a41ad465f9205f1f5703291" ON "__chart__per_user_reaction" ("date", "group") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_8cf3156fd7a6b15c43459c6e3b" ON "__chart__per_user_reaction" ("group") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_f7bf4c62059764c2c2bb40fdab" ON "__chart__per_user_reaction" ("date") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_5048e9daccbbbc6d567bb142d3" ON "__chart__per_user_notes" ("date", "group") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_55bf20f366979f2436de99206b" ON "__chart__per_user_notes" ("group") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_84234bd1abb873f07329681c83" ON "__chart__per_user_notes" ("date") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_b77d4dd9562c3a899d9a286fcd" ON "__chart__per_user_following" ("date", "group") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_4b3593098b6edc9c5afe36b18b" ON "__chart__per_user_following" ("group") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_7af07790712aa3438ff6773f3b" ON "__chart__per_user_following" ("date") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_30bf67687f483ace115c5ca642" ON "__chart__per_user_drive" ("date", "group") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_e496ca8096d28f6b9b509264dc" ON "__chart__per_user_drive" ("group") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_5f86db6492274e07c1a3cdf286" ON "__chart__per_user_drive" ("date") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_f09d543e3acb16c5976bdb31fa" ON "__chart__notes" ("date", "group") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_7036f2957151588b813185c794" ON "__chart__notes" ("group") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_42eb716a37d381cdf566192b2b" ON "__chart__notes" ("date") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_0a905b992fecd2b5c3fb98759e" ON "__chart__network" ("date", "group") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_7b5da130992ec9df96712d4290" ON "__chart__network" ("group") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_a1efd3e0048a5f2793a47360dc" ON "__chart__network" ("date") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_39ee857ab2f23493037c6b6631" ON "__chart__instance" ("date", "group") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_da8a46ba84ca1d8bb5a29bfb63" ON "__chart__instance" ("group") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_6b8f34a1a64b06014b6fb66824" ON "__chart__instance" ("date") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_25a97c02003338124b2b75fdbc" ON "__chart__hashtag" ("date", "group") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_99a7d2faaef84a6f728d714ad6" ON "__chart__hashtag" ("group") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_07747a1038c05f532a718fe1de" ON "__chart__hashtag" ("date") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_dd907becf76104e4b656659e6b" ON "__chart__federation" ("date", "group") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_76e87c7bfc5d925fcbba405d84" ON "__chart__federation" ("group") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_36cb699c49580d4e6c2e6159f9" ON "__chart__federation" ("date") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_3313d7288855ec105b5bbf6c21" ON "__chart__drive" ("date", "group") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_7a170f67425e62a8fabb76c872" ON "__chart__drive" ("group") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_13565815f618a1ff53886c5b28" ON "__chart__drive" ("date") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_9a3ed15a30ab7e3a37702e6e08" ON "__chart__active_users" ("date", "group") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_00ed5f86db1f7efafb1978bf21" ON "__chart__active_users" ("group") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_0ad37b7ef50f4ddc84363d7ccc" ON "__chart__active_users" ("date") `);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
14
migration/1629024377804-deepl-integration.ts
Normal file
14
migration/1629024377804-deepl-integration.ts
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
import {MigrationInterface, QueryRunner} from "typeorm";
|
||||||
|
|
||||||
|
export class deeplIntegration1629024377804 implements MigrationInterface {
|
||||||
|
name = 'deeplIntegration1629024377804'
|
||||||
|
|
||||||
|
public async up(queryRunner: QueryRunner): Promise<void> {
|
||||||
|
await queryRunner.query(`ALTER TABLE "meta" ADD "deeplAuthKey" character varying(128)`);
|
||||||
|
}
|
||||||
|
|
||||||
|
public async down(queryRunner: QueryRunner): Promise<void> {
|
||||||
|
await queryRunner.query(`ALTER TABLE "meta" DROP COLUMN "deeplAuthKey"`);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
14
migration/1629288472000-fix-channel-userId.ts
Normal file
14
migration/1629288472000-fix-channel-userId.ts
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
import {MigrationInterface, QueryRunner} from "typeorm";
|
||||||
|
|
||||||
|
export class fixChannelUserId1629288472000 implements MigrationInterface {
|
||||||
|
name = 'fixChannelUserId1629288472000'
|
||||||
|
|
||||||
|
public async up(queryRunner: QueryRunner): Promise<void> {
|
||||||
|
await queryRunner.query(`ALTER TABLE "channel" ALTER COLUMN "userId" DROP NOT NULL;`);
|
||||||
|
}
|
||||||
|
|
||||||
|
public async down(queryRunner: QueryRunner): Promise<void> {
|
||||||
|
await queryRunner.query(`ALTER TABLE "channel" ALTER COLUMN "userId" SET NOT NULL;`);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
15
migration/1629512953000-user-is-deleted.ts
Normal file
15
migration/1629512953000-user-is-deleted.ts
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
import {MigrationInterface, QueryRunner} from "typeorm";
|
||||||
|
|
||||||
|
export class isUserDeleted1629512953000 implements MigrationInterface {
|
||||||
|
name = 'isUserDeleted1629512953000'
|
||||||
|
|
||||||
|
public async up(queryRunner: QueryRunner): Promise<void> {
|
||||||
|
await queryRunner.query(`ALTER TABLE "user" ADD "isDeleted" boolean NOT NULL DEFAULT false`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "user"."isDeleted" IS 'Whether the User is deleted.'`);
|
||||||
|
}
|
||||||
|
|
||||||
|
public async down(queryRunner: QueryRunner): Promise<void> {
|
||||||
|
await queryRunner.query(`ALTER TABLE "user" DROP COLUMN "isDeleted"`);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
14
migration/1629778475000-deepl-integration2.ts
Normal file
14
migration/1629778475000-deepl-integration2.ts
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
import {MigrationInterface, QueryRunner} from "typeorm";
|
||||||
|
|
||||||
|
export class deeplIntegration21629778475000 implements MigrationInterface {
|
||||||
|
name = 'deeplIntegration21629778475000'
|
||||||
|
|
||||||
|
public async up(queryRunner: QueryRunner): Promise<void> {
|
||||||
|
await queryRunner.query(`ALTER TABLE "meta" ADD "deeplIsPro" boolean NOT NULL DEFAULT false`);
|
||||||
|
}
|
||||||
|
|
||||||
|
public async down(queryRunner: QueryRunner): Promise<void> {
|
||||||
|
await queryRunner.query(`ALTER TABLE "meta" DROP COLUMN "deeplIsPro"`);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
1
misskey-assets
Submodule
1
misskey-assets
Submodule
Submodule misskey-assets added at 0179793ec8
132
package.json
132
package.json
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "misskey",
|
"name": "misskey",
|
||||||
"author": "syuilo <syuilotan@yahoo.co.jp>",
|
"author": "syuilo <syuilotan@yahoo.co.jp>",
|
||||||
"version": "12.84.0",
|
"version": "12.90.0",
|
||||||
"codename": "indigo",
|
"codename": "indigo",
|
||||||
"repository": {
|
"repository": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
@@ -10,7 +10,8 @@
|
|||||||
"main": "./index.js",
|
"main": "./index.js",
|
||||||
"private": true,
|
"private": true,
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"start": "node ./index.js",
|
"start": "node --experimental-json-modules ./index.js",
|
||||||
|
"start:test": "cross-env NODE_ENV=test node --experimental-json-modules ./index.js",
|
||||||
"init": "npm run migrate",
|
"init": "npm run migrate",
|
||||||
"ormconfig": "node ./built/ormconfig.js",
|
"ormconfig": "node ./built/ormconfig.js",
|
||||||
"migrate": "ts-node ./node_modules/typeorm/cli.js migration:run",
|
"migrate": "ts-node ./node_modules/typeorm/cli.js migration:run",
|
||||||
@@ -26,6 +27,9 @@
|
|||||||
"clean": "gulp clean",
|
"clean": "gulp clean",
|
||||||
"cleanall": "gulp cleanall",
|
"cleanall": "gulp cleanall",
|
||||||
"lint": "tslint 'src/**/*.ts'",
|
"lint": "tslint 'src/**/*.ts'",
|
||||||
|
"cy:open": "cypress open",
|
||||||
|
"cy:run": "cypress run",
|
||||||
|
"e2e": "start-server-and-test start:test http://localhost cy:run",
|
||||||
"test": "cross-env TS_NODE_FILES=true TS_NODE_TRANSPILE_ONLY=true TS_NODE_PROJECT=\"./test/tsconfig.json\" mocha",
|
"test": "cross-env TS_NODE_FILES=true TS_NODE_TRANSPILE_ONLY=true TS_NODE_PROJECT=\"./test/tsconfig.json\" mocha",
|
||||||
"format": "gulp format"
|
"format": "gulp format"
|
||||||
},
|
},
|
||||||
@@ -34,7 +38,6 @@
|
|||||||
"lodash": "^4.17.21"
|
"lodash": "^4.17.21"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@babel/plugin-transform-runtime": "7.14.5",
|
|
||||||
"@elastic/elasticsearch": "7.11.0",
|
"@elastic/elasticsearch": "7.11.0",
|
||||||
"@koa/cors": "3.1.0",
|
"@koa/cors": "3.1.0",
|
||||||
"@koa/multer": "3.0.0",
|
"@koa/multer": "3.0.0",
|
||||||
@@ -44,7 +47,7 @@
|
|||||||
"@sinonjs/fake-timers": "7.1.2",
|
"@sinonjs/fake-timers": "7.1.2",
|
||||||
"@syuilo/aiscript": "0.11.1",
|
"@syuilo/aiscript": "0.11.1",
|
||||||
"@types/bcryptjs": "2.4.2",
|
"@types/bcryptjs": "2.4.2",
|
||||||
"@types/bull": "3.15.2",
|
"@types/bull": "3.15.3",
|
||||||
"@types/cbor": "6.0.0",
|
"@types/cbor": "6.0.0",
|
||||||
"@types/dateformat": "3.0.1",
|
"@types/dateformat": "3.0.1",
|
||||||
"@types/escape-regexp": "0.0.0",
|
"@types/escape-regexp": "0.0.0",
|
||||||
@@ -57,8 +60,8 @@
|
|||||||
"@types/jsonld": "1.5.6",
|
"@types/jsonld": "1.5.6",
|
||||||
"@types/katex": "0.11.1",
|
"@types/katex": "0.11.1",
|
||||||
"@types/koa": "2.13.4",
|
"@types/koa": "2.13.4",
|
||||||
"@types/koa-bodyparser": "4.3.2",
|
"@types/koa-bodyparser": "4.3.3",
|
||||||
"@types/koa-cors": "0.0.1",
|
"@types/koa-cors": "0.0.2",
|
||||||
"@types/koa-favicon": "2.0.21",
|
"@types/koa-favicon": "2.0.21",
|
||||||
"@types/koa-logger": "3.1.1",
|
"@types/koa-logger": "3.1.1",
|
||||||
"@types/koa-mount": "4.0.0",
|
"@types/koa-mount": "4.0.0",
|
||||||
@@ -68,10 +71,10 @@
|
|||||||
"@types/koa__multer": "2.0.3",
|
"@types/koa__multer": "2.0.3",
|
||||||
"@types/koa__router": "8.0.7",
|
"@types/koa__router": "8.0.7",
|
||||||
"@types/markdown-it": "12.0.3",
|
"@types/markdown-it": "12.0.3",
|
||||||
"@types/matter-js": "0.17.3",
|
"@types/matter-js": "0.17.5",
|
||||||
"@types/mocha": "8.2.3",
|
"@types/mocha": "8.2.3",
|
||||||
"@types/node": "16.3.3",
|
"@types/node": "16.6.2",
|
||||||
"@types/node-fetch": "2.5.11",
|
"@types/node-fetch": "2.5.12",
|
||||||
"@types/nodemailer": "6.4.4",
|
"@types/nodemailer": "6.4.4",
|
||||||
"@types/nprogress": "0.2.0",
|
"@types/nprogress": "0.2.0",
|
||||||
"@types/oauth": "0.9.1",
|
"@types/oauth": "0.9.1",
|
||||||
@@ -86,9 +89,9 @@
|
|||||||
"@types/redis": "2.8.31",
|
"@types/redis": "2.8.31",
|
||||||
"@types/rename": "1.0.4",
|
"@types/rename": "1.0.4",
|
||||||
"@types/request-stats": "3.0.0",
|
"@types/request-stats": "3.0.0",
|
||||||
"@types/rimraf": "3.0.1",
|
"@types/rimraf": "3.0.2",
|
||||||
"@types/seedrandom": "2.4.28",
|
"@types/seedrandom": "2.4.28",
|
||||||
"@types/sharp": "0.28.4",
|
"@types/sharp": "0.28.5",
|
||||||
"@types/sinonjs__fake-timers": "6.0.3",
|
"@types/sinonjs__fake-timers": "6.0.3",
|
||||||
"@types/speakeasy": "2.0.6",
|
"@types/speakeasy": "2.0.6",
|
||||||
"@types/throttle-debounce": "2.1.0",
|
"@types/throttle-debounce": "2.1.0",
|
||||||
@@ -98,40 +101,40 @@
|
|||||||
"@types/web-push": "3.3.2",
|
"@types/web-push": "3.3.2",
|
||||||
"@types/webpack": "5.28.0",
|
"@types/webpack": "5.28.0",
|
||||||
"@types/webpack-stream": "3.2.12",
|
"@types/webpack-stream": "3.2.12",
|
||||||
"@types/websocket": "1.0.3",
|
"@types/websocket": "1.0.4",
|
||||||
"@types/ws": "7.4.6",
|
"@types/ws": "7.4.7",
|
||||||
"@typescript-eslint/parser": "4.28.3",
|
"@typescript-eslint/parser": "4.29.2",
|
||||||
"@vue/compiler-sfc": "3.2.0-beta.2",
|
"@vue/compiler-sfc": "3.2.4",
|
||||||
"abort-controller": "3.0.0",
|
"abort-controller": "3.0.0",
|
||||||
"apexcharts": "3.27.2",
|
"apexcharts": "3.27.3",
|
||||||
"autobind-decorator": "2.4.0",
|
"autobind-decorator": "2.4.0",
|
||||||
"autosize": "4.0.4",
|
"autosize": "4.0.4",
|
||||||
"autwh": "0.1.0",
|
"autwh": "0.1.0",
|
||||||
"aws-sdk": "2.948.0",
|
"aws-sdk": "2.966.0",
|
||||||
"bcryptjs": "2.4.3",
|
"bcryptjs": "2.4.3",
|
||||||
"blurhash": "1.1.3",
|
"blurhash": "1.1.4",
|
||||||
"broadcast-channel": "3.7.0",
|
"broadcast-channel": "4.2.0",
|
||||||
"bull": "3.26.0",
|
"bull": "3.28.1",
|
||||||
|
"cacheable-lookup": "6.0.0",
|
||||||
"cafy": "15.2.1",
|
"cafy": "15.2.1",
|
||||||
"cbor": "7.0.6",
|
"cbor": "8.0.0",
|
||||||
"chalk": "4.1.1",
|
"chalk": "4.1.2",
|
||||||
"chart.js": "2.9.4",
|
"chart.js": "2.9.4",
|
||||||
"cli-highlight": "2.1.11",
|
"cli-highlight": "2.1.11",
|
||||||
"commander": "7.2.0",
|
"commander": "8.1.0",
|
||||||
"concurrently": "6.2.0",
|
"compare-versions": "3.6.0",
|
||||||
|
"concurrently": "6.2.1",
|
||||||
"content-disposition": "0.5.3",
|
"content-disposition": "0.5.3",
|
||||||
"core-js": "3.15.2",
|
|
||||||
"crc-32": "1.2.0",
|
"crc-32": "1.2.0",
|
||||||
"css-loader": "6.0.0",
|
"css-loader": "6.2.0",
|
||||||
"cssnano": "5.0.6",
|
"cssnano": "5.0.8",
|
||||||
"dateformat": "4.5.1",
|
"dateformat": "4.5.1",
|
||||||
"diskusage": "1.1.3",
|
|
||||||
"escape-regexp": "0.0.1",
|
"escape-regexp": "0.0.1",
|
||||||
"eslint": "7.30.0",
|
"eslint": "7.32.0",
|
||||||
"eslint-plugin-vue": "7.13.0",
|
"eslint-plugin-vue": "7.16.0",
|
||||||
"eventemitter3": "4.0.7",
|
"eventemitter3": "4.0.7",
|
||||||
"feed": "4.2.2",
|
"feed": "4.2.2",
|
||||||
"file-type": "16.5.1",
|
"file-type": "16.5.3",
|
||||||
"fluent-ffmpeg": "2.1.2",
|
"fluent-ffmpeg": "2.1.2",
|
||||||
"glob": "7.1.7",
|
"glob": "7.1.7",
|
||||||
"got": "11.8.2",
|
"got": "11.8.2",
|
||||||
@@ -141,22 +144,19 @@
|
|||||||
"gulp-replace": "1.1.3",
|
"gulp-replace": "1.1.3",
|
||||||
"gulp-terser": "2.0.1",
|
"gulp-terser": "2.0.1",
|
||||||
"gulp-tslint": "8.1.4",
|
"gulp-tslint": "8.1.4",
|
||||||
"hard-source-webpack-plugin": "0.13.1",
|
"hpagent": "0.1.2",
|
||||||
"html-minifier": "4.0.0",
|
|
||||||
"http-proxy-agent": "4.0.1",
|
|
||||||
"http-signature": "1.3.5",
|
"http-signature": "1.3.5",
|
||||||
"https-proxy-agent": "5.0.0",
|
"idb-keyval": "5.1.3",
|
||||||
"idb-keyval": "5.0.6",
|
|
||||||
"insert-text-at-cursor": "0.3.0",
|
"insert-text-at-cursor": "0.3.0",
|
||||||
"is-root": "2.1.0",
|
"ip-cidr": "3.0.4",
|
||||||
"is-svg": "4.3.1",
|
"is-svg": "4.3.1",
|
||||||
"js-yaml": "4.1.0",
|
"js-yaml": "4.1.0",
|
||||||
"jsdom": "16.6.0",
|
"jsdom": "16.7.0",
|
||||||
"json5": "2.2.0",
|
"json5": "2.2.0",
|
||||||
"json5-loader": "4.0.1",
|
"json5-loader": "4.0.1",
|
||||||
"jsonld": "5.2.0",
|
"jsonld": "5.2.0",
|
||||||
"jsrsasign": "8.0.20",
|
"jsrsasign": "8.0.20",
|
||||||
"katex": "0.13.11",
|
"katex": "0.13.13",
|
||||||
"koa": "2.13.1",
|
"koa": "2.13.1",
|
||||||
"koa-bodyparser": "4.3.0",
|
"koa-bodyparser": "4.3.0",
|
||||||
"koa-favicon": "2.1.0",
|
"koa-favicon": "2.1.0",
|
||||||
@@ -167,30 +167,27 @@
|
|||||||
"koa-slow": "2.1.0",
|
"koa-slow": "2.1.0",
|
||||||
"koa-views": "7.0.1",
|
"koa-views": "7.0.1",
|
||||||
"langmap": "0.0.16",
|
"langmap": "0.0.16",
|
||||||
"lookup-dns-cache": "2.1.0",
|
"markdown-it": "12.2.0",
|
||||||
"markdown-it": "12.1.0",
|
|
||||||
"markdown-it-anchor": "7.1.0",
|
"markdown-it-anchor": "7.1.0",
|
||||||
"matter-js": "0.17.1",
|
"matter-js": "0.17.1",
|
||||||
"mfm-js": "0.19.0",
|
"mfm-js": "0.19.0",
|
||||||
"misskey-js": "0.0.6",
|
"misskey-js": "0.0.6",
|
||||||
"mocha": "8.4.0",
|
"mocha": "8.4.0",
|
||||||
"moji": "0.5.1",
|
|
||||||
"ms": "2.1.3",
|
"ms": "2.1.3",
|
||||||
"multer": "1.4.2",
|
"multer": "1.4.3",
|
||||||
"nested-property": "4.0.0",
|
"nested-property": "4.0.0",
|
||||||
"node-fetch": "2.6.1",
|
"node-fetch": "2.6.1",
|
||||||
"nodemailer": "6.6.3",
|
"nodemailer": "6.6.3",
|
||||||
"object-assign-deep": "0.4.0",
|
|
||||||
"os-utils": "0.0.14",
|
"os-utils": "0.0.14",
|
||||||
"parse5": "6.0.1",
|
"parse5": "6.0.1",
|
||||||
"pg": "8.6.0",
|
"pg": "8.7.1",
|
||||||
"portscanner": "2.2.0",
|
"portscanner": "2.2.0",
|
||||||
"postcss": "8.3.5",
|
"postcss": "8.3.6",
|
||||||
"postcss-loader": "6.1.1",
|
"postcss-loader": "6.1.1",
|
||||||
"prismjs": "1.24.1",
|
"prismjs": "1.24.1",
|
||||||
|
"private-ip": "2.2.1",
|
||||||
"probe-image-size": "7.2.1",
|
"probe-image-size": "7.2.1",
|
||||||
"promise-limit": "2.7.0",
|
"promise-limit": "2.7.0",
|
||||||
"promise-sequential": "1.1.1",
|
|
||||||
"pug": "3.0.2",
|
"pug": "3.0.2",
|
||||||
"punycode": "2.1.1",
|
"punycode": "2.1.1",
|
||||||
"pureimage": "0.3.2",
|
"pureimage": "0.3.2",
|
||||||
@@ -198,67 +195,62 @@
|
|||||||
"random-seed": "0.3.0",
|
"random-seed": "0.3.0",
|
||||||
"ratelimiter": "3.4.1",
|
"ratelimiter": "3.4.1",
|
||||||
"re2": "1.16.0",
|
"re2": "1.16.0",
|
||||||
"reconnecting-websocket": "4.4.0",
|
|
||||||
"redis": "3.1.2",
|
"redis": "3.1.2",
|
||||||
"redis-lock": "0.1.4",
|
"redis-lock": "0.1.4",
|
||||||
"reflect-metadata": "0.1.13",
|
"reflect-metadata": "0.1.13",
|
||||||
"regenerator-runtime": "0.13.7",
|
|
||||||
"rename": "1.0.4",
|
"rename": "1.0.4",
|
||||||
"request-stats": "3.0.0",
|
"request-stats": "3.0.0",
|
||||||
"require-all": "3.0.0",
|
"require-all": "3.0.0",
|
||||||
"rimraf": "3.0.2",
|
"rimraf": "3.0.2",
|
||||||
"rndstr": "1.0.0",
|
"rndstr": "1.0.0",
|
||||||
"s-age": "1.1.2",
|
"s-age": "1.1.2",
|
||||||
"sass": "1.35.2",
|
"sass": "1.38.0",
|
||||||
"sass-loader": "12.1.0",
|
"sass-loader": "12.1.0",
|
||||||
"seedrandom": "3.0.5",
|
"seedrandom": "3.0.5",
|
||||||
"sharp": "0.28.3",
|
"sharp": "0.29.0",
|
||||||
"speakeasy": "2.0.0",
|
"speakeasy": "2.0.0",
|
||||||
"stringz": "2.1.0",
|
"stringz": "2.1.0",
|
||||||
"style-loader": "3.1.0",
|
"style-loader": "3.2.1",
|
||||||
"summaly": "2.4.0",
|
"summaly": "2.4.1",
|
||||||
"syslog-pro": "1.0.0",
|
"syslog-pro": "1.0.0",
|
||||||
"systeminformation": "5.7.7",
|
"systeminformation": "5.8.0",
|
||||||
"syuilo-password-strength": "0.0.1",
|
"syuilo-password-strength": "0.0.1",
|
||||||
"textarea-caret": "3.1.0",
|
"textarea-caret": "3.1.0",
|
||||||
"three": "0.117.1",
|
"three": "0.117.1",
|
||||||
"throttle-debounce": "3.0.1",
|
"throttle-debounce": "3.0.1",
|
||||||
"tinycolor2": "1.4.2",
|
"tinycolor2": "1.4.2",
|
||||||
"tmp": "0.2.1",
|
"tmp": "0.2.1",
|
||||||
"ts-loader": "9.2.3",
|
"ts-loader": "9.2.5",
|
||||||
"ts-node": "10.1.0",
|
"ts-node": "10.2.1",
|
||||||
"tsc-alias": "1.3.7",
|
"tsc-alias": "1.3.9",
|
||||||
"tsconfig-paths": "3.10.1",
|
"tsconfig-paths": "3.10.1",
|
||||||
"tslint": "6.1.3",
|
"tslint": "6.1.3",
|
||||||
"tslint-sonarts": "1.9.0",
|
"tslint-sonarts": "1.9.0",
|
||||||
"twemoji-parser": "13.1.0",
|
"twemoji-parser": "13.1.0",
|
||||||
"typeorm": "0.2.32",
|
"typeorm": "0.2.37",
|
||||||
"typescript": "4.3.5",
|
"typescript": "4.3.5",
|
||||||
"ulid": "2.3.0",
|
"ulid": "2.3.0",
|
||||||
"uuid": "8.3.2",
|
"uuid": "8.3.2",
|
||||||
"v-debounce": "0.1.2",
|
"v-debounce": "0.1.2",
|
||||||
"vanilla-tilt": "1.7.0",
|
"vue": "3.2.4",
|
||||||
"vue": "3.2.0-beta.2",
|
"vue-loader": "16.5.0",
|
||||||
"vue-color": "2.8.1",
|
|
||||||
"vue-json-pretty": "1.8.1",
|
|
||||||
"vue-loader": "16.3.1",
|
|
||||||
"vue-prism-editor": "2.0.0-alpha.2",
|
"vue-prism-editor": "2.0.0-alpha.2",
|
||||||
"vue-router": "4.0.5",
|
"vue-router": "4.0.5",
|
||||||
"vue-style-loader": "4.1.3",
|
"vue-style-loader": "4.1.3",
|
||||||
"vue-svg-loader": "0.17.0-beta.2",
|
"vue-svg-loader": "0.17.0-beta.2",
|
||||||
"vuedraggable": "4.0.1",
|
"vuedraggable": "4.0.1",
|
||||||
"web-push": "3.4.5",
|
"web-push": "3.4.5",
|
||||||
"webpack": "5.45.1",
|
"webpack": "5.51.0",
|
||||||
"webpack-cli": "4.7.2",
|
"webpack-cli": "4.8.0",
|
||||||
"websocket": "1.0.34",
|
"websocket": "1.0.34",
|
||||||
"ws": "7.5.3",
|
"ws": "8.2.0",
|
||||||
"xev": "2.0.1"
|
"xev": "2.0.1"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@redocly/openapi-core": "1.0.0-beta.44",
|
"@redocly/openapi-core": "1.0.0-beta.54",
|
||||||
"@types/chai": "4.2.16",
|
|
||||||
"@types/fluent-ffmpeg": "2.1.17",
|
"@types/fluent-ffmpeg": "2.1.17",
|
||||||
"chai": "4.3.4",
|
"cross-env": "7.0.3",
|
||||||
"cross-env": "7.0.3"
|
"cypress": "8.3.0",
|
||||||
|
"start-server-and-test": "1.13.1"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
7
src/@types/is-root.d.ts
vendored
7
src/@types/is-root.d.ts
vendored
@@ -1,7 +0,0 @@
|
|||||||
declare module 'is-root' {
|
|
||||||
function isRoot(): boolean;
|
|
||||||
|
|
||||||
namespace isRoot {} // Hack
|
|
||||||
|
|
||||||
export = isRoot;
|
|
||||||
}
|
|
9
src/@types/lookup-dns-cache.d.ts
vendored
9
src/@types/lookup-dns-cache.d.ts
vendored
@@ -1,9 +0,0 @@
|
|||||||
declare module 'lookup-dns-cache' {
|
|
||||||
import { LookupOneOptions, LookupAllOptions, LookupOptions, LookupAddress } from 'dns';
|
|
||||||
|
|
||||||
function lookup(hostname: string, family: number, callback: (err: NodeJS.ErrnoException | null, address: string, family: number) => void): void;
|
|
||||||
function lookup(hostname: string, options: LookupOneOptions, callback: (err: NodeJS.ErrnoException | null, address: string, family: number) => void): void;
|
|
||||||
function lookup(hostname: string, options: LookupAllOptions, callback: (err: NodeJS.ErrnoException | null, addresses: LookupAddress[]) => void): void;
|
|
||||||
function lookup(hostname: string, options: LookupOptions, callback: (err: NodeJS.ErrnoException | null, address: string | LookupAddress[], family: number) => void): void;
|
|
||||||
function lookup(hostname: string, callback: (err: NodeJS.ErrnoException | null, address: string, family: number) => void): void;
|
|
||||||
}
|
|
27
src/argv.ts
27
src/argv.ts
@@ -1,24 +1,23 @@
|
|||||||
import { Command } from 'commander';
|
import { Command } from 'commander';
|
||||||
import config from '@/config';
|
import config from '@/config/index';
|
||||||
|
|
||||||
const program = new Command();
|
const program = new Command();
|
||||||
|
|
||||||
program
|
program.version(config.version);
|
||||||
.version(config.version)
|
program.option('--no-daemons', 'Disable daemon processes (for debbuging)');
|
||||||
.option('--no-daemons', 'Disable daemon processes (for debbuging)')
|
program.option('--disable-clustering', 'Disable clustering');
|
||||||
.option('--disable-clustering', 'Disable clustering')
|
program.option('--only-server', 'Run server only (without job queue processing)');
|
||||||
.option('--only-server', 'Run server only (without job queue processing)')
|
program.option('--only-queue', 'Pocessing job queue only (without server)');
|
||||||
.option('--only-queue', 'Pocessing job queue only (without server)')
|
program.option('--quiet', 'Suppress all logs');
|
||||||
.option('--quiet', 'Suppress all logs')
|
program.option('--verbose', 'Enable all logs');
|
||||||
.option('--verbose', 'Enable all logs')
|
program.option('--with-log-time', 'Include timestamp for each logs');
|
||||||
.option('--with-log-time', 'Include timestamp for each logs')
|
program.option('--slow', 'Delay all requests (for debbuging)');
|
||||||
.option('--slow', 'Delay all requests (for debbuging)')
|
program.option('--color', 'This option is a dummy for some external program\'s (e.g. forever) issue.');
|
||||||
.option('--color', 'This option is a dummy for some external program\'s (e.g. forever) issue.')
|
program.parse(process.argv);
|
||||||
.parse(process.argv);
|
|
||||||
|
|
||||||
if (process.env.MK_ONLY_QUEUE) program.onlyQueue = true;
|
if (process.env.MK_ONLY_QUEUE) program.onlyQueue = true;
|
||||||
if (process.env.NODE_ENV === 'test') program.disableClustering = true;
|
if (process.env.NODE_ENV === 'test') program.disableClustering = true;
|
||||||
if (process.env.NODE_ENV === 'test') program.quiet = true;
|
//if (process.env.NODE_ENV === 'test') program.quiet = true;
|
||||||
if (process.env.NODE_ENV === 'test') program.noDaemons = true;
|
if (process.env.NODE_ENV === 'test') program.noDaemons = true;
|
||||||
|
|
||||||
export { program };
|
export { program };
|
||||||
|
@@ -2,7 +2,7 @@ import * as cluster from 'cluster';
|
|||||||
import * as chalk from 'chalk';
|
import * as chalk from 'chalk';
|
||||||
import Xev from 'xev';
|
import Xev from 'xev';
|
||||||
|
|
||||||
import Logger from '../services/logger';
|
import Logger from '@/services/logger';
|
||||||
import { program } from '../argv';
|
import { program } from '../argv';
|
||||||
|
|
||||||
// for typeorm
|
// for typeorm
|
||||||
|
@@ -1,18 +1,25 @@
|
|||||||
|
import * as fs from 'fs';
|
||||||
|
import { fileURLToPath } from 'url';
|
||||||
|
import { dirname } from 'path';
|
||||||
import * as os from 'os';
|
import * as os from 'os';
|
||||||
import * as cluster from 'cluster';
|
import * as cluster from 'cluster';
|
||||||
import * as chalk from 'chalk';
|
import * as chalk from 'chalk';
|
||||||
import * as portscanner from 'portscanner';
|
import * as portscanner from 'portscanner';
|
||||||
import * as isRoot from 'is-root';
|
|
||||||
import { getConnection } from 'typeorm';
|
import { getConnection } from 'typeorm';
|
||||||
|
|
||||||
import Logger from '../services/logger';
|
import Logger from '@/services/logger';
|
||||||
import loadConfig from '@/config/load';
|
import loadConfig from '@/config/load';
|
||||||
import { Config } from '@/config/types';
|
import { Config } from '@/config/types';
|
||||||
import { lessThan } from '../prelude/array';
|
import { lessThan } from '@/prelude/array';
|
||||||
import { program } from '../argv';
|
import { program } from '../argv';
|
||||||
import { showMachineInfo } from '@/misc/show-machine-info';
|
import { showMachineInfo } from '@/misc/show-machine-info';
|
||||||
import { initDb } from '../db/postgre';
|
import { initDb } from '../db/postgre';
|
||||||
const meta = require('../meta.json');
|
|
||||||
|
//const _filename = fileURLToPath(import.meta.url);
|
||||||
|
const _filename = __filename;
|
||||||
|
const _dirname = dirname(_filename);
|
||||||
|
|
||||||
|
const meta = JSON.parse(fs.readFileSync(`${_dirname}/../meta.json`, 'utf-8'));
|
||||||
|
|
||||||
const logger = new Logger('core', 'cyan');
|
const logger = new Logger('core', 'cyan');
|
||||||
const bootLogger = logger.createSubLogger('boot', 'magenta', false);
|
const bootLogger = logger.createSubLogger('boot', 'magenta', false);
|
||||||
@@ -39,6 +46,11 @@ function greet() {
|
|||||||
bootLogger.info(`Misskey v${meta.version}`, null, true);
|
bootLogger.info(`Misskey v${meta.version}`, null, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function isRoot() {
|
||||||
|
// maybe process.getuid will be undefined under not POSIX environment (e.g. Windows)
|
||||||
|
return process.getuid != null && process.getuid() === 0;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Init master process
|
* Init master process
|
||||||
*/
|
*/
|
||||||
|
@@ -1,7 +1,8 @@
|
|||||||
|
import { del, get, set } from '@client/scripts/idb-proxy';
|
||||||
import { reactive } from 'vue';
|
import { reactive } from 'vue';
|
||||||
import { apiUrl } from '@client/config';
|
import { apiUrl } from '@client/config';
|
||||||
import { waiting } from '@client/os';
|
import { waiting } from '@client/os';
|
||||||
import { unisonReload } from '@client/scripts/unison-reload';
|
import { unisonReload, reloadChannel } from '@client/scripts/unison-reload';
|
||||||
|
|
||||||
// TODO: 他のタブと永続化されたstateを同期
|
// TODO: 他のタブと永続化されたstateを同期
|
||||||
|
|
||||||
@@ -10,6 +11,7 @@ type Account = {
|
|||||||
token: string;
|
token: string;
|
||||||
isModerator: boolean;
|
isModerator: boolean;
|
||||||
isAdmin: boolean;
|
isAdmin: boolean;
|
||||||
|
isDeleted: boolean;
|
||||||
};
|
};
|
||||||
|
|
||||||
const data = localStorage.getItem('account');
|
const data = localStorage.getItem('account');
|
||||||
@@ -17,22 +19,57 @@ const data = localStorage.getItem('account');
|
|||||||
// TODO: 外部からはreadonlyに
|
// TODO: 外部からはreadonlyに
|
||||||
export const $i = data ? reactive(JSON.parse(data) as Account) : null;
|
export const $i = data ? reactive(JSON.parse(data) as Account) : null;
|
||||||
|
|
||||||
export function signout() {
|
export async function signout() {
|
||||||
|
waiting();
|
||||||
localStorage.removeItem('account');
|
localStorage.removeItem('account');
|
||||||
|
|
||||||
|
//#region Remove account
|
||||||
|
const accounts = await getAccounts();
|
||||||
|
accounts.splice(accounts.findIndex(x => x.id === $i.id), 1);
|
||||||
|
|
||||||
|
if (accounts.length > 0) await set('accounts', accounts);
|
||||||
|
else await del('accounts');
|
||||||
|
//#endregion
|
||||||
|
|
||||||
|
//#region Remove service worker registration
|
||||||
|
try {
|
||||||
|
if (navigator.serviceWorker.controller) {
|
||||||
|
const registration = await navigator.serviceWorker.ready;
|
||||||
|
const push = await registration.pushManager.getSubscription();
|
||||||
|
if (push) {
|
||||||
|
await fetch(`${apiUrl}/sw/unregister`, {
|
||||||
|
method: 'POST',
|
||||||
|
body: JSON.stringify({
|
||||||
|
i: $i.token,
|
||||||
|
endpoint: push.endpoint,
|
||||||
|
}),
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (accounts.length === 0) {
|
||||||
|
await navigator.serviceWorker.getRegistrations()
|
||||||
|
.then(registrations => {
|
||||||
|
return Promise.all(registrations.map(registration => registration.unregister()));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
} catch (e) {}
|
||||||
|
//#endregion
|
||||||
|
|
||||||
document.cookie = `igi=; path=/`;
|
document.cookie = `igi=; path=/`;
|
||||||
location.href = '/';
|
|
||||||
|
if (accounts.length > 0) login(accounts[0].token);
|
||||||
|
else unisonReload();
|
||||||
}
|
}
|
||||||
|
|
||||||
export function getAccounts() {
|
export async function getAccounts(): Promise<{ id: Account['id'], token: Account['token'] }[]> {
|
||||||
const accountsData = localStorage.getItem('accounts');
|
return (await get('accounts')) || [];
|
||||||
const accounts: { id: Account['id'], token: Account['token'] }[] = accountsData ? JSON.parse(accountsData) : [];
|
|
||||||
return accounts;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export function addAccount(id: Account['id'], token: Account['token']) {
|
export async function addAccount(id: Account['id'], token: Account['token']) {
|
||||||
const accounts = getAccounts();
|
const accounts = await getAccounts();
|
||||||
if (!accounts.some(x => x.id === id)) {
|
if (!accounts.some(x => x.id === id)) {
|
||||||
localStorage.setItem('accounts', JSON.stringify(accounts.concat([{ id, token }])));
|
await set('accounts', accounts.concat([{ id, token }]));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -47,7 +84,7 @@ function fetchAccount(token): Promise<Account> {
|
|||||||
})
|
})
|
||||||
.then(res => {
|
.then(res => {
|
||||||
// When failed to authenticate user
|
// When failed to authenticate user
|
||||||
if (res.status >= 400 && res.status < 500) {
|
if (res.status !== 200 && res.status < 500) {
|
||||||
return signout();
|
return signout();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -69,15 +106,22 @@ export function updateAccount(data) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export function refreshAccount() {
|
export function refreshAccount() {
|
||||||
fetchAccount($i.token).then(updateAccount);
|
return fetchAccount($i.token).then(updateAccount);
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function login(token: Account['token']) {
|
export async function login(token: Account['token'], redirect?: string) {
|
||||||
waiting();
|
waiting();
|
||||||
if (_DEV_) console.log('logging as token ', token);
|
if (_DEV_) console.log('logging as token ', token);
|
||||||
const me = await fetchAccount(token);
|
const me = await fetchAccount(token);
|
||||||
localStorage.setItem('account', JSON.stringify(me));
|
localStorage.setItem('account', JSON.stringify(me));
|
||||||
addAccount(me.id, token);
|
await addAccount(me.id, token);
|
||||||
|
|
||||||
|
if (redirect) {
|
||||||
|
reloadChannel.postMessage('reload');
|
||||||
|
location.href = redirect;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
unisonReload();
|
unisonReload();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -10,9 +10,9 @@
|
|||||||
</template>
|
</template>
|
||||||
<div class="dpvffvvy _monolithic_">
|
<div class="dpvffvvy _monolithic_">
|
||||||
<div class="_section">
|
<div class="_section">
|
||||||
<MkTextarea v-model:value="comment">
|
<MkTextarea v-model="comment">
|
||||||
<span>{{ $ts.details }}</span>
|
<template #label>{{ $ts.details }}</template>
|
||||||
<template #desc>{{ $ts.fillAbuseReportDescription }}</template>
|
<template #caption>{{ $ts.fillAbuseReportDescription }}</template>
|
||||||
</MkTextarea>
|
</MkTextarea>
|
||||||
</div>
|
</div>
|
||||||
<div class="_section">
|
<div class="_section">
|
||||||
|
@@ -35,6 +35,7 @@ import { twemojiSvgBase } from '@/misc/twemoji-base';
|
|||||||
import { getStaticImageUrl } from '@client/scripts/get-static-image-url';
|
import { getStaticImageUrl } from '@client/scripts/get-static-image-url';
|
||||||
import { acct } from '@client/filters/user';
|
import { acct } from '@client/filters/user';
|
||||||
import * as os from '@client/os';
|
import * as os from '@client/os';
|
||||||
|
import { instance } from '@client/instance';
|
||||||
|
|
||||||
type EmojiDef = {
|
type EmojiDef = {
|
||||||
emoji: string;
|
emoji: string;
|
||||||
@@ -75,6 +76,36 @@ for (const x of lib) {
|
|||||||
|
|
||||||
emjdb.sort((a, b) => a.name.length - b.name.length);
|
emjdb.sort((a, b) => a.name.length - b.name.length);
|
||||||
|
|
||||||
|
//#region Construct Emoji DB
|
||||||
|
const customEmojis = instance.emojis;
|
||||||
|
const emojiDefinitions: EmojiDef[] = [];
|
||||||
|
|
||||||
|
for (const x of customEmojis) {
|
||||||
|
emojiDefinitions.push({
|
||||||
|
name: x.name,
|
||||||
|
emoji: `:${x.name}:`,
|
||||||
|
url: x.url,
|
||||||
|
isCustomEmoji: true
|
||||||
|
});
|
||||||
|
|
||||||
|
if (x.aliases) {
|
||||||
|
for (const alias of x.aliases) {
|
||||||
|
emojiDefinitions.push({
|
||||||
|
name: alias,
|
||||||
|
aliasOf: x.name,
|
||||||
|
emoji: `:${x.name}:`,
|
||||||
|
url: x.url,
|
||||||
|
isCustomEmoji: true
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
emojiDefinitions.sort((a, b) => a.name.length - b.name.length);
|
||||||
|
|
||||||
|
const emojiDb = markRaw(emojiDefinitions.concat(emjdb));
|
||||||
|
//#endregion
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
props: {
|
props: {
|
||||||
type: {
|
type: {
|
||||||
@@ -124,7 +155,6 @@ export default defineComponent({
|
|||||||
emojis: [],
|
emojis: [],
|
||||||
items: [],
|
items: [],
|
||||||
select: -1,
|
select: -1,
|
||||||
emojiDb: [] as EmojiDef[]
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
@@ -144,36 +174,6 @@ export default defineComponent({
|
|||||||
mounted() {
|
mounted() {
|
||||||
this.setPosition();
|
this.setPosition();
|
||||||
|
|
||||||
//#region Construct Emoji DB
|
|
||||||
const customEmojis = this.$instance.emojis;
|
|
||||||
const emojiDefinitions: EmojiDef[] = [];
|
|
||||||
|
|
||||||
for (const x of customEmojis) {
|
|
||||||
emojiDefinitions.push({
|
|
||||||
name: x.name,
|
|
||||||
emoji: `:${x.name}:`,
|
|
||||||
url: x.url,
|
|
||||||
isCustomEmoji: true
|
|
||||||
});
|
|
||||||
|
|
||||||
if (x.aliases) {
|
|
||||||
for (const alias of x.aliases) {
|
|
||||||
emojiDefinitions.push({
|
|
||||||
name: alias,
|
|
||||||
aliasOf: x.name,
|
|
||||||
emoji: `:${x.name}:`,
|
|
||||||
url: x.url,
|
|
||||||
isCustomEmoji: true
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
emojiDefinitions.sort((a, b) => a.name.length - b.name.length);
|
|
||||||
|
|
||||||
this.emojiDb = markRaw(emojiDefinitions.concat(emjdb));
|
|
||||||
//#endregion
|
|
||||||
|
|
||||||
this.textarea.addEventListener('keydown', this.onKeydown);
|
this.textarea.addEventListener('keydown', this.onKeydown);
|
||||||
|
|
||||||
for (const el of Array.from(document.querySelectorAll('body *'))) {
|
for (const el of Array.from(document.querySelectorAll('body *'))) {
|
||||||
@@ -203,6 +203,13 @@ export default defineComponent({
|
|||||||
complete(type, value) {
|
complete(type, value) {
|
||||||
this.$emit('done', { type, value });
|
this.$emit('done', { type, value });
|
||||||
this.$emit('closed');
|
this.$emit('closed');
|
||||||
|
|
||||||
|
if (type === 'emoji') {
|
||||||
|
let recents = this.$store.state.recentlyUsedEmojis;
|
||||||
|
recents = recents.filter((e: any) => e !== value);
|
||||||
|
recents.unshift(value);
|
||||||
|
this.$store.set('recentlyUsedEmojis', recents.splice(0, 32));
|
||||||
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
setPosition() {
|
setPosition() {
|
||||||
@@ -281,29 +288,26 @@ export default defineComponent({
|
|||||||
}
|
}
|
||||||
} else if (this.type == 'emoji') {
|
} else if (this.type == 'emoji') {
|
||||||
if (this.q == null || this.q == '') {
|
if (this.q == null || this.q == '') {
|
||||||
this.emojis = this.emojiDb.filter(x => x.isCustomEmoji && !x.aliasOf).sort((a, b) => {
|
// 最近使った絵文字をサジェスト
|
||||||
var textA = a.name.toUpperCase();
|
this.emojis = this.$store.state.recentlyUsedEmojis.map(emoji => emojiDb.find(e => e.emoji == emoji)).filter(x => x != null);
|
||||||
var textB = b.name.toUpperCase();
|
|
||||||
return (textA < textB) ? -1 : (textA > textB) ? 1 : 0;
|
|
||||||
});
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
const matched = [];
|
const matched = [];
|
||||||
const max = 30;
|
const max = 30;
|
||||||
|
|
||||||
this.emojiDb.some(x => {
|
emojiDb.some(x => {
|
||||||
if (x.name.startsWith(this.q) && !x.aliasOf && !matched.some(y => y.emoji == x.emoji)) matched.push(x);
|
if (x.name.startsWith(this.q) && !x.aliasOf && !matched.some(y => y.emoji == x.emoji)) matched.push(x);
|
||||||
return matched.length == max;
|
return matched.length == max;
|
||||||
});
|
});
|
||||||
if (matched.length < max) {
|
if (matched.length < max) {
|
||||||
this.emojiDb.some(x => {
|
emojiDb.some(x => {
|
||||||
if (x.name.startsWith(this.q) && !matched.some(y => y.emoji == x.emoji)) matched.push(x);
|
if (x.name.startsWith(this.q) && !matched.some(y => y.emoji == x.emoji)) matched.push(x);
|
||||||
return matched.length == max;
|
return matched.length == max;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
if (matched.length < max) {
|
if (matched.length < max) {
|
||||||
this.emojiDb.some(x => {
|
emojiDb.some(x => {
|
||||||
if (x.name.includes(this.q) && !matched.some(y => y.emoji == x.emoji)) matched.push(x);
|
if (x.name.includes(this.q) && !matched.some(y => y.emoji == x.emoji)) matched.push(x);
|
||||||
return matched.length == max;
|
return matched.length == max;
|
||||||
});
|
});
|
||||||
|
@@ -48,15 +48,7 @@ export default defineComponent({
|
|||||||
render() {
|
render() {
|
||||||
if (this.items.length === 0) return;
|
if (this.items.length === 0) return;
|
||||||
|
|
||||||
return h(this.$store.state.animation ? TransitionGroup : 'div', this.$store.state.animation ? {
|
const renderChildren = () => this.items.map((item, i) => {
|
||||||
class: 'sqadhkmv' + (this.noGap ? ' noGap _block' : ''),
|
|
||||||
name: 'list',
|
|
||||||
tag: 'div',
|
|
||||||
'data-direction': this.direction,
|
|
||||||
'data-reversed': this.reversed ? 'true' : 'false',
|
|
||||||
} : {
|
|
||||||
class: 'sqadhkmv' + (this.noGap ? ' noGap _block' : ''),
|
|
||||||
}, this.items.map((item, i) => {
|
|
||||||
const el = this.$slots.default({
|
const el = this.$slots.default({
|
||||||
item: item
|
item: item
|
||||||
})[0];
|
})[0];
|
||||||
@@ -98,7 +90,19 @@ export default defineComponent({
|
|||||||
return el;
|
return el;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}));
|
});
|
||||||
|
|
||||||
|
return h(this.$store.state.animation ? TransitionGroup : 'div', this.$store.state.animation ? {
|
||||||
|
class: 'sqadhkmv' + (this.noGap ? ' noGap' : ''),
|
||||||
|
name: 'list',
|
||||||
|
tag: 'div',
|
||||||
|
'data-direction': this.direction,
|
||||||
|
'data-reversed': this.reversed ? 'true' : 'false',
|
||||||
|
} : {
|
||||||
|
class: 'sqadhkmv' + (this.noGap ? ' noGap' : ''),
|
||||||
|
}, {
|
||||||
|
default: renderChildren
|
||||||
|
});
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
@@ -14,8 +14,8 @@
|
|||||||
</div>
|
</div>
|
||||||
<header v-if="title"><Mfm :text="title"/></header>
|
<header v-if="title"><Mfm :text="title"/></header>
|
||||||
<div class="body" v-if="text"><Mfm :text="text"/></div>
|
<div class="body" v-if="text"><Mfm :text="text"/></div>
|
||||||
<MkInput v-if="input" v-model:value="inputValue" autofocus :type="input.type || 'text'" :placeholder="input.placeholder" @keydown="onInputKeydown"></MkInput>
|
<MkInput v-if="input" v-model="inputValue" autofocus :type="input.type || 'text'" :placeholder="input.placeholder" @keydown="onInputKeydown"></MkInput>
|
||||||
<MkSelect v-if="select" v-model:value="selectedValue" autofocus>
|
<MkSelect v-if="select" v-model="selectedValue" autofocus>
|
||||||
<template v-if="select.items">
|
<template v-if="select.items">
|
||||||
<option v-for="item in select.items" :value="item.value">{{ item.text }}</option>
|
<option v-for="item in select.items" :value="item.value">{{ item.text }}</option>
|
||||||
</template>
|
</template>
|
||||||
|
@@ -114,7 +114,7 @@ export default defineComponent({
|
|||||||
if (this.selectMode) {
|
if (this.selectMode) {
|
||||||
this.$emit('chosen', this.file);
|
this.$emit('chosen', this.file);
|
||||||
} else {
|
} else {
|
||||||
os.modalMenu(this.getMenu(), ev.currentTarget || ev.target);
|
os.popupMenu(this.getMenu(), ev.currentTarget || ev.target);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@@ -10,6 +10,7 @@
|
|||||||
<span class="separator" v-if="folder != null"><i class="fas fa-angle-right"></i></span>
|
<span class="separator" v-if="folder != null"><i class="fas fa-angle-right"></i></span>
|
||||||
<span class="folder current" v-if="folder != null">{{ folder.name }}</span>
|
<span class="folder current" v-if="folder != null">{{ folder.name }}</span>
|
||||||
</div>
|
</div>
|
||||||
|
<button @click="showMenu" class="menu _button"><i class="fas fa-ellipsis-h"></i></button>
|
||||||
</nav>
|
</nav>
|
||||||
<div class="main" :class="{ uploading: uploadings.length > 0, fetching }"
|
<div class="main" :class="{ uploading: uploadings.length > 0, fetching }"
|
||||||
ref="main"
|
ref="main"
|
||||||
@@ -46,7 +47,7 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { defineComponent } from 'vue';
|
import { defineComponent, markRaw } from 'vue';
|
||||||
import XNavFolder from './drive.nav-folder.vue';
|
import XNavFolder from './drive.nav-folder.vue';
|
||||||
import XFolder from './drive.folder.vue';
|
import XFolder from './drive.folder.vue';
|
||||||
import XFile from './drive.file.vue';
|
import XFile from './drive.file.vue';
|
||||||
@@ -139,7 +140,7 @@ export default defineComponent({
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
this.connection = os.stream.useChannel('drive');
|
this.connection = markRaw(os.stream.useChannel('drive'));
|
||||||
|
|
||||||
this.connection.on('fileCreated', this.onStreamDriveFileCreated);
|
this.connection.on('fileCreated', this.onStreamDriveFileCreated);
|
||||||
this.connection.on('fileUpdated', this.onStreamDriveFileUpdated);
|
this.connection.on('fileUpdated', this.onStreamDriveFileUpdated);
|
||||||
@@ -627,8 +628,12 @@ export default defineComponent({
|
|||||||
}];
|
}];
|
||||||
},
|
},
|
||||||
|
|
||||||
onContextmenu(e) {
|
showMenu(ev) {
|
||||||
os.contextMenu(this.getMenu(), e);
|
os.popupMenu(this.getMenu(), ev.currentTarget || ev.target);
|
||||||
|
},
|
||||||
|
|
||||||
|
onContextmenu(ev) {
|
||||||
|
os.contextMenu(this.getMenu(), ev);
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@@ -641,7 +646,7 @@ export default defineComponent({
|
|||||||
height: 100%;
|
height: 100%;
|
||||||
|
|
||||||
> nav {
|
> nav {
|
||||||
display: block;
|
display: flex;
|
||||||
z-index: 2;
|
z-index: 2;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
padding: 0 8px;
|
padding: 0 8px;
|
||||||
@@ -696,6 +701,10 @@ export default defineComponent({
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
> .menu {
|
||||||
|
margin-left: auto;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
> .main {
|
> .main {
|
||||||
|
@@ -1,17 +1,17 @@
|
|||||||
<template>
|
<template>
|
||||||
<MkModal ref="modal" :manual-showing="manualShowing" :src="src" :front="true" @click="$refs.modal.close()" @opening="opening" @close="$emit('close')" @closed="$emit('closed')">
|
<MkPopup ref="popup" :manual-showing="manualShowing" :src="src" :front="true" @click="$refs.popup.close()" @opening="opening" @close="$emit('close')" @closed="$emit('closed')" #default="{point}">
|
||||||
<MkEmojiPicker :show-pinned="showPinned" :as-reaction-picker="asReactionPicker" @chosen="chosen" ref="picker"/>
|
<MkEmojiPicker class="ryghynhb _popup _shadow" :class="{ pointer: point === 'top' }" :show-pinned="showPinned" :as-reaction-picker="asReactionPicker" @chosen="chosen" ref="picker"/>
|
||||||
</MkModal>
|
</MkPopup>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { defineComponent, markRaw } from 'vue';
|
import { defineComponent, markRaw } from 'vue';
|
||||||
import MkModal from '@client/components/ui/modal.vue';
|
import MkPopup from '@client/components/ui/popup.vue';
|
||||||
import MkEmojiPicker from '@client/components/emoji-picker.vue';
|
import MkEmojiPicker from '@client/components/emoji-picker.vue';
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
components: {
|
components: {
|
||||||
MkModal,
|
MkPopup,
|
||||||
MkEmojiPicker,
|
MkEmojiPicker,
|
||||||
},
|
},
|
||||||
|
|
||||||
@@ -33,7 +33,7 @@ export default defineComponent({
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
||||||
emits: ['done', 'closed'],
|
emits: ['done', 'close', 'closed'],
|
||||||
|
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
@@ -44,7 +44,7 @@ export default defineComponent({
|
|||||||
methods: {
|
methods: {
|
||||||
chosen(emoji: any) {
|
chosen(emoji: any) {
|
||||||
this.$emit('done', emoji);
|
this.$emit('done', emoji);
|
||||||
this.$refs.modal.close();
|
this.$refs.popup.close();
|
||||||
},
|
},
|
||||||
|
|
||||||
opening() {
|
opening() {
|
||||||
@@ -56,145 +56,20 @@ export default defineComponent({
|
|||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="scss" scoped>
|
<style lang="scss" scoped>
|
||||||
.omfetrab {
|
.ryghynhb {
|
||||||
$pad: 8px;
|
&.pointer {
|
||||||
--eachSize: 40px;
|
&:before {
|
||||||
|
--size: 8px;
|
||||||
display: flex;
|
content: '';
|
||||||
flex-direction: column;
|
display: block;
|
||||||
contain: content;
|
position: absolute;
|
||||||
|
top: calc(0px - (var(--size) * 2));
|
||||||
&.big {
|
left: 0;
|
||||||
--eachSize: 44px;
|
right: 0;
|
||||||
}
|
width: 0;
|
||||||
|
margin: auto;
|
||||||
&.w1 {
|
border: solid var(--size) transparent;
|
||||||
width: calc((var(--eachSize) * 5) + (#{$pad} * 2));
|
border-bottom-color: var(--popup);
|
||||||
}
|
|
||||||
|
|
||||||
&.w2 {
|
|
||||||
width: calc((var(--eachSize) * 6) + (#{$pad} * 2));
|
|
||||||
}
|
|
||||||
|
|
||||||
&.w3 {
|
|
||||||
width: calc((var(--eachSize) * 7) + (#{$pad} * 2));
|
|
||||||
}
|
|
||||||
|
|
||||||
&.h1 {
|
|
||||||
--height: calc((var(--eachSize) * 4) + (#{$pad} * 2));
|
|
||||||
}
|
|
||||||
|
|
||||||
&.h2 {
|
|
||||||
--height: calc((var(--eachSize) * 6) + (#{$pad} * 2));
|
|
||||||
}
|
|
||||||
|
|
||||||
&.h3 {
|
|
||||||
--height: calc((var(--eachSize) * 8) + (#{$pad} * 2));
|
|
||||||
}
|
|
||||||
|
|
||||||
> .search {
|
|
||||||
width: 100%;
|
|
||||||
padding: 12px;
|
|
||||||
box-sizing: border-box;
|
|
||||||
font-size: 1em;
|
|
||||||
outline: none;
|
|
||||||
border: none;
|
|
||||||
background: transparent;
|
|
||||||
color: var(--fg);
|
|
||||||
|
|
||||||
&:not(.filled) {
|
|
||||||
order: 1;
|
|
||||||
z-index: 2;
|
|
||||||
box-shadow: 0px -1px 0 0px var(--divider);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
> .emojis {
|
|
||||||
height: var(--height);
|
|
||||||
overflow-y: auto;
|
|
||||||
overflow-x: hidden;
|
|
||||||
|
|
||||||
scrollbar-width: none;
|
|
||||||
|
|
||||||
&::-webkit-scrollbar {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
> .index {
|
|
||||||
min-height: var(--height);
|
|
||||||
position: relative;
|
|
||||||
border-bottom: solid 0.5px var(--divider);
|
|
||||||
|
|
||||||
> .arrow {
|
|
||||||
position: absolute;
|
|
||||||
bottom: 0;
|
|
||||||
left: 0;
|
|
||||||
width: 100%;
|
|
||||||
padding: 16px 0;
|
|
||||||
text-align: center;
|
|
||||||
opacity: 0.5;
|
|
||||||
pointer-events: none;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
section {
|
|
||||||
> header {
|
|
||||||
position: sticky;
|
|
||||||
top: 0;
|
|
||||||
left: 0;
|
|
||||||
z-index: 1;
|
|
||||||
padding: 8px;
|
|
||||||
font-size: 12px;
|
|
||||||
}
|
|
||||||
|
|
||||||
> div {
|
|
||||||
padding: $pad;
|
|
||||||
|
|
||||||
> button {
|
|
||||||
position: relative;
|
|
||||||
padding: 0;
|
|
||||||
width: var(--eachSize);
|
|
||||||
height: var(--eachSize);
|
|
||||||
border-radius: 4px;
|
|
||||||
|
|
||||||
&:focus {
|
|
||||||
outline: solid 2px var(--focus);
|
|
||||||
z-index: 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
&:hover {
|
|
||||||
background: rgba(0, 0, 0, 0.05);
|
|
||||||
}
|
|
||||||
|
|
||||||
&:active {
|
|
||||||
background: var(--accent);
|
|
||||||
box-shadow: inset 0 0.15em 0.3em rgba(27, 31, 35, 0.15);
|
|
||||||
}
|
|
||||||
|
|
||||||
> * {
|
|
||||||
font-size: 24px;
|
|
||||||
height: 1.25em;
|
|
||||||
vertical-align: -.25em;
|
|
||||||
pointer-events: none;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
&.result {
|
|
||||||
border-bottom: solid 0.5px var(--divider);
|
|
||||||
|
|
||||||
&:empty {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
&.unicode {
|
|
||||||
min-height: 384px;
|
|
||||||
}
|
|
||||||
|
|
||||||
&.custom {
|
|
||||||
min-height: 64px;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="omfetrab _popup" :class="['w' + width, 'h' + height, { big }]">
|
<div class="omfetrab" :class="['w' + width, 'h' + height, { big }]">
|
||||||
<input ref="search" class="search" data-prevent-emoji-insert :class="{ filled: q != null && q != '' }" v-model.trim="q" :placeholder="$ts.search" @paste.stop="paste" @keyup.enter="done()">
|
<input ref="search" class="search" data-prevent-emoji-insert :class="{ filled: q != null && q != '' }" v-model.trim="q" :placeholder="$ts.search" @paste.stop="paste" @keyup.enter="done()">
|
||||||
<div class="emojis" ref="emojis">
|
<div class="emojis" ref="emojis">
|
||||||
<section class="result">
|
<section class="result">
|
||||||
@@ -346,7 +346,6 @@ export default defineComponent({
|
|||||||
|
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
contain: content;
|
|
||||||
|
|
||||||
&.big {
|
&.big {
|
||||||
--eachSize: 44px;
|
--eachSize: 44px;
|
||||||
|
@@ -28,7 +28,7 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { defineComponent } from 'vue';
|
import { defineComponent, markRaw } from 'vue';
|
||||||
import * as os from '@client/os';
|
import * as os from '@client/os';
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
@@ -71,7 +71,7 @@ export default defineComponent({
|
|||||||
},
|
},
|
||||||
|
|
||||||
mounted() {
|
mounted() {
|
||||||
this.connection = os.stream.useChannel('main');
|
this.connection = markRaw(os.stream.useChannel('main'));
|
||||||
|
|
||||||
this.connection.on('follow', this.onFollowChange);
|
this.connection.on('follow', this.onFollowChange);
|
||||||
this.connection.on('unfollow', this.onFollowChange);
|
this.connection.on('unfollow', this.onFollowChange);
|
||||||
|
@@ -9,14 +9,14 @@
|
|||||||
|
|
||||||
<form class="_monolithic_" @submit.prevent="onSubmit" v-if="$instance.enableEmail">
|
<form class="_monolithic_" @submit.prevent="onSubmit" v-if="$instance.enableEmail">
|
||||||
<div class="_section">
|
<div class="_section">
|
||||||
<MkInput v-model:value="username" type="text" pattern="^[a-zA-Z0-9_]+$" spellcheck="false" autofocus required>
|
<MkInput v-model="username" type="text" pattern="^[a-zA-Z0-9_]+$" spellcheck="false" autofocus required>
|
||||||
<span>{{ $ts.username }}</span>
|
<template #label>{{ $ts.username }}</template>
|
||||||
<template #prefix>@</template>
|
<template #prefix>@</template>
|
||||||
</MkInput>
|
</MkInput>
|
||||||
|
|
||||||
<MkInput v-model:value="email" type="email" spellcheck="false" required>
|
<MkInput v-model="email" type="email" spellcheck="false" required>
|
||||||
<span>{{ $ts.emailAddress }}</span>
|
<template #label>{{ $ts.emailAddress }}</template>
|
||||||
<template #desc>{{ $ts._forgotPassword.enterEmail }}</template>
|
<template #caption>{{ $ts._forgotPassword.enterEmail }}</template>
|
||||||
</MkInput>
|
</MkInput>
|
||||||
|
|
||||||
<MkButton type="submit" :disabled="processing" primary style="margin: 0 auto;">{{ $ts.send }}</MkButton>
|
<MkButton type="submit" :disabled="processing" primary style="margin: 0 auto;">{{ $ts.send }}</MkButton>
|
||||||
|
@@ -32,8 +32,8 @@
|
|||||||
margin: -8px calc(var(--formXPadding) * -1) 0 calc(var(--formXPadding) * -1);
|
margin: -8px calc(var(--formXPadding) * -1) 0 calc(var(--formXPadding) * -1);
|
||||||
padding: 8px calc(var(--formContentHMargin) + var(--formXPadding)) 8px calc(var(--formContentHMargin) + var(--formXPadding));
|
padding: 8px calc(var(--formContentHMargin) + var(--formXPadding)) 8px calc(var(--formContentHMargin) + var(--formXPadding));
|
||||||
background: var(--X17);
|
background: var(--X17);
|
||||||
-webkit-backdrop-filter: blur(10px);
|
-webkit-backdrop-filter: var(--blur, blur(10px));
|
||||||
backdrop-filter: blur(10px);
|
backdrop-filter: var(--blur, blur(10px));
|
||||||
}
|
}
|
||||||
|
|
||||||
._themeChanging_ ._formLabel {
|
._themeChanging_ ._formLabel {
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="yxspomdl" :class="{ inline, colored }">
|
<div class="yxspomdl" :class="{ inline, colored, mini }">
|
||||||
<div class="ring"></div>
|
<div class="ring"></div>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
@@ -18,7 +18,12 @@ export default defineComponent({
|
|||||||
type: Boolean,
|
type: Boolean,
|
||||||
required: false,
|
required: false,
|
||||||
default: true
|
default: true
|
||||||
}
|
},
|
||||||
|
mini: {
|
||||||
|
type: Boolean,
|
||||||
|
required: false,
|
||||||
|
default: false
|
||||||
|
},
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
@@ -38,6 +43,8 @@ export default defineComponent({
|
|||||||
text-align: center;
|
text-align: center;
|
||||||
cursor: wait;
|
cursor: wait;
|
||||||
|
|
||||||
|
--size: 48px;
|
||||||
|
|
||||||
&.colored {
|
&.colored {
|
||||||
color: var(--accent);
|
color: var(--accent);
|
||||||
}
|
}
|
||||||
@@ -45,19 +52,12 @@ export default defineComponent({
|
|||||||
&.inline {
|
&.inline {
|
||||||
display: inline;
|
display: inline;
|
||||||
padding: 0;
|
padding: 0;
|
||||||
|
--size: 32px;
|
||||||
|
}
|
||||||
|
|
||||||
> .ring:after {
|
&.mini {
|
||||||
width: 32px;
|
padding: 16px;
|
||||||
height: 32px;
|
--size: 32px;
|
||||||
}
|
|
||||||
|
|
||||||
> .ring {
|
|
||||||
&:before,
|
|
||||||
&:after {
|
|
||||||
width: 32px;
|
|
||||||
height: 32px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
> .ring {
|
> .ring {
|
||||||
@@ -70,8 +70,8 @@ export default defineComponent({
|
|||||||
content: " ";
|
content: " ";
|
||||||
display: block;
|
display: block;
|
||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
width: 48px;
|
width: var(--size);
|
||||||
height: 48px;
|
height: var(--size);
|
||||||
border-radius: 50%;
|
border-radius: 50%;
|
||||||
border: solid 4px;
|
border: solid 4px;
|
||||||
}
|
}
|
||||||
|
@@ -117,6 +117,11 @@ export default defineComponent({
|
|||||||
75% { transform: scale3d(1.05, 0.95, 1); }
|
75% { transform: scale3d(1.05, 0.95, 1); }
|
||||||
to { transform: scale3d(1, 1, 1); }
|
to { transform: scale3d(1, 1, 1); }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@keyframes mfm-rainbow {
|
||||||
|
0% { filter: hue-rotate(0deg) contrast(150%) saturate(150%); }
|
||||||
|
100% { filter: hue-rotate(360deg) contrast(150%) saturate(150%); }
|
||||||
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
<style lang="scss" scoped>
|
<style lang="scss" scoped>
|
||||||
|
@@ -1,7 +1,7 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="zbcjwnqg" style="margin-top: -8px;">
|
<div class="zbcjwnqg" style="margin-top: -8px;">
|
||||||
<div class="selects" style="display: flex;">
|
<div class="selects" style="display: flex;">
|
||||||
<MkSelect v-model:value="chartSrc" style="margin: 0; flex: 1;">
|
<MkSelect v-model="chartSrc" style="margin: 0; flex: 1;">
|
||||||
<optgroup :label="$ts.federation">
|
<optgroup :label="$ts.federation">
|
||||||
<option value="federation-instances">{{ $ts._charts.federationInstancesIncDec }}</option>
|
<option value="federation-instances">{{ $ts._charts.federationInstancesIncDec }}</option>
|
||||||
<option value="federation-instances-total">{{ $ts._charts.federationInstancesTotal }}</option>
|
<option value="federation-instances-total">{{ $ts._charts.federationInstancesTotal }}</option>
|
||||||
@@ -24,7 +24,7 @@
|
|||||||
<option value="drive-total">{{ $ts._charts.storageUsageTotal }}</option>
|
<option value="drive-total">{{ $ts._charts.storageUsageTotal }}</option>
|
||||||
</optgroup>
|
</optgroup>
|
||||||
</MkSelect>
|
</MkSelect>
|
||||||
<MkSelect v-model:value="chartSpan" style="margin: 0;">
|
<MkSelect v-model="chartSpan" style="margin: 0;">
|
||||||
<option value="hour">{{ $ts.perHour }}</option>
|
<option value="hour">{{ $ts.perHour }}</option>
|
||||||
<option value="day">{{ $ts.perDay }}</option>
|
<option value="day">{{ $ts.perDay }}</option>
|
||||||
</MkSelect>
|
</MkSelect>
|
||||||
|
@@ -165,6 +165,10 @@ export default defineComponent({
|
|||||||
class: '_mfm_blur_',
|
class: '_mfm_blur_',
|
||||||
}, genEl(token.children));
|
}, genEl(token.children));
|
||||||
}
|
}
|
||||||
|
case 'rainbow': {
|
||||||
|
style = this.$store.state.animatedMfm ? 'animation: mfm-rainbow 1s linear infinite;' : '';
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (style == null) {
|
if (style == null) {
|
||||||
return h('span', {}, ['[', token.props.name, ...genEl(token.children), ']']);
|
return h('span', {}, ['[', token.props.name, ...genEl(token.children), ']']);
|
||||||
|
@@ -1,13 +1,10 @@
|
|||||||
<template>
|
<template>
|
||||||
<MkModal ref="modal" @click="$emit('click')" @closed="$emit('closed')">
|
<MkModal ref="modal" @click="$emit('click')" @closed="$emit('closed')">
|
||||||
<div class="hrmcaedk _popup _narrow_" :style="{ width: `${width}px`, height: (height ? `min(${height}px, 100%)` : '100%') }">
|
<div class="hrmcaedk _window _narrow_" :style="{ width: `${width}px`, height: (height ? `min(${height}px, 100%)` : '100%') }">
|
||||||
<div class="header" @contextmenu="onContextmenu">
|
<div class="header" @contextmenu="onContextmenu">
|
||||||
<button class="_button" @click="back()" v-if="history.length > 0"><i class="fas fa-chevron-left"></i></button>
|
|
||||||
<button class="_button" style="pointer-events: none;" v-else><!-- マージンのバランスを取るためのダミー --></button>
|
|
||||||
<span class="title">
|
<span class="title">
|
||||||
<XHeader :info="pageInfo" :with-back="false"/>
|
<XHeader :info="pageInfo" :back-button="history.length > 0" @back="back()" :close-button="true" @close="$refs.modal.close()"/>
|
||||||
</span>
|
</span>
|
||||||
<button class="_button" @click="$refs.modal.close()"><i class="fas fa-times"></i></button>
|
|
||||||
</div>
|
</div>
|
||||||
<div class="body _flat_">
|
<div class="body _flat_">
|
||||||
<keep-alive>
|
<keep-alive>
|
||||||
@@ -177,35 +174,19 @@ export default defineComponent({
|
|||||||
flex-shrink: 0;
|
flex-shrink: 0;
|
||||||
box-shadow: 0px 1px var(--divider);
|
box-shadow: 0px 1px var(--divider);
|
||||||
|
|
||||||
> button {
|
|
||||||
height: $height;
|
|
||||||
width: $height;
|
|
||||||
|
|
||||||
@media (max-width: 500px) {
|
|
||||||
height: $height-narrow;
|
|
||||||
width: $height-narrow;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
> .title {
|
> .title {
|
||||||
flex: 1;
|
flex: 1;
|
||||||
line-height: $height;
|
height: $height;
|
||||||
padding-left: 32px;
|
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
white-space: nowrap;
|
white-space: nowrap;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
text-overflow: ellipsis;
|
text-overflow: ellipsis;
|
||||||
pointer-events: none;
|
|
||||||
|
|
||||||
@media (max-width: 500px) {
|
@media (max-width: 500px) {
|
||||||
line-height: $height-narrow;
|
height: $height-narrow;
|
||||||
padding-left: 16px;
|
padding-left: 16px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
> button + .title {
|
|
||||||
padding-left: 0;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
> .body {
|
> .body {
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
<template>
|
<template>
|
||||||
<div
|
<div
|
||||||
class="note _block"
|
class="lxwezrsl _block"
|
||||||
v-if="!muted"
|
v-if="!muted"
|
||||||
v-show="!isDeleted"
|
v-show="!isDeleted"
|
||||||
:tabindex="!isDeleted ? '-1' : null"
|
:tabindex="!isDeleted ? '-1' : null"
|
||||||
@@ -67,6 +67,13 @@
|
|||||||
<MkA class="reply" v-if="appearNote.replyId" :to="`/notes/${appearNote.replyId}`"><i class="fas fa-reply"></i></MkA>
|
<MkA class="reply" v-if="appearNote.replyId" :to="`/notes/${appearNote.replyId}`"><i class="fas fa-reply"></i></MkA>
|
||||||
<Mfm v-if="appearNote.text" :text="appearNote.text" :author="appearNote.user" :i="$i" :custom-emojis="appearNote.emojis"/>
|
<Mfm v-if="appearNote.text" :text="appearNote.text" :author="appearNote.user" :i="$i" :custom-emojis="appearNote.emojis"/>
|
||||||
<a class="rp" v-if="appearNote.renote != null">RN:</a>
|
<a class="rp" v-if="appearNote.renote != null">RN:</a>
|
||||||
|
<div class="translation" v-if="translating || translation">
|
||||||
|
<MkLoading v-if="translating" mini/>
|
||||||
|
<div class="translated" v-else>
|
||||||
|
<b>{{ $t('translatedFrom', { x: translation.sourceLang }) }}:</b>
|
||||||
|
{{ translation.text }}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="files" v-if="appearNote.files.length > 0">
|
<div class="files" v-if="appearNote.files.length > 0">
|
||||||
<XMediaList :media-list="appearNote.files"/>
|
<XMediaList :media-list="appearNote.files"/>
|
||||||
@@ -79,8 +86,8 @@
|
|||||||
</div>
|
</div>
|
||||||
<footer class="footer">
|
<footer class="footer">
|
||||||
<div class="info">
|
<div class="info">
|
||||||
<span class="mobile" v-if="note.viaMobile"><i class="fas fa-mobile-alt"></i></span>
|
<span class="mobile" v-if="appearNote.viaMobile"><i class="fas fa-mobile-alt"></i></span>
|
||||||
<MkTime class="created-at" :time="note.createdAt" mode="detail"/>
|
<MkTime class="created-at" :time="appearNote.createdAt" mode="detail"/>
|
||||||
</div>
|
</div>
|
||||||
<XReactionsViewer :note="appearNote" ref="reactionsViewer"/>
|
<XReactionsViewer :note="appearNote" ref="reactionsViewer"/>
|
||||||
<button @click="reply()" class="button _button">
|
<button @click="reply()" class="button _button">
|
||||||
@@ -178,6 +185,8 @@ export default defineComponent({
|
|||||||
showContent: false,
|
showContent: false,
|
||||||
isDeleted: false,
|
isDeleted: false,
|
||||||
muted: false,
|
muted: false,
|
||||||
|
translation: null,
|
||||||
|
translating: false,
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
|
|
||||||
@@ -454,7 +463,7 @@ export default defineComponent({
|
|||||||
renote(viaKeyboard = false) {
|
renote(viaKeyboard = false) {
|
||||||
pleaseLogin();
|
pleaseLogin();
|
||||||
this.blur();
|
this.blur();
|
||||||
os.modalMenu([{
|
os.popupMenu([{
|
||||||
text: this.$ts.renote,
|
text: this.$ts.renote,
|
||||||
icon: 'fas fa-retweet',
|
icon: 'fas fa-retweet',
|
||||||
action: () => {
|
action: () => {
|
||||||
@@ -619,6 +628,11 @@ export default defineComponent({
|
|||||||
text: this.$ts.share,
|
text: this.$ts.share,
|
||||||
action: this.share
|
action: this.share
|
||||||
},
|
},
|
||||||
|
this.$instance.translatorAvailable ? {
|
||||||
|
icon: 'fas fa-language',
|
||||||
|
text: this.$ts.translate,
|
||||||
|
action: this.translate
|
||||||
|
} : undefined,
|
||||||
null,
|
null,
|
||||||
statePromise.then(state => state.isFavorited ? {
|
statePromise.then(state => state.isFavorited ? {
|
||||||
icon: 'fas fa-star',
|
icon: 'fas fa-star',
|
||||||
@@ -743,14 +757,14 @@ export default defineComponent({
|
|||||||
},
|
},
|
||||||
|
|
||||||
menu(viaKeyboard = false) {
|
menu(viaKeyboard = false) {
|
||||||
os.modalMenu(this.getMenu(), this.$refs.menuButton, {
|
os.popupMenu(this.getMenu(), this.$refs.menuButton, {
|
||||||
viaKeyboard
|
viaKeyboard
|
||||||
}).then(this.focus);
|
}).then(this.focus);
|
||||||
},
|
},
|
||||||
|
|
||||||
showRenoteMenu(viaKeyboard = false) {
|
showRenoteMenu(viaKeyboard = false) {
|
||||||
if (!this.isMyRenote) return;
|
if (!this.isMyRenote) return;
|
||||||
os.modalMenu([{
|
os.popupMenu([{
|
||||||
text: this.$ts.unrenote,
|
text: this.$ts.unrenote,
|
||||||
icon: 'fas fa-trash-alt',
|
icon: 'fas fa-trash-alt',
|
||||||
danger: true,
|
danger: true,
|
||||||
@@ -794,7 +808,7 @@ export default defineComponent({
|
|||||||
|
|
||||||
async clip() {
|
async clip() {
|
||||||
const clips = await os.api('clips/list');
|
const clips = await os.api('clips/list');
|
||||||
os.modalMenu([{
|
os.popupMenu([{
|
||||||
icon: 'fas fa-plus',
|
icon: 'fas fa-plus',
|
||||||
text: this.$ts.createNew,
|
text: this.$ts.createNew,
|
||||||
action: async () => {
|
action: async () => {
|
||||||
@@ -852,6 +866,17 @@ export default defineComponent({
|
|||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
|
async translate() {
|
||||||
|
if (this.translation != null) return;
|
||||||
|
this.translating = true;
|
||||||
|
const res = await os.api('notes/translate', {
|
||||||
|
noteId: this.appearNote.id,
|
||||||
|
targetLang: localStorage.getItem('lang') || navigator.language,
|
||||||
|
});
|
||||||
|
this.translating = false;
|
||||||
|
this.translation = res;
|
||||||
|
},
|
||||||
|
|
||||||
focus() {
|
focus() {
|
||||||
this.$el.focus();
|
this.$el.focus();
|
||||||
},
|
},
|
||||||
@@ -874,7 +899,7 @@ export default defineComponent({
|
|||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="scss" scoped>
|
<style lang="scss" scoped>
|
||||||
.note {
|
.lxwezrsl {
|
||||||
position: relative;
|
position: relative;
|
||||||
transition: box-shadow 0.1s ease;
|
transition: box-shadow 0.1s ease;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
@@ -1050,6 +1075,13 @@ export default defineComponent({
|
|||||||
font-style: oblique;
|
font-style: oblique;
|
||||||
color: var(--renote);
|
color: var(--renote);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
> .translation {
|
||||||
|
border: solid 0.5px var(--divider);
|
||||||
|
border-radius: var(--radius);
|
||||||
|
padding: 12px;
|
||||||
|
margin-top: 8px;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
> .url-preview {
|
> .url-preview {
|
||||||
|
@@ -24,8 +24,8 @@
|
|||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { defineComponent } from 'vue';
|
import { defineComponent } from 'vue';
|
||||||
import notePage from '../filters/note';
|
import notePage from '@client/filters/note';
|
||||||
import { userPage } from '../filters/user';
|
import { userPage } from '@client/filters/user';
|
||||||
import * as os from '@client/os';
|
import * as os from '@client/os';
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
|
@@ -51,6 +51,13 @@
|
|||||||
<MkA class="reply" v-if="appearNote.replyId" :to="`/notes/${appearNote.replyId}`"><i class="fas fa-reply"></i></MkA>
|
<MkA class="reply" v-if="appearNote.replyId" :to="`/notes/${appearNote.replyId}`"><i class="fas fa-reply"></i></MkA>
|
||||||
<Mfm v-if="appearNote.text" :text="appearNote.text" :author="appearNote.user" :i="$i" :custom-emojis="appearNote.emojis"/>
|
<Mfm v-if="appearNote.text" :text="appearNote.text" :author="appearNote.user" :i="$i" :custom-emojis="appearNote.emojis"/>
|
||||||
<a class="rp" v-if="appearNote.renote != null">RN:</a>
|
<a class="rp" v-if="appearNote.renote != null">RN:</a>
|
||||||
|
<div class="translation" v-if="translating || translation">
|
||||||
|
<MkLoading v-if="translating" mini/>
|
||||||
|
<div class="translated" v-else>
|
||||||
|
<b>{{ $t('translatedFrom', { x: translation.sourceLang }) }}:</b>
|
||||||
|
{{ translation.text }}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="files" v-if="appearNote.files.length > 0">
|
<div class="files" v-if="appearNote.files.length > 0">
|
||||||
<XMediaList :media-list="appearNote.files"/>
|
<XMediaList :media-list="appearNote.files"/>
|
||||||
@@ -164,6 +171,8 @@ export default defineComponent({
|
|||||||
collapsed: false,
|
collapsed: false,
|
||||||
isDeleted: false,
|
isDeleted: false,
|
||||||
muted: false,
|
muted: false,
|
||||||
|
translation: null,
|
||||||
|
translating: false,
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
|
|
||||||
@@ -429,7 +438,7 @@ export default defineComponent({
|
|||||||
renote(viaKeyboard = false) {
|
renote(viaKeyboard = false) {
|
||||||
pleaseLogin();
|
pleaseLogin();
|
||||||
this.blur();
|
this.blur();
|
||||||
os.modalMenu([{
|
os.popupMenu([{
|
||||||
text: this.$ts.renote,
|
text: this.$ts.renote,
|
||||||
icon: 'fas fa-retweet',
|
icon: 'fas fa-retweet',
|
||||||
action: () => {
|
action: () => {
|
||||||
@@ -594,6 +603,11 @@ export default defineComponent({
|
|||||||
text: this.$ts.share,
|
text: this.$ts.share,
|
||||||
action: this.share
|
action: this.share
|
||||||
},
|
},
|
||||||
|
this.$instance.translatorAvailable ? {
|
||||||
|
icon: 'fas fa-language',
|
||||||
|
text: this.$ts.translate,
|
||||||
|
action: this.translate
|
||||||
|
} : undefined,
|
||||||
null,
|
null,
|
||||||
statePromise.then(state => state.isFavorited ? {
|
statePromise.then(state => state.isFavorited ? {
|
||||||
icon: 'fas fa-star',
|
icon: 'fas fa-star',
|
||||||
@@ -718,14 +732,14 @@ export default defineComponent({
|
|||||||
},
|
},
|
||||||
|
|
||||||
menu(viaKeyboard = false) {
|
menu(viaKeyboard = false) {
|
||||||
os.modalMenu(this.getMenu(), this.$refs.menuButton, {
|
os.popupMenu(this.getMenu(), this.$refs.menuButton, {
|
||||||
viaKeyboard
|
viaKeyboard
|
||||||
}).then(this.focus);
|
}).then(this.focus);
|
||||||
},
|
},
|
||||||
|
|
||||||
showRenoteMenu(viaKeyboard = false) {
|
showRenoteMenu(viaKeyboard = false) {
|
||||||
if (!this.isMyRenote) return;
|
if (!this.isMyRenote) return;
|
||||||
os.modalMenu([{
|
os.popupMenu([{
|
||||||
text: this.$ts.unrenote,
|
text: this.$ts.unrenote,
|
||||||
icon: 'fas fa-trash-alt',
|
icon: 'fas fa-trash-alt',
|
||||||
danger: true,
|
danger: true,
|
||||||
@@ -769,7 +783,7 @@ export default defineComponent({
|
|||||||
|
|
||||||
async clip() {
|
async clip() {
|
||||||
const clips = await os.api('clips/list');
|
const clips = await os.api('clips/list');
|
||||||
os.modalMenu([{
|
os.popupMenu([{
|
||||||
icon: 'fas fa-plus',
|
icon: 'fas fa-plus',
|
||||||
text: this.$ts.createNew,
|
text: this.$ts.createNew,
|
||||||
action: async () => {
|
action: async () => {
|
||||||
@@ -827,6 +841,17 @@ export default defineComponent({
|
|||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
|
async translate() {
|
||||||
|
if (this.translation != null) return;
|
||||||
|
this.translating = true;
|
||||||
|
const res = await os.api('notes/translate', {
|
||||||
|
noteId: this.appearNote.id,
|
||||||
|
targetLang: localStorage.getItem('lang') || navigator.language,
|
||||||
|
});
|
||||||
|
this.translating = false;
|
||||||
|
this.translation = res;
|
||||||
|
},
|
||||||
|
|
||||||
focus() {
|
focus() {
|
||||||
this.$el.focus();
|
this.$el.focus();
|
||||||
},
|
},
|
||||||
@@ -1053,6 +1078,13 @@ export default defineComponent({
|
|||||||
font-style: oblique;
|
font-style: oblique;
|
||||||
color: var(--renote);
|
color: var(--renote);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
> .translation {
|
||||||
|
border: solid 0.5px var(--divider);
|
||||||
|
border-radius: var(--radius);
|
||||||
|
padding: 12px;
|
||||||
|
margin-top: 8px;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
> .url-preview {
|
> .url-preview {
|
||||||
|
@@ -9,7 +9,7 @@
|
|||||||
<div>{{ $ts.noNotes }}</div>
|
<div>{{ $ts.noNotes }}</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div v-else>
|
<div v-else class="giivymft" :class="{ noGap }">
|
||||||
<div v-show="more && reversed" style="margin-bottom: var(--margin);">
|
<div v-show="more && reversed" style="margin-bottom: var(--margin);">
|
||||||
<MkButton style="margin: 0 auto;" @click="fetchMoreFeature" :disabled="moreFetching" :style="{ cursor: moreFetching ? 'wait' : 'pointer' }">
|
<MkButton style="margin: 0 auto;" @click="fetchMoreFeature" :disabled="moreFetching" :style="{ cursor: moreFetching ? 'wait' : 'pointer' }">
|
||||||
<template v-if="!moreFetching">{{ $ts.loadMore }}</template>
|
<template v-if="!moreFetching">{{ $ts.loadMore }}</template>
|
||||||
@@ -17,8 +17,8 @@
|
|||||||
</MkButton>
|
</MkButton>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<XList ref="notes" :items="notes" v-slot="{ item: note }" :direction="reversed ? 'up' : 'down'" :reversed="reversed" :no-gap="noGap" :ad="true">
|
<XList ref="notes" :items="notes" v-slot="{ item: note }" :direction="reversed ? 'up' : 'down'" :reversed="reversed" :no-gap="noGap" :ad="true" class="notes">
|
||||||
<XNote :note="note" class="_block" @update:note="updated(note, $event)" :key="note._featuredId_ || note._prId_ || note.id"/>
|
<XNote class="qtqtichx" :note="note" @update:note="updated(note, $event)" :key="note._featuredId_ || note._prId_ || note.id"/>
|
||||||
</XList>
|
</XList>
|
||||||
|
|
||||||
<div v-show="more && !reversed" style="margin-top: var(--margin);">
|
<div v-show="more && !reversed" style="margin-top: var(--margin);">
|
||||||
@@ -108,4 +108,23 @@ export default defineComponent({
|
|||||||
.fade-leave-to {
|
.fade-leave-to {
|
||||||
opacity: 0;
|
opacity: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.giivymft {
|
||||||
|
&.noGap {
|
||||||
|
> .notes {
|
||||||
|
background: var(--panel);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&:not(.noGap) {
|
||||||
|
> .notes {
|
||||||
|
background: var(--bg);
|
||||||
|
|
||||||
|
.qtqtichx {
|
||||||
|
background: var(--panel);
|
||||||
|
border-radius: var(--radius);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
</style>
|
</style>
|
||||||
|
@@ -11,16 +11,16 @@
|
|||||||
<template #header>{{ $ts.notificationSetting }}</template>
|
<template #header>{{ $ts.notificationSetting }}</template>
|
||||||
<div class="_monolithic_">
|
<div class="_monolithic_">
|
||||||
<div v-if="showGlobalToggle" class="_section">
|
<div v-if="showGlobalToggle" class="_section">
|
||||||
<MkSwitch v-model:value="useGlobalSetting">
|
<MkSwitch v-model="useGlobalSetting">
|
||||||
{{ $ts.useGlobalSetting }}
|
{{ $ts.useGlobalSetting }}
|
||||||
<template #desc>{{ $ts.useGlobalSettingDesc }}</template>
|
<template #caption>{{ $ts.useGlobalSettingDesc }}</template>
|
||||||
</MkSwitch>
|
</MkSwitch>
|
||||||
</div>
|
</div>
|
||||||
<div v-if="!useGlobalSetting" class="_section">
|
<div v-if="!useGlobalSetting" class="_section">
|
||||||
<MkInfo>{{ $ts.notificationSettingDesc }}</MkInfo>
|
<MkInfo>{{ $ts.notificationSettingDesc }}</MkInfo>
|
||||||
<MkButton inline @click="disableAll">{{ $ts.disableAll }}</MkButton>
|
<MkButton inline @click="disableAll">{{ $ts.disableAll }}</MkButton>
|
||||||
<MkButton inline @click="enableAll">{{ $ts.enableAll }}</MkButton>
|
<MkButton inline @click="enableAll">{{ $ts.enableAll }}</MkButton>
|
||||||
<MkSwitch v-for="type in notificationTypes" :key="type" v-model:value="typesMap[type]">{{ $t(`_notification._types.${type}`) }}</MkSwitch>
|
<MkSwitch v-for="type in notificationTypes" :key="type" v-model="typesMap[type]">{{ $t(`_notification._types.${type}`) }}</MkSwitch>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</XModalWindow>
|
</XModalWindow>
|
||||||
|
@@ -58,12 +58,12 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { defineComponent } from 'vue';
|
import { defineComponent, markRaw } from 'vue';
|
||||||
import { getNoteSummary } from '@/misc/get-note-summary';
|
import { getNoteSummary } from '@/misc/get-note-summary';
|
||||||
import XReactionIcon from './reaction-icon.vue';
|
import XReactionIcon from './reaction-icon.vue';
|
||||||
import MkFollowButton from './follow-button.vue';
|
import MkFollowButton from './follow-button.vue';
|
||||||
import notePage from '../filters/note';
|
import notePage from '@client/filters/note';
|
||||||
import { userPage } from '../filters/user';
|
import { userPage } from '@client/filters/user';
|
||||||
import { i18n } from '@client/i18n';
|
import { i18n } from '@client/i18n';
|
||||||
import * as os from '@client/os';
|
import * as os from '@client/os';
|
||||||
|
|
||||||
@@ -109,7 +109,7 @@ export default defineComponent({
|
|||||||
|
|
||||||
this.readObserver.observe(this.$el);
|
this.readObserver.observe(this.$el);
|
||||||
|
|
||||||
this.connection = os.stream.useChannel('main');
|
this.connection = markRaw(os.stream.useChannel('main'));
|
||||||
this.connection.on('readAllNotifications', () => this.readObserver.unobserve(this.$el));
|
this.connection.on('readAllNotifications', () => this.readObserver.unobserve(this.$el));
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
@@ -7,7 +7,7 @@
|
|||||||
<p class="mfcuwfyp" v-else-if="empty">{{ $ts.noNotifications }}</p>
|
<p class="mfcuwfyp" v-else-if="empty">{{ $ts.noNotifications }}</p>
|
||||||
|
|
||||||
<div v-else>
|
<div v-else>
|
||||||
<XList class="notifications" :items="items" v-slot="{ item: notification }" :no-gap="true">
|
<XList class="elsfgstc" :items="items" v-slot="{ item: notification }" :no-gap="true">
|
||||||
<XNote v-if="['reply', 'quote', 'mention'].includes(notification.type)" :note="notification.note" @update:note="noteUpdated(notification.note, $event)" :key="notification.id"/>
|
<XNote v-if="['reply', 'quote', 'mention'].includes(notification.type)" :note="notification.note" @update:note="noteUpdated(notification.note, $event)" :key="notification.id"/>
|
||||||
<XNotification v-else :notification="notification" :with-time="true" :full="true" class="_panel notification" :key="notification.id"/>
|
<XNotification v-else :notification="notification" :with-time="true" :full="true" class="_panel notification" :key="notification.id"/>
|
||||||
</XList>
|
</XList>
|
||||||
@@ -21,7 +21,7 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { defineComponent, PropType } from 'vue';
|
import { defineComponent, PropType, markRaw } from 'vue';
|
||||||
import paging from '@client/scripts/paging';
|
import paging from '@client/scripts/paging';
|
||||||
import XNotification from './notification.vue';
|
import XNotification from './notification.vue';
|
||||||
import XList from './date-separated-list.vue';
|
import XList from './date-separated-list.vue';
|
||||||
@@ -89,7 +89,7 @@ export default defineComponent({
|
|||||||
},
|
},
|
||||||
|
|
||||||
mounted() {
|
mounted() {
|
||||||
this.connection = os.stream.useChannel('main');
|
this.connection = markRaw(os.stream.useChannel('main'));
|
||||||
this.connection.on('notification', this.onNotification);
|
this.connection.on('notification', this.onNotification);
|
||||||
},
|
},
|
||||||
|
|
||||||
@@ -141,4 +141,8 @@ export default defineComponent({
|
|||||||
text-align: center;
|
text-align: center;
|
||||||
color: var(--fg);
|
color: var(--fg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.elsfgstc {
|
||||||
|
background: var(--panel);
|
||||||
|
}
|
||||||
</style>
|
</style>
|
||||||
|
@@ -16,7 +16,7 @@
|
|||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { defineComponent } from 'vue';
|
import { defineComponent } from 'vue';
|
||||||
import { userName } from '../filters/user';
|
import { userName } from '@client/filters/user';
|
||||||
import * as os from '@client/os';
|
import * as os from '@client/os';
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
|
@@ -3,16 +3,12 @@
|
|||||||
:initial-width="500"
|
:initial-width="500"
|
||||||
:initial-height="500"
|
:initial-height="500"
|
||||||
:can-resize="true"
|
:can-resize="true"
|
||||||
:close-right="true"
|
:close-button="false"
|
||||||
:contextmenu="contextmenu"
|
:contextmenu="contextmenu"
|
||||||
@closed="$emit('closed')"
|
@closed="$emit('closed')"
|
||||||
>
|
>
|
||||||
<template #header>
|
<template #header>
|
||||||
<XHeader :info="pageInfo" :with-back="false"/>
|
<XHeader :info="pageInfo" :back-button="history.length > 0" @back="back()" :close-button="true" @close="close()"/>
|
||||||
</template>
|
|
||||||
<template #buttons>
|
|
||||||
<button class="_button" @click="back()" v-if="history.length > 0"><i class="fas fa-chevron-left"></i></button>
|
|
||||||
<button class="_button" style="pointer-events: none;" v-else><!-- マージンのバランスを取るためのダミー --></button>
|
|
||||||
</template>
|
</template>
|
||||||
<div class="yrolvcoq _flat_">
|
<div class="yrolvcoq _flat_">
|
||||||
<component :is="component" v-bind="props" :ref="changePage"/>
|
<component :is="component" v-bind="props" :ref="changePage"/>
|
||||||
@@ -139,6 +135,10 @@ export default defineComponent({
|
|||||||
this.navigate(this.history.pop(), false);
|
this.navigate(this.history.pop(), false);
|
||||||
},
|
},
|
||||||
|
|
||||||
|
close() {
|
||||||
|
this.$refs.window.close();
|
||||||
|
},
|
||||||
|
|
||||||
expand() {
|
expand() {
|
||||||
this.$router.push(this.path);
|
this.$router.push(this.path);
|
||||||
this.$refs.window.close();
|
this.$refs.window.close();
|
||||||
@@ -155,6 +155,5 @@ export default defineComponent({
|
|||||||
<style lang="scss" scoped>
|
<style lang="scss" scoped>
|
||||||
.yrolvcoq {
|
.yrolvcoq {
|
||||||
min-height: 100%;
|
min-height: 100%;
|
||||||
background: var(--bg);
|
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
@@ -1,6 +1,8 @@
|
|||||||
<template>
|
<template>
|
||||||
<div>
|
<div>
|
||||||
<MkInput class="kudkigyw" :value="value" @update:value="updateValue($event)" type="number">{{ hpml.interpolate(block.text) }}</MkInput>
|
<MkInput class="kudkigyw" :model-value="value" @update:modelValue="updateValue($event)" type="number">
|
||||||
|
<template #label>{{ hpml.interpolate(block.text) }}</template>
|
||||||
|
</MkInput>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="ngbfujlo">
|
<div class="ngbfujlo">
|
||||||
<MkTextarea :value="text" readonly style="margin: 0;"></MkTextarea>
|
<MkTextarea :model-value="text" readonly style="margin: 0;"></MkTextarea>
|
||||||
<MkButton class="button" primary @click="post()" :disabled="posting || posted">
|
<MkButton class="button" primary @click="post()" :disabled="posting || posted">
|
||||||
<i v-if="posted" class="fas fa-check"></i>
|
<i v-if="posted" class="fas fa-check"></i>
|
||||||
<i v-else class="fas fa-paper-plane"></i>
|
<i v-else class="fas fa-paper-plane"></i>
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="hkcxmtwj">
|
<div class="hkcxmtwj">
|
||||||
<MkSwitch :value="value" @update:value="updateValue($event)">{{ hpml.interpolate(block.text) }}</MkSwitch>
|
<MkSwitch :model-value="value" @update:modelValue="updateValue($event)">{{ hpml.interpolate(block.text) }}</MkSwitch>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
|
@@ -1,6 +1,8 @@
|
|||||||
<template>
|
<template>
|
||||||
<div>
|
<div>
|
||||||
<MkInput class="kudkigyw" :value="value" @update:value="updateValue($event)" type="text">{{ hpml.interpolate(block.text) }}</MkInput>
|
<MkInput class="kudkigyw" :model-value="value" @update:modelValue="updateValue($event)" type="text">
|
||||||
|
<template #label>{{ hpml.interpolate(block.text) }}</template>
|
||||||
|
</MkInput>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
|
@@ -1,6 +1,8 @@
|
|||||||
<template>
|
<template>
|
||||||
<div>
|
<div>
|
||||||
<MkTextarea :value="value" @update:value="updateValue($event)">{{ hpml.interpolate(block.text) }}</MkTextarea>
|
<MkTextarea :model-value="value" @update:modelValue="updateValue($event)">
|
||||||
|
<template #label>{{ hpml.interpolate(block.text) }}</template>
|
||||||
|
</MkTextarea>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
<template>
|
<template>
|
||||||
<MkTextarea :value="text" readonly></MkTextarea>
|
<MkTextarea :model-value="text" readonly></MkTextarea>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
|
@@ -5,8 +5,7 @@
|
|||||||
</p>
|
</p>
|
||||||
<ul ref="choices">
|
<ul ref="choices">
|
||||||
<li v-for="(choice, i) in choices" :key="i">
|
<li v-for="(choice, i) in choices" :key="i">
|
||||||
<MkInput class="input" :value="choice" @update:value="onInput(i, $event)">
|
<MkInput class="input" :model-value="choice" @update:modelValue="onInput(i, $event)" :placeholder="$t('_poll.choiceN', { n: i + 1 })">
|
||||||
<span>{{ $t('_poll.choiceN', { n: i + 1 }) }}</span>
|
|
||||||
</MkInput>
|
</MkInput>
|
||||||
<button @click="remove(i)" class="_button">
|
<button @click="remove(i)" class="_button">
|
||||||
<i class="fas fa-times"></i>
|
<i class="fas fa-times"></i>
|
||||||
@@ -16,27 +15,27 @@
|
|||||||
<MkButton class="add" v-if="choices.length < 10" @click="add">{{ $ts.add }}</MkButton>
|
<MkButton class="add" v-if="choices.length < 10" @click="add">{{ $ts.add }}</MkButton>
|
||||||
<MkButton class="add" v-else disabled>{{ $ts._poll.noMore }}</MkButton>
|
<MkButton class="add" v-else disabled>{{ $ts._poll.noMore }}</MkButton>
|
||||||
<section>
|
<section>
|
||||||
<MkSwitch v-model:value="multiple">{{ $ts._poll.canMultipleVote }}</MkSwitch>
|
<MkSwitch v-model="multiple">{{ $ts._poll.canMultipleVote }}</MkSwitch>
|
||||||
<div>
|
<div>
|
||||||
<MkSelect v-model:value="expiration">
|
<MkSelect v-model="expiration">
|
||||||
<template #label>{{ $ts._poll.expiration }}</template>
|
<template #label>{{ $ts._poll.expiration }}</template>
|
||||||
<option value="infinite">{{ $ts._poll.infinite }}</option>
|
<option value="infinite">{{ $ts._poll.infinite }}</option>
|
||||||
<option value="at">{{ $ts._poll.at }}</option>
|
<option value="at">{{ $ts._poll.at }}</option>
|
||||||
<option value="after">{{ $ts._poll.after }}</option>
|
<option value="after">{{ $ts._poll.after }}</option>
|
||||||
</MkSelect>
|
</MkSelect>
|
||||||
<section v-if="expiration === 'at'">
|
<section v-if="expiration === 'at'">
|
||||||
<MkInput v-model:value="atDate" type="date" class="input">
|
<MkInput v-model="atDate" type="date" class="input">
|
||||||
<span>{{ $ts._poll.deadlineDate }}</span>
|
<template #label>{{ $ts._poll.deadlineDate }}</template>
|
||||||
</MkInput>
|
</MkInput>
|
||||||
<MkInput v-model:value="atTime" type="time" class="input">
|
<MkInput v-model="atTime" type="time" class="input">
|
||||||
<span>{{ $ts._poll.deadlineTime }}</span>
|
<template #label>{{ $ts._poll.deadlineTime }}</template>
|
||||||
</MkInput>
|
</MkInput>
|
||||||
</section>
|
</section>
|
||||||
<section v-if="expiration === 'after'">
|
<section v-if="expiration === 'after'">
|
||||||
<MkInput v-model:value="after" type="number" class="input">
|
<MkInput v-model="after" type="number" class="input">
|
||||||
<span>{{ $ts._poll.duration }}</span>
|
<template #label>{{ $ts._poll.duration }}</template>
|
||||||
</MkInput>
|
</MkInput>
|
||||||
<MkSelect v-model:value="unit">
|
<MkSelect v-model="unit">
|
||||||
<option value="second">{{ $ts._time.second }}</option>
|
<option value="second">{{ $ts._time.second }}</option>
|
||||||
<option value="minute">{{ $ts._time.minute }}</option>
|
<option value="minute">{{ $ts._time.minute }}</option>
|
||||||
<option value="hour">{{ $ts._time.hour }}</option>
|
<option value="hour">{{ $ts._time.hour }}</option>
|
||||||
|
@@ -112,7 +112,7 @@ export default defineComponent({
|
|||||||
|
|
||||||
showFileMenu(file, ev: MouseEvent) {
|
showFileMenu(file, ev: MouseEvent) {
|
||||||
if (this.menu) return;
|
if (this.menu) return;
|
||||||
this.menu = os.modalMenu([{
|
this.menu = os.popupMenu([{
|
||||||
text: this.$ts.renameFile,
|
text: this.$ts.renameFile,
|
||||||
icon: 'fas fa-i-cursor',
|
icon: 'fas fa-i-cursor',
|
||||||
action: () => { this.rename(file) }
|
action: () => { this.rename(file) }
|
||||||
|
@@ -17,7 +17,7 @@
|
|||||||
<span v-if="visibility === 'followers'"><i class="fas fa-unlock"></i></span>
|
<span v-if="visibility === 'followers'"><i class="fas fa-unlock"></i></span>
|
||||||
<span v-if="visibility === 'specified'"><i class="fas fa-envelope"></i></span>
|
<span v-if="visibility === 'specified'"><i class="fas fa-envelope"></i></span>
|
||||||
</button>
|
</button>
|
||||||
<button class="submit _buttonPrimary" :disabled="!canPost" @click="post">{{ submitText }}<i :class="reply ? 'fas fa-reply' : renote ? 'fas fa-quote-right' : 'fas fa-paper-plane'"></i></button>
|
<button class="submit _buttonPrimary" :disabled="!canPost" @click="post" data-cy-open-post-form-submit>{{ submitText }}<i :class="reply ? 'fas fa-reply' : renote ? 'fas fa-quote-right' : 'fas fa-paper-plane'"></i></button>
|
||||||
</div>
|
</div>
|
||||||
</header>
|
</header>
|
||||||
<div class="form" :class="{ fixed }">
|
<div class="form" :class="{ fixed }">
|
||||||
@@ -36,7 +36,8 @@
|
|||||||
</div>
|
</div>
|
||||||
<MkInfo warn v-if="hasNotSpecifiedMentions" class="hasNotSpecifiedMentions">{{ $ts.notSpecifiedMentionWarning }} - <button class="_textButton" @click="addMissingMention()">{{ $ts.add }}</button></MkInfo>
|
<MkInfo warn v-if="hasNotSpecifiedMentions" class="hasNotSpecifiedMentions">{{ $ts.notSpecifiedMentionWarning }} - <button class="_textButton" @click="addMissingMention()">{{ $ts.add }}</button></MkInfo>
|
||||||
<input v-show="useCw" ref="cw" class="cw" v-model="cw" :placeholder="$ts.annotation" @keydown="onKeydown">
|
<input v-show="useCw" ref="cw" class="cw" v-model="cw" :placeholder="$ts.annotation" @keydown="onKeydown">
|
||||||
<textarea v-model="text" class="text" :class="{ withCw: useCw }" ref="text" :disabled="posting" :placeholder="placeholder" @keydown="onKeydown" @paste="onPaste" @compositionupdate="onCompositionUpdate" @compositionend="onCompositionEnd" />
|
<textarea v-model="text" class="text" :class="{ withCw: useCw }" ref="text" :disabled="posting" :placeholder="placeholder" @keydown="onKeydown" @paste="onPaste" @compositionupdate="onCompositionUpdate" @compositionend="onCompositionEnd" data-cy-post-form-text/>
|
||||||
|
<input v-show="withHashtags" ref="hashtags" class="hashtags" v-model="hashtags" :placeholder="$ts.hashtags" list="hashtags">
|
||||||
<XPostFormAttaches class="attaches" :files="files" @updated="updateFiles" @detach="detachFile" @changeSensitive="updateFileSensitive" @changeName="updateFileName"/>
|
<XPostFormAttaches class="attaches" :files="files" @updated="updateFiles" @detach="detachFile" @changeSensitive="updateFileSensitive" @changeName="updateFileName"/>
|
||||||
<XPollEditor v-if="poll" :poll="poll" @destroyed="poll = null" @updated="onPollUpdate"/>
|
<XPollEditor v-if="poll" :poll="poll" @destroyed="poll = null" @updated="onPollUpdate"/>
|
||||||
<footer>
|
<footer>
|
||||||
@@ -44,9 +45,13 @@
|
|||||||
<button class="_button" @click="togglePoll" :class="{ active: poll }" v-tooltip="$ts.poll"><i class="fas fa-poll-h"></i></button>
|
<button class="_button" @click="togglePoll" :class="{ active: poll }" v-tooltip="$ts.poll"><i class="fas fa-poll-h"></i></button>
|
||||||
<button class="_button" @click="useCw = !useCw" :class="{ active: useCw }" v-tooltip="$ts.useCw"><i class="fas fa-eye-slash"></i></button>
|
<button class="_button" @click="useCw = !useCw" :class="{ active: useCw }" v-tooltip="$ts.useCw"><i class="fas fa-eye-slash"></i></button>
|
||||||
<button class="_button" @click="insertMention" v-tooltip="$ts.mention"><i class="fas fa-at"></i></button>
|
<button class="_button" @click="insertMention" v-tooltip="$ts.mention"><i class="fas fa-at"></i></button>
|
||||||
|
<button class="_button" @click="withHashtags = !withHashtags" :class="{ active: withHashtags }" v-tooltip="$ts.hashtags"><i class="fas fa-hashtag"></i></button>
|
||||||
<button class="_button" @click="insertEmoji" v-tooltip="$ts.emoji"><i class="fas fa-laugh-squint"></i></button>
|
<button class="_button" @click="insertEmoji" v-tooltip="$ts.emoji"><i class="fas fa-laugh-squint"></i></button>
|
||||||
<button class="_button" @click="showActions" v-tooltip="$ts.plugin" v-if="postFormActions.length > 0"><i class="fas fa-plug"></i></button>
|
<button class="_button" @click="showActions" v-tooltip="$ts.plugin" v-if="postFormActions.length > 0"><i class="fas fa-plug"></i></button>
|
||||||
</footer>
|
</footer>
|
||||||
|
<datalist id="hashtags">
|
||||||
|
<option v-for="hashtag in recentHashtags" :value="hashtag" :key="hashtag"/>
|
||||||
|
</datalist>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
@@ -67,10 +72,11 @@ import { Autocomplete } from '@client/scripts/autocomplete';
|
|||||||
import { noteVisibilities } from '../../types';
|
import { noteVisibilities } from '../../types';
|
||||||
import * as os from '@client/os';
|
import * as os from '@client/os';
|
||||||
import { selectFile } from '@client/scripts/select-file';
|
import { selectFile } from '@client/scripts/select-file';
|
||||||
import { notePostInterruptors, postFormActions } from '@client/store';
|
import { defaultStore, notePostInterruptors, postFormActions } from '@client/store';
|
||||||
import { isMobile } from '@client/scripts/is-mobile';
|
import { isMobile } from '@client/scripts/is-mobile';
|
||||||
import { throttle } from 'throttle-debounce';
|
import { throttle } from 'throttle-debounce';
|
||||||
import MkInfo from '@client/components/ui/info.vue';
|
import MkInfo from '@client/components/ui/info.vue';
|
||||||
|
import { defaultStore } from '@client/store';
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
components: {
|
components: {
|
||||||
@@ -212,7 +218,10 @@ export default defineComponent({
|
|||||||
|
|
||||||
max(): number {
|
max(): number {
|
||||||
return this.$instance ? this.$instance.maxNoteTextLength : 1000;
|
return this.$instance ? this.$instance.maxNoteTextLength : 1000;
|
||||||
}
|
},
|
||||||
|
|
||||||
|
withHashtags: defaultStore.makeGetterSetter('postFormWithHashtags'),
|
||||||
|
hashtags: defaultStore.makeGetterSetter('postFormHashtags'),
|
||||||
},
|
},
|
||||||
|
|
||||||
watch: {
|
watch: {
|
||||||
@@ -303,6 +312,7 @@ export default defineComponent({
|
|||||||
// TODO: detach when unmount
|
// TODO: detach when unmount
|
||||||
new Autocomplete(this.$refs.text, this, { model: 'text' });
|
new Autocomplete(this.$refs.text, this, { model: 'text' });
|
||||||
new Autocomplete(this.$refs.cw, this, { model: 'cw' });
|
new Autocomplete(this.$refs.cw, this, { model: 'cw' });
|
||||||
|
new Autocomplete(this.$refs.hashtags, this, { model: 'hashtags' });
|
||||||
|
|
||||||
this.$nextTick(() => {
|
this.$nextTick(() => {
|
||||||
// 書きかけの投稿を復元
|
// 書きかけの投稿を復元
|
||||||
@@ -329,7 +339,12 @@ export default defineComponent({
|
|||||||
this.cw = init.cw;
|
this.cw = init.cw;
|
||||||
this.useCw = init.cw != null;
|
this.useCw = init.cw != null;
|
||||||
if (init.poll) {
|
if (init.poll) {
|
||||||
this.poll = init.poll;
|
this.poll = {
|
||||||
|
choices: init.poll.choices.map(x => x.text),
|
||||||
|
multiple: init.poll.multiple,
|
||||||
|
expiresAt: init.poll.expiresAt,
|
||||||
|
expiredAfter: init.poll.expiredAfter,
|
||||||
|
};
|
||||||
}
|
}
|
||||||
this.visibility = init.visibility;
|
this.visibility = init.visibility;
|
||||||
this.localOnly = init.localOnly;
|
this.localOnly = init.localOnly;
|
||||||
@@ -605,6 +620,11 @@ export default defineComponent({
|
|||||||
viaMobile: isMobile
|
viaMobile: isMobile
|
||||||
};
|
};
|
||||||
|
|
||||||
|
if (this.withHashtags && this.hashtags && this.hashtags.trim() !== '') {
|
||||||
|
const hashtags = this.hashtags.trim().split(' ').map(x => x.startsWith('#') ? x : '#' + x).join(' ');
|
||||||
|
data.text = data.text ? `${data.text} ${hashtags}` : hashtags;
|
||||||
|
}
|
||||||
|
|
||||||
// plugin
|
// plugin
|
||||||
if (notePostInterruptors.length > 0) {
|
if (notePostInterruptors.length > 0) {
|
||||||
for (const interruptor of notePostInterruptors) {
|
for (const interruptor of notePostInterruptors) {
|
||||||
@@ -618,8 +638,8 @@ export default defineComponent({
|
|||||||
this.$nextTick(() => {
|
this.$nextTick(() => {
|
||||||
this.deleteDraft();
|
this.deleteDraft();
|
||||||
this.$emit('posted');
|
this.$emit('posted');
|
||||||
if (this.text && this.text != '') {
|
if (data.text && data.text != '') {
|
||||||
const hashtags = mfm.parse(this.text).filter(x => x.type === 'hashtag').map(x => x.props.hashtag);
|
const hashtags = mfm.parse(data.text).filter(x => x.type === 'hashtag').map(x => x.props.hashtag);
|
||||||
const history = JSON.parse(localStorage.getItem('hashtags') || '[]') as string[];
|
const history = JSON.parse(localStorage.getItem('hashtags') || '[]') as string[];
|
||||||
localStorage.setItem('hashtags', JSON.stringify(unique(hashtags.concat(history))));
|
localStorage.setItem('hashtags', JSON.stringify(unique(hashtags.concat(history))));
|
||||||
}
|
}
|
||||||
@@ -649,7 +669,7 @@ export default defineComponent({
|
|||||||
},
|
},
|
||||||
|
|
||||||
showActions(ev) {
|
showActions(ev) {
|
||||||
os.modalMenu(postFormActions.map(action => ({
|
os.popupMenu(postFormActions.map(action => ({
|
||||||
text: action.title,
|
text: action.title,
|
||||||
action: () => {
|
action: () => {
|
||||||
action.handler({
|
action.handler({
|
||||||
@@ -785,6 +805,7 @@ export default defineComponent({
|
|||||||
}
|
}
|
||||||
|
|
||||||
> .cw,
|
> .cw,
|
||||||
|
> .hashtags,
|
||||||
> .text {
|
> .text {
|
||||||
display: block;
|
display: block;
|
||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
@@ -813,6 +834,13 @@ export default defineComponent({
|
|||||||
border-bottom: solid 0.5px var(--divider);
|
border-bottom: solid 0.5px var(--divider);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
> .hashtags {
|
||||||
|
z-index: 1;
|
||||||
|
padding-top: 8px;
|
||||||
|
padding-bottom: 8px;
|
||||||
|
border-top: solid 0.5px var(--divider);
|
||||||
|
}
|
||||||
|
|
||||||
> .text {
|
> .text {
|
||||||
max-width: 100%;
|
max-width: 100%;
|
||||||
min-width: 100%;
|
min-width: 100%;
|
||||||
@@ -872,6 +900,7 @@ export default defineComponent({
|
|||||||
}
|
}
|
||||||
|
|
||||||
> .cw,
|
> .cw,
|
||||||
|
> .hashtags,
|
||||||
> .text {
|
> .text {
|
||||||
padding: 0 16px;
|
padding: 0 16px;
|
||||||
}
|
}
|
||||||
|
@@ -170,7 +170,7 @@ export default defineComponent({
|
|||||||
}
|
}
|
||||||
|
|
||||||
> span {
|
> span {
|
||||||
color: #fff;
|
color: var(--fgOnAccent);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -1,10 +1,10 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="_card">
|
<div class="_card">
|
||||||
<div class="_content">
|
<div class="_content">
|
||||||
<MkInput v-model:value="text">
|
<MkInput v-model="text">
|
||||||
<span>Text</span>
|
<template #label>Text</template>
|
||||||
</MkInput>
|
</MkInput>
|
||||||
<MkSwitch v-model:value="flag">
|
<MkSwitch v-model="flag">
|
||||||
<span>Switch is now {{ flag ? 'on' : 'off' }}</span>
|
<span>Switch is now {{ flag ? 'on' : 'off' }}</span>
|
||||||
</MkSwitch>
|
</MkSwitch>
|
||||||
<div style="margin: 32px 0;">
|
<div style="margin: 32px 0;">
|
||||||
@@ -93,7 +93,7 @@ export default defineComponent({
|
|||||||
},
|
},
|
||||||
|
|
||||||
async openMenu(ev) {
|
async openMenu(ev) {
|
||||||
os.modalMenu([{
|
os.popupMenu([{
|
||||||
type: 'label',
|
type: 'label',
|
||||||
text: 'Fruits'
|
text: 'Fruits'
|
||||||
}, {
|
}, {
|
||||||
|
@@ -3,15 +3,13 @@
|
|||||||
<div class="auth _section">
|
<div class="auth _section">
|
||||||
<div class="avatar" :style="{ backgroundImage: user ? `url('${ user.avatarUrl }')` : null }" v-show="withAvatar"></div>
|
<div class="avatar" :style="{ backgroundImage: user ? `url('${ user.avatarUrl }')` : null }" v-show="withAvatar"></div>
|
||||||
<div class="normal-signin" v-if="!totpLogin">
|
<div class="normal-signin" v-if="!totpLogin">
|
||||||
<MkInput v-model:value="username" type="text" pattern="^[a-zA-Z0-9_]+$" spellcheck="false" autofocus required @update:value="onUsernameChange">
|
<MkInput v-model="username" :placeholder="$ts.username" type="text" pattern="^[a-zA-Z0-9_]+$" spellcheck="false" autofocus required @update:modelValue="onUsernameChange" data-cy-signin-username>
|
||||||
<span>{{ $ts.username }}</span>
|
|
||||||
<template #prefix>@</template>
|
<template #prefix>@</template>
|
||||||
<template #suffix>@{{ host }}</template>
|
<template #suffix>@{{ host }}</template>
|
||||||
</MkInput>
|
</MkInput>
|
||||||
<MkInput v-model:value="password" type="password" :with-password-toggle="true" v-if="!user || user && !user.usePasswordLessLogin" required>
|
<MkInput v-model="password" :placeholder="$ts.password" type="password" :with-password-toggle="true" v-if="!user || user && !user.usePasswordLessLogin" required data-cy-signin-password>
|
||||||
<span>{{ $ts.password }}</span>
|
|
||||||
<template #prefix><i class="fas fa-lock"></i></template>
|
<template #prefix><i class="fas fa-lock"></i></template>
|
||||||
<template #desc><button class="_textButton" @click="resetPassword">{{ $ts.forgotPassword }}</button></template>
|
<template #caption><button class="_textButton" @click="resetPassword" type="button">{{ $ts.forgotPassword }}</button></template>
|
||||||
</MkInput>
|
</MkInput>
|
||||||
<MkButton type="submit" primary :disabled="signing" style="margin: 0 auto;">{{ signing ? $ts.loggingIn : $ts.login }}</MkButton>
|
<MkButton type="submit" primary :disabled="signing" style="margin: 0 auto;">{{ signing ? $ts.loggingIn : $ts.login }}</MkButton>
|
||||||
</div>
|
</div>
|
||||||
@@ -27,12 +25,12 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="twofa-group totp-group">
|
<div class="twofa-group totp-group">
|
||||||
<p style="margin-bottom:0;">{{ $ts.twoStepAuthentication }}</p>
|
<p style="margin-bottom:0;">{{ $ts.twoStepAuthentication }}</p>
|
||||||
<MkInput v-model:value="password" type="password" :with-password-toggle="true" v-if="user && user.usePasswordLessLogin" required>
|
<MkInput v-model="password" type="password" :with-password-toggle="true" v-if="user && user.usePasswordLessLogin" required>
|
||||||
<span>{{ $ts.password }}</span>
|
<template #label>{{ $ts.password }}</template>
|
||||||
<template #prefix><i class="fas fa-lock"></i></template>
|
<template #prefix><i class="fas fa-lock"></i></template>
|
||||||
</MkInput>
|
</MkInput>
|
||||||
<MkInput v-model:value="token" type="text" pattern="^[0-9]{6}$" autocomplete="off" spellcheck="false" required>
|
<MkInput v-model="token" type="text" pattern="^[0-9]{6}$" autocomplete="off" spellcheck="false" required>
|
||||||
<span>{{ $ts.token }}</span>
|
<template #label>{{ $ts.token }}</template>
|
||||||
<template #prefix><i class="fas fa-gavel"></i></template>
|
<template #prefix><i class="fas fa-gavel"></i></template>
|
||||||
</MkInput>
|
</MkInput>
|
||||||
<MkButton type="submit" :disabled="signing" primary style="margin: 0 auto;">{{ signing ? $ts.loggingIn : $ts.login }}</MkButton>
|
<MkButton type="submit" :disabled="signing" primary style="margin: 0 auto;">{{ signing ? $ts.loggingIn : $ts.login }}</MkButton>
|
||||||
@@ -113,7 +111,9 @@ export default defineComponent({
|
|||||||
|
|
||||||
onLogin(res) {
|
onLogin(res) {
|
||||||
if (this.autoSet) {
|
if (this.autoSet) {
|
||||||
login(res.i);
|
return login(res.i);
|
||||||
|
} else {
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
@@ -146,7 +146,7 @@ export default defineComponent({
|
|||||||
});
|
});
|
||||||
}).then(res => {
|
}).then(res => {
|
||||||
this.$emit('login', res);
|
this.$emit('login', res);
|
||||||
this.onLogin(res);
|
return this.onLogin(res);
|
||||||
}).catch(err => {
|
}).catch(err => {
|
||||||
if (err === null) return;
|
if (err === null) return;
|
||||||
os.dialog({
|
os.dialog({
|
||||||
|
@@ -1,39 +1,39 @@
|
|||||||
<template>
|
<template>
|
||||||
<form class="mk-signup" @submit.prevent="onSubmit" :autocomplete="Math.random()">
|
<form class="qlvuhzng" @submit.prevent="onSubmit" :autocomplete="Math.random()">
|
||||||
<template v-if="meta">
|
<template v-if="meta">
|
||||||
<MkInput v-if="meta.disableRegistration" v-model:value="invitationCode" type="text" :autocomplete="Math.random()" spellcheck="false" required>
|
<MkInput class="_inputNoTopMargin" v-if="meta.disableRegistration" v-model="invitationCode" type="text" :autocomplete="Math.random()" spellcheck="false" required>
|
||||||
<span>{{ $ts.invitationCode }}</span>
|
<template #label>{{ $ts.invitationCode }}</template>
|
||||||
<template #prefix><i class="fas fa-key"></i></template>
|
<template #prefix><i class="fas fa-key"></i></template>
|
||||||
</MkInput>
|
</MkInput>
|
||||||
<MkInput v-model:value="username" type="text" pattern="^[a-zA-Z0-9_]{1,20}$" :autocomplete="Math.random()" spellcheck="false" required @update:value="onChangeUsername">
|
<MkInput class="_inputNoTopMargin" v-model="username" type="text" pattern="^[a-zA-Z0-9_]{1,20}$" :autocomplete="Math.random()" spellcheck="false" required @update:modelValue="onChangeUsername" data-cy-signup-username>
|
||||||
<span>{{ $ts.username }}</span>
|
<template #label>{{ $ts.username }} <div class="_button _help" v-tooltip:dialog="$ts.usernameInfo"><i class="far fa-question-circle"></i></div></template>
|
||||||
<template #prefix>@</template>
|
<template #prefix>@</template>
|
||||||
<template #suffix>@{{ host }}</template>
|
<template #suffix>@{{ host }}</template>
|
||||||
<template #desc>
|
<template #caption>
|
||||||
<span v-if="usernameState == 'wait'" style="color:#999"><i class="fas fa-spinner fa-pulse fa-fw"></i> {{ $ts.checking }}</span>
|
<span v-if="usernameState == 'wait'" style="color:#999"><i class="fas fa-spinner fa-pulse fa-fw"></i> {{ $ts.checking }}</span>
|
||||||
<span v-if="usernameState == 'ok'" style="color:#3CB7B5"><i class="fas fa-check fa-fw"></i> {{ $ts.available }}</span>
|
<span v-if="usernameState == 'ok'" style="color: var(--success)"><i class="fas fa-check fa-fw"></i> {{ $ts.available }}</span>
|
||||||
<span v-if="usernameState == 'unavailable'" style="color:#FF1161"><i class="fas fa-exclamation-triangle fa-fw"></i> {{ $ts.unavailable }}</span>
|
<span v-if="usernameState == 'unavailable'" style="color: var(--error)"><i class="fas fa-exclamation-triangle fa-fw"></i> {{ $ts.unavailable }}</span>
|
||||||
<span v-if="usernameState == 'error'" style="color:#FF1161"><i class="fas fa-exclamation-triangle fa-fw"></i> {{ $ts.error }}</span>
|
<span v-if="usernameState == 'error'" style="color: var(--error)"><i class="fas fa-exclamation-triangle fa-fw"></i> {{ $ts.error }}</span>
|
||||||
<span v-if="usernameState == 'invalid-format'" style="color:#FF1161"><i class="fas fa-exclamation-triangle fa-fw"></i> {{ $ts.usernameInvalidFormat }}</span>
|
<span v-if="usernameState == 'invalid-format'" style="color: var(--error)"><i class="fas fa-exclamation-triangle fa-fw"></i> {{ $ts.usernameInvalidFormat }}</span>
|
||||||
<span v-if="usernameState == 'min-range'" style="color:#FF1161"><i class="fas fa-exclamation-triangle fa-fw"></i> {{ $ts.tooShort }}</span>
|
<span v-if="usernameState == 'min-range'" style="color: var(--error)"><i class="fas fa-exclamation-triangle fa-fw"></i> {{ $ts.tooShort }}</span>
|
||||||
<span v-if="usernameState == 'max-range'" style="color:#FF1161"><i class="fas fa-exclamation-triangle fa-fw"></i> {{ $ts.tooLong }}</span>
|
<span v-if="usernameState == 'max-range'" style="color: var(--error)"><i class="fas fa-exclamation-triangle fa-fw"></i> {{ $ts.tooLong }}</span>
|
||||||
</template>
|
</template>
|
||||||
</MkInput>
|
</MkInput>
|
||||||
<MkInput v-model:value="password" type="password" :autocomplete="Math.random()" required @update:value="onChangePassword">
|
<MkInput v-model="password" type="password" :autocomplete="Math.random()" required @update:modelValue="onChangePassword" data-cy-signup-password>
|
||||||
<span>{{ $ts.password }}</span>
|
<template #label>{{ $ts.password }}</template>
|
||||||
<template #prefix><i class="fas fa-lock"></i></template>
|
<template #prefix><i class="fas fa-lock"></i></template>
|
||||||
<template #desc>
|
<template #caption>
|
||||||
<p v-if="passwordStrength == 'low'" style="color:#FF1161"><i class="fas fa-exclamation-triangle fa-fw"></i> {{ $ts.weakPassword }}</p>
|
<span v-if="passwordStrength == 'low'" style="color: var(--error)"><i class="fas fa-exclamation-triangle fa-fw"></i> {{ $ts.weakPassword }}</span>
|
||||||
<p v-if="passwordStrength == 'medium'" style="color:#3CB7B5"><i class="fas fa-check fa-fw"></i> {{ $ts.normalPassword }}</p>
|
<span v-if="passwordStrength == 'medium'" style="color: var(--warn)"><i class="fas fa-check fa-fw"></i> {{ $ts.normalPassword }}</span>
|
||||||
<p v-if="passwordStrength == 'high'" style="color:#3CB7B5"><i class="fas fa-check fa-fw"></i> {{ $ts.strongPassword }}</p>
|
<span v-if="passwordStrength == 'high'" style="color: var(--success)"><i class="fas fa-check fa-fw"></i> {{ $ts.strongPassword }}</span>
|
||||||
</template>
|
</template>
|
||||||
</MkInput>
|
</MkInput>
|
||||||
<MkInput v-model:value="retypedPassword" type="password" :autocomplete="Math.random()" required @update:value="onChangePasswordRetype">
|
<MkInput v-model="retypedPassword" type="password" :autocomplete="Math.random()" required @update:modelValue="onChangePasswordRetype" data-cy-signup-password-retype>
|
||||||
<span>{{ $ts.password }} ({{ $ts.retype }})</span>
|
<template #label>{{ $ts.password }} ({{ $ts.retype }})</template>
|
||||||
<template #prefix><i class="fas fa-lock"></i></template>
|
<template #prefix><i class="fas fa-lock"></i></template>
|
||||||
<template #desc>
|
<template #caption>
|
||||||
<p v-if="passwordRetypeState == 'match'" style="color:#3CB7B5"><i class="fas fa-check fa-fw"></i> {{ $ts.passwordMatched }}</p>
|
<span v-if="passwordRetypeState == 'match'" style="color: var(--success)"><i class="fas fa-check fa-fw"></i> {{ $ts.passwordMatched }}</span>
|
||||||
<p v-if="passwordRetypeState == 'not-match'" style="color:#FF1161"><i class="fas fa-exclamation-triangle fa-fw"></i> {{ $ts.passwordNotMatched }}</p>
|
<span v-if="passwordRetypeState == 'not-match'" style="color: var(--error)"><i class="fas fa-exclamation-triangle fa-fw"></i> {{ $ts.passwordNotMatched }}</span>
|
||||||
</template>
|
</template>
|
||||||
</MkInput>
|
</MkInput>
|
||||||
<label v-if="meta.tosUrl" class="tou">
|
<label v-if="meta.tosUrl" class="tou">
|
||||||
@@ -46,7 +46,7 @@
|
|||||||
</label>
|
</label>
|
||||||
<captcha v-if="meta.enableHcaptcha" class="captcha" provider="hcaptcha" ref="hcaptcha" v-model:value="hCaptchaResponse" :sitekey="meta.hcaptchaSiteKey"/>
|
<captcha v-if="meta.enableHcaptcha" class="captcha" provider="hcaptcha" ref="hcaptcha" v-model:value="hCaptchaResponse" :sitekey="meta.hcaptchaSiteKey"/>
|
||||||
<captcha v-if="meta.enableRecaptcha" class="captcha" provider="recaptcha" ref="recaptcha" v-model:value="reCaptchaResponse" :sitekey="meta.recaptchaSiteKey"/>
|
<captcha v-if="meta.enableRecaptcha" class="captcha" provider="recaptcha" ref="recaptcha" v-model:value="reCaptchaResponse" :sitekey="meta.recaptchaSiteKey"/>
|
||||||
<MkButton type="submit" :disabled="shouldDisableSubmitting" primary>{{ $ts.start }}</MkButton>
|
<MkButton type="submit" :disabled="shouldDisableSubmitting" primary data-cy-signup-submit>{{ $ts.start }}</MkButton>
|
||||||
</template>
|
</template>
|
||||||
</form>
|
</form>
|
||||||
</template>
|
</template>
|
||||||
@@ -178,14 +178,14 @@ export default defineComponent({
|
|||||||
'hcaptcha-response': this.hCaptchaResponse,
|
'hcaptcha-response': this.hCaptchaResponse,
|
||||||
'g-recaptcha-response': this.reCaptchaResponse,
|
'g-recaptcha-response': this.reCaptchaResponse,
|
||||||
}).then(() => {
|
}).then(() => {
|
||||||
os.api('signin', {
|
return os.api('signin', {
|
||||||
username: this.username,
|
username: this.username,
|
||||||
password: this.password
|
password: this.password
|
||||||
}).then(res => {
|
}).then(res => {
|
||||||
this.$emit('signup', res);
|
this.$emit('signup', res);
|
||||||
|
|
||||||
if (this.autoSet) {
|
if (this.autoSet) {
|
||||||
login(res.i);
|
return login(res.i);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}).catch(() => {
|
}).catch(() => {
|
||||||
@@ -204,7 +204,7 @@ export default defineComponent({
|
|||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="scss" scoped>
|
<style lang="scss" scoped>
|
||||||
.mk-signup {
|
.qlvuhzng {
|
||||||
.captcha {
|
.captcha {
|
||||||
margin: 16px 0;
|
margin: 16px 0;
|
||||||
}
|
}
|
||||||
|
@@ -3,7 +3,7 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { defineComponent } from 'vue';
|
import { defineComponent, markRaw } from 'vue';
|
||||||
import XNotes from './notes.vue';
|
import XNotes from './notes.vue';
|
||||||
import * as os from '@client/os';
|
import * as os from '@client/os';
|
||||||
import * as sound from '@client/scripts/sound';
|
import * as sound from '@client/scripts/sound';
|
||||||
@@ -92,33 +92,33 @@ export default defineComponent({
|
|||||||
this.query = {
|
this.query = {
|
||||||
antennaId: this.antenna
|
antennaId: this.antenna
|
||||||
};
|
};
|
||||||
this.connection = os.stream.useChannel('antenna', {
|
this.connection = markRaw(os.stream.useChannel('antenna', {
|
||||||
antennaId: this.antenna
|
antennaId: this.antenna
|
||||||
});
|
}));
|
||||||
this.connection.on('note', prepend);
|
this.connection.on('note', prepend);
|
||||||
} else if (this.src == 'home') {
|
} else if (this.src == 'home') {
|
||||||
endpoint = 'notes/timeline';
|
endpoint = 'notes/timeline';
|
||||||
this.connection = os.stream.useChannel('homeTimeline');
|
this.connection = markRaw(os.stream.useChannel('homeTimeline'));
|
||||||
this.connection.on('note', prepend);
|
this.connection.on('note', prepend);
|
||||||
|
|
||||||
this.connection2 = os.stream.useChannel('main');
|
this.connection2 = markRaw(os.stream.useChannel('main'));
|
||||||
this.connection2.on('follow', onChangeFollowing);
|
this.connection2.on('follow', onChangeFollowing);
|
||||||
this.connection2.on('unfollow', onChangeFollowing);
|
this.connection2.on('unfollow', onChangeFollowing);
|
||||||
} else if (this.src == 'local') {
|
} else if (this.src == 'local') {
|
||||||
endpoint = 'notes/local-timeline';
|
endpoint = 'notes/local-timeline';
|
||||||
this.connection = os.stream.useChannel('localTimeline');
|
this.connection = markRaw(os.stream.useChannel('localTimeline'));
|
||||||
this.connection.on('note', prepend);
|
this.connection.on('note', prepend);
|
||||||
} else if (this.src == 'social') {
|
} else if (this.src == 'social') {
|
||||||
endpoint = 'notes/hybrid-timeline';
|
endpoint = 'notes/hybrid-timeline';
|
||||||
this.connection = os.stream.useChannel('hybridTimeline');
|
this.connection = markRaw(os.stream.useChannel('hybridTimeline'));
|
||||||
this.connection.on('note', prepend);
|
this.connection.on('note', prepend);
|
||||||
} else if (this.src == 'global') {
|
} else if (this.src == 'global') {
|
||||||
endpoint = 'notes/global-timeline';
|
endpoint = 'notes/global-timeline';
|
||||||
this.connection = os.stream.useChannel('globalTimeline');
|
this.connection = markRaw(os.stream.useChannel('globalTimeline'));
|
||||||
this.connection.on('note', prepend);
|
this.connection.on('note', prepend);
|
||||||
} else if (this.src == 'mentions') {
|
} else if (this.src == 'mentions') {
|
||||||
endpoint = 'notes/mentions';
|
endpoint = 'notes/mentions';
|
||||||
this.connection = os.stream.useChannel('main');
|
this.connection = markRaw(os.stream.useChannel('main'));
|
||||||
this.connection.on('mention', prepend);
|
this.connection.on('mention', prepend);
|
||||||
} else if (this.src == 'directs') {
|
} else if (this.src == 'directs') {
|
||||||
endpoint = 'notes/mentions';
|
endpoint = 'notes/mentions';
|
||||||
@@ -130,16 +130,16 @@ export default defineComponent({
|
|||||||
prepend(note);
|
prepend(note);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
this.connection = os.stream.useChannel('main');
|
this.connection = markRaw(os.stream.useChannel('main'));
|
||||||
this.connection.on('mention', onNote);
|
this.connection.on('mention', onNote);
|
||||||
} else if (this.src == 'list') {
|
} else if (this.src == 'list') {
|
||||||
endpoint = 'notes/user-list-timeline';
|
endpoint = 'notes/user-list-timeline';
|
||||||
this.query = {
|
this.query = {
|
||||||
listId: this.list
|
listId: this.list
|
||||||
};
|
};
|
||||||
this.connection = os.stream.useChannel('userList', {
|
this.connection = markRaw(os.stream.useChannel('userList', {
|
||||||
listId: this.list
|
listId: this.list
|
||||||
});
|
}));
|
||||||
this.connection.on('note', prepend);
|
this.connection.on('note', prepend);
|
||||||
this.connection.on('userAdded', onUserAdded);
|
this.connection.on('userAdded', onUserAdded);
|
||||||
this.connection.on('userRemoved', onUserRemoved);
|
this.connection.on('userRemoved', onUserRemoved);
|
||||||
@@ -148,9 +148,9 @@ export default defineComponent({
|
|||||||
this.query = {
|
this.query = {
|
||||||
channelId: this.channel
|
channelId: this.channel
|
||||||
};
|
};
|
||||||
this.connection = os.stream.useChannel('channel', {
|
this.connection = markRaw(os.stream.useChannel('channel', {
|
||||||
channelId: this.channel
|
channelId: this.channel
|
||||||
});
|
}));
|
||||||
this.connection.on('note', prepend);
|
this.connection.on('note', prepend);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -14,13 +14,15 @@
|
|||||||
<MkInfo warn>{{ information }}</MkInfo>
|
<MkInfo warn>{{ information }}</MkInfo>
|
||||||
</div>
|
</div>
|
||||||
<div class="_section">
|
<div class="_section">
|
||||||
<MkInput v-model:value="name">{{ $ts.name }}</MkInput>
|
<MkInput v-model="name">
|
||||||
|
<template #label>{{ $ts.name }}</template>
|
||||||
|
</MkInput>
|
||||||
</div>
|
</div>
|
||||||
<div class="_section">
|
<div class="_section">
|
||||||
<div style="margin-bottom: 16px;"><b>{{ $ts.permission }}</b></div>
|
<div style="margin-bottom: 16px;"><b>{{ $ts.permission }}</b></div>
|
||||||
<MkButton inline @click="disableAll">{{ $ts.disableAll }}</MkButton>
|
<MkButton inline @click="disableAll">{{ $ts.disableAll }}</MkButton>
|
||||||
<MkButton inline @click="enableAll">{{ $ts.enableAll }}</MkButton>
|
<MkButton inline @click="enableAll">{{ $ts.enableAll }}</MkButton>
|
||||||
<MkSwitch v-for="kind in (initialPermissions || kinds)" :key="kind" v-model:value="permissions[kind]">{{ $t(`_permissions.${kind}`) }}</MkSwitch>
|
<MkSwitch v-for="kind in (initialPermissions || kinds)" :key="kind" v-model="permissions[kind]">{{ $t(`_permissions.${kind}`) }}</MkSwitch>
|
||||||
</div>
|
</div>
|
||||||
</XModalWindow>
|
</XModalWindow>
|
||||||
</template>
|
</template>
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user