Compare commits
271 Commits
Author | SHA1 | Date | |
---|---|---|---|
fdcc994291 | |||
f54363076c | |||
ec016e5a95 | |||
bbdb2496a4 | |||
b515cc90e9 | |||
bb92158dff | |||
c652add16a | |||
b8a7468c4a | |||
e220ef3e75 | |||
4bb4903ee5 | |||
9487840ae3 | |||
7e3a8d56e6 | |||
e909eac296 | |||
8dc7f28744 | |||
a4b1e8ca26 | |||
79b0cc6785 | |||
00b134ce1e | |||
b3fc4dc00f | |||
d06fbbe3ea | |||
28bfb45426 | |||
1c60a49c96 | |||
3ae8ff083b | |||
c12ccb2a15 | |||
e3b1d00e4c | |||
98795aad9a | |||
ca26edbfce | |||
3058e8f354 | |||
4c9b66b0f0 | |||
6eb9ba31bf | |||
5bbf4187e6 | |||
f2425f71c2 | |||
b0e00da2f7 | |||
215472cd17 | |||
072fd4455e | |||
2ed9e26a4f | |||
8a3e26cdb8 | |||
7301671962 | |||
0d0f25818e | |||
7850d68dc2 | |||
f0f5b32300 | |||
1ca0976e85 | |||
7fbfd17896 | |||
3d04f7db62 | |||
e301630c9d | |||
afbccaae41 | |||
893c01c207 | |||
41c80097ce | |||
250933fff3 | |||
bc9454f67c | |||
377a7fdf3e | |||
645f661911 | |||
db7c83c8ff | |||
97385db5b5 | |||
c69d57a064 | |||
a488d6e2d6 | |||
85e8b1fbf4 | |||
78763116c3 | |||
103fe8b91d | |||
311e67047d | |||
62d41023e1 | |||
5fac7c1718 | |||
ade01139ca | |||
5ea8e9c787 | |||
e5cfdbf372 | |||
d2cc5c3b63 | |||
7cdd90db09 | |||
aad1b8c12e | |||
2519abdd39 | |||
e8d0568a11 | |||
031287aebd | |||
b24de13a37 | |||
c113fdc20e | |||
1af1638e2b | |||
8c62aafa97 | |||
4de62220e3 | |||
e5d9381503 | |||
5621113d1f | |||
d906d90010 | |||
b836528b51 | |||
4b191c7f68 | |||
f9f70d5df4 | |||
50b809784f | |||
54ce19bd56 | |||
71210595d2 | |||
085325e65f | |||
e4c0c8869e | |||
405f98d6d1 | |||
870ab3d3b6 | |||
9ac2913afc | |||
171651484a | |||
bfadb4026d | |||
3940a9a447 | |||
714446fb46 | |||
e806f33f9f | |||
65ee1711e5 | |||
ef92578555 | |||
0352fd0acd | |||
fffce73d3e | |||
717f66b4a6 | |||
7dcea49be7 | |||
7c91915e50 | |||
895e80d794 | |||
be5714a9f1 | |||
1ba8374292 | |||
94154a1aa2 | |||
5ae576bad1 | |||
f9e6c84d00 | |||
3ab5d2e0e1 | |||
b8f60527f6 | |||
a83c3557fc | |||
a45abf858f | |||
a82eeb7e92 | |||
3781f07c49 | |||
990bc976de | |||
ff2fc2267d | |||
ec50240a03 | |||
bf00b59339 | |||
456b01590b | |||
5eeec0becb | |||
e5fcb2aea0 | |||
d717b1d404 | |||
2334b41375 | |||
6f6974a6ae | |||
0854f2e180 | |||
a0f8c7e94e | |||
1f5e3040ed | |||
6128e62751 | |||
7c6088b2b4 | |||
9450e567c6 | |||
c9c2e36540 | |||
fbfd3a60ed | |||
9b386fd50e | |||
db5a404081 | |||
3bffe605f7 | |||
4e92eb55cd | |||
6667ddbc26 | |||
16e4bb7f79 | |||
821182cad5 | |||
b3730e3373 | |||
741efa1a9a | |||
de1a7b4364 | |||
85cd647946 | |||
da7d1938c9 | |||
5a795c4ab2 | |||
95d4937e16 | |||
6bbc6a80b2 | |||
79d2374d8e | |||
e4601962d0 | |||
4398651841 | |||
42cd7c8a75 | |||
501379c82c | |||
92b45d1a9d | |||
3330c3f548 | |||
3552b1c900 | |||
428d27a27b | |||
4f6e387d49 | |||
01c0253c89 | |||
76fcf122f9 | |||
926ad23033 | |||
b956d63c46 | |||
1970927b5e | |||
3995ae0957 | |||
c2a840fa19 | |||
c7a6321a08 | |||
0c42c54b7a | |||
8b775c85f6 | |||
5c14ff661f | |||
160c1a3022 | |||
7017d3ae07 | |||
5eca0a31f7 | |||
44d53488e0 | |||
d731c7da13 | |||
225544e985 | |||
e2f7e82cac | |||
0be7bf93d9 | |||
75f9e6bdf5 | |||
8f6ea13696 | |||
f434b3a875 | |||
70b980d463 | |||
a59cf87374 | |||
c9a9d5dbfd | |||
e0480f4e01 | |||
d8cfd8f56d | |||
593d3e2d55 | |||
a79901b441 | |||
4c526f2837 | |||
3c28dd92ec | |||
d09af4754a | |||
44ab6cbc39 | |||
6c42db7589 | |||
20dfd2faca | |||
13696a85ee | |||
4632eecb76 | |||
44a3df0acf | |||
4ab96251f5 | |||
b795379417 | |||
aa9ba31675 | |||
ad66c8478a | |||
4ec64b4c57 | |||
2f0b75a882 | |||
912ee60781 | |||
67dacb7725 | |||
82f1fc6cda | |||
4d24741d48 | |||
931f17c589 | |||
ff898b4c20 | |||
7b507c8480 | |||
bb688f78fc | |||
a2a31236f6 | |||
0b191b4d0e | |||
2e97f29411 | |||
eb1ad54427 | |||
e4974392e5 | |||
4e0d43b45a | |||
78c185a05a | |||
fa124abbe2 | |||
f4fa3f031e | |||
3cc7a99d0f | |||
8bf9e87117 | |||
97e8ac1d27 | |||
45fb2ecb3a | |||
d5e80caac8 | |||
7ceea61170 | |||
a3ce65ee28 | |||
d6b7a048e4 | |||
f7c8e31b36 | |||
26c327145f | |||
b7afd07d6a | |||
eaff52548f | |||
76828adc54 | |||
198b0b3de3 | |||
3cdee2732a | |||
27a7bb7229 | |||
cf38a6d0a0 | |||
02c88f9b3b | |||
3ac1077b36 | |||
2b4f6abc15 | |||
7bd24348d2 | |||
c49ae672f2 | |||
2eb2cc7880 | |||
f2f3d4beec | |||
3fd1ea900a | |||
c815d11ed2 | |||
350151ca5b | |||
4339f9af29 | |||
b44227948d | |||
5dc8c8846d | |||
e1bee8adf3 | |||
b9ef750321 | |||
e05c0e7d37 | |||
a3eb0ddc4f | |||
da6e71f2e0 | |||
09e08e829d | |||
1b78ae6290 | |||
97f5ba0bc5 | |||
8e29ccdc7f | |||
4e48214068 | |||
1bd128d507 | |||
bfc1f8a25d | |||
6369d79aaf | |||
2df2cf0983 | |||
c93fe423ea | |||
ecac2990eb | |||
a483af1b08 | |||
01584a6bf9 | |||
443f967611 | |||
bf931f2c82 | |||
5b32b900e4 | |||
0bdcb15b3b | |||
1b316ab98b | |||
4cd79dd530 |
@ -30,17 +30,17 @@ jobs:
|
|||||||
steps:
|
steps:
|
||||||
- checkout
|
- checkout
|
||||||
- run:
|
- run:
|
||||||
name: Ensure package-lock.json
|
name: Ensure yarn.lock
|
||||||
command: |
|
command: |
|
||||||
[ ! -e package-lock.json ] && echo '{}' > package-lock.json
|
touch yarn.lock
|
||||||
- restore_cache:
|
- restore_cache:
|
||||||
name: Restore npm package caches
|
name: Restore npm package caches
|
||||||
keys:
|
keys:
|
||||||
- npm-v1-arch-{{ arch }}-env-{{ .Environment.variableName }}-package-{{ checksum "package.json" }}-lock-{{ checksum "package-lock.json" }}-
|
- yarn-v1-arch-{{ arch }}-env-{{ .Environment.variableName }}-package-{{ checksum "package.json" }}-lock-{{ checksum "yarn.lock" }}
|
||||||
- npm-v1-arch-{{ arch }}-env-{{ .Environment.variableName }}-package-{{ checksum "package.json" }}-
|
- yarn-v1-arch-{{ arch }}-env-{{ .Environment.variableName }}-package-{{ checksum "package.json" }}-
|
||||||
- npm-v1-arch-{{ arch }}-env-{{ .Environment.variableName }}-
|
- yarn-v1-arch-{{ arch }}-env-{{ .Environment.variableName }}-
|
||||||
- npm-v1-arch-{{ arch }}-
|
- yarn-v1-arch-{{ arch }}-
|
||||||
- npm-v1-
|
- yarn-v1-
|
||||||
- run:
|
- run:
|
||||||
name: Install Dependencies
|
name: Install Dependencies
|
||||||
command: |
|
command: |
|
||||||
@ -54,13 +54,13 @@ jobs:
|
|||||||
- run:
|
- run:
|
||||||
name: Build
|
name: Build
|
||||||
command: |
|
command: |
|
||||||
node-gyp configure
|
yarn install
|
||||||
node-gyp build
|
yarn autoclean
|
||||||
npm run build || (echo -e '\033[0;34mRebuild modules\033[0;39m' && ls -1A node_modules | grep '^[^@]' | xargs npm rebuild && ls -1A node_modules | grep '^@' | xargs -I%1 sh -c 'ls -1A node_modules/'%1' | xargs -P0 -I%2 npm rebuild node_modules/'%1'/%2' && npm run build)
|
yarn build
|
||||||
ls -1ARl node_modules > ls
|
touch yarn.lock
|
||||||
- save_cache:
|
- save_cache:
|
||||||
name: Cache npm packages
|
name: Cache npm packages
|
||||||
key: npm-v1-arch-{{ arch }}-env-{{ .Environment.variableName }}-package-{{ checksum "package.json" }}-lock-{{ checksum "package-lock.json" }}-ls-{{ checksum "ls" }}
|
key: yarn-v1-arch-{{ arch }}-env-{{ .Environment.variableName }}-package-{{ checksum "package.json" }}-lock-{{ checksum "yarn.lock" }}
|
||||||
paths:
|
paths:
|
||||||
- node_modules
|
- node_modules
|
||||||
# - store_artifacts:
|
# - store_artifacts:
|
||||||
@ -90,11 +90,11 @@ jobs:
|
|||||||
- run:
|
- run:
|
||||||
name: Test
|
name: Test
|
||||||
command: |
|
command: |
|
||||||
npm run test
|
yarn test
|
||||||
ls -1ARl node_modules > ls
|
touch yarn.lock
|
||||||
- save_cache:
|
- save_cache:
|
||||||
name: Cache npm packages
|
name: Cache npm packages
|
||||||
key: npm-v1-arch-{{ arch }}-env-{{ .Environment.variableName }}-package-{{ checksum "package.json" }}-lock-{{ checksum "package-lock.json" }}-ls-{{ checksum "ls" }}
|
key: yarn-v1-arch-{{ arch }}-env-{{ .Environment.variableName }}-package-{{ checksum "package.json" }}-lock-{{ checksum "yarn.lock" }}
|
||||||
paths:
|
paths:
|
||||||
- node_modules
|
- node_modules
|
||||||
|
|
||||||
|
39
.github/CODEOWNERS
vendored
Normal file
39
.github/CODEOWNERS
vendored
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
# PATH OWNERS
|
||||||
|
/.autogen/ @acid-chicken
|
||||||
|
/.circleci/ @syuilo @acid-chicken
|
||||||
|
/.config/ @syuilo @AyaMorisawa @mei23 @acid-chicken
|
||||||
|
# /.config/mongo_initdb_example.js @khws4v1
|
||||||
|
/.github/ @syuilo @AyaMorisawa @acid-chicken
|
||||||
|
/.vscode/ @acid-chicken
|
||||||
|
/assets/ @syuilo # @tamaina
|
||||||
|
/cli/ @syuilo
|
||||||
|
/docs/ @syuilo
|
||||||
|
/docs/*.en.md @AyaMorisawa # @skid9000
|
||||||
|
# /docs/*.fr.md @BoFFire
|
||||||
|
# /docs/docker.*.md @khws4v1
|
||||||
|
/locales/ @syuilo
|
||||||
|
/src/ @syuilo @AyaMorisawa @mei23 @acid-chicken
|
||||||
|
# /src/crypto_key.cc @akihikodaki
|
||||||
|
# /src/crypto_key.d.ts @akihikodaki
|
||||||
|
/.dockerignore @syuilo # @khws4v1
|
||||||
|
/.editorconfig @syuilo @AyaMorisawa
|
||||||
|
/.eslintrc @syuilo
|
||||||
|
/.gitattributes @syuilo
|
||||||
|
/.gitignore @syuilo
|
||||||
|
/.npmrc @syuilo
|
||||||
|
/.vsls.json @AyaMorisawa
|
||||||
|
/CHANGELOG.md @syuilo
|
||||||
|
/CODE_OF_CONDUCT.md @syuilo
|
||||||
|
/CONTRIBUTING.md @syuilo
|
||||||
|
/Dockerfile @syuilo @AyaMorisawa @acid-chicken # @khws4v1
|
||||||
|
/LICENSE @syuilo
|
||||||
|
/README.md @syuilo @AyaMorisawa @acid-chicken # @nikhiljha
|
||||||
|
# /binding.gyp @akihikodaki
|
||||||
|
/crowdin.yml @syuilo
|
||||||
|
# /docker-compose.yml @khws4v1
|
||||||
|
/gulpfile.ts @syuilo @AyaMorisawa
|
||||||
|
/jsconfig.json @syuilo @AyaMorisawa
|
||||||
|
/package.json @syuilo @AyaMorisawa
|
||||||
|
/tsconfig.json @syuilo @AyaMorisawa
|
||||||
|
/tslint.json @syuilo @AyaMorisawa
|
||||||
|
/webpack.config.ts @syuilo @AyaMorisawa
|
55
CHANGELOG.md
55
CHANGELOG.md
@ -1,6 +1,61 @@
|
|||||||
ChangeLog
|
ChangeLog
|
||||||
=========
|
=========
|
||||||
|
|
||||||
|
10.80.0
|
||||||
|
----------
|
||||||
|
* サイレンス機能の追加
|
||||||
|
* リプライ/メンションされていれば非フォロワーへのフォロワー限定でも参照可能に
|
||||||
|
* MFMの解析を強化
|
||||||
|
* Misskey以外のインスタンスからMisskeyの投稿を見たときに改行が多い問題を修正
|
||||||
|
* Misskey以外のインスタンスからMisskeyの投稿を見たときにメンションのURLが展開されるのを修正
|
||||||
|
|
||||||
|
10.79.1
|
||||||
|
----------
|
||||||
|
* jump構文の追加
|
||||||
|
* MFMで左回転、往復回転を行えるように
|
||||||
|
* MFMに関する制限を若干緩和
|
||||||
|
* シンタックスハイライトに関するバグ修正
|
||||||
|
|
||||||
|
10.79.0
|
||||||
|
----------
|
||||||
|
* 返信するときにCWを維持するかどうか設定できるように
|
||||||
|
* 外部サービス認証情報の配信
|
||||||
|
* 管理画面のモデレーションのUIを強化
|
||||||
|
* 管理画面からリモートユーザーの情報を更新できるように
|
||||||
|
* 回転構文の追加
|
||||||
|
* 左右反転構文の追加
|
||||||
|
* 複数行の数式構文を追加
|
||||||
|
* シンタックスハイライトの強化
|
||||||
|
* 引用投稿を削除したとき単なるRenoteとしてタイムラインに残る問題を修正
|
||||||
|
* イタリック構文の判定の改善
|
||||||
|
* タイトル構文の判定の改善
|
||||||
|
* テーマが反映されないことがある問題を修正
|
||||||
|
* ホームにフォロワー限定投稿が表示されない問題を修正
|
||||||
|
* 返信一覧を取得すると非公開投稿も取得されてしまう問題を修正
|
||||||
|
* メンション一覧を取得すると非公開投稿も取得されてしまう問題を修正
|
||||||
|
* 通知に非公開投稿が表示される問題を修正
|
||||||
|
* ダイレクトで投稿すると100%の確率で表示が二重になる問題を修正
|
||||||
|
* ウィジットの投稿フォームで投稿するとデフォルトの公開範囲が適用されない問題を修正
|
||||||
|
|
||||||
|
10.78.5
|
||||||
|
----------
|
||||||
|
* アンケートの選択肢にカスタム絵文字を使えるように
|
||||||
|
* 投稿の返信を取得したときにミュートが適用されていない問題を修正
|
||||||
|
* ユーザビリティの強化
|
||||||
|
|
||||||
|
10.78.4
|
||||||
|
----------
|
||||||
|
* フォロワー限定投稿がユーザータイムラインに含まれていない問題を修正
|
||||||
|
* データベースのインデックス設定を修正
|
||||||
|
* UIの修正
|
||||||
|
* など
|
||||||
|
|
||||||
|
10.78.3
|
||||||
|
----------
|
||||||
|
* 投票未対応インスタンス向けメッセージをわかりやすく
|
||||||
|
* リバーシが404になる問題を修正
|
||||||
|
* デザインの修正
|
||||||
|
|
||||||
10.78.2
|
10.78.2
|
||||||
----------
|
----------
|
||||||
* リバーシが404になる問題を修正
|
* リバーシが404になる問題を修正
|
||||||
|
@ -38,3 +38,9 @@ Stands for _**M**iss**k**ey_.
|
|||||||
|
|
||||||
### SW
|
### SW
|
||||||
Stands for _**S**ervice**W**orker_.
|
Stands for _**S**ervice**W**orker_.
|
||||||
|
|
||||||
|
### Nyaize
|
||||||
|
な を にゃ にすること
|
||||||
|
|
||||||
|
#### Denyaize
|
||||||
|
Nyaizeを解除すること
|
||||||
|
28
README.md
28
README.md
@ -13,7 +13,7 @@
|
|||||||
<a href="https://misskey.xyz">Misskey</a> is a decentralized microblogging platform born on Earth.
|
<a href="https://misskey.xyz">Misskey</a> is a decentralized microblogging platform born on Earth.
|
||||||
Since it exists within the Fediverse (a universe where various social media platforms are organized),
|
Since it exists within the Fediverse (a universe where various social media platforms are organized),
|
||||||
it is mutually linked with other social media platforms.
|
it is mutually linked with other social media platforms.
|
||||||
Why don't you take a short break from the hustle and bustle of the city, and dive into a new Internet? <a href="https://joinmisskey.github.io/">Find instance!</a>
|
Why don't you take a short break from the hustle and bustle of the city, and dive into a new Internet? <a href="https://joinmisskey.github.io/">Find an instance!</a>
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<a href="https://www.patreon.com/syuilo"><img src="https://c5.patreon.com/external/logo/become_a_patron_button@2x.png" alt="Become a Patron!" width="160" /></a>
|
<a href="https://www.patreon.com/syuilo"><img src="https://c5.patreon.com/external/logo/become_a_patron_button@2x.png" alt="Become a Patron!" width="160" /></a>
|
||||||
@ -61,7 +61,7 @@ Organize and store your files! Want to post a picture you have already uploaded?
|
|||||||
|
|
||||||
...and more! Experience Misskey with your own eyes at [misskey.xyz](https://misskey.xyz) or join one of the [other instances](https://joinmisskey.github.io/) that are available.
|
...and more! Experience Misskey with your own eyes at [misskey.xyz](https://misskey.xyz) or join one of the [other instances](https://joinmisskey.github.io/) that are available.
|
||||||
|
|
||||||
:package: Create Your Own Instance
|
:package: Create your own instance
|
||||||
----------------------------------------------------------------
|
----------------------------------------------------------------
|
||||||
Please see the [Setup and Installation Guide](./docs/setup.en.md).
|
Please see the [Setup and Installation Guide](./docs/setup.en.md).
|
||||||
|
|
||||||
@ -69,6 +69,22 @@ Please see the [Setup and Installation Guide](./docs/setup.en.md).
|
|||||||
----------------------------------------------------------------
|
----------------------------------------------------------------
|
||||||
Please see the [Contribution Guide](./CONTRIBUTING.md).
|
Please see the [Contribution Guide](./CONTRIBUTING.md).
|
||||||
|
|
||||||
|
### Collaborators
|
||||||
|
<table>
|
||||||
|
<tr>
|
||||||
|
<td><img src="https://avatars3.githubusercontent.com/u/4439005?s=460&v=4" alt="syuilo" width="100"></td>
|
||||||
|
<td><img src="https://avatars0.githubusercontent.com/u/10798641?s=460&v=4" alt="AyaMorisawa" width="100"></td>
|
||||||
|
<td><img src="https://avatars1.githubusercontent.com/u/30769358?s=460&v=4" alt="mei23" width="100"></td>
|
||||||
|
<td><img src="https://avatars2.githubusercontent.com/u/20679825?s=460&v=4" alt="acid-chicken" width="100"></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center"><a href="https://github.com/syuilo">@syuilo</a></td>
|
||||||
|
<td align="center"><a href="https://github.com/AyaMorisawa">@AyaMorisawa</a></td>
|
||||||
|
<td align="center"><a href="https://github.com/mei23">@mei23</a></td>
|
||||||
|
<td align="center"><a href="https://github.com/acid-chicken">@acid-chicken</a></td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
|
||||||
:heart: Backers & Sponsors
|
:heart: Backers & Sponsors
|
||||||
----------------------------------------------------------------
|
----------------------------------------------------------------
|
||||||
<!-- PATREON_START -->
|
<!-- PATREON_START -->
|
||||||
@ -77,6 +93,7 @@ Please see the [Contribution Guide](./CONTRIBUTING.md).
|
|||||||
<td><img src="https://c8.patreon.com/2/200/12059069" alt="naga_rus" width="100"></td>
|
<td><img src="https://c8.patreon.com/2/200/12059069" alt="naga_rus" width="100"></td>
|
||||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/12731202/0995c46cdcb54153ab5f073f5869b70a/1?token-time=2145916800&token-hash=prtYqPOiSHBulhM7NU0VzMaWx39-9ntdq25b6kafDNA%3D" alt="negao" width="100"></td>
|
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/12731202/0995c46cdcb54153ab5f073f5869b70a/1?token-time=2145916800&token-hash=prtYqPOiSHBulhM7NU0VzMaWx39-9ntdq25b6kafDNA%3D" alt="negao" width="100"></td>
|
||||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/12913507/f7181eacafe8469a93033d85f5969c29/3?token-time=2145916800&token-hash=c8HeVqLtmdgH-gSBJg8i10gmOcwllM87MDHeznl3el0%3D" alt="Melilot" width="100"></td>
|
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/12913507/f7181eacafe8469a93033d85f5969c29/3?token-time=2145916800&token-hash=c8HeVqLtmdgH-gSBJg8i10gmOcwllM87MDHeznl3el0%3D" alt="Melilot" width="100"></td>
|
||||||
|
<td><img src="https://c8.patreon.com/2/200/16869916" alt="見当かなみ" width="100"></td>
|
||||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/12999811/5f349fafcce44dd1824a8b1ebbec4564/3?token-time=2145916800&token-hash=LtV2lRi3L2jOWMLwccr9qWYfPrFlzIo2jYZHKzHEb6k%3D" alt="Xeltica" width="100"></td>
|
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/12999811/5f349fafcce44dd1824a8b1ebbec4564/3?token-time=2145916800&token-hash=LtV2lRi3L2jOWMLwccr9qWYfPrFlzIo2jYZHKzHEb6k%3D" alt="Xeltica" width="100"></td>
|
||||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/3384329/8b713330cb27404ea6e9fac50ff96efe/1?token-time=2145916800&token-hash=Ch3iF81ZGP0LMo894Y9ajpLisgtE91SnxtZE7fxsgrM%3D" alt="べすれい" width="100"></td>
|
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/3384329/8b713330cb27404ea6e9fac50ff96efe/1?token-time=2145916800&token-hash=Ch3iF81ZGP0LMo894Y9ajpLisgtE91SnxtZE7fxsgrM%3D" alt="べすれい" width="100"></td>
|
||||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/12021162/963128bb8d14476dbd8407943db8f31a/1?token-time=2145916800&token-hash=1FlxS9MEgmNGH_RHUVHbO5hIXB5I1z0lvA33CTvYvjA%3D" alt="gutfuckllc" width="100"></td>
|
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/12021162/963128bb8d14476dbd8407943db8f31a/1?token-time=2145916800&token-hash=1FlxS9MEgmNGH_RHUVHbO5hIXB5I1z0lvA33CTvYvjA%3D" alt="gutfuckllc" width="100"></td>
|
||||||
@ -85,6 +102,7 @@ Please see the [Contribution Guide](./CONTRIBUTING.md).
|
|||||||
<td><a href="https://www.patreon.com/user?u=12059069">naga_rus</a></td>
|
<td><a href="https://www.patreon.com/user?u=12059069">naga_rus</a></td>
|
||||||
<td><a href="https://www.patreon.com/negao">negao</a></td>
|
<td><a href="https://www.patreon.com/negao">negao</a></td>
|
||||||
<td><a href="https://www.patreon.com/user?u=12913507">Melilot</a></td>
|
<td><a href="https://www.patreon.com/user?u=12913507">Melilot</a></td>
|
||||||
|
<td><a href="https://www.patreon.com/user?u=16869916">見当かなみ</a></td>
|
||||||
<td><a href="https://www.patreon.com/Xeltica">Xeltica</a></td>
|
<td><a href="https://www.patreon.com/Xeltica">Xeltica</a></td>
|
||||||
<td><a href="https://www.patreon.com/user?u=3384329">べすれい</a></td>
|
<td><a href="https://www.patreon.com/user?u=3384329">べすれい</a></td>
|
||||||
<td><a href="https://www.patreon.com/gutfuckllc">gutfuckllc</a></td>
|
<td><a href="https://www.patreon.com/gutfuckllc">gutfuckllc</a></td>
|
||||||
@ -95,10 +113,9 @@ Please see the [Contribution Guide](./CONTRIBUTING.md).
|
|||||||
<td><img src="https://c8.patreon.com/2/200/16542964" alt="Takumi Sugita" width="100"></td>
|
<td><img src="https://c8.patreon.com/2/200/16542964" alt="Takumi Sugita" width="100"></td>
|
||||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/13039004/509d0c412eb14ae08d6a812a3054f7d6/1?token-time=2145916800&token-hash=2PsbFNw0tnubZzgSXD01R6hIgncfiElG7H7HX2Y3dyo%3D" alt="nemu" width="100"></td>
|
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/13039004/509d0c412eb14ae08d6a812a3054f7d6/1?token-time=2145916800&token-hash=2PsbFNw0tnubZzgSXD01R6hIgncfiElG7H7HX2Y3dyo%3D" alt="nemu" width="100"></td>
|
||||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/5881381/6235ca5d3fb04c8e95ef5b4ff2abcc18/3?token-time=2145916800&token-hash=9JtETp0X8gI280Ne1E8bxn6j4Lw5o2k4mJkICx97V_k%3D" alt="YUKIMOCHI" width="100"></td>
|
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/5881381/6235ca5d3fb04c8e95ef5b4ff2abcc18/3?token-time=2145916800&token-hash=9JtETp0X8gI280Ne1E8bxn6j4Lw5o2k4mJkICx97V_k%3D" alt="YUKIMOCHI" width="100"></td>
|
||||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/8241184/39e18850e87a449e9c9a71acb3310ebd/2?token-time=2145916800&token-hash=zrInDotuEIFslKphuSiCqr3M-r-rveTXjVKWr-VK6M0%3D" alt="Acid Chicken" width="100"></td>
|
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/8241184/39e18850e87a449e9c9a71acb3310ebd/3?token-time=2145916800&token-hash=gMq30aylxu5v3G8pRhWR5jeRBbYWEoRKjGbNeiCQz5g%3D" alt="Acid Chicken" width="100"></td>
|
||||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/4389829/9f709180ac714651a70f74a82f3ffdb9/2?token-time=2145916800&token-hash=zcwFxb2zopzWwksKVU1YpfAEjsl4yKT02aQ6yiAFRiQ%3D" alt="natalie" width="100"></td>
|
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/4389829/9f709180ac714651a70f74a82f3ffdb9/2?token-time=2145916800&token-hash=zcwFxb2zopzWwksKVU1YpfAEjsl4yKT02aQ6yiAFRiQ%3D" alt="natalie" width="100"></td>
|
||||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/13034746/c711c7f58e204ecfbc2fd646bc8a4eee/1?token-time=2145916800&token-hash=5T8XcaAf9Zyzfg3QubR06s_kJZkArVEM2dwObrBVAU4%3D" alt="Hiratake" width="100"></td>
|
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/13034746/c711c7f58e204ecfbc2fd646bc8a4eee/1?token-time=2145916800&token-hash=5T8XcaAf9Zyzfg3QubR06s_kJZkArVEM2dwObrBVAU4%3D" alt="Hiratake" width="100"></td>
|
||||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/10789744/97175095d8f04c0f86225ff47cb98d40/1?token-time=2145916800&token-hash=ubVARikVOg3v7NW6LDhtG-ClE1LTU3I2TJ3js2-5xDs%3D" alt="Naoki Hirayama" width="100"></td>
|
|
||||||
</tr><tr>
|
</tr><tr>
|
||||||
<td><a href="https://www.patreon.com/mydarkstar">mydarkstar</a></td>
|
<td><a href="https://www.patreon.com/mydarkstar">mydarkstar</a></td>
|
||||||
<td><a href="https://www.patreon.com/user?u=12718187">Peter G.</a></td>
|
<td><a href="https://www.patreon.com/user?u=12718187">Peter G.</a></td>
|
||||||
@ -108,7 +125,6 @@ Please see the [Contribution Guide](./CONTRIBUTING.md).
|
|||||||
<td><a href="https://www.patreon.com/acid_chicken">Acid Chicken</a></td>
|
<td><a href="https://www.patreon.com/acid_chicken">Acid Chicken</a></td>
|
||||||
<td><a href="https://www.patreon.com/user?u=4389829">natalie</a></td>
|
<td><a href="https://www.patreon.com/user?u=4389829">natalie</a></td>
|
||||||
<td><a href="https://www.patreon.com/hiratake">Hiratake</a></td>
|
<td><a href="https://www.patreon.com/hiratake">Hiratake</a></td>
|
||||||
<td><a href="https://www.patreon.com/spinlock">Naoki Hirayama</a></td>
|
|
||||||
</tr></table>
|
</tr></table>
|
||||||
<table><tr>
|
<table><tr>
|
||||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/4503830/ccf2cc867ea64de0b524bb2e24b9a1cb/1?token-time=2145916800&token-hash=Ksk_2l3gjPDbnzMUOCSW1E-hdPJsNs2tSR4_RAakRK8%3D" alt="dansup" width="100"></td>
|
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/4503830/ccf2cc867ea64de0b524bb2e24b9a1cb/1?token-time=2145916800&token-hash=Ksk_2l3gjPDbnzMUOCSW1E-hdPJsNs2tSR4_RAakRK8%3D" alt="dansup" width="100"></td>
|
||||||
@ -122,7 +138,7 @@ Please see the [Contribution Guide](./CONTRIBUTING.md).
|
|||||||
<td><a href="https://www.patreon.com/user?u=12531784">Takashi Shibuya</a></td>
|
<td><a href="https://www.patreon.com/user?u=12531784">Takashi Shibuya</a></td>
|
||||||
</tr></table>
|
</tr></table>
|
||||||
|
|
||||||
**Last updated:** Fri, 18 Jan 2019 11:58:06 UTC
|
**Last updated:** Tue, 29 Jan 2019 04:42:06 UTC
|
||||||
<!-- PATREON_END -->
|
<!-- PATREON_END -->
|
||||||
|
|
||||||
:four_leaf_clover: Copyright
|
:four_leaf_clover: Copyright
|
||||||
|
50
gulpfile.ts
50
gulpfile.ts
@ -32,14 +32,6 @@ if (isDebug) {
|
|||||||
console.warn(chalk.yellow.bold(' built script will not be compressed.'));
|
console.warn(chalk.yellow.bold(' built script will not be compressed.'));
|
||||||
}
|
}
|
||||||
|
|
||||||
gulp.task('build', [
|
|
||||||
'build:ts',
|
|
||||||
'build:copy',
|
|
||||||
'build:client',
|
|
||||||
'locales',
|
|
||||||
'doc'
|
|
||||||
]);
|
|
||||||
|
|
||||||
gulp.task('build:ts', () => {
|
gulp.task('build:ts', () => {
|
||||||
const tsProject = ts.createProject('./tsconfig.json');
|
const tsProject = ts.createProject('./tsconfig.json');
|
||||||
|
|
||||||
@ -47,6 +39,7 @@ gulp.task('build:ts', () => {
|
|||||||
.src()
|
.src()
|
||||||
.pipe(sourcemaps.init())
|
.pipe(sourcemaps.init())
|
||||||
.pipe(tsProject())
|
.pipe(tsProject())
|
||||||
|
.on('error', () => {})
|
||||||
.pipe(sourcemaps.write('.', { includeContent: false, sourceRoot: '../built' }))
|
.pipe(sourcemaps.write('.', { includeContent: false, sourceRoot: '../built' }))
|
||||||
.pipe(gulp.dest('./built/'));
|
.pipe(gulp.dest('./built/'));
|
||||||
});
|
});
|
||||||
@ -55,7 +48,7 @@ gulp.task('build:copy:views', () =>
|
|||||||
gulp.src('./src/server/web/views/**/*').pipe(gulp.dest('./built/server/web/views'))
|
gulp.src('./src/server/web/views/**/*').pipe(gulp.dest('./built/server/web/views'))
|
||||||
);
|
);
|
||||||
|
|
||||||
gulp.task('build:copy', ['build:copy:views'], () =>
|
gulp.task('build:copy', gulp.parallel('build:copy:views', () =>
|
||||||
gulp.src([
|
gulp.src([
|
||||||
'./build/Release/crypto_key.node',
|
'./build/Release/crypto_key.node',
|
||||||
'./src/const.json',
|
'./src/const.json',
|
||||||
@ -63,9 +56,7 @@ gulp.task('build:copy', ['build:copy:views'], () =>
|
|||||||
'./src/**/assets/**/*',
|
'./src/**/assets/**/*',
|
||||||
'!./src/client/app/**/assets/**/*'
|
'!./src/client/app/**/assets/**/*'
|
||||||
]).pipe(gulp.dest('./built/'))
|
]).pipe(gulp.dest('./built/'))
|
||||||
);
|
));
|
||||||
|
|
||||||
gulp.task('test', ['mocha']);
|
|
||||||
|
|
||||||
gulp.task('lint', () =>
|
gulp.task('lint', () =>
|
||||||
gulp.src('./src/**/*.ts')
|
gulp.src('./src/**/*.ts')
|
||||||
@ -92,22 +83,15 @@ gulp.task('mocha', () =>
|
|||||||
} as any))
|
} as any))
|
||||||
);
|
);
|
||||||
|
|
||||||
|
gulp.task('test', gulp.task('mocha'));
|
||||||
|
|
||||||
gulp.task('clean', cb =>
|
gulp.task('clean', cb =>
|
||||||
rimraf('./built', cb)
|
rimraf('./built', cb)
|
||||||
);
|
);
|
||||||
|
|
||||||
gulp.task('cleanall', ['clean'], cb =>
|
gulp.task('cleanall', gulp.parallel('clean', cb =>
|
||||||
rimraf('./node_modules', cb)
|
rimraf('./node_modules', cb)
|
||||||
);
|
));
|
||||||
|
|
||||||
gulp.task('default', ['build']);
|
|
||||||
|
|
||||||
gulp.task('build:client', [
|
|
||||||
'build:ts',
|
|
||||||
'build:client:script',
|
|
||||||
'build:client:styles',
|
|
||||||
'copy:client'
|
|
||||||
]);
|
|
||||||
|
|
||||||
gulp.task('build:client:script', () => {
|
gulp.task('build:client:script', () => {
|
||||||
const client = require('./built/client/meta.json');
|
const client = require('./built/client/meta.json');
|
||||||
@ -129,9 +113,7 @@ gulp.task('build:client:styles', () =>
|
|||||||
.pipe(gulp.dest('./built/client/assets/'))
|
.pipe(gulp.dest('./built/client/assets/'))
|
||||||
);
|
);
|
||||||
|
|
||||||
gulp.task('copy:client', [
|
gulp.task('copy:client', () =>
|
||||||
'build:client:script'
|
|
||||||
], () =>
|
|
||||||
gulp.src([
|
gulp.src([
|
||||||
'./assets/**/*',
|
'./assets/**/*',
|
||||||
'./src/client/assets/**/*',
|
'./src/client/assets/**/*',
|
||||||
@ -156,3 +138,19 @@ gulp.task('doc', () =>
|
|||||||
.pipe((cssnano as any)())
|
.pipe((cssnano as any)())
|
||||||
.pipe(gulp.dest('./built/docs/assets/'))
|
.pipe(gulp.dest('./built/docs/assets/'))
|
||||||
);
|
);
|
||||||
|
|
||||||
|
gulp.task('build:client', gulp.parallel(
|
||||||
|
'build:client:script',
|
||||||
|
'build:client:styles',
|
||||||
|
'copy:client'
|
||||||
|
));
|
||||||
|
|
||||||
|
gulp.task('build', gulp.parallel(
|
||||||
|
'build:ts',
|
||||||
|
'build:copy',
|
||||||
|
'build:client',
|
||||||
|
'locales',
|
||||||
|
'doc'
|
||||||
|
));
|
||||||
|
|
||||||
|
gulp.task('default', gulp.task('build'));
|
||||||
|
@ -357,7 +357,6 @@ common/views/components/user-menu.vue:
|
|||||||
unblock: "ブロック解除"
|
unblock: "ブロック解除"
|
||||||
push-to-list: "リストに追加"
|
push-to-list: "リストに追加"
|
||||||
select-list: "リストを選択してください"
|
select-list: "リストを選択してください"
|
||||||
list-pushed: "{user}を{list}に追加しました"
|
|
||||||
report-abuse: "スパムを報告"
|
report-abuse: "スパムを報告"
|
||||||
report-abuse-detail: "どのような迷惑行為を行っていますか?"
|
report-abuse-detail: "どのような迷惑行為を行っていますか?"
|
||||||
report-abuse-reported: "管理者に報告されました。ご協力ありがとうございました。"
|
report-abuse-reported: "管理者に報告されました。ご協力ありがとうございました。"
|
||||||
@ -659,9 +658,6 @@ desktop/views/components/drive.vue:
|
|||||||
create-folder: "フォルダーを作成"
|
create-folder: "フォルダーを作成"
|
||||||
upload: "ファイルをアップロード"
|
upload: "ファイルをアップロード"
|
||||||
url-upload: "URLからアップロード"
|
url-upload: "URLからアップロード"
|
||||||
desktop/views/components/media-image.vue:
|
|
||||||
sensitive: "閲覧注意"
|
|
||||||
click-to-show: "クリックして表示"
|
|
||||||
desktop/views/components/media-video.vue:
|
desktop/views/components/media-video.vue:
|
||||||
sensitive: "閲覧注意"
|
sensitive: "閲覧注意"
|
||||||
click-to-show: "クリックして表示"
|
click-to-show: "クリックして表示"
|
||||||
@ -789,6 +785,8 @@ desktop/views/components/settings.vue:
|
|||||||
auto-popout-desc: "ウィンドウが開かれるとき、ポップアウト(ブラウザ外に切り離す)可能なら自動でポップアウトします。この設定はブラウザに記憶されます。"
|
auto-popout-desc: "ウィンドウが開かれるとき、ポップアウト(ブラウザ外に切り離す)可能なら自動でポップアウトします。この設定はブラウザに記憶されます。"
|
||||||
deck-nav: "デッキ内ナビゲーション"
|
deck-nav: "デッキ内ナビゲーション"
|
||||||
deck-nav-desc: "デッキを使用しているとき、ナビゲーションが発生する際にページ遷移を行わずに一時的なカラムで受けるようにします。"
|
deck-nav-desc: "デッキを使用しているとき、ナビゲーションが発生する際にページ遷移を行わずに一時的なカラムで受けるようにします。"
|
||||||
|
keep-cw: "CW保持"
|
||||||
|
keep-cw-desc: "投稿にリプライする際、リプライ元の投稿にCWが設定されていたとき、デフォルトで同じCWを設定するようにします。"
|
||||||
deck-default: "デッキをデフォルトのUIにする"
|
deck-default: "デッキをデフォルトのUIにする"
|
||||||
display: "デザインと表示"
|
display: "デザインと表示"
|
||||||
customize: "ホームをカスタマイズ"
|
customize: "ホームをカスタマイズ"
|
||||||
@ -874,6 +872,9 @@ desktop/views/components/settings.2fa.vue:
|
|||||||
success: "設定が完了しました!"
|
success: "設定が完了しました!"
|
||||||
failed: "設定に失敗しました。トークンに誤りがないかご確認ください。"
|
failed: "設定に失敗しました。トークンに誤りがないかご確認ください。"
|
||||||
info: "次回サインインからは、同様にパスワードに加えてデバイスに表示されているトークンを入力します。"
|
info: "次回サインインからは、同様にパスワードに加えてデバイスに表示されているトークンを入力します。"
|
||||||
|
common/views/components/media-image.vue:
|
||||||
|
sensitive: "閲覧注意"
|
||||||
|
click-to-show: "クリックして表示"
|
||||||
common/views/components/api-settings.vue:
|
common/views/components/api-settings.vue:
|
||||||
intro: "APIを利用するには、上記のトークンを「i」というキーでパラメータに付加してリクエストします。"
|
intro: "APIを利用するには、上記のトークンを「i」というキーでパラメータに付加してリクエストします。"
|
||||||
caution: "アカウントを不正利用される可能性があるため、このトークンは第三者に教えないでください(アプリなどにも入力しないでください)。"
|
caution: "アカウントを不正利用される可能性があるため、このトークンは第三者に教えないでください(アプリなどにも入力しないでください)。"
|
||||||
@ -1133,15 +1134,22 @@ admin/views/users.vue:
|
|||||||
user-not-found: "ユーザーが見つかりません"
|
user-not-found: "ユーザーが見つかりません"
|
||||||
lookup: "照会"
|
lookup: "照会"
|
||||||
reset-password: "パスワードをリセット"
|
reset-password: "パスワードをリセット"
|
||||||
|
reset-password-confirm: "パスワードをリセットしますか?"
|
||||||
password-updated: "パスワードは現在「{password}」です"
|
password-updated: "パスワードは現在「{password}」です"
|
||||||
suspend: "凍結"
|
suspend: "凍結"
|
||||||
|
suspend-confirm: "凍結しますか?"
|
||||||
suspended: "凍結しました"
|
suspended: "凍結しました"
|
||||||
unsuspend: "凍結の解除"
|
unsuspend: "凍結の解除"
|
||||||
|
unsuspend-confirm: "凍結を解除しますか?"
|
||||||
unsuspended: "凍結を解除しました"
|
unsuspended: "凍結を解除しました"
|
||||||
verify: "公式アカウントにする"
|
verify: "公式アカウントにする"
|
||||||
|
verify-confirm: "公式アカウントにしますか?"
|
||||||
verified: "公式アカウントにしました"
|
verified: "公式アカウントにしました"
|
||||||
unverify: "公式アカウントを解除する"
|
unverify: "公式アカウントを解除する"
|
||||||
|
unverify-confirm: "公式アカウントを解除しますか?"
|
||||||
unverified: "公式アカウントを解除しました"
|
unverified: "公式アカウントを解除しました"
|
||||||
|
update-remote-user: "リモートユーザー情報の更新"
|
||||||
|
remote-user-updated: "リモートユーザー情報を更新しました"
|
||||||
users:
|
users:
|
||||||
title: "ユーザー"
|
title: "ユーザー"
|
||||||
sort:
|
sort:
|
||||||
@ -1321,9 +1329,6 @@ mobile/views/components/drive.file-detail.vue:
|
|||||||
nsfw: "閲覧注意"
|
nsfw: "閲覧注意"
|
||||||
mark-as-sensitive: "閲覧注意に設定"
|
mark-as-sensitive: "閲覧注意に設定"
|
||||||
unmark-as-sensitive: "閲覧注意を解除"
|
unmark-as-sensitive: "閲覧注意を解除"
|
||||||
mobile/views/components/media-image.vue:
|
|
||||||
sensitive: "閲覧注意"
|
|
||||||
click-to-show: "クリックして表示"
|
|
||||||
mobile/views/components/media-video.vue:
|
mobile/views/components/media-video.vue:
|
||||||
sensitive: "閲覧注意"
|
sensitive: "閲覧注意"
|
||||||
click-to-show: "クリックして表示"
|
click-to-show: "クリックして表示"
|
||||||
@ -1468,6 +1473,7 @@ mobile/views/pages/settings.vue:
|
|||||||
notification-position-top: "上"
|
notification-position-top: "上"
|
||||||
behavior: "動作"
|
behavior: "動作"
|
||||||
fetch-on-scroll: "スクロールで自動読み込み"
|
fetch-on-scroll: "スクロールで自動読み込み"
|
||||||
|
keep-cw: "CW保持"
|
||||||
note-visibility: "投稿の公開範囲"
|
note-visibility: "投稿の公開範囲"
|
||||||
default-note-visibility: "デフォルトの公開範囲"
|
default-note-visibility: "デフォルトの公開範囲"
|
||||||
remember-note-visibility: "投稿の公開範囲を記憶する"
|
remember-note-visibility: "投稿の公開範囲を記憶する"
|
||||||
|
@ -357,7 +357,6 @@ common/views/components/user-menu.vue:
|
|||||||
unblock: "ブロック解除"
|
unblock: "ブロック解除"
|
||||||
push-to-list: "リストに追加"
|
push-to-list: "リストに追加"
|
||||||
select-list: "リストを選択してください"
|
select-list: "リストを選択してください"
|
||||||
list-pushed: "{user}を{list}に追加しました"
|
|
||||||
report-abuse: "スパムを報告"
|
report-abuse: "スパムを報告"
|
||||||
report-abuse-detail: "どのような迷惑行為を行っていますか?"
|
report-abuse-detail: "どのような迷惑行為を行っていますか?"
|
||||||
report-abuse-reported: "管理者に報告されました。ご協力ありがとうございました。"
|
report-abuse-reported: "管理者に報告されました。ご協力ありがとうございました。"
|
||||||
@ -659,9 +658,6 @@ desktop/views/components/drive.vue:
|
|||||||
create-folder: "Ein Verzeichnis erstellen"
|
create-folder: "Ein Verzeichnis erstellen"
|
||||||
upload: "Eine Datei hochladen"
|
upload: "Eine Datei hochladen"
|
||||||
url-upload: "Von einer URL hochladen"
|
url-upload: "Von einer URL hochladen"
|
||||||
desktop/views/components/media-image.vue:
|
|
||||||
sensitive: "閲覧注意"
|
|
||||||
click-to-show: "クリックして表示"
|
|
||||||
desktop/views/components/media-video.vue:
|
desktop/views/components/media-video.vue:
|
||||||
sensitive: "閲覧注意"
|
sensitive: "閲覧注意"
|
||||||
click-to-show: "クリックして表示"
|
click-to-show: "クリックして表示"
|
||||||
@ -789,6 +785,8 @@ desktop/views/components/settings.vue:
|
|||||||
auto-popout-desc: "Pop-out ein offenes Fenster wenn möglich. Diese Einstellung wird im Browser gespeichert."
|
auto-popout-desc: "Pop-out ein offenes Fenster wenn möglich. Diese Einstellung wird im Browser gespeichert."
|
||||||
deck-nav: "デッキ内ナビゲーション"
|
deck-nav: "デッキ内ナビゲーション"
|
||||||
deck-nav-desc: "デッキを使用しているとき、ナビゲーションが発生する際にページ遷移を行わずに一時的なカラムで受けるようにします。"
|
deck-nav-desc: "デッキを使用しているとき、ナビゲーションが発生する際にページ遷移を行わずに一時的なカラムで受けるようにします。"
|
||||||
|
keep-cw: "CW保持"
|
||||||
|
keep-cw-desc: "投稿にリプライする際、リプライ元の投稿にCWが設定されていたとき、デフォルトで同じCWを設定するようにします。"
|
||||||
deck-default: "デッキをデフォルトのUIにする"
|
deck-default: "デッキをデフォルトのUIにする"
|
||||||
display: "Erscheinungsbild und Anzeige"
|
display: "Erscheinungsbild und Anzeige"
|
||||||
customize: "Startseite anpassen"
|
customize: "Startseite anpassen"
|
||||||
@ -874,6 +872,9 @@ desktop/views/components/settings.2fa.vue:
|
|||||||
success: "設定が完了しました!"
|
success: "設定が完了しました!"
|
||||||
failed: "設定に失敗しました。トークンに誤りがないかご確認ください。"
|
failed: "設定に失敗しました。トークンに誤りがないかご確認ください。"
|
||||||
info: "次回サインインからは、同様にパスワードに加えてデバイスに表示されているトークンを入力します。"
|
info: "次回サインインからは、同様にパスワードに加えてデバイスに表示されているトークンを入力します。"
|
||||||
|
common/views/components/media-image.vue:
|
||||||
|
sensitive: "閲覧注意"
|
||||||
|
click-to-show: "クリックして表示"
|
||||||
common/views/components/api-settings.vue:
|
common/views/components/api-settings.vue:
|
||||||
intro: "APIを利用するには、上記のトークンを「i」というキーでパラメータに付加してリクエストします。"
|
intro: "APIを利用するには、上記のトークンを「i」というキーでパラメータに付加してリクエストします。"
|
||||||
caution: "アカウントを不正利用される可能性があるため、このトークンは第三者に教えないでください(アプリなどにも入力しないでください)。"
|
caution: "アカウントを不正利用される可能性があるため、このトークンは第三者に教えないでください(アプリなどにも入力しないでください)。"
|
||||||
@ -1133,15 +1134,22 @@ admin/views/users.vue:
|
|||||||
user-not-found: "ユーザーが見つかりません"
|
user-not-found: "ユーザーが見つかりません"
|
||||||
lookup: "照会"
|
lookup: "照会"
|
||||||
reset-password: "パスワードをリセット"
|
reset-password: "パスワードをリセット"
|
||||||
|
reset-password-confirm: "パスワードをリセットしますか?"
|
||||||
password-updated: "パスワードは現在「{password}」です"
|
password-updated: "パスワードは現在「{password}」です"
|
||||||
suspend: "凍結"
|
suspend: "凍結"
|
||||||
|
suspend-confirm: "凍結しますか?"
|
||||||
suspended: "凍結しました"
|
suspended: "凍結しました"
|
||||||
unsuspend: "凍結の解除"
|
unsuspend: "凍結の解除"
|
||||||
|
unsuspend-confirm: "凍結を解除しますか?"
|
||||||
unsuspended: "凍結を解除しました"
|
unsuspended: "凍結を解除しました"
|
||||||
verify: "公式アカウントにする"
|
verify: "公式アカウントにする"
|
||||||
|
verify-confirm: "公式アカウントにしますか?"
|
||||||
verified: "公式アカウントにしました"
|
verified: "公式アカウントにしました"
|
||||||
unverify: "公式アカウントを解除する"
|
unverify: "公式アカウントを解除する"
|
||||||
|
unverify-confirm: "公式アカウントを解除しますか?"
|
||||||
unverified: "公式アカウントを解除しました"
|
unverified: "公式アカウントを解除しました"
|
||||||
|
update-remote-user: "リモートユーザー情報の更新"
|
||||||
|
remote-user-updated: "リモートユーザー情報を更新しました"
|
||||||
users:
|
users:
|
||||||
title: "ユーザー"
|
title: "ユーザー"
|
||||||
sort:
|
sort:
|
||||||
@ -1321,9 +1329,6 @@ mobile/views/components/drive.file-detail.vue:
|
|||||||
nsfw: "閲覧注意"
|
nsfw: "閲覧注意"
|
||||||
mark-as-sensitive: "閲覧注意に設定"
|
mark-as-sensitive: "閲覧注意に設定"
|
||||||
unmark-as-sensitive: "閲覧注意を解除"
|
unmark-as-sensitive: "閲覧注意を解除"
|
||||||
mobile/views/components/media-image.vue:
|
|
||||||
sensitive: "閲覧注意"
|
|
||||||
click-to-show: "クリックして表示"
|
|
||||||
mobile/views/components/media-video.vue:
|
mobile/views/components/media-video.vue:
|
||||||
sensitive: "閲覧注意"
|
sensitive: "閲覧注意"
|
||||||
click-to-show: "クリックして表示"
|
click-to-show: "クリックして表示"
|
||||||
@ -1468,6 +1473,7 @@ mobile/views/pages/settings.vue:
|
|||||||
notification-position-top: "上"
|
notification-position-top: "上"
|
||||||
behavior: "動作"
|
behavior: "動作"
|
||||||
fetch-on-scroll: "スクロールで自動読み込み"
|
fetch-on-scroll: "スクロールで自動読み込み"
|
||||||
|
keep-cw: "CW保持"
|
||||||
note-visibility: "投稿の公開範囲"
|
note-visibility: "投稿の公開範囲"
|
||||||
default-note-visibility: "デフォルトの公開範囲"
|
default-note-visibility: "デフォルトの公開範囲"
|
||||||
remember-note-visibility: "投稿の公開範囲を記憶する"
|
remember-note-visibility: "投稿の公開範囲を記憶する"
|
||||||
|
@ -357,10 +357,9 @@ common/views/components/user-menu.vue:
|
|||||||
unblock: "Unblock"
|
unblock: "Unblock"
|
||||||
push-to-list: "Add to list"
|
push-to-list: "Add to list"
|
||||||
select-list: "Select a list"
|
select-list: "Select a list"
|
||||||
list-pushed: "Successfully added {user} to {list}."
|
|
||||||
report-abuse: "Report abuse"
|
report-abuse: "Report abuse"
|
||||||
report-abuse-detail: "どのような迷惑行為を行っていますか?"
|
report-abuse-detail: "What kind of nuisance did you encounter?"
|
||||||
report-abuse-reported: "管理者に報告されました。ご協力ありがとうございました。"
|
report-abuse-reported: "The issue has been reported to the administrator. Your cooperation is much appreciated."
|
||||||
common/views/components/poll.vue:
|
common/views/components/poll.vue:
|
||||||
vote-to: "Vote for '{}'"
|
vote-to: "Vote for '{}'"
|
||||||
vote-count: "{} votes"
|
vote-count: "{} votes"
|
||||||
@ -659,9 +658,6 @@ desktop/views/components/drive.vue:
|
|||||||
create-folder: "Create a folder"
|
create-folder: "Create a folder"
|
||||||
upload: "Upload a file"
|
upload: "Upload a file"
|
||||||
url-upload: "Upload from a URL"
|
url-upload: "Upload from a URL"
|
||||||
desktop/views/components/media-image.vue:
|
|
||||||
sensitive: "NSFW"
|
|
||||||
click-to-show: "Click to show"
|
|
||||||
desktop/views/components/media-video.vue:
|
desktop/views/components/media-video.vue:
|
||||||
sensitive: "The content is NSFW"
|
sensitive: "The content is NSFW"
|
||||||
click-to-show: "Click to show"
|
click-to-show: "Click to show"
|
||||||
@ -789,7 +785,9 @@ desktop/views/components/settings.vue:
|
|||||||
auto-popout-desc: "If it's possible, pop-out display will be used instead of opening a new window. This setting is stored in your browser."
|
auto-popout-desc: "If it's possible, pop-out display will be used instead of opening a new window. This setting is stored in your browser."
|
||||||
deck-nav: "Transitionless deck navigation"
|
deck-nav: "Transitionless deck navigation"
|
||||||
deck-nav-desc: "You get a temporary column without page transitions during navigation when using the deck."
|
deck-nav-desc: "You get a temporary column without page transitions during navigation when using the deck."
|
||||||
deck-default: "Use Deck as default UI"
|
keep-cw: "Preserve content warning"
|
||||||
|
keep-cw-desc: "When replying to a post, the same content warning is set by default to the reply, as has been set by the original post."
|
||||||
|
deck-default: "Use Deck view as the default UI"
|
||||||
display: "Design and display"
|
display: "Design and display"
|
||||||
customize: "Customize home layout"
|
customize: "Customize home layout"
|
||||||
wallpaper: "Wallpaper"
|
wallpaper: "Wallpaper"
|
||||||
@ -806,8 +804,8 @@ desktop/views/components/settings.vue:
|
|||||||
timeline: "Timeline"
|
timeline: "Timeline"
|
||||||
show-my-renotes: "Show my renotes in the timeline"
|
show-my-renotes: "Show my renotes in the timeline"
|
||||||
show-renoted-my-notes: "Show renoted posts of mine in timelines"
|
show-renoted-my-notes: "Show renoted posts of mine in timelines"
|
||||||
show-local-renotes: "Show renoted local posts in timelines"
|
show-local-renotes: "Show renoted local posts in the timelines"
|
||||||
show-maps: "Display a map to show the location"
|
show-maps: "Display a map to show location"
|
||||||
remain-deleted-note: "Continue to show deleted posts"
|
remain-deleted-note: "Continue to show deleted posts"
|
||||||
deck-column-align: "Deck column alignment"
|
deck-column-align: "Deck column alignment"
|
||||||
deck-column-align-center: "Center"
|
deck-column-align-center: "Center"
|
||||||
@ -874,6 +872,9 @@ desktop/views/components/settings.2fa.vue:
|
|||||||
success: "Settings saved!"
|
success: "Settings saved!"
|
||||||
failed: "Failed to setup. Please ensure that the token is correct."
|
failed: "Failed to setup. Please ensure that the token is correct."
|
||||||
info: "From the next time you sign in to Misskey, the token displayed on your device will be necessary too, as well as the password."
|
info: "From the next time you sign in to Misskey, the token displayed on your device will be necessary too, as well as the password."
|
||||||
|
common/views/components/media-image.vue:
|
||||||
|
sensitive: "NSFW"
|
||||||
|
click-to-show: "Click to show"
|
||||||
common/views/components/api-settings.vue:
|
common/views/components/api-settings.vue:
|
||||||
intro: "To access the API, set this token as the key 'i' of request parameters."
|
intro: "To access the API, set this token as the key 'i' of request parameters."
|
||||||
caution: "Do not enter this token to any apps nor tell this token to others otherwise your account may get compromised."
|
caution: "Do not enter this token to any apps nor tell this token to others otherwise your account may get compromised."
|
||||||
@ -1054,7 +1055,7 @@ admin/views/instance.vue:
|
|||||||
disable-registration: "Disable new user registration"
|
disable-registration: "Disable new user registration"
|
||||||
disable-local-timeline: "Disable the Local Timeline"
|
disable-local-timeline: "Disable the Local Timeline"
|
||||||
disable-global-timeline: "Disable global timeline"
|
disable-global-timeline: "Disable global timeline"
|
||||||
disabling-timelines-info: "これらのタイムラインを無効にしても、管理者およびモデレーターは引き続き利用できます。"
|
disabling-timelines-info: "Even if you disable these timelines, the administrator as well as moderators can use them continually."
|
||||||
invite: "Invite"
|
invite: "Invite"
|
||||||
save: "Save"
|
save: "Save"
|
||||||
saved: "Saved"
|
saved: "Saved"
|
||||||
@ -1126,23 +1127,30 @@ admin/views/drive.vue:
|
|||||||
deleted: "Deleted successfully"
|
deleted: "Deleted successfully"
|
||||||
mark-as-sensitive: "Mark as 'sensitive'"
|
mark-as-sensitive: "Mark as 'sensitive'"
|
||||||
unmark-as-sensitive: "Unmark as 'sensitive'"
|
unmark-as-sensitive: "Unmark as 'sensitive'"
|
||||||
marked-as-sensitive: "閲覧注意に設定しました"
|
marked-as-sensitive: "Set a sensitive content notice"
|
||||||
unmarked-as-sensitive: "閲覧注意を解除しました"
|
unmarked-as-sensitive: "Remove the sensitive content notice"
|
||||||
admin/views/users.vue:
|
admin/views/users.vue:
|
||||||
operation: "Operations"
|
operation: "Operations"
|
||||||
username-or-userid: "Username or user ID"
|
username-or-userid: "Username or user ID"
|
||||||
user-not-found: "User not found"
|
user-not-found: "User not found"
|
||||||
lookup: "Look up"
|
lookup: "Look up"
|
||||||
reset-password: "Reset password"
|
reset-password: "Reset password"
|
||||||
|
reset-password-confirm: "Do you want to reset your password?"
|
||||||
password-updated: "The password is now \"{password}\""
|
password-updated: "The password is now \"{password}\""
|
||||||
suspend: "Suspend"
|
suspend: "Suspend"
|
||||||
|
suspend-confirm: "Do you want to suspend this account?"
|
||||||
suspended: "Successfully suspended."
|
suspended: "Successfully suspended."
|
||||||
unsuspend: "Unsuspend"
|
unsuspend: "Unsuspend"
|
||||||
|
unsuspend-confirm: "Are you sure you want to unsuspend this account?"
|
||||||
unsuspended: "The user has successfully unsuspended."
|
unsuspended: "The user has successfully unsuspended."
|
||||||
verify: "Verify account"
|
verify: "Verify account"
|
||||||
|
verify-confirm: "Do you want this to be a verified account?"
|
||||||
verified: "The account is now being verified"
|
verified: "The account is now being verified"
|
||||||
unverify: "Unverify account"
|
unverify: "Unverify account"
|
||||||
|
unverify-confirm: "Do you want to remove the 'verified account' designation?"
|
||||||
unverified: "The account is now being unverified"
|
unverified: "The account is now being unverified"
|
||||||
|
update-remote-user: "Update information about remote user"
|
||||||
|
remote-user-updated: "The information regarding the remote user has been updated."
|
||||||
users:
|
users:
|
||||||
title: "Users"
|
title: "Users"
|
||||||
sort:
|
sort:
|
||||||
@ -1322,9 +1330,6 @@ mobile/views/components/drive.file-detail.vue:
|
|||||||
nsfw: "NSFW"
|
nsfw: "NSFW"
|
||||||
mark-as-sensitive: "Mark as 'sensitive'"
|
mark-as-sensitive: "Mark as 'sensitive'"
|
||||||
unmark-as-sensitive: "Unmark as 'sensitive'"
|
unmark-as-sensitive: "Unmark as 'sensitive'"
|
||||||
mobile/views/components/media-image.vue:
|
|
||||||
sensitive: "NSFW"
|
|
||||||
click-to-show: "Click to show"
|
|
||||||
mobile/views/components/media-video.vue:
|
mobile/views/components/media-video.vue:
|
||||||
sensitive: "The content is NSFW"
|
sensitive: "The content is NSFW"
|
||||||
click-to-show: "Click to show"
|
click-to-show: "Click to show"
|
||||||
@ -1469,6 +1474,7 @@ mobile/views/pages/settings.vue:
|
|||||||
notification-position-top: "Top"
|
notification-position-top: "Top"
|
||||||
behavior: "Behavior"
|
behavior: "Behavior"
|
||||||
fetch-on-scroll: "Endless loading on scroll"
|
fetch-on-scroll: "Endless loading on scroll"
|
||||||
|
keep-cw: "Preserve content warning"
|
||||||
note-visibility: "Post visibility"
|
note-visibility: "Post visibility"
|
||||||
default-note-visibility: "Default visibility"
|
default-note-visibility: "Default visibility"
|
||||||
remember-note-visibility: "Remember post visibility"
|
remember-note-visibility: "Remember post visibility"
|
||||||
|
@ -5,18 +5,18 @@ meta:
|
|||||||
common:
|
common:
|
||||||
misskey: "Una ⭐️ del fediverso"
|
misskey: "Una ⭐️ del fediverso"
|
||||||
about-title: "Una ⭐️ del fediverso"
|
about-title: "Una ⭐️ del fediverso"
|
||||||
about: "Gracias por encontrae Misskey. Misskey es una <b>plataforma descentralizada de microblogging</b> nacida en la Tierra. Gracias a existir dentro del Fediverso (un universo donde se organizan varias plataformas sociales) se encuentra enlazada mutuamente con otras plataformas sociales. ¿Por què no te tomas un respiro del caos de la ciudad y te sumerges es una nueva manera de entender Internet?"
|
about: "Gracias por encontrar Misskey. Misskey es una <b>plataforma descentralizada de microblogging</b> nacida en la Tierra. Porque el servicio existe dentro del Fediverso (un universo donde se organizan varias plataformas sociales), se encuentra enlazado mutuamente con otras plataformas sociales. ¿Por qué no te tomas un respiro del caos de la ciudad y te sumerges es una nueva manera de entender Internet?"
|
||||||
intro:
|
intro:
|
||||||
title: "Misskeyって?"
|
title: "¿Misskey?"
|
||||||
about: "Misskeyはオープンソースの<b>分散型マイクロブログSNS</b>です。リッチで高度にカスタマイズできるUI、投稿へのリアクション、ファイルを一元管理できるドライブなど、先進的な機能を揃えています。また、Fediverseと呼ばれるネットワークに接続できるため、他のSNSともやり取りできます。例えば、あなたが何か投稿すると、その投稿はMisskeyだけでなく他のSNSにも伝わります。ちょうどある惑星から他の惑星に電波を発信している様子をイメージしてください。"
|
about: "Misskey es un <b>Servicio de red social descentralizada de microblogging</b> de código abierto. Contiene una interfaz de usuario altamente personalizable, reacciones a posts, almacenamiento para poder manejar archivos y otras funciones avanzadas. Además de conectarse con la red llamada Fediverso, puede intercambiar mensajes con otras redes sociales. Por ejemplo, si contribuyes con algo, esa contribución es transmitida no sólo a Misskey sino a otras redes sociales. Imagina que se parece a transmitir una onda de radio de un planeta a otro."
|
||||||
features: "特徴"
|
features: "Características"
|
||||||
rich-contents: "投稿"
|
rich-contents: "Posts"
|
||||||
rich-contents-desc: "自分の考え、話題の出来事、皆と共有したいことについて発信してください。必要であれば、様々な構文を使って投稿を装飾したり、好きな画像、動画などのファイルやアンケートを添付することもできます。"
|
rich-contents-desc: "Escribe sobre tus pensamientos, eventos, todo lo que quieras compartir. Si es necesario, puedes usar varias sintaxis, decorar tus posts y añadir tus imágenes favoritas, archivos de viddeo y encuestas."
|
||||||
reaction: "リアクション"
|
reaction: "Reacciones"
|
||||||
reaction-desc: "あなたの気持ちを伝える最も簡単な方法です。Misskeyは、他のユーザーの投稿に様々なリアクションを付けることができます。いちどMisskeyのリアクション機能を体験してしまうと、もう「いいね」の概念しか存在しないSNSには戻れなくなるかもしれません。"
|
reaction-desc: "あなたの気持ちを伝える最も簡単な方法です。Misskeyは、他のユーザーの投稿に様々なリアクションを付けることができます。いちどMisskeyのリアクション機能を体験してしまうと、もう「いいね」の概念しか存在しないSNSには戻れなくなるかもしれません。"
|
||||||
ui: "インターフェース"
|
ui: "Interfaz"
|
||||||
ui-desc: "どのようなUIが使いやすいかは人それぞれです。だから、Misskeyは自由度の高いUIを持っています。レイアウトやデザインを調整したり、カスタマイズ可能な様々なウィジェットを配置したりして、自分だけのホームを作ってください。"
|
ui-desc: "どのようなUIが使いやすいかは人それぞれです。だから、Misskeyは自由度の高いUIを持っています。レイアウトやデザインを調整したり、カスタマイズ可能な様々なウィジェットを配置したりして、自分だけのホームを作ってください。"
|
||||||
drive: "ドライブ"
|
drive: "Drive"
|
||||||
drive-desc: "以前投稿したことのある画像をまた投稿したくなったことはありませんか?もしくは、アップロードしたファイルをフォルダ分けして整理したくなったことはありませんか?Misskeyの根幹に組み込まれたドライブ機能によってそれらが解決します。ファイルの共有も簡単です。"
|
drive-desc: "以前投稿したことのある画像をまた投稿したくなったことはありませんか?もしくは、アップロードしたファイルをフォルダ分けして整理したくなったことはありませんか?Misskeyの根幹に組み込まれたドライブ機能によってそれらが解決します。ファイルの共有も簡単です。"
|
||||||
outro: "他にもMisskeyにしかない機能はまだまだあるので、ぜひあなた自身の目で確かめてください。Misskeyは分散型SNSなので、このインスタンスが気に入らなければ他のインスタンスを試すこともできます。それでは、GLHF!"
|
outro: "他にもMisskeyにしかない機能はまだまだあるので、ぜひあなた自身の目で確かめてください。Misskeyは分散型SNSなので、このインスタンスが気に入らなければ他のインスタンスを試すこともできます。それでは、GLHF!"
|
||||||
adblock:
|
adblock:
|
||||||
@ -27,7 +27,7 @@ common:
|
|||||||
do-not-copy-paste: "Por favor no copies código aquí. Tu cuenta puede resultar comprometida."
|
do-not-copy-paste: "Por favor no copies código aquí. Tu cuenta puede resultar comprometida."
|
||||||
load-more: "もっと読み込む"
|
load-more: "もっと読み込む"
|
||||||
enter-password: "パスワードを入力してください"
|
enter-password: "パスワードを入力してください"
|
||||||
2fa: "二段階認証"
|
2fa: "Autenticación de dos factores"
|
||||||
got-it: "¡Listo!"
|
got-it: "¡Listo!"
|
||||||
customization-tips:
|
customization-tips:
|
||||||
title: "Consejos de personalización"
|
title: "Consejos de personalización"
|
||||||
@ -54,8 +54,8 @@ common:
|
|||||||
years_ago: "Hace {} año(s)"
|
years_ago: "Hace {} año(s)"
|
||||||
month-and-day: "{day} de {month}"
|
month-and-day: "{day} de {month}"
|
||||||
trash: "Papelera"
|
trash: "Papelera"
|
||||||
drive: "ドライブ"
|
drive: "Drive"
|
||||||
messaging: "トーク"
|
messaging: "Conversación"
|
||||||
weekday-short:
|
weekday-short:
|
||||||
sunday: "domingo"
|
sunday: "domingo"
|
||||||
monday: "lunes"
|
monday: "lunes"
|
||||||
@ -84,16 +84,16 @@ common:
|
|||||||
rip: "RIP"
|
rip: "RIP"
|
||||||
pudding: "Chafado"
|
pudding: "Chafado"
|
||||||
note-visibility:
|
note-visibility:
|
||||||
public: "公開"
|
public: "Público"
|
||||||
home: "ホーム"
|
home: "Inicio"
|
||||||
home-desc: "ホームタイムラインにのみ公開"
|
home-desc: "Sólo en el timeline de inicio"
|
||||||
followers: "フォロワー"
|
followers: "Seguidores"
|
||||||
followers-desc: "自分のフォロワーにのみ公開"
|
followers-desc: "Sólo para tus seguidores"
|
||||||
specified: "ダイレクト"
|
specified: "Mensaje directo"
|
||||||
specified-desc: "指定したユーザーにのみ公開"
|
specified-desc: "Sólo para ciertos usuarios"
|
||||||
local-public: "公開 (ローカルのみ)"
|
local-public: "Público (sólo local)"
|
||||||
local-home: "ホーム (ローカルのみ)"
|
local-home: "Inicio (sólo local)"
|
||||||
local-followers: "フォロワー (ローカルのみ)"
|
local-followers: "Seguidores (sólo local)"
|
||||||
note-placeholders:
|
note-placeholders:
|
||||||
a: "¿Qué haces?"
|
a: "¿Qué haces?"
|
||||||
b: "¿Qué está pasando?"
|
b: "¿Qué está pasando?"
|
||||||
@ -122,9 +122,9 @@ common:
|
|||||||
this-setting-is-this-device-only: "このデバイスのみ"
|
this-setting-is-this-device-only: "このデバイスのみ"
|
||||||
use-os-default-emojis: "OS標準の絵文字を使用"
|
use-os-default-emojis: "OS標準の絵文字を使用"
|
||||||
line-width: "線の太さ"
|
line-width: "線の太さ"
|
||||||
line-width-thin: "細い"
|
line-width-thin: "Fino"
|
||||||
line-width-normal: "普通"
|
line-width-normal: "普通"
|
||||||
line-width-thick: "太い"
|
line-width-thick: "Grueso"
|
||||||
hide-password: "パスワードを隠す"
|
hide-password: "パスワードを隠す"
|
||||||
show-password: "パスワードを表示する"
|
show-password: "パスワードを表示する"
|
||||||
do-not-use-in-production: "Esto está en desarrollo, no usarlo para producción."
|
do-not-use-in-production: "Esto está en desarrollo, no usarlo para producción."
|
||||||
@ -171,7 +171,7 @@ common:
|
|||||||
hashtags: "Etiquetas"
|
hashtags: "Etiquetas"
|
||||||
dev: "アプリの作成に失敗しました。再度お試しください。"
|
dev: "アプリの作成に失敗しました。再度お試しください。"
|
||||||
ai-chan-kawaii: "藍ちゃかわいい"
|
ai-chan-kawaii: "藍ちゃかわいい"
|
||||||
you: "あなた"
|
you: "Tú"
|
||||||
auth/views/form.vue:
|
auth/views/form.vue:
|
||||||
share-access: "<i>{name}</i>があなたのアカウントにアクセスすることを許可しますか?"
|
share-access: "<i>{name}</i>があなたのアカウントにアクセスすることを許可しますか?"
|
||||||
permission-ask: "La aplicación requiere los siguientes permisos:"
|
permission-ask: "La aplicación requiere los siguientes permisos:"
|
||||||
@ -267,48 +267,48 @@ common/views/components/media-banner.vue:
|
|||||||
sensitive: "閲覧注意"
|
sensitive: "閲覧注意"
|
||||||
click-to-show: "クリックして表示"
|
click-to-show: "クリックして表示"
|
||||||
common/views/components/theme.vue:
|
common/views/components/theme.vue:
|
||||||
theme: "テーマ"
|
theme: "Tema"
|
||||||
light-theme: "非ダークモード時に使用するテーマ"
|
light-theme: "非ダークモード時に使用するテーマ"
|
||||||
dark-theme: "ダークモード時に使用するテーマ"
|
dark-theme: "ダークモード時に使用するテーマ"
|
||||||
light-themes: "明るいテーマ"
|
light-themes: "Tema claro"
|
||||||
dark-themes: "暗いテーマ"
|
dark-themes: "Tema oscuro"
|
||||||
install-a-theme: "テーマのインストール"
|
install-a-theme: "Instalar tema"
|
||||||
theme-code: "テーマコード"
|
theme-code: "Código del tema"
|
||||||
install: "インストール"
|
install: "Instalación"
|
||||||
installed: "「{}」をインストールしました"
|
installed: "「{}」をインストールしました"
|
||||||
create-a-theme: "テーマの作成"
|
create-a-theme: "テーマの作成"
|
||||||
save-created-theme: "テーマを保存"
|
save-created-theme: "テーマを保存"
|
||||||
primary-color: "プライマリ カラー"
|
primary-color: "Color primario"
|
||||||
secondary-color: "セカンダリ カラー"
|
secondary-color: "Color secundario"
|
||||||
text-color: "文字色"
|
text-color: "文字色"
|
||||||
base-theme: "ベーステーマ"
|
base-theme: "Tema base"
|
||||||
base-theme-light: "Light"
|
base-theme-light: "Claro"
|
||||||
base-theme-dark: "Dark"
|
base-theme-dark: "Oscuro"
|
||||||
find-more-theme: "その他のテーマを入手"
|
find-more-theme: "その他のテーマを入手"
|
||||||
theme-name: "テーマ名"
|
theme-name: "Nombre del tema"
|
||||||
preview-created-theme: "プレビュー"
|
preview-created-theme: "Vista previa"
|
||||||
invalid-theme: "テーマが正しくありません。"
|
invalid-theme: "テーマが正しくありません。"
|
||||||
already-installed: "既にそのテーマはインストールされています。"
|
already-installed: "既にそのテーマはインストールされています。"
|
||||||
saved: "保存しました"
|
saved: "保存しました"
|
||||||
manage-themes: "テーマの管理"
|
manage-themes: "テーマの管理"
|
||||||
builtin-themes: "標準テーマ"
|
builtin-themes: "標準テーマ"
|
||||||
my-themes: "マイテーマ"
|
my-themes: "Mis temas"
|
||||||
installed-themes: "インストールされたテーマ"
|
installed-themes: "Temas instalados"
|
||||||
select-theme: "テーマを選択してください"
|
select-theme: "テーマを選択してください"
|
||||||
uninstall: "アンインストール"
|
uninstall: "Desinstalar"
|
||||||
uninstalled: "「{}」をアンインストールしました"
|
uninstalled: "「{}」をアンインストールしました"
|
||||||
author: "作者"
|
author: "作者"
|
||||||
desc: "説明"
|
desc: "説明"
|
||||||
export: "エクスポート"
|
export: "Exportar"
|
||||||
import: "インポート"
|
import: "Importar"
|
||||||
import-by-code: "またはコードをペースト"
|
import-by-code: "またはコードをペースト"
|
||||||
theme-name-required: "テーマ名は必須です。"
|
theme-name-required: "テーマ名は必須です。"
|
||||||
common/views/components/cw-button.vue:
|
common/views/components/cw-button.vue:
|
||||||
hide: "隠す"
|
hide: "隠す"
|
||||||
show: "もっと見る"
|
show: "Mostrar"
|
||||||
chars: "{count}文字"
|
chars: "{count} letras"
|
||||||
files: "{count}ファイル"
|
files: "{count} archivos"
|
||||||
poll: "アンケート"
|
poll: "Encuesta"
|
||||||
common/views/components/messaging.vue:
|
common/views/components/messaging.vue:
|
||||||
search-user: "Encuentra un usuario"
|
search-user: "Encuentra un usuario"
|
||||||
you: "Tu"
|
you: "Tu"
|
||||||
@ -338,7 +338,7 @@ common/views/components/nav.vue:
|
|||||||
develop: "Desarrolladores"
|
develop: "Desarrolladores"
|
||||||
feedback: "Opiniones"
|
feedback: "Opiniones"
|
||||||
common/views/components/note-menu.vue:
|
common/views/components/note-menu.vue:
|
||||||
mention: "メンション"
|
mention: "Menciones"
|
||||||
detail: "Detalles"
|
detail: "Detalles"
|
||||||
copy-content: "内容をコピー"
|
copy-content: "内容をコピー"
|
||||||
copy-link: "Copiar enlace"
|
copy-link: "Copiar enlace"
|
||||||
@ -350,14 +350,13 @@ common/views/components/note-menu.vue:
|
|||||||
delete-confirm: "¿Seguro que quieres borrar la publicación?"
|
delete-confirm: "¿Seguro que quieres borrar la publicación?"
|
||||||
remote: "Ver el original"
|
remote: "Ver el original"
|
||||||
common/views/components/user-menu.vue:
|
common/views/components/user-menu.vue:
|
||||||
mention: "メンション"
|
mention: "Menciones"
|
||||||
mute: "ミュート"
|
mute: "Silenciar"
|
||||||
unmute: "ミュート解除"
|
unmute: "ミュート解除"
|
||||||
block: "ブロック"
|
block: "Bloquear"
|
||||||
unblock: "ブロック解除"
|
unblock: "ブロック解除"
|
||||||
push-to-list: "リストに追加"
|
push-to-list: "リストに追加"
|
||||||
select-list: "リストを選択してください"
|
select-list: "リストを選択してください"
|
||||||
list-pushed: "{user}を{list}に追加しました"
|
|
||||||
report-abuse: "スパムを報告"
|
report-abuse: "スパムを報告"
|
||||||
report-abuse-detail: "どのような迷惑行為を行っていますか?"
|
report-abuse-detail: "どのような迷惑行為を行っていますか?"
|
||||||
report-abuse-reported: "管理者に報告されました。ご協力ありがとうございました。"
|
report-abuse-reported: "管理者に報告されました。ご協力ありがとうございました。"
|
||||||
@ -377,15 +376,15 @@ common/views/components/poll-editor.vue:
|
|||||||
common/views/components/reaction-picker.vue:
|
common/views/components/reaction-picker.vue:
|
||||||
choose-reaction: "Escoge una reacción"
|
choose-reaction: "Escoge una reacción"
|
||||||
common/views/components/emoji-picker.vue:
|
common/views/components/emoji-picker.vue:
|
||||||
custom-emoji: "カスタム絵文字"
|
custom-emoji: "Personalizados"
|
||||||
people: "人"
|
people: "Gente"
|
||||||
animals-and-nature: "動物&自然"
|
animals-and-nature: "Naturaleza"
|
||||||
food-and-drink: "食べ物&飲み物"
|
food-and-drink: "Comida y bebida"
|
||||||
activity: "アクティビティ"
|
activity: "Actividad"
|
||||||
travel-and-places: "場所"
|
travel-and-places: "Viajes y lugares"
|
||||||
objects: "物"
|
objects: "Objetos"
|
||||||
symbols: "記号"
|
symbols: "Símbolos"
|
||||||
flags: "旗"
|
flags: "Países"
|
||||||
common/views/components/signin.vue:
|
common/views/components/signin.vue:
|
||||||
username: "Usuario"
|
username: "Usuario"
|
||||||
password: "Contraseña"
|
password: "Contraseña"
|
||||||
@ -394,8 +393,8 @@ common/views/components/signin.vue:
|
|||||||
signin: "Entra"
|
signin: "Entra"
|
||||||
or: "O"
|
or: "O"
|
||||||
signin-with-twitter: "Ingresar con Twitter"
|
signin-with-twitter: "Ingresar con Twitter"
|
||||||
signin-with-github: "GitHubでログイン"
|
signin-with-github: "Ingresar con Github"
|
||||||
signin-with-discord: "Discordでログイン"
|
signin-with-discord: "Ingresar con Discord"
|
||||||
login-failed: "Autenticación fallida. Asegúrate de haber usado el nombre de usuario y contraseña correctos."
|
login-failed: "Autenticación fallida. Asegúrate de haber usado el nombre de usuario y contraseña correctos."
|
||||||
common/views/components/signup.vue:
|
common/views/components/signup.vue:
|
||||||
invitation-code: "Código de invitación"
|
invitation-code: "Código de invitación"
|
||||||
@ -478,17 +477,17 @@ common/views/components/language-settings.vue:
|
|||||||
specify-language: "言語を指定"
|
specify-language: "言語を指定"
|
||||||
info: "変更はページの再度読み込み後に反映されます。"
|
info: "変更はページの再度読み込み後に反映されます。"
|
||||||
common/views/components/profile-editor.vue:
|
common/views/components/profile-editor.vue:
|
||||||
title: "プロフィール"
|
title: "Perfil"
|
||||||
name: "名前"
|
name: "Nombre"
|
||||||
account: "アカウント"
|
account: "Cuenta"
|
||||||
location: "場所"
|
location: "場所"
|
||||||
description: "自己紹介"
|
description: "自己紹介"
|
||||||
language: "言語"
|
language: "言語"
|
||||||
birthday: "誕生日"
|
birthday: "誕生日"
|
||||||
avatar: "アイコン"
|
avatar: "Avatar"
|
||||||
banner: "バナー"
|
banner: "Banner"
|
||||||
is-cat: "このアカウントはCatです"
|
is-cat: "Esta cuenta es un gato"
|
||||||
is-bot: "このアカウントはBotです"
|
is-bot: "Esta cuenta es un bot"
|
||||||
is-locked: "フォローを承認制にする"
|
is-locked: "フォローを承認制にする"
|
||||||
careful-bot: "Botからのフォローだけ承認制にする"
|
careful-bot: "Botからのフォローだけ承認制にする"
|
||||||
auto-accept-followed: "フォローしているユーザーからのフォローを自動承認する"
|
auto-accept-followed: "フォローしているユーザーからのフォローを自動承認する"
|
||||||
@ -499,11 +498,11 @@ common/views/components/profile-editor.vue:
|
|||||||
uploading: "アップロード中"
|
uploading: "アップロード中"
|
||||||
upload-failed: "アップロードに失敗しました"
|
upload-failed: "アップロードに失敗しました"
|
||||||
email: "メール設定"
|
email: "メール設定"
|
||||||
email-address: "メールアドレス"
|
email-address: "Correo electrónico"
|
||||||
email-verified: "メールアドレスが確認されました"
|
email-verified: "メールアドレスが確認されました"
|
||||||
email-not-verified: "メールアドレスが確認されていません。メールボックスをご確認ください。"
|
email-not-verified: "メールアドレスが確認されていません。メールボックスをご確認ください。"
|
||||||
common/views/components/user-list-editor.vue:
|
common/views/components/user-list-editor.vue:
|
||||||
users: "ユーザー"
|
users: "Usuarios"
|
||||||
rename: "リスト名を変更"
|
rename: "リスト名を変更"
|
||||||
delete: "リストを削除"
|
delete: "リストを削除"
|
||||||
remove-user: "このリストから削除"
|
remove-user: "このリストから削除"
|
||||||
@ -568,7 +567,7 @@ common/views/pages/follow.vue:
|
|||||||
following: "Siguiendo"
|
following: "Siguiendo"
|
||||||
follow: "Seguir"
|
follow: "Seguir"
|
||||||
request-pending: "Solicitud pendiente"
|
request-pending: "Solicitud pendiente"
|
||||||
follow-processing: "フォロー処理中"
|
follow-processing: "Solicitud en proceso"
|
||||||
follow-request: "Solicitar suscripción"
|
follow-request: "Solicitar suscripción"
|
||||||
desktop:
|
desktop:
|
||||||
banner-crop-title: "Corta la parte que aparece como un banner"
|
banner-crop-title: "Corta la parte que aparece como un banner"
|
||||||
@ -591,7 +590,7 @@ desktop/views/components/activity.vue:
|
|||||||
title: "Actividad"
|
title: "Actividad"
|
||||||
toggle: "Alternar vistas"
|
toggle: "Alternar vistas"
|
||||||
desktop/views/components/calendar.vue:
|
desktop/views/components/calendar.vue:
|
||||||
title: "{year}年 {month}月"
|
title: "{year} / {month}"
|
||||||
prev: "Mes anterior"
|
prev: "Mes anterior"
|
||||||
next: "Próximo mes"
|
next: "Próximo mes"
|
||||||
go: "Click para navegar"
|
go: "Click para navegar"
|
||||||
@ -659,9 +658,6 @@ desktop/views/components/drive.vue:
|
|||||||
create-folder: "Crear una carpeta"
|
create-folder: "Crear una carpeta"
|
||||||
upload: "Subir fichero"
|
upload: "Subir fichero"
|
||||||
url-upload: "Subir desde una URL"
|
url-upload: "Subir desde una URL"
|
||||||
desktop/views/components/media-image.vue:
|
|
||||||
sensitive: "El contenido es NSFW (no seguro para ver en el trabajo, 'not safe for work')"
|
|
||||||
click-to-show: "Click para mostrar"
|
|
||||||
desktop/views/components/media-video.vue:
|
desktop/views/components/media-video.vue:
|
||||||
sensitive: "Este contenido no es apropiado para ver en el trabajo"
|
sensitive: "Este contenido no es apropiado para ver en el trabajo"
|
||||||
click-to-show: "Click para mostrar"
|
click-to-show: "Click para mostrar"
|
||||||
@ -702,7 +698,7 @@ desktop/views/components/note-detail.vue:
|
|||||||
desktop/views/components/note.vue:
|
desktop/views/components/note.vue:
|
||||||
reply: "返信"
|
reply: "返信"
|
||||||
renote: "Renote"
|
renote: "Renote"
|
||||||
add-reaction: "リアクション"
|
add-reaction: "Reacción"
|
||||||
undo-reaction: "リアクション解除"
|
undo-reaction: "リアクション解除"
|
||||||
detail: "詳細"
|
detail: "詳細"
|
||||||
private: "この投稿は非公開です"
|
private: "この投稿は非公開です"
|
||||||
@ -760,23 +756,23 @@ desktop/views/components/renote-form.vue:
|
|||||||
desktop/views/components/renote-form-window.vue:
|
desktop/views/components/renote-form-window.vue:
|
||||||
title: "¿Seguro qué quieres volver a publicarlo?"
|
title: "¿Seguro qué quieres volver a publicarlo?"
|
||||||
desktop/views/pages/user-following-or-followers.vue:
|
desktop/views/pages/user-following-or-followers.vue:
|
||||||
following: "{user}のフォロー"
|
following: "{user} sigue a"
|
||||||
followers: "{user}のフォロワー"
|
followers: "Seguidores de {user}"
|
||||||
desktop/views/components/settings-window.vue:
|
desktop/views/components/settings-window.vue:
|
||||||
settings: "Configuración"
|
settings: "Configuración"
|
||||||
desktop/views/components/settings.vue:
|
desktop/views/components/settings.vue:
|
||||||
profile: "Perfil"
|
profile: "Perfil"
|
||||||
notification: "Notificación"
|
notification: "Notificación"
|
||||||
apps: "Aplicaciones"
|
apps: "Aplicaciones"
|
||||||
tags: "ハッシュタグ"
|
tags: "Hashtags"
|
||||||
mute-and-block: "ミュート/ブロック"
|
mute-and-block: "Silenciar/Bloquear"
|
||||||
blocking: "ブロック"
|
blocking: "Bloquear"
|
||||||
security: "Seguridad"
|
security: "Seguridad"
|
||||||
signin: "Historial de inicios de sesión"
|
signin: "Historial de inicios de sesión"
|
||||||
password: "Contraseña"
|
password: "Contraseña"
|
||||||
other: "Otros"
|
other: "Otros"
|
||||||
license: "Licencia"
|
license: "Licencia"
|
||||||
theme: "テーマ"
|
theme: "Tema"
|
||||||
behaviour: "Acciones"
|
behaviour: "Acciones"
|
||||||
fetch-on-scroll: "Desplazamiento infinito"
|
fetch-on-scroll: "Desplazamiento infinito"
|
||||||
fetch-on-scroll-desc: "Cuando te deslizas al final de la página nuevo contenido se carga automáticamente."
|
fetch-on-scroll-desc: "Cuando te deslizas al final de la página nuevo contenido se carga automáticamente."
|
||||||
@ -789,6 +785,8 @@ desktop/views/components/settings.vue:
|
|||||||
auto-popout-desc: "Muestra una ventana emergente si es posible. Esta configuración depende del navegador."
|
auto-popout-desc: "Muestra una ventana emergente si es posible. Esta configuración depende del navegador."
|
||||||
deck-nav: "デッキ内ナビゲーション"
|
deck-nav: "デッキ内ナビゲーション"
|
||||||
deck-nav-desc: "デッキを使用しているとき、ナビゲーションが発生する際にページ遷移を行わずに一時的なカラムで受けるようにします。"
|
deck-nav-desc: "デッキを使用しているとき、ナビゲーションが発生する際にページ遷移を行わずに一時的なカラムで受けるようにします。"
|
||||||
|
keep-cw: "CW保持"
|
||||||
|
keep-cw-desc: "投稿にリプライする際、リプライ元の投稿にCWが設定されていたとき、デフォルトで同じCWを設定するようにします。"
|
||||||
deck-default: "デッキをデフォルトのUIにする"
|
deck-default: "デッキをデフォルトのUIにする"
|
||||||
display: "Diseño y pantalla"
|
display: "Diseño y pantalla"
|
||||||
customize: "Personaliza la página principal"
|
customize: "Personaliza la página principal"
|
||||||
@ -811,30 +809,30 @@ desktop/views/components/settings.vue:
|
|||||||
remain-deleted-note: "削除された投稿を表示し続ける"
|
remain-deleted-note: "削除された投稿を表示し続ける"
|
||||||
deck-column-align: "デッキのカラムの配置"
|
deck-column-align: "デッキのカラムの配置"
|
||||||
deck-column-align-center: "中央"
|
deck-column-align-center: "中央"
|
||||||
deck-column-align-left: "左"
|
deck-column-align-left: "Izquierda"
|
||||||
deck-column-align-flexible: "フレキシブル"
|
deck-column-align-flexible: "Flexible"
|
||||||
deck-column-width: "デッキのカラムの幅"
|
deck-column-width: "デッキのカラムの幅"
|
||||||
deck-column-width-narrow: "狭"
|
deck-column-width-narrow: "狭"
|
||||||
deck-column-width-narrower: "やや狭"
|
deck-column-width-narrower: "やや狭"
|
||||||
deck-column-width-normal: "普通"
|
deck-column-width-normal: "普通"
|
||||||
deck-column-width-wider: "やや広"
|
deck-column-width-wider: "やや広"
|
||||||
deck-column-width-wide: "広"
|
deck-column-width-wide: "広"
|
||||||
sound: "サウンド"
|
sound: "Sonidos"
|
||||||
enable-sounds: "サウンドを有効にする"
|
enable-sounds: "サウンドを有効にする"
|
||||||
enable-sounds-desc: "投稿やメッセージを送受信したときなどにサウンドを再生します。この設定はブラウザに記憶されます。"
|
enable-sounds-desc: "投稿やメッセージを送受信したときなどにサウンドを再生します。この設定はブラウザに記憶されます。"
|
||||||
volume: "ボリューム"
|
volume: "Volúmen"
|
||||||
test: "テスト"
|
test: "Prueba"
|
||||||
cache: "キャッシュ"
|
cache: "Caché"
|
||||||
clean-cache: "クリーンアップ"
|
clean-cache: "Borrar caché"
|
||||||
cache-warn: "クリーンアップを行うと、ブラウザに記憶されたアカウント情報のキャッシュ、書きかけの投稿・返信・メッセージ、およびその他のデータ(設定情報含む)が削除されます。クリーンアップを行った後はページを再度読み込みする必要があります。"
|
cache-warn: "クリーンアップを行うと、ブラウザに記憶されたアカウント情報のキャッシュ、書きかけの投稿・返信・メッセージ、およびその他のデータ(設定情報含む)が削除されます。クリーンアップを行った後はページを再度読み込みする必要があります。"
|
||||||
cache-cleared: "キャッシュを削除しました"
|
cache-cleared: "キャッシュを削除しました"
|
||||||
cache-cleared-desc: "ページを再度読み込みしてください。"
|
cache-cleared-desc: "ページを再度読み込みしてください。"
|
||||||
about: "Misskeyについて"
|
about: "Misskeyについて"
|
||||||
operator: "このサーバーの運営者"
|
operator: "このサーバーの運営者"
|
||||||
update: "Misskey Update"
|
update: "Actualizar Misskey"
|
||||||
version: "バージョン:"
|
version: "Versión"
|
||||||
latest-version: "最新のバージョン:"
|
latest-version: "Última versión"
|
||||||
update-checking: "アップデートを確認中"
|
update-checking: "Chequeando actualización"
|
||||||
do-update: "Chequear por actualizaciones"
|
do-update: "Chequear por actualizaciones"
|
||||||
update-settings: "Configuración avanzada"
|
update-settings: "Configuración avanzada"
|
||||||
prevent-update: "Posponer actualizaciones (no recomendado)"
|
prevent-update: "Posponer actualizaciones (no recomendado)"
|
||||||
@ -852,9 +850,9 @@ desktop/views/components/settings.vue:
|
|||||||
task-manager: "Navegador de tareas"
|
task-manager: "Navegador de tareas"
|
||||||
third-parties: "Servicios externos"
|
third-parties: "Servicios externos"
|
||||||
navbar-position: "ナビゲーションバーの位置"
|
navbar-position: "ナビゲーションバーの位置"
|
||||||
navbar-position-top: "上"
|
navbar-position-top: "Arriba"
|
||||||
navbar-position-left: "左"
|
navbar-position-left: "Izquierda"
|
||||||
navbar-position-right: "右"
|
navbar-position-right: "Derecha"
|
||||||
desktop/views/components/settings.2fa.vue:
|
desktop/views/components/settings.2fa.vue:
|
||||||
intro: "二段階認証を設定すると、サインイン時にパスワードだけでなく、予め登録しておいた物理的なデバイス(例えばあなたのスマートフォンなど)も必要になり、よりセキュリティが向上します。"
|
intro: "二段階認証を設定すると、サインイン時にパスワードだけでなく、予め登録しておいた物理的なデバイス(例えばあなたのスマートフォンなど)も必要になり、よりセキュリティが向上します。"
|
||||||
detail: "Ver detalles..."
|
detail: "Ver detalles..."
|
||||||
@ -867,13 +865,16 @@ desktop/views/components/settings.2fa.vue:
|
|||||||
enter-password: "Escribe una contraseña"
|
enter-password: "Escribe una contraseña"
|
||||||
authenticator: "Primero, necesitas instalar Google Authenticator en tu dispositivo:"
|
authenticator: "Primero, necesitas instalar Google Authenticator en tu dispositivo:"
|
||||||
howtoinstall: "Cómo instalar"
|
howtoinstall: "Cómo instalar"
|
||||||
token: "トークン"
|
token: "Token"
|
||||||
scan: "Luego, escanea el código QR:"
|
scan: "Luego, escanea el código QR:"
|
||||||
done: "Por favor ingresa el token mostrado en tu dispositivo:"
|
done: "Por favor ingresa el token mostrado en tu dispositivo:"
|
||||||
submit: "Enviar"
|
submit: "Enviar"
|
||||||
success: "¡Configuraciones guardadas!"
|
success: "¡Configuraciones guardadas!"
|
||||||
failed: "Error al configurar. Por favor asegúrate de que el token es correcto."
|
failed: "Error al configurar. Por favor asegúrate de que el token es correcto."
|
||||||
info: "Desde ahora, ingresa el token que se muestra en tu dispositivo adicionalmente a tu contraseña cuando inicies sesión en Misskey"
|
info: "Desde ahora, ingresa el token que se muestra en tu dispositivo adicionalmente a tu contraseña cuando inicies sesión en Misskey"
|
||||||
|
common/views/components/media-image.vue:
|
||||||
|
sensitive: "閲覧注意"
|
||||||
|
click-to-show: "クリックして表示"
|
||||||
common/views/components/api-settings.vue:
|
common/views/components/api-settings.vue:
|
||||||
intro: "APIを利用するには、上記のトークンを「i」というキーでパラメータに付加してリクエストします。"
|
intro: "APIを利用するには、上記のトークンを「i」というキーでパラメータに付加してリクエストします。"
|
||||||
caution: "アカウントを不正利用される可能性があるため、このトークンは第三者に教えないでください(アプリなどにも入力しないでください)。"
|
caution: "アカウントを不正利用される可能性があるため、このトークンは第三者に教えないでください(アプリなどにも入力しないでください)。"
|
||||||
@ -882,7 +883,7 @@ common/views/components/api-settings.vue:
|
|||||||
token: "Token:"
|
token: "Token:"
|
||||||
enter-password: "パスワードを入力してください"
|
enter-password: "パスワードを入力してください"
|
||||||
console:
|
console:
|
||||||
title: "APIコンソール"
|
title: "Consola API"
|
||||||
endpoint: "エンドポイント"
|
endpoint: "エンドポイント"
|
||||||
parameter: "パラメータ"
|
parameter: "パラメータ"
|
||||||
credential-info: "「i」パラメータは自動で付与されます。"
|
credential-info: "「i」パラメータは自動で付与されます。"
|
||||||
@ -896,9 +897,9 @@ common/views/components/drive-settings.vue:
|
|||||||
in-use: "使用中"
|
in-use: "使用中"
|
||||||
stats: "統計"
|
stats: "統計"
|
||||||
common/views/components/mute-and-block.vue:
|
common/views/components/mute-and-block.vue:
|
||||||
mute-and-block: "ミュートとブロック"
|
mute-and-block: "Silenciar y bloquear"
|
||||||
mute: "ミュート"
|
mute: "Silenciar"
|
||||||
block: "ブロック"
|
block: "Bloquear"
|
||||||
no-muted-users: "ミュートしているユーザーはいません"
|
no-muted-users: "ミュートしているユーザーはいません"
|
||||||
no-blocked-users: "ブロックしているユーザーはいません"
|
no-blocked-users: "ブロックしているユーザーはいません"
|
||||||
word-mute: "ワードミュート"
|
word-mute: "ワードミュート"
|
||||||
@ -917,26 +918,26 @@ desktop/views/components/sub-note-content.vue:
|
|||||||
private: "この投稿は非公開です"
|
private: "この投稿は非公開です"
|
||||||
deleted: "この投稿は削除されました"
|
deleted: "この投稿は削除されました"
|
||||||
media-count: "{}つのメディア"
|
media-count: "{}つのメディア"
|
||||||
poll: "アンケート"
|
poll: "Encuesta"
|
||||||
desktop/views/components/settings.tags.vue:
|
desktop/views/components/settings.tags.vue:
|
||||||
title: "タグ"
|
title: "Etiqueta"
|
||||||
query: "クエリ (省略可)"
|
query: "クエリ (省略可)"
|
||||||
add: "追加"
|
add: "追加"
|
||||||
save: "保存"
|
save: "保存"
|
||||||
desktop/views/components/taskmanager.vue:
|
desktop/views/components/taskmanager.vue:
|
||||||
title: "タスクマネージャ"
|
title: "タスクマネージャ"
|
||||||
desktop/views/components/timeline.vue:
|
desktop/views/components/timeline.vue:
|
||||||
home: "ホーム"
|
home: "Inicio"
|
||||||
local: "ローカル"
|
local: "Local"
|
||||||
hybrid: "ソーシャル"
|
hybrid: "Social"
|
||||||
global: "グローバル"
|
global: "Global"
|
||||||
mentions: "あなた宛て"
|
mentions: "あなた宛て"
|
||||||
messages: "メッセージ"
|
messages: "メッセージ"
|
||||||
list: "リスト"
|
list: "Listas"
|
||||||
hashtag: "ハッシュタグ"
|
hashtag: "Hashtags"
|
||||||
add-tag-timeline: "ハッシュタグを追加"
|
add-tag-timeline: "ハッシュタグを追加"
|
||||||
add-list: "リストを追加"
|
add-list: "リストを追加"
|
||||||
list-name: "リスト名"
|
list-name: "Nombre de lista"
|
||||||
desktop/views/components/ui.header.vue:
|
desktop/views/components/ui.header.vue:
|
||||||
welcome-back: "Bienvenido/a de vuelta,"
|
welcome-back: "Bienvenido/a de vuelta,"
|
||||||
adjective: "-san"
|
adjective: "-san"
|
||||||
@ -970,35 +971,35 @@ desktop/views/components/user-lists-window.vue:
|
|||||||
list-name: "Nombre de lista"
|
list-name: "Nombre de lista"
|
||||||
desktop/views/components/user-preview.vue:
|
desktop/views/components/user-preview.vue:
|
||||||
notes: "Publicaciones"
|
notes: "Publicaciones"
|
||||||
following: "フォロー"
|
following: "Sigue"
|
||||||
followers: "フォロワー"
|
followers: "Seguidores"
|
||||||
desktop/views/components/users-list.vue:
|
desktop/views/components/users-list.vue:
|
||||||
all: "すべて"
|
all: "Todo"
|
||||||
iknow: "知り合い"
|
iknow: "知り合い"
|
||||||
fetching: "読み込んでいます"
|
fetching: "読み込んでいます"
|
||||||
desktop/views/components/users-list-item.vue:
|
desktop/views/components/users-list-item.vue:
|
||||||
followed: "フォローされています"
|
followed: "フォローされています"
|
||||||
desktop/views/components/window.vue:
|
desktop/views/components/window.vue:
|
||||||
popout: "ポップアウト"
|
popout: "ポップアウト"
|
||||||
close: "閉じる"
|
close: "Cerrar"
|
||||||
admin/views/index.vue:
|
admin/views/index.vue:
|
||||||
dashboard: "ダッシュボード"
|
dashboard: "Panel de control"
|
||||||
instance: "インスタンス"
|
instance: "Instancia"
|
||||||
emoji: "カスタム絵文字"
|
emoji: "カスタム絵文字"
|
||||||
moderators: "モデレーター"
|
moderators: "Moderadores"
|
||||||
users: "ユーザー"
|
users: "Usuarios"
|
||||||
federation: "連合"
|
federation: "連合"
|
||||||
announcements: "お知らせ"
|
announcements: "お知らせ"
|
||||||
hashtags: "ハッシュタグ"
|
hashtags: "Hashtags"
|
||||||
abuse: "スパム報告"
|
abuse: "スパム報告"
|
||||||
back-to-misskey: "Misskeyに戻る"
|
back-to-misskey: "Volver a Misskey"
|
||||||
admin/views/dashboard.vue:
|
admin/views/dashboard.vue:
|
||||||
dashboard: "ダッシュボード"
|
dashboard: "Panel de Control"
|
||||||
accounts: "アカウント"
|
accounts: "Cuenta"
|
||||||
notes: "投稿"
|
notes: "投稿"
|
||||||
drive: "ドライブ"
|
drive: "Drive"
|
||||||
instances: "インスタンス"
|
instances: "Instancias"
|
||||||
this-instance: "このインスタンス"
|
this-instance: "Esta instancia"
|
||||||
federated: "連合"
|
federated: "連合"
|
||||||
admin/views/abuse.vue:
|
admin/views/abuse.vue:
|
||||||
title: "スパム報告"
|
title: "スパム報告"
|
||||||
@ -1007,10 +1008,10 @@ admin/views/abuse.vue:
|
|||||||
details: "詳細"
|
details: "詳細"
|
||||||
remove-report: "削除"
|
remove-report: "削除"
|
||||||
admin/views/instance.vue:
|
admin/views/instance.vue:
|
||||||
instance: "インスタンス"
|
instance: "Instancia"
|
||||||
instance-name: "インスタンス名"
|
instance-name: "Nombre de la instancia"
|
||||||
instance-description: "インスタンスの紹介"
|
instance-description: "インスタンスの紹介"
|
||||||
host: "ホスト"
|
host: "Host"
|
||||||
banner-url: "バナー画像URL"
|
banner-url: "バナー画像URL"
|
||||||
error-image-url: "エラー画像URL"
|
error-image-url: "エラー画像URL"
|
||||||
languages: "インスタンスの対象言語"
|
languages: "インスタンスの対象言語"
|
||||||
@ -1028,7 +1029,7 @@ admin/views/instance.vue:
|
|||||||
recaptcha-info: "reCAPTCHAを有効にする場合、reCAPTCHAトークンを取得する必要があります。https://www.google.com/recaptcha/intro/ にアクセスしてトークンを取得してください。"
|
recaptcha-info: "reCAPTCHAを有効にする場合、reCAPTCHAトークンを取得する必要があります。https://www.google.com/recaptcha/intro/ にアクセスしてトークンを取得してください。"
|
||||||
enable-recaptcha: "reCAPTCHAを有効にする"
|
enable-recaptcha: "reCAPTCHAを有効にする"
|
||||||
recaptcha-site-key: "reCAPTCHA site key"
|
recaptcha-site-key: "reCAPTCHA site key"
|
||||||
recaptcha-secret-key: "reCAPTCHA secret key"
|
recaptcha-secret-key: "clave secreta reCAPTCHA"
|
||||||
twitter-integration-config: "Twitter連携の設定"
|
twitter-integration-config: "Twitter連携の設定"
|
||||||
twitter-integration-info: "コールバックURLは {url} に設定します。"
|
twitter-integration-info: "コールバックURLは {url} に設定します。"
|
||||||
enable-twitter-integration: "Twitter連携を有効にする"
|
enable-twitter-integration: "Twitter連携を有効にする"
|
||||||
@ -1061,7 +1062,7 @@ admin/views/instance.vue:
|
|||||||
enable-external-user-recommendation: "外部ユーザーレコメンデーションを有効にする"
|
enable-external-user-recommendation: "外部ユーザーレコメンデーションを有効にする"
|
||||||
external-user-recommendation-engine: "エンジン"
|
external-user-recommendation-engine: "エンジン"
|
||||||
external-user-recommendation-engine-desc: "例: https://vinayaka.distsn.org/cgi-bin/vinayaka-user-match-misskey-api.cgi?{{host}}+{{user}}+{{limit}}+{{offset}}"
|
external-user-recommendation-engine-desc: "例: https://vinayaka.distsn.org/cgi-bin/vinayaka-user-match-misskey-api.cgi?{{host}}+{{user}}+{{limit}}+{{offset}}"
|
||||||
external-user-recommendation-timeout: "タイムアウト"
|
external-user-recommendation-timeout: "Tiempo de espera"
|
||||||
external-user-recommendation-timeout-desc: "ミリ秒単位 (例: 300000)"
|
external-user-recommendation-timeout-desc: "ミリ秒単位 (例: 300000)"
|
||||||
email-config: "メールサーバーの設定"
|
email-config: "メールサーバーの設定"
|
||||||
email-config-info: "メールアドレス確認やパスワードリセットの際に使われます。"
|
email-config-info: "メールアドレス確認やパスワードリセットの際に使われます。"
|
||||||
@ -1069,10 +1070,10 @@ admin/views/instance.vue:
|
|||||||
email: "メールアドレス"
|
email: "メールアドレス"
|
||||||
smtp-secure: "SMTP接続に暗黙的なSSL/TLSを使用する"
|
smtp-secure: "SMTP接続に暗黙的なSSL/TLSを使用する"
|
||||||
smtp-secure-info: "STARTTLS使用時はオフにします。"
|
smtp-secure-info: "STARTTLS使用時はオフにします。"
|
||||||
smtp-host: "SMTPホスト"
|
smtp-host: "Host SMTP"
|
||||||
smtp-port: "SMTPポート"
|
smtp-port: "Puerto SMTP"
|
||||||
smtp-user: "SMTPユーザー"
|
smtp-user: "Usuario SMTP"
|
||||||
smtp-pass: "SMTPパスワード"
|
smtp-pass: "Contraseña SMTP"
|
||||||
serviceworker-config: "ServiceWorker"
|
serviceworker-config: "ServiceWorker"
|
||||||
enable-serviceworker: "ServiceWorkerを有効にする"
|
enable-serviceworker: "ServiceWorkerを有効にする"
|
||||||
serviceworker-info: "プッシュ通知を行うには有効する必要があります。"
|
serviceworker-info: "プッシュ通知を行うには有効する必要があります。"
|
||||||
@ -1080,14 +1081,14 @@ admin/views/instance.vue:
|
|||||||
vapid-privatekey: "VAPID秘密鍵"
|
vapid-privatekey: "VAPID秘密鍵"
|
||||||
vapid-info: "ServiceWorkerを有効にする場合、VAPIDキーペアを生成する必要があります。シェルで次のようにします:"
|
vapid-info: "ServiceWorkerを有効にする場合、VAPIDキーペアを生成する必要があります。シェルで次のようにします:"
|
||||||
admin/views/charts.vue:
|
admin/views/charts.vue:
|
||||||
title: "チャート"
|
title: "Gráficos"
|
||||||
per-day: "1日ごと"
|
per-day: "Por día"
|
||||||
per-hour: "1時間ごと"
|
per-hour: "Por hora"
|
||||||
federation: "フェデレーション"
|
federation: "Federación"
|
||||||
notes: "投稿"
|
notes: "投稿"
|
||||||
users: "ユーザー"
|
users: "Usuarios"
|
||||||
drive: "ドライブ"
|
drive: "Drive"
|
||||||
network: "ネットワーク"
|
network: "Red"
|
||||||
charts:
|
charts:
|
||||||
federation-instances: "インスタンスの増減"
|
federation-instances: "インスタンスの増減"
|
||||||
federation-instances-total: "インスタンスの積算"
|
federation-instances-total: "インスタンスの積算"
|
||||||
@ -1111,16 +1112,16 @@ admin/views/drive.vue:
|
|||||||
file-not-found: "ファイルが見つかりません"
|
file-not-found: "ファイルが見つかりません"
|
||||||
lookup: "照会"
|
lookup: "照会"
|
||||||
sort:
|
sort:
|
||||||
title: "ソート"
|
title: "Ordenar"
|
||||||
createdAtAsc: "アップロード日時が古い順"
|
createdAtAsc: "アップロード日時が古い順"
|
||||||
createdAtDesc: "アップロード日時が新しい順"
|
createdAtDesc: "アップロード日時が新しい順"
|
||||||
sizeAsc: "サイズが小さい順"
|
sizeAsc: "サイズが小さい順"
|
||||||
sizeDesc: "サイズが大きい順"
|
sizeDesc: "サイズが大きい順"
|
||||||
origin:
|
origin:
|
||||||
title: "オリジン"
|
title: "オリジン"
|
||||||
combined: "ローカル+リモート"
|
combined: "Local+Remoto"
|
||||||
local: "ローカル"
|
local: "Local"
|
||||||
remote: "リモート"
|
remote: "Remoto"
|
||||||
delete: "削除"
|
delete: "削除"
|
||||||
deleted: "削除しました"
|
deleted: "削除しました"
|
||||||
mark-as-sensitive: "閲覧注意に設定"
|
mark-as-sensitive: "閲覧注意に設定"
|
||||||
@ -1133,15 +1134,22 @@ admin/views/users.vue:
|
|||||||
user-not-found: "ユーザーが見つかりません"
|
user-not-found: "ユーザーが見つかりません"
|
||||||
lookup: "照会"
|
lookup: "照会"
|
||||||
reset-password: "パスワードをリセット"
|
reset-password: "パスワードをリセット"
|
||||||
|
reset-password-confirm: "パスワードをリセットしますか?"
|
||||||
password-updated: "パスワードは現在「{password}」です"
|
password-updated: "パスワードは現在「{password}」です"
|
||||||
suspend: "凍結"
|
suspend: "凍結"
|
||||||
|
suspend-confirm: "凍結しますか?"
|
||||||
suspended: "凍結しました"
|
suspended: "凍結しました"
|
||||||
unsuspend: "凍結の解除"
|
unsuspend: "凍結の解除"
|
||||||
|
unsuspend-confirm: "凍結を解除しますか?"
|
||||||
unsuspended: "凍結を解除しました"
|
unsuspended: "凍結を解除しました"
|
||||||
verify: "公式アカウントにする"
|
verify: "公式アカウントにする"
|
||||||
|
verify-confirm: "公式アカウントにしますか?"
|
||||||
verified: "公式アカウントにしました"
|
verified: "公式アカウントにしました"
|
||||||
unverify: "公式アカウントを解除する"
|
unverify: "公式アカウントを解除する"
|
||||||
|
unverify-confirm: "公式アカウントを解除しますか?"
|
||||||
unverified: "公式アカウントを解除しました"
|
unverified: "公式アカウントを解除しました"
|
||||||
|
update-remote-user: "リモートユーザー情報の更新"
|
||||||
|
remote-user-updated: "リモートユーザー情報を更新しました"
|
||||||
users:
|
users:
|
||||||
title: "ユーザー"
|
title: "ユーザー"
|
||||||
sort:
|
sort:
|
||||||
@ -1321,9 +1329,6 @@ mobile/views/components/drive.file-detail.vue:
|
|||||||
nsfw: "閲覧注意"
|
nsfw: "閲覧注意"
|
||||||
mark-as-sensitive: "閲覧注意に設定"
|
mark-as-sensitive: "閲覧注意に設定"
|
||||||
unmark-as-sensitive: "閲覧注意を解除"
|
unmark-as-sensitive: "閲覧注意を解除"
|
||||||
mobile/views/components/media-image.vue:
|
|
||||||
sensitive: "閲覧注意"
|
|
||||||
click-to-show: "クリックして表示"
|
|
||||||
mobile/views/components/media-video.vue:
|
mobile/views/components/media-video.vue:
|
||||||
sensitive: "閲覧注意"
|
sensitive: "閲覧注意"
|
||||||
click-to-show: "クリックして表示"
|
click-to-show: "クリックして表示"
|
||||||
@ -1468,6 +1473,7 @@ mobile/views/pages/settings.vue:
|
|||||||
notification-position-top: "上"
|
notification-position-top: "上"
|
||||||
behavior: "動作"
|
behavior: "動作"
|
||||||
fetch-on-scroll: "スクロールで自動読み込み"
|
fetch-on-scroll: "スクロールで自動読み込み"
|
||||||
|
keep-cw: "CW保持"
|
||||||
note-visibility: "投稿の公開範囲"
|
note-visibility: "投稿の公開範囲"
|
||||||
default-note-visibility: "デフォルトの公開範囲"
|
default-note-visibility: "デフォルトの公開範囲"
|
||||||
remember-note-visibility: "投稿の公開範囲を記憶する"
|
remember-note-visibility: "投稿の公開範囲を記憶する"
|
||||||
|
@ -350,17 +350,16 @@ common/views/components/note-menu.vue:
|
|||||||
delete-confirm: "Supprimer cette publication ?"
|
delete-confirm: "Supprimer cette publication ?"
|
||||||
remote: "Afficher la note originale"
|
remote: "Afficher la note originale"
|
||||||
common/views/components/user-menu.vue:
|
common/views/components/user-menu.vue:
|
||||||
mention: "メンション"
|
mention: "Mention"
|
||||||
mute: "ミュート"
|
mute: "Silencier"
|
||||||
unmute: "ミュート解除"
|
unmute: "Enlever la sourdine"
|
||||||
block: "ブロック"
|
block: "Bloquer"
|
||||||
unblock: "ブロック解除"
|
unblock: "Débloquer"
|
||||||
push-to-list: "リストに追加"
|
push-to-list: "Ajouter à une liste"
|
||||||
select-list: "リストを選択してください"
|
select-list: "Sélectionnez une liste"
|
||||||
list-pushed: "{user}を{list}に追加しました"
|
report-abuse: "Signaler un abus"
|
||||||
report-abuse: "スパムを報告"
|
report-abuse-detail: "Détail du signalement"
|
||||||
report-abuse-detail: "どのような迷惑行為を行っていますか?"
|
report-abuse-reported: "Transmit à l’administrateur. Merci de votre collaboration."
|
||||||
report-abuse-reported: "管理者に報告されました。ご協力ありがとうございました。"
|
|
||||||
common/views/components/poll.vue:
|
common/views/components/poll.vue:
|
||||||
vote-to: "Voter pour '{}'"
|
vote-to: "Voter pour '{}'"
|
||||||
vote-count: "{} votes"
|
vote-count: "{} votes"
|
||||||
@ -491,7 +490,7 @@ common/views/components/profile-editor.vue:
|
|||||||
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: "Les demandes d’abonnements venant de Bots requièrent l’approbation"
|
careful-bot: "Les demandes d’abonnements venant de Bots requièrent l’approbation"
|
||||||
auto-accept-followed: "フォローしているユーザーからのフォローを自動承認する"
|
auto-accept-followed: "Accepter automatiquement les demandes d’abonnement venant des gens que vous suivez"
|
||||||
advanced: "Avancé"
|
advanced: "Avancé"
|
||||||
privacy: "Vie privée"
|
privacy: "Vie privée"
|
||||||
save: "Mettre à jour le profil"
|
save: "Mettre à jour le profil"
|
||||||
@ -659,9 +658,6 @@ desktop/views/components/drive.vue:
|
|||||||
create-folder: "Créer un dossier"
|
create-folder: "Créer un dossier"
|
||||||
upload: "Téléverser un fichier"
|
upload: "Téléverser un fichier"
|
||||||
url-upload: "Téléverser à partir d’une URL"
|
url-upload: "Téléverser à partir d’une URL"
|
||||||
desktop/views/components/media-image.vue:
|
|
||||||
sensitive: "Le contenu est NSFW"
|
|
||||||
click-to-show: "Cliquer pour afficher"
|
|
||||||
desktop/views/components/media-video.vue:
|
desktop/views/components/media-video.vue:
|
||||||
sensitive: "Le contenu est NSFW"
|
sensitive: "Le contenu est NSFW"
|
||||||
click-to-show: "Cliquer pour afficher"
|
click-to-show: "Cliquer pour afficher"
|
||||||
@ -789,6 +785,8 @@ desktop/views/components/settings.vue:
|
|||||||
auto-popout-desc: "ウィンドウが開かれるとき、ポップアウト(ブラウザ外に切り離す)可能なら自動でポップアウトします。この設定はブラウザに記憶されます。"
|
auto-popout-desc: "ウィンドウが開かれるとき、ポップアウト(ブラウザ外に切り離す)可能なら自動でポップアウトします。この設定はブラウザに記憶されます。"
|
||||||
deck-nav: "Deck sans tansitions"
|
deck-nav: "Deck sans tansitions"
|
||||||
deck-nav-desc: "Vous obtenez une colonne temporaire sans transitions dans la page pendant la navigation, lors de l’utilisation du Deck."
|
deck-nav-desc: "Vous obtenez une colonne temporaire sans transitions dans la page pendant la navigation, lors de l’utilisation du Deck."
|
||||||
|
keep-cw: "Maintenir l'avertissement de contenu"
|
||||||
|
keep-cw-desc: "投稿にリプライする際、リプライ元の投稿にCWが設定されていたとき、デフォルトで同じCWを設定するようにします。"
|
||||||
deck-default: "Utiliser le Deck comme IU par défaut"
|
deck-default: "Utiliser le Deck comme IU par défaut"
|
||||||
display: "Affichage et design"
|
display: "Affichage et design"
|
||||||
customize: "Personnaliser l'Accueil"
|
customize: "Personnaliser l'Accueil"
|
||||||
@ -874,6 +872,9 @@ desktop/views/components/settings.2fa.vue:
|
|||||||
success: "Sauvegarde des paramètres avec succès !"
|
success: "Sauvegarde des paramètres avec succès !"
|
||||||
failed: "L’opération a échoué. Veuillez vous assurer que le jeton a été saisi correctement."
|
failed: "L’opération a échoué. Veuillez vous assurer que le jeton a été saisi correctement."
|
||||||
info: "À partir de maintenant, à chaque fois que vous vous connectez entrez votre mot de passe ainsi que le jeton généré sur votre appareil."
|
info: "À partir de maintenant, à chaque fois que vous vous connectez entrez votre mot de passe ainsi que le jeton généré sur votre appareil."
|
||||||
|
common/views/components/media-image.vue:
|
||||||
|
sensitive: "Contenu sensible"
|
||||||
|
click-to-show: "Cliquer pour afficher"
|
||||||
common/views/components/api-settings.vue:
|
common/views/components/api-settings.vue:
|
||||||
intro: "Pour accéder à l'API, définissez ce jeton comme la clé de « i » dans les paramètres de requête."
|
intro: "Pour accéder à l'API, définissez ce jeton comme la clé de « i » dans les paramètres de requête."
|
||||||
caution: "Merci de ne pas introduire ce jeton dans aucune application ou le divulguer à quiconque. Ceci risque de compromettre votre compte."
|
caution: "Merci de ne pas introduire ce jeton dans aucune application ou le divulguer à quiconque. Ceci risque de compromettre votre compte."
|
||||||
@ -990,7 +991,7 @@ admin/views/index.vue:
|
|||||||
federation: "Fédération"
|
federation: "Fédération"
|
||||||
announcements: "Annonces"
|
announcements: "Annonces"
|
||||||
hashtags: "Hashtags"
|
hashtags: "Hashtags"
|
||||||
abuse: "スパム報告"
|
abuse: "Abus"
|
||||||
back-to-misskey: "Retour vers Misskey"
|
back-to-misskey: "Retour vers Misskey"
|
||||||
admin/views/dashboard.vue:
|
admin/views/dashboard.vue:
|
||||||
dashboard: "Tableau de bord"
|
dashboard: "Tableau de bord"
|
||||||
@ -1001,11 +1002,11 @@ admin/views/dashboard.vue:
|
|||||||
this-instance: "Cette instance"
|
this-instance: "Cette instance"
|
||||||
federated: "Fédérées"
|
federated: "Fédérées"
|
||||||
admin/views/abuse.vue:
|
admin/views/abuse.vue:
|
||||||
title: "スパム報告"
|
title: "Abus"
|
||||||
target: "対象"
|
target: "Cible"
|
||||||
reporter: "報告者"
|
reporter: "Signalé par"
|
||||||
details: "詳細"
|
details: "Détails"
|
||||||
remove-report: "削除"
|
remove-report: "Supprimer"
|
||||||
admin/views/instance.vue:
|
admin/views/instance.vue:
|
||||||
instance: "Instance"
|
instance: "Instance"
|
||||||
instance-name: "Nom de l’instance"
|
instance-name: "Nom de l’instance"
|
||||||
@ -1052,7 +1053,7 @@ admin/views/instance.vue:
|
|||||||
max-note-text-length: "Nombre maximal de caractères pour les messages"
|
max-note-text-length: "Nombre maximal de caractères pour les messages"
|
||||||
disable-registration: "Désactiver les inscriptions"
|
disable-registration: "Désactiver les inscriptions"
|
||||||
disable-local-timeline: "Désactiver le fil local"
|
disable-local-timeline: "Désactiver le fil local"
|
||||||
disable-global-timeline: "グローバルタイムラインを無効にする"
|
disable-global-timeline: "Désactiver le fil global"
|
||||||
disabling-timelines-info: "これらのタイムラインを無効にしても、管理者およびモデレーターは引き続き利用できます。"
|
disabling-timelines-info: "これらのタイムラインを無効にしても、管理者およびモデレーターは引き続き利用できます。"
|
||||||
invite: "Inviter"
|
invite: "Inviter"
|
||||||
save: "Sauvegarder"
|
save: "Sauvegarder"
|
||||||
@ -1106,10 +1107,10 @@ admin/views/charts.vue:
|
|||||||
network-time: "Temps de réponse"
|
network-time: "Temps de réponse"
|
||||||
network-usage: "Traffic"
|
network-usage: "Traffic"
|
||||||
admin/views/drive.vue:
|
admin/views/drive.vue:
|
||||||
operation: "操作"
|
operation: "Actions"
|
||||||
fileid-or-url: "ファイルIDまたはファイルURL"
|
fileid-or-url: "ID du fichier ou URL"
|
||||||
file-not-found: "ファイルが見つかりません"
|
file-not-found: "Fichier non trouvé"
|
||||||
lookup: "照会"
|
lookup: "Recherche"
|
||||||
sort:
|
sort:
|
||||||
title: "Tri"
|
title: "Tri"
|
||||||
createdAtAsc: "Âge - Du plus ancien"
|
createdAtAsc: "Âge - Du plus ancien"
|
||||||
@ -1125,23 +1126,30 @@ admin/views/drive.vue:
|
|||||||
deleted: "Supprimé"
|
deleted: "Supprimé"
|
||||||
mark-as-sensitive: "Marquer comme sensible"
|
mark-as-sensitive: "Marquer comme sensible"
|
||||||
unmark-as-sensitive: "Ne pas marquer comme sensible"
|
unmark-as-sensitive: "Ne pas marquer comme sensible"
|
||||||
marked-as-sensitive: "閲覧注意に設定しました"
|
marked-as-sensitive: "Marqué comme sensible"
|
||||||
unmarked-as-sensitive: "閲覧注意を解除しました"
|
unmarked-as-sensitive: "Marqué comme non sensible"
|
||||||
admin/views/users.vue:
|
admin/views/users.vue:
|
||||||
operation: "Actions"
|
operation: "Actions"
|
||||||
username-or-userid: "Nom d’utilisateur·rice ou ID utilisateur"
|
username-or-userid: "Nom d’utilisateur·rice ou ID utilisateur"
|
||||||
user-not-found: "Utilisateur non trouvé"
|
user-not-found: "Utilisateur non trouvé"
|
||||||
lookup: "Recherche"
|
lookup: "Recherche"
|
||||||
reset-password: "Réinitialiser mot de passe"
|
reset-password: "Réinitialiser mot de passe"
|
||||||
|
reset-password-confirm: "Souhaitez-vous réinitialiser votre mot de passe ?"
|
||||||
password-updated: "Le mot de passe est « {password} »"
|
password-updated: "Le mot de passe est « {password} »"
|
||||||
suspend: "Suspendre"
|
suspend: "Suspendre"
|
||||||
|
suspend-confirm: "Désirez-vous suspendre ce compte ?"
|
||||||
suspended: "Suspendu avec succès."
|
suspended: "Suspendu avec succès."
|
||||||
unsuspend: "Suspension levée"
|
unsuspend: "Suspension levée"
|
||||||
|
unsuspend-confirm: "Souhaiteriez-vous ne plus suspendre ce compte ?"
|
||||||
unsuspended: "La suspension de l’utilisateur a été levée avec succès"
|
unsuspended: "La suspension de l’utilisateur a été levée avec succès"
|
||||||
verify: "Vérification du compte"
|
verify: "Vérification du compte"
|
||||||
|
verify-confirm: "Souhaiteriez-vous rendre votre compte comme étant un compte vérifié ?"
|
||||||
verified: "Le compte a été vérifié"
|
verified: "Le compte a été vérifié"
|
||||||
unverify: "Enlever la vérification du compte"
|
unverify: "Enlever la vérification du compte"
|
||||||
|
unverify-confirm: "公式アカウントを解除しますか?"
|
||||||
unverified: "Ce compte n'est plus vérifié"
|
unverified: "Ce compte n'est plus vérifié"
|
||||||
|
update-remote-user: "Mettre à jour les informations de l’utilisateur·rice distant·e"
|
||||||
|
remote-user-updated: "Les informations de l’utilisateur·rice distant·e ont étés mis à jour"
|
||||||
users:
|
users:
|
||||||
title: "Utilisateurs"
|
title: "Utilisateurs"
|
||||||
sort:
|
sort:
|
||||||
@ -1253,7 +1261,7 @@ desktop/views/pages/user/user.photos.vue:
|
|||||||
no-photos: "Pas de photos"
|
no-photos: "Pas de photos"
|
||||||
desktop/views/pages/user/user.profile.vue:
|
desktop/views/pages/user/user.profile.vue:
|
||||||
follows-you: "Vous suit"
|
follows-you: "Vous suit"
|
||||||
menu: "メニュー"
|
menu: "Menu"
|
||||||
desktop/views/pages/user/user.header.vue:
|
desktop/views/pages/user/user.header.vue:
|
||||||
posts: "Notes"
|
posts: "Notes"
|
||||||
following: "Suit"
|
following: "Suit"
|
||||||
@ -1321,9 +1329,6 @@ mobile/views/components/drive.file-detail.vue:
|
|||||||
nsfw: "CW"
|
nsfw: "CW"
|
||||||
mark-as-sensitive: "Marquer comme sensible"
|
mark-as-sensitive: "Marquer comme sensible"
|
||||||
unmark-as-sensitive: "Ne pas marquer comme sensible"
|
unmark-as-sensitive: "Ne pas marquer comme sensible"
|
||||||
mobile/views/components/media-image.vue:
|
|
||||||
sensitive: "Le contenu est NSFW"
|
|
||||||
click-to-show: "Cliquer pour afficher"
|
|
||||||
mobile/views/components/media-video.vue:
|
mobile/views/components/media-video.vue:
|
||||||
sensitive: "Le contenu est NSFW"
|
sensitive: "Le contenu est NSFW"
|
||||||
click-to-show: "Cliquer pour afficher"
|
click-to-show: "Cliquer pour afficher"
|
||||||
@ -1468,6 +1473,7 @@ mobile/views/pages/settings.vue:
|
|||||||
notification-position-top: "en haut"
|
notification-position-top: "en haut"
|
||||||
behavior: "Comportement"
|
behavior: "Comportement"
|
||||||
fetch-on-scroll: "Chargement lors du défilement"
|
fetch-on-scroll: "Chargement lors du défilement"
|
||||||
|
keep-cw: "Garder l'avertissement de contenu"
|
||||||
note-visibility: "Visibilité de la publication"
|
note-visibility: "Visibilité de la publication"
|
||||||
default-note-visibility: "Visibilité par défaut"
|
default-note-visibility: "Visibilité par défaut"
|
||||||
remember-note-visibility: "Se souvenir du mode de visibilité de la publication"
|
remember-note-visibility: "Se souvenir du mode de visibilité de la publication"
|
||||||
|
@ -357,7 +357,6 @@ common/views/components/user-menu.vue:
|
|||||||
unblock: "ブロック解除"
|
unblock: "ブロック解除"
|
||||||
push-to-list: "リストに追加"
|
push-to-list: "リストに追加"
|
||||||
select-list: "リストを選択してください"
|
select-list: "リストを選択してください"
|
||||||
list-pushed: "{user}を{list}に追加しました"
|
|
||||||
report-abuse: "スパムを報告"
|
report-abuse: "スパムを報告"
|
||||||
report-abuse-detail: "どのような迷惑行為を行っていますか?"
|
report-abuse-detail: "どのような迷惑行為を行っていますか?"
|
||||||
report-abuse-reported: "管理者に報告されました。ご協力ありがとうございました。"
|
report-abuse-reported: "管理者に報告されました。ご協力ありがとうございました。"
|
||||||
@ -659,9 +658,6 @@ desktop/views/components/drive.vue:
|
|||||||
create-folder: "フォルダーを作成"
|
create-folder: "フォルダーを作成"
|
||||||
upload: "ファイルをアップロード"
|
upload: "ファイルをアップロード"
|
||||||
url-upload: "URLからアップロード"
|
url-upload: "URLからアップロード"
|
||||||
desktop/views/components/media-image.vue:
|
|
||||||
sensitive: "閲覧注意"
|
|
||||||
click-to-show: "クリックして表示"
|
|
||||||
desktop/views/components/media-video.vue:
|
desktop/views/components/media-video.vue:
|
||||||
sensitive: "閲覧注意"
|
sensitive: "閲覧注意"
|
||||||
click-to-show: "クリックして表示"
|
click-to-show: "クリックして表示"
|
||||||
@ -789,6 +785,8 @@ desktop/views/components/settings.vue:
|
|||||||
auto-popout-desc: "ウィンドウが開かれるとき、ポップアウト(ブラウザ外に切り離す)可能なら自動でポップアウトします。この設定はブラウザに記憶されます。"
|
auto-popout-desc: "ウィンドウが開かれるとき、ポップアウト(ブラウザ外に切り離す)可能なら自動でポップアウトします。この設定はブラウザに記憶されます。"
|
||||||
deck-nav: "デッキ内ナビゲーション"
|
deck-nav: "デッキ内ナビゲーション"
|
||||||
deck-nav-desc: "デッキを使用しているとき、ナビゲーションが発生する際にページ遷移を行わずに一時的なカラムで受けるようにします。"
|
deck-nav-desc: "デッキを使用しているとき、ナビゲーションが発生する際にページ遷移を行わずに一時的なカラムで受けるようにします。"
|
||||||
|
keep-cw: "CW保持"
|
||||||
|
keep-cw-desc: "投稿にリプライする際、リプライ元の投稿にCWが設定されていたとき、デフォルトで同じCWを設定するようにします。"
|
||||||
deck-default: "デッキをデフォルトのUIにする"
|
deck-default: "デッキをデフォルトのUIにする"
|
||||||
display: "デザインと表示"
|
display: "デザインと表示"
|
||||||
customize: "ホームをカスタマイズ"
|
customize: "ホームをカスタマイズ"
|
||||||
@ -874,6 +872,9 @@ desktop/views/components/settings.2fa.vue:
|
|||||||
success: "設定が完了しました!"
|
success: "設定が完了しました!"
|
||||||
failed: "設定に失敗しました。トークンに誤りがないかご確認ください。"
|
failed: "設定に失敗しました。トークンに誤りがないかご確認ください。"
|
||||||
info: "次回サインインからは、同様にパスワードに加えてデバイスに表示されているトークンを入力します。"
|
info: "次回サインインからは、同様にパスワードに加えてデバイスに表示されているトークンを入力します。"
|
||||||
|
common/views/components/media-image.vue:
|
||||||
|
sensitive: "閲覧注意"
|
||||||
|
click-to-show: "クリックして表示"
|
||||||
common/views/components/api-settings.vue:
|
common/views/components/api-settings.vue:
|
||||||
intro: "APIを利用するには、上記のトークンを「i」というキーでパラメータに付加してリクエストします。"
|
intro: "APIを利用するには、上記のトークンを「i」というキーでパラメータに付加してリクエストします。"
|
||||||
caution: "アカウントを不正利用される可能性があるため、このトークンは第三者に教えないでください(アプリなどにも入力しないでください)。"
|
caution: "アカウントを不正利用される可能性があるため、このトークンは第三者に教えないでください(アプリなどにも入力しないでください)。"
|
||||||
@ -1133,15 +1134,22 @@ admin/views/users.vue:
|
|||||||
user-not-found: "ユーザーが見つかりません"
|
user-not-found: "ユーザーが見つかりません"
|
||||||
lookup: "照会"
|
lookup: "照会"
|
||||||
reset-password: "パスワードをリセット"
|
reset-password: "パスワードをリセット"
|
||||||
|
reset-password-confirm: "パスワードをリセットしますか?"
|
||||||
password-updated: "パスワードは現在「{password}」です"
|
password-updated: "パスワードは現在「{password}」です"
|
||||||
suspend: "凍結"
|
suspend: "凍結"
|
||||||
|
suspend-confirm: "凍結しますか?"
|
||||||
suspended: "凍結しました"
|
suspended: "凍結しました"
|
||||||
unsuspend: "凍結の解除"
|
unsuspend: "凍結の解除"
|
||||||
|
unsuspend-confirm: "凍結を解除しますか?"
|
||||||
unsuspended: "凍結を解除しました"
|
unsuspended: "凍結を解除しました"
|
||||||
verify: "公式アカウントにする"
|
verify: "公式アカウントにする"
|
||||||
|
verify-confirm: "公式アカウントにしますか?"
|
||||||
verified: "公式アカウントにしました"
|
verified: "公式アカウントにしました"
|
||||||
unverify: "公式アカウントを解除する"
|
unverify: "公式アカウントを解除する"
|
||||||
|
unverify-confirm: "公式アカウントを解除しますか?"
|
||||||
unverified: "公式アカウントを解除しました"
|
unverified: "公式アカウントを解除しました"
|
||||||
|
update-remote-user: "リモートユーザー情報の更新"
|
||||||
|
remote-user-updated: "リモートユーザー情報を更新しました"
|
||||||
users:
|
users:
|
||||||
title: "ユーザー"
|
title: "ユーザー"
|
||||||
sort:
|
sort:
|
||||||
@ -1321,9 +1329,6 @@ mobile/views/components/drive.file-detail.vue:
|
|||||||
nsfw: "閲覧注意"
|
nsfw: "閲覧注意"
|
||||||
mark-as-sensitive: "閲覧注意に設定"
|
mark-as-sensitive: "閲覧注意に設定"
|
||||||
unmark-as-sensitive: "閲覧注意を解除"
|
unmark-as-sensitive: "閲覧注意を解除"
|
||||||
mobile/views/components/media-image.vue:
|
|
||||||
sensitive: "閲覧注意"
|
|
||||||
click-to-show: "クリックして表示"
|
|
||||||
mobile/views/components/media-video.vue:
|
mobile/views/components/media-video.vue:
|
||||||
sensitive: "閲覧注意"
|
sensitive: "閲覧注意"
|
||||||
click-to-show: "クリックして表示"
|
click-to-show: "クリックして表示"
|
||||||
@ -1468,6 +1473,7 @@ mobile/views/pages/settings.vue:
|
|||||||
notification-position-top: "上"
|
notification-position-top: "上"
|
||||||
behavior: "動作"
|
behavior: "動作"
|
||||||
fetch-on-scroll: "スクロールで自動読み込み"
|
fetch-on-scroll: "スクロールで自動読み込み"
|
||||||
|
keep-cw: "CW保持"
|
||||||
note-visibility: "投稿の公開範囲"
|
note-visibility: "投稿の公開範囲"
|
||||||
default-note-visibility: "デフォルトの公開範囲"
|
default-note-visibility: "デフォルトの公開範囲"
|
||||||
remember-note-visibility: "投稿の公開範囲を記憶する"
|
remember-note-visibility: "投稿の公開範囲を記憶する"
|
||||||
|
@ -388,7 +388,6 @@ common/views/components/user-menu.vue:
|
|||||||
unblock: "ブロック解除"
|
unblock: "ブロック解除"
|
||||||
push-to-list: "リストに追加"
|
push-to-list: "リストに追加"
|
||||||
select-list: "リストを選択してください"
|
select-list: "リストを選択してください"
|
||||||
list-pushed: "{user}を{list}に追加しました"
|
|
||||||
report-abuse: "スパムを報告"
|
report-abuse: "スパムを報告"
|
||||||
report-abuse-detail: "どのような迷惑行為を行っていますか?"
|
report-abuse-detail: "どのような迷惑行為を行っていますか?"
|
||||||
report-abuse-reported: "管理者に報告されました。ご協力ありがとうございました。"
|
report-abuse-reported: "管理者に報告されました。ご協力ありがとうございました。"
|
||||||
@ -731,10 +730,6 @@ desktop/views/components/drive.vue:
|
|||||||
upload: "ファイルをアップロード"
|
upload: "ファイルをアップロード"
|
||||||
url-upload: "URLからアップロード"
|
url-upload: "URLからアップロード"
|
||||||
|
|
||||||
desktop/views/components/media-image.vue:
|
|
||||||
sensitive: "閲覧注意"
|
|
||||||
click-to-show: "クリックして表示"
|
|
||||||
|
|
||||||
desktop/views/components/media-video.vue:
|
desktop/views/components/media-video.vue:
|
||||||
sensitive: "閲覧注意"
|
sensitive: "閲覧注意"
|
||||||
click-to-show: "クリックして表示"
|
click-to-show: "クリックして表示"
|
||||||
@ -885,6 +880,8 @@ desktop/views/components/settings.vue:
|
|||||||
auto-popout-desc: "ウィンドウが開かれるとき、ポップアウト(ブラウザ外に切り離す)可能なら自動でポップアウトします。この設定はブラウザに記憶されます。"
|
auto-popout-desc: "ウィンドウが開かれるとき、ポップアウト(ブラウザ外に切り離す)可能なら自動でポップアウトします。この設定はブラウザに記憶されます。"
|
||||||
deck-nav: "デッキ内ナビゲーション"
|
deck-nav: "デッキ内ナビゲーション"
|
||||||
deck-nav-desc: "デッキを使用しているとき、ナビゲーションが発生する際にページ遷移を行わずに一時的なカラムで受けるようにします。"
|
deck-nav-desc: "デッキを使用しているとき、ナビゲーションが発生する際にページ遷移を行わずに一時的なカラムで受けるようにします。"
|
||||||
|
keep-cw: "CW保持"
|
||||||
|
keep-cw-desc: "投稿にリプライする際、リプライ元の投稿にCWが設定されていたとき、デフォルトで同じCWを設定するようにします。"
|
||||||
deck-default: "デッキをデフォルトのUIにする"
|
deck-default: "デッキをデフォルトのUIにする"
|
||||||
|
|
||||||
display: "デザインと表示"
|
display: "デザインと表示"
|
||||||
@ -979,6 +976,10 @@ desktop/views/components/settings.2fa.vue:
|
|||||||
failed: "設定に失敗しました。トークンに誤りがないかご確認ください。"
|
failed: "設定に失敗しました。トークンに誤りがないかご確認ください。"
|
||||||
info: "次回サインインからは、同様にパスワードに加えてデバイスに表示されているトークンを入力します。"
|
info: "次回サインインからは、同様にパスワードに加えてデバイスに表示されているトークンを入力します。"
|
||||||
|
|
||||||
|
common/views/components/media-image.vue:
|
||||||
|
sensitive: "閲覧注意"
|
||||||
|
click-to-show: "クリックして表示"
|
||||||
|
|
||||||
common/views/components/api-settings.vue:
|
common/views/components/api-settings.vue:
|
||||||
intro: "APIを利用するには、上記のトークンを「i」というキーでパラメータに付加してリクエストします。"
|
intro: "APIを利用するには、上記のトークンを「i」というキーでパラメータに付加してリクエストします。"
|
||||||
caution: "アカウントを不正利用される可能性があるため、このトークンは第三者に教えないでください(アプリなどにも入力しないでください)。"
|
caution: "アカウントを不正利用される可能性があるため、このトークンは第三者に教えないでください(アプリなどにも入力しないでください)。"
|
||||||
@ -1265,15 +1266,24 @@ admin/views/users.vue:
|
|||||||
user-not-found: "ユーザーが見つかりません"
|
user-not-found: "ユーザーが見つかりません"
|
||||||
lookup: "照会"
|
lookup: "照会"
|
||||||
reset-password: "パスワードをリセット"
|
reset-password: "パスワードをリセット"
|
||||||
|
reset-password-confirm: "パスワードをリセットしますか?"
|
||||||
password-updated: "パスワードは現在「{password}」です"
|
password-updated: "パスワードは現在「{password}」です"
|
||||||
suspend: "凍結"
|
suspend: "凍結"
|
||||||
|
suspend-confirm: "凍結しますか?"
|
||||||
suspended: "凍結しました"
|
suspended: "凍結しました"
|
||||||
unsuspend: "凍結の解除"
|
unsuspend: "凍結の解除"
|
||||||
|
unsuspend-confirm: "凍結を解除しますか?"
|
||||||
unsuspended: "凍結を解除しました"
|
unsuspended: "凍結を解除しました"
|
||||||
|
make-silence: "サイレンス"
|
||||||
|
unmake-silence: "サイレンスの解除"
|
||||||
verify: "公式アカウントにする"
|
verify: "公式アカウントにする"
|
||||||
|
verify-confirm: "公式アカウントにしますか?"
|
||||||
verified: "公式アカウントにしました"
|
verified: "公式アカウントにしました"
|
||||||
unverify: "公式アカウントを解除する"
|
unverify: "公式アカウントを解除する"
|
||||||
|
unverify-confirm: "公式アカウントを解除しますか?"
|
||||||
unverified: "公式アカウントを解除しました"
|
unverified: "公式アカウントを解除しました"
|
||||||
|
update-remote-user: "リモートユーザー情報の更新"
|
||||||
|
remote-user-updated: "リモートユーザー情報を更新しました"
|
||||||
users:
|
users:
|
||||||
title: "ユーザー"
|
title: "ユーザー"
|
||||||
sort:
|
sort:
|
||||||
@ -1485,10 +1495,6 @@ mobile/views/components/drive.file-detail.vue:
|
|||||||
mark-as-sensitive: "閲覧注意に設定"
|
mark-as-sensitive: "閲覧注意に設定"
|
||||||
unmark-as-sensitive: "閲覧注意を解除"
|
unmark-as-sensitive: "閲覧注意を解除"
|
||||||
|
|
||||||
mobile/views/components/media-image.vue:
|
|
||||||
sensitive: "閲覧注意"
|
|
||||||
click-to-show: "クリックして表示"
|
|
||||||
|
|
||||||
mobile/views/components/media-video.vue:
|
mobile/views/components/media-video.vue:
|
||||||
sensitive: "閲覧注意"
|
sensitive: "閲覧注意"
|
||||||
click-to-show: "クリックして表示"
|
click-to-show: "クリックして表示"
|
||||||
@ -1665,6 +1671,7 @@ mobile/views/pages/settings.vue:
|
|||||||
notification-position-top: "上"
|
notification-position-top: "上"
|
||||||
behavior: "動作"
|
behavior: "動作"
|
||||||
fetch-on-scroll: "スクロールで自動読み込み"
|
fetch-on-scroll: "スクロールで自動読み込み"
|
||||||
|
keep-cw: "CW保持"
|
||||||
note-visibility: "投稿の公開範囲"
|
note-visibility: "投稿の公開範囲"
|
||||||
default-note-visibility: "デフォルトの公開範囲"
|
default-note-visibility: "デフォルトの公開範囲"
|
||||||
remember-note-visibility: "投稿の公開範囲を記憶する"
|
remember-note-visibility: "投稿の公開範囲を記憶する"
|
||||||
|
@ -357,7 +357,6 @@ common/views/components/user-menu.vue:
|
|||||||
unblock: "ブロック解除"
|
unblock: "ブロック解除"
|
||||||
push-to-list: "リストに追加"
|
push-to-list: "リストに追加"
|
||||||
select-list: "リストを選択してください"
|
select-list: "リストを選択してください"
|
||||||
list-pushed: "{user}を{list}に追加しました"
|
|
||||||
report-abuse: "スパムを報告"
|
report-abuse: "スパムを報告"
|
||||||
report-abuse-detail: "どのような迷惑行為を行っていますか?"
|
report-abuse-detail: "どのような迷惑行為を行っていますか?"
|
||||||
report-abuse-reported: "管理者に報告されました。ご協力ありがとうございました。"
|
report-abuse-reported: "管理者に報告されました。ご協力ありがとうございました。"
|
||||||
@ -659,9 +658,6 @@ desktop/views/components/drive.vue:
|
|||||||
create-folder: "フォルダー作る"
|
create-folder: "フォルダー作る"
|
||||||
upload: "ファイル上げる"
|
upload: "ファイル上げる"
|
||||||
url-upload: "URLつこうて上げる"
|
url-upload: "URLつこうて上げる"
|
||||||
desktop/views/components/media-image.vue:
|
|
||||||
sensitive: "ちょっと見せられへんわ"
|
|
||||||
click-to-show: "クリックして見せるで"
|
|
||||||
desktop/views/components/media-video.vue:
|
desktop/views/components/media-video.vue:
|
||||||
sensitive: "ちょっと見せられへんわ"
|
sensitive: "ちょっと見せられへんわ"
|
||||||
click-to-show: "クリックして見せるで"
|
click-to-show: "クリックして見せるで"
|
||||||
@ -789,6 +785,8 @@ desktop/views/components/settings.vue:
|
|||||||
auto-popout-desc: "ウィンドウが開かれるとき、ポップアウト(ブラウザ外に切り離す)可能なら自動でポップアウトすんで。この設定はブラウザに記憶されんで。"
|
auto-popout-desc: "ウィンドウが開かれるとき、ポップアウト(ブラウザ外に切り離す)可能なら自動でポップアウトすんで。この設定はブラウザに記憶されんで。"
|
||||||
deck-nav: "デッキ内ナビゲーション"
|
deck-nav: "デッキ内ナビゲーション"
|
||||||
deck-nav-desc: "デッキを使うとるとき、ナビゲーションが発生するときにページ移動せんで、一時的なカラムで受けれるようにするで"
|
deck-nav-desc: "デッキを使うとるとき、ナビゲーションが発生するときにページ移動せんで、一時的なカラムで受けれるようにするで"
|
||||||
|
keep-cw: "CW保持"
|
||||||
|
keep-cw-desc: "投稿にリプライする際、リプライ元の投稿にCWが設定されていたとき、デフォルトで同じCWを設定するようにします。"
|
||||||
deck-default: "デッキをデフォルトのUIにする"
|
deck-default: "デッキをデフォルトのUIにする"
|
||||||
display: "見た感じ"
|
display: "見た感じ"
|
||||||
customize: "ホームをカスタマイズ"
|
customize: "ホームをカスタマイズ"
|
||||||
@ -874,6 +872,9 @@ desktop/views/components/settings.2fa.vue:
|
|||||||
success: "設定が完了したで!"
|
success: "設定が完了したで!"
|
||||||
failed: "なんか設定に失敗したで。トークンを間違えとらんか確認してや。"
|
failed: "なんか設定に失敗したで。トークンを間違えとらんか確認してや。"
|
||||||
info: "次のサインインからは、パスワードに加えてデバイスに出とるトークンを入力してな。"
|
info: "次のサインインからは、パスワードに加えてデバイスに出とるトークンを入力してな。"
|
||||||
|
common/views/components/media-image.vue:
|
||||||
|
sensitive: "閲覧注意"
|
||||||
|
click-to-show: "クリックして表示"
|
||||||
common/views/components/api-settings.vue:
|
common/views/components/api-settings.vue:
|
||||||
intro: "API使うんやったらこのトークンを「i」っちゅうパラメータにくっつけてリクエストできるで。"
|
intro: "API使うんやったらこのトークンを「i」っちゅうパラメータにくっつけてリクエストできるで。"
|
||||||
caution: "アカウント勝手にいじられるかも知れんから、このトークンは教えたらあかんし、アプリにも書いたらあかんで(これはフリちゃうで)"
|
caution: "アカウント勝手にいじられるかも知れんから、このトークンは教えたらあかんし、アプリにも書いたらあかんで(これはフリちゃうで)"
|
||||||
@ -1133,15 +1134,22 @@ admin/views/users.vue:
|
|||||||
user-not-found: "ユーザーが見つからへん!"
|
user-not-found: "ユーザーが見つからへん!"
|
||||||
lookup: "照会"
|
lookup: "照会"
|
||||||
reset-password: "パスワードをリセット"
|
reset-password: "パスワードをリセット"
|
||||||
|
reset-password-confirm: "パスワードをリセットしますか?"
|
||||||
password-updated: "パスワードは現在「{password} 」やで"
|
password-updated: "パスワードは現在「{password} 」やで"
|
||||||
suspend: "凍結"
|
suspend: "凍結"
|
||||||
|
suspend-confirm: "凍結しますか?"
|
||||||
suspended: "凍結しました"
|
suspended: "凍結しました"
|
||||||
unsuspend: "凍結の解除"
|
unsuspend: "凍結の解除"
|
||||||
|
unsuspend-confirm: "凍結を解除しますか?"
|
||||||
unsuspended: "凍結を解除しました"
|
unsuspended: "凍結を解除しました"
|
||||||
verify: "公式アカウントにする"
|
verify: "公式アカウントにする"
|
||||||
|
verify-confirm: "公式アカウントにしますか?"
|
||||||
verified: "公式アカウントにしました"
|
verified: "公式アカウントにしました"
|
||||||
unverify: "公式アカウントを解除する"
|
unverify: "公式アカウントを解除する"
|
||||||
|
unverify-confirm: "公式アカウントを解除しますか?"
|
||||||
unverified: "公式アカウントを解除しました"
|
unverified: "公式アカウントを解除しました"
|
||||||
|
update-remote-user: "リモートユーザー情報の更新"
|
||||||
|
remote-user-updated: "リモートユーザー情報を更新しました"
|
||||||
users:
|
users:
|
||||||
title: "ユーザー"
|
title: "ユーザー"
|
||||||
sort:
|
sort:
|
||||||
@ -1321,9 +1329,6 @@ mobile/views/components/drive.file-detail.vue:
|
|||||||
nsfw: "ちょっと見せられへんわ"
|
nsfw: "ちょっと見せられへんわ"
|
||||||
mark-as-sensitive: "見たらあかん感じにしとく"
|
mark-as-sensitive: "見たらあかん感じにしとく"
|
||||||
unmark-as-sensitive: "やっぱ見せたるわ"
|
unmark-as-sensitive: "やっぱ見せたるわ"
|
||||||
mobile/views/components/media-image.vue:
|
|
||||||
sensitive: "見たらあかんで"
|
|
||||||
click-to-show: "押してみ、見せたるわ"
|
|
||||||
mobile/views/components/media-video.vue:
|
mobile/views/components/media-video.vue:
|
||||||
sensitive: "ちょっと見せられへんわ"
|
sensitive: "ちょっと見せられへんわ"
|
||||||
click-to-show: "押してみ、見せたるわ"
|
click-to-show: "押してみ、見せたるわ"
|
||||||
@ -1468,6 +1473,7 @@ mobile/views/pages/settings.vue:
|
|||||||
notification-position-top: "キタの方"
|
notification-position-top: "キタの方"
|
||||||
behavior: "動き"
|
behavior: "動き"
|
||||||
fetch-on-scroll: "スクロールしたらもっと見せてや"
|
fetch-on-scroll: "スクロールしたらもっと見せてや"
|
||||||
|
keep-cw: "CW保持"
|
||||||
note-visibility: "投稿の公開範囲"
|
note-visibility: "投稿の公開範囲"
|
||||||
default-note-visibility: "もとからの公開範囲"
|
default-note-visibility: "もとからの公開範囲"
|
||||||
remember-note-visibility: "投稿の公開範囲おぼえといて"
|
remember-note-visibility: "投稿の公開範囲おぼえといて"
|
||||||
|
@ -27,7 +27,7 @@ common:
|
|||||||
do-not-copy-paste: "여기에 코드를 입력하거나 붙여넣지 마십시오. 계정이 무단으로 사용될 수 있습니다."
|
do-not-copy-paste: "여기에 코드를 입력하거나 붙여넣지 마십시오. 계정이 무단으로 사용될 수 있습니다."
|
||||||
load-more: "더보기"
|
load-more: "더보기"
|
||||||
enter-password: "비밀번호를 입력하여 주십시오"
|
enter-password: "비밀번호를 입력하여 주십시오"
|
||||||
2fa: "二段階認証"
|
2fa: "2단계 인증"
|
||||||
got-it: "알겠습니다"
|
got-it: "알겠습니다"
|
||||||
customization-tips:
|
customization-tips:
|
||||||
title: "커스터마이징 도움말"
|
title: "커스터마이징 도움말"
|
||||||
@ -350,17 +350,16 @@ common/views/components/note-menu.vue:
|
|||||||
delete-confirm: "이 글을 삭제하시겠습니까?"
|
delete-confirm: "이 글을 삭제하시겠습니까?"
|
||||||
remote: "글 원본 보기"
|
remote: "글 원본 보기"
|
||||||
common/views/components/user-menu.vue:
|
common/views/components/user-menu.vue:
|
||||||
mention: "メンション"
|
mention: "멘션"
|
||||||
mute: "ミュート"
|
mute: "뮤트"
|
||||||
unmute: "ミュート解除"
|
unmute: "뮤트 해제"
|
||||||
block: "ブロック"
|
block: "차단"
|
||||||
unblock: "ブロック解除"
|
unblock: "차단 해제"
|
||||||
push-to-list: "リストに追加"
|
push-to-list: "리스트에 추가"
|
||||||
select-list: "リストを選択してください"
|
select-list: "리스트를 선택하여 주십시오"
|
||||||
list-pushed: "{user}を{list}に追加しました"
|
report-abuse: "스팸 신고"
|
||||||
report-abuse: "スパムを報告"
|
report-abuse-detail: "어떤 스팸 행위를 하고 있습니까?"
|
||||||
report-abuse-detail: "どのような迷惑行為を行っていますか?"
|
report-abuse-reported: "관리자에게 보고되었습니다. 협조해주셔서 감사합니다."
|
||||||
report-abuse-reported: "管理者に報告されました。ご協力ありがとうございました。"
|
|
||||||
common/views/components/poll.vue:
|
common/views/components/poll.vue:
|
||||||
vote-to: "\"{}\"에 투표하기"
|
vote-to: "\"{}\"에 투표하기"
|
||||||
vote-count: "{}표"
|
vote-count: "{}표"
|
||||||
@ -594,7 +593,7 @@ desktop/views/components/calendar.vue:
|
|||||||
title: "{year}년 {month}월"
|
title: "{year}년 {month}월"
|
||||||
prev: "이전 달"
|
prev: "이전 달"
|
||||||
next: "다음 달"
|
next: "다음 달"
|
||||||
go: "클릭 하 여 시간 회귀"
|
go: "클릭하여 시간역행"
|
||||||
desktop/views/components/choose-file-from-drive-window.vue:
|
desktop/views/components/choose-file-from-drive-window.vue:
|
||||||
chosen-files: "{count} 파일 선택중"
|
chosen-files: "{count} 파일 선택중"
|
||||||
upload: "PC에서 드라이브에 파일을 업로드"
|
upload: "PC에서 드라이브에 파일을 업로드"
|
||||||
@ -659,9 +658,6 @@ desktop/views/components/drive.vue:
|
|||||||
create-folder: "폴더 만들기"
|
create-folder: "폴더 만들기"
|
||||||
upload: "파일 업로드"
|
upload: "파일 업로드"
|
||||||
url-upload: "URL에서 업로드"
|
url-upload: "URL에서 업로드"
|
||||||
desktop/views/components/media-image.vue:
|
|
||||||
sensitive: "열람주의"
|
|
||||||
click-to-show: "클릭하여 표시"
|
|
||||||
desktop/views/components/media-video.vue:
|
desktop/views/components/media-video.vue:
|
||||||
sensitive: "열람주의"
|
sensitive: "열람주의"
|
||||||
click-to-show: "클릭하여 표시"
|
click-to-show: "클릭하여 표시"
|
||||||
@ -789,6 +785,8 @@ desktop/views/components/settings.vue:
|
|||||||
auto-popout-desc: "창이 열릴 때 팝아웃 (브라우저 밖으로 분리) 이 가능한 경우 자동으로 팝아웃합니다. 이 설정은 브라우저에 저장됩니다."
|
auto-popout-desc: "창이 열릴 때 팝아웃 (브라우저 밖으로 분리) 이 가능한 경우 자동으로 팝아웃합니다. 이 설정은 브라우저에 저장됩니다."
|
||||||
deck-nav: "덱 내 탐색"
|
deck-nav: "덱 내 탐색"
|
||||||
deck-nav-desc: "덱을 사용중일 때, 내비게이션이 발생하였을 경우 페이지를 이동하지 않고 일시적으로 임시 칼럼을 생성하도록 합니다."
|
deck-nav-desc: "덱을 사용중일 때, 내비게이션이 발생하였을 경우 페이지를 이동하지 않고 일시적으로 임시 칼럼을 생성하도록 합니다."
|
||||||
|
keep-cw: "CW 유지"
|
||||||
|
keep-cw-desc: "글에 답글을 달 때, 답글할 글에 CW가 설정되어 있는 경우 기본값으로 동일한 CW를 설정하도록 합니다."
|
||||||
deck-default: "덱을 기본 UI로 설정"
|
deck-default: "덱을 기본 UI로 설정"
|
||||||
display: "디자인 및 표시"
|
display: "디자인 및 표시"
|
||||||
customize: "홈 커스터마이징"
|
customize: "홈 커스터마이징"
|
||||||
@ -874,6 +872,9 @@ desktop/views/components/settings.2fa.vue:
|
|||||||
success: "설정이 완료되었습니다!"
|
success: "설정이 완료되었습니다!"
|
||||||
failed: "설정에 실패했습니다. 토큰이 잘못되었는지 확인해주십시오."
|
failed: "설정에 실패했습니다. 토큰이 잘못되었는지 확인해주십시오."
|
||||||
info: "다음 로그인부터는 이와 동일하게 비밀번호에 더해 장치에 표시된 토큰을 입력합니다."
|
info: "다음 로그인부터는 이와 동일하게 비밀번호에 더해 장치에 표시된 토큰을 입력합니다."
|
||||||
|
common/views/components/media-image.vue:
|
||||||
|
sensitive: "열람주의"
|
||||||
|
click-to-show: "클릭하여 보기"
|
||||||
common/views/components/api-settings.vue:
|
common/views/components/api-settings.vue:
|
||||||
intro: "API를 사용하려면 위의 토큰을 \"i\" 라는 키의 값으로 매개변수를 추가하여 요청합니다."
|
intro: "API를 사용하려면 위의 토큰을 \"i\" 라는 키의 값으로 매개변수를 추가하여 요청합니다."
|
||||||
caution: "계정을 부정 사용할 가능성이 있으므로, 이 토큰은 제 3자에게 알려주지 마십시오 (앱 등에 붙여넣지 마십시오)."
|
caution: "계정을 부정 사용할 가능성이 있으므로, 이 토큰은 제 3자에게 알려주지 마십시오 (앱 등에 붙여넣지 마십시오)."
|
||||||
@ -990,7 +991,7 @@ admin/views/index.vue:
|
|||||||
federation: "연합"
|
federation: "연합"
|
||||||
announcements: "공지사항"
|
announcements: "공지사항"
|
||||||
hashtags: "해시태그"
|
hashtags: "해시태그"
|
||||||
abuse: "スパム報告"
|
abuse: "스팸 신고"
|
||||||
back-to-misskey: "Misskey로 돌아가기"
|
back-to-misskey: "Misskey로 돌아가기"
|
||||||
admin/views/dashboard.vue:
|
admin/views/dashboard.vue:
|
||||||
dashboard: "대시보드"
|
dashboard: "대시보드"
|
||||||
@ -1001,11 +1002,11 @@ admin/views/dashboard.vue:
|
|||||||
this-instance: "이 인스턴스"
|
this-instance: "이 인스턴스"
|
||||||
federated: "연합"
|
federated: "연합"
|
||||||
admin/views/abuse.vue:
|
admin/views/abuse.vue:
|
||||||
title: "スパム報告"
|
title: "스팸 신고"
|
||||||
target: "対象"
|
target: "대상"
|
||||||
reporter: "報告者"
|
reporter: "신고자"
|
||||||
details: "詳細"
|
details: "상세"
|
||||||
remove-report: "削除"
|
remove-report: "삭제"
|
||||||
admin/views/instance.vue:
|
admin/views/instance.vue:
|
||||||
instance: "인스턴스"
|
instance: "인스턴스"
|
||||||
instance-name: "인스턴스 이름"
|
instance-name: "인스턴스 이름"
|
||||||
@ -1053,7 +1054,7 @@ admin/views/instance.vue:
|
|||||||
disable-registration: "사용자 등록 비활성화"
|
disable-registration: "사용자 등록 비활성화"
|
||||||
disable-local-timeline: "로컬 타임라인 비활성화"
|
disable-local-timeline: "로컬 타임라인 비활성화"
|
||||||
disable-global-timeline: "글로벌 타임라인 비활성화"
|
disable-global-timeline: "글로벌 타임라인 비활성화"
|
||||||
disabling-timelines-info: "これらのタイムラインを無効にしても、管理者およびモデレーターは引き続き利用できます。"
|
disabling-timelines-info: "이 타임라인들을 비활성화해도 관리자 및 모더레이터는 계속 사용할 수 있습니다."
|
||||||
invite: "초대"
|
invite: "초대"
|
||||||
save: "저장"
|
save: "저장"
|
||||||
saved: "저장하였습니다"
|
saved: "저장하였습니다"
|
||||||
@ -1064,7 +1065,7 @@ admin/views/instance.vue:
|
|||||||
external-user-recommendation-timeout: "타임 아웃"
|
external-user-recommendation-timeout: "타임 아웃"
|
||||||
external-user-recommendation-timeout-desc: "밀리초 (예: 300000)"
|
external-user-recommendation-timeout-desc: "밀리초 (예: 300000)"
|
||||||
email-config: "메일 서버 설정"
|
email-config: "메일 서버 설정"
|
||||||
email-config-info: "메일 주소 확인 혹은 암호 재설정에 사용 됩니다."
|
email-config-info: "메일 주소 확인 혹은 비밀번호 재설정에 사용 됩니다."
|
||||||
enable-email: "메일 발신 활성화"
|
enable-email: "메일 발신 활성화"
|
||||||
email: "메일 주소"
|
email: "메일 주소"
|
||||||
smtp-secure: "SMTP 연결에 암시적으로 SSL/TLS를 사용"
|
smtp-secure: "SMTP 연결에 암시적으로 SSL/TLS를 사용"
|
||||||
@ -1097,7 +1098,7 @@ admin/views/charts.vue:
|
|||||||
notes-total: "글 누적 수"
|
notes-total: "글 누적 수"
|
||||||
users: "사용자 증감"
|
users: "사용자 증감"
|
||||||
users-total: "사용자 누적"
|
users-total: "사용자 누적"
|
||||||
active-users: "アクティブユーザー数"
|
active-users: "활성 사용자 수"
|
||||||
drive: "드라이브 사용량 증감"
|
drive: "드라이브 사용량 증감"
|
||||||
drive-total: "드라이브 사용량 누적"
|
drive-total: "드라이브 사용량 누적"
|
||||||
drive-files: "드라이브 파일 수 증감"
|
drive-files: "드라이브 파일 수 증감"
|
||||||
@ -1106,10 +1107,10 @@ admin/views/charts.vue:
|
|||||||
network-time: "응답시간"
|
network-time: "응답시간"
|
||||||
network-usage: "통신량"
|
network-usage: "통신량"
|
||||||
admin/views/drive.vue:
|
admin/views/drive.vue:
|
||||||
operation: "操作"
|
operation: "작업"
|
||||||
fileid-or-url: "ファイルIDまたはファイルURL"
|
fileid-or-url: "파일 ID 또는 파일 URL"
|
||||||
file-not-found: "ファイルが見つかりません"
|
file-not-found: "파일을 찾을 수 없습니다"
|
||||||
lookup: "照会"
|
lookup: "조회"
|
||||||
sort:
|
sort:
|
||||||
title: "정렬"
|
title: "정렬"
|
||||||
createdAtAsc: "업로드 날짜 오랜 순"
|
createdAtAsc: "업로드 날짜 오랜 순"
|
||||||
@ -1125,23 +1126,30 @@ admin/views/drive.vue:
|
|||||||
deleted: "삭제하였습니다"
|
deleted: "삭제하였습니다"
|
||||||
mark-as-sensitive: "열람주의로 설정"
|
mark-as-sensitive: "열람주의로 설정"
|
||||||
unmark-as-sensitive: "열람주의 해제"
|
unmark-as-sensitive: "열람주의 해제"
|
||||||
marked-as-sensitive: "閲覧注意に設定しました"
|
marked-as-sensitive: "열람주의로 설정하였습니다"
|
||||||
unmarked-as-sensitive: "閲覧注意を解除しました"
|
unmarked-as-sensitive: "열람주의를 제거하였습니다"
|
||||||
admin/views/users.vue:
|
admin/views/users.vue:
|
||||||
operation: "작업"
|
operation: "작업"
|
||||||
username-or-userid: "사용자명 혹은 사용자 ID"
|
username-or-userid: "사용자명 혹은 사용자 ID"
|
||||||
user-not-found: "사용자를 찾을 수 없습니다"
|
user-not-found: "사용자를 찾을 수 없습니다"
|
||||||
lookup: "조회"
|
lookup: "조회"
|
||||||
reset-password: "암호 재설정"
|
reset-password: "비밀번호 재설정"
|
||||||
password-updated: "암호는 현재 \"{password}\" 입니다"
|
reset-password-confirm: "비밀번호를 재설정하시겠습니까?"
|
||||||
|
password-updated: "비밀번호는 현재 \"{password}\" 입니다"
|
||||||
suspend: "정지"
|
suspend: "정지"
|
||||||
|
suspend-confirm: "정지하시겠습니까?"
|
||||||
suspended: "정지하였습니다"
|
suspended: "정지하였습니다"
|
||||||
unsuspend: "정지 해제"
|
unsuspend: "정지 해제"
|
||||||
|
unsuspend-confirm: "정지를 해제하시겠습니까?"
|
||||||
unsuspended: "정지를 해제하였습니다"
|
unsuspended: "정지를 해제하였습니다"
|
||||||
verify: "공식 계정으로 설정"
|
verify: "공식 계정으로 설정"
|
||||||
|
verify-confirm: "공식 계정으로 설정하시겠습니까?"
|
||||||
verified: "공식 계정으로 설정하였습니다"
|
verified: "공식 계정으로 설정하였습니다"
|
||||||
unverify: "공식 계정 해제"
|
unverify: "공식 계정 해제"
|
||||||
|
unverify-confirm: "공식 계정을 해제하시겠습니까?"
|
||||||
unverified: "공식 계정을 해제하였습니다"
|
unverified: "공식 계정을 해제하였습니다"
|
||||||
|
update-remote-user: "원격 사용자 정보 갱신"
|
||||||
|
remote-user-updated: "원격 사용자 정보를 갱신하였습니다"
|
||||||
users:
|
users:
|
||||||
title: "사용자"
|
title: "사용자"
|
||||||
sort:
|
sort:
|
||||||
@ -1253,7 +1261,7 @@ desktop/views/pages/user/user.photos.vue:
|
|||||||
no-photos: "사진이 없습니다"
|
no-photos: "사진이 없습니다"
|
||||||
desktop/views/pages/user/user.profile.vue:
|
desktop/views/pages/user/user.profile.vue:
|
||||||
follows-you: "당신을 팔로우합니다"
|
follows-you: "당신을 팔로우합니다"
|
||||||
menu: "メニュー"
|
menu: "메뉴"
|
||||||
desktop/views/pages/user/user.header.vue:
|
desktop/views/pages/user/user.header.vue:
|
||||||
posts: "글"
|
posts: "글"
|
||||||
following: "팔로잉"
|
following: "팔로잉"
|
||||||
@ -1321,9 +1329,6 @@ mobile/views/components/drive.file-detail.vue:
|
|||||||
nsfw: "열람주의"
|
nsfw: "열람주의"
|
||||||
mark-as-sensitive: "열람주의로 설정"
|
mark-as-sensitive: "열람주의로 설정"
|
||||||
unmark-as-sensitive: "열람주의 해제"
|
unmark-as-sensitive: "열람주의 해제"
|
||||||
mobile/views/components/media-image.vue:
|
|
||||||
sensitive: "열람주의"
|
|
||||||
click-to-show: "클릭하여 표시"
|
|
||||||
mobile/views/components/media-video.vue:
|
mobile/views/components/media-video.vue:
|
||||||
sensitive: "열람주의"
|
sensitive: "열람주의"
|
||||||
click-to-show: "클릭하여 표시"
|
click-to-show: "클릭하여 표시"
|
||||||
@ -1468,6 +1473,7 @@ mobile/views/pages/settings.vue:
|
|||||||
notification-position-top: "위"
|
notification-position-top: "위"
|
||||||
behavior: "동작"
|
behavior: "동작"
|
||||||
fetch-on-scroll: "스크롤하여 자동으로 불러오기"
|
fetch-on-scroll: "스크롤하여 자동으로 불러오기"
|
||||||
|
keep-cw: "CW 유지"
|
||||||
note-visibility: "게시물의 공개 범위"
|
note-visibility: "게시물의 공개 범위"
|
||||||
default-note-visibility: "기본 공개 범위"
|
default-note-visibility: "기본 공개 범위"
|
||||||
remember-note-visibility: "글의 공개 범위를 기억하기"
|
remember-note-visibility: "글의 공개 범위를 기억하기"
|
||||||
|
@ -357,7 +357,6 @@ common/views/components/user-menu.vue:
|
|||||||
unblock: "ブロック解除"
|
unblock: "ブロック解除"
|
||||||
push-to-list: "リストに追加"
|
push-to-list: "リストに追加"
|
||||||
select-list: "リストを選択してください"
|
select-list: "リストを選択してください"
|
||||||
list-pushed: "{user}を{list}に追加しました"
|
|
||||||
report-abuse: "スパムを報告"
|
report-abuse: "スパムを報告"
|
||||||
report-abuse-detail: "どのような迷惑行為を行っていますか?"
|
report-abuse-detail: "どのような迷惑行為を行っていますか?"
|
||||||
report-abuse-reported: "管理者に報告されました。ご協力ありがとうございました。"
|
report-abuse-reported: "管理者に報告されました。ご協力ありがとうございました。"
|
||||||
@ -659,9 +658,6 @@ desktop/views/components/drive.vue:
|
|||||||
create-folder: "Map creëren"
|
create-folder: "Map creëren"
|
||||||
upload: "Bestand uploaden"
|
upload: "Bestand uploaden"
|
||||||
url-upload: "Uploaden via URL"
|
url-upload: "Uploaden via URL"
|
||||||
desktop/views/components/media-image.vue:
|
|
||||||
sensitive: "閲覧注意"
|
|
||||||
click-to-show: "クリックして表示"
|
|
||||||
desktop/views/components/media-video.vue:
|
desktop/views/components/media-video.vue:
|
||||||
sensitive: "閲覧注意"
|
sensitive: "閲覧注意"
|
||||||
click-to-show: "クリックして表示"
|
click-to-show: "クリックして表示"
|
||||||
@ -789,6 +785,8 @@ desktop/views/components/settings.vue:
|
|||||||
auto-popout-desc: "Venster uitvouwen, indien mogelijk. Deze instelling wordt opgeslagen in je browser."
|
auto-popout-desc: "Venster uitvouwen, indien mogelijk. Deze instelling wordt opgeslagen in je browser."
|
||||||
deck-nav: "デッキ内ナビゲーション"
|
deck-nav: "デッキ内ナビゲーション"
|
||||||
deck-nav-desc: "デッキを使用しているとき、ナビゲーションが発生する際にページ遷移を行わずに一時的なカラムで受けるようにします。"
|
deck-nav-desc: "デッキを使用しているとき、ナビゲーションが発生する際にページ遷移を行わずに一時的なカラムで受けるようにします。"
|
||||||
|
keep-cw: "CW保持"
|
||||||
|
keep-cw-desc: "投稿にリプライする際、リプライ元の投稿にCWが設定されていたとき、デフォルトで同じCWを設定するようにします。"
|
||||||
deck-default: "デッキをデフォルトのUIにする"
|
deck-default: "デッキをデフォルトのUIにする"
|
||||||
display: "Ontwerp en weergave"
|
display: "Ontwerp en weergave"
|
||||||
customize: "Startpagina aanpassen"
|
customize: "Startpagina aanpassen"
|
||||||
@ -874,6 +872,9 @@ desktop/views/components/settings.2fa.vue:
|
|||||||
success: "Instellen voltooid!"
|
success: "Instellen voltooid!"
|
||||||
failed: "Instellen mislukt. Zorg ervoor dat de sleutel juist is."
|
failed: "Instellen mislukt. Zorg ervoor dat de sleutel juist is."
|
||||||
info: "Vanaf nu moet je ook de op je apparaat getoonde sleutel tonen bij het inloggen op Misskey."
|
info: "Vanaf nu moet je ook de op je apparaat getoonde sleutel tonen bij het inloggen op Misskey."
|
||||||
|
common/views/components/media-image.vue:
|
||||||
|
sensitive: "閲覧注意"
|
||||||
|
click-to-show: "クリックして表示"
|
||||||
common/views/components/api-settings.vue:
|
common/views/components/api-settings.vue:
|
||||||
intro: "APIを利用するには、上記のトークンを「i」というキーでパラメータに付加してリクエストします。"
|
intro: "APIを利用するには、上記のトークンを「i」というキーでパラメータに付加してリクエストします。"
|
||||||
caution: "アカウントを不正利用される可能性があるため、このトークンは第三者に教えないでください(アプリなどにも入力しないでください)。"
|
caution: "アカウントを不正利用される可能性があるため、このトークンは第三者に教えないでください(アプリなどにも入力しないでください)。"
|
||||||
@ -1133,15 +1134,22 @@ admin/views/users.vue:
|
|||||||
user-not-found: "ユーザーが見つかりません"
|
user-not-found: "ユーザーが見つかりません"
|
||||||
lookup: "照会"
|
lookup: "照会"
|
||||||
reset-password: "パスワードをリセット"
|
reset-password: "パスワードをリセット"
|
||||||
|
reset-password-confirm: "パスワードをリセットしますか?"
|
||||||
password-updated: "パスワードは現在「{password}」です"
|
password-updated: "パスワードは現在「{password}」です"
|
||||||
suspend: "凍結"
|
suspend: "凍結"
|
||||||
|
suspend-confirm: "凍結しますか?"
|
||||||
suspended: "凍結しました"
|
suspended: "凍結しました"
|
||||||
unsuspend: "凍結の解除"
|
unsuspend: "凍結の解除"
|
||||||
|
unsuspend-confirm: "凍結を解除しますか?"
|
||||||
unsuspended: "凍結を解除しました"
|
unsuspended: "凍結を解除しました"
|
||||||
verify: "公式アカウントにする"
|
verify: "公式アカウントにする"
|
||||||
|
verify-confirm: "公式アカウントにしますか?"
|
||||||
verified: "公式アカウントにしました"
|
verified: "公式アカウントにしました"
|
||||||
unverify: "公式アカウントを解除する"
|
unverify: "公式アカウントを解除する"
|
||||||
|
unverify-confirm: "公式アカウントを解除しますか?"
|
||||||
unverified: "公式アカウントを解除しました"
|
unverified: "公式アカウントを解除しました"
|
||||||
|
update-remote-user: "リモートユーザー情報の更新"
|
||||||
|
remote-user-updated: "リモートユーザー情報を更新しました"
|
||||||
users:
|
users:
|
||||||
title: "ユーザー"
|
title: "ユーザー"
|
||||||
sort:
|
sort:
|
||||||
@ -1321,9 +1329,6 @@ mobile/views/components/drive.file-detail.vue:
|
|||||||
nsfw: "閲覧注意"
|
nsfw: "閲覧注意"
|
||||||
mark-as-sensitive: "閲覧注意に設定"
|
mark-as-sensitive: "閲覧注意に設定"
|
||||||
unmark-as-sensitive: "閲覧注意を解除"
|
unmark-as-sensitive: "閲覧注意を解除"
|
||||||
mobile/views/components/media-image.vue:
|
|
||||||
sensitive: "閲覧注意"
|
|
||||||
click-to-show: "クリックして表示"
|
|
||||||
mobile/views/components/media-video.vue:
|
mobile/views/components/media-video.vue:
|
||||||
sensitive: "閲覧注意"
|
sensitive: "閲覧注意"
|
||||||
click-to-show: "クリックして表示"
|
click-to-show: "クリックして表示"
|
||||||
@ -1468,6 +1473,7 @@ mobile/views/pages/settings.vue:
|
|||||||
notification-position-top: "上"
|
notification-position-top: "上"
|
||||||
behavior: "Gedrag"
|
behavior: "Gedrag"
|
||||||
fetch-on-scroll: "Ophalen bij scrollen"
|
fetch-on-scroll: "Ophalen bij scrollen"
|
||||||
|
keep-cw: "CW保持"
|
||||||
note-visibility: "投稿の公開範囲"
|
note-visibility: "投稿の公開範囲"
|
||||||
default-note-visibility: "デフォルトの公開範囲"
|
default-note-visibility: "デフォルトの公開範囲"
|
||||||
remember-note-visibility: "投稿の公開範囲を記憶する"
|
remember-note-visibility: "投稿の公開範囲を記憶する"
|
||||||
|
@ -357,7 +357,6 @@ common/views/components/user-menu.vue:
|
|||||||
unblock: "ブロック解除"
|
unblock: "ブロック解除"
|
||||||
push-to-list: "リストに追加"
|
push-to-list: "リストに追加"
|
||||||
select-list: "リストを選択してください"
|
select-list: "リストを選択してください"
|
||||||
list-pushed: "{user}を{list}に追加しました"
|
|
||||||
report-abuse: "スパムを報告"
|
report-abuse: "スパムを報告"
|
||||||
report-abuse-detail: "どのような迷惑行為を行っていますか?"
|
report-abuse-detail: "どのような迷惑行為を行っていますか?"
|
||||||
report-abuse-reported: "管理者に報告されました。ご協力ありがとうございました。"
|
report-abuse-reported: "管理者に報告されました。ご協力ありがとうございました。"
|
||||||
@ -659,9 +658,6 @@ desktop/views/components/drive.vue:
|
|||||||
create-folder: "フォルダーを作成"
|
create-folder: "フォルダーを作成"
|
||||||
upload: "ファイルをアップロード"
|
upload: "ファイルをアップロード"
|
||||||
url-upload: "URLからアップロード"
|
url-upload: "URLからアップロード"
|
||||||
desktop/views/components/media-image.vue:
|
|
||||||
sensitive: "NSFW"
|
|
||||||
click-to-show: "クリックして表示"
|
|
||||||
desktop/views/components/media-video.vue:
|
desktop/views/components/media-video.vue:
|
||||||
sensitive: "Innholdet er NSFW"
|
sensitive: "Innholdet er NSFW"
|
||||||
click-to-show: "クリックして表示"
|
click-to-show: "クリックして表示"
|
||||||
@ -789,6 +785,8 @@ desktop/views/components/settings.vue:
|
|||||||
auto-popout-desc: "ウィンドウが開かれるとき、ポップアウト(ブラウザ外に切り離す)可能なら自動でポップアウトします。この設定はブラウザに記憶されます。"
|
auto-popout-desc: "ウィンドウが開かれるとき、ポップアウト(ブラウザ外に切り離す)可能なら自動でポップアウトします。この設定はブラウザに記憶されます。"
|
||||||
deck-nav: "デッキ内ナビゲーション"
|
deck-nav: "デッキ内ナビゲーション"
|
||||||
deck-nav-desc: "デッキを使用しているとき、ナビゲーションが発生する際にページ遷移を行わずに一時的なカラムで受けるようにします。"
|
deck-nav-desc: "デッキを使用しているとき、ナビゲーションが発生する際にページ遷移を行わずに一時的なカラムで受けるようにします。"
|
||||||
|
keep-cw: "CW保持"
|
||||||
|
keep-cw-desc: "投稿にリプライする際、リプライ元の投稿にCWが設定されていたとき、デフォルトで同じCWを設定するようにします。"
|
||||||
deck-default: "デッキをデフォルトのUIにする"
|
deck-default: "デッキをデフォルトのUIにする"
|
||||||
display: "デザインと表示"
|
display: "デザインと表示"
|
||||||
customize: "ホームをカスタマイズ"
|
customize: "ホームをカスタマイズ"
|
||||||
@ -874,6 +872,9 @@ desktop/views/components/settings.2fa.vue:
|
|||||||
success: "設定が完了しました!"
|
success: "設定が完了しました!"
|
||||||
failed: "設定に失敗しました。トークンに誤りがないかご確認ください。"
|
failed: "設定に失敗しました。トークンに誤りがないかご確認ください。"
|
||||||
info: "次回サインインからは、同様にパスワードに加えてデバイスに表示されているトークンを入力します。"
|
info: "次回サインインからは、同様にパスワードに加えてデバイスに表示されているトークンを入力します。"
|
||||||
|
common/views/components/media-image.vue:
|
||||||
|
sensitive: "閲覧注意"
|
||||||
|
click-to-show: "クリックして表示"
|
||||||
common/views/components/api-settings.vue:
|
common/views/components/api-settings.vue:
|
||||||
intro: "APIを利用するには、上記のトークンを「i」というキーでパラメータに付加してリクエストします。"
|
intro: "APIを利用するには、上記のトークンを「i」というキーでパラメータに付加してリクエストします。"
|
||||||
caution: "アカウントを不正利用される可能性があるため、このトークンは第三者に教えないでください(アプリなどにも入力しないでください)。"
|
caution: "アカウントを不正利用される可能性があるため、このトークンは第三者に教えないでください(アプリなどにも入力しないでください)。"
|
||||||
@ -1133,15 +1134,22 @@ admin/views/users.vue:
|
|||||||
user-not-found: "ユーザーが見つかりません"
|
user-not-found: "ユーザーが見つかりません"
|
||||||
lookup: "照会"
|
lookup: "照会"
|
||||||
reset-password: "パスワードをリセット"
|
reset-password: "パスワードをリセット"
|
||||||
|
reset-password-confirm: "パスワードをリセットしますか?"
|
||||||
password-updated: "パスワードは現在「{password}」です"
|
password-updated: "パスワードは現在「{password}」です"
|
||||||
suspend: "凍結"
|
suspend: "凍結"
|
||||||
|
suspend-confirm: "凍結しますか?"
|
||||||
suspended: "凍結しました"
|
suspended: "凍結しました"
|
||||||
unsuspend: "凍結の解除"
|
unsuspend: "凍結の解除"
|
||||||
|
unsuspend-confirm: "凍結を解除しますか?"
|
||||||
unsuspended: "凍結を解除しました"
|
unsuspended: "凍結を解除しました"
|
||||||
verify: "公式アカウントにする"
|
verify: "公式アカウントにする"
|
||||||
|
verify-confirm: "公式アカウントにしますか?"
|
||||||
verified: "公式アカウントにしました"
|
verified: "公式アカウントにしました"
|
||||||
unverify: "公式アカウントを解除する"
|
unverify: "公式アカウントを解除する"
|
||||||
|
unverify-confirm: "公式アカウントを解除しますか?"
|
||||||
unverified: "公式アカウントを解除しました"
|
unverified: "公式アカウントを解除しました"
|
||||||
|
update-remote-user: "リモートユーザー情報の更新"
|
||||||
|
remote-user-updated: "リモートユーザー情報を更新しました"
|
||||||
users:
|
users:
|
||||||
title: "ユーザー"
|
title: "ユーザー"
|
||||||
sort:
|
sort:
|
||||||
@ -1321,9 +1329,6 @@ mobile/views/components/drive.file-detail.vue:
|
|||||||
nsfw: "NSFW"
|
nsfw: "NSFW"
|
||||||
mark-as-sensitive: "閲覧注意に設定"
|
mark-as-sensitive: "閲覧注意に設定"
|
||||||
unmark-as-sensitive: "閲覧注意を解除"
|
unmark-as-sensitive: "閲覧注意を解除"
|
||||||
mobile/views/components/media-image.vue:
|
|
||||||
sensitive: "NSFW"
|
|
||||||
click-to-show: "クリックして表示"
|
|
||||||
mobile/views/components/media-video.vue:
|
mobile/views/components/media-video.vue:
|
||||||
sensitive: "Innholdet er NSFW"
|
sensitive: "Innholdet er NSFW"
|
||||||
click-to-show: "クリックして表示"
|
click-to-show: "クリックして表示"
|
||||||
@ -1468,6 +1473,7 @@ mobile/views/pages/settings.vue:
|
|||||||
notification-position-top: "Topp"
|
notification-position-top: "Topp"
|
||||||
behavior: "Oppførsel"
|
behavior: "Oppførsel"
|
||||||
fetch-on-scroll: "スクロールで自動読み込み"
|
fetch-on-scroll: "スクロールで自動読み込み"
|
||||||
|
keep-cw: "CW保持"
|
||||||
note-visibility: "投稿の公開範囲"
|
note-visibility: "投稿の公開範囲"
|
||||||
default-note-visibility: "デフォルトの公開範囲"
|
default-note-visibility: "デフォルトの公開範囲"
|
||||||
remember-note-visibility: "投稿の公開範囲を記憶する"
|
remember-note-visibility: "投稿の公開範囲を記憶する"
|
||||||
|
@ -357,7 +357,6 @@ common/views/components/user-menu.vue:
|
|||||||
unblock: "ブロック解除"
|
unblock: "ブロック解除"
|
||||||
push-to-list: "リストに追加"
|
push-to-list: "リストに追加"
|
||||||
select-list: "リストを選択してください"
|
select-list: "リストを選択してください"
|
||||||
list-pushed: "{user}を{list}に追加しました"
|
|
||||||
report-abuse: "スパムを報告"
|
report-abuse: "スパムを報告"
|
||||||
report-abuse-detail: "どのような迷惑行為を行っていますか?"
|
report-abuse-detail: "どのような迷惑行為を行っていますか?"
|
||||||
report-abuse-reported: "管理者に報告されました。ご協力ありがとうございました。"
|
report-abuse-reported: "管理者に報告されました。ご協力ありがとうございました。"
|
||||||
@ -659,9 +658,6 @@ desktop/views/components/drive.vue:
|
|||||||
create-folder: "Utwórz katalog"
|
create-folder: "Utwórz katalog"
|
||||||
upload: "Wyślij plik"
|
upload: "Wyślij plik"
|
||||||
url-upload: "Wyślij z adresu URL"
|
url-upload: "Wyślij z adresu URL"
|
||||||
desktop/views/components/media-image.vue:
|
|
||||||
sensitive: "To jest zawartość NSFW"
|
|
||||||
click-to-show: "Naciśnij aby wyświetlić"
|
|
||||||
desktop/views/components/media-video.vue:
|
desktop/views/components/media-video.vue:
|
||||||
sensitive: "To jest zawartość NSFW"
|
sensitive: "To jest zawartość NSFW"
|
||||||
click-to-show: "Naciśnij aby wyświetlić"
|
click-to-show: "Naciśnij aby wyświetlić"
|
||||||
@ -789,6 +785,8 @@ desktop/views/components/settings.vue:
|
|||||||
auto-popout-desc: "ウィンドウが開かれるとき、ポップアウト(ブラウザ外に切り離す)可能なら自動でポップアウトします。この設定はブラウザに記憶されます。"
|
auto-popout-desc: "ウィンドウが開かれるとき、ポップアウト(ブラウザ外に切り離す)可能なら自動でポップアウトします。この設定はブラウザに記憶されます。"
|
||||||
deck-nav: "デッキ内ナビゲーション"
|
deck-nav: "デッキ内ナビゲーション"
|
||||||
deck-nav-desc: "デッキを使用しているとき、ナビゲーションが発生する際にページ遷移を行わずに一時的なカラムで受けるようにします。"
|
deck-nav-desc: "デッキを使用しているとき、ナビゲーションが発生する際にページ遷移を行わずに一時的なカラムで受けるようにします。"
|
||||||
|
keep-cw: "CW保持"
|
||||||
|
keep-cw-desc: "投稿にリプライする際、リプライ元の投稿にCWが設定されていたとき、デフォルトで同じCWを設定するようにします。"
|
||||||
deck-default: "Użyj Talię jako domyślne UI"
|
deck-default: "Użyj Talię jako domyślne UI"
|
||||||
display: "Wygląd i wyświetlanie"
|
display: "Wygląd i wyświetlanie"
|
||||||
customize: "Dostosuj stronę główną"
|
customize: "Dostosuj stronę główną"
|
||||||
@ -874,6 +872,9 @@ desktop/views/components/settings.2fa.vue:
|
|||||||
success: "Pomyślnie ukończono konfigurację!"
|
success: "Pomyślnie ukończono konfigurację!"
|
||||||
failed: "Nie udało się skonfigurować uwierzytelniania dwuetapowego, upewnij się że wprowadziłeś prawidłowy token."
|
failed: "Nie udało się skonfigurować uwierzytelniania dwuetapowego, upewnij się że wprowadziłeś prawidłowy token."
|
||||||
info: "Od teraz, wprowadzaj token wyświetlany na urządzeniu przy każdym logowaniu do Misskey."
|
info: "Od teraz, wprowadzaj token wyświetlany na urządzeniu przy każdym logowaniu do Misskey."
|
||||||
|
common/views/components/media-image.vue:
|
||||||
|
sensitive: "閲覧注意"
|
||||||
|
click-to-show: "クリックして表示"
|
||||||
common/views/components/api-settings.vue:
|
common/views/components/api-settings.vue:
|
||||||
intro: "Aby uzyskać dostęp do API, ustaw ten token jako klucz 'i' parametrów żądań."
|
intro: "Aby uzyskać dostęp do API, ustaw ten token jako klucz 'i' parametrów żądań."
|
||||||
caution: "Nie pokazuj tego tokenu osobom trzecim (nie wprowadzaj go nigdzie indziej), aby konto nie trafiło w niepowołane ręce."
|
caution: "Nie pokazuj tego tokenu osobom trzecim (nie wprowadzaj go nigdzie indziej), aby konto nie trafiło w niepowołane ręce."
|
||||||
@ -1133,15 +1134,22 @@ admin/views/users.vue:
|
|||||||
user-not-found: "Nie znaleziono użytkownika"
|
user-not-found: "Nie znaleziono użytkownika"
|
||||||
lookup: "照会"
|
lookup: "照会"
|
||||||
reset-password: "パスワードをリセット"
|
reset-password: "パスワードをリセット"
|
||||||
|
reset-password-confirm: "パスワードをリセットしますか?"
|
||||||
password-updated: "パスワードは現在「{password}」です"
|
password-updated: "パスワードは現在「{password}」です"
|
||||||
suspend: "凍結"
|
suspend: "凍結"
|
||||||
|
suspend-confirm: "凍結しますか?"
|
||||||
suspended: "凍結しました"
|
suspended: "凍結しました"
|
||||||
unsuspend: "凍結の解除"
|
unsuspend: "凍結の解除"
|
||||||
|
unsuspend-confirm: "凍結を解除しますか?"
|
||||||
unsuspended: "凍結を解除しました"
|
unsuspended: "凍結を解除しました"
|
||||||
verify: "公式アカウントにする"
|
verify: "公式アカウントにする"
|
||||||
|
verify-confirm: "公式アカウントにしますか?"
|
||||||
verified: "公式アカウントにしました"
|
verified: "公式アカウントにしました"
|
||||||
unverify: "公式アカウントを解除する"
|
unverify: "公式アカウントを解除する"
|
||||||
|
unverify-confirm: "公式アカウントを解除しますか?"
|
||||||
unverified: "公式アカウントを解除しました"
|
unverified: "公式アカウントを解除しました"
|
||||||
|
update-remote-user: "リモートユーザー情報の更新"
|
||||||
|
remote-user-updated: "リモートユーザー情報を更新しました"
|
||||||
users:
|
users:
|
||||||
title: "Użytkownicy"
|
title: "Użytkownicy"
|
||||||
sort:
|
sort:
|
||||||
@ -1321,9 +1329,6 @@ mobile/views/components/drive.file-detail.vue:
|
|||||||
nsfw: "NSFW"
|
nsfw: "NSFW"
|
||||||
mark-as-sensitive: "閲覧注意に設定"
|
mark-as-sensitive: "閲覧注意に設定"
|
||||||
unmark-as-sensitive: "閲覧注意を解除"
|
unmark-as-sensitive: "閲覧注意を解除"
|
||||||
mobile/views/components/media-image.vue:
|
|
||||||
sensitive: "To jest zawartość NSFW"
|
|
||||||
click-to-show: "Naciśnij aby wyświetlić"
|
|
||||||
mobile/views/components/media-video.vue:
|
mobile/views/components/media-video.vue:
|
||||||
sensitive: "To jest zawartość NSFW"
|
sensitive: "To jest zawartość NSFW"
|
||||||
click-to-show: "Naciśnij aby wyświetlić"
|
click-to-show: "Naciśnij aby wyświetlić"
|
||||||
@ -1468,6 +1473,7 @@ mobile/views/pages/settings.vue:
|
|||||||
notification-position-top: "Góra"
|
notification-position-top: "Góra"
|
||||||
behavior: "Zachowanie"
|
behavior: "Zachowanie"
|
||||||
fetch-on-scroll: "Automatycznie ładuj po przeciągnięciu w dół"
|
fetch-on-scroll: "Automatycznie ładuj po przeciągnięciu w dół"
|
||||||
|
keep-cw: "CW保持"
|
||||||
note-visibility: "Widoczność wpisów"
|
note-visibility: "Widoczność wpisów"
|
||||||
default-note-visibility: "Domyślna widoczność"
|
default-note-visibility: "Domyślna widoczność"
|
||||||
remember-note-visibility: "Zapamiętaj widoczność wpisów"
|
remember-note-visibility: "Zapamiętaj widoczność wpisów"
|
||||||
|
@ -357,7 +357,6 @@ common/views/components/user-menu.vue:
|
|||||||
unblock: "ブロック解除"
|
unblock: "ブロック解除"
|
||||||
push-to-list: "リストに追加"
|
push-to-list: "リストに追加"
|
||||||
select-list: "リストを選択してください"
|
select-list: "リストを選択してください"
|
||||||
list-pushed: "{user}を{list}に追加しました"
|
|
||||||
report-abuse: "スパムを報告"
|
report-abuse: "スパムを報告"
|
||||||
report-abuse-detail: "どのような迷惑行為を行っていますか?"
|
report-abuse-detail: "どのような迷惑行為を行っていますか?"
|
||||||
report-abuse-reported: "管理者に報告されました。ご協力ありがとうございました。"
|
report-abuse-reported: "管理者に報告されました。ご協力ありがとうございました。"
|
||||||
@ -659,9 +658,6 @@ desktop/views/components/drive.vue:
|
|||||||
create-folder: "フォルダーを作成"
|
create-folder: "フォルダーを作成"
|
||||||
upload: "ファイルをアップロード"
|
upload: "ファイルをアップロード"
|
||||||
url-upload: "URLからアップロード"
|
url-upload: "URLからアップロード"
|
||||||
desktop/views/components/media-image.vue:
|
|
||||||
sensitive: "閲覧注意"
|
|
||||||
click-to-show: "クリックして表示"
|
|
||||||
desktop/views/components/media-video.vue:
|
desktop/views/components/media-video.vue:
|
||||||
sensitive: "閲覧注意"
|
sensitive: "閲覧注意"
|
||||||
click-to-show: "クリックして表示"
|
click-to-show: "クリックして表示"
|
||||||
@ -789,6 +785,8 @@ desktop/views/components/settings.vue:
|
|||||||
auto-popout-desc: "ウィンドウが開かれるとき、ポップアウト(ブラウザ外に切り離す)可能なら自動でポップアウトします。この設定はブラウザに記憶されます。"
|
auto-popout-desc: "ウィンドウが開かれるとき、ポップアウト(ブラウザ外に切り離す)可能なら自動でポップアウトします。この設定はブラウザに記憶されます。"
|
||||||
deck-nav: "デッキ内ナビゲーション"
|
deck-nav: "デッキ内ナビゲーション"
|
||||||
deck-nav-desc: "デッキを使用しているとき、ナビゲーションが発生する際にページ遷移を行わずに一時的なカラムで受けるようにします。"
|
deck-nav-desc: "デッキを使用しているとき、ナビゲーションが発生する際にページ遷移を行わずに一時的なカラムで受けるようにします。"
|
||||||
|
keep-cw: "CW保持"
|
||||||
|
keep-cw-desc: "投稿にリプライする際、リプライ元の投稿にCWが設定されていたとき、デフォルトで同じCWを設定するようにします。"
|
||||||
deck-default: "デッキをデフォルトのUIにする"
|
deck-default: "デッキをデフォルトのUIにする"
|
||||||
display: "デザインと表示"
|
display: "デザインと表示"
|
||||||
customize: "ホームをカスタマイズ"
|
customize: "ホームをカスタマイズ"
|
||||||
@ -874,6 +872,9 @@ desktop/views/components/settings.2fa.vue:
|
|||||||
success: "設定が完了しました!"
|
success: "設定が完了しました!"
|
||||||
failed: "設定に失敗しました。トークンに誤りがないかご確認ください。"
|
failed: "設定に失敗しました。トークンに誤りがないかご確認ください。"
|
||||||
info: "次回サインインからは、同様にパスワードに加えてデバイスに表示されているトークンを入力します。"
|
info: "次回サインインからは、同様にパスワードに加えてデバイスに表示されているトークンを入力します。"
|
||||||
|
common/views/components/media-image.vue:
|
||||||
|
sensitive: "閲覧注意"
|
||||||
|
click-to-show: "クリックして表示"
|
||||||
common/views/components/api-settings.vue:
|
common/views/components/api-settings.vue:
|
||||||
intro: "APIを利用するには、上記のトークンを「i」というキーでパラメータに付加してリクエストします。"
|
intro: "APIを利用するには、上記のトークンを「i」というキーでパラメータに付加してリクエストします。"
|
||||||
caution: "アカウントを不正利用される可能性があるため、このトークンは第三者に教えないでください(アプリなどにも入力しないでください)。"
|
caution: "アカウントを不正利用される可能性があるため、このトークンは第三者に教えないでください(アプリなどにも入力しないでください)。"
|
||||||
@ -1133,15 +1134,22 @@ admin/views/users.vue:
|
|||||||
user-not-found: "ユーザーが見つかりません"
|
user-not-found: "ユーザーが見つかりません"
|
||||||
lookup: "照会"
|
lookup: "照会"
|
||||||
reset-password: "パスワードをリセット"
|
reset-password: "パスワードをリセット"
|
||||||
|
reset-password-confirm: "パスワードをリセットしますか?"
|
||||||
password-updated: "パスワードは現在「{password}」です"
|
password-updated: "パスワードは現在「{password}」です"
|
||||||
suspend: "凍結"
|
suspend: "凍結"
|
||||||
|
suspend-confirm: "凍結しますか?"
|
||||||
suspended: "凍結しました"
|
suspended: "凍結しました"
|
||||||
unsuspend: "凍結の解除"
|
unsuspend: "凍結の解除"
|
||||||
|
unsuspend-confirm: "凍結を解除しますか?"
|
||||||
unsuspended: "凍結を解除しました"
|
unsuspended: "凍結を解除しました"
|
||||||
verify: "公式アカウントにする"
|
verify: "公式アカウントにする"
|
||||||
|
verify-confirm: "公式アカウントにしますか?"
|
||||||
verified: "公式アカウントにしました"
|
verified: "公式アカウントにしました"
|
||||||
unverify: "公式アカウントを解除する"
|
unverify: "公式アカウントを解除する"
|
||||||
|
unverify-confirm: "公式アカウントを解除しますか?"
|
||||||
unverified: "公式アカウントを解除しました"
|
unverified: "公式アカウントを解除しました"
|
||||||
|
update-remote-user: "リモートユーザー情報の更新"
|
||||||
|
remote-user-updated: "リモートユーザー情報を更新しました"
|
||||||
users:
|
users:
|
||||||
title: "ユーザー"
|
title: "ユーザー"
|
||||||
sort:
|
sort:
|
||||||
@ -1321,9 +1329,6 @@ mobile/views/components/drive.file-detail.vue:
|
|||||||
nsfw: "閲覧注意"
|
nsfw: "閲覧注意"
|
||||||
mark-as-sensitive: "閲覧注意に設定"
|
mark-as-sensitive: "閲覧注意に設定"
|
||||||
unmark-as-sensitive: "閲覧注意を解除"
|
unmark-as-sensitive: "閲覧注意を解除"
|
||||||
mobile/views/components/media-image.vue:
|
|
||||||
sensitive: "閲覧注意"
|
|
||||||
click-to-show: "クリックして表示"
|
|
||||||
mobile/views/components/media-video.vue:
|
mobile/views/components/media-video.vue:
|
||||||
sensitive: "閲覧注意"
|
sensitive: "閲覧注意"
|
||||||
click-to-show: "クリックして表示"
|
click-to-show: "クリックして表示"
|
||||||
@ -1468,6 +1473,7 @@ mobile/views/pages/settings.vue:
|
|||||||
notification-position-top: "上"
|
notification-position-top: "上"
|
||||||
behavior: "動作"
|
behavior: "動作"
|
||||||
fetch-on-scroll: "スクロールで自動読み込み"
|
fetch-on-scroll: "スクロールで自動読み込み"
|
||||||
|
keep-cw: "CW保持"
|
||||||
note-visibility: "投稿の公開範囲"
|
note-visibility: "投稿の公開範囲"
|
||||||
default-note-visibility: "デフォルトの公開範囲"
|
default-note-visibility: "デフォルトの公開範囲"
|
||||||
remember-note-visibility: "投稿の公開範囲を記憶する"
|
remember-note-visibility: "投稿の公開範囲を記憶する"
|
||||||
|
@ -357,7 +357,6 @@ common/views/components/user-menu.vue:
|
|||||||
unblock: "ブロック解除"
|
unblock: "ブロック解除"
|
||||||
push-to-list: "リストに追加"
|
push-to-list: "リストに追加"
|
||||||
select-list: "リストを選択してください"
|
select-list: "リストを選択してください"
|
||||||
list-pushed: "{user}を{list}に追加しました"
|
|
||||||
report-abuse: "スパムを報告"
|
report-abuse: "スパムを報告"
|
||||||
report-abuse-detail: "どのような迷惑行為を行っていますか?"
|
report-abuse-detail: "どのような迷惑行為を行っていますか?"
|
||||||
report-abuse-reported: "管理者に報告されました。ご協力ありがとうございました。"
|
report-abuse-reported: "管理者に報告されました。ご協力ありがとうございました。"
|
||||||
@ -659,9 +658,6 @@ desktop/views/components/drive.vue:
|
|||||||
create-folder: "フォルダーを作成"
|
create-folder: "フォルダーを作成"
|
||||||
upload: "ファイルをアップロード"
|
upload: "ファイルをアップロード"
|
||||||
url-upload: "URLからアップロード"
|
url-upload: "URLからアップロード"
|
||||||
desktop/views/components/media-image.vue:
|
|
||||||
sensitive: "閲覧注意"
|
|
||||||
click-to-show: "クリックして表示"
|
|
||||||
desktop/views/components/media-video.vue:
|
desktop/views/components/media-video.vue:
|
||||||
sensitive: "閲覧注意"
|
sensitive: "閲覧注意"
|
||||||
click-to-show: "クリックして表示"
|
click-to-show: "クリックして表示"
|
||||||
@ -789,6 +785,8 @@ desktop/views/components/settings.vue:
|
|||||||
auto-popout-desc: "ウィンドウが開かれるとき、ポップアウト(ブラウザ外に切り離す)可能なら自動でポップアウトします。この設定はブラウザに記憶されます。"
|
auto-popout-desc: "ウィンドウが開かれるとき、ポップアウト(ブラウザ外に切り離す)可能なら自動でポップアウトします。この設定はブラウザに記憶されます。"
|
||||||
deck-nav: "デッキ内ナビゲーション"
|
deck-nav: "デッキ内ナビゲーション"
|
||||||
deck-nav-desc: "デッキを使用しているとき、ナビゲーションが発生する際にページ遷移を行わずに一時的なカラムで受けるようにします。"
|
deck-nav-desc: "デッキを使用しているとき、ナビゲーションが発生する際にページ遷移を行わずに一時的なカラムで受けるようにします。"
|
||||||
|
keep-cw: "CW保持"
|
||||||
|
keep-cw-desc: "投稿にリプライする際、リプライ元の投稿にCWが設定されていたとき、デフォルトで同じCWを設定するようにします。"
|
||||||
deck-default: "デッキをデフォルトのUIにする"
|
deck-default: "デッキをデフォルトのUIにする"
|
||||||
display: "デザインと表示"
|
display: "デザインと表示"
|
||||||
customize: "ホームをカスタマイズ"
|
customize: "ホームをカスタマイズ"
|
||||||
@ -874,6 +872,9 @@ desktop/views/components/settings.2fa.vue:
|
|||||||
success: "設定が完了しました!"
|
success: "設定が完了しました!"
|
||||||
failed: "設定に失敗しました。トークンに誤りがないかご確認ください。"
|
failed: "設定に失敗しました。トークンに誤りがないかご確認ください。"
|
||||||
info: "次回サインインからは、同様にパスワードに加えてデバイスに表示されているトークンを入力します。"
|
info: "次回サインインからは、同様にパスワードに加えてデバイスに表示されているトークンを入力します。"
|
||||||
|
common/views/components/media-image.vue:
|
||||||
|
sensitive: "閲覧注意"
|
||||||
|
click-to-show: "クリックして表示"
|
||||||
common/views/components/api-settings.vue:
|
common/views/components/api-settings.vue:
|
||||||
intro: "APIを利用するには、上記のトークンを「i」というキーでパラメータに付加してリクエストします。"
|
intro: "APIを利用するには、上記のトークンを「i」というキーでパラメータに付加してリクエストします。"
|
||||||
caution: "アカウントを不正利用される可能性があるため、このトークンは第三者に教えないでください(アプリなどにも入力しないでください)。"
|
caution: "アカウントを不正利用される可能性があるため、このトークンは第三者に教えないでください(アプリなどにも入力しないでください)。"
|
||||||
@ -1133,15 +1134,22 @@ admin/views/users.vue:
|
|||||||
user-not-found: "ユーザーが見つかりません"
|
user-not-found: "ユーザーが見つかりません"
|
||||||
lookup: "照会"
|
lookup: "照会"
|
||||||
reset-password: "パスワードをリセット"
|
reset-password: "パスワードをリセット"
|
||||||
|
reset-password-confirm: "パスワードをリセットしますか?"
|
||||||
password-updated: "パスワードは現在「{password}」です"
|
password-updated: "パスワードは現在「{password}」です"
|
||||||
suspend: "凍結"
|
suspend: "凍結"
|
||||||
|
suspend-confirm: "凍結しますか?"
|
||||||
suspended: "凍結しました"
|
suspended: "凍結しました"
|
||||||
unsuspend: "凍結の解除"
|
unsuspend: "凍結の解除"
|
||||||
|
unsuspend-confirm: "凍結を解除しますか?"
|
||||||
unsuspended: "凍結を解除しました"
|
unsuspended: "凍結を解除しました"
|
||||||
verify: "公式アカウントにする"
|
verify: "公式アカウントにする"
|
||||||
|
verify-confirm: "公式アカウントにしますか?"
|
||||||
verified: "公式アカウントにしました"
|
verified: "公式アカウントにしました"
|
||||||
unverify: "公式アカウントを解除する"
|
unverify: "公式アカウントを解除する"
|
||||||
|
unverify-confirm: "公式アカウントを解除しますか?"
|
||||||
unverified: "公式アカウントを解除しました"
|
unverified: "公式アカウントを解除しました"
|
||||||
|
update-remote-user: "リモートユーザー情報の更新"
|
||||||
|
remote-user-updated: "リモートユーザー情報を更新しました"
|
||||||
users:
|
users:
|
||||||
title: "ユーザー"
|
title: "ユーザー"
|
||||||
sort:
|
sort:
|
||||||
@ -1321,9 +1329,6 @@ mobile/views/components/drive.file-detail.vue:
|
|||||||
nsfw: "閲覧注意"
|
nsfw: "閲覧注意"
|
||||||
mark-as-sensitive: "閲覧注意に設定"
|
mark-as-sensitive: "閲覧注意に設定"
|
||||||
unmark-as-sensitive: "閲覧注意を解除"
|
unmark-as-sensitive: "閲覧注意を解除"
|
||||||
mobile/views/components/media-image.vue:
|
|
||||||
sensitive: "閲覧注意"
|
|
||||||
click-to-show: "クリックして表示"
|
|
||||||
mobile/views/components/media-video.vue:
|
mobile/views/components/media-video.vue:
|
||||||
sensitive: "閲覧注意"
|
sensitive: "閲覧注意"
|
||||||
click-to-show: "クリックして表示"
|
click-to-show: "クリックして表示"
|
||||||
@ -1468,6 +1473,7 @@ mobile/views/pages/settings.vue:
|
|||||||
notification-position-top: "上"
|
notification-position-top: "上"
|
||||||
behavior: "動作"
|
behavior: "動作"
|
||||||
fetch-on-scroll: "スクロールで自動読み込み"
|
fetch-on-scroll: "スクロールで自動読み込み"
|
||||||
|
keep-cw: "CW保持"
|
||||||
note-visibility: "投稿の公開範囲"
|
note-visibility: "投稿の公開範囲"
|
||||||
default-note-visibility: "デフォルトの公開範囲"
|
default-note-visibility: "デフォルトの公開範囲"
|
||||||
remember-note-visibility: "投稿の公開範囲を記憶する"
|
remember-note-visibility: "投稿の公開範囲を記憶する"
|
||||||
|
@ -3,17 +3,17 @@ meta:
|
|||||||
lang: "中文(简体)"
|
lang: "中文(简体)"
|
||||||
divider: ""
|
divider: ""
|
||||||
common:
|
common:
|
||||||
misskey: "A ⭐ of the fediverse"
|
misskey: "Fediverse中的一颗⭐"
|
||||||
about-title: "A ⭐ of the fediverse."
|
about-title: "Fediverse中的一颗⭐"
|
||||||
about: "感谢您找到Misskey. Misskey是一个开源的程序, 她可以同其他的社交网站进行联系. 为什么不从喧嚣的城市中休息一下, 来试一试这个新的程序呢?"
|
about: "非常感谢您找到了Misskey。 Misskey是出生于地球上的<b>分布式微博SNS</b>。因为她处于Fediverse(由各种SNS组成的宇宙)中,所以她与其他SNS相互连接。想要远离喧嚣的城市,不如深入这个新的互联网来探索一下吧。"
|
||||||
intro:
|
intro:
|
||||||
title: "什么是 Misskey 呢?"
|
title: "什么是 Misskey 呢?"
|
||||||
about: "Misskey是开源的<b>分散式微博服务</b>。复杂的完全可定制的Ui,各种各样的帖子反应,提供集成管理系统和其他先进功能的免费文件存储。此外,网络系统称为“Fediverse”使我们能够与其他SNS的用户进行通信。比如,如果你张贴一些东西,那么你的帖子不仅会发送给Misskey,还会发送到其他平台。想象一下,行星正在向另一颗行星发送微波来进行通信。"
|
about: "Misskey是开源的<b>分散式微博SNS</b>。复杂的完全可定制的Ui,各种各样的帖子反应,提供集成管理系统和其他先进功能的免费文件存储。此外,称为“Fediverse”的网络系统使我们能够与其他SNS的用户进行通信。比如,如果你张贴一些东西,那么你的帖子不仅会发送给Misskey,还会发送到其他SNS平台。想象一下,正如一颗行星和另一颗行星通过发送微波来进行通信一样。"
|
||||||
features: "特点"
|
features: "功能"
|
||||||
rich-contents: "发布"
|
rich-contents: "发布"
|
||||||
rich-contents-desc: "您只需要发布您的想法, 热门话题或者任何您想分享的好东西. 你可以装饰你的文字, 加上你最喜欢的图片, 发送文件或者电影, 甚至创造一个投票. 这些事情您都可以在 Misskey 上做。"
|
rich-contents-desc: "请分享您的想法,热门话题,以及任何您想与大家分享的内容。如果有需要的话,您可以使用各种语法来修饰文章,发布问卷调查,或者添加各种您喜欢的图像和视频等文件。"
|
||||||
reaction: "情绪"
|
reaction: "回应"
|
||||||
reaction-desc: "一个最简单的方式去告诉别人你的情绪. Misskey 允许您在别人的帖子中加入各种的情绪反应类型, 就像 Facebook 一样. 在 Misskey 上的情感体验永远不会出现在其他只能点赞的SNSs上。"
|
reaction-desc: "表达情绪的最简单方法。 Misskey允许您向其他帖子添加各种类型的回应。 一旦体验过Misskey的回应功能,就再也不会想回到那些只有点赞功能的其他SNS上了。"
|
||||||
ui: "交互界面"
|
ui: "交互界面"
|
||||||
ui-desc: "世界上没有一个UI可以适合每一个人. 所以, Misskey 提供一个可以高度定制的UI交互界面. 您可以通过编辑, 调整布局, 放置可选择的小部件来轻松定制您的专属UI界面。"
|
ui-desc: "世界上没有一个UI可以适合每一个人. 所以, Misskey 提供一个可以高度定制的UI交互界面. 您可以通过编辑, 调整布局, 放置可选择的小部件来轻松定制您的专属UI界面。"
|
||||||
drive: "Misskey 云盘"
|
drive: "Misskey 云盘"
|
||||||
@ -27,7 +27,7 @@ common:
|
|||||||
do-not-copy-paste: "请不要在这里输入或粘贴代码。您帐户可能会受到损害。"
|
do-not-copy-paste: "请不要在这里输入或粘贴代码。您帐户可能会受到损害。"
|
||||||
load-more: "加载更多"
|
load-more: "加载更多"
|
||||||
enter-password: "请输入您的密码"
|
enter-password: "请输入您的密码"
|
||||||
2fa: "二段階認証"
|
2fa: "双重身份验证"
|
||||||
got-it: "没问题"
|
got-it: "没问题"
|
||||||
customization-tips:
|
customization-tips:
|
||||||
title: "客制化提示"
|
title: "客制化提示"
|
||||||
@ -54,7 +54,7 @@ common:
|
|||||||
years_ago: "{}年前"
|
years_ago: "{}年前"
|
||||||
month-and-day: "{month}月 {day}日"
|
month-and-day: "{month}月 {day}日"
|
||||||
trash: "垃圾箱"
|
trash: "垃圾箱"
|
||||||
drive: "Misskey 云盘"
|
drive: "网盘"
|
||||||
messaging: "聊天"
|
messaging: "聊天"
|
||||||
weekday-short:
|
weekday-short:
|
||||||
sunday: "日"
|
sunday: "日"
|
||||||
@ -103,14 +103,14 @@ common:
|
|||||||
f: "等待你的书写..."
|
f: "等待你的书写..."
|
||||||
search: "搜索"
|
search: "搜索"
|
||||||
delete: "删除"
|
delete: "删除"
|
||||||
loading: "正在加载, 等着就好啦"
|
loading: "正在加载中"
|
||||||
ok: "没问题"
|
ok: "没问题"
|
||||||
update-available-title: "有可用更新"
|
update-available-title: "有可用更新"
|
||||||
update-available: "新的 Misskey 版本现已发布({newer}。目前版本{current}). 刷新页面以应用更新。"
|
update-available: "新的 Misskey 版本现已发布({newer}。目前版本{current}). 刷新页面以应用更新。"
|
||||||
my-token-regenerated: "您的 Token 已被重置, 您将自动登出。"
|
my-token-regenerated: "您的 Token 已被重置, 您将自动登出。"
|
||||||
i-like-sushi: "相比于布丁来说, 我更喜欢寿司。"
|
i-like-sushi: "相比于布丁来说, 我更喜欢寿司。"
|
||||||
show-reversi-board-labels: "在 Reversi 中显示行和列表签"
|
show-reversi-board-labels: "在 Reversi 中显示行和列表签"
|
||||||
use-avatar-reversi-stones: "用头像作为 Reversi 中的 “石头”"
|
use-avatar-reversi-stones: "用头像作为黑白棋的棋子"
|
||||||
verified-user: "认证用户"
|
verified-user: "认证用户"
|
||||||
disable-animated-mfm: "在帖子中禁用动画文本"
|
disable-animated-mfm: "在帖子中禁用动画文本"
|
||||||
suggest-recent-hashtags: "在帖子表单上显示最近流行的主题标签"
|
suggest-recent-hashtags: "在帖子表单上显示最近流行的主题标签"
|
||||||
@ -350,17 +350,16 @@ common/views/components/note-menu.vue:
|
|||||||
delete-confirm: "确定删除这个投稿吗?"
|
delete-confirm: "确定删除这个投稿吗?"
|
||||||
remote: "显示原始投稿"
|
remote: "显示原始投稿"
|
||||||
common/views/components/user-menu.vue:
|
common/views/components/user-menu.vue:
|
||||||
mention: "メンション"
|
mention: "提及"
|
||||||
mute: "ミュート"
|
mute: "静音"
|
||||||
unmute: "ミュート解除"
|
unmute: "取消静音"
|
||||||
block: "ブロック"
|
block: "屏蔽"
|
||||||
unblock: "ブロック解除"
|
unblock: "取消屏蔽"
|
||||||
push-to-list: "リストに追加"
|
push-to-list: "添加至列表"
|
||||||
select-list: "リストを選択してください"
|
select-list: "请选择一个列表"
|
||||||
list-pushed: "{user}を{list}に追加しました"
|
report-abuse: "举报垃圾邮件"
|
||||||
report-abuse: "スパムを報告"
|
report-abuse-detail: "做了什么骚扰的行为?"
|
||||||
report-abuse-detail: "どのような迷惑行為を行っていますか?"
|
report-abuse-reported: "已报告给管理员。 非常感谢你的合作。"
|
||||||
report-abuse-reported: "管理者に報告されました。ご協力ありがとうございました。"
|
|
||||||
common/views/components/poll.vue:
|
common/views/components/poll.vue:
|
||||||
vote-to: "为\"{}\"投票"
|
vote-to: "为\"{}\"投票"
|
||||||
vote-count: "{}票"
|
vote-count: "{}票"
|
||||||
@ -659,9 +658,6 @@ desktop/views/components/drive.vue:
|
|||||||
create-folder: "创建文件夹"
|
create-folder: "创建文件夹"
|
||||||
upload: "上传文件"
|
upload: "上传文件"
|
||||||
url-upload: "从URL上传"
|
url-upload: "从URL上传"
|
||||||
desktop/views/components/media-image.vue:
|
|
||||||
sensitive: "阅读注意"
|
|
||||||
click-to-show: "点击以显示"
|
|
||||||
desktop/views/components/media-video.vue:
|
desktop/views/components/media-video.vue:
|
||||||
sensitive: "阅读注意"
|
sensitive: "阅读注意"
|
||||||
click-to-show: "点击以显示"
|
click-to-show: "点击以显示"
|
||||||
@ -698,12 +694,12 @@ desktop/views/components/note-detail.vue:
|
|||||||
location: "位置信息"
|
location: "位置信息"
|
||||||
renote: "转发"
|
renote: "转发"
|
||||||
add-reaction: "添加一个反应"
|
add-reaction: "添加一个反应"
|
||||||
undo-reaction: "リアクション解除"
|
undo-reaction: "取消反应"
|
||||||
desktop/views/components/note.vue:
|
desktop/views/components/note.vue:
|
||||||
reply: "回复"
|
reply: "回复"
|
||||||
renote: "Renote"
|
renote: "Renote"
|
||||||
add-reaction: "添加一个反应"
|
add-reaction: "添加一个反应"
|
||||||
undo-reaction: "リアクション解除"
|
undo-reaction: "取消反应"
|
||||||
detail: "详细信息"
|
detail: "详细信息"
|
||||||
private: "这个投稿是私密的"
|
private: "这个投稿是私密的"
|
||||||
deleted: "投稿已删除"
|
deleted: "投稿已删除"
|
||||||
@ -789,6 +785,8 @@ desktop/views/components/settings.vue:
|
|||||||
auto-popout-desc: "如果可用,将使用弹出显示而不是打开新窗口。 此设置存储在浏览器中。"
|
auto-popout-desc: "如果可用,将使用弹出显示而不是打开新窗口。 此设置存储在浏览器中。"
|
||||||
deck-nav: "Deck 内的导航"
|
deck-nav: "Deck 内的导航"
|
||||||
deck-nav-desc: "在使用Deck时,您会在导航期间获得一个没有页面过渡的临时列。"
|
deck-nav-desc: "在使用Deck时,您会在导航期间获得一个没有页面过渡的临时列。"
|
||||||
|
keep-cw: "保留内容警告"
|
||||||
|
keep-cw-desc: "在回复帖子时,如果原帖设置了内容警告,默认情况下回帖也会设置相同的内容警告。"
|
||||||
deck-default: "将Deck界面设置为默认UI显示界面"
|
deck-default: "将Deck界面设置为默认UI显示界面"
|
||||||
display: "设计与展示"
|
display: "设计与展示"
|
||||||
customize: "自定义首页摆放"
|
customize: "自定义首页摆放"
|
||||||
@ -809,16 +807,16 @@ desktop/views/components/settings.vue:
|
|||||||
show-local-renotes: "在时间线中显示Local Renote(s)"
|
show-local-renotes: "在时间线中显示Local Renote(s)"
|
||||||
show-maps: "显示地图以显示位置"
|
show-maps: "显示地图以显示位置"
|
||||||
remain-deleted-note: "继续显示已删除的帖子"
|
remain-deleted-note: "继续显示已删除的帖子"
|
||||||
deck-column-align: "デッキのカラムの配置"
|
deck-column-align: "列对齐设置"
|
||||||
deck-column-align-center: "中央"
|
deck-column-align-center: "中央"
|
||||||
deck-column-align-left: "左"
|
deck-column-align-left: "左"
|
||||||
deck-column-align-flexible: "フレキシブル"
|
deck-column-align-flexible: "可变"
|
||||||
deck-column-width: "デッキのカラムの幅"
|
deck-column-width: "列宽度"
|
||||||
deck-column-width-narrow: "狭"
|
deck-column-width-narrow: "窄"
|
||||||
deck-column-width-narrower: "やや狭"
|
deck-column-width-narrower: "更窄"
|
||||||
deck-column-width-normal: "正常"
|
deck-column-width-normal: "正常"
|
||||||
deck-column-width-wider: "やや広"
|
deck-column-width-wider: "更宽"
|
||||||
deck-column-width-wide: "広"
|
deck-column-width-wide: "宽"
|
||||||
sound: "声音"
|
sound: "声音"
|
||||||
enable-sounds: "开启声音"
|
enable-sounds: "开启声音"
|
||||||
enable-sounds-desc: "收到帖子/留言时播放声音。 此设置将被存储在浏览器中。"
|
enable-sounds-desc: "收到帖子/留言时播放声音。 此设置将被存储在浏览器中。"
|
||||||
@ -867,13 +865,16 @@ desktop/views/components/settings.2fa.vue:
|
|||||||
enter-password: "请输入您的密码"
|
enter-password: "请输入您的密码"
|
||||||
authenticator: "首先,您需要在设备上安装 Google Authenticator:"
|
authenticator: "首先,您需要在设备上安装 Google Authenticator:"
|
||||||
howtoinstall: "怎样安装"
|
howtoinstall: "怎样安装"
|
||||||
token: "トークン"
|
token: "令牌"
|
||||||
scan: "然后,扫描二维码:"
|
scan: "然后,扫描二维码:"
|
||||||
done: "请输入显示在您设备上的密钥:"
|
done: "请输入显示在您设备上的密钥:"
|
||||||
submit: "提交"
|
submit: "提交"
|
||||||
success: "设置完成"
|
success: "设置完成"
|
||||||
failed: "设置失败, 请确保您的密钥是正确的。"
|
failed: "设置失败, 请确保您的密钥是正确的。"
|
||||||
info: "从下次登录Misskey时,您的设备上显示的令牌以及密码也是必需的。"
|
info: "从下次登录Misskey时,您的设备上显示的令牌以及密码也是必需的。"
|
||||||
|
common/views/components/media-image.vue:
|
||||||
|
sensitive: "阅读注意"
|
||||||
|
click-to-show: "点击查看"
|
||||||
common/views/components/api-settings.vue:
|
common/views/components/api-settings.vue:
|
||||||
intro: "要访问API,请将此标记设置为请求参数的关键字“i”。"
|
intro: "要访问API,请将此标记设置为请求参数的关键字“i”。"
|
||||||
caution: "请勿将此令牌输入任何应用,也不要将此令牌告诉其他人,否则您的账户可能会受到损害。"
|
caution: "请勿将此令牌输入任何应用,也不要将此令牌告诉其他人,否则您的账户可能会受到损害。"
|
||||||
@ -990,7 +991,7 @@ admin/views/index.vue:
|
|||||||
federation: "联合"
|
federation: "联合"
|
||||||
announcements: "公告"
|
announcements: "公告"
|
||||||
hashtags: "标签"
|
hashtags: "标签"
|
||||||
abuse: "スパム報告"
|
abuse: "举报垃圾信息"
|
||||||
back-to-misskey: "返回 Misskey"
|
back-to-misskey: "返回 Misskey"
|
||||||
admin/views/dashboard.vue:
|
admin/views/dashboard.vue:
|
||||||
dashboard: "Dashboard"
|
dashboard: "Dashboard"
|
||||||
@ -1001,11 +1002,11 @@ admin/views/dashboard.vue:
|
|||||||
this-instance: "此实例"
|
this-instance: "此实例"
|
||||||
federated: "联合"
|
federated: "联合"
|
||||||
admin/views/abuse.vue:
|
admin/views/abuse.vue:
|
||||||
title: "スパム報告"
|
title: "举报垃圾信息"
|
||||||
target: "対象"
|
target: "目标"
|
||||||
reporter: "報告者"
|
reporter: "报告者"
|
||||||
details: "詳細"
|
details: "详情"
|
||||||
remove-report: "削除"
|
remove-report: "删除"
|
||||||
admin/views/instance.vue:
|
admin/views/instance.vue:
|
||||||
instance: "例子"
|
instance: "例子"
|
||||||
instance-name: "实例名称"
|
instance-name: "实例名称"
|
||||||
@ -1052,8 +1053,8 @@ admin/views/instance.vue:
|
|||||||
max-note-text-length: "最大帖子字符数"
|
max-note-text-length: "最大帖子字符数"
|
||||||
disable-registration: "停用新用户注册功能"
|
disable-registration: "停用新用户注册功能"
|
||||||
disable-local-timeline: "停用本地时间线功能"
|
disable-local-timeline: "停用本地时间线功能"
|
||||||
disable-global-timeline: "グローバルタイムラインを無効にする"
|
disable-global-timeline: "禁用全局时间线"
|
||||||
disabling-timelines-info: "これらのタイムラインを無効にしても、管理者およびモデレーターは引き続き利用できます。"
|
disabling-timelines-info: "即使禁用时间线,管理员和版主仍然可用。"
|
||||||
invite: "邀请"
|
invite: "邀请"
|
||||||
save: "保存"
|
save: "保存"
|
||||||
saved: "保存完毕"
|
saved: "保存完毕"
|
||||||
@ -1075,7 +1076,7 @@ admin/views/instance.vue:
|
|||||||
smtp-pass: "SMTP 密码"
|
smtp-pass: "SMTP 密码"
|
||||||
serviceworker-config: "ServiceWorker"
|
serviceworker-config: "ServiceWorker"
|
||||||
enable-serviceworker: "启用ServiceWorker"
|
enable-serviceworker: "启用ServiceWorker"
|
||||||
serviceworker-info: "プッシュ通知を行うには有効する必要があります。"
|
serviceworker-info: "您需要启用推送通知"
|
||||||
vapid-publickey: "VAPID公钥"
|
vapid-publickey: "VAPID公钥"
|
||||||
vapid-privatekey: "VAPID私钥"
|
vapid-privatekey: "VAPID私钥"
|
||||||
vapid-info: "如果您想要启用ServiceWorker,那么您需要生成VAPID秘钥。除非您已经在其他地方设置了全局node_modules位置,否则您需要将其作为root用户运行:"
|
vapid-info: "如果您想要启用ServiceWorker,那么您需要生成VAPID秘钥。除非您已经在其他地方设置了全局node_modules位置,否则您需要将其作为root用户运行:"
|
||||||
@ -1097,7 +1098,7 @@ admin/views/charts.vue:
|
|||||||
notes-total: "帖子总数"
|
notes-total: "帖子总数"
|
||||||
users: "用户数量:增加/减少"
|
users: "用户数量:增加/减少"
|
||||||
users-total: "用户总数"
|
users-total: "用户总数"
|
||||||
active-users: "アクティブユーザー数"
|
active-users: "活跃用户数"
|
||||||
drive: "存储容量:增加/减少"
|
drive: "存储容量:增加/减少"
|
||||||
drive-total: "云盘总容量"
|
drive-total: "云盘总容量"
|
||||||
drive-files: "云盘上的文件数:增加/减少"
|
drive-files: "云盘上的文件数:增加/减少"
|
||||||
@ -1107,15 +1108,15 @@ admin/views/charts.vue:
|
|||||||
network-usage: "网络流量"
|
network-usage: "网络流量"
|
||||||
admin/views/drive.vue:
|
admin/views/drive.vue:
|
||||||
operation: "操作"
|
operation: "操作"
|
||||||
fileid-or-url: "ファイルIDまたはファイルURL"
|
fileid-or-url: "文件ID或文件URL"
|
||||||
file-not-found: "ファイルが見つかりません"
|
file-not-found: "找不到文件"
|
||||||
lookup: "照会"
|
lookup: "查询"
|
||||||
sort:
|
sort:
|
||||||
title: "排序"
|
title: "排序"
|
||||||
createdAtAsc: "アップロード日時が古い順"
|
createdAtAsc: "按上传时间(升序)"
|
||||||
createdAtDesc: "アップロード日時が新しい順"
|
createdAtDesc: "按上传时间(降序)"
|
||||||
sizeAsc: "サイズが小さい順"
|
sizeAsc: "按大小(升序)"
|
||||||
sizeDesc: "サイズが大きい順"
|
sizeDesc: "按大小(降序)"
|
||||||
origin:
|
origin:
|
||||||
title: "源自"
|
title: "源自"
|
||||||
combined: "本地+远程"
|
combined: "本地+远程"
|
||||||
@ -1125,23 +1126,30 @@ admin/views/drive.vue:
|
|||||||
deleted: "已删除"
|
deleted: "已删除"
|
||||||
mark-as-sensitive: "标记为“敏感”"
|
mark-as-sensitive: "标记为“敏感”"
|
||||||
unmark-as-sensitive: "取消标记为“敏感”"
|
unmark-as-sensitive: "取消标记为“敏感”"
|
||||||
marked-as-sensitive: "閲覧注意に設定しました"
|
marked-as-sensitive: "标记为“敏感”"
|
||||||
unmarked-as-sensitive: "閲覧注意を解除しました"
|
unmarked-as-sensitive: "取消标记为“敏感”"
|
||||||
admin/views/users.vue:
|
admin/views/users.vue:
|
||||||
operation: "操作"
|
operation: "操作"
|
||||||
username-or-userid: "用户名或用户ID"
|
username-or-userid: "用户名或用户ID"
|
||||||
user-not-found: "用户不存在"
|
user-not-found: "用户不存在"
|
||||||
lookup: "订阅"
|
lookup: "订阅"
|
||||||
reset-password: "密码重置"
|
reset-password: "密码重置"
|
||||||
|
reset-password-confirm: "是否重置密码?"
|
||||||
password-updated: "密码为「{password}」"
|
password-updated: "密码为「{password}」"
|
||||||
suspend: "被冻结"
|
suspend: "被冻结"
|
||||||
|
suspend-confirm: "是否冻结?"
|
||||||
suspended: "成功冻结用户"
|
suspended: "成功冻结用户"
|
||||||
unsuspend: "已解除冻结"
|
unsuspend: "已解除冻结"
|
||||||
|
unsuspend-confirm: "是否解除冻结?"
|
||||||
unsuspended: "已成功解除用户冻结"
|
unsuspended: "已成功解除用户冻结"
|
||||||
verify: "认证用户"
|
verify: "认证用户"
|
||||||
|
verify-confirm: "是否官方账号?"
|
||||||
verified: "此账户已被认证"
|
verified: "此账户已被认证"
|
||||||
unverify: "解除账户认证"
|
unverify: "解除账户认证"
|
||||||
|
unverify-confirm: "是否解除官方账号认证?"
|
||||||
unverified: "该帐户未经认证"
|
unverified: "该帐户未经认证"
|
||||||
|
update-remote-user: "更新远程用户信息"
|
||||||
|
remote-user-updated: "远程用户信息已更新"
|
||||||
users:
|
users:
|
||||||
title: "用户"
|
title: "用户"
|
||||||
sort:
|
sort:
|
||||||
@ -1151,13 +1159,13 @@ admin/views/users.vue:
|
|||||||
updatedAtAsc: "更新时间从旧到新"
|
updatedAtAsc: "更新时间从旧到新"
|
||||||
updatedAtDesc: "更新时间从新到旧"
|
updatedAtDesc: "更新时间从新到旧"
|
||||||
state:
|
state:
|
||||||
title: "状態"
|
title: "状态"
|
||||||
all: "すべて"
|
all: "全部"
|
||||||
admin: "管理者"
|
admin: "管理员"
|
||||||
moderator: "モデレーター"
|
moderator: "版主"
|
||||||
adminOrModerator: "管理者+モデレーター"
|
adminOrModerator: "管理员+版主"
|
||||||
verified: "公式アカウント"
|
verified: "官方认证账户"
|
||||||
suspended: "凍結済み"
|
suspended: "已冻结"
|
||||||
origin:
|
origin:
|
||||||
title: "源自"
|
title: "源自"
|
||||||
combined: "本地+远程"
|
combined: "本地+远程"
|
||||||
@ -1171,7 +1179,7 @@ admin/views/moderators.vue:
|
|||||||
add: "注册"
|
add: "注册"
|
||||||
added: "已注册版主。"
|
added: "已注册版主。"
|
||||||
remove: "解除"
|
remove: "解除"
|
||||||
removed: "モデレーター登録を解除しました"
|
removed: "取消注册版主"
|
||||||
admin/views/emoji.vue:
|
admin/views/emoji.vue:
|
||||||
add-emoji:
|
add-emoji:
|
||||||
title: "添加emoji"
|
title: "添加emoji"
|
||||||
@ -1253,7 +1261,7 @@ desktop/views/pages/user/user.photos.vue:
|
|||||||
no-photos: "没有图片"
|
no-photos: "没有图片"
|
||||||
desktop/views/pages/user/user.profile.vue:
|
desktop/views/pages/user/user.profile.vue:
|
||||||
follows-you: "关注您"
|
follows-you: "关注您"
|
||||||
menu: "メニュー"
|
menu: "菜单"
|
||||||
desktop/views/pages/user/user.header.vue:
|
desktop/views/pages/user/user.header.vue:
|
||||||
posts: "帖子"
|
posts: "帖子"
|
||||||
following: "关注中"
|
following: "关注中"
|
||||||
@ -1267,7 +1275,7 @@ desktop/views/pages/user/user.timeline.vue:
|
|||||||
default: "帖子"
|
default: "帖子"
|
||||||
with-replies: "帖子与回复"
|
with-replies: "帖子与回复"
|
||||||
with-media: "媒体"
|
with-media: "媒体"
|
||||||
my-posts: "私の投稿"
|
my-posts: "我的帖子"
|
||||||
empty: "看起来这个用户还没有发布什么呢。"
|
empty: "看起来这个用户还没有发布什么呢。"
|
||||||
desktop/views/widgets/messaging.vue:
|
desktop/views/widgets/messaging.vue:
|
||||||
title: "信息"
|
title: "信息"
|
||||||
@ -1321,9 +1329,6 @@ mobile/views/components/drive.file-detail.vue:
|
|||||||
nsfw: "阅读注意"
|
nsfw: "阅读注意"
|
||||||
mark-as-sensitive: "标记为“敏感”"
|
mark-as-sensitive: "标记为“敏感”"
|
||||||
unmark-as-sensitive: "取消标记为“敏感”"
|
unmark-as-sensitive: "取消标记为“敏感”"
|
||||||
mobile/views/components/media-image.vue:
|
|
||||||
sensitive: "阅读注意"
|
|
||||||
click-to-show: "点击以显示"
|
|
||||||
mobile/views/components/media-video.vue:
|
mobile/views/components/media-video.vue:
|
||||||
sensitive: "阅读注意"
|
sensitive: "阅读注意"
|
||||||
click-to-show: "点击以显示"
|
click-to-show: "点击以显示"
|
||||||
@ -1468,6 +1473,7 @@ mobile/views/pages/settings.vue:
|
|||||||
notification-position-top: "顶部"
|
notification-position-top: "顶部"
|
||||||
behavior: "动作"
|
behavior: "动作"
|
||||||
fetch-on-scroll: "滚动无限加载"
|
fetch-on-scroll: "滚动无限加载"
|
||||||
|
keep-cw: "保留内容警告"
|
||||||
note-visibility: "帖子可见性"
|
note-visibility: "帖子可见性"
|
||||||
default-note-visibility: "默认可见性"
|
default-note-visibility: "默认可见性"
|
||||||
remember-note-visibility: "记住帖子可见性"
|
remember-note-visibility: "记住帖子可见性"
|
||||||
|
45
package.json
45
package.json
@ -1,8 +1,8 @@
|
|||||||
{
|
{
|
||||||
"name": "misskey",
|
"name": "misskey",
|
||||||
"author": "syuilo <i@syuilo.com>",
|
"author": "syuilo <i@syuilo.com>",
|
||||||
"version": "10.78.2",
|
"version": "10.80.0",
|
||||||
"clientVersion": "2.0.13649",
|
"clientVersion": "2.0.13920",
|
||||||
"codename": "nighthike",
|
"codename": "nighthike",
|
||||||
"main": "./built/index.js",
|
"main": "./built/index.js",
|
||||||
"private": true,
|
"private": true,
|
||||||
@ -22,7 +22,7 @@
|
|||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@fortawesome/fontawesome-svg-core": "1.2.12",
|
"@fortawesome/fontawesome-svg-core": "1.2.12",
|
||||||
"@fortawesome/free-brands-svg-icons": "5.6.3",
|
"@fortawesome/free-brands-svg-icons": "5.6.3",
|
||||||
"@fortawesome/free-regular-svg-icons": "5.5.0",
|
"@fortawesome/free-regular-svg-icons": "5.6.3",
|
||||||
"@fortawesome/free-solid-svg-icons": "5.6.3",
|
"@fortawesome/free-solid-svg-icons": "5.6.3",
|
||||||
"@fortawesome/vue-fontawesome": "0.1.5",
|
"@fortawesome/vue-fontawesome": "0.1.5",
|
||||||
"@koa/cors": "2.2.3",
|
"@koa/cors": "2.2.3",
|
||||||
@ -36,7 +36,7 @@
|
|||||||
"@types/double-ended-queue": "2.1.0",
|
"@types/double-ended-queue": "2.1.0",
|
||||||
"@types/elasticsearch": "5.0.30",
|
"@types/elasticsearch": "5.0.30",
|
||||||
"@types/file-type": "10.6.0",
|
"@types/file-type": "10.6.0",
|
||||||
"@types/gulp": "3.8.36",
|
"@types/gulp": "4.0.5",
|
||||||
"@types/gulp-mocha": "0.0.32",
|
"@types/gulp-mocha": "0.0.32",
|
||||||
"@types/gulp-rename": "0.0.33",
|
"@types/gulp-rename": "0.0.33",
|
||||||
"@types/gulp-replace": "0.0.31",
|
"@types/gulp-replace": "0.0.31",
|
||||||
@ -45,7 +45,7 @@
|
|||||||
"@types/is-root": "1.0.0",
|
"@types/is-root": "1.0.0",
|
||||||
"@types/is-svg": "3.0.0",
|
"@types/is-svg": "3.0.0",
|
||||||
"@types/is-url": "1.2.28",
|
"@types/is-url": "1.2.28",
|
||||||
"@types/js-yaml": "3.11.4",
|
"@types/js-yaml": "3.12.0",
|
||||||
"@types/katex": "0.5.0",
|
"@types/katex": "0.5.0",
|
||||||
"@types/koa": "2.0.48",
|
"@types/koa": "2.0.48",
|
||||||
"@types/koa-bodyparser": "5.0.2",
|
"@types/koa-bodyparser": "5.0.2",
|
||||||
@ -54,17 +54,18 @@
|
|||||||
"@types/koa-logger": "3.1.1",
|
"@types/koa-logger": "3.1.1",
|
||||||
"@types/koa-mount": "3.0.1",
|
"@types/koa-mount": "3.0.1",
|
||||||
"@types/koa-multer": "1.0.0",
|
"@types/koa-multer": "1.0.0",
|
||||||
"@types/koa-router": "7.0.35",
|
"@types/koa-router": "7.0.38",
|
||||||
"@types/koa-send": "4.1.1",
|
"@types/koa-send": "4.1.1",
|
||||||
"@types/koa-views": "2.0.3",
|
"@types/koa-views": "2.0.3",
|
||||||
"@types/koa__cors": "2.2.3",
|
"@types/koa__cors": "2.2.3",
|
||||||
"@types/minio": "7.0.1",
|
"@types/minio": "7.0.1",
|
||||||
"@types/mkdirp": "0.5.2",
|
"@types/mkdirp": "0.5.2",
|
||||||
"@types/mocha": "5.2.5",
|
"@types/mocha": "5.2.5",
|
||||||
"@types/mongodb": "3.1.18",
|
"@types/mongodb": "3.1.19",
|
||||||
"@types/ms": "0.7.30",
|
"@types/ms": "0.7.30",
|
||||||
"@types/node": "10.12.18",
|
"@types/node": "10.12.18",
|
||||||
"@types/nodemailer": "4.6.5",
|
"@types/nodemailer": "4.6.5",
|
||||||
|
"@types/nprogress": "0.0.29",
|
||||||
"@types/oauth": "0.9.1",
|
"@types/oauth": "0.9.1",
|
||||||
"@types/parsimmon": "1.10.0",
|
"@types/parsimmon": "1.10.0",
|
||||||
"@types/portscanner": "2.1.0",
|
"@types/portscanner": "2.1.0",
|
||||||
@ -76,14 +77,15 @@
|
|||||||
"@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",
|
||||||
"@types/sharp": "0.21.0",
|
"@types/sharp": "0.21.1",
|
||||||
"@types/showdown": "1.9.2",
|
"@types/showdown": "1.9.2",
|
||||||
"@types/speakeasy": "2.0.3",
|
"@types/speakeasy": "2.0.3",
|
||||||
"@types/systeminformation": "3.23.1",
|
"@types/systeminformation": "3.23.1",
|
||||||
"@types/tinycolor2": "1.4.1",
|
"@types/tinycolor2": "1.4.1",
|
||||||
"@types/tmp": "0.0.33",
|
"@types/tmp": "0.0.33",
|
||||||
"@types/uuid": "3.4.4",
|
"@types/uuid": "3.4.4",
|
||||||
"@types/webpack": "4.4.21",
|
"@types/web-push": "3.3.0",
|
||||||
|
"@types/webpack": "4.4.24",
|
||||||
"@types/webpack-stream": "3.2.10",
|
"@types/webpack-stream": "3.2.10",
|
||||||
"@types/websocket": "0.0.40",
|
"@types/websocket": "0.0.40",
|
||||||
"@types/ws": "6.0.1",
|
"@types/ws": "6.0.1",
|
||||||
@ -97,14 +99,14 @@
|
|||||||
"bootstrap-vue": "2.0.0-rc.11",
|
"bootstrap-vue": "2.0.0-rc.11",
|
||||||
"cafy": "12.0.0",
|
"cafy": "12.0.0",
|
||||||
"chai": "4.2.0",
|
"chai": "4.2.0",
|
||||||
"chalk": "2.4.2",
|
|
||||||
"chai-http": "4.2.1",
|
"chai-http": "4.2.1",
|
||||||
|
"chalk": "2.4.2",
|
||||||
"commander": "2.19.0",
|
"commander": "2.19.0",
|
||||||
"crc-32": "1.2.0",
|
"crc-32": "1.2.0",
|
||||||
"css-loader": "1.0.1",
|
"css-loader": "1.0.1",
|
||||||
"cssnano": "4.1.8",
|
"cssnano": "4.1.8",
|
||||||
"dateformat": "3.0.3",
|
"dateformat": "3.0.3",
|
||||||
"debug": "4.1.0",
|
"debug": "4.1.1",
|
||||||
"deep-equal": "1.0.1",
|
"deep-equal": "1.0.1",
|
||||||
"deepcopy": "0.6.3",
|
"deepcopy": "0.6.3",
|
||||||
"diskusage": "1.0.0",
|
"diskusage": "1.0.0",
|
||||||
@ -116,10 +118,9 @@
|
|||||||
"eslint-plugin-vue": "5.1.0",
|
"eslint-plugin-vue": "5.1.0",
|
||||||
"eventemitter3": "3.1.0",
|
"eventemitter3": "3.1.0",
|
||||||
"feed": "2.0.2",
|
"feed": "2.0.2",
|
||||||
"file-loader": "2.0.0",
|
|
||||||
"file-type": "10.7.0",
|
"file-type": "10.7.0",
|
||||||
"fuckadblock": "3.2.1",
|
"fuckadblock": "3.2.1",
|
||||||
"gulp": "3.9.1",
|
"gulp": "4.0.0",
|
||||||
"gulp-cssnano": "2.1.3",
|
"gulp-cssnano": "2.1.3",
|
||||||
"gulp-imagemin": "4.1.0",
|
"gulp-imagemin": "4.1.0",
|
||||||
"gulp-mocha": "6.0.0",
|
"gulp-mocha": "6.0.0",
|
||||||
@ -155,7 +156,7 @@
|
|||||||
"koa-router": "7.4.0",
|
"koa-router": "7.4.0",
|
||||||
"koa-send": "5.0.0",
|
"koa-send": "5.0.0",
|
||||||
"koa-slow": "2.1.0",
|
"koa-slow": "2.1.0",
|
||||||
"koa-views": "6.1.4",
|
"koa-views": "6.1.5",
|
||||||
"langmap": "0.0.16",
|
"langmap": "0.0.16",
|
||||||
"loader-utils": "1.2.3",
|
"loader-utils": "1.2.3",
|
||||||
"lookup-dns-cache": "2.1.0",
|
"lookup-dns-cache": "2.1.0",
|
||||||
@ -169,7 +170,7 @@
|
|||||||
"ms": "2.1.1",
|
"ms": "2.1.1",
|
||||||
"nan": "2.12.1",
|
"nan": "2.12.1",
|
||||||
"nested-property": "0.0.7",
|
"nested-property": "0.0.7",
|
||||||
"nodemailer": "5.0.0",
|
"nodemailer": "5.1.1",
|
||||||
"nprogress": "0.2.0",
|
"nprogress": "0.2.0",
|
||||||
"object-assign-deep": "0.4.0",
|
"object-assign-deep": "0.4.0",
|
||||||
"on-build-webpack": "0.1.0",
|
"on-build-webpack": "0.1.0",
|
||||||
@ -178,13 +179,14 @@
|
|||||||
"parsimmon": "1.12.0",
|
"parsimmon": "1.12.0",
|
||||||
"portscanner": "2.2.0",
|
"portscanner": "2.2.0",
|
||||||
"postcss-loader": "3.0.0",
|
"postcss-loader": "3.0.0",
|
||||||
"progress-bar-webpack-plugin": "1.11.0",
|
"prismjs": "1.15.0",
|
||||||
|
"progress-bar-webpack-plugin": "1.12.0",
|
||||||
"promise-any": "0.2.0",
|
"promise-any": "0.2.0",
|
||||||
"promise-limit": "2.7.0",
|
"promise-limit": "2.7.0",
|
||||||
"promise-sequential": "1.1.1",
|
"promise-sequential": "1.1.1",
|
||||||
"pug": "2.0.3",
|
"pug": "2.0.3",
|
||||||
"punycode": "2.1.1",
|
"punycode": "2.1.1",
|
||||||
"qrcode": "1.3.2",
|
"qrcode": "1.3.3",
|
||||||
"randomcolor": "0.5.3",
|
"randomcolor": "0.5.3",
|
||||||
"ratelimiter": "3.2.0",
|
"ratelimiter": "3.2.0",
|
||||||
"recaptcha-promise": "0.1.3",
|
"recaptcha-promise": "0.1.3",
|
||||||
@ -216,7 +218,7 @@
|
|||||||
"ts-node": "7.0.1",
|
"ts-node": "7.0.1",
|
||||||
"tslint": "5.12.0",
|
"tslint": "5.12.0",
|
||||||
"tslint-sonarts": "1.8.0",
|
"tslint-sonarts": "1.8.0",
|
||||||
"typescript": "3.2.2",
|
"typescript": "3.2.4",
|
||||||
"typescript-eslint-parser": "21.0.2",
|
"typescript-eslint-parser": "21.0.2",
|
||||||
"uglify-es": "3.3.9",
|
"uglify-es": "3.3.9",
|
||||||
"url-loader": "1.1.2",
|
"url-loader": "1.1.2",
|
||||||
@ -228,12 +230,13 @@
|
|||||||
"vue-cropperjs": "3.0.0",
|
"vue-cropperjs": "3.0.0",
|
||||||
"vue-i18n": "8.7.0",
|
"vue-i18n": "8.7.0",
|
||||||
"vue-js-modal": "1.3.28",
|
"vue-js-modal": "1.3.28",
|
||||||
"vue-loader": "15.4.2",
|
"vue-loader": "15.5.1",
|
||||||
"vue-marquee-text-component": "1.1.1",
|
"vue-marquee-text-component": "1.1.1",
|
||||||
|
"vue-prism-component": "1.1.1",
|
||||||
"vue-router": "3.0.2",
|
"vue-router": "3.0.2",
|
||||||
"vue-sequential-entrance": "1.1.3",
|
"vue-sequential-entrance": "1.1.3",
|
||||||
"vue-style-loader": "4.1.2",
|
"vue-style-loader": "4.1.2",
|
||||||
"vue-svg-inline-loader": "1.2.7",
|
"vue-svg-inline-loader": "1.2.10",
|
||||||
"vue-template-compiler": "2.5.17",
|
"vue-template-compiler": "2.5.17",
|
||||||
"vuedraggable": "2.17.0",
|
"vuedraggable": "2.17.0",
|
||||||
"vuewordcloud": "18.7.11",
|
"vuewordcloud": "18.7.11",
|
||||||
@ -244,7 +247,7 @@
|
|||||||
"webpack": "4.28.4",
|
"webpack": "4.28.4",
|
||||||
"webpack-cli": "3.2.1",
|
"webpack-cli": "3.2.1",
|
||||||
"websocket": "1.0.28",
|
"websocket": "1.0.28",
|
||||||
"ws": "6.1.2",
|
"ws": "6.1.3",
|
||||||
"xev": "2.0.1"
|
"xev": "2.0.1"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
5
src/@types/is-root.d.ts
vendored
Normal file
5
src/@types/is-root.d.ts
vendored
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
declare module 'is-root';
|
||||||
|
|
||||||
|
declare namespace isRoot {
|
||||||
|
export function isRoot(): boolean;
|
||||||
|
}
|
3
src/@types/package.json.d.ts
vendored
Normal file
3
src/@types/package.json.d.ts
vendored
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
declare module '*/package.json' {
|
||||||
|
const version: string;
|
||||||
|
}
|
@ -6,10 +6,10 @@
|
|||||||
<sequential-entrance animation="entranceFromTop" delay="25">
|
<sequential-entrance animation="entranceFromTop" delay="25">
|
||||||
<div v-for="report in userReports" :key="report.id" class="haexwsjc">
|
<div v-for="report in userReports" :key="report.id" class="haexwsjc">
|
||||||
<ui-horizon-group inputs>
|
<ui-horizon-group inputs>
|
||||||
<ui-input :value="report.user | acct" type="text">
|
<ui-input :value="report.user | acct" type="text" readonly>
|
||||||
<span>{{ $t('target') }}</span>
|
<span>{{ $t('target') }}</span>
|
||||||
</ui-input>
|
</ui-input>
|
||||||
<ui-input :value="report.reporter | acct" type="text">
|
<ui-input :value="report.reporter | acct" type="text" readonly>
|
||||||
<span>{{ $t('reporter') }}</span>
|
<span>{{ $t('reporter') }}</span>
|
||||||
</ui-input>
|
</ui-input>
|
||||||
</ui-horizon-group>
|
</ui-horizon-group>
|
||||||
|
85
src/client/app/admin/views/users.user.vue
Normal file
85
src/client/app/admin/views/users.user.vue
Normal file
@ -0,0 +1,85 @@
|
|||||||
|
<template>
|
||||||
|
<div class="kofvwchc">
|
||||||
|
<div>
|
||||||
|
<a :href="user | userPage(null, true)">
|
||||||
|
<mk-avatar class="avatar" :user="user" :disable-link="true"/>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<header>
|
||||||
|
<b><mk-user-name :user="user"/></b>
|
||||||
|
<span class="username">@{{ user | acct }}</span>
|
||||||
|
<span class="is-admin" v-if="user.isAdmin">admin</span>
|
||||||
|
<span class="is-moderator" v-if="user.isModerator">moderator</span>
|
||||||
|
<span class="is-verified" v-if="user.isVerified" :title="$t('@.verified-user')"><fa icon="star"/></span>
|
||||||
|
<span class="is-silenced" v-if="user.isSilenced" :title="$t('@.silenced-user')"><fa :icon="faMicrophoneSlash"/></span>
|
||||||
|
<span class="is-suspended" v-if="user.isSuspended" :title="$t('@.suspended-user')"><fa :icon="faSnowflake"/></span>
|
||||||
|
</header>
|
||||||
|
<div>
|
||||||
|
<span>{{ $t('users.updatedAt') }}: <mk-time :time="user.updatedAt" mode="detail"/></span>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<span>{{ $t('users.createdAt') }}: <mk-time :time="user.createdAt" mode="detail"/></span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts">
|
||||||
|
import Vue from 'vue';
|
||||||
|
import i18n from '../../i18n';
|
||||||
|
import { faMicrophoneSlash } from '@fortawesome/free-solid-svg-icons';
|
||||||
|
import { faSnowflake } from '@fortawesome/free-regular-svg-icons';
|
||||||
|
|
||||||
|
export default Vue.extend({
|
||||||
|
i18n: i18n('admin/views/users.vue'),
|
||||||
|
props: ['user'],
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
faSnowflake, faMicrophoneSlash
|
||||||
|
};
|
||||||
|
},
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="stylus" scoped>
|
||||||
|
.kofvwchc
|
||||||
|
display flex
|
||||||
|
padding 16px 0
|
||||||
|
border-top solid 1px var(--faceDivider)
|
||||||
|
|
||||||
|
> div:first-child
|
||||||
|
> a
|
||||||
|
> .avatar
|
||||||
|
width 64px
|
||||||
|
height 64px
|
||||||
|
|
||||||
|
> div:last-child
|
||||||
|
flex 1
|
||||||
|
padding-left 16px
|
||||||
|
|
||||||
|
@media (max-width 500px)
|
||||||
|
font-size 14px
|
||||||
|
|
||||||
|
> header
|
||||||
|
> .username
|
||||||
|
margin-left 8px
|
||||||
|
opacity 0.7
|
||||||
|
|
||||||
|
> .is-admin
|
||||||
|
> .is-moderator
|
||||||
|
flex-shrink 0
|
||||||
|
align-self center
|
||||||
|
margin 0 0 0 .5em
|
||||||
|
padding 1px 6px
|
||||||
|
font-size 80%
|
||||||
|
border-radius 3px
|
||||||
|
background var(--noteHeaderAdminBg)
|
||||||
|
color var(--noteHeaderAdminFg)
|
||||||
|
|
||||||
|
> .is-verified
|
||||||
|
> .is-silenced
|
||||||
|
> .is-suspended
|
||||||
|
margin 0 0 0 .5em
|
||||||
|
color #4dabf7
|
||||||
|
</style>
|
@ -3,20 +3,31 @@
|
|||||||
<ui-card>
|
<ui-card>
|
||||||
<div slot="title"><fa :icon="faTerminal"/> {{ $t('operation') }}</div>
|
<div slot="title"><fa :icon="faTerminal"/> {{ $t('operation') }}</div>
|
||||||
<section class="fit-top">
|
<section class="fit-top">
|
||||||
<ui-input v-model="target" type="text">
|
<ui-input class="target" v-model="target" type="text">
|
||||||
<span>{{ $t('username-or-userid') }}</span>
|
<span>{{ $t('username-or-userid') }}</span>
|
||||||
</ui-input>
|
</ui-input>
|
||||||
|
<ui-button @click="showUser"><fa :icon="faSearch"/> {{ $t('lookup') }}</ui-button>
|
||||||
|
|
||||||
|
<div class="user" v-if="user">
|
||||||
|
<x-user :user='user'/>
|
||||||
|
<div class="actions">
|
||||||
<ui-button @click="resetPassword"><fa :icon="faKey"/> {{ $t('reset-password') }}</ui-button>
|
<ui-button @click="resetPassword"><fa :icon="faKey"/> {{ $t('reset-password') }}</ui-button>
|
||||||
<ui-horizon-group>
|
<ui-horizon-group>
|
||||||
<ui-button @click="verifyUser" :disabled="verifying"><fa :icon="faCertificate"/> {{ $t('verify') }}</ui-button>
|
<ui-button @click="verifyUser" :disabled="verifying"><fa :icon="faCertificate"/> {{ $t('verify') }}</ui-button>
|
||||||
<ui-button @click="unverifyUser" :disabled="unverifying">{{ $t('unverify') }}</ui-button>
|
<ui-button @click="unverifyUser" :disabled="unverifying">{{ $t('unverify') }}</ui-button>
|
||||||
</ui-horizon-group>
|
</ui-horizon-group>
|
||||||
|
<ui-horizon-group>
|
||||||
|
<ui-button @click="silenceUser"><fa :icon="faMicrophoneSlash"/> {{ $t('make-silence') }}</ui-button>
|
||||||
|
<ui-button @click="unsilenceUser">{{ $t('unmake-silence') }}</ui-button>
|
||||||
|
</ui-horizon-group>
|
||||||
<ui-horizon-group>
|
<ui-horizon-group>
|
||||||
<ui-button @click="suspendUser" :disabled="suspending"><fa :icon="faSnowflake"/> {{ $t('suspend') }}</ui-button>
|
<ui-button @click="suspendUser" :disabled="suspending"><fa :icon="faSnowflake"/> {{ $t('suspend') }}</ui-button>
|
||||||
<ui-button @click="unsuspendUser" :disabled="unsuspending">{{ $t('unsuspend') }}</ui-button>
|
<ui-button @click="unsuspendUser" :disabled="unsuspending">{{ $t('unsuspend') }}</ui-button>
|
||||||
</ui-horizon-group>
|
</ui-horizon-group>
|
||||||
<ui-button @click="showUser"><fa :icon="faSearch"/> {{ $t('lookup') }}</ui-button>
|
<ui-button v-if="user.host != null" @click="updateRemoteUser"><fa :icon="faSync"/> {{ $t('update-remote-user') }}</ui-button>
|
||||||
<ui-textarea v-if="user" :value="user | json5" readonly tall style="margin-top:16px;"></ui-textarea>
|
<ui-textarea v-if="user" :value="user | json5" readonly tall style="margin-top:16px;"></ui-textarea>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</section>
|
</section>
|
||||||
</ui-card>
|
</ui-card>
|
||||||
|
|
||||||
@ -47,29 +58,7 @@
|
|||||||
</ui-select>
|
</ui-select>
|
||||||
</ui-horizon-group>
|
</ui-horizon-group>
|
||||||
<sequential-entrance animation="entranceFromTop" delay="25">
|
<sequential-entrance animation="entranceFromTop" delay="25">
|
||||||
<div class="kofvwchc" v-for="user in users" :key="user.id">
|
<x-user v-for="user in users" :user='user' :key="user.id"/>
|
||||||
<div>
|
|
||||||
<a :href="user | userPage(null, true)">
|
|
||||||
<mk-avatar class="avatar" :user="user" :disable-link="true"/>
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
<div>
|
|
||||||
<header>
|
|
||||||
<b><mk-user-name :user="user"/></b>
|
|
||||||
<span class="username">@{{ user | acct }}</span>
|
|
||||||
<span class="is-admin" v-if="user.isAdmin">admin</span>
|
|
||||||
<span class="is-moderator" v-if="user.isModerator">moderator</span>
|
|
||||||
<span class="is-verified" v-if="user.isVerified" :title="$t('@.verified-user')"><fa icon="star"/></span>
|
|
||||||
<span class="is-suspended" v-if="user.isSuspended" :title="$t('@.suspended-user')"><fa :icon="faSnowflake"/></span>
|
|
||||||
</header>
|
|
||||||
<div>
|
|
||||||
<span>{{ $t('users.updatedAt') }}: <mk-time :time="user.updatedAt" mode="detail"/></span>
|
|
||||||
</div>
|
|
||||||
<div>
|
|
||||||
<span>{{ $t('users.createdAt') }}: <mk-time :time="user.createdAt" mode="detail"/></span>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</sequential-entrance>
|
</sequential-entrance>
|
||||||
<ui-button v-if="existMore" @click="fetchUsers">{{ $t('@.load-more') }}</ui-button>
|
<ui-button v-if="existMore" @click="fetchUsers">{{ $t('@.load-more') }}</ui-button>
|
||||||
</section>
|
</section>
|
||||||
@ -81,12 +70,15 @@
|
|||||||
import Vue from 'vue';
|
import Vue from 'vue';
|
||||||
import i18n from '../../i18n';
|
import i18n from '../../i18n';
|
||||||
import parseAcct from "../../../../misc/acct/parse";
|
import parseAcct from "../../../../misc/acct/parse";
|
||||||
import { faCertificate, faUsers, faTerminal, faSearch, faKey } from '@fortawesome/free-solid-svg-icons';
|
import { faCertificate, faUsers, faTerminal, faSearch, faKey, faSync, faMicrophoneSlash } from '@fortawesome/free-solid-svg-icons';
|
||||||
import { faSnowflake } from '@fortawesome/free-regular-svg-icons';
|
import { faSnowflake } from '@fortawesome/free-regular-svg-icons';
|
||||||
|
import XUser from './users.user.vue';
|
||||||
|
|
||||||
export default Vue.extend({
|
export default Vue.extend({
|
||||||
i18n: i18n('admin/views/users.vue'),
|
i18n: i18n('admin/views/users.vue'),
|
||||||
|
components: {
|
||||||
|
XUser
|
||||||
|
},
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
user: null,
|
user: null,
|
||||||
@ -102,7 +94,7 @@ export default Vue.extend({
|
|||||||
offset: 0,
|
offset: 0,
|
||||||
users: [],
|
users: [],
|
||||||
existMore: false,
|
existMore: false,
|
||||||
faTerminal, faCertificate, faUsers, faSnowflake, faSearch, faKey
|
faTerminal, faCertificate, faUsers, faSnowflake, faSearch, faKey, faSync, faMicrophoneSlash
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -131,6 +123,7 @@ export default Vue.extend({
|
|||||||
},
|
},
|
||||||
|
|
||||||
methods: {
|
methods: {
|
||||||
|
/** テキストエリアのユーザーを解決する */
|
||||||
async fetchUser() {
|
async fetchUser() {
|
||||||
try {
|
try {
|
||||||
return await this.$root.api('users/show', this.target.startsWith('@') ? parseAcct(this.target) : { userId: this.target });
|
return await this.$root.api('users/show', this.target.startsWith('@') ? parseAcct(this.target) : { userId: this.target });
|
||||||
@ -149,16 +142,27 @@ export default Vue.extend({
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
/** テキストエリアから処理対象ユーザーを設定する */
|
||||||
async showUser() {
|
async showUser() {
|
||||||
|
this.user = null;
|
||||||
const user = await this.fetchUser();
|
const user = await this.fetchUser();
|
||||||
this.$root.api('admin/show-user', { userId: user.id }).then(info => {
|
this.$root.api('admin/show-user', { userId: user.id }).then(info => {
|
||||||
this.user = info;
|
this.user = info;
|
||||||
});
|
});
|
||||||
|
this.target = '';
|
||||||
|
},
|
||||||
|
|
||||||
|
/** 処理対象ユーザーの情報を更新する */
|
||||||
|
async refreshUser() {
|
||||||
|
this.$root.api('admin/show-user', { userId: this.user._id }).then(info => {
|
||||||
|
this.user = info;
|
||||||
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
async resetPassword() {
|
async resetPassword() {
|
||||||
const user = await this.fetchUser();
|
if (!await this.getConfirmed(this.$t('reset-password-confirm'))) return;
|
||||||
this.$root.api('admin/reset-password', { userId: user.id }).then(res => {
|
|
||||||
|
this.$root.api('admin/reset-password', { userId: this.user._id }).then(res => {
|
||||||
this.$root.dialog({
|
this.$root.dialog({
|
||||||
type: 'success',
|
type: 'success',
|
||||||
text: this.$t('password-updated', { password: res.password })
|
text: this.$t('password-updated', { password: res.password })
|
||||||
@ -167,11 +171,12 @@ export default Vue.extend({
|
|||||||
},
|
},
|
||||||
|
|
||||||
async verifyUser() {
|
async verifyUser() {
|
||||||
|
if (!await this.getConfirmed(this.$t('verify-confirm'))) return;
|
||||||
|
|
||||||
this.verifying = true;
|
this.verifying = true;
|
||||||
|
|
||||||
const process = async () => {
|
const process = async () => {
|
||||||
const user = await this.fetchUser();
|
await this.$root.api('admin/verify-user', { userId: this.user._id });
|
||||||
await this.$root.api('admin/verify-user', { userId: user.id });
|
|
||||||
this.$root.dialog({
|
this.$root.dialog({
|
||||||
type: 'success',
|
type: 'success',
|
||||||
text: this.$t('verified')
|
text: this.$t('verified')
|
||||||
@ -186,14 +191,17 @@ export default Vue.extend({
|
|||||||
});
|
});
|
||||||
|
|
||||||
this.verifying = false;
|
this.verifying = false;
|
||||||
|
|
||||||
|
this.refreshUser();
|
||||||
},
|
},
|
||||||
|
|
||||||
async unverifyUser() {
|
async unverifyUser() {
|
||||||
|
if (!await this.getConfirmed(this.$t('unverify-confirm'))) return;
|
||||||
|
|
||||||
this.unverifying = true;
|
this.unverifying = true;
|
||||||
|
|
||||||
const process = async () => {
|
const process = async () => {
|
||||||
const user = await this.fetchUser();
|
await this.$root.api('admin/unverify-user', { userId: this.user._id });
|
||||||
await this.$root.api('admin/unverify-user', { userId: user.id });
|
|
||||||
this.$root.dialog({
|
this.$root.dialog({
|
||||||
type: 'success',
|
type: 'success',
|
||||||
text: this.$t('unverified')
|
text: this.$t('unverified')
|
||||||
@ -208,14 +216,55 @@ export default Vue.extend({
|
|||||||
});
|
});
|
||||||
|
|
||||||
this.unverifying = false;
|
this.unverifying = false;
|
||||||
|
|
||||||
|
this.refreshUser();
|
||||||
|
},
|
||||||
|
|
||||||
|
async silenceUser() {
|
||||||
|
const process = async () => {
|
||||||
|
await this.$root.api('admin/silence-user', { userId: this.user._id });
|
||||||
|
this.$root.dialog({
|
||||||
|
type: 'success',
|
||||||
|
splash: true
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
await process().catch(e => {
|
||||||
|
this.$root.dialog({
|
||||||
|
type: 'error',
|
||||||
|
text: e.toString()
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
this.refreshUser();
|
||||||
|
},
|
||||||
|
|
||||||
|
async unsilenceUser() {
|
||||||
|
const process = async () => {
|
||||||
|
await this.$root.api('admin/unsilence-user', { userId: this.user._id });
|
||||||
|
this.$root.dialog({
|
||||||
|
type: 'success',
|
||||||
|
splash: true
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
await process().catch(e => {
|
||||||
|
this.$root.dialog({
|
||||||
|
type: 'error',
|
||||||
|
text: e.toString()
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
this.refreshUser();
|
||||||
},
|
},
|
||||||
|
|
||||||
async suspendUser() {
|
async suspendUser() {
|
||||||
|
if (!await this.getConfirmed(this.$t('suspend-confirm'))) return;
|
||||||
|
|
||||||
this.suspending = true;
|
this.suspending = true;
|
||||||
|
|
||||||
const process = async () => {
|
const process = async () => {
|
||||||
const user = await this.fetchUser();
|
await this.$root.api('admin/suspend-user', { userId: this.user._id });
|
||||||
await this.$root.api('admin/suspend-user', { userId: user.id });
|
|
||||||
this.$root.dialog({
|
this.$root.dialog({
|
||||||
type: 'success',
|
type: 'success',
|
||||||
text: this.$t('suspended')
|
text: this.$t('suspended')
|
||||||
@ -230,14 +279,17 @@ export default Vue.extend({
|
|||||||
});
|
});
|
||||||
|
|
||||||
this.suspending = false;
|
this.suspending = false;
|
||||||
|
|
||||||
|
this.refreshUser();
|
||||||
},
|
},
|
||||||
|
|
||||||
async unsuspendUser() {
|
async unsuspendUser() {
|
||||||
|
if (!await this.getConfirmed(this.$t('unsuspend-confirm'))) return;
|
||||||
|
|
||||||
this.unsuspending = true;
|
this.unsuspending = true;
|
||||||
|
|
||||||
const process = async () => {
|
const process = async () => {
|
||||||
const user = await this.fetchUser();
|
await this.$root.api('admin/unsuspend-user', { userId: this.user._id });
|
||||||
await this.$root.api('admin/unsuspend-user', { userId: user.id });
|
|
||||||
this.$root.dialog({
|
this.$root.dialog({
|
||||||
type: 'success',
|
type: 'success',
|
||||||
text: this.$t('unsuspended')
|
text: this.$t('unsuspended')
|
||||||
@ -252,8 +304,32 @@ export default Vue.extend({
|
|||||||
});
|
});
|
||||||
|
|
||||||
this.unsuspending = false;
|
this.unsuspending = false;
|
||||||
|
|
||||||
|
this.refreshUser();
|
||||||
},
|
},
|
||||||
|
|
||||||
|
async updateRemoteUser() {
|
||||||
|
this.$root.api('admin/update-remote-user', { userId: this.user._id }).then(res => {
|
||||||
|
this.$root.dialog({
|
||||||
|
type: 'success',
|
||||||
|
text: this.$t('remote-user-updated')
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
this.refreshUser();
|
||||||
|
},
|
||||||
|
|
||||||
|
async getConfirmed(text: string): Promise<Boolean> {
|
||||||
|
const confirm = await this.$root.dialog({
|
||||||
|
type: 'warning',
|
||||||
|
showCancelButton: true,
|
||||||
|
title: 'confirm',
|
||||||
|
text,
|
||||||
|
});
|
||||||
|
|
||||||
|
return !confirm.canceled;
|
||||||
|
}
|
||||||
|
|
||||||
fetchUsers() {
|
fetchUsers() {
|
||||||
this.$root.api('admin/show-users', {
|
this.$root.api('admin/show-users', {
|
||||||
state: this.state,
|
state: this.state,
|
||||||
@ -277,42 +353,12 @@ export default Vue.extend({
|
|||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="stylus" scoped>
|
<style lang="stylus" scoped>
|
||||||
.kofvwchc
|
.target
|
||||||
display flex
|
margin-bottom 16px !important
|
||||||
padding 16px 0
|
|
||||||
border-top solid 1px var(--faceDivider)
|
|
||||||
|
|
||||||
> div:first-child
|
.user
|
||||||
> a
|
margin-top 32px
|
||||||
> .avatar
|
|
||||||
width 64px
|
|
||||||
height 64px
|
|
||||||
|
|
||||||
> div:last-child
|
> .actions
|
||||||
flex 1
|
margin-left 80px
|
||||||
padding-left 16px
|
|
||||||
|
|
||||||
@media (max-width 500px)
|
|
||||||
font-size 14px
|
|
||||||
|
|
||||||
> header
|
|
||||||
> .username
|
|
||||||
margin-left 8px
|
|
||||||
opacity 0.7
|
|
||||||
|
|
||||||
> .is-admin
|
|
||||||
> .is-moderator
|
|
||||||
flex-shrink 0
|
|
||||||
align-self center
|
|
||||||
margin 0 0 0 .5em
|
|
||||||
padding 1px 6px
|
|
||||||
font-size 80%
|
|
||||||
border-radius 3px
|
|
||||||
background var(--noteHeaderAdminBg)
|
|
||||||
color var(--noteHeaderAdminFg)
|
|
||||||
|
|
||||||
> .is-verified
|
|
||||||
> .is-suspended
|
|
||||||
margin 0 0 0 .5em
|
|
||||||
color #4dabf7
|
|
||||||
</style>
|
</style>
|
||||||
|
@ -26,3 +26,16 @@
|
|||||||
transform: translateY(0);
|
transform: translateY(0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@keyframes spin {
|
||||||
|
0% { transform: rotate(0deg); }
|
||||||
|
100% { transform: rotate(360deg); }
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes jump {
|
||||||
|
0% { transform: translateY(0); }
|
||||||
|
25% { transform: translateY(-16px); }
|
||||||
|
50% { transform: translateY(0); }
|
||||||
|
75% { transform: translateY(-8px); }
|
||||||
|
100% { transform: translateY(0); }
|
||||||
|
}
|
||||||
|
@ -72,47 +72,6 @@ body
|
|||||||
code
|
code
|
||||||
font-family Consolas, 'Courier New', Courier, Monaco, monospace
|
font-family Consolas, 'Courier New', Courier, Monaco, monospace
|
||||||
|
|
||||||
.comment
|
|
||||||
opacity 0.5
|
|
||||||
|
|
||||||
.string
|
|
||||||
color #e96900
|
|
||||||
|
|
||||||
.regexp
|
|
||||||
color #e9003f
|
|
||||||
|
|
||||||
.keyword
|
|
||||||
color #2973b7
|
|
||||||
|
|
||||||
&.true
|
|
||||||
&.false
|
|
||||||
&.null
|
|
||||||
&.nil
|
|
||||||
&.undefined
|
|
||||||
color #ae81ff
|
|
||||||
|
|
||||||
.symbol
|
|
||||||
color #42b983
|
|
||||||
|
|
||||||
.number
|
|
||||||
.nan
|
|
||||||
color #ae81ff
|
|
||||||
|
|
||||||
.var:not(.keyword)
|
|
||||||
font-weight bold
|
|
||||||
font-style italic
|
|
||||||
//text-decoration underline
|
|
||||||
|
|
||||||
.method
|
|
||||||
font-style italic
|
|
||||||
color #8964c1
|
|
||||||
|
|
||||||
.property
|
|
||||||
color #a71d5d
|
|
||||||
|
|
||||||
.label
|
|
||||||
color #e9003f
|
|
||||||
|
|
||||||
pre
|
pre
|
||||||
display block
|
display block
|
||||||
|
|
||||||
|
@ -2,12 +2,32 @@
|
|||||||
* Clipboardに値をコピー(TODO: 文字列以外も対応)
|
* Clipboardに値をコピー(TODO: 文字列以外も対応)
|
||||||
*/
|
*/
|
||||||
export default val => {
|
export default val => {
|
||||||
const form = document.createElement('textarea');
|
// 空div 生成
|
||||||
form.textContent = val;
|
const tmp = document.createElement('div');
|
||||||
document.body.appendChild(form);
|
// 選択用のタグ生成
|
||||||
form.select();
|
const pre = document.createElement('pre');
|
||||||
|
|
||||||
|
// 親要素のCSSで user-select: none だとコピーできないので書き換える
|
||||||
|
pre.style.webkitUserSelect = 'auto';
|
||||||
|
pre.style.userSelect = 'auto';
|
||||||
|
|
||||||
|
tmp.appendChild(pre).textContent = val;
|
||||||
|
|
||||||
|
// 要素を画面外へ
|
||||||
|
const s = tmp.style;
|
||||||
|
s.position = 'fixed';
|
||||||
|
s.right = '200%';
|
||||||
|
|
||||||
|
// body に追加
|
||||||
|
document.body.appendChild(tmp);
|
||||||
|
// 要素を選択
|
||||||
|
document.getSelection().selectAllChildren(tmp);
|
||||||
|
|
||||||
|
// クリップボードにコピー
|
||||||
const result = document.execCommand('copy');
|
const result = document.execCommand('copy');
|
||||||
document.body.removeChild(form);
|
|
||||||
|
// 要素削除
|
||||||
|
document.body.removeChild(tmp);
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
};
|
};
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
// スクリプトサイズがデカい
|
// スクリプトサイズがデカい
|
||||||
//const crypto = require('crypto');
|
//import * as crypto from 'crypto';
|
||||||
|
|
||||||
export default (data: ArrayBuffer) => {
|
export default (data: ArrayBuffer) => {
|
||||||
//const buf = new Buffer(data);
|
//const buf = new Buffer(data);
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
const NProgress = require('nprogress');
|
import * as NProgress from 'nprogress';
|
||||||
NProgress.configure({
|
NProgress.configure({
|
||||||
trickleSpeed: 500,
|
trickleSpeed: 500,
|
||||||
showSpinner: false
|
showSpinner: false
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
import parse from '../../../../mfm/parse';
|
import { parse } from '../../../../mfm/parse';
|
||||||
import { sum, unique } from '../../../../prelude/array';
|
import { sum, unique } from '../../../../prelude/array';
|
||||||
import shouldMuteNote from './should-mute-note';
|
import shouldMuteNote from './should-mute-note';
|
||||||
import MkNoteMenu from '../views/components/note-menu.vue';
|
import MkNoteMenu from '../views/components/note-menu.vue';
|
||||||
|
@ -133,6 +133,7 @@ export default prop => ({
|
|||||||
|
|
||||||
case 'deleted': {
|
case 'deleted': {
|
||||||
Vue.set(this.$_ns_target, 'deletedAt', body.deletedAt);
|
Vue.set(this.$_ns_target, 'deletedAt', body.deletedAt);
|
||||||
|
Vue.set(this.$_ns_target, 'renote', null);
|
||||||
this.$_ns_target.text = null;
|
this.$_ns_target.text = null;
|
||||||
this.$_ns_target.tags = [];
|
this.$_ns_target.tags = [];
|
||||||
this.$_ns_target.fileIds = [];
|
this.$_ns_target.fileIds = [];
|
||||||
|
30
src/client/app/common/views/components/code-core.vue
Normal file
30
src/client/app/common/views/components/code-core.vue
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
<template>
|
||||||
|
<prism :inline="inline" :language="lang || 'js'">{{ code }}</prism>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts">
|
||||||
|
import Vue from 'vue';
|
||||||
|
import 'prismjs';
|
||||||
|
import 'prismjs/themes/prism-okaidia.css';
|
||||||
|
import Prism from 'vue-prism-component';
|
||||||
|
|
||||||
|
export default Vue.extend({
|
||||||
|
components: {
|
||||||
|
Prism
|
||||||
|
},
|
||||||
|
props: {
|
||||||
|
code: {
|
||||||
|
type: String,
|
||||||
|
required: true
|
||||||
|
},
|
||||||
|
lang: {
|
||||||
|
type: String,
|
||||||
|
required: false
|
||||||
|
},
|
||||||
|
inline: {
|
||||||
|
type: Boolean,
|
||||||
|
required: false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
</script>
|
28
src/client/app/common/views/components/code.vue
Normal file
28
src/client/app/common/views/components/code.vue
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
<template>
|
||||||
|
<x-code :code="code" :lang="lang" :inline="inline"/>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts">
|
||||||
|
import Vue from 'vue';
|
||||||
|
|
||||||
|
export default Vue.extend({
|
||||||
|
components: {
|
||||||
|
XCode: () => import('./code-core.vue').then(m => m.default)
|
||||||
|
},
|
||||||
|
|
||||||
|
props: {
|
||||||
|
code: {
|
||||||
|
type: String,
|
||||||
|
required: true
|
||||||
|
},
|
||||||
|
lang: {
|
||||||
|
type: String,
|
||||||
|
required: false
|
||||||
|
},
|
||||||
|
inline: {
|
||||||
|
type: Boolean,
|
||||||
|
required: false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
</script>
|
@ -1,5 +1,6 @@
|
|||||||
<template>
|
<template>
|
||||||
<span v-html="compiledFormula"></span>
|
<div v-if="block" v-html="compiledFormula"></div>
|
||||||
|
<span v-else v-html="compiledFormula"></span>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
@ -11,6 +12,10 @@ export default Vue.extend({
|
|||||||
formula: {
|
formula: {
|
||||||
type: String,
|
type: String,
|
||||||
required: true
|
required: true
|
||||||
|
},
|
||||||
|
block: {
|
||||||
|
type: Boolean,
|
||||||
|
required: true
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
computed: {
|
computed: {
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
<template>
|
<template>
|
||||||
<x-formula :formula="formula"/>
|
<x-formula :formula="formula" :block="block" />
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
@ -14,6 +14,10 @@ export default Vue.extend({
|
|||||||
formula: {
|
formula: {
|
||||||
type: String,
|
type: String,
|
||||||
required: true
|
required: true
|
||||||
|
},
|
||||||
|
block: {
|
||||||
|
type: Boolean,
|
||||||
|
required: true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
@ -26,7 +26,7 @@
|
|||||||
</section>
|
</section>
|
||||||
<section v-if="myGames.length > 0">
|
<section v-if="myGames.length > 0">
|
||||||
<h2>{{ $t('my-games') }}</h2>
|
<h2>{{ $t('my-games') }}</h2>
|
||||||
<a class="game" v-for="g in myGames" tabindex="-1" @click.prevent="go(g)" :href="`/reversi/${g.id}`">
|
<a class="game" v-for="g in myGames" tabindex="-1" @click.prevent="go(g)" :href="`/games/reversi/${g.id}`">
|
||||||
<mk-avatar class="avatar" :user="g.user1"/>
|
<mk-avatar class="avatar" :user="g.user1"/>
|
||||||
<mk-avatar class="avatar" :user="g.user2"/>
|
<mk-avatar class="avatar" :user="g.user2"/>
|
||||||
<span><b><mk-user-name :user="g.user1"/></b> vs <b><mk-user-name :user="g.user2"/></b></span>
|
<span><b><mk-user-name :user="g.user1"/></b> vs <b><mk-user-name :user="g.user2"/></b></span>
|
||||||
|
@ -5,16 +5,21 @@
|
|||||||
<span>{{ $t('click-to-show') }}</span>
|
<span>{{ $t('click-to-show') }}</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<a class="gqnyydlzavusgskkfvwvjiattxdzsqlf" v-else :href="image.url" target="_blank" :style="style" :title="image.name" @click.prevent="onClick"></a>
|
<a class="gqnyydlzavusgskkfvwvjiattxdzsqlf" v-else
|
||||||
|
:href="image.url"
|
||||||
|
:style="style"
|
||||||
|
:title="image.name"
|
||||||
|
@click.prevent="onClick"
|
||||||
|
></a>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import Vue from 'vue';
|
import Vue from 'vue';
|
||||||
import i18n from '../../../i18n';
|
import i18n from '../../../i18n';
|
||||||
import ImageViewer from '../../../common/views/components/image-viewer.vue';
|
import ImageViewer from './image-viewer.vue';
|
||||||
|
|
||||||
export default Vue.extend({
|
export default Vue.extend({
|
||||||
i18n: i18n('mobile/views/components/media-image.vue'),
|
i18n: i18n('common/views/components/media-image.vue'),
|
||||||
props: {
|
props: {
|
||||||
image: {
|
image: {
|
||||||
type: Object,
|
type: Object,
|
||||||
@ -58,6 +63,7 @@ export default Vue.extend({
|
|||||||
<style lang="stylus" scoped>
|
<style lang="stylus" scoped>
|
||||||
.gqnyydlzavusgskkfvwvjiattxdzsqlf
|
.gqnyydlzavusgskkfvwvjiattxdzsqlf
|
||||||
display block
|
display block
|
||||||
|
cursor zoom-in
|
||||||
overflow hidden
|
overflow hidden
|
||||||
width 100%
|
width 100%
|
||||||
height 100%
|
height 100%
|
@ -7,7 +7,7 @@
|
|||||||
<div :data-count="mediaList.filter(media => previewable(media)).length" ref="grid">
|
<div :data-count="mediaList.filter(media => previewable(media)).length" ref="grid">
|
||||||
<template v-for="media in mediaList">
|
<template v-for="media in mediaList">
|
||||||
<mk-media-video :video="media" :key="media.id" v-if="media.type.startsWith('video')"/>
|
<mk-media-video :video="media" :key="media.id" v-if="media.type.startsWith('video')"/>
|
||||||
<mk-media-image :image="media" :key="media.id" v-else-if="media.type.startsWith('image')" :raw="raw"/>
|
<x-image :image="media" :key="media.id" v-else-if="media.type.startsWith('image')" :raw="raw"/>
|
||||||
</template>
|
</template>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -17,10 +17,12 @@
|
|||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import Vue from 'vue';
|
import Vue from 'vue';
|
||||||
import XBanner from './media-banner.vue';
|
import XBanner from './media-banner.vue';
|
||||||
|
import XImage from './media-image.vue';
|
||||||
|
|
||||||
export default Vue.extend({
|
export default Vue.extend({
|
||||||
components: {
|
components: {
|
||||||
XBanner
|
XBanner,
|
||||||
|
XImage
|
||||||
},
|
},
|
||||||
props: {
|
props: {
|
||||||
mediaList: {
|
mediaList: {
|
||||||
|
@ -34,7 +34,7 @@
|
|||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import Vue from 'vue';
|
import Vue from 'vue';
|
||||||
import i18n from '../../../i18n';
|
import i18n from '../../../i18n';
|
||||||
import parse from '../../../../../mfm/parse';
|
import { parse } from '../../../../../mfm/parse';
|
||||||
import { unique } from '../../../../../prelude/array';
|
import { unique } from '../../../../../prelude/array';
|
||||||
|
|
||||||
export default Vue.extend({
|
export default Vue.extend({
|
||||||
|
@ -1,13 +1,13 @@
|
|||||||
import Vue, { VNode } from 'vue';
|
import Vue, { VNode } from 'vue';
|
||||||
import { length } from 'stringz';
|
import { length } from 'stringz';
|
||||||
import { MfmForest } from '../../../../../mfm/parser';
|
import { MfmForest } from '../../../../../mfm/types';
|
||||||
import parse from '../../../../../mfm/parse';
|
import { parse, parsePlain } from '../../../../../mfm/parse';
|
||||||
import MkUrl from './url.vue';
|
import MkUrl from './url.vue';
|
||||||
import MkMention from './mention.vue';
|
import MkMention from './mention.vue';
|
||||||
import { concat, sum } from '../../../../../prelude/array';
|
import { concat, sum } from '../../../../../prelude/array';
|
||||||
import MkFormula from './formula.vue';
|
import MkFormula from './formula.vue';
|
||||||
|
import MkCode from './code.vue';
|
||||||
import MkGoogle from './google.vue';
|
import MkGoogle from './google.vue';
|
||||||
import syntaxHighlight from '../../../../../mfm/syntax-highlight';
|
|
||||||
import { host } from '../../../config';
|
import { host } from '../../../config';
|
||||||
import { preorderF, countNodesF } from '../../../../../prelude/tree';
|
import { preorderF, countNodesF } from '../../../../../prelude/tree';
|
||||||
|
|
||||||
@ -46,7 +46,7 @@ export default Vue.component('misskey-flavored-markdown', {
|
|||||||
render(createElement) {
|
render(createElement) {
|
||||||
if (this.text == null || this.text == '') return;
|
if (this.text == null || this.text == '') return;
|
||||||
|
|
||||||
const ast = parse(this.text, this.plainText);
|
const ast = (this.plainText ? parsePlain : parse)(this.text);
|
||||||
|
|
||||||
let bigCount = 0;
|
let bigCount = 0;
|
||||||
let motionCount = 0;
|
let motionCount = 0;
|
||||||
@ -84,7 +84,7 @@ export default Vue.component('misskey-flavored-markdown', {
|
|||||||
|
|
||||||
case 'big': {
|
case 'big': {
|
||||||
bigCount++;
|
bigCount++;
|
||||||
const isLong = sumTextsLength(token.children) > 10 || countNodesF(token.children) > 5;
|
const isLong = sumTextsLength(token.children) > 15 || countNodesF(token.children) > 5;
|
||||||
const isMany = bigCount > 3;
|
const isMany = bigCount > 3;
|
||||||
return (createElement as any)('strong', {
|
return (createElement as any)('strong', {
|
||||||
attrs: {
|
attrs: {
|
||||||
@ -98,7 +98,11 @@ export default Vue.component('misskey-flavored-markdown', {
|
|||||||
}
|
}
|
||||||
|
|
||||||
case 'small': {
|
case 'small': {
|
||||||
return [createElement('small', genEl(token.children))];
|
return [createElement('small', {
|
||||||
|
attrs: {
|
||||||
|
style: 'opacity: 0.7;'
|
||||||
|
},
|
||||||
|
}, genEl(token.children))];
|
||||||
}
|
}
|
||||||
|
|
||||||
case 'center': {
|
case 'center': {
|
||||||
@ -111,8 +115,8 @@ export default Vue.component('misskey-flavored-markdown', {
|
|||||||
|
|
||||||
case 'motion': {
|
case 'motion': {
|
||||||
motionCount++;
|
motionCount++;
|
||||||
const isLong = sumTextsLength(token.children) > 10 || countNodesF(token.children) > 5;
|
const isLong = sumTextsLength(token.children) > 15 || countNodesF(token.children) > 5;
|
||||||
const isMany = motionCount > 3;
|
const isMany = motionCount > 5;
|
||||||
return (createElement as any)('span', {
|
return (createElement as any)('span', {
|
||||||
attrs: {
|
attrs: {
|
||||||
style: 'display: inline-block;'
|
style: 'display: inline-block;'
|
||||||
@ -124,6 +128,43 @@ export default Vue.component('misskey-flavored-markdown', {
|
|||||||
}, genEl(token.children));
|
}, genEl(token.children));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
case 'spin': {
|
||||||
|
motionCount++;
|
||||||
|
const isLong = sumTextsLength(token.children) > 10 || countNodesF(token.children) > 5;
|
||||||
|
const isMany = motionCount > 5;
|
||||||
|
const direction =
|
||||||
|
token.node.props.attr == 'left' ? 'reverse' :
|
||||||
|
token.node.props.attr == 'alternate' ? 'alternate' :
|
||||||
|
'normal';
|
||||||
|
const style = (this.$store.state.settings.disableAnimatedMfm || isLong || isMany)
|
||||||
|
? ''
|
||||||
|
: `animation: spin 1.5s linear infinite; animation-direction: ${direction};`;
|
||||||
|
return (createElement as any)('span', {
|
||||||
|
attrs: {
|
||||||
|
style: 'display: inline-block;' + style
|
||||||
|
},
|
||||||
|
}, genEl(token.children));
|
||||||
|
}
|
||||||
|
|
||||||
|
case 'jump': {
|
||||||
|
motionCount++;
|
||||||
|
const isLong = sumTextsLength(token.children) > 30 || countNodesF(token.children) > 5;
|
||||||
|
const isMany = motionCount > 5;
|
||||||
|
return (createElement as any)('span', {
|
||||||
|
attrs: {
|
||||||
|
style: (this.$store.state.settings.disableAnimatedMfm || isLong || isMany) ? 'display: inline-block;' : 'display: inline-block; animation: jump 0.75s linear infinite;'
|
||||||
|
},
|
||||||
|
}, genEl(token.children));
|
||||||
|
}
|
||||||
|
|
||||||
|
case 'flip': {
|
||||||
|
return (createElement as any)('span', {
|
||||||
|
attrs: {
|
||||||
|
style: 'display: inline-block; transform: scaleX(-1);'
|
||||||
|
},
|
||||||
|
}, genEl(token.children));
|
||||||
|
}
|
||||||
|
|
||||||
case 'url': {
|
case 'url': {
|
||||||
return [createElement(MkUrl, {
|
return [createElement(MkUrl, {
|
||||||
key: Math.random(),
|
key: Math.random(),
|
||||||
@ -170,21 +211,22 @@ export default Vue.component('misskey-flavored-markdown', {
|
|||||||
}
|
}
|
||||||
|
|
||||||
case 'blockCode': {
|
case 'blockCode': {
|
||||||
return [createElement('pre', {
|
return [createElement(MkCode, {
|
||||||
class: 'code'
|
key: Math.random(),
|
||||||
}, [
|
props: {
|
||||||
createElement('code', {
|
code: token.node.props.code,
|
||||||
domProps: {
|
lang: token.node.props.lang,
|
||||||
innerHTML: syntaxHighlight(token.node.props.code)
|
|
||||||
}
|
}
|
||||||
})
|
})];
|
||||||
])];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
case 'inlineCode': {
|
case 'inlineCode': {
|
||||||
return [createElement('code', {
|
return [createElement(MkCode, {
|
||||||
domProps: {
|
key: Math.random(),
|
||||||
innerHTML: syntaxHighlight(token.node.props.code)
|
props: {
|
||||||
|
code: token.node.props.code,
|
||||||
|
lang: token.node.props.lang,
|
||||||
|
inline: true
|
||||||
}
|
}
|
||||||
})];
|
})];
|
||||||
}
|
}
|
||||||
@ -228,12 +270,24 @@ export default Vue.component('misskey-flavored-markdown', {
|
|||||||
})];
|
})];
|
||||||
}
|
}
|
||||||
|
|
||||||
case 'math': {
|
case 'mathInline': {
|
||||||
//const MkFormula = () => import('./formula.vue').then(m => m.default);
|
//const MkFormula = () => import('./formula.vue').then(m => m.default);
|
||||||
return [createElement(MkFormula, {
|
return [createElement(MkFormula, {
|
||||||
key: Math.random(),
|
key: Math.random(),
|
||||||
props: {
|
props: {
|
||||||
formula: token.node.props.formula
|
formula: token.node.props.formula,
|
||||||
|
block: false
|
||||||
|
}
|
||||||
|
})];
|
||||||
|
}
|
||||||
|
|
||||||
|
case 'mathBlock': {
|
||||||
|
//const MkFormula = () => import('./formula.vue').then(m => m.default);
|
||||||
|
return [createElement(MkFormula, {
|
||||||
|
key: Math.random(),
|
||||||
|
props: {
|
||||||
|
formula: token.node.props.formula,
|
||||||
|
block: true
|
||||||
}
|
}
|
||||||
})];
|
})];
|
||||||
}
|
}
|
||||||
|
@ -24,34 +24,13 @@ export default Vue.extend({
|
|||||||
background var(--mfmTitleBg)
|
background var(--mfmTitleBg)
|
||||||
border-radius 4px
|
border-radius 4px
|
||||||
|
|
||||||
>>> .code
|
|
||||||
margin 8px 0
|
|
||||||
|
|
||||||
>>> .quote
|
>>> .quote
|
||||||
margin 8px
|
margin 8px
|
||||||
padding 6px 0 6px 12px
|
padding 6px 0 6px 12px
|
||||||
color var(--mfmQuote)
|
color var(--mfmQuote)
|
||||||
border-left solid 3px var(--mfmQuoteLine)
|
border-left solid 3px var(--mfmQuoteLine)
|
||||||
|
|
||||||
>>> code
|
>>> pre code
|
||||||
padding 4px 8px
|
|
||||||
margin 0 0.5em
|
|
||||||
font-size 80%
|
font-size 80%
|
||||||
color #525252
|
|
||||||
background rgba(0, 0, 0, 0.05)
|
|
||||||
border-radius 2px
|
|
||||||
|
|
||||||
>>> pre > code
|
|
||||||
padding 16px
|
|
||||||
margin 0
|
|
||||||
|
|
||||||
>>> [data-is-me]:after
|
|
||||||
content "you"
|
|
||||||
padding 0 4px
|
|
||||||
margin-left 4px
|
|
||||||
font-size 80%
|
|
||||||
color var(--primaryForeground)
|
|
||||||
background var(--primary)
|
|
||||||
border-radius 4px
|
|
||||||
|
|
||||||
</style>
|
</style>
|
||||||
|
@ -10,6 +10,7 @@ import i18n from '../../../i18n';
|
|||||||
import { url } from '../../../config';
|
import { url } from '../../../config';
|
||||||
import copyToClipboard from '../../../common/scripts/copy-to-clipboard';
|
import copyToClipboard from '../../../common/scripts/copy-to-clipboard';
|
||||||
import { concat, intersperse } from '../../../../../prelude/array';
|
import { concat, intersperse } from '../../../../../prelude/array';
|
||||||
|
import { faCopy } from '@fortawesome/free-regular-svg-icons';
|
||||||
|
|
||||||
export default Vue.extend({
|
export default Vue.extend({
|
||||||
i18n: i18n('common/views/components/note-menu.vue'),
|
i18n: i18n('common/views/components/note-menu.vue'),
|
||||||
@ -30,7 +31,7 @@ export default Vue.extend({
|
|||||||
text: this.$t('detail'),
|
text: this.$t('detail'),
|
||||||
action: this.detail
|
action: this.detail
|
||||||
}], [{
|
}], [{
|
||||||
icon: 'align-left',
|
icon: faCopy,
|
||||||
text: this.$t('copy-content'),
|
text: this.$t('copy-content'),
|
||||||
action: this.copyContent
|
action: this.copyContent
|
||||||
}], [{
|
}], [{
|
||||||
@ -87,10 +88,18 @@ export default Vue.extend({
|
|||||||
|
|
||||||
copyContent() {
|
copyContent() {
|
||||||
copyToClipboard(this.note.text);
|
copyToClipboard(this.note.text);
|
||||||
|
this.$root.dialog({
|
||||||
|
type: 'success',
|
||||||
|
splash: true
|
||||||
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
copyLink() {
|
copyLink() {
|
||||||
copyToClipboard(`${url}/notes/${this.note.id}`);
|
copyToClipboard(`${url}/notes/${this.note.id}`);
|
||||||
|
this.$root.dialog({
|
||||||
|
type: 'success',
|
||||||
|
splash: true
|
||||||
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
pin() {
|
pin() {
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
<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 icon="check"/></template>
|
<template v-if="choice.isVoted"><fa icon="check"/></template>
|
||||||
<span>{{ choice.text }}</span>
|
<mfm :text="choice.text" :should-break="false" :plain-text="true" :custom-emojis="note.emojis"/>
|
||||||
<span class="votes" v-if="showResult">({{ $t('vote-count').replace('{}', choice.votes) }})</span>
|
<span class="votes" v-if="showResult">({{ $t('vote-count').replace('{}', choice.votes) }})</span>
|
||||||
</span>
|
</span>
|
||||||
</li>
|
</li>
|
||||||
|
@ -71,10 +71,7 @@ export default Vue.extend({
|
|||||||
});
|
});
|
||||||
this.$root.dialog({
|
this.$root.dialog({
|
||||||
type: 'success',
|
type: 'success',
|
||||||
text: this.$t('list-pushed', {
|
splash: true
|
||||||
user: this.user.name,
|
|
||||||
list: lists.find(l => l.id === listId).title
|
|
||||||
})
|
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@ -1,21 +1,23 @@
|
|||||||
<template>
|
<template>
|
||||||
<mk-window ref="window" is-modal width="800px" height="500px" @closed="destroyDom">
|
<mk-window ref="window" is-modal width="800px" height="500px" @closed="destroyDom">
|
||||||
<span slot="header">
|
<span slot="header" class="jqiaciqv">
|
||||||
<span :class="$style.title">{{ $t('choose-prompt') }}</span>
|
<span class="title">{{ $t('choose-prompt') }}</span>
|
||||||
<span :class="$style.count" v-if="multiple && files.length > 0">({{ $t('chosen-files', { count: files.length }) }})</span>
|
<span class="count" v-if="multiple && files.length > 0">({{ $t('chosen-files', { count: files.length }) }})</span>
|
||||||
</span>
|
</span>
|
||||||
|
|
||||||
|
<div class="rqsvbumu">
|
||||||
<x-drive
|
<x-drive
|
||||||
ref="browser"
|
ref="browser"
|
||||||
:class="$style.browser"
|
class="browser"
|
||||||
:multiple="multiple"
|
:multiple="multiple"
|
||||||
@selected="onSelected"
|
@selected="onSelected"
|
||||||
@change-selection="onChangeSelection"
|
@change-selection="onChangeSelection"
|
||||||
/>
|
/>
|
||||||
<div :class="$style.footer">
|
<div class="footer">
|
||||||
<button :class="$style.upload" :title="$t('title')" @click="upload"><fa icon="upload"/></button>
|
<button class="upload" :title="$t('title')" @click="upload"><fa icon="upload"/></button>
|
||||||
<button :class="$style.cancel" @click="cancel">{{ $t('cancel') }}</button>
|
<ui-button inline @click="cancel" style="margin-right:16px;">{{ $t('cancel') }}</ui-button>
|
||||||
<button :class="$style.ok" :disabled="multiple && files.length == 0" @click="ok">{{ $t('ok') }}</button>
|
<ui-button inline primary :disabled="multiple && files.length == 0" @click="ok">{{ $t('ok') }}</ui-button>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</mk-window>
|
</mk-window>
|
||||||
</template>
|
</template>
|
||||||
@ -60,23 +62,31 @@ export default Vue.extend({
|
|||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="stylus" module>
|
<style lang="stylus" scoped>
|
||||||
.title
|
.jqiaciqv
|
||||||
|
.title
|
||||||
> [data-icon]
|
> [data-icon]
|
||||||
margin-right 4px
|
margin-right 4px
|
||||||
|
|
||||||
.count
|
.count
|
||||||
margin-left 8px
|
margin-left 8px
|
||||||
opacity 0.7
|
opacity 0.7
|
||||||
|
|
||||||
.browser
|
.rqsvbumu
|
||||||
height calc(100% - 72px)
|
display flex
|
||||||
|
flex-direction column
|
||||||
|
height 100%
|
||||||
|
|
||||||
.footer
|
.browser
|
||||||
height 72px
|
flex 1
|
||||||
background var(--primaryLighten95)
|
overflow auto
|
||||||
|
|
||||||
.upload
|
.footer
|
||||||
|
padding 16px
|
||||||
|
background var(--desktopPostFormBg)
|
||||||
|
text-align right
|
||||||
|
|
||||||
|
.upload
|
||||||
display inline-block
|
display inline-block
|
||||||
position absolute
|
position absolute
|
||||||
top 8px
|
top 8px
|
||||||
@ -115,65 +125,4 @@ export default Vue.extend({
|
|||||||
border 2px solid var(--primaryAlpha03)
|
border 2px solid var(--primaryAlpha03)
|
||||||
border-radius 8px
|
border-radius 8px
|
||||||
|
|
||||||
.ok
|
|
||||||
.cancel
|
|
||||||
display block
|
|
||||||
position absolute
|
|
||||||
bottom 16px
|
|
||||||
cursor pointer
|
|
||||||
padding 0
|
|
||||||
margin 0
|
|
||||||
width 120px
|
|
||||||
height 40px
|
|
||||||
font-size 1em
|
|
||||||
outline none
|
|
||||||
border-radius 4px
|
|
||||||
|
|
||||||
&:focus
|
|
||||||
&:after
|
|
||||||
content ""
|
|
||||||
pointer-events none
|
|
||||||
position absolute
|
|
||||||
top -5px
|
|
||||||
right -5px
|
|
||||||
bottom -5px
|
|
||||||
left -5px
|
|
||||||
border 2px solid var(--primaryAlpha03)
|
|
||||||
border-radius 8px
|
|
||||||
|
|
||||||
&:disabled
|
|
||||||
opacity 0.7
|
|
||||||
cursor default
|
|
||||||
|
|
||||||
.ok
|
|
||||||
right 16px
|
|
||||||
color var(--primaryForeground)
|
|
||||||
background linear-gradient(to bottom, var(--primaryLighten25) 0%, var(--primaryLighten10) 100%)
|
|
||||||
border solid 1px var(--primaryLighten15)
|
|
||||||
|
|
||||||
&:not(:disabled)
|
|
||||||
font-weight bold
|
|
||||||
|
|
||||||
&:hover:not(:disabled)
|
|
||||||
background linear-gradient(to bottom, var(--primaryLighten8) 0%, var(--primaryDarken8) 100%)
|
|
||||||
border-color var(--primary)
|
|
||||||
|
|
||||||
&:active:not(:disabled)
|
|
||||||
background var(--primary)
|
|
||||||
border-color var(--primary)
|
|
||||||
|
|
||||||
.cancel
|
|
||||||
right 148px
|
|
||||||
color #888
|
|
||||||
background linear-gradient(to bottom, #ffffff 0%, #f5f5f5 100%)
|
|
||||||
border solid 1px #e2e2e2
|
|
||||||
|
|
||||||
&:hover
|
|
||||||
background linear-gradient(to bottom, #f9f9f9 0%, #ececec 100%)
|
|
||||||
border-color #dcdcdc
|
|
||||||
|
|
||||||
&:active
|
|
||||||
background #ececec
|
|
||||||
border-color #dcdcdc
|
|
||||||
|
|
||||||
</style>
|
</style>
|
||||||
|
@ -1,17 +1,19 @@
|
|||||||
<template>
|
<template>
|
||||||
<mk-window ref="window" is-modal width="800px" height="500px" @closed="destroyDom">
|
<mk-window ref="window" is-modal width="800px" height="500px" @closed="destroyDom">
|
||||||
<span slot="header">
|
<span slot="header">
|
||||||
<span :class="$style.title">{{ $t('choose-prompt') }}</span>
|
<span>{{ $t('choose-prompt') }}</span>
|
||||||
</span>
|
</span>
|
||||||
|
|
||||||
|
<div class="hllkpxxu">
|
||||||
<x-drive
|
<x-drive
|
||||||
ref="browser"
|
ref="browser"
|
||||||
:class="$style.browser"
|
class="browser"
|
||||||
:multiple="false"
|
:multiple="false"
|
||||||
/>
|
/>
|
||||||
<div :class="$style.footer">
|
<div class="footer">
|
||||||
<button :class="$style.cancel" @click="cancel">{{ $t('cancel') }}</button>
|
<ui-button inline @click="cancel" style="margin-right:16px;">{{ $t('cancel') }}</ui-button>
|
||||||
<button :class="$style.ok" @click="ok">{{ $t('ok') }}</button>
|
<ui-button inline @click="ok" primary>{{ $t('ok') }}</ui-button>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</mk-window>
|
</mk-window>
|
||||||
</template>
|
</template>
|
||||||
@ -36,79 +38,19 @@ export default Vue.extend({
|
|||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="stylus" module>
|
<style lang="stylus" scoped>
|
||||||
|
.hllkpxxu
|
||||||
|
display flex
|
||||||
|
flex-direction column
|
||||||
|
height 100%
|
||||||
|
|
||||||
|
.browser
|
||||||
|
flex 1
|
||||||
|
overflow auto
|
||||||
|
|
||||||
.title
|
.footer
|
||||||
> [data-icon]
|
padding 16px
|
||||||
margin-right 4px
|
background var(--desktopPostFormBg)
|
||||||
|
text-align right
|
||||||
.browser
|
|
||||||
height calc(100% - 72px)
|
|
||||||
|
|
||||||
.footer
|
|
||||||
height 72px
|
|
||||||
background var(--primaryLighten95)
|
|
||||||
|
|
||||||
.ok
|
|
||||||
.cancel
|
|
||||||
display block
|
|
||||||
position absolute
|
|
||||||
bottom 16px
|
|
||||||
cursor pointer
|
|
||||||
padding 0
|
|
||||||
margin 0
|
|
||||||
width 120px
|
|
||||||
height 40px
|
|
||||||
font-size 1em
|
|
||||||
outline none
|
|
||||||
border-radius 4px
|
|
||||||
|
|
||||||
&:focus
|
|
||||||
&:after
|
|
||||||
content ""
|
|
||||||
pointer-events none
|
|
||||||
position absolute
|
|
||||||
top -5px
|
|
||||||
right -5px
|
|
||||||
bottom -5px
|
|
||||||
left -5px
|
|
||||||
border 2px solid var(--primaryAlpha03)
|
|
||||||
border-radius 8px
|
|
||||||
|
|
||||||
&:disabled
|
|
||||||
opacity 0.7
|
|
||||||
cursor default
|
|
||||||
|
|
||||||
.ok
|
|
||||||
right 16px
|
|
||||||
color var(--primaryForeground)
|
|
||||||
background linear-gradient(to bottom, var(--primaryLighten25) 0%, var(--primaryLighten10) 100%)
|
|
||||||
border solid 1px var(--primaryLighten15)
|
|
||||||
|
|
||||||
&:not(:disabled)
|
|
||||||
font-weight bold
|
|
||||||
|
|
||||||
&:hover:not(:disabled)
|
|
||||||
background linear-gradient(to bottom, var(--primaryLighten8) 0%, var(--primaryDarken8) 100%)
|
|
||||||
border-color var(--primary)
|
|
||||||
|
|
||||||
&:active:not(:disabled)
|
|
||||||
background var(--primary)
|
|
||||||
border-color var(--primary)
|
|
||||||
|
|
||||||
.cancel
|
|
||||||
right 148px
|
|
||||||
color #888
|
|
||||||
background linear-gradient(to bottom, #ffffff 0%, #f5f5f5 100%)
|
|
||||||
border solid 1px #e2e2e2
|
|
||||||
|
|
||||||
&:hover
|
|
||||||
background linear-gradient(to bottom, #f9f9f9 0%, #ececec 100%)
|
|
||||||
border-color #dcdcdc
|
|
||||||
|
|
||||||
&:active
|
|
||||||
background #ececec
|
|
||||||
border-color #dcdcdc
|
|
||||||
|
|
||||||
</style>
|
</style>
|
||||||
|
@ -66,6 +66,7 @@ import XFolder from './drive.folder.vue';
|
|||||||
import XFile from './drive.file.vue';
|
import XFile from './drive.file.vue';
|
||||||
import contains from '../../../common/scripts/contains';
|
import contains from '../../../common/scripts/contains';
|
||||||
import { url } from '../../../config';
|
import { url } from '../../../config';
|
||||||
|
import { faCloudUploadAlt } from '@fortawesome/free-solid-svg-icons';
|
||||||
|
|
||||||
export default Vue.extend({
|
export default Vue.extend({
|
||||||
i18n: i18n('desktop/views/components/drive.vue'),
|
i18n: i18n('desktop/views/components/drive.vue'),
|
||||||
@ -149,7 +150,7 @@ export default Vue.extend({
|
|||||||
}, {
|
}, {
|
||||||
type: 'item',
|
type: 'item',
|
||||||
text: this.$t('contextmenu.url-upload'),
|
text: this.$t('contextmenu.url-upload'),
|
||||||
icon: 'cloud-upload-alt',
|
icon: faCloudUploadAlt,
|
||||||
action: this.urlUpload
|
action: this.urlUpload
|
||||||
}]);
|
}]);
|
||||||
},
|
},
|
||||||
|
@ -23,8 +23,8 @@ export default Vue.extend({
|
|||||||
computed: {
|
computed: {
|
||||||
popout(): string {
|
popout(): string {
|
||||||
return this.game
|
return this.game
|
||||||
? `${url}/reversi/${this.game.id}`
|
? `${url}/games/reversi/${this.game.id}`
|
||||||
: `${url}/reversi`;
|
: `${url}/games/reversi`;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
@ -9,7 +9,6 @@ import subNoteContent from './sub-note-content.vue';
|
|||||||
import window from './window.vue';
|
import window from './window.vue';
|
||||||
import noteFormWindow from './post-form-window.vue';
|
import noteFormWindow from './post-form-window.vue';
|
||||||
import renoteFormWindow from './renote-form-window.vue';
|
import renoteFormWindow from './renote-form-window.vue';
|
||||||
import mediaImage from './media-image.vue';
|
|
||||||
import mediaVideo from './media-video.vue';
|
import mediaVideo from './media-video.vue';
|
||||||
import notifications from './notifications.vue';
|
import notifications from './notifications.vue';
|
||||||
import noteForm from './post-form.vue';
|
import noteForm from './post-form.vue';
|
||||||
@ -32,7 +31,6 @@ Vue.component('mk-sub-note-content', subNoteContent);
|
|||||||
Vue.component('mk-window', window);
|
Vue.component('mk-window', window);
|
||||||
Vue.component('mk-post-form-window', noteFormWindow);
|
Vue.component('mk-post-form-window', noteFormWindow);
|
||||||
Vue.component('mk-renote-form-window', renoteFormWindow);
|
Vue.component('mk-renote-form-window', renoteFormWindow);
|
||||||
Vue.component('mk-media-image', mediaImage);
|
|
||||||
Vue.component('mk-media-video', mediaVideo);
|
Vue.component('mk-media-video', mediaVideo);
|
||||||
Vue.component('mk-notifications', notifications);
|
Vue.component('mk-notifications', notifications);
|
||||||
Vue.component('mk-post-form', noteForm);
|
Vue.component('mk-post-form', noteForm);
|
||||||
|
@ -1,81 +0,0 @@
|
|||||||
<template>
|
|
||||||
<div class="ldwbgwstjsdgcjruamauqdrffetqudry" v-if="image.isSensitive && hide && !$store.state.device.alwaysShowNsfw" @click="hide = false">
|
|
||||||
<div>
|
|
||||||
<b><fa icon="exclamation-triangle"/> {{ $t('sensitive') }}</b>
|
|
||||||
<span>{{ $t('click-to-show') }}</span>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<a class="lcjomzwbohoelkxsnuqjiaccdbdfiazy" v-else
|
|
||||||
:href="image.url"
|
|
||||||
@click.prevent="onClick"
|
|
||||||
:style="style"
|
|
||||||
:title="image.name"
|
|
||||||
></a>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script lang="ts">
|
|
||||||
import Vue from 'vue';
|
|
||||||
import i18n from '../../../i18n';
|
|
||||||
import ImageViewer from '../../../common/views/components/image-viewer.vue';
|
|
||||||
|
|
||||||
export default Vue.extend({
|
|
||||||
i18n: i18n('desktop/views/components/media-image.vue'),
|
|
||||||
props: {
|
|
||||||
image: {
|
|
||||||
type: Object,
|
|
||||||
required: true
|
|
||||||
},
|
|
||||||
raw: {
|
|
||||||
default: false
|
|
||||||
}
|
|
||||||
},
|
|
||||||
data() {
|
|
||||||
return {
|
|
||||||
hide: true
|
|
||||||
};
|
|
||||||
},
|
|
||||||
computed: {
|
|
||||||
style(): any {
|
|
||||||
return {
|
|
||||||
'background-color': this.image.properties.avgColor && this.image.properties.avgColor.length == 3 ? `rgb(${this.image.properties.avgColor.join(',')})` : 'transparent',
|
|
||||||
'background-image': this.raw ? `url(${this.image.url})` : `url(${this.image.thumbnailUrl})`
|
|
||||||
};
|
|
||||||
}
|
|
||||||
},
|
|
||||||
methods: {
|
|
||||||
onClick() {
|
|
||||||
this.$root.new(ImageViewer, {
|
|
||||||
image: this.image
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<style lang="stylus" scoped>
|
|
||||||
.lcjomzwbohoelkxsnuqjiaccdbdfiazy
|
|
||||||
display block
|
|
||||||
cursor zoom-in
|
|
||||||
overflow hidden
|
|
||||||
width 100%
|
|
||||||
height 100%
|
|
||||||
background-position center
|
|
||||||
background-size contain
|
|
||||||
background-repeat no-repeat
|
|
||||||
|
|
||||||
.ldwbgwstjsdgcjruamauqdrffetqudry
|
|
||||||
display flex
|
|
||||||
justify-content center
|
|
||||||
align-items center
|
|
||||||
background #111
|
|
||||||
color #fff
|
|
||||||
|
|
||||||
> div
|
|
||||||
display table-cell
|
|
||||||
text-align center
|
|
||||||
font-size 12px
|
|
||||||
|
|
||||||
> *
|
|
||||||
display block
|
|
||||||
|
|
||||||
</style>
|
|
@ -68,7 +68,7 @@ import insertTextAtCursor from 'insert-text-at-cursor';
|
|||||||
import * as XDraggable from 'vuedraggable';
|
import * as XDraggable from 'vuedraggable';
|
||||||
import getFace from '../../../common/scripts/get-face';
|
import getFace from '../../../common/scripts/get-face';
|
||||||
import MkVisibilityChooser from '../../../common/views/components/visibility-chooser.vue';
|
import MkVisibilityChooser from '../../../common/views/components/visibility-chooser.vue';
|
||||||
import parse from '../../../../../mfm/parse';
|
import { parse } from '../../../../../mfm/parse';
|
||||||
import { host } from '../../../config';
|
import { host } from '../../../config';
|
||||||
import { erase, unique } from '../../../../../prelude/array';
|
import { erase, unique } from '../../../../../prelude/array';
|
||||||
import { length } from 'stringz';
|
import { length } from 'stringz';
|
||||||
@ -222,6 +222,12 @@ export default Vue.extend({
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// keep cw when reply
|
||||||
|
if (this.$store.state.settings.keepCw && this.reply && this.reply.cw) {
|
||||||
|
this.useCw = true;
|
||||||
|
this.cw = this.reply.cw;
|
||||||
|
}
|
||||||
|
|
||||||
this.$nextTick(() => {
|
this.$nextTick(() => {
|
||||||
// 書きかけの投稿を復元
|
// 書きかけの投稿を復元
|
||||||
if (!this.instant && !this.mention) {
|
if (!this.instant && !this.mention) {
|
||||||
|
@ -31,7 +31,12 @@
|
|||||||
<ui-switch v-model="autoPopout">{{ $t('auto-popout') }}
|
<ui-switch v-model="autoPopout">{{ $t('auto-popout') }}
|
||||||
<span slot="desc">{{ $t('auto-popout-desc') }}</span>
|
<span slot="desc">{{ $t('auto-popout-desc') }}</span>
|
||||||
</ui-switch>
|
</ui-switch>
|
||||||
<ui-switch v-model="deckNav">{{ $t('deck-nav') }}<span slot="desc">{{ $t('deck-nav-desc') }}</span></ui-switch>
|
<ui-switch v-model="deckNav">{{ $t('deck-nav') }}
|
||||||
|
<span slot="desc">{{ $t('deck-nav-desc') }}</span>
|
||||||
|
</ui-switch>
|
||||||
|
<ui-switch v-model="keepCw">{{ $t('keep-cw') }}
|
||||||
|
<span slot="desc">{{ $t('keep-cw-desc') }}</span>
|
||||||
|
</ui-switch>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
<section>
|
<section>
|
||||||
@ -336,6 +341,11 @@ export default Vue.extend({
|
|||||||
set(value) { this.$store.commit('settings/set', { key: 'deckNav', value }); }
|
set(value) { this.$store.commit('settings/set', { key: 'deckNav', value }); }
|
||||||
},
|
},
|
||||||
|
|
||||||
|
keepCw: {
|
||||||
|
get() { return this.$store.state.settings.keepCw; },
|
||||||
|
set(value) { this.$store.commit('settings/set', { key: 'keepCw', value }); }
|
||||||
|
},
|
||||||
|
|
||||||
darkmode: {
|
darkmode: {
|
||||||
get() { return this.$store.state.device.darkmode; },
|
get() { return this.$store.state.device.darkmode; },
|
||||||
set(value) { this.$store.commit('device/set', { key: 'darkmode', value }); }
|
set(value) { this.$store.commit('device/set', { key: 'darkmode', value }); }
|
||||||
|
@ -19,10 +19,10 @@ export default Vue.extend({
|
|||||||
methods: {
|
methods: {
|
||||||
nav(game, actualNav) {
|
nav(game, actualNav) {
|
||||||
if (actualNav) {
|
if (actualNav) {
|
||||||
this.$router.push(`/reversi/${game.id}`);
|
this.$router.push(`/games/reversi/${game.id}`);
|
||||||
} else {
|
} else {
|
||||||
// TODO: https://github.com/vuejs/vue-router/issues/703
|
// TODO: https://github.com/vuejs/vue-router/issues/703
|
||||||
this.$router.push(`/reversi/${game.id}`);
|
this.$router.push(`/games/reversi/${game.id}`);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -9,7 +9,6 @@
|
|||||||
<router-link class="name" :to="friend | userPage" v-user-preview="friend.id">{{ friend.name }}</router-link>
|
<router-link class="name" :to="friend | userPage" v-user-preview="friend.id">{{ friend.name }}</router-link>
|
||||||
<p class="username">@{{ friend | acct }}</p>
|
<p class="username">@{{ friend | acct }}</p>
|
||||||
</div>
|
</div>
|
||||||
<mk-follow-button class="follow-button" :user="friend"/>
|
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
<p class="empty" v-if="!fetching && users.length == 0">{{ $t('no-users') }}</p>
|
<p class="empty" v-if="!fetching && users.length == 0">{{ $t('no-users') }}</p>
|
||||||
@ -110,9 +109,4 @@ export default Vue.extend({
|
|||||||
color var(--text)
|
color var(--text)
|
||||||
opacity 0.7
|
opacity 0.7
|
||||||
|
|
||||||
> .follow-button
|
|
||||||
position absolute
|
|
||||||
top 16px
|
|
||||||
right 16px
|
|
||||||
|
|
||||||
</style>
|
</style>
|
||||||
|
@ -50,8 +50,7 @@ export default Vue.extend({
|
|||||||
text-align center
|
text-align center
|
||||||
line-height 24px
|
line-height 24px
|
||||||
font-size 0.8em
|
font-size 0.8em
|
||||||
color #71afc7
|
color var(--text)
|
||||||
background #eefaff
|
|
||||||
border-radius 4px
|
border-radius 4px
|
||||||
|
|
||||||
> .action-form
|
> .action-form
|
||||||
|
@ -179,6 +179,7 @@ export default define({
|
|||||||
this.$root.api('notes/create', {
|
this.$root.api('notes/create', {
|
||||||
text: this.text == '' ? undefined : this.text,
|
text: this.text == '' ? undefined : this.text,
|
||||||
fileIds: this.files.length > 0 ? this.files.map(f => f.id) : undefined,
|
fileIds: this.files.length > 0 ? this.files.map(f => f.id) : undefined,
|
||||||
|
visibility: this.$store.state.settings.defaultNoteVisibility
|
||||||
}).then(data => {
|
}).then(data => {
|
||||||
this.clear();
|
this.clear();
|
||||||
}).catch(err => {
|
}).catch(err => {
|
||||||
|
@ -124,7 +124,6 @@ import {
|
|||||||
faMapMarker,
|
faMapMarker,
|
||||||
faRobot,
|
faRobot,
|
||||||
faHourglassHalf,
|
faHourglassHalf,
|
||||||
faAlignLeft,
|
|
||||||
faGavel
|
faGavel
|
||||||
} from '@fortawesome/free-solid-svg-icons';
|
} from '@fortawesome/free-solid-svg-icons';
|
||||||
|
|
||||||
@ -257,7 +256,6 @@ library.add(
|
|||||||
faMapMarker,
|
faMapMarker,
|
||||||
faRobot,
|
faRobot,
|
||||||
faHourglassHalf,
|
faHourglassHalf,
|
||||||
faAlignLeft,
|
|
||||||
faGavel,
|
faGavel,
|
||||||
|
|
||||||
farBell,
|
farBell,
|
||||||
@ -389,6 +387,18 @@ export default (callback: (launch: (router: VueRouter) => [Vue, MiOS]) => void,
|
|||||||
});
|
});
|
||||||
//#endregion
|
//#endregion
|
||||||
|
|
||||||
|
// Reapply current theme
|
||||||
|
try {
|
||||||
|
const themeName = os.store.state.device.darkmode ? os.store.state.device.darkTheme : os.store.state.device.lightTheme;
|
||||||
|
const themes = os.store.state.device.themes.concat(builtinThemes);
|
||||||
|
const theme = themes.find(t => t.id == themeName);
|
||||||
|
if (theme) {
|
||||||
|
applyTheme(theme);
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
console.log(`Cannot reapply theme. ${e}`);
|
||||||
|
}
|
||||||
|
|
||||||
//#region shadow
|
//#region shadow
|
||||||
const shadow = '0 3px 8px rgba(0, 0, 0, 0.2)';
|
const shadow = '0 3px 8px rgba(0, 0, 0, 0.2)';
|
||||||
const shadowRight = '4px 0 4px rgba(0, 0, 0, 0.1)';
|
const shadowRight = '4px 0 4px rgba(0, 0, 0, 0.1)';
|
||||||
|
@ -3,7 +3,6 @@ import Vue from 'vue';
|
|||||||
import ui from './ui.vue';
|
import ui from './ui.vue';
|
||||||
import note from './note.vue';
|
import note from './note.vue';
|
||||||
import notes from './notes.vue';
|
import notes from './notes.vue';
|
||||||
import mediaImage from './media-image.vue';
|
|
||||||
import mediaVideo from './media-video.vue';
|
import mediaVideo from './media-video.vue';
|
||||||
import notePreview from './note-preview.vue';
|
import notePreview from './note-preview.vue';
|
||||||
import subNoteContent from './sub-note-content.vue';
|
import subNoteContent from './sub-note-content.vue';
|
||||||
@ -24,7 +23,6 @@ import postForm from './post-form.vue';
|
|||||||
Vue.component('mk-ui', ui);
|
Vue.component('mk-ui', ui);
|
||||||
Vue.component('mk-note', note);
|
Vue.component('mk-note', note);
|
||||||
Vue.component('mk-notes', notes);
|
Vue.component('mk-notes', notes);
|
||||||
Vue.component('mk-media-image', mediaImage);
|
|
||||||
Vue.component('mk-media-video', mediaVideo);
|
Vue.component('mk-media-video', mediaVideo);
|
||||||
Vue.component('mk-note-preview', notePreview);
|
Vue.component('mk-note-preview', notePreview);
|
||||||
Vue.component('mk-sub-note-content', subNoteContent);
|
Vue.component('mk-sub-note-content', subNoteContent);
|
||||||
|
@ -60,7 +60,7 @@ import insertTextAtCursor from 'insert-text-at-cursor';
|
|||||||
import * as XDraggable from 'vuedraggable';
|
import * as XDraggable from 'vuedraggable';
|
||||||
import MkVisibilityChooser from '../../../common/views/components/visibility-chooser.vue';
|
import MkVisibilityChooser from '../../../common/views/components/visibility-chooser.vue';
|
||||||
import getFace from '../../../common/scripts/get-face';
|
import getFace from '../../../common/scripts/get-face';
|
||||||
import parse from '../../../../../mfm/parse';
|
import { parse } from '../../../../../mfm/parse';
|
||||||
import { host } from '../../../config';
|
import { host } from '../../../config';
|
||||||
import { erase, unique } from '../../../../../prelude/array';
|
import { erase, unique } from '../../../../../prelude/array';
|
||||||
import { length } from 'stringz';
|
import { length } from 'stringz';
|
||||||
@ -70,8 +70,7 @@ import extractMentions from '../../../../../misc/extract-mentions';
|
|||||||
export default Vue.extend({
|
export default Vue.extend({
|
||||||
i18n: i18n('mobile/views/components/post-form.vue'),
|
i18n: i18n('mobile/views/components/post-form.vue'),
|
||||||
components: {
|
components: {
|
||||||
XDraggable,
|
XDraggable
|
||||||
MkVisibilityChooser
|
|
||||||
},
|
},
|
||||||
|
|
||||||
props: {
|
props: {
|
||||||
@ -211,6 +210,12 @@ export default Vue.extend({
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// keep cw when reply
|
||||||
|
if (this.$store.state.settings.keepCw && this.reply && this.reply.cw) {
|
||||||
|
this.useCw = true;
|
||||||
|
this.cw = this.reply.cw;
|
||||||
|
}
|
||||||
|
|
||||||
this.focus();
|
this.focus();
|
||||||
|
|
||||||
this.$nextTick(() => {
|
this.$nextTick(() => {
|
||||||
|
@ -20,10 +20,10 @@ export default Vue.extend({
|
|||||||
methods: {
|
methods: {
|
||||||
nav(game, actualNav) {
|
nav(game, actualNav) {
|
||||||
if (actualNav) {
|
if (actualNav) {
|
||||||
this.$router.push(`/reversi/${game.id}`);
|
this.$router.push(`/games/reversi/${game.id}`);
|
||||||
} else {
|
} else {
|
||||||
// TODO: https://github.com/vuejs/vue-router/issues/703
|
// TODO: https://github.com/vuejs/vue-router/issues/703
|
||||||
this.$router.push(`/reversi/${game.id}`);
|
this.$router.push(`/games/reversi/${game.id}`);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -66,6 +66,7 @@
|
|||||||
|
|
||||||
<section>
|
<section>
|
||||||
<ui-switch v-model="fetchOnScroll">{{ $t('fetch-on-scroll') }}</ui-switch>
|
<ui-switch v-model="fetchOnScroll">{{ $t('fetch-on-scroll') }}</ui-switch>
|
||||||
|
<ui-switch v-model="keepCw">{{ $t('keep-cw') }}</ui-switch>
|
||||||
<ui-switch v-model="disableViaMobile">{{ $t('disable-via-mobile') }}</ui-switch>
|
<ui-switch v-model="disableViaMobile">{{ $t('disable-via-mobile') }}</ui-switch>
|
||||||
<ui-switch v-model="loadRawImages">{{ $t('load-raw-images') }}</ui-switch>
|
<ui-switch v-model="loadRawImages">{{ $t('load-raw-images') }}</ui-switch>
|
||||||
<ui-switch v-model="loadRemoteMedia">{{ $t('load-remote-media') }}</ui-switch>
|
<ui-switch v-model="loadRemoteMedia">{{ $t('load-remote-media') }}</ui-switch>
|
||||||
@ -247,6 +248,11 @@ export default Vue.extend({
|
|||||||
set(value) { this.$store.dispatch('settings/set', { key: 'fetchOnScroll', value }); }
|
set(value) { this.$store.dispatch('settings/set', { key: 'fetchOnScroll', value }); }
|
||||||
},
|
},
|
||||||
|
|
||||||
|
keepCw: {
|
||||||
|
get() { return this.$store.state.settings.keepCw; },
|
||||||
|
set(value) { this.$store.dispatch('settings/set', { key: 'keepCw', value }); }
|
||||||
|
},
|
||||||
|
|
||||||
rememberNoteVisibility: {
|
rememberNoteVisibility: {
|
||||||
get() { return this.$store.state.settings.rememberNoteVisibility; },
|
get() { return this.$store.state.settings.rememberNoteVisibility; },
|
||||||
set(value) { this.$store.dispatch('settings/set', { key: 'rememberNoteVisibility', value }); }
|
set(value) { this.$store.dispatch('settings/set', { key: 'rememberNoteVisibility', value }); }
|
||||||
|
@ -12,6 +12,7 @@ const defaultSettings = {
|
|||||||
mobileHome: [],
|
mobileHome: [],
|
||||||
deck: null,
|
deck: null,
|
||||||
deckNav: true,
|
deckNav: true,
|
||||||
|
keepCw: false,
|
||||||
tagTimelines: [],
|
tagTimelines: [],
|
||||||
fetchOnScroll: true,
|
fetchOnScroll: true,
|
||||||
showMaps: true,
|
showMaps: true,
|
||||||
|
@ -41,7 +41,7 @@
|
|||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import Vue from 'vue';
|
import Vue from 'vue';
|
||||||
import parse from '../../../../mfm/parse';
|
import { parse } from '../../../../mfm/parse';
|
||||||
import * as JSON5 from 'json5';
|
import * as JSON5 from 'json5';
|
||||||
|
|
||||||
export default Vue.extend({
|
export default Vue.extend({
|
||||||
|
@ -7,7 +7,7 @@ import { URL } from 'url';
|
|||||||
import * as yaml from 'js-yaml';
|
import * as yaml from 'js-yaml';
|
||||||
import { Source, Mixin } from './types';
|
import { Source, Mixin } from './types';
|
||||||
import isUrl = require('is-url');
|
import isUrl = require('is-url');
|
||||||
const pkg = require('../../package.json');
|
import * as pkg from '../../package.json';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Path of configuration directory
|
* Path of configuration directory
|
||||||
|
@ -3,6 +3,8 @@
|
|||||||
|
|
||||||
html
|
html
|
||||||
--primary #fb4e4e
|
--primary #fb4e4e
|
||||||
|
--link #fb4e4e
|
||||||
|
--linkTapHighlight #fb4e4eb3
|
||||||
|
|
||||||
body
|
body
|
||||||
margin 0
|
margin 0
|
||||||
|
@ -100,20 +100,6 @@ export default class Reversi {
|
|||||||
return count(WHITE, this.board);
|
return count(WHITE, this.board);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* 黒石の比率
|
|
||||||
*/
|
|
||||||
public get blackP() {
|
|
||||||
return this.blackCount == 0 && this.whiteCount == 0 ? 0 : this.blackCount / (this.blackCount + this.whiteCount);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 白石の比率
|
|
||||||
*/
|
|
||||||
public get whiteP() {
|
|
||||||
return this.blackCount == 0 && this.whiteCount == 0 ? 0 : this.whiteCount / (this.blackCount + this.whiteCount);
|
|
||||||
}
|
|
||||||
|
|
||||||
public transformPosToXy(pos: number): number[] {
|
public transformPosToXy(pos: number): number[] {
|
||||||
const x = pos % this.mapWidth;
|
const x = pos % this.mapWidth;
|
||||||
const y = Math.floor(pos / this.mapWidth);
|
const y = Math.floor(pos / this.mapWidth);
|
||||||
|
@ -11,7 +11,7 @@ import * as cluster from 'cluster';
|
|||||||
import * as debug from 'debug';
|
import * as debug from 'debug';
|
||||||
import chalk from 'chalk';
|
import chalk from 'chalk';
|
||||||
import * as portscanner from 'portscanner';
|
import * as portscanner from 'portscanner';
|
||||||
import isRoot = require('is-root');
|
import * as isRoot from 'is-root';
|
||||||
import Xev from 'xev';
|
import Xev from 'xev';
|
||||||
import * as program from 'commander';
|
import * as program from 'commander';
|
||||||
import * as sysUtils from 'systeminformation';
|
import * as sysUtils from 'systeminformation';
|
||||||
@ -23,6 +23,7 @@ import notesStats from './daemons/notes-stats';
|
|||||||
import loadConfig from './config/load';
|
import loadConfig from './config/load';
|
||||||
import { Config } from './config/types';
|
import { Config } from './config/types';
|
||||||
import { lessThan } from './prelude/array';
|
import { lessThan } from './prelude/array';
|
||||||
|
import * as pkg from '../package.json';
|
||||||
|
|
||||||
const clusterLog = debug('misskey:cluster');
|
const clusterLog = debug('misskey:cluster');
|
||||||
const ev = new Xev();
|
const ev = new Xev();
|
||||||
@ -31,8 +32,6 @@ if (process.env.NODE_ENV != 'production' && process.env.DEBUG == null) {
|
|||||||
debug.enable('misskey');
|
debug.enable('misskey');
|
||||||
}
|
}
|
||||||
|
|
||||||
const pkg = require('../package.json');
|
|
||||||
|
|
||||||
//#region Command line argument definitions
|
//#region Command line argument definitions
|
||||||
program
|
program
|
||||||
.version(pkg.version)
|
.version(pkg.version)
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
const parse5 = require('parse5');
|
const parse5 = require('parse5');
|
||||||
import { URL } from 'url';
|
import { URL } from 'url';
|
||||||
|
|
||||||
export default function(html: string): string {
|
export function fromHtml(html: string): string {
|
||||||
if (html == null) return null;
|
if (html == null) return null;
|
||||||
|
|
||||||
const dom = parse5.parseFragment(html);
|
const dom = parse5.parseFragment(html);
|
File diff suppressed because one or more lines are too long
31
src/mfm/normalize.ts
Normal file
31
src/mfm/normalize.ts
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
import * as A from '../prelude/array';
|
||||||
|
import * as S from '../prelude/string';
|
||||||
|
import { MfmForest, MfmTree } from './types';
|
||||||
|
import { createTree, createLeaf } from '../prelude/tree';
|
||||||
|
|
||||||
|
function isEmptyTextTree(t: MfmTree): boolean {
|
||||||
|
return t.node.type == 'text' && t.node.props.text === '';
|
||||||
|
}
|
||||||
|
|
||||||
|
function concatTextTrees(ts: MfmForest): MfmTree {
|
||||||
|
return createLeaf({ type: 'text', props: { text: S.concat(ts.map(x => x.node.props.text)) } });
|
||||||
|
}
|
||||||
|
|
||||||
|
function concatIfTextTrees(ts: MfmForest): MfmForest {
|
||||||
|
return ts[0].node.type === 'text' ? [concatTextTrees(ts)] : ts;
|
||||||
|
}
|
||||||
|
|
||||||
|
function concatConsecutiveTextTrees(ts: MfmForest): MfmForest {
|
||||||
|
const us = A.concat(A.groupOn(t => t.node.type, ts).map(concatIfTextTrees));
|
||||||
|
return us.map(t => createTree(t.node, concatConsecutiveTextTrees(t.children)));
|
||||||
|
}
|
||||||
|
|
||||||
|
function removeEmptyTextNodes(ts: MfmForest): MfmForest {
|
||||||
|
return ts
|
||||||
|
.filter(t => !isEmptyTextTree(t))
|
||||||
|
.map(t => createTree(t.node, removeEmptyTextNodes(t.children)));
|
||||||
|
}
|
||||||
|
|
||||||
|
export function normalize(ts: MfmForest): MfmForest {
|
||||||
|
return removeEmptyTextNodes(concatConsecutiveTextTrees(ts));
|
||||||
|
}
|
@ -1,36 +1,19 @@
|
|||||||
import parser, { plainParser, MfmForest, MfmTree } from './parser';
|
import { mfmLanguage } from './language';
|
||||||
import * as A from '../prelude/array';
|
import { MfmForest } from './types';
|
||||||
import * as S from '../prelude/string';
|
import { normalize } from './normalize';
|
||||||
import { createTree, createLeaf } from '../prelude/tree';
|
|
||||||
|
|
||||||
function concatTextTrees(ts: MfmForest): MfmTree {
|
export function parse(source: string): MfmForest {
|
||||||
return createLeaf({ type: 'text', props: { text: S.concat(ts.map(x => x.node.props.text)) } });
|
|
||||||
}
|
|
||||||
|
|
||||||
function concatIfTextTrees(ts: MfmForest): MfmForest {
|
|
||||||
return ts[0].node.type === 'text' ? [concatTextTrees(ts)] : ts;
|
|
||||||
}
|
|
||||||
|
|
||||||
function concatConsecutiveTextTrees(ts: MfmForest): MfmForest {
|
|
||||||
const us = A.concat(A.groupOn(t => t.node.type, ts).map(concatIfTextTrees));
|
|
||||||
return us.map(t => createTree(t.node, concatConsecutiveTextTrees(t.children)));
|
|
||||||
}
|
|
||||||
|
|
||||||
function isEmptyTextTree(t: MfmTree): boolean {
|
|
||||||
return t.node.type == 'text' && t.node.props.text === '';
|
|
||||||
}
|
|
||||||
|
|
||||||
function removeEmptyTextNodes(ts: MfmForest): MfmForest {
|
|
||||||
return ts
|
|
||||||
.filter(t => !isEmptyTextTree(t))
|
|
||||||
.map(t => createTree(t.node, removeEmptyTextNodes(t.children)));
|
|
||||||
}
|
|
||||||
|
|
||||||
export default (source: string, plainText = false): MfmForest => {
|
|
||||||
if (source == null || source == '') {
|
if (source == null || source == '') {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
const raw = plainText ? plainParser.root.tryParse(source) : parser.root.tryParse(source) as MfmForest;
|
return normalize(mfmLanguage.root.tryParse(source));
|
||||||
return removeEmptyTextNodes(concatConsecutiveTextTrees(raw));
|
}
|
||||||
};
|
|
||||||
|
export function parsePlain(source: string): MfmForest {
|
||||||
|
if (source == null || source == '') {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return normalize(mfmLanguage.plain.tryParse(source));
|
||||||
|
}
|
||||||
|
@ -1,343 +0,0 @@
|
|||||||
import { capitalize, toUpperCase } from '../prelude/string';
|
|
||||||
|
|
||||||
function escape(text: string) {
|
|
||||||
return text
|
|
||||||
.replace(/>/g, '>')
|
|
||||||
.replace(/</g, '<');
|
|
||||||
}
|
|
||||||
|
|
||||||
// 文字数が多い順にソートします
|
|
||||||
// そうしないと、「function」という文字列が与えられたときに「func」が先にマッチしてしまう可能性があるためです
|
|
||||||
const _keywords = [
|
|
||||||
'true',
|
|
||||||
'false',
|
|
||||||
'null',
|
|
||||||
'nil',
|
|
||||||
'undefined',
|
|
||||||
'void',
|
|
||||||
'var',
|
|
||||||
'const',
|
|
||||||
'let',
|
|
||||||
'mut',
|
|
||||||
'dim',
|
|
||||||
'if',
|
|
||||||
'then',
|
|
||||||
'else',
|
|
||||||
'switch',
|
|
||||||
'match',
|
|
||||||
'case',
|
|
||||||
'default',
|
|
||||||
'for',
|
|
||||||
'each',
|
|
||||||
'in',
|
|
||||||
'while',
|
|
||||||
'loop',
|
|
||||||
'continue',
|
|
||||||
'break',
|
|
||||||
'do',
|
|
||||||
'goto',
|
|
||||||
'next',
|
|
||||||
'end',
|
|
||||||
'sub',
|
|
||||||
'throw',
|
|
||||||
'try',
|
|
||||||
'catch',
|
|
||||||
'finally',
|
|
||||||
'enum',
|
|
||||||
'delegate',
|
|
||||||
'function',
|
|
||||||
'func',
|
|
||||||
'fun',
|
|
||||||
'fn',
|
|
||||||
'return',
|
|
||||||
'yield',
|
|
||||||
'async',
|
|
||||||
'await',
|
|
||||||
'require',
|
|
||||||
'include',
|
|
||||||
'import',
|
|
||||||
'imports',
|
|
||||||
'export',
|
|
||||||
'exports',
|
|
||||||
'from',
|
|
||||||
'as',
|
|
||||||
'using',
|
|
||||||
'use',
|
|
||||||
'internal',
|
|
||||||
'module',
|
|
||||||
'namespace',
|
|
||||||
'where',
|
|
||||||
'select',
|
|
||||||
'struct',
|
|
||||||
'union',
|
|
||||||
'new',
|
|
||||||
'delete',
|
|
||||||
'this',
|
|
||||||
'super',
|
|
||||||
'base',
|
|
||||||
'class',
|
|
||||||
'interface',
|
|
||||||
'abstract',
|
|
||||||
'static',
|
|
||||||
'public',
|
|
||||||
'private',
|
|
||||||
'protected',
|
|
||||||
'virtual',
|
|
||||||
'partial',
|
|
||||||
'override',
|
|
||||||
'extends',
|
|
||||||
'implements',
|
|
||||||
'constructor'
|
|
||||||
];
|
|
||||||
|
|
||||||
const keywords = _keywords
|
|
||||||
.concat(_keywords.map(capitalize))
|
|
||||||
.concat(_keywords.map(toUpperCase))
|
|
||||||
.sort((a, b) => b.length - a.length);
|
|
||||||
|
|
||||||
const symbols = [
|
|
||||||
'=',
|
|
||||||
'+',
|
|
||||||
'-',
|
|
||||||
'*',
|
|
||||||
'/',
|
|
||||||
'%',
|
|
||||||
'~',
|
|
||||||
'^',
|
|
||||||
'&',
|
|
||||||
'|',
|
|
||||||
'>',
|
|
||||||
'<',
|
|
||||||
'!',
|
|
||||||
'?'
|
|
||||||
];
|
|
||||||
|
|
||||||
type Token = {
|
|
||||||
html: string
|
|
||||||
next: number
|
|
||||||
};
|
|
||||||
|
|
||||||
type Element = (code: string, i: number, source: string) => (Token | null);
|
|
||||||
|
|
||||||
const elements: Element[] = [
|
|
||||||
// comment
|
|
||||||
code => {
|
|
||||||
if (code.substr(0, 2) != '//') return null;
|
|
||||||
const match = code.match(/^\/\/(.+?)(\n|$)/);
|
|
||||||
if (!match) return null;
|
|
||||||
const comment = match[0];
|
|
||||||
return {
|
|
||||||
html: `<span class="comment">${escape(comment)}</span>`,
|
|
||||||
next: comment.length
|
|
||||||
};
|
|
||||||
},
|
|
||||||
|
|
||||||
// block comment
|
|
||||||
code => {
|
|
||||||
const match = code.match(/^\/\*([\s\S]+?)\*\//);
|
|
||||||
if (!match) return null;
|
|
||||||
return {
|
|
||||||
html: `<span class="comment">${escape(match[0])}</span>`,
|
|
||||||
next: match[0].length
|
|
||||||
};
|
|
||||||
},
|
|
||||||
|
|
||||||
// string
|
|
||||||
code => {
|
|
||||||
if (!/^['"`]/.test(code)) return null;
|
|
||||||
const begin = code[0];
|
|
||||||
let str = begin;
|
|
||||||
let thisIsNotAString = false;
|
|
||||||
for (let i = 1; i < code.length; i++) {
|
|
||||||
const char = code[i];
|
|
||||||
if (char == '\\') {
|
|
||||||
str += char;
|
|
||||||
str += code[i + 1] || '';
|
|
||||||
i++;
|
|
||||||
continue;
|
|
||||||
} else if (char == begin) {
|
|
||||||
str += char;
|
|
||||||
break;
|
|
||||||
} else if (char == '\n' || i == (code.length - 1)) {
|
|
||||||
thisIsNotAString = true;
|
|
||||||
break;
|
|
||||||
} else {
|
|
||||||
str += char;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (thisIsNotAString) {
|
|
||||||
return null;
|
|
||||||
} else {
|
|
||||||
return {
|
|
||||||
html: `<span class="string">${escape(str)}</span>`,
|
|
||||||
next: str.length
|
|
||||||
};
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
// regexp
|
|
||||||
code => {
|
|
||||||
if (code[0] != '/') return null;
|
|
||||||
let regexp = '';
|
|
||||||
let thisIsNotARegexp = false;
|
|
||||||
for (let i = 1; i < code.length; i++) {
|
|
||||||
const char = code[i];
|
|
||||||
if (char == '\\') {
|
|
||||||
regexp += char;
|
|
||||||
regexp += code[i + 1] || '';
|
|
||||||
i++;
|
|
||||||
continue;
|
|
||||||
} else if (char == '/') {
|
|
||||||
break;
|
|
||||||
} else if (char == '\n' || i == (code.length - 1)) {
|
|
||||||
thisIsNotARegexp = true;
|
|
||||||
break;
|
|
||||||
} else {
|
|
||||||
regexp += char;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (thisIsNotARegexp) return null;
|
|
||||||
if (regexp == '') return null;
|
|
||||||
if (regexp.startsWith(' ') && regexp.endsWith(' ')) return null;
|
|
||||||
|
|
||||||
return {
|
|
||||||
html: `<span class="regexp">/${escape(regexp)}/</span>`,
|
|
||||||
next: regexp.length + 2
|
|
||||||
};
|
|
||||||
},
|
|
||||||
|
|
||||||
// label
|
|
||||||
code => {
|
|
||||||
if (code[0] != '@') return null;
|
|
||||||
const match = code.match(/^@([a-zA-Z_-]+?)\n/);
|
|
||||||
if (!match) return null;
|
|
||||||
const label = match[0];
|
|
||||||
return {
|
|
||||||
html: `<span class="label">${label}</span>`,
|
|
||||||
next: label.length
|
|
||||||
};
|
|
||||||
},
|
|
||||||
|
|
||||||
// number
|
|
||||||
(code, i, source) => {
|
|
||||||
const prev = source[i - 1];
|
|
||||||
if (prev && /[a-zA-Z]/.test(prev)) return null;
|
|
||||||
if (!/^[\-\+]?[0-9\.]+/.test(code)) return null;
|
|
||||||
const match = code.match(/^[\-\+]?[0-9\.]+/)[0];
|
|
||||||
if (match) {
|
|
||||||
return {
|
|
||||||
html: `<span class="number">${match}</span>`,
|
|
||||||
next: match.length
|
|
||||||
};
|
|
||||||
} else {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
// nan
|
|
||||||
(code, i, source) => {
|
|
||||||
const prev = source[i - 1];
|
|
||||||
if (prev && /[a-zA-Z]/.test(prev)) return null;
|
|
||||||
if (code.substr(0, 3) == 'NaN') {
|
|
||||||
return {
|
|
||||||
html: `<span class="nan">NaN</span>`,
|
|
||||||
next: 3
|
|
||||||
};
|
|
||||||
} else {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
// method
|
|
||||||
code => {
|
|
||||||
const match = code.match(/^([a-zA-Z_-]+?)\(/);
|
|
||||||
if (!match) return null;
|
|
||||||
|
|
||||||
if (match[1] == '-') return null;
|
|
||||||
|
|
||||||
return {
|
|
||||||
html: `<span class="method">${match[1]}</span>`,
|
|
||||||
next: match[1].length
|
|
||||||
};
|
|
||||||
},
|
|
||||||
|
|
||||||
// property
|
|
||||||
(code, i, source) => {
|
|
||||||
const prev = source[i - 1];
|
|
||||||
if (prev != '.') return null;
|
|
||||||
|
|
||||||
const match = code.match(/^[a-zA-Z0-9_-]+/);
|
|
||||||
if (!match) return null;
|
|
||||||
|
|
||||||
return {
|
|
||||||
html: `<span class="property">${match[0]}</span>`,
|
|
||||||
next: match[0].length
|
|
||||||
};
|
|
||||||
},
|
|
||||||
|
|
||||||
// keyword
|
|
||||||
(code, i, source) => {
|
|
||||||
const prev = source[i - 1];
|
|
||||||
if (prev && /[a-zA-Z]/.test(prev)) return null;
|
|
||||||
|
|
||||||
const match = keywords.filter(k => code.substr(0, k.length) == k)[0];
|
|
||||||
if (match) {
|
|
||||||
if (/^[a-zA-Z]/.test(code.substr(match.length))) return null;
|
|
||||||
return {
|
|
||||||
html: `<span class="keyword ${match}">${match}</span>`,
|
|
||||||
next: match.length
|
|
||||||
};
|
|
||||||
} else {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
// symbol
|
|
||||||
code => {
|
|
||||||
const match = symbols.filter(s => code[0] == s)[0];
|
|
||||||
if (match) {
|
|
||||||
return {
|
|
||||||
html: `<span class="symbol">${match}</span>`,
|
|
||||||
next: 1
|
|
||||||
};
|
|
||||||
} else {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
];
|
|
||||||
|
|
||||||
// TODO: specify lang
|
|
||||||
export default (source: string, lang?: string): string => {
|
|
||||||
let code = source;
|
|
||||||
let html = '';
|
|
||||||
|
|
||||||
let i = 0;
|
|
||||||
|
|
||||||
function push(token: Token) {
|
|
||||||
html += token.html;
|
|
||||||
code = code.substr(token.next);
|
|
||||||
i += token.next;
|
|
||||||
}
|
|
||||||
|
|
||||||
while (code != '') {
|
|
||||||
const parsed = elements.some(el => {
|
|
||||||
const e = el(code, i, source);
|
|
||||||
if (e) {
|
|
||||||
push(e);
|
|
||||||
return true;
|
|
||||||
} else {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
if (!parsed) {
|
|
||||||
push({
|
|
||||||
html: escape(code[0]),
|
|
||||||
next: 1
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return html;
|
|
||||||
};
|
|
@ -3,9 +3,9 @@ const { JSDOM } = jsdom;
|
|||||||
import config from '../config';
|
import config from '../config';
|
||||||
import { INote } from '../models/note';
|
import { INote } from '../models/note';
|
||||||
import { intersperse } from '../prelude/array';
|
import { intersperse } from '../prelude/array';
|
||||||
import { MfmForest, MfmTree } from './parser';
|
import { MfmForest, MfmTree } from './types';
|
||||||
|
|
||||||
export default (tokens: MfmForest, mentionedRemoteUsers: INote['mentionedRemoteUsers'] = []) => {
|
export function toHtml(tokens: MfmForest, mentionedRemoteUsers: INote['mentionedRemoteUsers'] = []) {
|
||||||
if (tokens == null) {
|
if (tokens == null) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
@ -55,6 +55,24 @@ export default (tokens: MfmForest, mentionedRemoteUsers: INote['mentionedRemoteU
|
|||||||
return el;
|
return el;
|
||||||
},
|
},
|
||||||
|
|
||||||
|
spin(token) {
|
||||||
|
const el = doc.createElement('i');
|
||||||
|
appendChildren(token.children, el);
|
||||||
|
return el;
|
||||||
|
},
|
||||||
|
|
||||||
|
jump(token) {
|
||||||
|
const el = doc.createElement('i');
|
||||||
|
appendChildren(token.children, el);
|
||||||
|
return el;
|
||||||
|
},
|
||||||
|
|
||||||
|
flip(token) {
|
||||||
|
const el = doc.createElement('span');
|
||||||
|
appendChildren(token.children, el);
|
||||||
|
return el;
|
||||||
|
},
|
||||||
|
|
||||||
blockCode(token) {
|
blockCode(token) {
|
||||||
const pre = doc.createElement('pre');
|
const pre = doc.createElement('pre');
|
||||||
const inner = doc.createElement('code');
|
const inner = doc.createElement('code');
|
||||||
@ -87,7 +105,13 @@ export default (tokens: MfmForest, mentionedRemoteUsers: INote['mentionedRemoteU
|
|||||||
return el;
|
return el;
|
||||||
},
|
},
|
||||||
|
|
||||||
math(token) {
|
mathInline(token) {
|
||||||
|
const el = doc.createElement('code');
|
||||||
|
el.textContent = token.node.props.formula;
|
||||||
|
return el;
|
||||||
|
},
|
||||||
|
|
||||||
|
mathBlock(token) {
|
||||||
const el = doc.createElement('code');
|
const el = doc.createElement('code');
|
||||||
el.textContent = token.node.props.formula;
|
el.textContent = token.node.props.formula;
|
||||||
return el;
|
return el;
|
||||||
@ -113,6 +137,7 @@ export default (tokens: MfmForest, mentionedRemoteUsers: INote['mentionedRemoteU
|
|||||||
default:
|
default:
|
||||||
const remoteUserInfo = mentionedRemoteUsers.find(remoteUser => remoteUser.username === username && remoteUser.host === host);
|
const remoteUserInfo = mentionedRemoteUsers.find(remoteUser => remoteUser.username === username && remoteUser.host === host);
|
||||||
a.href = remoteUserInfo ? remoteUserInfo.uri : `${config.url}/${acct}`;
|
a.href = remoteUserInfo ? remoteUserInfo.uri : `${config.url}/${acct}`;
|
||||||
|
a.className = 'mention';
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
a.textContent = acct;
|
a.textContent = acct;
|
||||||
@ -133,7 +158,7 @@ export default (tokens: MfmForest, mentionedRemoteUsers: INote['mentionedRemoteU
|
|||||||
|
|
||||||
text(token) {
|
text(token) {
|
||||||
const el = doc.createElement('span');
|
const el = doc.createElement('span');
|
||||||
const nodes = (token.node.props.text as string).split('\n').map(x => doc.createTextNode(x));
|
const nodes = (token.node.props.text as string).split(/\r\n|\r|\n/).map(x => doc.createTextNode(x));
|
||||||
|
|
||||||
for (const x of intersperse('br', nodes)) {
|
for (const x of intersperse('br', nodes)) {
|
||||||
el.appendChild(x === 'br' ? doc.createElement('br') : x);
|
el.appendChild(x === 'br' ? doc.createElement('br') : x);
|
||||||
@ -160,4 +185,4 @@ export default (tokens: MfmForest, mentionedRemoteUsers: INote['mentionedRemoteU
|
|||||||
appendChildren(tokens, doc.body);
|
appendChildren(tokens, doc.body);
|
||||||
|
|
||||||
return `<p>${doc.body.innerHTML}</p>`;
|
return `<p>${doc.body.innerHTML}</p>`;
|
||||||
};
|
}
|
37
src/mfm/types.ts
Normal file
37
src/mfm/types.ts
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
import { Tree } from '../prelude/tree';
|
||||||
|
import * as T from '../prelude/tree';
|
||||||
|
|
||||||
|
type Node<T, P> = { type: T, props: P };
|
||||||
|
|
||||||
|
export type MentionNode = Node<'mention', {
|
||||||
|
canonical: string,
|
||||||
|
username: string,
|
||||||
|
host: string,
|
||||||
|
acct: string
|
||||||
|
}>;
|
||||||
|
|
||||||
|
export type HashtagNode = Node<'hashtag', {
|
||||||
|
hashtag: string
|
||||||
|
}>;
|
||||||
|
|
||||||
|
export type EmojiNode = Node<'emoji', {
|
||||||
|
name: string
|
||||||
|
}>;
|
||||||
|
|
||||||
|
export type MfmNode =
|
||||||
|
MentionNode |
|
||||||
|
HashtagNode |
|
||||||
|
EmojiNode |
|
||||||
|
Node<string, any>;
|
||||||
|
|
||||||
|
export type MfmTree = Tree<MfmNode>;
|
||||||
|
|
||||||
|
export type MfmForest = MfmTree[];
|
||||||
|
|
||||||
|
export function createLeaf(type: string, props: any): MfmTree {
|
||||||
|
return T.createLeaf({ type, props });
|
||||||
|
}
|
||||||
|
|
||||||
|
export function createTree(type: string, children: MfmForest, props: any): MfmTree {
|
||||||
|
return T.createTree({ type, props }, children);
|
||||||
|
}
|
@ -1,4 +1,4 @@
|
|||||||
import { EmojiNode, MfmForest } from '../mfm/parser';
|
import { EmojiNode, MfmForest } from '../mfm/types';
|
||||||
import { preorderF } from '../prelude/tree';
|
import { preorderF } from '../prelude/tree';
|
||||||
import { unique } from '../prelude/array';
|
import { unique } from '../prelude/array';
|
||||||
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
import { HashtagNode, MfmForest } from '../mfm/parser';
|
import { HashtagNode, MfmForest } from '../mfm/types';
|
||||||
import { preorderF } from '../prelude/tree';
|
import { preorderF } from '../prelude/tree';
|
||||||
import { unique } from '../prelude/array';
|
import { unique } from '../prelude/array';
|
||||||
|
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
// test is located in test/extract-mentions
|
// test is located in test/extract-mentions
|
||||||
|
|
||||||
import { MentionNode, MfmForest } from '../mfm/parser';
|
import { MentionNode, MfmForest } from '../mfm/types';
|
||||||
import { preorderF } from '../prelude/tree';
|
import { preorderF } from '../prelude/tree';
|
||||||
|
|
||||||
export default function(mfmForest: MfmForest): MentionNode['props'][] {
|
export default function(mfmForest: MfmForest): MentionNode['props'][] {
|
||||||
|
@ -140,6 +140,12 @@ export const hideNote = async (packedNote: any, meId: mongo.ObjectID) => {
|
|||||||
hide = true;
|
hide = true;
|
||||||
} else if (meId.equals(packedNote.userId)) {
|
} else if (meId.equals(packedNote.userId)) {
|
||||||
hide = false;
|
hide = false;
|
||||||
|
} else if (packedNote.reply && meId.equals(packedNote.reply.userId)) {
|
||||||
|
// 自分の投稿に対するリプライ
|
||||||
|
hide = false;
|
||||||
|
} else if (packedNote.mentions && packedNote.mentions.some((id: any) => meId.equals(id))) {
|
||||||
|
// 自分へのメンション
|
||||||
|
hide = false;
|
||||||
} else {
|
} else {
|
||||||
// フォロワーかどうか
|
// フォロワーかどうか
|
||||||
const following = await Following.findOne({
|
const following = await Following.findOne({
|
||||||
|
@ -4,6 +4,7 @@ import db from '../db/mongodb';
|
|||||||
const PollVote = db.get<IPollVote>('pollVotes');
|
const PollVote = db.get<IPollVote>('pollVotes');
|
||||||
PollVote.createIndex('userId');
|
PollVote.createIndex('userId');
|
||||||
PollVote.createIndex('noteId');
|
PollVote.createIndex('noteId');
|
||||||
|
PollVote.createIndex(['userId', 'noteId'], { unique: true });
|
||||||
export default PollVote;
|
export default PollVote;
|
||||||
|
|
||||||
export interface IPollVote {
|
export interface IPollVote {
|
||||||
|
@ -54,6 +54,11 @@ type IUserBase = {
|
|||||||
*/
|
*/
|
||||||
isSuspended: boolean;
|
isSuspended: boolean;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* サイレンスされているか否か
|
||||||
|
*/
|
||||||
|
isSilenced: boolean;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 鍵アカウントか否か
|
* 鍵アカウントか否か
|
||||||
*/
|
*/
|
||||||
@ -306,6 +311,7 @@ export const pack = (
|
|||||||
delete _user.password;
|
delete _user.password;
|
||||||
delete _user.token;
|
delete _user.token;
|
||||||
delete _user.twoFactorTempSecret;
|
delete _user.twoFactorTempSecret;
|
||||||
|
delete _user.two_factor_temp_secret; // 後方互換性のため
|
||||||
delete _user.twoFactorSecret;
|
delete _user.twoFactorSecret;
|
||||||
if (_user.twitter) {
|
if (_user.twitter) {
|
||||||
delete _user.twitter.accessToken;
|
delete _user.twitter.accessToken;
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
const push = require('web-push');
|
import * as push from 'web-push';
|
||||||
import * as mongo from 'mongodb';
|
import * as mongo from 'mongodb';
|
||||||
import Subscription from './models/sw-subscription';
|
import Subscription from './models/sw-subscription';
|
||||||
import config from './config';
|
import config from './config';
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
import { INote } from '../../../models/note';
|
import { INote } from '../../../models/note';
|
||||||
import toHtml from '../../../mfm/html';
|
import { toHtml } from '../../../mfm/toHtml';
|
||||||
import parse from '../../../mfm/parse';
|
import { parse } from '../../../mfm/parse';
|
||||||
|
|
||||||
export default function(note: INote) {
|
export default function(note: INote) {
|
||||||
let html = toHtml(parse(note.text), note.mentionedRemoteUsers);
|
let html = toHtml(parse(note.text), note.mentionedRemoteUsers);
|
||||||
|
5
src/remote/activitypub/models/identifier.ts
Normal file
5
src/remote/activitypub/models/identifier.ts
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
export type IIdentifier = {
|
||||||
|
type: string;
|
||||||
|
name: string;
|
||||||
|
value: string;
|
||||||
|
};
|
@ -9,7 +9,7 @@ import { INote as INoteActivityStreamsObject, IObject } from '../type';
|
|||||||
import { resolvePerson, updatePerson } from './person';
|
import { resolvePerson, updatePerson } from './person';
|
||||||
import { resolveImage } from './image';
|
import { resolveImage } from './image';
|
||||||
import { IRemoteUser, IUser } from '../../../models/user';
|
import { IRemoteUser, IUser } from '../../../models/user';
|
||||||
import htmlToMFM from '../../../mfm/html-to-mfm';
|
import { fromHtml } from '../../../mfm/fromHtml';
|
||||||
import Emoji, { IEmoji } from '../../../models/emoji';
|
import Emoji, { IEmoji } from '../../../models/emoji';
|
||||||
import { ITag } from './tag';
|
import { ITag } from './tag';
|
||||||
import { toUnicode } from 'punycode';
|
import { toUnicode } from 'punycode';
|
||||||
@ -110,7 +110,7 @@ export async function createNote(value: any, resolver?: Resolver, silent = false
|
|||||||
const cw = note.summary === '' ? null : note.summary;
|
const cw = note.summary === '' ? null : note.summary;
|
||||||
|
|
||||||
// テキストのパース
|
// テキストのパース
|
||||||
const text = note._misskey_content ? note._misskey_content : htmlToMFM(note.content);
|
const text = note._misskey_content ? note._misskey_content : fromHtml(note.content);
|
||||||
|
|
||||||
// vote
|
// vote
|
||||||
if (reply && reply.poll && text != null) {
|
if (reply && reply.poll && text != null) {
|
||||||
|
@ -9,7 +9,7 @@ import { resolveImage } from './image';
|
|||||||
import { isCollectionOrOrderedCollection, isCollection, IPerson } from '../type';
|
import { isCollectionOrOrderedCollection, isCollection, IPerson } from '../type';
|
||||||
import { IDriveFile } from '../../../models/drive-file';
|
import { IDriveFile } from '../../../models/drive-file';
|
||||||
import Meta from '../../../models/meta';
|
import Meta from '../../../models/meta';
|
||||||
import htmlToMFM from '../../../mfm/html-to-mfm';
|
import { fromHtml } from '../../../mfm/fromHtml';
|
||||||
import usersChart from '../../../chart/users';
|
import usersChart from '../../../chart/users';
|
||||||
import { URL } from 'url';
|
import { URL } from 'url';
|
||||||
import { resolveNote, extractEmojis } from './note';
|
import { resolveNote, extractEmojis } from './note';
|
||||||
@ -19,6 +19,7 @@ import getDriveFileUrl from '../../../misc/get-drive-file-url';
|
|||||||
import { IEmoji } from '../../../models/emoji';
|
import { IEmoji } from '../../../models/emoji';
|
||||||
import { ITag } from './tag';
|
import { ITag } from './tag';
|
||||||
import Following from '../../../models/following';
|
import Following from '../../../models/following';
|
||||||
|
import { IIdentifier } from './identifier';
|
||||||
|
|
||||||
const log = debug('misskey:activitypub');
|
const log = debug('misskey:activitypub');
|
||||||
|
|
||||||
@ -137,9 +138,7 @@ export async function createPerson(uri: string, resolver?: Resolver): Promise<IU
|
|||||||
|
|
||||||
const host = toUnicode(new URL(object.id).hostname.toLowerCase());
|
const host = toUnicode(new URL(object.id).hostname.toLowerCase());
|
||||||
|
|
||||||
const fields = await extractFields(person.attachment).catch(e => {
|
const { fields, services } = analyzeAttachments(person.attachment);
|
||||||
console.log(`cat not extract fields: ${e}`);
|
|
||||||
});
|
|
||||||
|
|
||||||
const isBot = object.type == 'Service';
|
const isBot = object.type == 'Service';
|
||||||
|
|
||||||
@ -151,7 +150,7 @@ export async function createPerson(uri: string, resolver?: Resolver): Promise<IU
|
|||||||
bannerId: null,
|
bannerId: null,
|
||||||
createdAt: Date.parse(person.published) || null,
|
createdAt: Date.parse(person.published) || null,
|
||||||
lastFetchedAt: new Date(),
|
lastFetchedAt: new Date(),
|
||||||
description: htmlToMFM(person.summary),
|
description: fromHtml(person.summary),
|
||||||
followersCount,
|
followersCount,
|
||||||
followingCount,
|
followingCount,
|
||||||
notesCount,
|
notesCount,
|
||||||
@ -171,7 +170,8 @@ export async function createPerson(uri: string, resolver?: Resolver): Promise<IU
|
|||||||
uri: person.id,
|
uri: person.id,
|
||||||
url: person.url,
|
url: person.url,
|
||||||
fields,
|
fields,
|
||||||
isBot: isBot,
|
...services,
|
||||||
|
isBot,
|
||||||
isCat: (person as any).isCat === true
|
isCat: (person as any).isCat === true
|
||||||
}) as IRemoteUser;
|
}) as IRemoteUser;
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
@ -332,9 +332,7 @@ export async function updatePerson(uri: string, resolver?: Resolver, hint?: obje
|
|||||||
|
|
||||||
const emojiNames = emojis.map(emoji => emoji.name);
|
const emojiNames = emojis.map(emoji => emoji.name);
|
||||||
|
|
||||||
const fields = await extractFields(person.attachment).catch(e => {
|
const { fields, services } = analyzeAttachments(person.attachment);
|
||||||
console.log(`cat not extract fields: ${e}`);
|
|
||||||
});
|
|
||||||
|
|
||||||
const updates = {
|
const updates = {
|
||||||
lastFetchedAt: new Date(),
|
lastFetchedAt: new Date(),
|
||||||
@ -342,7 +340,7 @@ export async function updatePerson(uri: string, resolver?: Resolver, hint?: obje
|
|||||||
sharedInbox: person.sharedInbox || (person.endpoints ? person.endpoints.sharedInbox : undefined),
|
sharedInbox: person.sharedInbox || (person.endpoints ? person.endpoints.sharedInbox : undefined),
|
||||||
featured: person.featured,
|
featured: person.featured,
|
||||||
emojis: emojiNames,
|
emojis: emojiNames,
|
||||||
description: htmlToMFM(person.summary),
|
description: fromHtml(person.summary),
|
||||||
followersCount,
|
followersCount,
|
||||||
followingCount,
|
followingCount,
|
||||||
notesCount,
|
notesCount,
|
||||||
@ -350,6 +348,7 @@ export async function updatePerson(uri: string, resolver?: Resolver, hint?: obje
|
|||||||
url: person.url,
|
url: person.url,
|
||||||
endpoints: person.endpoints,
|
endpoints: person.endpoints,
|
||||||
fields,
|
fields,
|
||||||
|
...services,
|
||||||
isBot: object.type == 'Service',
|
isBot: object.type == 'Service',
|
||||||
isCat: (person as any).isCat === true,
|
isCat: (person as any).isCat === true,
|
||||||
isLocked: person.manuallyApprovesFollowers,
|
isLocked: person.manuallyApprovesFollowers,
|
||||||
@ -413,16 +412,61 @@ export async function resolvePerson(uri: string, verifier?: string, resolver?: R
|
|||||||
return await createPerson(uri, resolver);
|
return await createPerson(uri, resolver);
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function extractFields(attachments: ITag[]) {
|
const isPropertyValue = (x: {
|
||||||
if (!attachments) return [];
|
type: string,
|
||||||
|
name?: string,
|
||||||
|
value?: string
|
||||||
|
}) =>
|
||||||
|
x &&
|
||||||
|
x.type === 'PropertyValue' &&
|
||||||
|
typeof x.name === 'string' &&
|
||||||
|
typeof x.value === 'string';
|
||||||
|
|
||||||
return attachments.filter(a => a.type === 'PropertyValue' && a.name && a.value)
|
const services: {
|
||||||
.map(a => {
|
[x: string]: (id: string, username: string) => any
|
||||||
return {
|
} = {
|
||||||
name: a.name,
|
'misskey:authentication:twitter': (userId, screenName) => ({ userId, screenName }),
|
||||||
value: htmlToMFM(a.value)
|
'misskey:authentication:github': (id, login) => ({ id, login }),
|
||||||
};
|
'misskey:authentication:discord': (id, name) => $discord(id, name)
|
||||||
|
};
|
||||||
|
|
||||||
|
const $discord = (id: string, name: string) => {
|
||||||
|
if (typeof name !== 'string')
|
||||||
|
name = 'unknown#0000';
|
||||||
|
const [username, discriminator] = name.split('#');
|
||||||
|
return { id, username, discriminator };
|
||||||
|
};
|
||||||
|
|
||||||
|
function addService(target: { [x: string]: any }, source: IIdentifier) {
|
||||||
|
const service = services[source.name];
|
||||||
|
|
||||||
|
if (typeof source.value !== 'string')
|
||||||
|
source.value = 'unknown';
|
||||||
|
|
||||||
|
const [id, username] = source.value.split('@');
|
||||||
|
|
||||||
|
if (service)
|
||||||
|
target[source.name.split(':')[2]] = service(id, username);
|
||||||
|
}
|
||||||
|
|
||||||
|
export function analyzeAttachments(attachments: ITag[]) {
|
||||||
|
const fields: {
|
||||||
|
name: string,
|
||||||
|
value: string
|
||||||
|
}[] = [];
|
||||||
|
const services: { [x: string]: any } = {};
|
||||||
|
|
||||||
|
if (Array.isArray(attachments))
|
||||||
|
for (const attachment of attachments.filter(isPropertyValue))
|
||||||
|
if (isPropertyValue(attachment.identifier))
|
||||||
|
addService(services, attachment.identifier);
|
||||||
|
else
|
||||||
|
fields.push({
|
||||||
|
name: attachment.name,
|
||||||
|
value: fromHtml(attachment.value)
|
||||||
});
|
});
|
||||||
|
|
||||||
|
return { fields, services };
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function updateFeatured(userId: mongo.ObjectID) {
|
export async function updateFeatured(userId: mongo.ObjectID) {
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
import { IIcon } from './icon';
|
import { IIcon } from './icon';
|
||||||
|
import { IIdentifier } from './identifier';
|
||||||
|
|
||||||
/***
|
/***
|
||||||
* tag (ActivityPub)
|
* tag (ActivityPub)
|
||||||
@ -10,4 +11,5 @@ export type ITag = {
|
|||||||
value?: string;
|
value?: string;
|
||||||
updated?: Date;
|
updated?: Date;
|
||||||
icon?: IIcon;
|
icon?: IIcon;
|
||||||
|
identifier?: IIdentifier;
|
||||||
};
|
};
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
import config from '../../../config';
|
import config from '../../../config';
|
||||||
import * as uuid from 'uuid';
|
import * as uuid from 'uuid';
|
||||||
|
|
||||||
export default (x: any) => {
|
export const renderActivity = (x: any) => {
|
||||||
if (x == null) return null;
|
if (x == null) return null;
|
||||||
|
|
||||||
if (x !== null && typeof x === 'object' && x.id == null) {
|
if (x !== null && typeof x === 'object' && x.id == null) {
|
||||||
|
@ -98,7 +98,7 @@ export default async function renderNote(note: INote, dive = true): Promise<any>
|
|||||||
if (text == null) text = '';
|
if (text == null) text = '';
|
||||||
const url = `${config.url}/notes/${note._id}`;
|
const url = `${config.url}/notes/${note._id}`;
|
||||||
// TODO: i18n
|
// TODO: i18n
|
||||||
text += `\n\n[リモートで投票を見る](${url})`;
|
text += `\n[リモートで結果を表示](${url})`;
|
||||||
|
|
||||||
question = `${config.url}/questions/${note._id}`;
|
question = `${config.url}/questions/${note._id}`;
|
||||||
}
|
}
|
||||||
@ -109,8 +109,10 @@ export default async function renderNote(note: INote, dive = true): Promise<any>
|
|||||||
// Provides choices as text for AP
|
// Provides choices as text for AP
|
||||||
if (note.poll != null) {
|
if (note.poll != null) {
|
||||||
const cs = note.poll.choices.map(c => `${c.id}: ${c.text}`);
|
const cs = note.poll.choices.map(c => `${c.id}: ${c.text}`);
|
||||||
apText += '\n';
|
apText += '\n----------------------------------------\n';
|
||||||
apText += cs.join('\n');
|
apText += cs.join('\n');
|
||||||
|
apText += '\n----------------------------------------\n';
|
||||||
|
apText += '番号を返信して投票';
|
||||||
}
|
}
|
||||||
|
|
||||||
if (quote) {
|
if (quote) {
|
||||||
|
@ -2,11 +2,12 @@ import renderImage from './image';
|
|||||||
import renderKey from './key';
|
import renderKey from './key';
|
||||||
import config from '../../../config';
|
import config from '../../../config';
|
||||||
import { ILocalUser } from '../../../models/user';
|
import { ILocalUser } from '../../../models/user';
|
||||||
import toHtml from '../../../mfm/html';
|
import { toHtml } from '../../../mfm/toHtml';
|
||||||
import parse from '../../../mfm/parse';
|
import { parse } from '../../../mfm/parse';
|
||||||
import DriveFile from '../../../models/drive-file';
|
import DriveFile from '../../../models/drive-file';
|
||||||
import { getEmojis } from './note';
|
import { getEmojis } from './note';
|
||||||
import renderEmoji from './emoji';
|
import renderEmoji from './emoji';
|
||||||
|
import { IIdentifier } from '../models/identifier';
|
||||||
|
|
||||||
export default async (user: ILocalUser) => {
|
export default async (user: ILocalUser) => {
|
||||||
const id = `${config.url}/users/${user._id}`;
|
const id = `${config.url}/users/${user._id}`;
|
||||||
@ -20,14 +21,20 @@ export default async (user: ILocalUser) => {
|
|||||||
type: string,
|
type: string,
|
||||||
name: string,
|
name: string,
|
||||||
value: string,
|
value: string,
|
||||||
verified_at?: string
|
verified_at?: string,
|
||||||
|
identifier?: IIdentifier
|
||||||
}[] = [];
|
}[] = [];
|
||||||
|
|
||||||
if (user.twitter) {
|
if (user.twitter) {
|
||||||
attachment.push({
|
attachment.push({
|
||||||
type: 'PropertyValue',
|
type: 'PropertyValue',
|
||||||
name: 'Twitter',
|
name: 'Twitter',
|
||||||
value: `<a href="https://twitter.com/intent/user?user_id=${user.twitter.userId}" rel="me nofollow noopener" target="_blank"><span>@${user.twitter.screenName}</span></a>`
|
value: `<a href="https://twitter.com/intent/user?user_id=${user.twitter.userId}" rel="me nofollow noopener" target="_blank"><span>@${user.twitter.screenName}</span></a>`,
|
||||||
|
identifier: {
|
||||||
|
type: 'PropertyValue',
|
||||||
|
name: 'misskey:authentication:twitter',
|
||||||
|
value: `${user.twitter.userId}@${user.twitter.screenName}`
|
||||||
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -35,7 +42,12 @@ export default async (user: ILocalUser) => {
|
|||||||
attachment.push({
|
attachment.push({
|
||||||
type: 'PropertyValue',
|
type: 'PropertyValue',
|
||||||
name: 'GitHub',
|
name: 'GitHub',
|
||||||
value: `<a href="https://github.com/${user.github.login}" rel="me nofollow noopener" target="_blank"><span>@${user.github.login}</span></a>`
|
value: `<a href="https://github.com/${user.github.login}" rel="me nofollow noopener" target="_blank"><span>@${user.github.login}</span></a>`,
|
||||||
|
identifier: {
|
||||||
|
type: 'PropertyValue',
|
||||||
|
name: 'misskey:authentication:github',
|
||||||
|
value: `${user.github.id}@${user.github.login}`
|
||||||
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -43,7 +55,12 @@ export default async (user: ILocalUser) => {
|
|||||||
attachment.push({
|
attachment.push({
|
||||||
type: 'PropertyValue',
|
type: 'PropertyValue',
|
||||||
name: 'Discord',
|
name: 'Discord',
|
||||||
value: `<a href="https://discordapp.com/users/${user.discord.id}" rel="me nofollow noopener" target="_blank"><span>${user.discord.username}#${user.discord.discriminator}</span></a>`
|
value: `<a href="https://discordapp.com/users/${user.discord.id}" rel="me nofollow noopener" target="_blank"><span>${user.discord.username}#${user.discord.discriminator}</span></a>`,
|
||||||
|
identifier: {
|
||||||
|
type: 'PropertyValue',
|
||||||
|
name: 'misskey:authentication:discord',
|
||||||
|
value: `${user.discord.id}@${user.discord.username}#${user.discord.discriminator}`
|
||||||
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2,7 +2,7 @@ import { request } from 'https';
|
|||||||
const { sign } = require('http-signature');
|
const { sign } = require('http-signature');
|
||||||
import { URL } from 'url';
|
import { URL } from 'url';
|
||||||
import * as debug from 'debug';
|
import * as debug from 'debug';
|
||||||
const crypto = require('crypto');
|
import * as crypto from 'crypto';
|
||||||
const { lookup } = require('lookup-dns-cache');
|
const { lookup } = require('lookup-dns-cache');
|
||||||
const promiseAny = require('promise-any');
|
const promiseAny = require('promise-any');
|
||||||
|
|
||||||
|
@ -4,7 +4,7 @@ const json = require('koa-json-body');
|
|||||||
const httpSignature = require('http-signature');
|
const httpSignature = require('http-signature');
|
||||||
|
|
||||||
import { createHttpJob } from '../queue';
|
import { createHttpJob } from '../queue';
|
||||||
import pack from '../remote/activitypub/renderer';
|
import { renderActivity } from '../remote/activitypub/renderer';
|
||||||
import Note from '../models/note';
|
import Note from '../models/note';
|
||||||
import User, { isLocalUser, ILocalUser, IUser } from '../models/user';
|
import User, { isLocalUser, ILocalUser, IUser } from '../models/user';
|
||||||
import Emoji from '../models/emoji';
|
import Emoji from '../models/emoji';
|
||||||
@ -83,7 +83,7 @@ router.get('/notes/:note', async (ctx, next) => {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
ctx.body = pack(await renderNote(note, false));
|
ctx.body = renderActivity(await renderNote(note, false));
|
||||||
ctx.set('Cache-Control', 'public, max-age=180');
|
ctx.set('Cache-Control', 'public, max-age=180');
|
||||||
setResponseType(ctx);
|
setResponseType(ctx);
|
||||||
});
|
});
|
||||||
@ -106,7 +106,7 @@ router.get('/notes/:note/activity', async ctx => {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
ctx.body = pack(await packActivity(note));
|
ctx.body = renderActivity(await packActivity(note));
|
||||||
ctx.set('Cache-Control', 'public, max-age=180');
|
ctx.set('Cache-Control', 'public, max-age=180');
|
||||||
setResponseType(ctx);
|
setResponseType(ctx);
|
||||||
});
|
});
|
||||||
@ -137,7 +137,7 @@ router.get('/questions/:question', async (ctx, next) => {
|
|||||||
_id: poll.userId
|
_id: poll.userId
|
||||||
});
|
});
|
||||||
|
|
||||||
ctx.body = pack(await renderQuestion(user as ILocalUser, poll));
|
ctx.body = renderActivity(await renderQuestion(user as ILocalUser, poll));
|
||||||
setResponseType(ctx);
|
setResponseType(ctx);
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -173,7 +173,7 @@ router.get('/users/:user/publickey', async ctx => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (isLocalUser(user)) {
|
if (isLocalUser(user)) {
|
||||||
ctx.body = pack(renderKey(user));
|
ctx.body = renderActivity(renderKey(user));
|
||||||
ctx.set('Cache-Control', 'public, max-age=180');
|
ctx.set('Cache-Control', 'public, max-age=180');
|
||||||
setResponseType(ctx);
|
setResponseType(ctx);
|
||||||
} else {
|
} else {
|
||||||
@ -188,7 +188,7 @@ async function userInfo(ctx: Router.IRouterContext, user: IUser) {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
ctx.body = pack(await renderPerson(user as ILocalUser));
|
ctx.body = renderActivity(await renderPerson(user as ILocalUser));
|
||||||
ctx.set('Cache-Control', 'public, max-age=180');
|
ctx.set('Cache-Control', 'public, max-age=180');
|
||||||
setResponseType(ctx);
|
setResponseType(ctx);
|
||||||
}
|
}
|
||||||
@ -235,7 +235,7 @@ router.get('/emojis/:emoji', async ctx => {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
ctx.body = pack(await renderEmoji(emoji));
|
ctx.body = renderActivity(await renderEmoji(emoji));
|
||||||
ctx.set('Cache-Control', 'public, max-age=180');
|
ctx.set('Cache-Control', 'public, max-age=180');
|
||||||
setResponseType(ctx);
|
setResponseType(ctx);
|
||||||
});
|
});
|
||||||
|
@ -2,7 +2,7 @@ import { ObjectID } from 'mongodb';
|
|||||||
import * as Router from 'koa-router';
|
import * as Router from 'koa-router';
|
||||||
import config from '../../config';
|
import config from '../../config';
|
||||||
import User from '../../models/user';
|
import User from '../../models/user';
|
||||||
import pack from '../../remote/activitypub/renderer';
|
import { renderActivity } from '../../remote/activitypub/renderer';
|
||||||
import renderOrderedCollection from '../../remote/activitypub/renderer/ordered-collection';
|
import renderOrderedCollection from '../../remote/activitypub/renderer/ordered-collection';
|
||||||
import { setResponseType } from '../activitypub';
|
import { setResponseType } from '../activitypub';
|
||||||
import Note from '../../models/note';
|
import Note from '../../models/note';
|
||||||
@ -38,7 +38,7 @@ export default async (ctx: Router.IRouterContext) => {
|
|||||||
renderedNotes.length, null, null, renderedNotes
|
renderedNotes.length, null, null, renderedNotes
|
||||||
);
|
);
|
||||||
|
|
||||||
ctx.body = pack(rendered);
|
ctx.body = renderActivity(rendered);
|
||||||
ctx.set('Cache-Control', 'private, max-age=0, must-revalidate');
|
ctx.set('Cache-Control', 'private, max-age=0, must-revalidate');
|
||||||
setResponseType(ctx);
|
setResponseType(ctx);
|
||||||
};
|
};
|
||||||
|
@ -4,7 +4,7 @@ import config from '../../config';
|
|||||||
import $ from 'cafy'; import ID, { transform } from '../../misc/cafy-id';
|
import $ from 'cafy'; import ID, { transform } from '../../misc/cafy-id';
|
||||||
import User from '../../models/user';
|
import User from '../../models/user';
|
||||||
import Following from '../../models/following';
|
import Following from '../../models/following';
|
||||||
import pack from '../../remote/activitypub/renderer';
|
import { renderActivity } from '../../remote/activitypub/renderer';
|
||||||
import renderOrderedCollection from '../../remote/activitypub/renderer/ordered-collection';
|
import renderOrderedCollection from '../../remote/activitypub/renderer/ordered-collection';
|
||||||
import renderOrderedCollectionPage from '../../remote/activitypub/renderer/ordered-collection-page';
|
import renderOrderedCollectionPage from '../../remote/activitypub/renderer/ordered-collection-page';
|
||||||
import renderFollowUser from '../../remote/activitypub/renderer/follow-user';
|
import renderFollowUser from '../../remote/activitypub/renderer/follow-user';
|
||||||
@ -77,12 +77,12 @@ export default async (ctx: Router.IRouterContext) => {
|
|||||||
inStock ? `${partOf}?page=true&cursor=${followings[followings.length - 1]._id}` : null
|
inStock ? `${partOf}?page=true&cursor=${followings[followings.length - 1]._id}` : null
|
||||||
);
|
);
|
||||||
|
|
||||||
ctx.body = pack(rendered);
|
ctx.body = renderActivity(rendered);
|
||||||
setResponseType(ctx);
|
setResponseType(ctx);
|
||||||
} else {
|
} else {
|
||||||
// index page
|
// index page
|
||||||
const rendered = renderOrderedCollection(partOf, user.followersCount, `${partOf}?page=true`, null);
|
const rendered = renderOrderedCollection(partOf, user.followersCount, `${partOf}?page=true`, null);
|
||||||
ctx.body = pack(rendered);
|
ctx.body = renderActivity(rendered);
|
||||||
ctx.set('Cache-Control', 'private, max-age=0, must-revalidate');
|
ctx.set('Cache-Control', 'private, max-age=0, must-revalidate');
|
||||||
setResponseType(ctx);
|
setResponseType(ctx);
|
||||||
}
|
}
|
||||||
|
@ -5,7 +5,7 @@ import $ from 'cafy';
|
|||||||
import ID, { transform } from '../../misc/cafy-id';
|
import ID, { transform } from '../../misc/cafy-id';
|
||||||
import User from '../../models/user';
|
import User from '../../models/user';
|
||||||
import Following from '../../models/following';
|
import Following from '../../models/following';
|
||||||
import pack from '../../remote/activitypub/renderer';
|
import { renderActivity } from '../../remote/activitypub/renderer';
|
||||||
import renderOrderedCollection from '../../remote/activitypub/renderer/ordered-collection';
|
import renderOrderedCollection from '../../remote/activitypub/renderer/ordered-collection';
|
||||||
import renderOrderedCollectionPage from '../../remote/activitypub/renderer/ordered-collection-page';
|
import renderOrderedCollectionPage from '../../remote/activitypub/renderer/ordered-collection-page';
|
||||||
import renderFollowUser from '../../remote/activitypub/renderer/follow-user';
|
import renderFollowUser from '../../remote/activitypub/renderer/follow-user';
|
||||||
@ -78,12 +78,12 @@ export default async (ctx: Router.IRouterContext) => {
|
|||||||
inStock ? `${partOf}?page=true&cursor=${followings[followings.length - 1]._id}` : null
|
inStock ? `${partOf}?page=true&cursor=${followings[followings.length - 1]._id}` : null
|
||||||
);
|
);
|
||||||
|
|
||||||
ctx.body = pack(rendered);
|
ctx.body = renderActivity(rendered);
|
||||||
setResponseType(ctx);
|
setResponseType(ctx);
|
||||||
} else {
|
} else {
|
||||||
// index page
|
// index page
|
||||||
const rendered = renderOrderedCollection(partOf, user.followingCount, `${partOf}?page=true`, null);
|
const rendered = renderOrderedCollection(partOf, user.followingCount, `${partOf}?page=true`, null);
|
||||||
ctx.body = pack(rendered);
|
ctx.body = renderActivity(rendered);
|
||||||
ctx.set('Cache-Control', 'private, max-age=0, must-revalidate');
|
ctx.set('Cache-Control', 'private, max-age=0, must-revalidate');
|
||||||
setResponseType(ctx);
|
setResponseType(ctx);
|
||||||
}
|
}
|
||||||
|
@ -4,7 +4,7 @@ import config from '../../config';
|
|||||||
import $ from 'cafy';
|
import $ from 'cafy';
|
||||||
import ID, { transform } from '../../misc/cafy-id';
|
import ID, { transform } from '../../misc/cafy-id';
|
||||||
import User from '../../models/user';
|
import User from '../../models/user';
|
||||||
import pack from '../../remote/activitypub/renderer';
|
import { renderActivity } from '../../remote/activitypub/renderer';
|
||||||
import renderOrderedCollection from '../../remote/activitypub/renderer/ordered-collection';
|
import renderOrderedCollection from '../../remote/activitypub/renderer/ordered-collection';
|
||||||
import renderOrderedCollectionPage from '../../remote/activitypub/renderer/ordered-collection-page';
|
import renderOrderedCollectionPage from '../../remote/activitypub/renderer/ordered-collection-page';
|
||||||
import { setResponseType } from '../activitypub';
|
import { setResponseType } from '../activitypub';
|
||||||
@ -94,7 +94,7 @@ export default async (ctx: Router.IRouterContext) => {
|
|||||||
notes.length > 0 ? `${partOf}?page=true&until_id=${notes[notes.length - 1]._id}` : null
|
notes.length > 0 ? `${partOf}?page=true&until_id=${notes[notes.length - 1]._id}` : null
|
||||||
);
|
);
|
||||||
|
|
||||||
ctx.body = pack(rendered);
|
ctx.body = renderActivity(rendered);
|
||||||
ctx.set('Cache-Control', 'private, max-age=0, must-revalidate');
|
ctx.set('Cache-Control', 'private, max-age=0, must-revalidate');
|
||||||
setResponseType(ctx);
|
setResponseType(ctx);
|
||||||
} else {
|
} else {
|
||||||
@ -103,7 +103,7 @@ export default async (ctx: Router.IRouterContext) => {
|
|||||||
`${partOf}?page=true`,
|
`${partOf}?page=true`,
|
||||||
`${partOf}?page=true&since_id=000000000000000000000000`
|
`${partOf}?page=true&since_id=000000000000000000000000`
|
||||||
);
|
);
|
||||||
ctx.body = pack(rendered);
|
ctx.body = renderActivity(rendered);
|
||||||
ctx.set('Cache-Control', 'private, max-age=0, must-revalidate');
|
ctx.set('Cache-Control', 'private, max-age=0, must-revalidate');
|
||||||
setResponseType(ctx);
|
setResponseType(ctx);
|
||||||
}
|
}
|
||||||
|
@ -6,7 +6,7 @@ import call from './call';
|
|||||||
import { IUser } from '../../models/user';
|
import { IUser } from '../../models/user';
|
||||||
import { IApp } from '../../models/app';
|
import { IApp } from '../../models/app';
|
||||||
|
|
||||||
export default async (endpoint: IEndpoint, ctx: Koa.Context) => {
|
export default async (endpoint: IEndpoint, ctx: Koa.BaseContext) => {
|
||||||
const body = ctx.is('multipart/form-data') ? (ctx.req as any).body : ctx.request.body;
|
const body = ctx.is('multipart/form-data') ? (ctx.req as any).body : ctx.request.body;
|
||||||
|
|
||||||
const reply = (x?: any, y?: any) => {
|
const reply = (x?: any, y?: any) => {
|
||||||
|
@ -3,10 +3,9 @@ import { default as User, IUser } from '../../models/user';
|
|||||||
import AccessToken from '../../models/access-token';
|
import AccessToken from '../../models/access-token';
|
||||||
import isNativeToken from './common/is-native-token';
|
import isNativeToken from './common/is-native-token';
|
||||||
|
|
||||||
export default (token: string) => new Promise<[IUser, IApp]>(async (resolve, reject) => {
|
export default async (token: string): Promise<[IUser, IApp]> => {
|
||||||
if (token == null) {
|
if (token == null) {
|
||||||
resolve([null, null]);
|
return [null, null];
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isNativeToken(token)) {
|
if (isNativeToken(token)) {
|
||||||
@ -15,17 +14,17 @@ export default (token: string) => new Promise<[IUser, IApp]>(async (resolve, rej
|
|||||||
.findOne({ token });
|
.findOne({ token });
|
||||||
|
|
||||||
if (user === null) {
|
if (user === null) {
|
||||||
return reject('user not found');
|
throw 'user not found';
|
||||||
}
|
}
|
||||||
|
|
||||||
resolve([user, null]);
|
return [user, null];
|
||||||
} else {
|
} else {
|
||||||
const accessToken = await AccessToken.findOne({
|
const accessToken = await AccessToken.findOne({
|
||||||
hash: token.toLowerCase()
|
hash: token.toLowerCase()
|
||||||
});
|
});
|
||||||
|
|
||||||
if (accessToken === null) {
|
if (accessToken === null) {
|
||||||
return reject('invalid signature');
|
throw 'invalid signature';
|
||||||
}
|
}
|
||||||
|
|
||||||
const app = await App
|
const app = await App
|
||||||
@ -34,6 +33,6 @@ export default (token: string) => new Promise<[IUser, IApp]>(async (resolve, rej
|
|||||||
const user = await User
|
const user = await User
|
||||||
.findOne({ _id: accessToken.userId });
|
.findOne({ _id: accessToken.userId });
|
||||||
|
|
||||||
resolve([user, app]);
|
return [user, app];
|
||||||
}
|
}
|
||||||
});
|
};
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user