Compare commits
76 Commits
Author | SHA1 | Date | |
---|---|---|---|
1a2a190828 | |||
251cf1d76f | |||
52774bbe64 | |||
68a6758302 | |||
13e43a4f74 | |||
b7d62d09ec | |||
321ec18173 | |||
a44ac3306e | |||
951288ecf0 | |||
cc8a7dd588 | |||
813c52f51e | |||
be3298639d | |||
e8d2959717 | |||
e7680e08eb | |||
bd792d7661 | |||
4920983f23 | |||
2756f553c6 | |||
fc52e95ad0 | |||
5d1d6bc028 | |||
b106acac91 | |||
a5071db864 | |||
bae874eb45 | |||
60da17940d | |||
385eeed732 | |||
2e908758d8 | |||
a164f8ad95 | |||
372138dfea | |||
922a657c7e | |||
3409a51cca | |||
7174a55846 | |||
6656a59402 | |||
7612ead551 | |||
fa78fe665d | |||
c89aa7eb95 | |||
43f4c5b7cd | |||
2b6c566386 | |||
91ef328b6b | |||
5a9d9dc41d | |||
a48e503caa | |||
fe00cb9ad5 | |||
ed0fdaddbd | |||
893795a31d | |||
f1047f1ce5 | |||
9beddc941a | |||
3a6a01d2d6 | |||
e0e4bdbdbc | |||
b3daf79b6a | |||
81aa21915b | |||
5aadd80243 | |||
23350b1cbc | |||
daff0977cb | |||
c1e7d56ff8 | |||
61aef56f83 | |||
249f591403 | |||
36599c82d1 | |||
7615b1ea0a | |||
d8de9f8eba | |||
8c0e65ce6f | |||
9aa24c0552 | |||
47bf06f432 | |||
99d291c71b | |||
d51cafca74 | |||
7921f8cd43 | |||
1b8467d5e5 | |||
e13b2689b5 | |||
9c167acbd9 | |||
1bc531edbd | |||
b4d0db9202 | |||
bd2b681367 | |||
f0edf81cc4 | |||
e81ac05ba6 | |||
6279ce8f22 | |||
0fd20cf588 | |||
f2d55e7f60 | |||
963b0db3d3 | |||
aeca115a37 |
30
CHANGELOG.md
30
CHANGELOG.md
@ -1,6 +1,36 @@
|
||||
ChangeLog
|
||||
=========
|
||||
|
||||
10.89.0
|
||||
----------
|
||||
* APIのエラーの形式を統一
|
||||
* APIドキュメント刷新
|
||||
* /api/v1/instance/peers 復活
|
||||
* 「返信が遷移後も残り続ける問題を修正」([9beddc9](https://github.com/syuilo/misskey/commit/9beddc941a716f1322ae0b7d71d159edd642a399)) によって遷移前に返信が表示されなくなった問題を修正
|
||||
* デッキモードにてユーザーのプロフィールを連続で見たとき、アクティビティや画像が前のユーザーのもののまま表示される問題を修正
|
||||
|
||||
10.88.0
|
||||
----------
|
||||
* アカウントの削除を試験的に実装
|
||||
* デッキでメディア投稿のみ表示するオプションが機能していない問題を修正
|
||||
* デッキでユーザーを表示したときにタイムラインが残存する問題を修正
|
||||
* モバイルのユーザーページで、ユーザーAのタイムラインから他のユーザーBを選択してユーザーBのタイムラインに移動したとき、ユーザーAのタイムラインが残る問題を修正
|
||||
* ハイライトでミュートしているユーザーの投稿が含まれる問題を修正
|
||||
* 「みつける」でミュートしているユーザーが含まれる問題を修正
|
||||
* デザインの調整
|
||||
|
||||
10.87.5
|
||||
----------
|
||||
* モバイル版でも連携サービスを表示するように
|
||||
* webfingerのacceptが反映されない問題を修正
|
||||
* 返信が遷移後も残り続ける問題を修正
|
||||
* デザインの調整
|
||||
|
||||
10.87.4
|
||||
----------
|
||||
* フォローリクエストを許可するときにエラーになる問題を修正
|
||||
* デザインの調整
|
||||
|
||||
10.87.3
|
||||
----------
|
||||
* 開発モードでビルドしてもスクリプトが404になる問題を修正
|
||||
|
12
README.md
12
README.md
@ -61,6 +61,14 @@ Organize and store your files! Want to post a picture you have already uploaded?
|
||||
|
||||
...and more! Experience Misskey with your own eyes at [misskey.xyz](https://misskey.xyz) or join one of the [other instances](https://joinmisskey.github.io/) that are available.
|
||||
|
||||
Screen shots
|
||||
----------------------------------------------------------------
|
||||
### Profile page
|
||||
<img src="/assets/ss/user.jpg" width="500px"/>
|
||||
|
||||
### Explore users
|
||||
<img src="/assets/ss/explore.jpg" width="500px"/>
|
||||
|
||||
:new: What's new
|
||||
----------------------------------------------------------------
|
||||
Please see the [Release notes](./CHANGELOG.md).
|
||||
@ -98,7 +106,6 @@ Please see the [Contribution Guide](./CONTRIBUTING.md).
|
||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/12913507/f7181eacafe8469a93033d85f5969c29/3?token-time=2145916800&token-hash=c8HeVqLtmdgH-gSBJg8i10gmOcwllM87MDHeznl3el0%3D" alt="Melilot" width="100"></td>
|
||||
<td><img src="https://c8.patreon.com/2/200/16869916" alt="見当かなみ" width="100"></td>
|
||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/12999811/5f349fafcce44dd1824a8b1ebbec4564/3?token-time=2145916800&token-hash=LtV2lRi3L2jOWMLwccr9qWYfPrFlzIo2jYZHKzHEb6k%3D" alt="Xeltica" width="100"></td>
|
||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/3384329/8b713330cb27404ea6e9fac50ff96efe/1?token-time=2145916800&token-hash=Ch3iF81ZGP0LMo894Y9ajpLisgtE91SnxtZE7fxsgrM%3D" alt="べすれい" width="100"></td>
|
||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/12021162/963128bb8d14476dbd8407943db8f31a/1?token-time=2145916800&token-hash=1FlxS9MEgmNGH_RHUVHbO5hIXB5I1z0lvA33CTvYvjA%3D" alt="gutfuckllc" width="100"></td>
|
||||
</tr><tr>
|
||||
<td><a href="https://www.patreon.com/weepjp">weep</a></td>
|
||||
@ -106,7 +113,6 @@ Please see the [Contribution Guide](./CONTRIBUTING.md).
|
||||
<td><a href="https://www.patreon.com/user?u=12913507">Melilot</a></td>
|
||||
<td><a href="https://www.patreon.com/user?u=16869916">見当かなみ</a></td>
|
||||
<td><a href="https://www.patreon.com/Xeltica">Xeltica</a></td>
|
||||
<td><a href="https://www.patreon.com/user?u=3384329">べすれい</a></td>
|
||||
<td><a href="https://www.patreon.com/gutfuckllc">gutfuckllc</a></td>
|
||||
</tr></table>
|
||||
<table><tr>
|
||||
@ -144,7 +150,7 @@ Please see the [Contribution Guide](./CONTRIBUTING.md).
|
||||
<td><a href="https://www.patreon.com/user?u=12531784">Takashi Shibuya</a></td>
|
||||
</tr></table>
|
||||
|
||||
**Last updated:** Fri, 15 Feb 2019 19:12:06 UTC
|
||||
**Last updated:** Thu, 21 Feb 2019 16:10:06 UTC
|
||||
<!-- PATREON_END -->
|
||||
|
||||
:four_leaf_clover: Copyright
|
||||
|
BIN
assets/api-doc.png
Normal file
BIN
assets/api-doc.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 5.9 KiB |
BIN
assets/ss/explore.jpg
Normal file
BIN
assets/ss/explore.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 238 KiB |
BIN
assets/ss/user.jpg
Normal file
BIN
assets/ss/user.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 148 KiB |
@ -55,14 +55,9 @@ As root:
|
||||
*6.* Build Misskey
|
||||
----------------------------------------------------------------
|
||||
|
||||
Before build, you need to set `NODE_ENV` to `production`. like this:
|
||||
* Linux: `export NODE_ENV=production`
|
||||
* Windows (PowerShell): `$env:NODE_ENV="production"`
|
||||
* Windows (CMD): `set NODE_ENV=production`
|
||||
|
||||
Build misskey with the following:
|
||||
|
||||
`npm run build`
|
||||
`NODE_ENV=production npm run build`
|
||||
|
||||
If you're on Debian, you will need to install the `build-essential`, `python` package.
|
||||
|
||||
@ -71,14 +66,14 @@ If you're still encountering errors about some modules, use node-gyp:
|
||||
1. `npm install -g node-gyp`
|
||||
2. `node-gyp configure`
|
||||
3. `node-gyp build`
|
||||
4. `npm run build`
|
||||
4. `NODE_ENV=production npm run build`
|
||||
|
||||
*7.* That is it.
|
||||
----------------------------------------------------------------
|
||||
Well done! Now, you have an environment that run to Misskey.
|
||||
|
||||
### Launch normally
|
||||
Just `npm start`. GLHF!
|
||||
Just `NODE_ENV=production npm start`. GLHF!
|
||||
|
||||
### Launch with systemd
|
||||
|
||||
@ -94,6 +89,7 @@ Type=simple
|
||||
User=misskey
|
||||
ExecStart=/usr/bin/npm start
|
||||
WorkingDirectory=/home/misskey/misskey
|
||||
Environment="NODE_ENV=production"
|
||||
TimeoutSec=60
|
||||
StandardOutput=syslog
|
||||
StandardError=syslog
|
||||
@ -113,7 +109,7 @@ You can check if the service is running with `systemctl status misskey`.
|
||||
1. `git fetch`
|
||||
2. `git checkout $(git tag -l | grep -v 'rc[0-9]*$' | sort -V | tail -n 1)`
|
||||
3. `npm install`
|
||||
4. `npm run build`
|
||||
4. `NODE_ENV=production npm run build`
|
||||
5. Check [ChangeLog](../CHANGELOG.md) for migration information
|
||||
6. Restart your Misskey process to apply changes
|
||||
7. Enjoy
|
||||
|
@ -57,7 +57,7 @@ En root :
|
||||
|
||||
Construisez Misskey comme ceci :
|
||||
|
||||
`npm run build`
|
||||
`NODE_ENV=production npm run build`
|
||||
|
||||
Si vous êtes sous Debian, vous serez amené à installer les paquets `build-essential` et `python`.
|
||||
|
||||
@ -66,14 +66,14 @@ Si vous rencontrez des erreurs concernant certains modules, utilisez node-gyp:
|
||||
1. `npm install -g node-gyp`
|
||||
2. `node-gyp configure`
|
||||
3. `node-gyp build`
|
||||
4. `npm run build`
|
||||
4. `NODE_ENV=production npm run build`
|
||||
|
||||
*7.* C'est tout.
|
||||
----------------------------------------------------------------
|
||||
Excellent ! Maintenant, vous avez un environnement prêt pour lancer Misskey
|
||||
|
||||
### Lancement conventionnel
|
||||
Lancez tout simplement `npm start`. Bonne chance et amusez-vous bien !
|
||||
Lancez tout simplement `NODE_ENV=production npm start`. Bonne chance et amusez-vous bien !
|
||||
|
||||
### Démarrage avec systemd
|
||||
|
||||
@ -89,6 +89,7 @@ Type=simple
|
||||
User=misskey
|
||||
ExecStart=/usr/bin/npm start
|
||||
WorkingDirectory=/home/misskey/misskey
|
||||
Environment="NODE_ENV=production"
|
||||
TimeoutSec=60
|
||||
StandardOutput=syslog
|
||||
StandardError=syslog
|
||||
@ -108,7 +109,7 @@ Vous pouvez vérifier si le service a démarré en utilisant la commande `system
|
||||
1. `git fetch`
|
||||
2. `git checkout $(git tag -l | grep -v 'rc[0-9]*$' | sort -V | tail -n 1)`
|
||||
3. `npm install`
|
||||
4. `npm run build`
|
||||
4. `NODE_ENV=production npm run build`
|
||||
5. Consultez [ChangeLog](../CHANGELOG.md) pour les information de migration.
|
||||
|
||||
----------------------------------------------------------------
|
||||
|
@ -62,14 +62,9 @@ adduser --disabled-password --disabled-login misskey
|
||||
*6.* Misskeyのビルド
|
||||
----------------------------------------------------------------
|
||||
|
||||
ビルドする前に、`NODE_ENV`を`production`にする必要があります。例:
|
||||
* Linux: `export NODE_ENV=production`
|
||||
* Windows (PowerShell): `$env:NODE_ENV="production"`
|
||||
* Windows (CMD): `set NODE_ENV=production`
|
||||
|
||||
次のコマンドでMisskeyをビルドしてください:
|
||||
|
||||
`npm run build`
|
||||
`NODE_ENV=production npm run build`
|
||||
|
||||
Debianをお使いであれば、`build-essential`パッケージをインストールする必要があります。
|
||||
|
||||
@ -77,14 +72,14 @@ Debianをお使いであれば、`build-essential`パッケージをインスト
|
||||
1. `npm install -g node-gyp`
|
||||
2. `node-gyp configure`
|
||||
3. `node-gyp build`
|
||||
4. `npm run build`
|
||||
4. `NODE_ENV=production npm run build`
|
||||
|
||||
*7.* 以上です!
|
||||
----------------------------------------------------------------
|
||||
お疲れ様でした。これでMisskeyを動かす準備は整いました。
|
||||
|
||||
### 通常起動
|
||||
`npm start`するだけです。GLHF!
|
||||
`NODE_ENV=production npm start`するだけです。GLHF!
|
||||
|
||||
### systemdを用いた起動
|
||||
1. systemdサービスのファイルを作成: `/etc/systemd/system/misskey.service`
|
||||
@ -99,6 +94,7 @@ Type=simple
|
||||
User=misskey
|
||||
ExecStart=/usr/bin/npm start
|
||||
WorkingDirectory=/home/misskey/misskey
|
||||
Environment="NODE_ENV=production"
|
||||
TimeoutSec=60
|
||||
StandardOutput=syslog
|
||||
StandardError=syslog
|
||||
@ -119,7 +115,7 @@ CentOSで1024以下のポートを使用してMisskeyを使用する場合は`Ex
|
||||
1. `git fetch`
|
||||
2. `git checkout $(git tag -l | grep -v 'rc[0-9]*$' | sort -V | tail -n 1)`
|
||||
3. `npm install`
|
||||
4. `npm run build`
|
||||
4. `NODE_ENV=production npm run build`
|
||||
5. [ChangeLog](../CHANGELOG.md)でマイグレーション情報を確認する
|
||||
|
||||
なにか問題が発生した場合は、`npm run clean`すると直る場合があります。
|
||||
|
@ -28,6 +28,8 @@ common:
|
||||
load-more: "もっと読み込む"
|
||||
enter-password: "パスワードを入力してください"
|
||||
2fa: "二段階認証"
|
||||
customize-home: "ホームをカスタマイズ"
|
||||
featured-notes: "ハイライト"
|
||||
got-it: "わかった"
|
||||
customization-tips:
|
||||
title: "カスタマイズのヒント"
|
||||
@ -56,6 +58,14 @@ common:
|
||||
trash: "ゴミ箱"
|
||||
drive: "ドライブ"
|
||||
messaging: "トーク"
|
||||
deck: "デッキ"
|
||||
timeline: "タイムライン"
|
||||
explore: "みつける"
|
||||
following: "フォロー中"
|
||||
followers: "フォロワー"
|
||||
empty-timeline-info:
|
||||
follow-users-to-make-your-timeline: "ユーザーをフォローすると投稿がタイムラインに表示されます。"
|
||||
explore: "ユーザーを探索する"
|
||||
weekday-short:
|
||||
sunday: "日"
|
||||
monday: "月"
|
||||
@ -134,6 +144,7 @@ common:
|
||||
is-remote-post: "この投稿情報はコピーです。"
|
||||
view-on-remote: "正確な情報を見る"
|
||||
renoted-by: "{user}がRenote"
|
||||
no-notes: "投稿がありません"
|
||||
error:
|
||||
title: "問題が発生しました"
|
||||
retry: "やり直す"
|
||||
@ -197,6 +208,17 @@ auth/views/index.vue:
|
||||
please-go-back: "アプリケーションに戻って、やっていってください。"
|
||||
error: "セッションが存在しません。"
|
||||
sign-in: "サインインしてください"
|
||||
common/views/pages/explore.vue:
|
||||
verified-users: "公式アカウント"
|
||||
popular-users: "人気のユーザー"
|
||||
recently-updated-users: "最近投稿したユーザー"
|
||||
recently-registered-users: "新規ユーザー"
|
||||
popular-tags: "人気のタグ"
|
||||
federated: "連合"
|
||||
explore: "{host}を探索"
|
||||
users-info: "現在{users}ユーザーが登録されています"
|
||||
common/views/components/user-list.vue:
|
||||
no-users: "ユーザーがいません"
|
||||
common/views/components/games/reversi/reversi.vue:
|
||||
matching:
|
||||
waiting-for: "{}を待っています"
|
||||
@ -516,6 +538,10 @@ common/views/components/profile-editor.vue:
|
||||
mute-list: "ミュート"
|
||||
blocking-list: "ブロック"
|
||||
export-requested: "エクスポートをリクエストしました。これには時間がかかる場合があります。エクスポートが終わると、ドライブにファイルが追加されます。"
|
||||
enter-password: "パスワードを入力してください"
|
||||
danger-zone: "危険な設定"
|
||||
delete-account: "アカウントを削除"
|
||||
account-deleted: "アカウントが削除されました。データが消えるまで時間がかかる場合があります。"
|
||||
common/views/components/user-list-editor.vue:
|
||||
users: "ユーザー"
|
||||
rename: "リスト名を変更"
|
||||
@ -684,12 +710,6 @@ desktop/views/components/following-window.vue:
|
||||
following: "{} のフォロー"
|
||||
desktop/views/components/following.vue:
|
||||
empty: "フォロー中のユーザーはいないようです。"
|
||||
desktop/views/components/friends-maker.vue:
|
||||
title: "気になるユーザーをフォロー:"
|
||||
empty: "おすすめのユーザーは見つかりませんでした。"
|
||||
fetching: "読み込んでいます"
|
||||
refresh: "もっと見る"
|
||||
close: "閉じる"
|
||||
desktop/views/components/game-window.vue:
|
||||
game: "リバーシ"
|
||||
desktop/views/components/home.vue:
|
||||
@ -798,13 +818,9 @@ desktop/views/components/settings.vue:
|
||||
web-search-engine-desc: "例: https://www.google.com/?#q={{query}}"
|
||||
auto-popout: "ウィンドウの自動ポップアウト"
|
||||
auto-popout-desc: "ウィンドウが開かれるとき、ポップアウト(ブラウザ外に切り離す)可能なら自動でポップアウトします。この設定はブラウザに記憶されます。"
|
||||
deck-nav: "デッキ内ナビゲーション"
|
||||
deck-nav-desc: "デッキを使用しているとき、ナビゲーションが発生する際にページ遷移を行わずに一時的なカラムで受けるようにします。"
|
||||
keep-cw: "CW保持"
|
||||
keep-cw-desc: "投稿にリプライする際、リプライ元の投稿にCWが設定されていたとき、デフォルトで同じCWを設定するようにします。"
|
||||
deck-default: "デッキをデフォルトのUIにする"
|
||||
display: "デザインと表示"
|
||||
customize: "ホームをカスタマイズ"
|
||||
wallpaper: "壁紙"
|
||||
choose-wallpaper: "壁紙を選択"
|
||||
delete-wallpaper: "壁紙を削除"
|
||||
@ -961,14 +977,11 @@ desktop/views/components/ui.header.account.vue:
|
||||
favorites: "お気に入り"
|
||||
lists: "リスト"
|
||||
follow-requests: "フォロー申請"
|
||||
customize: "ホームのカスタマイズ"
|
||||
admin: "管理"
|
||||
settings: "設定"
|
||||
signout: "サインアウト"
|
||||
dark: "闇に飲まれる"
|
||||
desktop/views/components/ui.header.nav.vue:
|
||||
home: "ホーム"
|
||||
deck: "デッキ"
|
||||
game: "ゲーム"
|
||||
desktop/views/components/ui.header.notifications.vue:
|
||||
title: "通知"
|
||||
@ -1091,6 +1104,7 @@ admin/views/instance.vue:
|
||||
smtp-secure-info: "STARTTLS使用時はオフにします。"
|
||||
smtp-host: "SMTPホスト"
|
||||
smtp-port: "SMTPポート"
|
||||
smtp-auth: "SMTP認証を行う"
|
||||
smtp-user: "SMTPユーザー"
|
||||
smtp-pass: "SMTPパスワード"
|
||||
serviceworker-config: "ServiceWorker"
|
||||
@ -1306,8 +1320,6 @@ desktop/views/pages/welcome.vue:
|
||||
info: "情報"
|
||||
desktop/views/pages/drive.vue:
|
||||
title: "Misskey Drive"
|
||||
desktop/views/pages/home-customize.vue:
|
||||
title: "ホームのカスタマイズ"
|
||||
desktop/views/pages/note.vue:
|
||||
prev: "前の投稿"
|
||||
next: "次の投稿"
|
||||
@ -1339,24 +1351,22 @@ desktop/views/pages/user/user.photos.vue:
|
||||
title: "フォト"
|
||||
loading: "読み込み中"
|
||||
no-photos: "写真はありません"
|
||||
desktop/views/pages/user/user.profile.vue:
|
||||
follows-you: "フォローされています"
|
||||
menu: "メニュー"
|
||||
desktop/views/pages/user/user.header.vue:
|
||||
posts: "投稿"
|
||||
following: "フォロー"
|
||||
followers: "フォロワー"
|
||||
is-bot: "このアカウントはBotです"
|
||||
no-description: "自己紹介はありません"
|
||||
years-old: "{age}歳"
|
||||
year: "年"
|
||||
month: "月"
|
||||
day: "日"
|
||||
follows-you: "フォローされています"
|
||||
desktop/views/pages/user/user.timeline.vue:
|
||||
default: "投稿"
|
||||
with-replies: "投稿と返信"
|
||||
with-media: "メディア"
|
||||
my-posts: "私の投稿"
|
||||
empty: "このユーザーはまだ何も投稿していないようです。"
|
||||
desktop/views/widgets/messaging.vue:
|
||||
title: "メッセージ"
|
||||
desktop/views/widgets/notifications.vue:
|
||||
@ -1418,12 +1428,6 @@ common/views/components/follow-button.vue:
|
||||
request-pending: "フォロー許可待ち"
|
||||
follow-processing: "フォロー処理中"
|
||||
follow-request: "フォロー申請"
|
||||
mobile/views/components/friends-maker.vue:
|
||||
title: "気になるユーザーをフォロー"
|
||||
empty: "おすすめのユーザーは見つかりませんでした。"
|
||||
fetching: "読み込んでいます"
|
||||
refresh: "もっと見る"
|
||||
close: "閉じる"
|
||||
mobile/views/components/note.vue:
|
||||
private: "この投稿は非公開です"
|
||||
deleted: "この投稿は削除されました"
|
||||
@ -1460,8 +1464,6 @@ mobile/views/components/sub-note-content.vue:
|
||||
deleted: "この投稿は削除されました"
|
||||
media-count: "{}つのメディア"
|
||||
poll: "アンケート"
|
||||
mobile/views/components/timeline.vue:
|
||||
empty: "投稿がありません"
|
||||
mobile/views/components/ui.header.vue:
|
||||
welcome-back: "おかえりなさい、"
|
||||
adjective: "さん"
|
||||
@ -1478,12 +1480,6 @@ mobile/views/components/ui.nav.vue:
|
||||
settings: "設定"
|
||||
admin: "管理"
|
||||
about: "Misskeyについて"
|
||||
mobile/views/components/user-timeline.vue:
|
||||
no-notes: "このユーザーは投稿していないようです。"
|
||||
no-notes-with-media: "メディア付き投稿はありません。"
|
||||
mobile/views/components/users-list.vue:
|
||||
all: "すべて"
|
||||
known: "知り合い"
|
||||
mobile/views/pages/favorites.vue:
|
||||
title: "お気に入り"
|
||||
mobile/views/pages/user-lists.vue:
|
||||
@ -1594,12 +1590,6 @@ mobile/views/pages/user/home.vue:
|
||||
frequently-replied-users: "よく話すユーザー"
|
||||
followers-you-know: "知り合いのフォロワー"
|
||||
last-used-at: "最終ログイン"
|
||||
mobile/views/pages/user/home.followers-you-know.vue:
|
||||
no-users: "知り合いのユーザーはいません"
|
||||
mobile/views/pages/user/home.friends.vue:
|
||||
no-users: "よく話すユーザーはいません"
|
||||
mobile/views/pages/user/home.notes.vue:
|
||||
no-notes: "投稿はありません"
|
||||
mobile/views/pages/user/home.photos.vue:
|
||||
no-photos: "写真はありません"
|
||||
deck:
|
||||
@ -1622,9 +1612,11 @@ deck:
|
||||
rename: "名前を変更"
|
||||
stack-left: "左に重ねる"
|
||||
pop-right: "右に出す"
|
||||
disabled-timeline:
|
||||
title: "無効化されたタイムライン"
|
||||
description: "サーバーの運営者により、このタイムラインは使用できない状態に設定されています。"
|
||||
deck/deck.tl-column.vue:
|
||||
is-media-only: "メディア投稿のみ"
|
||||
is-media-view: "メディアビュー"
|
||||
edit: "オプション"
|
||||
deck/deck.user-column.vue:
|
||||
follows-you: "フォローされています"
|
||||
|
@ -28,6 +28,8 @@ common:
|
||||
load-more: "Mehr laden"
|
||||
enter-password: "Bitte Passwort eingeben"
|
||||
2fa: "Zwei-Faktor-Authentifizierung"
|
||||
customize-home: "ホームをカスタマイズ"
|
||||
featured-notes: "ハイライト"
|
||||
got-it: "Verstanden!"
|
||||
customization-tips:
|
||||
title: "Anpassung-Tipps"
|
||||
@ -56,6 +58,14 @@ common:
|
||||
trash: "Papierkorb"
|
||||
drive: "Drive"
|
||||
messaging: "Unterhaltungen"
|
||||
deck: "デッキ"
|
||||
timeline: "タイムライン"
|
||||
explore: "みつける"
|
||||
following: "フォロー中"
|
||||
followers: "フォロワー"
|
||||
empty-timeline-info:
|
||||
follow-users-to-make-your-timeline: "ユーザーをフォローすると投稿がタイムラインに表示されます。"
|
||||
explore: "ユーザーを探索する"
|
||||
weekday-short:
|
||||
sunday: "So"
|
||||
monday: "Mo"
|
||||
@ -134,6 +144,7 @@ common:
|
||||
is-remote-post: "この投稿情報はコピーです。"
|
||||
view-on-remote: "正確な情報を見る"
|
||||
renoted-by: "{user}がRenote"
|
||||
no-notes: "投稿がありません"
|
||||
error:
|
||||
title: "問題が発生しました"
|
||||
retry: "Erneut versuchen"
|
||||
@ -197,6 +208,17 @@ auth/views/index.vue:
|
||||
please-go-back: "Bitte gehe zurück zur Anwendung."
|
||||
error: "Sitzung ist nicht vorhanden."
|
||||
sign-in: "Bitte melde dich an."
|
||||
common/views/pages/explore.vue:
|
||||
verified-users: "公式アカウント"
|
||||
popular-users: "人気のユーザー"
|
||||
recently-updated-users: "最近投稿したユーザー"
|
||||
recently-registered-users: "新規ユーザー"
|
||||
popular-tags: "人気のタグ"
|
||||
federated: "連合"
|
||||
explore: "{host}を探索"
|
||||
users-info: "現在{users}ユーザーが登録されています"
|
||||
common/views/components/user-list.vue:
|
||||
no-users: "ユーザーがいません"
|
||||
common/views/components/games/reversi/reversi.vue:
|
||||
matching:
|
||||
waiting-for: "Warten auf {}"
|
||||
@ -516,6 +538,10 @@ common/views/components/profile-editor.vue:
|
||||
mute-list: "ミュート"
|
||||
blocking-list: "ブロック"
|
||||
export-requested: "エクスポートをリクエストしました。これには時間がかかる場合があります。エクスポートが終わると、ドライブにファイルが追加されます。"
|
||||
enter-password: "パスワードを入力してください"
|
||||
danger-zone: "危険な設定"
|
||||
delete-account: "アカウントを削除"
|
||||
account-deleted: "アカウントが削除されました。データが消えるまで時間がかかる場合があります。"
|
||||
common/views/components/user-list-editor.vue:
|
||||
users: "ユーザー"
|
||||
rename: "リスト名を変更"
|
||||
@ -684,12 +710,6 @@ desktop/views/components/following-window.vue:
|
||||
following: "{} のフォロー"
|
||||
desktop/views/components/following.vue:
|
||||
empty: "Du folgst niemanden"
|
||||
desktop/views/components/friends-maker.vue:
|
||||
title: "Wem folgen?"
|
||||
empty: "Der ausgewählte Benutzer konnte nicht gefunden werden."
|
||||
fetching: "Lade…"
|
||||
refresh: "Mehr"
|
||||
close: "Schließen"
|
||||
desktop/views/components/game-window.vue:
|
||||
game: "リバーシ"
|
||||
desktop/views/components/home.vue:
|
||||
@ -798,13 +818,9 @@ desktop/views/components/settings.vue:
|
||||
web-search-engine-desc: "例: https://www.google.com/?#q={{query}}"
|
||||
auto-popout: "Automatische Pop-out Fenster"
|
||||
auto-popout-desc: "Pop-out ein offenes Fenster wenn möglich. Diese Einstellung wird im Browser gespeichert."
|
||||
deck-nav: "デッキ内ナビゲーション"
|
||||
deck-nav-desc: "デッキを使用しているとき、ナビゲーションが発生する際にページ遷移を行わずに一時的なカラムで受けるようにします。"
|
||||
keep-cw: "CW保持"
|
||||
keep-cw-desc: "投稿にリプライする際、リプライ元の投稿にCWが設定されていたとき、デフォルトで同じCWを設定するようにします。"
|
||||
deck-default: "デッキをデフォルトのUIにする"
|
||||
display: "Erscheinungsbild und Anzeige"
|
||||
customize: "Startseite anpassen"
|
||||
wallpaper: "壁紙"
|
||||
choose-wallpaper: "壁紙を選択"
|
||||
delete-wallpaper: "壁紙を削除"
|
||||
@ -961,14 +977,11 @@ desktop/views/components/ui.header.account.vue:
|
||||
favorites: "Favoriten"
|
||||
lists: "Listen"
|
||||
follow-requests: "フォロー申請"
|
||||
customize: "ホームのカスタマイズ"
|
||||
admin: "管理"
|
||||
settings: "Einstellungen"
|
||||
signout: "Ausloggen"
|
||||
dark: "Verdunkeln"
|
||||
desktop/views/components/ui.header.nav.vue:
|
||||
home: "Home"
|
||||
deck: "デッキ"
|
||||
game: "Spielen"
|
||||
desktop/views/components/ui.header.notifications.vue:
|
||||
title: "Benachrichtigungen"
|
||||
@ -1091,6 +1104,7 @@ admin/views/instance.vue:
|
||||
smtp-secure-info: "STARTTLS使用時はオフにします。"
|
||||
smtp-host: "SMTPホスト"
|
||||
smtp-port: "SMTPポート"
|
||||
smtp-auth: "SMTP認証を行う"
|
||||
smtp-user: "SMTPユーザー"
|
||||
smtp-pass: "SMTPパスワード"
|
||||
serviceworker-config: "ServiceWorker"
|
||||
@ -1306,8 +1320,6 @@ desktop/views/pages/welcome.vue:
|
||||
info: "情報"
|
||||
desktop/views/pages/drive.vue:
|
||||
title: "Misskey Drive"
|
||||
desktop/views/pages/home-customize.vue:
|
||||
title: "ホームのカスタマイズ"
|
||||
desktop/views/pages/note.vue:
|
||||
prev: "Vorheriger Kommentar"
|
||||
next: "Nächster Kommentar"
|
||||
@ -1339,24 +1351,22 @@ desktop/views/pages/user/user.photos.vue:
|
||||
title: "フォト"
|
||||
loading: "読み込み中"
|
||||
no-photos: "写真はありません"
|
||||
desktop/views/pages/user/user.profile.vue:
|
||||
follows-you: "フォローされています"
|
||||
menu: "メニュー"
|
||||
desktop/views/pages/user/user.header.vue:
|
||||
posts: "投稿"
|
||||
following: "フォロー"
|
||||
followers: "フォロワー"
|
||||
is-bot: "このアカウントはBotです"
|
||||
no-description: "自己紹介はありません"
|
||||
years-old: "{age}歳"
|
||||
year: "年"
|
||||
month: "月"
|
||||
day: "日"
|
||||
follows-you: "フォローされています"
|
||||
desktop/views/pages/user/user.timeline.vue:
|
||||
default: "投稿"
|
||||
with-replies: "投稿と返信"
|
||||
with-media: "メディア"
|
||||
my-posts: "私の投稿"
|
||||
empty: "このユーザーはまだ何も投稿していないようです。"
|
||||
desktop/views/widgets/messaging.vue:
|
||||
title: "メッセージ"
|
||||
desktop/views/widgets/notifications.vue:
|
||||
@ -1418,12 +1428,6 @@ common/views/components/follow-button.vue:
|
||||
request-pending: "フォロー許可待ち"
|
||||
follow-processing: "フォロー処理中"
|
||||
follow-request: "フォロー申請"
|
||||
mobile/views/components/friends-maker.vue:
|
||||
title: "気になるユーザーをフォロー"
|
||||
empty: "おすすめのユーザーは見つかりませんでした。"
|
||||
fetching: "Lade…"
|
||||
refresh: "もっと見る"
|
||||
close: "閉じる"
|
||||
mobile/views/components/note.vue:
|
||||
private: "この投稿は非公開です"
|
||||
deleted: "この投稿は削除されました"
|
||||
@ -1460,8 +1464,6 @@ mobile/views/components/sub-note-content.vue:
|
||||
deleted: "この投稿は削除されました"
|
||||
media-count: "{}つのメディア"
|
||||
poll: "アンケート"
|
||||
mobile/views/components/timeline.vue:
|
||||
empty: "投稿がありません"
|
||||
mobile/views/components/ui.header.vue:
|
||||
welcome-back: "おかえりなさい、"
|
||||
adjective: "さん"
|
||||
@ -1478,12 +1480,6 @@ mobile/views/components/ui.nav.vue:
|
||||
settings: "設定"
|
||||
admin: "管理"
|
||||
about: "Misskeyについて"
|
||||
mobile/views/components/user-timeline.vue:
|
||||
no-notes: "このユーザーは投稿していないようです。"
|
||||
no-notes-with-media: "メディア付き投稿はありません。"
|
||||
mobile/views/components/users-list.vue:
|
||||
all: "すべて"
|
||||
known: "知り合い"
|
||||
mobile/views/pages/favorites.vue:
|
||||
title: "Favoriten"
|
||||
mobile/views/pages/user-lists.vue:
|
||||
@ -1594,12 +1590,6 @@ mobile/views/pages/user/home.vue:
|
||||
frequently-replied-users: "よく話すユーザー"
|
||||
followers-you-know: "知り合いのフォロワー"
|
||||
last-used-at: "最終ログイン"
|
||||
mobile/views/pages/user/home.followers-you-know.vue:
|
||||
no-users: "知り合いのユーザーはいません"
|
||||
mobile/views/pages/user/home.friends.vue:
|
||||
no-users: "よく話すユーザーはいません"
|
||||
mobile/views/pages/user/home.notes.vue:
|
||||
no-notes: "投稿はありません"
|
||||
mobile/views/pages/user/home.photos.vue:
|
||||
no-photos: "写真はありません"
|
||||
deck:
|
||||
@ -1622,9 +1612,11 @@ deck:
|
||||
rename: "名前を変更"
|
||||
stack-left: "左に重ねる"
|
||||
pop-right: "右に出す"
|
||||
disabled-timeline:
|
||||
title: "無効化されたタイムライン"
|
||||
description: "サーバーの運営者により、このタイムラインは使用できない状態に設定されています。"
|
||||
deck/deck.tl-column.vue:
|
||||
is-media-only: "メディア投稿のみ"
|
||||
is-media-view: "メディアビュー"
|
||||
edit: "オプション"
|
||||
deck/deck.user-column.vue:
|
||||
follows-you: "フォローされています"
|
||||
|
@ -8,12 +8,12 @@ common:
|
||||
about: "Thank you for finding Misskey. Misskey is a <b>decentralized microblogging platform</b> born on Earth. Since it exists within the Fediverse (a universe where various social media platforms are organized), it is mutually linked with other social media platforms. Why don't you take a short break from the hustle and bustle of the city, and dive into a new Internet?"
|
||||
intro:
|
||||
title: "What is Misskey?"
|
||||
about: "Misskey is an open-source, <b>decentralized microblogging service</b>. Sophisticated, fully customizable UI, varieties of reactions for posts, free file storage providing an integrated management system and other advanced features are available. In addition, Misskey connects to a network system called the “Fediverse”, that enables us to communicate with users on other SNSs. For example, when you post something, it will be sent not only to Misskey, but also to Mastodon, Osada and Pleroma. Just imagine that the planet is sending a radio transmission to another planet to communicate."
|
||||
about: "Misskey is an open-source, <b>decentralized microblogging software</b>. It has a sophisticated, fully customizable user interface, a variety of ways for expressing a reaction to posts, free file storage providing an integrated management system, and other advanced features are available. In addition, Misskey connects to a network system called the “Fediverse”, which enables us to communicate with users on other SNSs. For example, when you post something, it will be sent not only to Misskey users, but also those on Mastodon and Pleroma. Just imagine that the planet is sending a radio transmission to another planet, in order to communicate."
|
||||
features: "Features"
|
||||
rich-contents: "Post"
|
||||
rich-contents-desc: "Just post your idea, hot topics, and anything you want to share. You may want to decorate your words, attach your favorite pictures, send files, including videos, or create a poll - those are some of the things you can do with Misskey!"
|
||||
reaction: "Reactions"
|
||||
reaction-desc: "Easiest way to tell your emotions. Misskey allows you to add various type of reactions to other’s post. The emotional experience on Misskey will never be on other SNSs which only able to push “likes”."
|
||||
reaction-desc: "The easiest way to express your emotions. Misskey allows you to add various kinds of reactions to other's posts. The emotional experience on Misskey will never be on other SNSs, which are only able to push “likes”."
|
||||
ui: "Interface"
|
||||
ui-desc: "No UI fits for everyone. Therefore, Misskey has a highly customizable UI for your taste. Make your original home by editing, adjusting layouts of timeline and placing selectable widgets you can easily customize."
|
||||
drive: "Drive"
|
||||
@ -28,6 +28,8 @@ common:
|
||||
load-more: "Load more"
|
||||
enter-password: "Please enter the Password"
|
||||
2fa: "Two-factor authentication"
|
||||
customize-home: "Customize your home layout"
|
||||
featured-notes: "Featured notes"
|
||||
got-it: "Got it!"
|
||||
customization-tips:
|
||||
title: "Customization tips"
|
||||
@ -56,6 +58,14 @@ common:
|
||||
trash: "Trash"
|
||||
drive: "Drive"
|
||||
messaging: "Talk"
|
||||
deck: "Deck"
|
||||
timeline: "Timeline"
|
||||
explore: "Explore"
|
||||
following: "Following"
|
||||
followers: "Followers"
|
||||
empty-timeline-info:
|
||||
follow-users-to-make-your-timeline: "Following users will show their posts in your timeline."
|
||||
explore: "Find users"
|
||||
weekday-short:
|
||||
sunday: "S"
|
||||
monday: "M"
|
||||
@ -134,6 +144,7 @@ common:
|
||||
is-remote-post: "These post contents are mirrored."
|
||||
view-on-remote: "For completion, view it remotely."
|
||||
renoted-by: "Renoted by {user}"
|
||||
no-notes: "Without any notes"
|
||||
error:
|
||||
title: "Something happened :("
|
||||
retry: "Retry"
|
||||
@ -197,6 +208,17 @@ auth/views/index.vue:
|
||||
please-go-back: "Please go back to the application."
|
||||
error: "Session does not exist."
|
||||
sign-in: "Please sign in."
|
||||
common/views/pages/explore.vue:
|
||||
verified-users: "Verified accounts"
|
||||
popular-users: "Popular users"
|
||||
recently-updated-users: "Recently active users"
|
||||
recently-registered-users: "Users who joined recently"
|
||||
popular-tags: "Popular Tags"
|
||||
federated: "From the fediverse"
|
||||
explore: "Explore {host}"
|
||||
users-info: "Currently, {users} users are registered here"
|
||||
common/views/components/user-list.vue:
|
||||
no-users: "There are no users."
|
||||
common/views/components/games/reversi/reversi.vue:
|
||||
matching:
|
||||
waiting-for: "Waiting for {}"
|
||||
@ -516,6 +538,10 @@ common/views/components/profile-editor.vue:
|
||||
mute-list: "List of muted accounts"
|
||||
blocking-list: "List of blocked accounts"
|
||||
export-requested: "You have requested an export. This may take a while. After the export is complete, the resulting file will be added to the drive."
|
||||
enter-password: "Please enter your password"
|
||||
danger-zone: "Cautious options"
|
||||
delete-account: "Remove the account"
|
||||
account-deleted: "The account has been deleted. It may take some time until all of the data disappears."
|
||||
common/views/components/user-list-editor.vue:
|
||||
users: "User"
|
||||
rename: "Rename list"
|
||||
@ -684,12 +710,6 @@ desktop/views/components/following-window.vue:
|
||||
following: "Following {}"
|
||||
desktop/views/components/following.vue:
|
||||
empty: "It seems you don't have any following users…"
|
||||
desktop/views/components/friends-maker.vue:
|
||||
title: "Recommended users:"
|
||||
empty: "Couldn't find any recommended users."
|
||||
fetching: "Loading"
|
||||
refresh: "More"
|
||||
close: "Close"
|
||||
desktop/views/components/game-window.vue:
|
||||
game: "Reversi"
|
||||
desktop/views/components/home.vue:
|
||||
@ -798,13 +818,9 @@ desktop/views/components/settings.vue:
|
||||
web-search-engine-desc: "Example: https://www.google.com/?#q={{query}}"
|
||||
auto-popout: "Auto pop-out window"
|
||||
auto-popout-desc: "If it's possible, pop-out display will be used instead of opening a new window. This setting is stored in your browser."
|
||||
deck-nav: "Transitionless deck navigation"
|
||||
deck-nav-desc: "You get a temporary column without page transitions during navigation when using the deck."
|
||||
keep-cw: "Preserve content warning"
|
||||
keep-cw-desc: "When replying to a post, the same content warning is set by default to the reply, as has been set by the original post."
|
||||
deck-default: "Use Deck view as the default UI"
|
||||
display: "Design and display"
|
||||
customize: "Customize home layout"
|
||||
wallpaper: "Wallpaper"
|
||||
choose-wallpaper: "Choose a background"
|
||||
delete-wallpaper: "Remove background"
|
||||
@ -961,14 +977,11 @@ desktop/views/components/ui.header.account.vue:
|
||||
favorites: "Favorites"
|
||||
lists: "Lists"
|
||||
follow-requests: "Follow requests"
|
||||
customize: "Customize home layout"
|
||||
admin: "Admin"
|
||||
settings: "Settings"
|
||||
signout: "Sign out"
|
||||
dark: "Toggle dark mode"
|
||||
desktop/views/components/ui.header.nav.vue:
|
||||
home: "Home"
|
||||
deck: "Deck"
|
||||
game: "Games"
|
||||
desktop/views/components/ui.header.notifications.vue:
|
||||
title: "Notifications"
|
||||
@ -982,7 +995,7 @@ desktop/views/components/received-follow-requests-window.vue:
|
||||
reject: "Reject"
|
||||
desktop/views/components/user-lists-window.vue:
|
||||
title: "User lists"
|
||||
create-list: "Create list"
|
||||
create-list: "Create a list"
|
||||
list-name: "List name"
|
||||
desktop/views/components/user-preview.vue:
|
||||
notes: "Posts"
|
||||
@ -1091,6 +1104,7 @@ admin/views/instance.vue:
|
||||
smtp-secure-info: "Turn off STARTTLS when used that."
|
||||
smtp-host: "SMTP Host"
|
||||
smtp-port: "SMTP Port"
|
||||
smtp-auth: "Perform SMTP authentication"
|
||||
smtp-user: "SMTP User"
|
||||
smtp-pass: "SMTP Password"
|
||||
serviceworker-config: "ServiceWorker"
|
||||
@ -1306,8 +1320,6 @@ desktop/views/pages/welcome.vue:
|
||||
info: "Information"
|
||||
desktop/views/pages/drive.vue:
|
||||
title: "Misskey storage"
|
||||
desktop/views/pages/home-customize.vue:
|
||||
title: "Customize home layout"
|
||||
desktop/views/pages/note.vue:
|
||||
prev: "Previous post"
|
||||
next: "Next post"
|
||||
@ -1339,24 +1351,22 @@ desktop/views/pages/user/user.photos.vue:
|
||||
title: "Photos"
|
||||
loading: "Loading"
|
||||
no-photos: "No photos"
|
||||
desktop/views/pages/user/user.profile.vue:
|
||||
follows-you: "Follows you"
|
||||
menu: "Menu"
|
||||
desktop/views/pages/user/user.header.vue:
|
||||
posts: "Notes"
|
||||
following: "Following"
|
||||
followers: "Followers"
|
||||
is-bot: "This account is a Bot"
|
||||
no-description: "The user has not written their profile introduction"
|
||||
years-old: "{age} years old"
|
||||
year: "/"
|
||||
month: "/"
|
||||
day: "-"
|
||||
follows-you: "Follows you"
|
||||
desktop/views/pages/user/user.timeline.vue:
|
||||
default: "Posts"
|
||||
with-replies: "Posts and replies"
|
||||
with-media: "Media"
|
||||
my-posts: "My posts"
|
||||
empty: "This user doesn't seem to have posted anything yet."
|
||||
desktop/views/widgets/messaging.vue:
|
||||
title: "Message"
|
||||
desktop/views/widgets/notifications.vue:
|
||||
@ -1418,12 +1428,6 @@ common/views/components/follow-button.vue:
|
||||
request-pending: "Pending"
|
||||
follow-processing: "Processing"
|
||||
follow-request: "Follow request"
|
||||
mobile/views/components/friends-maker.vue:
|
||||
title: "Let's follow them"
|
||||
empty: "Featured user was not found."
|
||||
fetching: "Loading"
|
||||
refresh: "See more"
|
||||
close: "Close"
|
||||
mobile/views/components/note.vue:
|
||||
private: "This post is private"
|
||||
deleted: "This post has been deleted"
|
||||
@ -1460,8 +1464,6 @@ mobile/views/components/sub-note-content.vue:
|
||||
deleted: "This post has been deleted"
|
||||
media-count: "{} media attached"
|
||||
poll: "Poll"
|
||||
mobile/views/components/timeline.vue:
|
||||
empty: "No notes"
|
||||
mobile/views/components/ui.header.vue:
|
||||
welcome-back: "Welcome back, "
|
||||
adjective: "Sir"
|
||||
@ -1478,12 +1480,6 @@ mobile/views/components/ui.nav.vue:
|
||||
settings: "Settings"
|
||||
admin: "Admin"
|
||||
about: "About Misskey"
|
||||
mobile/views/components/user-timeline.vue:
|
||||
no-notes: "It seems this user hasn't posted anything yet."
|
||||
no-notes-with-media: "There are no notes with media attachments"
|
||||
mobile/views/components/users-list.vue:
|
||||
all: "All"
|
||||
known: "In common"
|
||||
mobile/views/pages/favorites.vue:
|
||||
title: "Favorites"
|
||||
mobile/views/pages/user-lists.vue:
|
||||
@ -1543,7 +1539,7 @@ mobile/views/pages/settings.vue:
|
||||
timeline: "Timeline"
|
||||
show-reply-target: "Show reply target"
|
||||
show-my-renotes: "Show my reposts"
|
||||
show-renoted-my-notes: "Show renoted posts of mine"
|
||||
show-renoted-my-notes: "Show the renotes of my posts"
|
||||
show-local-renotes: "Show renoted local posts"
|
||||
post-style: "Post design"
|
||||
post-style-standard: "Standard"
|
||||
@ -1591,15 +1587,9 @@ mobile/views/pages/user/home.vue:
|
||||
activity: "Activity"
|
||||
keywords: "Keywords"
|
||||
domains: "Domains"
|
||||
frequently-replied-users: "Frequently mentioned users"
|
||||
frequently-replied-users: "Frequent mentions"
|
||||
followers-you-know: "Followers you know"
|
||||
last-used-at: "Last active:"
|
||||
mobile/views/pages/user/home.followers-you-know.vue:
|
||||
no-users: "No users you know"
|
||||
mobile/views/pages/user/home.friends.vue:
|
||||
no-users: "There are no users that you know"
|
||||
mobile/views/pages/user/home.notes.vue:
|
||||
no-notes: "No notes"
|
||||
mobile/views/pages/user/home.photos.vue:
|
||||
no-photos: "No photos"
|
||||
deck:
|
||||
@ -1622,9 +1612,11 @@ deck:
|
||||
rename: "Rename"
|
||||
stack-left: "Stack to the left"
|
||||
pop-right: "Dock on the right"
|
||||
disabled-timeline:
|
||||
title: "Timeline has been disabled"
|
||||
description: "This timeline has been disabled by the server administrator."
|
||||
deck/deck.tl-column.vue:
|
||||
is-media-only: "Only media posts"
|
||||
is-media-view: "Media view"
|
||||
edit: "Options"
|
||||
deck/deck.user-column.vue:
|
||||
follows-you: "Follows you"
|
||||
|
@ -28,6 +28,8 @@ common:
|
||||
load-more: "もっと読み込む"
|
||||
enter-password: "パスワードを入力してください"
|
||||
2fa: "Autenticación de dos factores"
|
||||
customize-home: "ホームをカスタマイズ"
|
||||
featured-notes: "ハイライト"
|
||||
got-it: "¡Listo!"
|
||||
customization-tips:
|
||||
title: "Consejos de personalización"
|
||||
@ -56,6 +58,14 @@ common:
|
||||
trash: "Papelera"
|
||||
drive: "Drive"
|
||||
messaging: "Conversación"
|
||||
deck: "デッキ"
|
||||
timeline: "タイムライン"
|
||||
explore: "みつける"
|
||||
following: "フォロー中"
|
||||
followers: "フォロワー"
|
||||
empty-timeline-info:
|
||||
follow-users-to-make-your-timeline: "ユーザーをフォローすると投稿がタイムラインに表示されます。"
|
||||
explore: "ユーザーを探索する"
|
||||
weekday-short:
|
||||
sunday: "domingo"
|
||||
monday: "lunes"
|
||||
@ -134,6 +144,7 @@ common:
|
||||
is-remote-post: "この投稿情報はコピーです。"
|
||||
view-on-remote: "正確な情報を見る"
|
||||
renoted-by: "{user}がRenote"
|
||||
no-notes: "投稿がありません"
|
||||
error:
|
||||
title: "問題が発生しました"
|
||||
retry: "やり直す"
|
||||
@ -197,6 +208,17 @@ auth/views/index.vue:
|
||||
please-go-back: "Por favor, vuelve a la aplicación."
|
||||
error: "Esta sesión no existe."
|
||||
sign-in: "Por favor inicia sesión."
|
||||
common/views/pages/explore.vue:
|
||||
verified-users: "公式アカウント"
|
||||
popular-users: "人気のユーザー"
|
||||
recently-updated-users: "最近投稿したユーザー"
|
||||
recently-registered-users: "新規ユーザー"
|
||||
popular-tags: "人気のタグ"
|
||||
federated: "連合"
|
||||
explore: "{host}を探索"
|
||||
users-info: "現在{users}ユーザーが登録されています"
|
||||
common/views/components/user-list.vue:
|
||||
no-users: "ユーザーがいません"
|
||||
common/views/components/games/reversi/reversi.vue:
|
||||
matching:
|
||||
waiting-for: "Esperando por {}"
|
||||
@ -516,6 +538,10 @@ common/views/components/profile-editor.vue:
|
||||
mute-list: "ミュート"
|
||||
blocking-list: "ブロック"
|
||||
export-requested: "エクスポートをリクエストしました。これには時間がかかる場合があります。エクスポートが終わると、ドライブにファイルが追加されます。"
|
||||
enter-password: "パスワードを入力してください"
|
||||
danger-zone: "危険な設定"
|
||||
delete-account: "アカウントを削除"
|
||||
account-deleted: "アカウントが削除されました。データが消えるまで時間がかかる場合があります。"
|
||||
common/views/components/user-list-editor.vue:
|
||||
users: "Usuarios"
|
||||
rename: "リスト名を変更"
|
||||
@ -684,12 +710,6 @@ desktop/views/components/following-window.vue:
|
||||
following: "Siguiendo {}"
|
||||
desktop/views/components/following.vue:
|
||||
empty: "Parece que aún no sigues a nadie."
|
||||
desktop/views/components/friends-maker.vue:
|
||||
title: "Usuarios recomendados:"
|
||||
empty: "No se pudieron encontrar usuarios para recomendar"
|
||||
fetching: "Cargando"
|
||||
refresh: "Más"
|
||||
close: "Cerrar"
|
||||
desktop/views/components/game-window.vue:
|
||||
game: "Reversi"
|
||||
desktop/views/components/home.vue:
|
||||
@ -798,13 +818,9 @@ desktop/views/components/settings.vue:
|
||||
web-search-engine-desc: "例: https://www.google.com/?#q={{query}}"
|
||||
auto-popout: "Ventana emergente automática"
|
||||
auto-popout-desc: "Muestra una ventana emergente si es posible. Esta configuración depende del navegador."
|
||||
deck-nav: "デッキ内ナビゲーション"
|
||||
deck-nav-desc: "デッキを使用しているとき、ナビゲーションが発生する際にページ遷移を行わずに一時的なカラムで受けるようにします。"
|
||||
keep-cw: "CW保持"
|
||||
keep-cw-desc: "投稿にリプライする際、リプライ元の投稿にCWが設定されていたとき、デフォルトで同じCWを設定するようにします。"
|
||||
deck-default: "デッキをデフォルトのUIにする"
|
||||
display: "Diseño y pantalla"
|
||||
customize: "Personaliza la página principal"
|
||||
wallpaper: "壁紙"
|
||||
choose-wallpaper: "Elije un fondo"
|
||||
delete-wallpaper: "Suprimir fondo"
|
||||
@ -961,14 +977,11 @@ desktop/views/components/ui.header.account.vue:
|
||||
favorites: "Favoritos"
|
||||
lists: "Listas"
|
||||
follow-requests: "Solicitudes de seguimiento"
|
||||
customize: "Personalizar la página de inicio"
|
||||
admin: "Admin"
|
||||
settings: "Configuraciones"
|
||||
signout: "Desconectarse"
|
||||
dark: "Sumergirse en la oscuridad"
|
||||
desktop/views/components/ui.header.nav.vue:
|
||||
home: "Inicio"
|
||||
deck: "Cubierta"
|
||||
game: "Juegos"
|
||||
desktop/views/components/ui.header.notifications.vue:
|
||||
title: "Notificaciones"
|
||||
@ -1091,6 +1104,7 @@ admin/views/instance.vue:
|
||||
smtp-secure-info: "STARTTLS使用時はオフにします。"
|
||||
smtp-host: "Host SMTP"
|
||||
smtp-port: "Puerto SMTP"
|
||||
smtp-auth: "SMTP認証を行う"
|
||||
smtp-user: "Usuario SMTP"
|
||||
smtp-pass: "Contraseña SMTP"
|
||||
serviceworker-config: "ServiceWorker"
|
||||
@ -1306,8 +1320,6 @@ desktop/views/pages/welcome.vue:
|
||||
info: "情報"
|
||||
desktop/views/pages/drive.vue:
|
||||
title: "Misskey Drive"
|
||||
desktop/views/pages/home-customize.vue:
|
||||
title: "ホームのカスタマイズ"
|
||||
desktop/views/pages/note.vue:
|
||||
prev: "前の投稿"
|
||||
next: "次の投稿"
|
||||
@ -1339,24 +1351,22 @@ desktop/views/pages/user/user.photos.vue:
|
||||
title: "フォト"
|
||||
loading: "読み込み中"
|
||||
no-photos: "写真はありません"
|
||||
desktop/views/pages/user/user.profile.vue:
|
||||
follows-you: "フォローされています"
|
||||
menu: "メニュー"
|
||||
desktop/views/pages/user/user.header.vue:
|
||||
posts: "投稿"
|
||||
following: "フォロー"
|
||||
followers: "フォロワー"
|
||||
is-bot: "このアカウントはBotです"
|
||||
no-description: "自己紹介はありません"
|
||||
years-old: "{age}歳"
|
||||
year: "年"
|
||||
month: "月"
|
||||
day: "日"
|
||||
follows-you: "フォローされています"
|
||||
desktop/views/pages/user/user.timeline.vue:
|
||||
default: "投稿"
|
||||
with-replies: "投稿と返信"
|
||||
with-media: "メディア"
|
||||
my-posts: "私の投稿"
|
||||
empty: "このユーザーはまだ何も投稿していないようです。"
|
||||
desktop/views/widgets/messaging.vue:
|
||||
title: "メッセージ"
|
||||
desktop/views/widgets/notifications.vue:
|
||||
@ -1418,12 +1428,6 @@ common/views/components/follow-button.vue:
|
||||
request-pending: "フォロー許可待ち"
|
||||
follow-processing: "フォロー処理中"
|
||||
follow-request: "フォロー申請"
|
||||
mobile/views/components/friends-maker.vue:
|
||||
title: "気になるユーザーをフォロー"
|
||||
empty: "おすすめのユーザーは見つかりませんでした。"
|
||||
fetching: "読み込んでいます"
|
||||
refresh: "もっと見る"
|
||||
close: "閉じる"
|
||||
mobile/views/components/note.vue:
|
||||
private: "この投稿は非公開です"
|
||||
deleted: "この投稿は削除されました"
|
||||
@ -1460,8 +1464,6 @@ mobile/views/components/sub-note-content.vue:
|
||||
deleted: "この投稿は削除されました"
|
||||
media-count: "{}つのメディア"
|
||||
poll: "アンケート"
|
||||
mobile/views/components/timeline.vue:
|
||||
empty: "投稿がありません"
|
||||
mobile/views/components/ui.header.vue:
|
||||
welcome-back: "おかえりなさい、"
|
||||
adjective: "さん"
|
||||
@ -1478,12 +1480,6 @@ mobile/views/components/ui.nav.vue:
|
||||
settings: "設定"
|
||||
admin: "管理"
|
||||
about: "Misskeyについて"
|
||||
mobile/views/components/user-timeline.vue:
|
||||
no-notes: "このユーザーは投稿していないようです。"
|
||||
no-notes-with-media: "メディア付き投稿はありません。"
|
||||
mobile/views/components/users-list.vue:
|
||||
all: "すべて"
|
||||
known: "知り合い"
|
||||
mobile/views/pages/favorites.vue:
|
||||
title: "お気に入り"
|
||||
mobile/views/pages/user-lists.vue:
|
||||
@ -1594,12 +1590,6 @@ mobile/views/pages/user/home.vue:
|
||||
frequently-replied-users: "よく話すユーザー"
|
||||
followers-you-know: "知り合いのフォロワー"
|
||||
last-used-at: "最終ログイン"
|
||||
mobile/views/pages/user/home.followers-you-know.vue:
|
||||
no-users: "知り合いのユーザーはいません"
|
||||
mobile/views/pages/user/home.friends.vue:
|
||||
no-users: "よく話すユーザーはいません"
|
||||
mobile/views/pages/user/home.notes.vue:
|
||||
no-notes: "投稿はありません"
|
||||
mobile/views/pages/user/home.photos.vue:
|
||||
no-photos: "写真はありません"
|
||||
deck:
|
||||
@ -1622,9 +1612,11 @@ deck:
|
||||
rename: "名前を変更"
|
||||
stack-left: "左に重ねる"
|
||||
pop-right: "右に出す"
|
||||
disabled-timeline:
|
||||
title: "無効化されたタイムライン"
|
||||
description: "サーバーの運営者により、このタイムラインは使用できない状態に設定されています。"
|
||||
deck/deck.tl-column.vue:
|
||||
is-media-only: "メディア投稿のみ"
|
||||
is-media-view: "メディアビュー"
|
||||
edit: "オプション"
|
||||
deck/deck.user-column.vue:
|
||||
follows-you: "フォローされています"
|
||||
|
@ -28,6 +28,8 @@ common:
|
||||
load-more: "Charger plus"
|
||||
enter-password: "Veuillez entrer le mot de passe"
|
||||
2fa: "Authentification à deux facteurs"
|
||||
customize-home: "Personnaliser la disposition de votre accueil"
|
||||
featured-notes: "Les notes mises en avant"
|
||||
got-it: "J’ai compris !"
|
||||
customization-tips:
|
||||
title: "Conseils de personnalisation"
|
||||
@ -56,6 +58,14 @@ common:
|
||||
trash: "Corbeille"
|
||||
drive: "Drive"
|
||||
messaging: "Conversations"
|
||||
deck: "Deck"
|
||||
timeline: "Fil"
|
||||
explore: "Découvrir"
|
||||
following: "Suit"
|
||||
followers: "Abonné·e·s"
|
||||
empty-timeline-info:
|
||||
follow-users-to-make-your-timeline: "ユーザーをフォローすると投稿がタイムラインに表示されます。"
|
||||
explore: "Trouver des utilisateurs"
|
||||
weekday-short:
|
||||
sunday: "D"
|
||||
monday: "L"
|
||||
@ -113,7 +123,7 @@ common:
|
||||
use-avatar-reversi-stones: "Utiliser l’avatar comme pion dans Reversi"
|
||||
verified-user: "Compte vérifié"
|
||||
disable-animated-mfm: "Désactiver les textes animés dans les publications"
|
||||
disable-showing-animated-images: "アニメーション画像を再生しない"
|
||||
disable-showing-animated-images: "Désactiver l'animation dans les images"
|
||||
suggest-recent-hashtags: "Suggérer les hashtags récemment utilisés dans le champs de saisie"
|
||||
always-show-nsfw: "Toujours afficher les contenus sensibles"
|
||||
always-mark-nsfw: "Toujours marquer les notes ayant des attachements comme sensibles"
|
||||
@ -130,10 +140,11 @@ common:
|
||||
show-password: "Afficher le mot de passe"
|
||||
do-not-use-in-production: "Il s’agit d’une version de développement. Ne pas utiliser dans un environnement de production."
|
||||
user-suspended: "Cet·te utilisateur·trice a été suspendu·e"
|
||||
is-remote-user: "このユーザー情報は不正確な可能性があります。"
|
||||
is-remote-user: "Les informations à propos de ce compte peuvent être incomplètes."
|
||||
is-remote-post: "Ceci est une publication distante."
|
||||
view-on-remote: " Consulter le profil complet"
|
||||
renoted-by: "Renoté par {user}"
|
||||
no-notes: "投稿がありません"
|
||||
error:
|
||||
title: "Une erreur est survenue"
|
||||
retry: "Réessayer"
|
||||
@ -197,6 +208,17 @@ auth/views/index.vue:
|
||||
please-go-back: "Veillez retourner à l'application."
|
||||
error: "La session n’existe pas."
|
||||
sign-in: "Veuillez vous connecter"
|
||||
common/views/pages/explore.vue:
|
||||
verified-users: "Comptes vérifiés"
|
||||
popular-users: "Utilisateurs populaires"
|
||||
recently-updated-users: "Utilisateurs actifs récemment"
|
||||
recently-registered-users: "Les nouveaux inscrits"
|
||||
popular-tags: "Mots-clés populaires"
|
||||
federated: "Du Fédiverse"
|
||||
explore: "{host}を探索"
|
||||
users-info: "現在{users}ユーザーが登録されています"
|
||||
common/views/components/user-list.vue:
|
||||
no-users: "ユーザーがいません"
|
||||
common/views/components/games/reversi/reversi.vue:
|
||||
matching:
|
||||
waiting-for: "En attente de {}"
|
||||
@ -516,6 +538,10 @@ common/views/components/profile-editor.vue:
|
||||
mute-list: "Liste des comptes mis en sourdine"
|
||||
blocking-list: "Liste des comptes bloqués"
|
||||
export-requested: "エクスポートをリクエストしました。これには時間がかかる場合があります。エクスポートが終わると、ドライブにファイルが追加されます。"
|
||||
enter-password: "パスワードを入力してください"
|
||||
danger-zone: "危険な設定"
|
||||
delete-account: "アカウントを削除"
|
||||
account-deleted: "アカウントが削除されました。データが消えるまで時間がかかる場合があります。"
|
||||
common/views/components/user-list-editor.vue:
|
||||
users: "Utilisateur·rice"
|
||||
rename: "Renommer la liste"
|
||||
@ -684,12 +710,6 @@ desktop/views/components/following-window.vue:
|
||||
following: "Suit {}"
|
||||
desktop/views/components/following.vue:
|
||||
empty: "Vous ne suivez aucun compte."
|
||||
desktop/views/components/friends-maker.vue:
|
||||
title: "Utilisateur·rice·s recommandé·e·s :"
|
||||
empty: "Impossible de trouver des utilisateur·trice·s à recommander."
|
||||
fetching: "Chargement"
|
||||
refresh: "Plus"
|
||||
close: "Fermer"
|
||||
desktop/views/components/game-window.vue:
|
||||
game: "Reversi"
|
||||
desktop/views/components/home.vue:
|
||||
@ -724,11 +744,11 @@ desktop/views/components/notes.vue:
|
||||
desktop/views/components/notifications.vue:
|
||||
empty: "Aucune de notification !"
|
||||
desktop/views/components/post-form.vue:
|
||||
add-visible-user: "+Ajouter un utilisateur"
|
||||
add-visible-user: "+Ajouter un·e utilisateur·rice"
|
||||
attach-location-information: "Attacher des informations de localisation"
|
||||
hide-contents: "Masquer les contenus"
|
||||
reply-placeholder: "Répondre à cette note…"
|
||||
quote-placeholder: "Citer cette note…"
|
||||
reply-placeholder: "Répondre à cette note …"
|
||||
quote-placeholder: "Citer cette note …"
|
||||
submit: "Publier"
|
||||
reply: "Répondre"
|
||||
renote: "Republier"
|
||||
@ -738,7 +758,7 @@ desktop/views/components/post-form.vue:
|
||||
note-failed: "La note à échoué"
|
||||
reply-failed: "La réponse a échoué"
|
||||
renote-failed: "Échec lors de la republication"
|
||||
posting: "Publication…"
|
||||
posting: "Publication …"
|
||||
attach-media-from-local: "Joindre un média depuis votre appareil"
|
||||
attach-media-from-drive: "Joindre un média depuis votre Drive"
|
||||
attach-cancel: "Annuler le fichier attaché"
|
||||
@ -751,8 +771,8 @@ desktop/views/components/post-form.vue:
|
||||
visibility: "Visibilité"
|
||||
geolocation-alert: "Votre appareil ne prend pas en charge les services de localisation"
|
||||
error: "Erreur"
|
||||
enter-username: "Saisir un nom d'utilisateur…"
|
||||
annotations: "内容への注釈 (オプション)"
|
||||
enter-username: "Saisir un nom d'utilisateur …"
|
||||
annotations: "Commenter le contenu (optionnel)"
|
||||
desktop/views/components/post-form-window.vue:
|
||||
note: "Nouvelle note"
|
||||
reply: "Répondre"
|
||||
@ -798,13 +818,9 @@ desktop/views/components/settings.vue:
|
||||
web-search-engine-desc: "Exemple : https://www.google.com/?#q={{query}}"
|
||||
auto-popout: "Fenêtre contextuelle automatique"
|
||||
auto-popout-desc: "ウィンドウが開かれるとき、ポップアウト(ブラウザ外に切り離す)可能なら自動でポップアウトします。この設定はブラウザに記憶されます。"
|
||||
deck-nav: "Deck sans tansitions"
|
||||
deck-nav-desc: "Vous obtenez une colonne temporaire sans transitions dans la page pendant la navigation, lors de l’utilisation du Deck."
|
||||
keep-cw: "Maintenir l'avertissement de contenu"
|
||||
keep-cw-desc: "投稿にリプライする際、リプライ元の投稿にCWが設定されていたとき、デフォルトで同じCWを設定するようにします。"
|
||||
deck-default: "Utiliser le Deck comme IU par défaut"
|
||||
display: "Affichage et design"
|
||||
customize: "Personnaliser l'Accueil"
|
||||
wallpaper: "Arrière plan"
|
||||
choose-wallpaper: "Sélectionner un fond d'écran"
|
||||
delete-wallpaper: "Supprimer le fond d'écran"
|
||||
@ -961,14 +977,11 @@ desktop/views/components/ui.header.account.vue:
|
||||
favorites: "Favorites"
|
||||
lists: "Listes"
|
||||
follow-requests: "Demandes de suivi"
|
||||
customize: "Personnaliser l'Accueil"
|
||||
admin: "Admin"
|
||||
settings: "Réglages"
|
||||
signout: "Déconnexion"
|
||||
dark: "Fall in dark"
|
||||
desktop/views/components/ui.header.nav.vue:
|
||||
home: "Accueil"
|
||||
deck: "Deck"
|
||||
game: "Jeux"
|
||||
desktop/views/components/ui.header.notifications.vue:
|
||||
title: "Notifications"
|
||||
@ -1019,7 +1032,7 @@ admin/views/dashboard.vue:
|
||||
federated: "Fédérées"
|
||||
admin/views/queue.vue:
|
||||
operation: "Action(s)"
|
||||
remove-all-jobs: "すべてのジョブをクリア"
|
||||
remove-all-jobs: "Enlever toutes les tâches en attente"
|
||||
admin/views/abuse.vue:
|
||||
title: "Abus"
|
||||
target: "Cible"
|
||||
@ -1091,6 +1104,7 @@ admin/views/instance.vue:
|
||||
smtp-secure-info: "Désactiver STARTTLS lorsque celui-ci est utilisé."
|
||||
smtp-host: "Hôte SMTP"
|
||||
smtp-port: "Port SMTP"
|
||||
smtp-auth: "SMTP認証を行う"
|
||||
smtp-user: "Utilisateur SMTP"
|
||||
smtp-pass: "Mot de passe SMTP"
|
||||
serviceworker-config: "ServiceWorker"
|
||||
@ -1167,7 +1181,7 @@ admin/views/users.vue:
|
||||
verify-confirm: "Souhaiteriez-vous rendre votre compte comme étant un compte vérifié ?"
|
||||
verified: "Le compte a été vérifié"
|
||||
unverify: "Enlever la vérification du compte"
|
||||
unverify-confirm: "公式アカウントを解除しますか?"
|
||||
unverify-confirm: "Désirez-vous considérer ce compte comme étant non-vérifié ?"
|
||||
unverified: "Ce compte n'est plus vérifié"
|
||||
update-remote-user: "Mettre à jour les informations de l’utilisateur·rice distant·e"
|
||||
remote-user-updated: "Les informations de l’utilisateur·rice distant·e ont étés mis à jour"
|
||||
@ -1186,7 +1200,7 @@ admin/views/users.vue:
|
||||
moderator: "Modérateur"
|
||||
adminOrModerator: "Administrateur/Modérateur"
|
||||
verified: "Compte vérifié"
|
||||
silenced: "サイレンス済み"
|
||||
silenced: "Déjà mis en sourdine"
|
||||
suspended: "Suspendu"
|
||||
origin:
|
||||
title: "Origine"
|
||||
@ -1246,9 +1260,9 @@ admin/views/federation.vue:
|
||||
latest-request-received-at: "Dernière requête reçue"
|
||||
remove-all-following: "フォローを全解除"
|
||||
remove-all-following-info: "{host}からのフォローをすべて解除します。そのインスタンスがもう存在しなくなった場合などに実行してください。"
|
||||
block: "ブロック"
|
||||
marked-as-closed: "閉鎖されているとマーク"
|
||||
lookup: "照会"
|
||||
block: "Bloquer"
|
||||
marked-as-closed: "Marquées comme fermées"
|
||||
lookup: "Recherche"
|
||||
instances: "Instances"
|
||||
instance-not-registered: "そのインスタンスは登録されていません"
|
||||
sort: "Trier par"
|
||||
@ -1262,36 +1276,36 @@ admin/views/federation.vue:
|
||||
usersAsc: "ユーザーが少ない順"
|
||||
usersDesc: "ユーザーが多い順"
|
||||
followingAsc: "Les moins suivies"
|
||||
followingDesc: "フォローが多い順"
|
||||
followingDesc: "Ayant le plus d'abonné·e·s"
|
||||
followersAsc: "Ayant le moins d'abonné·e·s"
|
||||
followersDesc: "Ayant le plus d'abonné·e·s"
|
||||
driveUsageAsc: "ドライブ使用量が少ない順"
|
||||
driveUsageDesc: "ドライブ使用量が多い順"
|
||||
driveFilesAsc: "ドライブのファイル数が少ない順"
|
||||
driveFilesDesc: "ドライブのファイル数が多い順"
|
||||
state: "状態"
|
||||
state: "État"
|
||||
states:
|
||||
all: "すべて"
|
||||
blocked: "ブロック"
|
||||
not-responding: "応答なし"
|
||||
marked-as-closed: "閉鎖とマーク済み"
|
||||
all: "Tout"
|
||||
blocked: "Bloquées"
|
||||
not-responding: "Sans réponse"
|
||||
marked-as-closed: "Marquée comme fermée"
|
||||
result-is-truncated: "上位{n}件を表示しています。"
|
||||
charts: "チャート"
|
||||
charts: "Graphs"
|
||||
chart-srcs:
|
||||
requests: "リクエスト"
|
||||
users: "ユーザーの増減"
|
||||
users-total: "ユーザーの積算"
|
||||
notes: "投稿の増減"
|
||||
notes-total: "投稿の積算"
|
||||
ff: "フォロー/フォロワーの増減"
|
||||
requests: "Requêtes"
|
||||
users: "Nombre d’utilisateurs·trices : augmentation/diminution"
|
||||
users-total: "Nombre total des utilisateur·rice·s"
|
||||
notes: "Augmentation/diminution du nombre des notes"
|
||||
notes-total: "Nombre total des notes"
|
||||
ff: "Augmentation des abonné·e·s"
|
||||
ff-total: "フォロー/フォロワーの積算"
|
||||
drive-usage: "ドライブ使用量の増減"
|
||||
drive-usage-total: "ドライブ使用量の積算"
|
||||
drive-usage: "Augmentation et diminution de la capacité stockage"
|
||||
drive-usage-total: "Utilisation totale du stockage"
|
||||
drive-files: "ドライブファイル数の増減"
|
||||
drive-files-total: "ドライブファイル数の積算"
|
||||
drive-files-total: "Nombre total des fichiers sur le Drive"
|
||||
chart-spans:
|
||||
hour: "1時間ごと"
|
||||
day: "1日ごと"
|
||||
hour: "Par heure"
|
||||
day: "Par jour"
|
||||
desktop/views/pages/welcome.vue:
|
||||
about: "à propos"
|
||||
gotit: "J'ai compris !"
|
||||
@ -1306,8 +1320,6 @@ desktop/views/pages/welcome.vue:
|
||||
info: "Informations"
|
||||
desktop/views/pages/drive.vue:
|
||||
title: "Lecteur de Misskey"
|
||||
desktop/views/pages/home-customize.vue:
|
||||
title: "Personnaliser l'Accueil"
|
||||
desktop/views/pages/note.vue:
|
||||
prev: "Note précédente"
|
||||
next: "Note suivante"
|
||||
@ -1339,24 +1351,22 @@ desktop/views/pages/user/user.photos.vue:
|
||||
title: "Photos"
|
||||
loading: "Chargement en cours"
|
||||
no-photos: "Pas de photos"
|
||||
desktop/views/pages/user/user.profile.vue:
|
||||
follows-you: "Vous suit"
|
||||
menu: "Menu"
|
||||
desktop/views/pages/user/user.header.vue:
|
||||
posts: "Notes"
|
||||
following: "Suit"
|
||||
followers: "Abonné·e·s"
|
||||
is-bot: "Ce compte est un Bot"
|
||||
no-description: "自己紹介はありません"
|
||||
years-old: "{age} ans"
|
||||
year: "/"
|
||||
month: "/"
|
||||
day: "-"
|
||||
follows-you: "Vous suit"
|
||||
desktop/views/pages/user/user.timeline.vue:
|
||||
default: "Publications"
|
||||
with-replies: "Publications et réponses"
|
||||
with-media: "Média"
|
||||
my-posts: "Mes Messages"
|
||||
empty: "Cet utilisateur n'a rien posté encore."
|
||||
desktop/views/widgets/messaging.vue:
|
||||
title: "Messagerie"
|
||||
desktop/views/widgets/notifications.vue:
|
||||
@ -1418,12 +1428,6 @@ common/views/components/follow-button.vue:
|
||||
request-pending: "Demande en attente"
|
||||
follow-processing: "En cours d’abonnement"
|
||||
follow-request: "Demande d’abonnement"
|
||||
mobile/views/components/friends-maker.vue:
|
||||
title: "Abonnez-vous à"
|
||||
empty: "Impossible de trouver des utilisateurs·trices à recommander."
|
||||
fetching: "Chargement"
|
||||
refresh: "Voir plus"
|
||||
close: "Fermer"
|
||||
mobile/views/components/note.vue:
|
||||
private: "cette publication est privée"
|
||||
deleted: "cette publication a été supprimée"
|
||||
@ -1445,11 +1449,11 @@ mobile/views/components/note-sub.vue:
|
||||
mobile/views/components/notifications.vue:
|
||||
empty: "Aucune de notification !"
|
||||
mobile/views/components/post-form.vue:
|
||||
add-visible-user: "Ajouter un utilisateur"
|
||||
add-visible-user: "Ajouter un·e utilisateur·rice"
|
||||
submit: "Publier"
|
||||
reply: "Répondre"
|
||||
renote: "Republier"
|
||||
quote-placeholder: "Citer ce billet... (Facultatif)"
|
||||
quote-placeholder: "Citer ce billet ... (Facultatif)"
|
||||
reply-placeholder: "Répondre à cette note"
|
||||
cw-placeholder: "Commenter le contenu (optionnel)"
|
||||
location-alert: "Votre appareil ne prend pas en charge les services de localisation"
|
||||
@ -1460,8 +1464,6 @@ mobile/views/components/sub-note-content.vue:
|
||||
deleted: "cette publication a été supprimée"
|
||||
media-count: "{} médias attachés"
|
||||
poll: "Sondage"
|
||||
mobile/views/components/timeline.vue:
|
||||
empty: "Pas de notes"
|
||||
mobile/views/components/ui.header.vue:
|
||||
welcome-back: "Content de vous revoir ! "
|
||||
adjective: "M."
|
||||
@ -1478,12 +1480,6 @@ mobile/views/components/ui.nav.vue:
|
||||
settings: "Réglages"
|
||||
admin: "Admin"
|
||||
about: "À propos de Misskey"
|
||||
mobile/views/components/user-timeline.vue:
|
||||
no-notes: "Il semble que cet utilisateur n’a rien publié pour le moment."
|
||||
no-notes-with-media: "Aucune note comprenant des médias"
|
||||
mobile/views/components/users-list.vue:
|
||||
all: "Tout"
|
||||
known: "Vous connaissez"
|
||||
mobile/views/pages/favorites.vue:
|
||||
title: "Favoris"
|
||||
mobile/views/pages/user-lists.vue:
|
||||
@ -1520,7 +1516,7 @@ mobile/views/pages/received-follow-requests.vue:
|
||||
accept: "Accepter"
|
||||
reject: "Refuser"
|
||||
mobile/views/pages/note.vue:
|
||||
title: "Post"
|
||||
title: "Publication"
|
||||
prev: "Note précédente"
|
||||
next: "Note suivante"
|
||||
mobile/views/pages/notifications.vue:
|
||||
@ -1591,15 +1587,9 @@ mobile/views/pages/user/home.vue:
|
||||
activity: "Activité"
|
||||
keywords: "Mot clés"
|
||||
domains: "Domaines"
|
||||
frequently-replied-users: "Utilisateurs mentionnés souvent"
|
||||
frequently-replied-users: "Mentions fréquentes"
|
||||
followers-you-know: "Abonné·e·s que vous connaissez"
|
||||
last-used-at: "Dernière connexion il y a"
|
||||
mobile/views/pages/user/home.followers-you-know.vue:
|
||||
no-users: "Aucun utilisateur·rice connu·e"
|
||||
mobile/views/pages/user/home.friends.vue:
|
||||
no-users: "Aucun utilisateur connu"
|
||||
mobile/views/pages/user/home.notes.vue:
|
||||
no-notes: "Pas de notes"
|
||||
mobile/views/pages/user/home.photos.vue:
|
||||
no-photos: "Pas de photos"
|
||||
deck:
|
||||
@ -1622,12 +1612,14 @@ deck:
|
||||
rename: "Renommer"
|
||||
stack-left: "Vers la gauche"
|
||||
pop-right: "Vers la droite"
|
||||
disabled-timeline:
|
||||
title: "Le fil été désactivé"
|
||||
description: "Ce fil a été désactivé par l'administrateur du serveur."
|
||||
deck/deck.tl-column.vue:
|
||||
is-media-only: "Les publications médias uniquement"
|
||||
is-media-view: "Vue média"
|
||||
edit: "Option"
|
||||
deck/deck.user-column.vue:
|
||||
follows-you: "フォローされています"
|
||||
follows-you: "Vous suit"
|
||||
posts: "Notes"
|
||||
following: "Suit"
|
||||
followers: "Abonnés"
|
||||
|
@ -8,6 +8,19 @@ const yaml = require('js-yaml');
|
||||
const langs = ['de-DE', 'en-US', 'fr-FR', 'ja-JP', 'ja-KS', 'pl-PL', 'es-ES', 'nl-NL', 'zh-CN', 'ko-KR'];
|
||||
|
||||
const loadLocale = lang => yaml.safeLoad(fs.readFileSync(`${__dirname}/${lang}.yml`, 'utf-8'));
|
||||
const locales = langs.map(lang => ({ [lang]: loadLocale(lang) }));
|
||||
const locales = langs
|
||||
.map(lang => [lang, loadLocale(lang)])
|
||||
.map(([lang, locale], _, locales) => {
|
||||
switch (lang) {
|
||||
case 'ja-JP': return [lang, locale];
|
||||
case 'en-US': return [lang, { ...locales['ja-JP'], ...locale }];
|
||||
default: return [lang, {
|
||||
...(lang.startsWith('ja-') ? {} : locales['en-US']),
|
||||
...locales['ja-JP'],
|
||||
...locale
|
||||
}];
|
||||
}
|
||||
})
|
||||
.map(([lang, locale]) => ({ [lang]: loadLocale(lang) }));
|
||||
|
||||
module.exports = locales.reduce((a, b) => ({ ...a, ...b }));
|
||||
|
@ -28,6 +28,8 @@ common:
|
||||
load-more: "もっと読み込む"
|
||||
enter-password: "パスワードを入力してください"
|
||||
2fa: "二段階認証"
|
||||
customize-home: "ホームをカスタマイズ"
|
||||
featured-notes: "ハイライト"
|
||||
got-it: "わかった"
|
||||
customization-tips:
|
||||
title: "カスタマイズのヒント"
|
||||
@ -56,6 +58,14 @@ common:
|
||||
trash: "ゴミ箱"
|
||||
drive: "ドライブ"
|
||||
messaging: "トーク"
|
||||
deck: "デッキ"
|
||||
timeline: "タイムライン"
|
||||
explore: "みつける"
|
||||
following: "フォロー中"
|
||||
followers: "フォロワー"
|
||||
empty-timeline-info:
|
||||
follow-users-to-make-your-timeline: "ユーザーをフォローすると投稿がタイムラインに表示されます。"
|
||||
explore: "ユーザーを探索する"
|
||||
weekday-short:
|
||||
sunday: "日"
|
||||
monday: "月"
|
||||
@ -134,6 +144,7 @@ common:
|
||||
is-remote-post: "この投稿情報はコピーです。"
|
||||
view-on-remote: "正確な情報を見る"
|
||||
renoted-by: "{user}がRenote"
|
||||
no-notes: "投稿がありません"
|
||||
error:
|
||||
title: "問題が発生しました"
|
||||
retry: "やり直す"
|
||||
@ -197,6 +208,17 @@ auth/views/index.vue:
|
||||
please-go-back: "アプリケーションに戻って、やっていってください。"
|
||||
error: "セッションが存在しません。"
|
||||
sign-in: "サインインしてください"
|
||||
common/views/pages/explore.vue:
|
||||
verified-users: "公式アカウント"
|
||||
popular-users: "人気のユーザー"
|
||||
recently-updated-users: "最近投稿したユーザー"
|
||||
recently-registered-users: "新規ユーザー"
|
||||
popular-tags: "人気のタグ"
|
||||
federated: "連合"
|
||||
explore: "{host}を探索"
|
||||
users-info: "現在{users}ユーザーが登録されています"
|
||||
common/views/components/user-list.vue:
|
||||
no-users: "ユーザーがいません"
|
||||
common/views/components/games/reversi/reversi.vue:
|
||||
matching:
|
||||
waiting-for: "{}を待っています"
|
||||
@ -516,6 +538,10 @@ common/views/components/profile-editor.vue:
|
||||
mute-list: "ミュート"
|
||||
blocking-list: "ブロック"
|
||||
export-requested: "エクスポートをリクエストしました。これには時間がかかる場合があります。エクスポートが終わると、ドライブにファイルが追加されます。"
|
||||
enter-password: "パスワードを入力してください"
|
||||
danger-zone: "危険な設定"
|
||||
delete-account: "アカウントを削除"
|
||||
account-deleted: "アカウントが削除されました。データが消えるまで時間がかかる場合があります。"
|
||||
common/views/components/user-list-editor.vue:
|
||||
users: "ユーザー"
|
||||
rename: "リスト名を変更"
|
||||
@ -684,12 +710,6 @@ desktop/views/components/following-window.vue:
|
||||
following: "{} のフォロー"
|
||||
desktop/views/components/following.vue:
|
||||
empty: "フォロー中のユーザーはいないようです。"
|
||||
desktop/views/components/friends-maker.vue:
|
||||
title: "気になるユーザーをフォロー:"
|
||||
empty: "おすすめのユーザーは見つかりませんでした。"
|
||||
fetching: "読み込んでいます"
|
||||
refresh: "もっと見る"
|
||||
close: "閉じる"
|
||||
desktop/views/components/game-window.vue:
|
||||
game: "リバーシ"
|
||||
desktop/views/components/home.vue:
|
||||
@ -798,13 +818,9 @@ desktop/views/components/settings.vue:
|
||||
web-search-engine-desc: "例: https://www.google.com/?#q={{query}}"
|
||||
auto-popout: "ウィンドウの自動ポップアウト"
|
||||
auto-popout-desc: "ウィンドウが開かれるとき、ポップアウト(ブラウザ外に切り離す)可能なら自動でポップアウトします。この設定はブラウザに記憶されます。"
|
||||
deck-nav: "デッキ内ナビゲーション"
|
||||
deck-nav-desc: "デッキを使用しているとき、ナビゲーションが発生する際にページ遷移を行わずに一時的なカラムで受けるようにします。"
|
||||
keep-cw: "CW保持"
|
||||
keep-cw-desc: "投稿にリプライする際、リプライ元の投稿にCWが設定されていたとき、デフォルトで同じCWを設定するようにします。"
|
||||
deck-default: "デッキをデフォルトのUIにする"
|
||||
display: "デザインと表示"
|
||||
customize: "ホームをカスタマイズ"
|
||||
wallpaper: "壁紙"
|
||||
choose-wallpaper: "壁紙を選択"
|
||||
delete-wallpaper: "壁紙を削除"
|
||||
@ -961,14 +977,11 @@ desktop/views/components/ui.header.account.vue:
|
||||
favorites: "お気に入り"
|
||||
lists: "リスト"
|
||||
follow-requests: "フォロー申請"
|
||||
customize: "ホームのカスタマイズ"
|
||||
admin: "管理"
|
||||
settings: "設定"
|
||||
signout: "サインアウト"
|
||||
dark: "闇に飲まれる"
|
||||
desktop/views/components/ui.header.nav.vue:
|
||||
home: "ホーム"
|
||||
deck: "デッキ"
|
||||
game: "ゲーム"
|
||||
desktop/views/components/ui.header.notifications.vue:
|
||||
title: "通知"
|
||||
@ -1091,6 +1104,7 @@ admin/views/instance.vue:
|
||||
smtp-secure-info: "STARTTLS使用時はオフにします。"
|
||||
smtp-host: "SMTPホスト"
|
||||
smtp-port: "SMTPポート"
|
||||
smtp-auth: "SMTP認証を行う"
|
||||
smtp-user: "SMTPユーザー"
|
||||
smtp-pass: "SMTPパスワード"
|
||||
serviceworker-config: "ServiceWorker"
|
||||
@ -1306,8 +1320,6 @@ desktop/views/pages/welcome.vue:
|
||||
info: "情報"
|
||||
desktop/views/pages/drive.vue:
|
||||
title: "Misskey Drive"
|
||||
desktop/views/pages/home-customize.vue:
|
||||
title: "ホームのカスタマイズ"
|
||||
desktop/views/pages/note.vue:
|
||||
prev: "前の投稿"
|
||||
next: "次の投稿"
|
||||
@ -1339,24 +1351,22 @@ desktop/views/pages/user/user.photos.vue:
|
||||
title: "フォト"
|
||||
loading: "読み込み中"
|
||||
no-photos: "写真はありません"
|
||||
desktop/views/pages/user/user.profile.vue:
|
||||
follows-you: "フォローされています"
|
||||
menu: "メニュー"
|
||||
desktop/views/pages/user/user.header.vue:
|
||||
posts: "投稿"
|
||||
following: "フォロー"
|
||||
followers: "フォロワー"
|
||||
is-bot: "このアカウントはBotです"
|
||||
no-description: "自己紹介はありません"
|
||||
years-old: "{age}歳"
|
||||
year: "年"
|
||||
month: "月"
|
||||
day: "日"
|
||||
follows-you: "フォローされています"
|
||||
desktop/views/pages/user/user.timeline.vue:
|
||||
default: "投稿"
|
||||
with-replies: "投稿と返信"
|
||||
with-media: "メディア"
|
||||
my-posts: "私の投稿"
|
||||
empty: "このユーザーはまだ何も投稿していないようです。"
|
||||
desktop/views/widgets/messaging.vue:
|
||||
title: "メッセージ"
|
||||
desktop/views/widgets/notifications.vue:
|
||||
@ -1418,12 +1428,6 @@ common/views/components/follow-button.vue:
|
||||
request-pending: "フォロー許可待ち"
|
||||
follow-processing: "フォロー処理中"
|
||||
follow-request: "フォロー申請"
|
||||
mobile/views/components/friends-maker.vue:
|
||||
title: "気になるユーザーをフォロー"
|
||||
empty: "おすすめのユーザーは見つかりませんでした。"
|
||||
fetching: "読み込んでいます"
|
||||
refresh: "もっと見る"
|
||||
close: "閉じる"
|
||||
mobile/views/components/note.vue:
|
||||
private: "この投稿は非公開です"
|
||||
deleted: "この投稿は削除されました"
|
||||
@ -1460,8 +1464,6 @@ mobile/views/components/sub-note-content.vue:
|
||||
deleted: "この投稿は削除されました"
|
||||
media-count: "{}つのメディア"
|
||||
poll: "アンケート"
|
||||
mobile/views/components/timeline.vue:
|
||||
empty: "投稿がありません"
|
||||
mobile/views/components/ui.header.vue:
|
||||
welcome-back: "おかえりなさい、"
|
||||
adjective: "さん"
|
||||
@ -1478,12 +1480,6 @@ mobile/views/components/ui.nav.vue:
|
||||
settings: "設定"
|
||||
admin: "管理"
|
||||
about: "Misskeyについて"
|
||||
mobile/views/components/user-timeline.vue:
|
||||
no-notes: "このユーザーは投稿していないようです。"
|
||||
no-notes-with-media: "メディア付き投稿はありません。"
|
||||
mobile/views/components/users-list.vue:
|
||||
all: "すべて"
|
||||
known: "知り合い"
|
||||
mobile/views/pages/favorites.vue:
|
||||
title: "お気に入り"
|
||||
mobile/views/pages/user-lists.vue:
|
||||
@ -1594,12 +1590,6 @@ mobile/views/pages/user/home.vue:
|
||||
frequently-replied-users: "よく話すユーザー"
|
||||
followers-you-know: "知り合いのフォロワー"
|
||||
last-used-at: "最終ログイン"
|
||||
mobile/views/pages/user/home.followers-you-know.vue:
|
||||
no-users: "知り合いのユーザーはいません"
|
||||
mobile/views/pages/user/home.friends.vue:
|
||||
no-users: "よく話すユーザーはいません"
|
||||
mobile/views/pages/user/home.notes.vue:
|
||||
no-notes: "投稿はありません"
|
||||
mobile/views/pages/user/home.photos.vue:
|
||||
no-photos: "写真はありません"
|
||||
deck:
|
||||
@ -1622,9 +1612,11 @@ deck:
|
||||
rename: "名前を変更"
|
||||
stack-left: "左に重ねる"
|
||||
pop-right: "右に出す"
|
||||
disabled-timeline:
|
||||
title: "無効化されたタイムライン"
|
||||
description: "サーバーの運営者により、このタイムラインは使用できない状態に設定されています。"
|
||||
deck/deck.tl-column.vue:
|
||||
is-media-only: "メディア投稿のみ"
|
||||
is-media-view: "メディアビュー"
|
||||
edit: "オプション"
|
||||
deck/deck.user-column.vue:
|
||||
follows-you: "フォローされています"
|
||||
|
@ -154,6 +154,7 @@ common:
|
||||
is-remote-post: "この投稿情報はコピーです。"
|
||||
view-on-remote: "正確な情報を見る"
|
||||
renoted-by: "{user}がRenote"
|
||||
no-notes: "投稿がありません"
|
||||
|
||||
error:
|
||||
title: "問題が発生しました"
|
||||
@ -588,6 +589,10 @@ common/views/components/profile-editor.vue:
|
||||
mute-list: "ミュート"
|
||||
blocking-list: "ブロック"
|
||||
export-requested: "エクスポートをリクエストしました。これには時間がかかる場合があります。エクスポートが終わると、ドライブにファイルが追加されます。"
|
||||
enter-password: "パスワードを入力してください"
|
||||
danger-zone: "危険な設定"
|
||||
delete-account: "アカウントを削除"
|
||||
account-deleted: "アカウントが削除されました。データが消えるまで時間がかかる場合があります。"
|
||||
|
||||
common/views/components/user-list-editor.vue:
|
||||
users: "ユーザー"
|
||||
@ -879,9 +884,6 @@ desktop/views/components/renote-form.vue:
|
||||
desktop/views/components/renote-form-window.vue:
|
||||
title: "この投稿をRenoteしますか?"
|
||||
|
||||
desktop/views/components/timeline.core.vue:
|
||||
empty: "投稿がありません"
|
||||
|
||||
desktop/views/pages/user-following-or-followers.vue:
|
||||
following: "{user}のフォロー"
|
||||
followers: "{user}のフォロワー"
|
||||
@ -1234,6 +1236,7 @@ admin/views/instance.vue:
|
||||
smtp-secure-info: "STARTTLS使用時はオフにします。"
|
||||
smtp-host: "SMTPホスト"
|
||||
smtp-port: "SMTPポート"
|
||||
smtp-auth: "SMTP認証を行う"
|
||||
smtp-user: "SMTPユーザー"
|
||||
smtp-pass: "SMTPパスワード"
|
||||
serviceworker-config: "ServiceWorker"
|
||||
@ -1505,6 +1508,7 @@ desktop/views/pages/user/user.header.vue:
|
||||
following: "フォロー"
|
||||
followers: "フォロワー"
|
||||
is-bot: "このアカウントはBotです"
|
||||
no-description: "自己紹介はありません"
|
||||
years-old: "{age}歳"
|
||||
year: "年"
|
||||
month: "月"
|
||||
@ -1516,7 +1520,6 @@ desktop/views/pages/user/user.timeline.vue:
|
||||
with-replies: "投稿と返信"
|
||||
with-media: "メディア"
|
||||
my-posts: "私の投稿"
|
||||
empty: "このユーザーはまだ何も投稿していないようです。"
|
||||
|
||||
desktop/views/widgets/messaging.vue:
|
||||
title: "メッセージ"
|
||||
@ -1636,9 +1639,6 @@ mobile/views/components/sub-note-content.vue:
|
||||
media-count: "{}つのメディア"
|
||||
poll: "アンケート"
|
||||
|
||||
mobile/views/components/timeline.vue:
|
||||
empty: "投稿がありません"
|
||||
|
||||
mobile/views/components/ui.header.vue:
|
||||
welcome-back: "おかえりなさい、"
|
||||
adjective: "さん"
|
||||
@ -1657,10 +1657,6 @@ mobile/views/components/ui.nav.vue:
|
||||
admin: "管理"
|
||||
about: "Misskeyについて"
|
||||
|
||||
mobile/views/components/user-timeline.vue:
|
||||
no-notes: "このユーザーは投稿していないようです。"
|
||||
no-notes-with-media: "メディア付き投稿はありません。"
|
||||
|
||||
mobile/views/pages/favorites.vue:
|
||||
title: "お気に入り"
|
||||
|
||||
@ -1685,9 +1681,6 @@ mobile/views/pages/home.vue:
|
||||
mentions: "あなた宛て"
|
||||
messages: "メッセージ"
|
||||
|
||||
mobile/views/pages/home.timeline.vue:
|
||||
empty: "投稿がありません"
|
||||
|
||||
mobile/views/pages/tag.vue:
|
||||
no-posts-found: "ハッシュタグ「{q}」が付けられた投稿は見つかりませんでした。"
|
||||
|
||||
@ -1794,15 +1787,6 @@ mobile/views/pages/user/home.vue:
|
||||
followers-you-know: "知り合いのフォロワー"
|
||||
last-used-at: "最終ログイン"
|
||||
|
||||
mobile/views/pages/user/home.followers-you-know.vue:
|
||||
no-users: "知り合いのユーザーはいません"
|
||||
|
||||
mobile/views/pages/user/home.friends.vue:
|
||||
no-users: "よく話すユーザーはいません"
|
||||
|
||||
mobile/views/pages/user/home.notes.vue:
|
||||
no-notes: "投稿はありません"
|
||||
|
||||
mobile/views/pages/user/home.photos.vue:
|
||||
no-photos: "写真はありません"
|
||||
|
||||
@ -1832,7 +1816,6 @@ deck:
|
||||
|
||||
deck/deck.tl-column.vue:
|
||||
is-media-only: "メディア投稿のみ"
|
||||
is-media-view: "メディアビュー"
|
||||
edit: "オプション"
|
||||
|
||||
deck/deck.user-column.vue:
|
||||
|
@ -28,6 +28,8 @@ common:
|
||||
load-more: "もっとあらへんのか!"
|
||||
enter-password: "パスワードを入れてや"
|
||||
2fa: "二段階認証"
|
||||
customize-home: "ホームをカスタマイズ"
|
||||
featured-notes: "ハイライト"
|
||||
got-it: "ほい"
|
||||
customization-tips:
|
||||
title: "カスタマイズのヒント"
|
||||
@ -56,6 +58,14 @@ common:
|
||||
trash: "ゴミ箱"
|
||||
drive: "ドライブ"
|
||||
messaging: "トーク"
|
||||
deck: "デッキ"
|
||||
timeline: "タイムライン"
|
||||
explore: "みつける"
|
||||
following: "フォロー中"
|
||||
followers: "フォロワー"
|
||||
empty-timeline-info:
|
||||
follow-users-to-make-your-timeline: "ユーザーをフォローすると投稿がタイムラインに表示されます。"
|
||||
explore: "ユーザーを探索する"
|
||||
weekday-short:
|
||||
sunday: "日"
|
||||
monday: "月"
|
||||
@ -134,6 +144,7 @@ common:
|
||||
is-remote-post: "この投稿情報はコピーです。"
|
||||
view-on-remote: "ちゃんとした情報見せてや!"
|
||||
renoted-by: "{user}がRenote"
|
||||
no-notes: "投稿がありません"
|
||||
error:
|
||||
title: "問題が起こったわ"
|
||||
retry: "もっぺん"
|
||||
@ -197,6 +208,17 @@ auth/views/index.vue:
|
||||
please-go-back: "アプリケーションに戻って、気張ってってな。"
|
||||
error: "セッションが存在してへん。"
|
||||
sign-in: "サインインしてや"
|
||||
common/views/pages/explore.vue:
|
||||
verified-users: "公式アカウント"
|
||||
popular-users: "人気のユーザー"
|
||||
recently-updated-users: "最近投稿したユーザー"
|
||||
recently-registered-users: "新規ユーザー"
|
||||
popular-tags: "人気のタグ"
|
||||
federated: "連合"
|
||||
explore: "{host}を探索"
|
||||
users-info: "現在{users}ユーザーが登録されています"
|
||||
common/views/components/user-list.vue:
|
||||
no-users: "ユーザーがいません"
|
||||
common/views/components/games/reversi/reversi.vue:
|
||||
matching:
|
||||
waiting-for: "{}を待っとります"
|
||||
@ -516,6 +538,10 @@ common/views/components/profile-editor.vue:
|
||||
mute-list: "ミュート"
|
||||
blocking-list: "ブロック"
|
||||
export-requested: "エクスポートをリクエストしました。これには時間がかかる場合があります。エクスポートが終わると、ドライブにファイルが追加されます。"
|
||||
enter-password: "パスワードを入力してください"
|
||||
danger-zone: "危険な設定"
|
||||
delete-account: "アカウントを削除"
|
||||
account-deleted: "アカウントが削除されました。データが消えるまで時間がかかる場合があります。"
|
||||
common/views/components/user-list-editor.vue:
|
||||
users: "ユーザー"
|
||||
rename: "リスト名を変更"
|
||||
@ -684,12 +710,6 @@ desktop/views/components/following-window.vue:
|
||||
following: "{} のフォロー"
|
||||
desktop/views/components/following.vue:
|
||||
empty: "フォロー中のユーザーはおらんっぽいで、知らんけど。"
|
||||
desktop/views/components/friends-maker.vue:
|
||||
title: "おもろそうやな:"
|
||||
empty: "おもろいユーザー居らんかったわ"
|
||||
fetching: "読み込んどります"
|
||||
refresh: "もっとあるやろ!"
|
||||
close: "さいなら"
|
||||
desktop/views/components/game-window.vue:
|
||||
game: "ゲーム"
|
||||
desktop/views/components/home.vue:
|
||||
@ -798,13 +818,9 @@ desktop/views/components/settings.vue:
|
||||
web-search-engine-desc: "例: https://www.google.com/?#q?{{query}}"
|
||||
auto-popout: "ウィンドウの自動ポップアウト"
|
||||
auto-popout-desc: "ウィンドウが開かれるとき、ポップアウト(ブラウザ外に切り離す)可能なら自動でポップアウトすんで。この設定はブラウザに記憶されんで。"
|
||||
deck-nav: "デッキ内ナビゲーション"
|
||||
deck-nav-desc: "デッキを使うとるとき、ナビゲーションが発生するときにページ移動せんで、一時的なカラムで受けれるようにするで"
|
||||
keep-cw: "CW保持"
|
||||
keep-cw-desc: "投稿にリプライする際、リプライ元の投稿にCWが設定されていたとき、デフォルトで同じCWを設定するようにします。"
|
||||
deck-default: "デッキをデフォルトのUIにする"
|
||||
display: "見た感じ"
|
||||
customize: "ホームをカスタマイズ"
|
||||
wallpaper: "壁紙"
|
||||
choose-wallpaper: "壁紙選ぶ"
|
||||
delete-wallpaper: "壁紙ほかす"
|
||||
@ -961,14 +977,11 @@ desktop/views/components/ui.header.account.vue:
|
||||
favorites: "お気に入り"
|
||||
lists: "リスト"
|
||||
follow-requests: "フォロー許してくれや!言うてみる"
|
||||
customize: "ホームをカスタマイズ"
|
||||
admin: "管理"
|
||||
settings: "設定"
|
||||
signout: "さいなら"
|
||||
dark: "ナイトゲームじゃ!"
|
||||
desktop/views/components/ui.header.nav.vue:
|
||||
home: "ホーム"
|
||||
deck: "デッキ"
|
||||
game: "ゲーム"
|
||||
desktop/views/components/ui.header.notifications.vue:
|
||||
title: "通知"
|
||||
@ -1091,6 +1104,7 @@ admin/views/instance.vue:
|
||||
smtp-secure-info: "STARTTLS使用時はオフにします。"
|
||||
smtp-host: "SMTPホスト"
|
||||
smtp-port: "SMTPポート"
|
||||
smtp-auth: "SMTP認証を行う"
|
||||
smtp-user: "SMTPユーザー"
|
||||
smtp-pass: "SMTPパスワード"
|
||||
serviceworker-config: "ServiceWorker"
|
||||
@ -1306,8 +1320,6 @@ desktop/views/pages/welcome.vue:
|
||||
info: "情報"
|
||||
desktop/views/pages/drive.vue:
|
||||
title: "ドライブ"
|
||||
desktop/views/pages/home-customize.vue:
|
||||
title: "ホームをカスタマイズ"
|
||||
desktop/views/pages/note.vue:
|
||||
prev: "前のやつ"
|
||||
next: "次のやつ"
|
||||
@ -1339,24 +1351,22 @@ desktop/views/pages/user/user.photos.vue:
|
||||
title: "写真"
|
||||
loading: "読み込んどります"
|
||||
no-photos: "写真はあらへんで"
|
||||
desktop/views/pages/user/user.profile.vue:
|
||||
follows-you: "フォローされとるで"
|
||||
menu: "メニュー"
|
||||
desktop/views/pages/user/user.header.vue:
|
||||
posts: "投稿"
|
||||
following: "フォロー"
|
||||
followers: "フォロワー"
|
||||
is-bot: "このアカウントはBotや"
|
||||
no-description: "自己紹介はありません"
|
||||
years-old: "{age}歳"
|
||||
year: "年"
|
||||
month: "月"
|
||||
day: "日"
|
||||
follows-you: "フォローされています"
|
||||
desktop/views/pages/user/user.timeline.vue:
|
||||
default: "投稿"
|
||||
with-replies: "投稿と返信"
|
||||
with-media: "メディア"
|
||||
my-posts: "私の投稿"
|
||||
empty: "このユーザーはまだ何も投稿しとらんようや。"
|
||||
desktop/views/widgets/messaging.vue:
|
||||
title: "メッセージ"
|
||||
desktop/views/widgets/notifications.vue:
|
||||
@ -1418,12 +1428,6 @@ common/views/components/follow-button.vue:
|
||||
request-pending: "フォロー許してくれるん待っとる"
|
||||
follow-processing: "今フォロー処理やっとる‥"
|
||||
follow-request: "フォローさせてや!言うてみる"
|
||||
mobile/views/components/friends-maker.vue:
|
||||
title: "おもろそうやな"
|
||||
empty: "おすすめのユーザーはおらん。"
|
||||
fetching: "読み込んどります"
|
||||
refresh: "もっとあるやろ!"
|
||||
close: "さいなら"
|
||||
mobile/views/components/note.vue:
|
||||
private: "この投稿は見せられへんわ"
|
||||
deleted: "この投稿なんか無くなってもうたわ"
|
||||
@ -1460,8 +1464,6 @@ mobile/views/components/sub-note-content.vue:
|
||||
deleted: "この投稿なんか無くなってもうたわ"
|
||||
media-count: "{}つのメディア"
|
||||
poll: "アンケート"
|
||||
mobile/views/components/timeline.vue:
|
||||
empty: "投稿はあらへん"
|
||||
mobile/views/components/ui.header.vue:
|
||||
welcome-back: "おかえり、"
|
||||
adjective: "はん"
|
||||
@ -1478,12 +1480,6 @@ mobile/views/components/ui.nav.vue:
|
||||
settings: "設定"
|
||||
admin: "管理"
|
||||
about: "Misskeyってなんや?"
|
||||
mobile/views/components/user-timeline.vue:
|
||||
no-notes: "このユーザーは投稿しとらんようや。"
|
||||
no-notes-with-media: "メディア付き投稿はあらへん。"
|
||||
mobile/views/components/users-list.vue:
|
||||
all: "すべて"
|
||||
known: "知っとる"
|
||||
mobile/views/pages/favorites.vue:
|
||||
title: "お気に入り"
|
||||
mobile/views/pages/user-lists.vue:
|
||||
@ -1591,15 +1587,9 @@ mobile/views/pages/user/home.vue:
|
||||
activity: "やっとること"
|
||||
keywords: "キーワード"
|
||||
domains: "よく出るドメイン"
|
||||
frequently-replied-users: "よう話しとるユーザー"
|
||||
frequently-replied-users: "よく話すユーザー"
|
||||
followers-you-know: "知っとるフォロワー"
|
||||
last-used-at: "最後いつ来た?"
|
||||
mobile/views/pages/user/home.followers-you-know.vue:
|
||||
no-users: "知っとるユーザーは居らん"
|
||||
mobile/views/pages/user/home.friends.vue:
|
||||
no-users: "よう話すユーザーは居らん"
|
||||
mobile/views/pages/user/home.notes.vue:
|
||||
no-notes: "投稿はあらへん"
|
||||
mobile/views/pages/user/home.photos.vue:
|
||||
no-photos: "写真はあらへんで"
|
||||
deck:
|
||||
@ -1622,9 +1612,11 @@ deck:
|
||||
rename: "名前を変えるで"
|
||||
stack-left: "左に重ねんで!"
|
||||
pop-right: "右に出すで!"
|
||||
disabled-timeline:
|
||||
title: "無効化されたタイムライン"
|
||||
description: "サーバーの運営者により、このタイムラインは使用できない状態に設定されています。"
|
||||
deck/deck.tl-column.vue:
|
||||
is-media-only: "メディア投稿だけや"
|
||||
is-media-view: "メディアビュー"
|
||||
edit: "オプション"
|
||||
deck/deck.user-column.vue:
|
||||
follows-you: "フォローされています"
|
||||
|
@ -28,6 +28,8 @@ common:
|
||||
load-more: "더보기"
|
||||
enter-password: "비밀번호를 입력하여 주십시오"
|
||||
2fa: "2단계 인증"
|
||||
customize-home: "홈 커스터마이징"
|
||||
featured-notes: "하이라이트"
|
||||
got-it: "알겠습니다"
|
||||
customization-tips:
|
||||
title: "커스터마이징 도움말"
|
||||
@ -56,6 +58,14 @@ common:
|
||||
trash: "휴지통"
|
||||
drive: "드라이브"
|
||||
messaging: "대화"
|
||||
deck: "덱"
|
||||
timeline: "타임라인"
|
||||
explore: "발견"
|
||||
following: "팔로우 중"
|
||||
followers: "팔로워"
|
||||
empty-timeline-info:
|
||||
follow-users-to-make-your-timeline: "사용자를 팔로우하면 글이 타임라인에 표시됩니다."
|
||||
explore: "사용자 탐색"
|
||||
weekday-short:
|
||||
sunday: "일"
|
||||
monday: "월"
|
||||
@ -134,6 +144,7 @@ common:
|
||||
is-remote-post: "이 글 정보는 복사본입니다."
|
||||
view-on-remote: "정확한 정보 보기"
|
||||
renoted-by: "{user}이(가) 리노트"
|
||||
no-notes: "글이 없습니다"
|
||||
error:
|
||||
title: "오류가 발생했습니다"
|
||||
retry: "다시 시도"
|
||||
@ -197,6 +208,17 @@ auth/views/index.vue:
|
||||
please-go-back: "어플리케이션으로 돌아가여 시도하여 주십시오."
|
||||
error: "세션이 존재하지 않습니다."
|
||||
sign-in: "로그인 해주시기 바랍니다"
|
||||
common/views/pages/explore.vue:
|
||||
verified-users: "공식 계정"
|
||||
popular-users: "인기 사용자"
|
||||
recently-updated-users: "최근 게시한 사용자"
|
||||
recently-registered-users: "신규 사용자"
|
||||
popular-tags: "인기 태그"
|
||||
federated: "연합"
|
||||
explore: "{host}을(를) 탐색"
|
||||
users-info: "현재 {users} 사용자가 등록되어 있습니다"
|
||||
common/views/components/user-list.vue:
|
||||
no-users: "사용자가 없습니다"
|
||||
common/views/components/games/reversi/reversi.vue:
|
||||
matching:
|
||||
waiting-for: "{}을(를) 기다리고 있습니다"
|
||||
@ -209,7 +231,7 @@ common/views/components/games/reversi/reversi.game.vue:
|
||||
can-put-everywhere: "어디에도 둘 수 있는 모드"
|
||||
common/views/components/games/reversi/reversi.index.vue:
|
||||
title: "Misskey Reversi"
|
||||
sub-title: "다른 Misskey 유저와 리버시로 대결하자"
|
||||
sub-title: "다른 Misskey 사용자와 리버시로 대결하자"
|
||||
invite: "초대"
|
||||
rule: "게임 방법"
|
||||
rule-desc: "리버시는 상대와 번갈아가며 돌을 판에 두고, 상대의 돌을 자신의 돌 사이에 두어 자신의 색으로 바꿔나가며, 최종적으로 남아있는 돌이 많은 쪽이 승리하는 보드게임입니다."
|
||||
@ -516,6 +538,10 @@ common/views/components/profile-editor.vue:
|
||||
mute-list: "뮤트"
|
||||
blocking-list: "차단"
|
||||
export-requested: "내보내기를 요청하였습니다. 이 작업은 시간이 걸릴 수 있습니다. 내보내기가 완료되면 드라이브에 파일이 추가됩니다."
|
||||
enter-password: "비밀번호를 입력하여 주십시오"
|
||||
danger-zone: "위험한 설정"
|
||||
delete-account: "계정 삭제"
|
||||
account-deleted: "계정이 삭제되었습니다. 데이터가 사라질 때까지 시간이 걸릴 수 있습니다."
|
||||
common/views/components/user-list-editor.vue:
|
||||
users: "사용자"
|
||||
rename: "리스트 이름 바꾸기"
|
||||
@ -684,12 +710,6 @@ desktop/views/components/following-window.vue:
|
||||
following: "{} 의 팔로우"
|
||||
desktop/views/components/following.vue:
|
||||
empty: "팔로우중인 사용자가 없는 것 같습니다."
|
||||
desktop/views/components/friends-maker.vue:
|
||||
title: "마음에 드는 사용자를 팔로우:"
|
||||
empty: "추천 사용자를 찾을 수 없습니다."
|
||||
fetching: "불러오는 중입니다"
|
||||
refresh: "더 보기"
|
||||
close: "닫기"
|
||||
desktop/views/components/game-window.vue:
|
||||
game: "리버시"
|
||||
desktop/views/components/home.vue:
|
||||
@ -798,13 +818,9 @@ desktop/views/components/settings.vue:
|
||||
web-search-engine-desc: "예: https://www.google.com/?#q={{query}}"
|
||||
auto-popout: "창 자동 팝아웃"
|
||||
auto-popout-desc: "창이 열릴 때 팝아웃 (브라우저 밖으로 분리) 이 가능한 경우 자동으로 팝아웃합니다. 이 설정은 브라우저에 저장됩니다."
|
||||
deck-nav: "덱 내 탐색"
|
||||
deck-nav-desc: "덱을 사용중일 때, 내비게이션이 발생하였을 경우 페이지를 이동하지 않고 일시적으로 임시 칼럼을 생성하도록 합니다."
|
||||
keep-cw: "CW 유지"
|
||||
keep-cw-desc: "글에 답글을 달 때, 답글할 글에 CW가 설정되어 있는 경우 기본값으로 동일한 CW를 설정하도록 합니다."
|
||||
deck-default: "덱을 기본 UI로 설정"
|
||||
display: "디자인 및 표시"
|
||||
customize: "홈 커스터마이징"
|
||||
wallpaper: "배경"
|
||||
choose-wallpaper: "배경 설정"
|
||||
delete-wallpaper: "배경 제거"
|
||||
@ -961,14 +977,11 @@ desktop/views/components/ui.header.account.vue:
|
||||
favorites: "즐겨찾기"
|
||||
lists: "리스트"
|
||||
follow-requests: "팔로우 요청"
|
||||
customize: "홈 커스터마이징"
|
||||
admin: "관리"
|
||||
settings: "설정"
|
||||
signout: "로그아웃"
|
||||
dark: "어둠에 삼켜져라"
|
||||
desktop/views/components/ui.header.nav.vue:
|
||||
home: "홈"
|
||||
deck: "덱"
|
||||
game: "게임"
|
||||
desktop/views/components/ui.header.notifications.vue:
|
||||
title: "알림"
|
||||
@ -1040,7 +1053,7 @@ admin/views/instance.vue:
|
||||
maintainer-email: "관리자 연락처"
|
||||
drive-config: "드라이브 설정"
|
||||
cache-remote-files: "원격 파일을 캐시"
|
||||
cache-remote-files-desc: "이 설정을 해지하면 원격 파일을 캐시하지 않고 해당 파일을 직접 링크하게 됩니다. 그에 따라 서버의 저장 공간을 절약할 수 있지만, 프라이버시 설정에서 직접 링크를 무효로 설정한 유저에게는 파일이 보이지 않거나, 썸네일이 생성되지 않기 때문에 통신량이 증가합니다. 일반적으로 이 설정을 ON으로 두는 것을 추천합니다."
|
||||
cache-remote-files-desc: "이 설정을 해지하면 원격 파일을 캐시하지 않고 해당 파일을 직접 링크하게 됩니다. 그에 따라 서버의 저장 공간을 절약할 수 있지만, 프라이버시 설정에서 직접 링크를 무효로 설정한 사용자에게는 파일이 보이지 않거나, 썸네일이 생성되지 않기 때문에 통신량이 증가합니다. 일반적으로 이 설정을 ON으로 두는 것을 추천합니다."
|
||||
local-drive-capacity-mb: "로컬 사용자 한 명당 드라이브 용량"
|
||||
remote-drive-capacity-mb: "원격 사용자 한 명당 드라이브 용량"
|
||||
mb: "메가바이트 단위"
|
||||
@ -1091,6 +1104,7 @@ admin/views/instance.vue:
|
||||
smtp-secure-info: "STARTTLS를 사용 시 ON으로 합니다."
|
||||
smtp-host: "SMTP 호스트"
|
||||
smtp-port: "SMTP 포트"
|
||||
smtp-auth: "SMTP 인증 수행"
|
||||
smtp-user: "SMTP 사용자"
|
||||
smtp-pass: "SMTP 비밀번호"
|
||||
serviceworker-config: "ServiceWorker"
|
||||
@ -1306,8 +1320,6 @@ desktop/views/pages/welcome.vue:
|
||||
info: "정보"
|
||||
desktop/views/pages/drive.vue:
|
||||
title: "Misskey Drive"
|
||||
desktop/views/pages/home-customize.vue:
|
||||
title: "홈 커스터마이징"
|
||||
desktop/views/pages/note.vue:
|
||||
prev: "이전 글"
|
||||
next: "다음 글"
|
||||
@ -1339,24 +1351,22 @@ desktop/views/pages/user/user.photos.vue:
|
||||
title: "사진"
|
||||
loading: "로드 중"
|
||||
no-photos: "사진이 없습니다"
|
||||
desktop/views/pages/user/user.profile.vue:
|
||||
follows-you: "당신을 팔로우합니다"
|
||||
menu: "메뉴"
|
||||
desktop/views/pages/user/user.header.vue:
|
||||
posts: "글"
|
||||
following: "팔로잉"
|
||||
followers: "팔로워"
|
||||
is-bot: "이 계정은 Bot입니다"
|
||||
no-description: "자기소개가 없습니다"
|
||||
years-old: "{age}세"
|
||||
year: "년"
|
||||
month: "월"
|
||||
day: "일"
|
||||
follows-you: "당신을 팔로우합니다"
|
||||
desktop/views/pages/user/user.timeline.vue:
|
||||
default: "글"
|
||||
with-replies: "글과 답글"
|
||||
with-media: "미디어"
|
||||
my-posts: "내 글"
|
||||
empty: "이 사용자는 아직 아무것도 게시하지 않은 것 같습니다."
|
||||
desktop/views/widgets/messaging.vue:
|
||||
title: "메시지"
|
||||
desktop/views/widgets/notifications.vue:
|
||||
@ -1418,12 +1428,6 @@ common/views/components/follow-button.vue:
|
||||
request-pending: "팔로우 허가 대기중"
|
||||
follow-processing: "팔로우 처리중"
|
||||
follow-request: "팔로우 요청"
|
||||
mobile/views/components/friends-maker.vue:
|
||||
title: "마음에 드는 사용자를 팔로우"
|
||||
empty: "추천 사용자를 찾을 수 없습니다."
|
||||
fetching: "불러오는 중입니다"
|
||||
refresh: "더 보기"
|
||||
close: "닫기"
|
||||
mobile/views/components/note.vue:
|
||||
private: "이 글은 비공개입니다"
|
||||
deleted: "이 글은 삭제되었습니다"
|
||||
@ -1460,8 +1464,6 @@ mobile/views/components/sub-note-content.vue:
|
||||
deleted: "이 글은 삭제되었습니다"
|
||||
media-count: "{}개의 미디어"
|
||||
poll: "투표"
|
||||
mobile/views/components/timeline.vue:
|
||||
empty: "글이 없습니다"
|
||||
mobile/views/components/ui.header.vue:
|
||||
welcome-back: "돌아오신 걸 환영합니다."
|
||||
adjective: "님"
|
||||
@ -1478,12 +1480,6 @@ mobile/views/components/ui.nav.vue:
|
||||
settings: "설정"
|
||||
admin: "관리"
|
||||
about: "Misskey에 대하여"
|
||||
mobile/views/components/user-timeline.vue:
|
||||
no-notes: "이 사용자는 작성한 글이 없는 것 같습니다."
|
||||
no-notes-with-media: "미디어가 첨부된 글이 없습니다."
|
||||
mobile/views/components/users-list.vue:
|
||||
all: "모두"
|
||||
known: "아는 사람"
|
||||
mobile/views/pages/favorites.vue:
|
||||
title: "즐겨찾기"
|
||||
mobile/views/pages/user-lists.vue:
|
||||
@ -1591,15 +1587,9 @@ mobile/views/pages/user/home.vue:
|
||||
activity: "활동"
|
||||
keywords: "키워드"
|
||||
domains: "자주 보이는 도메인"
|
||||
frequently-replied-users: "자주 대화하는 사용자"
|
||||
frequently-replied-users: "자주 언급되는 사용자"
|
||||
followers-you-know: "아는 사람의 팔로워"
|
||||
last-used-at: "마지막 로그인"
|
||||
mobile/views/pages/user/home.followers-you-know.vue:
|
||||
no-users: "아는 사용자가 없습니다"
|
||||
mobile/views/pages/user/home.friends.vue:
|
||||
no-users: "자주 대화하는 사용자가 없습니다"
|
||||
mobile/views/pages/user/home.notes.vue:
|
||||
no-notes: "글이 없습니다"
|
||||
mobile/views/pages/user/home.photos.vue:
|
||||
no-photos: "사진이 없습니다"
|
||||
deck:
|
||||
@ -1622,9 +1612,11 @@ deck:
|
||||
rename: "이름 변경"
|
||||
stack-left: "왼쪽에 쌓기"
|
||||
pop-right: "오른쪽으로 빼기"
|
||||
disabled-timeline:
|
||||
title: "비활성화된 타임라인"
|
||||
description: "서버 운영자에 의해 이 타임라인이 사용할 수 없도록 설정되어 있습니다."
|
||||
deck/deck.tl-column.vue:
|
||||
is-media-only: "미디어가 달린 글만"
|
||||
is-media-view: "미디어 보기"
|
||||
edit: "옵션"
|
||||
deck/deck.user-column.vue:
|
||||
follows-you: "당신을 팔로우합니다"
|
||||
|
@ -28,6 +28,8 @@ common:
|
||||
load-more: "もっと読み込む"
|
||||
enter-password: "パスワードを入力してください"
|
||||
2fa: "二段階認証"
|
||||
customize-home: "ホームをカスタマイズ"
|
||||
featured-notes: "ハイライト"
|
||||
got-it: "わかった"
|
||||
customization-tips:
|
||||
title: "カスタマイズのヒント"
|
||||
@ -56,6 +58,14 @@ common:
|
||||
trash: "ゴミ箱"
|
||||
drive: "ドライブ"
|
||||
messaging: "トーク"
|
||||
deck: "デッキ"
|
||||
timeline: "タイムライン"
|
||||
explore: "みつける"
|
||||
following: "フォロー中"
|
||||
followers: "フォロワー"
|
||||
empty-timeline-info:
|
||||
follow-users-to-make-your-timeline: "ユーザーをフォローすると投稿がタイムラインに表示されます。"
|
||||
explore: "ユーザーを探索する"
|
||||
weekday-short:
|
||||
sunday: "Z"
|
||||
monday: "M"
|
||||
@ -134,6 +144,7 @@ common:
|
||||
is-remote-post: "この投稿情報はコピーです。"
|
||||
view-on-remote: "正確な情報を見る"
|
||||
renoted-by: "{user}がRenote"
|
||||
no-notes: "投稿がありません"
|
||||
error:
|
||||
title: "問題が発生しました"
|
||||
retry: "やり直す"
|
||||
@ -197,6 +208,17 @@ auth/views/index.vue:
|
||||
please-go-back: "アプリケーションに戻って、やっていってください。"
|
||||
error: "セッションが存在しません。"
|
||||
sign-in: "サインインしてください"
|
||||
common/views/pages/explore.vue:
|
||||
verified-users: "公式アカウント"
|
||||
popular-users: "人気のユーザー"
|
||||
recently-updated-users: "最近投稿したユーザー"
|
||||
recently-registered-users: "新規ユーザー"
|
||||
popular-tags: "人気のタグ"
|
||||
federated: "連合"
|
||||
explore: "{host}を探索"
|
||||
users-info: "現在{users}ユーザーが登録されています"
|
||||
common/views/components/user-list.vue:
|
||||
no-users: "ユーザーがいません"
|
||||
common/views/components/games/reversi/reversi.vue:
|
||||
matching:
|
||||
waiting-for: "{}を待っています"
|
||||
@ -516,6 +538,10 @@ common/views/components/profile-editor.vue:
|
||||
mute-list: "ミュート"
|
||||
blocking-list: "ブロック"
|
||||
export-requested: "エクスポートをリクエストしました。これには時間がかかる場合があります。エクスポートが終わると、ドライブにファイルが追加されます。"
|
||||
enter-password: "パスワードを入力してください"
|
||||
danger-zone: "危険な設定"
|
||||
delete-account: "アカウントを削除"
|
||||
account-deleted: "アカウントが削除されました。データが消えるまで時間がかかる場合があります。"
|
||||
common/views/components/user-list-editor.vue:
|
||||
users: "ユーザー"
|
||||
rename: "リスト名を変更"
|
||||
@ -684,12 +710,6 @@ desktop/views/components/following-window.vue:
|
||||
following: "Volgend {}"
|
||||
desktop/views/components/following.vue:
|
||||
empty: "Je volgt niemand."
|
||||
desktop/views/components/friends-maker.vue:
|
||||
title: "Aanbevolen gebruikers:"
|
||||
empty: "Er zijn geen vergelijkbare gebruikers gevonden."
|
||||
fetching: "Bezig met laden…"
|
||||
refresh: "Meer"
|
||||
close: "Sluiten"
|
||||
desktop/views/components/game-window.vue:
|
||||
game: "Othello"
|
||||
desktop/views/components/home.vue:
|
||||
@ -798,13 +818,9 @@ desktop/views/components/settings.vue:
|
||||
web-search-engine-desc: "例: https://www.google.com/?#q={{query}}"
|
||||
auto-popout: "Venster automatisch uitvouwen"
|
||||
auto-popout-desc: "Venster uitvouwen, indien mogelijk. Deze instelling wordt opgeslagen in je browser."
|
||||
deck-nav: "デッキ内ナビゲーション"
|
||||
deck-nav-desc: "デッキを使用しているとき、ナビゲーションが発生する際にページ遷移を行わずに一時的なカラムで受けるようにします。"
|
||||
keep-cw: "CW保持"
|
||||
keep-cw-desc: "投稿にリプライする際、リプライ元の投稿にCWが設定されていたとき、デフォルトで同じCWを設定するようにします。"
|
||||
deck-default: "デッキをデフォルトのUIにする"
|
||||
display: "Ontwerp en weergave"
|
||||
customize: "Startpagina aanpassen"
|
||||
wallpaper: "壁紙"
|
||||
choose-wallpaper: "壁紙を選択"
|
||||
delete-wallpaper: "壁紙を削除"
|
||||
@ -961,14 +977,11 @@ desktop/views/components/ui.header.account.vue:
|
||||
favorites: "Favorieten"
|
||||
lists: "Lijsten"
|
||||
follow-requests: "フォロー申請"
|
||||
customize: "Aanpassen"
|
||||
admin: "管理"
|
||||
settings: "Instellingen"
|
||||
signout: "Uitloggen"
|
||||
dark: "Donkere modus"
|
||||
desktop/views/components/ui.header.nav.vue:
|
||||
home: "Startpagina"
|
||||
deck: "デッキ"
|
||||
game: "Othello spelen"
|
||||
desktop/views/components/ui.header.notifications.vue:
|
||||
title: "Meldingen"
|
||||
@ -1091,6 +1104,7 @@ admin/views/instance.vue:
|
||||
smtp-secure-info: "STARTTLS使用時はオフにします。"
|
||||
smtp-host: "SMTPホスト"
|
||||
smtp-port: "SMTPポート"
|
||||
smtp-auth: "SMTP認証を行う"
|
||||
smtp-user: "SMTPユーザー"
|
||||
smtp-pass: "SMTPパスワード"
|
||||
serviceworker-config: "ServiceWorker"
|
||||
@ -1306,8 +1320,6 @@ desktop/views/pages/welcome.vue:
|
||||
info: "情報"
|
||||
desktop/views/pages/drive.vue:
|
||||
title: "Misskey Drive"
|
||||
desktop/views/pages/home-customize.vue:
|
||||
title: "Startpagina aanpassen"
|
||||
desktop/views/pages/note.vue:
|
||||
prev: "Vorige notitie"
|
||||
next: "Volgende notitie"
|
||||
@ -1339,24 +1351,22 @@ desktop/views/pages/user/user.photos.vue:
|
||||
title: "Foto's"
|
||||
loading: "Bezig met laden"
|
||||
no-photos: "Geen foto's"
|
||||
desktop/views/pages/user/user.profile.vue:
|
||||
follows-you: "Volgt jou"
|
||||
menu: "メニュー"
|
||||
desktop/views/pages/user/user.header.vue:
|
||||
posts: "投稿"
|
||||
following: "フォロー"
|
||||
followers: "フォロワー"
|
||||
is-bot: "このアカウントはBotです"
|
||||
no-description: "自己紹介はありません"
|
||||
years-old: "{age}歳"
|
||||
year: "年"
|
||||
month: "月"
|
||||
day: "日"
|
||||
follows-you: "フォローされています"
|
||||
desktop/views/pages/user/user.timeline.vue:
|
||||
default: "Berichten"
|
||||
with-replies: "Berichten en antwoorden"
|
||||
with-media: "Media"
|
||||
my-posts: "私の投稿"
|
||||
empty: "Deze gebruiker heeft nog niks geplaatst."
|
||||
desktop/views/widgets/messaging.vue:
|
||||
title: "Gesprekken"
|
||||
desktop/views/widgets/notifications.vue:
|
||||
@ -1418,12 +1428,6 @@ common/views/components/follow-button.vue:
|
||||
request-pending: "フォロー許可待ち"
|
||||
follow-processing: "フォロー処理中"
|
||||
follow-request: "フォロー申請"
|
||||
mobile/views/components/friends-maker.vue:
|
||||
title: "気になるユーザーをフォロー"
|
||||
empty: "おすすめのユーザーは見つかりませんでした。"
|
||||
fetching: "読み込んでいます"
|
||||
refresh: "もっと見る"
|
||||
close: "閉じる"
|
||||
mobile/views/components/note.vue:
|
||||
private: "この投稿は非公開です"
|
||||
deleted: "この投稿は削除されました"
|
||||
@ -1460,8 +1464,6 @@ mobile/views/components/sub-note-content.vue:
|
||||
deleted: "この投稿は削除されました"
|
||||
media-count: "{} media"
|
||||
poll: "Peiling"
|
||||
mobile/views/components/timeline.vue:
|
||||
empty: "Geen notities"
|
||||
mobile/views/components/ui.header.vue:
|
||||
welcome-back: "おかえりなさい、"
|
||||
adjective: "さん"
|
||||
@ -1478,12 +1480,6 @@ mobile/views/components/ui.nav.vue:
|
||||
settings: "Instellingen"
|
||||
admin: "管理"
|
||||
about: "Over Misskey"
|
||||
mobile/views/components/user-timeline.vue:
|
||||
no-notes: "Het lijkt erop dat deze gebruiker nog niks heeft geplaatst"
|
||||
no-notes-with-media: "Er zijn geen notities met bijgevoegde media"
|
||||
mobile/views/components/users-list.vue:
|
||||
all: "Alles"
|
||||
known: "die je kent"
|
||||
mobile/views/pages/favorites.vue:
|
||||
title: "お気に入り"
|
||||
mobile/views/pages/user-lists.vue:
|
||||
@ -1591,15 +1587,9 @@ mobile/views/pages/user/home.vue:
|
||||
activity: "Activiteit"
|
||||
keywords: "Sleutelwoorden"
|
||||
domains: "Domeinnamen"
|
||||
frequently-replied-users: "Frequent gesproken gebruikers"
|
||||
frequently-replied-users: "よく話すユーザー"
|
||||
followers-you-know: "Volgers die je kent"
|
||||
last-used-at: "Laatst actief"
|
||||
mobile/views/pages/user/home.followers-you-know.vue:
|
||||
no-users: "Geen gebruikers"
|
||||
mobile/views/pages/user/home.friends.vue:
|
||||
no-users: "Geen gebruikers"
|
||||
mobile/views/pages/user/home.notes.vue:
|
||||
no-notes: "Geen notities"
|
||||
mobile/views/pages/user/home.photos.vue:
|
||||
no-photos: "Geen foto's"
|
||||
deck:
|
||||
@ -1622,9 +1612,11 @@ deck:
|
||||
rename: "名前を変更"
|
||||
stack-left: "左に重ねる"
|
||||
pop-right: "右に出す"
|
||||
disabled-timeline:
|
||||
title: "無効化されたタイムライン"
|
||||
description: "サーバーの運営者により、このタイムラインは使用できない状態に設定されています。"
|
||||
deck/deck.tl-column.vue:
|
||||
is-media-only: "メディア投稿のみ"
|
||||
is-media-view: "メディアビュー"
|
||||
edit: "オプション"
|
||||
deck/deck.user-column.vue:
|
||||
follows-you: "フォローされています"
|
||||
|
@ -28,6 +28,8 @@ common:
|
||||
load-more: "もっと読み込む"
|
||||
enter-password: "パスワードを入力してください"
|
||||
2fa: "二段階認証"
|
||||
customize-home: "ホームをカスタマイズ"
|
||||
featured-notes: "ハイライト"
|
||||
got-it: "Skjønner!"
|
||||
customization-tips:
|
||||
title: "カスタマイズのヒント"
|
||||
@ -56,6 +58,14 @@ common:
|
||||
trash: "Papirkurv"
|
||||
drive: "ドライブ"
|
||||
messaging: "トーク"
|
||||
deck: "デッキ"
|
||||
timeline: "タイムライン"
|
||||
explore: "みつける"
|
||||
following: "フォロー中"
|
||||
followers: "フォロワー"
|
||||
empty-timeline-info:
|
||||
follow-users-to-make-your-timeline: "ユーザーをフォローすると投稿がタイムラインに表示されます。"
|
||||
explore: "ユーザーを探索する"
|
||||
weekday-short:
|
||||
sunday: "S"
|
||||
monday: "M"
|
||||
@ -134,6 +144,7 @@ common:
|
||||
is-remote-post: "この投稿情報はコピーです。"
|
||||
view-on-remote: "正確な情報を見る"
|
||||
renoted-by: "{user}がRenote"
|
||||
no-notes: "投稿がありません"
|
||||
error:
|
||||
title: "問題が発生しました"
|
||||
retry: "やり直す"
|
||||
@ -197,6 +208,17 @@ auth/views/index.vue:
|
||||
please-go-back: "アプリケーションに戻って、やっていってください。"
|
||||
error: "セッションが存在しません。"
|
||||
sign-in: "サインインしてください"
|
||||
common/views/pages/explore.vue:
|
||||
verified-users: "公式アカウント"
|
||||
popular-users: "人気のユーザー"
|
||||
recently-updated-users: "最近投稿したユーザー"
|
||||
recently-registered-users: "新規ユーザー"
|
||||
popular-tags: "人気のタグ"
|
||||
federated: "連合"
|
||||
explore: "{host}を探索"
|
||||
users-info: "現在{users}ユーザーが登録されています"
|
||||
common/views/components/user-list.vue:
|
||||
no-users: "ユーザーがいません"
|
||||
common/views/components/games/reversi/reversi.vue:
|
||||
matching:
|
||||
waiting-for: "{}を待っています"
|
||||
@ -516,6 +538,10 @@ common/views/components/profile-editor.vue:
|
||||
mute-list: "ミュート"
|
||||
blocking-list: "ブロック"
|
||||
export-requested: "エクスポートをリクエストしました。これには時間がかかる場合があります。エクスポートが終わると、ドライブにファイルが追加されます。"
|
||||
enter-password: "パスワードを入力してください"
|
||||
danger-zone: "危険な設定"
|
||||
delete-account: "アカウントを削除"
|
||||
account-deleted: "アカウントが削除されました。データが消えるまで時間がかかる場合があります。"
|
||||
common/views/components/user-list-editor.vue:
|
||||
users: "ユーザー"
|
||||
rename: "リスト名を変更"
|
||||
@ -684,12 +710,6 @@ desktop/views/components/following-window.vue:
|
||||
following: "{} のフォロー"
|
||||
desktop/views/components/following.vue:
|
||||
empty: "フォロー中のユーザーはいないようです。"
|
||||
desktop/views/components/friends-maker.vue:
|
||||
title: "気になるユーザーをフォロー:"
|
||||
empty: "おすすめのユーザーは見つかりませんでした。"
|
||||
fetching: "読み込んでいます"
|
||||
refresh: "Mer"
|
||||
close: "Lukk"
|
||||
desktop/views/components/game-window.vue:
|
||||
game: "Reversi"
|
||||
desktop/views/components/home.vue:
|
||||
@ -798,13 +818,9 @@ desktop/views/components/settings.vue:
|
||||
web-search-engine-desc: "例: https://www.google.com/?#q={{query}}"
|
||||
auto-popout: "ウィンドウの自動ポップアウト"
|
||||
auto-popout-desc: "ウィンドウが開かれるとき、ポップアウト(ブラウザ外に切り離す)可能なら自動でポップアウトします。この設定はブラウザに記憶されます。"
|
||||
deck-nav: "デッキ内ナビゲーション"
|
||||
deck-nav-desc: "デッキを使用しているとき、ナビゲーションが発生する際にページ遷移を行わずに一時的なカラムで受けるようにします。"
|
||||
keep-cw: "CW保持"
|
||||
keep-cw-desc: "投稿にリプライする際、リプライ元の投稿にCWが設定されていたとき、デフォルトで同じCWを設定するようにします。"
|
||||
deck-default: "デッキをデフォルトのUIにする"
|
||||
display: "デザインと表示"
|
||||
customize: "ホームをカスタマイズ"
|
||||
wallpaper: "壁紙"
|
||||
choose-wallpaper: "壁紙を選択"
|
||||
delete-wallpaper: "壁紙を削除"
|
||||
@ -961,14 +977,11 @@ desktop/views/components/ui.header.account.vue:
|
||||
favorites: "Favoritter"
|
||||
lists: "Lister"
|
||||
follow-requests: "フォロー申請"
|
||||
customize: "ホームのカスタマイズ"
|
||||
admin: "Admin"
|
||||
settings: "Innstillinger"
|
||||
signout: "サインアウト"
|
||||
dark: "闇に飲まれる"
|
||||
desktop/views/components/ui.header.nav.vue:
|
||||
home: "Hjem"
|
||||
deck: "Kolonner"
|
||||
game: "Spill"
|
||||
desktop/views/components/ui.header.notifications.vue:
|
||||
title: "Notifikasjon"
|
||||
@ -1091,6 +1104,7 @@ admin/views/instance.vue:
|
||||
smtp-secure-info: "STARTTLS使用時はオフにします。"
|
||||
smtp-host: "SMTPホスト"
|
||||
smtp-port: "SMTPポート"
|
||||
smtp-auth: "SMTP認証を行う"
|
||||
smtp-user: "SMTPユーザー"
|
||||
smtp-pass: "SMTPパスワード"
|
||||
serviceworker-config: "ServiceWorker"
|
||||
@ -1306,8 +1320,6 @@ desktop/views/pages/welcome.vue:
|
||||
info: "Informasjon"
|
||||
desktop/views/pages/drive.vue:
|
||||
title: "Misskey Drive"
|
||||
desktop/views/pages/home-customize.vue:
|
||||
title: "ホームのカスタマイズ"
|
||||
desktop/views/pages/note.vue:
|
||||
prev: "Forrige innlegg"
|
||||
next: "Neste innlegg"
|
||||
@ -1339,24 +1351,22 @@ desktop/views/pages/user/user.photos.vue:
|
||||
title: "Bilder"
|
||||
loading: "Laster inn"
|
||||
no-photos: "写真はありません"
|
||||
desktop/views/pages/user/user.profile.vue:
|
||||
follows-you: "フォローされています"
|
||||
menu: "メニュー"
|
||||
desktop/views/pages/user/user.header.vue:
|
||||
posts: "Innlegg"
|
||||
following: "Følger"
|
||||
followers: "フォロワー"
|
||||
is-bot: "このアカウントはBotです"
|
||||
no-description: "自己紹介はありません"
|
||||
years-old: "{age}歳"
|
||||
year: "年"
|
||||
month: "月"
|
||||
day: "日"
|
||||
follows-you: "フォローされています"
|
||||
desktop/views/pages/user/user.timeline.vue:
|
||||
default: "Innlegg"
|
||||
with-replies: "Innlegg og svar"
|
||||
with-media: "Media"
|
||||
my-posts: "私の投稿"
|
||||
empty: "このユーザーはまだ何も投稿していないようです。"
|
||||
desktop/views/widgets/messaging.vue:
|
||||
title: "Melding"
|
||||
desktop/views/widgets/notifications.vue:
|
||||
@ -1418,12 +1428,6 @@ common/views/components/follow-button.vue:
|
||||
request-pending: "フォロー許可待ち"
|
||||
follow-processing: "フォロー処理中"
|
||||
follow-request: "フォロー申請"
|
||||
mobile/views/components/friends-maker.vue:
|
||||
title: "気になるユーザーをフォロー"
|
||||
empty: "おすすめのユーザーは見つかりませんでした。"
|
||||
fetching: "読み込んでいます"
|
||||
refresh: "Se mer"
|
||||
close: "Lukk"
|
||||
mobile/views/components/note.vue:
|
||||
private: "この投稿は非公開です"
|
||||
deleted: "この投稿は削除されました"
|
||||
@ -1460,8 +1464,6 @@ mobile/views/components/sub-note-content.vue:
|
||||
deleted: "この投稿は削除されました"
|
||||
media-count: "{}つのメディア"
|
||||
poll: "アンケート"
|
||||
mobile/views/components/timeline.vue:
|
||||
empty: "投稿がありません"
|
||||
mobile/views/components/ui.header.vue:
|
||||
welcome-back: "おかえりなさい、"
|
||||
adjective: "Mr."
|
||||
@ -1478,12 +1480,6 @@ mobile/views/components/ui.nav.vue:
|
||||
settings: "Innstillinger"
|
||||
admin: "Admin"
|
||||
about: "Misskeyについて"
|
||||
mobile/views/components/user-timeline.vue:
|
||||
no-notes: "このユーザーは投稿していないようです。"
|
||||
no-notes-with-media: "メディア付き投稿はありません。"
|
||||
mobile/views/components/users-list.vue:
|
||||
all: "Alle"
|
||||
known: "Du kjenner"
|
||||
mobile/views/pages/favorites.vue:
|
||||
title: "Favoritter"
|
||||
mobile/views/pages/user-lists.vue:
|
||||
@ -1594,12 +1590,6 @@ mobile/views/pages/user/home.vue:
|
||||
frequently-replied-users: "よく話すユーザー"
|
||||
followers-you-know: "知り合いのフォロワー"
|
||||
last-used-at: "最終ログイン"
|
||||
mobile/views/pages/user/home.followers-you-know.vue:
|
||||
no-users: "知り合いのユーザーはいません"
|
||||
mobile/views/pages/user/home.friends.vue:
|
||||
no-users: "よく話すユーザーはいません"
|
||||
mobile/views/pages/user/home.notes.vue:
|
||||
no-notes: "投稿はありません"
|
||||
mobile/views/pages/user/home.photos.vue:
|
||||
no-photos: "写真はありません"
|
||||
deck:
|
||||
@ -1622,9 +1612,11 @@ deck:
|
||||
rename: "名前を変更"
|
||||
stack-left: "左に重ねる"
|
||||
pop-right: "右に出す"
|
||||
disabled-timeline:
|
||||
title: "無効化されたタイムライン"
|
||||
description: "サーバーの運営者により、このタイムラインは使用できない状態に設定されています。"
|
||||
deck/deck.tl-column.vue:
|
||||
is-media-only: "メディア投稿のみ"
|
||||
is-media-view: "メディアビュー"
|
||||
edit: "オプション"
|
||||
deck/deck.user-column.vue:
|
||||
follows-you: "フォローされています"
|
||||
|
@ -28,6 +28,8 @@ common:
|
||||
load-more: "Załaduj więcej"
|
||||
enter-password: "Wprowadź Hasło"
|
||||
2fa: "Uwierzytelnienie dwuetapowe"
|
||||
customize-home: "ホームをカスタマイズ"
|
||||
featured-notes: "ハイライト"
|
||||
got-it: "Rozumiem!"
|
||||
customization-tips:
|
||||
title: "Wskazówki o dostosowywaniu"
|
||||
@ -56,6 +58,14 @@ common:
|
||||
trash: "Kosz"
|
||||
drive: "Dysk"
|
||||
messaging: "Rozmowy"
|
||||
deck: "デッキ"
|
||||
timeline: "タイムライン"
|
||||
explore: "みつける"
|
||||
following: "フォロー中"
|
||||
followers: "フォロワー"
|
||||
empty-timeline-info:
|
||||
follow-users-to-make-your-timeline: "ユーザーをフォローすると投稿がタイムラインに表示されます。"
|
||||
explore: "ユーザーを探索する"
|
||||
weekday-short:
|
||||
sunday: "N"
|
||||
monday: "Pn"
|
||||
@ -134,6 +144,7 @@ common:
|
||||
is-remote-post: "この投稿情報はコピーです。"
|
||||
view-on-remote: "Dla dopełnienia, zobacz to zdalnie."
|
||||
renoted-by: "{user} udostępnił(a)"
|
||||
no-notes: "投稿がありません"
|
||||
error:
|
||||
title: "Coś poszło nie tak"
|
||||
retry: "Ponów próbę"
|
||||
@ -197,6 +208,17 @@ auth/views/index.vue:
|
||||
please-go-back: "Wróć do aplikacji."
|
||||
error: "Sesja nie istnieje."
|
||||
sign-in: "Proszę zalogować się."
|
||||
common/views/pages/explore.vue:
|
||||
verified-users: "公式アカウント"
|
||||
popular-users: "人気のユーザー"
|
||||
recently-updated-users: "最近投稿したユーザー"
|
||||
recently-registered-users: "新規ユーザー"
|
||||
popular-tags: "人気のタグ"
|
||||
federated: "連合"
|
||||
explore: "{host}を探索"
|
||||
users-info: "現在{users}ユーザーが登録されています"
|
||||
common/views/components/user-list.vue:
|
||||
no-users: "ユーザーがいません"
|
||||
common/views/components/games/reversi/reversi.vue:
|
||||
matching:
|
||||
waiting-for: "Oczekiwanie na {}"
|
||||
@ -516,6 +538,10 @@ common/views/components/profile-editor.vue:
|
||||
mute-list: "ミュート"
|
||||
blocking-list: "ブロック"
|
||||
export-requested: "エクスポートをリクエストしました。これには時間がかかる場合があります。エクスポートが終わると、ドライブにファイルが追加されます。"
|
||||
enter-password: "パスワードを入力してください"
|
||||
danger-zone: "危険な設定"
|
||||
delete-account: "アカウントを削除"
|
||||
account-deleted: "アカウントが削除されました。データが消えるまで時間がかかる場合があります。"
|
||||
common/views/components/user-list-editor.vue:
|
||||
users: "Użytkownicy"
|
||||
rename: "Zmień nazwę listy"
|
||||
@ -684,12 +710,6 @@ desktop/views/components/following-window.vue:
|
||||
following: "Śledzeni przez {}"
|
||||
desktop/views/components/following.vue:
|
||||
empty: "Nikt Cię nie śledzi."
|
||||
desktop/views/components/friends-maker.vue:
|
||||
title: "Zacznij śledzić ludzi takich jak Ty:"
|
||||
empty: "Nie znaleziono podobnych użytkowników."
|
||||
fetching: "Ładowanie…"
|
||||
refresh: "Więcej"
|
||||
close: "Zamknij"
|
||||
desktop/views/components/game-window.vue:
|
||||
game: "Reversi"
|
||||
desktop/views/components/home.vue:
|
||||
@ -798,13 +818,9 @@ desktop/views/components/settings.vue:
|
||||
web-search-engine-desc: "Np: https://www.google.com/?#q={{query}}"
|
||||
auto-popout: "Automatycznie pojawiające się okna"
|
||||
auto-popout-desc: "ウィンドウが開かれるとき、ポップアウト(ブラウザ外に切り離す)可能なら自動でポップアウトします。この設定はブラウザに記憶されます。"
|
||||
deck-nav: "デッキ内ナビゲーション"
|
||||
deck-nav-desc: "デッキを使用しているとき、ナビゲーションが発生する際にページ遷移を行わずに一時的なカラムで受けるようにします。"
|
||||
keep-cw: "CW保持"
|
||||
keep-cw-desc: "投稿にリプライする際、リプライ元の投稿にCWが設定されていたとき、デフォルトで同じCWを設定するようにします。"
|
||||
deck-default: "Użyj Talię jako domyślne UI"
|
||||
display: "Wygląd i wyświetlanie"
|
||||
customize: "Dostosuj stronę główną"
|
||||
wallpaper: "Tapeta"
|
||||
choose-wallpaper: "Wybierz tło"
|
||||
delete-wallpaper: "Usuń tło"
|
||||
@ -961,14 +977,11 @@ desktop/views/components/ui.header.account.vue:
|
||||
favorites: "Ulubione"
|
||||
lists: "Listy"
|
||||
follow-requests: "Prośby o śledzenie"
|
||||
customize: "Dostosuj stronę główną"
|
||||
admin: "Admin"
|
||||
settings: "Ustawienia"
|
||||
signout: "Wyloguj się"
|
||||
dark: "Sprowadź ciemność"
|
||||
desktop/views/components/ui.header.nav.vue:
|
||||
home: "Strona główna"
|
||||
deck: "Talia"
|
||||
game: "Gra"
|
||||
desktop/views/components/ui.header.notifications.vue:
|
||||
title: "Powiadomienia"
|
||||
@ -1091,6 +1104,7 @@ admin/views/instance.vue:
|
||||
smtp-secure-info: "STARTTLS使用時はオフにします。"
|
||||
smtp-host: "SMTPホスト"
|
||||
smtp-port: "SMTPポート"
|
||||
smtp-auth: "SMTP認証を行う"
|
||||
smtp-user: "SMTPユーザー"
|
||||
smtp-pass: "SMTPパスワード"
|
||||
serviceworker-config: "ServiceWorker"
|
||||
@ -1306,8 +1320,6 @@ desktop/views/pages/welcome.vue:
|
||||
info: "Informacje"
|
||||
desktop/views/pages/drive.vue:
|
||||
title: "Dysk Misskey"
|
||||
desktop/views/pages/home-customize.vue:
|
||||
title: "Dostosuj stronę główną"
|
||||
desktop/views/pages/note.vue:
|
||||
prev: "Poprzedni wpis"
|
||||
next: "Następny wpis"
|
||||
@ -1339,24 +1351,22 @@ desktop/views/pages/user/user.photos.vue:
|
||||
title: "Zdjęcia"
|
||||
loading: "Ładowanie"
|
||||
no-photos: "Brak zdjęć"
|
||||
desktop/views/pages/user/user.profile.vue:
|
||||
follows-you: "Śledzi Cię"
|
||||
menu: "Menu"
|
||||
desktop/views/pages/user/user.header.vue:
|
||||
posts: "Wpisy"
|
||||
following: "Śledzeni"
|
||||
followers: "Śledzący"
|
||||
is-bot: "To konto jest botem"
|
||||
no-description: "自己紹介はありません"
|
||||
years-old: "{age} lat"
|
||||
year: "/"
|
||||
month: "/"
|
||||
day: "-"
|
||||
follows-you: "フォローされています"
|
||||
desktop/views/pages/user/user.timeline.vue:
|
||||
default: "Wpisy"
|
||||
with-replies: "Wpisy i odpowiedzi"
|
||||
with-media: "Multimedia"
|
||||
my-posts: "Moje wpisy"
|
||||
empty: "Ten użytkownik nie umieścił jeszcze niczego."
|
||||
desktop/views/widgets/messaging.vue:
|
||||
title: "Wiadomości"
|
||||
desktop/views/widgets/notifications.vue:
|
||||
@ -1418,12 +1428,6 @@ common/views/components/follow-button.vue:
|
||||
request-pending: "フォロー許可待ち"
|
||||
follow-processing: "Przetwarzanie"
|
||||
follow-request: "Poproś o śledzenie"
|
||||
mobile/views/components/friends-maker.vue:
|
||||
title: "Zacznij śledzić ludzi takich jak Ty"
|
||||
empty: "Nie znaleziono podobnych użytkowników."
|
||||
fetching: "Ładowanie…"
|
||||
refresh: "Więcej"
|
||||
close: "Zamknij"
|
||||
mobile/views/components/note.vue:
|
||||
private: "ten wpis jest prywatny"
|
||||
deleted: "ten wpis został usunięty"
|
||||
@ -1460,8 +1464,6 @@ mobile/views/components/sub-note-content.vue:
|
||||
deleted: "ten wpis został usunięty"
|
||||
media-count: "{}zawartości multimedialnej"
|
||||
poll: "Ankieta"
|
||||
mobile/views/components/timeline.vue:
|
||||
empty: "Brak wpisów"
|
||||
mobile/views/components/ui.header.vue:
|
||||
welcome-back: "Witaj ponownie, "
|
||||
adjective: "さん"
|
||||
@ -1478,12 +1480,6 @@ mobile/views/components/ui.nav.vue:
|
||||
settings: "Ustawienia"
|
||||
admin: "Admin"
|
||||
about: "O Misskey"
|
||||
mobile/views/components/user-timeline.vue:
|
||||
no-notes: "Wygląda na to, że ten użytkownik nie opublikował jeszcze niczego"
|
||||
no-notes-with-media: "Brak wpisów z zawartością multimedialną"
|
||||
mobile/views/components/users-list.vue:
|
||||
all: "Wszyscy"
|
||||
known: "Znasz"
|
||||
mobile/views/pages/favorites.vue:
|
||||
title: "Ulubione"
|
||||
mobile/views/pages/user-lists.vue:
|
||||
@ -1591,15 +1587,9 @@ mobile/views/pages/user/home.vue:
|
||||
activity: "Aktywność"
|
||||
keywords: "Słowa kluczowe"
|
||||
domains: "Domeny"
|
||||
frequently-replied-users: "Często aktywni użytkownicy"
|
||||
frequently-replied-users: "よく話すユーザー"
|
||||
followers-you-know: "Śledzący których znasz"
|
||||
last-used-at: "Ostatnio aktywny"
|
||||
mobile/views/pages/user/home.followers-you-know.vue:
|
||||
no-users: "Brak użytkowników"
|
||||
mobile/views/pages/user/home.friends.vue:
|
||||
no-users: "Brak użytkowników"
|
||||
mobile/views/pages/user/home.notes.vue:
|
||||
no-notes: "Brak wpisów"
|
||||
mobile/views/pages/user/home.photos.vue:
|
||||
no-photos: "Brak zdjęć"
|
||||
deck:
|
||||
@ -1622,9 +1612,11 @@ deck:
|
||||
rename: "Zmień nazwę"
|
||||
stack-left: "Przypnij do lewej"
|
||||
pop-right: "右に出す"
|
||||
disabled-timeline:
|
||||
title: "無効化されたタイムライン"
|
||||
description: "サーバーの運営者により、このタイムラインは使用できない状態に設定されています。"
|
||||
deck/deck.tl-column.vue:
|
||||
is-media-only: "Tylko wpisy z zawartością multimedialną"
|
||||
is-media-view: "Widok multimediów"
|
||||
edit: "Opcje"
|
||||
deck/deck.user-column.vue:
|
||||
follows-you: "フォローされています"
|
||||
|
@ -28,6 +28,8 @@ common:
|
||||
load-more: "もっと読み込む"
|
||||
enter-password: "パスワードを入力してください"
|
||||
2fa: "二段階認証"
|
||||
customize-home: "ホームをカスタマイズ"
|
||||
featured-notes: "ハイライト"
|
||||
got-it: "Entendi!"
|
||||
customization-tips:
|
||||
title: "Dicas de personalização"
|
||||
@ -56,6 +58,14 @@ common:
|
||||
trash: "Lixo"
|
||||
drive: "ドライブ"
|
||||
messaging: "トーク"
|
||||
deck: "デッキ"
|
||||
timeline: "タイムライン"
|
||||
explore: "みつける"
|
||||
following: "フォロー中"
|
||||
followers: "フォロワー"
|
||||
empty-timeline-info:
|
||||
follow-users-to-make-your-timeline: "ユーザーをフォローすると投稿がタイムラインに表示されます。"
|
||||
explore: "ユーザーを探索する"
|
||||
weekday-short:
|
||||
sunday: "Dom"
|
||||
monday: "Seg"
|
||||
@ -134,6 +144,7 @@ common:
|
||||
is-remote-post: "この投稿情報はコピーです。"
|
||||
view-on-remote: "正確な情報を見る"
|
||||
renoted-by: "{user}がRenote"
|
||||
no-notes: "投稿がありません"
|
||||
error:
|
||||
title: "問題が発生しました"
|
||||
retry: "やり直す"
|
||||
@ -197,6 +208,17 @@ auth/views/index.vue:
|
||||
please-go-back: "Por favor, volte ao aplicativo."
|
||||
error: "A sessão não existe."
|
||||
sign-in: "Por favor, entre."
|
||||
common/views/pages/explore.vue:
|
||||
verified-users: "公式アカウント"
|
||||
popular-users: "人気のユーザー"
|
||||
recently-updated-users: "最近投稿したユーザー"
|
||||
recently-registered-users: "新規ユーザー"
|
||||
popular-tags: "人気のタグ"
|
||||
federated: "連合"
|
||||
explore: "{host}を探索"
|
||||
users-info: "現在{users}ユーザーが登録されています"
|
||||
common/views/components/user-list.vue:
|
||||
no-users: "ユーザーがいません"
|
||||
common/views/components/games/reversi/reversi.vue:
|
||||
matching:
|
||||
waiting-for: "{}を待っています"
|
||||
@ -516,6 +538,10 @@ common/views/components/profile-editor.vue:
|
||||
mute-list: "ミュート"
|
||||
blocking-list: "ブロック"
|
||||
export-requested: "エクスポートをリクエストしました。これには時間がかかる場合があります。エクスポートが終わると、ドライブにファイルが追加されます。"
|
||||
enter-password: "パスワードを入力してください"
|
||||
danger-zone: "危険な設定"
|
||||
delete-account: "アカウントを削除"
|
||||
account-deleted: "アカウントが削除されました。データが消えるまで時間がかかる場合があります。"
|
||||
common/views/components/user-list-editor.vue:
|
||||
users: "ユーザー"
|
||||
rename: "リスト名を変更"
|
||||
@ -684,12 +710,6 @@ desktop/views/components/following-window.vue:
|
||||
following: "{} のフォロー"
|
||||
desktop/views/components/following.vue:
|
||||
empty: "フォロー中のユーザーはいないようです。"
|
||||
desktop/views/components/friends-maker.vue:
|
||||
title: "気になるユーザーをフォロー:"
|
||||
empty: "おすすめのユーザーは見つかりませんでした。"
|
||||
fetching: "読み込んでいます"
|
||||
refresh: "もっと見る"
|
||||
close: "閉じる"
|
||||
desktop/views/components/game-window.vue:
|
||||
game: "リバーシ"
|
||||
desktop/views/components/home.vue:
|
||||
@ -798,13 +818,9 @@ desktop/views/components/settings.vue:
|
||||
web-search-engine-desc: "例: https://www.google.com/?#q={{query}}"
|
||||
auto-popout: "ウィンドウの自動ポップアウト"
|
||||
auto-popout-desc: "ウィンドウが開かれるとき、ポップアウト(ブラウザ外に切り離す)可能なら自動でポップアウトします。この設定はブラウザに記憶されます。"
|
||||
deck-nav: "デッキ内ナビゲーション"
|
||||
deck-nav-desc: "デッキを使用しているとき、ナビゲーションが発生する際にページ遷移を行わずに一時的なカラムで受けるようにします。"
|
||||
keep-cw: "CW保持"
|
||||
keep-cw-desc: "投稿にリプライする際、リプライ元の投稿にCWが設定されていたとき、デフォルトで同じCWを設定するようにします。"
|
||||
deck-default: "デッキをデフォルトのUIにする"
|
||||
display: "デザインと表示"
|
||||
customize: "ホームをカスタマイズ"
|
||||
wallpaper: "壁紙"
|
||||
choose-wallpaper: "壁紙を選択"
|
||||
delete-wallpaper: "壁紙を削除"
|
||||
@ -961,14 +977,11 @@ desktop/views/components/ui.header.account.vue:
|
||||
favorites: "お気に入り"
|
||||
lists: "リスト"
|
||||
follow-requests: "フォロー申請"
|
||||
customize: "ホームのカスタマイズ"
|
||||
admin: "管理"
|
||||
settings: "設定"
|
||||
signout: "サインアウト"
|
||||
dark: "闇に飲まれる"
|
||||
desktop/views/components/ui.header.nav.vue:
|
||||
home: "ホーム"
|
||||
deck: "デッキ"
|
||||
game: "ゲーム"
|
||||
desktop/views/components/ui.header.notifications.vue:
|
||||
title: "通知"
|
||||
@ -1091,6 +1104,7 @@ admin/views/instance.vue:
|
||||
smtp-secure-info: "STARTTLS使用時はオフにします。"
|
||||
smtp-host: "SMTPホスト"
|
||||
smtp-port: "SMTPポート"
|
||||
smtp-auth: "SMTP認証を行う"
|
||||
smtp-user: "SMTPユーザー"
|
||||
smtp-pass: "SMTPパスワード"
|
||||
serviceworker-config: "ServiceWorker"
|
||||
@ -1306,8 +1320,6 @@ desktop/views/pages/welcome.vue:
|
||||
info: "情報"
|
||||
desktop/views/pages/drive.vue:
|
||||
title: "Drive Misskey"
|
||||
desktop/views/pages/home-customize.vue:
|
||||
title: "Personalizar a página inicial"
|
||||
desktop/views/pages/note.vue:
|
||||
prev: "Nota anterior"
|
||||
next: "Próxima nota"
|
||||
@ -1339,24 +1351,22 @@ desktop/views/pages/user/user.photos.vue:
|
||||
title: "フォト"
|
||||
loading: "読み込み中"
|
||||
no-photos: "写真はありません"
|
||||
desktop/views/pages/user/user.profile.vue:
|
||||
follows-you: "フォローされています"
|
||||
menu: "メニュー"
|
||||
desktop/views/pages/user/user.header.vue:
|
||||
posts: "投稿"
|
||||
following: "フォロー"
|
||||
followers: "フォロワー"
|
||||
is-bot: "このアカウントはBotです"
|
||||
no-description: "自己紹介はありません"
|
||||
years-old: "{age}歳"
|
||||
year: "年"
|
||||
month: "月"
|
||||
day: "日"
|
||||
follows-you: "フォローされています"
|
||||
desktop/views/pages/user/user.timeline.vue:
|
||||
default: "投稿"
|
||||
with-replies: "投稿と返信"
|
||||
with-media: "メディア"
|
||||
my-posts: "私の投稿"
|
||||
empty: "このユーザーはまだ何も投稿していないようです。"
|
||||
desktop/views/widgets/messaging.vue:
|
||||
title: "メッセージ"
|
||||
desktop/views/widgets/notifications.vue:
|
||||
@ -1418,12 +1428,6 @@ common/views/components/follow-button.vue:
|
||||
request-pending: "フォロー許可待ち"
|
||||
follow-processing: "フォロー処理中"
|
||||
follow-request: "フォロー申請"
|
||||
mobile/views/components/friends-maker.vue:
|
||||
title: "気になるユーザーをフォロー"
|
||||
empty: "おすすめのユーザーは見つかりませんでした。"
|
||||
fetching: "読み込んでいます"
|
||||
refresh: "もっと見る"
|
||||
close: "閉じる"
|
||||
mobile/views/components/note.vue:
|
||||
private: "この投稿は非公開です"
|
||||
deleted: "この投稿は削除されました"
|
||||
@ -1460,8 +1464,6 @@ mobile/views/components/sub-note-content.vue:
|
||||
deleted: "この投稿は削除されました"
|
||||
media-count: "{}つのメディア"
|
||||
poll: "アンケート"
|
||||
mobile/views/components/timeline.vue:
|
||||
empty: "投稿がありません"
|
||||
mobile/views/components/ui.header.vue:
|
||||
welcome-back: "おかえりなさい、"
|
||||
adjective: "さん"
|
||||
@ -1478,12 +1480,6 @@ mobile/views/components/ui.nav.vue:
|
||||
settings: "設定"
|
||||
admin: "管理"
|
||||
about: "Misskeyについて"
|
||||
mobile/views/components/user-timeline.vue:
|
||||
no-notes: "このユーザーは投稿していないようです。"
|
||||
no-notes-with-media: "メディア付き投稿はありません。"
|
||||
mobile/views/components/users-list.vue:
|
||||
all: "すべて"
|
||||
known: "知り合い"
|
||||
mobile/views/pages/favorites.vue:
|
||||
title: "お気に入り"
|
||||
mobile/views/pages/user-lists.vue:
|
||||
@ -1591,15 +1587,9 @@ mobile/views/pages/user/home.vue:
|
||||
activity: "Atividade"
|
||||
keywords: "Palavras chave"
|
||||
domains: "Domínios"
|
||||
frequently-replied-users: "Perguntas frequentes"
|
||||
frequently-replied-users: "よく話すユーザー"
|
||||
followers-you-know: "Seguidores que você conhece"
|
||||
last-used-at: "Ativo pela última vez"
|
||||
mobile/views/pages/user/home.followers-you-know.vue:
|
||||
no-users: "知り合いのユーザーはいません"
|
||||
mobile/views/pages/user/home.friends.vue:
|
||||
no-users: "よく話すユーザーはいません"
|
||||
mobile/views/pages/user/home.notes.vue:
|
||||
no-notes: "Nenhuma mensagem"
|
||||
mobile/views/pages/user/home.photos.vue:
|
||||
no-photos: "Sem fotos"
|
||||
deck:
|
||||
@ -1622,9 +1612,11 @@ deck:
|
||||
rename: "名前を変更"
|
||||
stack-left: "左に重ねる"
|
||||
pop-right: "右に出す"
|
||||
disabled-timeline:
|
||||
title: "無効化されたタイムライン"
|
||||
description: "サーバーの運営者により、このタイムラインは使用できない状態に設定されています。"
|
||||
deck/deck.tl-column.vue:
|
||||
is-media-only: "メディア投稿のみ"
|
||||
is-media-view: "メディアビュー"
|
||||
edit: "オプション"
|
||||
deck/deck.user-column.vue:
|
||||
follows-you: "フォローされています"
|
||||
|
@ -28,6 +28,8 @@ common:
|
||||
load-more: "Загрузить больше"
|
||||
enter-password: "Пожалуйста, введите ваш пароль"
|
||||
2fa: "二段階認証"
|
||||
customize-home: "ホームをカスタマイズ"
|
||||
featured-notes: "ハイライト"
|
||||
got-it: "わかった"
|
||||
customization-tips:
|
||||
title: "Советы по настройке"
|
||||
@ -56,6 +58,14 @@ common:
|
||||
trash: "Мусорное ведро"
|
||||
drive: "Drive"
|
||||
messaging: "Чат"
|
||||
deck: "デッキ"
|
||||
timeline: "タイムライン"
|
||||
explore: "みつける"
|
||||
following: "フォロー中"
|
||||
followers: "フォロワー"
|
||||
empty-timeline-info:
|
||||
follow-users-to-make-your-timeline: "ユーザーをフォローすると投稿がタイムラインに表示されます。"
|
||||
explore: "ユーザーを探索する"
|
||||
weekday-short:
|
||||
sunday: "Вс"
|
||||
monday: "Пн"
|
||||
@ -134,6 +144,7 @@ common:
|
||||
is-remote-post: "この投稿情報はコピーです。"
|
||||
view-on-remote: "正確な情報を見る"
|
||||
renoted-by: "{user}がRenote"
|
||||
no-notes: "投稿がありません"
|
||||
error:
|
||||
title: "Что-то пошло не так :("
|
||||
retry: "Повторить"
|
||||
@ -197,6 +208,17 @@ auth/views/index.vue:
|
||||
please-go-back: "アプリケーションに戻って、やっていってください。"
|
||||
error: "セッションが存在しません。"
|
||||
sign-in: "サインインしてください"
|
||||
common/views/pages/explore.vue:
|
||||
verified-users: "公式アカウント"
|
||||
popular-users: "人気のユーザー"
|
||||
recently-updated-users: "最近投稿したユーザー"
|
||||
recently-registered-users: "新規ユーザー"
|
||||
popular-tags: "人気のタグ"
|
||||
federated: "連合"
|
||||
explore: "{host}を探索"
|
||||
users-info: "現在{users}ユーザーが登録されています"
|
||||
common/views/components/user-list.vue:
|
||||
no-users: "ユーザーがいません"
|
||||
common/views/components/games/reversi/reversi.vue:
|
||||
matching:
|
||||
waiting-for: "{}を待っています"
|
||||
@ -516,6 +538,10 @@ common/views/components/profile-editor.vue:
|
||||
mute-list: "ミュート"
|
||||
blocking-list: "ブロック"
|
||||
export-requested: "エクスポートをリクエストしました。これには時間がかかる場合があります。エクスポートが終わると、ドライブにファイルが追加されます。"
|
||||
enter-password: "パスワードを入力してください"
|
||||
danger-zone: "危険な設定"
|
||||
delete-account: "アカウントを削除"
|
||||
account-deleted: "アカウントが削除されました。データが消えるまで時間がかかる場合があります。"
|
||||
common/views/components/user-list-editor.vue:
|
||||
users: "ユーザー"
|
||||
rename: "リスト名を変更"
|
||||
@ -684,12 +710,6 @@ desktop/views/components/following-window.vue:
|
||||
following: "{} のフォロー"
|
||||
desktop/views/components/following.vue:
|
||||
empty: "フォロー中のユーザーはいないようです。"
|
||||
desktop/views/components/friends-maker.vue:
|
||||
title: "気になるユーザーをフォロー:"
|
||||
empty: "おすすめのユーザーは見つかりませんでした。"
|
||||
fetching: "読み込んでいます"
|
||||
refresh: "もっと見る"
|
||||
close: "閉じる"
|
||||
desktop/views/components/game-window.vue:
|
||||
game: "リバーシ"
|
||||
desktop/views/components/home.vue:
|
||||
@ -798,13 +818,9 @@ desktop/views/components/settings.vue:
|
||||
web-search-engine-desc: "例: https://www.google.com/?#q={{query}}"
|
||||
auto-popout: "ウィンドウの自動ポップアウト"
|
||||
auto-popout-desc: "ウィンドウが開かれるとき、ポップアウト(ブラウザ外に切り離す)可能なら自動でポップアウトします。この設定はブラウザに記憶されます。"
|
||||
deck-nav: "デッキ内ナビゲーション"
|
||||
deck-nav-desc: "デッキを使用しているとき、ナビゲーションが発生する際にページ遷移を行わずに一時的なカラムで受けるようにします。"
|
||||
keep-cw: "CW保持"
|
||||
keep-cw-desc: "投稿にリプライする際、リプライ元の投稿にCWが設定されていたとき、デフォルトで同じCWを設定するようにします。"
|
||||
deck-default: "デッキをデフォルトのUIにする"
|
||||
display: "デザインと表示"
|
||||
customize: "ホームをカスタマイズ"
|
||||
wallpaper: "壁紙"
|
||||
choose-wallpaper: "壁紙を選択"
|
||||
delete-wallpaper: "壁紙を削除"
|
||||
@ -961,14 +977,11 @@ desktop/views/components/ui.header.account.vue:
|
||||
favorites: "お気に入り"
|
||||
lists: "リスト"
|
||||
follow-requests: "フォロー申請"
|
||||
customize: "ホームのカスタマイズ"
|
||||
admin: "管理"
|
||||
settings: "設定"
|
||||
signout: "サインアウト"
|
||||
dark: "闇に飲まれる"
|
||||
desktop/views/components/ui.header.nav.vue:
|
||||
home: "ホーム"
|
||||
deck: "デッキ"
|
||||
game: "ゲーム"
|
||||
desktop/views/components/ui.header.notifications.vue:
|
||||
title: "通知"
|
||||
@ -1091,6 +1104,7 @@ admin/views/instance.vue:
|
||||
smtp-secure-info: "STARTTLS使用時はオフにします。"
|
||||
smtp-host: "SMTPホスト"
|
||||
smtp-port: "SMTPポート"
|
||||
smtp-auth: "SMTP認証を行う"
|
||||
smtp-user: "SMTPユーザー"
|
||||
smtp-pass: "SMTPパスワード"
|
||||
serviceworker-config: "ServiceWorker"
|
||||
@ -1306,8 +1320,6 @@ desktop/views/pages/welcome.vue:
|
||||
info: "情報"
|
||||
desktop/views/pages/drive.vue:
|
||||
title: "Misskey Drive"
|
||||
desktop/views/pages/home-customize.vue:
|
||||
title: "ホームのカスタマイズ"
|
||||
desktop/views/pages/note.vue:
|
||||
prev: "前の投稿"
|
||||
next: "次の投稿"
|
||||
@ -1339,24 +1351,22 @@ desktop/views/pages/user/user.photos.vue:
|
||||
title: "フォト"
|
||||
loading: "読み込み中"
|
||||
no-photos: "写真はありません"
|
||||
desktop/views/pages/user/user.profile.vue:
|
||||
follows-you: "フォローされています"
|
||||
menu: "メニュー"
|
||||
desktop/views/pages/user/user.header.vue:
|
||||
posts: "投稿"
|
||||
following: "フォロー"
|
||||
followers: "フォロワー"
|
||||
is-bot: "このアカウントはBotです"
|
||||
no-description: "自己紹介はありません"
|
||||
years-old: "{age}歳"
|
||||
year: "年"
|
||||
month: "月"
|
||||
day: "日"
|
||||
follows-you: "フォローされています"
|
||||
desktop/views/pages/user/user.timeline.vue:
|
||||
default: "投稿"
|
||||
with-replies: "投稿と返信"
|
||||
with-media: "メディア"
|
||||
my-posts: "私の投稿"
|
||||
empty: "このユーザーはまだ何も投稿していないようです。"
|
||||
desktop/views/widgets/messaging.vue:
|
||||
title: "メッセージ"
|
||||
desktop/views/widgets/notifications.vue:
|
||||
@ -1418,12 +1428,6 @@ common/views/components/follow-button.vue:
|
||||
request-pending: "フォロー許可待ち"
|
||||
follow-processing: "フォロー処理中"
|
||||
follow-request: "フォロー申請"
|
||||
mobile/views/components/friends-maker.vue:
|
||||
title: "気になるユーザーをフォロー"
|
||||
empty: "おすすめのユーザーは見つかりませんでした。"
|
||||
fetching: "読み込んでいます"
|
||||
refresh: "もっと見る"
|
||||
close: "閉じる"
|
||||
mobile/views/components/note.vue:
|
||||
private: "この投稿は非公開です"
|
||||
deleted: "この投稿は削除されました"
|
||||
@ -1460,8 +1464,6 @@ mobile/views/components/sub-note-content.vue:
|
||||
deleted: "この投稿は削除されました"
|
||||
media-count: "{}つのメディア"
|
||||
poll: "アンケート"
|
||||
mobile/views/components/timeline.vue:
|
||||
empty: "投稿がありません"
|
||||
mobile/views/components/ui.header.vue:
|
||||
welcome-back: "おかえりなさい、"
|
||||
adjective: "さん"
|
||||
@ -1478,12 +1480,6 @@ mobile/views/components/ui.nav.vue:
|
||||
settings: "設定"
|
||||
admin: "管理"
|
||||
about: "Misskeyについて"
|
||||
mobile/views/components/user-timeline.vue:
|
||||
no-notes: "このユーザーは投稿していないようです。"
|
||||
no-notes-with-media: "メディア付き投稿はありません。"
|
||||
mobile/views/components/users-list.vue:
|
||||
all: "すべて"
|
||||
known: "知り合い"
|
||||
mobile/views/pages/favorites.vue:
|
||||
title: "お気に入り"
|
||||
mobile/views/pages/user-lists.vue:
|
||||
@ -1594,12 +1590,6 @@ mobile/views/pages/user/home.vue:
|
||||
frequently-replied-users: "よく話すユーザー"
|
||||
followers-you-know: "知り合いのフォロワー"
|
||||
last-used-at: "最終ログイン"
|
||||
mobile/views/pages/user/home.followers-you-know.vue:
|
||||
no-users: "知り合いのユーザーはいません"
|
||||
mobile/views/pages/user/home.friends.vue:
|
||||
no-users: "よく話すユーザーはいません"
|
||||
mobile/views/pages/user/home.notes.vue:
|
||||
no-notes: "投稿はありません"
|
||||
mobile/views/pages/user/home.photos.vue:
|
||||
no-photos: "写真はありません"
|
||||
deck:
|
||||
@ -1622,9 +1612,11 @@ deck:
|
||||
rename: "名前を変更"
|
||||
stack-left: "左に重ねる"
|
||||
pop-right: "右に出す"
|
||||
disabled-timeline:
|
||||
title: "無効化されたタイムライン"
|
||||
description: "サーバーの運営者により、このタイムラインは使用できない状態に設定されています。"
|
||||
deck/deck.tl-column.vue:
|
||||
is-media-only: "メディア投稿のみ"
|
||||
is-media-view: "メディアビュー"
|
||||
edit: "オプション"
|
||||
deck/deck.user-column.vue:
|
||||
follows-you: "フォローされています"
|
||||
|
@ -28,6 +28,8 @@ common:
|
||||
load-more: "加载更多"
|
||||
enter-password: "请输入您的密码"
|
||||
2fa: "双重身份验证"
|
||||
customize-home: "自定义主页"
|
||||
featured-notes: "高亮"
|
||||
got-it: "没问题"
|
||||
customization-tips:
|
||||
title: "自定义提示"
|
||||
@ -56,6 +58,14 @@ common:
|
||||
trash: "垃圾箱"
|
||||
drive: "网盘"
|
||||
messaging: "聊天"
|
||||
deck: "Deck"
|
||||
timeline: "时间线"
|
||||
explore: "发现"
|
||||
following: "正在关注"
|
||||
followers: "关注者"
|
||||
empty-timeline-info:
|
||||
follow-users-to-make-your-timeline: "关注其他用户时,帖子将显示在时间线中。"
|
||||
explore: "查找用户"
|
||||
weekday-short:
|
||||
sunday: "日"
|
||||
monday: "一"
|
||||
@ -87,7 +97,7 @@ common:
|
||||
public: "公开"
|
||||
home: "首页"
|
||||
home-desc: "仅发送至首页的时间线"
|
||||
followers: "粉丝"
|
||||
followers: "关注者"
|
||||
followers-desc: "仅发送至粉丝"
|
||||
specified: "指定用户"
|
||||
specified-desc: "仅发送至指定用户"
|
||||
@ -104,7 +114,7 @@ common:
|
||||
search: "搜索"
|
||||
delete: "删除"
|
||||
loading: "正在加载中"
|
||||
ok: "OK"
|
||||
ok: "确定"
|
||||
update-available-title: "有可用更新"
|
||||
update-available: "新的 Misskey 版本现已发布({newer}。目前版本{current}). 刷新页面以应用更新。"
|
||||
my-token-regenerated: "您的 Token 已被重置, 您将自动登出。"
|
||||
@ -134,6 +144,7 @@ common:
|
||||
is-remote-post: "该投稿已被复制."
|
||||
view-on-remote: "查看准确的信息"
|
||||
renoted-by: "由 {user} Renote"
|
||||
no-notes: "没有帖子"
|
||||
error:
|
||||
title: "出现问题"
|
||||
retry: "重试"
|
||||
@ -197,6 +208,17 @@ auth/views/index.vue:
|
||||
please-go-back: "请返回到应用程序"
|
||||
error: "会话不存在。"
|
||||
sign-in: "请登录。"
|
||||
common/views/pages/explore.vue:
|
||||
verified-users: "官方账户"
|
||||
popular-users: "热门用户"
|
||||
recently-updated-users: "活跃用户"
|
||||
recently-registered-users: "新用户"
|
||||
popular-tags: "热门标签"
|
||||
federated: "联合"
|
||||
explore: "查找{host}"
|
||||
users-info: "当前有{users}个注册用户"
|
||||
common/views/components/user-list.vue:
|
||||
no-users: "无用户"
|
||||
common/views/components/games/reversi/reversi.vue:
|
||||
matching:
|
||||
waiting-for: "等待 {}"
|
||||
@ -516,6 +538,10 @@ common/views/components/profile-editor.vue:
|
||||
mute-list: "屏蔽列表"
|
||||
blocking-list: "黑名单"
|
||||
export-requested: "导出请求已提交。可能需要花一些时间。导出的文件将保存到网盘中。"
|
||||
enter-password: "请输入您的密码"
|
||||
danger-zone: "危险选项"
|
||||
delete-account: "删除帐户"
|
||||
account-deleted: "帐户已被删除。 数据会在一段时间之后清除。"
|
||||
common/views/components/user-list-editor.vue:
|
||||
users: "用户"
|
||||
rename: "重命名列表"
|
||||
@ -684,12 +710,6 @@ desktop/views/components/following-window.vue:
|
||||
following: "正在关注 {}"
|
||||
desktop/views/components/following.vue:
|
||||
empty: "看起来您没有正在关注的用户..."
|
||||
desktop/views/components/friends-maker.vue:
|
||||
title: "推荐用户:"
|
||||
empty: "找不到推荐用户。"
|
||||
fetching: "正在加载"
|
||||
refresh: "浏览更多"
|
||||
close: "关闭"
|
||||
desktop/views/components/game-window.vue:
|
||||
game: "游戏"
|
||||
desktop/views/components/home.vue:
|
||||
@ -698,7 +718,7 @@ desktop/views/components/home.vue:
|
||||
add: "添加"
|
||||
desktop/views/input-dialog.vue:
|
||||
cancel: "取消"
|
||||
ok: "完成"
|
||||
ok: "确定"
|
||||
desktop/views/components/messaging-room-window.vue:
|
||||
title: "信息:"
|
||||
desktop/views/components/messaging-window.vue:
|
||||
@ -798,13 +818,9 @@ desktop/views/components/settings.vue:
|
||||
web-search-engine-desc: "例如: https://www.google.com/?#q={{query}}"
|
||||
auto-popout: "自动弹出窗口"
|
||||
auto-popout-desc: "如果可用,将使用弹出显示而不是打开新窗口。 此设置存储在浏览器中。"
|
||||
deck-nav: "Deck 内的导航"
|
||||
deck-nav-desc: "在使用Deck时,您会在导航期间获得一个没有页面过渡的临时列。"
|
||||
keep-cw: "保留内容警告"
|
||||
keep-cw-desc: "在回复帖子时,如果原帖设置了内容警告,默认情况下回帖也会设置相同的内容警告。"
|
||||
deck-default: "将Deck界面设置为默认UI显示界面"
|
||||
display: "设计与展示"
|
||||
customize: "自定义首页摆放"
|
||||
wallpaper: "壁纸"
|
||||
choose-wallpaper: "选择一个背景壁纸"
|
||||
delete-wallpaper: "移除背景壁纸"
|
||||
@ -961,14 +977,11 @@ desktop/views/components/ui.header.account.vue:
|
||||
favorites: "最爱"
|
||||
lists: "列表"
|
||||
follow-requests: "关注申请"
|
||||
customize: "自定义首页布局"
|
||||
admin: "管理"
|
||||
settings: "设置"
|
||||
signout: "登出"
|
||||
dark: "切换到黑暗模式 (夜间使用请打开此选项哦~)"
|
||||
desktop/views/components/ui.header.nav.vue:
|
||||
home: "首页"
|
||||
deck: "Deck"
|
||||
game: "游戏"
|
||||
desktop/views/components/ui.header.notifications.vue:
|
||||
title: "通知"
|
||||
@ -1091,6 +1104,7 @@ admin/views/instance.vue:
|
||||
smtp-secure-info: "使用时关闭 STARTTLS。"
|
||||
smtp-host: "SMTP 服务器地址 (主机名)"
|
||||
smtp-port: "SMTP 端口"
|
||||
smtp-auth: "SMTP身份验证"
|
||||
smtp-user: "SMTP 用户名"
|
||||
smtp-pass: "SMTP 密码"
|
||||
serviceworker-config: "ServiceWorker"
|
||||
@ -1306,8 +1320,6 @@ desktop/views/pages/welcome.vue:
|
||||
info: "信息"
|
||||
desktop/views/pages/drive.vue:
|
||||
title: "Misskey 网盘"
|
||||
desktop/views/pages/home-customize.vue:
|
||||
title: "自定义首页布局"
|
||||
desktop/views/pages/note.vue:
|
||||
prev: "上一个帖子"
|
||||
next: "下一个帖子"
|
||||
@ -1339,24 +1351,22 @@ desktop/views/pages/user/user.photos.vue:
|
||||
title: "照片"
|
||||
loading: "正在加载中"
|
||||
no-photos: "没有图片"
|
||||
desktop/views/pages/user/user.profile.vue:
|
||||
follows-you: "关注您"
|
||||
menu: "菜单"
|
||||
desktop/views/pages/user/user.header.vue:
|
||||
posts: "帖子"
|
||||
following: "关注中"
|
||||
followers: "关注者"
|
||||
is-bot: "这个账户是Bot"
|
||||
no-description: "没有自我介绍"
|
||||
years-old: "{age}岁"
|
||||
year: "年"
|
||||
month: "月"
|
||||
day: "日"
|
||||
follows-you: "关注您"
|
||||
desktop/views/pages/user/user.timeline.vue:
|
||||
default: "帖子"
|
||||
with-replies: "帖子与回复"
|
||||
with-media: "媒体"
|
||||
my-posts: "我的帖子"
|
||||
empty: "看起来这个用户还没有发布什么呢。"
|
||||
desktop/views/widgets/messaging.vue:
|
||||
title: "信息"
|
||||
desktop/views/widgets/notifications.vue:
|
||||
@ -1418,12 +1428,6 @@ common/views/components/follow-button.vue:
|
||||
request-pending: "发送关注申请"
|
||||
follow-processing: "申请处理中"
|
||||
follow-request: "关注申请"
|
||||
mobile/views/components/friends-maker.vue:
|
||||
title: "推荐用户:"
|
||||
empty: "找不到推荐用户。"
|
||||
fetching: "正在加载..."
|
||||
refresh: "浏览更多"
|
||||
close: "关闭"
|
||||
mobile/views/components/note.vue:
|
||||
private: "私密帖子"
|
||||
deleted: "帖子已删除"
|
||||
@ -1460,8 +1464,6 @@ mobile/views/components/sub-note-content.vue:
|
||||
deleted: "帖子已删除"
|
||||
media-count: "附加{}媒体"
|
||||
poll: "投票"
|
||||
mobile/views/components/timeline.vue:
|
||||
empty: "无帖子"
|
||||
mobile/views/components/ui.header.vue:
|
||||
welcome-back: "欢迎回来!"
|
||||
adjective: "先生"
|
||||
@ -1478,12 +1480,6 @@ mobile/views/components/ui.nav.vue:
|
||||
settings: "设置"
|
||||
admin: "管理"
|
||||
about: "关于 Misskey"
|
||||
mobile/views/components/user-timeline.vue:
|
||||
no-notes: "看起来该用户还没有发表任何东西哎。"
|
||||
no-notes-with-media: "媒体附件没有备注"
|
||||
mobile/views/components/users-list.vue:
|
||||
all: "所有"
|
||||
known: "共同"
|
||||
mobile/views/pages/favorites.vue:
|
||||
title: "收藏"
|
||||
mobile/views/pages/user-lists.vue:
|
||||
@ -1591,15 +1587,9 @@ mobile/views/pages/user/home.vue:
|
||||
activity: "活动"
|
||||
keywords: "关键字"
|
||||
domains: "域名"
|
||||
frequently-replied-users: "活跃的用户"
|
||||
frequently-replied-users: "活跃用户"
|
||||
followers-you-know: "您可能认识的关注者"
|
||||
last-used-at: "上次登录:"
|
||||
mobile/views/pages/user/home.followers-you-know.vue:
|
||||
no-users: "没有您认识的用户"
|
||||
mobile/views/pages/user/home.friends.vue:
|
||||
no-users: "没有您知道的用户"
|
||||
mobile/views/pages/user/home.notes.vue:
|
||||
no-notes: "没有帖子"
|
||||
mobile/views/pages/user/home.photos.vue:
|
||||
no-photos: "没有图片"
|
||||
deck:
|
||||
@ -1622,9 +1612,11 @@ deck:
|
||||
rename: "重命名"
|
||||
stack-left: "向左折叠"
|
||||
pop-right: "带到右边"
|
||||
disabled-timeline:
|
||||
title: "禁用时间线"
|
||||
description: "服务器管理员已禁用时间线。"
|
||||
deck/deck.tl-column.vue:
|
||||
is-media-only: "只有媒体的帖子"
|
||||
is-media-view: "媒体视图"
|
||||
edit: "选项"
|
||||
deck/deck.user-column.vue:
|
||||
follows-you: "关注您"
|
||||
|
16
package.json
16
package.json
@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "misskey",
|
||||
"author": "syuilo <i@syuilo.com>",
|
||||
"version": "10.87.3",
|
||||
"version": "10.89.0",
|
||||
"codename": "nighthike",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
@ -95,14 +95,14 @@
|
||||
"@types/websocket": "0.0.40",
|
||||
"@types/ws": "6.0.1",
|
||||
"animejs": "3.0.1",
|
||||
"apexcharts": "3.3.0",
|
||||
"apexcharts": "3.4.1",
|
||||
"autobind-decorator": "2.4.0",
|
||||
"autosize": "4.0.2",
|
||||
"autwh": "0.1.0",
|
||||
"bcryptjs": "2.4.3",
|
||||
"bee-queue": "1.2.2",
|
||||
"bootstrap-vue": "2.0.0-rc.11",
|
||||
"cafy": "14.0.1",
|
||||
"cafy": "15.1.0",
|
||||
"chai": "4.2.0",
|
||||
"chai-http": "4.2.1",
|
||||
"chalk": "2.4.2",
|
||||
@ -228,20 +228,20 @@
|
||||
"uuid": "3.3.2",
|
||||
"v-animate-css": "0.0.3",
|
||||
"video-thumbnail-generator": "1.1.3",
|
||||
"vue": "2.6.6",
|
||||
"vue": "2.6.7",
|
||||
"vue-color": "2.7.0",
|
||||
"vue-content-loading": "1.5.3",
|
||||
"vue-cropperjs": "3.0.0",
|
||||
"vue-i18n": "8.8.1",
|
||||
"vue-i18n": "8.8.2",
|
||||
"vue-js-modal": "1.3.28",
|
||||
"vue-loader": "15.6.2",
|
||||
"vue-loader": "15.6.4",
|
||||
"vue-marquee-text-component": "1.1.1",
|
||||
"vue-prism-component": "1.1.1",
|
||||
"vue-router": "3.0.2",
|
||||
"vue-sequential-entrance": "1.1.3",
|
||||
"vue-style-loader": "4.1.2",
|
||||
"vue-svg-inline-loader": "1.2.10",
|
||||
"vue-template-compiler": "2.6.6",
|
||||
"vue-template-compiler": "2.6.7",
|
||||
"vuedraggable": "2.17.0",
|
||||
"vuewordcloud": "18.7.11",
|
||||
"vuex": "3.1.0",
|
||||
@ -251,7 +251,7 @@
|
||||
"webpack": "4.28.4",
|
||||
"webpack-cli": "3.2.1",
|
||||
"websocket": "1.0.28",
|
||||
"ws": "6.1.3",
|
||||
"ws": "6.1.4",
|
||||
"xev": "2.0.1"
|
||||
}
|
||||
}
|
||||
|
@ -54,9 +54,10 @@
|
||||
<ui-input v-model="smtpHost" :disabled="!enableEmail">{{ $t('smtp-host') }}</ui-input>
|
||||
<ui-input v-model="smtpPort" type="number" :disabled="!enableEmail">{{ $t('smtp-port') }}</ui-input>
|
||||
</ui-horizon-group>
|
||||
<ui-switch v-model="smtpAuth">{{ $t('smtp-auth') }}</ui-switch>
|
||||
<ui-horizon-group inputs>
|
||||
<ui-input v-model="smtpUser" :disabled="!enableEmail">{{ $t('smtp-user') }}</ui-input>
|
||||
<ui-input v-model="smtpPass" type="password" :withPasswordToggle="true" :disabled="!enableEmail">{{ $t('smtp-pass') }}</ui-input>
|
||||
<ui-input v-model="smtpUser" :disabled="!enableEmail || !smtpAuth">{{ $t('smtp-user') }}</ui-input>
|
||||
<ui-input v-model="smtpPass" type="password" :withPasswordToggle="true" :disabled="!enableEmail || !smtpAuth">{{ $t('smtp-pass') }}</ui-input>
|
||||
</ui-horizon-group>
|
||||
<ui-switch v-model="smtpSecure" :disabled="!enableEmail">{{ $t('smtp-secure') }}<template #desc>{{ $t('smtp-secure-info') }}</template></ui-switch>
|
||||
</section>
|
||||
@ -188,6 +189,7 @@ export default Vue.extend({
|
||||
smtpPort: null,
|
||||
smtpUser: null,
|
||||
smtpPass: null,
|
||||
smtpAuth: false,
|
||||
enableServiceWorker: false,
|
||||
swPublicKey: null,
|
||||
swPrivateKey: null,
|
||||
@ -236,6 +238,7 @@ export default Vue.extend({
|
||||
this.smtpPort = meta.smtpPort;
|
||||
this.smtpUser = meta.smtpUser;
|
||||
this.smtpPass = meta.smtpPass;
|
||||
this.smtpAuth = meta.smtpUser != null && meta.smtpUser !== '';
|
||||
this.enableServiceWorker = meta.enableServiceWorker;
|
||||
this.swPublicKey = meta.swPublickey;
|
||||
this.swPrivateKey = meta.swPrivateKey;
|
||||
@ -293,8 +296,8 @@ export default Vue.extend({
|
||||
smtpSecure: this.smtpSecure,
|
||||
smtpHost: this.smtpHost,
|
||||
smtpPort: parseInt(this.smtpPort, 10),
|
||||
smtpUser: this.smtpUser,
|
||||
smtpPass: this.smtpPass,
|
||||
smtpUser: this.smtpAuth ? this.smtpUser : '',
|
||||
smtpPass: this.smtpAuth ? this.smtpPass : '',
|
||||
enableServiceWorker: this.enableServiceWorker,
|
||||
swPublicKey: this.swPublicKey,
|
||||
swPrivateKey: this.swPrivateKey
|
||||
|
@ -128,15 +128,16 @@ export default Vue.extend({
|
||||
},
|
||||
|
||||
close() {
|
||||
this.$el.style.pointerEvents = 'none';
|
||||
(this.$refs.bg as any).style.pointerEvents = 'none';
|
||||
(this.$refs.main as any).style.pointerEvents = 'none';
|
||||
|
||||
anime({
|
||||
targets: this.$refs.bg,
|
||||
opacity: 0,
|
||||
duration: 300,
|
||||
easing: 'linear'
|
||||
});
|
||||
|
||||
(this.$refs.main as any).style.pointerEvents = 'none';
|
||||
anime({
|
||||
targets: this.$refs.main,
|
||||
opacity: 0,
|
||||
|
@ -1,6 +1,6 @@
|
||||
<template>
|
||||
<button class="wfliddvnhxvyusikowhxozkyxyenqxqr"
|
||||
:class="{ wait, block, inline, mini, active: isFollowing || hasPendingFollowRequestFromYou }"
|
||||
:class="{ wait, block, inline, mini, transparent, active: isFollowing || hasPendingFollowRequestFromYou }"
|
||||
@click="onClick"
|
||||
:disabled="wait"
|
||||
:inline="inline"
|
||||
@ -38,7 +38,12 @@ export default Vue.extend({
|
||||
type: Boolean,
|
||||
required: false,
|
||||
default: false
|
||||
}
|
||||
},
|
||||
transparent: {
|
||||
type: Boolean,
|
||||
required: false,
|
||||
default: true
|
||||
},
|
||||
},
|
||||
|
||||
data() {
|
||||
@ -134,6 +139,9 @@ export default Vue.extend({
|
||||
border solid 1px var(--primary)
|
||||
border-radius 36px
|
||||
|
||||
&:not(.transparent)
|
||||
background #fff
|
||||
|
||||
&.inline
|
||||
display inline-block
|
||||
|
||||
|
@ -0,0 +1,48 @@
|
||||
<template>
|
||||
<a class="zxrjzpcj" :href="url" :class="service" target="_blank">
|
||||
<fa :icon="icon" size="lg" fixed-width /><span>{{ text }}</span>
|
||||
</a>
|
||||
</template>
|
||||
|
||||
<script lang="ts">
|
||||
import Vue from 'vue';
|
||||
|
||||
export default Vue.extend({
|
||||
props: ['url', 'text', 'icon', 'service']
|
||||
});
|
||||
</script>
|
||||
|
||||
<style lang="stylus" scoped>
|
||||
.zxrjzpcj
|
||||
display inline-block
|
||||
padding 6px 8px 6px 6px
|
||||
margin-top 4px
|
||||
margin-bottom 4px
|
||||
border-radius 32px
|
||||
white-space nowrap
|
||||
|
||||
&:hover
|
||||
text-decoration none
|
||||
|
||||
&.twitter
|
||||
color #fff
|
||||
background #1da1f3
|
||||
|
||||
&:hover
|
||||
background #0c87cf
|
||||
|
||||
&.github
|
||||
color #fff
|
||||
background #171515
|
||||
|
||||
&:hover
|
||||
background #000
|
||||
|
||||
&.discord
|
||||
color #fff
|
||||
background #7289da
|
||||
|
||||
&:hover
|
||||
background #4968ce
|
||||
|
||||
</style>
|
26
src/client/app/common/views/components/integrations.vue
Normal file
26
src/client/app/common/views/components/integrations.vue
Normal file
@ -0,0 +1,26 @@
|
||||
<template>
|
||||
<div class="nbogcrmo" :v-if="user.twitter || user.github || user.discord">
|
||||
<x-integration v-if="user.twitter" service="twitter" :url="`https://twitter.com/${user.twitter.screenName}`" :text="user.twitter.screenName" :icon="['fab', 'twitter']"/>
|
||||
<x-integration v-if="user.github" service="github" :url="`https://github.com/${user.github.login}`" :text="user.github.login" :icon="['fab', 'github']"/>
|
||||
<x-integration v-if="user.discord" service="discord" :url="`https://discordapp.com/users/${user.discord.id}`" :text="`${user.discord.username}#${user.discord.discriminator}`" :icon="['fab', 'discord']"/>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script lang="ts">
|
||||
import Vue from 'vue';
|
||||
import XIntegration from './integrations.integration.vue';
|
||||
|
||||
export default Vue.extend({
|
||||
components: {
|
||||
XIntegration
|
||||
},
|
||||
props: ['user']
|
||||
});
|
||||
</script>
|
||||
|
||||
<style lang="stylus" scoped>
|
||||
.nbogcrmo
|
||||
> *
|
||||
margin-right 10px
|
||||
|
||||
</style>
|
@ -101,6 +101,13 @@
|
||||
<ui-button @click="doExport()"><fa :icon="faDownload"/> {{ $t('export') }}</ui-button>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<details>
|
||||
<summary>{{ $t('danger-zone') }}</summary>
|
||||
<ui-button @click="deleteAccount()">{{ $t('delete-account') }}</ui-button>
|
||||
</details>
|
||||
</section>
|
||||
</ui-card>
|
||||
</template>
|
||||
|
||||
@ -283,6 +290,25 @@ export default Vue.extend({
|
||||
type: 'info',
|
||||
text: this.$t('export-requested')
|
||||
});
|
||||
},
|
||||
|
||||
async deleteAccount() {
|
||||
const { canceled: canceled, result: password } = await this.$root.dialog({
|
||||
title: this.$t('enter-password'),
|
||||
input: {
|
||||
type: 'password'
|
||||
}
|
||||
});
|
||||
if (canceled) return;
|
||||
|
||||
this.$root.api('i/delete-account', {
|
||||
password
|
||||
}).then(() => {
|
||||
this.$root.dialog({
|
||||
type: 'success',
|
||||
text: this.$t('account-deleted')
|
||||
});
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
|
@ -4,13 +4,13 @@
|
||||
|
||||
<mk-error v-if="!fetching && !inited" @retry="init()"/>
|
||||
|
||||
<div class="efvhhmdq" v-size="[{ lt: 500, class: 'narrow' }]">
|
||||
<div class="efvhhmdq" :class="{ iconOnly }" v-size="[{ lt: 500, class: 'narrow' }]">
|
||||
<div class="no-users" v-if="inited && us.length == 0">
|
||||
<p>{{ $t('no-users') }}</p>
|
||||
</div>
|
||||
<div class="user" v-for="user in us">
|
||||
<mk-avatar class="avatar" :user="user"/>
|
||||
<div class="body">
|
||||
<div class="body" v-if="!iconOnly">
|
||||
<div class="name">
|
||||
<router-link class="name" :to="user | userPage" v-user-preview="user.id"><mk-user-name :user="user"/></router-link>
|
||||
<p class="username">@{{ user | acct }}</p>
|
||||
@ -98,6 +98,18 @@ export default Vue.extend({
|
||||
> .user > .body > .description
|
||||
display none
|
||||
|
||||
&.iconOnly
|
||||
padding 12px
|
||||
|
||||
> .user
|
||||
display inline-block
|
||||
padding 0
|
||||
border-bottom none
|
||||
|
||||
> .avatar
|
||||
display inline-block
|
||||
margin 4px
|
||||
|
||||
> .no-users
|
||||
text-align center
|
||||
color var(--text)
|
||||
|
@ -1,14 +1,23 @@
|
||||
<template>
|
||||
<div>
|
||||
<ui-container :show-header="false">
|
||||
<ui-container :show-header="false" v-if="meta && stats">
|
||||
<div class="kpdsmpnk" :style="{ backgroundImage: meta.bannerUrl ? `url(${meta.bannerUrl})` : null }">
|
||||
<div>
|
||||
<b>{{ $t('explore', { host: meta.name }) }}</b>
|
||||
<router-link to="/explore" class="title">{{ $t('explore', { host: meta.name }) }}</router-link>
|
||||
<span>{{ $t('users-info', { users: num(stats.originalUsersCount) }) }}</span>
|
||||
</div>
|
||||
</div>
|
||||
</ui-container>
|
||||
|
||||
<ui-container :body-togglable="true" :expanded="tag == null" ref="tags">
|
||||
<template #header><fa :icon="faHashtag" fixed-width/>{{ $t('popular-tags') }}</template>
|
||||
|
||||
<div class="vxjfqztj">
|
||||
<router-link v-for="tag in tagsLocal" :to="`/explore/tags/${tag.tag}`" :key="tag.tag" class="local">{{ tag.tag }}</router-link>
|
||||
<router-link v-for="tag in tagsRemote" :to="`/explore/tags/${tag.tag}`" :key="tag.tag">{{ tag.tag }}</router-link>
|
||||
</div>
|
||||
</ui-container>
|
||||
|
||||
<mk-user-list v-if="tag != null" :make-promise="tagUsers" :key="`${tag}-local`">
|
||||
<fa :icon="faHashtag" fixed-width/>{{ tag }}
|
||||
</mk-user-list>
|
||||
@ -16,15 +25,6 @@
|
||||
<fa :icon="faHashtag" fixed-width/>{{ tag }} ({{ $t('federated') }})
|
||||
</mk-user-list>
|
||||
|
||||
<ui-container :body-togglable="true">
|
||||
<template #header><fa :icon="faHashtag" fixed-width/>{{ $t('popular-tags') }}</template>
|
||||
|
||||
<div class="vxjfqztj">
|
||||
<router-link v-for="tag in tagsLocal" :to="`/explore/tags/${tag.tag}`" :key="tag.tag" class="local">{{ tag.tag }}</router-link>
|
||||
<router-link v-for="tag in tagsRemote" :to="`/explore/tags/${tag.tag}`" :key="tag.tag">{{ tag.tag }}</router-link>
|
||||
</div>
|
||||
</ui-container>
|
||||
|
||||
<template v-if="tag == null">
|
||||
<mk-user-list :make-promise="verifiedUsers">
|
||||
<fa :icon="faBookmark" fixed-width/>{{ $t('verified-users') }}
|
||||
@ -114,6 +114,12 @@ export default Vue.extend({
|
||||
},
|
||||
},
|
||||
|
||||
watch: {
|
||||
tag() {
|
||||
if (this.$refs.tags) this.$refs.tags.toggleContent(this.tag == null);
|
||||
}
|
||||
},
|
||||
|
||||
created() {
|
||||
this.$root.api('hashtags/list', {
|
||||
sort: '+attachedLocalUsers',
|
||||
@ -169,10 +175,11 @@ export default Vue.extend({
|
||||
color #fff
|
||||
text-shadow 0 0 8px #00
|
||||
|
||||
> b
|
||||
> .title
|
||||
display block
|
||||
font-size 20px
|
||||
font-weight bold
|
||||
color inherit
|
||||
|
||||
> span
|
||||
font-size 14px
|
||||
|
@ -14,7 +14,6 @@ import composeNotification from '../common/scripts/compose-notification';
|
||||
|
||||
import MkHome from './views/home/home.vue';
|
||||
import MkDeck from './views/deck/deck.vue';
|
||||
import MkUserFollowingOrFollowers from './views/pages/user-following-or-followers.vue';
|
||||
import MkSelectDrive from './views/pages/selectdrive.vue';
|
||||
import MkDrive from './views/pages/drive.vue';
|
||||
import MkMessagingRoom from './views/pages/messaging-room.vue';
|
||||
|
@ -11,6 +11,9 @@ html
|
||||
height 100%
|
||||
background var(--bg)
|
||||
|
||||
&, div, textarea
|
||||
scrollbar-width thin
|
||||
|
||||
&, *
|
||||
scrollbar-color var(--scrollbarHandle) var(--scrollbarTrack)
|
||||
|
||||
|
@ -15,7 +15,6 @@ import notePreview from './note-preview.vue';
|
||||
import noteDetail from './note-detail.vue';
|
||||
import calendar from './calendar.vue';
|
||||
import activity from './activity.vue';
|
||||
import userCard from './user-card.vue';
|
||||
import userListTimeline from './user-list-timeline.vue';
|
||||
import uiContainer from './ui-container.vue';
|
||||
|
||||
@ -34,6 +33,5 @@ Vue.component('mk-note-preview', notePreview);
|
||||
Vue.component('mk-note-detail', noteDetail);
|
||||
Vue.component('mk-calendar', calendar);
|
||||
Vue.component('mk-activity', activity);
|
||||
Vue.component('mk-user-card', userCard);
|
||||
Vue.component('mk-user-list-timeline', userListTimeline);
|
||||
Vue.component('ui-container', uiContainer);
|
||||
|
@ -4,7 +4,7 @@
|
||||
|
||||
<div class="newer-indicator" :style="{ top: $store.state.uiHeaderHeight + 'px' }" v-show="queue.length > 0"></div>
|
||||
|
||||
<slot name="empty" v-if="notes.length == 0 && !fetching && inited"></slot>
|
||||
<div class="empty" v-if="notes.length == 0 && !fetching && inited">{{ $t('@.no-notes') }}</div>
|
||||
|
||||
<mk-error v-if="!fetching && !inited" @retry="init()"/>
|
||||
|
||||
@ -209,6 +209,11 @@ export default Vue.extend({
|
||||
> *
|
||||
transition transform .3s ease, opacity .3s ease
|
||||
|
||||
> .empty
|
||||
padding 16px
|
||||
text-align center
|
||||
color var(--text)
|
||||
|
||||
> .placeholder
|
||||
padding 32px
|
||||
opacity 0.3
|
||||
|
@ -30,6 +30,10 @@ export default Vue.extend({
|
||||
type: Boolean,
|
||||
default: false
|
||||
},
|
||||
expanded: {
|
||||
type: Boolean,
|
||||
default: true
|
||||
},
|
||||
},
|
||||
inject: {
|
||||
inDeck: {
|
||||
@ -38,8 +42,13 @@ export default Vue.extend({
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
showBody: true
|
||||
showBody: this.expanded
|
||||
};
|
||||
},
|
||||
methods: {
|
||||
toggleContent(show: boolean) {
|
||||
this.showBody = show;
|
||||
}
|
||||
}
|
||||
});
|
||||
</script>
|
||||
|
@ -1,6 +1,6 @@
|
||||
<template>
|
||||
<div class="header" :style="style">
|
||||
<p class="warn" v-if="env != 'production'">{{ $t('@.do-not-use-in-production') }}</p>
|
||||
<p class="warn" v-if="env != 'production'">{{ $t('@.do-not-use-in-production') }} <a href="/assets/flush.html?force">Flush</a></p>
|
||||
<div class="main" ref="main">
|
||||
<div class="backdrop"></div>
|
||||
<div class="main">
|
||||
|
@ -1,85 +0,0 @@
|
||||
<template>
|
||||
<div class="zvdbznxvfixtmujpsigoccczftvpiwqh">
|
||||
<div class="banner" :style="bannerStyle"></div>
|
||||
<mk-avatar class="avatar" :user="user" :disable-preview="true"/>
|
||||
<mk-follow-button v-if="$store.getters.isSignedIn && user.id != $store.state.i.id" :user="user" class="follow" mini/>
|
||||
<div class="body">
|
||||
<router-link :to="user | userPage" class="name">
|
||||
<mk-user-name :user="user"/>
|
||||
</router-link>
|
||||
<span class="username">@{{ user | acct }} <fa v-if="user.isLocked == true" class="locked" icon="lock" fixed-width/></span>
|
||||
|
||||
<div class="description">
|
||||
<mfm v-if="user.description" :text="user.description" :is-note="false" :author="user" :i="$store.state.i" :custom-emojis="user.emojis"/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script lang="ts">
|
||||
import Vue from 'vue';
|
||||
|
||||
export default Vue.extend({
|
||||
props: ['user'],
|
||||
|
||||
computed: {
|
||||
bannerStyle(): any {
|
||||
if (this.user.bannerUrl == null) return {};
|
||||
return {
|
||||
backgroundColor: this.user.bannerColor && this.user.bannerColor.length == 3 ? `rgb(${ this.user.bannerColor.join(',') })` : null,
|
||||
backgroundImage: `url(${ this.user.bannerUrl })`
|
||||
};
|
||||
}
|
||||
},
|
||||
});
|
||||
</script>
|
||||
|
||||
<style lang="stylus" scoped>
|
||||
.zvdbznxvfixtmujpsigoccczftvpiwqh
|
||||
$bg = var(--face)
|
||||
|
||||
height 280px
|
||||
overflow hidden
|
||||
font-size 13px
|
||||
background $bg
|
||||
box-shadow 0 2px 4px rgba(0, 0, 0, 0.1)
|
||||
color var(--faceText)
|
||||
|
||||
> .banner
|
||||
height 90px
|
||||
background-color #f9f4f4
|
||||
background-position center
|
||||
background-size cover
|
||||
|
||||
> .avatar
|
||||
display block
|
||||
margin -40px 0 0 16px
|
||||
width 80px
|
||||
height 80px
|
||||
border-radius 100%
|
||||
border solid 4px $bg
|
||||
|
||||
> .follow
|
||||
position absolute
|
||||
top 16px
|
||||
right 16px
|
||||
|
||||
> .body
|
||||
padding 0px 24px
|
||||
margin-top -40px
|
||||
|
||||
> .name
|
||||
font-size 120%
|
||||
font-weight bold
|
||||
|
||||
> .username
|
||||
display block
|
||||
opacity 0.7
|
||||
|
||||
> .locked
|
||||
opacity 0.8
|
||||
|
||||
> .description
|
||||
margin 8px 0 16px 0
|
||||
|
||||
</style>
|
@ -1,5 +1,5 @@
|
||||
<template>
|
||||
<x-notes ref="timeline" :make-promise="makePromise" :media-view="mediaView" @inited="() => $emit('loaded')"/>
|
||||
<x-notes ref="timeline" :make-promise="makePromise" @inited="() => $emit('loaded')"/>
|
||||
</template>
|
||||
|
||||
<script lang="ts">
|
||||
@ -22,11 +22,6 @@ export default Vue.extend({
|
||||
type: Boolean,
|
||||
required: false,
|
||||
default: false
|
||||
},
|
||||
mediaView: {
|
||||
type: Boolean,
|
||||
required: false,
|
||||
default: false
|
||||
}
|
||||
},
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
<template>
|
||||
<x-notes ref="timeline" :make-promise="makePromise" :media-view="mediaView" @inited="() => $emit('loaded')"/>
|
||||
<x-notes ref="timeline" :make-promise="makePromise" @inited="() => $emit('loaded')"/>
|
||||
</template>
|
||||
|
||||
<script lang="ts">
|
||||
@ -22,11 +22,6 @@ export default Vue.extend({
|
||||
type: Boolean,
|
||||
required: false,
|
||||
default: false
|
||||
},
|
||||
mediaView: {
|
||||
type: Boolean,
|
||||
required: false,
|
||||
default: false
|
||||
}
|
||||
},
|
||||
|
||||
|
@ -1,6 +1,6 @@
|
||||
<template>
|
||||
<div class="eamppglmnmimdhrlzhplwpvyeaqmmhxu">
|
||||
<slot name="empty" v-if="notes.length == 0 && !fetching && inited"></slot>
|
||||
<div class="empty" v-if="notes.length == 0 && !fetching && inited">{{ $t('@.no-notes') }}</div>
|
||||
|
||||
<mk-error v-if="!fetching && !inited" @retry="init()"/>
|
||||
|
||||
@ -17,7 +17,6 @@
|
||||
:note="note"
|
||||
:key="note.id"
|
||||
@update:note="onNoteUpdated(i, $event)"
|
||||
:media-view="mediaView"
|
||||
:compact="true"
|
||||
:mini="true"/>
|
||||
<p class="date" :key="note.id + '_date'" v-if="i != notes.length - 1 && note._date != _notes[i + 1]._date">
|
||||
@ -56,11 +55,6 @@ export default Vue.extend({
|
||||
props: {
|
||||
makePromise: {
|
||||
required: true
|
||||
},
|
||||
mediaView: {
|
||||
type: Boolean,
|
||||
required: false,
|
||||
default: false
|
||||
}
|
||||
},
|
||||
|
||||
@ -91,6 +85,9 @@ export default Vue.extend({
|
||||
watch: {
|
||||
queue(q) {
|
||||
this.count(q.length);
|
||||
},
|
||||
makePromise() {
|
||||
this.init();
|
||||
}
|
||||
},
|
||||
|
||||
@ -115,12 +112,12 @@ export default Vue.extend({
|
||||
},
|
||||
|
||||
reload() {
|
||||
this.queue = [];
|
||||
this.notes = [];
|
||||
this.init();
|
||||
},
|
||||
|
||||
init() {
|
||||
this.queue = [];
|
||||
this.notes = [];
|
||||
this.fetching = true;
|
||||
this.makePromise().then(x => {
|
||||
if (Array.isArray(x)) {
|
||||
@ -204,6 +201,11 @@ export default Vue.extend({
|
||||
> *
|
||||
transition transform .3s ease, opacity .3s ease
|
||||
|
||||
> .empty
|
||||
padding 16px
|
||||
text-align center
|
||||
color var(--text)
|
||||
|
||||
> .placeholder
|
||||
padding 16px
|
||||
opacity 0.3
|
||||
|
@ -12,25 +12,21 @@
|
||||
|
||||
<div class="editor" style="padding:12px" v-if="edit">
|
||||
<ui-switch v-model="column.isMediaOnly" @change="onChangeSettings">{{ $t('is-media-only') }}</ui-switch>
|
||||
<ui-switch v-model="column.isMediaView" @change="onChangeSettings">{{ $t('is-media-view') }}</ui-switch>
|
||||
</div>
|
||||
|
||||
<x-list-tl v-if="column.type == 'list'"
|
||||
:list="column.list"
|
||||
:media-only="column.isMediaOnly"
|
||||
:media-view="column.isMediaView"
|
||||
ref="tl"
|
||||
/>
|
||||
<x-hashtag-tl v-else-if="column.type == 'hashtag'"
|
||||
:tag-tl="$store.state.settings.tagTimelines.find(x => x.id == column.tagTlId)"
|
||||
:media-only="column.isMediaOnly"
|
||||
:media-view="column.isMediaView"
|
||||
ref="tl"
|
||||
/>
|
||||
<x-tl v-else
|
||||
:src="column.type"
|
||||
:media-only="column.isMediaOnly"
|
||||
:media-view="column.isMediaView"
|
||||
ref="tl"
|
||||
/>
|
||||
</x-column>
|
||||
|
@ -6,7 +6,7 @@
|
||||
</p>
|
||||
<p class="desc">{{ $t('disabled-timeline.description') }}</p>
|
||||
</div>
|
||||
<x-notes v-else ref="timeline" :make-promise="makePromise" :media-view="mediaView" @inited="() => $emit('loaded')"/>
|
||||
<x-notes v-else ref="timeline" :make-promise="makePromise" @inited="() => $emit('loaded')"/>
|
||||
</template>
|
||||
|
||||
<script lang="ts">
|
||||
@ -34,11 +34,6 @@ export default Vue.extend({
|
||||
type: Boolean,
|
||||
required: false,
|
||||
default: false
|
||||
},
|
||||
mediaView: {
|
||||
type: Boolean,
|
||||
required: false,
|
||||
default: false
|
||||
}
|
||||
},
|
||||
|
||||
@ -73,16 +68,18 @@ export default Vue.extend({
|
||||
|
||||
watch: {
|
||||
mediaOnly() {
|
||||
this.fetch();
|
||||
(this.$refs.timeline as any).reload();
|
||||
}
|
||||
},
|
||||
|
||||
created() {
|
||||
this.makePromise = cursor => this.$root.api(this.endpoint, {
|
||||
limit: fetchLimit + 1,
|
||||
untilDate: cursor ? undefined : (this.date ? this.date.getTime() : undefined),
|
||||
untilId: cursor ? cursor : undefined,
|
||||
...this.baseQuery, ...this.query
|
||||
withFiles: this.mediaOnly,
|
||||
includeMyRenotes: this.$store.state.settings.showMyRenotes,
|
||||
includeRenotedMyNotes: this.$store.state.settings.showRenotedMyNotes,
|
||||
includeLocalRenotes: this.$store.state.settings.showLocalRenotes
|
||||
}).then(notes => {
|
||||
if (notes.length == fetchLimit + 1) {
|
||||
notes.pop();
|
||||
|
@ -61,7 +61,26 @@ export default Vue.extend({
|
||||
return {
|
||||
withFiles: false,
|
||||
images: [],
|
||||
makePromise: cursor => this.$root.api('users/notes', {
|
||||
makePromise: null,
|
||||
chart: null as ApexCharts
|
||||
};
|
||||
},
|
||||
|
||||
watch: {
|
||||
user() {
|
||||
this.fetch();
|
||||
this.genPromiseMaker();
|
||||
}
|
||||
},
|
||||
|
||||
created() {
|
||||
this.fetch();
|
||||
this.genPromiseMaker();
|
||||
},
|
||||
|
||||
methods: {
|
||||
genPromiseMaker() {
|
||||
this.makePromise = cursor => this.$root.api('users/notes', {
|
||||
userId: this.user.id,
|
||||
limit: fetchLimit + 1,
|
||||
untilId: cursor ? cursor : undefined,
|
||||
@ -82,15 +101,9 @@ export default Vue.extend({
|
||||
cursor: null
|
||||
};
|
||||
}
|
||||
})
|
||||
};
|
||||
},
|
||||
});
|
||||
},
|
||||
|
||||
created() {
|
||||
this.fetch();
|
||||
},
|
||||
|
||||
methods: {
|
||||
fetch() {
|
||||
const image = [
|
||||
'image/jpeg',
|
||||
@ -144,7 +157,9 @@ export default Vue.extend({
|
||||
]);
|
||||
}
|
||||
|
||||
const chart = new ApexCharts(this.$refs.chart, {
|
||||
if (this.chart) this.chart.destroy();
|
||||
|
||||
this.chart = new ApexCharts(this.$refs.chart, {
|
||||
chart: {
|
||||
type: 'bar',
|
||||
stacked: true,
|
||||
@ -190,7 +205,7 @@ export default Vue.extend({
|
||||
}
|
||||
});
|
||||
|
||||
chart.render();
|
||||
this.chart.render();
|
||||
});
|
||||
},
|
||||
}
|
||||
|
@ -8,9 +8,6 @@
|
||||
<router-link to="/explore">{{ $t('@.empty-timeline-info.explore') }}</router-link>
|
||||
</div>
|
||||
</template>
|
||||
<template #empty>
|
||||
<fa :icon="['far', 'comments']"/>{{ $t('empty') }}
|
||||
</template>
|
||||
</mk-notes>
|
||||
</div>
|
||||
</template>
|
||||
|
@ -1,5 +1,5 @@
|
||||
<template>
|
||||
<div class="header" :data-is-dark-background="user.bannerUrl != null">
|
||||
<div class="header">
|
||||
<div class="banner-container" :style="style">
|
||||
<div class="banner" ref="banner" :style="style" @click="onBannerClick"></div>
|
||||
<div class="fade"></div>
|
||||
@ -12,18 +12,18 @@
|
||||
<span v-if="user.isBot" :title="$t('is-bot')"><fa icon="robot"/></span>
|
||||
</div>
|
||||
</div>
|
||||
<span class="followed" v-if="$store.getters.isSignedIn && $store.state.i.id != user.id && user.isFollowed">{{ $t('follows-you') }}</span>
|
||||
<div class="actions" v-if="$store.getters.isSignedIn">
|
||||
<button @click="menu" class="menu" ref="menu"><fa icon="ellipsis-h"/></button>
|
||||
<mk-follow-button v-if="$store.state.i.id != user.id" :user="user" :inline="true" :transparent="false" class="follow"/>
|
||||
</div>
|
||||
</div>
|
||||
<mk-avatar class="avatar" :user="user" :disable-preview="true"/>
|
||||
<div class="body">
|
||||
<div class="actions" v-if="$store.getters.isSignedIn">
|
||||
<template v-if="$store.state.i.id != user.id">
|
||||
<span class="followed" v-if="user.isFollowed">{{ $t('follows-you') }}</span>
|
||||
<mk-follow-button :user="user" :inline="true" class="follow"/>
|
||||
</template>
|
||||
<ui-button @click="menu" ref="menu" :inline="true"><fa icon="ellipsis-h"/></ui-button>
|
||||
</div>
|
||||
<div class="description">
|
||||
<mfm v-if="user.description" :text="user.description" :is-note="false" :author="user" :i="$store.state.i" :custom-emojis="user.emojis"/>
|
||||
<p v-else class="empty">{{ $t('no-description') }}</p>
|
||||
<x-integrations :user="user" style="margin-top:16px;"/>
|
||||
</div>
|
||||
<div class="fields" v-if="user.fields">
|
||||
<dl class="field" v-for="(field, i) in user.fields" :key="i">
|
||||
@ -53,9 +53,13 @@ import Vue from 'vue';
|
||||
import i18n from '../../../../i18n';
|
||||
import * as age from 's-age';
|
||||
import XUserMenu from '../../../../common/views/components/user-menu.vue';
|
||||
import XIntegrations from '../../../../common/views/components/integrations.vue';
|
||||
|
||||
export default Vue.extend({
|
||||
i18n: i18n('desktop/views/pages/user/user.header.vue'),
|
||||
components: {
|
||||
XIntegrations
|
||||
},
|
||||
props: ['user'],
|
||||
computed: {
|
||||
style(): any {
|
||||
@ -111,7 +115,7 @@ export default Vue.extend({
|
||||
|
||||
menu() {
|
||||
this.$root.new(XUserMenu, {
|
||||
source: this.$refs.menu.$el,
|
||||
source: this.$refs.menu,
|
||||
user: this.user
|
||||
});
|
||||
}
|
||||
@ -126,20 +130,6 @@ export default Vue.extend({
|
||||
border-radius var(--round)
|
||||
overflow hidden
|
||||
|
||||
&[data-is-dark-background]
|
||||
> .banner-container
|
||||
> .banner
|
||||
background-color #383838
|
||||
|
||||
> .fade
|
||||
background linear-gradient(transparent, rgba(#000, 0.7))
|
||||
|
||||
> .title
|
||||
color #fff
|
||||
|
||||
> .name
|
||||
text-shadow 0 0 8px #000
|
||||
|
||||
> .banner-container
|
||||
height 250px
|
||||
overflow hidden
|
||||
@ -148,9 +138,10 @@ export default Vue.extend({
|
||||
|
||||
> .banner
|
||||
height 100%
|
||||
background-color #bfccd0
|
||||
background-color #383838
|
||||
background-size cover
|
||||
background-position center
|
||||
box-shadow 0 0 128px rgba(0, 0, 0, 0.5) inset
|
||||
|
||||
> .fade
|
||||
position absolute
|
||||
@ -158,6 +149,31 @@ export default Vue.extend({
|
||||
left 0
|
||||
width 100%
|
||||
height 78px
|
||||
background linear-gradient(transparent, rgba(#000, 0.7))
|
||||
|
||||
> .followed
|
||||
position absolute
|
||||
top 12px
|
||||
left 12px
|
||||
padding 4px 6px
|
||||
color #fff
|
||||
background rgba(0, 0, 0, 0.7)
|
||||
font-size 12px
|
||||
|
||||
> .actions
|
||||
position absolute
|
||||
top 12px
|
||||
right 12px
|
||||
|
||||
> .menu
|
||||
height 100%
|
||||
display block
|
||||
position absolute
|
||||
left -42px
|
||||
padding 0 14px
|
||||
color #fff
|
||||
text-shadow 0 0 8px #000
|
||||
font-size 16px
|
||||
|
||||
> .title
|
||||
position absolute
|
||||
@ -165,7 +181,7 @@ export default Vue.extend({
|
||||
left 0
|
||||
width 100%
|
||||
padding 0 0 8px 154px
|
||||
color #5e6367
|
||||
color #fff
|
||||
|
||||
> .name
|
||||
display block
|
||||
@ -173,6 +189,7 @@ export default Vue.extend({
|
||||
line-height 32px
|
||||
font-weight bold
|
||||
font-size 1.8em
|
||||
text-shadow 0 0 8px #000
|
||||
|
||||
> div
|
||||
> *
|
||||
@ -202,17 +219,12 @@ export default Vue.extend({
|
||||
padding 16px 16px 16px 154px
|
||||
color var(--text)
|
||||
|
||||
> .actions
|
||||
text-align right
|
||||
padding-bottom 16px
|
||||
margin-bottom 16px
|
||||
border-bottom solid 1px var(--faceDivider)
|
||||
> .description
|
||||
font-size 15px
|
||||
|
||||
> *
|
||||
margin-left 8px
|
||||
|
||||
> .follow
|
||||
width 180px
|
||||
> .empty
|
||||
margin 0
|
||||
opacity 0.5
|
||||
|
||||
> .fields
|
||||
margin-top 16px
|
||||
@ -246,6 +258,10 @@ export default Vue.extend({
|
||||
margin-top 16px
|
||||
padding-top 16px
|
||||
border-top solid 1px var(--faceDivider)
|
||||
font-size 15px
|
||||
|
||||
&:empty
|
||||
display none
|
||||
|
||||
> *
|
||||
margin-right 16px
|
||||
|
@ -1,6 +1,5 @@
|
||||
<template>
|
||||
<div class="lnctpgve">
|
||||
<x-integrations :user="user" v-if="user.twitter || user.github || user.discord"/>
|
||||
<mk-note-detail v-for="n in user.pinnedNotes" :key="n.id" :note="n" :compact="true"/>
|
||||
<!--<mk-calendar @chosen="warp" :start="new Date(user.createdAt)"/>-->
|
||||
<div class="activity">
|
||||
@ -17,11 +16,8 @@
|
||||
<script lang="ts">
|
||||
import Vue from 'vue';
|
||||
import i18n from '../../../../i18n';
|
||||
import parseAcct from '../../../../../../misc/acct/parse';
|
||||
import Progress from '../../../../common/scripts/loading';
|
||||
import XTimeline from './user.timeline.vue';
|
||||
import XPhotos from './user.photos.vue';
|
||||
import XIntegrations from './user.integrations.vue';
|
||||
import XActivity from '../../../../common/views/components/activity.vue';
|
||||
|
||||
export default Vue.extend({
|
||||
@ -29,7 +25,6 @@ export default Vue.extend({
|
||||
components: {
|
||||
XTimeline,
|
||||
XPhotos,
|
||||
XIntegrations,
|
||||
XActivity
|
||||
},
|
||||
props: {
|
||||
|
@ -1,14 +0,0 @@
|
||||
<template>
|
||||
<a :href="url" :class="service" target="_blank">
|
||||
<fa :icon="icon" size="lg" fixed-width />
|
||||
<div>{{ text }}</div>
|
||||
</a>
|
||||
</template>
|
||||
|
||||
<script lang="ts">
|
||||
import Vue from 'vue';
|
||||
|
||||
export default Vue.extend({
|
||||
props: ['url', 'text', 'icon', 'service']
|
||||
});
|
||||
</script>
|
@ -1,66 +0,0 @@
|
||||
<template>
|
||||
<div class="usertwitxxxgithxxdiscxxxintegrat" :v-if="user.twitter || user.github || user.discord">
|
||||
<x-integration v-if="user.twitter" service="twitter" :url="`https://twitter.com/${user.twitter.screenName}`" :text="user.twitter.screenName" :icon="['fab', 'twitter']"/>
|
||||
<x-integration v-if="user.github" service="github" :url="`https://github.com/${user.github.login}`" :text="user.github.login" :icon="['fab', 'github']"/>
|
||||
<x-integration v-if="user.discord" service="discord" :url="`https://discordapp.com/users/${user.discord.id}`" :text="`${user.discord.username}#${user.discord.discriminator}`" :icon="['fab', 'discord']"/>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script lang="ts">
|
||||
import Vue from 'vue';
|
||||
import XIntegration from './user.integrations.integration.vue';
|
||||
|
||||
export default Vue.extend({
|
||||
components: {
|
||||
XIntegration
|
||||
},
|
||||
props: ['user']
|
||||
});
|
||||
</script>
|
||||
|
||||
<style lang="stylus" scoped>
|
||||
.usertwitxxxgithxxdiscxxxintegrat
|
||||
display flex
|
||||
|
||||
> a
|
||||
display flex
|
||||
flex 1
|
||||
align-items center
|
||||
padding 16px
|
||||
box-shadow var(--shadow)
|
||||
border-radius var(--round)
|
||||
|
||||
&:not(:last-child)
|
||||
margin-right 16px
|
||||
|
||||
&:hover
|
||||
text-decoration none
|
||||
|
||||
> div
|
||||
padding-left .2em
|
||||
line-height 1.3em
|
||||
flex 1 0
|
||||
word-wrap anywhere
|
||||
|
||||
&.twitter
|
||||
color #fff
|
||||
background #1da1f3
|
||||
|
||||
&:hover
|
||||
background #0c87cf
|
||||
|
||||
&.github
|
||||
color #fff
|
||||
background #171515
|
||||
|
||||
&:hover
|
||||
background #000
|
||||
|
||||
&.discord
|
||||
color #fff
|
||||
background #7289da
|
||||
|
||||
&:hover
|
||||
background #4968ce
|
||||
|
||||
</style>
|
@ -9,7 +9,6 @@
|
||||
<span :data-active="mode == 'my-posts'" @click="mode = 'my-posts'"><fa icon="user"/> {{ $t('my-posts') }}</span>
|
||||
</header>
|
||||
</template>
|
||||
<template #empty><fa :icon="['far', 'comments']"/>{{ $t('empty') }}</template>
|
||||
</mk-notes>
|
||||
</div>
|
||||
</template>
|
||||
|
@ -7,12 +7,10 @@ import mediaVideo from './media-video.vue';
|
||||
import notePreview from './note-preview.vue';
|
||||
import subNoteContent from './sub-note-content.vue';
|
||||
import noteCard from './note-card.vue';
|
||||
import userCard from './user-card.vue';
|
||||
import noteDetail from './note-detail.vue';
|
||||
import notification from './notification.vue';
|
||||
import notifications from './notifications.vue';
|
||||
import notificationPreview from './notification-preview.vue';
|
||||
import userPreview from './user-preview.vue';
|
||||
import userTimeline from './user-timeline.vue';
|
||||
import userListTimeline from './user-list-timeline.vue';
|
||||
import uiContainer from './ui-container.vue';
|
||||
@ -25,12 +23,10 @@ Vue.component('mk-media-video', mediaVideo);
|
||||
Vue.component('mk-note-preview', notePreview);
|
||||
Vue.component('mk-sub-note-content', subNoteContent);
|
||||
Vue.component('mk-note-card', noteCard);
|
||||
Vue.component('mk-user-card', userCard);
|
||||
Vue.component('mk-note-detail', noteDetail);
|
||||
Vue.component('mk-notification', notification);
|
||||
Vue.component('mk-notifications', notifications);
|
||||
Vue.component('mk-notification-preview', notificationPreview);
|
||||
Vue.component('mk-user-preview', userPreview);
|
||||
Vue.component('mk-user-timeline', userTimeline);
|
||||
Vue.component('mk-user-list-timeline', userListTimeline);
|
||||
Vue.component('ui-container', uiContainer);
|
||||
|
@ -123,18 +123,26 @@ export default Vue.extend({
|
||||
},
|
||||
|
||||
mounted() {
|
||||
// Get replies
|
||||
if (!this.compact) {
|
||||
this.fetchReplies();
|
||||
},
|
||||
|
||||
watch: {
|
||||
note() {
|
||||
this.fetchReplies();
|
||||
}
|
||||
},
|
||||
|
||||
methods: {
|
||||
fetchReplies() {
|
||||
if (this.compact) return;
|
||||
this.$root.api('notes/replies', {
|
||||
noteId: this.appearNote.id,
|
||||
limit: 8
|
||||
}).then(replies => {
|
||||
this.replies = replies;
|
||||
});
|
||||
}
|
||||
},
|
||||
},
|
||||
|
||||
methods: {
|
||||
fetchConversation() {
|
||||
this.conversationFetching = true;
|
||||
|
||||
|
@ -1,6 +1,6 @@
|
||||
<template>
|
||||
<div class="ivaojijs">
|
||||
<slot name="empty" v-if="notes.length == 0 && !fetching && inited"></slot>
|
||||
<div class="empty" v-if="notes.length == 0 && !fetching && inited">{{ $t('@.no-notes') }}</div>
|
||||
|
||||
<mk-error v-if="!fetching && !inited" @retry="init()"/>
|
||||
|
||||
@ -197,6 +197,11 @@ export default Vue.extend({
|
||||
@media (min-width 500px)
|
||||
box-shadow 0 8px 32px rgba(#000, 0.1)
|
||||
|
||||
> .empty
|
||||
padding 16px
|
||||
text-align center
|
||||
color var(--text)
|
||||
|
||||
.transition
|
||||
.mk-notes-enter
|
||||
.mk-notes-leave-to
|
||||
|
@ -30,11 +30,20 @@ export default Vue.extend({
|
||||
type: Boolean,
|
||||
default: false
|
||||
},
|
||||
expanded: {
|
||||
type: Boolean,
|
||||
default: true
|
||||
},
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
showBody: true
|
||||
showBody: this.expanded
|
||||
};
|
||||
},
|
||||
methods: {
|
||||
toggleContent(show: boolean) {
|
||||
this.showBody = show;
|
||||
}
|
||||
}
|
||||
});
|
||||
</script>
|
||||
|
@ -1,6 +1,6 @@
|
||||
<template>
|
||||
<div class="header" ref="root">
|
||||
<p class="warn" v-if="env != 'production'">{{ $t('@.do-not-use-in-production') }}</p>
|
||||
<p class="warn" v-if="env != 'production'">{{ $t('@.do-not-use-in-production') }} <a href="/assets/flush.html?force">Flush</a></p>
|
||||
<div class="main" ref="main">
|
||||
<div class="backdrop"></div>
|
||||
<div class="content" ref="mainContainer">
|
||||
|
@ -1,62 +0,0 @@
|
||||
<template>
|
||||
<div class="mk-user-card">
|
||||
<header :style="user.bannerUrl ? `background-image: url(${user.bannerUrl})` : ''">
|
||||
<mk-avatar class="avatar" :user="user"/>
|
||||
</header>
|
||||
<a class="name" :href="user | userPage" target="_blank">
|
||||
<mk-user-name :user="user"/>
|
||||
</a>
|
||||
<p class="username"><mk-acct :user="user"/></p>
|
||||
<mk-follow-button v-if="$store.getters.isSignedIn && user.id != $store.state.i.id" class="follow-button" :user="user"/>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script lang="ts">
|
||||
import Vue from 'vue';
|
||||
|
||||
export default Vue.extend({
|
||||
props: ['user']
|
||||
});
|
||||
</script>
|
||||
|
||||
<style lang="stylus" scoped>
|
||||
.mk-user-card
|
||||
display inline-block
|
||||
width 200px
|
||||
text-align center
|
||||
border-radius 8px
|
||||
background #fff
|
||||
|
||||
> header
|
||||
display block
|
||||
height 80px
|
||||
background-color #ddd
|
||||
background-size cover
|
||||
background-position center
|
||||
border-radius 8px 8px 0 0
|
||||
|
||||
> .avatar
|
||||
position absolute
|
||||
top 20px
|
||||
left calc(50% - 40px)
|
||||
width 80px
|
||||
height 80px
|
||||
border solid 2px #fff
|
||||
border-radius 8px
|
||||
|
||||
> .name
|
||||
display block
|
||||
margin 24px 0 0 0
|
||||
font-size 16px
|
||||
color #555
|
||||
|
||||
> .username
|
||||
margin 0
|
||||
font-size 15px
|
||||
color #ccc
|
||||
|
||||
> .follow-button
|
||||
display inline-block
|
||||
margin 8px 0 16px 0
|
||||
|
||||
</style>
|
@ -1,99 +0,0 @@
|
||||
<template>
|
||||
<div class="mk-user-preview">
|
||||
<mk-avatar class="avatar" :user="user"/>
|
||||
<div class="main">
|
||||
<header>
|
||||
<router-link class="name" :to="user | userPage">
|
||||
<mk-user-name :user="user"/>
|
||||
</router-link>
|
||||
<span class="username"><mk-acct :user="user"/></span>
|
||||
</header>
|
||||
<div class="body">
|
||||
<div class="description">
|
||||
<mfm v-if="user.description" :text="user.description" :is-note="false" :author="user" :i="$store.state.i" :custom-emojis="user.emojis"/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script lang="ts">
|
||||
import Vue from 'vue';
|
||||
|
||||
export default Vue.extend({
|
||||
props: ['user']
|
||||
});
|
||||
</script>
|
||||
|
||||
<style lang="stylus" scoped>
|
||||
.mk-user-preview
|
||||
margin 0
|
||||
padding 16px
|
||||
font-size 12px
|
||||
|
||||
@media (min-width 350px)
|
||||
font-size 14px
|
||||
|
||||
@media (min-width 500px)
|
||||
font-size 16px
|
||||
|
||||
&:after
|
||||
content ""
|
||||
display block
|
||||
clear both
|
||||
|
||||
> .avatar
|
||||
display block
|
||||
float left
|
||||
margin 0 10px 0 0
|
||||
width 48px
|
||||
height 48px
|
||||
border-radius 6px
|
||||
|
||||
@media (min-width 500px)
|
||||
margin-right 16px
|
||||
width 58px
|
||||
height 58px
|
||||
border-radius 8px
|
||||
|
||||
> .main
|
||||
float left
|
||||
width calc(100% - 58px)
|
||||
|
||||
@media (min-width 500px)
|
||||
width calc(100% - 74px)
|
||||
|
||||
> header
|
||||
@media (min-width 500px)
|
||||
margin-bottom 2px
|
||||
|
||||
> .name
|
||||
display inline
|
||||
margin 0
|
||||
padding 0
|
||||
color #777
|
||||
font-size 1em
|
||||
font-weight 700
|
||||
text-align left
|
||||
text-decoration none
|
||||
|
||||
&:hover
|
||||
text-decoration underline
|
||||
|
||||
> .username
|
||||
text-align left
|
||||
margin 0 0 0 8px
|
||||
color #ccc
|
||||
|
||||
> .body
|
||||
|
||||
> .description
|
||||
cursor default
|
||||
display block
|
||||
margin 0
|
||||
padding 0
|
||||
overflow-wrap break-word
|
||||
font-size 1.1em
|
||||
color #717171
|
||||
|
||||
</style>
|
@ -1,11 +1,6 @@
|
||||
<template>
|
||||
<div class="mk-user-timeline">
|
||||
<mk-notes ref="timeline" :make-promise="makePromise" @inited="() => $emit('loaded')">
|
||||
<template #empty>
|
||||
<fa :icon="['far', 'comments']"/>
|
||||
{{ withMedia ? this.$t('no-notes-with-media') : this.$t('no-notes') }}
|
||||
</template>
|
||||
</mk-notes>
|
||||
<mk-notes ref="timeline" :make-promise="makePromise" @inited="() => $emit('loaded')"/>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
|
@ -7,11 +7,7 @@
|
||||
</div>
|
||||
</ui-container>
|
||||
|
||||
<mk-notes ref="timeline" :make-promise="makePromise" @inited="() => $emit('loaded')">
|
||||
<template #empty>
|
||||
<fa :icon="['far', 'comments']"/>{{ $t('empty') }}
|
||||
</template>
|
||||
</mk-notes>
|
||||
<mk-notes ref="timeline" :make-promise="makePromise" @inited="() => $emit('loaded')"/>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
|
@ -1,65 +0,0 @@
|
||||
<template>
|
||||
<div class="root followers-you-know">
|
||||
<p class="initializing" v-if="fetching"><fa icon="spinner" pulse fixed-width/>{{ $t('@.loading') }}<mk-ellipsis/></p>
|
||||
<div v-if="!fetching && users.length > 0">
|
||||
<a v-for="user in users" :key="user.id" :href="user | userPage">
|
||||
<img :src="user.avatarUrl" :alt="user | userName"/>
|
||||
</a>
|
||||
</div>
|
||||
<p class="empty" v-if="!fetching && users.length == 0">{{ $t('no-users') }}</p>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script lang="ts">
|
||||
import Vue from 'vue';
|
||||
import i18n from '../../../../i18n';
|
||||
|
||||
export default Vue.extend({
|
||||
i18n: i18n('mobile/views/pages/user/home.followers-you-know.vue'),
|
||||
props: ['user'],
|
||||
data() {
|
||||
return {
|
||||
fetching: true,
|
||||
users: []
|
||||
};
|
||||
},
|
||||
mounted() {
|
||||
this.$root.api('users/followers', {
|
||||
userId: this.user.id,
|
||||
iknow: true,
|
||||
limit: 30
|
||||
}).then(res => {
|
||||
this.fetching = false;
|
||||
this.users = res.users;
|
||||
});
|
||||
}
|
||||
});
|
||||
</script>
|
||||
|
||||
<style lang="stylus" scoped>
|
||||
.root.followers-you-know
|
||||
|
||||
> div
|
||||
padding 4px
|
||||
|
||||
> a
|
||||
display inline-block
|
||||
margin 4px
|
||||
|
||||
> img
|
||||
width 48px
|
||||
height 48px
|
||||
vertical-align bottom
|
||||
border-radius 100%
|
||||
|
||||
> .initializing
|
||||
> .empty
|
||||
margin 0
|
||||
padding 16px
|
||||
text-align center
|
||||
color var(--text)
|
||||
|
||||
> i
|
||||
margin-right 4px
|
||||
|
||||
</style>
|
@ -1,56 +0,0 @@
|
||||
<template>
|
||||
<div class="root friends">
|
||||
<p class="fetching" v-if="fetching"><fa icon="spinner" pulse fixed-width/>{{ $t('@.loading') }}<mk-ellipsis/></p>
|
||||
<div v-if="!fetching && users.length > 0">
|
||||
<mk-user-card v-for="user in users" :key="user.id" :user="user"/>
|
||||
</div>
|
||||
<p class="empty" v-if="!fetching && users.length == 0">{{ $t('no-users') }}</p>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script lang="ts">
|
||||
import Vue from 'vue';
|
||||
import i18n from '../../../../i18n';
|
||||
export default Vue.extend({
|
||||
i18n: i18n('mobile/views/pages/user/home.friends.vue'),
|
||||
props: ['user'],
|
||||
data() {
|
||||
return {
|
||||
fetching: true,
|
||||
users: []
|
||||
};
|
||||
},
|
||||
mounted() {
|
||||
this.$root.api('users/get_frequently_replied_users', {
|
||||
userId: this.user.id
|
||||
}).then(res => {
|
||||
this.users = res.map(x => x.user);
|
||||
this.fetching = false;
|
||||
});
|
||||
}
|
||||
});
|
||||
</script>
|
||||
|
||||
<style lang="stylus" scoped>
|
||||
.root.friends
|
||||
> div
|
||||
overflow-x scroll
|
||||
-webkit-overflow-scrolling touch
|
||||
white-space nowrap
|
||||
padding 8px
|
||||
|
||||
> .mk-user-card
|
||||
&:not(:last-child)
|
||||
margin-right 8px
|
||||
|
||||
> .fetching
|
||||
> .empty
|
||||
margin 0
|
||||
padding 16px
|
||||
text-align center
|
||||
color var(--text)
|
||||
|
||||
> i
|
||||
margin-right 4px
|
||||
|
||||
</style>
|
@ -4,7 +4,7 @@
|
||||
<div v-if="!fetching && notes.length > 0">
|
||||
<mk-note-card v-for="note in notes" :key="note.id" :note="note"/>
|
||||
</div>
|
||||
<p class="empty" v-if="!fetching && notes.length == 0">{{ $t('no-notes') }}</p>
|
||||
<p class="empty" v-if="!fetching && notes.length == 0">{{ $t('@.no-notes') }}</p>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
|
@ -1,36 +1,26 @@
|
||||
<template>
|
||||
<div class="root home">
|
||||
<mk-note-detail v-for="n in user.pinnedNotes" :key="n.id" :note="n" :compact="true"/>
|
||||
<section class="recent-notes">
|
||||
<h2><fa :icon="['far', 'comments']"/>{{ $t('recent-notes') }}</h2>
|
||||
<div class="wojmldye">
|
||||
<mk-note-detail class="note" v-for="n in user.pinnedNotes" :key="n.id" :note="n" :compact="true"/>
|
||||
<ui-container :body-togglable="true">
|
||||
<template #header><fa :icon="['far', 'comments']"/>{{ $t('recent-notes') }}</template>
|
||||
<div>
|
||||
<x-notes :user="user"/>
|
||||
</div>
|
||||
</section>
|
||||
<section class="images">
|
||||
<h2><fa icon="image"/>{{ $t('images') }}</h2>
|
||||
</ui-container>
|
||||
<ui-container :body-togglable="true">
|
||||
<template #header><fa icon="image"/>{{ $t('images') }}</template>
|
||||
<div>
|
||||
<x-photos :user="user"/>
|
||||
</div>
|
||||
</section>
|
||||
<section class="activity">
|
||||
<h2><fa icon="chart-bar"/>{{ $t('activity') }}</h2>
|
||||
<div>
|
||||
</ui-container>
|
||||
<ui-container :body-togglable="true">
|
||||
<template #header><fa icon="chart-bar"/>{{ $t('activity') }}</template>
|
||||
<div style="padding:8px;">
|
||||
<x-activity :user="user"/>
|
||||
</div>
|
||||
</section>
|
||||
<section class="frequently-replied-users">
|
||||
<h2><fa icon="users"/>{{ $t('frequently-replied-users') }}</h2>
|
||||
<div>
|
||||
<x-friends :user="user"/>
|
||||
</div>
|
||||
</section>
|
||||
<section class="followers-you-know" v-if="$store.getters.isSignedIn && $store.state.i.id !== user.id">
|
||||
<h2><fa icon="users"/>{{ $t('followers-you-know') }}</h2>
|
||||
<div>
|
||||
<x-followers-you-know :user="user"/>
|
||||
</div>
|
||||
</section>
|
||||
</ui-container>
|
||||
<mk-user-list :make-promise="makeFrequentlyRepliedUsersPromise" :icon-only="true"><fa icon="users"/> {{ $t('frequently-replied-users') }}</mk-user-list>
|
||||
<mk-user-list v-if="$store.getters.isSignedIn && $store.state.i.id !== user.id" :make-promise="makeFollowersYouKnowPromise" :icon-only="true"><fa icon="users"/> {{ $t('followers-you-know') }}</mk-user-list>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
@ -39,66 +29,36 @@ import Vue from 'vue';
|
||||
import i18n from '../../../../i18n';
|
||||
import XNotes from './home.notes.vue';
|
||||
import XPhotos from './home.photos.vue';
|
||||
import XFriends from './home.friends.vue';
|
||||
import XFollowersYouKnow from './home.followers-you-know.vue';
|
||||
|
||||
export default Vue.extend({
|
||||
i18n: i18n('mobile/views/pages/user/home.vue'),
|
||||
components: {
|
||||
XNotes,
|
||||
XPhotos,
|
||||
XFriends,
|
||||
XFollowersYouKnow,
|
||||
XActivity: () => import('../../../../common/views/components/activity.vue').then(m => m.default)
|
||||
},
|
||||
props: ['user']
|
||||
props: ['user'],
|
||||
data() {
|
||||
return {
|
||||
makeFrequentlyRepliedUsersPromise: () => this.$root.api('users/get_frequently_replied_users', {
|
||||
userId: this.user.id
|
||||
}).then(res => res.map(x => x.user)),
|
||||
makeFollowersYouKnowPromise: () => this.$root.api('users/followers', {
|
||||
userId: this.user.id,
|
||||
iknow: true,
|
||||
limit: 30
|
||||
}).then(res => res.users),
|
||||
};
|
||||
}
|
||||
});
|
||||
</script>
|
||||
|
||||
<style lang="stylus" scoped>
|
||||
.root.home
|
||||
margin 0 auto
|
||||
|
||||
> .mk-note-detail
|
||||
.wojmldye
|
||||
> .note
|
||||
margin 0 0 8px 0
|
||||
|
||||
@media (min-width 500px)
|
||||
margin 0 0 16px 0
|
||||
|
||||
> section
|
||||
background var(--face)
|
||||
border-radius 8px
|
||||
box-shadow 0 4px 16px rgba(#000, 0.1)
|
||||
|
||||
&:not(:last-child)
|
||||
margin-bottom 8px
|
||||
|
||||
@media (min-width 500px)
|
||||
margin-bottom 16px
|
||||
|
||||
> h2
|
||||
margin 0
|
||||
padding 8px 10px
|
||||
font-size 15px
|
||||
font-weight normal
|
||||
color var(--text)
|
||||
background var(--faceHeader)
|
||||
border-radius 8px 8px 0 0
|
||||
|
||||
@media (min-width 500px)
|
||||
padding 10px 16px
|
||||
|
||||
> [data-icon]
|
||||
margin-right 6px
|
||||
|
||||
> .activity
|
||||
> div
|
||||
padding 8px
|
||||
|
||||
> p
|
||||
display block
|
||||
margin 16px
|
||||
text-align center
|
||||
color var(--text)
|
||||
|
||||
</style>
|
||||
|
@ -1,7 +1,7 @@
|
||||
<template>
|
||||
<mk-ui>
|
||||
<template #header v-if="!fetching"><img :src="avator" alt="">
|
||||
<mk-user-name :user="user"/>
|
||||
<template #header v-if="!fetching">
|
||||
<img :src="avator" alt=""><mk-user-name :user="user"/>
|
||||
</template>
|
||||
<div class="wwtwuxyh" v-if="!fetching">
|
||||
<div class="is-suspended" v-if="user.isSuspended"><p><fa icon="exclamation-triangle"/> {{ $t('@.user-suspended') }}</p></div>
|
||||
@ -23,6 +23,7 @@
|
||||
</div>
|
||||
<div class="description">
|
||||
<mfm v-if="user.description" :text="user.description" :is-note="false" :author="user" :i="$store.state.i" :custom-emojis="user.emojis"/>
|
||||
<x-integrations :user="user" style="margin:20px 0;"/>
|
||||
</div>
|
||||
<div class="fields" v-if="user.fields">
|
||||
<dl class="field" v-for="(field, i) in user.fields" :key="i">
|
||||
@ -67,9 +68,9 @@
|
||||
</nav>
|
||||
<main>
|
||||
<template v-if="$route.name == 'user'">
|
||||
<x-home v-if="page == 'home'" :user="user"/>
|
||||
<mk-user-timeline v-if="page == 'notes'" :user="user" key="tl"/>
|
||||
<mk-user-timeline v-if="page == 'media'" :user="user" :with-media="true" key="media"/>
|
||||
<x-home v-if="page == 'home'" :user="user" :key="user.id"/>
|
||||
<mk-user-timeline v-if="page == 'notes'" :user="user" :key="`tl:${user.id}`"/>
|
||||
<mk-user-timeline v-if="page == 'media'" :user="user" :with-media="true" :key="`media:${user.id}`"/>
|
||||
</template>
|
||||
<router-view :user="user"></router-view>
|
||||
</main>
|
||||
@ -86,11 +87,13 @@ import Progress from '../../../../common/scripts/loading';
|
||||
import XUserMenu from '../../../../common/views/components/user-menu.vue';
|
||||
import XHome from './home.vue';
|
||||
import { getStaticImageUrl } from '../../../../common/scripts/get-static-image-url';
|
||||
import XIntegrations from '../../../../common/views/components/integrations.vue';
|
||||
|
||||
export default Vue.extend({
|
||||
i18n: i18n('mobile/views/pages/user.vue'),
|
||||
components: {
|
||||
XHome
|
||||
XHome,
|
||||
XIntegrations
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
@ -245,6 +248,9 @@ export default Vue.extend({
|
||||
margin 8px 0
|
||||
color var(--mobileUserPageDescription)
|
||||
|
||||
@media (max-width 450px)
|
||||
font-size 15px
|
||||
|
||||
> .fields
|
||||
margin 8px 0
|
||||
|
||||
@ -276,6 +282,9 @@ export default Vue.extend({
|
||||
> .info
|
||||
margin 8px 0
|
||||
|
||||
@media (max-width 450px)
|
||||
font-size 15px
|
||||
|
||||
> p
|
||||
display inline
|
||||
margin 0 16px 0 0
|
||||
|
@ -5,7 +5,7 @@
|
||||
<meta charset="utf-8">
|
||||
<title>Misskeyのリカバリ</title>
|
||||
<script>
|
||||
const yn = window.confirm('キャッシュをクリアしますか?\n\nDo you want to clear caches?');
|
||||
const yn = location.search === '?force' || window.confirm('キャッシュをクリアしますか?\n\nDo you want to clear caches?');
|
||||
if (yn) {
|
||||
localStorage.setItem('shouldFlush', 'true');
|
||||
}
|
||||
|
Binary file not shown.
Before Width: | Height: | Size: 49 KiB After Width: | Height: | Size: 42 KiB |
24
src/client/assets/redoc.html
Normal file
24
src/client/assets/redoc.html
Normal file
@ -0,0 +1,24 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>Misskey API</title>
|
||||
<!-- needed for adaptive design -->
|
||||
<meta charset="utf-8"/>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<link href="https://fonts.googleapis.com/css?family=Montserrat:300,400,700|Roboto:300,400,700" rel="stylesheet">
|
||||
|
||||
<!--
|
||||
ReDoc doesn't change outer page styles
|
||||
-->
|
||||
<style>
|
||||
body {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<redoc spec-url='/api.json'></redoc>
|
||||
<script src="https://cdn.jsdelivr.net/npm/redoc@next/bundles/redoc.standalone.js"> </script>
|
||||
</body>
|
||||
</html>
|
@ -74,7 +74,7 @@ APIはすべてリクエストのパラメータ・レスポンスともにJSON
|
||||
|
||||
ストリーミングAPIも提供しています。
|
||||
|
||||
APIリファレンスもご確認ください。
|
||||
[APIリファレンス](/api-doc)もご確認ください。
|
||||
|
||||
### レートリミット
|
||||
Misskey APIにはレートリミットがあり、短時間のうちに多数のリクエストを送信すると、一定時間APIを利用することができなくなることがあります。
|
||||
|
@ -1,40 +0,0 @@
|
||||
@import "../style"
|
||||
|
||||
#url
|
||||
padding 8px 12px 8px 8px
|
||||
font-family Consolas, 'Courier New', Courier, Monaco, monospace
|
||||
color #fff
|
||||
background #222e40
|
||||
border-radius 4px
|
||||
overflow auto
|
||||
white-space nowrap
|
||||
|
||||
> .method
|
||||
display inline-block
|
||||
margin 0 8px 0 0
|
||||
padding 0 6px
|
||||
color #fff
|
||||
background #17afc7
|
||||
border-radius 4px
|
||||
user-select none
|
||||
pointer-events none
|
||||
|
||||
> .host
|
||||
opacity 0.7
|
||||
|
||||
#stability
|
||||
padding 8px 12px
|
||||
color #fff
|
||||
border-radius 4px
|
||||
|
||||
&.deprecated
|
||||
background #f42443
|
||||
|
||||
&.experimental
|
||||
background #f2781a
|
||||
|
||||
&.stable
|
||||
background #3dcc90
|
||||
|
||||
> b
|
||||
margin-left 4px
|
@ -1,81 +0,0 @@
|
||||
extends ../../base
|
||||
include ../mixins
|
||||
|
||||
block meta
|
||||
link(rel="stylesheet" href="/docs/assets/api/endpoints/style.css")
|
||||
|
||||
block main
|
||||
h1= title
|
||||
|
||||
p#url
|
||||
span.method POST
|
||||
span.host
|
||||
= endpointUrl.host
|
||||
| /
|
||||
span.path= endpointUrl.path
|
||||
|
||||
- var stability = endpoint.stability || 'experimental';
|
||||
p#stability(class=stability)
|
||||
| Stability:
|
||||
b= stability
|
||||
|
||||
if endpoint.desc
|
||||
p#desc= endpoint.desc[lang] || endpoint.desc['ja-JP']
|
||||
|
||||
if endpoint.requireCredential
|
||||
div.ui.info: p
|
||||
i.fas.fa-id-card-alt(style="margin-right: 4px")
|
||||
= i18n('docs.api.endpoints.require-credential')
|
||||
|
||||
if endpoint.kind
|
||||
div.ui.info: p
|
||||
i.fas.fa-unlock-alt(style="margin-right: 4px")
|
||||
!= i18n('docs.api.endpoints.require-permission').replace('{permission}', `<code>${endpoint.kind}</code>`)
|
||||
|
||||
if endpoint.limit
|
||||
div.ui.info.warn: p
|
||||
i.far.fa-clock(style="margin-right: 4px")
|
||||
b!= i18n('docs.api.endpoints.has-limit')
|
||||
if endpoint.limit.duration
|
||||
!= i18n('docs.api.endpoints.duration-limit').replace('{duration}', endpoint.limit.duration).replace('{max}', endpoint.limit.max)
|
||||
if endpoint.limit.minInterval
|
||||
!= i18n('docs.api.endpoints.min-interval-limit').replace('{interval}', endpoint.limit.minInterval)
|
||||
|
||||
if params && Object.keys(params).length > 0
|
||||
section
|
||||
h2= i18n('docs.api.endpoints.params')
|
||||
+propTable(params)
|
||||
|
||||
if paramDefs
|
||||
each paramDef in paramDefs
|
||||
section(id= paramDef.name)
|
||||
h3= paramDef.name
|
||||
+propTable(paramDef.params)
|
||||
if params && Object.keys(params).length == 0
|
||||
section
|
||||
h2= i18n('docs.api.endpoints.params')
|
||||
p= i18n('docs.api.endpoints.no-params')
|
||||
|
||||
if res
|
||||
section
|
||||
h2= i18n('docs.api.endpoints.res')
|
||||
|
||||
if resProps
|
||||
+propTable(resProps)
|
||||
|
||||
if resDefs
|
||||
each resDef in resDefs
|
||||
section(id= resDef.name)
|
||||
h3= resDef.name
|
||||
+propTable(resDef.props)
|
||||
else
|
||||
if res.type.startsWith('entity')
|
||||
a(href=`/docs/${lang}/api/entities/${kebab(res.entity)}`)= res.entity
|
||||
|
||||
block footer
|
||||
div.ui.info: p
|
||||
i.fas.fa-info-circle(style="margin-right: 4px")
|
||||
= i18n('docs.api.endpoints.generated')
|
||||
p
|
||||
= i18n('docs.api.endpoints.show-src')
|
||||
a(href=src target="_blank")= i18n('docs.api.endpoints.show-src-link')
|
@ -1,90 +0,0 @@
|
||||
name: "DriveFile"
|
||||
|
||||
desc:
|
||||
ja-JP: "ドライブのファイル。"
|
||||
en-US: "A file of Drive."
|
||||
|
||||
props:
|
||||
id:
|
||||
type: "id"
|
||||
optional: false
|
||||
desc:
|
||||
ja-JP: "ファイルID"
|
||||
en-US: "The ID of this file"
|
||||
|
||||
createdAt:
|
||||
type: "date"
|
||||
optional: false
|
||||
desc:
|
||||
ja-JP: "アップロード日時"
|
||||
en-US: "The upload date of this file"
|
||||
|
||||
userId:
|
||||
type: "id(User)"
|
||||
optional: false
|
||||
desc:
|
||||
ja-JP: "所有者ID"
|
||||
en-US: "The ID of the owner of this file"
|
||||
|
||||
user:
|
||||
type: "entity(User)"
|
||||
optional: true
|
||||
desc:
|
||||
ja-JP: "所有者"
|
||||
en-US: "The owner of this file"
|
||||
|
||||
name:
|
||||
type: "string"
|
||||
optional: false
|
||||
desc:
|
||||
ja-JP: "ファイル名"
|
||||
en-US: "The name of this file"
|
||||
|
||||
md5:
|
||||
type: "string"
|
||||
optional: false
|
||||
desc:
|
||||
ja-JP: "ファイルのMD5ハッシュ値"
|
||||
en-US: "The md5 hash value of this file"
|
||||
|
||||
type:
|
||||
type: "string"
|
||||
optional: false
|
||||
desc:
|
||||
ja-JP: "ファイルの種類"
|
||||
en-US: "The type of this file"
|
||||
|
||||
datasize:
|
||||
type: "number"
|
||||
optional: false
|
||||
desc:
|
||||
ja-JP: "ファイルサイズ(bytes)"
|
||||
en-US: "The size of this file (bytes)"
|
||||
|
||||
url:
|
||||
type: "string"
|
||||
optional: false
|
||||
desc:
|
||||
ja-JP: "ファイルのURL"
|
||||
en-US: "The URL of this file"
|
||||
|
||||
folderId:
|
||||
type: "id(DriveFolder)"
|
||||
optional: true
|
||||
desc:
|
||||
ja-JP: "フォルダID"
|
||||
en-US: "The ID of the folder of this file"
|
||||
|
||||
folder:
|
||||
type: "entity(DriveFolder)"
|
||||
optional: true
|
||||
desc:
|
||||
ja-JP: "フォルダ"
|
||||
en-US: "The folder of this file"
|
||||
|
||||
isSensitive:
|
||||
type: "boolean"
|
||||
optional: true
|
||||
desc:
|
||||
ja-JP: "このメディアが「閲覧注意」(NSFW)かどうか"
|
||||
en-US: "Whether this media is NSFW"
|
@ -1,41 +0,0 @@
|
||||
name: "DriveFolder"
|
||||
|
||||
desc:
|
||||
ja-JP: "ドライブのフォルダを表します。"
|
||||
en-US: "A folder of Drive."
|
||||
|
||||
props:
|
||||
id:
|
||||
type: "id"
|
||||
optional: false
|
||||
desc:
|
||||
ja-JP: "フォルダID"
|
||||
en-US: "The ID of this folder"
|
||||
|
||||
createdAt:
|
||||
type: "date"
|
||||
optional: false
|
||||
desc:
|
||||
ja-JP: "作成日時"
|
||||
en-US: "The created date of this folder"
|
||||
|
||||
userId:
|
||||
type: "id(User)"
|
||||
optional: false
|
||||
desc:
|
||||
ja-JP: "所有者ID"
|
||||
en-US: "The ID of the owner of this folder"
|
||||
|
||||
parentId:
|
||||
type: "entity(DriveFolder)"
|
||||
optional: false
|
||||
desc:
|
||||
ja-JP: "親フォルダのID (ルートなら null)"
|
||||
en-US: "The ID of parent folder"
|
||||
|
||||
name:
|
||||
type: "string"
|
||||
optional: false
|
||||
desc:
|
||||
ja-JP: "フォルダ名"
|
||||
en-US: "The name of this folder"
|
@ -1,211 +0,0 @@
|
||||
name: "Note"
|
||||
|
||||
desc:
|
||||
ja-JP: "投稿。"
|
||||
en-US: "A note."
|
||||
|
||||
props:
|
||||
id:
|
||||
type: "id"
|
||||
optional: false
|
||||
desc:
|
||||
ja-JP: "投稿ID"
|
||||
en-US: "The ID of this note"
|
||||
|
||||
createdAt:
|
||||
type: "date"
|
||||
optional: false
|
||||
desc:
|
||||
ja-JP: "投稿日時"
|
||||
en-US: "The posted date of this note"
|
||||
|
||||
viaMobile:
|
||||
type: "boolean"
|
||||
optional: true
|
||||
desc:
|
||||
ja-JP: "モバイル端末から投稿したか否か(自己申告であることに留意)"
|
||||
en-US: "Whether this note sent via a mobile device"
|
||||
|
||||
localOnly:
|
||||
type: "boolean"
|
||||
optional: true
|
||||
desc:
|
||||
ja-JP: "ローカルのみに公開する投稿か否か"
|
||||
en-US: "Whether this note is no federation"
|
||||
|
||||
text:
|
||||
type: "string"
|
||||
optional: true
|
||||
desc:
|
||||
ja-JP: "投稿の本文"
|
||||
en-US: "The text of this note"
|
||||
|
||||
fileIds:
|
||||
type: "id(DriveFile)[]"
|
||||
optional: true
|
||||
desc:
|
||||
ja-JP: "添付されているファイルのID (なければレスポンスでは空配列)"
|
||||
en-US: "The IDs of the attached files (empty array for response if no files is attached)"
|
||||
|
||||
files:
|
||||
type: "entity(DriveFile)[]"
|
||||
optional: true
|
||||
desc:
|
||||
ja-JP: "添付されているファイル"
|
||||
en-US: "The attached files"
|
||||
|
||||
userId:
|
||||
type: "id(User)"
|
||||
optional: false
|
||||
desc:
|
||||
ja-JP: "投稿者ID"
|
||||
en-US: "The ID of author of this note"
|
||||
|
||||
user:
|
||||
type: "entity(User)"
|
||||
optional: true
|
||||
desc:
|
||||
ja-JP: "投稿者"
|
||||
en-US: "The author of this note"
|
||||
|
||||
myReaction:
|
||||
type: "string"
|
||||
optional: true
|
||||
desc:
|
||||
ja-JP: "この投稿に対する自分の<a href='/docs/api/reactions'>リアクション</a>"
|
||||
en-US: "The your <a href='/docs/api/reactions'>reaction</a> of this note"
|
||||
|
||||
renoteCount:
|
||||
type: "number"
|
||||
optional: false
|
||||
desc:
|
||||
ja-JP: "この投稿がRenoteされた数"
|
||||
en-US: "The number of renotes for this post"
|
||||
|
||||
repliesCount:
|
||||
type: "number"
|
||||
optional: false
|
||||
desc:
|
||||
ja-JP: "この投稿に返信された数"
|
||||
en-US: "The number of replies to this post"
|
||||
|
||||
reactionCounts:
|
||||
type: "object"
|
||||
optional: false
|
||||
desc:
|
||||
ja-JP: "<a href='/docs/api/reactions'>リアクション</a>をキーとし、この投稿に対するそのリアクションの数を値としたオブジェクト"
|
||||
|
||||
replyId:
|
||||
type: "id(Note)"
|
||||
optional: true
|
||||
desc:
|
||||
ja-JP: "返信した投稿のID"
|
||||
en-US: "The ID of the replyed note"
|
||||
|
||||
reply:
|
||||
type: "entity(Note)"
|
||||
optional: true
|
||||
desc:
|
||||
ja-JP: "返信した投稿"
|
||||
en-US: "The replyed note"
|
||||
|
||||
renoteId:
|
||||
type: "id(Note)"
|
||||
optional: true
|
||||
desc:
|
||||
ja-JP: "引用した投稿のID"
|
||||
en-US: "The ID of the quoted note"
|
||||
|
||||
renote:
|
||||
type: "entity(Note)"
|
||||
optional: true
|
||||
desc:
|
||||
ja-JP: "引用した投稿"
|
||||
en-US: "The quoted note"
|
||||
|
||||
poll:
|
||||
type: "object"
|
||||
optional: true
|
||||
desc:
|
||||
ja-JP: "投票"
|
||||
en-US: "The poll"
|
||||
|
||||
props:
|
||||
choices:
|
||||
type: "object[]"
|
||||
optional: false
|
||||
desc:
|
||||
ja-JP: "投票の選択肢"
|
||||
en-US: "The choices of this poll"
|
||||
|
||||
props:
|
||||
id:
|
||||
type: "number"
|
||||
optional: false
|
||||
desc:
|
||||
ja-JP: "選択肢ID"
|
||||
en-US: "The ID of this choice"
|
||||
|
||||
isVoted:
|
||||
type: "boolean"
|
||||
optional: true
|
||||
desc:
|
||||
ja-JP: "自分がこの選択肢に投票したかどうか"
|
||||
en-US: "Whether you voted to this choice"
|
||||
|
||||
text:
|
||||
type: "string"
|
||||
optional: false
|
||||
desc:
|
||||
ja-JP: "選択肢本文"
|
||||
en-US: "The text of this choice"
|
||||
|
||||
votes:
|
||||
type: "number"
|
||||
optional: false
|
||||
desc:
|
||||
ja-JP: "この選択肢に投票された数"
|
||||
en-US: "The number voted for this choice"
|
||||
geo:
|
||||
type: "object"
|
||||
optional: true
|
||||
desc:
|
||||
ja-JP: "位置情報"
|
||||
en-US: "Geo location"
|
||||
|
||||
props:
|
||||
coordinates:
|
||||
type: "number[]"
|
||||
optional: false
|
||||
desc:
|
||||
ja-JP: "座標。最初に経度:-180〜180で表す。最後に緯度:-90〜90で表す。"
|
||||
|
||||
altitude:
|
||||
type: "number"
|
||||
optional: false
|
||||
desc:
|
||||
ja-JP: "高度。メートル単位で表す。"
|
||||
|
||||
accuracy:
|
||||
type: "number"
|
||||
optional: false
|
||||
desc:
|
||||
ja-JP: "緯度、経度の精度。メートル単位で表す。"
|
||||
|
||||
altitudeAccuracy:
|
||||
type: "number"
|
||||
optional: false
|
||||
desc:
|
||||
ja-JP: "高度の精度。メートル単位で表す。"
|
||||
|
||||
heading:
|
||||
type: "number"
|
||||
optional: false
|
||||
desc:
|
||||
ja-JP: "方角。0〜360の角度で表す。0が北、90が東、180が南、270が西。"
|
||||
|
||||
speed:
|
||||
type: "number"
|
||||
optional: false
|
||||
desc:
|
||||
ja-JP: "速度。メートル / 秒数で表す。"
|
@ -1 +0,0 @@
|
||||
@import "../style"
|
@ -1,174 +0,0 @@
|
||||
name: "User"
|
||||
|
||||
desc:
|
||||
ja-JP: "ユーザー。"
|
||||
en-US: "A user."
|
||||
|
||||
props:
|
||||
id:
|
||||
type: "id"
|
||||
optional: false
|
||||
desc:
|
||||
ja-JP: "ユーザーID"
|
||||
en-US: "The ID of this user"
|
||||
|
||||
createdAt:
|
||||
type: "date"
|
||||
optional: false
|
||||
desc:
|
||||
ja-JP: "アカウント作成日時"
|
||||
en-US: "The registered date of this user"
|
||||
|
||||
username:
|
||||
type: "string"
|
||||
optional: false
|
||||
desc:
|
||||
ja-JP: "ユーザー名"
|
||||
en-US: "The username of this user"
|
||||
|
||||
description:
|
||||
type: "string"
|
||||
optional: false
|
||||
desc:
|
||||
ja-JP: "アカウントの説明(自己紹介)"
|
||||
en-US: "The description of this user"
|
||||
|
||||
avatarId:
|
||||
type: "id(DriveFile)"
|
||||
optional: true
|
||||
desc:
|
||||
ja-JP: "アバターのID"
|
||||
en-US: "The ID of the avatar of this user"
|
||||
|
||||
avatarUrl:
|
||||
type: "string"
|
||||
optional: false
|
||||
desc:
|
||||
ja-JP: "アバターのURL"
|
||||
en-US: "The URL of the avatar of this user"
|
||||
|
||||
bannerId:
|
||||
type: "id(DriveFile)"
|
||||
optional: true
|
||||
desc:
|
||||
ja-JP: "バナーのID"
|
||||
en-US: "The ID of the banner of this user"
|
||||
|
||||
bannerUrl:
|
||||
type: "string"
|
||||
optional: false
|
||||
desc:
|
||||
ja-JP: "バナーのURL"
|
||||
en-US: "The URL of the banner of this user"
|
||||
|
||||
followersCount:
|
||||
type: "number"
|
||||
optional: false
|
||||
desc:
|
||||
ja-JP: "フォロワーの数"
|
||||
en-US: "The number of the followers for this user"
|
||||
|
||||
followingCount:
|
||||
type: "number"
|
||||
optional: false
|
||||
desc:
|
||||
ja-JP: "フォローしているユーザーの数"
|
||||
en-US: "The number of the following users for this user"
|
||||
|
||||
isFollowing:
|
||||
type: "boolean"
|
||||
optional: true
|
||||
desc:
|
||||
ja-JP: "自分がこのユーザーをフォローしているか"
|
||||
|
||||
isFollowed:
|
||||
type: "boolean"
|
||||
optional: true
|
||||
desc:
|
||||
ja-JP: "自分がこのユーザーにフォローされているか"
|
||||
|
||||
isMuted:
|
||||
type: "boolean"
|
||||
optional: true
|
||||
desc:
|
||||
ja-JP: "自分がこのユーザーをミュートしているか"
|
||||
en-US: "Whether you muted this user"
|
||||
|
||||
notesCount:
|
||||
type: "number"
|
||||
optional: false
|
||||
desc:
|
||||
ja-JP: "投稿の数"
|
||||
en-US: "The number of the notes of this user"
|
||||
|
||||
pinnedNotes:
|
||||
type: "entity(Note)[]"
|
||||
optional: true
|
||||
desc:
|
||||
ja-JP: "ピン留めされた投稿"
|
||||
en-US: "The pinned note of this user"
|
||||
|
||||
pinnedNoteIds:
|
||||
type: "id(Note)[]"
|
||||
optional: true
|
||||
desc:
|
||||
ja-JP: "ピン留めされた投稿のID"
|
||||
en-US: "The ID of the pinned note of this user"
|
||||
|
||||
host:
|
||||
type: "string | null"
|
||||
optional: false
|
||||
desc:
|
||||
ja-JP: "ホスト (例: example.com:3000)"
|
||||
en-US: "Host (e.g. example.com:3000)"
|
||||
|
||||
twitter:
|
||||
type: "object"
|
||||
optional: true
|
||||
desc:
|
||||
ja-JP: "連携されているTwitterアカウント情報"
|
||||
en-US: "The info of the connected twitter account of this user"
|
||||
|
||||
props:
|
||||
userId:
|
||||
type: "string"
|
||||
optional: false
|
||||
desc:
|
||||
ja-JP: "ユーザーID"
|
||||
en-US: "The user ID"
|
||||
|
||||
screenName:
|
||||
type: "string"
|
||||
optional: false
|
||||
desc:
|
||||
ja-JP: "ユーザー名"
|
||||
en-US: "The screen name of this user"
|
||||
|
||||
isBot:
|
||||
type: "boolean"
|
||||
optional: true
|
||||
desc:
|
||||
ja-JP: "botか否か(自己申告であることに留意)"
|
||||
en-US: "Whether is bot or not"
|
||||
|
||||
profile:
|
||||
type: "object"
|
||||
optional: false
|
||||
desc:
|
||||
ja-JP: "プロフィール"
|
||||
en-US: "The profile of this user"
|
||||
|
||||
props:
|
||||
location:
|
||||
type: "string"
|
||||
optional: true
|
||||
desc:
|
||||
ja-JP: "場所"
|
||||
en-US: "The location of this user"
|
||||
|
||||
birthday:
|
||||
type: "string"
|
||||
optional: true
|
||||
desc:
|
||||
ja-JP: "誕生日 (YYYY-MM-DD)"
|
||||
en-US: "The birthday of this user (YYYY-MM-DD)"
|
@ -1,20 +0,0 @@
|
||||
extends ../../base
|
||||
include ../mixins
|
||||
|
||||
block meta
|
||||
link(rel="stylesheet" href="/docs/assets/api/entities/style.css")
|
||||
|
||||
block main
|
||||
h1= name
|
||||
|
||||
p#desc= desc[lang] || desc['ja-JP']
|
||||
|
||||
section
|
||||
h2= i18n('docs.api.entities.properties')
|
||||
+propTable(props)
|
||||
|
||||
if propDefs
|
||||
each propDef in propDefs
|
||||
section(id= propDef.name)
|
||||
h3= propDef.name
|
||||
+propTable(propDef.props)
|
@ -1,34 +0,0 @@
|
||||
mixin type(prop)
|
||||
i= prop.type
|
||||
if prop.kind == 'id'
|
||||
if prop.entity
|
||||
| (
|
||||
a(href=`/docs/${lang}/api/entities/${kebab(prop.entity)}`)= prop.entity
|
||||
| ID)
|
||||
else
|
||||
| (ID)
|
||||
else if prop.kind == 'entity'
|
||||
| (
|
||||
a(href=`/docs/${lang}/api/entities/${kebab(prop.entity)}`)= prop.entity
|
||||
| )
|
||||
else if prop.kind == 'object'
|
||||
if prop.hasDef
|
||||
| (
|
||||
a(href=`#${prop.name}`)= prop.name
|
||||
| )
|
||||
else if prop.kind == 'date'
|
||||
| (Date)
|
||||
|
||||
mixin propTable(props)
|
||||
table.props
|
||||
thead: tr
|
||||
th= i18n('docs.api.props.name')
|
||||
th= i18n('docs.api.props.type')
|
||||
th= i18n('docs.api.props.description')
|
||||
tbody
|
||||
each prop in props
|
||||
tr
|
||||
td.name= prop.name
|
||||
td.type
|
||||
+type(prop)
|
||||
td.desc!= prop.desc ? prop.desc[lang] || prop.desc['ja-JP'] : null
|
@ -1,11 +0,0 @@
|
||||
@import "../style"
|
||||
|
||||
table.props
|
||||
.name
|
||||
font-weight bold
|
||||
|
||||
.name
|
||||
.type
|
||||
.optional
|
||||
font-family Consolas, 'Courier New', Courier, Monaco, monospace
|
||||
|
@ -17,17 +17,6 @@ html(lang= lang)
|
||||
ul
|
||||
each doc in docs
|
||||
li: a(href=`/docs/${lang}/${doc.name}`)= doc.title[lang] || doc.title['ja-JP']
|
||||
section
|
||||
h2 API
|
||||
ul
|
||||
li Entities
|
||||
ul
|
||||
each entity in entities
|
||||
li: a(href=`/docs/${lang}/api/entities/${kebab(entity)}`)= entity
|
||||
li Endpoints
|
||||
ul
|
||||
each endpoint in endpoints
|
||||
li: a(href=`/docs/${lang}/api/endpoints/${kebab(endpoint.name)}`)= endpoint.name
|
||||
main
|
||||
article
|
||||
block main
|
||||
|
@ -26,6 +26,8 @@ export type ObjectId = mongo.ObjectID;
|
||||
* ID
|
||||
*/
|
||||
export default class ID<Maybe = string> extends Context<string | Maybe> {
|
||||
public readonly name = 'ID';
|
||||
|
||||
constructor(optional = false, nullable = false) {
|
||||
super(optional, nullable);
|
||||
|
||||
@ -38,7 +40,7 @@ export default class ID<Maybe = string> extends Context<string | Maybe> {
|
||||
}
|
||||
|
||||
public getType() {
|
||||
return super.getType('string');
|
||||
return super.getType('String');
|
||||
}
|
||||
|
||||
public makeOptional(): ID<undefined> {
|
||||
|
13
src/misc/identifiable-error.ts
Normal file
13
src/misc/identifiable-error.ts
Normal file
@ -0,0 +1,13 @@
|
||||
/**
|
||||
* ID付きエラー
|
||||
*/
|
||||
export class IdentifiableError extends Error {
|
||||
public message: string;
|
||||
public id: string;
|
||||
|
||||
constructor(id: string, message?: string) {
|
||||
super(message);
|
||||
this.message = message;
|
||||
this.id = id;
|
||||
}
|
||||
}
|
@ -1,15 +1,13 @@
|
||||
import * as os from 'os';
|
||||
import * as sysUtils from 'systeminformation';
|
||||
import Logger from "./logger";
|
||||
import Logger from './logger';
|
||||
|
||||
export async function showMachineInfo(parentLogger: Logger) {
|
||||
const logger = parentLogger.createSubLogger('machine');
|
||||
logger.debug(`Hostname: ${os.hostname()}`);
|
||||
logger.debug(`Platform: ${process.platform}`);
|
||||
logger.debug(`Architecture: ${process.arch}`);
|
||||
logger.debug(`CPU: ${os.cpus().length} core`);
|
||||
logger.debug(`Platform: ${process.platform} Arch: ${process.arch}`);
|
||||
const mem = await sysUtils.mem();
|
||||
const totalmem = (mem.total / 1024 / 1024 / 1024).toFixed(1);
|
||||
const availmem = (mem.available / 1024 / 1024 / 1024).toFixed(1);
|
||||
logger.debug(`MEM: ${totalmem}GB (available: ${availmem}GB)`);
|
||||
logger.debug(`CPU: ${os.cpus().length} core MEM: ${totalmem}GB (available: ${availmem}GB)`);
|
||||
}
|
||||
|
@ -55,6 +55,8 @@ type IUserBase = {
|
||||
emojis?: string[];
|
||||
tags?: string[];
|
||||
|
||||
isDeleted: boolean;
|
||||
|
||||
/**
|
||||
* 凍結されているか否か
|
||||
*/
|
||||
|
41
src/prelude/xml.ts
Normal file
41
src/prelude/xml.ts
Normal file
@ -0,0 +1,41 @@
|
||||
const map: Record<string, string> = {
|
||||
'&': '&',
|
||||
'<': '<',
|
||||
'>': '>',
|
||||
'"': '"',
|
||||
'\'': '''
|
||||
};
|
||||
|
||||
const beginingOfCDATA = '<![CDATA[';
|
||||
const endOfCDATA = ']]>';
|
||||
|
||||
export function escapeValue(x: string): string {
|
||||
let insideOfCDATA = false;
|
||||
let builder = '';
|
||||
for (
|
||||
let i = 0;
|
||||
i < x.length;
|
||||
) {
|
||||
if (insideOfCDATA) {
|
||||
if (x.slice(i, i + beginingOfCDATA.length) === beginingOfCDATA) {
|
||||
insideOfCDATA = true;
|
||||
i += beginingOfCDATA.length;
|
||||
} else {
|
||||
builder += x[i++];
|
||||
}
|
||||
} else {
|
||||
if (x.slice(i, i + endOfCDATA.length) === endOfCDATA) {
|
||||
insideOfCDATA = false;
|
||||
i += endOfCDATA.length;
|
||||
} else {
|
||||
const b = x[i++];
|
||||
builder += map[b] || b;
|
||||
}
|
||||
}
|
||||
}
|
||||
return builder;
|
||||
}
|
||||
|
||||
export function escapeAttribute(x: string): string {
|
||||
return Object.entries(map).reduce((a, [k, v]) => a.replace(k, v), x);
|
||||
}
|
@ -70,6 +70,32 @@ export function processInbox(activity: any, signature: httpSignature.IParsedSign
|
||||
}
|
||||
}
|
||||
|
||||
export function createDeleteNotesJob(user: ILocalUser) {
|
||||
const data = {
|
||||
type: 'deleteNotes',
|
||||
user: user
|
||||
};
|
||||
|
||||
if (queueAvailable && enableQueueProcessing) {
|
||||
return queue.createJob(data).save();
|
||||
} else {
|
||||
return handler({ data }, () => {});
|
||||
}
|
||||
}
|
||||
|
||||
export function createDeleteDriveFilesJob(user: ILocalUser) {
|
||||
const data = {
|
||||
type: 'deleteDriveFiles',
|
||||
user: user
|
||||
};
|
||||
|
||||
if (queueAvailable && enableQueueProcessing) {
|
||||
return queue.createJob(data).save();
|
||||
} else {
|
||||
return handler({ data }, () => {});
|
||||
}
|
||||
}
|
||||
|
||||
export function createExportNotesJob(user: ILocalUser) {
|
||||
const data = {
|
||||
type: 'exportNotes',
|
||||
|
55
src/queue/processors/delete-drive-files.ts
Normal file
55
src/queue/processors/delete-drive-files.ts
Normal file
@ -0,0 +1,55 @@
|
||||
import * as bq from 'bee-queue';
|
||||
import * as mongo from 'mongodb';
|
||||
|
||||
import { queueLogger } from '../logger';
|
||||
import User from '../../models/user';
|
||||
import DriveFile from '../../models/drive-file';
|
||||
import deleteFile from '../../services/drive/delete-file';
|
||||
|
||||
const logger = queueLogger.createSubLogger('delete-drive-files');
|
||||
|
||||
export async function deleteDriveFiles(job: bq.Job, done: any): Promise<void> {
|
||||
logger.info(`Deleting drive files of ${job.data.user._id} ...`);
|
||||
|
||||
const user = await User.findOne({
|
||||
_id: new mongo.ObjectID(job.data.user._id.toString())
|
||||
});
|
||||
|
||||
let deletedCount = 0;
|
||||
let ended = false;
|
||||
let cursor: any = null;
|
||||
|
||||
while (!ended) {
|
||||
const files = await DriveFile.find({
|
||||
userId: user._id,
|
||||
...(cursor ? { _id: { $gt: cursor } } : {})
|
||||
}, {
|
||||
limit: 100,
|
||||
sort: {
|
||||
_id: 1
|
||||
}
|
||||
});
|
||||
|
||||
if (files.length === 0) {
|
||||
ended = true;
|
||||
if (job.reportProgress) job.reportProgress(100);
|
||||
break;
|
||||
}
|
||||
|
||||
cursor = files[files.length - 1]._id;
|
||||
|
||||
for (const file of files) {
|
||||
await deleteFile(file);
|
||||
deletedCount++;
|
||||
}
|
||||
|
||||
const total = await DriveFile.count({
|
||||
userId: user._id,
|
||||
});
|
||||
|
||||
if (job.reportProgress) job.reportProgress(deletedCount / total);
|
||||
}
|
||||
|
||||
logger.succ(`All drive files (${deletedCount}) of ${user._id} has been deleted.`);
|
||||
done();
|
||||
}
|
55
src/queue/processors/delete-notes.ts
Normal file
55
src/queue/processors/delete-notes.ts
Normal file
@ -0,0 +1,55 @@
|
||||
import * as bq from 'bee-queue';
|
||||
import * as mongo from 'mongodb';
|
||||
|
||||
import { queueLogger } from '../logger';
|
||||
import Note from '../../models/note';
|
||||
import deleteNote from '../../services/note/delete';
|
||||
import User from '../../models/user';
|
||||
|
||||
const logger = queueLogger.createSubLogger('delete-notes');
|
||||
|
||||
export async function deleteNotes(job: bq.Job, done: any): Promise<void> {
|
||||
logger.info(`Deleting notes of ${job.data.user._id} ...`);
|
||||
|
||||
const user = await User.findOne({
|
||||
_id: new mongo.ObjectID(job.data.user._id.toString())
|
||||
});
|
||||
|
||||
let deletedCount = 0;
|
||||
let ended = false;
|
||||
let cursor: any = null;
|
||||
|
||||
while (!ended) {
|
||||
const notes = await Note.find({
|
||||
userId: user._id,
|
||||
...(cursor ? { _id: { $gt: cursor } } : {})
|
||||
}, {
|
||||
limit: 100,
|
||||
sort: {
|
||||
_id: 1
|
||||
}
|
||||
});
|
||||
|
||||
if (notes.length === 0) {
|
||||
ended = true;
|
||||
if (job.reportProgress) job.reportProgress(100);
|
||||
break;
|
||||
}
|
||||
|
||||
cursor = notes[notes.length - 1]._id;
|
||||
|
||||
for (const note of notes) {
|
||||
await deleteNote(user, note, true);
|
||||
deletedCount++;
|
||||
}
|
||||
|
||||
const total = await Note.count({
|
||||
userId: user._id,
|
||||
});
|
||||
|
||||
if (job.reportProgress) job.reportProgress(deletedCount / total);
|
||||
}
|
||||
|
||||
logger.succ(`All notes (${deletedCount}) of ${user._id} has been deleted.`);
|
||||
done();
|
||||
}
|
@ -1,5 +1,7 @@
|
||||
import deliver from './http/deliver';
|
||||
import processInbox from './http/process-inbox';
|
||||
import { deleteNotes } from './delete-notes';
|
||||
import { deleteDriveFiles } from './delete-drive-files';
|
||||
import { exportNotes } from './export-notes';
|
||||
import { exportFollowing } from './export-following';
|
||||
import { exportMute } from './export-mute';
|
||||
@ -9,6 +11,8 @@ import { queueLogger } from '../logger';
|
||||
const handlers: any = {
|
||||
deliver,
|
||||
processInbox,
|
||||
deleteNotes,
|
||||
deleteDriveFiles,
|
||||
exportNotes,
|
||||
exportFollowing,
|
||||
exportMute,
|
||||
|
@ -48,7 +48,6 @@ export default async (ctx: Router.IRouterContext) => {
|
||||
const partOf = `${config.url}/users/${userId}/followers`;
|
||||
|
||||
if (page) {
|
||||
// Construct query
|
||||
const query = {
|
||||
followeeId: user._id
|
||||
} as any;
|
||||
|
@ -48,7 +48,6 @@ export default async (ctx: Router.IRouterContext) => {
|
||||
const partOf = `${config.url}/users/${userId}/following`;
|
||||
|
||||
if (page) {
|
||||
// Construct query
|
||||
const query = {
|
||||
followerId: user._id
|
||||
} as any;
|
||||
|
@ -78,7 +78,6 @@ export default async (ctx: Router.IRouterContext) => {
|
||||
}
|
||||
//#endregion
|
||||
|
||||
// Issue query
|
||||
const notes = await Note
|
||||
.find(query, {
|
||||
limit: limit,
|
||||
|
@ -3,45 +3,36 @@ import * as Koa from 'koa';
|
||||
import { IEndpoint } from './endpoints';
|
||||
import authenticate from './authenticate';
|
||||
import call from './call';
|
||||
import { IUser } from '../../models/user';
|
||||
import { IApp } from '../../models/app';
|
||||
import { ApiError } from './error';
|
||||
|
||||
export default async (endpoint: IEndpoint, ctx: Koa.BaseContext) => {
|
||||
export default (endpoint: IEndpoint, ctx: Koa.BaseContext) => new Promise((res) => {
|
||||
const body = ctx.is('multipart/form-data') ? (ctx.req as any).body : ctx.request.body;
|
||||
|
||||
const reply = (x?: any, y?: any) => {
|
||||
if (x === undefined) {
|
||||
const reply = (x?: any, y?: ApiError) => {
|
||||
if (x == null) {
|
||||
ctx.status = 204;
|
||||
} else if (typeof x === 'number') {
|
||||
ctx.status = x;
|
||||
ctx.body = {
|
||||
error: x === 500 ? 'INTERNAL_ERROR' : y
|
||||
};
|
||||
ctx.body = { error: y };
|
||||
} else {
|
||||
ctx.body = x;
|
||||
}
|
||||
res();
|
||||
};
|
||||
|
||||
let user: IUser;
|
||||
let app: IApp;
|
||||
|
||||
// Authentication
|
||||
try {
|
||||
[user, app] = await authenticate(body['i']);
|
||||
} catch (e) {
|
||||
reply(403, 'AUTHENTICATION_FAILED');
|
||||
return;
|
||||
}
|
||||
|
||||
let res;
|
||||
|
||||
// API invoking
|
||||
try {
|
||||
res = await call(endpoint.name, user, app, body, (ctx.req as any).file);
|
||||
} catch (e) {
|
||||
reply(400, e);
|
||||
return;
|
||||
}
|
||||
|
||||
reply(res);
|
||||
};
|
||||
authenticate(body['i']).then(([user, app]) => {
|
||||
// API invoking
|
||||
call(endpoint.name, user, app, body, (ctx.req as any).file).then(res => {
|
||||
reply(res);
|
||||
}).catch(e => {
|
||||
reply(e.httpStatusCode ? e.httpStatusCode : e.kind == 'client' ? 400 : 500, e);
|
||||
});
|
||||
}).catch(() => {
|
||||
reply(403, new ApiError({
|
||||
message: 'Authentication failed. Please ensure your token is correct.',
|
||||
code: 'AUTHENTICATION_FAILED',
|
||||
id: 'b0a7f5f8-dc2f-4171-b91f-de88ad238e14'
|
||||
}));
|
||||
});
|
||||
});
|
||||
|
@ -2,6 +2,14 @@ import limiter from './limiter';
|
||||
import { IUser } from '../../models/user';
|
||||
import { IApp } from '../../models/app';
|
||||
import endpoints from './endpoints';
|
||||
import { ApiError } from './error';
|
||||
import { apiLogger } from './logger';
|
||||
|
||||
const accessDenied = {
|
||||
message: 'Access denied.',
|
||||
code: 'ACCESS_DENIED',
|
||||
id: '56f35758-7dd5-468b-8439-5d6fb8ec9b8e'
|
||||
};
|
||||
|
||||
export default async (endpoint: string, user: IUser, app: IApp, data: any, file?: any) => {
|
||||
const isSecure = user != null && app == null;
|
||||
@ -9,58 +17,72 @@ export default async (endpoint: string, user: IUser, app: IApp, data: any, file?
|
||||
const ep = endpoints.find(e => e.name === endpoint);
|
||||
|
||||
if (ep == null) {
|
||||
throw 'ENDPOINT_NOT_FOUND';
|
||||
throw new ApiError({
|
||||
message: 'No such endpoint.',
|
||||
code: 'NO_SUCH_ENDPOINT',
|
||||
id: 'f8080b67-5f9c-4eb7-8c18-7f1eeae8f709',
|
||||
httpStatusCode: 404
|
||||
});
|
||||
}
|
||||
|
||||
if (ep.meta.secure && !isSecure) {
|
||||
throw 'ACCESS_DENIED';
|
||||
throw new ApiError(accessDenied);
|
||||
}
|
||||
|
||||
if (ep.meta.requireCredential && user == null) {
|
||||
throw 'CREDENTIAL_REQUIRED';
|
||||
throw new ApiError({
|
||||
message: 'Credential required.',
|
||||
code: 'CREDENTIAL_REQUIRED',
|
||||
id: '1384574d-a912-4b81-8601-c7b1c4085df1',
|
||||
httpStatusCode: 401
|
||||
});
|
||||
}
|
||||
|
||||
if (ep.meta.requireCredential && user.isSuspended) {
|
||||
throw 'YOUR_ACCOUNT_HAS_BEEN_SUSPENDED';
|
||||
throw new ApiError(accessDenied, { reason: 'Your account has been suspended.' });
|
||||
}
|
||||
|
||||
if (ep.meta.requireAdmin && !user.isAdmin) {
|
||||
throw 'YOU_ARE_NOT_ADMIN';
|
||||
throw new ApiError(accessDenied, { reason: 'You are not the admin.' });
|
||||
}
|
||||
|
||||
if (ep.meta.requireModerator && !user.isAdmin && !user.isModerator) {
|
||||
throw 'YOU_ARE_NOT_MODERATOR';
|
||||
throw new ApiError(accessDenied, { reason: 'You are not a moderator.' });
|
||||
}
|
||||
|
||||
if (app && ep.meta.kind && !app.permission.some(p => p === ep.meta.kind)) {
|
||||
throw 'PERMISSION_DENIED';
|
||||
throw new ApiError({
|
||||
message: 'Your app does not have the necessary permissions to use this endpoint.',
|
||||
code: 'PERMISSION_DENIED',
|
||||
id: '1370e5b7-d4eb-4566-bb1d-7748ee6a1838',
|
||||
});
|
||||
}
|
||||
|
||||
if (ep.meta.requireCredential && ep.meta.limit) {
|
||||
try {
|
||||
await limiter(ep, user); // Rate limit
|
||||
} catch (e) {
|
||||
// drop request if limit exceeded
|
||||
throw 'RATE_LIMIT_EXCEEDED';
|
||||
}
|
||||
// Rate limit
|
||||
await limiter(ep, user).catch(e => {
|
||||
throw new ApiError({
|
||||
message: 'Rate limit exceeded. Please try again later.',
|
||||
code: 'RATE_LIMIT_EXCEEDED',
|
||||
id: 'd5826d14-3982-4d2e-8011-b9e9f02499ef',
|
||||
httpStatusCode: 429
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
let res;
|
||||
|
||||
// API invoking
|
||||
try {
|
||||
res = await ep.exec(data, user, app, file);
|
||||
} catch (e) {
|
||||
if (e && e.name == 'INVALID_PARAM') {
|
||||
throw {
|
||||
code: e.name,
|
||||
param: e.param,
|
||||
reason: e.message
|
||||
};
|
||||
} else {
|
||||
return await ep.exec(data, user, app, file).catch((e: Error) => {
|
||||
if (e instanceof ApiError) {
|
||||
throw e;
|
||||
} else {
|
||||
apiLogger.error(e);
|
||||
throw new ApiError(null, {
|
||||
e: {
|
||||
message: e.message,
|
||||
code: e.name,
|
||||
stack: e.stack
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
return res;
|
||||
});
|
||||
};
|
||||
|
@ -1,18 +1,19 @@
|
||||
import * as mongo from 'mongodb';
|
||||
import Note from "../../../models/note";
|
||||
import User, { isRemoteUser, isLocalUser } from "../../../models/user";
|
||||
import Note from '../../../models/note';
|
||||
import User, { isRemoteUser, isLocalUser } from '../../../models/user';
|
||||
import { IdentifiableError } from '../../../misc/identifiable-error';
|
||||
|
||||
/**
|
||||
* Get valied note for API processing
|
||||
* Get note for API processing
|
||||
*/
|
||||
export async function getValiedNote(noteId: mongo.ObjectID) {
|
||||
export async function getNote(noteId: mongo.ObjectID) {
|
||||
const note = await Note.findOne({
|
||||
_id: noteId,
|
||||
deletedAt: { $exists: false }
|
||||
});
|
||||
|
||||
if (note === null) {
|
||||
throw 'note not found';
|
||||
throw new IdentifiableError('9725d0ce-ba28-4dde-95a7-2cbb2c15de24', 'No such note.');
|
||||
}
|
||||
|
||||
return note;
|
||||
@ -23,11 +24,22 @@ export async function getValiedNote(noteId: mongo.ObjectID) {
|
||||
*/
|
||||
export async function getUser(userId: mongo.ObjectID) {
|
||||
const user = await User.findOne({
|
||||
_id: userId
|
||||
_id: userId,
|
||||
$or: [{
|
||||
isDeleted: { $exists: false }
|
||||
}, {
|
||||
isDeleted: false
|
||||
}]
|
||||
}, {
|
||||
fields: {
|
||||
data: false,
|
||||
profile: false,
|
||||
clientSettings: false
|
||||
}
|
||||
});
|
||||
|
||||
if (user == null) {
|
||||
throw 'user not found';
|
||||
if (user === null) {
|
||||
throw new IdentifiableError('15348ddd-432d-49c2-8a5a-8069753becff', 'No such user.');
|
||||
}
|
||||
|
||||
return user;
|
||||
|
@ -2,6 +2,7 @@ import * as fs from 'fs';
|
||||
import { ILocalUser } from '../../models/user';
|
||||
import { IApp } from '../../models/app';
|
||||
import { IEndpointMeta } from './endpoints';
|
||||
import { ApiError } from './error';
|
||||
|
||||
type Params<T extends IEndpointMeta> = {
|
||||
[P in keyof T['params']]: T['params'][P]['transform'] extends Function
|
||||
@ -9,13 +10,19 @@ type Params<T extends IEndpointMeta> = {
|
||||
: ReturnType<T['params'][P]['validator']['get']>[0];
|
||||
};
|
||||
|
||||
export default function <T extends IEndpointMeta>(meta: T, cb: (params: Params<T>, user: ILocalUser, app: IApp, file?: any, cleanup?: Function) => Promise<any>): (params: any, user: ILocalUser, app: IApp, file?: any) => Promise<any> {
|
||||
export type Response = Record<string, any> | void;
|
||||
|
||||
export default function <T extends IEndpointMeta>(meta: T, cb: (params: Params<T>, user: ILocalUser, app: IApp, file?: any, cleanup?: Function) => Promise<Response>): (params: any, user: ILocalUser, app: IApp, file?: any) => Promise<any> {
|
||||
return (params: any, user: ILocalUser, app: IApp, file?: any) => {
|
||||
function cleanup() {
|
||||
fs.unlink(file.path, () => {});
|
||||
}
|
||||
|
||||
if (meta.requireFile && file == null) return Promise.reject('file required');
|
||||
if (meta.requireFile && file == null) return Promise.reject(new ApiError({
|
||||
message: 'File required.',
|
||||
code: 'FILE_REQUIRED',
|
||||
id: '4267801e-70d1-416a-b011-4ee502885d8b',
|
||||
}));
|
||||
|
||||
const [ps, pserr] = getParams(meta, params);
|
||||
if (pserr) {
|
||||
@ -27,17 +34,22 @@ export default function <T extends IEndpointMeta>(meta: T, cb: (params: Params<T
|
||||
};
|
||||
}
|
||||
|
||||
function getParams<T extends IEndpointMeta>(defs: T, params: any): [Params<T>, Error] {
|
||||
function getParams<T extends IEndpointMeta>(defs: T, params: any): [Params<T>, ApiError] {
|
||||
if (defs.params == null) return [params, null];
|
||||
|
||||
const x: any = {};
|
||||
let err: Error = null;
|
||||
let err: ApiError = null;
|
||||
Object.entries(defs.params).some(([k, def]) => {
|
||||
const [v, e] = def.validator.get(params[k]);
|
||||
if (e) {
|
||||
err = new Error(e.message);
|
||||
err.name = 'INVALID_PARAM';
|
||||
(err as any).param = k;
|
||||
err = new ApiError({
|
||||
message: 'Invalid param.',
|
||||
code: 'INVALID_PARAM',
|
||||
id: '3d81ceae-475f-4600-b2a8-2bc116157532',
|
||||
}, {
|
||||
param: k,
|
||||
reason: e.message
|
||||
});
|
||||
return true;
|
||||
} else {
|
||||
if (v === undefined && def.hasOwnProperty('default')) {
|
||||
|
@ -2,18 +2,30 @@ import { Context } from 'cafy';
|
||||
import * as path from 'path';
|
||||
import * as glob from 'glob';
|
||||
|
||||
export type Param = {
|
||||
validator: Context<any>;
|
||||
transform?: any;
|
||||
default?: any;
|
||||
desc?: { [key: string]: string };
|
||||
ref?: string;
|
||||
};
|
||||
|
||||
export interface IEndpointMeta {
|
||||
stability?: string; //'deprecated' | 'experimental' | 'stable';
|
||||
|
||||
desc?: { [key: string]: string };
|
||||
|
||||
tags?: string[];
|
||||
|
||||
params?: {
|
||||
[key: string]: Param;
|
||||
};
|
||||
|
||||
errors?: {
|
||||
[key: string]: {
|
||||
validator: Context<any>;
|
||||
transform?: any;
|
||||
default?: any;
|
||||
desc?: { [key: string]: string };
|
||||
ref?: string;
|
||||
message: string;
|
||||
code: string;
|
||||
id: string;
|
||||
};
|
||||
};
|
||||
|
||||
|
@ -4,6 +4,8 @@ import Report, { packMany } from '../../../../models/abuse-user-report';
|
||||
import define from '../../define';
|
||||
|
||||
export const meta = {
|
||||
tags: ['admin'],
|
||||
|
||||
requireCredential: true,
|
||||
requireModerator: true,
|
||||
|
||||
@ -25,11 +27,7 @@ export const meta = {
|
||||
}
|
||||
};
|
||||
|
||||
export default define(meta, (ps) => new Promise(async (res, rej) => {
|
||||
if (ps.sinceId && ps.untilId) {
|
||||
return rej('cannot set sinceId and untilId');
|
||||
}
|
||||
|
||||
export default define(meta, async (ps) => {
|
||||
const sort = {
|
||||
_id: -1
|
||||
};
|
||||
@ -51,5 +49,5 @@ export default define(meta, (ps) => new Promise(async (res, rej) => {
|
||||
sort: sort
|
||||
});
|
||||
|
||||
res(await packMany(reports));
|
||||
}));
|
||||
return await packMany(reports);
|
||||
});
|
||||
|
@ -4,6 +4,8 @@ import define from '../../../define';
|
||||
import { fallback } from '../../../../../prelude/symbol';
|
||||
|
||||
export const meta = {
|
||||
tags: ['admin'],
|
||||
|
||||
requireCredential: false,
|
||||
requireModerator: true,
|
||||
|
||||
@ -46,7 +48,7 @@ const sort: any = { // < https://github.com/Microsoft/TypeScript/issues/1863
|
||||
[fallback]: { _id: -1 }
|
||||
};
|
||||
|
||||
export default define(meta, (ps, me) => new Promise(async (res, rej) => {
|
||||
export default define(meta, async (ps, me) => {
|
||||
const q = {
|
||||
'metadata.deletedAt': { $exists: false },
|
||||
} as any;
|
||||
@ -61,5 +63,5 @@ export default define(meta, (ps, me) => new Promise(async (res, rej) => {
|
||||
skip: ps.offset
|
||||
});
|
||||
|
||||
res(await packMany(files, { detail: true, withUser: true, self: true }));
|
||||
}));
|
||||
return await packMany(files, { detail: true, withUser: true, self: true });
|
||||
});
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user