Compare commits
280 Commits
Author | SHA1 | Date | |
---|---|---|---|
d3ff3a7d54 | |||
cf36106520 | |||
1642fbec31 | |||
b195fd8145 | |||
5f59b980a7 | |||
2a5c19cd01 | |||
42e007ddb7 | |||
756dc397d9 | |||
8f714b5b12 | |||
06bb2a1c7c | |||
ac50bb9225 | |||
8fd95de25b | |||
0e14b2eba4 | |||
08413a7550 | |||
5e0f2a5b06 | |||
3b505709c6 | |||
af32d1f81e | |||
67d8773e38 | |||
e445d39c2f | |||
961ed969db | |||
e9a3495225 | |||
6c5a78aeb2 | |||
34e249317a | |||
6d8ea89f09 | |||
64f89ba13e | |||
f6b2f76bbf | |||
1235bef038 | |||
2e11f3a843 | |||
84b7e0bb7d | |||
9f5dc2c0df | |||
e640dbc501 | |||
85db090d9f | |||
9f2d8e1d51 | |||
0c98a90b75 | |||
0047920c1a | |||
e4bb534f20 | |||
3fc04fcdc5 | |||
e542dcac30 | |||
a0b13505a0 | |||
389f9bfea2 | |||
630a534cee | |||
5744c391e6 | |||
b9b05a7401 | |||
359470a263 | |||
3fe934ee62 | |||
3abe632f06 | |||
65961bc15b | |||
12f932d48a | |||
54e9147782 | |||
31b7626d01 | |||
200ebefe92 | |||
9d29a2e85a | |||
c62a225542 | |||
d5d995a3e6 | |||
b7f10fdc10 | |||
cbba03b376 | |||
f84e9c7dc8 | |||
a22ddb1fb9 | |||
0d23ce3d45 | |||
9719387bee | |||
dca110ebaa | |||
136f23c7ad | |||
0963e6d6e1 | |||
712802e682 | |||
abe99c3c73 | |||
d7a3b71028 | |||
10c434f24a | |||
fe46c53ea6 | |||
cdd123dfd3 | |||
a1a3ee44b5 | |||
4e7fbd8967 | |||
a86c419f95 | |||
e3ec0ad97e | |||
75791981ce | |||
e813fe16b9 | |||
42ac7b954d | |||
c1bbf5dab6 | |||
e16dc2a910 | |||
e236c05d79 | |||
454c1e3faf | |||
43daf814df | |||
c40b630530 | |||
7fc0698ecf | |||
4f3c8b940e | |||
1855ab60f1 | |||
af4f1a7bd6 | |||
8646a9c49c | |||
8d7c033cf5 | |||
b8900e32de | |||
d48c25d2c9 | |||
a87c5899c5 | |||
147ad69864 | |||
c146006476 | |||
a0f10d7ca1 | |||
299b91edc4 | |||
95c89ca6db | |||
7fe0d71e7f | |||
fbbb506e86 | |||
ec80b06a45 | |||
41e1619f1f | |||
ba6a9c6a93 | |||
18571c52fb | |||
5d5dfeaa83 | |||
3669d8c0f3 | |||
69d72819c6 | |||
54dcc10250 | |||
1edfce8f73 | |||
675e573a8c | |||
1080fa63a9 | |||
8047086988 | |||
449b9f7fa0 | |||
b7a15bf6ca | |||
7c3873887d | |||
247ea4cf12 | |||
0b7af5c669 | |||
2b62a4e2e5 | |||
65bfa3c0d6 | |||
84db15694d | |||
746189ba37 | |||
74e845b3ac | |||
90fe70540e | |||
f28af75191 | |||
924bb2bc70 | |||
19d60f3d51 | |||
6903476868 | |||
cf0dccc209 | |||
cfd959129d | |||
819287951c | |||
e136193925 | |||
8c631864d9 | |||
d7d0f6ae2e | |||
b83b3fb9d1 | |||
dfce5bc0af | |||
3487ddabea | |||
2dbff75e7a | |||
02465ded9f | |||
ffcd387945 | |||
4806346707 | |||
31c3f6abf7 | |||
83e47fdd60 | |||
340ce7fa4c | |||
ac86fee9b4 | |||
6dfa283d7a | |||
0cce8a4d21 | |||
1c6d9ab2ef | |||
6ca265e579 | |||
c612c4bf18 | |||
481a791a60 | |||
cb516c2943 | |||
c0abd6f0c0 | |||
47695ed685 | |||
4ca8020ef5 | |||
bfac83d5b8 | |||
4cd2e55fd3 | |||
61c7e7bc48 | |||
bef41718e2 | |||
5b4b52bb97 | |||
8901b6d774 | |||
e3a24e9215 | |||
a515c1f53e | |||
2e22874dec | |||
30f0b1c30d | |||
600aea4dbb | |||
f5d53d784d | |||
1061e1f7ae | |||
1d5fc04aa6 | |||
d1cf0c7998 | |||
84218abf2b | |||
5bebdb2511 | |||
9c8e9b4165 | |||
7b786bfde3 | |||
42a08642a4 | |||
e88f7ca7b2 | |||
c26ed1421b | |||
ed2f94a3c1 | |||
daba7fe87c | |||
afc9caf7bf | |||
67697a7aa6 | |||
1623d9e70c | |||
c304351335 | |||
c1520763c6 | |||
4853bc9414 | |||
e7c865f8e3 | |||
46cb377bc2 | |||
373a5ba3e1 | |||
3bedef67c8 | |||
17ea19ada8 | |||
1f5b2285fd | |||
17f0001966 | |||
04ba09a6af | |||
70d2744319 | |||
6b2f0929ec | |||
f2629bd3f2 | |||
9e6c29c3c0 | |||
abda973094 | |||
86b08dd5bd | |||
617e331f0f | |||
cc438a9372 | |||
b0fb218bfd | |||
fc85a607e6 | |||
fb244c45e3 | |||
c123784c54 | |||
342a5276fc | |||
51a32846ee | |||
35865429a8 | |||
aadd5b95b8 | |||
f9f2ca51ac | |||
1cb93a8c10 | |||
7e5dbb2ba5 | |||
2772e3d80e | |||
223c578734 | |||
d01315dee2 | |||
7dafb4ce4c | |||
9671db9b14 | |||
bec559f67c | |||
14053c1394 | |||
55e4b1c828 | |||
dda3421159 | |||
45e7488e60 | |||
30c7bd66b7 | |||
af4f5bdac0 | |||
3d1a8cc341 | |||
0e52fb2544 | |||
e6d6c0a17c | |||
cfd2d47e00 | |||
83301a879d | |||
d7881ba129 | |||
b9fef1edf7 | |||
2c606f7b23 | |||
03797607ed | |||
254b7f500d | |||
51edd51bf2 | |||
0d403f4a3f | |||
0fa134addd | |||
7002270084 | |||
1c5452d047 | |||
f0d62c07bf | |||
496ca55bba | |||
79cfba226b | |||
f69b60dffe | |||
513385133f | |||
6f1e2f6636 | |||
8ae94c034d | |||
cd9696f25e | |||
d62a6bab41 | |||
20df002746 | |||
fa6b01546e | |||
91b37a6e52 | |||
d8171d7c8b | |||
fa96e2daf1 | |||
87708c3b84 | |||
6319023cc9 | |||
efad9d1b60 | |||
a1dea657fa | |||
6b1b75717b | |||
efe08e0bd3 | |||
62892c4894 | |||
0c2a62da11 | |||
5bc9e9aadd | |||
112c33d35b | |||
864da3030f | |||
f2e719b361 | |||
6aab515389 | |||
819b535ab0 | |||
60e95ac2ac | |||
9b94ddff0a | |||
174f8022eb | |||
ddc3c5ba68 | |||
a7e6b766be | |||
befc35a3ac | |||
2e9bbf389e | |||
80b5fda292 | |||
c48cbd95f6 | |||
931bdc6aac | |||
7f81506c8b | |||
b4b9e76c8d | |||
e5a3dcf868 | |||
825648535c | |||
5cbc908ba3 | |||
895cf53ee1 |
@ -23,6 +23,10 @@ jobs:
|
|||||||
executor: default
|
executor: default
|
||||||
steps:
|
steps:
|
||||||
- checkout
|
- checkout
|
||||||
|
- run:
|
||||||
|
name: Ensure package-lock.json
|
||||||
|
command: |
|
||||||
|
[ ! -e package-lock.json ] && echo '{}' > package-lock.json
|
||||||
- restore_cache:
|
- restore_cache:
|
||||||
name: Restore npm package caches
|
name: Restore npm package caches
|
||||||
keys:
|
keys:
|
||||||
@ -35,11 +39,12 @@ jobs:
|
|||||||
name: Install Dependencies
|
name: Install Dependencies
|
||||||
command: |
|
command: |
|
||||||
npm install
|
npm install
|
||||||
|
npm prune
|
||||||
- run:
|
- run:
|
||||||
name: Configure
|
name: Configure
|
||||||
command: |
|
command: |
|
||||||
cp .ci/default.yml .config
|
cp .circleci/misskey/default.yml .config
|
||||||
cp .ci/test.yml .config
|
cp .circleci/misskey/test.yml .config
|
||||||
- run:
|
- run:
|
||||||
name: Build
|
name: Build
|
||||||
command: |
|
command: |
|
||||||
@ -50,8 +55,8 @@ jobs:
|
|||||||
key: npm-v1-arch-{{ arch }}-env-{{ .Environment.variableName }}-package-{{ checksum "package.json" }}-lock-{{ checksum "package-lock.json" }}-ls-{{ checksum "ls" }}
|
key: npm-v1-arch-{{ arch }}-env-{{ .Environment.variableName }}-package-{{ checksum "package.json" }}-lock-{{ checksum "package-lock.json" }}-ls-{{ checksum "ls" }}
|
||||||
paths:
|
paths:
|
||||||
- node_modules
|
- node_modules
|
||||||
- store_artifacts:
|
# - store_artifacts:
|
||||||
path: built
|
# path: built
|
||||||
- persist_to_workspace:
|
- persist_to_workspace:
|
||||||
root: .
|
root: .
|
||||||
paths:
|
paths:
|
||||||
@ -98,7 +103,6 @@ jobs:
|
|||||||
name: Build
|
name: Build
|
||||||
command: |
|
command: |
|
||||||
docker build . | tee docker.log
|
docker build . | tee docker.log
|
||||||
tail -n 1 docker.log | read __Successfully __built tag
|
|
||||||
- when:
|
- when:
|
||||||
condition: <<parameters.with_deploy>>
|
condition: <<parameters.with_deploy>>
|
||||||
steps:
|
steps:
|
||||||
@ -107,6 +111,7 @@ jobs:
|
|||||||
command: |
|
command: |
|
||||||
if [ "$DOCKERHUB_USERNAME$DOCKERHUB_PASSWORD" ]
|
if [ "$DOCKERHUB_USERNAME$DOCKERHUB_PASSWORD" ]
|
||||||
then
|
then
|
||||||
|
tail -n 1 docker.log | read __Successfully __built tag
|
||||||
docker tag $tag misskey/misskey
|
docker tag $tag misskey/misskey
|
||||||
docker login -u $DOCKERHUB_USERNAME -p $DOCKERHUB_PASSWORD
|
docker login -u $DOCKERHUB_USERNAME -p $DOCKERHUB_PASSWORD
|
||||||
docker push misskey/misskey
|
docker push misskey/misskey
|
||||||
@ -126,10 +131,13 @@ workflows:
|
|||||||
without_redis: "true"
|
without_redis: "true"
|
||||||
requires:
|
requires:
|
||||||
- build
|
- build
|
||||||
- docker:
|
|
||||||
filters:
|
filters:
|
||||||
branches:
|
branches:
|
||||||
ignore: master
|
only: master
|
||||||
|
# - docker:
|
||||||
|
# filters:
|
||||||
|
# branches:
|
||||||
|
# ignore: master
|
||||||
- docker:
|
- docker:
|
||||||
with_deploy: "true"
|
with_deploy: "true"
|
||||||
filters:
|
filters:
|
||||||
|
@ -1,6 +1,3 @@
|
|||||||
name: example-instance-name # Name of your instance
|
|
||||||
description: example-description # Description of your instance
|
|
||||||
|
|
||||||
maintainer:
|
maintainer:
|
||||||
name: example-maitainer-name # Your name
|
name: example-maitainer-name # Your name
|
||||||
url: http://example.com/ # Your contact (http or mailto)
|
url: http://example.com/ # Your contact (http or mailto)
|
||||||
@ -25,7 +22,7 @@ url: https://example.tld/
|
|||||||
# +------+ |+-------------+ +----------------+|
|
# +------+ |+-------------+ +----------------+|
|
||||||
# +---------------------------------------+
|
# +---------------------------------------+
|
||||||
#
|
#
|
||||||
# You need to setup reverse proxy. (eg. Nginx)
|
# You need to setup reverse proxy. (eg. nginx)
|
||||||
# You do not define 'https' section.
|
# You do not define 'https' section.
|
||||||
|
|
||||||
# Option 2: Standalone
|
# Option 2: Standalone
|
||||||
@ -60,21 +57,6 @@ mongodb:
|
|||||||
user: example-misskey-user
|
user: example-misskey-user
|
||||||
pass: example-misskey-pass
|
pass: example-misskey-pass
|
||||||
|
|
||||||
# Drive capacity of a local user (MB)
|
|
||||||
localDriveCapacityMb: 256
|
|
||||||
|
|
||||||
# Drive capacity of a remote user (MB)
|
|
||||||
remoteDriveCapacityMb: 8
|
|
||||||
|
|
||||||
# If enabled:
|
|
||||||
# Server will not cache remote files (Using direct link instead).
|
|
||||||
# You can save your storage.
|
|
||||||
#
|
|
||||||
# NOTE:
|
|
||||||
# * Users cannot see remote images when they turn off "Show media from a remote server" setting.
|
|
||||||
# * Since thumbnails are not provided, traffic increases.
|
|
||||||
preventCacheRemoteFiles: false
|
|
||||||
|
|
||||||
drive:
|
drive:
|
||||||
storage: 'db'
|
storage: 'db'
|
||||||
|
|
||||||
@ -113,6 +95,10 @@ drive:
|
|||||||
# accessKey: XXX
|
# accessKey: XXX
|
||||||
# secretKey: YYY
|
# secretKey: YYY
|
||||||
|
|
||||||
|
# If enabled:
|
||||||
|
# The first account created is automatically marked as Admin.
|
||||||
|
autoAdmin: true
|
||||||
|
|
||||||
#
|
#
|
||||||
# Below settings are optional
|
# Below settings are optional
|
||||||
#
|
#
|
||||||
@ -148,6 +134,12 @@ drive:
|
|||||||
# consumer_key: example-twitter-consumer-key
|
# consumer_key: example-twitter-consumer-key
|
||||||
# consumer_secret: example-twitter-consumer-secret-key
|
# consumer_secret: example-twitter-consumer-secret-key
|
||||||
|
|
||||||
|
# GitHub integration
|
||||||
|
# You need to set the oauth callback url as : https://<your-misskey-instance>/api/gh/cb
|
||||||
|
#github:
|
||||||
|
# client_id: example-github-client-id
|
||||||
|
# client_secret: example-github-client-secret
|
||||||
|
|
||||||
# Ghost
|
# Ghost
|
||||||
# Ghost account is an account used for the purpose of delegating
|
# Ghost account is an account used for the purpose of delegating
|
||||||
# followers when putting users in the list.
|
# followers when putting users in the list.
|
||||||
@ -164,6 +156,3 @@ drive:
|
|||||||
# external: true
|
# external: true
|
||||||
# engine: http://vinayaka.distsn.org/cgi-bin/vinayaka-user-match-misskey-api.cgi?{{host}}+{{user}}+{{limit}}+{{offset}}
|
# engine: http://vinayaka.distsn.org/cgi-bin/vinayaka-user-match-misskey-api.cgi?{{host}}+{{user}}+{{limit}}+{{offset}}
|
||||||
# timeout: 300000
|
# timeout: 300000
|
||||||
|
|
||||||
# Max allowed note text length in charactors
|
|
||||||
maxNoteTextLength: 1000
|
|
||||||
|
41
.travis.yml
41
.travis.yml
@ -1,41 +0,0 @@
|
|||||||
# travis file
|
|
||||||
# https://docs.travis-ci.com/user/customizing-the-build
|
|
||||||
|
|
||||||
notifications:
|
|
||||||
email: false
|
|
||||||
|
|
||||||
branches:
|
|
||||||
except:
|
|
||||||
- l10n_master
|
|
||||||
|
|
||||||
language: node_js
|
|
||||||
|
|
||||||
node_js:
|
|
||||||
- 11.0.0
|
|
||||||
|
|
||||||
env:
|
|
||||||
- CXX=g++-4.8 NODE_ENV=production
|
|
||||||
|
|
||||||
addons:
|
|
||||||
apt:
|
|
||||||
sources:
|
|
||||||
- ubuntu-toolchain-r-test
|
|
||||||
packages:
|
|
||||||
- g++-4.8
|
|
||||||
|
|
||||||
cache:
|
|
||||||
directories:
|
|
||||||
- node_modules
|
|
||||||
|
|
||||||
services:
|
|
||||||
- mongodb
|
|
||||||
- redis-server
|
|
||||||
|
|
||||||
before_script:
|
|
||||||
- npm install
|
|
||||||
|
|
||||||
# 設定ファイルを配置
|
|
||||||
- cp ./.ci/default.yml ./.config
|
|
||||||
- cp ./.ci/test.yml ./.config
|
|
||||||
|
|
||||||
- travis_wait npm run build
|
|
@ -23,5 +23,5 @@ Please use [Crowdin](https://crowdin.com/project/misskey) for localization.
|
|||||||
* Test codes are located in `/test`.
|
* Test codes are located in `/test`.
|
||||||
|
|
||||||
## Continuous integration
|
## Continuous integration
|
||||||
Misskey uses Travis for automated test.
|
Misskey uses CircleCI for automated test.
|
||||||
Configuration files are located in `/.travis`.
|
Configuration files are located in `/.circleci`.
|
||||||
|
@ -4,7 +4,6 @@
|
|||||||
================================================================
|
================================================================
|
||||||
|
|
||||||
[](https://circleci.com/gh/syuilo/misskey)
|
[](https://circleci.com/gh/syuilo/misskey)
|
||||||
[![][travis-badge]][travis-link]
|
|
||||||
[![][dependencies-badge]][dependencies-link]
|
[![][dependencies-badge]][dependencies-link]
|
||||||
[](http://makeapullrequest.com)
|
[](http://makeapullrequest.com)
|
||||||
|
|
||||||
@ -44,7 +43,7 @@ Easiest way to tell your emotions. Misskey allows you to add various type of rea
|
|||||||
|
|
||||||
<h3 align="left">Interface</h3>
|
<h3 align="left">Interface</h3>
|
||||||
<p align="left">
|
<p align="left">
|
||||||
No UI fits for everyone. Therefore, Misskey has a highly customizable UI for your taste. You can edit layouts of your timeline, place selectable widgets you can easily move and create your unique home as this place will be your home.
|
Highly customizable UI for your taste. We understand no UI fits for everyone. You can edit layouts of your timeline, place selectable widgets you can easily move and create your unique home as this place will be your home.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
---
|
---
|
||||||
@ -124,8 +123,6 @@ Misskey is an open-source software licensed under the [GNU AGPLv3](LICENSE).
|
|||||||
|
|
||||||
[agpl-3.0]: https://www.gnu.org/licenses/agpl-3.0.en.html
|
[agpl-3.0]: https://www.gnu.org/licenses/agpl-3.0.en.html
|
||||||
[agpl-3.0-badge]: https://img.shields.io/badge/license-AGPL--3.0-444444.svg?style=flat-square
|
[agpl-3.0-badge]: https://img.shields.io/badge/license-AGPL--3.0-444444.svg?style=flat-square
|
||||||
[travis-link]: https://travis-ci.org/syuilo/misskey
|
|
||||||
[travis-badge]: http://img.shields.io/travis/syuilo/misskey/master.svg?style=flat-square
|
|
||||||
[dependencies-link]: https://david-dm.org/syuilo/misskey
|
[dependencies-link]: https://david-dm.org/syuilo/misskey
|
||||||
[dependencies-badge]: https://img.shields.io/david/syuilo/misskey.svg?style=flat-square
|
[dependencies-badge]: https://img.shields.io/david/syuilo/misskey.svg?style=flat-square
|
||||||
|
|
||||||
|
@ -22,7 +22,7 @@ adduser --disabled-password --disabled-login misskey
|
|||||||
Please install and setup these softwares:
|
Please install and setup these softwares:
|
||||||
|
|
||||||
#### Dependencies :package:
|
#### Dependencies :package:
|
||||||
* **[Node.js](https://nodejs.org/en/)**
|
* **[Node.js](https://nodejs.org/en/)** >= 10.0.0
|
||||||
* **[MongoDB](https://www.mongodb.com/)** >= 3.6
|
* **[MongoDB](https://www.mongodb.com/)** >= 3.6
|
||||||
|
|
||||||
##### Optional
|
##### Optional
|
||||||
|
@ -22,7 +22,7 @@ adduser --disabled-password --disabled-login misskey
|
|||||||
これらのソフトウェアをインストール・設定してください:
|
これらのソフトウェアをインストール・設定してください:
|
||||||
|
|
||||||
#### 依存関係 :package:
|
#### 依存関係 :package:
|
||||||
* **[Node.js](https://nodejs.org/en/)**
|
* **[Node.js](https://nodejs.org/en/)** (10.0.0以上)
|
||||||
* **[MongoDB](https://www.mongodb.com/)** (3.6以上)
|
* **[MongoDB](https://www.mongodb.com/)** (3.6以上)
|
||||||
|
|
||||||
##### オプション
|
##### オプション
|
||||||
|
@ -21,7 +21,6 @@ import * as htmlmin from 'gulp-htmlmin';
|
|||||||
const uglifyes = require('uglify-es');
|
const uglifyes = require('uglify-es');
|
||||||
|
|
||||||
const locales = require('./locales');
|
const locales = require('./locales');
|
||||||
import { fa } from './src/misc/fa';
|
|
||||||
|
|
||||||
const uglify = uglifyComposer(uglifyes, console);
|
const uglify = uglifyComposer(uglifyes, console);
|
||||||
|
|
||||||
@ -164,8 +163,7 @@ gulp.task('build:client:pug', [
|
|||||||
gulp.src('./src/client/app/base.pug')
|
gulp.src('./src/client/app/base.pug')
|
||||||
.pipe(pug({
|
.pipe(pug({
|
||||||
locals: {
|
locals: {
|
||||||
themeColor: constants.themeColor,
|
themeColor: constants.themeColor
|
||||||
facss: fa.dom.css()
|
|
||||||
}
|
}
|
||||||
}))
|
}))
|
||||||
.pipe(htmlmin({
|
.pipe(htmlmin({
|
||||||
|
@ -186,6 +186,7 @@ common:
|
|||||||
stack-left: "左に重ねる"
|
stack-left: "左に重ねる"
|
||||||
pop-right: "右に出す"
|
pop-right: "右に出す"
|
||||||
dev: "アプリの作成に失敗しました。再度お試しください。"
|
dev: "アプリの作成に失敗しました。再度お試しください。"
|
||||||
|
ai-chan-kawaii: "藍ちゃかわいい"
|
||||||
auth/views/form.vue:
|
auth/views/form.vue:
|
||||||
share-access: "<i>{{ app.name }}</i>があなたのアカウントにアクセスすることを<b>許可</b>しますか?"
|
share-access: "<i>{{ app.name }}</i>があなたのアカウントにアクセスすることを<b>許可</b>しますか?"
|
||||||
permission-ask: "このアプリは次の権限を要求しています:"
|
permission-ask: "このアプリは次の権限を要求しています:"
|
||||||
@ -874,7 +875,7 @@ common/views/components/mute-and-block.vue:
|
|||||||
block: "ブロック"
|
block: "ブロック"
|
||||||
no-muted-users: "ミュートしているユーザーはいません"
|
no-muted-users: "ミュートしているユーザーはいません"
|
||||||
no-blocked-users: "ブロックしているユーザーはいません"
|
no-blocked-users: "ブロックしているユーザーはいません"
|
||||||
desktop/views/components/settings.password.vue:
|
common/views/components/password-settings.vue:
|
||||||
reset: "パスワードを変更する"
|
reset: "パスワードを変更する"
|
||||||
enter-current-password: "現在のパスワードを入力してください"
|
enter-current-password: "現在のパスワードを入力してください"
|
||||||
enter-new-password: "新しいパスワードを入力してください"
|
enter-new-password: "新しいパスワードを入力してください"
|
||||||
@ -946,41 +947,86 @@ desktop/views/components/users-list-item.vue:
|
|||||||
desktop/views/components/window.vue:
|
desktop/views/components/window.vue:
|
||||||
popout: "ポップアウト"
|
popout: "ポップアウト"
|
||||||
close: "閉じる"
|
close: "閉じる"
|
||||||
desktop/views/pages/admin/admin.vue:
|
admin/views/index.vue:
|
||||||
dashboard: "ダッシュボード"
|
dashboard: "ダッシュボード"
|
||||||
|
instance: "インスタンス"
|
||||||
|
emoji: "カスタム絵文字"
|
||||||
users: "ユーザー"
|
users: "ユーザー"
|
||||||
update: "更新"
|
update: "更新"
|
||||||
announcements: "お知らせ"
|
announcements: "お知らせ"
|
||||||
hashtags: "ハッシュタグ"
|
hashtags: "ハッシュタグ"
|
||||||
desktop/views/pages/admin/admin.dashboard.vue:
|
back-to-misskey: "Misskeyに戻る"
|
||||||
|
admin/views/dashboard.vue:
|
||||||
dashboard: "ダッシュボード"
|
dashboard: "ダッシュボード"
|
||||||
all-users: "全てのユーザー"
|
accounts: "アカウント"
|
||||||
original-users: "このインスタンスのユーザー"
|
notes: "投稿"
|
||||||
all-notes: "全ての投稿"
|
drive: "ドライブ"
|
||||||
original-notes: "このインスタンスの投稿"
|
instances: "インスタンス"
|
||||||
|
this-instance: "このインスタンス"
|
||||||
|
federated: "連合"
|
||||||
invite: "招待"
|
invite: "招待"
|
||||||
banner-url: "Banner URL"
|
banner-url: "Banner URL"
|
||||||
disableRegistration: "Disable new user registration"
|
disableRegistration: "Disable new user registration"
|
||||||
disableLocalTimeline: "Disable the local timeline"
|
disableLocalTimeline: "Disable the local timeline"
|
||||||
desktop/views/pages/admin/admin.suspend-user.vue:
|
admin/views/charts.vue:
|
||||||
|
title: "チャート"
|
||||||
|
per-day: "1日ごと"
|
||||||
|
per-hour: "1時間ごと"
|
||||||
|
federation: "フェデレーション"
|
||||||
|
notes: "投稿"
|
||||||
|
users: "ユーザー"
|
||||||
|
drive: "ドライブ"
|
||||||
|
network: "ネットワーク"
|
||||||
|
charts:
|
||||||
|
federation-instances: "インスタンスの増減"
|
||||||
|
federation-instances-total: "インスタンスの積算"
|
||||||
|
notes: "投稿の増減 (統合)"
|
||||||
|
local-notes: "投稿の増減 (ローカル)"
|
||||||
|
remote-notes: "投稿の増減 (リモート)"
|
||||||
|
notes-total: "投稿の積算"
|
||||||
|
users: "ユーザーの増減"
|
||||||
|
users-total: "ユーザーの積算"
|
||||||
|
drive: "ドライブ使用量の増減"
|
||||||
|
drive-total: "ドライブ使用量の積算"
|
||||||
|
drive-files: "ドライブのファイル数の増減"
|
||||||
|
drive-files-total: "ドライブのファイル数の積算"
|
||||||
|
network-requests: "リクエスト"
|
||||||
|
network-time: "応答時間"
|
||||||
|
network-usage: "通信量"
|
||||||
|
admin/views/users.vue:
|
||||||
suspend-user: "ユーザーの凍結"
|
suspend-user: "ユーザーの凍結"
|
||||||
suspend: "凍結"
|
suspend: "凍結"
|
||||||
suspended: "凍結しました"
|
suspended: "凍結しました"
|
||||||
desktop/views/pages/admin/admin.unsuspend-user.vue:
|
|
||||||
unsuspend-user: "ユーザーの凍結の解除"
|
unsuspend-user: "ユーザーの凍結の解除"
|
||||||
unsuspend: "凍結の解除"
|
unsuspend: "凍結の解除"
|
||||||
unsuspended: "凍結を解除しました"
|
unsuspended: "凍結を解除しました"
|
||||||
desktop/views/pages/admin/admin.verify-user.vue:
|
|
||||||
verify-user: "ユーザーの公式アカウント設定"
|
verify-user: "ユーザーの公式アカウント設定"
|
||||||
verify: "公式アカウントにする"
|
verify: "公式アカウントにする"
|
||||||
verified: "公式アカウントにしました"
|
verified: "公式アカウントにしました"
|
||||||
desktop/views/pages/admin/admin.unverify-user.vue:
|
|
||||||
unverify-user: "ユーザーの公式アカウント解除"
|
unverify-user: "ユーザーの公式アカウント解除"
|
||||||
unverify: "公式アカウントを解除する"
|
unverify: "公式アカウントを解除する"
|
||||||
unverified: "公式アカウントを解除しました"
|
unverified: "公式アカウントを解除しました"
|
||||||
desktop/views/pages/admin/admin.announcements.vue:
|
admin/views/emoji.vue:
|
||||||
|
add-emoji:
|
||||||
|
title: "絵文字の登録"
|
||||||
|
name: "絵文字名"
|
||||||
|
name-desc: "a~z 0~9 _ の文字が使えます。"
|
||||||
|
aliases: "エイリアス"
|
||||||
|
aliases-desc: "スペースで区切って複数設定できます。"
|
||||||
|
url: "絵文字画像URL"
|
||||||
|
add: "追加"
|
||||||
|
emojis:
|
||||||
|
title: "絵文字一覧"
|
||||||
|
update: "更新"
|
||||||
|
remove: "削除"
|
||||||
|
admin/views/announcements.vue:
|
||||||
announcements: "お知らせ"
|
announcements: "お知らせ"
|
||||||
desktop/views/pages/admin/admin.hashtags.vue:
|
save: "保存"
|
||||||
|
remove: "削除"
|
||||||
|
add: "追加"
|
||||||
|
title: "タイトル"
|
||||||
|
text: "内容"
|
||||||
|
admin/views/hashtags.vue:
|
||||||
hided-tags: "Hidden Tags"
|
hided-tags: "Hidden Tags"
|
||||||
desktop/views/pages/deck/deck.tl-column.vue:
|
desktop/views/pages/deck/deck.tl-column.vue:
|
||||||
is-media-only: "メディア投稿のみ"
|
is-media-only: "メディア投稿のみ"
|
||||||
@ -1328,6 +1374,7 @@ mobile/views/pages/settings.vue:
|
|||||||
sound: "サウンド"
|
sound: "サウンド"
|
||||||
enable-sounds: "サウンドを有効にする"
|
enable-sounds: "サウンドを有効にする"
|
||||||
mark-as-read-all-unread-notes: "すべての投稿を既読にする"
|
mark-as-read-all-unread-notes: "すべての投稿を既読にする"
|
||||||
|
password: "パスワード"
|
||||||
mobile/views/pages/user.vue:
|
mobile/views/pages/user.vue:
|
||||||
follows-you: "フォローされています"
|
follows-you: "フォローされています"
|
||||||
following: "フォロー"
|
following: "フォロー"
|
||||||
|
@ -186,6 +186,7 @@ common:
|
|||||||
stack-left: "Nach links schichten"
|
stack-left: "Nach links schichten"
|
||||||
pop-right: "Rechts andocken"
|
pop-right: "Rechts andocken"
|
||||||
dev: "Fehler beim Erstellen der Applikation. Bitte versuche es erneut."
|
dev: "Fehler beim Erstellen der Applikation. Bitte versuche es erneut."
|
||||||
|
ai-chan-kawaii: "藍ちゃかわいい"
|
||||||
auth/views/form.vue:
|
auth/views/form.vue:
|
||||||
share-access: "<i>{{ app.name }}</i>があなたのアカウントにアクセスすることを<b>許可</b>しますか?"
|
share-access: "<i>{{ app.name }}</i>があなたのアカウントにアクセスすることを<b>許可</b>しますか?"
|
||||||
permission-ask: "このアプリは次の権限を要求しています:"
|
permission-ask: "このアプリは次の権限を要求しています:"
|
||||||
@ -874,13 +875,13 @@ common/views/components/mute-and-block.vue:
|
|||||||
block: "ブロック"
|
block: "ブロック"
|
||||||
no-muted-users: "ミュートしているユーザーはいません"
|
no-muted-users: "ミュートしているユーザーはいません"
|
||||||
no-blocked-users: "ブロックしているユーザーはいません"
|
no-blocked-users: "ブロックしているユーザーはいません"
|
||||||
desktop/views/components/settings.password.vue:
|
common/views/components/password-settings.vue:
|
||||||
reset: "Passwort ändern"
|
reset: "パスワードを変更する"
|
||||||
enter-current-password: "Derzeitiges Passwort eingeben"
|
enter-current-password: "現在のパスワードを入力してください"
|
||||||
enter-new-password: "Neues Passwort eingeben"
|
enter-new-password: "新しいパスワードを入力してください"
|
||||||
enter-new-password-again: "Neues Passwort erneut eingeben"
|
enter-new-password-again: "もう一度新しいパスワードを入力してください"
|
||||||
not-match: "Passwörter stimmen nicht überein."
|
not-match: "新しいパスワードが一致しません"
|
||||||
changed: "Passwort geändert"
|
changed: "パスワードを変更しました"
|
||||||
desktop/views/components/sub-note-content.vue:
|
desktop/views/components/sub-note-content.vue:
|
||||||
private: "この投稿は非公開です"
|
private: "この投稿は非公開です"
|
||||||
deleted: "この投稿は削除されました"
|
deleted: "この投稿は削除されました"
|
||||||
@ -946,41 +947,86 @@ desktop/views/components/users-list-item.vue:
|
|||||||
desktop/views/components/window.vue:
|
desktop/views/components/window.vue:
|
||||||
popout: "ポップアウト"
|
popout: "ポップアウト"
|
||||||
close: "閉じる"
|
close: "閉じる"
|
||||||
desktop/views/pages/admin/admin.vue:
|
admin/views/index.vue:
|
||||||
dashboard: "ダッシュボード"
|
dashboard: "ダッシュボード"
|
||||||
|
instance: "インスタンス"
|
||||||
|
emoji: "カスタム絵文字"
|
||||||
users: "ユーザー"
|
users: "ユーザー"
|
||||||
update: "更新"
|
update: "更新"
|
||||||
announcements: "お知らせ"
|
announcements: "お知らせ"
|
||||||
hashtags: "ハッシュタグ"
|
hashtags: "ハッシュタグ"
|
||||||
desktop/views/pages/admin/admin.dashboard.vue:
|
back-to-misskey: "Misskeyに戻る"
|
||||||
|
admin/views/dashboard.vue:
|
||||||
dashboard: "ダッシュボード"
|
dashboard: "ダッシュボード"
|
||||||
all-users: "全てのユーザー"
|
accounts: "アカウント"
|
||||||
original-users: "このインスタンスのユーザー"
|
notes: "投稿"
|
||||||
all-notes: "全ての投稿"
|
drive: "ドライブ"
|
||||||
original-notes: "このインスタンスの投稿"
|
instances: "インスタンス"
|
||||||
|
this-instance: "このインスタンス"
|
||||||
|
federated: "連合"
|
||||||
invite: "招待"
|
invite: "招待"
|
||||||
banner-url: "Banner URL"
|
banner-url: "Banner URL"
|
||||||
disableRegistration: "Disable new user registration"
|
disableRegistration: "Disable new user registration"
|
||||||
disableLocalTimeline: "Disable the local timeline"
|
disableLocalTimeline: "Disable the local timeline"
|
||||||
desktop/views/pages/admin/admin.suspend-user.vue:
|
admin/views/charts.vue:
|
||||||
|
title: "チャート"
|
||||||
|
per-day: "1日ごと"
|
||||||
|
per-hour: "1時間ごと"
|
||||||
|
federation: "フェデレーション"
|
||||||
|
notes: "投稿"
|
||||||
|
users: "ユーザー"
|
||||||
|
drive: "ドライブ"
|
||||||
|
network: "ネットワーク"
|
||||||
|
charts:
|
||||||
|
federation-instances: "インスタンスの増減"
|
||||||
|
federation-instances-total: "インスタンスの積算"
|
||||||
|
notes: "投稿の増減 (統合)"
|
||||||
|
local-notes: "投稿の増減 (ローカル)"
|
||||||
|
remote-notes: "投稿の増減 (リモート)"
|
||||||
|
notes-total: "投稿の積算"
|
||||||
|
users: "ユーザーの増減"
|
||||||
|
users-total: "ユーザーの積算"
|
||||||
|
drive: "ドライブ使用量の増減"
|
||||||
|
drive-total: "ドライブ使用量の積算"
|
||||||
|
drive-files: "ドライブのファイル数の増減"
|
||||||
|
drive-files-total: "ドライブのファイル数の積算"
|
||||||
|
network-requests: "リクエスト"
|
||||||
|
network-time: "応答時間"
|
||||||
|
network-usage: "通信量"
|
||||||
|
admin/views/users.vue:
|
||||||
suspend-user: "ユーザーの凍結"
|
suspend-user: "ユーザーの凍結"
|
||||||
suspend: "凍結"
|
suspend: "凍結"
|
||||||
suspended: "凍結しました"
|
suspended: "凍結しました"
|
||||||
desktop/views/pages/admin/admin.unsuspend-user.vue:
|
|
||||||
unsuspend-user: "ユーザーの凍結の解除"
|
unsuspend-user: "ユーザーの凍結の解除"
|
||||||
unsuspend: "凍結の解除"
|
unsuspend: "凍結の解除"
|
||||||
unsuspended: "凍結を解除しました"
|
unsuspended: "凍結を解除しました"
|
||||||
desktop/views/pages/admin/admin.verify-user.vue:
|
|
||||||
verify-user: "ユーザーの公式アカウント設定"
|
verify-user: "ユーザーの公式アカウント設定"
|
||||||
verify: "公式アカウントにする"
|
verify: "公式アカウントにする"
|
||||||
verified: "公式アカウントにしました"
|
verified: "公式アカウントにしました"
|
||||||
desktop/views/pages/admin/admin.unverify-user.vue:
|
|
||||||
unverify-user: "ユーザーの公式アカウント解除"
|
unverify-user: "ユーザーの公式アカウント解除"
|
||||||
unverify: "公式アカウントを解除する"
|
unverify: "公式アカウントを解除する"
|
||||||
unverified: "公式アカウントを解除しました"
|
unverified: "公式アカウントを解除しました"
|
||||||
desktop/views/pages/admin/admin.announcements.vue:
|
admin/views/emoji.vue:
|
||||||
|
add-emoji:
|
||||||
|
title: "絵文字の登録"
|
||||||
|
name: "絵文字名"
|
||||||
|
name-desc: "a~z 0~9 _ の文字が使えます。"
|
||||||
|
aliases: "エイリアス"
|
||||||
|
aliases-desc: "スペースで区切って複数設定できます。"
|
||||||
|
url: "絵文字画像URL"
|
||||||
|
add: "追加"
|
||||||
|
emojis:
|
||||||
|
title: "絵文字一覧"
|
||||||
|
update: "更新"
|
||||||
|
remove: "削除"
|
||||||
|
admin/views/announcements.vue:
|
||||||
announcements: "お知らせ"
|
announcements: "お知らせ"
|
||||||
desktop/views/pages/admin/admin.hashtags.vue:
|
save: "保存"
|
||||||
|
remove: "削除"
|
||||||
|
add: "追加"
|
||||||
|
title: "タイトル"
|
||||||
|
text: "内容"
|
||||||
|
admin/views/hashtags.vue:
|
||||||
hided-tags: "Hidden Tags"
|
hided-tags: "Hidden Tags"
|
||||||
desktop/views/pages/deck/deck.tl-column.vue:
|
desktop/views/pages/deck/deck.tl-column.vue:
|
||||||
is-media-only: "メディア投稿のみ"
|
is-media-only: "メディア投稿のみ"
|
||||||
@ -1328,6 +1374,7 @@ mobile/views/pages/settings.vue:
|
|||||||
sound: "サウンド"
|
sound: "サウンド"
|
||||||
enable-sounds: "サウンドを有効にする"
|
enable-sounds: "サウンドを有効にする"
|
||||||
mark-as-read-all-unread-notes: "すべての投稿を既読にする"
|
mark-as-read-all-unread-notes: "すべての投稿を既読にする"
|
||||||
|
password: "パスワード"
|
||||||
mobile/views/pages/user.vue:
|
mobile/views/pages/user.vue:
|
||||||
follows-you: "フォローされています"
|
follows-you: "フォローされています"
|
||||||
following: "フォロー"
|
following: "フォロー"
|
||||||
|
@ -186,6 +186,7 @@ common:
|
|||||||
stack-left: "Stack to the left"
|
stack-left: "Stack to the left"
|
||||||
pop-right: "Dock on the right"
|
pop-right: "Dock on the right"
|
||||||
dev: "Failed to create the application. Please try again."
|
dev: "Failed to create the application. Please try again."
|
||||||
|
ai-chan-kawaii: "Ai-chan kawaii!"
|
||||||
auth/views/form.vue:
|
auth/views/form.vue:
|
||||||
share-access: "Would you <b>allow</b> <i>{{ app.name }}</i> to access your account?"
|
share-access: "Would you <b>allow</b> <i>{{ app.name }}</i> to access your account?"
|
||||||
permission-ask: "This application requires the following permissions:"
|
permission-ask: "This application requires the following permissions:"
|
||||||
@ -249,7 +250,7 @@ common/views/components/games/reversi/reversi.room.vue:
|
|||||||
this-game-is-started-soon: "The game will begin in seconds"
|
this-game-is-started-soon: "The game will begin in seconds"
|
||||||
waiting-for-other: "Waiting for the opponent"
|
waiting-for-other: "Waiting for the opponent"
|
||||||
waiting-for-me: "Waiting for the your preparation"
|
waiting-for-me: "Waiting for the your preparation"
|
||||||
waiting-for-both: "Prepareing"
|
waiting-for-both: "Preparing"
|
||||||
cancel: "Cancel"
|
cancel: "Cancel"
|
||||||
ready: "Ready"
|
ready: "Ready"
|
||||||
cancel-ready: "Cancel \"Ready\""
|
cancel-ready: "Cancel \"Ready\""
|
||||||
@ -874,13 +875,13 @@ common/views/components/mute-and-block.vue:
|
|||||||
block: "Blocking"
|
block: "Blocking"
|
||||||
no-muted-users: "No muted users"
|
no-muted-users: "No muted users"
|
||||||
no-blocked-users: "No blocked users"
|
no-blocked-users: "No blocked users"
|
||||||
desktop/views/components/settings.password.vue:
|
common/views/components/password-settings.vue:
|
||||||
reset: "Change password"
|
reset: "Change password"
|
||||||
enter-current-password: "Enter the current password"
|
enter-current-password: "Enter the current password"
|
||||||
enter-new-password: "Enter the new password"
|
enter-new-password: "Enter the new password"
|
||||||
enter-new-password-again: "Enter new password again"
|
enter-new-password-again: "Enter the new password again"
|
||||||
not-match: "The new passwords do not match"
|
not-match: "The new passwords do not match"
|
||||||
changed: "Password updated"
|
changed: "Password changed"
|
||||||
desktop/views/components/sub-note-content.vue:
|
desktop/views/components/sub-note-content.vue:
|
||||||
private: "This post is private"
|
private: "This post is private"
|
||||||
deleted: "This post has been deleted"
|
deleted: "This post has been deleted"
|
||||||
@ -946,41 +947,86 @@ desktop/views/components/users-list-item.vue:
|
|||||||
desktop/views/components/window.vue:
|
desktop/views/components/window.vue:
|
||||||
popout: "Pop-out"
|
popout: "Pop-out"
|
||||||
close: "Close"
|
close: "Close"
|
||||||
desktop/views/pages/admin/admin.vue:
|
admin/views/index.vue:
|
||||||
dashboard: "Dashboard"
|
dashboard: "Dashboard"
|
||||||
|
instance: "Instance"
|
||||||
|
emoji: "Emoji"
|
||||||
users: "Users"
|
users: "Users"
|
||||||
update: "Updates"
|
update: "Update"
|
||||||
announcements: "Announcements"
|
announcements: "Announcements"
|
||||||
hashtags: "Hashtags"
|
hashtags: "Hashtags"
|
||||||
desktop/views/pages/admin/admin.dashboard.vue:
|
back-to-misskey: "Back to Misskey"
|
||||||
|
admin/views/dashboard.vue:
|
||||||
dashboard: "Dashboard"
|
dashboard: "Dashboard"
|
||||||
all-users: "All Users"
|
accounts: "Accounts"
|
||||||
original-users: "Users on this instance"
|
notes: "Notes"
|
||||||
all-notes: "All the posts"
|
drive: "Drive"
|
||||||
original-notes: "Posts on this instance"
|
instances: "Instances"
|
||||||
|
this-instance: "This instance"
|
||||||
|
federated: "Federated"
|
||||||
invite: "Invite"
|
invite: "Invite"
|
||||||
banner-url: "Banner URL"
|
banner-url: "Banner URL"
|
||||||
disableRegistration: "Disable new user registration"
|
disableRegistration: "Disable new user registration"
|
||||||
disableLocalTimeline: "Disable the local timeline"
|
disableLocalTimeline: "Disable the local timeline"
|
||||||
desktop/views/pages/admin/admin.suspend-user.vue:
|
admin/views/charts.vue:
|
||||||
|
title: "Chart"
|
||||||
|
per-day: "per Day"
|
||||||
|
per-hour: "per Hour"
|
||||||
|
federation: "Federation"
|
||||||
|
notes: "Posts"
|
||||||
|
users: "Users"
|
||||||
|
drive: "Drive"
|
||||||
|
network: "Network"
|
||||||
|
charts:
|
||||||
|
federation-instances: "The number of instances: increase/decrease"
|
||||||
|
federation-instances-total: "Total number of instances"
|
||||||
|
notes: "The number of posts: increase/decrease (Combined)"
|
||||||
|
local-notes: "The number of posts: increase/decrease (Local)"
|
||||||
|
remote-notes: "The number of posts: increase/decrease (Remote)"
|
||||||
|
notes-total: "Total posts"
|
||||||
|
users: "The number of users: increase/decrease"
|
||||||
|
users-total: "Total users"
|
||||||
|
drive: "Capacity used as the storage: increase/decrease"
|
||||||
|
drive-total: "Total usage of Drive"
|
||||||
|
drive-files: "The number of files on the storage: increase/decrease"
|
||||||
|
drive-files-total: "Total number of files on Drive"
|
||||||
|
network-requests: "Requests"
|
||||||
|
network-time: "Response time"
|
||||||
|
network-usage: "Traffic"
|
||||||
|
admin/views/users.vue:
|
||||||
suspend-user: "Suspend a user"
|
suspend-user: "Suspend a user"
|
||||||
suspend: "Suspend"
|
suspend: "Suspend"
|
||||||
suspended: "Successfully suspended."
|
suspended: "Successfully suspended."
|
||||||
desktop/views/pages/admin/admin.unsuspend-user.vue:
|
|
||||||
unsuspend-user: "Unsuspend users"
|
unsuspend-user: "Unsuspend users"
|
||||||
unsuspend: "Unsuspend"
|
unsuspend: "Unsuspend"
|
||||||
unsuspended: "The user has successfully unsuspended."
|
unsuspended: "The user has successfully unsuspended."
|
||||||
desktop/views/pages/admin/admin.verify-user.vue:
|
|
||||||
verify-user: "User account verification settings"
|
verify-user: "User account verification settings"
|
||||||
verify: "Verify account"
|
verify: "Verify account"
|
||||||
verified: "The account is now being verified"
|
verified: "The account is now being verified"
|
||||||
desktop/views/pages/admin/admin.unverify-user.vue:
|
|
||||||
unverify-user: "User account unverification settings"
|
unverify-user: "User account unverification settings"
|
||||||
unverify: "Unverify account"
|
unverify: "Unverify account"
|
||||||
unverified: "The account is now being unverified"
|
unverified: "The account is now being unverified"
|
||||||
desktop/views/pages/admin/admin.announcements.vue:
|
admin/views/emoji.vue:
|
||||||
|
add-emoji:
|
||||||
|
title: "Add emoji"
|
||||||
|
name: "Emoji name"
|
||||||
|
name-desc: "You can use the characters a~z 0~9 _"
|
||||||
|
aliases: "Aliases"
|
||||||
|
aliases-desc: "You can add more than one, separated by spaces."
|
||||||
|
url: "Image URL"
|
||||||
|
add: "Add"
|
||||||
|
emojis:
|
||||||
|
title: "Emojis"
|
||||||
|
update: "Update"
|
||||||
|
remove: "Remove"
|
||||||
|
admin/views/announcements.vue:
|
||||||
announcements: "Announcements"
|
announcements: "Announcements"
|
||||||
desktop/views/pages/admin/admin.hashtags.vue:
|
save: "Save"
|
||||||
|
remove: "Remove"
|
||||||
|
add: "Add"
|
||||||
|
title: "Title"
|
||||||
|
text: "Content"
|
||||||
|
admin/views/hashtags.vue:
|
||||||
hided-tags: "Hidden Tags"
|
hided-tags: "Hidden Tags"
|
||||||
desktop/views/pages/deck/deck.tl-column.vue:
|
desktop/views/pages/deck/deck.tl-column.vue:
|
||||||
is-media-only: "Only media posts"
|
is-media-only: "Only media posts"
|
||||||
@ -1328,6 +1374,7 @@ mobile/views/pages/settings.vue:
|
|||||||
sound: "Sounds"
|
sound: "Sounds"
|
||||||
enable-sounds: "Enable sounds"
|
enable-sounds: "Enable sounds"
|
||||||
mark-as-read-all-unread-notes: "Mark all posts as read"
|
mark-as-read-all-unread-notes: "Mark all posts as read"
|
||||||
|
password: "Password"
|
||||||
mobile/views/pages/user.vue:
|
mobile/views/pages/user.vue:
|
||||||
follows-you: "Follows you"
|
follows-you: "Follows you"
|
||||||
following: "Following"
|
following: "Following"
|
||||||
|
@ -186,6 +186,7 @@ common:
|
|||||||
stack-left: "A la izqda."
|
stack-left: "A la izqda."
|
||||||
pop-right: "A la dcha."
|
pop-right: "A la dcha."
|
||||||
dev: "アプリの作成に失敗しました。再度お試しください。"
|
dev: "アプリの作成に失敗しました。再度お試しください。"
|
||||||
|
ai-chan-kawaii: "藍ちゃかわいい"
|
||||||
auth/views/form.vue:
|
auth/views/form.vue:
|
||||||
share-access: "¿Deseas <b>permitir</b> a <i>{{ app.name }}</i> acceder a tu cuenta?"
|
share-access: "¿Deseas <b>permitir</b> a <i>{{ app.name }}</i> acceder a tu cuenta?"
|
||||||
permission-ask: "La aplicación requiere los siguientes permisos:"
|
permission-ask: "La aplicación requiere los siguientes permisos:"
|
||||||
@ -874,13 +875,13 @@ common/views/components/mute-and-block.vue:
|
|||||||
block: "ブロック"
|
block: "ブロック"
|
||||||
no-muted-users: "ミュートしているユーザーはいません"
|
no-muted-users: "ミュートしているユーザーはいません"
|
||||||
no-blocked-users: "ブロックしているユーザーはいません"
|
no-blocked-users: "ブロックしているユーザーはいません"
|
||||||
desktop/views/components/settings.password.vue:
|
common/views/components/password-settings.vue:
|
||||||
reset: "Cambiar contraseña"
|
reset: "パスワードを変更する"
|
||||||
enter-current-password: "Ingresar contraseña actual"
|
enter-current-password: "現在のパスワードを入力してください"
|
||||||
enter-new-password: "Ingresar nueva contraseña"
|
enter-new-password: "新しいパスワードを入力してください"
|
||||||
enter-new-password-again: "Ingresar nueva contraseña de nuevo"
|
enter-new-password-again: "もう一度新しいパスワードを入力してください"
|
||||||
not-match: "Las nuevas contraseñas no se corresponden consigo mismas"
|
not-match: "新しいパスワードが一致しません"
|
||||||
changed: "Contraseña actualizada"
|
changed: "パスワードを変更しました"
|
||||||
desktop/views/components/sub-note-content.vue:
|
desktop/views/components/sub-note-content.vue:
|
||||||
private: "この投稿は非公開です"
|
private: "この投稿は非公開です"
|
||||||
deleted: "この投稿は削除されました"
|
deleted: "この投稿は削除されました"
|
||||||
@ -946,41 +947,86 @@ desktop/views/components/users-list-item.vue:
|
|||||||
desktop/views/components/window.vue:
|
desktop/views/components/window.vue:
|
||||||
popout: "ポップアウト"
|
popout: "ポップアウト"
|
||||||
close: "閉じる"
|
close: "閉じる"
|
||||||
desktop/views/pages/admin/admin.vue:
|
admin/views/index.vue:
|
||||||
dashboard: "ダッシュボード"
|
dashboard: "ダッシュボード"
|
||||||
|
instance: "インスタンス"
|
||||||
|
emoji: "カスタム絵文字"
|
||||||
users: "ユーザー"
|
users: "ユーザー"
|
||||||
update: "更新"
|
update: "更新"
|
||||||
announcements: "お知らせ"
|
announcements: "お知らせ"
|
||||||
hashtags: "ハッシュタグ"
|
hashtags: "ハッシュタグ"
|
||||||
desktop/views/pages/admin/admin.dashboard.vue:
|
back-to-misskey: "Misskeyに戻る"
|
||||||
|
admin/views/dashboard.vue:
|
||||||
dashboard: "ダッシュボード"
|
dashboard: "ダッシュボード"
|
||||||
all-users: "全てのユーザー"
|
accounts: "アカウント"
|
||||||
original-users: "このインスタンスのユーザー"
|
notes: "投稿"
|
||||||
all-notes: "全ての投稿"
|
drive: "ドライブ"
|
||||||
original-notes: "このインスタンスの投稿"
|
instances: "インスタンス"
|
||||||
|
this-instance: "このインスタンス"
|
||||||
|
federated: "連合"
|
||||||
invite: "招待"
|
invite: "招待"
|
||||||
banner-url: "Banner URL"
|
banner-url: "Banner URL"
|
||||||
disableRegistration: "Disable new user registration"
|
disableRegistration: "Disable new user registration"
|
||||||
disableLocalTimeline: "Disable the local timeline"
|
disableLocalTimeline: "Disable the local timeline"
|
||||||
desktop/views/pages/admin/admin.suspend-user.vue:
|
admin/views/charts.vue:
|
||||||
|
title: "チャート"
|
||||||
|
per-day: "1日ごと"
|
||||||
|
per-hour: "1時間ごと"
|
||||||
|
federation: "フェデレーション"
|
||||||
|
notes: "投稿"
|
||||||
|
users: "ユーザー"
|
||||||
|
drive: "ドライブ"
|
||||||
|
network: "ネットワーク"
|
||||||
|
charts:
|
||||||
|
federation-instances: "インスタンスの増減"
|
||||||
|
federation-instances-total: "インスタンスの積算"
|
||||||
|
notes: "投稿の増減 (統合)"
|
||||||
|
local-notes: "投稿の増減 (ローカル)"
|
||||||
|
remote-notes: "投稿の増減 (リモート)"
|
||||||
|
notes-total: "投稿の積算"
|
||||||
|
users: "ユーザーの増減"
|
||||||
|
users-total: "ユーザーの積算"
|
||||||
|
drive: "ドライブ使用量の増減"
|
||||||
|
drive-total: "ドライブ使用量の積算"
|
||||||
|
drive-files: "ドライブのファイル数の増減"
|
||||||
|
drive-files-total: "ドライブのファイル数の積算"
|
||||||
|
network-requests: "リクエスト"
|
||||||
|
network-time: "応答時間"
|
||||||
|
network-usage: "通信量"
|
||||||
|
admin/views/users.vue:
|
||||||
suspend-user: "ユーザーの凍結"
|
suspend-user: "ユーザーの凍結"
|
||||||
suspend: "凍結"
|
suspend: "凍結"
|
||||||
suspended: "凍結しました"
|
suspended: "凍結しました"
|
||||||
desktop/views/pages/admin/admin.unsuspend-user.vue:
|
|
||||||
unsuspend-user: "ユーザーの凍結の解除"
|
unsuspend-user: "ユーザーの凍結の解除"
|
||||||
unsuspend: "凍結の解除"
|
unsuspend: "凍結の解除"
|
||||||
unsuspended: "凍結を解除しました"
|
unsuspended: "凍結を解除しました"
|
||||||
desktop/views/pages/admin/admin.verify-user.vue:
|
|
||||||
verify-user: "ユーザーの公式アカウント設定"
|
verify-user: "ユーザーの公式アカウント設定"
|
||||||
verify: "公式アカウントにする"
|
verify: "公式アカウントにする"
|
||||||
verified: "公式アカウントにしました"
|
verified: "公式アカウントにしました"
|
||||||
desktop/views/pages/admin/admin.unverify-user.vue:
|
|
||||||
unverify-user: "ユーザーの公式アカウント解除"
|
unverify-user: "ユーザーの公式アカウント解除"
|
||||||
unverify: "公式アカウントを解除する"
|
unverify: "公式アカウントを解除する"
|
||||||
unverified: "公式アカウントを解除しました"
|
unverified: "公式アカウントを解除しました"
|
||||||
desktop/views/pages/admin/admin.announcements.vue:
|
admin/views/emoji.vue:
|
||||||
|
add-emoji:
|
||||||
|
title: "絵文字の登録"
|
||||||
|
name: "絵文字名"
|
||||||
|
name-desc: "a~z 0~9 _ の文字が使えます。"
|
||||||
|
aliases: "エイリアス"
|
||||||
|
aliases-desc: "スペースで区切って複数設定できます。"
|
||||||
|
url: "絵文字画像URL"
|
||||||
|
add: "追加"
|
||||||
|
emojis:
|
||||||
|
title: "絵文字一覧"
|
||||||
|
update: "更新"
|
||||||
|
remove: "削除"
|
||||||
|
admin/views/announcements.vue:
|
||||||
announcements: "お知らせ"
|
announcements: "お知らせ"
|
||||||
desktop/views/pages/admin/admin.hashtags.vue:
|
save: "保存"
|
||||||
|
remove: "削除"
|
||||||
|
add: "追加"
|
||||||
|
title: "タイトル"
|
||||||
|
text: "内容"
|
||||||
|
admin/views/hashtags.vue:
|
||||||
hided-tags: "Hidden Tags"
|
hided-tags: "Hidden Tags"
|
||||||
desktop/views/pages/deck/deck.tl-column.vue:
|
desktop/views/pages/deck/deck.tl-column.vue:
|
||||||
is-media-only: "メディア投稿のみ"
|
is-media-only: "メディア投稿のみ"
|
||||||
@ -1328,6 +1374,7 @@ mobile/views/pages/settings.vue:
|
|||||||
sound: "サウンド"
|
sound: "サウンド"
|
||||||
enable-sounds: "サウンドを有効にする"
|
enable-sounds: "サウンドを有効にする"
|
||||||
mark-as-read-all-unread-notes: "すべての投稿を既読にする"
|
mark-as-read-all-unread-notes: "すべての投稿を既読にする"
|
||||||
|
password: "パスワード"
|
||||||
mobile/views/pages/user.vue:
|
mobile/views/pages/user.vue:
|
||||||
follows-you: "フォローされています"
|
follows-you: "フォローされています"
|
||||||
following: "フォロー"
|
following: "フォロー"
|
||||||
|
@ -186,6 +186,7 @@ common:
|
|||||||
stack-left: "Vers la gauche"
|
stack-left: "Vers la gauche"
|
||||||
pop-right: "Vers la droite"
|
pop-right: "Vers la droite"
|
||||||
dev: "Échec lors de la création de l’application. Veuillez réessayer."
|
dev: "Échec lors de la création de l’application. Veuillez réessayer."
|
||||||
|
ai-chan-kawaii: "藍ちゃかわいい"
|
||||||
auth/views/form.vue:
|
auth/views/form.vue:
|
||||||
share-access: "Désirez-vous <b>autoriser</b> <i>{{ app.name }}</i> à avoir accès à votre compte ?"
|
share-access: "Désirez-vous <b>autoriser</b> <i>{{ app.name }}</i> à avoir accès à votre compte ?"
|
||||||
permission-ask: "Cette application nécessite les autorisations suivantes :"
|
permission-ask: "Cette application nécessite les autorisations suivantes :"
|
||||||
@ -444,7 +445,7 @@ common/views/components/profile-editor.vue:
|
|||||||
is-cat: "Ce compte est un Chat"
|
is-cat: "Ce compte est un Chat"
|
||||||
is-bot: "Ce compte est un Bot"
|
is-bot: "Ce compte est un Bot"
|
||||||
is-locked: "Demandes d’abonnements requièrent l’approbation"
|
is-locked: "Demandes d’abonnements requièrent l’approbation"
|
||||||
careful-bot: "Botからのフォローだけ承認制にする"
|
careful-bot: "Les demandes d’abonnements venant de Bots requièrent l’approbation"
|
||||||
advanced: "Avancé"
|
advanced: "Avancé"
|
||||||
privacy: "Vie privée"
|
privacy: "Vie privée"
|
||||||
save: "Mettre à jour le profil"
|
save: "Mettre à jour le profil"
|
||||||
@ -501,7 +502,7 @@ common/views/widgets/tips.vue:
|
|||||||
tips-line14: "ホームのカスタマイズ中、ウィジェットを右クリックしてデザインを変更できます"
|
tips-line14: "ホームのカスタマイズ中、ウィジェットを右クリックしてデザインを変更できます"
|
||||||
tips-line17: "Vous pouvez mettre un texte en surbrillance en le mettant entre ** **"
|
tips-line17: "Vous pouvez mettre un texte en surbrillance en le mettant entre ** **"
|
||||||
tips-line19: "Plusieurs fenêtres peuvent être détachées en dehors du navigateur."
|
tips-line19: "Plusieurs fenêtres peuvent être détachées en dehors du navigateur."
|
||||||
tips-line20: "カレンダーウィジェットのパーセンテージは、経過の割合を示しています"
|
tips-line20: "Pourcentage sur le widget calendrier qui indique le pourcentage de temps passé"
|
||||||
tips-line21: "Vous pouvez aussi utiliser l'API pour développer des Bots."
|
tips-line21: "Vous pouvez aussi utiliser l'API pour développer des Bots."
|
||||||
tips-line23: "Mayu est mignone avec ses sourcils."
|
tips-line23: "Mayu est mignone avec ses sourcils."
|
||||||
tips-line24: "Misskey a vu le jour en 2014"
|
tips-line24: "Misskey a vu le jour en 2014"
|
||||||
@ -548,7 +549,7 @@ desktop/views/components/charts.vue:
|
|||||||
drive: "Drive"
|
drive: "Drive"
|
||||||
network: "Réseau"
|
network: "Réseau"
|
||||||
charts:
|
charts:
|
||||||
federation-instances: "インスタンスの増減"
|
federation-instances: "Nombre d’instances : augmentation/diminution"
|
||||||
federation-instances-total: "Nombre total d’instances"
|
federation-instances-total: "Nombre total d’instances"
|
||||||
notes: "投稿の増減 (統合)"
|
notes: "投稿の増減 (統合)"
|
||||||
local-notes: "投稿の増減 (ローカル)"
|
local-notes: "投稿の増減 (ローカル)"
|
||||||
@ -781,7 +782,7 @@ desktop/views/components/settings.vue:
|
|||||||
timeline: "Chronologie"
|
timeline: "Chronologie"
|
||||||
show-my-renotes: "Afficher mes republications dans le fil"
|
show-my-renotes: "Afficher mes republications dans le fil"
|
||||||
show-renoted-my-notes: "Afficher mes republications dans les fils"
|
show-renoted-my-notes: "Afficher mes republications dans les fils"
|
||||||
show-local-renotes: "ローカルの投稿のRenoteをタイムラインに表示する"
|
show-local-renotes: "Afficher les partages locaux sur les fils"
|
||||||
show-maps: "Afficher la carte"
|
show-maps: "Afficher la carte"
|
||||||
deck-column-align: "デッキのカラムの位置"
|
deck-column-align: "デッキのカラムの位置"
|
||||||
deck-column-align-center: "Centrer"
|
deck-column-align-center: "Centrer"
|
||||||
@ -865,21 +866,21 @@ common/views/components/api-settings.vue:
|
|||||||
desktop/views/components/settings.apps.vue:
|
desktop/views/components/settings.apps.vue:
|
||||||
no-apps: "Aucune application autorisée"
|
no-apps: "Aucune application autorisée"
|
||||||
common/views/components/drive-settings.vue:
|
common/views/components/drive-settings.vue:
|
||||||
max: "容量"
|
max: "Maximale"
|
||||||
in-use: "utilisé"
|
in-use: "utilisé"
|
||||||
stats: "Statistiques"
|
stats: "Statistiques"
|
||||||
common/views/components/mute-and-block.vue:
|
common/views/components/mute-and-block.vue:
|
||||||
mute-and-block: "ミュートとブロック"
|
mute-and-block: "Silencer / Bloquer"
|
||||||
mute: "ミュート"
|
mute: "Mettre en sourdine"
|
||||||
block: "ブロック"
|
block: "En cours blocage"
|
||||||
no-muted-users: "ミュートしているユーザーはいません"
|
no-muted-users: "Aucun utilisateur·rice n’est mis·e en sourdine"
|
||||||
no-blocked-users: "ブロックしているユーザーはいません"
|
no-blocked-users: "Aucun utilisateur·rice n’est bloqué·e"
|
||||||
desktop/views/components/settings.password.vue:
|
common/views/components/password-settings.vue:
|
||||||
reset: "Changer votre mot de passe"
|
reset: "Modifier le mot de passe"
|
||||||
enter-current-password: "Entrez votre mot de passe actuel"
|
enter-current-password: "Entrez votre mot de passe actuel"
|
||||||
enter-new-password: "Entrez votre nouveau mot de passe"
|
enter-new-password: "Saisissez le nouveau mot de passe"
|
||||||
enter-new-password-again: "Entrez à nouveau le nouveau mot de passe"
|
enter-new-password-again: "Entrez à nouveau le nouveau mot de passe"
|
||||||
not-match: "Le nouveau mot de passe ne correspond pas."
|
not-match: "Les nouveaux mots de passe ne sont pas identiques"
|
||||||
changed: "Mot de passe modifié avec succès"
|
changed: "Mot de passe modifié avec succès"
|
||||||
desktop/views/components/sub-note-content.vue:
|
desktop/views/components/sub-note-content.vue:
|
||||||
private: "cette publication est privée"
|
private: "cette publication est privée"
|
||||||
@ -946,41 +947,86 @@ desktop/views/components/users-list-item.vue:
|
|||||||
desktop/views/components/window.vue:
|
desktop/views/components/window.vue:
|
||||||
popout: "ポップアウト"
|
popout: "ポップアウト"
|
||||||
close: "Fermer"
|
close: "Fermer"
|
||||||
desktop/views/pages/admin/admin.vue:
|
admin/views/index.vue:
|
||||||
dashboard: "Tableau de bord"
|
dashboard: "Tableau de bord"
|
||||||
|
instance: "Instance"
|
||||||
|
emoji: "Emoji"
|
||||||
users: "Utilisateur·rice·s"
|
users: "Utilisateur·rice·s"
|
||||||
update: "Mises à jour"
|
update: "Mise à jour"
|
||||||
announcements: "Annonces"
|
announcements: "Annonces"
|
||||||
hashtags: "Hashtags"
|
hashtags: "Hashtags"
|
||||||
desktop/views/pages/admin/admin.dashboard.vue:
|
back-to-misskey: "Retour vers Misskey"
|
||||||
|
admin/views/dashboard.vue:
|
||||||
dashboard: "Tableau de bord"
|
dashboard: "Tableau de bord"
|
||||||
all-users: "Toutes les utilisateurrices"
|
accounts: "Comptes"
|
||||||
original-users: "Utilisateur·rice·s sur cette instance"
|
notes: "Notes"
|
||||||
all-notes: "Toutes les publications"
|
drive: "Lecteur"
|
||||||
original-notes: "Publications sur cette instance"
|
instances: "Instances"
|
||||||
invite: "Invitation"
|
this-instance: "Cette instance"
|
||||||
|
federated: "Fédérées"
|
||||||
|
invite: "Inviter"
|
||||||
banner-url: "URL de la bannière"
|
banner-url: "URL de la bannière"
|
||||||
disableRegistration: "Désactiver l’enregistrement de nouveaux utilisateurs·rices"
|
disableRegistration: "Désactiver l’enregistrement de nouveaux utilisateur·rice·s"
|
||||||
disableLocalTimeline: "Désactiver le fil local"
|
disableLocalTimeline: "Désactiver le fil local"
|
||||||
desktop/views/pages/admin/admin.suspend-user.vue:
|
admin/views/charts.vue:
|
||||||
|
title: "Graph"
|
||||||
|
per-day: "par jour"
|
||||||
|
per-hour: "par heure"
|
||||||
|
federation: "Fédération"
|
||||||
|
notes: "Publications"
|
||||||
|
users: "Utilisateur·rice·s"
|
||||||
|
drive: "Lecteur"
|
||||||
|
network: "Réseau"
|
||||||
|
charts:
|
||||||
|
federation-instances: "Nombre d’instances : augmentation/diminution"
|
||||||
|
federation-instances-total: "Nombre total d’instances"
|
||||||
|
notes: "投稿の増減 (統合)"
|
||||||
|
local-notes: "投稿の増減 (ローカル)"
|
||||||
|
remote-notes: "投稿の増減 (リモート)"
|
||||||
|
notes-total: "Total des publications"
|
||||||
|
users: "Nombre d’utilisateur·rice·s : augmentation/diminution"
|
||||||
|
users-total: "Nombre total des utilisateur·rice·s"
|
||||||
|
drive: "ドライブ使用量の増減"
|
||||||
|
drive-total: "Utilisation totale du lecteur"
|
||||||
|
drive-files: "ドライブのファイル数の増減"
|
||||||
|
drive-files-total: "Nombre total de fichiers sur le lecteur"
|
||||||
|
network-requests: "Requêtes"
|
||||||
|
network-time: "Temps de réponse"
|
||||||
|
network-usage: "Traffic"
|
||||||
|
admin/views/users.vue:
|
||||||
suspend-user: "Suspendre un·e utilisateur·rice"
|
suspend-user: "Suspendre un·e utilisateur·rice"
|
||||||
suspend: "Suspendre"
|
suspend: "Suspendre"
|
||||||
suspended: "Suspendu avec succès"
|
suspended: "Suspendu·e avec succès."
|
||||||
desktop/views/pages/admin/admin.unsuspend-user.vue:
|
|
||||||
unsuspend-user: "Lever la suspension d’utilisateur·rice·s"
|
unsuspend-user: "Lever la suspension d’utilisateur·rice·s"
|
||||||
unsuspend: "Suspension levée"
|
unsuspend: "Suspension levée"
|
||||||
unsuspended: "La suspension de l’utilisateur·rice a été levée avec succès"
|
unsuspended: "La suspension de l’utilisateur·rice a été levée avec succès"
|
||||||
desktop/views/pages/admin/admin.verify-user.vue:
|
|
||||||
verify-user: "Paramètres de vérification du compte utilisateur"
|
verify-user: "Paramètres de vérification du compte utilisateur"
|
||||||
verify: "Vérification du compte"
|
verify: "公式アカウントにする"
|
||||||
verified: "Le compte a été vérifié"
|
verified: "公式アカウントにしました"
|
||||||
desktop/views/pages/admin/admin.unverify-user.vue:
|
|
||||||
unverify-user: "ユーザーの公式アカウント解除"
|
unverify-user: "ユーザーの公式アカウント解除"
|
||||||
unverify: "Ôter la vérification du compte"
|
unverify: "Ôter la vérification du compte"
|
||||||
unverified: "Ce compte n'est pas vérifié"
|
unverified: "Ce compte n'est plus vérifié"
|
||||||
desktop/views/pages/admin/admin.announcements.vue:
|
admin/views/emoji.vue:
|
||||||
|
add-emoji:
|
||||||
|
title: "Ajouter un émoji"
|
||||||
|
name: "Nom de l’émoji"
|
||||||
|
name-desc: "a~z 0~9 _ の文字が使えます。"
|
||||||
|
aliases: "Aliases"
|
||||||
|
aliases-desc: "Vous pouvez définir plus d’un, séparés par des espaces."
|
||||||
|
url: "URL de l’image"
|
||||||
|
add: "Ajouter"
|
||||||
|
emojis:
|
||||||
|
title: "絵文字一覧"
|
||||||
|
update: "更新"
|
||||||
|
remove: "削除"
|
||||||
|
admin/views/announcements.vue:
|
||||||
announcements: "Annonces"
|
announcements: "Annonces"
|
||||||
desktop/views/pages/admin/admin.hashtags.vue:
|
save: "Enregistrer"
|
||||||
|
remove: "Supprimer"
|
||||||
|
add: "Ajouter"
|
||||||
|
title: "Titre"
|
||||||
|
text: "Contenu"
|
||||||
|
admin/views/hashtags.vue:
|
||||||
hided-tags: "Tags cachés"
|
hided-tags: "Tags cachés"
|
||||||
desktop/views/pages/deck/deck.tl-column.vue:
|
desktop/views/pages/deck/deck.tl-column.vue:
|
||||||
is-media-only: "Les publications médias uniquement"
|
is-media-only: "Les publications médias uniquement"
|
||||||
@ -1328,6 +1374,7 @@ mobile/views/pages/settings.vue:
|
|||||||
sound: "Sons"
|
sound: "Sons"
|
||||||
enable-sounds: "Activer les sons"
|
enable-sounds: "Activer les sons"
|
||||||
mark-as-read-all-unread-notes: "Marquer toutes les publications comme lues"
|
mark-as-read-all-unread-notes: "Marquer toutes les publications comme lues"
|
||||||
|
password: "Mot de Passe"
|
||||||
mobile/views/pages/user.vue:
|
mobile/views/pages/user.vue:
|
||||||
follows-you: "Vous suit"
|
follows-you: "Vous suit"
|
||||||
following: "Abonnements"
|
following: "Abonnements"
|
||||||
|
@ -186,6 +186,7 @@ common:
|
|||||||
stack-left: "左に重ねる"
|
stack-left: "左に重ねる"
|
||||||
pop-right: "右に出す"
|
pop-right: "右に出す"
|
||||||
dev: "アプリの作成に失敗しました。再度お試しください。"
|
dev: "アプリの作成に失敗しました。再度お試しください。"
|
||||||
|
ai-chan-kawaii: "藍ちゃかわいい"
|
||||||
auth/views/form.vue:
|
auth/views/form.vue:
|
||||||
share-access: "<i>{{ app.name }}</i>があなたのアカウントにアクセスすることを<b>許可</b>しますか?"
|
share-access: "<i>{{ app.name }}</i>があなたのアカウントにアクセスすることを<b>許可</b>しますか?"
|
||||||
permission-ask: "このアプリは次の権限を要求しています:"
|
permission-ask: "このアプリは次の権限を要求しています:"
|
||||||
@ -874,7 +875,7 @@ common/views/components/mute-and-block.vue:
|
|||||||
block: "ブロック"
|
block: "ブロック"
|
||||||
no-muted-users: "ミュートしているユーザーはいません"
|
no-muted-users: "ミュートしているユーザーはいません"
|
||||||
no-blocked-users: "ブロックしているユーザーはいません"
|
no-blocked-users: "ブロックしているユーザーはいません"
|
||||||
desktop/views/components/settings.password.vue:
|
common/views/components/password-settings.vue:
|
||||||
reset: "パスワードを変更する"
|
reset: "パスワードを変更する"
|
||||||
enter-current-password: "現在のパスワードを入力してください"
|
enter-current-password: "現在のパスワードを入力してください"
|
||||||
enter-new-password: "新しいパスワードを入力してください"
|
enter-new-password: "新しいパスワードを入力してください"
|
||||||
@ -946,41 +947,86 @@ desktop/views/components/users-list-item.vue:
|
|||||||
desktop/views/components/window.vue:
|
desktop/views/components/window.vue:
|
||||||
popout: "ポップアウト"
|
popout: "ポップアウト"
|
||||||
close: "閉じる"
|
close: "閉じる"
|
||||||
desktop/views/pages/admin/admin.vue:
|
admin/views/index.vue:
|
||||||
dashboard: "ダッシュボード"
|
dashboard: "ダッシュボード"
|
||||||
|
instance: "インスタンス"
|
||||||
|
emoji: "カスタム絵文字"
|
||||||
users: "ユーザー"
|
users: "ユーザー"
|
||||||
update: "更新"
|
update: "更新"
|
||||||
announcements: "お知らせ"
|
announcements: "お知らせ"
|
||||||
hashtags: "ハッシュタグ"
|
hashtags: "ハッシュタグ"
|
||||||
desktop/views/pages/admin/admin.dashboard.vue:
|
back-to-misskey: "Misskeyに戻る"
|
||||||
|
admin/views/dashboard.vue:
|
||||||
dashboard: "ダッシュボード"
|
dashboard: "ダッシュボード"
|
||||||
all-users: "全てのユーザー"
|
accounts: "アカウント"
|
||||||
original-users: "このインスタンスのユーザー"
|
notes: "投稿"
|
||||||
all-notes: "全ての投稿"
|
drive: "ドライブ"
|
||||||
original-notes: "このインスタンスの投稿"
|
instances: "インスタンス"
|
||||||
|
this-instance: "このインスタンス"
|
||||||
|
federated: "連合"
|
||||||
invite: "招待"
|
invite: "招待"
|
||||||
banner-url: "Banner URL"
|
banner-url: "Banner URL"
|
||||||
disableRegistration: "Disable new user registration"
|
disableRegistration: "Disable new user registration"
|
||||||
disableLocalTimeline: "Disable the local timeline"
|
disableLocalTimeline: "Disable the local timeline"
|
||||||
desktop/views/pages/admin/admin.suspend-user.vue:
|
admin/views/charts.vue:
|
||||||
|
title: "チャート"
|
||||||
|
per-day: "1日ごと"
|
||||||
|
per-hour: "1時間ごと"
|
||||||
|
federation: "フェデレーション"
|
||||||
|
notes: "投稿"
|
||||||
|
users: "ユーザー"
|
||||||
|
drive: "ドライブ"
|
||||||
|
network: "ネットワーク"
|
||||||
|
charts:
|
||||||
|
federation-instances: "インスタンスの増減"
|
||||||
|
federation-instances-total: "インスタンスの積算"
|
||||||
|
notes: "投稿の増減 (統合)"
|
||||||
|
local-notes: "投稿の増減 (ローカル)"
|
||||||
|
remote-notes: "投稿の増減 (リモート)"
|
||||||
|
notes-total: "投稿の積算"
|
||||||
|
users: "ユーザーの増減"
|
||||||
|
users-total: "ユーザーの積算"
|
||||||
|
drive: "ドライブ使用量の増減"
|
||||||
|
drive-total: "ドライブ使用量の積算"
|
||||||
|
drive-files: "ドライブのファイル数の増減"
|
||||||
|
drive-files-total: "ドライブのファイル数の積算"
|
||||||
|
network-requests: "リクエスト"
|
||||||
|
network-time: "応答時間"
|
||||||
|
network-usage: "通信量"
|
||||||
|
admin/views/users.vue:
|
||||||
suspend-user: "ユーザーの凍結"
|
suspend-user: "ユーザーの凍結"
|
||||||
suspend: "凍結"
|
suspend: "凍結"
|
||||||
suspended: "凍結しました"
|
suspended: "凍結しました"
|
||||||
desktop/views/pages/admin/admin.unsuspend-user.vue:
|
|
||||||
unsuspend-user: "ユーザーの凍結の解除"
|
unsuspend-user: "ユーザーの凍結の解除"
|
||||||
unsuspend: "凍結の解除"
|
unsuspend: "凍結の解除"
|
||||||
unsuspended: "凍結を解除しました"
|
unsuspended: "凍結を解除しました"
|
||||||
desktop/views/pages/admin/admin.verify-user.vue:
|
|
||||||
verify-user: "ユーザーの公式アカウント設定"
|
verify-user: "ユーザーの公式アカウント設定"
|
||||||
verify: "公式アカウントにする"
|
verify: "公式アカウントにする"
|
||||||
verified: "公式アカウントにしました"
|
verified: "公式アカウントにしました"
|
||||||
desktop/views/pages/admin/admin.unverify-user.vue:
|
|
||||||
unverify-user: "ユーザーの公式アカウント解除"
|
unverify-user: "ユーザーの公式アカウント解除"
|
||||||
unverify: "公式アカウントを解除する"
|
unverify: "公式アカウントを解除する"
|
||||||
unverified: "公式アカウントを解除しました"
|
unverified: "公式アカウントを解除しました"
|
||||||
desktop/views/pages/admin/admin.announcements.vue:
|
admin/views/emoji.vue:
|
||||||
|
add-emoji:
|
||||||
|
title: "絵文字の登録"
|
||||||
|
name: "絵文字名"
|
||||||
|
name-desc: "a~z 0~9 _ の文字が使えます。"
|
||||||
|
aliases: "エイリアス"
|
||||||
|
aliases-desc: "スペースで区切って複数設定できます。"
|
||||||
|
url: "絵文字画像URL"
|
||||||
|
add: "追加"
|
||||||
|
emojis:
|
||||||
|
title: "絵文字一覧"
|
||||||
|
update: "更新"
|
||||||
|
remove: "削除"
|
||||||
|
admin/views/announcements.vue:
|
||||||
announcements: "お知らせ"
|
announcements: "お知らせ"
|
||||||
desktop/views/pages/admin/admin.hashtags.vue:
|
save: "保存"
|
||||||
|
remove: "削除"
|
||||||
|
add: "追加"
|
||||||
|
title: "タイトル"
|
||||||
|
text: "内容"
|
||||||
|
admin/views/hashtags.vue:
|
||||||
hided-tags: "Hidden Tags"
|
hided-tags: "Hidden Tags"
|
||||||
desktop/views/pages/deck/deck.tl-column.vue:
|
desktop/views/pages/deck/deck.tl-column.vue:
|
||||||
is-media-only: "メディア投稿のみ"
|
is-media-only: "メディア投稿のみ"
|
||||||
@ -1328,6 +1374,7 @@ mobile/views/pages/settings.vue:
|
|||||||
sound: "サウンド"
|
sound: "サウンド"
|
||||||
enable-sounds: "サウンドを有効にする"
|
enable-sounds: "サウンドを有効にする"
|
||||||
mark-as-read-all-unread-notes: "すべての投稿を既読にする"
|
mark-as-read-all-unread-notes: "すべての投稿を既読にする"
|
||||||
|
password: "パスワード"
|
||||||
mobile/views/pages/user.vue:
|
mobile/views/pages/user.vue:
|
||||||
follows-you: "フォローされています"
|
follows-you: "フォローされています"
|
||||||
following: "フォロー"
|
following: "フォロー"
|
||||||
|
@ -131,6 +131,7 @@ common:
|
|||||||
show-full-acct: "ユーザー名のホストを省略しない"
|
show-full-acct: "ユーザー名のホストを省略しない"
|
||||||
reduce-motion: "UIの動きを減らす"
|
reduce-motion: "UIの動きを減らす"
|
||||||
this-setting-is-this-device-only: "このデバイスのみ"
|
this-setting-is-this-device-only: "このデバイスのみ"
|
||||||
|
use-os-default-emojis: "OS標準の絵文字を使用"
|
||||||
|
|
||||||
do-not-use-in-production: 'これは開発ビルドです。本番環境で使用しないでください。'
|
do-not-use-in-production: 'これは開発ビルドです。本番環境で使用しないでください。'
|
||||||
|
|
||||||
@ -201,6 +202,7 @@ common:
|
|||||||
pop-right: "右に出す"
|
pop-right: "右に出す"
|
||||||
|
|
||||||
dev: "アプリの作成に失敗しました。再度お試しください。"
|
dev: "アプリの作成に失敗しました。再度お試しください。"
|
||||||
|
ai-chan-kawaii: "藍ちゃかわいい"
|
||||||
|
|
||||||
auth/views/form.vue:
|
auth/views/form.vue:
|
||||||
share-access: "<i>{{ app.name }}</i>があなたのアカウントにアクセスすることを<b>許可</b>しますか?"
|
share-access: "<i>{{ app.name }}</i>があなたのアカウントにアクセスすることを<b>許可</b>しますか?"
|
||||||
@ -416,6 +418,7 @@ common/views/components/signin.vue:
|
|||||||
signin: "サインイン"
|
signin: "サインイン"
|
||||||
or: "または"
|
or: "または"
|
||||||
signin-with-twitter: "Twitterでログイン"
|
signin-with-twitter: "Twitterでログイン"
|
||||||
|
signin-with-github: "GitHubでログイン"
|
||||||
login-failed: "ログインできませんでした。ユーザー名とパスワードを確認してください。"
|
login-failed: "ログインできませんでした。ユーザー名とパスワードを確認してください。"
|
||||||
|
|
||||||
common/views/components/signup.vue:
|
common/views/components/signup.vue:
|
||||||
@ -459,6 +462,14 @@ common/views/components/twitter-setting.vue:
|
|||||||
connect: "Twitterと接続する"
|
connect: "Twitterと接続する"
|
||||||
disconnect: "切断する"
|
disconnect: "切断する"
|
||||||
|
|
||||||
|
common/views/components/github-setting.vue:
|
||||||
|
description: "お使いのGitHubアカウントをお使いのMisskeyアカウントに接続しておくと、プロフィールでGitHubアカウント情報が表示されるようになったり、GitHubを用いた便利なサインインを利用できるようになります。"
|
||||||
|
connected-to: "次のGitHubアカウントに接続されています"
|
||||||
|
detail: "詳細..."
|
||||||
|
reconnect: "再接続する"
|
||||||
|
connect: "GitHubと接続する"
|
||||||
|
disconnect: "切断する"
|
||||||
|
|
||||||
common/views/components/uploader.vue:
|
common/views/components/uploader.vue:
|
||||||
waiting: "待機中"
|
waiting: "待機中"
|
||||||
|
|
||||||
@ -598,32 +609,6 @@ desktop/views/components/calendar.vue:
|
|||||||
next: "次の月"
|
next: "次の月"
|
||||||
go: "クリックして時間遡行"
|
go: "クリックして時間遡行"
|
||||||
|
|
||||||
desktop/views/components/charts.vue:
|
|
||||||
title: "チャート"
|
|
||||||
per-day: "1日ごと"
|
|
||||||
per-hour: "1時間ごと"
|
|
||||||
federation: "フェデレーション"
|
|
||||||
notes: "投稿"
|
|
||||||
users: "ユーザー"
|
|
||||||
drive: "ドライブ"
|
|
||||||
network: "ネットワーク"
|
|
||||||
charts:
|
|
||||||
federation-instances: "インスタンスの増減"
|
|
||||||
federation-instances-total: "インスタンスの積算"
|
|
||||||
notes: "投稿の増減 (統合)"
|
|
||||||
local-notes: "投稿の増減 (ローカル)"
|
|
||||||
remote-notes: "投稿の増減 (リモート)"
|
|
||||||
notes-total: "投稿の積算"
|
|
||||||
users: "ユーザーの増減"
|
|
||||||
users-total: "ユーザーの積算"
|
|
||||||
drive: "ドライブ使用量の増減"
|
|
||||||
drive-total: "ドライブ使用量の積算"
|
|
||||||
drive-files: "ドライブのファイル数の増減"
|
|
||||||
drive-files-total: "ドライブのファイル数の積算"
|
|
||||||
network-requests: "リクエスト"
|
|
||||||
network-time: "応答時間"
|
|
||||||
network-usage: "通信量"
|
|
||||||
|
|
||||||
desktop/views/components/choose-file-from-drive-window.vue:
|
desktop/views/components/choose-file-from-drive-window.vue:
|
||||||
choose-file: "ファイル選択中"
|
choose-file: "ファイル選択中"
|
||||||
upload: "PCからドライブにファイルをアップロード"
|
upload: "PCからドライブにファイルをアップロード"
|
||||||
@ -981,7 +966,7 @@ common/views/components/mute-and-block.vue:
|
|||||||
no-muted-users: "ミュートしているユーザーはいません"
|
no-muted-users: "ミュートしているユーザーはいません"
|
||||||
no-blocked-users: "ブロックしているユーザーはいません"
|
no-blocked-users: "ブロックしているユーザーはいません"
|
||||||
|
|
||||||
desktop/views/components/settings.password.vue:
|
common/views/components/password-settings.vue:
|
||||||
reset: "パスワードを変更する"
|
reset: "パスワードを変更する"
|
||||||
enter-current-password: "現在のパスワードを入力してください"
|
enter-current-password: "現在のパスワードを入力してください"
|
||||||
enter-new-password: "新しいパスワードを入力してください"
|
enter-new-password: "新しいパスワードを入力してください"
|
||||||
@ -1069,48 +1054,116 @@ desktop/views/components/window.vue:
|
|||||||
popout: "ポップアウト"
|
popout: "ポップアウト"
|
||||||
close: "閉じる"
|
close: "閉じる"
|
||||||
|
|
||||||
desktop/views/pages/admin/admin.vue:
|
admin/views/index.vue:
|
||||||
dashboard: "ダッシュボード"
|
dashboard: "ダッシュボード"
|
||||||
|
instance: "インスタンス"
|
||||||
|
emoji: "カスタム絵文字"
|
||||||
users: "ユーザー"
|
users: "ユーザー"
|
||||||
update: "更新"
|
update: "更新"
|
||||||
announcements: "お知らせ"
|
announcements: "お知らせ"
|
||||||
hashtags: "ハッシュタグ"
|
hashtags: "ハッシュタグ"
|
||||||
|
back-to-misskey: "Misskeyに戻る"
|
||||||
|
|
||||||
desktop/views/pages/admin/admin.dashboard.vue:
|
admin/views/dashboard.vue:
|
||||||
dashboard: "ダッシュボード"
|
dashboard: "ダッシュボード"
|
||||||
all-users: "全てのユーザー"
|
accounts: "アカウント"
|
||||||
original-users: "このインスタンスのユーザー"
|
notes: "投稿"
|
||||||
all-notes: "全ての投稿"
|
drive: "ドライブ"
|
||||||
original-notes: "このインスタンスの投稿"
|
instances: "インスタンス"
|
||||||
invite: "招待"
|
this-instance: "このインスタンス"
|
||||||
banner-url: "Banner URL"
|
federated: "連合"
|
||||||
disableRegistration: "Disable new user registration"
|
|
||||||
disableLocalTimeline: "Disable the local timeline"
|
|
||||||
|
|
||||||
desktop/views/pages/admin/admin.suspend-user.vue:
|
admin/views/instance.vue:
|
||||||
|
instance: "インスタンス"
|
||||||
|
instance-name: "インスタンス名"
|
||||||
|
instance-description: "インスタンスの紹介"
|
||||||
|
banner-url: "バナー画像URL"
|
||||||
|
drive-config: "ドライブの設定"
|
||||||
|
cache-remote-files: "リモートのファイルをキャッシュする"
|
||||||
|
cache-remote-files-desc: "この設定を無効にすると、リモートファイルをキャッシュせず直リンクするようになります。そのためサーバーのストレージを節約できますが、プライバシー設定で直リンクを無効にしているユーザーにはファイルが見えなくなったり、サムネイルが生成されないので通信量が増加します。通常はこの設定をオンにしておくことをおすすめします。"
|
||||||
|
local-drive-capacity-mb: "ローカルユーザーひとりあたりのドライブ容量"
|
||||||
|
remote-drive-capacity-mb: "リモートユーザーひとりあたりのドライブ容量"
|
||||||
|
mb: "メガバイト単位"
|
||||||
|
max-note-text-length: "投稿の最大文字数"
|
||||||
|
disable-registration: "ユーザー登録の受付を停止する"
|
||||||
|
disable-local-timeline: "ローカルタイムラインを無効にする"
|
||||||
|
invite: "招待"
|
||||||
|
save: "保存"
|
||||||
|
saved: "保存しました"
|
||||||
|
|
||||||
|
admin/views/charts.vue:
|
||||||
|
title: "チャート"
|
||||||
|
per-day: "1日ごと"
|
||||||
|
per-hour: "1時間ごと"
|
||||||
|
federation: "フェデレーション"
|
||||||
|
notes: "投稿"
|
||||||
|
users: "ユーザー"
|
||||||
|
drive: "ドライブ"
|
||||||
|
network: "ネットワーク"
|
||||||
|
charts:
|
||||||
|
federation-instances: "インスタンスの増減"
|
||||||
|
federation-instances-total: "インスタンスの積算"
|
||||||
|
notes: "投稿の増減 (統合)"
|
||||||
|
local-notes: "投稿の増減 (ローカル)"
|
||||||
|
remote-notes: "投稿の増減 (リモート)"
|
||||||
|
notes-total: "投稿の積算"
|
||||||
|
users: "ユーザーの増減"
|
||||||
|
users-total: "ユーザーの積算"
|
||||||
|
drive: "ドライブ使用量の増減"
|
||||||
|
drive-total: "ドライブ使用量の積算"
|
||||||
|
drive-files: "ドライブのファイル数の増減"
|
||||||
|
drive-files-total: "ドライブのファイル数の積算"
|
||||||
|
network-requests: "リクエスト"
|
||||||
|
network-time: "応答時間"
|
||||||
|
network-usage: "通信量"
|
||||||
|
|
||||||
|
admin/views/users.vue:
|
||||||
suspend-user: "ユーザーの凍結"
|
suspend-user: "ユーザーの凍結"
|
||||||
suspend: "凍結"
|
suspend: "凍結"
|
||||||
suspended: "凍結しました"
|
suspended: "凍結しました"
|
||||||
|
|
||||||
desktop/views/pages/admin/admin.unsuspend-user.vue:
|
|
||||||
unsuspend-user: "ユーザーの凍結の解除"
|
unsuspend-user: "ユーザーの凍結の解除"
|
||||||
unsuspend: "凍結の解除"
|
unsuspend: "凍結の解除"
|
||||||
unsuspended: "凍結を解除しました"
|
unsuspended: "凍結を解除しました"
|
||||||
|
|
||||||
desktop/views/pages/admin/admin.verify-user.vue:
|
|
||||||
verify-user: "ユーザーの公式アカウント設定"
|
verify-user: "ユーザーの公式アカウント設定"
|
||||||
verify: "公式アカウントにする"
|
verify: "公式アカウントにする"
|
||||||
verified: "公式アカウントにしました"
|
verified: "公式アカウントにしました"
|
||||||
|
|
||||||
desktop/views/pages/admin/admin.unverify-user.vue:
|
|
||||||
unverify-user: "ユーザーの公式アカウント解除"
|
unverify-user: "ユーザーの公式アカウント解除"
|
||||||
unverify: "公式アカウントを解除する"
|
unverify: "公式アカウントを解除する"
|
||||||
unverified: "公式アカウントを解除しました"
|
unverified: "公式アカウントを解除しました"
|
||||||
|
|
||||||
desktop/views/pages/admin/admin.announcements.vue:
|
admin/views/emoji.vue:
|
||||||
announcements: "お知らせ"
|
add-emoji:
|
||||||
|
title: "絵文字の登録"
|
||||||
|
name: "絵文字名"
|
||||||
|
name-desc: "a~z 0~9 _ の文字が使えます。"
|
||||||
|
aliases: "エイリアス"
|
||||||
|
aliases-desc: "スペースで区切って複数設定できます。"
|
||||||
|
url: "絵文字画像URL"
|
||||||
|
add: "追加"
|
||||||
|
info: "50KB以下のPNG画像をおすすめします。"
|
||||||
|
added: "絵文字を登録しました"
|
||||||
|
emojis:
|
||||||
|
title: "絵文字一覧"
|
||||||
|
update: "更新"
|
||||||
|
remove: "削除"
|
||||||
|
updated: "更新しました"
|
||||||
|
remove-emoji:
|
||||||
|
are-you-sure: "「$1」を削除しますか?"
|
||||||
|
removed: "削除しました"
|
||||||
|
|
||||||
desktop/views/pages/admin/admin.hashtags.vue:
|
admin/views/announcements.vue:
|
||||||
|
announcements: "お知らせ"
|
||||||
|
save: "保存"
|
||||||
|
remove: "削除"
|
||||||
|
add: "追加"
|
||||||
|
title: "タイトル"
|
||||||
|
text: "内容"
|
||||||
|
saved: "保存しました"
|
||||||
|
_remove:
|
||||||
|
are-you-sure: "「$1」を削除しますか?"
|
||||||
|
removed: "削除しました"
|
||||||
|
|
||||||
|
admin/views/hashtags.vue:
|
||||||
hided-tags: "Hidden Tags"
|
hided-tags: "Hidden Tags"
|
||||||
|
|
||||||
desktop/views/pages/deck/deck.tl-column.vue:
|
desktop/views/pages/deck/deck.tl-column.vue:
|
||||||
@ -1128,12 +1181,6 @@ desktop/views/pages/deck/deck.user-column.vue:
|
|||||||
pinned-notes: "ピン留めされた投稿"
|
pinned-notes: "ピン留めされた投稿"
|
||||||
push-to-a-list: "リストに追加"
|
push-to-a-list: "リストに追加"
|
||||||
|
|
||||||
desktop/views/pages/stats/stats.vue:
|
|
||||||
all-users: "全てのユーザー"
|
|
||||||
original-users: "このインスタンスのユーザー"
|
|
||||||
all-notes: "全ての投稿"
|
|
||||||
original-notes: "このインスタンスの投稿"
|
|
||||||
|
|
||||||
desktop/views/pages/welcome.vue:
|
desktop/views/pages/welcome.vue:
|
||||||
about: "詳しく..."
|
about: "詳しく..."
|
||||||
gotit: "わかった"
|
gotit: "わかった"
|
||||||
@ -1515,6 +1562,10 @@ mobile/views/pages/settings.vue:
|
|||||||
twitter-connect: "Twitterアカウントに接続する"
|
twitter-connect: "Twitterアカウントに接続する"
|
||||||
twitter-reconnect: "再接続する"
|
twitter-reconnect: "再接続する"
|
||||||
twitter-disconnect: "切断する"
|
twitter-disconnect: "切断する"
|
||||||
|
github: "GitHub連携"
|
||||||
|
github-connect: "GitHubアカウントに接続する"
|
||||||
|
github-reconnect: "再接続する"
|
||||||
|
github-disconnect: "切断する"
|
||||||
update: "Misskey Update"
|
update: "Misskey Update"
|
||||||
version: "バージョン:"
|
version: "バージョン:"
|
||||||
latest-version: "最新のバージョン:"
|
latest-version: "最新のバージョン:"
|
||||||
@ -1529,6 +1580,7 @@ mobile/views/pages/settings.vue:
|
|||||||
sound: "サウンド"
|
sound: "サウンド"
|
||||||
enable-sounds: "サウンドを有効にする"
|
enable-sounds: "サウンドを有効にする"
|
||||||
mark-as-read-all-unread-notes: "すべての投稿を既読にする"
|
mark-as-read-all-unread-notes: "すべての投稿を既読にする"
|
||||||
|
password: "パスワード"
|
||||||
|
|
||||||
mobile/views/pages/user.vue:
|
mobile/views/pages/user.vue:
|
||||||
follows-you: "フォローされています"
|
follows-you: "フォローされています"
|
||||||
|
@ -186,6 +186,7 @@ common:
|
|||||||
stack-left: "左に重ねんで!"
|
stack-left: "左に重ねんで!"
|
||||||
pop-right: "右に出すで!"
|
pop-right: "右に出すで!"
|
||||||
dev: "アプリの作成あかんかったわ。もっぺんやってみて。"
|
dev: "アプリの作成あかんかったわ。もっぺんやってみて。"
|
||||||
|
ai-chan-kawaii: "藍ちゃめっさべっぴんさんや"
|
||||||
auth/views/form.vue:
|
auth/views/form.vue:
|
||||||
share-access: "<i>{{ app.name }}</i>があんさんのアカウントにアクセスすんのを<b>許可</b>してもええか?"
|
share-access: "<i>{{ app.name }}</i>があんさんのアカウントにアクセスすんのを<b>許可</b>してもええか?"
|
||||||
permission-ask: "このアプリは次の権限を要求してんで:"
|
permission-ask: "このアプリは次の権限を要求してんで:"
|
||||||
@ -743,7 +744,7 @@ desktop/views/components/settings.vue:
|
|||||||
apps: "アプリ"
|
apps: "アプリ"
|
||||||
mute-and-block: "ミュート/ブロック"
|
mute-and-block: "ミュート/ブロック"
|
||||||
blocking: "ブロック"
|
blocking: "ブロック"
|
||||||
security: "守護神セキュリティ"
|
security: "セキュリティ"
|
||||||
signin: "こんな感じでサインインしたらしいで"
|
signin: "こんな感じでサインインしたらしいで"
|
||||||
password: "パスワード"
|
password: "パスワード"
|
||||||
2fa: "二段階認証"
|
2fa: "二段階認証"
|
||||||
@ -872,13 +873,13 @@ common/views/components/mute-and-block.vue:
|
|||||||
mute-and-block: "ミュートとブロック"
|
mute-and-block: "ミュートとブロック"
|
||||||
mute: "ミュート"
|
mute: "ミュート"
|
||||||
block: "ブロック"
|
block: "ブロック"
|
||||||
no-muted-users: "ミュートしているユーザーはいません"
|
no-muted-users: "ミュートしとるユーザーはおらんで"
|
||||||
no-blocked-users: "ブロックしているユーザーはいません"
|
no-blocked-users: "ブロックしとるユーザーはおらんで"
|
||||||
desktop/views/components/settings.password.vue:
|
common/views/components/password-settings.vue:
|
||||||
reset: "パスワードを変更する"
|
reset: "パスワード変える"
|
||||||
enter-current-password: "今のパスワードを入れてや"
|
enter-current-password: "今のパスワードを入れてや"
|
||||||
enter-new-password: "さらのパスワード入れてや"
|
enter-new-password: "こんどのパスワード入れてや"
|
||||||
enter-new-password-again: "もういっぺんさらのパスワードを入れてや"
|
enter-new-password-again: "もっぺん入れてや"
|
||||||
not-match: "パスワードがおうとらん"
|
not-match: "パスワードがおうとらん"
|
||||||
changed: "パスワード変えたわ"
|
changed: "パスワード変えたわ"
|
||||||
desktop/views/components/sub-note-content.vue:
|
desktop/views/components/sub-note-content.vue:
|
||||||
@ -946,41 +947,86 @@ desktop/views/components/users-list-item.vue:
|
|||||||
desktop/views/components/window.vue:
|
desktop/views/components/window.vue:
|
||||||
popout: "ポップアウト"
|
popout: "ポップアウト"
|
||||||
close: "さいなら"
|
close: "さいなら"
|
||||||
desktop/views/pages/admin/admin.vue:
|
admin/views/index.vue:
|
||||||
dashboard: "ダッシュボード"
|
dashboard: "ダッシュボード"
|
||||||
|
instance: "インスタンス"
|
||||||
|
emoji: "カスタム絵文字"
|
||||||
users: "ユーザー"
|
users: "ユーザー"
|
||||||
update: "更新"
|
update: "更新"
|
||||||
announcements: "知っといてや"
|
announcements: "知っといてや"
|
||||||
hashtags: "ハッシュタグ"
|
hashtags: "ハッシュタグ"
|
||||||
desktop/views/pages/admin/admin.dashboard.vue:
|
back-to-misskey: "Misskeyに戻る"
|
||||||
|
admin/views/dashboard.vue:
|
||||||
dashboard: "ダッシュボード"
|
dashboard: "ダッシュボード"
|
||||||
all-users: "知り合い全員や"
|
accounts: "アカウント"
|
||||||
original-users: "ここの人らだけ"
|
notes: "投稿"
|
||||||
all-notes: "全ての投稿"
|
drive: "ドライブ"
|
||||||
original-notes: "このインスタンスの投稿"
|
instances: "インスタンス"
|
||||||
|
this-instance: "ワイのインスタンス"
|
||||||
|
federated: "連合"
|
||||||
invite: "来てや"
|
invite: "来てや"
|
||||||
banner-url: "Banner URL"
|
banner-url: "Banner URL"
|
||||||
disableRegistration: "Disable new user registration"
|
disableRegistration: "Disable new user registration"
|
||||||
disableLocalTimeline: "Disable the local timeline"
|
disableLocalTimeline: "Disable the local timeline"
|
||||||
desktop/views/pages/admin/admin.suspend-user.vue:
|
admin/views/charts.vue:
|
||||||
|
title: "チャート"
|
||||||
|
per-day: "1日ごと"
|
||||||
|
per-hour: "1時間ごと"
|
||||||
|
federation: "フェデレーション"
|
||||||
|
notes: "投稿"
|
||||||
|
users: "ユーザー"
|
||||||
|
drive: "ドライブ"
|
||||||
|
network: "ネットワーク"
|
||||||
|
charts:
|
||||||
|
federation-instances: "インスタンスの増減"
|
||||||
|
federation-instances-total: "インスタンスの積算"
|
||||||
|
notes: "投稿の増減(統合)"
|
||||||
|
local-notes: "投稿の増減 (ローカル)"
|
||||||
|
remote-notes: "投稿の増減 (リモート)"
|
||||||
|
notes-total: "投稿の積算"
|
||||||
|
users: "ユーザーの増減"
|
||||||
|
users-total: "ユーザーの積算"
|
||||||
|
drive: "ドライブ使用量の増減"
|
||||||
|
drive-total: "ドライブ使用量の積算"
|
||||||
|
drive-files: "ドライブのファイル数の増減"
|
||||||
|
drive-files-total: "ドライブのファイル数の積算"
|
||||||
|
network-requests: "リクエスト"
|
||||||
|
network-time: "応答時間"
|
||||||
|
network-usage: "通信量"
|
||||||
|
admin/views/users.vue:
|
||||||
suspend-user: "ユーザーの凍結"
|
suspend-user: "ユーザーの凍結"
|
||||||
suspend: "凍結"
|
suspend: "凍結"
|
||||||
suspended: "凍結したで"
|
suspended: "凍結しました"
|
||||||
desktop/views/pages/admin/admin.unsuspend-user.vue:
|
|
||||||
unsuspend-user: "ユーザーの凍結の解除"
|
unsuspend-user: "ユーザーの凍結の解除"
|
||||||
unsuspend: "凍結の解除"
|
unsuspend: "凍結の解除"
|
||||||
unsuspended: "凍結を解除したで"
|
unsuspended: "凍結を解除しました"
|
||||||
desktop/views/pages/admin/admin.verify-user.vue:
|
|
||||||
verify-user: "ユーザーの公式アカウント設定"
|
verify-user: "ユーザーの公式アカウント設定"
|
||||||
verify: "公式アカウントにする"
|
verify: "公式アカウントにする"
|
||||||
verified: "公式アカウントにしたで"
|
verified: "公式アカウントにしました"
|
||||||
desktop/views/pages/admin/admin.unverify-user.vue:
|
unverify-user: "ユーザーの公式アカウント解除"
|
||||||
unverify-user: "ユーザーの公式アカウントにせーへん"
|
unverify: "公式アカウントを解除する"
|
||||||
unverify: "公式アカウントにはさせへんで"
|
unverified: "公式アカウントを解除しました"
|
||||||
unverified: "公式アカウントを解除したで"
|
admin/views/emoji.vue:
|
||||||
desktop/views/pages/admin/admin.announcements.vue:
|
add-emoji:
|
||||||
announcements: "知っといてや"
|
title: "絵文字の登録"
|
||||||
desktop/views/pages/admin/admin.hashtags.vue:
|
name: "絵文字名"
|
||||||
|
name-desc: "a~z 0~9 _ の文字が使えます。"
|
||||||
|
aliases: "エイリアス"
|
||||||
|
aliases-desc: "スペースで区切って複数設定できます。"
|
||||||
|
url: "絵文字画像URL"
|
||||||
|
add: "追加"
|
||||||
|
emojis:
|
||||||
|
title: "絵文字一覧"
|
||||||
|
update: "更新"
|
||||||
|
remove: "削除"
|
||||||
|
admin/views/announcements.vue:
|
||||||
|
announcements: "お知らせ"
|
||||||
|
save: "保存"
|
||||||
|
remove: "削除"
|
||||||
|
add: "追加"
|
||||||
|
title: "タイトル"
|
||||||
|
text: "内容"
|
||||||
|
admin/views/hashtags.vue:
|
||||||
hided-tags: "Hidden Tags"
|
hided-tags: "Hidden Tags"
|
||||||
desktop/views/pages/deck/deck.tl-column.vue:
|
desktop/views/pages/deck/deck.tl-column.vue:
|
||||||
is-media-only: "メディア投稿だけや"
|
is-media-only: "メディア投稿だけや"
|
||||||
@ -1328,6 +1374,7 @@ mobile/views/pages/settings.vue:
|
|||||||
sound: "サウンド"
|
sound: "サウンド"
|
||||||
enable-sounds: "サウンド鳴らす"
|
enable-sounds: "サウンド鳴らす"
|
||||||
mark-as-read-all-unread-notes: "全部もう読んだわ"
|
mark-as-read-all-unread-notes: "全部もう読んだわ"
|
||||||
|
password: "パスワード"
|
||||||
mobile/views/pages/user.vue:
|
mobile/views/pages/user.vue:
|
||||||
follows-you: "フォローされとるで"
|
follows-you: "フォローされとるで"
|
||||||
following: "フォロー"
|
following: "フォロー"
|
||||||
@ -1340,7 +1387,7 @@ mobile/views/pages/user.vue:
|
|||||||
mute: "ミュート"
|
mute: "ミュート"
|
||||||
unmute: "ミュート解除"
|
unmute: "ミュート解除"
|
||||||
block: "ブロック"
|
block: "ブロック"
|
||||||
unblock: "ブロック解除"
|
unblock: "ブロックやめたる"
|
||||||
mobile/views/pages/user/home.vue:
|
mobile/views/pages/user/home.vue:
|
||||||
recent-notes: "最近儲かりまっか?"
|
recent-notes: "最近儲かりまっか?"
|
||||||
images: "画像"
|
images: "画像"
|
||||||
|
@ -186,6 +186,7 @@ common:
|
|||||||
stack-left: "左に重ねる"
|
stack-left: "左に重ねる"
|
||||||
pop-right: "右に出す"
|
pop-right: "右に出す"
|
||||||
dev: "アプリの作成に失敗しました。再度お試しください。"
|
dev: "アプリの作成に失敗しました。再度お試しください。"
|
||||||
|
ai-chan-kawaii: "藍ちゃかわいい"
|
||||||
auth/views/form.vue:
|
auth/views/form.vue:
|
||||||
share-access: "<i>{{ app.name }}</i>があなたのアカウントにアクセスすることを<b>許可</b>しますか?"
|
share-access: "<i>{{ app.name }}</i>があなたのアカウントにアクセスすることを<b>許可</b>しますか?"
|
||||||
permission-ask: "このアプリは次の権限を要求しています:"
|
permission-ask: "このアプリは次の権限を要求しています:"
|
||||||
@ -874,7 +875,7 @@ common/views/components/mute-and-block.vue:
|
|||||||
block: "ブロック"
|
block: "ブロック"
|
||||||
no-muted-users: "ミュートしているユーザーはいません"
|
no-muted-users: "ミュートしているユーザーはいません"
|
||||||
no-blocked-users: "ブロックしているユーザーはいません"
|
no-blocked-users: "ブロックしているユーザーはいません"
|
||||||
desktop/views/components/settings.password.vue:
|
common/views/components/password-settings.vue:
|
||||||
reset: "パスワードを変更する"
|
reset: "パスワードを変更する"
|
||||||
enter-current-password: "現在のパスワードを入力してください"
|
enter-current-password: "現在のパスワードを入力してください"
|
||||||
enter-new-password: "新しいパスワードを入力してください"
|
enter-new-password: "新しいパスワードを入力してください"
|
||||||
@ -946,41 +947,86 @@ desktop/views/components/users-list-item.vue:
|
|||||||
desktop/views/components/window.vue:
|
desktop/views/components/window.vue:
|
||||||
popout: "ポップアウト"
|
popout: "ポップアウト"
|
||||||
close: "閉じる"
|
close: "閉じる"
|
||||||
desktop/views/pages/admin/admin.vue:
|
admin/views/index.vue:
|
||||||
dashboard: "ダッシュボード"
|
dashboard: "ダッシュボード"
|
||||||
|
instance: "インスタンス"
|
||||||
|
emoji: "カスタム絵文字"
|
||||||
users: "ユーザー"
|
users: "ユーザー"
|
||||||
update: "更新"
|
update: "更新"
|
||||||
announcements: "お知らせ"
|
announcements: "お知らせ"
|
||||||
hashtags: "ハッシュタグ"
|
hashtags: "ハッシュタグ"
|
||||||
desktop/views/pages/admin/admin.dashboard.vue:
|
back-to-misskey: "Misskeyに戻る"
|
||||||
|
admin/views/dashboard.vue:
|
||||||
dashboard: "ダッシュボード"
|
dashboard: "ダッシュボード"
|
||||||
all-users: "全てのユーザー"
|
accounts: "アカウント"
|
||||||
original-users: "このインスタンスのユーザー"
|
notes: "投稿"
|
||||||
all-notes: "全ての投稿"
|
drive: "ドライブ"
|
||||||
original-notes: "このインスタンスの投稿"
|
instances: "インスタンス"
|
||||||
|
this-instance: "このインスタンス"
|
||||||
|
federated: "連合"
|
||||||
invite: "招待"
|
invite: "招待"
|
||||||
banner-url: "Banner URL"
|
banner-url: "Banner URL"
|
||||||
disableRegistration: "Disable new user registration"
|
disableRegistration: "Disable new user registration"
|
||||||
disableLocalTimeline: "Disable the local timeline"
|
disableLocalTimeline: "Disable the local timeline"
|
||||||
desktop/views/pages/admin/admin.suspend-user.vue:
|
admin/views/charts.vue:
|
||||||
|
title: "チャート"
|
||||||
|
per-day: "1日ごと"
|
||||||
|
per-hour: "1時間ごと"
|
||||||
|
federation: "フェデレーション"
|
||||||
|
notes: "投稿"
|
||||||
|
users: "ユーザー"
|
||||||
|
drive: "ドライブ"
|
||||||
|
network: "ネットワーク"
|
||||||
|
charts:
|
||||||
|
federation-instances: "インスタンスの増減"
|
||||||
|
federation-instances-total: "インスタンスの積算"
|
||||||
|
notes: "投稿の増減 (統合)"
|
||||||
|
local-notes: "投稿の増減 (ローカル)"
|
||||||
|
remote-notes: "投稿の増減 (リモート)"
|
||||||
|
notes-total: "投稿の積算"
|
||||||
|
users: "ユーザーの増減"
|
||||||
|
users-total: "ユーザーの積算"
|
||||||
|
drive: "ドライブ使用量の増減"
|
||||||
|
drive-total: "ドライブ使用量の積算"
|
||||||
|
drive-files: "ドライブのファイル数の増減"
|
||||||
|
drive-files-total: "ドライブのファイル数の積算"
|
||||||
|
network-requests: "リクエスト"
|
||||||
|
network-time: "応答時間"
|
||||||
|
network-usage: "通信量"
|
||||||
|
admin/views/users.vue:
|
||||||
suspend-user: "ユーザーの凍結"
|
suspend-user: "ユーザーの凍結"
|
||||||
suspend: "凍結"
|
suspend: "凍結"
|
||||||
suspended: "凍結しました"
|
suspended: "凍結しました"
|
||||||
desktop/views/pages/admin/admin.unsuspend-user.vue:
|
|
||||||
unsuspend-user: "ユーザーの凍結の解除"
|
unsuspend-user: "ユーザーの凍結の解除"
|
||||||
unsuspend: "凍結の解除"
|
unsuspend: "凍結の解除"
|
||||||
unsuspended: "凍結を解除しました"
|
unsuspended: "凍結を解除しました"
|
||||||
desktop/views/pages/admin/admin.verify-user.vue:
|
|
||||||
verify-user: "ユーザーの公式アカウント設定"
|
verify-user: "ユーザーの公式アカウント設定"
|
||||||
verify: "公式アカウントにする"
|
verify: "公式アカウントにする"
|
||||||
verified: "公式アカウントにしました"
|
verified: "公式アカウントにしました"
|
||||||
desktop/views/pages/admin/admin.unverify-user.vue:
|
|
||||||
unverify-user: "ユーザーの公式アカウント解除"
|
unverify-user: "ユーザーの公式アカウント解除"
|
||||||
unverify: "公式アカウントを解除する"
|
unverify: "公式アカウントを解除する"
|
||||||
unverified: "公式アカウントを解除しました"
|
unverified: "公式アカウントを解除しました"
|
||||||
desktop/views/pages/admin/admin.announcements.vue:
|
admin/views/emoji.vue:
|
||||||
|
add-emoji:
|
||||||
|
title: "絵文字の登録"
|
||||||
|
name: "絵文字名"
|
||||||
|
name-desc: "a~z 0~9 _ の文字が使えます。"
|
||||||
|
aliases: "エイリアス"
|
||||||
|
aliases-desc: "スペースで区切って複数設定できます。"
|
||||||
|
url: "絵文字画像URL"
|
||||||
|
add: "追加"
|
||||||
|
emojis:
|
||||||
|
title: "絵文字一覧"
|
||||||
|
update: "更新"
|
||||||
|
remove: "削除"
|
||||||
|
admin/views/announcements.vue:
|
||||||
announcements: "お知らせ"
|
announcements: "お知らせ"
|
||||||
desktop/views/pages/admin/admin.hashtags.vue:
|
save: "保存"
|
||||||
|
remove: "削除"
|
||||||
|
add: "追加"
|
||||||
|
title: "タイトル"
|
||||||
|
text: "内容"
|
||||||
|
admin/views/hashtags.vue:
|
||||||
hided-tags: "Hidden Tags"
|
hided-tags: "Hidden Tags"
|
||||||
desktop/views/pages/deck/deck.tl-column.vue:
|
desktop/views/pages/deck/deck.tl-column.vue:
|
||||||
is-media-only: "メディア投稿のみ"
|
is-media-only: "メディア投稿のみ"
|
||||||
@ -1328,6 +1374,7 @@ mobile/views/pages/settings.vue:
|
|||||||
sound: "サウンド"
|
sound: "サウンド"
|
||||||
enable-sounds: "サウンドを有効にする"
|
enable-sounds: "サウンドを有効にする"
|
||||||
mark-as-read-all-unread-notes: "すべての投稿を既読にする"
|
mark-as-read-all-unread-notes: "すべての投稿を既読にする"
|
||||||
|
password: "パスワード"
|
||||||
mobile/views/pages/user.vue:
|
mobile/views/pages/user.vue:
|
||||||
follows-you: "フォローされています"
|
follows-you: "フォローされています"
|
||||||
following: "フォロー"
|
following: "フォロー"
|
||||||
|
@ -186,6 +186,7 @@ common:
|
|||||||
stack-left: "左に重ねる"
|
stack-left: "左に重ねる"
|
||||||
pop-right: "右に出す"
|
pop-right: "右に出す"
|
||||||
dev: "アプリの作成に失敗しました。再度お試しください。"
|
dev: "アプリの作成に失敗しました。再度お試しください。"
|
||||||
|
ai-chan-kawaii: "藍ちゃかわいい"
|
||||||
auth/views/form.vue:
|
auth/views/form.vue:
|
||||||
share-access: "<i>{{ app.name }}</i>があなたのアカウントにアクセスすることを<b>許可</b>しますか?"
|
share-access: "<i>{{ app.name }}</i>があなたのアカウントにアクセスすることを<b>許可</b>しますか?"
|
||||||
permission-ask: "このアプリは次の権限を要求しています:"
|
permission-ask: "このアプリは次の権限を要求しています:"
|
||||||
@ -874,13 +875,13 @@ common/views/components/mute-and-block.vue:
|
|||||||
block: "ブロック"
|
block: "ブロック"
|
||||||
no-muted-users: "ミュートしているユーザーはいません"
|
no-muted-users: "ミュートしているユーザーはいません"
|
||||||
no-blocked-users: "ブロックしているユーザーはいません"
|
no-blocked-users: "ブロックしているユーザーはいません"
|
||||||
desktop/views/components/settings.password.vue:
|
common/views/components/password-settings.vue:
|
||||||
reset: "Wachtwoord wijzigen"
|
reset: "パスワードを変更する"
|
||||||
enter-current-password: "Voer je huidige wachtwoord in"
|
enter-current-password: "現在のパスワードを入力してください"
|
||||||
enter-new-password: "Voer je nieuwe wachtwoord in"
|
enter-new-password: "新しいパスワードを入力してください"
|
||||||
enter-new-password-again: "Voer je nieuwe wachtwoord nogmaals in"
|
enter-new-password-again: "もう一度新しいパスワードを入力してください"
|
||||||
not-match: "Het nieuwe wachtwoord komt niet overeen"
|
not-match: "新しいパスワードが一致しません"
|
||||||
changed: "Wachtwoord bijgewerkt"
|
changed: "パスワードを変更しました"
|
||||||
desktop/views/components/sub-note-content.vue:
|
desktop/views/components/sub-note-content.vue:
|
||||||
private: "この投稿は非公開です"
|
private: "この投稿は非公開です"
|
||||||
deleted: "この投稿は削除されました"
|
deleted: "この投稿は削除されました"
|
||||||
@ -946,41 +947,86 @@ desktop/views/components/users-list-item.vue:
|
|||||||
desktop/views/components/window.vue:
|
desktop/views/components/window.vue:
|
||||||
popout: "Uitvouwen"
|
popout: "Uitvouwen"
|
||||||
close: "Sluiten"
|
close: "Sluiten"
|
||||||
desktop/views/pages/admin/admin.vue:
|
admin/views/index.vue:
|
||||||
dashboard: "ダッシュボード"
|
dashboard: "ダッシュボード"
|
||||||
|
instance: "インスタンス"
|
||||||
|
emoji: "カスタム絵文字"
|
||||||
users: "ユーザー"
|
users: "ユーザー"
|
||||||
update: "更新"
|
update: "更新"
|
||||||
announcements: "お知らせ"
|
announcements: "お知らせ"
|
||||||
hashtags: "ハッシュタグ"
|
hashtags: "ハッシュタグ"
|
||||||
desktop/views/pages/admin/admin.dashboard.vue:
|
back-to-misskey: "Misskeyに戻る"
|
||||||
|
admin/views/dashboard.vue:
|
||||||
dashboard: "ダッシュボード"
|
dashboard: "ダッシュボード"
|
||||||
all-users: "全てのユーザー"
|
accounts: "アカウント"
|
||||||
original-users: "このインスタンスのユーザー"
|
notes: "投稿"
|
||||||
all-notes: "全ての投稿"
|
drive: "ドライブ"
|
||||||
original-notes: "このインスタンスの投稿"
|
instances: "インスタンス"
|
||||||
|
this-instance: "このインスタンス"
|
||||||
|
federated: "連合"
|
||||||
invite: "招待"
|
invite: "招待"
|
||||||
banner-url: "Banner URL"
|
banner-url: "Banner URL"
|
||||||
disableRegistration: "Disable new user registration"
|
disableRegistration: "Disable new user registration"
|
||||||
disableLocalTimeline: "Disable the local timeline"
|
disableLocalTimeline: "Disable the local timeline"
|
||||||
desktop/views/pages/admin/admin.suspend-user.vue:
|
admin/views/charts.vue:
|
||||||
|
title: "チャート"
|
||||||
|
per-day: "1日ごと"
|
||||||
|
per-hour: "1時間ごと"
|
||||||
|
federation: "フェデレーション"
|
||||||
|
notes: "投稿"
|
||||||
|
users: "ユーザー"
|
||||||
|
drive: "ドライブ"
|
||||||
|
network: "ネットワーク"
|
||||||
|
charts:
|
||||||
|
federation-instances: "インスタンスの増減"
|
||||||
|
federation-instances-total: "インスタンスの積算"
|
||||||
|
notes: "投稿の増減 (統合)"
|
||||||
|
local-notes: "投稿の増減 (ローカル)"
|
||||||
|
remote-notes: "投稿の増減 (リモート)"
|
||||||
|
notes-total: "投稿の積算"
|
||||||
|
users: "ユーザーの増減"
|
||||||
|
users-total: "ユーザーの積算"
|
||||||
|
drive: "ドライブ使用量の増減"
|
||||||
|
drive-total: "ドライブ使用量の積算"
|
||||||
|
drive-files: "ドライブのファイル数の増減"
|
||||||
|
drive-files-total: "ドライブのファイル数の積算"
|
||||||
|
network-requests: "リクエスト"
|
||||||
|
network-time: "応答時間"
|
||||||
|
network-usage: "通信量"
|
||||||
|
admin/views/users.vue:
|
||||||
suspend-user: "ユーザーの凍結"
|
suspend-user: "ユーザーの凍結"
|
||||||
suspend: "凍結"
|
suspend: "凍結"
|
||||||
suspended: "凍結しました"
|
suspended: "凍結しました"
|
||||||
desktop/views/pages/admin/admin.unsuspend-user.vue:
|
|
||||||
unsuspend-user: "ユーザーの凍結の解除"
|
unsuspend-user: "ユーザーの凍結の解除"
|
||||||
unsuspend: "凍結の解除"
|
unsuspend: "凍結の解除"
|
||||||
unsuspended: "凍結を解除しました"
|
unsuspended: "凍結を解除しました"
|
||||||
desktop/views/pages/admin/admin.verify-user.vue:
|
|
||||||
verify-user: "ユーザーの公式アカウント設定"
|
verify-user: "ユーザーの公式アカウント設定"
|
||||||
verify: "公式アカウントにする"
|
verify: "公式アカウントにする"
|
||||||
verified: "公式アカウントにしました"
|
verified: "公式アカウントにしました"
|
||||||
desktop/views/pages/admin/admin.unverify-user.vue:
|
|
||||||
unverify-user: "ユーザーの公式アカウント解除"
|
unverify-user: "ユーザーの公式アカウント解除"
|
||||||
unverify: "公式アカウントを解除する"
|
unverify: "公式アカウントを解除する"
|
||||||
unverified: "公式アカウントを解除しました"
|
unverified: "公式アカウントを解除しました"
|
||||||
desktop/views/pages/admin/admin.announcements.vue:
|
admin/views/emoji.vue:
|
||||||
|
add-emoji:
|
||||||
|
title: "絵文字の登録"
|
||||||
|
name: "絵文字名"
|
||||||
|
name-desc: "a~z 0~9 _ の文字が使えます。"
|
||||||
|
aliases: "エイリアス"
|
||||||
|
aliases-desc: "スペースで区切って複数設定できます。"
|
||||||
|
url: "絵文字画像URL"
|
||||||
|
add: "追加"
|
||||||
|
emojis:
|
||||||
|
title: "絵文字一覧"
|
||||||
|
update: "更新"
|
||||||
|
remove: "削除"
|
||||||
|
admin/views/announcements.vue:
|
||||||
announcements: "お知らせ"
|
announcements: "お知らせ"
|
||||||
desktop/views/pages/admin/admin.hashtags.vue:
|
save: "保存"
|
||||||
|
remove: "削除"
|
||||||
|
add: "追加"
|
||||||
|
title: "タイトル"
|
||||||
|
text: "内容"
|
||||||
|
admin/views/hashtags.vue:
|
||||||
hided-tags: "Hidden Tags"
|
hided-tags: "Hidden Tags"
|
||||||
desktop/views/pages/deck/deck.tl-column.vue:
|
desktop/views/pages/deck/deck.tl-column.vue:
|
||||||
is-media-only: "メディア投稿のみ"
|
is-media-only: "メディア投稿のみ"
|
||||||
@ -1328,6 +1374,7 @@ mobile/views/pages/settings.vue:
|
|||||||
sound: "サウンド"
|
sound: "サウンド"
|
||||||
enable-sounds: "サウンドを有効にする"
|
enable-sounds: "サウンドを有効にする"
|
||||||
mark-as-read-all-unread-notes: "すべての投稿を既読にする"
|
mark-as-read-all-unread-notes: "すべての投稿を既読にする"
|
||||||
|
password: "パスワード"
|
||||||
mobile/views/pages/user.vue:
|
mobile/views/pages/user.vue:
|
||||||
follows-you: "Volgt jou"
|
follows-you: "Volgt jou"
|
||||||
following: "Volgend"
|
following: "Volgend"
|
||||||
|
@ -186,6 +186,7 @@ common:
|
|||||||
stack-left: "左に重ねる"
|
stack-left: "左に重ねる"
|
||||||
pop-right: "Til høyre"
|
pop-right: "Til høyre"
|
||||||
dev: "アプリの作成に失敗しました。再度お試しください。"
|
dev: "アプリの作成に失敗しました。再度お試しください。"
|
||||||
|
ai-chan-kawaii: "藍ちゃかわいい"
|
||||||
auth/views/form.vue:
|
auth/views/form.vue:
|
||||||
share-access: "<i>{{ app.name }}</i>があなたのアカウントにアクセスすることを<b>許可</b>しますか?"
|
share-access: "<i>{{ app.name }}</i>があなたのアカウントにアクセスすることを<b>許可</b>しますか?"
|
||||||
permission-ask: "このアプリは次の権限を要求しています:"
|
permission-ask: "このアプリは次の権限を要求しています:"
|
||||||
@ -874,7 +875,7 @@ common/views/components/mute-and-block.vue:
|
|||||||
block: "ブロック"
|
block: "ブロック"
|
||||||
no-muted-users: "ミュートしているユーザーはいません"
|
no-muted-users: "ミュートしているユーザーはいません"
|
||||||
no-blocked-users: "ブロックしているユーザーはいません"
|
no-blocked-users: "ブロックしているユーザーはいません"
|
||||||
desktop/views/components/settings.password.vue:
|
common/views/components/password-settings.vue:
|
||||||
reset: "パスワードを変更する"
|
reset: "パスワードを変更する"
|
||||||
enter-current-password: "現在のパスワードを入力してください"
|
enter-current-password: "現在のパスワードを入力してください"
|
||||||
enter-new-password: "新しいパスワードを入力してください"
|
enter-new-password: "新しいパスワードを入力してください"
|
||||||
@ -946,41 +947,86 @@ desktop/views/components/users-list-item.vue:
|
|||||||
desktop/views/components/window.vue:
|
desktop/views/components/window.vue:
|
||||||
popout: "ポップアウト"
|
popout: "ポップアウト"
|
||||||
close: "Lukk"
|
close: "Lukk"
|
||||||
desktop/views/pages/admin/admin.vue:
|
admin/views/index.vue:
|
||||||
dashboard: "ダッシュボード"
|
dashboard: "ダッシュボード"
|
||||||
users: "Brukere"
|
instance: "インスタンス"
|
||||||
update: "Oppdater"
|
emoji: "カスタム絵文字"
|
||||||
|
users: "ユーザー"
|
||||||
|
update: "更新"
|
||||||
announcements: "お知らせ"
|
announcements: "お知らせ"
|
||||||
hashtags: "ハッシュタグ"
|
hashtags: "ハッシュタグ"
|
||||||
desktop/views/pages/admin/admin.dashboard.vue:
|
back-to-misskey: "Misskeyに戻る"
|
||||||
|
admin/views/dashboard.vue:
|
||||||
dashboard: "ダッシュボード"
|
dashboard: "ダッシュボード"
|
||||||
all-users: "全てのユーザー"
|
accounts: "アカウント"
|
||||||
original-users: "このインスタンスのユーザー"
|
notes: "投稿"
|
||||||
all-notes: "全ての投稿"
|
drive: "ドライブ"
|
||||||
original-notes: "このインスタンスの投稿"
|
instances: "インスタンス"
|
||||||
invite: "Inviter"
|
this-instance: "このインスタンス"
|
||||||
|
federated: "連合"
|
||||||
|
invite: "招待"
|
||||||
banner-url: "Banner URL"
|
banner-url: "Banner URL"
|
||||||
disableRegistration: "Disable new user registration"
|
disableRegistration: "Disable new user registration"
|
||||||
disableLocalTimeline: "Disable the local timeline"
|
disableLocalTimeline: "Disable the local timeline"
|
||||||
desktop/views/pages/admin/admin.suspend-user.vue:
|
admin/views/charts.vue:
|
||||||
|
title: "チャート"
|
||||||
|
per-day: "1日ごと"
|
||||||
|
per-hour: "1時間ごと"
|
||||||
|
federation: "フェデレーション"
|
||||||
|
notes: "投稿"
|
||||||
|
users: "ユーザー"
|
||||||
|
drive: "ドライブ"
|
||||||
|
network: "ネットワーク"
|
||||||
|
charts:
|
||||||
|
federation-instances: "インスタンスの増減"
|
||||||
|
federation-instances-total: "インスタンスの積算"
|
||||||
|
notes: "投稿の増減 (統合)"
|
||||||
|
local-notes: "投稿の増減 (ローカル)"
|
||||||
|
remote-notes: "投稿の増減 (リモート)"
|
||||||
|
notes-total: "投稿の積算"
|
||||||
|
users: "ユーザーの増減"
|
||||||
|
users-total: "ユーザーの積算"
|
||||||
|
drive: "ドライブ使用量の増減"
|
||||||
|
drive-total: "ドライブ使用量の積算"
|
||||||
|
drive-files: "ドライブのファイル数の増減"
|
||||||
|
drive-files-total: "ドライブのファイル数の積算"
|
||||||
|
network-requests: "リクエスト"
|
||||||
|
network-time: "応答時間"
|
||||||
|
network-usage: "通信量"
|
||||||
|
admin/views/users.vue:
|
||||||
suspend-user: "ユーザーの凍結"
|
suspend-user: "ユーザーの凍結"
|
||||||
suspend: "Suspender"
|
suspend: "凍結"
|
||||||
suspended: "凍結しました"
|
suspended: "凍結しました"
|
||||||
desktop/views/pages/admin/admin.unsuspend-user.vue:
|
|
||||||
unsuspend-user: "ユーザーの凍結の解除"
|
unsuspend-user: "ユーザーの凍結の解除"
|
||||||
unsuspend: "凍結の解除"
|
unsuspend: "凍結の解除"
|
||||||
unsuspended: "凍結を解除しました"
|
unsuspended: "凍結を解除しました"
|
||||||
desktop/views/pages/admin/admin.verify-user.vue:
|
|
||||||
verify-user: "ユーザーの公式アカウント設定"
|
verify-user: "ユーザーの公式アカウント設定"
|
||||||
verify: "公式アカウントにする"
|
verify: "公式アカウントにする"
|
||||||
verified: "公式アカウントにしました"
|
verified: "公式アカウントにしました"
|
||||||
desktop/views/pages/admin/admin.unverify-user.vue:
|
|
||||||
unverify-user: "ユーザーの公式アカウント解除"
|
unverify-user: "ユーザーの公式アカウント解除"
|
||||||
unverify: "公式アカウントを解除する"
|
unverify: "公式アカウントを解除する"
|
||||||
unverified: "公式アカウントを解除しました"
|
unverified: "公式アカウントを解除しました"
|
||||||
desktop/views/pages/admin/admin.announcements.vue:
|
admin/views/emoji.vue:
|
||||||
|
add-emoji:
|
||||||
|
title: "絵文字の登録"
|
||||||
|
name: "絵文字名"
|
||||||
|
name-desc: "a~z 0~9 _ の文字が使えます。"
|
||||||
|
aliases: "エイリアス"
|
||||||
|
aliases-desc: "スペースで区切って複数設定できます。"
|
||||||
|
url: "絵文字画像URL"
|
||||||
|
add: "追加"
|
||||||
|
emojis:
|
||||||
|
title: "絵文字一覧"
|
||||||
|
update: "更新"
|
||||||
|
remove: "削除"
|
||||||
|
admin/views/announcements.vue:
|
||||||
announcements: "お知らせ"
|
announcements: "お知らせ"
|
||||||
desktop/views/pages/admin/admin.hashtags.vue:
|
save: "保存"
|
||||||
|
remove: "削除"
|
||||||
|
add: "追加"
|
||||||
|
title: "タイトル"
|
||||||
|
text: "内容"
|
||||||
|
admin/views/hashtags.vue:
|
||||||
hided-tags: "Hidden Tags"
|
hided-tags: "Hidden Tags"
|
||||||
desktop/views/pages/deck/deck.tl-column.vue:
|
desktop/views/pages/deck/deck.tl-column.vue:
|
||||||
is-media-only: "メディア投稿のみ"
|
is-media-only: "メディア投稿のみ"
|
||||||
@ -1328,6 +1374,7 @@ mobile/views/pages/settings.vue:
|
|||||||
sound: "Lyder"
|
sound: "Lyder"
|
||||||
enable-sounds: "サウンドを有効にする"
|
enable-sounds: "サウンドを有効にする"
|
||||||
mark-as-read-all-unread-notes: "すべての投稿を既読にする"
|
mark-as-read-all-unread-notes: "すべての投稿を既読にする"
|
||||||
|
password: "パスワード"
|
||||||
mobile/views/pages/user.vue:
|
mobile/views/pages/user.vue:
|
||||||
follows-you: "フォローされています"
|
follows-you: "フォローされています"
|
||||||
following: "Følger"
|
following: "Følger"
|
||||||
|
@ -186,6 +186,7 @@ common:
|
|||||||
stack-left: "Przypnij do lewej"
|
stack-left: "Przypnij do lewej"
|
||||||
pop-right: "Odepnij w prawo"
|
pop-right: "Odepnij w prawo"
|
||||||
dev: "アプリの作成に失敗しました。再度お試しください。"
|
dev: "アプリの作成に失敗しました。再度お試しください。"
|
||||||
|
ai-chan-kawaii: "藍ちゃかわいい"
|
||||||
auth/views/form.vue:
|
auth/views/form.vue:
|
||||||
share-access: "Czy chcesz <b>zezwolić</b> <i>{{ app.name }}</i> na dostęp do Twojego konta?"
|
share-access: "Czy chcesz <b>zezwolić</b> <i>{{ app.name }}</i> na dostęp do Twojego konta?"
|
||||||
permission-ask: "Ta aplikacja wymaga następujących uprawnień:"
|
permission-ask: "Ta aplikacja wymaga następujących uprawnień:"
|
||||||
@ -874,13 +875,13 @@ common/views/components/mute-and-block.vue:
|
|||||||
block: "ブロック"
|
block: "ブロック"
|
||||||
no-muted-users: "ミュートしているユーザーはいません"
|
no-muted-users: "ミュートしているユーザーはいません"
|
||||||
no-blocked-users: "ブロックしているユーザーはいません"
|
no-blocked-users: "ブロックしているユーザーはいません"
|
||||||
desktop/views/components/settings.password.vue:
|
common/views/components/password-settings.vue:
|
||||||
reset: "Zmień hasło"
|
reset: "パスワードを変更する"
|
||||||
enter-current-password: "Wprowadź obecne hasło"
|
enter-current-password: "現在のパスワードを入力してください"
|
||||||
enter-new-password: "Wprowadź nowe hasło"
|
enter-new-password: "新しいパスワードを入力してください"
|
||||||
enter-new-password-again: "Wprowadź ponownie nowe hasło"
|
enter-new-password-again: "もう一度新しいパスワードを入力してください"
|
||||||
not-match: "Nowe hasła nie pasują do siebie"
|
not-match: "新しいパスワードが一致しません"
|
||||||
changed: "Pomyślnie zmieniono hasło"
|
changed: "パスワードを変更しました"
|
||||||
desktop/views/components/sub-note-content.vue:
|
desktop/views/components/sub-note-content.vue:
|
||||||
private: "ten wpis jest prywatny"
|
private: "ten wpis jest prywatny"
|
||||||
deleted: "ten wpis został usunięty"
|
deleted: "ten wpis został usunięty"
|
||||||
@ -946,41 +947,86 @@ desktop/views/components/users-list-item.vue:
|
|||||||
desktop/views/components/window.vue:
|
desktop/views/components/window.vue:
|
||||||
popout: "Pop-out"
|
popout: "Pop-out"
|
||||||
close: "Zamknij"
|
close: "Zamknij"
|
||||||
desktop/views/pages/admin/admin.vue:
|
admin/views/index.vue:
|
||||||
dashboard: "ダッシュボード"
|
dashboard: "ダッシュボード"
|
||||||
|
instance: "インスタンス"
|
||||||
|
emoji: "カスタム絵文字"
|
||||||
users: "ユーザー"
|
users: "ユーザー"
|
||||||
update: "更新"
|
update: "更新"
|
||||||
announcements: "お知らせ"
|
announcements: "お知らせ"
|
||||||
hashtags: "ハッシュタグ"
|
hashtags: "ハッシュタグ"
|
||||||
desktop/views/pages/admin/admin.dashboard.vue:
|
back-to-misskey: "Misskeyに戻る"
|
||||||
|
admin/views/dashboard.vue:
|
||||||
dashboard: "ダッシュボード"
|
dashboard: "ダッシュボード"
|
||||||
all-users: "全てのユーザー"
|
accounts: "アカウント"
|
||||||
original-users: "このインスタンスのユーザー"
|
notes: "投稿"
|
||||||
all-notes: "全ての投稿"
|
drive: "ドライブ"
|
||||||
original-notes: "このインスタンスの投稿"
|
instances: "インスタンス"
|
||||||
|
this-instance: "このインスタンス"
|
||||||
|
federated: "連合"
|
||||||
invite: "招待"
|
invite: "招待"
|
||||||
banner-url: "Banner URL"
|
banner-url: "Banner URL"
|
||||||
disableRegistration: "Disable new user registration"
|
disableRegistration: "Disable new user registration"
|
||||||
disableLocalTimeline: "Disable the local timeline"
|
disableLocalTimeline: "Disable the local timeline"
|
||||||
desktop/views/pages/admin/admin.suspend-user.vue:
|
admin/views/charts.vue:
|
||||||
|
title: "チャート"
|
||||||
|
per-day: "1日ごと"
|
||||||
|
per-hour: "1時間ごと"
|
||||||
|
federation: "フェデレーション"
|
||||||
|
notes: "投稿"
|
||||||
|
users: "ユーザー"
|
||||||
|
drive: "ドライブ"
|
||||||
|
network: "ネットワーク"
|
||||||
|
charts:
|
||||||
|
federation-instances: "インスタンスの増減"
|
||||||
|
federation-instances-total: "インスタンスの積算"
|
||||||
|
notes: "投稿の増減 (統合)"
|
||||||
|
local-notes: "投稿の増減 (ローカル)"
|
||||||
|
remote-notes: "投稿の増減 (リモート)"
|
||||||
|
notes-total: "投稿の積算"
|
||||||
|
users: "ユーザーの増減"
|
||||||
|
users-total: "ユーザーの積算"
|
||||||
|
drive: "ドライブ使用量の増減"
|
||||||
|
drive-total: "ドライブ使用量の積算"
|
||||||
|
drive-files: "ドライブのファイル数の増減"
|
||||||
|
drive-files-total: "ドライブのファイル数の積算"
|
||||||
|
network-requests: "リクエスト"
|
||||||
|
network-time: "応答時間"
|
||||||
|
network-usage: "通信量"
|
||||||
|
admin/views/users.vue:
|
||||||
suspend-user: "ユーザーの凍結"
|
suspend-user: "ユーザーの凍結"
|
||||||
suspend: "凍結"
|
suspend: "凍結"
|
||||||
suspended: "凍結しました"
|
suspended: "凍結しました"
|
||||||
desktop/views/pages/admin/admin.unsuspend-user.vue:
|
|
||||||
unsuspend-user: "ユーザーの凍結の解除"
|
unsuspend-user: "ユーザーの凍結の解除"
|
||||||
unsuspend: "凍結の解除"
|
unsuspend: "凍結の解除"
|
||||||
unsuspended: "凍結を解除しました"
|
unsuspended: "凍結を解除しました"
|
||||||
desktop/views/pages/admin/admin.verify-user.vue:
|
|
||||||
verify-user: "ユーザーの公式アカウント設定"
|
verify-user: "ユーザーの公式アカウント設定"
|
||||||
verify: "公式アカウントにする"
|
verify: "公式アカウントにする"
|
||||||
verified: "公式アカウントにしました"
|
verified: "公式アカウントにしました"
|
||||||
desktop/views/pages/admin/admin.unverify-user.vue:
|
|
||||||
unverify-user: "ユーザーの公式アカウント解除"
|
unverify-user: "ユーザーの公式アカウント解除"
|
||||||
unverify: "公式アカウントを解除する"
|
unverify: "公式アカウントを解除する"
|
||||||
unverified: "公式アカウントを解除しました"
|
unverified: "公式アカウントを解除しました"
|
||||||
desktop/views/pages/admin/admin.announcements.vue:
|
admin/views/emoji.vue:
|
||||||
|
add-emoji:
|
||||||
|
title: "絵文字の登録"
|
||||||
|
name: "絵文字名"
|
||||||
|
name-desc: "a~z 0~9 _ の文字が使えます。"
|
||||||
|
aliases: "エイリアス"
|
||||||
|
aliases-desc: "スペースで区切って複数設定できます。"
|
||||||
|
url: "絵文字画像URL"
|
||||||
|
add: "追加"
|
||||||
|
emojis:
|
||||||
|
title: "絵文字一覧"
|
||||||
|
update: "更新"
|
||||||
|
remove: "削除"
|
||||||
|
admin/views/announcements.vue:
|
||||||
announcements: "お知らせ"
|
announcements: "お知らせ"
|
||||||
desktop/views/pages/admin/admin.hashtags.vue:
|
save: "保存"
|
||||||
|
remove: "削除"
|
||||||
|
add: "追加"
|
||||||
|
title: "タイトル"
|
||||||
|
text: "内容"
|
||||||
|
admin/views/hashtags.vue:
|
||||||
hided-tags: "Hidden Tags"
|
hided-tags: "Hidden Tags"
|
||||||
desktop/views/pages/deck/deck.tl-column.vue:
|
desktop/views/pages/deck/deck.tl-column.vue:
|
||||||
is-media-only: "Tylko wpisy z zawartością multimedialną"
|
is-media-only: "Tylko wpisy z zawartością multimedialną"
|
||||||
@ -1328,6 +1374,7 @@ mobile/views/pages/settings.vue:
|
|||||||
sound: "サウンド"
|
sound: "サウンド"
|
||||||
enable-sounds: "サウンドを有効にする"
|
enable-sounds: "サウンドを有効にする"
|
||||||
mark-as-read-all-unread-notes: "すべての投稿を既読にする"
|
mark-as-read-all-unread-notes: "すべての投稿を既読にする"
|
||||||
|
password: "パスワード"
|
||||||
mobile/views/pages/user.vue:
|
mobile/views/pages/user.vue:
|
||||||
follows-you: "Śledzi Cię"
|
follows-you: "Śledzi Cię"
|
||||||
following: "Śledzeni"
|
following: "Śledzeni"
|
||||||
|
@ -186,6 +186,7 @@ common:
|
|||||||
stack-left: "左に重ねる"
|
stack-left: "左に重ねる"
|
||||||
pop-right: "Acoplar à direita"
|
pop-right: "Acoplar à direita"
|
||||||
dev: "アプリの作成に失敗しました。再度お試しください。"
|
dev: "アプリの作成に失敗しました。再度お試しください。"
|
||||||
|
ai-chan-kawaii: "藍ちゃかわいい"
|
||||||
auth/views/form.vue:
|
auth/views/form.vue:
|
||||||
share-access: "Você <b>permite</b> que <i>{{ app.name }}</i> acesse sua conta?"
|
share-access: "Você <b>permite</b> que <i>{{ app.name }}</i> acesse sua conta?"
|
||||||
permission-ask: "Este aplicativo precisa das seguintes permissões:"
|
permission-ask: "Este aplicativo precisa das seguintes permissões:"
|
||||||
@ -874,7 +875,7 @@ common/views/components/mute-and-block.vue:
|
|||||||
block: "ブロック"
|
block: "ブロック"
|
||||||
no-muted-users: "ミュートしているユーザーはいません"
|
no-muted-users: "ミュートしているユーザーはいません"
|
||||||
no-blocked-users: "ブロックしているユーザーはいません"
|
no-blocked-users: "ブロックしているユーザーはいません"
|
||||||
desktop/views/components/settings.password.vue:
|
common/views/components/password-settings.vue:
|
||||||
reset: "パスワードを変更する"
|
reset: "パスワードを変更する"
|
||||||
enter-current-password: "現在のパスワードを入力してください"
|
enter-current-password: "現在のパスワードを入力してください"
|
||||||
enter-new-password: "新しいパスワードを入力してください"
|
enter-new-password: "新しいパスワードを入力してください"
|
||||||
@ -946,41 +947,86 @@ desktop/views/components/users-list-item.vue:
|
|||||||
desktop/views/components/window.vue:
|
desktop/views/components/window.vue:
|
||||||
popout: "ポップアウト"
|
popout: "ポップアウト"
|
||||||
close: "閉じる"
|
close: "閉じる"
|
||||||
desktop/views/pages/admin/admin.vue:
|
admin/views/index.vue:
|
||||||
dashboard: "ダッシュボード"
|
dashboard: "ダッシュボード"
|
||||||
users: "Usuários"
|
instance: "インスタンス"
|
||||||
update: "Actualizações"
|
emoji: "カスタム絵文字"
|
||||||
|
users: "ユーザー"
|
||||||
|
update: "更新"
|
||||||
announcements: "お知らせ"
|
announcements: "お知らせ"
|
||||||
hashtags: "ハッシュタグ"
|
hashtags: "ハッシュタグ"
|
||||||
desktop/views/pages/admin/admin.dashboard.vue:
|
back-to-misskey: "Misskeyに戻る"
|
||||||
|
admin/views/dashboard.vue:
|
||||||
dashboard: "ダッシュボード"
|
dashboard: "ダッシュボード"
|
||||||
all-users: "Todos os usuários"
|
accounts: "アカウント"
|
||||||
original-users: "このインスタンスのユーザー"
|
notes: "投稿"
|
||||||
all-notes: "全ての投稿"
|
drive: "ドライブ"
|
||||||
original-notes: "このインスタンスの投稿"
|
instances: "インスタンス"
|
||||||
|
this-instance: "このインスタンス"
|
||||||
|
federated: "連合"
|
||||||
invite: "招待"
|
invite: "招待"
|
||||||
banner-url: "Banner URL"
|
banner-url: "Banner URL"
|
||||||
disableRegistration: "Disable new user registration"
|
disableRegistration: "Disable new user registration"
|
||||||
disableLocalTimeline: "Disable the local timeline"
|
disableLocalTimeline: "Disable the local timeline"
|
||||||
desktop/views/pages/admin/admin.suspend-user.vue:
|
admin/views/charts.vue:
|
||||||
|
title: "チャート"
|
||||||
|
per-day: "1日ごと"
|
||||||
|
per-hour: "1時間ごと"
|
||||||
|
federation: "フェデレーション"
|
||||||
|
notes: "投稿"
|
||||||
|
users: "ユーザー"
|
||||||
|
drive: "ドライブ"
|
||||||
|
network: "ネットワーク"
|
||||||
|
charts:
|
||||||
|
federation-instances: "インスタンスの増減"
|
||||||
|
federation-instances-total: "インスタンスの積算"
|
||||||
|
notes: "投稿の増減 (統合)"
|
||||||
|
local-notes: "投稿の増減 (ローカル)"
|
||||||
|
remote-notes: "投稿の増減 (リモート)"
|
||||||
|
notes-total: "投稿の積算"
|
||||||
|
users: "ユーザーの増減"
|
||||||
|
users-total: "ユーザーの積算"
|
||||||
|
drive: "ドライブ使用量の増減"
|
||||||
|
drive-total: "ドライブ使用量の積算"
|
||||||
|
drive-files: "ドライブのファイル数の増減"
|
||||||
|
drive-files-total: "ドライブのファイル数の積算"
|
||||||
|
network-requests: "リクエスト"
|
||||||
|
network-time: "応答時間"
|
||||||
|
network-usage: "通信量"
|
||||||
|
admin/views/users.vue:
|
||||||
suspend-user: "ユーザーの凍結"
|
suspend-user: "ユーザーの凍結"
|
||||||
suspend: "凍結"
|
suspend: "凍結"
|
||||||
suspended: "凍結しました"
|
suspended: "凍結しました"
|
||||||
desktop/views/pages/admin/admin.unsuspend-user.vue:
|
|
||||||
unsuspend-user: "ユーザーの凍結の解除"
|
unsuspend-user: "ユーザーの凍結の解除"
|
||||||
unsuspend: "凍結の解除"
|
unsuspend: "凍結の解除"
|
||||||
unsuspended: "凍結を解除しました"
|
unsuspended: "凍結を解除しました"
|
||||||
desktop/views/pages/admin/admin.verify-user.vue:
|
|
||||||
verify-user: "ユーザーの公式アカウント設定"
|
verify-user: "ユーザーの公式アカウント設定"
|
||||||
verify: "公式アカウントにする"
|
verify: "公式アカウントにする"
|
||||||
verified: "公式アカウントにしました"
|
verified: "公式アカウントにしました"
|
||||||
desktop/views/pages/admin/admin.unverify-user.vue:
|
|
||||||
unverify-user: "ユーザーの公式アカウント解除"
|
unverify-user: "ユーザーの公式アカウント解除"
|
||||||
unverify: "公式アカウントを解除する"
|
unverify: "公式アカウントを解除する"
|
||||||
unverified: "公式アカウントを解除しました"
|
unverified: "公式アカウントを解除しました"
|
||||||
desktop/views/pages/admin/admin.announcements.vue:
|
admin/views/emoji.vue:
|
||||||
|
add-emoji:
|
||||||
|
title: "絵文字の登録"
|
||||||
|
name: "絵文字名"
|
||||||
|
name-desc: "a~z 0~9 _ の文字が使えます。"
|
||||||
|
aliases: "エイリアス"
|
||||||
|
aliases-desc: "スペースで区切って複数設定できます。"
|
||||||
|
url: "絵文字画像URL"
|
||||||
|
add: "追加"
|
||||||
|
emojis:
|
||||||
|
title: "絵文字一覧"
|
||||||
|
update: "更新"
|
||||||
|
remove: "削除"
|
||||||
|
admin/views/announcements.vue:
|
||||||
announcements: "お知らせ"
|
announcements: "お知らせ"
|
||||||
desktop/views/pages/admin/admin.hashtags.vue:
|
save: "保存"
|
||||||
|
remove: "削除"
|
||||||
|
add: "追加"
|
||||||
|
title: "タイトル"
|
||||||
|
text: "内容"
|
||||||
|
admin/views/hashtags.vue:
|
||||||
hided-tags: "Hidden Tags"
|
hided-tags: "Hidden Tags"
|
||||||
desktop/views/pages/deck/deck.tl-column.vue:
|
desktop/views/pages/deck/deck.tl-column.vue:
|
||||||
is-media-only: "メディア投稿のみ"
|
is-media-only: "メディア投稿のみ"
|
||||||
@ -1328,6 +1374,7 @@ mobile/views/pages/settings.vue:
|
|||||||
sound: "Sons"
|
sound: "Sons"
|
||||||
enable-sounds: "Ativar sons"
|
enable-sounds: "Ativar sons"
|
||||||
mark-as-read-all-unread-notes: "すべての投稿を既読にする"
|
mark-as-read-all-unread-notes: "すべての投稿を既読にする"
|
||||||
|
password: "パスワード"
|
||||||
mobile/views/pages/user.vue:
|
mobile/views/pages/user.vue:
|
||||||
follows-you: "Te segue"
|
follows-you: "Te segue"
|
||||||
following: "Seguindo"
|
following: "Seguindo"
|
||||||
|
@ -186,6 +186,7 @@ common:
|
|||||||
stack-left: "左に重ねる"
|
stack-left: "左に重ねる"
|
||||||
pop-right: "右に出す"
|
pop-right: "右に出す"
|
||||||
dev: "アプリの作成に失敗しました。再度お試しください。"
|
dev: "アプリの作成に失敗しました。再度お試しください。"
|
||||||
|
ai-chan-kawaii: "藍ちゃかわいい"
|
||||||
auth/views/form.vue:
|
auth/views/form.vue:
|
||||||
share-access: "<i>{{ app.name }}</i>があなたのアカウントにアクセスすることを<b>許可</b>しますか?"
|
share-access: "<i>{{ app.name }}</i>があなたのアカウントにアクセスすることを<b>許可</b>しますか?"
|
||||||
permission-ask: "このアプリは次の権限を要求しています:"
|
permission-ask: "このアプリは次の権限を要求しています:"
|
||||||
@ -874,7 +875,7 @@ common/views/components/mute-and-block.vue:
|
|||||||
block: "ブロック"
|
block: "ブロック"
|
||||||
no-muted-users: "ミュートしているユーザーはいません"
|
no-muted-users: "ミュートしているユーザーはいません"
|
||||||
no-blocked-users: "ブロックしているユーザーはいません"
|
no-blocked-users: "ブロックしているユーザーはいません"
|
||||||
desktop/views/components/settings.password.vue:
|
common/views/components/password-settings.vue:
|
||||||
reset: "パスワードを変更する"
|
reset: "パスワードを変更する"
|
||||||
enter-current-password: "現在のパスワードを入力してください"
|
enter-current-password: "現在のパスワードを入力してください"
|
||||||
enter-new-password: "新しいパスワードを入力してください"
|
enter-new-password: "新しいパスワードを入力してください"
|
||||||
@ -946,41 +947,86 @@ desktop/views/components/users-list-item.vue:
|
|||||||
desktop/views/components/window.vue:
|
desktop/views/components/window.vue:
|
||||||
popout: "ポップアウト"
|
popout: "ポップアウト"
|
||||||
close: "閉じる"
|
close: "閉じる"
|
||||||
desktop/views/pages/admin/admin.vue:
|
admin/views/index.vue:
|
||||||
dashboard: "ダッシュボード"
|
dashboard: "ダッシュボード"
|
||||||
|
instance: "インスタンス"
|
||||||
|
emoji: "カスタム絵文字"
|
||||||
users: "ユーザー"
|
users: "ユーザー"
|
||||||
update: "更新"
|
update: "更新"
|
||||||
announcements: "お知らせ"
|
announcements: "お知らせ"
|
||||||
hashtags: "ハッシュタグ"
|
hashtags: "ハッシュタグ"
|
||||||
desktop/views/pages/admin/admin.dashboard.vue:
|
back-to-misskey: "Misskeyに戻る"
|
||||||
|
admin/views/dashboard.vue:
|
||||||
dashboard: "ダッシュボード"
|
dashboard: "ダッシュボード"
|
||||||
all-users: "全てのユーザー"
|
accounts: "アカウント"
|
||||||
original-users: "このインスタンスのユーザー"
|
notes: "投稿"
|
||||||
all-notes: "全ての投稿"
|
drive: "ドライブ"
|
||||||
original-notes: "このインスタンスの投稿"
|
instances: "インスタンス"
|
||||||
|
this-instance: "このインスタンス"
|
||||||
|
federated: "連合"
|
||||||
invite: "招待"
|
invite: "招待"
|
||||||
banner-url: "Banner URL"
|
banner-url: "Banner URL"
|
||||||
disableRegistration: "Disable new user registration"
|
disableRegistration: "Disable new user registration"
|
||||||
disableLocalTimeline: "Disable the local timeline"
|
disableLocalTimeline: "Disable the local timeline"
|
||||||
desktop/views/pages/admin/admin.suspend-user.vue:
|
admin/views/charts.vue:
|
||||||
|
title: "チャート"
|
||||||
|
per-day: "1日ごと"
|
||||||
|
per-hour: "1時間ごと"
|
||||||
|
federation: "フェデレーション"
|
||||||
|
notes: "投稿"
|
||||||
|
users: "ユーザー"
|
||||||
|
drive: "ドライブ"
|
||||||
|
network: "ネットワーク"
|
||||||
|
charts:
|
||||||
|
federation-instances: "インスタンスの増減"
|
||||||
|
federation-instances-total: "インスタンスの積算"
|
||||||
|
notes: "投稿の増減 (統合)"
|
||||||
|
local-notes: "投稿の増減 (ローカル)"
|
||||||
|
remote-notes: "投稿の増減 (リモート)"
|
||||||
|
notes-total: "投稿の積算"
|
||||||
|
users: "ユーザーの増減"
|
||||||
|
users-total: "ユーザーの積算"
|
||||||
|
drive: "ドライブ使用量の増減"
|
||||||
|
drive-total: "ドライブ使用量の積算"
|
||||||
|
drive-files: "ドライブのファイル数の増減"
|
||||||
|
drive-files-total: "ドライブのファイル数の積算"
|
||||||
|
network-requests: "リクエスト"
|
||||||
|
network-time: "応答時間"
|
||||||
|
network-usage: "通信量"
|
||||||
|
admin/views/users.vue:
|
||||||
suspend-user: "ユーザーの凍結"
|
suspend-user: "ユーザーの凍結"
|
||||||
suspend: "凍結"
|
suspend: "凍結"
|
||||||
suspended: "凍結しました"
|
suspended: "凍結しました"
|
||||||
desktop/views/pages/admin/admin.unsuspend-user.vue:
|
|
||||||
unsuspend-user: "ユーザーの凍結の解除"
|
unsuspend-user: "ユーザーの凍結の解除"
|
||||||
unsuspend: "凍結の解除"
|
unsuspend: "凍結の解除"
|
||||||
unsuspended: "凍結を解除しました"
|
unsuspended: "凍結を解除しました"
|
||||||
desktop/views/pages/admin/admin.verify-user.vue:
|
|
||||||
verify-user: "ユーザーの公式アカウント設定"
|
verify-user: "ユーザーの公式アカウント設定"
|
||||||
verify: "公式アカウントにする"
|
verify: "公式アカウントにする"
|
||||||
verified: "公式アカウントにしました"
|
verified: "公式アカウントにしました"
|
||||||
desktop/views/pages/admin/admin.unverify-user.vue:
|
|
||||||
unverify-user: "ユーザーの公式アカウント解除"
|
unverify-user: "ユーザーの公式アカウント解除"
|
||||||
unverify: "公式アカウントを解除する"
|
unverify: "公式アカウントを解除する"
|
||||||
unverified: "公式アカウントを解除しました"
|
unverified: "公式アカウントを解除しました"
|
||||||
desktop/views/pages/admin/admin.announcements.vue:
|
admin/views/emoji.vue:
|
||||||
|
add-emoji:
|
||||||
|
title: "絵文字の登録"
|
||||||
|
name: "絵文字名"
|
||||||
|
name-desc: "a~z 0~9 _ の文字が使えます。"
|
||||||
|
aliases: "エイリアス"
|
||||||
|
aliases-desc: "スペースで区切って複数設定できます。"
|
||||||
|
url: "絵文字画像URL"
|
||||||
|
add: "追加"
|
||||||
|
emojis:
|
||||||
|
title: "絵文字一覧"
|
||||||
|
update: "更新"
|
||||||
|
remove: "削除"
|
||||||
|
admin/views/announcements.vue:
|
||||||
announcements: "お知らせ"
|
announcements: "お知らせ"
|
||||||
desktop/views/pages/admin/admin.hashtags.vue:
|
save: "保存"
|
||||||
|
remove: "削除"
|
||||||
|
add: "追加"
|
||||||
|
title: "タイトル"
|
||||||
|
text: "内容"
|
||||||
|
admin/views/hashtags.vue:
|
||||||
hided-tags: "Hidden Tags"
|
hided-tags: "Hidden Tags"
|
||||||
desktop/views/pages/deck/deck.tl-column.vue:
|
desktop/views/pages/deck/deck.tl-column.vue:
|
||||||
is-media-only: "メディア投稿のみ"
|
is-media-only: "メディア投稿のみ"
|
||||||
@ -1328,6 +1374,7 @@ mobile/views/pages/settings.vue:
|
|||||||
sound: "サウンド"
|
sound: "サウンド"
|
||||||
enable-sounds: "サウンドを有効にする"
|
enable-sounds: "サウンドを有効にする"
|
||||||
mark-as-read-all-unread-notes: "すべての投稿を既読にする"
|
mark-as-read-all-unread-notes: "すべての投稿を既読にする"
|
||||||
|
password: "パスワード"
|
||||||
mobile/views/pages/user.vue:
|
mobile/views/pages/user.vue:
|
||||||
follows-you: "フォローされています"
|
follows-you: "フォローされています"
|
||||||
following: "フォロー"
|
following: "フォロー"
|
||||||
|
@ -186,6 +186,7 @@ common:
|
|||||||
stack-left: "左に重ねる"
|
stack-left: "左に重ねる"
|
||||||
pop-right: "右に出す"
|
pop-right: "右に出す"
|
||||||
dev: "アプリの作成に失敗しました。再度お試しください。"
|
dev: "アプリの作成に失敗しました。再度お試しください。"
|
||||||
|
ai-chan-kawaii: "藍ちゃかわいい"
|
||||||
auth/views/form.vue:
|
auth/views/form.vue:
|
||||||
share-access: "<i>{{ app.name }}</i>があなたのアカウントにアクセスすることを<b>許可</b>しますか?"
|
share-access: "<i>{{ app.name }}</i>があなたのアカウントにアクセスすることを<b>許可</b>しますか?"
|
||||||
permission-ask: "このアプリは次の権限を要求しています:"
|
permission-ask: "このアプリは次の権限を要求しています:"
|
||||||
@ -874,7 +875,7 @@ common/views/components/mute-and-block.vue:
|
|||||||
block: "ブロック"
|
block: "ブロック"
|
||||||
no-muted-users: "ミュートしているユーザーはいません"
|
no-muted-users: "ミュートしているユーザーはいません"
|
||||||
no-blocked-users: "ブロックしているユーザーはいません"
|
no-blocked-users: "ブロックしているユーザーはいません"
|
||||||
desktop/views/components/settings.password.vue:
|
common/views/components/password-settings.vue:
|
||||||
reset: "パスワードを変更する"
|
reset: "パスワードを変更する"
|
||||||
enter-current-password: "現在のパスワードを入力してください"
|
enter-current-password: "現在のパスワードを入力してください"
|
||||||
enter-new-password: "新しいパスワードを入力してください"
|
enter-new-password: "新しいパスワードを入力してください"
|
||||||
@ -946,41 +947,86 @@ desktop/views/components/users-list-item.vue:
|
|||||||
desktop/views/components/window.vue:
|
desktop/views/components/window.vue:
|
||||||
popout: "ポップアウト"
|
popout: "ポップアウト"
|
||||||
close: "閉じる"
|
close: "閉じる"
|
||||||
desktop/views/pages/admin/admin.vue:
|
admin/views/index.vue:
|
||||||
dashboard: "ダッシュボード"
|
dashboard: "ダッシュボード"
|
||||||
|
instance: "インスタンス"
|
||||||
|
emoji: "カスタム絵文字"
|
||||||
users: "ユーザー"
|
users: "ユーザー"
|
||||||
update: "更新"
|
update: "更新"
|
||||||
announcements: "お知らせ"
|
announcements: "お知らせ"
|
||||||
hashtags: "ハッシュタグ"
|
hashtags: "ハッシュタグ"
|
||||||
desktop/views/pages/admin/admin.dashboard.vue:
|
back-to-misskey: "Misskeyに戻る"
|
||||||
|
admin/views/dashboard.vue:
|
||||||
dashboard: "ダッシュボード"
|
dashboard: "ダッシュボード"
|
||||||
all-users: "全てのユーザー"
|
accounts: "アカウント"
|
||||||
original-users: "このインスタンスのユーザー"
|
notes: "投稿"
|
||||||
all-notes: "全ての投稿"
|
drive: "ドライブ"
|
||||||
original-notes: "このインスタンスの投稿"
|
instances: "インスタンス"
|
||||||
|
this-instance: "このインスタンス"
|
||||||
|
federated: "連合"
|
||||||
invite: "招待"
|
invite: "招待"
|
||||||
banner-url: "Banner URL"
|
banner-url: "Banner URL"
|
||||||
disableRegistration: "Disable new user registration"
|
disableRegistration: "Disable new user registration"
|
||||||
disableLocalTimeline: "Disable the local timeline"
|
disableLocalTimeline: "Disable the local timeline"
|
||||||
desktop/views/pages/admin/admin.suspend-user.vue:
|
admin/views/charts.vue:
|
||||||
|
title: "チャート"
|
||||||
|
per-day: "1日ごと"
|
||||||
|
per-hour: "1時間ごと"
|
||||||
|
federation: "フェデレーション"
|
||||||
|
notes: "投稿"
|
||||||
|
users: "ユーザー"
|
||||||
|
drive: "ドライブ"
|
||||||
|
network: "ネットワーク"
|
||||||
|
charts:
|
||||||
|
federation-instances: "インスタンスの増減"
|
||||||
|
federation-instances-total: "インスタンスの積算"
|
||||||
|
notes: "投稿の増減 (統合)"
|
||||||
|
local-notes: "投稿の増減 (ローカル)"
|
||||||
|
remote-notes: "投稿の増減 (リモート)"
|
||||||
|
notes-total: "投稿の積算"
|
||||||
|
users: "ユーザーの増減"
|
||||||
|
users-total: "ユーザーの積算"
|
||||||
|
drive: "ドライブ使用量の増減"
|
||||||
|
drive-total: "ドライブ使用量の積算"
|
||||||
|
drive-files: "ドライブのファイル数の増減"
|
||||||
|
drive-files-total: "ドライブのファイル数の積算"
|
||||||
|
network-requests: "リクエスト"
|
||||||
|
network-time: "応答時間"
|
||||||
|
network-usage: "通信量"
|
||||||
|
admin/views/users.vue:
|
||||||
suspend-user: "ユーザーの凍結"
|
suspend-user: "ユーザーの凍結"
|
||||||
suspend: "凍結"
|
suspend: "凍結"
|
||||||
suspended: "凍結しました"
|
suspended: "凍結しました"
|
||||||
desktop/views/pages/admin/admin.unsuspend-user.vue:
|
|
||||||
unsuspend-user: "ユーザーの凍結の解除"
|
unsuspend-user: "ユーザーの凍結の解除"
|
||||||
unsuspend: "凍結の解除"
|
unsuspend: "凍結の解除"
|
||||||
unsuspended: "凍結を解除しました"
|
unsuspended: "凍結を解除しました"
|
||||||
desktop/views/pages/admin/admin.verify-user.vue:
|
|
||||||
verify-user: "ユーザーの公式アカウント設定"
|
verify-user: "ユーザーの公式アカウント設定"
|
||||||
verify: "公式アカウントにする"
|
verify: "公式アカウントにする"
|
||||||
verified: "公式アカウントにしました"
|
verified: "公式アカウントにしました"
|
||||||
desktop/views/pages/admin/admin.unverify-user.vue:
|
|
||||||
unverify-user: "ユーザーの公式アカウント解除"
|
unverify-user: "ユーザーの公式アカウント解除"
|
||||||
unverify: "公式アカウントを解除する"
|
unverify: "公式アカウントを解除する"
|
||||||
unverified: "公式アカウントを解除しました"
|
unverified: "公式アカウントを解除しました"
|
||||||
desktop/views/pages/admin/admin.announcements.vue:
|
admin/views/emoji.vue:
|
||||||
|
add-emoji:
|
||||||
|
title: "絵文字の登録"
|
||||||
|
name: "絵文字名"
|
||||||
|
name-desc: "a~z 0~9 _ の文字が使えます。"
|
||||||
|
aliases: "エイリアス"
|
||||||
|
aliases-desc: "スペースで区切って複数設定できます。"
|
||||||
|
url: "絵文字画像URL"
|
||||||
|
add: "追加"
|
||||||
|
emojis:
|
||||||
|
title: "絵文字一覧"
|
||||||
|
update: "更新"
|
||||||
|
remove: "削除"
|
||||||
|
admin/views/announcements.vue:
|
||||||
announcements: "お知らせ"
|
announcements: "お知らせ"
|
||||||
desktop/views/pages/admin/admin.hashtags.vue:
|
save: "保存"
|
||||||
|
remove: "削除"
|
||||||
|
add: "追加"
|
||||||
|
title: "タイトル"
|
||||||
|
text: "内容"
|
||||||
|
admin/views/hashtags.vue:
|
||||||
hided-tags: "Hidden Tags"
|
hided-tags: "Hidden Tags"
|
||||||
desktop/views/pages/deck/deck.tl-column.vue:
|
desktop/views/pages/deck/deck.tl-column.vue:
|
||||||
is-media-only: "メディア投稿のみ"
|
is-media-only: "メディア投稿のみ"
|
||||||
@ -1328,6 +1374,7 @@ mobile/views/pages/settings.vue:
|
|||||||
sound: "サウンド"
|
sound: "サウンド"
|
||||||
enable-sounds: "サウンドを有効にする"
|
enable-sounds: "サウンドを有効にする"
|
||||||
mark-as-read-all-unread-notes: "すべての投稿を既読にする"
|
mark-as-read-all-unread-notes: "すべての投稿を既読にする"
|
||||||
|
password: "パスワード"
|
||||||
mobile/views/pages/user.vue:
|
mobile/views/pages/user.vue:
|
||||||
follows-you: "フォローされています"
|
follows-you: "フォローされています"
|
||||||
following: "フォロー"
|
following: "フォロー"
|
||||||
|
17367
package-lock.json
generated
17367
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
33
package.json
33
package.json
@ -1,8 +1,8 @@
|
|||||||
{
|
{
|
||||||
"name": "misskey",
|
"name": "misskey",
|
||||||
"author": "syuilo <i@syuilo.com>",
|
"author": "syuilo <i@syuilo.com>",
|
||||||
"version": "10.37.0",
|
"version": "10.41.0",
|
||||||
"clientVersion": "1.0.11314",
|
"clientVersion": "1.0.11594",
|
||||||
"codename": "nighthike",
|
"codename": "nighthike",
|
||||||
"main": "./built/index.js",
|
"main": "./built/index.js",
|
||||||
"private": true,
|
"private": true,
|
||||||
@ -20,10 +20,11 @@
|
|||||||
"format": "gulp format"
|
"format": "gulp format"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@fortawesome/fontawesome-svg-core": "1.2.6",
|
"@fortawesome/fontawesome-svg-core": "1.2.8",
|
||||||
"@fortawesome/free-brands-svg-icons": "5.4.1",
|
"@fortawesome/free-brands-svg-icons": "5.5.0",
|
||||||
"@fortawesome/free-regular-svg-icons": "5.4.1",
|
"@fortawesome/free-regular-svg-icons": "5.5.0",
|
||||||
"@fortawesome/free-solid-svg-icons": "5.4.1",
|
"@fortawesome/free-solid-svg-icons": "5.5.0",
|
||||||
|
"@fortawesome/vue-fontawesome": "0.1.2",
|
||||||
"@koa/cors": "2.2.2",
|
"@koa/cors": "2.2.2",
|
||||||
"@prezzemolo/rap": "0.1.2",
|
"@prezzemolo/rap": "0.1.2",
|
||||||
"@prezzemolo/zip": "0.0.3",
|
"@prezzemolo/zip": "0.0.3",
|
||||||
@ -61,13 +62,14 @@
|
|||||||
"@types/mocha": "5.2.5",
|
"@types/mocha": "5.2.5",
|
||||||
"@types/mongodb": "3.1.12",
|
"@types/mongodb": "3.1.12",
|
||||||
"@types/ms": "0.7.30",
|
"@types/ms": "0.7.30",
|
||||||
"@types/node": "10.12.0",
|
"@types/node": "10.12.2",
|
||||||
|
"@types/oauth": "0.9.1",
|
||||||
"@types/portscanner": "2.1.0",
|
"@types/portscanner": "2.1.0",
|
||||||
"@types/pug": "2.0.4",
|
"@types/pug": "2.0.4",
|
||||||
"@types/qrcode": "1.3.0",
|
"@types/qrcode": "1.3.0",
|
||||||
"@types/ratelimiter": "2.1.28",
|
"@types/ratelimiter": "2.1.28",
|
||||||
"@types/redis": "2.8.7",
|
"@types/redis": "2.8.7",
|
||||||
"@types/request": "2.47.1",
|
"@types/request": "2.48.0",
|
||||||
"@types/request-promise-native": "1.0.15",
|
"@types/request-promise-native": "1.0.15",
|
||||||
"@types/rimraf": "2.0.2",
|
"@types/rimraf": "2.0.2",
|
||||||
"@types/seedrandom": "2.4.27",
|
"@types/seedrandom": "2.4.27",
|
||||||
@ -91,28 +93,27 @@
|
|||||||
"bcryptjs": "2.4.3",
|
"bcryptjs": "2.4.3",
|
||||||
"bee-queue": "1.2.2",
|
"bee-queue": "1.2.2",
|
||||||
"bootstrap-vue": "2.0.0-rc.11",
|
"bootstrap-vue": "2.0.0-rc.11",
|
||||||
"cafy": "11.3.0",
|
"cafy": "12.0.0",
|
||||||
"chai": "4.2.0",
|
"chai": "4.2.0",
|
||||||
"chai-http": "4.2.0",
|
"chai-http": "4.2.0",
|
||||||
"chalk": "2.4.1",
|
"chalk": "2.4.1",
|
||||||
"chart.js": "2.7.3",
|
|
||||||
"commander": "2.19.0",
|
"commander": "2.19.0",
|
||||||
"crc-32": "1.2.0",
|
"crc-32": "1.2.0",
|
||||||
"css-loader": "1.0.0",
|
"css-loader": "1.0.1",
|
||||||
"dateformat": "3.0.3",
|
"dateformat": "3.0.3",
|
||||||
"debug": "4.1.0",
|
"debug": "4.1.0",
|
||||||
"deep-equal": "1.0.1",
|
"deep-equal": "1.0.1",
|
||||||
"deepcopy": "0.6.3",
|
"deepcopy": "0.6.3",
|
||||||
"diskusage": "0.2.5",
|
"diskusage": "0.2.5",
|
||||||
"double-ended-queue": "2.1.0-0",
|
"double-ended-queue": "2.1.0-0",
|
||||||
"elasticsearch": "15.1.1",
|
"elasticsearch": "15.2.0",
|
||||||
"emojilib": "2.3.0",
|
"emojilib": "2.3.0",
|
||||||
"escape-regexp": "0.0.1",
|
"escape-regexp": "0.0.1",
|
||||||
"eslint": "5.8.0",
|
"eslint": "5.8.0",
|
||||||
"eslint-plugin-vue": "4.7.1",
|
"eslint-plugin-vue": "4.7.1",
|
||||||
"eventemitter3": "3.1.0",
|
"eventemitter3": "3.1.0",
|
||||||
"file-loader": "2.0.0",
|
"file-loader": "2.0.0",
|
||||||
"file-type": "10.2.0",
|
"file-type": "10.4.0",
|
||||||
"fuckadblock": "3.2.1",
|
"fuckadblock": "3.2.1",
|
||||||
"gulp": "3.9.1",
|
"gulp": "3.9.1",
|
||||||
"gulp-cssnano": "2.1.3",
|
"gulp-cssnano": "2.1.3",
|
||||||
@ -204,19 +205,17 @@
|
|||||||
"ts-loader": "5.3.0",
|
"ts-loader": "5.3.0",
|
||||||
"ts-node": "7.0.1",
|
"ts-node": "7.0.1",
|
||||||
"tslint": "5.10.0",
|
"tslint": "5.10.0",
|
||||||
"typescript": "3.1.4",
|
"typescript": "3.1.5",
|
||||||
"typescript-eslint-parser": "20.1.1",
|
"typescript-eslint-parser": "20.1.1",
|
||||||
"uglify-es": "3.3.9",
|
"uglify-es": "3.3.9",
|
||||||
"url-loader": "1.1.2",
|
"url-loader": "1.1.2",
|
||||||
"uuid": "3.3.2",
|
"uuid": "3.3.2",
|
||||||
"v-animate-css": "0.0.2",
|
"v-animate-css": "0.0.2",
|
||||||
"vue": "2.5.17",
|
"vue": "2.5.17",
|
||||||
"vue-chartjs": "3.4.0",
|
|
||||||
"vue-color": "2.7.0",
|
"vue-color": "2.7.0",
|
||||||
"vue-content-loading": "1.5.3",
|
"vue-content-loading": "1.5.3",
|
||||||
"vue-cropperjs": "2.2.2",
|
"vue-cropperjs": "2.2.2",
|
||||||
"vue-js-modal": "1.3.26",
|
"vue-js-modal": "1.3.26",
|
||||||
"vue-json-tree-view": "2.1.4",
|
|
||||||
"vue-loader": "15.4.2",
|
"vue-loader": "15.4.2",
|
||||||
"vue-router": "3.0.1",
|
"vue-router": "3.0.1",
|
||||||
"vue-style-loader": "4.1.2",
|
"vue-style-loader": "4.1.2",
|
||||||
@ -229,7 +228,7 @@
|
|||||||
"vuex-persistedstate": "2.5.4",
|
"vuex-persistedstate": "2.5.4",
|
||||||
"web-push": "3.3.3",
|
"web-push": "3.3.3",
|
||||||
"webfinger.js": "2.6.6",
|
"webfinger.js": "2.6.6",
|
||||||
"webpack": "4.23.1",
|
"webpack": "4.25.1",
|
||||||
"webpack-cli": "3.1.2",
|
"webpack-cli": "3.1.2",
|
||||||
"websocket": "1.0.28",
|
"websocket": "1.0.28",
|
||||||
"ws": "6.1.0",
|
"ws": "6.1.0",
|
||||||
|
@ -230,7 +230,7 @@ export default abstract class Chart<T> {
|
|||||||
null;
|
null;
|
||||||
|
|
||||||
// ログ取得
|
// ログ取得
|
||||||
const logs = await this.collection.find({
|
let logs = await this.collection.find({
|
||||||
group: group,
|
group: group,
|
||||||
span: span,
|
span: span,
|
||||||
date: {
|
date: {
|
||||||
@ -245,6 +245,27 @@ export default abstract class Chart<T> {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// 要求された範囲にログがひとつもなかったら
|
||||||
|
if (logs.length == 0) {
|
||||||
|
// もっとも新しいログを持ってくる
|
||||||
|
// (すくなくともひとつログが無いと隙間埋めできないため)
|
||||||
|
const recentLog = await this.collection.findOne({
|
||||||
|
group: group,
|
||||||
|
span: span
|
||||||
|
}, {
|
||||||
|
sort: {
|
||||||
|
date: -1
|
||||||
|
},
|
||||||
|
fields: {
|
||||||
|
_id: 0
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
if (recentLog) {
|
||||||
|
logs = [recentLog];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// 整形
|
// 整形
|
||||||
for (let i = (range - 1); i >= 0; i--) {
|
for (let i = (range - 1); i >= 0; i--) {
|
||||||
const current =
|
const current =
|
||||||
@ -269,14 +290,11 @@ export default abstract class Chart<T> {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* [{
|
* [{
|
||||||
* xxxxx: 1,
|
* xxxxx: 1, yyyyy: 5
|
||||||
* yyyyy: 5
|
|
||||||
* }, {
|
* }, {
|
||||||
* xxxxx: 2,
|
* xxxxx: 2, yyyyy: 6
|
||||||
* yyyyy: 6
|
|
||||||
* }, {
|
* }, {
|
||||||
* xxxxx: 3,
|
* xxxxx: 3, yyyyy: 7
|
||||||
* yyyyy: 7
|
|
||||||
* }]
|
* }]
|
||||||
*
|
*
|
||||||
* を
|
* を
|
||||||
|
150
src/client/app/admin/assets/header-icon.svg
Normal file
150
src/client/app/admin/assets/header-icon.svg
Normal file
@ -0,0 +1,150 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||||
|
|
||||||
|
<svg
|
||||||
|
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||||
|
xmlns:cc="http://creativecommons.org/ns#"
|
||||||
|
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||||
|
xmlns:svg="http://www.w3.org/2000/svg"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
|
width="512"
|
||||||
|
height="512"
|
||||||
|
viewBox="0 0 135.46667 135.46667"
|
||||||
|
version="1.1"
|
||||||
|
id="svg8"
|
||||||
|
inkscape:version="0.92.1 r15371"
|
||||||
|
sodipodi:docname="header-icon.dark.svg"
|
||||||
|
inkscape:export-filename="C:\Users\syuilo\projects\misskey\assets\favicon\32.png"
|
||||||
|
inkscape:export-xdpi="6"
|
||||||
|
inkscape:export-ydpi="6">
|
||||||
|
<defs
|
||||||
|
id="defs2">
|
||||||
|
<inkscape:path-effect
|
||||||
|
effect="simplify"
|
||||||
|
id="path-effect5115"
|
||||||
|
is_visible="true"
|
||||||
|
steps="1"
|
||||||
|
threshold="0.000408163"
|
||||||
|
smooth_angles="360"
|
||||||
|
helper_size="0"
|
||||||
|
simplify_individual_paths="false"
|
||||||
|
simplify_just_coalesce="false"
|
||||||
|
simplifyindividualpaths="false"
|
||||||
|
simplifyJustCoalesce="false" />
|
||||||
|
<inkscape:path-effect
|
||||||
|
effect="simplify"
|
||||||
|
id="path-effect5111"
|
||||||
|
is_visible="true"
|
||||||
|
steps="1"
|
||||||
|
threshold="0.000408163"
|
||||||
|
smooth_angles="360"
|
||||||
|
helper_size="0"
|
||||||
|
simplify_individual_paths="false"
|
||||||
|
simplify_just_coalesce="false"
|
||||||
|
simplifyindividualpaths="false"
|
||||||
|
simplifyJustCoalesce="false" />
|
||||||
|
<inkscape:path-effect
|
||||||
|
effect="simplify"
|
||||||
|
id="path-effect5104"
|
||||||
|
is_visible="true"
|
||||||
|
steps="1"
|
||||||
|
threshold="0.000408163"
|
||||||
|
smooth_angles="360"
|
||||||
|
helper_size="0"
|
||||||
|
simplify_individual_paths="false"
|
||||||
|
simplify_just_coalesce="false"
|
||||||
|
simplifyindividualpaths="false"
|
||||||
|
simplifyJustCoalesce="false" />
|
||||||
|
</defs>
|
||||||
|
<sodipodi:namedview
|
||||||
|
id="base"
|
||||||
|
pagecolor="#ffffff"
|
||||||
|
bordercolor="#666666"
|
||||||
|
borderopacity="1.0"
|
||||||
|
inkscape:pageopacity="0.0"
|
||||||
|
inkscape:pageshadow="2"
|
||||||
|
inkscape:zoom="1.4142136"
|
||||||
|
inkscape:cx="114.309"
|
||||||
|
inkscape:cy="251.50613"
|
||||||
|
inkscape:document-units="px"
|
||||||
|
inkscape:current-layer="g4502"
|
||||||
|
showgrid="true"
|
||||||
|
units="px"
|
||||||
|
inkscape:snap-bbox="true"
|
||||||
|
inkscape:bbox-nodes="true"
|
||||||
|
inkscape:snap-bbox-edge-midpoints="false"
|
||||||
|
inkscape:snap-smooth-nodes="true"
|
||||||
|
inkscape:snap-center="true"
|
||||||
|
inkscape:snap-page="true"
|
||||||
|
inkscape:window-width="1920"
|
||||||
|
inkscape:window-height="1027"
|
||||||
|
inkscape:window-x="-8"
|
||||||
|
inkscape:window-y="1072"
|
||||||
|
inkscape:window-maximized="1"
|
||||||
|
inkscape:snap-object-midpoints="true"
|
||||||
|
inkscape:snap-midpoints="true"
|
||||||
|
inkscape:object-paths="true"
|
||||||
|
fit-margin-top="0"
|
||||||
|
fit-margin-left="0"
|
||||||
|
fit-margin-right="0"
|
||||||
|
fit-margin-bottom="0"
|
||||||
|
objecttolerance="1"
|
||||||
|
guidetolerance="1"
|
||||||
|
inkscape:snap-nodes="false"
|
||||||
|
inkscape:snap-others="false">
|
||||||
|
<inkscape:grid
|
||||||
|
type="xygrid"
|
||||||
|
id="grid4504"
|
||||||
|
spacingx="4.2333334"
|
||||||
|
spacingy="4.2333334"
|
||||||
|
empcolor="#ff3fff"
|
||||||
|
empopacity="0.25098039"
|
||||||
|
empspacing="4" />
|
||||||
|
</sodipodi:namedview>
|
||||||
|
<metadata
|
||||||
|
id="metadata5">
|
||||||
|
<rdf:RDF>
|
||||||
|
<cc:Work
|
||||||
|
rdf:about="">
|
||||||
|
<dc:format>image/svg+xml</dc:format>
|
||||||
|
<dc:type
|
||||||
|
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||||
|
<dc:title></dc:title>
|
||||||
|
</cc:Work>
|
||||||
|
</rdf:RDF>
|
||||||
|
</metadata>
|
||||||
|
<g
|
||||||
|
inkscape:label="レイヤー 1"
|
||||||
|
inkscape:groupmode="layer"
|
||||||
|
id="layer1"
|
||||||
|
transform="translate(-30.809093,-111.78601)">
|
||||||
|
<g
|
||||||
|
id="g4502"
|
||||||
|
transform="matrix(1.096096,0,0,1.096096,-2.960633,-44.023579)">
|
||||||
|
<g
|
||||||
|
style="fill-opacity:1"
|
||||||
|
transform="translate(-1.3333333e-6,-1.3439941e-6)"
|
||||||
|
id="g5125">
|
||||||
|
<g
|
||||||
|
transform="matrix(0.91391326,0,0,0.91391326,7.9719907,17.595761)"
|
||||||
|
id="text4489"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:141.03404236px;line-height:476.69509888px;font-family:'OTADESIGN Rounded';-inkscape-font-specification:'OTADESIGN Rounded';letter-spacing:0px;word-spacing:0px;fill-opacity:1;stroke:none;stroke-width:0.28950602px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||||
|
aria-label="Mi">
|
||||||
|
<path
|
||||||
|
sodipodi:nodetypes="zccssscssccscczzzccsccsscscsccz"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
id="path5210"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:'OTADESIGN Rounded';-inkscape-font-specification:'OTADESIGN Rounded';fill-opacity:1;stroke-width:0.28950602px"
|
||||||
|
d="m 75.196381,231.17126 c -5.855419,0.0202 -10.885068,-3.50766 -13.2572,-7.61584 -1.266603,-1.79454 -3.772419,-2.43291 -3.807919,0 v 11.2332 c 0,4.51309 -1.645397,8.41504 -4.936191,11.70583 -3.196772,3.19677 -7.098714,4.79516 -11.705826,4.79516 -4.513089,0 -8.415031,-1.59839 -11.705825,-4.79516 -3.196772,-3.29079 -4.795158,-7.19274 -4.795158,-11.70583 v -61.7729 c 0,-3.47884 0.987238,-6.6286 2.961715,-9.44928 2.068499,-2.91471 4.701135,-4.9362 7.897906,-6.06447 1.786431,-0.65816 3.666885,-0.98724 5.641362,-0.98724 5.077225,0 9.308247,1.97448 12.693064,5.92343 1.786431,1.97448 2.820681,3.00873 3.102749,3.10275 0,0 13.408119,16.21319 13.78421,16.49526 0.376091,0.28206 1.480789,2.43848 4.127113,2.43848 2.646324,0 3.89218,-2.15642 4.26827,-2.43848 0.376091,-0.28207 13.784088,-16.49526 13.784088,-16.49526 0.09402,0.094 1.081261,-0.94022 2.961715,-3.10275 3.478837,-3.94895 7.756866,-5.92343 12.834096,-5.92343 1.88045,0 3.76091,0.32908 5.64136,0.98724 3.19677,1.12827 5.7824,3.14976 7.75688,6.06447 2.06849,2.82068 3.10274,5.97044 3.10274,9.44928 v 61.7729 c 0,4.51309 -1.6454,8.41504 -4.93619,11.70583 -3.19677,3.19677 -7.09871,4.79516 -11.70582,4.79516 -4.51309,0 -8.41504,-1.59839 -11.705828,-4.79516 -3.196772,-3.29079 -4.795158,-7.19274 -4.795158,-11.70583 v -11.2332 c -0.277898,-3.06563 -2.987588,-1.13379 -3.948953,0 -2.538613,4.70114 -7.401781,7.59567 -13.2572,7.61584 z" />
|
||||||
|
<path
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
id="path5212"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:'OTADESIGN Rounded';-inkscape-font-specification:'OTADESIGN Rounded';fill-opacity:1;stroke-width:0.28950602px"
|
||||||
|
d="m 145.83461,185.00361 q -5.92343,0 -10.15445,-4.08999 -4.08999,-4.23102 -4.08999,-10.15445 0,-5.92343 4.08999,-10.01342 4.23102,-4.23102 10.15445,-4.23102 5.92343,0 10.15445,4.23102 4.23102,4.08999 4.23102,10.01342 0,5.92343 -4.23102,10.15445 -4.23102,4.08999 -10.15445,4.08999 z m 0.14103,2.82068 q 5.92343,0 10.01342,4.23102 4.23102,4.23102 4.23102,10.15445 v 34.83541 q 0,5.92343 -4.23102,10.15445 -4.08999,4.08999 -10.01342,4.08999 -5.92343,0 -10.15445,-4.08999 -4.23102,-4.23102 -4.23102,-10.15445 v -34.83541 q 0,-5.92343 4.23102,-10.15445 4.23102,-4.23102 10.15445,-4.23102 z" />
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 7.0 KiB |
27
src/client/app/admin/script.ts
Normal file
27
src/client/app/admin/script.ts
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
/**
|
||||||
|
* Admin
|
||||||
|
*/
|
||||||
|
|
||||||
|
import VueRouter from 'vue-router';
|
||||||
|
|
||||||
|
// Style
|
||||||
|
import './style.styl';
|
||||||
|
|
||||||
|
import init from '../init';
|
||||||
|
import Index from './views/index.vue';
|
||||||
|
|
||||||
|
init(launch => {
|
||||||
|
document.title = 'Admin';
|
||||||
|
|
||||||
|
// Init router
|
||||||
|
const router = new VueRouter({
|
||||||
|
mode: 'history',
|
||||||
|
base: '/admin/',
|
||||||
|
routes: [
|
||||||
|
{ path: '/', component: Index },
|
||||||
|
]
|
||||||
|
});
|
||||||
|
|
||||||
|
// Launch the app
|
||||||
|
launch(router);
|
||||||
|
});
|
6
src/client/app/admin/style.styl
Normal file
6
src/client/app/admin/style.styl
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
@import "../app"
|
||||||
|
@import "../reset"
|
||||||
|
|
||||||
|
html
|
||||||
|
height 100%
|
||||||
|
background var(--bg)
|
90
src/client/app/admin/views/announcements.vue
Normal file
90
src/client/app/admin/views/announcements.vue
Normal file
@ -0,0 +1,90 @@
|
|||||||
|
<template>
|
||||||
|
<div class="cdeuzmsthagexbkpofbmatmugjuvogfb">
|
||||||
|
<ui-card>
|
||||||
|
<div slot="title"><fa icon="broadcast-tower"/> %i18n:@announcements%</div>
|
||||||
|
<section v-for="(announcement, i) in announcements" class="fit-top">
|
||||||
|
<ui-input v-model="announcement.title" @change="save">
|
||||||
|
<span>%i18n:@title%</span>
|
||||||
|
</ui-input>
|
||||||
|
<ui-textarea v-model="announcement.text">
|
||||||
|
<span>%i18n:@text%</span>
|
||||||
|
</ui-textarea>
|
||||||
|
<ui-horizon-group>
|
||||||
|
<ui-button @click="save()"><fa :icon="['far', 'save']"/> %i18n:@save%</ui-button>
|
||||||
|
<ui-button @click="remove(i)"><fa :icon="['far', 'trash-alt']"/> %i18n:@remove%</ui-button>
|
||||||
|
</ui-horizon-group>
|
||||||
|
</section>
|
||||||
|
<section>
|
||||||
|
<ui-button @click="add"><fa icon="plus"/> %i18n:@add%</ui-button>
|
||||||
|
</section>
|
||||||
|
</ui-card>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts">
|
||||||
|
import Vue from "vue";
|
||||||
|
|
||||||
|
export default Vue.extend({
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
announcements: [],
|
||||||
|
};
|
||||||
|
},
|
||||||
|
|
||||||
|
created() {
|
||||||
|
(this as any).os.getMeta().then(meta => {
|
||||||
|
this.announcements = meta.broadcasts;
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
methods: {
|
||||||
|
add() {
|
||||||
|
this.announcements.push({
|
||||||
|
title: '',
|
||||||
|
text: ''
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
remove(i) {
|
||||||
|
this.$swal({
|
||||||
|
type: 'warning',
|
||||||
|
text: '%i18n:@_remove.are-you-sure%'.replace('$1', this.announcements.find((_, j) => j == i).title),
|
||||||
|
showCancelButton: true
|
||||||
|
}).then(res => {
|
||||||
|
if (!res.value) return;
|
||||||
|
this.announcements = this.announcements.filter((_, j) => j !== i);
|
||||||
|
this.save(true);
|
||||||
|
this.$swal({
|
||||||
|
type: 'success',
|
||||||
|
text: '%i18n:@_remove.removed%'
|
||||||
|
});
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
save(silent) {
|
||||||
|
(this as any).api('admin/update-meta', {
|
||||||
|
broadcasts: this.announcements
|
||||||
|
}).then(() => {
|
||||||
|
if (!silent) {
|
||||||
|
this.$swal({
|
||||||
|
type: 'success',
|
||||||
|
text: '%i18n:@saved%'
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}).catch(e => {
|
||||||
|
this.$swal({
|
||||||
|
type: 'error',
|
||||||
|
text: e
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="stylus" scoped>
|
||||||
|
.cdeuzmsthagexbkpofbmatmugjuvogfb
|
||||||
|
@media (min-width 500px)
|
||||||
|
padding 16px
|
||||||
|
|
||||||
|
</style>
|
105
src/client/app/admin/views/ap-log.vue
Normal file
105
src/client/app/admin/views/ap-log.vue
Normal file
@ -0,0 +1,105 @@
|
|||||||
|
<template>
|
||||||
|
<div class="hyhctythnmwihguaaapnbrbszsjqxpio">
|
||||||
|
<table>
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th><fa icon="exchange-alt"/> In/Out</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.actor }}</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts">
|
||||||
|
import Vue from 'vue';
|
||||||
|
|
||||||
|
export default Vue.extend({
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
logs: [],
|
||||||
|
connection: null
|
||||||
|
};
|
||||||
|
},
|
||||||
|
|
||||||
|
mounted() {
|
||||||
|
this.connection = (this as any).os.stream.useSharedConnection('apLog');
|
||||||
|
this.connection.on('log', this.onLog);
|
||||||
|
this.connection.on('logs', this.onLogs);
|
||||||
|
this.connection.send('requestLog', {
|
||||||
|
id: Math.random().toString().substr(2, 8),
|
||||||
|
length: 50
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
beforeDestroy() {
|
||||||
|
this.connection.dispose();
|
||||||
|
},
|
||||||
|
|
||||||
|
methods: {
|
||||||
|
onLog(log) {
|
||||||
|
log.id = Math.random();
|
||||||
|
this.logs.unshift(log);
|
||||||
|
if (this.logs.length > 50) this.logs.pop();
|
||||||
|
},
|
||||||
|
|
||||||
|
onLogs(logs) {
|
||||||
|
logs.reverse().forEach(log => this.onLog(log));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="stylus" scoped>
|
||||||
|
.hyhctythnmwihguaaapnbrbszsjqxpio
|
||||||
|
display block
|
||||||
|
padding 12px 16px 16px 16px
|
||||||
|
height 250px
|
||||||
|
overflow hidden
|
||||||
|
box-shadow 0 2px 4px rgba(0, 0, 0, 0.1)
|
||||||
|
background var(--adminDashboardCardBg)
|
||||||
|
border-radius 8px
|
||||||
|
|
||||||
|
> table
|
||||||
|
width 100%
|
||||||
|
max-width 100%
|
||||||
|
overflow auto
|
||||||
|
border-spacing 0
|
||||||
|
border-collapse collapse
|
||||||
|
color var(--adminDashboardCardFg)
|
||||||
|
font-size 14px
|
||||||
|
|
||||||
|
thead
|
||||||
|
border-bottom solid 1px var(--adminDashboardCardDivider)
|
||||||
|
|
||||||
|
tr
|
||||||
|
th
|
||||||
|
font-weight normal
|
||||||
|
text-align left
|
||||||
|
|
||||||
|
tbody
|
||||||
|
tr
|
||||||
|
&:nth-child(odd)
|
||||||
|
background rgba(0, 0, 0, 0.025)
|
||||||
|
|
||||||
|
th, td
|
||||||
|
padding 8px 16px
|
||||||
|
min-width 128px
|
||||||
|
|
||||||
|
td.in
|
||||||
|
color #d26755
|
||||||
|
|
||||||
|
td.out
|
||||||
|
color #55bb83
|
||||||
|
|
||||||
|
</style>
|
491
src/client/app/admin/views/charts.vue
Normal file
491
src/client/app/admin/views/charts.vue
Normal file
@ -0,0 +1,491 @@
|
|||||||
|
<template>
|
||||||
|
<div class="qvgidhudpqhjttdhxubzuyrhyzgslujw">
|
||||||
|
<header>
|
||||||
|
<b><fa :icon="['far', 'chart-bar']"/> %i18n:@title%:</b>
|
||||||
|
<select v-model="src">
|
||||||
|
<optgroup label="%i18n:@federation%">
|
||||||
|
<option value="federation-instances">%i18n:@charts.federation-instances%</option>
|
||||||
|
<option value="federation-instances-total">%i18n:@charts.federation-instances-total%</option>
|
||||||
|
</optgroup>
|
||||||
|
<optgroup label="%i18n:@users%">
|
||||||
|
<option value="users">%i18n:@charts.users%</option>
|
||||||
|
<option value="users-total">%i18n:@charts.users-total%</option>
|
||||||
|
</optgroup>
|
||||||
|
<optgroup label="%i18n:@notes%">
|
||||||
|
<option value="notes">%i18n:@charts.notes%</option>
|
||||||
|
<option value="local-notes">%i18n:@charts.local-notes%</option>
|
||||||
|
<option value="remote-notes">%i18n:@charts.remote-notes%</option>
|
||||||
|
<option value="notes-total">%i18n:@charts.notes-total%</option>
|
||||||
|
</optgroup>
|
||||||
|
<optgroup label="%i18n:@drive%">
|
||||||
|
<option value="drive-files">%i18n:@charts.drive-files%</option>
|
||||||
|
<option value="drive-files-total">%i18n:@charts.drive-files-total%</option>
|
||||||
|
<option value="drive">%i18n:@charts.drive%</option>
|
||||||
|
<option value="drive-total">%i18n:@charts.drive-total%</option>
|
||||||
|
</optgroup>
|
||||||
|
<optgroup label="%i18n:@network%">
|
||||||
|
<option value="network-requests">%i18n:@charts.network-requests%</option>
|
||||||
|
<option value="network-time">%i18n:@charts.network-time%</option>
|
||||||
|
<option value="network-usage">%i18n:@charts.network-usage%</option>
|
||||||
|
</optgroup>
|
||||||
|
</select>
|
||||||
|
<div>
|
||||||
|
<span @click="span = 'day'" :class="{ active: span == 'day' }">%i18n:@per-day%</span> | <span @click="span = 'hour'" :class="{ active: span == 'hour' }">%i18n:@per-hour%</span>
|
||||||
|
</div>
|
||||||
|
</header>
|
||||||
|
<div ref="chart"></div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts">
|
||||||
|
import Vue from 'vue';
|
||||||
|
import * as tinycolor from 'tinycolor2';
|
||||||
|
import * as ApexCharts from 'apexcharts';
|
||||||
|
|
||||||
|
const limit = 90;
|
||||||
|
|
||||||
|
const sum = (...arr) => arr.reduce((r, a) => r.map((b, i) => a[i] + b));
|
||||||
|
const negate = arr => arr.map(x => -x);
|
||||||
|
|
||||||
|
export default Vue.extend({
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
chart: null,
|
||||||
|
src: 'notes',
|
||||||
|
span: 'hour',
|
||||||
|
chartInstance: null
|
||||||
|
};
|
||||||
|
},
|
||||||
|
|
||||||
|
computed: {
|
||||||
|
data(): any {
|
||||||
|
if (this.chart == null) return null;
|
||||||
|
switch (this.src) {
|
||||||
|
case 'federation-instances': return this.federationInstancesChart(false);
|
||||||
|
case 'federation-instances-total': return this.federationInstancesChart(true);
|
||||||
|
case 'users': return this.usersChart(false);
|
||||||
|
case 'users-total': return this.usersChart(true);
|
||||||
|
case 'notes': return this.notesChart('combined');
|
||||||
|
case 'local-notes': return this.notesChart('local');
|
||||||
|
case 'remote-notes': return this.notesChart('remote');
|
||||||
|
case 'notes-total': return this.notesTotalChart();
|
||||||
|
case 'drive': return this.driveChart();
|
||||||
|
case 'drive-total': return this.driveTotalChart();
|
||||||
|
case 'drive-files': return this.driveFilesChart();
|
||||||
|
case 'drive-files-total': return this.driveFilesTotalChart();
|
||||||
|
case 'network-requests': return this.networkRequestsChart();
|
||||||
|
case 'network-time': return this.networkTimeChart();
|
||||||
|
case 'network-usage': return this.networkUsageChart();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
stats(): any[] {
|
||||||
|
const stats =
|
||||||
|
this.span == 'day' ? this.chart.perDay :
|
||||||
|
this.span == 'hour' ? this.chart.perHour :
|
||||||
|
null;
|
||||||
|
|
||||||
|
return stats;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
watch: {
|
||||||
|
src() {
|
||||||
|
this.render();
|
||||||
|
},
|
||||||
|
|
||||||
|
span() {
|
||||||
|
this.render();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
async mounted() {
|
||||||
|
this.now = new Date();
|
||||||
|
|
||||||
|
const [perHour, perDay] = await Promise.all([Promise.all([
|
||||||
|
(this as any).api('charts/federation', { limit: limit, span: 'hour' }),
|
||||||
|
(this as any).api('charts/users', { limit: limit, span: 'hour' }),
|
||||||
|
(this as any).api('charts/notes', { limit: limit, span: 'hour' }),
|
||||||
|
(this as any).api('charts/drive', { limit: limit, span: 'hour' }),
|
||||||
|
(this as any).api('charts/network', { limit: limit, span: 'hour' })
|
||||||
|
]), Promise.all([
|
||||||
|
(this as any).api('charts/federation', { limit: limit, span: 'day' }),
|
||||||
|
(this as any).api('charts/users', { limit: limit, span: 'day' }),
|
||||||
|
(this as any).api('charts/notes', { limit: limit, span: 'day' }),
|
||||||
|
(this as any).api('charts/drive', { limit: limit, span: 'day' }),
|
||||||
|
(this as any).api('charts/network', { limit: limit, span: 'day' })
|
||||||
|
])]);
|
||||||
|
|
||||||
|
const chart = {
|
||||||
|
perHour: {
|
||||||
|
federation: perHour[0],
|
||||||
|
users: perHour[1],
|
||||||
|
notes: perHour[2],
|
||||||
|
drive: perHour[3],
|
||||||
|
network: perHour[4]
|
||||||
|
},
|
||||||
|
perDay: {
|
||||||
|
federation: perDay[0],
|
||||||
|
users: perDay[1],
|
||||||
|
notes: perDay[2],
|
||||||
|
drive: perDay[3],
|
||||||
|
network: perDay[4]
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
this.chart = chart;
|
||||||
|
|
||||||
|
this.render();
|
||||||
|
},
|
||||||
|
|
||||||
|
methods: {
|
||||||
|
setSrc(src) {
|
||||||
|
this.src = src;
|
||||||
|
},
|
||||||
|
|
||||||
|
render() {
|
||||||
|
if (this.chartInstance) {
|
||||||
|
this.chartInstance.destroy();
|
||||||
|
}
|
||||||
|
|
||||||
|
this.chartInstance = new ApexCharts(this.$refs.chart, {
|
||||||
|
chart: {
|
||||||
|
type: 'area',
|
||||||
|
height: 300,
|
||||||
|
animations: {
|
||||||
|
dynamicAnimation: {
|
||||||
|
enabled: false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
toolbar: {
|
||||||
|
show: false
|
||||||
|
},
|
||||||
|
zoom: {
|
||||||
|
enabled: false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
dataLabels: {
|
||||||
|
enabled: false
|
||||||
|
},
|
||||||
|
grid: {
|
||||||
|
clipMarkers: false,
|
||||||
|
borderColor: 'rgba(0, 0, 0, 0.1)'
|
||||||
|
},
|
||||||
|
stroke: {
|
||||||
|
curve: 'straight',
|
||||||
|
width: 2
|
||||||
|
},
|
||||||
|
legend: {
|
||||||
|
labels: {
|
||||||
|
color: tinycolor(getComputedStyle(document.documentElement).getPropertyValue('--text')).toRgbString()
|
||||||
|
},
|
||||||
|
},
|
||||||
|
xaxis: {
|
||||||
|
type: 'datetime',
|
||||||
|
labels: {
|
||||||
|
style: {
|
||||||
|
colors: tinycolor(getComputedStyle(document.documentElement).getPropertyValue('--text')).toRgbString()
|
||||||
|
}
|
||||||
|
},
|
||||||
|
axisBorder: {
|
||||||
|
color: 'rgba(0, 0, 0, 0.1)'
|
||||||
|
},
|
||||||
|
axisTicks: {
|
||||||
|
color: 'rgba(0, 0, 0, 0.1)'
|
||||||
|
},
|
||||||
|
},
|
||||||
|
yaxis: {
|
||||||
|
labels: {
|
||||||
|
formatter: this.data.bytes ? v => Vue.filter('bytes')(v, 0) : v => Vue.filter('number')(v),
|
||||||
|
style: {
|
||||||
|
color: tinycolor(getComputedStyle(document.documentElement).getPropertyValue('--text')).toRgbString()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
series: this.data.series
|
||||||
|
});
|
||||||
|
|
||||||
|
this.chartInstance.render();
|
||||||
|
},
|
||||||
|
|
||||||
|
getDate(i: number) {
|
||||||
|
const y = this.now.getFullYear();
|
||||||
|
const m = this.now.getMonth();
|
||||||
|
const d = this.now.getDate();
|
||||||
|
const h = this.now.getHours();
|
||||||
|
|
||||||
|
return (
|
||||||
|
this.span == 'day' ? new Date(y, m, d - i) :
|
||||||
|
this.span == 'hour' ? new Date(y, m, d, h - i) :
|
||||||
|
null
|
||||||
|
);
|
||||||
|
},
|
||||||
|
|
||||||
|
format(arr) {
|
||||||
|
return arr.map((v, i) => ({ x: this.getDate(i).getTime(), y: v }));
|
||||||
|
},
|
||||||
|
|
||||||
|
federationInstancesChart(total: boolean): any {
|
||||||
|
return {
|
||||||
|
series: [{
|
||||||
|
data: this.format(total
|
||||||
|
? this.stats.federation.instance.total
|
||||||
|
: sum(this.stats.federation.instance.inc, negate(this.stats.federation.instance.dec))
|
||||||
|
)
|
||||||
|
}]
|
||||||
|
};
|
||||||
|
},
|
||||||
|
|
||||||
|
notesChart(type: string): any {
|
||||||
|
return {
|
||||||
|
series: [{
|
||||||
|
name: 'All',
|
||||||
|
type: 'line',
|
||||||
|
data: this.format(type == 'combined'
|
||||||
|
? sum(this.stats.notes.local.inc, negate(this.stats.notes.local.dec), this.stats.notes.remote.inc, negate(this.stats.notes.remote.dec))
|
||||||
|
: sum(this.stats.notes[type].inc, negate(this.stats.notes[type].dec))
|
||||||
|
)
|
||||||
|
}, {
|
||||||
|
name: 'Renotes',
|
||||||
|
type: 'area',
|
||||||
|
data: this.format(type == 'combined'
|
||||||
|
? sum(this.stats.notes.local.diffs.renote, this.stats.notes.remote.diffs.renote)
|
||||||
|
: this.stats.notes[type].diffs.renote
|
||||||
|
)
|
||||||
|
}, {
|
||||||
|
name: 'Replies',
|
||||||
|
type: 'area',
|
||||||
|
data: this.format(type == 'combined'
|
||||||
|
? sum(this.stats.notes.local.diffs.reply, this.stats.notes.remote.diffs.reply)
|
||||||
|
: this.stats.notes[type].diffs.reply
|
||||||
|
)
|
||||||
|
}, {
|
||||||
|
name: 'Normal',
|
||||||
|
type: 'area',
|
||||||
|
data: this.format(type == 'combined'
|
||||||
|
? sum(this.stats.notes.local.diffs.normal, this.stats.notes.remote.diffs.normal)
|
||||||
|
: this.stats.notes[type].diffs.normal
|
||||||
|
)
|
||||||
|
}]
|
||||||
|
};
|
||||||
|
},
|
||||||
|
|
||||||
|
notesTotalChart(): any {
|
||||||
|
return {
|
||||||
|
series: [{
|
||||||
|
name: 'Combined',
|
||||||
|
type: 'line',
|
||||||
|
data: this.format(sum(this.stats.notes.local.total, this.stats.notes.remote.total))
|
||||||
|
}, {
|
||||||
|
name: 'Local',
|
||||||
|
type: 'area',
|
||||||
|
data: this.format(this.stats.notes.local.total)
|
||||||
|
}, {
|
||||||
|
name: 'Remote',
|
||||||
|
type: 'area',
|
||||||
|
data: this.format(this.stats.notes.remote.total)
|
||||||
|
}]
|
||||||
|
};
|
||||||
|
},
|
||||||
|
|
||||||
|
usersChart(total: boolean): any {
|
||||||
|
return {
|
||||||
|
series: [{
|
||||||
|
name: 'Combined',
|
||||||
|
type: 'line',
|
||||||
|
data: this.format(total
|
||||||
|
? sum(this.stats.users.local.total, this.stats.users.remote.total)
|
||||||
|
: sum(this.stats.users.local.inc, negate(this.stats.users.local.dec), this.stats.users.remote.inc, negate(this.stats.users.remote.dec))
|
||||||
|
)
|
||||||
|
}, {
|
||||||
|
name: 'Local',
|
||||||
|
type: 'area',
|
||||||
|
data: this.format(total
|
||||||
|
? this.stats.users.local.total
|
||||||
|
: sum(this.stats.users.local.inc, negate(this.stats.users.local.dec))
|
||||||
|
)
|
||||||
|
}, {
|
||||||
|
name: 'Remote',
|
||||||
|
type: 'area',
|
||||||
|
data: this.format(total
|
||||||
|
? this.stats.users.remote.total
|
||||||
|
: sum(this.stats.users.remote.inc, negate(this.stats.users.remote.dec))
|
||||||
|
)
|
||||||
|
}]
|
||||||
|
};
|
||||||
|
},
|
||||||
|
|
||||||
|
driveChart(): any {
|
||||||
|
return {
|
||||||
|
bytes: true,
|
||||||
|
series: [{
|
||||||
|
name: 'All',
|
||||||
|
type: 'line',
|
||||||
|
data: this.format(
|
||||||
|
sum(
|
||||||
|
this.stats.drive.local.incSize,
|
||||||
|
negate(this.stats.drive.local.decSize),
|
||||||
|
this.stats.drive.remote.incSize,
|
||||||
|
negate(this.stats.drive.remote.decSize)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
}, {
|
||||||
|
name: 'Local +',
|
||||||
|
type: 'area',
|
||||||
|
data: this.format(this.stats.drive.local.incSize)
|
||||||
|
}, {
|
||||||
|
name: 'Local -',
|
||||||
|
type: 'area',
|
||||||
|
data: this.format(negate(this.stats.drive.local.decSize))
|
||||||
|
}, {
|
||||||
|
name: 'Remote +',
|
||||||
|
type: 'area',
|
||||||
|
data: this.format(this.stats.drive.remote.incSize)
|
||||||
|
}, {
|
||||||
|
name: 'Remote -',
|
||||||
|
type: 'area',
|
||||||
|
data: this.format(negate(this.stats.drive.remote.decSize))
|
||||||
|
}]
|
||||||
|
};
|
||||||
|
},
|
||||||
|
|
||||||
|
driveTotalChart(): any {
|
||||||
|
return {
|
||||||
|
bytes: true,
|
||||||
|
series: [{
|
||||||
|
name: 'Combined',
|
||||||
|
type: 'line',
|
||||||
|
data: this.format(sum(this.stats.drive.local.totalSize, this.stats.drive.remote.totalSize))
|
||||||
|
}, {
|
||||||
|
name: 'Local',
|
||||||
|
type: 'area',
|
||||||
|
data: this.format(this.stats.drive.local.totalSize)
|
||||||
|
}, {
|
||||||
|
name: 'Remote',
|
||||||
|
type: 'area',
|
||||||
|
data: this.format(this.stats.drive.remote.totalSize)
|
||||||
|
}]
|
||||||
|
};
|
||||||
|
},
|
||||||
|
|
||||||
|
driveFilesChart(): any {
|
||||||
|
return {
|
||||||
|
series: [{
|
||||||
|
name: 'All',
|
||||||
|
type: 'line',
|
||||||
|
data: this.format(
|
||||||
|
sum(
|
||||||
|
this.stats.drive.local.incCount,
|
||||||
|
negate(this.stats.drive.local.decCount),
|
||||||
|
this.stats.drive.remote.incCount,
|
||||||
|
negate(this.stats.drive.remote.decCount)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
}, {
|
||||||
|
name: 'Local +',
|
||||||
|
type: 'area',
|
||||||
|
data: this.format(this.stats.drive.local.incCount)
|
||||||
|
}, {
|
||||||
|
name: 'Local -',
|
||||||
|
type: 'area',
|
||||||
|
data: this.format(negate(this.stats.drive.local.decCount))
|
||||||
|
}, {
|
||||||
|
name: 'Remote +',
|
||||||
|
type: 'area',
|
||||||
|
data: this.format(this.stats.drive.remote.incCount)
|
||||||
|
}, {
|
||||||
|
name: 'Remote -',
|
||||||
|
type: 'area',
|
||||||
|
data: this.format(negate(this.stats.drive.remote.decCount))
|
||||||
|
}]
|
||||||
|
};
|
||||||
|
},
|
||||||
|
|
||||||
|
driveFilesTotalChart(): any {
|
||||||
|
return {
|
||||||
|
series: [{
|
||||||
|
name: 'Combined',
|
||||||
|
type: 'line',
|
||||||
|
data: this.format(sum(this.stats.drive.local.totalCount, this.stats.drive.remote.totalCount))
|
||||||
|
}, {
|
||||||
|
name: 'Local',
|
||||||
|
type: 'area',
|
||||||
|
data: this.format(this.stats.drive.local.totalCount)
|
||||||
|
}, {
|
||||||
|
name: 'Remote',
|
||||||
|
type: 'area',
|
||||||
|
data: this.format(this.stats.drive.remote.totalCount)
|
||||||
|
}]
|
||||||
|
};
|
||||||
|
},
|
||||||
|
|
||||||
|
networkRequestsChart(): any {
|
||||||
|
return {
|
||||||
|
series: [{
|
||||||
|
name: 'Incoming',
|
||||||
|
data: this.format(this.stats.network.incomingRequests)
|
||||||
|
}]
|
||||||
|
};
|
||||||
|
},
|
||||||
|
|
||||||
|
networkTimeChart(): any {
|
||||||
|
const data = [];
|
||||||
|
|
||||||
|
for (let i = 0; i < limit; i++) {
|
||||||
|
data.push(this.stats.network.incomingRequests[i] != 0 ? (this.stats.network.totalTime[i] / this.stats.network.incomingRequests[i]) : 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
series: [{
|
||||||
|
name: 'Avg time',
|
||||||
|
data: this.format(data)
|
||||||
|
}]
|
||||||
|
};
|
||||||
|
},
|
||||||
|
|
||||||
|
networkUsageChart(): any {
|
||||||
|
return {
|
||||||
|
bytes: true,
|
||||||
|
series: [{
|
||||||
|
name: 'Incoming',
|
||||||
|
data: this.format(this.stats.network.incomingBytes)
|
||||||
|
}, {
|
||||||
|
name: 'Outgoing',
|
||||||
|
data: this.format(this.stats.network.outgoingBytes)
|
||||||
|
}]
|
||||||
|
};
|
||||||
|
},
|
||||||
|
}
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="stylus" scoped>
|
||||||
|
.qvgidhudpqhjttdhxubzuyrhyzgslujw
|
||||||
|
display block
|
||||||
|
flex 1
|
||||||
|
padding 32px 24px
|
||||||
|
padding-bottom 0
|
||||||
|
box-shadow 0 2px 4px rgba(0, 0, 0, 0.1)
|
||||||
|
background var(--face)
|
||||||
|
border-radius 8px
|
||||||
|
|
||||||
|
> header
|
||||||
|
display flex
|
||||||
|
margin 0 8px
|
||||||
|
padding 0 0 8px 0
|
||||||
|
font-size 1em
|
||||||
|
color var(--adminDashboardCardFg)
|
||||||
|
border-bottom solid 1px var(--adminDashboardCardDivider)
|
||||||
|
|
||||||
|
> b
|
||||||
|
margin-right 8px
|
||||||
|
|
||||||
|
> *:last-child
|
||||||
|
margin-left auto
|
||||||
|
|
||||||
|
*
|
||||||
|
&:not(.active)
|
||||||
|
color var(--primary)
|
||||||
|
cursor pointer
|
||||||
|
|
||||||
|
</style>
|
180
src/client/app/admin/views/cpu-memory.vue
Normal file
180
src/client/app/admin/views/cpu-memory.vue
Normal file
@ -0,0 +1,180 @@
|
|||||||
|
<template>
|
||||||
|
<div class="zyknedwtlthezamcjlolyusmipqmjgxz">
|
||||||
|
<div>
|
||||||
|
<header>
|
||||||
|
<span><fa icon="microchip"/> CPU <span>{{ cpuP }}%</span></span>
|
||||||
|
<span v-if="meta">{{ meta.cpu.model }}</span>
|
||||||
|
</header>
|
||||||
|
<div ref="cpu"></div>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<header>
|
||||||
|
<span><fa icon="memory"/> MEM <span>{{ memP }}%</span></span>
|
||||||
|
<span v-if="meta"></span>
|
||||||
|
</header>
|
||||||
|
<div ref="mem"></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts">
|
||||||
|
import Vue from 'vue';
|
||||||
|
import * as ApexCharts from 'apexcharts';
|
||||||
|
|
||||||
|
export default Vue.extend({
|
||||||
|
props: ['connection'],
|
||||||
|
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
stats: [],
|
||||||
|
cpuChart: null,
|
||||||
|
memChart: null,
|
||||||
|
cpuP: '',
|
||||||
|
memP: '',
|
||||||
|
meta: null
|
||||||
|
};
|
||||||
|
},
|
||||||
|
|
||||||
|
watch: {
|
||||||
|
stats(stats) {
|
||||||
|
this.cpuChart.updateSeries([{
|
||||||
|
data: stats.map((x, i) => ({ x: i, y: x.cpu_usage }))
|
||||||
|
}]);
|
||||||
|
this.memChart.updateSeries([{
|
||||||
|
data: stats.map((x, i) => ({ x: i, y: (x.mem.used / x.mem.total) }))
|
||||||
|
}]);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
mounted() {
|
||||||
|
(this as any).os.getMeta().then(meta => {
|
||||||
|
this.meta = meta;
|
||||||
|
});
|
||||||
|
|
||||||
|
this.connection.on('stats', this.onStats);
|
||||||
|
this.connection.on('statsLog', this.onStatsLog);
|
||||||
|
this.connection.send('requestLog', {
|
||||||
|
id: Math.random().toString().substr(2, 8),
|
||||||
|
length: 200
|
||||||
|
});
|
||||||
|
|
||||||
|
const chartOpts = {
|
||||||
|
chart: {
|
||||||
|
type: 'area',
|
||||||
|
height: 200,
|
||||||
|
animations: {
|
||||||
|
dynamicAnimation: {
|
||||||
|
enabled: false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
toolbar: {
|
||||||
|
show: false
|
||||||
|
},
|
||||||
|
zoom: {
|
||||||
|
enabled: false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
dataLabels: {
|
||||||
|
enabled: false
|
||||||
|
},
|
||||||
|
grid: {
|
||||||
|
clipMarkers: false,
|
||||||
|
borderColor: 'rgba(0, 0, 0, 0.1)'
|
||||||
|
},
|
||||||
|
stroke: {
|
||||||
|
curve: 'straight',
|
||||||
|
width: 2
|
||||||
|
},
|
||||||
|
tooltip: {
|
||||||
|
enabled: false
|
||||||
|
},
|
||||||
|
series: [{
|
||||||
|
data: []
|
||||||
|
}],
|
||||||
|
xaxis: {
|
||||||
|
type: 'numeric',
|
||||||
|
labels: {
|
||||||
|
show: false
|
||||||
|
},
|
||||||
|
tooltip: {
|
||||||
|
enabled: false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
yaxis: {
|
||||||
|
show: false,
|
||||||
|
min: 0,
|
||||||
|
max: 1
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
this.cpuChart = new ApexCharts(this.$refs.cpu, chartOpts);
|
||||||
|
this.memChart = new ApexCharts(this.$refs.mem, chartOpts);
|
||||||
|
|
||||||
|
this.cpuChart.render();
|
||||||
|
this.memChart.render();
|
||||||
|
},
|
||||||
|
|
||||||
|
beforeDestroy() {
|
||||||
|
this.connection.off('stats', this.onStats);
|
||||||
|
this.connection.off('statsLog', this.onStatsLog);
|
||||||
|
},
|
||||||
|
|
||||||
|
methods: {
|
||||||
|
onStats(stats) {
|
||||||
|
this.stats.push(stats);
|
||||||
|
if (this.stats.length > 200) this.stats.shift();
|
||||||
|
|
||||||
|
this.cpuP = (stats.cpu_usage * 100).toFixed(0);
|
||||||
|
this.memP = (stats.mem.used / stats.mem.total * 100).toFixed(0);
|
||||||
|
},
|
||||||
|
|
||||||
|
onStatsLog(statsLog) {
|
||||||
|
statsLog.reverse().forEach(stats => this.onStats(stats));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="stylus" scoped>
|
||||||
|
.zyknedwtlthezamcjlolyusmipqmjgxz
|
||||||
|
display flex
|
||||||
|
|
||||||
|
> div
|
||||||
|
display block
|
||||||
|
flex 1
|
||||||
|
padding 20px 12px 0 12px
|
||||||
|
box-shadow 0 2px 4px rgba(0, 0, 0, 0.1)
|
||||||
|
background var(--face)
|
||||||
|
border-radius 8px
|
||||||
|
|
||||||
|
&:first-child
|
||||||
|
margin-right 16px
|
||||||
|
|
||||||
|
> header
|
||||||
|
display flex
|
||||||
|
padding 0 8px
|
||||||
|
margin-bottom -16px
|
||||||
|
color var(--adminDashboardCardFg)
|
||||||
|
font-size 14px
|
||||||
|
|
||||||
|
> span
|
||||||
|
&:last-child
|
||||||
|
margin-left auto
|
||||||
|
opacity 0.7
|
||||||
|
|
||||||
|
> span
|
||||||
|
opacity 0.7
|
||||||
|
|
||||||
|
> div
|
||||||
|
margin-bottom -10px
|
||||||
|
|
||||||
|
@media (max-width 1000px)
|
||||||
|
display block
|
||||||
|
margin-bottom 26px
|
||||||
|
|
||||||
|
> div
|
||||||
|
&:first-child
|
||||||
|
margin-right 0
|
||||||
|
margin-bottom 26px
|
||||||
|
|
||||||
|
</style>
|
236
src/client/app/admin/views/dashboard.vue
Normal file
236
src/client/app/admin/views/dashboard.vue
Normal file
@ -0,0 +1,236 @@
|
|||||||
|
<template>
|
||||||
|
<div class="obdskegsannmntldydackcpzezagxqfy">
|
||||||
|
<header v-if="meta">
|
||||||
|
<p><b>Misskey</b><span>{{ meta.version }}</span></p>
|
||||||
|
<p><b>Machine</b><span>{{ meta.machine }}</span></p>
|
||||||
|
<p><b>OS</b><span>{{ meta.os }}</span></p>
|
||||||
|
<p><b>Node</b><span>{{ meta.node }}</span></p>
|
||||||
|
<p>%i18n:common.ai-chan-kawaii%</p>
|
||||||
|
</header>
|
||||||
|
|
||||||
|
<div v-if="stats" class="stats">
|
||||||
|
<div>
|
||||||
|
<div>
|
||||||
|
<div><fa icon="user"/></div>
|
||||||
|
<div>
|
||||||
|
<span>%i18n:@accounts%</span>
|
||||||
|
<b class="primary">{{ stats.originalUsersCount | number }}</b>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<span><fa icon="home"/> %i18n:@this-instance%</span>
|
||||||
|
<span @click="setChartSrc('users')"><fa :icon="['far', 'chart-bar']"/></span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<div>
|
||||||
|
<div><fa icon="pencil-alt"/></div>
|
||||||
|
<div>
|
||||||
|
<span>%i18n:@notes%</span>
|
||||||
|
<b class="primary">{{ stats.originalNotesCount | number }}</b>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<span><fa icon="home"/> %i18n:@this-instance%</span>
|
||||||
|
<span @click="setChartSrc('notes')"><fa :icon="['far', 'chart-bar']"/></span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<div>
|
||||||
|
<div><fa icon="database"/></div>
|
||||||
|
<div>
|
||||||
|
<span>%i18n:@drive%</span>
|
||||||
|
<b>{{ stats.driveUsageLocal | bytes }}</b>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<span><fa icon="home"/> %i18n:@this-instance%</span>
|
||||||
|
<span @click="setChartSrc('drive')"><fa :icon="['far', 'chart-bar']"/></span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<div>
|
||||||
|
<div><fa :icon="['far', 'hdd']"/></div>
|
||||||
|
<div>
|
||||||
|
<span>%i18n:@instances%</span>
|
||||||
|
<b>{{ stats.instances | number }}</b>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<span><fa icon="globe"/> %i18n:@federated%</span>
|
||||||
|
<span @click="setChartSrc('federation-instances-total')"><fa :icon="['far', 'chart-bar']"/></span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="charts">
|
||||||
|
<x-charts ref="charts"/>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="cpu-memory">
|
||||||
|
<x-cpu-memory :connection="connection"/>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="ap">
|
||||||
|
<x-ap-log/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts">
|
||||||
|
import Vue from "vue";
|
||||||
|
import XCpuMemory from "./cpu-memory.vue";
|
||||||
|
import XCharts from "./charts.vue";
|
||||||
|
import XApLog from "./ap-log.vue";
|
||||||
|
|
||||||
|
export default Vue.extend({
|
||||||
|
components: {
|
||||||
|
XCpuMemory,
|
||||||
|
XCharts,
|
||||||
|
XApLog
|
||||||
|
},
|
||||||
|
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
stats: null,
|
||||||
|
connection: null,
|
||||||
|
meta: null
|
||||||
|
};
|
||||||
|
},
|
||||||
|
|
||||||
|
created() {
|
||||||
|
this.connection = (this as any).os.stream.useSharedConnection('serverStats');
|
||||||
|
|
||||||
|
(this as any).os.getMeta().then(meta => {
|
||||||
|
this.meta = meta;
|
||||||
|
});
|
||||||
|
|
||||||
|
(this as any).api('stats').then(stats => {
|
||||||
|
this.stats = stats;
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
beforeDestroy() {
|
||||||
|
this.connection.dispose();
|
||||||
|
},
|
||||||
|
|
||||||
|
methods: {
|
||||||
|
setChartSrc(src) {
|
||||||
|
this.$refs.charts.setSrc(src);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="stylus" scoped>
|
||||||
|
.obdskegsannmntldydackcpzezagxqfy
|
||||||
|
padding 16px
|
||||||
|
|
||||||
|
@media (min-width 500px)
|
||||||
|
padding 32px
|
||||||
|
|
||||||
|
> header
|
||||||
|
display flex
|
||||||
|
margin-bottom 16px
|
||||||
|
padding-bottom 16px
|
||||||
|
border-bottom solid 1px var(--adminDashboardHeaderBorder)
|
||||||
|
color var(--adminDashboardHeaderFg)
|
||||||
|
font-size 14px
|
||||||
|
white-space nowrap
|
||||||
|
|
||||||
|
@media (max-width 1000px)
|
||||||
|
display none
|
||||||
|
|
||||||
|
> p
|
||||||
|
display block
|
||||||
|
margin 0 32px 0 0
|
||||||
|
overflow hidden
|
||||||
|
text-overflow ellipsis
|
||||||
|
|
||||||
|
> b
|
||||||
|
&:after
|
||||||
|
content ':'
|
||||||
|
margin-right 8px
|
||||||
|
|
||||||
|
&:last-child
|
||||||
|
margin-left auto
|
||||||
|
margin-right 0
|
||||||
|
|
||||||
|
> .stats
|
||||||
|
display flex
|
||||||
|
justify-content space-between
|
||||||
|
margin-bottom 16px
|
||||||
|
|
||||||
|
> div
|
||||||
|
flex 1
|
||||||
|
margin-right 16px
|
||||||
|
color var(--adminDashboardCardFg)
|
||||||
|
box-shadow 0 2px 4px rgba(0, 0, 0, 0.1)
|
||||||
|
background var(--adminDashboardCardBg)
|
||||||
|
border-radius 8px
|
||||||
|
|
||||||
|
&:last-child
|
||||||
|
margin-right 0
|
||||||
|
|
||||||
|
> div:first-child
|
||||||
|
display flex
|
||||||
|
align-items center
|
||||||
|
text-align center
|
||||||
|
|
||||||
|
&:last-child
|
||||||
|
margin-right 0
|
||||||
|
|
||||||
|
> div:first-child
|
||||||
|
padding 16px 24px
|
||||||
|
font-size 28px
|
||||||
|
|
||||||
|
> div:last-child
|
||||||
|
flex 1
|
||||||
|
padding 16px 32px 16px 0
|
||||||
|
text-align right
|
||||||
|
|
||||||
|
> span
|
||||||
|
font-size 70%
|
||||||
|
opacity 0.7
|
||||||
|
|
||||||
|
> b
|
||||||
|
display block
|
||||||
|
|
||||||
|
&.primary
|
||||||
|
color var(--primary)
|
||||||
|
|
||||||
|
> div:last-child
|
||||||
|
display flex
|
||||||
|
padding 6px 16px
|
||||||
|
border-top solid 1px var(--adminDashboardCardDivider)
|
||||||
|
|
||||||
|
> span
|
||||||
|
font-size 70%
|
||||||
|
opacity 0.7
|
||||||
|
|
||||||
|
&:last-child
|
||||||
|
margin-left auto
|
||||||
|
cursor pointer
|
||||||
|
|
||||||
|
@media (max-width 900px)
|
||||||
|
display grid
|
||||||
|
grid-template-columns 1fr 1fr
|
||||||
|
grid-template-rows 1fr 1fr
|
||||||
|
gap 16px
|
||||||
|
|
||||||
|
> div
|
||||||
|
margin-right 0
|
||||||
|
|
||||||
|
@media (max-width 500px)
|
||||||
|
display block
|
||||||
|
|
||||||
|
> div:not(:last-child)
|
||||||
|
margin-bottom 16px
|
||||||
|
|
||||||
|
> .charts
|
||||||
|
margin-bottom 16px
|
||||||
|
|
||||||
|
> .cpu-memory
|
||||||
|
margin-bottom 16px
|
||||||
|
|
||||||
|
</style>
|
147
src/client/app/admin/views/emoji.vue
Normal file
147
src/client/app/admin/views/emoji.vue
Normal file
@ -0,0 +1,147 @@
|
|||||||
|
<template>
|
||||||
|
<div class="tumhkfkmgtvzljezfvmgkeurkfncshbe">
|
||||||
|
<ui-card>
|
||||||
|
<div slot="title"><fa icon="plus"/> %i18n:@add-emoji.title%</div>
|
||||||
|
<section class="fit-top">
|
||||||
|
<ui-horizon-group inputs>
|
||||||
|
<ui-input v-model="name">
|
||||||
|
<span>%i18n:@add-emoji.name%</span>
|
||||||
|
<span slot="text">%i18n:@add-emoji.name-desc%</span>
|
||||||
|
</ui-input>
|
||||||
|
<ui-input v-model="aliases">
|
||||||
|
<span>%i18n:@add-emoji.aliases%</span>
|
||||||
|
<span slot="text">%i18n:@add-emoji.aliases-desc%</span>
|
||||||
|
</ui-input>
|
||||||
|
</ui-horizon-group>
|
||||||
|
<ui-input v-model="url">
|
||||||
|
<i slot="icon"><fa icon="link"/></i>
|
||||||
|
<span>%i18n:@add-emoji.url%</span>
|
||||||
|
</ui-input>
|
||||||
|
<ui-info>%i18n:@add-emoji.info%</ui-info>
|
||||||
|
<ui-button @click="add">%i18n:@add-emoji.add%</ui-button>
|
||||||
|
</section>
|
||||||
|
</ui-card>
|
||||||
|
|
||||||
|
<ui-card>
|
||||||
|
<div slot="title"><fa :icon="['far', 'grin']"/> %i18n:@emojis.title%</div>
|
||||||
|
<section v-for="emoji in emojis">
|
||||||
|
<img :src="emoji.url" :alt="emoji.name" style="width: 64px;"/>
|
||||||
|
<ui-horizon-group inputs>
|
||||||
|
<ui-input v-model="emoji.name">
|
||||||
|
<span>%i18n:@add-emoji.name%</span>
|
||||||
|
</ui-input>
|
||||||
|
<ui-input v-model="emoji.aliases">
|
||||||
|
<span>%i18n:@add-emoji.aliases%</span>
|
||||||
|
</ui-input>
|
||||||
|
</ui-horizon-group>
|
||||||
|
<ui-input v-model="emoji.url">
|
||||||
|
<i slot="icon"><fa icon="link"/></i>
|
||||||
|
<span>%i18n:@add-emoji.url%</span>
|
||||||
|
</ui-input>
|
||||||
|
<ui-horizon-group>
|
||||||
|
<ui-button @click="updateEmoji(emoji)"><fa :icon="['far', 'save']"/> %i18n:@emojis.update%</ui-button>
|
||||||
|
<ui-button @click="removeEmoji(emoji)"><fa :icon="['far', 'trash-alt']"/> %i18n:@emojis.remove%</ui-button>
|
||||||
|
</ui-horizon-group>
|
||||||
|
</section>
|
||||||
|
</ui-card>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts">
|
||||||
|
import Vue from "vue";
|
||||||
|
|
||||||
|
export default Vue.extend({
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
name: '',
|
||||||
|
url: '',
|
||||||
|
aliases: '',
|
||||||
|
emojis: []
|
||||||
|
};
|
||||||
|
},
|
||||||
|
|
||||||
|
mounted() {
|
||||||
|
this.fetchEmojis();
|
||||||
|
},
|
||||||
|
|
||||||
|
methods: {
|
||||||
|
add() {
|
||||||
|
(this as any).api('admin/emoji/add', {
|
||||||
|
name: this.name,
|
||||||
|
url: this.url,
|
||||||
|
aliases: this.aliases.split(' ').filter(x => x.length > 0)
|
||||||
|
}).then(() => {
|
||||||
|
this.$swal({
|
||||||
|
type: 'success',
|
||||||
|
text: '%i18n:@add-emoji.added%'
|
||||||
|
});
|
||||||
|
this.fetchEmojis();
|
||||||
|
}).catch(e => {
|
||||||
|
this.$swal({
|
||||||
|
type: 'error',
|
||||||
|
text: e
|
||||||
|
});
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
fetchEmojis() {
|
||||||
|
(this as any).api('admin/emoji/list').then(emojis => {
|
||||||
|
emojis.reverse();
|
||||||
|
emojis.forEach(e => e.aliases = (e.aliases || []).join(' '));
|
||||||
|
this.emojis = emojis;
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
updateEmoji(emoji) {
|
||||||
|
(this as any).api('admin/emoji/update', {
|
||||||
|
id: emoji.id,
|
||||||
|
name: emoji.name,
|
||||||
|
url: emoji.url,
|
||||||
|
aliases: emoji.aliases.split(' ').filter(x => x.length > 0)
|
||||||
|
}).then(() => {
|
||||||
|
this.$swal({
|
||||||
|
type: 'success',
|
||||||
|
text: '%i18n:@updated%'
|
||||||
|
});
|
||||||
|
}).catch(e => {
|
||||||
|
this.$swal({
|
||||||
|
type: 'error',
|
||||||
|
text: e
|
||||||
|
});
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
removeEmoji(emoji) {
|
||||||
|
this.$swal({
|
||||||
|
type: 'warning',
|
||||||
|
text: '%i18n:@remove-emoji.are-you-sure%'.replace('$1', emoji.name),
|
||||||
|
showCancelButton: true
|
||||||
|
}).then(res => {
|
||||||
|
if (!res.value) return;
|
||||||
|
|
||||||
|
(this as any).api('admin/emoji/remove', {
|
||||||
|
id: emoji.id
|
||||||
|
}).then(() => {
|
||||||
|
this.$swal({
|
||||||
|
type: 'success',
|
||||||
|
text: '%i18n:@remove-emoji.removed%'
|
||||||
|
});
|
||||||
|
this.fetchEmojis();
|
||||||
|
}).catch(e => {
|
||||||
|
this.$swal({
|
||||||
|
type: 'error',
|
||||||
|
text: e
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="stylus" scoped>
|
||||||
|
.tumhkfkmgtvzljezfvmgkeurkfncshbe
|
||||||
|
@media (min-width 500px)
|
||||||
|
padding 16px
|
||||||
|
|
||||||
|
</style>
|
@ -1,8 +1,12 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="jdnqwkzlnxcfftthoybjxrebyolvoucw mk-admin-card">
|
<div>
|
||||||
<header>%i18n:@hided-tags%</header>
|
<ui-card>
|
||||||
<textarea v-model="hidedTags"></textarea>
|
<div slot="title">%i18n:@hided-tags%</div>
|
||||||
<button class="ui" @click="save">%i18n:@save%</button>
|
<section>
|
||||||
|
<textarea class="jdnqwkzlnxcfftthoybjxrebyolvoucw" v-model="hidedTags"></textarea>
|
||||||
|
<ui-button @click="save">%i18n:@save%</ui-button>
|
||||||
|
</section>
|
||||||
|
</ui-card>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
@ -25,9 +29,9 @@ export default Vue.extend({
|
|||||||
(this as any).api('admin/update-meta', {
|
(this as any).api('admin/update-meta', {
|
||||||
hidedTags: this.hidedTags.split('\n')
|
hidedTags: this.hidedTags.split('\n')
|
||||||
}).then(() => {
|
}).then(() => {
|
||||||
(this as any).os.apis.dialog({ text: `Saved` });
|
//(this as any).os.apis.dialog({ text: `Saved` });
|
||||||
}).catch(e => {
|
}).catch(e => {
|
||||||
(this as any).os.apis.dialog({ text: `Failed ${e}` });
|
//(this as any).os.apis.dialog({ text: `Failed ${e}` });
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -35,10 +39,7 @@ export default Vue.extend({
|
|||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="stylus" scoped>
|
<style lang="stylus" scoped>
|
||||||
|
|
||||||
|
|
||||||
.jdnqwkzlnxcfftthoybjxrebyolvoucw
|
.jdnqwkzlnxcfftthoybjxrebyolvoucw
|
||||||
textarea
|
|
||||||
width 100%
|
width 100%
|
||||||
min-height 300px
|
min-height 300px
|
||||||
|
|
260
src/client/app/admin/views/index.vue
Normal file
260
src/client/app/admin/views/index.vue
Normal file
@ -0,0 +1,260 @@
|
|||||||
|
<template>
|
||||||
|
<div class="mk-admin" :class="{ isMobile }">
|
||||||
|
<header v-show="isMobile">
|
||||||
|
<button class="nav" @click="navOpend = true"><fa icon="bars"/></button>
|
||||||
|
<span>MisskeyMyAdmin</span>
|
||||||
|
</header>
|
||||||
|
<div class="nav-backdrop"
|
||||||
|
v-if="navOpend && isMobile"
|
||||||
|
@click="navOpend = false"
|
||||||
|
@touchstart="navOpend = false"
|
||||||
|
></div>
|
||||||
|
<nav v-show="navOpend">
|
||||||
|
<div class="mi">
|
||||||
|
<img svg-inline src="../assets/header-icon.svg"/>
|
||||||
|
</div>
|
||||||
|
<div class="me">
|
||||||
|
<img class="avatar" :src="$store.state.i.avatarUrl" alt="avatar"/>
|
||||||
|
<p class="name">{{ $store.state.i | userName }}</p>
|
||||||
|
</div>
|
||||||
|
<ul>
|
||||||
|
<li @click="nav('dashboard')" :class="{ active: page == 'dashboard' }"><fa icon="home" fixed-width/>%i18n:@dashboard%</li>
|
||||||
|
<li @click="nav('instance')" :class="{ active: page == 'instance' }"><fa icon="cog" fixed-width/>%i18n:@instance%</li>
|
||||||
|
<li @click="nav('users')" :class="{ active: page == 'users' }"><fa icon="users" fixed-width/>%i18n:@users%</li>
|
||||||
|
<li @click="nav('emoji')" :class="{ active: page == 'emoji' }"><fa :icon="['far', 'grin']" fixed-width/>%i18n:@emoji%</li>
|
||||||
|
<li @click="nav('announcements')" :class="{ active: page == 'announcements' }"><fa icon="broadcast-tower" fixed-width/>%i18n:@announcements%</li>
|
||||||
|
<li @click="nav('hashtags')" :class="{ active: page == 'hashtags' }"><fa icon="hashtag" fixed-width/>%i18n:@hashtags%</li>
|
||||||
|
|
||||||
|
<!-- <li @click="nav('drive')" :class="{ active: page == 'drive' }"><fa icon="cloud" fixed-width/>%i18n:common.drive%</li> -->
|
||||||
|
<!-- <li @click="nav('update')" :class="{ active: page == 'update' }">%i18n:@update%</li> -->
|
||||||
|
</ul>
|
||||||
|
<div class="back-to-misskey">
|
||||||
|
<a href="/"><fa icon="arrow-left"/> %i18n:@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>
|
||||||
|
</main>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts">
|
||||||
|
import Vue from "vue";
|
||||||
|
import { version } from '../../config';
|
||||||
|
import XDashboard from "./dashboard.vue";
|
||||||
|
import XInstance from "./instance.vue";
|
||||||
|
import XEmoji from "./emoji.vue";
|
||||||
|
import XAnnouncements from "./announcements.vue";
|
||||||
|
import XHashtags from "./hashtags.vue";
|
||||||
|
import XUsers from "./users.vue";
|
||||||
|
|
||||||
|
// Detect the user agent
|
||||||
|
const ua = navigator.userAgent.toLowerCase();
|
||||||
|
const isMobile = /mobile|iphone|ipad|android/.test(ua);
|
||||||
|
|
||||||
|
export default Vue.extend({
|
||||||
|
components: {
|
||||||
|
XDashboard,
|
||||||
|
XInstance,
|
||||||
|
XEmoji,
|
||||||
|
XAnnouncements,
|
||||||
|
XHashtags,
|
||||||
|
XUsers
|
||||||
|
},
|
||||||
|
provide: {
|
||||||
|
isMobile
|
||||||
|
},
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
page: 'dashboard',
|
||||||
|
version,
|
||||||
|
isMobile,
|
||||||
|
navOpend: !isMobile
|
||||||
|
};
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
nav(page: string) {
|
||||||
|
this.page = page;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="stylus">
|
||||||
|
.mk-admin
|
||||||
|
$headerHeight = 48px
|
||||||
|
|
||||||
|
display flex
|
||||||
|
height 100%
|
||||||
|
|
||||||
|
> header
|
||||||
|
position fixed
|
||||||
|
top 0
|
||||||
|
z-index 10000
|
||||||
|
width 100%
|
||||||
|
color var(--mobileHeaderFg)
|
||||||
|
background-color var(--mobileHeaderBg)
|
||||||
|
box-shadow 0 1px 0 rgba(#000, 0.075)
|
||||||
|
|
||||||
|
&, *
|
||||||
|
user-select none
|
||||||
|
|
||||||
|
> span
|
||||||
|
display block
|
||||||
|
line-height $headerHeight
|
||||||
|
text-align center
|
||||||
|
|
||||||
|
> .nav
|
||||||
|
display block
|
||||||
|
position absolute
|
||||||
|
top 0
|
||||||
|
left 0
|
||||||
|
z-index 10001
|
||||||
|
padding 0
|
||||||
|
width $headerHeight
|
||||||
|
font-size 1.4em
|
||||||
|
line-height $headerHeight
|
||||||
|
border-right solid 1px rgba(#000, 0.1)
|
||||||
|
|
||||||
|
> [data-icon]
|
||||||
|
transition all 0.2s ease
|
||||||
|
|
||||||
|
> nav
|
||||||
|
position fixed
|
||||||
|
z-index 20001
|
||||||
|
top 0
|
||||||
|
left 0
|
||||||
|
width 250px
|
||||||
|
height 100vh
|
||||||
|
overflow auto
|
||||||
|
background #333
|
||||||
|
color #fff
|
||||||
|
|
||||||
|
> .mi
|
||||||
|
text-align center
|
||||||
|
|
||||||
|
> svg
|
||||||
|
width 24px
|
||||||
|
height 82px
|
||||||
|
vertical-align top
|
||||||
|
fill #fff
|
||||||
|
opacity 0.7
|
||||||
|
|
||||||
|
> .me
|
||||||
|
display flex
|
||||||
|
margin 0 16px 16px 16px
|
||||||
|
padding 16px 0
|
||||||
|
align-items center
|
||||||
|
border-top solid 1px #555
|
||||||
|
border-bottom solid 1px #555
|
||||||
|
|
||||||
|
> .avatar
|
||||||
|
height 48px
|
||||||
|
border-radius 100%
|
||||||
|
vertical-align middle
|
||||||
|
|
||||||
|
> .name
|
||||||
|
margin 0 16px
|
||||||
|
padding 0
|
||||||
|
color #fff
|
||||||
|
overflow hidden
|
||||||
|
text-overflow ellipsis
|
||||||
|
white-space nowrap
|
||||||
|
font-size 15px
|
||||||
|
|
||||||
|
> .back-to-misskey
|
||||||
|
margin 16px 16px 0 16px
|
||||||
|
padding 0
|
||||||
|
border-top solid 1px #555
|
||||||
|
|
||||||
|
> a
|
||||||
|
display block
|
||||||
|
padding 16px 4px
|
||||||
|
color inherit
|
||||||
|
text-decoration none
|
||||||
|
color #eee
|
||||||
|
font-size 15px
|
||||||
|
|
||||||
|
&:hover
|
||||||
|
color #fff
|
||||||
|
|
||||||
|
> [data-icon]
|
||||||
|
margin-right 6px
|
||||||
|
|
||||||
|
> .version
|
||||||
|
margin 0 16px 16px 16px
|
||||||
|
padding-top 16px
|
||||||
|
border-top solid 1px #555
|
||||||
|
text-align center
|
||||||
|
|
||||||
|
> small
|
||||||
|
opacity 0.7
|
||||||
|
|
||||||
|
> ul
|
||||||
|
margin 0
|
||||||
|
padding 0
|
||||||
|
list-style none
|
||||||
|
font-size 15px
|
||||||
|
|
||||||
|
> li
|
||||||
|
display block
|
||||||
|
padding 10px 16px
|
||||||
|
margin 0
|
||||||
|
cursor pointer
|
||||||
|
user-select none
|
||||||
|
color #eee
|
||||||
|
transition margin-left 0.2s ease
|
||||||
|
|
||||||
|
&:hover
|
||||||
|
color #fff
|
||||||
|
|
||||||
|
> [data-icon]
|
||||||
|
margin-right 6px
|
||||||
|
|
||||||
|
&.active
|
||||||
|
margin-left 8px
|
||||||
|
color var(--primary) !important
|
||||||
|
|
||||||
|
&:after
|
||||||
|
content ""
|
||||||
|
display block
|
||||||
|
position absolute
|
||||||
|
top 0
|
||||||
|
right 0
|
||||||
|
bottom 0
|
||||||
|
margin auto 0
|
||||||
|
height 0
|
||||||
|
border-top solid 16px transparent
|
||||||
|
border-right solid 16px var(--bg)
|
||||||
|
border-bottom solid 16px transparent
|
||||||
|
border-left solid 16px transparent
|
||||||
|
|
||||||
|
> .nav-backdrop
|
||||||
|
position fixed
|
||||||
|
top 0
|
||||||
|
left 0
|
||||||
|
z-index 20000
|
||||||
|
width 100%
|
||||||
|
height 100%
|
||||||
|
background var(--mobileNavBackdrop)
|
||||||
|
|
||||||
|
> main
|
||||||
|
width 100%
|
||||||
|
padding 0 0 0 250px
|
||||||
|
max-width 1300px
|
||||||
|
|
||||||
|
&.isMobile
|
||||||
|
> main
|
||||||
|
padding $headerHeight 0 0 0
|
||||||
|
|
||||||
|
</style>
|
117
src/client/app/admin/views/instance.vue
Normal file
117
src/client/app/admin/views/instance.vue
Normal file
@ -0,0 +1,117 @@
|
|||||||
|
<template>
|
||||||
|
<div class="axbwjelsbymowqjyywpirzhdlszoncqs">
|
||||||
|
<ui-card>
|
||||||
|
<div slot="title"><fa icon="cog"/> %i18n:@instance%</div>
|
||||||
|
<section class="fit-top fit-bottom">
|
||||||
|
<ui-input v-model="name">%i18n:@instance-name%</ui-input>
|
||||||
|
<ui-textarea v-model="description">%i18n:@instance-description%</ui-textarea>
|
||||||
|
<ui-input v-model="bannerUrl"><i slot="icon"><fa icon="link"/></i>%i18n:@banner-url%</ui-input>
|
||||||
|
</section>
|
||||||
|
<section class="fit-top fit-bottom">
|
||||||
|
<ui-input v-model="maxNoteTextLength">%i18n:@max-note-text-length%</ui-input>
|
||||||
|
</section>
|
||||||
|
<section class="fit-bottom">
|
||||||
|
<header><fa icon="cloud"/> %i18n:@drive-config%</header>
|
||||||
|
<ui-switch v-model="cacheRemoteFiles">%i18n:@cache-remote-files%<span slot="desc">%i18n:@cache-remote-files-desc%</span></ui-switch>
|
||||||
|
<ui-input v-model="localDriveCapacityMb">%i18n:@local-drive-capacity-mb%<span slot="text">%i18n:@mb%</span><span slot="suffix">MB</span></ui-input>
|
||||||
|
<ui-input v-model="remoteDriveCapacityMb" :disabled="!cacheRemoteFiles">%i18n:@remote-drive-capacity-mb%<span slot="text">%i18n:@mb%</span><span slot="suffix">MB</span></ui-input>
|
||||||
|
</section>
|
||||||
|
<section>
|
||||||
|
<ui-button @click="updateMeta">%i18n:@save%</ui-button>
|
||||||
|
</section>
|
||||||
|
</ui-card>
|
||||||
|
|
||||||
|
<ui-card>
|
||||||
|
<div slot="title">%i18n:@disable-registration%</div>
|
||||||
|
<section>
|
||||||
|
<input type="checkbox" v-model="disableRegistration" @change="updateMeta">
|
||||||
|
<button class="ui" @click="invite">%i18n:@invite%</button>
|
||||||
|
<p v-if="inviteCode">Code: <code>{{ inviteCode }}</code></p>
|
||||||
|
</section>
|
||||||
|
</ui-card>
|
||||||
|
|
||||||
|
<ui-card>
|
||||||
|
<div slot="title">%i18n:@disable-local-timeline%</div>
|
||||||
|
<section>
|
||||||
|
<input type="checkbox" v-model="disableLocalTimeline" @change="updateMeta">
|
||||||
|
</section>
|
||||||
|
</ui-card>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts">
|
||||||
|
import Vue from "vue";
|
||||||
|
|
||||||
|
export default Vue.extend({
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
disableRegistration: false,
|
||||||
|
disableLocalTimeline: false,
|
||||||
|
bannerUrl: null,
|
||||||
|
name: null,
|
||||||
|
description: null,
|
||||||
|
cacheRemoteFiles: false,
|
||||||
|
localDriveCapacityMb: null,
|
||||||
|
remoteDriveCapacityMb: null,
|
||||||
|
maxNoteTextLength: null,
|
||||||
|
inviteCode: null,
|
||||||
|
};
|
||||||
|
},
|
||||||
|
|
||||||
|
created() {
|
||||||
|
(this as any).os.getMeta().then(meta => {
|
||||||
|
this.bannerUrl = meta.bannerUrl;
|
||||||
|
this.name = meta.name;
|
||||||
|
this.description = meta.description;
|
||||||
|
this.cacheRemoteFiles = meta.cacheRemoteFiles;
|
||||||
|
this.localDriveCapacityMb = meta.driveCapacityPerLocalUserMb;
|
||||||
|
this.remoteDriveCapacityMb = meta.driveCapacityPerRemoteUserMb;
|
||||||
|
this.maxNoteTextLength = meta.maxNoteTextLength;
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
methods: {
|
||||||
|
invite() {
|
||||||
|
(this as any).api('admin/invite').then(x => {
|
||||||
|
this.inviteCode = x.code;
|
||||||
|
}).catch(e => {
|
||||||
|
this.$swal({
|
||||||
|
type: 'error',
|
||||||
|
text: e
|
||||||
|
});
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
updateMeta() {
|
||||||
|
(this as any).api('admin/update-meta', {
|
||||||
|
disableRegistration: this.disableRegistration,
|
||||||
|
disableLocalTimeline: this.disableLocalTimeline,
|
||||||
|
bannerUrl: this.bannerUrl,
|
||||||
|
name: this.name,
|
||||||
|
description: this.description,
|
||||||
|
cacheRemoteFiles: this.cacheRemoteFiles,
|
||||||
|
localDriveCapacityMb: parseInt(this.localDriveCapacityMb, 10),
|
||||||
|
remoteDriveCapacityMb: parseInt(this.remoteDriveCapacityMb, 10),
|
||||||
|
maxNoteTextLength: parseInt(this.maxNoteTextLength, 10)
|
||||||
|
}).then(() => {
|
||||||
|
this.$swal({
|
||||||
|
type: 'success',
|
||||||
|
text: '%i18n:@saved%'
|
||||||
|
});
|
||||||
|
}).catch(e => {
|
||||||
|
this.$swal({
|
||||||
|
type: 'error',
|
||||||
|
text: e
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="stylus" scoped>
|
||||||
|
.axbwjelsbymowqjyywpirzhdlszoncqs
|
||||||
|
@media (min-width 500px)
|
||||||
|
padding 16px
|
||||||
|
|
||||||
|
</style>
|
136
src/client/app/admin/views/users.vue
Normal file
136
src/client/app/admin/views/users.vue
Normal file
@ -0,0 +1,136 @@
|
|||||||
|
<template>
|
||||||
|
<div class="ucnffhbtogqgscfmqcymwmmupoknpfsw">
|
||||||
|
<ui-card>
|
||||||
|
<div slot="title">%i18n:@verify-user%</div>
|
||||||
|
<section class="fit-top">
|
||||||
|
<ui-input v-model="verifyUsername" type="text">
|
||||||
|
<span slot="prefix">@</span>
|
||||||
|
</ui-input>
|
||||||
|
<ui-button @click="verifyUser" :disabled="verifying">%i18n:@verify%</ui-button>
|
||||||
|
</section>
|
||||||
|
</ui-card>
|
||||||
|
|
||||||
|
<ui-card>
|
||||||
|
<div slot="title">%i18n:@unverify-user%</div>
|
||||||
|
<section class="fit-top">
|
||||||
|
<ui-input v-model="unverifyUsername" type="text">
|
||||||
|
<span slot="prefix">@</span>
|
||||||
|
</ui-input>
|
||||||
|
<ui-button @click="unverifyUser" :disabled="unverifying">%i18n:@unverify%</ui-button>
|
||||||
|
</section>
|
||||||
|
</ui-card>
|
||||||
|
|
||||||
|
<ui-card>
|
||||||
|
<div slot="title">%i18n:@suspend-user%</div>
|
||||||
|
<section class="fit-top">
|
||||||
|
<ui-input v-model="suspendUsername" type="text">
|
||||||
|
<span slot="prefix">@</span>
|
||||||
|
</ui-input>
|
||||||
|
<ui-button @click="suspendUser" :disabled="suspending">%i18n:@suspend%</ui-button>
|
||||||
|
</section>
|
||||||
|
</ui-card>
|
||||||
|
|
||||||
|
<ui-card>
|
||||||
|
<div slot="title">%i18n:@unsuspend-user%</div>
|
||||||
|
<section class="fit-top">
|
||||||
|
<ui-input v-model="unsuspendUsername" type="text">
|
||||||
|
<span slot="prefix">@</span>
|
||||||
|
</ui-input>
|
||||||
|
<ui-button @click="unsuspendUser" :disabled="unsuspending">%i18n:@unsuspend%</ui-button>
|
||||||
|
</section>
|
||||||
|
</ui-card>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts">
|
||||||
|
import Vue from "vue";
|
||||||
|
import parseAcct from "../../../../misc/acct/parse";
|
||||||
|
|
||||||
|
export default Vue.extend({
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
verifyUsername: null,
|
||||||
|
verifying: false,
|
||||||
|
unverifyUsername: null,
|
||||||
|
unverifying: false,
|
||||||
|
suspendUsername: null,
|
||||||
|
suspending: false,
|
||||||
|
unsuspendUsername: null,
|
||||||
|
unsuspending: false
|
||||||
|
};
|
||||||
|
},
|
||||||
|
|
||||||
|
methods: {
|
||||||
|
async verifyUser() {
|
||||||
|
this.verifying = true;
|
||||||
|
|
||||||
|
const process = async () => {
|
||||||
|
const user = await (this as any).os.api('users/show', parseAcct(this.verifyUsername));
|
||||||
|
await (this as any).os.api('admin/verify-user', { userId: user.id });
|
||||||
|
//(this as any).os.apis.dialog({ text: '%i18n:@verified%' });
|
||||||
|
};
|
||||||
|
|
||||||
|
await process().catch(e => {
|
||||||
|
//(this as any).os.apis.dialog({ text: `Failed: ${e}` });
|
||||||
|
});
|
||||||
|
|
||||||
|
this.verifying = false;
|
||||||
|
},
|
||||||
|
|
||||||
|
async unverifyUser() {
|
||||||
|
this.unverifying = true;
|
||||||
|
|
||||||
|
const process = async () => {
|
||||||
|
const user = await (this as any).os.api('users/show', parseAcct(this.unverifyUsername));
|
||||||
|
await (this as any).os.api('admin/unverify-user', { userId: user.id });
|
||||||
|
//(this as any).os.apis.dialog({ text: '%i18n:@unverified%' });
|
||||||
|
};
|
||||||
|
|
||||||
|
await process().catch(e => {
|
||||||
|
//(this as any).os.apis.dialog({ text: `Failed: ${e}` });
|
||||||
|
});
|
||||||
|
|
||||||
|
this.unverifying = false;
|
||||||
|
},
|
||||||
|
|
||||||
|
async suspendUser() {
|
||||||
|
this.suspending = true;
|
||||||
|
|
||||||
|
const process = async () => {
|
||||||
|
const user = await (this as any).os.api('users/show', parseAcct(this.suspendUsername));
|
||||||
|
await (this as any).os.api('admin/suspend-user', { userId: user.id });
|
||||||
|
//(this as any).os.apis.dialog({ text: '%i18n:@suspended%' });
|
||||||
|
};
|
||||||
|
|
||||||
|
await process().catch(e => {
|
||||||
|
//(this as any).os.apis.dialog({ text: `Failed: ${e}` });
|
||||||
|
});
|
||||||
|
|
||||||
|
this.suspending = false;
|
||||||
|
},
|
||||||
|
|
||||||
|
async unsuspendUser() {
|
||||||
|
this.unsuspending = true;
|
||||||
|
|
||||||
|
const process = async () => {
|
||||||
|
const user = await (this as any).os.api('users/show', parseAcct(this.unsuspendUsername));
|
||||||
|
await (this as any).os.api('admin/unsuspend-user', { userId: user.id });
|
||||||
|
//(this as any).os.apis.dialog({ text: '%i18n:@unsuspended%' });
|
||||||
|
};
|
||||||
|
|
||||||
|
await process().catch(e => {
|
||||||
|
//(this as any).os.apis.dialog({ text: `Failed: ${e}` });
|
||||||
|
});
|
||||||
|
|
||||||
|
this.unsuspending = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="stylus" scoped>
|
||||||
|
.ucnffhbtogqgscfmqcymwmmupoknpfsw
|
||||||
|
@media (min-width 500px)
|
||||||
|
padding 16px
|
||||||
|
|
||||||
|
</style>
|
@ -128,7 +128,7 @@ pre
|
|||||||
overflow auto
|
overflow auto
|
||||||
tab-size 2
|
tab-size 2
|
||||||
|
|
||||||
[data-fa]
|
[data-icon]
|
||||||
display inline-block
|
display inline-block
|
||||||
|
|
||||||
.swal2-container
|
.swal2-container
|
||||||
|
@ -46,6 +46,7 @@
|
|||||||
if (`${url.pathname}/`.startsWith('/docs/')) app = 'docs';
|
if (`${url.pathname}/`.startsWith('/docs/')) app = 'docs';
|
||||||
if (`${url.pathname}/`.startsWith('/dev/')) app = 'dev';
|
if (`${url.pathname}/`.startsWith('/dev/')) app = 'dev';
|
||||||
if (`${url.pathname}/`.startsWith('/auth/')) app = 'auth';
|
if (`${url.pathname}/`.startsWith('/auth/')) app = 'auth';
|
||||||
|
if (`${url.pathname}/`.startsWith('/admin/')) app = 'admin';
|
||||||
//#endregion
|
//#endregion
|
||||||
|
|
||||||
//#region Detect the user language
|
//#region Detect the user language
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
import MiOS from '../../mios';
|
import MiOS from '../../mios';
|
||||||
import { version as current } from '../../config';
|
import { clientVersion as current } from '../../config';
|
||||||
|
|
||||||
export default async function(mios: MiOS, force = false, silent = false) {
|
export default async function(mios: MiOS, force = false, silent = false) {
|
||||||
const meta = await mios.getMeta(force);
|
const meta = await mios.getMeta(force);
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
<template>
|
<template>
|
||||||
<ui-card>
|
<ui-card>
|
||||||
<div slot="title">%fa:key% API</div>
|
<div slot="title"><fa icon="key"/> API</div>
|
||||||
|
|
||||||
<section class="fit-top">
|
<section class="fit-top">
|
||||||
<ui-input :value="$store.state.i.token" readonly>
|
<ui-input :value="$store.state.i.token" readonly>
|
||||||
@ -9,11 +9,11 @@
|
|||||||
<p>%i18n:@intro%</p>
|
<p>%i18n:@intro%</p>
|
||||||
<ui-info warn>%i18n:@caution%</ui-info>
|
<ui-info warn>%i18n:@caution%</ui-info>
|
||||||
<p>%i18n:@regeneration-of-token%</p>
|
<p>%i18n:@regeneration-of-token%</p>
|
||||||
<ui-button @click="regenerateToken">%fa:sync-alt% %i18n:@regenerate-token%</ui-button>
|
<ui-button @click="regenerateToken"><fa icon="sync-alt"/> %i18n:@regenerate-token%</ui-button>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
<section>
|
<section>
|
||||||
<header>%fa:terminal% %i18n:@console.title%</header>
|
<header><fa icon="terminal"/> %i18n:@console.title%</header>
|
||||||
<ui-input v-model="endpoint">
|
<ui-input v-model="endpoint">
|
||||||
<span>%i18n:@console.endpoint%</span>
|
<span>%i18n:@console.endpoint%</span>
|
||||||
</ui-input>
|
</ui-input>
|
||||||
@ -22,7 +22,7 @@
|
|||||||
</ui-textarea>
|
</ui-textarea>
|
||||||
<ui-button @click="send" :disabled="sending">
|
<ui-button @click="send" :disabled="sending">
|
||||||
<template v-if="sending">%i18n:@console.sending%</template>
|
<template v-if="sending">%i18n:@console.sending%</template>
|
||||||
<template v-else>%fa:paper-plane% %i18n:@console.send%</template>
|
<template v-else><fa icon="paper-plane"/> %i18n:@console.send%</template>
|
||||||
</ui-button>
|
</ui-button>
|
||||||
<ui-textarea v-if="res" v-model="res" readonly tall>
|
<ui-textarea v-if="res" v-model="res" readonly tall>
|
||||||
<span>%i18n:@console.response%</span>
|
<span>%i18n:@console.response%</span>
|
||||||
|
@ -14,10 +14,11 @@
|
|||||||
</ol>
|
</ol>
|
||||||
<ol class="emojis" ref="suggests" v-if="emojis.length > 0">
|
<ol class="emojis" ref="suggests" v-if="emojis.length > 0">
|
||||||
<li v-for="emoji in emojis" @click="complete(type, emoji.emoji)" @keydown="onKeydown" tabindex="-1">
|
<li v-for="emoji in emojis" @click="complete(type, emoji.emoji)" @keydown="onKeydown" tabindex="-1">
|
||||||
<span class="emoji" v-if="emoji.url"><img :src="emoji.url" :alt="emoji.emoji"/></span>
|
<span class="emoji" v-if="emoji.isCustomEmoji"><img :src="emoji.url" :alt="emoji.emoji"/></span>
|
||||||
|
<span class="emoji" v-else-if="!useOsDefaultEmojis"><img :src="emoji.url" :alt="emoji.emoji"/></span>
|
||||||
<span class="emoji" v-else>{{ emoji.emoji }}</span>
|
<span class="emoji" v-else>{{ emoji.emoji }}</span>
|
||||||
<span class="name" v-html="emoji.name.replace(q, `<b>${q}</b>`)"></span>
|
<span class="name" v-html="emoji.name.replace(q, `<b>${q}</b>`)"></span>
|
||||||
<span class="alias" v-if="emoji.alias">({{ emoji.alias }})</span>
|
<span class="alias" v-if="emoji.aliasOf">({{ emoji.aliasOf }})</span>
|
||||||
</li>
|
</li>
|
||||||
</ol>
|
</ol>
|
||||||
</div>
|
</div>
|
||||||
@ -28,14 +29,23 @@ import Vue from 'vue';
|
|||||||
import * as emojilib from 'emojilib';
|
import * as emojilib from 'emojilib';
|
||||||
import contains from '../../../common/scripts/contains';
|
import contains from '../../../common/scripts/contains';
|
||||||
|
|
||||||
|
type EmojiDef = {
|
||||||
|
emoji: string;
|
||||||
|
name: string;
|
||||||
|
aliasOf?: string;
|
||||||
|
url?: string;
|
||||||
|
isCustomEmoji?: boolean;
|
||||||
|
};
|
||||||
|
|
||||||
const lib = Object.entries(emojilib.lib).filter((x: any) => {
|
const lib = Object.entries(emojilib.lib).filter((x: any) => {
|
||||||
return x[1].category != 'flags';
|
return x[1].category != 'flags';
|
||||||
});
|
});
|
||||||
|
|
||||||
const emjdb = lib.map((x: any) => ({
|
const emjdb: EmojiDef[] = lib.map((x: any) => ({
|
||||||
emoji: x[1].char,
|
emoji: x[1].char,
|
||||||
name: x[0],
|
name: x[0],
|
||||||
alias: null
|
aliasOf: null,
|
||||||
|
url: `https://twemoji.maxcdn.com/2/svg/${x[1].char.codePointAt(0).toString(16)}.svg`
|
||||||
}));
|
}));
|
||||||
|
|
||||||
lib.forEach((x: any) => {
|
lib.forEach((x: any) => {
|
||||||
@ -44,7 +54,8 @@ lib.forEach((x: any) => {
|
|||||||
emjdb.push({
|
emjdb.push({
|
||||||
emoji: x[1].char,
|
emoji: x[1].char,
|
||||||
name: k,
|
name: k,
|
||||||
alias: x[0]
|
aliasOf: x[0],
|
||||||
|
url: `https://twemoji.maxcdn.com/2/svg/${x[1].char.codePointAt(0).toString(16)}.svg`
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -62,13 +73,18 @@ export default Vue.extend({
|
|||||||
hashtags: [],
|
hashtags: [],
|
||||||
emojis: [],
|
emojis: [],
|
||||||
select: -1,
|
select: -1,
|
||||||
emojilib
|
emojilib,
|
||||||
|
emojiDb: [] as EmojiDef[]
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
computed: {
|
computed: {
|
||||||
items(): HTMLCollection {
|
items(): HTMLCollection {
|
||||||
return (this.$refs.suggests as Element).children;
|
return (this.$refs.suggests as Element).children;
|
||||||
|
},
|
||||||
|
|
||||||
|
useOsDefaultEmojis(): boolean {
|
||||||
|
return this.$store.state.device.useOsDefaultEmojis;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -91,6 +107,36 @@ export default Vue.extend({
|
|||||||
},
|
},
|
||||||
|
|
||||||
mounted() {
|
mounted() {
|
||||||
|
//#region Construct Emoji DB
|
||||||
|
const customEmojis = (this.os.getMetaSync() || { emojis: [] }).emojis || [];
|
||||||
|
const emojiDefinitions: EmojiDef[] = [];
|
||||||
|
|
||||||
|
customEmojis.forEach(x => {
|
||||||
|
emojiDefinitions.push({
|
||||||
|
name: x.name,
|
||||||
|
emoji: `:${x.name}:`,
|
||||||
|
url: x.url,
|
||||||
|
isCustomEmoji: true
|
||||||
|
});
|
||||||
|
|
||||||
|
if (x.aliases) {
|
||||||
|
x.aliases.forEach(alias => {
|
||||||
|
emojiDefinitions.push({
|
||||||
|
name: alias,
|
||||||
|
aliasOf: x.name,
|
||||||
|
emoji: `:${x.name}:`,
|
||||||
|
url: x.url,
|
||||||
|
isCustomEmoji: true
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
emojiDefinitions.sort((a, b) => a.name.length - b.name.length);
|
||||||
|
|
||||||
|
this.emojiDb = emojiDefinitions.concat(emjdb);
|
||||||
|
//#endregion
|
||||||
|
|
||||||
this.textarea.addEventListener('keydown', this.onKeydown);
|
this.textarea.addEventListener('keydown', this.onKeydown);
|
||||||
|
|
||||||
Array.from(document.querySelectorAll('body *')).forEach(el => {
|
Array.from(document.querySelectorAll('body *')).forEach(el => {
|
||||||
@ -169,42 +215,31 @@ export default Vue.extend({
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if (this.type == 'emoji') {
|
} else if (this.type == 'emoji') {
|
||||||
|
if (this.q == null || this.q == '') {
|
||||||
|
this.emojis = this.emojiDb.filter(x => x.isCustomEmoji && !x.aliasOf).sort((a, b) => {
|
||||||
|
var textA = a.name.toUpperCase();
|
||||||
|
var textB = b.name.toUpperCase();
|
||||||
|
return (textA < textB) ? -1 : (textA > textB) ? 1 : 0;
|
||||||
|
});
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
const matched = [];
|
const matched = [];
|
||||||
const max = 30;
|
const max = 30;
|
||||||
|
|
||||||
const customEmojis = (this.os.getMetaSync() || { emojis: [] }).emojis;
|
this.emojiDb.some(x => {
|
||||||
customEmojis.some(x => {
|
if (x.name.startsWith(this.q) && !x.aliasOf && !matched.some(y => y.emoji == x.emoji)) matched.push(x);
|
||||||
if (x.name.startsWith(this.q)) matched.push({
|
|
||||||
name: x.name,
|
|
||||||
emoji: `:${x.name}:`,
|
|
||||||
url: x.url
|
|
||||||
});
|
|
||||||
return matched.length == max;
|
|
||||||
});
|
|
||||||
customEmojis.some(x => {
|
|
||||||
const alias = (x.aliases || []).find(a => a.startsWith(this.q));
|
|
||||||
if (alias) matched.push({
|
|
||||||
alias: x.name,
|
|
||||||
name: alias,
|
|
||||||
emoji: `:${x.name}:`,
|
|
||||||
url: x.url
|
|
||||||
});
|
|
||||||
return matched.length == max;
|
|
||||||
});
|
|
||||||
|
|
||||||
emjdb.some(x => {
|
|
||||||
if (x.name.indexOf(this.q) == 0 && !x.alias && !matched.some(y => y.emoji == x.emoji)) matched.push(x);
|
|
||||||
return matched.length == max;
|
return matched.length == max;
|
||||||
});
|
});
|
||||||
if (matched.length < max) {
|
if (matched.length < max) {
|
||||||
emjdb.some(x => {
|
this.emojiDb.some(x => {
|
||||||
if (x.name.indexOf(this.q) == 0 && !matched.some(y => y.emoji == x.emoji)) matched.push(x);
|
if (x.name.startsWith(this.q) && !matched.some(y => y.emoji == x.emoji)) matched.push(x);
|
||||||
return matched.length == max;
|
return matched.length == max;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
if (matched.length < max) {
|
if (matched.length < max) {
|
||||||
emjdb.some(x => {
|
this.emojiDb.some(x => {
|
||||||
if (x.name.indexOf(this.q) > -1 && !matched.some(y => y.emoji == x.emoji)) matched.push(x);
|
if (x.name.includes(this.q) && !matched.some(y => y.emoji == x.emoji)) matched.push(x);
|
||||||
return matched.length == max;
|
return matched.length == max;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -1,35 +1,35 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="troubleshooter">
|
<div class="troubleshooter">
|
||||||
<div class="body">
|
<div class="body">
|
||||||
<h1>%fa:wrench%%i18n:@title%</h1>
|
<h1><fa icon="wrench"/>%i18n:@title%</h1>
|
||||||
<div>
|
<div>
|
||||||
<p :data-wip="network == null">
|
<p :data-wip="network == null">
|
||||||
<template v-if="network != null">
|
<template v-if="network != null">
|
||||||
<template v-if="network">%fa:check%</template>
|
<template v-if="network"><fa icon="check"/></template>
|
||||||
<template v-if="!network">%fa:times%</template>
|
<template v-if="!network"><fa icon="times"/></template>
|
||||||
</template>
|
</template>
|
||||||
{{ network == null ? '%i18n:@checking-network%' : '%i18n:@network%' }}<mk-ellipsis v-if="network == null"/>
|
{{ network == null ? '%i18n:@checking-network%' : '%i18n:@network%' }}<mk-ellipsis v-if="network == null"/>
|
||||||
</p>
|
</p>
|
||||||
<p v-if="network == true" :data-wip="internet == null">
|
<p v-if="network == true" :data-wip="internet == null">
|
||||||
<template v-if="internet != null">
|
<template v-if="internet != null">
|
||||||
<template v-if="internet">%fa:check%</template>
|
<template v-if="internet"><fa icon="check"/></template>
|
||||||
<template v-if="!internet">%fa:times%</template>
|
<template v-if="!internet"><fa icon="times"/></template>
|
||||||
</template>
|
</template>
|
||||||
{{ internet == null ? '%i18n:@checking-internet%' : '%i18n:@internet%' }}<mk-ellipsis v-if="internet == null"/>
|
{{ internet == null ? '%i18n:@checking-internet%' : '%i18n:@internet%' }}<mk-ellipsis v-if="internet == null"/>
|
||||||
</p>
|
</p>
|
||||||
<p v-if="internet == true" :data-wip="server == null">
|
<p v-if="internet == true" :data-wip="server == null">
|
||||||
<template v-if="server != null">
|
<template v-if="server != null">
|
||||||
<template v-if="server">%fa:check%</template>
|
<template v-if="server"><fa icon="check"/></template>
|
||||||
<template v-if="!server">%fa:times%</template>
|
<template v-if="!server"><fa icon="times"/></template>
|
||||||
</template>
|
</template>
|
||||||
{{ server == null ? '%i18n:@checking-server%' : '%i18n:@server%' }}<mk-ellipsis v-if="server == null"/>
|
{{ server == null ? '%i18n:@checking-server%' : '%i18n:@server%' }}<mk-ellipsis v-if="server == null"/>
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
<p v-if="!end">%i18n:@finding%<mk-ellipsis/></p>
|
<p v-if="!end">%i18n:@finding%<mk-ellipsis/></p>
|
||||||
<p v-if="network === false"><b>%fa:exclamation-triangle%%i18n:@no-network%</b><br>%i18n:@no-network-desc%</p>
|
<p v-if="network === false"><b><fa icon="exclamation-triangle"/>%i18n:@no-network%</b><br>%i18n:@no-network-desc%</p>
|
||||||
<p v-if="internet === false"><b>%fa:exclamation-triangle%%i18n:@no-internet%</b><br>%i18n:@no-internet-desc%</p>
|
<p v-if="internet === false"><b><fa icon="exclamation-triangle"/>%i18n:@no-internet%</b><br>%i18n:@no-internet-desc%</p>
|
||||||
<p v-if="server === false"><b>%fa:exclamation-triangle%%i18n:@no-server%</b><br>%i18n:@no-server-desc%</p>
|
<p v-if="server === false"><b><fa icon="exclamation-triangle"/>%i18n:@no-server%</b><br>%i18n:@no-server-desc%</p>
|
||||||
<p v-if="server === true" class="success"><b>%fa:info-circle%%i18n:@success%</b><br>%i18n:@success-desc%</p>
|
<p v-if="server === true" class="success"><b><fa icon="info-circle"/>%i18n:@success%</b><br>%i18n:@success-desc%</p>
|
||||||
</div>
|
</div>
|
||||||
<footer>
|
<footer>
|
||||||
<a href="/assets/flush.html">%i18n:@flush%</a> | <a href="/assets/version.html">%i18n:@set-version%</a>
|
<a href="/assets/flush.html">%i18n:@flush%</a> | <a href="/assets/version.html">%i18n:@set-version%</a>
|
||||||
@ -100,7 +100,7 @@ export default Vue.extend({
|
|||||||
color #444
|
color #444
|
||||||
border-bottom solid 1px #eee
|
border-bottom solid 1px #eee
|
||||||
|
|
||||||
> [data-fa]
|
> [data-icon]
|
||||||
margin-right 0.25em
|
margin-right 0.25em
|
||||||
|
|
||||||
> div
|
> div
|
||||||
@ -115,7 +115,7 @@ export default Vue.extend({
|
|||||||
&[data-wip]
|
&[data-wip]
|
||||||
color #888
|
color #888
|
||||||
|
|
||||||
> [data-fa]
|
> [data-icon]
|
||||||
margin-right 0.25em
|
margin-right 0.25em
|
||||||
|
|
||||||
&.times
|
&.times
|
||||||
@ -132,7 +132,7 @@ export default Vue.extend({
|
|||||||
border-top solid 1px #eee
|
border-top solid 1px #eee
|
||||||
|
|
||||||
> b
|
> b
|
||||||
> [data-fa]
|
> [data-icon]
|
||||||
margin-right 0.25em
|
margin-right 0.25em
|
||||||
|
|
||||||
&.success
|
&.success
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="mk-connect-failed">
|
<div class="mk-connect-failed">
|
||||||
<img src="data:image/jpeg;base64,%base64:/assets/error.jpg%" alt=""/>
|
<img src="https://raw.githubusercontent.com/syuilo/misskey/develop/src/client/assets/error.jpg" alt=""/>
|
||||||
<h1>%i18n:@title%</h1>
|
<h1>%i18n:@title%</h1>
|
||||||
<p class="text">
|
<p class="text">
|
||||||
<span>{{ '%i18n:@description%'.substr(0, '%i18n:@description%'.indexOf('{')) }}</span>
|
<span>{{ '%i18n:@description%'.substr(0, '%i18n:@description%'.indexOf('{')) }}</span>
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
<template>
|
<template>
|
||||||
<ui-card>
|
<ui-card>
|
||||||
<div slot="title">%fa:cloud% %i18n:common.drive%</div>
|
<div slot="title"><fa icon="cloud"/> %i18n:common.drive%</div>
|
||||||
|
|
||||||
<section v-if="!fetching" class="juakhbxthdewydyreaphkepoxgxvfogn">
|
<section v-if="!fetching" class="juakhbxthdewydyreaphkepoxgxvfogn">
|
||||||
<div class="meter"><div :style="meterStyle"></div></div>
|
<div class="meter"><div :style="meterStyle"></div></div>
|
||||||
|
82
src/client/app/common/views/components/emoji.vue
Normal file
82
src/client/app/common/views/components/emoji.vue
Normal file
@ -0,0 +1,82 @@
|
|||||||
|
<template>
|
||||||
|
<img v-if="customEmoji" class="fvgwvorwhxigeolkkrcderjzcawqrscl custom" :src="url" :alt="alt" :title="alt"/>
|
||||||
|
<img v-else-if="char && !useOsDefaultEmojis" class="fvgwvorwhxigeolkkrcderjzcawqrscl" :src="url" :alt="alt" :title="alt"/>
|
||||||
|
<span v-else-if="char && useOsDefaultEmojis">{{ char }}</span>
|
||||||
|
<span v-else>:{{ name }}:</span>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts">
|
||||||
|
import Vue from 'vue';
|
||||||
|
import { lib } from 'emojilib';
|
||||||
|
|
||||||
|
export default Vue.extend({
|
||||||
|
props: {
|
||||||
|
name: {
|
||||||
|
type: String,
|
||||||
|
required: false
|
||||||
|
},
|
||||||
|
emoji: {
|
||||||
|
type: String,
|
||||||
|
required: false
|
||||||
|
},
|
||||||
|
customEmojis: {
|
||||||
|
required: false,
|
||||||
|
default: []
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
url: null,
|
||||||
|
char: null,
|
||||||
|
customEmoji: null
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
computed: {
|
||||||
|
alt(): string {
|
||||||
|
return this.customEmoji ? `:${this.customEmoji.name}:` : this.char;
|
||||||
|
},
|
||||||
|
|
||||||
|
useOsDefaultEmojis(): boolean {
|
||||||
|
return this.$store.state.device.useOsDefaultEmojis;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
created() {
|
||||||
|
if (this.name) {
|
||||||
|
const customEmoji = this.customEmojis.find(x => x.name == this.name);
|
||||||
|
if (customEmoji) {
|
||||||
|
this.customEmoji = customEmoji;
|
||||||
|
this.url = customEmoji.url;
|
||||||
|
} else {
|
||||||
|
const emoji = lib[this.name];
|
||||||
|
if (emoji) {
|
||||||
|
this.char = emoji.char;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
this.char = this.emoji;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.char) {
|
||||||
|
this.url = `https://twemoji.maxcdn.com/2/svg/${this.char.codePointAt(0).toString(16)}.svg`;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="stylus" scoped>
|
||||||
|
.fvgwvorwhxigeolkkrcderjzcawqrscl
|
||||||
|
height 1.25em
|
||||||
|
vertical-align -0.25em
|
||||||
|
|
||||||
|
&.custom
|
||||||
|
height 2.5em
|
||||||
|
vertical-align middle
|
||||||
|
transition transform 0.2s ease
|
||||||
|
|
||||||
|
&:hover
|
||||||
|
transform scale(1.2)
|
||||||
|
|
||||||
|
</style>
|
@ -1,6 +1,6 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="wjqjnyhzogztorhrdgcpqlkxhkmuetgj">
|
<div class="wjqjnyhzogztorhrdgcpqlkxhkmuetgj">
|
||||||
<p>%fa:exclamation-triangle% %i18n:common.error.title%</p>
|
<p><fa icon="exclamation-triangle"/> %i18n:common.error.title%</p>
|
||||||
<ui-button @click="() => $emit('retry')">%i18n:common.error.retry%</ui-button>
|
<ui-button @click="() => $emit('retry')">%i18n:common.error.retry%</ui-button>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
<template>
|
<template>
|
||||||
<span class="mk-file-type-icon">
|
<span class="mk-file-type-icon">
|
||||||
<template v-if="kind == 'image'">%fa:file-image%</template>
|
<template v-if="kind == 'image'"><fa icon="file-image"/></template>
|
||||||
</span>
|
</span>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
<template>
|
<template>
|
||||||
<a class="a" href="https://github.com/syuilo/misskey" target="_blank" title="View source on Github">
|
<a class="a" href="https://github.com/syuilo/misskey" target="_blank" title="View source on GitHub">
|
||||||
<svg width="80" height="80" viewBox="0 0 250 250" aria-hidden="aria-hidden">
|
<svg width="80" height="80" viewBox="0 0 250 250" aria-hidden="aria-hidden">
|
||||||
<path d="M0,0 L115,115 L130,115 L142,142 L250,250 L250,0 Z"></path>
|
<path d="M0,0 L115,115 L130,115 L142,142 L250,250 L250,0 Z"></path>
|
||||||
<path class="octo-arm" d="M128.3,109.0 C113.8,99.7 119.0,89.6 119.0,89.6 C122.0,82.7 120.5,78.6 120.5,78.6 C119.2,72.0 123.4,76.3 123.4,76.3 C127.3,80.9 125.5,87.3 125.5,87.3 C122.9,97.6 130.6,101.9 134.4,103.2" fill="currentColor"></path>
|
<path class="octo-arm" d="M128.3,109.0 C113.8,99.7 119.0,89.6 119.0,89.6 C122.0,82.7 120.5,78.6 120.5,78.6 C119.2,72.0 123.4,76.3 123.4,76.3 C127.3,80.9 125.5,87.3 125.5,87.3 C122.9,97.6 130.6,101.9 134.4,103.2" fill="currentColor"></path>
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="xqnhankfuuilcwvhgsopeqncafzsquya">
|
<div class="xqnhankfuuilcwvhgsopeqncafzsquya">
|
||||||
<button class="go-index" v-if="selfNav" @click="goIndex">%fa:arrow-left%</button>
|
<button class="go-index" v-if="selfNav" @click="goIndex"><fa icon="arrow-left"/></button>
|
||||||
<header><b><router-link :to="blackUser | userPage">{{ blackUser | userName }}</router-link></b>(%i18n:common.reversi.black%) vs <b><router-link :to="whiteUser | userPage">{{ whiteUser | userName }}</router-link></b>(%i18n:common.reversi.white%)</header>
|
<header><b><router-link :to="blackUser | userPage">{{ blackUser | userName }}</router-link></b>(%i18n:common.reversi.black%) vs <b><router-link :to="whiteUser | userPage">{{ whiteUser | userName }}</router-link></b>(%i18n:common.reversi.white%)</header>
|
||||||
|
|
||||||
<div style="overflow: hidden; line-height: 28px;">
|
<div style="overflow: hidden; line-height: 28px;">
|
||||||
@ -51,13 +51,13 @@
|
|||||||
|
|
||||||
<div class="player" v-if="game.isEnded">
|
<div class="player" v-if="game.isEnded">
|
||||||
<div>
|
<div>
|
||||||
<button @click="logPos = 0" :disabled="logPos == 0">%fa:angle-double-left%</button>
|
<button @click="logPos = 0" :disabled="logPos == 0"><fa icon="angle-double-left"/></button>
|
||||||
<button @click="logPos--" :disabled="logPos == 0">%fa:angle-left%</button>
|
<button @click="logPos--" :disabled="logPos == 0"><fa icon="angle-left"/></button>
|
||||||
</div>
|
</div>
|
||||||
<span>{{ logPos }} / {{ logs.length }}</span>
|
<span>{{ logPos }} / {{ logs.length }}</span>
|
||||||
<div>
|
<div>
|
||||||
<button @click="logPos++" :disabled="logPos == logs.length">%fa:angle-right%</button>
|
<button @click="logPos++" :disabled="logPos == logs.length"><fa icon="angle-right"/></button>
|
||||||
<button @click="logPos = logs.length" :disabled="logPos == logs.length">%fa:angle-double-right%</button>
|
<button @click="logPos = logs.length" :disabled="logPos == logs.length"><fa icon="angle-double-right"/></button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
@ -17,13 +17,13 @@
|
|||||||
</header>
|
</header>
|
||||||
|
|
||||||
<div>
|
<div>
|
||||||
<div class="random" v-if="game.settings.map == null">%fa:dice%</div>
|
<div class="random" v-if="game.settings.map == null"><fa icon="dice"/></div>
|
||||||
<div class="board" v-else :style="{ 'grid-template-rows': `repeat(${ game.settings.map.length }, 1fr)`, 'grid-template-columns': `repeat(${ game.settings.map[0].length }, 1fr)` }">
|
<div class="board" v-else :style="{ 'grid-template-rows': `repeat(${ game.settings.map.length }, 1fr)`, 'grid-template-columns': `repeat(${ game.settings.map[0].length }, 1fr)` }">
|
||||||
<div v-for="(x, i) in game.settings.map.join('')"
|
<div v-for="(x, i) in game.settings.map.join('')"
|
||||||
:data-none="x == ' '"
|
:data-none="x == ' '"
|
||||||
@click="onPixelClick(i, x)">
|
@click="onPixelClick(i, x)">
|
||||||
<template v-if="x == 'b'"><template v-if="$store.state.device.darkmode">%fa:circle R%</template><template v-else>%fa:circle%</template></template>
|
<template v-if="x == 'b'"><template v-if="$store.state.device.darkmode"><fa :icon="['far', 'circle']"/></template><template v-else><fa icon="circle"/></template></template>
|
||||||
<template v-if="x == 'w'"><template v-if="$store.state.device.darkmode">%fa:circle%</template><template v-else>%fa:circle R%</template></template>
|
<template v-if="x == 'w'"><template v-if="$store.state.device.darkmode"><fa :icon="['far', 'circle']"/></template><template v-else><fa icon="circle"/></template></template>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
63
src/client/app/common/views/components/github-setting.vue
Normal file
63
src/client/app/common/views/components/github-setting.vue
Normal file
@ -0,0 +1,63 @@
|
|||||||
|
<template>
|
||||||
|
<div class="mk-github-setting">
|
||||||
|
<p>%i18n:@description%<a :href="`${docsUrl}/link-to-github`" target="_blank">%i18n:@detail%</a></p>
|
||||||
|
<p class="account" v-if="$store.state.i.github" :title="`GitHub ID: ${$store.state.i.github.id}`">%i18n:@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 ? '%i18n:@reconnect%' : '%i18n:@connect%' }}</a>
|
||||||
|
<span v-if="$store.state.i.github"> or </span>
|
||||||
|
<a :href="`${apiUrl}/disconnect/github`" target="_blank" v-if="$store.state.i.github" @click.prevent="disconnect">%i18n:@disconnect%</a>
|
||||||
|
</p>
|
||||||
|
<p class="id" v-if="$store.state.i.github">GitHub ID: {{ $store.state.i.github.id }}</p>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts">
|
||||||
|
import Vue from 'vue';
|
||||||
|
import { apiUrl, docsUrl } from '../../../config';
|
||||||
|
|
||||||
|
export default Vue.extend({
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
form: null,
|
||||||
|
apiUrl,
|
||||||
|
docsUrl
|
||||||
|
};
|
||||||
|
},
|
||||||
|
mounted() {
|
||||||
|
this.$watch('$store.state.i', () => {
|
||||||
|
if (this.$store.state.i.github && this.form)
|
||||||
|
this.form.close();
|
||||||
|
}, {
|
||||||
|
deep: true
|
||||||
|
});
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
connect() {
|
||||||
|
this.form = window.open(apiUrl + '/connect/github',
|
||||||
|
'github_connect_window',
|
||||||
|
'height=570, width=520');
|
||||||
|
},
|
||||||
|
|
||||||
|
disconnect() {
|
||||||
|
window.open(apiUrl + '/disconnect/github',
|
||||||
|
'github_disconnect_window',
|
||||||
|
'height=570, width=520');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="stylus" scoped>
|
||||||
|
.mk-github-setting
|
||||||
|
.account
|
||||||
|
border solid 1px #e1e8ed
|
||||||
|
border-radius 4px
|
||||||
|
padding 16px
|
||||||
|
|
||||||
|
a
|
||||||
|
font-weight bold
|
||||||
|
color inherit
|
||||||
|
|
||||||
|
.id
|
||||||
|
color #8899a6
|
||||||
|
</style>
|
@ -1,7 +1,7 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="mk-google">
|
<div class="mk-google">
|
||||||
<input type="search" v-model="query" :placeholder="q">
|
<input type="search" v-model="query" :placeholder="q">
|
||||||
<button @click="search">%fa:search% %i18n:common.search%</button>
|
<button @click="search"><fa icon="search"/> %i18n:common.search%</button>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
|
@ -3,6 +3,7 @@ import Vue from 'vue';
|
|||||||
import muteAndBlock from './mute-and-block.vue';
|
import muteAndBlock from './mute-and-block.vue';
|
||||||
import error from './error.vue';
|
import error from './error.vue';
|
||||||
import apiSettings from './api-settings.vue';
|
import apiSettings from './api-settings.vue';
|
||||||
|
import passwordSettings from './password-settings.vue';
|
||||||
import driveSettings from './drive-settings.vue';
|
import driveSettings from './drive-settings.vue';
|
||||||
import profileEditor from './profile-editor.vue';
|
import profileEditor from './profile-editor.vue';
|
||||||
import noteSkeleton from './note-skeleton.vue';
|
import noteSkeleton from './note-skeleton.vue';
|
||||||
@ -36,11 +37,14 @@ import messaging from './messaging.vue';
|
|||||||
import messagingRoom from './messaging-room.vue';
|
import messagingRoom from './messaging-room.vue';
|
||||||
import urlPreview from './url-preview.vue';
|
import urlPreview from './url-preview.vue';
|
||||||
import twitterSetting from './twitter-setting.vue';
|
import twitterSetting from './twitter-setting.vue';
|
||||||
|
import githubSetting from './github-setting.vue';
|
||||||
import fileTypeIcon from './file-type-icon.vue';
|
import fileTypeIcon from './file-type-icon.vue';
|
||||||
|
import emoji from './emoji.vue';
|
||||||
import Reversi from './games/reversi/reversi.vue';
|
import Reversi from './games/reversi/reversi.vue';
|
||||||
import welcomeTimeline from './welcome-timeline.vue';
|
import welcomeTimeline from './welcome-timeline.vue';
|
||||||
import uiInput from './ui/input.vue';
|
import uiInput from './ui/input.vue';
|
||||||
import uiButton from './ui/button.vue';
|
import uiButton from './ui/button.vue';
|
||||||
|
import uiHorizonGroup from './ui/horizon-group.vue';
|
||||||
import uiCard from './ui/card.vue';
|
import uiCard from './ui/card.vue';
|
||||||
import uiForm from './ui/form.vue';
|
import uiForm from './ui/form.vue';
|
||||||
import uiTextarea from './ui/textarea.vue';
|
import uiTextarea from './ui/textarea.vue';
|
||||||
@ -54,6 +58,7 @@ import formRadio from './ui/form/radio.vue';
|
|||||||
Vue.component('mk-mute-and-block', muteAndBlock);
|
Vue.component('mk-mute-and-block', muteAndBlock);
|
||||||
Vue.component('mk-error', error);
|
Vue.component('mk-error', error);
|
||||||
Vue.component('mk-api-settings', apiSettings);
|
Vue.component('mk-api-settings', apiSettings);
|
||||||
|
Vue.component('mk-password-settings', passwordSettings);
|
||||||
Vue.component('mk-drive-settings', driveSettings);
|
Vue.component('mk-drive-settings', driveSettings);
|
||||||
Vue.component('mk-profile-editor', profileEditor);
|
Vue.component('mk-profile-editor', profileEditor);
|
||||||
Vue.component('mk-note-skeleton', noteSkeleton);
|
Vue.component('mk-note-skeleton', noteSkeleton);
|
||||||
@ -87,11 +92,14 @@ Vue.component('mk-messaging', messaging);
|
|||||||
Vue.component('mk-messaging-room', messagingRoom);
|
Vue.component('mk-messaging-room', messagingRoom);
|
||||||
Vue.component('mk-url-preview', urlPreview);
|
Vue.component('mk-url-preview', urlPreview);
|
||||||
Vue.component('mk-twitter-setting', twitterSetting);
|
Vue.component('mk-twitter-setting', twitterSetting);
|
||||||
|
Vue.component('mk-github-setting', githubSetting);
|
||||||
Vue.component('mk-file-type-icon', fileTypeIcon);
|
Vue.component('mk-file-type-icon', fileTypeIcon);
|
||||||
|
Vue.component('mk-emoji', emoji);
|
||||||
Vue.component('mk-reversi', Reversi);
|
Vue.component('mk-reversi', Reversi);
|
||||||
Vue.component('mk-welcome-timeline', welcomeTimeline);
|
Vue.component('mk-welcome-timeline', welcomeTimeline);
|
||||||
Vue.component('ui-input', uiInput);
|
Vue.component('ui-input', uiInput);
|
||||||
Vue.component('ui-button', uiButton);
|
Vue.component('ui-button', uiButton);
|
||||||
|
Vue.component('ui-horizon-group', uiHorizonGroup);
|
||||||
Vue.component('ui-card', uiCard);
|
Vue.component('ui-card', uiCard);
|
||||||
Vue.component('ui-form', uiForm);
|
Vue.component('ui-form', uiForm);
|
||||||
Vue.component('ui-textarea', uiTextarea);
|
Vue.component('ui-textarea', uiTextarea);
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="mk-media-banner">
|
<div class="mk-media-banner">
|
||||||
<div class="sensitive" v-if="media.isSensitive && hide" @click="hide = false">
|
<div class="sensitive" v-if="media.isSensitive && hide" @click="hide = false">
|
||||||
<span class="icon">%fa:exclamation-triangle%</span>
|
<span class="icon"><fa icon="exclamation-triangle"/></span>
|
||||||
<b>%i18n:@sensitive%</b>
|
<b>%i18n:@sensitive%</b>
|
||||||
<span>%i18n:@click-to-show%</span>
|
<span>%i18n:@click-to-show%</span>
|
||||||
</div>
|
</div>
|
||||||
@ -18,7 +18,7 @@
|
|||||||
:title="media.name"
|
:title="media.name"
|
||||||
:download="media.name"
|
:download="media.name"
|
||||||
>
|
>
|
||||||
<span class="icon">%fa:download%</span>
|
<span class="icon"><fa icon="download"/></span>
|
||||||
<b>{{ media.name }}</b>
|
<b>{{ media.name }}</b>
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
|
@ -4,7 +4,9 @@
|
|||||||
<div class="popover" :class="{ hukidasi }" ref="popover">
|
<div class="popover" :class="{ hukidasi }" ref="popover">
|
||||||
<template v-for="item, i in items">
|
<template v-for="item, i in items">
|
||||||
<div v-if="item === null"></div>
|
<div v-if="item === null"></div>
|
||||||
<button v-if="item" @click="clicked(item.action)" v-html="item.icon ? item.icon + ' ' + item.text : item.text" :tabindex="i"></button>
|
<button v-if="item" @click="clicked(item.action)" :tabindex="i">
|
||||||
|
<fa v-if="item.icon" :icon="item.icon"/>{{ item.text }}
|
||||||
|
</button>
|
||||||
</template>
|
</template>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -188,6 +190,9 @@ export default Vue.extend({
|
|||||||
color var(--primaryForeground)
|
color var(--primaryForeground)
|
||||||
background var(--primaryDarken10)
|
background var(--primaryDarken10)
|
||||||
|
|
||||||
|
> [data-icon]
|
||||||
|
margin-right 4px
|
||||||
|
|
||||||
> div
|
> div
|
||||||
margin 8px 0
|
margin 8px 0
|
||||||
height 1px
|
height 1px
|
||||||
|
@ -14,13 +14,13 @@
|
|||||||
<div class="file" @click="file = null" v-if="file">{{ file.name }}</div>
|
<div class="file" @click="file = null" v-if="file">{{ file.name }}</div>
|
||||||
<mk-uploader ref="uploader" @uploaded="onUploaded"/>
|
<mk-uploader ref="uploader" @uploaded="onUploaded"/>
|
||||||
<button class="send" @click="send" :disabled="!canSend || sending" title="%i18n:@send%">
|
<button class="send" @click="send" :disabled="!canSend || sending" title="%i18n:@send%">
|
||||||
<template v-if="!sending">%fa:paper-plane%</template><template v-if="sending">%fa:spinner .spin%</template>
|
<template v-if="!sending"><fa icon="paper-plane"/></template><template v-if="sending"><fa icon="spinner .spin"/></template>
|
||||||
</button>
|
</button>
|
||||||
<button class="attach-from-local" @click="chooseFile" title="%i18n:@attach-from-local%">
|
<button class="attach-from-local" @click="chooseFile" title="%i18n:@attach-from-local%">
|
||||||
%fa:upload%
|
<fa icon="upload"/>
|
||||||
</button>
|
</button>
|
||||||
<button class="attach-from-drive" @click="chooseFileFromDrive" title="%i18n:@attach-from-drive%">
|
<button class="attach-from-drive" @click="chooseFileFromDrive" title="%i18n:@attach-from-drive%">
|
||||||
%fa:R folder-open%
|
<fa :icon="['far', 'folder-open']"/>
|
||||||
</button>
|
</button>
|
||||||
<input ref="file" type="file" @change="onChangeFile"/>
|
<input ref="file" type="file" @change="onChangeFile"/>
|
||||||
</div>
|
</div>
|
||||||
|
@ -24,7 +24,7 @@
|
|||||||
<footer>
|
<footer>
|
||||||
<span class="read" v-if="isMe && message.isRead">%i18n:@is-read%</span>
|
<span class="read" v-if="isMe && message.isRead">%i18n:@is-read%</span>
|
||||||
<mk-time :time="message.createdAt"/>
|
<mk-time :time="message.createdAt"/>
|
||||||
<template v-if="message.is_edited">%fa:pencil-alt%</template>
|
<template v-if="message.is_edited"><fa icon="pencil-alt"/></template>
|
||||||
</footer>
|
</footer>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -179,7 +179,7 @@ export default Vue.extend({
|
|||||||
font-size 10px
|
font-size 10px
|
||||||
color var(--messagingRoomMessageInfo)
|
color var(--messagingRoomMessageInfo)
|
||||||
|
|
||||||
> [data-fa]
|
> [data-icon]
|
||||||
margin-left 4px
|
margin-left 4px
|
||||||
|
|
||||||
&:not([data-is-me])
|
&:not([data-is-me])
|
||||||
|
@ -4,11 +4,11 @@
|
|||||||
@drop.prevent.stop="onDrop"
|
@drop.prevent.stop="onDrop"
|
||||||
>
|
>
|
||||||
<div class="body">
|
<div class="body">
|
||||||
<p class="init" v-if="init">%fa:spinner .spin%%i18n:common.loading%</p>
|
<p class="init" v-if="init"><fa icon="spinner .spin"/>%i18n:common.loading%</p>
|
||||||
<p class="empty" v-if="!init && messages.length == 0">%fa:info-circle%%i18n:@empty%</p>
|
<p class="empty" v-if="!init && messages.length == 0"><fa icon="info-circle"/>%i18n:@empty%</p>
|
||||||
<p class="no-history" v-if="!init && messages.length > 0 && !existMoreMessages">%fa:flag%%i18n:@no-history%</p>
|
<p class="no-history" v-if="!init && messages.length > 0 && !existMoreMessages"><fa icon="flag"/>%i18n:@no-history%</p>
|
||||||
<button class="more" :class="{ fetching: fetchingMoreMessages }" v-if="existMoreMessages" @click="fetchMoreMessages" :disabled="fetchingMoreMessages">
|
<button class="more" :class="{ fetching: fetchingMoreMessages }" v-if="existMoreMessages" @click="fetchMoreMessages" :disabled="fetchingMoreMessages">
|
||||||
<template v-if="fetchingMoreMessages">%fa:spinner .pulse .fw%</template>{{ fetchingMoreMessages ? '%i18n:common.loading%' : '%i18n:@more%' }}
|
<template v-if="fetchingMoreMessages"><fa icon="spinner .pulse" fixed-width/></template>{{ fetchingMoreMessages ? '%i18n:common.loading%' : '%i18n:@more%' }}
|
||||||
</button>
|
</button>
|
||||||
<template v-for="(message, i) in _messages">
|
<template v-for="(message, i) in _messages">
|
||||||
<x-message :message="message" :key="message.id"/>
|
<x-message :message="message" :key="message.id"/>
|
||||||
@ -20,7 +20,7 @@
|
|||||||
<footer>
|
<footer>
|
||||||
<transition name="fade">
|
<transition name="fade">
|
||||||
<div class="new-message" v-show="showIndicator">
|
<div class="new-message" v-show="showIndicator">
|
||||||
<button @click="onIndicatorClick">%fa:arrow-circle-down%%i18n:@new-message%</button>
|
<button @click="onIndicatorClick"><i><fa icon="arrow-circle-down"/></i>%i18n:@new-message%</button>
|
||||||
</div>
|
</div>
|
||||||
</transition>
|
</transition>
|
||||||
<x-form :user="user" ref="form"/>
|
<x-form :user="user" ref="form"/>
|
||||||
@ -280,7 +280,7 @@ export default Vue.extend({
|
|||||||
color var(--messagingRoomInfo)
|
color var(--messagingRoomInfo)
|
||||||
opacity 0.5
|
opacity 0.5
|
||||||
|
|
||||||
[data-fa]
|
[data-icon]
|
||||||
margin-right 4px
|
margin-right 4px
|
||||||
|
|
||||||
> .no-history
|
> .no-history
|
||||||
@ -292,7 +292,7 @@ export default Vue.extend({
|
|||||||
color var(--messagingRoomInfo)
|
color var(--messagingRoomInfo)
|
||||||
opacity 0.5
|
opacity 0.5
|
||||||
|
|
||||||
[data-fa]
|
[data-icon]
|
||||||
margin-right 4px
|
margin-right 4px
|
||||||
|
|
||||||
> .more
|
> .more
|
||||||
@ -313,7 +313,7 @@ export default Vue.extend({
|
|||||||
&.fetching
|
&.fetching
|
||||||
cursor wait
|
cursor wait
|
||||||
|
|
||||||
> [data-fa]
|
> [data-icon]
|
||||||
margin-right 4px
|
margin-right 4px
|
||||||
|
|
||||||
> .message
|
> .message
|
||||||
@ -381,7 +381,7 @@ export default Vue.extend({
|
|||||||
&:active
|
&:active
|
||||||
background var(--primaryDarken10)
|
background var(--primaryDarken10)
|
||||||
|
|
||||||
> [data-fa]
|
> i
|
||||||
position absolute
|
position absolute
|
||||||
top 0
|
top 0
|
||||||
left 10px
|
left 10px
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
<div class="mk-messaging" :data-compact="compact">
|
<div class="mk-messaging" :data-compact="compact">
|
||||||
<div class="search" v-if="!compact" :style="{ top: headerTop + 'px' }">
|
<div class="search" v-if="!compact" :style="{ top: headerTop + 'px' }">
|
||||||
<div class="form">
|
<div class="form">
|
||||||
<label for="search-input">%fa:search%</label>
|
<label for="search-input"><i><fa icon="search"/></i></label>
|
||||||
<input v-model="q" type="search" @input="search" @keydown="onSearchKeydown" placeholder="%i18n:@search-user%"/>
|
<input v-model="q" type="search" @input="search" @keydown="onSearchKeydown" placeholder="%i18n:@search-user%"/>
|
||||||
</div>
|
</div>
|
||||||
<div class="result">
|
<div class="result">
|
||||||
@ -45,7 +45,7 @@
|
|||||||
</template>
|
</template>
|
||||||
</div>
|
</div>
|
||||||
<p class="no-history" v-if="!fetching && messages.length == 0">%i18n:@no-history%</p>
|
<p class="no-history" v-if="!fetching && messages.length == 0">%i18n:@no-history%</p>
|
||||||
<p class="fetching" v-if="fetching">%fa:spinner .pulse .fw%%i18n:common.loading%<mk-ellipsis/></p>
|
<p class="fetching" v-if="fetching"><fa icon="spinner .pulse" fixed-width/>%i18n:common.loading%<mk-ellipsis/></p>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
@ -213,7 +213,7 @@ export default Vue.extend({
|
|||||||
width 38px
|
width 38px
|
||||||
pointer-events none
|
pointer-events none
|
||||||
|
|
||||||
> [data-fa]
|
> i
|
||||||
display block
|
display block
|
||||||
position absolute
|
position absolute
|
||||||
top 0
|
top 0
|
||||||
@ -418,7 +418,7 @@ export default Vue.extend({
|
|||||||
text-align center
|
text-align center
|
||||||
color #aaa
|
color #aaa
|
||||||
|
|
||||||
> [data-fa]
|
> [data-icon]
|
||||||
margin-right 4px
|
margin-right 4px
|
||||||
|
|
||||||
// TODO: element base media query
|
// TODO: element base media query
|
||||||
|
@ -1,5 +1,4 @@
|
|||||||
import Vue, { VNode } from 'vue';
|
import Vue, { VNode } from 'vue';
|
||||||
import * as emojilib from 'emojilib';
|
|
||||||
import { length } from 'stringz';
|
import { length } from 'stringz';
|
||||||
import parse from '../../../../../mfm/parse';
|
import parse from '../../../../../mfm/parse';
|
||||||
import getAcct from '../../../../../misc/acct/render';
|
import getAcct from '../../../../../misc/acct/render';
|
||||||
@ -24,6 +23,9 @@ export default Vue.component('misskey-flavored-markdown', {
|
|||||||
i: {
|
i: {
|
||||||
type: Object,
|
type: Object,
|
||||||
default: null
|
default: null
|
||||||
|
},
|
||||||
|
customEmojis: {
|
||||||
|
required: false,
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -185,24 +187,17 @@ export default Vue.component('misskey-flavored-markdown', {
|
|||||||
}
|
}
|
||||||
|
|
||||||
case 'emoji': {
|
case 'emoji': {
|
||||||
//#region カスタム絵文字
|
const customEmojis = (this.os.getMetaSync() || { emojis: [] }).emojis || [];
|
||||||
const customEmojis = (this.os.getMetaSync() || { emojis: [] }).emojis;
|
return [createElement('mk-emoji', {
|
||||||
const customEmoji = customEmojis.find(e => e.name == token.emoji || (e.aliases || []).includes(token.emoji));
|
|
||||||
if (customEmoji) {
|
|
||||||
return [createElement('img', {
|
|
||||||
attrs: {
|
attrs: {
|
||||||
src: customEmoji.url,
|
emoji: token.emoji,
|
||||||
alt: token.emoji,
|
name: token.name
|
||||||
title: token.emoji,
|
},
|
||||||
style: 'height: 2.5em; vertical-align: middle;'
|
props: {
|
||||||
|
customEmojis: this.customEmojis || customEmojis
|
||||||
}
|
}
|
||||||
})];
|
})];
|
||||||
}
|
}
|
||||||
//#endregion
|
|
||||||
|
|
||||||
const emoji = emojilib.lib[token.emoji];
|
|
||||||
return [createElement('span', emoji ? emoji.char : token.content)];
|
|
||||||
}
|
|
||||||
|
|
||||||
case 'search': {
|
case 'search': {
|
||||||
return [createElement(MkGoogle, {
|
return [createElement(MkGoogle, {
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
<template>
|
<template>
|
||||||
<ui-card>
|
<ui-card>
|
||||||
<div slot="title">%fa:ban% %i18n:@mute-and-block%</div>
|
<div slot="title"><fa icon="ban"/> %i18n:@mute-and-block%</div>
|
||||||
|
|
||||||
<section>
|
<section>
|
||||||
<header>%i18n:@mute%</header>
|
<header>%i18n:@mute%</header>
|
||||||
|
@ -2,15 +2,11 @@
|
|||||||
<span class="mk-nav">
|
<span class="mk-nav">
|
||||||
<a :href="aboutUrl">%i18n:@about%</a>
|
<a :href="aboutUrl">%i18n:@about%</a>
|
||||||
<i>・</i>
|
<i>・</i>
|
||||||
<a href="/stats">%i18n:@stats%</a>
|
|
||||||
<i>・</i>
|
|
||||||
<a :href="repositoryUrl">%i18n:@repository%</a>
|
<a :href="repositoryUrl">%i18n:@repository%</a>
|
||||||
<i>・</i>
|
<i>・</i>
|
||||||
<a :href="feedbackUrl" target="_blank">%i18n:@feedback%</a>
|
<a :href="feedbackUrl" target="_blank">%i18n:@feedback%</a>
|
||||||
<i>・</i>
|
<i>・</i>
|
||||||
<a href="/dev">%i18n:@develop%</a>
|
<a href="/dev">%i18n:@develop%</a>
|
||||||
<i>・</i>
|
|
||||||
<a href="https://twitter.com/misskey_xyz" target="_blank">Follow us on %fa:B twitter%</a>
|
|
||||||
</span>
|
</span>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
|
@ -6,18 +6,18 @@
|
|||||||
<span class="is-bot" v-if="note.user.isBot">bot</span>
|
<span class="is-bot" v-if="note.user.isBot">bot</span>
|
||||||
<span class="is-cat" v-if="note.user.isCat">cat</span>
|
<span class="is-cat" v-if="note.user.isCat">cat</span>
|
||||||
<span class="username"><mk-acct :user="note.user"/></span>
|
<span class="username"><mk-acct :user="note.user"/></span>
|
||||||
<span class="is-verified" v-if="note.user.isVerified" title="%i18n:common.verified-user%">%fa:star%</span>
|
<span class="is-verified" v-if="note.user.isVerified" title="%i18n:common.verified-user%"><fa icon="star"/></span>
|
||||||
<div class="info">
|
<div class="info">
|
||||||
<span class="app" v-if="note.app && !mini">via <b>{{ note.app.name }}</b></span>
|
<span class="app" v-if="note.app && !mini">via <b>{{ note.app.name }}</b></span>
|
||||||
<span class="mobile" v-if="note.viaMobile">%fa:mobile-alt%</span>
|
<span class="mobile" v-if="note.viaMobile"><fa icon="mobile-alt"/></span>
|
||||||
<router-link class="created-at" :to="note | notePage">
|
<router-link class="created-at" :to="note | notePage">
|
||||||
<mk-time :time="note.createdAt"/>
|
<mk-time :time="note.createdAt"/>
|
||||||
</router-link>
|
</router-link>
|
||||||
<span class="visibility" v-if="note.visibility != 'public'">
|
<span class="visibility" v-if="note.visibility != 'public'">
|
||||||
<template v-if="note.visibility == 'home'">%fa:home%</template>
|
<template v-if="note.visibility == 'home'"><fa icon="home"/></template>
|
||||||
<template v-if="note.visibility == 'followers'">%fa:unlock%</template>
|
<template v-if="note.visibility == 'followers'"><fa icon="unlock"/></template>
|
||||||
<template v-if="note.visibility == 'specified'">%fa:envelope%</template>
|
<template v-if="note.visibility == 'specified'"><fa icon="envelope"/></template>
|
||||||
<template v-if="note.visibility == 'private'">%fa:lock%</template>
|
<template v-if="note.visibility == 'private'"><fa icon="lock"/></template>
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
</header>
|
</header>
|
||||||
|
@ -15,18 +15,18 @@ export default Vue.extend({
|
|||||||
computed: {
|
computed: {
|
||||||
items() {
|
items() {
|
||||||
const items = [{
|
const items = [{
|
||||||
icon: '%fa:info-circle%',
|
icon: 'info-circle',
|
||||||
text: '%i18n:@detail%',
|
text: '%i18n:@detail%',
|
||||||
action: this.detail
|
action: this.detail
|
||||||
}, {
|
}, {
|
||||||
icon: '%fa:link%',
|
icon: 'link',
|
||||||
text: '%i18n:@copy-link%',
|
text: '%i18n:@copy-link%',
|
||||||
action: this.copyLink
|
action: this.copyLink
|
||||||
}];
|
}];
|
||||||
|
|
||||||
if (this.note.uri) {
|
if (this.note.uri) {
|
||||||
items.push({
|
items.push({
|
||||||
icon: '%fa:external-link-square-alt%',
|
icon: 'external-link-square-alt',
|
||||||
text: '%i18n:@remote%',
|
text: '%i18n:@remote%',
|
||||||
action: () => {
|
action: () => {
|
||||||
window.open(this.note.uri, '_blank');
|
window.open(this.note.uri, '_blank');
|
||||||
@ -38,13 +38,13 @@ export default Vue.extend({
|
|||||||
|
|
||||||
if (this.note.isFavorited) {
|
if (this.note.isFavorited) {
|
||||||
items.push({
|
items.push({
|
||||||
icon: '%fa:star%',
|
icon: 'star',
|
||||||
text: '%i18n:@unfavorite%',
|
text: '%i18n:@unfavorite%',
|
||||||
action: this.unfavorite
|
action: this.unfavorite
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
items.push({
|
items.push({
|
||||||
icon: '%fa:star%',
|
icon: 'star',
|
||||||
text: '%i18n:@favorite%',
|
text: '%i18n:@favorite%',
|
||||||
action: this.favorite
|
action: this.favorite
|
||||||
});
|
});
|
||||||
@ -53,13 +53,13 @@ export default Vue.extend({
|
|||||||
if (this.note.userId == this.$store.state.i.id) {
|
if (this.note.userId == this.$store.state.i.id) {
|
||||||
if ((this.$store.state.i.pinnedNoteIds || []).includes(this.note.id)) {
|
if ((this.$store.state.i.pinnedNoteIds || []).includes(this.note.id)) {
|
||||||
items.push({
|
items.push({
|
||||||
icon: '%fa:thumbtack%',
|
icon: 'thumbtack',
|
||||||
text: '%i18n:@unpin%',
|
text: '%i18n:@unpin%',
|
||||||
action: this.unpin
|
action: this.unpin
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
items.push({
|
items.push({
|
||||||
icon: '%fa:thumbtack%',
|
icon: 'thumbtack',
|
||||||
text: '%i18n:@pin%',
|
text: '%i18n:@pin%',
|
||||||
action: this.pin
|
action: this.pin
|
||||||
});
|
});
|
||||||
@ -69,7 +69,7 @@ export default Vue.extend({
|
|||||||
if (this.note.userId == this.$store.state.i.id || this.$store.state.i.isAdmin) {
|
if (this.note.userId == this.$store.state.i.id || this.$store.state.i.isAdmin) {
|
||||||
items.push(null);
|
items.push(null);
|
||||||
items.push({
|
items.push({
|
||||||
icon: '%fa:trash-alt R%',
|
icon: ['far', 'trash-alt'],
|
||||||
text: '%i18n:@delete%',
|
text: '%i18n:@delete%',
|
||||||
action: this.del
|
action: this.del
|
||||||
});
|
});
|
||||||
|
@ -1,19 +1,19 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="mk-poll-editor">
|
<div class="mk-poll-editor">
|
||||||
<p class="caution" v-if="choices.length < 2">
|
<p class="caution" v-if="choices.length < 2">
|
||||||
%fa:exclamation-triangle%%i18n:@no-only-one-choice%
|
<fa icon="exclamation-triangle"/>%i18n:@no-only-one-choice%
|
||||||
</p>
|
</p>
|
||||||
<ul ref="choices">
|
<ul ref="choices">
|
||||||
<li v-for="(choice, i) in choices">
|
<li v-for="(choice, i) in choices">
|
||||||
<input :value="choice" @input="onInput(i, $event)" :placeholder="'%i18n:@choice-n%'.replace('{}', i + 1)">
|
<input :value="choice" @input="onInput(i, $event)" :placeholder="'%i18n:@choice-n%'.replace('{}', i + 1)">
|
||||||
<button @click="remove(i)" title="%i18n:@remove%">
|
<button @click="remove(i)" title="%i18n:@remove%">
|
||||||
%fa:times%
|
<fa icon="times"/>
|
||||||
</button>
|
</button>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
<button class="add" v-if="choices.length < 10" @click="add">%i18n:@add%</button>
|
<button class="add" v-if="choices.length < 10" @click="add">%i18n:@add%</button>
|
||||||
<button class="destroy" @click="destroy" title="%i18n:@destroy%">
|
<button class="destroy" @click="destroy" title="%i18n:@destroy%">
|
||||||
%fa:times%
|
<fa icon="times"/>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
@ -76,7 +76,7 @@ export default Vue.extend({
|
|||||||
font-size 0.8em
|
font-size 0.8em
|
||||||
color #f00
|
color #f00
|
||||||
|
|
||||||
> [data-fa]
|
> [data-icon]
|
||||||
margin-right 4px
|
margin-right 4px
|
||||||
|
|
||||||
> ul
|
> ul
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
<li v-for="choice in poll.choices" :key="choice.id" @click="vote(choice.id)" :class="{ voted: choice.voted }" :title="!isVoted ? '%i18n:@vote-to%'.replace('{}', choice.text) : ''">
|
<li v-for="choice in poll.choices" :key="choice.id" @click="vote(choice.id)" :class="{ voted: choice.voted }" :title="!isVoted ? '%i18n:@vote-to%'.replace('{}', choice.text) : ''">
|
||||||
<div class="backdrop" :style="{ 'width': (showResult ? (choice.votes / total * 100) : 0) + '%' }"></div>
|
<div class="backdrop" :style="{ 'width': (showResult ? (choice.votes / total * 100) : 0) + '%' }"></div>
|
||||||
<span>
|
<span>
|
||||||
<template v-if="choice.isVoted">%fa:check%</template>
|
<template v-if="choice.isVoted"><fa icon="check"/></template>
|
||||||
<span>{{ choice.text }}</span>
|
<span>{{ choice.text }}</span>
|
||||||
<span class="votes" v-if="showResult">({{ '%i18n:@vote-count%'.replace('{}', choice.votes) }})</span>
|
<span class="votes" v-if="showResult">({{ '%i18n:@vote-count%'.replace('{}', choice.votes) }})</span>
|
||||||
</span>
|
</span>
|
||||||
@ -100,7 +100,7 @@ export default Vue.extend({
|
|||||||
transition width 1s ease
|
transition width 1s ease
|
||||||
|
|
||||||
> span
|
> span
|
||||||
> [data-fa]
|
> [data-icon]
|
||||||
margin-right 4px
|
margin-right 4px
|
||||||
|
|
||||||
> .votes
|
> .votes
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
<template>
|
<template>
|
||||||
<ui-card>
|
<ui-card>
|
||||||
<div slot="title">%fa:user% %i18n:@title%</div>
|
<div slot="title"><fa icon="user"/> %i18n:@title%</div>
|
||||||
|
|
||||||
<section class="fit-top">
|
<section class="fit-top">
|
||||||
<ui-form :disabled="saving">
|
<ui-form :disabled="saving">
|
||||||
@ -16,12 +16,12 @@
|
|||||||
|
|
||||||
<ui-input v-model="location">
|
<ui-input v-model="location">
|
||||||
<span>%i18n:@location%</span>
|
<span>%i18n:@location%</span>
|
||||||
<span slot="prefix">%fa:map-marker-alt%</span>
|
<span slot="prefix"><fa icon="map-marker-alt"/></span>
|
||||||
</ui-input>
|
</ui-input>
|
||||||
|
|
||||||
<ui-input v-model="birthday" type="date">
|
<ui-input v-model="birthday" type="date">
|
||||||
<span>%i18n:@birthday%</span>
|
<span>%i18n:@birthday%</span>
|
||||||
<span slot="prefix">%fa:birthday-cake%</span>
|
<span slot="prefix"><fa icon="birthday-cake"/></span>
|
||||||
</ui-input>
|
</ui-input>
|
||||||
|
|
||||||
<ui-textarea v-model="description" :max="500">
|
<ui-textarea v-model="description" :max="500">
|
||||||
@ -30,13 +30,13 @@
|
|||||||
|
|
||||||
<ui-input type="file" @change="onAvatarChange">
|
<ui-input type="file" @change="onAvatarChange">
|
||||||
<span>%i18n:@avatar%</span>
|
<span>%i18n:@avatar%</span>
|
||||||
<span slot="icon">%fa:image%</span>
|
<span slot="icon"><fa icon="image"/></span>
|
||||||
<span slot="text" v-if="avatarUploading">%i18n:@uploading%<mk-ellipsis/></span>
|
<span slot="text" v-if="avatarUploading">%i18n:@uploading%<mk-ellipsis/></span>
|
||||||
</ui-input>
|
</ui-input>
|
||||||
|
|
||||||
<ui-input type="file" @change="onBannerChange">
|
<ui-input type="file" @change="onBannerChange">
|
||||||
<span>%i18n:@banner%</span>
|
<span>%i18n:@banner%</span>
|
||||||
<span slot="icon">%fa:image%</span>
|
<span slot="icon"><fa icon="image"/></span>
|
||||||
<span slot="text" v-if="bannerUploading">%i18n:@uploading%<mk-ellipsis/></span>
|
<span slot="text" v-if="bannerUploading">%i18n:@uploading%<mk-ellipsis/></span>
|
||||||
</ui-input>
|
</ui-input>
|
||||||
|
|
||||||
|
@ -8,11 +8,12 @@
|
|||||||
</ui-input>
|
</ui-input>
|
||||||
<ui-input v-model="password" type="password" required styl="fill">
|
<ui-input v-model="password" type="password" required styl="fill">
|
||||||
<span>%i18n:@password%</span>
|
<span>%i18n:@password%</span>
|
||||||
<span slot="prefix">%fa:lock%</span>
|
<span slot="prefix"><fa icon="lock"/></span>
|
||||||
</ui-input>
|
</ui-input>
|
||||||
<ui-input v-if="user && user.twoFactorEnabled" v-model="token" type="number" required styl="fill"/>
|
<ui-input v-if="user && user.twoFactorEnabled" v-model="token" type="number" required styl="fill"/>
|
||||||
<ui-button type="submit" :disabled="signing">{{ signing ? '%i18n:@signing-in%' : '%i18n:@signin%' }}</ui-button>
|
<ui-button type="submit" :disabled="signing">{{ signing ? '%i18n:@signing-in%' : '%i18n:@signin%' }}</ui-button>
|
||||||
<p style="margin: 8px 0;">%i18n:@or% <a :href="`${apiUrl}/signin/twitter`">%i18n:@signin-with-twitter%</a></p>
|
<p style="margin: 8px 0;">%i18n:@or% <a :href="`${apiUrl}/signin/twitter`">%i18n:@signin-with-twitter%</a></p>
|
||||||
|
<p style="margin: 8px 0;">%i18n:@or% <a :href="`${apiUrl}/signin/github`">%i18n:@signin-with-github%</a></p>
|
||||||
</form>
|
</form>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
|
@ -3,36 +3,36 @@
|
|||||||
<template v-if="meta">
|
<template v-if="meta">
|
||||||
<ui-input v-if="meta.disableRegistration" v-model="invitationCode" type="text" :autocomplete="Math.random()" spellcheck="false" required styl="fill">
|
<ui-input v-if="meta.disableRegistration" v-model="invitationCode" type="text" :autocomplete="Math.random()" spellcheck="false" required styl="fill">
|
||||||
<span>%i18n:@invitation-code%</span>
|
<span>%i18n:@invitation-code%</span>
|
||||||
<span slot="prefix">%fa:id-card-alt%</span>
|
<span slot="prefix"><fa icon="id-card-alt"/></span>
|
||||||
<p slot="text" v-html="'%i18n:@invitation-info%'.replace('{}', meta.maintainer.url)"></p>
|
<p slot="text" v-html="'%i18n:@invitation-info%'.replace('{}', meta.maintainer.url)"></p>
|
||||||
</ui-input>
|
</ui-input>
|
||||||
<ui-input v-model="username" type="text" pattern="^[a-zA-Z0-9_]{1,20}$" :autocomplete="Math.random()" spellcheck="false" required @input="onChangeUsername" styl="fill">
|
<ui-input v-model="username" type="text" pattern="^[a-zA-Z0-9_]{1,20}$" :autocomplete="Math.random()" spellcheck="false" required @input="onChangeUsername" styl="fill">
|
||||||
<span>%i18n:@username%</span>
|
<span>%i18n:@username%</span>
|
||||||
<span slot="prefix">@</span>
|
<span slot="prefix">@</span>
|
||||||
<span slot="suffix">@{{ host }}</span>
|
<span slot="suffix">@{{ host }}</span>
|
||||||
<p slot="text" v-if="usernameState == 'wait'" style="color:#999">%fa:spinner .pulse .fw% %i18n:@checking%</p>
|
<p slot="text" v-if="usernameState == 'wait'" style="color:#999"><fa icon="spinner .pulse" fixed-width/> %i18n:@checking%</p>
|
||||||
<p slot="text" v-if="usernameState == 'ok'" style="color:#3CB7B5">%fa:check .fw% %i18n:@available%</p>
|
<p slot="text" v-if="usernameState == 'ok'" style="color:#3CB7B5"><fa icon="check" fixed-width/> %i18n:@available%</p>
|
||||||
<p slot="text" v-if="usernameState == 'unavailable'" style="color:#FF1161">%fa:exclamation-triangle .fw% %i18n:@unavailable%</p>
|
<p slot="text" v-if="usernameState == 'unavailable'" style="color:#FF1161"><fa icon="exclamation-triangle" fixed-width/> %i18n:@unavailable%</p>
|
||||||
<p slot="text" v-if="usernameState == 'error'" style="color:#FF1161">%fa:exclamation-triangle .fw% %i18n:@error%</p>
|
<p slot="text" v-if="usernameState == 'error'" style="color:#FF1161"><fa icon="exclamation-triangle" fixed-width/> %i18n:@error%</p>
|
||||||
<p slot="text" v-if="usernameState == 'invalid-format'" style="color:#FF1161">%fa:exclamation-triangle .fw% %i18n:@invalid-format%</p>
|
<p slot="text" v-if="usernameState == 'invalid-format'" style="color:#FF1161"><fa icon="exclamation-triangle" fixed-width/> %i18n:@invalid-format%</p>
|
||||||
<p slot="text" v-if="usernameState == 'min-range'" style="color:#FF1161">%fa:exclamation-triangle .fw% %i18n:@too-short%</p>
|
<p slot="text" v-if="usernameState == 'min-range'" style="color:#FF1161"><fa icon="exclamation-triangle" fixed-width/> %i18n:@too-short%</p>
|
||||||
<p slot="text" v-if="usernameState == 'max-range'" style="color:#FF1161">%fa:exclamation-triangle .fw% %i18n:@too-long%</p>
|
<p slot="text" v-if="usernameState == 'max-range'" style="color:#FF1161"><fa icon="exclamation-triangle" fixed-width/> %i18n:@too-long%</p>
|
||||||
</ui-input>
|
</ui-input>
|
||||||
<ui-input v-model="password" type="password" :autocomplete="Math.random()" required @input="onChangePassword" :with-password-meter="true" styl="fill">
|
<ui-input v-model="password" type="password" :autocomplete="Math.random()" required @input="onChangePassword" :with-password-meter="true" styl="fill">
|
||||||
<span>%i18n:@password%</span>
|
<span>%i18n:@password%</span>
|
||||||
<span slot="prefix">%fa:lock%</span>
|
<span slot="prefix"><fa icon="lock"/></span>
|
||||||
<div slot="text">
|
<div slot="text">
|
||||||
<p slot="text" v-if="passwordStrength == 'low'" style="color:#FF1161">%fa:exclamation-triangle .fw% %i18n:@weak-password%</p>
|
<p slot="text" v-if="passwordStrength == 'low'" style="color:#FF1161"><fa icon="exclamation-triangle" fixed-width/> %i18n:@weak-password%</p>
|
||||||
<p slot="text" v-if="passwordStrength == 'medium'" style="color:#3CB7B5">%fa:check .fw% %i18n:@normal-password%</p>
|
<p slot="text" v-if="passwordStrength == 'medium'" style="color:#3CB7B5"><fa icon="check" fixed-width/> %i18n:@normal-password%</p>
|
||||||
<p slot="text" v-if="passwordStrength == 'high'" style="color:#3CB7B5">%fa:check .fw% %i18n:@strong-password%</p>
|
<p slot="text" v-if="passwordStrength == 'high'" style="color:#3CB7B5"><fa icon="check" fixed-width/> %i18n:@strong-password%</p>
|
||||||
</div>
|
</div>
|
||||||
</ui-input>
|
</ui-input>
|
||||||
<ui-input v-model="retypedPassword" type="password" :autocomplete="Math.random()" required @input="onChangePasswordRetype" styl="fill">
|
<ui-input v-model="retypedPassword" type="password" :autocomplete="Math.random()" required @input="onChangePasswordRetype" styl="fill">
|
||||||
<span>%i18n:@password% (%i18n:@retype%)</span>
|
<span>%i18n:@password% (%i18n:@retype%)</span>
|
||||||
<span slot="prefix">%fa:lock%</span>
|
<span slot="prefix"><fa icon="lock"/></span>
|
||||||
<div slot="text">
|
<div slot="text">
|
||||||
<p slot="text" v-if="passwordRetypeState == 'match'" style="color:#3CB7B5">%fa:check .fw% %i18n:@password-matched%</p>
|
<p slot="text" v-if="passwordRetypeState == 'match'" style="color:#3CB7B5"><fa icon="check" fixed-width/> %i18n:@password-matched%</p>
|
||||||
<p slot="text" v-if="passwordRetypeState == 'not-match'" style="color:#FF1161">%fa:exclamation-triangle .fw% %i18n:@password-not-matched%</p>
|
<p slot="text" v-if="passwordRetypeState == 'not-match'" style="color:#FF1161"><fa icon="exclamation-triangle" fixed-width/> %i18n:@password-not-matched%</p>
|
||||||
</div>
|
</div>
|
||||||
</ui-input>
|
</ui-input>
|
||||||
<div v-if="meta.recaptchaSitekey != null" class="g-recaptcha" :data-sitekey="meta.recaptchaSitekey" style="margin: 16px 0;"></div>
|
<div v-if="meta.recaptchaSitekey != null" class="g-recaptcha" :data-sitekey="meta.recaptchaSitekey" style="margin: 16px 0;"></div>
|
||||||
|
@ -1,15 +1,15 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="mk-stream-indicator">
|
<div class="mk-stream-indicator">
|
||||||
<p v-if="stream.state == 'initializing'">
|
<p v-if="stream.state == 'initializing'">
|
||||||
%fa:spinner .pulse%
|
<fa icon="spinner .pulse"/>
|
||||||
<span>%i18n:@connecting%<mk-ellipsis/></span>
|
<span>%i18n:@connecting%<mk-ellipsis/></span>
|
||||||
</p>
|
</p>
|
||||||
<p v-if="stream.state == 'reconnecting'">
|
<p v-if="stream.state == 'reconnecting'">
|
||||||
%fa:spinner .pulse%
|
<fa icon="spinner .pulse"/>
|
||||||
<span>%i18n:@reconnecting%<mk-ellipsis/></span>
|
<span>%i18n:@reconnecting%<mk-ellipsis/></span>
|
||||||
</p>
|
</p>
|
||||||
<p v-if="stream.state == 'connected'">
|
<p v-if="stream.state == 'connected'">
|
||||||
%fa:check%
|
<fa icon="check"/>
|
||||||
<span>%i18n:@connected%</span>
|
<span>%i18n:@connected%</span>
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
@ -80,7 +80,7 @@ export default Vue.extend({
|
|||||||
display block
|
display block
|
||||||
margin 0
|
margin 0
|
||||||
|
|
||||||
> [data-fa]
|
> [data-icon]
|
||||||
margin-right 0.25em
|
margin-right 0.25em
|
||||||
|
|
||||||
</style>
|
</style>
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="jtivnzhfwquxpsfidertopbmwmchmnmo">
|
<div class="jtivnzhfwquxpsfidertopbmwmchmnmo">
|
||||||
<p class="fetching" v-if="fetching">%fa:spinner .pulse .fw%%i18n:common.loading%<mk-ellipsis/></p>
|
<p class="fetching" v-if="fetching"><fa icon="spinner .pulse" fixed-width/>%i18n:common.loading%<mk-ellipsis/></p>
|
||||||
<p class="empty" v-else-if="tags.length == 0">%fa:exclamation-circle%%i18n:@empty%</p>
|
<p class="empty" v-else-if="tags.length == 0"><fa icon="exclamation-circle"/>%i18n:@empty%</p>
|
||||||
<div v-else>
|
<div v-else>
|
||||||
<vue-word-cloud
|
<vue-word-cloud
|
||||||
:words="tags.slice(0, 20).map(x => [x.name, x.count])"
|
:words="tags.slice(0, 20).map(x => [x.name, x.count])"
|
||||||
@ -74,7 +74,7 @@ export default Vue.extend({
|
|||||||
text-align center
|
text-align center
|
||||||
color #aaa
|
color #aaa
|
||||||
|
|
||||||
> [data-fa]
|
> [data-icon]
|
||||||
margin-right 4px
|
margin-right 4px
|
||||||
|
|
||||||
> div
|
> div
|
||||||
|
@ -25,7 +25,7 @@
|
|||||||
</label>
|
</label>
|
||||||
|
|
||||||
<details class="creator">
|
<details class="creator">
|
||||||
<summary>%fa:palette% %i18n:@create-a-theme%</summary>
|
<summary><fa icon="palette"/> %i18n:@create-a-theme%</summary>
|
||||||
<div>
|
<div>
|
||||||
<span>%i18n:@base-theme%:</span>
|
<span>%i18n:@base-theme%:</span>
|
||||||
<ui-radio v-model="myThemeBase" value="light">%i18n:@base-theme-light%</ui-radio>
|
<ui-radio v-model="myThemeBase" value="light">%i18n:@base-theme-light%</ui-radio>
|
||||||
@ -51,23 +51,23 @@
|
|||||||
<div style="padding-bottom:8px;">%i18n:@text-color%:</div>
|
<div style="padding-bottom:8px;">%i18n:@text-color%:</div>
|
||||||
<color-picker v-model="myThemeText"/>
|
<color-picker v-model="myThemeText"/>
|
||||||
</div>
|
</div>
|
||||||
<ui-button @click="preview()">%fa:eye% %i18n:@preview-created-theme%</ui-button>
|
<ui-button @click="preview()"><fa icon="eye"/> %i18n:@preview-created-theme%</ui-button>
|
||||||
<ui-button primary @click="gen()">%fa:save R% %i18n:@save-created-theme%</ui-button>
|
<ui-button primary @click="gen()"><fa :icon="['far', 'save']"/> %i18n:@save-created-theme%</ui-button>
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
<summary>%fa:download% %i18n:@install-a-theme%</summary>
|
<summary><fa icon="download"/> %i18n:@install-a-theme%</summary>
|
||||||
<ui-button @click="import_()">%fa:file-import% %i18n:@import%</ui-button>
|
<ui-button @click="import_()"><fa icon="file-import"/> %i18n:@import%</ui-button>
|
||||||
<input ref="file" type="file" accept=".misskeytheme" style="display:none;" @change="onUpdateImportFile"/>
|
<input ref="file" type="file" accept=".misskeytheme" style="display:none;" @change="onUpdateImportFile"/>
|
||||||
<p>%i18n:@import-by-code%:</p>
|
<p>%i18n:@import-by-code%:</p>
|
||||||
<ui-textarea v-model="installThemeCode">
|
<ui-textarea v-model="installThemeCode">
|
||||||
<span>%i18n:@theme-code%</span>
|
<span>%i18n:@theme-code%</span>
|
||||||
</ui-textarea>
|
</ui-textarea>
|
||||||
<ui-button @click="() => install(this.installThemeCode)">%fa:check% %i18n:@install%</ui-button>
|
<ui-button @click="() => install(this.installThemeCode)"><fa icon="check"/> %i18n:@install%</ui-button>
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
<summary>%fa:folder-open% %i18n:@manage-themes%</summary>
|
<summary><fa icon="folder-open"/> %i18n:@manage-themes%</summary>
|
||||||
<ui-select v-model="selectedThemeId" placeholder="%i18n:@select-theme%">
|
<ui-select v-model="selectedThemeId" placeholder="%i18n:@select-theme%">
|
||||||
<optgroup label="%i18n:@builtin-themes%">
|
<optgroup label="%i18n:@builtin-themes%">
|
||||||
<option v-for="x in builtinThemes" :value="x.id" :key="x.id">{{ x.name }}</option>
|
<option v-for="x in builtinThemes" :value="x.id" :key="x.id">{{ x.name }}</option>
|
||||||
@ -89,8 +89,8 @@
|
|||||||
<ui-textarea readonly :value="selectedThemeCode">
|
<ui-textarea readonly :value="selectedThemeCode">
|
||||||
<span>%i18n:@theme-code%</span>
|
<span>%i18n:@theme-code%</span>
|
||||||
</ui-textarea>
|
</ui-textarea>
|
||||||
<ui-button @click="export_()" link :download="`${selectedTheme.name}.misskeytheme`" ref="export">%fa:box% %i18n:@export%</ui-button>
|
<ui-button @click="export_()" link :download="`${selectedTheme.name}.misskeytheme`" ref="export"><fa icon="box"/> %i18n:@export%</ui-button>
|
||||||
<ui-button @click="uninstall()" v-if="!builtinThemes.some(t => t.id == selectedTheme.id)">%fa:trash-alt R% %i18n:@uninstall%</ui-button>
|
<ui-button @click="uninstall()" v-if="!builtinThemes.some(t => t.id == selectedTheme.id)"><fa :icon="['far', 'trash-alt']"/> %i18n:@uninstall%</ui-button>
|
||||||
</template>
|
</template>
|
||||||
</details>
|
</details>
|
||||||
</div>
|
</div>
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="csqvmxybqbycalfhkxvyfrgbrdalkaoc">
|
<div class="csqvmxybqbycalfhkxvyfrgbrdalkaoc">
|
||||||
<p class="fetching" v-if="fetching">%fa:spinner .pulse .fw%%i18n:common.loading%<mk-ellipsis/></p>
|
<p class="fetching" v-if="fetching"><fa icon="spinner .pulse" fixed-width/>%i18n:common.loading%<mk-ellipsis/></p>
|
||||||
<p class="empty" v-else-if="stats.length == 0">%fa:exclamation-circle%%i18n:@empty%</p>
|
<p class="empty" v-else-if="stats.length == 0"><fa icon="exclamation-circle"/>%i18n:@empty%</p>
|
||||||
<!-- トランジションを有効にするとなぜかメモリリークする -->
|
<!-- トランジションを有効にするとなぜかメモリリークする -->
|
||||||
<transition-group v-else tag="div" name="chart">
|
<transition-group v-else tag="div" name="chart">
|
||||||
<div v-for="stat in stats" :key="stat.tag">
|
<div v-for="stat in stats" :key="stat.tag">
|
||||||
@ -58,7 +58,7 @@ export default Vue.extend({
|
|||||||
color var(--text)
|
color var(--text)
|
||||||
opacity 0.7
|
opacity 0.7
|
||||||
|
|
||||||
> [data-fa]
|
> [data-icon]
|
||||||
margin-right 4px
|
margin-right 4px
|
||||||
|
|
||||||
> div
|
> div
|
||||||
|
@ -1,5 +1,10 @@
|
|||||||
<template>
|
<template>
|
||||||
<component class="dmtdnykelhudezerjlfpbhgovrgnqqgr" :is="link ? 'a' : 'button'" :class="[styl, { inline, primary }]" :type="type" @click="$emit('click')">
|
<component class="dmtdnykelhudezerjlfpbhgovrgnqqgr"
|
||||||
|
:is="link ? 'a' : 'button'"
|
||||||
|
:class="[styl, { inline, primary }]"
|
||||||
|
:type="type"
|
||||||
|
@click="$emit('click')"
|
||||||
|
>
|
||||||
<slot></slot>
|
<slot></slot>
|
||||||
</component>
|
</component>
|
||||||
</template>
|
</template>
|
||||||
@ -7,6 +12,11 @@
|
|||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import Vue from 'vue';
|
import Vue from 'vue';
|
||||||
export default Vue.extend({
|
export default Vue.extend({
|
||||||
|
inject: {
|
||||||
|
horizonGrouped: {
|
||||||
|
default: false
|
||||||
|
}
|
||||||
|
},
|
||||||
props: {
|
props: {
|
||||||
type: {
|
type: {
|
||||||
type: String,
|
type: String,
|
||||||
@ -20,7 +30,9 @@ export default Vue.extend({
|
|||||||
inline: {
|
inline: {
|
||||||
type: Boolean,
|
type: Boolean,
|
||||||
required: false,
|
required: false,
|
||||||
default: false
|
default(): boolean {
|
||||||
|
return this.horizonGrouped;
|
||||||
|
}
|
||||||
},
|
},
|
||||||
link: {
|
link: {
|
||||||
type: Boolean,
|
type: Boolean,
|
||||||
|
@ -48,6 +48,9 @@ export default Vue.extend({
|
|||||||
&.fit-top
|
&.fit-top
|
||||||
padding-top 0
|
padding-top 0
|
||||||
|
|
||||||
|
&.fit-bottom
|
||||||
|
padding-bottom 0
|
||||||
|
|
||||||
> header
|
> header
|
||||||
margin-bottom 16px
|
margin-bottom 16px
|
||||||
font-weight bold
|
font-weight bold
|
||||||
|
35
src/client/app/common/views/components/ui/horizon-group.vue
Normal file
35
src/client/app/common/views/components/ui/horizon-group.vue
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
<template>
|
||||||
|
<div class="pfzekjfwkwvadvlujpdnnxfggqgqjoze" :class="{ inputs }">
|
||||||
|
<slot></slot>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts">
|
||||||
|
import Vue from 'vue';
|
||||||
|
export default Vue.extend({
|
||||||
|
provide: {
|
||||||
|
horizonGrouped: true
|
||||||
|
},
|
||||||
|
props: {
|
||||||
|
inputs: {
|
||||||
|
type: Boolean,
|
||||||
|
required: false,
|
||||||
|
default: false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="stylus" scoped>
|
||||||
|
.pfzekjfwkwvadvlujpdnnxfggqgqjoze
|
||||||
|
display flex
|
||||||
|
|
||||||
|
&.inputs
|
||||||
|
margin 32px 0
|
||||||
|
|
||||||
|
> *
|
||||||
|
flex 1
|
||||||
|
|
||||||
|
&:not(:last-child)
|
||||||
|
margin-right 16px
|
||||||
|
</style>
|
@ -1,7 +1,7 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="ymxyweixqwsxauxldgpvecjepnwxbylu" :class="{ warn }">
|
<div class="ymxyweixqwsxauxldgpvecjepnwxbylu" :class="{ warn }">
|
||||||
<i v-if="warn">%fa:exclamation-triangle%</i>
|
<i v-if="warn"><fa icon="exclamation-triangle"/></i>
|
||||||
<i v-else>%fa:info-circle%</i>
|
<i v-else><fa icon="info-circle"/></i>
|
||||||
<slot></slot>
|
<slot></slot>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="ui-input" :class="[{ focused, filled }, styl]">
|
<div class="ui-input" :class="[{ focused, filled, inline, disabled }, styl]">
|
||||||
<div class="icon" ref="icon"><slot name="icon"></slot></div>
|
<div class="icon" ref="icon"><slot name="icon"></slot></div>
|
||||||
<div class="input">
|
<div class="input">
|
||||||
<div class="password-meter" v-if="withPasswordMeter" v-show="passwordStrength != ''" :data-strength="passwordStrength">
|
<div class="password-meter" v-if="withPasswordMeter" v-show="passwordStrength != ''" :data-strength="passwordStrength">
|
||||||
@ -11,6 +11,7 @@
|
|||||||
<input ref="input"
|
<input ref="input"
|
||||||
:type="type"
|
:type="type"
|
||||||
v-model="v"
|
v-model="v"
|
||||||
|
:disabled="disabled"
|
||||||
:required="required"
|
:required="required"
|
||||||
:readonly="readonly"
|
:readonly="readonly"
|
||||||
:pattern="pattern"
|
:pattern="pattern"
|
||||||
@ -41,6 +42,11 @@ import Vue from 'vue';
|
|||||||
const getPasswordStrength = require('syuilo-password-strength');
|
const getPasswordStrength = require('syuilo-password-strength');
|
||||||
|
|
||||||
export default Vue.extend({
|
export default Vue.extend({
|
||||||
|
inject: {
|
||||||
|
horizonGrouped: {
|
||||||
|
default: false
|
||||||
|
}
|
||||||
|
},
|
||||||
props: {
|
props: {
|
||||||
value: {
|
value: {
|
||||||
required: false
|
required: false
|
||||||
@ -57,6 +63,10 @@ export default Vue.extend({
|
|||||||
type: Boolean,
|
type: Boolean,
|
||||||
required: false
|
required: false
|
||||||
},
|
},
|
||||||
|
disabled: {
|
||||||
|
type: Boolean,
|
||||||
|
required: false
|
||||||
|
},
|
||||||
pattern: {
|
pattern: {
|
||||||
type: String,
|
type: String,
|
||||||
required: false
|
required: false
|
||||||
@ -72,6 +82,13 @@ export default Vue.extend({
|
|||||||
required: false,
|
required: false,
|
||||||
default: false
|
default: false
|
||||||
},
|
},
|
||||||
|
inline: {
|
||||||
|
type: Boolean,
|
||||||
|
required: false,
|
||||||
|
default(): boolean {
|
||||||
|
return this.horizonGrouped;
|
||||||
|
}
|
||||||
|
},
|
||||||
styl: {
|
styl: {
|
||||||
type: String,
|
type: String,
|
||||||
required: false,
|
required: false,
|
||||||
@ -337,4 +354,14 @@ root(fill)
|
|||||||
&:not(.fill)
|
&:not(.fill)
|
||||||
root(false)
|
root(false)
|
||||||
|
|
||||||
|
&.inline
|
||||||
|
display inline-block
|
||||||
|
margin 0
|
||||||
|
|
||||||
|
&.disabled
|
||||||
|
opacity 0.7
|
||||||
|
|
||||||
|
&, *
|
||||||
|
cursor not-allowed !important
|
||||||
|
|
||||||
</style>
|
</style>
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
<ol v-if="uploads.length > 0">
|
<ol v-if="uploads.length > 0">
|
||||||
<li v-for="ctx in uploads" :key="ctx.id">
|
<li v-for="ctx in uploads" :key="ctx.id">
|
||||||
<div class="img" :style="{ backgroundImage: `url(${ ctx.img })` }"></div>
|
<div class="img" :style="{ backgroundImage: `url(${ ctx.img })` }"></div>
|
||||||
<p class="name">%fa:spinner .pulse%{{ ctx.name }}</p>
|
<p class="name"><fa icon="spinner .pulse"/>{{ ctx.name }}</p>
|
||||||
<p class="status">
|
<p class="status">
|
||||||
<span class="initing" v-if="ctx.progress == undefined">%i18n:@waiting%<mk-ellipsis/></span>
|
<span class="initing" v-if="ctx.progress == undefined">%i18n:@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>
|
<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>
|
||||||
@ -155,7 +155,7 @@ export default Vue.extend({
|
|||||||
text-overflow ellipsis
|
text-overflow ellipsis
|
||||||
overflow hidden
|
overflow hidden
|
||||||
|
|
||||||
> [data-fa]
|
> [data-icon]
|
||||||
margin-right 4px
|
margin-right 4px
|
||||||
|
|
||||||
> .status
|
> .status
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
<span class="pathname" v-if="pathname != ''">{{ pathname }}</span>
|
<span class="pathname" v-if="pathname != ''">{{ pathname }}</span>
|
||||||
<span class="query">{{ query }}</span>
|
<span class="query">{{ query }}</span>
|
||||||
<span class="hash">{{ hash }}</span>
|
<span class="hash">{{ hash }}</span>
|
||||||
%fa:external-link-square-alt%
|
<fa icon="external-link-square-alt"/>
|
||||||
</a>
|
</a>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
@ -40,7 +40,7 @@ export default Vue.extend({
|
|||||||
<style lang="stylus" scoped>
|
<style lang="stylus" scoped>
|
||||||
.mk-url
|
.mk-url
|
||||||
word-break break-all
|
word-break break-all
|
||||||
> [data-fa]
|
> [data-icon]
|
||||||
padding-left 2px
|
padding-left 2px
|
||||||
font-size .9em
|
font-size .9em
|
||||||
font-weight 400
|
font-weight 400
|
||||||
|
@ -3,34 +3,34 @@
|
|||||||
<div class="backdrop" ref="backdrop" @click="close"></div>
|
<div class="backdrop" ref="backdrop" @click="close"></div>
|
||||||
<div class="popover" :class="{ compact }" ref="popover">
|
<div class="popover" :class="{ compact }" ref="popover">
|
||||||
<div @click="choose('public')" :class="{ active: v == 'public' }">
|
<div @click="choose('public')" :class="{ active: v == 'public' }">
|
||||||
<div>%fa:globe%</div>
|
<div><fa icon="globe"/></div>
|
||||||
<div>
|
<div>
|
||||||
<span>%i18n:@public%</span>
|
<span>%i18n:@public%</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div @click="choose('home')" :class="{ active: v == 'home' }">
|
<div @click="choose('home')" :class="{ active: v == 'home' }">
|
||||||
<div>%fa:home%</div>
|
<div><fa icon="home"/></div>
|
||||||
<div>
|
<div>
|
||||||
<span>%i18n:@home%</span>
|
<span>%i18n:@home%</span>
|
||||||
<span>%i18n:@home-desc%</span>
|
<span>%i18n:@home-desc%</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div @click="choose('followers')" :class="{ active: v == 'followers' }">
|
<div @click="choose('followers')" :class="{ active: v == 'followers' }">
|
||||||
<div>%fa:unlock%</div>
|
<div><fa icon="unlock"/></div>
|
||||||
<div>
|
<div>
|
||||||
<span>%i18n:@followers%</span>
|
<span>%i18n:@followers%</span>
|
||||||
<span>%i18n:@followers-desc%</span>
|
<span>%i18n:@followers-desc%</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div @click="choose('specified')" :class="{ active: v == 'specified' }">
|
<div @click="choose('specified')" :class="{ active: v == 'specified' }">
|
||||||
<div>%fa:envelope%</div>
|
<div><fa icon="envelope"/></div>
|
||||||
<div>
|
<div>
|
||||||
<span>%i18n:@specified%</span>
|
<span>%i18n:@specified%</span>
|
||||||
<span>%i18n:@specified-desc%</span>
|
<span>%i18n:@specified-desc%</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div @click="choose('private')" :class="{ active: v == 'private' }">
|
<div @click="choose('private')" :class="{ active: v == 'private' }">
|
||||||
<div>%fa:lock%</div>
|
<div><fa icon="lock"/></div>
|
||||||
<div>
|
<div>
|
||||||
<span>%i18n:@private%</span>
|
<span>%i18n:@private%</span>
|
||||||
</div>
|
</div>
|
||||||
|
@ -14,7 +14,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</header>
|
</header>
|
||||||
<div class="text">
|
<div class="text">
|
||||||
<misskey-flavored-markdown v-if="note.text" :text="note.text"/>
|
<misskey-flavored-markdown v-if="note.text" :text="note.text" :customEmojis="note.emojis"/>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -109,7 +109,7 @@ class Autocomplete {
|
|||||||
|
|
||||||
if (isEmoji && opened == false) {
|
if (isEmoji && opened == false) {
|
||||||
const emoji = text.substr(emojiIndex + 1);
|
const emoji = text.substr(emojiIndex + 1);
|
||||||
if (emoji != '' && emoji.match(/^[\+\-a-z0-9_]+$/)) {
|
if (!emoji.includes(' ')) {
|
||||||
this.open('emoji', emoji);
|
this.open('emoji', emoji);
|
||||||
opened = true;
|
opened = true;
|
||||||
}
|
}
|
||||||
@ -145,6 +145,7 @@ class Autocomplete {
|
|||||||
} else {
|
} else {
|
||||||
// サジェスト要素作成
|
// サジェスト要素作成
|
||||||
this.suggestion = new MkAutocomplete({
|
this.suggestion = new MkAutocomplete({
|
||||||
|
parent: this.vm,
|
||||||
propsData: {
|
propsData: {
|
||||||
textarea: this.textarea,
|
textarea: this.textarea,
|
||||||
complete: this.complete,
|
complete: this.complete,
|
||||||
@ -222,8 +223,6 @@ class Autocomplete {
|
|||||||
const trimmedBefore = before.substring(0, before.lastIndexOf(':'));
|
const trimmedBefore = before.substring(0, before.lastIndexOf(':'));
|
||||||
const after = source.substr(caret);
|
const after = source.substr(caret);
|
||||||
|
|
||||||
if (value.startsWith(':')) value = value + ' ';
|
|
||||||
|
|
||||||
// 挿入
|
// 挿入
|
||||||
this.text = trimmedBefore + value + after;
|
this.text = trimmedBefore + value + after;
|
||||||
|
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
import Vue from 'vue';
|
import Vue from 'vue';
|
||||||
|
|
||||||
Vue.filter('bytes', (v, digits = 0) => {
|
Vue.filter('bytes', (v, digits = 0) => {
|
||||||
|
if (v == null) return '?';
|
||||||
const sizes = ['B', 'KB', 'MB', 'GB', 'TB'];
|
const sizes = ['B', 'KB', 'MB', 'GB', 'TB'];
|
||||||
if (v == 0) return '0';
|
if (v == 0) return '0';
|
||||||
const isMinus = v < 0;
|
const isMinus = v < 0;
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
import Vue from 'vue';
|
import Vue from 'vue';
|
||||||
|
|
||||||
Vue.filter('number', (n) => {
|
Vue.filter('number', (n) => {
|
||||||
|
if (n == null) return 'N/A';
|
||||||
return n.toLocaleString();
|
return n.toLocaleString();
|
||||||
});
|
});
|
||||||
|
@ -19,13 +19,13 @@
|
|||||||
@click="onClick"
|
@click="onClick"
|
||||||
:disabled="followWait">
|
:disabled="followWait">
|
||||||
<template v-if="!followWait">
|
<template v-if="!followWait">
|
||||||
<template v-if="user.hasPendingFollowRequestFromYou && user.isLocked">%fa:hourglass-half% %i18n:@request-pending%</template>
|
<template v-if="user.hasPendingFollowRequestFromYou && user.isLocked"><fa icon="hourglass-half"/> %i18n:@request-pending%</template>
|
||||||
<template v-else-if="user.hasPendingFollowRequestFromYou && !user.isLocked">%fa:hourglass-start% %i18n:@follow-processing%</template>
|
<template v-else-if="user.hasPendingFollowRequestFromYou && !user.isLocked"><fa icon="hourglass-start"/> %i18n:@follow-processing%</template>
|
||||||
<template v-else-if="user.isFollowing">%fa:minus% %i18n:@following%</template>
|
<template v-else-if="user.isFollowing"><fa icon="minus"/> %i18n:@following%</template>
|
||||||
<template v-else-if="!user.isFollowing && user.isLocked">%fa:plus% %i18n:@follow-request%</template>
|
<template v-else-if="!user.isFollowing && user.isLocked"><fa icon="plus"/> %i18n:@follow-request%</template>
|
||||||
<template v-else-if="!user.isFollowing && !user.isLocked">%fa:plus% %i18n:@follow%</template>
|
<template v-else-if="!user.isFollowing && !user.isLocked"><fa icon="plus"/> %i18n:@follow%</template>
|
||||||
</template>
|
</template>
|
||||||
<template v-else>%fa:spinner .pulse .fw%</template>
|
<template v-else><fa icon="spinner .pulse" fixed-width/></template>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
<div>
|
<div>
|
||||||
<mk-widget-container :show-header="false">
|
<mk-widget-container :show-header="false">
|
||||||
<article class="dolfvtibguprpxxhfndqaosjitixjohx">
|
<article class="dolfvtibguprpxxhfndqaosjitixjohx">
|
||||||
<h1>%fa:heart%%i18n:@title%</h1>
|
<h1><fa icon="heart"/>%i18n:@title%</h1>
|
||||||
<p v-if="meta">
|
<p v-if="meta">
|
||||||
{{ '%i18n:@text%'.substr(0, '%i18n:@text%'.indexOf('{')) }}
|
{{ '%i18n:@text%'.substr(0, '%i18n:@text%'.indexOf('{')) }}
|
||||||
<a :href="meta.maintainer.url">{{ meta.maintainer.name }}</a>
|
<a :href="meta.maintainer.url">{{ meta.maintainer.name }}</a>
|
||||||
@ -41,7 +41,7 @@ export default define({
|
|||||||
margin 0 0 5px 0
|
margin 0 0 5px 0
|
||||||
font-size 1em
|
font-size 1em
|
||||||
|
|
||||||
> [data-fa]
|
> [data-icon]
|
||||||
margin-right 0.25em
|
margin-right 0.25em
|
||||||
|
|
||||||
> p
|
> p
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="mkw-hashtags">
|
<div class="mkw-hashtags">
|
||||||
<mk-widget-container :show-header="!props.compact">
|
<mk-widget-container :show-header="!props.compact">
|
||||||
<template slot="header">%fa:hashtag%%i18n:@title%</template>
|
<template slot="header"><fa icon="hashtag"/>%i18n:@title%</template>
|
||||||
|
|
||||||
<div class="mkw-hashtags--body" :data-mobile="platform == 'mobile'">
|
<div class="mkw-hashtags--body" :data-mobile="platform == 'mobile'">
|
||||||
<mk-trends/>
|
<mk-trends/>
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="mkw-memo">
|
<div class="mkw-memo">
|
||||||
<mk-widget-container :show-header="!props.compact">
|
<mk-widget-container :show-header="!props.compact">
|
||||||
<template slot="header">%fa:R sticky-note%%i18n:@title%</template>
|
<template slot="header"><fa :icon="['far', 'sticky-note']"/>%i18n:@title%</template>
|
||||||
|
|
||||||
<div class="mkw-memo--body">
|
<div class="mkw-memo--body">
|
||||||
<textarea v-model="text" placeholder="%i18n:@memo%" @input="onChange"></textarea>
|
<textarea v-model="text" placeholder="%i18n:@memo%" @input="onChange"></textarea>
|
||||||
|
@ -1,9 +1,9 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="mkw-photo-stream" :class="$style.root" :data-melt="props.design == 2">
|
<div class="mkw-photo-stream" :class="$style.root" :data-melt="props.design == 2">
|
||||||
<mk-widget-container :show-header="props.design == 0" :naked="props.design == 2">
|
<mk-widget-container :show-header="props.design == 0" :naked="props.design == 2">
|
||||||
<template slot="header">%fa:camera%%i18n:@title%</template>
|
<template slot="header"><fa icon="camera"/>%i18n:@title%</template>
|
||||||
|
|
||||||
<p :class="$style.fetching" v-if="fetching">%fa:spinner .pulse .fw%%i18n:common.loading%<mk-ellipsis/></p>
|
<p :class="$style.fetching" v-if="fetching"><fa icon="spinner .pulse" fixed-width/>%i18n:common.loading%<mk-ellipsis/></p>
|
||||||
<div :class="$style.stream" v-if="!fetching && images.length > 0">
|
<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})`"></div>
|
||||||
</div>
|
</div>
|
||||||
@ -94,7 +94,7 @@ export default define({
|
|||||||
text-align center
|
text-align center
|
||||||
color #aaa
|
color #aaa
|
||||||
|
|
||||||
> [data-fa]
|
> [data-icon]
|
||||||
margin-right 4px
|
margin-right 4px
|
||||||
|
|
||||||
</style>
|
</style>
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="mkw-posts-monitor">
|
<div class="mkw-posts-monitor">
|
||||||
<mk-widget-container :show-header="props.design == 0" :naked="props.design == 2">
|
<mk-widget-container :show-header="props.design == 0" :naked="props.design == 2">
|
||||||
<template slot="header">%fa:chart-line%%i18n:@title%</template>
|
<template slot="header"><fa icon="chart-line"/>%i18n:@title%</template>
|
||||||
<button slot="func" @click="toggle" title="%i18n:@toggle%">%fa:sort%</button>
|
<button slot="func" @click="toggle" title="%i18n:@toggle%"><fa icon="sort"/></button>
|
||||||
|
|
||||||
<div class="qpdmibaztplkylerhdbllwcokyrfxeyj" :class="{ dual: props.view == 0 }">
|
<div class="qpdmibaztplkylerhdbllwcokyrfxeyj" :class="{ dual: props.view == 0 }">
|
||||||
<svg :viewBox="`0 0 ${ viewBoxX } ${ viewBoxY }`" v-show="props.view != 2">
|
<svg :viewBox="`0 0 ${ viewBoxX } ${ viewBoxY }`" v-show="props.view != 2">
|
||||||
|
@ -1,11 +1,11 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="mkw-rss">
|
<div class="mkw-rss">
|
||||||
<mk-widget-container :show-header="!props.compact">
|
<mk-widget-container :show-header="!props.compact">
|
||||||
<template slot="header">%fa:rss-square%RSS</template>
|
<template slot="header"><fa icon="rss-square"/>RSS</template>
|
||||||
<button slot="func" title="設定" @click="setting">%fa:cog%</button>
|
<button slot="func" title="設定" @click="setting"><fa icon="cog"/></button>
|
||||||
|
|
||||||
<div class="mkw-rss--body" :data-mobile="platform == 'mobile'">
|
<div class="mkw-rss--body" :data-mobile="platform == 'mobile'">
|
||||||
<p class="fetching" v-if="fetching">%fa:spinner .pulse .fw%%i18n:common.loading%<mk-ellipsis/></p>
|
<p class="fetching" v-if="fetching"><fa icon="spinner .pulse" fixed-width/>%i18n:common.loading%<mk-ellipsis/></p>
|
||||||
<div class="feed" v-else>
|
<div class="feed" v-else>
|
||||||
<a v-for="item in items" :href="item.link" target="_blank">{{ item.title }}</a>
|
<a v-for="item in items" :href="item.link" target="_blank">{{ item.title }}</a>
|
||||||
</div>
|
</div>
|
||||||
@ -85,7 +85,7 @@ export default define({
|
|||||||
text-align center
|
text-align center
|
||||||
color #aaa
|
color #aaa
|
||||||
|
|
||||||
> [data-fa]
|
> [data-icon]
|
||||||
margin-right 4px
|
margin-right 4px
|
||||||
|
|
||||||
&[data-mobile]
|
&[data-mobile]
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
<div class="cpu">
|
<div class="cpu">
|
||||||
<x-pie class="pie" :value="usage"/>
|
<x-pie class="pie" :value="usage"/>
|
||||||
<div>
|
<div>
|
||||||
<p>%fa:microchip%CPU</p>
|
<p><fa icon="microchip"/>CPU</p>
|
||||||
<p>{{ meta.cpu.cores }} Cores</p>
|
<p>{{ meta.cpu.cores }} Cores</p>
|
||||||
<p>{{ meta.cpu.model }}</p>
|
<p>{{ meta.cpu.model }}</p>
|
||||||
</div>
|
</div>
|
||||||
@ -57,7 +57,7 @@ export default Vue.extend({
|
|||||||
&:first-child
|
&:first-child
|
||||||
font-weight bold
|
font-weight bold
|
||||||
|
|
||||||
> [data-fa]
|
> [data-icon]
|
||||||
margin-right 4px
|
margin-right 4px
|
||||||
|
|
||||||
&:after
|
&:after
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user