Compare commits

..

185 Commits

Author SHA1 Message Date
syuilo
5fbf3c3f72 5.10.0 2018-08-02 09:53:23 +09:00
syuilo
5c497d7563 ✌️ 2018-08-02 09:52:47 +09:00
syuilo
7ee3f63eff Merge pull request #2059 from syuilo/l10n_master
New Crowdin translations
2018-08-02 09:51:14 +09:00
syuilo
ee85a76678 New translations ja.yml (English) 2018-08-02 09:50:53 +09:00
syuilo
e691524416 Fix bug 2018-08-02 09:37:13 +09:00
syuilo
ce0f6f7ebe type指定廃止 2018-08-02 09:30:57 +09:00
syuilo
dfa5cb567f Define new index 2018-08-02 09:29:46 +09:00
syuilo
bcf854b7bb Clean up 2018-08-02 09:27:30 +09:00
syuilo
be0e811e45 Merge branch 'master' of https://github.com/syuilo/misskey 2018-08-02 09:24:11 +09:00
syuilo
ab009cfbd7 🎨 2018-08-02 09:24:08 +09:00
syuilo
3fc7ebf80b Merge pull request #2056 from syuilo/l10n_master
New Crowdin translations
2018-08-02 08:34:15 +09:00
syuilo
8c02c0cb30 New translations ja.yml (Catalan) 2018-08-02 08:31:35 +09:00
syuilo
11c015c24e New translations ja.yml (Portuguese) 2018-08-02 08:31:33 +09:00
syuilo
d937730ab7 New translations ja.yml (Korean) 2018-08-02 08:31:30 +09:00
syuilo
b2b5b1e4c9 New translations ja.yml (Polish) 2018-08-02 08:31:28 +09:00
syuilo
d84b3088ec New translations ja.yml (Chinese Simplified) 2018-08-02 08:31:26 +09:00
syuilo
24f2a4731e New translations ja.yml (Italian) 2018-08-02 08:31:24 +09:00
syuilo
152fba9ba7 New translations ja.yml (Russian) 2018-08-02 08:31:22 +09:00
syuilo
3e2edcb815 New translations ja.yml (English) 2018-08-02 08:31:20 +09:00
syuilo
9c8e92b2bc New translations ja.yml (Spanish) 2018-08-02 08:31:18 +09:00
syuilo
24c9e1b8d9 New translations ja.yml (German) 2018-08-02 08:31:16 +09:00
syuilo
127cad8bc1 New translations ja.yml (French) 2018-08-02 08:11:01 +09:00
syuilo
1d4f4b829f Improve i18n 2018-08-02 08:04:16 +09:00
syuilo
66d7135a5c New translations ja.yml (French) 2018-08-02 08:01:11 +09:00
syuilo
635eee980d Update 2018-08-02 07:54:59 +09:00
syuilo
23f2370c4b Improve i18n 2018-08-02 07:53:11 +09:00
syuilo
f2b88002a3 New translations ja.yml (English) 2018-08-02 07:51:26 +09:00
syuilo
6c41265625 New translations ja.yml (Catalan) 2018-08-02 07:41:18 +09:00
syuilo
b939cb8b4c New translations ja.yml (Portuguese) 2018-08-02 07:41:16 +09:00
syuilo
d74710260a New translations ja.yml (Korean) 2018-08-02 07:41:14 +09:00
syuilo
609a15cfb1 New translations ja.yml (Polish) 2018-08-02 07:41:12 +09:00
syuilo
644532d4db New translations ja.yml (Chinese Simplified) 2018-08-02 07:41:09 +09:00
syuilo
e9b0ffef0f New translations ja.yml (Italian) 2018-08-02 07:41:07 +09:00
syuilo
31a133e7f0 New translations ja.yml (Russian) 2018-08-02 07:41:05 +09:00
syuilo
277a24f8e0 New translations ja.yml (English) 2018-08-02 07:41:03 +09:00
syuilo
6c07411755 New translations ja.yml (Spanish) 2018-08-02 07:41:01 +09:00
syuilo
6894eee6d4 New translations ja.yml (German) 2018-08-02 07:40:58 +09:00
syuilo
babdeb5d6e New translations ja.yml (French) 2018-08-02 07:40:56 +09:00
syuilo
7f08d84989 Merge branch 'master' into l10n_master 2018-08-02 07:38:44 +09:00
syuilo
32053d963f i18n reversi 2018-08-02 07:36:25 +09:00
syuilo
5994ea9465 New translations ja.yml (Catalan) 2018-08-02 07:11:32 +09:00
syuilo
7384a3825a New translations ja.yml (Portuguese) 2018-08-02 07:11:30 +09:00
syuilo
e31bf214a7 New translations ja.yml (Korean) 2018-08-02 07:11:27 +09:00
syuilo
48c143d47c New translations ja.yml (Polish) 2018-08-02 07:11:26 +09:00
syuilo
35d17d4274 New translations ja.yml (Chinese Simplified) 2018-08-02 07:11:23 +09:00
syuilo
1e2b8cab02 New translations ja.yml (Italian) 2018-08-02 07:11:21 +09:00
syuilo
0a9a45b33b New translations ja.yml (Russian) 2018-08-02 07:11:19 +09:00
syuilo
63a512306d New translations ja.yml (English) 2018-08-02 07:11:17 +09:00
syuilo
190c0c687c New translations ja.yml (Spanish) 2018-08-02 07:11:15 +09:00
syuilo
c7094986c9 New translations ja.yml (German) 2018-08-02 07:11:13 +09:00
syuilo
c201a65f82 New translations ja.yml (French) 2018-08-02 07:11:11 +09:00
syuilo
dd167a476f Remove some outdated tips 2018-08-02 07:06:31 +09:00
syuilo
b255bbf62a New translations ja.yml (Catalan) 2018-08-02 07:01:32 +09:00
syuilo
e19300f424 New translations ja.yml (Portuguese) 2018-08-02 07:01:31 +09:00
syuilo
aeb0512eaf New translations ja.yml (Korean) 2018-08-02 07:01:29 +09:00
syuilo
192abef237 New translations ja.yml (Polish) 2018-08-02 07:01:27 +09:00
syuilo
2d278c563e New translations ja.yml (Chinese Simplified) 2018-08-02 07:01:25 +09:00
syuilo
7de9066dda New translations ja.yml (Italian) 2018-08-02 07:01:23 +09:00
syuilo
5a2a2371fb New translations ja.yml (Russian) 2018-08-02 07:01:21 +09:00
syuilo
a433a25b16 New translations ja.yml (English) 2018-08-02 07:01:19 +09:00
syuilo
9098aaee3e New translations ja.yml (Spanish) 2018-08-02 07:01:17 +09:00
syuilo
ea28b788bc New translations ja.yml (German) 2018-08-02 07:01:14 +09:00
syuilo
bd9981b998 New translations ja.yml (French) 2018-08-02 07:01:12 +09:00
syuilo
b7f1b087e8 Merge branch 'master' of https://github.com/syuilo/misskey 2018-08-02 06:58:17 +09:00
syuilo
b0fdf25b24 Improve i18n 2018-08-02 06:58:15 +09:00
syuilo
58f6e4cf00 New translations ja.yml (Catalan) 2018-08-02 06:51:58 +09:00
syuilo
d6fe396c76 New translations ja.yml (Portuguese) 2018-08-02 06:51:56 +09:00
syuilo
5a01c6c9a5 New translations ja.yml (Korean) 2018-08-02 06:51:54 +09:00
syuilo
dc98b2b5c2 New translations ja.yml (Polish) 2018-08-02 06:51:53 +09:00
syuilo
60626c2a07 New translations ja.yml (Chinese Simplified) 2018-08-02 06:51:50 +09:00
syuilo
0459ce07fa New translations ja.yml (Italian) 2018-08-02 06:51:48 +09:00
syuilo
b480865031 New translations ja.yml (Russian) 2018-08-02 06:51:46 +09:00
syuilo
c928d38ec0 New translations ja.yml (English) 2018-08-02 06:51:44 +09:00
syuilo
1f44602f38 New translations ja.yml (Spanish) 2018-08-02 06:51:42 +09:00
syuilo
932d007745 New translations ja.yml (German) 2018-08-02 06:51:40 +09:00
syuilo
a1dd839909 New translations ja.yml (French) 2018-08-02 06:51:37 +09:00
syuilo
12b1c6c886 Merge pull request #2055 from syuilo/greenkeeper/vue-2.5.17
Update vue to the latest version 🚀
2018-08-02 06:50:21 +09:00
greenkeeper[bot]
e4a4a4a469 fix(package): update vue to version 2.5.17 2018-08-01 21:48:35 +00:00
syuilo
2ffb8f7cf8 Merge pull request #2054 from syuilo/greenkeeper/vue-template-compiler-2.5.17
Update vue-template-compiler to the latest version 🚀
2018-08-02 06:46:23 +09:00
syuilo
25dec8b977 Merge pull request #2053 from gutfuckllc/devel
Translated the totality of desktop views and common views, a great bunch of mobile views
2018-08-02 06:44:46 +09:00
greenkeeper[bot]
8b4ee292b1 fix(package): update vue-template-compiler to version 2.5.17 2018-08-01 21:41:18 +00:00
gutfuckllc
2f8b64d6fb Translated mobile/views/pages/widgets/activity.vue and mobile/views/pages/widgets.vue 2018-08-01 17:34:27 -04:00
gutfuckllc
b608e594af Translated mobile/views/pages/welcome.vue 2018-08-01 17:30:54 -04:00
gutfuckllc
9652440579 Translated mobile/views/pages/welcome.vue 2018-08-01 17:30:35 -04:00
gutfuckllc
55d2ae2050 Translated mobile/views/pages/signup.vue 2018-08-01 16:43:47 -04:00
gutfuckllc
bdde0c3c63 Fixed welcome.vue build bug. 2018-08-01 16:37:36 -04:00
gutfuckllc
08afa44e09 Localized mobile/views/pages/reversi.vue
Also added common.name line, as to allow easier rebranding.
2018-08-01 15:09:42 -04:00
gutfuckllc
3ec3fa2d1e Localized mobile/views/components/ui.header.vue
Also added name i18n line, as to allow easier rebranding should there be any.
2018-08-01 15:04:00 -04:00
gutfuckllc
df74a4eb20 Forgot to add vue. here 2018-08-01 14:55:30 -04:00
gutfuckllc
fdaf483293 Added i18n line and typo fix to desktop/views/pages/welcome.vue: 2018-08-01 14:54:57 -04:00
gutfuckllc
5ab4d0c29b Translated desktop/views/pages/tag.vue
More weird syntax fiddling. Should work nonetheless
2018-08-01 14:52:53 -04:00
gutfuckllc
d6fab5fd6c Translated desktop/views/components/settings.drive.vue 2018-08-01 14:42:52 -04:00
gutfuckllc
8df35650e5 Merge remote-tracking branch 'upstream/master' into devel 2018-08-01 14:26:08 -04:00
gutfuckllc
c5b682dc89 common/views/widgets/calendar.vue
Did weird formatting tricks. Hopefully should work.
2018-08-01 14:25:55 -04:00
gutfuckllc
86d49c6704 Translated common/views/widgets/tips.vue
Double lines. Might want to check that.
2018-08-01 14:14:53 -04:00
greenkeeper[bot]
9e251b3ea0 fix(package): update sass-loader to version 7.1.0 2018-08-02 01:49:40 +09:00
gutfuckllc
8630cd8df6 Merge remote-tracking branch 'upstream/master' into devel 2018-08-01 12:35:51 -04:00
gutfuckllc
e42c8859b4 Translated desktop\views\pages\search.vue
Needed some weird text hack. Might want to check it later.
2018-08-01 12:20:41 -04:00
gutfuckllc
3636db3f85 Translated desktop/views/pages/share.vue 2018-08-01 12:09:59 -04:00
syuilo
fd4d03db58 Merge pull request #2043 from syuilo/greenkeeper/@types/node-10.5.5
Update @types/node to the latest version 🚀
2018-08-01 11:15:42 +09:00
syuilo
2c3ea0cfef Fix #2042 2018-08-01 11:07:30 +09:00
greenkeeper[bot]
bc34b4f198 fix(package): update @types/node to version 10.5.5 2018-08-01 01:40:10 +00:00
syuilo
e93503066c 5.9.0 2018-08-01 08:45:35 +09:00
syuilo
c4351acf7c Clean up 2018-08-01 08:44:58 +09:00
syuilo
bffd7bbb3b Clean up 2018-08-01 08:38:56 +09:00
syuilo
aad131c913 Merge pull request #2037 from syuilo/l10n_master
New Crowdin translations
2018-08-01 08:34:45 +09:00
syuilo
77faf7a84c Merge branch 'master' into l10n_master 2018-08-01 08:34:22 +09:00
syuilo
86a7c4772e New translations ja.yml (English) 2018-08-01 08:31:12 +09:00
syuilo
7430e258b1 New translations ja.yml (French) 2018-08-01 08:31:10 +09:00
syuilo
4efdd90066 New translations ja.yml (Catalan) 2018-08-01 08:21:28 +09:00
syuilo
4c0da272ce New translations ja.yml (Portuguese) 2018-08-01 08:21:26 +09:00
syuilo
cf48b5348f New translations ja.yml (Korean) 2018-08-01 08:21:24 +09:00
syuilo
aa74262564 New translations ja.yml (Polish) 2018-08-01 08:21:22 +09:00
syuilo
209383274e New translations ja.yml (Chinese Simplified) 2018-08-01 08:21:20 +09:00
syuilo
c6b1f206a6 New translations ja.yml (Italian) 2018-08-01 08:21:18 +09:00
syuilo
be504fc1fc New translations ja.yml (Russian) 2018-08-01 08:21:16 +09:00
syuilo
7118f7fec1 New translations ja.yml (English) 2018-08-01 08:21:14 +09:00
syuilo
7451a735e6 New translations ja.yml (Spanish) 2018-08-01 08:21:12 +09:00
syuilo
604a900664 New translations ja.yml (German) 2018-08-01 08:21:09 +09:00
syuilo
d7066de378 New translations ja.yml (French) 2018-08-01 08:21:07 +09:00
syuilo
f0bfb051c3 Merge pull request #2033 from syuilo/greenkeeper/qrcode-1.2.2
Update qrcode to the latest version 🚀
2018-08-01 08:18:40 +09:00
syuilo
54c4eb512f Merge pull request #2038 from gutfuckllc/devel
Translated slideshow.vue
2018-08-01 08:18:05 +09:00
gutfuckllc
3750b4d7d0 Translated slieshow.vue 2018-07-31 19:12:30 -04:00
syuilo
29c5f8c8e7 New translations ja.yml (Catalan) 2018-08-01 08:11:45 +09:00
syuilo
6b87edf63b New translations ja.yml (Portuguese) 2018-08-01 08:11:43 +09:00
syuilo
9b3180d74f New translations ja.yml (Korean) 2018-08-01 08:11:41 +09:00
syuilo
70331a0383 New translations ja.yml (Polish) 2018-08-01 08:11:39 +09:00
syuilo
2220b852c0 New translations ja.yml (Chinese Simplified) 2018-08-01 08:11:37 +09:00
syuilo
e5fa171df5 New translations ja.yml (Italian) 2018-08-01 08:11:35 +09:00
syuilo
d083c10ae3 New translations ja.yml (Russian) 2018-08-01 08:11:33 +09:00
syuilo
7a37b1c641 New translations ja.yml (English) 2018-08-01 08:11:30 +09:00
syuilo
e54449fbdb New translations ja.yml (Spanish) 2018-08-01 08:11:29 +09:00
syuilo
b5b384772a New translations ja.yml (German) 2018-08-01 08:11:26 +09:00
syuilo
733755bb5a New translations ja.yml (French) 2018-08-01 08:11:24 +09:00
syuilo
d6341d8ab6 Merge pull request #2036 from gutfuckllc/devel
Translated more/ Should build
2018-08-01 08:11:01 +09:00
gutfuckllc
b39384258c Added i18n line to hint
home.vue
2018-07-31 18:54:43 -04:00
gutfuckllc
dfa032d3f2 Escaped quotes
Should stop permanent breakages
2018-07-31 14:58:58 -04:00
gutfuckllc
f28fc08a57 Bettered french translation 2018-07-31 14:31:28 -04:00
gutfuckllc
e20e35c48d Unbroken more yaml 2018-07-31 14:29:28 -04:00
gutfuckllc
bddb47b0bd Unbroken yaml 2018-07-31 14:28:08 -04:00
gutfuckllc
469b21bb29 Translated customization tips to french 2018-07-31 14:25:56 -04:00
gutfuckllc
0a8213b851 Fully translated settings.profile.vue
Added relevant translation lines
2018-07-31 14:03:43 -04:00
gutfuckllc
460a4edb13 Added uncommitted file 2018-07-31 13:56:21 -04:00
gutfuckllc
2855ec0372 Reformat, more translation
Translated the totality of desktop/post-form.vue, reformated customization-tips.
2018-07-31 13:54:12 -04:00
gutfuckllc
0f34ed3ccd Added got it to the local files
Home.vue got it was still untranslated. It now has a localization file
2018-07-31 13:32:18 -04:00
gutfuckllc
cbb73e4e15 Localized customization tips on home.vue
Added relevant customization lines.
2018-07-31 13:29:18 -04:00
greenkeeper[bot]
99de2cd0ae fix(package): update qrcode to version 1.2.2 2018-07-31 16:16:30 +00:00
gutfuckllc
aed7d06af5 Translated trash on main menu
Translated trash on main menu
2018-07-31 11:36:15 -04:00
greenkeeper[bot]
2c348b51f1 fix(package): update @types/koa__cors to version 2.2.3 2018-07-31 12:24:22 +09:00
greenkeeper[bot]
14ac8327cf fix(package): update hard-source-webpack-plugin to version 0.12.0 2018-07-30 22:10:49 +09:00
syuilo
c520f17f3b New Crowdin translations (#2026)
* New translations ja.yml
2018-07-30 20:55:37 +09:00
syuilo
6c3d3ed322 New translations ja.yml (English) 2018-07-30 20:41:43 +09:00
syuilo
f4cf3840e4 New translations ja.yml (Catalan) 2018-07-30 20:21:45 +09:00
syuilo
3b2f116af0 New translations ja.yml (Portuguese) 2018-07-30 20:21:43 +09:00
syuilo
bba8f87687 New translations ja.yml (Korean) 2018-07-30 20:21:41 +09:00
syuilo
41b799b369 New translations ja.yml (Polish) 2018-07-30 20:21:39 +09:00
syuilo
d59c6af32c New translations ja.yml (Chinese Simplified) 2018-07-30 20:21:37 +09:00
syuilo
1b5023793a New translations ja.yml (Italian) 2018-07-30 20:21:34 +09:00
syuilo
f01a62c83b New translations ja.yml (Russian) 2018-07-30 20:21:31 +09:00
syuilo
ca84202f4c New translations ja.yml (English) 2018-07-30 20:21:29 +09:00
syuilo
9d7ffd1ae1 New translations ja.yml (Spanish) 2018-07-30 20:21:26 +09:00
syuilo
8f6886db82 New translations ja.yml (German) 2018-07-30 20:21:24 +09:00
syuilo
da5e708e0f New translations ja.yml (French) 2018-07-30 20:21:22 +09:00
Aya Morisawa
ff6993478f #332 2018-07-30 20:13:30 +09:00
syuilo
a54950f101 5.8.0 2018-07-30 16:25:22 +09:00
syuilo
6b567fdc05 ドキュメントにDisqus設置 2018-07-30 16:24:46 +09:00
syuilo
a4788fae45 Fix doc 2018-07-30 15:49:35 +09:00
syuilo
1ba1a7aa40 Fix bug 2018-07-30 14:46:11 +09:00
syuilo
835057d970 Revert "Fix bug"
This reverts commit 4e6dcd16ac.
2018-07-30 14:45:48 +09:00
syuilo
48f39e70c3 5.7.0 2018-07-30 07:24:22 +09:00
syuilo
3314640b01 Fix bug 2018-07-30 07:23:44 +09:00
syuilo
83d9730d93 #2020 2018-07-30 07:20:27 +09:00
syuilo
4e6dcd16ac Fix bug 2018-07-30 06:20:06 +09:00
syuilo
6debf45004 Merge pull request #2021 from syuilo/l10n_master
New Crowdin translations
2018-07-29 20:37:56 +09:00
syuilo
66b57e11db New translations ja.yml (French) 2018-07-29 20:00:50 +09:00
syuilo
1fc1c8a025 New translations ja.yml (French) 2018-07-29 19:50:57 +09:00
syuilo
6076f52390 Merge pull request #2019 from syuilo/l10n_master
New Crowdin translations
2018-07-29 17:23:21 +09:00
syuilo
3f33dbf6e8 New translations ja.yml (English) 2018-07-29 17:20:46 +09:00
syuilo
33f0dd8d43 #2018 2018-07-29 09:17:07 +09:00
syuilo
921fb0012b Fix bug 2018-07-29 05:34:08 +09:00
syuilo
2bdad9c411 ✌️ 2018-07-28 18:01:49 +09:00
syuilo
01f60c829d ✌️ 2018-07-28 17:57:24 +09:00
syuilo
1d6c0e1c6f Merge branch 'master' of https://github.com/syuilo/misskey 2018-07-28 17:52:56 +09:00
syuilo
fb74f1d72b いくつかのコマンドラインオプションを追加するなど 2018-07-28 17:52:54 +09:00
nzws
33e1c08273 Fix margin in visibleUsers (mobile) 2018-07-28 13:17:32 +09:00
81 changed files with 1966 additions and 465 deletions

View File

@@ -6,6 +6,14 @@ common:
misskey: "A ⭐ of fediverse"
about-title: "A ⭐ of fediverse."
about: "Misskeyを見つけていただき、ありがとうございます。Misskeyは、地球で生まれた<b>分散マイクロブログSNS</b>です。Fediverse(様々なSNSで構成される宇宙)の中に存在するため、他のSNSと相互に繋がっています。暫し都会の喧騒から離れて、新しいインターネットにダイブしてみませんか。"
customization-tips:
title: "カスタマイズのヒント"
paragraph1: "ホームのカスタマイズでは、ウィジェットを追加/削除したり、ドラッグ&ドロップして並べ替えたりすることができます。"
paragraph2: "一部のウィジェットは、<strong><strong>右</strong>クリック</strong>することで表示を変更することができます。"
paragraph3: "ウィジェットを削除するには、ヘッダーの<strong>「ゴミ箱」</strong>と書かれたエリアにウィジェットをドラッグ&ドロップします。"
paragraph4: "カスタマイズを終了するには、右上の「完了」をクリックします。"
gotit: "Got it!"
name: "Misskey"
time:
unknown: "なぞのじかん"
future: "未来"
@@ -17,6 +25,7 @@ common:
weeks_ago: "{}週間前"
months_ago: "{}ヶ月前"
years_ago: "{}年前"
trash: "ゴミ箱"
weekday-short:
sunday: "日"
monday: "月"
@@ -25,6 +34,14 @@ common:
thursday: "木"
friday: "金"
saturday: "土"
weekday:
sunday: "日曜日"
monday: "月曜日"
tuesday: "火曜日"
wednesday: "水曜日"
thursday: "木曜日"
friday: "金曜日"
saturday: "土曜日"
reactions:
like: "いいね"
love: "しゅき"
@@ -58,6 +75,11 @@ common:
opponent-turn: "相手のターンです"
turn-of: "{}のターンです"
past-turn-of: "{}のターン"
won: "{}の勝ち"
black: "黒"
white: "白"
total: "合計"
this-turn: "{}ターン目"
widgets:
analog-clock: "アナログ時計"
profile: "プロフィール"
@@ -99,6 +121,42 @@ common:
rename: "名前を変更"
stack-left: "左に重ねる"
pop-right: "右に出す"
common/views/components/games/reversi/reversi.vue:
title: "Misskey Reversi"
sub-title: "他のMisskeyユーザーとリバーシで対戦しよう"
invite: "招待"
rule: "遊び方"
rule-desc: "リバーシは、相手と交互に石をボードに置いて、相手の石を挟んで自分の色に変えてゆき、最終的に残った石が多い方が勝ちというボードゲームです。"
mode-invite: "招待"
mode-invite-desc: "指定したユーザーと対戦するモードです。"
invitations: "対局の招待があります!"
my-games: "自分の対局"
all-games: "みんなの対局"
enter-username: "ユーザー名を入力してください"
game-state:
ended: "終了"
playing: "進行中"
matching:
waiting-for: "{}を待っています"
cacnel: "キャンセル"
common/views/components/games/reversi/reversi.room.vue:
settings-of-the-game: "ゲームの設定"
choose-map: "マップを選択"
random: "ランダム"
black-or-white: "先手/後手"
black-is: "{}が黒"
rules: "ルール"
is-llotheo: "石の少ない方が勝ち(ロセオ)"
looped-map: "ループマップ"
can-put-everywhere: "どこでも置けるモード"
settings-of-the-bot: "Botの設定"
this-gane-is-started-soon: "ゲームは数秒後に開始されます"
waiting-for-other: "相手の準備が完了するのを待っています"
waiting-for-me: "あなたの準備が完了するのを待っています"
waiting-for-both: "準備中"
cancel: "キャンセル"
ready: "準備完了"
cancel-ready: "準備続行"
common/views/components/connect-failed.vue:
title: "サーバーに接続できません"
description: "インターネット回線に問題があるか、サーバーがダウンまたはメンテナンスしている可能性があります。しばらくしてから{再度お試し}ください。"
@@ -228,6 +286,13 @@ common/views/widgets/broadcast.vue:
no-broadcasts: "お知らせはありません"
have-a-nice-day: "良い一日を!"
next: "次"
common/views/widgets/calendar.vue:
year: "{}年"
month: "{}月"
day: "{}日"
today: "今日:"
this-month: "今月:"
this-year: "今年:"
common/views/widgets/donation.vue:
title: "寄付のお願い"
text: "Misskeyの運営にはドメイン、サーバー等のコストが掛かります。Misskeyは広告を掲載したりしないため、収入を皆様からの寄付に頼っています。もしご興味があれば、{}までご連絡ください。ご協力ありがとうございます。"
@@ -248,6 +313,31 @@ common/views/widgets/memo.vue:
title: "付箋"
memo: "ここに書いて!"
save: "保存"
common/views/widgets/slideshow.vue:
folder-customize-mode: "フォルダを指定するには、カスタマイズモードを終了してください"
folder: "クリックしてフォルダを指定してください"
no-image: "このフォルダには画像がありません"
common/views/widgets/tips.vue:
tips-line1: "<kbd>t</kbd>でタイムラインにフォーカスできます"
tips-line2: "<kbd>p</kbd>または<kbd>n</kbd>で投稿フォームを開きます"
tips-line3: "投稿フォームにはファイルをドラッグ&ドロップできます"
tips-line4: "投稿フォームにクリップボードにある画像データをペーストできます"
tips-line5: "ドライブにファイルをドラッグ&ドロップしてアップロードできます"
tips-line6: "ドライブでファイルをドラッグしてフォルダ移動できます"
tips-line7: "ドライブでフォルダをドラッグしてフォルダ移動できます"
tips-line8: "ホームは設定からカスタマイズできます"
tips-line9: "MisskeyはAGPLv3です"
tips-line10: "タイムマシンウィジェットを利用すると、簡単に過去のタイムラインに遡れます"
tips-line11: "投稿の ... をクリックして、投稿をユーザーページにピン留めできます"
tips-line13: "投稿に添付したファイルは全てドライブに保存されます"
tips-line14: "ホームのカスタマイズ中、ウィジェットを右クリックしてデザインを変更できます"
tips-line17: "「**」でテキストを囲むと**強調表示**されます"
tips-line19: "いくつかのウィンドウはブラウザの外に切り離すことができます"
tips-line20: "カレンダーウィジェットのパーセンテージは、経過の割合を示しています"
tips-line21: "APIを利用してbotの開発なども行えます"
tips-line23: "まゆかわいいよまゆ"
tips-line24: "Misskeyは2014年にサービスを開始しました"
tips-line25: "対応ブラウザではMisskeyを開いていなくても通知を受け取れます"
common/views/pages/follow.vue:
signed-in-as: "{}としてサインイン中"
following: "フォロー中"
@@ -396,6 +486,9 @@ desktop/views/components/notifications.vue:
more: "もっと見る"
empty: "ありません!"
desktop/views/components/post-form.vue:
add-visible-user: "+ユーザーを追加"
attach-location-information: "位置情報を添付する"
hide-contents: "内容を隠す"
reply-placeholder: "この投稿への返信..."
quote-placeholder: "この投稿を引用..."
submit: "投稿"
@@ -416,6 +509,10 @@ desktop/views/components/post-form.vue:
text-remain: "残り{}文字"
recent-tags: "最近"
click-to-tagging: "クリックでタグ付け"
visibility: "公開範囲"
geolocation-alert: "お使いの端末は位置情報に対応していません"
error: "エラー"
enter-username: "ユーザー名を入力してください"
desktop/views/components/post-form-window.vue:
note: "新規投稿"
reply: "返信"
@@ -536,6 +633,9 @@ desktop/views/components/settings.api.vue:
enter-password: "パスワードを入力してください"
desktop/views/components/settings.apps.vue:
no-apps: "連携しているアプリケーションはありません"
desktop/views/components/settings.drive.vue:
max: "中"
in-use: "使用中"
desktop/views/components/settings.mute.vue:
no-users: "ミュートしているユーザーはいません"
desktop/views/components/settings.password.vue:
@@ -558,6 +658,7 @@ desktop/views/components/settings.profile.vue:
other: "その他"
is-bot: "このアカウントはBotです"
is-cat: "このアカウントはCatです"
profile-updated: "プロフィールを更新しました"
desktop/views/components/sub-note-content.vue:
private: "この投稿は非公開です"
deleted: "この投稿は削除されました"
@@ -631,6 +732,7 @@ desktop/views/pages/welcome.vue:
signin-button: "やってる"
signup-button: "やる"
timeline: "タイムライン"
powered-by-misskey: "Powered by <b>Misskey</b>."
desktop/views/pages/drive.vue:
title: "Misskey Drive"
desktop/views/pages/favorites.vue:
@@ -645,6 +747,14 @@ desktop/views/pages/selectdrive.vue:
ok: "決定"
cancel: "キャンセル"
upload: "PCからドライブにファイルをアップロード"
desktop/views/pages/search.vue:
not-available: "検索機能を利用することができません。"
not-found: "「{}」に関する投稿は見つかりませんでした。"
desktop/views/pages/share.vue:
share-with: "Misskeyで共有"
close: "閉じる"
desktop/views/pages/tag.vue:
no-posts-found: "ハッシュタグ「{}」が付けられた投稿は見つかりませんでした。"
desktop/views/pages/user-list.users.vue:
users: "ユーザー"
add-user: "ユーザーを追加"
@@ -800,6 +910,8 @@ mobile/views/components/sub-note-content.vue:
mobile/views/components/timeline.vue:
empty: "投稿がありません"
load-more: "もっと"
mobile/views/components/ui.header.vue:
welcome-back: "おかえりなさい、"
mobile/views/components/ui.nav.vue:
timeline: "タイムライン"
notifications: "通知"
@@ -830,6 +942,8 @@ mobile/views/pages/user-lists.vue:
mobile/views/pages/drive.vue:
drive: "ドライブ"
more: "もっと見る"
mobile/views/pages/signup.vue:
lets-start: "📦 始めましょう"
mobile/views/pages/followers.vue:
followers-of: "{}のフォロワー"
mobile/views/pages/following.vue:
@@ -839,6 +953,14 @@ mobile/views/pages/home.vue:
local: "ローカル"
hybrid: "ソーシャル"
global: "グローバル"
mobile/views/pages/tag.vue:
no-posts-found: "ハッシュタグ「{}」が付けられた投稿は見つかりませんでした。"
mobile/views/pages/welcome.vue:
signup: "新規登録"
mobile/views/pages/widgets.vue:
dashboard: "ダッシュボード"
mobile/views/pages/widgets/activity.vue:
activity: "アクティビティ"
mobile/views/pages/messaging.vue:
messaging: "メッセージ"
mobile/views/pages/messaging-room.vue:
@@ -854,6 +976,8 @@ mobile/views/pages/note.vue:
mobile/views/pages/notifications.vue:
notifications: "通知"
read-all: "すべての通知を既読にしますか?"
mobile/views/pages/reversi.vue:
reversi: "リバーシ"
mobile/views/pages/settings/settings.profile.vue:
title: "プロフィール"
name: "名前"

View File

@@ -6,6 +6,14 @@ common:
misskey: "A ⭐ of fediverse"
about-title: "A ⭐ of fediverse."
about: "Misskeyを見つけていただき、ありがとうございます。Misskeyは、地球で生まれた<b>分散マイクロブログSNS</b>です。Fediverse(様々なSNSで構成される宇宙)の中に存在するため、他のSNSと相互に繋がっています。暫し都会の喧騒から離れて、新しいインターネットにダイブしてみませんか。"
customization-tips:
title: "カスタマイズのヒント"
paragraph1: "ホームのカスタマイズでは、ウィジェットを追加/削除したり、ドラッグ&ドロップして並べ替えたりすることができます。"
paragraph2: "一部のウィジェットは、<strong><strong>右</strong>クリック</strong>することで表示を変更することができます。"
paragraph3: "ウィジェットを削除するには、ヘッダーの<strong>「ゴミ箱」</strong>と書かれたエリアにウィジェットをドラッグ&ドロップします。"
paragraph4: "カスタマイズを終了するには、右上の「完了」をクリックします。"
gotit: "Got it!"
name: "Misskey"
time:
unknown: "Unbekannt"
future: "Zukunft"
@@ -17,6 +25,7 @@ common:
weeks_ago: "vor {0} Woche{0:n}"
months_ago: "vor {0} Monat{0:en}"
years_ago: "vor {} Jahr{0:en}"
trash: "ゴミ箱"
weekday-short:
sunday: "So"
monday: "Mo"
@@ -25,6 +34,14 @@ common:
thursday: "Do"
friday: "Fr"
saturday: "Sa"
weekday:
sunday: "日曜日"
monday: "月曜日"
tuesday: "火曜日"
wednesday: "水曜日"
thursday: "木曜日"
friday: "金曜日"
saturday: "土曜日"
reactions:
like: "Gefällt mir"
love: "Lieben"
@@ -58,6 +75,11 @@ common:
opponent-turn: "相手のターンです"
turn-of: "{}のターンです"
past-turn-of: "{}のターン"
won: "{}の勝ち"
black: "黒"
white: "白"
total: "合計"
this-turn: "{}ターン目"
widgets:
analog-clock: "Analoge Uhr"
profile: "Profil"
@@ -99,6 +121,42 @@ common:
rename: "Umbenennen"
stack-left: "Nach links schichten"
pop-right: "右に出す"
common/views/components/games/reversi/reversi.vue:
title: "Misskey Reversi"
sub-title: "他のMisskeyユーザーとリバーシで対戦しよう"
invite: "招待"
rule: "遊び方"
rule-desc: "リバーシは、相手と交互に石をボードに置いて、相手の石を挟んで自分の色に変えてゆき、最終的に残った石が多い方が勝ちというボードゲームです。"
mode-invite: "招待"
mode-invite-desc: "指定したユーザーと対戦するモードです。"
invitations: "対局の招待があります!"
my-games: "自分の対局"
all-games: "みんなの対局"
enter-username: "ユーザー名を入力してください"
game-state:
ended: "終了"
playing: "進行中"
matching:
waiting-for: "{}を待っています"
cacnel: "キャンセル"
common/views/components/games/reversi/reversi.room.vue:
settings-of-the-game: "ゲームの設定"
choose-map: "マップを選択"
random: "ランダム"
black-or-white: "先手/後手"
black-is: "{}が黒"
rules: "ルール"
is-llotheo: "石の少ない方が勝ち(ロセオ)"
looped-map: "ループマップ"
can-put-everywhere: "どこでも置けるモード"
settings-of-the-bot: "Botの設定"
this-gane-is-started-soon: "ゲームは数秒後に開始されます"
waiting-for-other: "相手の準備が完了するのを待っています"
waiting-for-me: "あなたの準備が完了するのを待っています"
waiting-for-both: "準備中"
cancel: "キャンセル"
ready: "準備完了"
cancel-ready: "準備続行"
common/views/components/connect-failed.vue:
title: "Verbindung zum Server ist fehlgeschlagen"
description: "Es gibt entweder ein Problem mit deiner Internetverbindung, der Server ist nicht erreichbar oder wird gerade gewartet. Bitte versuche es später noch einmal."
@@ -228,6 +286,13 @@ common/views/widgets/broadcast.vue:
no-broadcasts: "Keine Broadcasts"
have-a-nice-day: "Schönen Tag!"
next: "Nächster"
common/views/widgets/calendar.vue:
year: "{}年"
month: "{}月"
day: "{}日"
today: "今日:"
this-month: "今月:"
this-year: "今年:"
common/views/widgets/donation.vue:
title: "Spende"
text: "Um Misskey am Laufen zu halten geben wir Geld für Domain, Server usw. aus. Wir bekommen dafür kein Geld und würden uns freuen, wenn du spenden würdest. Wenn du interessiert bist, dann kontaktiere {}. Danke für deine Unterstützung!"
@@ -248,6 +313,31 @@ common/views/widgets/memo.vue:
title: "Notizen"
memo: "Schreib hier!"
save: "Speichern"
common/views/widgets/slideshow.vue:
folder-customize-mode: "フォルダを指定するには、カスタマイズモードを終了してください"
folder: "クリックしてフォルダを指定してください"
no-image: "このフォルダには画像がありません"
common/views/widgets/tips.vue:
tips-line1: "<kbd>t</kbd>でタイムラインにフォーカスできます"
tips-line2: "<kbd>p</kbd>または<kbd>n</kbd>で投稿フォームを開きます"
tips-line3: "投稿フォームにはファイルをドラッグ&ドロップできます"
tips-line4: "投稿フォームにクリップボードにある画像データをペーストできます"
tips-line5: "ドライブにファイルをドラッグ&ドロップしてアップロードできます"
tips-line6: "ドライブでファイルをドラッグしてフォルダ移動できます"
tips-line7: "ドライブでフォルダをドラッグしてフォルダ移動できます"
tips-line8: "ホームは設定からカスタマイズできます"
tips-line9: "MisskeyはAGPLv3です"
tips-line10: "タイムマシンウィジェットを利用すると、簡単に過去のタイムラインに遡れます"
tips-line11: "投稿の ... をクリックして、投稿をユーザーページにピン留めできます"
tips-line13: "投稿に添付したファイルは全てドライブに保存されます"
tips-line14: "ホームのカスタマイズ中、ウィジェットを右クリックしてデザインを変更できます"
tips-line17: "「**」でテキストを囲むと**強調表示**されます"
tips-line19: "いくつかのウィンドウはブラウザの外に切り離すことができます"
tips-line20: "カレンダーウィジェットのパーセンテージは、経過の割合を示しています"
tips-line21: "APIを利用してbotの開発なども行えます"
tips-line23: "まゆかわいいよまゆ"
tips-line24: "Misskeyは2014年にサービスを開始しました"
tips-line25: "対応ブラウザではMisskeyを開いていなくても通知を受け取れます"
common/views/pages/follow.vue:
signed-in-as: "{}としてサインイン中"
following: "フォロー中"
@@ -396,6 +486,9 @@ desktop/views/components/notifications.vue:
more: "Mehr"
empty: "Keine Benachrichtigungen"
desktop/views/components/post-form.vue:
add-visible-user: "+ユーザーを追加"
attach-location-information: "位置情報を添付する"
hide-contents: "内容を隠す"
reply-placeholder: "Antworte auf diese Anmerkung..."
quote-placeholder: "Zitiere diese Anmerkung..."
submit: "Beitragsform"
@@ -416,6 +509,10 @@ desktop/views/components/post-form.vue:
text-remain: "{} Zeichen verbleibend"
recent-tags: "最近"
click-to-tagging: "クリックでタグ付け"
visibility: "公開範囲"
geolocation-alert: "お使いの端末は位置情報に対応していません"
error: "エラー"
enter-username: "ユーザー名を入力してください"
desktop/views/components/post-form-window.vue:
note: "Neue Notiz"
reply: "Antworten"
@@ -536,6 +633,9 @@ desktop/views/components/settings.api.vue:
enter-password: "Bitte Passwort eingeben"
desktop/views/components/settings.apps.vue:
no-apps: "連携しているアプリケーションはありません"
desktop/views/components/settings.drive.vue:
max: "中"
in-use: "使用中"
desktop/views/components/settings.mute.vue:
no-users: "ミュートしているユーザーはいません"
desktop/views/components/settings.password.vue:
@@ -558,6 +658,7 @@ desktop/views/components/settings.profile.vue:
other: "その他"
is-bot: "このアカウントはBotです"
is-cat: "このアカウントはCatです"
profile-updated: "プロフィールを更新しました"
desktop/views/components/sub-note-content.vue:
private: "この投稿は非公開です"
deleted: "この投稿は削除されました"
@@ -631,6 +732,7 @@ desktop/views/pages/welcome.vue:
signin-button: "やってる"
signup-button: "やる"
timeline: "タイムライン"
powered-by-misskey: "Powered by <b>Misskey</b>."
desktop/views/pages/drive.vue:
title: "Misskey Drive"
desktop/views/pages/favorites.vue:
@@ -645,6 +747,14 @@ desktop/views/pages/selectdrive.vue:
ok: "OK"
cancel: "Abbrechen"
upload: "PCからドライブにファイルをアップロード"
desktop/views/pages/search.vue:
not-available: "検索機能を利用することができません。"
not-found: "「{}」に関する投稿は見つかりませんでした。"
desktop/views/pages/share.vue:
share-with: "Misskeyで共有"
close: "閉じる"
desktop/views/pages/tag.vue:
no-posts-found: "ハッシュタグ「{}」が付けられた投稿は見つかりませんでした。"
desktop/views/pages/user-list.users.vue:
users: "ユーザー"
add-user: "ユーザーを追加"
@@ -800,6 +910,8 @@ mobile/views/components/sub-note-content.vue:
mobile/views/components/timeline.vue:
empty: "投稿がありません"
load-more: "もっと"
mobile/views/components/ui.header.vue:
welcome-back: "おかえりなさい、"
mobile/views/components/ui.nav.vue:
timeline: "タイムライン"
notifications: "通知"
@@ -830,6 +942,8 @@ mobile/views/pages/user-lists.vue:
mobile/views/pages/drive.vue:
drive: "ドライブ"
more: "もっと見る"
mobile/views/pages/signup.vue:
lets-start: "📦 始めましょう"
mobile/views/pages/followers.vue:
followers-of: "{}のフォロワー"
mobile/views/pages/following.vue:
@@ -839,6 +953,14 @@ mobile/views/pages/home.vue:
local: "ローカル"
hybrid: "ソーシャル"
global: "グローバル"
mobile/views/pages/tag.vue:
no-posts-found: "ハッシュタグ「{}」が付けられた投稿は見つかりませんでした。"
mobile/views/pages/welcome.vue:
signup: "新規登録"
mobile/views/pages/widgets.vue:
dashboard: "ダッシュボード"
mobile/views/pages/widgets/activity.vue:
activity: "アクティビティ"
mobile/views/pages/messaging.vue:
messaging: "メッセージ"
mobile/views/pages/messaging-room.vue:
@@ -854,6 +976,8 @@ mobile/views/pages/note.vue:
mobile/views/pages/notifications.vue:
notifications: "通知"
read-all: "すべての通知を既読にしますか?"
mobile/views/pages/reversi.vue:
reversi: "リバーシ"
mobile/views/pages/settings/settings.profile.vue:
title: "Profil"
name: "名前"

View File

@@ -6,6 +6,14 @@ common:
misskey: "A ⭐ of the fediverse"
about-title: "A ⭐ of the fediverse."
about: "Thank you for finding Misskey. Misskey is a <b>decentralized microblogging platform</b> born on Earth. Since it exists within the Fediverse (a universe where various social media platforms are organized), it is mutually linked with other social media platforms. Why don't you take a short break from the hustle and bustle of the city, and dive into a new Internet?"
customization-tips:
title: "Customization tips"
paragraph1: "Home customization allows you to add/delete, drag and drop and rearrange widgets."
paragraph2: "You can change the display by <strong>right clicking</strong> on some widgets."
paragraph3: "To delete a widget, <strong>drag and drop the widget onto the area labeled \"Trash\"</strong> in the header."
paragraph4: "To finish the customization, click \"Finish\" in the upper right."
gotit: "Got it!"
name: "Misskey"
time:
unknown: "unknown"
future: "future"
@@ -17,6 +25,7 @@ common:
weeks_ago: "{}week(s) ago"
months_ago: "{}month(s) ago"
years_ago: "{}year(s) ago"
trash: "Trash"
weekday-short:
sunday: "S"
monday: "M"
@@ -25,6 +34,14 @@ common:
thursday: "T"
friday: "F"
saturday: "S"
weekday:
sunday: "Sunday"
monday: "Monday"
tuesday: "Tuesday"
wednesday: "Wednesday"
thursday: "Thursday"
friday: "Friday"
saturday: "Saturday"
reactions:
like: "Like"
love: "Love"
@@ -58,6 +75,11 @@ common:
opponent-turn: "Opponent's turn"
turn-of: "{}'s turn"
past-turn-of: "{}'s turn"
won: "{} won"
black: "Black"
white: "White"
total: "Total"
this-turn: "Turn {}"
widgets:
analog-clock: "Analog clock"
profile: "Profile"
@@ -99,6 +121,42 @@ common:
rename: "Rename"
stack-left: "Stack to the left"
pop-right: "Dock on the right"
common/views/components/games/reversi/reversi.vue:
title: "Misskey Reversi"
sub-title: "Play reversi with your friends!"
invite: "Invite"
rule: "How to play"
rule-desc: "Reversi is a strategy board game for two players, played on an 8×8 uncheckered board. There are sixty-four identical game pieces called disks (often spelled \"discs\"), which are light on one side and dark on the other. Players take turns placing disks on the board with their assigned color facing up. During a play, any disks of the opponent's color that are in a straight line and bounded by the disk just placed and another disk of the current player's color are turned over to the current player's color. The object of the game is to have the majority of disks turned to display your color when the last playable empty square is filled."
mode-invite: "Invite"
mode-invite-desc: "Invite to the game a user"
invitations: "You received invitation!"
my-games: "My games"
all-games: "All games"
enter-username: "Enter username"
game-state:
ended: "Ended"
playing: "In Progress"
matching:
waiting-for: "Waiting for {}"
cacnel: "Cancel"
common/views/components/games/reversi/reversi.room.vue:
settings-of-the-game: "Game settings"
choose-map: "Choose a map"
random: "Random"
black-or-white: "Black/White"
black-is: "Black is {}"
rules: "Rules"
is-llotheo: "The lesser one wins"
looped-map: "Looped map"
can-put-everywhere: "Can put everywhere"
settings-of-the-bot: "Bot settings"
this-gane-is-started-soon: "This game will start soon"
waiting-for-other: "Waiting for the other party's preparation"
waiting-for-me: "Waiting for the your preparation"
waiting-for-both: "Waiting for yours"
cancel: "Cancel"
ready: "Ready"
cancel-ready: "Cancel \"Ready\""
common/views/components/connect-failed.vue:
title: "Unable to connect to the server"
description: "There is a problem with your Internet connection, or the server may be down or under maintenance. Please try again later."
@@ -154,8 +212,8 @@ common/views/components/note-menu.vue:
favorite: "Favorite this note"
pin: "Pin to your profile page"
delete: "Delete"
delete-confirm: "Delete this post for sure?"
remote: "Show the originating note"
delete-confirm: "Are you sure you want to delete this post?"
remote: "Show original note"
common/views/components/poll.vue:
vote-to: "Vote for '{}'"
vote-count: "{} votes"
@@ -228,6 +286,13 @@ common/views/widgets/broadcast.vue:
no-broadcasts: "No announcements"
have-a-nice-day: "Have a nice day!"
next: "Next"
common/views/widgets/calendar.vue:
year: "Year {}"
month: "Month {}"
day: "Day {}"
today: "Today: "
this-month: "This month: "
this-year: "This year: "
common/views/widgets/donation.vue:
title: "Request for donations"
text: "To keep Misskey up and running, we have to spend money on our domain name, the server costs and so on. Since we don't receive money from advertisements, we count on donations from all of you. If you're interested in helping, contact {}. Thank you for your contribution!"
@@ -248,6 +313,31 @@ common/views/widgets/memo.vue:
title: "Sticky note"
memo: "Write here!"
save: "Save"
common/views/widgets/slideshow.vue:
folder-customize-mode: "To specify a folder, please exit customize mode"
folder: "Please click and specify a folder"
no-image: "There is no image in this folder"
common/views/widgets/tips.vue:
tips-line1: "You can focus on the timeline with <kbd>t</kbd>."
tips-line2: "Open posting form with <kbd>p</kbd> or <kbd>n</kbd>."
tips-line3: "You can drag and drop files on the post form."
tips-line4: "You can paste an image from the clipboard into the submission form."
tips-line5: "You can upload files by dragging and dropping them to Drive."
tips-line6: "You can move a folder by dragging it within the Drive."
tips-line7: "You can move folders by dragging them within the Drive."
tips-line8: "Home can be customized from the settings."
tips-line9: "Misskey is licensed under AGPLv3."
tips-line10: "Using the Time Machine widget makes it easy to trace back to the past timeline."
tips-line11: "You can pin posts to user page by clicking on \"...\""
tips-line13: "All the files attached to the post are saved to Drive."
tips-line14: "While customizing the home, you can right click on the widget and change the design."
tips-line17: "Surrounding the text with ** ** will highlight it."
tips-line19: "Several windows can be detached outside the browser."
tips-line20: "The percentage of the calendar widget shows the percentage of time elapsed."
tips-line21: "You can also use the API to develop bots."
tips-line23: "Mayu is so cute with its eyebrows."
tips-line24: "Misskey started in 2014."
tips-line25: "You can receive notification even if Misskey is not open in a compatible browser."
common/views/pages/follow.vue:
signed-in-as: "Signed in as {}"
following: "Following"
@@ -396,6 +486,9 @@ desktop/views/components/notifications.vue:
more: "More"
empty: "No notifications!"
desktop/views/components/post-form.vue:
add-visible-user: "+Add a user"
attach-location-information: "Attach location information"
hide-contents: "Hide contents"
reply-placeholder: "Reply to this note..."
quote-placeholder: "Quote this note..."
submit: "Post"
@@ -416,6 +509,10 @@ desktop/views/components/post-form.vue:
text-remain: "{} characters remaining"
recent-tags: "Recent"
click-to-tagging: "Click to tagging"
visibility: "Visibility"
geolocation-alert: "Your device does not support geolocalization."
error: "Error"
enter-username: "Please enter a username..."
desktop/views/components/post-form-window.vue:
note: "New note"
reply: "Reply"
@@ -536,6 +633,9 @@ desktop/views/components/settings.api.vue:
enter-password: "Please enter the password"
desktop/views/components/settings.apps.vue:
no-apps: "No linked applications"
desktop/views/components/settings.drive.vue:
max: "Max "
in-use: " in use."
desktop/views/components/settings.mute.vue:
no-users: "No muted users"
desktop/views/components/settings.password.vue:
@@ -558,6 +658,7 @@ desktop/views/components/settings.profile.vue:
other: "Other"
is-bot: "This account is a Bot"
is-cat: "This account is a Cat"
profile-updated: "Profile updated"
desktop/views/components/sub-note-content.vue:
private: "This post is private"
deleted: "This post has been deleted"
@@ -631,6 +732,7 @@ desktop/views/pages/welcome.vue:
signin-button: "Log in"
signup-button: "Sign up"
timeline: "Timeline"
powered-by-misskey: "Powered by <b>Misskey</b>."
desktop/views/pages/drive.vue:
title: "Misskey storage"
desktop/views/pages/favorites.vue:
@@ -645,6 +747,14 @@ desktop/views/pages/selectdrive.vue:
ok: "OK"
cancel: "Cancel"
upload: "Upload files from your device"
desktop/views/pages/search.vue:
not-available: "The search function can not be used."
not-found: "No posts were found for '{}'"
desktop/views/pages/share.vue:
share-with: "Share with Misskey"
close: "Close"
desktop/views/pages/tag.vue:
no-posts-found: "ハッシュタグ「{}」が付けられた投稿は見つかりませんでした。"
desktop/views/pages/user-list.users.vue:
users: "User"
add-user: "Add a user"
@@ -800,6 +910,8 @@ mobile/views/components/sub-note-content.vue:
mobile/views/components/timeline.vue:
empty: "No notes"
load-more: "More"
mobile/views/components/ui.header.vue:
welcome-back: "Welcome back, "
mobile/views/components/ui.nav.vue:
timeline: "Timeline"
notifications: "Notifications"
@@ -830,6 +942,8 @@ mobile/views/pages/user-lists.vue:
mobile/views/pages/drive.vue:
drive: "Drive"
more: "Load more"
mobile/views/pages/signup.vue:
lets-start: "Let's start! 📦"
mobile/views/pages/followers.vue:
followers-of: "Followers of {}"
mobile/views/pages/following.vue:
@@ -839,6 +953,14 @@ mobile/views/pages/home.vue:
local: "Local"
hybrid: "Social"
global: "Global"
mobile/views/pages/tag.vue:
no-posts-found: "ハッシュタグ「{}」が付けられた投稿は見つかりませんでした。"
mobile/views/pages/welcome.vue:
signup: "Sign up"
mobile/views/pages/widgets.vue:
dashboard: "Dashboard"
mobile/views/pages/widgets/activity.vue:
activity: "Activity"
mobile/views/pages/messaging.vue:
messaging: "Messaging"
mobile/views/pages/messaging-room.vue:
@@ -854,6 +976,8 @@ mobile/views/pages/note.vue:
mobile/views/pages/notifications.vue:
notifications: "Notifications"
read-all: "Do you wish to mark all notifications as read?"
mobile/views/pages/reversi.vue:
reversi: "Reversi"
mobile/views/pages/settings/settings.profile.vue:
title: "Profile"
name: "Name"
@@ -957,8 +1081,8 @@ docs:
require-permission: "This endpoint requires {permission} permission."
has-limit: "There is a rate limit."
duration-limit: "You can't request when a frequency of a request in during {duration} milliseconds exceeds {max} times."
min-interval-limit: "You can't request before {interval} milliseconds has passed since previous request."
show-src: "You can view source code for this endpoint."
min-interval-limit: "You can't request before {interval} milliseconds have passed since the previous request."
show-src: "You can view the source code for this endpoint."
show-src-link: "See the code on GitHub"
generated: "This doc is generated by an API definition."
props:

View File

@@ -6,6 +6,14 @@ common:
misskey: "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?"
customization-tips:
title: "カスタマイズのヒント"
paragraph1: "ホームのカスタマイズでは、ウィジェットを追加/削除したり、ドラッグ&ドロップして並べ替えたりすることができます。"
paragraph2: "一部のウィジェットは、<strong><strong>右</strong>クリック</strong>することで表示を変更することができます。"
paragraph3: "ウィジェットを削除するには、ヘッダーの<strong>「ゴミ箱」</strong>と書かれたエリアにウィジェットをドラッグ&ドロップします。"
paragraph4: "カスタマイズを終了するには、右上の「完了」をクリックします。"
gotit: "Got it!"
name: "Misskey"
time:
unknown: "Desconocido"
future: "Futuro"
@@ -17,6 +25,7 @@ common:
weeks_ago: "Hace {} semana(s)"
months_ago: "Hace {} mes(es)"
years_ago: "Hace {} año(s)"
trash: "ゴミ箱"
weekday-short:
sunday: "domingo"
monday: "lunes"
@@ -25,6 +34,14 @@ common:
thursday: "jueves"
friday: "viernes"
saturday: "sábado"
weekday:
sunday: "日曜日"
monday: "月曜日"
tuesday: "火曜日"
wednesday: "水曜日"
thursday: "木曜日"
friday: "金曜日"
saturday: "土曜日"
reactions:
like: "me gusta"
love: "amor"
@@ -58,6 +75,11 @@ common:
opponent-turn: "相手のターンです"
turn-of: "{}のターンです"
past-turn-of: "{}のターン"
won: "{}の勝ち"
black: "黒"
white: "白"
total: "合計"
this-turn: "{}ターン目"
widgets:
analog-clock: "Reloj analógico"
profile: "Perfil"
@@ -99,6 +121,42 @@ common:
rename: "Renombrar"
stack-left: "A la izqda."
pop-right: "A la dcha."
common/views/components/games/reversi/reversi.vue:
title: "Misskey Reversi"
sub-title: "他のMisskeyユーザーとリバーシで対戦しよう"
invite: "招待"
rule: "遊び方"
rule-desc: "リバーシは、相手と交互に石をボードに置いて、相手の石を挟んで自分の色に変えてゆき、最終的に残った石が多い方が勝ちというボードゲームです。"
mode-invite: "招待"
mode-invite-desc: "指定したユーザーと対戦するモードです。"
invitations: "対局の招待があります!"
my-games: "自分の対局"
all-games: "みんなの対局"
enter-username: "ユーザー名を入力してください"
game-state:
ended: "終了"
playing: "進行中"
matching:
waiting-for: "{}を待っています"
cacnel: "キャンセル"
common/views/components/games/reversi/reversi.room.vue:
settings-of-the-game: "ゲームの設定"
choose-map: "マップを選択"
random: "ランダム"
black-or-white: "先手/後手"
black-is: "{}が黒"
rules: "ルール"
is-llotheo: "石の少ない方が勝ち(ロセオ)"
looped-map: "ループマップ"
can-put-everywhere: "どこでも置けるモード"
settings-of-the-bot: "Botの設定"
this-gane-is-started-soon: "ゲームは数秒後に開始されます"
waiting-for-other: "相手の準備が完了するのを待っています"
waiting-for-me: "あなたの準備が完了するのを待っています"
waiting-for-both: "準備中"
cancel: "キャンセル"
ready: "準備完了"
cancel-ready: "準備続行"
common/views/components/connect-failed.vue:
title: "Imposible conectar al servidor"
description: "Hay un problema en tu conexió o puede que el servidor esté caido o en mantenimiento. Por favor {try again} más tarde."
@@ -228,6 +286,13 @@ common/views/widgets/broadcast.vue:
no-broadcasts: "Sin emisión"
have-a-nice-day: "¡Buenos dias!"
next: "Siguiente"
common/views/widgets/calendar.vue:
year: "{}年"
month: "{}月"
day: "{}日"
today: "今日:"
this-month: "今月:"
this-year: "今年:"
common/views/widgets/donation.vue:
title: "Donaciones"
text: "Misskeyの運営にはドメイン、サーバー等のコストが掛かります。Misskeyは広告を掲載したりしないため、収入を皆様からの寄付に頼っています。もしご興味があれば、{}までご連絡ください。ご協力ありがとうございます。"
@@ -248,6 +313,31 @@ common/views/widgets/memo.vue:
title: "付箋"
memo: "ここに書いて!"
save: "保存"
common/views/widgets/slideshow.vue:
folder-customize-mode: "フォルダを指定するには、カスタマイズモードを終了してください"
folder: "クリックしてフォルダを指定してください"
no-image: "このフォルダには画像がありません"
common/views/widgets/tips.vue:
tips-line1: "<kbd>t</kbd>でタイムラインにフォーカスできます"
tips-line2: "<kbd>p</kbd>または<kbd>n</kbd>で投稿フォームを開きます"
tips-line3: "投稿フォームにはファイルをドラッグ&ドロップできます"
tips-line4: "投稿フォームにクリップボードにある画像データをペーストできます"
tips-line5: "ドライブにファイルをドラッグ&ドロップしてアップロードできます"
tips-line6: "ドライブでファイルをドラッグしてフォルダ移動できます"
tips-line7: "ドライブでフォルダをドラッグしてフォルダ移動できます"
tips-line8: "ホームは設定からカスタマイズできます"
tips-line9: "MisskeyはAGPLv3です"
tips-line10: "タイムマシンウィジェットを利用すると、簡単に過去のタイムラインに遡れます"
tips-line11: "投稿の ... をクリックして、投稿をユーザーページにピン留めできます"
tips-line13: "投稿に添付したファイルは全てドライブに保存されます"
tips-line14: "ホームのカスタマイズ中、ウィジェットを右クリックしてデザインを変更できます"
tips-line17: "「**」でテキストを囲むと**強調表示**されます"
tips-line19: "いくつかのウィンドウはブラウザの外に切り離すことができます"
tips-line20: "カレンダーウィジェットのパーセンテージは、経過の割合を示しています"
tips-line21: "APIを利用してbotの開発なども行えます"
tips-line23: "まゆかわいいよまゆ"
tips-line24: "Misskeyは2014年にサービスを開始しました"
tips-line25: "対応ブラウザではMisskeyを開いていなくても通知を受け取れます"
common/views/pages/follow.vue:
signed-in-as: "{}としてサインイン中"
following: "フォロー中"
@@ -396,6 +486,9 @@ desktop/views/components/notifications.vue:
more: "もっと見る"
empty: "ありません!"
desktop/views/components/post-form.vue:
add-visible-user: "+ユーザーを追加"
attach-location-information: "位置情報を添付する"
hide-contents: "内容を隠す"
reply-placeholder: "この投稿への返信..."
quote-placeholder: "この投稿を引用..."
submit: "投稿"
@@ -416,6 +509,10 @@ desktop/views/components/post-form.vue:
text-remain: "quedan {} caracteres"
recent-tags: "最近"
click-to-tagging: "クリックでタグ付け"
visibility: "公開範囲"
geolocation-alert: "お使いの端末は位置情報に対応していません"
error: "エラー"
enter-username: "ユーザー名を入力してください"
desktop/views/components/post-form-window.vue:
note: "Nota nueva"
reply: "Responder"
@@ -536,6 +633,9 @@ desktop/views/components/settings.api.vue:
enter-password: "パスワードを入力してください"
desktop/views/components/settings.apps.vue:
no-apps: "連携しているアプリケーションはありません"
desktop/views/components/settings.drive.vue:
max: "中"
in-use: "使用中"
desktop/views/components/settings.mute.vue:
no-users: "ミュートしているユーザーはいません"
desktop/views/components/settings.password.vue:
@@ -558,6 +658,7 @@ desktop/views/components/settings.profile.vue:
other: "その他"
is-bot: "このアカウントはBotです"
is-cat: "このアカウントはCatです"
profile-updated: "プロフィールを更新しました"
desktop/views/components/sub-note-content.vue:
private: "この投稿は非公開です"
deleted: "この投稿は削除されました"
@@ -631,6 +732,7 @@ desktop/views/pages/welcome.vue:
signin-button: "やってる"
signup-button: "やる"
timeline: "タイムライン"
powered-by-misskey: "Powered by <b>Misskey</b>."
desktop/views/pages/drive.vue:
title: "Misskey Drive"
desktop/views/pages/favorites.vue:
@@ -645,6 +747,14 @@ desktop/views/pages/selectdrive.vue:
ok: "決定"
cancel: "キャンセル"
upload: "PCからドライブにファイルをアップロード"
desktop/views/pages/search.vue:
not-available: "検索機能を利用することができません。"
not-found: "「{}」に関する投稿は見つかりませんでした。"
desktop/views/pages/share.vue:
share-with: "Misskeyで共有"
close: "閉じる"
desktop/views/pages/tag.vue:
no-posts-found: "ハッシュタグ「{}」が付けられた投稿は見つかりませんでした。"
desktop/views/pages/user-list.users.vue:
users: "ユーザー"
add-user: "ユーザーを追加"
@@ -800,6 +910,8 @@ mobile/views/components/sub-note-content.vue:
mobile/views/components/timeline.vue:
empty: "投稿がありません"
load-more: "もっと"
mobile/views/components/ui.header.vue:
welcome-back: "おかえりなさい、"
mobile/views/components/ui.nav.vue:
timeline: "タイムライン"
notifications: "通知"
@@ -830,6 +942,8 @@ mobile/views/pages/user-lists.vue:
mobile/views/pages/drive.vue:
drive: "ドライブ"
more: "もっと見る"
mobile/views/pages/signup.vue:
lets-start: "📦 始めましょう"
mobile/views/pages/followers.vue:
followers-of: "{}のフォロワー"
mobile/views/pages/following.vue:
@@ -839,6 +953,14 @@ mobile/views/pages/home.vue:
local: "ローカル"
hybrid: "ソーシャル"
global: "グローバル"
mobile/views/pages/tag.vue:
no-posts-found: "ハッシュタグ「{}」が付けられた投稿は見つかりませんでした。"
mobile/views/pages/welcome.vue:
signup: "新規登録"
mobile/views/pages/widgets.vue:
dashboard: "ダッシュボード"
mobile/views/pages/widgets/activity.vue:
activity: "アクティビティ"
mobile/views/pages/messaging.vue:
messaging: "メッセージ"
mobile/views/pages/messaging-room.vue:
@@ -854,6 +976,8 @@ mobile/views/pages/note.vue:
mobile/views/pages/notifications.vue:
notifications: "通知"
read-all: "すべての通知を既読にしますか?"
mobile/views/pages/reversi.vue:
reversi: "リバーシ"
mobile/views/pages/settings/settings.profile.vue:
title: "プロフィール"
name: "名前"

View File

@@ -6,6 +6,14 @@ common:
misskey: "Une ⭐ du fédiverse"
about-title: "Une ⭐ du fédiverse."
about: "Merci d'avoir découvert Misskey. Misskey est une <b>plateforme de micro-blogging distribuée</b> née sur Terre. Parce qu'il fait partie du Fédiverse (un univers composé de diverses plateformes de réseaux sociaux organisées), il est mutuellement connecté avec d'autres plateformes de réseaux sociaux. Désirez-vous prendre une pause, pendant un instant, loin de l'agitation de la ville et plonger dans un nouvel Internet ?"
customization-tips:
title: "Conseils de personnalisation"
paragraph1: "La personnalisation à la maison vous permet d'ajouter / supprimer, glisser et déposer et réorganiser les widgets."
paragraph2: "Vous pouvez changer l'affichage en <strong>cliquant droit</strong> sur certains widgets."
paragraph3: "Pour supprimer un widget, <strong>glissez et déposez le widget sur la zone étiquetée \"Corbeille\"</strong> dans l'en-tête."
paragraph4: "Pour terminer la personnalisation, cliquez sur \"Terminer\" dans le coin supérieur droit."
gotit: "Compris!"
name: "Misskey"
time:
unknown: "inconnu"
future: "future"
@@ -17,6 +25,7 @@ common:
weeks_ago: "Il y a {} semaines·s"
months_ago: "Il y a {} mois"
years_ago: "Il y a {} an·s"
trash: "Corbeille"
weekday-short:
sunday: "D"
monday: "L"
@@ -25,6 +34,14 @@ common:
thursday: "J"
friday: "V"
saturday: "S"
weekday:
sunday: "日曜日"
monday: "月曜日"
tuesday: "火曜日"
wednesday: "水曜日"
thursday: "木曜日"
friday: "金曜日"
saturday: "土曜日"
reactions:
like: "Aime"
love: "Adore"
@@ -51,18 +68,23 @@ common:
my-token-regenerated: "Votre token vient d'être généré, vous allez maintenant être déconnecté."
i-like-sushi: "Je préfère les sushis (au pudding)"
show-reversi-board-labels: "Afficher les étiquettes des lignes et colonnes dans Reversi"
verified-user: "認証済みのユーザー"
verified-user: "Utilisateur·trice vérifié·e"
reversi:
drawn: "Partie nulle"
my-turn: "Cest votre tour"
opponent-turn: "Tour de ladversaire"
turn-of: "Cest le tour de {}"
past-turn-of: "C'est au tour de {}"
won: "{} a gagné"
black: "黒"
white: "白"
total: "合計"
this-turn: "{}ターン目"
widgets:
analog-clock: "Horloge analogique"
profile: "Profil"
calendar: "Calendrier"
timemachine: "カレンダー(タイムマシン)"
timemachine: "Calendrier (Machine de temps)"
activity: "Activité"
rss: "Lecteur de flux RSS"
memo: "Pense-bête"
@@ -86,7 +108,7 @@ common:
widgets: "Widgets"
home: "Accueil"
local: "Local"
hybrid: "ソーシャル"
hybrid: "Social"
global: "Global"
notifications: "Notifications"
list: "Liste"
@@ -99,6 +121,42 @@ common:
rename: "Renommer"
stack-left: "Vers la gauche"
pop-right: "Vers la droite"
common/views/components/games/reversi/reversi.vue:
title: "Misskey Reversi"
sub-title: "他のMisskeyユーザーとリバーシで対戦しよう"
invite: "招待"
rule: "遊び方"
rule-desc: "リバーシは、相手と交互に石をボードに置いて、相手の石を挟んで自分の色に変えてゆき、最終的に残った石が多い方が勝ちというボードゲームです。"
mode-invite: "招待"
mode-invite-desc: "指定したユーザーと対戦するモードです。"
invitations: "対局の招待があります!"
my-games: "自分の対局"
all-games: "みんなの対局"
enter-username: "ユーザー名を入力してください"
game-state:
ended: "終了"
playing: "進行中"
matching:
waiting-for: "{}を待っています"
cacnel: "キャンセル"
common/views/components/games/reversi/reversi.room.vue:
settings-of-the-game: "ゲームの設定"
choose-map: "マップを選択"
random: "ランダム"
black-or-white: "先手/後手"
black-is: "{}が黒"
rules: "ルール"
is-llotheo: "石の少ない方が勝ち(ロセオ)"
looped-map: "ループマップ"
can-put-everywhere: "どこでも置けるモード"
settings-of-the-bot: "Botの設定"
this-gane-is-started-soon: "ゲームは数秒後に開始されます"
waiting-for-other: "相手の準備が完了するのを待っています"
waiting-for-me: "あなたの準備が完了するのを待っています"
waiting-for-both: "準備中"
cancel: "キャンセル"
ready: "準備完了"
cancel-ready: "準備続行"
common/views/components/connect-failed.vue:
title: "Impossible de se connecter au server."
description: "Il y a soit un problème avec votre connexion internet, soit le serveur est hors-ligne ou en maintenance. Veuillez {ressayer} plus tard."
@@ -228,6 +286,13 @@ common/views/widgets/broadcast.vue:
no-broadcasts: "No broadcasts"
have-a-nice-day: "Passez une bonne journée!"
next: "Suivant"
common/views/widgets/calendar.vue:
year: "{}年"
month: "{}月"
day: "{}日"
today: "今日:"
this-month: "今月:"
this-year: "今年:"
common/views/widgets/donation.vue:
title: "Dons"
text: "Toutes les depences pour couvrir les frais de Misskey sortent directement de notre poche. Nous ne recevons pas d'argent, si vous pouvez nous faire dons d'argent, on vous serait eternellement reconnaissant. Si vous êtes intéressés veuilles contacter {}. Merci pour votre contribution!"
@@ -248,6 +313,31 @@ common/views/widgets/memo.vue:
title: "Pense-bête"
memo: "Écrivez ici !"
save: "Enregistrer"
common/views/widgets/slideshow.vue:
folder-customize-mode: "フォルダを指定するには、カスタマイズモードを終了してください"
folder: "クリックしてフォルダを指定してください"
no-image: "このフォルダには画像がありません"
common/views/widgets/tips.vue:
tips-line1: "<kbd>t</kbd>でタイムラインにフォーカスできます"
tips-line2: "<kbd>p</kbd>または<kbd>n</kbd>で投稿フォームを開きます"
tips-line3: "投稿フォームにはファイルをドラッグ&ドロップできます"
tips-line4: "投稿フォームにクリップボードにある画像データをペーストできます"
tips-line5: "ドライブにファイルをドラッグ&ドロップしてアップロードできます"
tips-line6: "ドライブでファイルをドラッグしてフォルダ移動できます"
tips-line7: "ドライブでフォルダをドラッグしてフォルダ移動できます"
tips-line8: "ホームは設定からカスタマイズできます"
tips-line9: "MisskeyはAGPLv3です"
tips-line10: "タイムマシンウィジェットを利用すると、簡単に過去のタイムラインに遡れます"
tips-line11: "投稿の ... をクリックして、投稿をユーザーページにピン留めできます"
tips-line13: "投稿に添付したファイルは全てドライブに保存されます"
tips-line14: "ホームのカスタマイズ中、ウィジェットを右クリックしてデザインを変更できます"
tips-line17: "「**」でテキストを囲むと**強調表示**されます"
tips-line19: "いくつかのウィンドウはブラウザの外に切り離すことができます"
tips-line20: "カレンダーウィジェットのパーセンテージは、経過の割合を示しています"
tips-line21: "APIを利用してbotの開発なども行えます"
tips-line23: "まゆかわいいよまゆ"
tips-line24: "Misskeyは2014年にサービスを開始しました"
tips-line25: "対応ブラウザではMisskeyを開いていなくても通知を受け取れます"
common/views/pages/follow.vue:
signed-in-as: "Connecté en tant que {}"
following: "Suit"
@@ -335,7 +425,7 @@ desktop/views/components/drive.vue:
upload: "Uploader un fichier"
url-upload: "Uploader d'un URL"
desktop/views/components/media-image.vue:
sensitive: "閲覧注意"
sensitive: "Le contenu est NSFW"
click-to-show: "Cliquer pour afficher"
desktop/views/components/media-video.vue:
sensitive: "Le contenu est NSFW"
@@ -396,6 +486,9 @@ desktop/views/components/notifications.vue:
more: "Plus"
empty: "Pas de notifications"
desktop/views/components/post-form.vue:
add-visible-user: "+ユーザーを追加"
attach-location-information: "位置情報を添付する"
hide-contents: "内容を隠す"
reply-placeholder: "Répondre à cette note"
quote-placeholder: "Citer cette note"
submit: "Poster"
@@ -416,6 +509,10 @@ desktop/views/components/post-form.vue:
text-remain: "{} charactères restants"
recent-tags: "Récent"
click-to-tagging: "クリックでタグ付け"
visibility: "公開範囲"
geolocation-alert: "お使いの端末は位置情報に対応していません"
error: "エラー"
enter-username: "ユーザー名を入力してください"
desktop/views/components/post-form-window.vue:
note: "Nouvelle note"
reply: "Répondre"
@@ -536,6 +633,9 @@ desktop/views/components/settings.api.vue:
enter-password: "Veuillez entrer le mot de passe"
desktop/views/components/settings.apps.vue:
no-apps: "Aucune application autorisée"
desktop/views/components/settings.drive.vue:
max: "中"
in-use: "使用中"
desktop/views/components/settings.mute.vue:
no-users: "Aucun utilisateurs mis en sourdine"
desktop/views/components/settings.password.vue:
@@ -554,10 +654,11 @@ desktop/views/components/settings.profile.vue:
birthday: "Date de naissance"
save: "Mettre à jour le profil"
locked-account: "Protéger votre compte"
is-locked: "投稿を非公開にする"
is-locked: "Rendre la note privée"
other: "Autre"
is-bot: "Ce compte est un Bot"
is-cat: "Ce compte est un Chat"
profile-updated: "プロフィールを更新しました"
desktop/views/components/sub-note-content.vue:
private: "cette publication est privée"
deleted: "cette publication a été supprimée"
@@ -579,7 +680,7 @@ desktop/views/components/ui.header.account.vue:
favorites: "Favorites"
lists: "Listes"
follow-requests: "Demandes de suivi"
customize: "ホームのカスタマイズ"
customize: "Personnaliser l'Accueil"
settings: "Réglages"
signout: "Déconnexion"
dark: "Fall in dark"
@@ -631,6 +732,7 @@ desktop/views/pages/welcome.vue:
signin-button: "Se connecter"
signup-button: "S'inscrire"
timeline: "Fil d'actualité"
powered-by-misskey: "Powered by <b>Misskey</b>."
desktop/views/pages/drive.vue:
title: "Lecteur de Misskey"
desktop/views/pages/favorites.vue:
@@ -645,6 +747,14 @@ desktop/views/pages/selectdrive.vue:
ok: "OK"
cancel: "Annuler"
upload: "Uploader un ou plusieurs fichier(s) depuis votre PC"
desktop/views/pages/search.vue:
not-available: "検索機能を利用することができません。"
not-found: "「{}」に関する投稿は見つかりませんでした。"
desktop/views/pages/share.vue:
share-with: "Misskeyで共有"
close: "閉じる"
desktop/views/pages/tag.vue:
no-posts-found: "ハッシュタグ「{}」が付けられた投稿は見つかりませんでした。"
desktop/views/pages/user-list.users.vue:
users: "Utilisateurs"
add-user: "Ajouter un utilisateur"
@@ -800,6 +910,8 @@ mobile/views/components/sub-note-content.vue:
mobile/views/components/timeline.vue:
empty: "Pas de notes"
load-more: "Afficher plus"
mobile/views/components/ui.header.vue:
welcome-back: "おかえりなさい、"
mobile/views/components/ui.nav.vue:
timeline: "Fil d'actualité"
notifications: "Notifications"
@@ -830,6 +942,8 @@ mobile/views/pages/user-lists.vue:
mobile/views/pages/drive.vue:
drive: "Drive"
more: "Afficher plus ..."
mobile/views/pages/signup.vue:
lets-start: "📦 始めましょう"
mobile/views/pages/followers.vue:
followers-of: "Abonné·e·s de {}"
mobile/views/pages/following.vue:
@@ -839,6 +953,14 @@ mobile/views/pages/home.vue:
local: "Local"
hybrid: "Social"
global: "Global"
mobile/views/pages/tag.vue:
no-posts-found: "ハッシュタグ「{}」が付けられた投稿は見つかりませんでした。"
mobile/views/pages/welcome.vue:
signup: "新規登録"
mobile/views/pages/widgets.vue:
dashboard: "ダッシュボード"
mobile/views/pages/widgets/activity.vue:
activity: "アクティビティ"
mobile/views/pages/messaging.vue:
messaging: "Messagerie"
mobile/views/pages/messaging-room.vue:
@@ -854,6 +976,8 @@ mobile/views/pages/note.vue:
mobile/views/pages/notifications.vue:
notifications: "Notifications"
read-all: "Êtes vous sûr de vouloir marqués toutes les notifications non-lus en tant que lus?"
mobile/views/pages/reversi.vue:
reversi: "リバーシ"
mobile/views/pages/settings/settings.profile.vue:
title: "Profil"
name: "Nom"
@@ -915,7 +1039,7 @@ mobile/views/pages/user.vue:
follows-you: "vous suit"
following: "Abonnements"
followers: "Abonné·e·s"
notes: "Posts"
notes: "Notes"
overview: "Aperçu"
timeline: "Fil d'actualité"
media: "Media"

View File

@@ -6,6 +6,14 @@ common:
misskey: "A ⭐ of fediverse"
about-title: "A ⭐ of fediverse."
about: "Misskeyを見つけていただき、ありがとうございます。Misskeyは、地球で生まれた<b>分散マイクロブログSNS</b>です。Fediverse(様々なSNSで構成される宇宙)の中に存在するため、他のSNSと相互に繋がっています。暫し都会の喧騒から離れて、新しいインターネットにダイブしてみませんか。"
customization-tips:
title: "カスタマイズのヒント"
paragraph1: "ホームのカスタマイズでは、ウィジェットを追加/削除したり、ドラッグ&ドロップして並べ替えたりすることができます。"
paragraph2: "一部のウィジェットは、<strong><strong>右</strong>クリック</strong>することで表示を変更することができます。"
paragraph3: "ウィジェットを削除するには、ヘッダーの<strong>「ゴミ箱」</strong>と書かれたエリアにウィジェットをドラッグ&ドロップします。"
paragraph4: "カスタマイズを終了するには、右上の「完了」をクリックします。"
gotit: "Got it!"
name: "Misskey"
time:
unknown: "なぞのじかん"
future: "未来"
@@ -17,6 +25,7 @@ common:
weeks_ago: "{}週間前"
months_ago: "{}ヶ月前"
years_ago: "{}年前"
trash: "ゴミ箱"
weekday-short:
sunday: "日"
monday: "月"
@@ -25,6 +34,14 @@ common:
thursday: "木"
friday: "金"
saturday: "土"
weekday:
sunday: "日曜日"
monday: "月曜日"
tuesday: "火曜日"
wednesday: "水曜日"
thursday: "木曜日"
friday: "金曜日"
saturday: "土曜日"
reactions:
like: "いいね"
love: "しゅき"
@@ -58,6 +75,11 @@ common:
opponent-turn: "相手のターンです"
turn-of: "{}のターンです"
past-turn-of: "{}のターン"
won: "{}の勝ち"
black: "黒"
white: "白"
total: "合計"
this-turn: "{}ターン目"
widgets:
analog-clock: "アナログ時計"
profile: "プロフィール"
@@ -99,6 +121,42 @@ common:
rename: "名前を変更"
stack-left: "左に重ねる"
pop-right: "右に出す"
common/views/components/games/reversi/reversi.vue:
title: "Misskey Reversi"
sub-title: "他のMisskeyユーザーとリバーシで対戦しよう"
invite: "招待"
rule: "遊び方"
rule-desc: "リバーシは、相手と交互に石をボードに置いて、相手の石を挟んで自分の色に変えてゆき、最終的に残った石が多い方が勝ちというボードゲームです。"
mode-invite: "招待"
mode-invite-desc: "指定したユーザーと対戦するモードです。"
invitations: "対局の招待があります!"
my-games: "自分の対局"
all-games: "みんなの対局"
enter-username: "ユーザー名を入力してください"
game-state:
ended: "終了"
playing: "進行中"
matching:
waiting-for: "{}を待っています"
cacnel: "キャンセル"
common/views/components/games/reversi/reversi.room.vue:
settings-of-the-game: "ゲームの設定"
choose-map: "マップを選択"
random: "ランダム"
black-or-white: "先手/後手"
black-is: "{}が黒"
rules: "ルール"
is-llotheo: "石の少ない方が勝ち(ロセオ)"
looped-map: "ループマップ"
can-put-everywhere: "どこでも置けるモード"
settings-of-the-bot: "Botの設定"
this-gane-is-started-soon: "ゲームは数秒後に開始されます"
waiting-for-other: "相手の準備が完了するのを待っています"
waiting-for-me: "あなたの準備が完了するのを待っています"
waiting-for-both: "準備中"
cancel: "キャンセル"
ready: "準備完了"
cancel-ready: "準備続行"
common/views/components/connect-failed.vue:
title: "サーバーに接続できません"
description: "インターネット回線に問題があるか、サーバーがダウンまたはメンテナンスしている可能性があります。しばらくしてから{再度お試し}ください。"
@@ -228,6 +286,13 @@ common/views/widgets/broadcast.vue:
no-broadcasts: "お知らせはありません"
have-a-nice-day: "良い一日を!"
next: "次"
common/views/widgets/calendar.vue:
year: "{}年"
month: "{}月"
day: "{}日"
today: "今日:"
this-month: "今月:"
this-year: "今年:"
common/views/widgets/donation.vue:
title: "寄付のお願い"
text: "Misskeyの運営にはドメイン、サーバー等のコストが掛かります。Misskeyは広告を掲載したりしないため、収入を皆様からの寄付に頼っています。もしご興味があれば、{}までご連絡ください。ご協力ありがとうございます。"
@@ -248,6 +313,31 @@ common/views/widgets/memo.vue:
title: "付箋"
memo: "ここに書いて!"
save: "保存"
common/views/widgets/slideshow.vue:
folder-customize-mode: "フォルダを指定するには、カスタマイズモードを終了してください"
folder: "クリックしてフォルダを指定してください"
no-image: "このフォルダには画像がありません"
common/views/widgets/tips.vue:
tips-line1: "<kbd>t</kbd>でタイムラインにフォーカスできます"
tips-line2: "<kbd>p</kbd>または<kbd>n</kbd>で投稿フォームを開きます"
tips-line3: "投稿フォームにはファイルをドラッグ&ドロップできます"
tips-line4: "投稿フォームにクリップボードにある画像データをペーストできます"
tips-line5: "ドライブにファイルをドラッグ&ドロップしてアップロードできます"
tips-line6: "ドライブでファイルをドラッグしてフォルダ移動できます"
tips-line7: "ドライブでフォルダをドラッグしてフォルダ移動できます"
tips-line8: "ホームは設定からカスタマイズできます"
tips-line9: "MisskeyはAGPLv3です"
tips-line10: "タイムマシンウィジェットを利用すると、簡単に過去のタイムラインに遡れます"
tips-line11: "投稿の ... をクリックして、投稿をユーザーページにピン留めできます"
tips-line13: "投稿に添付したファイルは全てドライブに保存されます"
tips-line14: "ホームのカスタマイズ中、ウィジェットを右クリックしてデザインを変更できます"
tips-line17: "「**」でテキストを囲むと**強調表示**されます"
tips-line19: "いくつかのウィンドウはブラウザの外に切り離すことができます"
tips-line20: "カレンダーウィジェットのパーセンテージは、経過の割合を示しています"
tips-line21: "APIを利用してbotの開発なども行えます"
tips-line23: "まゆかわいいよまゆ"
tips-line24: "Misskeyは2014年にサービスを開始しました"
tips-line25: "対応ブラウザではMisskeyを開いていなくても通知を受け取れます"
common/views/pages/follow.vue:
signed-in-as: "{}としてサインイン中"
following: "フォロー中"
@@ -396,6 +486,9 @@ desktop/views/components/notifications.vue:
more: "もっと見る"
empty: "ありません!"
desktop/views/components/post-form.vue:
add-visible-user: "+ユーザーを追加"
attach-location-information: "位置情報を添付する"
hide-contents: "内容を隠す"
reply-placeholder: "この投稿への返信..."
quote-placeholder: "この投稿を引用..."
submit: "投稿"
@@ -416,6 +509,10 @@ desktop/views/components/post-form.vue:
text-remain: "残り{}文字"
recent-tags: "最近"
click-to-tagging: "クリックでタグ付け"
visibility: "公開範囲"
geolocation-alert: "お使いの端末は位置情報に対応していません"
error: "エラー"
enter-username: "ユーザー名を入力してください"
desktop/views/components/post-form-window.vue:
note: "新規投稿"
reply: "返信"
@@ -536,6 +633,9 @@ desktop/views/components/settings.api.vue:
enter-password: "パスワードを入力してください"
desktop/views/components/settings.apps.vue:
no-apps: "連携しているアプリケーションはありません"
desktop/views/components/settings.drive.vue:
max: "中"
in-use: "使用中"
desktop/views/components/settings.mute.vue:
no-users: "ミュートしているユーザーはいません"
desktop/views/components/settings.password.vue:
@@ -558,6 +658,7 @@ desktop/views/components/settings.profile.vue:
other: "その他"
is-bot: "このアカウントはBotです"
is-cat: "このアカウントはCatです"
profile-updated: "プロフィールを更新しました"
desktop/views/components/sub-note-content.vue:
private: "この投稿は非公開です"
deleted: "この投稿は削除されました"
@@ -631,6 +732,7 @@ desktop/views/pages/welcome.vue:
signin-button: "やってる"
signup-button: "やる"
timeline: "タイムライン"
powered-by-misskey: "Powered by <b>Misskey</b>."
desktop/views/pages/drive.vue:
title: "Misskey Drive"
desktop/views/pages/favorites.vue:
@@ -645,6 +747,14 @@ desktop/views/pages/selectdrive.vue:
ok: "決定"
cancel: "キャンセル"
upload: "PCからドライブにファイルをアップロード"
desktop/views/pages/search.vue:
not-available: "検索機能を利用することができません。"
not-found: "「{}」に関する投稿は見つかりませんでした。"
desktop/views/pages/share.vue:
share-with: "Misskeyで共有"
close: "閉じる"
desktop/views/pages/tag.vue:
no-posts-found: "ハッシュタグ「{}」が付けられた投稿は見つかりませんでした。"
desktop/views/pages/user-list.users.vue:
users: "ユーザー"
add-user: "ユーザーを追加"
@@ -800,6 +910,8 @@ mobile/views/components/sub-note-content.vue:
mobile/views/components/timeline.vue:
empty: "投稿がありません"
load-more: "もっと"
mobile/views/components/ui.header.vue:
welcome-back: "おかえりなさい、"
mobile/views/components/ui.nav.vue:
timeline: "タイムライン"
notifications: "通知"
@@ -830,6 +942,8 @@ mobile/views/pages/user-lists.vue:
mobile/views/pages/drive.vue:
drive: "ドライブ"
more: "もっと見る"
mobile/views/pages/signup.vue:
lets-start: "📦 始めましょう"
mobile/views/pages/followers.vue:
followers-of: "{}のフォロワー"
mobile/views/pages/following.vue:
@@ -839,6 +953,14 @@ mobile/views/pages/home.vue:
local: "ローカル"
hybrid: "ソーシャル"
global: "グローバル"
mobile/views/pages/tag.vue:
no-posts-found: "ハッシュタグ「{}」が付けられた投稿は見つかりませんでした。"
mobile/views/pages/welcome.vue:
signup: "新規登録"
mobile/views/pages/widgets.vue:
dashboard: "ダッシュボード"
mobile/views/pages/widgets/activity.vue:
activity: "アクティビティ"
mobile/views/pages/messaging.vue:
messaging: "メッセージ"
mobile/views/pages/messaging-room.vue:
@@ -854,6 +976,8 @@ mobile/views/pages/note.vue:
mobile/views/pages/notifications.vue:
notifications: "通知"
read-all: "すべての通知を既読にしますか?"
mobile/views/pages/reversi.vue:
reversi: "リバーシ"
mobile/views/pages/settings/settings.profile.vue:
title: "プロフィール"
name: "名前"

View File

@@ -6,7 +6,14 @@ common:
misskey: "A ⭐ of fediverse"
about-title: "A ⭐ of fediverse."
about: "Misskeyを見つけていただき、ありがとうございます。Misskeyは、地球で生まれた<b>分散マイクロブログSNS</b>です。Fediverse(様々なSNSで構成される宇宙)の中に存在するため、他のSNSと相互に繋がっています。暫し都会の喧騒から離れて、新しいインターネットにダイブしてみませんか。"
customization-tips:
title: "カスタマイズのヒント"
paragraph1: "ホームのカスタマイズでは、ウィジェットを追加/削除したり、ドラッグ&ドロップして並べ替えたりすることができます。"
paragraph2: "一部のウィジェットは、<strong><strong>右</strong>クリック</strong>することで表示を変更することができます。"
paragraph3: "ウィジェットを削除するには、ヘッダーの<strong>「ゴミ箱」</strong>と書かれたエリアにウィジェットをドラッグ&ドロップします。"
paragraph4: "カスタマイズを終了するには、右上の「完了」をクリックします。"
gotit: "Got it!"
name: "Misskey"
time:
unknown: "なぞのじかん"
future: "未来"
@@ -19,6 +26,8 @@ common:
months_ago: "{}ヶ月前"
years_ago: "{}年前"
trash: "ゴミ箱"
weekday-short:
sunday: "日"
monday: "月"
@@ -28,6 +37,15 @@ common:
friday: "金"
saturday: "土"
weekday:
sunday: "日曜日"
monday: "月曜日"
tuesday: "火曜日"
wednesday: "水曜日"
thursday: "木曜日"
friday: "金曜日"
saturday: "土曜日"
reactions:
like: "いいね"
love: "しゅき"
@@ -64,6 +82,11 @@ common:
opponent-turn: "相手のターンです"
turn-of: "{}のターンです"
past-turn-of: "{}のターン"
won: "{}の勝ち"
black: "黒"
white: "白"
total: "合計"
this-turn: "{}ターン目"
widgets:
analog-clock: "アナログ時計"
@@ -108,6 +131,44 @@ common:
stack-left: "左に重ねる"
pop-right: "右に出す"
common/views/components/games/reversi/reversi.vue:
title: "Misskey Reversi"
sub-title: "他のMisskeyユーザーとリバーシで対戦しよう"
invite: "招待"
rule: "遊び方"
rule-desc: "リバーシは、相手と交互に石をボードに置いて、相手の石を挟んで自分の色に変えてゆき、最終的に残った石が多い方が勝ちというボードゲームです。"
mode-invite: "招待"
mode-invite-desc: "指定したユーザーと対戦するモードです。"
invitations: "対局の招待があります!"
my-games: "自分の対局"
all-games: "みんなの対局"
enter-username: "ユーザー名を入力してください"
game-state:
ended: "終了"
playing: "進行中"
matching:
waiting-for: "{}を待っています"
cacnel: "キャンセル"
common/views/components/games/reversi/reversi.room.vue:
settings-of-the-game: "ゲームの設定"
choose-map: "マップを選択"
random: "ランダム"
black-or-white: "先手/後手"
black-is: "{}が黒"
rules: "ルール"
is-llotheo: "石の少ない方が勝ち(ロセオ)"
looped-map: "ループマップ"
can-put-everywhere: "どこでも置けるモード"
settings-of-the-bot: "Botの設定"
this-gane-is-started-soon: "ゲームは数秒後に開始されます"
waiting-for-other: "相手の準備が完了するのを待っています"
waiting-for-me: "あなたの準備が完了するのを待っています"
waiting-for-both: "準備中"
cancel: "キャンセル"
ready: "準備完了"
cancel-ready: "準備続行"
common/views/components/connect-failed.vue:
title: "サーバーに接続できません"
description: "インターネット回線に問題があるか、サーバーがダウンまたはメンテナンスしている可能性があります。しばらくしてから{再度お試し}ください。"
@@ -256,6 +317,14 @@ common/views/widgets/broadcast.vue:
have-a-nice-day: "良い一日を!"
next: "次"
common/views/widgets/calendar.vue:
year: "{}年"
month: "{}月"
day: "{}日"
today: "今日:"
this-month: "今月:"
this-year: "今年:"
common/views/widgets/donation.vue:
title: "寄付のお願い"
text: "Misskeyの運営にはドメイン、サーバー等のコストが掛かります。Misskeyは広告を掲載したりしないため、収入を皆様からの寄付に頼っています。もしご興味があれば、{}までご連絡ください。ご協力ありがとうございます。"
@@ -282,6 +351,33 @@ common/views/widgets/memo.vue:
memo: "ここに書いて!"
save: "保存"
common/views/widgets/slideshow.vue:
folder-customize-mode: "フォルダを指定するには、カスタマイズモードを終了してください"
folder: "クリックしてフォルダを指定してください"
no-image: "このフォルダには画像がありません"
common/views/widgets/tips.vue:
tips-line1: "<kbd>t</kbd>でタイムラインにフォーカスできます"
tips-line2: "<kbd>p</kbd>または<kbd>n</kbd>で投稿フォームを開きます"
tips-line3: "投稿フォームにはファイルをドラッグ&ドロップできます"
tips-line4: "投稿フォームにクリップボードにある画像データをペーストできます"
tips-line5: "ドライブにファイルをドラッグ&ドロップしてアップロードできます"
tips-line6: "ドライブでファイルをドラッグしてフォルダ移動できます"
tips-line7: "ドライブでフォルダをドラッグしてフォルダ移動できます"
tips-line8: "ホームは設定からカスタマイズできます"
tips-line9: "MisskeyはAGPLv3です"
tips-line10: "タイムマシンウィジェットを利用すると、簡単に過去のタイムラインに遡れます"
tips-line11: "投稿の ... をクリックして、投稿をユーザーページにピン留めできます"
tips-line13: "投稿に添付したファイルは全てドライブに保存されます"
tips-line14: "ホームのカスタマイズ中、ウィジェットを右クリックしてデザインを変更できます"
tips-line17: "「**」でテキストを囲むと**強調表示**されます"
tips-line19: "いくつかのウィンドウはブラウザの外に切り離すことができます"
tips-line20: "カレンダーウィジェットのパーセンテージは、経過の割合を示しています"
tips-line21: "APIを利用してbotの開発なども行えます"
tips-line23: "まゆかわいいよまゆ"
tips-line24: "Misskeyは2014年にサービスを開始しました"
tips-line25: "対応ブラウザではMisskeyを開いていなくても通知を受け取れます"
common/views/pages/follow.vue:
signed-in-as: "{}としてサインイン中"
following: "フォロー中"
@@ -459,6 +555,9 @@ desktop/views/components/notifications.vue:
empty: "ありません!"
desktop/views/components/post-form.vue:
add-visible-user: "+ユーザーを追加"
attach-location-information: "位置情報を添付する"
hide-contents: "内容を隠す"
reply-placeholder: "この投稿への返信..."
quote-placeholder: "この投稿を引用..."
submit: "投稿"
@@ -479,6 +578,10 @@ desktop/views/components/post-form.vue:
text-remain: "残り{}文字"
recent-tags: "最近"
click-to-tagging: "クリックでタグ付け"
visibility: "公開範囲"
geolocation-alert: "お使いの端末は位置情報に対応していません"
error: "エラー"
enter-username: "ユーザー名を入力してください"
desktop/views/components/post-form-window.vue:
note: "新規投稿"
@@ -619,6 +722,10 @@ desktop/views/components/settings.api.vue:
desktop/views/components/settings.apps.vue:
no-apps: "連携しているアプリケーションはありません"
desktop/views/components/settings.drive.vue:
max: "中"
in-use: "使用中"
desktop/views/components/settings.mute.vue:
no-users: "ミュートしているユーザーはいません"
@@ -643,6 +750,7 @@ desktop/views/components/settings.profile.vue:
other: "その他"
is-bot: "このアカウントはBotです"
is-cat: "このアカウントはCatです"
profile-updated: "プロフィールを更新しました"
desktop/views/components/sub-note-content.vue:
private: "この投稿は非公開です"
@@ -694,6 +802,8 @@ desktop/views/components/received-follow-requests-window.vue:
accept: "承認"
reject: "拒否"
desktop/views/components/user-lists-window.vue:
title: "リスト"
create-list: "リストを作成"
@@ -734,6 +844,7 @@ desktop/views/pages/welcome.vue:
signin-button: "やってる"
signup-button: "やる"
timeline: "タイムライン"
powered-by-misskey: "Powered by <b>Misskey</b>."
desktop/views/pages/drive.vue:
title: "Misskey Drive"
@@ -754,6 +865,17 @@ desktop/views/pages/selectdrive.vue:
cancel: "キャンセル"
upload: "PCからドライブにファイルをアップロード"
desktop/views/pages/search.vue:
not-available: "検索機能を利用することができません。"
not-found: "「{}」に関する投稿は見つかりませんでした。"
desktop/views/pages/share.vue:
share-with: "Misskeyで共有"
close: "閉じる"
desktop/views/pages/tag.vue:
no-posts-found: "ハッシュタグ「{}」が付けられた投稿は見つかりませんでした。"
desktop/views/pages/user-list.users.vue:
users: "ユーザー"
add-user: "ユーザーを追加"
@@ -943,6 +1065,9 @@ mobile/views/components/timeline.vue:
empty: "投稿がありません"
load-more: "もっと"
mobile/views/components/ui.header.vue:
welcome-back: "おかえりなさい、"
mobile/views/components/ui.nav.vue:
timeline: "タイムライン"
notifications: "通知"
@@ -979,6 +1104,9 @@ mobile/views/pages/drive.vue:
drive: "ドライブ"
more: "もっと見る"
mobile/views/pages/signup.vue:
lets-start: "📦 始めましょう"
mobile/views/pages/followers.vue:
followers-of: "{}のフォロワー"
@@ -991,6 +1119,18 @@ mobile/views/pages/home.vue:
hybrid: "ソーシャル"
global: "グローバル"
mobile/views/pages/tag.vue:
no-posts-found: "ハッシュタグ「{}」が付けられた投稿は見つかりませんでした。"
mobile/views/pages/welcome.vue:
signup: "新規登録"
mobile/views/pages/widgets.vue:
dashboard: "ダッシュボード"
mobile/views/pages/widgets/activity.vue:
activity: "アクティビティ"
mobile/views/pages/messaging.vue:
messaging: "メッセージ"
@@ -1011,6 +1151,9 @@ mobile/views/pages/notifications.vue:
notifications: "通知"
read-all: "すべての通知を既読にしますか?"
mobile/views/pages/reversi.vue:
reversi: "リバーシ"
mobile/views/pages/settings/settings.profile.vue:
title: "プロフィール"
name: "名前"

View File

@@ -6,6 +6,14 @@ common:
misskey: "A ⭐ of fediverse"
about-title: "A ⭐ of fediverse."
about: "Misskeyを見つけていただき、ありがとうございます。Misskeyは、地球で生まれた<b>分散マイクロブログSNS</b>です。Fediverse(様々なSNSで構成される宇宙)の中に存在するため、他のSNSと相互に繋がっています。暫し都会の喧騒から離れて、新しいインターネットにダイブしてみませんか。"
customization-tips:
title: "カスタマイズのヒント"
paragraph1: "ホームのカスタマイズでは、ウィジェットを追加/削除したり、ドラッグ&ドロップして並べ替えたりすることができます。"
paragraph2: "一部のウィジェットは、<strong><strong>右</strong>クリック</strong>することで表示を変更することができます。"
paragraph3: "ウィジェットを削除するには、ヘッダーの<strong>「ゴミ箱」</strong>と書かれたエリアにウィジェットをドラッグ&ドロップします。"
paragraph4: "カスタマイズを終了するには、右上の「完了」をクリックします。"
gotit: "Got it!"
name: "Misskey"
time:
unknown: "なぞのじかん"
future: "未来"
@@ -17,6 +25,7 @@ common:
weeks_ago: "{}週間前"
months_ago: "{}ヶ月前"
years_ago: "{}年前"
trash: "ゴミ箱"
weekday-short:
sunday: "日"
monday: "月"
@@ -25,6 +34,14 @@ common:
thursday: "木"
friday: "金"
saturday: "土"
weekday:
sunday: "日曜日"
monday: "月曜日"
tuesday: "火曜日"
wednesday: "水曜日"
thursday: "木曜日"
friday: "金曜日"
saturday: "土曜日"
reactions:
like: "いいね"
love: "しゅき"
@@ -58,6 +75,11 @@ common:
opponent-turn: "相手のターンです"
turn-of: "{}のターンです"
past-turn-of: "{}のターン"
won: "{}の勝ち"
black: "黒"
white: "白"
total: "合計"
this-turn: "{}ターン目"
widgets:
analog-clock: "アナログ時計"
profile: "プロフィール"
@@ -99,6 +121,42 @@ common:
rename: "名前を変更"
stack-left: "左に重ねる"
pop-right: "右に出す"
common/views/components/games/reversi/reversi.vue:
title: "Misskey Reversi"
sub-title: "他のMisskeyユーザーとリバーシで対戦しよう"
invite: "招待"
rule: "遊び方"
rule-desc: "リバーシは、相手と交互に石をボードに置いて、相手の石を挟んで自分の色に変えてゆき、最終的に残った石が多い方が勝ちというボードゲームです。"
mode-invite: "招待"
mode-invite-desc: "指定したユーザーと対戦するモードです。"
invitations: "対局の招待があります!"
my-games: "自分の対局"
all-games: "みんなの対局"
enter-username: "ユーザー名を入力してください"
game-state:
ended: "終了"
playing: "進行中"
matching:
waiting-for: "{}を待っています"
cacnel: "キャンセル"
common/views/components/games/reversi/reversi.room.vue:
settings-of-the-game: "ゲームの設定"
choose-map: "マップを選択"
random: "ランダム"
black-or-white: "先手/後手"
black-is: "{}が黒"
rules: "ルール"
is-llotheo: "石の少ない方が勝ち(ロセオ)"
looped-map: "ループマップ"
can-put-everywhere: "どこでも置けるモード"
settings-of-the-bot: "Botの設定"
this-gane-is-started-soon: "ゲームは数秒後に開始されます"
waiting-for-other: "相手の準備が完了するのを待っています"
waiting-for-me: "あなたの準備が完了するのを待っています"
waiting-for-both: "準備中"
cancel: "キャンセル"
ready: "準備完了"
cancel-ready: "準備続行"
common/views/components/connect-failed.vue:
title: "サーバーに接続できません"
description: "インターネット回線に問題があるか、サーバーがダウンまたはメンテナンスしている可能性があります。しばらくしてから{再度お試し}ください。"
@@ -228,6 +286,13 @@ common/views/widgets/broadcast.vue:
no-broadcasts: "お知らせはありません"
have-a-nice-day: "良い一日を!"
next: "次"
common/views/widgets/calendar.vue:
year: "{}年"
month: "{}月"
day: "{}日"
today: "今日:"
this-month: "今月:"
this-year: "今年:"
common/views/widgets/donation.vue:
title: "寄付のお願い"
text: "Misskeyの運営にはドメイン、サーバー等のコストが掛かります。Misskeyは広告を掲載したりしないため、収入を皆様からの寄付に頼っています。もしご興味があれば、{}までご連絡ください。ご協力ありがとうございます。"
@@ -248,6 +313,31 @@ common/views/widgets/memo.vue:
title: "付箋"
memo: "ここに書いて!"
save: "保存"
common/views/widgets/slideshow.vue:
folder-customize-mode: "フォルダを指定するには、カスタマイズモードを終了してください"
folder: "クリックしてフォルダを指定してください"
no-image: "このフォルダには画像がありません"
common/views/widgets/tips.vue:
tips-line1: "<kbd>t</kbd>でタイムラインにフォーカスできます"
tips-line2: "<kbd>p</kbd>または<kbd>n</kbd>で投稿フォームを開きます"
tips-line3: "投稿フォームにはファイルをドラッグ&ドロップできます"
tips-line4: "投稿フォームにクリップボードにある画像データをペーストできます"
tips-line5: "ドライブにファイルをドラッグ&ドロップしてアップロードできます"
tips-line6: "ドライブでファイルをドラッグしてフォルダ移動できます"
tips-line7: "ドライブでフォルダをドラッグしてフォルダ移動できます"
tips-line8: "ホームは設定からカスタマイズできます"
tips-line9: "MisskeyはAGPLv3です"
tips-line10: "タイムマシンウィジェットを利用すると、簡単に過去のタイムラインに遡れます"
tips-line11: "投稿の ... をクリックして、投稿をユーザーページにピン留めできます"
tips-line13: "投稿に添付したファイルは全てドライブに保存されます"
tips-line14: "ホームのカスタマイズ中、ウィジェットを右クリックしてデザインを変更できます"
tips-line17: "「**」でテキストを囲むと**強調表示**されます"
tips-line19: "いくつかのウィンドウはブラウザの外に切り離すことができます"
tips-line20: "カレンダーウィジェットのパーセンテージは、経過の割合を示しています"
tips-line21: "APIを利用してbotの開発なども行えます"
tips-line23: "まゆかわいいよまゆ"
tips-line24: "Misskeyは2014年にサービスを開始しました"
tips-line25: "対応ブラウザではMisskeyを開いていなくても通知を受け取れます"
common/views/pages/follow.vue:
signed-in-as: "{}としてサインイン中"
following: "フォロー中"
@@ -396,6 +486,9 @@ desktop/views/components/notifications.vue:
more: "もっと見る"
empty: "ありません!"
desktop/views/components/post-form.vue:
add-visible-user: "+ユーザーを追加"
attach-location-information: "位置情報を添付する"
hide-contents: "内容を隠す"
reply-placeholder: "この投稿への返信..."
quote-placeholder: "この投稿を引用..."
submit: "投稿"
@@ -416,6 +509,10 @@ desktop/views/components/post-form.vue:
text-remain: "残り{}文字"
recent-tags: "最近"
click-to-tagging: "クリックでタグ付け"
visibility: "公開範囲"
geolocation-alert: "お使いの端末は位置情報に対応していません"
error: "エラー"
enter-username: "ユーザー名を入力してください"
desktop/views/components/post-form-window.vue:
note: "新規投稿"
reply: "返信"
@@ -536,6 +633,9 @@ desktop/views/components/settings.api.vue:
enter-password: "パスワードを入力してください"
desktop/views/components/settings.apps.vue:
no-apps: "連携しているアプリケーションはありません"
desktop/views/components/settings.drive.vue:
max: "中"
in-use: "使用中"
desktop/views/components/settings.mute.vue:
no-users: "ミュートしているユーザーはいません"
desktop/views/components/settings.password.vue:
@@ -558,6 +658,7 @@ desktop/views/components/settings.profile.vue:
other: "その他"
is-bot: "このアカウントはBotです"
is-cat: "このアカウントはCatです"
profile-updated: "プロフィールを更新しました"
desktop/views/components/sub-note-content.vue:
private: "この投稿は非公開です"
deleted: "この投稿は削除されました"
@@ -631,6 +732,7 @@ desktop/views/pages/welcome.vue:
signin-button: "やってる"
signup-button: "やる"
timeline: "タイムライン"
powered-by-misskey: "Powered by <b>Misskey</b>."
desktop/views/pages/drive.vue:
title: "Misskey Drive"
desktop/views/pages/favorites.vue:
@@ -645,6 +747,14 @@ desktop/views/pages/selectdrive.vue:
ok: "決定"
cancel: "キャンセル"
upload: "PCからドライブにファイルをアップロード"
desktop/views/pages/search.vue:
not-available: "検索機能を利用することができません。"
not-found: "「{}」に関する投稿は見つかりませんでした。"
desktop/views/pages/share.vue:
share-with: "Misskeyで共有"
close: "閉じる"
desktop/views/pages/tag.vue:
no-posts-found: "ハッシュタグ「{}」が付けられた投稿は見つかりませんでした。"
desktop/views/pages/user-list.users.vue:
users: "ユーザー"
add-user: "ユーザーを追加"
@@ -800,6 +910,8 @@ mobile/views/components/sub-note-content.vue:
mobile/views/components/timeline.vue:
empty: "投稿がありません"
load-more: "もっと"
mobile/views/components/ui.header.vue:
welcome-back: "おかえりなさい、"
mobile/views/components/ui.nav.vue:
timeline: "タイムライン"
notifications: "通知"
@@ -830,6 +942,8 @@ mobile/views/pages/user-lists.vue:
mobile/views/pages/drive.vue:
drive: "ドライブ"
more: "もっと見る"
mobile/views/pages/signup.vue:
lets-start: "📦 始めましょう"
mobile/views/pages/followers.vue:
followers-of: "{}のフォロワー"
mobile/views/pages/following.vue:
@@ -839,6 +953,14 @@ mobile/views/pages/home.vue:
local: "ローカル"
hybrid: "ソーシャル"
global: "グローバル"
mobile/views/pages/tag.vue:
no-posts-found: "ハッシュタグ「{}」が付けられた投稿は見つかりませんでした。"
mobile/views/pages/welcome.vue:
signup: "新規登録"
mobile/views/pages/widgets.vue:
dashboard: "ダッシュボード"
mobile/views/pages/widgets/activity.vue:
activity: "アクティビティ"
mobile/views/pages/messaging.vue:
messaging: "メッセージ"
mobile/views/pages/messaging-room.vue:
@@ -854,6 +976,8 @@ mobile/views/pages/note.vue:
mobile/views/pages/notifications.vue:
notifications: "通知"
read-all: "すべての通知を既読にしますか?"
mobile/views/pages/reversi.vue:
reversi: "リバーシ"
mobile/views/pages/settings/settings.profile.vue:
title: "プロフィール"
name: "名前"

View File

@@ -6,6 +6,14 @@ common:
misskey: "⭐ Fediwersum"
about-title: "⭐ Fediwersum"
about: "Dziękujemy za znalezienie Misskey. Misskey jest <b>zdecentralizowaną platformą mikroblogową</b> powstałą na Ziemi. Ponieważ działa ona w Fediwersum (uniwersum, w którego skład wchodzi wiele sieci społecznościowych), jest ona połączona z innymi platformami społecznościowymi. Spróbujesz odpocząć od zatłoczoneo miasta i zanurzyć się w nowym Internecie?"
customization-tips:
title: "カスタマイズのヒント"
paragraph1: "ホームのカスタマイズでは、ウィジェットを追加/削除したり、ドラッグ&ドロップして並べ替えたりすることができます。"
paragraph2: "一部のウィジェットは、<strong><strong>右</strong>クリック</strong>することで表示を変更することができます。"
paragraph3: "ウィジェットを削除するには、ヘッダーの<strong>「ゴミ箱」</strong>と書かれたエリアにウィジェットをドラッグ&ドロップします。"
paragraph4: "カスタマイズを終了するには、右上の「完了」をクリックします。"
gotit: "Got it!"
name: "Misskey"
time:
unknown: "nieznany"
future: "w przyszłości"
@@ -17,6 +25,7 @@ common:
weeks_ago: "{} tyg. temu"
months_ago: "{} mies. temu"
years_ago: "{} lat temu"
trash: "ゴミ箱"
weekday-short:
sunday: "N"
monday: "Pn"
@@ -25,6 +34,14 @@ common:
thursday: "C"
friday: "P"
saturday: "S"
weekday:
sunday: "日曜日"
monday: "月曜日"
tuesday: "火曜日"
wednesday: "水曜日"
thursday: "木曜日"
friday: "金曜日"
saturday: "土曜日"
reactions:
like: "Lubię"
love: "Kocham"
@@ -58,6 +75,11 @@ common:
opponent-turn: "Kolej na przeciwnika"
turn-of: "Kolej na {}"
past-turn-of: "Kolej {}"
won: "{}の勝ち"
black: "黒"
white: "白"
total: "合計"
this-turn: "{}ターン目"
widgets:
analog-clock: "Zegar analogowy"
profile: "Profil"
@@ -99,6 +121,42 @@ common:
rename: "Zmień nazwę"
stack-left: "Przypnij do lewej"
pop-right: "Odepnij w prawo"
common/views/components/games/reversi/reversi.vue:
title: "Misskey Reversi"
sub-title: "他のMisskeyユーザーとリバーシで対戦しよう"
invite: "招待"
rule: "遊び方"
rule-desc: "リバーシは、相手と交互に石をボードに置いて、相手の石を挟んで自分の色に変えてゆき、最終的に残った石が多い方が勝ちというボードゲームです。"
mode-invite: "招待"
mode-invite-desc: "指定したユーザーと対戦するモードです。"
invitations: "対局の招待があります!"
my-games: "自分の対局"
all-games: "みんなの対局"
enter-username: "ユーザー名を入力してください"
game-state:
ended: "終了"
playing: "進行中"
matching:
waiting-for: "{}を待っています"
cacnel: "キャンセル"
common/views/components/games/reversi/reversi.room.vue:
settings-of-the-game: "ゲームの設定"
choose-map: "マップを選択"
random: "ランダム"
black-or-white: "先手/後手"
black-is: "{}が黒"
rules: "ルール"
is-llotheo: "石の少ない方が勝ち(ロセオ)"
looped-map: "ループマップ"
can-put-everywhere: "どこでも置けるモード"
settings-of-the-bot: "Botの設定"
this-gane-is-started-soon: "ゲームは数秒後に開始されます"
waiting-for-other: "相手の準備が完了するのを待っています"
waiting-for-me: "あなたの準備が完了するのを待っています"
waiting-for-both: "準備中"
cancel: "キャンセル"
ready: "準備完了"
cancel-ready: "準備続行"
common/views/components/connect-failed.vue:
title: "Nie udało się połączyć z serwerem"
description: "Wystąpił problem z Twoim połączeniem z Internetem, lub z serwerem. {Spróbuj ponownie} wkrótce."
@@ -228,6 +286,13 @@ common/views/widgets/broadcast.vue:
no-broadcasts: "Brak transmisji"
have-a-nice-day: "Miłego dnia!"
next: "Dalej"
common/views/widgets/calendar.vue:
year: "{}年"
month: "{}月"
day: "{}日"
today: "今日:"
this-month: "今月:"
this-year: "今年:"
common/views/widgets/donation.vue:
title: "Dotacje"
text: "Aby utrzymywać Misskey, płacimy za domenę, serwery i nie tylko… Nie zarabiamy na tym, więc byłoby nam miło, gdybyśmy uzyskali od Ciebie dotację. Jeżeli jesteś zainteresowany, skontaktuj się z {}. Dziękujemy za wsparcie!"
@@ -248,6 +313,31 @@ common/views/widgets/memo.vue:
title: "Notatka"
memo: "Napisz tutaj!"
save: "Zapisz"
common/views/widgets/slideshow.vue:
folder-customize-mode: "フォルダを指定するには、カスタマイズモードを終了してください"
folder: "クリックしてフォルダを指定してください"
no-image: "このフォルダには画像がありません"
common/views/widgets/tips.vue:
tips-line1: "<kbd>t</kbd>でタイムラインにフォーカスできます"
tips-line2: "<kbd>p</kbd>または<kbd>n</kbd>で投稿フォームを開きます"
tips-line3: "投稿フォームにはファイルをドラッグ&ドロップできます"
tips-line4: "投稿フォームにクリップボードにある画像データをペーストできます"
tips-line5: "ドライブにファイルをドラッグ&ドロップしてアップロードできます"
tips-line6: "ドライブでファイルをドラッグしてフォルダ移動できます"
tips-line7: "ドライブでフォルダをドラッグしてフォルダ移動できます"
tips-line8: "ホームは設定からカスタマイズできます"
tips-line9: "MisskeyはAGPLv3です"
tips-line10: "タイムマシンウィジェットを利用すると、簡単に過去のタイムラインに遡れます"
tips-line11: "投稿の ... をクリックして、投稿をユーザーページにピン留めできます"
tips-line13: "投稿に添付したファイルは全てドライブに保存されます"
tips-line14: "ホームのカスタマイズ中、ウィジェットを右クリックしてデザインを変更できます"
tips-line17: "「**」でテキストを囲むと**強調表示**されます"
tips-line19: "いくつかのウィンドウはブラウザの外に切り離すことができます"
tips-line20: "カレンダーウィジェットのパーセンテージは、経過の割合を示しています"
tips-line21: "APIを利用してbotの開発なども行えます"
tips-line23: "まゆかわいいよまゆ"
tips-line24: "Misskeyは2014年にサービスを開始しました"
tips-line25: "対応ブラウザではMisskeyを開いていなくても通知を受け取れます"
common/views/pages/follow.vue:
signed-in-as: "Zalogowany jako {}"
following: "Śledzisz"
@@ -396,6 +486,9 @@ desktop/views/components/notifications.vue:
more: "Więcej"
empty: "Brak powiadomień"
desktop/views/components/post-form.vue:
add-visible-user: "+ユーザーを追加"
attach-location-information: "位置情報を添付する"
hide-contents: "内容を隠す"
reply-placeholder: "Odpowiedz na ten wpis…"
quote-placeholder: "Zacytuj ten wpis…"
submit: "Wyślij"
@@ -416,6 +509,10 @@ desktop/views/components/post-form.vue:
text-remain: "pozostałe znaki: {}"
recent-tags: "Ostatnie"
click-to-tagging: "Naciśnij aby oznaczyć"
visibility: "公開範囲"
geolocation-alert: "お使いの端末は位置情報に対応していません"
error: "エラー"
enter-username: "ユーザー名を入力してください"
desktop/views/components/post-form-window.vue:
note: "Nowy wpis"
reply: "Odpowiedz"
@@ -536,6 +633,9 @@ desktop/views/components/settings.api.vue:
enter-password: "Wprowadź hasło"
desktop/views/components/settings.apps.vue:
no-apps: "Brak zautoryzowanych aplikacji"
desktop/views/components/settings.drive.vue:
max: "中"
in-use: "使用中"
desktop/views/components/settings.mute.vue:
no-users: "Brak wyciszonych użytkowników"
desktop/views/components/settings.password.vue:
@@ -558,6 +658,7 @@ desktop/views/components/settings.profile.vue:
other: "Inne"
is-bot: "To konto jest prowadzone przez bota"
is-cat: "To konto jest prowadzone przez kota"
profile-updated: "プロフィールを更新しました"
desktop/views/components/sub-note-content.vue:
private: "ten wpis jest prywatny"
deleted: "ten wpis został usunięty"
@@ -631,6 +732,7 @@ desktop/views/pages/welcome.vue:
signin-button: "Zaloguj się"
signup-button: "Zarejestruj się"
timeline: "Oś czasu"
powered-by-misskey: "Powered by <b>Misskey</b>."
desktop/views/pages/drive.vue:
title: "Dysk Misskey"
desktop/views/pages/favorites.vue:
@@ -645,6 +747,14 @@ desktop/views/pages/selectdrive.vue:
ok: "OK"
cancel: "Anuluj"
upload: "Wyślij pliki z Twojego komputera"
desktop/views/pages/search.vue:
not-available: "検索機能を利用することができません。"
not-found: "「{}」に関する投稿は見つかりませんでした。"
desktop/views/pages/share.vue:
share-with: "Misskeyで共有"
close: "閉じる"
desktop/views/pages/tag.vue:
no-posts-found: "ハッシュタグ「{}」が付けられた投稿は見つかりませんでした。"
desktop/views/pages/user-list.users.vue:
users: "Użytkownicy"
add-user: "Dodaj użytkownika"
@@ -800,6 +910,8 @@ mobile/views/components/sub-note-content.vue:
mobile/views/components/timeline.vue:
empty: "Brak wpisów"
load-more: "Więcej"
mobile/views/components/ui.header.vue:
welcome-back: "おかえりなさい、"
mobile/views/components/ui.nav.vue:
timeline: "Oś czasu"
notifications: "Powiadomienia"
@@ -830,6 +942,8 @@ mobile/views/pages/user-lists.vue:
mobile/views/pages/drive.vue:
drive: "Dysk"
more: "Załaduj więcej"
mobile/views/pages/signup.vue:
lets-start: "📦 始めましょう"
mobile/views/pages/followers.vue:
followers-of: "Śledzący {}"
mobile/views/pages/following.vue:
@@ -839,6 +953,14 @@ mobile/views/pages/home.vue:
local: "Lokalne"
hybrid: "Społeczność"
global: "Globalne"
mobile/views/pages/tag.vue:
no-posts-found: "ハッシュタグ「{}」が付けられた投稿は見つかりませんでした。"
mobile/views/pages/welcome.vue:
signup: "新規登録"
mobile/views/pages/widgets.vue:
dashboard: "ダッシュボード"
mobile/views/pages/widgets/activity.vue:
activity: "アクティビティ"
mobile/views/pages/messaging.vue:
messaging: "Wiadomości"
mobile/views/pages/messaging-room.vue:
@@ -854,6 +976,8 @@ mobile/views/pages/note.vue:
mobile/views/pages/notifications.vue:
notifications: "Powiadomienia"
read-all: "Czy na pewno chcesz oznaczyć wszystkie powiadomienia jako przeczytane?"
mobile/views/pages/reversi.vue:
reversi: "リバーシ"
mobile/views/pages/settings/settings.profile.vue:
title: "Profil"
name: "Nazwa"

View File

@@ -6,6 +6,14 @@ common:
misskey: "A ⭐ of fediverse"
about-title: "A ⭐ of fediverse."
about: "Misskeyを見つけていただき、ありがとうございます。Misskeyは、地球で生まれた<b>分散マイクロブログSNS</b>です。Fediverse(様々なSNSで構成される宇宙)の中に存在するため、他のSNSと相互に繋がっています。暫し都会の喧騒から離れて、新しいインターネットにダイブしてみませんか。"
customization-tips:
title: "カスタマイズのヒント"
paragraph1: "ホームのカスタマイズでは、ウィジェットを追加/削除したり、ドラッグ&ドロップして並べ替えたりすることができます。"
paragraph2: "一部のウィジェットは、<strong><strong>右</strong>クリック</strong>することで表示を変更することができます。"
paragraph3: "ウィジェットを削除するには、ヘッダーの<strong>「ゴミ箱」</strong>と書かれたエリアにウィジェットをドラッグ&ドロップします。"
paragraph4: "カスタマイズを終了するには、右上の「完了」をクリックします。"
gotit: "Got it!"
name: "Misskey"
time:
unknown: "なぞのじかん"
future: "未来"
@@ -17,6 +25,7 @@ common:
weeks_ago: "{}週間前"
months_ago: "{}ヶ月前"
years_ago: "{}年前"
trash: "ゴミ箱"
weekday-short:
sunday: "日"
monday: "月"
@@ -25,6 +34,14 @@ common:
thursday: "木"
friday: "金"
saturday: "土"
weekday:
sunday: "日曜日"
monday: "月曜日"
tuesday: "火曜日"
wednesday: "水曜日"
thursday: "木曜日"
friday: "金曜日"
saturday: "土曜日"
reactions:
like: "いいね"
love: "しゅき"
@@ -58,6 +75,11 @@ common:
opponent-turn: "相手のターンです"
turn-of: "{}のターンです"
past-turn-of: "{}のターン"
won: "{}の勝ち"
black: "黒"
white: "白"
total: "合計"
this-turn: "{}ターン目"
widgets:
analog-clock: "アナログ時計"
profile: "プロフィール"
@@ -99,6 +121,42 @@ common:
rename: "名前を変更"
stack-left: "左に重ねる"
pop-right: "右に出す"
common/views/components/games/reversi/reversi.vue:
title: "Misskey Reversi"
sub-title: "他のMisskeyユーザーとリバーシで対戦しよう"
invite: "招待"
rule: "遊び方"
rule-desc: "リバーシは、相手と交互に石をボードに置いて、相手の石を挟んで自分の色に変えてゆき、最終的に残った石が多い方が勝ちというボードゲームです。"
mode-invite: "招待"
mode-invite-desc: "指定したユーザーと対戦するモードです。"
invitations: "対局の招待があります!"
my-games: "自分の対局"
all-games: "みんなの対局"
enter-username: "ユーザー名を入力してください"
game-state:
ended: "終了"
playing: "進行中"
matching:
waiting-for: "{}を待っています"
cacnel: "キャンセル"
common/views/components/games/reversi/reversi.room.vue:
settings-of-the-game: "ゲームの設定"
choose-map: "マップを選択"
random: "ランダム"
black-or-white: "先手/後手"
black-is: "{}が黒"
rules: "ルール"
is-llotheo: "石の少ない方が勝ち(ロセオ)"
looped-map: "ループマップ"
can-put-everywhere: "どこでも置けるモード"
settings-of-the-bot: "Botの設定"
this-gane-is-started-soon: "ゲームは数秒後に開始されます"
waiting-for-other: "相手の準備が完了するのを待っています"
waiting-for-me: "あなたの準備が完了するのを待っています"
waiting-for-both: "準備中"
cancel: "キャンセル"
ready: "準備完了"
cancel-ready: "準備続行"
common/views/components/connect-failed.vue:
title: "サーバーに接続できません"
description: "インターネット回線に問題があるか、サーバーがダウンまたはメンテナンスしている可能性があります。しばらくしてから{再度お試し}ください。"
@@ -228,6 +286,13 @@ common/views/widgets/broadcast.vue:
no-broadcasts: "お知らせはありません"
have-a-nice-day: "良い一日を!"
next: "次"
common/views/widgets/calendar.vue:
year: "{}年"
month: "{}月"
day: "{}日"
today: "今日:"
this-month: "今月:"
this-year: "今年:"
common/views/widgets/donation.vue:
title: "寄付のお願い"
text: "Misskeyの運営にはドメイン、サーバー等のコストが掛かります。Misskeyは広告を掲載したりしないため、収入を皆様からの寄付に頼っています。もしご興味があれば、{}までご連絡ください。ご協力ありがとうございます。"
@@ -248,6 +313,31 @@ common/views/widgets/memo.vue:
title: "付箋"
memo: "ここに書いて!"
save: "保存"
common/views/widgets/slideshow.vue:
folder-customize-mode: "フォルダを指定するには、カスタマイズモードを終了してください"
folder: "クリックしてフォルダを指定してください"
no-image: "このフォルダには画像がありません"
common/views/widgets/tips.vue:
tips-line1: "<kbd>t</kbd>でタイムラインにフォーカスできます"
tips-line2: "<kbd>p</kbd>または<kbd>n</kbd>で投稿フォームを開きます"
tips-line3: "投稿フォームにはファイルをドラッグ&ドロップできます"
tips-line4: "投稿フォームにクリップボードにある画像データをペーストできます"
tips-line5: "ドライブにファイルをドラッグ&ドロップしてアップロードできます"
tips-line6: "ドライブでファイルをドラッグしてフォルダ移動できます"
tips-line7: "ドライブでフォルダをドラッグしてフォルダ移動できます"
tips-line8: "ホームは設定からカスタマイズできます"
tips-line9: "MisskeyはAGPLv3です"
tips-line10: "タイムマシンウィジェットを利用すると、簡単に過去のタイムラインに遡れます"
tips-line11: "投稿の ... をクリックして、投稿をユーザーページにピン留めできます"
tips-line13: "投稿に添付したファイルは全てドライブに保存されます"
tips-line14: "ホームのカスタマイズ中、ウィジェットを右クリックしてデザインを変更できます"
tips-line17: "「**」でテキストを囲むと**強調表示**されます"
tips-line19: "いくつかのウィンドウはブラウザの外に切り離すことができます"
tips-line20: "カレンダーウィジェットのパーセンテージは、経過の割合を示しています"
tips-line21: "APIを利用してbotの開発なども行えます"
tips-line23: "まゆかわいいよまゆ"
tips-line24: "Misskeyは2014年にサービスを開始しました"
tips-line25: "対応ブラウザではMisskeyを開いていなくても通知を受け取れます"
common/views/pages/follow.vue:
signed-in-as: "{}としてサインイン中"
following: "フォロー中"
@@ -396,6 +486,9 @@ desktop/views/components/notifications.vue:
more: "もっと見る"
empty: "ありません!"
desktop/views/components/post-form.vue:
add-visible-user: "+ユーザーを追加"
attach-location-information: "位置情報を添付する"
hide-contents: "内容を隠す"
reply-placeholder: "この投稿への返信..."
quote-placeholder: "この投稿を引用..."
submit: "投稿"
@@ -416,6 +509,10 @@ desktop/views/components/post-form.vue:
text-remain: "残り{}文字"
recent-tags: "最近"
click-to-tagging: "クリックでタグ付け"
visibility: "公開範囲"
geolocation-alert: "お使いの端末は位置情報に対応していません"
error: "エラー"
enter-username: "ユーザー名を入力してください"
desktop/views/components/post-form-window.vue:
note: "新規投稿"
reply: "返信"
@@ -536,6 +633,9 @@ desktop/views/components/settings.api.vue:
enter-password: "パスワードを入力してください"
desktop/views/components/settings.apps.vue:
no-apps: "連携しているアプリケーションはありません"
desktop/views/components/settings.drive.vue:
max: "中"
in-use: "使用中"
desktop/views/components/settings.mute.vue:
no-users: "ミュートしているユーザーはいません"
desktop/views/components/settings.password.vue:
@@ -558,6 +658,7 @@ desktop/views/components/settings.profile.vue:
other: "その他"
is-bot: "このアカウントはBotです"
is-cat: "このアカウントはCatです"
profile-updated: "プロフィールを更新しました"
desktop/views/components/sub-note-content.vue:
private: "この投稿は非公開です"
deleted: "この投稿は削除されました"
@@ -631,6 +732,7 @@ desktop/views/pages/welcome.vue:
signin-button: "やってる"
signup-button: "やる"
timeline: "タイムライン"
powered-by-misskey: "Powered by <b>Misskey</b>."
desktop/views/pages/drive.vue:
title: "Misskey Drive"
desktop/views/pages/favorites.vue:
@@ -645,6 +747,14 @@ desktop/views/pages/selectdrive.vue:
ok: "決定"
cancel: "キャンセル"
upload: "PCからドライブにファイルをアップロード"
desktop/views/pages/search.vue:
not-available: "検索機能を利用することができません。"
not-found: "「{}」に関する投稿は見つかりませんでした。"
desktop/views/pages/share.vue:
share-with: "Misskeyで共有"
close: "閉じる"
desktop/views/pages/tag.vue:
no-posts-found: "ハッシュタグ「{}」が付けられた投稿は見つかりませんでした。"
desktop/views/pages/user-list.users.vue:
users: "ユーザー"
add-user: "ユーザーを追加"
@@ -800,6 +910,8 @@ mobile/views/components/sub-note-content.vue:
mobile/views/components/timeline.vue:
empty: "投稿がありません"
load-more: "もっと"
mobile/views/components/ui.header.vue:
welcome-back: "おかえりなさい、"
mobile/views/components/ui.nav.vue:
timeline: "タイムライン"
notifications: "通知"
@@ -830,6 +942,8 @@ mobile/views/pages/user-lists.vue:
mobile/views/pages/drive.vue:
drive: "ドライブ"
more: "もっと見る"
mobile/views/pages/signup.vue:
lets-start: "📦 始めましょう"
mobile/views/pages/followers.vue:
followers-of: "{}のフォロワー"
mobile/views/pages/following.vue:
@@ -839,6 +953,14 @@ mobile/views/pages/home.vue:
local: "ローカル"
hybrid: "ソーシャル"
global: "グローバル"
mobile/views/pages/tag.vue:
no-posts-found: "ハッシュタグ「{}」が付けられた投稿は見つかりませんでした。"
mobile/views/pages/welcome.vue:
signup: "新規登録"
mobile/views/pages/widgets.vue:
dashboard: "ダッシュボード"
mobile/views/pages/widgets/activity.vue:
activity: "アクティビティ"
mobile/views/pages/messaging.vue:
messaging: "メッセージ"
mobile/views/pages/messaging-room.vue:
@@ -854,6 +976,8 @@ mobile/views/pages/note.vue:
mobile/views/pages/notifications.vue:
notifications: "通知"
read-all: "すべての通知を既読にしますか?"
mobile/views/pages/reversi.vue:
reversi: "リバーシ"
mobile/views/pages/settings/settings.profile.vue:
title: "プロフィール"
name: "名前"

View File

@@ -6,6 +6,14 @@ common:
misskey: "A ⭐ of fediverse"
about-title: "A ⭐ of fediverse."
about: "Misskeyを見つけていただき、ありがとうございます。Misskeyは、地球で生まれた<b>分散マイクロブログSNS</b>です。Fediverse(様々なSNSで構成される宇宙)の中に存在するため、他のSNSと相互に繋がっています。暫し都会の喧騒から離れて、新しいインターネットにダイブしてみませんか。"
customization-tips:
title: "カスタマイズのヒント"
paragraph1: "ホームのカスタマイズでは、ウィジェットを追加/削除したり、ドラッグ&ドロップして並べ替えたりすることができます。"
paragraph2: "一部のウィジェットは、<strong><strong>右</strong>クリック</strong>することで表示を変更することができます。"
paragraph3: "ウィジェットを削除するには、ヘッダーの<strong>「ゴミ箱」</strong>と書かれたエリアにウィジェットをドラッグ&ドロップします。"
paragraph4: "カスタマイズを終了するには、右上の「完了」をクリックします。"
gotit: "Got it!"
name: "Misskey"
time:
unknown: "なぞのじかん"
future: "未来"
@@ -17,6 +25,7 @@ common:
weeks_ago: "{}週間前"
months_ago: "{}ヶ月前"
years_ago: "{}年前"
trash: "ゴミ箱"
weekday-short:
sunday: "日"
monday: "月"
@@ -25,6 +34,14 @@ common:
thursday: "木"
friday: "金"
saturday: "土"
weekday:
sunday: "日曜日"
monday: "月曜日"
tuesday: "火曜日"
wednesday: "水曜日"
thursday: "木曜日"
friday: "金曜日"
saturday: "土曜日"
reactions:
like: "いいね"
love: "しゅき"
@@ -58,6 +75,11 @@ common:
opponent-turn: "相手のターンです"
turn-of: "{}のターンです"
past-turn-of: "{}のターン"
won: "{}の勝ち"
black: "黒"
white: "白"
total: "合計"
this-turn: "{}ターン目"
widgets:
analog-clock: "アナログ時計"
profile: "プロフィール"
@@ -99,6 +121,42 @@ common:
rename: "名前を変更"
stack-left: "左に重ねる"
pop-right: "右に出す"
common/views/components/games/reversi/reversi.vue:
title: "Misskey Reversi"
sub-title: "他のMisskeyユーザーとリバーシで対戦しよう"
invite: "招待"
rule: "遊び方"
rule-desc: "リバーシは、相手と交互に石をボードに置いて、相手の石を挟んで自分の色に変えてゆき、最終的に残った石が多い方が勝ちというボードゲームです。"
mode-invite: "招待"
mode-invite-desc: "指定したユーザーと対戦するモードです。"
invitations: "対局の招待があります!"
my-games: "自分の対局"
all-games: "みんなの対局"
enter-username: "ユーザー名を入力してください"
game-state:
ended: "終了"
playing: "進行中"
matching:
waiting-for: "{}を待っています"
cacnel: "キャンセル"
common/views/components/games/reversi/reversi.room.vue:
settings-of-the-game: "ゲームの設定"
choose-map: "マップを選択"
random: "ランダム"
black-or-white: "先手/後手"
black-is: "{}が黒"
rules: "ルール"
is-llotheo: "石の少ない方が勝ち(ロセオ)"
looped-map: "ループマップ"
can-put-everywhere: "どこでも置けるモード"
settings-of-the-bot: "Botの設定"
this-gane-is-started-soon: "ゲームは数秒後に開始されます"
waiting-for-other: "相手の準備が完了するのを待っています"
waiting-for-me: "あなたの準備が完了するのを待っています"
waiting-for-both: "準備中"
cancel: "キャンセル"
ready: "準備完了"
cancel-ready: "準備続行"
common/views/components/connect-failed.vue:
title: "サーバーに接続できません"
description: "インターネット回線に問題があるか、サーバーがダウンまたはメンテナンスしている可能性があります。しばらくしてから{再度お試し}ください。"
@@ -228,6 +286,13 @@ common/views/widgets/broadcast.vue:
no-broadcasts: "お知らせはありません"
have-a-nice-day: "良い一日を!"
next: "次"
common/views/widgets/calendar.vue:
year: "{}年"
month: "{}月"
day: "{}日"
today: "今日:"
this-month: "今月:"
this-year: "今年:"
common/views/widgets/donation.vue:
title: "寄付のお願い"
text: "Misskeyの運営にはドメイン、サーバー等のコストが掛かります。Misskeyは広告を掲載したりしないため、収入を皆様からの寄付に頼っています。もしご興味があれば、{}までご連絡ください。ご協力ありがとうございます。"
@@ -248,6 +313,31 @@ common/views/widgets/memo.vue:
title: "付箋"
memo: "ここに書いて!"
save: "保存"
common/views/widgets/slideshow.vue:
folder-customize-mode: "フォルダを指定するには、カスタマイズモードを終了してください"
folder: "クリックしてフォルダを指定してください"
no-image: "このフォルダには画像がありません"
common/views/widgets/tips.vue:
tips-line1: "<kbd>t</kbd>でタイムラインにフォーカスできます"
tips-line2: "<kbd>p</kbd>または<kbd>n</kbd>で投稿フォームを開きます"
tips-line3: "投稿フォームにはファイルをドラッグ&ドロップできます"
tips-line4: "投稿フォームにクリップボードにある画像データをペーストできます"
tips-line5: "ドライブにファイルをドラッグ&ドロップしてアップロードできます"
tips-line6: "ドライブでファイルをドラッグしてフォルダ移動できます"
tips-line7: "ドライブでフォルダをドラッグしてフォルダ移動できます"
tips-line8: "ホームは設定からカスタマイズできます"
tips-line9: "MisskeyはAGPLv3です"
tips-line10: "タイムマシンウィジェットを利用すると、簡単に過去のタイムラインに遡れます"
tips-line11: "投稿の ... をクリックして、投稿をユーザーページにピン留めできます"
tips-line13: "投稿に添付したファイルは全てドライブに保存されます"
tips-line14: "ホームのカスタマイズ中、ウィジェットを右クリックしてデザインを変更できます"
tips-line17: "「**」でテキストを囲むと**強調表示**されます"
tips-line19: "いくつかのウィンドウはブラウザの外に切り離すことができます"
tips-line20: "カレンダーウィジェットのパーセンテージは、経過の割合を示しています"
tips-line21: "APIを利用してbotの開発なども行えます"
tips-line23: "まゆかわいいよまゆ"
tips-line24: "Misskeyは2014年にサービスを開始しました"
tips-line25: "対応ブラウザではMisskeyを開いていなくても通知を受け取れます"
common/views/pages/follow.vue:
signed-in-as: "{}としてサインイン中"
following: "フォロー中"
@@ -396,6 +486,9 @@ desktop/views/components/notifications.vue:
more: "もっと見る"
empty: "ありません!"
desktop/views/components/post-form.vue:
add-visible-user: "+ユーザーを追加"
attach-location-information: "位置情報を添付する"
hide-contents: "内容を隠す"
reply-placeholder: "この投稿への返信..."
quote-placeholder: "この投稿を引用..."
submit: "投稿"
@@ -416,6 +509,10 @@ desktop/views/components/post-form.vue:
text-remain: "残り{}文字"
recent-tags: "最近"
click-to-tagging: "クリックでタグ付け"
visibility: "公開範囲"
geolocation-alert: "お使いの端末は位置情報に対応していません"
error: "エラー"
enter-username: "ユーザー名を入力してください"
desktop/views/components/post-form-window.vue:
note: "新規投稿"
reply: "返信"
@@ -536,6 +633,9 @@ desktop/views/components/settings.api.vue:
enter-password: "パスワードを入力してください"
desktop/views/components/settings.apps.vue:
no-apps: "連携しているアプリケーションはありません"
desktop/views/components/settings.drive.vue:
max: "中"
in-use: "使用中"
desktop/views/components/settings.mute.vue:
no-users: "ミュートしているユーザーはいません"
desktop/views/components/settings.password.vue:
@@ -558,6 +658,7 @@ desktop/views/components/settings.profile.vue:
other: "その他"
is-bot: "このアカウントはBotです"
is-cat: "このアカウントはCatです"
profile-updated: "プロフィールを更新しました"
desktop/views/components/sub-note-content.vue:
private: "この投稿は非公開です"
deleted: "この投稿は削除されました"
@@ -631,6 +732,7 @@ desktop/views/pages/welcome.vue:
signin-button: "やってる"
signup-button: "やる"
timeline: "タイムライン"
powered-by-misskey: "Powered by <b>Misskey</b>."
desktop/views/pages/drive.vue:
title: "Misskey Drive"
desktop/views/pages/favorites.vue:
@@ -645,6 +747,14 @@ desktop/views/pages/selectdrive.vue:
ok: "決定"
cancel: "キャンセル"
upload: "PCからドライブにファイルをアップロード"
desktop/views/pages/search.vue:
not-available: "検索機能を利用することができません。"
not-found: "「{}」に関する投稿は見つかりませんでした。"
desktop/views/pages/share.vue:
share-with: "Misskeyで共有"
close: "閉じる"
desktop/views/pages/tag.vue:
no-posts-found: "ハッシュタグ「{}」が付けられた投稿は見つかりませんでした。"
desktop/views/pages/user-list.users.vue:
users: "ユーザー"
add-user: "ユーザーを追加"
@@ -800,6 +910,8 @@ mobile/views/components/sub-note-content.vue:
mobile/views/components/timeline.vue:
empty: "投稿がありません"
load-more: "もっと"
mobile/views/components/ui.header.vue:
welcome-back: "おかえりなさい、"
mobile/views/components/ui.nav.vue:
timeline: "タイムライン"
notifications: "通知"
@@ -830,6 +942,8 @@ mobile/views/pages/user-lists.vue:
mobile/views/pages/drive.vue:
drive: "ドライブ"
more: "もっと見る"
mobile/views/pages/signup.vue:
lets-start: "📦 始めましょう"
mobile/views/pages/followers.vue:
followers-of: "{}のフォロワー"
mobile/views/pages/following.vue:
@@ -839,6 +953,14 @@ mobile/views/pages/home.vue:
local: "ローカル"
hybrid: "ソーシャル"
global: "グローバル"
mobile/views/pages/tag.vue:
no-posts-found: "ハッシュタグ「{}」が付けられた投稿は見つかりませんでした。"
mobile/views/pages/welcome.vue:
signup: "新規登録"
mobile/views/pages/widgets.vue:
dashboard: "ダッシュボード"
mobile/views/pages/widgets/activity.vue:
activity: "アクティビティ"
mobile/views/pages/messaging.vue:
messaging: "メッセージ"
mobile/views/pages/messaging-room.vue:
@@ -854,6 +976,8 @@ mobile/views/pages/note.vue:
mobile/views/pages/notifications.vue:
notifications: "通知"
read-all: "すべての通知を既読にしますか?"
mobile/views/pages/reversi.vue:
reversi: "リバーシ"
mobile/views/pages/settings/settings.profile.vue:
title: "プロフィール"
name: "名前"

View File

@@ -6,6 +6,14 @@ common:
misskey: "A ⭐ of fediverse"
about-title: "A ⭐ of fediverse."
about: "Misskeyを見つけていただき、ありがとうございます。Misskeyは、地球で生まれた<b>分散マイクロブログSNS</b>です。Fediverse(様々なSNSで構成される宇宙)の中に存在するため、他のSNSと相互に繋がっています。暫し都会の喧騒から離れて、新しいインターネットにダイブしてみませんか。"
customization-tips:
title: "カスタマイズのヒント"
paragraph1: "ホームのカスタマイズでは、ウィジェットを追加/削除したり、ドラッグ&ドロップして並べ替えたりすることができます。"
paragraph2: "一部のウィジェットは、<strong><strong>右</strong>クリック</strong>することで表示を変更することができます。"
paragraph3: "ウィジェットを削除するには、ヘッダーの<strong>「ゴミ箱」</strong>と書かれたエリアにウィジェットをドラッグ&ドロップします。"
paragraph4: "カスタマイズを終了するには、右上の「完了」をクリックします。"
gotit: "Got it!"
name: "Misskey"
time:
unknown: "なぞのじかん"
future: "未来"
@@ -17,6 +25,7 @@ common:
weeks_ago: "{}週間前"
months_ago: "{}ヶ月前"
years_ago: "{}年前"
trash: "ゴミ箱"
weekday-short:
sunday: "日"
monday: "月"
@@ -25,6 +34,14 @@ common:
thursday: "木"
friday: "金"
saturday: "土"
weekday:
sunday: "日曜日"
monday: "月曜日"
tuesday: "火曜日"
wednesday: "水曜日"
thursday: "木曜日"
friday: "金曜日"
saturday: "土曜日"
reactions:
like: "いいね"
love: "しゅき"
@@ -58,6 +75,11 @@ common:
opponent-turn: "相手のターンです"
turn-of: "{}のターンです"
past-turn-of: "{}のターン"
won: "{}の勝ち"
black: "黒"
white: "白"
total: "合計"
this-turn: "{}ターン目"
widgets:
analog-clock: "アナログ時計"
profile: "プロフィール"
@@ -99,6 +121,42 @@ common:
rename: "名前を変更"
stack-left: "左に重ねる"
pop-right: "右に出す"
common/views/components/games/reversi/reversi.vue:
title: "Misskey Reversi"
sub-title: "他のMisskeyユーザーとリバーシで対戦しよう"
invite: "招待"
rule: "遊び方"
rule-desc: "リバーシは、相手と交互に石をボードに置いて、相手の石を挟んで自分の色に変えてゆき、最終的に残った石が多い方が勝ちというボードゲームです。"
mode-invite: "招待"
mode-invite-desc: "指定したユーザーと対戦するモードです。"
invitations: "対局の招待があります!"
my-games: "自分の対局"
all-games: "みんなの対局"
enter-username: "ユーザー名を入力してください"
game-state:
ended: "終了"
playing: "進行中"
matching:
waiting-for: "{}を待っています"
cacnel: "キャンセル"
common/views/components/games/reversi/reversi.room.vue:
settings-of-the-game: "ゲームの設定"
choose-map: "マップを選択"
random: "ランダム"
black-or-white: "先手/後手"
black-is: "{}が黒"
rules: "ルール"
is-llotheo: "石の少ない方が勝ち(ロセオ)"
looped-map: "ループマップ"
can-put-everywhere: "どこでも置けるモード"
settings-of-the-bot: "Botの設定"
this-gane-is-started-soon: "ゲームは数秒後に開始されます"
waiting-for-other: "相手の準備が完了するのを待っています"
waiting-for-me: "あなたの準備が完了するのを待っています"
waiting-for-both: "準備中"
cancel: "キャンセル"
ready: "準備完了"
cancel-ready: "準備続行"
common/views/components/connect-failed.vue:
title: "サーバーに接続できません"
description: "インターネット回線に問題があるか、サーバーがダウンまたはメンテナンスしている可能性があります。しばらくしてから{再度お試し}ください。"
@@ -228,6 +286,13 @@ common/views/widgets/broadcast.vue:
no-broadcasts: "お知らせはありません"
have-a-nice-day: "良い一日を!"
next: "次"
common/views/widgets/calendar.vue:
year: "{}年"
month: "{}月"
day: "{}日"
today: "今日:"
this-month: "今月:"
this-year: "今年:"
common/views/widgets/donation.vue:
title: "寄付のお願い"
text: "Misskeyの運営にはドメイン、サーバー等のコストが掛かります。Misskeyは広告を掲載したりしないため、収入を皆様からの寄付に頼っています。もしご興味があれば、{}までご連絡ください。ご協力ありがとうございます。"
@@ -248,6 +313,31 @@ common/views/widgets/memo.vue:
title: "付箋"
memo: "ここに書いて!"
save: "保存"
common/views/widgets/slideshow.vue:
folder-customize-mode: "フォルダを指定するには、カスタマイズモードを終了してください"
folder: "クリックしてフォルダを指定してください"
no-image: "このフォルダには画像がありません"
common/views/widgets/tips.vue:
tips-line1: "<kbd>t</kbd>でタイムラインにフォーカスできます"
tips-line2: "<kbd>p</kbd>または<kbd>n</kbd>で投稿フォームを開きます"
tips-line3: "投稿フォームにはファイルをドラッグ&ドロップできます"
tips-line4: "投稿フォームにクリップボードにある画像データをペーストできます"
tips-line5: "ドライブにファイルをドラッグ&ドロップしてアップロードできます"
tips-line6: "ドライブでファイルをドラッグしてフォルダ移動できます"
tips-line7: "ドライブでフォルダをドラッグしてフォルダ移動できます"
tips-line8: "ホームは設定からカスタマイズできます"
tips-line9: "MisskeyはAGPLv3です"
tips-line10: "タイムマシンウィジェットを利用すると、簡単に過去のタイムラインに遡れます"
tips-line11: "投稿の ... をクリックして、投稿をユーザーページにピン留めできます"
tips-line13: "投稿に添付したファイルは全てドライブに保存されます"
tips-line14: "ホームのカスタマイズ中、ウィジェットを右クリックしてデザインを変更できます"
tips-line17: "「**」でテキストを囲むと**強調表示**されます"
tips-line19: "いくつかのウィンドウはブラウザの外に切り離すことができます"
tips-line20: "カレンダーウィジェットのパーセンテージは、経過の割合を示しています"
tips-line21: "APIを利用してbotの開発なども行えます"
tips-line23: "まゆかわいいよまゆ"
tips-line24: "Misskeyは2014年にサービスを開始しました"
tips-line25: "対応ブラウザではMisskeyを開いていなくても通知を受け取れます"
common/views/pages/follow.vue:
signed-in-as: "{}としてサインイン中"
following: "フォロー中"
@@ -396,6 +486,9 @@ desktop/views/components/notifications.vue:
more: "もっと見る"
empty: "ありません!"
desktop/views/components/post-form.vue:
add-visible-user: "+ユーザーを追加"
attach-location-information: "位置情報を添付する"
hide-contents: "内容を隠す"
reply-placeholder: "この投稿への返信..."
quote-placeholder: "この投稿を引用..."
submit: "投稿"
@@ -416,6 +509,10 @@ desktop/views/components/post-form.vue:
text-remain: "残り{}文字"
recent-tags: "最近"
click-to-tagging: "クリックでタグ付け"
visibility: "公開範囲"
geolocation-alert: "お使いの端末は位置情報に対応していません"
error: "エラー"
enter-username: "ユーザー名を入力してください"
desktop/views/components/post-form-window.vue:
note: "新規投稿"
reply: "返信"
@@ -536,6 +633,9 @@ desktop/views/components/settings.api.vue:
enter-password: "パスワードを入力してください"
desktop/views/components/settings.apps.vue:
no-apps: "連携しているアプリケーションはありません"
desktop/views/components/settings.drive.vue:
max: "中"
in-use: "使用中"
desktop/views/components/settings.mute.vue:
no-users: "ミュートしているユーザーはいません"
desktop/views/components/settings.password.vue:
@@ -558,6 +658,7 @@ desktop/views/components/settings.profile.vue:
other: "その他"
is-bot: "このアカウントはBotです"
is-cat: "このアカウントはCatです"
profile-updated: "プロフィールを更新しました"
desktop/views/components/sub-note-content.vue:
private: "この投稿は非公開です"
deleted: "この投稿は削除されました"
@@ -631,6 +732,7 @@ desktop/views/pages/welcome.vue:
signin-button: "やってる"
signup-button: "やる"
timeline: "タイムライン"
powered-by-misskey: "Powered by <b>Misskey</b>."
desktop/views/pages/drive.vue:
title: "Misskey Drive"
desktop/views/pages/favorites.vue:
@@ -645,6 +747,14 @@ desktop/views/pages/selectdrive.vue:
ok: "決定"
cancel: "キャンセル"
upload: "PCからドライブにファイルをアップロード"
desktop/views/pages/search.vue:
not-available: "検索機能を利用することができません。"
not-found: "「{}」に関する投稿は見つかりませんでした。"
desktop/views/pages/share.vue:
share-with: "Misskeyで共有"
close: "閉じる"
desktop/views/pages/tag.vue:
no-posts-found: "ハッシュタグ「{}」が付けられた投稿は見つかりませんでした。"
desktop/views/pages/user-list.users.vue:
users: "ユーザー"
add-user: "ユーザーを追加"
@@ -800,6 +910,8 @@ mobile/views/components/sub-note-content.vue:
mobile/views/components/timeline.vue:
empty: "投稿がありません"
load-more: "もっと"
mobile/views/components/ui.header.vue:
welcome-back: "おかえりなさい、"
mobile/views/components/ui.nav.vue:
timeline: "タイムライン"
notifications: "通知"
@@ -830,6 +942,8 @@ mobile/views/pages/user-lists.vue:
mobile/views/pages/drive.vue:
drive: "ドライブ"
more: "もっと見る"
mobile/views/pages/signup.vue:
lets-start: "📦 始めましょう"
mobile/views/pages/followers.vue:
followers-of: "{}のフォロワー"
mobile/views/pages/following.vue:
@@ -839,6 +953,14 @@ mobile/views/pages/home.vue:
local: "ローカル"
hybrid: "ソーシャル"
global: "グローバル"
mobile/views/pages/tag.vue:
no-posts-found: "ハッシュタグ「{}」が付けられた投稿は見つかりませんでした。"
mobile/views/pages/welcome.vue:
signup: "新規登録"
mobile/views/pages/widgets.vue:
dashboard: "ダッシュボード"
mobile/views/pages/widgets/activity.vue:
activity: "アクティビティ"
mobile/views/pages/messaging.vue:
messaging: "メッセージ"
mobile/views/pages/messaging-room.vue:
@@ -854,6 +976,8 @@ mobile/views/pages/note.vue:
mobile/views/pages/notifications.vue:
notifications: "通知"
read-all: "すべての通知を既読にしますか?"
mobile/views/pages/reversi.vue:
reversi: "リバーシ"
mobile/views/pages/settings/settings.profile.vue:
title: "プロフィール"
name: "名前"

View File

@@ -1,8 +1,8 @@
{
"name": "misskey",
"author": "syuilo <i@syuilo.com>",
"version": "5.6.2",
"clientVersion": "1.0.7643",
"version": "5.10.0",
"clientVersion": "1.0.7828",
"codename": "nighthike",
"main": "./built/index.js",
"private": true,
@@ -54,13 +54,13 @@
"@types/koa-router": "7.0.31",
"@types/koa-send": "4.1.1",
"@types/koa-views": "2.0.3",
"@types/koa__cors": "2.2.2",
"@types/koa__cors": "2.2.3",
"@types/minio": "6.0.2",
"@types/mkdirp": "0.5.2",
"@types/mocha": "5.2.3",
"@types/mongodb": "3.1.2",
"@types/ms": "0.7.30",
"@types/node": "10.5.4",
"@types/node": "10.5.5",
"@types/parse5": "5.0.0",
"@types/portscanner": "2.1.0",
"@types/pug": "2.0.4",
@@ -90,6 +90,7 @@
"bootstrap-vue": "2.0.0-rc.11",
"cafy": "11.3.0",
"chalk": "2.4.1",
"commander": "2.16.0",
"crc-32": "1.2.0",
"css-loader": "1.0.0",
"dateformat": "3.0.3",
@@ -123,7 +124,7 @@
"gulp-typescript": "4.0.2",
"gulp-uglify": "3.0.1",
"gulp-util": "3.0.8",
"hard-source-webpack-plugin": "0.11.2",
"hard-source-webpack-plugin": "0.12.0",
"highlight.js": "9.12.0",
"html-minifier": "3.5.19",
"http-signature": "1.2.0",
@@ -167,7 +168,7 @@
"promise-sequential": "1.1.1",
"pug": "2.0.3",
"punycode": "2.1.1",
"qrcode": "1.2.0",
"qrcode": "1.2.2",
"ratelimiter": "3.2.0",
"recaptcha-promise": "0.1.3",
"reconnecting-websocket": "3.2.2",
@@ -177,7 +178,7 @@
"rimraf": "2.6.2",
"rndstr": "1.0.0",
"s-age": "1.1.2",
"sass-loader": "7.0.3",
"sass-loader": "7.1.0",
"seedrandom": "2.4.3",
"sharp": "0.20.5",
"showdown": "1.8.6",
@@ -201,14 +202,14 @@
"url-loader": "1.0.1",
"uuid": "3.3.2",
"v-animate-css": "0.0.2",
"vue": "2.5.16",
"vue": "2.5.17",
"vue-cropperjs": "2.2.1",
"vue-js-modal": "1.3.16",
"vue-json-tree-view": "2.1.4",
"vue-loader": "15.2.6",
"vue-router": "3.0.1",
"vue-style-loader": "4.1.1",
"vue-template-compiler": "2.5.16",
"vue-template-compiler": "2.5.17",
"vuedraggable": "2.16.0",
"vuex": "3.0.1",
"vuex-persistedstate": "2.5.4",

View File

@@ -1,14 +1,14 @@
<template>
<div class="root">
<header><b>{{ blackUser.name }}</b>() vs <b>{{ whiteUser.name }}</b>()</header>
<header><b>{{ blackUser | userName }}</b>(%i18n:common.reversi.black%) vs <b>{{ whiteUser | userName }}</b>(%i18n:common.reversi.white%)</header>
<div style="overflow: hidden">
<p class="turn" v-if="!iAmPlayer && !game.isEnded">{{ '%i18n:common.reversi.turn-of%'.replace('{}', turnUser.name) }}<mk-ellipsis/></p>
<p class="turn" v-if="logPos != logs.length">{{ '%i18n:common.reversi.past-turn-of%'.replace('{}', turnUser.name) }}</p>
<p class="turn" v-if="!iAmPlayer && !game.isEnded">{{ '%i18n:common.reversi.turn-of%'.replace('{}', turnUser | userName) }}<mk-ellipsis/></p>
<p class="turn" v-if="logPos != logs.length">{{ '%i18n:common.reversi.past-turn-of%'.replace('{}', turnUser | userName) }}</p>
<p class="turn1" v-if="iAmPlayer && !game.isEnded && !isMyTurn">%i18n:common.reversi.opponent-turn%<mk-ellipsis/></p>
<p class="turn2" v-if="iAmPlayer && !game.isEnded && isMyTurn" v-animate-css="{ classes: 'tada', iteration: 'infinite' }">%i18n:common.reversi.my-turn%</p>
<p class="result" v-if="game.isEnded && logPos == logs.length">
<template v-if="game.winner"><b>{{ game.winner.name }}</b>の勝ち{{ game.settings.isLlotheo ? ' (ロセオ)' : '' }}</template>
<template v-if="game.winner">{{ '%i18n:common.reversi.won%'.replace('{}', game.winner | userName) }}{{ game.settings.isLlotheo ? ' (ロセオ)' : '' }}</template>
<template v-else>%i18n:common.reversi.drawn%</template>
</p>
</div>
@@ -39,7 +39,7 @@
</div>
</div>
<p class="status"><b>{{ logPos }}ターン目</b> :{{ o.blackCount }} :{{ o.whiteCount }} 合計:{{ o.blackCount + o.whiteCount }}</p>
<p class="status"><b>{{ '%i18n:common.reversi.this-turn%'.split('{}')[0] }}{{ logPos }}{{ '%i18n:common.reversi.this-turn%'.split('{}')[1] }}</b> %i18n:common.reversi.black%:{{ o.blackCount }} %i18n:common.reversi.white%:{{ o.whiteCount }} %i18n:common.reversi.total%:{{ o.blackCount + o.whiteCount }}</p>
<div class="player" v-if="game.isEnded">
<el-button-group>
@@ -111,8 +111,8 @@ export default Vue.extend({
},
cellsStyle(): any {
return {
'grid-template-rows': `repeat(${ this.game.settings.map.length }, 1fr)`,
'grid-template-columns': `repeat(${ this.game.settings.map[0].length }, 1fr)`
'grid-template-rows': `repeat(${this.game.settings.map.length}, 1fr)`,
'grid-template-columns': `repeat(${this.game.settings.map[0].length}, 1fr)`
};
}
},

View File

@@ -1,14 +1,14 @@
<template>
<div class="root">
<header><b>{{ game.user1.name }}</b> vs <b>{{ game.user2.name }}</b></header>
<header><b>{{ game.user1 | userName }}</b> vs <b>{{ game.user2 | userName }}</b></header>
<div>
<p>ゲームの設定</p>
<p>%i18n:@settings-of-the-game%</p>
<el-card class="map">
<div slot="header">
<el-select :class="$style.mapSelect" v-model="mapName" placeholder="マップを選択" @change="onMapChange">
<el-option label="ランダム" :value="null"/>
<el-select :class="$style.mapSelect" v-model="mapName" placeholder="%i18n:@choose-map%" @change="onMapChange">
<el-option label="%i18n:@random%" :value="null"/>
<el-option-group v-for="c in mapCategories" :key="c" :label="c">
<el-option v-for="m in maps" v-if="m.category == c" :key="m.name" :label="m.name" :value="m.name">
<span style="float: left">{{ m.name }}</span>
@@ -30,25 +30,25 @@
<el-card class="bw">
<div slot="header">
<span>先手/後手</span>
<span>%i18n:@black-or-white%</span>
</div>
<el-radio v-model="game.settings.bw" label="random" @change="updateSettings">ランダム</el-radio>
<el-radio v-model="game.settings.bw" :label="1" @change="updateSettings">{{ game.user1.name }}が黒</el-radio>
<el-radio v-model="game.settings.bw" :label="2" @change="updateSettings">{{ game.user2.name }}が黒</el-radio>
<el-radio v-model="game.settings.bw" label="random" @change="updateSettings">%i18n:@random%</el-radio>
<el-radio v-model="game.settings.bw" :label="1" @change="updateSettings">{{ '%i18n:@black-is%'.split('{}')[0] }}{{ game.user1.name }}{{ '%i18n:@black-is%'.split('{}')[1] }}</el-radio>
<el-radio v-model="game.settings.bw" :label="2" @change="updateSettings">{{ '%i18n:@black-is%'.split('{}')[0] }}{{ game.user2.name }}{{ '%i18n:@black-is%'.split('{}')[1] }}</el-radio>
</el-card>
<el-card class="rules">
<div slot="header">
<span>ルール</span>
<span>%i18n:@rules%</span>
</div>
<mk-switch v-model="game.settings.isLlotheo" @change="updateSettings" text="石の少ない方が勝ち(ロセオ)"/>
<mk-switch v-model="game.settings.loopedBoard" @change="updateSettings" text="ループマップ"/>
<mk-switch v-model="game.settings.canPutEverywhere" @change="updateSettings" text="どこでも置けるモード"/>
<mk-switch v-model="game.settings.isLlotheo" @change="updateSettings" text="%i18n:@is-llotheo%"/>
<mk-switch v-model="game.settings.loopedBoard" @change="updateSettings" text="%i18n:@looped-map%"/>
<mk-switch v-model="game.settings.canPutEverywhere" @change="updateSettings" text="%i18n:@can-put-everywhere%"/>
</el-card>
<el-card class="bot-form" v-if="form">
<div slot="header">
<span>Botの設定</span>
<span>%i18n:@settings-of-the-bot%</span>
</div>
<el-alert v-for="message in messages"
:title="message.text"
@@ -77,16 +77,16 @@
<footer>
<p class="status">
<template v-if="isAccepted && isOpAccepted">ゲームは数秒後に開始されます<mk-ellipsis/></template>
<template v-if="isAccepted && !isOpAccepted">相手の準備が完了するのを待っています<mk-ellipsis/></template>
<template v-if="!isAccepted && isOpAccepted">あなたの準備が完了するのを待っています</template>
<template v-if="!isAccepted && !isOpAccepted">準備中<mk-ellipsis/></template>
<template v-if="isAccepted && isOpAccepted">%i18n:@this-gane-is-started-soon%<mk-ellipsis/></template>
<template v-if="isAccepted && !isOpAccepted">%i18n:@waiting-for-other%<mk-ellipsis/></template>
<template v-if="!isAccepted && isOpAccepted">%i18n:@waiting-for-me%</template>
<template v-if="!isAccepted && !isOpAccepted">%i18n:@waiting-for-both%<mk-ellipsis/></template>
</p>
<div class="actions">
<el-button @click="exit">キャンセル</el-button>
<el-button type="primary" @click="accept" v-if="!isAccepted">準備完了</el-button>
<el-button type="primary" @click="cancel" v-if="isAccepted">準備続行</el-button>
<el-button @click="exit">%i18n:@cancel%</el-button>
<el-button type="primary" @click="accept" v-if="!isAccepted">%i18n:@ready%</el-button>
<el-button type="primary" @click="cancel" v-if="isAccepted">%i18n:@cancel-ready%</el-button>
</div>
</footer>
</div>

View File

@@ -4,55 +4,53 @@
<x-gameroom :game="game"/>
</div>
<div class="matching" v-else-if="matching">
<h1><b>{{ matching.name }}</b>を待っています<mk-ellipsis/></h1>
<h1>{{ '%i18n:@matching.waiting-for%'.split('{}')[0] }}<b>{{ matching | userName }}</b>{{ '%i18n:@matching.waiting-for%'.split('{}')[1] }}<mk-ellipsis/></h1>
<div class="cancel">
<el-button round @click="cancel">キャンセル</el-button>
<el-button round @click="cancel">%i18n:@matching.cancel%</el-button>
</div>
</div>
<div class="index" v-else>
<h1>Misskey Reversi</h1>
<p>他のMisskeyユーザーとリバーシで対戦しよう</p>
<h1>%i18n:@title%</h1>
<p>%i18n:@sub-title%</p>
<div class="play">
<el-button round>フリーマッチ(準備中)</el-button>
<el-button type="primary" round @click="match">指名</el-button>
<!--<el-button round>フリーマッチ(準備中)</el-button>-->
<el-button type="primary" round @click="match">%i18n:@invite%</el-button>
<details>
<summary>遊び方</summary>
<summary>%i18n:@rule%</summary>
<div>
<p>リバーシは相手と交互に石をボードに置いてゆき相手の石を挟んでひっくり返しながら最終的に残った石が多い方が勝ちというボードゲームです</p>
<p>%i18n:@rule-desc%</p>
<dl>
<dt><b>フリーマッチ</b></dt>
<dd>ランダムなユーザーと対戦するモードです</dd>
<dt><b>指名</b></dt>
<dd>指定したユーザーと対戦するモードです</dd>
<dt><b>%i18n:@mode-invite%</b></dt>
<dd>%i18n:@mode-invite-desc%</dd>
</dl>
</div>
</details>
</div>
<section v-if="invitations.length > 0">
<h2>対局の招待があります:</h2>
<h2>%i18n:@invitations%</h2>
<div class="invitation" v-for="i in invitations" tabindex="-1" @click="accept(i)">
<mk-avatar class="avatar" :user="i.parent"/>
<span class="name"><b>{{ i.parent.name }}</b></span>
<span class="name"><b>{{ i.parent | userName }}</b></span>
<span class="username">@{{ i.parent.username }}</span>
<mk-time :time="i.createdAt"/>
</div>
</section>
<section v-if="myGames.length > 0">
<h2>自分の対局</h2>
<h2>%i18n:@my-games%</h2>
<a class="game" v-for="g in myGames" tabindex="-1" @click.prevent="go(g)" :href="`/reversi/${g.id}`">
<mk-avatar class="avatar" :user="g.user1"/>
<mk-avatar class="avatar" :user="g.user2"/>
<span><b>{{ g.user1.name }}</b> vs <b>{{ g.user2.name }}</b></span>
<span class="state">{{ g.isEnded ? '終了' : '進行中' }}</span>
<span><b>{{ g.user1 | userName }}</b> vs <b>{{ g.user2 | userName }}</b></span>
<span class="state">{{ g.isEnded ? '%i18n:@game-state.ended%' : '%i18n:@game-state.playing%' }}</span>
</a>
</section>
<section v-if="games.length > 0">
<h2>みんなの対局</h2>
<h2>%i18n:@all-games%</h2>
<a class="game" v-for="g in games" tabindex="-1" @click.prevent="go(g)" :href="`/reversi/${g.id}`">
<mk-avatar class="avatar" :user="g.user1"/>
<mk-avatar class="avatar" :user="g.user2"/>
<span><b>{{ g.user1.name }}</b> vs <b>{{ g.user2.name }}</b></span>
<span class="state">{{ g.isEnded ? '終了' : '進行中' }}</span>
<span><b>{{ g.user1 | userName }}</b> vs <b>{{ g.user2 | userName }}</b></span>
<span class="state">{{ g.isEnded ? '%i18n:@game-state.ended%' : '%i18n:@game-state.playing%' }}</span>
</a>
</section>
</div>
@@ -153,7 +151,7 @@ export default Vue.extend({
match() {
(this as any).apis.input({
title: 'ユーザー名を入力してください'
title: '%i18n:@enter-username%'
}).then(username => {
(this as any).api('users/show', {
username

View File

@@ -79,7 +79,8 @@ root(isDark)
> .content
> .balloon
display block
display flex
align-items center
padding 0
max-width calc(100% - 16px)
min-height 38px
@@ -254,7 +255,7 @@ root(isDark)
font-size 11px
&[data-is-deleted]
> .baloon
> .balloon
opacity 0.5
.message[data-darkmode]

View File

@@ -4,27 +4,27 @@
<div class="mkw-calendar--body">
<div class="calendar" :data-is-holiday="isHoliday">
<p class="month-and-year">
<span class="year">{{ year }}</span>
<span class="month">{{ month }}</span>
<span class="year">{{ '%i18n:@year%'.split('{}')[0] }}{{ year }}{{ '%i18n:@year%'.split('{}')[1] }}</span>
<span class="month">{{ '%i18n:@month%'.split('{}')[0] }}{{ month }}{{ '%i18n:@month%'.split('{}')[1] }}</span>
</p>
<p class="day">{{ day }}</p>
<p class="week-day">{{ weekDay }}曜日</p>
<p class="day">{{ '%i18n:@day%'.split('{}')[0] }}{{ day }}{{ '%i18n:@day%'.split('{}')[1] }}</p>
<p class="week-day">{{ weekDay }}</p>
</div>
<div class="info">
<div>
<p>今日:<b>{{ dayP.toFixed(1) }}%</b></p>
<p>%i18n:@today%<b>{{ dayP.toFixed(1) }}%</b></p>
<div class="meter">
<div class="val" :style="{ width: `${dayP}%` }"></div>
</div>
</div>
<div>
<p>今月:<b>{{ monthP.toFixed(1) }}%</b></p>
<p>%i18n:@this-month%<b>{{ monthP.toFixed(1) }}%</b></p>
<div class="meter">
<div class="val" :style="{ width: `${monthP}%` }"></div>
</div>
</div>
<div>
<p>今年:<b>{{ yearP.toFixed(1) }}%</b></p>
<p>%i18n:@this-year%<b>{{ yearP.toFixed(1) }}%</b></p>
<div class="meter">
<div class="val" :style="{ width: `${yearP}%` }"></div>
</div>
@@ -84,7 +84,15 @@ export default define({
this.year = ny;
this.month = nm + 1;
this.day = nd;
this.weekDay = ['日', '月', '火', '水', '木', '金', '土'][now.getDay()];
this.weekDay = [
'%i18n:common.weekday.sunday%',
'%i18n:common.weekday.monday%',
'%i18n:common.weekday.tuesday%',
'%i18n:common.weekday.wednesday%',
'%i18n:common.weekday.thursday%',
'%i18n:common.weekday.friday%',
'%i18n:common.weekday.saturday%'
][now.getDay()];
const dayNumer = now.getTime() - new Date(ny, nm, nd).getTime();
const dayDenom = 1000/*ms*/ * 60/*s*/ * 60/*m*/ * 24/*h*/;

View File

@@ -2,10 +2,10 @@
<div class="mkw-slideshow" :data-mobile="platform == 'mobile'">
<div @click="choose">
<p v-if="props.folder === undefined">
<template v-if="isCustomizeMode">フォルダを指定するにはカスタマイズモードを終了してください</template>
<template v-else>クリックしてフォルダを指定してください</template>
<template v-if="isCustomizeMode">%i18n:@folder-customize-mode%</template>
<template v-else>%i18n:@folder%</template>
</p>
<p v-if="props.folder !== undefined && images.length == 0 && !fetching">このフォルダには画像がありません</p>
<p v-if="props.folder !== undefined && images.length == 0 && !fetching">%i18n:@no-image%</p>
<div ref="slideA" class="slide a"></div>
<div ref="slideB" class="slide b"></div>
</div>

View File

@@ -9,31 +9,26 @@ import * as anime from 'animejs';
import define from '../../../common/define-widget';
const tips = [
'<kbd>t</kbd>でタイムラインにフォーカスできます',
'<kbd>p</kbd>または<kbd>n</kbd>で投稿フォームを開きます',
'投稿フォームにはファイルをドラッグ&ドロップできます',
'投稿フォームにクリップボードにある画像データをペーストできます',
'ドライブにファイルをドラッグ&ドロップしてアップロードできます',
'ドライブでファイルをドラッグしてフォルダ移動できます',
'ドライブでフォルダをドラッグしてフォルダ移動できます',
'ホームは設定からカスタマイズできます',
'MisskeyはAGPLv3です',
'タイムマシンウィジェットを利用すると、簡単に過去のタイムラインに遡れます',
'投稿の ... をクリックして、投稿をユーザーページにピン留めできます',
'ドライブの容量は(デフォルトで)1GBです',
'投稿に添付したファイルは全てドライブに保存されます',
'ホームのカスタマイズ中、ウィジェットを右クリックしてデザインを変更できます',
'タイムライン上部にもウィジェットを設置できます',
'投稿をダブルクリックすると詳細が見れます',
'「**」でテキストを囲むと**強調表示**されます',
'チャンネルウィジェットを利用すると、よく利用するチャンネルを素早く確認できます',
'いくつかのウィンドウはブラウザの外に切り離すことができます',
'カレンダーウィジェットのパーセンテージは、経過の割合を示しています',
'APIを利用してbotの開発なども行えます',
'MisskeyはLINEを通じてでも利用できます',
'まゆかわいいよまゆ',
'Misskeyは2014年にサービスを開始しました',
'対応ブラウザではMisskeyを開いていなくても通知を受け取れます'
'%i18n:@tips-line1%',
'%i18n:@tips-line2%',
'%i18n:@tips-line3%',
'%i18n:@tips-line4%',
'%i18n:@tips-line5%',
'%i18n:@tips-line6%',
'%i18n:@tips-line7%',
'%i18n:@tips-line8%',
'%i18n:@tips-line9%',
'%i18n:@tips-line10%',
'%i18n:@tips-line11%',
'%i18n:@tips-line13%',
'%i18n:@tips-line14%',
'%i18n:@tips-line17%',
'%i18n:@tips-line19%',
'%i18n:@tips-line20%',
'%i18n:@tips-line21%',
'%i18n:@tips-line23%',
'%i18n:@tips-line24%',
'%i18n:@tips-line25%'
]
export default define({

View File

@@ -34,7 +34,7 @@
</div>
<div class="trash">
<x-draggable v-model="trash" :options="{ group: 'x' }" @add="onTrash"></x-draggable>
<p>ゴミ箱</p>
<p>%i18n:common.trash%</p>
</div>
</div>
</div>
@@ -53,7 +53,7 @@
</div>
</x-draggable>
<div class="main">
<a @click="hint">カスタマイズのヒント</a>
<a @click="hint">%i18n:common.customization-tips.title%</a>
<div>
<mk-post-form v-if="$store.state.settings.showPostFormOnTopOfTl"/>
<mk-timeline ref="tl" @loaded="onTlLoaded"/>
@@ -187,13 +187,13 @@ export default Vue.extend({
methods: {
hint() {
(this as any).apis.dialog({
title: '%fa:info-circle%カスタマイズのヒント',
text: '<p>ホームのカスタマイズでは、ウィジェットを追加/削除したり、ドラッグ&ドロップして並べ替えたりすることができます。</p>' +
'<p>一部のウィジェットは、<strong><strong>右</strong>クリック</strong>することで表示を変更することができます。</p>' +
'<p>ウィジェットを削除するには、ヘッダーの<strong>「ゴミ箱」</strong>と書かれたエリアにウィジェットをドラッグ&ドロップします。</p>' +
'<p>カスタマイズを終了するには、右上の「完了」をクリックします。</p>',
title: '%fa:info-circle%%i18n:common.customization-tips.title%',
text: '<p>%i18n:common.customization-tips.paragraph1%</p>' +
'<p>%i18n:common.customization-tips.paragraph2%</p>' +
'<p>%i18n:common.customization-tips.paragraph3%</p>' +
'<p>%i18n:common.customization-tips.paragraph4%</p>',
actions: [{
text: 'Got it!'
text: '%i18n:common.customization-tips.gotit%'
}]
});
},

View File

@@ -8,7 +8,7 @@
<div class="content">
<div v-if="visibility == 'specified'" class="visibleUsers">
<span v-for="u in visibleUsers">{{ u | userName }}<a @click="removeVisibleUser(u)">[x]</a></span>
<a @click="addVisibleUser">+ユーザーを追加</a>
<a @click="addVisibleUser">%i18n:@add-visible-user%</a>
</div>
<div class="hashtags" v-if="recentHashtags.length > 0">
<b>%i18n:@recent-tags%:</b>
@@ -36,9 +36,9 @@
<button class="drive" title="%i18n:@attach-media-from-drive%" @click="chooseFileFromDrive">%fa:cloud%</button>
<button class="kao" title="%i18n:@insert-a-kao%" @click="kao">%fa:R smile%</button>
<button class="poll" title="%i18n:@create-poll%" @click="poll = true">%fa:chart-pie%</button>
<button class="poll" title="内容を隠す" @click="useCw = !useCw">%fa:eye-slash%</button>
<button class="geo" title="位置情報を添付する" @click="geo ? removeGeo() : setGeo()">%fa:map-marker-alt%</button>
<button class="visibility" title="公開範囲" @click="setVisibility" ref="visibilityButton">
<button class="poll" title="%i18n:@hide-contents%" @click="useCw = !useCw">%fa:eye-slash%</button>
<button class="geo" title="%i18n:@attach-location-information%" @click="geo ? removeGeo() : setGeo()">%fa:map-marker-alt%</button>
<button class="visibility" title="%i18n:@visibility%" @click="setVisibility" ref="visibilityButton">
<span v-if="visibility === 'public'">%fa:globe%</span>
<span v-if="visibility === 'home'">%fa:home%</span>
<span v-if="visibility === 'followers'">%fa:unlock%</span>
@@ -305,7 +305,7 @@ export default Vue.extend({
setGeo() {
if (navigator.geolocation == null) {
alert('お使いの端末は位置情報に対応していません');
alert('%i18n:@geolocation-alert%');
return;
}
@@ -313,7 +313,7 @@ export default Vue.extend({
this.geo = pos.coords;
this.$emit('geo-attached', this.geo);
}, err => {
alert('エラー: ' + err.message);
alert('%i18n:@error%: ' + err.message);
}, {
enableHighAccuracy: true
});
@@ -336,7 +336,7 @@ export default Vue.extend({
addVisibleUser() {
(this as any).apis.input({
title: 'ユーザー名を入力してください'
title: '%i18n:@enter-username%'
}).then(username => {
(this as any).api('users/show', {
username

View File

@@ -2,7 +2,7 @@
<div class="root">
<template v-if="!fetching">
<el-progress :text-inside="true" :stroke-width="18" :percentage="Math.floor((usage / capacity) * 100)"/>
<p><b>{{ capacity | bytes }}</b><b>{{ usage | bytes }}</b>使用中</p>
<p><b>{{ capacity | bytes }}</b>%i18n:max%<b>{{ usage | bytes }}</b>%i18n:in-use%</p>
</template>
</div>
</template>

View File

@@ -63,7 +63,7 @@ export default Vue.extend({
description: this.description || null,
birthday: this.birthday || null
}).then(() => {
(this as any).apis.notify('プロフィールを更新しました');
(this as any).apis.notify('%i18n:@profile-updated%');
});
},
onChangeIsLocked() {

View File

@@ -48,7 +48,7 @@ export default Vue.extend({
this.moreFetching = true;
(this as any).api('i/favorites', {
limit: 11,
maxId: this.favorites[this.favorites.length - 1].id
untilId: this.favorites[this.favorites.length - 1].id
}).then(favorites => {
if (favorites.length == 11) {
this.existMore = true;

View File

@@ -6,8 +6,8 @@
<div :class="$style.loading" v-if="fetching">
<mk-ellipsis-icon/>
</div>
<p :class="$style.notAvailable" v-if="!fetching && notAvailable">検索機能を利用することができません</p>
<p :class="$style.empty" v-if="!fetching && empty">%fa:search%{{ q }}に関する投稿は見つかりませんでした</p>
<p :class="$style.notAvailable" v-if="!fetching && notAvailable">%i18n:@not-available%</p>
<p :class="$style.empty" v-if="!fetching && empty">%fa:search% {{ '%i18n:not-found%'.split('{}')[0] }}{{ q }}{{ '%i18n:not-found%'.split('{}')[1] }}</p>
<mk-notes ref="timeline" :class="$style.notes" :more="existMore ? more : null"/>
</mk-ui>
</template>

View File

@@ -1,12 +1,12 @@
<template>
<div class="pptjhabgjtt7kwskbfv4y3uml6fpuhmr">
<h1>Misskeyで共有</h1>
<h1>%i18n:@share-with%</h1>
<div>
<mk-signin v-if="!$store.getters.isSignedIn"/>
<mk-post-form v-else-if="!posted" :initial-text="text" :instant="true" @posted="posted = true"/>
<p v-if="posted" class="posted">%fa:check%</p>
</div>
<button v-if="posted" class="ui button" @click="close">閉じる</button>
<button v-if="posted" class="ui button" @click="close">%i18n:@close%</button>
</div>
</template>

View File

@@ -6,7 +6,7 @@
<div :class="$style.loading" v-if="fetching">
<mk-ellipsis-icon/>
</div>
<p :class="$style.empty" v-if="!fetching && empty">%fa:search%{{ q }}に関する投稿は見つかりませんでした</p>
<p :class="$style.empty" v-if="!fetching && empty">%fa:search% {{ '%i18n:no-posts-found%'.split('{}')[0] }}{{ q }}{{ '%i18n:no-posts-found%'.split('{}')[1] }}</p>
<mk-notes ref="timeline" :class="$style.notes" :more="existMore ? more : null"/>
</mk-ui>
</template>

View File

@@ -8,7 +8,7 @@
<div class="body" :style="{ backgroundImage: `url('${ welcomeBgUrl }')` }">
<div class="container">
<div class="info">
<span>%i18n:common.misskey% <b>{{ host }}</b></span>
<span>%i18n:common.name% <b>{{ host }}</b></span>
<span class="stats" v-if="stats">
<span>%fa:user% {{ stats.originalUsersCount | number }}</span>
<span>%fa:pencil-alt% {{ stats.originalNotesCount | number }}</span>
@@ -18,7 +18,7 @@
<div class="about">
<h1 v-if="name">{{ name }}</h1>
<h1 v-else><img :src="$store.state.device.darkmode ? 'assets/title.dark.svg' : 'assets/title.light.svg'" alt="Misskey"></h1>
<p class="powerd-by" v-if="name">powerd by <b>Misskey</b></p>
<p class="powerd-by" v-if="name">%i18n:@powered-by-misskey%</p>
<p class="desc" v-html="description || '%i18n:common.about%'"></p>
<a ref="signup" @click="signup">📦 %i18n:@signup%</a>
</div>

View File

@@ -388,7 +388,7 @@ root(isDark)
padding 16px
> .visibleUsers
margin-bottom 8px
margin 5px
font-size 14px
> span

View File

@@ -3,12 +3,12 @@
<mk-special-message/>
<div class="main" ref="main">
<div class="backdrop"></div>
<p ref="welcomeback" v-if="$store.getters.isSignedIn">おかえりなさい<b>{{ $store.state.i | userName }}</b>さん</p>
<p ref="welcomeback" v-if="$store.getters.isSignedIn">%i18n:@welcome-back%<b>{{ $store.state.i | userName }}</b>さん</p>
<div class="content" ref="mainContainer">
<button class="nav" @click="$parent.isDrawerOpening = true">%fa:bars%</button>
<template v-if="hasUnreadNotification || hasUnreadMessagingMessage || hasGameInvitation">%fa:circle%</template>
<h1>
<slot>Misskey</slot>
<slot>%i18n:common.name%</slot>
</h1>
<slot name="func"></slot>
</div>

View File

@@ -53,7 +53,7 @@ export default Vue.extend({
this.moreFetching = true;
(this as any).api('i/favorites', {
limit: 11,
maxId: this.favorites[this.favorites.length - 1].id
untilId: this.favorites[this.favorites.length - 1].id
}).then(favorites => {
if (favorites.length == 11) {
this.existMore = true;

View File

@@ -1,6 +1,6 @@
<template>
<mk-ui>
<span slot="header">%fa:gamepad%リバーシ</span>
<span slot="header">%fa:gamepad%%i18n:@reversi%</span>
<mk-reversi v-if="!fetching" :init-game="game" @gamed="onGamed"/>
</mk-ui>
</template>
@@ -23,7 +23,7 @@ export default Vue.extend({
this.fetch();
},
mounted() {
document.title = 'Misskey リバーシ';
document.title = '%i18n:common.name% %i18n:@reversi%';
document.documentElement.style.background = '#fff';
},
methods: {

View File

@@ -78,6 +78,8 @@
</ui-card>
</div>
<div class="signout" @click="signout">%i18n:@signout%</div>
<footer>
<small>ver {{ version }} ({{ codename }})</small>
</footer>
@@ -247,6 +249,14 @@ root(isDark)
background isDark ? #273c34 : #fcfff5
box-shadow 0 3px 1px -2px rgba(#000, 0.2), 0 2px 2px 0 rgba(#000, 0.14), 0 1px 5px 0 rgba(#000, 0.12)
> .signout
margin 16px
padding 16px
text-align center
color isDark ? #ff5f56 : #cc2727
background isDark ? #652222 : #fff6f5
box-shadow 0 3px 1px -2px rgba(#000, 0.2), 0 2px 2px 0 rgba(#000, 0.14), 0 1px 5px 0 rgba(#000, 0.12)
> footer
margin 16px
text-align center

View File

@@ -1,6 +1,6 @@
<template>
<div class="signup">
<h1>📦 始めましょう</h1>
<h1>%i18n:@lets-start%</h1>
<mk-signup/>
</div>
</template>

View File

@@ -3,7 +3,7 @@
<span slot="header">%fa:hashtag%{{ $route.params.tag }}</span>
<main>
<p v-if="!fetching && empty">%fa:search%{{ q }}に関する投稿は見つかりませんでした</p>
<p v-if="!fetching && empty">%fa:search% {{ '%i18n:no-posts-found%'.split('{}')[0] }}{{ q }}{{ '%i18n:no-posts-found%'.split('{}')[1] }}</p>
<mk-notes ref="timeline" :more="existMore ? more : null"/>
</main>
</mk-ui>

View File

@@ -6,7 +6,7 @@
<div class="about">
<h2>{{ name || 'unidentified' }}</h2>
<p v-html="description || '%i18n:common.about%'"></p>
<router-link class="signup" to="/signup">新規登録</router-link>
<router-link class="signup" to="/signup">%i18n:@signup%</router-link>
</div>
<div class="login">
<mk-signin :with-avatar="false"/>

View File

@@ -1,6 +1,6 @@
<template>
<mk-ui>
<span slot="header">%fa:home%ダッシュボード</span>
<span slot="header">%fa:home%%i18n:@dashboard%</span>
<template slot="func">
<button @click="customizing = !customizing">%fa:cog%</button>
</template>

View File

@@ -1,7 +1,7 @@
<template>
<div class="mkw-activity">
<mk-widget-container :show-header="!props.compact">
<template slot="header">%fa:chart-bar%アクティビティ</template>
<template slot="header">%fa:chart-bar%%i18n:@activity%</template>
<div :class="$style.body">
<mk-activity :user="$store.state.i"/>
</div>

View File

@@ -53,7 +53,7 @@ APIの詳しい使用法は「Misskey APIの利用」セクションをご覧く
あなたのアプリがコールバックURLを設定していない場合、ユーザーがあなたのアプリの連携を許可したことを(何らかの方法で(たとえばボタンを押させるなど))確認出来るようにしてください。
### 3.ユーザーのアクセストークンを取得する
ユーザーが連携を許可したら、%URL%/auth/session/userkey へ次のパラメータを含むリクエストを送信します:
ユーザーが連携を許可したら、%API_URL%/auth/session/userkey へ次のパラメータを含むリクエストを送信します:
| 名前 | 型 | 説明 |
|---|---|---|

View File

@@ -10,9 +10,9 @@ block main
p#url
span.method POST
span.host
= url.host
= endpointUrl.host
| /
span.path= url.path
span.path= endpointUrl.path
if endpoint.desc
p#desc= endpoint.desc[lang] || endpoint.desc['ja']

View File

@@ -34,6 +34,28 @@ html(lang= lang)
if content
| !{content}
aside.
<div id="disqus_thread"></div>
<script>
/**
* RECOMMENDED CONFIGURATION VARIABLES: EDIT AND UNCOMMENT THE SECTION BELOW TO INSERT DYNAMIC VALUES FROM YOUR PLATFORM OR CMS.
* LEARN WHY DEFINING THESE VARIABLES IS IMPORTANT: https://disqus.com/admin/universalcode/#configuration-variables*/
/*
var disqus_config = function () {
this.page.url = PAGE_URL; // Replace PAGE_URL with your page's canonical URL variable
this.page.identifier = "#{ id }"; // Replace PAGE_IDENTIFIER with your page's unique identifier variable
};
*/
(function() { // DON'T EDIT BELOW THIS LINE
var d = document, s = d.createElement('script');
s.src = 'https://misskey.disqus.com/embed.js';
s.setAttribute('data-timestamp', +new Date());
(d.head || d.body).appendChild(s);
})();
</script>
<noscript>Please enable JavaScript to view the <a href="https://disqus.com/?ref_noscript">comments powered by Disqus.</a></noscript>
footer
block footer
small= copyright

View File

@@ -40,7 +40,12 @@ main
border none
border-bottom solid 2px #eee
footer
> aside
margin-top 32px
padding-top 32px
border-top solid 2px #eee
> footer
margin 32px 0 0 0
border-top solid 2px #eee

View File

@@ -11,6 +11,7 @@ import chalk from 'chalk';
import * as portscanner from 'portscanner';
import isRoot = require('is-root');
import Xev from 'xev';
import * as program from 'commander';
import Logger from './misc/logger';
import ProgressBar from './misc/cli/progressbar';
@@ -25,26 +26,42 @@ import { Config } from './config/types';
const clusterLog = debug('misskey:cluster');
const ev = new Xev();
process.title = 'Misskey';
if (process.env.NODE_ENV != 'production') {
process.env.DEBUG = 'misskey:*';
debug.enable('misskey');
}
// Start app
const pkg = require('../package.json');
//#region Command line argument definitions
program
.version(pkg.version)
.option('--no-daemons', 'Disable daemon processes (for debbuging)')
.option('--disable-clustering', 'Disable clustering')
.parse(process.argv);
//#endregion
main();
/**
* Init process
*/
function main() {
if (cluster.isMaster) {
process.title = `Misskey (${ cluster.isMaster ? 'master' : 'worker' })`;
if (cluster.isMaster || program.disableClustering) {
masterMain();
ev.mount();
serverStats();
notesStats();
} else {
if (cluster.isMaster) {
ev.mount();
}
if (program.daemons) {
serverStats();
notesStats();
}
}
if (cluster.isWorker || program.disableClustering) {
workerMain();
}
}
@@ -66,10 +83,12 @@ async function masterMain() {
Logger.succ('Misskey initialized');
spawnWorkers(config.clusterLimit, () => {
if (!program.disableClustering) {
await spawnWorkers(config.clusterLimit);
Logger.succ('All workers started');
Logger.info(`Now listening on port ${config.port} on ${config.url}`);
});
}
Logger.info(`Now listening on port ${config.port} on ${config.url}`);
}
/**
@@ -79,8 +98,10 @@ async function workerMain() {
// start server
await require('./server').default();
// Send a 'ready' message to parent process
process.send('ready');
if (cluster.isWorker) {
// Send a 'ready' message to parent process
process.send('ready');
}
}
/**
@@ -124,43 +145,50 @@ async function init(): Promise<Config> {
}
// Try to connect to MongoDB
checkMongoDb(config);
return config;
}
function checkMongoDb(config: Config) {
const mongoDBLogger = new Logger('MongoDB');
mongoDBLogger.info(`Host: ${config.mongodb.host}`);
mongoDBLogger.info(`Port: ${config.mongodb.port}`);
mongoDBLogger.info(`DB: ${config.mongodb.db}`);
if (config.mongodb.user) mongoDBLogger.info(`User: ${config.mongodb.user}`);
if (config.mongodb.pass) mongoDBLogger.info(`Pass: ****`);
const db = require('./db/mongodb').default;
require('./db/mongodb');
mongoDBLogger.succ('Connectivity confirmed');
db.close();
return config;
}
function spawnWorkers(limit: number, onComplete: Function) {
// Count the machine's CPUs
const cpuCount = os.cpus().length;
function spawnWorkers(limit: number) {
return new Promise(res => {
// Count the machine's CPUs
const cpuCount = os.cpus().length;
const count = limit || cpuCount;
const count = limit || cpuCount;
const progress = new ProgressBar(count, 'Starting workers');
const progress = new ProgressBar(count, 'Starting workers');
// Create a worker for each CPU
for (let i = 0; i < count; i++) {
const worker = cluster.fork();
worker.on('message', message => {
if (message === 'ready') {
progress.increment();
}
// Create a worker for each CPU
for (let i = 0; i < count; i++) {
const worker = cluster.fork();
worker.on('message', message => {
if (message === 'ready') {
progress.increment();
}
});
}
// On all workers started
progress.on('complete', () => {
res();
});
}
// On all workers started
progress.on('complete', () => {
onComplete();
});
}
//#region Events
// Listen new workers
cluster.on('fork', worker => {
clusterLog(`Process forked: [${worker.id}]`);
@@ -191,3 +219,5 @@ process.on('uncaughtException', err => {
process.on('exit', code => {
Logger.info(`The process is going to exit with code ${code}`);
});
//#endregion

View File

@@ -1,5 +1,5 @@
import { IUser } from '../models/user';
export default function(user: IUser): string {
return user.name || '名無し';
return user.name || user.username;
}

View File

@@ -5,6 +5,7 @@ import { IUser, pack as packUser } from './user';
import { pack as packNote } from './note';
const Notification = db.get<INotification>('notifications');
Notification.createIndex('notifieeId');
export default Notification;
export interface INotification {

View File

@@ -2,7 +2,7 @@ import * as mongo from 'mongodb';
import Notification from './models/notification';
import Mute from './models/mute';
import { pack } from './models/notification';
import stream from './stream';
import { publishUserStream } from './stream';
import User from './models/user';
import pushSw from './push-sw';
@@ -30,7 +30,7 @@ export default (
const packed = await pack(notification);
// Publish notification event
stream(notifiee, 'notification', packed);
publishUserStream(notifiee, 'notification', packed);
// Update flag
User.update({ _id: notifiee }, {
@@ -54,7 +54,7 @@ export default (
}
//#endregion
stream(notifiee, 'unread_notification', packed);
publishUserStream(notifiee, 'unread_notification', packed);
pushSw(notifiee, 'notification', packed);
}

View File

@@ -1,7 +1,7 @@
import * as mongo from 'mongodb';
import Message from '../../../models/messaging-message';
import { IMessagingMessage as IMessage } from '../../../models/messaging-message';
import publishUserStream from '../../../stream';
import { publishUserStream } from '../../../stream';
import { publishMessagingStream } from '../../../stream';
import { publishMessagingIndexStream } from '../../../stream';
import User from '../../../models/user';

View File

@@ -1,6 +1,6 @@
import * as mongo from 'mongodb';
import { default as Notification, INotification } from '../../../models/notification';
import publishUserStream from '../../../stream';
import { publishUserStream } from '../../../stream';
import Mute from '../../../models/mute';
import User from '../../../models/user';

View File

@@ -2,7 +2,7 @@ import $ from 'cafy'; import ID from '../../../../../misc/cafy-id';
import Matching, { pack as packMatching } from '../../../../../models/games/reversi/matching';
import ReversiGame, { pack as packGame } from '../../../../../models/games/reversi/game';
import User, { ILocalUser } from '../../../../../models/user';
import publishUserStream, { publishReversiStream } from '../../../../../stream';
import { publishUserStream, publishReversiStream } from '../../../../../stream';
import { eighteight } from '../../../../../games/reversi/maps';
export const meta = {

View File

@@ -19,10 +19,6 @@ export default (params: any, user: ILocalUser) => new Promise(async (res, rej) =
const [markAsRead = true, markAsReadErr] = $.bool.optional.get(params.markAsRead);
if (markAsReadErr) return rej('invalid markAsRead param');
// Get 'type' parameter
const [type, typeErr] = $.arr($.str).optional.unique().get(params.type);
if (typeErr) return rej('invalid type param');
// Get 'limit' parameter
const [limit = 10, limitErr] = $.num.optional.range(1, 100).get(params.limit);
if (limitErr) return rej('invalid limit param');
@@ -41,8 +37,7 @@ export default (params: any, user: ILocalUser) => new Promise(async (res, rej) =
}
const mute = await Mute.find({
muterId: user._id,
deletedAt: { $exists: false }
muterId: user._id
});
const query = {
@@ -69,12 +64,6 @@ export default (params: any, user: ILocalUser) => new Promise(async (res, rej) =
});
}
if (type) {
query.type = {
$in: type
};
}
if (sinceId) {
sort._id = 1;
query._id = {

View File

@@ -1,7 +1,7 @@
import $ from 'cafy';
import * as bcrypt from 'bcryptjs';
import User, { ILocalUser } from '../../../../models/user';
import event from '../../../../stream';
import { publishUserStream } from '../../../../stream';
import generateUserToken from '../../common/generate-native-user-token';
export const meta = {
@@ -33,5 +33,5 @@ export default async (params: any, user: ILocalUser) => new Promise(async (res,
res();
// Publish event
event(user._id, 'my_token_regenerated');
publishUserStream(user._id, 'my_token_regenerated');
});

View File

@@ -1,6 +1,6 @@
import $ from 'cafy'; import ID from '../../../../misc/cafy-id';
import User, { isValidName, isValidDescription, isValidLocation, isValidBirthday, pack, ILocalUser } from '../../../../models/user';
import event from '../../../../stream';
import { publishUserStream } from '../../../../stream';
import DriveFile from '../../../../models/drive-file';
import acceptAllFollowRequests from '../../../../services/following/requests/accept-all';
import { IApp } from '../../../../models/app';
@@ -133,7 +133,7 @@ export default async (params: any, user: ILocalUser, app: IApp) => new Promise(a
res(iObj);
// Publish meUpdated event
event(user._id, 'meUpdated', iObj);
publishUserStream(user._id, 'meUpdated', iObj);
// 鍵垢を解除したとき、溜まっていたフォローリクエストがあるならすべて承認
if (user.isLocked && isLocked === false) {

View File

@@ -1,6 +1,6 @@
import $ from 'cafy';
import User, { ILocalUser } from '../../../../models/user';
import event from '../../../../stream';
import { publishUserStream } from '../../../../stream';
export const meta = {
requireCredential: true,
@@ -26,7 +26,7 @@ export default async (params: any, user: ILocalUser) => new Promise(async (res,
res();
// Publish event
event(user._id, 'clientSettingUpdated', {
publishUserStream(user._id, 'clientSettingUpdated', {
key: name,
value
});

View File

@@ -1,6 +1,6 @@
import $ from 'cafy';
import User, { ILocalUser } from '../../../../models/user';
import event from '../../../../stream';
import { publishUserStream } from '../../../../stream';
export const meta = {
requireCredential: true,
@@ -25,5 +25,5 @@ export default async (params: any, user: ILocalUser) => new Promise(async (res,
res();
event(user._id, 'home_updated', home);
publishUserStream(user._id, 'home_updated', home);
});

View File

@@ -1,6 +1,6 @@
import $ from 'cafy';
import User, { ILocalUser } from '../../../../models/user';
import event from '../../../../stream';
import { publishUserStream } from '../../../../stream';
export const meta = {
requireCredential: true,
@@ -24,5 +24,5 @@ export default async (params: any, user: ILocalUser) => new Promise(async (res,
res();
event(user._id, 'mobile_home_updated', home);
publishUserStream(user._id, 'mobile_home_updated', home);
});

View File

@@ -1,6 +1,6 @@
import $ from 'cafy';
import User, { ILocalUser } from '../../../../models/user';
import event from '../../../../stream';
import { publishUserStream } from '../../../../stream';
export const meta = {
requireCredential: true,
@@ -73,7 +73,7 @@ export default async (params: any, user: ILocalUser) => new Promise(async (res,
//#endregion
if (widget) {
event(user._id, 'widgetUpdated', {
publishUserStream(user._id, 'widgetUpdated', {
id, data
});

View File

@@ -6,10 +6,9 @@ import User, { ILocalUser } from '../../../../../models/user';
import Mute from '../../../../../models/mute';
import DriveFile from '../../../../../models/drive-file';
import { pack } from '../../../../../models/messaging-message';
import publishUserStream from '../../../../../stream';
import { publishUserStream } from '../../../../../stream';
import { publishMessagingStream, publishMessagingIndexStream } from '../../../../../stream';
import pushSw from '../../../../../push-sw';
import config from '../../../../../config';
export const meta = {
desc: {
@@ -123,20 +122,6 @@ export default (params: any, user: ILocalUser) => new Promise(async (res, rej) =
}
}, 3000);
// Register to search database
if (message.text && config.elasticsearch) {
const es = require('../../../db/elasticsearch');
es.index({
index: 'misskey',
type: 'messaging_message',
id: message._id.toString(),
body: {
text: message.text
}
});
}
// 履歴作成(自分)
History.update({
userId: user._id,

View File

@@ -1,5 +1,5 @@
import Notification from '../../../../models/notification';
import event from '../../../../stream';
import { publishUserStream } from '../../../../stream';
import User, { ILocalUser } from '../../../../models/user';
export const meta = {
@@ -40,5 +40,5 @@ export default (params: any, user: ILocalUser) => new Promise(async (res, rej) =
});
// 全ての通知を読みましたよというイベントを発行
event(user._id, 'read_all_notifications');
publishUserStream(user._id, 'read_all_notifications');
});

View File

@@ -3,7 +3,7 @@ import * as bcrypt from 'bcryptjs';
import * as speakeasy from 'speakeasy';
import User, { ILocalUser } from '../../../models/user';
import Signin, { pack } from '../../../models/signin';
import event from '../../../stream';
import { publishUserStream } from '../../../stream';
import signin from '../common/signin';
import config from '../../../config';
@@ -86,5 +86,5 @@ export default async (ctx: Koa.Context) => {
});
// Publish signin event
event(user._id, 'signin', await pack(record));
publishUserStream(user._id, 'signin', await pack(record));
};

View File

@@ -4,7 +4,7 @@ import * as uuid from 'uuid';
import autwh from 'autwh';
import redis from '../../../db/redis';
import User, { pack, ILocalUser } from '../../../models/user';
import event from '../../../stream';
import { publishUserStream } from '../../../stream';
import config from '../../../config';
import signin from '../common/signin';
@@ -49,7 +49,7 @@ router.get('/disconnect/twitter', async ctx => {
ctx.body = `Twitterの連携を解除しました :v:`;
// Publish i updated event
event(user._id, 'meUpdated', await pack(user, user, {
publishUserStream(user._id, 'meUpdated', await pack(user, user, {
detail: true,
includeSecrets: true
}));
@@ -174,7 +174,7 @@ if (config.twitter == null) {
ctx.body = `Twitter: @${result.screenName} を、Misskey: @${user.username} に接続しました!`;
// Publish i updated event
event(user._id, 'meUpdated', await pack(user, user, {
publishUserStream(user._id, 'meUpdated', await pack(user, user, {
detail: true,
includeSecrets: true
}));

View File

@@ -1,10 +1,9 @@
import * as websocket from 'websocket';
import * as redis from 'redis';
import Xev from 'xev';
export default function(request: websocket.request, connection: websocket.connection, subscriber: redis.RedisClient, user: any): void {
export default function(request: websocket.request, connection: websocket.connection, subscriber: Xev, user: any): void {
// Subscribe drive stream
subscriber.subscribe(`misskey:drive-stream:${user._id}`);
subscriber.on('message', (_, data) => {
connection.send(data);
subscriber.on(`drive-stream:${user._id}`, data => {
connection.send(JSON.stringify(data));
});
}

View File

@@ -1,5 +1,5 @@
import * as websocket from 'websocket';
import * as redis from 'redis';
import Xev from 'xev';
import * as CRC32 from 'crc-32';
import ReversiGame, { pack } from '../../../../models/games/reversi/game';
import { publishReversiGameStream } from '../../../../stream';
@@ -7,14 +7,13 @@ import Reversi from '../../../../games/reversi/core';
import * as maps from '../../../../games/reversi/maps';
import { ParsedUrlQuery } from 'querystring';
export default function(request: websocket.request, connection: websocket.connection, subscriber: redis.RedisClient, user?: any): void {
export default function(request: websocket.request, connection: websocket.connection, subscriber: Xev, user?: any): void {
const q = request.resourceURL.query as ParsedUrlQuery;
const gameId = q.game;
const gameId = q.game as string;
// Subscribe game stream
subscriber.subscribe(`misskey:reversi-game-stream:${gameId}`);
subscriber.on('message', (_, data) => {
connection.send(data);
subscriber.on(`reversi-game-stream:${gameId}`, data => {
connection.send(JSON.stringify(data));
});
connection.on('message', async (data) => {

View File

@@ -1,14 +1,13 @@
import * as mongo from 'mongodb';
import * as websocket from 'websocket';
import * as redis from 'redis';
import Xev from 'xev';
import Matching, { pack } from '../../../../models/games/reversi/matching';
import publishUserStream from '../../../../stream';
import { publishUserStream } from '../../../../stream';
export default function(request: websocket.request, connection: websocket.connection, subscriber: redis.RedisClient, user: any): void {
export default function(request: websocket.request, connection: websocket.connection, subscriber: Xev, user: any): void {
// Subscribe reversi stream
subscriber.subscribe(`misskey:reversi-stream:${user._id}`);
subscriber.on('message', (_, data) => {
connection.send(data);
subscriber.on(`reversi-stream:${user._id}`, data => {
connection.send(JSON.stringify(data));
});
connection.on('message', async (data) => {

View File

@@ -1,5 +1,5 @@
import * as websocket from 'websocket';
import * as redis from 'redis';
import Xev from 'xev';
import { IUser } from '../../../models/user';
import Mute from '../../../models/mute';
@@ -7,18 +7,14 @@ import Mute from '../../../models/mute';
export default async function(
request: websocket.request,
connection: websocket.connection,
subscriber: redis.RedisClient,
subscriber: Xev,
user: IUser
) {
// Subscribe stream
subscriber.subscribe(`misskey:global-timeline`);
const mute = await Mute.find({ muterId: user._id });
const mutedUserIds = mute.map(m => m.muteeId.toString());
subscriber.on('message', async (_, data) => {
const note = JSON.parse(data);
// Subscribe stream
subscriber.on('global-timeline', async note => {
//#region 流れてきたNoteがミュートしているユーザーが関わるものだったら無視する
if (mutedUserIds.indexOf(note.userId) != -1) {
return;

View File

@@ -1,5 +1,5 @@
import * as websocket from 'websocket';
import * as redis from 'redis';
import Xev from 'xev';
import * as debug from 'debug';
import User, { IUser } from '../../../models/user';
@@ -14,68 +14,54 @@ const log = debug('misskey');
export default async function(
request: websocket.request,
connection: websocket.connection,
subscriber: redis.RedisClient,
subscriber: Xev,
user: IUser,
app: IApp
) {
// Subscribe Home stream channel
subscriber.subscribe(`misskey:user-stream:${user._id}`);
const mute = await Mute.find({ muterId: user._id });
const mutedUserIds = mute.map(m => m.muteeId.toString());
subscriber.on('message', async (channel, data) => {
switch (channel.split(':')[1]) {
case 'user-stream':
try {
const x = JSON.parse(data);
async function onNoteStream(noteId: any) {
const note = await packNote(noteId, user, {
detail: true
});
//#region 流れてきたメッセージがミュートしているユーザーが関わるものだったら無視する
if (x.type == 'note') {
if (mutedUserIds.includes(x.body.userId)) {
return;
}
if (x.body.reply != null && mutedUserIds.includes(x.body.reply.userId)) {
return;
}
if (x.body.renote != null && mutedUserIds.includes(x.body.renote.userId)) {
return;
}
} else if (x.type == 'notification') {
if (mutedUserIds.includes(x.body.userId)) {
return;
}
}
//#endregion
connection.send(JSON.stringify({
type: 'note-updated',
body: {
note: note
}
}));
}
// Renoteなら再pack
if (x.type == 'note' && x.body.renoteId != null) {
x.body.renote = await pack(x.body.renoteId, user, {
detail: true
});
data = JSON.stringify(x);
}
connection.send(data);
} catch (e) {
connection.send(data);
}
break;
case 'note-stream':
const noteId = channel.split(':')[2];
log(`RECEIVED: ${noteId} ${data} by @${user.username}`);
const note = await packNote(noteId, user, {
detail: true
});
connection.send(JSON.stringify({
type: 'note-updated',
body: {
note: note
}
}));
break;
// Subscribe Home stream channel
subscriber.on(`user-stream:${user._id}`, async x => {
//#region 流れてきたメッセージがミュートしているユーザーが関わるものだったら無視する
if (x.type == 'note') {
if (mutedUserIds.includes(x.body.userId)) {
return;
}
if (x.body.reply != null && mutedUserIds.includes(x.body.reply.userId)) {
return;
}
if (x.body.renote != null && mutedUserIds.includes(x.body.renote.userId)) {
return;
}
} else if (x.type == 'notification') {
if (mutedUserIds.includes(x.body.userId)) {
return;
}
}
//#endregion
// Renoteなら再pack
if (x.type == 'note' && x.body.renoteId != null) {
x.body.renote = await pack(x.body.renoteId, user, {
detail: true
});
}
connection.send(JSON.stringify(x));
});
connection.on('message', async data => {
@@ -113,9 +99,14 @@ export default async function(
case 'capture':
if (!msg.id) return;
const noteId = msg.id;
log(`CAPTURE: ${noteId} by @${user.username}`);
subscriber.subscribe(`misskey:note-stream:${noteId}`);
log(`CAPTURE: ${msg.id} by @${user.username}`);
subscriber.on(`note-stream:${msg.id}`, onNoteStream);
break;
case 'decapture':
if (!msg.id) return;
log(`DECAPTURE: ${msg.id} by @${user.username}`);
subscriber.off(`note-stream:${msg.id}`, onNoteStream);
break;
}
});

View File

@@ -1,5 +1,5 @@
import * as websocket from 'websocket';
import * as redis from 'redis';
import Xev from 'xev';
import { IUser } from '../../../models/user';
import Mute from '../../../models/mute';
@@ -8,18 +8,17 @@ import { pack } from '../../../models/note';
export default async function(
request: websocket.request,
connection: websocket.connection,
subscriber: redis.RedisClient,
subscriber: Xev,
user: IUser
) {
// Subscribe stream
subscriber.subscribe('misskey:hybrid-timeline', `misskey:hybrid-timeline:${user._id}`);
subscriber.on('hybrid-timeline', onEvent);
subscriber.on(`hybrid-timeline:${user._id}`, onEvent);
const mute = await Mute.find({ muterId: user._id });
const mutedUserIds = mute.map(m => m.muteeId.toString());
subscriber.on('message', async (_, data) => {
const note = JSON.parse(data);
async function onEvent(note: any) {
//#region 流れてきたNoteがミュートしているユーザーが関わるものだったら無視する
if (mutedUserIds.indexOf(note.userId) != -1) {
return;
@@ -43,5 +42,5 @@ export default async function(
type: 'note',
body: note
}));
});
}
}

View File

@@ -1,5 +1,5 @@
import * as websocket from 'websocket';
import * as redis from 'redis';
import Xev from 'xev';
import { IUser } from '../../../models/user';
import Mute from '../../../models/mute';
@@ -8,18 +8,14 @@ import { pack } from '../../../models/note';
export default async function(
request: websocket.request,
connection: websocket.connection,
subscriber: redis.RedisClient,
subscriber: Xev,
user: IUser
) {
// Subscribe stream
subscriber.subscribe('misskey:local-timeline');
const mute = await Mute.find({ muterId: user._id });
const mutedUserIds = mute.map(m => m.muteeId.toString());
subscriber.on('message', async (_, data) => {
const note = JSON.parse(data);
// Subscribe stream
subscriber.on('local-timeline', async note => {
//#region 流れてきたNoteがミュートしているユーザーが関わるものだったら無視する
if (mutedUserIds.indexOf(note.userId) != -1) {
return;

View File

@@ -1,10 +1,9 @@
import * as websocket from 'websocket';
import * as redis from 'redis';
import Xev from 'xev';
export default function(request: websocket.request, connection: websocket.connection, subscriber: redis.RedisClient, user: any): void {
export default function(request: websocket.request, connection: websocket.connection, subscriber: Xev, user: any): void {
// Subscribe messaging index stream
subscriber.subscribe(`misskey:messaging-index-stream:${user._id}`);
subscriber.on('message', (_, data) => {
connection.send(data);
subscriber.on(`messaging-index-stream:${user._id}`, data => {
connection.send(JSON.stringify(data));
});
}

View File

@@ -1,16 +1,15 @@
import * as websocket from 'websocket';
import * as redis from 'redis';
import Xev from 'xev';
import read from '../common/read-messaging-message';
import { ParsedUrlQuery } from 'querystring';
export default function(request: websocket.request, connection: websocket.connection, subscriber: redis.RedisClient, user: any): void {
export default function(request: websocket.request, connection: websocket.connection, subscriber: Xev, user: any): void {
const q = request.resourceURL.query as ParsedUrlQuery;
const otherparty = q.otherparty as string;
// Subscribe messaging stream
subscriber.subscribe(`misskey:messaging-stream:${user._id}-${otherparty}`);
subscriber.on('message', (_, data) => {
connection.send(data);
subscriber.on(`messaging-stream:${user._id}-${otherparty}`, data => {
connection.send(JSON.stringify(data));
});
connection.on('message', async (data) => {

View File

@@ -1,14 +1,13 @@
import * as websocket from 'websocket';
import * as redis from 'redis';
import Xev from 'xev';
import { ParsedUrlQuery } from 'querystring';
export default function(request: websocket.request, connection: websocket.connection, subscriber: redis.RedisClient, user: any): void {
export default function(request: websocket.request, connection: websocket.connection, subscriber: Xev, user: any): void {
const q = request.resourceURL.query as ParsedUrlQuery;
const listId = q.listId as string;
// Subscribe stream
subscriber.subscribe(`misskey:user-list-stream:${listId}`);
subscriber.on('message', (_, data) => {
connection.send(data);
subscriber.on(`user-list-stream:${listId}`, data => {
connection.send(JSON.stringify(data));
});
}

View File

@@ -1,7 +1,6 @@
import * as http from 'http';
import * as websocket from 'websocket';
import * as redis from 'redis';
import config from '../../config';
import Xev from 'xev';
import homeStream from './stream/home';
import localTimelineStream from './stream/local-timeline';
@@ -39,20 +38,17 @@ module.exports = (server: http.Server) => {
return;
}
// Connect to Redis
const subscriber = redis.createClient(
config.redis.port, config.redis.host);
const ev = new Xev();
connection.on('close', () => {
subscriber.unsubscribe();
subscriber.quit();
connection.once('close', () => {
ev.removeAllListeners();
});
const q = request.resourceURL.query as ParsedUrlQuery;
const [user, app] = await authenticate(q.i as string);
if (request.resourceURL.pathname === '/games/reversi-game') {
reversiGameStream(request, connection, subscriber, user);
reversiGameStream(request, connection, ev, user);
return;
}
@@ -75,7 +71,7 @@ module.exports = (server: http.Server) => {
null;
if (channel !== null) {
channel(request, connection, subscriber, user, app);
channel(request, connection, ev, user, app);
} else {
connection.close();
}

View File

@@ -173,9 +173,10 @@ router.get('/*/api/endpoints/*', async ctx => {
const ep = endpoints.find(e => e.name === name);
const vars = {
id: `api/endpoints/${name}`,
title: name,
endpoint: ep.meta,
url: {
endpointUrl: {
host: config.api_url,
path: name
},
@@ -198,6 +199,7 @@ router.get('/*/api/entities/*', async ctx => {
const x = yaml.safeLoad(fs.readFileSync(path.resolve(__dirname + '/../../../src/docs/api/entities/' + entity + '.yaml'), 'utf-8')) as any;
await ctx.render('../../../../src/docs/api/entities/view', Object.assign(await genVars(lang), {
id: `api/entities/${entity}`,
name: x.name,
desc: x.desc,
props: sortParams(Object.entries(x.props).map(([k, v]) => parsePropDefinition(k, v))),
@@ -228,6 +230,7 @@ router.get('/*/*', async ctx => {
const md = fs.readFileSync(`${__dirname}/../../../src/docs/${doc}.${lang}.md`, 'utf8');
await ctx.render('../../../../src/docs/article', Object.assign({
id: doc,
html: conv.makeHtml(md),
title: md.match(/^# (.+?)\r?\n/)[1],
src: `https://github.com/syuilo/misskey/tree/master/src/docs/${doc}.${lang}.md`

View File

@@ -13,7 +13,7 @@ import * as sharp from 'sharp';
import DriveFile, { IMetadata, getDriveFileBucket, IDriveFile } from '../../models/drive-file';
import DriveFolder from '../../models/drive-folder';
import { pack } from '../../models/drive-file';
import event, { publishDriveStream } from '../../stream';
import { publishUserStream, publishDriveStream } from '../../stream';
import { isLocalUser, IUser, IRemoteUser } from '../../models/user';
import delFile from './delete-file';
import config from '../../config';
@@ -309,7 +309,7 @@ export default async function(
pack(driveFile).then(packedFile => {
// Publish drive_file_created event
event(user._id, 'drive_file_created', packedFile);
publishUserStream(user._id, 'drive_file_created', packedFile);
publishDriveStream(user._id, 'file_created', packedFile);
});

View File

@@ -2,7 +2,7 @@ import User, { isLocalUser, isRemoteUser, pack as packUser, IUser } from '../../
import Following from '../../models/following';
import FollowingLog from '../../models/following-log';
import FollowedLog from '../../models/followed-log';
import event from '../../stream';
import { publishUserStream } from '../../stream';
import notify from '../../notify';
import pack from '../../remote/activitypub/renderer';
import renderFollow from '../../remote/activitypub/renderer/follow';
@@ -61,12 +61,12 @@ export default async function(follower: IUser, followee: IUser) {
// Publish follow event
if (isLocalUser(follower)) {
packUser(followee, follower).then(packed => event(follower._id, 'follow', packed));
packUser(followee, follower).then(packed => publishUserStream(follower._id, 'follow', packed));
}
// Publish followed event
if (isLocalUser(followee)) {
packUser(follower, followee).then(packed => event(followee._id, 'followed', packed)),
packUser(follower, followee).then(packed => publishUserStream(followee._id, 'followed', packed)),
// 通知を作成
notify(followee._id, follower._id, 'follow');

View File

@@ -2,7 +2,7 @@ import User, { isLocalUser, isRemoteUser, pack as packUser, IUser } from '../../
import Following from '../../models/following';
import FollowingLog from '../../models/following-log';
import FollowedLog from '../../models/followed-log';
import event from '../../stream';
import { publishUserStream } from '../../stream';
import pack from '../../remote/activitypub/renderer';
import renderFollow from '../../remote/activitypub/renderer/follow';
import renderUndo from '../../remote/activitypub/renderer/undo';
@@ -52,7 +52,7 @@ export default async function(follower: IUser, followee: IUser) {
// Publish unfollow event
if (isLocalUser(follower)) {
packUser(followee, follower).then(packed => event(follower._id, 'unfollow', packed));
packUser(followee, follower).then(packed => publishUserStream(follower._id, 'unfollow', packed));
}
if (isLocalUser(follower) && isRemoteUser(followee)) {

View File

@@ -7,7 +7,7 @@ import { deliver } from '../../../queue';
import Following from '../../../models/following';
import FollowingLog from '../../../models/following-log';
import FollowedLog from '../../../models/followed-log';
import event from '../../../stream';
import { publishUserStream } from '../../../stream';
export default async function(followee: IUser, follower: IUser) {
const following = await Following.insert({
@@ -74,5 +74,5 @@ export default async function(followee: IUser, follower: IUser) {
packUser(followee, followee, {
detail: true
}).then(packed => event(followee._id, 'meUpdated', packed));
}).then(packed => publishUserStream(followee._id, 'meUpdated', packed));
}

View File

@@ -4,7 +4,7 @@ import pack from '../../../remote/activitypub/renderer';
import renderFollow from '../../../remote/activitypub/renderer/follow';
import renderUndo from '../../../remote/activitypub/renderer/undo';
import { deliver } from '../../../queue';
import event from '../../../stream';
import { publishUserStream } from '../../../stream';
export default async function(followee: IUser, follower: IUser) {
if (isRemoteUser(followee)) {
@@ -25,5 +25,5 @@ export default async function(followee: IUser, follower: IUser) {
packUser(followee, followee, {
detail: true
}).then(packed => event(followee._id, 'meUpdated', packed));
}).then(packed => publishUserStream(followee._id, 'meUpdated', packed));
}

View File

@@ -1,5 +1,5 @@
import User, { isLocalUser, isRemoteUser, pack as packUser, IUser } from '../../../models/user';
import event from '../../../stream';
import { publishUserStream } from '../../../stream';
import notify from '../../../notify';
import pack from '../../../remote/activitypub/renderer';
import renderFollow from '../../../remote/activitypub/renderer/follow';
@@ -35,11 +35,11 @@ export default async function(follower: IUser, followee: IUser) {
// Publish receiveRequest event
if (isLocalUser(followee)) {
packUser(follower, followee).then(packed => event(followee._id, 'receiveFollowRequest', packed));
packUser(follower, followee).then(packed => publishUserStream(followee._id, 'receiveFollowRequest', packed));
packUser(followee, followee, {
detail: true
}).then(packed => event(followee._id, 'meUpdated', packed));
}).then(packed => publishUserStream(followee._id, 'meUpdated', packed));
// 通知を作成
notify(followee._id, follower._id, 'receiveFollowRequest');

View File

@@ -1,7 +1,7 @@
import es from '../../db/elasticsearch';
import Note, { pack, INote } from '../../models/note';
import User, { isLocalUser, IUser, isRemoteUser, IRemoteUser, ILocalUser } from '../../models/user';
import stream, { publishLocalTimelineStream, publishHybridTimelineStream, publishGlobalTimelineStream, publishUserListStream } from '../../stream';
import { publishUserStream, publishLocalTimelineStream, publishHybridTimelineStream, publishGlobalTimelineStream, publishUserListStream } from '../../stream';
import Following from '../../models/following';
import { deliver } from '../../queue';
import renderNote from '../../remote/activitypub/renderer/note';
@@ -13,7 +13,6 @@ import notify from '../../notify';
import NoteWatching from '../../models/note-watching';
import watch from './watch';
import Mute from '../../models/mute';
import event from '../../stream';
import parse from '../../mfm/parse';
import { IApp } from '../../models/app';
import UserList from '../../models/user-list';
@@ -165,14 +164,19 @@ export default async (user: IUser, data: Option, silent = false) => new Promise<
}
// 通知
nm.push(data.reply.userId, 'reply');
if (isLocalUser(data.reply._user)) {
nm.push(data.reply.userId, 'reply');
}
}
// If it is renote
if (data.renote) {
// Notify
const type = data.text ? 'quote' : 'renote';
nm.push(data.renote.userId, type);
// Notify
if (isLocalUser(data.renote._user)) {
nm.push(data.renote.userId, type);
}
// Fetch watchers
nmRelatedPromises.push(notifyToWatchersOfRenotee(data.renote, user, nm, type));
@@ -182,15 +186,9 @@ export default async (user: IUser, data: Option, silent = false) => new Promise<
watch(user._id, data.renote);
}
// If it is quote renote
if (data.text) {
// Add mention
nm.push(data.renote.userId, 'quote');
} else {
// Publish event
if (!user._id.equals(data.renote.userId)) {
event(data.renote.userId, 'renote', noteObj);
}
// Publish event
if (!user._id.equals(data.renote.userId)) {
publishUserStream(data.renote.userId, 'renote', noteObj);
}
}
@@ -236,12 +234,12 @@ async function publish(user: IUser, note: INote, noteObj: any, reply: INote, ren
if (['private', 'followers', 'specified'].includes(note.visibility)) {
// Publish event to myself's stream
stream(note.userId, 'note', await pack(note, user, {
publishUserStream(note.userId, 'note', await pack(note, user, {
detail: true
}));
} else {
// Publish event to myself's stream
stream(note.userId, 'note', noteObj);
publishUserStream(note.userId, 'note', noteObj);
// Publish note to local and hybrid timeline stream
if (note.visibility != 'home') {
@@ -264,7 +262,7 @@ async function publish(user: IUser, note: INote, noteObj: any, reply: INote, ren
const n = await pack(note, u, {
detail: true
});
stream(u._id, 'note', n);
publishUserStream(u._id, 'note', n);
publishHybridTimelineStream(u._id, n);
});
}
@@ -417,7 +415,7 @@ async function publishToFollowers(note: INote, noteObj: any, user: IUser, noteAc
}
// Publish event to followers stream
stream(following.followerId, 'note', noteObj);
publishUserStream(following.followerId, 'note', noteObj);
if (isRemoteUser(user) || note.visibility != 'public') {
publishHybridTimelineStream(following.followerId, noteObj);
@@ -444,7 +442,7 @@ function deliverNoteToMentionedRemoteUsers(mentionedUsers: IUser[], user: ILocal
function createMentionedEvents(mentionedUsers: IUser[], noteObj: any, nm: NotificationManager) {
mentionedUsers.filter(u => isLocalUser(u)).forEach(async (u) => {
event(u, 'mention', noteObj);
publishUserStream(u._id, 'mention', noteObj);
// Create notification
nm.push(u._id, 'mention');

View File

@@ -1,82 +1,58 @@
import * as mongo from 'mongodb';
import * as redis from 'redis';
import config from './config';
import Xev from 'xev';
const ev = new Xev();
type ID = string | mongo.ObjectID;
class MisskeyEvent {
private redisClient: redis.RedisClient;
function publish(channel: string, type: string, value?: any): void {
const message = type == null ? value : value == null ?
{ type: type } :
{ type: type, body: value };
constructor() {
// Connect to Redis
this.redisClient = redis.createClient(
config.redis.port, config.redis.host);
}
public publishUserStream(userId: ID, type: string, value?: any): void {
this.publish(`user-stream:${userId}`, type, typeof value === 'undefined' ? null : value);
}
public publishDriveStream(userId: ID, type: string, value?: any): void {
this.publish(`drive-stream:${userId}`, type, typeof value === 'undefined' ? null : value);
}
public publishNoteStream(noteId: ID, type: string, value?: any): void {
this.publish(`note-stream:${noteId}`, type, typeof value === 'undefined' ? null : value);
}
public publishUserListStream(listId: ID, type: string, value?: any): void {
this.publish(`user-list-stream:${listId}`, type, typeof value === 'undefined' ? null : value);
}
public publishMessagingStream(userId: ID, otherpartyId: ID, type: string, value?: any): void {
this.publish(`messaging-stream:${userId}-${otherpartyId}`, type, typeof value === 'undefined' ? null : value);
}
public publishMessagingIndexStream(userId: ID, type: string, value?: any): void {
this.publish(`messaging-index-stream:${userId}`, type, typeof value === 'undefined' ? null : value);
}
public publishReversiStream(userId: ID, type: string, value?: any): void {
this.publish(`reversi-stream:${userId}`, type, typeof value === 'undefined' ? null : value);
}
public publishReversiGameStream(gameId: ID, type: string, value?: any): void {
this.publish(`reversi-game-stream:${gameId}`, type, typeof value === 'undefined' ? null : value);
}
public publishLocalTimelineStream(note: any): void {
this.redisClient.publish('misskey:local-timeline', JSON.stringify(note));
}
public publishHybridTimelineStream(userId: ID, note: any): void {
this.redisClient.publish(userId ? `misskey:hybrid-timeline:${userId}` : 'misskey:hybrid-timeline', JSON.stringify(note));
}
public publishGlobalTimelineStream(note: any): void {
this.redisClient.publish('misskey:global-timeline', JSON.stringify(note));
}
private publish(channel: string, type: string, value?: any): void {
const message = value == null ?
{ type: type } :
{ type: type, body: value };
this.redisClient.publish(`misskey:${channel}`, JSON.stringify(message));
}
ev.emit(channel, message);
}
const ev = new MisskeyEvent();
export function publishUserStream(userId: ID, type: string, value?: any): void {
publish(`user-stream:${userId}`, type, typeof value === 'undefined' ? null : value);
}
export default ev.publishUserStream.bind(ev);
export function publishDriveStream(userId: ID, type: string, value?: any): void {
publish(`drive-stream:${userId}`, type, typeof value === 'undefined' ? null : value);
}
export const publishLocalTimelineStream = ev.publishLocalTimelineStream.bind(ev);
export const publishHybridTimelineStream = ev.publishHybridTimelineStream.bind(ev);
export const publishGlobalTimelineStream = ev.publishGlobalTimelineStream.bind(ev);
export const publishDriveStream = ev.publishDriveStream.bind(ev);
export const publishUserListStream = ev.publishUserListStream.bind(ev);
export const publishNoteStream = ev.publishNoteStream.bind(ev);
export const publishMessagingStream = ev.publishMessagingStream.bind(ev);
export const publishMessagingIndexStream = ev.publishMessagingIndexStream.bind(ev);
export const publishReversiStream = ev.publishReversiStream.bind(ev);
export const publishReversiGameStream = ev.publishReversiGameStream.bind(ev);
export function publishNoteStream(noteId: ID, type: string): void {
publish(`note-stream:${noteId}`, null, noteId);
}
export function publishUserListStream(listId: ID, type: string, value?: any): void {
publish(`user-list-stream:${listId}`, type, typeof value === 'undefined' ? null : value);
}
export function publishMessagingStream(userId: ID, otherpartyId: ID, type: string, value?: any): void {
publish(`messaging-stream:${userId}-${otherpartyId}`, type, typeof value === 'undefined' ? null : value);
}
export function publishMessagingIndexStream(userId: ID, type: string, value?: any): void {
publish(`messaging-index-stream:${userId}`, type, typeof value === 'undefined' ? null : value);
}
export function publishReversiStream(userId: ID, type: string, value?: any): void {
publish(`reversi-stream:${userId}`, type, typeof value === 'undefined' ? null : value);
}
export function publishReversiGameStream(gameId: ID, type: string, value?: any): void {
publish(`reversi-game-stream:${gameId}`, type, typeof value === 'undefined' ? null : value);
}
export function publishLocalTimelineStream(note: any): void {
publish('local-timeline', null, note);
}
export function publishHybridTimelineStream(userId: ID, note: any): void {
publish(userId ? `hybrid-timeline:${userId}` : 'hybrid-timeline', null, note);
}
export function publishGlobalTimelineStream(note: any): void {
publish('global-timeline', null, note);
}