Compare commits
258 Commits
Author | SHA1 | Date | |
---|---|---|---|
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 | |||
acb9244205 | |||
3182606e99 | |||
7cc8646ad3 | |||
e793fced61 | |||
248edb5dfd | |||
9414a944b7 | |||
756b8a2a29 | |||
f142ed91fb | |||
6aef54a9e0 | |||
f1c9e596e8 | |||
862ddde0db | |||
ee5a060762 | |||
42d293ee60 | |||
04e27e160e | |||
62dede02ea | |||
6d1d7b5366 | |||
55e5c12441 | |||
0b34503c8a | |||
dc69490e3a | |||
1c241776a6 | |||
6812b895e7 | |||
ab439d0ed6 | |||
c7a2c368d4 | |||
2047860e71 | |||
1dbe03b210 | |||
b59a19c144 | |||
558d288e7b | |||
e24c8b6878 | |||
1772af9583 | |||
cb42f94d9c | |||
38474c7316 | |||
49febe1764 | |||
65addc8206 | |||
28f7e48dc6 | |||
d97fc9ce4e | |||
f26aeee819 | |||
c071467b6a | |||
334ca01092 | |||
c122ec2e79 | |||
d04014f875 | |||
e1247b3e45 | |||
8b9c445fef | |||
a65eb502d2 | |||
55c549a9f8 | |||
56600ba1df | |||
6b312f755e | |||
d6267f797d | |||
a2b8097b4b | |||
22bbee1fa3 | |||
fa1b38394c | |||
441790be2d | |||
5d66bb8794 | |||
a5cdc9a1f4 | |||
a5a2f9d01e | |||
89fb727f61 | |||
929e545514 | |||
3e7a87f75a | |||
caf40e40fb | |||
b608f63a1a | |||
dc44d9a0a8 | |||
bb926dd301 | |||
79cb836483 | |||
f1c4e4a10e | |||
798aedfc0f | |||
1077c2a637 | |||
cbe689607c | |||
948b70cb0f | |||
0263539202 | |||
52e54cf0dc | |||
24e7eeca0f | |||
d76345264d | |||
0eb115bf7e | |||
30d2a1d8b6 | |||
857c88e8d6 | |||
ffb9646ce9 | |||
db3724cf33 | |||
466c083233 | |||
ae2267220b | |||
c92744c3d3 | |||
35f075b887 | |||
6cc4edc5e8 | |||
c06091f78a | |||
f85399e355 | |||
47aaf04481 | |||
7063a6925f | |||
3cd04c4b81 | |||
942c802431 | |||
e6754eb880 | |||
70d02cf1be | |||
ef646b9576 | |||
ecd541873b | |||
5d10642e07 | |||
da34acd35f | |||
0108b8bfe3 | |||
b16c3798a4 | |||
4b33c42da7 | |||
961b3177d5 | |||
7dc85a624e | |||
bfd215542b | |||
d752275730 | |||
be7e389bb5 |
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
|
51
.github/PULL_REQUEST_TEMPLATE.md
vendored
51
.github/PULL_REQUEST_TEMPLATE.md
vendored
@ -1,13 +1,40 @@
|
|||||||
## Summary
|
<!-- ℹ お読みください
|
||||||
|
PRありがとうございます! PRを作成する前に、以下をご確認ください:
|
||||||
|
- 可能であればタイトルに、以下で示すようなPRの種類が分かるキーワードをプリフィクスしてください。
|
||||||
|
- fix / refactor / feat / enhance / perf / chore
|
||||||
|
- また、PRの粒度が適切であることを確認してください。ひとつのPRに複数の種類の変更や関心を含めることは避けてください。
|
||||||
|
- このPRによって解決されるIssueがある場合は、そのIssueへの参照を本文内に含めてください。
|
||||||
|
- CHANGELOG.mdに変更点を追記してください。リファクタリングなど、利用者に影響を与えない変更についてはこの限りではありません。
|
||||||
|
- この変更により新たに作成、もしくは更新すべきドキュメントがないか確認してください。
|
||||||
|
- 機能追加やバグ修正をした場合は、可能であればテストケースを追加してください。
|
||||||
|
- テスト、Lintが通っていることを予め確認してください。
|
||||||
|
- `npm run test`、`npm run lint`でぞれぞれ実施可能です
|
||||||
|
- UIに変更がある場合はスクリーンショットを本文内に添付してください。
|
||||||
|
ご協力ありがとうございます🤗
|
||||||
|
-->
|
||||||
|
<!-- ℹ README
|
||||||
|
Thank you for your PR! Before creating a PR, please check the following:
|
||||||
|
- If possible, prefix the title with a keyword that identifies the type of this PR, as shown below.
|
||||||
|
- fix / refactor / feat / enhance / perf / chore
|
||||||
|
- Also, make sure that the granularity of this PR is appropriate. Please do not include more than one type of change or interest in a single PR.
|
||||||
|
- If there is an Issue 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. 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`.
|
||||||
|
- If this PR includes UI changes, please attach a screenshot in the text.
|
||||||
|
Thanks for your cooperation 🤗
|
||||||
|
-->
|
||||||
|
|
||||||
<!--
|
# What
|
||||||
-
|
<!-- このPRで何をしたのか? どう変わるのか? -->
|
||||||
- * Please describe your changes here *
|
<!-- What did you do with this PR? How will it change things? -->
|
||||||
-
|
|
||||||
- If you are going to resolve some issue, please add this context.
|
# Why
|
||||||
- Resolve #ISSUE_NUMBER
|
<!-- なぜそうするのか? どういう意図なのか? 何が困っているのか? -->
|
||||||
-
|
<!-- Why do you do it? What are your intentions? What is the problem? -->
|
||||||
- If you are going to fix some bug issue, please add this context.
|
|
||||||
- Fix #ISSUE_NUMBER
|
# Additional info (optional)
|
||||||
-
|
<!-- テスト観点など -->
|
||||||
-->
|
<!-- Test perspective, etc -->
|
||||||
|
2
.github/workflows/nodejs.yml
vendored
2
.github/workflows/nodejs.yml
vendored
@ -35,6 +35,8 @@ jobs:
|
|||||||
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
|
||||||
|
@ -2,6 +2,6 @@
|
|||||||
"extension": ["ts","js","cjs","mjs"],
|
"extension": ["ts","js","cjs","mjs"],
|
||||||
"require": ["ts-node/register", "tsconfig-paths/register"],
|
"require": ["ts-node/register", "tsconfig-paths/register"],
|
||||||
"slow": 1000,
|
"slow": 1000,
|
||||||
"timeout": 30000,
|
"timeout": 35000,
|
||||||
"exit": true
|
"exit": true
|
||||||
}
|
}
|
||||||
|
@ -1 +1 @@
|
|||||||
v16.0.0
|
v16.6.2
|
||||||
|
58
CHANGELOG.md
58
CHANGELOG.md
@ -1 +1,57 @@
|
|||||||
see [releases](https://github.com/misskey-dev/misskey/releases)
|
<!--
|
||||||
|
## 12.x.x (unreleased)
|
||||||
|
|
||||||
|
### Improvements
|
||||||
|
|
||||||
|
### Bugfixes
|
||||||
|
|
||||||
|
-->
|
||||||
|
|
||||||
|
## 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メール通知を修正
|
||||||
|
@ -28,12 +28,7 @@ If your language is not listed in Crowdin, please open an issue.
|
|||||||
|
|
||||||

|

|
||||||
|
|
||||||
## Internationalization (i18n)
|
|
||||||
Misskey uses the Vue.js plugin [Vue I18n](https://github.com/kazupon/vue-i18n).
|
|
||||||
Documentation of Vue I18n is available at http://kazupon.github.io/vue-i18n/introduction.html .
|
|
||||||
|
|
||||||
## Documentation
|
## Documentation
|
||||||
* Documents for contributors are located in [`/docs`](/docs).
|
|
||||||
* Documents for instance admins are located in [`/docs`](/docs).
|
* Documents for instance admins are located in [`/docs`](/docs).
|
||||||
* Documents for end users are located in [`/src/docs`](/src/docs).
|
* Documents for end users are located in [`/src/docs`](/src/docs).
|
||||||
|
|
||||||
@ -41,8 +36,8 @@ Documentation of Vue I18n is available at http://kazupon.github.io/vue-i18n/intr
|
|||||||
* Test codes are located in [`/test`](/test).
|
* Test codes are located in [`/test`](/test).
|
||||||
|
|
||||||
## Continuous integration
|
## Continuous integration
|
||||||
Misskey uses CircleCI for executing automated tests.
|
Misskey uses GitHub Actions for executing automated tests.
|
||||||
Configuration files are located in [`/.circleci`](/.circleci).
|
Configuration files are located in [`/.github/workflows`](/.github/workflows).
|
||||||
|
|
||||||
## Adding MisskeyRoom items
|
## Adding MisskeyRoom items
|
||||||
* Use English for material, object and texture names.
|
* Use English for material, object and texture names.
|
||||||
@ -247,6 +242,9 @@ npx ts-node ./node_modules/typeorm/cli.js migration:generate -n 変更の名前
|
|||||||
|
|
||||||
作成されたスクリプトは不必要な変更を含むため除去してください。
|
作成されたスクリプトは不必要な変更を含むため除去してください。
|
||||||
|
|
||||||
|
### コネクションには`markRaw`せよ
|
||||||
|
**Vueのコンポーネントのdataオプションとして**misskey.jsのコネクションを設定するとき、必ず`markRaw`でラップしてください。インスタンスが不必要にリアクティブ化されることで、misskey.js内の処理で不具合が発生するとともに、パフォーマンス上の問題にも繋がる。なお、Composition APIを使う場合はこの限りではない(リアクティブ化はマニュアルなため)。
|
||||||
|
|
||||||
## その他
|
## その他
|
||||||
### HTMLのクラス名で follow という単語は使わない
|
### HTMLのクラス名で follow という単語は使わない
|
||||||
広告ブロッカーで誤ってブロックされる
|
広告ブロッカーで誤ってブロックされる
|
||||||
|
4
COPYING
4
COPYING
@ -6,10 +6,6 @@ And is distributed under The GNU Affero General Public License Version 3, you sh
|
|||||||
|
|
||||||
Misskey includes several third-party Open-Source softwares.
|
Misskey includes several third-party Open-Source softwares.
|
||||||
|
|
||||||
Unicode emoji regular expressions by Twitter, Inc.
|
|
||||||
License: MIT
|
|
||||||
https://github.com/twitter/twemoji-parser/blob/master/LICENSE.md
|
|
||||||
|
|
||||||
Emoji keywords for Unicode 11 and below by Mu-An Chiou
|
Emoji keywords for Unicode 11 and below by Mu-An Chiou
|
||||||
License: MIT
|
License: MIT
|
||||||
https://github.com/muan/emojilib/blob/master/LICENSE
|
https://github.com/muan/emojilib/blob/master/LICENSE
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
FROM node:16.0.0-alpine3.13 AS base
|
FROM node:16.6.2-alpine3.13 AS base
|
||||||
|
|
||||||
ENV NODE_ENV=production
|
ENV NODE_ENV=production
|
||||||
|
|
||||||
@ -18,9 +18,7 @@ RUN apk add --no-cache \
|
|||||||
nasm \
|
nasm \
|
||||||
pkgconfig \
|
pkgconfig \
|
||||||
python3 \
|
python3 \
|
||||||
zlib-dev \
|
zlib-dev
|
||||||
vips-dev \
|
|
||||||
vips
|
|
||||||
|
|
||||||
COPY package.json yarn.lock .yarnrc ./
|
COPY package.json yarn.lock .yarnrc ./
|
||||||
RUN yarn install
|
RUN yarn install
|
||||||
@ -31,8 +29,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", "--"]
|
||||||
|
|
||||||
|
@ -99,6 +99,11 @@ Please see the [Contribution Guide](./CONTRIBUTING.md).
|
|||||||
|
|
||||||
To receive updates of this repo, follow [@repo@misskey.io](https://misskey.io/@repo) on fediverse.
|
To receive updates of this repo, follow [@repo@misskey.io](https://misskey.io/@repo) on fediverse.
|
||||||
|
|
||||||
|
Related projects
|
||||||
|
----------------------------------------------------------------
|
||||||
|
- [misskey.js](https://github.com/misskey-dev/misskey.js) - Misskey SDK for JavaScript
|
||||||
|
- [mfm.js](https://github.com/misskey-dev/mfm.js) - MFM parser
|
||||||
|
|
||||||
:heart: Backers
|
:heart: Backers
|
||||||
----------------------------------------------------------------
|
----------------------------------------------------------------
|
||||||
<!-- PATREON_START -->
|
<!-- PATREON_START -->
|
||||||
|
9
SECURITY.md
Normal file
9
SECURITY.md
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
# Reporting Security Issues
|
||||||
|
|
||||||
|
If you discover a security issue in Misskey, please report it by sending an
|
||||||
|
email to [syuilotan@yahoo.co.jp](mailto:syuilotan@yahoo.co.jp).
|
||||||
|
|
||||||
|
This will allow us to assess the risk, and make a fix available before we add a
|
||||||
|
bug report to the GitHub repository.
|
||||||
|
|
||||||
|
Thanks for helping make Misskey safe for everyone.
|
File diff suppressed because one or more lines are too long
Before Width: | Height: | Size: 35 KiB After Width: | Height: | Size: 38 KiB |
Binary file not shown.
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')
|
@ -4,7 +4,7 @@
|
|||||||
|
|
||||||
import * as fs from 'fs';
|
import * as fs from 'fs';
|
||||||
import * as gulp from 'gulp';
|
import * as gulp from 'gulp';
|
||||||
import * as rimraf from 'rimraf';
|
import rimraf from 'rimraf';
|
||||||
const replace = require('gulp-replace');
|
const replace = require('gulp-replace');
|
||||||
const terser = require('gulp-terser');
|
const terser = require('gulp-terser');
|
||||||
const cssnano = require('gulp-cssnano');
|
const cssnano = require('gulp-cssnano');
|
||||||
|
@ -259,8 +259,6 @@ monthX: "{month}"
|
|||||||
yearX: "{year}"
|
yearX: "{year}"
|
||||||
pages: "الصفحات"
|
pages: "الصفحات"
|
||||||
integration: "دمج"
|
integration: "دمج"
|
||||||
connectSerice: "أوصل"
|
|
||||||
disconnectSerice: "قطع الاتصال"
|
|
||||||
enableLocalTimeline: "تفعيل الخيط المحلي"
|
enableLocalTimeline: "تفعيل الخيط المحلي"
|
||||||
enableGlobalTimeline: "تفعيل الخيط الزمني الشامل"
|
enableGlobalTimeline: "تفعيل الخيط الزمني الشامل"
|
||||||
disablingTimelinesInfo: "سيتمكن المسؤولون ومن تعديل دائمًا و من الوصول إلى جميع المخططات الزمنية ، حتى إذا لم يتم تمكينها."
|
disablingTimelinesInfo: "سيتمكن المسؤولون ومن تعديل دائمًا و من الوصول إلى جميع المخططات الزمنية ، حتى إذا لم يتم تمكينها."
|
||||||
@ -387,7 +385,6 @@ updateRemoteUser: "تحديث المعلومات عن المستخدم البع
|
|||||||
deleteAllFiles: "حذف كافة الملفات"
|
deleteAllFiles: "حذف كافة الملفات"
|
||||||
userSuspended: "تم تعليق هذا المستخدم."
|
userSuspended: "تم تعليق هذا المستخدم."
|
||||||
userSilenced: "تم إسكات هذا المستخدم."
|
userSilenced: "تم إسكات هذا المستخدم."
|
||||||
sidebar: "الشريط الجانبي"
|
|
||||||
addItem: "إضافة عنصر"
|
addItem: "إضافة عنصر"
|
||||||
rooms: "الغرفة"
|
rooms: "الغرفة"
|
||||||
relays: "المُرَحلات"
|
relays: "المُرَحلات"
|
||||||
@ -430,8 +427,13 @@ inUse: "مستخدم"
|
|||||||
info: "عن"
|
info: "عن"
|
||||||
user: "المستخدمون"
|
user: "المستخدمون"
|
||||||
administration: "إدارة "
|
administration: "إدارة "
|
||||||
|
postToGallery: "انشر في المعرض"
|
||||||
|
gallery: "المعرض"
|
||||||
expiration: "ينتهي استطلاع الرأي في"
|
expiration: "ينتهي استطلاع الرأي في"
|
||||||
middle: "متوسط"
|
middle: "متوسط"
|
||||||
|
global: "الشامل"
|
||||||
|
_docs:
|
||||||
|
admin: "إدارة "
|
||||||
_email:
|
_email:
|
||||||
_follow:
|
_follow:
|
||||||
title: "يتابعك"
|
title: "يتابعك"
|
||||||
@ -444,9 +446,7 @@ _reversi:
|
|||||||
total: "المجموع"
|
total: "المجموع"
|
||||||
_channel:
|
_channel:
|
||||||
featured: "المتداوَلة"
|
featured: "المتداوَلة"
|
||||||
_sidebar:
|
_menuDisplay:
|
||||||
full: "كامل"
|
|
||||||
icon: "الصورة الرمزية"
|
|
||||||
hide: "إخفاء"
|
hide: "إخفاء"
|
||||||
_theme:
|
_theme:
|
||||||
explore: "استكشف قوالب المظهر"
|
explore: "استكشف قوالب المظهر"
|
||||||
|
@ -111,6 +111,7 @@ editWidgets: "Upravit widget"
|
|||||||
editWidgetsExit: "Hotovo"
|
editWidgetsExit: "Hotovo"
|
||||||
customEmojis: "Vlastní emoji"
|
customEmojis: "Vlastní emoji"
|
||||||
emoji: "Emoji"
|
emoji: "Emoji"
|
||||||
|
emojis: "Emoji"
|
||||||
emojiName: "Jméno emoji"
|
emojiName: "Jméno emoji"
|
||||||
emojiUrl: "URL obrázku"
|
emojiUrl: "URL obrázku"
|
||||||
addEmoji: "Přidat emoji"
|
addEmoji: "Přidat emoji"
|
||||||
@ -269,8 +270,6 @@ monthX: "{month}"
|
|||||||
yearX: "{year}"
|
yearX: "{year}"
|
||||||
pages: "Stránky"
|
pages: "Stránky"
|
||||||
integration: "Integrace"
|
integration: "Integrace"
|
||||||
connectSerice: "Připojit"
|
|
||||||
disconnectSerice: "Odpojit"
|
|
||||||
enableLocalTimeline: "Povolit lokální čas"
|
enableLocalTimeline: "Povolit lokální čas"
|
||||||
enableGlobalTimeline: "Povolit globální čas"
|
enableGlobalTimeline: "Povolit globální čas"
|
||||||
registration: "Registrace"
|
registration: "Registrace"
|
||||||
@ -392,7 +391,6 @@ script: "Skript"
|
|||||||
deleteAllFiles: "Smazat všechny soubory"
|
deleteAllFiles: "Smazat všechny soubory"
|
||||||
deleteAllFilesConfirm: "Jste si jistí že chcete smazat všechny soubory?"
|
deleteAllFilesConfirm: "Jste si jistí že chcete smazat všechny soubory?"
|
||||||
userSuspended: "Tomuto uživateli byl pozastaven účet."
|
userSuspended: "Tomuto uživateli byl pozastaven účet."
|
||||||
sidebar: "Postranní panel"
|
|
||||||
addItem: "Přidat položku"
|
addItem: "Přidat položku"
|
||||||
rooms: "Místnost"
|
rooms: "Místnost"
|
||||||
inboxUrl: "Inbox URL"
|
inboxUrl: "Inbox URL"
|
||||||
@ -411,8 +409,6 @@ _mfm:
|
|||||||
search: "Vyhledávání"
|
search: "Vyhledávání"
|
||||||
_reversi:
|
_reversi:
|
||||||
total: "Celkem"
|
total: "Celkem"
|
||||||
_sidebar:
|
|
||||||
icon: "Avatar"
|
|
||||||
_theme:
|
_theme:
|
||||||
keys:
|
keys:
|
||||||
mention: "Zmínění"
|
mention: "Zmínění"
|
||||||
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
696
locales/eo-UY.yml
Normal file
696
locales/eo-UY.yml
Normal file
@ -0,0 +1,696 @@
|
|||||||
|
---
|
||||||
|
_lang_: "Esperanto"
|
||||||
|
headlineMisskey: "Reto ligata per notoj"
|
||||||
|
introMisskey: "Bonvenon! Misskey estas malfermitkoda malcentraliza mikrobloga servo.\nKreu \"noto\"n por diskonigi tion ke nun okazas, aŭ por dissendu pri vi📡\nPer la funkcio \"reago\" vi ankaŭ povas rapide esprimi vian senton pri ĉies noto👍\nVolu esplori nova mondo🚀"
|
||||||
|
monthAndDay: "{day}-a/{month}"
|
||||||
|
search: "Serĉi"
|
||||||
|
notifications: "Sciigoj"
|
||||||
|
username: "Uzantnomo"
|
||||||
|
password: "Pasvorto"
|
||||||
|
forgotPassword: "Ĉu vi forgesis pasvorton?"
|
||||||
|
fetchingAsApObject: "Informpetado de Fediverso..."
|
||||||
|
ok: "Akcepteble"
|
||||||
|
gotIt: "Mi komprenas"
|
||||||
|
cancel: "Nuligi"
|
||||||
|
enterUsername: "Entajpu uzantnomon"
|
||||||
|
renotedBy: "Renoto farita de {user}"
|
||||||
|
noNotes: "Neniu noto!"
|
||||||
|
noNotifications: "Vi ne havas sciigojn."
|
||||||
|
instance: "Ekzemplo"
|
||||||
|
settings: "Agordoj"
|
||||||
|
basicSettings: "Ĝeneralaj agordoj"
|
||||||
|
otherSettings: "Aliaj agordoj"
|
||||||
|
openInWindow: "Malfermi en nova fenestro"
|
||||||
|
profile: "Profilo"
|
||||||
|
timeline: "Templinio"
|
||||||
|
noAccountDescription: "Tiu uzanto ankoraŭ ne skribis biografieton"
|
||||||
|
login: "Ensaluti"
|
||||||
|
loggingIn: "Ensalutado..."
|
||||||
|
logout: "Elsaluti"
|
||||||
|
signup: "Krei konton"
|
||||||
|
uploading: "Alŝutado..."
|
||||||
|
save: "Konservi"
|
||||||
|
users: "Uzanto"
|
||||||
|
addUser: "Aldoni uzanton"
|
||||||
|
favorite: "Preferi"
|
||||||
|
favorites: "Preferataj"
|
||||||
|
unfavorite: "Malpreferi"
|
||||||
|
favorited: "Aldonita al preferatoj"
|
||||||
|
alreadyFavorited: "Jame aldonita al preferatoj"
|
||||||
|
cantFavorite: "Ne aldonita al preferatoj"
|
||||||
|
pin: "Alpingli sur la profilo"
|
||||||
|
unpin: "Depingli"
|
||||||
|
copyContent: "Kopii enhavon"
|
||||||
|
copyLink: "Kopii ligilon"
|
||||||
|
delete: "Forviŝi"
|
||||||
|
deleteAndEdit: "Forigi kaj redakti"
|
||||||
|
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 la listo"
|
||||||
|
sendMessage: "Sendi mesaĝon"
|
||||||
|
copyUsername: "Kopii uzantnomon"
|
||||||
|
searchUser: "Serĉi uzanton"
|
||||||
|
reply: "Respondi"
|
||||||
|
loadMore: "Vidu pli"
|
||||||
|
showMore: "Vidi pli"
|
||||||
|
youGotNewFollower: "sksekvis vin"
|
||||||
|
receiveFollowRequest: "Peto de sekvado estas ricevita"
|
||||||
|
followRequestAccepted: "La peto de sekvado akceptita"
|
||||||
|
mention: "Mencioj"
|
||||||
|
mentions: "Al vi"
|
||||||
|
directNotes: "Rektaj notoj"
|
||||||
|
importAndExport: "Importi/eksporti"
|
||||||
|
import: "Importi"
|
||||||
|
export: "Eksporti"
|
||||||
|
files: "Dosieroj"
|
||||||
|
download: "Elŝuti"
|
||||||
|
driveFileDeleteConfirm: "Ĉu vi certas, ke vi volas forviŝi la dosieron \"{name}\"? Ankaŭ notoj kiu enhavas ĝin forviŝiĝos."
|
||||||
|
unfollowConfirm: "Ĉu vi certas, ke vi volas ne plu sekvi {name}'(o)n?"
|
||||||
|
lists: "Listoj"
|
||||||
|
noLists: "Neniu listo"
|
||||||
|
note: "Elsendi noto"
|
||||||
|
notes: "Notoj"
|
||||||
|
following: "Sekvatoj"
|
||||||
|
followers: "Sekvantoj"
|
||||||
|
followsYou: "Sekvas vin"
|
||||||
|
createList: "Kreii liston"
|
||||||
|
error: "Eraro"
|
||||||
|
somethingHappened: "Problemo okazis."
|
||||||
|
retry: "Reprovi"
|
||||||
|
enterListName: "Entajpu nomon de la listo"
|
||||||
|
privacy: "Privateco"
|
||||||
|
follow: "Sekvi"
|
||||||
|
followRequest: "Peti de sekvado"
|
||||||
|
followRequests: "Petoj de sekvado"
|
||||||
|
unfollow: "Malsekvi"
|
||||||
|
enterEmoji: "Entajpu emoĵion"
|
||||||
|
renote: "Fari renoton"
|
||||||
|
unrenote: "Malfari renoton"
|
||||||
|
renoted: "Renoton fariĝis."
|
||||||
|
cantRenote: "Tiu noto ne estas renototebla."
|
||||||
|
cantReRenote: "Oni ne povas fari renoton kiu enhavas renoto."
|
||||||
|
quote: "Citi"
|
||||||
|
pinnedNote: "Pinglita noto"
|
||||||
|
pinned: "Alpingli sur la profilo"
|
||||||
|
you: "Vi"
|
||||||
|
clickToShow: "Klaku por malkaŝu"
|
||||||
|
sensitive: "Enhavo ne estas deca por laborejo (NSFW)"
|
||||||
|
add: "Aldoni"
|
||||||
|
reaction: "Reagoj"
|
||||||
|
enterFileName: "Entajpu nomon de dosiero"
|
||||||
|
mute: "Silentigi"
|
||||||
|
unmute: "Malsilentigi"
|
||||||
|
block: "Bloki"
|
||||||
|
unblock: "Malbloki"
|
||||||
|
suspend: "Flostigi"
|
||||||
|
unsuspend: "Fandi"
|
||||||
|
blockConfirm: "Ĉu vi certas ke vi volas bloki la uzanton?"
|
||||||
|
unblockConfirm: "Ĉu vi certas ke vi volas malbloki la uzanton?"
|
||||||
|
suspendConfirm: "Ĉu vi certas ke vi volas frostigi la uzanton?"
|
||||||
|
unsuspendConfirm: "Ĉu vi certas ke vi volas fandi la uzanton?"
|
||||||
|
selectList: "Elekti liston"
|
||||||
|
selectAntenna: "Elekti antenon"
|
||||||
|
selectWidget: "Elekti enestraĵon"
|
||||||
|
editWidgets: "Redakti fenestraĵon"
|
||||||
|
editWidgetsExit: "Fini la redaktadon"
|
||||||
|
customEmojis: "Personecigitaj emoĵioj"
|
||||||
|
emoji: "Emoĵio"
|
||||||
|
emojis: "Emoĵio"
|
||||||
|
emojiName: "Nomo de emoĵio"
|
||||||
|
emojiUrl: "URL de la emoĵio"
|
||||||
|
addEmoji: "Aldoni emoĵion"
|
||||||
|
settingGuide: "Rekomendaj agordoj"
|
||||||
|
cacheRemoteFiles: "Havi staplon por transaj dosieroj"
|
||||||
|
flagAsBot: "Tiu uzanto estas roboto"
|
||||||
|
flagAsCat: "Tiu uzanto estas kato"
|
||||||
|
addAccount: "Aldoni konton"
|
||||||
|
showOnRemote: "Vidi sur la fora ekzemplo"
|
||||||
|
general: "Ĝenerala"
|
||||||
|
wallpaper: "Ekranfonoj"
|
||||||
|
setWallpaper: "Apliki ekranfonon"
|
||||||
|
removeWallpaper: "Forviŝi ekranfonon. "
|
||||||
|
searchWith: "Serĉi: {q}"
|
||||||
|
youHaveNoLists: "Vi ne havas listojn."
|
||||||
|
followConfirm: "Ĉu vi certas ke vi volas sekvi {name}'(o)n?"
|
||||||
|
selectUser: "Elekti uzanton"
|
||||||
|
annotation: "Komentarioj"
|
||||||
|
federation: "Kunfederaĵo"
|
||||||
|
instances: "Ekzemplo"
|
||||||
|
perHour: "Po horo"
|
||||||
|
perDay: "Po tago"
|
||||||
|
blockThisInstance: "Bloki tiu ekzemplo"
|
||||||
|
version: "Versio"
|
||||||
|
withNFiles: "{n} dosiero(j)"
|
||||||
|
disk: "Diskilo"
|
||||||
|
instanceInfo: "Informo pri la ekzemplo"
|
||||||
|
clearCachedFiles: "Malplenigi la staplon"
|
||||||
|
clearCachedFilesConfirm: "Ĉu vi certas, ke vi volas forviŝi ĉiujn transajn dosierojn en la staplo?"
|
||||||
|
blockedInstances: "Blokataj ekzemploj"
|
||||||
|
muteAndBlock: "Silentigatoj kaj blokatoj"
|
||||||
|
mutedUsers: "Silentigataj uzantoj"
|
||||||
|
blockedUsers: "Blokataj uzantoj"
|
||||||
|
noUsers: "Sen uzantoj"
|
||||||
|
editProfile: "Redakti profilon"
|
||||||
|
noteDeleteConfirm: "Ĉu vi certas ke vi volas forviŝi la noton?"
|
||||||
|
pinLimitExceeded: "Vi ne plu povas alpingli noton."
|
||||||
|
processing: "Traktado..."
|
||||||
|
noCustomEmojis: "Neniu emoĵio"
|
||||||
|
federating: "Kunfederado"
|
||||||
|
blocked: "Blokata"
|
||||||
|
all: "Ĉiuj"
|
||||||
|
subscribing: "Abonita"
|
||||||
|
publishing: "Dissendado"
|
||||||
|
notResponding: "Alvokato ne disponeblas"
|
||||||
|
instanceFollowing: "Sekvatoj el la ekzemplo"
|
||||||
|
instanceFollowers: "Sekvantoj el la ekzemplo"
|
||||||
|
instanceUsers: "Uzantoj de la ekzemplo"
|
||||||
|
changePassword: "Ŝanĝi pasvorton"
|
||||||
|
security: "Sekureco"
|
||||||
|
currentPassword: "Aktuala pasvorto"
|
||||||
|
newPassword: "Nova pasvorto"
|
||||||
|
newPasswordRetype: "Reentajpu la novan pasvorton"
|
||||||
|
attachFile: "Aldoni dosieron"
|
||||||
|
more: "Plu!"
|
||||||
|
featured: "Maksimumi"
|
||||||
|
usernameOrUserId: "Uzantnomo aŭ identigilo de uzanto"
|
||||||
|
noSuchUser: "Neniuj uzantoj trovitaj."
|
||||||
|
lookup: "Informpeti"
|
||||||
|
announcements: "Novaĵoj"
|
||||||
|
imageUrl: "URL de bildo"
|
||||||
|
remove: "Forigi"
|
||||||
|
removed: "Forviŝis"
|
||||||
|
removeAreYouSure: "Ĉu vi certas ke vi volas forigi \"{x}\"'(o)n?"
|
||||||
|
deleteAreYouSure: "Ĉu vi certas ke vi volas forviŝi \"{x}\"'(o)n?"
|
||||||
|
saved: "Konservita"
|
||||||
|
messaging: "Retbabili"
|
||||||
|
upload: "Alŝuti"
|
||||||
|
fromDrive: "De la disko"
|
||||||
|
fromUrl: "De URL"
|
||||||
|
uploadFromUrl: "Alŝuti de URL"
|
||||||
|
uploadFromUrlDescription: "URL de la dosiero kiun vi volas alŝuti"
|
||||||
|
explore: "Esplori"
|
||||||
|
games: "Ludoj sur Misskey"
|
||||||
|
messageRead: "Legita"
|
||||||
|
startMessaging: "Komenci babiladon"
|
||||||
|
nUsersRead: "Legita de {n} homoj"
|
||||||
|
tos: "Kondiĉoj de uzado"
|
||||||
|
start: "Komenciĝi"
|
||||||
|
home: "Hejmo"
|
||||||
|
remoteUserCaution: "Ĉi 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"
|
||||||
|
selectFile: "Elekti dosieron"
|
||||||
|
selectFiles: "Elekti 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"
|
||||||
|
addFile: "Aldoni dosieron"
|
||||||
|
emptyDrive: "La disko malplenas"
|
||||||
|
emptyFolder: "La dosierujo malplenas"
|
||||||
|
unableToDelete: "Ne forigebla"
|
||||||
|
inputNewFileName: "Entajpu nova nomon de la dosiero"
|
||||||
|
inputNewFolderName: "Entajpu nova nomon de la dosierujo"
|
||||||
|
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)"
|
||||||
|
reload: "Reŝargi"
|
||||||
|
watch: "Observi"
|
||||||
|
unwatch: "Malobservi"
|
||||||
|
accept: "Permesi"
|
||||||
|
normal: "Normala"
|
||||||
|
instanceName: "Nomo de la ekzemplo"
|
||||||
|
maintainerName: "Nomo de la administranto"
|
||||||
|
maintainerEmail: "Retpoŝto de la administranto"
|
||||||
|
tosUrl: "URL de kondiĉoj de uzado"
|
||||||
|
thisYear: "Ĉi-jare"
|
||||||
|
thisMonth: "Ĉi-monate"
|
||||||
|
today: "Hodiaŭ"
|
||||||
|
dayX: "{day}-a"
|
||||||
|
monthX: "{month}"
|
||||||
|
yearX: "La jaro {year}"
|
||||||
|
pages: "Paĝoj"
|
||||||
|
connectService: "Konekti"
|
||||||
|
disconnectService: "Farkonektiĝi"
|
||||||
|
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"
|
||||||
|
pinnedPages: "Alpinglitaj paĝoj"
|
||||||
|
pinnedNotes: "Pinglita noto"
|
||||||
|
antennas: "Antenoj"
|
||||||
|
name: "Nomo"
|
||||||
|
withFileAntenna: "Nur kun aldonaĵo"
|
||||||
|
withReplies: "Inkluzive respondoj"
|
||||||
|
notesAndReplies: "Kun respondoj"
|
||||||
|
withFiles: "Kun aldonaĵo"
|
||||||
|
silence: "Mutigi"
|
||||||
|
silenceConfirm: "Ĉu vi certas ke vi volas mutigi la uzanton?"
|
||||||
|
unsilence: "Malmutigi"
|
||||||
|
unsilenceConfirm: "Ĉu vi certas ke vi volas malmutigi la uzanton?"
|
||||||
|
recentlyUpdatedUsers: "Uzantoj kiu lastatempe faris noton"
|
||||||
|
recentlyRegisteredUsers: "Nove aniĝintaj uzantoj"
|
||||||
|
popularTags: "Popularaj kradvortoj"
|
||||||
|
userList: "Listoj"
|
||||||
|
about: "Informoj"
|
||||||
|
aboutMisskey: "Pri Misskey"
|
||||||
|
administrator: "Administranto"
|
||||||
|
moderator: "Moderigisto"
|
||||||
|
securityKey: "Sekureca ŝlosilo"
|
||||||
|
securityKeyName: "Nomo de la ŝlosilo"
|
||||||
|
lastUsed: "Plej malnove uzita"
|
||||||
|
passwordLessLogin: "Ensaluti sen pasvorto"
|
||||||
|
resetPassword: "Restarigi pasvorton"
|
||||||
|
newPasswordIs: "La nova pasvorto estas {password}."
|
||||||
|
share: "Diskonigi"
|
||||||
|
notFound: "Ne trovita"
|
||||||
|
cacheClear: "Malplenigi staplon"
|
||||||
|
help: "Manlibro de uzado"
|
||||||
|
inputMessageHere: "Entajpu masaĝo tie ĉi"
|
||||||
|
close: "Fermi"
|
||||||
|
group: "Grupo"
|
||||||
|
groups: "Grupoj"
|
||||||
|
createGroup: "Krei grupon"
|
||||||
|
groupName: "Grupa nomo"
|
||||||
|
members: "Membroj"
|
||||||
|
messagingWithUser: "Mesaĝado kun uzanto"
|
||||||
|
messagingWithGroup: "Mesaĝado kun grupo"
|
||||||
|
title: "Titolo"
|
||||||
|
text: "Teksto"
|
||||||
|
enable: "Ebligi"
|
||||||
|
next: "Sekve"
|
||||||
|
noteOf: "Noto de {user}"
|
||||||
|
noMessagesYet: "Neniu mesaĝo"
|
||||||
|
newMessageExists: "Vi ricevis novan mesaĝon."
|
||||||
|
onlyOneFileCanBeAttached: "Vi povas aldoni nur unu dosieron po unu mesaĝo."
|
||||||
|
invitationCode: "Kodo de invito"
|
||||||
|
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"
|
||||||
|
remote: "Transa"
|
||||||
|
total: "Entute"
|
||||||
|
clientSettings: "Agordoj de kliento"
|
||||||
|
accountSettings: "Agordoj de Konto"
|
||||||
|
numberOfDays: "Nombro de tagoj"
|
||||||
|
hideThisNote: "Kaŝi tiun noton"
|
||||||
|
objectStorageBaseUrl: "Baza URL"
|
||||||
|
objectStorageRegion: "Regiono"
|
||||||
|
objectStorageUseSSL: "Oni uzas SSL"
|
||||||
|
serverLogs: "Servila protokolo"
|
||||||
|
deleteAll: "Forviŝi ĉiujn"
|
||||||
|
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?"
|
||||||
|
userSilenced: "Tiu uzanto estas mutigata."
|
||||||
|
menu: "Menuo"
|
||||||
|
deletedNote: "Forviŝita noto"
|
||||||
|
invisibleNote: "Malpublika noto"
|
||||||
|
poll: "Balotujo"
|
||||||
|
useCw: "Kaŝi enhavo"
|
||||||
|
themeEditor: "Redaktilo de koloraroj"
|
||||||
|
author: "Aŭtoro"
|
||||||
|
plugins: "Kromaĵoj"
|
||||||
|
deck: "Kartaro"
|
||||||
|
medium: "Meza"
|
||||||
|
small: "Malgranda"
|
||||||
|
edit: "Redakti"
|
||||||
|
emailServer: "Retpoŝta servilo"
|
||||||
|
email: "Retpoŝto"
|
||||||
|
emailAddress: "Retpoŝta adreso"
|
||||||
|
smtpConfig: "Agordoj de la servilo SMTP"
|
||||||
|
smtpUser: "Uzantnomo"
|
||||||
|
smtpPass: "Pasvorto"
|
||||||
|
wordMute: "Silentigo de vortoj"
|
||||||
|
userSaysSomething: "{name} parolis ion"
|
||||||
|
display: "Vidi"
|
||||||
|
copy: "Kopii"
|
||||||
|
database: "Datumbazo"
|
||||||
|
channel: "Kanalo"
|
||||||
|
create: "Krei"
|
||||||
|
notificationSetting: "Agordoj de sciigoj"
|
||||||
|
useGlobalSetting: "Oni uzas malloka agordo"
|
||||||
|
fileIdOrUrl: "Dosiera identigilo aŭ URL"
|
||||||
|
abuseReports: "Signali"
|
||||||
|
reportAbuse: "Signali"
|
||||||
|
reportAbuseOf: "Signali {name}'(o)n"
|
||||||
|
send: "Sendi"
|
||||||
|
openInNewTab: "Malfermi en nova langeto"
|
||||||
|
editTheseSettingsMayBreakAccount: "Redakti tiujn agordojn estas eble damaĝi konton."
|
||||||
|
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: "Montri titola stango"
|
||||||
|
clearCache: "Malplenigi staplon"
|
||||||
|
onlineUsersCount: "{n} uzanto(j) estas surlinea"
|
||||||
|
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"
|
||||||
|
publish: "Publikigi"
|
||||||
|
inChannelSearch: "Serĉi en kanalo"
|
||||||
|
useReactionPickerForContextMenu: "Oni malfermas reago-elektilon per dekstro-kliki"
|
||||||
|
typingUsers: "{users} estas entajpanta(j)..."
|
||||||
|
info: "Informoj"
|
||||||
|
unknown: "Nekonata"
|
||||||
|
online: "Surkonektita"
|
||||||
|
offline: "Forkonektita"
|
||||||
|
instanceBlocking: "Blokado de ekzemplo"
|
||||||
|
selectAccount: "Elekti konton"
|
||||||
|
user: "Uzanto"
|
||||||
|
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"
|
||||||
|
_gallery:
|
||||||
|
liked: "Ŝatitaj notoj"
|
||||||
|
like: "Ŝati"
|
||||||
|
_email:
|
||||||
|
_follow:
|
||||||
|
title: "Vi estas eksekvita"
|
||||||
|
_receiveFollowRequest:
|
||||||
|
title: "Vi ricevis peton de sekvado"
|
||||||
|
_registry:
|
||||||
|
key: "Ŝlosilo"
|
||||||
|
keys: "Ŝlosiloj"
|
||||||
|
domain: "Nomregno"
|
||||||
|
createKey: "Krei ŝlosilon"
|
||||||
|
_aboutMisskey:
|
||||||
|
about: "Misskey estas malfermitkoda programo evoluigata de syuilo ekde la 2014."
|
||||||
|
contributors: "Precipaj kontribuantoj"
|
||||||
|
allContributors: "Ĉiuj kontribuintoj"
|
||||||
|
source: "Fontkodo"
|
||||||
|
translation: "Traduki Misskey'on"
|
||||||
|
patrons: "Mecenatoj"
|
||||||
|
_mfm:
|
||||||
|
mention: "Mencioj"
|
||||||
|
hashtag: "Kradvorto"
|
||||||
|
url: "URL"
|
||||||
|
link: "Ligilo"
|
||||||
|
bold: "Grasa"
|
||||||
|
small: "Malgrande"
|
||||||
|
center: "Centrigi"
|
||||||
|
inlineCode: "Kodo (en linio)"
|
||||||
|
blockCode: "Kodo (bloko)"
|
||||||
|
inlineMath: "Formulo (en linio)"
|
||||||
|
blockMath: "Formulo (bloko)"
|
||||||
|
quote: "Citi"
|
||||||
|
emoji: "Personecigitaj emoĵioj"
|
||||||
|
search: "Serĉi"
|
||||||
|
flip: "Inversa"
|
||||||
|
x2: "Granda"
|
||||||
|
x3: "Grandega"
|
||||||
|
x4: "Pli grandega"
|
||||||
|
_reversi:
|
||||||
|
total: "Entute"
|
||||||
|
_instanceTicker:
|
||||||
|
none: "Ne montri"
|
||||||
|
remote: "Montri al transaj uzantoj"
|
||||||
|
always: "Ĉiam montri"
|
||||||
|
_channel:
|
||||||
|
create: "Krei kanalon"
|
||||||
|
edit: "Redakti kanalon"
|
||||||
|
following: "Sekvante"
|
||||||
|
usersCount: "{n} partoprenanto(j)"
|
||||||
|
_menuDisplay:
|
||||||
|
hide: "Kaŝi"
|
||||||
|
_wordMute:
|
||||||
|
muteWords: "Kaŝigitaj vortoj"
|
||||||
|
mutedNotes: "Silentigataj notoj"
|
||||||
|
_theme:
|
||||||
|
code: "Kodo de koloraro"
|
||||||
|
darken: "Malbrileco"
|
||||||
|
lighten: "Brileco"
|
||||||
|
keys:
|
||||||
|
bg: "Fono"
|
||||||
|
navBg: "Fono de flanka stango"
|
||||||
|
hashtag: "Kradvorto"
|
||||||
|
mention: "Mencioj"
|
||||||
|
renote: "Fari renoton"
|
||||||
|
buttonBg: "Fono de butono"
|
||||||
|
driveFolderBg: "Fono de dosierujo de la disko"
|
||||||
|
_sfx:
|
||||||
|
note: "Nova noto"
|
||||||
|
noteMy: "Mia noto"
|
||||||
|
notification: "Sciigoj"
|
||||||
|
chat: "Retbabili"
|
||||||
|
chatBg: "Retbabili (BG)"
|
||||||
|
antenna: "Ricevo de anteno"
|
||||||
|
channel: "Sciigoj de kanalo"
|
||||||
|
_ago:
|
||||||
|
future: "Futuro"
|
||||||
|
justNow: "Ĵus"
|
||||||
|
secondsAgo: "Antaŭ {n} sekundoj"
|
||||||
|
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:
|
||||||
|
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:
|
||||||
|
"read:blocks": "Vidi la liston de uzantoj kiun vi blokas"
|
||||||
|
"write:blocks": "Redakti vian liston de blokataj uzantoj"
|
||||||
|
"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 preferatoj"
|
||||||
|
"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:
|
||||||
|
notifications: "Sciigoj"
|
||||||
|
timeline: "Templinio"
|
||||||
|
clock: "Horloĝo"
|
||||||
|
activity: "Aktiveco"
|
||||||
|
federation: "Kunfederaĵo"
|
||||||
|
slideshow: "Bildoprezento"
|
||||||
|
button: "Butono"
|
||||||
|
onlineUsers: "Surkonektita uzanto"
|
||||||
|
_cw:
|
||||||
|
show: "Vidu pli"
|
||||||
|
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:
|
||||||
|
publicDescription: "Via noto aperiĝos sur la konfederacia templinio"
|
||||||
|
home: "Hejmo"
|
||||||
|
homeDescription: "Elsendi nur sur la hejmtemplinio"
|
||||||
|
followers: "Sekvantoj"
|
||||||
|
followersDescription: "Nur al sekvantoj al mi"
|
||||||
|
localOnly: "Nur loka"
|
||||||
|
localOnlyDescription: "Ne montri al transaj uzantoj"
|
||||||
|
_postForm:
|
||||||
|
replyPlaceholder: "Respondi al tiu noto..."
|
||||||
|
quotePlaceholder: "Citado tiun noton..."
|
||||||
|
channelPlaceholder: "Sendi sur la kanalo"
|
||||||
|
_profile:
|
||||||
|
name: "Nomo"
|
||||||
|
username: "Uzantnomo"
|
||||||
|
metadataEdit: "Redakti kromaj informoj"
|
||||||
|
changeAvatar: "Ŝanĝi profilbildon"
|
||||||
|
changeBanner: "Ŝanĝi standardon"
|
||||||
|
_exportOrImport:
|
||||||
|
allNotes: "Ĉiuj notoj"
|
||||||
|
followingList: "Sekvataj"
|
||||||
|
muteList: "Silentigoj"
|
||||||
|
blockingList: "Blokado"
|
||||||
|
userLists: "Listoj"
|
||||||
|
_charts:
|
||||||
|
federationInstancesTotal: "Tuta numero de kunfederantaj ekzemploj"
|
||||||
|
filesTotal: "Tuta numero de dosieroj"
|
||||||
|
_timelines:
|
||||||
|
home: "Hejmo"
|
||||||
|
local: "Loka"
|
||||||
|
social: "Sociala"
|
||||||
|
global: "Malloka"
|
||||||
|
_rooms:
|
||||||
|
translate: "Movi"
|
||||||
|
chooseImage: "Elekti bildon"
|
||||||
|
_furnitures:
|
||||||
|
server: "Servilo"
|
||||||
|
moon: "La luno"
|
||||||
|
_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"
|
||||||
|
content: "Blokado de paĝo"
|
||||||
|
url: "URL de paĝo"
|
||||||
|
alignCenter: "Centrigi"
|
||||||
|
chooseBlock: "Aldoni blokon"
|
||||||
|
blocks:
|
||||||
|
image: "Bildo"
|
||||||
|
button: "Butono"
|
||||||
|
_post:
|
||||||
|
canvasId: "Kanvasa identigilo"
|
||||||
|
_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:
|
||||||
|
categories:
|
||||||
|
list: "Listoj"
|
||||||
|
blocks:
|
||||||
|
_join:
|
||||||
|
arg1: "Listoj"
|
||||||
|
_randomPick:
|
||||||
|
arg1: "Listoj"
|
||||||
|
_dailyRandomPick:
|
||||||
|
arg1: "Listoj"
|
||||||
|
_seedRandomPick:
|
||||||
|
arg2: "Listoj"
|
||||||
|
pick: "Elekti de la listo"
|
||||||
|
_pick:
|
||||||
|
arg1: "Listoj"
|
||||||
|
_listLen:
|
||||||
|
arg1: "Listoj"
|
||||||
|
types:
|
||||||
|
array: "Listoj"
|
||||||
|
stringArray: "List de teksto"
|
||||||
|
_notification:
|
||||||
|
fileUploaded: "La dosiero sukcese alŝutiĝis."
|
||||||
|
youGotPoll: "{name} balotis"
|
||||||
|
youGotMessagingMessageFromUser: "{name} sentis mesaĝon al vi."
|
||||||
|
youGotMessagingMessageFromGroup: "Retbabilan mesaĝon oni sendis al la grupo {name}"
|
||||||
|
youWereFollowed: "sksekvis vin"
|
||||||
|
youReceivedFollowRequest: "Vi ricevis peton de sekvado"
|
||||||
|
yourFollowRequestAccepted: "Via peto por eksekvu estas akceptita."
|
||||||
|
_types:
|
||||||
|
follow: "Sekvatoj"
|
||||||
|
mention: "Mencioj"
|
||||||
|
renote: "Fari renoton"
|
||||||
|
quote: "Citi"
|
||||||
|
reaction: "Reagoj"
|
||||||
|
receiveFollowRequest: "Ricevita peton de sekvado"
|
||||||
|
followRequestAccepted: "Peto por eksekvu akceptita"
|
||||||
|
_deck:
|
||||||
|
profile: "Agordaro"
|
||||||
|
_columns:
|
||||||
|
notifications: "Sciigoj"
|
||||||
|
tl: "Templinio"
|
||||||
|
antenna: "Antenoj"
|
||||||
|
list: "Listoj"
|
||||||
|
mentions: "Al vi"
|
@ -127,6 +127,7 @@ editWidgets: "Editar widgets"
|
|||||||
editWidgetsExit: "Terminar edición"
|
editWidgetsExit: "Terminar edición"
|
||||||
customEmojis: "Emojis personalizados"
|
customEmojis: "Emojis personalizados"
|
||||||
emoji: "Emoji"
|
emoji: "Emoji"
|
||||||
|
emojis: "Emoji"
|
||||||
emojiName: "Nombre del emoji"
|
emojiName: "Nombre del emoji"
|
||||||
emojiUrl: "URL de la imágen del emoji"
|
emojiUrl: "URL de la imágen del emoji"
|
||||||
addEmoji: "Agregar emoji"
|
addEmoji: "Agregar emoji"
|
||||||
@ -309,8 +310,6 @@ monthX: "Mes {month}"
|
|||||||
yearX: "Año {year}"
|
yearX: "Año {year}"
|
||||||
pages: "Páginas"
|
pages: "Páginas"
|
||||||
integration: "Integración"
|
integration: "Integración"
|
||||||
connectSerice: "Conectarse"
|
|
||||||
disconnectSerice: "Desconectarse"
|
|
||||||
enableLocalTimeline: "Habilitar linea de tiempo local"
|
enableLocalTimeline: "Habilitar linea de tiempo local"
|
||||||
enableGlobalTimeline: "Habilitar linea de tiempo global"
|
enableGlobalTimeline: "Habilitar linea de tiempo global"
|
||||||
disablingTimelinesInfo: "Aunque se desactiven estas lineas de tiempo, por conveniencia el administrador y los moderadores pueden seguir usándolos"
|
disablingTimelinesInfo: "Aunque se desactiven estas lineas de tiempo, por conveniencia el administrador y los moderadores pueden seguir usándolos"
|
||||||
@ -525,7 +524,6 @@ removeAllFollowing: "Retener todos los siguientes"
|
|||||||
removeAllFollowingDescription: "Cancelar todos los siguientes del servidor {host}. Ejecutar en caso de que esta instancia haya dejado de existir"
|
removeAllFollowingDescription: "Cancelar todos los siguientes del servidor {host}. Ejecutar en caso de que esta instancia haya dejado de existir"
|
||||||
userSuspended: "Este usuario ha sido suspendido."
|
userSuspended: "Este usuario ha sido suspendido."
|
||||||
userSilenced: "Este usuario ha sido silenciado."
|
userSilenced: "Este usuario ha sido silenciado."
|
||||||
sidebar: "Barra lateral"
|
|
||||||
divider: "Divisor"
|
divider: "Divisor"
|
||||||
addItem: "Agregar elemento"
|
addItem: "Agregar elemento"
|
||||||
rooms: "Cuartos"
|
rooms: "Cuartos"
|
||||||
@ -667,6 +665,11 @@ user: "Usuarios"
|
|||||||
administration: "Administrar"
|
administration: "Administrar"
|
||||||
expiration: "Termina el"
|
expiration: "Termina el"
|
||||||
middle: "Mediano"
|
middle: "Mediano"
|
||||||
|
global: "Global"
|
||||||
|
sent: "Enviar"
|
||||||
|
hashtags: "Hashtag"
|
||||||
|
_docs:
|
||||||
|
admin: "Administrar"
|
||||||
_ad:
|
_ad:
|
||||||
back: "Deseleccionar"
|
back: "Deseleccionar"
|
||||||
_gallery:
|
_gallery:
|
||||||
@ -746,9 +749,7 @@ _channel:
|
|||||||
following: "Siguiendo"
|
following: "Siguiendo"
|
||||||
usersCount: "{n} participantes"
|
usersCount: "{n} participantes"
|
||||||
notesCount: "{n} notas"
|
notesCount: "{n} notas"
|
||||||
_sidebar:
|
_menuDisplay:
|
||||||
full: "Completo"
|
|
||||||
icon: "Avatar"
|
|
||||||
hide: "Ocultar"
|
hide: "Ocultar"
|
||||||
_wordMute:
|
_wordMute:
|
||||||
muteWords: "Palabras que silenciar"
|
muteWords: "Palabras que silenciar"
|
||||||
|
@ -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"
|
||||||
@ -279,6 +280,7 @@ emptyDrive: "Le Drive est vide"
|
|||||||
emptyFolder: "Le dossier est vide"
|
emptyFolder: "Le dossier est vide"
|
||||||
unableToDelete: "Suppression impossible"
|
unableToDelete: "Suppression impossible"
|
||||||
inputNewFileName: "Entrez un nouveau nom de fichier"
|
inputNewFileName: "Entrez un nouveau nom de fichier"
|
||||||
|
inputNewDescription: "Veuillez entrer une nouvelle description"
|
||||||
inputNewFolderName: "Entrez un nouveau nom de dossier"
|
inputNewFolderName: "Entrez un nouveau nom de dossier"
|
||||||
circularReferenceFolder: "Le dossier de destination est un sous-dossier du dossier que vous souhaitez déplacer."
|
circularReferenceFolder: "Le dossier de destination est un sous-dossier du dossier que vous souhaitez déplacer."
|
||||||
hasChildFilesOrFolders: "Impossible de supprimer ce dossier car il n'est pas vide."
|
hasChildFilesOrFolders: "Impossible de supprimer ce dossier car il n'est pas vide."
|
||||||
@ -310,8 +312,8 @@ monthX: "{month}"
|
|||||||
yearX: "{year}"
|
yearX: "{year}"
|
||||||
pages: "Pages"
|
pages: "Pages"
|
||||||
integration: "Intégrations"
|
integration: "Intégrations"
|
||||||
connectSerice: "Connecter"
|
connectService: "Connexion"
|
||||||
disconnectSerice: "Déconnecter"
|
disconnectService: "Déconnexion"
|
||||||
enableLocalTimeline: "Activer le fil local"
|
enableLocalTimeline: "Activer le fil local"
|
||||||
enableGlobalTimeline: "Activer le fil global"
|
enableGlobalTimeline: "Activer le fil global"
|
||||||
disablingTimelinesInfo: "Même si vous désactivez ces fils, les administrateur·rice·s et les modérateur·rice·s pourront toujours y accéder."
|
disablingTimelinesInfo: "Même si vous désactivez ces fils, les administrateur·rice·s et les modérateur·rice·s pourront toujours y accéder."
|
||||||
@ -325,6 +327,7 @@ driveCapacityPerRemoteAccount: "Volume du Drive par utilisateur distant"
|
|||||||
inMb: "en mégaoctets"
|
inMb: "en mégaoctets"
|
||||||
iconUrl: "URL de l'icône"
|
iconUrl: "URL de l'icône"
|
||||||
bannerUrl: "URL de l’image de la bannière"
|
bannerUrl: "URL de l’image de la bannière"
|
||||||
|
backgroundImageUrl: "URL de l'image d'arrière-plan"
|
||||||
basicInfo: "Informations basiques"
|
basicInfo: "Informations basiques"
|
||||||
pinnedUsers: "Utilisateur·rice épinglé·e"
|
pinnedUsers: "Utilisateur·rice épinglé·e"
|
||||||
pinnedUsersDescription: "Listez les utilisateur·rice·s que vous souhaitez voir épinglé·e·s sur la page \"Découvrir\", un·e par ligne."
|
pinnedUsersDescription: "Listez les utilisateur·rice·s que vous souhaitez voir épinglé·e·s sur la page \"Découvrir\", un·e par ligne."
|
||||||
@ -526,7 +529,7 @@ removeAllFollowing: "Retenir tous les abonnements"
|
|||||||
removeAllFollowingDescription: "Se désabonner de tous les comptes de {host}. Veuillez lancer cette action uniquement si l’instance n’existe plus."
|
removeAllFollowingDescription: "Se désabonner de tous les comptes de {host}. Veuillez lancer cette action uniquement si l’instance n’existe plus."
|
||||||
userSuspended: "Cet·te utilisateur·rice a été suspendu·e."
|
userSuspended: "Cet·te utilisateur·rice a été suspendu·e."
|
||||||
userSilenced: "Cette utilisateur·trice a été mis·e en sourdine."
|
userSilenced: "Cette utilisateur·trice a été mis·e en sourdine."
|
||||||
sidebar: "Barre latérale"
|
menu: "Menu"
|
||||||
divider: "Séparateur"
|
divider: "Séparateur"
|
||||||
addItem: "Ajouter un élément"
|
addItem: "Ajouter un élément"
|
||||||
rooms: "Chambre"
|
rooms: "Chambre"
|
||||||
@ -546,6 +549,8 @@ disablePlayer: "Fermer le lecteur vidéo"
|
|||||||
expandTweet: "Étendre le tweet"
|
expandTweet: "Étendre le tweet"
|
||||||
themeEditor: "Éditeur de thèmes"
|
themeEditor: "Éditeur de thèmes"
|
||||||
description: "Description"
|
description: "Description"
|
||||||
|
describeFile: "Ajouter une description d'image"
|
||||||
|
enterFileDescription: "Saisissez une description"
|
||||||
author: "Auteur·rice"
|
author: "Auteur·rice"
|
||||||
leaveConfirm: "Vous avez des modifications non-sauvegardées. Voulez-vous les ignorer ?"
|
leaveConfirm: "Vous avez des modifications non-sauvegardées. Voulez-vous les ignorer ?"
|
||||||
manage: "Gestion"
|
manage: "Gestion"
|
||||||
@ -633,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"
|
||||||
@ -757,6 +762,27 @@ middle: "Moyen"
|
|||||||
low: "Basse"
|
low: "Basse"
|
||||||
emailNotConfiguredWarning: "Vous n'avez pas configuré d'adresse e-mail."
|
emailNotConfiguredWarning: "Vous n'avez pas configuré d'adresse e-mail."
|
||||||
ratio: "Ratio"
|
ratio: "Ratio"
|
||||||
|
customCss: "CSS personnalisé"
|
||||||
|
customCssWarn: "Utilisez cette fonctionnalité uniquement si vous savez exactement ce que vous faites. Une configuration inadaptée peut empêcher le client de s'exécuter normalement."
|
||||||
|
global: "Global"
|
||||||
|
squareAvatars: "Avatars carrés"
|
||||||
|
sent: "Envoyer"
|
||||||
|
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}"
|
||||||
|
_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"
|
||||||
@ -855,6 +881,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"
|
||||||
@ -906,9 +934,10 @@ _channel:
|
|||||||
following: "Abonné·e"
|
following: "Abonné·e"
|
||||||
usersCount: "{n} Participant·e·s"
|
usersCount: "{n} Participant·e·s"
|
||||||
notesCount: "{n} Notes"
|
notesCount: "{n} Notes"
|
||||||
_sidebar:
|
_menuDisplay:
|
||||||
full: "Complet"
|
sideFull: "Latéral"
|
||||||
icon: "Icônes"
|
sideIcon: "Latéral (icônes)"
|
||||||
|
top: "Haut de page"
|
||||||
hide: "Masquer"
|
hide: "Masquer"
|
||||||
_wordMute:
|
_wordMute:
|
||||||
muteWords: "Mots à filtrer"
|
muteWords: "Mots à filtrer"
|
||||||
@ -967,7 +996,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"
|
||||||
@ -1588,11 +1617,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"
|
||||||
|
1466
locales/id-ID.yml
1466
locales/id-ID.yml
File diff suppressed because it is too large
Load Diff
@ -21,6 +21,7 @@ const languages = [
|
|||||||
'en-US',
|
'en-US',
|
||||||
'es-ES',
|
'es-ES',
|
||||||
'fr-FR',
|
'fr-FR',
|
||||||
|
'id-ID',
|
||||||
'ja-JP',
|
'ja-JP',
|
||||||
'ja-KS',
|
'ja-KS',
|
||||||
'kab-KAB',
|
'kab-KAB',
|
||||||
|
@ -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"
|
||||||
@ -274,6 +275,7 @@ emptyDrive: "Il Drive è vuoto"
|
|||||||
emptyFolder: "La cartella è vuota"
|
emptyFolder: "La cartella è vuota"
|
||||||
unableToDelete: "Eliminazione impossibile"
|
unableToDelete: "Eliminazione impossibile"
|
||||||
inputNewFileName: "Inserisci nome del nuovo file"
|
inputNewFileName: "Inserisci nome del nuovo file"
|
||||||
|
inputNewDescription: "Inserisci una nuova descrizione"
|
||||||
inputNewFolderName: "Inserisci nome della nuova cartella"
|
inputNewFolderName: "Inserisci nome della nuova cartella"
|
||||||
circularReferenceFolder: "La cartella di destinazione è una sottocartella della cartella che vuoi spostare."
|
circularReferenceFolder: "La cartella di destinazione è una sottocartella della cartella che vuoi spostare."
|
||||||
hasChildFilesOrFolders: "Impossibile eliminare la cartella perché non è vuota"
|
hasChildFilesOrFolders: "Impossibile eliminare la cartella perché non è vuota"
|
||||||
@ -305,8 +307,8 @@ monthX: "{month}"
|
|||||||
yearX: "{year}"
|
yearX: "{year}"
|
||||||
pages: "Pagine"
|
pages: "Pagine"
|
||||||
integration: "App collegate"
|
integration: "App collegate"
|
||||||
connectSerice: "Connetti"
|
connectService: "Connessione"
|
||||||
disconnectSerice: "Disconnetti"
|
disconnectService: "Disconnessione "
|
||||||
enableLocalTimeline: "Abilita Timeline locale"
|
enableLocalTimeline: "Abilita Timeline locale"
|
||||||
enableGlobalTimeline: "Abilita Timeline federata"
|
enableGlobalTimeline: "Abilita Timeline federata"
|
||||||
disablingTimelinesInfo: "Anche se disabiliti queste timeline, gli amministratori e i moderatori potranno sempre accederci."
|
disablingTimelinesInfo: "Anche se disabiliti queste timeline, gli amministratori e i moderatori potranno sempre accederci."
|
||||||
@ -513,7 +515,6 @@ removeAllFollowing: "Cancella tutti i follows"
|
|||||||
removeAllFollowingDescription: "Cancella tutti i follows del server {host}. Per favore, esegui se, ad esempio, l'istanza non esiste più."
|
removeAllFollowingDescription: "Cancella tutti i follows del server {host}. Per favore, esegui se, ad esempio, l'istanza non esiste più."
|
||||||
userSuspended: "L'utente è sospes@."
|
userSuspended: "L'utente è sospes@."
|
||||||
userSilenced: "L'utente è silenziat@."
|
userSilenced: "L'utente è silenziat@."
|
||||||
sidebar: "Barra laterale"
|
|
||||||
divider: "Linea di separazione"
|
divider: "Linea di separazione"
|
||||||
addItem: "Aggiungi elemento"
|
addItem: "Aggiungi elemento"
|
||||||
rooms: "Camera"
|
rooms: "Camera"
|
||||||
@ -533,6 +534,8 @@ disablePlayer: "Chiudi lettore video"
|
|||||||
expandTweet: "Espandi tweet"
|
expandTweet: "Espandi tweet"
|
||||||
themeEditor: "Editor di temi"
|
themeEditor: "Editor di temi"
|
||||||
description: "Descrizione"
|
description: "Descrizione"
|
||||||
|
describeFile: "Aggiungi una descrizione d'immagine"
|
||||||
|
enterFileDescription: "Inserisci descrizione"
|
||||||
author: "Autore"
|
author: "Autore"
|
||||||
leaveConfirm: "Ci sono delle modifiche ancora non salvate. Vuoi cancellarle?"
|
leaveConfirm: "Ci sono delle modifiche ancora non salvate. Vuoi cancellarle?"
|
||||||
manage: "Gestione"
|
manage: "Gestione"
|
||||||
@ -738,6 +741,14 @@ middle: "Media"
|
|||||||
low: "Bassa"
|
low: "Bassa"
|
||||||
emailNotConfiguredWarning: "Non hai impostato nessun indirizzo e-mail."
|
emailNotConfiguredWarning: "Non hai impostato nessun indirizzo e-mail."
|
||||||
ratio: "Rapporto"
|
ratio: "Rapporto"
|
||||||
|
global: "Federata"
|
||||||
|
sent: "Inviare"
|
||||||
|
hashtags: "Hashtag"
|
||||||
|
troubleshooting: "Risoluzione problemi"
|
||||||
|
_docs:
|
||||||
|
continueReading: "Leggi di più"
|
||||||
|
features: "Funzionalità"
|
||||||
|
admin: "Gestione"
|
||||||
_ad:
|
_ad:
|
||||||
back: "Indietro"
|
back: "Indietro"
|
||||||
reduceFrequencyOfThisAd: "Visualizza questa pubblicità meno spesso"
|
reduceFrequencyOfThisAd: "Visualizza questa pubblicità meno spesso"
|
||||||
@ -796,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"
|
||||||
@ -822,9 +834,7 @@ _channel:
|
|||||||
following: "Seguiti"
|
following: "Seguiti"
|
||||||
usersCount: "{n} partecipanti"
|
usersCount: "{n} partecipanti"
|
||||||
notesCount: "{n} note"
|
notesCount: "{n} note"
|
||||||
_sidebar:
|
_menuDisplay:
|
||||||
full: "Intera"
|
|
||||||
icon: "Icone"
|
|
||||||
hide: "Nascondere"
|
hide: "Nascondere"
|
||||||
_wordMute:
|
_wordMute:
|
||||||
muteWords: "Parole da filtrare"
|
muteWords: "Parole da filtrare"
|
||||||
@ -1385,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: "絵文字を追加"
|
||||||
@ -279,6 +280,7 @@ emptyDrive: "ドライブは空です"
|
|||||||
emptyFolder: "フォルダーは空です"
|
emptyFolder: "フォルダーは空です"
|
||||||
unableToDelete: "削除できません"
|
unableToDelete: "削除できません"
|
||||||
inputNewFileName: "新しいファイル名を入力してください"
|
inputNewFileName: "新しいファイル名を入力してください"
|
||||||
|
inputNewDescription: "新しいキャプションを入力してください"
|
||||||
inputNewFolderName: "新しいフォルダ名を入力してください"
|
inputNewFolderName: "新しいフォルダ名を入力してください"
|
||||||
circularReferenceFolder: "移動先のフォルダーは、移動するフォルダーのサブフォルダーです。"
|
circularReferenceFolder: "移動先のフォルダーは、移動するフォルダーのサブフォルダーです。"
|
||||||
hasChildFilesOrFolders: "このフォルダは空でないため、削除できません。"
|
hasChildFilesOrFolders: "このフォルダは空でないため、削除できません。"
|
||||||
@ -310,8 +312,8 @@ monthX: "{month}月"
|
|||||||
yearX: "{year}年"
|
yearX: "{year}年"
|
||||||
pages: "ページ"
|
pages: "ページ"
|
||||||
integration: "連携"
|
integration: "連携"
|
||||||
connectSerice: "接続する"
|
connectService: "接続する"
|
||||||
disconnectSerice: "切断する"
|
disconnectService: "切断する"
|
||||||
enableLocalTimeline: "ローカルタイムラインを有効にする"
|
enableLocalTimeline: "ローカルタイムラインを有効にする"
|
||||||
enableGlobalTimeline: "グローバルタイムラインを有効にする"
|
enableGlobalTimeline: "グローバルタイムラインを有効にする"
|
||||||
disablingTimelinesInfo: "これらのタイムラインを無効化しても、利便性のため管理者およびモデレーターは引き続き利用することができます。"
|
disablingTimelinesInfo: "これらのタイムラインを無効化しても、利便性のため管理者およびモデレーターは引き続き利用することができます。"
|
||||||
@ -325,6 +327,7 @@ driveCapacityPerRemoteAccount: "リモートユーザーひとりあたりのド
|
|||||||
inMb: "メガバイト単位"
|
inMb: "メガバイト単位"
|
||||||
iconUrl: "アイコン画像のURL (faviconなど)"
|
iconUrl: "アイコン画像のURL (faviconなど)"
|
||||||
bannerUrl: "バナー画像のURL"
|
bannerUrl: "バナー画像のURL"
|
||||||
|
backgroundImageUrl: "背景画像のURL"
|
||||||
basicInfo: "基本情報"
|
basicInfo: "基本情報"
|
||||||
pinnedUsers: "ピン留めユーザー"
|
pinnedUsers: "ピン留めユーザー"
|
||||||
pinnedUsersDescription: "「みつける」ページなどにピン留めしたいユーザーを改行で区切って記述します。"
|
pinnedUsersDescription: "「みつける」ページなどにピン留めしたいユーザーを改行で区切って記述します。"
|
||||||
@ -526,7 +529,7 @@ removeAllFollowing: "フォローを全解除"
|
|||||||
removeAllFollowingDescription: "{host}からのフォローをすべて解除します。そのインスタンスがもう存在しなくなった場合などに実行してください。"
|
removeAllFollowingDescription: "{host}からのフォローをすべて解除します。そのインスタンスがもう存在しなくなった場合などに実行してください。"
|
||||||
userSuspended: "このユーザーは凍結されています。"
|
userSuspended: "このユーザーは凍結されています。"
|
||||||
userSilenced: "このユーザーはサイレンスされています。"
|
userSilenced: "このユーザーはサイレンスされています。"
|
||||||
sidebar: "サイドバー"
|
menu: "メニュー"
|
||||||
divider: "分割線"
|
divider: "分割線"
|
||||||
addItem: "項目を追加"
|
addItem: "項目を追加"
|
||||||
rooms: "ルーム"
|
rooms: "ルーム"
|
||||||
@ -546,6 +549,8 @@ disablePlayer: "プレイヤーを閉じる"
|
|||||||
expandTweet: "ツイートを展開する"
|
expandTweet: "ツイートを展開する"
|
||||||
themeEditor: "テーマエディター"
|
themeEditor: "テーマエディター"
|
||||||
description: "説明"
|
description: "説明"
|
||||||
|
describeFile: "キャプションを付ける"
|
||||||
|
enterFileDescription: "キャプションを入力"
|
||||||
author: "作者"
|
author: "作者"
|
||||||
leaveConfirm: "未保存の変更があります。破棄しますか?"
|
leaveConfirm: "未保存の変更があります。破棄しますか?"
|
||||||
manage: "管理"
|
manage: "管理"
|
||||||
@ -757,6 +762,29 @@ middle: "中"
|
|||||||
low: "低"
|
low: "低"
|
||||||
emailNotConfiguredWarning: "メールアドレスの設定がされていません。"
|
emailNotConfiguredWarning: "メールアドレスの設定がされていません。"
|
||||||
ratio: "比率"
|
ratio: "比率"
|
||||||
|
customCss: "カスタムCSS"
|
||||||
|
customCssWarn: "この設定は必ず知識のある方が行ってください。不適切な設定を行うとクライアントが正常に使用できなくなる恐れがあります。"
|
||||||
|
global: "グローバル"
|
||||||
|
squareAvatars: "アイコンを四角形で表示"
|
||||||
|
sent: "送信"
|
||||||
|
received: "受信"
|
||||||
|
searchResult: "検索結果"
|
||||||
|
hashtags: "ハッシュタグ"
|
||||||
|
troubleshooting: "トラブルシューティング"
|
||||||
|
useBlurEffect: "UIにぼかし効果を使用"
|
||||||
|
learnMore: "詳しく"
|
||||||
|
misskeyUpdated: "Misskeyが更新されました!"
|
||||||
|
whatIsNew: "更新情報を見る"
|
||||||
|
translate: "翻訳"
|
||||||
|
translatedFrom: "{x}から翻訳"
|
||||||
|
|
||||||
|
_docs:
|
||||||
|
continueReading: "続きを読む"
|
||||||
|
features: "機能"
|
||||||
|
generalTopics: "一般的なトピック"
|
||||||
|
advancedTopics: "高度なトピック"
|
||||||
|
admin: "管理"
|
||||||
|
translateWarn: "このドキュメントは翻訳されたものです。オリジナルとは内容が異なる場合があります。"
|
||||||
|
|
||||||
_ad:
|
_ad:
|
||||||
back: "戻る"
|
back: "戻る"
|
||||||
@ -864,6 +892,8 @@ _mfm:
|
|||||||
blurDescription: "内容をぼかすことができます。ポインターを上に乗せるとはっきり見えるようになります。"
|
blurDescription: "内容をぼかすことができます。ポインターを上に乗せるとはっきり見えるようになります。"
|
||||||
font: "フォント"
|
font: "フォント"
|
||||||
fontDescription: "内容のフォントを指定することができます。"
|
fontDescription: "内容のフォントを指定することができます。"
|
||||||
|
rainbow: "レインボー"
|
||||||
|
rainbowDescription: "内容をレインボーにします。"
|
||||||
|
|
||||||
_reversi:
|
_reversi:
|
||||||
reversi: "リバーシ"
|
reversi: "リバーシ"
|
||||||
@ -920,9 +950,10 @@ _channel:
|
|||||||
usersCount: "{n}人が参加中"
|
usersCount: "{n}人が参加中"
|
||||||
notesCount: "{n}投稿があります"
|
notesCount: "{n}投稿があります"
|
||||||
|
|
||||||
_sidebar:
|
_menuDisplay:
|
||||||
full: "フル"
|
sideFull: "横"
|
||||||
icon: "アイコン"
|
sideIcon: "横(アイコン)"
|
||||||
|
top: "上部"
|
||||||
hide: "隠す"
|
hide: "隠す"
|
||||||
|
|
||||||
_wordMute:
|
_wordMute:
|
||||||
|
@ -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: "このフォルダ、まだなんか入っとるから消されへん"
|
||||||
@ -308,8 +312,6 @@ monthX: "{month}月"
|
|||||||
yearX: "{year}年"
|
yearX: "{year}年"
|
||||||
pages: "ページ"
|
pages: "ページ"
|
||||||
integration: "連携"
|
integration: "連携"
|
||||||
connectSerice: "つなぐ"
|
|
||||||
disconnectSerice: "切ってまう"
|
|
||||||
enableLocalTimeline: "ローカルタイムラインを使えるようにする"
|
enableLocalTimeline: "ローカルタイムラインを使えるようにする"
|
||||||
enableGlobalTimeline: "グローバルタイムラインを使えるようにする"
|
enableGlobalTimeline: "グローバルタイムラインを使えるようにする"
|
||||||
disablingTimelinesInfo: "ここらへんのタイムラインを使えんようにしてしもても、管理者とモデレーターは使えるままになってるで、そうやなかったら不便やからな。"
|
disablingTimelinesInfo: "ここらへんのタイムラインを使えんようにしてしもても、管理者とモデレーターは使えるままになってるで、そうやなかったら不便やからな。"
|
||||||
@ -513,7 +515,6 @@ removeAllFollowing: "フォローを全解除"
|
|||||||
removeAllFollowingDescription: "{host}からのフォローをすべて解除するで。そのインスタンスが消えて無くなった時とかには便利な機能やで。"
|
removeAllFollowingDescription: "{host}からのフォローをすべて解除するで。そのインスタンスが消えて無くなった時とかには便利な機能やで。"
|
||||||
userSuspended: "このユーザーは...凍結されとる。"
|
userSuspended: "このユーザーは...凍結されとる。"
|
||||||
userSilenced: "このユーザーは...サイレンスされとる。"
|
userSilenced: "このユーザーは...サイレンスされとる。"
|
||||||
sidebar: "サイドバー"
|
|
||||||
divider: "分割線"
|
divider: "分割線"
|
||||||
rooms: "ルーム"
|
rooms: "ルーム"
|
||||||
relays: "リレー"
|
relays: "リレー"
|
||||||
@ -649,6 +650,11 @@ memo: "メモ"
|
|||||||
high: "高い"
|
high: "高い"
|
||||||
middle: "中"
|
middle: "中"
|
||||||
low: "低い"
|
low: "低い"
|
||||||
|
global: "グローバル"
|
||||||
|
sent: "送信"
|
||||||
|
hashtags: "ハッシュタグ"
|
||||||
|
_docs:
|
||||||
|
admin: "管理"
|
||||||
_ad:
|
_ad:
|
||||||
back: "戻る"
|
back: "戻る"
|
||||||
_gallery:
|
_gallery:
|
||||||
@ -733,9 +739,7 @@ _channel:
|
|||||||
removeBanner: "バナーを削除"
|
removeBanner: "バナーを削除"
|
||||||
featured: "トレンド"
|
featured: "トレンド"
|
||||||
notesCount: "{n}こ投稿があるで"
|
notesCount: "{n}こ投稿があるで"
|
||||||
_sidebar:
|
_menuDisplay:
|
||||||
full: "フル"
|
|
||||||
icon: "アイコン"
|
|
||||||
hide: "隠す"
|
hide: "隠す"
|
||||||
_wordMute:
|
_wordMute:
|
||||||
soft: "ソフト"
|
soft: "ソフト"
|
||||||
|
1
locales/jbo-EN.yml
Normal file
1
locales/jbo-EN.yml
Normal file
@ -0,0 +1 @@
|
|||||||
|
---
|
@ -7,7 +7,9 @@ username: "Isem n umseqdac"
|
|||||||
password: "Awal uffir"
|
password: "Awal uffir"
|
||||||
ok: "IH"
|
ok: "IH"
|
||||||
settings: "Iɣewwaṛen"
|
settings: "Iɣewwaṛen"
|
||||||
|
otherSettings: "Iɣewwaren nniḍen"
|
||||||
profile: "Amaɣnu"
|
profile: "Amaɣnu"
|
||||||
|
signup: "Jerred"
|
||||||
save: "Sekles"
|
save: "Sekles"
|
||||||
delete: "Kkes"
|
delete: "Kkes"
|
||||||
addToList: "Rnu ɣer tebdart"
|
addToList: "Rnu ɣer tebdart"
|
||||||
@ -27,15 +29,31 @@ followers: "Imeḍfaṛen"
|
|||||||
followsYou: "Yeṭṭafaṛ-ik·em-id"
|
followsYou: "Yeṭṭafaṛ-ik·em-id"
|
||||||
createList: "Snulfu-d tabdart"
|
createList: "Snulfu-d tabdart"
|
||||||
enterListName: "Isem n tebdart"
|
enterListName: "Isem n tebdart"
|
||||||
|
privacy: "Tabaḍnit"
|
||||||
follow: "Ḍfeṛ"
|
follow: "Ḍfeṛ"
|
||||||
you: "Kečči·mmi"
|
you: "Kečči·mmi"
|
||||||
selectList: "Fren tabdart"
|
selectList: "Fren tabdart"
|
||||||
youHaveNoLists: "Ulac ɣur-k·m ula d yiwet n tabdart"
|
youHaveNoLists: "Ulac ɣur-k·m ula d yiwet n tabdart"
|
||||||
|
security: "Taɣellist"
|
||||||
remove: "Kkes"
|
remove: "Kkes"
|
||||||
userList: "Tibdarin"
|
userList: "Tibdarin"
|
||||||
|
securityKey: "Tasarutt n tɣellist"
|
||||||
|
securityKeyName: "Isem n tsarutt"
|
||||||
|
signinRequired: "Ttxil jerred"
|
||||||
|
signinWith: "Tuqqna s {x}"
|
||||||
|
tapSecurityKey: "Sekcem tasarutt-ik·im n tɣellist"
|
||||||
uiLanguage: "Tutlayt n wegrudem"
|
uiLanguage: "Tutlayt n wegrudem"
|
||||||
|
accountSettings: "Iɣewwaṛen n umiḍan"
|
||||||
|
plugins: "Izegrar"
|
||||||
|
email: "Imayl"
|
||||||
|
emailAddress: "Tansa imayl"
|
||||||
smtpUser: "Isem n umseqdac"
|
smtpUser: "Isem n umseqdac"
|
||||||
smtpPass: "Awal uffir"
|
smtpPass: "Awal uffir"
|
||||||
|
other: "Wiyyaḍ"
|
||||||
|
accountInfo: "Talɣut n umiḍan"
|
||||||
|
emailNotification: "Ilɣa imayl"
|
||||||
|
selectAccount: "Fren amiḍan"
|
||||||
|
accounts: "Imiḍan"
|
||||||
_email:
|
_email:
|
||||||
_follow:
|
_follow:
|
||||||
title: "Yeṭṭafaṛ-ik·em-id"
|
title: "Yeṭṭafaṛ-ik·em-id"
|
||||||
@ -48,6 +66,8 @@ _theme:
|
|||||||
mention: "Bder"
|
mention: "Bder"
|
||||||
_sfx:
|
_sfx:
|
||||||
notification: "Ilɣuyen"
|
notification: "Ilɣuyen"
|
||||||
|
_permissions:
|
||||||
|
"write:account": "Ẓreg talɣut n umiḍan-ik·im"
|
||||||
_widgets:
|
_widgets:
|
||||||
notifications: "Ilɣuyen"
|
notifications: "Ilɣuyen"
|
||||||
_cw:
|
_cw:
|
||||||
|
@ -128,6 +128,7 @@ editWidgets: "위젯 편집"
|
|||||||
editWidgetsExit: "편집 종료"
|
editWidgetsExit: "편집 종료"
|
||||||
customEmojis: "커스텀 이모지"
|
customEmojis: "커스텀 이모지"
|
||||||
emoji: "이모지"
|
emoji: "이모지"
|
||||||
|
emojis: "이모지"
|
||||||
emojiName: "이모지 이름"
|
emojiName: "이모지 이름"
|
||||||
emojiUrl: "이모지 URL"
|
emojiUrl: "이모지 URL"
|
||||||
addEmoji: "이모지 추가"
|
addEmoji: "이모지 추가"
|
||||||
@ -279,6 +280,7 @@ emptyDrive: "드라이브가 비어 있습니다"
|
|||||||
emptyFolder: "폴더가 비어 있습니다"
|
emptyFolder: "폴더가 비어 있습니다"
|
||||||
unableToDelete: "삭제할 수 없습니다"
|
unableToDelete: "삭제할 수 없습니다"
|
||||||
inputNewFileName: "바꿀 파일명을 입력해 주세요"
|
inputNewFileName: "바꿀 파일명을 입력해 주세요"
|
||||||
|
inputNewDescription: "새 캡션을 입력해 주세요"
|
||||||
inputNewFolderName: "바꿀 폴더명을 입력해 주세요"
|
inputNewFolderName: "바꿀 폴더명을 입력해 주세요"
|
||||||
circularReferenceFolder: "지정한 폴더가 이동할 폴더의 하위 폴더입니다."
|
circularReferenceFolder: "지정한 폴더가 이동할 폴더의 하위 폴더입니다."
|
||||||
hasChildFilesOrFolders: "이 폴더는 비어있지 않기 때문에 삭제할 수 없습니다."
|
hasChildFilesOrFolders: "이 폴더는 비어있지 않기 때문에 삭제할 수 없습니다."
|
||||||
@ -310,8 +312,8 @@ monthX: "{month}월"
|
|||||||
yearX: "{year}년"
|
yearX: "{year}년"
|
||||||
pages: "페이지"
|
pages: "페이지"
|
||||||
integration: "연동"
|
integration: "연동"
|
||||||
connectSerice: "접속"
|
connectService: "계정 연동"
|
||||||
disconnectSerice: "연결 끊기"
|
disconnectService: "계정 연동 해제"
|
||||||
enableLocalTimeline: "로컬 타임라인 활성화"
|
enableLocalTimeline: "로컬 타임라인 활성화"
|
||||||
enableGlobalTimeline: "글로벌 타임라인 활성화"
|
enableGlobalTimeline: "글로벌 타임라인 활성화"
|
||||||
disablingTimelinesInfo: "특정 타임라인을 비활성화하더라도 관리자 및 모더레이터는 계속 사용할 수 있습니다."
|
disablingTimelinesInfo: "특정 타임라인을 비활성화하더라도 관리자 및 모더레이터는 계속 사용할 수 있습니다."
|
||||||
@ -325,6 +327,7 @@ driveCapacityPerRemoteAccount: "리모트 유저 한 명당 드라이브 용량"
|
|||||||
inMb: "메가바이트 단위"
|
inMb: "메가바이트 단위"
|
||||||
iconUrl: "아이콘 URL"
|
iconUrl: "아이콘 URL"
|
||||||
bannerUrl: "배너 이미지 URL"
|
bannerUrl: "배너 이미지 URL"
|
||||||
|
backgroundImageUrl: "배경 이미지 URL"
|
||||||
basicInfo: "기본 정보"
|
basicInfo: "기본 정보"
|
||||||
pinnedUsers: "고정된 유저"
|
pinnedUsers: "고정된 유저"
|
||||||
pinnedUsersDescription: "\"발견하기\" 페이지 등에 고정하고 싶은 유저를 한 줄에 한 명씩 적습니다."
|
pinnedUsersDescription: "\"발견하기\" 페이지 등에 고정하고 싶은 유저를 한 줄에 한 명씩 적습니다."
|
||||||
@ -526,7 +529,7 @@ removeAllFollowing: "모든 팔로잉 해제"
|
|||||||
removeAllFollowingDescription: "{host}(으)로부터 모든 팔로잉을 해제합니다. 해당 인스턴스가 더 이상 존재하지 않게 된 경우 등에 실행해 주세요."
|
removeAllFollowingDescription: "{host}(으)로부터 모든 팔로잉을 해제합니다. 해당 인스턴스가 더 이상 존재하지 않게 된 경우 등에 실행해 주세요."
|
||||||
userSuspended: "이 계정은 정지된 상태입니다."
|
userSuspended: "이 계정은 정지된 상태입니다."
|
||||||
userSilenced: "이 계정은 사일런스된 상태입니다."
|
userSilenced: "이 계정은 사일런스된 상태입니다."
|
||||||
sidebar: "사이드바"
|
menu: "메뉴"
|
||||||
divider: "구분선"
|
divider: "구분선"
|
||||||
addItem: "항목 추가"
|
addItem: "항목 추가"
|
||||||
rooms: "방"
|
rooms: "방"
|
||||||
@ -546,6 +549,8 @@ disablePlayer: "플레이어 닫기"
|
|||||||
expandTweet: "트윗 확장하기"
|
expandTweet: "트윗 확장하기"
|
||||||
themeEditor: "테마 에디터"
|
themeEditor: "테마 에디터"
|
||||||
description: "설명"
|
description: "설명"
|
||||||
|
describeFile: "캡션 추가"
|
||||||
|
enterFileDescription: "캡션 입력"
|
||||||
author: "작성자"
|
author: "작성자"
|
||||||
leaveConfirm: "저장하지 않은 변경사항이 있습니다. 취소하시겠습니까?"
|
leaveConfirm: "저장하지 않은 변경사항이 있습니다. 취소하시겠습니까?"
|
||||||
manage: "관리"
|
manage: "관리"
|
||||||
@ -757,6 +762,28 @@ middle: "보통"
|
|||||||
low: "낮음"
|
low: "낮음"
|
||||||
emailNotConfiguredWarning: "메일 주소가 설정되어 있지 않습니다."
|
emailNotConfiguredWarning: "메일 주소가 설정되어 있지 않습니다."
|
||||||
ratio: "비율"
|
ratio: "비율"
|
||||||
|
customCss: "CSS 사용자화"
|
||||||
|
customCssWarn: "이 설정은 기능을 알고 있는 경우에만 사용해야 합니다. 잘못된 값을 입력하면 클라이언트가 정상적으로 작동하지 않을 수 있습니다."
|
||||||
|
global: "글로벌"
|
||||||
|
squareAvatars: "프로필 아이콘을 사각형으로 표시"
|
||||||
|
sent: "전송"
|
||||||
|
received: "수신"
|
||||||
|
searchResult: "검색 결과"
|
||||||
|
hashtags: "해시태그"
|
||||||
|
troubleshooting: "문제 해결"
|
||||||
|
useBlurEffect: "UI에 흐림 효과 사용"
|
||||||
|
learnMore: "자세히"
|
||||||
|
misskeyUpdated: "Misskey가 업데이트 되었습니다!"
|
||||||
|
whatIsNew: "패치 정보 보기"
|
||||||
|
translate: "번역"
|
||||||
|
translatedFrom: "{x}에서 번역"
|
||||||
|
_docs:
|
||||||
|
continueReading: "계속 읽기"
|
||||||
|
features: "기능"
|
||||||
|
generalTopics: "일반 주제"
|
||||||
|
advancedTopics: "심화 주제"
|
||||||
|
admin: "관리"
|
||||||
|
translateWarn: "이 문서는 번역되었기 때문에 원본과는 내용이 다를 수 있습니다."
|
||||||
_ad:
|
_ad:
|
||||||
back: "뒤로"
|
back: "뒤로"
|
||||||
reduceFrequencyOfThisAd: "이 광고의 표시 빈도 낮추기"
|
reduceFrequencyOfThisAd: "이 광고의 표시 빈도 낮추기"
|
||||||
@ -855,6 +882,8 @@ _mfm:
|
|||||||
blurDescription: "내용이 흐리게 보입니다. 마우스를 위에 올려두면 내용이 보입니다."
|
blurDescription: "내용이 흐리게 보입니다. 마우스를 위에 올려두면 내용이 보입니다."
|
||||||
font: "폰트"
|
font: "폰트"
|
||||||
fontDescription: "내용의 글꼴을 지정할 수 있습니다."
|
fontDescription: "내용의 글꼴을 지정할 수 있습니다."
|
||||||
|
rainbow: "무지개"
|
||||||
|
rainbowDescription: "내용을 무지개로 표시합니다."
|
||||||
_reversi:
|
_reversi:
|
||||||
reversi: "리버시"
|
reversi: "리버시"
|
||||||
gameSettings: "대국 설정"
|
gameSettings: "대국 설정"
|
||||||
@ -906,9 +935,10 @@ _channel:
|
|||||||
following: "팔로잉"
|
following: "팔로잉"
|
||||||
usersCount: "{n}명 참여 중"
|
usersCount: "{n}명 참여 중"
|
||||||
notesCount: "{n}노트"
|
notesCount: "{n}노트"
|
||||||
_sidebar:
|
_menuDisplay:
|
||||||
full: "전체"
|
sideFull: "가로"
|
||||||
icon: "아이콘"
|
sideIcon: "가로(아이콘)"
|
||||||
|
top: "상단"
|
||||||
hide: "숨기기"
|
hide: "숨기기"
|
||||||
_wordMute:
|
_wordMute:
|
||||||
muteWords: "뮤트할 단어"
|
muteWords: "뮤트할 단어"
|
||||||
|
@ -1,2 +1,3 @@
|
|||||||
---
|
---
|
||||||
_lang_: "Nederlands"
|
_lang_: "Nederlands"
|
||||||
|
headlineMisskey: "Netwerk verbonden door notities"
|
||||||
|
@ -7,6 +7,7 @@ search: "Szukaj"
|
|||||||
notifications: "Powiadomienia"
|
notifications: "Powiadomienia"
|
||||||
username: "Nazwa użytkownika"
|
username: "Nazwa użytkownika"
|
||||||
password: "Hasło"
|
password: "Hasło"
|
||||||
|
forgotPassword: "Nie pamiętam hasła"
|
||||||
fetchingAsApObject: "Pobieranie z Fediwersum…"
|
fetchingAsApObject: "Pobieranie z Fediwersum…"
|
||||||
ok: "OK"
|
ok: "OK"
|
||||||
gotIt: "Rozumiem!"
|
gotIt: "Rozumiem!"
|
||||||
@ -65,6 +66,7 @@ download: "Pobierz"
|
|||||||
driveFileDeleteConfirm: "Czy chcesz usunąć plik \"{name}\"? Zniknie również notatka, do której dołączony jest ten plik."
|
driveFileDeleteConfirm: "Czy chcesz usunąć plik \"{name}\"? Zniknie również notatka, do której dołączony jest ten plik."
|
||||||
unfollowConfirm: "Czy na pewno chcesz przestać obserwować {name}?"
|
unfollowConfirm: "Czy na pewno chcesz przestać obserwować {name}?"
|
||||||
exportRequested: "Zażądałeś eksportu. Może to zająć trochę czasu. Po zakończeniu eksportu zostanie on dodany do Twoich \"dysków\"."
|
exportRequested: "Zażądałeś eksportu. Może to zająć trochę czasu. Po zakończeniu eksportu zostanie on dodany do Twoich \"dysków\"."
|
||||||
|
importRequested: "Zażądano importu. Może to zająć chwilę."
|
||||||
lists: "Listy"
|
lists: "Listy"
|
||||||
noLists: "Nie masz żadnych list"
|
noLists: "Nie masz żadnych list"
|
||||||
note: "Utwórz wpis"
|
note: "Utwórz wpis"
|
||||||
@ -126,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"
|
||||||
@ -133,9 +136,11 @@ settingGuide: "Proponowana konfiguracja"
|
|||||||
cacheRemoteFiles: "Przechowuj zdalne pliki w pamięci podręcznej"
|
cacheRemoteFiles: "Przechowuj zdalne pliki w pamięci podręcznej"
|
||||||
cacheRemoteFilesDescription: "Gdy ta opcja jest wyłączona, zdalne pliki są ładowane bezpośrednio ze zdalnych instancji. Wyłączenie the opcji zmniejszy użycie powierzchni dyskowej, ale zwiększy transfer, ponieważ miniaturki nie będą generowane."
|
cacheRemoteFilesDescription: "Gdy ta opcja jest wyłączona, zdalne pliki są ładowane bezpośrednio ze zdalnych instancji. Wyłączenie the opcji zmniejszy użycie powierzchni dyskowej, ale zwiększy transfer, ponieważ miniaturki nie będą generowane."
|
||||||
flagAsBot: "To konto jest botem"
|
flagAsBot: "To konto jest botem"
|
||||||
|
flagAsBotDescription: "Jeżeli ten kanał jest kontrolowany przez jakiś program, ustaw tę opcję. Jeżeli włączona, będzie działać jako flaga informująca innych programistów, aby zapobiegać nieskończonej interakcji z różnymi botami i dostosowywać wewnętrzne systemy Misskey, traktując konto jako bota."
|
||||||
flagAsCat: "To konto jest kotem"
|
flagAsCat: "To konto jest kotem"
|
||||||
flagAsCatDescription: "Przełącz tę opcję, aby konto było oznaczone jako kot."
|
flagAsCatDescription: "Przełącz tę opcję, aby konto było oznaczone jako kot."
|
||||||
autoAcceptFollowed: "Automatycznie przyjmuj prośby o możliwość obserwacji od użytkowników, których obserwujesz"
|
autoAcceptFollowed: "Automatycznie przyjmuj prośby o możliwość obserwacji od użytkowników, których obserwujesz"
|
||||||
|
addAccount: "Dodaj konto"
|
||||||
loginFailed: "Nie udało się zalogować"
|
loginFailed: "Nie udało się zalogować"
|
||||||
showOnRemote: "Zobacz na zdalnej instancji"
|
showOnRemote: "Zobacz na zdalnej instancji"
|
||||||
general: "Ogólne"
|
general: "Ogólne"
|
||||||
@ -179,6 +184,7 @@ clearQueueConfirmTitle: "Czy na pewno chcesz wyczyścić kolejkę?"
|
|||||||
clearCachedFiles: "Wyczyść pamięć podręczną"
|
clearCachedFiles: "Wyczyść pamięć podręczną"
|
||||||
clearCachedFilesConfirm: "Czy na pewno chcesz usunąć wszystkie zdalne pliki z pamięci podręcznej?"
|
clearCachedFilesConfirm: "Czy na pewno chcesz usunąć wszystkie zdalne pliki z pamięci podręcznej?"
|
||||||
blockedInstances: "Zablokowane instancje"
|
blockedInstances: "Zablokowane instancje"
|
||||||
|
blockedInstancesDescription: "Wypisz nazwy hostów instancji, które powinny zostać zablokowane. Wypisane instancje nie będą mogły dłużej komunikować się z tą instancją."
|
||||||
muteAndBlock: "Wycisz / Zablokuj"
|
muteAndBlock: "Wycisz / Zablokuj"
|
||||||
mutedUsers: "Wyciszeni użytkownicy"
|
mutedUsers: "Wyciszeni użytkownicy"
|
||||||
blockedUsers: "Zablokowani użytkownicy"
|
blockedUsers: "Zablokowani użytkownicy"
|
||||||
@ -271,6 +277,7 @@ emptyDrive: "Dysk jest pusty"
|
|||||||
emptyFolder: "Ten katalog jest pusty"
|
emptyFolder: "Ten katalog jest pusty"
|
||||||
unableToDelete: "Nie można usunąć"
|
unableToDelete: "Nie można usunąć"
|
||||||
inputNewFileName: "Wprowadź nową nazwę pliku"
|
inputNewFileName: "Wprowadź nową nazwę pliku"
|
||||||
|
inputNewDescription: "Proszę wpisać nowy napis"
|
||||||
inputNewFolderName: "Wprowadź nową nazwę katalogu"
|
inputNewFolderName: "Wprowadź nową nazwę katalogu"
|
||||||
circularReferenceFolder: "Katalog docelowy jest podkatalogiem katalogu, który chcesz przenieść."
|
circularReferenceFolder: "Katalog docelowy jest podkatalogiem katalogu, który chcesz przenieść."
|
||||||
hasChildFilesOrFolders: "Ponieważ ten katalog nie jest pusty, nie może być usunięty."
|
hasChildFilesOrFolders: "Ponieważ ten katalog nie jest pusty, nie może być usunięty."
|
||||||
@ -291,16 +298,17 @@ reject: "Odrzuć"
|
|||||||
normal: "Normalny"
|
normal: "Normalny"
|
||||||
instanceName: "Nazwa instancji"
|
instanceName: "Nazwa instancji"
|
||||||
instanceDescription: "Opis instancji"
|
instanceDescription: "Opis instancji"
|
||||||
|
maintainerName: "Administrator"
|
||||||
|
maintainerEmail: "E-mail administratora"
|
||||||
tosUrl: "Adres URL regulaminu"
|
tosUrl: "Adres URL regulaminu"
|
||||||
thisYear: "Rok"
|
thisYear: "Rok"
|
||||||
thisMonth: "Miesiąc"
|
thisMonth: "Miesiąc"
|
||||||
today: "Dziś"
|
today: "Dziś"
|
||||||
dayX: "{day}"
|
dayX: "{day}"
|
||||||
monthX: "{month}"
|
monthX: "{month}"
|
||||||
|
yearX: "{year}"
|
||||||
pages: "Strony"
|
pages: "Strony"
|
||||||
integration: "Integracja"
|
integration: "Integracja"
|
||||||
connectSerice: "Połącz"
|
|
||||||
disconnectSerice: "Rozłącz"
|
|
||||||
enableLocalTimeline: "Włącz lokalną oś czasu"
|
enableLocalTimeline: "Włącz lokalną oś czasu"
|
||||||
enableGlobalTimeline: "Włącz globalną oś czasu"
|
enableGlobalTimeline: "Włącz globalną oś czasu"
|
||||||
disablingTimelinesInfo: "Administratorzy i moderatorzy będą zawsze mieć dostęp do wszystkich osi czasu, nawet gdy są one wyłączone."
|
disablingTimelinesInfo: "Administratorzy i moderatorzy będą zawsze mieć dostęp do wszystkich osi czasu, nawet gdy są one wyłączone."
|
||||||
@ -332,6 +340,7 @@ manageAntennas: "Zarządzaj Antenami"
|
|||||||
name: "Nazwa"
|
name: "Nazwa"
|
||||||
antennaSource: "Źródło Anteny"
|
antennaSource: "Źródło Anteny"
|
||||||
antennaExcludeKeywords: "Wykluczone słowa kluczowe"
|
antennaExcludeKeywords: "Wykluczone słowa kluczowe"
|
||||||
|
notifyAntenna: "Powiadamiaj o nowych wpisach"
|
||||||
withFileAntenna: "Filtruj tylko wpisy z załączonym plikiem"
|
withFileAntenna: "Filtruj tylko wpisy z załączonym plikiem"
|
||||||
enableServiceworker: "Włącz ServiceWorker"
|
enableServiceworker: "Włącz ServiceWorker"
|
||||||
antennaUsersDescription: "Wypisz po jednej nazwie użytkownika w linii"
|
antennaUsersDescription: "Wypisz po jednej nazwie użytkownika w linii"
|
||||||
@ -358,6 +367,7 @@ administrator: "Admin"
|
|||||||
token: "Token"
|
token: "Token"
|
||||||
twoStepAuthentication: "Uwierzytelnianie dwuskładnikowe"
|
twoStepAuthentication: "Uwierzytelnianie dwuskładnikowe"
|
||||||
moderator: "Moderator"
|
moderator: "Moderator"
|
||||||
|
nUsersMentioned: "{n} wspomnianych użytkowników"
|
||||||
securityKey: "Klucz bezpieczeństwa"
|
securityKey: "Klucz bezpieczeństwa"
|
||||||
securityKeyName: "Nazwa klucza"
|
securityKeyName: "Nazwa klucza"
|
||||||
registerSecurityKey: "Zarejestruj klucz bezpieczeństwa"
|
registerSecurityKey: "Zarejestruj klucz bezpieczeństwa"
|
||||||
@ -397,6 +407,7 @@ retype: "Wprowadź ponownie"
|
|||||||
noteOf: "Wpisy {user}"
|
noteOf: "Wpisy {user}"
|
||||||
inviteToGroup: "Zaproś do grupy"
|
inviteToGroup: "Zaproś do grupy"
|
||||||
maxNoteTextLength: "Limit znaków dla wpisów"
|
maxNoteTextLength: "Limit znaków dla wpisów"
|
||||||
|
quoteAttached: "Zacytowano"
|
||||||
quoteQuestion: "Czy na pewno chcesz umieścić cytat?"
|
quoteQuestion: "Czy na pewno chcesz umieścić cytat?"
|
||||||
noMessagesYet: "Nie napisano jeszcze wiadomości"
|
noMessagesYet: "Nie napisano jeszcze wiadomości"
|
||||||
newMessageExists: "Masz nową wiadomość"
|
newMessageExists: "Masz nową wiadomość"
|
||||||
@ -419,6 +430,7 @@ signinWith: "Zaloguj się z {x}"
|
|||||||
signinFailed: "Nie udało się zalogować. Wprowadzona nazwa użytkownika lub hasło są nieprawidłowe."
|
signinFailed: "Nie udało się zalogować. Wprowadzona nazwa użytkownika lub hasło są nieprawidłowe."
|
||||||
tapSecurityKey: "Wybierz swój klucz bezpieczeństwa"
|
tapSecurityKey: "Wybierz swój klucz bezpieczeństwa"
|
||||||
or: "Lub"
|
or: "Lub"
|
||||||
|
language: "Język"
|
||||||
uiLanguage: "Język wyświetlania UI"
|
uiLanguage: "Język wyświetlania UI"
|
||||||
groupInvited: "Zaproszony(-a) do grupy"
|
groupInvited: "Zaproszony(-a) do grupy"
|
||||||
aboutX: "O {x}"
|
aboutX: "O {x}"
|
||||||
@ -432,6 +444,7 @@ category: "Kategoria"
|
|||||||
tags: "Tagi"
|
tags: "Tagi"
|
||||||
docSource: "Źródło tego dokumentu"
|
docSource: "Źródło tego dokumentu"
|
||||||
createAccount: "Utwórz konto"
|
createAccount: "Utwórz konto"
|
||||||
|
existingAccount: "Istniejące konto"
|
||||||
regenerate: "Wygeneruj ponownie"
|
regenerate: "Wygeneruj ponownie"
|
||||||
fontSize: "Rozmiar czcionki"
|
fontSize: "Rozmiar czcionki"
|
||||||
noFollowRequests: "Nie masz żadnych oczekujących próśb o możliwość obserwacji"
|
noFollowRequests: "Nie masz żadnych oczekujących próśb o możliwość obserwacji"
|
||||||
@ -453,6 +466,8 @@ showFeaturedNotesInTimeline: "Pokazuj wyróżnione wpisy w osi czasu"
|
|||||||
objectStorage: "Pamięć obiektowa"
|
objectStorage: "Pamięć obiektowa"
|
||||||
useObjectStorage: "Używaj pamięci obiektowej"
|
useObjectStorage: "Używaj pamięci obiektowej"
|
||||||
objectStorageBaseUrl: "Podstawowy URL"
|
objectStorageBaseUrl: "Podstawowy URL"
|
||||||
|
objectStorageBucket: "Bucket"
|
||||||
|
objectStorageBucketDesc: "Podaj nazwę „wiadra” używaną przez konfigurowaną usługę."
|
||||||
objectStoragePrefix: "Prefiks"
|
objectStoragePrefix: "Prefiks"
|
||||||
objectStoragePrefixDesc: "Pliki będą przechowywane w katalogu z tym prefiksem."
|
objectStoragePrefixDesc: "Pliki będą przechowywane w katalogu z tym prefiksem."
|
||||||
objectStorageEndpoint: "Punkt końcowy"
|
objectStorageEndpoint: "Punkt końcowy"
|
||||||
@ -499,7 +514,6 @@ deleteAllFilesConfirm: "Czy na pewno chcesz usunąć wszystkie pliki?"
|
|||||||
removeAllFollowingDescription: "Przestań obserwować wszystkie konta z {host}. Wykonaj to, jeżeli instancja już nie istnieje."
|
removeAllFollowingDescription: "Przestań obserwować wszystkie konta z {host}. Wykonaj to, jeżeli instancja już nie istnieje."
|
||||||
userSuspended: "To konto zostało zawieszone."
|
userSuspended: "To konto zostało zawieszone."
|
||||||
userSilenced: "Ten użytkownik został wyciszony."
|
userSilenced: "Ten użytkownik został wyciszony."
|
||||||
sidebar: "Pasek boczny"
|
|
||||||
divider: "Rozdzielacz"
|
divider: "Rozdzielacz"
|
||||||
addItem: "Dodaj element"
|
addItem: "Dodaj element"
|
||||||
rooms: "Pokój"
|
rooms: "Pokój"
|
||||||
@ -519,6 +533,8 @@ disablePlayer: "Zamknij odtwarzacz wideo"
|
|||||||
expandTweet: "Rozwiń tweet"
|
expandTweet: "Rozwiń tweet"
|
||||||
themeEditor: "Edytor motywu"
|
themeEditor: "Edytor motywu"
|
||||||
description: "Opis"
|
description: "Opis"
|
||||||
|
describeFile: "dodaj podpis"
|
||||||
|
enterFileDescription: "Wprowadź napis"
|
||||||
author: "Autor"
|
author: "Autor"
|
||||||
leaveConfirm: "Są niezapisane zmiany. Czy chcesz je odrzucić?"
|
leaveConfirm: "Są niezapisane zmiany. Czy chcesz je odrzucić?"
|
||||||
manage: "Zarządzanie"
|
manage: "Zarządzanie"
|
||||||
@ -540,6 +556,7 @@ pluginTokenRequestedDescription: "Ta wtyczka będzie mogła korzystać z ustawio
|
|||||||
notificationType: "Rodzaj powiadomień"
|
notificationType: "Rodzaj powiadomień"
|
||||||
edit: "Edytuj"
|
edit: "Edytuj"
|
||||||
useStarForReactionFallback: "Użyj ★ jako zapasowego emoji, gdy emoji reakcji jest nieznane"
|
useStarForReactionFallback: "Użyj ★ jako zapasowego emoji, gdy emoji reakcji jest nieznane"
|
||||||
|
emailServer: "Serwer poczty e-mail"
|
||||||
enableEmail: "Włącz dostarczanie wiadomości e-mail"
|
enableEmail: "Włącz dostarczanie wiadomości e-mail"
|
||||||
emailConfigInfo: "Wykorzystywany do potwierdzenia adresu e-mail w trakcie rejestracji, lub gdy zapomnisz hasła"
|
emailConfigInfo: "Wykorzystywany do potwierdzenia adresu e-mail w trakcie rejestracji, lub gdy zapomnisz hasła"
|
||||||
email: "Adres e-mail"
|
email: "Adres e-mail"
|
||||||
@ -552,6 +569,7 @@ smtpPass: "Hasło"
|
|||||||
emptyToDisableSmtpAuth: "Pozostaw adres e-mail i hasło puste, aby wyłączyć weryfikację SMTP"
|
emptyToDisableSmtpAuth: "Pozostaw adres e-mail i hasło puste, aby wyłączyć weryfikację SMTP"
|
||||||
smtpSecureInfo: "Wyłącz, jeżeli używasz STARTTLS"
|
smtpSecureInfo: "Wyłącz, jeżeli używasz STARTTLS"
|
||||||
testEmail: "Przetestuj dostarczanie wiadomości e-mail"
|
testEmail: "Przetestuj dostarczanie wiadomości e-mail"
|
||||||
|
wordMute: "Wyciszenie słowa"
|
||||||
userSaysSomething: "{name} powiedział(-a) coś"
|
userSaysSomething: "{name} powiedział(-a) coś"
|
||||||
makeActive: "Aktywuj"
|
makeActive: "Aktywuj"
|
||||||
display: "Wyświetlanie"
|
display: "Wyświetlanie"
|
||||||
@ -622,6 +640,7 @@ emailVerified: "Adres e-mail został potwierdzony"
|
|||||||
noteFavoritesCount: "Liczba polubionych wpisów"
|
noteFavoritesCount: "Liczba polubionych wpisów"
|
||||||
pageLikesCount: "Liczba otrzymanych polubień stron"
|
pageLikesCount: "Liczba otrzymanych polubień stron"
|
||||||
pageLikedCount: "Liczba polubionych stron"
|
pageLikedCount: "Liczba polubionych stron"
|
||||||
|
reversiCount: "Liczba rozgrywek Reversi"
|
||||||
contact: "Kontakt"
|
contact: "Kontakt"
|
||||||
useSystemFont: "Używaj domyślnej czcionki systemu"
|
useSystemFont: "Używaj domyślnej czcionki systemu"
|
||||||
experimentalFeatures: "Eksperymentalne funkcje"
|
experimentalFeatures: "Eksperymentalne funkcje"
|
||||||
@ -630,6 +649,7 @@ makeExplorable: "Pokazuj konto na stronie „Eksploruj”"
|
|||||||
makeExplorableDescription: "Jeżeli wyłączysz tę opcję, Twoje konto nie będzie wyświetlać się w sekcji „Eksploruj”."
|
makeExplorableDescription: "Jeżeli wyłączysz tę opcję, Twoje konto nie będzie wyświetlać się w sekcji „Eksploruj”."
|
||||||
showGapBetweenNotesInTimeline: "Pokazuj odstęp między wpisami na osi czasu."
|
showGapBetweenNotesInTimeline: "Pokazuj odstęp między wpisami na osi czasu."
|
||||||
duplicate: "Duplikuj"
|
duplicate: "Duplikuj"
|
||||||
|
left: "Lewo"
|
||||||
center: "Wyśsrodkuj"
|
center: "Wyśsrodkuj"
|
||||||
wide: "Szerokie"
|
wide: "Szerokie"
|
||||||
narrow: "Wąskie"
|
narrow: "Wąskie"
|
||||||
@ -639,26 +659,112 @@ clearCache: "Wyczyść pamięć podręczną"
|
|||||||
onlineUsersCount: "{n} osób jest online"
|
onlineUsersCount: "{n} osób jest online"
|
||||||
nUsers: "{n} użytkowników"
|
nUsers: "{n} użytkowników"
|
||||||
nNotes: "{n} wpisów"
|
nNotes: "{n} wpisów"
|
||||||
|
sendErrorReports: "Wyślij raporty o błędach"
|
||||||
|
myTheme: "Mój motyw"
|
||||||
backgroundColor: "Tło"
|
backgroundColor: "Tło"
|
||||||
accentColor: "Akcent"
|
accentColor: "Akcent"
|
||||||
textColor: "Tekst"
|
textColor: "Tekst"
|
||||||
|
saveAs: "Zapisz jako…"
|
||||||
|
advanced: "Zaawansowane"
|
||||||
value: "Wartość"
|
value: "Wartość"
|
||||||
|
createdAt: "Utworzono"
|
||||||
|
updatedAt: "Zaktualizowano"
|
||||||
|
saveConfirm: "Zapisać zmiany?"
|
||||||
|
deleteConfirm: "Na pewno usunąć?"
|
||||||
|
invalidValue: "Nieprawidłowa wartość."
|
||||||
|
registry: "Rejestr"
|
||||||
|
closeAccount: "Zamknij konto"
|
||||||
|
currentVersion: "Bieżąca wersja"
|
||||||
|
latestVersion: "Najnowsza wersja"
|
||||||
|
youAreRunningUpToDateClient: "Korzystasz z najnowszej wersji klienta."
|
||||||
|
newVersionOfClientAvailable: "Nowsza wersja klienta jest dostępna."
|
||||||
|
usageAmount: "Użycie"
|
||||||
|
capacity: "Pojemność"
|
||||||
|
inUse: "Użyto"
|
||||||
|
editCode: "Edytuj kod"
|
||||||
|
apply: "Zastosuj"
|
||||||
|
receiveAnnouncementFromInstance: "Otrzymuj powiadomienia e-mail z tej instancji"
|
||||||
|
emailNotification: "Powiadomienia e-mail"
|
||||||
|
publish: "Publikuj"
|
||||||
|
inChannelSearch: "Szukaj na kanale"
|
||||||
|
useReactionPickerForContextMenu: "Otwórz wybornik reakcji prawym kliknięciem"
|
||||||
|
typingUsers: "{users} pisze(-ą)..."
|
||||||
|
jumpToSpecifiedDate: "Przejdź do określonej daty"
|
||||||
|
showingPastTimeline: "Obecnie wyświetla starą oś czasu"
|
||||||
|
clear: "Wróć"
|
||||||
|
markAllAsRead: "Oznacz wszystkie jako przeczytane"
|
||||||
goBack: "Wróć"
|
goBack: "Wróć"
|
||||||
|
unlikeConfirm: "Na pewno chcesz usunąć polubienie?"
|
||||||
|
fullView: "Pełny widok"
|
||||||
|
quitFullView: "Opuść pełny widok"
|
||||||
|
addDescription: "Dodaj opis"
|
||||||
info: "Informacje"
|
info: "Informacje"
|
||||||
|
userInfo: "Informacje o użykowniku"
|
||||||
|
unknown: "Nieznane"
|
||||||
|
onlineStatus: "Status online"
|
||||||
|
hideOnlineStatus: "Ukryj status online"
|
||||||
|
hideOnlineStatusDescription: "Ukrywanie statusu online ogranicza wygody niektórych funkcji, tj. wyszukiwanie"
|
||||||
|
online: "Online"
|
||||||
|
active: "Aktywny"
|
||||||
|
offline: "Offline"
|
||||||
|
notRecommended: "Nie zalecane"
|
||||||
|
botProtection: "Zabezpieczenie przed botami"
|
||||||
|
instanceBlocking: "Zablokowane instancje"
|
||||||
|
selectAccount: "Wybierz konto"
|
||||||
|
enabled: "Właczono"
|
||||||
|
disabled: "Wyłączono"
|
||||||
|
quickAction: "Szybkie działania"
|
||||||
user: "Użytkownicy"
|
user: "Użytkownicy"
|
||||||
administration: "Zarządzanie"
|
administration: "Zarządzanie"
|
||||||
|
accounts: "Konta"
|
||||||
|
switch: "Przełącz"
|
||||||
|
noMaintainerInformationWarning: "Informacje o administratorze nie są skonfigurowane."
|
||||||
|
noBotProtectionWarning: "Zabezpieczenie przed botami nie jest skonfigurowane."
|
||||||
|
configure: "Skonfiguruj"
|
||||||
|
postToGallery: "Opublikuj w galerii"
|
||||||
|
gallery: "Galeria"
|
||||||
|
recentPosts: "Ostatnie wpisy"
|
||||||
|
popularPosts: "Popularne wpisy"
|
||||||
|
shareWithNote: "Udostępnij z wpisem"
|
||||||
|
ads: "Reklamy"
|
||||||
expiration: "Ankieta kończy się"
|
expiration: "Ankieta kończy się"
|
||||||
|
memo: "Notatki"
|
||||||
|
priority: "Priorytet"
|
||||||
|
high: "Wysoki"
|
||||||
middle: "Średnie"
|
middle: "Średnie"
|
||||||
|
low: "Niski"
|
||||||
|
emailNotConfiguredWarning: "Nie podano adresu e-mail"
|
||||||
|
ratio: "Stosunek"
|
||||||
|
global: "Globalna"
|
||||||
|
sent: "Wyślij"
|
||||||
|
hashtags: "Hashtag"
|
||||||
|
_docs:
|
||||||
|
admin: "Zarządzanie"
|
||||||
_ad:
|
_ad:
|
||||||
back: "Wróć"
|
back: "Wróć"
|
||||||
|
reduceFrequencyOfThisAd: "Pokazuj tę reklamę rzadziej"
|
||||||
|
_forgotPassword:
|
||||||
|
ifNoEmail: "Jeżeli nie podano adresu e-mail podczas rejestracji, skontaktuj się z administratorem zamiast tego."
|
||||||
|
contactAdmin: "Jeżeli Twoja instancja nie obsługuje adresów e-mail, skontaktuj się zamiast tego z administratorem, aby zresetować hasło."
|
||||||
_gallery:
|
_gallery:
|
||||||
|
my: "Moja galeria"
|
||||||
|
liked: "Polubione wpisy"
|
||||||
|
like: "Polub"
|
||||||
unlike: "Cofnij polubienie"
|
unlike: "Cofnij polubienie"
|
||||||
_email:
|
_email:
|
||||||
_follow:
|
_follow:
|
||||||
title: "Zaobserwował(a) Cię"
|
title: "Zaobserwował(a) Cię"
|
||||||
|
_receiveFollowRequest:
|
||||||
|
title: "Otrzymano prośbę o możliwość obserwacji"
|
||||||
|
_plugin:
|
||||||
|
install: "Zainstaluj wtyczki"
|
||||||
|
installWarn: "Nie instaluj niezaufanych wtyczek."
|
||||||
|
manage: "Zarządzanie wtyczkami"
|
||||||
_registry:
|
_registry:
|
||||||
|
scope: "Zakres"
|
||||||
key: "Klucz"
|
key: "Klucz"
|
||||||
keys: "Klucz"
|
keys: "Klucz"
|
||||||
|
domain: "Domena"
|
||||||
createKey: "Utwórz klucz"
|
createKey: "Utwórz klucz"
|
||||||
_aboutMisskey:
|
_aboutMisskey:
|
||||||
about: "Misskey jest oprogramowanie open source rozwijanym przez syuilo od 2014."
|
about: "Misskey jest oprogramowanie open source rozwijanym przez syuilo od 2014."
|
||||||
@ -708,6 +814,7 @@ _mfm:
|
|||||||
x4Description: "Czyni treść jeszcze większą niż jeszcze większa."
|
x4Description: "Czyni treść jeszcze większą niż jeszcze większa."
|
||||||
blur: "Rozmycie"
|
blur: "Rozmycie"
|
||||||
font: "Czcionka"
|
font: "Czcionka"
|
||||||
|
fontDescription: "Wybiera czcionkę do wyświetlania treści."
|
||||||
_reversi:
|
_reversi:
|
||||||
reversi: "Reversi"
|
reversi: "Reversi"
|
||||||
gameSettings: "Ustawienia gry"
|
gameSettings: "Ustawienia gry"
|
||||||
@ -756,9 +863,7 @@ _channel:
|
|||||||
following: "Śledzeni"
|
following: "Śledzeni"
|
||||||
usersCount: "{n} uczestnicy"
|
usersCount: "{n} uczestnicy"
|
||||||
notesCount: "{n} wpisy"
|
notesCount: "{n} wpisy"
|
||||||
_sidebar:
|
_menuDisplay:
|
||||||
full: "Pełne"
|
|
||||||
icon: "Awatar"
|
|
||||||
hide: "Ukryj"
|
hide: "Ukryj"
|
||||||
_wordMute:
|
_wordMute:
|
||||||
muteWords: "Słowo do wyciszenia"
|
muteWords: "Słowo do wyciszenia"
|
||||||
@ -972,16 +1077,21 @@ _profile:
|
|||||||
username: "Nazwa użytkownika"
|
username: "Nazwa użytkownika"
|
||||||
description: "Opis"
|
description: "Opis"
|
||||||
youCanIncludeHashtags: "Możesz umieścić hashtagi w swoim opisie."
|
youCanIncludeHashtags: "Możesz umieścić hashtagi w swoim opisie."
|
||||||
|
metadata: "Dodatkowe informacje"
|
||||||
|
metadataEdit: "Edytuj dodatkowe informacje"
|
||||||
|
metadataDescription: "Możesz wyświetlać do czterech sekcji dodatkowych informacji na swoim profilu."
|
||||||
metadataLabel: "Etykieta"
|
metadataLabel: "Etykieta"
|
||||||
metadataContent: "Treść"
|
metadataContent: "Treść"
|
||||||
changeAvatar: "Zmień awatar"
|
changeAvatar: "Zmień awatar"
|
||||||
changeBanner: "Zmień baner"
|
changeBanner: "Zmień baner"
|
||||||
_exportOrImport:
|
_exportOrImport:
|
||||||
|
allNotes: "Wszystkie wpisy"
|
||||||
followingList: "Obserwowani"
|
followingList: "Obserwowani"
|
||||||
muteList: "Wycisz"
|
muteList: "Wycisz"
|
||||||
blockingList: "Zablokuj"
|
blockingList: "Zablokuj"
|
||||||
userLists: "Listy"
|
userLists: "Listy"
|
||||||
_charts:
|
_charts:
|
||||||
|
federationInstancesTotal: "Łącznie sfederowanych instancji"
|
||||||
usersTotal: "Łącznie # użytkowników"
|
usersTotal: "Łącznie # użytkowników"
|
||||||
activeUsers: "Aktywni użytkownicy"
|
activeUsers: "Aktywni użytkownicy"
|
||||||
_instanceCharts:
|
_instanceCharts:
|
||||||
@ -996,6 +1106,7 @@ _instanceCharts:
|
|||||||
_timelines:
|
_timelines:
|
||||||
home: "Strona główna"
|
home: "Strona główna"
|
||||||
local: "Lokalne"
|
local: "Lokalne"
|
||||||
|
social: "Społeczność"
|
||||||
global: "Globalna"
|
global: "Globalna"
|
||||||
_rooms:
|
_rooms:
|
||||||
roomOf: "Pokój {user}"
|
roomOf: "Pokój {user}"
|
||||||
@ -1366,6 +1477,8 @@ _deck:
|
|||||||
swapRight: "Przesuń w prawo"
|
swapRight: "Przesuń w prawo"
|
||||||
swapUp: "Zamień z powyższym"
|
swapUp: "Zamień z powyższym"
|
||||||
swapDown: "Zamień z poniższym"
|
swapDown: "Zamień z poniższym"
|
||||||
|
stackLeft: "Przypnij do lewej"
|
||||||
|
popRight: "Odepnij w prawo"
|
||||||
profile: "Profil"
|
profile: "Profil"
|
||||||
_columns:
|
_columns:
|
||||||
main: "Główna"
|
main: "Główna"
|
||||||
|
@ -6,25 +6,72 @@ notifications: "Notificações"
|
|||||||
username: "Nome de usuário"
|
username: "Nome de usuário"
|
||||||
password: "Senha"
|
password: "Senha"
|
||||||
ok: "OK"
|
ok: "OK"
|
||||||
|
gotIt: "Entendi"
|
||||||
cancel: "Cancelar"
|
cancel: "Cancelar"
|
||||||
enterUsername: "Digite o nome de usuário"
|
enterUsername: "Digite o nome de usuário"
|
||||||
renotedBy: "Repostado por {user}"
|
renotedBy: "Repostado por {user}"
|
||||||
|
noNotes: "Sem posts"
|
||||||
settings: "Configurações"
|
settings: "Configurações"
|
||||||
basicSettings: "Configurações básicas"
|
basicSettings: "Configurações básicas"
|
||||||
otherSettings: "Outras configurações"
|
otherSettings: "Outras configurações"
|
||||||
profile: "Perfil"
|
profile: "Perfil"
|
||||||
timeline: "Timeline"
|
timeline: "Timeline"
|
||||||
|
logout: "Sair"
|
||||||
|
users: "Usuários"
|
||||||
|
favorite: "Favoritar"
|
||||||
|
favorites: "Favoritar"
|
||||||
|
showMore: "Ver mais"
|
||||||
|
youGotNewFollower: "Você tem um novo seguidor"
|
||||||
|
followRequestAccepted: "Pedido de seguir aceito"
|
||||||
|
note: "Post"
|
||||||
|
notes: "Posts"
|
||||||
|
enterEmoji: "Inserir emoji"
|
||||||
|
renote: "Repostar"
|
||||||
|
renoted: "Repostado"
|
||||||
|
cantRenote: "Não pode repostar"
|
||||||
|
cantReRenote: "Não pode repostar este repost"
|
||||||
|
pinnedNote: "Post fixado"
|
||||||
|
sensitive: "Conteúdo sensível"
|
||||||
|
mute: "Silenciar"
|
||||||
|
unmute: "Dessilenciar"
|
||||||
|
settingGuide: "Guia de configuração"
|
||||||
|
instances: "Instância"
|
||||||
|
registeredAt: "Registrado em"
|
||||||
|
perHour: "por hora"
|
||||||
|
perDay: "por dia"
|
||||||
|
noUsers: "Sem usuários"
|
||||||
|
messageRead: "Lida"
|
||||||
|
lightThemes: "Tema claro"
|
||||||
|
darkThemes: "Tema escuro"
|
||||||
|
addFile: "Adicionar arquivo"
|
||||||
|
nsfw: "Conteúdo sensível"
|
||||||
|
monthX: "mês de {month}"
|
||||||
|
pinnedNotes: "Post fixado"
|
||||||
smtpUser: "Nome de usuário"
|
smtpUser: "Nome de usuário"
|
||||||
smtpPass: "Senha"
|
smtpPass: "Senha"
|
||||||
|
user: "Usuários"
|
||||||
|
_email:
|
||||||
|
_follow:
|
||||||
|
title: "Você tem um novo seguidor"
|
||||||
_mfm:
|
_mfm:
|
||||||
search: "Pesquisar"
|
search: "Pesquisar"
|
||||||
|
_theme:
|
||||||
|
keys:
|
||||||
|
renote: "Repostar"
|
||||||
_sfx:
|
_sfx:
|
||||||
|
note: "Posts"
|
||||||
notification: "Notificações"
|
notification: "Notificações"
|
||||||
_widgets:
|
_widgets:
|
||||||
notifications: "Notificações"
|
notifications: "Notificações"
|
||||||
timeline: "Timeline"
|
timeline: "Timeline"
|
||||||
_profile:
|
_profile:
|
||||||
username: "Nome de usuário"
|
username: "Nome de usuário"
|
||||||
|
_exportOrImport:
|
||||||
|
muteList: "Silenciar"
|
||||||
|
_notification:
|
||||||
|
youWereFollowed: "Você tem um novo seguidor"
|
||||||
|
_types:
|
||||||
|
renote: "Repostar"
|
||||||
_deck:
|
_deck:
|
||||||
_columns:
|
_columns:
|
||||||
notifications: "Notificações"
|
notifications: "Notificações"
|
||||||
|
@ -7,6 +7,7 @@ search: "Поиск"
|
|||||||
notifications: "Уведомления"
|
notifications: "Уведомления"
|
||||||
username: "Имя пользователя"
|
username: "Имя пользователя"
|
||||||
password: "Пароль"
|
password: "Пароль"
|
||||||
|
forgotPassword: "Пароль забыт"
|
||||||
fetchingAsApObject: "Приём с других сайтов"
|
fetchingAsApObject: "Приём с других сайтов"
|
||||||
ok: "Окей"
|
ok: "Окей"
|
||||||
gotIt: "Ясно!"
|
gotIt: "Ясно!"
|
||||||
@ -127,6 +128,7 @@ editWidgets: "Редактировать виджеты"
|
|||||||
editWidgetsExit: "Готово"
|
editWidgetsExit: "Готово"
|
||||||
customEmojis: "Эмодзи пользователя"
|
customEmojis: "Эмодзи пользователя"
|
||||||
emoji: "Эмодзи"
|
emoji: "Эмодзи"
|
||||||
|
emojis: "Эмодзи"
|
||||||
emojiName: "Название эмодзи"
|
emojiName: "Название эмодзи"
|
||||||
emojiUrl: "URL эмодзи"
|
emojiUrl: "URL эмодзи"
|
||||||
addEmoji: "Добавить эмодзи"
|
addEmoji: "Добавить эмодзи"
|
||||||
@ -278,6 +280,7 @@ emptyDrive: "Диск пуст"
|
|||||||
emptyFolder: "Папка пуста"
|
emptyFolder: "Папка пуста"
|
||||||
unableToDelete: "Удаление невозможно"
|
unableToDelete: "Удаление невозможно"
|
||||||
inputNewFileName: "Введите имя нового файла"
|
inputNewFileName: "Введите имя нового файла"
|
||||||
|
inputNewDescription: "Введите новую подпись"
|
||||||
inputNewFolderName: "Пожалуйста, введите новое имя папки!"
|
inputNewFolderName: "Пожалуйста, введите новое имя папки!"
|
||||||
circularReferenceFolder: "Вы пытаетесь переместить папку внутрь себя."
|
circularReferenceFolder: "Вы пытаетесь переместить папку внутрь себя."
|
||||||
hasChildFilesOrFolders: "Эта папка не пуста и не может быть удалена."
|
hasChildFilesOrFolders: "Эта папка не пуста и не может быть удалена."
|
||||||
@ -309,8 +312,8 @@ monthX: "{month} месяц"
|
|||||||
yearX: "{year} год"
|
yearX: "{year} год"
|
||||||
pages: "Страницы"
|
pages: "Страницы"
|
||||||
integration: "Интеграция"
|
integration: "Интеграция"
|
||||||
connectSerice: "Соединение"
|
connectService: "Подключиться"
|
||||||
disconnectSerice: "Отключение"
|
disconnectService: "Отключиться"
|
||||||
enableLocalTimeline: "Включить локальную ленту"
|
enableLocalTimeline: "Включить локальную ленту"
|
||||||
enableGlobalTimeline: "Включить глобальную ленту"
|
enableGlobalTimeline: "Включить глобальную ленту"
|
||||||
disablingTimelinesInfo: "У администраторов и модераторов есть доступ ко всем лентам, даже если они отключены."
|
disablingTimelinesInfo: "У администраторов и модераторов есть доступ ко всем лентам, даже если они отключены."
|
||||||
@ -324,6 +327,7 @@ driveCapacityPerRemoteAccount: "Объём диска на одного поль
|
|||||||
inMb: "В мегабайтах"
|
inMb: "В мегабайтах"
|
||||||
iconUrl: "Ссылка на аватар"
|
iconUrl: "Ссылка на аватар"
|
||||||
bannerUrl: "Ссылка на изображение в шапке"
|
bannerUrl: "Ссылка на изображение в шапке"
|
||||||
|
backgroundImageUrl: "Ссылка на фоновое изображение"
|
||||||
basicInfo: "Общая информация"
|
basicInfo: "Общая информация"
|
||||||
pinnedUsers: "Прикреплённый пользователь"
|
pinnedUsers: "Прикреплённый пользователь"
|
||||||
pinnedUsersDescription: "Перечислите по одному имени пользователя в строке. Пользователи, перечисленные здесь, будут привязаны к закладке \"Изучение\"."
|
pinnedUsersDescription: "Перечислите по одному имени пользователя в строке. Пользователи, перечисленные здесь, будут привязаны к закладке \"Изучение\"."
|
||||||
@ -525,7 +529,7 @@ removeAllFollowing: "Удалить всех подписчиков"
|
|||||||
removeAllFollowingDescription: "Отменить все подписки с домена {host}? Пожалуйста, применяйте это действие, если инстанс больше не существует."
|
removeAllFollowingDescription: "Отменить все подписки с домена {host}? Пожалуйста, применяйте это действие, если инстанс больше не существует."
|
||||||
userSuspended: "Эта учётная запись заморожена"
|
userSuspended: "Эта учётная запись заморожена"
|
||||||
userSilenced: "Этот пользователь был заглушен"
|
userSilenced: "Этот пользователь был заглушен"
|
||||||
sidebar: "Боковая панель"
|
menu: "Меню"
|
||||||
divider: "Линия-разделитель"
|
divider: "Линия-разделитель"
|
||||||
addItem: "Добавить элемент"
|
addItem: "Добавить элемент"
|
||||||
rooms: "Комната"
|
rooms: "Комната"
|
||||||
@ -545,6 +549,8 @@ disablePlayer: "Выключить проигрыватель"
|
|||||||
expandTweet: "Развернуть твит"
|
expandTweet: "Развернуть твит"
|
||||||
themeEditor: "Редактор темы оформления"
|
themeEditor: "Редактор темы оформления"
|
||||||
description: "Описание"
|
description: "Описание"
|
||||||
|
describeFile: "Добавить подпись"
|
||||||
|
enterFileDescription: "Введите подпись"
|
||||||
author: "Автор"
|
author: "Автор"
|
||||||
leaveConfirm: "Вы не сохранили изменения. Хотите выйти и потерять их?"
|
leaveConfirm: "Вы не сохранили изменения. Хотите выйти и потерять их?"
|
||||||
manage: "Управление"
|
manage: "Управление"
|
||||||
@ -747,10 +753,42 @@ gallery: "Галерея"
|
|||||||
recentPosts: "Недавние публикации"
|
recentPosts: "Недавние публикации"
|
||||||
popularPosts: "Популярные публикации"
|
popularPosts: "Популярные публикации"
|
||||||
shareWithNote: "Поделиться заметкой"
|
shareWithNote: "Поделиться заметкой"
|
||||||
|
ads: "Реклама"
|
||||||
expiration: "Опрос длится"
|
expiration: "Опрос длится"
|
||||||
|
memo: "Памятка"
|
||||||
|
priority: "Приоритет"
|
||||||
|
high: "Высокий"
|
||||||
middle: "Средне"
|
middle: "Средне"
|
||||||
|
low: "Низкий"
|
||||||
|
emailNotConfiguredWarning: "Не указан адрес электронной почты"
|
||||||
|
ratio: "Соотношение"
|
||||||
|
customCss: "Индивидуальный CSS"
|
||||||
|
customCssWarn: "Используйте эту настройку только если знаете, что делаете. Ошибки здесь чреваты тем, что сайт перестанет нормально работать у вас."
|
||||||
|
global: "Всеобщая"
|
||||||
|
squareAvatars: "Квадратные аватарки"
|
||||||
|
sent: "Отправить"
|
||||||
|
received: "Получено"
|
||||||
|
searchResult: "Результаты поиска"
|
||||||
|
hashtags: "Хэштег"
|
||||||
|
troubleshooting: "Разрешение проблем"
|
||||||
|
useBlurEffect: "Размытие в интерфейсе"
|
||||||
|
learnMore: "Подробнее"
|
||||||
|
misskeyUpdated: "Misskey обновился!"
|
||||||
|
whatIsNew: "Что новенького?"
|
||||||
|
_docs:
|
||||||
|
continueReading: "Читать подробнее"
|
||||||
|
features: "Возможности"
|
||||||
|
generalTopics: "Основные темы"
|
||||||
|
advancedTopics: "Дополнительные темы"
|
||||||
|
admin: "Управление"
|
||||||
|
translateWarn: "Это перевод документа. Он может неточно отражать содержимое оригинала."
|
||||||
_ad:
|
_ad:
|
||||||
back: "Выход"
|
back: "Выход"
|
||||||
|
reduceFrequencyOfThisAd: "Реже показывать эту рекламу"
|
||||||
|
_forgotPassword:
|
||||||
|
enterEmail: "Введите адрес электронной почты, который ввели при регистрации. На неё будет выслана ссылка для смены пароля."
|
||||||
|
ifNoEmail: "Если вы не ввели свой адрес электронной почты, свяжитесь с администратором ресурса, чтобы сменить пароль."
|
||||||
|
contactAdmin: "Здесь не используются адреса электронной почты, так что свяжитесь с администратором, чтобы поменять пароль."
|
||||||
_gallery:
|
_gallery:
|
||||||
my: "Личная"
|
my: "Личная"
|
||||||
liked: "Понравившееся"
|
liked: "Понравившееся"
|
||||||
@ -842,6 +880,8 @@ _mfm:
|
|||||||
blurDescription: "Размывает текст до нечитаемости, будто его поместили за матовое стекло. Наведение указателя мыши на размытый текст возвращает чёткость."
|
blurDescription: "Размывает текст до нечитаемости, будто его поместили за матовое стекло. Наведение указателя мыши на размытый текст возвращает чёткость."
|
||||||
font: "Шрифт"
|
font: "Шрифт"
|
||||||
fontDescription: "Так можно писать произвольным шрифтом."
|
fontDescription: "Так можно писать произвольным шрифтом."
|
||||||
|
rainbow: "Радуга"
|
||||||
|
rainbowDescription: "Заставлять содержимое отображаться в цветах радуги."
|
||||||
_reversi:
|
_reversi:
|
||||||
reversi: "Реверси"
|
reversi: "Реверси"
|
||||||
gameSettings: "Настройки игры"
|
gameSettings: "Настройки игры"
|
||||||
@ -893,9 +933,10 @@ _channel:
|
|||||||
following: "Подписки"
|
following: "Подписки"
|
||||||
usersCount: "Участников: {n}"
|
usersCount: "Участников: {n}"
|
||||||
notesCount: "Заметок: {n}"
|
notesCount: "Заметок: {n}"
|
||||||
_sidebar:
|
_menuDisplay:
|
||||||
full: "Полностью"
|
sideFull: "Сторона"
|
||||||
icon: "Только значки"
|
sideIcon: "Сторона (иконки)"
|
||||||
|
top: "Вверх"
|
||||||
hide: "Спрятать"
|
hide: "Спрятать"
|
||||||
_wordMute:
|
_wordMute:
|
||||||
muteWords: "Скрыть слово"
|
muteWords: "Скрыть слово"
|
||||||
|
@ -127,6 +127,7 @@ editWidgets: "Редагувати віджети"
|
|||||||
editWidgetsExit: "Готово"
|
editWidgetsExit: "Готово"
|
||||||
customEmojis: "Кастомні емоджі"
|
customEmojis: "Кастомні емоджі"
|
||||||
emoji: "Емоджі"
|
emoji: "Емоджі"
|
||||||
|
emojis: "Емоджі"
|
||||||
emojiName: "Назва емоджі"
|
emojiName: "Назва емоджі"
|
||||||
emojiUrl: "URL емодзі"
|
emojiUrl: "URL емодзі"
|
||||||
addEmoji: "Додати емодзі"
|
addEmoji: "Додати емодзі"
|
||||||
@ -307,8 +308,6 @@ monthX: "{month}"
|
|||||||
yearX: "{year}"
|
yearX: "{year}"
|
||||||
pages: "Сторінки"
|
pages: "Сторінки"
|
||||||
integration: "Інтеграція"
|
integration: "Інтеграція"
|
||||||
connectSerice: "Під’єднати"
|
|
||||||
disconnectSerice: "Відключитися"
|
|
||||||
enableLocalTimeline: "Увімкнути локальну стрічку"
|
enableLocalTimeline: "Увімкнути локальну стрічку"
|
||||||
enableGlobalTimeline: "Увімкнути глобальну стрічку"
|
enableGlobalTimeline: "Увімкнути глобальну стрічку"
|
||||||
disablingTimelinesInfo: "Адміністратори та модератори завжди мають доступ до всіх стрічок, навіть якщо вони вимкнуті."
|
disablingTimelinesInfo: "Адміністратори та модератори завжди мають доступ до всіх стрічок, навіть якщо вони вимкнуті."
|
||||||
@ -519,7 +518,6 @@ removeAllFollowing: "Скасувати всі підписки"
|
|||||||
removeAllFollowingDescription: "Скасувати підписку на всі акаунти з {host}. Будь ласка, робіть це, якщо інстанс більше не існує."
|
removeAllFollowingDescription: "Скасувати підписку на всі акаунти з {host}. Будь ласка, робіть це, якщо інстанс більше не існує."
|
||||||
userSuspended: "Обліковий запис заблокований."
|
userSuspended: "Обліковий запис заблокований."
|
||||||
userSilenced: "Обліковий запис приглушений."
|
userSilenced: "Обліковий запис приглушений."
|
||||||
sidebar: "Бокова панель"
|
|
||||||
divider: "Розділювач"
|
divider: "Розділювач"
|
||||||
addItem: "Додати елемент"
|
addItem: "Додати елемент"
|
||||||
rooms: "Кімнати"
|
rooms: "Кімнати"
|
||||||
@ -691,6 +689,11 @@ user: "Користувачі"
|
|||||||
administration: "Управління"
|
administration: "Управління"
|
||||||
expiration: "Опитування закінчується"
|
expiration: "Опитування закінчується"
|
||||||
middle: "Середній"
|
middle: "Середній"
|
||||||
|
global: "Глобальна"
|
||||||
|
sent: "Відправити"
|
||||||
|
hashtags: "Хештеґ"
|
||||||
|
_docs:
|
||||||
|
admin: "Управління"
|
||||||
_ad:
|
_ad:
|
||||||
back: "Назад"
|
back: "Назад"
|
||||||
_gallery:
|
_gallery:
|
||||||
@ -818,9 +821,7 @@ _channel:
|
|||||||
following: "Підписки"
|
following: "Підписки"
|
||||||
usersCount: "{n} учасників"
|
usersCount: "{n} учасників"
|
||||||
notesCount: "{n} дописів"
|
notesCount: "{n} дописів"
|
||||||
_sidebar:
|
_menuDisplay:
|
||||||
full: "Повна"
|
|
||||||
icon: "Аватар"
|
|
||||||
hide: "Сховати"
|
hide: "Сховати"
|
||||||
_wordMute:
|
_wordMute:
|
||||||
muteWords: "Заглушені слова"
|
muteWords: "Заглушені слова"
|
||||||
|
@ -1,13 +1,13 @@
|
|||||||
---
|
---
|
||||||
_lang_: "中文(简体)"
|
_lang_: "中文(简体)"
|
||||||
headlineMisskey: "通过帖子连接在一起的网络"
|
headlineMisskey: "通过帖子连接在一起的网络"
|
||||||
introMisskey: "欢迎!Misskey是一个开源的、去中心化的“微博客”服务。\n通过编写「帖文」来和大家分享你的以及你周围的事情吧!📡\n通过「回应」功能,可以让你快速地对大家的帖文表达反馈👍\n来探索新的世界吧!🚀"
|
introMisskey: "欢迎!Misskey是一个开源的、去中心化的“微博客”服务。\n通过编写「帖子」来和大家分享你的以及你周围的事情吧!📡\n通过「回应」功能,可以让你快速地对大家的帖子表达反馈👍\n来探索新的世界吧!🚀"
|
||||||
monthAndDay: "{month}月 {day}日"
|
monthAndDay: "{month}月 {day}日"
|
||||||
search: "搜索"
|
search: "搜索"
|
||||||
notifications: "通知"
|
notifications: "通知"
|
||||||
username: "用户名"
|
username: "用户名"
|
||||||
password: "密码"
|
password: "密码"
|
||||||
forgotPassword: "忘记密码"
|
forgotPassword: "重置密码"
|
||||||
fetchingAsApObject: "联合查询中"
|
fetchingAsApObject: "联合查询中"
|
||||||
ok: "OK"
|
ok: "OK"
|
||||||
gotIt: "我明白了"
|
gotIt: "我明白了"
|
||||||
@ -63,33 +63,33 @@ import: "导入"
|
|||||||
export: "导出"
|
export: "导出"
|
||||||
files: "文件"
|
files: "文件"
|
||||||
download: "下载"
|
download: "下载"
|
||||||
driveFileDeleteConfirm: "要删除「{name}」文件吗?附加此文件的帖子也会消失。"
|
driveFileDeleteConfirm: "要删除「{name}」文件吗?附加此文件的帖子也会被删除。"
|
||||||
unfollowConfirm: "要取消对{name}的关注吗?"
|
unfollowConfirm: "要取消对{name}的关注吗?"
|
||||||
exportRequested: "导出请求已提交。可能需要花一些时间。导出的文件将保存到网盘中。"
|
exportRequested: "导出请求已提交,这可能需要花一些时间,导出的文件将保存到网盘中。"
|
||||||
importRequested: "导入请求已提交。这可能需要花一点时间。"
|
importRequested: "导入请求已提交,这可能需要花一点时间。"
|
||||||
lists: "列表"
|
lists: "列表"
|
||||||
noLists: "列表为空"
|
noLists: "列表为空"
|
||||||
note: "帖子"
|
note: "帖子"
|
||||||
notes: "帖子"
|
notes: "帖子"
|
||||||
following: "关注中"
|
following: "关注中"
|
||||||
followers: "关注者"
|
followers: "关注者"
|
||||||
followsYou: "关注了你"
|
followsYou: "正在关注你"
|
||||||
createList: "创建列表"
|
createList: "创建列表"
|
||||||
manageLists: "管理列表"
|
manageLists: "管理列表"
|
||||||
error: "错误"
|
error: "错误"
|
||||||
somethingHappened: "出现了问题"
|
somethingHappened: "出现了一些问题!"
|
||||||
retry: "重试"
|
retry: "重试"
|
||||||
pageLoadError: "页面加载失败。"
|
pageLoadError: "页面加载失败。"
|
||||||
pageLoadErrorDescription: "这通常是由于网络或浏览器缓存的原因。请清除缓存或等待片刻后重试。"
|
pageLoadErrorDescription: "这通常是由于网络或浏览器缓存的原因。请清除缓存或等待片刻后重试。"
|
||||||
enterListName: "输入列表名称"
|
enterListName: "输入列表名称"
|
||||||
privacy: "隐私"
|
privacy: "隐私"
|
||||||
makeFollowManuallyApprove: "关注者请求需要批准"
|
makeFollowManuallyApprove: "关注者的关注请求需要批准"
|
||||||
defaultNoteVisibility: "默认可见性"
|
defaultNoteVisibility: "默认可见性"
|
||||||
follow: "关注"
|
follow: "关注"
|
||||||
followRequest: "关注申请"
|
followRequest: "关注申请"
|
||||||
followRequests: "关注申请"
|
followRequests: "关注申请"
|
||||||
unfollow: "取消关注"
|
unfollow: "取消关注"
|
||||||
followRequestPending: "发送关注申请"
|
followRequestPending: "发送关注请求"
|
||||||
enterEmoji: "输入表情符号"
|
enterEmoji: "输入表情符号"
|
||||||
renote: "转发"
|
renote: "转发"
|
||||||
unrenote: "取消转发"
|
unrenote: "取消转发"
|
||||||
@ -106,7 +106,7 @@ add: "添加"
|
|||||||
reaction: "回应"
|
reaction: "回应"
|
||||||
reactionSettingDescription: "选择您想要置顶的回应。"
|
reactionSettingDescription: "选择您想要置顶的回应。"
|
||||||
reactionSettingDescription2: "拖动重新排序,单击删除,点击 + 添加。"
|
reactionSettingDescription2: "拖动重新排序,单击删除,点击 + 添加。"
|
||||||
rememberNoteVisibility: "记录公开范围"
|
rememberNoteVisibility: "保存上次设置的可见性"
|
||||||
attachCancel: "删除附件"
|
attachCancel: "删除附件"
|
||||||
markAsSensitive: "标记为敏感内容"
|
markAsSensitive: "标记为敏感内容"
|
||||||
unmarkAsSensitive: "取消标记为敏感内容"
|
unmarkAsSensitive: "取消标记为敏感内容"
|
||||||
@ -128,17 +128,18 @@ editWidgets: "编辑小工具"
|
|||||||
editWidgetsExit: "完成编辑"
|
editWidgetsExit: "完成编辑"
|
||||||
customEmojis: "自定义表情符号"
|
customEmojis: "自定义表情符号"
|
||||||
emoji: "表情符号"
|
emoji: "表情符号"
|
||||||
|
emojis: "表情符号"
|
||||||
emojiName: "表情符号名称"
|
emojiName: "表情符号名称"
|
||||||
emojiUrl: "表情符号地址"
|
emojiUrl: "表情符号地址"
|
||||||
addEmoji: "添加表情符号"
|
addEmoji: "添加表情符号"
|
||||||
settingGuide: "推荐配置"
|
settingGuide: "推荐配置"
|
||||||
cacheRemoteFiles: "远程文件缓存"
|
cacheRemoteFiles: "远程文件缓存"
|
||||||
cacheRemoteFilesDescription: "当禁用此设定时远程文件将直接从远程实例载入。禁用后会减小储存空间需求,但是会增加流量,因为缩略图不会被生成。"
|
cacheRemoteFilesDescription: "当禁用此设定时远程文件将直接从远程实例载入。禁用后会减小储存空间需求,但是会增加流量,因为缩略图不会被生成。"
|
||||||
flagAsBot: "这个账户是Bot"
|
flagAsBot: "这是一个机器人账号"
|
||||||
flagAsBotDescription: "如果此帐户由程序控制,请启用此项。启用后,此标志可以帮助其他开发人员防止机器人之间产生无限互动的行为,并让Misskey的内部系统将此帐户识别为机器人。"
|
flagAsBotDescription: "如果此帐户由程序控制,请启用此项。启用后,此标志可以帮助其他开发人员防止机器人之间产生无限互动的行为,并让Misskey的内部系统将此帐户识别为机器人。"
|
||||||
flagAsCat: "这个账户是Cat"
|
flagAsCat: "这个账户是一只猫"
|
||||||
flagAsCatDescription: "如果您想表明此帐户是一只猫,请打开此标志。"
|
flagAsCatDescription: "如果您想表明此帐户是一只猫,请打开此标志。\n开启后,会在您的头像上出现猫耳朵,并将你的帖子中的「na」替换为「nya」,日文同理。"
|
||||||
autoAcceptFollowed: "自动允许关注"
|
autoAcceptFollowed: "自动允许关注者的关注"
|
||||||
addAccount: "添加账户"
|
addAccount: "添加账户"
|
||||||
loginFailed: "登录失败"
|
loginFailed: "登录失败"
|
||||||
showOnRemote: "转到所在实例显示"
|
showOnRemote: "转到所在实例显示"
|
||||||
@ -172,7 +173,7 @@ software: "软件"
|
|||||||
version: "版本"
|
version: "版本"
|
||||||
metadata: "元数据"
|
metadata: "元数据"
|
||||||
withNFiles: "{n}个文件"
|
withNFiles: "{n}个文件"
|
||||||
monitor: "监视器"
|
monitor: "服务器状态"
|
||||||
jobQueue: "作业队列"
|
jobQueue: "作业队列"
|
||||||
cpuAndMemory: "CPU和内存"
|
cpuAndMemory: "CPU和内存"
|
||||||
network: "网络"
|
network: "网络"
|
||||||
@ -211,7 +212,7 @@ instanceFollowing: "关注实例"
|
|||||||
instanceFollowers: "关注实例"
|
instanceFollowers: "关注实例"
|
||||||
instanceUsers: "实例用户"
|
instanceUsers: "实例用户"
|
||||||
changePassword: "修改密码"
|
changePassword: "修改密码"
|
||||||
security: "安全性"
|
security: "安全"
|
||||||
retypedNotMatch: "两次输入不一致!"
|
retypedNotMatch: "两次输入不一致!"
|
||||||
currentPassword: "现在的密码"
|
currentPassword: "现在的密码"
|
||||||
newPassword: "新密码"
|
newPassword: "新密码"
|
||||||
@ -231,18 +232,18 @@ deleteAreYouSure: "要删掉「{x}」吗?"
|
|||||||
resetAreYouSure: "恢复默认设置?"
|
resetAreYouSure: "恢复默认设置?"
|
||||||
saved: "已保存"
|
saved: "已保存"
|
||||||
messaging: "聊天"
|
messaging: "聊天"
|
||||||
upload: "上传"
|
upload: "本地上传"
|
||||||
fromDrive: "从网盘中"
|
fromDrive: "从网盘中"
|
||||||
fromUrl: "从 URL"
|
fromUrl: "从 URL"
|
||||||
uploadFromUrl: "从网址上传"
|
uploadFromUrl: "从网址上传"
|
||||||
uploadFromUrlDescription: "要上传的文件的URL"
|
uploadFromUrlDescription: "输入文件的URL"
|
||||||
uploadFromUrlRequested: "请求上传"
|
uploadFromUrlRequested: "请求上传"
|
||||||
uploadFromUrlMayTakeTime: "上传可能需要一些时间完成。"
|
uploadFromUrlMayTakeTime: "上传可能需要一些时间完成。"
|
||||||
explore: "发现"
|
explore: "发现"
|
||||||
games: "Misskey游戏"
|
games: "Misskey游戏"
|
||||||
messageRead: "已读"
|
messageRead: "已读"
|
||||||
noMoreHistory: "没有更多的历史记录"
|
noMoreHistory: "没有更多的历史记录"
|
||||||
startMessaging: "开始聊天"
|
startMessaging: "添加聊天"
|
||||||
nUsersRead: "{n}人已读"
|
nUsersRead: "{n}人已读"
|
||||||
agreeTo: "{0}人同意"
|
agreeTo: "{0}人同意"
|
||||||
tos: "服务条款"
|
tos: "服务条款"
|
||||||
@ -260,8 +261,8 @@ themeForLightMode: "在浅色模式下使用的主题"
|
|||||||
themeForDarkMode: "在深色模式下使用的主题"
|
themeForDarkMode: "在深色模式下使用的主题"
|
||||||
light: "浅色"
|
light: "浅色"
|
||||||
dark: "深色"
|
dark: "深色"
|
||||||
lightThemes: "亮色主题"
|
lightThemes: "浅色主题"
|
||||||
darkThemes: "暗色主题"
|
darkThemes: "深色主题"
|
||||||
syncDeviceDarkMode: "将深色模式与设备设置同步"
|
syncDeviceDarkMode: "将深色模式与设备设置同步"
|
||||||
drive: "网盘"
|
drive: "网盘"
|
||||||
fileName: "文件名称"
|
fileName: "文件名称"
|
||||||
@ -275,23 +276,24 @@ createFolder: "创建文件夹"
|
|||||||
renameFolder: "重命名文件夹"
|
renameFolder: "重命名文件夹"
|
||||||
deleteFolder: "删除文件夹"
|
deleteFolder: "删除文件夹"
|
||||||
addFile: "添加文件"
|
addFile: "添加文件"
|
||||||
emptyDrive: "驱动器为空"
|
emptyDrive: "网盘中无文件"
|
||||||
emptyFolder: "空文件夹"
|
emptyFolder: "此文件夹中无文件"
|
||||||
unableToDelete: "无法删除"
|
unableToDelete: "无法删除"
|
||||||
inputNewFileName: "请输入新文件名"
|
inputNewFileName: "请输入新文件名"
|
||||||
inputNewFolderName: "请输入新文件名"
|
inputNewDescription: "请输入新标题"
|
||||||
|
inputNewFolderName: "请输入新文件夹名"
|
||||||
circularReferenceFolder: "目标文件夹是您要移动的文件夹的子文件夹。"
|
circularReferenceFolder: "目标文件夹是您要移动的文件夹的子文件夹。"
|
||||||
hasChildFilesOrFolders: "此文件夹不为空,无法删除。"
|
hasChildFilesOrFolders: "此文件夹中有文件,无法删除。"
|
||||||
copyUrl: "复制链接"
|
copyUrl: "复制链接"
|
||||||
rename: "重命名"
|
rename: "重命名"
|
||||||
avatar: "头像"
|
avatar: "头像"
|
||||||
banner: "Banner"
|
banner: "横幅"
|
||||||
nsfw: "敏感内容"
|
nsfw: "敏感内容"
|
||||||
whenServerDisconnected: "与服务器连接中断时"
|
whenServerDisconnected: "与服务器连接中断时"
|
||||||
disconnectedFromServer: "已从服务器断开连接"
|
disconnectedFromServer: "已和服务器断开连接"
|
||||||
reload: "重新加载"
|
reload: "重新加载"
|
||||||
doNothing: "什么都不做"
|
doNothing: "关闭弹窗"
|
||||||
reloadConfirm: "确定要重新加载吗"
|
reloadConfirm: "确定要重新加载吗?"
|
||||||
watch: "关注"
|
watch: "关注"
|
||||||
unwatch: "取消关注"
|
unwatch: "取消关注"
|
||||||
accept: "允许"
|
accept: "允许"
|
||||||
@ -310,8 +312,8 @@ monthX: "{month}月"
|
|||||||
yearX: "{year}年"
|
yearX: "{year}年"
|
||||||
pages: "页面"
|
pages: "页面"
|
||||||
integration: "关联"
|
integration: "关联"
|
||||||
connectSerice: "连接"
|
connectService: "连接"
|
||||||
disconnectSerice: "断开连接"
|
disconnectService: "断开连接"
|
||||||
enableLocalTimeline: "启用本地时间线功能"
|
enableLocalTimeline: "启用本地时间线功能"
|
||||||
enableGlobalTimeline: "启用全局时间线"
|
enableGlobalTimeline: "启用全局时间线"
|
||||||
disablingTimelinesInfo: "即使时间线功能被禁用,出于便利性的原因,管理员和数据图表也可以继续使用。"
|
disablingTimelinesInfo: "即使时间线功能被禁用,出于便利性的原因,管理员和数据图表也可以继续使用。"
|
||||||
@ -324,13 +326,14 @@ driveCapacityPerLocalAccount: "每个用户的网盘空间"
|
|||||||
driveCapacityPerRemoteAccount: "每个远程用户的网盘容量"
|
driveCapacityPerRemoteAccount: "每个远程用户的网盘容量"
|
||||||
inMb: "以兆字节(MegaByte)为单位"
|
inMb: "以兆字节(MegaByte)为单位"
|
||||||
iconUrl: "图标URL"
|
iconUrl: "图标URL"
|
||||||
bannerUrl: "Banner URL"
|
bannerUrl: "横幅URL"
|
||||||
|
backgroundImageUrl: "背景图URL"
|
||||||
basicInfo: "基本信息"
|
basicInfo: "基本信息"
|
||||||
pinnedUsers: "置顶用户"
|
pinnedUsers: "置顶用户"
|
||||||
pinnedUsersDescription: "在「发现」页面中使用换行标记想要置顶的用户。"
|
pinnedUsersDescription: "在「发现」页面中使用换行标记想要置顶的用户。"
|
||||||
pinnedPages: "固定页面"
|
pinnedPages: "固定页面"
|
||||||
pinnedPagesDescription: "输入您要固定到实例首页的页面路径,以换行符分隔。"
|
pinnedPagesDescription: "输入您要固定到实例首页的页面路径,以换行符分隔。"
|
||||||
pinnedClipId: "置顶的片段ID"
|
pinnedClipId: "置顶的书签ID"
|
||||||
pinnedNotes: "已置顶的帖子"
|
pinnedNotes: "已置顶的帖子"
|
||||||
hcaptcha: "hCaptcha"
|
hcaptcha: "hCaptcha"
|
||||||
enableHcaptcha: "启用 hCaptcha"
|
enableHcaptcha: "启用 hCaptcha"
|
||||||
@ -348,13 +351,13 @@ antennaSource: "接收来源"
|
|||||||
antennaKeywords: "包含关键字"
|
antennaKeywords: "包含关键字"
|
||||||
antennaExcludeKeywords: "排除关键字"
|
antennaExcludeKeywords: "排除关键字"
|
||||||
antennaKeywordsDescription: "使用空格分隔会产生AND规范,并且使用换行符分隔会产生OR规范"
|
antennaKeywordsDescription: "使用空格分隔会产生AND规范,并且使用换行符分隔会产生OR规范"
|
||||||
notifyAntenna: "通知新帖子"
|
notifyAntenna: "开启通知"
|
||||||
withFileAntenna: "仅带有附件的帖子"
|
withFileAntenna: "仅带有附件的帖子"
|
||||||
enableServiceworker: "启用ServiceWorker"
|
enableServiceworker: "启用ServiceWorker"
|
||||||
antennaUsersDescription: "指定用户名,用换行符分隔"
|
antennaUsersDescription: "指定用户名,用换行符分隔"
|
||||||
caseSensitive: "区分大小写"
|
caseSensitive: "区分大小写"
|
||||||
withReplies: "包括回复"
|
withReplies: "包括回复"
|
||||||
connectedTo: "您的账号已连到接以下社交账号"
|
connectedTo: "您的账号已连到接以下第三方账号"
|
||||||
notesAndReplies: "帖子与回复"
|
notesAndReplies: "帖子与回复"
|
||||||
withFiles: "附件"
|
withFiles: "附件"
|
||||||
silence: "禁言"
|
silence: "禁言"
|
||||||
@ -362,8 +365,8 @@ silenceConfirm: "确认要禁言吗?"
|
|||||||
unsilence: "解除禁言"
|
unsilence: "解除禁言"
|
||||||
unsilenceConfirm: "要解除禁言吗?"
|
unsilenceConfirm: "要解除禁言吗?"
|
||||||
popularUsers: "热门用户"
|
popularUsers: "热门用户"
|
||||||
recentlyUpdatedUsers: "最近投稿用户"
|
recentlyUpdatedUsers: "最近投稿的用户"
|
||||||
recentlyRegisteredUsers: "最近登录用户"
|
recentlyRegisteredUsers: "最近登录的用户"
|
||||||
recentlyDiscoveredUsers: "最近发现的用户"
|
recentlyDiscoveredUsers: "最近发现的用户"
|
||||||
exploreUsersCount: "有{count}个用户"
|
exploreUsersCount: "有{count}个用户"
|
||||||
exploreFediverse: "探索Fediverse"
|
exploreFediverse: "探索Fediverse"
|
||||||
@ -372,9 +375,9 @@ userList: "列表"
|
|||||||
about: "关于"
|
about: "关于"
|
||||||
aboutMisskey: "关于 Misskey"
|
aboutMisskey: "关于 Misskey"
|
||||||
administrator: "管理员"
|
administrator: "管理员"
|
||||||
token: "令牌"
|
token: "Token (令牌)"
|
||||||
twoStepAuthentication: "两步验证"
|
twoStepAuthentication: "两步验证"
|
||||||
moderator: "版主"
|
moderator: "监察员"
|
||||||
nUsersMentioned: "{n} 被提到"
|
nUsersMentioned: "{n} 被提到"
|
||||||
securityKey: "安全密钥"
|
securityKey: "安全密钥"
|
||||||
securityKeyName: "密钥名称"
|
securityKeyName: "密钥名称"
|
||||||
@ -416,7 +419,7 @@ noteOf: "{user}的帖子"
|
|||||||
inviteToGroup: "群组邀请"
|
inviteToGroup: "群组邀请"
|
||||||
maxNoteTextLength: "帖子的字数限制"
|
maxNoteTextLength: "帖子的字数限制"
|
||||||
quoteAttached: "已引用"
|
quoteAttached: "已引用"
|
||||||
quoteQuestion: "是否将其作为引用附上?"
|
quoteQuestion: "是否引用此链接内容?"
|
||||||
noMessagesYet: "现在没有新的聊天"
|
noMessagesYet: "现在没有新的聊天"
|
||||||
newMessageExists: "新信息"
|
newMessageExists: "新信息"
|
||||||
onlyOneFileCanBeAttached: "只能添加一个附件"
|
onlyOneFileCanBeAttached: "只能添加一个附件"
|
||||||
@ -440,9 +443,9 @@ tapSecurityKey: "轻触硬件安全密钥"
|
|||||||
or: "或者"
|
or: "或者"
|
||||||
language: "语言"
|
language: "语言"
|
||||||
uiLanguage: "显示语言"
|
uiLanguage: "显示语言"
|
||||||
groupInvited: "群组招待"
|
groupInvited: "您有新的群组邀请"
|
||||||
aboutX: "关于 {x}"
|
aboutX: "关于 {x}"
|
||||||
useOsNativeEmojis: "使用OS原生表情符号"
|
useOsNativeEmojis: "使用系统的原生表情符号"
|
||||||
youHaveNoGroups: "没有群组"
|
youHaveNoGroups: "没有群组"
|
||||||
joinOrCreateGroup: "请加入一个现有的群组,或者创建新群组。"
|
joinOrCreateGroup: "请加入一个现有的群组,或者创建新群组。"
|
||||||
noHistory: "没有历史记录"
|
noHistory: "没有历史记录"
|
||||||
@ -458,7 +461,7 @@ regenerate: "重新生成"
|
|||||||
fontSize: "字体大小"
|
fontSize: "字体大小"
|
||||||
noFollowRequests: "没有关注申请"
|
noFollowRequests: "没有关注申请"
|
||||||
openImageInNewTab: "在新标签页中打开图片"
|
openImageInNewTab: "在新标签页中打开图片"
|
||||||
dashboard: "Dashboard"
|
dashboard: "管理面板"
|
||||||
local: "本地"
|
local: "本地"
|
||||||
remote: "远程"
|
remote: "远程"
|
||||||
total: "总计"
|
total: "总计"
|
||||||
@ -490,12 +493,12 @@ objectStorageUseProxy: "使用代理"
|
|||||||
objectStorageUseProxyDesc: "如果您不使用代理进行API连接,请将其关闭。"
|
objectStorageUseProxyDesc: "如果您不使用代理进行API连接,请将其关闭。"
|
||||||
objectStorageSetPublicRead: "上传时设置为public-read"
|
objectStorageSetPublicRead: "上传时设置为public-read"
|
||||||
serverLogs: "服务器日志"
|
serverLogs: "服务器日志"
|
||||||
deleteAll: "删除全部"
|
deleteAll: "全部删除"
|
||||||
showFixedPostForm: "在时间线顶部显示帖子表单"
|
showFixedPostForm: "在时间线顶部显示发帖框"
|
||||||
newNoteRecived: "有新的帖子"
|
newNoteRecived: "有新的帖子"
|
||||||
sounds: "声音"
|
sounds: "提示音"
|
||||||
listen: "听"
|
listen: "试听"
|
||||||
none: "空"
|
none: "无"
|
||||||
showInPage: "在页面中显示"
|
showInPage: "在页面中显示"
|
||||||
popout: "弹窗"
|
popout: "弹窗"
|
||||||
volume: "音量"
|
volume: "音量"
|
||||||
@ -507,15 +510,15 @@ recentUsed: "最近使用"
|
|||||||
install: "安装"
|
install: "安装"
|
||||||
uninstall: "卸载"
|
uninstall: "卸载"
|
||||||
installedApps: "已授权的应用"
|
installedApps: "已授权的应用"
|
||||||
nothing: "没什么"
|
nothing: "没有"
|
||||||
installedDate: "授权日期"
|
installedDate: "授权日期"
|
||||||
lastUsedDate: "最近使用"
|
lastUsedDate: "最近使用"
|
||||||
state: "状态"
|
state: "状态"
|
||||||
sort: "排序"
|
sort: "排序"
|
||||||
ascendingOrder: "升序"
|
ascendingOrder: "升序"
|
||||||
descendingOrder: "降序"
|
descendingOrder: "降序"
|
||||||
scratchpad: "便签本"
|
scratchpad: "AiScript控制台"
|
||||||
scratchpadDescription: "便签本为AiScript提供了实验环境。您可以编写代码以与Misskey交互,运行它并查看结果。"
|
scratchpadDescription: "AiScript控制台为AiScript提供了实验环境。您可以编写代码以与Misskey交互,运行它并查看结果。"
|
||||||
output: "输出"
|
output: "输出"
|
||||||
script: "脚本"
|
script: "脚本"
|
||||||
disablePagesScript: "禁用页面脚本"
|
disablePagesScript: "禁用页面脚本"
|
||||||
@ -526,7 +529,7 @@ removeAllFollowing: "取消所有关注"
|
|||||||
removeAllFollowingDescription: "取消{host}的所有关注者。当实例不存在时执行。"
|
removeAllFollowingDescription: "取消{host}的所有关注者。当实例不存在时执行。"
|
||||||
userSuspended: "该用户已被冻结。"
|
userSuspended: "该用户已被冻结。"
|
||||||
userSilenced: "该用户已被禁言。"
|
userSilenced: "该用户已被禁言。"
|
||||||
sidebar: "侧边栏"
|
menu: "菜单"
|
||||||
divider: "分割线"
|
divider: "分割线"
|
||||||
addItem: "添加项目"
|
addItem: "添加项目"
|
||||||
rooms: "房间"
|
rooms: "房间"
|
||||||
@ -543,9 +546,11 @@ poll: "调查问卷"
|
|||||||
useCw: "隐藏内容"
|
useCw: "隐藏内容"
|
||||||
enablePlayer: "打开播放器"
|
enablePlayer: "打开播放器"
|
||||||
disablePlayer: "关闭播放器"
|
disablePlayer: "关闭播放器"
|
||||||
expandTweet: "展开贴文"
|
expandTweet: "展开帖子"
|
||||||
themeEditor: "主题编辑器"
|
themeEditor: "主题编辑器"
|
||||||
description: "描述"
|
description: "描述"
|
||||||
|
describeFile: "添加标题"
|
||||||
|
enterFileDescription: "输入标题"
|
||||||
author: "作者"
|
author: "作者"
|
||||||
leaveConfirm: "存在未保存的更改。要放弃更改吗?"
|
leaveConfirm: "存在未保存的更改。要放弃更改吗?"
|
||||||
manage: "管理"
|
manage: "管理"
|
||||||
@ -587,10 +592,10 @@ userSaysSomething: "{name}说了什么"
|
|||||||
makeActive: "启用"
|
makeActive: "启用"
|
||||||
display: "显示"
|
display: "显示"
|
||||||
copy: "复制"
|
copy: "复制"
|
||||||
metrics: "指标"
|
metrics: "服务器监控"
|
||||||
overview: "概述"
|
overview: "服务器概况"
|
||||||
logs: "日志"
|
logs: "日志"
|
||||||
delayed: "延迟"
|
delayed: "滞后"
|
||||||
database: "数据库"
|
database: "数据库"
|
||||||
channel: "频道"
|
channel: "频道"
|
||||||
create: "创建"
|
create: "创建"
|
||||||
@ -623,17 +628,17 @@ random: "随机"
|
|||||||
system: "系统"
|
system: "系统"
|
||||||
switchUi: "切换界面"
|
switchUi: "切换界面"
|
||||||
desktop: "桌面"
|
desktop: "桌面"
|
||||||
clip: "片段"
|
clip: "书签"
|
||||||
createNew: "新建"
|
createNew: "新建"
|
||||||
optional: "可选"
|
optional: "可选"
|
||||||
createNewClip: "新建片段"
|
createNewClip: "新建书签"
|
||||||
public: "公开"
|
public: "公开"
|
||||||
i18nInfo: "Misskey已经被志愿者们翻译到了各种语言。如果你也有兴趣,可以通过{link}帮助翻译。"
|
i18nInfo: "Misskey已经被志愿者们翻译到了各种语言。如果你也有兴趣,可以通过{link}帮助翻译。"
|
||||||
manageAccessTokens: "管理 Access Tokens"
|
manageAccessTokens: "管理 Access Tokens"
|
||||||
accountInfo: "帐户信息"
|
accountInfo: "帐户信息"
|
||||||
notesCount: "贴文数量"
|
notesCount: "帖子数量"
|
||||||
repliesCount: "回复数量"
|
repliesCount: "回复数量"
|
||||||
renotesCount: "转贴数量"
|
renotesCount: "转帖数量"
|
||||||
repliedCount: "回复数"
|
repliedCount: "回复数"
|
||||||
renotedCount: "转发数"
|
renotedCount: "转发数"
|
||||||
followingCount: "正在关注数量"
|
followingCount: "正在关注数量"
|
||||||
@ -644,9 +649,9 @@ pollVotesCount: "问卷调查的投票数"
|
|||||||
pollVotedCount: "问卷调查的被投票数"
|
pollVotedCount: "问卷调查的被投票数"
|
||||||
yes: "是"
|
yes: "是"
|
||||||
no: "否"
|
no: "否"
|
||||||
driveFilesCount: "磁盘文件数"
|
driveFilesCount: "网盘的文件数"
|
||||||
driveUsage: "磁盘空间用量"
|
driveUsage: "网盘的空间用量"
|
||||||
noCrawle: "拒绝搜索器的索引"
|
noCrawle: "拒绝搜索引擎的索引"
|
||||||
noCrawleDescription: "要求搜索引擎不要收录(索引)您的用户页面,帖子,页面等。"
|
noCrawleDescription: "要求搜索引擎不要收录(索引)您的用户页面,帖子,页面等。"
|
||||||
lockedAccountInfo: "即使通过了关注请求,只要您不将帖子可见范围设置成“关注者”,任何人都可以看到您的帖子。"
|
lockedAccountInfo: "即使通过了关注请求,只要您不将帖子可见范围设置成“关注者”,任何人都可以看到您的帖子。"
|
||||||
alwaysMarkSensitive: "默认将媒体文件标记为敏感内容"
|
alwaysMarkSensitive: "默认将媒体文件标记为敏感内容"
|
||||||
@ -661,7 +666,7 @@ pageLikedCount: "页面被点赞次数"
|
|||||||
reversiCount: "黑白棋对战次数"
|
reversiCount: "黑白棋对战次数"
|
||||||
contact: "联系人"
|
contact: "联系人"
|
||||||
useSystemFont: "使用系统默认字体"
|
useSystemFont: "使用系统默认字体"
|
||||||
clips: "片段"
|
clips: "书签"
|
||||||
experimentalFeatures: "实验性功能"
|
experimentalFeatures: "实验性功能"
|
||||||
developer: "开发者"
|
developer: "开发者"
|
||||||
makeExplorable: "使账号可见。"
|
makeExplorable: "使账号可见。"
|
||||||
@ -693,7 +698,7 @@ saveConfirm: "确定保存?"
|
|||||||
deleteConfirm: "确定删除?"
|
deleteConfirm: "确定删除?"
|
||||||
invalidValue: "无效值。"
|
invalidValue: "无效值。"
|
||||||
registry: "注册表"
|
registry: "注册表"
|
||||||
closeAccount: "关闭账户"
|
closeAccount: "永久注销账户"
|
||||||
currentVersion: "当前版本"
|
currentVersion: "当前版本"
|
||||||
latestVersion: "最新版本"
|
latestVersion: "最新版本"
|
||||||
youAreRunningUpToDateClient: "您所使用的客户端已经是最新的。"
|
youAreRunningUpToDateClient: "您所使用的客户端已经是最新的。"
|
||||||
@ -757,13 +762,35 @@ middle: "中"
|
|||||||
low: "低"
|
low: "低"
|
||||||
emailNotConfiguredWarning: "电子邮件地址未设置。"
|
emailNotConfiguredWarning: "电子邮件地址未设置。"
|
||||||
ratio: "比率"
|
ratio: "比率"
|
||||||
|
customCss: "自定义 CSS"
|
||||||
|
customCssWarn: "这些设置必须有相关的基础知识,不当的配置可能导致客户端无法正常使用!"
|
||||||
|
global: "全局"
|
||||||
|
squareAvatars: "显示方形头像图标"
|
||||||
|
sent: "发送"
|
||||||
|
received: "收取"
|
||||||
|
searchResult: "搜索结果"
|
||||||
|
hashtags: "话题标签"
|
||||||
|
troubleshooting: "故障排除"
|
||||||
|
useBlurEffect: "在UI上使用模糊效果"
|
||||||
|
learnMore: "更多信息"
|
||||||
|
misskeyUpdated: "Misskey更新完成!"
|
||||||
|
whatIsNew: "显示更新信息"
|
||||||
|
translate: "翻译"
|
||||||
|
translatedFrom: "从 {x} 翻译"
|
||||||
|
_docs:
|
||||||
|
continueReading: "继续阅读"
|
||||||
|
features: "特性"
|
||||||
|
generalTopics: "通常提示"
|
||||||
|
advancedTopics: "进阶提示"
|
||||||
|
admin: "管理"
|
||||||
|
translateWarn: "本文档是翻译后的文档。内容可能与原文有所不同。"
|
||||||
_ad:
|
_ad:
|
||||||
back: "返回"
|
back: "返回"
|
||||||
reduceFrequencyOfThisAd: "减少此广告的频率"
|
reduceFrequencyOfThisAd: "减少此广告的频率"
|
||||||
_forgotPassword:
|
_forgotPassword:
|
||||||
enterEmail: "请输入您用来注册帐户的电子邮件地址。密码重置链接将发送到该地址。"
|
enterEmail: "请输入您验证账号时用的电子邮箱地址,密码重置链接将发送至该邮箱上。"
|
||||||
ifNoEmail: "如果您没有使用电子邮件地址注册,请联系管理员。"
|
ifNoEmail: "如果您没有使用电子邮件地址进行验证,请联系管理员。"
|
||||||
contactAdmin: "该实例不支持电子邮件。如果您想重设密码,请联系管理员。"
|
contactAdmin: "该实例不支持发送电子邮件。如果您想重设密码,请联系管理员。"
|
||||||
_gallery:
|
_gallery:
|
||||||
my: "我的图库"
|
my: "我的图库"
|
||||||
liked: "喜欢的图片"
|
liked: "喜欢的图片"
|
||||||
@ -773,7 +800,7 @@ _email:
|
|||||||
_follow:
|
_follow:
|
||||||
title: "你有新的关注者"
|
title: "你有新的关注者"
|
||||||
_receiveFollowRequest:
|
_receiveFollowRequest:
|
||||||
title: "收到关注请求"
|
title: "收到了关注请求"
|
||||||
_plugin:
|
_plugin:
|
||||||
install: "安装插件"
|
install: "安装插件"
|
||||||
installWarn: "请不要安装不可信的插件。"
|
installWarn: "请不要安装不可信的插件。"
|
||||||
@ -855,6 +882,8 @@ _mfm:
|
|||||||
blurDescription: "产生模糊效果。将鼠标指针放在上面即可将内容显示出来。"
|
blurDescription: "产生模糊效果。将鼠标指针放在上面即可将内容显示出来。"
|
||||||
font: "字体"
|
font: "字体"
|
||||||
fontDescription: "可以设置内容所使用的字体。"
|
fontDescription: "可以设置内容所使用的字体。"
|
||||||
|
rainbow: "彩虹"
|
||||||
|
rainbowDescription: "用彩虹色来显示内容。"
|
||||||
_reversi:
|
_reversi:
|
||||||
reversi: "黑白棋"
|
reversi: "黑白棋"
|
||||||
gameSettings: "对局设置"
|
gameSettings: "对局设置"
|
||||||
@ -906,19 +935,20 @@ _channel:
|
|||||||
following: "正在关注"
|
following: "正在关注"
|
||||||
usersCount: "有{n}人参与"
|
usersCount: "有{n}人参与"
|
||||||
notesCount: "有{n}个帖子"
|
notesCount: "有{n}个帖子"
|
||||||
_sidebar:
|
_menuDisplay:
|
||||||
full: "全部"
|
sideFull: "横向"
|
||||||
icon: "图标"
|
sideIcon: "横向(图标)"
|
||||||
|
top: "顶部"
|
||||||
hide: "隐藏"
|
hide: "隐藏"
|
||||||
_wordMute:
|
_wordMute:
|
||||||
muteWords: "禁用词"
|
muteWords: "禁用词"
|
||||||
muteWordsDescription: "使用空格分隔表示AND逻辑,使用换行符分隔表示OR逻辑。"
|
muteWordsDescription: "使用空格分隔表示AND逻辑,使用换行符分隔表示OR逻辑。"
|
||||||
muteWordsDescription2: "将关键字用斜线括起来表示正则表达式。"
|
muteWordsDescription2: "将关键字用斜线括起来表示正则表达式。"
|
||||||
softDescription: "隐藏时间线中指定条件的帖文。"
|
softDescription: "隐藏时间线中指定条件的帖子。"
|
||||||
hardDescription: "防止将具有指定条件的帖文添加到时间线。 即使您更改条件,未添加的帖文也会被排除在外。"
|
hardDescription: "防止将具有指定条件的帖子添加到时间线。 即使您更改条件,未添加的帖文也会被排除在外。"
|
||||||
soft: "软屏蔽"
|
soft: "软屏蔽"
|
||||||
hard: "硬屏蔽"
|
hard: "硬屏蔽"
|
||||||
mutedNotes: "被屏蔽的帖文"
|
mutedNotes: "被屏蔽的帖子"
|
||||||
_theme:
|
_theme:
|
||||||
explore: "寻找主题"
|
explore: "寻找主题"
|
||||||
install: "安装主题"
|
install: "安装主题"
|
||||||
@ -944,8 +974,8 @@ _theme:
|
|||||||
argument: "参数"
|
argument: "参数"
|
||||||
basedProp: "基于的属性名称"
|
basedProp: "基于的属性名称"
|
||||||
alpha: "不透明度"
|
alpha: "不透明度"
|
||||||
darken: "暗色"
|
darken: "深色"
|
||||||
lighten: "亮色"
|
lighten: "浅色"
|
||||||
inputConstantName: "请输入常量名称"
|
inputConstantName: "请输入常量名称"
|
||||||
importInfo: "您可以在此处粘贴主题代码,将其导入到编辑器中"
|
importInfo: "您可以在此处粘贴主题代码,将其导入到编辑器中"
|
||||||
deleteConstantConfirm: "确定要删除常量{const}吗?"
|
deleteConstantConfirm: "确定要删除常量{const}吗?"
|
||||||
@ -980,18 +1010,18 @@ _theme:
|
|||||||
cwBg: "CW 按钮背景"
|
cwBg: "CW 按钮背景"
|
||||||
cwFg: "CW 按钮文本"
|
cwFg: "CW 按钮文本"
|
||||||
cwHoverBg: "CW 按钮背景(悬停)"
|
cwHoverBg: "CW 按钮背景(悬停)"
|
||||||
toastBg: "吐司通知背景"
|
toastBg: "Toast通知背景"
|
||||||
toastFg: "吐司通知文本"
|
toastFg: "Toast通知文本"
|
||||||
buttonBg: "按钮背景"
|
buttonBg: "按钮背景"
|
||||||
buttonHoverBg: "按钮背景(悬停)"
|
buttonHoverBg: "按钮背景(悬停)"
|
||||||
inputBorder: "输入框边框"
|
inputBorder: "输入框边框"
|
||||||
listItemHoverBg: "下拉列表项目背景(悬停)"
|
listItemHoverBg: "下拉列表项目背景(悬停)"
|
||||||
driveFolderBg: "驱动器文件夹背景"
|
driveFolderBg: "网盘的文件夹背景"
|
||||||
wallpaperOverlay: "壁纸叠加层"
|
wallpaperOverlay: "壁纸叠加层"
|
||||||
badge: "徽章"
|
badge: "徽章"
|
||||||
messageBg: "聊天背景"
|
messageBg: "聊天背景"
|
||||||
accentDarken: "强调色(暗)"
|
accentDarken: "强调色(深)"
|
||||||
accentLighten: "强调色(亮)"
|
accentLighten: "强调色(浅)"
|
||||||
fgHighlighted: "高亮显示文本"
|
fgHighlighted: "高亮显示文本"
|
||||||
_sfx:
|
_sfx:
|
||||||
note: "帖子"
|
note: "帖子"
|
||||||
@ -1090,9 +1120,9 @@ _auth:
|
|||||||
_antennaSources:
|
_antennaSources:
|
||||||
all: "所有帖子"
|
all: "所有帖子"
|
||||||
homeTimeline: "已关注用户的帖子"
|
homeTimeline: "已关注用户的帖子"
|
||||||
users: "来自特定用户的帖子"
|
users: "来自指定用户的帖子"
|
||||||
userList: "来自特定清单中的帖子"
|
userList: "来自指定列表中的帖子"
|
||||||
userGroup: "来自特定组中用户的帖子"
|
userGroup: "来自指定群组中用户的帖子"
|
||||||
_weekday:
|
_weekday:
|
||||||
sunday: "星期日"
|
sunday: "星期日"
|
||||||
monday: "星期一"
|
monday: "星期一"
|
||||||
@ -1118,7 +1148,7 @@ _widgets:
|
|||||||
button: "按钮"
|
button: "按钮"
|
||||||
onlineUsers: "在线用户"
|
onlineUsers: "在线用户"
|
||||||
jobQueue: "作业队列"
|
jobQueue: "作业队列"
|
||||||
serverMetric: "服务器指标"
|
serverMetric: "服务器监控"
|
||||||
aiscript: "AiScript控制台"
|
aiscript: "AiScript控制台"
|
||||||
_cw:
|
_cw:
|
||||||
hide: "隐藏"
|
hide: "隐藏"
|
||||||
@ -1131,7 +1161,7 @@ _poll:
|
|||||||
noMore: "无法再添加更多了"
|
noMore: "无法再添加更多了"
|
||||||
canMultipleVote: "允许多个投票"
|
canMultipleVote: "允许多个投票"
|
||||||
expiration: "截止时间"
|
expiration: "截止时间"
|
||||||
infinite: "无限期"
|
infinite: "不限时间"
|
||||||
at: "指定日期"
|
at: "指定日期"
|
||||||
after: "指定时间"
|
after: "指定时间"
|
||||||
deadlineDate: "截止日期"
|
deadlineDate: "截止日期"
|
||||||
@ -1170,7 +1200,7 @@ _postForm:
|
|||||||
e: "请写下来吧"
|
e: "请写下来吧"
|
||||||
f: "等待您的发布..."
|
f: "等待您的发布..."
|
||||||
_profile:
|
_profile:
|
||||||
name: "名称"
|
name: "昵称"
|
||||||
username: "用户名"
|
username: "用户名"
|
||||||
description: "个人简介"
|
description: "个人简介"
|
||||||
youCanIncludeHashtags: "您可以包含一个哈希标签。"
|
youCanIncludeHashtags: "您可以包含一个哈希标签。"
|
||||||
@ -1283,7 +1313,7 @@ _rooms:
|
|||||||
_pages:
|
_pages:
|
||||||
newPage: "创建页面"
|
newPage: "创建页面"
|
||||||
editPage: "编辑页面"
|
editPage: "编辑页面"
|
||||||
readPage: "查看源"
|
readPage: "查看页面"
|
||||||
created: "页面已创建"
|
created: "页面已创建"
|
||||||
updated: "页面已更新"
|
updated: "页面已更新"
|
||||||
deleted: "该页面已被删除"
|
deleted: "该页面已被删除"
|
||||||
@ -1596,7 +1626,7 @@ _notification:
|
|||||||
reaction: "回应"
|
reaction: "回应"
|
||||||
pollVote: "问卷调查被投票"
|
pollVote: "问卷调查被投票"
|
||||||
receiveFollowRequest: "收到关注请求"
|
receiveFollowRequest: "收到关注请求"
|
||||||
followRequestAccepted: "关注请求已接受"
|
followRequestAccepted: "关注请求已通过"
|
||||||
groupInvited: "加入群组邀请"
|
groupInvited: "加入群组邀请"
|
||||||
app: "关联应用的通知"
|
app: "关联应用的通知"
|
||||||
_deck:
|
_deck:
|
||||||
|
@ -1,19 +1,20 @@
|
|||||||
---
|
---
|
||||||
_lang_: "繁體中文"
|
_lang_: "繁體中文"
|
||||||
headlineMisskey: "貼文連繫網絡"
|
headlineMisskey: "貼文連繫網路"
|
||||||
introMisskey: "歡迎! Misskey是一個開源且去中心化的社群網絡。\n通過「貼文」分享周邊新鮮事,並告訴其他人您的想法!📡\n透過「情感」功能,對大家的貼文表達情感!👍\n一起來探索這個新的世界吧!🚀"
|
introMisskey: "歡迎! Misskey是一個開放原始碼且去中心化的社群網路。\n透過「貼文」分享周邊新鮮事,並告訴其他人您的想法!📡\n透過「情感」功能,對大家的貼文表達情感!👍\n一起來探索這個新的世界吧!🚀"
|
||||||
monthAndDay: "{month}月 {day}日"
|
monthAndDay: "{month}月 {day}日"
|
||||||
search: "搜尋"
|
search: "搜尋"
|
||||||
notifications: "通知"
|
notifications: "通知"
|
||||||
username: "使用者名稱"
|
username: "使用者名稱"
|
||||||
password: "密碼"
|
password: "密碼"
|
||||||
|
forgotPassword: "忘記密碼"
|
||||||
fetchingAsApObject: "從聯邦宇宙取得中..."
|
fetchingAsApObject: "從聯邦宇宙取得中..."
|
||||||
ok: "OK"
|
ok: "OK"
|
||||||
gotIt: "知道了"
|
gotIt: "知道了"
|
||||||
cancel: "取消"
|
cancel: "取消"
|
||||||
enterUsername: "輸入使用者名稱"
|
enterUsername: "輸入使用者名稱"
|
||||||
renotedBy: "{user} 轉發了"
|
renotedBy: "{user} 轉傳了"
|
||||||
noNotes: "貼文不可用。"
|
noNotes: "無貼文。"
|
||||||
noNotifications: "沒有通知"
|
noNotifications: "沒有通知"
|
||||||
instance: "實例"
|
instance: "實例"
|
||||||
settings: "設定"
|
settings: "設定"
|
||||||
@ -46,8 +47,8 @@ deleteAndEdit: "刪除並編輯"
|
|||||||
deleteAndEditConfirm: "要刪除並再次編輯嗎?此貼文的所有情感、轉發和回覆也將會消失。"
|
deleteAndEditConfirm: "要刪除並再次編輯嗎?此貼文的所有情感、轉發和回覆也將會消失。"
|
||||||
addToList: "加入至清單"
|
addToList: "加入至清單"
|
||||||
sendMessage: "發送訊息"
|
sendMessage: "發送訊息"
|
||||||
copyUsername: "複製用戶名"
|
copyUsername: "複製使用者名稱"
|
||||||
searchUser: "搜尋用戶"
|
searchUser: "搜尋使用者"
|
||||||
reply: "回覆"
|
reply: "回覆"
|
||||||
loadMore: "載入更多"
|
loadMore: "載入更多"
|
||||||
showMore: "載入更多"
|
showMore: "載入更多"
|
||||||
@ -92,9 +93,9 @@ followRequestPending: "追隨許可批准中"
|
|||||||
enterEmoji: "輸入表情符號"
|
enterEmoji: "輸入表情符號"
|
||||||
renote: "轉發"
|
renote: "轉發"
|
||||||
unrenote: "取消轉發"
|
unrenote: "取消轉發"
|
||||||
renoted: "轉發成功"
|
renoted: "轉傳成功"
|
||||||
cantRenote: "無法轉發此貼文。"
|
cantRenote: "無法轉發此貼文。"
|
||||||
cantReRenote: "無法轉發之前已經轉發過的內容。"
|
cantReRenote: "無法轉傳之前已經轉傳過的內容。"
|
||||||
quote: "引用"
|
quote: "引用"
|
||||||
pinnedNote: "已置頂的貼文"
|
pinnedNote: "已置頂的貼文"
|
||||||
pinned: "置頂"
|
pinned: "置頂"
|
||||||
@ -127,6 +128,7 @@ editWidgets: "編輯小工具"
|
|||||||
editWidgetsExit: "完成"
|
editWidgetsExit: "完成"
|
||||||
customEmojis: "自訂表情符號"
|
customEmojis: "自訂表情符號"
|
||||||
emoji: "表情符號"
|
emoji: "表情符號"
|
||||||
|
emojis: "表情符號"
|
||||||
emojiName: "表情符號名稱"
|
emojiName: "表情符號名稱"
|
||||||
emojiUrl: "表情符號URL"
|
emojiUrl: "表情符號URL"
|
||||||
addEmoji: "加入表情符號"
|
addEmoji: "加入表情符號"
|
||||||
@ -278,6 +280,7 @@ emptyDrive: "雲端硬碟為空"
|
|||||||
emptyFolder: "資料夾為空"
|
emptyFolder: "資料夾為空"
|
||||||
unableToDelete: "無法刪除"
|
unableToDelete: "無法刪除"
|
||||||
inputNewFileName: "輸入檔案名稱"
|
inputNewFileName: "輸入檔案名稱"
|
||||||
|
inputNewDescription: "請輸入新標題 "
|
||||||
inputNewFolderName: "輸入新資料夾的名稱"
|
inputNewFolderName: "輸入新資料夾的名稱"
|
||||||
circularReferenceFolder: "目標文件夾是您要移動的文件夾的子文件夾。"
|
circularReferenceFolder: "目標文件夾是您要移動的文件夾的子文件夾。"
|
||||||
hasChildFilesOrFolders: "此文件夾不是空的,無法刪除。"
|
hasChildFilesOrFolders: "此文件夾不是空的,無法刪除。"
|
||||||
@ -309,8 +312,8 @@ monthX: "{month}月"
|
|||||||
yearX: "{year}年"
|
yearX: "{year}年"
|
||||||
pages: "頁面"
|
pages: "頁面"
|
||||||
integration: "整合"
|
integration: "整合"
|
||||||
connectSerice: "連線"
|
connectService: "己連結"
|
||||||
disconnectSerice: "中斷連線"
|
disconnectService: "己斷開 "
|
||||||
enableLocalTimeline: "開啟本地時間軸"
|
enableLocalTimeline: "開啟本地時間軸"
|
||||||
enableGlobalTimeline: "啟用公開時間軸"
|
enableGlobalTimeline: "啟用公開時間軸"
|
||||||
disablingTimelinesInfo: "即使您關閉了時間線功能,管理員和協調人仍可以繼續使用,以方便您。"
|
disablingTimelinesInfo: "即使您關閉了時間線功能,管理員和協調人仍可以繼續使用,以方便您。"
|
||||||
@ -324,6 +327,7 @@ driveCapacityPerRemoteAccount: "每個非本地用戶的雲端容量"
|
|||||||
inMb: "以Mbps為單位"
|
inMb: "以Mbps為單位"
|
||||||
iconUrl: "圖像URL"
|
iconUrl: "圖像URL"
|
||||||
bannerUrl: "橫幅圖像URL"
|
bannerUrl: "橫幅圖像URL"
|
||||||
|
backgroundImageUrl: "背景圖片的來源網址 "
|
||||||
basicInfo: "基本資訊"
|
basicInfo: "基本資訊"
|
||||||
pinnedUsers: "置頂用戶"
|
pinnedUsers: "置頂用戶"
|
||||||
pinnedUsersDescription: "在「發現」頁面中使用換行標記想要置頂的使用者。"
|
pinnedUsersDescription: "在「發現」頁面中使用換行標記想要置頂的使用者。"
|
||||||
@ -475,7 +479,9 @@ objectStorage: "Object Storage (物件儲存)"
|
|||||||
useObjectStorage: "使用Object Storage"
|
useObjectStorage: "使用Object Storage"
|
||||||
objectStorageBaseUrl: "Base URL"
|
objectStorageBaseUrl: "Base URL"
|
||||||
objectStorageBucket: "儲存空間(Bucket)"
|
objectStorageBucket: "儲存空間(Bucket)"
|
||||||
|
objectStorageBucketDesc: "請指定您正在使用的服務的存儲桶名稱。 "
|
||||||
objectStoragePrefix: "前綴"
|
objectStoragePrefix: "前綴"
|
||||||
|
objectStoragePrefixDesc: "它存儲在此前綴目錄下。"
|
||||||
objectStorageEndpoint: "端點(Endpoint)"
|
objectStorageEndpoint: "端點(Endpoint)"
|
||||||
objectStorageEndpointDesc: "如要使用AWS S3,請留空。否則請依照你使用的服務商的說明書進行設定,以'<host>'或 '<host>:<port>'的形式設定端點(Endpoint)。"
|
objectStorageEndpointDesc: "如要使用AWS S3,請留空。否則請依照你使用的服務商的說明書進行設定,以'<host>'或 '<host>:<port>'的形式設定端點(Endpoint)。"
|
||||||
objectStorageRegion: "地域(Region)"
|
objectStorageRegion: "地域(Region)"
|
||||||
@ -518,7 +524,6 @@ removeAllFollowing: "解除所有追蹤"
|
|||||||
removeAllFollowingDescription: "解除{host}所有的追蹤。在實例不再存在時執行。"
|
removeAllFollowingDescription: "解除{host}所有的追蹤。在實例不再存在時執行。"
|
||||||
userSuspended: "該使用者已被停用"
|
userSuspended: "該使用者已被停用"
|
||||||
userSilenced: "該用戶已被禁言。"
|
userSilenced: "該用戶已被禁言。"
|
||||||
sidebar: "側邊列"
|
|
||||||
divider: "分割線"
|
divider: "分割線"
|
||||||
addItem: "新增項目"
|
addItem: "新增項目"
|
||||||
rooms: "房間"
|
rooms: "房間"
|
||||||
@ -538,6 +543,8 @@ disablePlayer: "關閉播放器"
|
|||||||
expandTweet: "展開推文"
|
expandTweet: "展開推文"
|
||||||
themeEditor: "主題編輯器"
|
themeEditor: "主題編輯器"
|
||||||
description: "描述"
|
description: "描述"
|
||||||
|
describeFile: "添加標題 "
|
||||||
|
enterFileDescription: "輸入標題 "
|
||||||
author: "作者"
|
author: "作者"
|
||||||
leaveConfirm: "有未保存的更改。要放棄嗎?"
|
leaveConfirm: "有未保存的更改。要放棄嗎?"
|
||||||
manage: "管理"
|
manage: "管理"
|
||||||
@ -731,11 +738,35 @@ switch: "切換"
|
|||||||
noMaintainerInformationWarning: "尚未設定管理員信息。"
|
noMaintainerInformationWarning: "尚未設定管理員信息。"
|
||||||
noBotProtectionWarning: "尚未設定Bot防護。"
|
noBotProtectionWarning: "尚未設定Bot防護。"
|
||||||
configure: "設定"
|
configure: "設定"
|
||||||
|
postToGallery: "發佈到相簿"
|
||||||
|
gallery: "相簿"
|
||||||
|
recentPosts: "最新貼文"
|
||||||
|
popularPosts: "熱門的貼文"
|
||||||
|
ads: "廣告"
|
||||||
expiration: "期限"
|
expiration: "期限"
|
||||||
|
memo: "備忘錄"
|
||||||
|
priority: "優先級"
|
||||||
|
high: "高"
|
||||||
middle: "中"
|
middle: "中"
|
||||||
|
low: "低"
|
||||||
|
emailNotConfiguredWarning: "沒有設定電子郵件地址"
|
||||||
|
ratio: "%"
|
||||||
|
global: "公開"
|
||||||
|
sent: "發送"
|
||||||
|
hashtags: "#tag"
|
||||||
|
_docs:
|
||||||
|
admin: "管理"
|
||||||
_ad:
|
_ad:
|
||||||
back: "返回"
|
back: "返回"
|
||||||
|
reduceFrequencyOfThisAd: "降低此廣告的頻率 "
|
||||||
|
_forgotPassword:
|
||||||
|
enterEmail: "請輸入您的帳戶註冊的電子郵件地址。 密碼重置連結將被發送到該電子郵件地址。"
|
||||||
|
ifNoEmail: "如果您還沒有註冊您的電子郵件地址,請聯繫管理員。 "
|
||||||
|
contactAdmin: "此實例不支持電子郵件,請聯繫您的管理員重置您的密碼。 "
|
||||||
_gallery:
|
_gallery:
|
||||||
|
my: "我的貼文"
|
||||||
|
liked: "喜歡的貼文"
|
||||||
|
like: "讚"
|
||||||
unlike: "收回喜歡"
|
unlike: "收回喜歡"
|
||||||
_email:
|
_email:
|
||||||
_follow:
|
_follow:
|
||||||
@ -776,6 +807,7 @@ _mfm:
|
|||||||
url: "URL"
|
url: "URL"
|
||||||
urlDescription: "可以展示URL位址。"
|
urlDescription: "可以展示URL位址。"
|
||||||
link: "鏈接"
|
link: "鏈接"
|
||||||
|
linkDescription: "您可以將特定範圍的文章與 URL 相關聯。 "
|
||||||
bold: "粗體"
|
bold: "粗體"
|
||||||
small: "縮小"
|
small: "縮小"
|
||||||
center: "置中"
|
center: "置中"
|
||||||
@ -786,7 +818,9 @@ _mfm:
|
|||||||
blockMath: "數學公式(方塊)"
|
blockMath: "數學公式(方塊)"
|
||||||
quote: "引用"
|
quote: "引用"
|
||||||
emoji: "自訂表情符號"
|
emoji: "自訂表情符號"
|
||||||
|
emojiDescription: "您可以通過將自定義表情符號名稱括在冒號中來顯示自定義表情符號。 "
|
||||||
search: "搜尋"
|
search: "搜尋"
|
||||||
|
searchDescription: "您可以顯示所輸入的搜索框。"
|
||||||
flip: "翻轉"
|
flip: "翻轉"
|
||||||
flipDescription: "將內容上下或左右翻轉。"
|
flipDescription: "將內容上下或左右翻轉。"
|
||||||
jelly: "動畫(果凍)"
|
jelly: "動畫(果凍)"
|
||||||
@ -855,9 +889,7 @@ _channel:
|
|||||||
following: "關注中"
|
following: "關注中"
|
||||||
usersCount: "有{n}人參與"
|
usersCount: "有{n}人參與"
|
||||||
notesCount: "有{n}個貼文"
|
notesCount: "有{n}個貼文"
|
||||||
_sidebar:
|
_menuDisplay:
|
||||||
full: "全部"
|
|
||||||
icon: "大頭貼"
|
|
||||||
hide: "隱藏"
|
hide: "隱藏"
|
||||||
_wordMute:
|
_wordMute:
|
||||||
muteWords: "加入靜音文字"
|
muteWords: "加入靜音文字"
|
||||||
@ -879,17 +911,27 @@ _theme:
|
|||||||
constant: "常數"
|
constant: "常數"
|
||||||
defaultValue: "預設值"
|
defaultValue: "預設值"
|
||||||
color: "顏色"
|
color: "顏色"
|
||||||
|
refProp: "查看屬性 "
|
||||||
|
key: "按鍵"
|
||||||
func: "函数"
|
func: "函数"
|
||||||
funcKind: "功能類型"
|
funcKind: "功能類型"
|
||||||
argument: "參數"
|
argument: "參數"
|
||||||
|
basedProp: "要基於的屬性的名稱 "
|
||||||
alpha: "透明度"
|
alpha: "透明度"
|
||||||
darken: "暗度"
|
darken: "暗度"
|
||||||
lighten: "亮度"
|
lighten: "亮度"
|
||||||
keys:
|
keys:
|
||||||
|
accent: "重點色彩"
|
||||||
bg: "背景"
|
bg: "背景"
|
||||||
fg: "文本"
|
fg: "文本"
|
||||||
|
focus: "聚焦"
|
||||||
|
indicator: "指標"
|
||||||
panel: "面板"
|
panel: "面板"
|
||||||
shadow: "陰影"
|
shadow: "陰影"
|
||||||
|
header: "標題"
|
||||||
|
navBg: "側邊欄的背景 "
|
||||||
|
navFg: "側邊欄的文字"
|
||||||
|
navHoverFg: "側邊欄文字(懸停) "
|
||||||
navActive: "側邊欄文本 (活動)"
|
navActive: "側邊欄文本 (活動)"
|
||||||
navIndicator: "側邊欄指示符"
|
navIndicator: "側邊欄指示符"
|
||||||
link: "鏈接"
|
link: "鏈接"
|
||||||
@ -971,6 +1013,7 @@ _tutorial:
|
|||||||
_2fa:
|
_2fa:
|
||||||
alreadyRegistered: "此設備已經被註冊過了"
|
alreadyRegistered: "此設備已經被註冊過了"
|
||||||
registerDevice: "註冊裝置"
|
registerDevice: "註冊裝置"
|
||||||
|
registerKey: "註冊鍵"
|
||||||
step1: "首先,在您的設備上安裝二步驗證程式,例如{a}或{b}。"
|
step1: "首先,在您的設備上安裝二步驗證程式,例如{a}或{b}。"
|
||||||
step2: "然後,掃描螢幕上的QR code。"
|
step2: "然後,掃描螢幕上的QR code。"
|
||||||
_permissions:
|
_permissions:
|
||||||
@ -1040,6 +1083,7 @@ _widgets:
|
|||||||
button: "按鈕"
|
button: "按鈕"
|
||||||
onlineUsers: "線上的用戶"
|
onlineUsers: "線上的用戶"
|
||||||
jobQueue: "佇列"
|
jobQueue: "佇列"
|
||||||
|
serverMetric: "服務器指標 "
|
||||||
_cw:
|
_cw:
|
||||||
hide: "隱藏"
|
hide: "隱藏"
|
||||||
show: "瀏覽更多"
|
show: "瀏覽更多"
|
||||||
@ -1053,6 +1097,7 @@ _poll:
|
|||||||
expiration: "期限"
|
expiration: "期限"
|
||||||
infinite: "無期限"
|
infinite: "無期限"
|
||||||
at: "結束時間"
|
at: "結束時間"
|
||||||
|
after: "進度指定 "
|
||||||
deadlineDate: "截止日期"
|
deadlineDate: "截止日期"
|
||||||
deadlineTime: "小時"
|
deadlineTime: "小時"
|
||||||
duration: "時長"
|
duration: "時長"
|
||||||
@ -1067,6 +1112,7 @@ _poll:
|
|||||||
remainingSeconds: "{s}秒後截止"
|
remainingSeconds: "{s}秒後截止"
|
||||||
_visibility:
|
_visibility:
|
||||||
public: "公開"
|
public: "公開"
|
||||||
|
publicDescription: "發布給所有用戶 "
|
||||||
home: "首頁"
|
home: "首頁"
|
||||||
followers: "追隨者"
|
followers: "追隨者"
|
||||||
specified: "指定使用者"
|
specified: "指定使用者"
|
||||||
@ -1180,6 +1226,7 @@ _rooms:
|
|||||||
cube: "立方體"
|
cube: "立方體"
|
||||||
tv: "電視"
|
tv: "電視"
|
||||||
pinguin: "企鵝蠟像"
|
pinguin: "企鵝蠟像"
|
||||||
|
rubik-cube: "魔術方塊"
|
||||||
poster-h: "海報(橫向)"
|
poster-h: "海報(橫向)"
|
||||||
poster-v: "海報(直向)"
|
poster-v: "海報(直向)"
|
||||||
sofa: " 沙發"
|
sofa: " 沙發"
|
||||||
@ -1242,6 +1289,7 @@ _pages:
|
|||||||
post: "發佈窗口"
|
post: "發佈窗口"
|
||||||
_post:
|
_post:
|
||||||
text: "内容"
|
text: "内容"
|
||||||
|
attachCanvasImage: "附加相簿圖像 "
|
||||||
canvasId: "畫布ID"
|
canvasId: "畫布ID"
|
||||||
textInput: "插入字串"
|
textInput: "插入字串"
|
||||||
_textInput:
|
_textInput:
|
||||||
@ -1266,6 +1314,7 @@ _pages:
|
|||||||
note: "嵌式貼文"
|
note: "嵌式貼文"
|
||||||
_note:
|
_note:
|
||||||
id: "貼文ID"
|
id: "貼文ID"
|
||||||
|
idDescription: "您也可以粘貼筆記 URL 並進行設置。 "
|
||||||
detailed: "顯示詳細內容"
|
detailed: "顯示詳細內容"
|
||||||
switch: "開關"
|
switch: "開關"
|
||||||
_switch:
|
_switch:
|
||||||
@ -1282,12 +1331,15 @@ _pages:
|
|||||||
colored: "彩色"
|
colored: "彩色"
|
||||||
action: "按下按鈕後發生的行為"
|
action: "按下按鈕後發生的行為"
|
||||||
_action:
|
_action:
|
||||||
|
dialog: "顯示對話框 "
|
||||||
_dialog:
|
_dialog:
|
||||||
content: "内容"
|
content: "内容"
|
||||||
resetRandom: "重設亂數"
|
resetRandom: "重設亂數"
|
||||||
pushEvent: "發送事件"
|
pushEvent: "發送事件"
|
||||||
_pushEvent:
|
_pushEvent:
|
||||||
event: "事件名稱"
|
event: "事件名稱"
|
||||||
|
message: "按下時顯示的消息 "
|
||||||
|
variable: "要發送的變數"
|
||||||
no-variable: "沒有"
|
no-variable: "沒有"
|
||||||
callAiScript: "調用AiScript"
|
callAiScript: "調用AiScript"
|
||||||
_callAiScript:
|
_callAiScript:
|
||||||
@ -1296,6 +1348,7 @@ _pages:
|
|||||||
_radioButton:
|
_radioButton:
|
||||||
name: "變數名稱"
|
name: "變數名稱"
|
||||||
title: "標題"
|
title: "標題"
|
||||||
|
values: "由換行符分隔的選項"
|
||||||
default: "預設值"
|
default: "預設值"
|
||||||
script:
|
script:
|
||||||
categories:
|
categories:
|
||||||
@ -1313,6 +1366,8 @@ _pages:
|
|||||||
text: "字串"
|
text: "字串"
|
||||||
multiLineText: "字串(多行)"
|
multiLineText: "字串(多行)"
|
||||||
textList: "字串串列"
|
textList: "字串串列"
|
||||||
|
_textList:
|
||||||
|
info: "請分開每個換行符 "
|
||||||
strLen: "字串長度"
|
strLen: "字串長度"
|
||||||
_strLen:
|
_strLen:
|
||||||
arg1: "字串"
|
arg1: "字串"
|
||||||
@ -1323,6 +1378,8 @@ _pages:
|
|||||||
strReplace: "替換字串"
|
strReplace: "替換字串"
|
||||||
_strReplace:
|
_strReplace:
|
||||||
arg1: "字串"
|
arg1: "字串"
|
||||||
|
arg2: "替換前"
|
||||||
|
arg3: "替換後"
|
||||||
strReverse: "倒轉字串"
|
strReverse: "倒轉字串"
|
||||||
_strReverse:
|
_strReverse:
|
||||||
arg1: "字串"
|
arg1: "字串"
|
||||||
@ -1389,6 +1446,7 @@ _pages:
|
|||||||
_if:
|
_if:
|
||||||
arg1: "如果"
|
arg1: "如果"
|
||||||
arg2: "如果"
|
arg2: "如果"
|
||||||
|
arg3: "除此以外 "
|
||||||
not: "否"
|
not: "否"
|
||||||
_not:
|
_not:
|
||||||
arg1: "否"
|
arg1: "否"
|
||||||
@ -1399,13 +1457,17 @@ _pages:
|
|||||||
_rannum:
|
_rannum:
|
||||||
arg1: "下限"
|
arg1: "下限"
|
||||||
arg2: "上限"
|
arg2: "上限"
|
||||||
|
randomPick: "從列表中隨機選擇 "
|
||||||
_randomPick:
|
_randomPick:
|
||||||
arg1: "清單"
|
arg1: "清單"
|
||||||
|
dailyRandom: "隨機(使用者每日變化 )"
|
||||||
_dailyRandom:
|
_dailyRandom:
|
||||||
arg1: "機率"
|
arg1: "機率"
|
||||||
|
dailyRannum: "亂數(使用者每日變化)"
|
||||||
_dailyRannum:
|
_dailyRannum:
|
||||||
arg1: "下限"
|
arg1: "下限"
|
||||||
arg2: "上限"
|
arg2: "上限"
|
||||||
|
dailyRandomPick: "從列表中隨機選擇(使用者每日變化 ) "
|
||||||
_dailyRandomPick:
|
_dailyRandomPick:
|
||||||
arg1: "清單"
|
arg1: "清單"
|
||||||
seedRandom: "隨機抽選種子碼"
|
seedRandom: "隨機抽選種子碼"
|
||||||
@ -1444,7 +1506,10 @@ _pages:
|
|||||||
aiScriptVar: "AiScript的變數"
|
aiScriptVar: "AiScript的變數"
|
||||||
fn: "函数"
|
fn: "函数"
|
||||||
_fn:
|
_fn:
|
||||||
|
slots: "欄位"
|
||||||
|
slots-info: "用換行符分隔每個欄位"
|
||||||
arg1: "輸出"
|
arg1: "輸出"
|
||||||
|
for: "重複 "
|
||||||
_for:
|
_for:
|
||||||
arg1: "重複次數"
|
arg1: "重複次數"
|
||||||
arg2: "處理"
|
arg2: "處理"
|
||||||
@ -1454,13 +1519,16 @@ _pages:
|
|||||||
boolean: "標記"
|
boolean: "標記"
|
||||||
array: "清單"
|
array: "清單"
|
||||||
stringArray: "字串列表"
|
stringArray: "字串列表"
|
||||||
|
emptySlot: "空欄位"
|
||||||
enviromentVariables: "環境變數"
|
enviromentVariables: "環境變數"
|
||||||
pageVariables: "頁面元素"
|
pageVariables: "頁面元素"
|
||||||
|
argVariables: "輸入欄位"
|
||||||
_relayStatus:
|
_relayStatus:
|
||||||
requesting: "等待核准"
|
requesting: "等待核准"
|
||||||
accepted: "已通過核准"
|
accepted: "已通過核准"
|
||||||
rejected: "已拒絕"
|
rejected: "已拒絕"
|
||||||
_notification:
|
_notification:
|
||||||
|
fileUploaded: "上傳檔案成功。"
|
||||||
youGotMention: "{name}提及到您"
|
youGotMention: "{name}提及到您"
|
||||||
youGotReply: "{name}回覆了您"
|
youGotReply: "{name}回覆了您"
|
||||||
youGotQuote: "{name}引用了您"
|
youGotQuote: "{name}引用了您"
|
||||||
|
16
migration/1621479946000-add-note-indexes.ts
Normal file
16
migration/1621479946000-add-note-indexes.ts
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
import {MigrationInterface, QueryRunner} from "typeorm";
|
||||||
|
|
||||||
|
export class addNoteIndexes1621479946000 implements MigrationInterface {
|
||||||
|
name = 'addNoteIndexes1621479946000'
|
||||||
|
|
||||||
|
public async up(queryRunner: QueryRunner): Promise<void> {
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_NOTE_MENTIONS" ON "note" USING gin ("mentions")`, undefined);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_NOTE_VISIBLE_USER_IDS" ON "note" USING gin ("visibleUserIds")`, undefined);
|
||||||
|
}
|
||||||
|
|
||||||
|
public async down(queryRunner: QueryRunner): Promise<void> {
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_NOTE_MENTIONS"`, undefined);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_NOTE_VISIBLE_USER_IDS"`, undefined);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
13
migration/1622679304522-user-profile-description-length.ts
Normal file
13
migration/1622679304522-user-profile-description-length.ts
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
import {MigrationInterface, QueryRunner} from "typeorm";
|
||||||
|
|
||||||
|
export class userProfileDescriptionLength1622679304522 implements MigrationInterface {
|
||||||
|
name = 'userProfileDescriptionLength1622679304522';
|
||||||
|
|
||||||
|
public async up(queryRunner: QueryRunner): Promise<void> {
|
||||||
|
await queryRunner.query(`ALTER TABLE "user_profile" ALTER COLUMN "description" TYPE character varying(2048)`, undefined);
|
||||||
|
}
|
||||||
|
|
||||||
|
public async down(queryRunner: QueryRunner): Promise<void> {
|
||||||
|
await queryRunner.query(`ALTER TABLE "user_profile" ALTER COLUMN "description" TYPE character varying(1024)`, undefined);
|
||||||
|
}
|
||||||
|
}
|
12
migration/1622681548499-log-message-length.ts
Normal file
12
migration/1622681548499-log-message-length.ts
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
import {MigrationInterface, QueryRunner} from "typeorm";
|
||||||
|
|
||||||
|
export class logMessageLength1622681548499 implements MigrationInterface {
|
||||||
|
name = 'logMessageLength1622681548499';
|
||||||
|
public async up(queryRunner: QueryRunner): Promise<void> {
|
||||||
|
await queryRunner.query(`ALTER TABLE "log" ALTER COLUMN "message" TYPE character varying(2048)`, undefined);
|
||||||
|
}
|
||||||
|
|
||||||
|
public async down(queryRunner: QueryRunner): Promise<void> {
|
||||||
|
await queryRunner.query(`ALTER TABLE "log" ALTER COLUMN "message" TYPE character varying(1024)`, undefined);
|
||||||
|
}
|
||||||
|
}
|
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"`);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
214
package.json
214
package.json
@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "misskey",
|
"name": "misskey",
|
||||||
"author": "syuilo <syuilotan@yahoo.co.jp>",
|
"author": "syuilo <syuilotan@yahoo.co.jp>",
|
||||||
"version": "12.81.0",
|
"version": "12.88.0",
|
||||||
"codename": "indigo",
|
"codename": "indigo",
|
||||||
"repository": {
|
"repository": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
@ -11,6 +11,7 @@
|
|||||||
"private": true,
|
"private": true,
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"start": "node ./index.js",
|
"start": "node ./index.js",
|
||||||
|
"start:test": "cross-env NODE_ENV=test node ./index.js",
|
||||||
"init": "npm run migrate",
|
"init": "npm run migrate",
|
||||||
"ormconfig": "node ./built/ormconfig.js",
|
"ormconfig": "node ./built/ormconfig.js",
|
||||||
"migrate": "ts-node ./node_modules/typeorm/cli.js migration:run",
|
"migrate": "ts-node ./node_modules/typeorm/cli.js migration:run",
|
||||||
@ -26,139 +27,141 @@
|
|||||||
"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"
|
||||||
},
|
},
|
||||||
"resolutions": {
|
"resolutions": {
|
||||||
"chokidar": "^3.3.1",
|
"chokidar": "^3.3.1",
|
||||||
"constantinople": "^4.0.1",
|
"lodash": "^4.17.21"
|
||||||
"jsonld/rdf-canonize/node-forge": "0.10.0",
|
|
||||||
"lodash": "^4.17.20"
|
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@babel/plugin-transform-runtime": "7.13.15",
|
"@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",
|
||||||
"@koa/router": "9.0.1",
|
"@koa/router": "9.0.1",
|
||||||
"@sentry/browser": "5.29.2",
|
"@sentry/browser": "5.29.2",
|
||||||
"@sentry/tracing": "5.29.2",
|
"@sentry/tracing": "5.29.2",
|
||||||
"@sinonjs/fake-timers": "7.0.5",
|
"@sinonjs/fake-timers": "7.1.2",
|
||||||
"@syuilo/aiscript": "0.11.1",
|
"@syuilo/aiscript": "0.11.1",
|
||||||
"@types/bcryptjs": "2.4.2",
|
"@types/bcryptjs": "2.4.2",
|
||||||
"@types/bull": "3.15.1",
|
"@types/bull": "3.15.3",
|
||||||
"@types/cbor": "5.0.1",
|
"@types/cbor": "6.0.0",
|
||||||
"@types/dateformat": "3.0.1",
|
"@types/dateformat": "3.0.1",
|
||||||
"@types/escape-regexp": "0.0.0",
|
"@types/escape-regexp": "0.0.0",
|
||||||
"@types/glob": "7.1.3",
|
"@types/glob": "7.1.4",
|
||||||
"@types/gulp": "4.0.8",
|
"@types/gulp": "4.0.9",
|
||||||
"@types/gulp-rename": "2.0.0",
|
"@types/gulp-rename": "2.0.1",
|
||||||
"@types/is-url": "1.2.28",
|
"@types/is-url": "1.2.30",
|
||||||
"@types/js-yaml": "4.0.1",
|
"@types/js-yaml": "4.0.2",
|
||||||
"@types/jsdom": "16.2.10",
|
"@types/jsdom": "16.2.13",
|
||||||
"@types/jsonld": "1.5.5",
|
"@types/jsonld": "1.5.6",
|
||||||
"@types/katex": "0.11.0",
|
"@types/katex": "0.11.1",
|
||||||
"@types/koa": "2.13.1",
|
"@types/koa": "2.13.4",
|
||||||
"@types/koa-bodyparser": "4.3.0",
|
"@types/koa-bodyparser": "4.3.3",
|
||||||
"@types/koa-cors": "0.0.0",
|
"@types/koa-cors": "0.0.2",
|
||||||
"@types/koa-favicon": "2.0.19",
|
"@types/koa-favicon": "2.0.21",
|
||||||
"@types/koa-logger": "3.1.1",
|
"@types/koa-logger": "3.1.1",
|
||||||
"@types/koa-mount": "4.0.0",
|
"@types/koa-mount": "4.0.0",
|
||||||
"@types/koa-send": "4.1.2",
|
"@types/koa-send": "4.1.3",
|
||||||
"@types/koa-views": "2.0.4",
|
"@types/koa-views": "7.0.0",
|
||||||
"@types/koa__cors": "3.0.2",
|
"@types/koa__cors": "3.0.3",
|
||||||
"@types/koa__multer": "2.0.2",
|
"@types/koa__multer": "2.0.3",
|
||||||
"@types/koa__router": "8.0.4",
|
"@types/koa__router": "8.0.7",
|
||||||
"@types/markdown-it": "12.0.1",
|
"@types/markdown-it": "12.0.3",
|
||||||
"@types/matter-js": "0.14.11",
|
"@types/matter-js": "0.17.5",
|
||||||
"@types/mocha": "8.2.2",
|
"@types/mocha": "8.2.3",
|
||||||
"@types/node": "14.14.41",
|
"@types/node": "16.6.0",
|
||||||
"@types/node-fetch": "2.5.10",
|
"@types/node-fetch": "2.5.12",
|
||||||
"@types/nodemailer": "6.4.1",
|
"@types/nodemailer": "6.4.4",
|
||||||
"@types/nprogress": "0.2.0",
|
"@types/nprogress": "0.2.0",
|
||||||
"@types/oauth": "0.9.1",
|
"@types/oauth": "0.9.1",
|
||||||
"@types/parse5": "6.0.0",
|
"@types/parse5": "6.0.1",
|
||||||
"@types/parsimmon": "1.10.6",
|
"@types/parsimmon": "1.10.6",
|
||||||
"@types/portscanner": "2.1.0",
|
"@types/portscanner": "2.1.1",
|
||||||
"@types/pug": "2.0.4",
|
"@types/pug": "2.0.5",
|
||||||
"@types/punycode": "2.1.0",
|
"@types/punycode": "2.1.0",
|
||||||
"@types/qrcode": "1.4.0",
|
"@types/qrcode": "1.4.1",
|
||||||
"@types/random-seed": "0.3.3",
|
"@types/random-seed": "0.3.3",
|
||||||
"@types/ratelimiter": "3.4.1",
|
"@types/ratelimiter": "3.4.2",
|
||||||
"@types/redis": "2.8.28",
|
"@types/redis": "2.8.31",
|
||||||
"@types/rename": "1.0.2",
|
"@types/rename": "1.0.4",
|
||||||
"@types/request-stats": "3.0.0",
|
"@types/request-stats": "3.0.0",
|
||||||
"@types/rimraf": "3.0.0",
|
"@types/rimraf": "3.0.1",
|
||||||
"@types/seedrandom": "2.4.28",
|
"@types/seedrandom": "2.4.28",
|
||||||
"@types/sharp": "0.28.0",
|
"@types/sharp": "0.28.5",
|
||||||
"@types/sinonjs__fake-timers": "6.0.2",
|
"@types/sinonjs__fake-timers": "6.0.3",
|
||||||
"@types/speakeasy": "2.0.5",
|
"@types/speakeasy": "2.0.6",
|
||||||
"@types/throttle-debounce": "2.1.0",
|
"@types/throttle-debounce": "2.1.0",
|
||||||
"@types/tinycolor2": "1.4.2",
|
"@types/tinycolor2": "1.4.3",
|
||||||
"@types/tmp": "0.2.0",
|
"@types/tmp": "0.2.1",
|
||||||
"@types/uuid": "8.3.0",
|
"@types/uuid": "8.3.1",
|
||||||
"@types/web-push": "3.3.0",
|
"@types/web-push": "3.3.2",
|
||||||
"@types/webpack": "5.28.0",
|
"@types/webpack": "5.28.0",
|
||||||
"@types/webpack-stream": "3.2.12",
|
"@types/webpack-stream": "3.2.12",
|
||||||
"@types/websocket": "1.0.2",
|
"@types/websocket": "1.0.4",
|
||||||
"@types/ws": "7.4.1",
|
"@types/ws": "7.4.7",
|
||||||
"@typescript-eslint/parser": "4.22.0",
|
"@typescript-eslint/parser": "4.29.1",
|
||||||
"@vue/compiler-sfc": "3.0.11",
|
"@vue/compiler-sfc": "3.2.3",
|
||||||
"abort-controller": "3.0.0",
|
"abort-controller": "3.0.0",
|
||||||
"apexcharts": "3.26.1",
|
"apexcharts": "3.27.3",
|
||||||
"autobind-decorator": "2.4.0",
|
"autobind-decorator": "2.4.0",
|
||||||
"autosize": "4.0.2",
|
"autosize": "4.0.4",
|
||||||
"autwh": "0.1.0",
|
"autwh": "0.1.0",
|
||||||
"aws-sdk": "2.892.0",
|
"aws-sdk": "2.966.0",
|
||||||
"bcryptjs": "2.4.3",
|
"bcryptjs": "2.4.3",
|
||||||
"blurhash": "1.1.3",
|
"blurhash": "1.1.3",
|
||||||
"broadcast-channel": "3.5.3",
|
"broadcast-channel": "3.7.0",
|
||||||
"bull": "3.22.3",
|
"bull": "3.26.0",
|
||||||
|
"cacheable-lookup": "6.0.0",
|
||||||
"cafy": "15.2.1",
|
"cafy": "15.2.1",
|
||||||
"cbor": "7.0.5",
|
"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": "7.2.0",
|
||||||
"concurrently": "6.0.2",
|
"compare-versions": "3.6.0",
|
||||||
|
"concurrently": "6.2.0",
|
||||||
"content-disposition": "0.5.3",
|
"content-disposition": "0.5.3",
|
||||||
"core-js": "3.11.0",
|
"core-js": "3.16.1",
|
||||||
"crc-32": "1.2.0",
|
"crc-32": "1.2.0",
|
||||||
"css-loader": "5.2.4",
|
"css-loader": "6.2.0",
|
||||||
"cssnano": "5.0.1",
|
"cssnano": "5.0.7",
|
||||||
"dateformat": "4.5.1",
|
"dateformat": "4.5.1",
|
||||||
"diskusage": "1.1.3",
|
"diskusage": "1.1.3",
|
||||||
"escape-regexp": "0.0.1",
|
"escape-regexp": "0.0.1",
|
||||||
"eslint": "7.25.0",
|
"eslint": "7.32.0",
|
||||||
"eslint-plugin-vue": "7.9.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.3.0",
|
"file-type": "16.5.3",
|
||||||
"fluent-ffmpeg": "2.1.2",
|
"fluent-ffmpeg": "2.1.2",
|
||||||
"glob": "7.1.6",
|
"glob": "7.1.7",
|
||||||
"got": "11.8.2",
|
"got": "11.8.2",
|
||||||
"gulp": "4.0.2",
|
"gulp": "4.0.2",
|
||||||
"gulp-cssnano": "2.1.3",
|
"gulp-cssnano": "2.1.3",
|
||||||
"gulp-rename": "2.0.0",
|
"gulp-rename": "2.0.0",
|
||||||
"gulp-replace": "1.1.1",
|
"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",
|
"hard-source-webpack-plugin": "0.13.1",
|
||||||
|
"hpagent": "0.1.2",
|
||||||
"html-minifier": "4.0.0",
|
"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.5",
|
|
||||||
"insert-text-at-cursor": "0.3.0",
|
"insert-text-at-cursor": "0.3.0",
|
||||||
"is-root": "2.1.0",
|
"is-root": "2.1.0",
|
||||||
"is-svg": "4.3.1",
|
"is-svg": "4.3.1",
|
||||||
"js-yaml": "4.1.0",
|
"js-yaml": "4.1.0",
|
||||||
"jsdom": "16.5.3",
|
"jsdom": "16.7.0",
|
||||||
"json5": "2.2.0",
|
"json5": "2.2.0",
|
||||||
"json5-loader": "4.0.1",
|
"json5-loader": "4.0.1",
|
||||||
"jsonld": "4.0.1",
|
"jsonld": "5.2.0",
|
||||||
"jsrsasign": "8.0.20",
|
"jsrsasign": "8.0.20",
|
||||||
"katex": "0.13.3",
|
"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",
|
||||||
@ -169,27 +172,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.0.6",
|
|
||||||
"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.16.3",
|
"mfm-js": "0.19.0",
|
||||||
"mocha": "8.3.2",
|
"misskey-js": "0.0.6",
|
||||||
|
"mocha": "8.4.0",
|
||||||
"moji": "0.5.1",
|
"moji": "0.5.1",
|
||||||
"ms": "2.1.3",
|
"ms": "2.1.3",
|
||||||
"multer": "1.4.2",
|
"multer": "1.4.3",
|
||||||
"nested-property": "4.0.0",
|
"nested-property": "4.0.0",
|
||||||
"node-fetch": "2.6.1",
|
"node-fetch": "2.6.1",
|
||||||
"nodemailer": "6.5.0",
|
"nodemailer": "6.6.3",
|
||||||
"object-assign-deep": "0.4.0",
|
"object-assign-deep": "0.4.0",
|
||||||
"os-utils": "0.0.14",
|
"os-utils": "0.0.14",
|
||||||
"parse5": "6.0.1",
|
"parse5": "6.0.1",
|
||||||
"pg": "8.6.0",
|
"pg": "8.6.0",
|
||||||
"portscanner": "2.2.0",
|
"portscanner": "2.2.0",
|
||||||
"postcss": "8.2.12",
|
"postcss": "8.3.6",
|
||||||
"postcss-loader": "5.2.0",
|
"postcss-loader": "6.1.1",
|
||||||
"prismjs": "1.23.0",
|
"prismjs": "1.24.1",
|
||||||
"probe-image-size": "7.1.0",
|
"probe-image-size": "7.2.1",
|
||||||
"promise-limit": "2.7.0",
|
"promise-limit": "2.7.0",
|
||||||
"promise-sequential": "1.1.1",
|
"promise-sequential": "1.1.1",
|
||||||
"pug": "3.0.2",
|
"pug": "3.0.2",
|
||||||
@ -198,60 +201,61 @@
|
|||||||
"qrcode": "1.4.4",
|
"qrcode": "1.4.4",
|
||||||
"random-seed": "0.3.0",
|
"random-seed": "0.3.0",
|
||||||
"ratelimiter": "3.4.1",
|
"ratelimiter": "3.4.1",
|
||||||
"re2": "1.15.9",
|
"re2": "1.16.0",
|
||||||
"reconnecting-websocket": "4.4.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",
|
"regenerator-runtime": "0.13.9",
|
||||||
"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.32.11",
|
"sass": "1.37.5",
|
||||||
"sass-loader": "11.0.1",
|
"sass-loader": "12.1.0",
|
||||||
"seedrandom": "3.0.5",
|
"seedrandom": "3.0.5",
|
||||||
"sharp": "0.28.1",
|
"sharp": "0.28.3",
|
||||||
"speakeasy": "2.0.0",
|
"speakeasy": "2.0.0",
|
||||||
"stringz": "2.1.0",
|
"stringz": "2.1.0",
|
||||||
"style-loader": "2.0.0",
|
"style-loader": "3.2.1",
|
||||||
"summaly": "2.4.0",
|
"summaly": "2.4.1",
|
||||||
"syslog-pro": "1.0.0",
|
"syslog-pro": "1.0.0",
|
||||||
"systeminformation": "5.6.12",
|
"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.1.1",
|
"ts-loader": "9.2.5",
|
||||||
"ts-node": "9.1.1",
|
"ts-node": "10.2.0",
|
||||||
"tsc-alias": "1.2.10",
|
"tsc-alias": "1.3.8",
|
||||||
"tsconfig-paths": "3.9.0",
|
"tsconfig-paths": "3.10.1",
|
||||||
"tslint": "6.1.3",
|
"tslint": "6.1.3",
|
||||||
"tslint-sonarts": "1.9.0",
|
"tslint-sonarts": "1.9.0",
|
||||||
|
"twemoji-parser": "13.1.0",
|
||||||
"typeorm": "0.2.32",
|
"typeorm": "0.2.32",
|
||||||
"typescript": "4.2.4",
|
"typescript": "4.3.5",
|
||||||
"ulid": "2.3.0",
|
"ulid": "2.3.0",
|
||||||
"uuid": "8.3.2",
|
"uuid": "8.3.2",
|
||||||
"v-debounce": "0.1.2",
|
"v-debounce": "0.1.2",
|
||||||
"vanilla-tilt": "1.7.0",
|
"vanilla-tilt": "1.7.1",
|
||||||
"vue": "3.0.11",
|
"vue": "3.2.3",
|
||||||
"vue-color": "2.8.1",
|
"vue-color": "2.8.1",
|
||||||
"vue-json-pretty": "1.7.1",
|
"vue-json-pretty": "1.8.1",
|
||||||
"vue-loader": "16.1.2",
|
"vue-loader": "16.5.0",
|
||||||
"vue-prism-editor": "2.0.0-alpha.2",
|
"vue-prism-editor": "2.0.0-alpha.2",
|
||||||
"vue-router": "4.0.5",
|
"vue-router": "4.0.5",
|
||||||
"vue-style-loader": "4.1.3",
|
"vue-style-loader": "4.1.3",
|
||||||
"vue-svg-loader": "0.17.0-beta.2",
|
"vue-svg-loader": "0.17.0-beta.2",
|
||||||
"vuedraggable": "4.0.1",
|
"vuedraggable": "4.0.1",
|
||||||
"web-push": "3.4.4",
|
"web-push": "3.4.5",
|
||||||
"webpack": "5.35.1",
|
"webpack": "5.50.0",
|
||||||
"webpack-cli": "4.6.0",
|
"webpack-cli": "4.7.2",
|
||||||
"websocket": "1.0.34",
|
"websocket": "1.0.34",
|
||||||
"ws": "7.4.5",
|
"ws": "8.1.0",
|
||||||
"xev": "2.0.1"
|
"xev": "2.0.1"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
@ -259,6 +263,8 @@
|
|||||||
"@types/chai": "4.2.16",
|
"@types/chai": "4.2.16",
|
||||||
"@types/fluent-ffmpeg": "2.1.17",
|
"@types/fluent-ffmpeg": "2.1.17",
|
||||||
"chai": "4.3.4",
|
"chai": "4.3.4",
|
||||||
"cross-env": "7.0.3"
|
"cross-env": "7.0.3",
|
||||||
|
"cypress": "8.2.0",
|
||||||
|
"start-server-and-test": "1.13.1"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
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;
|
|
||||||
}
|
|
@ -18,7 +18,7 @@ program
|
|||||||
|
|
||||||
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 };
|
||||||
|
@ -8,6 +8,8 @@ import { unisonReload } from '@client/scripts/unison-reload';
|
|||||||
type Account = {
|
type Account = {
|
||||||
id: string;
|
id: string;
|
||||||
token: string;
|
token: string;
|
||||||
|
isModerator: boolean;
|
||||||
|
isAdmin: boolean;
|
||||||
};
|
};
|
||||||
|
|
||||||
const data = localStorage.getItem('account');
|
const data = localStorage.getItem('account');
|
||||||
@ -45,7 +47,7 @@ function fetchAccount(token): Promise<Account> {
|
|||||||
})
|
})
|
||||||
.then(res => {
|
.then(res => {
|
||||||
// When failed to authenticate user
|
// When failed to authenticate user
|
||||||
if (res.status !== 200 && res.status < 500) {
|
if (res.status >= 400 && res.status < 500) {
|
||||||
return signout();
|
return signout();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -10,9 +10,9 @@
|
|||||||
</template>
|
</template>
|
||||||
<div class="dpvffvvy _monolithic_">
|
<div class="dpvffvvy _monolithic_">
|
||||||
<div class="_section">
|
<div class="_section">
|
||||||
<MkTextarea v-model:value="comment">
|
<MkTextarea v-model="comment">
|
||||||
<span>{{ $ts.details }}</span>
|
<template #label>{{ $ts.details }}</template>
|
||||||
<template #desc>{{ $ts.fillAbuseReportDescription }}</template>
|
<template #caption>{{ $ts.fillAbuseReportDescription }}</template>
|
||||||
</MkTextarea>
|
</MkTextarea>
|
||||||
</div>
|
</div>
|
||||||
<div class="_section">
|
<div class="_section">
|
||||||
|
@ -5,7 +5,8 @@
|
|||||||
:cy="5 - (Math.cos(angle) * (5 - graduationsPadding))"
|
:cy="5 - (Math.cos(angle) * (5 - graduationsPadding))"
|
||||||
:r="i % 5 == 0 ? 0.125 : 0.05"
|
:r="i % 5 == 0 ? 0.125 : 0.05"
|
||||||
:fill="i % 5 == 0 ? majorGraduationColor : minorGraduationColor"
|
:fill="i % 5 == 0 ? majorGraduationColor : minorGraduationColor"
|
||||||
:key="i"/>
|
:key="i"
|
||||||
|
/>
|
||||||
|
|
||||||
<line
|
<line
|
||||||
:x1="5 - (Math.sin(sAngle) * (sHandLengthRatio * handsTailLength))"
|
:x1="5 - (Math.sin(sAngle) * (sHandLengthRatio * handsTailLength))"
|
||||||
@ -13,7 +14,9 @@
|
|||||||
:x2="5 + (Math.sin(sAngle) * ((sHandLengthRatio * 5) - handsPadding))"
|
:x2="5 + (Math.sin(sAngle) * ((sHandLengthRatio * 5) - handsPadding))"
|
||||||
:y2="5 - (Math.cos(sAngle) * ((sHandLengthRatio * 5) - handsPadding))"
|
:y2="5 - (Math.cos(sAngle) * ((sHandLengthRatio * 5) - handsPadding))"
|
||||||
:stroke="sHandColor"
|
:stroke="sHandColor"
|
||||||
stroke-width="0.05"/>
|
:stroke-width="thickness / 2"
|
||||||
|
stroke-linecap="round"
|
||||||
|
/>
|
||||||
|
|
||||||
<line
|
<line
|
||||||
:x1="5 - (Math.sin(mAngle) * (mHandLengthRatio * handsTailLength))"
|
:x1="5 - (Math.sin(mAngle) * (mHandLengthRatio * handsTailLength))"
|
||||||
@ -21,7 +24,9 @@
|
|||||||
:x2="5 + (Math.sin(mAngle) * ((mHandLengthRatio * 5) - handsPadding))"
|
:x2="5 + (Math.sin(mAngle) * ((mHandLengthRatio * 5) - handsPadding))"
|
||||||
:y2="5 - (Math.cos(mAngle) * ((mHandLengthRatio * 5) - handsPadding))"
|
:y2="5 - (Math.cos(mAngle) * ((mHandLengthRatio * 5) - handsPadding))"
|
||||||
:stroke="mHandColor"
|
:stroke="mHandColor"
|
||||||
stroke-width="0.1"/>
|
:stroke-width="thickness"
|
||||||
|
stroke-linecap="round"
|
||||||
|
/>
|
||||||
|
|
||||||
<line
|
<line
|
||||||
:x1="5 - (Math.sin(hAngle) * (hHandLengthRatio * handsTailLength))"
|
:x1="5 - (Math.sin(hAngle) * (hHandLengthRatio * handsTailLength))"
|
||||||
@ -29,16 +34,24 @@
|
|||||||
:x2="5 + (Math.sin(hAngle) * ((hHandLengthRatio * 5) - handsPadding))"
|
:x2="5 + (Math.sin(hAngle) * ((hHandLengthRatio * 5) - handsPadding))"
|
||||||
:y2="5 - (Math.cos(hAngle) * ((hHandLengthRatio * 5) - handsPadding))"
|
:y2="5 - (Math.cos(hAngle) * ((hHandLengthRatio * 5) - handsPadding))"
|
||||||
:stroke="hHandColor"
|
:stroke="hHandColor"
|
||||||
stroke-width="0.1"/>
|
:stroke-width="thickness"
|
||||||
|
stroke-linecap="round"
|
||||||
|
/>
|
||||||
</svg>
|
</svg>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { defineComponent } from 'vue';
|
import { defineComponent } from 'vue';
|
||||||
import * as tinycolor from 'tinycolor2';
|
import * as tinycolor from 'tinycolor2';
|
||||||
import * as os from '@client/os';
|
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
|
props: {
|
||||||
|
thickness: {
|
||||||
|
type: Number,
|
||||||
|
default: 0.1
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
now: new Date(),
|
now: new Date(),
|
||||||
|
@ -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;
|
||||||
});
|
});
|
||||||
|
@ -1,11 +1,11 @@
|
|||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { defineComponent, h, TransitionGroup } from 'vue';
|
import { defineComponent, h, PropType, TransitionGroup } from 'vue';
|
||||||
import MkAd from '@client/components/global/ad.vue';
|
import MkAd from '@client/components/global/ad.vue';
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
props: {
|
props: {
|
||||||
items: {
|
items: {
|
||||||
type: Array,
|
type: Array as PropType<{ id: string; createdAt: string; _shouldInsertAd_: boolean; }[]>,
|
||||||
required: true,
|
required: true,
|
||||||
},
|
},
|
||||||
direction: {
|
direction: {
|
||||||
@ -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>
|
||||||
|
@ -87,6 +87,10 @@ export default defineComponent({
|
|||||||
text: this.file.isSensitive ? this.$ts.unmarkAsSensitive : this.$ts.markAsSensitive,
|
text: this.file.isSensitive ? this.$ts.unmarkAsSensitive : this.$ts.markAsSensitive,
|
||||||
icon: this.file.isSensitive ? 'fas fa-eye' : 'fas fa-eye-slash',
|
icon: this.file.isSensitive ? 'fas fa-eye' : 'fas fa-eye-slash',
|
||||||
action: this.toggleSensitive
|
action: this.toggleSensitive
|
||||||
|
}, {
|
||||||
|
text: this.$ts.describeFile,
|
||||||
|
icon: 'fas fa-i-cursor',
|
||||||
|
action: this.describe
|
||||||
}, null, {
|
}, null, {
|
||||||
text: this.$ts.copyUrl,
|
text: this.$ts.copyUrl,
|
||||||
icon: 'fas fa-link',
|
icon: 'fas fa-link',
|
||||||
@ -110,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);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -150,6 +154,26 @@ export default defineComponent({
|
|||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
|
describe() {
|
||||||
|
os.popup(import('@client/components/media-caption.vue'), {
|
||||||
|
title: this.$ts.describeFile,
|
||||||
|
input: {
|
||||||
|
placeholder: this.$ts.inputNewDescription,
|
||||||
|
default: this.file.comment !== null ? this.file.comment : '',
|
||||||
|
},
|
||||||
|
image: this.file
|
||||||
|
}, {
|
||||||
|
done: result => {
|
||||||
|
if (!result || result.canceled) return;
|
||||||
|
let comment = result.result;
|
||||||
|
os.api('drive/files/update', {
|
||||||
|
fileId: this.file.id,
|
||||||
|
comment: comment.length == 0 ? null : comment
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}, 'closed');
|
||||||
|
},
|
||||||
|
|
||||||
toggleSensitive() {
|
toggleSensitive() {
|
||||||
os.api('drive/files/update', {
|
os.api('drive/files/update', {
|
||||||
fileId: this.file.id,
|
fileId: this.file.id,
|
||||||
|
@ -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.useSharedConnection('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);
|
||||||
@ -301,7 +302,7 @@ export default defineComponent({
|
|||||||
}
|
}
|
||||||
}).then(({ canceled, result: url }) => {
|
}).then(({ canceled, result: url }) => {
|
||||||
if (canceled) return;
|
if (canceled) return;
|
||||||
os.api('drive/files/upload_from_url', {
|
os.api('drive/files/upload-from-url', {
|
||||||
url: url,
|
url: url,
|
||||||
folderId: this.folder ? this.folder.id : undefined
|
folderId: this.folder ? this.folder.id : undefined
|
||||||
});
|
});
|
||||||
@ -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" @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;
|
|
||||||
|
|
||||||
&.big {
|
|
||||||
--eachSize: 44px;
|
|
||||||
}
|
|
||||||
|
|
||||||
&.w1 {
|
|
||||||
width: calc((var(--eachSize) * 5) + (#{$pad} * 2));
|
|
||||||
}
|
|
||||||
|
|
||||||
&.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;
|
position: absolute;
|
||||||
bottom: 0;
|
top: calc(0px - (var(--size) * 2));
|
||||||
left: 0;
|
left: 0;
|
||||||
width: 100%;
|
right: 0;
|
||||||
padding: 16px 0;
|
width: 0;
|
||||||
text-align: center;
|
margin: auto;
|
||||||
opacity: 0.5;
|
border: solid var(--size) transparent;
|
||||||
pointer-events: none;
|
border-bottom-color: var(--popup);
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
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;
|
||||||
|
@ -1,7 +1,5 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="xfbouadm" v-if="meta" :style="{ backgroundImage: `url(${ meta.backgroundImageUrl })` }">
|
<div class="xfbouadm" v-if="meta" :style="{ backgroundImage: `url(${ meta.backgroundImageUrl })` }"></div>
|
||||||
|
|
||||||
</div>
|
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
|
@ -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.useSharedConnection('main');
|
this.connection = markRaw(os.stream.useChannel('main'));
|
||||||
|
|
||||||
this.connection.on('follow', this.onFollowChange);
|
this.connection.on('follow', this.onFollowChange);
|
||||||
this.connection.on('unfollow', this.onFollowChange);
|
this.connection.on('unfollow', this.onFollowChange);
|
||||||
|
@ -9,14 +9,14 @@
|
|||||||
|
|
||||||
<form class="_monolithic_" @submit.prevent="onSubmit" v-if="$instance.enableEmail">
|
<form class="_monolithic_" @submit.prevent="onSubmit" v-if="$instance.enableEmail">
|
||||||
<div class="_section">
|
<div class="_section">
|
||||||
<MkInput v-model:value="username" type="text" pattern="^[a-zA-Z0-9_]+$" spellcheck="false" autofocus required>
|
<MkInput v-model="username" type="text" pattern="^[a-zA-Z0-9_]+$" spellcheck="false" autofocus required>
|
||||||
<span>{{ $ts.username }}</span>
|
<template #label>{{ $ts.username }}</template>
|
||||||
<template #prefix>@</template>
|
<template #prefix>@</template>
|
||||||
</MkInput>
|
</MkInput>
|
||||||
|
|
||||||
<MkInput v-model:value="email" type="email" spellcheck="false" required>
|
<MkInput v-model="email" type="email" spellcheck="false" required>
|
||||||
<span>{{ $ts.emailAddress }}</span>
|
<template #label>{{ $ts.emailAddress }}</template>
|
||||||
<template #desc>{{ $ts._forgotPassword.enterEmail }}</template>
|
<template #caption>{{ $ts._forgotPassword.enterEmail }}</template>
|
||||||
</MkInput>
|
</MkInput>
|
||||||
|
|
||||||
<MkButton type="submit" :disabled="processing" primary style="margin: 0 auto;">{{ $ts.send }}</MkButton>
|
<MkButton type="submit" :disabled="processing" primary style="margin: 0 auto;">{{ $ts.send }}</MkButton>
|
||||||
|
@ -34,6 +34,10 @@
|
|||||||
<template #label><span v-text="form[item].label || item"></span><span v-if="form[item].required === false"> ({{ $ts.optional }})</span></template>
|
<template #label><span v-text="form[item].label || item"></span><span v-if="form[item].required === false"> ({{ $ts.optional }})</span></template>
|
||||||
<option v-for="item in form[item].enum" :value="item.value" :key="item.value">{{ item.label }}</option>
|
<option v-for="item in form[item].enum" :value="item.value" :key="item.value">{{ item.label }}</option>
|
||||||
</FormSelect>
|
</FormSelect>
|
||||||
|
<FormRadios v-else-if="form[item].type === 'radio'" v-model="values[item]">
|
||||||
|
<template #desc><span v-text="form[item].label || item"></span><span v-if="form[item].required === false"> ({{ $ts.optional }})</span></template>
|
||||||
|
<option v-for="item in form[item].options" :value="item.value" :key="item.value">{{ item.label }}</option>
|
||||||
|
</FormRadios>
|
||||||
<FormRange v-else-if="form[item].type === 'range'" v-model:value="values[item]" :min="form[item].mim" :max="form[item].max" :step="form[item].step">
|
<FormRange v-else-if="form[item].type === 'range'" v-model:value="values[item]" :min="form[item].mim" :max="form[item].max" :step="form[item].step">
|
||||||
<template #label><span v-text="form[item].label || item"></span><span v-if="form[item].required === false"> ({{ $ts.optional }})</span></template>
|
<template #label><span v-text="form[item].label || item"></span><span v-if="form[item].required === false"> ({{ $ts.optional }})</span></template>
|
||||||
<template v-if="form[item].description" #desc>{{ form[item].description }}</template>
|
<template v-if="form[item].description" #desc>{{ form[item].description }}</template>
|
||||||
@ -56,6 +60,7 @@ import FormSwitch from './form/switch.vue';
|
|||||||
import FormSelect from './form/select.vue';
|
import FormSelect from './form/select.vue';
|
||||||
import FormRange from './form/range.vue';
|
import FormRange from './form/range.vue';
|
||||||
import FormButton from './form/button.vue';
|
import FormButton from './form/button.vue';
|
||||||
|
import FormRadios from './form/radios.vue';
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
components: {
|
components: {
|
||||||
@ -67,6 +72,7 @@ export default defineComponent({
|
|||||||
FormSelect,
|
FormSelect,
|
||||||
FormRange,
|
FormRange,
|
||||||
FormButton,
|
FormButton,
|
||||||
|
FormRadios,
|
||||||
},
|
},
|
||||||
|
|
||||||
props: {
|
props: {
|
||||||
|
@ -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 {
|
||||||
|
@ -27,7 +27,10 @@ export default defineComponent({
|
|||||||
},
|
},
|
||||||
render() {
|
render() {
|
||||||
const label = this.$slots.desc();
|
const label = this.$slots.desc();
|
||||||
const options = this.$slots.default();
|
let options = this.$slots.default();
|
||||||
|
|
||||||
|
// なぜかFragmentになることがあるため
|
||||||
|
if (options.length === 1 && options[0].props == null) options = options[0].children;
|
||||||
|
|
||||||
return h('div', {
|
return h('div', {
|
||||||
class: 'cnklmpwm _formItem'
|
class: 'cnklmpwm _formItem'
|
||||||
@ -37,7 +40,7 @@ export default defineComponent({
|
|||||||
}, label),
|
}, label),
|
||||||
...options.map(option => h('button', {
|
...options.map(option => h('button', {
|
||||||
class: '_button _formPanel _formClickable',
|
class: '_button _formPanel _formClickable',
|
||||||
key: option.props.value,
|
key: option.key,
|
||||||
onClick: () => this.value = option.props.value,
|
onClick: () => this.value = option.props.value,
|
||||||
}, [h('span', {
|
}, [h('span', {
|
||||||
class: ['check', { checked: this.value === option.props.value }],
|
class: ['check', { checked: this.value === option.props.value }],
|
||||||
|
@ -1,9 +1,9 @@
|
|||||||
<template>
|
<template>
|
||||||
<span class="eiwwqkts _noSelect" :class="{ cat }" :title="acct(user)" v-if="disableLink" v-user-preview="disablePreview ? undefined : user.id" @click="onClick">
|
<span class="eiwwqkts _noSelect" :class="{ cat, square: $store.state.squareAvatars }" :title="acct(user)" v-if="disableLink" v-user-preview="disablePreview ? undefined : user.id" @click="onClick">
|
||||||
<img class="inner" :src="url" decoding="async"/>
|
<img class="inner" :src="url" decoding="async"/>
|
||||||
<MkUserOnlineIndicator v-if="showIndicator" class="indicator" :user="user"/>
|
<MkUserOnlineIndicator v-if="showIndicator" class="indicator" :user="user"/>
|
||||||
</span>
|
</span>
|
||||||
<MkA class="eiwwqkts _noSelect" :class="{ cat }" :to="userPage(user)" :title="acct(user)" :target="target" v-else v-user-preview="disablePreview ? undefined : user.id">
|
<MkA class="eiwwqkts _noSelect" :class="{ cat, square: $store.state.squareAvatars }" :to="userPage(user)" :title="acct(user)" :target="target" v-else v-user-preview="disablePreview ? undefined : user.id">
|
||||||
<img class="inner" :src="url" decoding="async"/>
|
<img class="inner" :src="url" decoding="async"/>
|
||||||
<MkUserOnlineIndicator v-if="showIndicator" class="indicator" :user="user"/>
|
<MkUserOnlineIndicator v-if="showIndicator" class="indicator" :user="user"/>
|
||||||
</MkA>
|
</MkA>
|
||||||
@ -81,28 +81,6 @@ export default defineComponent({
|
|||||||
border-radius: 100%;
|
border-radius: 100%;
|
||||||
line-height: 16px;
|
line-height: 16px;
|
||||||
|
|
||||||
&.cat {
|
|
||||||
&:before, &:after {
|
|
||||||
background: #df548f;
|
|
||||||
border: solid 4px currentColor;
|
|
||||||
box-sizing: border-box;
|
|
||||||
content: '';
|
|
||||||
display: inline-block;
|
|
||||||
height: 50%;
|
|
||||||
width: 50%;
|
|
||||||
}
|
|
||||||
|
|
||||||
&:before {
|
|
||||||
border-radius: 0 75% 75%;
|
|
||||||
transform: rotate(37.5deg) skew(30deg);
|
|
||||||
}
|
|
||||||
|
|
||||||
&:after {
|
|
||||||
border-radius: 75% 0 75% 75%;
|
|
||||||
transform: rotate(-37.5deg) skew(-30deg);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
> .inner {
|
> .inner {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
bottom: 0;
|
bottom: 0;
|
||||||
@ -125,5 +103,35 @@ export default defineComponent({
|
|||||||
width: 20%;
|
width: 20%;
|
||||||
height: 20%;
|
height: 20%;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
&.square {
|
||||||
|
border-radius: 20%;
|
||||||
|
|
||||||
|
> .inner {
|
||||||
|
border-radius: 20%;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&.cat {
|
||||||
|
&:before, &:after {
|
||||||
|
background: #df548f;
|
||||||
|
border: solid 4px currentColor;
|
||||||
|
box-sizing: border-box;
|
||||||
|
content: '';
|
||||||
|
display: inline-block;
|
||||||
|
height: 50%;
|
||||||
|
width: 50%;
|
||||||
|
}
|
||||||
|
|
||||||
|
&:before {
|
||||||
|
border-radius: 0 75% 75%;
|
||||||
|
transform: rotate(37.5deg) skew(30deg);
|
||||||
|
}
|
||||||
|
|
||||||
|
&:after {
|
||||||
|
border-radius: 75% 0 75% 75%;
|
||||||
|
transform: rotate(-37.5deg) skew(-30deg);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
@ -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 {
|
|
||||||
width: 32px;
|
|
||||||
height: 32px;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
> .ring {
|
&.mini {
|
||||||
&:before,
|
padding: 16px;
|
||||||
&:after {
|
--size: 32px;
|
||||||
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>
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
<MkModal ref="modal" @click="$refs.modal.close()" @closed="$emit('closed')">
|
<MkModal ref="modal" @click="$refs.modal.close()" @closed="$emit('closed')">
|
||||||
<div class="xubzgfga">
|
<div class="xubzgfga">
|
||||||
<header>{{ image.name }}</header>
|
<header>{{ image.name }}</header>
|
||||||
<img :src="image.url" :alt="image.name" :title="image.name" @click="$refs.modal.close()"/>
|
<img :src="image.url" :alt="image.comment" :title="image.comment" @click="$refs.modal.close()"/>
|
||||||
<footer>
|
<footer>
|
||||||
<span>{{ image.type }}</span>
|
<span>{{ image.type }}</span>
|
||||||
<span>{{ bytes(image.size) }}</span>
|
<span>{{ bytes(image.size) }}</span>
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="zbcjwnqg" style="margin-top: -8px;">
|
<div class="zbcjwnqg" style="margin-top: -8px;">
|
||||||
<div class="selects" style="display: flex;">
|
<div class="selects" style="display: flex;">
|
||||||
<MkSelect v-model:value="chartSrc" style="margin: 0; flex: 1;">
|
<MkSelect v-model="chartSrc" style="margin: 0; flex: 1;">
|
||||||
<optgroup :label="$ts.federation">
|
<optgroup :label="$ts.federation">
|
||||||
<option value="federation-instances">{{ $ts._charts.federationInstancesIncDec }}</option>
|
<option value="federation-instances">{{ $ts._charts.federationInstancesIncDec }}</option>
|
||||||
<option value="federation-instances-total">{{ $ts._charts.federationInstancesTotal }}</option>
|
<option value="federation-instances-total">{{ $ts._charts.federationInstancesTotal }}</option>
|
||||||
@ -24,7 +24,7 @@
|
|||||||
<option value="drive-total">{{ $ts._charts.storageUsageTotal }}</option>
|
<option value="drive-total">{{ $ts._charts.storageUsageTotal }}</option>
|
||||||
</optgroup>
|
</optgroup>
|
||||||
</MkSelect>
|
</MkSelect>
|
||||||
<MkSelect v-model:value="chartSpan" style="margin: 0;">
|
<MkSelect v-model="chartSpan" style="margin: 0;">
|
||||||
<option value="hour">{{ $ts.perHour }}</option>
|
<option value="hour">{{ $ts.perHour }}</option>
|
||||||
<option value="day">{{ $ts.perDay }}</option>
|
<option value="day">{{ $ts.perDay }}</option>
|
||||||
</MkSelect>
|
</MkSelect>
|
||||||
|
@ -36,7 +36,7 @@
|
|||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { defineComponent } from 'vue';
|
import { defineComponent } from 'vue';
|
||||||
import MkModal from '@client/components/ui/modal.vue';
|
import MkModal from '@client/components/ui/modal.vue';
|
||||||
import { sidebarDef } from '@client/sidebar';
|
import { menuDef } from '@client/menu';
|
||||||
import { instanceName } from '@client/config';
|
import { instanceName } from '@client/config';
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
@ -48,7 +48,7 @@ export default defineComponent({
|
|||||||
|
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
menuDef: sidebarDef,
|
menuDef: menuDef,
|
||||||
items: [],
|
items: [],
|
||||||
instanceName,
|
instanceName,
|
||||||
};
|
};
|
||||||
|
@ -87,8 +87,6 @@ export default defineComponent({
|
|||||||
> .icon {
|
> .icon {
|
||||||
padding-left: 2px;
|
padding-left: 2px;
|
||||||
font-size: .9em;
|
font-size: .9em;
|
||||||
font-weight: 400;
|
|
||||||
font-style: normal;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
238
src/client/components/media-caption.vue
Normal file
238
src/client/components/media-caption.vue
Normal file
@ -0,0 +1,238 @@
|
|||||||
|
<template>
|
||||||
|
<MkModal ref="modal" @click="done(true)" @closed="$emit('closed')">
|
||||||
|
<div class="container">
|
||||||
|
<div class="fullwidth top-caption">
|
||||||
|
<div class="mk-dialog">
|
||||||
|
<header v-if="title"><Mfm :text="title"/></header>
|
||||||
|
<textarea autofocus v-model="inputValue" :placeholder="input.placeholder" @keydown="onInputKeydown"></textarea>
|
||||||
|
<div class="buttons" v-if="(showOkButton || showCancelButton)">
|
||||||
|
<MkButton inline @click="ok" primary>{{ $ts.ok }}</MkButton>
|
||||||
|
<MkButton inline @click="cancel" >{{ $ts.cancel }}</MkButton>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="hdrwpsaf fullwidth">
|
||||||
|
<header>{{ image.name }}</header>
|
||||||
|
<img :src="image.url" :alt="image.comment" :title="image.comment" @click="$refs.modal.close()"/>
|
||||||
|
<footer>
|
||||||
|
<span>{{ image.type }}</span>
|
||||||
|
<span>{{ bytes(image.size) }}</span>
|
||||||
|
<span v-if="image.properties && image.properties.width">{{ number(image.properties.width) }}px × {{ number(image.properties.height) }}px</span>
|
||||||
|
</footer>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</MkModal>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts">
|
||||||
|
import { defineComponent } from 'vue';
|
||||||
|
import MkModal from '@client/components/ui/modal.vue';
|
||||||
|
import MkButton from '@client/components/ui/button.vue';
|
||||||
|
import bytes from '@client/filters/bytes';
|
||||||
|
import number from '@client/filters/number';
|
||||||
|
|
||||||
|
export default defineComponent({
|
||||||
|
components: {
|
||||||
|
MkModal,
|
||||||
|
MkButton,
|
||||||
|
},
|
||||||
|
|
||||||
|
props: {
|
||||||
|
image: {
|
||||||
|
type: Object,
|
||||||
|
required: true,
|
||||||
|
},
|
||||||
|
title: {
|
||||||
|
type: String,
|
||||||
|
required: false
|
||||||
|
},
|
||||||
|
input: {
|
||||||
|
required: true
|
||||||
|
},
|
||||||
|
showOkButton: {
|
||||||
|
type: Boolean,
|
||||||
|
default: true
|
||||||
|
},
|
||||||
|
showCancelButton: {
|
||||||
|
type: Boolean,
|
||||||
|
default: true
|
||||||
|
},
|
||||||
|
cancelableByBgClick: {
|
||||||
|
type: Boolean,
|
||||||
|
default: true
|
||||||
|
},
|
||||||
|
},
|
||||||
|
|
||||||
|
emits: ['done', 'closed'],
|
||||||
|
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
inputValue: this.input.default ? this.input.default : null
|
||||||
|
};
|
||||||
|
},
|
||||||
|
|
||||||
|
mounted() {
|
||||||
|
document.addEventListener('keydown', this.onKeydown);
|
||||||
|
},
|
||||||
|
|
||||||
|
beforeUnmount() {
|
||||||
|
document.removeEventListener('keydown', this.onKeydown);
|
||||||
|
},
|
||||||
|
|
||||||
|
methods: {
|
||||||
|
bytes,
|
||||||
|
number,
|
||||||
|
|
||||||
|
done(canceled, result?) {
|
||||||
|
this.$emit('done', { canceled, result });
|
||||||
|
this.$refs.modal.close();
|
||||||
|
},
|
||||||
|
|
||||||
|
async ok() {
|
||||||
|
if (!this.showOkButton) return;
|
||||||
|
|
||||||
|
const result = this.inputValue;
|
||||||
|
this.done(false, result);
|
||||||
|
},
|
||||||
|
|
||||||
|
cancel() {
|
||||||
|
this.done(true);
|
||||||
|
},
|
||||||
|
|
||||||
|
onBgClick() {
|
||||||
|
if (this.cancelableByBgClick) {
|
||||||
|
this.cancel();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
onKeydown(e) {
|
||||||
|
if (e.which === 27) { // ESC
|
||||||
|
this.cancel();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
onInputKeydown(e) {
|
||||||
|
if (e.which === 13) { // Enter
|
||||||
|
if (e.ctrlKey) {
|
||||||
|
e.preventDefault();
|
||||||
|
e.stopPropagation();
|
||||||
|
this.ok();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
.container {
|
||||||
|
display: flex;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
flex-direction: row;
|
||||||
|
}
|
||||||
|
@media (max-width: 850px) {
|
||||||
|
.container {
|
||||||
|
flex-direction: column;
|
||||||
|
}
|
||||||
|
.top-caption {
|
||||||
|
padding-bottom: 8px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.fullwidth {
|
||||||
|
width: 100%;
|
||||||
|
margin: auto;
|
||||||
|
}
|
||||||
|
.mk-dialog {
|
||||||
|
position: relative;
|
||||||
|
padding: 32px;
|
||||||
|
min-width: 320px;
|
||||||
|
max-width: 480px;
|
||||||
|
box-sizing: border-box;
|
||||||
|
text-align: center;
|
||||||
|
background: var(--panel);
|
||||||
|
border-radius: var(--radius);
|
||||||
|
margin: auto;
|
||||||
|
|
||||||
|
> header {
|
||||||
|
margin: 0 0 8px 0;
|
||||||
|
font-weight: bold;
|
||||||
|
font-size: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
> .buttons {
|
||||||
|
margin-top: 16px;
|
||||||
|
|
||||||
|
> * {
|
||||||
|
margin: 0 8px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
> textarea {
|
||||||
|
display: block;
|
||||||
|
box-sizing: border-box;
|
||||||
|
padding: 0 24px;
|
||||||
|
margin: 0;
|
||||||
|
width: 100%;
|
||||||
|
font-size: 16px;
|
||||||
|
border: none;
|
||||||
|
border-radius: 0;
|
||||||
|
background: transparent;
|
||||||
|
color: var(--fg);
|
||||||
|
font-family: inherit;
|
||||||
|
max-width: 100%;
|
||||||
|
min-width: 100%;
|
||||||
|
min-height: 90px;
|
||||||
|
|
||||||
|
&:focus {
|
||||||
|
outline: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
&:disabled {
|
||||||
|
opacity: 0.5;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.hdrwpsaf {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
height: 100%;
|
||||||
|
|
||||||
|
> header,
|
||||||
|
> footer {
|
||||||
|
align-self: center;
|
||||||
|
display: inline-block;
|
||||||
|
padding: 6px 9px;
|
||||||
|
font-size: 90%;
|
||||||
|
background: rgba(0, 0, 0, 0.5);
|
||||||
|
border-radius: 6px;
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
|
||||||
|
> header {
|
||||||
|
margin-bottom: 8px;
|
||||||
|
opacity: 0.9;
|
||||||
|
}
|
||||||
|
|
||||||
|
> img {
|
||||||
|
display: block;
|
||||||
|
flex: 1;
|
||||||
|
min-height: 0;
|
||||||
|
object-fit: contain;
|
||||||
|
width: 100%;
|
||||||
|
cursor: zoom-out;
|
||||||
|
image-orientation: from-image;
|
||||||
|
}
|
||||||
|
|
||||||
|
> footer {
|
||||||
|
margin-top: 8px;
|
||||||
|
opacity: 0.8;
|
||||||
|
|
||||||
|
> span + span {
|
||||||
|
margin-left: 0.5em;
|
||||||
|
padding-left: 0.5em;
|
||||||
|
border-left: solid 1px rgba(255, 255, 255, 0.5);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
@ -1,6 +1,6 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="qjewsnkg" v-if="hide" @click="hide = false">
|
<div class="qjewsnkg" v-if="hide" @click="hide = false">
|
||||||
<ImgWithBlurhash class="bg" :hash="image.blurhash" :title="image.name"/>
|
<ImgWithBlurhash class="bg" :hash="image.blurhash" :title="image.comment" :alt="image.comment"/>
|
||||||
<div class="text">
|
<div class="text">
|
||||||
<div>
|
<div>
|
||||||
<b><i class="fas fa-exclamation-triangle"></i> {{ $ts.sensitive }}</b>
|
<b><i class="fas fa-exclamation-triangle"></i> {{ $ts.sensitive }}</b>
|
||||||
@ -14,7 +14,7 @@
|
|||||||
:title="image.name"
|
:title="image.name"
|
||||||
@click.prevent="onClick"
|
@click.prevent="onClick"
|
||||||
>
|
>
|
||||||
<ImgWithBlurhash :hash="image.blurhash" :src="url" :alt="image.name" :title="image.name" :cover="false"/>
|
<ImgWithBlurhash :hash="image.blurhash" :src="url" :alt="image.comment" :title="image.comment" :cover="false"/>
|
||||||
<div class="gif" v-if="image.type === 'image/gif'">GIF</div>
|
<div class="gif" v-if="image.type === 'image/gif'">GIF</div>
|
||||||
</a>
|
</a>
|
||||||
<i class="fas fa-eye-slash" @click="hide = true"></i>
|
<i class="fas fa-eye-slash" @click="hide = true"></i>
|
||||||
|
@ -9,7 +9,6 @@
|
|||||||
<video
|
<video
|
||||||
:poster="video.thumbnailUrl"
|
:poster="video.thumbnailUrl"
|
||||||
:title="video.name"
|
:title="video.name"
|
||||||
crossorigin="anonymous"
|
|
||||||
preload="none"
|
preload="none"
|
||||||
controls
|
controls
|
||||||
>
|
>
|
||||||
|
@ -165,6 +165,10 @@ export default defineComponent({
|
|||||||
class: '_mfm_blur_',
|
class: '_mfm_blur_',
|
||||||
}, genEl(token.children));
|
}, genEl(token.children));
|
||||||
}
|
}
|
||||||
|
case 'rainbow': {
|
||||||
|
style = this.$store.state.animatedMfm ? 'animation: mfm-rainbow 1s linear infinite;' : '';
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (style == null) {
|
if (style == null) {
|
||||||
return h('span', {}, ['[', token.props.name, ...genEl(token.children), ']']);
|
return h('span', {}, ['[', token.props.name, ...genEl(token.children), ']']);
|
||||||
|
@ -1,13 +1,10 @@
|
|||||||
<template>
|
<template>
|
||||||
<MkModal ref="modal" @click="$emit('click')" @closed="$emit('closed')">
|
<MkModal ref="modal" @click="$emit('click')" @closed="$emit('closed')">
|
||||||
<div class="hrmcaedk _popup _narrow_" :style="{ width: `${width}px`, height: (height ? `min(${height}px, 100%)` : '100%') }">
|
<div class="hrmcaedk _window _narrow_" :style="{ width: `${width}px`, height: (height ? `min(${height}px, 100%)` : '100%') }">
|
||||||
<div class="header" @contextmenu="onContextmenu">
|
<div class="header" @contextmenu="onContextmenu">
|
||||||
<button class="_button" @click="back()" v-if="history.length > 0"><i class="fas fa-chevron-left"></i></button>
|
|
||||||
<button class="_button" style="pointer-events: none;" v-else><!-- マージンのバランスを取るためのダミー --></button>
|
|
||||||
<span class="title">
|
<span class="title">
|
||||||
<XHeader :info="pageInfo" :with-back="false"/>
|
<XHeader :info="pageInfo" :back-button="history.length > 0" @back="back()" :close-button="true" @close="$refs.modal.close()"/>
|
||||||
</span>
|
</span>
|
||||||
<button class="_button" @click="$refs.modal.close()"><i class="fas fa-times"></i></button>
|
|
||||||
</div>
|
</div>
|
||||||
<div class="body _flat_">
|
<div class="body _flat_">
|
||||||
<keep-alive>
|
<keep-alive>
|
||||||
@ -177,35 +174,19 @@ export default defineComponent({
|
|||||||
flex-shrink: 0;
|
flex-shrink: 0;
|
||||||
box-shadow: 0px 1px var(--divider);
|
box-shadow: 0px 1px var(--divider);
|
||||||
|
|
||||||
> button {
|
|
||||||
height: $height;
|
|
||||||
width: $height;
|
|
||||||
|
|
||||||
@media (max-width: 500px) {
|
|
||||||
height: $height-narrow;
|
|
||||||
width: $height-narrow;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
> .title {
|
> .title {
|
||||||
flex: 1;
|
flex: 1;
|
||||||
line-height: $height;
|
height: $height;
|
||||||
padding-left: 32px;
|
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
white-space: nowrap;
|
white-space: nowrap;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
text-overflow: ellipsis;
|
text-overflow: ellipsis;
|
||||||
pointer-events: none;
|
|
||||||
|
|
||||||
@media (max-width: 500px) {
|
@media (max-width: 500px) {
|
||||||
line-height: $height-narrow;
|
height: $height-narrow;
|
||||||
padding-left: 16px;
|
padding-left: 16px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
> button + .title {
|
|
||||||
padding-left: 0;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
> .body {
|
> .body {
|
||||||
|
@ -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,21 @@ export default defineComponent({
|
|||||||
.fade-leave-to {
|
.fade-leave-to {
|
||||||
opacity: 0;
|
opacity: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.giivymft {
|
||||||
|
&.noGap {
|
||||||
|
> .notes {
|
||||||
|
background: var(--panel);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&:not(.noGap) {
|
||||||
|
> .notes {
|
||||||
|
.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.useSharedConnection('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));
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
@ -12,28 +12,30 @@
|
|||||||
<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>
|
||||||
|
|
||||||
<button class="_buttonPrimary" v-appear="$store.state.enableInfiniteScroll ? fetchMore : null" @click="fetchMore" v-show="more" :disabled="moreFetching" :style="{ cursor: moreFetching ? 'wait' : 'pointer' }">
|
<MkButton primary style="margin: var(--margin) auto;" v-appear="$store.state.enableInfiniteScroll ? fetchMore : null" @click="fetchMore" v-show="more" :disabled="moreFetching" :style="{ cursor: moreFetching ? 'wait' : 'pointer' }">
|
||||||
<template v-if="!moreFetching">{{ $ts.loadMore }}</template>
|
<template v-if="!moreFetching">{{ $ts.loadMore }}</template>
|
||||||
<template v-if="moreFetching"><MkLoading inline/></template>
|
<template v-if="moreFetching"><MkLoading inline/></template>
|
||||||
</button>
|
</MkButton>
|
||||||
</div>
|
</div>
|
||||||
</transition>
|
</transition>
|
||||||
</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';
|
||||||
import XNote from './note.vue';
|
import XNote from './note.vue';
|
||||||
import { notificationTypes } from '../../types';
|
import { notificationTypes } from '../../types';
|
||||||
import * as os from '@client/os';
|
import * as os from '@client/os';
|
||||||
|
import MkButton from '@client/components/ui/button.vue';
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
components: {
|
components: {
|
||||||
XNotification,
|
XNotification,
|
||||||
XList,
|
XList,
|
||||||
XNote,
|
XNote,
|
||||||
|
MkButton,
|
||||||
},
|
},
|
||||||
|
|
||||||
mixins: [
|
mixins: [
|
||||||
@ -87,7 +89,7 @@ export default defineComponent({
|
|||||||
},
|
},
|
||||||
|
|
||||||
mounted() {
|
mounted() {
|
||||||
this.connection = os.stream.useSharedConnection('main');
|
this.connection = markRaw(os.stream.useChannel('main'));
|
||||||
this.connection.on('notification', this.onNotification);
|
this.connection.on('notification', this.onNotification);
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@ -16,7 +16,7 @@
|
|||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { defineComponent } from 'vue';
|
import { defineComponent } from 'vue';
|
||||||
import { userName } from '../filters/user';
|
import { userName } from '@client/filters/user';
|
||||||
import * as os from '@client/os';
|
import * as os from '@client/os';
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
|
@ -3,16 +3,12 @@
|
|||||||
:initial-width="500"
|
:initial-width="500"
|
||||||
:initial-height="500"
|
:initial-height="500"
|
||||||
:can-resize="true"
|
:can-resize="true"
|
||||||
:close-right="true"
|
:close-button="false"
|
||||||
:contextmenu="contextmenu"
|
:contextmenu="contextmenu"
|
||||||
@closed="$emit('closed')"
|
@closed="$emit('closed')"
|
||||||
>
|
>
|
||||||
<template #header>
|
<template #header>
|
||||||
<XHeader :info="pageInfo" :with-back="false"/>
|
<XHeader :info="pageInfo" :back-button="history.length > 0" @back="back()" :close-button="true" @close="close()"/>
|
||||||
</template>
|
|
||||||
<template #buttons>
|
|
||||||
<button class="_button" @click="back()" v-if="history.length > 0"><i class="fas fa-chevron-left"></i></button>
|
|
||||||
<button class="_button" style="pointer-events: none;" v-else><!-- マージンのバランスを取るためのダミー --></button>
|
|
||||||
</template>
|
</template>
|
||||||
<div class="yrolvcoq _flat_">
|
<div class="yrolvcoq _flat_">
|
||||||
<component :is="component" v-bind="props" :ref="changePage"/>
|
<component :is="component" v-bind="props" :ref="changePage"/>
|
||||||
@ -139,6 +135,10 @@ export default defineComponent({
|
|||||||
this.navigate(this.history.pop(), false);
|
this.navigate(this.history.pop(), false);
|
||||||
},
|
},
|
||||||
|
|
||||||
|
close() {
|
||||||
|
this.$refs.window.close();
|
||||||
|
},
|
||||||
|
|
||||||
expand() {
|
expand() {
|
||||||
this.$router.push(this.path);
|
this.$router.push(this.path);
|
||||||
this.$refs.window.close();
|
this.$refs.window.close();
|
||||||
@ -155,6 +155,5 @@ export default defineComponent({
|
|||||||
<style lang="scss" scoped>
|
<style lang="scss" scoped>
|
||||||
.yrolvcoq {
|
.yrolvcoq {
|
||||||
min-height: 100%;
|
min-height: 100%;
|
||||||
background: var(--bg);
|
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
@ -1,6 +1,8 @@
|
|||||||
<template>
|
<template>
|
||||||
<div>
|
<div>
|
||||||
<MkInput class="kudkigyw" :value="value" @update:value="updateValue($event)" type="number">{{ hpml.interpolate(block.text) }}</MkInput>
|
<MkInput class="kudkigyw" :model-value="value" @update:modelValue="updateValue($event)" type="number">
|
||||||
|
<template #label>{{ hpml.interpolate(block.text) }}</template>
|
||||||
|
</MkInput>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="ngbfujlo">
|
<div class="ngbfujlo">
|
||||||
<MkTextarea :value="text" readonly style="margin: 0;"></MkTextarea>
|
<MkTextarea :model-value="text" readonly style="margin: 0;"></MkTextarea>
|
||||||
<MkButton class="button" primary @click="post()" :disabled="posting || posted">
|
<MkButton class="button" primary @click="post()" :disabled="posting || posted">
|
||||||
<i v-if="posted" class="fas fa-check"></i>
|
<i v-if="posted" class="fas fa-check"></i>
|
||||||
<i v-else class="fas fa-paper-plane"></i>
|
<i v-else class="fas fa-paper-plane"></i>
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="hkcxmtwj">
|
<div class="hkcxmtwj">
|
||||||
<MkSwitch :value="value" @update:value="updateValue($event)">{{ hpml.interpolate(block.text) }}</MkSwitch>
|
<MkSwitch :model-value="value" @update:modelValue="updateValue($event)">{{ hpml.interpolate(block.text) }}</MkSwitch>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
|
@ -1,6 +1,8 @@
|
|||||||
<template>
|
<template>
|
||||||
<div>
|
<div>
|
||||||
<MkInput class="kudkigyw" :value="value" @update:value="updateValue($event)" type="text">{{ hpml.interpolate(block.text) }}</MkInput>
|
<MkInput class="kudkigyw" :model-value="value" @update:modelValue="updateValue($event)" type="text">
|
||||||
|
<template #label>{{ hpml.interpolate(block.text) }}</template>
|
||||||
|
</MkInput>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
|
@ -1,6 +1,8 @@
|
|||||||
<template>
|
<template>
|
||||||
<div>
|
<div>
|
||||||
<MkTextarea :value="value" @update:value="updateValue($event)">{{ hpml.interpolate(block.text) }}</MkTextarea>
|
<MkTextarea :model-value="value" @update:modelValue="updateValue($event)">
|
||||||
|
<template #label>{{ hpml.interpolate(block.text) }}</template>
|
||||||
|
</MkTextarea>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
<template>
|
<template>
|
||||||
<MkTextarea :value="text" readonly></MkTextarea>
|
<MkTextarea :model-value="text" readonly></MkTextarea>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
|
@ -5,8 +5,7 @@
|
|||||||
</p>
|
</p>
|
||||||
<ul ref="choices">
|
<ul ref="choices">
|
||||||
<li v-for="(choice, i) in choices" :key="i">
|
<li v-for="(choice, i) in choices" :key="i">
|
||||||
<MkInput class="input" :value="choice" @update:value="onInput(i, $event)">
|
<MkInput class="input" :model-value="choice" @update:modelValue="onInput(i, $event)" :placeholder="$t('_poll.choiceN', { n: i + 1 })">
|
||||||
<span>{{ $t('_poll.choiceN', { n: i + 1 }) }}</span>
|
|
||||||
</MkInput>
|
</MkInput>
|
||||||
<button @click="remove(i)" class="_button">
|
<button @click="remove(i)" class="_button">
|
||||||
<i class="fas fa-times"></i>
|
<i class="fas fa-times"></i>
|
||||||
@ -16,27 +15,27 @@
|
|||||||
<MkButton class="add" v-if="choices.length < 10" @click="add">{{ $ts.add }}</MkButton>
|
<MkButton class="add" v-if="choices.length < 10" @click="add">{{ $ts.add }}</MkButton>
|
||||||
<MkButton class="add" v-else disabled>{{ $ts._poll.noMore }}</MkButton>
|
<MkButton class="add" v-else disabled>{{ $ts._poll.noMore }}</MkButton>
|
||||||
<section>
|
<section>
|
||||||
<MkSwitch v-model:value="multiple">{{ $ts._poll.canMultipleVote }}</MkSwitch>
|
<MkSwitch v-model="multiple">{{ $ts._poll.canMultipleVote }}</MkSwitch>
|
||||||
<div>
|
<div>
|
||||||
<MkSelect v-model:value="expiration">
|
<MkSelect v-model="expiration">
|
||||||
<template #label>{{ $ts._poll.expiration }}</template>
|
<template #label>{{ $ts._poll.expiration }}</template>
|
||||||
<option value="infinite">{{ $ts._poll.infinite }}</option>
|
<option value="infinite">{{ $ts._poll.infinite }}</option>
|
||||||
<option value="at">{{ $ts._poll.at }}</option>
|
<option value="at">{{ $ts._poll.at }}</option>
|
||||||
<option value="after">{{ $ts._poll.after }}</option>
|
<option value="after">{{ $ts._poll.after }}</option>
|
||||||
</MkSelect>
|
</MkSelect>
|
||||||
<section v-if="expiration === 'at'">
|
<section v-if="expiration === 'at'">
|
||||||
<MkInput v-model:value="atDate" type="date" class="input">
|
<MkInput v-model="atDate" type="date" class="input">
|
||||||
<span>{{ $ts._poll.deadlineDate }}</span>
|
<template #label>{{ $ts._poll.deadlineDate }}</template>
|
||||||
</MkInput>
|
</MkInput>
|
||||||
<MkInput v-model:value="atTime" type="time" class="input">
|
<MkInput v-model="atTime" type="time" class="input">
|
||||||
<span>{{ $ts._poll.deadlineTime }}</span>
|
<template #label>{{ $ts._poll.deadlineTime }}</template>
|
||||||
</MkInput>
|
</MkInput>
|
||||||
</section>
|
</section>
|
||||||
<section v-if="expiration === 'after'">
|
<section v-if="expiration === 'after'">
|
||||||
<MkInput v-model:value="after" type="number" class="input">
|
<MkInput v-model="after" type="number" class="input">
|
||||||
<span>{{ $ts._poll.duration }}</span>
|
<template #label>{{ $ts._poll.duration }}</template>
|
||||||
</MkInput>
|
</MkInput>
|
||||||
<MkSelect v-model:value="unit">
|
<MkSelect v-model="unit">
|
||||||
<option value="second">{{ $ts._time.second }}</option>
|
<option value="second">{{ $ts._time.second }}</option>
|
||||||
<option value="minute">{{ $ts._time.minute }}</option>
|
<option value="minute">{{ $ts._time.minute }}</option>
|
||||||
<option value="hour">{{ $ts._time.hour }}</option>
|
<option value="hour">{{ $ts._time.hour }}</option>
|
||||||
|
@ -10,7 +10,7 @@
|
|||||||
</span>
|
</span>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
<p>
|
<p v-if="!readOnly">
|
||||||
<span>{{ $t('_poll.totalVotes', { n: total }) }}</span>
|
<span>{{ $t('_poll.totalVotes', { n: total }) }}</span>
|
||||||
<span> · </span>
|
<span> · </span>
|
||||||
<a v-if="!closed && !isVoted" @click="toggleShowResult">{{ showResult ? $ts._poll.vote : $ts._poll.showResult }}</a>
|
<a v-if="!closed && !isVoted" @click="toggleShowResult">{{ showResult ? $ts._poll.vote : $ts._poll.showResult }}</a>
|
||||||
@ -31,6 +31,11 @@ export default defineComponent({
|
|||||||
note: {
|
note: {
|
||||||
type: Object,
|
type: Object,
|
||||||
required: true
|
required: true
|
||||||
|
},
|
||||||
|
readOnly: {
|
||||||
|
type: Boolean,
|
||||||
|
required: false,
|
||||||
|
default: false,
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
data() {
|
data() {
|
||||||
@ -65,7 +70,7 @@ export default defineComponent({
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
created() {
|
created() {
|
||||||
this.showResult = this.isVoted;
|
this.showResult = this.readOnly || this.isVoted;
|
||||||
|
|
||||||
if (this.note.poll.expiresAt) {
|
if (this.note.poll.expiresAt) {
|
||||||
const update = () => {
|
const update = () => {
|
||||||
@ -83,7 +88,7 @@ export default defineComponent({
|
|||||||
this.showResult = !this.showResult;
|
this.showResult = !this.showResult;
|
||||||
},
|
},
|
||||||
vote(id) {
|
vote(id) {
|
||||||
if (this.closed || !this.poll.multiple && this.poll.choices.some(c => c.isVoted)) return;
|
if (this.readOnly || this.closed || !this.poll.multiple && this.poll.choices.some(c => c.isVoted)) return;
|
||||||
os.api('notes/polls/vote', {
|
os.api('notes/polls/vote', {
|
||||||
noteId: this.note.id,
|
noteId: this.note.id,
|
||||||
choice: id
|
choice: id
|
||||||
|
@ -89,9 +89,30 @@ export default defineComponent({
|
|||||||
file.name = result;
|
file.name = result;
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
|
async describe(file) {
|
||||||
|
os.popup(import("@client/components/media-caption.vue"), {
|
||||||
|
title: this.$ts.describeFile,
|
||||||
|
input: {
|
||||||
|
placeholder: this.$ts.inputNewDescription,
|
||||||
|
default: file.comment !== null ? file.comment : "",
|
||||||
|
},
|
||||||
|
image: file
|
||||||
|
}, {
|
||||||
|
done: result => {
|
||||||
|
if (!result || result.canceled) return;
|
||||||
|
let comment = result.result;
|
||||||
|
os.api('drive/files/update', {
|
||||||
|
fileId: file.id,
|
||||||
|
comment: comment.length == 0 ? null : comment
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}, 'closed');
|
||||||
|
},
|
||||||
|
|
||||||
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) }
|
||||||
@ -99,6 +120,10 @@ export default defineComponent({
|
|||||||
text: file.isSensitive ? this.$ts.unmarkAsSensitive : this.$ts.markAsSensitive,
|
text: file.isSensitive ? this.$ts.unmarkAsSensitive : this.$ts.markAsSensitive,
|
||||||
icon: file.isSensitive ? 'fas fa-eye-slash' : 'fas fa-eye',
|
icon: file.isSensitive ? 'fas fa-eye-slash' : 'fas fa-eye',
|
||||||
action: () => { this.toggleSensitive(file) }
|
action: () => { this.toggleSensitive(file) }
|
||||||
|
}, {
|
||||||
|
text: this.$ts.describeFile,
|
||||||
|
icon: 'fas fa-i-cursor',
|
||||||
|
action: () => { this.describe(file) }
|
||||||
}, {
|
}, {
|
||||||
text: this.$ts.attachCancel,
|
text: this.$ts.attachCancel,
|
||||||
icon: 'fas fa-times-circle',
|
icon: 'fas fa-times-circle',
|
||||||
|
@ -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>
|
||||||
@ -61,16 +66,17 @@ import * as mfm from 'mfm-js';
|
|||||||
import { host, url } from '@client/config';
|
import { host, url } from '@client/config';
|
||||||
import { erase, unique } from '../../prelude/array';
|
import { erase, unique } from '../../prelude/array';
|
||||||
import { extractMentions } from '@/misc/extract-mentions';
|
import { extractMentions } from '@/misc/extract-mentions';
|
||||||
import getAcct from '@/misc/acct/render';
|
import { getAcct } from '@/misc/acct';
|
||||||
import { formatTimeString } from '@/misc/format-time-string';
|
import { formatTimeString } from '@/misc/format-time-string';
|
||||||
import { Autocomplete } from '@client/scripts/autocomplete';
|
import { Autocomplete } from '@client/scripts/autocomplete';
|
||||||
import { noteVisibilities } from '../../types';
|
import { noteVisibilities } from '../../types';
|
||||||
import * as os from '@client/os';
|
import * as os from '@client/os';
|
||||||
import { selectFile } from '@client/scripts/select-file';
|
import { selectFile } from '@client/scripts/select-file';
|
||||||
import { notePostInterruptors, postFormActions } from '@client/store';
|
import { defaultStore, notePostInterruptors, postFormActions } from '@client/store';
|
||||||
import { isMobile } from '@client/scripts/is-mobile';
|
import { isMobile } from '@client/scripts/is-mobile';
|
||||||
import { throttle } from 'throttle-debounce';
|
import { throttle } from 'throttle-debounce';
|
||||||
import MkInfo from '@client/components/ui/info.vue';
|
import MkInfo from '@client/components/ui/info.vue';
|
||||||
|
import { defaultStore } from '@client/store';
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
components: {
|
components: {
|
||||||
@ -212,7 +218,10 @@ export default defineComponent({
|
|||||||
|
|
||||||
max(): number {
|
max(): number {
|
||||||
return this.$instance ? this.$instance.maxNoteTextLength : 1000;
|
return this.$instance ? this.$instance.maxNoteTextLength : 1000;
|
||||||
}
|
},
|
||||||
|
|
||||||
|
withHashtags: defaultStore.makeGetterSetter('postFormWithHashtags'),
|
||||||
|
hashtags: defaultStore.makeGetterSetter('postFormHashtags'),
|
||||||
},
|
},
|
||||||
|
|
||||||
watch: {
|
watch: {
|
||||||
@ -303,6 +312,7 @@ export default defineComponent({
|
|||||||
// TODO: detach when unmount
|
// TODO: detach when unmount
|
||||||
new Autocomplete(this.$refs.text, this, { model: 'text' });
|
new Autocomplete(this.$refs.text, this, { model: 'text' });
|
||||||
new Autocomplete(this.$refs.cw, this, { model: 'cw' });
|
new Autocomplete(this.$refs.cw, this, { model: 'cw' });
|
||||||
|
new Autocomplete(this.$refs.hashtags, this, { model: 'hashtags' });
|
||||||
|
|
||||||
this.$nextTick(() => {
|
this.$nextTick(() => {
|
||||||
// 書きかけの投稿を復元
|
// 書きかけの投稿を復元
|
||||||
@ -605,6 +615,11 @@ export default defineComponent({
|
|||||||
viaMobile: isMobile
|
viaMobile: isMobile
|
||||||
};
|
};
|
||||||
|
|
||||||
|
if (this.withHashtags && 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 +633,8 @@ export default defineComponent({
|
|||||||
this.$nextTick(() => {
|
this.$nextTick(() => {
|
||||||
this.deleteDraft();
|
this.deleteDraft();
|
||||||
this.$emit('posted');
|
this.$emit('posted');
|
||||||
if (this.text && this.text != '') {
|
if (data.text && data.text != '') {
|
||||||
const hashtags = mfm.parse(this.text).filter(x => x.type === 'hashtag').map(x => x.props.hashtag);
|
const hashtags = mfm.parse(data.text).filter(x => x.type === 'hashtag').map(x => x.props.hashtag);
|
||||||
const history = JSON.parse(localStorage.getItem('hashtags') || '[]') as string[];
|
const history = JSON.parse(localStorage.getItem('hashtags') || '[]') as string[];
|
||||||
localStorage.setItem('hashtags', JSON.stringify(unique(hashtags.concat(history))));
|
localStorage.setItem('hashtags', JSON.stringify(unique(hashtags.concat(history))));
|
||||||
}
|
}
|
||||||
@ -649,7 +664,7 @@ export default defineComponent({
|
|||||||
},
|
},
|
||||||
|
|
||||||
showActions(ev) {
|
showActions(ev) {
|
||||||
os.modalMenu(postFormActions.map(action => ({
|
os.popupMenu(postFormActions.map(action => ({
|
||||||
text: action.title,
|
text: action.title,
|
||||||
action: () => {
|
action: () => {
|
||||||
action.handler({
|
action.handler({
|
||||||
@ -785,6 +800,7 @@ export default defineComponent({
|
|||||||
}
|
}
|
||||||
|
|
||||||
> .cw,
|
> .cw,
|
||||||
|
> .hashtags,
|
||||||
> .text {
|
> .text {
|
||||||
display: block;
|
display: block;
|
||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
@ -813,6 +829,13 @@ export default defineComponent({
|
|||||||
border-bottom: solid 0.5px var(--divider);
|
border-bottom: solid 0.5px var(--divider);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
> .hashtags {
|
||||||
|
z-index: 1;
|
||||||
|
padding-top: 8px;
|
||||||
|
padding-bottom: 8px;
|
||||||
|
border-top: solid 0.5px var(--divider);
|
||||||
|
}
|
||||||
|
|
||||||
> .text {
|
> .text {
|
||||||
max-width: 100%;
|
max-width: 100%;
|
||||||
min-width: 100%;
|
min-width: 100%;
|
||||||
@ -872,6 +895,7 @@ export default defineComponent({
|
|||||||
}
|
}
|
||||||
|
|
||||||
> .cw,
|
> .cw,
|
||||||
|
> .hashtags,
|
||||||
> .text {
|
> .text {
|
||||||
padding: 0 16px;
|
padding: 0 16px;
|
||||||
}
|
}
|
||||||
|
@ -170,7 +170,7 @@ export default defineComponent({
|
|||||||
}
|
}
|
||||||
|
|
||||||
> span {
|
> span {
|
||||||
color: #fff;
|
color: var(--fgOnAccent);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user