Compare commits
127 Commits
Author | SHA1 | Date | |
---|---|---|---|
39285fc2d0 | |||
6e491c1466 | |||
84152aa663 | |||
600fc65c2f | |||
40e2733424 | |||
bceb02d760 | |||
aaaaf2681a | |||
3c3ef9bba0 | |||
338f3a981f | |||
a86ae9fa50 | |||
a3c4e8a1bc | |||
6a7c18e8db | |||
672b7a4c3d | |||
bf3fee4481 | |||
a3c8d1d732 | |||
bb03d8c49a | |||
fbd5abe3b6 | |||
5ac390abe9 | |||
766cae2299 | |||
d9828fdc6a | |||
4114ce4a04 | |||
6090630260 | |||
259cfeae17 | |||
ebe15c4711 | |||
75a740a110 | |||
0c085c4f74 | |||
1d819e79db | |||
515b79dcf0 | |||
269e12abb4 | |||
cf5be6ff5a | |||
f140adbc9d | |||
6c31406bb0 | |||
b6e8626908 | |||
64a3a4915a | |||
fd71f24d46 | |||
65b5c6753f | |||
7408bbce37 | |||
0f58978c9f | |||
01ca3fd6b2 | |||
26c366156b | |||
9d8f7b081d | |||
9d8ebb795d | |||
8be98e4cb8 | |||
3c229c9950 | |||
f2263faf7d | |||
39c7cf3e66 | |||
5ee24e5c09 | |||
a34fdc2068 | |||
2c2cd893b8 | |||
a43b0548ed | |||
93e95f56f4 | |||
cb0673b1ec | |||
cd018db945 | |||
50fe67b99b | |||
1dba82aae5 | |||
17c6d64750 | |||
b4c04efa23 | |||
152dd74abf | |||
0985f7f609 | |||
aecf9329bd | |||
b2384605e7 | |||
57ab5ab604 | |||
e493a20301 | |||
0bd5ed937c | |||
6a9b3bc64e | |||
4c1ef3e6a5 | |||
2ea250f954 | |||
5d810980f8 | |||
d51b4e27cc | |||
c01c555309 | |||
ce2e66d9b0 | |||
9550acd61e | |||
d95b5daa6d | |||
56d571c0f0 | |||
dc9a19b9c7 | |||
88a2c7715a | |||
2fa8cb1b73 | |||
5f8a66fdb9 | |||
57320a94f9 | |||
89f045d624 | |||
1a77dea7ed | |||
532a7b90f3 | |||
4e8c200349 | |||
d063d59a91 | |||
90429b787c | |||
7a2ef04ec3 | |||
76a9ea8d3d | |||
0a05a2d060 | |||
a7e2ee3b0c | |||
40efa90dd5 | |||
4ca0a22bfc | |||
20a943b193 | |||
552df8737d | |||
860f622d79 | |||
e76bf5707a | |||
bf37a72f59 | |||
840ad75830 | |||
4c7dd7228f | |||
46a51addad | |||
0a5fe37025 | |||
00bb403497 | |||
11afa8140c | |||
850396e9da | |||
5ee75be49e | |||
879116a20c | |||
e509b1f488 | |||
468ff7037f | |||
df23504ccf | |||
66e3cb8eda | |||
6ddd2389dc | |||
402efb8c50 | |||
7b6eae0ce4 | |||
26ce9725ce | |||
ebfaa18f12 | |||
cc81d41a05 | |||
212176ee5c | |||
a63ec05e41 | |||
0dcb527bf3 | |||
54710f17fc | |||
e58a6593c0 | |||
62132570e1 | |||
9f0b8ba2f8 | |||
adbe0fbcd1 | |||
7896242f57 | |||
4a6722b9e9 | |||
7c9fb5228b | |||
81805b01cc |
@ -1,8 +1,7 @@
|
||||
FROM alpine:3.8 AS base
|
||||
FROM node:11-alpine AS base
|
||||
|
||||
ENV NODE_ENV=production
|
||||
|
||||
RUN apk add --no-cache nodejs nodejs-npm zlib
|
||||
RUN npm i -g npm@latest
|
||||
|
||||
WORKDIR /misskey
|
||||
|
126
docs/setup.fr.md
Normal file
126
docs/setup.fr.md
Normal file
@ -0,0 +1,126 @@
|
||||
Guide d'installation et de configuration de Misskey
|
||||
================================================================
|
||||
|
||||
Nous vous remerçions de l'intrêt que vous manifestez pour l'installation de votre propre instance Misskey !
|
||||
Ce guide décrit les étapes à suivre afin d'installer et de configurer une instance Misskey.
|
||||
|
||||
[La version en japonnais est également disponible sur - 日本語版もあります](./setup.ja.md)
|
||||
|
||||
----------------------------------------------------------------
|
||||
|
||||
*1.* Création de l'utilisateur Misskey
|
||||
----------------------------------------------------------------
|
||||
Lancer misskey en tant qu'utilisateur est une mauvaise idée, nous avons besoin de créer un utilisateur dédié.
|
||||
Sur Debian, à titre d'exemple :
|
||||
|
||||
```
|
||||
adduser --disabled-password --disabled-login misskey
|
||||
```
|
||||
|
||||
*2.* Installation des dépendances
|
||||
----------------------------------------------------------------
|
||||
Installez les paquets suivants :
|
||||
|
||||
#### Dépendences :package:
|
||||
* **[Node.js](https://nodejs.org/en/)** >= 10.0.0
|
||||
* **[MongoDB](https://www.mongodb.com/)** >= 3.6
|
||||
|
||||
##### Optionnels
|
||||
* [Redis](https://redis.io/)
|
||||
* Redis est optionnel mais nous vous recommandons vivement de l'installer
|
||||
* [Elasticsearch](https://www.elastic.co/) - requis pour pouvoir activer la fonctionnalité de recherche
|
||||
|
||||
*3.* Paramètrage de MongoDB
|
||||
----------------------------------------------------------------
|
||||
En mode root :
|
||||
1. `mongo` Accédez au shell de mango
|
||||
2. `use misskey` Utilisez la base de données misskey
|
||||
3. `db.users.save( {dummy:"dummy"} )` Write dummy data to initialize the db.
|
||||
4. `db.createUser( { user: "misskey", pwd: "<password>", roles: [ { role: "readWrite", db: "misskey" } ] } )` Créez l'utilisateur misskey.
|
||||
5. `exit` Vous avez terminé !
|
||||
|
||||
*4.* Installation de Misskey
|
||||
----------------------------------------------------------------
|
||||
1. `su - misskey` Basculez vers l'utilisateur misskey.
|
||||
2. `git clone -b master git://github.com/syuilo/misskey.git` Clonez la branche master du dépôt misskey.
|
||||
3. `cd misskey` Accédez au dossier misskey.
|
||||
4. `git checkout $(git tag -l | grep -v 'rc[0-9]*$' | sort -V | tail -n 1)` Télécharge la [version la plus récente](https://github.com/syuilo/misskey/releases/latest)
|
||||
5. `npm install` Installez les dépendances de misskey.
|
||||
|
||||
*(optionnel)* Génération des clés VAPID
|
||||
----------------------------------------------------------------
|
||||
Si vous désirez activer ServiceWorker, vous devez générer les clés VAPID :
|
||||
Unless you have set your global node_modules location elsewhere, vous devez lancer ceci en mode root.
|
||||
|
||||
``` shell
|
||||
npm install web-push -g
|
||||
web-push generate-vapid-keys
|
||||
```
|
||||
|
||||
*5.* Création du fichier de configuration
|
||||
----------------------------------------------------------------
|
||||
1. `cp .config/example.yml .config/default.yml` Copiez le fichier `.config/example.yml` et renommez-le `default.yml`.
|
||||
2. Editez le fichier `default.yml`
|
||||
|
||||
*6.* Construction de Misskey
|
||||
----------------------------------------------------------------
|
||||
|
||||
Construisez Misskey comme ceci :
|
||||
|
||||
`npm run build`
|
||||
|
||||
Si vous êtes sous Debian, vous serez amené à installer les paquets `build-essential`, `python`.
|
||||
|
||||
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`
|
||||
|
||||
*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 !
|
||||
|
||||
### Démarrage avec systemd
|
||||
|
||||
1. Créez une service systemd sur : `/etc/systemd/system/misskey.service`
|
||||
2. Editez-le puis copiez et coller ceci dans le fichier :
|
||||
|
||||
```
|
||||
[Unit]
|
||||
Description=Misskey daemon
|
||||
|
||||
[Service]
|
||||
Type=simple
|
||||
User=misskey
|
||||
ExecStart=/usr/bin/npm start
|
||||
WorkingDirectory=/home/misskey/misskey
|
||||
TimeoutSec=60
|
||||
StandardOutput=syslog
|
||||
StandardError=syslog
|
||||
SyslogIdentifier=misskey
|
||||
Restart=always
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
```
|
||||
|
||||
3. `systemctl daemon-reload ; systemctl enable misskey` Redémarre systemd et active le service misskey.
|
||||
4. `systemctl start misskey` Démarre le service misskey.
|
||||
|
||||
Vous pouvez vérifier si le service a démarré en utilisant la commande `systemctl status misskey`.
|
||||
|
||||
### Méthode de mise à jour vers la plus récente version de 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`
|
||||
5. Consultez [ChangeLog](../CHANGELOG.md) pour les information de migration.
|
||||
|
||||
----------------------------------------------------------------
|
||||
|
||||
Si vous rencontrez des difficultés ou avez d'autres questions, n'hésitez pas à nous contacter !
|
@ -344,6 +344,16 @@ common/views/components/poll-editor.vue:
|
||||
destroy: "アンケートを破棄"
|
||||
common/views/components/reaction-picker.vue:
|
||||
choose-reaction: "リアクションを選択"
|
||||
common/views/components/emoji-picker.vue:
|
||||
custom-emoji: "カスタム絵文字"
|
||||
people: "人"
|
||||
animals-and-nature: "動物&自然"
|
||||
food-and-drink: "食べ物&飲み物"
|
||||
activity: "アクティビティ"
|
||||
travel-and-places: "場所"
|
||||
objects: "物"
|
||||
symbols: "記号"
|
||||
flags: "旗"
|
||||
common/views/components/signin.vue:
|
||||
username: "ユーザー名"
|
||||
password: "パスワード"
|
||||
@ -353,6 +363,7 @@ common/views/components/signin.vue:
|
||||
or: "または"
|
||||
signin-with-twitter: "Twitterでログイン"
|
||||
signin-with-github: "GitHubでログイン"
|
||||
signin-with-discord: "Discordでログイン"
|
||||
login-failed: "ログインできませんでした。ユーザー名とパスワードを確認してください。"
|
||||
common/views/components/signup.vue:
|
||||
invitation-code: "招待コード"
|
||||
@ -398,6 +409,13 @@ common/views/components/github-setting.vue:
|
||||
reconnect: "再接続する"
|
||||
connect: "GitHubと接続する"
|
||||
disconnect: "切断する"
|
||||
common/views/components/discord-setting.vue:
|
||||
description: "お使いのDiscordアカウントをお使いのMisskeyアカウントに接続しておくと、プロフィールでDiscordアカウント情報が表示されるようになったり、Discordを用いた便利なサインインを利用できるようになります。"
|
||||
connected-to: "次のDiscordアカウントに接続されています"
|
||||
detail: "詳細..."
|
||||
reconnect: "再接続する"
|
||||
connect: "Discordと接続する"
|
||||
disconnect: "切断する"
|
||||
common/views/components/uploader.vue:
|
||||
waiting: "待機中"
|
||||
common/views/components/visibility-chooser.vue:
|
||||
@ -588,12 +606,6 @@ desktop/views/components/media-image.vue:
|
||||
desktop/views/components/media-video.vue:
|
||||
sensitive: "閲覧注意"
|
||||
click-to-show: "クリックして表示"
|
||||
desktop/views/components/follow-button.vue:
|
||||
following: "フォロー中"
|
||||
follow: "フォロー"
|
||||
request-pending: "フォロー許可待ち"
|
||||
follow-processing: "フォロー処理中"
|
||||
follow-request: "フォロー申請"
|
||||
desktop/views/components/followers-window.vue:
|
||||
followers: "{} のフォロワー"
|
||||
desktop/views/components/followers.vue:
|
||||
@ -829,6 +841,10 @@ common/views/components/mute-and-block.vue:
|
||||
block: "ブロック"
|
||||
no-muted-users: "ミュートしているユーザーはいません"
|
||||
no-blocked-users: "ブロックしているユーザーはいません"
|
||||
word-mute: "ワードミュート"
|
||||
muted-words: "ミュートされたキーワード"
|
||||
muted-words-description: "スペースで区切るとAND指定になり、改行で区切るとOR指定になります"
|
||||
save: "保存"
|
||||
common/views/components/password-settings.vue:
|
||||
reset: "パスワードを変更する"
|
||||
enter-current-password: "現在のパスワードを入力してください"
|
||||
@ -903,6 +919,7 @@ admin/views/index.vue:
|
||||
dashboard: "ダッシュボード"
|
||||
instance: "インスタンス"
|
||||
emoji: "カスタム絵文字"
|
||||
moderators: "モデレーター"
|
||||
users: "ユーザー"
|
||||
update: "更新"
|
||||
announcements: "お知らせ"
|
||||
@ -947,7 +964,12 @@ admin/views/instance.vue:
|
||||
github-integration-info: "コールバックURLは /api/gh/cb に設定します。"
|
||||
enable-github-integration: "GitHub連携を有効にする"
|
||||
github-integration-client-id: "Client ID"
|
||||
github-integration-client-secret: "Client secret"
|
||||
github-integration-client-secret: "Client Secret"
|
||||
discord-integration-config: "Discord連携の設定"
|
||||
discord-integration-info: "コールバックURLは /api/dc/cb に設定します。"
|
||||
enable-discord-integration: "Discord連携を有効にする"
|
||||
discord-integration-client-id: "Client ID"
|
||||
discord-integration-client-secret: "Client Secret"
|
||||
proxy-account-config: "プロキシアカウントの設定"
|
||||
proxy-account-info: "プロキシアカウントは、特定の条件下でユーザーのリモートフォローを代行するアカウントです。例えば、ユーザーがリモートユーザーをリストに入れたとき、リストに入れられたユーザーを誰もフォローしていないとアクティビティがサーバーに配達されないため、代わりにプロキシアカウントがフォローするようにします。"
|
||||
proxy-account-username: "プロキシアカウントのユーザー名"
|
||||
@ -997,6 +1019,11 @@ admin/views/users.vue:
|
||||
unverify-user: "ユーザーの公式アカウント解除"
|
||||
unverify: "公式アカウントを解除する"
|
||||
unverified: "公式アカウントを解除しました"
|
||||
admin/views/moderators.vue:
|
||||
add-moderator:
|
||||
title: "モデレーターの登録"
|
||||
add: "登録"
|
||||
added: "モデレーターを登録しました"
|
||||
admin/views/emoji.vue:
|
||||
add-emoji:
|
||||
title: "絵文字の登録"
|
||||
@ -1161,7 +1188,7 @@ mobile/views/components/media-image.vue:
|
||||
mobile/views/components/media-video.vue:
|
||||
sensitive: "閲覧注意"
|
||||
click-to-show: "クリックして表示"
|
||||
mobile/views/components/follow-button.vue:
|
||||
common/views/components/follow-button.vue:
|
||||
following: "フォロー中"
|
||||
follow: "フォロー"
|
||||
request-pending: "フォロー許可待ち"
|
||||
@ -1324,6 +1351,10 @@ mobile/views/pages/settings.vue:
|
||||
github-connect: "GitHubアカウントに接続する"
|
||||
github-reconnect: "再接続する"
|
||||
github-disconnect: "切断する"
|
||||
discord: "Discord連携"
|
||||
discord-connect: "Discordアカウントに接続する"
|
||||
discord-reconnect: "再接続する"
|
||||
discord-disconnect: "切断する"
|
||||
update: "Misskey Update"
|
||||
version: "バージョン:"
|
||||
latest-version: "最新のバージョン:"
|
||||
|
@ -344,6 +344,16 @@ common/views/components/poll-editor.vue:
|
||||
destroy: "Diese Abstimmung löschen"
|
||||
common/views/components/reaction-picker.vue:
|
||||
choose-reaction: "Wähle eine Reaktion aus"
|
||||
common/views/components/emoji-picker.vue:
|
||||
custom-emoji: "カスタム絵文字"
|
||||
people: "人"
|
||||
animals-and-nature: "動物&自然"
|
||||
food-and-drink: "食べ物&飲み物"
|
||||
activity: "アクティビティ"
|
||||
travel-and-places: "場所"
|
||||
objects: "物"
|
||||
symbols: "記号"
|
||||
flags: "旗"
|
||||
common/views/components/signin.vue:
|
||||
username: "Benutzername"
|
||||
password: "Passwort"
|
||||
@ -353,6 +363,7 @@ common/views/components/signin.vue:
|
||||
or: "Oder"
|
||||
signin-with-twitter: "Twitterでログイン"
|
||||
signin-with-github: "GitHubでログイン"
|
||||
signin-with-discord: "Discordでログイン"
|
||||
login-failed: "ログインできませんでした。ユーザー名とパスワードを確認してください。"
|
||||
common/views/components/signup.vue:
|
||||
invitation-code: "招待コード"
|
||||
@ -398,6 +409,13 @@ common/views/components/github-setting.vue:
|
||||
reconnect: "再接続する"
|
||||
connect: "GitHubと接続する"
|
||||
disconnect: "切断する"
|
||||
common/views/components/discord-setting.vue:
|
||||
description: "お使いのDiscordアカウントをお使いのMisskeyアカウントに接続しておくと、プロフィールでDiscordアカウント情報が表示されるようになったり、Discordを用いた便利なサインインを利用できるようになります。"
|
||||
connected-to: "次のDiscordアカウントに接続されています"
|
||||
detail: "詳細..."
|
||||
reconnect: "再接続する"
|
||||
connect: "Discordと接続する"
|
||||
disconnect: "切断する"
|
||||
common/views/components/uploader.vue:
|
||||
waiting: "Warten"
|
||||
common/views/components/visibility-chooser.vue:
|
||||
@ -588,12 +606,6 @@ desktop/views/components/media-image.vue:
|
||||
desktop/views/components/media-video.vue:
|
||||
sensitive: "閲覧注意"
|
||||
click-to-show: "クリックして表示"
|
||||
desktop/views/components/follow-button.vue:
|
||||
following: "Folge ich"
|
||||
follow: "Folgen"
|
||||
request-pending: "Ausstehend"
|
||||
follow-processing: "フォロー処理中"
|
||||
follow-request: "Follower-Anfragen"
|
||||
desktop/views/components/followers-window.vue:
|
||||
followers: "{} のフォロワー"
|
||||
desktop/views/components/followers.vue:
|
||||
@ -829,6 +841,10 @@ common/views/components/mute-and-block.vue:
|
||||
block: "ブロック"
|
||||
no-muted-users: "ミュートしているユーザーはいません"
|
||||
no-blocked-users: "ブロックしているユーザーはいません"
|
||||
word-mute: "ワードミュート"
|
||||
muted-words: "ミュートされたキーワード"
|
||||
muted-words-description: "スペースで区切るとAND指定になり、改行で区切るとOR指定になります"
|
||||
save: "保存"
|
||||
common/views/components/password-settings.vue:
|
||||
reset: "パスワードを変更する"
|
||||
enter-current-password: "現在のパスワードを入力してください"
|
||||
@ -903,6 +919,7 @@ admin/views/index.vue:
|
||||
dashboard: "ダッシュボード"
|
||||
instance: "インスタンス"
|
||||
emoji: "カスタム絵文字"
|
||||
moderators: "モデレーター"
|
||||
users: "ユーザー"
|
||||
update: "更新"
|
||||
announcements: "お知らせ"
|
||||
@ -947,7 +964,12 @@ admin/views/instance.vue:
|
||||
github-integration-info: "コールバックURLは /api/gh/cb に設定します。"
|
||||
enable-github-integration: "GitHub連携を有効にする"
|
||||
github-integration-client-id: "Client ID"
|
||||
github-integration-client-secret: "Client secret"
|
||||
github-integration-client-secret: "Client Secret"
|
||||
discord-integration-config: "Discord連携の設定"
|
||||
discord-integration-info: "コールバックURLは /api/dc/cb に設定します。"
|
||||
enable-discord-integration: "Discord連携を有効にする"
|
||||
discord-integration-client-id: "Client ID"
|
||||
discord-integration-client-secret: "Client Secret"
|
||||
proxy-account-config: "プロキシアカウントの設定"
|
||||
proxy-account-info: "プロキシアカウントは、特定の条件下でユーザーのリモートフォローを代行するアカウントです。例えば、ユーザーがリモートユーザーをリストに入れたとき、リストに入れられたユーザーを誰もフォローしていないとアクティビティがサーバーに配達されないため、代わりにプロキシアカウントがフォローするようにします。"
|
||||
proxy-account-username: "プロキシアカウントのユーザー名"
|
||||
@ -997,6 +1019,11 @@ admin/views/users.vue:
|
||||
unverify-user: "ユーザーの公式アカウント解除"
|
||||
unverify: "公式アカウントを解除する"
|
||||
unverified: "公式アカウントを解除しました"
|
||||
admin/views/moderators.vue:
|
||||
add-moderator:
|
||||
title: "モデレーターの登録"
|
||||
add: "登録"
|
||||
added: "モデレーターを登録しました"
|
||||
admin/views/emoji.vue:
|
||||
add-emoji:
|
||||
title: "絵文字の登録"
|
||||
@ -1161,7 +1188,7 @@ mobile/views/components/media-image.vue:
|
||||
mobile/views/components/media-video.vue:
|
||||
sensitive: "閲覧注意"
|
||||
click-to-show: "クリックして表示"
|
||||
mobile/views/components/follow-button.vue:
|
||||
common/views/components/follow-button.vue:
|
||||
following: "フォロー中"
|
||||
follow: "フォロー"
|
||||
request-pending: "フォロー許可待ち"
|
||||
@ -1324,6 +1351,10 @@ mobile/views/pages/settings.vue:
|
||||
github-connect: "GitHubアカウントに接続する"
|
||||
github-reconnect: "再接続する"
|
||||
github-disconnect: "切断する"
|
||||
discord: "Discord連携"
|
||||
discord-connect: "Discordアカウントに接続する"
|
||||
discord-reconnect: "再接続する"
|
||||
discord-disconnect: "切断する"
|
||||
update: "Misskey Update"
|
||||
version: "バージョン:"
|
||||
latest-version: "Neuste Version:"
|
||||
|
@ -16,7 +16,7 @@ common:
|
||||
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”."
|
||||
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: "Misskey Drive"
|
||||
drive: "Drive"
|
||||
drive-desc: "Wanna post a picture you have already uploaded? Wish to organize, name and create a folder for your uploaded files? Misskey Drive is the best solution for you. Very easy to share your files online."
|
||||
outro: "Check further Misskey-unique features on your eyes! Feeling like this is not for you, try other instances as Misskey is a decentralized SNS so that you can easily find your mates. Then, GLHF!"
|
||||
adblock:
|
||||
@ -344,6 +344,16 @@ common/views/components/poll-editor.vue:
|
||||
destroy: "Discard the poll"
|
||||
common/views/components/reaction-picker.vue:
|
||||
choose-reaction: "Send a reaction"
|
||||
common/views/components/emoji-picker.vue:
|
||||
custom-emoji: "Custom Emoji"
|
||||
people: "People"
|
||||
animals-and-nature: "Animals & Nature"
|
||||
food-and-drink: "Food & drink"
|
||||
activity: "Activity"
|
||||
travel-and-places: "Travel & Places"
|
||||
objects: "Objects"
|
||||
symbols: "Symbols"
|
||||
flags: "Flags"
|
||||
common/views/components/signin.vue:
|
||||
username: "Username"
|
||||
password: "Password"
|
||||
@ -353,6 +363,7 @@ common/views/components/signin.vue:
|
||||
or: "Or"
|
||||
signin-with-twitter: "Log in with Twitter"
|
||||
signin-with-github: "Log in with GitHub"
|
||||
signin-with-discord: "Login with Discord"
|
||||
login-failed: "Log in failed. Make sure you have entered your correct username and password."
|
||||
common/views/components/signup.vue:
|
||||
invitation-code: "Invitation code"
|
||||
@ -396,7 +407,14 @@ common/views/components/github-setting.vue:
|
||||
connected-to: "You are connected to this GitHub account"
|
||||
detail: "More..."
|
||||
reconnect: "Reconnect"
|
||||
connect: "Connect to GitHub"
|
||||
connect: "Link your GitHub account"
|
||||
disconnect: "Disconnect"
|
||||
common/views/components/discord-setting.vue:
|
||||
description: "Once you connect your Discord account to your Misskey account, you will be able to see information about your Discord account on your profile, and you will be able to sign-in using Discord."
|
||||
connected-to: "You are connected to this Discord account"
|
||||
detail: "Details…"
|
||||
reconnect: "Reconnect"
|
||||
connect: "Link your Discord account"
|
||||
disconnect: "Disconnect"
|
||||
common/views/components/uploader.vue:
|
||||
waiting: "Waiting"
|
||||
@ -588,12 +606,6 @@ desktop/views/components/media-image.vue:
|
||||
desktop/views/components/media-video.vue:
|
||||
sensitive: "The content is NSFW"
|
||||
click-to-show: "Click to show"
|
||||
desktop/views/components/follow-button.vue:
|
||||
following: "Following"
|
||||
follow: "Follow"
|
||||
request-pending: "Pending follow request"
|
||||
follow-processing: "Processing follow"
|
||||
follow-request: "Follow request"
|
||||
desktop/views/components/followers-window.vue:
|
||||
followers: "{}'s followers"
|
||||
desktop/views/components/followers.vue:
|
||||
@ -829,6 +841,10 @@ common/views/components/mute-and-block.vue:
|
||||
block: "Blocking"
|
||||
no-muted-users: "No muted users"
|
||||
no-blocked-users: "No blocked users"
|
||||
word-mute: "Word mute"
|
||||
muted-words: "Muted keywords"
|
||||
muted-words-description: "Separating with spaces results in AND specifications, and delimiting with line breaks results in OR specifications"
|
||||
save: "Save"
|
||||
common/views/components/password-settings.vue:
|
||||
reset: "Change password"
|
||||
enter-current-password: "Enter the current password"
|
||||
@ -903,6 +919,7 @@ admin/views/index.vue:
|
||||
dashboard: "Dashboard"
|
||||
instance: "Instance"
|
||||
emoji: "Emoji"
|
||||
moderators: "Moderator"
|
||||
users: "Users"
|
||||
update: "Update"
|
||||
announcements: "Announcements"
|
||||
@ -947,7 +964,12 @@ admin/views/instance.vue:
|
||||
github-integration-info: "The callback URL is set on /api/gh/cb."
|
||||
enable-github-integration: "Enable connection to GitHub"
|
||||
github-integration-client-id: "Client ID"
|
||||
github-integration-client-secret: "Client secret"
|
||||
github-integration-client-secret: "Client Secret"
|
||||
discord-integration-config: "Setting of Discord Integration"
|
||||
discord-integration-info: "The callback URL is set on /api/dc/cb."
|
||||
enable-discord-integration: "Enable Discord connection"
|
||||
discord-integration-client-id: "Client ID"
|
||||
discord-integration-client-secret: "Client Secret"
|
||||
proxy-account-config: "Proxy account"
|
||||
proxy-account-info: "Proxy account can follow a remote user to deliver activities if no one in this instance follow him or her. When you add a remote user who is followed by nobody in this instance to your list, in order to get his or her data, proxy account follow him or her instead of your following."
|
||||
proxy-account-username: "Proxy account user name"
|
||||
@ -997,6 +1019,11 @@ admin/views/users.vue:
|
||||
unverify-user: "User account unverification settings"
|
||||
unverify: "Unverify account"
|
||||
unverified: "The account is now being unverified"
|
||||
admin/views/moderators.vue:
|
||||
add-moderator:
|
||||
title: "Register Moderator"
|
||||
add: "Register"
|
||||
added: "Registered a Moderator."
|
||||
admin/views/emoji.vue:
|
||||
add-emoji:
|
||||
title: "Add emoji"
|
||||
@ -1161,11 +1188,11 @@ mobile/views/components/media-image.vue:
|
||||
mobile/views/components/media-video.vue:
|
||||
sensitive: "The content is NSFW"
|
||||
click-to-show: "Click to show"
|
||||
mobile/views/components/follow-button.vue:
|
||||
common/views/components/follow-button.vue:
|
||||
following: "Following"
|
||||
follow: "Follow"
|
||||
request-pending: "Pending follow request"
|
||||
follow-processing: "Processing follow"
|
||||
request-pending: "Pending"
|
||||
follow-processing: "Processing"
|
||||
follow-request: "Follow request"
|
||||
mobile/views/components/friends-maker.vue:
|
||||
title: "Let's follow them"
|
||||
@ -1324,6 +1351,10 @@ mobile/views/pages/settings.vue:
|
||||
github-connect: "Connect to your GitHub account"
|
||||
github-reconnect: "Reconnect"
|
||||
github-disconnect: "Disconnect"
|
||||
discord: "Discord Integration"
|
||||
discord-connect: "Connect to your Discord account"
|
||||
discord-reconnect: "Reconnect"
|
||||
discord-disconnect: "Disconnect"
|
||||
update: "Misskey Update"
|
||||
version: "Current version:"
|
||||
latest-version: "Latest version:"
|
||||
|
@ -344,6 +344,16 @@ common/views/components/poll-editor.vue:
|
||||
destroy: "Cancelar la encuesta"
|
||||
common/views/components/reaction-picker.vue:
|
||||
choose-reaction: "Escoge una reacción"
|
||||
common/views/components/emoji-picker.vue:
|
||||
custom-emoji: "カスタム絵文字"
|
||||
people: "人"
|
||||
animals-and-nature: "動物&自然"
|
||||
food-and-drink: "食べ物&飲み物"
|
||||
activity: "アクティビティ"
|
||||
travel-and-places: "場所"
|
||||
objects: "物"
|
||||
symbols: "記号"
|
||||
flags: "旗"
|
||||
common/views/components/signin.vue:
|
||||
username: "Usuario"
|
||||
password: "Contraseña"
|
||||
@ -353,6 +363,7 @@ common/views/components/signin.vue:
|
||||
or: "O"
|
||||
signin-with-twitter: "Ingresar con Twitter"
|
||||
signin-with-github: "GitHubでログイン"
|
||||
signin-with-discord: "Discordでログイン"
|
||||
login-failed: "Autenticación fallida. Asegúrate de haber usado el nombre de usuario y contraseña correctos."
|
||||
common/views/components/signup.vue:
|
||||
invitation-code: "Código de invitación"
|
||||
@ -398,6 +409,13 @@ common/views/components/github-setting.vue:
|
||||
reconnect: "再接続する"
|
||||
connect: "GitHubと接続する"
|
||||
disconnect: "切断する"
|
||||
common/views/components/discord-setting.vue:
|
||||
description: "お使いのDiscordアカウントをお使いのMisskeyアカウントに接続しておくと、プロフィールでDiscordアカウント情報が表示されるようになったり、Discordを用いた便利なサインインを利用できるようになります。"
|
||||
connected-to: "次のDiscordアカウントに接続されています"
|
||||
detail: "詳細..."
|
||||
reconnect: "再接続する"
|
||||
connect: "Discordと接続する"
|
||||
disconnect: "切断する"
|
||||
common/views/components/uploader.vue:
|
||||
waiting: "Un momento"
|
||||
common/views/components/visibility-chooser.vue:
|
||||
@ -588,12 +606,6 @@ desktop/views/components/media-image.vue:
|
||||
desktop/views/components/media-video.vue:
|
||||
sensitive: "Este contenido no es apropiado para ver en el trabajo"
|
||||
click-to-show: "Click para mostrar"
|
||||
desktop/views/components/follow-button.vue:
|
||||
following: "Siguiendo"
|
||||
follow: "Sigue"
|
||||
request-pending: "Pendiente de aprobación"
|
||||
follow-processing: "フォロー処理中"
|
||||
follow-request: "Solicitud de seguir"
|
||||
desktop/views/components/followers-window.vue:
|
||||
followers: "{} seguidores"
|
||||
desktop/views/components/followers.vue:
|
||||
@ -829,6 +841,10 @@ common/views/components/mute-and-block.vue:
|
||||
block: "ブロック"
|
||||
no-muted-users: "ミュートしているユーザーはいません"
|
||||
no-blocked-users: "ブロックしているユーザーはいません"
|
||||
word-mute: "ワードミュート"
|
||||
muted-words: "ミュートされたキーワード"
|
||||
muted-words-description: "スペースで区切るとAND指定になり、改行で区切るとOR指定になります"
|
||||
save: "保存"
|
||||
common/views/components/password-settings.vue:
|
||||
reset: "パスワードを変更する"
|
||||
enter-current-password: "現在のパスワードを入力してください"
|
||||
@ -903,6 +919,7 @@ admin/views/index.vue:
|
||||
dashboard: "ダッシュボード"
|
||||
instance: "インスタンス"
|
||||
emoji: "カスタム絵文字"
|
||||
moderators: "モデレーター"
|
||||
users: "ユーザー"
|
||||
update: "更新"
|
||||
announcements: "お知らせ"
|
||||
@ -947,7 +964,12 @@ admin/views/instance.vue:
|
||||
github-integration-info: "コールバックURLは /api/gh/cb に設定します。"
|
||||
enable-github-integration: "GitHub連携を有効にする"
|
||||
github-integration-client-id: "Client ID"
|
||||
github-integration-client-secret: "Client secret"
|
||||
github-integration-client-secret: "Client Secret"
|
||||
discord-integration-config: "Discord連携の設定"
|
||||
discord-integration-info: "コールバックURLは /api/dc/cb に設定します。"
|
||||
enable-discord-integration: "Discord連携を有効にする"
|
||||
discord-integration-client-id: "Client ID"
|
||||
discord-integration-client-secret: "Client Secret"
|
||||
proxy-account-config: "プロキシアカウントの設定"
|
||||
proxy-account-info: "プロキシアカウントは、特定の条件下でユーザーのリモートフォローを代行するアカウントです。例えば、ユーザーがリモートユーザーをリストに入れたとき、リストに入れられたユーザーを誰もフォローしていないとアクティビティがサーバーに配達されないため、代わりにプロキシアカウントがフォローするようにします。"
|
||||
proxy-account-username: "プロキシアカウントのユーザー名"
|
||||
@ -997,6 +1019,11 @@ admin/views/users.vue:
|
||||
unverify-user: "ユーザーの公式アカウント解除"
|
||||
unverify: "公式アカウントを解除する"
|
||||
unverified: "公式アカウントを解除しました"
|
||||
admin/views/moderators.vue:
|
||||
add-moderator:
|
||||
title: "モデレーターの登録"
|
||||
add: "登録"
|
||||
added: "モデレーターを登録しました"
|
||||
admin/views/emoji.vue:
|
||||
add-emoji:
|
||||
title: "絵文字の登録"
|
||||
@ -1161,7 +1188,7 @@ mobile/views/components/media-image.vue:
|
||||
mobile/views/components/media-video.vue:
|
||||
sensitive: "閲覧注意"
|
||||
click-to-show: "クリックして表示"
|
||||
mobile/views/components/follow-button.vue:
|
||||
common/views/components/follow-button.vue:
|
||||
following: "フォロー中"
|
||||
follow: "フォロー"
|
||||
request-pending: "フォロー許可待ち"
|
||||
@ -1324,6 +1351,10 @@ mobile/views/pages/settings.vue:
|
||||
github-connect: "GitHubアカウントに接続する"
|
||||
github-reconnect: "再接続する"
|
||||
github-disconnect: "切断する"
|
||||
discord: "Discord連携"
|
||||
discord-connect: "Discordアカウントに接続する"
|
||||
discord-reconnect: "再接続する"
|
||||
discord-disconnect: "切断する"
|
||||
update: "Misskey Update"
|
||||
version: "バージョン:"
|
||||
latest-version: "最新のバージョン:"
|
||||
|
@ -71,7 +71,7 @@ common:
|
||||
friday: "Vendredi"
|
||||
saturday: "Samedi"
|
||||
reactions:
|
||||
like: "J'aime"
|
||||
like: "Bien"
|
||||
love: "Adore"
|
||||
laugh: "Rire"
|
||||
hmm: "Hmm … ?"
|
||||
@ -85,8 +85,8 @@ common:
|
||||
public: "Public"
|
||||
home: "Principal"
|
||||
home-desc: "Publier sur le fil principal uniquement"
|
||||
followers: "Abonnés·es"
|
||||
followers-desc: "Publier à vos abonnés·es uniquement"
|
||||
followers: "Abonné·e·s"
|
||||
followers-desc: "Publier à vos abonné·e·s uniquement"
|
||||
specified: "Direct"
|
||||
specified-desc: "Publier uniquement aux utilisateurs·rices mentionnés·es"
|
||||
private: "Privé"
|
||||
@ -99,7 +99,7 @@ common:
|
||||
f: "En attente de vos écrits"
|
||||
search: "Recherche"
|
||||
delete: "Supprimer"
|
||||
loading: "Chargement"
|
||||
loading: "Chargement en cours …"
|
||||
ok: "OK"
|
||||
update-available-title: "Mise à jour disponible"
|
||||
update-available: "Une nouvelle version de Misskey est disponible ({newer}, version actuelle: {current}). Veuillez recharger la page pour appliquer la mise à jour."
|
||||
@ -117,8 +117,8 @@ common:
|
||||
this-setting-is-this-device-only: "Uniquement sur cet appareil"
|
||||
use-os-default-emojis: "Utiliser les émojis standards du système"
|
||||
do-not-use-in-production: 'Il s’agit d’une version de développement. Ne pas utiliser dans un environnement de production.'
|
||||
is-remote-user: "Ces informations utilisateur ont été copiées."
|
||||
is-remote-post: "Ceci est une publication distante"
|
||||
is-remote-user: "Ces informations appartiennent à un·e utilisateur·rice distant·e."
|
||||
is-remote-post: "Ceci est une publication distante."
|
||||
view-on-remote: "Consulter le profil complet"
|
||||
error:
|
||||
title: 'Une erreur est survenue'
|
||||
@ -151,7 +151,7 @@ common:
|
||||
notifications: "Notifications"
|
||||
users: "Utilisateur·rice·s"
|
||||
polls: "Sondages"
|
||||
post-form: "Formulaire de publication"
|
||||
post-form: "Champs de publication"
|
||||
server: "Info sur le serveur"
|
||||
donation: "Dons"
|
||||
nav: "Navigation"
|
||||
@ -166,7 +166,7 @@ auth/views/form.vue:
|
||||
account-write: "Modifications des informations du compte :"
|
||||
note-write: "Publier."
|
||||
like-write: "Réagir aux publications."
|
||||
following-write: "S'abonner et se désabonner."
|
||||
following-write: "S’abonner et se désabonner."
|
||||
drive-read: "Lire votre Drive"
|
||||
drive-write: "Téléverser/supprimer des fichiers dans votre Drive."
|
||||
notification-read: "Lire vos notifications."
|
||||
@ -344,6 +344,16 @@ common/views/components/poll-editor.vue:
|
||||
destroy: "Annuler ce sondage"
|
||||
common/views/components/reaction-picker.vue:
|
||||
choose-reaction: "Choisissez votre réaction"
|
||||
common/views/components/emoji-picker.vue:
|
||||
custom-emoji: "Émoji personnalisé"
|
||||
people: "Personnes"
|
||||
animals-and-nature: "Animaux et nature"
|
||||
food-and-drink: "Nourriture et boisson"
|
||||
activity: "Activités"
|
||||
travel-and-places: "Lieux et voyages"
|
||||
objects: "Objets"
|
||||
symbols: "Symboles"
|
||||
flags: "Drapeaux"
|
||||
common/views/components/signin.vue:
|
||||
username: "Nom d'utilisateur·rice"
|
||||
password: "Mot de passe"
|
||||
@ -353,6 +363,7 @@ common/views/components/signin.vue:
|
||||
or: "Ou"
|
||||
signin-with-twitter: "Se connecter via Twitter"
|
||||
signin-with-github: "Se connecter avec GitHub"
|
||||
signin-with-discord: "Discordでログイン"
|
||||
login-failed: "Échec d'authentification. Veuillez vérifier que votre nom d'utilisateur et mot de passe sont corrects."
|
||||
common/views/components/signup.vue:
|
||||
invitation-code: "Code d’invitation"
|
||||
@ -398,6 +409,13 @@ common/views/components/github-setting.vue:
|
||||
reconnect: "Reconnecter"
|
||||
connect: "Se connecter avec GitHub"
|
||||
disconnect: "Déconnecter"
|
||||
common/views/components/discord-setting.vue:
|
||||
description: "お使いのDiscordアカウントをお使いのMisskeyアカウントに接続しておくと、プロフィールでDiscordアカウント情報が表示されるようになったり、Discordを用いた便利なサインインを利用できるようになります。"
|
||||
connected-to: "次のDiscordアカウントに接続されています"
|
||||
detail: "詳細..."
|
||||
reconnect: "再接続する"
|
||||
connect: "Discordと接続する"
|
||||
disconnect: "切断する"
|
||||
common/views/components/uploader.vue:
|
||||
waiting: "Veuillez patienter"
|
||||
common/views/components/visibility-chooser.vue:
|
||||
@ -490,9 +508,9 @@ common/views/pages/follow.vue:
|
||||
signed-in-as: "Connecté·e en tant que {}"
|
||||
following: "Suit"
|
||||
follow: "Suivre"
|
||||
request-pending: "Demande d'abonnement en attente"
|
||||
follow-processing: "En cours d’abonnement"
|
||||
follow-request: "Demande d'abonnement"
|
||||
request-pending: "Demande d’abonnement en attente"
|
||||
follow-processing: "Demande en attente"
|
||||
follow-request: "Demande d’abonnement"
|
||||
desktop:
|
||||
banner-crop-title: "Découpez la partie qui apparaitra comme bannière"
|
||||
banner: "Bannière"
|
||||
@ -588,16 +606,10 @@ desktop/views/components/media-image.vue:
|
||||
desktop/views/components/media-video.vue:
|
||||
sensitive: "Le contenu est NSFW"
|
||||
click-to-show: "Cliquer pour afficher"
|
||||
desktop/views/components/follow-button.vue:
|
||||
following: "Abonné·e"
|
||||
follow: "Suivre"
|
||||
request-pending: "En attente d'approbation"
|
||||
follow-processing: "Continuer l’abonnement"
|
||||
follow-request: "Demande d'abonnement"
|
||||
desktop/views/components/followers-window.vue:
|
||||
followers: "{} abonné·e·s"
|
||||
desktop/views/components/followers.vue:
|
||||
empty: "Il semble que vous n'avez pas encore d'abonné·e·s."
|
||||
empty: "Il semble que vous n’avez pas encore d’abonné·e·s."
|
||||
desktop/views/components/following-window.vue:
|
||||
following: "Suit {}"
|
||||
desktop/views/components/following.vue:
|
||||
@ -640,7 +652,7 @@ desktop/views/components/notes.vue:
|
||||
error: "Échec du chargement."
|
||||
retry: "Réessayer"
|
||||
desktop/views/components/notifications.vue:
|
||||
empty: "Pas de notifications"
|
||||
empty: "Aucune de notification !"
|
||||
desktop/views/components/post-form.vue:
|
||||
add-visible-user: "+Ajouter un utilisateur"
|
||||
attach-location-information: "Attacher des informations de localisation"
|
||||
@ -829,6 +841,10 @@ common/views/components/mute-and-block.vue:
|
||||
block: "En cours blocage"
|
||||
no-muted-users: "Aucun utilisateur·rice n’est mis·e en sourdine"
|
||||
no-blocked-users: "Aucun utilisateur·rice n’est bloqué·e"
|
||||
word-mute: "Filtre de mots"
|
||||
muted-words: "Mots masqués"
|
||||
muted-words-description: "Description des mots mis en sourdine"
|
||||
save: "Enregistrer"
|
||||
common/views/components/password-settings.vue:
|
||||
reset: "Modifier le mot de passe"
|
||||
enter-current-password: "Entrez votre mot de passe actuel"
|
||||
@ -880,7 +896,7 @@ desktop/views/components/ui.header.search.vue:
|
||||
placeholder: "Chercher"
|
||||
desktop/views/components/received-follow-requests-window.vue:
|
||||
title: "Demandes de suivi"
|
||||
accept: "Approuver"
|
||||
accept: "Accepter"
|
||||
reject: "Refuser"
|
||||
desktop/views/components/user-lists-window.vue:
|
||||
title: "Listes de l'utilisateur"
|
||||
@ -903,6 +919,7 @@ admin/views/index.vue:
|
||||
dashboard: "Tableau de bord"
|
||||
instance: "Instance"
|
||||
emoji: "Emoji"
|
||||
moderators: "モデレーター"
|
||||
users: "Utilisateur·rice·s"
|
||||
update: "Mise à jour"
|
||||
announcements: "Annonces"
|
||||
@ -947,7 +964,12 @@ admin/views/instance.vue:
|
||||
github-integration-info: "L’URL callback est définit sur /api/gh/cb"
|
||||
enable-github-integration: "Activer l’authentification avec Github"
|
||||
github-integration-client-id: "ID client"
|
||||
github-integration-client-secret: "Secret client"
|
||||
github-integration-client-secret: "Client Secret"
|
||||
discord-integration-config: "Discord連携の設定"
|
||||
discord-integration-info: "コールバックURLは /api/dc/cb に設定します。"
|
||||
enable-discord-integration: "Discord連携を有効にする"
|
||||
discord-integration-client-id: "Client ID"
|
||||
discord-integration-client-secret: "Client Secret"
|
||||
proxy-account-config: "Compte proxy"
|
||||
proxy-account-info: "プロキシアカウントは、特定の条件下でユーザーのリモートフォローを代行するアカウントです。例えば、ユーザーがリモートユーザーをリストに入れたとき、リストに入れられたユーザーを誰もフォローしていないとアクティビティがサーバーに配達されないため、代わりにプロキシアカウントがフォローするようにします。"
|
||||
proxy-account-username: "Nom d’utilisateur du compte proxy"
|
||||
@ -997,6 +1019,11 @@ admin/views/users.vue:
|
||||
unverify-user: "ユーザーの公式アカウント解除"
|
||||
unverify: "Ôter la vérification du compte"
|
||||
unverified: "Ce compte n'est plus vérifié"
|
||||
admin/views/moderators.vue:
|
||||
add-moderator:
|
||||
title: "モデレーターの登録"
|
||||
add: "登録"
|
||||
added: "モデレーターを登録しました"
|
||||
admin/views/emoji.vue:
|
||||
add-emoji:
|
||||
title: "Ajouter un émoji"
|
||||
@ -1067,7 +1094,7 @@ desktop/views/pages/user-list.users.vue:
|
||||
desktop/views/pages/user/user.followers-you-know.vue:
|
||||
title: "Abonné·e·s que vous connaissez"
|
||||
loading: "Chargement en cours"
|
||||
no-users: "Pas d'utilisateurs"
|
||||
no-users: "Aucun abonné connu"
|
||||
desktop/views/pages/user/user.friends.vue:
|
||||
title: "Mentions fréquentes"
|
||||
loading: "Chargement en cours"
|
||||
@ -1079,8 +1106,8 @@ desktop/views/pages/user/user.photos.vue:
|
||||
desktop/views/pages/user/user.profile.vue:
|
||||
follows-you: "Vous suit"
|
||||
stalk: "Traquer"
|
||||
stalking: "ストーキングしています"
|
||||
unstalk: "ストーク解除"
|
||||
stalking: "Entrain de poursuivre"
|
||||
unstalk: "Cesser la poursuite"
|
||||
mute: "Mettre en sourdine"
|
||||
muted: "Muting"
|
||||
unmute: "Enlever la sourdine"
|
||||
@ -1161,12 +1188,12 @@ mobile/views/components/media-image.vue:
|
||||
mobile/views/components/media-video.vue:
|
||||
sensitive: "Le contenu est NSFW"
|
||||
click-to-show: "Cliquer pour afficher"
|
||||
mobile/views/components/follow-button.vue:
|
||||
common/views/components/follow-button.vue:
|
||||
following: "Abonné·e"
|
||||
follow: "Suivre"
|
||||
request-pending: "En attente d'approbation"
|
||||
follow: " Suivre"
|
||||
request-pending: "Demande en attente"
|
||||
follow-processing: "En cours d’abonnement"
|
||||
follow-request: "Demande d'abonnement"
|
||||
follow-request: "Demande d’abonnement"
|
||||
mobile/views/components/friends-maker.vue:
|
||||
title: "Abonnez-vous aux utilisateurs"
|
||||
empty: "Impossible de trouver des utilisateurs·trices à recommander."
|
||||
@ -1194,7 +1221,7 @@ mobile/views/components/note-sub.vue:
|
||||
bot: "bot"
|
||||
cat: "chat"
|
||||
mobile/views/components/notifications.vue:
|
||||
empty: "Pas de notifications"
|
||||
empty: "Aucune de notification !"
|
||||
mobile/views/components/post-form.vue:
|
||||
add-visible-user: "Ajouter un utilisateur"
|
||||
submit: "Publier"
|
||||
@ -1219,7 +1246,7 @@ mobile/views/components/ui.header.vue:
|
||||
mobile/views/components/ui.nav.vue:
|
||||
timeline: "Fil d'actualité"
|
||||
notifications: "Notifications"
|
||||
follow-requests: "Demandes d'abonnement"
|
||||
follow-requests: "Demandes d’abonnement"
|
||||
search: "Rechercher"
|
||||
favorites: "Favoris"
|
||||
user-lists: "Listes"
|
||||
@ -1267,8 +1294,8 @@ mobile/views/pages/widgets/activity.vue:
|
||||
mobile/views/pages/share.vue:
|
||||
share-with: "Partager avec {name}"
|
||||
mobile/views/pages/received-follow-requests.vue:
|
||||
title: "Demandes d'abonnement"
|
||||
accept: "Approuver"
|
||||
title: "Demandes d’abonnement"
|
||||
accept: "Accepter"
|
||||
reject: "Refuser"
|
||||
mobile/views/pages/note.vue:
|
||||
title: "Post"
|
||||
@ -1276,7 +1303,7 @@ mobile/views/pages/note.vue:
|
||||
next: "Note suivante"
|
||||
mobile/views/pages/notifications.vue:
|
||||
notifications: "Notifications"
|
||||
read-all: "Êtes vous sûr de vouloir marqués toutes les notifications non-lus en tant que lus?"
|
||||
read-all: "Êtes-vous sûr de vouloir marquer l’ensemble des notifications comme étant lues ?"
|
||||
mobile/views/pages/games/reversi.vue:
|
||||
reversi: "Reversi"
|
||||
mobile/views/pages/search.vue:
|
||||
@ -1324,6 +1351,10 @@ mobile/views/pages/settings.vue:
|
||||
github-connect: "Se connecter à votre compte GitHub"
|
||||
github-reconnect: "Reconnecter"
|
||||
github-disconnect: "Déconnecter"
|
||||
discord: "Discord連携"
|
||||
discord-connect: "Discordアカウントに接続する"
|
||||
discord-reconnect: "再接続する"
|
||||
discord-disconnect: "切断する"
|
||||
update: "Mise à jour de Misskey"
|
||||
version: "Version :"
|
||||
latest-version: "Dernière version :"
|
||||
@ -1363,7 +1394,7 @@ mobile/views/pages/user/home.vue:
|
||||
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: "Pas d'utilisateurs"
|
||||
no-users: "Aucun utilisateur·rice connu·e"
|
||||
mobile/views/pages/user/home.friends.vue:
|
||||
no-users: "Pass d'utilisateurs"
|
||||
mobile/views/pages/user/home.notes.vue:
|
||||
|
@ -344,6 +344,16 @@ common/views/components/poll-editor.vue:
|
||||
destroy: "アンケートを破棄"
|
||||
common/views/components/reaction-picker.vue:
|
||||
choose-reaction: "リアクションを選択"
|
||||
common/views/components/emoji-picker.vue:
|
||||
custom-emoji: "カスタム絵文字"
|
||||
people: "人"
|
||||
animals-and-nature: "動物&自然"
|
||||
food-and-drink: "食べ物&飲み物"
|
||||
activity: "アクティビティ"
|
||||
travel-and-places: "場所"
|
||||
objects: "物"
|
||||
symbols: "記号"
|
||||
flags: "旗"
|
||||
common/views/components/signin.vue:
|
||||
username: "ユーザー名"
|
||||
password: "パスワード"
|
||||
@ -353,6 +363,7 @@ common/views/components/signin.vue:
|
||||
or: "または"
|
||||
signin-with-twitter: "Twitterでログイン"
|
||||
signin-with-github: "GitHubでログイン"
|
||||
signin-with-discord: "Discordでログイン"
|
||||
login-failed: "ログインできませんでした。ユーザー名とパスワードを確認してください。"
|
||||
common/views/components/signup.vue:
|
||||
invitation-code: "招待コード"
|
||||
@ -398,6 +409,13 @@ common/views/components/github-setting.vue:
|
||||
reconnect: "再接続する"
|
||||
connect: "GitHubと接続する"
|
||||
disconnect: "切断する"
|
||||
common/views/components/discord-setting.vue:
|
||||
description: "お使いのDiscordアカウントをお使いのMisskeyアカウントに接続しておくと、プロフィールでDiscordアカウント情報が表示されるようになったり、Discordを用いた便利なサインインを利用できるようになります。"
|
||||
connected-to: "次のDiscordアカウントに接続されています"
|
||||
detail: "詳細..."
|
||||
reconnect: "再接続する"
|
||||
connect: "Discordと接続する"
|
||||
disconnect: "切断する"
|
||||
common/views/components/uploader.vue:
|
||||
waiting: "待機中"
|
||||
common/views/components/visibility-chooser.vue:
|
||||
@ -588,12 +606,6 @@ desktop/views/components/media-image.vue:
|
||||
desktop/views/components/media-video.vue:
|
||||
sensitive: "閲覧注意"
|
||||
click-to-show: "クリックして表示"
|
||||
desktop/views/components/follow-button.vue:
|
||||
following: "フォロー中"
|
||||
follow: "フォロー"
|
||||
request-pending: "フォロー許可待ち"
|
||||
follow-processing: "フォロー処理中"
|
||||
follow-request: "フォロー申請"
|
||||
desktop/views/components/followers-window.vue:
|
||||
followers: "{} のフォロワー"
|
||||
desktop/views/components/followers.vue:
|
||||
@ -829,6 +841,10 @@ common/views/components/mute-and-block.vue:
|
||||
block: "ブロック"
|
||||
no-muted-users: "ミュートしているユーザーはいません"
|
||||
no-blocked-users: "ブロックしているユーザーはいません"
|
||||
word-mute: "ワードミュート"
|
||||
muted-words: "ミュートされたキーワード"
|
||||
muted-words-description: "スペースで区切るとAND指定になり、改行で区切るとOR指定になります"
|
||||
save: "保存"
|
||||
common/views/components/password-settings.vue:
|
||||
reset: "パスワードを変更する"
|
||||
enter-current-password: "現在のパスワードを入力してください"
|
||||
@ -903,6 +919,7 @@ admin/views/index.vue:
|
||||
dashboard: "ダッシュボード"
|
||||
instance: "インスタンス"
|
||||
emoji: "カスタム絵文字"
|
||||
moderators: "モデレーター"
|
||||
users: "ユーザー"
|
||||
update: "更新"
|
||||
announcements: "お知らせ"
|
||||
@ -947,7 +964,12 @@ admin/views/instance.vue:
|
||||
github-integration-info: "コールバックURLは /api/gh/cb に設定します。"
|
||||
enable-github-integration: "GitHub連携を有効にする"
|
||||
github-integration-client-id: "Client ID"
|
||||
github-integration-client-secret: "Client secret"
|
||||
github-integration-client-secret: "Client Secret"
|
||||
discord-integration-config: "Discord連携の設定"
|
||||
discord-integration-info: "コールバックURLは /api/dc/cb に設定します。"
|
||||
enable-discord-integration: "Discord連携を有効にする"
|
||||
discord-integration-client-id: "Client ID"
|
||||
discord-integration-client-secret: "Client Secret"
|
||||
proxy-account-config: "プロキシアカウントの設定"
|
||||
proxy-account-info: "プロキシアカウントは、特定の条件下でユーザーのリモートフォローを代行するアカウントです。例えば、ユーザーがリモートユーザーをリストに入れたとき、リストに入れられたユーザーを誰もフォローしていないとアクティビティがサーバーに配達されないため、代わりにプロキシアカウントがフォローするようにします。"
|
||||
proxy-account-username: "プロキシアカウントのユーザー名"
|
||||
@ -997,6 +1019,11 @@ admin/views/users.vue:
|
||||
unverify-user: "ユーザーの公式アカウント解除"
|
||||
unverify: "公式アカウントを解除する"
|
||||
unverified: "公式アカウントを解除しました"
|
||||
admin/views/moderators.vue:
|
||||
add-moderator:
|
||||
title: "モデレーターの登録"
|
||||
add: "登録"
|
||||
added: "モデレーターを登録しました"
|
||||
admin/views/emoji.vue:
|
||||
add-emoji:
|
||||
title: "絵文字の登録"
|
||||
@ -1161,7 +1188,7 @@ mobile/views/components/media-image.vue:
|
||||
mobile/views/components/media-video.vue:
|
||||
sensitive: "閲覧注意"
|
||||
click-to-show: "クリックして表示"
|
||||
mobile/views/components/follow-button.vue:
|
||||
common/views/components/follow-button.vue:
|
||||
following: "フォロー中"
|
||||
follow: "フォロー"
|
||||
request-pending: "フォロー許可待ち"
|
||||
@ -1324,6 +1351,10 @@ mobile/views/pages/settings.vue:
|
||||
github-connect: "GitHubアカウントに接続する"
|
||||
github-reconnect: "再接続する"
|
||||
github-disconnect: "切断する"
|
||||
discord: "Discord連携"
|
||||
discord-connect: "Discordアカウントに接続する"
|
||||
discord-reconnect: "再接続する"
|
||||
discord-disconnect: "切断する"
|
||||
update: "Misskey Update"
|
||||
version: "バージョン:"
|
||||
latest-version: "最新のバージョン:"
|
||||
|
@ -96,6 +96,9 @@ common:
|
||||
specified: "ダイレクト"
|
||||
specified-desc: "指定したユーザーにのみ公開"
|
||||
private: "非公開"
|
||||
local-public: "公開(ローカルのみ)"
|
||||
local-home: "ホーム(ローカルのみ)"
|
||||
local-followers: "フォロワー(ローカルのみ)"
|
||||
|
||||
note-placeholders:
|
||||
a: "今どうしてる?"
|
||||
@ -399,6 +402,7 @@ common/views/components/signin.vue:
|
||||
or: "または"
|
||||
signin-with-twitter: "Twitterでログイン"
|
||||
signin-with-github: "GitHubでログイン"
|
||||
signin-with-discord: "Discordでログイン"
|
||||
login-failed: "ログインできませんでした。ユーザー名とパスワードを確認してください。"
|
||||
|
||||
common/views/components/signup.vue:
|
||||
@ -450,6 +454,14 @@ common/views/components/github-setting.vue:
|
||||
connect: "GitHubと接続する"
|
||||
disconnect: "切断する"
|
||||
|
||||
common/views/components/discord-setting.vue:
|
||||
description: "お使いのDiscordアカウントをお使いのMisskeyアカウントに接続しておくと、プロフィールでDiscordアカウント情報が表示されるようになったり、Discordを用いた便利なサインインを利用できるようになります。"
|
||||
connected-to: "次のDiscordアカウントに接続されています"
|
||||
detail: "詳細..."
|
||||
reconnect: "再接続する"
|
||||
connect: "Discordと接続する"
|
||||
disconnect: "切断する"
|
||||
|
||||
common/views/components/uploader.vue:
|
||||
waiting: "待機中"
|
||||
|
||||
@ -462,6 +474,9 @@ common/views/components/visibility-chooser.vue:
|
||||
specified: "ダイレクト"
|
||||
specified-desc: "指定したユーザーにのみ公開"
|
||||
private: "非公開"
|
||||
local-public: "公開(ローカルのみ)"
|
||||
local-home: "ホーム(ローカルのみ)"
|
||||
local-followers: "フォロワー(ローカルのみ)"
|
||||
|
||||
common/views/components/trends.vue:
|
||||
count: "{}人が投稿"
|
||||
@ -668,13 +683,6 @@ desktop/views/components/media-video.vue:
|
||||
sensitive: "閲覧注意"
|
||||
click-to-show: "クリックして表示"
|
||||
|
||||
desktop/views/components/follow-button.vue:
|
||||
following: "フォロー中"
|
||||
follow: "フォロー"
|
||||
request-pending: "フォロー許可待ち"
|
||||
follow-processing: "フォロー処理中"
|
||||
follow-request: "フォロー申請"
|
||||
|
||||
desktop/views/components/followers-window.vue:
|
||||
followers: "{} のフォロワー"
|
||||
|
||||
@ -759,6 +767,7 @@ desktop/views/components/post-form.vue:
|
||||
create-poll: "アンケートを作成"
|
||||
text-remain: "残り{}文字"
|
||||
recent-tags: "最近"
|
||||
local-only-message: "この投稿はローカルにのみ公開されます"
|
||||
click-to-tagging: "クリックでタグ付け"
|
||||
visibility: "公開範囲"
|
||||
geolocation-alert: "お使いの端末は位置情報に対応していません"
|
||||
@ -1041,8 +1050,9 @@ admin/views/index.vue:
|
||||
dashboard: "ダッシュボード"
|
||||
instance: "インスタンス"
|
||||
emoji: "カスタム絵文字"
|
||||
moderators: "モデレーター"
|
||||
users: "ユーザー"
|
||||
update: "更新"
|
||||
federation: "連合"
|
||||
announcements: "お知らせ"
|
||||
hashtags: "ハッシュタグ"
|
||||
back-to-misskey: "Misskeyに戻る"
|
||||
@ -1087,7 +1097,12 @@ admin/views/instance.vue:
|
||||
github-integration-info: "コールバックURLは /api/gh/cb に設定します。"
|
||||
enable-github-integration: "GitHub連携を有効にする"
|
||||
github-integration-client-id: "Client ID"
|
||||
github-integration-client-secret: "Client secret"
|
||||
github-integration-client-secret: "Client Secret"
|
||||
discord-integration-config: "Discord連携の設定"
|
||||
discord-integration-info: "コールバックURLは /api/dc/cb に設定します。"
|
||||
enable-discord-integration: "Discord連携を有効にする"
|
||||
discord-integration-client-id: "Client ID"
|
||||
discord-integration-client-secret: "Client Secret"
|
||||
proxy-account-config: "プロキシアカウントの設定"
|
||||
proxy-account-info: "プロキシアカウントは、特定の条件下でユーザーのリモートフォローを代行するアカウントです。例えば、ユーザーがリモートユーザーをリストに入れたとき、リストに入れられたユーザーを誰もフォローしていないとアクティビティがサーバーに配達されないため、代わりにプロキシアカウントがフォローするようにします。"
|
||||
proxy-account-username: "プロキシアカウントのユーザー名"
|
||||
@ -1140,6 +1155,12 @@ admin/views/users.vue:
|
||||
unverify: "公式アカウントを解除する"
|
||||
unverified: "公式アカウントを解除しました"
|
||||
|
||||
admin/views/moderators.vue:
|
||||
add-moderator:
|
||||
title: "モデレーターの登録"
|
||||
add: "登録"
|
||||
added: "モデレーターを登録しました"
|
||||
|
||||
admin/views/emoji.vue:
|
||||
add-emoji:
|
||||
title: "絵文字の登録"
|
||||
@ -1336,7 +1357,7 @@ mobile/views/components/media-video.vue:
|
||||
sensitive: "閲覧注意"
|
||||
click-to-show: "クリックして表示"
|
||||
|
||||
mobile/views/components/follow-button.vue:
|
||||
common/views/components/follow-button.vue:
|
||||
following: "フォロー中"
|
||||
follow: "フォロー"
|
||||
request-pending: "フォロー許可待ち"
|
||||
@ -1530,6 +1551,10 @@ mobile/views/pages/settings.vue:
|
||||
github-connect: "GitHubアカウントに接続する"
|
||||
github-reconnect: "再接続する"
|
||||
github-disconnect: "切断する"
|
||||
discord: "Discord連携"
|
||||
discord-connect: "Discordアカウントに接続する"
|
||||
discord-reconnect: "再接続する"
|
||||
discord-disconnect: "切断する"
|
||||
update: "Misskey Update"
|
||||
version: "バージョン:"
|
||||
latest-version: "最新のバージョン:"
|
||||
|
@ -344,6 +344,16 @@ common/views/components/poll-editor.vue:
|
||||
destroy: "アンケートをほかそ"
|
||||
common/views/components/reaction-picker.vue:
|
||||
choose-reaction: "リアクション、どれにするんや?"
|
||||
common/views/components/emoji-picker.vue:
|
||||
custom-emoji: "カスタム絵文字"
|
||||
people: "人"
|
||||
animals-and-nature: "動物&自然"
|
||||
food-and-drink: "食べ物&飲み物"
|
||||
activity: "アクティビティ"
|
||||
travel-and-places: "場所"
|
||||
objects: "物"
|
||||
symbols: "記号"
|
||||
flags: "旗"
|
||||
common/views/components/signin.vue:
|
||||
username: "ユーザー名"
|
||||
password: "パスワード"
|
||||
@ -353,6 +363,7 @@ common/views/components/signin.vue:
|
||||
or: "それか"
|
||||
signin-with-twitter: "Twitterでサインイン"
|
||||
signin-with-github: "GitHubでログイン"
|
||||
signin-with-discord: "Discordでログイン"
|
||||
login-failed: "なんかログインできんかったわ。ユーザー名とパスワードとかを確認してや。"
|
||||
common/views/components/signup.vue:
|
||||
invitation-code: "招待コード"
|
||||
@ -398,6 +409,13 @@ common/views/components/github-setting.vue:
|
||||
reconnect: "再接続する"
|
||||
connect: "GitHubと接続する"
|
||||
disconnect: "切断する"
|
||||
common/views/components/discord-setting.vue:
|
||||
description: "お使いのDiscordアカウントをお使いのMisskeyアカウントに接続しておくと、プロフィールでDiscordアカウント情報が表示されるようになったり、Discordを用いた便利なサインインを利用できるようになります。"
|
||||
connected-to: "次のDiscordアカウントに接続されています"
|
||||
detail: "詳細..."
|
||||
reconnect: "再接続する"
|
||||
connect: "Discordと接続する"
|
||||
disconnect: "切断する"
|
||||
common/views/components/uploader.vue:
|
||||
waiting: "待っとる"
|
||||
common/views/components/visibility-chooser.vue:
|
||||
@ -588,12 +606,6 @@ desktop/views/components/media-image.vue:
|
||||
desktop/views/components/media-video.vue:
|
||||
sensitive: "ちょっと見せられへんわ"
|
||||
click-to-show: "クリックして見せるで"
|
||||
desktop/views/components/follow-button.vue:
|
||||
following: "フォローしとる"
|
||||
follow: "フォロー"
|
||||
request-pending: "フォローの許し待っとる"
|
||||
follow-processing: "今フォロー処理やっとる‥"
|
||||
follow-request: "フォロー許してくれや!言うてみる"
|
||||
desktop/views/components/followers-window.vue:
|
||||
followers: "{} のフォロワー"
|
||||
desktop/views/components/followers.vue:
|
||||
@ -829,6 +841,10 @@ common/views/components/mute-and-block.vue:
|
||||
block: "ブロック"
|
||||
no-muted-users: "ミュートしとるユーザーはおらんで"
|
||||
no-blocked-users: "ブロックしとるユーザーはおらんで"
|
||||
word-mute: "ワードミュート"
|
||||
muted-words: "ミュートされたキーワード"
|
||||
muted-words-description: "スペースで区切るとAND指定になり、改行で区切るとOR指定になります"
|
||||
save: "保存"
|
||||
common/views/components/password-settings.vue:
|
||||
reset: "パスワード変える"
|
||||
enter-current-password: "今のパスワードを入れてや"
|
||||
@ -903,6 +919,7 @@ admin/views/index.vue:
|
||||
dashboard: "ダッシュボード"
|
||||
instance: "インスタンス"
|
||||
emoji: "カスタム絵文字"
|
||||
moderators: "モデレーター"
|
||||
users: "ユーザー"
|
||||
update: "更新"
|
||||
announcements: "知っといてや"
|
||||
@ -947,7 +964,12 @@ admin/views/instance.vue:
|
||||
github-integration-info: "コールバックURLは /api/gh/cb に設定します。"
|
||||
enable-github-integration: "GitHub連携を有効にする"
|
||||
github-integration-client-id: "Client ID"
|
||||
github-integration-client-secret: "Client secret"
|
||||
github-integration-client-secret: "Client Secret"
|
||||
discord-integration-config: "Discord連携の設定"
|
||||
discord-integration-info: "コールバックURLは /api/dc/cb に設定します。"
|
||||
enable-discord-integration: "Discord連携を有効にする"
|
||||
discord-integration-client-id: "Client ID"
|
||||
discord-integration-client-secret: "Client Secret"
|
||||
proxy-account-config: "プロキシアカウントの設定"
|
||||
proxy-account-info: "プロキシアカウントは、特定の条件下でユーザーのリモートフォローを代行するアカウントです。例えば、ユーザーがリモートユーザーをリストに入れたとき、リストに入れられたユーザーを誰もフォローしていないとアクティビティがサーバーに配達されないため、代わりにプロキシアカウントがフォローするようにします。"
|
||||
proxy-account-username: "プロキシアカウントのユーザー名"
|
||||
@ -997,6 +1019,11 @@ admin/views/users.vue:
|
||||
unverify-user: "ユーザーの公式アカウント解除"
|
||||
unverify: "公式アカウントを解除する"
|
||||
unverified: "公式アカウントを解除しました"
|
||||
admin/views/moderators.vue:
|
||||
add-moderator:
|
||||
title: "モデレーターの登録"
|
||||
add: "登録"
|
||||
added: "モデレーターを登録しました"
|
||||
admin/views/emoji.vue:
|
||||
add-emoji:
|
||||
title: "絵文字の登録"
|
||||
@ -1161,12 +1188,12 @@ mobile/views/components/media-image.vue:
|
||||
mobile/views/components/media-video.vue:
|
||||
sensitive: "ちょっと見せられへんわ"
|
||||
click-to-show: "押してみ、見せたるわ"
|
||||
mobile/views/components/follow-button.vue:
|
||||
following: "フォローしとる"
|
||||
common/views/components/follow-button.vue:
|
||||
following: "フォロー中"
|
||||
follow: "フォロー"
|
||||
request-pending: "フォローの許し待っとる"
|
||||
follow-processing: "今フォロー処理やっとる‥"
|
||||
follow-request: "フォロー許してくれや!言うてみる"
|
||||
request-pending: "フォロー許可待ち"
|
||||
follow-processing: "フォロー処理中"
|
||||
follow-request: "フォロー申請"
|
||||
mobile/views/components/friends-maker.vue:
|
||||
title: "おもろそうやな"
|
||||
empty: "おすすめのユーザーはおらん。"
|
||||
@ -1324,6 +1351,10 @@ mobile/views/pages/settings.vue:
|
||||
github-connect: "GitHubアカウントに接続する"
|
||||
github-reconnect: "再接続する"
|
||||
github-disconnect: "切断する"
|
||||
discord: "Discord連携"
|
||||
discord-connect: "Discordアカウントに接続する"
|
||||
discord-reconnect: "再接続する"
|
||||
discord-disconnect: "切断する"
|
||||
update: "あんたのMisskeyいつのや?"
|
||||
version: "バージョン:"
|
||||
latest-version: "いっちゃん新しいやつ:"
|
||||
|
@ -344,6 +344,16 @@ common/views/components/poll-editor.vue:
|
||||
destroy: "アンケートを破棄"
|
||||
common/views/components/reaction-picker.vue:
|
||||
choose-reaction: "リアクションを選択"
|
||||
common/views/components/emoji-picker.vue:
|
||||
custom-emoji: "カスタム絵文字"
|
||||
people: "人"
|
||||
animals-and-nature: "動物&自然"
|
||||
food-and-drink: "食べ物&飲み物"
|
||||
activity: "アクティビティ"
|
||||
travel-and-places: "場所"
|
||||
objects: "物"
|
||||
symbols: "記号"
|
||||
flags: "旗"
|
||||
common/views/components/signin.vue:
|
||||
username: "ユーザー名"
|
||||
password: "パスワード"
|
||||
@ -353,6 +363,7 @@ common/views/components/signin.vue:
|
||||
or: "または"
|
||||
signin-with-twitter: "Twitterでログイン"
|
||||
signin-with-github: "GitHubでログイン"
|
||||
signin-with-discord: "Discordでログイン"
|
||||
login-failed: "ログインできませんでした。ユーザー名とパスワードを確認してください。"
|
||||
common/views/components/signup.vue:
|
||||
invitation-code: "招待コード"
|
||||
@ -398,6 +409,13 @@ common/views/components/github-setting.vue:
|
||||
reconnect: "再接続する"
|
||||
connect: "GitHubと接続する"
|
||||
disconnect: "切断する"
|
||||
common/views/components/discord-setting.vue:
|
||||
description: "お使いのDiscordアカウントをお使いのMisskeyアカウントに接続しておくと、プロフィールでDiscordアカウント情報が表示されるようになったり、Discordを用いた便利なサインインを利用できるようになります。"
|
||||
connected-to: "次のDiscordアカウントに接続されています"
|
||||
detail: "詳細..."
|
||||
reconnect: "再接続する"
|
||||
connect: "Discordと接続する"
|
||||
disconnect: "切断する"
|
||||
common/views/components/uploader.vue:
|
||||
waiting: "待機中"
|
||||
common/views/components/visibility-chooser.vue:
|
||||
@ -588,12 +606,6 @@ desktop/views/components/media-image.vue:
|
||||
desktop/views/components/media-video.vue:
|
||||
sensitive: "閲覧注意"
|
||||
click-to-show: "クリックして表示"
|
||||
desktop/views/components/follow-button.vue:
|
||||
following: "フォロー中"
|
||||
follow: "フォロー"
|
||||
request-pending: "フォロー許可待ち"
|
||||
follow-processing: "フォロー処理中"
|
||||
follow-request: "フォロー申請"
|
||||
desktop/views/components/followers-window.vue:
|
||||
followers: "{} のフォロワー"
|
||||
desktop/views/components/followers.vue:
|
||||
@ -829,6 +841,10 @@ common/views/components/mute-and-block.vue:
|
||||
block: "ブロック"
|
||||
no-muted-users: "ミュートしているユーザーはいません"
|
||||
no-blocked-users: "ブロックしているユーザーはいません"
|
||||
word-mute: "ワードミュート"
|
||||
muted-words: "ミュートされたキーワード"
|
||||
muted-words-description: "スペースで区切るとAND指定になり、改行で区切るとOR指定になります"
|
||||
save: "保存"
|
||||
common/views/components/password-settings.vue:
|
||||
reset: "パスワードを変更する"
|
||||
enter-current-password: "現在のパスワードを入力してください"
|
||||
@ -903,6 +919,7 @@ admin/views/index.vue:
|
||||
dashboard: "ダッシュボード"
|
||||
instance: "インスタンス"
|
||||
emoji: "カスタム絵文字"
|
||||
moderators: "モデレーター"
|
||||
users: "ユーザー"
|
||||
update: "更新"
|
||||
announcements: "お知らせ"
|
||||
@ -947,7 +964,12 @@ admin/views/instance.vue:
|
||||
github-integration-info: "コールバックURLは /api/gh/cb に設定します。"
|
||||
enable-github-integration: "GitHub連携を有効にする"
|
||||
github-integration-client-id: "Client ID"
|
||||
github-integration-client-secret: "Client secret"
|
||||
github-integration-client-secret: "Client Secret"
|
||||
discord-integration-config: "Discord連携の設定"
|
||||
discord-integration-info: "コールバックURLは /api/dc/cb に設定します。"
|
||||
enable-discord-integration: "Discord連携を有効にする"
|
||||
discord-integration-client-id: "Client ID"
|
||||
discord-integration-client-secret: "Client Secret"
|
||||
proxy-account-config: "プロキシアカウントの設定"
|
||||
proxy-account-info: "プロキシアカウントは、特定の条件下でユーザーのリモートフォローを代行するアカウントです。例えば、ユーザーがリモートユーザーをリストに入れたとき、リストに入れられたユーザーを誰もフォローしていないとアクティビティがサーバーに配達されないため、代わりにプロキシアカウントがフォローするようにします。"
|
||||
proxy-account-username: "プロキシアカウントのユーザー名"
|
||||
@ -997,6 +1019,11 @@ admin/views/users.vue:
|
||||
unverify-user: "ユーザーの公式アカウント解除"
|
||||
unverify: "公式アカウントを解除する"
|
||||
unverified: "公式アカウントを解除しました"
|
||||
admin/views/moderators.vue:
|
||||
add-moderator:
|
||||
title: "モデレーターの登録"
|
||||
add: "登録"
|
||||
added: "モデレーターを登録しました"
|
||||
admin/views/emoji.vue:
|
||||
add-emoji:
|
||||
title: "絵文字の登録"
|
||||
@ -1161,7 +1188,7 @@ mobile/views/components/media-image.vue:
|
||||
mobile/views/components/media-video.vue:
|
||||
sensitive: "閲覧注意"
|
||||
click-to-show: "クリックして表示"
|
||||
mobile/views/components/follow-button.vue:
|
||||
common/views/components/follow-button.vue:
|
||||
following: "フォロー中"
|
||||
follow: "フォロー"
|
||||
request-pending: "フォロー許可待ち"
|
||||
@ -1324,6 +1351,10 @@ mobile/views/pages/settings.vue:
|
||||
github-connect: "GitHubアカウントに接続する"
|
||||
github-reconnect: "再接続する"
|
||||
github-disconnect: "切断する"
|
||||
discord: "Discord連携"
|
||||
discord-connect: "Discordアカウントに接続する"
|
||||
discord-reconnect: "再接続する"
|
||||
discord-disconnect: "切断する"
|
||||
update: "Misskey Update"
|
||||
version: "バージョン:"
|
||||
latest-version: "最新のバージョン:"
|
||||
|
@ -344,6 +344,16 @@ common/views/components/poll-editor.vue:
|
||||
destroy: "Deze peiling vernietigen"
|
||||
common/views/components/reaction-picker.vue:
|
||||
choose-reaction: "Kies een reactie"
|
||||
common/views/components/emoji-picker.vue:
|
||||
custom-emoji: "カスタム絵文字"
|
||||
people: "人"
|
||||
animals-and-nature: "動物&自然"
|
||||
food-and-drink: "食べ物&飲み物"
|
||||
activity: "アクティビティ"
|
||||
travel-and-places: "場所"
|
||||
objects: "物"
|
||||
symbols: "記号"
|
||||
flags: "旗"
|
||||
common/views/components/signin.vue:
|
||||
username: "Gebruikersnaam"
|
||||
password: "Wachtwoord"
|
||||
@ -353,6 +363,7 @@ common/views/components/signin.vue:
|
||||
or: "または"
|
||||
signin-with-twitter: "Twitterでログイン"
|
||||
signin-with-github: "GitHubでログイン"
|
||||
signin-with-discord: "Discordでログイン"
|
||||
login-failed: "ログインできませんでした。ユーザー名とパスワードを確認してください。"
|
||||
common/views/components/signup.vue:
|
||||
invitation-code: "招待コード"
|
||||
@ -398,6 +409,13 @@ common/views/components/github-setting.vue:
|
||||
reconnect: "再接続する"
|
||||
connect: "GitHubと接続する"
|
||||
disconnect: "切断する"
|
||||
common/views/components/discord-setting.vue:
|
||||
description: "お使いのDiscordアカウントをお使いのMisskeyアカウントに接続しておくと、プロフィールでDiscordアカウント情報が表示されるようになったり、Discordを用いた便利なサインインを利用できるようになります。"
|
||||
connected-to: "次のDiscordアカウントに接続されています"
|
||||
detail: "詳細..."
|
||||
reconnect: "再接続する"
|
||||
connect: "Discordと接続する"
|
||||
disconnect: "切断する"
|
||||
common/views/components/uploader.vue:
|
||||
waiting: "Bezig met wachten"
|
||||
common/views/components/visibility-chooser.vue:
|
||||
@ -588,12 +606,6 @@ desktop/views/components/media-image.vue:
|
||||
desktop/views/components/media-video.vue:
|
||||
sensitive: "閲覧注意"
|
||||
click-to-show: "クリックして表示"
|
||||
desktop/views/components/follow-button.vue:
|
||||
following: "フォロー中"
|
||||
follow: "Volgen"
|
||||
request-pending: "フォロー許可待ち"
|
||||
follow-processing: "フォロー処理中"
|
||||
follow-request: "フォロー申請"
|
||||
desktop/views/components/followers-window.vue:
|
||||
followers: "Volgers van {}"
|
||||
desktop/views/components/followers.vue:
|
||||
@ -829,6 +841,10 @@ common/views/components/mute-and-block.vue:
|
||||
block: "ブロック"
|
||||
no-muted-users: "ミュートしているユーザーはいません"
|
||||
no-blocked-users: "ブロックしているユーザーはいません"
|
||||
word-mute: "ワードミュート"
|
||||
muted-words: "ミュートされたキーワード"
|
||||
muted-words-description: "スペースで区切るとAND指定になり、改行で区切るとOR指定になります"
|
||||
save: "保存"
|
||||
common/views/components/password-settings.vue:
|
||||
reset: "パスワードを変更する"
|
||||
enter-current-password: "現在のパスワードを入力してください"
|
||||
@ -903,6 +919,7 @@ admin/views/index.vue:
|
||||
dashboard: "ダッシュボード"
|
||||
instance: "インスタンス"
|
||||
emoji: "カスタム絵文字"
|
||||
moderators: "モデレーター"
|
||||
users: "ユーザー"
|
||||
update: "更新"
|
||||
announcements: "お知らせ"
|
||||
@ -947,7 +964,12 @@ admin/views/instance.vue:
|
||||
github-integration-info: "コールバックURLは /api/gh/cb に設定します。"
|
||||
enable-github-integration: "GitHub連携を有効にする"
|
||||
github-integration-client-id: "Client ID"
|
||||
github-integration-client-secret: "Client secret"
|
||||
github-integration-client-secret: "Client Secret"
|
||||
discord-integration-config: "Discord連携の設定"
|
||||
discord-integration-info: "コールバックURLは /api/dc/cb に設定します。"
|
||||
enable-discord-integration: "Discord連携を有効にする"
|
||||
discord-integration-client-id: "Client ID"
|
||||
discord-integration-client-secret: "Client Secret"
|
||||
proxy-account-config: "プロキシアカウントの設定"
|
||||
proxy-account-info: "プロキシアカウントは、特定の条件下でユーザーのリモートフォローを代行するアカウントです。例えば、ユーザーがリモートユーザーをリストに入れたとき、リストに入れられたユーザーを誰もフォローしていないとアクティビティがサーバーに配達されないため、代わりにプロキシアカウントがフォローするようにします。"
|
||||
proxy-account-username: "プロキシアカウントのユーザー名"
|
||||
@ -997,6 +1019,11 @@ admin/views/users.vue:
|
||||
unverify-user: "ユーザーの公式アカウント解除"
|
||||
unverify: "公式アカウントを解除する"
|
||||
unverified: "公式アカウントを解除しました"
|
||||
admin/views/moderators.vue:
|
||||
add-moderator:
|
||||
title: "モデレーターの登録"
|
||||
add: "登録"
|
||||
added: "モデレーターを登録しました"
|
||||
admin/views/emoji.vue:
|
||||
add-emoji:
|
||||
title: "絵文字の登録"
|
||||
@ -1161,9 +1188,9 @@ mobile/views/components/media-image.vue:
|
||||
mobile/views/components/media-video.vue:
|
||||
sensitive: "閲覧注意"
|
||||
click-to-show: "クリックして表示"
|
||||
mobile/views/components/follow-button.vue:
|
||||
common/views/components/follow-button.vue:
|
||||
following: "フォロー中"
|
||||
follow: "Volgen"
|
||||
follow: "フォロー"
|
||||
request-pending: "フォロー許可待ち"
|
||||
follow-processing: "フォロー処理中"
|
||||
follow-request: "フォロー申請"
|
||||
@ -1324,6 +1351,10 @@ mobile/views/pages/settings.vue:
|
||||
github-connect: "GitHubアカウントに接続する"
|
||||
github-reconnect: "再接続する"
|
||||
github-disconnect: "切断する"
|
||||
discord: "Discord連携"
|
||||
discord-connect: "Discordアカウントに接続する"
|
||||
discord-reconnect: "再接続する"
|
||||
discord-disconnect: "切断する"
|
||||
update: "Misskey-update"
|
||||
version: "Huidige versie:"
|
||||
latest-version: "Nieuwste versie:"
|
||||
|
@ -344,6 +344,16 @@ common/views/components/poll-editor.vue:
|
||||
destroy: "アンケートを破棄"
|
||||
common/views/components/reaction-picker.vue:
|
||||
choose-reaction: "リアクションを選択"
|
||||
common/views/components/emoji-picker.vue:
|
||||
custom-emoji: "カスタム絵文字"
|
||||
people: "人"
|
||||
animals-and-nature: "動物&自然"
|
||||
food-and-drink: "食べ物&飲み物"
|
||||
activity: "アクティビティ"
|
||||
travel-and-places: "場所"
|
||||
objects: "物"
|
||||
symbols: "記号"
|
||||
flags: "旗"
|
||||
common/views/components/signin.vue:
|
||||
username: "Brukernavn"
|
||||
password: "Passord"
|
||||
@ -353,6 +363,7 @@ common/views/components/signin.vue:
|
||||
or: "Eller"
|
||||
signin-with-twitter: "Twitterでログイン"
|
||||
signin-with-github: "GitHubでログイン"
|
||||
signin-with-discord: "Discordでログイン"
|
||||
login-failed: "ログインできませんでした。ユーザー名とパスワードを確認してください。"
|
||||
common/views/components/signup.vue:
|
||||
invitation-code: "招待コード"
|
||||
@ -398,6 +409,13 @@ common/views/components/github-setting.vue:
|
||||
reconnect: "再接続する"
|
||||
connect: "GitHubと接続する"
|
||||
disconnect: "切断する"
|
||||
common/views/components/discord-setting.vue:
|
||||
description: "お使いのDiscordアカウントをお使いのMisskeyアカウントに接続しておくと、プロフィールでDiscordアカウント情報が表示されるようになったり、Discordを用いた便利なサインインを利用できるようになります。"
|
||||
connected-to: "次のDiscordアカウントに接続されています"
|
||||
detail: "詳細..."
|
||||
reconnect: "再接続する"
|
||||
connect: "Discordと接続する"
|
||||
disconnect: "切断する"
|
||||
common/views/components/uploader.vue:
|
||||
waiting: "Venter"
|
||||
common/views/components/visibility-chooser.vue:
|
||||
@ -588,12 +606,6 @@ desktop/views/components/media-image.vue:
|
||||
desktop/views/components/media-video.vue:
|
||||
sensitive: "Innholdet er NSFW"
|
||||
click-to-show: "クリックして表示"
|
||||
desktop/views/components/follow-button.vue:
|
||||
following: "Følger"
|
||||
follow: "Følg"
|
||||
request-pending: "フォロー許可待ち"
|
||||
follow-processing: "フォロー処理中"
|
||||
follow-request: "フォロー申請"
|
||||
desktop/views/components/followers-window.vue:
|
||||
followers: "{} のフォロワー"
|
||||
desktop/views/components/followers.vue:
|
||||
@ -829,6 +841,10 @@ common/views/components/mute-and-block.vue:
|
||||
block: "ブロック"
|
||||
no-muted-users: "ミュートしているユーザーはいません"
|
||||
no-blocked-users: "ブロックしているユーザーはいません"
|
||||
word-mute: "ワードミュート"
|
||||
muted-words: "ミュートされたキーワード"
|
||||
muted-words-description: "スペースで区切るとAND指定になり、改行で区切るとOR指定になります"
|
||||
save: "保存"
|
||||
common/views/components/password-settings.vue:
|
||||
reset: "パスワードを変更する"
|
||||
enter-current-password: "現在のパスワードを入力してください"
|
||||
@ -903,6 +919,7 @@ admin/views/index.vue:
|
||||
dashboard: "ダッシュボード"
|
||||
instance: "インスタンス"
|
||||
emoji: "カスタム絵文字"
|
||||
moderators: "モデレーター"
|
||||
users: "ユーザー"
|
||||
update: "更新"
|
||||
announcements: "お知らせ"
|
||||
@ -947,7 +964,12 @@ admin/views/instance.vue:
|
||||
github-integration-info: "コールバックURLは /api/gh/cb に設定します。"
|
||||
enable-github-integration: "GitHub連携を有効にする"
|
||||
github-integration-client-id: "Client ID"
|
||||
github-integration-client-secret: "Client secret"
|
||||
github-integration-client-secret: "Client Secret"
|
||||
discord-integration-config: "Discord連携の設定"
|
||||
discord-integration-info: "コールバックURLは /api/dc/cb に設定します。"
|
||||
enable-discord-integration: "Discord連携を有効にする"
|
||||
discord-integration-client-id: "Client ID"
|
||||
discord-integration-client-secret: "Client Secret"
|
||||
proxy-account-config: "プロキシアカウントの設定"
|
||||
proxy-account-info: "プロキシアカウントは、特定の条件下でユーザーのリモートフォローを代行するアカウントです。例えば、ユーザーがリモートユーザーをリストに入れたとき、リストに入れられたユーザーを誰もフォローしていないとアクティビティがサーバーに配達されないため、代わりにプロキシアカウントがフォローするようにします。"
|
||||
proxy-account-username: "プロキシアカウントのユーザー名"
|
||||
@ -997,6 +1019,11 @@ admin/views/users.vue:
|
||||
unverify-user: "ユーザーの公式アカウント解除"
|
||||
unverify: "公式アカウントを解除する"
|
||||
unverified: "公式アカウントを解除しました"
|
||||
admin/views/moderators.vue:
|
||||
add-moderator:
|
||||
title: "モデレーターの登録"
|
||||
add: "登録"
|
||||
added: "モデレーターを登録しました"
|
||||
admin/views/emoji.vue:
|
||||
add-emoji:
|
||||
title: "絵文字の登録"
|
||||
@ -1161,9 +1188,9 @@ mobile/views/components/media-image.vue:
|
||||
mobile/views/components/media-video.vue:
|
||||
sensitive: "Innholdet er NSFW"
|
||||
click-to-show: "クリックして表示"
|
||||
mobile/views/components/follow-button.vue:
|
||||
following: "Følger"
|
||||
follow: "Følg"
|
||||
common/views/components/follow-button.vue:
|
||||
following: "フォロー中"
|
||||
follow: "フォロー"
|
||||
request-pending: "フォロー許可待ち"
|
||||
follow-processing: "フォロー処理中"
|
||||
follow-request: "フォロー申請"
|
||||
@ -1324,6 +1351,10 @@ mobile/views/pages/settings.vue:
|
||||
github-connect: "GitHubアカウントに接続する"
|
||||
github-reconnect: "再接続する"
|
||||
github-disconnect: "切断する"
|
||||
discord: "Discord連携"
|
||||
discord-connect: "Discordアカウントに接続する"
|
||||
discord-reconnect: "再接続する"
|
||||
discord-disconnect: "切断する"
|
||||
update: "Misskey Update"
|
||||
version: "バージョン:"
|
||||
latest-version: "最新のバージョン:"
|
||||
|
@ -344,6 +344,16 @@ common/views/components/poll-editor.vue:
|
||||
destroy: "Usuń tę ankietę"
|
||||
common/views/components/reaction-picker.vue:
|
||||
choose-reaction: "Wybierz reakcję"
|
||||
common/views/components/emoji-picker.vue:
|
||||
custom-emoji: "カスタム絵文字"
|
||||
people: "人"
|
||||
animals-and-nature: "動物&自然"
|
||||
food-and-drink: "食べ物&飲み物"
|
||||
activity: "アクティビティ"
|
||||
travel-and-places: "場所"
|
||||
objects: "物"
|
||||
symbols: "記号"
|
||||
flags: "旗"
|
||||
common/views/components/signin.vue:
|
||||
username: "Nazwa użytkownika"
|
||||
password: "Hasło"
|
||||
@ -353,6 +363,7 @@ common/views/components/signin.vue:
|
||||
or: "または"
|
||||
signin-with-twitter: "Zaloguj się za pomocą Twittera"
|
||||
signin-with-github: "GitHubでログイン"
|
||||
signin-with-discord: "Discordでログイン"
|
||||
login-failed: "ログインできませんでした。ユーザー名とパスワードを確認してください。"
|
||||
common/views/components/signup.vue:
|
||||
invitation-code: "招待コード"
|
||||
@ -398,6 +409,13 @@ common/views/components/github-setting.vue:
|
||||
reconnect: "再接続する"
|
||||
connect: "GitHubと接続する"
|
||||
disconnect: "切断する"
|
||||
common/views/components/discord-setting.vue:
|
||||
description: "お使いのDiscordアカウントをお使いのMisskeyアカウントに接続しておくと、プロフィールでDiscordアカウント情報が表示されるようになったり、Discordを用いた便利なサインインを利用できるようになります。"
|
||||
connected-to: "次のDiscordアカウントに接続されています"
|
||||
detail: "詳細..."
|
||||
reconnect: "再接続する"
|
||||
connect: "Discordと接続する"
|
||||
disconnect: "切断する"
|
||||
common/views/components/uploader.vue:
|
||||
waiting: "Oczekiwanie"
|
||||
common/views/components/visibility-chooser.vue:
|
||||
@ -588,12 +606,6 @@ desktop/views/components/media-image.vue:
|
||||
desktop/views/components/media-video.vue:
|
||||
sensitive: "To jest zawartość NSFW"
|
||||
click-to-show: "Naciśnij aby wyświetlić"
|
||||
desktop/views/components/follow-button.vue:
|
||||
following: "Śledzisz"
|
||||
follow: "Śledź"
|
||||
request-pending: "Oczekiwanie na pozwolenie"
|
||||
follow-processing: "フォロー処理中"
|
||||
follow-request: "Poproś o śledzenie"
|
||||
desktop/views/components/followers-window.vue:
|
||||
followers: "Śledzący"
|
||||
desktop/views/components/followers.vue:
|
||||
@ -829,6 +841,10 @@ common/views/components/mute-and-block.vue:
|
||||
block: "ブロック"
|
||||
no-muted-users: "ミュートしているユーザーはいません"
|
||||
no-blocked-users: "ブロックしているユーザーはいません"
|
||||
word-mute: "ワードミュート"
|
||||
muted-words: "ミュートされたキーワード"
|
||||
muted-words-description: "スペースで区切るとAND指定になり、改行で区切るとOR指定になります"
|
||||
save: "保存"
|
||||
common/views/components/password-settings.vue:
|
||||
reset: "パスワードを変更する"
|
||||
enter-current-password: "現在のパスワードを入力してください"
|
||||
@ -903,6 +919,7 @@ admin/views/index.vue:
|
||||
dashboard: "ダッシュボード"
|
||||
instance: "インスタンス"
|
||||
emoji: "カスタム絵文字"
|
||||
moderators: "モデレーター"
|
||||
users: "ユーザー"
|
||||
update: "更新"
|
||||
announcements: "お知らせ"
|
||||
@ -947,7 +964,12 @@ admin/views/instance.vue:
|
||||
github-integration-info: "コールバックURLは /api/gh/cb に設定します。"
|
||||
enable-github-integration: "GitHub連携を有効にする"
|
||||
github-integration-client-id: "Client ID"
|
||||
github-integration-client-secret: "Client secret"
|
||||
github-integration-client-secret: "Client Secret"
|
||||
discord-integration-config: "Discord連携の設定"
|
||||
discord-integration-info: "コールバックURLは /api/dc/cb に設定します。"
|
||||
enable-discord-integration: "Discord連携を有効にする"
|
||||
discord-integration-client-id: "Client ID"
|
||||
discord-integration-client-secret: "Client Secret"
|
||||
proxy-account-config: "プロキシアカウントの設定"
|
||||
proxy-account-info: "プロキシアカウントは、特定の条件下でユーザーのリモートフォローを代行するアカウントです。例えば、ユーザーがリモートユーザーをリストに入れたとき、リストに入れられたユーザーを誰もフォローしていないとアクティビティがサーバーに配達されないため、代わりにプロキシアカウントがフォローするようにします。"
|
||||
proxy-account-username: "プロキシアカウントのユーザー名"
|
||||
@ -997,6 +1019,11 @@ admin/views/users.vue:
|
||||
unverify-user: "ユーザーの公式アカウント解除"
|
||||
unverify: "公式アカウントを解除する"
|
||||
unverified: "公式アカウントを解除しました"
|
||||
admin/views/moderators.vue:
|
||||
add-moderator:
|
||||
title: "モデレーターの登録"
|
||||
add: "登録"
|
||||
added: "モデレーターを登録しました"
|
||||
admin/views/emoji.vue:
|
||||
add-emoji:
|
||||
title: "絵文字の登録"
|
||||
@ -1161,12 +1188,12 @@ mobile/views/components/media-image.vue:
|
||||
mobile/views/components/media-video.vue:
|
||||
sensitive: "To jest zawartość NSFW"
|
||||
click-to-show: "Naciśnij aby wyświetlić"
|
||||
mobile/views/components/follow-button.vue:
|
||||
following: "Śledzisz"
|
||||
follow: "Śledź"
|
||||
request-pending: "Oczekiwanie na pozwolenie"
|
||||
common/views/components/follow-button.vue:
|
||||
following: "フォロー中"
|
||||
follow: "フォロー"
|
||||
request-pending: "フォロー許可待ち"
|
||||
follow-processing: "フォロー処理中"
|
||||
follow-request: "Poproś o śledzenie"
|
||||
follow-request: "フォロー申請"
|
||||
mobile/views/components/friends-maker.vue:
|
||||
title: "Zacznij śledzić ludzi takich jak Ty"
|
||||
empty: "Nie znaleziono podobnych użytkowników."
|
||||
@ -1324,6 +1351,10 @@ mobile/views/pages/settings.vue:
|
||||
github-connect: "GitHubアカウントに接続する"
|
||||
github-reconnect: "再接続する"
|
||||
github-disconnect: "切断する"
|
||||
discord: "Discord連携"
|
||||
discord-connect: "Discordアカウントに接続する"
|
||||
discord-reconnect: "再接続する"
|
||||
discord-disconnect: "切断する"
|
||||
update: "Aktualizacja Misskey"
|
||||
version: "Wersja:"
|
||||
latest-version: "Najnowsza wersja:"
|
||||
|
@ -344,6 +344,16 @@ common/views/components/poll-editor.vue:
|
||||
destroy: "アンケートを破棄"
|
||||
common/views/components/reaction-picker.vue:
|
||||
choose-reaction: "リアクションを選択"
|
||||
common/views/components/emoji-picker.vue:
|
||||
custom-emoji: "カスタム絵文字"
|
||||
people: "人"
|
||||
animals-and-nature: "動物&自然"
|
||||
food-and-drink: "食べ物&飲み物"
|
||||
activity: "アクティビティ"
|
||||
travel-and-places: "場所"
|
||||
objects: "物"
|
||||
symbols: "記号"
|
||||
flags: "旗"
|
||||
common/views/components/signin.vue:
|
||||
username: "ユーザー名"
|
||||
password: "パスワード"
|
||||
@ -353,6 +363,7 @@ common/views/components/signin.vue:
|
||||
or: "または"
|
||||
signin-with-twitter: "Twitterでログイン"
|
||||
signin-with-github: "GitHubでログイン"
|
||||
signin-with-discord: "Discordでログイン"
|
||||
login-failed: "ログインできませんでした。ユーザー名とパスワードを確認してください。"
|
||||
common/views/components/signup.vue:
|
||||
invitation-code: "招待コード"
|
||||
@ -398,6 +409,13 @@ common/views/components/github-setting.vue:
|
||||
reconnect: "再接続する"
|
||||
connect: "GitHubと接続する"
|
||||
disconnect: "切断する"
|
||||
common/views/components/discord-setting.vue:
|
||||
description: "お使いのDiscordアカウントをお使いのMisskeyアカウントに接続しておくと、プロフィールでDiscordアカウント情報が表示されるようになったり、Discordを用いた便利なサインインを利用できるようになります。"
|
||||
connected-to: "次のDiscordアカウントに接続されています"
|
||||
detail: "詳細..."
|
||||
reconnect: "再接続する"
|
||||
connect: "Discordと接続する"
|
||||
disconnect: "切断する"
|
||||
common/views/components/uploader.vue:
|
||||
waiting: "待機中"
|
||||
common/views/components/visibility-chooser.vue:
|
||||
@ -588,12 +606,6 @@ desktop/views/components/media-image.vue:
|
||||
desktop/views/components/media-video.vue:
|
||||
sensitive: "閲覧注意"
|
||||
click-to-show: "クリックして表示"
|
||||
desktop/views/components/follow-button.vue:
|
||||
following: "フォロー中"
|
||||
follow: "フォロー"
|
||||
request-pending: "フォロー許可待ち"
|
||||
follow-processing: "フォロー処理中"
|
||||
follow-request: "フォロー申請"
|
||||
desktop/views/components/followers-window.vue:
|
||||
followers: "{} のフォロワー"
|
||||
desktop/views/components/followers.vue:
|
||||
@ -829,6 +841,10 @@ common/views/components/mute-and-block.vue:
|
||||
block: "ブロック"
|
||||
no-muted-users: "ミュートしているユーザーはいません"
|
||||
no-blocked-users: "ブロックしているユーザーはいません"
|
||||
word-mute: "ワードミュート"
|
||||
muted-words: "ミュートされたキーワード"
|
||||
muted-words-description: "スペースで区切るとAND指定になり、改行で区切るとOR指定になります"
|
||||
save: "保存"
|
||||
common/views/components/password-settings.vue:
|
||||
reset: "パスワードを変更する"
|
||||
enter-current-password: "現在のパスワードを入力してください"
|
||||
@ -903,6 +919,7 @@ admin/views/index.vue:
|
||||
dashboard: "ダッシュボード"
|
||||
instance: "インスタンス"
|
||||
emoji: "カスタム絵文字"
|
||||
moderators: "モデレーター"
|
||||
users: "ユーザー"
|
||||
update: "更新"
|
||||
announcements: "お知らせ"
|
||||
@ -947,7 +964,12 @@ admin/views/instance.vue:
|
||||
github-integration-info: "コールバックURLは /api/gh/cb に設定します。"
|
||||
enable-github-integration: "GitHub連携を有効にする"
|
||||
github-integration-client-id: "Client ID"
|
||||
github-integration-client-secret: "Client secret"
|
||||
github-integration-client-secret: "Client Secret"
|
||||
discord-integration-config: "Discord連携の設定"
|
||||
discord-integration-info: "コールバックURLは /api/dc/cb に設定します。"
|
||||
enable-discord-integration: "Discord連携を有効にする"
|
||||
discord-integration-client-id: "Client ID"
|
||||
discord-integration-client-secret: "Client Secret"
|
||||
proxy-account-config: "プロキシアカウントの設定"
|
||||
proxy-account-info: "プロキシアカウントは、特定の条件下でユーザーのリモートフォローを代行するアカウントです。例えば、ユーザーがリモートユーザーをリストに入れたとき、リストに入れられたユーザーを誰もフォローしていないとアクティビティがサーバーに配達されないため、代わりにプロキシアカウントがフォローするようにします。"
|
||||
proxy-account-username: "プロキシアカウントのユーザー名"
|
||||
@ -997,6 +1019,11 @@ admin/views/users.vue:
|
||||
unverify-user: "ユーザーの公式アカウント解除"
|
||||
unverify: "公式アカウントを解除する"
|
||||
unverified: "公式アカウントを解除しました"
|
||||
admin/views/moderators.vue:
|
||||
add-moderator:
|
||||
title: "モデレーターの登録"
|
||||
add: "登録"
|
||||
added: "モデレーターを登録しました"
|
||||
admin/views/emoji.vue:
|
||||
add-emoji:
|
||||
title: "絵文字の登録"
|
||||
@ -1161,7 +1188,7 @@ mobile/views/components/media-image.vue:
|
||||
mobile/views/components/media-video.vue:
|
||||
sensitive: "閲覧注意"
|
||||
click-to-show: "クリックして表示"
|
||||
mobile/views/components/follow-button.vue:
|
||||
common/views/components/follow-button.vue:
|
||||
following: "フォロー中"
|
||||
follow: "フォロー"
|
||||
request-pending: "フォロー許可待ち"
|
||||
@ -1324,6 +1351,10 @@ mobile/views/pages/settings.vue:
|
||||
github-connect: "GitHubアカウントに接続する"
|
||||
github-reconnect: "再接続する"
|
||||
github-disconnect: "切断する"
|
||||
discord: "Discord連携"
|
||||
discord-connect: "Discordアカウントに接続する"
|
||||
discord-reconnect: "再接続する"
|
||||
discord-disconnect: "切断する"
|
||||
update: "Atualizar Misskey"
|
||||
version: "Versão atual;"
|
||||
latest-version: "Última versão:"
|
||||
|
@ -344,6 +344,16 @@ common/views/components/poll-editor.vue:
|
||||
destroy: "アンケートを破棄"
|
||||
common/views/components/reaction-picker.vue:
|
||||
choose-reaction: "リアクションを選択"
|
||||
common/views/components/emoji-picker.vue:
|
||||
custom-emoji: "カスタム絵文字"
|
||||
people: "人"
|
||||
animals-and-nature: "動物&自然"
|
||||
food-and-drink: "食べ物&飲み物"
|
||||
activity: "アクティビティ"
|
||||
travel-and-places: "場所"
|
||||
objects: "物"
|
||||
symbols: "記号"
|
||||
flags: "旗"
|
||||
common/views/components/signin.vue:
|
||||
username: "ユーザー名"
|
||||
password: "パスワード"
|
||||
@ -353,6 +363,7 @@ common/views/components/signin.vue:
|
||||
or: "または"
|
||||
signin-with-twitter: "Twitterでログイン"
|
||||
signin-with-github: "GitHubでログイン"
|
||||
signin-with-discord: "Discordでログイン"
|
||||
login-failed: "ログインできませんでした。ユーザー名とパスワードを確認してください。"
|
||||
common/views/components/signup.vue:
|
||||
invitation-code: "招待コード"
|
||||
@ -398,6 +409,13 @@ common/views/components/github-setting.vue:
|
||||
reconnect: "再接続する"
|
||||
connect: "GitHubと接続する"
|
||||
disconnect: "切断する"
|
||||
common/views/components/discord-setting.vue:
|
||||
description: "お使いのDiscordアカウントをお使いのMisskeyアカウントに接続しておくと、プロフィールでDiscordアカウント情報が表示されるようになったり、Discordを用いた便利なサインインを利用できるようになります。"
|
||||
connected-to: "次のDiscordアカウントに接続されています"
|
||||
detail: "詳細..."
|
||||
reconnect: "再接続する"
|
||||
connect: "Discordと接続する"
|
||||
disconnect: "切断する"
|
||||
common/views/components/uploader.vue:
|
||||
waiting: "待機中"
|
||||
common/views/components/visibility-chooser.vue:
|
||||
@ -588,12 +606,6 @@ desktop/views/components/media-image.vue:
|
||||
desktop/views/components/media-video.vue:
|
||||
sensitive: "閲覧注意"
|
||||
click-to-show: "クリックして表示"
|
||||
desktop/views/components/follow-button.vue:
|
||||
following: "フォロー中"
|
||||
follow: "フォロー"
|
||||
request-pending: "フォロー許可待ち"
|
||||
follow-processing: "フォロー処理中"
|
||||
follow-request: "フォロー申請"
|
||||
desktop/views/components/followers-window.vue:
|
||||
followers: "{} のフォロワー"
|
||||
desktop/views/components/followers.vue:
|
||||
@ -829,6 +841,10 @@ common/views/components/mute-and-block.vue:
|
||||
block: "ブロック"
|
||||
no-muted-users: "ミュートしているユーザーはいません"
|
||||
no-blocked-users: "ブロックしているユーザーはいません"
|
||||
word-mute: "ワードミュート"
|
||||
muted-words: "ミュートされたキーワード"
|
||||
muted-words-description: "スペースで区切るとAND指定になり、改行で区切るとOR指定になります"
|
||||
save: "保存"
|
||||
common/views/components/password-settings.vue:
|
||||
reset: "パスワードを変更する"
|
||||
enter-current-password: "現在のパスワードを入力してください"
|
||||
@ -903,6 +919,7 @@ admin/views/index.vue:
|
||||
dashboard: "ダッシュボード"
|
||||
instance: "インスタンス"
|
||||
emoji: "カスタム絵文字"
|
||||
moderators: "モデレーター"
|
||||
users: "ユーザー"
|
||||
update: "更新"
|
||||
announcements: "お知らせ"
|
||||
@ -947,7 +964,12 @@ admin/views/instance.vue:
|
||||
github-integration-info: "コールバックURLは /api/gh/cb に設定します。"
|
||||
enable-github-integration: "GitHub連携を有効にする"
|
||||
github-integration-client-id: "Client ID"
|
||||
github-integration-client-secret: "Client secret"
|
||||
github-integration-client-secret: "Client Secret"
|
||||
discord-integration-config: "Discord連携の設定"
|
||||
discord-integration-info: "コールバックURLは /api/dc/cb に設定します。"
|
||||
enable-discord-integration: "Discord連携を有効にする"
|
||||
discord-integration-client-id: "Client ID"
|
||||
discord-integration-client-secret: "Client Secret"
|
||||
proxy-account-config: "プロキシアカウントの設定"
|
||||
proxy-account-info: "プロキシアカウントは、特定の条件下でユーザーのリモートフォローを代行するアカウントです。例えば、ユーザーがリモートユーザーをリストに入れたとき、リストに入れられたユーザーを誰もフォローしていないとアクティビティがサーバーに配達されないため、代わりにプロキシアカウントがフォローするようにします。"
|
||||
proxy-account-username: "プロキシアカウントのユーザー名"
|
||||
@ -997,6 +1019,11 @@ admin/views/users.vue:
|
||||
unverify-user: "ユーザーの公式アカウント解除"
|
||||
unverify: "公式アカウントを解除する"
|
||||
unverified: "公式アカウントを解除しました"
|
||||
admin/views/moderators.vue:
|
||||
add-moderator:
|
||||
title: "モデレーターの登録"
|
||||
add: "登録"
|
||||
added: "モデレーターを登録しました"
|
||||
admin/views/emoji.vue:
|
||||
add-emoji:
|
||||
title: "絵文字の登録"
|
||||
@ -1161,7 +1188,7 @@ mobile/views/components/media-image.vue:
|
||||
mobile/views/components/media-video.vue:
|
||||
sensitive: "閲覧注意"
|
||||
click-to-show: "クリックして表示"
|
||||
mobile/views/components/follow-button.vue:
|
||||
common/views/components/follow-button.vue:
|
||||
following: "フォロー中"
|
||||
follow: "フォロー"
|
||||
request-pending: "フォロー許可待ち"
|
||||
@ -1324,6 +1351,10 @@ mobile/views/pages/settings.vue:
|
||||
github-connect: "GitHubアカウントに接続する"
|
||||
github-reconnect: "再接続する"
|
||||
github-disconnect: "切断する"
|
||||
discord: "Discord連携"
|
||||
discord-connect: "Discordアカウントに接続する"
|
||||
discord-reconnect: "再接続する"
|
||||
discord-disconnect: "切断する"
|
||||
update: "Misskey Update"
|
||||
version: "バージョン:"
|
||||
latest-version: "最新のバージョン:"
|
||||
|
@ -5,143 +5,143 @@ meta:
|
||||
common:
|
||||
misskey: "A ⭐ of fediverse"
|
||||
about-title: "A ⭐ of fediverse."
|
||||
about: "Misskeyを見つけていただき、ありがとうございます。Misskeyは、地球で生まれた<b>分散マイクロブログSNS</b>です。Fediverse(様々なSNSで構成される宇宙)の中に存在するため、他のSNSと相互に繋がっています。暫し都会の喧騒から離れて、新しいインターネットにダイブしてみませんか。"
|
||||
about: "Misskey 是一个开源的程序 <b>decentralized microblogging service</b>. 我懒得翻译了... Sophisticated fully customizable Ui, varieties of reaction for posts, free file storage providing integrated management system and other advancing functions are available. Also, network system called “Fediverse” enables us to communicate with users on other Snss. Like, if you post something, then your posts will sent not only to Misskey but also mastodon. Just imagine that the planet is sending a microwave to other planet to communication."
|
||||
intro:
|
||||
title: "Misskeyって?"
|
||||
title: "什么是 Misskey 呢?"
|
||||
about: "Misskeyはオープンソースの<b>分散型マイクロブログSNS</b>です。リッチで高度にカスタマイズできるUI、投稿へのリアクション、ファイルを一元管理できるドライブなど、先進的な機能を揃えています。また、Fediverseと呼ばれるネットワークに接続できるため、他のSNSともやり取りできます。例えば、あなたが何か投稿すると、その投稿はMisskeyだけでなく他のSNSにも伝わります。ちょうどある惑星から他の惑星に電波を発信している様子をイメージしてください。"
|
||||
features: "特徴"
|
||||
rich-contents: "投稿"
|
||||
rich-contents-desc: "自分の考え、話題の出来事、皆と共有したいことについて発信してください。必要であれば、様々な構文を使って投稿を装飾したり、好きな画像、動画などのファイルやアンケートを添付することもできます。"
|
||||
reaction: "リアクション"
|
||||
reaction-desc: "あなたの気持ちを伝える最も簡単な方法です。Misskeyは、他のユーザーの投稿に様々なリアクションを付けることができます。いちどMisskeyのリアクション機能を体験してしまうと、もう「いいね」の概念しか存在しないSNSには戻れなくなるかもしれません。"
|
||||
ui: "インターフェース"
|
||||
ui-desc: "どのようなUIが使いやすいかは人それぞれです。だから、Misskeyは自由度の高いUIを持っています。レイアウトやデザインを調整したり、カスタマイズ可能な様々なウィジェットを配置したりして、自分だけのホームを作ってください。"
|
||||
drive: "ドライブ"
|
||||
drive-desc: "以前投稿したことのある画像をまた投稿したくなったことはありませんか?もしくは、アップロードしたファイルをフォルダ分けして整理したくなったことはありませんか?Misskeyの根幹に組み込まれたドライブ機能によってそれらが解決します。ファイルの共有も簡単です。"
|
||||
outro: "他にもMisskeyにしかない機能はまだまだあるので、ぜひあなた自身の目で確かめてください。Misskeyは分散型SNSなので、このインスタンスが気に入らなければ他のインスタンスを試すこともできます。それでは、GLHF!"
|
||||
features: "特点"
|
||||
rich-contents: "发布"
|
||||
rich-contents-desc: "您只需要发布您的想法, 热门话题或者任何您想分享的好东西. 你可以装饰你的文字, 加上你最喜欢的图片, 发送文件或者电影, 甚至创造一个投票. 这些事情您都可以在 Misskey 上做。"
|
||||
reaction: "情绪"
|
||||
reaction-desc: "一个最简单的方式去告诉别人你的情绪. Misskey 允许您在别人的帖子中加入各种的情绪反应类型, 就像 Facebook 一样. 在 Misskey 上的情感体验永远不会出现在其他只能点赞的SNSs上。"
|
||||
ui: "交互界面"
|
||||
ui-desc: "世界上没有一个UI可以适合每一个人. 所以, Misskey 提供一个可以高度定制的UI交互界面. 您可以通过编辑, 调整布局, 放置可选择的小部件来轻松定制您的专属UI界面。"
|
||||
drive: "Misskey 云盘"
|
||||
drive-desc: "想要发布一张您已经上传过的照片吗? 想要组织,命名和为上传的文件创建文件夹吗? Misskey 云盘是一个最好的解决方案. "
|
||||
outro: "进一步深挖 Misskey 的更多功能, 如果您感觉这个功能不适合我, 试试其他例子. 因为 Misskey 是一个分散的 SNS, 这样您就可以很容易找到适合自己的一部分."
|
||||
adblock:
|
||||
detected: "広告ブロッカーを無効にしてください"
|
||||
warning: "<strong>Misskeyは広告を掲載していません</strong>が、広告をブロックする機能が有効だと一部の機能が利用できなかったり、不具合が発生する場合があります。"
|
||||
application-authorization: "アプリの連携"
|
||||
close: "閉じる"
|
||||
do-not-copy-paste: "ここにコードを入力したり張り付けたりしないでください。アカウントが不正利用される可能性があります。"
|
||||
load-more: "もっと読み込む"
|
||||
got-it: "わかった"
|
||||
detected: "请关闭广告拦截器"
|
||||
warning: "<strong>Misskey 不是广告网站</strong>如果您启用广告拦截器, 可能会导致某些功能无法正常使用。"
|
||||
application-authorization: "应用程序授权"
|
||||
close: "关闭"
|
||||
do-not-copy-paste: "请不要在这里输入或粘贴代码。您帐户可能会受到损害。"
|
||||
load-more: "加载更多"
|
||||
got-it: "没问题"
|
||||
customization-tips:
|
||||
title: "カスタマイズのヒント"
|
||||
paragraph: "<p>ホームのカスタマイズでは、ウィジェットを追加/削除したり、ドラッグ&ドロップして並べ替えたりすることができます。</p><p>一部のウィジェットは、<strong><strong>右</strong>クリック</strong>することで表示を変更することができます。</p><p>ウィジェットを削除するには、ヘッダーの<strong>「ゴミ箱」</strong>と書かれたエリアにウィジェットをドラッグ&ドロップします。</p><p>カスタマイズを終了するには、右上の「完了」をクリックします。</p>"
|
||||
gotit: "Got it!"
|
||||
title: "客制化提示"
|
||||
paragraph: "<p>主页定制允许您添加或删除, 拖放和重新排列小组件.</p></p>您可以通过<strong><strong>右键</strong>点击</strong>某些小部件来更改显示</p><p>若要删除小部件, 请将其拖到标头为<strong>「垃圾箱」</strong>的区域</p><p>如果您完成了定制过程,单击右上角的「完成」</p>"
|
||||
gotit: "没问题!"
|
||||
notification:
|
||||
file-uploaded: "ファイルがアップロードされました"
|
||||
message-from: "{}さんからメッセージ:"
|
||||
reversi-invited: "対局への招待があります"
|
||||
reversi-invited-by: "{}さんから"
|
||||
notified-by: "{}さんから"
|
||||
reply-from: "{}さんから返信:"
|
||||
quoted-by: "{}さんが引用:"
|
||||
file-uploaded: "文件已上传"
|
||||
message-from: "信息来源 {}:"
|
||||
reversi-invited: "您已被邀请加入一场游戏"
|
||||
reversi-invited-by: "被邀请 {}:"
|
||||
notified-by: "通知 {}:"
|
||||
reply-from: "回复 {}:"
|
||||
quoted-by: "引用 {}:"
|
||||
time:
|
||||
unknown: "なぞのじかん"
|
||||
unknown: "这是个啥??? 不知道哎"
|
||||
future: "未来"
|
||||
just_now: "たった今"
|
||||
just_now: "现在"
|
||||
seconds_ago: "{}秒前"
|
||||
minutes_ago: "{}分前"
|
||||
hours_ago: "{}時間前"
|
||||
days_ago: "{}日前"
|
||||
weeks_ago: "{}週間前"
|
||||
months_ago: "{}ヶ月前"
|
||||
hours_ago: "{}小时前"
|
||||
days_ago: "{}天前"
|
||||
weeks_ago: "{}周前"
|
||||
months_ago: "{}月前"
|
||||
years_ago: "{}年前"
|
||||
month-and-day: "{month}月 {day}日"
|
||||
trash: "ゴミ箱"
|
||||
drive: "ドライブ"
|
||||
messaging: "トーク"
|
||||
trash: "垃圾箱"
|
||||
drive: "Misskey 云盘"
|
||||
messaging: "聊天"
|
||||
weekday-short:
|
||||
sunday: "日"
|
||||
monday: "月"
|
||||
tuesday: "火"
|
||||
wednesday: "水"
|
||||
thursday: "木"
|
||||
friday: "金"
|
||||
saturday: "土"
|
||||
monday: "一"
|
||||
tuesday: "二"
|
||||
wednesday: "三"
|
||||
thursday: "四"
|
||||
friday: "五"
|
||||
saturday: "六"
|
||||
weekday:
|
||||
sunday: "日曜日"
|
||||
monday: "月曜日"
|
||||
tuesday: "火曜日"
|
||||
wednesday: "水曜日"
|
||||
thursday: "木曜日"
|
||||
friday: "金曜日"
|
||||
saturday: "土曜日"
|
||||
sunday: "星期日"
|
||||
monday: "星期一"
|
||||
tuesday: "星期二 "
|
||||
wednesday: "星期三"
|
||||
thursday: "星期四"
|
||||
friday: "星期五"
|
||||
saturday: "星期六"
|
||||
reactions:
|
||||
like: "いいね"
|
||||
love: "しゅき"
|
||||
like: "赞"
|
||||
love: "喜爱"
|
||||
laugh: "笑"
|
||||
hmm: "ふぅ~む"
|
||||
surprise: "わお"
|
||||
congrats: "おめでとう"
|
||||
angry: "おこ"
|
||||
confused: "こまこまのこまり"
|
||||
hmm: "emmm...?"
|
||||
surprise: "哇! "
|
||||
congrats: "恭喜"
|
||||
angry: "生气"
|
||||
confused: "困惑"
|
||||
rip: "RIP"
|
||||
pudding: "Pudding"
|
||||
pudding: "布丁"
|
||||
note-visibility:
|
||||
public: "公開"
|
||||
home: "ホーム"
|
||||
home-desc: "ホームタイムラインにのみ公開"
|
||||
followers: "フォロワー"
|
||||
followers-desc: "自分のフォロワーにのみ公開"
|
||||
specified: "ダイレクト"
|
||||
specified-desc: "指定したユーザーにのみ公開"
|
||||
private: "非公開"
|
||||
public: "公开"
|
||||
home: "首页"
|
||||
home-desc: "仅发送至首页的时间线"
|
||||
followers: "关注者"
|
||||
followers-desc: "仅发送至粉丝"
|
||||
specified: "指定用户"
|
||||
specified-desc: "仅发送至指定用户"
|
||||
private: "私密"
|
||||
note-placeholders:
|
||||
a: "今どうしてる?"
|
||||
b: "何かありましたか?"
|
||||
c: "何をお考えですか?"
|
||||
d: "言いたいことは?"
|
||||
e: "ここに書いてください"
|
||||
f: "あなたが書くのを待っています..."
|
||||
search: "検索"
|
||||
delete: "削除"
|
||||
loading: "読み込み中"
|
||||
ok: "わかった"
|
||||
update-available-title: "更新があります"
|
||||
update-available: "Misskeyの新しいバージョンがあります({newer}。現在{current}を利用中)。ページを再度読み込みすると更新が適用されます。"
|
||||
my-token-regenerated: "あなたのトークンが更新されたのでサインアウトします。"
|
||||
i-like-sushi: "私は(プリンよりむしろ)寿司が好き"
|
||||
show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示"
|
||||
use-contrast-reversi-stones: "リバーシのアイコンにコントラストを付ける"
|
||||
verified-user: "公式アカウント"
|
||||
disable-animated-mfm: "投稿内の動きのあるテキストを無効にする"
|
||||
always-show-nsfw: "常に閲覧注意のメディアを表示する"
|
||||
always-mark-nsfw: "常にメディアを閲覧注意として投稿"
|
||||
show-full-acct: "ユーザー名のホストを省略しない"
|
||||
show-via: "viaを表示する"
|
||||
reduce-motion: "UIの動きを減らす"
|
||||
this-setting-is-this-device-only: "このデバイスのみ"
|
||||
use-os-default-emojis: "OS標準の絵文字を使用"
|
||||
do-not-use-in-production: 'これは開発ビルドです。本番環境で使用しないでください。'
|
||||
is-remote-user: "このユーザー情報はコピーです。"
|
||||
is-remote-post: "この投稿情報はコピーです。"
|
||||
view-on-remote: "正確な情報を見る"
|
||||
a: "你在干什么??"
|
||||
b: "发生了什么?"
|
||||
c: "你有什么想法?"
|
||||
d: "你想要发布些什么吗?"
|
||||
e: "写下来吧"
|
||||
f: "等待你的书写..."
|
||||
search: "搜索"
|
||||
delete: "删除"
|
||||
loading: "正在加载, 等着就好啦"
|
||||
ok: "没问题"
|
||||
update-available-title: "有可用更新"
|
||||
update-available: "新的 Misskey 版本现已发布({newer}。目前版本{current}). 刷新页面以应用更新。"
|
||||
my-token-regenerated: "您的 Token 已被重置, 您将自动登出。"
|
||||
i-like-sushi: "相比于布丁来说, 我更喜欢寿司。"
|
||||
show-reversi-board-labels: "在 Reversi 中显示行和列表签"
|
||||
use-contrast-reversi-stones: "Make the stone color clear in Reversi"
|
||||
verified-user: "认证用户"
|
||||
disable-animated-mfm: "在帖子中禁用动画文本"
|
||||
always-show-nsfw: "总是显示 NSFW 的内容"
|
||||
always-mark-nsfw: "总是用 NSFW 来标记附件"
|
||||
show-full-acct: "不要从用户名中忽略主机名"
|
||||
show-via: "显示..."
|
||||
reduce-motion: "减弱UI中的动画效果"
|
||||
this-setting-is-this-device-only: "设置仅在本设备中生效"
|
||||
use-os-default-emojis: "使用设备系统默认的 emojis"
|
||||
do-not-use-in-production: '这是一个开发者测试版. 请勿在生产环境中使用.'
|
||||
is-remote-user: "该用户的信息已被复制."
|
||||
is-remote-post: "该投稿已被复制."
|
||||
view-on-remote: "查看准确的信息"
|
||||
error:
|
||||
title: '問題が発生しました'
|
||||
retry: 'やり直す'
|
||||
title: '哦不, 发生了一些问题! :('
|
||||
retry: '重试'
|
||||
reversi:
|
||||
drawn: "引き分け"
|
||||
my-turn: "あなたのターンです"
|
||||
opponent-turn: "相手のターンです"
|
||||
turn-of: "{name}のターンです"
|
||||
past-turn-of: "{name}のターン"
|
||||
won: "{name}の勝ち"
|
||||
black: "黒"
|
||||
drawn: "平局"
|
||||
my-turn: "轮到你了"
|
||||
opponent-turn: "轮到对手了"
|
||||
turn-of: "{name}转折点"
|
||||
past-turn-of: "轮到{name}的回合了"
|
||||
won: "{name}获胜"
|
||||
black: "黑"
|
||||
white: "白"
|
||||
total: "合計"
|
||||
this-turn: "{count}ターン目"
|
||||
total: "合计"
|
||||
this-turn: "Turn {count}"
|
||||
widgets:
|
||||
analog-clock: "アナログ時計"
|
||||
profile: "プロフィール"
|
||||
calendar: "カレンダー"
|
||||
timemachine: "カレンダー(タイムマシン)"
|
||||
activity: "アクティビティ"
|
||||
rss: "RSSリーダー"
|
||||
memo: "付箋"
|
||||
analog-clock: "指针时钟"
|
||||
profile: "简介"
|
||||
calendar: "日历"
|
||||
timemachine: "时光机"
|
||||
activity: "动态"
|
||||
rss: "RSS 订阅"
|
||||
memo: "便签"
|
||||
trends: "トレンド"
|
||||
photo-stream: "フォトストリーム"
|
||||
posts-monitor: "投稿チャート"
|
||||
@ -195,60 +195,60 @@ 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ユーザーとリバーシで対戦しよう"
|
||||
invite: "招待"
|
||||
rule: "遊び方"
|
||||
rule-desc: "リバーシは、相手と交互に石をボードに置いて、相手の石を挟んで自分の色に変えてゆき、最終的に残った石が多い方が勝ちというボードゲームです。"
|
||||
mode-invite: "招待"
|
||||
mode-invite-desc: "指定したユーザーと対戦するモードです。"
|
||||
invitations: "対局の招待があります!"
|
||||
my-games: "自分の対局"
|
||||
all-games: "みんなの対局"
|
||||
enter-username: "ユーザー名を入力してください"
|
||||
sub-title: "和你的朋友一起玩 Reversi!"
|
||||
invite: "邀请"
|
||||
rule: "游戏说明"
|
||||
rule-desc: "Reversi是与对方交替地把石头放在板上,把对方的石头夹在自己的颜色上,最终留下的石头多的人获胜。"
|
||||
mode-invite: "邀请"
|
||||
mode-invite-desc: "邀请指定用户参加游戏"
|
||||
invitations: "您收到了一则邀请!"
|
||||
my-games: "我的游戏"
|
||||
all-games: "所有游戏"
|
||||
enter-username: "输入用户名"
|
||||
game-state:
|
||||
ended: "終了"
|
||||
playing: "進行中"
|
||||
ended: "完成"
|
||||
playing: "进行中"
|
||||
common/views/components/games/reversi/reversi.room.vue:
|
||||
settings-of-the-game: "ゲームの設定"
|
||||
choose-map: "マップを選択"
|
||||
random: "ランダム"
|
||||
black-or-white: "先手/後手"
|
||||
black-is: "{}が黒"
|
||||
rules: "ルール"
|
||||
is-llotheo: "石の少ない方が勝ち(ロセオ)"
|
||||
looped-map: "ループマップ"
|
||||
can-put-everywhere: "どこでも置けるモード"
|
||||
settings-of-the-bot: "Botの設定"
|
||||
this-game-is-started-soon: "ゲームは数秒後に開始されます"
|
||||
waiting-for-other: "相手の準備が完了するのを待っています"
|
||||
waiting-for-me: "あなたの準備が完了するのを待っています"
|
||||
waiting-for-both: "準備中"
|
||||
cancel: "キャンセル"
|
||||
ready: "準備完了"
|
||||
cancel-ready: "準備続行"
|
||||
settings-of-the-game: "游戏设置"
|
||||
choose-map: "选择一个地图"
|
||||
random: "随机"
|
||||
black-or-white: "黑/白"
|
||||
black-is: "{}是黑"
|
||||
rules: "规则"
|
||||
is-llotheo: "较少一方获胜"
|
||||
looped-map: "环状地图"
|
||||
can-put-everywhere: "可以随意放置"
|
||||
settings-of-the-bot: "机器人设定"
|
||||
this-game-is-started-soon: "游戏即将在数秒后开始"
|
||||
waiting-for-other: "等待对手准备"
|
||||
waiting-for-me: "等待您的准备"
|
||||
waiting-for-both: "准备中"
|
||||
cancel: "取消"
|
||||
ready: "准备好啦"
|
||||
cancel-ready: "取消准备"
|
||||
common/views/components/connect-failed.vue:
|
||||
title: "サーバーに接続できません"
|
||||
description: "インターネット回線に問題があるか、サーバーがダウンまたはメンテナンスしている可能性があります。しばらくしてから{再度お試し}ください。"
|
||||
thanks: "いつもMisskeyをご利用いただきありがとうございます。"
|
||||
troubleshoot: "トラブルシュート"
|
||||
title: "无法连接至服务器"
|
||||
description: "您的网络连接可能出现了问题, 或是远程服务器暂时不可用. 请稍后{重试}."
|
||||
thanks: "感谢您使用 Misskey"
|
||||
troubleshoot: "故障排除"
|
||||
common/views/components/connect-failed.troubleshooter.vue:
|
||||
title: "トラブルシューティング"
|
||||
network: "ネットワーク接続"
|
||||
checking-network: "ネットワーク接続を確認中"
|
||||
internet: "インターネット接続"
|
||||
checking-internet: "インターネット接続を確認中"
|
||||
server: "サーバー接続"
|
||||
checking-server: "サーバー接続を確認中"
|
||||
finding: "問題を調べています"
|
||||
no-network: "ネットワークに接続されていません"
|
||||
no-network-desc: "お使いのPCのネットワーク接続が正常か確認してください。"
|
||||
no-internet: "インターネットに接続されていません"
|
||||
no-internet-desc: "ネットワークには接続されていますが、インターネットには接続されていないようです。お使いのPCのインターネット接続が正常か確認してください。"
|
||||
no-server: "Misskeyのサーバーに接続できません"
|
||||
no-server-desc: "お使いのPCのインターネット接続は正常ですが、Misskeyのサーバーには接続できませんでした。サーバーがダウンまたはメンテナンスしている可能性があるので、しばらくしてから再度御アクセスください。"
|
||||
success: "Misskeyのサーバーに接続できました"
|
||||
success-desc: "正常に接続できるようです。ページを再度読み込みしてください。"
|
||||
flush: "キャッシュの削除"
|
||||
title: "正在排除故障"
|
||||
network: "网络已连接"
|
||||
checking-network: "正在检查网络连接"
|
||||
internet: "网络连接"
|
||||
checking-internet: "正在检查网络连接"
|
||||
server: "已连接至服务器"
|
||||
checking-server: "正在检查与服务器的连接"
|
||||
finding: "搜索问题"
|
||||
no-network: "无网络连接"
|
||||
no-network-desc: "请确保您已连接至互联网"
|
||||
no-internet: "无网络连接"
|
||||
no-internet-desc: "请确保您已连接至互联网"
|
||||
no-server: "无法连接到 Misskey 服务器"
|
||||
no-server-desc: "您设备与互联网的网络连接正常, 但是无法连接至 Misskey 服务器. 这可能是服务器暂时不可用或正在维护. 请稍后再试."
|
||||
success: "成功连接至 Misskey 服务器"
|
||||
success-desc: "看起来我们连接正常. 请刷新网页."
|
||||
flush: "清除缓存"
|
||||
set-version: "バージョン指定"
|
||||
common/views/components/media-banner.vue:
|
||||
sensitive: "閲覧注意"
|
||||
@ -305,36 +305,36 @@ common/views/components/messaging-room.form.vue:
|
||||
input-message-here: "ここにメッセージを入力"
|
||||
send: "送信"
|
||||
attach-from-local: "PCからファイルを添付する"
|
||||
attach-from-drive: "ドライブからファイルを添付する"
|
||||
only-one-file-attached: "メッセージに添付できるのはひとつのファイルのみです"
|
||||
attach-from-drive: "从云盘中添加文件"
|
||||
only-one-file-attached: "在信息中只允许添加一个附件"
|
||||
common/views/components/messaging-room.message.vue:
|
||||
is-read: "既読"
|
||||
deleted: "このメッセージは削除されました"
|
||||
is-read: "已阅"
|
||||
deleted: "这条信息已被删除"
|
||||
common/views/components/nav.vue:
|
||||
about: "Misskeyについて"
|
||||
stats: "統計"
|
||||
status: "ステータス"
|
||||
wiki: "Wiki"
|
||||
donors: "ドナー"
|
||||
repository: "リポジトリ"
|
||||
develop: "開発者"
|
||||
feedback: "フィードバック"
|
||||
about: "关于"
|
||||
stats: "统计"
|
||||
status: "状态"
|
||||
wiki: "百科 (Wiki)"
|
||||
donors: "捐赠者"
|
||||
repository: "源"
|
||||
develop: "开发者"
|
||||
feedback: "反馈"
|
||||
common/views/components/note-menu.vue:
|
||||
detail: "詳細"
|
||||
copy-link: "リンクをコピー"
|
||||
favorite: "お気に入り"
|
||||
unfavorite: "お気に入り解除"
|
||||
pin: "ピン留め"
|
||||
unpin: "ピン留め解除"
|
||||
delete: "削除"
|
||||
delete-confirm: "この投稿を削除しますか?"
|
||||
remote: "投稿元で見る"
|
||||
detail: "详细信息"
|
||||
copy-link: "复制链接"
|
||||
favorite: "收藏这个投稿"
|
||||
unfavorite: "取消收藏"
|
||||
pin: "固定个人资料"
|
||||
unpin: "解除固定"
|
||||
delete: "删除"
|
||||
delete-confirm: "确定删除这个投稿吗?"
|
||||
remote: "显示原始投稿"
|
||||
common/views/components/poll.vue:
|
||||
vote-to: "「{}」に投票する"
|
||||
vote-to: "为\"{}\"投票"
|
||||
vote-count: "{}票"
|
||||
total-users: "{}人が投票"
|
||||
vote: "投票する"
|
||||
show-result: "結果を見る"
|
||||
total-users: "{} 人投票"
|
||||
vote: "投票"
|
||||
show-result: "显示结果"
|
||||
voted: "投票済み"
|
||||
common/views/components/poll-editor.vue:
|
||||
no-only-one-choice: "アンケートには、選択肢が最低2つ必要です"
|
||||
@ -344,6 +344,16 @@ common/views/components/poll-editor.vue:
|
||||
destroy: "アンケートを破棄"
|
||||
common/views/components/reaction-picker.vue:
|
||||
choose-reaction: "リアクションを選択"
|
||||
common/views/components/emoji-picker.vue:
|
||||
custom-emoji: "カスタム絵文字"
|
||||
people: "人"
|
||||
animals-and-nature: "動物&自然"
|
||||
food-and-drink: "食べ物&飲み物"
|
||||
activity: "アクティビティ"
|
||||
travel-and-places: "場所"
|
||||
objects: "物"
|
||||
symbols: "記号"
|
||||
flags: "旗"
|
||||
common/views/components/signin.vue:
|
||||
username: "ユーザー名"
|
||||
password: "パスワード"
|
||||
@ -353,6 +363,7 @@ common/views/components/signin.vue:
|
||||
or: "または"
|
||||
signin-with-twitter: "Twitterでログイン"
|
||||
signin-with-github: "GitHubでログイン"
|
||||
signin-with-discord: "Discordでログイン"
|
||||
login-failed: "ログインできませんでした。ユーザー名とパスワードを確認してください。"
|
||||
common/views/components/signup.vue:
|
||||
invitation-code: "招待コード"
|
||||
@ -398,6 +409,13 @@ common/views/components/github-setting.vue:
|
||||
reconnect: "再接続する"
|
||||
connect: "GitHubと接続する"
|
||||
disconnect: "切断する"
|
||||
common/views/components/discord-setting.vue:
|
||||
description: "お使いのDiscordアカウントをお使いのMisskeyアカウントに接続しておくと、プロフィールでDiscordアカウント情報が表示されるようになったり、Discordを用いた便利なサインインを利用できるようになります。"
|
||||
connected-to: "次のDiscordアカウントに接続されています"
|
||||
detail: "詳細..."
|
||||
reconnect: "再接続する"
|
||||
connect: "Discordと接続する"
|
||||
disconnect: "切断する"
|
||||
common/views/components/uploader.vue:
|
||||
waiting: "待機中"
|
||||
common/views/components/visibility-chooser.vue:
|
||||
@ -588,12 +606,6 @@ desktop/views/components/media-image.vue:
|
||||
desktop/views/components/media-video.vue:
|
||||
sensitive: "閲覧注意"
|
||||
click-to-show: "クリックして表示"
|
||||
desktop/views/components/follow-button.vue:
|
||||
following: "フォロー中"
|
||||
follow: "フォロー"
|
||||
request-pending: "フォロー許可待ち"
|
||||
follow-processing: "フォロー処理中"
|
||||
follow-request: "フォロー申請"
|
||||
desktop/views/components/followers-window.vue:
|
||||
followers: "{} のフォロワー"
|
||||
desktop/views/components/followers.vue:
|
||||
@ -829,6 +841,10 @@ common/views/components/mute-and-block.vue:
|
||||
block: "ブロック"
|
||||
no-muted-users: "ミュートしているユーザーはいません"
|
||||
no-blocked-users: "ブロックしているユーザーはいません"
|
||||
word-mute: "ワードミュート"
|
||||
muted-words: "ミュートされたキーワード"
|
||||
muted-words-description: "スペースで区切るとAND指定になり、改行で区切るとOR指定になります"
|
||||
save: "保存"
|
||||
common/views/components/password-settings.vue:
|
||||
reset: "パスワードを変更する"
|
||||
enter-current-password: "現在のパスワードを入力してください"
|
||||
@ -903,6 +919,7 @@ admin/views/index.vue:
|
||||
dashboard: "ダッシュボード"
|
||||
instance: "インスタンス"
|
||||
emoji: "カスタム絵文字"
|
||||
moderators: "モデレーター"
|
||||
users: "ユーザー"
|
||||
update: "更新"
|
||||
announcements: "お知らせ"
|
||||
@ -947,7 +964,12 @@ admin/views/instance.vue:
|
||||
github-integration-info: "コールバックURLは /api/gh/cb に設定します。"
|
||||
enable-github-integration: "GitHub連携を有効にする"
|
||||
github-integration-client-id: "Client ID"
|
||||
github-integration-client-secret: "Client secret"
|
||||
github-integration-client-secret: "Client Secret"
|
||||
discord-integration-config: "Discord連携の設定"
|
||||
discord-integration-info: "コールバックURLは /api/dc/cb に設定します。"
|
||||
enable-discord-integration: "Discord連携を有効にする"
|
||||
discord-integration-client-id: "Client ID"
|
||||
discord-integration-client-secret: "Client Secret"
|
||||
proxy-account-config: "プロキシアカウントの設定"
|
||||
proxy-account-info: "プロキシアカウントは、特定の条件下でユーザーのリモートフォローを代行するアカウントです。例えば、ユーザーがリモートユーザーをリストに入れたとき、リストに入れられたユーザーを誰もフォローしていないとアクティビティがサーバーに配達されないため、代わりにプロキシアカウントがフォローするようにします。"
|
||||
proxy-account-username: "プロキシアカウントのユーザー名"
|
||||
@ -997,6 +1019,11 @@ admin/views/users.vue:
|
||||
unverify-user: "ユーザーの公式アカウント解除"
|
||||
unverify: "公式アカウントを解除する"
|
||||
unverified: "公式アカウントを解除しました"
|
||||
admin/views/moderators.vue:
|
||||
add-moderator:
|
||||
title: "モデレーターの登録"
|
||||
add: "登録"
|
||||
added: "モデレーターを登録しました"
|
||||
admin/views/emoji.vue:
|
||||
add-emoji:
|
||||
title: "絵文字の登録"
|
||||
@ -1161,7 +1188,7 @@ mobile/views/components/media-image.vue:
|
||||
mobile/views/components/media-video.vue:
|
||||
sensitive: "閲覧注意"
|
||||
click-to-show: "クリックして表示"
|
||||
mobile/views/components/follow-button.vue:
|
||||
common/views/components/follow-button.vue:
|
||||
following: "フォロー中"
|
||||
follow: "フォロー"
|
||||
request-pending: "フォロー許可待ち"
|
||||
@ -1324,6 +1351,10 @@ mobile/views/pages/settings.vue:
|
||||
github-connect: "GitHubアカウントに接続する"
|
||||
github-reconnect: "再接続する"
|
||||
github-disconnect: "切断する"
|
||||
discord: "Discord連携"
|
||||
discord-connect: "Discordアカウントに接続する"
|
||||
discord-reconnect: "再接続する"
|
||||
discord-disconnect: "切断する"
|
||||
update: "Misskey Update"
|
||||
version: "バージョン:"
|
||||
latest-version: "最新のバージョン:"
|
||||
|
14
package.json
14
package.json
@ -1,8 +1,8 @@
|
||||
{
|
||||
"name": "misskey",
|
||||
"author": "syuilo <i@syuilo.com>",
|
||||
"version": "10.49.0",
|
||||
"clientVersion": "2.0.11740",
|
||||
"version": "10.53.0",
|
||||
"clientVersion": "2.0.11867",
|
||||
"codename": "nighthike",
|
||||
"main": "./built/index.js",
|
||||
"private": true,
|
||||
@ -158,7 +158,7 @@
|
||||
"mocha": "5.2.0",
|
||||
"moji": "0.5.1",
|
||||
"moment": "2.22.2",
|
||||
"mongodb": "3.1.8",
|
||||
"mongodb": "3.1.9",
|
||||
"monk": "6.0.6",
|
||||
"ms": "2.1.1",
|
||||
"nan": "2.11.1",
|
||||
@ -176,6 +176,7 @@
|
||||
"pug": "2.0.3",
|
||||
"punycode": "2.1.1",
|
||||
"qrcode": "1.3.2",
|
||||
"randomcolor": "0.5.3",
|
||||
"ratelimiter": "3.2.0",
|
||||
"recaptcha-promise": "0.1.3",
|
||||
"reconnecting-websocket": "4.1.10",
|
||||
@ -188,7 +189,7 @@
|
||||
"s-age": "1.1.2",
|
||||
"seedrandom": "2.4.4",
|
||||
"sharp": "0.21.0",
|
||||
"showdown": "1.8.7",
|
||||
"showdown": "1.9.0",
|
||||
"showdown-highlightjs-extension": "0.1.2",
|
||||
"speakeasy": "2.0.0",
|
||||
"stringz": "1.0.0",
|
||||
@ -198,6 +199,7 @@
|
||||
"summaly": "2.2.0",
|
||||
"systeminformation": "3.47.0",
|
||||
"syuilo-password-strength": "0.0.1",
|
||||
"terser-webpack-plugin": "1.1.0",
|
||||
"textarea-caret": "3.1.0",
|
||||
"tinycolor2": "1.4.1",
|
||||
"tmp": "0.0.33",
|
||||
@ -205,7 +207,7 @@
|
||||
"ts-node": "7.0.1",
|
||||
"tslint": "5.10.0",
|
||||
"typescript": "3.1.6",
|
||||
"typescript-eslint-parser": "20.1.1",
|
||||
"typescript-eslint-parser": "21.0.0",
|
||||
"uglify-es": "3.3.9",
|
||||
"url-loader": "1.1.2",
|
||||
"uuid": "3.3.2",
|
||||
@ -217,10 +219,10 @@
|
||||
"vue-i18n": "8.3.1",
|
||||
"vue-js-modal": "1.3.26",
|
||||
"vue-loader": "15.4.2",
|
||||
"vue-marquee-text-component": "1.1.0",
|
||||
"vue-router": "3.0.1",
|
||||
"vue-style-loader": "4.1.2",
|
||||
"vue-svg-inline-loader": "1.2.1",
|
||||
"vue-sweetalert2": "1.5.7",
|
||||
"vue-template-compiler": "2.5.17",
|
||||
"vuedraggable": "2.16.0",
|
||||
"vuewordcloud": "18.7.11",
|
||||
|
@ -41,22 +41,22 @@ export default Vue.extend({
|
||||
|
||||
methods: {
|
||||
add() {
|
||||
this.announcements.push({
|
||||
this.announcements.unshift({
|
||||
title: '',
|
||||
text: ''
|
||||
});
|
||||
},
|
||||
|
||||
remove(i) {
|
||||
this.$swal({
|
||||
this.$root.alert({
|
||||
type: 'warning',
|
||||
text: this.$t('_remove.are-you-sure').replace('$1', this.announcements.find((_, j) => j == i).title),
|
||||
showCancelButton: true
|
||||
}).then(res => {
|
||||
if (!res.value) return;
|
||||
if (!res) return;
|
||||
this.announcements = this.announcements.filter((_, j) => j !== i);
|
||||
this.save(true);
|
||||
this.$swal({
|
||||
this.$root.alert({
|
||||
type: 'success',
|
||||
text: this.$t('_remove.removed')
|
||||
});
|
||||
@ -68,13 +68,13 @@ export default Vue.extend({
|
||||
broadcasts: this.announcements
|
||||
}).then(() => {
|
||||
if (!silent) {
|
||||
this.$swal({
|
||||
this.$root.alert({
|
||||
type: 'success',
|
||||
text: this.$t('saved')
|
||||
});
|
||||
}
|
||||
}).catch(e => {
|
||||
this.$swal({
|
||||
this.$root.alert({
|
||||
type: 'error',
|
||||
text: e
|
||||
});
|
||||
|
@ -3,17 +3,17 @@
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th><fa icon="exchange-alt"/> In/Out</th>
|
||||
<th><fa :icon="faExchangeAlt"/> In/Out</th>
|
||||
<th><fa :icon="faBolt"/> Activity</th>
|
||||
<th><fa icon="server"/> Host</th>
|
||||
<th><fa icon="bolt"/> Activity</th>
|
||||
<th><fa icon="user"/> Actor</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr v-for="log in logs" :key="log.id">
|
||||
<td :class="log.direction">{{ log.direction == 'in' ? '<' : '>' }} {{ log.direction }}</td>
|
||||
<td>{{ log.host }}</td>
|
||||
<td>{{ log.activity }}</td>
|
||||
<td>{{ log.host }}</td>
|
||||
<td>@{{ log.actor }}</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
@ -23,12 +23,14 @@
|
||||
|
||||
<script lang="ts">
|
||||
import Vue from 'vue';
|
||||
import { faBolt, faExchangeAlt } from '@fortawesome/free-solid-svg-icons';
|
||||
|
||||
export default Vue.extend({
|
||||
data() {
|
||||
return {
|
||||
logs: [],
|
||||
connection: null
|
||||
connection: null,
|
||||
faBolt, faExchangeAlt
|
||||
};
|
||||
},
|
||||
|
||||
|
@ -8,13 +8,19 @@
|
||||
<p>{{ $t('@.ai-chan-kawaii') }}</p>
|
||||
</header>
|
||||
|
||||
<marquee-text v-if="instances.length > 0" class="instances" :repeat="10" :duration="60">
|
||||
<span v-for="instance in instances" class="instance">
|
||||
<b :style="{ background: instance.bg }">{{ instance.host }}</b>{{ instance.notesCount | number }} / {{ instance.usersCount | number }}
|
||||
</span>
|
||||
</marquee-text>
|
||||
|
||||
<div v-if="stats" class="stats">
|
||||
<div>
|
||||
<div>
|
||||
<div><fa icon="user"/></div>
|
||||
<div>
|
||||
<span>{{ $t('accounts') }}</span>
|
||||
<b class="primary">{{ stats.originalUsersCount | number }}</b>
|
||||
<b>{{ stats.originalUsersCount | number }}</b>
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
@ -27,7 +33,7 @@
|
||||
<div><fa icon="pencil-alt"/></div>
|
||||
<div>
|
||||
<span>{{ $t('notes') }}</span>
|
||||
<b class="primary">{{ stats.originalNotesCount | number }}</b>
|
||||
<b>{{ stats.originalNotesCount | number }}</b>
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
@ -37,7 +43,7 @@
|
||||
</div>
|
||||
<div>
|
||||
<div>
|
||||
<div><fa icon="database"/></div>
|
||||
<div><fa :icon="faDatabase"/></div>
|
||||
<div>
|
||||
<span>{{ $t('drive') }}</span>
|
||||
<b>{{ stats.driveUsageLocal | bytes }}</b>
|
||||
@ -83,42 +89,68 @@ import i18n from '../../i18n';
|
||||
import XCpuMemory from "./cpu-memory.vue";
|
||||
import XCharts from "./charts.vue";
|
||||
import XApLog from "./ap-log.vue";
|
||||
import { faDatabase } from '@fortawesome/free-solid-svg-icons';
|
||||
import MarqueeText from 'vue-marquee-text-component';
|
||||
import randomColor from 'randomcolor';
|
||||
|
||||
export default Vue.extend({
|
||||
i18n: i18n('admin/views/dashboard.vue'),
|
||||
|
||||
components: {
|
||||
XCpuMemory,
|
||||
XCharts,
|
||||
XApLog
|
||||
XApLog,
|
||||
MarqueeText
|
||||
},
|
||||
|
||||
data() {
|
||||
return {
|
||||
stats: null,
|
||||
connection: null,
|
||||
meta: null
|
||||
meta: null,
|
||||
instances: [],
|
||||
clock: null,
|
||||
faDatabase
|
||||
};
|
||||
},
|
||||
|
||||
created() {
|
||||
this.connection = this.$root.stream.useSharedConnection('serverStats');
|
||||
|
||||
this.updateStats();
|
||||
this.clock = setInterval(this.updateStats, 1000);
|
||||
|
||||
this.$root.getMeta().then(meta => {
|
||||
this.meta = meta;
|
||||
});
|
||||
|
||||
this.$root.api('stats').then(stats => {
|
||||
this.stats = stats;
|
||||
this.$root.api('instances', {
|
||||
sort: '+notes'
|
||||
}).then(instances => {
|
||||
instances.forEach(i => {
|
||||
i.bg = randomColor({
|
||||
seed: i.host,
|
||||
luminosity: 'dark'
|
||||
});
|
||||
});
|
||||
this.instances = instances;
|
||||
});
|
||||
},
|
||||
|
||||
beforeDestroy() {
|
||||
this.connection.dispose();
|
||||
clearInterval(this.clock);
|
||||
},
|
||||
|
||||
methods: {
|
||||
setChartSrc(src) {
|
||||
this.$refs.charts.setSrc(src);
|
||||
},
|
||||
|
||||
updateStats() {
|
||||
this.$root.api('stats', {}, false, true).then(stats => {
|
||||
this.stats = stats;
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
@ -133,7 +165,6 @@ export default Vue.extend({
|
||||
|
||||
> header
|
||||
display flex
|
||||
margin-bottom 16px
|
||||
padding-bottom 16px
|
||||
border-bottom solid 1px var(--adminDashboardHeaderBorder)
|
||||
color var(--adminDashboardHeaderFg)
|
||||
@ -158,6 +189,20 @@ export default Vue.extend({
|
||||
margin-left auto
|
||||
margin-right 0
|
||||
|
||||
> .instances
|
||||
padding 16px
|
||||
color var(--adminDashboardHeaderFg)
|
||||
font-size 13px
|
||||
|
||||
>>> .instance
|
||||
margin 0 10px
|
||||
|
||||
> b
|
||||
padding 2px 6px
|
||||
margin-right 4px
|
||||
border-radius 4px
|
||||
color #fff
|
||||
|
||||
> .stats
|
||||
display flex
|
||||
justify-content space-between
|
||||
@ -198,9 +243,6 @@ export default Vue.extend({
|
||||
> b
|
||||
display block
|
||||
|
||||
&.primary
|
||||
color var(--primary)
|
||||
|
||||
> div:last-child
|
||||
display flex
|
||||
padding 6px 16px
|
||||
|
@ -23,7 +23,7 @@
|
||||
</ui-card>
|
||||
|
||||
<ui-card>
|
||||
<div slot="title"><fa :icon="['far', 'grin']"/> {{ $t('emojis.title') }}</div>
|
||||
<div slot="title"><fa :icon="faGrin"/> {{ $t('emojis.title') }}</div>
|
||||
<section v-for="emoji in emojis">
|
||||
<img :src="emoji.url" :alt="emoji.name" style="width: 64px;"/>
|
||||
<ui-horizon-group inputs>
|
||||
@ -50,6 +50,7 @@
|
||||
<script lang="ts">
|
||||
import Vue from 'vue';
|
||||
import i18n from '../../i18n';
|
||||
import { faGrin } from '@fortawesome/free-regular-svg-icons';
|
||||
|
||||
export default Vue.extend({
|
||||
i18n: i18n('admin/views/emoji.vue'),
|
||||
@ -58,7 +59,8 @@ export default Vue.extend({
|
||||
name: '',
|
||||
url: '',
|
||||
aliases: '',
|
||||
emojis: []
|
||||
emojis: [],
|
||||
faGrin
|
||||
};
|
||||
},
|
||||
|
||||
@ -73,13 +75,13 @@ export default Vue.extend({
|
||||
url: this.url,
|
||||
aliases: this.aliases.split(' ').filter(x => x.length > 0)
|
||||
}).then(() => {
|
||||
this.$swal({
|
||||
this.$root.alert({
|
||||
type: 'success',
|
||||
text: this.$t('add-emoji.added')
|
||||
});
|
||||
this.fetchEmojis();
|
||||
}).catch(e => {
|
||||
this.$swal({
|
||||
this.$root.alert({
|
||||
type: 'error',
|
||||
text: e
|
||||
});
|
||||
@ -101,12 +103,12 @@ export default Vue.extend({
|
||||
url: emoji.url,
|
||||
aliases: emoji.aliases.split(' ').filter(x => x.length > 0)
|
||||
}).then(() => {
|
||||
this.$swal({
|
||||
this.$root.alert({
|
||||
type: 'success',
|
||||
text: this.$t('updated')
|
||||
});
|
||||
}).catch(e => {
|
||||
this.$swal({
|
||||
this.$root.alert({
|
||||
type: 'error',
|
||||
text: e
|
||||
});
|
||||
@ -114,23 +116,23 @@ export default Vue.extend({
|
||||
},
|
||||
|
||||
removeEmoji(emoji) {
|
||||
this.$swal({
|
||||
this.$root.alert({
|
||||
type: 'warning',
|
||||
text: this.$t('remove-emoji.are-you-sure').replace('$1', emoji.name),
|
||||
showCancelButton: true
|
||||
}).then(res => {
|
||||
if (!res.value) return;
|
||||
if (!res) return;
|
||||
|
||||
this.$root.api('admin/emoji/remove', {
|
||||
id: emoji.id
|
||||
}).then(() => {
|
||||
this.$swal({
|
||||
this.$root.alert({
|
||||
type: 'success',
|
||||
text: this.$t('remove-emoji.removed')
|
||||
});
|
||||
this.fetchEmojis();
|
||||
}).catch(e => {
|
||||
this.$swal({
|
||||
this.$root.alert({
|
||||
type: 'error',
|
||||
text: e
|
||||
});
|
||||
|
@ -20,30 +20,34 @@
|
||||
<ul>
|
||||
<li @click="nav('dashboard')" :class="{ active: page == 'dashboard' }"><fa icon="home" fixed-width/>{{ $t('dashboard') }}</li>
|
||||
<li @click="nav('instance')" :class="{ active: page == 'instance' }"><fa icon="cog" fixed-width/>{{ $t('instance') }}</li>
|
||||
<li @click="nav('moderators')" :class="{ active: page == 'moderators' }"><fa :icon="faHeadset" fixed-width/>{{ $t('moderators') }}</li>
|
||||
<li @click="nav('users')" :class="{ active: page == 'users' }"><fa icon="users" fixed-width/>{{ $t('users') }}</li>
|
||||
<li @click="nav('emoji')" :class="{ active: page == 'emoji' }"><fa :icon="['far', 'grin']" fixed-width/>{{ $t('emoji') }}</li>
|
||||
<!-- <li @click="nav('federation')" :class="{ active: page == 'federation' }"><fa :icon="faShareAlt" fixed-width/>{{ $t('federation') }}</li> -->
|
||||
<li @click="nav('emoji')" :class="{ active: page == 'emoji' }"><fa :icon="faGrin" fixed-width/>{{ $t('emoji') }}</li>
|
||||
<li @click="nav('announcements')" :class="{ active: page == 'announcements' }"><fa icon="broadcast-tower" fixed-width/>{{ $t('announcements') }}</li>
|
||||
<li @click="nav('hashtags')" :class="{ active: page == 'hashtags' }"><fa icon="hashtag" fixed-width/>{{ $t('hashtags') }}</li>
|
||||
|
||||
<!-- <li @click="nav('drive')" :class="{ active: page == 'drive' }"><fa icon="cloud" fixed-width/>{{ $t('@.drive') }}</li> -->
|
||||
<!-- <li @click="nav('update')" :class="{ active: page == 'update' }">{{ $t('update') }}</li> -->
|
||||
</ul>
|
||||
<div class="back-to-misskey">
|
||||
<a href="/"><fa icon="arrow-left"/> {{ $t('back-to-misskey') }}</a>
|
||||
<a href="/"><fa :icon="faArrowLeft"/> {{ $t('back-to-misskey') }}</a>
|
||||
</div>
|
||||
<div class="version">
|
||||
<small>Misskey {{ version }}</small>
|
||||
</div>
|
||||
</nav>
|
||||
<main>
|
||||
<div v-if="page == 'dashboard'"><x-dashboard/></div>
|
||||
<div v-if="page == 'instance'"><x-instance/></div>
|
||||
<div v-if="page == 'users'"><x-users/></div>
|
||||
<div v-if="page == 'emoji'"><x-emoji/></div>
|
||||
<div v-if="page == 'announcements'"><x-announcements/></div>
|
||||
<div v-if="page == 'hashtags'"><x-hashtags/></div>
|
||||
<div v-if="page == 'drive'"></div>
|
||||
<div v-if="page == 'update'"></div>
|
||||
<div class="page">
|
||||
<div v-if="page == 'dashboard'"><x-dashboard/></div>
|
||||
<div v-if="page == 'instance'"><x-instance/></div>
|
||||
<div v-if="page == 'moderators'"><x-moderators/></div>
|
||||
<div v-if="page == 'users'"><x-users/></div>
|
||||
<div v-if="page == 'emoji'"><x-emoji/></div>
|
||||
<div v-if="page == 'announcements'"><x-announcements/></div>
|
||||
<div v-if="page == 'hashtags'"><x-hashtags/></div>
|
||||
<div v-if="page == 'drive'"></div>
|
||||
<div v-if="page == 'update'"></div>
|
||||
</div>
|
||||
</main>
|
||||
</div>
|
||||
</template>
|
||||
@ -54,10 +58,13 @@ import i18n from '../../i18n';
|
||||
import { version } from '../../config';
|
||||
import XDashboard from "./dashboard.vue";
|
||||
import XInstance from "./instance.vue";
|
||||
import XModerators from "./moderators.vue";
|
||||
import XEmoji from "./emoji.vue";
|
||||
import XAnnouncements from "./announcements.vue";
|
||||
import XHashtags from "./hashtags.vue";
|
||||
import XUsers from "./users.vue";
|
||||
import { faHeadset, faArrowLeft, faShareAlt } from '@fortawesome/free-solid-svg-icons';
|
||||
import { faGrin } from '@fortawesome/free-regular-svg-icons';
|
||||
|
||||
// Detect the user agent
|
||||
const ua = navigator.userAgent.toLowerCase();
|
||||
@ -68,6 +75,7 @@ export default Vue.extend({
|
||||
components: {
|
||||
XDashboard,
|
||||
XInstance,
|
||||
XModerators,
|
||||
XEmoji,
|
||||
XAnnouncements,
|
||||
XHashtags,
|
||||
@ -81,7 +89,11 @@ export default Vue.extend({
|
||||
page: 'dashboard',
|
||||
version,
|
||||
isMobile,
|
||||
navOpend: !isMobile
|
||||
navOpend: !isMobile,
|
||||
faGrin,
|
||||
faArrowLeft,
|
||||
faHeadset,
|
||||
faShareAlt
|
||||
};
|
||||
},
|
||||
methods: {
|
||||
@ -92,7 +104,7 @@ export default Vue.extend({
|
||||
});
|
||||
</script>
|
||||
|
||||
<style lang="stylus">
|
||||
<style lang="stylus" scoped>
|
||||
.mk-admin
|
||||
$headerHeight = 48px
|
||||
|
||||
@ -253,7 +265,9 @@ export default Vue.extend({
|
||||
> main
|
||||
width 100%
|
||||
padding 0 0 0 250px
|
||||
max-width 1300px
|
||||
|
||||
> .page
|
||||
max-width 1150px
|
||||
|
||||
&.isMobile
|
||||
> main
|
||||
|
@ -10,7 +10,7 @@
|
||||
<ui-input v-model="languages"><i slot="icon"><fa icon="language"/></i>{{ $t('languages') }}<span slot="desc">{{ $t('languages-desc') }}</span></ui-input>
|
||||
</section>
|
||||
<section class="fit-bottom">
|
||||
<header><fa icon="headset"/> {{ $t('maintainer-config') }}</header>
|
||||
<header><fa :icon="faHeadset"/> {{ $t('maintainer-config') }}</header>
|
||||
<ui-input v-model="maintainerName">{{ $t('maintainer-name') }}</ui-input>
|
||||
<ui-input v-model="maintainerEmail" type="email"><i slot="icon"><fa :icon="['far', 'envelope']"/></i>{{ $t('maintainer-email') }}</ui-input>
|
||||
</section>
|
||||
@ -24,14 +24,14 @@
|
||||
<ui-input v-model="remoteDriveCapacityMb" type="number" :disabled="!cacheRemoteFiles">{{ $t('remote-drive-capacity-mb') }}<span slot="suffix">MB</span><span slot="desc">{{ $t('mb') }}</span></ui-input>
|
||||
</section>
|
||||
<section class="fit-bottom">
|
||||
<header><fa icon="shield-alt"/> {{ $t('recaptcha-config') }}</header>
|
||||
<header><fa :icon="faShieldAlt"/> {{ $t('recaptcha-config') }}</header>
|
||||
<ui-switch v-model="enableRecaptcha">{{ $t('enable-recaptcha') }}</ui-switch>
|
||||
<ui-info>{{ $t('recaptcha-info') }}</ui-info>
|
||||
<ui-input v-model="recaptchaSiteKey" :disabled="!enableRecaptcha"><i slot="icon"><fa icon="key"/></i>{{ $t('recaptcha-site-key') }}</ui-input>
|
||||
<ui-input v-model="recaptchaSecretKey" :disabled="!enableRecaptcha"><i slot="icon"><fa icon="key"/></i>{{ $t('recaptcha-secret-key') }}</ui-input>
|
||||
</section>
|
||||
<section>
|
||||
<header><fa icon="ghost"/> {{ $t('proxy-account-config') }}</header>
|
||||
<header><fa :icon="faGhost"/> {{ $t('proxy-account-config') }}</header>
|
||||
<ui-info>{{ $t('proxy-account-info') }}</ui-info>
|
||||
<ui-input v-model="proxyAccount"><span slot="prefix">@</span>{{ $t('proxy-account-username') }}<span slot="desc">{{ $t('proxy-account-username-desc') }}</span></ui-input>
|
||||
<ui-info warn>{{ $t('proxy-account-warn') }}</ui-info>
|
||||
@ -76,6 +76,17 @@
|
||||
<ui-button @click="updateMeta">{{ $t('save') }}</ui-button>
|
||||
</section>
|
||||
</ui-card>
|
||||
|
||||
<ui-card>
|
||||
<div slot="title"><fa :icon="['fab', 'discord']"/> {{ $t('discord-integration-config') }}</div>
|
||||
<section>
|
||||
<ui-switch v-model="enableDiscordIntegration">{{ $t('enable-discord-integration') }}</ui-switch>
|
||||
<ui-info>{{ $t('discord-integration-info') }}</ui-info>
|
||||
<ui-input v-model="discordClientId" :disabled="!enableDiscordIntegration"><i slot="icon"><fa icon="key"/></i>{{ $t('discord-integration-client-id') }}</ui-input>
|
||||
<ui-input v-model="discordClientSecret" :disabled="!enableDiscordIntegration"><i slot="icon"><fa icon="key"/></i>{{ $t('discord-integration-client-secret') }}</ui-input>
|
||||
<ui-button @click="updateMeta">{{ $t('save') }}</ui-button>
|
||||
</section>
|
||||
</ui-card>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
@ -84,9 +95,11 @@ import Vue from 'vue';
|
||||
import i18n from '../../i18n';
|
||||
import { host } from '../../config';
|
||||
import { toUnicode } from 'punycode';
|
||||
import { faHeadset, faShieldAlt, faGhost } from '@fortawesome/free-solid-svg-icons';
|
||||
|
||||
export default Vue.extend({
|
||||
i18n: i18n('admin/views/instance.vue'),
|
||||
|
||||
data() {
|
||||
return {
|
||||
host: toUnicode(host),
|
||||
@ -111,8 +124,12 @@ export default Vue.extend({
|
||||
enableGithubIntegration: false,
|
||||
githubClientId: null,
|
||||
githubClientSecret: null,
|
||||
enableDiscordIntegration: false,
|
||||
discordClientId: null,
|
||||
discordClientSecret: null,
|
||||
proxyAccount: null,
|
||||
inviteCode: null,
|
||||
faHeadset, faShieldAlt, faGhost
|
||||
};
|
||||
},
|
||||
|
||||
@ -138,6 +155,9 @@ export default Vue.extend({
|
||||
this.enableGithubIntegration = meta.enableGithubIntegration;
|
||||
this.githubClientId = meta.githubClientId;
|
||||
this.githubClientSecret = meta.githubClientSecret;
|
||||
this.enableDiscordIntegration = meta.enableDiscordIntegration;
|
||||
this.discordClientId = meta.discordClientId;
|
||||
this.discordClientSecret = meta.discordClientSecret;
|
||||
});
|
||||
},
|
||||
|
||||
@ -146,7 +166,7 @@ export default Vue.extend({
|
||||
this.$root.api('admin/invite').then(x => {
|
||||
this.inviteCode = x.code;
|
||||
}).catch(e => {
|
||||
this.$swal({
|
||||
this.$root.alert({
|
||||
type: 'error',
|
||||
text: e
|
||||
});
|
||||
@ -177,13 +197,16 @@ export default Vue.extend({
|
||||
enableGithubIntegration: this.enableGithubIntegration,
|
||||
githubClientId: this.githubClientId,
|
||||
githubClientSecret: this.githubClientSecret,
|
||||
enableDiscordIntegration: this.enableDiscordIntegration,
|
||||
discordClientId: this.discordClientId,
|
||||
discordClientSecret: this.discordClientSecret
|
||||
}).then(() => {
|
||||
this.$swal({
|
||||
this.$root.alert({
|
||||
type: 'success',
|
||||
text: this.$t('saved')
|
||||
});
|
||||
}).catch(e => {
|
||||
this.$swal({
|
||||
this.$root.alert({
|
||||
type: 'error',
|
||||
text: e
|
||||
});
|
||||
|
61
src/client/app/admin/views/moderators.vue
Normal file
61
src/client/app/admin/views/moderators.vue
Normal file
@ -0,0 +1,61 @@
|
||||
<template>
|
||||
<div class="jnhmugbb">
|
||||
<ui-card>
|
||||
<div slot="title"><fa icon="plus"/> {{ $t('add-moderator.title') }}</div>
|
||||
<section class="fit-top">
|
||||
<ui-input v-model="username" type="text">
|
||||
<span slot="prefix">@</span>
|
||||
</ui-input>
|
||||
<ui-button @click="add" :disabled="adding">{{ $t('add-moderator.add') }}</ui-button>
|
||||
</section>
|
||||
</ui-card>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script lang="ts">
|
||||
import Vue from 'vue';
|
||||
import i18n from '../../i18n';
|
||||
import parseAcct from "../../../../misc/acct/parse";
|
||||
|
||||
export default Vue.extend({
|
||||
i18n: i18n('admin/views/moderators.vue'),
|
||||
|
||||
data() {
|
||||
return {
|
||||
username: '',
|
||||
adding: false
|
||||
};
|
||||
},
|
||||
|
||||
methods: {
|
||||
async add() {
|
||||
this.adding = true;
|
||||
|
||||
const process = async () => {
|
||||
const user = await this.$root.api('users/show', parseAcct(this.username));
|
||||
await this.$root.api('admin/moderators/add', { userId: user.id });
|
||||
this.$root.alert({
|
||||
type: 'success',
|
||||
text: this.$t('add-moderator.added')
|
||||
});
|
||||
};
|
||||
|
||||
await process().catch(e => {
|
||||
this.$root.alert({
|
||||
type: 'error',
|
||||
text: e.toString()
|
||||
});
|
||||
});
|
||||
|
||||
this.adding = false;
|
||||
},
|
||||
}
|
||||
});
|
||||
</script>
|
||||
|
||||
<style lang="stylus" scoped>
|
||||
.jnhmugbb
|
||||
@media (min-width 500px)
|
||||
padding 16px
|
||||
|
||||
</style>
|
@ -49,6 +49,7 @@ import parseAcct from "../../../../misc/acct/parse";
|
||||
|
||||
export default Vue.extend({
|
||||
i18n: i18n('admin/views/users.vue'),
|
||||
|
||||
data() {
|
||||
return {
|
||||
verifyUsername: null,
|
||||
@ -67,13 +68,19 @@ export default Vue.extend({
|
||||
this.verifying = true;
|
||||
|
||||
const process = async () => {
|
||||
const user = await this.$root.os.api('users/show', parseAcct(this.verifyUsername));
|
||||
await this.$root.os.api('admin/verify-user', { userId: user.id });
|
||||
//this.$root.os.apis.dialog({ text: this.$t('verified') });
|
||||
const user = await this.$root.api('users/show', parseAcct(this.verifyUsername));
|
||||
await this.$root.api('admin/verify-user', { userId: user.id });
|
||||
this.$root.alert({
|
||||
type: 'success',
|
||||
text: this.$t('verified')
|
||||
});
|
||||
};
|
||||
|
||||
await process().catch(e => {
|
||||
//this.$root.os.apis.dialog({ text: `Failed: ${e}` });
|
||||
this.$root.alert({
|
||||
type: 'error',
|
||||
text: e.toString()
|
||||
});
|
||||
});
|
||||
|
||||
this.verifying = false;
|
||||
@ -83,13 +90,19 @@ export default Vue.extend({
|
||||
this.unverifying = true;
|
||||
|
||||
const process = async () => {
|
||||
const user = await this.$root.os.api('users/show', parseAcct(this.unverifyUsername));
|
||||
await this.$root.os.api('admin/unverify-user', { userId: user.id });
|
||||
//this.$root.os.apis.dialog({ text: this.$t('unverified') });
|
||||
const user = await this.$root.api('users/show', parseAcct(this.unverifyUsername));
|
||||
await this.$root.api('admin/unverify-user', { userId: user.id });
|
||||
this.$root.alert({
|
||||
type: 'success',
|
||||
text: this.$t('unverified')
|
||||
});
|
||||
};
|
||||
|
||||
await process().catch(e => {
|
||||
//this.$root.os.apis.dialog({ text: `Failed: ${e}` });
|
||||
this.$root.alert({
|
||||
type: 'error',
|
||||
text: e.toString()
|
||||
});
|
||||
});
|
||||
|
||||
this.unverifying = false;
|
||||
@ -99,13 +112,19 @@ export default Vue.extend({
|
||||
this.suspending = true;
|
||||
|
||||
const process = async () => {
|
||||
const user = await this.$root.os.api('users/show', parseAcct(this.suspendUsername));
|
||||
await this.$root.os.api('admin/suspend-user', { userId: user.id });
|
||||
//this.$root.os.apis.dialog({ text: this.$t('suspended') });
|
||||
const user = await this.$root.api('users/show', parseAcct(this.suspendUsername));
|
||||
await this.$root.api('admin/suspend-user', { userId: user.id });
|
||||
this.$root.alert({
|
||||
type: 'success',
|
||||
text: this.$t('suspended')
|
||||
});
|
||||
};
|
||||
|
||||
await process().catch(e => {
|
||||
//this.$root.os.apis.dialog({ text: `Failed: ${e}` });
|
||||
this.$root.alert({
|
||||
type: 'error',
|
||||
text: e.toString()
|
||||
});
|
||||
});
|
||||
|
||||
this.suspending = false;
|
||||
@ -115,13 +134,19 @@ export default Vue.extend({
|
||||
this.unsuspending = true;
|
||||
|
||||
const process = async () => {
|
||||
const user = await this.$root.os.api('users/show', parseAcct(this.unsuspendUsername));
|
||||
await this.$root.os.api('admin/unsuspend-user', { userId: user.id });
|
||||
//this.$root.os.apis.dialog({ text: this.$t('unsuspended') });
|
||||
const user = await this.$root.api('users/show', parseAcct(this.unsuspendUsername));
|
||||
await this.$root.api('admin/unsuspend-user', { userId: user.id });
|
||||
this.$root.alert({
|
||||
type: 'success',
|
||||
text: this.$t('unsuspended')
|
||||
});
|
||||
};
|
||||
|
||||
await process().catch(e => {
|
||||
//this.$root.os.apis.dialog({ text: `Failed: ${e}` });
|
||||
this.$root.alert({
|
||||
type: 'error',
|
||||
text: e.toString()
|
||||
});
|
||||
});
|
||||
|
||||
this.unsuspending = false;
|
||||
|
@ -123,29 +123,3 @@ pre
|
||||
|
||||
[data-icon]
|
||||
display inline-block
|
||||
|
||||
.swal2-container
|
||||
z-index 10000 !important
|
||||
|
||||
&.swal2-shown
|
||||
background-color rgba(0, 0, 0, 0.5) !important
|
||||
|
||||
.swal2-popup
|
||||
background var(--face) !important
|
||||
|
||||
.swal2-content
|
||||
color var(--text) !important
|
||||
|
||||
.swal2-confirm
|
||||
background-color var(--primary) !important
|
||||
border-left-color var(--primary) !important
|
||||
border-right-color var(--primary) !important
|
||||
color var(--primaryForeground) !important
|
||||
|
||||
&:hover
|
||||
background-image none !important
|
||||
background-color var(--primaryDarken5) !important
|
||||
|
||||
&:active
|
||||
background-image none !important
|
||||
background-color var(--primaryDarken5) !important
|
||||
|
@ -9,14 +9,11 @@ import './style.styl';
|
||||
|
||||
import init from '../init';
|
||||
import Index from './views/index.vue';
|
||||
import * as config from '../config';
|
||||
|
||||
/**
|
||||
* init
|
||||
*/
|
||||
init(launch => {
|
||||
document.title = `${config.name} | %i18n:common.application-authorization%`;
|
||||
|
||||
// Init router
|
||||
const router = new VueRouter({
|
||||
mode: 'history',
|
||||
|
@ -43,6 +43,9 @@
|
||||
if (`${url.pathname}/`.startsWith('/admin/')) app = 'admin';
|
||||
//#endregion
|
||||
|
||||
// Script version
|
||||
const ver = localStorage.getItem('v') || VERSION;
|
||||
|
||||
//#region Detect the user language
|
||||
let lang = null;
|
||||
|
||||
@ -67,7 +70,7 @@
|
||||
|
||||
let locale = localStorage.getItem('locale');
|
||||
if (locale == null) {
|
||||
const locale = await fetch(`/assets/locales/${lang}.json`)
|
||||
const locale = await fetch(`/assets/locales/${lang}.json?ver=${ver}`)
|
||||
.then(response => response.json());
|
||||
|
||||
localStorage.setItem('locale', JSON.stringify(locale));
|
||||
@ -98,9 +101,6 @@
|
||||
app = isMobile ? 'mobile' : 'desktop';
|
||||
}
|
||||
|
||||
// Script version
|
||||
const ver = localStorage.getItem('v') || VERSION;
|
||||
|
||||
// Get salt query
|
||||
const salt = localStorage.getItem('salt')
|
||||
? `?salt=${localStorage.getItem('salt')}`
|
||||
|
@ -66,7 +66,7 @@ export default function<T extends object>(data: {
|
||||
|
||||
this.bakeProps();
|
||||
|
||||
(this as any).api('i/update_widget', {
|
||||
this.$root.api('i/update_widget', {
|
||||
id: this.id,
|
||||
data: this.props
|
||||
});
|
||||
|
@ -22,7 +22,7 @@ export default async function($root: any, force = false, silent = false) {
|
||||
}
|
||||
|
||||
if (!silent) {
|
||||
$root.$dialog({
|
||||
$root.alert({
|
||||
title: $root.$t('@.update-available-title'),
|
||||
text: $root.$t('@.update-available', { newer, current })
|
||||
});
|
||||
|
@ -4,12 +4,9 @@ export default ($root: any) => {
|
||||
require('fuckadblock');
|
||||
|
||||
function adBlockDetected() {
|
||||
$root.$dialog({
|
||||
$root.alert({
|
||||
title: $root.$t('@.adblock.detected'),
|
||||
text: $root.$t('@.adblock.warning'),
|
||||
actins: [{
|
||||
text: 'OK'
|
||||
}]
|
||||
text: $root.$t('@.adblock.warning')
|
||||
});
|
||||
}
|
||||
|
||||
|
@ -3,7 +3,6 @@ import { sum } from '../../../../prelude/array';
|
||||
import shouldMuteNote from './should-mute-note';
|
||||
import MkNoteMenu from '../views/components/note-menu.vue';
|
||||
import MkReactionPicker from '../views/components/reaction-picker.vue';
|
||||
import Ok from '../views/components/ok.vue';
|
||||
|
||||
function focus(el, fn) {
|
||||
const target = fn(el);
|
||||
@ -142,7 +141,10 @@ export default (opts: Opts = {}) => ({
|
||||
this.$root.api('notes/favorites/create', {
|
||||
noteId: this.appearNote.id
|
||||
}).then(() => {
|
||||
this.$root.new(Ok);
|
||||
this.$root.alert({
|
||||
type: 'success',
|
||||
splash: true
|
||||
});
|
||||
});
|
||||
},
|
||||
|
||||
|
197
src/client/app/common/views/components/alert.vue
Normal file
197
src/client/app/common/views/components/alert.vue
Normal file
@ -0,0 +1,197 @@
|
||||
<template>
|
||||
<div class="felqjxyj" :class="{ splash }">
|
||||
<div class="bg" ref="bg" @click="onBgClick"></div>
|
||||
<div class="main" ref="main">
|
||||
<div class="icon" :class="type"><fa :icon="icon"/></div>
|
||||
<header v-if="title" v-html="title"></header>
|
||||
<div class="body" v-if="text" v-html="text"></div>
|
||||
<ui-horizon-group no-grow class="buttons" v-if="!splash">
|
||||
<ui-button @click="ok" primary autofocus>OK</ui-button>
|
||||
<ui-button @click="cancel" v-if="showCancelButton">Cancel</ui-button>
|
||||
</ui-horizon-group>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script lang="ts">
|
||||
import Vue from 'vue';
|
||||
import * as anime from 'animejs';
|
||||
import { faTimesCircle, faQuestionCircle } from '@fortawesome/free-regular-svg-icons';
|
||||
|
||||
export default Vue.extend({
|
||||
props: {
|
||||
type: {
|
||||
type: String,
|
||||
required: false,
|
||||
default: 'info'
|
||||
},
|
||||
title: {
|
||||
type: String,
|
||||
required: false
|
||||
},
|
||||
text: {
|
||||
type: String,
|
||||
required: false
|
||||
},
|
||||
showCancelButton: {
|
||||
type: Boolean,
|
||||
default: false
|
||||
},
|
||||
splash: {
|
||||
type: Boolean,
|
||||
default: false
|
||||
}
|
||||
},
|
||||
|
||||
computed: {
|
||||
icon(): any {
|
||||
switch (this.type) {
|
||||
case 'success': return 'check';
|
||||
case 'error': return faTimesCircle;
|
||||
case 'warning': return 'exclamation-triangle';
|
||||
case 'info': return 'info-circle';
|
||||
case 'question': return faQuestionCircle;
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
mounted() {
|
||||
this.$nextTick(() => {
|
||||
(this.$refs.bg as any).style.pointerEvents = 'auto';
|
||||
anime({
|
||||
targets: this.$refs.bg,
|
||||
opacity: 1,
|
||||
duration: 100,
|
||||
easing: 'linear'
|
||||
});
|
||||
|
||||
anime({
|
||||
targets: this.$refs.main,
|
||||
opacity: 1,
|
||||
scale: [1.2, 1],
|
||||
duration: 300,
|
||||
easing: [0, 0.5, 0.5, 1]
|
||||
});
|
||||
|
||||
if (this.splash) {
|
||||
setTimeout(() => {
|
||||
this.close();
|
||||
}, 1000);
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
methods: {
|
||||
ok() {
|
||||
this.$emit('ok');
|
||||
this.close();
|
||||
},
|
||||
|
||||
cancel() {
|
||||
this.$emit('cancel');
|
||||
this.close();
|
||||
},
|
||||
|
||||
close() {
|
||||
(this.$refs.bg 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,
|
||||
scale: 0.8,
|
||||
duration: 300,
|
||||
easing: [0, 0.5, 0.5, 1],
|
||||
complete: () => this.destroyDom()
|
||||
});
|
||||
},
|
||||
|
||||
onBgClick() {
|
||||
this.cancel();
|
||||
}
|
||||
}
|
||||
});
|
||||
</script>
|
||||
|
||||
<style lang="stylus" scoped>
|
||||
.felqjxyj
|
||||
display flex
|
||||
align-items center
|
||||
justify-content center
|
||||
position fixed
|
||||
z-index 30000
|
||||
top 0
|
||||
left 0
|
||||
width 100%
|
||||
height 100%
|
||||
|
||||
&.splash
|
||||
&, *
|
||||
pointer-events none !important
|
||||
|
||||
> .main
|
||||
min-width 0
|
||||
width initial
|
||||
|
||||
> .bg
|
||||
display block
|
||||
position fixed
|
||||
top 0
|
||||
left 0
|
||||
width 100%
|
||||
height 100%
|
||||
background rgba(#000, 0.7)
|
||||
opacity 0
|
||||
pointer-events none
|
||||
|
||||
> .main
|
||||
display block
|
||||
position fixed
|
||||
margin auto
|
||||
padding 32px
|
||||
min-width 320px
|
||||
max-width 480px
|
||||
width calc(100% - 32px)
|
||||
text-align center
|
||||
background var(--face)
|
||||
border-radius 8px
|
||||
color var(--faceText)
|
||||
opacity 0
|
||||
|
||||
> .icon
|
||||
font-size 32px
|
||||
|
||||
&.success
|
||||
color #37ec92
|
||||
|
||||
&.error
|
||||
color #ec4137
|
||||
|
||||
&.warning
|
||||
color #ecb637
|
||||
|
||||
> *
|
||||
display block
|
||||
margin 0 auto
|
||||
|
||||
> header
|
||||
margin 16px 0 8px 0
|
||||
font-weight bold
|
||||
font-size 20px
|
||||
|
||||
& + .body
|
||||
margin-top 8px
|
||||
|
||||
> .body
|
||||
margin 16px 0
|
||||
|
||||
> .buttons
|
||||
margin-top 16px
|
||||
|
||||
</style>
|
64
src/client/app/common/views/components/discord-setting.vue
Normal file
64
src/client/app/common/views/components/discord-setting.vue
Normal file
@ -0,0 +1,64 @@
|
||||
<template>
|
||||
<div class="mk-discord-setting">
|
||||
<p>{{ $t('description') }}</p>
|
||||
<p class="account" v-if="$store.state.i.discord" :title="`Discord ID: ${$store.state.i.discord.id}`">{{ $t('connected-to') }}: <a :href="`https://discordapp.com/users/${$store.state.i.discord.id}`" target="_blank">@{{ $store.state.i.discord.username }}#{{ $store.state.i.discord.discriminator }}</a></p>
|
||||
<p>
|
||||
<a :href="`${apiUrl}/connect/discord`" target="_blank" @click.prevent="connect">{{ $store.state.i.discord ? this.$t('reconnect') : this.$t('connect') }}</a>
|
||||
<span v-if="$store.state.i.discord"> or </span>
|
||||
<a :href="`${apiUrl}/disconnect/discord`" target="_blank" v-if="$store.state.i.discord" @click.prevent="disconnect">{{ $t('disconnect') }}</a>
|
||||
</p>
|
||||
<p class="id" v-if="$store.state.i.discord">Discord ID: {{ $store.state.i.discord.id }}</p>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script lang="ts">
|
||||
import Vue from 'vue';
|
||||
import i18n from '../../../i18n';
|
||||
import { apiUrl } from '../../../config';
|
||||
|
||||
export default Vue.extend({
|
||||
i18n: i18n('common/views/components/discord-setting.vue'),
|
||||
data() {
|
||||
return {
|
||||
form: null,
|
||||
apiUrl
|
||||
};
|
||||
},
|
||||
mounted() {
|
||||
this.$watch('$store.state.i', () => {
|
||||
if (this.$store.state.i.discord && this.form)
|
||||
this.form.close();
|
||||
}, {
|
||||
deep: true
|
||||
});
|
||||
},
|
||||
methods: {
|
||||
connect() {
|
||||
this.form = window.open(apiUrl + '/connect/discord',
|
||||
'discord_connect_window',
|
||||
'height=570, width=520');
|
||||
},
|
||||
|
||||
disconnect() {
|
||||
window.open(apiUrl + '/disconnect/discord',
|
||||
'discord_disconnect_window',
|
||||
'height=570, width=520');
|
||||
}
|
||||
}
|
||||
});
|
||||
</script>
|
||||
|
||||
<style lang="stylus" scoped>
|
||||
.mk-discord-setting
|
||||
.account
|
||||
border solid 1px #e1e8ed
|
||||
border-radius 4px
|
||||
padding 16px
|
||||
|
||||
a
|
||||
font-weight bold
|
||||
color inherit
|
||||
|
||||
.id
|
||||
color #8899a6
|
||||
</style>
|
@ -37,6 +37,8 @@
|
||||
import Vue from 'vue';
|
||||
import i18n from '../../../i18n';
|
||||
import { lib } from 'emojilib';
|
||||
import { faAsterisk, faLeaf, faUtensils, faFutbol, faCity, faDice } from '@fortawesome/free-solid-svg-icons';
|
||||
import { faHeart, faFlag } from '@fortawesome/free-regular-svg-icons';
|
||||
|
||||
export default Vue.extend({
|
||||
i18n: i18n('common/views/components/emoji-picker.vue'),
|
||||
@ -48,7 +50,7 @@ export default Vue.extend({
|
||||
categories: [{
|
||||
ref: 'customEmojiSection',
|
||||
text: this.$t('custom-emoji'),
|
||||
icon: ['fas', 'asterisk'],
|
||||
icon: faAsterisk,
|
||||
isActive: true
|
||||
}, {
|
||||
name: 'people',
|
||||
@ -60,43 +62,43 @@ export default Vue.extend({
|
||||
name: 'animals_and_nature',
|
||||
ref: 'animalsAndNatureSection',
|
||||
text: this.$t('animals-and-nature'),
|
||||
icon: ['fas', 'leaf'],
|
||||
icon: faLeaf,
|
||||
isActive: false
|
||||
}, {
|
||||
name: 'food_and_drink',
|
||||
ref: 'foodAndDrinkSection',
|
||||
text: this.$t('food-and-drink'),
|
||||
icon: ['fas', 'utensils'],
|
||||
icon: faUtensils,
|
||||
isActive: false
|
||||
}, {
|
||||
name: 'activity',
|
||||
ref: 'activitySection',
|
||||
text: this.$t('activity'),
|
||||
icon: ['fas', 'futbol'],
|
||||
icon: faFutbol,
|
||||
isActive: false
|
||||
}, {
|
||||
name: 'travel_and_places',
|
||||
ref: 'travelAndPlacesSection',
|
||||
text: this.$t('travel-and-places'),
|
||||
icon: ['fas', 'city'],
|
||||
icon: faCity,
|
||||
isActive: false
|
||||
}, {
|
||||
name: 'objects',
|
||||
ref: 'objectsSection',
|
||||
text: this.$t('objects'),
|
||||
icon: ['fas', 'poo-storm'],
|
||||
icon: faDice,
|
||||
isActive: false
|
||||
}, {
|
||||
name: 'symbols',
|
||||
ref: 'symbolsSection',
|
||||
text: this.$t('symbols'),
|
||||
icon: ['far', 'heart'],
|
||||
icon: faHeart,
|
||||
isActive: false
|
||||
}, {
|
||||
name: 'flags',
|
||||
ref: 'flagsSection',
|
||||
text: this.$t('flags'),
|
||||
icon: ['far', 'flag'],
|
||||
icon: faFlag,
|
||||
isActive: false
|
||||
}]
|
||||
}
|
||||
|
184
src/client/app/common/views/components/follow-button.vue
Normal file
184
src/client/app/common/views/components/follow-button.vue
Normal file
@ -0,0 +1,184 @@
|
||||
<template>
|
||||
<button class="wfliddvnhxvyusikowhxozkyxyenqxqr"
|
||||
:class="{ wait, block, mini, active: isFollowing || hasPendingFollowRequestFromYou }"
|
||||
@click="onClick"
|
||||
:disabled="wait"
|
||||
>
|
||||
<template v-if="!wait">
|
||||
<fa :icon="iconAndText[0]"/> <template v-if="!mini">{{ iconAndText[1] }}</template>
|
||||
</template>
|
||||
<template v-else><fa icon="spinner" pulse fixed-width/></template>
|
||||
</button>
|
||||
</template>
|
||||
|
||||
<script lang="ts">
|
||||
import Vue from 'vue';
|
||||
import i18n from '../../../i18n';
|
||||
|
||||
export default Vue.extend({
|
||||
i18n: i18n('common/views/components/follow-button.vue'),
|
||||
|
||||
props: {
|
||||
user: {
|
||||
type: Object,
|
||||
required: true
|
||||
},
|
||||
block: {
|
||||
type: Boolean,
|
||||
required: false,
|
||||
default: false
|
||||
},
|
||||
mini: {
|
||||
type: Boolean,
|
||||
required: false,
|
||||
default: false
|
||||
}
|
||||
},
|
||||
|
||||
data() {
|
||||
return {
|
||||
isFollowing: this.user.isFollowing,
|
||||
hasPendingFollowRequestFromYou: this.user.hasPendingFollowRequestFromYou,
|
||||
wait: false,
|
||||
connection: null
|
||||
};
|
||||
},
|
||||
|
||||
computed: {
|
||||
iconAndText(): any[] {
|
||||
return (
|
||||
(this.hasPendingFollowRequestFromYou && this.user.isLocked) ? ['hourglass-half', this.$t('request-pending')] :
|
||||
(this.hasPendingFollowRequestFromYou && !this.user.isLocked) ? ['hourglass-start', this.$t('follow-processing')] :
|
||||
(this.isFollowing) ? ['minus', this.$t('following')] :
|
||||
(!this.isFollowing && this.user.isLocked) ? ['plus', this.$t('follow-request')] :
|
||||
(!this.isFollowing && !this.user.isLocked) ? ['plus', this.$t('follow')] :
|
||||
[]
|
||||
);
|
||||
}
|
||||
},
|
||||
|
||||
mounted() {
|
||||
this.connection = this.$root.stream.useSharedConnection('main');
|
||||
|
||||
this.connection.on('follow', this.onFollowChange);
|
||||
this.connection.on('unfollow', this.onFollowChange);
|
||||
},
|
||||
|
||||
beforeDestroy() {
|
||||
this.connection.dispose();
|
||||
},
|
||||
|
||||
methods: {
|
||||
onFollowChange(user) {
|
||||
if (user.id == this.user.id) {
|
||||
this.isFollowing = user.isFollowing;
|
||||
this.hasPendingFollowRequestFromYou = user.hasPendingFollowRequestFromYou;
|
||||
}
|
||||
},
|
||||
|
||||
async onClick() {
|
||||
this.wait = true;
|
||||
|
||||
try {
|
||||
if (this.isFollowing) {
|
||||
await this.$root.api('following/delete', {
|
||||
userId: this.user.id
|
||||
});
|
||||
} else {
|
||||
if (this.hasPendingFollowRequestFromYou) {
|
||||
await this.$root.api('following/requests/cancel', {
|
||||
userId: this.user.id
|
||||
});
|
||||
} else if (this.user.isLocked) {
|
||||
await this.$root.api('following/create', {
|
||||
userId: this.user.id
|
||||
});
|
||||
this.hasPendingFollowRequestFromYou = true;
|
||||
} else {
|
||||
await this.$root.api('following/create', {
|
||||
userId: this.user.id
|
||||
});
|
||||
this.hasPendingFollowRequestFromYou = true;
|
||||
}
|
||||
}
|
||||
} catch (e) {
|
||||
console.error(e);
|
||||
} finally {
|
||||
this.wait = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
</script>
|
||||
|
||||
<style lang="stylus" scoped>
|
||||
.wfliddvnhxvyusikowhxozkyxyenqxqr
|
||||
display block
|
||||
user-select none
|
||||
cursor pointer
|
||||
padding 0 16px
|
||||
margin 0
|
||||
min-width 100px
|
||||
line-height 36px
|
||||
font-size 14px
|
||||
font-weight bold
|
||||
color var(--primary)
|
||||
background transparent
|
||||
outline none
|
||||
border solid 1px var(--primary)
|
||||
border-radius 36px
|
||||
|
||||
&.mini
|
||||
padding 0
|
||||
min-width 0
|
||||
width 32px
|
||||
height 32px
|
||||
font-size 16px
|
||||
border-radius 4px
|
||||
line-height 32px
|
||||
|
||||
&:focus
|
||||
&:after
|
||||
border-radius 8px
|
||||
|
||||
&.block
|
||||
width 100%
|
||||
|
||||
&:focus
|
||||
&:after
|
||||
content ""
|
||||
pointer-events none
|
||||
position absolute
|
||||
top -5px
|
||||
right -5px
|
||||
bottom -5px
|
||||
left -5px
|
||||
border 2px solid var(--primaryAlpha03)
|
||||
border-radius 36px
|
||||
|
||||
&:hover
|
||||
background var(--primaryAlpha01)
|
||||
|
||||
&:active
|
||||
background var(--primaryAlpha02)
|
||||
|
||||
&.active
|
||||
color var(--primaryForeground)
|
||||
background var(--primary)
|
||||
|
||||
&:hover
|
||||
background var(--primaryLighten10)
|
||||
border-color var(--primaryLighten10)
|
||||
|
||||
&:active
|
||||
background var(--primaryDarken10)
|
||||
border-color var(--primaryDarken10)
|
||||
|
||||
&.wait
|
||||
cursor wait !important
|
||||
opacity 0.7
|
||||
|
||||
*
|
||||
pointer-events none
|
||||
|
||||
</style>
|
@ -1,6 +1,6 @@
|
||||
<template>
|
||||
<div class="mk-github-setting">
|
||||
<p>{{ $t('description') }}<a :href="`${docsUrl}/link-to-github`" target="_blank">{{ $t('detail') }}</a></p>
|
||||
<p>{{ $t('description') }}</p>
|
||||
<p class="account" v-if="$store.state.i.github" :title="`GitHub ID: ${$store.state.i.github.id}`">{{ $t('connected-to') }}: <a :href="`https://github.com/${$store.state.i.github.login}`" target="_blank">@{{ $store.state.i.github.login }}</a></p>
|
||||
<p>
|
||||
<a :href="`${apiUrl}/connect/github`" target="_blank" @click.prevent="connect">{{ $store.state.i.github ? this.$t('reconnect') : this.$t('connect') }}</a>
|
||||
@ -14,15 +14,14 @@
|
||||
<script lang="ts">
|
||||
import Vue from 'vue';
|
||||
import i18n from '../../../i18n';
|
||||
import { apiUrl, docsUrl } from '../../../config';
|
||||
import { apiUrl } from '../../../config';
|
||||
|
||||
export default Vue.extend({
|
||||
i18n: i18n('common/views/components/github-setting.vue'),
|
||||
data() {
|
||||
return {
|
||||
form: null,
|
||||
apiUrl,
|
||||
docsUrl
|
||||
apiUrl
|
||||
};
|
||||
},
|
||||
mounted() {
|
||||
|
@ -1,13 +1,8 @@
|
||||
import Vue from 'vue';
|
||||
|
||||
import muteAndBlock from './mute-and-block.vue';
|
||||
import followButton from './follow-button.vue';
|
||||
import error from './error.vue';
|
||||
import apiSettings from './api-settings.vue';
|
||||
import passwordSettings from './password-settings.vue';
|
||||
import driveSettings from './drive-settings.vue';
|
||||
import profileEditor from './profile-editor.vue';
|
||||
import noteSkeleton from './note-skeleton.vue';
|
||||
import theme from './theme.vue';
|
||||
import instance from './instance.vue';
|
||||
import cwButton from './cw-button.vue';
|
||||
import tagCloud from './tag-cloud.vue';
|
||||
@ -27,14 +22,11 @@ import pollEditor from './poll-editor.vue';
|
||||
import reactionIcon from './reaction-icon.vue';
|
||||
import reactionsViewer from './reactions-viewer.vue';
|
||||
import time from './time.vue';
|
||||
import timer from './timer.vue';
|
||||
import mediaList from './media-list.vue';
|
||||
import uploader from './uploader.vue';
|
||||
import streamIndicator from './stream-indicator.vue';
|
||||
import ellipsis from './ellipsis.vue';
|
||||
import urlPreview from './url-preview.vue';
|
||||
import twitterSetting from './twitter-setting.vue';
|
||||
import githubSetting from './github-setting.vue';
|
||||
import fileTypeIcon from './file-type-icon.vue';
|
||||
import emoji from './emoji.vue';
|
||||
import welcomeTimeline from './welcome-timeline.vue';
|
||||
@ -51,14 +43,9 @@ import uiInfo from './ui/info.vue';
|
||||
import formButton from './ui/form/button.vue';
|
||||
import formRadio from './ui/form/radio.vue';
|
||||
|
||||
Vue.component('mk-mute-and-block', muteAndBlock);
|
||||
Vue.component('mk-follow-button', followButton);
|
||||
Vue.component('mk-error', error);
|
||||
Vue.component('mk-api-settings', apiSettings);
|
||||
Vue.component('mk-password-settings', passwordSettings);
|
||||
Vue.component('mk-drive-settings', driveSettings);
|
||||
Vue.component('mk-profile-editor', profileEditor);
|
||||
Vue.component('mk-note-skeleton', noteSkeleton);
|
||||
Vue.component('mk-theme', theme);
|
||||
Vue.component('mk-instance', instance);
|
||||
Vue.component('mk-cw-button', cwButton);
|
||||
Vue.component('mk-tag-cloud', tagCloud);
|
||||
@ -78,14 +65,11 @@ Vue.component('mk-poll-editor', pollEditor);
|
||||
Vue.component('mk-reaction-icon', reactionIcon);
|
||||
Vue.component('mk-reactions-viewer', reactionsViewer);
|
||||
Vue.component('mk-time', time);
|
||||
Vue.component('mk-timer', timer);
|
||||
Vue.component('mk-media-list', mediaList);
|
||||
Vue.component('mk-uploader', uploader);
|
||||
Vue.component('mk-stream-indicator', streamIndicator);
|
||||
Vue.component('mk-ellipsis', ellipsis);
|
||||
Vue.component('mk-url-preview', urlPreview);
|
||||
Vue.component('mk-twitter-setting', twitterSetting);
|
||||
Vue.component('mk-github-setting', githubSetting);
|
||||
Vue.component('mk-file-type-icon', fileTypeIcon);
|
||||
Vue.component('mk-emoji', emoji);
|
||||
Vue.component('mk-welcome-timeline', welcomeTimeline);
|
||||
|
@ -8,7 +8,7 @@
|
||||
<p class="empty" v-if="!init && messages.length == 0"><fa icon="info-circle"/>{{ $t('empty') }}</p>
|
||||
<p class="no-history" v-if="!init && messages.length > 0 && !existMoreMessages"><fa icon="flag"/>{{ $t('no-history') }}</p>
|
||||
<button class="more" :class="{ fetching: fetchingMoreMessages }" v-if="existMoreMessages" @click="fetchMoreMessages" :disabled="fetchingMoreMessages">
|
||||
<template v-if="fetchingMoreMessages"><fa icon="spinner .pulse" fixed-width/></template>{{ fetchingMoreMessages ? $t('@.loading') : $t('@.load-more') }}
|
||||
<template v-if="fetchingMoreMessages"><fa icon="spinner" pulse fixed-width/></template>{{ fetchingMoreMessages ? $t('@.loading') : $t('@.load-more') }}
|
||||
</button>
|
||||
<template v-for="(message, i) in _messages">
|
||||
<x-message :message="message" :key="message.id"/>
|
||||
@ -20,7 +20,7 @@
|
||||
<footer>
|
||||
<transition name="fade">
|
||||
<div class="new-message" v-show="showIndicator">
|
||||
<button @click="onIndicatorClick"><i><fa icon="arrow-circle-down"/></i>{{ $t('new-message') }}</button>
|
||||
<button @click="onIndicatorClick"><i><fa :icon="faArrowCircleDown"/></i>{{ $t('new-message') }}</button>
|
||||
</div>
|
||||
</transition>
|
||||
<x-form :user="user" ref="form"/>
|
||||
@ -34,6 +34,7 @@ import i18n from '../../../i18n';
|
||||
import XMessage from './messaging-room.message.vue';
|
||||
import XForm from './messaging-room.form.vue';
|
||||
import { url } from '../../../config';
|
||||
import { faArrowCircleDown } from '@fortawesome/free-solid-svg-icons';
|
||||
|
||||
export default Vue.extend({
|
||||
i18n: i18n('common/views/components/messaging-room.vue'),
|
||||
@ -52,7 +53,8 @@ export default Vue.extend({
|
||||
existMoreMessages: false,
|
||||
connection: null,
|
||||
showIndicator: false,
|
||||
timer: null
|
||||
timer: null,
|
||||
faArrowCircleDown
|
||||
};
|
||||
},
|
||||
|
||||
|
@ -45,7 +45,7 @@
|
||||
</template>
|
||||
</div>
|
||||
<p class="no-history" v-if="!fetching && messages.length == 0">{{ $t('no-history') }}</p>
|
||||
<p class="fetching" v-if="fetching"><fa icon="spinner .pulse" fixed-width/>{{ $t('@.loading') }}<mk-ellipsis/></p>
|
||||
<p class="fetching" v-if="fetching"><fa icon="spinner" pulse fixed-width/>{{ $t('@.loading') }}<mk-ellipsis/></p>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
|
@ -14,11 +14,12 @@
|
||||
<mk-time :time="note.createdAt"/>
|
||||
</router-link>
|
||||
<span class="visibility" v-if="note.visibility != 'public'">
|
||||
<template v-if="note.visibility == 'home'"><fa icon="home"/></template>
|
||||
<template v-if="note.visibility == 'followers'"><fa icon="unlock"/></template>
|
||||
<template v-if="note.visibility == 'specified'"><fa icon="envelope"/></template>
|
||||
<template v-if="note.visibility == 'private'"><fa icon="lock"/></template>
|
||||
<fa v-if="note.visibility == 'home'" icon="home"/>
|
||||
<fa v-if="note.visibility == 'followers'" icon="unlock"/>
|
||||
<fa v-if="note.visibility == 'specified'" icon="envelope"/>
|
||||
<fa v-if="note.visibility == 'private'" icon="lock"/>
|
||||
</span>
|
||||
<span class="localOnly" v-if="note.localOnly == true"><fa icon="heart"/></span>
|
||||
</div>
|
||||
</header>
|
||||
</template>
|
||||
@ -115,4 +116,7 @@ export default Vue.extend({
|
||||
> .visibility
|
||||
margin-left 8px
|
||||
|
||||
> .localOnly
|
||||
margin-left 4px
|
||||
|
||||
</style>
|
||||
|
@ -9,7 +9,6 @@ import Vue from 'vue';
|
||||
import i18n from '../../../i18n';
|
||||
import { url } from '../../../config';
|
||||
import copyToClipboard from '../../../common/scripts/copy-to-clipboard';
|
||||
import Ok from './ok.vue';
|
||||
import { concat, intersperse } from '../../../../../prelude/array';
|
||||
|
||||
export default Vue.extend({
|
||||
@ -56,7 +55,7 @@ export default Vue.extend({
|
||||
}
|
||||
] : []
|
||||
], [
|
||||
this.note.userId == this.$store.state.i.id || this.$store.state.i.isAdmin ? [{
|
||||
this.note.userId == this.$store.state.i.id || this.$store.state.i.isAdmin || this.$store.state.i.isModerator ? [{
|
||||
icon: ['far', 'trash-alt'],
|
||||
text: this.$t('delete'),
|
||||
action: this.del
|
||||
@ -79,7 +78,10 @@ export default Vue.extend({
|
||||
this.$root.api('i/pin', {
|
||||
noteId: this.note.id
|
||||
}).then(() => {
|
||||
this.$root.new(Ok);
|
||||
this.$root.alert({
|
||||
type: 'success',
|
||||
splash: true
|
||||
});
|
||||
this.destroyDom();
|
||||
});
|
||||
},
|
||||
@ -93,11 +95,18 @@ export default Vue.extend({
|
||||
},
|
||||
|
||||
del() {
|
||||
if (!window.confirm(this.$t('delete-confirm'))) return;
|
||||
this.$root.api('notes/delete', {
|
||||
noteId: this.note.id
|
||||
}).then(() => {
|
||||
this.destroyDom();
|
||||
this.$root.alert({
|
||||
type: 'warning',
|
||||
text: this.$t('delete-confirm'),
|
||||
showCancelButton: true
|
||||
}).then(res => {
|
||||
if (!res) return;
|
||||
|
||||
this.$root.api('notes/delete', {
|
||||
noteId: this.note.id
|
||||
}).then(() => {
|
||||
this.destroyDom();
|
||||
});
|
||||
});
|
||||
},
|
||||
|
||||
@ -105,7 +114,10 @@ export default Vue.extend({
|
||||
this.$root.api('notes/favorites/create', {
|
||||
noteId: this.note.id
|
||||
}).then(() => {
|
||||
this.$root.new(Ok);
|
||||
this.$root.alert({
|
||||
type: 'success',
|
||||
splash: true
|
||||
});
|
||||
this.destroyDom();
|
||||
});
|
||||
},
|
||||
@ -114,7 +126,10 @@ export default Vue.extend({
|
||||
this.$root.api('notes/favorites/delete', {
|
||||
noteId: this.note.id
|
||||
}).then(() => {
|
||||
this.$root.new(Ok);
|
||||
this.$root.alert({
|
||||
type: 'success',
|
||||
splash: true
|
||||
});
|
||||
this.destroyDom();
|
||||
});
|
||||
},
|
||||
|
@ -1,175 +0,0 @@
|
||||
<template>
|
||||
<div class="yvbkymdqeusiqucuuloahhiqflzinufs">
|
||||
<div class="bg" ref="bg"></div>
|
||||
<div class="body" ref="body">
|
||||
<div class="icon">
|
||||
<div class="circle left"></div>
|
||||
<span class="check tip"></span>
|
||||
<span class="check long"></span>
|
||||
<div class="ring"></div>
|
||||
<div class="fix"></div>
|
||||
<div class="circle right"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script lang="ts">
|
||||
import Vue from 'vue';
|
||||
import * as anime from 'animejs';
|
||||
|
||||
export default Vue.extend({
|
||||
mounted() {
|
||||
this.$nextTick(() => {
|
||||
anime({
|
||||
targets: this.$refs.bg,
|
||||
opacity: 1,
|
||||
duration: 300,
|
||||
easing: 'linear'
|
||||
});
|
||||
|
||||
anime({
|
||||
targets: this.$refs.body,
|
||||
opacity: 1,
|
||||
scale: [1.2, 1],
|
||||
duration: 300,
|
||||
easing: [0, 0.5, 0.5, 1]
|
||||
});
|
||||
});
|
||||
|
||||
setTimeout(() => {
|
||||
anime({
|
||||
targets: this.$refs.bg,
|
||||
opacity: 0,
|
||||
duration: 300,
|
||||
easing: 'linear'
|
||||
});
|
||||
|
||||
anime({
|
||||
targets: this.$refs.body,
|
||||
opacity: 0,
|
||||
scale: 0.8,
|
||||
duration: 300,
|
||||
easing: [0.5, 0, 1, 0.5],
|
||||
complete: () => this.destroyDom()
|
||||
});
|
||||
}, 1250);
|
||||
}
|
||||
});
|
||||
</script>
|
||||
|
||||
<style lang="stylus" scoped>
|
||||
.yvbkymdqeusiqucuuloahhiqflzinufs
|
||||
pointer-events none
|
||||
|
||||
> .bg
|
||||
display block
|
||||
position fixed
|
||||
z-index 10000
|
||||
top 0
|
||||
left 0
|
||||
width 100%
|
||||
height 100%
|
||||
background rgba(#000, 0.7)
|
||||
opacity 0
|
||||
|
||||
> .body
|
||||
position fixed
|
||||
z-index 10000
|
||||
top 0
|
||||
right 0
|
||||
left 0
|
||||
bottom 0
|
||||
margin auto
|
||||
width 150px
|
||||
height 150px
|
||||
background var(--face)
|
||||
border-radius 8px
|
||||
opacity 0
|
||||
|
||||
> .icon
|
||||
display flex
|
||||
justify-content center
|
||||
position absolute
|
||||
top 0
|
||||
right 0
|
||||
left 0
|
||||
bottom 0
|
||||
width 5em
|
||||
height 5em
|
||||
margin auto
|
||||
border .25em solid transparent
|
||||
border-radius 50%
|
||||
line-height 5em
|
||||
cursor default
|
||||
box-sizing content-box
|
||||
user-select none
|
||||
zoom normal
|
||||
border-color #a5dc86
|
||||
|
||||
> .circle
|
||||
position absolute
|
||||
width 3.75em
|
||||
height 7.5em
|
||||
transform rotate(45deg)
|
||||
border-radius 50%
|
||||
background var(--face)
|
||||
|
||||
&.left
|
||||
top -.4375em
|
||||
left -2.0635em
|
||||
transform rotate(-45deg)
|
||||
transform-origin 3.75em 3.75em
|
||||
border-radius 7.5em 0 0 7.5em
|
||||
|
||||
&.right
|
||||
top -.6875em
|
||||
left 1.875em
|
||||
transform rotate(-45deg)
|
||||
transform-origin 0 3.75em
|
||||
border-radius 0 7.5em 7.5em 0
|
||||
animation swal2-rotate-success-circular-line 4.25s ease-in
|
||||
|
||||
> .check
|
||||
display block
|
||||
position absolute
|
||||
height .3125em
|
||||
border-radius .125em
|
||||
background-color #a5dc86
|
||||
z-index 2
|
||||
|
||||
&.tip
|
||||
top 2.875em
|
||||
left .875em
|
||||
width 1.5625em
|
||||
transform rotate(45deg)
|
||||
animation swal2-animate-success-line-tip .75s
|
||||
|
||||
&.long
|
||||
top 2.375em
|
||||
right .5em
|
||||
width 2.9375em
|
||||
transform rotate(-45deg)
|
||||
animation swal2-animate-success-line-long .75s
|
||||
|
||||
> .fix
|
||||
position absolute
|
||||
top .5em
|
||||
left 1.625em
|
||||
width .4375em
|
||||
height 5.625em
|
||||
transform rotate(-45deg)
|
||||
z-index 1
|
||||
background var(--face)
|
||||
|
||||
> .ring
|
||||
position absolute
|
||||
top -.25em
|
||||
left -.25em
|
||||
width 100%
|
||||
height 100%
|
||||
border .25em solid rgba(165,220,134,.3)
|
||||
border-radius 50%
|
||||
z-index 2
|
||||
box-sizing content-box
|
||||
</style>
|
@ -25,12 +25,9 @@ export default Vue.extend({
|
||||
type: 'password'
|
||||
}).then(newPassword2 => {
|
||||
if (newPassword !== newPassword2) {
|
||||
this.$dialog({
|
||||
this.$root.alert({
|
||||
title: null,
|
||||
text: this.$t('not-match'),
|
||||
actions: [{
|
||||
text: 'OK'
|
||||
}]
|
||||
text: this.$t('not-match')
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
@ -193,7 +193,7 @@ export default Vue.extend({
|
||||
this.$store.state.i.bannerUrl = i.bannerUrl;
|
||||
|
||||
if (notify) {
|
||||
this.$swal({
|
||||
this.$root.alert({
|
||||
type: 'success',
|
||||
text: this.$t('saved')
|
||||
});
|
||||
@ -223,6 +223,5 @@ export default Vue.extend({
|
||||
width 72px
|
||||
height 72px
|
||||
margin auto
|
||||
box-shadow 0 0 16px rgba(0, 0, 0, 0.5)
|
||||
|
||||
</style>
|
||||
|
@ -14,6 +14,7 @@
|
||||
<ui-button type="submit" :disabled="signing">{{ signing ? $t('signing-in') : $t('signin') }}</ui-button>
|
||||
<p style="margin: 8px 0;"><a :href="`${apiUrl}/signin/twitter`">{{ $t('signin-with-twitter') }}</a></p>
|
||||
<p style="margin: 8px 0;"><a :href="`${apiUrl}/signin/github`">{{ $t('signin-with-github') }}</a></p>
|
||||
<p style="margin: 8px 0;"><a :href="`${apiUrl}/signin/discord`">{{ $t('signin-with-discord') /* TODO: Make these layouts better */ }}</a></p>
|
||||
</form>
|
||||
</template>
|
||||
|
||||
|
@ -10,7 +10,7 @@
|
||||
<span>{{ $t('username') }}</span>
|
||||
<span slot="prefix">@</span>
|
||||
<span slot="suffix">@{{ host }}</span>
|
||||
<p slot="desc" v-if="usernameState == 'wait'" style="color:#999"><fa icon="spinner .pulse" fixed-width/> {{ $t('checking') }}</p>
|
||||
<p slot="desc" v-if="usernameState == 'wait'" style="color:#999"><fa icon="spinner" pulse fixed-width/> {{ $t('checking') }}</p>
|
||||
<p slot="desc" v-if="usernameState == 'ok'" style="color:#3CB7B5"><fa icon="check" fixed-width/> {{ $t('available') }}</p>
|
||||
<p slot="desc" v-if="usernameState == 'unavailable'" style="color:#FF1161"><fa icon="exclamation-triangle" fixed-width/> {{ $t('unavailable') }}</p>
|
||||
<p slot="desc" v-if="usernameState == 'error'" style="color:#FF1161"><fa icon="exclamation-triangle" fixed-width/> {{ $t('error') }}</p>
|
||||
|
@ -1,11 +1,11 @@
|
||||
<template>
|
||||
<div class="mk-stream-indicator">
|
||||
<p v-if="stream.state == 'initializing'">
|
||||
<fa icon="spinner .pulse"/>
|
||||
<fa icon="spinner" pulse/>
|
||||
<span>{{ $t('connecting') }}<mk-ellipsis/></span>
|
||||
</p>
|
||||
<p v-if="stream.state == 'reconnecting'">
|
||||
<fa icon="spinner .pulse"/>
|
||||
<fa icon="spinner" pulse/>
|
||||
<span>{{ $t('reconnecting') }}<mk-ellipsis/></span>
|
||||
</p>
|
||||
<p v-if="stream.state == 'connected'">
|
||||
|
@ -1,6 +1,6 @@
|
||||
<template>
|
||||
<div class="jtivnzhfwquxpsfidertopbmwmchmnmo">
|
||||
<p class="fetching" v-if="fetching"><fa icon="spinner .pulse" fixed-width/>{{ $t('@.loading') }}<mk-ellipsis/></p>
|
||||
<p class="fetching" v-if="fetching"><fa icon="spinner" pulse fixed-width/>{{ $t('@.loading') }}<mk-ellipsis/></p>
|
||||
<p class="empty" v-else-if="tags.length == 0"><fa icon="exclamation-circle"/>{{ $t('empty') }}</p>
|
||||
<div v-else>
|
||||
<vue-word-cloud
|
||||
|
@ -1,7 +1,7 @@
|
||||
<template>
|
||||
<div class="nicnklzforebnpfgasiypmpdaaglujqm">
|
||||
<label>
|
||||
<span>{{ $t('light-theme') }}</span>
|
||||
<span><fa :icon="faSun"/> {{ $t('light-theme') }}</span>
|
||||
<ui-select v-model="light" :placeholder="$t('light-theme')">
|
||||
<optgroup :label="$t('light-themes')">
|
||||
<option v-for="x in lightThemes" :value="x.id" :key="x.id">{{ x.name }}</option>
|
||||
@ -13,7 +13,7 @@
|
||||
</label>
|
||||
|
||||
<label>
|
||||
<span>{{ $t('dark-theme') }}</span>
|
||||
<span><fa :icon="faMoon"/> {{ $t('dark-theme') }}</span>
|
||||
<ui-select v-model="dark" :placeholder="$t('dark-theme')">
|
||||
<optgroup :label="$t('dark-themes')">
|
||||
<option v-for="x in darkThemes" :value="x.id" :key="x.id">{{ x.name }}</option>
|
||||
@ -104,6 +104,7 @@ import { Chrome } from 'vue-color';
|
||||
import * as uuid from 'uuid';
|
||||
import * as tinycolor from 'tinycolor2';
|
||||
import * as JSON5 from 'json5';
|
||||
import { faMoon, faSun } from '@fortawesome/free-regular-svg-icons';
|
||||
|
||||
// 後方互換性のため
|
||||
function convertOldThemedefinition(t) {
|
||||
@ -135,7 +136,8 @@ export default Vue.extend({
|
||||
myThemeDesc: '',
|
||||
myThemePrimary: lightTheme.vars.primary,
|
||||
myThemeSecondary: lightTheme.vars.secondary,
|
||||
myThemeText: lightTheme.vars.text
|
||||
myThemeText: lightTheme.vars.text,
|
||||
faMoon, faSun
|
||||
};
|
||||
},
|
||||
|
||||
@ -221,7 +223,7 @@ export default Vue.extend({
|
||||
try {
|
||||
theme = JSON5.parse(code);
|
||||
} catch (e) {
|
||||
this.$swal({
|
||||
this.$root.alert({
|
||||
type: 'error',
|
||||
text: this.$t('invalid-theme')
|
||||
});
|
||||
@ -234,7 +236,7 @@ export default Vue.extend({
|
||||
}
|
||||
|
||||
if (theme.id == null) {
|
||||
this.$swal({
|
||||
this.$root.alert({
|
||||
type: 'error',
|
||||
text: this.$t('invalid-theme')
|
||||
});
|
||||
@ -242,7 +244,7 @@ export default Vue.extend({
|
||||
}
|
||||
|
||||
if (this.$store.state.device.themes.some(t => t.id == theme.id)) {
|
||||
this.$swal({
|
||||
this.$root.alert({
|
||||
type: 'info',
|
||||
text: this.$t('already-installed')
|
||||
});
|
||||
@ -254,7 +256,7 @@ export default Vue.extend({
|
||||
key: 'themes', value: themes
|
||||
});
|
||||
|
||||
this.$swal({
|
||||
this.$root.alert({
|
||||
type: 'success',
|
||||
text: this.$t('installed').replace('{}', theme.name)
|
||||
});
|
||||
@ -267,7 +269,7 @@ export default Vue.extend({
|
||||
key: 'themes', value: themes
|
||||
});
|
||||
|
||||
this.$swal({
|
||||
this.$root.alert({
|
||||
type: 'info',
|
||||
text: this.$t('uninstalled').replace('{}', theme.name)
|
||||
});
|
||||
@ -304,7 +306,7 @@ export default Vue.extend({
|
||||
const theme = this.myTheme;
|
||||
|
||||
if (theme.name == null || theme.name.trim() == '') {
|
||||
this.$swal({
|
||||
this.$root.alert({
|
||||
type: 'warning',
|
||||
text: this.$t('theme-name-required')
|
||||
});
|
||||
@ -318,7 +320,7 @@ export default Vue.extend({
|
||||
key: 'themes', value: themes
|
||||
});
|
||||
|
||||
this.$swal({
|
||||
this.$root.alert({
|
||||
type: 'success',
|
||||
text: this.$t('saved')
|
||||
});
|
||||
|
@ -1,49 +0,0 @@
|
||||
<template>
|
||||
<time class="mk-time">
|
||||
{{ hh }}:{{ mm }}:{{ ss }}
|
||||
</time>
|
||||
</template>
|
||||
|
||||
<script lang="ts">
|
||||
import Vue from 'vue';
|
||||
|
||||
export default Vue.extend({
|
||||
props: {
|
||||
time: {
|
||||
type: [Date, String],
|
||||
required: true
|
||||
}
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
tickId: null,
|
||||
hh: null,
|
||||
mm: null,
|
||||
ss: null
|
||||
};
|
||||
},
|
||||
computed: {
|
||||
_time(): Date {
|
||||
return typeof this.time == 'string' ? new Date(this.time) : this.time;
|
||||
}
|
||||
},
|
||||
created() {
|
||||
this.tick();
|
||||
this.tickId = setInterval(this.tick, 1000);
|
||||
},
|
||||
destroyed() {
|
||||
clearInterval(this.tickId);
|
||||
},
|
||||
methods: {
|
||||
tick() {
|
||||
const now = new Date().getTime();
|
||||
const start = this._time.getTime();
|
||||
const ago = Math.floor((now - start) / 1000);
|
||||
|
||||
this.hh = Math.floor(ago / (60 * 60)).toString().padStart(2, '0');
|
||||
this.mm = Math.floor(ago / 60).toString().padStart(2, '0');
|
||||
this.ss = (ago % 60).toString().padStart(2, '0');
|
||||
}
|
||||
}
|
||||
});
|
||||
</script>
|
@ -1,6 +1,6 @@
|
||||
<template>
|
||||
<div class="csqvmxybqbycalfhkxvyfrgbrdalkaoc">
|
||||
<p class="fetching" v-if="fetching"><fa icon="spinner .pulse" fixed-width/>{{ $t('@.loading') }}<mk-ellipsis/></p>
|
||||
<p class="fetching" v-if="fetching"><fa icon="spinner" pulse fixed-width/>{{ $t('@.loading') }}<mk-ellipsis/></p>
|
||||
<p class="empty" v-else-if="stats.length == 0"><fa icon="exclamation-circle"/>{{ $t('empty') }}</p>
|
||||
<!-- トランジションを有効にするとなぜかメモリリークする -->
|
||||
<transition-group v-else tag="div" name="chart">
|
||||
|
@ -1,6 +1,6 @@
|
||||
<template>
|
||||
<div class="mk-twitter-setting">
|
||||
<p>{{ $t('description') }}<a :href="`${docsUrl}/link-to-twitter`" target="_blank">{{ $t('detail') }}</a></p>
|
||||
<p>{{ $t('description') }}</p>
|
||||
<p class="account" v-if="$store.state.i.twitter" :title="`Twitter ID: ${$store.state.i.twitter.userId}`">{{ $t('connected-to') }}: <a :href="`https://twitter.com/${$store.state.i.twitter.screenName}`" target="_blank">@{{ $store.state.i.twitter.screenName }}</a></p>
|
||||
<p>
|
||||
<a :href="`${apiUrl}/connect/twitter`" target="_blank" @click.prevent="connect">{{ $store.state.i.twitter ? this.$t('reconnect') : this.$t('connect') }}</a>
|
||||
@ -14,15 +14,14 @@
|
||||
<script lang="ts">
|
||||
import Vue from 'vue';
|
||||
import i18n from '../../../i18n';
|
||||
import { apiUrl, docsUrl } from '../../../config';
|
||||
import { apiUrl } from '../../../config';
|
||||
|
||||
export default Vue.extend({
|
||||
i18n: i18n('common/views/components/twitter-setting.vue'),
|
||||
data() {
|
||||
return {
|
||||
form: null,
|
||||
apiUrl,
|
||||
docsUrl
|
||||
apiUrl
|
||||
};
|
||||
},
|
||||
mounted() {
|
||||
|
@ -38,12 +38,24 @@ export default Vue.extend({
|
||||
type: Boolean,
|
||||
required: false,
|
||||
default: false
|
||||
}
|
||||
},
|
||||
autofocus: {
|
||||
type: Boolean,
|
||||
required: false,
|
||||
default: false
|
||||
},
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
styl: 'fill'
|
||||
};
|
||||
},
|
||||
mounted() {
|
||||
if (this.autofocus) {
|
||||
this.$nextTick(() => {
|
||||
this.$el.focus();
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
</script>
|
||||
@ -57,6 +69,7 @@ export default Vue.extend({
|
||||
text-align center
|
||||
font-weight normal
|
||||
font-size 16px
|
||||
line-height 24px
|
||||
border none
|
||||
border-radius 6px
|
||||
outline none
|
||||
@ -85,6 +98,7 @@ export default Vue.extend({
|
||||
&.inline
|
||||
display inline-block
|
||||
width auto
|
||||
min-width 100px
|
||||
|
||||
&.primary
|
||||
font-weight bold
|
||||
|
@ -1,5 +1,5 @@
|
||||
<template>
|
||||
<div class="pfzekjfwkwvadvlujpdnnxfggqgqjoze" :class="{ inputs }">
|
||||
<div class="vnxwkwuf" :class="{ inputs, noGrow }">
|
||||
<slot></slot>
|
||||
</div>
|
||||
</template>
|
||||
@ -15,21 +15,27 @@ export default Vue.extend({
|
||||
type: Boolean,
|
||||
required: false,
|
||||
default: false
|
||||
},
|
||||
noGrow: {
|
||||
type: Boolean,
|
||||
required: false,
|
||||
default: false
|
||||
}
|
||||
}
|
||||
});
|
||||
</script>
|
||||
|
||||
<style lang="stylus" scoped>
|
||||
.pfzekjfwkwvadvlujpdnnxfggqgqjoze
|
||||
display flex
|
||||
|
||||
.vnxwkwuf
|
||||
&.inputs
|
||||
margin 32px 0
|
||||
|
||||
> *
|
||||
flex 1
|
||||
&:not(.noGrow)
|
||||
display flex
|
||||
|
||||
&:not(:last-child)
|
||||
margin-right 16px
|
||||
> *
|
||||
flex 1
|
||||
|
||||
> *:not(:last-child)
|
||||
margin-right 16px
|
||||
</style>
|
||||
|
@ -3,7 +3,7 @@
|
||||
<ol v-if="uploads.length > 0">
|
||||
<li v-for="ctx in uploads" :key="ctx.id">
|
||||
<div class="img" :style="{ backgroundImage: `url(${ ctx.img })` }"></div>
|
||||
<p class="name"><fa icon="spinner .pulse"/>{{ ctx.name }}</p>
|
||||
<p class="name"><fa icon="spinner" pulse/>{{ ctx.name }}</p>
|
||||
<p class="status">
|
||||
<span class="initing" v-if="ctx.progress == undefined">{{ $t('waiting') }}<mk-ellipsis/></span>
|
||||
<span class="kb" v-if="ctx.progress != undefined">{{ String(Math.floor(ctx.progress.value / 1024)).replace(/(\d)(?=(\d\d\d)+(?!\d))/g, '$1,') }}<i>KB</i> / {{ String(Math.floor(ctx.progress.max / 1024)).replace(/(\d)(?=(\d\d\d)+(?!\d))/g, '$1,') }}<i>KB</i></span>
|
||||
@ -57,17 +57,11 @@ export default Vue.extend({
|
||||
return;
|
||||
}
|
||||
|
||||
// Upload if the file didn't exist yet
|
||||
const buf = new Uint8Array(e.target.result);
|
||||
let bin = '';
|
||||
// We use for-of loop instead of apply() to avoid RangeError
|
||||
// SEE: https://stackoverflow.com/questions/9267899/arraybuffer-to-base64-encoded-string
|
||||
for (const byte of buf) bin += String.fromCharCode(byte);
|
||||
const ctx = {
|
||||
id: id,
|
||||
name: file.name || 'untitled',
|
||||
progress: undefined,
|
||||
img: 'data:*/*;base64,' + btoa(bin)
|
||||
img: window.URL.createObjectURL(file)
|
||||
};
|
||||
|
||||
this.uploads.push(ctx);
|
||||
|
@ -35,6 +35,24 @@
|
||||
<span>{{ $t('private') }}</span>
|
||||
</div>
|
||||
</div>
|
||||
<div @click="choose('local-public')" :class="{ active: v == 'local-public' }">
|
||||
<div><fa icon="globe"/></div>
|
||||
<div>
|
||||
<span>{{ $t('local-public') }}</span>
|
||||
</div>
|
||||
</div>
|
||||
<div @click="choose('local-home')" :class="{ active: v == 'local-home' }">
|
||||
<div><fa icon="home"/></div>
|
||||
<div>
|
||||
<span>{{ $t('local-home') }}</span>
|
||||
</div>
|
||||
</div>
|
||||
<div @click="choose('local-followers')" :class="{ active: v == 'local-followers' }">
|
||||
<div><fa icon="unlock"/></div>
|
||||
<div>
|
||||
<span>{{ $t('local-followers') }}</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
@ -25,7 +25,7 @@
|
||||
<template v-else-if="!user.isFollowing && user.isLocked"><fa icon="plus"/> {{ $t('follow-request') }}</template>
|
||||
<template v-else-if="!user.isFollowing && !user.isLocked"><fa icon="plus"/> {{ $t('follow') }}</template>
|
||||
</template>
|
||||
<template v-else><fa icon="spinner .pulse" fixed-width/></template>
|
||||
<template v-else><fa icon="spinner" pulse fixed-width/></template>
|
||||
</button>
|
||||
</div>
|
||||
</template>
|
||||
|
@ -3,9 +3,15 @@
|
||||
<mk-widget-container :show-header="props.design == 0" :naked="props.design == 2">
|
||||
<template slot="header"><fa icon="camera"/>{{ $t('title') }}</template>
|
||||
|
||||
<p :class="$style.fetching" v-if="fetching"><fa icon="spinner .pulse" fixed-width/>{{ $t('@.loading') }}<mk-ellipsis/></p>
|
||||
<p :class="$style.fetching" v-if="fetching"><fa icon="spinner" pulse fixed-width/>{{ $t('@.loading') }}<mk-ellipsis/></p>
|
||||
<div :class="$style.stream" v-if="!fetching && images.length > 0">
|
||||
<div v-for="image in images" :class="$style.img" :style="`background-image: url(${image.thumbnailUrl || image.url})`"></div>
|
||||
<div v-for="image in images"
|
||||
:class="$style.img"
|
||||
:style="`background-image: url(${image.thumbnailUrl || image.url})`"
|
||||
draggable="true"
|
||||
@dragstart="onDragstart(image, $event)"
|
||||
@dragend="onDragend"
|
||||
></div>
|
||||
</div>
|
||||
<p :class="$style.empty" v-if="!fetching && images.length == 0">{{ $t('no-photos') }}</p>
|
||||
</mk-widget-container>
|
||||
@ -31,6 +37,7 @@ export default define({
|
||||
connection: null
|
||||
};
|
||||
},
|
||||
|
||||
mounted() {
|
||||
this.connection = this.$root.stream.useSharedConnection('main');
|
||||
|
||||
@ -44,9 +51,11 @@ export default define({
|
||||
this.fetching = false;
|
||||
});
|
||||
},
|
||||
|
||||
beforeDestroy() {
|
||||
this.connection.dispose();
|
||||
},
|
||||
|
||||
methods: {
|
||||
onDriveFileCreated(file) {
|
||||
if (/^image\/.+$/.test(file.type)) {
|
||||
@ -54,6 +63,7 @@ export default define({
|
||||
if (this.images.length > 9) this.images.pop();
|
||||
}
|
||||
},
|
||||
|
||||
func() {
|
||||
if (this.props.design == 2) {
|
||||
this.props.design = 0;
|
||||
@ -62,7 +72,16 @@ export default define({
|
||||
}
|
||||
|
||||
this.save();
|
||||
}
|
||||
},
|
||||
|
||||
onDragstart(file, e) {
|
||||
e.dataTransfer.effectAllowed = 'move';
|
||||
e.dataTransfer.setData('mk_drive_file', JSON.stringify(file));
|
||||
},
|
||||
|
||||
onDragend(e) {
|
||||
this.browser.isDragSource = false;
|
||||
},
|
||||
}
|
||||
});
|
||||
</script>
|
||||
|
@ -5,7 +5,7 @@
|
||||
<button slot="func" title="設定" @click="setting"><fa icon="cog"/></button>
|
||||
|
||||
<div class="mkw-rss--body" :data-mobile="platform == 'mobile'">
|
||||
<p class="fetching" v-if="fetching"><fa icon="spinner .pulse" fixed-width/>{{ $t('@.loading') }}<mk-ellipsis/></p>
|
||||
<p class="fetching" v-if="fetching"><fa icon="spinner" pulse fixed-width/>{{ $t('@.loading') }}<mk-ellipsis/></p>
|
||||
<div class="feed" v-else>
|
||||
<a v-for="item in items" :href="item.link" target="_blank">{{ item.title }}</a>
|
||||
</div>
|
||||
|
@ -2,7 +2,7 @@
|
||||
<div class="memory">
|
||||
<x-pie class="pie" :value="usage"/>
|
||||
<div>
|
||||
<p><fa icon="flask"/>Memory</p>
|
||||
<p><fa icon="memory"/>Memory</p>
|
||||
<p>Total: {{ total | bytes(1) }}</p>
|
||||
<p>Used: {{ used | bytes(1) }}</p>
|
||||
<p>Free: {{ free | bytes(1) }}</p>
|
||||
|
@ -4,7 +4,7 @@
|
||||
<template slot="header"><fa icon="server"/>{{ $t('title') }}</template>
|
||||
<button slot="func" @click="toggle" :title="$t('toggle')"><fa icon="sort"/></button>
|
||||
|
||||
<p :class="$style.fetching" v-if="fetching"><fa icon="spinner .pulse" fixed-width/>{{ $t('@.loading') }}<mk-ellipsis/></p>
|
||||
<p :class="$style.fetching" v-if="fetching"><fa icon="spinner" pulse fixed-width/>{{ $t('@.loading') }}<mk-ellipsis/></p>
|
||||
<template v-if="!fetching">
|
||||
<x-cpu-memory v-show="props.view == 0" :connection="connection"/>
|
||||
<x-cpu v-show="props.view == 1" :connection="connection" :meta="meta"/>
|
||||
|
@ -8,12 +8,9 @@ export default ($root: any) => {
|
||||
|
||||
const regex = RegExp('\.(jpg|jpeg|png|gif|webp|bmp|tiff)$');
|
||||
if (!regex.test(file.name) ) {
|
||||
$root.$dialog({
|
||||
$root.alert({
|
||||
title: '%fa:info-circle% %i18n:desktop.invalid-filetype%',
|
||||
text: null,
|
||||
actions: [{
|
||||
text: '%i18n:common.got-it%'
|
||||
}]
|
||||
text: null
|
||||
});
|
||||
return reject('invalid-filetype');
|
||||
}
|
||||
@ -90,12 +87,9 @@ export default ($root: any) => {
|
||||
value: i.avatarUrl
|
||||
});
|
||||
|
||||
$root.$dialog({
|
||||
$root.alert({
|
||||
title: '%fa:info-circle% %i18n:desktop.avatar-updated%',
|
||||
text: null,
|
||||
actions: [{
|
||||
text: '%i18n:common.got-it%'
|
||||
}]
|
||||
text: null
|
||||
});
|
||||
|
||||
return i;
|
||||
|
@ -10,10 +10,7 @@ export default ($root: any) => {
|
||||
if (!regex.test(file.name) ) {
|
||||
$root.dialog({
|
||||
title: '%fa:info-circle% %i18n:desktop.invalid-filetype%',
|
||||
text: null,
|
||||
actions: [{
|
||||
text: '%i18n:common.got-it%'
|
||||
}]
|
||||
text: null
|
||||
});
|
||||
return reject('invalid-filetype');
|
||||
}
|
||||
@ -90,12 +87,9 @@ export default ($root: any) => {
|
||||
value: i.bannerUrl
|
||||
});
|
||||
|
||||
$root.$dialog({
|
||||
$root.alert({
|
||||
title: '%fa:info-circle% %i18n:desktop.banner-updated%',
|
||||
text: null,
|
||||
actions: [{
|
||||
text: '%i18n:common.got-it%'
|
||||
}]
|
||||
text: null
|
||||
});
|
||||
|
||||
return i;
|
||||
|
@ -34,7 +34,6 @@ import PostFormWindow from './views/components/post-form-window.vue';
|
||||
import RenoteFormWindow from './views/components/renote-form-window.vue';
|
||||
import MkChooseFileFromDriveWindow from './views/components/choose-file-from-drive-window.vue';
|
||||
import MkChooseFolderFromDriveWindow from './views/components/choose-folder-from-drive-window.vue';
|
||||
import Dialog from './views/components/dialog.vue';
|
||||
import InputDialog from './views/components/input-dialog.vue';
|
||||
import Notification from './views/components/ui-notification.vue';
|
||||
|
||||
@ -114,21 +113,6 @@ init(async (launch) => {
|
||||
});
|
||||
},
|
||||
|
||||
$dialog(opts) {
|
||||
return new Promise<string>((res, rej) => {
|
||||
const o = opts || {};
|
||||
const d = this.$root.new(Dialog, {
|
||||
title: o.title,
|
||||
text: o.text,
|
||||
modal: o.modal,
|
||||
buttons: o.actions
|
||||
});
|
||||
d.$once('clicked', id => {
|
||||
res(id);
|
||||
});
|
||||
});
|
||||
},
|
||||
|
||||
$input(opts) {
|
||||
return new Promise<string>((res, rej) => {
|
||||
const o = opts || {};
|
||||
|
@ -4,7 +4,7 @@
|
||||
<template slot="header"><fa icon="chart-bar"/>{{ $t('title') }}</template>
|
||||
<button slot="func" :title="$t('toggle')" @click="toggle"><fa icon="sort"/></button>
|
||||
|
||||
<p :class="$style.fetching" v-if="fetching"><fa icon="spinner .pulse" fixed-width/>{{ $t('@.loading') }}<mk-ellipsis/></p>
|
||||
<p :class="$style.fetching" v-if="fetching"><fa icon="spinner" pulse fixed-width/>{{ $t('@.loading') }}<mk-ellipsis/></p>
|
||||
<template v-else>
|
||||
<x-calendar v-show="view == 0" :data="[].concat(activity)"/>
|
||||
<x-chart v-show="view == 1" :data="[].concat(activity)"/>
|
||||
|
@ -1,168 +0,0 @@
|
||||
<template>
|
||||
<div class="mk-dialog">
|
||||
<div class="bg" ref="bg" @click="onBgClick"></div>
|
||||
<div class="main" ref="main">
|
||||
<header v-html="title" :class="$style.header"></header>
|
||||
<div class="body" v-html="text"></div>
|
||||
<div class="buttons">
|
||||
<button v-for="button in buttons" @click="click(button)">{{ button.text }}</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script lang="ts">
|
||||
import Vue from 'vue';
|
||||
import * as anime from 'animejs';
|
||||
|
||||
export default Vue.extend({
|
||||
props: {
|
||||
title: {
|
||||
type: String,
|
||||
required: false
|
||||
},
|
||||
text: {
|
||||
type: String,
|
||||
required: true
|
||||
},
|
||||
buttons: {
|
||||
type: Array,
|
||||
default: () => {
|
||||
return [{
|
||||
text: 'OK'
|
||||
}];
|
||||
}
|
||||
},
|
||||
modal: {
|
||||
type: Boolean,
|
||||
default: false
|
||||
}
|
||||
},
|
||||
mounted() {
|
||||
this.$nextTick(() => {
|
||||
(this.$refs.bg as any).style.pointerEvents = 'auto';
|
||||
anime({
|
||||
targets: this.$refs.bg,
|
||||
opacity: 1,
|
||||
duration: 100,
|
||||
easing: 'linear'
|
||||
});
|
||||
|
||||
anime({
|
||||
targets: this.$refs.main,
|
||||
opacity: 1,
|
||||
scale: [1.2, 1],
|
||||
duration: 300,
|
||||
easing: [0, 0.5, 0.5, 1]
|
||||
});
|
||||
});
|
||||
},
|
||||
methods: {
|
||||
click(button) {
|
||||
this.$emit('clicked', button.id);
|
||||
this.close();
|
||||
},
|
||||
close() {
|
||||
(this.$refs.bg 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,
|
||||
scale: 0.8,
|
||||
duration: 300,
|
||||
easing: [ 0.5, -0.5, 1, 0.5 ],
|
||||
complete: () => this.destroyDom()
|
||||
});
|
||||
},
|
||||
onBgClick() {
|
||||
if (!this.modal) {
|
||||
this.close();
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
</script>
|
||||
|
||||
<style lang="stylus" scoped>
|
||||
.mk-dialog
|
||||
> .bg
|
||||
display block
|
||||
position fixed
|
||||
z-index 8192
|
||||
top 0
|
||||
left 0
|
||||
width 100%
|
||||
height 100%
|
||||
background rgba(#000, 0.7)
|
||||
opacity 0
|
||||
pointer-events none
|
||||
|
||||
> .main
|
||||
display block
|
||||
position fixed
|
||||
z-index 8192
|
||||
top 20%
|
||||
left 0
|
||||
right 0
|
||||
margin 0 auto 0 auto
|
||||
padding 32px 42px
|
||||
width 480px
|
||||
background #fff
|
||||
opacity 0
|
||||
|
||||
> .body
|
||||
margin 1em 0
|
||||
color #888
|
||||
|
||||
> .buttons
|
||||
> button
|
||||
display inline-block
|
||||
float right
|
||||
margin 0
|
||||
padding 10px 10px
|
||||
font-size 1.1em
|
||||
font-weight normal
|
||||
text-decoration none
|
||||
color #888
|
||||
background transparent
|
||||
outline none
|
||||
border none
|
||||
border-radius 0
|
||||
cursor pointer
|
||||
transition color 0.1s ease
|
||||
|
||||
i
|
||||
margin 0 0.375em
|
||||
|
||||
&:hover
|
||||
color var(--primary)
|
||||
|
||||
&:active
|
||||
color var(--primaryDarken10)
|
||||
transition color 0s ease
|
||||
|
||||
</style>
|
||||
|
||||
<style lang="stylus" module>
|
||||
|
||||
|
||||
.header
|
||||
margin 1em 0
|
||||
color var(--primary)
|
||||
// color #43A4EC
|
||||
font-weight bold
|
||||
|
||||
&:empty
|
||||
display none
|
||||
|
||||
> i
|
||||
margin-right 0.5em
|
||||
|
||||
</style>
|
@ -170,12 +170,9 @@ export default Vue.extend({
|
||||
|
||||
copyUrl() {
|
||||
copyToClipboard(this.file.url);
|
||||
this.$dialog({
|
||||
this.$root.alert({
|
||||
title: this.$t('contextmenu.copied'),
|
||||
text: this.$t('contextmenu.copied-url-to-clipboard'),
|
||||
actions: [{
|
||||
text: this.$t('@.ok')
|
||||
}]
|
||||
text: this.$t('contextmenu.copied-url-to-clipboard')
|
||||
});
|
||||
},
|
||||
|
||||
|
@ -155,12 +155,9 @@ export default Vue.extend({
|
||||
}).catch(err => {
|
||||
switch (err) {
|
||||
case 'detected-circular-definition':
|
||||
this.$dialog({
|
||||
this.$root.alert({
|
||||
title: this.$t('unable-to-process'),
|
||||
text: this.$t('circular-reference-detected'),
|
||||
actions: [{
|
||||
text: this.$t('@.ok')
|
||||
}]
|
||||
text: this.$t('circular-reference-detected')
|
||||
});
|
||||
break;
|
||||
default:
|
||||
|
@ -313,12 +313,9 @@ export default Vue.extend({
|
||||
}).catch(err => {
|
||||
switch (err) {
|
||||
case 'detected-circular-definition':
|
||||
this.$dialog({
|
||||
this.$root.alert({
|
||||
title: this.$t('unable-to-process'),
|
||||
text: this.$t('circular-reference-detected'),
|
||||
actions: [{
|
||||
text: this.$t('@.ok')
|
||||
}]
|
||||
text: this.$t('circular-reference-detected')
|
||||
});
|
||||
break;
|
||||
default:
|
||||
@ -343,12 +340,9 @@ export default Vue.extend({
|
||||
folderId: this.folder ? this.folder.id : undefined
|
||||
});
|
||||
|
||||
this.$dialog({
|
||||
this.$root.alert({
|
||||
title: this.$t('url-upload-requested'),
|
||||
text: this.$t('may-take-time'),
|
||||
actions: [{
|
||||
text: this.$t('@.ok')
|
||||
}]
|
||||
text: this.$t('may-take-time')
|
||||
});
|
||||
});
|
||||
},
|
||||
|
@ -1,157 +0,0 @@
|
||||
<template>
|
||||
<button class="mk-follow-button"
|
||||
:class="{ wait, active: u.isFollowing || u.hasPendingFollowRequestFromYou, big: size == 'big' }"
|
||||
@click="onClick"
|
||||
:disabled="wait"
|
||||
>
|
||||
<template v-if="!wait">
|
||||
<template v-if="u.hasPendingFollowRequestFromYou && u.isLocked"><fa icon="hourglass-half"/><template v-if="size == 'big'"> {{ $t('request-pending') }}</template></template>
|
||||
<template v-else-if="u.hasPendingFollowRequestFromYou && !u.isLocked"><fa icon="hourglass-start"/><template v-if="size == 'big'"> {{ $t('follow-processing') }}</template></template>
|
||||
<template v-else-if="u.isFollowing"><fa icon="minus"/><template v-if="size == 'big'"> {{ $t('following') }}</template></template>
|
||||
<template v-else-if="!u.isFollowing && u.isLocked"><fa icon="plus"/><template v-if="size == 'big'"> {{ $t('follow-request') }}</template></template>
|
||||
<template v-else-if="!u.isFollowing && !u.isLocked"><fa icon="plus"/><template v-if="size == 'big'"> {{ $t('follow') }}</template></template>
|
||||
</template>
|
||||
<template v-else><fa icon="spinner .pulse" fixed-width/></template>
|
||||
</button>
|
||||
</template>
|
||||
|
||||
<script lang="ts">
|
||||
import Vue from 'vue';
|
||||
import i18n from '../../../i18n';
|
||||
|
||||
export default Vue.extend({
|
||||
i18n: i18n('desktop/views/components/follow-button.vue'),
|
||||
props: {
|
||||
user: {
|
||||
type: Object,
|
||||
required: true
|
||||
},
|
||||
size: {
|
||||
type: String,
|
||||
default: 'compact'
|
||||
}
|
||||
},
|
||||
|
||||
data() {
|
||||
return {
|
||||
u: this.user,
|
||||
wait: false,
|
||||
connection: null
|
||||
};
|
||||
},
|
||||
|
||||
mounted() {
|
||||
this.connection = this.$root.stream.useSharedConnection('main');
|
||||
this.connection.on('follow', this.onFollowChange);
|
||||
this.connection.on('unfollow', this.onFollowChange);
|
||||
},
|
||||
|
||||
beforeDestroy() {
|
||||
this.connection.dispose();
|
||||
},
|
||||
|
||||
methods: {
|
||||
onFollowChange(user) {
|
||||
if (user.id == this.u.id) {
|
||||
this.u.isFollowing = user.isFollowing;
|
||||
this.u.hasPendingFollowRequestFromYou = user.hasPendingFollowRequestFromYou;
|
||||
this.$forceUpdate();
|
||||
}
|
||||
},
|
||||
|
||||
async onClick() {
|
||||
this.wait = true;
|
||||
|
||||
try {
|
||||
if (this.u.isFollowing) {
|
||||
this.u = await this.$root.api('following/delete', {
|
||||
userId: this.u.id
|
||||
});
|
||||
} else {
|
||||
if (this.u.hasPendingFollowRequestFromYou) {
|
||||
this.u = await this.$root.api('following/requests/cancel', {
|
||||
userId: this.u.id
|
||||
});
|
||||
} else if (this.u.isLocked) {
|
||||
this.u = await this.$root.api('following/create', {
|
||||
userId: this.u.id
|
||||
});
|
||||
} else {
|
||||
this.u = await this.$root.api('following/create', {
|
||||
userId: this.user.id
|
||||
});
|
||||
}
|
||||
}
|
||||
} catch (e) {
|
||||
console.error(e);
|
||||
} finally {
|
||||
this.wait = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
</script>
|
||||
|
||||
<style lang="stylus" scoped>
|
||||
.mk-follow-button
|
||||
display block
|
||||
cursor pointer
|
||||
padding 0
|
||||
margin 0
|
||||
width 32px
|
||||
height 32px
|
||||
font-size 1em
|
||||
outline none
|
||||
border-radius 4px
|
||||
|
||||
*
|
||||
pointer-events none
|
||||
|
||||
&:focus
|
||||
&:after
|
||||
content ""
|
||||
pointer-events none
|
||||
position absolute
|
||||
top -5px
|
||||
right -5px
|
||||
bottom -5px
|
||||
left -5px
|
||||
border 2px solid var(--primaryAlpha03)
|
||||
border-radius 8px
|
||||
|
||||
&:not(.active)
|
||||
color var(--primary)
|
||||
border solid 1px var(--primary)
|
||||
|
||||
&:hover
|
||||
background var(--primaryAlpha03)
|
||||
|
||||
&:active
|
||||
background var(--primaryAlpha05)
|
||||
|
||||
&.active
|
||||
color var(--primaryForeground)
|
||||
background var(--primary)
|
||||
border solid 1px var(--primary)
|
||||
|
||||
&:not(:disabled)
|
||||
font-weight bold
|
||||
|
||||
&:hover:not(:disabled)
|
||||
background var(--primaryLighten5)
|
||||
border-color var(--primaryLighten5)
|
||||
|
||||
&:active:not(:disabled)
|
||||
background var(--primaryDarken5)
|
||||
border-color var(--primaryDarken5)
|
||||
|
||||
&.wait
|
||||
cursor wait !important
|
||||
opacity 0.7
|
||||
|
||||
&.big
|
||||
width 100%
|
||||
height 38px
|
||||
line-height 38px
|
||||
|
||||
</style>
|
@ -11,7 +11,7 @@
|
||||
</div>
|
||||
</div>
|
||||
<p class="empty" v-if="!fetching && users.length == 0">{{ $t('empty') }}</p>
|
||||
<p class="fetching" v-if="fetching"><fa icon="spinner .pulse" fixed-width/>{{ $t('fetching') }}<mk-ellipsis/></p>
|
||||
<p class="fetching" v-if="fetching"><fa icon="spinner" pulse fixed-width/>{{ $t('fetching') }}<mk-ellipsis/></p>
|
||||
<a class="refresh" @click="refresh">{{ $t('refresh') }}</a>
|
||||
<button class="close" @click="destroyDom()" :title="$t('title')"><fa icon="times"/></button>
|
||||
</div>
|
||||
|
@ -186,12 +186,9 @@ export default Vue.extend({
|
||||
|
||||
methods: {
|
||||
hint() {
|
||||
this.$dialog({
|
||||
this.$root.alert({
|
||||
title: this.$t('@.customization-tips.title'),
|
||||
text: this.$t('@.customization-tips.paragraph'),
|
||||
actions: [{
|
||||
text: this.$t('@.customization-tips.gotit')
|
||||
}]
|
||||
text: this.$t('@.customization-tips.paragraph')
|
||||
});
|
||||
},
|
||||
|
||||
|
@ -14,10 +14,8 @@ import mediaVideo from './media-video.vue';
|
||||
import notifications from './notifications.vue';
|
||||
import noteForm from './post-form.vue';
|
||||
import renoteForm from './renote-form.vue';
|
||||
import followButton from './follow-button.vue';
|
||||
import notePreview from './note-preview.vue';
|
||||
import noteDetail from './note-detail.vue';
|
||||
import settings from './settings.vue';
|
||||
import calendar from './calendar.vue';
|
||||
import activity from './activity.vue';
|
||||
import friendsMaker from './friends-maker.vue';
|
||||
@ -39,10 +37,8 @@ Vue.component('mk-media-video', mediaVideo);
|
||||
Vue.component('mk-notifications', notifications);
|
||||
Vue.component('mk-post-form', noteForm);
|
||||
Vue.component('mk-renote-form', renoteForm);
|
||||
Vue.component('mk-follow-button', followButton);
|
||||
Vue.component('mk-note-preview', notePreview);
|
||||
Vue.component('mk-note-detail', noteDetail);
|
||||
Vue.component('mk-settings', settings);
|
||||
Vue.component('mk-calendar', calendar);
|
||||
Vue.component('mk-activity', activity);
|
||||
Vue.component('mk-friends-maker', friendsMaker);
|
||||
|
@ -8,7 +8,7 @@
|
||||
:disabled="conversationFetching"
|
||||
>
|
||||
<template v-if="!conversationFetching"><fa icon="ellipsis-v"/></template>
|
||||
<template v-if="conversationFetching"><fa icon="spinner .pulse"/></template>
|
||||
<template v-if="conversationFetching"><fa icon="spinner" pulse/></template>
|
||||
</button>
|
||||
<div class="conversation">
|
||||
<x-sub v-for="note in conversation" :key="note.id" :note="note"/>
|
||||
|
@ -20,6 +20,13 @@
|
||||
<router-link class="name" :to="note.user | userPage" v-user-preview="note.userId">{{ note.user | userName }}</router-link>
|
||||
<span>{{ this.$t('reposted-by').substr(this.$t('reposted-by').indexOf('}') + 1) }}</span>
|
||||
<mk-time :time="note.createdAt"/>
|
||||
<span class="visibility" v-if="note.visibility != 'public'">
|
||||
<fa v-if="note.visibility == 'home'" icon="home"/>
|
||||
<fa v-if="note.visibility == 'followers'" icon="unlock"/>
|
||||
<fa v-if="note.visibility == 'specified'" icon="envelope"/>
|
||||
<fa v-if="note.visibility == 'private'" icon="lock"/>
|
||||
</span>
|
||||
<span class="localOnly" v-if="note.localOnly == true"><fa icon="heart"/></span>
|
||||
</div>
|
||||
<article>
|
||||
<mk-avatar class="avatar" :user="appearNote.user"/>
|
||||
@ -199,9 +206,6 @@ export default Vue.extend({
|
||||
> span
|
||||
flex-shrink 0
|
||||
|
||||
&:last-of-type
|
||||
margin-right 8px
|
||||
|
||||
.name
|
||||
overflow hidden
|
||||
flex-shrink 1
|
||||
@ -215,6 +219,18 @@ export default Vue.extend({
|
||||
flex-shrink 0
|
||||
font-size 0.9em
|
||||
|
||||
> .visibility
|
||||
margin-left 8px
|
||||
|
||||
[data-icon]
|
||||
margin-right 0
|
||||
|
||||
> .localOnly
|
||||
margin-left 4px
|
||||
|
||||
[data-icon]
|
||||
margin-right 0
|
||||
|
||||
& + article
|
||||
padding-top 8px
|
||||
|
||||
|
@ -26,7 +26,7 @@
|
||||
<footer v-if="more">
|
||||
<button @click="loadMore" :disabled="moreFetching" :style="{ cursor: moreFetching ? 'wait' : 'pointer' }">
|
||||
<template v-if="!moreFetching">{{ $t('@.load-more') }}</template>
|
||||
<template v-if="moreFetching"><fa icon="spinner .pulse" fixed-width/></template>
|
||||
<template v-if="moreFetching"><fa icon="spinner" pulse fixed-width/></template>
|
||||
</button>
|
||||
</footer>
|
||||
</div>
|
||||
|
@ -105,7 +105,7 @@
|
||||
</component>
|
||||
</div>
|
||||
<button class="more" :class="{ fetching: fetchingMoreNotifications }" v-if="moreNotifications" @click="fetchMoreNotifications" :disabled="fetchingMoreNotifications">
|
||||
<template v-if="fetchingMoreNotifications"><fa icon="spinner .pulse" fixed-width/></template>{{ fetchingMoreNotifications ? $t('@.loading') : $t('@.load-more') }}
|
||||
<template v-if="fetchingMoreNotifications"><fa icon="spinner" pulse fixed-width/></template>{{ fetchingMoreNotifications ? $t('@.loading') : $t('@.load-more') }}
|
||||
</button>
|
||||
<p class="empty" v-if="notifications.length == 0 && !fetching">{{ $t('empty') }}</p>
|
||||
</div>
|
||||
|
@ -14,6 +14,7 @@
|
||||
<b>{{ $t('recent-tags') }}:</b>
|
||||
<a v-for="tag in recentHashtags.slice(0, 5)" @click="addTag(tag)" :title="$t('click-to-tagging')">#{{ tag }}</a>
|
||||
</div>
|
||||
<div class="local-only" v-if="this.localOnly == true">{{ $t('local-only-message') }}</div>
|
||||
<input v-show="useCw" v-model="cw" :placeholder="$t('annotations')">
|
||||
<div class="textarea">
|
||||
<textarea :class="{ with: (files.length != 0 || poll) }"
|
||||
@ -41,7 +42,7 @@
|
||||
<button class="drive" :title="$t('attach-media-from-drive')" @click="chooseFileFromDrive"><fa icon="cloud"/></button>
|
||||
<button class="kao" :title="$t('insert-a-kao')" @click="kao"><fa :icon="['far', 'smile']"/></button>
|
||||
<button class="poll" :title="$t('create-poll')" @click="poll = !poll"><fa icon="chart-pie"/></button>
|
||||
<button class="cw" :title="$t('hide-contents')" @click="useCw = !useCw"><fa icon="eye-slash"/></button>
|
||||
<button class="cw" :title="$t('hide-contents')" @click="useCw = !useCw"><fa :icon="['far', 'eye-slash']"/></button>
|
||||
<button class="geo" :title="$t('attach-location-information')" @click="geo ? removeGeo() : setGeo()"><fa icon="map-marker-alt"/></button>
|
||||
<button class="visibility" :title="$t('visibility')" @click="setVisibility" ref="visibilityButton">
|
||||
<span v-if="visibility === 'public'"><fa icon="globe"/></span>
|
||||
@ -112,6 +113,7 @@ export default Vue.extend({
|
||||
geo: null,
|
||||
visibility: this.$store.state.settings.rememberNoteVisibility ? (this.$store.state.device.visibility || this.$store.state.settings.defaultNoteVisibility) : this.$store.state.settings.defaultNoteVisibility,
|
||||
visibleUsers: [],
|
||||
localOnly: false,
|
||||
autocomplete: null,
|
||||
draghover: false,
|
||||
recentHashtags: JSON.parse(localStorage.getItem('hashtags') || '[]'),
|
||||
@ -363,7 +365,14 @@ export default Vue.extend({
|
||||
source: this.$refs.visibilityButton
|
||||
});
|
||||
w.$once('chosen', v => {
|
||||
this.visibility = v;
|
||||
const m = v.match(/^local-(.+)/);
|
||||
if (m) {
|
||||
this.localOnly = true;
|
||||
this.visibility = m[1];
|
||||
} else {
|
||||
this.localOnly = false;
|
||||
this.visibility = v;
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
@ -407,6 +416,7 @@ export default Vue.extend({
|
||||
cw: this.useCw ? this.cw || '' : undefined,
|
||||
visibility: this.visibility,
|
||||
visibleUserIds: this.visibility == 'specified' ? this.visibleUsers.map(u => u.id) : undefined,
|
||||
localOnly: this.localOnly,
|
||||
geo: this.geo ? {
|
||||
coordinates: [this.geo.longitude, this.geo.latitude],
|
||||
altitude: this.geo.altitude,
|
||||
@ -640,6 +650,10 @@ export default Vue.extend({
|
||||
margin-right 8px
|
||||
white-space nowrap
|
||||
|
||||
> .local-only
|
||||
margin 0 0 8px 0
|
||||
color var(--primary)
|
||||
|
||||
> .mk-uploader
|
||||
margin 8px 0 0 0
|
||||
padding 8px
|
||||
|
@ -1,15 +1,21 @@
|
||||
<template>
|
||||
<mk-window ref="window" is-modal width="700px" height="550px" @closed="destroyDom">
|
||||
<span slot="header" :class="$style.header"><fa icon="cog"/>{{ $t('settings') }}</span>
|
||||
<mk-settings :initial-page="initialPage" @done="close"/>
|
||||
<x-settings :initial-page="initialPage" @done="close"/>
|
||||
</mk-window>
|
||||
</template>
|
||||
|
||||
<script lang="ts">
|
||||
import Vue from 'vue';
|
||||
import i18n from '../../../i18n';
|
||||
|
||||
export default Vue.extend({
|
||||
i18n: i18n('desktop/views/components/settings-window.vue'),
|
||||
|
||||
components: {
|
||||
XSettings: () => import('./settings.vue').then(m => m.default)
|
||||
},
|
||||
|
||||
props: {
|
||||
initialPage: {
|
||||
type: String,
|
||||
|
@ -15,19 +15,26 @@
|
||||
</div>
|
||||
<div class="pages">
|
||||
<div class="profile" v-show="page == 'profile'">
|
||||
<mk-profile-editor/>
|
||||
<x-profile-editor/>
|
||||
|
||||
<ui-card>
|
||||
<div slot="title"><fa :icon="['fab', 'twitter']"/> {{ $t('twitter') }}</div>
|
||||
<section>
|
||||
<mk-twitter-setting/>
|
||||
<x-twitter-setting/>
|
||||
</section>
|
||||
</ui-card>
|
||||
|
||||
<ui-card>
|
||||
<div slot="title"><fa :icon="['fab', 'github']"/> {{ $t('github') }}</div>
|
||||
<section>
|
||||
<mk-github-setting/>
|
||||
<x-github-setting/>
|
||||
</section>
|
||||
</ui-card>
|
||||
|
||||
<ui-card>
|
||||
<div slot="title"><fa :icon="['fab', 'discord']"/> {{ $t('discord') }}</div>
|
||||
<section>
|
||||
<x-discord-setting/>
|
||||
</section>
|
||||
</ui-card>
|
||||
</div>
|
||||
@ -36,7 +43,7 @@
|
||||
<div slot="title"><fa icon="palette"/> {{ $t('theme') }}</div>
|
||||
|
||||
<section>
|
||||
<mk-theme/>
|
||||
<x-theme/>
|
||||
</section>
|
||||
</ui-card>
|
||||
|
||||
@ -194,7 +201,7 @@
|
||||
</ui-card>
|
||||
|
||||
<div class="drive" v-if="page == 'drive'">
|
||||
<mk-drive-settings/>
|
||||
<x-drive-settings/>
|
||||
</div>
|
||||
|
||||
<ui-card class="hashtags" v-show="page == 'hashtags'">
|
||||
@ -205,7 +212,7 @@
|
||||
</ui-card>
|
||||
|
||||
<div class="muteAndBlock" v-show="page == 'muteAndBlock'">
|
||||
<mk-mute-and-block/>
|
||||
<x-mute-and-block/>
|
||||
</div>
|
||||
|
||||
<ui-card class="apps" v-show="page == 'apps'">
|
||||
@ -218,7 +225,7 @@
|
||||
<ui-card class="password" v-show="page == 'security'">
|
||||
<div slot="title"><fa icon="unlock-alt"/> {{ $t('password') }}</div>
|
||||
<section>
|
||||
<mk-password-settings/>
|
||||
<x-password-settings/>
|
||||
</section>
|
||||
</ui-card>
|
||||
|
||||
@ -237,7 +244,7 @@
|
||||
</ui-card>
|
||||
|
||||
<div class="api" v-show="page == 'api'">
|
||||
<mk-api-settings/>
|
||||
<x-api-settings/>
|
||||
</div>
|
||||
|
||||
<ui-card class="other" v-show="page == 'other'">
|
||||
@ -292,6 +299,16 @@ import X2fa from './settings.2fa.vue';
|
||||
import XApps from './settings.apps.vue';
|
||||
import XSignins from './settings.signins.vue';
|
||||
import XTags from './settings.tags.vue';
|
||||
import XTwitterSetting from '../../../common/views/components/twitter-setting.vue';
|
||||
import XGithubSetting from '../../../common/views/components/github-setting.vue';
|
||||
import XDiscordSetting from '../../../common/views/components/discord-setting.vue';
|
||||
import XTheme from '../../../common/views/components/theme.vue';
|
||||
import XDriveSettings from '../../../common/views/components/drive-settings.vue';
|
||||
import XMuteAndBlock from '../../../common/views/components/mute-and-block.vue';
|
||||
import XPasswordSettings from '../../../common/views/components/password-settings.vue';
|
||||
import XProfileEditor from '../../../common/views/components/profile-editor.vue';
|
||||
import XApiSettings from '../../../common/views/components/api-settings.vue';
|
||||
|
||||
import { url, langs, clientVersion as version } from '../../../config';
|
||||
import checkForUpdate from '../../../common/scripts/check-for-update';
|
||||
|
||||
@ -301,7 +318,16 @@ export default Vue.extend({
|
||||
X2fa,
|
||||
XApps,
|
||||
XSignins,
|
||||
XTags
|
||||
XTags,
|
||||
XTwitterSetting,
|
||||
XGithubSetting,
|
||||
XDiscordSetting,
|
||||
XTheme,
|
||||
XDriveSettings,
|
||||
XMuteAndBlock,
|
||||
XPasswordSettings,
|
||||
XProfileEditor,
|
||||
XApiSettings,
|
||||
},
|
||||
props: {
|
||||
initialPage: {
|
||||
@ -543,12 +569,12 @@ export default Vue.extend({
|
||||
this.checkingForUpdate = false;
|
||||
this.latestVersion = newer;
|
||||
if (newer == null) {
|
||||
this.$dialog({
|
||||
this.$root.alert({
|
||||
title: this.$t('no-updates'),
|
||||
text: this.$t('no-updates-desc')
|
||||
});
|
||||
} else {
|
||||
this.$dialog({
|
||||
this.$root.alert({
|
||||
title: this.$t('update-available'),
|
||||
text: this.$t('update-available-desc')
|
||||
});
|
||||
@ -557,7 +583,7 @@ export default Vue.extend({
|
||||
},
|
||||
clean() {
|
||||
localStorage.clear();
|
||||
this.$dialog({
|
||||
this.$root.alert({
|
||||
title: this.$t('cache-cleared'),
|
||||
text: this.$t('cache-cleared-desc')
|
||||
});
|
||||
|
@ -58,7 +58,7 @@
|
||||
<i><fa icon="angle-right"/></i>
|
||||
</p>
|
||||
</li>
|
||||
<li v-if="$store.state.i.isAdmin">
|
||||
<li v-if="$store.state.i.isAdmin || $store.state.i.isModerator">
|
||||
<a href="/admin">
|
||||
<i><fa icon="terminal"/></i>
|
||||
<span>{{ $t('admin') }}</span>
|
||||
|
@ -2,7 +2,7 @@
|
||||
<div class="zvdbznxvfixtmujpsigoccczftvpiwqh">
|
||||
<div class="banner" :style="bannerStyle"></div>
|
||||
<mk-avatar class="avatar" :user="user" :disable-preview="true"/>
|
||||
<mk-follow-button :user="user" class="follow"/>
|
||||
<mk-follow-button :user="user" class="follow" mini/>
|
||||
<div class="body">
|
||||
<router-link :to="user | userPage" class="name">{{ user | userName }}</router-link>
|
||||
<span class="username">@{{ user | acct }}</span>
|
||||
|
@ -19,7 +19,7 @@
|
||||
<p>{{ $t('followers') }}</p><span>{{ u.followersCount }}</span>
|
||||
</div>
|
||||
</div>
|
||||
<mk-follow-button v-if="$store.getters.isSignedIn && u.id != $store.state.i.id" :user="u"/>
|
||||
<mk-follow-button class="follow-button" v-if="$store.getters.isSignedIn && u.id != $store.state.i.id" :user="u" mini/>
|
||||
</template>
|
||||
</div>
|
||||
</template>
|
||||
@ -154,7 +154,7 @@ export default Vue.extend({
|
||||
font-size 1em
|
||||
color var(--primary)
|
||||
|
||||
> .mk-follow-button
|
||||
> .follow-button
|
||||
position absolute
|
||||
top 92px
|
||||
right 8px
|
||||
|
@ -31,7 +31,7 @@
|
||||
<footer v-if="more">
|
||||
<button @click="loadMore" :disabled="moreFetching" :style="{ cursor: moreFetching ? 'wait' : 'pointer' }">
|
||||
<template v-if="!moreFetching">{{ $t('@.load-more') }}</template>
|
||||
<template v-if="moreFetching"><fa icon="spinner .pulse" fixed-width/></template>
|
||||
<template v-if="moreFetching"><fa icon="spinner" pulse fixed-width/></template>
|
||||
</button>
|
||||
</footer>
|
||||
</div>
|
||||
|
@ -17,7 +17,7 @@
|
||||
</template>
|
||||
</component>
|
||||
<button class="more" :class="{ fetching: fetchingMoreNotifications }" v-if="moreNotifications" @click="fetchMoreNotifications" :disabled="fetchingMoreNotifications">
|
||||
<template v-if="fetchingMoreNotifications"><fa icon="spinner .pulse" fixed-width/></template>{{ fetchingMoreNotifications ? this.$t('@.loading') : this.$t('@.load-more') }}
|
||||
<template v-if="fetchingMoreNotifications"><fa icon="spinner" pulse fixed-width/></template>{{ fetchingMoreNotifications ? this.$t('@.loading') : this.$t('@.load-more') }}
|
||||
</button>
|
||||
<p class="empty" v-if="notifications.length == 0 && !fetching">{{ $t('empty') }}</p>
|
||||
</div>
|
||||
|
@ -1,12 +1,12 @@
|
||||
<template>
|
||||
<x-column :menu="menu" :name="name" :column="column" :is-stacked="isStacked">
|
||||
<span slot="header">
|
||||
<template v-if="column.type == 'home'"><fa icon="home"/></template>
|
||||
<template v-if="column.type == 'local'"><fa :icon="['far', 'comments']"/></template>
|
||||
<template v-if="column.type == 'hybrid'"><fa icon="share-alt"/></template>
|
||||
<template v-if="column.type == 'global'"><fa icon="globe"/></template>
|
||||
<template v-if="column.type == 'list'"><fa icon="list"/></template>
|
||||
<template v-if="column.type == 'hashtag'"><fa icon="hashtag"/></template>
|
||||
<fa v-if="column.type == 'home'" icon="home"/>
|
||||
<fa v-if="column.type == 'local'" :icon="['far', 'comments']"/>
|
||||
<fa v-if="column.type == 'hybrid'" icon="share-alt"/>
|
||||
<fa v-if="column.type == 'global'" icon="globe"/>
|
||||
<fa v-if="column.type == 'list'" icon="list"/>
|
||||
<fa v-if="column.type == 'hashtag'" icon="hashtag"/>
|
||||
<span>{{ name }}</span>
|
||||
</span>
|
||||
|
||||
|
@ -14,7 +14,7 @@
|
||||
<header :style="bannerStyle">
|
||||
<div>
|
||||
<button class="menu" @click="menu" ref="menu"><fa icon="ellipsis-h"/></button>
|
||||
<mk-follow-button v-if="$store.getters.isSignedIn && user.id != $store.state.i.id" :user="user" class="follow"/>
|
||||
<mk-follow-button v-if="$store.getters.isSignedIn && user.id != $store.state.i.id" :user="user" class="follow" mini/>
|
||||
<mk-avatar class="avatar" :user="user" :disable-preview="true"/>
|
||||
<span class="name">{{ user | userName }}</span>
|
||||
<span class="acct">@{{ user | acct }}</span>
|
||||
@ -87,7 +87,6 @@ import XNotes from './deck.notes.vue';
|
||||
import XNote from '../../components/note.vue';
|
||||
import Menu from '../../../../common/views/components/menu.vue';
|
||||
import MkUserListsWindow from '../../components/user-lists-window.vue';
|
||||
import Ok from '../../../../common/views/components/ok.vue';
|
||||
import { concat } from '../../../../../../prelude/array';
|
||||
import * as ApexCharts from 'apexcharts';
|
||||
|
||||
@ -155,7 +154,8 @@ export default Vue.extend({
|
||||
this.$root.api('users/notes', {
|
||||
userId: this.user.id,
|
||||
fileType: image,
|
||||
limit: 9
|
||||
limit: 9,
|
||||
untilDate: new Date().getTime() + 1000 * 86400 * 365
|
||||
}).then(notes => {
|
||||
notes.forEach(note => {
|
||||
note.files.forEach(file => {
|
||||
@ -254,6 +254,7 @@ export default Vue.extend({
|
||||
this.$root.api('users/notes', {
|
||||
userId: this.user.id,
|
||||
limit: fetchLimit + 1,
|
||||
untilDate: new Date().getTime() + 1000 * 86400 * 365,
|
||||
withFiles: this.withFiles,
|
||||
includeMyRenotes: this.$store.state.settings.showMyRenotes,
|
||||
includeRenotedMyNotes: this.$store.state.settings.showRenotedMyNotes,
|
||||
@ -274,7 +275,7 @@ export default Vue.extend({
|
||||
const promise = this.$root.api('users/notes', {
|
||||
userId: this.user.id,
|
||||
limit: fetchLimit + 1,
|
||||
untilId: (this.$refs.timeline as any).tail().id,
|
||||
untilDate: new Date((this.$refs.timeline as any).tail().createdAt).getTime(),
|
||||
withFiles: this.withFiles,
|
||||
includeMyRenotes: this.$store.state.settings.showMyRenotes,
|
||||
includeRenotedMyNotes: this.$store.state.settings.showRenotedMyNotes,
|
||||
@ -306,7 +307,10 @@ export default Vue.extend({
|
||||
listId: list.id,
|
||||
userId: this.user.id
|
||||
});
|
||||
this.$root.new(Ok);
|
||||
this.$root.alert({
|
||||
type: 'success',
|
||||
splash: true
|
||||
});
|
||||
});
|
||||
}
|
||||
}];
|
||||
|
26
src/client/app/desktop/views/pages/user/user.discord.vue
Normal file
26
src/client/app/desktop/views/pages/user/user.discord.vue
Normal file
@ -0,0 +1,26 @@
|
||||
<template>
|
||||
<div class="lkafjvabenanajk17kwqpsatoushincb">
|
||||
<span><fa :icon="['fab', 'discord']"/><a :href="`https://discordapp.com/users/${user.discord.id}`" target="_blank">@{{ user.discord.username }}#{{ user.discord.discriminator }}</a></span>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script lang="ts">
|
||||
import Vue from 'vue';
|
||||
|
||||
export default Vue.extend({
|
||||
props: ['user']
|
||||
});
|
||||
</script>
|
||||
|
||||
<style lang="stylus" scoped>
|
||||
.lkafjvabenanajk17kwqpsatoushincb
|
||||
padding 32px
|
||||
background #7289da
|
||||
border-radius 6px
|
||||
color #fff
|
||||
|
||||
a
|
||||
margin-left 8px
|
||||
color #fff
|
||||
|
||||
</style>
|
@ -1,7 +1,7 @@
|
||||
<template>
|
||||
<div class="vahgrswmbzfdlmomxnqftuueyvwaafth">
|
||||
<p class="title"><fa icon="users"/>{{ $t('title') }}</p>
|
||||
<p class="initializing" v-if="fetching"><fa icon="spinner .pulse" fixed-width/>{{ $t('loading') }}<mk-ellipsis/></p>
|
||||
<p class="initializing" v-if="fetching"><fa icon="spinner" pulse fixed-width/>{{ $t('loading') }}<mk-ellipsis/></p>
|
||||
<div v-if="!fetching && users.length > 0">
|
||||
<router-link v-for="user in users" :to="user | userPage" :key="user.id">
|
||||
<img :src="user.avatarUrl" :alt="user | userName" v-user-preview="user.id"/>
|
||||
|
@ -1,7 +1,7 @@
|
||||
<template>
|
||||
<div class="hozptpaliadatkehcmcayizwzwwctpbc">
|
||||
<p class="title"><fa icon="users"/>{{ $t('title') }}</p>
|
||||
<p class="initializing" v-if="fetching"><fa icon="spinner .pulse" fixed-width/>{{ $t('loading') }}<mk-ellipsis/></p>
|
||||
<p class="initializing" v-if="fetching"><fa icon="spinner" pulse fixed-width/>{{ $t('loading') }}<mk-ellipsis/></p>
|
||||
<template v-if="!fetching && users.length != 0">
|
||||
<div class="user" v-for="friend in users">
|
||||
<mk-avatar class="avatar" :user="friend"/>
|
||||
@ -9,7 +9,7 @@
|
||||
<router-link class="name" :to="friend | userPage" v-user-preview="friend.id">{{ friend.name }}</router-link>
|
||||
<p class="username">@{{ friend | acct }}</p>
|
||||
</div>
|
||||
<mk-follow-button :user="friend"/>
|
||||
<mk-follow-button class="follow-button" :user="friend"/>
|
||||
</div>
|
||||
</template>
|
||||
<p class="empty" v-if="!fetching && users.length == 0">{{ $t('no-users') }}</p>
|
||||
@ -110,7 +110,7 @@ export default Vue.extend({
|
||||
color var(--text)
|
||||
opacity 0.7
|
||||
|
||||
> .mk-follow-button
|
||||
> .follow-button
|
||||
position absolute
|
||||
top 16px
|
||||
right 16px
|
||||
|
@ -1,7 +1,7 @@
|
||||
<template>
|
||||
<div class="dzsuvbsrrrwobdxifudxuefculdfiaxd">
|
||||
<p class="title"><fa icon="camera"/>{{ $t('title') }}</p>
|
||||
<p class="initializing" v-if="fetching"><fa icon="spinner .pulse" fixed-width/>{{ $t('loading') }}<mk-ellipsis/></p>
|
||||
<p class="initializing" v-if="fetching"><fa icon="spinner" pulse fixed-width/>{{ $t('loading') }}<mk-ellipsis/></p>
|
||||
<div class="stream" v-if="!fetching && images.length > 0">
|
||||
<div v-for="image in images" class="img"
|
||||
:style="`background-image: url(${image.thumbnailUrl})`"
|
||||
@ -27,7 +27,8 @@ export default Vue.extend({
|
||||
this.$root.api('users/notes', {
|
||||
userId: this.user.id,
|
||||
withFiles: true,
|
||||
limit: 9
|
||||
limit: 9,
|
||||
untilDate: new Date().getTime() + 1000 * 86400 * 365
|
||||
}).then(notes => {
|
||||
notes.forEach(note => {
|
||||
note.files.forEach(file => {
|
||||
|
@ -1,7 +1,7 @@
|
||||
<template>
|
||||
<div class="profile" v-if="$store.getters.isSignedIn">
|
||||
<div class="friend-form" v-if="$store.state.i.id != user.id">
|
||||
<mk-follow-button :user="user" size="big"/>
|
||||
<mk-follow-button :user="user" block/>
|
||||
<p class="followed" v-if="user.isFollowed">{{ $t('follows-you') }}</p>
|
||||
<p class="stalk" v-if="user.isFollowing">
|
||||
<span v-if="user.isStalking">{{ $t('stalking') }} <a @click="unstalk"><fa icon="meh"/> {{ $t('unstalk') }}</a></span>
|
||||
@ -11,11 +11,11 @@
|
||||
<div class="action-form">
|
||||
<ui-button @click="user.isMuted ? unmute() : mute()" v-if="$store.state.i.id != user.id">
|
||||
<span v-if="user.isMuted"><fa icon="eye"/> {{ $t('unmute') }}</span>
|
||||
<span v-else><fa icon="eye-slash"/> {{ $t('mute') }}</span>
|
||||
<span v-else><fa :icon="['far', 'eye-slash']"/> {{ $t('mute') }}</span>
|
||||
</ui-button>
|
||||
<ui-button @click="user.isBlocking ? unblock() : block()" v-if="$store.state.i.id != user.id">
|
||||
<span v-if="user.isBlocking"><fa icon="user"/> {{ $t('unblock') }}</span>
|
||||
<span v-else><fa icon="user-slash"/> {{ $t('block') }}</span>
|
||||
<span v-if="user.isBlocking"><fa icon="ban"/> {{ $t('unblock') }}</span>
|
||||
<span v-else><fa icon="ban"/> {{ $t('block') }}</span>
|
||||
</ui-button>
|
||||
<ui-button @click="list"><fa icon="list"/> {{ $t('push-to-a-list') }}</ui-button>
|
||||
</div>
|
||||
@ -73,13 +73,20 @@ export default Vue.extend({
|
||||
},
|
||||
|
||||
block() {
|
||||
if (!window.confirm(this.$t('block-confirm'))) return;
|
||||
this.$root.api('blocking/create', {
|
||||
userId: this.user.id
|
||||
}).then(() => {
|
||||
this.user.isBlocking = true;
|
||||
}, () => {
|
||||
alert('error');
|
||||
this.$root.alert({
|
||||
type: 'warning',
|
||||
text: this.$t('block-confirm'),
|
||||
showCancelButton: true
|
||||
}).then(res => {
|
||||
if (!res) return;
|
||||
|
||||
this.$root.api('blocking/create', {
|
||||
userId: this.user.id
|
||||
}).then(() => {
|
||||
this.user.isBlocking = true;
|
||||
}, () => {
|
||||
alert('error');
|
||||
});
|
||||
});
|
||||
},
|
||||
|
||||
@ -101,7 +108,7 @@ export default Vue.extend({
|
||||
listId: list.id,
|
||||
userId: this.user.id
|
||||
});
|
||||
this.$dialog({
|
||||
this.$root.alert({
|
||||
title: 'Done!',
|
||||
text: this.$t('list-pushed').replace('{user}', this.user.name).replace('{list}', list.title)
|
||||
});
|
||||
|
@ -3,7 +3,7 @@
|
||||
<header>
|
||||
<span :data-active="mode == 'default'" @click="mode = 'default'"><fa :icon="['far', 'comment-alt']"/> {{ $t('default') }}</span>
|
||||
<span :data-active="mode == 'with-replies'" @click="mode = 'with-replies'"><fa icon="comments"/> {{ $t('with-replies') }}</span>
|
||||
<span :data-active="mode == 'with-media'" @click="mode = 'with-media'"><fa icon="images"/> {{ $t('with-media') }}</span>
|
||||
<span :data-active="mode == 'with-media'" @click="mode = 'with-media'"><fa :icon="['far', 'images']"/> {{ $t('with-media') }}</span>
|
||||
</header>
|
||||
<mk-notes ref="timeline" :more="existMore ? more : null">
|
||||
<p class="empty" slot="empty"><fa :icon="['far', 'comments']"/>{{ $t('empty') }}</p>
|
||||
@ -63,7 +63,7 @@ export default Vue.extend({
|
||||
this.$root.api('users/notes', {
|
||||
userId: this.user.id,
|
||||
limit: fetchLimit + 1,
|
||||
untilDate: this.date ? this.date.getTime() : undefined,
|
||||
untilDate: this.date ? this.date.getTime() : new Date().getTime() + 1000 * 86400 * 365,
|
||||
includeReplies: this.mode == 'with-replies',
|
||||
withFiles: this.mode == 'with-media'
|
||||
}).then(notes => {
|
||||
@ -86,7 +86,7 @@ export default Vue.extend({
|
||||
limit: fetchLimit + 1,
|
||||
includeReplies: this.mode == 'with-replies',
|
||||
withFiles: this.mode == 'with-media',
|
||||
untilId: (this.$refs.timeline as any).tail().id
|
||||
untilDate: new Date((this.$refs.timeline as any).tail().createdAt).getTime()
|
||||
});
|
||||
|
||||
promise.then(notes => {
|
||||
|
@ -14,6 +14,7 @@
|
||||
<x-profile :user="user"/>
|
||||
<x-twitter :user="user" v-if="!user.host && user.twitter"/>
|
||||
<x-github :user="user" v-if="!user.host && user.github"/>
|
||||
<x-discord :user="user" v-if="!user.host && user.discord"/>
|
||||
<mk-calendar @chosen="warp" :start="new Date(user.createdAt)"/>
|
||||
<mk-activity :user="user"/>
|
||||
<x-photos :user="user"/>
|
||||
@ -39,6 +40,7 @@ import XFollowersYouKnow from './user.followers-you-know.vue';
|
||||
import XFriends from './user.friends.vue';
|
||||
import XTwitter from './user.twitter.vue';
|
||||
import XGithub from './user.github.vue'; // ?MEM: Don't fix the intentional typo. (XGitHub -> `<x-git-hub>`)
|
||||
import XDiscord from './user.discord.vue';
|
||||
|
||||
export default Vue.extend({
|
||||
i18n: i18n(),
|
||||
@ -50,7 +52,8 @@ export default Vue.extend({
|
||||
XFollowersYouKnow,
|
||||
XFriends,
|
||||
XTwitter,
|
||||
XGithub // ?MEM: Don't fix the intentional typo. (see L41)
|
||||
XGithub, // ?MEM: Don't fix the intentional typo. (see L41)
|
||||
XDiscord
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
|
@ -50,7 +50,7 @@
|
||||
</div>
|
||||
|
||||
<div class="photos block">
|
||||
<header><fa icon="images"/> {{ $t('photos') }}</header>
|
||||
<header><fa :icon="['far', 'images']"/> {{ $t('photos') }}</header>
|
||||
<div>
|
||||
<div v-for="photo in photos" :style="`background-image: url(${photo.thumbnailUrl})`"></div>
|
||||
</div>
|
||||
|
@ -11,7 +11,7 @@
|
||||
<mk-poll :note="poll"/>
|
||||
</div>
|
||||
<p class="empty" v-if="!fetching && poll == null">{{ $t('nothing') }}</p>
|
||||
<p class="fetching" v-if="fetching"><fa icon="spinner .pulse" fixed-width/>{{ $t('@.loading') }}<mk-ellipsis/></p>
|
||||
<p class="fetching" v-if="fetching"><fa icon="spinner" pulse fixed-width/>{{ $t('@.loading') }}<mk-ellipsis/></p>
|
||||
</div>
|
||||
</mk-widget-container>
|
||||
</div>
|
||||
|
@ -3,7 +3,10 @@
|
||||
<mk-widget-container :show-header="props.design == 0">
|
||||
<template slot="header"><fa icon="pencil-alt"/>{{ $t('title') }}</template>
|
||||
|
||||
<div class="lhcuptdmcdkfwmipgazeawoiuxpzaclc-body">
|
||||
<div class="lhcuptdmcdkfwmipgazeawoiuxpzaclc-body"
|
||||
@dragover.stop="onDragover"
|
||||
@drop.stop="onDrop"
|
||||
>
|
||||
<div class="textarea">
|
||||
<textarea
|
||||
:disabled="posting"
|
||||
@ -130,6 +133,33 @@ export default define({
|
||||
(this.$refs.uploader as any).upload(file);
|
||||
},
|
||||
|
||||
onDragover(e) {
|
||||
const isFile = e.dataTransfer.items[0].kind == 'file';
|
||||
const isDriveFile = e.dataTransfer.types[0] == 'mk_drive_file';
|
||||
if (isFile || isDriveFile) {
|
||||
e.preventDefault();
|
||||
e.dataTransfer.dropEffect = e.dataTransfer.effectAllowed == 'all' ? 'copy' : 'move';
|
||||
}
|
||||
},
|
||||
|
||||
onDrop(e): void {
|
||||
// ファイルだったら
|
||||
if (e.dataTransfer.files.length > 0) {
|
||||
e.preventDefault();
|
||||
Array.from(e.dataTransfer.files).forEach(this.upload);
|
||||
return;
|
||||
}
|
||||
|
||||
//#region ドライブのファイル
|
||||
const driveFile = e.dataTransfer.getData('mk_drive_file');
|
||||
if (driveFile != null && driveFile != '') {
|
||||
const file = JSON.parse(driveFile);
|
||||
this.files.push(file);
|
||||
e.preventDefault();
|
||||
}
|
||||
//#endregion
|
||||
},
|
||||
|
||||
async emoji() {
|
||||
const Picker = await import('../components/emoji-picker-dialog.vue').then(m => m.default);
|
||||
const button = this.$refs.emoji;
|
||||
|
@ -5,7 +5,7 @@
|
||||
<button slot="func" :title="$t('title')" @click="fetch"><fa icon="sync"/></button>
|
||||
|
||||
<div class="mkw-trends--body">
|
||||
<p class="fetching" v-if="fetching"><fa icon="spinner .pulse" fixed-width/>{{ $t('@.loading') }}<mk-ellipsis/></p>
|
||||
<p class="fetching" v-if="fetching"><fa icon="spinner" pulse fixed-width/>{{ $t('@.loading') }}<mk-ellipsis/></p>
|
||||
<div class="note" v-else-if="note != null">
|
||||
<p class="text"><router-link :to="note | notePage">{{ note.text }}</router-link></p>
|
||||
<p class="author">―<router-link :to="note.user | userPage">@{{ note.user | acct }}</router-link></p>
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user