summaryrefslogtreecommitdiff
path: root/src/docs
diff options
context:
space:
mode:
authorsyuilo <Syuilotan@yahoo.co.jp>2020-12-28 21:45:08 +0900
committerGitHub <noreply@github.com>2020-12-28 21:45:08 +0900
commit498f6e9be2728e961b842053e0c9191ca40274b2 (patch)
tree6a9ae6dd79cd4df886aa461d5a442bf485a2a88c /src/docs
parent:art: (diff)
downloadmisskey-498f6e9be2728e961b842053e0c9191ca40274b2.tar.gz
misskey-498f6e9be2728e961b842053e0c9191ca40274b2.tar.bz2
misskey-498f6e9be2728e961b842053e0c9191ca40274b2.zip
New Crowdin updates (#6964)
* New translations theme.md (Arabic) * New translations timelines.md (Arabic) * New translations aiscript.md (Czech) * New translations api.md (Czech) * New translations create-plugin.md (Czech) * New translations custom-emoji.md (Czech) * New translations follow.md (Czech) * New translations keyboard-shortcut.md (Czech) * New translations timelines.md (Spanish) * New translations stream.md (Spanish) * New translations pages.md (Czech) * New translations theme.md (French) * New translations api.md (French) * New translations create-plugin.md (French) * New translations custom-emoji.md (French) * New translations follow.md (French) * New translations keyboard-shortcut.md (French) * New translations mute.md (French) * New translations pages.md (French) * New translations reaction.md (French) * New translations reversi-bot.md (French) * New translations stream.md (French) * New translations create-plugin.md (Dutch) * New translations reversi-bot.md (Spanish) * New translations aiscript.md (Spanish) * New translations api.md (Spanish) * New translations create-plugin.md (Spanish) * New translations custom-emoji.md (Spanish) * New translations follow.md (Spanish) * New translations keyboard-shortcut.md (Spanish) * New translations mute.md (Spanish) * New translations pages.md (Spanish) * New translations reaction.md (Spanish) * New translations mute.md (Czech) * New translations timelines.md (French) * New translations reaction.md (Czech) * New translations follow.md (Korean) * New translations reaction.md (German) * New translations reversi-bot.md (German) * New translations stream.md (German) * New translations theme.md (German) * New translations timelines.md (German) * New translations aiscript.md (Korean) * New translations api.md (Korean) * New translations create-plugin.md (Korean) * New translations custom-emoji.md (Korean) * New translations keyboard-shortcut.md (Korean) * New translations mute.md (German) * New translations mute.md (Korean) * New translations pages.md (Korean) * New translations reaction.md (Korean) * New translations stream.md (Korean) * New translations theme.md (Korean) * New translations timelines.md (Korean) * New translations aiscript.md (Dutch) * New translations api.md (Dutch) * New translations reversi-bot.md (Czech) * New translations pages.md (German) * New translations reversi-bot.md (Korean) * New translations keyboard-shortcut.md (German) * New translations mute.md (Danish) * New translations stream.md (Czech) * New translations follow.md (German) * New translations theme.md (Czech) * New translations timelines.md (Czech) * New translations api.md (Danish) * New translations create-plugin.md (Danish) * New translations custom-emoji.md (Danish) * New translations follow.md (Danish) * New translations keyboard-shortcut.md (Danish) * New translations aiscript.md (Danish) * New translations pages.md (Danish) * New translations ja-JP.yml (German) * New translations reaction.md (Danish) * New translations custom-emoji.md (German) * New translations api.md (German) * New translations aiscript.md (German) * New translations timelines.md (Danish) * New translations theme.md (Danish) * New translations stream.md (Danish) * New translations reversi-bot.md (Danish) * New translations create-plugin.md (German) * New translations follow.md (Kabyle) * New translations keyboard-shortcut.md (Kabyle) * New translations custom-emoji.md (Kabyle) * New translations create-plugin.md (Kabyle) * New translations api.md (Kabyle) * New translations aiscript.md (Kabyle) * New translations reversi-bot.md (Kannada) * New translations timelines.md (Kannada) * New translations theme.md (Kannada) * New translations stream.md (Kannada) * New translations reaction.md (Kannada) * New translations pages.md (Kannada) * New translations mute.md (Kannada) * New translations pages.md (Kabyle) * New translations keyboard-shortcut.md (Kannada) * New translations mute.md (Kabyle) * New translations keyboard-shortcut.md (Japanese, Kansai) * New translations reaction.md (Kabyle) * New translations follow.md (Japanese, Kansai) * New translations custom-emoji.md (Kannada) * New translations theme.md (Japanese, Kansai) * New translations stream.md (Japanese, Kansai) * New translations reversi-bot.md (Japanese, Kansai) * New translations reaction.md (Japanese, Kansai) * New translations pages.md (Japanese, Kansai) * New translations mute.md (Japanese, Kansai) * New translations custom-emoji.md (Japanese, Kansai) * New translations reversi-bot.md (Kabyle) * New translations create-plugin.md (Japanese, Kansai) * New translations api.md (Japanese, Kansai) * New translations aiscript.md (Japanese, Kansai) * New translations timelines.md (Kabyle) * New translations theme.md (Kabyle) * New translations stream.md (Kabyle) * New translations follow.md (Kannada) * New translations keyboard-shortcut.md (English) * New translations create-plugin.md (Kannada) * New translations aiscript.md (English) * New translations reaction.md (English) * New translations pages.md (English) * New translations mute.md (English) * New translations follow.md (English) * New translations custom-emoji.md (English) * New translations create-plugin.md (English) * New translations api.md (English) * New translations stream.md (English) * New translations timelines.md (Chinese Traditional) * New translations theme.md (Chinese Traditional) * New translations stream.md (Chinese Traditional) * New translations reversi-bot.md (Chinese Traditional) * New translations reaction.md (Chinese Traditional) * New translations pages.md (Chinese Traditional) * New translations mute.md (Chinese Traditional) * New translations reversi-bot.md (English) * New translations theme.md (English) * New translations api.md (Kannada) * New translations pages.md (Uyghur) * New translations aiscript.md (Kannada) * New translations timelines.md (Uyghur) * New translations theme.md (Uyghur) * New translations stream.md (Uyghur) * New translations reversi-bot.md (Uyghur) * New translations reaction.md (Uyghur) * New translations mute.md (Uyghur) * New translations timelines.md (English) * New translations keyboard-shortcut.md (Uyghur) * New translations follow.md (Uyghur) * New translations custom-emoji.md (Uyghur) * New translations create-plugin.md (Uyghur) * New translations api.md (Uyghur) * New translations aiscript.md (Uyghur) * New translations timelines.md (Japanese, Kansai) * New translations ja-JP.yml (Chinese Simplified) * New translations ja-JP.yml (French) * New translations ja-JP.yml (Chinese Simplified) * New translations ja-JP.yml (Chinese Traditional) * New translations ja-JP.yml (English) * New translations ja-JP.yml (Russian) * New translations ja-JP.yml (Ukrainian) * New translations ja-JP.yml (Spanish) * New translations ja-JP.yml (German) * New translations ja-JP.yml (Korean) * New translations aiscript.md (Chinese Simplified) * New translations api.md (Chinese Simplified) * New translations api.md (Chinese Simplified) * New translations api.md (Chinese Simplified) * New translations api.md (Chinese Simplified) * New translations api.md (Chinese Simplified) * New translations api.md (Chinese Simplified) * New translations api.md (Chinese Simplified) * New translations create-plugin.md (Chinese Simplified) * New translations stream.md (Chinese Simplified) * New translations create-plugin.md (Chinese Simplified) * New translations create-plugin.md (Chinese Simplified) * New translations create-plugin.md (Chinese Simplified) * New translations create-plugin.md (Chinese Simplified) * New translations ja-JP.yml (Chinese Traditional) * New translations ja-JP.yml (Chinese Traditional) * New translations mfm.md (Ukrainian) * New translations mfm.md (Korean) * New translations deck.md (Dutch) * New translations mfm.md (Dutch) * New translations deck.md (Norwegian) * New translations mfm.md (Norwegian) * New translations deck.md (Polish) * New translations mfm.md (Polish) * New translations deck.md (Portuguese) * New translations mfm.md (Portuguese) * New translations deck.md (Russian) * New translations mfm.md (Russian) * New translations deck.md (Ukrainian) * New translations deck.md (Chinese Simplified) * New translations mfm.md (German) * New translations mfm.md (Chinese Simplified) * New translations deck.md (Chinese Traditional) * New translations mfm.md (Chinese Traditional) * New translations deck.md (English) * New translations mfm.md (English) * New translations deck.md (Uyghur) * New translations mfm.md (Uyghur) * New translations deck.md (Kannada) * New translations mfm.md (Kannada) * New translations deck.md (Kabyle) * New translations mfm.md (Kabyle) * New translations deck.md (Japanese, Kansai) * New translations deck.md (Korean) * New translations deck.md (German) * New translations mfm.md (Danish) * New translations deck.md (French) * New translations mfm.md (French) * New translations deck.md (Spanish) * New translations mfm.md (Spanish) * New translations deck.md (Arabic) * New translations mfm.md (Arabic) * New translations deck.md (Czech) * New translations mfm.md (Czech) * New translations deck.md (Danish) * New translations mfm.md (Japanese, Kansai) * New translations aiscript.md (Chinese Traditional) * New translations api.md (Chinese Traditional) * New translations timelines.md (Chinese Traditional) * New translations api.md (Chinese Traditional) * New translations api.md (Chinese Traditional) * New translations api.md (Chinese Traditional) * New translations create-plugin.md (Chinese Traditional) * New translations keyboard-shortcut.md (Chinese Traditional) * New translations stream.md (Chinese Traditional) * New translations keyboard-shortcut.md (Chinese Traditional) * New translations keyboard-shortcut.md (Chinese Traditional) * New translations create-plugin.md (Chinese Simplified) * New translations create-plugin.md (Chinese Simplified) * New translations create-plugin.md (Chinese Simplified) * New translations create-plugin.md (Chinese Simplified) * New translations aiscript.md (Chinese Traditional) * New translations follow.md (Chinese Traditional) * New translations ja-JP.yml (Chinese Traditional) * New translations follow.md (Chinese Traditional) * New translations ja-JP.yml (Chinese Traditional) * New translations create-plugin.md (Chinese Simplified) * New translations ja-JP.yml (Chinese Traditional) * New translations create-plugin.md (Chinese Simplified) * New translations custom-emoji.md (Chinese Simplified) * New translations ja-JP.yml (Chinese Traditional) * New translations ja-JP.yml (Chinese Simplified) * New translations ja-JP.yml (Chinese Traditional) * New translations ja-JP.yml (Chinese Traditional) * New translations ja-JP.yml (Chinese Traditional) * New translations ja-JP.yml (Chinese Traditional)
Diffstat (limited to 'src/docs')
-rw-r--r--src/docs/ar-SA/aiscript.md4
-rw-r--r--src/docs/ar-SA/api.md58
-rw-r--r--src/docs/ar-SA/create-plugin.md74
-rw-r--r--src/docs/ar-SA/custom-emoji.md2
-rw-r--r--src/docs/ar-SA/deck.md18
-rw-r--r--src/docs/ar-SA/follow.md2
-rw-r--r--src/docs/ar-SA/keyboard-shortcut.md68
-rw-r--r--src/docs/ar-SA/mfm.md2
-rw-r--r--src/docs/ar-SA/mute.md13
-rw-r--r--src/docs/ar-SA/pages.md10
-rw-r--r--src/docs/ar-SA/reaction.md11
-rw-r--r--src/docs/ar-SA/reversi-bot.md160
-rw-r--r--src/docs/ar-SA/stream.md354
-rw-r--r--src/docs/ar-SA/theme.md68
-rw-r--r--src/docs/ar-SA/timelines.md15
-rw-r--r--src/docs/cs-CZ/aiscript.md4
-rw-r--r--src/docs/cs-CZ/api.md58
-rw-r--r--src/docs/cs-CZ/create-plugin.md74
-rw-r--r--src/docs/cs-CZ/custom-emoji.md2
-rw-r--r--src/docs/cs-CZ/deck.md18
-rw-r--r--src/docs/cs-CZ/follow.md2
-rw-r--r--src/docs/cs-CZ/keyboard-shortcut.md68
-rw-r--r--src/docs/cs-CZ/mfm.md2
-rw-r--r--src/docs/cs-CZ/mute.md13
-rw-r--r--src/docs/cs-CZ/pages.md10
-rw-r--r--src/docs/cs-CZ/reaction.md11
-rw-r--r--src/docs/cs-CZ/reversi-bot.md160
-rw-r--r--src/docs/cs-CZ/stream.md354
-rw-r--r--src/docs/cs-CZ/theme.md68
-rw-r--r--src/docs/cs-CZ/timelines.md15
-rw-r--r--src/docs/da-DK/aiscript.md4
-rw-r--r--src/docs/da-DK/api.md58
-rw-r--r--src/docs/da-DK/create-plugin.md74
-rw-r--r--src/docs/da-DK/custom-emoji.md2
-rw-r--r--src/docs/da-DK/deck.md18
-rw-r--r--src/docs/da-DK/follow.md2
-rw-r--r--src/docs/da-DK/keyboard-shortcut.md68
-rw-r--r--src/docs/da-DK/mfm.md2
-rw-r--r--src/docs/da-DK/mute.md13
-rw-r--r--src/docs/da-DK/pages.md10
-rw-r--r--src/docs/da-DK/reaction.md11
-rw-r--r--src/docs/da-DK/reversi-bot.md160
-rw-r--r--src/docs/da-DK/stream.md354
-rw-r--r--src/docs/da-DK/theme.md68
-rw-r--r--src/docs/da-DK/timelines.md15
-rw-r--r--src/docs/de-DE/aiscript.md4
-rw-r--r--src/docs/de-DE/api.md58
-rw-r--r--src/docs/de-DE/create-plugin.md74
-rw-r--r--src/docs/de-DE/custom-emoji.md2
-rw-r--r--src/docs/de-DE/deck.md18
-rw-r--r--src/docs/de-DE/follow.md2
-rw-r--r--src/docs/de-DE/keyboard-shortcut.md68
-rw-r--r--src/docs/de-DE/mfm.md2
-rw-r--r--src/docs/de-DE/mute.md13
-rw-r--r--src/docs/de-DE/pages.md10
-rw-r--r--src/docs/de-DE/reaction.md11
-rw-r--r--src/docs/de-DE/reversi-bot.md160
-rw-r--r--src/docs/de-DE/stream.md354
-rw-r--r--src/docs/de-DE/theme.md68
-rw-r--r--src/docs/de-DE/timelines.md15
-rw-r--r--src/docs/en-US/aiscript.md4
-rw-r--r--src/docs/en-US/api.md58
-rw-r--r--src/docs/en-US/create-plugin.md74
-rw-r--r--src/docs/en-US/custom-emoji.md2
-rw-r--r--src/docs/en-US/deck.md18
-rw-r--r--src/docs/en-US/follow.md2
-rw-r--r--src/docs/en-US/keyboard-shortcut.md68
-rw-r--r--src/docs/en-US/mfm.md2
-rw-r--r--src/docs/en-US/mute.md13
-rw-r--r--src/docs/en-US/pages.md10
-rw-r--r--src/docs/en-US/reaction.md11
-rw-r--r--src/docs/en-US/reversi-bot.md160
-rw-r--r--src/docs/en-US/stream.md354
-rw-r--r--src/docs/en-US/theme.md68
-rw-r--r--src/docs/en-US/timelines.md15
-rw-r--r--src/docs/es-ES/aiscript.md4
-rw-r--r--src/docs/es-ES/api.md58
-rw-r--r--src/docs/es-ES/create-plugin.md74
-rw-r--r--src/docs/es-ES/custom-emoji.md2
-rw-r--r--src/docs/es-ES/deck.md18
-rw-r--r--src/docs/es-ES/follow.md2
-rw-r--r--src/docs/es-ES/keyboard-shortcut.md68
-rw-r--r--src/docs/es-ES/mfm.md2
-rw-r--r--src/docs/es-ES/mute.md13
-rw-r--r--src/docs/es-ES/pages.md10
-rw-r--r--src/docs/es-ES/reaction.md11
-rw-r--r--src/docs/es-ES/reversi-bot.md160
-rw-r--r--src/docs/es-ES/stream.md354
-rw-r--r--src/docs/es-ES/theme.md68
-rw-r--r--src/docs/es-ES/timelines.md15
-rw-r--r--src/docs/fr-FR/aiscript.md4
-rw-r--r--src/docs/fr-FR/api.md58
-rw-r--r--src/docs/fr-FR/create-plugin.md74
-rw-r--r--src/docs/fr-FR/custom-emoji.md2
-rw-r--r--src/docs/fr-FR/deck.md18
-rw-r--r--src/docs/fr-FR/follow.md2
-rw-r--r--src/docs/fr-FR/keyboard-shortcut.md68
-rw-r--r--src/docs/fr-FR/mfm.md2
-rw-r--r--src/docs/fr-FR/mute.md13
-rw-r--r--src/docs/fr-FR/pages.md10
-rw-r--r--src/docs/fr-FR/reaction.md11
-rw-r--r--src/docs/fr-FR/reversi-bot.md160
-rw-r--r--src/docs/fr-FR/stream.md354
-rw-r--r--src/docs/fr-FR/theme.md68
-rw-r--r--src/docs/fr-FR/timelines.md15
-rw-r--r--src/docs/ja-KS/aiscript.md4
-rw-r--r--src/docs/ja-KS/api.md58
-rw-r--r--src/docs/ja-KS/create-plugin.md74
-rw-r--r--src/docs/ja-KS/custom-emoji.md2
-rw-r--r--src/docs/ja-KS/deck.md18
-rw-r--r--src/docs/ja-KS/follow.md2
-rw-r--r--src/docs/ja-KS/keyboard-shortcut.md68
-rw-r--r--src/docs/ja-KS/mfm.md2
-rw-r--r--src/docs/ja-KS/mute.md13
-rw-r--r--src/docs/ja-KS/pages.md10
-rw-r--r--src/docs/ja-KS/reaction.md11
-rw-r--r--src/docs/ja-KS/reversi-bot.md160
-rw-r--r--src/docs/ja-KS/stream.md354
-rw-r--r--src/docs/ja-KS/theme.md68
-rw-r--r--src/docs/ja-KS/timelines.md15
-rw-r--r--src/docs/kab-KAB/aiscript.md4
-rw-r--r--src/docs/kab-KAB/api.md58
-rw-r--r--src/docs/kab-KAB/create-plugin.md74
-rw-r--r--src/docs/kab-KAB/custom-emoji.md2
-rw-r--r--src/docs/kab-KAB/deck.md18
-rw-r--r--src/docs/kab-KAB/follow.md2
-rw-r--r--src/docs/kab-KAB/keyboard-shortcut.md68
-rw-r--r--src/docs/kab-KAB/mfm.md2
-rw-r--r--src/docs/kab-KAB/mute.md13
-rw-r--r--src/docs/kab-KAB/pages.md10
-rw-r--r--src/docs/kab-KAB/reaction.md11
-rw-r--r--src/docs/kab-KAB/reversi-bot.md160
-rw-r--r--src/docs/kab-KAB/stream.md354
-rw-r--r--src/docs/kab-KAB/theme.md68
-rw-r--r--src/docs/kab-KAB/timelines.md15
-rw-r--r--src/docs/kn-IN/aiscript.md4
-rw-r--r--src/docs/kn-IN/api.md58
-rw-r--r--src/docs/kn-IN/create-plugin.md74
-rw-r--r--src/docs/kn-IN/custom-emoji.md2
-rw-r--r--src/docs/kn-IN/deck.md18
-rw-r--r--src/docs/kn-IN/follow.md2
-rw-r--r--src/docs/kn-IN/keyboard-shortcut.md68
-rw-r--r--src/docs/kn-IN/mfm.md2
-rw-r--r--src/docs/kn-IN/mute.md13
-rw-r--r--src/docs/kn-IN/pages.md10
-rw-r--r--src/docs/kn-IN/reaction.md11
-rw-r--r--src/docs/kn-IN/reversi-bot.md160
-rw-r--r--src/docs/kn-IN/stream.md354
-rw-r--r--src/docs/kn-IN/theme.md68
-rw-r--r--src/docs/kn-IN/timelines.md15
-rw-r--r--src/docs/ko-KR/aiscript.md4
-rw-r--r--src/docs/ko-KR/api.md58
-rw-r--r--src/docs/ko-KR/create-plugin.md74
-rw-r--r--src/docs/ko-KR/custom-emoji.md2
-rw-r--r--src/docs/ko-KR/deck.md18
-rw-r--r--src/docs/ko-KR/follow.md2
-rw-r--r--src/docs/ko-KR/keyboard-shortcut.md68
-rw-r--r--src/docs/ko-KR/mfm.md2
-rw-r--r--src/docs/ko-KR/mute.md13
-rw-r--r--src/docs/ko-KR/pages.md10
-rw-r--r--src/docs/ko-KR/reaction.md11
-rw-r--r--src/docs/ko-KR/reversi-bot.md160
-rw-r--r--src/docs/ko-KR/stream.md354
-rw-r--r--src/docs/ko-KR/theme.md68
-rw-r--r--src/docs/ko-KR/timelines.md15
-rw-r--r--src/docs/nl-NL/aiscript.md4
-rw-r--r--src/docs/nl-NL/api.md58
-rw-r--r--src/docs/nl-NL/create-plugin.md74
-rw-r--r--src/docs/nl-NL/custom-emoji.md2
-rw-r--r--src/docs/nl-NL/deck.md18
-rw-r--r--src/docs/nl-NL/follow.md2
-rw-r--r--src/docs/nl-NL/keyboard-shortcut.md68
-rw-r--r--src/docs/nl-NL/mfm.md2
-rw-r--r--src/docs/nl-NL/mute.md13
-rw-r--r--src/docs/nl-NL/pages.md10
-rw-r--r--src/docs/nl-NL/reaction.md11
-rw-r--r--src/docs/nl-NL/reversi-bot.md160
-rw-r--r--src/docs/nl-NL/stream.md354
-rw-r--r--src/docs/nl-NL/theme.md68
-rw-r--r--src/docs/nl-NL/timelines.md15
-rw-r--r--src/docs/no-NO/aiscript.md4
-rw-r--r--src/docs/no-NO/api.md58
-rw-r--r--src/docs/no-NO/create-plugin.md74
-rw-r--r--src/docs/no-NO/custom-emoji.md2
-rw-r--r--src/docs/no-NO/deck.md18
-rw-r--r--src/docs/no-NO/follow.md2
-rw-r--r--src/docs/no-NO/keyboard-shortcut.md68
-rw-r--r--src/docs/no-NO/mfm.md2
-rw-r--r--src/docs/no-NO/mute.md13
-rw-r--r--src/docs/no-NO/pages.md10
-rw-r--r--src/docs/no-NO/reaction.md11
-rw-r--r--src/docs/no-NO/reversi-bot.md160
-rw-r--r--src/docs/no-NO/stream.md354
-rw-r--r--src/docs/no-NO/theme.md68
-rw-r--r--src/docs/no-NO/timelines.md15
-rw-r--r--src/docs/pl-PL/aiscript.md4
-rw-r--r--src/docs/pl-PL/api.md58
-rw-r--r--src/docs/pl-PL/create-plugin.md74
-rw-r--r--src/docs/pl-PL/custom-emoji.md2
-rw-r--r--src/docs/pl-PL/deck.md18
-rw-r--r--src/docs/pl-PL/follow.md2
-rw-r--r--src/docs/pl-PL/keyboard-shortcut.md68
-rw-r--r--src/docs/pl-PL/mfm.md2
-rw-r--r--src/docs/pl-PL/mute.md13
-rw-r--r--src/docs/pl-PL/pages.md10
-rw-r--r--src/docs/pl-PL/reaction.md11
-rw-r--r--src/docs/pl-PL/reversi-bot.md160
-rw-r--r--src/docs/pl-PL/stream.md354
-rw-r--r--src/docs/pl-PL/theme.md68
-rw-r--r--src/docs/pl-PL/timelines.md15
-rw-r--r--src/docs/pt-PT/aiscript.md4
-rw-r--r--src/docs/pt-PT/api.md58
-rw-r--r--src/docs/pt-PT/create-plugin.md74
-rw-r--r--src/docs/pt-PT/custom-emoji.md2
-rw-r--r--src/docs/pt-PT/deck.md18
-rw-r--r--src/docs/pt-PT/follow.md2
-rw-r--r--src/docs/pt-PT/keyboard-shortcut.md68
-rw-r--r--src/docs/pt-PT/mfm.md2
-rw-r--r--src/docs/pt-PT/mute.md13
-rw-r--r--src/docs/pt-PT/pages.md10
-rw-r--r--src/docs/pt-PT/reaction.md11
-rw-r--r--src/docs/pt-PT/reversi-bot.md160
-rw-r--r--src/docs/pt-PT/stream.md354
-rw-r--r--src/docs/pt-PT/theme.md68
-rw-r--r--src/docs/pt-PT/timelines.md15
-rw-r--r--src/docs/ru-RU/aiscript.md4
-rw-r--r--src/docs/ru-RU/api.md58
-rw-r--r--src/docs/ru-RU/create-plugin.md74
-rw-r--r--src/docs/ru-RU/custom-emoji.md2
-rw-r--r--src/docs/ru-RU/deck.md18
-rw-r--r--src/docs/ru-RU/follow.md2
-rw-r--r--src/docs/ru-RU/keyboard-shortcut.md68
-rw-r--r--src/docs/ru-RU/mfm.md2
-rw-r--r--src/docs/ru-RU/mute.md13
-rw-r--r--src/docs/ru-RU/pages.md10
-rw-r--r--src/docs/ru-RU/reaction.md11
-rw-r--r--src/docs/ru-RU/reversi-bot.md160
-rw-r--r--src/docs/ru-RU/stream.md354
-rw-r--r--src/docs/ru-RU/theme.md68
-rw-r--r--src/docs/ru-RU/timelines.md15
-rw-r--r--src/docs/ug-CN/aiscript.md4
-rw-r--r--src/docs/ug-CN/api.md58
-rw-r--r--src/docs/ug-CN/create-plugin.md74
-rw-r--r--src/docs/ug-CN/custom-emoji.md2
-rw-r--r--src/docs/ug-CN/deck.md18
-rw-r--r--src/docs/ug-CN/follow.md2
-rw-r--r--src/docs/ug-CN/keyboard-shortcut.md68
-rw-r--r--src/docs/ug-CN/mfm.md2
-rw-r--r--src/docs/ug-CN/mute.md13
-rw-r--r--src/docs/ug-CN/pages.md10
-rw-r--r--src/docs/ug-CN/reaction.md11
-rw-r--r--src/docs/ug-CN/reversi-bot.md160
-rw-r--r--src/docs/ug-CN/stream.md354
-rw-r--r--src/docs/ug-CN/theme.md68
-rw-r--r--src/docs/ug-CN/timelines.md15
-rw-r--r--src/docs/uk-UA/aiscript.md4
-rw-r--r--src/docs/uk-UA/api.md58
-rw-r--r--src/docs/uk-UA/create-plugin.md74
-rw-r--r--src/docs/uk-UA/custom-emoji.md2
-rw-r--r--src/docs/uk-UA/deck.md18
-rw-r--r--src/docs/uk-UA/follow.md2
-rw-r--r--src/docs/uk-UA/keyboard-shortcut.md68
-rw-r--r--src/docs/uk-UA/mfm.md2
-rw-r--r--src/docs/uk-UA/mute.md13
-rw-r--r--src/docs/uk-UA/pages.md10
-rw-r--r--src/docs/uk-UA/reaction.md11
-rw-r--r--src/docs/uk-UA/reversi-bot.md160
-rw-r--r--src/docs/uk-UA/stream.md354
-rw-r--r--src/docs/uk-UA/theme.md68
-rw-r--r--src/docs/uk-UA/timelines.md15
-rw-r--r--src/docs/zh-CN/aiscript.md4
-rw-r--r--src/docs/zh-CN/api.md58
-rw-r--r--src/docs/zh-CN/create-plugin.md74
-rw-r--r--src/docs/zh-CN/custom-emoji.md2
-rw-r--r--src/docs/zh-CN/deck.md18
-rw-r--r--src/docs/zh-CN/follow.md2
-rw-r--r--src/docs/zh-CN/keyboard-shortcut.md68
-rw-r--r--src/docs/zh-CN/mfm.md2
-rw-r--r--src/docs/zh-CN/mute.md13
-rw-r--r--src/docs/zh-CN/pages.md10
-rw-r--r--src/docs/zh-CN/reaction.md11
-rw-r--r--src/docs/zh-CN/reversi-bot.md160
-rw-r--r--src/docs/zh-CN/stream.md354
-rw-r--r--src/docs/zh-CN/theme.md68
-rw-r--r--src/docs/zh-CN/timelines.md15
-rw-r--r--src/docs/zh-TW/aiscript.md4
-rw-r--r--src/docs/zh-TW/api.md58
-rw-r--r--src/docs/zh-TW/create-plugin.md74
-rw-r--r--src/docs/zh-TW/custom-emoji.md2
-rw-r--r--src/docs/zh-TW/deck.md18
-rw-r--r--src/docs/zh-TW/follow.md2
-rw-r--r--src/docs/zh-TW/keyboard-shortcut.md68
-rw-r--r--src/docs/zh-TW/mfm.md2
-rw-r--r--src/docs/zh-TW/mute.md13
-rw-r--r--src/docs/zh-TW/pages.md10
-rw-r--r--src/docs/zh-TW/reaction.md11
-rw-r--r--src/docs/zh-TW/reversi-bot.md160
-rw-r--r--src/docs/zh-TW/stream.md354
-rw-r--r--src/docs/zh-TW/theme.md68
-rw-r--r--src/docs/zh-TW/timelines.md15
300 files changed, 17180 insertions, 0 deletions
diff --git a/src/docs/ar-SA/aiscript.md b/src/docs/ar-SA/aiscript.md
new file mode 100644
index 0000000000..6c28b446e3
--- /dev/null
+++ b/src/docs/ar-SA/aiscript.md
@@ -0,0 +1,4 @@
+# AiScript
+
+## 関数
+デフォルトで値渡しです。
diff --git a/src/docs/ar-SA/api.md b/src/docs/ar-SA/api.md
new file mode 100644
index 0000000000..76019b6145
--- /dev/null
+++ b/src/docs/ar-SA/api.md
@@ -0,0 +1,58 @@
+# Misskey API
+
+MisskeyAPIを使ってMisskeyクライアント、Misskey連携Webサービス、Bot等(以下「アプリケーション」と呼びます)を開発できます。 ストリーミングAPIもあるので、リアルタイム性のあるアプリケーションを作ることも可能です。
+
+APIを使い始めるには、まずアクセストークンを取得する必要があります。 このドキュメントでは、アクセストークンを取得する手順を説明した後、基本的なAPIの使い方を説明します。
+
+## アクセストークンの取得
+基本的に、APIはリクエストにはアクセストークンが必要となります。 APIにリクエストするのが自分自身なのか、不特定の利用者に使ってもらうアプリケーションなのかによって取得手順は異なります。
+
+* 前者の場合: [「自分自身のアクセストークンを手動発行する」](#自分自身のアクセストークンを手動発行する)に進む
+* 後者の場合: [「アプリケーション利用者にアクセストークンの発行をリクエストする」](#アプリケーション利用者にアクセストークンの発行をリクエストする)に進む
+
+### 自分自身のアクセストークンを手動発行する
+「設定 > API」で、自分のアクセストークンを発行できます。
+
+[「APIの使い方」へ進む](#APIの使い方)
+
+### アプリケーション利用者にアクセストークンの発行をリクエストする
+アプリケーション利用者のアクセストークンを取得するには、以下の手順で発行をリクエストします。
+
+#### Step 1
+
+UUIDを生成する。以後これをセッションIDと呼びます。
+
+> このセッションIDは毎回生成し、使いまわさないようにしてください。
+
+#### Step 2
+
+`{_URL_}/miauth/{session}`をユーザーのブラウザで表示させる。`{session}`の部分は、セッションIDに置き換えてください。
+> 例: `{_URL_}/miauth/c1f6d42b-468b-4fd2-8274-e58abdedef6f`
+
+表示する際、URLにクエリパラメータとしていくつかのオプションを設定できます:
+* `name` ... アプリケーション名
+ * > 例: `MissDeck`
+* `icon` ... アプリケーションのアイコン画像URL
+ * > 例: `https://missdeck.example.com/icon.png`
+* `callback` ... 認証が終わった後にリダイレクトするURL
+ * > 例: `https://missdeck.example.com/callback`
+ * リダイレクト時には、`session`というクエリパラメータでセッションIDが付きます
+* `permission` ... アプリケーションが要求する権限
+ * > 例: `write:notes,write:following,read:drive`
+ * 要求する権限を`,`で区切って列挙します
+ * どのような権限があるかは[APIリファレンス](/api-doc)で確認できます
+
+#### Step 3
+ユーザーが発行を許可した後、`{_URL_}/api/miauth/{session}/check`にPOSTリクエストすると、レスポンスとしてアクセストークンを含むJSONが返ります。
+
+レスポンスに含まれるプロパティ:
+* `token` ... ユーザーのアクセストークン
+* `user` ... ユーザーの情報
+
+[「APIの使い方」へ進む](#APIの使い方)
+
+## APIの使い方
+**APIはすべてPOSTで、リクエスト/レスポンスともにJSON形式です。RESTではありません。** アクセストークンは、`i`というパラメータ名でリクエストに含めます。
+
+* [APIリファレンス](/api-doc)
+* [ストリーミングAPI](./stream)
diff --git a/src/docs/ar-SA/create-plugin.md b/src/docs/ar-SA/create-plugin.md
new file mode 100644
index 0000000000..a6cba6388a
--- /dev/null
+++ b/src/docs/ar-SA/create-plugin.md
@@ -0,0 +1,74 @@
+# プラグインの作成
+Misskey Webクライアントのプラグイン機能を使うと、クライアントを拡張し、様々な機能を追加できます。 ここではプラグインの作成にあたってのメタデータ定義や、AiScript APIリファレンスを掲載します。
+
+## البيانات الوصفية
+プラグインは、AiScriptのメタデータ埋め込み機能を使って、デフォルトとしてプラグインのメタデータを定義する必要があります。 メタデータは次のプロパティを含むオブジェクトです。
+
+### name
+プラグイン名
+
+### author
+プラグイン作者
+
+### version
+プラグインバージョン。数値を指定してください。
+
+### description
+プラグインの説明
+
+### permissions
+プラグインが要求する権限。MisskeyAPIにリクエストする際に用いられます。
+
+### config
+プラグインの設定情報を表すオブジェクト。 キーに設定名、値に以下のプロパティを含めます。
+
+#### type
+設定値の種類を表す文字列。以下から選択します。 string number boolean
+
+#### label
+ユーザーに表示する設定名
+
+#### description
+設定の説明
+
+#### default
+設定のデフォルト値
+
+## APIリファレンス
+AiScript標準で組み込まれているAPIは掲載しません。
+
+### Mk:dialog(title text type)
+ダイアログを表示します。typeには以下の値が設定できます。 info success warn error question 省略すると info になります。
+
+### Mk:confirm(title text type)
+確認ダイアログを表示します。typeには以下の値が設定できます。 info success warn error question 省略すると question になります。 ユーザーが"OK"を選択した場合は true を、"キャンセル"を選択した場合は false が返ります。
+
+### Mk:api(endpoint params)
+Misskey APIにリクエストします。第一引数にエンドポイント名、第二引数にパラメータオブジェクトを渡します。
+
+### Mk:save(key value)
+任意の値に任意の名前を付けて永続化します。永続化した値は、AiScriptコンテキストが終了しても残り、Mk:loadで読み取ることができます。
+
+### Mk:load(key)
+Mk:saveで永続化した指定の名前の値を読み取ります。
+
+### Plugin:register_post_form_action(title fn)
+投稿フォームにアクションを追加します。第一引数にアクション名、第二引数にアクションが選択された際のコールバック関数を渡します。 コールバック関数には、第一引数に投稿フォームオブジェクトが渡されます。
+
+### Plugin:register_note_action(title fn)
+ノートメニューに項目を追加します。第一引数に項目名、第二引数に項目が選択された際のコールバック関数を渡します。 コールバック関数には、第一引数に対象のノートオブジェクトが渡されます。
+
+### Plugin:register_user_action(title fn)
+ユーザーメニューに項目を追加します。第一引数に項目名、第二引数に項目が選択された際のコールバック関数を渡します。 コールバック関数には、第一引数に対象のユーザーオブジェクトが渡されます。
+
+### Plugin:register_note_view_interruptor(fn)
+UIに表示されるノート情報を書き換えます。 コールバック関数には、第一引数に対象のノートオブジェクトが渡されます。 コールバック関数の返り値でノートが書き換えられます。
+
+### Plugin:register_note_post_interruptor(fn)
+ノート投稿時にノート情報を書き換えます。 コールバック関数には、第一引数に対象のノートオブジェクトが渡されます。 コールバック関数の返り値でノートが書き換えられます。
+
+### Plugin:open_url(url)
+第一引数に渡されたURLをブラウザの新しいタブで開きます。
+
+### Plugin:config
+プラグインの設定が格納されるオブジェクト。プラグイン定義のconfigで設定したキーで値が入ります。
diff --git a/src/docs/ar-SA/custom-emoji.md b/src/docs/ar-SA/custom-emoji.md
new file mode 100644
index 0000000000..b86b191d19
--- /dev/null
+++ b/src/docs/ar-SA/custom-emoji.md
@@ -0,0 +1,2 @@
+# إيموجي مخصص
+カスタム絵文字は、インスタンスで用意された画像を絵文字のように使える機能です。 ノート、リアクション、チャット、自己紹介、名前などの場所で使うことができます。 カスタム絵文字をそれらの場所で使うには、絵文字ピッカーボタン(ある場合)を押すか、`:`を入力して絵文字サジェストを表示します。 テキスト内に`:foo:`のような形式の文字列が見つかると、`foo`の部分がカスタム絵文字名と解釈され、表示時には対応したカスタム絵文字に置き換わります。
diff --git a/src/docs/ar-SA/deck.md b/src/docs/ar-SA/deck.md
new file mode 100644
index 0000000000..8057e262fd
--- /dev/null
+++ b/src/docs/ar-SA/deck.md
@@ -0,0 +1,18 @@
+# デッキ
+
+デッキは利用可能なUIのひとつです。「カラム」と呼ばれるビューを複数並べて表示させることで、カスタマイズ性が高く、情報量の多いUIが構築できることが特徴です。
+
+## カラムの追加
+デッキの背景を右クリックし、「カラムを追加」して任意のカラムを追加できます。
+
+## カラムの移動
+カラムは、ドラッグアンドドロップで他のカラムと位置を入れ替えることが出来るほか、カラムメニュー(カラムのヘッダー右クリック)から位置を移動させることもできます。
+
+## カラムの水平分割
+カラムは左右だけでなく、上下に並べることもできます。 カラムメニューを開き、「左に重ねる」を選択すると、左のカラムの下に現在のカラムが移動します。 上下分割を解除するには、カラムメニューの「右に出す」を選択します。
+
+## カラムの設定
+カラムメニューの「編集」を選択するとカラムの設定を編集できます。カラムの名前を変えたり、幅を変えたりできます。
+
+## デッキの設定
+デッキに関する設定は、[settings/deck](/settings/deck)で行えます。
diff --git a/src/docs/ar-SA/follow.md b/src/docs/ar-SA/follow.md
new file mode 100644
index 0000000000..9b6562be94
--- /dev/null
+++ b/src/docs/ar-SA/follow.md
@@ -0,0 +1,2 @@
+# المتابَعون
+ユーザーをフォローすると、タイムラインにそのユーザーの投稿が表示されるようになります。ただし、他のユーザーに対する返信は含まれません。 ユーザーをフォローするには、ユーザーページの「フォロー」ボタンをクリックします。フォローを解除するには、もう一度クリックします。
diff --git a/src/docs/ar-SA/keyboard-shortcut.md b/src/docs/ar-SA/keyboard-shortcut.md
new file mode 100644
index 0000000000..8ca24ad418
--- /dev/null
+++ b/src/docs/ar-SA/keyboard-shortcut.md
@@ -0,0 +1,68 @@
+# キーボードショートカット
+
+## الشامل
+これらのショートカットは基本的にどこでも使えます。
+<table>
+ <thead>
+ <tr><th>ショートカット</th><th>効果</th><th>由来</th></tr>
+ </thead>
+ <tbody>
+ <tr><td><kbd class="key">P</kbd>, <kbd class="key">N</kbd></td><td>新規投稿</td><td><b>P</b>ost, <b>N</b>ew, <b>N</b>ote</td></tr>
+ <tr><td><kbd class="key">T</kbd></td><td>タイムラインの最も新しい投稿にフォーカス</td><td><b>T</b>imeline, <b>T</b>op</td></tr>
+ <tr><td><kbd class="group"><kbd class="key">Shift</kbd> + <kbd class="key">N</kbd></kbd></td><td>通知を表示/隠す</td><td><b>N</b>otifications</td></tr>
+ <tr><td><kbd class="key">S</kbd></td><td>البحث</td><td><b>S</b>earch</td></tr>
+ <tr><td><kbd class="key">H</kbd>, <kbd class="key">?</kbd></td><td>ヘルプを表示</td><td><b>H</b>elp</td></tr>
+ </tbody>
+</table>
+
+## 投稿にフォーカスされた状態
+
+<table>
+ <thead>
+ <tr><th>ショートカット</th><th>効果</th><th>由来</th></tr>
+ </thead>
+ <tbody>
+ <tr><td><kbd class="key">↑</kbd>, <kbd class="key">K</kbd>, <kbd class="group"><kbd class="key">Shift</kbd> + <kbd class="key">Tab</kbd></kbd></td><td>上の投稿にフォーカスを移動</td><td>-</td></tr>
+ <tr><td><kbd class="key">↓</kbd>, <kbd class="key">J</kbd>, <kbd class="key">Tab</kbd></td><td>下の投稿にフォーカスを移動</td><td>-</td></tr>
+ <tr><td><kbd class="key">R</kbd></td><td>返信フォームを開く</td><td><b>R</b>eply</td></tr>
+ <tr><td><kbd class="key">Q</kbd></td><td>Renoteフォームを開く</td><td><b>Q</b>uote</td></tr>
+ <tr><td><kbd class="group"><kbd class="key">Ctrl</kbd> + <kbd class="key">Q</kbd></kbd></td><td>即刻Renoteする(フォームを開かずに)</td><td>-</td></tr>
+ <tr><td><kbd class="key">E</kbd>, <kbd class="key">A</kbd>, <kbd class="key">+</kbd></td><td>リアクションフォームを開く</td><td><b>E</b>mote, re<b>A</b>ction</td></tr>
+ <tr><td><kbd class="key">0</kbd>~<kbd class="key">9</kbd></td><td>数字に対応したリアクションをする(対応については後述)</td><td>-</td></tr>
+ <tr><td><kbd class="key">F</kbd>, <kbd class="key">B</kbd></td><td>お気に入りに登録</td><td><b>F</b>avorite, <b>B</b>ookmark</td></tr>
+ <tr><td><kbd class="key">Del</kbd>, <kbd class="group"><kbd class="key">Ctrl</kbd> + <kbd class="key">D</kbd></kbd></td><td>投稿を削除</td><td><b>D</b>elete</tr>
+ <tr><td><kbd class="key">M</kbd>, <kbd class="key">O</kbd></td><td>投稿に対するメニューを開く</td><td><b>M</b>ore, <b>O</b>ther</td></tr>
+ <tr><td><kbd class="key">S</kbd></td><td>CWで隠された部分を表示 or 隠す</td><td><b>S</b>how, <b>S</b>ee</td></tr>
+ <tr><td><kbd class="key">Esc</kbd></td><td>フォーカスを外す</td><td>-</td></tr>
+ </tbody>
+</table>
+
+## Renoteフォーム
+
+<table>
+ <thead>
+ <tr><th>ショートカット</th><th>効果</th><th>由来</th></tr>
+ </thead>
+ <tbody>
+ <tr><td><kbd class="key">Enter</kbd></td><td>Renoteする</td><td>-</td></tr>
+ <tr><td><kbd class="key">Q</kbd></td><td>フォームを展開する</td><td><b>Q</b>uote</td></tr>
+ <tr><td><kbd class="key">Esc</kbd></td><td>フォームを閉じる</td><td>-</td></tr>
+ </tbody>
+</table>
+
+## リアクションフォーム
+デフォルトで「👍」にフォーカスが当たっている状態です。
+<table>
+ <thead>
+ <tr><th>ショートカット</th><th>効果</th><th>由来</th></tr>
+ </thead>
+ <tbody>
+ <tr><td><kbd class="key">↑</kbd>, <kbd class="key">K</kbd></td><td>上のリアクションにフォーカスを移動</td><td>-</td></tr>
+ <tr><td><kbd class="key">↓</kbd>, <kbd class="key">J</kbd></td><td>下のリアクションにフォーカスを移動</td><td>-</td></tr>
+ <tr><td><kbd class="key">←</kbd>, <kbd class="key">H</kbd>, <kbd class="group"><kbd class="key">Shift</kbd> + <kbd class="key">Tab</kbd></kbd></td><td>左のリアクションにフォーカスを移動</td><td>-</td></tr>
+ <tr><td><kbd class="key">→</kbd>, <kbd class="key">L</kbd>, <kbd class="key">Tab</kbd></td><td>右のリアクションにフォーカスを移動</td><td>-</td></tr>
+ <tr><td><kbd class="key">Enter</kbd>, <kbd class="key">Space</kbd>, <kbd class="key">+</kbd></td><td>リアクション確定</td><td>-</td></tr>
+ <tr><td><kbd class="key">0</kbd>~<kbd class="key">9</kbd></td><td>数字に対応したリアクションで確定</td><td>-</td></tr>
+ <tr><td><kbd class="key">Esc</kbd></td><td>リアクションするのをやめる</td><td>-</td></tr>
+ </tbody>
+</table>
diff --git a/src/docs/ar-SA/mfm.md b/src/docs/ar-SA/mfm.md
new file mode 100644
index 0000000000..e237287acc
--- /dev/null
+++ b/src/docs/ar-SA/mfm.md
@@ -0,0 +1,2 @@
+# MFM
+MFMは、Misskey Flavored Markdownの略で、Misskeyの様々な場所で使用できる専用のマークアップ言語です。 MFMで使用可能な構文は[MFMチートシート](/mfm-cheat-sheet)で確認できます。
diff --git a/src/docs/ar-SA/mute.md b/src/docs/ar-SA/mute.md
new file mode 100644
index 0000000000..c04ebcfd72
--- /dev/null
+++ b/src/docs/ar-SA/mute.md
@@ -0,0 +1,13 @@
+# اكتم
+
+ユーザーをミュートすると、そのユーザーに関する次のコンテンツがMisskeyに表示されなくなります:
+
+* タイムラインや投稿の検索結果内の、そのユーザーの投稿(およびそれらの投稿に対する返信やRenote)
+* そのユーザーからの通知
+* メッセージ履歴一覧内の、そのユーザーとのメッセージ履歴
+
+ユーザーをミュートするには、対象のユーザーのユーザーページに表示されている「ミュート」ボタンを押します。
+
+ミュートを行ったことは相手に通知されず、ミュートされていることを知ることもできません。
+
+設定>ミュート から、自分がミュートしているユーザー一覧を確認することができます。
diff --git a/src/docs/ar-SA/pages.md b/src/docs/ar-SA/pages.md
new file mode 100644
index 0000000000..a7311b95e6
--- /dev/null
+++ b/src/docs/ar-SA/pages.md
@@ -0,0 +1,10 @@
+# Pages
+
+## 変数
+変数を使うことで動的なページを作成できます。テキスト内で <b>{ 変数名 }</b> と書くとそこに変数の値を埋め込めます。例えば <b>Hello { thing } world!</b> というテキストで、変数(thing)の値が <b>ai</b> だった場合、テキストは <b>Hello ai world!</b> になります。
+
+変数の評価(値を算出すること)は上から下に行われるので、ある変数の中で自分より下の変数を参照することはできません。例えば上から <b>A、B、C</b> と3つの変数を定義したとき、<b>C</b>の中で<b>A</b>や<b>B</b>を参照することはできますが、<b>A</b>の中で<b>B</b>や<b>C</b>を参照することはできません。
+
+ユーザーからの入力を受け取るには、ページに「ユーザー入力」ブロックを設置し、「変数名」に入力を格納したい変数名を設定します(変数は自動で作成されます)。その変数を使ってユーザー入力に応じた動作を行えます。
+
+関数を使うと、値の算出処理を再利用可能な形にまとめることができます。関数を作るには、「関数」タイプの変数を作成します。関数にはスロット(引数)を設定することができ、スロットの値は関数内で変数として利用可能です。また、関数を引数に取る関数(高階関数と呼ばれます)も存在します。関数は予め定義しておくほかに、このような高階関数のスロットに即席でセットすることもできます。
diff --git a/src/docs/ar-SA/reaction.md b/src/docs/ar-SA/reaction.md
new file mode 100644
index 0000000000..bd096799ec
--- /dev/null
+++ b/src/docs/ar-SA/reaction.md
@@ -0,0 +1,11 @@
+# تفاعل
+他の人のノートに、絵文字を付けて簡単にあなたの反応を伝えられる機能です。 リアクションするには、ノートの + アイコンをクリックしてピッカーを表示し、絵文字を選択します。 リアクションには[カスタム絵文字](./custom-emoji)も使用できます。
+
+## リアクションピッカーのカスタマイズ
+ピッカーに表示される絵文字を自分好みにカスタマイズすることができます。 設定の「リアクション」で設定します。
+
+## リモート投稿へのリアクションについて
+リアクションはMisskeyオリジナルの機能であるため、リモートインスタンスがMisskeyでない限りは、ほとんどの場合「Like」としてアクティビティが送信されます。一般的にはLikeは「お気に入り」として実装されているようです。 また、相手がMisskeyであったとしても、カスタム絵文字リアクションは伝わらず、自動的に「👍」等にフォールバックされます。
+
+## リモートからのリアクションについて
+リモートから「Like」アクティビティを受信したとき、Misskeyでは「👍」のリアクションとして解釈されます。
diff --git a/src/docs/ar-SA/reversi-bot.md b/src/docs/ar-SA/reversi-bot.md
new file mode 100644
index 0000000000..7ab2a7212e
--- /dev/null
+++ b/src/docs/ar-SA/reversi-bot.md
@@ -0,0 +1,160 @@
+# MisskeyリバーシBotの開発
+Misskeyのリバーシ機能に対応したBotの開発方法をここに記します。
+
+1. `games/reversi`ストリームに以下のパラメータを付けて接続する:
+ * `i`: botアカウントのAPIキー
+
+2. 対局への招待が来たら、ストリームから`invited`イベントが流れてくる
+ * イベントの中身に、`parent`という名前で対局へ誘ってきたユーザーの情報が含まれている
+
+3. `games/reversi/match`へ、`user_id`として`parent`の`id`が含まれたリクエストを送信する
+
+4. 上手くいくとゲーム情報が返ってくるので、`games/reversi-game`ストリームへ、以下のパラメータを付けて接続する:
+ * `i`: botアカウントのAPIキー
+ * `game`: `game`の`id`
+
+5. この間、相手がゲームの設定を変更するとその都度`update-settings`イベントが流れてくるので、必要であれば何かしらの処理を行う
+
+6. 設定に満足したら、`{ type: 'accept' }`メッセージをストリームに送信する
+
+7. ゲームが開始すると、`started`イベントが流れてくる
+ * イベントの中身にはゲーム情報が含まれている
+
+8. 石を打つには、ストリームに`{ type: 'set', pos: <位置> }`を送信する(位置の計算方法は後述)
+
+9. 相手または自分が石を打つと、ストリームから`set`イベントが流れてくる
+ * `color`として石の色が含まれている
+ * `pos`として位置情報が含まれている
+
+## 位置の計算法
+8x8のマップを考える場合、各マスの位置(インデックスと呼びます)は次のようになっています:
+```
++--+--+--+--+--+--+--+--+
+| 0| 1| 2| 3| 4| 5| 6| 7|
++--+--+--+--+--+--+--+--+
+| 8| 9|10|11|12|13|14|15|
++--+--+--+--+--+--+--+--+
+|16|17|18|19|20|21|22|23|
+...
+```
+
+### X,Y座標 から インデックス に変換する
+```
+pos = x + (y * mapWidth)
+```
+`mapWidth`は、ゲーム情報の`map`から、次のようにして計算できます:
+```
+mapWidth = map[0].length
+```
+
+### インデックス から X,Y座標 に変換する
+```
+x = pos % mapWidth
+y = Math.floor(pos / mapWidth)
+```
+
+## マップ情報
+マップ情報は、ゲーム情報の`map`に入っています。 文字列の配列になっており、ひとつひとつの文字がマス情報を表しています。 それをもとにマップのデザインを知る事が出来ます:
+* `(スペース)` ... マス無し
+* `-` ... マス
+* `b` ... 初期配置される黒石
+* `w` ... 初期配置される白石
+
+例えば、4*4の次のような単純なマップがあるとします:
+```text
++---+---+---+---+
+| | | | |
++---+---+---+---+
+| | ○ | ● | |
++---+---+---+---+
+| | ● | ○ | |
++---+---+---+---+
+| | | | |
++---+---+---+---+
+```
+
+この場合、マップデータはこのようになります:
+```javascript
+['----', '-wb-', '-bw-', '----']
+```
+
+## ユーザーにフォームを提示して対話可能Botを作成する
+ユーザーとのコミュニケーションを行うため、ゲームの設定画面でユーザーにフォームを提示することができます。 例えば、Botの強さをユーザーが設定できるようにする、といったシナリオが考えられます。
+
+フォームを提示するには、`reversi-game`ストリームに次のメッセージを送信します:
+```javascript
+{
+ type: 'init-form',
+ body: [フォームコントロールの配列]
+}
+```
+
+フォームコントロールの配列については今から説明します。 フォームコントロールは、次のようなオブジェクトです:
+```javascript
+{
+ id: 'switch1',
+ type: 'switch',
+ label: 'Enable hoge',
+ value: false
+}
+```
+`id` ... コントロールのID。 `type` ... コントロールの種類。後述します。 `label` ... コントロールと一緒に表記するテキスト。 `value` ... コントロールのデフォルト値。
+
+### フォームの操作を受け取る
+ユーザーがフォームを操作すると、ストリームから`update-form`イベントが流れてきます。 イベントの中身には、コントロールのIDと、ユーザーが設定した値が含まれています。 例えば、上で示したスイッチをユーザーがオンにしたとすると、次のイベントが流れてきます:
+```javascript
+{
+ id: 'switch1',
+ value: true
+}
+```
+
+### フォームコントロールの種類
+#### スイッチ
+type: `switch` スイッチを表示します。何かの機能をオン/オフさせたい場合に有用です。
+
+##### プロパティ
+`label` ... スイッチに表記するテキスト。
+
+#### ラジオボタン
+type: `radio` ラジオボタンを表示します。選択肢を提示するのに有用です。例えば、Botの強さを設定させるなどです。
+
+##### プロパティ
+`items` ... ラジオボタンの選択肢。例:
+```javascript
+items: [{
+ label: '弱',
+ value: 1
+}, {
+ label: '中',
+ value: 2
+}, {
+ label: '強',
+ value: 3
+}]
+```
+
+#### スライダー
+type: `slider` スライダーを表示します。
+
+##### プロパティ
+`min` ... スライダーの下限。 `max` ... スライダーの上限。 `step` ... 入力欄で刻むステップ値。
+
+#### テキストボックス
+type: `textbox` テキストボックスを表示します。ユーザーになにか入力させる一般的な用途に利用できます。
+
+## ユーザーにメッセージを表示する
+設定画面でユーザーと対話する、フォーム以外のもうひとつの方法がこれです。ユーザーになにかメッセージを表示することができます。 例えば、ユーザーがBotの対応していないモードやマップを選択したとき、警告を表示するなどです。 メッセージを表示するには、次のメッセージをストリームに送信します:
+```javascript
+{
+ type: 'message',
+ body: {
+ text: 'メッセージ内容',
+ type: 'メッセージの種類'
+ }
+}
+```
+メッセージの種類: `success`, `info`, `warning`, `error`。
+
+## 投了する
+投了をするには、<a href="./api/endpoints/games/reversi/games/surrender">このエンドポイント</a>にリクエストします。
diff --git a/src/docs/ar-SA/stream.md b/src/docs/ar-SA/stream.md
new file mode 100644
index 0000000000..9011c37c5b
--- /dev/null
+++ b/src/docs/ar-SA/stream.md
@@ -0,0 +1,354 @@
+# ストリーミングAPI
+
+ストリーミングAPIを使うと、リアルタイムで様々な情報(例えばタイムラインに新しい投稿が流れてきた、メッセージが届いた、フォローされた、など)を受け取ったり、様々な操作を行ったりすることができます。
+
+## ストリームに接続する
+
+ストリーミングAPIを利用するには、まずMisskeyサーバーに**websocket**接続する必要があります。
+
+以下のURLに、`i`というパラメータ名で認証情報を含めて、websocket接続してください。例:
+```
+%WS_URL%/streaming?i=xxxxxxxxxxxxxxx
+```
+
+認証情報は、自分のAPIキーや、アプリケーションからストリームに接続する際はユーザーのアクセストークンのことを指します。
+
+<div class="ui info">
+ <p><i class="fas fa-info-circle"></i> 認証情報の取得については、<a href="./api">こちらのドキュメント</a>をご確認ください。</p>
+</div>
+
+---
+
+認証情報は省略することもできますが、その場合非ログインでの利用ということになり、受信できる情報や可能な操作は限られます。例:
+
+```
+%WS_URL%/streaming
+```
+
+---
+
+ストリームに接続すると、後述するAPI操作や、投稿の購読を行ったりすることができます。 しかしまだこの段階では、例えばタイムラインへの新しい投稿を受信したりすることはできません。 それを行うには、ストリーム上で、後述する**チャンネル**に接続する必要があります。
+
+**ストリームでのやり取りはすべてJSONです。**
+
+## チャンネル
+MisskeyのストリーミングAPIにはチャンネルという概念があります。これは、送受信する情報を分離するための仕組みです。 Misskeyのストリームに接続しただけでは、まだリアルタイムでタイムラインの投稿を受信したりはできません。 ストリーム上でチャンネルに接続することで、様々な情報を受け取ったり情報を送信したりすることができるようになります。
+
+### チャンネルに接続する
+チャンネルに接続するには、次のようなデータをJSONでストリームに送信します:
+
+```json
+{
+ type: 'connect',
+ body: {
+ channel: 'xxxxxxxx',
+ id: 'foobar',
+ params: {
+ ...
+ }
+ }
+}
+```
+
+ここで、
+* `channel`には接続したいチャンネル名を設定します。チャンネルの種類については後述します。
+* `id`にはそのチャンネルとやり取りするための任意のIDを設定します。ストリームでは様々なメッセージが流れるので、そのメッセージがどのチャンネルからのものなのか識別する必要があるからです。このIDは、UUIDや、乱数のようなもので構いません。
+* `params`はチャンネルに接続する際のパラメータです。チャンネルによって接続時に必要とされるパラメータは異なります。パラメータ不要のチャンネルに接続する際は、このプロパティは省略可能です。
+
+<div class="ui info">
+ <p><i class="fas fa-info-circle"></i> IDはチャンネルごとではなく「チャンネルの接続ごと」です。なぜなら、同じチャンネルに異なるパラメータで複数接続するケースもあるからです。</p>
+</div>
+
+### チャンネルからのメッセージを受け取る
+例えばタイムラインのチャンネルなら、新しい投稿があった時にメッセージを発します。そのメッセージを受け取ることで、タイムラインに新しい投稿がされたことをリアルタイムで知ることができます。
+
+チャンネルがメッセージを発すると、次のようなデータがJSONでストリームに流れてきます:
+```json
+{
+ type: 'channel',
+ body: {
+ id: 'foobar',
+ type: 'something',
+ body: {
+ some: 'thing'
+ }
+ }
+}
+```
+
+ここで、
+* `id`には前述したそのチャンネルに接続する際に設定したIDが設定されています。これで、このメッセージがどのチャンネルからのものなのか知ることができます。
+* `type`にはメッセージの種類が設定されます。チャンネルによって、どのような種類のメッセージが流れてくるかは異なります。
+* `body`にはメッセージの内容が設定されます。チャンネルによって、どのような内容のメッセージが流れてくるかは異なります。
+
+### チャンネルに向けてメッセージを送信する
+チャンネルによっては、メッセージを受け取るだけでなく、こちらから何かメッセージを送信し、何らかの操作を行える場合があります。
+
+チャンネルにメッセージを送信するには、次のようなデータをJSONでストリームに送信します:
+```json
+{
+ type: 'channel',
+ body: {
+ id: 'foobar',
+ type: 'something',
+ body: {
+ some: 'thing'
+ }
+ }
+}
+```
+
+ここで、
+* `id`には前述したそのチャンネルに接続する際に設定したIDを設定します。これで、このメッセージがどのチャンネルに向けたものなのか識別させることができます。
+* `type`にはメッセージの種類を設定します。チャンネルによって、どのような種類のメッセージを受け付けるかは異なります。
+* `body`にはメッセージの内容を設定します。チャンネルによって、どのような内容のメッセージを受け付けるかは異なります。
+
+### チャンネルから切断する
+チャンネルから切断するには、次のようなデータをJSONでストリームに送信します:
+
+```json
+{
+ type: 'disconnect',
+ body: {
+ id: 'foobar'
+ }
+}
+```
+
+ここで、
+* `id`には前述したそのチャンネルに接続する際に設定したIDを設定します。
+
+## ストリームを経由してAPIリクエストする
+
+ストリームを経由してAPIリクエストすると、HTTPリクエストを発生させずにAPIを利用できます。そのため、コードを簡潔にできたり、パフォーマンスの向上を見込めるかもしれません。
+
+ストリームを経由してAPIリクエストするには、次のようなデータをJSONでストリームに送信します:
+```json
+{
+ type: 'api',
+ body: {
+ id: 'xxxxxxxxxxxxxxxx',
+ endpoint: 'notes/create',
+ data: {
+ text: 'yee haw!'
+ }
+ }
+}
+```
+
+ここで、
+* `id`には、APIのレスポンスを識別するための、APIリクエストごとの一意なIDを設定する必要があります。UUIDや、簡単な乱数のようなもので構いません。
+* `endpoint`には、あなたがリクエストしたいAPIのエンドポイントを指定します。
+* `data`には、エンドポイントのパラメータを含めます。
+
+<div class="ui info">
+ <p><i class="fas fa-info-circle"></i> APIのエンドポイントやパラメータについてはAPIリファレンスをご確認ください。</p>
+</div>
+
+### レスポンスの受信
+
+APIへリクエストすると、レスポンスがストリームから次のような形式で流れてきます。
+
+```json
+{
+ type: 'api:xxxxxxxxxxxxxxxx',
+ body: {
+ ...
+ }
+}
+```
+
+ここで、
+* `xxxxxxxxxxxxxxxx`の部分には、リクエストの際に設定された`id`が含まれています。これにより、どのリクエストに対するレスポンスなのか判別することができます。
+* `body`には、レスポンスが含まれています。
+
+## 投稿のキャプチャ
+
+Misskeyは投稿のキャプチャと呼ばれる仕組みを提供しています。これは、指定した投稿のイベントをストリームで受け取る機能です。
+
+例えばタイムラインを取得してユーザーに表示したとします。ここで誰かがそのタイムラインに含まれるどれかの投稿に対してリアクションしたとします。
+
+しかし、クライアントからするとある投稿にリアクションが付いたことなどは知る由がないため、リアルタイムでリアクションをタイムライン上の投稿に反映して表示するといったことができません。
+
+この問題を解決するために、Misskeyは投稿のキャプチャ機構を用意しています。投稿をキャプチャすると、その投稿に関するイベントを受け取ることができるため、リアルタイムでリアクションを反映させたりすることが可能になります。
+
+### 投稿をキャプチャする
+
+投稿をキャプチャするには、ストリームに次のようなメッセージを送信します:
+
+```json
+{
+ type: 'subNote',
+ body: {
+ id: 'xxxxxxxxxxxxxxxx'
+ }
+}
+```
+
+ここで、
+* `id`にキャプチャしたい投稿の`id`を設定します。
+
+このメッセージを送信すると、Misskeyにキャプチャを要請したことになり、以後、その投稿に関するイベントが流れてくるようになります。
+
+例えば投稿にリアクションが付いたとすると、次のようなメッセージが流れてきます:
+
+```json
+{
+ type: 'noteUpdated',
+ body: {
+ id: 'xxxxxxxxxxxxxxxx',
+ type: 'reacted',
+ body: {
+ reaction: 'like',
+ userId: 'yyyyyyyyyyyyyyyy'
+ }
+ }
+}
+```
+
+ここで、
+* `body`内の`id`に、イベントを発生させた投稿のIDが設定されます。
+* `body`内の`type`に、イベントの種類が設定されます。
+* `body`内の`body`に、イベントの詳細が設定されます。
+
+#### イベントの種類
+
+##### `reacted`
+その投稿にリアクションがされた時に発生します。
+
+* `reaction`に、リアクションの種類が設定されます。
+* `userId`に、リアクションを行ったユーザーのIDが設定されます。
+
+例:
+```json
+{
+ type: 'noteUpdated',
+ body: {
+ id: 'xxxxxxxxxxxxxxxx',
+ type: 'reacted',
+ body: {
+ reaction: 'like',
+ userId: 'yyyyyyyyyyyyyyyy'
+ }
+ }
+}
+```
+
+##### `deleted`
+その投稿が削除された時に発生します。
+
+* `deletedAt`に、削除日時が設定されます。
+
+例:
+```json
+{
+ type: 'noteUpdated',
+ body: {
+ id: 'xxxxxxxxxxxxxxxx',
+ type: 'deleted',
+ body: {
+ deletedAt: '2018-10-22T02:17:09.703Z'
+ }
+ }
+}
+```
+
+##### `pollVoted`
+その投稿に添付されたアンケートに投票された時に発生します。
+
+* `choice`に、選択肢IDが設定されます。
+* `userId`に、投票を行ったユーザーのIDが設定されます。
+
+例:
+```json
+{
+ type: 'noteUpdated',
+ body: {
+ id: 'xxxxxxxxxxxxxxxx',
+ type: 'pollVoted',
+ body: {
+ choice: 2,
+ userId: 'yyyyyyyyyyyyyyyy'
+ }
+ }
+}
+```
+
+### 投稿のキャプチャを解除する
+
+その投稿がもう画面に表示されなくなったりして、その投稿に関するイベントをもう受け取る必要がなくなったときは、キャプチャの解除を申請してください。
+
+次のメッセージを送信します:
+
+```json
+{
+ type: 'unsubNote',
+ body: {
+ id: 'xxxxxxxxxxxxxxxx'
+ }
+}
+```
+
+ここで、
+* `id`にキャプチャを解除したい投稿の`id`を設定します。
+
+このメッセージを送信すると、以後、その投稿に関するイベントは流れてこないようになります。
+
+# チャンネル一覧
+## `main`
+アカウントに関する基本的な情報が流れてきます。このチャンネルにパラメータはありません。
+
+### 流れてくるイベント一覧
+
+#### `renote`
+自分の投稿がRenoteされた時に発生するイベントです。自分自身の投稿をRenoteしたときは発生しません。
+
+#### `mention`
+誰かからメンションされたときに発生するイベントです。
+
+#### `readAllNotifications`
+自分宛ての通知がすべて既読になったことを表すイベントです。このイベントを利用して、「通知があることを示すアイコン」のようなものをオフにしたりする等のケースが想定されます。
+
+#### `meUpdated`
+自分の情報が更新されたことを表すイベントです。
+
+#### `follow`
+自分が誰かをフォローしたときに発生するイベントです。
+
+#### `unfollow`
+自分が誰かのフォローを解除したときに発生するイベントです。
+
+#### `followed`
+自分が誰かにフォローされたときに発生するイベントです。
+
+## `homeTimeline`
+ホームタイムラインの投稿情報が流れてきます。このチャンネルにパラメータはありません。
+
+### 流れてくるイベント一覧
+
+#### `note`
+タイムラインに新しい投稿が流れてきたときに発生するイベントです。
+
+## `localTimeline`
+ローカルタイムラインの投稿情報が流れてきます。このチャンネルにパラメータはありません。
+
+### 流れてくるイベント一覧
+
+#### `note`
+ローカルタイムラインに新しい投稿が流れてきたときに発生するイベントです。
+
+## `hybridTimeline`
+ソーシャルタイムラインの投稿情報が流れてきます。このチャンネルにパラメータはありません。
+
+### 流れてくるイベント一覧
+
+#### `note`
+ソーシャルタイムラインに新しい投稿が流れてきたときに発生するイベントです。
+
+## `globalTimeline`
+グローバルタイムラインの投稿情報が流れてきます。このチャンネルにパラメータはありません。
+
+### 流れてくるイベント一覧
+
+#### `note`
+グローバルタイムラインに新しい投稿が流れてきたときに発生するイベントです。
diff --git a/src/docs/ar-SA/theme.md b/src/docs/ar-SA/theme.md
new file mode 100644
index 0000000000..8e24a1cbc7
--- /dev/null
+++ b/src/docs/ar-SA/theme.md
@@ -0,0 +1,68 @@
+# المظهر
+
+テーマを設定して、Misskeyクライアントの見た目を変更できます。
+
+## テーマの設定
+設定 > テーマ
+
+## テーマを作成する
+テーマコードはJSON5で記述されたテーマオブジェクトです。 テーマは以下のようなオブジェクトです。
+``` js
+{
+ id: '17587283-dd92-4a2c-a22c-be0637c9e22a',
+
+ name: 'Danboard',
+ author: 'syuilo',
+
+ base: 'light',
+
+ props: {
+ accent: 'rgb(218, 141, 49)',
+ bg: 'rgb(218, 212, 190)',
+ fg: 'rgb(115, 108, 92)',
+ panel: 'rgb(236, 232, 220)',
+ renote: 'rgb(100, 152, 106)',
+ link: 'rgb(100, 152, 106)',
+ mention: '@accent',
+ hashtag: 'rgb(100, 152, 106)',
+ header: 'rgba(239, 227, 213, 0.75)',
+ navBg: 'rgb(216, 206, 182)',
+ inputBorder: 'rgba(0, 0, 0, 0.1)',
+ },
+}
+
+```
+
+* `id` ... テーマの一意なID。UUIDをおすすめします。
+* `name` ... テーマ名
+* `author` ... テーマの作者
+* `desc` ... テーマの説明(オプション)
+* `base` ... 明るいテーマか、暗いテーマか
+ * `light`にすると明るいテーマになり、`dark`にすると暗いテーマになります。
+ * テーマはここで設定されたベーステーマを継承します。
+* `props` ... テーマのスタイル定義。これから説明します。
+
+### テーマのスタイル定義
+`props`下にはテーマのスタイルを定義します。 キーがCSSの変数名になり、バリューで中身を指定します。 なお、この`props`オブジェクトはベーステーマから継承されます。 ベーステーマは、このテーマの`base`が`light`なら[_light.json5](https://github.com/syuilo/misskey/blob/develop/src/client/themes/_light.json5)で、`dark`なら[_dark.json5](https://github.com/syuilo/misskey/blob/develop/src/client/themes/_dark.json5)です。 つまり、このテーマ内の`props`に`panel`というキーが無くても、そこにはベーステーマの`panel`があると見なされます。
+
+#### バリューで使える構文
+* 16進数で表された色
+ * 例: `#00ff00`
+* `rgb(r, g, b)`形式で表された色
+ * 例: `rgb(0, 255, 0)`
+* `rgb(r, g, b, a)`形式で表された透明度を含む色
+ * 例: `rgba(0, 255, 0, 0.5)`
+* 他のキーの値の参照
+ * `@{キー名}`と書くと他のキーの値の参照になります。`{キー名}`は参照したいキーの名前に置き換えます。
+ * 例: `@panel`
+* 定数(後述)の参照
+ * `${定数名}`と書くと定数の参照になります。`{定数名}`は参照したい定数の名前に置き換えます。
+ * 例: `$main`
+* 関数(後述)
+ * `:{関数名}<{引数}<{色}`
+
+#### 定数
+「CSS変数として出力はしたくないが、他のCSS変数の値として使いまわしたい」値があるときは、定数を使うと便利です。 キー名を`$`で始めると、そのキーはCSS変数として出力されません。
+
+#### 関数
+wip
diff --git a/src/docs/ar-SA/timelines.md b/src/docs/ar-SA/timelines.md
new file mode 100644
index 0000000000..21ebf4cf92
--- /dev/null
+++ b/src/docs/ar-SA/timelines.md
@@ -0,0 +1,15 @@
+# タイムラインの比較
+
+https://docs.google.com/spreadsheets/d/1lxQ2ugKrhz58Bg96HTDK_2F98BUritkMyIiBkOByjHA/edit?usp=sharing
+
+## الرئيسي
+自分のフォローしているユーザーの投稿
+
+## المحلي
+全てのローカルユーザーの「ホーム」指定されていない投稿
+
+## الاجتماعي
+自分のフォローしているユーザーの投稿と、全てのローカルユーザーの「ホーム」指定されていない投稿
+
+## الشامل
+全てのローカルユーザーの「ホーム」指定されていない投稿と、サーバーに届いた全てのリモートユーザーの「ホーム」指定されていない投稿
diff --git a/src/docs/cs-CZ/aiscript.md b/src/docs/cs-CZ/aiscript.md
new file mode 100644
index 0000000000..6c28b446e3
--- /dev/null
+++ b/src/docs/cs-CZ/aiscript.md
@@ -0,0 +1,4 @@
+# AiScript
+
+## 関数
+デフォルトで値渡しです。
diff --git a/src/docs/cs-CZ/api.md b/src/docs/cs-CZ/api.md
new file mode 100644
index 0000000000..76019b6145
--- /dev/null
+++ b/src/docs/cs-CZ/api.md
@@ -0,0 +1,58 @@
+# Misskey API
+
+MisskeyAPIを使ってMisskeyクライアント、Misskey連携Webサービス、Bot等(以下「アプリケーション」と呼びます)を開発できます。 ストリーミングAPIもあるので、リアルタイム性のあるアプリケーションを作ることも可能です。
+
+APIを使い始めるには、まずアクセストークンを取得する必要があります。 このドキュメントでは、アクセストークンを取得する手順を説明した後、基本的なAPIの使い方を説明します。
+
+## アクセストークンの取得
+基本的に、APIはリクエストにはアクセストークンが必要となります。 APIにリクエストするのが自分自身なのか、不特定の利用者に使ってもらうアプリケーションなのかによって取得手順は異なります。
+
+* 前者の場合: [「自分自身のアクセストークンを手動発行する」](#自分自身のアクセストークンを手動発行する)に進む
+* 後者の場合: [「アプリケーション利用者にアクセストークンの発行をリクエストする」](#アプリケーション利用者にアクセストークンの発行をリクエストする)に進む
+
+### 自分自身のアクセストークンを手動発行する
+「設定 > API」で、自分のアクセストークンを発行できます。
+
+[「APIの使い方」へ進む](#APIの使い方)
+
+### アプリケーション利用者にアクセストークンの発行をリクエストする
+アプリケーション利用者のアクセストークンを取得するには、以下の手順で発行をリクエストします。
+
+#### Step 1
+
+UUIDを生成する。以後これをセッションIDと呼びます。
+
+> このセッションIDは毎回生成し、使いまわさないようにしてください。
+
+#### Step 2
+
+`{_URL_}/miauth/{session}`をユーザーのブラウザで表示させる。`{session}`の部分は、セッションIDに置き換えてください。
+> 例: `{_URL_}/miauth/c1f6d42b-468b-4fd2-8274-e58abdedef6f`
+
+表示する際、URLにクエリパラメータとしていくつかのオプションを設定できます:
+* `name` ... アプリケーション名
+ * > 例: `MissDeck`
+* `icon` ... アプリケーションのアイコン画像URL
+ * > 例: `https://missdeck.example.com/icon.png`
+* `callback` ... 認証が終わった後にリダイレクトするURL
+ * > 例: `https://missdeck.example.com/callback`
+ * リダイレクト時には、`session`というクエリパラメータでセッションIDが付きます
+* `permission` ... アプリケーションが要求する権限
+ * > 例: `write:notes,write:following,read:drive`
+ * 要求する権限を`,`で区切って列挙します
+ * どのような権限があるかは[APIリファレンス](/api-doc)で確認できます
+
+#### Step 3
+ユーザーが発行を許可した後、`{_URL_}/api/miauth/{session}/check`にPOSTリクエストすると、レスポンスとしてアクセストークンを含むJSONが返ります。
+
+レスポンスに含まれるプロパティ:
+* `token` ... ユーザーのアクセストークン
+* `user` ... ユーザーの情報
+
+[「APIの使い方」へ進む](#APIの使い方)
+
+## APIの使い方
+**APIはすべてPOSTで、リクエスト/レスポンスともにJSON形式です。RESTではありません。** アクセストークンは、`i`というパラメータ名でリクエストに含めます。
+
+* [APIリファレンス](/api-doc)
+* [ストリーミングAPI](./stream)
diff --git a/src/docs/cs-CZ/create-plugin.md b/src/docs/cs-CZ/create-plugin.md
new file mode 100644
index 0000000000..0d2fa19178
--- /dev/null
+++ b/src/docs/cs-CZ/create-plugin.md
@@ -0,0 +1,74 @@
+# プラグインの作成
+Misskey Webクライアントのプラグイン機能を使うと、クライアントを拡張し、様々な機能を追加できます。 ここではプラグインの作成にあたってのメタデータ定義や、AiScript APIリファレンスを掲載します。
+
+## メタデータ
+プラグインは、AiScriptのメタデータ埋め込み機能を使って、デフォルトとしてプラグインのメタデータを定義する必要があります。 メタデータは次のプロパティを含むオブジェクトです。
+
+### name
+プラグイン名
+
+### author
+プラグイン作者
+
+### version
+プラグインバージョン。数値を指定してください。
+
+### description
+プラグインの説明
+
+### permissions
+プラグインが要求する権限。MisskeyAPIにリクエストする際に用いられます。
+
+### config
+プラグインの設定情報を表すオブジェクト。 キーに設定名、値に以下のプロパティを含めます。
+
+#### type
+設定値の種類を表す文字列。以下から選択します。 string number boolean
+
+#### label
+ユーザーに表示する設定名
+
+#### description
+設定の説明
+
+#### default
+設定のデフォルト値
+
+## APIリファレンス
+AiScript標準で組み込まれているAPIは掲載しません。
+
+### Mk:dialog(title text type)
+ダイアログを表示します。typeには以下の値が設定できます。 info success warn error question 省略すると info になります。
+
+### Mk:confirm(title text type)
+確認ダイアログを表示します。typeには以下の値が設定できます。 info success warn error question 省略すると question になります。 ユーザーが"OK"を選択した場合は true を、"キャンセル"を選択した場合は false が返ります。
+
+### Mk:api(endpoint params)
+Misskey APIにリクエストします。第一引数にエンドポイント名、第二引数にパラメータオブジェクトを渡します。
+
+### Mk:save(key value)
+任意の値に任意の名前を付けて永続化します。永続化した値は、AiScriptコンテキストが終了しても残り、Mk:loadで読み取ることができます。
+
+### Mk:load(key)
+Mk:saveで永続化した指定の名前の値を読み取ります。
+
+### Plugin:register_post_form_action(title fn)
+投稿フォームにアクションを追加します。第一引数にアクション名、第二引数にアクションが選択された際のコールバック関数を渡します。 コールバック関数には、第一引数に投稿フォームオブジェクトが渡されます。
+
+### Plugin:register_note_action(title fn)
+ノートメニューに項目を追加します。第一引数に項目名、第二引数に項目が選択された際のコールバック関数を渡します。 コールバック関数には、第一引数に対象のノートオブジェクトが渡されます。
+
+### Plugin:register_user_action(title fn)
+ユーザーメニューに項目を追加します。第一引数に項目名、第二引数に項目が選択された際のコールバック関数を渡します。 コールバック関数には、第一引数に対象のユーザーオブジェクトが渡されます。
+
+### Plugin:register_note_view_interruptor(fn)
+UIに表示されるノート情報を書き換えます。 コールバック関数には、第一引数に対象のノートオブジェクトが渡されます。 コールバック関数の返り値でノートが書き換えられます。
+
+### Plugin:register_note_post_interruptor(fn)
+ノート投稿時にノート情報を書き換えます。 コールバック関数には、第一引数に対象のノートオブジェクトが渡されます。 コールバック関数の返り値でノートが書き換えられます。
+
+### Plugin:open_url(url)
+第一引数に渡されたURLをブラウザの新しいタブで開きます。
+
+### Plugin:config
+プラグインの設定が格納されるオブジェクト。プラグイン定義のconfigで設定したキーで値が入ります。
diff --git a/src/docs/cs-CZ/custom-emoji.md b/src/docs/cs-CZ/custom-emoji.md
new file mode 100644
index 0000000000..ed2e92be16
--- /dev/null
+++ b/src/docs/cs-CZ/custom-emoji.md
@@ -0,0 +1,2 @@
+# カスタム絵文字
+カスタム絵文字は、インスタンスで用意された画像を絵文字のように使える機能です。 ノート、リアクション、チャット、自己紹介、名前などの場所で使うことができます。 カスタム絵文字をそれらの場所で使うには、絵文字ピッカーボタン(ある場合)を押すか、`:`を入力して絵文字サジェストを表示します。 テキスト内に`:foo:`のような形式の文字列が見つかると、`foo`の部分がカスタム絵文字名と解釈され、表示時には対応したカスタム絵文字に置き換わります。
diff --git a/src/docs/cs-CZ/deck.md b/src/docs/cs-CZ/deck.md
new file mode 100644
index 0000000000..8057e262fd
--- /dev/null
+++ b/src/docs/cs-CZ/deck.md
@@ -0,0 +1,18 @@
+# デッキ
+
+デッキは利用可能なUIのひとつです。「カラム」と呼ばれるビューを複数並べて表示させることで、カスタマイズ性が高く、情報量の多いUIが構築できることが特徴です。
+
+## カラムの追加
+デッキの背景を右クリックし、「カラムを追加」して任意のカラムを追加できます。
+
+## カラムの移動
+カラムは、ドラッグアンドドロップで他のカラムと位置を入れ替えることが出来るほか、カラムメニュー(カラムのヘッダー右クリック)から位置を移動させることもできます。
+
+## カラムの水平分割
+カラムは左右だけでなく、上下に並べることもできます。 カラムメニューを開き、「左に重ねる」を選択すると、左のカラムの下に現在のカラムが移動します。 上下分割を解除するには、カラムメニューの「右に出す」を選択します。
+
+## カラムの設定
+カラムメニューの「編集」を選択するとカラムの設定を編集できます。カラムの名前を変えたり、幅を変えたりできます。
+
+## デッキの設定
+デッキに関する設定は、[settings/deck](/settings/deck)で行えます。
diff --git a/src/docs/cs-CZ/follow.md b/src/docs/cs-CZ/follow.md
new file mode 100644
index 0000000000..3c1ea7bbe0
--- /dev/null
+++ b/src/docs/cs-CZ/follow.md
@@ -0,0 +1,2 @@
+# フォロー
+ユーザーをフォローすると、タイムラインにそのユーザーの投稿が表示されるようになります。ただし、他のユーザーに対する返信は含まれません。 ユーザーをフォローするには、ユーザーページの「フォロー」ボタンをクリックします。フォローを解除するには、もう一度クリックします。
diff --git a/src/docs/cs-CZ/keyboard-shortcut.md b/src/docs/cs-CZ/keyboard-shortcut.md
new file mode 100644
index 0000000000..957ca838c9
--- /dev/null
+++ b/src/docs/cs-CZ/keyboard-shortcut.md
@@ -0,0 +1,68 @@
+# キーボードショートカット
+
+## グローバル
+これらのショートカットは基本的にどこでも使えます。
+<table>
+ <thead>
+ <tr><th>ショートカット</th><th>効果</th><th>由来</th></tr>
+ </thead>
+ <tbody>
+ <tr><td><kbd class="key">P</kbd>, <kbd class="key">N</kbd></td><td>新規投稿</td><td><b>P</b>ost, <b>N</b>ew, <b>N</b>ote</td></tr>
+ <tr><td><kbd class="key">T</kbd></td><td>タイムラインの最も新しい投稿にフォーカス</td><td><b>T</b>imeline, <b>T</b>op</td></tr>
+ <tr><td><kbd class="group"><kbd class="key">Shift</kbd> + <kbd class="key">N</kbd></kbd></td><td>通知を表示/隠す</td><td><b>N</b>otifications</td></tr>
+ <tr><td><kbd class="key">S</kbd></td><td>検索</td><td><b>S</b>earch</td></tr>
+ <tr><td><kbd class="key">H</kbd>, <kbd class="key">?</kbd></td><td>ヘルプを表示</td><td><b>H</b>elp</td></tr>
+ </tbody>
+</table>
+
+## 投稿にフォーカスされた状態
+
+<table>
+ <thead>
+ <tr><th>ショートカット</th><th>効果</th><th>由来</th></tr>
+ </thead>
+ <tbody>
+ <tr><td><kbd class="key">↑</kbd>, <kbd class="key">K</kbd>, <kbd class="group"><kbd class="key">Shift</kbd> + <kbd class="key">Tab</kbd></kbd></td><td>上の投稿にフォーカスを移動</td><td>-</td></tr>
+ <tr><td><kbd class="key">↓</kbd>, <kbd class="key">J</kbd>, <kbd class="key">Tab</kbd></td><td>下の投稿にフォーカスを移動</td><td>-</td></tr>
+ <tr><td><kbd class="key">R</kbd></td><td>返信フォームを開く</td><td><b>R</b>eply</td></tr>
+ <tr><td><kbd class="key">Q</kbd></td><td>Renoteフォームを開く</td><td><b>Q</b>uote</td></tr>
+ <tr><td><kbd class="group"><kbd class="key">Ctrl</kbd> + <kbd class="key">Q</kbd></kbd></td><td>即刻Renoteする(フォームを開かずに)</td><td>-</td></tr>
+ <tr><td><kbd class="key">E</kbd>, <kbd class="key">A</kbd>, <kbd class="key">+</kbd></td><td>リアクションフォームを開く</td><td><b>E</b>mote, re<b>A</b>ction</td></tr>
+ <tr><td><kbd class="key">0</kbd>~<kbd class="key">9</kbd></td><td>数字に対応したリアクションをする(対応については後述)</td><td>-</td></tr>
+ <tr><td><kbd class="key">F</kbd>, <kbd class="key">B</kbd></td><td>お気に入りに登録</td><td><b>F</b>avorite, <b>B</b>ookmark</td></tr>
+ <tr><td><kbd class="key">Del</kbd>, <kbd class="group"><kbd class="key">Ctrl</kbd> + <kbd class="key">D</kbd></kbd></td><td>投稿を削除</td><td><b>D</b>elete</tr>
+ <tr><td><kbd class="key">M</kbd>, <kbd class="key">O</kbd></td><td>投稿に対するメニューを開く</td><td><b>M</b>ore, <b>O</b>ther</td></tr>
+ <tr><td><kbd class="key">S</kbd></td><td>CWで隠された部分を表示 or 隠す</td><td><b>S</b>how, <b>S</b>ee</td></tr>
+ <tr><td><kbd class="key">Esc</kbd></td><td>フォーカスを外す</td><td>-</td></tr>
+ </tbody>
+</table>
+
+## Renoteフォーム
+
+<table>
+ <thead>
+ <tr><th>ショートカット</th><th>効果</th><th>由来</th></tr>
+ </thead>
+ <tbody>
+ <tr><td><kbd class="key">Enter</kbd></td><td>Renoteする</td><td>-</td></tr>
+ <tr><td><kbd class="key">Q</kbd></td><td>フォームを展開する</td><td><b>Q</b>uote</td></tr>
+ <tr><td><kbd class="key">Esc</kbd></td><td>フォームを閉じる</td><td>-</td></tr>
+ </tbody>
+</table>
+
+## リアクションフォーム
+デフォルトで「👍」にフォーカスが当たっている状態です。
+<table>
+ <thead>
+ <tr><th>ショートカット</th><th>効果</th><th>由来</th></tr>
+ </thead>
+ <tbody>
+ <tr><td><kbd class="key">↑</kbd>, <kbd class="key">K</kbd></td><td>上のリアクションにフォーカスを移動</td><td>-</td></tr>
+ <tr><td><kbd class="key">↓</kbd>, <kbd class="key">J</kbd></td><td>下のリアクションにフォーカスを移動</td><td>-</td></tr>
+ <tr><td><kbd class="key">←</kbd>, <kbd class="key">H</kbd>, <kbd class="group"><kbd class="key">Shift</kbd> + <kbd class="key">Tab</kbd></kbd></td><td>左のリアクションにフォーカスを移動</td><td>-</td></tr>
+ <tr><td><kbd class="key">→</kbd>, <kbd class="key">L</kbd>, <kbd class="key">Tab</kbd></td><td>右のリアクションにフォーカスを移動</td><td>-</td></tr>
+ <tr><td><kbd class="key">Enter</kbd>, <kbd class="key">Space</kbd>, <kbd class="key">+</kbd></td><td>リアクション確定</td><td>-</td></tr>
+ <tr><td><kbd class="key">0</kbd>~<kbd class="key">9</kbd></td><td>数字に対応したリアクションで確定</td><td>-</td></tr>
+ <tr><td><kbd class="key">Esc</kbd></td><td>リアクションするのをやめる</td><td>-</td></tr>
+ </tbody>
+</table>
diff --git a/src/docs/cs-CZ/mfm.md b/src/docs/cs-CZ/mfm.md
new file mode 100644
index 0000000000..e237287acc
--- /dev/null
+++ b/src/docs/cs-CZ/mfm.md
@@ -0,0 +1,2 @@
+# MFM
+MFMは、Misskey Flavored Markdownの略で、Misskeyの様々な場所で使用できる専用のマークアップ言語です。 MFMで使用可能な構文は[MFMチートシート](/mfm-cheat-sheet)で確認できます。
diff --git a/src/docs/cs-CZ/mute.md b/src/docs/cs-CZ/mute.md
new file mode 100644
index 0000000000..6a9608662a
--- /dev/null
+++ b/src/docs/cs-CZ/mute.md
@@ -0,0 +1,13 @@
+# ミュート
+
+ユーザーをミュートすると、そのユーザーに関する次のコンテンツがMisskeyに表示されなくなります:
+
+* タイムラインや投稿の検索結果内の、そのユーザーの投稿(およびそれらの投稿に対する返信やRenote)
+* そのユーザーからの通知
+* メッセージ履歴一覧内の、そのユーザーとのメッセージ履歴
+
+ユーザーをミュートするには、対象のユーザーのユーザーページに表示されている「ミュート」ボタンを押します。
+
+ミュートを行ったことは相手に通知されず、ミュートされていることを知ることもできません。
+
+設定>ミュート から、自分がミュートしているユーザー一覧を確認することができます。
diff --git a/src/docs/cs-CZ/pages.md b/src/docs/cs-CZ/pages.md
new file mode 100644
index 0000000000..a7311b95e6
--- /dev/null
+++ b/src/docs/cs-CZ/pages.md
@@ -0,0 +1,10 @@
+# Pages
+
+## 変数
+変数を使うことで動的なページを作成できます。テキスト内で <b>{ 変数名 }</b> と書くとそこに変数の値を埋め込めます。例えば <b>Hello { thing } world!</b> というテキストで、変数(thing)の値が <b>ai</b> だった場合、テキストは <b>Hello ai world!</b> になります。
+
+変数の評価(値を算出すること)は上から下に行われるので、ある変数の中で自分より下の変数を参照することはできません。例えば上から <b>A、B、C</b> と3つの変数を定義したとき、<b>C</b>の中で<b>A</b>や<b>B</b>を参照することはできますが、<b>A</b>の中で<b>B</b>や<b>C</b>を参照することはできません。
+
+ユーザーからの入力を受け取るには、ページに「ユーザー入力」ブロックを設置し、「変数名」に入力を格納したい変数名を設定します(変数は自動で作成されます)。その変数を使ってユーザー入力に応じた動作を行えます。
+
+関数を使うと、値の算出処理を再利用可能な形にまとめることができます。関数を作るには、「関数」タイプの変数を作成します。関数にはスロット(引数)を設定することができ、スロットの値は関数内で変数として利用可能です。また、関数を引数に取る関数(高階関数と呼ばれます)も存在します。関数は予め定義しておくほかに、このような高階関数のスロットに即席でセットすることもできます。
diff --git a/src/docs/cs-CZ/reaction.md b/src/docs/cs-CZ/reaction.md
new file mode 100644
index 0000000000..c26ead75b3
--- /dev/null
+++ b/src/docs/cs-CZ/reaction.md
@@ -0,0 +1,11 @@
+# リアクション
+他の人のノートに、絵文字を付けて簡単にあなたの反応を伝えられる機能です。 リアクションするには、ノートの + アイコンをクリックしてピッカーを表示し、絵文字を選択します。 リアクションには[カスタム絵文字](./custom-emoji)も使用できます。
+
+## リアクションピッカーのカスタマイズ
+ピッカーに表示される絵文字を自分好みにカスタマイズすることができます。 設定の「リアクション」で設定します。
+
+## リモート投稿へのリアクションについて
+リアクションはMisskeyオリジナルの機能であるため、リモートインスタンスがMisskeyでない限りは、ほとんどの場合「Like」としてアクティビティが送信されます。一般的にはLikeは「お気に入り」として実装されているようです。 また、相手がMisskeyであったとしても、カスタム絵文字リアクションは伝わらず、自動的に「👍」等にフォールバックされます。
+
+## リモートからのリアクションについて
+リモートから「Like」アクティビティを受信したとき、Misskeyでは「👍」のリアクションとして解釈されます。
diff --git a/src/docs/cs-CZ/reversi-bot.md b/src/docs/cs-CZ/reversi-bot.md
new file mode 100644
index 0000000000..7ab2a7212e
--- /dev/null
+++ b/src/docs/cs-CZ/reversi-bot.md
@@ -0,0 +1,160 @@
+# MisskeyリバーシBotの開発
+Misskeyのリバーシ機能に対応したBotの開発方法をここに記します。
+
+1. `games/reversi`ストリームに以下のパラメータを付けて接続する:
+ * `i`: botアカウントのAPIキー
+
+2. 対局への招待が来たら、ストリームから`invited`イベントが流れてくる
+ * イベントの中身に、`parent`という名前で対局へ誘ってきたユーザーの情報が含まれている
+
+3. `games/reversi/match`へ、`user_id`として`parent`の`id`が含まれたリクエストを送信する
+
+4. 上手くいくとゲーム情報が返ってくるので、`games/reversi-game`ストリームへ、以下のパラメータを付けて接続する:
+ * `i`: botアカウントのAPIキー
+ * `game`: `game`の`id`
+
+5. この間、相手がゲームの設定を変更するとその都度`update-settings`イベントが流れてくるので、必要であれば何かしらの処理を行う
+
+6. 設定に満足したら、`{ type: 'accept' }`メッセージをストリームに送信する
+
+7. ゲームが開始すると、`started`イベントが流れてくる
+ * イベントの中身にはゲーム情報が含まれている
+
+8. 石を打つには、ストリームに`{ type: 'set', pos: <位置> }`を送信する(位置の計算方法は後述)
+
+9. 相手または自分が石を打つと、ストリームから`set`イベントが流れてくる
+ * `color`として石の色が含まれている
+ * `pos`として位置情報が含まれている
+
+## 位置の計算法
+8x8のマップを考える場合、各マスの位置(インデックスと呼びます)は次のようになっています:
+```
++--+--+--+--+--+--+--+--+
+| 0| 1| 2| 3| 4| 5| 6| 7|
++--+--+--+--+--+--+--+--+
+| 8| 9|10|11|12|13|14|15|
++--+--+--+--+--+--+--+--+
+|16|17|18|19|20|21|22|23|
+...
+```
+
+### X,Y座標 から インデックス に変換する
+```
+pos = x + (y * mapWidth)
+```
+`mapWidth`は、ゲーム情報の`map`から、次のようにして計算できます:
+```
+mapWidth = map[0].length
+```
+
+### インデックス から X,Y座標 に変換する
+```
+x = pos % mapWidth
+y = Math.floor(pos / mapWidth)
+```
+
+## マップ情報
+マップ情報は、ゲーム情報の`map`に入っています。 文字列の配列になっており、ひとつひとつの文字がマス情報を表しています。 それをもとにマップのデザインを知る事が出来ます:
+* `(スペース)` ... マス無し
+* `-` ... マス
+* `b` ... 初期配置される黒石
+* `w` ... 初期配置される白石
+
+例えば、4*4の次のような単純なマップがあるとします:
+```text
++---+---+---+---+
+| | | | |
++---+---+---+---+
+| | ○ | ● | |
++---+---+---+---+
+| | ● | ○ | |
++---+---+---+---+
+| | | | |
++---+---+---+---+
+```
+
+この場合、マップデータはこのようになります:
+```javascript
+['----', '-wb-', '-bw-', '----']
+```
+
+## ユーザーにフォームを提示して対話可能Botを作成する
+ユーザーとのコミュニケーションを行うため、ゲームの設定画面でユーザーにフォームを提示することができます。 例えば、Botの強さをユーザーが設定できるようにする、といったシナリオが考えられます。
+
+フォームを提示するには、`reversi-game`ストリームに次のメッセージを送信します:
+```javascript
+{
+ type: 'init-form',
+ body: [フォームコントロールの配列]
+}
+```
+
+フォームコントロールの配列については今から説明します。 フォームコントロールは、次のようなオブジェクトです:
+```javascript
+{
+ id: 'switch1',
+ type: 'switch',
+ label: 'Enable hoge',
+ value: false
+}
+```
+`id` ... コントロールのID。 `type` ... コントロールの種類。後述します。 `label` ... コントロールと一緒に表記するテキスト。 `value` ... コントロールのデフォルト値。
+
+### フォームの操作を受け取る
+ユーザーがフォームを操作すると、ストリームから`update-form`イベントが流れてきます。 イベントの中身には、コントロールのIDと、ユーザーが設定した値が含まれています。 例えば、上で示したスイッチをユーザーがオンにしたとすると、次のイベントが流れてきます:
+```javascript
+{
+ id: 'switch1',
+ value: true
+}
+```
+
+### フォームコントロールの種類
+#### スイッチ
+type: `switch` スイッチを表示します。何かの機能をオン/オフさせたい場合に有用です。
+
+##### プロパティ
+`label` ... スイッチに表記するテキスト。
+
+#### ラジオボタン
+type: `radio` ラジオボタンを表示します。選択肢を提示するのに有用です。例えば、Botの強さを設定させるなどです。
+
+##### プロパティ
+`items` ... ラジオボタンの選択肢。例:
+```javascript
+items: [{
+ label: '弱',
+ value: 1
+}, {
+ label: '中',
+ value: 2
+}, {
+ label: '強',
+ value: 3
+}]
+```
+
+#### スライダー
+type: `slider` スライダーを表示します。
+
+##### プロパティ
+`min` ... スライダーの下限。 `max` ... スライダーの上限。 `step` ... 入力欄で刻むステップ値。
+
+#### テキストボックス
+type: `textbox` テキストボックスを表示します。ユーザーになにか入力させる一般的な用途に利用できます。
+
+## ユーザーにメッセージを表示する
+設定画面でユーザーと対話する、フォーム以外のもうひとつの方法がこれです。ユーザーになにかメッセージを表示することができます。 例えば、ユーザーがBotの対応していないモードやマップを選択したとき、警告を表示するなどです。 メッセージを表示するには、次のメッセージをストリームに送信します:
+```javascript
+{
+ type: 'message',
+ body: {
+ text: 'メッセージ内容',
+ type: 'メッセージの種類'
+ }
+}
+```
+メッセージの種類: `success`, `info`, `warning`, `error`。
+
+## 投了する
+投了をするには、<a href="./api/endpoints/games/reversi/games/surrender">このエンドポイント</a>にリクエストします。
diff --git a/src/docs/cs-CZ/stream.md b/src/docs/cs-CZ/stream.md
new file mode 100644
index 0000000000..9011c37c5b
--- /dev/null
+++ b/src/docs/cs-CZ/stream.md
@@ -0,0 +1,354 @@
+# ストリーミングAPI
+
+ストリーミングAPIを使うと、リアルタイムで様々な情報(例えばタイムラインに新しい投稿が流れてきた、メッセージが届いた、フォローされた、など)を受け取ったり、様々な操作を行ったりすることができます。
+
+## ストリームに接続する
+
+ストリーミングAPIを利用するには、まずMisskeyサーバーに**websocket**接続する必要があります。
+
+以下のURLに、`i`というパラメータ名で認証情報を含めて、websocket接続してください。例:
+```
+%WS_URL%/streaming?i=xxxxxxxxxxxxxxx
+```
+
+認証情報は、自分のAPIキーや、アプリケーションからストリームに接続する際はユーザーのアクセストークンのことを指します。
+
+<div class="ui info">
+ <p><i class="fas fa-info-circle"></i> 認証情報の取得については、<a href="./api">こちらのドキュメント</a>をご確認ください。</p>
+</div>
+
+---
+
+認証情報は省略することもできますが、その場合非ログインでの利用ということになり、受信できる情報や可能な操作は限られます。例:
+
+```
+%WS_URL%/streaming
+```
+
+---
+
+ストリームに接続すると、後述するAPI操作や、投稿の購読を行ったりすることができます。 しかしまだこの段階では、例えばタイムラインへの新しい投稿を受信したりすることはできません。 それを行うには、ストリーム上で、後述する**チャンネル**に接続する必要があります。
+
+**ストリームでのやり取りはすべてJSONです。**
+
+## チャンネル
+MisskeyのストリーミングAPIにはチャンネルという概念があります。これは、送受信する情報を分離するための仕組みです。 Misskeyのストリームに接続しただけでは、まだリアルタイムでタイムラインの投稿を受信したりはできません。 ストリーム上でチャンネルに接続することで、様々な情報を受け取ったり情報を送信したりすることができるようになります。
+
+### チャンネルに接続する
+チャンネルに接続するには、次のようなデータをJSONでストリームに送信します:
+
+```json
+{
+ type: 'connect',
+ body: {
+ channel: 'xxxxxxxx',
+ id: 'foobar',
+ params: {
+ ...
+ }
+ }
+}
+```
+
+ここで、
+* `channel`には接続したいチャンネル名を設定します。チャンネルの種類については後述します。
+* `id`にはそのチャンネルとやり取りするための任意のIDを設定します。ストリームでは様々なメッセージが流れるので、そのメッセージがどのチャンネルからのものなのか識別する必要があるからです。このIDは、UUIDや、乱数のようなもので構いません。
+* `params`はチャンネルに接続する際のパラメータです。チャンネルによって接続時に必要とされるパラメータは異なります。パラメータ不要のチャンネルに接続する際は、このプロパティは省略可能です。
+
+<div class="ui info">
+ <p><i class="fas fa-info-circle"></i> IDはチャンネルごとではなく「チャンネルの接続ごと」です。なぜなら、同じチャンネルに異なるパラメータで複数接続するケースもあるからです。</p>
+</div>
+
+### チャンネルからのメッセージを受け取る
+例えばタイムラインのチャンネルなら、新しい投稿があった時にメッセージを発します。そのメッセージを受け取ることで、タイムラインに新しい投稿がされたことをリアルタイムで知ることができます。
+
+チャンネルがメッセージを発すると、次のようなデータがJSONでストリームに流れてきます:
+```json
+{
+ type: 'channel',
+ body: {
+ id: 'foobar',
+ type: 'something',
+ body: {
+ some: 'thing'
+ }
+ }
+}
+```
+
+ここで、
+* `id`には前述したそのチャンネルに接続する際に設定したIDが設定されています。これで、このメッセージがどのチャンネルからのものなのか知ることができます。
+* `type`にはメッセージの種類が設定されます。チャンネルによって、どのような種類のメッセージが流れてくるかは異なります。
+* `body`にはメッセージの内容が設定されます。チャンネルによって、どのような内容のメッセージが流れてくるかは異なります。
+
+### チャンネルに向けてメッセージを送信する
+チャンネルによっては、メッセージを受け取るだけでなく、こちらから何かメッセージを送信し、何らかの操作を行える場合があります。
+
+チャンネルにメッセージを送信するには、次のようなデータをJSONでストリームに送信します:
+```json
+{
+ type: 'channel',
+ body: {
+ id: 'foobar',
+ type: 'something',
+ body: {
+ some: 'thing'
+ }
+ }
+}
+```
+
+ここで、
+* `id`には前述したそのチャンネルに接続する際に設定したIDを設定します。これで、このメッセージがどのチャンネルに向けたものなのか識別させることができます。
+* `type`にはメッセージの種類を設定します。チャンネルによって、どのような種類のメッセージを受け付けるかは異なります。
+* `body`にはメッセージの内容を設定します。チャンネルによって、どのような内容のメッセージを受け付けるかは異なります。
+
+### チャンネルから切断する
+チャンネルから切断するには、次のようなデータをJSONでストリームに送信します:
+
+```json
+{
+ type: 'disconnect',
+ body: {
+ id: 'foobar'
+ }
+}
+```
+
+ここで、
+* `id`には前述したそのチャンネルに接続する際に設定したIDを設定します。
+
+## ストリームを経由してAPIリクエストする
+
+ストリームを経由してAPIリクエストすると、HTTPリクエストを発生させずにAPIを利用できます。そのため、コードを簡潔にできたり、パフォーマンスの向上を見込めるかもしれません。
+
+ストリームを経由してAPIリクエストするには、次のようなデータをJSONでストリームに送信します:
+```json
+{
+ type: 'api',
+ body: {
+ id: 'xxxxxxxxxxxxxxxx',
+ endpoint: 'notes/create',
+ data: {
+ text: 'yee haw!'
+ }
+ }
+}
+```
+
+ここで、
+* `id`には、APIのレスポンスを識別するための、APIリクエストごとの一意なIDを設定する必要があります。UUIDや、簡単な乱数のようなもので構いません。
+* `endpoint`には、あなたがリクエストしたいAPIのエンドポイントを指定します。
+* `data`には、エンドポイントのパラメータを含めます。
+
+<div class="ui info">
+ <p><i class="fas fa-info-circle"></i> APIのエンドポイントやパラメータについてはAPIリファレンスをご確認ください。</p>
+</div>
+
+### レスポンスの受信
+
+APIへリクエストすると、レスポンスがストリームから次のような形式で流れてきます。
+
+```json
+{
+ type: 'api:xxxxxxxxxxxxxxxx',
+ body: {
+ ...
+ }
+}
+```
+
+ここで、
+* `xxxxxxxxxxxxxxxx`の部分には、リクエストの際に設定された`id`が含まれています。これにより、どのリクエストに対するレスポンスなのか判別することができます。
+* `body`には、レスポンスが含まれています。
+
+## 投稿のキャプチャ
+
+Misskeyは投稿のキャプチャと呼ばれる仕組みを提供しています。これは、指定した投稿のイベントをストリームで受け取る機能です。
+
+例えばタイムラインを取得してユーザーに表示したとします。ここで誰かがそのタイムラインに含まれるどれかの投稿に対してリアクションしたとします。
+
+しかし、クライアントからするとある投稿にリアクションが付いたことなどは知る由がないため、リアルタイムでリアクションをタイムライン上の投稿に反映して表示するといったことができません。
+
+この問題を解決するために、Misskeyは投稿のキャプチャ機構を用意しています。投稿をキャプチャすると、その投稿に関するイベントを受け取ることができるため、リアルタイムでリアクションを反映させたりすることが可能になります。
+
+### 投稿をキャプチャする
+
+投稿をキャプチャするには、ストリームに次のようなメッセージを送信します:
+
+```json
+{
+ type: 'subNote',
+ body: {
+ id: 'xxxxxxxxxxxxxxxx'
+ }
+}
+```
+
+ここで、
+* `id`にキャプチャしたい投稿の`id`を設定します。
+
+このメッセージを送信すると、Misskeyにキャプチャを要請したことになり、以後、その投稿に関するイベントが流れてくるようになります。
+
+例えば投稿にリアクションが付いたとすると、次のようなメッセージが流れてきます:
+
+```json
+{
+ type: 'noteUpdated',
+ body: {
+ id: 'xxxxxxxxxxxxxxxx',
+ type: 'reacted',
+ body: {
+ reaction: 'like',
+ userId: 'yyyyyyyyyyyyyyyy'
+ }
+ }
+}
+```
+
+ここで、
+* `body`内の`id`に、イベントを発生させた投稿のIDが設定されます。
+* `body`内の`type`に、イベントの種類が設定されます。
+* `body`内の`body`に、イベントの詳細が設定されます。
+
+#### イベントの種類
+
+##### `reacted`
+その投稿にリアクションがされた時に発生します。
+
+* `reaction`に、リアクションの種類が設定されます。
+* `userId`に、リアクションを行ったユーザーのIDが設定されます。
+
+例:
+```json
+{
+ type: 'noteUpdated',
+ body: {
+ id: 'xxxxxxxxxxxxxxxx',
+ type: 'reacted',
+ body: {
+ reaction: 'like',
+ userId: 'yyyyyyyyyyyyyyyy'
+ }
+ }
+}
+```
+
+##### `deleted`
+その投稿が削除された時に発生します。
+
+* `deletedAt`に、削除日時が設定されます。
+
+例:
+```json
+{
+ type: 'noteUpdated',
+ body: {
+ id: 'xxxxxxxxxxxxxxxx',
+ type: 'deleted',
+ body: {
+ deletedAt: '2018-10-22T02:17:09.703Z'
+ }
+ }
+}
+```
+
+##### `pollVoted`
+その投稿に添付されたアンケートに投票された時に発生します。
+
+* `choice`に、選択肢IDが設定されます。
+* `userId`に、投票を行ったユーザーのIDが設定されます。
+
+例:
+```json
+{
+ type: 'noteUpdated',
+ body: {
+ id: 'xxxxxxxxxxxxxxxx',
+ type: 'pollVoted',
+ body: {
+ choice: 2,
+ userId: 'yyyyyyyyyyyyyyyy'
+ }
+ }
+}
+```
+
+### 投稿のキャプチャを解除する
+
+その投稿がもう画面に表示されなくなったりして、その投稿に関するイベントをもう受け取る必要がなくなったときは、キャプチャの解除を申請してください。
+
+次のメッセージを送信します:
+
+```json
+{
+ type: 'unsubNote',
+ body: {
+ id: 'xxxxxxxxxxxxxxxx'
+ }
+}
+```
+
+ここで、
+* `id`にキャプチャを解除したい投稿の`id`を設定します。
+
+このメッセージを送信すると、以後、その投稿に関するイベントは流れてこないようになります。
+
+# チャンネル一覧
+## `main`
+アカウントに関する基本的な情報が流れてきます。このチャンネルにパラメータはありません。
+
+### 流れてくるイベント一覧
+
+#### `renote`
+自分の投稿がRenoteされた時に発生するイベントです。自分自身の投稿をRenoteしたときは発生しません。
+
+#### `mention`
+誰かからメンションされたときに発生するイベントです。
+
+#### `readAllNotifications`
+自分宛ての通知がすべて既読になったことを表すイベントです。このイベントを利用して、「通知があることを示すアイコン」のようなものをオフにしたりする等のケースが想定されます。
+
+#### `meUpdated`
+自分の情報が更新されたことを表すイベントです。
+
+#### `follow`
+自分が誰かをフォローしたときに発生するイベントです。
+
+#### `unfollow`
+自分が誰かのフォローを解除したときに発生するイベントです。
+
+#### `followed`
+自分が誰かにフォローされたときに発生するイベントです。
+
+## `homeTimeline`
+ホームタイムラインの投稿情報が流れてきます。このチャンネルにパラメータはありません。
+
+### 流れてくるイベント一覧
+
+#### `note`
+タイムラインに新しい投稿が流れてきたときに発生するイベントです。
+
+## `localTimeline`
+ローカルタイムラインの投稿情報が流れてきます。このチャンネルにパラメータはありません。
+
+### 流れてくるイベント一覧
+
+#### `note`
+ローカルタイムラインに新しい投稿が流れてきたときに発生するイベントです。
+
+## `hybridTimeline`
+ソーシャルタイムラインの投稿情報が流れてきます。このチャンネルにパラメータはありません。
+
+### 流れてくるイベント一覧
+
+#### `note`
+ソーシャルタイムラインに新しい投稿が流れてきたときに発生するイベントです。
+
+## `globalTimeline`
+グローバルタイムラインの投稿情報が流れてきます。このチャンネルにパラメータはありません。
+
+### 流れてくるイベント一覧
+
+#### `note`
+グローバルタイムラインに新しい投稿が流れてきたときに発生するイベントです。
diff --git a/src/docs/cs-CZ/theme.md b/src/docs/cs-CZ/theme.md
new file mode 100644
index 0000000000..4e52ee8cd7
--- /dev/null
+++ b/src/docs/cs-CZ/theme.md
@@ -0,0 +1,68 @@
+# テーマ
+
+テーマを設定して、Misskeyクライアントの見た目を変更できます。
+
+## テーマの設定
+設定 > テーマ
+
+## テーマを作成する
+テーマコードはJSON5で記述されたテーマオブジェクトです。 テーマは以下のようなオブジェクトです。
+``` js
+{
+ id: '17587283-dd92-4a2c-a22c-be0637c9e22a',
+
+ name: 'Danboard',
+ author: 'syuilo',
+
+ base: 'light',
+
+ props: {
+ accent: 'rgb(218, 141, 49)',
+ bg: 'rgb(218, 212, 190)',
+ fg: 'rgb(115, 108, 92)',
+ panel: 'rgb(236, 232, 220)',
+ renote: 'rgb(100, 152, 106)',
+ link: 'rgb(100, 152, 106)',
+ mention: '@accent',
+ hashtag: 'rgb(100, 152, 106)',
+ header: 'rgba(239, 227, 213, 0.75)',
+ navBg: 'rgb(216, 206, 182)',
+ inputBorder: 'rgba(0, 0, 0, 0.1)',
+ },
+}
+
+```
+
+* `id` ... テーマの一意なID。UUIDをおすすめします。
+* `name` ... テーマ名
+* `author` ... テーマの作者
+* `desc` ... テーマの説明(オプション)
+* `base` ... 明るいテーマか、暗いテーマか
+ * `light`にすると明るいテーマになり、`dark`にすると暗いテーマになります。
+ * テーマはここで設定されたベーステーマを継承します。
+* `props` ... テーマのスタイル定義。これから説明します。
+
+### テーマのスタイル定義
+`props`下にはテーマのスタイルを定義します。 キーがCSSの変数名になり、バリューで中身を指定します。 なお、この`props`オブジェクトはベーステーマから継承されます。 ベーステーマは、このテーマの`base`が`light`なら[_light.json5](https://github.com/syuilo/misskey/blob/develop/src/client/themes/_light.json5)で、`dark`なら[_dark.json5](https://github.com/syuilo/misskey/blob/develop/src/client/themes/_dark.json5)です。 つまり、このテーマ内の`props`に`panel`というキーが無くても、そこにはベーステーマの`panel`があると見なされます。
+
+#### バリューで使える構文
+* 16進数で表された色
+ * 例: `#00ff00`
+* `rgb(r, g, b)`形式で表された色
+ * 例: `rgb(0, 255, 0)`
+* `rgb(r, g, b, a)`形式で表された透明度を含む色
+ * 例: `rgba(0, 255, 0, 0.5)`
+* 他のキーの値の参照
+ * `@{キー名}`と書くと他のキーの値の参照になります。`{キー名}`は参照したいキーの名前に置き換えます。
+ * 例: `@panel`
+* 定数(後述)の参照
+ * `${定数名}`と書くと定数の参照になります。`{定数名}`は参照したい定数の名前に置き換えます。
+ * 例: `$main`
+* 関数(後述)
+ * `:{関数名}<{引数}<{色}`
+
+#### 定数
+「CSS変数として出力はしたくないが、他のCSS変数の値として使いまわしたい」値があるときは、定数を使うと便利です。 キー名を`$`で始めると、そのキーはCSS変数として出力されません。
+
+#### 関数
+wip
diff --git a/src/docs/cs-CZ/timelines.md b/src/docs/cs-CZ/timelines.md
new file mode 100644
index 0000000000..36ba61bd2d
--- /dev/null
+++ b/src/docs/cs-CZ/timelines.md
@@ -0,0 +1,15 @@
+# タイムラインの比較
+
+https://docs.google.com/spreadsheets/d/1lxQ2ugKrhz58Bg96HTDK_2F98BUritkMyIiBkOByjHA/edit?usp=sharing
+
+## ホーム
+自分のフォローしているユーザーの投稿
+
+## ローカル
+全てのローカルユーザーの「ホーム」指定されていない投稿
+
+## ソーシャル
+自分のフォローしているユーザーの投稿と、全てのローカルユーザーの「ホーム」指定されていない投稿
+
+## グローバル
+全てのローカルユーザーの「ホーム」指定されていない投稿と、サーバーに届いた全てのリモートユーザーの「ホーム」指定されていない投稿
diff --git a/src/docs/da-DK/aiscript.md b/src/docs/da-DK/aiscript.md
new file mode 100644
index 0000000000..6c28b446e3
--- /dev/null
+++ b/src/docs/da-DK/aiscript.md
@@ -0,0 +1,4 @@
+# AiScript
+
+## 関数
+デフォルトで値渡しです。
diff --git a/src/docs/da-DK/api.md b/src/docs/da-DK/api.md
new file mode 100644
index 0000000000..76019b6145
--- /dev/null
+++ b/src/docs/da-DK/api.md
@@ -0,0 +1,58 @@
+# Misskey API
+
+MisskeyAPIを使ってMisskeyクライアント、Misskey連携Webサービス、Bot等(以下「アプリケーション」と呼びます)を開発できます。 ストリーミングAPIもあるので、リアルタイム性のあるアプリケーションを作ることも可能です。
+
+APIを使い始めるには、まずアクセストークンを取得する必要があります。 このドキュメントでは、アクセストークンを取得する手順を説明した後、基本的なAPIの使い方を説明します。
+
+## アクセストークンの取得
+基本的に、APIはリクエストにはアクセストークンが必要となります。 APIにリクエストするのが自分自身なのか、不特定の利用者に使ってもらうアプリケーションなのかによって取得手順は異なります。
+
+* 前者の場合: [「自分自身のアクセストークンを手動発行する」](#自分自身のアクセストークンを手動発行する)に進む
+* 後者の場合: [「アプリケーション利用者にアクセストークンの発行をリクエストする」](#アプリケーション利用者にアクセストークンの発行をリクエストする)に進む
+
+### 自分自身のアクセストークンを手動発行する
+「設定 > API」で、自分のアクセストークンを発行できます。
+
+[「APIの使い方」へ進む](#APIの使い方)
+
+### アプリケーション利用者にアクセストークンの発行をリクエストする
+アプリケーション利用者のアクセストークンを取得するには、以下の手順で発行をリクエストします。
+
+#### Step 1
+
+UUIDを生成する。以後これをセッションIDと呼びます。
+
+> このセッションIDは毎回生成し、使いまわさないようにしてください。
+
+#### Step 2
+
+`{_URL_}/miauth/{session}`をユーザーのブラウザで表示させる。`{session}`の部分は、セッションIDに置き換えてください。
+> 例: `{_URL_}/miauth/c1f6d42b-468b-4fd2-8274-e58abdedef6f`
+
+表示する際、URLにクエリパラメータとしていくつかのオプションを設定できます:
+* `name` ... アプリケーション名
+ * > 例: `MissDeck`
+* `icon` ... アプリケーションのアイコン画像URL
+ * > 例: `https://missdeck.example.com/icon.png`
+* `callback` ... 認証が終わった後にリダイレクトするURL
+ * > 例: `https://missdeck.example.com/callback`
+ * リダイレクト時には、`session`というクエリパラメータでセッションIDが付きます
+* `permission` ... アプリケーションが要求する権限
+ * > 例: `write:notes,write:following,read:drive`
+ * 要求する権限を`,`で区切って列挙します
+ * どのような権限があるかは[APIリファレンス](/api-doc)で確認できます
+
+#### Step 3
+ユーザーが発行を許可した後、`{_URL_}/api/miauth/{session}/check`にPOSTリクエストすると、レスポンスとしてアクセストークンを含むJSONが返ります。
+
+レスポンスに含まれるプロパティ:
+* `token` ... ユーザーのアクセストークン
+* `user` ... ユーザーの情報
+
+[「APIの使い方」へ進む](#APIの使い方)
+
+## APIの使い方
+**APIはすべてPOSTで、リクエスト/レスポンスともにJSON形式です。RESTではありません。** アクセストークンは、`i`というパラメータ名でリクエストに含めます。
+
+* [APIリファレンス](/api-doc)
+* [ストリーミングAPI](./stream)
diff --git a/src/docs/da-DK/create-plugin.md b/src/docs/da-DK/create-plugin.md
new file mode 100644
index 0000000000..0d2fa19178
--- /dev/null
+++ b/src/docs/da-DK/create-plugin.md
@@ -0,0 +1,74 @@
+# プラグインの作成
+Misskey Webクライアントのプラグイン機能を使うと、クライアントを拡張し、様々な機能を追加できます。 ここではプラグインの作成にあたってのメタデータ定義や、AiScript APIリファレンスを掲載します。
+
+## メタデータ
+プラグインは、AiScriptのメタデータ埋め込み機能を使って、デフォルトとしてプラグインのメタデータを定義する必要があります。 メタデータは次のプロパティを含むオブジェクトです。
+
+### name
+プラグイン名
+
+### author
+プラグイン作者
+
+### version
+プラグインバージョン。数値を指定してください。
+
+### description
+プラグインの説明
+
+### permissions
+プラグインが要求する権限。MisskeyAPIにリクエストする際に用いられます。
+
+### config
+プラグインの設定情報を表すオブジェクト。 キーに設定名、値に以下のプロパティを含めます。
+
+#### type
+設定値の種類を表す文字列。以下から選択します。 string number boolean
+
+#### label
+ユーザーに表示する設定名
+
+#### description
+設定の説明
+
+#### default
+設定のデフォルト値
+
+## APIリファレンス
+AiScript標準で組み込まれているAPIは掲載しません。
+
+### Mk:dialog(title text type)
+ダイアログを表示します。typeには以下の値が設定できます。 info success warn error question 省略すると info になります。
+
+### Mk:confirm(title text type)
+確認ダイアログを表示します。typeには以下の値が設定できます。 info success warn error question 省略すると question になります。 ユーザーが"OK"を選択した場合は true を、"キャンセル"を選択した場合は false が返ります。
+
+### Mk:api(endpoint params)
+Misskey APIにリクエストします。第一引数にエンドポイント名、第二引数にパラメータオブジェクトを渡します。
+
+### Mk:save(key value)
+任意の値に任意の名前を付けて永続化します。永続化した値は、AiScriptコンテキストが終了しても残り、Mk:loadで読み取ることができます。
+
+### Mk:load(key)
+Mk:saveで永続化した指定の名前の値を読み取ります。
+
+### Plugin:register_post_form_action(title fn)
+投稿フォームにアクションを追加します。第一引数にアクション名、第二引数にアクションが選択された際のコールバック関数を渡します。 コールバック関数には、第一引数に投稿フォームオブジェクトが渡されます。
+
+### Plugin:register_note_action(title fn)
+ノートメニューに項目を追加します。第一引数に項目名、第二引数に項目が選択された際のコールバック関数を渡します。 コールバック関数には、第一引数に対象のノートオブジェクトが渡されます。
+
+### Plugin:register_user_action(title fn)
+ユーザーメニューに項目を追加します。第一引数に項目名、第二引数に項目が選択された際のコールバック関数を渡します。 コールバック関数には、第一引数に対象のユーザーオブジェクトが渡されます。
+
+### Plugin:register_note_view_interruptor(fn)
+UIに表示されるノート情報を書き換えます。 コールバック関数には、第一引数に対象のノートオブジェクトが渡されます。 コールバック関数の返り値でノートが書き換えられます。
+
+### Plugin:register_note_post_interruptor(fn)
+ノート投稿時にノート情報を書き換えます。 コールバック関数には、第一引数に対象のノートオブジェクトが渡されます。 コールバック関数の返り値でノートが書き換えられます。
+
+### Plugin:open_url(url)
+第一引数に渡されたURLをブラウザの新しいタブで開きます。
+
+### Plugin:config
+プラグインの設定が格納されるオブジェクト。プラグイン定義のconfigで設定したキーで値が入ります。
diff --git a/src/docs/da-DK/custom-emoji.md b/src/docs/da-DK/custom-emoji.md
new file mode 100644
index 0000000000..ed2e92be16
--- /dev/null
+++ b/src/docs/da-DK/custom-emoji.md
@@ -0,0 +1,2 @@
+# カスタム絵文字
+カスタム絵文字は、インスタンスで用意された画像を絵文字のように使える機能です。 ノート、リアクション、チャット、自己紹介、名前などの場所で使うことができます。 カスタム絵文字をそれらの場所で使うには、絵文字ピッカーボタン(ある場合)を押すか、`:`を入力して絵文字サジェストを表示します。 テキスト内に`:foo:`のような形式の文字列が見つかると、`foo`の部分がカスタム絵文字名と解釈され、表示時には対応したカスタム絵文字に置き換わります。
diff --git a/src/docs/da-DK/deck.md b/src/docs/da-DK/deck.md
new file mode 100644
index 0000000000..8057e262fd
--- /dev/null
+++ b/src/docs/da-DK/deck.md
@@ -0,0 +1,18 @@
+# デッキ
+
+デッキは利用可能なUIのひとつです。「カラム」と呼ばれるビューを複数並べて表示させることで、カスタマイズ性が高く、情報量の多いUIが構築できることが特徴です。
+
+## カラムの追加
+デッキの背景を右クリックし、「カラムを追加」して任意のカラムを追加できます。
+
+## カラムの移動
+カラムは、ドラッグアンドドロップで他のカラムと位置を入れ替えることが出来るほか、カラムメニュー(カラムのヘッダー右クリック)から位置を移動させることもできます。
+
+## カラムの水平分割
+カラムは左右だけでなく、上下に並べることもできます。 カラムメニューを開き、「左に重ねる」を選択すると、左のカラムの下に現在のカラムが移動します。 上下分割を解除するには、カラムメニューの「右に出す」を選択します。
+
+## カラムの設定
+カラムメニューの「編集」を選択するとカラムの設定を編集できます。カラムの名前を変えたり、幅を変えたりできます。
+
+## デッキの設定
+デッキに関する設定は、[settings/deck](/settings/deck)で行えます。
diff --git a/src/docs/da-DK/follow.md b/src/docs/da-DK/follow.md
new file mode 100644
index 0000000000..3c1ea7bbe0
--- /dev/null
+++ b/src/docs/da-DK/follow.md
@@ -0,0 +1,2 @@
+# フォロー
+ユーザーをフォローすると、タイムラインにそのユーザーの投稿が表示されるようになります。ただし、他のユーザーに対する返信は含まれません。 ユーザーをフォローするには、ユーザーページの「フォロー」ボタンをクリックします。フォローを解除するには、もう一度クリックします。
diff --git a/src/docs/da-DK/keyboard-shortcut.md b/src/docs/da-DK/keyboard-shortcut.md
new file mode 100644
index 0000000000..957ca838c9
--- /dev/null
+++ b/src/docs/da-DK/keyboard-shortcut.md
@@ -0,0 +1,68 @@
+# キーボードショートカット
+
+## グローバル
+これらのショートカットは基本的にどこでも使えます。
+<table>
+ <thead>
+ <tr><th>ショートカット</th><th>効果</th><th>由来</th></tr>
+ </thead>
+ <tbody>
+ <tr><td><kbd class="key">P</kbd>, <kbd class="key">N</kbd></td><td>新規投稿</td><td><b>P</b>ost, <b>N</b>ew, <b>N</b>ote</td></tr>
+ <tr><td><kbd class="key">T</kbd></td><td>タイムラインの最も新しい投稿にフォーカス</td><td><b>T</b>imeline, <b>T</b>op</td></tr>
+ <tr><td><kbd class="group"><kbd class="key">Shift</kbd> + <kbd class="key">N</kbd></kbd></td><td>通知を表示/隠す</td><td><b>N</b>otifications</td></tr>
+ <tr><td><kbd class="key">S</kbd></td><td>検索</td><td><b>S</b>earch</td></tr>
+ <tr><td><kbd class="key">H</kbd>, <kbd class="key">?</kbd></td><td>ヘルプを表示</td><td><b>H</b>elp</td></tr>
+ </tbody>
+</table>
+
+## 投稿にフォーカスされた状態
+
+<table>
+ <thead>
+ <tr><th>ショートカット</th><th>効果</th><th>由来</th></tr>
+ </thead>
+ <tbody>
+ <tr><td><kbd class="key">↑</kbd>, <kbd class="key">K</kbd>, <kbd class="group"><kbd class="key">Shift</kbd> + <kbd class="key">Tab</kbd></kbd></td><td>上の投稿にフォーカスを移動</td><td>-</td></tr>
+ <tr><td><kbd class="key">↓</kbd>, <kbd class="key">J</kbd>, <kbd class="key">Tab</kbd></td><td>下の投稿にフォーカスを移動</td><td>-</td></tr>
+ <tr><td><kbd class="key">R</kbd></td><td>返信フォームを開く</td><td><b>R</b>eply</td></tr>
+ <tr><td><kbd class="key">Q</kbd></td><td>Renoteフォームを開く</td><td><b>Q</b>uote</td></tr>
+ <tr><td><kbd class="group"><kbd class="key">Ctrl</kbd> + <kbd class="key">Q</kbd></kbd></td><td>即刻Renoteする(フォームを開かずに)</td><td>-</td></tr>
+ <tr><td><kbd class="key">E</kbd>, <kbd class="key">A</kbd>, <kbd class="key">+</kbd></td><td>リアクションフォームを開く</td><td><b>E</b>mote, re<b>A</b>ction</td></tr>
+ <tr><td><kbd class="key">0</kbd>~<kbd class="key">9</kbd></td><td>数字に対応したリアクションをする(対応については後述)</td><td>-</td></tr>
+ <tr><td><kbd class="key">F</kbd>, <kbd class="key">B</kbd></td><td>お気に入りに登録</td><td><b>F</b>avorite, <b>B</b>ookmark</td></tr>
+ <tr><td><kbd class="key">Del</kbd>, <kbd class="group"><kbd class="key">Ctrl</kbd> + <kbd class="key">D</kbd></kbd></td><td>投稿を削除</td><td><b>D</b>elete</tr>
+ <tr><td><kbd class="key">M</kbd>, <kbd class="key">O</kbd></td><td>投稿に対するメニューを開く</td><td><b>M</b>ore, <b>O</b>ther</td></tr>
+ <tr><td><kbd class="key">S</kbd></td><td>CWで隠された部分を表示 or 隠す</td><td><b>S</b>how, <b>S</b>ee</td></tr>
+ <tr><td><kbd class="key">Esc</kbd></td><td>フォーカスを外す</td><td>-</td></tr>
+ </tbody>
+</table>
+
+## Renoteフォーム
+
+<table>
+ <thead>
+ <tr><th>ショートカット</th><th>効果</th><th>由来</th></tr>
+ </thead>
+ <tbody>
+ <tr><td><kbd class="key">Enter</kbd></td><td>Renoteする</td><td>-</td></tr>
+ <tr><td><kbd class="key">Q</kbd></td><td>フォームを展開する</td><td><b>Q</b>uote</td></tr>
+ <tr><td><kbd class="key">Esc</kbd></td><td>フォームを閉じる</td><td>-</td></tr>
+ </tbody>
+</table>
+
+## リアクションフォーム
+デフォルトで「👍」にフォーカスが当たっている状態です。
+<table>
+ <thead>
+ <tr><th>ショートカット</th><th>効果</th><th>由来</th></tr>
+ </thead>
+ <tbody>
+ <tr><td><kbd class="key">↑</kbd>, <kbd class="key">K</kbd></td><td>上のリアクションにフォーカスを移動</td><td>-</td></tr>
+ <tr><td><kbd class="key">↓</kbd>, <kbd class="key">J</kbd></td><td>下のリアクションにフォーカスを移動</td><td>-</td></tr>
+ <tr><td><kbd class="key">←</kbd>, <kbd class="key">H</kbd>, <kbd class="group"><kbd class="key">Shift</kbd> + <kbd class="key">Tab</kbd></kbd></td><td>左のリアクションにフォーカスを移動</td><td>-</td></tr>
+ <tr><td><kbd class="key">→</kbd>, <kbd class="key">L</kbd>, <kbd class="key">Tab</kbd></td><td>右のリアクションにフォーカスを移動</td><td>-</td></tr>
+ <tr><td><kbd class="key">Enter</kbd>, <kbd class="key">Space</kbd>, <kbd class="key">+</kbd></td><td>リアクション確定</td><td>-</td></tr>
+ <tr><td><kbd class="key">0</kbd>~<kbd class="key">9</kbd></td><td>数字に対応したリアクションで確定</td><td>-</td></tr>
+ <tr><td><kbd class="key">Esc</kbd></td><td>リアクションするのをやめる</td><td>-</td></tr>
+ </tbody>
+</table>
diff --git a/src/docs/da-DK/mfm.md b/src/docs/da-DK/mfm.md
new file mode 100644
index 0000000000..e237287acc
--- /dev/null
+++ b/src/docs/da-DK/mfm.md
@@ -0,0 +1,2 @@
+# MFM
+MFMは、Misskey Flavored Markdownの略で、Misskeyの様々な場所で使用できる専用のマークアップ言語です。 MFMで使用可能な構文は[MFMチートシート](/mfm-cheat-sheet)で確認できます。
diff --git a/src/docs/da-DK/mute.md b/src/docs/da-DK/mute.md
new file mode 100644
index 0000000000..6a9608662a
--- /dev/null
+++ b/src/docs/da-DK/mute.md
@@ -0,0 +1,13 @@
+# ミュート
+
+ユーザーをミュートすると、そのユーザーに関する次のコンテンツがMisskeyに表示されなくなります:
+
+* タイムラインや投稿の検索結果内の、そのユーザーの投稿(およびそれらの投稿に対する返信やRenote)
+* そのユーザーからの通知
+* メッセージ履歴一覧内の、そのユーザーとのメッセージ履歴
+
+ユーザーをミュートするには、対象のユーザーのユーザーページに表示されている「ミュート」ボタンを押します。
+
+ミュートを行ったことは相手に通知されず、ミュートされていることを知ることもできません。
+
+設定>ミュート から、自分がミュートしているユーザー一覧を確認することができます。
diff --git a/src/docs/da-DK/pages.md b/src/docs/da-DK/pages.md
new file mode 100644
index 0000000000..a7311b95e6
--- /dev/null
+++ b/src/docs/da-DK/pages.md
@@ -0,0 +1,10 @@
+# Pages
+
+## 変数
+変数を使うことで動的なページを作成できます。テキスト内で <b>{ 変数名 }</b> と書くとそこに変数の値を埋め込めます。例えば <b>Hello { thing } world!</b> というテキストで、変数(thing)の値が <b>ai</b> だった場合、テキストは <b>Hello ai world!</b> になります。
+
+変数の評価(値を算出すること)は上から下に行われるので、ある変数の中で自分より下の変数を参照することはできません。例えば上から <b>A、B、C</b> と3つの変数を定義したとき、<b>C</b>の中で<b>A</b>や<b>B</b>を参照することはできますが、<b>A</b>の中で<b>B</b>や<b>C</b>を参照することはできません。
+
+ユーザーからの入力を受け取るには、ページに「ユーザー入力」ブロックを設置し、「変数名」に入力を格納したい変数名を設定します(変数は自動で作成されます)。その変数を使ってユーザー入力に応じた動作を行えます。
+
+関数を使うと、値の算出処理を再利用可能な形にまとめることができます。関数を作るには、「関数」タイプの変数を作成します。関数にはスロット(引数)を設定することができ、スロットの値は関数内で変数として利用可能です。また、関数を引数に取る関数(高階関数と呼ばれます)も存在します。関数は予め定義しておくほかに、このような高階関数のスロットに即席でセットすることもできます。
diff --git a/src/docs/da-DK/reaction.md b/src/docs/da-DK/reaction.md
new file mode 100644
index 0000000000..c26ead75b3
--- /dev/null
+++ b/src/docs/da-DK/reaction.md
@@ -0,0 +1,11 @@
+# リアクション
+他の人のノートに、絵文字を付けて簡単にあなたの反応を伝えられる機能です。 リアクションするには、ノートの + アイコンをクリックしてピッカーを表示し、絵文字を選択します。 リアクションには[カスタム絵文字](./custom-emoji)も使用できます。
+
+## リアクションピッカーのカスタマイズ
+ピッカーに表示される絵文字を自分好みにカスタマイズすることができます。 設定の「リアクション」で設定します。
+
+## リモート投稿へのリアクションについて
+リアクションはMisskeyオリジナルの機能であるため、リモートインスタンスがMisskeyでない限りは、ほとんどの場合「Like」としてアクティビティが送信されます。一般的にはLikeは「お気に入り」として実装されているようです。 また、相手がMisskeyであったとしても、カスタム絵文字リアクションは伝わらず、自動的に「👍」等にフォールバックされます。
+
+## リモートからのリアクションについて
+リモートから「Like」アクティビティを受信したとき、Misskeyでは「👍」のリアクションとして解釈されます。
diff --git a/src/docs/da-DK/reversi-bot.md b/src/docs/da-DK/reversi-bot.md
new file mode 100644
index 0000000000..7ab2a7212e
--- /dev/null
+++ b/src/docs/da-DK/reversi-bot.md
@@ -0,0 +1,160 @@
+# MisskeyリバーシBotの開発
+Misskeyのリバーシ機能に対応したBotの開発方法をここに記します。
+
+1. `games/reversi`ストリームに以下のパラメータを付けて接続する:
+ * `i`: botアカウントのAPIキー
+
+2. 対局への招待が来たら、ストリームから`invited`イベントが流れてくる
+ * イベントの中身に、`parent`という名前で対局へ誘ってきたユーザーの情報が含まれている
+
+3. `games/reversi/match`へ、`user_id`として`parent`の`id`が含まれたリクエストを送信する
+
+4. 上手くいくとゲーム情報が返ってくるので、`games/reversi-game`ストリームへ、以下のパラメータを付けて接続する:
+ * `i`: botアカウントのAPIキー
+ * `game`: `game`の`id`
+
+5. この間、相手がゲームの設定を変更するとその都度`update-settings`イベントが流れてくるので、必要であれば何かしらの処理を行う
+
+6. 設定に満足したら、`{ type: 'accept' }`メッセージをストリームに送信する
+
+7. ゲームが開始すると、`started`イベントが流れてくる
+ * イベントの中身にはゲーム情報が含まれている
+
+8. 石を打つには、ストリームに`{ type: 'set', pos: <位置> }`を送信する(位置の計算方法は後述)
+
+9. 相手または自分が石を打つと、ストリームから`set`イベントが流れてくる
+ * `color`として石の色が含まれている
+ * `pos`として位置情報が含まれている
+
+## 位置の計算法
+8x8のマップを考える場合、各マスの位置(インデックスと呼びます)は次のようになっています:
+```
++--+--+--+--+--+--+--+--+
+| 0| 1| 2| 3| 4| 5| 6| 7|
++--+--+--+--+--+--+--+--+
+| 8| 9|10|11|12|13|14|15|
++--+--+--+--+--+--+--+--+
+|16|17|18|19|20|21|22|23|
+...
+```
+
+### X,Y座標 から インデックス に変換する
+```
+pos = x + (y * mapWidth)
+```
+`mapWidth`は、ゲーム情報の`map`から、次のようにして計算できます:
+```
+mapWidth = map[0].length
+```
+
+### インデックス から X,Y座標 に変換する
+```
+x = pos % mapWidth
+y = Math.floor(pos / mapWidth)
+```
+
+## マップ情報
+マップ情報は、ゲーム情報の`map`に入っています。 文字列の配列になっており、ひとつひとつの文字がマス情報を表しています。 それをもとにマップのデザインを知る事が出来ます:
+* `(スペース)` ... マス無し
+* `-` ... マス
+* `b` ... 初期配置される黒石
+* `w` ... 初期配置される白石
+
+例えば、4*4の次のような単純なマップがあるとします:
+```text
++---+---+---+---+
+| | | | |
++---+---+---+---+
+| | ○ | ● | |
++---+---+---+---+
+| | ● | ○ | |
++---+---+---+---+
+| | | | |
++---+---+---+---+
+```
+
+この場合、マップデータはこのようになります:
+```javascript
+['----', '-wb-', '-bw-', '----']
+```
+
+## ユーザーにフォームを提示して対話可能Botを作成する
+ユーザーとのコミュニケーションを行うため、ゲームの設定画面でユーザーにフォームを提示することができます。 例えば、Botの強さをユーザーが設定できるようにする、といったシナリオが考えられます。
+
+フォームを提示するには、`reversi-game`ストリームに次のメッセージを送信します:
+```javascript
+{
+ type: 'init-form',
+ body: [フォームコントロールの配列]
+}
+```
+
+フォームコントロールの配列については今から説明します。 フォームコントロールは、次のようなオブジェクトです:
+```javascript
+{
+ id: 'switch1',
+ type: 'switch',
+ label: 'Enable hoge',
+ value: false
+}
+```
+`id` ... コントロールのID。 `type` ... コントロールの種類。後述します。 `label` ... コントロールと一緒に表記するテキスト。 `value` ... コントロールのデフォルト値。
+
+### フォームの操作を受け取る
+ユーザーがフォームを操作すると、ストリームから`update-form`イベントが流れてきます。 イベントの中身には、コントロールのIDと、ユーザーが設定した値が含まれています。 例えば、上で示したスイッチをユーザーがオンにしたとすると、次のイベントが流れてきます:
+```javascript
+{
+ id: 'switch1',
+ value: true
+}
+```
+
+### フォームコントロールの種類
+#### スイッチ
+type: `switch` スイッチを表示します。何かの機能をオン/オフさせたい場合に有用です。
+
+##### プロパティ
+`label` ... スイッチに表記するテキスト。
+
+#### ラジオボタン
+type: `radio` ラジオボタンを表示します。選択肢を提示するのに有用です。例えば、Botの強さを設定させるなどです。
+
+##### プロパティ
+`items` ... ラジオボタンの選択肢。例:
+```javascript
+items: [{
+ label: '弱',
+ value: 1
+}, {
+ label: '中',
+ value: 2
+}, {
+ label: '強',
+ value: 3
+}]
+```
+
+#### スライダー
+type: `slider` スライダーを表示します。
+
+##### プロパティ
+`min` ... スライダーの下限。 `max` ... スライダーの上限。 `step` ... 入力欄で刻むステップ値。
+
+#### テキストボックス
+type: `textbox` テキストボックスを表示します。ユーザーになにか入力させる一般的な用途に利用できます。
+
+## ユーザーにメッセージを表示する
+設定画面でユーザーと対話する、フォーム以外のもうひとつの方法がこれです。ユーザーになにかメッセージを表示することができます。 例えば、ユーザーがBotの対応していないモードやマップを選択したとき、警告を表示するなどです。 メッセージを表示するには、次のメッセージをストリームに送信します:
+```javascript
+{
+ type: 'message',
+ body: {
+ text: 'メッセージ内容',
+ type: 'メッセージの種類'
+ }
+}
+```
+メッセージの種類: `success`, `info`, `warning`, `error`。
+
+## 投了する
+投了をするには、<a href="./api/endpoints/games/reversi/games/surrender">このエンドポイント</a>にリクエストします。
diff --git a/src/docs/da-DK/stream.md b/src/docs/da-DK/stream.md
new file mode 100644
index 0000000000..9011c37c5b
--- /dev/null
+++ b/src/docs/da-DK/stream.md
@@ -0,0 +1,354 @@
+# ストリーミングAPI
+
+ストリーミングAPIを使うと、リアルタイムで様々な情報(例えばタイムラインに新しい投稿が流れてきた、メッセージが届いた、フォローされた、など)を受け取ったり、様々な操作を行ったりすることができます。
+
+## ストリームに接続する
+
+ストリーミングAPIを利用するには、まずMisskeyサーバーに**websocket**接続する必要があります。
+
+以下のURLに、`i`というパラメータ名で認証情報を含めて、websocket接続してください。例:
+```
+%WS_URL%/streaming?i=xxxxxxxxxxxxxxx
+```
+
+認証情報は、自分のAPIキーや、アプリケーションからストリームに接続する際はユーザーのアクセストークンのことを指します。
+
+<div class="ui info">
+ <p><i class="fas fa-info-circle"></i> 認証情報の取得については、<a href="./api">こちらのドキュメント</a>をご確認ください。</p>
+</div>
+
+---
+
+認証情報は省略することもできますが、その場合非ログインでの利用ということになり、受信できる情報や可能な操作は限られます。例:
+
+```
+%WS_URL%/streaming
+```
+
+---
+
+ストリームに接続すると、後述するAPI操作や、投稿の購読を行ったりすることができます。 しかしまだこの段階では、例えばタイムラインへの新しい投稿を受信したりすることはできません。 それを行うには、ストリーム上で、後述する**チャンネル**に接続する必要があります。
+
+**ストリームでのやり取りはすべてJSONです。**
+
+## チャンネル
+MisskeyのストリーミングAPIにはチャンネルという概念があります。これは、送受信する情報を分離するための仕組みです。 Misskeyのストリームに接続しただけでは、まだリアルタイムでタイムラインの投稿を受信したりはできません。 ストリーム上でチャンネルに接続することで、様々な情報を受け取ったり情報を送信したりすることができるようになります。
+
+### チャンネルに接続する
+チャンネルに接続するには、次のようなデータをJSONでストリームに送信します:
+
+```json
+{
+ type: 'connect',
+ body: {
+ channel: 'xxxxxxxx',
+ id: 'foobar',
+ params: {
+ ...
+ }
+ }
+}
+```
+
+ここで、
+* `channel`には接続したいチャンネル名を設定します。チャンネルの種類については後述します。
+* `id`にはそのチャンネルとやり取りするための任意のIDを設定します。ストリームでは様々なメッセージが流れるので、そのメッセージがどのチャンネルからのものなのか識別する必要があるからです。このIDは、UUIDや、乱数のようなもので構いません。
+* `params`はチャンネルに接続する際のパラメータです。チャンネルによって接続時に必要とされるパラメータは異なります。パラメータ不要のチャンネルに接続する際は、このプロパティは省略可能です。
+
+<div class="ui info">
+ <p><i class="fas fa-info-circle"></i> IDはチャンネルごとではなく「チャンネルの接続ごと」です。なぜなら、同じチャンネルに異なるパラメータで複数接続するケースもあるからです。</p>
+</div>
+
+### チャンネルからのメッセージを受け取る
+例えばタイムラインのチャンネルなら、新しい投稿があった時にメッセージを発します。そのメッセージを受け取ることで、タイムラインに新しい投稿がされたことをリアルタイムで知ることができます。
+
+チャンネルがメッセージを発すると、次のようなデータがJSONでストリームに流れてきます:
+```json
+{
+ type: 'channel',
+ body: {
+ id: 'foobar',
+ type: 'something',
+ body: {
+ some: 'thing'
+ }
+ }
+}
+```
+
+ここで、
+* `id`には前述したそのチャンネルに接続する際に設定したIDが設定されています。これで、このメッセージがどのチャンネルからのものなのか知ることができます。
+* `type`にはメッセージの種類が設定されます。チャンネルによって、どのような種類のメッセージが流れてくるかは異なります。
+* `body`にはメッセージの内容が設定されます。チャンネルによって、どのような内容のメッセージが流れてくるかは異なります。
+
+### チャンネルに向けてメッセージを送信する
+チャンネルによっては、メッセージを受け取るだけでなく、こちらから何かメッセージを送信し、何らかの操作を行える場合があります。
+
+チャンネルにメッセージを送信するには、次のようなデータをJSONでストリームに送信します:
+```json
+{
+ type: 'channel',
+ body: {
+ id: 'foobar',
+ type: 'something',
+ body: {
+ some: 'thing'
+ }
+ }
+}
+```
+
+ここで、
+* `id`には前述したそのチャンネルに接続する際に設定したIDを設定します。これで、このメッセージがどのチャンネルに向けたものなのか識別させることができます。
+* `type`にはメッセージの種類を設定します。チャンネルによって、どのような種類のメッセージを受け付けるかは異なります。
+* `body`にはメッセージの内容を設定します。チャンネルによって、どのような内容のメッセージを受け付けるかは異なります。
+
+### チャンネルから切断する
+チャンネルから切断するには、次のようなデータをJSONでストリームに送信します:
+
+```json
+{
+ type: 'disconnect',
+ body: {
+ id: 'foobar'
+ }
+}
+```
+
+ここで、
+* `id`には前述したそのチャンネルに接続する際に設定したIDを設定します。
+
+## ストリームを経由してAPIリクエストする
+
+ストリームを経由してAPIリクエストすると、HTTPリクエストを発生させずにAPIを利用できます。そのため、コードを簡潔にできたり、パフォーマンスの向上を見込めるかもしれません。
+
+ストリームを経由してAPIリクエストするには、次のようなデータをJSONでストリームに送信します:
+```json
+{
+ type: 'api',
+ body: {
+ id: 'xxxxxxxxxxxxxxxx',
+ endpoint: 'notes/create',
+ data: {
+ text: 'yee haw!'
+ }
+ }
+}
+```
+
+ここで、
+* `id`には、APIのレスポンスを識別するための、APIリクエストごとの一意なIDを設定する必要があります。UUIDや、簡単な乱数のようなもので構いません。
+* `endpoint`には、あなたがリクエストしたいAPIのエンドポイントを指定します。
+* `data`には、エンドポイントのパラメータを含めます。
+
+<div class="ui info">
+ <p><i class="fas fa-info-circle"></i> APIのエンドポイントやパラメータについてはAPIリファレンスをご確認ください。</p>
+</div>
+
+### レスポンスの受信
+
+APIへリクエストすると、レスポンスがストリームから次のような形式で流れてきます。
+
+```json
+{
+ type: 'api:xxxxxxxxxxxxxxxx',
+ body: {
+ ...
+ }
+}
+```
+
+ここで、
+* `xxxxxxxxxxxxxxxx`の部分には、リクエストの際に設定された`id`が含まれています。これにより、どのリクエストに対するレスポンスなのか判別することができます。
+* `body`には、レスポンスが含まれています。
+
+## 投稿のキャプチャ
+
+Misskeyは投稿のキャプチャと呼ばれる仕組みを提供しています。これは、指定した投稿のイベントをストリームで受け取る機能です。
+
+例えばタイムラインを取得してユーザーに表示したとします。ここで誰かがそのタイムラインに含まれるどれかの投稿に対してリアクションしたとします。
+
+しかし、クライアントからするとある投稿にリアクションが付いたことなどは知る由がないため、リアルタイムでリアクションをタイムライン上の投稿に反映して表示するといったことができません。
+
+この問題を解決するために、Misskeyは投稿のキャプチャ機構を用意しています。投稿をキャプチャすると、その投稿に関するイベントを受け取ることができるため、リアルタイムでリアクションを反映させたりすることが可能になります。
+
+### 投稿をキャプチャする
+
+投稿をキャプチャするには、ストリームに次のようなメッセージを送信します:
+
+```json
+{
+ type: 'subNote',
+ body: {
+ id: 'xxxxxxxxxxxxxxxx'
+ }
+}
+```
+
+ここで、
+* `id`にキャプチャしたい投稿の`id`を設定します。
+
+このメッセージを送信すると、Misskeyにキャプチャを要請したことになり、以後、その投稿に関するイベントが流れてくるようになります。
+
+例えば投稿にリアクションが付いたとすると、次のようなメッセージが流れてきます:
+
+```json
+{
+ type: 'noteUpdated',
+ body: {
+ id: 'xxxxxxxxxxxxxxxx',
+ type: 'reacted',
+ body: {
+ reaction: 'like',
+ userId: 'yyyyyyyyyyyyyyyy'
+ }
+ }
+}
+```
+
+ここで、
+* `body`内の`id`に、イベントを発生させた投稿のIDが設定されます。
+* `body`内の`type`に、イベントの種類が設定されます。
+* `body`内の`body`に、イベントの詳細が設定されます。
+
+#### イベントの種類
+
+##### `reacted`
+その投稿にリアクションがされた時に発生します。
+
+* `reaction`に、リアクションの種類が設定されます。
+* `userId`に、リアクションを行ったユーザーのIDが設定されます。
+
+例:
+```json
+{
+ type: 'noteUpdated',
+ body: {
+ id: 'xxxxxxxxxxxxxxxx',
+ type: 'reacted',
+ body: {
+ reaction: 'like',
+ userId: 'yyyyyyyyyyyyyyyy'
+ }
+ }
+}
+```
+
+##### `deleted`
+その投稿が削除された時に発生します。
+
+* `deletedAt`に、削除日時が設定されます。
+
+例:
+```json
+{
+ type: 'noteUpdated',
+ body: {
+ id: 'xxxxxxxxxxxxxxxx',
+ type: 'deleted',
+ body: {
+ deletedAt: '2018-10-22T02:17:09.703Z'
+ }
+ }
+}
+```
+
+##### `pollVoted`
+その投稿に添付されたアンケートに投票された時に発生します。
+
+* `choice`に、選択肢IDが設定されます。
+* `userId`に、投票を行ったユーザーのIDが設定されます。
+
+例:
+```json
+{
+ type: 'noteUpdated',
+ body: {
+ id: 'xxxxxxxxxxxxxxxx',
+ type: 'pollVoted',
+ body: {
+ choice: 2,
+ userId: 'yyyyyyyyyyyyyyyy'
+ }
+ }
+}
+```
+
+### 投稿のキャプチャを解除する
+
+その投稿がもう画面に表示されなくなったりして、その投稿に関するイベントをもう受け取る必要がなくなったときは、キャプチャの解除を申請してください。
+
+次のメッセージを送信します:
+
+```json
+{
+ type: 'unsubNote',
+ body: {
+ id: 'xxxxxxxxxxxxxxxx'
+ }
+}
+```
+
+ここで、
+* `id`にキャプチャを解除したい投稿の`id`を設定します。
+
+このメッセージを送信すると、以後、その投稿に関するイベントは流れてこないようになります。
+
+# チャンネル一覧
+## `main`
+アカウントに関する基本的な情報が流れてきます。このチャンネルにパラメータはありません。
+
+### 流れてくるイベント一覧
+
+#### `renote`
+自分の投稿がRenoteされた時に発生するイベントです。自分自身の投稿をRenoteしたときは発生しません。
+
+#### `mention`
+誰かからメンションされたときに発生するイベントです。
+
+#### `readAllNotifications`
+自分宛ての通知がすべて既読になったことを表すイベントです。このイベントを利用して、「通知があることを示すアイコン」のようなものをオフにしたりする等のケースが想定されます。
+
+#### `meUpdated`
+自分の情報が更新されたことを表すイベントです。
+
+#### `follow`
+自分が誰かをフォローしたときに発生するイベントです。
+
+#### `unfollow`
+自分が誰かのフォローを解除したときに発生するイベントです。
+
+#### `followed`
+自分が誰かにフォローされたときに発生するイベントです。
+
+## `homeTimeline`
+ホームタイムラインの投稿情報が流れてきます。このチャンネルにパラメータはありません。
+
+### 流れてくるイベント一覧
+
+#### `note`
+タイムラインに新しい投稿が流れてきたときに発生するイベントです。
+
+## `localTimeline`
+ローカルタイムラインの投稿情報が流れてきます。このチャンネルにパラメータはありません。
+
+### 流れてくるイベント一覧
+
+#### `note`
+ローカルタイムラインに新しい投稿が流れてきたときに発生するイベントです。
+
+## `hybridTimeline`
+ソーシャルタイムラインの投稿情報が流れてきます。このチャンネルにパラメータはありません。
+
+### 流れてくるイベント一覧
+
+#### `note`
+ソーシャルタイムラインに新しい投稿が流れてきたときに発生するイベントです。
+
+## `globalTimeline`
+グローバルタイムラインの投稿情報が流れてきます。このチャンネルにパラメータはありません。
+
+### 流れてくるイベント一覧
+
+#### `note`
+グローバルタイムラインに新しい投稿が流れてきたときに発生するイベントです。
diff --git a/src/docs/da-DK/theme.md b/src/docs/da-DK/theme.md
new file mode 100644
index 0000000000..4e52ee8cd7
--- /dev/null
+++ b/src/docs/da-DK/theme.md
@@ -0,0 +1,68 @@
+# テーマ
+
+テーマを設定して、Misskeyクライアントの見た目を変更できます。
+
+## テーマの設定
+設定 > テーマ
+
+## テーマを作成する
+テーマコードはJSON5で記述されたテーマオブジェクトです。 テーマは以下のようなオブジェクトです。
+``` js
+{
+ id: '17587283-dd92-4a2c-a22c-be0637c9e22a',
+
+ name: 'Danboard',
+ author: 'syuilo',
+
+ base: 'light',
+
+ props: {
+ accent: 'rgb(218, 141, 49)',
+ bg: 'rgb(218, 212, 190)',
+ fg: 'rgb(115, 108, 92)',
+ panel: 'rgb(236, 232, 220)',
+ renote: 'rgb(100, 152, 106)',
+ link: 'rgb(100, 152, 106)',
+ mention: '@accent',
+ hashtag: 'rgb(100, 152, 106)',
+ header: 'rgba(239, 227, 213, 0.75)',
+ navBg: 'rgb(216, 206, 182)',
+ inputBorder: 'rgba(0, 0, 0, 0.1)',
+ },
+}
+
+```
+
+* `id` ... テーマの一意なID。UUIDをおすすめします。
+* `name` ... テーマ名
+* `author` ... テーマの作者
+* `desc` ... テーマの説明(オプション)
+* `base` ... 明るいテーマか、暗いテーマか
+ * `light`にすると明るいテーマになり、`dark`にすると暗いテーマになります。
+ * テーマはここで設定されたベーステーマを継承します。
+* `props` ... テーマのスタイル定義。これから説明します。
+
+### テーマのスタイル定義
+`props`下にはテーマのスタイルを定義します。 キーがCSSの変数名になり、バリューで中身を指定します。 なお、この`props`オブジェクトはベーステーマから継承されます。 ベーステーマは、このテーマの`base`が`light`なら[_light.json5](https://github.com/syuilo/misskey/blob/develop/src/client/themes/_light.json5)で、`dark`なら[_dark.json5](https://github.com/syuilo/misskey/blob/develop/src/client/themes/_dark.json5)です。 つまり、このテーマ内の`props`に`panel`というキーが無くても、そこにはベーステーマの`panel`があると見なされます。
+
+#### バリューで使える構文
+* 16進数で表された色
+ * 例: `#00ff00`
+* `rgb(r, g, b)`形式で表された色
+ * 例: `rgb(0, 255, 0)`
+* `rgb(r, g, b, a)`形式で表された透明度を含む色
+ * 例: `rgba(0, 255, 0, 0.5)`
+* 他のキーの値の参照
+ * `@{キー名}`と書くと他のキーの値の参照になります。`{キー名}`は参照したいキーの名前に置き換えます。
+ * 例: `@panel`
+* 定数(後述)の参照
+ * `${定数名}`と書くと定数の参照になります。`{定数名}`は参照したい定数の名前に置き換えます。
+ * 例: `$main`
+* 関数(後述)
+ * `:{関数名}<{引数}<{色}`
+
+#### 定数
+「CSS変数として出力はしたくないが、他のCSS変数の値として使いまわしたい」値があるときは、定数を使うと便利です。 キー名を`$`で始めると、そのキーはCSS変数として出力されません。
+
+#### 関数
+wip
diff --git a/src/docs/da-DK/timelines.md b/src/docs/da-DK/timelines.md
new file mode 100644
index 0000000000..36ba61bd2d
--- /dev/null
+++ b/src/docs/da-DK/timelines.md
@@ -0,0 +1,15 @@
+# タイムラインの比較
+
+https://docs.google.com/spreadsheets/d/1lxQ2ugKrhz58Bg96HTDK_2F98BUritkMyIiBkOByjHA/edit?usp=sharing
+
+## ホーム
+自分のフォローしているユーザーの投稿
+
+## ローカル
+全てのローカルユーザーの「ホーム」指定されていない投稿
+
+## ソーシャル
+自分のフォローしているユーザーの投稿と、全てのローカルユーザーの「ホーム」指定されていない投稿
+
+## グローバル
+全てのローカルユーザーの「ホーム」指定されていない投稿と、サーバーに届いた全てのリモートユーザーの「ホーム」指定されていない投稿
diff --git a/src/docs/de-DE/aiscript.md b/src/docs/de-DE/aiscript.md
new file mode 100644
index 0000000000..7725f61ee8
--- /dev/null
+++ b/src/docs/de-DE/aiscript.md
@@ -0,0 +1,4 @@
+# AiScript
+
+## Funktionen
+デフォルトで値渡しです。
diff --git a/src/docs/de-DE/api.md b/src/docs/de-DE/api.md
new file mode 100644
index 0000000000..76019b6145
--- /dev/null
+++ b/src/docs/de-DE/api.md
@@ -0,0 +1,58 @@
+# Misskey API
+
+MisskeyAPIを使ってMisskeyクライアント、Misskey連携Webサービス、Bot等(以下「アプリケーション」と呼びます)を開発できます。 ストリーミングAPIもあるので、リアルタイム性のあるアプリケーションを作ることも可能です。
+
+APIを使い始めるには、まずアクセストークンを取得する必要があります。 このドキュメントでは、アクセストークンを取得する手順を説明した後、基本的なAPIの使い方を説明します。
+
+## アクセストークンの取得
+基本的に、APIはリクエストにはアクセストークンが必要となります。 APIにリクエストするのが自分自身なのか、不特定の利用者に使ってもらうアプリケーションなのかによって取得手順は異なります。
+
+* 前者の場合: [「自分自身のアクセストークンを手動発行する」](#自分自身のアクセストークンを手動発行する)に進む
+* 後者の場合: [「アプリケーション利用者にアクセストークンの発行をリクエストする」](#アプリケーション利用者にアクセストークンの発行をリクエストする)に進む
+
+### 自分自身のアクセストークンを手動発行する
+「設定 > API」で、自分のアクセストークンを発行できます。
+
+[「APIの使い方」へ進む](#APIの使い方)
+
+### アプリケーション利用者にアクセストークンの発行をリクエストする
+アプリケーション利用者のアクセストークンを取得するには、以下の手順で発行をリクエストします。
+
+#### Step 1
+
+UUIDを生成する。以後これをセッションIDと呼びます。
+
+> このセッションIDは毎回生成し、使いまわさないようにしてください。
+
+#### Step 2
+
+`{_URL_}/miauth/{session}`をユーザーのブラウザで表示させる。`{session}`の部分は、セッションIDに置き換えてください。
+> 例: `{_URL_}/miauth/c1f6d42b-468b-4fd2-8274-e58abdedef6f`
+
+表示する際、URLにクエリパラメータとしていくつかのオプションを設定できます:
+* `name` ... アプリケーション名
+ * > 例: `MissDeck`
+* `icon` ... アプリケーションのアイコン画像URL
+ * > 例: `https://missdeck.example.com/icon.png`
+* `callback` ... 認証が終わった後にリダイレクトするURL
+ * > 例: `https://missdeck.example.com/callback`
+ * リダイレクト時には、`session`というクエリパラメータでセッションIDが付きます
+* `permission` ... アプリケーションが要求する権限
+ * > 例: `write:notes,write:following,read:drive`
+ * 要求する権限を`,`で区切って列挙します
+ * どのような権限があるかは[APIリファレンス](/api-doc)で確認できます
+
+#### Step 3
+ユーザーが発行を許可した後、`{_URL_}/api/miauth/{session}/check`にPOSTリクエストすると、レスポンスとしてアクセストークンを含むJSONが返ります。
+
+レスポンスに含まれるプロパティ:
+* `token` ... ユーザーのアクセストークン
+* `user` ... ユーザーの情報
+
+[「APIの使い方」へ進む](#APIの使い方)
+
+## APIの使い方
+**APIはすべてPOSTで、リクエスト/レスポンスともにJSON形式です。RESTではありません。** アクセストークンは、`i`というパラメータ名でリクエストに含めます。
+
+* [APIリファレンス](/api-doc)
+* [ストリーミングAPI](./stream)
diff --git a/src/docs/de-DE/create-plugin.md b/src/docs/de-DE/create-plugin.md
new file mode 100644
index 0000000000..ee96786857
--- /dev/null
+++ b/src/docs/de-DE/create-plugin.md
@@ -0,0 +1,74 @@
+# プラグインの作成
+Misskey Webクライアントのプラグイン機能を使うと、クライアントを拡張し、様々な機能を追加できます。 ここではプラグインの作成にあたってのメタデータ定義や、AiScript APIリファレンスを掲載します。
+
+## Metadaten
+プラグインは、AiScriptのメタデータ埋め込み機能を使って、デフォルトとしてプラグインのメタデータを定義する必要があります。 メタデータは次のプロパティを含むオブジェクトです。
+
+### name
+プラグイン名
+
+### author
+プラグイン作者
+
+### version
+プラグインバージョン。数値を指定してください。
+
+### description
+プラグインの説明
+
+### permissions
+プラグインが要求する権限。MisskeyAPIにリクエストする際に用いられます。
+
+### config
+プラグインの設定情報を表すオブジェクト。 キーに設定名、値に以下のプロパティを含めます。
+
+#### type
+設定値の種類を表す文字列。以下から選択します。 string number boolean
+
+#### label
+ユーザーに表示する設定名
+
+#### description
+設定の説明
+
+#### default
+設定のデフォルト値
+
+## APIリファレンス
+AiScript標準で組み込まれているAPIは掲載しません。
+
+### Mk:dialog(title text type)
+ダイアログを表示します。typeには以下の値が設定できます。 info success warn error question 省略すると info になります。
+
+### Mk:confirm(title text type)
+確認ダイアログを表示します。typeには以下の値が設定できます。 info success warn error question 省略すると question になります。 ユーザーが"OK"を選択した場合は true を、"キャンセル"を選択した場合は false が返ります。
+
+### Mk:api(endpoint params)
+Misskey APIにリクエストします。第一引数にエンドポイント名、第二引数にパラメータオブジェクトを渡します。
+
+### Mk:save(key value)
+任意の値に任意の名前を付けて永続化します。永続化した値は、AiScriptコンテキストが終了しても残り、Mk:loadで読み取ることができます。
+
+### Mk:load(key)
+Mk:saveで永続化した指定の名前の値を読み取ります。
+
+### Plugin:register_post_form_action(title fn)
+投稿フォームにアクションを追加します。第一引数にアクション名、第二引数にアクションが選択された際のコールバック関数を渡します。 コールバック関数には、第一引数に投稿フォームオブジェクトが渡されます。
+
+### Plugin:register_note_action(title fn)
+ノートメニューに項目を追加します。第一引数に項目名、第二引数に項目が選択された際のコールバック関数を渡します。 コールバック関数には、第一引数に対象のノートオブジェクトが渡されます。
+
+### Plugin:register_user_action(title fn)
+ユーザーメニューに項目を追加します。第一引数に項目名、第二引数に項目が選択された際のコールバック関数を渡します。 コールバック関数には、第一引数に対象のユーザーオブジェクトが渡されます。
+
+### Plugin:register_note_view_interruptor(fn)
+UIに表示されるノート情報を書き換えます。 コールバック関数には、第一引数に対象のノートオブジェクトが渡されます。 コールバック関数の返り値でノートが書き換えられます。
+
+### Plugin:register_note_post_interruptor(fn)
+ノート投稿時にノート情報を書き換えます。 コールバック関数には、第一引数に対象のノートオブジェクトが渡されます。 コールバック関数の返り値でノートが書き換えられます。
+
+### Plugin:open_url(url)
+第一引数に渡されたURLをブラウザの新しいタブで開きます。
+
+### Plugin:config
+プラグインの設定が格納されるオブジェクト。プラグイン定義のconfigで設定したキーで値が入ります。
diff --git a/src/docs/de-DE/custom-emoji.md b/src/docs/de-DE/custom-emoji.md
new file mode 100644
index 0000000000..beb3370e11
--- /dev/null
+++ b/src/docs/de-DE/custom-emoji.md
@@ -0,0 +1,2 @@
+# Benutzerdefinierte Emojis
+カスタム絵文字は、インスタンスで用意された画像を絵文字のように使える機能です。 ノート、リアクション、チャット、自己紹介、名前などの場所で使うことができます。 カスタム絵文字をそれらの場所で使うには、絵文字ピッカーボタン(ある場合)を押すか、`:`を入力して絵文字サジェストを表示します。 テキスト内に`:foo:`のような形式の文字列が見つかると、`foo`の部分がカスタム絵文字名と解釈され、表示時には対応したカスタム絵文字に置き換わります。
diff --git a/src/docs/de-DE/deck.md b/src/docs/de-DE/deck.md
new file mode 100644
index 0000000000..73e9efdaaf
--- /dev/null
+++ b/src/docs/de-DE/deck.md
@@ -0,0 +1,18 @@
+# Deck
+
+デッキは利用可能なUIのひとつです。「カラム」と呼ばれるビューを複数並べて表示させることで、カスタマイズ性が高く、情報量の多いUIが構築できることが特徴です。
+
+## カラムの追加
+デッキの背景を右クリックし、「カラムを追加」して任意のカラムを追加できます。
+
+## カラムの移動
+カラムは、ドラッグアンドドロップで他のカラムと位置を入れ替えることが出来るほか、カラムメニュー(カラムのヘッダー右クリック)から位置を移動させることもできます。
+
+## カラムの水平分割
+カラムは左右だけでなく、上下に並べることもできます。 カラムメニューを開き、「左に重ねる」を選択すると、左のカラムの下に現在のカラムが移動します。 上下分割を解除するには、カラムメニューの「右に出す」を選択します。
+
+## カラムの設定
+カラムメニューの「編集」を選択するとカラムの設定を編集できます。カラムの名前を変えたり、幅を変えたりできます。
+
+## デッキの設定
+デッキに関する設定は、[settings/deck](/settings/deck)で行えます。
diff --git a/src/docs/de-DE/follow.md b/src/docs/de-DE/follow.md
new file mode 100644
index 0000000000..ab1b86197d
--- /dev/null
+++ b/src/docs/de-DE/follow.md
@@ -0,0 +1,2 @@
+# Folgt
+ユーザーをフォローすると、タイムラインにそのユーザーの投稿が表示されるようになります。ただし、他のユーザーに対する返信は含まれません。 ユーザーをフォローするには、ユーザーページの「フォロー」ボタンをクリックします。フォローを解除するには、もう一度クリックします。
diff --git a/src/docs/de-DE/keyboard-shortcut.md b/src/docs/de-DE/keyboard-shortcut.md
new file mode 100644
index 0000000000..d00a3e4f60
--- /dev/null
+++ b/src/docs/de-DE/keyboard-shortcut.md
@@ -0,0 +1,68 @@
+# キーボードショートカット
+
+## Global
+これらのショートカットは基本的にどこでも使えます。
+<table>
+ <thead>
+ <tr><th>ショートカット</th><th>効果</th><th>由来</th></tr>
+ </thead>
+ <tbody>
+ <tr><td><kbd class="key">P</kbd>, <kbd class="key">N</kbd></td><td>新規投稿</td><td><b>P</b>ost, <b>N</b>ew, <b>N</b>ote</td></tr>
+ <tr><td><kbd class="key">T</kbd></td><td>タイムラインの最も新しい投稿にフォーカス</td><td><b>T</b>imeline, <b>T</b>op</td></tr>
+ <tr><td><kbd class="group"><kbd class="key">Shift</kbd> + <kbd class="key">N</kbd></kbd></td><td>通知を表示/隠す</td><td><b>N</b>otifications</td></tr>
+ <tr><td><kbd class="key">S</kbd></td><td>Suchen</td><td><b>S</b>earch</td></tr>
+ <tr><td><kbd class="key">H</kbd>, <kbd class="key">?</kbd></td><td>ヘルプを表示</td><td><b>H</b>elp</td></tr>
+ </tbody>
+</table>
+
+## 投稿にフォーカスされた状態
+
+<table>
+ <thead>
+ <tr><th>ショートカット</th><th>効果</th><th>由来</th></tr>
+ </thead>
+ <tbody>
+ <tr><td><kbd class="key">↑</kbd>, <kbd class="key">K</kbd>, <kbd class="group"><kbd class="key">Shift</kbd> + <kbd class="key">Tab</kbd></kbd></td><td>上の投稿にフォーカスを移動</td><td>-</td></tr>
+ <tr><td><kbd class="key">↓</kbd>, <kbd class="key">J</kbd>, <kbd class="key">Tab</kbd></td><td>下の投稿にフォーカスを移動</td><td>-</td></tr>
+ <tr><td><kbd class="key">R</kbd></td><td>返信フォームを開く</td><td><b>R</b>eply</td></tr>
+ <tr><td><kbd class="key">Q</kbd></td><td>Renoteフォームを開く</td><td><b>Q</b>uote</td></tr>
+ <tr><td><kbd class="group"><kbd class="key">Ctrl</kbd> + <kbd class="key">Q</kbd></kbd></td><td>即刻Renoteする(フォームを開かずに)</td><td>-</td></tr>
+ <tr><td><kbd class="key">E</kbd>, <kbd class="key">A</kbd>, <kbd class="key">+</kbd></td><td>リアクションフォームを開く</td><td><b>E</b>mote, re<b>A</b>ction</td></tr>
+ <tr><td><kbd class="key">0</kbd>~<kbd class="key">9</kbd></td><td>数字に対応したリアクションをする(対応については後述)</td><td>-</td></tr>
+ <tr><td><kbd class="key">F</kbd>, <kbd class="key">B</kbd></td><td>お気に入りに登録</td><td><b>F</b>avorite, <b>B</b>ookmark</td></tr>
+ <tr><td><kbd class="key">Del</kbd>, <kbd class="group"><kbd class="key">Ctrl</kbd> + <kbd class="key">D</kbd></kbd></td><td>投稿を削除</td><td><b>D</b>elete</tr>
+ <tr><td><kbd class="key">M</kbd>, <kbd class="key">O</kbd></td><td>投稿に対するメニューを開く</td><td><b>M</b>ore, <b>O</b>ther</td></tr>
+ <tr><td><kbd class="key">S</kbd></td><td>CWで隠された部分を表示 or 隠す</td><td><b>S</b>how, <b>S</b>ee</td></tr>
+ <tr><td><kbd class="key">Esc</kbd></td><td>フォーカスを外す</td><td>-</td></tr>
+ </tbody>
+</table>
+
+## Renoteフォーム
+
+<table>
+ <thead>
+ <tr><th>ショートカット</th><th>効果</th><th>由来</th></tr>
+ </thead>
+ <tbody>
+ <tr><td><kbd class="key">Enter</kbd></td><td>Renoteする</td><td>-</td></tr>
+ <tr><td><kbd class="key">Q</kbd></td><td>フォームを展開する</td><td><b>Q</b>uote</td></tr>
+ <tr><td><kbd class="key">Esc</kbd></td><td>フォームを閉じる</td><td>-</td></tr>
+ </tbody>
+</table>
+
+## リアクションフォーム
+デフォルトで「👍」にフォーカスが当たっている状態です。
+<table>
+ <thead>
+ <tr><th>ショートカット</th><th>効果</th><th>由来</th></tr>
+ </thead>
+ <tbody>
+ <tr><td><kbd class="key">↑</kbd>, <kbd class="key">K</kbd></td><td>上のリアクションにフォーカスを移動</td><td>-</td></tr>
+ <tr><td><kbd class="key">↓</kbd>, <kbd class="key">J</kbd></td><td>下のリアクションにフォーカスを移動</td><td>-</td></tr>
+ <tr><td><kbd class="key">←</kbd>, <kbd class="key">H</kbd>, <kbd class="group"><kbd class="key">Shift</kbd> + <kbd class="key">Tab</kbd></kbd></td><td>左のリアクションにフォーカスを移動</td><td>-</td></tr>
+ <tr><td><kbd class="key">→</kbd>, <kbd class="key">L</kbd>, <kbd class="key">Tab</kbd></td><td>右のリアクションにフォーカスを移動</td><td>-</td></tr>
+ <tr><td><kbd class="key">Enter</kbd>, <kbd class="key">Space</kbd>, <kbd class="key">+</kbd></td><td>リアクション確定</td><td>-</td></tr>
+ <tr><td><kbd class="key">0</kbd>~<kbd class="key">9</kbd></td><td>数字に対応したリアクションで確定</td><td>-</td></tr>
+ <tr><td><kbd class="key">Esc</kbd></td><td>リアクションするのをやめる</td><td>-</td></tr>
+ </tbody>
+</table>
diff --git a/src/docs/de-DE/mfm.md b/src/docs/de-DE/mfm.md
new file mode 100644
index 0000000000..e237287acc
--- /dev/null
+++ b/src/docs/de-DE/mfm.md
@@ -0,0 +1,2 @@
+# MFM
+MFMは、Misskey Flavored Markdownの略で、Misskeyの様々な場所で使用できる専用のマークアップ言語です。 MFMで使用可能な構文は[MFMチートシート](/mfm-cheat-sheet)で確認できます。
diff --git a/src/docs/de-DE/mute.md b/src/docs/de-DE/mute.md
new file mode 100644
index 0000000000..5b1c99cd9b
--- /dev/null
+++ b/src/docs/de-DE/mute.md
@@ -0,0 +1,13 @@
+# Stummschalten
+
+ユーザーをミュートすると、そのユーザーに関する次のコンテンツがMisskeyに表示されなくなります:
+
+* タイムラインや投稿の検索結果内の、そのユーザーの投稿(およびそれらの投稿に対する返信やRenote)
+* そのユーザーからの通知
+* メッセージ履歴一覧内の、そのユーザーとのメッセージ履歴
+
+ユーザーをミュートするには、対象のユーザーのユーザーページに表示されている「ミュート」ボタンを押します。
+
+ミュートを行ったことは相手に通知されず、ミュートされていることを知ることもできません。
+
+設定>ミュート から、自分がミュートしているユーザー一覧を確認することができます。
diff --git a/src/docs/de-DE/pages.md b/src/docs/de-DE/pages.md
new file mode 100644
index 0000000000..60f04b9dec
--- /dev/null
+++ b/src/docs/de-DE/pages.md
@@ -0,0 +1,10 @@
+# Pages
+
+## Variablen
+変数を使うことで動的なページを作成できます。テキスト内で <b>{ 変数名 }</b> と書くとそこに変数の値を埋め込めます。例えば <b>Hello { thing } world!</b> というテキストで、変数(thing)の値が <b>ai</b> だった場合、テキストは <b>Hello ai world!</b> になります。
+
+変数の評価(値を算出すること)は上から下に行われるので、ある変数の中で自分より下の変数を参照することはできません。例えば上から <b>A、B、C</b> と3つの変数を定義したとき、<b>C</b>の中で<b>A</b>や<b>B</b>を参照することはできますが、<b>A</b>の中で<b>B</b>や<b>C</b>を参照することはできません。
+
+ユーザーからの入力を受け取るには、ページに「ユーザー入力」ブロックを設置し、「変数名」に入力を格納したい変数名を設定します(変数は自動で作成されます)。その変数を使ってユーザー入力に応じた動作を行えます。
+
+関数を使うと、値の算出処理を再利用可能な形にまとめることができます。関数を作るには、「関数」タイプの変数を作成します。関数にはスロット(引数)を設定することができ、スロットの値は関数内で変数として利用可能です。また、関数を引数に取る関数(高階関数と呼ばれます)も存在します。関数は予め定義しておくほかに、このような高階関数のスロットに即席でセットすることもできます。
diff --git a/src/docs/de-DE/reaction.md b/src/docs/de-DE/reaction.md
new file mode 100644
index 0000000000..12537af7f3
--- /dev/null
+++ b/src/docs/de-DE/reaction.md
@@ -0,0 +1,11 @@
+# Reaktionen
+他の人のノートに、絵文字を付けて簡単にあなたの反応を伝えられる機能です。 リアクションするには、ノートの + アイコンをクリックしてピッカーを表示し、絵文字を選択します。 リアクションには[カスタム絵文字](./custom-emoji)も使用できます。
+
+## リアクションピッカーのカスタマイズ
+ピッカーに表示される絵文字を自分好みにカスタマイズすることができます。 設定の「リアクション」で設定します。
+
+## リモート投稿へのリアクションについて
+リアクションはMisskeyオリジナルの機能であるため、リモートインスタンスがMisskeyでない限りは、ほとんどの場合「Like」としてアクティビティが送信されます。一般的にはLikeは「お気に入り」として実装されているようです。 また、相手がMisskeyであったとしても、カスタム絵文字リアクションは伝わらず、自動的に「👍」等にフォールバックされます。
+
+## リモートからのリアクションについて
+リモートから「Like」アクティビティを受信したとき、Misskeyでは「👍」のリアクションとして解釈されます。
diff --git a/src/docs/de-DE/reversi-bot.md b/src/docs/de-DE/reversi-bot.md
new file mode 100644
index 0000000000..3ffb1ee244
--- /dev/null
+++ b/src/docs/de-DE/reversi-bot.md
@@ -0,0 +1,160 @@
+# MisskeyリバーシBotの開発
+Misskeyのリバーシ機能に対応したBotの開発方法をここに記します。
+
+1. `games/reversi`ストリームに以下のパラメータを付けて接続する:
+ * `i`: botアカウントのAPIキー
+
+2. 対局への招待が来たら、ストリームから`invited`イベントが流れてくる
+ * イベントの中身に、`parent`という名前で対局へ誘ってきたユーザーの情報が含まれている
+
+3. `games/reversi/match`へ、`user_id`として`parent`の`id`が含まれたリクエストを送信する
+
+4. 上手くいくとゲーム情報が返ってくるので、`games/reversi-game`ストリームへ、以下のパラメータを付けて接続する:
+ * `i`: botアカウントのAPIキー
+ * `game`: `game`の`id`
+
+5. この間、相手がゲームの設定を変更するとその都度`update-settings`イベントが流れてくるので、必要であれば何かしらの処理を行う
+
+6. 設定に満足したら、`{ type: 'accept' }`メッセージをストリームに送信する
+
+7. ゲームが開始すると、`started`イベントが流れてくる
+ * イベントの中身にはゲーム情報が含まれている
+
+8. 石を打つには、ストリームに`{ type: 'set', pos: <位置> }`を送信する(位置の計算方法は後述)
+
+9. 相手または自分が石を打つと、ストリームから`set`イベントが流れてくる
+ * `color`として石の色が含まれている
+ * `pos`として位置情報が含まれている
+
+## 位置の計算法
+8x8のマップを考える場合、各マスの位置(インデックスと呼びます)は次のようになっています:
+```
++--+--+--+--+--+--+--+--+
+| 0| 1| 2| 3| 4| 5| 6| 7|
++--+--+--+--+--+--+--+--+
+| 8| 9|10|11|12|13|14|15|
++--+--+--+--+--+--+--+--+
+|16|17|18|19|20|21|22|23|
+...
+```
+
+### X,Y座標 から インデックス に変換する
+```
+pos = x + (y * mapWidth)
+```
+`mapWidth`は、ゲーム情報の`map`から、次のようにして計算できます:
+```
+mapWidth = map[0].length
+```
+
+### インデックス から X,Y座標 に変換する
+```
+x = pos % mapWidth
+y = Math.floor(pos / mapWidth)
+```
+
+## マップ情報
+マップ情報は、ゲーム情報の`map`に入っています。 文字列の配列になっており、ひとつひとつの文字がマス情報を表しています。 それをもとにマップのデザインを知る事が出来ます:
+* `(スペース)` ... マス無し
+* `-` ... マス
+* `b` ... 初期配置される黒石
+* `w` ... 初期配置される白石
+
+例えば、4*4の次のような単純なマップがあるとします:
+```text
++---+---+---+---+
+| | | | |
++---+---+---+---+
+| | ○ | ● | |
++---+---+---+---+
+| | ● | ○ | |
++---+---+---+---+
+| | | | |
++---+---+---+---+
+```
+
+この場合、マップデータはこのようになります:
+```javascript
+['----', '-wb-', '-bw-', '----']
+```
+
+## ユーザーにフォームを提示して対話可能Botを作成する
+ユーザーとのコミュニケーションを行うため、ゲームの設定画面でユーザーにフォームを提示することができます。 例えば、Botの強さをユーザーが設定できるようにする、といったシナリオが考えられます。
+
+フォームを提示するには、`reversi-game`ストリームに次のメッセージを送信します:
+```javascript
+{
+ type: 'init-form',
+ body: [フォームコントロールの配列]
+}
+```
+
+フォームコントロールの配列については今から説明します。 フォームコントロールは、次のようなオブジェクトです:
+```javascript
+{
+ id: 'switch1',
+ type: 'switch',
+ label: 'Enable hoge',
+ value: false
+}
+```
+`id` ... コントロールのID。 `type` ... コントロールの種類。後述します。 `label` ... コントロールと一緒に表記するテキスト。 `value` ... コントロールのデフォルト値。
+
+### フォームの操作を受け取る
+ユーザーがフォームを操作すると、ストリームから`update-form`イベントが流れてきます。 イベントの中身には、コントロールのIDと、ユーザーが設定した値が含まれています。 例えば、上で示したスイッチをユーザーがオンにしたとすると、次のイベントが流れてきます:
+```javascript
+{
+ id: 'switch1',
+ value: true
+}
+```
+
+### フォームコントロールの種類
+#### Fallunterscheidung
+type: `switch` スイッチを表示します。何かの機能をオン/オフさせたい場合に有用です。
+
+##### プロパティ
+`label` ... スイッチに表記するテキスト。
+
+#### ラジオボタン
+type: `radio` ラジオボタンを表示します。選択肢を提示するのに有用です。例えば、Botの強さを設定させるなどです。
+
+##### プロパティ
+`items` ... ラジオボタンの選択肢。例:
+```javascript
+items: [{
+ label: '弱',
+ value: 1
+}, {
+ label: '中',
+ value: 2
+}, {
+ label: '強',
+ value: 3
+}]
+```
+
+#### スライダー
+type: `slider` スライダーを表示します。
+
+##### プロパティ
+`min` ... スライダーの下限。 `max` ... スライダーの上限。 `step` ... 入力欄で刻むステップ値。
+
+#### テキストボックス
+type: `textbox` テキストボックスを表示します。ユーザーになにか入力させる一般的な用途に利用できます。
+
+## ユーザーにメッセージを表示する
+設定画面でユーザーと対話する、フォーム以外のもうひとつの方法がこれです。ユーザーになにかメッセージを表示することができます。 例えば、ユーザーがBotの対応していないモードやマップを選択したとき、警告を表示するなどです。 メッセージを表示するには、次のメッセージをストリームに送信します:
+```javascript
+{
+ type: 'message',
+ body: {
+ text: 'メッセージ内容',
+ type: 'メッセージの種類'
+ }
+}
+```
+メッセージの種類: `success`, `info`, `warning`, `error`。
+
+## 投了する
+投了をするには、<a href="./api/endpoints/games/reversi/games/surrender">このエンドポイント</a>にリクエストします。
diff --git a/src/docs/de-DE/stream.md b/src/docs/de-DE/stream.md
new file mode 100644
index 0000000000..0fe76149b0
--- /dev/null
+++ b/src/docs/de-DE/stream.md
@@ -0,0 +1,354 @@
+# ストリーミングAPI
+
+ストリーミングAPIを使うと、リアルタイムで様々な情報(例えばタイムラインに新しい投稿が流れてきた、メッセージが届いた、フォローされた、など)を受け取ったり、様々な操作を行ったりすることができます。
+
+## ストリームに接続する
+
+ストリーミングAPIを利用するには、まずMisskeyサーバーに**websocket**接続する必要があります。
+
+以下のURLに、`i`というパラメータ名で認証情報を含めて、websocket接続してください。例:
+```
+%WS_URL%/streaming?i=xxxxxxxxxxxxxxx
+```
+
+認証情報は、自分のAPIキーや、アプリケーションからストリームに接続する際はユーザーのアクセストークンのことを指します。
+
+<div class="ui info">
+ <p><i class="fas fa-info-circle"></i> 認証情報の取得については、<a href="./api">こちらのドキュメント</a>をご確認ください。</p>
+</div>
+
+---
+
+認証情報は省略することもできますが、その場合非ログインでの利用ということになり、受信できる情報や可能な操作は限られます。例:
+
+```
+%WS_URL%/streaming
+```
+
+---
+
+ストリームに接続すると、後述するAPI操作や、投稿の購読を行ったりすることができます。 しかしまだこの段階では、例えばタイムラインへの新しい投稿を受信したりすることはできません。 それを行うには、ストリーム上で、後述する**チャンネル**に接続する必要があります。
+
+**ストリームでのやり取りはすべてJSONです。**
+
+## Kanäle
+MisskeyのストリーミングAPIにはチャンネルという概念があります。これは、送受信する情報を分離するための仕組みです。 Misskeyのストリームに接続しただけでは、まだリアルタイムでタイムラインの投稿を受信したりはできません。 ストリーム上でチャンネルに接続することで、様々な情報を受け取ったり情報を送信したりすることができるようになります。
+
+### チャンネルに接続する
+チャンネルに接続するには、次のようなデータをJSONでストリームに送信します:
+
+```json
+{
+ type: 'connect',
+ body: {
+ channel: 'xxxxxxxx',
+ id: 'foobar',
+ params: {
+ ...
+ }
+ }
+}
+```
+
+ここで、
+* `channel`には接続したいチャンネル名を設定します。チャンネルの種類については後述します。
+* `id`にはそのチャンネルとやり取りするための任意のIDを設定します。ストリームでは様々なメッセージが流れるので、そのメッセージがどのチャンネルからのものなのか識別する必要があるからです。このIDは、UUIDや、乱数のようなもので構いません。
+* `params`はチャンネルに接続する際のパラメータです。チャンネルによって接続時に必要とされるパラメータは異なります。パラメータ不要のチャンネルに接続する際は、このプロパティは省略可能です。
+
+<div class="ui info">
+ <p><i class="fas fa-info-circle"></i> IDはチャンネルごとではなく「チャンネルの接続ごと」です。なぜなら、同じチャンネルに異なるパラメータで複数接続するケースもあるからです。</p>
+</div>
+
+### チャンネルからのメッセージを受け取る
+例えばタイムラインのチャンネルなら、新しい投稿があった時にメッセージを発します。そのメッセージを受け取ることで、タイムラインに新しい投稿がされたことをリアルタイムで知ることができます。
+
+チャンネルがメッセージを発すると、次のようなデータがJSONでストリームに流れてきます:
+```json
+{
+ type: 'channel',
+ body: {
+ id: 'foobar',
+ type: 'something',
+ body: {
+ some: 'thing'
+ }
+ }
+}
+```
+
+ここで、
+* `id`には前述したそのチャンネルに接続する際に設定したIDが設定されています。これで、このメッセージがどのチャンネルからのものなのか知ることができます。
+* `type`にはメッセージの種類が設定されます。チャンネルによって、どのような種類のメッセージが流れてくるかは異なります。
+* `body`にはメッセージの内容が設定されます。チャンネルによって、どのような内容のメッセージが流れてくるかは異なります。
+
+### チャンネルに向けてメッセージを送信する
+チャンネルによっては、メッセージを受け取るだけでなく、こちらから何かメッセージを送信し、何らかの操作を行える場合があります。
+
+チャンネルにメッセージを送信するには、次のようなデータをJSONでストリームに送信します:
+```json
+{
+ type: 'channel',
+ body: {
+ id: 'foobar',
+ type: 'something',
+ body: {
+ some: 'thing'
+ }
+ }
+}
+```
+
+ここで、
+* `id`には前述したそのチャンネルに接続する際に設定したIDを設定します。これで、このメッセージがどのチャンネルに向けたものなのか識別させることができます。
+* `type`にはメッセージの種類を設定します。チャンネルによって、どのような種類のメッセージを受け付けるかは異なります。
+* `body`にはメッセージの内容を設定します。チャンネルによって、どのような内容のメッセージを受け付けるかは異なります。
+
+### チャンネルから切断する
+チャンネルから切断するには、次のようなデータをJSONでストリームに送信します:
+
+```json
+{
+ type: 'disconnect',
+ body: {
+ id: 'foobar'
+ }
+}
+```
+
+ここで、
+* `id`には前述したそのチャンネルに接続する際に設定したIDを設定します。
+
+## ストリームを経由してAPIリクエストする
+
+ストリームを経由してAPIリクエストすると、HTTPリクエストを発生させずにAPIを利用できます。そのため、コードを簡潔にできたり、パフォーマンスの向上を見込めるかもしれません。
+
+ストリームを経由してAPIリクエストするには、次のようなデータをJSONでストリームに送信します:
+```json
+{
+ type: 'api',
+ body: {
+ id: 'xxxxxxxxxxxxxxxx',
+ endpoint: 'notes/create',
+ data: {
+ text: 'yee haw!'
+ }
+ }
+}
+```
+
+ここで、
+* `id`には、APIのレスポンスを識別するための、APIリクエストごとの一意なIDを設定する必要があります。UUIDや、簡単な乱数のようなもので構いません。
+* `endpoint`には、あなたがリクエストしたいAPIのエンドポイントを指定します。
+* `data`には、エンドポイントのパラメータを含めます。
+
+<div class="ui info">
+ <p><i class="fas fa-info-circle"></i> APIのエンドポイントやパラメータについてはAPIリファレンスをご確認ください。</p>
+</div>
+
+### レスポンスの受信
+
+APIへリクエストすると、レスポンスがストリームから次のような形式で流れてきます。
+
+```json
+{
+ type: 'api:xxxxxxxxxxxxxxxx',
+ body: {
+ ...
+ }
+}
+```
+
+ここで、
+* `xxxxxxxxxxxxxxxx`の部分には、リクエストの際に設定された`id`が含まれています。これにより、どのリクエストに対するレスポンスなのか判別することができます。
+* `body`には、レスポンスが含まれています。
+
+## 投稿のキャプチャ
+
+Misskeyは投稿のキャプチャと呼ばれる仕組みを提供しています。これは、指定した投稿のイベントをストリームで受け取る機能です。
+
+例えばタイムラインを取得してユーザーに表示したとします。ここで誰かがそのタイムラインに含まれるどれかの投稿に対してリアクションしたとします。
+
+しかし、クライアントからするとある投稿にリアクションが付いたことなどは知る由がないため、リアルタイムでリアクションをタイムライン上の投稿に反映して表示するといったことができません。
+
+この問題を解決するために、Misskeyは投稿のキャプチャ機構を用意しています。投稿をキャプチャすると、その投稿に関するイベントを受け取ることができるため、リアルタイムでリアクションを反映させたりすることが可能になります。
+
+### 投稿をキャプチャする
+
+投稿をキャプチャするには、ストリームに次のようなメッセージを送信します:
+
+```json
+{
+ type: 'subNote',
+ body: {
+ id: 'xxxxxxxxxxxxxxxx'
+ }
+}
+```
+
+ここで、
+* `id`にキャプチャしたい投稿の`id`を設定します。
+
+このメッセージを送信すると、Misskeyにキャプチャを要請したことになり、以後、その投稿に関するイベントが流れてくるようになります。
+
+例えば投稿にリアクションが付いたとすると、次のようなメッセージが流れてきます:
+
+```json
+{
+ type: 'noteUpdated',
+ body: {
+ id: 'xxxxxxxxxxxxxxxx',
+ type: 'reacted',
+ body: {
+ reaction: 'like',
+ userId: 'yyyyyyyyyyyyyyyy'
+ }
+ }
+}
+```
+
+ここで、
+* `body`内の`id`に、イベントを発生させた投稿のIDが設定されます。
+* `body`内の`type`に、イベントの種類が設定されます。
+* `body`内の`body`に、イベントの詳細が設定されます。
+
+#### イベントの種類
+
+##### `reacted`
+その投稿にリアクションがされた時に発生します。
+
+* `reaction`に、リアクションの種類が設定されます。
+* `userId`に、リアクションを行ったユーザーのIDが設定されます。
+
+例:
+```json
+{
+ type: 'noteUpdated',
+ body: {
+ id: 'xxxxxxxxxxxxxxxx',
+ type: 'reacted',
+ body: {
+ reaction: 'like',
+ userId: 'yyyyyyyyyyyyyyyy'
+ }
+ }
+}
+```
+
+##### `deleted`
+その投稿が削除された時に発生します。
+
+* `deletedAt`に、削除日時が設定されます。
+
+例:
+```json
+{
+ type: 'noteUpdated',
+ body: {
+ id: 'xxxxxxxxxxxxxxxx',
+ type: 'deleted',
+ body: {
+ deletedAt: '2018-10-22T02:17:09.703Z'
+ }
+ }
+}
+```
+
+##### `pollVoted`
+その投稿に添付されたアンケートに投票された時に発生します。
+
+* `choice`に、選択肢IDが設定されます。
+* `userId`に、投票を行ったユーザーのIDが設定されます。
+
+例:
+```json
+{
+ type: 'noteUpdated',
+ body: {
+ id: 'xxxxxxxxxxxxxxxx',
+ type: 'pollVoted',
+ body: {
+ choice: 2,
+ userId: 'yyyyyyyyyyyyyyyy'
+ }
+ }
+}
+```
+
+### 投稿のキャプチャを解除する
+
+その投稿がもう画面に表示されなくなったりして、その投稿に関するイベントをもう受け取る必要がなくなったときは、キャプチャの解除を申請してください。
+
+次のメッセージを送信します:
+
+```json
+{
+ type: 'unsubNote',
+ body: {
+ id: 'xxxxxxxxxxxxxxxx'
+ }
+}
+```
+
+ここで、
+* `id`にキャプチャを解除したい投稿の`id`を設定します。
+
+このメッセージを送信すると、以後、その投稿に関するイベントは流れてこないようになります。
+
+# チャンネル一覧
+## `main`
+アカウントに関する基本的な情報が流れてきます。このチャンネルにパラメータはありません。
+
+### 流れてくるイベント一覧
+
+#### `renote`
+自分の投稿がRenoteされた時に発生するイベントです。自分自身の投稿をRenoteしたときは発生しません。
+
+#### `mention`
+誰かからメンションされたときに発生するイベントです。
+
+#### `readAllNotifications`
+自分宛ての通知がすべて既読になったことを表すイベントです。このイベントを利用して、「通知があることを示すアイコン」のようなものをオフにしたりする等のケースが想定されます。
+
+#### `meUpdated`
+自分の情報が更新されたことを表すイベントです。
+
+#### `follow`
+自分が誰かをフォローしたときに発生するイベントです。
+
+#### `unfollow`
+自分が誰かのフォローを解除したときに発生するイベントです。
+
+#### `followed`
+自分が誰かにフォローされたときに発生するイベントです。
+
+## `homeTimeline`
+ホームタイムラインの投稿情報が流れてきます。このチャンネルにパラメータはありません。
+
+### 流れてくるイベント一覧
+
+#### `note`
+タイムラインに新しい投稿が流れてきたときに発生するイベントです。
+
+## `localTimeline`
+ローカルタイムラインの投稿情報が流れてきます。このチャンネルにパラメータはありません。
+
+### 流れてくるイベント一覧
+
+#### `note`
+ローカルタイムラインに新しい投稿が流れてきたときに発生するイベントです。
+
+## `hybridTimeline`
+ソーシャルタイムラインの投稿情報が流れてきます。このチャンネルにパラメータはありません。
+
+### 流れてくるイベント一覧
+
+#### `note`
+ソーシャルタイムラインに新しい投稿が流れてきたときに発生するイベントです。
+
+## `globalTimeline`
+グローバルタイムラインの投稿情報が流れてきます。このチャンネルにパラメータはありません。
+
+### 流れてくるイベント一覧
+
+#### `note`
+グローバルタイムラインに新しい投稿が流れてきたときに発生するイベントです。
diff --git a/src/docs/de-DE/theme.md b/src/docs/de-DE/theme.md
new file mode 100644
index 0000000000..c3e10ce569
--- /dev/null
+++ b/src/docs/de-DE/theme.md
@@ -0,0 +1,68 @@
+# Farbthemen
+
+テーマを設定して、Misskeyクライアントの見た目を変更できます。
+
+## テーマの設定
+設定 > テーマ
+
+## テーマを作成する
+テーマコードはJSON5で記述されたテーマオブジェクトです。 テーマは以下のようなオブジェクトです。
+``` js
+{
+ id: '17587283-dd92-4a2c-a22c-be0637c9e22a',
+
+ name: 'Danboard',
+ author: 'syuilo',
+
+ base: 'light',
+
+ props: {
+ accent: 'rgb(218, 141, 49)',
+ bg: 'rgb(218, 212, 190)',
+ fg: 'rgb(115, 108, 92)',
+ panel: 'rgb(236, 232, 220)',
+ renote: 'rgb(100, 152, 106)',
+ link: 'rgb(100, 152, 106)',
+ mention: '@accent',
+ hashtag: 'rgb(100, 152, 106)',
+ header: 'rgba(239, 227, 213, 0.75)',
+ navBg: 'rgb(216, 206, 182)',
+ inputBorder: 'rgba(0, 0, 0, 0.1)',
+ },
+}
+
+```
+
+* `id` ... テーマの一意なID。UUIDをおすすめします。
+* `name` ... テーマ名
+* `author` ... テーマの作者
+* `desc` ... テーマの説明(オプション)
+* `base` ... 明るいテーマか、暗いテーマか
+ * `light`にすると明るいテーマになり、`dark`にすると暗いテーマになります。
+ * テーマはここで設定されたベーステーマを継承します。
+* `props` ... テーマのスタイル定義。これから説明します。
+
+### テーマのスタイル定義
+`props`下にはテーマのスタイルを定義します。 キーがCSSの変数名になり、バリューで中身を指定します。 なお、この`props`オブジェクトはベーステーマから継承されます。 ベーステーマは、このテーマの`base`が`light`なら[_light.json5](https://github.com/syuilo/misskey/blob/develop/src/client/themes/_light.json5)で、`dark`なら[_dark.json5](https://github.com/syuilo/misskey/blob/develop/src/client/themes/_dark.json5)です。 つまり、このテーマ内の`props`に`panel`というキーが無くても、そこにはベーステーマの`panel`があると見なされます。
+
+#### バリューで使える構文
+* 16進数で表された色
+ * 例: `#00ff00`
+* `rgb(r, g, b)`形式で表された色
+ * 例: `rgb(0, 255, 0)`
+* `rgb(r, g, b, a)`形式で表された透明度を含む色
+ * 例: `rgba(0, 255, 0, 0.5)`
+* 他のキーの値の参照
+ * `@{キー名}`と書くと他のキーの値の参照になります。`{キー名}`は参照したいキーの名前に置き換えます。
+ * 例: `@panel`
+* 定数(後述)の参照
+ * `${定数名}`と書くと定数の参照になります。`{定数名}`は参照したい定数の名前に置き換えます。
+ * 例: `$main`
+* 関数(後述)
+ * `:{関数名}<{引数}<{色}`
+
+#### Konstante
+「CSS変数として出力はしたくないが、他のCSS変数の値として使いまわしたい」値があるときは、定数を使うと便利です。 キー名を`$`で始めると、そのキーはCSS変数として出力されません。
+
+#### Funktionen
+wip
diff --git a/src/docs/de-DE/timelines.md b/src/docs/de-DE/timelines.md
new file mode 100644
index 0000000000..01bf294d5f
--- /dev/null
+++ b/src/docs/de-DE/timelines.md
@@ -0,0 +1,15 @@
+# タイムラインの比較
+
+https://docs.google.com/spreadsheets/d/1lxQ2ugKrhz58Bg96HTDK_2F98BUritkMyIiBkOByjHA/edit?usp=sharing
+
+## Home
+自分のフォローしているユーザーの投稿
+
+## Lokal
+全てのローカルユーザーの「ホーム」指定されていない投稿
+
+## Sozial
+自分のフォローしているユーザーの投稿と、全てのローカルユーザーの「ホーム」指定されていない投稿
+
+## Global
+全てのローカルユーザーの「ホーム」指定されていない投稿と、サーバーに届いた全てのリモートユーザーの「ホーム」指定されていない投稿
diff --git a/src/docs/en-US/aiscript.md b/src/docs/en-US/aiscript.md
new file mode 100644
index 0000000000..fb125a89e2
--- /dev/null
+++ b/src/docs/en-US/aiscript.md
@@ -0,0 +1,4 @@
+# AiScript
+
+## Functions
+デフォルトで値渡しです。
diff --git a/src/docs/en-US/api.md b/src/docs/en-US/api.md
new file mode 100644
index 0000000000..76019b6145
--- /dev/null
+++ b/src/docs/en-US/api.md
@@ -0,0 +1,58 @@
+# Misskey API
+
+MisskeyAPIを使ってMisskeyクライアント、Misskey連携Webサービス、Bot等(以下「アプリケーション」と呼びます)を開発できます。 ストリーミングAPIもあるので、リアルタイム性のあるアプリケーションを作ることも可能です。
+
+APIを使い始めるには、まずアクセストークンを取得する必要があります。 このドキュメントでは、アクセストークンを取得する手順を説明した後、基本的なAPIの使い方を説明します。
+
+## アクセストークンの取得
+基本的に、APIはリクエストにはアクセストークンが必要となります。 APIにリクエストするのが自分自身なのか、不特定の利用者に使ってもらうアプリケーションなのかによって取得手順は異なります。
+
+* 前者の場合: [「自分自身のアクセストークンを手動発行する」](#自分自身のアクセストークンを手動発行する)に進む
+* 後者の場合: [「アプリケーション利用者にアクセストークンの発行をリクエストする」](#アプリケーション利用者にアクセストークンの発行をリクエストする)に進む
+
+### 自分自身のアクセストークンを手動発行する
+「設定 > API」で、自分のアクセストークンを発行できます。
+
+[「APIの使い方」へ進む](#APIの使い方)
+
+### アプリケーション利用者にアクセストークンの発行をリクエストする
+アプリケーション利用者のアクセストークンを取得するには、以下の手順で発行をリクエストします。
+
+#### Step 1
+
+UUIDを生成する。以後これをセッションIDと呼びます。
+
+> このセッションIDは毎回生成し、使いまわさないようにしてください。
+
+#### Step 2
+
+`{_URL_}/miauth/{session}`をユーザーのブラウザで表示させる。`{session}`の部分は、セッションIDに置き換えてください。
+> 例: `{_URL_}/miauth/c1f6d42b-468b-4fd2-8274-e58abdedef6f`
+
+表示する際、URLにクエリパラメータとしていくつかのオプションを設定できます:
+* `name` ... アプリケーション名
+ * > 例: `MissDeck`
+* `icon` ... アプリケーションのアイコン画像URL
+ * > 例: `https://missdeck.example.com/icon.png`
+* `callback` ... 認証が終わった後にリダイレクトするURL
+ * > 例: `https://missdeck.example.com/callback`
+ * リダイレクト時には、`session`というクエリパラメータでセッションIDが付きます
+* `permission` ... アプリケーションが要求する権限
+ * > 例: `write:notes,write:following,read:drive`
+ * 要求する権限を`,`で区切って列挙します
+ * どのような権限があるかは[APIリファレンス](/api-doc)で確認できます
+
+#### Step 3
+ユーザーが発行を許可した後、`{_URL_}/api/miauth/{session}/check`にPOSTリクエストすると、レスポンスとしてアクセストークンを含むJSONが返ります。
+
+レスポンスに含まれるプロパティ:
+* `token` ... ユーザーのアクセストークン
+* `user` ... ユーザーの情報
+
+[「APIの使い方」へ進む](#APIの使い方)
+
+## APIの使い方
+**APIはすべてPOSTで、リクエスト/レスポンスともにJSON形式です。RESTではありません。** アクセストークンは、`i`というパラメータ名でリクエストに含めます。
+
+* [APIリファレンス](/api-doc)
+* [ストリーミングAPI](./stream)
diff --git a/src/docs/en-US/create-plugin.md b/src/docs/en-US/create-plugin.md
new file mode 100644
index 0000000000..ec17b95186
--- /dev/null
+++ b/src/docs/en-US/create-plugin.md
@@ -0,0 +1,74 @@
+# プラグインの作成
+Misskey Webクライアントのプラグイン機能を使うと、クライアントを拡張し、様々な機能を追加できます。 ここではプラグインの作成にあたってのメタデータ定義や、AiScript APIリファレンスを掲載します。
+
+## Metadata
+プラグインは、AiScriptのメタデータ埋め込み機能を使って、デフォルトとしてプラグインのメタデータを定義する必要があります。 メタデータは次のプロパティを含むオブジェクトです。
+
+### name
+プラグイン名
+
+### author
+プラグイン作者
+
+### version
+プラグインバージョン。数値を指定してください。
+
+### description
+プラグインの説明
+
+### permissions
+プラグインが要求する権限。MisskeyAPIにリクエストする際に用いられます。
+
+### config
+プラグインの設定情報を表すオブジェクト。 キーに設定名、値に以下のプロパティを含めます。
+
+#### type
+設定値の種類を表す文字列。以下から選択します。 string number boolean
+
+#### label
+ユーザーに表示する設定名
+
+#### description
+設定の説明
+
+#### default
+設定のデフォルト値
+
+## APIリファレンス
+AiScript標準で組み込まれているAPIは掲載しません。
+
+### Mk:dialog(title text type)
+ダイアログを表示します。typeには以下の値が設定できます。 info success warn error question 省略すると info になります。
+
+### Mk:confirm(title text type)
+確認ダイアログを表示します。typeには以下の値が設定できます。 info success warn error question 省略すると question になります。 ユーザーが"OK"を選択した場合は true を、"キャンセル"を選択した場合は false が返ります。
+
+### Mk:api(endpoint params)
+Misskey APIにリクエストします。第一引数にエンドポイント名、第二引数にパラメータオブジェクトを渡します。
+
+### Mk:save(key value)
+任意の値に任意の名前を付けて永続化します。永続化した値は、AiScriptコンテキストが終了しても残り、Mk:loadで読み取ることができます。
+
+### Mk:load(key)
+Mk:saveで永続化した指定の名前の値を読み取ります。
+
+### Plugin:register_post_form_action(title fn)
+投稿フォームにアクションを追加します。第一引数にアクション名、第二引数にアクションが選択された際のコールバック関数を渡します。 コールバック関数には、第一引数に投稿フォームオブジェクトが渡されます。
+
+### Plugin:register_note_action(title fn)
+ノートメニューに項目を追加します。第一引数に項目名、第二引数に項目が選択された際のコールバック関数を渡します。 コールバック関数には、第一引数に対象のノートオブジェクトが渡されます。
+
+### Plugin:register_user_action(title fn)
+ユーザーメニューに項目を追加します。第一引数に項目名、第二引数に項目が選択された際のコールバック関数を渡します。 コールバック関数には、第一引数に対象のユーザーオブジェクトが渡されます。
+
+### Plugin:register_note_view_interruptor(fn)
+UIに表示されるノート情報を書き換えます。 コールバック関数には、第一引数に対象のノートオブジェクトが渡されます。 コールバック関数の返り値でノートが書き換えられます。
+
+### Plugin:register_note_post_interruptor(fn)
+ノート投稿時にノート情報を書き換えます。 コールバック関数には、第一引数に対象のノートオブジェクトが渡されます。 コールバック関数の返り値でノートが書き換えられます。
+
+### Plugin:open_url(url)
+第一引数に渡されたURLをブラウザの新しいタブで開きます。
+
+### Plugin:config
+プラグインの設定が格納されるオブジェクト。プラグイン定義のconfigで設定したキーで値が入ります。
diff --git a/src/docs/en-US/custom-emoji.md b/src/docs/en-US/custom-emoji.md
new file mode 100644
index 0000000000..2bef4a563e
--- /dev/null
+++ b/src/docs/en-US/custom-emoji.md
@@ -0,0 +1,2 @@
+# Custom Emoji
+カスタム絵文字は、インスタンスで用意された画像を絵文字のように使える機能です。 ノート、リアクション、チャット、自己紹介、名前などの場所で使うことができます。 カスタム絵文字をそれらの場所で使うには、絵文字ピッカーボタン(ある場合)を押すか、`:`を入力して絵文字サジェストを表示します。 テキスト内に`:foo:`のような形式の文字列が見つかると、`foo`の部分がカスタム絵文字名と解釈され、表示時には対応したカスタム絵文字に置き換わります。
diff --git a/src/docs/en-US/deck.md b/src/docs/en-US/deck.md
new file mode 100644
index 0000000000..73e9efdaaf
--- /dev/null
+++ b/src/docs/en-US/deck.md
@@ -0,0 +1,18 @@
+# Deck
+
+デッキは利用可能なUIのひとつです。「カラム」と呼ばれるビューを複数並べて表示させることで、カスタマイズ性が高く、情報量の多いUIが構築できることが特徴です。
+
+## カラムの追加
+デッキの背景を右クリックし、「カラムを追加」して任意のカラムを追加できます。
+
+## カラムの移動
+カラムは、ドラッグアンドドロップで他のカラムと位置を入れ替えることが出来るほか、カラムメニュー(カラムのヘッダー右クリック)から位置を移動させることもできます。
+
+## カラムの水平分割
+カラムは左右だけでなく、上下に並べることもできます。 カラムメニューを開き、「左に重ねる」を選択すると、左のカラムの下に現在のカラムが移動します。 上下分割を解除するには、カラムメニューの「右に出す」を選択します。
+
+## カラムの設定
+カラムメニューの「編集」を選択するとカラムの設定を編集できます。カラムの名前を変えたり、幅を変えたりできます。
+
+## デッキの設定
+デッキに関する設定は、[settings/deck](/settings/deck)で行えます。
diff --git a/src/docs/en-US/follow.md b/src/docs/en-US/follow.md
new file mode 100644
index 0000000000..3e71012b5f
--- /dev/null
+++ b/src/docs/en-US/follow.md
@@ -0,0 +1,2 @@
+# Following
+ユーザーをフォローすると、タイムラインにそのユーザーの投稿が表示されるようになります。ただし、他のユーザーに対する返信は含まれません。 ユーザーをフォローするには、ユーザーページの「フォロー」ボタンをクリックします。フォローを解除するには、もう一度クリックします。
diff --git a/src/docs/en-US/keyboard-shortcut.md b/src/docs/en-US/keyboard-shortcut.md
new file mode 100644
index 0000000000..84ec552cd2
--- /dev/null
+++ b/src/docs/en-US/keyboard-shortcut.md
@@ -0,0 +1,68 @@
+# キーボードショートカット
+
+## Global
+これらのショートカットは基本的にどこでも使えます。
+<table>
+ <thead>
+ <tr><th>ショートカット</th><th>効果</th><th>由来</th></tr>
+ </thead>
+ <tbody>
+ <tr><td><kbd class="key">P</kbd>, <kbd class="key">N</kbd></td><td>新規投稿</td><td><b>P</b>ost, <b>N</b>ew, <b>N</b>ote</td></tr>
+ <tr><td><kbd class="key">T</kbd></td><td>タイムラインの最も新しい投稿にフォーカス</td><td><b>T</b>imeline, <b>T</b>op</td></tr>
+ <tr><td><kbd class="group"><kbd class="key">Shift</kbd> + <kbd class="key">N</kbd></kbd></td><td>通知を表示/隠す</td><td><b>N</b>otifications</td></tr>
+ <tr><td><kbd class="key">S</kbd></td><td>Search</td><td><b>S</b>earch</td></tr>
+ <tr><td><kbd class="key">H</kbd>, <kbd class="key">?</kbd></td><td>ヘルプを表示</td><td><b>H</b>elp</td></tr>
+ </tbody>
+</table>
+
+## 投稿にフォーカスされた状態
+
+<table>
+ <thead>
+ <tr><th>ショートカット</th><th>効果</th><th>由来</th></tr>
+ </thead>
+ <tbody>
+ <tr><td><kbd class="key">↑</kbd>, <kbd class="key">K</kbd>, <kbd class="group"><kbd class="key">Shift</kbd> + <kbd class="key">Tab</kbd></kbd></td><td>上の投稿にフォーカスを移動</td><td>-</td></tr>
+ <tr><td><kbd class="key">↓</kbd>, <kbd class="key">J</kbd>, <kbd class="key">Tab</kbd></td><td>下の投稿にフォーカスを移動</td><td>-</td></tr>
+ <tr><td><kbd class="key">R</kbd></td><td>返信フォームを開く</td><td><b>R</b>eply</td></tr>
+ <tr><td><kbd class="key">Q</kbd></td><td>Renoteフォームを開く</td><td><b>Q</b>uote</td></tr>
+ <tr><td><kbd class="group"><kbd class="key">Ctrl</kbd> + <kbd class="key">Q</kbd></kbd></td><td>即刻Renoteする(フォームを開かずに)</td><td>-</td></tr>
+ <tr><td><kbd class="key">E</kbd>, <kbd class="key">A</kbd>, <kbd class="key">+</kbd></td><td>リアクションフォームを開く</td><td><b>E</b>mote, re<b>A</b>ction</td></tr>
+ <tr><td><kbd class="key">0</kbd>~<kbd class="key">9</kbd></td><td>数字に対応したリアクションをする(対応については後述)</td><td>-</td></tr>
+ <tr><td><kbd class="key">F</kbd>, <kbd class="key">B</kbd></td><td>お気に入りに登録</td><td><b>F</b>avorite, <b>B</b>ookmark</td></tr>
+ <tr><td><kbd class="key">Del</kbd>, <kbd class="group"><kbd class="key">Ctrl</kbd> + <kbd class="key">D</kbd></kbd></td><td>投稿を削除</td><td><b>D</b>elete</tr>
+ <tr><td><kbd class="key">M</kbd>, <kbd class="key">O</kbd></td><td>投稿に対するメニューを開く</td><td><b>M</b>ore, <b>O</b>ther</td></tr>
+ <tr><td><kbd class="key">S</kbd></td><td>CWで隠された部分を表示 or 隠す</td><td><b>S</b>how, <b>S</b>ee</td></tr>
+ <tr><td><kbd class="key">Esc</kbd></td><td>フォーカスを外す</td><td>-</td></tr>
+ </tbody>
+</table>
+
+## Renoteフォーム
+
+<table>
+ <thead>
+ <tr><th>ショートカット</th><th>効果</th><th>由来</th></tr>
+ </thead>
+ <tbody>
+ <tr><td><kbd class="key">Enter</kbd></td><td>Renoteする</td><td>-</td></tr>
+ <tr><td><kbd class="key">Q</kbd></td><td>フォームを展開する</td><td><b>Q</b>uote</td></tr>
+ <tr><td><kbd class="key">Esc</kbd></td><td>フォームを閉じる</td><td>-</td></tr>
+ </tbody>
+</table>
+
+## リアクションフォーム
+デフォルトで「👍」にフォーカスが当たっている状態です。
+<table>
+ <thead>
+ <tr><th>ショートカット</th><th>効果</th><th>由来</th></tr>
+ </thead>
+ <tbody>
+ <tr><td><kbd class="key">↑</kbd>, <kbd class="key">K</kbd></td><td>上のリアクションにフォーカスを移動</td><td>-</td></tr>
+ <tr><td><kbd class="key">↓</kbd>, <kbd class="key">J</kbd></td><td>下のリアクションにフォーカスを移動</td><td>-</td></tr>
+ <tr><td><kbd class="key">←</kbd>, <kbd class="key">H</kbd>, <kbd class="group"><kbd class="key">Shift</kbd> + <kbd class="key">Tab</kbd></kbd></td><td>左のリアクションにフォーカスを移動</td><td>-</td></tr>
+ <tr><td><kbd class="key">→</kbd>, <kbd class="key">L</kbd>, <kbd class="key">Tab</kbd></td><td>右のリアクションにフォーカスを移動</td><td>-</td></tr>
+ <tr><td><kbd class="key">Enter</kbd>, <kbd class="key">Space</kbd>, <kbd class="key">+</kbd></td><td>リアクション確定</td><td>-</td></tr>
+ <tr><td><kbd class="key">0</kbd>~<kbd class="key">9</kbd></td><td>数字に対応したリアクションで確定</td><td>-</td></tr>
+ <tr><td><kbd class="key">Esc</kbd></td><td>リアクションするのをやめる</td><td>-</td></tr>
+ </tbody>
+</table>
diff --git a/src/docs/en-US/mfm.md b/src/docs/en-US/mfm.md
new file mode 100644
index 0000000000..e237287acc
--- /dev/null
+++ b/src/docs/en-US/mfm.md
@@ -0,0 +1,2 @@
+# MFM
+MFMは、Misskey Flavored Markdownの略で、Misskeyの様々な場所で使用できる専用のマークアップ言語です。 MFMで使用可能な構文は[MFMチートシート](/mfm-cheat-sheet)で確認できます。
diff --git a/src/docs/en-US/mute.md b/src/docs/en-US/mute.md
new file mode 100644
index 0000000000..306beee570
--- /dev/null
+++ b/src/docs/en-US/mute.md
@@ -0,0 +1,13 @@
+# Mute
+
+ユーザーをミュートすると、そのユーザーに関する次のコンテンツがMisskeyに表示されなくなります:
+
+* タイムラインや投稿の検索結果内の、そのユーザーの投稿(およびそれらの投稿に対する返信やRenote)
+* そのユーザーからの通知
+* メッセージ履歴一覧内の、そのユーザーとのメッセージ履歴
+
+ユーザーをミュートするには、対象のユーザーのユーザーページに表示されている「ミュート」ボタンを押します。
+
+ミュートを行ったことは相手に通知されず、ミュートされていることを知ることもできません。
+
+設定>ミュート から、自分がミュートしているユーザー一覧を確認することができます。
diff --git a/src/docs/en-US/pages.md b/src/docs/en-US/pages.md
new file mode 100644
index 0000000000..7fc6ee29c3
--- /dev/null
+++ b/src/docs/en-US/pages.md
@@ -0,0 +1,10 @@
+# Pages
+
+## Variables
+変数を使うことで動的なページを作成できます。テキスト内で <b>{ 変数名 }</b> と書くとそこに変数の値を埋め込めます。例えば <b>Hello { thing } world!</b> というテキストで、変数(thing)の値が <b>ai</b> だった場合、テキストは <b>Hello ai world!</b> になります。
+
+変数の評価(値を算出すること)は上から下に行われるので、ある変数の中で自分より下の変数を参照することはできません。例えば上から <b>A、B、C</b> と3つの変数を定義したとき、<b>C</b>の中で<b>A</b>や<b>B</b>を参照することはできますが、<b>A</b>の中で<b>B</b>や<b>C</b>を参照することはできません。
+
+ユーザーからの入力を受け取るには、ページに「ユーザー入力」ブロックを設置し、「変数名」に入力を格納したい変数名を設定します(変数は自動で作成されます)。その変数を使ってユーザー入力に応じた動作を行えます。
+
+関数を使うと、値の算出処理を再利用可能な形にまとめることができます。関数を作るには、「関数」タイプの変数を作成します。関数にはスロット(引数)を設定することができ、スロットの値は関数内で変数として利用可能です。また、関数を引数に取る関数(高階関数と呼ばれます)も存在します。関数は予め定義しておくほかに、このような高階関数のスロットに即席でセットすることもできます。
diff --git a/src/docs/en-US/reaction.md b/src/docs/en-US/reaction.md
new file mode 100644
index 0000000000..917556e847
--- /dev/null
+++ b/src/docs/en-US/reaction.md
@@ -0,0 +1,11 @@
+# Reaction
+他の人のノートに、絵文字を付けて簡単にあなたの反応を伝えられる機能です。 リアクションするには、ノートの + アイコンをクリックしてピッカーを表示し、絵文字を選択します。 リアクションには[カスタム絵文字](./custom-emoji)も使用できます。
+
+## リアクションピッカーのカスタマイズ
+ピッカーに表示される絵文字を自分好みにカスタマイズすることができます。 設定の「リアクション」で設定します。
+
+## リモート投稿へのリアクションについて
+リアクションはMisskeyオリジナルの機能であるため、リモートインスタンスがMisskeyでない限りは、ほとんどの場合「Like」としてアクティビティが送信されます。一般的にはLikeは「お気に入り」として実装されているようです。 また、相手がMisskeyであったとしても、カスタム絵文字リアクションは伝わらず、自動的に「👍」等にフォールバックされます。
+
+## リモートからのリアクションについて
+リモートから「Like」アクティビティを受信したとき、Misskeyでは「👍」のリアクションとして解釈されます。
diff --git a/src/docs/en-US/reversi-bot.md b/src/docs/en-US/reversi-bot.md
new file mode 100644
index 0000000000..f1be888cb6
--- /dev/null
+++ b/src/docs/en-US/reversi-bot.md
@@ -0,0 +1,160 @@
+# MisskeyリバーシBotの開発
+Misskeyのリバーシ機能に対応したBotの開発方法をここに記します。
+
+1. `games/reversi`ストリームに以下のパラメータを付けて接続する:
+ * `i`: botアカウントのAPIキー
+
+2. 対局への招待が来たら、ストリームから`invited`イベントが流れてくる
+ * イベントの中身に、`parent`という名前で対局へ誘ってきたユーザーの情報が含まれている
+
+3. `games/reversi/match`へ、`user_id`として`parent`の`id`が含まれたリクエストを送信する
+
+4. 上手くいくとゲーム情報が返ってくるので、`games/reversi-game`ストリームへ、以下のパラメータを付けて接続する:
+ * `i`: botアカウントのAPIキー
+ * `game`: `game`の`id`
+
+5. この間、相手がゲームの設定を変更するとその都度`update-settings`イベントが流れてくるので、必要であれば何かしらの処理を行う
+
+6. 設定に満足したら、`{ type: 'accept' }`メッセージをストリームに送信する
+
+7. ゲームが開始すると、`started`イベントが流れてくる
+ * イベントの中身にはゲーム情報が含まれている
+
+8. 石を打つには、ストリームに`{ type: 'set', pos: <位置> }`を送信する(位置の計算方法は後述)
+
+9. 相手または自分が石を打つと、ストリームから`set`イベントが流れてくる
+ * `color`として石の色が含まれている
+ * `pos`として位置情報が含まれている
+
+## 位置の計算法
+8x8のマップを考える場合、各マスの位置(インデックスと呼びます)は次のようになっています:
+```
++--+--+--+--+--+--+--+--+
+| 0| 1| 2| 3| 4| 5| 6| 7|
++--+--+--+--+--+--+--+--+
+| 8| 9|10|11|12|13|14|15|
++--+--+--+--+--+--+--+--+
+|16|17|18|19|20|21|22|23|
+...
+```
+
+### X,Y座標 から インデックス に変換する
+```
+pos = x + (y * mapWidth)
+```
+`mapWidth`は、ゲーム情報の`map`から、次のようにして計算できます:
+```
+mapWidth = map[0].length
+```
+
+### インデックス から X,Y座標 に変換する
+```
+x = pos % mapWidth
+y = Math.floor(pos / mapWidth)
+```
+
+## マップ情報
+マップ情報は、ゲーム情報の`map`に入っています。 文字列の配列になっており、ひとつひとつの文字がマス情報を表しています。 それをもとにマップのデザインを知る事が出来ます:
+* `(スペース)` ... マス無し
+* `-` ... マス
+* `b` ... 初期配置される黒石
+* `w` ... 初期配置される白石
+
+例えば、4*4の次のような単純なマップがあるとします:
+```text
++---+---+---+---+
+| | | | |
++---+---+---+---+
+| | ○ | ● | |
++---+---+---+---+
+| | ● | ○ | |
++---+---+---+---+
+| | | | |
++---+---+---+---+
+```
+
+この場合、マップデータはこのようになります:
+```javascript
+['----', '-wb-', '-bw-', '----']
+```
+
+## ユーザーにフォームを提示して対話可能Botを作成する
+ユーザーとのコミュニケーションを行うため、ゲームの設定画面でユーザーにフォームを提示することができます。 例えば、Botの強さをユーザーが設定できるようにする、といったシナリオが考えられます。
+
+フォームを提示するには、`reversi-game`ストリームに次のメッセージを送信します:
+```javascript
+{
+ type: 'init-form',
+ body: [フォームコントロールの配列]
+}
+```
+
+フォームコントロールの配列については今から説明します。 フォームコントロールは、次のようなオブジェクトです:
+```javascript
+{
+ id: 'switch1',
+ type: 'switch',
+ label: 'Enable hoge',
+ value: false
+}
+```
+`id` ... コントロールのID。 `type` ... コントロールの種類。後述します。 `label` ... コントロールと一緒に表記するテキスト。 `value` ... コントロールのデフォルト値。
+
+### フォームの操作を受け取る
+ユーザーがフォームを操作すると、ストリームから`update-form`イベントが流れてきます。 イベントの中身には、コントロールのIDと、ユーザーが設定した値が含まれています。 例えば、上で示したスイッチをユーザーがオンにしたとすると、次のイベントが流れてきます:
+```javascript
+{
+ id: 'switch1',
+ value: true
+}
+```
+
+### フォームコントロールの種類
+#### Switch
+type: `switch` スイッチを表示します。何かの機能をオン/オフさせたい場合に有用です。
+
+##### プロパティ
+`label` ... スイッチに表記するテキスト。
+
+#### ラジオボタン
+type: `radio` ラジオボタンを表示します。選択肢を提示するのに有用です。例えば、Botの強さを設定させるなどです。
+
+##### プロパティ
+`items` ... ラジオボタンの選択肢。例:
+```javascript
+items: [{
+ label: '弱',
+ value: 1
+}, {
+ label: '中',
+ value: 2
+}, {
+ label: '強',
+ value: 3
+}]
+```
+
+#### スライダー
+type: `slider` スライダーを表示します。
+
+##### プロパティ
+`min` ... スライダーの下限。 `max` ... スライダーの上限。 `step` ... 入力欄で刻むステップ値。
+
+#### テキストボックス
+type: `textbox` テキストボックスを表示します。ユーザーになにか入力させる一般的な用途に利用できます。
+
+## ユーザーにメッセージを表示する
+設定画面でユーザーと対話する、フォーム以外のもうひとつの方法がこれです。ユーザーになにかメッセージを表示することができます。 例えば、ユーザーがBotの対応していないモードやマップを選択したとき、警告を表示するなどです。 メッセージを表示するには、次のメッセージをストリームに送信します:
+```javascript
+{
+ type: 'message',
+ body: {
+ text: 'メッセージ内容',
+ type: 'メッセージの種類'
+ }
+}
+```
+メッセージの種類: `success`, `info`, `warning`, `error`。
+
+## 投了する
+投了をするには、<a href="./api/endpoints/games/reversi/games/surrender">このエンドポイント</a>にリクエストします。
diff --git a/src/docs/en-US/stream.md b/src/docs/en-US/stream.md
new file mode 100644
index 0000000000..07c4f42cf7
--- /dev/null
+++ b/src/docs/en-US/stream.md
@@ -0,0 +1,354 @@
+# ストリーミングAPI
+
+ストリーミングAPIを使うと、リアルタイムで様々な情報(例えばタイムラインに新しい投稿が流れてきた、メッセージが届いた、フォローされた、など)を受け取ったり、様々な操作を行ったりすることができます。
+
+## ストリームに接続する
+
+ストリーミングAPIを利用するには、まずMisskeyサーバーに**websocket**接続する必要があります。
+
+以下のURLに、`i`というパラメータ名で認証情報を含めて、websocket接続してください。例:
+```
+%WS_URL%/streaming?i=xxxxxxxxxxxxxxx
+```
+
+認証情報は、自分のAPIキーや、アプリケーションからストリームに接続する際はユーザーのアクセストークンのことを指します。
+
+<div class="ui info">
+ <p><i class="fas fa-info-circle"></i> 認証情報の取得については、<a href="./api">こちらのドキュメント</a>をご確認ください。</p>
+</div>
+
+---
+
+認証情報は省略することもできますが、その場合非ログインでの利用ということになり、受信できる情報や可能な操作は限られます。例:
+
+```
+%WS_URL%/streaming
+```
+
+---
+
+ストリームに接続すると、後述するAPI操作や、投稿の購読を行ったりすることができます。 しかしまだこの段階では、例えばタイムラインへの新しい投稿を受信したりすることはできません。 それを行うには、ストリーム上で、後述する**チャンネル**に接続する必要があります。
+
+**ストリームでのやり取りはすべてJSONです。**
+
+## Channels
+MisskeyのストリーミングAPIにはチャンネルという概念があります。これは、送受信する情報を分離するための仕組みです。 Misskeyのストリームに接続しただけでは、まだリアルタイムでタイムラインの投稿を受信したりはできません。 ストリーム上でチャンネルに接続することで、様々な情報を受け取ったり情報を送信したりすることができるようになります。
+
+### チャンネルに接続する
+チャンネルに接続するには、次のようなデータをJSONでストリームに送信します:
+
+```json
+{
+ type: 'connect',
+ body: {
+ channel: 'xxxxxxxx',
+ id: 'foobar',
+ params: {
+ ...
+ }
+ }
+}
+```
+
+ここで、
+* `channel`には接続したいチャンネル名を設定します。チャンネルの種類については後述します。
+* `id`にはそのチャンネルとやり取りするための任意のIDを設定します。ストリームでは様々なメッセージが流れるので、そのメッセージがどのチャンネルからのものなのか識別する必要があるからです。このIDは、UUIDや、乱数のようなもので構いません。
+* `params`はチャンネルに接続する際のパラメータです。チャンネルによって接続時に必要とされるパラメータは異なります。パラメータ不要のチャンネルに接続する際は、このプロパティは省略可能です。
+
+<div class="ui info">
+ <p><i class="fas fa-info-circle"></i> IDはチャンネルごとではなく「チャンネルの接続ごと」です。なぜなら、同じチャンネルに異なるパラメータで複数接続するケースもあるからです。</p>
+</div>
+
+### チャンネルからのメッセージを受け取る
+例えばタイムラインのチャンネルなら、新しい投稿があった時にメッセージを発します。そのメッセージを受け取ることで、タイムラインに新しい投稿がされたことをリアルタイムで知ることができます。
+
+チャンネルがメッセージを発すると、次のようなデータがJSONでストリームに流れてきます:
+```json
+{
+ type: 'channel',
+ body: {
+ id: 'foobar',
+ type: 'something',
+ body: {
+ some: 'thing'
+ }
+ }
+}
+```
+
+ここで、
+* `id`には前述したそのチャンネルに接続する際に設定したIDが設定されています。これで、このメッセージがどのチャンネルからのものなのか知ることができます。
+* `type`にはメッセージの種類が設定されます。チャンネルによって、どのような種類のメッセージが流れてくるかは異なります。
+* `body`にはメッセージの内容が設定されます。チャンネルによって、どのような内容のメッセージが流れてくるかは異なります。
+
+### チャンネルに向けてメッセージを送信する
+チャンネルによっては、メッセージを受け取るだけでなく、こちらから何かメッセージを送信し、何らかの操作を行える場合があります。
+
+チャンネルにメッセージを送信するには、次のようなデータをJSONでストリームに送信します:
+```json
+{
+ type: 'channel',
+ body: {
+ id: 'foobar',
+ type: 'something',
+ body: {
+ some: 'thing'
+ }
+ }
+}
+```
+
+ここで、
+* `id`には前述したそのチャンネルに接続する際に設定したIDを設定します。これで、このメッセージがどのチャンネルに向けたものなのか識別させることができます。
+* `type`にはメッセージの種類を設定します。チャンネルによって、どのような種類のメッセージを受け付けるかは異なります。
+* `body`にはメッセージの内容を設定します。チャンネルによって、どのような内容のメッセージを受け付けるかは異なります。
+
+### チャンネルから切断する
+チャンネルから切断するには、次のようなデータをJSONでストリームに送信します:
+
+```json
+{
+ type: 'disconnect',
+ body: {
+ id: 'foobar'
+ }
+}
+```
+
+ここで、
+* `id`には前述したそのチャンネルに接続する際に設定したIDを設定します。
+
+## ストリームを経由してAPIリクエストする
+
+ストリームを経由してAPIリクエストすると、HTTPリクエストを発生させずにAPIを利用できます。そのため、コードを簡潔にできたり、パフォーマンスの向上を見込めるかもしれません。
+
+ストリームを経由してAPIリクエストするには、次のようなデータをJSONでストリームに送信します:
+```json
+{
+ type: 'api',
+ body: {
+ id: 'xxxxxxxxxxxxxxxx',
+ endpoint: 'notes/create',
+ data: {
+ text: 'yee haw!'
+ }
+ }
+}
+```
+
+ここで、
+* `id`には、APIのレスポンスを識別するための、APIリクエストごとの一意なIDを設定する必要があります。UUIDや、簡単な乱数のようなもので構いません。
+* `endpoint`には、あなたがリクエストしたいAPIのエンドポイントを指定します。
+* `data`には、エンドポイントのパラメータを含めます。
+
+<div class="ui info">
+ <p><i class="fas fa-info-circle"></i> APIのエンドポイントやパラメータについてはAPIリファレンスをご確認ください。</p>
+</div>
+
+### レスポンスの受信
+
+APIへリクエストすると、レスポンスがストリームから次のような形式で流れてきます。
+
+```json
+{
+ type: 'api:xxxxxxxxxxxxxxxx',
+ body: {
+ ...
+ }
+}
+```
+
+ここで、
+* `xxxxxxxxxxxxxxxx`の部分には、リクエストの際に設定された`id`が含まれています。これにより、どのリクエストに対するレスポンスなのか判別することができます。
+* `body`には、レスポンスが含まれています。
+
+## 投稿のキャプチャ
+
+Misskeyは投稿のキャプチャと呼ばれる仕組みを提供しています。これは、指定した投稿のイベントをストリームで受け取る機能です。
+
+例えばタイムラインを取得してユーザーに表示したとします。ここで誰かがそのタイムラインに含まれるどれかの投稿に対してリアクションしたとします。
+
+しかし、クライアントからするとある投稿にリアクションが付いたことなどは知る由がないため、リアルタイムでリアクションをタイムライン上の投稿に反映して表示するといったことができません。
+
+この問題を解決するために、Misskeyは投稿のキャプチャ機構を用意しています。投稿をキャプチャすると、その投稿に関するイベントを受け取ることができるため、リアルタイムでリアクションを反映させたりすることが可能になります。
+
+### 投稿をキャプチャする
+
+投稿をキャプチャするには、ストリームに次のようなメッセージを送信します:
+
+```json
+{
+ type: 'subNote',
+ body: {
+ id: 'xxxxxxxxxxxxxxxx'
+ }
+}
+```
+
+ここで、
+* `id`にキャプチャしたい投稿の`id`を設定します。
+
+このメッセージを送信すると、Misskeyにキャプチャを要請したことになり、以後、その投稿に関するイベントが流れてくるようになります。
+
+例えば投稿にリアクションが付いたとすると、次のようなメッセージが流れてきます:
+
+```json
+{
+ type: 'noteUpdated',
+ body: {
+ id: 'xxxxxxxxxxxxxxxx',
+ type: 'reacted',
+ body: {
+ reaction: 'like',
+ userId: 'yyyyyyyyyyyyyyyy'
+ }
+ }
+}
+```
+
+ここで、
+* `body`内の`id`に、イベントを発生させた投稿のIDが設定されます。
+* `body`内の`type`に、イベントの種類が設定されます。
+* `body`内の`body`に、イベントの詳細が設定されます。
+
+#### イベントの種類
+
+##### `reacted`
+その投稿にリアクションがされた時に発生します。
+
+* `reaction`に、リアクションの種類が設定されます。
+* `userId`に、リアクションを行ったユーザーのIDが設定されます。
+
+例:
+```json
+{
+ type: 'noteUpdated',
+ body: {
+ id: 'xxxxxxxxxxxxxxxx',
+ type: 'reacted',
+ body: {
+ reaction: 'like',
+ userId: 'yyyyyyyyyyyyyyyy'
+ }
+ }
+}
+```
+
+##### `deleted`
+その投稿が削除された時に発生します。
+
+* `deletedAt`に、削除日時が設定されます。
+
+例:
+```json
+{
+ type: 'noteUpdated',
+ body: {
+ id: 'xxxxxxxxxxxxxxxx',
+ type: 'deleted',
+ body: {
+ deletedAt: '2018-10-22T02:17:09.703Z'
+ }
+ }
+}
+```
+
+##### `pollVoted`
+その投稿に添付されたアンケートに投票された時に発生します。
+
+* `choice`に、選択肢IDが設定されます。
+* `userId`に、投票を行ったユーザーのIDが設定されます。
+
+例:
+```json
+{
+ type: 'noteUpdated',
+ body: {
+ id: 'xxxxxxxxxxxxxxxx',
+ type: 'pollVoted',
+ body: {
+ choice: 2,
+ userId: 'yyyyyyyyyyyyyyyy'
+ }
+ }
+}
+```
+
+### 投稿のキャプチャを解除する
+
+その投稿がもう画面に表示されなくなったりして、その投稿に関するイベントをもう受け取る必要がなくなったときは、キャプチャの解除を申請してください。
+
+次のメッセージを送信します:
+
+```json
+{
+ type: 'unsubNote',
+ body: {
+ id: 'xxxxxxxxxxxxxxxx'
+ }
+}
+```
+
+ここで、
+* `id`にキャプチャを解除したい投稿の`id`を設定します。
+
+このメッセージを送信すると、以後、その投稿に関するイベントは流れてこないようになります。
+
+# チャンネル一覧
+## `main`
+アカウントに関する基本的な情報が流れてきます。このチャンネルにパラメータはありません。
+
+### 流れてくるイベント一覧
+
+#### `renote`
+自分の投稿がRenoteされた時に発生するイベントです。自分自身の投稿をRenoteしたときは発生しません。
+
+#### `mention`
+誰かからメンションされたときに発生するイベントです。
+
+#### `readAllNotifications`
+自分宛ての通知がすべて既読になったことを表すイベントです。このイベントを利用して、「通知があることを示すアイコン」のようなものをオフにしたりする等のケースが想定されます。
+
+#### `meUpdated`
+自分の情報が更新されたことを表すイベントです。
+
+#### `follow`
+自分が誰かをフォローしたときに発生するイベントです。
+
+#### `unfollow`
+自分が誰かのフォローを解除したときに発生するイベントです。
+
+#### `followed`
+自分が誰かにフォローされたときに発生するイベントです。
+
+## `homeTimeline`
+ホームタイムラインの投稿情報が流れてきます。このチャンネルにパラメータはありません。
+
+### 流れてくるイベント一覧
+
+#### `note`
+タイムラインに新しい投稿が流れてきたときに発生するイベントです。
+
+## `localTimeline`
+ローカルタイムラインの投稿情報が流れてきます。このチャンネルにパラメータはありません。
+
+### 流れてくるイベント一覧
+
+#### `note`
+ローカルタイムラインに新しい投稿が流れてきたときに発生するイベントです。
+
+## `hybridTimeline`
+ソーシャルタイムラインの投稿情報が流れてきます。このチャンネルにパラメータはありません。
+
+### 流れてくるイベント一覧
+
+#### `note`
+ソーシャルタイムラインに新しい投稿が流れてきたときに発生するイベントです。
+
+## `globalTimeline`
+グローバルタイムラインの投稿情報が流れてきます。このチャンネルにパラメータはありません。
+
+### 流れてくるイベント一覧
+
+#### `note`
+グローバルタイムラインに新しい投稿が流れてきたときに発生するイベントです。
diff --git a/src/docs/en-US/theme.md b/src/docs/en-US/theme.md
new file mode 100644
index 0000000000..10b419cfb3
--- /dev/null
+++ b/src/docs/en-US/theme.md
@@ -0,0 +1,68 @@
+# Theme
+
+テーマを設定して、Misskeyクライアントの見た目を変更できます。
+
+## テーマの設定
+設定 > テーマ
+
+## テーマを作成する
+テーマコードはJSON5で記述されたテーマオブジェクトです。 テーマは以下のようなオブジェクトです。
+``` js
+{
+ id: '17587283-dd92-4a2c-a22c-be0637c9e22a',
+
+ name: 'Danboard',
+ author: 'syuilo',
+
+ base: 'light',
+
+ props: {
+ accent: 'rgb(218, 141, 49)',
+ bg: 'rgb(218, 212, 190)',
+ fg: 'rgb(115, 108, 92)',
+ panel: 'rgb(236, 232, 220)',
+ renote: 'rgb(100, 152, 106)',
+ link: 'rgb(100, 152, 106)',
+ mention: '@accent',
+ hashtag: 'rgb(100, 152, 106)',
+ header: 'rgba(239, 227, 213, 0.75)',
+ navBg: 'rgb(216, 206, 182)',
+ inputBorder: 'rgba(0, 0, 0, 0.1)',
+ },
+}
+
+```
+
+* `id` ... テーマの一意なID。UUIDをおすすめします。
+* `name` ... テーマ名
+* `author` ... テーマの作者
+* `desc` ... テーマの説明(オプション)
+* `base` ... 明るいテーマか、暗いテーマか
+ * `light`にすると明るいテーマになり、`dark`にすると暗いテーマになります。
+ * テーマはここで設定されたベーステーマを継承します。
+* `props` ... テーマのスタイル定義。これから説明します。
+
+### テーマのスタイル定義
+`props`下にはテーマのスタイルを定義します。 キーがCSSの変数名になり、バリューで中身を指定します。 なお、この`props`オブジェクトはベーステーマから継承されます。 ベーステーマは、このテーマの`base`が`light`なら[_light.json5](https://github.com/syuilo/misskey/blob/develop/src/client/themes/_light.json5)で、`dark`なら[_dark.json5](https://github.com/syuilo/misskey/blob/develop/src/client/themes/_dark.json5)です。 つまり、このテーマ内の`props`に`panel`というキーが無くても、そこにはベーステーマの`panel`があると見なされます。
+
+#### バリューで使える構文
+* 16進数で表された色
+ * 例: `#00ff00`
+* `rgb(r, g, b)`形式で表された色
+ * 例: `rgb(0, 255, 0)`
+* `rgb(r, g, b, a)`形式で表された透明度を含む色
+ * 例: `rgba(0, 255, 0, 0.5)`
+* 他のキーの値の参照
+ * `@{キー名}`と書くと他のキーの値の参照になります。`{キー名}`は参照したいキーの名前に置き換えます。
+ * 例: `@panel`
+* 定数(後述)の参照
+ * `${定数名}`と書くと定数の参照になります。`{定数名}`は参照したい定数の名前に置き換えます。
+ * 例: `$main`
+* 関数(後述)
+ * `:{関数名}<{引数}<{色}`
+
+#### Constant
+「CSS変数として出力はしたくないが、他のCSS変数の値として使いまわしたい」値があるときは、定数を使うと便利です。 キー名を`$`で始めると、そのキーはCSS変数として出力されません。
+
+#### Functions
+wip
diff --git a/src/docs/en-US/timelines.md b/src/docs/en-US/timelines.md
new file mode 100644
index 0000000000..ec5fa1a778
--- /dev/null
+++ b/src/docs/en-US/timelines.md
@@ -0,0 +1,15 @@
+# タイムラインの比較
+
+https://docs.google.com/spreadsheets/d/1lxQ2ugKrhz58Bg96HTDK_2F98BUritkMyIiBkOByjHA/edit?usp=sharing
+
+## Home
+自分のフォローしているユーザーの投稿
+
+## Local
+全てのローカルユーザーの「ホーム」指定されていない投稿
+
+## Social
+自分のフォローしているユーザーの投稿と、全てのローカルユーザーの「ホーム」指定されていない投稿
+
+## Global
+全てのローカルユーザーの「ホーム」指定されていない投稿と、サーバーに届いた全てのリモートユーザーの「ホーム」指定されていない投稿
diff --git a/src/docs/es-ES/aiscript.md b/src/docs/es-ES/aiscript.md
new file mode 100644
index 0000000000..9dc4f1c975
--- /dev/null
+++ b/src/docs/es-ES/aiscript.md
@@ -0,0 +1,4 @@
+# AiScript
+
+## funciones
+デフォルトで値渡しです。
diff --git a/src/docs/es-ES/api.md b/src/docs/es-ES/api.md
new file mode 100644
index 0000000000..76019b6145
--- /dev/null
+++ b/src/docs/es-ES/api.md
@@ -0,0 +1,58 @@
+# Misskey API
+
+MisskeyAPIを使ってMisskeyクライアント、Misskey連携Webサービス、Bot等(以下「アプリケーション」と呼びます)を開発できます。 ストリーミングAPIもあるので、リアルタイム性のあるアプリケーションを作ることも可能です。
+
+APIを使い始めるには、まずアクセストークンを取得する必要があります。 このドキュメントでは、アクセストークンを取得する手順を説明した後、基本的なAPIの使い方を説明します。
+
+## アクセストークンの取得
+基本的に、APIはリクエストにはアクセストークンが必要となります。 APIにリクエストするのが自分自身なのか、不特定の利用者に使ってもらうアプリケーションなのかによって取得手順は異なります。
+
+* 前者の場合: [「自分自身のアクセストークンを手動発行する」](#自分自身のアクセストークンを手動発行する)に進む
+* 後者の場合: [「アプリケーション利用者にアクセストークンの発行をリクエストする」](#アプリケーション利用者にアクセストークンの発行をリクエストする)に進む
+
+### 自分自身のアクセストークンを手動発行する
+「設定 > API」で、自分のアクセストークンを発行できます。
+
+[「APIの使い方」へ進む](#APIの使い方)
+
+### アプリケーション利用者にアクセストークンの発行をリクエストする
+アプリケーション利用者のアクセストークンを取得するには、以下の手順で発行をリクエストします。
+
+#### Step 1
+
+UUIDを生成する。以後これをセッションIDと呼びます。
+
+> このセッションIDは毎回生成し、使いまわさないようにしてください。
+
+#### Step 2
+
+`{_URL_}/miauth/{session}`をユーザーのブラウザで表示させる。`{session}`の部分は、セッションIDに置き換えてください。
+> 例: `{_URL_}/miauth/c1f6d42b-468b-4fd2-8274-e58abdedef6f`
+
+表示する際、URLにクエリパラメータとしていくつかのオプションを設定できます:
+* `name` ... アプリケーション名
+ * > 例: `MissDeck`
+* `icon` ... アプリケーションのアイコン画像URL
+ * > 例: `https://missdeck.example.com/icon.png`
+* `callback` ... 認証が終わった後にリダイレクトするURL
+ * > 例: `https://missdeck.example.com/callback`
+ * リダイレクト時には、`session`というクエリパラメータでセッションIDが付きます
+* `permission` ... アプリケーションが要求する権限
+ * > 例: `write:notes,write:following,read:drive`
+ * 要求する権限を`,`で区切って列挙します
+ * どのような権限があるかは[APIリファレンス](/api-doc)で確認できます
+
+#### Step 3
+ユーザーが発行を許可した後、`{_URL_}/api/miauth/{session}/check`にPOSTリクエストすると、レスポンスとしてアクセストークンを含むJSONが返ります。
+
+レスポンスに含まれるプロパティ:
+* `token` ... ユーザーのアクセストークン
+* `user` ... ユーザーの情報
+
+[「APIの使い方」へ進む](#APIの使い方)
+
+## APIの使い方
+**APIはすべてPOSTで、リクエスト/レスポンスともにJSON形式です。RESTではありません。** アクセストークンは、`i`というパラメータ名でリクエストに含めます。
+
+* [APIリファレンス](/api-doc)
+* [ストリーミングAPI](./stream)
diff --git a/src/docs/es-ES/create-plugin.md b/src/docs/es-ES/create-plugin.md
new file mode 100644
index 0000000000..46db702206
--- /dev/null
+++ b/src/docs/es-ES/create-plugin.md
@@ -0,0 +1,74 @@
+# プラグインの作成
+Misskey Webクライアントのプラグイン機能を使うと、クライアントを拡張し、様々な機能を追加できます。 ここではプラグインの作成にあたってのメタデータ定義や、AiScript APIリファレンスを掲載します。
+
+## Metadatos
+プラグインは、AiScriptのメタデータ埋め込み機能を使って、デフォルトとしてプラグインのメタデータを定義する必要があります。 メタデータは次のプロパティを含むオブジェクトです。
+
+### name
+プラグイン名
+
+### author
+プラグイン作者
+
+### version
+プラグインバージョン。数値を指定してください。
+
+### description
+プラグインの説明
+
+### permissions
+プラグインが要求する権限。MisskeyAPIにリクエストする際に用いられます。
+
+### config
+プラグインの設定情報を表すオブジェクト。 キーに設定名、値に以下のプロパティを含めます。
+
+#### type
+設定値の種類を表す文字列。以下から選択します。 string number boolean
+
+#### label
+ユーザーに表示する設定名
+
+#### description
+設定の説明
+
+#### default
+設定のデフォルト値
+
+## APIリファレンス
+AiScript標準で組み込まれているAPIは掲載しません。
+
+### Mk:dialog(title text type)
+ダイアログを表示します。typeには以下の値が設定できます。 info success warn error question 省略すると info になります。
+
+### Mk:confirm(title text type)
+確認ダイアログを表示します。typeには以下の値が設定できます。 info success warn error question 省略すると question になります。 ユーザーが"OK"を選択した場合は true を、"キャンセル"を選択した場合は false が返ります。
+
+### Mk:api(endpoint params)
+Misskey APIにリクエストします。第一引数にエンドポイント名、第二引数にパラメータオブジェクトを渡します。
+
+### Mk:save(key value)
+任意の値に任意の名前を付けて永続化します。永続化した値は、AiScriptコンテキストが終了しても残り、Mk:loadで読み取ることができます。
+
+### Mk:load(key)
+Mk:saveで永続化した指定の名前の値を読み取ります。
+
+### Plugin:register_post_form_action(title fn)
+投稿フォームにアクションを追加します。第一引数にアクション名、第二引数にアクションが選択された際のコールバック関数を渡します。 コールバック関数には、第一引数に投稿フォームオブジェクトが渡されます。
+
+### Plugin:register_note_action(title fn)
+ノートメニューに項目を追加します。第一引数に項目名、第二引数に項目が選択された際のコールバック関数を渡します。 コールバック関数には、第一引数に対象のノートオブジェクトが渡されます。
+
+### Plugin:register_user_action(title fn)
+ユーザーメニューに項目を追加します。第一引数に項目名、第二引数に項目が選択された際のコールバック関数を渡します。 コールバック関数には、第一引数に対象のユーザーオブジェクトが渡されます。
+
+### Plugin:register_note_view_interruptor(fn)
+UIに表示されるノート情報を書き換えます。 コールバック関数には、第一引数に対象のノートオブジェクトが渡されます。 コールバック関数の返り値でノートが書き換えられます。
+
+### Plugin:register_note_post_interruptor(fn)
+ノート投稿時にノート情報を書き換えます。 コールバック関数には、第一引数に対象のノートオブジェクトが渡されます。 コールバック関数の返り値でノートが書き換えられます。
+
+### Plugin:open_url(url)
+第一引数に渡されたURLをブラウザの新しいタブで開きます。
+
+### Plugin:config
+プラグインの設定が格納されるオブジェクト。プラグイン定義のconfigで設定したキーで値が入ります。
diff --git a/src/docs/es-ES/custom-emoji.md b/src/docs/es-ES/custom-emoji.md
new file mode 100644
index 0000000000..842db20f02
--- /dev/null
+++ b/src/docs/es-ES/custom-emoji.md
@@ -0,0 +1,2 @@
+# Emojis personalizados
+カスタム絵文字は、インスタンスで用意された画像を絵文字のように使える機能です。 ノート、リアクション、チャット、自己紹介、名前などの場所で使うことができます。 カスタム絵文字をそれらの場所で使うには、絵文字ピッカーボタン(ある場合)を押すか、`:`を入力して絵文字サジェストを表示します。 テキスト内に`:foo:`のような形式の文字列が見つかると、`foo`の部分がカスタム絵文字名と解釈され、表示時には対応したカスタム絵文字に置き換わります。
diff --git a/src/docs/es-ES/deck.md b/src/docs/es-ES/deck.md
new file mode 100644
index 0000000000..73e9efdaaf
--- /dev/null
+++ b/src/docs/es-ES/deck.md
@@ -0,0 +1,18 @@
+# Deck
+
+デッキは利用可能なUIのひとつです。「カラム」と呼ばれるビューを複数並べて表示させることで、カスタマイズ性が高く、情報量の多いUIが構築できることが特徴です。
+
+## カラムの追加
+デッキの背景を右クリックし、「カラムを追加」して任意のカラムを追加できます。
+
+## カラムの移動
+カラムは、ドラッグアンドドロップで他のカラムと位置を入れ替えることが出来るほか、カラムメニュー(カラムのヘッダー右クリック)から位置を移動させることもできます。
+
+## カラムの水平分割
+カラムは左右だけでなく、上下に並べることもできます。 カラムメニューを開き、「左に重ねる」を選択すると、左のカラムの下に現在のカラムが移動します。 上下分割を解除するには、カラムメニューの「右に出す」を選択します。
+
+## カラムの設定
+カラムメニューの「編集」を選択するとカラムの設定を編集できます。カラムの名前を変えたり、幅を変えたりできます。
+
+## デッキの設定
+デッキに関する設定は、[settings/deck](/settings/deck)で行えます。
diff --git a/src/docs/es-ES/follow.md b/src/docs/es-ES/follow.md
new file mode 100644
index 0000000000..474cc594fb
--- /dev/null
+++ b/src/docs/es-ES/follow.md
@@ -0,0 +1,2 @@
+# Siguiendo
+ユーザーをフォローすると、タイムラインにそのユーザーの投稿が表示されるようになります。ただし、他のユーザーに対する返信は含まれません。 ユーザーをフォローするには、ユーザーページの「フォロー」ボタンをクリックします。フォローを解除するには、もう一度クリックします。
diff --git a/src/docs/es-ES/keyboard-shortcut.md b/src/docs/es-ES/keyboard-shortcut.md
new file mode 100644
index 0000000000..27162c6b27
--- /dev/null
+++ b/src/docs/es-ES/keyboard-shortcut.md
@@ -0,0 +1,68 @@
+# キーボードショートカット
+
+## Global
+これらのショートカットは基本的にどこでも使えます。
+<table>
+ <thead>
+ <tr><th>ショートカット</th><th>効果</th><th>由来</th></tr>
+ </thead>
+ <tbody>
+ <tr><td><kbd class="key">P</kbd>, <kbd class="key">N</kbd></td><td>新規投稿</td><td><b>P</b>ost, <b>N</b>ew, <b>N</b>ote</td></tr>
+ <tr><td><kbd class="key">T</kbd></td><td>タイムラインの最も新しい投稿にフォーカス</td><td><b>T</b>imeline, <b>T</b>op</td></tr>
+ <tr><td><kbd class="group"><kbd class="key">Shift</kbd> + <kbd class="key">N</kbd></kbd></td><td>通知を表示/隠す</td><td><b>N</b>otifications</td></tr>
+ <tr><td><kbd class="key">S</kbd></td><td>Buscar</td><td><b>S</b>earch</td></tr>
+ <tr><td><kbd class="key">H</kbd>, <kbd class="key">?</kbd></td><td>ヘルプを表示</td><td><b>H</b>elp</td></tr>
+ </tbody>
+</table>
+
+## 投稿にフォーカスされた状態
+
+<table>
+ <thead>
+ <tr><th>ショートカット</th><th>効果</th><th>由来</th></tr>
+ </thead>
+ <tbody>
+ <tr><td><kbd class="key">↑</kbd>, <kbd class="key">K</kbd>, <kbd class="group"><kbd class="key">Shift</kbd> + <kbd class="key">Tab</kbd></kbd></td><td>上の投稿にフォーカスを移動</td><td>-</td></tr>
+ <tr><td><kbd class="key">↓</kbd>, <kbd class="key">J</kbd>, <kbd class="key">Tab</kbd></td><td>下の投稿にフォーカスを移動</td><td>-</td></tr>
+ <tr><td><kbd class="key">R</kbd></td><td>返信フォームを開く</td><td><b>R</b>eply</td></tr>
+ <tr><td><kbd class="key">Q</kbd></td><td>Renoteフォームを開く</td><td><b>Q</b>uote</td></tr>
+ <tr><td><kbd class="group"><kbd class="key">Ctrl</kbd> + <kbd class="key">Q</kbd></kbd></td><td>即刻Renoteする(フォームを開かずに)</td><td>-</td></tr>
+ <tr><td><kbd class="key">E</kbd>, <kbd class="key">A</kbd>, <kbd class="key">+</kbd></td><td>リアクションフォームを開く</td><td><b>E</b>mote, re<b>A</b>ction</td></tr>
+ <tr><td><kbd class="key">0</kbd>~<kbd class="key">9</kbd></td><td>数字に対応したリアクションをする(対応については後述)</td><td>-</td></tr>
+ <tr><td><kbd class="key">F</kbd>, <kbd class="key">B</kbd></td><td>お気に入りに登録</td><td><b>F</b>avorite, <b>B</b>ookmark</td></tr>
+ <tr><td><kbd class="key">Del</kbd>, <kbd class="group"><kbd class="key">Ctrl</kbd> + <kbd class="key">D</kbd></kbd></td><td>投稿を削除</td><td><b>D</b>elete</tr>
+ <tr><td><kbd class="key">M</kbd>, <kbd class="key">O</kbd></td><td>投稿に対するメニューを開く</td><td><b>M</b>ore, <b>O</b>ther</td></tr>
+ <tr><td><kbd class="key">S</kbd></td><td>CWで隠された部分を表示 or 隠す</td><td><b>S</b>how, <b>S</b>ee</td></tr>
+ <tr><td><kbd class="key">Esc</kbd></td><td>フォーカスを外す</td><td>-</td></tr>
+ </tbody>
+</table>
+
+## Renoteフォーム
+
+<table>
+ <thead>
+ <tr><th>ショートカット</th><th>効果</th><th>由来</th></tr>
+ </thead>
+ <tbody>
+ <tr><td><kbd class="key">Enter</kbd></td><td>Renoteする</td><td>-</td></tr>
+ <tr><td><kbd class="key">Q</kbd></td><td>フォームを展開する</td><td><b>Q</b>uote</td></tr>
+ <tr><td><kbd class="key">Esc</kbd></td><td>フォームを閉じる</td><td>-</td></tr>
+ </tbody>
+</table>
+
+## リアクションフォーム
+デフォルトで「👍」にフォーカスが当たっている状態です。
+<table>
+ <thead>
+ <tr><th>ショートカット</th><th>効果</th><th>由来</th></tr>
+ </thead>
+ <tbody>
+ <tr><td><kbd class="key">↑</kbd>, <kbd class="key">K</kbd></td><td>上のリアクションにフォーカスを移動</td><td>-</td></tr>
+ <tr><td><kbd class="key">↓</kbd>, <kbd class="key">J</kbd></td><td>下のリアクションにフォーカスを移動</td><td>-</td></tr>
+ <tr><td><kbd class="key">←</kbd>, <kbd class="key">H</kbd>, <kbd class="group"><kbd class="key">Shift</kbd> + <kbd class="key">Tab</kbd></kbd></td><td>左のリアクションにフォーカスを移動</td><td>-</td></tr>
+ <tr><td><kbd class="key">→</kbd>, <kbd class="key">L</kbd>, <kbd class="key">Tab</kbd></td><td>右のリアクションにフォーカスを移動</td><td>-</td></tr>
+ <tr><td><kbd class="key">Enter</kbd>, <kbd class="key">Space</kbd>, <kbd class="key">+</kbd></td><td>リアクション確定</td><td>-</td></tr>
+ <tr><td><kbd class="key">0</kbd>~<kbd class="key">9</kbd></td><td>数字に対応したリアクションで確定</td><td>-</td></tr>
+ <tr><td><kbd class="key">Esc</kbd></td><td>リアクションするのをやめる</td><td>-</td></tr>
+ </tbody>
+</table>
diff --git a/src/docs/es-ES/mfm.md b/src/docs/es-ES/mfm.md
new file mode 100644
index 0000000000..e237287acc
--- /dev/null
+++ b/src/docs/es-ES/mfm.md
@@ -0,0 +1,2 @@
+# MFM
+MFMは、Misskey Flavored Markdownの略で、Misskeyの様々な場所で使用できる専用のマークアップ言語です。 MFMで使用可能な構文は[MFMチートシート](/mfm-cheat-sheet)で確認できます。
diff --git a/src/docs/es-ES/mute.md b/src/docs/es-ES/mute.md
new file mode 100644
index 0000000000..331e5cc10a
--- /dev/null
+++ b/src/docs/es-ES/mute.md
@@ -0,0 +1,13 @@
+# Silenciar
+
+ユーザーをミュートすると、そのユーザーに関する次のコンテンツがMisskeyに表示されなくなります:
+
+* タイムラインや投稿の検索結果内の、そのユーザーの投稿(およびそれらの投稿に対する返信やRenote)
+* そのユーザーからの通知
+* メッセージ履歴一覧内の、そのユーザーとのメッセージ履歴
+
+ユーザーをミュートするには、対象のユーザーのユーザーページに表示されている「ミュート」ボタンを押します。
+
+ミュートを行ったことは相手に通知されず、ミュートされていることを知ることもできません。
+
+設定>ミュート から、自分がミュートしているユーザー一覧を確認することができます。
diff --git a/src/docs/es-ES/pages.md b/src/docs/es-ES/pages.md
new file mode 100644
index 0000000000..7fc6ee29c3
--- /dev/null
+++ b/src/docs/es-ES/pages.md
@@ -0,0 +1,10 @@
+# Pages
+
+## Variables
+変数を使うことで動的なページを作成できます。テキスト内で <b>{ 変数名 }</b> と書くとそこに変数の値を埋め込めます。例えば <b>Hello { thing } world!</b> というテキストで、変数(thing)の値が <b>ai</b> だった場合、テキストは <b>Hello ai world!</b> になります。
+
+変数の評価(値を算出すること)は上から下に行われるので、ある変数の中で自分より下の変数を参照することはできません。例えば上から <b>A、B、C</b> と3つの変数を定義したとき、<b>C</b>の中で<b>A</b>や<b>B</b>を参照することはできますが、<b>A</b>の中で<b>B</b>や<b>C</b>を参照することはできません。
+
+ユーザーからの入力を受け取るには、ページに「ユーザー入力」ブロックを設置し、「変数名」に入力を格納したい変数名を設定します(変数は自動で作成されます)。その変数を使ってユーザー入力に応じた動作を行えます。
+
+関数を使うと、値の算出処理を再利用可能な形にまとめることができます。関数を作るには、「関数」タイプの変数を作成します。関数にはスロット(引数)を設定することができ、スロットの値は関数内で変数として利用可能です。また、関数を引数に取る関数(高階関数と呼ばれます)も存在します。関数は予め定義しておくほかに、このような高階関数のスロットに即席でセットすることもできます。
diff --git a/src/docs/es-ES/reaction.md b/src/docs/es-ES/reaction.md
new file mode 100644
index 0000000000..ac10a52f53
--- /dev/null
+++ b/src/docs/es-ES/reaction.md
@@ -0,0 +1,11 @@
+# Reacción
+他の人のノートに、絵文字を付けて簡単にあなたの反応を伝えられる機能です。 リアクションするには、ノートの + アイコンをクリックしてピッカーを表示し、絵文字を選択します。 リアクションには[カスタム絵文字](./custom-emoji)も使用できます。
+
+## リアクションピッカーのカスタマイズ
+ピッカーに表示される絵文字を自分好みにカスタマイズすることができます。 設定の「リアクション」で設定します。
+
+## リモート投稿へのリアクションについて
+リアクションはMisskeyオリジナルの機能であるため、リモートインスタンスがMisskeyでない限りは、ほとんどの場合「Like」としてアクティビティが送信されます。一般的にはLikeは「お気に入り」として実装されているようです。 また、相手がMisskeyであったとしても、カスタム絵文字リアクションは伝わらず、自動的に「👍」等にフォールバックされます。
+
+## リモートからのリアクションについて
+リモートから「Like」アクティビティを受信したとき、Misskeyでは「👍」のリアクションとして解釈されます。
diff --git a/src/docs/es-ES/reversi-bot.md b/src/docs/es-ES/reversi-bot.md
new file mode 100644
index 0000000000..1019fa4470
--- /dev/null
+++ b/src/docs/es-ES/reversi-bot.md
@@ -0,0 +1,160 @@
+# MisskeyリバーシBotの開発
+Misskeyのリバーシ機能に対応したBotの開発方法をここに記します。
+
+1. `games/reversi`ストリームに以下のパラメータを付けて接続する:
+ * `i`: botアカウントのAPIキー
+
+2. 対局への招待が来たら、ストリームから`invited`イベントが流れてくる
+ * イベントの中身に、`parent`という名前で対局へ誘ってきたユーザーの情報が含まれている
+
+3. `games/reversi/match`へ、`user_id`として`parent`の`id`が含まれたリクエストを送信する
+
+4. 上手くいくとゲーム情報が返ってくるので、`games/reversi-game`ストリームへ、以下のパラメータを付けて接続する:
+ * `i`: botアカウントのAPIキー
+ * `game`: `game`の`id`
+
+5. この間、相手がゲームの設定を変更するとその都度`update-settings`イベントが流れてくるので、必要であれば何かしらの処理を行う
+
+6. 設定に満足したら、`{ type: 'accept' }`メッセージをストリームに送信する
+
+7. ゲームが開始すると、`started`イベントが流れてくる
+ * イベントの中身にはゲーム情報が含まれている
+
+8. 石を打つには、ストリームに`{ type: 'set', pos: <位置> }`を送信する(位置の計算方法は後述)
+
+9. 相手または自分が石を打つと、ストリームから`set`イベントが流れてくる
+ * `color`として石の色が含まれている
+ * `pos`として位置情報が含まれている
+
+## 位置の計算法
+8x8のマップを考える場合、各マスの位置(インデックスと呼びます)は次のようになっています:
+```
++--+--+--+--+--+--+--+--+
+| 0| 1| 2| 3| 4| 5| 6| 7|
++--+--+--+--+--+--+--+--+
+| 8| 9|10|11|12|13|14|15|
++--+--+--+--+--+--+--+--+
+|16|17|18|19|20|21|22|23|
+...
+```
+
+### X,Y座標 から インデックス に変換する
+```
+pos = x + (y * mapWidth)
+```
+`mapWidth`は、ゲーム情報の`map`から、次のようにして計算できます:
+```
+mapWidth = map[0].length
+```
+
+### インデックス から X,Y座標 に変換する
+```
+x = pos % mapWidth
+y = Math.floor(pos / mapWidth)
+```
+
+## マップ情報
+マップ情報は、ゲーム情報の`map`に入っています。 文字列の配列になっており、ひとつひとつの文字がマス情報を表しています。 それをもとにマップのデザインを知る事が出来ます:
+* `(スペース)` ... マス無し
+* `-` ... マス
+* `b` ... 初期配置される黒石
+* `w` ... 初期配置される白石
+
+例えば、4*4の次のような単純なマップがあるとします:
+```text
++---+---+---+---+
+| | | | |
++---+---+---+---+
+| | ○ | ● | |
++---+---+---+---+
+| | ● | ○ | |
++---+---+---+---+
+| | | | |
++---+---+---+---+
+```
+
+この場合、マップデータはこのようになります:
+```javascript
+['----', '-wb-', '-bw-', '----']
+```
+
+## ユーザーにフォームを提示して対話可能Botを作成する
+ユーザーとのコミュニケーションを行うため、ゲームの設定画面でユーザーにフォームを提示することができます。 例えば、Botの強さをユーザーが設定できるようにする、といったシナリオが考えられます。
+
+フォームを提示するには、`reversi-game`ストリームに次のメッセージを送信します:
+```javascript
+{
+ type: 'init-form',
+ body: [フォームコントロールの配列]
+}
+```
+
+フォームコントロールの配列については今から説明します。 フォームコントロールは、次のようなオブジェクトです:
+```javascript
+{
+ id: 'switch1',
+ type: 'switch',
+ label: 'Enable hoge',
+ value: false
+}
+```
+`id` ... コントロールのID。 `type` ... コントロールの種類。後述します。 `label` ... コントロールと一緒に表記するテキスト。 `value` ... コントロールのデフォルト値。
+
+### フォームの操作を受け取る
+ユーザーがフォームを操作すると、ストリームから`update-form`イベントが流れてきます。 イベントの中身には、コントロールのIDと、ユーザーが設定した値が含まれています。 例えば、上で示したスイッチをユーザーがオンにしたとすると、次のイベントが流れてきます:
+```javascript
+{
+ id: 'switch1',
+ value: true
+}
+```
+
+### フォームコントロールの種類
+#### Interruptor
+type: `switch` スイッチを表示します。何かの機能をオン/オフさせたい場合に有用です。
+
+##### プロパティ
+`label` ... スイッチに表記するテキスト。
+
+#### ラジオボタン
+type: `radio` ラジオボタンを表示します。選択肢を提示するのに有用です。例えば、Botの強さを設定させるなどです。
+
+##### プロパティ
+`items` ... ラジオボタンの選択肢。例:
+```javascript
+items: [{
+ label: '弱',
+ value: 1
+}, {
+ label: '中',
+ value: 2
+}, {
+ label: '強',
+ value: 3
+}]
+```
+
+#### スライダー
+type: `slider` スライダーを表示します。
+
+##### プロパティ
+`min` ... スライダーの下限。 `max` ... スライダーの上限。 `step` ... 入力欄で刻むステップ値。
+
+#### テキストボックス
+type: `textbox` テキストボックスを表示します。ユーザーになにか入力させる一般的な用途に利用できます。
+
+## ユーザーにメッセージを表示する
+設定画面でユーザーと対話する、フォーム以外のもうひとつの方法がこれです。ユーザーになにかメッセージを表示することができます。 例えば、ユーザーがBotの対応していないモードやマップを選択したとき、警告を表示するなどです。 メッセージを表示するには、次のメッセージをストリームに送信します:
+```javascript
+{
+ type: 'message',
+ body: {
+ text: 'メッセージ内容',
+ type: 'メッセージの種類'
+ }
+}
+```
+メッセージの種類: `success`, `info`, `warning`, `error`。
+
+## 投了する
+投了をするには、<a href="./api/endpoints/games/reversi/games/surrender">このエンドポイント</a>にリクエストします。
diff --git a/src/docs/es-ES/stream.md b/src/docs/es-ES/stream.md
new file mode 100644
index 0000000000..c32579c148
--- /dev/null
+++ b/src/docs/es-ES/stream.md
@@ -0,0 +1,354 @@
+# ストリーミングAPI
+
+ストリーミングAPIを使うと、リアルタイムで様々な情報(例えばタイムラインに新しい投稿が流れてきた、メッセージが届いた、フォローされた、など)を受け取ったり、様々な操作を行ったりすることができます。
+
+## ストリームに接続する
+
+ストリーミングAPIを利用するには、まずMisskeyサーバーに**websocket**接続する必要があります。
+
+以下のURLに、`i`というパラメータ名で認証情報を含めて、websocket接続してください。例:
+```
+%WS_URL%/streaming?i=xxxxxxxxxxxxxxx
+```
+
+認証情報は、自分のAPIキーや、アプリケーションからストリームに接続する際はユーザーのアクセストークンのことを指します。
+
+<div class="ui info">
+ <p><i class="fas fa-info-circle"></i> 認証情報の取得については、<a href="./api">こちらのドキュメント</a>をご確認ください。</p>
+</div>
+
+---
+
+認証情報は省略することもできますが、その場合非ログインでの利用ということになり、受信できる情報や可能な操作は限られます。例:
+
+```
+%WS_URL%/streaming
+```
+
+---
+
+ストリームに接続すると、後述するAPI操作や、投稿の購読を行ったりすることができます。 しかしまだこの段階では、例えばタイムラインへの新しい投稿を受信したりすることはできません。 それを行うには、ストリーム上で、後述する**チャンネル**に接続する必要があります。
+
+**ストリームでのやり取りはすべてJSONです。**
+
+## Canal
+MisskeyのストリーミングAPIにはチャンネルという概念があります。これは、送受信する情報を分離するための仕組みです。 Misskeyのストリームに接続しただけでは、まだリアルタイムでタイムラインの投稿を受信したりはできません。 ストリーム上でチャンネルに接続することで、様々な情報を受け取ったり情報を送信したりすることができるようになります。
+
+### チャンネルに接続する
+チャンネルに接続するには、次のようなデータをJSONでストリームに送信します:
+
+```json
+{
+ type: 'connect',
+ body: {
+ channel: 'xxxxxxxx',
+ id: 'foobar',
+ params: {
+ ...
+ }
+ }
+}
+```
+
+ここで、
+* `channel`には接続したいチャンネル名を設定します。チャンネルの種類については後述します。
+* `id`にはそのチャンネルとやり取りするための任意のIDを設定します。ストリームでは様々なメッセージが流れるので、そのメッセージがどのチャンネルからのものなのか識別する必要があるからです。このIDは、UUIDや、乱数のようなもので構いません。
+* `params`はチャンネルに接続する際のパラメータです。チャンネルによって接続時に必要とされるパラメータは異なります。パラメータ不要のチャンネルに接続する際は、このプロパティは省略可能です。
+
+<div class="ui info">
+ <p><i class="fas fa-info-circle"></i> IDはチャンネルごとではなく「チャンネルの接続ごと」です。なぜなら、同じチャンネルに異なるパラメータで複数接続するケースもあるからです。</p>
+</div>
+
+### チャンネルからのメッセージを受け取る
+例えばタイムラインのチャンネルなら、新しい投稿があった時にメッセージを発します。そのメッセージを受け取ることで、タイムラインに新しい投稿がされたことをリアルタイムで知ることができます。
+
+チャンネルがメッセージを発すると、次のようなデータがJSONでストリームに流れてきます:
+```json
+{
+ type: 'channel',
+ body: {
+ id: 'foobar',
+ type: 'something',
+ body: {
+ some: 'thing'
+ }
+ }
+}
+```
+
+ここで、
+* `id`には前述したそのチャンネルに接続する際に設定したIDが設定されています。これで、このメッセージがどのチャンネルからのものなのか知ることができます。
+* `type`にはメッセージの種類が設定されます。チャンネルによって、どのような種類のメッセージが流れてくるかは異なります。
+* `body`にはメッセージの内容が設定されます。チャンネルによって、どのような内容のメッセージが流れてくるかは異なります。
+
+### チャンネルに向けてメッセージを送信する
+チャンネルによっては、メッセージを受け取るだけでなく、こちらから何かメッセージを送信し、何らかの操作を行える場合があります。
+
+チャンネルにメッセージを送信するには、次のようなデータをJSONでストリームに送信します:
+```json
+{
+ type: 'channel',
+ body: {
+ id: 'foobar',
+ type: 'something',
+ body: {
+ some: 'thing'
+ }
+ }
+}
+```
+
+ここで、
+* `id`には前述したそのチャンネルに接続する際に設定したIDを設定します。これで、このメッセージがどのチャンネルに向けたものなのか識別させることができます。
+* `type`にはメッセージの種類を設定します。チャンネルによって、どのような種類のメッセージを受け付けるかは異なります。
+* `body`にはメッセージの内容を設定します。チャンネルによって、どのような内容のメッセージを受け付けるかは異なります。
+
+### チャンネルから切断する
+チャンネルから切断するには、次のようなデータをJSONでストリームに送信します:
+
+```json
+{
+ type: 'disconnect',
+ body: {
+ id: 'foobar'
+ }
+}
+```
+
+ここで、
+* `id`には前述したそのチャンネルに接続する際に設定したIDを設定します。
+
+## ストリームを経由してAPIリクエストする
+
+ストリームを経由してAPIリクエストすると、HTTPリクエストを発生させずにAPIを利用できます。そのため、コードを簡潔にできたり、パフォーマンスの向上を見込めるかもしれません。
+
+ストリームを経由してAPIリクエストするには、次のようなデータをJSONでストリームに送信します:
+```json
+{
+ type: 'api',
+ body: {
+ id: 'xxxxxxxxxxxxxxxx',
+ endpoint: 'notes/create',
+ data: {
+ text: 'yee haw!'
+ }
+ }
+}
+```
+
+ここで、
+* `id`には、APIのレスポンスを識別するための、APIリクエストごとの一意なIDを設定する必要があります。UUIDや、簡単な乱数のようなもので構いません。
+* `endpoint`には、あなたがリクエストしたいAPIのエンドポイントを指定します。
+* `data`には、エンドポイントのパラメータを含めます。
+
+<div class="ui info">
+ <p><i class="fas fa-info-circle"></i> APIのエンドポイントやパラメータについてはAPIリファレンスをご確認ください。</p>
+</div>
+
+### レスポンスの受信
+
+APIへリクエストすると、レスポンスがストリームから次のような形式で流れてきます。
+
+```json
+{
+ type: 'api:xxxxxxxxxxxxxxxx',
+ body: {
+ ...
+ }
+}
+```
+
+ここで、
+* `xxxxxxxxxxxxxxxx`の部分には、リクエストの際に設定された`id`が含まれています。これにより、どのリクエストに対するレスポンスなのか判別することができます。
+* `body`には、レスポンスが含まれています。
+
+## 投稿のキャプチャ
+
+Misskeyは投稿のキャプチャと呼ばれる仕組みを提供しています。これは、指定した投稿のイベントをストリームで受け取る機能です。
+
+例えばタイムラインを取得してユーザーに表示したとします。ここで誰かがそのタイムラインに含まれるどれかの投稿に対してリアクションしたとします。
+
+しかし、クライアントからするとある投稿にリアクションが付いたことなどは知る由がないため、リアルタイムでリアクションをタイムライン上の投稿に反映して表示するといったことができません。
+
+この問題を解決するために、Misskeyは投稿のキャプチャ機構を用意しています。投稿をキャプチャすると、その投稿に関するイベントを受け取ることができるため、リアルタイムでリアクションを反映させたりすることが可能になります。
+
+### 投稿をキャプチャする
+
+投稿をキャプチャするには、ストリームに次のようなメッセージを送信します:
+
+```json
+{
+ type: 'subNote',
+ body: {
+ id: 'xxxxxxxxxxxxxxxx'
+ }
+}
+```
+
+ここで、
+* `id`にキャプチャしたい投稿の`id`を設定します。
+
+このメッセージを送信すると、Misskeyにキャプチャを要請したことになり、以後、その投稿に関するイベントが流れてくるようになります。
+
+例えば投稿にリアクションが付いたとすると、次のようなメッセージが流れてきます:
+
+```json
+{
+ type: 'noteUpdated',
+ body: {
+ id: 'xxxxxxxxxxxxxxxx',
+ type: 'reacted',
+ body: {
+ reaction: 'like',
+ userId: 'yyyyyyyyyyyyyyyy'
+ }
+ }
+}
+```
+
+ここで、
+* `body`内の`id`に、イベントを発生させた投稿のIDが設定されます。
+* `body`内の`type`に、イベントの種類が設定されます。
+* `body`内の`body`に、イベントの詳細が設定されます。
+
+#### イベントの種類
+
+##### `reacted`
+その投稿にリアクションがされた時に発生します。
+
+* `reaction`に、リアクションの種類が設定されます。
+* `userId`に、リアクションを行ったユーザーのIDが設定されます。
+
+例:
+```json
+{
+ type: 'noteUpdated',
+ body: {
+ id: 'xxxxxxxxxxxxxxxx',
+ type: 'reacted',
+ body: {
+ reaction: 'like',
+ userId: 'yyyyyyyyyyyyyyyy'
+ }
+ }
+}
+```
+
+##### `deleted`
+その投稿が削除された時に発生します。
+
+* `deletedAt`に、削除日時が設定されます。
+
+例:
+```json
+{
+ type: 'noteUpdated',
+ body: {
+ id: 'xxxxxxxxxxxxxxxx',
+ type: 'deleted',
+ body: {
+ deletedAt: '2018-10-22T02:17:09.703Z'
+ }
+ }
+}
+```
+
+##### `pollVoted`
+その投稿に添付されたアンケートに投票された時に発生します。
+
+* `choice`に、選択肢IDが設定されます。
+* `userId`に、投票を行ったユーザーのIDが設定されます。
+
+例:
+```json
+{
+ type: 'noteUpdated',
+ body: {
+ id: 'xxxxxxxxxxxxxxxx',
+ type: 'pollVoted',
+ body: {
+ choice: 2,
+ userId: 'yyyyyyyyyyyyyyyy'
+ }
+ }
+}
+```
+
+### 投稿のキャプチャを解除する
+
+その投稿がもう画面に表示されなくなったりして、その投稿に関するイベントをもう受け取る必要がなくなったときは、キャプチャの解除を申請してください。
+
+次のメッセージを送信します:
+
+```json
+{
+ type: 'unsubNote',
+ body: {
+ id: 'xxxxxxxxxxxxxxxx'
+ }
+}
+```
+
+ここで、
+* `id`にキャプチャを解除したい投稿の`id`を設定します。
+
+このメッセージを送信すると、以後、その投稿に関するイベントは流れてこないようになります。
+
+# チャンネル一覧
+## `main`
+アカウントに関する基本的な情報が流れてきます。このチャンネルにパラメータはありません。
+
+### 流れてくるイベント一覧
+
+#### `renote`
+自分の投稿がRenoteされた時に発生するイベントです。自分自身の投稿をRenoteしたときは発生しません。
+
+#### `mention`
+誰かからメンションされたときに発生するイベントです。
+
+#### `readAllNotifications`
+自分宛ての通知がすべて既読になったことを表すイベントです。このイベントを利用して、「通知があることを示すアイコン」のようなものをオフにしたりする等のケースが想定されます。
+
+#### `meUpdated`
+自分の情報が更新されたことを表すイベントです。
+
+#### `follow`
+自分が誰かをフォローしたときに発生するイベントです。
+
+#### `unfollow`
+自分が誰かのフォローを解除したときに発生するイベントです。
+
+#### `followed`
+自分が誰かにフォローされたときに発生するイベントです。
+
+## `homeTimeline`
+ホームタイムラインの投稿情報が流れてきます。このチャンネルにパラメータはありません。
+
+### 流れてくるイベント一覧
+
+#### `note`
+タイムラインに新しい投稿が流れてきたときに発生するイベントです。
+
+## `localTimeline`
+ローカルタイムラインの投稿情報が流れてきます。このチャンネルにパラメータはありません。
+
+### 流れてくるイベント一覧
+
+#### `note`
+ローカルタイムラインに新しい投稿が流れてきたときに発生するイベントです。
+
+## `hybridTimeline`
+ソーシャルタイムラインの投稿情報が流れてきます。このチャンネルにパラメータはありません。
+
+### 流れてくるイベント一覧
+
+#### `note`
+ソーシャルタイムラインに新しい投稿が流れてきたときに発生するイベントです。
+
+## `globalTimeline`
+グローバルタイムラインの投稿情報が流れてきます。このチャンネルにパラメータはありません。
+
+### 流れてくるイベント一覧
+
+#### `note`
+グローバルタイムラインに新しい投稿が流れてきたときに発生するイベントです。
diff --git a/src/docs/es-ES/theme.md b/src/docs/es-ES/theme.md
new file mode 100644
index 0000000000..b6490106d1
--- /dev/null
+++ b/src/docs/es-ES/theme.md
@@ -0,0 +1,68 @@
+# Tema
+
+テーマを設定して、Misskeyクライアントの見た目を変更できます。
+
+## テーマの設定
+設定 > テーマ
+
+## テーマを作成する
+テーマコードはJSON5で記述されたテーマオブジェクトです。 テーマは以下のようなオブジェクトです。
+``` js
+{
+ id: '17587283-dd92-4a2c-a22c-be0637c9e22a',
+
+ name: 'Danboard',
+ author: 'syuilo',
+
+ base: 'light',
+
+ props: {
+ accent: 'rgb(218, 141, 49)',
+ bg: 'rgb(218, 212, 190)',
+ fg: 'rgb(115, 108, 92)',
+ panel: 'rgb(236, 232, 220)',
+ renote: 'rgb(100, 152, 106)',
+ link: 'rgb(100, 152, 106)',
+ mention: '@accent',
+ hashtag: 'rgb(100, 152, 106)',
+ header: 'rgba(239, 227, 213, 0.75)',
+ navBg: 'rgb(216, 206, 182)',
+ inputBorder: 'rgba(0, 0, 0, 0.1)',
+ },
+}
+
+```
+
+* `id` ... テーマの一意なID。UUIDをおすすめします。
+* `name` ... テーマ名
+* `author` ... テーマの作者
+* `desc` ... テーマの説明(オプション)
+* `base` ... 明るいテーマか、暗いテーマか
+ * `light`にすると明るいテーマになり、`dark`にすると暗いテーマになります。
+ * テーマはここで設定されたベーステーマを継承します。
+* `props` ... テーマのスタイル定義。これから説明します。
+
+### テーマのスタイル定義
+`props`下にはテーマのスタイルを定義します。 キーがCSSの変数名になり、バリューで中身を指定します。 なお、この`props`オブジェクトはベーステーマから継承されます。 ベーステーマは、このテーマの`base`が`light`なら[_light.json5](https://github.com/syuilo/misskey/blob/develop/src/client/themes/_light.json5)で、`dark`なら[_dark.json5](https://github.com/syuilo/misskey/blob/develop/src/client/themes/_dark.json5)です。 つまり、このテーマ内の`props`に`panel`というキーが無くても、そこにはベーステーマの`panel`があると見なされます。
+
+#### バリューで使える構文
+* 16進数で表された色
+ * 例: `#00ff00`
+* `rgb(r, g, b)`形式で表された色
+ * 例: `rgb(0, 255, 0)`
+* `rgb(r, g, b, a)`形式で表された透明度を含む色
+ * 例: `rgba(0, 255, 0, 0.5)`
+* 他のキーの値の参照
+ * `@{キー名}`と書くと他のキーの値の参照になります。`{キー名}`は参照したいキーの名前に置き換えます。
+ * 例: `@panel`
+* 定数(後述)の参照
+ * `${定数名}`と書くと定数の参照になります。`{定数名}`は参照したい定数の名前に置き換えます。
+ * 例: `$main`
+* 関数(後述)
+ * `:{関数名}<{引数}<{色}`
+
+#### Constante
+「CSS変数として出力はしたくないが、他のCSS変数の値として使いまわしたい」値があるときは、定数を使うと便利です。 キー名を`$`で始めると、そのキーはCSS変数として出力されません。
+
+#### funciones
+wip
diff --git a/src/docs/es-ES/timelines.md b/src/docs/es-ES/timelines.md
new file mode 100644
index 0000000000..d2ee592fd8
--- /dev/null
+++ b/src/docs/es-ES/timelines.md
@@ -0,0 +1,15 @@
+# タイムラインの比較
+
+https://docs.google.com/spreadsheets/d/1lxQ2ugKrhz58Bg96HTDK_2F98BUritkMyIiBkOByjHA/edit?usp=sharing
+
+## Inicio
+自分のフォローしているユーザーの投稿
+
+## Local
+全てのローカルユーザーの「ホーム」指定されていない投稿
+
+## Social
+自分のフォローしているユーザーの投稿と、全てのローカルユーザーの「ホーム」指定されていない投稿
+
+## Global
+全てのローカルユーザーの「ホーム」指定されていない投稿と、サーバーに届いた全てのリモートユーザーの「ホーム」指定されていない投稿
diff --git a/src/docs/fr-FR/aiscript.md b/src/docs/fr-FR/aiscript.md
new file mode 100644
index 0000000000..cd29b4ebad
--- /dev/null
+++ b/src/docs/fr-FR/aiscript.md
@@ -0,0 +1,4 @@
+# AiScript
+
+## Fonction
+デフォルトで値渡しです。
diff --git a/src/docs/fr-FR/api.md b/src/docs/fr-FR/api.md
new file mode 100644
index 0000000000..76019b6145
--- /dev/null
+++ b/src/docs/fr-FR/api.md
@@ -0,0 +1,58 @@
+# Misskey API
+
+MisskeyAPIを使ってMisskeyクライアント、Misskey連携Webサービス、Bot等(以下「アプリケーション」と呼びます)を開発できます。 ストリーミングAPIもあるので、リアルタイム性のあるアプリケーションを作ることも可能です。
+
+APIを使い始めるには、まずアクセストークンを取得する必要があります。 このドキュメントでは、アクセストークンを取得する手順を説明した後、基本的なAPIの使い方を説明します。
+
+## アクセストークンの取得
+基本的に、APIはリクエストにはアクセストークンが必要となります。 APIにリクエストするのが自分自身なのか、不特定の利用者に使ってもらうアプリケーションなのかによって取得手順は異なります。
+
+* 前者の場合: [「自分自身のアクセストークンを手動発行する」](#自分自身のアクセストークンを手動発行する)に進む
+* 後者の場合: [「アプリケーション利用者にアクセストークンの発行をリクエストする」](#アプリケーション利用者にアクセストークンの発行をリクエストする)に進む
+
+### 自分自身のアクセストークンを手動発行する
+「設定 > API」で、自分のアクセストークンを発行できます。
+
+[「APIの使い方」へ進む](#APIの使い方)
+
+### アプリケーション利用者にアクセストークンの発行をリクエストする
+アプリケーション利用者のアクセストークンを取得するには、以下の手順で発行をリクエストします。
+
+#### Step 1
+
+UUIDを生成する。以後これをセッションIDと呼びます。
+
+> このセッションIDは毎回生成し、使いまわさないようにしてください。
+
+#### Step 2
+
+`{_URL_}/miauth/{session}`をユーザーのブラウザで表示させる。`{session}`の部分は、セッションIDに置き換えてください。
+> 例: `{_URL_}/miauth/c1f6d42b-468b-4fd2-8274-e58abdedef6f`
+
+表示する際、URLにクエリパラメータとしていくつかのオプションを設定できます:
+* `name` ... アプリケーション名
+ * > 例: `MissDeck`
+* `icon` ... アプリケーションのアイコン画像URL
+ * > 例: `https://missdeck.example.com/icon.png`
+* `callback` ... 認証が終わった後にリダイレクトするURL
+ * > 例: `https://missdeck.example.com/callback`
+ * リダイレクト時には、`session`というクエリパラメータでセッションIDが付きます
+* `permission` ... アプリケーションが要求する権限
+ * > 例: `write:notes,write:following,read:drive`
+ * 要求する権限を`,`で区切って列挙します
+ * どのような権限があるかは[APIリファレンス](/api-doc)で確認できます
+
+#### Step 3
+ユーザーが発行を許可した後、`{_URL_}/api/miauth/{session}/check`にPOSTリクエストすると、レスポンスとしてアクセストークンを含むJSONが返ります。
+
+レスポンスに含まれるプロパティ:
+* `token` ... ユーザーのアクセストークン
+* `user` ... ユーザーの情報
+
+[「APIの使い方」へ進む](#APIの使い方)
+
+## APIの使い方
+**APIはすべてPOSTで、リクエスト/レスポンスともにJSON形式です。RESTではありません。** アクセストークンは、`i`というパラメータ名でリクエストに含めます。
+
+* [APIリファレンス](/api-doc)
+* [ストリーミングAPI](./stream)
diff --git a/src/docs/fr-FR/create-plugin.md b/src/docs/fr-FR/create-plugin.md
new file mode 100644
index 0000000000..540909de42
--- /dev/null
+++ b/src/docs/fr-FR/create-plugin.md
@@ -0,0 +1,74 @@
+# プラグインの作成
+Misskey Webクライアントのプラグイン機能を使うと、クライアントを拡張し、様々な機能を追加できます。 ここではプラグインの作成にあたってのメタデータ定義や、AiScript APIリファレンスを掲載します。
+
+## Métadonnées
+プラグインは、AiScriptのメタデータ埋め込み機能を使って、デフォルトとしてプラグインのメタデータを定義する必要があります。 メタデータは次のプロパティを含むオブジェクトです。
+
+### name
+プラグイン名
+
+### author
+プラグイン作者
+
+### version
+プラグインバージョン。数値を指定してください。
+
+### description
+プラグインの説明
+
+### permissions
+プラグインが要求する権限。MisskeyAPIにリクエストする際に用いられます。
+
+### config
+プラグインの設定情報を表すオブジェクト。 キーに設定名、値に以下のプロパティを含めます。
+
+#### type
+設定値の種類を表す文字列。以下から選択します。 string number boolean
+
+#### label
+ユーザーに表示する設定名
+
+#### description
+設定の説明
+
+#### default
+設定のデフォルト値
+
+## APIリファレンス
+AiScript標準で組み込まれているAPIは掲載しません。
+
+### Mk:dialog(title text type)
+ダイアログを表示します。typeには以下の値が設定できます。 info success warn error question 省略すると info になります。
+
+### Mk:confirm(title text type)
+確認ダイアログを表示します。typeには以下の値が設定できます。 info success warn error question 省略すると question になります。 ユーザーが"OK"を選択した場合は true を、"キャンセル"を選択した場合は false が返ります。
+
+### Mk:api(endpoint params)
+Misskey APIにリクエストします。第一引数にエンドポイント名、第二引数にパラメータオブジェクトを渡します。
+
+### Mk:save(key value)
+任意の値に任意の名前を付けて永続化します。永続化した値は、AiScriptコンテキストが終了しても残り、Mk:loadで読み取ることができます。
+
+### Mk:load(key)
+Mk:saveで永続化した指定の名前の値を読み取ります。
+
+### Plugin:register_post_form_action(title fn)
+投稿フォームにアクションを追加します。第一引数にアクション名、第二引数にアクションが選択された際のコールバック関数を渡します。 コールバック関数には、第一引数に投稿フォームオブジェクトが渡されます。
+
+### Plugin:register_note_action(title fn)
+ノートメニューに項目を追加します。第一引数に項目名、第二引数に項目が選択された際のコールバック関数を渡します。 コールバック関数には、第一引数に対象のノートオブジェクトが渡されます。
+
+### Plugin:register_user_action(title fn)
+ユーザーメニューに項目を追加します。第一引数に項目名、第二引数に項目が選択された際のコールバック関数を渡します。 コールバック関数には、第一引数に対象のユーザーオブジェクトが渡されます。
+
+### Plugin:register_note_view_interruptor(fn)
+UIに表示されるノート情報を書き換えます。 コールバック関数には、第一引数に対象のノートオブジェクトが渡されます。 コールバック関数の返り値でノートが書き換えられます。
+
+### Plugin:register_note_post_interruptor(fn)
+ノート投稿時にノート情報を書き換えます。 コールバック関数には、第一引数に対象のノートオブジェクトが渡されます。 コールバック関数の返り値でノートが書き換えられます。
+
+### Plugin:open_url(url)
+第一引数に渡されたURLをブラウザの新しいタブで開きます。
+
+### Plugin:config
+プラグインの設定が格納されるオブジェクト。プラグイン定義のconfigで設定したキーで値が入ります。
diff --git a/src/docs/fr-FR/custom-emoji.md b/src/docs/fr-FR/custom-emoji.md
new file mode 100644
index 0000000000..01840868eb
--- /dev/null
+++ b/src/docs/fr-FR/custom-emoji.md
@@ -0,0 +1,2 @@
+# Émojis personnalisés
+カスタム絵文字は、インスタンスで用意された画像を絵文字のように使える機能です。 ノート、リアクション、チャット、自己紹介、名前などの場所で使うことができます。 カスタム絵文字をそれらの場所で使うには、絵文字ピッカーボタン(ある場合)を押すか、`:`を入力して絵文字サジェストを表示します。 テキスト内に`:foo:`のような形式の文字列が見つかると、`foo`の部分がカスタム絵文字名と解釈され、表示時には対応したカスタム絵文字に置き換わります。
diff --git a/src/docs/fr-FR/deck.md b/src/docs/fr-FR/deck.md
new file mode 100644
index 0000000000..73e9efdaaf
--- /dev/null
+++ b/src/docs/fr-FR/deck.md
@@ -0,0 +1,18 @@
+# Deck
+
+デッキは利用可能なUIのひとつです。「カラム」と呼ばれるビューを複数並べて表示させることで、カスタマイズ性が高く、情報量の多いUIが構築できることが特徴です。
+
+## カラムの追加
+デッキの背景を右クリックし、「カラムを追加」して任意のカラムを追加できます。
+
+## カラムの移動
+カラムは、ドラッグアンドドロップで他のカラムと位置を入れ替えることが出来るほか、カラムメニュー(カラムのヘッダー右クリック)から位置を移動させることもできます。
+
+## カラムの水平分割
+カラムは左右だけでなく、上下に並べることもできます。 カラムメニューを開き、「左に重ねる」を選択すると、左のカラムの下に現在のカラムが移動します。 上下分割を解除するには、カラムメニューの「右に出す」を選択します。
+
+## カラムの設定
+カラムメニューの「編集」を選択するとカラムの設定を編集できます。カラムの名前を変えたり、幅を変えたりできます。
+
+## デッキの設定
+デッキに関する設定は、[settings/deck](/settings/deck)で行えます。
diff --git a/src/docs/fr-FR/follow.md b/src/docs/fr-FR/follow.md
new file mode 100644
index 0000000000..93c8428e20
--- /dev/null
+++ b/src/docs/fr-FR/follow.md
@@ -0,0 +1,2 @@
+# Abonnements
+ユーザーをフォローすると、タイムラインにそのユーザーの投稿が表示されるようになります。ただし、他のユーザーに対する返信は含まれません。 ユーザーをフォローするには、ユーザーページの「フォロー」ボタンをクリックします。フォローを解除するには、もう一度クリックします。
diff --git a/src/docs/fr-FR/keyboard-shortcut.md b/src/docs/fr-FR/keyboard-shortcut.md
new file mode 100644
index 0000000000..35bebbcde2
--- /dev/null
+++ b/src/docs/fr-FR/keyboard-shortcut.md
@@ -0,0 +1,68 @@
+# キーボードショートカット
+
+## Global
+これらのショートカットは基本的にどこでも使えます。
+<table>
+ <thead>
+ <tr><th>ショートカット</th><th>効果</th><th>由来</th></tr>
+ </thead>
+ <tbody>
+ <tr><td><kbd class="key">P</kbd>, <kbd class="key">N</kbd></td><td>新規投稿</td><td><b>P</b>ost, <b>N</b>ew, <b>N</b>ote</td></tr>
+ <tr><td><kbd class="key">T</kbd></td><td>タイムラインの最も新しい投稿にフォーカス</td><td><b>T</b>imeline, <b>T</b>op</td></tr>
+ <tr><td><kbd class="group"><kbd class="key">Shift</kbd> + <kbd class="key">N</kbd></kbd></td><td>通知を表示/隠す</td><td><b>N</b>otifications</td></tr>
+ <tr><td><kbd class="key">S</kbd></td><td>Rechercher</td><td><b>S</b>earch</td></tr>
+ <tr><td><kbd class="key">H</kbd>, <kbd class="key">?</kbd></td><td>ヘルプを表示</td><td><b>H</b>elp</td></tr>
+ </tbody>
+</table>
+
+## 投稿にフォーカスされた状態
+
+<table>
+ <thead>
+ <tr><th>ショートカット</th><th>効果</th><th>由来</th></tr>
+ </thead>
+ <tbody>
+ <tr><td><kbd class="key">↑</kbd>, <kbd class="key">K</kbd>, <kbd class="group"><kbd class="key">Shift</kbd> + <kbd class="key">Tab</kbd></kbd></td><td>上の投稿にフォーカスを移動</td><td>-</td></tr>
+ <tr><td><kbd class="key">↓</kbd>, <kbd class="key">J</kbd>, <kbd class="key">Tab</kbd></td><td>下の投稿にフォーカスを移動</td><td>-</td></tr>
+ <tr><td><kbd class="key">R</kbd></td><td>返信フォームを開く</td><td><b>R</b>eply</td></tr>
+ <tr><td><kbd class="key">Q</kbd></td><td>Renoteフォームを開く</td><td><b>Q</b>uote</td></tr>
+ <tr><td><kbd class="group"><kbd class="key">Ctrl</kbd> + <kbd class="key">Q</kbd></kbd></td><td>即刻Renoteする(フォームを開かずに)</td><td>-</td></tr>
+ <tr><td><kbd class="key">E</kbd>, <kbd class="key">A</kbd>, <kbd class="key">+</kbd></td><td>リアクションフォームを開く</td><td><b>E</b>mote, re<b>A</b>ction</td></tr>
+ <tr><td><kbd class="key">0</kbd>~<kbd class="key">9</kbd></td><td>数字に対応したリアクションをする(対応については後述)</td><td>-</td></tr>
+ <tr><td><kbd class="key">F</kbd>, <kbd class="key">B</kbd></td><td>お気に入りに登録</td><td><b>F</b>avorite, <b>B</b>ookmark</td></tr>
+ <tr><td><kbd class="key">Del</kbd>, <kbd class="group"><kbd class="key">Ctrl</kbd> + <kbd class="key">D</kbd></kbd></td><td>投稿を削除</td><td><b>D</b>elete</tr>
+ <tr><td><kbd class="key">M</kbd>, <kbd class="key">O</kbd></td><td>投稿に対するメニューを開く</td><td><b>M</b>ore, <b>O</b>ther</td></tr>
+ <tr><td><kbd class="key">S</kbd></td><td>CWで隠された部分を表示 or 隠す</td><td><b>S</b>how, <b>S</b>ee</td></tr>
+ <tr><td><kbd class="key">Esc</kbd></td><td>フォーカスを外す</td><td>-</td></tr>
+ </tbody>
+</table>
+
+## Renoteフォーム
+
+<table>
+ <thead>
+ <tr><th>ショートカット</th><th>効果</th><th>由来</th></tr>
+ </thead>
+ <tbody>
+ <tr><td><kbd class="key">Enter</kbd></td><td>Renoteする</td><td>-</td></tr>
+ <tr><td><kbd class="key">Q</kbd></td><td>フォームを展開する</td><td><b>Q</b>uote</td></tr>
+ <tr><td><kbd class="key">Esc</kbd></td><td>フォームを閉じる</td><td>-</td></tr>
+ </tbody>
+</table>
+
+## リアクションフォーム
+デフォルトで「👍」にフォーカスが当たっている状態です。
+<table>
+ <thead>
+ <tr><th>ショートカット</th><th>効果</th><th>由来</th></tr>
+ </thead>
+ <tbody>
+ <tr><td><kbd class="key">↑</kbd>, <kbd class="key">K</kbd></td><td>上のリアクションにフォーカスを移動</td><td>-</td></tr>
+ <tr><td><kbd class="key">↓</kbd>, <kbd class="key">J</kbd></td><td>下のリアクションにフォーカスを移動</td><td>-</td></tr>
+ <tr><td><kbd class="key">←</kbd>, <kbd class="key">H</kbd>, <kbd class="group"><kbd class="key">Shift</kbd> + <kbd class="key">Tab</kbd></kbd></td><td>左のリアクションにフォーカスを移動</td><td>-</td></tr>
+ <tr><td><kbd class="key">→</kbd>, <kbd class="key">L</kbd>, <kbd class="key">Tab</kbd></td><td>右のリアクションにフォーカスを移動</td><td>-</td></tr>
+ <tr><td><kbd class="key">Enter</kbd>, <kbd class="key">Space</kbd>, <kbd class="key">+</kbd></td><td>リアクション確定</td><td>-</td></tr>
+ <tr><td><kbd class="key">0</kbd>~<kbd class="key">9</kbd></td><td>数字に対応したリアクションで確定</td><td>-</td></tr>
+ <tr><td><kbd class="key">Esc</kbd></td><td>リアクションするのをやめる</td><td>-</td></tr>
+ </tbody>
+</table>
diff --git a/src/docs/fr-FR/mfm.md b/src/docs/fr-FR/mfm.md
new file mode 100644
index 0000000000..e237287acc
--- /dev/null
+++ b/src/docs/fr-FR/mfm.md
@@ -0,0 +1,2 @@
+# MFM
+MFMは、Misskey Flavored Markdownの略で、Misskeyの様々な場所で使用できる専用のマークアップ言語です。 MFMで使用可能な構文は[MFMチートシート](/mfm-cheat-sheet)で確認できます。
diff --git a/src/docs/fr-FR/mute.md b/src/docs/fr-FR/mute.md
new file mode 100644
index 0000000000..051dddfa92
--- /dev/null
+++ b/src/docs/fr-FR/mute.md
@@ -0,0 +1,13 @@
+# Mettre en sourdine
+
+ユーザーをミュートすると、そのユーザーに関する次のコンテンツがMisskeyに表示されなくなります:
+
+* タイムラインや投稿の検索結果内の、そのユーザーの投稿(およびそれらの投稿に対する返信やRenote)
+* そのユーザーからの通知
+* メッセージ履歴一覧内の、そのユーザーとのメッセージ履歴
+
+ユーザーをミュートするには、対象のユーザーのユーザーページに表示されている「ミュート」ボタンを押します。
+
+ミュートを行ったことは相手に通知されず、ミュートされていることを知ることもできません。
+
+設定>ミュート から、自分がミュートしているユーザー一覧を確認することができます。
diff --git a/src/docs/fr-FR/pages.md b/src/docs/fr-FR/pages.md
new file mode 100644
index 0000000000..7fc6ee29c3
--- /dev/null
+++ b/src/docs/fr-FR/pages.md
@@ -0,0 +1,10 @@
+# Pages
+
+## Variables
+変数を使うことで動的なページを作成できます。テキスト内で <b>{ 変数名 }</b> と書くとそこに変数の値を埋め込めます。例えば <b>Hello { thing } world!</b> というテキストで、変数(thing)の値が <b>ai</b> だった場合、テキストは <b>Hello ai world!</b> になります。
+
+変数の評価(値を算出すること)は上から下に行われるので、ある変数の中で自分より下の変数を参照することはできません。例えば上から <b>A、B、C</b> と3つの変数を定義したとき、<b>C</b>の中で<b>A</b>や<b>B</b>を参照することはできますが、<b>A</b>の中で<b>B</b>や<b>C</b>を参照することはできません。
+
+ユーザーからの入力を受け取るには、ページに「ユーザー入力」ブロックを設置し、「変数名」に入力を格納したい変数名を設定します(変数は自動で作成されます)。その変数を使ってユーザー入力に応じた動作を行えます。
+
+関数を使うと、値の算出処理を再利用可能な形にまとめることができます。関数を作るには、「関数」タイプの変数を作成します。関数にはスロット(引数)を設定することができ、スロットの値は関数内で変数として利用可能です。また、関数を引数に取る関数(高階関数と呼ばれます)も存在します。関数は予め定義しておくほかに、このような高階関数のスロットに即席でセットすることもできます。
diff --git a/src/docs/fr-FR/reaction.md b/src/docs/fr-FR/reaction.md
new file mode 100644
index 0000000000..d0df055304
--- /dev/null
+++ b/src/docs/fr-FR/reaction.md
@@ -0,0 +1,11 @@
+# Réactions
+他の人のノートに、絵文字を付けて簡単にあなたの反応を伝えられる機能です。 リアクションするには、ノートの + アイコンをクリックしてピッカーを表示し、絵文字を選択します。 リアクションには[カスタム絵文字](./custom-emoji)も使用できます。
+
+## リアクションピッカーのカスタマイズ
+ピッカーに表示される絵文字を自分好みにカスタマイズすることができます。 設定の「リアクション」で設定します。
+
+## リモート投稿へのリアクションについて
+リアクションはMisskeyオリジナルの機能であるため、リモートインスタンスがMisskeyでない限りは、ほとんどの場合「Like」としてアクティビティが送信されます。一般的にはLikeは「お気に入り」として実装されているようです。 また、相手がMisskeyであったとしても、カスタム絵文字リアクションは伝わらず、自動的に「👍」等にフォールバックされます。
+
+## リモートからのリアクションについて
+リモートから「Like」アクティビティを受信したとき、Misskeyでは「👍」のリアクションとして解釈されます。
diff --git a/src/docs/fr-FR/reversi-bot.md b/src/docs/fr-FR/reversi-bot.md
new file mode 100644
index 0000000000..8c94831054
--- /dev/null
+++ b/src/docs/fr-FR/reversi-bot.md
@@ -0,0 +1,160 @@
+# MisskeyリバーシBotの開発
+Misskeyのリバーシ機能に対応したBotの開発方法をここに記します。
+
+1. `games/reversi`ストリームに以下のパラメータを付けて接続する:
+ * `i`: botアカウントのAPIキー
+
+2. 対局への招待が来たら、ストリームから`invited`イベントが流れてくる
+ * イベントの中身に、`parent`という名前で対局へ誘ってきたユーザーの情報が含まれている
+
+3. `games/reversi/match`へ、`user_id`として`parent`の`id`が含まれたリクエストを送信する
+
+4. 上手くいくとゲーム情報が返ってくるので、`games/reversi-game`ストリームへ、以下のパラメータを付けて接続する:
+ * `i`: botアカウントのAPIキー
+ * `game`: `game`の`id`
+
+5. この間、相手がゲームの設定を変更するとその都度`update-settings`イベントが流れてくるので、必要であれば何かしらの処理を行う
+
+6. 設定に満足したら、`{ type: 'accept' }`メッセージをストリームに送信する
+
+7. ゲームが開始すると、`started`イベントが流れてくる
+ * イベントの中身にはゲーム情報が含まれている
+
+8. 石を打つには、ストリームに`{ type: 'set', pos: <位置> }`を送信する(位置の計算方法は後述)
+
+9. 相手または自分が石を打つと、ストリームから`set`イベントが流れてくる
+ * `color`として石の色が含まれている
+ * `pos`として位置情報が含まれている
+
+## 位置の計算法
+8x8のマップを考える場合、各マスの位置(インデックスと呼びます)は次のようになっています:
+```
++--+--+--+--+--+--+--+--+
+| 0| 1| 2| 3| 4| 5| 6| 7|
++--+--+--+--+--+--+--+--+
+| 8| 9|10|11|12|13|14|15|
++--+--+--+--+--+--+--+--+
+|16|17|18|19|20|21|22|23|
+...
+```
+
+### X,Y座標 から インデックス に変換する
+```
+pos = x + (y * mapWidth)
+```
+`mapWidth`は、ゲーム情報の`map`から、次のようにして計算できます:
+```
+mapWidth = map[0].length
+```
+
+### インデックス から X,Y座標 に変換する
+```
+x = pos % mapWidth
+y = Math.floor(pos / mapWidth)
+```
+
+## マップ情報
+マップ情報は、ゲーム情報の`map`に入っています。 文字列の配列になっており、ひとつひとつの文字がマス情報を表しています。 それをもとにマップのデザインを知る事が出来ます:
+* `(スペース)` ... マス無し
+* `-` ... マス
+* `b` ... 初期配置される黒石
+* `w` ... 初期配置される白石
+
+例えば、4*4の次のような単純なマップがあるとします:
+```text
++---+---+---+---+
+| | | | |
++---+---+---+---+
+| | ○ | ● | |
++---+---+---+---+
+| | ● | ○ | |
++---+---+---+---+
+| | | | |
++---+---+---+---+
+```
+
+この場合、マップデータはこのようになります:
+```javascript
+['----', '-wb-', '-bw-', '----']
+```
+
+## ユーザーにフォームを提示して対話可能Botを作成する
+ユーザーとのコミュニケーションを行うため、ゲームの設定画面でユーザーにフォームを提示することができます。 例えば、Botの強さをユーザーが設定できるようにする、といったシナリオが考えられます。
+
+フォームを提示するには、`reversi-game`ストリームに次のメッセージを送信します:
+```javascript
+{
+ type: 'init-form',
+ body: [フォームコントロールの配列]
+}
+```
+
+フォームコントロールの配列については今から説明します。 フォームコントロールは、次のようなオブジェクトです:
+```javascript
+{
+ id: 'switch1',
+ type: 'switch',
+ label: 'Enable hoge',
+ value: false
+}
+```
+`id` ... コントロールのID。 `type` ... コントロールの種類。後述します。 `label` ... コントロールと一緒に表記するテキスト。 `value` ... コントロールのデフォルト値。
+
+### フォームの操作を受け取る
+ユーザーがフォームを操作すると、ストリームから`update-form`イベントが流れてきます。 イベントの中身には、コントロールのIDと、ユーザーが設定した値が含まれています。 例えば、上で示したスイッチをユーザーがオンにしたとすると、次のイベントが流れてきます:
+```javascript
+{
+ id: 'switch1',
+ value: true
+}
+```
+
+### フォームコントロールの種類
+#### Basculer
+type: `switch` スイッチを表示します。何かの機能をオン/オフさせたい場合に有用です。
+
+##### プロパティ
+`label` ... スイッチに表記するテキスト。
+
+#### ラジオボタン
+type: `radio` ラジオボタンを表示します。選択肢を提示するのに有用です。例えば、Botの強さを設定させるなどです。
+
+##### プロパティ
+`items` ... ラジオボタンの選択肢。例:
+```javascript
+items: [{
+ label: '弱',
+ value: 1
+}, {
+ label: '中',
+ value: 2
+}, {
+ label: '強',
+ value: 3
+}]
+```
+
+#### スライダー
+type: `slider` スライダーを表示します。
+
+##### プロパティ
+`min` ... スライダーの下限。 `max` ... スライダーの上限。 `step` ... 入力欄で刻むステップ値。
+
+#### テキストボックス
+type: `textbox` テキストボックスを表示します。ユーザーになにか入力させる一般的な用途に利用できます。
+
+## ユーザーにメッセージを表示する
+設定画面でユーザーと対話する、フォーム以外のもうひとつの方法がこれです。ユーザーになにかメッセージを表示することができます。 例えば、ユーザーがBotの対応していないモードやマップを選択したとき、警告を表示するなどです。 メッセージを表示するには、次のメッセージをストリームに送信します:
+```javascript
+{
+ type: 'message',
+ body: {
+ text: 'メッセージ内容',
+ type: 'メッセージの種類'
+ }
+}
+```
+メッセージの種類: `success`, `info`, `warning`, `error`。
+
+## 投了する
+投了をするには、<a href="./api/endpoints/games/reversi/games/surrender">このエンドポイント</a>にリクエストします。
diff --git a/src/docs/fr-FR/stream.md b/src/docs/fr-FR/stream.md
new file mode 100644
index 0000000000..04dad66799
--- /dev/null
+++ b/src/docs/fr-FR/stream.md
@@ -0,0 +1,354 @@
+# ストリーミングAPI
+
+ストリーミングAPIを使うと、リアルタイムで様々な情報(例えばタイムラインに新しい投稿が流れてきた、メッセージが届いた、フォローされた、など)を受け取ったり、様々な操作を行ったりすることができます。
+
+## ストリームに接続する
+
+ストリーミングAPIを利用するには、まずMisskeyサーバーに**websocket**接続する必要があります。
+
+以下のURLに、`i`というパラメータ名で認証情報を含めて、websocket接続してください。例:
+```
+%WS_URL%/streaming?i=xxxxxxxxxxxxxxx
+```
+
+認証情報は、自分のAPIキーや、アプリケーションからストリームに接続する際はユーザーのアクセストークンのことを指します。
+
+<div class="ui info">
+ <p><i class="fas fa-info-circle"></i> 認証情報の取得については、<a href="./api">こちらのドキュメント</a>をご確認ください。</p>
+</div>
+
+---
+
+認証情報は省略することもできますが、その場合非ログインでの利用ということになり、受信できる情報や可能な操作は限られます。例:
+
+```
+%WS_URL%/streaming
+```
+
+---
+
+ストリームに接続すると、後述するAPI操作や、投稿の購読を行ったりすることができます。 しかしまだこの段階では、例えばタイムラインへの新しい投稿を受信したりすることはできません。 それを行うには、ストリーム上で、後述する**チャンネル**に接続する必要があります。
+
+**ストリームでのやり取りはすべてJSONです。**
+
+## Canaux
+MisskeyのストリーミングAPIにはチャンネルという概念があります。これは、送受信する情報を分離するための仕組みです。 Misskeyのストリームに接続しただけでは、まだリアルタイムでタイムラインの投稿を受信したりはできません。 ストリーム上でチャンネルに接続することで、様々な情報を受け取ったり情報を送信したりすることができるようになります。
+
+### チャンネルに接続する
+チャンネルに接続するには、次のようなデータをJSONでストリームに送信します:
+
+```json
+{
+ type: 'connect',
+ body: {
+ channel: 'xxxxxxxx',
+ id: 'foobar',
+ params: {
+ ...
+ }
+ }
+}
+```
+
+ここで、
+* `channel`には接続したいチャンネル名を設定します。チャンネルの種類については後述します。
+* `id`にはそのチャンネルとやり取りするための任意のIDを設定します。ストリームでは様々なメッセージが流れるので、そのメッセージがどのチャンネルからのものなのか識別する必要があるからです。このIDは、UUIDや、乱数のようなもので構いません。
+* `params`はチャンネルに接続する際のパラメータです。チャンネルによって接続時に必要とされるパラメータは異なります。パラメータ不要のチャンネルに接続する際は、このプロパティは省略可能です。
+
+<div class="ui info">
+ <p><i class="fas fa-info-circle"></i> IDはチャンネルごとではなく「チャンネルの接続ごと」です。なぜなら、同じチャンネルに異なるパラメータで複数接続するケースもあるからです。</p>
+</div>
+
+### チャンネルからのメッセージを受け取る
+例えばタイムラインのチャンネルなら、新しい投稿があった時にメッセージを発します。そのメッセージを受け取ることで、タイムラインに新しい投稿がされたことをリアルタイムで知ることができます。
+
+チャンネルがメッセージを発すると、次のようなデータがJSONでストリームに流れてきます:
+```json
+{
+ type: 'channel',
+ body: {
+ id: 'foobar',
+ type: 'something',
+ body: {
+ some: 'thing'
+ }
+ }
+}
+```
+
+ここで、
+* `id`には前述したそのチャンネルに接続する際に設定したIDが設定されています。これで、このメッセージがどのチャンネルからのものなのか知ることができます。
+* `type`にはメッセージの種類が設定されます。チャンネルによって、どのような種類のメッセージが流れてくるかは異なります。
+* `body`にはメッセージの内容が設定されます。チャンネルによって、どのような内容のメッセージが流れてくるかは異なります。
+
+### チャンネルに向けてメッセージを送信する
+チャンネルによっては、メッセージを受け取るだけでなく、こちらから何かメッセージを送信し、何らかの操作を行える場合があります。
+
+チャンネルにメッセージを送信するには、次のようなデータをJSONでストリームに送信します:
+```json
+{
+ type: 'channel',
+ body: {
+ id: 'foobar',
+ type: 'something',
+ body: {
+ some: 'thing'
+ }
+ }
+}
+```
+
+ここで、
+* `id`には前述したそのチャンネルに接続する際に設定したIDを設定します。これで、このメッセージがどのチャンネルに向けたものなのか識別させることができます。
+* `type`にはメッセージの種類を設定します。チャンネルによって、どのような種類のメッセージを受け付けるかは異なります。
+* `body`にはメッセージの内容を設定します。チャンネルによって、どのような内容のメッセージを受け付けるかは異なります。
+
+### チャンネルから切断する
+チャンネルから切断するには、次のようなデータをJSONでストリームに送信します:
+
+```json
+{
+ type: 'disconnect',
+ body: {
+ id: 'foobar'
+ }
+}
+```
+
+ここで、
+* `id`には前述したそのチャンネルに接続する際に設定したIDを設定します。
+
+## ストリームを経由してAPIリクエストする
+
+ストリームを経由してAPIリクエストすると、HTTPリクエストを発生させずにAPIを利用できます。そのため、コードを簡潔にできたり、パフォーマンスの向上を見込めるかもしれません。
+
+ストリームを経由してAPIリクエストするには、次のようなデータをJSONでストリームに送信します:
+```json
+{
+ type: 'api',
+ body: {
+ id: 'xxxxxxxxxxxxxxxx',
+ endpoint: 'notes/create',
+ data: {
+ text: 'yee haw!'
+ }
+ }
+}
+```
+
+ここで、
+* `id`には、APIのレスポンスを識別するための、APIリクエストごとの一意なIDを設定する必要があります。UUIDや、簡単な乱数のようなもので構いません。
+* `endpoint`には、あなたがリクエストしたいAPIのエンドポイントを指定します。
+* `data`には、エンドポイントのパラメータを含めます。
+
+<div class="ui info">
+ <p><i class="fas fa-info-circle"></i> APIのエンドポイントやパラメータについてはAPIリファレンスをご確認ください。</p>
+</div>
+
+### レスポンスの受信
+
+APIへリクエストすると、レスポンスがストリームから次のような形式で流れてきます。
+
+```json
+{
+ type: 'api:xxxxxxxxxxxxxxxx',
+ body: {
+ ...
+ }
+}
+```
+
+ここで、
+* `xxxxxxxxxxxxxxxx`の部分には、リクエストの際に設定された`id`が含まれています。これにより、どのリクエストに対するレスポンスなのか判別することができます。
+* `body`には、レスポンスが含まれています。
+
+## 投稿のキャプチャ
+
+Misskeyは投稿のキャプチャと呼ばれる仕組みを提供しています。これは、指定した投稿のイベントをストリームで受け取る機能です。
+
+例えばタイムラインを取得してユーザーに表示したとします。ここで誰かがそのタイムラインに含まれるどれかの投稿に対してリアクションしたとします。
+
+しかし、クライアントからするとある投稿にリアクションが付いたことなどは知る由がないため、リアルタイムでリアクションをタイムライン上の投稿に反映して表示するといったことができません。
+
+この問題を解決するために、Misskeyは投稿のキャプチャ機構を用意しています。投稿をキャプチャすると、その投稿に関するイベントを受け取ることができるため、リアルタイムでリアクションを反映させたりすることが可能になります。
+
+### 投稿をキャプチャする
+
+投稿をキャプチャするには、ストリームに次のようなメッセージを送信します:
+
+```json
+{
+ type: 'subNote',
+ body: {
+ id: 'xxxxxxxxxxxxxxxx'
+ }
+}
+```
+
+ここで、
+* `id`にキャプチャしたい投稿の`id`を設定します。
+
+このメッセージを送信すると、Misskeyにキャプチャを要請したことになり、以後、その投稿に関するイベントが流れてくるようになります。
+
+例えば投稿にリアクションが付いたとすると、次のようなメッセージが流れてきます:
+
+```json
+{
+ type: 'noteUpdated',
+ body: {
+ id: 'xxxxxxxxxxxxxxxx',
+ type: 'reacted',
+ body: {
+ reaction: 'like',
+ userId: 'yyyyyyyyyyyyyyyy'
+ }
+ }
+}
+```
+
+ここで、
+* `body`内の`id`に、イベントを発生させた投稿のIDが設定されます。
+* `body`内の`type`に、イベントの種類が設定されます。
+* `body`内の`body`に、イベントの詳細が設定されます。
+
+#### イベントの種類
+
+##### `reacted`
+その投稿にリアクションがされた時に発生します。
+
+* `reaction`に、リアクションの種類が設定されます。
+* `userId`に、リアクションを行ったユーザーのIDが設定されます。
+
+例:
+```json
+{
+ type: 'noteUpdated',
+ body: {
+ id: 'xxxxxxxxxxxxxxxx',
+ type: 'reacted',
+ body: {
+ reaction: 'like',
+ userId: 'yyyyyyyyyyyyyyyy'
+ }
+ }
+}
+```
+
+##### `deleted`
+その投稿が削除された時に発生します。
+
+* `deletedAt`に、削除日時が設定されます。
+
+例:
+```json
+{
+ type: 'noteUpdated',
+ body: {
+ id: 'xxxxxxxxxxxxxxxx',
+ type: 'deleted',
+ body: {
+ deletedAt: '2018-10-22T02:17:09.703Z'
+ }
+ }
+}
+```
+
+##### `pollVoted`
+その投稿に添付されたアンケートに投票された時に発生します。
+
+* `choice`に、選択肢IDが設定されます。
+* `userId`に、投票を行ったユーザーのIDが設定されます。
+
+例:
+```json
+{
+ type: 'noteUpdated',
+ body: {
+ id: 'xxxxxxxxxxxxxxxx',
+ type: 'pollVoted',
+ body: {
+ choice: 2,
+ userId: 'yyyyyyyyyyyyyyyy'
+ }
+ }
+}
+```
+
+### 投稿のキャプチャを解除する
+
+その投稿がもう画面に表示されなくなったりして、その投稿に関するイベントをもう受け取る必要がなくなったときは、キャプチャの解除を申請してください。
+
+次のメッセージを送信します:
+
+```json
+{
+ type: 'unsubNote',
+ body: {
+ id: 'xxxxxxxxxxxxxxxx'
+ }
+}
+```
+
+ここで、
+* `id`にキャプチャを解除したい投稿の`id`を設定します。
+
+このメッセージを送信すると、以後、その投稿に関するイベントは流れてこないようになります。
+
+# チャンネル一覧
+## `main`
+アカウントに関する基本的な情報が流れてきます。このチャンネルにパラメータはありません。
+
+### 流れてくるイベント一覧
+
+#### `renote`
+自分の投稿がRenoteされた時に発生するイベントです。自分自身の投稿をRenoteしたときは発生しません。
+
+#### `mention`
+誰かからメンションされたときに発生するイベントです。
+
+#### `readAllNotifications`
+自分宛ての通知がすべて既読になったことを表すイベントです。このイベントを利用して、「通知があることを示すアイコン」のようなものをオフにしたりする等のケースが想定されます。
+
+#### `meUpdated`
+自分の情報が更新されたことを表すイベントです。
+
+#### `follow`
+自分が誰かをフォローしたときに発生するイベントです。
+
+#### `unfollow`
+自分が誰かのフォローを解除したときに発生するイベントです。
+
+#### `followed`
+自分が誰かにフォローされたときに発生するイベントです。
+
+## `homeTimeline`
+ホームタイムラインの投稿情報が流れてきます。このチャンネルにパラメータはありません。
+
+### 流れてくるイベント一覧
+
+#### `note`
+タイムラインに新しい投稿が流れてきたときに発生するイベントです。
+
+## `localTimeline`
+ローカルタイムラインの投稿情報が流れてきます。このチャンネルにパラメータはありません。
+
+### 流れてくるイベント一覧
+
+#### `note`
+ローカルタイムラインに新しい投稿が流れてきたときに発生するイベントです。
+
+## `hybridTimeline`
+ソーシャルタイムラインの投稿情報が流れてきます。このチャンネルにパラメータはありません。
+
+### 流れてくるイベント一覧
+
+#### `note`
+ソーシャルタイムラインに新しい投稿が流れてきたときに発生するイベントです。
+
+## `globalTimeline`
+グローバルタイムラインの投稿情報が流れてきます。このチャンネルにパラメータはありません。
+
+### 流れてくるイベント一覧
+
+#### `note`
+グローバルタイムラインに新しい投稿が流れてきたときに発生するイベントです。
diff --git a/src/docs/fr-FR/theme.md b/src/docs/fr-FR/theme.md
new file mode 100644
index 0000000000..9c706c826e
--- /dev/null
+++ b/src/docs/fr-FR/theme.md
@@ -0,0 +1,68 @@
+# Thème
+
+テーマを設定して、Misskeyクライアントの見た目を変更できます。
+
+## テーマの設定
+設定 > テーマ
+
+## テーマを作成する
+テーマコードはJSON5で記述されたテーマオブジェクトです。 テーマは以下のようなオブジェクトです。
+``` js
+{
+ id: '17587283-dd92-4a2c-a22c-be0637c9e22a',
+
+ name: 'Danboard',
+ author: 'syuilo',
+
+ base: 'light',
+
+ props: {
+ accent: 'rgb(218, 141, 49)',
+ bg: 'rgb(218, 212, 190)',
+ fg: 'rgb(115, 108, 92)',
+ panel: 'rgb(236, 232, 220)',
+ renote: 'rgb(100, 152, 106)',
+ link: 'rgb(100, 152, 106)',
+ mention: '@accent',
+ hashtag: 'rgb(100, 152, 106)',
+ header: 'rgba(239, 227, 213, 0.75)',
+ navBg: 'rgb(216, 206, 182)',
+ inputBorder: 'rgba(0, 0, 0, 0.1)',
+ },
+}
+
+```
+
+* `id` ... テーマの一意なID。UUIDをおすすめします。
+* `name` ... テーマ名
+* `author` ... テーマの作者
+* `desc` ... テーマの説明(オプション)
+* `base` ... 明るいテーマか、暗いテーマか
+ * `light`にすると明るいテーマになり、`dark`にすると暗いテーマになります。
+ * テーマはここで設定されたベーステーマを継承します。
+* `props` ... テーマのスタイル定義。これから説明します。
+
+### テーマのスタイル定義
+`props`下にはテーマのスタイルを定義します。 キーがCSSの変数名になり、バリューで中身を指定します。 なお、この`props`オブジェクトはベーステーマから継承されます。 ベーステーマは、このテーマの`base`が`light`なら[_light.json5](https://github.com/syuilo/misskey/blob/develop/src/client/themes/_light.json5)で、`dark`なら[_dark.json5](https://github.com/syuilo/misskey/blob/develop/src/client/themes/_dark.json5)です。 つまり、このテーマ内の`props`に`panel`というキーが無くても、そこにはベーステーマの`panel`があると見なされます。
+
+#### バリューで使える構文
+* 16進数で表された色
+ * 例: `#00ff00`
+* `rgb(r, g, b)`形式で表された色
+ * 例: `rgb(0, 255, 0)`
+* `rgb(r, g, b, a)`形式で表された透明度を含む色
+ * 例: `rgba(0, 255, 0, 0.5)`
+* 他のキーの値の参照
+ * `@{キー名}`と書くと他のキーの値の参照になります。`{キー名}`は参照したいキーの名前に置き換えます。
+ * 例: `@panel`
+* 定数(後述)の参照
+ * `${定数名}`と書くと定数の参照になります。`{定数名}`は参照したい定数の名前に置き換えます。
+ * 例: `$main`
+* 関数(後述)
+ * `:{関数名}<{引数}<{色}`
+
+#### Constante
+「CSS変数として出力はしたくないが、他のCSS変数の値として使いまわしたい」値があるときは、定数を使うと便利です。 キー名を`$`で始めると、そのキーはCSS変数として出力されません。
+
+#### Fonction
+wip
diff --git a/src/docs/fr-FR/timelines.md b/src/docs/fr-FR/timelines.md
new file mode 100644
index 0000000000..c674db8240
--- /dev/null
+++ b/src/docs/fr-FR/timelines.md
@@ -0,0 +1,15 @@
+# タイムラインの比較
+
+https://docs.google.com/spreadsheets/d/1lxQ2ugKrhz58Bg96HTDK_2F98BUritkMyIiBkOByjHA/edit?usp=sharing
+
+## Principal
+自分のフォローしているユーザーの投稿
+
+## Local
+全てのローカルユーザーの「ホーム」指定されていない投稿
+
+## Social
+自分のフォローしているユーザーの投稿と、全てのローカルユーザーの「ホーム」指定されていない投稿
+
+## Global
+全てのローカルユーザーの「ホーム」指定されていない投稿と、サーバーに届いた全てのリモートユーザーの「ホーム」指定されていない投稿
diff --git a/src/docs/ja-KS/aiscript.md b/src/docs/ja-KS/aiscript.md
new file mode 100644
index 0000000000..6c28b446e3
--- /dev/null
+++ b/src/docs/ja-KS/aiscript.md
@@ -0,0 +1,4 @@
+# AiScript
+
+## 関数
+デフォルトで値渡しです。
diff --git a/src/docs/ja-KS/api.md b/src/docs/ja-KS/api.md
new file mode 100644
index 0000000000..76019b6145
--- /dev/null
+++ b/src/docs/ja-KS/api.md
@@ -0,0 +1,58 @@
+# Misskey API
+
+MisskeyAPIを使ってMisskeyクライアント、Misskey連携Webサービス、Bot等(以下「アプリケーション」と呼びます)を開発できます。 ストリーミングAPIもあるので、リアルタイム性のあるアプリケーションを作ることも可能です。
+
+APIを使い始めるには、まずアクセストークンを取得する必要があります。 このドキュメントでは、アクセストークンを取得する手順を説明した後、基本的なAPIの使い方を説明します。
+
+## アクセストークンの取得
+基本的に、APIはリクエストにはアクセストークンが必要となります。 APIにリクエストするのが自分自身なのか、不特定の利用者に使ってもらうアプリケーションなのかによって取得手順は異なります。
+
+* 前者の場合: [「自分自身のアクセストークンを手動発行する」](#自分自身のアクセストークンを手動発行する)に進む
+* 後者の場合: [「アプリケーション利用者にアクセストークンの発行をリクエストする」](#アプリケーション利用者にアクセストークンの発行をリクエストする)に進む
+
+### 自分自身のアクセストークンを手動発行する
+「設定 > API」で、自分のアクセストークンを発行できます。
+
+[「APIの使い方」へ進む](#APIの使い方)
+
+### アプリケーション利用者にアクセストークンの発行をリクエストする
+アプリケーション利用者のアクセストークンを取得するには、以下の手順で発行をリクエストします。
+
+#### Step 1
+
+UUIDを生成する。以後これをセッションIDと呼びます。
+
+> このセッションIDは毎回生成し、使いまわさないようにしてください。
+
+#### Step 2
+
+`{_URL_}/miauth/{session}`をユーザーのブラウザで表示させる。`{session}`の部分は、セッションIDに置き換えてください。
+> 例: `{_URL_}/miauth/c1f6d42b-468b-4fd2-8274-e58abdedef6f`
+
+表示する際、URLにクエリパラメータとしていくつかのオプションを設定できます:
+* `name` ... アプリケーション名
+ * > 例: `MissDeck`
+* `icon` ... アプリケーションのアイコン画像URL
+ * > 例: `https://missdeck.example.com/icon.png`
+* `callback` ... 認証が終わった後にリダイレクトするURL
+ * > 例: `https://missdeck.example.com/callback`
+ * リダイレクト時には、`session`というクエリパラメータでセッションIDが付きます
+* `permission` ... アプリケーションが要求する権限
+ * > 例: `write:notes,write:following,read:drive`
+ * 要求する権限を`,`で区切って列挙します
+ * どのような権限があるかは[APIリファレンス](/api-doc)で確認できます
+
+#### Step 3
+ユーザーが発行を許可した後、`{_URL_}/api/miauth/{session}/check`にPOSTリクエストすると、レスポンスとしてアクセストークンを含むJSONが返ります。
+
+レスポンスに含まれるプロパティ:
+* `token` ... ユーザーのアクセストークン
+* `user` ... ユーザーの情報
+
+[「APIの使い方」へ進む](#APIの使い方)
+
+## APIの使い方
+**APIはすべてPOSTで、リクエスト/レスポンスともにJSON形式です。RESTではありません。** アクセストークンは、`i`というパラメータ名でリクエストに含めます。
+
+* [APIリファレンス](/api-doc)
+* [ストリーミングAPI](./stream)
diff --git a/src/docs/ja-KS/create-plugin.md b/src/docs/ja-KS/create-plugin.md
new file mode 100644
index 0000000000..0d2fa19178
--- /dev/null
+++ b/src/docs/ja-KS/create-plugin.md
@@ -0,0 +1,74 @@
+# プラグインの作成
+Misskey Webクライアントのプラグイン機能を使うと、クライアントを拡張し、様々な機能を追加できます。 ここではプラグインの作成にあたってのメタデータ定義や、AiScript APIリファレンスを掲載します。
+
+## メタデータ
+プラグインは、AiScriptのメタデータ埋め込み機能を使って、デフォルトとしてプラグインのメタデータを定義する必要があります。 メタデータは次のプロパティを含むオブジェクトです。
+
+### name
+プラグイン名
+
+### author
+プラグイン作者
+
+### version
+プラグインバージョン。数値を指定してください。
+
+### description
+プラグインの説明
+
+### permissions
+プラグインが要求する権限。MisskeyAPIにリクエストする際に用いられます。
+
+### config
+プラグインの設定情報を表すオブジェクト。 キーに設定名、値に以下のプロパティを含めます。
+
+#### type
+設定値の種類を表す文字列。以下から選択します。 string number boolean
+
+#### label
+ユーザーに表示する設定名
+
+#### description
+設定の説明
+
+#### default
+設定のデフォルト値
+
+## APIリファレンス
+AiScript標準で組み込まれているAPIは掲載しません。
+
+### Mk:dialog(title text type)
+ダイアログを表示します。typeには以下の値が設定できます。 info success warn error question 省略すると info になります。
+
+### Mk:confirm(title text type)
+確認ダイアログを表示します。typeには以下の値が設定できます。 info success warn error question 省略すると question になります。 ユーザーが"OK"を選択した場合は true を、"キャンセル"を選択した場合は false が返ります。
+
+### Mk:api(endpoint params)
+Misskey APIにリクエストします。第一引数にエンドポイント名、第二引数にパラメータオブジェクトを渡します。
+
+### Mk:save(key value)
+任意の値に任意の名前を付けて永続化します。永続化した値は、AiScriptコンテキストが終了しても残り、Mk:loadで読み取ることができます。
+
+### Mk:load(key)
+Mk:saveで永続化した指定の名前の値を読み取ります。
+
+### Plugin:register_post_form_action(title fn)
+投稿フォームにアクションを追加します。第一引数にアクション名、第二引数にアクションが選択された際のコールバック関数を渡します。 コールバック関数には、第一引数に投稿フォームオブジェクトが渡されます。
+
+### Plugin:register_note_action(title fn)
+ノートメニューに項目を追加します。第一引数に項目名、第二引数に項目が選択された際のコールバック関数を渡します。 コールバック関数には、第一引数に対象のノートオブジェクトが渡されます。
+
+### Plugin:register_user_action(title fn)
+ユーザーメニューに項目を追加します。第一引数に項目名、第二引数に項目が選択された際のコールバック関数を渡します。 コールバック関数には、第一引数に対象のユーザーオブジェクトが渡されます。
+
+### Plugin:register_note_view_interruptor(fn)
+UIに表示されるノート情報を書き換えます。 コールバック関数には、第一引数に対象のノートオブジェクトが渡されます。 コールバック関数の返り値でノートが書き換えられます。
+
+### Plugin:register_note_post_interruptor(fn)
+ノート投稿時にノート情報を書き換えます。 コールバック関数には、第一引数に対象のノートオブジェクトが渡されます。 コールバック関数の返り値でノートが書き換えられます。
+
+### Plugin:open_url(url)
+第一引数に渡されたURLをブラウザの新しいタブで開きます。
+
+### Plugin:config
+プラグインの設定が格納されるオブジェクト。プラグイン定義のconfigで設定したキーで値が入ります。
diff --git a/src/docs/ja-KS/custom-emoji.md b/src/docs/ja-KS/custom-emoji.md
new file mode 100644
index 0000000000..ed2e92be16
--- /dev/null
+++ b/src/docs/ja-KS/custom-emoji.md
@@ -0,0 +1,2 @@
+# カスタム絵文字
+カスタム絵文字は、インスタンスで用意された画像を絵文字のように使える機能です。 ノート、リアクション、チャット、自己紹介、名前などの場所で使うことができます。 カスタム絵文字をそれらの場所で使うには、絵文字ピッカーボタン(ある場合)を押すか、`:`を入力して絵文字サジェストを表示します。 テキスト内に`:foo:`のような形式の文字列が見つかると、`foo`の部分がカスタム絵文字名と解釈され、表示時には対応したカスタム絵文字に置き換わります。
diff --git a/src/docs/ja-KS/deck.md b/src/docs/ja-KS/deck.md
new file mode 100644
index 0000000000..8057e262fd
--- /dev/null
+++ b/src/docs/ja-KS/deck.md
@@ -0,0 +1,18 @@
+# デッキ
+
+デッキは利用可能なUIのひとつです。「カラム」と呼ばれるビューを複数並べて表示させることで、カスタマイズ性が高く、情報量の多いUIが構築できることが特徴です。
+
+## カラムの追加
+デッキの背景を右クリックし、「カラムを追加」して任意のカラムを追加できます。
+
+## カラムの移動
+カラムは、ドラッグアンドドロップで他のカラムと位置を入れ替えることが出来るほか、カラムメニュー(カラムのヘッダー右クリック)から位置を移動させることもできます。
+
+## カラムの水平分割
+カラムは左右だけでなく、上下に並べることもできます。 カラムメニューを開き、「左に重ねる」を選択すると、左のカラムの下に現在のカラムが移動します。 上下分割を解除するには、カラムメニューの「右に出す」を選択します。
+
+## カラムの設定
+カラムメニューの「編集」を選択するとカラムの設定を編集できます。カラムの名前を変えたり、幅を変えたりできます。
+
+## デッキの設定
+デッキに関する設定は、[settings/deck](/settings/deck)で行えます。
diff --git a/src/docs/ja-KS/follow.md b/src/docs/ja-KS/follow.md
new file mode 100644
index 0000000000..3c1ea7bbe0
--- /dev/null
+++ b/src/docs/ja-KS/follow.md
@@ -0,0 +1,2 @@
+# フォロー
+ユーザーをフォローすると、タイムラインにそのユーザーの投稿が表示されるようになります。ただし、他のユーザーに対する返信は含まれません。 ユーザーをフォローするには、ユーザーページの「フォロー」ボタンをクリックします。フォローを解除するには、もう一度クリックします。
diff --git a/src/docs/ja-KS/keyboard-shortcut.md b/src/docs/ja-KS/keyboard-shortcut.md
new file mode 100644
index 0000000000..8469098cf3
--- /dev/null
+++ b/src/docs/ja-KS/keyboard-shortcut.md
@@ -0,0 +1,68 @@
+# キーボードショートカット
+
+## グローバル
+これらのショートカットは基本的にどこでも使えます。
+<table>
+ <thead>
+ <tr><th>ショートカット</th><th>効果</th><th>由来</th></tr>
+ </thead>
+ <tbody>
+ <tr><td><kbd class="key">P</kbd>, <kbd class="key">N</kbd></td><td>新規投稿</td><td><b>P</b>ost, <b>N</b>ew, <b>N</b>ote</td></tr>
+ <tr><td><kbd class="key">T</kbd></td><td>タイムラインの最も新しい投稿にフォーカス</td><td><b>T</b>imeline, <b>T</b>op</td></tr>
+ <tr><td><kbd class="group"><kbd class="key">Shift</kbd> + <kbd class="key">N</kbd></kbd></td><td>通知を表示/隠す</td><td><b>N</b>otifications</td></tr>
+ <tr><td><kbd class="key">S</kbd></td><td>探す</td><td><b>S</b>earch</td></tr>
+ <tr><td><kbd class="key">H</kbd>, <kbd class="key">?</kbd></td><td>ヘルプを表示</td><td><b>H</b>elp</td></tr>
+ </tbody>
+</table>
+
+## 投稿にフォーカスされた状態
+
+<table>
+ <thead>
+ <tr><th>ショートカット</th><th>効果</th><th>由来</th></tr>
+ </thead>
+ <tbody>
+ <tr><td><kbd class="key">↑</kbd>, <kbd class="key">K</kbd>, <kbd class="group"><kbd class="key">Shift</kbd> + <kbd class="key">Tab</kbd></kbd></td><td>上の投稿にフォーカスを移動</td><td>-</td></tr>
+ <tr><td><kbd class="key">↓</kbd>, <kbd class="key">J</kbd>, <kbd class="key">Tab</kbd></td><td>下の投稿にフォーカスを移動</td><td>-</td></tr>
+ <tr><td><kbd class="key">R</kbd></td><td>返信フォームを開く</td><td><b>R</b>eply</td></tr>
+ <tr><td><kbd class="key">Q</kbd></td><td>Renoteフォームを開く</td><td><b>Q</b>uote</td></tr>
+ <tr><td><kbd class="group"><kbd class="key">Ctrl</kbd> + <kbd class="key">Q</kbd></kbd></td><td>即刻Renoteする(フォームを開かずに)</td><td>-</td></tr>
+ <tr><td><kbd class="key">E</kbd>, <kbd class="key">A</kbd>, <kbd class="key">+</kbd></td><td>リアクションフォームを開く</td><td><b>E</b>mote, re<b>A</b>ction</td></tr>
+ <tr><td><kbd class="key">0</kbd>~<kbd class="key">9</kbd></td><td>数字に対応したリアクションをする(対応については後述)</td><td>-</td></tr>
+ <tr><td><kbd class="key">F</kbd>, <kbd class="key">B</kbd></td><td>お気に入りに登録</td><td><b>F</b>avorite, <b>B</b>ookmark</td></tr>
+ <tr><td><kbd class="key">Del</kbd>, <kbd class="group"><kbd class="key">Ctrl</kbd> + <kbd class="key">D</kbd></kbd></td><td>投稿を削除</td><td><b>D</b>elete</tr>
+ <tr><td><kbd class="key">M</kbd>, <kbd class="key">O</kbd></td><td>投稿に対するメニューを開く</td><td><b>M</b>ore, <b>O</b>ther</td></tr>
+ <tr><td><kbd class="key">S</kbd></td><td>CWで隠された部分を表示 or 隠す</td><td><b>S</b>how, <b>S</b>ee</td></tr>
+ <tr><td><kbd class="key">Esc</kbd></td><td>フォーカスを外す</td><td>-</td></tr>
+ </tbody>
+</table>
+
+## Renoteフォーム
+
+<table>
+ <thead>
+ <tr><th>ショートカット</th><th>効果</th><th>由来</th></tr>
+ </thead>
+ <tbody>
+ <tr><td><kbd class="key">Enter</kbd></td><td>Renoteする</td><td>-</td></tr>
+ <tr><td><kbd class="key">Q</kbd></td><td>フォームを展開する</td><td><b>Q</b>uote</td></tr>
+ <tr><td><kbd class="key">Esc</kbd></td><td>フォームを閉じる</td><td>-</td></tr>
+ </tbody>
+</table>
+
+## リアクションフォーム
+デフォルトで「👍」にフォーカスが当たっている状態です。
+<table>
+ <thead>
+ <tr><th>ショートカット</th><th>効果</th><th>由来</th></tr>
+ </thead>
+ <tbody>
+ <tr><td><kbd class="key">↑</kbd>, <kbd class="key">K</kbd></td><td>上のリアクションにフォーカスを移動</td><td>-</td></tr>
+ <tr><td><kbd class="key">↓</kbd>, <kbd class="key">J</kbd></td><td>下のリアクションにフォーカスを移動</td><td>-</td></tr>
+ <tr><td><kbd class="key">←</kbd>, <kbd class="key">H</kbd>, <kbd class="group"><kbd class="key">Shift</kbd> + <kbd class="key">Tab</kbd></kbd></td><td>左のリアクションにフォーカスを移動</td><td>-</td></tr>
+ <tr><td><kbd class="key">→</kbd>, <kbd class="key">L</kbd>, <kbd class="key">Tab</kbd></td><td>右のリアクションにフォーカスを移動</td><td>-</td></tr>
+ <tr><td><kbd class="key">Enter</kbd>, <kbd class="key">Space</kbd>, <kbd class="key">+</kbd></td><td>リアクション確定</td><td>-</td></tr>
+ <tr><td><kbd class="key">0</kbd>~<kbd class="key">9</kbd></td><td>数字に対応したリアクションで確定</td><td>-</td></tr>
+ <tr><td><kbd class="key">Esc</kbd></td><td>リアクションするのをやめる</td><td>-</td></tr>
+ </tbody>
+</table>
diff --git a/src/docs/ja-KS/mfm.md b/src/docs/ja-KS/mfm.md
new file mode 100644
index 0000000000..e237287acc
--- /dev/null
+++ b/src/docs/ja-KS/mfm.md
@@ -0,0 +1,2 @@
+# MFM
+MFMは、Misskey Flavored Markdownの略で、Misskeyの様々な場所で使用できる専用のマークアップ言語です。 MFMで使用可能な構文は[MFMチートシート](/mfm-cheat-sheet)で確認できます。
diff --git a/src/docs/ja-KS/mute.md b/src/docs/ja-KS/mute.md
new file mode 100644
index 0000000000..6a9608662a
--- /dev/null
+++ b/src/docs/ja-KS/mute.md
@@ -0,0 +1,13 @@
+# ミュート
+
+ユーザーをミュートすると、そのユーザーに関する次のコンテンツがMisskeyに表示されなくなります:
+
+* タイムラインや投稿の検索結果内の、そのユーザーの投稿(およびそれらの投稿に対する返信やRenote)
+* そのユーザーからの通知
+* メッセージ履歴一覧内の、そのユーザーとのメッセージ履歴
+
+ユーザーをミュートするには、対象のユーザーのユーザーページに表示されている「ミュート」ボタンを押します。
+
+ミュートを行ったことは相手に通知されず、ミュートされていることを知ることもできません。
+
+設定>ミュート から、自分がミュートしているユーザー一覧を確認することができます。
diff --git a/src/docs/ja-KS/pages.md b/src/docs/ja-KS/pages.md
new file mode 100644
index 0000000000..a7311b95e6
--- /dev/null
+++ b/src/docs/ja-KS/pages.md
@@ -0,0 +1,10 @@
+# Pages
+
+## 変数
+変数を使うことで動的なページを作成できます。テキスト内で <b>{ 変数名 }</b> と書くとそこに変数の値を埋め込めます。例えば <b>Hello { thing } world!</b> というテキストで、変数(thing)の値が <b>ai</b> だった場合、テキストは <b>Hello ai world!</b> になります。
+
+変数の評価(値を算出すること)は上から下に行われるので、ある変数の中で自分より下の変数を参照することはできません。例えば上から <b>A、B、C</b> と3つの変数を定義したとき、<b>C</b>の中で<b>A</b>や<b>B</b>を参照することはできますが、<b>A</b>の中で<b>B</b>や<b>C</b>を参照することはできません。
+
+ユーザーからの入力を受け取るには、ページに「ユーザー入力」ブロックを設置し、「変数名」に入力を格納したい変数名を設定します(変数は自動で作成されます)。その変数を使ってユーザー入力に応じた動作を行えます。
+
+関数を使うと、値の算出処理を再利用可能な形にまとめることができます。関数を作るには、「関数」タイプの変数を作成します。関数にはスロット(引数)を設定することができ、スロットの値は関数内で変数として利用可能です。また、関数を引数に取る関数(高階関数と呼ばれます)も存在します。関数は予め定義しておくほかに、このような高階関数のスロットに即席でセットすることもできます。
diff --git a/src/docs/ja-KS/reaction.md b/src/docs/ja-KS/reaction.md
new file mode 100644
index 0000000000..c26ead75b3
--- /dev/null
+++ b/src/docs/ja-KS/reaction.md
@@ -0,0 +1,11 @@
+# リアクション
+他の人のノートに、絵文字を付けて簡単にあなたの反応を伝えられる機能です。 リアクションするには、ノートの + アイコンをクリックしてピッカーを表示し、絵文字を選択します。 リアクションには[カスタム絵文字](./custom-emoji)も使用できます。
+
+## リアクションピッカーのカスタマイズ
+ピッカーに表示される絵文字を自分好みにカスタマイズすることができます。 設定の「リアクション」で設定します。
+
+## リモート投稿へのリアクションについて
+リアクションはMisskeyオリジナルの機能であるため、リモートインスタンスがMisskeyでない限りは、ほとんどの場合「Like」としてアクティビティが送信されます。一般的にはLikeは「お気に入り」として実装されているようです。 また、相手がMisskeyであったとしても、カスタム絵文字リアクションは伝わらず、自動的に「👍」等にフォールバックされます。
+
+## リモートからのリアクションについて
+リモートから「Like」アクティビティを受信したとき、Misskeyでは「👍」のリアクションとして解釈されます。
diff --git a/src/docs/ja-KS/reversi-bot.md b/src/docs/ja-KS/reversi-bot.md
new file mode 100644
index 0000000000..7ab2a7212e
--- /dev/null
+++ b/src/docs/ja-KS/reversi-bot.md
@@ -0,0 +1,160 @@
+# MisskeyリバーシBotの開発
+Misskeyのリバーシ機能に対応したBotの開発方法をここに記します。
+
+1. `games/reversi`ストリームに以下のパラメータを付けて接続する:
+ * `i`: botアカウントのAPIキー
+
+2. 対局への招待が来たら、ストリームから`invited`イベントが流れてくる
+ * イベントの中身に、`parent`という名前で対局へ誘ってきたユーザーの情報が含まれている
+
+3. `games/reversi/match`へ、`user_id`として`parent`の`id`が含まれたリクエストを送信する
+
+4. 上手くいくとゲーム情報が返ってくるので、`games/reversi-game`ストリームへ、以下のパラメータを付けて接続する:
+ * `i`: botアカウントのAPIキー
+ * `game`: `game`の`id`
+
+5. この間、相手がゲームの設定を変更するとその都度`update-settings`イベントが流れてくるので、必要であれば何かしらの処理を行う
+
+6. 設定に満足したら、`{ type: 'accept' }`メッセージをストリームに送信する
+
+7. ゲームが開始すると、`started`イベントが流れてくる
+ * イベントの中身にはゲーム情報が含まれている
+
+8. 石を打つには、ストリームに`{ type: 'set', pos: <位置> }`を送信する(位置の計算方法は後述)
+
+9. 相手または自分が石を打つと、ストリームから`set`イベントが流れてくる
+ * `color`として石の色が含まれている
+ * `pos`として位置情報が含まれている
+
+## 位置の計算法
+8x8のマップを考える場合、各マスの位置(インデックスと呼びます)は次のようになっています:
+```
++--+--+--+--+--+--+--+--+
+| 0| 1| 2| 3| 4| 5| 6| 7|
++--+--+--+--+--+--+--+--+
+| 8| 9|10|11|12|13|14|15|
++--+--+--+--+--+--+--+--+
+|16|17|18|19|20|21|22|23|
+...
+```
+
+### X,Y座標 から インデックス に変換する
+```
+pos = x + (y * mapWidth)
+```
+`mapWidth`は、ゲーム情報の`map`から、次のようにして計算できます:
+```
+mapWidth = map[0].length
+```
+
+### インデックス から X,Y座標 に変換する
+```
+x = pos % mapWidth
+y = Math.floor(pos / mapWidth)
+```
+
+## マップ情報
+マップ情報は、ゲーム情報の`map`に入っています。 文字列の配列になっており、ひとつひとつの文字がマス情報を表しています。 それをもとにマップのデザインを知る事が出来ます:
+* `(スペース)` ... マス無し
+* `-` ... マス
+* `b` ... 初期配置される黒石
+* `w` ... 初期配置される白石
+
+例えば、4*4の次のような単純なマップがあるとします:
+```text
++---+---+---+---+
+| | | | |
++---+---+---+---+
+| | ○ | ● | |
++---+---+---+---+
+| | ● | ○ | |
++---+---+---+---+
+| | | | |
++---+---+---+---+
+```
+
+この場合、マップデータはこのようになります:
+```javascript
+['----', '-wb-', '-bw-', '----']
+```
+
+## ユーザーにフォームを提示して対話可能Botを作成する
+ユーザーとのコミュニケーションを行うため、ゲームの設定画面でユーザーにフォームを提示することができます。 例えば、Botの強さをユーザーが設定できるようにする、といったシナリオが考えられます。
+
+フォームを提示するには、`reversi-game`ストリームに次のメッセージを送信します:
+```javascript
+{
+ type: 'init-form',
+ body: [フォームコントロールの配列]
+}
+```
+
+フォームコントロールの配列については今から説明します。 フォームコントロールは、次のようなオブジェクトです:
+```javascript
+{
+ id: 'switch1',
+ type: 'switch',
+ label: 'Enable hoge',
+ value: false
+}
+```
+`id` ... コントロールのID。 `type` ... コントロールの種類。後述します。 `label` ... コントロールと一緒に表記するテキスト。 `value` ... コントロールのデフォルト値。
+
+### フォームの操作を受け取る
+ユーザーがフォームを操作すると、ストリームから`update-form`イベントが流れてきます。 イベントの中身には、コントロールのIDと、ユーザーが設定した値が含まれています。 例えば、上で示したスイッチをユーザーがオンにしたとすると、次のイベントが流れてきます:
+```javascript
+{
+ id: 'switch1',
+ value: true
+}
+```
+
+### フォームコントロールの種類
+#### スイッチ
+type: `switch` スイッチを表示します。何かの機能をオン/オフさせたい場合に有用です。
+
+##### プロパティ
+`label` ... スイッチに表記するテキスト。
+
+#### ラジオボタン
+type: `radio` ラジオボタンを表示します。選択肢を提示するのに有用です。例えば、Botの強さを設定させるなどです。
+
+##### プロパティ
+`items` ... ラジオボタンの選択肢。例:
+```javascript
+items: [{
+ label: '弱',
+ value: 1
+}, {
+ label: '中',
+ value: 2
+}, {
+ label: '強',
+ value: 3
+}]
+```
+
+#### スライダー
+type: `slider` スライダーを表示します。
+
+##### プロパティ
+`min` ... スライダーの下限。 `max` ... スライダーの上限。 `step` ... 入力欄で刻むステップ値。
+
+#### テキストボックス
+type: `textbox` テキストボックスを表示します。ユーザーになにか入力させる一般的な用途に利用できます。
+
+## ユーザーにメッセージを表示する
+設定画面でユーザーと対話する、フォーム以外のもうひとつの方法がこれです。ユーザーになにかメッセージを表示することができます。 例えば、ユーザーがBotの対応していないモードやマップを選択したとき、警告を表示するなどです。 メッセージを表示するには、次のメッセージをストリームに送信します:
+```javascript
+{
+ type: 'message',
+ body: {
+ text: 'メッセージ内容',
+ type: 'メッセージの種類'
+ }
+}
+```
+メッセージの種類: `success`, `info`, `warning`, `error`。
+
+## 投了する
+投了をするには、<a href="./api/endpoints/games/reversi/games/surrender">このエンドポイント</a>にリクエストします。
diff --git a/src/docs/ja-KS/stream.md b/src/docs/ja-KS/stream.md
new file mode 100644
index 0000000000..9011c37c5b
--- /dev/null
+++ b/src/docs/ja-KS/stream.md
@@ -0,0 +1,354 @@
+# ストリーミングAPI
+
+ストリーミングAPIを使うと、リアルタイムで様々な情報(例えばタイムラインに新しい投稿が流れてきた、メッセージが届いた、フォローされた、など)を受け取ったり、様々な操作を行ったりすることができます。
+
+## ストリームに接続する
+
+ストリーミングAPIを利用するには、まずMisskeyサーバーに**websocket**接続する必要があります。
+
+以下のURLに、`i`というパラメータ名で認証情報を含めて、websocket接続してください。例:
+```
+%WS_URL%/streaming?i=xxxxxxxxxxxxxxx
+```
+
+認証情報は、自分のAPIキーや、アプリケーションからストリームに接続する際はユーザーのアクセストークンのことを指します。
+
+<div class="ui info">
+ <p><i class="fas fa-info-circle"></i> 認証情報の取得については、<a href="./api">こちらのドキュメント</a>をご確認ください。</p>
+</div>
+
+---
+
+認証情報は省略することもできますが、その場合非ログインでの利用ということになり、受信できる情報や可能な操作は限られます。例:
+
+```
+%WS_URL%/streaming
+```
+
+---
+
+ストリームに接続すると、後述するAPI操作や、投稿の購読を行ったりすることができます。 しかしまだこの段階では、例えばタイムラインへの新しい投稿を受信したりすることはできません。 それを行うには、ストリーム上で、後述する**チャンネル**に接続する必要があります。
+
+**ストリームでのやり取りはすべてJSONです。**
+
+## チャンネル
+MisskeyのストリーミングAPIにはチャンネルという概念があります。これは、送受信する情報を分離するための仕組みです。 Misskeyのストリームに接続しただけでは、まだリアルタイムでタイムラインの投稿を受信したりはできません。 ストリーム上でチャンネルに接続することで、様々な情報を受け取ったり情報を送信したりすることができるようになります。
+
+### チャンネルに接続する
+チャンネルに接続するには、次のようなデータをJSONでストリームに送信します:
+
+```json
+{
+ type: 'connect',
+ body: {
+ channel: 'xxxxxxxx',
+ id: 'foobar',
+ params: {
+ ...
+ }
+ }
+}
+```
+
+ここで、
+* `channel`には接続したいチャンネル名を設定します。チャンネルの種類については後述します。
+* `id`にはそのチャンネルとやり取りするための任意のIDを設定します。ストリームでは様々なメッセージが流れるので、そのメッセージがどのチャンネルからのものなのか識別する必要があるからです。このIDは、UUIDや、乱数のようなもので構いません。
+* `params`はチャンネルに接続する際のパラメータです。チャンネルによって接続時に必要とされるパラメータは異なります。パラメータ不要のチャンネルに接続する際は、このプロパティは省略可能です。
+
+<div class="ui info">
+ <p><i class="fas fa-info-circle"></i> IDはチャンネルごとではなく「チャンネルの接続ごと」です。なぜなら、同じチャンネルに異なるパラメータで複数接続するケースもあるからです。</p>
+</div>
+
+### チャンネルからのメッセージを受け取る
+例えばタイムラインのチャンネルなら、新しい投稿があった時にメッセージを発します。そのメッセージを受け取ることで、タイムラインに新しい投稿がされたことをリアルタイムで知ることができます。
+
+チャンネルがメッセージを発すると、次のようなデータがJSONでストリームに流れてきます:
+```json
+{
+ type: 'channel',
+ body: {
+ id: 'foobar',
+ type: 'something',
+ body: {
+ some: 'thing'
+ }
+ }
+}
+```
+
+ここで、
+* `id`には前述したそのチャンネルに接続する際に設定したIDが設定されています。これで、このメッセージがどのチャンネルからのものなのか知ることができます。
+* `type`にはメッセージの種類が設定されます。チャンネルによって、どのような種類のメッセージが流れてくるかは異なります。
+* `body`にはメッセージの内容が設定されます。チャンネルによって、どのような内容のメッセージが流れてくるかは異なります。
+
+### チャンネルに向けてメッセージを送信する
+チャンネルによっては、メッセージを受け取るだけでなく、こちらから何かメッセージを送信し、何らかの操作を行える場合があります。
+
+チャンネルにメッセージを送信するには、次のようなデータをJSONでストリームに送信します:
+```json
+{
+ type: 'channel',
+ body: {
+ id: 'foobar',
+ type: 'something',
+ body: {
+ some: 'thing'
+ }
+ }
+}
+```
+
+ここで、
+* `id`には前述したそのチャンネルに接続する際に設定したIDを設定します。これで、このメッセージがどのチャンネルに向けたものなのか識別させることができます。
+* `type`にはメッセージの種類を設定します。チャンネルによって、どのような種類のメッセージを受け付けるかは異なります。
+* `body`にはメッセージの内容を設定します。チャンネルによって、どのような内容のメッセージを受け付けるかは異なります。
+
+### チャンネルから切断する
+チャンネルから切断するには、次のようなデータをJSONでストリームに送信します:
+
+```json
+{
+ type: 'disconnect',
+ body: {
+ id: 'foobar'
+ }
+}
+```
+
+ここで、
+* `id`には前述したそのチャンネルに接続する際に設定したIDを設定します。
+
+## ストリームを経由してAPIリクエストする
+
+ストリームを経由してAPIリクエストすると、HTTPリクエストを発生させずにAPIを利用できます。そのため、コードを簡潔にできたり、パフォーマンスの向上を見込めるかもしれません。
+
+ストリームを経由してAPIリクエストするには、次のようなデータをJSONでストリームに送信します:
+```json
+{
+ type: 'api',
+ body: {
+ id: 'xxxxxxxxxxxxxxxx',
+ endpoint: 'notes/create',
+ data: {
+ text: 'yee haw!'
+ }
+ }
+}
+```
+
+ここで、
+* `id`には、APIのレスポンスを識別するための、APIリクエストごとの一意なIDを設定する必要があります。UUIDや、簡単な乱数のようなもので構いません。
+* `endpoint`には、あなたがリクエストしたいAPIのエンドポイントを指定します。
+* `data`には、エンドポイントのパラメータを含めます。
+
+<div class="ui info">
+ <p><i class="fas fa-info-circle"></i> APIのエンドポイントやパラメータについてはAPIリファレンスをご確認ください。</p>
+</div>
+
+### レスポンスの受信
+
+APIへリクエストすると、レスポンスがストリームから次のような形式で流れてきます。
+
+```json
+{
+ type: 'api:xxxxxxxxxxxxxxxx',
+ body: {
+ ...
+ }
+}
+```
+
+ここで、
+* `xxxxxxxxxxxxxxxx`の部分には、リクエストの際に設定された`id`が含まれています。これにより、どのリクエストに対するレスポンスなのか判別することができます。
+* `body`には、レスポンスが含まれています。
+
+## 投稿のキャプチャ
+
+Misskeyは投稿のキャプチャと呼ばれる仕組みを提供しています。これは、指定した投稿のイベントをストリームで受け取る機能です。
+
+例えばタイムラインを取得してユーザーに表示したとします。ここで誰かがそのタイムラインに含まれるどれかの投稿に対してリアクションしたとします。
+
+しかし、クライアントからするとある投稿にリアクションが付いたことなどは知る由がないため、リアルタイムでリアクションをタイムライン上の投稿に反映して表示するといったことができません。
+
+この問題を解決するために、Misskeyは投稿のキャプチャ機構を用意しています。投稿をキャプチャすると、その投稿に関するイベントを受け取ることができるため、リアルタイムでリアクションを反映させたりすることが可能になります。
+
+### 投稿をキャプチャする
+
+投稿をキャプチャするには、ストリームに次のようなメッセージを送信します:
+
+```json
+{
+ type: 'subNote',
+ body: {
+ id: 'xxxxxxxxxxxxxxxx'
+ }
+}
+```
+
+ここで、
+* `id`にキャプチャしたい投稿の`id`を設定します。
+
+このメッセージを送信すると、Misskeyにキャプチャを要請したことになり、以後、その投稿に関するイベントが流れてくるようになります。
+
+例えば投稿にリアクションが付いたとすると、次のようなメッセージが流れてきます:
+
+```json
+{
+ type: 'noteUpdated',
+ body: {
+ id: 'xxxxxxxxxxxxxxxx',
+ type: 'reacted',
+ body: {
+ reaction: 'like',
+ userId: 'yyyyyyyyyyyyyyyy'
+ }
+ }
+}
+```
+
+ここで、
+* `body`内の`id`に、イベントを発生させた投稿のIDが設定されます。
+* `body`内の`type`に、イベントの種類が設定されます。
+* `body`内の`body`に、イベントの詳細が設定されます。
+
+#### イベントの種類
+
+##### `reacted`
+その投稿にリアクションがされた時に発生します。
+
+* `reaction`に、リアクションの種類が設定されます。
+* `userId`に、リアクションを行ったユーザーのIDが設定されます。
+
+例:
+```json
+{
+ type: 'noteUpdated',
+ body: {
+ id: 'xxxxxxxxxxxxxxxx',
+ type: 'reacted',
+ body: {
+ reaction: 'like',
+ userId: 'yyyyyyyyyyyyyyyy'
+ }
+ }
+}
+```
+
+##### `deleted`
+その投稿が削除された時に発生します。
+
+* `deletedAt`に、削除日時が設定されます。
+
+例:
+```json
+{
+ type: 'noteUpdated',
+ body: {
+ id: 'xxxxxxxxxxxxxxxx',
+ type: 'deleted',
+ body: {
+ deletedAt: '2018-10-22T02:17:09.703Z'
+ }
+ }
+}
+```
+
+##### `pollVoted`
+その投稿に添付されたアンケートに投票された時に発生します。
+
+* `choice`に、選択肢IDが設定されます。
+* `userId`に、投票を行ったユーザーのIDが設定されます。
+
+例:
+```json
+{
+ type: 'noteUpdated',
+ body: {
+ id: 'xxxxxxxxxxxxxxxx',
+ type: 'pollVoted',
+ body: {
+ choice: 2,
+ userId: 'yyyyyyyyyyyyyyyy'
+ }
+ }
+}
+```
+
+### 投稿のキャプチャを解除する
+
+その投稿がもう画面に表示されなくなったりして、その投稿に関するイベントをもう受け取る必要がなくなったときは、キャプチャの解除を申請してください。
+
+次のメッセージを送信します:
+
+```json
+{
+ type: 'unsubNote',
+ body: {
+ id: 'xxxxxxxxxxxxxxxx'
+ }
+}
+```
+
+ここで、
+* `id`にキャプチャを解除したい投稿の`id`を設定します。
+
+このメッセージを送信すると、以後、その投稿に関するイベントは流れてこないようになります。
+
+# チャンネル一覧
+## `main`
+アカウントに関する基本的な情報が流れてきます。このチャンネルにパラメータはありません。
+
+### 流れてくるイベント一覧
+
+#### `renote`
+自分の投稿がRenoteされた時に発生するイベントです。自分自身の投稿をRenoteしたときは発生しません。
+
+#### `mention`
+誰かからメンションされたときに発生するイベントです。
+
+#### `readAllNotifications`
+自分宛ての通知がすべて既読になったことを表すイベントです。このイベントを利用して、「通知があることを示すアイコン」のようなものをオフにしたりする等のケースが想定されます。
+
+#### `meUpdated`
+自分の情報が更新されたことを表すイベントです。
+
+#### `follow`
+自分が誰かをフォローしたときに発生するイベントです。
+
+#### `unfollow`
+自分が誰かのフォローを解除したときに発生するイベントです。
+
+#### `followed`
+自分が誰かにフォローされたときに発生するイベントです。
+
+## `homeTimeline`
+ホームタイムラインの投稿情報が流れてきます。このチャンネルにパラメータはありません。
+
+### 流れてくるイベント一覧
+
+#### `note`
+タイムラインに新しい投稿が流れてきたときに発生するイベントです。
+
+## `localTimeline`
+ローカルタイムラインの投稿情報が流れてきます。このチャンネルにパラメータはありません。
+
+### 流れてくるイベント一覧
+
+#### `note`
+ローカルタイムラインに新しい投稿が流れてきたときに発生するイベントです。
+
+## `hybridTimeline`
+ソーシャルタイムラインの投稿情報が流れてきます。このチャンネルにパラメータはありません。
+
+### 流れてくるイベント一覧
+
+#### `note`
+ソーシャルタイムラインに新しい投稿が流れてきたときに発生するイベントです。
+
+## `globalTimeline`
+グローバルタイムラインの投稿情報が流れてきます。このチャンネルにパラメータはありません。
+
+### 流れてくるイベント一覧
+
+#### `note`
+グローバルタイムラインに新しい投稿が流れてきたときに発生するイベントです。
diff --git a/src/docs/ja-KS/theme.md b/src/docs/ja-KS/theme.md
new file mode 100644
index 0000000000..4e52ee8cd7
--- /dev/null
+++ b/src/docs/ja-KS/theme.md
@@ -0,0 +1,68 @@
+# テーマ
+
+テーマを設定して、Misskeyクライアントの見た目を変更できます。
+
+## テーマの設定
+設定 > テーマ
+
+## テーマを作成する
+テーマコードはJSON5で記述されたテーマオブジェクトです。 テーマは以下のようなオブジェクトです。
+``` js
+{
+ id: '17587283-dd92-4a2c-a22c-be0637c9e22a',
+
+ name: 'Danboard',
+ author: 'syuilo',
+
+ base: 'light',
+
+ props: {
+ accent: 'rgb(218, 141, 49)',
+ bg: 'rgb(218, 212, 190)',
+ fg: 'rgb(115, 108, 92)',
+ panel: 'rgb(236, 232, 220)',
+ renote: 'rgb(100, 152, 106)',
+ link: 'rgb(100, 152, 106)',
+ mention: '@accent',
+ hashtag: 'rgb(100, 152, 106)',
+ header: 'rgba(239, 227, 213, 0.75)',
+ navBg: 'rgb(216, 206, 182)',
+ inputBorder: 'rgba(0, 0, 0, 0.1)',
+ },
+}
+
+```
+
+* `id` ... テーマの一意なID。UUIDをおすすめします。
+* `name` ... テーマ名
+* `author` ... テーマの作者
+* `desc` ... テーマの説明(オプション)
+* `base` ... 明るいテーマか、暗いテーマか
+ * `light`にすると明るいテーマになり、`dark`にすると暗いテーマになります。
+ * テーマはここで設定されたベーステーマを継承します。
+* `props` ... テーマのスタイル定義。これから説明します。
+
+### テーマのスタイル定義
+`props`下にはテーマのスタイルを定義します。 キーがCSSの変数名になり、バリューで中身を指定します。 なお、この`props`オブジェクトはベーステーマから継承されます。 ベーステーマは、このテーマの`base`が`light`なら[_light.json5](https://github.com/syuilo/misskey/blob/develop/src/client/themes/_light.json5)で、`dark`なら[_dark.json5](https://github.com/syuilo/misskey/blob/develop/src/client/themes/_dark.json5)です。 つまり、このテーマ内の`props`に`panel`というキーが無くても、そこにはベーステーマの`panel`があると見なされます。
+
+#### バリューで使える構文
+* 16進数で表された色
+ * 例: `#00ff00`
+* `rgb(r, g, b)`形式で表された色
+ * 例: `rgb(0, 255, 0)`
+* `rgb(r, g, b, a)`形式で表された透明度を含む色
+ * 例: `rgba(0, 255, 0, 0.5)`
+* 他のキーの値の参照
+ * `@{キー名}`と書くと他のキーの値の参照になります。`{キー名}`は参照したいキーの名前に置き換えます。
+ * 例: `@panel`
+* 定数(後述)の参照
+ * `${定数名}`と書くと定数の参照になります。`{定数名}`は参照したい定数の名前に置き換えます。
+ * 例: `$main`
+* 関数(後述)
+ * `:{関数名}<{引数}<{色}`
+
+#### 定数
+「CSS変数として出力はしたくないが、他のCSS変数の値として使いまわしたい」値があるときは、定数を使うと便利です。 キー名を`$`で始めると、そのキーはCSS変数として出力されません。
+
+#### 関数
+wip
diff --git a/src/docs/ja-KS/timelines.md b/src/docs/ja-KS/timelines.md
new file mode 100644
index 0000000000..36ba61bd2d
--- /dev/null
+++ b/src/docs/ja-KS/timelines.md
@@ -0,0 +1,15 @@
+# タイムラインの比較
+
+https://docs.google.com/spreadsheets/d/1lxQ2ugKrhz58Bg96HTDK_2F98BUritkMyIiBkOByjHA/edit?usp=sharing
+
+## ホーム
+自分のフォローしているユーザーの投稿
+
+## ローカル
+全てのローカルユーザーの「ホーム」指定されていない投稿
+
+## ソーシャル
+自分のフォローしているユーザーの投稿と、全てのローカルユーザーの「ホーム」指定されていない投稿
+
+## グローバル
+全てのローカルユーザーの「ホーム」指定されていない投稿と、サーバーに届いた全てのリモートユーザーの「ホーム」指定されていない投稿
diff --git a/src/docs/kab-KAB/aiscript.md b/src/docs/kab-KAB/aiscript.md
new file mode 100644
index 0000000000..6c28b446e3
--- /dev/null
+++ b/src/docs/kab-KAB/aiscript.md
@@ -0,0 +1,4 @@
+# AiScript
+
+## 関数
+デフォルトで値渡しです。
diff --git a/src/docs/kab-KAB/api.md b/src/docs/kab-KAB/api.md
new file mode 100644
index 0000000000..76019b6145
--- /dev/null
+++ b/src/docs/kab-KAB/api.md
@@ -0,0 +1,58 @@
+# Misskey API
+
+MisskeyAPIを使ってMisskeyクライアント、Misskey連携Webサービス、Bot等(以下「アプリケーション」と呼びます)を開発できます。 ストリーミングAPIもあるので、リアルタイム性のあるアプリケーションを作ることも可能です。
+
+APIを使い始めるには、まずアクセストークンを取得する必要があります。 このドキュメントでは、アクセストークンを取得する手順を説明した後、基本的なAPIの使い方を説明します。
+
+## アクセストークンの取得
+基本的に、APIはリクエストにはアクセストークンが必要となります。 APIにリクエストするのが自分自身なのか、不特定の利用者に使ってもらうアプリケーションなのかによって取得手順は異なります。
+
+* 前者の場合: [「自分自身のアクセストークンを手動発行する」](#自分自身のアクセストークンを手動発行する)に進む
+* 後者の場合: [「アプリケーション利用者にアクセストークンの発行をリクエストする」](#アプリケーション利用者にアクセストークンの発行をリクエストする)に進む
+
+### 自分自身のアクセストークンを手動発行する
+「設定 > API」で、自分のアクセストークンを発行できます。
+
+[「APIの使い方」へ進む](#APIの使い方)
+
+### アプリケーション利用者にアクセストークンの発行をリクエストする
+アプリケーション利用者のアクセストークンを取得するには、以下の手順で発行をリクエストします。
+
+#### Step 1
+
+UUIDを生成する。以後これをセッションIDと呼びます。
+
+> このセッションIDは毎回生成し、使いまわさないようにしてください。
+
+#### Step 2
+
+`{_URL_}/miauth/{session}`をユーザーのブラウザで表示させる。`{session}`の部分は、セッションIDに置き換えてください。
+> 例: `{_URL_}/miauth/c1f6d42b-468b-4fd2-8274-e58abdedef6f`
+
+表示する際、URLにクエリパラメータとしていくつかのオプションを設定できます:
+* `name` ... アプリケーション名
+ * > 例: `MissDeck`
+* `icon` ... アプリケーションのアイコン画像URL
+ * > 例: `https://missdeck.example.com/icon.png`
+* `callback` ... 認証が終わった後にリダイレクトするURL
+ * > 例: `https://missdeck.example.com/callback`
+ * リダイレクト時には、`session`というクエリパラメータでセッションIDが付きます
+* `permission` ... アプリケーションが要求する権限
+ * > 例: `write:notes,write:following,read:drive`
+ * 要求する権限を`,`で区切って列挙します
+ * どのような権限があるかは[APIリファレンス](/api-doc)で確認できます
+
+#### Step 3
+ユーザーが発行を許可した後、`{_URL_}/api/miauth/{session}/check`にPOSTリクエストすると、レスポンスとしてアクセストークンを含むJSONが返ります。
+
+レスポンスに含まれるプロパティ:
+* `token` ... ユーザーのアクセストークン
+* `user` ... ユーザーの情報
+
+[「APIの使い方」へ進む](#APIの使い方)
+
+## APIの使い方
+**APIはすべてPOSTで、リクエスト/レスポンスともにJSON形式です。RESTではありません。** アクセストークンは、`i`というパラメータ名でリクエストに含めます。
+
+* [APIリファレンス](/api-doc)
+* [ストリーミングAPI](./stream)
diff --git a/src/docs/kab-KAB/create-plugin.md b/src/docs/kab-KAB/create-plugin.md
new file mode 100644
index 0000000000..0d2fa19178
--- /dev/null
+++ b/src/docs/kab-KAB/create-plugin.md
@@ -0,0 +1,74 @@
+# プラグインの作成
+Misskey Webクライアントのプラグイン機能を使うと、クライアントを拡張し、様々な機能を追加できます。 ここではプラグインの作成にあたってのメタデータ定義や、AiScript APIリファレンスを掲載します。
+
+## メタデータ
+プラグインは、AiScriptのメタデータ埋め込み機能を使って、デフォルトとしてプラグインのメタデータを定義する必要があります。 メタデータは次のプロパティを含むオブジェクトです。
+
+### name
+プラグイン名
+
+### author
+プラグイン作者
+
+### version
+プラグインバージョン。数値を指定してください。
+
+### description
+プラグインの説明
+
+### permissions
+プラグインが要求する権限。MisskeyAPIにリクエストする際に用いられます。
+
+### config
+プラグインの設定情報を表すオブジェクト。 キーに設定名、値に以下のプロパティを含めます。
+
+#### type
+設定値の種類を表す文字列。以下から選択します。 string number boolean
+
+#### label
+ユーザーに表示する設定名
+
+#### description
+設定の説明
+
+#### default
+設定のデフォルト値
+
+## APIリファレンス
+AiScript標準で組み込まれているAPIは掲載しません。
+
+### Mk:dialog(title text type)
+ダイアログを表示します。typeには以下の値が設定できます。 info success warn error question 省略すると info になります。
+
+### Mk:confirm(title text type)
+確認ダイアログを表示します。typeには以下の値が設定できます。 info success warn error question 省略すると question になります。 ユーザーが"OK"を選択した場合は true を、"キャンセル"を選択した場合は false が返ります。
+
+### Mk:api(endpoint params)
+Misskey APIにリクエストします。第一引数にエンドポイント名、第二引数にパラメータオブジェクトを渡します。
+
+### Mk:save(key value)
+任意の値に任意の名前を付けて永続化します。永続化した値は、AiScriptコンテキストが終了しても残り、Mk:loadで読み取ることができます。
+
+### Mk:load(key)
+Mk:saveで永続化した指定の名前の値を読み取ります。
+
+### Plugin:register_post_form_action(title fn)
+投稿フォームにアクションを追加します。第一引数にアクション名、第二引数にアクションが選択された際のコールバック関数を渡します。 コールバック関数には、第一引数に投稿フォームオブジェクトが渡されます。
+
+### Plugin:register_note_action(title fn)
+ノートメニューに項目を追加します。第一引数に項目名、第二引数に項目が選択された際のコールバック関数を渡します。 コールバック関数には、第一引数に対象のノートオブジェクトが渡されます。
+
+### Plugin:register_user_action(title fn)
+ユーザーメニューに項目を追加します。第一引数に項目名、第二引数に項目が選択された際のコールバック関数を渡します。 コールバック関数には、第一引数に対象のユーザーオブジェクトが渡されます。
+
+### Plugin:register_note_view_interruptor(fn)
+UIに表示されるノート情報を書き換えます。 コールバック関数には、第一引数に対象のノートオブジェクトが渡されます。 コールバック関数の返り値でノートが書き換えられます。
+
+### Plugin:register_note_post_interruptor(fn)
+ノート投稿時にノート情報を書き換えます。 コールバック関数には、第一引数に対象のノートオブジェクトが渡されます。 コールバック関数の返り値でノートが書き換えられます。
+
+### Plugin:open_url(url)
+第一引数に渡されたURLをブラウザの新しいタブで開きます。
+
+### Plugin:config
+プラグインの設定が格納されるオブジェクト。プラグイン定義のconfigで設定したキーで値が入ります。
diff --git a/src/docs/kab-KAB/custom-emoji.md b/src/docs/kab-KAB/custom-emoji.md
new file mode 100644
index 0000000000..ed2e92be16
--- /dev/null
+++ b/src/docs/kab-KAB/custom-emoji.md
@@ -0,0 +1,2 @@
+# カスタム絵文字
+カスタム絵文字は、インスタンスで用意された画像を絵文字のように使える機能です。 ノート、リアクション、チャット、自己紹介、名前などの場所で使うことができます。 カスタム絵文字をそれらの場所で使うには、絵文字ピッカーボタン(ある場合)を押すか、`:`を入力して絵文字サジェストを表示します。 テキスト内に`:foo:`のような形式の文字列が見つかると、`foo`の部分がカスタム絵文字名と解釈され、表示時には対応したカスタム絵文字に置き換わります。
diff --git a/src/docs/kab-KAB/deck.md b/src/docs/kab-KAB/deck.md
new file mode 100644
index 0000000000..8057e262fd
--- /dev/null
+++ b/src/docs/kab-KAB/deck.md
@@ -0,0 +1,18 @@
+# デッキ
+
+デッキは利用可能なUIのひとつです。「カラム」と呼ばれるビューを複数並べて表示させることで、カスタマイズ性が高く、情報量の多いUIが構築できることが特徴です。
+
+## カラムの追加
+デッキの背景を右クリックし、「カラムを追加」して任意のカラムを追加できます。
+
+## カラムの移動
+カラムは、ドラッグアンドドロップで他のカラムと位置を入れ替えることが出来るほか、カラムメニュー(カラムのヘッダー右クリック)から位置を移動させることもできます。
+
+## カラムの水平分割
+カラムは左右だけでなく、上下に並べることもできます。 カラムメニューを開き、「左に重ねる」を選択すると、左のカラムの下に現在のカラムが移動します。 上下分割を解除するには、カラムメニューの「右に出す」を選択します。
+
+## カラムの設定
+カラムメニューの「編集」を選択するとカラムの設定を編集できます。カラムの名前を変えたり、幅を変えたりできます。
+
+## デッキの設定
+デッキに関する設定は、[settings/deck](/settings/deck)で行えます。
diff --git a/src/docs/kab-KAB/follow.md b/src/docs/kab-KAB/follow.md
new file mode 100644
index 0000000000..500073a4b5
--- /dev/null
+++ b/src/docs/kab-KAB/follow.md
@@ -0,0 +1,2 @@
+# Ig ṭṭafaṛ
+ユーザーをフォローすると、タイムラインにそのユーザーの投稿が表示されるようになります。ただし、他のユーザーに対する返信は含まれません。 ユーザーをフォローするには、ユーザーページの「フォロー」ボタンをクリックします。フォローを解除するには、もう一度クリックします。
diff --git a/src/docs/kab-KAB/keyboard-shortcut.md b/src/docs/kab-KAB/keyboard-shortcut.md
new file mode 100644
index 0000000000..3b15afa682
--- /dev/null
+++ b/src/docs/kab-KAB/keyboard-shortcut.md
@@ -0,0 +1,68 @@
+# キーボードショートカット
+
+## グローバル
+これらのショートカットは基本的にどこでも使えます。
+<table>
+ <thead>
+ <tr><th>ショートカット</th><th>効果</th><th>由来</th></tr>
+ </thead>
+ <tbody>
+ <tr><td><kbd class="key">P</kbd>, <kbd class="key">N</kbd></td><td>新規投稿</td><td><b>P</b>ost, <b>N</b>ew, <b>N</b>ote</td></tr>
+ <tr><td><kbd class="key">T</kbd></td><td>タイムラインの最も新しい投稿にフォーカス</td><td><b>T</b>imeline, <b>T</b>op</td></tr>
+ <tr><td><kbd class="group"><kbd class="key">Shift</kbd> + <kbd class="key">N</kbd></kbd></td><td>通知を表示/隠す</td><td><b>N</b>otifications</td></tr>
+ <tr><td><kbd class="key">S</kbd></td><td>Nadi</td><td><b>S</b>earch</td></tr>
+ <tr><td><kbd class="key">H</kbd>, <kbd class="key">?</kbd></td><td>ヘルプを表示</td><td><b>H</b>elp</td></tr>
+ </tbody>
+</table>
+
+## 投稿にフォーカスされた状態
+
+<table>
+ <thead>
+ <tr><th>ショートカット</th><th>効果</th><th>由来</th></tr>
+ </thead>
+ <tbody>
+ <tr><td><kbd class="key">↑</kbd>, <kbd class="key">K</kbd>, <kbd class="group"><kbd class="key">Shift</kbd> + <kbd class="key">Tab</kbd></kbd></td><td>上の投稿にフォーカスを移動</td><td>-</td></tr>
+ <tr><td><kbd class="key">↓</kbd>, <kbd class="key">J</kbd>, <kbd class="key">Tab</kbd></td><td>下の投稿にフォーカスを移動</td><td>-</td></tr>
+ <tr><td><kbd class="key">R</kbd></td><td>返信フォームを開く</td><td><b>R</b>eply</td></tr>
+ <tr><td><kbd class="key">Q</kbd></td><td>Renoteフォームを開く</td><td><b>Q</b>uote</td></tr>
+ <tr><td><kbd class="group"><kbd class="key">Ctrl</kbd> + <kbd class="key">Q</kbd></kbd></td><td>即刻Renoteする(フォームを開かずに)</td><td>-</td></tr>
+ <tr><td><kbd class="key">E</kbd>, <kbd class="key">A</kbd>, <kbd class="key">+</kbd></td><td>リアクションフォームを開く</td><td><b>E</b>mote, re<b>A</b>ction</td></tr>
+ <tr><td><kbd class="key">0</kbd>~<kbd class="key">9</kbd></td><td>数字に対応したリアクションをする(対応については後述)</td><td>-</td></tr>
+ <tr><td><kbd class="key">F</kbd>, <kbd class="key">B</kbd></td><td>お気に入りに登録</td><td><b>F</b>avorite, <b>B</b>ookmark</td></tr>
+ <tr><td><kbd class="key">Del</kbd>, <kbd class="group"><kbd class="key">Ctrl</kbd> + <kbd class="key">D</kbd></kbd></td><td>投稿を削除</td><td><b>D</b>elete</tr>
+ <tr><td><kbd class="key">M</kbd>, <kbd class="key">O</kbd></td><td>投稿に対するメニューを開く</td><td><b>M</b>ore, <b>O</b>ther</td></tr>
+ <tr><td><kbd class="key">S</kbd></td><td>CWで隠された部分を表示 or 隠す</td><td><b>S</b>how, <b>S</b>ee</td></tr>
+ <tr><td><kbd class="key">Esc</kbd></td><td>フォーカスを外す</td><td>-</td></tr>
+ </tbody>
+</table>
+
+## Renoteフォーム
+
+<table>
+ <thead>
+ <tr><th>ショートカット</th><th>効果</th><th>由来</th></tr>
+ </thead>
+ <tbody>
+ <tr><td><kbd class="key">Enter</kbd></td><td>Renoteする</td><td>-</td></tr>
+ <tr><td><kbd class="key">Q</kbd></td><td>フォームを展開する</td><td><b>Q</b>uote</td></tr>
+ <tr><td><kbd class="key">Esc</kbd></td><td>フォームを閉じる</td><td>-</td></tr>
+ </tbody>
+</table>
+
+## リアクションフォーム
+デフォルトで「👍」にフォーカスが当たっている状態です。
+<table>
+ <thead>
+ <tr><th>ショートカット</th><th>効果</th><th>由来</th></tr>
+ </thead>
+ <tbody>
+ <tr><td><kbd class="key">↑</kbd>, <kbd class="key">K</kbd></td><td>上のリアクションにフォーカスを移動</td><td>-</td></tr>
+ <tr><td><kbd class="key">↓</kbd>, <kbd class="key">J</kbd></td><td>下のリアクションにフォーカスを移動</td><td>-</td></tr>
+ <tr><td><kbd class="key">←</kbd>, <kbd class="key">H</kbd>, <kbd class="group"><kbd class="key">Shift</kbd> + <kbd class="key">Tab</kbd></kbd></td><td>左のリアクションにフォーカスを移動</td><td>-</td></tr>
+ <tr><td><kbd class="key">→</kbd>, <kbd class="key">L</kbd>, <kbd class="key">Tab</kbd></td><td>右のリアクションにフォーカスを移動</td><td>-</td></tr>
+ <tr><td><kbd class="key">Enter</kbd>, <kbd class="key">Space</kbd>, <kbd class="key">+</kbd></td><td>リアクション確定</td><td>-</td></tr>
+ <tr><td><kbd class="key">0</kbd>~<kbd class="key">9</kbd></td><td>数字に対応したリアクションで確定</td><td>-</td></tr>
+ <tr><td><kbd class="key">Esc</kbd></td><td>リアクションするのをやめる</td><td>-</td></tr>
+ </tbody>
+</table>
diff --git a/src/docs/kab-KAB/mfm.md b/src/docs/kab-KAB/mfm.md
new file mode 100644
index 0000000000..e237287acc
--- /dev/null
+++ b/src/docs/kab-KAB/mfm.md
@@ -0,0 +1,2 @@
+# MFM
+MFMは、Misskey Flavored Markdownの略で、Misskeyの様々な場所で使用できる専用のマークアップ言語です。 MFMで使用可能な構文は[MFMチートシート](/mfm-cheat-sheet)で確認できます。
diff --git a/src/docs/kab-KAB/mute.md b/src/docs/kab-KAB/mute.md
new file mode 100644
index 0000000000..6a9608662a
--- /dev/null
+++ b/src/docs/kab-KAB/mute.md
@@ -0,0 +1,13 @@
+# ミュート
+
+ユーザーをミュートすると、そのユーザーに関する次のコンテンツがMisskeyに表示されなくなります:
+
+* タイムラインや投稿の検索結果内の、そのユーザーの投稿(およびそれらの投稿に対する返信やRenote)
+* そのユーザーからの通知
+* メッセージ履歴一覧内の、そのユーザーとのメッセージ履歴
+
+ユーザーをミュートするには、対象のユーザーのユーザーページに表示されている「ミュート」ボタンを押します。
+
+ミュートを行ったことは相手に通知されず、ミュートされていることを知ることもできません。
+
+設定>ミュート から、自分がミュートしているユーザー一覧を確認することができます。
diff --git a/src/docs/kab-KAB/pages.md b/src/docs/kab-KAB/pages.md
new file mode 100644
index 0000000000..a7311b95e6
--- /dev/null
+++ b/src/docs/kab-KAB/pages.md
@@ -0,0 +1,10 @@
+# Pages
+
+## 変数
+変数を使うことで動的なページを作成できます。テキスト内で <b>{ 変数名 }</b> と書くとそこに変数の値を埋め込めます。例えば <b>Hello { thing } world!</b> というテキストで、変数(thing)の値が <b>ai</b> だった場合、テキストは <b>Hello ai world!</b> になります。
+
+変数の評価(値を算出すること)は上から下に行われるので、ある変数の中で自分より下の変数を参照することはできません。例えば上から <b>A、B、C</b> と3つの変数を定義したとき、<b>C</b>の中で<b>A</b>や<b>B</b>を参照することはできますが、<b>A</b>の中で<b>B</b>や<b>C</b>を参照することはできません。
+
+ユーザーからの入力を受け取るには、ページに「ユーザー入力」ブロックを設置し、「変数名」に入力を格納したい変数名を設定します(変数は自動で作成されます)。その変数を使ってユーザー入力に応じた動作を行えます。
+
+関数を使うと、値の算出処理を再利用可能な形にまとめることができます。関数を作るには、「関数」タイプの変数を作成します。関数にはスロット(引数)を設定することができ、スロットの値は関数内で変数として利用可能です。また、関数を引数に取る関数(高階関数と呼ばれます)も存在します。関数は予め定義しておくほかに、このような高階関数のスロットに即席でセットすることもできます。
diff --git a/src/docs/kab-KAB/reaction.md b/src/docs/kab-KAB/reaction.md
new file mode 100644
index 0000000000..c26ead75b3
--- /dev/null
+++ b/src/docs/kab-KAB/reaction.md
@@ -0,0 +1,11 @@
+# リアクション
+他の人のノートに、絵文字を付けて簡単にあなたの反応を伝えられる機能です。 リアクションするには、ノートの + アイコンをクリックしてピッカーを表示し、絵文字を選択します。 リアクションには[カスタム絵文字](./custom-emoji)も使用できます。
+
+## リアクションピッカーのカスタマイズ
+ピッカーに表示される絵文字を自分好みにカスタマイズすることができます。 設定の「リアクション」で設定します。
+
+## リモート投稿へのリアクションについて
+リアクションはMisskeyオリジナルの機能であるため、リモートインスタンスがMisskeyでない限りは、ほとんどの場合「Like」としてアクティビティが送信されます。一般的にはLikeは「お気に入り」として実装されているようです。 また、相手がMisskeyであったとしても、カスタム絵文字リアクションは伝わらず、自動的に「👍」等にフォールバックされます。
+
+## リモートからのリアクションについて
+リモートから「Like」アクティビティを受信したとき、Misskeyでは「👍」のリアクションとして解釈されます。
diff --git a/src/docs/kab-KAB/reversi-bot.md b/src/docs/kab-KAB/reversi-bot.md
new file mode 100644
index 0000000000..7ab2a7212e
--- /dev/null
+++ b/src/docs/kab-KAB/reversi-bot.md
@@ -0,0 +1,160 @@
+# MisskeyリバーシBotの開発
+Misskeyのリバーシ機能に対応したBotの開発方法をここに記します。
+
+1. `games/reversi`ストリームに以下のパラメータを付けて接続する:
+ * `i`: botアカウントのAPIキー
+
+2. 対局への招待が来たら、ストリームから`invited`イベントが流れてくる
+ * イベントの中身に、`parent`という名前で対局へ誘ってきたユーザーの情報が含まれている
+
+3. `games/reversi/match`へ、`user_id`として`parent`の`id`が含まれたリクエストを送信する
+
+4. 上手くいくとゲーム情報が返ってくるので、`games/reversi-game`ストリームへ、以下のパラメータを付けて接続する:
+ * `i`: botアカウントのAPIキー
+ * `game`: `game`の`id`
+
+5. この間、相手がゲームの設定を変更するとその都度`update-settings`イベントが流れてくるので、必要であれば何かしらの処理を行う
+
+6. 設定に満足したら、`{ type: 'accept' }`メッセージをストリームに送信する
+
+7. ゲームが開始すると、`started`イベントが流れてくる
+ * イベントの中身にはゲーム情報が含まれている
+
+8. 石を打つには、ストリームに`{ type: 'set', pos: <位置> }`を送信する(位置の計算方法は後述)
+
+9. 相手または自分が石を打つと、ストリームから`set`イベントが流れてくる
+ * `color`として石の色が含まれている
+ * `pos`として位置情報が含まれている
+
+## 位置の計算法
+8x8のマップを考える場合、各マスの位置(インデックスと呼びます)は次のようになっています:
+```
++--+--+--+--+--+--+--+--+
+| 0| 1| 2| 3| 4| 5| 6| 7|
++--+--+--+--+--+--+--+--+
+| 8| 9|10|11|12|13|14|15|
++--+--+--+--+--+--+--+--+
+|16|17|18|19|20|21|22|23|
+...
+```
+
+### X,Y座標 から インデックス に変換する
+```
+pos = x + (y * mapWidth)
+```
+`mapWidth`は、ゲーム情報の`map`から、次のようにして計算できます:
+```
+mapWidth = map[0].length
+```
+
+### インデックス から X,Y座標 に変換する
+```
+x = pos % mapWidth
+y = Math.floor(pos / mapWidth)
+```
+
+## マップ情報
+マップ情報は、ゲーム情報の`map`に入っています。 文字列の配列になっており、ひとつひとつの文字がマス情報を表しています。 それをもとにマップのデザインを知る事が出来ます:
+* `(スペース)` ... マス無し
+* `-` ... マス
+* `b` ... 初期配置される黒石
+* `w` ... 初期配置される白石
+
+例えば、4*4の次のような単純なマップがあるとします:
+```text
++---+---+---+---+
+| | | | |
++---+---+---+---+
+| | ○ | ● | |
++---+---+---+---+
+| | ● | ○ | |
++---+---+---+---+
+| | | | |
++---+---+---+---+
+```
+
+この場合、マップデータはこのようになります:
+```javascript
+['----', '-wb-', '-bw-', '----']
+```
+
+## ユーザーにフォームを提示して対話可能Botを作成する
+ユーザーとのコミュニケーションを行うため、ゲームの設定画面でユーザーにフォームを提示することができます。 例えば、Botの強さをユーザーが設定できるようにする、といったシナリオが考えられます。
+
+フォームを提示するには、`reversi-game`ストリームに次のメッセージを送信します:
+```javascript
+{
+ type: 'init-form',
+ body: [フォームコントロールの配列]
+}
+```
+
+フォームコントロールの配列については今から説明します。 フォームコントロールは、次のようなオブジェクトです:
+```javascript
+{
+ id: 'switch1',
+ type: 'switch',
+ label: 'Enable hoge',
+ value: false
+}
+```
+`id` ... コントロールのID。 `type` ... コントロールの種類。後述します。 `label` ... コントロールと一緒に表記するテキスト。 `value` ... コントロールのデフォルト値。
+
+### フォームの操作を受け取る
+ユーザーがフォームを操作すると、ストリームから`update-form`イベントが流れてきます。 イベントの中身には、コントロールのIDと、ユーザーが設定した値が含まれています。 例えば、上で示したスイッチをユーザーがオンにしたとすると、次のイベントが流れてきます:
+```javascript
+{
+ id: 'switch1',
+ value: true
+}
+```
+
+### フォームコントロールの種類
+#### スイッチ
+type: `switch` スイッチを表示します。何かの機能をオン/オフさせたい場合に有用です。
+
+##### プロパティ
+`label` ... スイッチに表記するテキスト。
+
+#### ラジオボタン
+type: `radio` ラジオボタンを表示します。選択肢を提示するのに有用です。例えば、Botの強さを設定させるなどです。
+
+##### プロパティ
+`items` ... ラジオボタンの選択肢。例:
+```javascript
+items: [{
+ label: '弱',
+ value: 1
+}, {
+ label: '中',
+ value: 2
+}, {
+ label: '強',
+ value: 3
+}]
+```
+
+#### スライダー
+type: `slider` スライダーを表示します。
+
+##### プロパティ
+`min` ... スライダーの下限。 `max` ... スライダーの上限。 `step` ... 入力欄で刻むステップ値。
+
+#### テキストボックス
+type: `textbox` テキストボックスを表示します。ユーザーになにか入力させる一般的な用途に利用できます。
+
+## ユーザーにメッセージを表示する
+設定画面でユーザーと対話する、フォーム以外のもうひとつの方法がこれです。ユーザーになにかメッセージを表示することができます。 例えば、ユーザーがBotの対応していないモードやマップを選択したとき、警告を表示するなどです。 メッセージを表示するには、次のメッセージをストリームに送信します:
+```javascript
+{
+ type: 'message',
+ body: {
+ text: 'メッセージ内容',
+ type: 'メッセージの種類'
+ }
+}
+```
+メッセージの種類: `success`, `info`, `warning`, `error`。
+
+## 投了する
+投了をするには、<a href="./api/endpoints/games/reversi/games/surrender">このエンドポイント</a>にリクエストします。
diff --git a/src/docs/kab-KAB/stream.md b/src/docs/kab-KAB/stream.md
new file mode 100644
index 0000000000..9011c37c5b
--- /dev/null
+++ b/src/docs/kab-KAB/stream.md
@@ -0,0 +1,354 @@
+# ストリーミングAPI
+
+ストリーミングAPIを使うと、リアルタイムで様々な情報(例えばタイムラインに新しい投稿が流れてきた、メッセージが届いた、フォローされた、など)を受け取ったり、様々な操作を行ったりすることができます。
+
+## ストリームに接続する
+
+ストリーミングAPIを利用するには、まずMisskeyサーバーに**websocket**接続する必要があります。
+
+以下のURLに、`i`というパラメータ名で認証情報を含めて、websocket接続してください。例:
+```
+%WS_URL%/streaming?i=xxxxxxxxxxxxxxx
+```
+
+認証情報は、自分のAPIキーや、アプリケーションからストリームに接続する際はユーザーのアクセストークンのことを指します。
+
+<div class="ui info">
+ <p><i class="fas fa-info-circle"></i> 認証情報の取得については、<a href="./api">こちらのドキュメント</a>をご確認ください。</p>
+</div>
+
+---
+
+認証情報は省略することもできますが、その場合非ログインでの利用ということになり、受信できる情報や可能な操作は限られます。例:
+
+```
+%WS_URL%/streaming
+```
+
+---
+
+ストリームに接続すると、後述するAPI操作や、投稿の購読を行ったりすることができます。 しかしまだこの段階では、例えばタイムラインへの新しい投稿を受信したりすることはできません。 それを行うには、ストリーム上で、後述する**チャンネル**に接続する必要があります。
+
+**ストリームでのやり取りはすべてJSONです。**
+
+## チャンネル
+MisskeyのストリーミングAPIにはチャンネルという概念があります。これは、送受信する情報を分離するための仕組みです。 Misskeyのストリームに接続しただけでは、まだリアルタイムでタイムラインの投稿を受信したりはできません。 ストリーム上でチャンネルに接続することで、様々な情報を受け取ったり情報を送信したりすることができるようになります。
+
+### チャンネルに接続する
+チャンネルに接続するには、次のようなデータをJSONでストリームに送信します:
+
+```json
+{
+ type: 'connect',
+ body: {
+ channel: 'xxxxxxxx',
+ id: 'foobar',
+ params: {
+ ...
+ }
+ }
+}
+```
+
+ここで、
+* `channel`には接続したいチャンネル名を設定します。チャンネルの種類については後述します。
+* `id`にはそのチャンネルとやり取りするための任意のIDを設定します。ストリームでは様々なメッセージが流れるので、そのメッセージがどのチャンネルからのものなのか識別する必要があるからです。このIDは、UUIDや、乱数のようなもので構いません。
+* `params`はチャンネルに接続する際のパラメータです。チャンネルによって接続時に必要とされるパラメータは異なります。パラメータ不要のチャンネルに接続する際は、このプロパティは省略可能です。
+
+<div class="ui info">
+ <p><i class="fas fa-info-circle"></i> IDはチャンネルごとではなく「チャンネルの接続ごと」です。なぜなら、同じチャンネルに異なるパラメータで複数接続するケースもあるからです。</p>
+</div>
+
+### チャンネルからのメッセージを受け取る
+例えばタイムラインのチャンネルなら、新しい投稿があった時にメッセージを発します。そのメッセージを受け取ることで、タイムラインに新しい投稿がされたことをリアルタイムで知ることができます。
+
+チャンネルがメッセージを発すると、次のようなデータがJSONでストリームに流れてきます:
+```json
+{
+ type: 'channel',
+ body: {
+ id: 'foobar',
+ type: 'something',
+ body: {
+ some: 'thing'
+ }
+ }
+}
+```
+
+ここで、
+* `id`には前述したそのチャンネルに接続する際に設定したIDが設定されています。これで、このメッセージがどのチャンネルからのものなのか知ることができます。
+* `type`にはメッセージの種類が設定されます。チャンネルによって、どのような種類のメッセージが流れてくるかは異なります。
+* `body`にはメッセージの内容が設定されます。チャンネルによって、どのような内容のメッセージが流れてくるかは異なります。
+
+### チャンネルに向けてメッセージを送信する
+チャンネルによっては、メッセージを受け取るだけでなく、こちらから何かメッセージを送信し、何らかの操作を行える場合があります。
+
+チャンネルにメッセージを送信するには、次のようなデータをJSONでストリームに送信します:
+```json
+{
+ type: 'channel',
+ body: {
+ id: 'foobar',
+ type: 'something',
+ body: {
+ some: 'thing'
+ }
+ }
+}
+```
+
+ここで、
+* `id`には前述したそのチャンネルに接続する際に設定したIDを設定します。これで、このメッセージがどのチャンネルに向けたものなのか識別させることができます。
+* `type`にはメッセージの種類を設定します。チャンネルによって、どのような種類のメッセージを受け付けるかは異なります。
+* `body`にはメッセージの内容を設定します。チャンネルによって、どのような内容のメッセージを受け付けるかは異なります。
+
+### チャンネルから切断する
+チャンネルから切断するには、次のようなデータをJSONでストリームに送信します:
+
+```json
+{
+ type: 'disconnect',
+ body: {
+ id: 'foobar'
+ }
+}
+```
+
+ここで、
+* `id`には前述したそのチャンネルに接続する際に設定したIDを設定します。
+
+## ストリームを経由してAPIリクエストする
+
+ストリームを経由してAPIリクエストすると、HTTPリクエストを発生させずにAPIを利用できます。そのため、コードを簡潔にできたり、パフォーマンスの向上を見込めるかもしれません。
+
+ストリームを経由してAPIリクエストするには、次のようなデータをJSONでストリームに送信します:
+```json
+{
+ type: 'api',
+ body: {
+ id: 'xxxxxxxxxxxxxxxx',
+ endpoint: 'notes/create',
+ data: {
+ text: 'yee haw!'
+ }
+ }
+}
+```
+
+ここで、
+* `id`には、APIのレスポンスを識別するための、APIリクエストごとの一意なIDを設定する必要があります。UUIDや、簡単な乱数のようなもので構いません。
+* `endpoint`には、あなたがリクエストしたいAPIのエンドポイントを指定します。
+* `data`には、エンドポイントのパラメータを含めます。
+
+<div class="ui info">
+ <p><i class="fas fa-info-circle"></i> APIのエンドポイントやパラメータについてはAPIリファレンスをご確認ください。</p>
+</div>
+
+### レスポンスの受信
+
+APIへリクエストすると、レスポンスがストリームから次のような形式で流れてきます。
+
+```json
+{
+ type: 'api:xxxxxxxxxxxxxxxx',
+ body: {
+ ...
+ }
+}
+```
+
+ここで、
+* `xxxxxxxxxxxxxxxx`の部分には、リクエストの際に設定された`id`が含まれています。これにより、どのリクエストに対するレスポンスなのか判別することができます。
+* `body`には、レスポンスが含まれています。
+
+## 投稿のキャプチャ
+
+Misskeyは投稿のキャプチャと呼ばれる仕組みを提供しています。これは、指定した投稿のイベントをストリームで受け取る機能です。
+
+例えばタイムラインを取得してユーザーに表示したとします。ここで誰かがそのタイムラインに含まれるどれかの投稿に対してリアクションしたとします。
+
+しかし、クライアントからするとある投稿にリアクションが付いたことなどは知る由がないため、リアルタイムでリアクションをタイムライン上の投稿に反映して表示するといったことができません。
+
+この問題を解決するために、Misskeyは投稿のキャプチャ機構を用意しています。投稿をキャプチャすると、その投稿に関するイベントを受け取ることができるため、リアルタイムでリアクションを反映させたりすることが可能になります。
+
+### 投稿をキャプチャする
+
+投稿をキャプチャするには、ストリームに次のようなメッセージを送信します:
+
+```json
+{
+ type: 'subNote',
+ body: {
+ id: 'xxxxxxxxxxxxxxxx'
+ }
+}
+```
+
+ここで、
+* `id`にキャプチャしたい投稿の`id`を設定します。
+
+このメッセージを送信すると、Misskeyにキャプチャを要請したことになり、以後、その投稿に関するイベントが流れてくるようになります。
+
+例えば投稿にリアクションが付いたとすると、次のようなメッセージが流れてきます:
+
+```json
+{
+ type: 'noteUpdated',
+ body: {
+ id: 'xxxxxxxxxxxxxxxx',
+ type: 'reacted',
+ body: {
+ reaction: 'like',
+ userId: 'yyyyyyyyyyyyyyyy'
+ }
+ }
+}
+```
+
+ここで、
+* `body`内の`id`に、イベントを発生させた投稿のIDが設定されます。
+* `body`内の`type`に、イベントの種類が設定されます。
+* `body`内の`body`に、イベントの詳細が設定されます。
+
+#### イベントの種類
+
+##### `reacted`
+その投稿にリアクションがされた時に発生します。
+
+* `reaction`に、リアクションの種類が設定されます。
+* `userId`に、リアクションを行ったユーザーのIDが設定されます。
+
+例:
+```json
+{
+ type: 'noteUpdated',
+ body: {
+ id: 'xxxxxxxxxxxxxxxx',
+ type: 'reacted',
+ body: {
+ reaction: 'like',
+ userId: 'yyyyyyyyyyyyyyyy'
+ }
+ }
+}
+```
+
+##### `deleted`
+その投稿が削除された時に発生します。
+
+* `deletedAt`に、削除日時が設定されます。
+
+例:
+```json
+{
+ type: 'noteUpdated',
+ body: {
+ id: 'xxxxxxxxxxxxxxxx',
+ type: 'deleted',
+ body: {
+ deletedAt: '2018-10-22T02:17:09.703Z'
+ }
+ }
+}
+```
+
+##### `pollVoted`
+その投稿に添付されたアンケートに投票された時に発生します。
+
+* `choice`に、選択肢IDが設定されます。
+* `userId`に、投票を行ったユーザーのIDが設定されます。
+
+例:
+```json
+{
+ type: 'noteUpdated',
+ body: {
+ id: 'xxxxxxxxxxxxxxxx',
+ type: 'pollVoted',
+ body: {
+ choice: 2,
+ userId: 'yyyyyyyyyyyyyyyy'
+ }
+ }
+}
+```
+
+### 投稿のキャプチャを解除する
+
+その投稿がもう画面に表示されなくなったりして、その投稿に関するイベントをもう受け取る必要がなくなったときは、キャプチャの解除を申請してください。
+
+次のメッセージを送信します:
+
+```json
+{
+ type: 'unsubNote',
+ body: {
+ id: 'xxxxxxxxxxxxxxxx'
+ }
+}
+```
+
+ここで、
+* `id`にキャプチャを解除したい投稿の`id`を設定します。
+
+このメッセージを送信すると、以後、その投稿に関するイベントは流れてこないようになります。
+
+# チャンネル一覧
+## `main`
+アカウントに関する基本的な情報が流れてきます。このチャンネルにパラメータはありません。
+
+### 流れてくるイベント一覧
+
+#### `renote`
+自分の投稿がRenoteされた時に発生するイベントです。自分自身の投稿をRenoteしたときは発生しません。
+
+#### `mention`
+誰かからメンションされたときに発生するイベントです。
+
+#### `readAllNotifications`
+自分宛ての通知がすべて既読になったことを表すイベントです。このイベントを利用して、「通知があることを示すアイコン」のようなものをオフにしたりする等のケースが想定されます。
+
+#### `meUpdated`
+自分の情報が更新されたことを表すイベントです。
+
+#### `follow`
+自分が誰かをフォローしたときに発生するイベントです。
+
+#### `unfollow`
+自分が誰かのフォローを解除したときに発生するイベントです。
+
+#### `followed`
+自分が誰かにフォローされたときに発生するイベントです。
+
+## `homeTimeline`
+ホームタイムラインの投稿情報が流れてきます。このチャンネルにパラメータはありません。
+
+### 流れてくるイベント一覧
+
+#### `note`
+タイムラインに新しい投稿が流れてきたときに発生するイベントです。
+
+## `localTimeline`
+ローカルタイムラインの投稿情報が流れてきます。このチャンネルにパラメータはありません。
+
+### 流れてくるイベント一覧
+
+#### `note`
+ローカルタイムラインに新しい投稿が流れてきたときに発生するイベントです。
+
+## `hybridTimeline`
+ソーシャルタイムラインの投稿情報が流れてきます。このチャンネルにパラメータはありません。
+
+### 流れてくるイベント一覧
+
+#### `note`
+ソーシャルタイムラインに新しい投稿が流れてきたときに発生するイベントです。
+
+## `globalTimeline`
+グローバルタイムラインの投稿情報が流れてきます。このチャンネルにパラメータはありません。
+
+### 流れてくるイベント一覧
+
+#### `note`
+グローバルタイムラインに新しい投稿が流れてきたときに発生するイベントです。
diff --git a/src/docs/kab-KAB/theme.md b/src/docs/kab-KAB/theme.md
new file mode 100644
index 0000000000..4e52ee8cd7
--- /dev/null
+++ b/src/docs/kab-KAB/theme.md
@@ -0,0 +1,68 @@
+# テーマ
+
+テーマを設定して、Misskeyクライアントの見た目を変更できます。
+
+## テーマの設定
+設定 > テーマ
+
+## テーマを作成する
+テーマコードはJSON5で記述されたテーマオブジェクトです。 テーマは以下のようなオブジェクトです。
+``` js
+{
+ id: '17587283-dd92-4a2c-a22c-be0637c9e22a',
+
+ name: 'Danboard',
+ author: 'syuilo',
+
+ base: 'light',
+
+ props: {
+ accent: 'rgb(218, 141, 49)',
+ bg: 'rgb(218, 212, 190)',
+ fg: 'rgb(115, 108, 92)',
+ panel: 'rgb(236, 232, 220)',
+ renote: 'rgb(100, 152, 106)',
+ link: 'rgb(100, 152, 106)',
+ mention: '@accent',
+ hashtag: 'rgb(100, 152, 106)',
+ header: 'rgba(239, 227, 213, 0.75)',
+ navBg: 'rgb(216, 206, 182)',
+ inputBorder: 'rgba(0, 0, 0, 0.1)',
+ },
+}
+
+```
+
+* `id` ... テーマの一意なID。UUIDをおすすめします。
+* `name` ... テーマ名
+* `author` ... テーマの作者
+* `desc` ... テーマの説明(オプション)
+* `base` ... 明るいテーマか、暗いテーマか
+ * `light`にすると明るいテーマになり、`dark`にすると暗いテーマになります。
+ * テーマはここで設定されたベーステーマを継承します。
+* `props` ... テーマのスタイル定義。これから説明します。
+
+### テーマのスタイル定義
+`props`下にはテーマのスタイルを定義します。 キーがCSSの変数名になり、バリューで中身を指定します。 なお、この`props`オブジェクトはベーステーマから継承されます。 ベーステーマは、このテーマの`base`が`light`なら[_light.json5](https://github.com/syuilo/misskey/blob/develop/src/client/themes/_light.json5)で、`dark`なら[_dark.json5](https://github.com/syuilo/misskey/blob/develop/src/client/themes/_dark.json5)です。 つまり、このテーマ内の`props`に`panel`というキーが無くても、そこにはベーステーマの`panel`があると見なされます。
+
+#### バリューで使える構文
+* 16進数で表された色
+ * 例: `#00ff00`
+* `rgb(r, g, b)`形式で表された色
+ * 例: `rgb(0, 255, 0)`
+* `rgb(r, g, b, a)`形式で表された透明度を含む色
+ * 例: `rgba(0, 255, 0, 0.5)`
+* 他のキーの値の参照
+ * `@{キー名}`と書くと他のキーの値の参照になります。`{キー名}`は参照したいキーの名前に置き換えます。
+ * 例: `@panel`
+* 定数(後述)の参照
+ * `${定数名}`と書くと定数の参照になります。`{定数名}`は参照したい定数の名前に置き換えます。
+ * 例: `$main`
+* 関数(後述)
+ * `:{関数名}<{引数}<{色}`
+
+#### 定数
+「CSS変数として出力はしたくないが、他のCSS変数の値として使いまわしたい」値があるときは、定数を使うと便利です。 キー名を`$`で始めると、そのキーはCSS変数として出力されません。
+
+#### 関数
+wip
diff --git a/src/docs/kab-KAB/timelines.md b/src/docs/kab-KAB/timelines.md
new file mode 100644
index 0000000000..36ba61bd2d
--- /dev/null
+++ b/src/docs/kab-KAB/timelines.md
@@ -0,0 +1,15 @@
+# タイムラインの比較
+
+https://docs.google.com/spreadsheets/d/1lxQ2ugKrhz58Bg96HTDK_2F98BUritkMyIiBkOByjHA/edit?usp=sharing
+
+## ホーム
+自分のフォローしているユーザーの投稿
+
+## ローカル
+全てのローカルユーザーの「ホーム」指定されていない投稿
+
+## ソーシャル
+自分のフォローしているユーザーの投稿と、全てのローカルユーザーの「ホーム」指定されていない投稿
+
+## グローバル
+全てのローカルユーザーの「ホーム」指定されていない投稿と、サーバーに届いた全てのリモートユーザーの「ホーム」指定されていない投稿
diff --git a/src/docs/kn-IN/aiscript.md b/src/docs/kn-IN/aiscript.md
new file mode 100644
index 0000000000..6c28b446e3
--- /dev/null
+++ b/src/docs/kn-IN/aiscript.md
@@ -0,0 +1,4 @@
+# AiScript
+
+## 関数
+デフォルトで値渡しです。
diff --git a/src/docs/kn-IN/api.md b/src/docs/kn-IN/api.md
new file mode 100644
index 0000000000..76019b6145
--- /dev/null
+++ b/src/docs/kn-IN/api.md
@@ -0,0 +1,58 @@
+# Misskey API
+
+MisskeyAPIを使ってMisskeyクライアント、Misskey連携Webサービス、Bot等(以下「アプリケーション」と呼びます)を開発できます。 ストリーミングAPIもあるので、リアルタイム性のあるアプリケーションを作ることも可能です。
+
+APIを使い始めるには、まずアクセストークンを取得する必要があります。 このドキュメントでは、アクセストークンを取得する手順を説明した後、基本的なAPIの使い方を説明します。
+
+## アクセストークンの取得
+基本的に、APIはリクエストにはアクセストークンが必要となります。 APIにリクエストするのが自分自身なのか、不特定の利用者に使ってもらうアプリケーションなのかによって取得手順は異なります。
+
+* 前者の場合: [「自分自身のアクセストークンを手動発行する」](#自分自身のアクセストークンを手動発行する)に進む
+* 後者の場合: [「アプリケーション利用者にアクセストークンの発行をリクエストする」](#アプリケーション利用者にアクセストークンの発行をリクエストする)に進む
+
+### 自分自身のアクセストークンを手動発行する
+「設定 > API」で、自分のアクセストークンを発行できます。
+
+[「APIの使い方」へ進む](#APIの使い方)
+
+### アプリケーション利用者にアクセストークンの発行をリクエストする
+アプリケーション利用者のアクセストークンを取得するには、以下の手順で発行をリクエストします。
+
+#### Step 1
+
+UUIDを生成する。以後これをセッションIDと呼びます。
+
+> このセッションIDは毎回生成し、使いまわさないようにしてください。
+
+#### Step 2
+
+`{_URL_}/miauth/{session}`をユーザーのブラウザで表示させる。`{session}`の部分は、セッションIDに置き換えてください。
+> 例: `{_URL_}/miauth/c1f6d42b-468b-4fd2-8274-e58abdedef6f`
+
+表示する際、URLにクエリパラメータとしていくつかのオプションを設定できます:
+* `name` ... アプリケーション名
+ * > 例: `MissDeck`
+* `icon` ... アプリケーションのアイコン画像URL
+ * > 例: `https://missdeck.example.com/icon.png`
+* `callback` ... 認証が終わった後にリダイレクトするURL
+ * > 例: `https://missdeck.example.com/callback`
+ * リダイレクト時には、`session`というクエリパラメータでセッションIDが付きます
+* `permission` ... アプリケーションが要求する権限
+ * > 例: `write:notes,write:following,read:drive`
+ * 要求する権限を`,`で区切って列挙します
+ * どのような権限があるかは[APIリファレンス](/api-doc)で確認できます
+
+#### Step 3
+ユーザーが発行を許可した後、`{_URL_}/api/miauth/{session}/check`にPOSTリクエストすると、レスポンスとしてアクセストークンを含むJSONが返ります。
+
+レスポンスに含まれるプロパティ:
+* `token` ... ユーザーのアクセストークン
+* `user` ... ユーザーの情報
+
+[「APIの使い方」へ進む](#APIの使い方)
+
+## APIの使い方
+**APIはすべてPOSTで、リクエスト/レスポンスともにJSON形式です。RESTではありません。** アクセストークンは、`i`というパラメータ名でリクエストに含めます。
+
+* [APIリファレンス](/api-doc)
+* [ストリーミングAPI](./stream)
diff --git a/src/docs/kn-IN/create-plugin.md b/src/docs/kn-IN/create-plugin.md
new file mode 100644
index 0000000000..0d2fa19178
--- /dev/null
+++ b/src/docs/kn-IN/create-plugin.md
@@ -0,0 +1,74 @@
+# プラグインの作成
+Misskey Webクライアントのプラグイン機能を使うと、クライアントを拡張し、様々な機能を追加できます。 ここではプラグインの作成にあたってのメタデータ定義や、AiScript APIリファレンスを掲載します。
+
+## メタデータ
+プラグインは、AiScriptのメタデータ埋め込み機能を使って、デフォルトとしてプラグインのメタデータを定義する必要があります。 メタデータは次のプロパティを含むオブジェクトです。
+
+### name
+プラグイン名
+
+### author
+プラグイン作者
+
+### version
+プラグインバージョン。数値を指定してください。
+
+### description
+プラグインの説明
+
+### permissions
+プラグインが要求する権限。MisskeyAPIにリクエストする際に用いられます。
+
+### config
+プラグインの設定情報を表すオブジェクト。 キーに設定名、値に以下のプロパティを含めます。
+
+#### type
+設定値の種類を表す文字列。以下から選択します。 string number boolean
+
+#### label
+ユーザーに表示する設定名
+
+#### description
+設定の説明
+
+#### default
+設定のデフォルト値
+
+## APIリファレンス
+AiScript標準で組み込まれているAPIは掲載しません。
+
+### Mk:dialog(title text type)
+ダイアログを表示します。typeには以下の値が設定できます。 info success warn error question 省略すると info になります。
+
+### Mk:confirm(title text type)
+確認ダイアログを表示します。typeには以下の値が設定できます。 info success warn error question 省略すると question になります。 ユーザーが"OK"を選択した場合は true を、"キャンセル"を選択した場合は false が返ります。
+
+### Mk:api(endpoint params)
+Misskey APIにリクエストします。第一引数にエンドポイント名、第二引数にパラメータオブジェクトを渡します。
+
+### Mk:save(key value)
+任意の値に任意の名前を付けて永続化します。永続化した値は、AiScriptコンテキストが終了しても残り、Mk:loadで読み取ることができます。
+
+### Mk:load(key)
+Mk:saveで永続化した指定の名前の値を読み取ります。
+
+### Plugin:register_post_form_action(title fn)
+投稿フォームにアクションを追加します。第一引数にアクション名、第二引数にアクションが選択された際のコールバック関数を渡します。 コールバック関数には、第一引数に投稿フォームオブジェクトが渡されます。
+
+### Plugin:register_note_action(title fn)
+ノートメニューに項目を追加します。第一引数に項目名、第二引数に項目が選択された際のコールバック関数を渡します。 コールバック関数には、第一引数に対象のノートオブジェクトが渡されます。
+
+### Plugin:register_user_action(title fn)
+ユーザーメニューに項目を追加します。第一引数に項目名、第二引数に項目が選択された際のコールバック関数を渡します。 コールバック関数には、第一引数に対象のユーザーオブジェクトが渡されます。
+
+### Plugin:register_note_view_interruptor(fn)
+UIに表示されるノート情報を書き換えます。 コールバック関数には、第一引数に対象のノートオブジェクトが渡されます。 コールバック関数の返り値でノートが書き換えられます。
+
+### Plugin:register_note_post_interruptor(fn)
+ノート投稿時にノート情報を書き換えます。 コールバック関数には、第一引数に対象のノートオブジェクトが渡されます。 コールバック関数の返り値でノートが書き換えられます。
+
+### Plugin:open_url(url)
+第一引数に渡されたURLをブラウザの新しいタブで開きます。
+
+### Plugin:config
+プラグインの設定が格納されるオブジェクト。プラグイン定義のconfigで設定したキーで値が入ります。
diff --git a/src/docs/kn-IN/custom-emoji.md b/src/docs/kn-IN/custom-emoji.md
new file mode 100644
index 0000000000..ed2e92be16
--- /dev/null
+++ b/src/docs/kn-IN/custom-emoji.md
@@ -0,0 +1,2 @@
+# カスタム絵文字
+カスタム絵文字は、インスタンスで用意された画像を絵文字のように使える機能です。 ノート、リアクション、チャット、自己紹介、名前などの場所で使うことができます。 カスタム絵文字をそれらの場所で使うには、絵文字ピッカーボタン(ある場合)を押すか、`:`を入力して絵文字サジェストを表示します。 テキスト内に`:foo:`のような形式の文字列が見つかると、`foo`の部分がカスタム絵文字名と解釈され、表示時には対応したカスタム絵文字に置き換わります。
diff --git a/src/docs/kn-IN/deck.md b/src/docs/kn-IN/deck.md
new file mode 100644
index 0000000000..8057e262fd
--- /dev/null
+++ b/src/docs/kn-IN/deck.md
@@ -0,0 +1,18 @@
+# デッキ
+
+デッキは利用可能なUIのひとつです。「カラム」と呼ばれるビューを複数並べて表示させることで、カスタマイズ性が高く、情報量の多いUIが構築できることが特徴です。
+
+## カラムの追加
+デッキの背景を右クリックし、「カラムを追加」して任意のカラムを追加できます。
+
+## カラムの移動
+カラムは、ドラッグアンドドロップで他のカラムと位置を入れ替えることが出来るほか、カラムメニュー(カラムのヘッダー右クリック)から位置を移動させることもできます。
+
+## カラムの水平分割
+カラムは左右だけでなく、上下に並べることもできます。 カラムメニューを開き、「左に重ねる」を選択すると、左のカラムの下に現在のカラムが移動します。 上下分割を解除するには、カラムメニューの「右に出す」を選択します。
+
+## カラムの設定
+カラムメニューの「編集」を選択するとカラムの設定を編集できます。カラムの名前を変えたり、幅を変えたりできます。
+
+## デッキの設定
+デッキに関する設定は、[settings/deck](/settings/deck)で行えます。
diff --git a/src/docs/kn-IN/follow.md b/src/docs/kn-IN/follow.md
new file mode 100644
index 0000000000..3c1ea7bbe0
--- /dev/null
+++ b/src/docs/kn-IN/follow.md
@@ -0,0 +1,2 @@
+# フォロー
+ユーザーをフォローすると、タイムラインにそのユーザーの投稿が表示されるようになります。ただし、他のユーザーに対する返信は含まれません。 ユーザーをフォローするには、ユーザーページの「フォロー」ボタンをクリックします。フォローを解除するには、もう一度クリックします。
diff --git a/src/docs/kn-IN/keyboard-shortcut.md b/src/docs/kn-IN/keyboard-shortcut.md
new file mode 100644
index 0000000000..e8ba415715
--- /dev/null
+++ b/src/docs/kn-IN/keyboard-shortcut.md
@@ -0,0 +1,68 @@
+# キーボードショートカット
+
+## グローバル
+これらのショートカットは基本的にどこでも使えます。
+<table>
+ <thead>
+ <tr><th>ショートカット</th><th>効果</th><th>由来</th></tr>
+ </thead>
+ <tbody>
+ <tr><td><kbd class="key">P</kbd>, <kbd class="key">N</kbd></td><td>新規投稿</td><td><b>P</b>ost, <b>N</b>ew, <b>N</b>ote</td></tr>
+ <tr><td><kbd class="key">T</kbd></td><td>タイムラインの最も新しい投稿にフォーカス</td><td><b>T</b>imeline, <b>T</b>op</td></tr>
+ <tr><td><kbd class="group"><kbd class="key">Shift</kbd> + <kbd class="key">N</kbd></kbd></td><td>通知を表示/隠す</td><td><b>N</b>otifications</td></tr>
+ <tr><td><kbd class="key">S</kbd></td><td>ಹುಡುಕು</td><td><b>S</b>earch</td></tr>
+ <tr><td><kbd class="key">H</kbd>, <kbd class="key">?</kbd></td><td>ヘルプを表示</td><td><b>H</b>elp</td></tr>
+ </tbody>
+</table>
+
+## 投稿にフォーカスされた状態
+
+<table>
+ <thead>
+ <tr><th>ショートカット</th><th>効果</th><th>由来</th></tr>
+ </thead>
+ <tbody>
+ <tr><td><kbd class="key">↑</kbd>, <kbd class="key">K</kbd>, <kbd class="group"><kbd class="key">Shift</kbd> + <kbd class="key">Tab</kbd></kbd></td><td>上の投稿にフォーカスを移動</td><td>-</td></tr>
+ <tr><td><kbd class="key">↓</kbd>, <kbd class="key">J</kbd>, <kbd class="key">Tab</kbd></td><td>下の投稿にフォーカスを移動</td><td>-</td></tr>
+ <tr><td><kbd class="key">R</kbd></td><td>返信フォームを開く</td><td><b>R</b>eply</td></tr>
+ <tr><td><kbd class="key">Q</kbd></td><td>Renoteフォームを開く</td><td><b>Q</b>uote</td></tr>
+ <tr><td><kbd class="group"><kbd class="key">Ctrl</kbd> + <kbd class="key">Q</kbd></kbd></td><td>即刻Renoteする(フォームを開かずに)</td><td>-</td></tr>
+ <tr><td><kbd class="key">E</kbd>, <kbd class="key">A</kbd>, <kbd class="key">+</kbd></td><td>リアクションフォームを開く</td><td><b>E</b>mote, re<b>A</b>ction</td></tr>
+ <tr><td><kbd class="key">0</kbd>~<kbd class="key">9</kbd></td><td>数字に対応したリアクションをする(対応については後述)</td><td>-</td></tr>
+ <tr><td><kbd class="key">F</kbd>, <kbd class="key">B</kbd></td><td>お気に入りに登録</td><td><b>F</b>avorite, <b>B</b>ookmark</td></tr>
+ <tr><td><kbd class="key">Del</kbd>, <kbd class="group"><kbd class="key">Ctrl</kbd> + <kbd class="key">D</kbd></kbd></td><td>投稿を削除</td><td><b>D</b>elete</tr>
+ <tr><td><kbd class="key">M</kbd>, <kbd class="key">O</kbd></td><td>投稿に対するメニューを開く</td><td><b>M</b>ore, <b>O</b>ther</td></tr>
+ <tr><td><kbd class="key">S</kbd></td><td>CWで隠された部分を表示 or 隠す</td><td><b>S</b>how, <b>S</b>ee</td></tr>
+ <tr><td><kbd class="key">Esc</kbd></td><td>フォーカスを外す</td><td>-</td></tr>
+ </tbody>
+</table>
+
+## Renoteフォーム
+
+<table>
+ <thead>
+ <tr><th>ショートカット</th><th>効果</th><th>由来</th></tr>
+ </thead>
+ <tbody>
+ <tr><td><kbd class="key">Enter</kbd></td><td>Renoteする</td><td>-</td></tr>
+ <tr><td><kbd class="key">Q</kbd></td><td>フォームを展開する</td><td><b>Q</b>uote</td></tr>
+ <tr><td><kbd class="key">Esc</kbd></td><td>フォームを閉じる</td><td>-</td></tr>
+ </tbody>
+</table>
+
+## リアクションフォーム
+デフォルトで「👍」にフォーカスが当たっている状態です。
+<table>
+ <thead>
+ <tr><th>ショートカット</th><th>効果</th><th>由来</th></tr>
+ </thead>
+ <tbody>
+ <tr><td><kbd class="key">↑</kbd>, <kbd class="key">K</kbd></td><td>上のリアクションにフォーカスを移動</td><td>-</td></tr>
+ <tr><td><kbd class="key">↓</kbd>, <kbd class="key">J</kbd></td><td>下のリアクションにフォーカスを移動</td><td>-</td></tr>
+ <tr><td><kbd class="key">←</kbd>, <kbd class="key">H</kbd>, <kbd class="group"><kbd class="key">Shift</kbd> + <kbd class="key">Tab</kbd></kbd></td><td>左のリアクションにフォーカスを移動</td><td>-</td></tr>
+ <tr><td><kbd class="key">→</kbd>, <kbd class="key">L</kbd>, <kbd class="key">Tab</kbd></td><td>右のリアクションにフォーカスを移動</td><td>-</td></tr>
+ <tr><td><kbd class="key">Enter</kbd>, <kbd class="key">Space</kbd>, <kbd class="key">+</kbd></td><td>リアクション確定</td><td>-</td></tr>
+ <tr><td><kbd class="key">0</kbd>~<kbd class="key">9</kbd></td><td>数字に対応したリアクションで確定</td><td>-</td></tr>
+ <tr><td><kbd class="key">Esc</kbd></td><td>リアクションするのをやめる</td><td>-</td></tr>
+ </tbody>
+</table>
diff --git a/src/docs/kn-IN/mfm.md b/src/docs/kn-IN/mfm.md
new file mode 100644
index 0000000000..e237287acc
--- /dev/null
+++ b/src/docs/kn-IN/mfm.md
@@ -0,0 +1,2 @@
+# MFM
+MFMは、Misskey Flavored Markdownの略で、Misskeyの様々な場所で使用できる専用のマークアップ言語です。 MFMで使用可能な構文は[MFMチートシート](/mfm-cheat-sheet)で確認できます。
diff --git a/src/docs/kn-IN/mute.md b/src/docs/kn-IN/mute.md
new file mode 100644
index 0000000000..6a9608662a
--- /dev/null
+++ b/src/docs/kn-IN/mute.md
@@ -0,0 +1,13 @@
+# ミュート
+
+ユーザーをミュートすると、そのユーザーに関する次のコンテンツがMisskeyに表示されなくなります:
+
+* タイムラインや投稿の検索結果内の、そのユーザーの投稿(およびそれらの投稿に対する返信やRenote)
+* そのユーザーからの通知
+* メッセージ履歴一覧内の、そのユーザーとのメッセージ履歴
+
+ユーザーをミュートするには、対象のユーザーのユーザーページに表示されている「ミュート」ボタンを押します。
+
+ミュートを行ったことは相手に通知されず、ミュートされていることを知ることもできません。
+
+設定>ミュート から、自分がミュートしているユーザー一覧を確認することができます。
diff --git a/src/docs/kn-IN/pages.md b/src/docs/kn-IN/pages.md
new file mode 100644
index 0000000000..a7311b95e6
--- /dev/null
+++ b/src/docs/kn-IN/pages.md
@@ -0,0 +1,10 @@
+# Pages
+
+## 変数
+変数を使うことで動的なページを作成できます。テキスト内で <b>{ 変数名 }</b> と書くとそこに変数の値を埋め込めます。例えば <b>Hello { thing } world!</b> というテキストで、変数(thing)の値が <b>ai</b> だった場合、テキストは <b>Hello ai world!</b> になります。
+
+変数の評価(値を算出すること)は上から下に行われるので、ある変数の中で自分より下の変数を参照することはできません。例えば上から <b>A、B、C</b> と3つの変数を定義したとき、<b>C</b>の中で<b>A</b>や<b>B</b>を参照することはできますが、<b>A</b>の中で<b>B</b>や<b>C</b>を参照することはできません。
+
+ユーザーからの入力を受け取るには、ページに「ユーザー入力」ブロックを設置し、「変数名」に入力を格納したい変数名を設定します(変数は自動で作成されます)。その変数を使ってユーザー入力に応じた動作を行えます。
+
+関数を使うと、値の算出処理を再利用可能な形にまとめることができます。関数を作るには、「関数」タイプの変数を作成します。関数にはスロット(引数)を設定することができ、スロットの値は関数内で変数として利用可能です。また、関数を引数に取る関数(高階関数と呼ばれます)も存在します。関数は予め定義しておくほかに、このような高階関数のスロットに即席でセットすることもできます。
diff --git a/src/docs/kn-IN/reaction.md b/src/docs/kn-IN/reaction.md
new file mode 100644
index 0000000000..c26ead75b3
--- /dev/null
+++ b/src/docs/kn-IN/reaction.md
@@ -0,0 +1,11 @@
+# リアクション
+他の人のノートに、絵文字を付けて簡単にあなたの反応を伝えられる機能です。 リアクションするには、ノートの + アイコンをクリックしてピッカーを表示し、絵文字を選択します。 リアクションには[カスタム絵文字](./custom-emoji)も使用できます。
+
+## リアクションピッカーのカスタマイズ
+ピッカーに表示される絵文字を自分好みにカスタマイズすることができます。 設定の「リアクション」で設定します。
+
+## リモート投稿へのリアクションについて
+リアクションはMisskeyオリジナルの機能であるため、リモートインスタンスがMisskeyでない限りは、ほとんどの場合「Like」としてアクティビティが送信されます。一般的にはLikeは「お気に入り」として実装されているようです。 また、相手がMisskeyであったとしても、カスタム絵文字リアクションは伝わらず、自動的に「👍」等にフォールバックされます。
+
+## リモートからのリアクションについて
+リモートから「Like」アクティビティを受信したとき、Misskeyでは「👍」のリアクションとして解釈されます。
diff --git a/src/docs/kn-IN/reversi-bot.md b/src/docs/kn-IN/reversi-bot.md
new file mode 100644
index 0000000000..7ab2a7212e
--- /dev/null
+++ b/src/docs/kn-IN/reversi-bot.md
@@ -0,0 +1,160 @@
+# MisskeyリバーシBotの開発
+Misskeyのリバーシ機能に対応したBotの開発方法をここに記します。
+
+1. `games/reversi`ストリームに以下のパラメータを付けて接続する:
+ * `i`: botアカウントのAPIキー
+
+2. 対局への招待が来たら、ストリームから`invited`イベントが流れてくる
+ * イベントの中身に、`parent`という名前で対局へ誘ってきたユーザーの情報が含まれている
+
+3. `games/reversi/match`へ、`user_id`として`parent`の`id`が含まれたリクエストを送信する
+
+4. 上手くいくとゲーム情報が返ってくるので、`games/reversi-game`ストリームへ、以下のパラメータを付けて接続する:
+ * `i`: botアカウントのAPIキー
+ * `game`: `game`の`id`
+
+5. この間、相手がゲームの設定を変更するとその都度`update-settings`イベントが流れてくるので、必要であれば何かしらの処理を行う
+
+6. 設定に満足したら、`{ type: 'accept' }`メッセージをストリームに送信する
+
+7. ゲームが開始すると、`started`イベントが流れてくる
+ * イベントの中身にはゲーム情報が含まれている
+
+8. 石を打つには、ストリームに`{ type: 'set', pos: <位置> }`を送信する(位置の計算方法は後述)
+
+9. 相手または自分が石を打つと、ストリームから`set`イベントが流れてくる
+ * `color`として石の色が含まれている
+ * `pos`として位置情報が含まれている
+
+## 位置の計算法
+8x8のマップを考える場合、各マスの位置(インデックスと呼びます)は次のようになっています:
+```
++--+--+--+--+--+--+--+--+
+| 0| 1| 2| 3| 4| 5| 6| 7|
++--+--+--+--+--+--+--+--+
+| 8| 9|10|11|12|13|14|15|
++--+--+--+--+--+--+--+--+
+|16|17|18|19|20|21|22|23|
+...
+```
+
+### X,Y座標 から インデックス に変換する
+```
+pos = x + (y * mapWidth)
+```
+`mapWidth`は、ゲーム情報の`map`から、次のようにして計算できます:
+```
+mapWidth = map[0].length
+```
+
+### インデックス から X,Y座標 に変換する
+```
+x = pos % mapWidth
+y = Math.floor(pos / mapWidth)
+```
+
+## マップ情報
+マップ情報は、ゲーム情報の`map`に入っています。 文字列の配列になっており、ひとつひとつの文字がマス情報を表しています。 それをもとにマップのデザインを知る事が出来ます:
+* `(スペース)` ... マス無し
+* `-` ... マス
+* `b` ... 初期配置される黒石
+* `w` ... 初期配置される白石
+
+例えば、4*4の次のような単純なマップがあるとします:
+```text
++---+---+---+---+
+| | | | |
++---+---+---+---+
+| | ○ | ● | |
++---+---+---+---+
+| | ● | ○ | |
++---+---+---+---+
+| | | | |
++---+---+---+---+
+```
+
+この場合、マップデータはこのようになります:
+```javascript
+['----', '-wb-', '-bw-', '----']
+```
+
+## ユーザーにフォームを提示して対話可能Botを作成する
+ユーザーとのコミュニケーションを行うため、ゲームの設定画面でユーザーにフォームを提示することができます。 例えば、Botの強さをユーザーが設定できるようにする、といったシナリオが考えられます。
+
+フォームを提示するには、`reversi-game`ストリームに次のメッセージを送信します:
+```javascript
+{
+ type: 'init-form',
+ body: [フォームコントロールの配列]
+}
+```
+
+フォームコントロールの配列については今から説明します。 フォームコントロールは、次のようなオブジェクトです:
+```javascript
+{
+ id: 'switch1',
+ type: 'switch',
+ label: 'Enable hoge',
+ value: false
+}
+```
+`id` ... コントロールのID。 `type` ... コントロールの種類。後述します。 `label` ... コントロールと一緒に表記するテキスト。 `value` ... コントロールのデフォルト値。
+
+### フォームの操作を受け取る
+ユーザーがフォームを操作すると、ストリームから`update-form`イベントが流れてきます。 イベントの中身には、コントロールのIDと、ユーザーが設定した値が含まれています。 例えば、上で示したスイッチをユーザーがオンにしたとすると、次のイベントが流れてきます:
+```javascript
+{
+ id: 'switch1',
+ value: true
+}
+```
+
+### フォームコントロールの種類
+#### スイッチ
+type: `switch` スイッチを表示します。何かの機能をオン/オフさせたい場合に有用です。
+
+##### プロパティ
+`label` ... スイッチに表記するテキスト。
+
+#### ラジオボタン
+type: `radio` ラジオボタンを表示します。選択肢を提示するのに有用です。例えば、Botの強さを設定させるなどです。
+
+##### プロパティ
+`items` ... ラジオボタンの選択肢。例:
+```javascript
+items: [{
+ label: '弱',
+ value: 1
+}, {
+ label: '中',
+ value: 2
+}, {
+ label: '強',
+ value: 3
+}]
+```
+
+#### スライダー
+type: `slider` スライダーを表示します。
+
+##### プロパティ
+`min` ... スライダーの下限。 `max` ... スライダーの上限。 `step` ... 入力欄で刻むステップ値。
+
+#### テキストボックス
+type: `textbox` テキストボックスを表示します。ユーザーになにか入力させる一般的な用途に利用できます。
+
+## ユーザーにメッセージを表示する
+設定画面でユーザーと対話する、フォーム以外のもうひとつの方法がこれです。ユーザーになにかメッセージを表示することができます。 例えば、ユーザーがBotの対応していないモードやマップを選択したとき、警告を表示するなどです。 メッセージを表示するには、次のメッセージをストリームに送信します:
+```javascript
+{
+ type: 'message',
+ body: {
+ text: 'メッセージ内容',
+ type: 'メッセージの種類'
+ }
+}
+```
+メッセージの種類: `success`, `info`, `warning`, `error`。
+
+## 投了する
+投了をするには、<a href="./api/endpoints/games/reversi/games/surrender">このエンドポイント</a>にリクエストします。
diff --git a/src/docs/kn-IN/stream.md b/src/docs/kn-IN/stream.md
new file mode 100644
index 0000000000..9011c37c5b
--- /dev/null
+++ b/src/docs/kn-IN/stream.md
@@ -0,0 +1,354 @@
+# ストリーミングAPI
+
+ストリーミングAPIを使うと、リアルタイムで様々な情報(例えばタイムラインに新しい投稿が流れてきた、メッセージが届いた、フォローされた、など)を受け取ったり、様々な操作を行ったりすることができます。
+
+## ストリームに接続する
+
+ストリーミングAPIを利用するには、まずMisskeyサーバーに**websocket**接続する必要があります。
+
+以下のURLに、`i`というパラメータ名で認証情報を含めて、websocket接続してください。例:
+```
+%WS_URL%/streaming?i=xxxxxxxxxxxxxxx
+```
+
+認証情報は、自分のAPIキーや、アプリケーションからストリームに接続する際はユーザーのアクセストークンのことを指します。
+
+<div class="ui info">
+ <p><i class="fas fa-info-circle"></i> 認証情報の取得については、<a href="./api">こちらのドキュメント</a>をご確認ください。</p>
+</div>
+
+---
+
+認証情報は省略することもできますが、その場合非ログインでの利用ということになり、受信できる情報や可能な操作は限られます。例:
+
+```
+%WS_URL%/streaming
+```
+
+---
+
+ストリームに接続すると、後述するAPI操作や、投稿の購読を行ったりすることができます。 しかしまだこの段階では、例えばタイムラインへの新しい投稿を受信したりすることはできません。 それを行うには、ストリーム上で、後述する**チャンネル**に接続する必要があります。
+
+**ストリームでのやり取りはすべてJSONです。**
+
+## チャンネル
+MisskeyのストリーミングAPIにはチャンネルという概念があります。これは、送受信する情報を分離するための仕組みです。 Misskeyのストリームに接続しただけでは、まだリアルタイムでタイムラインの投稿を受信したりはできません。 ストリーム上でチャンネルに接続することで、様々な情報を受け取ったり情報を送信したりすることができるようになります。
+
+### チャンネルに接続する
+チャンネルに接続するには、次のようなデータをJSONでストリームに送信します:
+
+```json
+{
+ type: 'connect',
+ body: {
+ channel: 'xxxxxxxx',
+ id: 'foobar',
+ params: {
+ ...
+ }
+ }
+}
+```
+
+ここで、
+* `channel`には接続したいチャンネル名を設定します。チャンネルの種類については後述します。
+* `id`にはそのチャンネルとやり取りするための任意のIDを設定します。ストリームでは様々なメッセージが流れるので、そのメッセージがどのチャンネルからのものなのか識別する必要があるからです。このIDは、UUIDや、乱数のようなもので構いません。
+* `params`はチャンネルに接続する際のパラメータです。チャンネルによって接続時に必要とされるパラメータは異なります。パラメータ不要のチャンネルに接続する際は、このプロパティは省略可能です。
+
+<div class="ui info">
+ <p><i class="fas fa-info-circle"></i> IDはチャンネルごとではなく「チャンネルの接続ごと」です。なぜなら、同じチャンネルに異なるパラメータで複数接続するケースもあるからです。</p>
+</div>
+
+### チャンネルからのメッセージを受け取る
+例えばタイムラインのチャンネルなら、新しい投稿があった時にメッセージを発します。そのメッセージを受け取ることで、タイムラインに新しい投稿がされたことをリアルタイムで知ることができます。
+
+チャンネルがメッセージを発すると、次のようなデータがJSONでストリームに流れてきます:
+```json
+{
+ type: 'channel',
+ body: {
+ id: 'foobar',
+ type: 'something',
+ body: {
+ some: 'thing'
+ }
+ }
+}
+```
+
+ここで、
+* `id`には前述したそのチャンネルに接続する際に設定したIDが設定されています。これで、このメッセージがどのチャンネルからのものなのか知ることができます。
+* `type`にはメッセージの種類が設定されます。チャンネルによって、どのような種類のメッセージが流れてくるかは異なります。
+* `body`にはメッセージの内容が設定されます。チャンネルによって、どのような内容のメッセージが流れてくるかは異なります。
+
+### チャンネルに向けてメッセージを送信する
+チャンネルによっては、メッセージを受け取るだけでなく、こちらから何かメッセージを送信し、何らかの操作を行える場合があります。
+
+チャンネルにメッセージを送信するには、次のようなデータをJSONでストリームに送信します:
+```json
+{
+ type: 'channel',
+ body: {
+ id: 'foobar',
+ type: 'something',
+ body: {
+ some: 'thing'
+ }
+ }
+}
+```
+
+ここで、
+* `id`には前述したそのチャンネルに接続する際に設定したIDを設定します。これで、このメッセージがどのチャンネルに向けたものなのか識別させることができます。
+* `type`にはメッセージの種類を設定します。チャンネルによって、どのような種類のメッセージを受け付けるかは異なります。
+* `body`にはメッセージの内容を設定します。チャンネルによって、どのような内容のメッセージを受け付けるかは異なります。
+
+### チャンネルから切断する
+チャンネルから切断するには、次のようなデータをJSONでストリームに送信します:
+
+```json
+{
+ type: 'disconnect',
+ body: {
+ id: 'foobar'
+ }
+}
+```
+
+ここで、
+* `id`には前述したそのチャンネルに接続する際に設定したIDを設定します。
+
+## ストリームを経由してAPIリクエストする
+
+ストリームを経由してAPIリクエストすると、HTTPリクエストを発生させずにAPIを利用できます。そのため、コードを簡潔にできたり、パフォーマンスの向上を見込めるかもしれません。
+
+ストリームを経由してAPIリクエストするには、次のようなデータをJSONでストリームに送信します:
+```json
+{
+ type: 'api',
+ body: {
+ id: 'xxxxxxxxxxxxxxxx',
+ endpoint: 'notes/create',
+ data: {
+ text: 'yee haw!'
+ }
+ }
+}
+```
+
+ここで、
+* `id`には、APIのレスポンスを識別するための、APIリクエストごとの一意なIDを設定する必要があります。UUIDや、簡単な乱数のようなもので構いません。
+* `endpoint`には、あなたがリクエストしたいAPIのエンドポイントを指定します。
+* `data`には、エンドポイントのパラメータを含めます。
+
+<div class="ui info">
+ <p><i class="fas fa-info-circle"></i> APIのエンドポイントやパラメータについてはAPIリファレンスをご確認ください。</p>
+</div>
+
+### レスポンスの受信
+
+APIへリクエストすると、レスポンスがストリームから次のような形式で流れてきます。
+
+```json
+{
+ type: 'api:xxxxxxxxxxxxxxxx',
+ body: {
+ ...
+ }
+}
+```
+
+ここで、
+* `xxxxxxxxxxxxxxxx`の部分には、リクエストの際に設定された`id`が含まれています。これにより、どのリクエストに対するレスポンスなのか判別することができます。
+* `body`には、レスポンスが含まれています。
+
+## 投稿のキャプチャ
+
+Misskeyは投稿のキャプチャと呼ばれる仕組みを提供しています。これは、指定した投稿のイベントをストリームで受け取る機能です。
+
+例えばタイムラインを取得してユーザーに表示したとします。ここで誰かがそのタイムラインに含まれるどれかの投稿に対してリアクションしたとします。
+
+しかし、クライアントからするとある投稿にリアクションが付いたことなどは知る由がないため、リアルタイムでリアクションをタイムライン上の投稿に反映して表示するといったことができません。
+
+この問題を解決するために、Misskeyは投稿のキャプチャ機構を用意しています。投稿をキャプチャすると、その投稿に関するイベントを受け取ることができるため、リアルタイムでリアクションを反映させたりすることが可能になります。
+
+### 投稿をキャプチャする
+
+投稿をキャプチャするには、ストリームに次のようなメッセージを送信します:
+
+```json
+{
+ type: 'subNote',
+ body: {
+ id: 'xxxxxxxxxxxxxxxx'
+ }
+}
+```
+
+ここで、
+* `id`にキャプチャしたい投稿の`id`を設定します。
+
+このメッセージを送信すると、Misskeyにキャプチャを要請したことになり、以後、その投稿に関するイベントが流れてくるようになります。
+
+例えば投稿にリアクションが付いたとすると、次のようなメッセージが流れてきます:
+
+```json
+{
+ type: 'noteUpdated',
+ body: {
+ id: 'xxxxxxxxxxxxxxxx',
+ type: 'reacted',
+ body: {
+ reaction: 'like',
+ userId: 'yyyyyyyyyyyyyyyy'
+ }
+ }
+}
+```
+
+ここで、
+* `body`内の`id`に、イベントを発生させた投稿のIDが設定されます。
+* `body`内の`type`に、イベントの種類が設定されます。
+* `body`内の`body`に、イベントの詳細が設定されます。
+
+#### イベントの種類
+
+##### `reacted`
+その投稿にリアクションがされた時に発生します。
+
+* `reaction`に、リアクションの種類が設定されます。
+* `userId`に、リアクションを行ったユーザーのIDが設定されます。
+
+例:
+```json
+{
+ type: 'noteUpdated',
+ body: {
+ id: 'xxxxxxxxxxxxxxxx',
+ type: 'reacted',
+ body: {
+ reaction: 'like',
+ userId: 'yyyyyyyyyyyyyyyy'
+ }
+ }
+}
+```
+
+##### `deleted`
+その投稿が削除された時に発生します。
+
+* `deletedAt`に、削除日時が設定されます。
+
+例:
+```json
+{
+ type: 'noteUpdated',
+ body: {
+ id: 'xxxxxxxxxxxxxxxx',
+ type: 'deleted',
+ body: {
+ deletedAt: '2018-10-22T02:17:09.703Z'
+ }
+ }
+}
+```
+
+##### `pollVoted`
+その投稿に添付されたアンケートに投票された時に発生します。
+
+* `choice`に、選択肢IDが設定されます。
+* `userId`に、投票を行ったユーザーのIDが設定されます。
+
+例:
+```json
+{
+ type: 'noteUpdated',
+ body: {
+ id: 'xxxxxxxxxxxxxxxx',
+ type: 'pollVoted',
+ body: {
+ choice: 2,
+ userId: 'yyyyyyyyyyyyyyyy'
+ }
+ }
+}
+```
+
+### 投稿のキャプチャを解除する
+
+その投稿がもう画面に表示されなくなったりして、その投稿に関するイベントをもう受け取る必要がなくなったときは、キャプチャの解除を申請してください。
+
+次のメッセージを送信します:
+
+```json
+{
+ type: 'unsubNote',
+ body: {
+ id: 'xxxxxxxxxxxxxxxx'
+ }
+}
+```
+
+ここで、
+* `id`にキャプチャを解除したい投稿の`id`を設定します。
+
+このメッセージを送信すると、以後、その投稿に関するイベントは流れてこないようになります。
+
+# チャンネル一覧
+## `main`
+アカウントに関する基本的な情報が流れてきます。このチャンネルにパラメータはありません。
+
+### 流れてくるイベント一覧
+
+#### `renote`
+自分の投稿がRenoteされた時に発生するイベントです。自分自身の投稿をRenoteしたときは発生しません。
+
+#### `mention`
+誰かからメンションされたときに発生するイベントです。
+
+#### `readAllNotifications`
+自分宛ての通知がすべて既読になったことを表すイベントです。このイベントを利用して、「通知があることを示すアイコン」のようなものをオフにしたりする等のケースが想定されます。
+
+#### `meUpdated`
+自分の情報が更新されたことを表すイベントです。
+
+#### `follow`
+自分が誰かをフォローしたときに発生するイベントです。
+
+#### `unfollow`
+自分が誰かのフォローを解除したときに発生するイベントです。
+
+#### `followed`
+自分が誰かにフォローされたときに発生するイベントです。
+
+## `homeTimeline`
+ホームタイムラインの投稿情報が流れてきます。このチャンネルにパラメータはありません。
+
+### 流れてくるイベント一覧
+
+#### `note`
+タイムラインに新しい投稿が流れてきたときに発生するイベントです。
+
+## `localTimeline`
+ローカルタイムラインの投稿情報が流れてきます。このチャンネルにパラメータはありません。
+
+### 流れてくるイベント一覧
+
+#### `note`
+ローカルタイムラインに新しい投稿が流れてきたときに発生するイベントです。
+
+## `hybridTimeline`
+ソーシャルタイムラインの投稿情報が流れてきます。このチャンネルにパラメータはありません。
+
+### 流れてくるイベント一覧
+
+#### `note`
+ソーシャルタイムラインに新しい投稿が流れてきたときに発生するイベントです。
+
+## `globalTimeline`
+グローバルタイムラインの投稿情報が流れてきます。このチャンネルにパラメータはありません。
+
+### 流れてくるイベント一覧
+
+#### `note`
+グローバルタイムラインに新しい投稿が流れてきたときに発生するイベントです。
diff --git a/src/docs/kn-IN/theme.md b/src/docs/kn-IN/theme.md
new file mode 100644
index 0000000000..4e52ee8cd7
--- /dev/null
+++ b/src/docs/kn-IN/theme.md
@@ -0,0 +1,68 @@
+# テーマ
+
+テーマを設定して、Misskeyクライアントの見た目を変更できます。
+
+## テーマの設定
+設定 > テーマ
+
+## テーマを作成する
+テーマコードはJSON5で記述されたテーマオブジェクトです。 テーマは以下のようなオブジェクトです。
+``` js
+{
+ id: '17587283-dd92-4a2c-a22c-be0637c9e22a',
+
+ name: 'Danboard',
+ author: 'syuilo',
+
+ base: 'light',
+
+ props: {
+ accent: 'rgb(218, 141, 49)',
+ bg: 'rgb(218, 212, 190)',
+ fg: 'rgb(115, 108, 92)',
+ panel: 'rgb(236, 232, 220)',
+ renote: 'rgb(100, 152, 106)',
+ link: 'rgb(100, 152, 106)',
+ mention: '@accent',
+ hashtag: 'rgb(100, 152, 106)',
+ header: 'rgba(239, 227, 213, 0.75)',
+ navBg: 'rgb(216, 206, 182)',
+ inputBorder: 'rgba(0, 0, 0, 0.1)',
+ },
+}
+
+```
+
+* `id` ... テーマの一意なID。UUIDをおすすめします。
+* `name` ... テーマ名
+* `author` ... テーマの作者
+* `desc` ... テーマの説明(オプション)
+* `base` ... 明るいテーマか、暗いテーマか
+ * `light`にすると明るいテーマになり、`dark`にすると暗いテーマになります。
+ * テーマはここで設定されたベーステーマを継承します。
+* `props` ... テーマのスタイル定義。これから説明します。
+
+### テーマのスタイル定義
+`props`下にはテーマのスタイルを定義します。 キーがCSSの変数名になり、バリューで中身を指定します。 なお、この`props`オブジェクトはベーステーマから継承されます。 ベーステーマは、このテーマの`base`が`light`なら[_light.json5](https://github.com/syuilo/misskey/blob/develop/src/client/themes/_light.json5)で、`dark`なら[_dark.json5](https://github.com/syuilo/misskey/blob/develop/src/client/themes/_dark.json5)です。 つまり、このテーマ内の`props`に`panel`というキーが無くても、そこにはベーステーマの`panel`があると見なされます。
+
+#### バリューで使える構文
+* 16進数で表された色
+ * 例: `#00ff00`
+* `rgb(r, g, b)`形式で表された色
+ * 例: `rgb(0, 255, 0)`
+* `rgb(r, g, b, a)`形式で表された透明度を含む色
+ * 例: `rgba(0, 255, 0, 0.5)`
+* 他のキーの値の参照
+ * `@{キー名}`と書くと他のキーの値の参照になります。`{キー名}`は参照したいキーの名前に置き換えます。
+ * 例: `@panel`
+* 定数(後述)の参照
+ * `${定数名}`と書くと定数の参照になります。`{定数名}`は参照したい定数の名前に置き換えます。
+ * 例: `$main`
+* 関数(後述)
+ * `:{関数名}<{引数}<{色}`
+
+#### 定数
+「CSS変数として出力はしたくないが、他のCSS変数の値として使いまわしたい」値があるときは、定数を使うと便利です。 キー名を`$`で始めると、そのキーはCSS変数として出力されません。
+
+#### 関数
+wip
diff --git a/src/docs/kn-IN/timelines.md b/src/docs/kn-IN/timelines.md
new file mode 100644
index 0000000000..36ba61bd2d
--- /dev/null
+++ b/src/docs/kn-IN/timelines.md
@@ -0,0 +1,15 @@
+# タイムラインの比較
+
+https://docs.google.com/spreadsheets/d/1lxQ2ugKrhz58Bg96HTDK_2F98BUritkMyIiBkOByjHA/edit?usp=sharing
+
+## ホーム
+自分のフォローしているユーザーの投稿
+
+## ローカル
+全てのローカルユーザーの「ホーム」指定されていない投稿
+
+## ソーシャル
+自分のフォローしているユーザーの投稿と、全てのローカルユーザーの「ホーム」指定されていない投稿
+
+## グローバル
+全てのローカルユーザーの「ホーム」指定されていない投稿と、サーバーに届いた全てのリモートユーザーの「ホーム」指定されていない投稿
diff --git a/src/docs/ko-KR/aiscript.md b/src/docs/ko-KR/aiscript.md
new file mode 100644
index 0000000000..794ee8ecec
--- /dev/null
+++ b/src/docs/ko-KR/aiscript.md
@@ -0,0 +1,4 @@
+# AiScript
+
+## 함수
+デフォルトで値渡しです。
diff --git a/src/docs/ko-KR/api.md b/src/docs/ko-KR/api.md
new file mode 100644
index 0000000000..76019b6145
--- /dev/null
+++ b/src/docs/ko-KR/api.md
@@ -0,0 +1,58 @@
+# Misskey API
+
+MisskeyAPIを使ってMisskeyクライアント、Misskey連携Webサービス、Bot等(以下「アプリケーション」と呼びます)を開発できます。 ストリーミングAPIもあるので、リアルタイム性のあるアプリケーションを作ることも可能です。
+
+APIを使い始めるには、まずアクセストークンを取得する必要があります。 このドキュメントでは、アクセストークンを取得する手順を説明した後、基本的なAPIの使い方を説明します。
+
+## アクセストークンの取得
+基本的に、APIはリクエストにはアクセストークンが必要となります。 APIにリクエストするのが自分自身なのか、不特定の利用者に使ってもらうアプリケーションなのかによって取得手順は異なります。
+
+* 前者の場合: [「自分自身のアクセストークンを手動発行する」](#自分自身のアクセストークンを手動発行する)に進む
+* 後者の場合: [「アプリケーション利用者にアクセストークンの発行をリクエストする」](#アプリケーション利用者にアクセストークンの発行をリクエストする)に進む
+
+### 自分自身のアクセストークンを手動発行する
+「設定 > API」で、自分のアクセストークンを発行できます。
+
+[「APIの使い方」へ進む](#APIの使い方)
+
+### アプリケーション利用者にアクセストークンの発行をリクエストする
+アプリケーション利用者のアクセストークンを取得するには、以下の手順で発行をリクエストします。
+
+#### Step 1
+
+UUIDを生成する。以後これをセッションIDと呼びます。
+
+> このセッションIDは毎回生成し、使いまわさないようにしてください。
+
+#### Step 2
+
+`{_URL_}/miauth/{session}`をユーザーのブラウザで表示させる。`{session}`の部分は、セッションIDに置き換えてください。
+> 例: `{_URL_}/miauth/c1f6d42b-468b-4fd2-8274-e58abdedef6f`
+
+表示する際、URLにクエリパラメータとしていくつかのオプションを設定できます:
+* `name` ... アプリケーション名
+ * > 例: `MissDeck`
+* `icon` ... アプリケーションのアイコン画像URL
+ * > 例: `https://missdeck.example.com/icon.png`
+* `callback` ... 認証が終わった後にリダイレクトするURL
+ * > 例: `https://missdeck.example.com/callback`
+ * リダイレクト時には、`session`というクエリパラメータでセッションIDが付きます
+* `permission` ... アプリケーションが要求する権限
+ * > 例: `write:notes,write:following,read:drive`
+ * 要求する権限を`,`で区切って列挙します
+ * どのような権限があるかは[APIリファレンス](/api-doc)で確認できます
+
+#### Step 3
+ユーザーが発行を許可した後、`{_URL_}/api/miauth/{session}/check`にPOSTリクエストすると、レスポンスとしてアクセストークンを含むJSONが返ります。
+
+レスポンスに含まれるプロパティ:
+* `token` ... ユーザーのアクセストークン
+* `user` ... ユーザーの情報
+
+[「APIの使い方」へ進む](#APIの使い方)
+
+## APIの使い方
+**APIはすべてPOSTで、リクエスト/レスポンスともにJSON形式です。RESTではありません。** アクセストークンは、`i`というパラメータ名でリクエストに含めます。
+
+* [APIリファレンス](/api-doc)
+* [ストリーミングAPI](./stream)
diff --git a/src/docs/ko-KR/create-plugin.md b/src/docs/ko-KR/create-plugin.md
new file mode 100644
index 0000000000..1562060d72
--- /dev/null
+++ b/src/docs/ko-KR/create-plugin.md
@@ -0,0 +1,74 @@
+# プラグインの作成
+Misskey Webクライアントのプラグイン機能を使うと、クライアントを拡張し、様々な機能を追加できます。 ここではプラグインの作成にあたってのメタデータ定義や、AiScript APIリファレンスを掲載します。
+
+## 메타데이터
+プラグインは、AiScriptのメタデータ埋め込み機能を使って、デフォルトとしてプラグインのメタデータを定義する必要があります。 メタデータは次のプロパティを含むオブジェクトです。
+
+### name
+プラグイン名
+
+### author
+プラグイン作者
+
+### version
+プラグインバージョン。数値を指定してください。
+
+### description
+プラグインの説明
+
+### permissions
+プラグインが要求する権限。MisskeyAPIにリクエストする際に用いられます。
+
+### config
+プラグインの設定情報を表すオブジェクト。 キーに設定名、値に以下のプロパティを含めます。
+
+#### type
+設定値の種類を表す文字列。以下から選択します。 string number boolean
+
+#### label
+ユーザーに表示する設定名
+
+#### description
+設定の説明
+
+#### default
+設定のデフォルト値
+
+## APIリファレンス
+AiScript標準で組み込まれているAPIは掲載しません。
+
+### Mk:dialog(title text type)
+ダイアログを表示します。typeには以下の値が設定できます。 info success warn error question 省略すると info になります。
+
+### Mk:confirm(title text type)
+確認ダイアログを表示します。typeには以下の値が設定できます。 info success warn error question 省略すると question になります。 ユーザーが"OK"を選択した場合は true を、"キャンセル"を選択した場合は false が返ります。
+
+### Mk:api(endpoint params)
+Misskey APIにリクエストします。第一引数にエンドポイント名、第二引数にパラメータオブジェクトを渡します。
+
+### Mk:save(key value)
+任意の値に任意の名前を付けて永続化します。永続化した値は、AiScriptコンテキストが終了しても残り、Mk:loadで読み取ることができます。
+
+### Mk:load(key)
+Mk:saveで永続化した指定の名前の値を読み取ります。
+
+### Plugin:register_post_form_action(title fn)
+投稿フォームにアクションを追加します。第一引数にアクション名、第二引数にアクションが選択された際のコールバック関数を渡します。 コールバック関数には、第一引数に投稿フォームオブジェクトが渡されます。
+
+### Plugin:register_note_action(title fn)
+ノートメニューに項目を追加します。第一引数に項目名、第二引数に項目が選択された際のコールバック関数を渡します。 コールバック関数には、第一引数に対象のノートオブジェクトが渡されます。
+
+### Plugin:register_user_action(title fn)
+ユーザーメニューに項目を追加します。第一引数に項目名、第二引数に項目が選択された際のコールバック関数を渡します。 コールバック関数には、第一引数に対象のユーザーオブジェクトが渡されます。
+
+### Plugin:register_note_view_interruptor(fn)
+UIに表示されるノート情報を書き換えます。 コールバック関数には、第一引数に対象のノートオブジェクトが渡されます。 コールバック関数の返り値でノートが書き換えられます。
+
+### Plugin:register_note_post_interruptor(fn)
+ノート投稿時にノート情報を書き換えます。 コールバック関数には、第一引数に対象のノートオブジェクトが渡されます。 コールバック関数の返り値でノートが書き換えられます。
+
+### Plugin:open_url(url)
+第一引数に渡されたURLをブラウザの新しいタブで開きます。
+
+### Plugin:config
+プラグインの設定が格納されるオブジェクト。プラグイン定義のconfigで設定したキーで値が入ります。
diff --git a/src/docs/ko-KR/custom-emoji.md b/src/docs/ko-KR/custom-emoji.md
new file mode 100644
index 0000000000..6aa3a0fe49
--- /dev/null
+++ b/src/docs/ko-KR/custom-emoji.md
@@ -0,0 +1,2 @@
+# 커스텀 이모지
+カスタム絵文字は、インスタンスで用意された画像を絵文字のように使える機能です。 ノート、リアクション、チャット、自己紹介、名前などの場所で使うことができます。 カスタム絵文字をそれらの場所で使うには、絵文字ピッカーボタン(ある場合)を押すか、`:`を入力して絵文字サジェストを表示します。 テキスト内に`:foo:`のような形式の文字列が見つかると、`foo`の部分がカスタム絵文字名と解釈され、表示時には対応したカスタム絵文字に置き換わります。
diff --git a/src/docs/ko-KR/deck.md b/src/docs/ko-KR/deck.md
new file mode 100644
index 0000000000..87c95d45b3
--- /dev/null
+++ b/src/docs/ko-KR/deck.md
@@ -0,0 +1,18 @@
+# 덱
+
+デッキは利用可能なUIのひとつです。「カラム」と呼ばれるビューを複数並べて表示させることで、カスタマイズ性が高く、情報量の多いUIが構築できることが特徴です。
+
+## カラムの追加
+デッキの背景を右クリックし、「カラムを追加」して任意のカラムを追加できます。
+
+## カラムの移動
+カラムは、ドラッグアンドドロップで他のカラムと位置を入れ替えることが出来るほか、カラムメニュー(カラムのヘッダー右クリック)から位置を移動させることもできます。
+
+## カラムの水平分割
+カラムは左右だけでなく、上下に並べることもできます。 カラムメニューを開き、「左に重ねる」を選択すると、左のカラムの下に現在のカラムが移動します。 上下分割を解除するには、カラムメニューの「右に出す」を選択します。
+
+## カラムの設定
+カラムメニューの「編集」を選択するとカラムの設定を編集できます。カラムの名前を変えたり、幅を変えたりできます。
+
+## デッキの設定
+デッキに関する設定は、[settings/deck](/settings/deck)で行えます。
diff --git a/src/docs/ko-KR/follow.md b/src/docs/ko-KR/follow.md
new file mode 100644
index 0000000000..197aee13c5
--- /dev/null
+++ b/src/docs/ko-KR/follow.md
@@ -0,0 +1,2 @@
+# 팔로잉
+ユーザーをフォローすると、タイムラインにそのユーザーの投稿が表示されるようになります。ただし、他のユーザーに対する返信は含まれません。 ユーザーをフォローするには、ユーザーページの「フォロー」ボタンをクリックします。フォローを解除するには、もう一度クリックします。
diff --git a/src/docs/ko-KR/keyboard-shortcut.md b/src/docs/ko-KR/keyboard-shortcut.md
new file mode 100644
index 0000000000..074431e1e1
--- /dev/null
+++ b/src/docs/ko-KR/keyboard-shortcut.md
@@ -0,0 +1,68 @@
+# キーボードショートカット
+
+## 글로벌
+これらのショートカットは基本的にどこでも使えます。
+<table>
+ <thead>
+ <tr><th>ショートカット</th><th>効果</th><th>由来</th></tr>
+ </thead>
+ <tbody>
+ <tr><td><kbd class="key">P</kbd>, <kbd class="key">N</kbd></td><td>新規投稿</td><td><b>P</b>ost, <b>N</b>ew, <b>N</b>ote</td></tr>
+ <tr><td><kbd class="key">T</kbd></td><td>タイムラインの最も新しい投稿にフォーカス</td><td><b>T</b>imeline, <b>T</b>op</td></tr>
+ <tr><td><kbd class="group"><kbd class="key">Shift</kbd> + <kbd class="key">N</kbd></kbd></td><td>通知を表示/隠す</td><td><b>N</b>otifications</td></tr>
+ <tr><td><kbd class="key">S</kbd></td><td>검색</td><td><b>S</b>earch</td></tr>
+ <tr><td><kbd class="key">H</kbd>, <kbd class="key">?</kbd></td><td>ヘルプを表示</td><td><b>H</b>elp</td></tr>
+ </tbody>
+</table>
+
+## 投稿にフォーカスされた状態
+
+<table>
+ <thead>
+ <tr><th>ショートカット</th><th>効果</th><th>由来</th></tr>
+ </thead>
+ <tbody>
+ <tr><td><kbd class="key">↑</kbd>, <kbd class="key">K</kbd>, <kbd class="group"><kbd class="key">Shift</kbd> + <kbd class="key">Tab</kbd></kbd></td><td>上の投稿にフォーカスを移動</td><td>-</td></tr>
+ <tr><td><kbd class="key">↓</kbd>, <kbd class="key">J</kbd>, <kbd class="key">Tab</kbd></td><td>下の投稿にフォーカスを移動</td><td>-</td></tr>
+ <tr><td><kbd class="key">R</kbd></td><td>返信フォームを開く</td><td><b>R</b>eply</td></tr>
+ <tr><td><kbd class="key">Q</kbd></td><td>Renoteフォームを開く</td><td><b>Q</b>uote</td></tr>
+ <tr><td><kbd class="group"><kbd class="key">Ctrl</kbd> + <kbd class="key">Q</kbd></kbd></td><td>即刻Renoteする(フォームを開かずに)</td><td>-</td></tr>
+ <tr><td><kbd class="key">E</kbd>, <kbd class="key">A</kbd>, <kbd class="key">+</kbd></td><td>リアクションフォームを開く</td><td><b>E</b>mote, re<b>A</b>ction</td></tr>
+ <tr><td><kbd class="key">0</kbd>~<kbd class="key">9</kbd></td><td>数字に対応したリアクションをする(対応については後述)</td><td>-</td></tr>
+ <tr><td><kbd class="key">F</kbd>, <kbd class="key">B</kbd></td><td>お気に入りに登録</td><td><b>F</b>avorite, <b>B</b>ookmark</td></tr>
+ <tr><td><kbd class="key">Del</kbd>, <kbd class="group"><kbd class="key">Ctrl</kbd> + <kbd class="key">D</kbd></kbd></td><td>投稿を削除</td><td><b>D</b>elete</tr>
+ <tr><td><kbd class="key">M</kbd>, <kbd class="key">O</kbd></td><td>投稿に対するメニューを開く</td><td><b>M</b>ore, <b>O</b>ther</td></tr>
+ <tr><td><kbd class="key">S</kbd></td><td>CWで隠された部分を表示 or 隠す</td><td><b>S</b>how, <b>S</b>ee</td></tr>
+ <tr><td><kbd class="key">Esc</kbd></td><td>フォーカスを外す</td><td>-</td></tr>
+ </tbody>
+</table>
+
+## Renoteフォーム
+
+<table>
+ <thead>
+ <tr><th>ショートカット</th><th>効果</th><th>由来</th></tr>
+ </thead>
+ <tbody>
+ <tr><td><kbd class="key">Enter</kbd></td><td>Renoteする</td><td>-</td></tr>
+ <tr><td><kbd class="key">Q</kbd></td><td>フォームを展開する</td><td><b>Q</b>uote</td></tr>
+ <tr><td><kbd class="key">Esc</kbd></td><td>フォームを閉じる</td><td>-</td></tr>
+ </tbody>
+</table>
+
+## リアクションフォーム
+デフォルトで「👍」にフォーカスが当たっている状態です。
+<table>
+ <thead>
+ <tr><th>ショートカット</th><th>効果</th><th>由来</th></tr>
+ </thead>
+ <tbody>
+ <tr><td><kbd class="key">↑</kbd>, <kbd class="key">K</kbd></td><td>上のリアクションにフォーカスを移動</td><td>-</td></tr>
+ <tr><td><kbd class="key">↓</kbd>, <kbd class="key">J</kbd></td><td>下のリアクションにフォーカスを移動</td><td>-</td></tr>
+ <tr><td><kbd class="key">←</kbd>, <kbd class="key">H</kbd>, <kbd class="group"><kbd class="key">Shift</kbd> + <kbd class="key">Tab</kbd></kbd></td><td>左のリアクションにフォーカスを移動</td><td>-</td></tr>
+ <tr><td><kbd class="key">→</kbd>, <kbd class="key">L</kbd>, <kbd class="key">Tab</kbd></td><td>右のリアクションにフォーカスを移動</td><td>-</td></tr>
+ <tr><td><kbd class="key">Enter</kbd>, <kbd class="key">Space</kbd>, <kbd class="key">+</kbd></td><td>リアクション確定</td><td>-</td></tr>
+ <tr><td><kbd class="key">0</kbd>~<kbd class="key">9</kbd></td><td>数字に対応したリアクションで確定</td><td>-</td></tr>
+ <tr><td><kbd class="key">Esc</kbd></td><td>リアクションするのをやめる</td><td>-</td></tr>
+ </tbody>
+</table>
diff --git a/src/docs/ko-KR/mfm.md b/src/docs/ko-KR/mfm.md
new file mode 100644
index 0000000000..e237287acc
--- /dev/null
+++ b/src/docs/ko-KR/mfm.md
@@ -0,0 +1,2 @@
+# MFM
+MFMは、Misskey Flavored Markdownの略で、Misskeyの様々な場所で使用できる専用のマークアップ言語です。 MFMで使用可能な構文は[MFMチートシート](/mfm-cheat-sheet)で確認できます。
diff --git a/src/docs/ko-KR/mute.md b/src/docs/ko-KR/mute.md
new file mode 100644
index 0000000000..89195bb108
--- /dev/null
+++ b/src/docs/ko-KR/mute.md
@@ -0,0 +1,13 @@
+# 뮤트
+
+ユーザーをミュートすると、そのユーザーに関する次のコンテンツがMisskeyに表示されなくなります:
+
+* タイムラインや投稿の検索結果内の、そのユーザーの投稿(およびそれらの投稿に対する返信やRenote)
+* そのユーザーからの通知
+* メッセージ履歴一覧内の、そのユーザーとのメッセージ履歴
+
+ユーザーをミュートするには、対象のユーザーのユーザーページに表示されている「ミュート」ボタンを押します。
+
+ミュートを行ったことは相手に通知されず、ミュートされていることを知ることもできません。
+
+設定>ミュート から、自分がミュートしているユーザー一覧を確認することができます。
diff --git a/src/docs/ko-KR/pages.md b/src/docs/ko-KR/pages.md
new file mode 100644
index 0000000000..54bc853715
--- /dev/null
+++ b/src/docs/ko-KR/pages.md
@@ -0,0 +1,10 @@
+# Pages
+
+## 변수
+変数を使うことで動的なページを作成できます。テキスト内で <b>{ 変数名 }</b> と書くとそこに変数の値を埋め込めます。例えば <b>Hello { thing } world!</b> というテキストで、変数(thing)の値が <b>ai</b> だった場合、テキストは <b>Hello ai world!</b> になります。
+
+変数の評価(値を算出すること)は上から下に行われるので、ある変数の中で自分より下の変数を参照することはできません。例えば上から <b>A、B、C</b> と3つの変数を定義したとき、<b>C</b>の中で<b>A</b>や<b>B</b>を参照することはできますが、<b>A</b>の中で<b>B</b>や<b>C</b>を参照することはできません。
+
+ユーザーからの入力を受け取るには、ページに「ユーザー入力」ブロックを設置し、「変数名」に入力を格納したい変数名を設定します(変数は自動で作成されます)。その変数を使ってユーザー入力に応じた動作を行えます。
+
+関数を使うと、値の算出処理を再利用可能な形にまとめることができます。関数を作るには、「関数」タイプの変数を作成します。関数にはスロット(引数)を設定することができ、スロットの値は関数内で変数として利用可能です。また、関数を引数に取る関数(高階関数と呼ばれます)も存在します。関数は予め定義しておくほかに、このような高階関数のスロットに即席でセットすることもできます。
diff --git a/src/docs/ko-KR/reaction.md b/src/docs/ko-KR/reaction.md
new file mode 100644
index 0000000000..b8227839b5
--- /dev/null
+++ b/src/docs/ko-KR/reaction.md
@@ -0,0 +1,11 @@
+# 리액션
+他の人のノートに、絵文字を付けて簡単にあなたの反応を伝えられる機能です。 リアクションするには、ノートの + アイコンをクリックしてピッカーを表示し、絵文字を選択します。 リアクションには[カスタム絵文字](./custom-emoji)も使用できます。
+
+## リアクションピッカーのカスタマイズ
+ピッカーに表示される絵文字を自分好みにカスタマイズすることができます。 設定の「リアクション」で設定します。
+
+## リモート投稿へのリアクションについて
+リアクションはMisskeyオリジナルの機能であるため、リモートインスタンスがMisskeyでない限りは、ほとんどの場合「Like」としてアクティビティが送信されます。一般的にはLikeは「お気に入り」として実装されているようです。 また、相手がMisskeyであったとしても、カスタム絵文字リアクションは伝わらず、自動的に「👍」等にフォールバックされます。
+
+## リモートからのリアクションについて
+リモートから「Like」アクティビティを受信したとき、Misskeyでは「👍」のリアクションとして解釈されます。
diff --git a/src/docs/ko-KR/reversi-bot.md b/src/docs/ko-KR/reversi-bot.md
new file mode 100644
index 0000000000..aef450f2de
--- /dev/null
+++ b/src/docs/ko-KR/reversi-bot.md
@@ -0,0 +1,160 @@
+# MisskeyリバーシBotの開発
+Misskeyのリバーシ機能に対応したBotの開発方法をここに記します。
+
+1. `games/reversi`ストリームに以下のパラメータを付けて接続する:
+ * `i`: botアカウントのAPIキー
+
+2. 対局への招待が来たら、ストリームから`invited`イベントが流れてくる
+ * イベントの中身に、`parent`という名前で対局へ誘ってきたユーザーの情報が含まれている
+
+3. `games/reversi/match`へ、`user_id`として`parent`の`id`が含まれたリクエストを送信する
+
+4. 上手くいくとゲーム情報が返ってくるので、`games/reversi-game`ストリームへ、以下のパラメータを付けて接続する:
+ * `i`: botアカウントのAPIキー
+ * `game`: `game`の`id`
+
+5. この間、相手がゲームの設定を変更するとその都度`update-settings`イベントが流れてくるので、必要であれば何かしらの処理を行う
+
+6. 設定に満足したら、`{ type: 'accept' }`メッセージをストリームに送信する
+
+7. ゲームが開始すると、`started`イベントが流れてくる
+ * イベントの中身にはゲーム情報が含まれている
+
+8. 石を打つには、ストリームに`{ type: 'set', pos: <位置> }`を送信する(位置の計算方法は後述)
+
+9. 相手または自分が石を打つと、ストリームから`set`イベントが流れてくる
+ * `color`として石の色が含まれている
+ * `pos`として位置情報が含まれている
+
+## 位置の計算法
+8x8のマップを考える場合、各マスの位置(インデックスと呼びます)は次のようになっています:
+```
++--+--+--+--+--+--+--+--+
+| 0| 1| 2| 3| 4| 5| 6| 7|
++--+--+--+--+--+--+--+--+
+| 8| 9|10|11|12|13|14|15|
++--+--+--+--+--+--+--+--+
+|16|17|18|19|20|21|22|23|
+...
+```
+
+### X,Y座標 から インデックス に変換する
+```
+pos = x + (y * mapWidth)
+```
+`mapWidth`は、ゲーム情報の`map`から、次のようにして計算できます:
+```
+mapWidth = map[0].length
+```
+
+### インデックス から X,Y座標 に変換する
+```
+x = pos % mapWidth
+y = Math.floor(pos / mapWidth)
+```
+
+## マップ情報
+マップ情報は、ゲーム情報の`map`に入っています。 文字列の配列になっており、ひとつひとつの文字がマス情報を表しています。 それをもとにマップのデザインを知る事が出来ます:
+* `(スペース)` ... マス無し
+* `-` ... マス
+* `b` ... 初期配置される黒石
+* `w` ... 初期配置される白石
+
+例えば、4*4の次のような単純なマップがあるとします:
+```text
++---+---+---+---+
+| | | | |
++---+---+---+---+
+| | ○ | ● | |
++---+---+---+---+
+| | ● | ○ | |
++---+---+---+---+
+| | | | |
++---+---+---+---+
+```
+
+この場合、マップデータはこのようになります:
+```javascript
+['----', '-wb-', '-bw-', '----']
+```
+
+## ユーザーにフォームを提示して対話可能Botを作成する
+ユーザーとのコミュニケーションを行うため、ゲームの設定画面でユーザーにフォームを提示することができます。 例えば、Botの強さをユーザーが設定できるようにする、といったシナリオが考えられます。
+
+フォームを提示するには、`reversi-game`ストリームに次のメッセージを送信します:
+```javascript
+{
+ type: 'init-form',
+ body: [フォームコントロールの配列]
+}
+```
+
+フォームコントロールの配列については今から説明します。 フォームコントロールは、次のようなオブジェクトです:
+```javascript
+{
+ id: 'switch1',
+ type: 'switch',
+ label: 'Enable hoge',
+ value: false
+}
+```
+`id` ... コントロールのID。 `type` ... コントロールの種類。後述します。 `label` ... コントロールと一緒に表記するテキスト。 `value` ... コントロールのデフォルト値。
+
+### フォームの操作を受け取る
+ユーザーがフォームを操作すると、ストリームから`update-form`イベントが流れてきます。 イベントの中身には、コントロールのIDと、ユーザーが設定した値が含まれています。 例えば、上で示したスイッチをユーザーがオンにしたとすると、次のイベントが流れてきます:
+```javascript
+{
+ id: 'switch1',
+ value: true
+}
+```
+
+### フォームコントロールの種類
+#### 스위치
+type: `switch` スイッチを表示します。何かの機能をオン/オフさせたい場合に有用です。
+
+##### プロパティ
+`label` ... スイッチに表記するテキスト。
+
+#### ラジオボタン
+type: `radio` ラジオボタンを表示します。選択肢を提示するのに有用です。例えば、Botの強さを設定させるなどです。
+
+##### プロパティ
+`items` ... ラジオボタンの選択肢。例:
+```javascript
+items: [{
+ label: '弱',
+ value: 1
+}, {
+ label: '中',
+ value: 2
+}, {
+ label: '強',
+ value: 3
+}]
+```
+
+#### スライダー
+type: `slider` スライダーを表示します。
+
+##### プロパティ
+`min` ... スライダーの下限。 `max` ... スライダーの上限。 `step` ... 入力欄で刻むステップ値。
+
+#### テキストボックス
+type: `textbox` テキストボックスを表示します。ユーザーになにか入力させる一般的な用途に利用できます。
+
+## ユーザーにメッセージを表示する
+設定画面でユーザーと対話する、フォーム以外のもうひとつの方法がこれです。ユーザーになにかメッセージを表示することができます。 例えば、ユーザーがBotの対応していないモードやマップを選択したとき、警告を表示するなどです。 メッセージを表示するには、次のメッセージをストリームに送信します:
+```javascript
+{
+ type: 'message',
+ body: {
+ text: 'メッセージ内容',
+ type: 'メッセージの種類'
+ }
+}
+```
+メッセージの種類: `success`, `info`, `warning`, `error`。
+
+## 投了する
+投了をするには、<a href="./api/endpoints/games/reversi/games/surrender">このエンドポイント</a>にリクエストします。
diff --git a/src/docs/ko-KR/stream.md b/src/docs/ko-KR/stream.md
new file mode 100644
index 0000000000..1ff7d4c3ef
--- /dev/null
+++ b/src/docs/ko-KR/stream.md
@@ -0,0 +1,354 @@
+# ストリーミングAPI
+
+ストリーミングAPIを使うと、リアルタイムで様々な情報(例えばタイムラインに新しい投稿が流れてきた、メッセージが届いた、フォローされた、など)を受け取ったり、様々な操作を行ったりすることができます。
+
+## ストリームに接続する
+
+ストリーミングAPIを利用するには、まずMisskeyサーバーに**websocket**接続する必要があります。
+
+以下のURLに、`i`というパラメータ名で認証情報を含めて、websocket接続してください。例:
+```
+%WS_URL%/streaming?i=xxxxxxxxxxxxxxx
+```
+
+認証情報は、自分のAPIキーや、アプリケーションからストリームに接続する際はユーザーのアクセストークンのことを指します。
+
+<div class="ui info">
+ <p><i class="fas fa-info-circle"></i> 認証情報の取得については、<a href="./api">こちらのドキュメント</a>をご確認ください。</p>
+</div>
+
+---
+
+認証情報は省略することもできますが、その場合非ログインでの利用ということになり、受信できる情報や可能な操作は限られます。例:
+
+```
+%WS_URL%/streaming
+```
+
+---
+
+ストリームに接続すると、後述するAPI操作や、投稿の購読を行ったりすることができます。 しかしまだこの段階では、例えばタイムラインへの新しい投稿を受信したりすることはできません。 それを行うには、ストリーム上で、後述する**チャンネル**に接続する必要があります。
+
+**ストリームでのやり取りはすべてJSONです。**
+
+## 채널
+MisskeyのストリーミングAPIにはチャンネルという概念があります。これは、送受信する情報を分離するための仕組みです。 Misskeyのストリームに接続しただけでは、まだリアルタイムでタイムラインの投稿を受信したりはできません。 ストリーム上でチャンネルに接続することで、様々な情報を受け取ったり情報を送信したりすることができるようになります。
+
+### チャンネルに接続する
+チャンネルに接続するには、次のようなデータをJSONでストリームに送信します:
+
+```json
+{
+ type: 'connect',
+ body: {
+ channel: 'xxxxxxxx',
+ id: 'foobar',
+ params: {
+ ...
+ }
+ }
+}
+```
+
+ここで、
+* `channel`には接続したいチャンネル名を設定します。チャンネルの種類については後述します。
+* `id`にはそのチャンネルとやり取りするための任意のIDを設定します。ストリームでは様々なメッセージが流れるので、そのメッセージがどのチャンネルからのものなのか識別する必要があるからです。このIDは、UUIDや、乱数のようなもので構いません。
+* `params`はチャンネルに接続する際のパラメータです。チャンネルによって接続時に必要とされるパラメータは異なります。パラメータ不要のチャンネルに接続する際は、このプロパティは省略可能です。
+
+<div class="ui info">
+ <p><i class="fas fa-info-circle"></i> IDはチャンネルごとではなく「チャンネルの接続ごと」です。なぜなら、同じチャンネルに異なるパラメータで複数接続するケースもあるからです。</p>
+</div>
+
+### チャンネルからのメッセージを受け取る
+例えばタイムラインのチャンネルなら、新しい投稿があった時にメッセージを発します。そのメッセージを受け取ることで、タイムラインに新しい投稿がされたことをリアルタイムで知ることができます。
+
+チャンネルがメッセージを発すると、次のようなデータがJSONでストリームに流れてきます:
+```json
+{
+ type: 'channel',
+ body: {
+ id: 'foobar',
+ type: 'something',
+ body: {
+ some: 'thing'
+ }
+ }
+}
+```
+
+ここで、
+* `id`には前述したそのチャンネルに接続する際に設定したIDが設定されています。これで、このメッセージがどのチャンネルからのものなのか知ることができます。
+* `type`にはメッセージの種類が設定されます。チャンネルによって、どのような種類のメッセージが流れてくるかは異なります。
+* `body`にはメッセージの内容が設定されます。チャンネルによって、どのような内容のメッセージが流れてくるかは異なります。
+
+### チャンネルに向けてメッセージを送信する
+チャンネルによっては、メッセージを受け取るだけでなく、こちらから何かメッセージを送信し、何らかの操作を行える場合があります。
+
+チャンネルにメッセージを送信するには、次のようなデータをJSONでストリームに送信します:
+```json
+{
+ type: 'channel',
+ body: {
+ id: 'foobar',
+ type: 'something',
+ body: {
+ some: 'thing'
+ }
+ }
+}
+```
+
+ここで、
+* `id`には前述したそのチャンネルに接続する際に設定したIDを設定します。これで、このメッセージがどのチャンネルに向けたものなのか識別させることができます。
+* `type`にはメッセージの種類を設定します。チャンネルによって、どのような種類のメッセージを受け付けるかは異なります。
+* `body`にはメッセージの内容を設定します。チャンネルによって、どのような内容のメッセージを受け付けるかは異なります。
+
+### チャンネルから切断する
+チャンネルから切断するには、次のようなデータをJSONでストリームに送信します:
+
+```json
+{
+ type: 'disconnect',
+ body: {
+ id: 'foobar'
+ }
+}
+```
+
+ここで、
+* `id`には前述したそのチャンネルに接続する際に設定したIDを設定します。
+
+## ストリームを経由してAPIリクエストする
+
+ストリームを経由してAPIリクエストすると、HTTPリクエストを発生させずにAPIを利用できます。そのため、コードを簡潔にできたり、パフォーマンスの向上を見込めるかもしれません。
+
+ストリームを経由してAPIリクエストするには、次のようなデータをJSONでストリームに送信します:
+```json
+{
+ type: 'api',
+ body: {
+ id: 'xxxxxxxxxxxxxxxx',
+ endpoint: 'notes/create',
+ data: {
+ text: 'yee haw!'
+ }
+ }
+}
+```
+
+ここで、
+* `id`には、APIのレスポンスを識別するための、APIリクエストごとの一意なIDを設定する必要があります。UUIDや、簡単な乱数のようなもので構いません。
+* `endpoint`には、あなたがリクエストしたいAPIのエンドポイントを指定します。
+* `data`には、エンドポイントのパラメータを含めます。
+
+<div class="ui info">
+ <p><i class="fas fa-info-circle"></i> APIのエンドポイントやパラメータについてはAPIリファレンスをご確認ください。</p>
+</div>
+
+### レスポンスの受信
+
+APIへリクエストすると、レスポンスがストリームから次のような形式で流れてきます。
+
+```json
+{
+ type: 'api:xxxxxxxxxxxxxxxx',
+ body: {
+ ...
+ }
+}
+```
+
+ここで、
+* `xxxxxxxxxxxxxxxx`の部分には、リクエストの際に設定された`id`が含まれています。これにより、どのリクエストに対するレスポンスなのか判別することができます。
+* `body`には、レスポンスが含まれています。
+
+## 投稿のキャプチャ
+
+Misskeyは投稿のキャプチャと呼ばれる仕組みを提供しています。これは、指定した投稿のイベントをストリームで受け取る機能です。
+
+例えばタイムラインを取得してユーザーに表示したとします。ここで誰かがそのタイムラインに含まれるどれかの投稿に対してリアクションしたとします。
+
+しかし、クライアントからするとある投稿にリアクションが付いたことなどは知る由がないため、リアルタイムでリアクションをタイムライン上の投稿に反映して表示するといったことができません。
+
+この問題を解決するために、Misskeyは投稿のキャプチャ機構を用意しています。投稿をキャプチャすると、その投稿に関するイベントを受け取ることができるため、リアルタイムでリアクションを反映させたりすることが可能になります。
+
+### 投稿をキャプチャする
+
+投稿をキャプチャするには、ストリームに次のようなメッセージを送信します:
+
+```json
+{
+ type: 'subNote',
+ body: {
+ id: 'xxxxxxxxxxxxxxxx'
+ }
+}
+```
+
+ここで、
+* `id`にキャプチャしたい投稿の`id`を設定します。
+
+このメッセージを送信すると、Misskeyにキャプチャを要請したことになり、以後、その投稿に関するイベントが流れてくるようになります。
+
+例えば投稿にリアクションが付いたとすると、次のようなメッセージが流れてきます:
+
+```json
+{
+ type: 'noteUpdated',
+ body: {
+ id: 'xxxxxxxxxxxxxxxx',
+ type: 'reacted',
+ body: {
+ reaction: 'like',
+ userId: 'yyyyyyyyyyyyyyyy'
+ }
+ }
+}
+```
+
+ここで、
+* `body`内の`id`に、イベントを発生させた投稿のIDが設定されます。
+* `body`内の`type`に、イベントの種類が設定されます。
+* `body`内の`body`に、イベントの詳細が設定されます。
+
+#### イベントの種類
+
+##### `reacted`
+その投稿にリアクションがされた時に発生します。
+
+* `reaction`に、リアクションの種類が設定されます。
+* `userId`に、リアクションを行ったユーザーのIDが設定されます。
+
+例:
+```json
+{
+ type: 'noteUpdated',
+ body: {
+ id: 'xxxxxxxxxxxxxxxx',
+ type: 'reacted',
+ body: {
+ reaction: 'like',
+ userId: 'yyyyyyyyyyyyyyyy'
+ }
+ }
+}
+```
+
+##### `deleted`
+その投稿が削除された時に発生します。
+
+* `deletedAt`に、削除日時が設定されます。
+
+例:
+```json
+{
+ type: 'noteUpdated',
+ body: {
+ id: 'xxxxxxxxxxxxxxxx',
+ type: 'deleted',
+ body: {
+ deletedAt: '2018-10-22T02:17:09.703Z'
+ }
+ }
+}
+```
+
+##### `pollVoted`
+その投稿に添付されたアンケートに投票された時に発生します。
+
+* `choice`に、選択肢IDが設定されます。
+* `userId`に、投票を行ったユーザーのIDが設定されます。
+
+例:
+```json
+{
+ type: 'noteUpdated',
+ body: {
+ id: 'xxxxxxxxxxxxxxxx',
+ type: 'pollVoted',
+ body: {
+ choice: 2,
+ userId: 'yyyyyyyyyyyyyyyy'
+ }
+ }
+}
+```
+
+### 投稿のキャプチャを解除する
+
+その投稿がもう画面に表示されなくなったりして、その投稿に関するイベントをもう受け取る必要がなくなったときは、キャプチャの解除を申請してください。
+
+次のメッセージを送信します:
+
+```json
+{
+ type: 'unsubNote',
+ body: {
+ id: 'xxxxxxxxxxxxxxxx'
+ }
+}
+```
+
+ここで、
+* `id`にキャプチャを解除したい投稿の`id`を設定します。
+
+このメッセージを送信すると、以後、その投稿に関するイベントは流れてこないようになります。
+
+# チャンネル一覧
+## `main`
+アカウントに関する基本的な情報が流れてきます。このチャンネルにパラメータはありません。
+
+### 流れてくるイベント一覧
+
+#### `renote`
+自分の投稿がRenoteされた時に発生するイベントです。自分自身の投稿をRenoteしたときは発生しません。
+
+#### `mention`
+誰かからメンションされたときに発生するイベントです。
+
+#### `readAllNotifications`
+自分宛ての通知がすべて既読になったことを表すイベントです。このイベントを利用して、「通知があることを示すアイコン」のようなものをオフにしたりする等のケースが想定されます。
+
+#### `meUpdated`
+自分の情報が更新されたことを表すイベントです。
+
+#### `follow`
+自分が誰かをフォローしたときに発生するイベントです。
+
+#### `unfollow`
+自分が誰かのフォローを解除したときに発生するイベントです。
+
+#### `followed`
+自分が誰かにフォローされたときに発生するイベントです。
+
+## `homeTimeline`
+ホームタイムラインの投稿情報が流れてきます。このチャンネルにパラメータはありません。
+
+### 流れてくるイベント一覧
+
+#### `note`
+タイムラインに新しい投稿が流れてきたときに発生するイベントです。
+
+## `localTimeline`
+ローカルタイムラインの投稿情報が流れてきます。このチャンネルにパラメータはありません。
+
+### 流れてくるイベント一覧
+
+#### `note`
+ローカルタイムラインに新しい投稿が流れてきたときに発生するイベントです。
+
+## `hybridTimeline`
+ソーシャルタイムラインの投稿情報が流れてきます。このチャンネルにパラメータはありません。
+
+### 流れてくるイベント一覧
+
+#### `note`
+ソーシャルタイムラインに新しい投稿が流れてきたときに発生するイベントです。
+
+## `globalTimeline`
+グローバルタイムラインの投稿情報が流れてきます。このチャンネルにパラメータはありません。
+
+### 流れてくるイベント一覧
+
+#### `note`
+グローバルタイムラインに新しい投稿が流れてきたときに発生するイベントです。
diff --git a/src/docs/ko-KR/theme.md b/src/docs/ko-KR/theme.md
new file mode 100644
index 0000000000..856580e600
--- /dev/null
+++ b/src/docs/ko-KR/theme.md
@@ -0,0 +1,68 @@
+# 테마
+
+テーマを設定して、Misskeyクライアントの見た目を変更できます。
+
+## テーマの設定
+設定 > テーマ
+
+## テーマを作成する
+テーマコードはJSON5で記述されたテーマオブジェクトです。 テーマは以下のようなオブジェクトです。
+``` js
+{
+ id: '17587283-dd92-4a2c-a22c-be0637c9e22a',
+
+ name: 'Danboard',
+ author: 'syuilo',
+
+ base: 'light',
+
+ props: {
+ accent: 'rgb(218, 141, 49)',
+ bg: 'rgb(218, 212, 190)',
+ fg: 'rgb(115, 108, 92)',
+ panel: 'rgb(236, 232, 220)',
+ renote: 'rgb(100, 152, 106)',
+ link: 'rgb(100, 152, 106)',
+ mention: '@accent',
+ hashtag: 'rgb(100, 152, 106)',
+ header: 'rgba(239, 227, 213, 0.75)',
+ navBg: 'rgb(216, 206, 182)',
+ inputBorder: 'rgba(0, 0, 0, 0.1)',
+ },
+}
+
+```
+
+* `id` ... テーマの一意なID。UUIDをおすすめします。
+* `name` ... テーマ名
+* `author` ... テーマの作者
+* `desc` ... テーマの説明(オプション)
+* `base` ... 明るいテーマか、暗いテーマか
+ * `light`にすると明るいテーマになり、`dark`にすると暗いテーマになります。
+ * テーマはここで設定されたベーステーマを継承します。
+* `props` ... テーマのスタイル定義。これから説明します。
+
+### テーマのスタイル定義
+`props`下にはテーマのスタイルを定義します。 キーがCSSの変数名になり、バリューで中身を指定します。 なお、この`props`オブジェクトはベーステーマから継承されます。 ベーステーマは、このテーマの`base`が`light`なら[_light.json5](https://github.com/syuilo/misskey/blob/develop/src/client/themes/_light.json5)で、`dark`なら[_dark.json5](https://github.com/syuilo/misskey/blob/develop/src/client/themes/_dark.json5)です。 つまり、このテーマ内の`props`に`panel`というキーが無くても、そこにはベーステーマの`panel`があると見なされます。
+
+#### バリューで使える構文
+* 16進数で表された色
+ * 例: `#00ff00`
+* `rgb(r, g, b)`形式で表された色
+ * 例: `rgb(0, 255, 0)`
+* `rgb(r, g, b, a)`形式で表された透明度を含む色
+ * 例: `rgba(0, 255, 0, 0.5)`
+* 他のキーの値の参照
+ * `@{キー名}`と書くと他のキーの値の参照になります。`{キー名}`は参照したいキーの名前に置き換えます。
+ * 例: `@panel`
+* 定数(後述)の参照
+ * `${定数名}`と書くと定数の参照になります。`{定数名}`は参照したい定数の名前に置き換えます。
+ * 例: `$main`
+* 関数(後述)
+ * `:{関数名}<{引数}<{色}`
+
+#### 상수
+「CSS変数として出力はしたくないが、他のCSS変数の値として使いまわしたい」値があるときは、定数を使うと便利です。 キー名を`$`で始めると、そのキーはCSS変数として出力されません。
+
+#### 함수
+wip
diff --git a/src/docs/ko-KR/timelines.md b/src/docs/ko-KR/timelines.md
new file mode 100644
index 0000000000..ecaaa644aa
--- /dev/null
+++ b/src/docs/ko-KR/timelines.md
@@ -0,0 +1,15 @@
+# タイムラインの比較
+
+https://docs.google.com/spreadsheets/d/1lxQ2ugKrhz58Bg96HTDK_2F98BUritkMyIiBkOByjHA/edit?usp=sharing
+
+## 홈
+自分のフォローしているユーザーの投稿
+
+## 로컬
+全てのローカルユーザーの「ホーム」指定されていない投稿
+
+## 소셜
+自分のフォローしているユーザーの投稿と、全てのローカルユーザーの「ホーム」指定されていない投稿
+
+## 글로벌
+全てのローカルユーザーの「ホーム」指定されていない投稿と、サーバーに届いた全てのリモートユーザーの「ホーム」指定されていない投稿
diff --git a/src/docs/nl-NL/aiscript.md b/src/docs/nl-NL/aiscript.md
new file mode 100644
index 0000000000..6c28b446e3
--- /dev/null
+++ b/src/docs/nl-NL/aiscript.md
@@ -0,0 +1,4 @@
+# AiScript
+
+## 関数
+デフォルトで値渡しです。
diff --git a/src/docs/nl-NL/api.md b/src/docs/nl-NL/api.md
new file mode 100644
index 0000000000..76019b6145
--- /dev/null
+++ b/src/docs/nl-NL/api.md
@@ -0,0 +1,58 @@
+# Misskey API
+
+MisskeyAPIを使ってMisskeyクライアント、Misskey連携Webサービス、Bot等(以下「アプリケーション」と呼びます)を開発できます。 ストリーミングAPIもあるので、リアルタイム性のあるアプリケーションを作ることも可能です。
+
+APIを使い始めるには、まずアクセストークンを取得する必要があります。 このドキュメントでは、アクセストークンを取得する手順を説明した後、基本的なAPIの使い方を説明します。
+
+## アクセストークンの取得
+基本的に、APIはリクエストにはアクセストークンが必要となります。 APIにリクエストするのが自分自身なのか、不特定の利用者に使ってもらうアプリケーションなのかによって取得手順は異なります。
+
+* 前者の場合: [「自分自身のアクセストークンを手動発行する」](#自分自身のアクセストークンを手動発行する)に進む
+* 後者の場合: [「アプリケーション利用者にアクセストークンの発行をリクエストする」](#アプリケーション利用者にアクセストークンの発行をリクエストする)に進む
+
+### 自分自身のアクセストークンを手動発行する
+「設定 > API」で、自分のアクセストークンを発行できます。
+
+[「APIの使い方」へ進む](#APIの使い方)
+
+### アプリケーション利用者にアクセストークンの発行をリクエストする
+アプリケーション利用者のアクセストークンを取得するには、以下の手順で発行をリクエストします。
+
+#### Step 1
+
+UUIDを生成する。以後これをセッションIDと呼びます。
+
+> このセッションIDは毎回生成し、使いまわさないようにしてください。
+
+#### Step 2
+
+`{_URL_}/miauth/{session}`をユーザーのブラウザで表示させる。`{session}`の部分は、セッションIDに置き換えてください。
+> 例: `{_URL_}/miauth/c1f6d42b-468b-4fd2-8274-e58abdedef6f`
+
+表示する際、URLにクエリパラメータとしていくつかのオプションを設定できます:
+* `name` ... アプリケーション名
+ * > 例: `MissDeck`
+* `icon` ... アプリケーションのアイコン画像URL
+ * > 例: `https://missdeck.example.com/icon.png`
+* `callback` ... 認証が終わった後にリダイレクトするURL
+ * > 例: `https://missdeck.example.com/callback`
+ * リダイレクト時には、`session`というクエリパラメータでセッションIDが付きます
+* `permission` ... アプリケーションが要求する権限
+ * > 例: `write:notes,write:following,read:drive`
+ * 要求する権限を`,`で区切って列挙します
+ * どのような権限があるかは[APIリファレンス](/api-doc)で確認できます
+
+#### Step 3
+ユーザーが発行を許可した後、`{_URL_}/api/miauth/{session}/check`にPOSTリクエストすると、レスポンスとしてアクセストークンを含むJSONが返ります。
+
+レスポンスに含まれるプロパティ:
+* `token` ... ユーザーのアクセストークン
+* `user` ... ユーザーの情報
+
+[「APIの使い方」へ進む](#APIの使い方)
+
+## APIの使い方
+**APIはすべてPOSTで、リクエスト/レスポンスともにJSON形式です。RESTではありません。** アクセストークンは、`i`というパラメータ名でリクエストに含めます。
+
+* [APIリファレンス](/api-doc)
+* [ストリーミングAPI](./stream)
diff --git a/src/docs/nl-NL/create-plugin.md b/src/docs/nl-NL/create-plugin.md
new file mode 100644
index 0000000000..0d2fa19178
--- /dev/null
+++ b/src/docs/nl-NL/create-plugin.md
@@ -0,0 +1,74 @@
+# プラグインの作成
+Misskey Webクライアントのプラグイン機能を使うと、クライアントを拡張し、様々な機能を追加できます。 ここではプラグインの作成にあたってのメタデータ定義や、AiScript APIリファレンスを掲載します。
+
+## メタデータ
+プラグインは、AiScriptのメタデータ埋め込み機能を使って、デフォルトとしてプラグインのメタデータを定義する必要があります。 メタデータは次のプロパティを含むオブジェクトです。
+
+### name
+プラグイン名
+
+### author
+プラグイン作者
+
+### version
+プラグインバージョン。数値を指定してください。
+
+### description
+プラグインの説明
+
+### permissions
+プラグインが要求する権限。MisskeyAPIにリクエストする際に用いられます。
+
+### config
+プラグインの設定情報を表すオブジェクト。 キーに設定名、値に以下のプロパティを含めます。
+
+#### type
+設定値の種類を表す文字列。以下から選択します。 string number boolean
+
+#### label
+ユーザーに表示する設定名
+
+#### description
+設定の説明
+
+#### default
+設定のデフォルト値
+
+## APIリファレンス
+AiScript標準で組み込まれているAPIは掲載しません。
+
+### Mk:dialog(title text type)
+ダイアログを表示します。typeには以下の値が設定できます。 info success warn error question 省略すると info になります。
+
+### Mk:confirm(title text type)
+確認ダイアログを表示します。typeには以下の値が設定できます。 info success warn error question 省略すると question になります。 ユーザーが"OK"を選択した場合は true を、"キャンセル"を選択した場合は false が返ります。
+
+### Mk:api(endpoint params)
+Misskey APIにリクエストします。第一引数にエンドポイント名、第二引数にパラメータオブジェクトを渡します。
+
+### Mk:save(key value)
+任意の値に任意の名前を付けて永続化します。永続化した値は、AiScriptコンテキストが終了しても残り、Mk:loadで読み取ることができます。
+
+### Mk:load(key)
+Mk:saveで永続化した指定の名前の値を読み取ります。
+
+### Plugin:register_post_form_action(title fn)
+投稿フォームにアクションを追加します。第一引数にアクション名、第二引数にアクションが選択された際のコールバック関数を渡します。 コールバック関数には、第一引数に投稿フォームオブジェクトが渡されます。
+
+### Plugin:register_note_action(title fn)
+ノートメニューに項目を追加します。第一引数に項目名、第二引数に項目が選択された際のコールバック関数を渡します。 コールバック関数には、第一引数に対象のノートオブジェクトが渡されます。
+
+### Plugin:register_user_action(title fn)
+ユーザーメニューに項目を追加します。第一引数に項目名、第二引数に項目が選択された際のコールバック関数を渡します。 コールバック関数には、第一引数に対象のユーザーオブジェクトが渡されます。
+
+### Plugin:register_note_view_interruptor(fn)
+UIに表示されるノート情報を書き換えます。 コールバック関数には、第一引数に対象のノートオブジェクトが渡されます。 コールバック関数の返り値でノートが書き換えられます。
+
+### Plugin:register_note_post_interruptor(fn)
+ノート投稿時にノート情報を書き換えます。 コールバック関数には、第一引数に対象のノートオブジェクトが渡されます。 コールバック関数の返り値でノートが書き換えられます。
+
+### Plugin:open_url(url)
+第一引数に渡されたURLをブラウザの新しいタブで開きます。
+
+### Plugin:config
+プラグインの設定が格納されるオブジェクト。プラグイン定義のconfigで設定したキーで値が入ります。
diff --git a/src/docs/nl-NL/custom-emoji.md b/src/docs/nl-NL/custom-emoji.md
new file mode 100644
index 0000000000..ed2e92be16
--- /dev/null
+++ b/src/docs/nl-NL/custom-emoji.md
@@ -0,0 +1,2 @@
+# カスタム絵文字
+カスタム絵文字は、インスタンスで用意された画像を絵文字のように使える機能です。 ノート、リアクション、チャット、自己紹介、名前などの場所で使うことができます。 カスタム絵文字をそれらの場所で使うには、絵文字ピッカーボタン(ある場合)を押すか、`:`を入力して絵文字サジェストを表示します。 テキスト内に`:foo:`のような形式の文字列が見つかると、`foo`の部分がカスタム絵文字名と解釈され、表示時には対応したカスタム絵文字に置き換わります。
diff --git a/src/docs/nl-NL/deck.md b/src/docs/nl-NL/deck.md
new file mode 100644
index 0000000000..8057e262fd
--- /dev/null
+++ b/src/docs/nl-NL/deck.md
@@ -0,0 +1,18 @@
+# デッキ
+
+デッキは利用可能なUIのひとつです。「カラム」と呼ばれるビューを複数並べて表示させることで、カスタマイズ性が高く、情報量の多いUIが構築できることが特徴です。
+
+## カラムの追加
+デッキの背景を右クリックし、「カラムを追加」して任意のカラムを追加できます。
+
+## カラムの移動
+カラムは、ドラッグアンドドロップで他のカラムと位置を入れ替えることが出来るほか、カラムメニュー(カラムのヘッダー右クリック)から位置を移動させることもできます。
+
+## カラムの水平分割
+カラムは左右だけでなく、上下に並べることもできます。 カラムメニューを開き、「左に重ねる」を選択すると、左のカラムの下に現在のカラムが移動します。 上下分割を解除するには、カラムメニューの「右に出す」を選択します。
+
+## カラムの設定
+カラムメニューの「編集」を選択するとカラムの設定を編集できます。カラムの名前を変えたり、幅を変えたりできます。
+
+## デッキの設定
+デッキに関する設定は、[settings/deck](/settings/deck)で行えます。
diff --git a/src/docs/nl-NL/follow.md b/src/docs/nl-NL/follow.md
new file mode 100644
index 0000000000..3c1ea7bbe0
--- /dev/null
+++ b/src/docs/nl-NL/follow.md
@@ -0,0 +1,2 @@
+# フォロー
+ユーザーをフォローすると、タイムラインにそのユーザーの投稿が表示されるようになります。ただし、他のユーザーに対する返信は含まれません。 ユーザーをフォローするには、ユーザーページの「フォロー」ボタンをクリックします。フォローを解除するには、もう一度クリックします。
diff --git a/src/docs/nl-NL/keyboard-shortcut.md b/src/docs/nl-NL/keyboard-shortcut.md
new file mode 100644
index 0000000000..957ca838c9
--- /dev/null
+++ b/src/docs/nl-NL/keyboard-shortcut.md
@@ -0,0 +1,68 @@
+# キーボードショートカット
+
+## グローバル
+これらのショートカットは基本的にどこでも使えます。
+<table>
+ <thead>
+ <tr><th>ショートカット</th><th>効果</th><th>由来</th></tr>
+ </thead>
+ <tbody>
+ <tr><td><kbd class="key">P</kbd>, <kbd class="key">N</kbd></td><td>新規投稿</td><td><b>P</b>ost, <b>N</b>ew, <b>N</b>ote</td></tr>
+ <tr><td><kbd class="key">T</kbd></td><td>タイムラインの最も新しい投稿にフォーカス</td><td><b>T</b>imeline, <b>T</b>op</td></tr>
+ <tr><td><kbd class="group"><kbd class="key">Shift</kbd> + <kbd class="key">N</kbd></kbd></td><td>通知を表示/隠す</td><td><b>N</b>otifications</td></tr>
+ <tr><td><kbd class="key">S</kbd></td><td>検索</td><td><b>S</b>earch</td></tr>
+ <tr><td><kbd class="key">H</kbd>, <kbd class="key">?</kbd></td><td>ヘルプを表示</td><td><b>H</b>elp</td></tr>
+ </tbody>
+</table>
+
+## 投稿にフォーカスされた状態
+
+<table>
+ <thead>
+ <tr><th>ショートカット</th><th>効果</th><th>由来</th></tr>
+ </thead>
+ <tbody>
+ <tr><td><kbd class="key">↑</kbd>, <kbd class="key">K</kbd>, <kbd class="group"><kbd class="key">Shift</kbd> + <kbd class="key">Tab</kbd></kbd></td><td>上の投稿にフォーカスを移動</td><td>-</td></tr>
+ <tr><td><kbd class="key">↓</kbd>, <kbd class="key">J</kbd>, <kbd class="key">Tab</kbd></td><td>下の投稿にフォーカスを移動</td><td>-</td></tr>
+ <tr><td><kbd class="key">R</kbd></td><td>返信フォームを開く</td><td><b>R</b>eply</td></tr>
+ <tr><td><kbd class="key">Q</kbd></td><td>Renoteフォームを開く</td><td><b>Q</b>uote</td></tr>
+ <tr><td><kbd class="group"><kbd class="key">Ctrl</kbd> + <kbd class="key">Q</kbd></kbd></td><td>即刻Renoteする(フォームを開かずに)</td><td>-</td></tr>
+ <tr><td><kbd class="key">E</kbd>, <kbd class="key">A</kbd>, <kbd class="key">+</kbd></td><td>リアクションフォームを開く</td><td><b>E</b>mote, re<b>A</b>ction</td></tr>
+ <tr><td><kbd class="key">0</kbd>~<kbd class="key">9</kbd></td><td>数字に対応したリアクションをする(対応については後述)</td><td>-</td></tr>
+ <tr><td><kbd class="key">F</kbd>, <kbd class="key">B</kbd></td><td>お気に入りに登録</td><td><b>F</b>avorite, <b>B</b>ookmark</td></tr>
+ <tr><td><kbd class="key">Del</kbd>, <kbd class="group"><kbd class="key">Ctrl</kbd> + <kbd class="key">D</kbd></kbd></td><td>投稿を削除</td><td><b>D</b>elete</tr>
+ <tr><td><kbd class="key">M</kbd>, <kbd class="key">O</kbd></td><td>投稿に対するメニューを開く</td><td><b>M</b>ore, <b>O</b>ther</td></tr>
+ <tr><td><kbd class="key">S</kbd></td><td>CWで隠された部分を表示 or 隠す</td><td><b>S</b>how, <b>S</b>ee</td></tr>
+ <tr><td><kbd class="key">Esc</kbd></td><td>フォーカスを外す</td><td>-</td></tr>
+ </tbody>
+</table>
+
+## Renoteフォーム
+
+<table>
+ <thead>
+ <tr><th>ショートカット</th><th>効果</th><th>由来</th></tr>
+ </thead>
+ <tbody>
+ <tr><td><kbd class="key">Enter</kbd></td><td>Renoteする</td><td>-</td></tr>
+ <tr><td><kbd class="key">Q</kbd></td><td>フォームを展開する</td><td><b>Q</b>uote</td></tr>
+ <tr><td><kbd class="key">Esc</kbd></td><td>フォームを閉じる</td><td>-</td></tr>
+ </tbody>
+</table>
+
+## リアクションフォーム
+デフォルトで「👍」にフォーカスが当たっている状態です。
+<table>
+ <thead>
+ <tr><th>ショートカット</th><th>効果</th><th>由来</th></tr>
+ </thead>
+ <tbody>
+ <tr><td><kbd class="key">↑</kbd>, <kbd class="key">K</kbd></td><td>上のリアクションにフォーカスを移動</td><td>-</td></tr>
+ <tr><td><kbd class="key">↓</kbd>, <kbd class="key">J</kbd></td><td>下のリアクションにフォーカスを移動</td><td>-</td></tr>
+ <tr><td><kbd class="key">←</kbd>, <kbd class="key">H</kbd>, <kbd class="group"><kbd class="key">Shift</kbd> + <kbd class="key">Tab</kbd></kbd></td><td>左のリアクションにフォーカスを移動</td><td>-</td></tr>
+ <tr><td><kbd class="key">→</kbd>, <kbd class="key">L</kbd>, <kbd class="key">Tab</kbd></td><td>右のリアクションにフォーカスを移動</td><td>-</td></tr>
+ <tr><td><kbd class="key">Enter</kbd>, <kbd class="key">Space</kbd>, <kbd class="key">+</kbd></td><td>リアクション確定</td><td>-</td></tr>
+ <tr><td><kbd class="key">0</kbd>~<kbd class="key">9</kbd></td><td>数字に対応したリアクションで確定</td><td>-</td></tr>
+ <tr><td><kbd class="key">Esc</kbd></td><td>リアクションするのをやめる</td><td>-</td></tr>
+ </tbody>
+</table>
diff --git a/src/docs/nl-NL/mfm.md b/src/docs/nl-NL/mfm.md
new file mode 100644
index 0000000000..e237287acc
--- /dev/null
+++ b/src/docs/nl-NL/mfm.md
@@ -0,0 +1,2 @@
+# MFM
+MFMは、Misskey Flavored Markdownの略で、Misskeyの様々な場所で使用できる専用のマークアップ言語です。 MFMで使用可能な構文は[MFMチートシート](/mfm-cheat-sheet)で確認できます。
diff --git a/src/docs/nl-NL/mute.md b/src/docs/nl-NL/mute.md
new file mode 100644
index 0000000000..6a9608662a
--- /dev/null
+++ b/src/docs/nl-NL/mute.md
@@ -0,0 +1,13 @@
+# ミュート
+
+ユーザーをミュートすると、そのユーザーに関する次のコンテンツがMisskeyに表示されなくなります:
+
+* タイムラインや投稿の検索結果内の、そのユーザーの投稿(およびそれらの投稿に対する返信やRenote)
+* そのユーザーからの通知
+* メッセージ履歴一覧内の、そのユーザーとのメッセージ履歴
+
+ユーザーをミュートするには、対象のユーザーのユーザーページに表示されている「ミュート」ボタンを押します。
+
+ミュートを行ったことは相手に通知されず、ミュートされていることを知ることもできません。
+
+設定>ミュート から、自分がミュートしているユーザー一覧を確認することができます。
diff --git a/src/docs/nl-NL/pages.md b/src/docs/nl-NL/pages.md
new file mode 100644
index 0000000000..a7311b95e6
--- /dev/null
+++ b/src/docs/nl-NL/pages.md
@@ -0,0 +1,10 @@
+# Pages
+
+## 変数
+変数を使うことで動的なページを作成できます。テキスト内で <b>{ 変数名 }</b> と書くとそこに変数の値を埋め込めます。例えば <b>Hello { thing } world!</b> というテキストで、変数(thing)の値が <b>ai</b> だった場合、テキストは <b>Hello ai world!</b> になります。
+
+変数の評価(値を算出すること)は上から下に行われるので、ある変数の中で自分より下の変数を参照することはできません。例えば上から <b>A、B、C</b> と3つの変数を定義したとき、<b>C</b>の中で<b>A</b>や<b>B</b>を参照することはできますが、<b>A</b>の中で<b>B</b>や<b>C</b>を参照することはできません。
+
+ユーザーからの入力を受け取るには、ページに「ユーザー入力」ブロックを設置し、「変数名」に入力を格納したい変数名を設定します(変数は自動で作成されます)。その変数を使ってユーザー入力に応じた動作を行えます。
+
+関数を使うと、値の算出処理を再利用可能な形にまとめることができます。関数を作るには、「関数」タイプの変数を作成します。関数にはスロット(引数)を設定することができ、スロットの値は関数内で変数として利用可能です。また、関数を引数に取る関数(高階関数と呼ばれます)も存在します。関数は予め定義しておくほかに、このような高階関数のスロットに即席でセットすることもできます。
diff --git a/src/docs/nl-NL/reaction.md b/src/docs/nl-NL/reaction.md
new file mode 100644
index 0000000000..c26ead75b3
--- /dev/null
+++ b/src/docs/nl-NL/reaction.md
@@ -0,0 +1,11 @@
+# リアクション
+他の人のノートに、絵文字を付けて簡単にあなたの反応を伝えられる機能です。 リアクションするには、ノートの + アイコンをクリックしてピッカーを表示し、絵文字を選択します。 リアクションには[カスタム絵文字](./custom-emoji)も使用できます。
+
+## リアクションピッカーのカスタマイズ
+ピッカーに表示される絵文字を自分好みにカスタマイズすることができます。 設定の「リアクション」で設定します。
+
+## リモート投稿へのリアクションについて
+リアクションはMisskeyオリジナルの機能であるため、リモートインスタンスがMisskeyでない限りは、ほとんどの場合「Like」としてアクティビティが送信されます。一般的にはLikeは「お気に入り」として実装されているようです。 また、相手がMisskeyであったとしても、カスタム絵文字リアクションは伝わらず、自動的に「👍」等にフォールバックされます。
+
+## リモートからのリアクションについて
+リモートから「Like」アクティビティを受信したとき、Misskeyでは「👍」のリアクションとして解釈されます。
diff --git a/src/docs/nl-NL/reversi-bot.md b/src/docs/nl-NL/reversi-bot.md
new file mode 100644
index 0000000000..7ab2a7212e
--- /dev/null
+++ b/src/docs/nl-NL/reversi-bot.md
@@ -0,0 +1,160 @@
+# MisskeyリバーシBotの開発
+Misskeyのリバーシ機能に対応したBotの開発方法をここに記します。
+
+1. `games/reversi`ストリームに以下のパラメータを付けて接続する:
+ * `i`: botアカウントのAPIキー
+
+2. 対局への招待が来たら、ストリームから`invited`イベントが流れてくる
+ * イベントの中身に、`parent`という名前で対局へ誘ってきたユーザーの情報が含まれている
+
+3. `games/reversi/match`へ、`user_id`として`parent`の`id`が含まれたリクエストを送信する
+
+4. 上手くいくとゲーム情報が返ってくるので、`games/reversi-game`ストリームへ、以下のパラメータを付けて接続する:
+ * `i`: botアカウントのAPIキー
+ * `game`: `game`の`id`
+
+5. この間、相手がゲームの設定を変更するとその都度`update-settings`イベントが流れてくるので、必要であれば何かしらの処理を行う
+
+6. 設定に満足したら、`{ type: 'accept' }`メッセージをストリームに送信する
+
+7. ゲームが開始すると、`started`イベントが流れてくる
+ * イベントの中身にはゲーム情報が含まれている
+
+8. 石を打つには、ストリームに`{ type: 'set', pos: <位置> }`を送信する(位置の計算方法は後述)
+
+9. 相手または自分が石を打つと、ストリームから`set`イベントが流れてくる
+ * `color`として石の色が含まれている
+ * `pos`として位置情報が含まれている
+
+## 位置の計算法
+8x8のマップを考える場合、各マスの位置(インデックスと呼びます)は次のようになっています:
+```
++--+--+--+--+--+--+--+--+
+| 0| 1| 2| 3| 4| 5| 6| 7|
++--+--+--+--+--+--+--+--+
+| 8| 9|10|11|12|13|14|15|
++--+--+--+--+--+--+--+--+
+|16|17|18|19|20|21|22|23|
+...
+```
+
+### X,Y座標 から インデックス に変換する
+```
+pos = x + (y * mapWidth)
+```
+`mapWidth`は、ゲーム情報の`map`から、次のようにして計算できます:
+```
+mapWidth = map[0].length
+```
+
+### インデックス から X,Y座標 に変換する
+```
+x = pos % mapWidth
+y = Math.floor(pos / mapWidth)
+```
+
+## マップ情報
+マップ情報は、ゲーム情報の`map`に入っています。 文字列の配列になっており、ひとつひとつの文字がマス情報を表しています。 それをもとにマップのデザインを知る事が出来ます:
+* `(スペース)` ... マス無し
+* `-` ... マス
+* `b` ... 初期配置される黒石
+* `w` ... 初期配置される白石
+
+例えば、4*4の次のような単純なマップがあるとします:
+```text
++---+---+---+---+
+| | | | |
++---+---+---+---+
+| | ○ | ● | |
++---+---+---+---+
+| | ● | ○ | |
++---+---+---+---+
+| | | | |
++---+---+---+---+
+```
+
+この場合、マップデータはこのようになります:
+```javascript
+['----', '-wb-', '-bw-', '----']
+```
+
+## ユーザーにフォームを提示して対話可能Botを作成する
+ユーザーとのコミュニケーションを行うため、ゲームの設定画面でユーザーにフォームを提示することができます。 例えば、Botの強さをユーザーが設定できるようにする、といったシナリオが考えられます。
+
+フォームを提示するには、`reversi-game`ストリームに次のメッセージを送信します:
+```javascript
+{
+ type: 'init-form',
+ body: [フォームコントロールの配列]
+}
+```
+
+フォームコントロールの配列については今から説明します。 フォームコントロールは、次のようなオブジェクトです:
+```javascript
+{
+ id: 'switch1',
+ type: 'switch',
+ label: 'Enable hoge',
+ value: false
+}
+```
+`id` ... コントロールのID。 `type` ... コントロールの種類。後述します。 `label` ... コントロールと一緒に表記するテキスト。 `value` ... コントロールのデフォルト値。
+
+### フォームの操作を受け取る
+ユーザーがフォームを操作すると、ストリームから`update-form`イベントが流れてきます。 イベントの中身には、コントロールのIDと、ユーザーが設定した値が含まれています。 例えば、上で示したスイッチをユーザーがオンにしたとすると、次のイベントが流れてきます:
+```javascript
+{
+ id: 'switch1',
+ value: true
+}
+```
+
+### フォームコントロールの種類
+#### スイッチ
+type: `switch` スイッチを表示します。何かの機能をオン/オフさせたい場合に有用です。
+
+##### プロパティ
+`label` ... スイッチに表記するテキスト。
+
+#### ラジオボタン
+type: `radio` ラジオボタンを表示します。選択肢を提示するのに有用です。例えば、Botの強さを設定させるなどです。
+
+##### プロパティ
+`items` ... ラジオボタンの選択肢。例:
+```javascript
+items: [{
+ label: '弱',
+ value: 1
+}, {
+ label: '中',
+ value: 2
+}, {
+ label: '強',
+ value: 3
+}]
+```
+
+#### スライダー
+type: `slider` スライダーを表示します。
+
+##### プロパティ
+`min` ... スライダーの下限。 `max` ... スライダーの上限。 `step` ... 入力欄で刻むステップ値。
+
+#### テキストボックス
+type: `textbox` テキストボックスを表示します。ユーザーになにか入力させる一般的な用途に利用できます。
+
+## ユーザーにメッセージを表示する
+設定画面でユーザーと対話する、フォーム以外のもうひとつの方法がこれです。ユーザーになにかメッセージを表示することができます。 例えば、ユーザーがBotの対応していないモードやマップを選択したとき、警告を表示するなどです。 メッセージを表示するには、次のメッセージをストリームに送信します:
+```javascript
+{
+ type: 'message',
+ body: {
+ text: 'メッセージ内容',
+ type: 'メッセージの種類'
+ }
+}
+```
+メッセージの種類: `success`, `info`, `warning`, `error`。
+
+## 投了する
+投了をするには、<a href="./api/endpoints/games/reversi/games/surrender">このエンドポイント</a>にリクエストします。
diff --git a/src/docs/nl-NL/stream.md b/src/docs/nl-NL/stream.md
new file mode 100644
index 0000000000..9011c37c5b
--- /dev/null
+++ b/src/docs/nl-NL/stream.md
@@ -0,0 +1,354 @@
+# ストリーミングAPI
+
+ストリーミングAPIを使うと、リアルタイムで様々な情報(例えばタイムラインに新しい投稿が流れてきた、メッセージが届いた、フォローされた、など)を受け取ったり、様々な操作を行ったりすることができます。
+
+## ストリームに接続する
+
+ストリーミングAPIを利用するには、まずMisskeyサーバーに**websocket**接続する必要があります。
+
+以下のURLに、`i`というパラメータ名で認証情報を含めて、websocket接続してください。例:
+```
+%WS_URL%/streaming?i=xxxxxxxxxxxxxxx
+```
+
+認証情報は、自分のAPIキーや、アプリケーションからストリームに接続する際はユーザーのアクセストークンのことを指します。
+
+<div class="ui info">
+ <p><i class="fas fa-info-circle"></i> 認証情報の取得については、<a href="./api">こちらのドキュメント</a>をご確認ください。</p>
+</div>
+
+---
+
+認証情報は省略することもできますが、その場合非ログインでの利用ということになり、受信できる情報や可能な操作は限られます。例:
+
+```
+%WS_URL%/streaming
+```
+
+---
+
+ストリームに接続すると、後述するAPI操作や、投稿の購読を行ったりすることができます。 しかしまだこの段階では、例えばタイムラインへの新しい投稿を受信したりすることはできません。 それを行うには、ストリーム上で、後述する**チャンネル**に接続する必要があります。
+
+**ストリームでのやり取りはすべてJSONです。**
+
+## チャンネル
+MisskeyのストリーミングAPIにはチャンネルという概念があります。これは、送受信する情報を分離するための仕組みです。 Misskeyのストリームに接続しただけでは、まだリアルタイムでタイムラインの投稿を受信したりはできません。 ストリーム上でチャンネルに接続することで、様々な情報を受け取ったり情報を送信したりすることができるようになります。
+
+### チャンネルに接続する
+チャンネルに接続するには、次のようなデータをJSONでストリームに送信します:
+
+```json
+{
+ type: 'connect',
+ body: {
+ channel: 'xxxxxxxx',
+ id: 'foobar',
+ params: {
+ ...
+ }
+ }
+}
+```
+
+ここで、
+* `channel`には接続したいチャンネル名を設定します。チャンネルの種類については後述します。
+* `id`にはそのチャンネルとやり取りするための任意のIDを設定します。ストリームでは様々なメッセージが流れるので、そのメッセージがどのチャンネルからのものなのか識別する必要があるからです。このIDは、UUIDや、乱数のようなもので構いません。
+* `params`はチャンネルに接続する際のパラメータです。チャンネルによって接続時に必要とされるパラメータは異なります。パラメータ不要のチャンネルに接続する際は、このプロパティは省略可能です。
+
+<div class="ui info">
+ <p><i class="fas fa-info-circle"></i> IDはチャンネルごとではなく「チャンネルの接続ごと」です。なぜなら、同じチャンネルに異なるパラメータで複数接続するケースもあるからです。</p>
+</div>
+
+### チャンネルからのメッセージを受け取る
+例えばタイムラインのチャンネルなら、新しい投稿があった時にメッセージを発します。そのメッセージを受け取ることで、タイムラインに新しい投稿がされたことをリアルタイムで知ることができます。
+
+チャンネルがメッセージを発すると、次のようなデータがJSONでストリームに流れてきます:
+```json
+{
+ type: 'channel',
+ body: {
+ id: 'foobar',
+ type: 'something',
+ body: {
+ some: 'thing'
+ }
+ }
+}
+```
+
+ここで、
+* `id`には前述したそのチャンネルに接続する際に設定したIDが設定されています。これで、このメッセージがどのチャンネルからのものなのか知ることができます。
+* `type`にはメッセージの種類が設定されます。チャンネルによって、どのような種類のメッセージが流れてくるかは異なります。
+* `body`にはメッセージの内容が設定されます。チャンネルによって、どのような内容のメッセージが流れてくるかは異なります。
+
+### チャンネルに向けてメッセージを送信する
+チャンネルによっては、メッセージを受け取るだけでなく、こちらから何かメッセージを送信し、何らかの操作を行える場合があります。
+
+チャンネルにメッセージを送信するには、次のようなデータをJSONでストリームに送信します:
+```json
+{
+ type: 'channel',
+ body: {
+ id: 'foobar',
+ type: 'something',
+ body: {
+ some: 'thing'
+ }
+ }
+}
+```
+
+ここで、
+* `id`には前述したそのチャンネルに接続する際に設定したIDを設定します。これで、このメッセージがどのチャンネルに向けたものなのか識別させることができます。
+* `type`にはメッセージの種類を設定します。チャンネルによって、どのような種類のメッセージを受け付けるかは異なります。
+* `body`にはメッセージの内容を設定します。チャンネルによって、どのような内容のメッセージを受け付けるかは異なります。
+
+### チャンネルから切断する
+チャンネルから切断するには、次のようなデータをJSONでストリームに送信します:
+
+```json
+{
+ type: 'disconnect',
+ body: {
+ id: 'foobar'
+ }
+}
+```
+
+ここで、
+* `id`には前述したそのチャンネルに接続する際に設定したIDを設定します。
+
+## ストリームを経由してAPIリクエストする
+
+ストリームを経由してAPIリクエストすると、HTTPリクエストを発生させずにAPIを利用できます。そのため、コードを簡潔にできたり、パフォーマンスの向上を見込めるかもしれません。
+
+ストリームを経由してAPIリクエストするには、次のようなデータをJSONでストリームに送信します:
+```json
+{
+ type: 'api',
+ body: {
+ id: 'xxxxxxxxxxxxxxxx',
+ endpoint: 'notes/create',
+ data: {
+ text: 'yee haw!'
+ }
+ }
+}
+```
+
+ここで、
+* `id`には、APIのレスポンスを識別するための、APIリクエストごとの一意なIDを設定する必要があります。UUIDや、簡単な乱数のようなもので構いません。
+* `endpoint`には、あなたがリクエストしたいAPIのエンドポイントを指定します。
+* `data`には、エンドポイントのパラメータを含めます。
+
+<div class="ui info">
+ <p><i class="fas fa-info-circle"></i> APIのエンドポイントやパラメータについてはAPIリファレンスをご確認ください。</p>
+</div>
+
+### レスポンスの受信
+
+APIへリクエストすると、レスポンスがストリームから次のような形式で流れてきます。
+
+```json
+{
+ type: 'api:xxxxxxxxxxxxxxxx',
+ body: {
+ ...
+ }
+}
+```
+
+ここで、
+* `xxxxxxxxxxxxxxxx`の部分には、リクエストの際に設定された`id`が含まれています。これにより、どのリクエストに対するレスポンスなのか判別することができます。
+* `body`には、レスポンスが含まれています。
+
+## 投稿のキャプチャ
+
+Misskeyは投稿のキャプチャと呼ばれる仕組みを提供しています。これは、指定した投稿のイベントをストリームで受け取る機能です。
+
+例えばタイムラインを取得してユーザーに表示したとします。ここで誰かがそのタイムラインに含まれるどれかの投稿に対してリアクションしたとします。
+
+しかし、クライアントからするとある投稿にリアクションが付いたことなどは知る由がないため、リアルタイムでリアクションをタイムライン上の投稿に反映して表示するといったことができません。
+
+この問題を解決するために、Misskeyは投稿のキャプチャ機構を用意しています。投稿をキャプチャすると、その投稿に関するイベントを受け取ることができるため、リアルタイムでリアクションを反映させたりすることが可能になります。
+
+### 投稿をキャプチャする
+
+投稿をキャプチャするには、ストリームに次のようなメッセージを送信します:
+
+```json
+{
+ type: 'subNote',
+ body: {
+ id: 'xxxxxxxxxxxxxxxx'
+ }
+}
+```
+
+ここで、
+* `id`にキャプチャしたい投稿の`id`を設定します。
+
+このメッセージを送信すると、Misskeyにキャプチャを要請したことになり、以後、その投稿に関するイベントが流れてくるようになります。
+
+例えば投稿にリアクションが付いたとすると、次のようなメッセージが流れてきます:
+
+```json
+{
+ type: 'noteUpdated',
+ body: {
+ id: 'xxxxxxxxxxxxxxxx',
+ type: 'reacted',
+ body: {
+ reaction: 'like',
+ userId: 'yyyyyyyyyyyyyyyy'
+ }
+ }
+}
+```
+
+ここで、
+* `body`内の`id`に、イベントを発生させた投稿のIDが設定されます。
+* `body`内の`type`に、イベントの種類が設定されます。
+* `body`内の`body`に、イベントの詳細が設定されます。
+
+#### イベントの種類
+
+##### `reacted`
+その投稿にリアクションがされた時に発生します。
+
+* `reaction`に、リアクションの種類が設定されます。
+* `userId`に、リアクションを行ったユーザーのIDが設定されます。
+
+例:
+```json
+{
+ type: 'noteUpdated',
+ body: {
+ id: 'xxxxxxxxxxxxxxxx',
+ type: 'reacted',
+ body: {
+ reaction: 'like',
+ userId: 'yyyyyyyyyyyyyyyy'
+ }
+ }
+}
+```
+
+##### `deleted`
+その投稿が削除された時に発生します。
+
+* `deletedAt`に、削除日時が設定されます。
+
+例:
+```json
+{
+ type: 'noteUpdated',
+ body: {
+ id: 'xxxxxxxxxxxxxxxx',
+ type: 'deleted',
+ body: {
+ deletedAt: '2018-10-22T02:17:09.703Z'
+ }
+ }
+}
+```
+
+##### `pollVoted`
+その投稿に添付されたアンケートに投票された時に発生します。
+
+* `choice`に、選択肢IDが設定されます。
+* `userId`に、投票を行ったユーザーのIDが設定されます。
+
+例:
+```json
+{
+ type: 'noteUpdated',
+ body: {
+ id: 'xxxxxxxxxxxxxxxx',
+ type: 'pollVoted',
+ body: {
+ choice: 2,
+ userId: 'yyyyyyyyyyyyyyyy'
+ }
+ }
+}
+```
+
+### 投稿のキャプチャを解除する
+
+その投稿がもう画面に表示されなくなったりして、その投稿に関するイベントをもう受け取る必要がなくなったときは、キャプチャの解除を申請してください。
+
+次のメッセージを送信します:
+
+```json
+{
+ type: 'unsubNote',
+ body: {
+ id: 'xxxxxxxxxxxxxxxx'
+ }
+}
+```
+
+ここで、
+* `id`にキャプチャを解除したい投稿の`id`を設定します。
+
+このメッセージを送信すると、以後、その投稿に関するイベントは流れてこないようになります。
+
+# チャンネル一覧
+## `main`
+アカウントに関する基本的な情報が流れてきます。このチャンネルにパラメータはありません。
+
+### 流れてくるイベント一覧
+
+#### `renote`
+自分の投稿がRenoteされた時に発生するイベントです。自分自身の投稿をRenoteしたときは発生しません。
+
+#### `mention`
+誰かからメンションされたときに発生するイベントです。
+
+#### `readAllNotifications`
+自分宛ての通知がすべて既読になったことを表すイベントです。このイベントを利用して、「通知があることを示すアイコン」のようなものをオフにしたりする等のケースが想定されます。
+
+#### `meUpdated`
+自分の情報が更新されたことを表すイベントです。
+
+#### `follow`
+自分が誰かをフォローしたときに発生するイベントです。
+
+#### `unfollow`
+自分が誰かのフォローを解除したときに発生するイベントです。
+
+#### `followed`
+自分が誰かにフォローされたときに発生するイベントです。
+
+## `homeTimeline`
+ホームタイムラインの投稿情報が流れてきます。このチャンネルにパラメータはありません。
+
+### 流れてくるイベント一覧
+
+#### `note`
+タイムラインに新しい投稿が流れてきたときに発生するイベントです。
+
+## `localTimeline`
+ローカルタイムラインの投稿情報が流れてきます。このチャンネルにパラメータはありません。
+
+### 流れてくるイベント一覧
+
+#### `note`
+ローカルタイムラインに新しい投稿が流れてきたときに発生するイベントです。
+
+## `hybridTimeline`
+ソーシャルタイムラインの投稿情報が流れてきます。このチャンネルにパラメータはありません。
+
+### 流れてくるイベント一覧
+
+#### `note`
+ソーシャルタイムラインに新しい投稿が流れてきたときに発生するイベントです。
+
+## `globalTimeline`
+グローバルタイムラインの投稿情報が流れてきます。このチャンネルにパラメータはありません。
+
+### 流れてくるイベント一覧
+
+#### `note`
+グローバルタイムラインに新しい投稿が流れてきたときに発生するイベントです。
diff --git a/src/docs/nl-NL/theme.md b/src/docs/nl-NL/theme.md
new file mode 100644
index 0000000000..4e52ee8cd7
--- /dev/null
+++ b/src/docs/nl-NL/theme.md
@@ -0,0 +1,68 @@
+# テーマ
+
+テーマを設定して、Misskeyクライアントの見た目を変更できます。
+
+## テーマの設定
+設定 > テーマ
+
+## テーマを作成する
+テーマコードはJSON5で記述されたテーマオブジェクトです。 テーマは以下のようなオブジェクトです。
+``` js
+{
+ id: '17587283-dd92-4a2c-a22c-be0637c9e22a',
+
+ name: 'Danboard',
+ author: 'syuilo',
+
+ base: 'light',
+
+ props: {
+ accent: 'rgb(218, 141, 49)',
+ bg: 'rgb(218, 212, 190)',
+ fg: 'rgb(115, 108, 92)',
+ panel: 'rgb(236, 232, 220)',
+ renote: 'rgb(100, 152, 106)',
+ link: 'rgb(100, 152, 106)',
+ mention: '@accent',
+ hashtag: 'rgb(100, 152, 106)',
+ header: 'rgba(239, 227, 213, 0.75)',
+ navBg: 'rgb(216, 206, 182)',
+ inputBorder: 'rgba(0, 0, 0, 0.1)',
+ },
+}
+
+```
+
+* `id` ... テーマの一意なID。UUIDをおすすめします。
+* `name` ... テーマ名
+* `author` ... テーマの作者
+* `desc` ... テーマの説明(オプション)
+* `base` ... 明るいテーマか、暗いテーマか
+ * `light`にすると明るいテーマになり、`dark`にすると暗いテーマになります。
+ * テーマはここで設定されたベーステーマを継承します。
+* `props` ... テーマのスタイル定義。これから説明します。
+
+### テーマのスタイル定義
+`props`下にはテーマのスタイルを定義します。 キーがCSSの変数名になり、バリューで中身を指定します。 なお、この`props`オブジェクトはベーステーマから継承されます。 ベーステーマは、このテーマの`base`が`light`なら[_light.json5](https://github.com/syuilo/misskey/blob/develop/src/client/themes/_light.json5)で、`dark`なら[_dark.json5](https://github.com/syuilo/misskey/blob/develop/src/client/themes/_dark.json5)です。 つまり、このテーマ内の`props`に`panel`というキーが無くても、そこにはベーステーマの`panel`があると見なされます。
+
+#### バリューで使える構文
+* 16進数で表された色
+ * 例: `#00ff00`
+* `rgb(r, g, b)`形式で表された色
+ * 例: `rgb(0, 255, 0)`
+* `rgb(r, g, b, a)`形式で表された透明度を含む色
+ * 例: `rgba(0, 255, 0, 0.5)`
+* 他のキーの値の参照
+ * `@{キー名}`と書くと他のキーの値の参照になります。`{キー名}`は参照したいキーの名前に置き換えます。
+ * 例: `@panel`
+* 定数(後述)の参照
+ * `${定数名}`と書くと定数の参照になります。`{定数名}`は参照したい定数の名前に置き換えます。
+ * 例: `$main`
+* 関数(後述)
+ * `:{関数名}<{引数}<{色}`
+
+#### 定数
+「CSS変数として出力はしたくないが、他のCSS変数の値として使いまわしたい」値があるときは、定数を使うと便利です。 キー名を`$`で始めると、そのキーはCSS変数として出力されません。
+
+#### 関数
+wip
diff --git a/src/docs/nl-NL/timelines.md b/src/docs/nl-NL/timelines.md
new file mode 100644
index 0000000000..36ba61bd2d
--- /dev/null
+++ b/src/docs/nl-NL/timelines.md
@@ -0,0 +1,15 @@
+# タイムラインの比較
+
+https://docs.google.com/spreadsheets/d/1lxQ2ugKrhz58Bg96HTDK_2F98BUritkMyIiBkOByjHA/edit?usp=sharing
+
+## ホーム
+自分のフォローしているユーザーの投稿
+
+## ローカル
+全てのローカルユーザーの「ホーム」指定されていない投稿
+
+## ソーシャル
+自分のフォローしているユーザーの投稿と、全てのローカルユーザーの「ホーム」指定されていない投稿
+
+## グローバル
+全てのローカルユーザーの「ホーム」指定されていない投稿と、サーバーに届いた全てのリモートユーザーの「ホーム」指定されていない投稿
diff --git a/src/docs/no-NO/aiscript.md b/src/docs/no-NO/aiscript.md
new file mode 100644
index 0000000000..6c28b446e3
--- /dev/null
+++ b/src/docs/no-NO/aiscript.md
@@ -0,0 +1,4 @@
+# AiScript
+
+## 関数
+デフォルトで値渡しです。
diff --git a/src/docs/no-NO/api.md b/src/docs/no-NO/api.md
new file mode 100644
index 0000000000..76019b6145
--- /dev/null
+++ b/src/docs/no-NO/api.md
@@ -0,0 +1,58 @@
+# Misskey API
+
+MisskeyAPIを使ってMisskeyクライアント、Misskey連携Webサービス、Bot等(以下「アプリケーション」と呼びます)を開発できます。 ストリーミングAPIもあるので、リアルタイム性のあるアプリケーションを作ることも可能です。
+
+APIを使い始めるには、まずアクセストークンを取得する必要があります。 このドキュメントでは、アクセストークンを取得する手順を説明した後、基本的なAPIの使い方を説明します。
+
+## アクセストークンの取得
+基本的に、APIはリクエストにはアクセストークンが必要となります。 APIにリクエストするのが自分自身なのか、不特定の利用者に使ってもらうアプリケーションなのかによって取得手順は異なります。
+
+* 前者の場合: [「自分自身のアクセストークンを手動発行する」](#自分自身のアクセストークンを手動発行する)に進む
+* 後者の場合: [「アプリケーション利用者にアクセストークンの発行をリクエストする」](#アプリケーション利用者にアクセストークンの発行をリクエストする)に進む
+
+### 自分自身のアクセストークンを手動発行する
+「設定 > API」で、自分のアクセストークンを発行できます。
+
+[「APIの使い方」へ進む](#APIの使い方)
+
+### アプリケーション利用者にアクセストークンの発行をリクエストする
+アプリケーション利用者のアクセストークンを取得するには、以下の手順で発行をリクエストします。
+
+#### Step 1
+
+UUIDを生成する。以後これをセッションIDと呼びます。
+
+> このセッションIDは毎回生成し、使いまわさないようにしてください。
+
+#### Step 2
+
+`{_URL_}/miauth/{session}`をユーザーのブラウザで表示させる。`{session}`の部分は、セッションIDに置き換えてください。
+> 例: `{_URL_}/miauth/c1f6d42b-468b-4fd2-8274-e58abdedef6f`
+
+表示する際、URLにクエリパラメータとしていくつかのオプションを設定できます:
+* `name` ... アプリケーション名
+ * > 例: `MissDeck`
+* `icon` ... アプリケーションのアイコン画像URL
+ * > 例: `https://missdeck.example.com/icon.png`
+* `callback` ... 認証が終わった後にリダイレクトするURL
+ * > 例: `https://missdeck.example.com/callback`
+ * リダイレクト時には、`session`というクエリパラメータでセッションIDが付きます
+* `permission` ... アプリケーションが要求する権限
+ * > 例: `write:notes,write:following,read:drive`
+ * 要求する権限を`,`で区切って列挙します
+ * どのような権限があるかは[APIリファレンス](/api-doc)で確認できます
+
+#### Step 3
+ユーザーが発行を許可した後、`{_URL_}/api/miauth/{session}/check`にPOSTリクエストすると、レスポンスとしてアクセストークンを含むJSONが返ります。
+
+レスポンスに含まれるプロパティ:
+* `token` ... ユーザーのアクセストークン
+* `user` ... ユーザーの情報
+
+[「APIの使い方」へ進む](#APIの使い方)
+
+## APIの使い方
+**APIはすべてPOSTで、リクエスト/レスポンスともにJSON形式です。RESTではありません。** アクセストークンは、`i`というパラメータ名でリクエストに含めます。
+
+* [APIリファレンス](/api-doc)
+* [ストリーミングAPI](./stream)
diff --git a/src/docs/no-NO/create-plugin.md b/src/docs/no-NO/create-plugin.md
new file mode 100644
index 0000000000..0d2fa19178
--- /dev/null
+++ b/src/docs/no-NO/create-plugin.md
@@ -0,0 +1,74 @@
+# プラグインの作成
+Misskey Webクライアントのプラグイン機能を使うと、クライアントを拡張し、様々な機能を追加できます。 ここではプラグインの作成にあたってのメタデータ定義や、AiScript APIリファレンスを掲載します。
+
+## メタデータ
+プラグインは、AiScriptのメタデータ埋め込み機能を使って、デフォルトとしてプラグインのメタデータを定義する必要があります。 メタデータは次のプロパティを含むオブジェクトです。
+
+### name
+プラグイン名
+
+### author
+プラグイン作者
+
+### version
+プラグインバージョン。数値を指定してください。
+
+### description
+プラグインの説明
+
+### permissions
+プラグインが要求する権限。MisskeyAPIにリクエストする際に用いられます。
+
+### config
+プラグインの設定情報を表すオブジェクト。 キーに設定名、値に以下のプロパティを含めます。
+
+#### type
+設定値の種類を表す文字列。以下から選択します。 string number boolean
+
+#### label
+ユーザーに表示する設定名
+
+#### description
+設定の説明
+
+#### default
+設定のデフォルト値
+
+## APIリファレンス
+AiScript標準で組み込まれているAPIは掲載しません。
+
+### Mk:dialog(title text type)
+ダイアログを表示します。typeには以下の値が設定できます。 info success warn error question 省略すると info になります。
+
+### Mk:confirm(title text type)
+確認ダイアログを表示します。typeには以下の値が設定できます。 info success warn error question 省略すると question になります。 ユーザーが"OK"を選択した場合は true を、"キャンセル"を選択した場合は false が返ります。
+
+### Mk:api(endpoint params)
+Misskey APIにリクエストします。第一引数にエンドポイント名、第二引数にパラメータオブジェクトを渡します。
+
+### Mk:save(key value)
+任意の値に任意の名前を付けて永続化します。永続化した値は、AiScriptコンテキストが終了しても残り、Mk:loadで読み取ることができます。
+
+### Mk:load(key)
+Mk:saveで永続化した指定の名前の値を読み取ります。
+
+### Plugin:register_post_form_action(title fn)
+投稿フォームにアクションを追加します。第一引数にアクション名、第二引数にアクションが選択された際のコールバック関数を渡します。 コールバック関数には、第一引数に投稿フォームオブジェクトが渡されます。
+
+### Plugin:register_note_action(title fn)
+ノートメニューに項目を追加します。第一引数に項目名、第二引数に項目が選択された際のコールバック関数を渡します。 コールバック関数には、第一引数に対象のノートオブジェクトが渡されます。
+
+### Plugin:register_user_action(title fn)
+ユーザーメニューに項目を追加します。第一引数に項目名、第二引数に項目が選択された際のコールバック関数を渡します。 コールバック関数には、第一引数に対象のユーザーオブジェクトが渡されます。
+
+### Plugin:register_note_view_interruptor(fn)
+UIに表示されるノート情報を書き換えます。 コールバック関数には、第一引数に対象のノートオブジェクトが渡されます。 コールバック関数の返り値でノートが書き換えられます。
+
+### Plugin:register_note_post_interruptor(fn)
+ノート投稿時にノート情報を書き換えます。 コールバック関数には、第一引数に対象のノートオブジェクトが渡されます。 コールバック関数の返り値でノートが書き換えられます。
+
+### Plugin:open_url(url)
+第一引数に渡されたURLをブラウザの新しいタブで開きます。
+
+### Plugin:config
+プラグインの設定が格納されるオブジェクト。プラグイン定義のconfigで設定したキーで値が入ります。
diff --git a/src/docs/no-NO/custom-emoji.md b/src/docs/no-NO/custom-emoji.md
new file mode 100644
index 0000000000..ed2e92be16
--- /dev/null
+++ b/src/docs/no-NO/custom-emoji.md
@@ -0,0 +1,2 @@
+# カスタム絵文字
+カスタム絵文字は、インスタンスで用意された画像を絵文字のように使える機能です。 ノート、リアクション、チャット、自己紹介、名前などの場所で使うことができます。 カスタム絵文字をそれらの場所で使うには、絵文字ピッカーボタン(ある場合)を押すか、`:`を入力して絵文字サジェストを表示します。 テキスト内に`:foo:`のような形式の文字列が見つかると、`foo`の部分がカスタム絵文字名と解釈され、表示時には対応したカスタム絵文字に置き換わります。
diff --git a/src/docs/no-NO/deck.md b/src/docs/no-NO/deck.md
new file mode 100644
index 0000000000..8057e262fd
--- /dev/null
+++ b/src/docs/no-NO/deck.md
@@ -0,0 +1,18 @@
+# デッキ
+
+デッキは利用可能なUIのひとつです。「カラム」と呼ばれるビューを複数並べて表示させることで、カスタマイズ性が高く、情報量の多いUIが構築できることが特徴です。
+
+## カラムの追加
+デッキの背景を右クリックし、「カラムを追加」して任意のカラムを追加できます。
+
+## カラムの移動
+カラムは、ドラッグアンドドロップで他のカラムと位置を入れ替えることが出来るほか、カラムメニュー(カラムのヘッダー右クリック)から位置を移動させることもできます。
+
+## カラムの水平分割
+カラムは左右だけでなく、上下に並べることもできます。 カラムメニューを開き、「左に重ねる」を選択すると、左のカラムの下に現在のカラムが移動します。 上下分割を解除するには、カラムメニューの「右に出す」を選択します。
+
+## カラムの設定
+カラムメニューの「編集」を選択するとカラムの設定を編集できます。カラムの名前を変えたり、幅を変えたりできます。
+
+## デッキの設定
+デッキに関する設定は、[settings/deck](/settings/deck)で行えます。
diff --git a/src/docs/no-NO/follow.md b/src/docs/no-NO/follow.md
new file mode 100644
index 0000000000..3c1ea7bbe0
--- /dev/null
+++ b/src/docs/no-NO/follow.md
@@ -0,0 +1,2 @@
+# フォロー
+ユーザーをフォローすると、タイムラインにそのユーザーの投稿が表示されるようになります。ただし、他のユーザーに対する返信は含まれません。 ユーザーをフォローするには、ユーザーページの「フォロー」ボタンをクリックします。フォローを解除するには、もう一度クリックします。
diff --git a/src/docs/no-NO/keyboard-shortcut.md b/src/docs/no-NO/keyboard-shortcut.md
new file mode 100644
index 0000000000..957ca838c9
--- /dev/null
+++ b/src/docs/no-NO/keyboard-shortcut.md
@@ -0,0 +1,68 @@
+# キーボードショートカット
+
+## グローバル
+これらのショートカットは基本的にどこでも使えます。
+<table>
+ <thead>
+ <tr><th>ショートカット</th><th>効果</th><th>由来</th></tr>
+ </thead>
+ <tbody>
+ <tr><td><kbd class="key">P</kbd>, <kbd class="key">N</kbd></td><td>新規投稿</td><td><b>P</b>ost, <b>N</b>ew, <b>N</b>ote</td></tr>
+ <tr><td><kbd class="key">T</kbd></td><td>タイムラインの最も新しい投稿にフォーカス</td><td><b>T</b>imeline, <b>T</b>op</td></tr>
+ <tr><td><kbd class="group"><kbd class="key">Shift</kbd> + <kbd class="key">N</kbd></kbd></td><td>通知を表示/隠す</td><td><b>N</b>otifications</td></tr>
+ <tr><td><kbd class="key">S</kbd></td><td>検索</td><td><b>S</b>earch</td></tr>
+ <tr><td><kbd class="key">H</kbd>, <kbd class="key">?</kbd></td><td>ヘルプを表示</td><td><b>H</b>elp</td></tr>
+ </tbody>
+</table>
+
+## 投稿にフォーカスされた状態
+
+<table>
+ <thead>
+ <tr><th>ショートカット</th><th>効果</th><th>由来</th></tr>
+ </thead>
+ <tbody>
+ <tr><td><kbd class="key">↑</kbd>, <kbd class="key">K</kbd>, <kbd class="group"><kbd class="key">Shift</kbd> + <kbd class="key">Tab</kbd></kbd></td><td>上の投稿にフォーカスを移動</td><td>-</td></tr>
+ <tr><td><kbd class="key">↓</kbd>, <kbd class="key">J</kbd>, <kbd class="key">Tab</kbd></td><td>下の投稿にフォーカスを移動</td><td>-</td></tr>
+ <tr><td><kbd class="key">R</kbd></td><td>返信フォームを開く</td><td><b>R</b>eply</td></tr>
+ <tr><td><kbd class="key">Q</kbd></td><td>Renoteフォームを開く</td><td><b>Q</b>uote</td></tr>
+ <tr><td><kbd class="group"><kbd class="key">Ctrl</kbd> + <kbd class="key">Q</kbd></kbd></td><td>即刻Renoteする(フォームを開かずに)</td><td>-</td></tr>
+ <tr><td><kbd class="key">E</kbd>, <kbd class="key">A</kbd>, <kbd class="key">+</kbd></td><td>リアクションフォームを開く</td><td><b>E</b>mote, re<b>A</b>ction</td></tr>
+ <tr><td><kbd class="key">0</kbd>~<kbd class="key">9</kbd></td><td>数字に対応したリアクションをする(対応については後述)</td><td>-</td></tr>
+ <tr><td><kbd class="key">F</kbd>, <kbd class="key">B</kbd></td><td>お気に入りに登録</td><td><b>F</b>avorite, <b>B</b>ookmark</td></tr>
+ <tr><td><kbd class="key">Del</kbd>, <kbd class="group"><kbd class="key">Ctrl</kbd> + <kbd class="key">D</kbd></kbd></td><td>投稿を削除</td><td><b>D</b>elete</tr>
+ <tr><td><kbd class="key">M</kbd>, <kbd class="key">O</kbd></td><td>投稿に対するメニューを開く</td><td><b>M</b>ore, <b>O</b>ther</td></tr>
+ <tr><td><kbd class="key">S</kbd></td><td>CWで隠された部分を表示 or 隠す</td><td><b>S</b>how, <b>S</b>ee</td></tr>
+ <tr><td><kbd class="key">Esc</kbd></td><td>フォーカスを外す</td><td>-</td></tr>
+ </tbody>
+</table>
+
+## Renoteフォーム
+
+<table>
+ <thead>
+ <tr><th>ショートカット</th><th>効果</th><th>由来</th></tr>
+ </thead>
+ <tbody>
+ <tr><td><kbd class="key">Enter</kbd></td><td>Renoteする</td><td>-</td></tr>
+ <tr><td><kbd class="key">Q</kbd></td><td>フォームを展開する</td><td><b>Q</b>uote</td></tr>
+ <tr><td><kbd class="key">Esc</kbd></td><td>フォームを閉じる</td><td>-</td></tr>
+ </tbody>
+</table>
+
+## リアクションフォーム
+デフォルトで「👍」にフォーカスが当たっている状態です。
+<table>
+ <thead>
+ <tr><th>ショートカット</th><th>効果</th><th>由来</th></tr>
+ </thead>
+ <tbody>
+ <tr><td><kbd class="key">↑</kbd>, <kbd class="key">K</kbd></td><td>上のリアクションにフォーカスを移動</td><td>-</td></tr>
+ <tr><td><kbd class="key">↓</kbd>, <kbd class="key">J</kbd></td><td>下のリアクションにフォーカスを移動</td><td>-</td></tr>
+ <tr><td><kbd class="key">←</kbd>, <kbd class="key">H</kbd>, <kbd class="group"><kbd class="key">Shift</kbd> + <kbd class="key">Tab</kbd></kbd></td><td>左のリアクションにフォーカスを移動</td><td>-</td></tr>
+ <tr><td><kbd class="key">→</kbd>, <kbd class="key">L</kbd>, <kbd class="key">Tab</kbd></td><td>右のリアクションにフォーカスを移動</td><td>-</td></tr>
+ <tr><td><kbd class="key">Enter</kbd>, <kbd class="key">Space</kbd>, <kbd class="key">+</kbd></td><td>リアクション確定</td><td>-</td></tr>
+ <tr><td><kbd class="key">0</kbd>~<kbd class="key">9</kbd></td><td>数字に対応したリアクションで確定</td><td>-</td></tr>
+ <tr><td><kbd class="key">Esc</kbd></td><td>リアクションするのをやめる</td><td>-</td></tr>
+ </tbody>
+</table>
diff --git a/src/docs/no-NO/mfm.md b/src/docs/no-NO/mfm.md
new file mode 100644
index 0000000000..e237287acc
--- /dev/null
+++ b/src/docs/no-NO/mfm.md
@@ -0,0 +1,2 @@
+# MFM
+MFMは、Misskey Flavored Markdownの略で、Misskeyの様々な場所で使用できる専用のマークアップ言語です。 MFMで使用可能な構文は[MFMチートシート](/mfm-cheat-sheet)で確認できます。
diff --git a/src/docs/no-NO/mute.md b/src/docs/no-NO/mute.md
new file mode 100644
index 0000000000..6a9608662a
--- /dev/null
+++ b/src/docs/no-NO/mute.md
@@ -0,0 +1,13 @@
+# ミュート
+
+ユーザーをミュートすると、そのユーザーに関する次のコンテンツがMisskeyに表示されなくなります:
+
+* タイムラインや投稿の検索結果内の、そのユーザーの投稿(およびそれらの投稿に対する返信やRenote)
+* そのユーザーからの通知
+* メッセージ履歴一覧内の、そのユーザーとのメッセージ履歴
+
+ユーザーをミュートするには、対象のユーザーのユーザーページに表示されている「ミュート」ボタンを押します。
+
+ミュートを行ったことは相手に通知されず、ミュートされていることを知ることもできません。
+
+設定>ミュート から、自分がミュートしているユーザー一覧を確認することができます。
diff --git a/src/docs/no-NO/pages.md b/src/docs/no-NO/pages.md
new file mode 100644
index 0000000000..a7311b95e6
--- /dev/null
+++ b/src/docs/no-NO/pages.md
@@ -0,0 +1,10 @@
+# Pages
+
+## 変数
+変数を使うことで動的なページを作成できます。テキスト内で <b>{ 変数名 }</b> と書くとそこに変数の値を埋め込めます。例えば <b>Hello { thing } world!</b> というテキストで、変数(thing)の値が <b>ai</b> だった場合、テキストは <b>Hello ai world!</b> になります。
+
+変数の評価(値を算出すること)は上から下に行われるので、ある変数の中で自分より下の変数を参照することはできません。例えば上から <b>A、B、C</b> と3つの変数を定義したとき、<b>C</b>の中で<b>A</b>や<b>B</b>を参照することはできますが、<b>A</b>の中で<b>B</b>や<b>C</b>を参照することはできません。
+
+ユーザーからの入力を受け取るには、ページに「ユーザー入力」ブロックを設置し、「変数名」に入力を格納したい変数名を設定します(変数は自動で作成されます)。その変数を使ってユーザー入力に応じた動作を行えます。
+
+関数を使うと、値の算出処理を再利用可能な形にまとめることができます。関数を作るには、「関数」タイプの変数を作成します。関数にはスロット(引数)を設定することができ、スロットの値は関数内で変数として利用可能です。また、関数を引数に取る関数(高階関数と呼ばれます)も存在します。関数は予め定義しておくほかに、このような高階関数のスロットに即席でセットすることもできます。
diff --git a/src/docs/no-NO/reaction.md b/src/docs/no-NO/reaction.md
new file mode 100644
index 0000000000..c26ead75b3
--- /dev/null
+++ b/src/docs/no-NO/reaction.md
@@ -0,0 +1,11 @@
+# リアクション
+他の人のノートに、絵文字を付けて簡単にあなたの反応を伝えられる機能です。 リアクションするには、ノートの + アイコンをクリックしてピッカーを表示し、絵文字を選択します。 リアクションには[カスタム絵文字](./custom-emoji)も使用できます。
+
+## リアクションピッカーのカスタマイズ
+ピッカーに表示される絵文字を自分好みにカスタマイズすることができます。 設定の「リアクション」で設定します。
+
+## リモート投稿へのリアクションについて
+リアクションはMisskeyオリジナルの機能であるため、リモートインスタンスがMisskeyでない限りは、ほとんどの場合「Like」としてアクティビティが送信されます。一般的にはLikeは「お気に入り」として実装されているようです。 また、相手がMisskeyであったとしても、カスタム絵文字リアクションは伝わらず、自動的に「👍」等にフォールバックされます。
+
+## リモートからのリアクションについて
+リモートから「Like」アクティビティを受信したとき、Misskeyでは「👍」のリアクションとして解釈されます。
diff --git a/src/docs/no-NO/reversi-bot.md b/src/docs/no-NO/reversi-bot.md
new file mode 100644
index 0000000000..7ab2a7212e
--- /dev/null
+++ b/src/docs/no-NO/reversi-bot.md
@@ -0,0 +1,160 @@
+# MisskeyリバーシBotの開発
+Misskeyのリバーシ機能に対応したBotの開発方法をここに記します。
+
+1. `games/reversi`ストリームに以下のパラメータを付けて接続する:
+ * `i`: botアカウントのAPIキー
+
+2. 対局への招待が来たら、ストリームから`invited`イベントが流れてくる
+ * イベントの中身に、`parent`という名前で対局へ誘ってきたユーザーの情報が含まれている
+
+3. `games/reversi/match`へ、`user_id`として`parent`の`id`が含まれたリクエストを送信する
+
+4. 上手くいくとゲーム情報が返ってくるので、`games/reversi-game`ストリームへ、以下のパラメータを付けて接続する:
+ * `i`: botアカウントのAPIキー
+ * `game`: `game`の`id`
+
+5. この間、相手がゲームの設定を変更するとその都度`update-settings`イベントが流れてくるので、必要であれば何かしらの処理を行う
+
+6. 設定に満足したら、`{ type: 'accept' }`メッセージをストリームに送信する
+
+7. ゲームが開始すると、`started`イベントが流れてくる
+ * イベントの中身にはゲーム情報が含まれている
+
+8. 石を打つには、ストリームに`{ type: 'set', pos: <位置> }`を送信する(位置の計算方法は後述)
+
+9. 相手または自分が石を打つと、ストリームから`set`イベントが流れてくる
+ * `color`として石の色が含まれている
+ * `pos`として位置情報が含まれている
+
+## 位置の計算法
+8x8のマップを考える場合、各マスの位置(インデックスと呼びます)は次のようになっています:
+```
++--+--+--+--+--+--+--+--+
+| 0| 1| 2| 3| 4| 5| 6| 7|
++--+--+--+--+--+--+--+--+
+| 8| 9|10|11|12|13|14|15|
++--+--+--+--+--+--+--+--+
+|16|17|18|19|20|21|22|23|
+...
+```
+
+### X,Y座標 から インデックス に変換する
+```
+pos = x + (y * mapWidth)
+```
+`mapWidth`は、ゲーム情報の`map`から、次のようにして計算できます:
+```
+mapWidth = map[0].length
+```
+
+### インデックス から X,Y座標 に変換する
+```
+x = pos % mapWidth
+y = Math.floor(pos / mapWidth)
+```
+
+## マップ情報
+マップ情報は、ゲーム情報の`map`に入っています。 文字列の配列になっており、ひとつひとつの文字がマス情報を表しています。 それをもとにマップのデザインを知る事が出来ます:
+* `(スペース)` ... マス無し
+* `-` ... マス
+* `b` ... 初期配置される黒石
+* `w` ... 初期配置される白石
+
+例えば、4*4の次のような単純なマップがあるとします:
+```text
++---+---+---+---+
+| | | | |
++---+---+---+---+
+| | ○ | ● | |
++---+---+---+---+
+| | ● | ○ | |
++---+---+---+---+
+| | | | |
++---+---+---+---+
+```
+
+この場合、マップデータはこのようになります:
+```javascript
+['----', '-wb-', '-bw-', '----']
+```
+
+## ユーザーにフォームを提示して対話可能Botを作成する
+ユーザーとのコミュニケーションを行うため、ゲームの設定画面でユーザーにフォームを提示することができます。 例えば、Botの強さをユーザーが設定できるようにする、といったシナリオが考えられます。
+
+フォームを提示するには、`reversi-game`ストリームに次のメッセージを送信します:
+```javascript
+{
+ type: 'init-form',
+ body: [フォームコントロールの配列]
+}
+```
+
+フォームコントロールの配列については今から説明します。 フォームコントロールは、次のようなオブジェクトです:
+```javascript
+{
+ id: 'switch1',
+ type: 'switch',
+ label: 'Enable hoge',
+ value: false
+}
+```
+`id` ... コントロールのID。 `type` ... コントロールの種類。後述します。 `label` ... コントロールと一緒に表記するテキスト。 `value` ... コントロールのデフォルト値。
+
+### フォームの操作を受け取る
+ユーザーがフォームを操作すると、ストリームから`update-form`イベントが流れてきます。 イベントの中身には、コントロールのIDと、ユーザーが設定した値が含まれています。 例えば、上で示したスイッチをユーザーがオンにしたとすると、次のイベントが流れてきます:
+```javascript
+{
+ id: 'switch1',
+ value: true
+}
+```
+
+### フォームコントロールの種類
+#### スイッチ
+type: `switch` スイッチを表示します。何かの機能をオン/オフさせたい場合に有用です。
+
+##### プロパティ
+`label` ... スイッチに表記するテキスト。
+
+#### ラジオボタン
+type: `radio` ラジオボタンを表示します。選択肢を提示するのに有用です。例えば、Botの強さを設定させるなどです。
+
+##### プロパティ
+`items` ... ラジオボタンの選択肢。例:
+```javascript
+items: [{
+ label: '弱',
+ value: 1
+}, {
+ label: '中',
+ value: 2
+}, {
+ label: '強',
+ value: 3
+}]
+```
+
+#### スライダー
+type: `slider` スライダーを表示します。
+
+##### プロパティ
+`min` ... スライダーの下限。 `max` ... スライダーの上限。 `step` ... 入力欄で刻むステップ値。
+
+#### テキストボックス
+type: `textbox` テキストボックスを表示します。ユーザーになにか入力させる一般的な用途に利用できます。
+
+## ユーザーにメッセージを表示する
+設定画面でユーザーと対話する、フォーム以外のもうひとつの方法がこれです。ユーザーになにかメッセージを表示することができます。 例えば、ユーザーがBotの対応していないモードやマップを選択したとき、警告を表示するなどです。 メッセージを表示するには、次のメッセージをストリームに送信します:
+```javascript
+{
+ type: 'message',
+ body: {
+ text: 'メッセージ内容',
+ type: 'メッセージの種類'
+ }
+}
+```
+メッセージの種類: `success`, `info`, `warning`, `error`。
+
+## 投了する
+投了をするには、<a href="./api/endpoints/games/reversi/games/surrender">このエンドポイント</a>にリクエストします。
diff --git a/src/docs/no-NO/stream.md b/src/docs/no-NO/stream.md
new file mode 100644
index 0000000000..9011c37c5b
--- /dev/null
+++ b/src/docs/no-NO/stream.md
@@ -0,0 +1,354 @@
+# ストリーミングAPI
+
+ストリーミングAPIを使うと、リアルタイムで様々な情報(例えばタイムラインに新しい投稿が流れてきた、メッセージが届いた、フォローされた、など)を受け取ったり、様々な操作を行ったりすることができます。
+
+## ストリームに接続する
+
+ストリーミングAPIを利用するには、まずMisskeyサーバーに**websocket**接続する必要があります。
+
+以下のURLに、`i`というパラメータ名で認証情報を含めて、websocket接続してください。例:
+```
+%WS_URL%/streaming?i=xxxxxxxxxxxxxxx
+```
+
+認証情報は、自分のAPIキーや、アプリケーションからストリームに接続する際はユーザーのアクセストークンのことを指します。
+
+<div class="ui info">
+ <p><i class="fas fa-info-circle"></i> 認証情報の取得については、<a href="./api">こちらのドキュメント</a>をご確認ください。</p>
+</div>
+
+---
+
+認証情報は省略することもできますが、その場合非ログインでの利用ということになり、受信できる情報や可能な操作は限られます。例:
+
+```
+%WS_URL%/streaming
+```
+
+---
+
+ストリームに接続すると、後述するAPI操作や、投稿の購読を行ったりすることができます。 しかしまだこの段階では、例えばタイムラインへの新しい投稿を受信したりすることはできません。 それを行うには、ストリーム上で、後述する**チャンネル**に接続する必要があります。
+
+**ストリームでのやり取りはすべてJSONです。**
+
+## チャンネル
+MisskeyのストリーミングAPIにはチャンネルという概念があります。これは、送受信する情報を分離するための仕組みです。 Misskeyのストリームに接続しただけでは、まだリアルタイムでタイムラインの投稿を受信したりはできません。 ストリーム上でチャンネルに接続することで、様々な情報を受け取ったり情報を送信したりすることができるようになります。
+
+### チャンネルに接続する
+チャンネルに接続するには、次のようなデータをJSONでストリームに送信します:
+
+```json
+{
+ type: 'connect',
+ body: {
+ channel: 'xxxxxxxx',
+ id: 'foobar',
+ params: {
+ ...
+ }
+ }
+}
+```
+
+ここで、
+* `channel`には接続したいチャンネル名を設定します。チャンネルの種類については後述します。
+* `id`にはそのチャンネルとやり取りするための任意のIDを設定します。ストリームでは様々なメッセージが流れるので、そのメッセージがどのチャンネルからのものなのか識別する必要があるからです。このIDは、UUIDや、乱数のようなもので構いません。
+* `params`はチャンネルに接続する際のパラメータです。チャンネルによって接続時に必要とされるパラメータは異なります。パラメータ不要のチャンネルに接続する際は、このプロパティは省略可能です。
+
+<div class="ui info">
+ <p><i class="fas fa-info-circle"></i> IDはチャンネルごとではなく「チャンネルの接続ごと」です。なぜなら、同じチャンネルに異なるパラメータで複数接続するケースもあるからです。</p>
+</div>
+
+### チャンネルからのメッセージを受け取る
+例えばタイムラインのチャンネルなら、新しい投稿があった時にメッセージを発します。そのメッセージを受け取ることで、タイムラインに新しい投稿がされたことをリアルタイムで知ることができます。
+
+チャンネルがメッセージを発すると、次のようなデータがJSONでストリームに流れてきます:
+```json
+{
+ type: 'channel',
+ body: {
+ id: 'foobar',
+ type: 'something',
+ body: {
+ some: 'thing'
+ }
+ }
+}
+```
+
+ここで、
+* `id`には前述したそのチャンネルに接続する際に設定したIDが設定されています。これで、このメッセージがどのチャンネルからのものなのか知ることができます。
+* `type`にはメッセージの種類が設定されます。チャンネルによって、どのような種類のメッセージが流れてくるかは異なります。
+* `body`にはメッセージの内容が設定されます。チャンネルによって、どのような内容のメッセージが流れてくるかは異なります。
+
+### チャンネルに向けてメッセージを送信する
+チャンネルによっては、メッセージを受け取るだけでなく、こちらから何かメッセージを送信し、何らかの操作を行える場合があります。
+
+チャンネルにメッセージを送信するには、次のようなデータをJSONでストリームに送信します:
+```json
+{
+ type: 'channel',
+ body: {
+ id: 'foobar',
+ type: 'something',
+ body: {
+ some: 'thing'
+ }
+ }
+}
+```
+
+ここで、
+* `id`には前述したそのチャンネルに接続する際に設定したIDを設定します。これで、このメッセージがどのチャンネルに向けたものなのか識別させることができます。
+* `type`にはメッセージの種類を設定します。チャンネルによって、どのような種類のメッセージを受け付けるかは異なります。
+* `body`にはメッセージの内容を設定します。チャンネルによって、どのような内容のメッセージを受け付けるかは異なります。
+
+### チャンネルから切断する
+チャンネルから切断するには、次のようなデータをJSONでストリームに送信します:
+
+```json
+{
+ type: 'disconnect',
+ body: {
+ id: 'foobar'
+ }
+}
+```
+
+ここで、
+* `id`には前述したそのチャンネルに接続する際に設定したIDを設定します。
+
+## ストリームを経由してAPIリクエストする
+
+ストリームを経由してAPIリクエストすると、HTTPリクエストを発生させずにAPIを利用できます。そのため、コードを簡潔にできたり、パフォーマンスの向上を見込めるかもしれません。
+
+ストリームを経由してAPIリクエストするには、次のようなデータをJSONでストリームに送信します:
+```json
+{
+ type: 'api',
+ body: {
+ id: 'xxxxxxxxxxxxxxxx',
+ endpoint: 'notes/create',
+ data: {
+ text: 'yee haw!'
+ }
+ }
+}
+```
+
+ここで、
+* `id`には、APIのレスポンスを識別するための、APIリクエストごとの一意なIDを設定する必要があります。UUIDや、簡単な乱数のようなもので構いません。
+* `endpoint`には、あなたがリクエストしたいAPIのエンドポイントを指定します。
+* `data`には、エンドポイントのパラメータを含めます。
+
+<div class="ui info">
+ <p><i class="fas fa-info-circle"></i> APIのエンドポイントやパラメータについてはAPIリファレンスをご確認ください。</p>
+</div>
+
+### レスポンスの受信
+
+APIへリクエストすると、レスポンスがストリームから次のような形式で流れてきます。
+
+```json
+{
+ type: 'api:xxxxxxxxxxxxxxxx',
+ body: {
+ ...
+ }
+}
+```
+
+ここで、
+* `xxxxxxxxxxxxxxxx`の部分には、リクエストの際に設定された`id`が含まれています。これにより、どのリクエストに対するレスポンスなのか判別することができます。
+* `body`には、レスポンスが含まれています。
+
+## 投稿のキャプチャ
+
+Misskeyは投稿のキャプチャと呼ばれる仕組みを提供しています。これは、指定した投稿のイベントをストリームで受け取る機能です。
+
+例えばタイムラインを取得してユーザーに表示したとします。ここで誰かがそのタイムラインに含まれるどれかの投稿に対してリアクションしたとします。
+
+しかし、クライアントからするとある投稿にリアクションが付いたことなどは知る由がないため、リアルタイムでリアクションをタイムライン上の投稿に反映して表示するといったことができません。
+
+この問題を解決するために、Misskeyは投稿のキャプチャ機構を用意しています。投稿をキャプチャすると、その投稿に関するイベントを受け取ることができるため、リアルタイムでリアクションを反映させたりすることが可能になります。
+
+### 投稿をキャプチャする
+
+投稿をキャプチャするには、ストリームに次のようなメッセージを送信します:
+
+```json
+{
+ type: 'subNote',
+ body: {
+ id: 'xxxxxxxxxxxxxxxx'
+ }
+}
+```
+
+ここで、
+* `id`にキャプチャしたい投稿の`id`を設定します。
+
+このメッセージを送信すると、Misskeyにキャプチャを要請したことになり、以後、その投稿に関するイベントが流れてくるようになります。
+
+例えば投稿にリアクションが付いたとすると、次のようなメッセージが流れてきます:
+
+```json
+{
+ type: 'noteUpdated',
+ body: {
+ id: 'xxxxxxxxxxxxxxxx',
+ type: 'reacted',
+ body: {
+ reaction: 'like',
+ userId: 'yyyyyyyyyyyyyyyy'
+ }
+ }
+}
+```
+
+ここで、
+* `body`内の`id`に、イベントを発生させた投稿のIDが設定されます。
+* `body`内の`type`に、イベントの種類が設定されます。
+* `body`内の`body`に、イベントの詳細が設定されます。
+
+#### イベントの種類
+
+##### `reacted`
+その投稿にリアクションがされた時に発生します。
+
+* `reaction`に、リアクションの種類が設定されます。
+* `userId`に、リアクションを行ったユーザーのIDが設定されます。
+
+例:
+```json
+{
+ type: 'noteUpdated',
+ body: {
+ id: 'xxxxxxxxxxxxxxxx',
+ type: 'reacted',
+ body: {
+ reaction: 'like',
+ userId: 'yyyyyyyyyyyyyyyy'
+ }
+ }
+}
+```
+
+##### `deleted`
+その投稿が削除された時に発生します。
+
+* `deletedAt`に、削除日時が設定されます。
+
+例:
+```json
+{
+ type: 'noteUpdated',
+ body: {
+ id: 'xxxxxxxxxxxxxxxx',
+ type: 'deleted',
+ body: {
+ deletedAt: '2018-10-22T02:17:09.703Z'
+ }
+ }
+}
+```
+
+##### `pollVoted`
+その投稿に添付されたアンケートに投票された時に発生します。
+
+* `choice`に、選択肢IDが設定されます。
+* `userId`に、投票を行ったユーザーのIDが設定されます。
+
+例:
+```json
+{
+ type: 'noteUpdated',
+ body: {
+ id: 'xxxxxxxxxxxxxxxx',
+ type: 'pollVoted',
+ body: {
+ choice: 2,
+ userId: 'yyyyyyyyyyyyyyyy'
+ }
+ }
+}
+```
+
+### 投稿のキャプチャを解除する
+
+その投稿がもう画面に表示されなくなったりして、その投稿に関するイベントをもう受け取る必要がなくなったときは、キャプチャの解除を申請してください。
+
+次のメッセージを送信します:
+
+```json
+{
+ type: 'unsubNote',
+ body: {
+ id: 'xxxxxxxxxxxxxxxx'
+ }
+}
+```
+
+ここで、
+* `id`にキャプチャを解除したい投稿の`id`を設定します。
+
+このメッセージを送信すると、以後、その投稿に関するイベントは流れてこないようになります。
+
+# チャンネル一覧
+## `main`
+アカウントに関する基本的な情報が流れてきます。このチャンネルにパラメータはありません。
+
+### 流れてくるイベント一覧
+
+#### `renote`
+自分の投稿がRenoteされた時に発生するイベントです。自分自身の投稿をRenoteしたときは発生しません。
+
+#### `mention`
+誰かからメンションされたときに発生するイベントです。
+
+#### `readAllNotifications`
+自分宛ての通知がすべて既読になったことを表すイベントです。このイベントを利用して、「通知があることを示すアイコン」のようなものをオフにしたりする等のケースが想定されます。
+
+#### `meUpdated`
+自分の情報が更新されたことを表すイベントです。
+
+#### `follow`
+自分が誰かをフォローしたときに発生するイベントです。
+
+#### `unfollow`
+自分が誰かのフォローを解除したときに発生するイベントです。
+
+#### `followed`
+自分が誰かにフォローされたときに発生するイベントです。
+
+## `homeTimeline`
+ホームタイムラインの投稿情報が流れてきます。このチャンネルにパラメータはありません。
+
+### 流れてくるイベント一覧
+
+#### `note`
+タイムラインに新しい投稿が流れてきたときに発生するイベントです。
+
+## `localTimeline`
+ローカルタイムラインの投稿情報が流れてきます。このチャンネルにパラメータはありません。
+
+### 流れてくるイベント一覧
+
+#### `note`
+ローカルタイムラインに新しい投稿が流れてきたときに発生するイベントです。
+
+## `hybridTimeline`
+ソーシャルタイムラインの投稿情報が流れてきます。このチャンネルにパラメータはありません。
+
+### 流れてくるイベント一覧
+
+#### `note`
+ソーシャルタイムラインに新しい投稿が流れてきたときに発生するイベントです。
+
+## `globalTimeline`
+グローバルタイムラインの投稿情報が流れてきます。このチャンネルにパラメータはありません。
+
+### 流れてくるイベント一覧
+
+#### `note`
+グローバルタイムラインに新しい投稿が流れてきたときに発生するイベントです。
diff --git a/src/docs/no-NO/theme.md b/src/docs/no-NO/theme.md
new file mode 100644
index 0000000000..4e52ee8cd7
--- /dev/null
+++ b/src/docs/no-NO/theme.md
@@ -0,0 +1,68 @@
+# テーマ
+
+テーマを設定して、Misskeyクライアントの見た目を変更できます。
+
+## テーマの設定
+設定 > テーマ
+
+## テーマを作成する
+テーマコードはJSON5で記述されたテーマオブジェクトです。 テーマは以下のようなオブジェクトです。
+``` js
+{
+ id: '17587283-dd92-4a2c-a22c-be0637c9e22a',
+
+ name: 'Danboard',
+ author: 'syuilo',
+
+ base: 'light',
+
+ props: {
+ accent: 'rgb(218, 141, 49)',
+ bg: 'rgb(218, 212, 190)',
+ fg: 'rgb(115, 108, 92)',
+ panel: 'rgb(236, 232, 220)',
+ renote: 'rgb(100, 152, 106)',
+ link: 'rgb(100, 152, 106)',
+ mention: '@accent',
+ hashtag: 'rgb(100, 152, 106)',
+ header: 'rgba(239, 227, 213, 0.75)',
+ navBg: 'rgb(216, 206, 182)',
+ inputBorder: 'rgba(0, 0, 0, 0.1)',
+ },
+}
+
+```
+
+* `id` ... テーマの一意なID。UUIDをおすすめします。
+* `name` ... テーマ名
+* `author` ... テーマの作者
+* `desc` ... テーマの説明(オプション)
+* `base` ... 明るいテーマか、暗いテーマか
+ * `light`にすると明るいテーマになり、`dark`にすると暗いテーマになります。
+ * テーマはここで設定されたベーステーマを継承します。
+* `props` ... テーマのスタイル定義。これから説明します。
+
+### テーマのスタイル定義
+`props`下にはテーマのスタイルを定義します。 キーがCSSの変数名になり、バリューで中身を指定します。 なお、この`props`オブジェクトはベーステーマから継承されます。 ベーステーマは、このテーマの`base`が`light`なら[_light.json5](https://github.com/syuilo/misskey/blob/develop/src/client/themes/_light.json5)で、`dark`なら[_dark.json5](https://github.com/syuilo/misskey/blob/develop/src/client/themes/_dark.json5)です。 つまり、このテーマ内の`props`に`panel`というキーが無くても、そこにはベーステーマの`panel`があると見なされます。
+
+#### バリューで使える構文
+* 16進数で表された色
+ * 例: `#00ff00`
+* `rgb(r, g, b)`形式で表された色
+ * 例: `rgb(0, 255, 0)`
+* `rgb(r, g, b, a)`形式で表された透明度を含む色
+ * 例: `rgba(0, 255, 0, 0.5)`
+* 他のキーの値の参照
+ * `@{キー名}`と書くと他のキーの値の参照になります。`{キー名}`は参照したいキーの名前に置き換えます。
+ * 例: `@panel`
+* 定数(後述)の参照
+ * `${定数名}`と書くと定数の参照になります。`{定数名}`は参照したい定数の名前に置き換えます。
+ * 例: `$main`
+* 関数(後述)
+ * `:{関数名}<{引数}<{色}`
+
+#### 定数
+「CSS変数として出力はしたくないが、他のCSS変数の値として使いまわしたい」値があるときは、定数を使うと便利です。 キー名を`$`で始めると、そのキーはCSS変数として出力されません。
+
+#### 関数
+wip
diff --git a/src/docs/no-NO/timelines.md b/src/docs/no-NO/timelines.md
new file mode 100644
index 0000000000..36ba61bd2d
--- /dev/null
+++ b/src/docs/no-NO/timelines.md
@@ -0,0 +1,15 @@
+# タイムラインの比較
+
+https://docs.google.com/spreadsheets/d/1lxQ2ugKrhz58Bg96HTDK_2F98BUritkMyIiBkOByjHA/edit?usp=sharing
+
+## ホーム
+自分のフォローしているユーザーの投稿
+
+## ローカル
+全てのローカルユーザーの「ホーム」指定されていない投稿
+
+## ソーシャル
+自分のフォローしているユーザーの投稿と、全てのローカルユーザーの「ホーム」指定されていない投稿
+
+## グローバル
+全てのローカルユーザーの「ホーム」指定されていない投稿と、サーバーに届いた全てのリモートユーザーの「ホーム」指定されていない投稿
diff --git a/src/docs/pl-PL/aiscript.md b/src/docs/pl-PL/aiscript.md
new file mode 100644
index 0000000000..6c28b446e3
--- /dev/null
+++ b/src/docs/pl-PL/aiscript.md
@@ -0,0 +1,4 @@
+# AiScript
+
+## 関数
+デフォルトで値渡しです。
diff --git a/src/docs/pl-PL/api.md b/src/docs/pl-PL/api.md
new file mode 100644
index 0000000000..76019b6145
--- /dev/null
+++ b/src/docs/pl-PL/api.md
@@ -0,0 +1,58 @@
+# Misskey API
+
+MisskeyAPIを使ってMisskeyクライアント、Misskey連携Webサービス、Bot等(以下「アプリケーション」と呼びます)を開発できます。 ストリーミングAPIもあるので、リアルタイム性のあるアプリケーションを作ることも可能です。
+
+APIを使い始めるには、まずアクセストークンを取得する必要があります。 このドキュメントでは、アクセストークンを取得する手順を説明した後、基本的なAPIの使い方を説明します。
+
+## アクセストークンの取得
+基本的に、APIはリクエストにはアクセストークンが必要となります。 APIにリクエストするのが自分自身なのか、不特定の利用者に使ってもらうアプリケーションなのかによって取得手順は異なります。
+
+* 前者の場合: [「自分自身のアクセストークンを手動発行する」](#自分自身のアクセストークンを手動発行する)に進む
+* 後者の場合: [「アプリケーション利用者にアクセストークンの発行をリクエストする」](#アプリケーション利用者にアクセストークンの発行をリクエストする)に進む
+
+### 自分自身のアクセストークンを手動発行する
+「設定 > API」で、自分のアクセストークンを発行できます。
+
+[「APIの使い方」へ進む](#APIの使い方)
+
+### アプリケーション利用者にアクセストークンの発行をリクエストする
+アプリケーション利用者のアクセストークンを取得するには、以下の手順で発行をリクエストします。
+
+#### Step 1
+
+UUIDを生成する。以後これをセッションIDと呼びます。
+
+> このセッションIDは毎回生成し、使いまわさないようにしてください。
+
+#### Step 2
+
+`{_URL_}/miauth/{session}`をユーザーのブラウザで表示させる。`{session}`の部分は、セッションIDに置き換えてください。
+> 例: `{_URL_}/miauth/c1f6d42b-468b-4fd2-8274-e58abdedef6f`
+
+表示する際、URLにクエリパラメータとしていくつかのオプションを設定できます:
+* `name` ... アプリケーション名
+ * > 例: `MissDeck`
+* `icon` ... アプリケーションのアイコン画像URL
+ * > 例: `https://missdeck.example.com/icon.png`
+* `callback` ... 認証が終わった後にリダイレクトするURL
+ * > 例: `https://missdeck.example.com/callback`
+ * リダイレクト時には、`session`というクエリパラメータでセッションIDが付きます
+* `permission` ... アプリケーションが要求する権限
+ * > 例: `write:notes,write:following,read:drive`
+ * 要求する権限を`,`で区切って列挙します
+ * どのような権限があるかは[APIリファレンス](/api-doc)で確認できます
+
+#### Step 3
+ユーザーが発行を許可した後、`{_URL_}/api/miauth/{session}/check`にPOSTリクエストすると、レスポンスとしてアクセストークンを含むJSONが返ります。
+
+レスポンスに含まれるプロパティ:
+* `token` ... ユーザーのアクセストークン
+* `user` ... ユーザーの情報
+
+[「APIの使い方」へ進む](#APIの使い方)
+
+## APIの使い方
+**APIはすべてPOSTで、リクエスト/レスポンスともにJSON形式です。RESTではありません。** アクセストークンは、`i`というパラメータ名でリクエストに含めます。
+
+* [APIリファレンス](/api-doc)
+* [ストリーミングAPI](./stream)
diff --git a/src/docs/pl-PL/create-plugin.md b/src/docs/pl-PL/create-plugin.md
new file mode 100644
index 0000000000..0d2fa19178
--- /dev/null
+++ b/src/docs/pl-PL/create-plugin.md
@@ -0,0 +1,74 @@
+# プラグインの作成
+Misskey Webクライアントのプラグイン機能を使うと、クライアントを拡張し、様々な機能を追加できます。 ここではプラグインの作成にあたってのメタデータ定義や、AiScript APIリファレンスを掲載します。
+
+## メタデータ
+プラグインは、AiScriptのメタデータ埋め込み機能を使って、デフォルトとしてプラグインのメタデータを定義する必要があります。 メタデータは次のプロパティを含むオブジェクトです。
+
+### name
+プラグイン名
+
+### author
+プラグイン作者
+
+### version
+プラグインバージョン。数値を指定してください。
+
+### description
+プラグインの説明
+
+### permissions
+プラグインが要求する権限。MisskeyAPIにリクエストする際に用いられます。
+
+### config
+プラグインの設定情報を表すオブジェクト。 キーに設定名、値に以下のプロパティを含めます。
+
+#### type
+設定値の種類を表す文字列。以下から選択します。 string number boolean
+
+#### label
+ユーザーに表示する設定名
+
+#### description
+設定の説明
+
+#### default
+設定のデフォルト値
+
+## APIリファレンス
+AiScript標準で組み込まれているAPIは掲載しません。
+
+### Mk:dialog(title text type)
+ダイアログを表示します。typeには以下の値が設定できます。 info success warn error question 省略すると info になります。
+
+### Mk:confirm(title text type)
+確認ダイアログを表示します。typeには以下の値が設定できます。 info success warn error question 省略すると question になります。 ユーザーが"OK"を選択した場合は true を、"キャンセル"を選択した場合は false が返ります。
+
+### Mk:api(endpoint params)
+Misskey APIにリクエストします。第一引数にエンドポイント名、第二引数にパラメータオブジェクトを渡します。
+
+### Mk:save(key value)
+任意の値に任意の名前を付けて永続化します。永続化した値は、AiScriptコンテキストが終了しても残り、Mk:loadで読み取ることができます。
+
+### Mk:load(key)
+Mk:saveで永続化した指定の名前の値を読み取ります。
+
+### Plugin:register_post_form_action(title fn)
+投稿フォームにアクションを追加します。第一引数にアクション名、第二引数にアクションが選択された際のコールバック関数を渡します。 コールバック関数には、第一引数に投稿フォームオブジェクトが渡されます。
+
+### Plugin:register_note_action(title fn)
+ノートメニューに項目を追加します。第一引数に項目名、第二引数に項目が選択された際のコールバック関数を渡します。 コールバック関数には、第一引数に対象のノートオブジェクトが渡されます。
+
+### Plugin:register_user_action(title fn)
+ユーザーメニューに項目を追加します。第一引数に項目名、第二引数に項目が選択された際のコールバック関数を渡します。 コールバック関数には、第一引数に対象のユーザーオブジェクトが渡されます。
+
+### Plugin:register_note_view_interruptor(fn)
+UIに表示されるノート情報を書き換えます。 コールバック関数には、第一引数に対象のノートオブジェクトが渡されます。 コールバック関数の返り値でノートが書き換えられます。
+
+### Plugin:register_note_post_interruptor(fn)
+ノート投稿時にノート情報を書き換えます。 コールバック関数には、第一引数に対象のノートオブジェクトが渡されます。 コールバック関数の返り値でノートが書き換えられます。
+
+### Plugin:open_url(url)
+第一引数に渡されたURLをブラウザの新しいタブで開きます。
+
+### Plugin:config
+プラグインの設定が格納されるオブジェクト。プラグイン定義のconfigで設定したキーで値が入ります。
diff --git a/src/docs/pl-PL/custom-emoji.md b/src/docs/pl-PL/custom-emoji.md
new file mode 100644
index 0000000000..ed2e92be16
--- /dev/null
+++ b/src/docs/pl-PL/custom-emoji.md
@@ -0,0 +1,2 @@
+# カスタム絵文字
+カスタム絵文字は、インスタンスで用意された画像を絵文字のように使える機能です。 ノート、リアクション、チャット、自己紹介、名前などの場所で使うことができます。 カスタム絵文字をそれらの場所で使うには、絵文字ピッカーボタン(ある場合)を押すか、`:`を入力して絵文字サジェストを表示します。 テキスト内に`:foo:`のような形式の文字列が見つかると、`foo`の部分がカスタム絵文字名と解釈され、表示時には対応したカスタム絵文字に置き換わります。
diff --git a/src/docs/pl-PL/deck.md b/src/docs/pl-PL/deck.md
new file mode 100644
index 0000000000..8057e262fd
--- /dev/null
+++ b/src/docs/pl-PL/deck.md
@@ -0,0 +1,18 @@
+# デッキ
+
+デッキは利用可能なUIのひとつです。「カラム」と呼ばれるビューを複数並べて表示させることで、カスタマイズ性が高く、情報量の多いUIが構築できることが特徴です。
+
+## カラムの追加
+デッキの背景を右クリックし、「カラムを追加」して任意のカラムを追加できます。
+
+## カラムの移動
+カラムは、ドラッグアンドドロップで他のカラムと位置を入れ替えることが出来るほか、カラムメニュー(カラムのヘッダー右クリック)から位置を移動させることもできます。
+
+## カラムの水平分割
+カラムは左右だけでなく、上下に並べることもできます。 カラムメニューを開き、「左に重ねる」を選択すると、左のカラムの下に現在のカラムが移動します。 上下分割を解除するには、カラムメニューの「右に出す」を選択します。
+
+## カラムの設定
+カラムメニューの「編集」を選択するとカラムの設定を編集できます。カラムの名前を変えたり、幅を変えたりできます。
+
+## デッキの設定
+デッキに関する設定は、[settings/deck](/settings/deck)で行えます。
diff --git a/src/docs/pl-PL/follow.md b/src/docs/pl-PL/follow.md
new file mode 100644
index 0000000000..3c1ea7bbe0
--- /dev/null
+++ b/src/docs/pl-PL/follow.md
@@ -0,0 +1,2 @@
+# フォロー
+ユーザーをフォローすると、タイムラインにそのユーザーの投稿が表示されるようになります。ただし、他のユーザーに対する返信は含まれません。 ユーザーをフォローするには、ユーザーページの「フォロー」ボタンをクリックします。フォローを解除するには、もう一度クリックします。
diff --git a/src/docs/pl-PL/keyboard-shortcut.md b/src/docs/pl-PL/keyboard-shortcut.md
new file mode 100644
index 0000000000..c2c138928b
--- /dev/null
+++ b/src/docs/pl-PL/keyboard-shortcut.md
@@ -0,0 +1,68 @@
+# キーボードショートカット
+
+## グローバル
+これらのショートカットは基本的にどこでも使えます。
+<table>
+ <thead>
+ <tr><th>ショートカット</th><th>効果</th><th>由来</th></tr>
+ </thead>
+ <tbody>
+ <tr><td><kbd class="key">P</kbd>, <kbd class="key">N</kbd></td><td>新規投稿</td><td><b>P</b>ost, <b>N</b>ew, <b>N</b>ote</td></tr>
+ <tr><td><kbd class="key">T</kbd></td><td>タイムラインの最も新しい投稿にフォーカス</td><td><b>T</b>imeline, <b>T</b>op</td></tr>
+ <tr><td><kbd class="group"><kbd class="key">Shift</kbd> + <kbd class="key">N</kbd></kbd></td><td>通知を表示/隠す</td><td><b>N</b>otifications</td></tr>
+ <tr><td><kbd class="key">S</kbd></td><td>Szukaj</td><td><b>S</b>earch</td></tr>
+ <tr><td><kbd class="key">H</kbd>, <kbd class="key">?</kbd></td><td>ヘルプを表示</td><td><b>H</b>elp</td></tr>
+ </tbody>
+</table>
+
+## 投稿にフォーカスされた状態
+
+<table>
+ <thead>
+ <tr><th>ショートカット</th><th>効果</th><th>由来</th></tr>
+ </thead>
+ <tbody>
+ <tr><td><kbd class="key">↑</kbd>, <kbd class="key">K</kbd>, <kbd class="group"><kbd class="key">Shift</kbd> + <kbd class="key">Tab</kbd></kbd></td><td>上の投稿にフォーカスを移動</td><td>-</td></tr>
+ <tr><td><kbd class="key">↓</kbd>, <kbd class="key">J</kbd>, <kbd class="key">Tab</kbd></td><td>下の投稿にフォーカスを移動</td><td>-</td></tr>
+ <tr><td><kbd class="key">R</kbd></td><td>返信フォームを開く</td><td><b>R</b>eply</td></tr>
+ <tr><td><kbd class="key">Q</kbd></td><td>Renoteフォームを開く</td><td><b>Q</b>uote</td></tr>
+ <tr><td><kbd class="group"><kbd class="key">Ctrl</kbd> + <kbd class="key">Q</kbd></kbd></td><td>即刻Renoteする(フォームを開かずに)</td><td>-</td></tr>
+ <tr><td><kbd class="key">E</kbd>, <kbd class="key">A</kbd>, <kbd class="key">+</kbd></td><td>リアクションフォームを開く</td><td><b>E</b>mote, re<b>A</b>ction</td></tr>
+ <tr><td><kbd class="key">0</kbd>~<kbd class="key">9</kbd></td><td>数字に対応したリアクションをする(対応については後述)</td><td>-</td></tr>
+ <tr><td><kbd class="key">F</kbd>, <kbd class="key">B</kbd></td><td>お気に入りに登録</td><td><b>F</b>avorite, <b>B</b>ookmark</td></tr>
+ <tr><td><kbd class="key">Del</kbd>, <kbd class="group"><kbd class="key">Ctrl</kbd> + <kbd class="key">D</kbd></kbd></td><td>投稿を削除</td><td><b>D</b>elete</tr>
+ <tr><td><kbd class="key">M</kbd>, <kbd class="key">O</kbd></td><td>投稿に対するメニューを開く</td><td><b>M</b>ore, <b>O</b>ther</td></tr>
+ <tr><td><kbd class="key">S</kbd></td><td>CWで隠された部分を表示 or 隠す</td><td><b>S</b>how, <b>S</b>ee</td></tr>
+ <tr><td><kbd class="key">Esc</kbd></td><td>フォーカスを外す</td><td>-</td></tr>
+ </tbody>
+</table>
+
+## Renoteフォーム
+
+<table>
+ <thead>
+ <tr><th>ショートカット</th><th>効果</th><th>由来</th></tr>
+ </thead>
+ <tbody>
+ <tr><td><kbd class="key">Enter</kbd></td><td>Renoteする</td><td>-</td></tr>
+ <tr><td><kbd class="key">Q</kbd></td><td>フォームを展開する</td><td><b>Q</b>uote</td></tr>
+ <tr><td><kbd class="key">Esc</kbd></td><td>フォームを閉じる</td><td>-</td></tr>
+ </tbody>
+</table>
+
+## リアクションフォーム
+デフォルトで「👍」にフォーカスが当たっている状態です。
+<table>
+ <thead>
+ <tr><th>ショートカット</th><th>効果</th><th>由来</th></tr>
+ </thead>
+ <tbody>
+ <tr><td><kbd class="key">↑</kbd>, <kbd class="key">K</kbd></td><td>上のリアクションにフォーカスを移動</td><td>-</td></tr>
+ <tr><td><kbd class="key">↓</kbd>, <kbd class="key">J</kbd></td><td>下のリアクションにフォーカスを移動</td><td>-</td></tr>
+ <tr><td><kbd class="key">←</kbd>, <kbd class="key">H</kbd>, <kbd class="group"><kbd class="key">Shift</kbd> + <kbd class="key">Tab</kbd></kbd></td><td>左のリアクションにフォーカスを移動</td><td>-</td></tr>
+ <tr><td><kbd class="key">→</kbd>, <kbd class="key">L</kbd>, <kbd class="key">Tab</kbd></td><td>右のリアクションにフォーカスを移動</td><td>-</td></tr>
+ <tr><td><kbd class="key">Enter</kbd>, <kbd class="key">Space</kbd>, <kbd class="key">+</kbd></td><td>リアクション確定</td><td>-</td></tr>
+ <tr><td><kbd class="key">0</kbd>~<kbd class="key">9</kbd></td><td>数字に対応したリアクションで確定</td><td>-</td></tr>
+ <tr><td><kbd class="key">Esc</kbd></td><td>リアクションするのをやめる</td><td>-</td></tr>
+ </tbody>
+</table>
diff --git a/src/docs/pl-PL/mfm.md b/src/docs/pl-PL/mfm.md
new file mode 100644
index 0000000000..e237287acc
--- /dev/null
+++ b/src/docs/pl-PL/mfm.md
@@ -0,0 +1,2 @@
+# MFM
+MFMは、Misskey Flavored Markdownの略で、Misskeyの様々な場所で使用できる専用のマークアップ言語です。 MFMで使用可能な構文は[MFMチートシート](/mfm-cheat-sheet)で確認できます。
diff --git a/src/docs/pl-PL/mute.md b/src/docs/pl-PL/mute.md
new file mode 100644
index 0000000000..6a9608662a
--- /dev/null
+++ b/src/docs/pl-PL/mute.md
@@ -0,0 +1,13 @@
+# ミュート
+
+ユーザーをミュートすると、そのユーザーに関する次のコンテンツがMisskeyに表示されなくなります:
+
+* タイムラインや投稿の検索結果内の、そのユーザーの投稿(およびそれらの投稿に対する返信やRenote)
+* そのユーザーからの通知
+* メッセージ履歴一覧内の、そのユーザーとのメッセージ履歴
+
+ユーザーをミュートするには、対象のユーザーのユーザーページに表示されている「ミュート」ボタンを押します。
+
+ミュートを行ったことは相手に通知されず、ミュートされていることを知ることもできません。
+
+設定>ミュート から、自分がミュートしているユーザー一覧を確認することができます。
diff --git a/src/docs/pl-PL/pages.md b/src/docs/pl-PL/pages.md
new file mode 100644
index 0000000000..a7311b95e6
--- /dev/null
+++ b/src/docs/pl-PL/pages.md
@@ -0,0 +1,10 @@
+# Pages
+
+## 変数
+変数を使うことで動的なページを作成できます。テキスト内で <b>{ 変数名 }</b> と書くとそこに変数の値を埋め込めます。例えば <b>Hello { thing } world!</b> というテキストで、変数(thing)の値が <b>ai</b> だった場合、テキストは <b>Hello ai world!</b> になります。
+
+変数の評価(値を算出すること)は上から下に行われるので、ある変数の中で自分より下の変数を参照することはできません。例えば上から <b>A、B、C</b> と3つの変数を定義したとき、<b>C</b>の中で<b>A</b>や<b>B</b>を参照することはできますが、<b>A</b>の中で<b>B</b>や<b>C</b>を参照することはできません。
+
+ユーザーからの入力を受け取るには、ページに「ユーザー入力」ブロックを設置し、「変数名」に入力を格納したい変数名を設定します(変数は自動で作成されます)。その変数を使ってユーザー入力に応じた動作を行えます。
+
+関数を使うと、値の算出処理を再利用可能な形にまとめることができます。関数を作るには、「関数」タイプの変数を作成します。関数にはスロット(引数)を設定することができ、スロットの値は関数内で変数として利用可能です。また、関数を引数に取る関数(高階関数と呼ばれます)も存在します。関数は予め定義しておくほかに、このような高階関数のスロットに即席でセットすることもできます。
diff --git a/src/docs/pl-PL/reaction.md b/src/docs/pl-PL/reaction.md
new file mode 100644
index 0000000000..c26ead75b3
--- /dev/null
+++ b/src/docs/pl-PL/reaction.md
@@ -0,0 +1,11 @@
+# リアクション
+他の人のノートに、絵文字を付けて簡単にあなたの反応を伝えられる機能です。 リアクションするには、ノートの + アイコンをクリックしてピッカーを表示し、絵文字を選択します。 リアクションには[カスタム絵文字](./custom-emoji)も使用できます。
+
+## リアクションピッカーのカスタマイズ
+ピッカーに表示される絵文字を自分好みにカスタマイズすることができます。 設定の「リアクション」で設定します。
+
+## リモート投稿へのリアクションについて
+リアクションはMisskeyオリジナルの機能であるため、リモートインスタンスがMisskeyでない限りは、ほとんどの場合「Like」としてアクティビティが送信されます。一般的にはLikeは「お気に入り」として実装されているようです。 また、相手がMisskeyであったとしても、カスタム絵文字リアクションは伝わらず、自動的に「👍」等にフォールバックされます。
+
+## リモートからのリアクションについて
+リモートから「Like」アクティビティを受信したとき、Misskeyでは「👍」のリアクションとして解釈されます。
diff --git a/src/docs/pl-PL/reversi-bot.md b/src/docs/pl-PL/reversi-bot.md
new file mode 100644
index 0000000000..7ab2a7212e
--- /dev/null
+++ b/src/docs/pl-PL/reversi-bot.md
@@ -0,0 +1,160 @@
+# MisskeyリバーシBotの開発
+Misskeyのリバーシ機能に対応したBotの開発方法をここに記します。
+
+1. `games/reversi`ストリームに以下のパラメータを付けて接続する:
+ * `i`: botアカウントのAPIキー
+
+2. 対局への招待が来たら、ストリームから`invited`イベントが流れてくる
+ * イベントの中身に、`parent`という名前で対局へ誘ってきたユーザーの情報が含まれている
+
+3. `games/reversi/match`へ、`user_id`として`parent`の`id`が含まれたリクエストを送信する
+
+4. 上手くいくとゲーム情報が返ってくるので、`games/reversi-game`ストリームへ、以下のパラメータを付けて接続する:
+ * `i`: botアカウントのAPIキー
+ * `game`: `game`の`id`
+
+5. この間、相手がゲームの設定を変更するとその都度`update-settings`イベントが流れてくるので、必要であれば何かしらの処理を行う
+
+6. 設定に満足したら、`{ type: 'accept' }`メッセージをストリームに送信する
+
+7. ゲームが開始すると、`started`イベントが流れてくる
+ * イベントの中身にはゲーム情報が含まれている
+
+8. 石を打つには、ストリームに`{ type: 'set', pos: <位置> }`を送信する(位置の計算方法は後述)
+
+9. 相手または自分が石を打つと、ストリームから`set`イベントが流れてくる
+ * `color`として石の色が含まれている
+ * `pos`として位置情報が含まれている
+
+## 位置の計算法
+8x8のマップを考える場合、各マスの位置(インデックスと呼びます)は次のようになっています:
+```
++--+--+--+--+--+--+--+--+
+| 0| 1| 2| 3| 4| 5| 6| 7|
++--+--+--+--+--+--+--+--+
+| 8| 9|10|11|12|13|14|15|
++--+--+--+--+--+--+--+--+
+|16|17|18|19|20|21|22|23|
+...
+```
+
+### X,Y座標 から インデックス に変換する
+```
+pos = x + (y * mapWidth)
+```
+`mapWidth`は、ゲーム情報の`map`から、次のようにして計算できます:
+```
+mapWidth = map[0].length
+```
+
+### インデックス から X,Y座標 に変換する
+```
+x = pos % mapWidth
+y = Math.floor(pos / mapWidth)
+```
+
+## マップ情報
+マップ情報は、ゲーム情報の`map`に入っています。 文字列の配列になっており、ひとつひとつの文字がマス情報を表しています。 それをもとにマップのデザインを知る事が出来ます:
+* `(スペース)` ... マス無し
+* `-` ... マス
+* `b` ... 初期配置される黒石
+* `w` ... 初期配置される白石
+
+例えば、4*4の次のような単純なマップがあるとします:
+```text
++---+---+---+---+
+| | | | |
++---+---+---+---+
+| | ○ | ● | |
++---+---+---+---+
+| | ● | ○ | |
++---+---+---+---+
+| | | | |
++---+---+---+---+
+```
+
+この場合、マップデータはこのようになります:
+```javascript
+['----', '-wb-', '-bw-', '----']
+```
+
+## ユーザーにフォームを提示して対話可能Botを作成する
+ユーザーとのコミュニケーションを行うため、ゲームの設定画面でユーザーにフォームを提示することができます。 例えば、Botの強さをユーザーが設定できるようにする、といったシナリオが考えられます。
+
+フォームを提示するには、`reversi-game`ストリームに次のメッセージを送信します:
+```javascript
+{
+ type: 'init-form',
+ body: [フォームコントロールの配列]
+}
+```
+
+フォームコントロールの配列については今から説明します。 フォームコントロールは、次のようなオブジェクトです:
+```javascript
+{
+ id: 'switch1',
+ type: 'switch',
+ label: 'Enable hoge',
+ value: false
+}
+```
+`id` ... コントロールのID。 `type` ... コントロールの種類。後述します。 `label` ... コントロールと一緒に表記するテキスト。 `value` ... コントロールのデフォルト値。
+
+### フォームの操作を受け取る
+ユーザーがフォームを操作すると、ストリームから`update-form`イベントが流れてきます。 イベントの中身には、コントロールのIDと、ユーザーが設定した値が含まれています。 例えば、上で示したスイッチをユーザーがオンにしたとすると、次のイベントが流れてきます:
+```javascript
+{
+ id: 'switch1',
+ value: true
+}
+```
+
+### フォームコントロールの種類
+#### スイッチ
+type: `switch` スイッチを表示します。何かの機能をオン/オフさせたい場合に有用です。
+
+##### プロパティ
+`label` ... スイッチに表記するテキスト。
+
+#### ラジオボタン
+type: `radio` ラジオボタンを表示します。選択肢を提示するのに有用です。例えば、Botの強さを設定させるなどです。
+
+##### プロパティ
+`items` ... ラジオボタンの選択肢。例:
+```javascript
+items: [{
+ label: '弱',
+ value: 1
+}, {
+ label: '中',
+ value: 2
+}, {
+ label: '強',
+ value: 3
+}]
+```
+
+#### スライダー
+type: `slider` スライダーを表示します。
+
+##### プロパティ
+`min` ... スライダーの下限。 `max` ... スライダーの上限。 `step` ... 入力欄で刻むステップ値。
+
+#### テキストボックス
+type: `textbox` テキストボックスを表示します。ユーザーになにか入力させる一般的な用途に利用できます。
+
+## ユーザーにメッセージを表示する
+設定画面でユーザーと対話する、フォーム以外のもうひとつの方法がこれです。ユーザーになにかメッセージを表示することができます。 例えば、ユーザーがBotの対応していないモードやマップを選択したとき、警告を表示するなどです。 メッセージを表示するには、次のメッセージをストリームに送信します:
+```javascript
+{
+ type: 'message',
+ body: {
+ text: 'メッセージ内容',
+ type: 'メッセージの種類'
+ }
+}
+```
+メッセージの種類: `success`, `info`, `warning`, `error`。
+
+## 投了する
+投了をするには、<a href="./api/endpoints/games/reversi/games/surrender">このエンドポイント</a>にリクエストします。
diff --git a/src/docs/pl-PL/stream.md b/src/docs/pl-PL/stream.md
new file mode 100644
index 0000000000..9011c37c5b
--- /dev/null
+++ b/src/docs/pl-PL/stream.md
@@ -0,0 +1,354 @@
+# ストリーミングAPI
+
+ストリーミングAPIを使うと、リアルタイムで様々な情報(例えばタイムラインに新しい投稿が流れてきた、メッセージが届いた、フォローされた、など)を受け取ったり、様々な操作を行ったりすることができます。
+
+## ストリームに接続する
+
+ストリーミングAPIを利用するには、まずMisskeyサーバーに**websocket**接続する必要があります。
+
+以下のURLに、`i`というパラメータ名で認証情報を含めて、websocket接続してください。例:
+```
+%WS_URL%/streaming?i=xxxxxxxxxxxxxxx
+```
+
+認証情報は、自分のAPIキーや、アプリケーションからストリームに接続する際はユーザーのアクセストークンのことを指します。
+
+<div class="ui info">
+ <p><i class="fas fa-info-circle"></i> 認証情報の取得については、<a href="./api">こちらのドキュメント</a>をご確認ください。</p>
+</div>
+
+---
+
+認証情報は省略することもできますが、その場合非ログインでの利用ということになり、受信できる情報や可能な操作は限られます。例:
+
+```
+%WS_URL%/streaming
+```
+
+---
+
+ストリームに接続すると、後述するAPI操作や、投稿の購読を行ったりすることができます。 しかしまだこの段階では、例えばタイムラインへの新しい投稿を受信したりすることはできません。 それを行うには、ストリーム上で、後述する**チャンネル**に接続する必要があります。
+
+**ストリームでのやり取りはすべてJSONです。**
+
+## チャンネル
+MisskeyのストリーミングAPIにはチャンネルという概念があります。これは、送受信する情報を分離するための仕組みです。 Misskeyのストリームに接続しただけでは、まだリアルタイムでタイムラインの投稿を受信したりはできません。 ストリーム上でチャンネルに接続することで、様々な情報を受け取ったり情報を送信したりすることができるようになります。
+
+### チャンネルに接続する
+チャンネルに接続するには、次のようなデータをJSONでストリームに送信します:
+
+```json
+{
+ type: 'connect',
+ body: {
+ channel: 'xxxxxxxx',
+ id: 'foobar',
+ params: {
+ ...
+ }
+ }
+}
+```
+
+ここで、
+* `channel`には接続したいチャンネル名を設定します。チャンネルの種類については後述します。
+* `id`にはそのチャンネルとやり取りするための任意のIDを設定します。ストリームでは様々なメッセージが流れるので、そのメッセージがどのチャンネルからのものなのか識別する必要があるからです。このIDは、UUIDや、乱数のようなもので構いません。
+* `params`はチャンネルに接続する際のパラメータです。チャンネルによって接続時に必要とされるパラメータは異なります。パラメータ不要のチャンネルに接続する際は、このプロパティは省略可能です。
+
+<div class="ui info">
+ <p><i class="fas fa-info-circle"></i> IDはチャンネルごとではなく「チャンネルの接続ごと」です。なぜなら、同じチャンネルに異なるパラメータで複数接続するケースもあるからです。</p>
+</div>
+
+### チャンネルからのメッセージを受け取る
+例えばタイムラインのチャンネルなら、新しい投稿があった時にメッセージを発します。そのメッセージを受け取ることで、タイムラインに新しい投稿がされたことをリアルタイムで知ることができます。
+
+チャンネルがメッセージを発すると、次のようなデータがJSONでストリームに流れてきます:
+```json
+{
+ type: 'channel',
+ body: {
+ id: 'foobar',
+ type: 'something',
+ body: {
+ some: 'thing'
+ }
+ }
+}
+```
+
+ここで、
+* `id`には前述したそのチャンネルに接続する際に設定したIDが設定されています。これで、このメッセージがどのチャンネルからのものなのか知ることができます。
+* `type`にはメッセージの種類が設定されます。チャンネルによって、どのような種類のメッセージが流れてくるかは異なります。
+* `body`にはメッセージの内容が設定されます。チャンネルによって、どのような内容のメッセージが流れてくるかは異なります。
+
+### チャンネルに向けてメッセージを送信する
+チャンネルによっては、メッセージを受け取るだけでなく、こちらから何かメッセージを送信し、何らかの操作を行える場合があります。
+
+チャンネルにメッセージを送信するには、次のようなデータをJSONでストリームに送信します:
+```json
+{
+ type: 'channel',
+ body: {
+ id: 'foobar',
+ type: 'something',
+ body: {
+ some: 'thing'
+ }
+ }
+}
+```
+
+ここで、
+* `id`には前述したそのチャンネルに接続する際に設定したIDを設定します。これで、このメッセージがどのチャンネルに向けたものなのか識別させることができます。
+* `type`にはメッセージの種類を設定します。チャンネルによって、どのような種類のメッセージを受け付けるかは異なります。
+* `body`にはメッセージの内容を設定します。チャンネルによって、どのような内容のメッセージを受け付けるかは異なります。
+
+### チャンネルから切断する
+チャンネルから切断するには、次のようなデータをJSONでストリームに送信します:
+
+```json
+{
+ type: 'disconnect',
+ body: {
+ id: 'foobar'
+ }
+}
+```
+
+ここで、
+* `id`には前述したそのチャンネルに接続する際に設定したIDを設定します。
+
+## ストリームを経由してAPIリクエストする
+
+ストリームを経由してAPIリクエストすると、HTTPリクエストを発生させずにAPIを利用できます。そのため、コードを簡潔にできたり、パフォーマンスの向上を見込めるかもしれません。
+
+ストリームを経由してAPIリクエストするには、次のようなデータをJSONでストリームに送信します:
+```json
+{
+ type: 'api',
+ body: {
+ id: 'xxxxxxxxxxxxxxxx',
+ endpoint: 'notes/create',
+ data: {
+ text: 'yee haw!'
+ }
+ }
+}
+```
+
+ここで、
+* `id`には、APIのレスポンスを識別するための、APIリクエストごとの一意なIDを設定する必要があります。UUIDや、簡単な乱数のようなもので構いません。
+* `endpoint`には、あなたがリクエストしたいAPIのエンドポイントを指定します。
+* `data`には、エンドポイントのパラメータを含めます。
+
+<div class="ui info">
+ <p><i class="fas fa-info-circle"></i> APIのエンドポイントやパラメータについてはAPIリファレンスをご確認ください。</p>
+</div>
+
+### レスポンスの受信
+
+APIへリクエストすると、レスポンスがストリームから次のような形式で流れてきます。
+
+```json
+{
+ type: 'api:xxxxxxxxxxxxxxxx',
+ body: {
+ ...
+ }
+}
+```
+
+ここで、
+* `xxxxxxxxxxxxxxxx`の部分には、リクエストの際に設定された`id`が含まれています。これにより、どのリクエストに対するレスポンスなのか判別することができます。
+* `body`には、レスポンスが含まれています。
+
+## 投稿のキャプチャ
+
+Misskeyは投稿のキャプチャと呼ばれる仕組みを提供しています。これは、指定した投稿のイベントをストリームで受け取る機能です。
+
+例えばタイムラインを取得してユーザーに表示したとします。ここで誰かがそのタイムラインに含まれるどれかの投稿に対してリアクションしたとします。
+
+しかし、クライアントからするとある投稿にリアクションが付いたことなどは知る由がないため、リアルタイムでリアクションをタイムライン上の投稿に反映して表示するといったことができません。
+
+この問題を解決するために、Misskeyは投稿のキャプチャ機構を用意しています。投稿をキャプチャすると、その投稿に関するイベントを受け取ることができるため、リアルタイムでリアクションを反映させたりすることが可能になります。
+
+### 投稿をキャプチャする
+
+投稿をキャプチャするには、ストリームに次のようなメッセージを送信します:
+
+```json
+{
+ type: 'subNote',
+ body: {
+ id: 'xxxxxxxxxxxxxxxx'
+ }
+}
+```
+
+ここで、
+* `id`にキャプチャしたい投稿の`id`を設定します。
+
+このメッセージを送信すると、Misskeyにキャプチャを要請したことになり、以後、その投稿に関するイベントが流れてくるようになります。
+
+例えば投稿にリアクションが付いたとすると、次のようなメッセージが流れてきます:
+
+```json
+{
+ type: 'noteUpdated',
+ body: {
+ id: 'xxxxxxxxxxxxxxxx',
+ type: 'reacted',
+ body: {
+ reaction: 'like',
+ userId: 'yyyyyyyyyyyyyyyy'
+ }
+ }
+}
+```
+
+ここで、
+* `body`内の`id`に、イベントを発生させた投稿のIDが設定されます。
+* `body`内の`type`に、イベントの種類が設定されます。
+* `body`内の`body`に、イベントの詳細が設定されます。
+
+#### イベントの種類
+
+##### `reacted`
+その投稿にリアクションがされた時に発生します。
+
+* `reaction`に、リアクションの種類が設定されます。
+* `userId`に、リアクションを行ったユーザーのIDが設定されます。
+
+例:
+```json
+{
+ type: 'noteUpdated',
+ body: {
+ id: 'xxxxxxxxxxxxxxxx',
+ type: 'reacted',
+ body: {
+ reaction: 'like',
+ userId: 'yyyyyyyyyyyyyyyy'
+ }
+ }
+}
+```
+
+##### `deleted`
+その投稿が削除された時に発生します。
+
+* `deletedAt`に、削除日時が設定されます。
+
+例:
+```json
+{
+ type: 'noteUpdated',
+ body: {
+ id: 'xxxxxxxxxxxxxxxx',
+ type: 'deleted',
+ body: {
+ deletedAt: '2018-10-22T02:17:09.703Z'
+ }
+ }
+}
+```
+
+##### `pollVoted`
+その投稿に添付されたアンケートに投票された時に発生します。
+
+* `choice`に、選択肢IDが設定されます。
+* `userId`に、投票を行ったユーザーのIDが設定されます。
+
+例:
+```json
+{
+ type: 'noteUpdated',
+ body: {
+ id: 'xxxxxxxxxxxxxxxx',
+ type: 'pollVoted',
+ body: {
+ choice: 2,
+ userId: 'yyyyyyyyyyyyyyyy'
+ }
+ }
+}
+```
+
+### 投稿のキャプチャを解除する
+
+その投稿がもう画面に表示されなくなったりして、その投稿に関するイベントをもう受け取る必要がなくなったときは、キャプチャの解除を申請してください。
+
+次のメッセージを送信します:
+
+```json
+{
+ type: 'unsubNote',
+ body: {
+ id: 'xxxxxxxxxxxxxxxx'
+ }
+}
+```
+
+ここで、
+* `id`にキャプチャを解除したい投稿の`id`を設定します。
+
+このメッセージを送信すると、以後、その投稿に関するイベントは流れてこないようになります。
+
+# チャンネル一覧
+## `main`
+アカウントに関する基本的な情報が流れてきます。このチャンネルにパラメータはありません。
+
+### 流れてくるイベント一覧
+
+#### `renote`
+自分の投稿がRenoteされた時に発生するイベントです。自分自身の投稿をRenoteしたときは発生しません。
+
+#### `mention`
+誰かからメンションされたときに発生するイベントです。
+
+#### `readAllNotifications`
+自分宛ての通知がすべて既読になったことを表すイベントです。このイベントを利用して、「通知があることを示すアイコン」のようなものをオフにしたりする等のケースが想定されます。
+
+#### `meUpdated`
+自分の情報が更新されたことを表すイベントです。
+
+#### `follow`
+自分が誰かをフォローしたときに発生するイベントです。
+
+#### `unfollow`
+自分が誰かのフォローを解除したときに発生するイベントです。
+
+#### `followed`
+自分が誰かにフォローされたときに発生するイベントです。
+
+## `homeTimeline`
+ホームタイムラインの投稿情報が流れてきます。このチャンネルにパラメータはありません。
+
+### 流れてくるイベント一覧
+
+#### `note`
+タイムラインに新しい投稿が流れてきたときに発生するイベントです。
+
+## `localTimeline`
+ローカルタイムラインの投稿情報が流れてきます。このチャンネルにパラメータはありません。
+
+### 流れてくるイベント一覧
+
+#### `note`
+ローカルタイムラインに新しい投稿が流れてきたときに発生するイベントです。
+
+## `hybridTimeline`
+ソーシャルタイムラインの投稿情報が流れてきます。このチャンネルにパラメータはありません。
+
+### 流れてくるイベント一覧
+
+#### `note`
+ソーシャルタイムラインに新しい投稿が流れてきたときに発生するイベントです。
+
+## `globalTimeline`
+グローバルタイムラインの投稿情報が流れてきます。このチャンネルにパラメータはありません。
+
+### 流れてくるイベント一覧
+
+#### `note`
+グローバルタイムラインに新しい投稿が流れてきたときに発生するイベントです。
diff --git a/src/docs/pl-PL/theme.md b/src/docs/pl-PL/theme.md
new file mode 100644
index 0000000000..4e52ee8cd7
--- /dev/null
+++ b/src/docs/pl-PL/theme.md
@@ -0,0 +1,68 @@
+# テーマ
+
+テーマを設定して、Misskeyクライアントの見た目を変更できます。
+
+## テーマの設定
+設定 > テーマ
+
+## テーマを作成する
+テーマコードはJSON5で記述されたテーマオブジェクトです。 テーマは以下のようなオブジェクトです。
+``` js
+{
+ id: '17587283-dd92-4a2c-a22c-be0637c9e22a',
+
+ name: 'Danboard',
+ author: 'syuilo',
+
+ base: 'light',
+
+ props: {
+ accent: 'rgb(218, 141, 49)',
+ bg: 'rgb(218, 212, 190)',
+ fg: 'rgb(115, 108, 92)',
+ panel: 'rgb(236, 232, 220)',
+ renote: 'rgb(100, 152, 106)',
+ link: 'rgb(100, 152, 106)',
+ mention: '@accent',
+ hashtag: 'rgb(100, 152, 106)',
+ header: 'rgba(239, 227, 213, 0.75)',
+ navBg: 'rgb(216, 206, 182)',
+ inputBorder: 'rgba(0, 0, 0, 0.1)',
+ },
+}
+
+```
+
+* `id` ... テーマの一意なID。UUIDをおすすめします。
+* `name` ... テーマ名
+* `author` ... テーマの作者
+* `desc` ... テーマの説明(オプション)
+* `base` ... 明るいテーマか、暗いテーマか
+ * `light`にすると明るいテーマになり、`dark`にすると暗いテーマになります。
+ * テーマはここで設定されたベーステーマを継承します。
+* `props` ... テーマのスタイル定義。これから説明します。
+
+### テーマのスタイル定義
+`props`下にはテーマのスタイルを定義します。 キーがCSSの変数名になり、バリューで中身を指定します。 なお、この`props`オブジェクトはベーステーマから継承されます。 ベーステーマは、このテーマの`base`が`light`なら[_light.json5](https://github.com/syuilo/misskey/blob/develop/src/client/themes/_light.json5)で、`dark`なら[_dark.json5](https://github.com/syuilo/misskey/blob/develop/src/client/themes/_dark.json5)です。 つまり、このテーマ内の`props`に`panel`というキーが無くても、そこにはベーステーマの`panel`があると見なされます。
+
+#### バリューで使える構文
+* 16進数で表された色
+ * 例: `#00ff00`
+* `rgb(r, g, b)`形式で表された色
+ * 例: `rgb(0, 255, 0)`
+* `rgb(r, g, b, a)`形式で表された透明度を含む色
+ * 例: `rgba(0, 255, 0, 0.5)`
+* 他のキーの値の参照
+ * `@{キー名}`と書くと他のキーの値の参照になります。`{キー名}`は参照したいキーの名前に置き換えます。
+ * 例: `@panel`
+* 定数(後述)の参照
+ * `${定数名}`と書くと定数の参照になります。`{定数名}`は参照したい定数の名前に置き換えます。
+ * 例: `$main`
+* 関数(後述)
+ * `:{関数名}<{引数}<{色}`
+
+#### 定数
+「CSS変数として出力はしたくないが、他のCSS変数の値として使いまわしたい」値があるときは、定数を使うと便利です。 キー名を`$`で始めると、そのキーはCSS変数として出力されません。
+
+#### 関数
+wip
diff --git a/src/docs/pl-PL/timelines.md b/src/docs/pl-PL/timelines.md
new file mode 100644
index 0000000000..36ba61bd2d
--- /dev/null
+++ b/src/docs/pl-PL/timelines.md
@@ -0,0 +1,15 @@
+# タイムラインの比較
+
+https://docs.google.com/spreadsheets/d/1lxQ2ugKrhz58Bg96HTDK_2F98BUritkMyIiBkOByjHA/edit?usp=sharing
+
+## ホーム
+自分のフォローしているユーザーの投稿
+
+## ローカル
+全てのローカルユーザーの「ホーム」指定されていない投稿
+
+## ソーシャル
+自分のフォローしているユーザーの投稿と、全てのローカルユーザーの「ホーム」指定されていない投稿
+
+## グローバル
+全てのローカルユーザーの「ホーム」指定されていない投稿と、サーバーに届いた全てのリモートユーザーの「ホーム」指定されていない投稿
diff --git a/src/docs/pt-PT/aiscript.md b/src/docs/pt-PT/aiscript.md
new file mode 100644
index 0000000000..6c28b446e3
--- /dev/null
+++ b/src/docs/pt-PT/aiscript.md
@@ -0,0 +1,4 @@
+# AiScript
+
+## 関数
+デフォルトで値渡しです。
diff --git a/src/docs/pt-PT/api.md b/src/docs/pt-PT/api.md
new file mode 100644
index 0000000000..76019b6145
--- /dev/null
+++ b/src/docs/pt-PT/api.md
@@ -0,0 +1,58 @@
+# Misskey API
+
+MisskeyAPIを使ってMisskeyクライアント、Misskey連携Webサービス、Bot等(以下「アプリケーション」と呼びます)を開発できます。 ストリーミングAPIもあるので、リアルタイム性のあるアプリケーションを作ることも可能です。
+
+APIを使い始めるには、まずアクセストークンを取得する必要があります。 このドキュメントでは、アクセストークンを取得する手順を説明した後、基本的なAPIの使い方を説明します。
+
+## アクセストークンの取得
+基本的に、APIはリクエストにはアクセストークンが必要となります。 APIにリクエストするのが自分自身なのか、不特定の利用者に使ってもらうアプリケーションなのかによって取得手順は異なります。
+
+* 前者の場合: [「自分自身のアクセストークンを手動発行する」](#自分自身のアクセストークンを手動発行する)に進む
+* 後者の場合: [「アプリケーション利用者にアクセストークンの発行をリクエストする」](#アプリケーション利用者にアクセストークンの発行をリクエストする)に進む
+
+### 自分自身のアクセストークンを手動発行する
+「設定 > API」で、自分のアクセストークンを発行できます。
+
+[「APIの使い方」へ進む](#APIの使い方)
+
+### アプリケーション利用者にアクセストークンの発行をリクエストする
+アプリケーション利用者のアクセストークンを取得するには、以下の手順で発行をリクエストします。
+
+#### Step 1
+
+UUIDを生成する。以後これをセッションIDと呼びます。
+
+> このセッションIDは毎回生成し、使いまわさないようにしてください。
+
+#### Step 2
+
+`{_URL_}/miauth/{session}`をユーザーのブラウザで表示させる。`{session}`の部分は、セッションIDに置き換えてください。
+> 例: `{_URL_}/miauth/c1f6d42b-468b-4fd2-8274-e58abdedef6f`
+
+表示する際、URLにクエリパラメータとしていくつかのオプションを設定できます:
+* `name` ... アプリケーション名
+ * > 例: `MissDeck`
+* `icon` ... アプリケーションのアイコン画像URL
+ * > 例: `https://missdeck.example.com/icon.png`
+* `callback` ... 認証が終わった後にリダイレクトするURL
+ * > 例: `https://missdeck.example.com/callback`
+ * リダイレクト時には、`session`というクエリパラメータでセッションIDが付きます
+* `permission` ... アプリケーションが要求する権限
+ * > 例: `write:notes,write:following,read:drive`
+ * 要求する権限を`,`で区切って列挙します
+ * どのような権限があるかは[APIリファレンス](/api-doc)で確認できます
+
+#### Step 3
+ユーザーが発行を許可した後、`{_URL_}/api/miauth/{session}/check`にPOSTリクエストすると、レスポンスとしてアクセストークンを含むJSONが返ります。
+
+レスポンスに含まれるプロパティ:
+* `token` ... ユーザーのアクセストークン
+* `user` ... ユーザーの情報
+
+[「APIの使い方」へ進む](#APIの使い方)
+
+## APIの使い方
+**APIはすべてPOSTで、リクエスト/レスポンスともにJSON形式です。RESTではありません。** アクセストークンは、`i`というパラメータ名でリクエストに含めます。
+
+* [APIリファレンス](/api-doc)
+* [ストリーミングAPI](./stream)
diff --git a/src/docs/pt-PT/create-plugin.md b/src/docs/pt-PT/create-plugin.md
new file mode 100644
index 0000000000..0d2fa19178
--- /dev/null
+++ b/src/docs/pt-PT/create-plugin.md
@@ -0,0 +1,74 @@
+# プラグインの作成
+Misskey Webクライアントのプラグイン機能を使うと、クライアントを拡張し、様々な機能を追加できます。 ここではプラグインの作成にあたってのメタデータ定義や、AiScript APIリファレンスを掲載します。
+
+## メタデータ
+プラグインは、AiScriptのメタデータ埋め込み機能を使って、デフォルトとしてプラグインのメタデータを定義する必要があります。 メタデータは次のプロパティを含むオブジェクトです。
+
+### name
+プラグイン名
+
+### author
+プラグイン作者
+
+### version
+プラグインバージョン。数値を指定してください。
+
+### description
+プラグインの説明
+
+### permissions
+プラグインが要求する権限。MisskeyAPIにリクエストする際に用いられます。
+
+### config
+プラグインの設定情報を表すオブジェクト。 キーに設定名、値に以下のプロパティを含めます。
+
+#### type
+設定値の種類を表す文字列。以下から選択します。 string number boolean
+
+#### label
+ユーザーに表示する設定名
+
+#### description
+設定の説明
+
+#### default
+設定のデフォルト値
+
+## APIリファレンス
+AiScript標準で組み込まれているAPIは掲載しません。
+
+### Mk:dialog(title text type)
+ダイアログを表示します。typeには以下の値が設定できます。 info success warn error question 省略すると info になります。
+
+### Mk:confirm(title text type)
+確認ダイアログを表示します。typeには以下の値が設定できます。 info success warn error question 省略すると question になります。 ユーザーが"OK"を選択した場合は true を、"キャンセル"を選択した場合は false が返ります。
+
+### Mk:api(endpoint params)
+Misskey APIにリクエストします。第一引数にエンドポイント名、第二引数にパラメータオブジェクトを渡します。
+
+### Mk:save(key value)
+任意の値に任意の名前を付けて永続化します。永続化した値は、AiScriptコンテキストが終了しても残り、Mk:loadで読み取ることができます。
+
+### Mk:load(key)
+Mk:saveで永続化した指定の名前の値を読み取ります。
+
+### Plugin:register_post_form_action(title fn)
+投稿フォームにアクションを追加します。第一引数にアクション名、第二引数にアクションが選択された際のコールバック関数を渡します。 コールバック関数には、第一引数に投稿フォームオブジェクトが渡されます。
+
+### Plugin:register_note_action(title fn)
+ノートメニューに項目を追加します。第一引数に項目名、第二引数に項目が選択された際のコールバック関数を渡します。 コールバック関数には、第一引数に対象のノートオブジェクトが渡されます。
+
+### Plugin:register_user_action(title fn)
+ユーザーメニューに項目を追加します。第一引数に項目名、第二引数に項目が選択された際のコールバック関数を渡します。 コールバック関数には、第一引数に対象のユーザーオブジェクトが渡されます。
+
+### Plugin:register_note_view_interruptor(fn)
+UIに表示されるノート情報を書き換えます。 コールバック関数には、第一引数に対象のノートオブジェクトが渡されます。 コールバック関数の返り値でノートが書き換えられます。
+
+### Plugin:register_note_post_interruptor(fn)
+ノート投稿時にノート情報を書き換えます。 コールバック関数には、第一引数に対象のノートオブジェクトが渡されます。 コールバック関数の返り値でノートが書き換えられます。
+
+### Plugin:open_url(url)
+第一引数に渡されたURLをブラウザの新しいタブで開きます。
+
+### Plugin:config
+プラグインの設定が格納されるオブジェクト。プラグイン定義のconfigで設定したキーで値が入ります。
diff --git a/src/docs/pt-PT/custom-emoji.md b/src/docs/pt-PT/custom-emoji.md
new file mode 100644
index 0000000000..ed2e92be16
--- /dev/null
+++ b/src/docs/pt-PT/custom-emoji.md
@@ -0,0 +1,2 @@
+# カスタム絵文字
+カスタム絵文字は、インスタンスで用意された画像を絵文字のように使える機能です。 ノート、リアクション、チャット、自己紹介、名前などの場所で使うことができます。 カスタム絵文字をそれらの場所で使うには、絵文字ピッカーボタン(ある場合)を押すか、`:`を入力して絵文字サジェストを表示します。 テキスト内に`:foo:`のような形式の文字列が見つかると、`foo`の部分がカスタム絵文字名と解釈され、表示時には対応したカスタム絵文字に置き換わります。
diff --git a/src/docs/pt-PT/deck.md b/src/docs/pt-PT/deck.md
new file mode 100644
index 0000000000..8057e262fd
--- /dev/null
+++ b/src/docs/pt-PT/deck.md
@@ -0,0 +1,18 @@
+# デッキ
+
+デッキは利用可能なUIのひとつです。「カラム」と呼ばれるビューを複数並べて表示させることで、カスタマイズ性が高く、情報量の多いUIが構築できることが特徴です。
+
+## カラムの追加
+デッキの背景を右クリックし、「カラムを追加」して任意のカラムを追加できます。
+
+## カラムの移動
+カラムは、ドラッグアンドドロップで他のカラムと位置を入れ替えることが出来るほか、カラムメニュー(カラムのヘッダー右クリック)から位置を移動させることもできます。
+
+## カラムの水平分割
+カラムは左右だけでなく、上下に並べることもできます。 カラムメニューを開き、「左に重ねる」を選択すると、左のカラムの下に現在のカラムが移動します。 上下分割を解除するには、カラムメニューの「右に出す」を選択します。
+
+## カラムの設定
+カラムメニューの「編集」を選択するとカラムの設定を編集できます。カラムの名前を変えたり、幅を変えたりできます。
+
+## デッキの設定
+デッキに関する設定は、[settings/deck](/settings/deck)で行えます。
diff --git a/src/docs/pt-PT/follow.md b/src/docs/pt-PT/follow.md
new file mode 100644
index 0000000000..3c1ea7bbe0
--- /dev/null
+++ b/src/docs/pt-PT/follow.md
@@ -0,0 +1,2 @@
+# フォロー
+ユーザーをフォローすると、タイムラインにそのユーザーの投稿が表示されるようになります。ただし、他のユーザーに対する返信は含まれません。 ユーザーをフォローするには、ユーザーページの「フォロー」ボタンをクリックします。フォローを解除するには、もう一度クリックします。
diff --git a/src/docs/pt-PT/keyboard-shortcut.md b/src/docs/pt-PT/keyboard-shortcut.md
new file mode 100644
index 0000000000..957ca838c9
--- /dev/null
+++ b/src/docs/pt-PT/keyboard-shortcut.md
@@ -0,0 +1,68 @@
+# キーボードショートカット
+
+## グローバル
+これらのショートカットは基本的にどこでも使えます。
+<table>
+ <thead>
+ <tr><th>ショートカット</th><th>効果</th><th>由来</th></tr>
+ </thead>
+ <tbody>
+ <tr><td><kbd class="key">P</kbd>, <kbd class="key">N</kbd></td><td>新規投稿</td><td><b>P</b>ost, <b>N</b>ew, <b>N</b>ote</td></tr>
+ <tr><td><kbd class="key">T</kbd></td><td>タイムラインの最も新しい投稿にフォーカス</td><td><b>T</b>imeline, <b>T</b>op</td></tr>
+ <tr><td><kbd class="group"><kbd class="key">Shift</kbd> + <kbd class="key">N</kbd></kbd></td><td>通知を表示/隠す</td><td><b>N</b>otifications</td></tr>
+ <tr><td><kbd class="key">S</kbd></td><td>検索</td><td><b>S</b>earch</td></tr>
+ <tr><td><kbd class="key">H</kbd>, <kbd class="key">?</kbd></td><td>ヘルプを表示</td><td><b>H</b>elp</td></tr>
+ </tbody>
+</table>
+
+## 投稿にフォーカスされた状態
+
+<table>
+ <thead>
+ <tr><th>ショートカット</th><th>効果</th><th>由来</th></tr>
+ </thead>
+ <tbody>
+ <tr><td><kbd class="key">↑</kbd>, <kbd class="key">K</kbd>, <kbd class="group"><kbd class="key">Shift</kbd> + <kbd class="key">Tab</kbd></kbd></td><td>上の投稿にフォーカスを移動</td><td>-</td></tr>
+ <tr><td><kbd class="key">↓</kbd>, <kbd class="key">J</kbd>, <kbd class="key">Tab</kbd></td><td>下の投稿にフォーカスを移動</td><td>-</td></tr>
+ <tr><td><kbd class="key">R</kbd></td><td>返信フォームを開く</td><td><b>R</b>eply</td></tr>
+ <tr><td><kbd class="key">Q</kbd></td><td>Renoteフォームを開く</td><td><b>Q</b>uote</td></tr>
+ <tr><td><kbd class="group"><kbd class="key">Ctrl</kbd> + <kbd class="key">Q</kbd></kbd></td><td>即刻Renoteする(フォームを開かずに)</td><td>-</td></tr>
+ <tr><td><kbd class="key">E</kbd>, <kbd class="key">A</kbd>, <kbd class="key">+</kbd></td><td>リアクションフォームを開く</td><td><b>E</b>mote, re<b>A</b>ction</td></tr>
+ <tr><td><kbd class="key">0</kbd>~<kbd class="key">9</kbd></td><td>数字に対応したリアクションをする(対応については後述)</td><td>-</td></tr>
+ <tr><td><kbd class="key">F</kbd>, <kbd class="key">B</kbd></td><td>お気に入りに登録</td><td><b>F</b>avorite, <b>B</b>ookmark</td></tr>
+ <tr><td><kbd class="key">Del</kbd>, <kbd class="group"><kbd class="key">Ctrl</kbd> + <kbd class="key">D</kbd></kbd></td><td>投稿を削除</td><td><b>D</b>elete</tr>
+ <tr><td><kbd class="key">M</kbd>, <kbd class="key">O</kbd></td><td>投稿に対するメニューを開く</td><td><b>M</b>ore, <b>O</b>ther</td></tr>
+ <tr><td><kbd class="key">S</kbd></td><td>CWで隠された部分を表示 or 隠す</td><td><b>S</b>how, <b>S</b>ee</td></tr>
+ <tr><td><kbd class="key">Esc</kbd></td><td>フォーカスを外す</td><td>-</td></tr>
+ </tbody>
+</table>
+
+## Renoteフォーム
+
+<table>
+ <thead>
+ <tr><th>ショートカット</th><th>効果</th><th>由来</th></tr>
+ </thead>
+ <tbody>
+ <tr><td><kbd class="key">Enter</kbd></td><td>Renoteする</td><td>-</td></tr>
+ <tr><td><kbd class="key">Q</kbd></td><td>フォームを展開する</td><td><b>Q</b>uote</td></tr>
+ <tr><td><kbd class="key">Esc</kbd></td><td>フォームを閉じる</td><td>-</td></tr>
+ </tbody>
+</table>
+
+## リアクションフォーム
+デフォルトで「👍」にフォーカスが当たっている状態です。
+<table>
+ <thead>
+ <tr><th>ショートカット</th><th>効果</th><th>由来</th></tr>
+ </thead>
+ <tbody>
+ <tr><td><kbd class="key">↑</kbd>, <kbd class="key">K</kbd></td><td>上のリアクションにフォーカスを移動</td><td>-</td></tr>
+ <tr><td><kbd class="key">↓</kbd>, <kbd class="key">J</kbd></td><td>下のリアクションにフォーカスを移動</td><td>-</td></tr>
+ <tr><td><kbd class="key">←</kbd>, <kbd class="key">H</kbd>, <kbd class="group"><kbd class="key">Shift</kbd> + <kbd class="key">Tab</kbd></kbd></td><td>左のリアクションにフォーカスを移動</td><td>-</td></tr>
+ <tr><td><kbd class="key">→</kbd>, <kbd class="key">L</kbd>, <kbd class="key">Tab</kbd></td><td>右のリアクションにフォーカスを移動</td><td>-</td></tr>
+ <tr><td><kbd class="key">Enter</kbd>, <kbd class="key">Space</kbd>, <kbd class="key">+</kbd></td><td>リアクション確定</td><td>-</td></tr>
+ <tr><td><kbd class="key">0</kbd>~<kbd class="key">9</kbd></td><td>数字に対応したリアクションで確定</td><td>-</td></tr>
+ <tr><td><kbd class="key">Esc</kbd></td><td>リアクションするのをやめる</td><td>-</td></tr>
+ </tbody>
+</table>
diff --git a/src/docs/pt-PT/mfm.md b/src/docs/pt-PT/mfm.md
new file mode 100644
index 0000000000..e237287acc
--- /dev/null
+++ b/src/docs/pt-PT/mfm.md
@@ -0,0 +1,2 @@
+# MFM
+MFMは、Misskey Flavored Markdownの略で、Misskeyの様々な場所で使用できる専用のマークアップ言語です。 MFMで使用可能な構文は[MFMチートシート](/mfm-cheat-sheet)で確認できます。
diff --git a/src/docs/pt-PT/mute.md b/src/docs/pt-PT/mute.md
new file mode 100644
index 0000000000..6a9608662a
--- /dev/null
+++ b/src/docs/pt-PT/mute.md
@@ -0,0 +1,13 @@
+# ミュート
+
+ユーザーをミュートすると、そのユーザーに関する次のコンテンツがMisskeyに表示されなくなります:
+
+* タイムラインや投稿の検索結果内の、そのユーザーの投稿(およびそれらの投稿に対する返信やRenote)
+* そのユーザーからの通知
+* メッセージ履歴一覧内の、そのユーザーとのメッセージ履歴
+
+ユーザーをミュートするには、対象のユーザーのユーザーページに表示されている「ミュート」ボタンを押します。
+
+ミュートを行ったことは相手に通知されず、ミュートされていることを知ることもできません。
+
+設定>ミュート から、自分がミュートしているユーザー一覧を確認することができます。
diff --git a/src/docs/pt-PT/pages.md b/src/docs/pt-PT/pages.md
new file mode 100644
index 0000000000..a7311b95e6
--- /dev/null
+++ b/src/docs/pt-PT/pages.md
@@ -0,0 +1,10 @@
+# Pages
+
+## 変数
+変数を使うことで動的なページを作成できます。テキスト内で <b>{ 変数名 }</b> と書くとそこに変数の値を埋め込めます。例えば <b>Hello { thing } world!</b> というテキストで、変数(thing)の値が <b>ai</b> だった場合、テキストは <b>Hello ai world!</b> になります。
+
+変数の評価(値を算出すること)は上から下に行われるので、ある変数の中で自分より下の変数を参照することはできません。例えば上から <b>A、B、C</b> と3つの変数を定義したとき、<b>C</b>の中で<b>A</b>や<b>B</b>を参照することはできますが、<b>A</b>の中で<b>B</b>や<b>C</b>を参照することはできません。
+
+ユーザーからの入力を受け取るには、ページに「ユーザー入力」ブロックを設置し、「変数名」に入力を格納したい変数名を設定します(変数は自動で作成されます)。その変数を使ってユーザー入力に応じた動作を行えます。
+
+関数を使うと、値の算出処理を再利用可能な形にまとめることができます。関数を作るには、「関数」タイプの変数を作成します。関数にはスロット(引数)を設定することができ、スロットの値は関数内で変数として利用可能です。また、関数を引数に取る関数(高階関数と呼ばれます)も存在します。関数は予め定義しておくほかに、このような高階関数のスロットに即席でセットすることもできます。
diff --git a/src/docs/pt-PT/reaction.md b/src/docs/pt-PT/reaction.md
new file mode 100644
index 0000000000..c26ead75b3
--- /dev/null
+++ b/src/docs/pt-PT/reaction.md
@@ -0,0 +1,11 @@
+# リアクション
+他の人のノートに、絵文字を付けて簡単にあなたの反応を伝えられる機能です。 リアクションするには、ノートの + アイコンをクリックしてピッカーを表示し、絵文字を選択します。 リアクションには[カスタム絵文字](./custom-emoji)も使用できます。
+
+## リアクションピッカーのカスタマイズ
+ピッカーに表示される絵文字を自分好みにカスタマイズすることができます。 設定の「リアクション」で設定します。
+
+## リモート投稿へのリアクションについて
+リアクションはMisskeyオリジナルの機能であるため、リモートインスタンスがMisskeyでない限りは、ほとんどの場合「Like」としてアクティビティが送信されます。一般的にはLikeは「お気に入り」として実装されているようです。 また、相手がMisskeyであったとしても、カスタム絵文字リアクションは伝わらず、自動的に「👍」等にフォールバックされます。
+
+## リモートからのリアクションについて
+リモートから「Like」アクティビティを受信したとき、Misskeyでは「👍」のリアクションとして解釈されます。
diff --git a/src/docs/pt-PT/reversi-bot.md b/src/docs/pt-PT/reversi-bot.md
new file mode 100644
index 0000000000..7ab2a7212e
--- /dev/null
+++ b/src/docs/pt-PT/reversi-bot.md
@@ -0,0 +1,160 @@
+# MisskeyリバーシBotの開発
+Misskeyのリバーシ機能に対応したBotの開発方法をここに記します。
+
+1. `games/reversi`ストリームに以下のパラメータを付けて接続する:
+ * `i`: botアカウントのAPIキー
+
+2. 対局への招待が来たら、ストリームから`invited`イベントが流れてくる
+ * イベントの中身に、`parent`という名前で対局へ誘ってきたユーザーの情報が含まれている
+
+3. `games/reversi/match`へ、`user_id`として`parent`の`id`が含まれたリクエストを送信する
+
+4. 上手くいくとゲーム情報が返ってくるので、`games/reversi-game`ストリームへ、以下のパラメータを付けて接続する:
+ * `i`: botアカウントのAPIキー
+ * `game`: `game`の`id`
+
+5. この間、相手がゲームの設定を変更するとその都度`update-settings`イベントが流れてくるので、必要であれば何かしらの処理を行う
+
+6. 設定に満足したら、`{ type: 'accept' }`メッセージをストリームに送信する
+
+7. ゲームが開始すると、`started`イベントが流れてくる
+ * イベントの中身にはゲーム情報が含まれている
+
+8. 石を打つには、ストリームに`{ type: 'set', pos: <位置> }`を送信する(位置の計算方法は後述)
+
+9. 相手または自分が石を打つと、ストリームから`set`イベントが流れてくる
+ * `color`として石の色が含まれている
+ * `pos`として位置情報が含まれている
+
+## 位置の計算法
+8x8のマップを考える場合、各マスの位置(インデックスと呼びます)は次のようになっています:
+```
++--+--+--+--+--+--+--+--+
+| 0| 1| 2| 3| 4| 5| 6| 7|
++--+--+--+--+--+--+--+--+
+| 8| 9|10|11|12|13|14|15|
++--+--+--+--+--+--+--+--+
+|16|17|18|19|20|21|22|23|
+...
+```
+
+### X,Y座標 から インデックス に変換する
+```
+pos = x + (y * mapWidth)
+```
+`mapWidth`は、ゲーム情報の`map`から、次のようにして計算できます:
+```
+mapWidth = map[0].length
+```
+
+### インデックス から X,Y座標 に変換する
+```
+x = pos % mapWidth
+y = Math.floor(pos / mapWidth)
+```
+
+## マップ情報
+マップ情報は、ゲーム情報の`map`に入っています。 文字列の配列になっており、ひとつひとつの文字がマス情報を表しています。 それをもとにマップのデザインを知る事が出来ます:
+* `(スペース)` ... マス無し
+* `-` ... マス
+* `b` ... 初期配置される黒石
+* `w` ... 初期配置される白石
+
+例えば、4*4の次のような単純なマップがあるとします:
+```text
++---+---+---+---+
+| | | | |
++---+---+---+---+
+| | ○ | ● | |
++---+---+---+---+
+| | ● | ○ | |
++---+---+---+---+
+| | | | |
++---+---+---+---+
+```
+
+この場合、マップデータはこのようになります:
+```javascript
+['----', '-wb-', '-bw-', '----']
+```
+
+## ユーザーにフォームを提示して対話可能Botを作成する
+ユーザーとのコミュニケーションを行うため、ゲームの設定画面でユーザーにフォームを提示することができます。 例えば、Botの強さをユーザーが設定できるようにする、といったシナリオが考えられます。
+
+フォームを提示するには、`reversi-game`ストリームに次のメッセージを送信します:
+```javascript
+{
+ type: 'init-form',
+ body: [フォームコントロールの配列]
+}
+```
+
+フォームコントロールの配列については今から説明します。 フォームコントロールは、次のようなオブジェクトです:
+```javascript
+{
+ id: 'switch1',
+ type: 'switch',
+ label: 'Enable hoge',
+ value: false
+}
+```
+`id` ... コントロールのID。 `type` ... コントロールの種類。後述します。 `label` ... コントロールと一緒に表記するテキスト。 `value` ... コントロールのデフォルト値。
+
+### フォームの操作を受け取る
+ユーザーがフォームを操作すると、ストリームから`update-form`イベントが流れてきます。 イベントの中身には、コントロールのIDと、ユーザーが設定した値が含まれています。 例えば、上で示したスイッチをユーザーがオンにしたとすると、次のイベントが流れてきます:
+```javascript
+{
+ id: 'switch1',
+ value: true
+}
+```
+
+### フォームコントロールの種類
+#### スイッチ
+type: `switch` スイッチを表示します。何かの機能をオン/オフさせたい場合に有用です。
+
+##### プロパティ
+`label` ... スイッチに表記するテキスト。
+
+#### ラジオボタン
+type: `radio` ラジオボタンを表示します。選択肢を提示するのに有用です。例えば、Botの強さを設定させるなどです。
+
+##### プロパティ
+`items` ... ラジオボタンの選択肢。例:
+```javascript
+items: [{
+ label: '弱',
+ value: 1
+}, {
+ label: '中',
+ value: 2
+}, {
+ label: '強',
+ value: 3
+}]
+```
+
+#### スライダー
+type: `slider` スライダーを表示します。
+
+##### プロパティ
+`min` ... スライダーの下限。 `max` ... スライダーの上限。 `step` ... 入力欄で刻むステップ値。
+
+#### テキストボックス
+type: `textbox` テキストボックスを表示します。ユーザーになにか入力させる一般的な用途に利用できます。
+
+## ユーザーにメッセージを表示する
+設定画面でユーザーと対話する、フォーム以外のもうひとつの方法がこれです。ユーザーになにかメッセージを表示することができます。 例えば、ユーザーがBotの対応していないモードやマップを選択したとき、警告を表示するなどです。 メッセージを表示するには、次のメッセージをストリームに送信します:
+```javascript
+{
+ type: 'message',
+ body: {
+ text: 'メッセージ内容',
+ type: 'メッセージの種類'
+ }
+}
+```
+メッセージの種類: `success`, `info`, `warning`, `error`。
+
+## 投了する
+投了をするには、<a href="./api/endpoints/games/reversi/games/surrender">このエンドポイント</a>にリクエストします。
diff --git a/src/docs/pt-PT/stream.md b/src/docs/pt-PT/stream.md
new file mode 100644
index 0000000000..9011c37c5b
--- /dev/null
+++ b/src/docs/pt-PT/stream.md
@@ -0,0 +1,354 @@
+# ストリーミングAPI
+
+ストリーミングAPIを使うと、リアルタイムで様々な情報(例えばタイムラインに新しい投稿が流れてきた、メッセージが届いた、フォローされた、など)を受け取ったり、様々な操作を行ったりすることができます。
+
+## ストリームに接続する
+
+ストリーミングAPIを利用するには、まずMisskeyサーバーに**websocket**接続する必要があります。
+
+以下のURLに、`i`というパラメータ名で認証情報を含めて、websocket接続してください。例:
+```
+%WS_URL%/streaming?i=xxxxxxxxxxxxxxx
+```
+
+認証情報は、自分のAPIキーや、アプリケーションからストリームに接続する際はユーザーのアクセストークンのことを指します。
+
+<div class="ui info">
+ <p><i class="fas fa-info-circle"></i> 認証情報の取得については、<a href="./api">こちらのドキュメント</a>をご確認ください。</p>
+</div>
+
+---
+
+認証情報は省略することもできますが、その場合非ログインでの利用ということになり、受信できる情報や可能な操作は限られます。例:
+
+```
+%WS_URL%/streaming
+```
+
+---
+
+ストリームに接続すると、後述するAPI操作や、投稿の購読を行ったりすることができます。 しかしまだこの段階では、例えばタイムラインへの新しい投稿を受信したりすることはできません。 それを行うには、ストリーム上で、後述する**チャンネル**に接続する必要があります。
+
+**ストリームでのやり取りはすべてJSONです。**
+
+## チャンネル
+MisskeyのストリーミングAPIにはチャンネルという概念があります。これは、送受信する情報を分離するための仕組みです。 Misskeyのストリームに接続しただけでは、まだリアルタイムでタイムラインの投稿を受信したりはできません。 ストリーム上でチャンネルに接続することで、様々な情報を受け取ったり情報を送信したりすることができるようになります。
+
+### チャンネルに接続する
+チャンネルに接続するには、次のようなデータをJSONでストリームに送信します:
+
+```json
+{
+ type: 'connect',
+ body: {
+ channel: 'xxxxxxxx',
+ id: 'foobar',
+ params: {
+ ...
+ }
+ }
+}
+```
+
+ここで、
+* `channel`には接続したいチャンネル名を設定します。チャンネルの種類については後述します。
+* `id`にはそのチャンネルとやり取りするための任意のIDを設定します。ストリームでは様々なメッセージが流れるので、そのメッセージがどのチャンネルからのものなのか識別する必要があるからです。このIDは、UUIDや、乱数のようなもので構いません。
+* `params`はチャンネルに接続する際のパラメータです。チャンネルによって接続時に必要とされるパラメータは異なります。パラメータ不要のチャンネルに接続する際は、このプロパティは省略可能です。
+
+<div class="ui info">
+ <p><i class="fas fa-info-circle"></i> IDはチャンネルごとではなく「チャンネルの接続ごと」です。なぜなら、同じチャンネルに異なるパラメータで複数接続するケースもあるからです。</p>
+</div>
+
+### チャンネルからのメッセージを受け取る
+例えばタイムラインのチャンネルなら、新しい投稿があった時にメッセージを発します。そのメッセージを受け取ることで、タイムラインに新しい投稿がされたことをリアルタイムで知ることができます。
+
+チャンネルがメッセージを発すると、次のようなデータがJSONでストリームに流れてきます:
+```json
+{
+ type: 'channel',
+ body: {
+ id: 'foobar',
+ type: 'something',
+ body: {
+ some: 'thing'
+ }
+ }
+}
+```
+
+ここで、
+* `id`には前述したそのチャンネルに接続する際に設定したIDが設定されています。これで、このメッセージがどのチャンネルからのものなのか知ることができます。
+* `type`にはメッセージの種類が設定されます。チャンネルによって、どのような種類のメッセージが流れてくるかは異なります。
+* `body`にはメッセージの内容が設定されます。チャンネルによって、どのような内容のメッセージが流れてくるかは異なります。
+
+### チャンネルに向けてメッセージを送信する
+チャンネルによっては、メッセージを受け取るだけでなく、こちらから何かメッセージを送信し、何らかの操作を行える場合があります。
+
+チャンネルにメッセージを送信するには、次のようなデータをJSONでストリームに送信します:
+```json
+{
+ type: 'channel',
+ body: {
+ id: 'foobar',
+ type: 'something',
+ body: {
+ some: 'thing'
+ }
+ }
+}
+```
+
+ここで、
+* `id`には前述したそのチャンネルに接続する際に設定したIDを設定します。これで、このメッセージがどのチャンネルに向けたものなのか識別させることができます。
+* `type`にはメッセージの種類を設定します。チャンネルによって、どのような種類のメッセージを受け付けるかは異なります。
+* `body`にはメッセージの内容を設定します。チャンネルによって、どのような内容のメッセージを受け付けるかは異なります。
+
+### チャンネルから切断する
+チャンネルから切断するには、次のようなデータをJSONでストリームに送信します:
+
+```json
+{
+ type: 'disconnect',
+ body: {
+ id: 'foobar'
+ }
+}
+```
+
+ここで、
+* `id`には前述したそのチャンネルに接続する際に設定したIDを設定します。
+
+## ストリームを経由してAPIリクエストする
+
+ストリームを経由してAPIリクエストすると、HTTPリクエストを発生させずにAPIを利用できます。そのため、コードを簡潔にできたり、パフォーマンスの向上を見込めるかもしれません。
+
+ストリームを経由してAPIリクエストするには、次のようなデータをJSONでストリームに送信します:
+```json
+{
+ type: 'api',
+ body: {
+ id: 'xxxxxxxxxxxxxxxx',
+ endpoint: 'notes/create',
+ data: {
+ text: 'yee haw!'
+ }
+ }
+}
+```
+
+ここで、
+* `id`には、APIのレスポンスを識別するための、APIリクエストごとの一意なIDを設定する必要があります。UUIDや、簡単な乱数のようなもので構いません。
+* `endpoint`には、あなたがリクエストしたいAPIのエンドポイントを指定します。
+* `data`には、エンドポイントのパラメータを含めます。
+
+<div class="ui info">
+ <p><i class="fas fa-info-circle"></i> APIのエンドポイントやパラメータについてはAPIリファレンスをご確認ください。</p>
+</div>
+
+### レスポンスの受信
+
+APIへリクエストすると、レスポンスがストリームから次のような形式で流れてきます。
+
+```json
+{
+ type: 'api:xxxxxxxxxxxxxxxx',
+ body: {
+ ...
+ }
+}
+```
+
+ここで、
+* `xxxxxxxxxxxxxxxx`の部分には、リクエストの際に設定された`id`が含まれています。これにより、どのリクエストに対するレスポンスなのか判別することができます。
+* `body`には、レスポンスが含まれています。
+
+## 投稿のキャプチャ
+
+Misskeyは投稿のキャプチャと呼ばれる仕組みを提供しています。これは、指定した投稿のイベントをストリームで受け取る機能です。
+
+例えばタイムラインを取得してユーザーに表示したとします。ここで誰かがそのタイムラインに含まれるどれかの投稿に対してリアクションしたとします。
+
+しかし、クライアントからするとある投稿にリアクションが付いたことなどは知る由がないため、リアルタイムでリアクションをタイムライン上の投稿に反映して表示するといったことができません。
+
+この問題を解決するために、Misskeyは投稿のキャプチャ機構を用意しています。投稿をキャプチャすると、その投稿に関するイベントを受け取ることができるため、リアルタイムでリアクションを反映させたりすることが可能になります。
+
+### 投稿をキャプチャする
+
+投稿をキャプチャするには、ストリームに次のようなメッセージを送信します:
+
+```json
+{
+ type: 'subNote',
+ body: {
+ id: 'xxxxxxxxxxxxxxxx'
+ }
+}
+```
+
+ここで、
+* `id`にキャプチャしたい投稿の`id`を設定します。
+
+このメッセージを送信すると、Misskeyにキャプチャを要請したことになり、以後、その投稿に関するイベントが流れてくるようになります。
+
+例えば投稿にリアクションが付いたとすると、次のようなメッセージが流れてきます:
+
+```json
+{
+ type: 'noteUpdated',
+ body: {
+ id: 'xxxxxxxxxxxxxxxx',
+ type: 'reacted',
+ body: {
+ reaction: 'like',
+ userId: 'yyyyyyyyyyyyyyyy'
+ }
+ }
+}
+```
+
+ここで、
+* `body`内の`id`に、イベントを発生させた投稿のIDが設定されます。
+* `body`内の`type`に、イベントの種類が設定されます。
+* `body`内の`body`に、イベントの詳細が設定されます。
+
+#### イベントの種類
+
+##### `reacted`
+その投稿にリアクションがされた時に発生します。
+
+* `reaction`に、リアクションの種類が設定されます。
+* `userId`に、リアクションを行ったユーザーのIDが設定されます。
+
+例:
+```json
+{
+ type: 'noteUpdated',
+ body: {
+ id: 'xxxxxxxxxxxxxxxx',
+ type: 'reacted',
+ body: {
+ reaction: 'like',
+ userId: 'yyyyyyyyyyyyyyyy'
+ }
+ }
+}
+```
+
+##### `deleted`
+その投稿が削除された時に発生します。
+
+* `deletedAt`に、削除日時が設定されます。
+
+例:
+```json
+{
+ type: 'noteUpdated',
+ body: {
+ id: 'xxxxxxxxxxxxxxxx',
+ type: 'deleted',
+ body: {
+ deletedAt: '2018-10-22T02:17:09.703Z'
+ }
+ }
+}
+```
+
+##### `pollVoted`
+その投稿に添付されたアンケートに投票された時に発生します。
+
+* `choice`に、選択肢IDが設定されます。
+* `userId`に、投票を行ったユーザーのIDが設定されます。
+
+例:
+```json
+{
+ type: 'noteUpdated',
+ body: {
+ id: 'xxxxxxxxxxxxxxxx',
+ type: 'pollVoted',
+ body: {
+ choice: 2,
+ userId: 'yyyyyyyyyyyyyyyy'
+ }
+ }
+}
+```
+
+### 投稿のキャプチャを解除する
+
+その投稿がもう画面に表示されなくなったりして、その投稿に関するイベントをもう受け取る必要がなくなったときは、キャプチャの解除を申請してください。
+
+次のメッセージを送信します:
+
+```json
+{
+ type: 'unsubNote',
+ body: {
+ id: 'xxxxxxxxxxxxxxxx'
+ }
+}
+```
+
+ここで、
+* `id`にキャプチャを解除したい投稿の`id`を設定します。
+
+このメッセージを送信すると、以後、その投稿に関するイベントは流れてこないようになります。
+
+# チャンネル一覧
+## `main`
+アカウントに関する基本的な情報が流れてきます。このチャンネルにパラメータはありません。
+
+### 流れてくるイベント一覧
+
+#### `renote`
+自分の投稿がRenoteされた時に発生するイベントです。自分自身の投稿をRenoteしたときは発生しません。
+
+#### `mention`
+誰かからメンションされたときに発生するイベントです。
+
+#### `readAllNotifications`
+自分宛ての通知がすべて既読になったことを表すイベントです。このイベントを利用して、「通知があることを示すアイコン」のようなものをオフにしたりする等のケースが想定されます。
+
+#### `meUpdated`
+自分の情報が更新されたことを表すイベントです。
+
+#### `follow`
+自分が誰かをフォローしたときに発生するイベントです。
+
+#### `unfollow`
+自分が誰かのフォローを解除したときに発生するイベントです。
+
+#### `followed`
+自分が誰かにフォローされたときに発生するイベントです。
+
+## `homeTimeline`
+ホームタイムラインの投稿情報が流れてきます。このチャンネルにパラメータはありません。
+
+### 流れてくるイベント一覧
+
+#### `note`
+タイムラインに新しい投稿が流れてきたときに発生するイベントです。
+
+## `localTimeline`
+ローカルタイムラインの投稿情報が流れてきます。このチャンネルにパラメータはありません。
+
+### 流れてくるイベント一覧
+
+#### `note`
+ローカルタイムラインに新しい投稿が流れてきたときに発生するイベントです。
+
+## `hybridTimeline`
+ソーシャルタイムラインの投稿情報が流れてきます。このチャンネルにパラメータはありません。
+
+### 流れてくるイベント一覧
+
+#### `note`
+ソーシャルタイムラインに新しい投稿が流れてきたときに発生するイベントです。
+
+## `globalTimeline`
+グローバルタイムラインの投稿情報が流れてきます。このチャンネルにパラメータはありません。
+
+### 流れてくるイベント一覧
+
+#### `note`
+グローバルタイムラインに新しい投稿が流れてきたときに発生するイベントです。
diff --git a/src/docs/pt-PT/theme.md b/src/docs/pt-PT/theme.md
new file mode 100644
index 0000000000..4e52ee8cd7
--- /dev/null
+++ b/src/docs/pt-PT/theme.md
@@ -0,0 +1,68 @@
+# テーマ
+
+テーマを設定して、Misskeyクライアントの見た目を変更できます。
+
+## テーマの設定
+設定 > テーマ
+
+## テーマを作成する
+テーマコードはJSON5で記述されたテーマオブジェクトです。 テーマは以下のようなオブジェクトです。
+``` js
+{
+ id: '17587283-dd92-4a2c-a22c-be0637c9e22a',
+
+ name: 'Danboard',
+ author: 'syuilo',
+
+ base: 'light',
+
+ props: {
+ accent: 'rgb(218, 141, 49)',
+ bg: 'rgb(218, 212, 190)',
+ fg: 'rgb(115, 108, 92)',
+ panel: 'rgb(236, 232, 220)',
+ renote: 'rgb(100, 152, 106)',
+ link: 'rgb(100, 152, 106)',
+ mention: '@accent',
+ hashtag: 'rgb(100, 152, 106)',
+ header: 'rgba(239, 227, 213, 0.75)',
+ navBg: 'rgb(216, 206, 182)',
+ inputBorder: 'rgba(0, 0, 0, 0.1)',
+ },
+}
+
+```
+
+* `id` ... テーマの一意なID。UUIDをおすすめします。
+* `name` ... テーマ名
+* `author` ... テーマの作者
+* `desc` ... テーマの説明(オプション)
+* `base` ... 明るいテーマか、暗いテーマか
+ * `light`にすると明るいテーマになり、`dark`にすると暗いテーマになります。
+ * テーマはここで設定されたベーステーマを継承します。
+* `props` ... テーマのスタイル定義。これから説明します。
+
+### テーマのスタイル定義
+`props`下にはテーマのスタイルを定義します。 キーがCSSの変数名になり、バリューで中身を指定します。 なお、この`props`オブジェクトはベーステーマから継承されます。 ベーステーマは、このテーマの`base`が`light`なら[_light.json5](https://github.com/syuilo/misskey/blob/develop/src/client/themes/_light.json5)で、`dark`なら[_dark.json5](https://github.com/syuilo/misskey/blob/develop/src/client/themes/_dark.json5)です。 つまり、このテーマ内の`props`に`panel`というキーが無くても、そこにはベーステーマの`panel`があると見なされます。
+
+#### バリューで使える構文
+* 16進数で表された色
+ * 例: `#00ff00`
+* `rgb(r, g, b)`形式で表された色
+ * 例: `rgb(0, 255, 0)`
+* `rgb(r, g, b, a)`形式で表された透明度を含む色
+ * 例: `rgba(0, 255, 0, 0.5)`
+* 他のキーの値の参照
+ * `@{キー名}`と書くと他のキーの値の参照になります。`{キー名}`は参照したいキーの名前に置き換えます。
+ * 例: `@panel`
+* 定数(後述)の参照
+ * `${定数名}`と書くと定数の参照になります。`{定数名}`は参照したい定数の名前に置き換えます。
+ * 例: `$main`
+* 関数(後述)
+ * `:{関数名}<{引数}<{色}`
+
+#### 定数
+「CSS変数として出力はしたくないが、他のCSS変数の値として使いまわしたい」値があるときは、定数を使うと便利です。 キー名を`$`で始めると、そのキーはCSS変数として出力されません。
+
+#### 関数
+wip
diff --git a/src/docs/pt-PT/timelines.md b/src/docs/pt-PT/timelines.md
new file mode 100644
index 0000000000..36ba61bd2d
--- /dev/null
+++ b/src/docs/pt-PT/timelines.md
@@ -0,0 +1,15 @@
+# タイムラインの比較
+
+https://docs.google.com/spreadsheets/d/1lxQ2ugKrhz58Bg96HTDK_2F98BUritkMyIiBkOByjHA/edit?usp=sharing
+
+## ホーム
+自分のフォローしているユーザーの投稿
+
+## ローカル
+全てのローカルユーザーの「ホーム」指定されていない投稿
+
+## ソーシャル
+自分のフォローしているユーザーの投稿と、全てのローカルユーザーの「ホーム」指定されていない投稿
+
+## グローバル
+全てのローカルユーザーの「ホーム」指定されていない投稿と、サーバーに届いた全てのリモートユーザーの「ホーム」指定されていない投稿
diff --git a/src/docs/ru-RU/aiscript.md b/src/docs/ru-RU/aiscript.md
new file mode 100644
index 0000000000..c8d3d44b6c
--- /dev/null
+++ b/src/docs/ru-RU/aiscript.md
@@ -0,0 +1,4 @@
+# AiScript
+
+## Функции
+デフォルトで値渡しです。
diff --git a/src/docs/ru-RU/api.md b/src/docs/ru-RU/api.md
new file mode 100644
index 0000000000..76019b6145
--- /dev/null
+++ b/src/docs/ru-RU/api.md
@@ -0,0 +1,58 @@
+# Misskey API
+
+MisskeyAPIを使ってMisskeyクライアント、Misskey連携Webサービス、Bot等(以下「アプリケーション」と呼びます)を開発できます。 ストリーミングAPIもあるので、リアルタイム性のあるアプリケーションを作ることも可能です。
+
+APIを使い始めるには、まずアクセストークンを取得する必要があります。 このドキュメントでは、アクセストークンを取得する手順を説明した後、基本的なAPIの使い方を説明します。
+
+## アクセストークンの取得
+基本的に、APIはリクエストにはアクセストークンが必要となります。 APIにリクエストするのが自分自身なのか、不特定の利用者に使ってもらうアプリケーションなのかによって取得手順は異なります。
+
+* 前者の場合: [「自分自身のアクセストークンを手動発行する」](#自分自身のアクセストークンを手動発行する)に進む
+* 後者の場合: [「アプリケーション利用者にアクセストークンの発行をリクエストする」](#アプリケーション利用者にアクセストークンの発行をリクエストする)に進む
+
+### 自分自身のアクセストークンを手動発行する
+「設定 > API」で、自分のアクセストークンを発行できます。
+
+[「APIの使い方」へ進む](#APIの使い方)
+
+### アプリケーション利用者にアクセストークンの発行をリクエストする
+アプリケーション利用者のアクセストークンを取得するには、以下の手順で発行をリクエストします。
+
+#### Step 1
+
+UUIDを生成する。以後これをセッションIDと呼びます。
+
+> このセッションIDは毎回生成し、使いまわさないようにしてください。
+
+#### Step 2
+
+`{_URL_}/miauth/{session}`をユーザーのブラウザで表示させる。`{session}`の部分は、セッションIDに置き換えてください。
+> 例: `{_URL_}/miauth/c1f6d42b-468b-4fd2-8274-e58abdedef6f`
+
+表示する際、URLにクエリパラメータとしていくつかのオプションを設定できます:
+* `name` ... アプリケーション名
+ * > 例: `MissDeck`
+* `icon` ... アプリケーションのアイコン画像URL
+ * > 例: `https://missdeck.example.com/icon.png`
+* `callback` ... 認証が終わった後にリダイレクトするURL
+ * > 例: `https://missdeck.example.com/callback`
+ * リダイレクト時には、`session`というクエリパラメータでセッションIDが付きます
+* `permission` ... アプリケーションが要求する権限
+ * > 例: `write:notes,write:following,read:drive`
+ * 要求する権限を`,`で区切って列挙します
+ * どのような権限があるかは[APIリファレンス](/api-doc)で確認できます
+
+#### Step 3
+ユーザーが発行を許可した後、`{_URL_}/api/miauth/{session}/check`にPOSTリクエストすると、レスポンスとしてアクセストークンを含むJSONが返ります。
+
+レスポンスに含まれるプロパティ:
+* `token` ... ユーザーのアクセストークン
+* `user` ... ユーザーの情報
+
+[「APIの使い方」へ進む](#APIの使い方)
+
+## APIの使い方
+**APIはすべてPOSTで、リクエスト/レスポンスともにJSON形式です。RESTではありません。** アクセストークンは、`i`というパラメータ名でリクエストに含めます。
+
+* [APIリファレンス](/api-doc)
+* [ストリーミングAPI](./stream)
diff --git a/src/docs/ru-RU/create-plugin.md b/src/docs/ru-RU/create-plugin.md
new file mode 100644
index 0000000000..f5baa27646
--- /dev/null
+++ b/src/docs/ru-RU/create-plugin.md
@@ -0,0 +1,74 @@
+# プラグインの作成
+Misskey Webクライアントのプラグイン機能を使うと、クライアントを拡張し、様々な機能を追加できます。 ここではプラグインの作成にあたってのメタデータ定義や、AiScript APIリファレンスを掲載します。
+
+## Метаданные
+プラグインは、AiScriptのメタデータ埋め込み機能を使って、デフォルトとしてプラグインのメタデータを定義する必要があります。 メタデータは次のプロパティを含むオブジェクトです。
+
+### name
+プラグイン名
+
+### author
+プラグイン作者
+
+### version
+プラグインバージョン。数値を指定してください。
+
+### description
+プラグインの説明
+
+### permissions
+プラグインが要求する権限。MisskeyAPIにリクエストする際に用いられます。
+
+### config
+プラグインの設定情報を表すオブジェクト。 キーに設定名、値に以下のプロパティを含めます。
+
+#### type
+設定値の種類を表す文字列。以下から選択します。 string number boolean
+
+#### label
+ユーザーに表示する設定名
+
+#### description
+設定の説明
+
+#### default
+設定のデフォルト値
+
+## APIリファレンス
+AiScript標準で組み込まれているAPIは掲載しません。
+
+### Mk:dialog(title text type)
+ダイアログを表示します。typeには以下の値が設定できます。 info success warn error question 省略すると info になります。
+
+### Mk:confirm(title text type)
+確認ダイアログを表示します。typeには以下の値が設定できます。 info success warn error question 省略すると question になります。 ユーザーが"OK"を選択した場合は true を、"キャンセル"を選択した場合は false が返ります。
+
+### Mk:api(endpoint params)
+Misskey APIにリクエストします。第一引数にエンドポイント名、第二引数にパラメータオブジェクトを渡します。
+
+### Mk:save(key value)
+任意の値に任意の名前を付けて永続化します。永続化した値は、AiScriptコンテキストが終了しても残り、Mk:loadで読み取ることができます。
+
+### Mk:load(key)
+Mk:saveで永続化した指定の名前の値を読み取ります。
+
+### Plugin:register_post_form_action(title fn)
+投稿フォームにアクションを追加します。第一引数にアクション名、第二引数にアクションが選択された際のコールバック関数を渡します。 コールバック関数には、第一引数に投稿フォームオブジェクトが渡されます。
+
+### Plugin:register_note_action(title fn)
+ノートメニューに項目を追加します。第一引数に項目名、第二引数に項目が選択された際のコールバック関数を渡します。 コールバック関数には、第一引数に対象のノートオブジェクトが渡されます。
+
+### Plugin:register_user_action(title fn)
+ユーザーメニューに項目を追加します。第一引数に項目名、第二引数に項目が選択された際のコールバック関数を渡します。 コールバック関数には、第一引数に対象のユーザーオブジェクトが渡されます。
+
+### Plugin:register_note_view_interruptor(fn)
+UIに表示されるノート情報を書き換えます。 コールバック関数には、第一引数に対象のノートオブジェクトが渡されます。 コールバック関数の返り値でノートが書き換えられます。
+
+### Plugin:register_note_post_interruptor(fn)
+ノート投稿時にノート情報を書き換えます。 コールバック関数には、第一引数に対象のノートオブジェクトが渡されます。 コールバック関数の返り値でノートが書き換えられます。
+
+### Plugin:open_url(url)
+第一引数に渡されたURLをブラウザの新しいタブで開きます。
+
+### Plugin:config
+プラグインの設定が格納されるオブジェクト。プラグイン定義のconfigで設定したキーで値が入ります。
diff --git a/src/docs/ru-RU/custom-emoji.md b/src/docs/ru-RU/custom-emoji.md
new file mode 100644
index 0000000000..6d20e36c15
--- /dev/null
+++ b/src/docs/ru-RU/custom-emoji.md
@@ -0,0 +1,2 @@
+# Эмодзи пользователя
+カスタム絵文字は、インスタンスで用意された画像を絵文字のように使える機能です。 ノート、リアクション、チャット、自己紹介、名前などの場所で使うことができます。 カスタム絵文字をそれらの場所で使うには、絵文字ピッカーボタン(ある場合)を押すか、`:`を入力して絵文字サジェストを表示します。 テキスト内に`:foo:`のような形式の文字列が見つかると、`foo`の部分がカスタム絵文字名と解釈され、表示時には対応したカスタム絵文字に置き換わります。
diff --git a/src/docs/ru-RU/deck.md b/src/docs/ru-RU/deck.md
new file mode 100644
index 0000000000..7b109dc4fc
--- /dev/null
+++ b/src/docs/ru-RU/deck.md
@@ -0,0 +1,18 @@
+# Пульт
+
+デッキは利用可能なUIのひとつです。「カラム」と呼ばれるビューを複数並べて表示させることで、カスタマイズ性が高く、情報量の多いUIが構築できることが特徴です。
+
+## カラムの追加
+デッキの背景を右クリックし、「カラムを追加」して任意のカラムを追加できます。
+
+## カラムの移動
+カラムは、ドラッグアンドドロップで他のカラムと位置を入れ替えることが出来るほか、カラムメニュー(カラムのヘッダー右クリック)から位置を移動させることもできます。
+
+## カラムの水平分割
+カラムは左右だけでなく、上下に並べることもできます。 カラムメニューを開き、「左に重ねる」を選択すると、左のカラムの下に現在のカラムが移動します。 上下分割を解除するには、カラムメニューの「右に出す」を選択します。
+
+## カラムの設定
+カラムメニューの「編集」を選択するとカラムの設定を編集できます。カラムの名前を変えたり、幅を変えたりできます。
+
+## デッキの設定
+デッキに関する設定は、[settings/deck](/settings/deck)で行えます。
diff --git a/src/docs/ru-RU/follow.md b/src/docs/ru-RU/follow.md
new file mode 100644
index 0000000000..dde28b9c9a
--- /dev/null
+++ b/src/docs/ru-RU/follow.md
@@ -0,0 +1,2 @@
+# Подписки
+ユーザーをフォローすると、タイムラインにそのユーザーの投稿が表示されるようになります。ただし、他のユーザーに対する返信は含まれません。 ユーザーをフォローするには、ユーザーページの「フォロー」ボタンをクリックします。フォローを解除するには、もう一度クリックします。
diff --git a/src/docs/ru-RU/keyboard-shortcut.md b/src/docs/ru-RU/keyboard-shortcut.md
new file mode 100644
index 0000000000..6ec2dd92c9
--- /dev/null
+++ b/src/docs/ru-RU/keyboard-shortcut.md
@@ -0,0 +1,68 @@
+# キーボードショートカット
+
+## Всеобщая
+これらのショートカットは基本的にどこでも使えます。
+<table>
+ <thead>
+ <tr><th>ショートカット</th><th>効果</th><th>由来</th></tr>
+ </thead>
+ <tbody>
+ <tr><td><kbd class="key">P</kbd>, <kbd class="key">N</kbd></td><td>新規投稿</td><td><b>P</b>ost, <b>N</b>ew, <b>N</b>ote</td></tr>
+ <tr><td><kbd class="key">T</kbd></td><td>タイムラインの最も新しい投稿にフォーカス</td><td><b>T</b>imeline, <b>T</b>op</td></tr>
+ <tr><td><kbd class="group"><kbd class="key">Shift</kbd> + <kbd class="key">N</kbd></kbd></td><td>通知を表示/隠す</td><td><b>N</b>otifications</td></tr>
+ <tr><td><kbd class="key">S</kbd></td><td>Поиск</td><td><b>S</b>earch</td></tr>
+ <tr><td><kbd class="key">H</kbd>, <kbd class="key">?</kbd></td><td>ヘルプを表示</td><td><b>H</b>elp</td></tr>
+ </tbody>
+</table>
+
+## 投稿にフォーカスされた状態
+
+<table>
+ <thead>
+ <tr><th>ショートカット</th><th>効果</th><th>由来</th></tr>
+ </thead>
+ <tbody>
+ <tr><td><kbd class="key">↑</kbd>, <kbd class="key">K</kbd>, <kbd class="group"><kbd class="key">Shift</kbd> + <kbd class="key">Tab</kbd></kbd></td><td>上の投稿にフォーカスを移動</td><td>-</td></tr>
+ <tr><td><kbd class="key">↓</kbd>, <kbd class="key">J</kbd>, <kbd class="key">Tab</kbd></td><td>下の投稿にフォーカスを移動</td><td>-</td></tr>
+ <tr><td><kbd class="key">R</kbd></td><td>返信フォームを開く</td><td><b>R</b>eply</td></tr>
+ <tr><td><kbd class="key">Q</kbd></td><td>Renoteフォームを開く</td><td><b>Q</b>uote</td></tr>
+ <tr><td><kbd class="group"><kbd class="key">Ctrl</kbd> + <kbd class="key">Q</kbd></kbd></td><td>即刻Renoteする(フォームを開かずに)</td><td>-</td></tr>
+ <tr><td><kbd class="key">E</kbd>, <kbd class="key">A</kbd>, <kbd class="key">+</kbd></td><td>リアクションフォームを開く</td><td><b>E</b>mote, re<b>A</b>ction</td></tr>
+ <tr><td><kbd class="key">0</kbd>~<kbd class="key">9</kbd></td><td>数字に対応したリアクションをする(対応については後述)</td><td>-</td></tr>
+ <tr><td><kbd class="key">F</kbd>, <kbd class="key">B</kbd></td><td>お気に入りに登録</td><td><b>F</b>avorite, <b>B</b>ookmark</td></tr>
+ <tr><td><kbd class="key">Del</kbd>, <kbd class="group"><kbd class="key">Ctrl</kbd> + <kbd class="key">D</kbd></kbd></td><td>投稿を削除</td><td><b>D</b>elete</tr>
+ <tr><td><kbd class="key">M</kbd>, <kbd class="key">O</kbd></td><td>投稿に対するメニューを開く</td><td><b>M</b>ore, <b>O</b>ther</td></tr>
+ <tr><td><kbd class="key">S</kbd></td><td>CWで隠された部分を表示 or 隠す</td><td><b>S</b>how, <b>S</b>ee</td></tr>
+ <tr><td><kbd class="key">Esc</kbd></td><td>フォーカスを外す</td><td>-</td></tr>
+ </tbody>
+</table>
+
+## Renoteフォーム
+
+<table>
+ <thead>
+ <tr><th>ショートカット</th><th>効果</th><th>由来</th></tr>
+ </thead>
+ <tbody>
+ <tr><td><kbd class="key">Enter</kbd></td><td>Renoteする</td><td>-</td></tr>
+ <tr><td><kbd class="key">Q</kbd></td><td>フォームを展開する</td><td><b>Q</b>uote</td></tr>
+ <tr><td><kbd class="key">Esc</kbd></td><td>フォームを閉じる</td><td>-</td></tr>
+ </tbody>
+</table>
+
+## リアクションフォーム
+デフォルトで「👍」にフォーカスが当たっている状態です。
+<table>
+ <thead>
+ <tr><th>ショートカット</th><th>効果</th><th>由来</th></tr>
+ </thead>
+ <tbody>
+ <tr><td><kbd class="key">↑</kbd>, <kbd class="key">K</kbd></td><td>上のリアクションにフォーカスを移動</td><td>-</td></tr>
+ <tr><td><kbd class="key">↓</kbd>, <kbd class="key">J</kbd></td><td>下のリアクションにフォーカスを移動</td><td>-</td></tr>
+ <tr><td><kbd class="key">←</kbd>, <kbd class="key">H</kbd>, <kbd class="group"><kbd class="key">Shift</kbd> + <kbd class="key">Tab</kbd></kbd></td><td>左のリアクションにフォーカスを移動</td><td>-</td></tr>
+ <tr><td><kbd class="key">→</kbd>, <kbd class="key">L</kbd>, <kbd class="key">Tab</kbd></td><td>右のリアクションにフォーカスを移動</td><td>-</td></tr>
+ <tr><td><kbd class="key">Enter</kbd>, <kbd class="key">Space</kbd>, <kbd class="key">+</kbd></td><td>リアクション確定</td><td>-</td></tr>
+ <tr><td><kbd class="key">0</kbd>~<kbd class="key">9</kbd></td><td>数字に対応したリアクションで確定</td><td>-</td></tr>
+ <tr><td><kbd class="key">Esc</kbd></td><td>リアクションするのをやめる</td><td>-</td></tr>
+ </tbody>
+</table>
diff --git a/src/docs/ru-RU/mfm.md b/src/docs/ru-RU/mfm.md
new file mode 100644
index 0000000000..e237287acc
--- /dev/null
+++ b/src/docs/ru-RU/mfm.md
@@ -0,0 +1,2 @@
+# MFM
+MFMは、Misskey Flavored Markdownの略で、Misskeyの様々な場所で使用できる専用のマークアップ言語です。 MFMで使用可能な構文は[MFMチートシート](/mfm-cheat-sheet)で確認できます。
diff --git a/src/docs/ru-RU/mute.md b/src/docs/ru-RU/mute.md
new file mode 100644
index 0000000000..78a4bf3eb3
--- /dev/null
+++ b/src/docs/ru-RU/mute.md
@@ -0,0 +1,13 @@
+# Скрыть
+
+ユーザーをミュートすると、そのユーザーに関する次のコンテンツがMisskeyに表示されなくなります:
+
+* タイムラインや投稿の検索結果内の、そのユーザーの投稿(およびそれらの投稿に対する返信やRenote)
+* そのユーザーからの通知
+* メッセージ履歴一覧内の、そのユーザーとのメッセージ履歴
+
+ユーザーをミュートするには、対象のユーザーのユーザーページに表示されている「ミュート」ボタンを押します。
+
+ミュートを行ったことは相手に通知されず、ミュートされていることを知ることもできません。
+
+設定>ミュート から、自分がミュートしているユーザー一覧を確認することができます。
diff --git a/src/docs/ru-RU/pages.md b/src/docs/ru-RU/pages.md
new file mode 100644
index 0000000000..ea7b15c311
--- /dev/null
+++ b/src/docs/ru-RU/pages.md
@@ -0,0 +1,10 @@
+# Pages
+
+## Переменные
+変数を使うことで動的なページを作成できます。テキスト内で <b>{ 変数名 }</b> と書くとそこに変数の値を埋め込めます。例えば <b>Hello { thing } world!</b> というテキストで、変数(thing)の値が <b>ai</b> だった場合、テキストは <b>Hello ai world!</b> になります。
+
+変数の評価(値を算出すること)は上から下に行われるので、ある変数の中で自分より下の変数を参照することはできません。例えば上から <b>A、B、C</b> と3つの変数を定義したとき、<b>C</b>の中で<b>A</b>や<b>B</b>を参照することはできますが、<b>A</b>の中で<b>B</b>や<b>C</b>を参照することはできません。
+
+ユーザーからの入力を受け取るには、ページに「ユーザー入力」ブロックを設置し、「変数名」に入力を格納したい変数名を設定します(変数は自動で作成されます)。その変数を使ってユーザー入力に応じた動作を行えます。
+
+関数を使うと、値の算出処理を再利用可能な形にまとめることができます。関数を作るには、「関数」タイプの変数を作成します。関数にはスロット(引数)を設定することができ、スロットの値は関数内で変数として利用可能です。また、関数を引数に取る関数(高階関数と呼ばれます)も存在します。関数は予め定義しておくほかに、このような高階関数のスロットに即席でセットすることもできます。
diff --git a/src/docs/ru-RU/reaction.md b/src/docs/ru-RU/reaction.md
new file mode 100644
index 0000000000..7b315d7ec1
--- /dev/null
+++ b/src/docs/ru-RU/reaction.md
@@ -0,0 +1,11 @@
+# Реакции
+他の人のノートに、絵文字を付けて簡単にあなたの反応を伝えられる機能です。 リアクションするには、ノートの + アイコンをクリックしてピッカーを表示し、絵文字を選択します。 リアクションには[カスタム絵文字](./custom-emoji)も使用できます。
+
+## リアクションピッカーのカスタマイズ
+ピッカーに表示される絵文字を自分好みにカスタマイズすることができます。 設定の「リアクション」で設定します。
+
+## リモート投稿へのリアクションについて
+リアクションはMisskeyオリジナルの機能であるため、リモートインスタンスがMisskeyでない限りは、ほとんどの場合「Like」としてアクティビティが送信されます。一般的にはLikeは「お気に入り」として実装されているようです。 また、相手がMisskeyであったとしても、カスタム絵文字リアクションは伝わらず、自動的に「👍」等にフォールバックされます。
+
+## リモートからのリアクションについて
+リモートから「Like」アクティビティを受信したとき、Misskeyでは「👍」のリアクションとして解釈されます。
diff --git a/src/docs/ru-RU/reversi-bot.md b/src/docs/ru-RU/reversi-bot.md
new file mode 100644
index 0000000000..16eb25a607
--- /dev/null
+++ b/src/docs/ru-RU/reversi-bot.md
@@ -0,0 +1,160 @@
+# MisskeyリバーシBotの開発
+Misskeyのリバーシ機能に対応したBotの開発方法をここに記します。
+
+1. `games/reversi`ストリームに以下のパラメータを付けて接続する:
+ * `i`: botアカウントのAPIキー
+
+2. 対局への招待が来たら、ストリームから`invited`イベントが流れてくる
+ * イベントの中身に、`parent`という名前で対局へ誘ってきたユーザーの情報が含まれている
+
+3. `games/reversi/match`へ、`user_id`として`parent`の`id`が含まれたリクエストを送信する
+
+4. 上手くいくとゲーム情報が返ってくるので、`games/reversi-game`ストリームへ、以下のパラメータを付けて接続する:
+ * `i`: botアカウントのAPIキー
+ * `game`: `game`の`id`
+
+5. この間、相手がゲームの設定を変更するとその都度`update-settings`イベントが流れてくるので、必要であれば何かしらの処理を行う
+
+6. 設定に満足したら、`{ type: 'accept' }`メッセージをストリームに送信する
+
+7. ゲームが開始すると、`started`イベントが流れてくる
+ * イベントの中身にはゲーム情報が含まれている
+
+8. 石を打つには、ストリームに`{ type: 'set', pos: <位置> }`を送信する(位置の計算方法は後述)
+
+9. 相手または自分が石を打つと、ストリームから`set`イベントが流れてくる
+ * `color`として石の色が含まれている
+ * `pos`として位置情報が含まれている
+
+## 位置の計算法
+8x8のマップを考える場合、各マスの位置(インデックスと呼びます)は次のようになっています:
+```
++--+--+--+--+--+--+--+--+
+| 0| 1| 2| 3| 4| 5| 6| 7|
++--+--+--+--+--+--+--+--+
+| 8| 9|10|11|12|13|14|15|
++--+--+--+--+--+--+--+--+
+|16|17|18|19|20|21|22|23|
+...
+```
+
+### X,Y座標 から インデックス に変換する
+```
+pos = x + (y * mapWidth)
+```
+`mapWidth`は、ゲーム情報の`map`から、次のようにして計算できます:
+```
+mapWidth = map[0].length
+```
+
+### インデックス から X,Y座標 に変換する
+```
+x = pos % mapWidth
+y = Math.floor(pos / mapWidth)
+```
+
+## マップ情報
+マップ情報は、ゲーム情報の`map`に入っています。 文字列の配列になっており、ひとつひとつの文字がマス情報を表しています。 それをもとにマップのデザインを知る事が出来ます:
+* `(スペース)` ... マス無し
+* `-` ... マス
+* `b` ... 初期配置される黒石
+* `w` ... 初期配置される白石
+
+例えば、4*4の次のような単純なマップがあるとします:
+```text
++---+---+---+---+
+| | | | |
++---+---+---+---+
+| | ○ | ● | |
++---+---+---+---+
+| | ● | ○ | |
++---+---+---+---+
+| | | | |
++---+---+---+---+
+```
+
+この場合、マップデータはこのようになります:
+```javascript
+['----', '-wb-', '-bw-', '----']
+```
+
+## ユーザーにフォームを提示して対話可能Botを作成する
+ユーザーとのコミュニケーションを行うため、ゲームの設定画面でユーザーにフォームを提示することができます。 例えば、Botの強さをユーザーが設定できるようにする、といったシナリオが考えられます。
+
+フォームを提示するには、`reversi-game`ストリームに次のメッセージを送信します:
+```javascript
+{
+ type: 'init-form',
+ body: [フォームコントロールの配列]
+}
+```
+
+フォームコントロールの配列については今から説明します。 フォームコントロールは、次のようなオブジェクトです:
+```javascript
+{
+ id: 'switch1',
+ type: 'switch',
+ label: 'Enable hoge',
+ value: false
+}
+```
+`id` ... コントロールのID。 `type` ... コントロールの種類。後述します。 `label` ... コントロールと一緒に表記するテキスト。 `value` ... コントロールのデフォルト値。
+
+### フォームの操作を受け取る
+ユーザーがフォームを操作すると、ストリームから`update-form`イベントが流れてきます。 イベントの中身には、コントロールのIDと、ユーザーが設定した値が含まれています。 例えば、上で示したスイッチをユーザーがオンにしたとすると、次のイベントが流れてきます:
+```javascript
+{
+ id: 'switch1',
+ value: true
+}
+```
+
+### フォームコントロールの種類
+#### Выключатель
+type: `switch` スイッチを表示します。何かの機能をオン/オフさせたい場合に有用です。
+
+##### プロパティ
+`label` ... スイッチに表記するテキスト。
+
+#### ラジオボタン
+type: `radio` ラジオボタンを表示します。選択肢を提示するのに有用です。例えば、Botの強さを設定させるなどです。
+
+##### プロパティ
+`items` ... ラジオボタンの選択肢。例:
+```javascript
+items: [{
+ label: '弱',
+ value: 1
+}, {
+ label: '中',
+ value: 2
+}, {
+ label: '強',
+ value: 3
+}]
+```
+
+#### スライダー
+type: `slider` スライダーを表示します。
+
+##### プロパティ
+`min` ... スライダーの下限。 `max` ... スライダーの上限。 `step` ... 入力欄で刻むステップ値。
+
+#### テキストボックス
+type: `textbox` テキストボックスを表示します。ユーザーになにか入力させる一般的な用途に利用できます。
+
+## ユーザーにメッセージを表示する
+設定画面でユーザーと対話する、フォーム以外のもうひとつの方法がこれです。ユーザーになにかメッセージを表示することができます。 例えば、ユーザーがBotの対応していないモードやマップを選択したとき、警告を表示するなどです。 メッセージを表示するには、次のメッセージをストリームに送信します:
+```javascript
+{
+ type: 'message',
+ body: {
+ text: 'メッセージ内容',
+ type: 'メッセージの種類'
+ }
+}
+```
+メッセージの種類: `success`, `info`, `warning`, `error`。
+
+## 投了する
+投了をするには、<a href="./api/endpoints/games/reversi/games/surrender">このエンドポイント</a>にリクエストします。
diff --git a/src/docs/ru-RU/stream.md b/src/docs/ru-RU/stream.md
new file mode 100644
index 0000000000..ca58db7b8e
--- /dev/null
+++ b/src/docs/ru-RU/stream.md
@@ -0,0 +1,354 @@
+# ストリーミングAPI
+
+ストリーミングAPIを使うと、リアルタイムで様々な情報(例えばタイムラインに新しい投稿が流れてきた、メッセージが届いた、フォローされた、など)を受け取ったり、様々な操作を行ったりすることができます。
+
+## ストリームに接続する
+
+ストリーミングAPIを利用するには、まずMisskeyサーバーに**websocket**接続する必要があります。
+
+以下のURLに、`i`というパラメータ名で認証情報を含めて、websocket接続してください。例:
+```
+%WS_URL%/streaming?i=xxxxxxxxxxxxxxx
+```
+
+認証情報は、自分のAPIキーや、アプリケーションからストリームに接続する際はユーザーのアクセストークンのことを指します。
+
+<div class="ui info">
+ <p><i class="fas fa-info-circle"></i> 認証情報の取得については、<a href="./api">こちらのドキュメント</a>をご確認ください。</p>
+</div>
+
+---
+
+認証情報は省略することもできますが、その場合非ログインでの利用ということになり、受信できる情報や可能な操作は限られます。例:
+
+```
+%WS_URL%/streaming
+```
+
+---
+
+ストリームに接続すると、後述するAPI操作や、投稿の購読を行ったりすることができます。 しかしまだこの段階では、例えばタイムラインへの新しい投稿を受信したりすることはできません。 それを行うには、ストリーム上で、後述する**チャンネル**に接続する必要があります。
+
+**ストリームでのやり取りはすべてJSONです。**
+
+## Каналы
+MisskeyのストリーミングAPIにはチャンネルという概念があります。これは、送受信する情報を分離するための仕組みです。 Misskeyのストリームに接続しただけでは、まだリアルタイムでタイムラインの投稿を受信したりはできません。 ストリーム上でチャンネルに接続することで、様々な情報を受け取ったり情報を送信したりすることができるようになります。
+
+### チャンネルに接続する
+チャンネルに接続するには、次のようなデータをJSONでストリームに送信します:
+
+```json
+{
+ type: 'connect',
+ body: {
+ channel: 'xxxxxxxx',
+ id: 'foobar',
+ params: {
+ ...
+ }
+ }
+}
+```
+
+ここで、
+* `channel`には接続したいチャンネル名を設定します。チャンネルの種類については後述します。
+* `id`にはそのチャンネルとやり取りするための任意のIDを設定します。ストリームでは様々なメッセージが流れるので、そのメッセージがどのチャンネルからのものなのか識別する必要があるからです。このIDは、UUIDや、乱数のようなもので構いません。
+* `params`はチャンネルに接続する際のパラメータです。チャンネルによって接続時に必要とされるパラメータは異なります。パラメータ不要のチャンネルに接続する際は、このプロパティは省略可能です。
+
+<div class="ui info">
+ <p><i class="fas fa-info-circle"></i> IDはチャンネルごとではなく「チャンネルの接続ごと」です。なぜなら、同じチャンネルに異なるパラメータで複数接続するケースもあるからです。</p>
+</div>
+
+### チャンネルからのメッセージを受け取る
+例えばタイムラインのチャンネルなら、新しい投稿があった時にメッセージを発します。そのメッセージを受け取ることで、タイムラインに新しい投稿がされたことをリアルタイムで知ることができます。
+
+チャンネルがメッセージを発すると、次のようなデータがJSONでストリームに流れてきます:
+```json
+{
+ type: 'channel',
+ body: {
+ id: 'foobar',
+ type: 'something',
+ body: {
+ some: 'thing'
+ }
+ }
+}
+```
+
+ここで、
+* `id`には前述したそのチャンネルに接続する際に設定したIDが設定されています。これで、このメッセージがどのチャンネルからのものなのか知ることができます。
+* `type`にはメッセージの種類が設定されます。チャンネルによって、どのような種類のメッセージが流れてくるかは異なります。
+* `body`にはメッセージの内容が設定されます。チャンネルによって、どのような内容のメッセージが流れてくるかは異なります。
+
+### チャンネルに向けてメッセージを送信する
+チャンネルによっては、メッセージを受け取るだけでなく、こちらから何かメッセージを送信し、何らかの操作を行える場合があります。
+
+チャンネルにメッセージを送信するには、次のようなデータをJSONでストリームに送信します:
+```json
+{
+ type: 'channel',
+ body: {
+ id: 'foobar',
+ type: 'something',
+ body: {
+ some: 'thing'
+ }
+ }
+}
+```
+
+ここで、
+* `id`には前述したそのチャンネルに接続する際に設定したIDを設定します。これで、このメッセージがどのチャンネルに向けたものなのか識別させることができます。
+* `type`にはメッセージの種類を設定します。チャンネルによって、どのような種類のメッセージを受け付けるかは異なります。
+* `body`にはメッセージの内容を設定します。チャンネルによって、どのような内容のメッセージを受け付けるかは異なります。
+
+### チャンネルから切断する
+チャンネルから切断するには、次のようなデータをJSONでストリームに送信します:
+
+```json
+{
+ type: 'disconnect',
+ body: {
+ id: 'foobar'
+ }
+}
+```
+
+ここで、
+* `id`には前述したそのチャンネルに接続する際に設定したIDを設定します。
+
+## ストリームを経由してAPIリクエストする
+
+ストリームを経由してAPIリクエストすると、HTTPリクエストを発生させずにAPIを利用できます。そのため、コードを簡潔にできたり、パフォーマンスの向上を見込めるかもしれません。
+
+ストリームを経由してAPIリクエストするには、次のようなデータをJSONでストリームに送信します:
+```json
+{
+ type: 'api',
+ body: {
+ id: 'xxxxxxxxxxxxxxxx',
+ endpoint: 'notes/create',
+ data: {
+ text: 'yee haw!'
+ }
+ }
+}
+```
+
+ここで、
+* `id`には、APIのレスポンスを識別するための、APIリクエストごとの一意なIDを設定する必要があります。UUIDや、簡単な乱数のようなもので構いません。
+* `endpoint`には、あなたがリクエストしたいAPIのエンドポイントを指定します。
+* `data`には、エンドポイントのパラメータを含めます。
+
+<div class="ui info">
+ <p><i class="fas fa-info-circle"></i> APIのエンドポイントやパラメータについてはAPIリファレンスをご確認ください。</p>
+</div>
+
+### レスポンスの受信
+
+APIへリクエストすると、レスポンスがストリームから次のような形式で流れてきます。
+
+```json
+{
+ type: 'api:xxxxxxxxxxxxxxxx',
+ body: {
+ ...
+ }
+}
+```
+
+ここで、
+* `xxxxxxxxxxxxxxxx`の部分には、リクエストの際に設定された`id`が含まれています。これにより、どのリクエストに対するレスポンスなのか判別することができます。
+* `body`には、レスポンスが含まれています。
+
+## 投稿のキャプチャ
+
+Misskeyは投稿のキャプチャと呼ばれる仕組みを提供しています。これは、指定した投稿のイベントをストリームで受け取る機能です。
+
+例えばタイムラインを取得してユーザーに表示したとします。ここで誰かがそのタイムラインに含まれるどれかの投稿に対してリアクションしたとします。
+
+しかし、クライアントからするとある投稿にリアクションが付いたことなどは知る由がないため、リアルタイムでリアクションをタイムライン上の投稿に反映して表示するといったことができません。
+
+この問題を解決するために、Misskeyは投稿のキャプチャ機構を用意しています。投稿をキャプチャすると、その投稿に関するイベントを受け取ることができるため、リアルタイムでリアクションを反映させたりすることが可能になります。
+
+### 投稿をキャプチャする
+
+投稿をキャプチャするには、ストリームに次のようなメッセージを送信します:
+
+```json
+{
+ type: 'subNote',
+ body: {
+ id: 'xxxxxxxxxxxxxxxx'
+ }
+}
+```
+
+ここで、
+* `id`にキャプチャしたい投稿の`id`を設定します。
+
+このメッセージを送信すると、Misskeyにキャプチャを要請したことになり、以後、その投稿に関するイベントが流れてくるようになります。
+
+例えば投稿にリアクションが付いたとすると、次のようなメッセージが流れてきます:
+
+```json
+{
+ type: 'noteUpdated',
+ body: {
+ id: 'xxxxxxxxxxxxxxxx',
+ type: 'reacted',
+ body: {
+ reaction: 'like',
+ userId: 'yyyyyyyyyyyyyyyy'
+ }
+ }
+}
+```
+
+ここで、
+* `body`内の`id`に、イベントを発生させた投稿のIDが設定されます。
+* `body`内の`type`に、イベントの種類が設定されます。
+* `body`内の`body`に、イベントの詳細が設定されます。
+
+#### イベントの種類
+
+##### `reacted`
+その投稿にリアクションがされた時に発生します。
+
+* `reaction`に、リアクションの種類が設定されます。
+* `userId`に、リアクションを行ったユーザーのIDが設定されます。
+
+例:
+```json
+{
+ type: 'noteUpdated',
+ body: {
+ id: 'xxxxxxxxxxxxxxxx',
+ type: 'reacted',
+ body: {
+ reaction: 'like',
+ userId: 'yyyyyyyyyyyyyyyy'
+ }
+ }
+}
+```
+
+##### `deleted`
+その投稿が削除された時に発生します。
+
+* `deletedAt`に、削除日時が設定されます。
+
+例:
+```json
+{
+ type: 'noteUpdated',
+ body: {
+ id: 'xxxxxxxxxxxxxxxx',
+ type: 'deleted',
+ body: {
+ deletedAt: '2018-10-22T02:17:09.703Z'
+ }
+ }
+}
+```
+
+##### `pollVoted`
+その投稿に添付されたアンケートに投票された時に発生します。
+
+* `choice`に、選択肢IDが設定されます。
+* `userId`に、投票を行ったユーザーのIDが設定されます。
+
+例:
+```json
+{
+ type: 'noteUpdated',
+ body: {
+ id: 'xxxxxxxxxxxxxxxx',
+ type: 'pollVoted',
+ body: {
+ choice: 2,
+ userId: 'yyyyyyyyyyyyyyyy'
+ }
+ }
+}
+```
+
+### 投稿のキャプチャを解除する
+
+その投稿がもう画面に表示されなくなったりして、その投稿に関するイベントをもう受け取る必要がなくなったときは、キャプチャの解除を申請してください。
+
+次のメッセージを送信します:
+
+```json
+{
+ type: 'unsubNote',
+ body: {
+ id: 'xxxxxxxxxxxxxxxx'
+ }
+}
+```
+
+ここで、
+* `id`にキャプチャを解除したい投稿の`id`を設定します。
+
+このメッセージを送信すると、以後、その投稿に関するイベントは流れてこないようになります。
+
+# チャンネル一覧
+## `main`
+アカウントに関する基本的な情報が流れてきます。このチャンネルにパラメータはありません。
+
+### 流れてくるイベント一覧
+
+#### `renote`
+自分の投稿がRenoteされた時に発生するイベントです。自分自身の投稿をRenoteしたときは発生しません。
+
+#### `mention`
+誰かからメンションされたときに発生するイベントです。
+
+#### `readAllNotifications`
+自分宛ての通知がすべて既読になったことを表すイベントです。このイベントを利用して、「通知があることを示すアイコン」のようなものをオフにしたりする等のケースが想定されます。
+
+#### `meUpdated`
+自分の情報が更新されたことを表すイベントです。
+
+#### `follow`
+自分が誰かをフォローしたときに発生するイベントです。
+
+#### `unfollow`
+自分が誰かのフォローを解除したときに発生するイベントです。
+
+#### `followed`
+自分が誰かにフォローされたときに発生するイベントです。
+
+## `homeTimeline`
+ホームタイムラインの投稿情報が流れてきます。このチャンネルにパラメータはありません。
+
+### 流れてくるイベント一覧
+
+#### `note`
+タイムラインに新しい投稿が流れてきたときに発生するイベントです。
+
+## `localTimeline`
+ローカルタイムラインの投稿情報が流れてきます。このチャンネルにパラメータはありません。
+
+### 流れてくるイベント一覧
+
+#### `note`
+ローカルタイムラインに新しい投稿が流れてきたときに発生するイベントです。
+
+## `hybridTimeline`
+ソーシャルタイムラインの投稿情報が流れてきます。このチャンネルにパラメータはありません。
+
+### 流れてくるイベント一覧
+
+#### `note`
+ソーシャルタイムラインに新しい投稿が流れてきたときに発生するイベントです。
+
+## `globalTimeline`
+グローバルタイムラインの投稿情報が流れてきます。このチャンネルにパラメータはありません。
+
+### 流れてくるイベント一覧
+
+#### `note`
+グローバルタイムラインに新しい投稿が流れてきたときに発生するイベントです。
diff --git a/src/docs/ru-RU/theme.md b/src/docs/ru-RU/theme.md
new file mode 100644
index 0000000000..6ab7b54665
--- /dev/null
+++ b/src/docs/ru-RU/theme.md
@@ -0,0 +1,68 @@
+# Тема
+
+テーマを設定して、Misskeyクライアントの見た目を変更できます。
+
+## テーマの設定
+設定 > テーマ
+
+## テーマを作成する
+テーマコードはJSON5で記述されたテーマオブジェクトです。 テーマは以下のようなオブジェクトです。
+``` js
+{
+ id: '17587283-dd92-4a2c-a22c-be0637c9e22a',
+
+ name: 'Danboard',
+ author: 'syuilo',
+
+ base: 'light',
+
+ props: {
+ accent: 'rgb(218, 141, 49)',
+ bg: 'rgb(218, 212, 190)',
+ fg: 'rgb(115, 108, 92)',
+ panel: 'rgb(236, 232, 220)',
+ renote: 'rgb(100, 152, 106)',
+ link: 'rgb(100, 152, 106)',
+ mention: '@accent',
+ hashtag: 'rgb(100, 152, 106)',
+ header: 'rgba(239, 227, 213, 0.75)',
+ navBg: 'rgb(216, 206, 182)',
+ inputBorder: 'rgba(0, 0, 0, 0.1)',
+ },
+}
+
+```
+
+* `id` ... テーマの一意なID。UUIDをおすすめします。
+* `name` ... テーマ名
+* `author` ... テーマの作者
+* `desc` ... テーマの説明(オプション)
+* `base` ... 明るいテーマか、暗いテーマか
+ * `light`にすると明るいテーマになり、`dark`にすると暗いテーマになります。
+ * テーマはここで設定されたベーステーマを継承します。
+* `props` ... テーマのスタイル定義。これから説明します。
+
+### テーマのスタイル定義
+`props`下にはテーマのスタイルを定義します。 キーがCSSの変数名になり、バリューで中身を指定します。 なお、この`props`オブジェクトはベーステーマから継承されます。 ベーステーマは、このテーマの`base`が`light`なら[_light.json5](https://github.com/syuilo/misskey/blob/develop/src/client/themes/_light.json5)で、`dark`なら[_dark.json5](https://github.com/syuilo/misskey/blob/develop/src/client/themes/_dark.json5)です。 つまり、このテーマ内の`props`に`panel`というキーが無くても、そこにはベーステーマの`panel`があると見なされます。
+
+#### バリューで使える構文
+* 16進数で表された色
+ * 例: `#00ff00`
+* `rgb(r, g, b)`形式で表された色
+ * 例: `rgb(0, 255, 0)`
+* `rgb(r, g, b, a)`形式で表された透明度を含む色
+ * 例: `rgba(0, 255, 0, 0.5)`
+* 他のキーの値の参照
+ * `@{キー名}`と書くと他のキーの値の参照になります。`{キー名}`は参照したいキーの名前に置き換えます。
+ * 例: `@panel`
+* 定数(後述)の参照
+ * `${定数名}`と書くと定数の参照になります。`{定数名}`は参照したい定数の名前に置き換えます。
+ * 例: `$main`
+* 関数(後述)
+ * `:{関数名}<{引数}<{色}`
+
+#### Константа
+「CSS変数として出力はしたくないが、他のCSS変数の値として使いまわしたい」値があるときは、定数を使うと便利です。 キー名を`$`で始めると、そのキーはCSS変数として出力されません。
+
+#### Функции
+wip
diff --git a/src/docs/ru-RU/timelines.md b/src/docs/ru-RU/timelines.md
new file mode 100644
index 0000000000..dd6ca37c68
--- /dev/null
+++ b/src/docs/ru-RU/timelines.md
@@ -0,0 +1,15 @@
+# タイムラインの比較
+
+https://docs.google.com/spreadsheets/d/1lxQ2ugKrhz58Bg96HTDK_2F98BUritkMyIiBkOByjHA/edit?usp=sharing
+
+## Главная
+自分のフォローしているユーザーの投稿
+
+## Местная
+全てのローカルユーザーの「ホーム」指定されていない投稿
+
+## Социальная
+自分のフォローしているユーザーの投稿と、全てのローカルユーザーの「ホーム」指定されていない投稿
+
+## Всеобщая
+全てのローカルユーザーの「ホーム」指定されていない投稿と、サーバーに届いた全てのリモートユーザーの「ホーム」指定されていない投稿
diff --git a/src/docs/ug-CN/aiscript.md b/src/docs/ug-CN/aiscript.md
new file mode 100644
index 0000000000..6c28b446e3
--- /dev/null
+++ b/src/docs/ug-CN/aiscript.md
@@ -0,0 +1,4 @@
+# AiScript
+
+## 関数
+デフォルトで値渡しです。
diff --git a/src/docs/ug-CN/api.md b/src/docs/ug-CN/api.md
new file mode 100644
index 0000000000..76019b6145
--- /dev/null
+++ b/src/docs/ug-CN/api.md
@@ -0,0 +1,58 @@
+# Misskey API
+
+MisskeyAPIを使ってMisskeyクライアント、Misskey連携Webサービス、Bot等(以下「アプリケーション」と呼びます)を開発できます。 ストリーミングAPIもあるので、リアルタイム性のあるアプリケーションを作ることも可能です。
+
+APIを使い始めるには、まずアクセストークンを取得する必要があります。 このドキュメントでは、アクセストークンを取得する手順を説明した後、基本的なAPIの使い方を説明します。
+
+## アクセストークンの取得
+基本的に、APIはリクエストにはアクセストークンが必要となります。 APIにリクエストするのが自分自身なのか、不特定の利用者に使ってもらうアプリケーションなのかによって取得手順は異なります。
+
+* 前者の場合: [「自分自身のアクセストークンを手動発行する」](#自分自身のアクセストークンを手動発行する)に進む
+* 後者の場合: [「アプリケーション利用者にアクセストークンの発行をリクエストする」](#アプリケーション利用者にアクセストークンの発行をリクエストする)に進む
+
+### 自分自身のアクセストークンを手動発行する
+「設定 > API」で、自分のアクセストークンを発行できます。
+
+[「APIの使い方」へ進む](#APIの使い方)
+
+### アプリケーション利用者にアクセストークンの発行をリクエストする
+アプリケーション利用者のアクセストークンを取得するには、以下の手順で発行をリクエストします。
+
+#### Step 1
+
+UUIDを生成する。以後これをセッションIDと呼びます。
+
+> このセッションIDは毎回生成し、使いまわさないようにしてください。
+
+#### Step 2
+
+`{_URL_}/miauth/{session}`をユーザーのブラウザで表示させる。`{session}`の部分は、セッションIDに置き換えてください。
+> 例: `{_URL_}/miauth/c1f6d42b-468b-4fd2-8274-e58abdedef6f`
+
+表示する際、URLにクエリパラメータとしていくつかのオプションを設定できます:
+* `name` ... アプリケーション名
+ * > 例: `MissDeck`
+* `icon` ... アプリケーションのアイコン画像URL
+ * > 例: `https://missdeck.example.com/icon.png`
+* `callback` ... 認証が終わった後にリダイレクトするURL
+ * > 例: `https://missdeck.example.com/callback`
+ * リダイレクト時には、`session`というクエリパラメータでセッションIDが付きます
+* `permission` ... アプリケーションが要求する権限
+ * > 例: `write:notes,write:following,read:drive`
+ * 要求する権限を`,`で区切って列挙します
+ * どのような権限があるかは[APIリファレンス](/api-doc)で確認できます
+
+#### Step 3
+ユーザーが発行を許可した後、`{_URL_}/api/miauth/{session}/check`にPOSTリクエストすると、レスポンスとしてアクセストークンを含むJSONが返ります。
+
+レスポンスに含まれるプロパティ:
+* `token` ... ユーザーのアクセストークン
+* `user` ... ユーザーの情報
+
+[「APIの使い方」へ進む](#APIの使い方)
+
+## APIの使い方
+**APIはすべてPOSTで、リクエスト/レスポンスともにJSON形式です。RESTではありません。** アクセストークンは、`i`というパラメータ名でリクエストに含めます。
+
+* [APIリファレンス](/api-doc)
+* [ストリーミングAPI](./stream)
diff --git a/src/docs/ug-CN/create-plugin.md b/src/docs/ug-CN/create-plugin.md
new file mode 100644
index 0000000000..0d2fa19178
--- /dev/null
+++ b/src/docs/ug-CN/create-plugin.md
@@ -0,0 +1,74 @@
+# プラグインの作成
+Misskey Webクライアントのプラグイン機能を使うと、クライアントを拡張し、様々な機能を追加できます。 ここではプラグインの作成にあたってのメタデータ定義や、AiScript APIリファレンスを掲載します。
+
+## メタデータ
+プラグインは、AiScriptのメタデータ埋め込み機能を使って、デフォルトとしてプラグインのメタデータを定義する必要があります。 メタデータは次のプロパティを含むオブジェクトです。
+
+### name
+プラグイン名
+
+### author
+プラグイン作者
+
+### version
+プラグインバージョン。数値を指定してください。
+
+### description
+プラグインの説明
+
+### permissions
+プラグインが要求する権限。MisskeyAPIにリクエストする際に用いられます。
+
+### config
+プラグインの設定情報を表すオブジェクト。 キーに設定名、値に以下のプロパティを含めます。
+
+#### type
+設定値の種類を表す文字列。以下から選択します。 string number boolean
+
+#### label
+ユーザーに表示する設定名
+
+#### description
+設定の説明
+
+#### default
+設定のデフォルト値
+
+## APIリファレンス
+AiScript標準で組み込まれているAPIは掲載しません。
+
+### Mk:dialog(title text type)
+ダイアログを表示します。typeには以下の値が設定できます。 info success warn error question 省略すると info になります。
+
+### Mk:confirm(title text type)
+確認ダイアログを表示します。typeには以下の値が設定できます。 info success warn error question 省略すると question になります。 ユーザーが"OK"を選択した場合は true を、"キャンセル"を選択した場合は false が返ります。
+
+### Mk:api(endpoint params)
+Misskey APIにリクエストします。第一引数にエンドポイント名、第二引数にパラメータオブジェクトを渡します。
+
+### Mk:save(key value)
+任意の値に任意の名前を付けて永続化します。永続化した値は、AiScriptコンテキストが終了しても残り、Mk:loadで読み取ることができます。
+
+### Mk:load(key)
+Mk:saveで永続化した指定の名前の値を読み取ります。
+
+### Plugin:register_post_form_action(title fn)
+投稿フォームにアクションを追加します。第一引数にアクション名、第二引数にアクションが選択された際のコールバック関数を渡します。 コールバック関数には、第一引数に投稿フォームオブジェクトが渡されます。
+
+### Plugin:register_note_action(title fn)
+ノートメニューに項目を追加します。第一引数に項目名、第二引数に項目が選択された際のコールバック関数を渡します。 コールバック関数には、第一引数に対象のノートオブジェクトが渡されます。
+
+### Plugin:register_user_action(title fn)
+ユーザーメニューに項目を追加します。第一引数に項目名、第二引数に項目が選択された際のコールバック関数を渡します。 コールバック関数には、第一引数に対象のユーザーオブジェクトが渡されます。
+
+### Plugin:register_note_view_interruptor(fn)
+UIに表示されるノート情報を書き換えます。 コールバック関数には、第一引数に対象のノートオブジェクトが渡されます。 コールバック関数の返り値でノートが書き換えられます。
+
+### Plugin:register_note_post_interruptor(fn)
+ノート投稿時にノート情報を書き換えます。 コールバック関数には、第一引数に対象のノートオブジェクトが渡されます。 コールバック関数の返り値でノートが書き換えられます。
+
+### Plugin:open_url(url)
+第一引数に渡されたURLをブラウザの新しいタブで開きます。
+
+### Plugin:config
+プラグインの設定が格納されるオブジェクト。プラグイン定義のconfigで設定したキーで値が入ります。
diff --git a/src/docs/ug-CN/custom-emoji.md b/src/docs/ug-CN/custom-emoji.md
new file mode 100644
index 0000000000..ed2e92be16
--- /dev/null
+++ b/src/docs/ug-CN/custom-emoji.md
@@ -0,0 +1,2 @@
+# カスタム絵文字
+カスタム絵文字は、インスタンスで用意された画像を絵文字のように使える機能です。 ノート、リアクション、チャット、自己紹介、名前などの場所で使うことができます。 カスタム絵文字をそれらの場所で使うには、絵文字ピッカーボタン(ある場合)を押すか、`:`を入力して絵文字サジェストを表示します。 テキスト内に`:foo:`のような形式の文字列が見つかると、`foo`の部分がカスタム絵文字名と解釈され、表示時には対応したカスタム絵文字に置き換わります。
diff --git a/src/docs/ug-CN/deck.md b/src/docs/ug-CN/deck.md
new file mode 100644
index 0000000000..8057e262fd
--- /dev/null
+++ b/src/docs/ug-CN/deck.md
@@ -0,0 +1,18 @@
+# デッキ
+
+デッキは利用可能なUIのひとつです。「カラム」と呼ばれるビューを複数並べて表示させることで、カスタマイズ性が高く、情報量の多いUIが構築できることが特徴です。
+
+## カラムの追加
+デッキの背景を右クリックし、「カラムを追加」して任意のカラムを追加できます。
+
+## カラムの移動
+カラムは、ドラッグアンドドロップで他のカラムと位置を入れ替えることが出来るほか、カラムメニュー(カラムのヘッダー右クリック)から位置を移動させることもできます。
+
+## カラムの水平分割
+カラムは左右だけでなく、上下に並べることもできます。 カラムメニューを開き、「左に重ねる」を選択すると、左のカラムの下に現在のカラムが移動します。 上下分割を解除するには、カラムメニューの「右に出す」を選択します。
+
+## カラムの設定
+カラムメニューの「編集」を選択するとカラムの設定を編集できます。カラムの名前を変えたり、幅を変えたりできます。
+
+## デッキの設定
+デッキに関する設定は、[settings/deck](/settings/deck)で行えます。
diff --git a/src/docs/ug-CN/follow.md b/src/docs/ug-CN/follow.md
new file mode 100644
index 0000000000..3c1ea7bbe0
--- /dev/null
+++ b/src/docs/ug-CN/follow.md
@@ -0,0 +1,2 @@
+# フォロー
+ユーザーをフォローすると、タイムラインにそのユーザーの投稿が表示されるようになります。ただし、他のユーザーに対する返信は含まれません。 ユーザーをフォローするには、ユーザーページの「フォロー」ボタンをクリックします。フォローを解除するには、もう一度クリックします。
diff --git a/src/docs/ug-CN/keyboard-shortcut.md b/src/docs/ug-CN/keyboard-shortcut.md
new file mode 100644
index 0000000000..04ba792aa7
--- /dev/null
+++ b/src/docs/ug-CN/keyboard-shortcut.md
@@ -0,0 +1,68 @@
+# キーボードショートカット
+
+## グローバル
+これらのショートカットは基本的にどこでも使えます。
+<table>
+ <thead>
+ <tr><th>ショートカット</th><th>効果</th><th>由来</th></tr>
+ </thead>
+ <tbody>
+ <tr><td><kbd class="key">P</kbd>, <kbd class="key">N</kbd></td><td>新規投稿</td><td><b>P</b>ost, <b>N</b>ew, <b>N</b>ote</td></tr>
+ <tr><td><kbd class="key">T</kbd></td><td>タイムラインの最も新しい投稿にフォーカス</td><td><b>T</b>imeline, <b>T</b>op</td></tr>
+ <tr><td><kbd class="group"><kbd class="key">Shift</kbd> + <kbd class="key">N</kbd></kbd></td><td>通知を表示/隠す</td><td><b>N</b>otifications</td></tr>
+ <tr><td><kbd class="key">S</kbd></td><td>ئىزدەش</td><td><b>S</b>earch</td></tr>
+ <tr><td><kbd class="key">H</kbd>, <kbd class="key">?</kbd></td><td>ヘルプを表示</td><td><b>H</b>elp</td></tr>
+ </tbody>
+</table>
+
+## 投稿にフォーカスされた状態
+
+<table>
+ <thead>
+ <tr><th>ショートカット</th><th>効果</th><th>由来</th></tr>
+ </thead>
+ <tbody>
+ <tr><td><kbd class="key">↑</kbd>, <kbd class="key">K</kbd>, <kbd class="group"><kbd class="key">Shift</kbd> + <kbd class="key">Tab</kbd></kbd></td><td>上の投稿にフォーカスを移動</td><td>-</td></tr>
+ <tr><td><kbd class="key">↓</kbd>, <kbd class="key">J</kbd>, <kbd class="key">Tab</kbd></td><td>下の投稿にフォーカスを移動</td><td>-</td></tr>
+ <tr><td><kbd class="key">R</kbd></td><td>返信フォームを開く</td><td><b>R</b>eply</td></tr>
+ <tr><td><kbd class="key">Q</kbd></td><td>Renoteフォームを開く</td><td><b>Q</b>uote</td></tr>
+ <tr><td><kbd class="group"><kbd class="key">Ctrl</kbd> + <kbd class="key">Q</kbd></kbd></td><td>即刻Renoteする(フォームを開かずに)</td><td>-</td></tr>
+ <tr><td><kbd class="key">E</kbd>, <kbd class="key">A</kbd>, <kbd class="key">+</kbd></td><td>リアクションフォームを開く</td><td><b>E</b>mote, re<b>A</b>ction</td></tr>
+ <tr><td><kbd class="key">0</kbd>~<kbd class="key">9</kbd></td><td>数字に対応したリアクションをする(対応については後述)</td><td>-</td></tr>
+ <tr><td><kbd class="key">F</kbd>, <kbd class="key">B</kbd></td><td>お気に入りに登録</td><td><b>F</b>avorite, <b>B</b>ookmark</td></tr>
+ <tr><td><kbd class="key">Del</kbd>, <kbd class="group"><kbd class="key">Ctrl</kbd> + <kbd class="key">D</kbd></kbd></td><td>投稿を削除</td><td><b>D</b>elete</tr>
+ <tr><td><kbd class="key">M</kbd>, <kbd class="key">O</kbd></td><td>投稿に対するメニューを開く</td><td><b>M</b>ore, <b>O</b>ther</td></tr>
+ <tr><td><kbd class="key">S</kbd></td><td>CWで隠された部分を表示 or 隠す</td><td><b>S</b>how, <b>S</b>ee</td></tr>
+ <tr><td><kbd class="key">Esc</kbd></td><td>フォーカスを外す</td><td>-</td></tr>
+ </tbody>
+</table>
+
+## Renoteフォーム
+
+<table>
+ <thead>
+ <tr><th>ショートカット</th><th>効果</th><th>由来</th></tr>
+ </thead>
+ <tbody>
+ <tr><td><kbd class="key">Enter</kbd></td><td>Renoteする</td><td>-</td></tr>
+ <tr><td><kbd class="key">Q</kbd></td><td>フォームを展開する</td><td><b>Q</b>uote</td></tr>
+ <tr><td><kbd class="key">Esc</kbd></td><td>フォームを閉じる</td><td>-</td></tr>
+ </tbody>
+</table>
+
+## リアクションフォーム
+デフォルトで「👍」にフォーカスが当たっている状態です。
+<table>
+ <thead>
+ <tr><th>ショートカット</th><th>効果</th><th>由来</th></tr>
+ </thead>
+ <tbody>
+ <tr><td><kbd class="key">↑</kbd>, <kbd class="key">K</kbd></td><td>上のリアクションにフォーカスを移動</td><td>-</td></tr>
+ <tr><td><kbd class="key">↓</kbd>, <kbd class="key">J</kbd></td><td>下のリアクションにフォーカスを移動</td><td>-</td></tr>
+ <tr><td><kbd class="key">←</kbd>, <kbd class="key">H</kbd>, <kbd class="group"><kbd class="key">Shift</kbd> + <kbd class="key">Tab</kbd></kbd></td><td>左のリアクションにフォーカスを移動</td><td>-</td></tr>
+ <tr><td><kbd class="key">→</kbd>, <kbd class="key">L</kbd>, <kbd class="key">Tab</kbd></td><td>右のリアクションにフォーカスを移動</td><td>-</td></tr>
+ <tr><td><kbd class="key">Enter</kbd>, <kbd class="key">Space</kbd>, <kbd class="key">+</kbd></td><td>リアクション確定</td><td>-</td></tr>
+ <tr><td><kbd class="key">0</kbd>~<kbd class="key">9</kbd></td><td>数字に対応したリアクションで確定</td><td>-</td></tr>
+ <tr><td><kbd class="key">Esc</kbd></td><td>リアクションするのをやめる</td><td>-</td></tr>
+ </tbody>
+</table>
diff --git a/src/docs/ug-CN/mfm.md b/src/docs/ug-CN/mfm.md
new file mode 100644
index 0000000000..e237287acc
--- /dev/null
+++ b/src/docs/ug-CN/mfm.md
@@ -0,0 +1,2 @@
+# MFM
+MFMは、Misskey Flavored Markdownの略で、Misskeyの様々な場所で使用できる専用のマークアップ言語です。 MFMで使用可能な構文は[MFMチートシート](/mfm-cheat-sheet)で確認できます。
diff --git a/src/docs/ug-CN/mute.md b/src/docs/ug-CN/mute.md
new file mode 100644
index 0000000000..6a9608662a
--- /dev/null
+++ b/src/docs/ug-CN/mute.md
@@ -0,0 +1,13 @@
+# ミュート
+
+ユーザーをミュートすると、そのユーザーに関する次のコンテンツがMisskeyに表示されなくなります:
+
+* タイムラインや投稿の検索結果内の、そのユーザーの投稿(およびそれらの投稿に対する返信やRenote)
+* そのユーザーからの通知
+* メッセージ履歴一覧内の、そのユーザーとのメッセージ履歴
+
+ユーザーをミュートするには、対象のユーザーのユーザーページに表示されている「ミュート」ボタンを押します。
+
+ミュートを行ったことは相手に通知されず、ミュートされていることを知ることもできません。
+
+設定>ミュート から、自分がミュートしているユーザー一覧を確認することができます。
diff --git a/src/docs/ug-CN/pages.md b/src/docs/ug-CN/pages.md
new file mode 100644
index 0000000000..a7311b95e6
--- /dev/null
+++ b/src/docs/ug-CN/pages.md
@@ -0,0 +1,10 @@
+# Pages
+
+## 変数
+変数を使うことで動的なページを作成できます。テキスト内で <b>{ 変数名 }</b> と書くとそこに変数の値を埋め込めます。例えば <b>Hello { thing } world!</b> というテキストで、変数(thing)の値が <b>ai</b> だった場合、テキストは <b>Hello ai world!</b> になります。
+
+変数の評価(値を算出すること)は上から下に行われるので、ある変数の中で自分より下の変数を参照することはできません。例えば上から <b>A、B、C</b> と3つの変数を定義したとき、<b>C</b>の中で<b>A</b>や<b>B</b>を参照することはできますが、<b>A</b>の中で<b>B</b>や<b>C</b>を参照することはできません。
+
+ユーザーからの入力を受け取るには、ページに「ユーザー入力」ブロックを設置し、「変数名」に入力を格納したい変数名を設定します(変数は自動で作成されます)。その変数を使ってユーザー入力に応じた動作を行えます。
+
+関数を使うと、値の算出処理を再利用可能な形にまとめることができます。関数を作るには、「関数」タイプの変数を作成します。関数にはスロット(引数)を設定することができ、スロットの値は関数内で変数として利用可能です。また、関数を引数に取る関数(高階関数と呼ばれます)も存在します。関数は予め定義しておくほかに、このような高階関数のスロットに即席でセットすることもできます。
diff --git a/src/docs/ug-CN/reaction.md b/src/docs/ug-CN/reaction.md
new file mode 100644
index 0000000000..c26ead75b3
--- /dev/null
+++ b/src/docs/ug-CN/reaction.md
@@ -0,0 +1,11 @@
+# リアクション
+他の人のノートに、絵文字を付けて簡単にあなたの反応を伝えられる機能です。 リアクションするには、ノートの + アイコンをクリックしてピッカーを表示し、絵文字を選択します。 リアクションには[カスタム絵文字](./custom-emoji)も使用できます。
+
+## リアクションピッカーのカスタマイズ
+ピッカーに表示される絵文字を自分好みにカスタマイズすることができます。 設定の「リアクション」で設定します。
+
+## リモート投稿へのリアクションについて
+リアクションはMisskeyオリジナルの機能であるため、リモートインスタンスがMisskeyでない限りは、ほとんどの場合「Like」としてアクティビティが送信されます。一般的にはLikeは「お気に入り」として実装されているようです。 また、相手がMisskeyであったとしても、カスタム絵文字リアクションは伝わらず、自動的に「👍」等にフォールバックされます。
+
+## リモートからのリアクションについて
+リモートから「Like」アクティビティを受信したとき、Misskeyでは「👍」のリアクションとして解釈されます。
diff --git a/src/docs/ug-CN/reversi-bot.md b/src/docs/ug-CN/reversi-bot.md
new file mode 100644
index 0000000000..7ab2a7212e
--- /dev/null
+++ b/src/docs/ug-CN/reversi-bot.md
@@ -0,0 +1,160 @@
+# MisskeyリバーシBotの開発
+Misskeyのリバーシ機能に対応したBotの開発方法をここに記します。
+
+1. `games/reversi`ストリームに以下のパラメータを付けて接続する:
+ * `i`: botアカウントのAPIキー
+
+2. 対局への招待が来たら、ストリームから`invited`イベントが流れてくる
+ * イベントの中身に、`parent`という名前で対局へ誘ってきたユーザーの情報が含まれている
+
+3. `games/reversi/match`へ、`user_id`として`parent`の`id`が含まれたリクエストを送信する
+
+4. 上手くいくとゲーム情報が返ってくるので、`games/reversi-game`ストリームへ、以下のパラメータを付けて接続する:
+ * `i`: botアカウントのAPIキー
+ * `game`: `game`の`id`
+
+5. この間、相手がゲームの設定を変更するとその都度`update-settings`イベントが流れてくるので、必要であれば何かしらの処理を行う
+
+6. 設定に満足したら、`{ type: 'accept' }`メッセージをストリームに送信する
+
+7. ゲームが開始すると、`started`イベントが流れてくる
+ * イベントの中身にはゲーム情報が含まれている
+
+8. 石を打つには、ストリームに`{ type: 'set', pos: <位置> }`を送信する(位置の計算方法は後述)
+
+9. 相手または自分が石を打つと、ストリームから`set`イベントが流れてくる
+ * `color`として石の色が含まれている
+ * `pos`として位置情報が含まれている
+
+## 位置の計算法
+8x8のマップを考える場合、各マスの位置(インデックスと呼びます)は次のようになっています:
+```
++--+--+--+--+--+--+--+--+
+| 0| 1| 2| 3| 4| 5| 6| 7|
++--+--+--+--+--+--+--+--+
+| 8| 9|10|11|12|13|14|15|
++--+--+--+--+--+--+--+--+
+|16|17|18|19|20|21|22|23|
+...
+```
+
+### X,Y座標 から インデックス に変換する
+```
+pos = x + (y * mapWidth)
+```
+`mapWidth`は、ゲーム情報の`map`から、次のようにして計算できます:
+```
+mapWidth = map[0].length
+```
+
+### インデックス から X,Y座標 に変換する
+```
+x = pos % mapWidth
+y = Math.floor(pos / mapWidth)
+```
+
+## マップ情報
+マップ情報は、ゲーム情報の`map`に入っています。 文字列の配列になっており、ひとつひとつの文字がマス情報を表しています。 それをもとにマップのデザインを知る事が出来ます:
+* `(スペース)` ... マス無し
+* `-` ... マス
+* `b` ... 初期配置される黒石
+* `w` ... 初期配置される白石
+
+例えば、4*4の次のような単純なマップがあるとします:
+```text
++---+---+---+---+
+| | | | |
++---+---+---+---+
+| | ○ | ● | |
++---+---+---+---+
+| | ● | ○ | |
++---+---+---+---+
+| | | | |
++---+---+---+---+
+```
+
+この場合、マップデータはこのようになります:
+```javascript
+['----', '-wb-', '-bw-', '----']
+```
+
+## ユーザーにフォームを提示して対話可能Botを作成する
+ユーザーとのコミュニケーションを行うため、ゲームの設定画面でユーザーにフォームを提示することができます。 例えば、Botの強さをユーザーが設定できるようにする、といったシナリオが考えられます。
+
+フォームを提示するには、`reversi-game`ストリームに次のメッセージを送信します:
+```javascript
+{
+ type: 'init-form',
+ body: [フォームコントロールの配列]
+}
+```
+
+フォームコントロールの配列については今から説明します。 フォームコントロールは、次のようなオブジェクトです:
+```javascript
+{
+ id: 'switch1',
+ type: 'switch',
+ label: 'Enable hoge',
+ value: false
+}
+```
+`id` ... コントロールのID。 `type` ... コントロールの種類。後述します。 `label` ... コントロールと一緒に表記するテキスト。 `value` ... コントロールのデフォルト値。
+
+### フォームの操作を受け取る
+ユーザーがフォームを操作すると、ストリームから`update-form`イベントが流れてきます。 イベントの中身には、コントロールのIDと、ユーザーが設定した値が含まれています。 例えば、上で示したスイッチをユーザーがオンにしたとすると、次のイベントが流れてきます:
+```javascript
+{
+ id: 'switch1',
+ value: true
+}
+```
+
+### フォームコントロールの種類
+#### スイッチ
+type: `switch` スイッチを表示します。何かの機能をオン/オフさせたい場合に有用です。
+
+##### プロパティ
+`label` ... スイッチに表記するテキスト。
+
+#### ラジオボタン
+type: `radio` ラジオボタンを表示します。選択肢を提示するのに有用です。例えば、Botの強さを設定させるなどです。
+
+##### プロパティ
+`items` ... ラジオボタンの選択肢。例:
+```javascript
+items: [{
+ label: '弱',
+ value: 1
+}, {
+ label: '中',
+ value: 2
+}, {
+ label: '強',
+ value: 3
+}]
+```
+
+#### スライダー
+type: `slider` スライダーを表示します。
+
+##### プロパティ
+`min` ... スライダーの下限。 `max` ... スライダーの上限。 `step` ... 入力欄で刻むステップ値。
+
+#### テキストボックス
+type: `textbox` テキストボックスを表示します。ユーザーになにか入力させる一般的な用途に利用できます。
+
+## ユーザーにメッセージを表示する
+設定画面でユーザーと対話する、フォーム以外のもうひとつの方法がこれです。ユーザーになにかメッセージを表示することができます。 例えば、ユーザーがBotの対応していないモードやマップを選択したとき、警告を表示するなどです。 メッセージを表示するには、次のメッセージをストリームに送信します:
+```javascript
+{
+ type: 'message',
+ body: {
+ text: 'メッセージ内容',
+ type: 'メッセージの種類'
+ }
+}
+```
+メッセージの種類: `success`, `info`, `warning`, `error`。
+
+## 投了する
+投了をするには、<a href="./api/endpoints/games/reversi/games/surrender">このエンドポイント</a>にリクエストします。
diff --git a/src/docs/ug-CN/stream.md b/src/docs/ug-CN/stream.md
new file mode 100644
index 0000000000..9011c37c5b
--- /dev/null
+++ b/src/docs/ug-CN/stream.md
@@ -0,0 +1,354 @@
+# ストリーミングAPI
+
+ストリーミングAPIを使うと、リアルタイムで様々な情報(例えばタイムラインに新しい投稿が流れてきた、メッセージが届いた、フォローされた、など)を受け取ったり、様々な操作を行ったりすることができます。
+
+## ストリームに接続する
+
+ストリーミングAPIを利用するには、まずMisskeyサーバーに**websocket**接続する必要があります。
+
+以下のURLに、`i`というパラメータ名で認証情報を含めて、websocket接続してください。例:
+```
+%WS_URL%/streaming?i=xxxxxxxxxxxxxxx
+```
+
+認証情報は、自分のAPIキーや、アプリケーションからストリームに接続する際はユーザーのアクセストークンのことを指します。
+
+<div class="ui info">
+ <p><i class="fas fa-info-circle"></i> 認証情報の取得については、<a href="./api">こちらのドキュメント</a>をご確認ください。</p>
+</div>
+
+---
+
+認証情報は省略することもできますが、その場合非ログインでの利用ということになり、受信できる情報や可能な操作は限られます。例:
+
+```
+%WS_URL%/streaming
+```
+
+---
+
+ストリームに接続すると、後述するAPI操作や、投稿の購読を行ったりすることができます。 しかしまだこの段階では、例えばタイムラインへの新しい投稿を受信したりすることはできません。 それを行うには、ストリーム上で、後述する**チャンネル**に接続する必要があります。
+
+**ストリームでのやり取りはすべてJSONです。**
+
+## チャンネル
+MisskeyのストリーミングAPIにはチャンネルという概念があります。これは、送受信する情報を分離するための仕組みです。 Misskeyのストリームに接続しただけでは、まだリアルタイムでタイムラインの投稿を受信したりはできません。 ストリーム上でチャンネルに接続することで、様々な情報を受け取ったり情報を送信したりすることができるようになります。
+
+### チャンネルに接続する
+チャンネルに接続するには、次のようなデータをJSONでストリームに送信します:
+
+```json
+{
+ type: 'connect',
+ body: {
+ channel: 'xxxxxxxx',
+ id: 'foobar',
+ params: {
+ ...
+ }
+ }
+}
+```
+
+ここで、
+* `channel`には接続したいチャンネル名を設定します。チャンネルの種類については後述します。
+* `id`にはそのチャンネルとやり取りするための任意のIDを設定します。ストリームでは様々なメッセージが流れるので、そのメッセージがどのチャンネルからのものなのか識別する必要があるからです。このIDは、UUIDや、乱数のようなもので構いません。
+* `params`はチャンネルに接続する際のパラメータです。チャンネルによって接続時に必要とされるパラメータは異なります。パラメータ不要のチャンネルに接続する際は、このプロパティは省略可能です。
+
+<div class="ui info">
+ <p><i class="fas fa-info-circle"></i> IDはチャンネルごとではなく「チャンネルの接続ごと」です。なぜなら、同じチャンネルに異なるパラメータで複数接続するケースもあるからです。</p>
+</div>
+
+### チャンネルからのメッセージを受け取る
+例えばタイムラインのチャンネルなら、新しい投稿があった時にメッセージを発します。そのメッセージを受け取ることで、タイムラインに新しい投稿がされたことをリアルタイムで知ることができます。
+
+チャンネルがメッセージを発すると、次のようなデータがJSONでストリームに流れてきます:
+```json
+{
+ type: 'channel',
+ body: {
+ id: 'foobar',
+ type: 'something',
+ body: {
+ some: 'thing'
+ }
+ }
+}
+```
+
+ここで、
+* `id`には前述したそのチャンネルに接続する際に設定したIDが設定されています。これで、このメッセージがどのチャンネルからのものなのか知ることができます。
+* `type`にはメッセージの種類が設定されます。チャンネルによって、どのような種類のメッセージが流れてくるかは異なります。
+* `body`にはメッセージの内容が設定されます。チャンネルによって、どのような内容のメッセージが流れてくるかは異なります。
+
+### チャンネルに向けてメッセージを送信する
+チャンネルによっては、メッセージを受け取るだけでなく、こちらから何かメッセージを送信し、何らかの操作を行える場合があります。
+
+チャンネルにメッセージを送信するには、次のようなデータをJSONでストリームに送信します:
+```json
+{
+ type: 'channel',
+ body: {
+ id: 'foobar',
+ type: 'something',
+ body: {
+ some: 'thing'
+ }
+ }
+}
+```
+
+ここで、
+* `id`には前述したそのチャンネルに接続する際に設定したIDを設定します。これで、このメッセージがどのチャンネルに向けたものなのか識別させることができます。
+* `type`にはメッセージの種類を設定します。チャンネルによって、どのような種類のメッセージを受け付けるかは異なります。
+* `body`にはメッセージの内容を設定します。チャンネルによって、どのような内容のメッセージを受け付けるかは異なります。
+
+### チャンネルから切断する
+チャンネルから切断するには、次のようなデータをJSONでストリームに送信します:
+
+```json
+{
+ type: 'disconnect',
+ body: {
+ id: 'foobar'
+ }
+}
+```
+
+ここで、
+* `id`には前述したそのチャンネルに接続する際に設定したIDを設定します。
+
+## ストリームを経由してAPIリクエストする
+
+ストリームを経由してAPIリクエストすると、HTTPリクエストを発生させずにAPIを利用できます。そのため、コードを簡潔にできたり、パフォーマンスの向上を見込めるかもしれません。
+
+ストリームを経由してAPIリクエストするには、次のようなデータをJSONでストリームに送信します:
+```json
+{
+ type: 'api',
+ body: {
+ id: 'xxxxxxxxxxxxxxxx',
+ endpoint: 'notes/create',
+ data: {
+ text: 'yee haw!'
+ }
+ }
+}
+```
+
+ここで、
+* `id`には、APIのレスポンスを識別するための、APIリクエストごとの一意なIDを設定する必要があります。UUIDや、簡単な乱数のようなもので構いません。
+* `endpoint`には、あなたがリクエストしたいAPIのエンドポイントを指定します。
+* `data`には、エンドポイントのパラメータを含めます。
+
+<div class="ui info">
+ <p><i class="fas fa-info-circle"></i> APIのエンドポイントやパラメータについてはAPIリファレンスをご確認ください。</p>
+</div>
+
+### レスポンスの受信
+
+APIへリクエストすると、レスポンスがストリームから次のような形式で流れてきます。
+
+```json
+{
+ type: 'api:xxxxxxxxxxxxxxxx',
+ body: {
+ ...
+ }
+}
+```
+
+ここで、
+* `xxxxxxxxxxxxxxxx`の部分には、リクエストの際に設定された`id`が含まれています。これにより、どのリクエストに対するレスポンスなのか判別することができます。
+* `body`には、レスポンスが含まれています。
+
+## 投稿のキャプチャ
+
+Misskeyは投稿のキャプチャと呼ばれる仕組みを提供しています。これは、指定した投稿のイベントをストリームで受け取る機能です。
+
+例えばタイムラインを取得してユーザーに表示したとします。ここで誰かがそのタイムラインに含まれるどれかの投稿に対してリアクションしたとします。
+
+しかし、クライアントからするとある投稿にリアクションが付いたことなどは知る由がないため、リアルタイムでリアクションをタイムライン上の投稿に反映して表示するといったことができません。
+
+この問題を解決するために、Misskeyは投稿のキャプチャ機構を用意しています。投稿をキャプチャすると、その投稿に関するイベントを受け取ることができるため、リアルタイムでリアクションを反映させたりすることが可能になります。
+
+### 投稿をキャプチャする
+
+投稿をキャプチャするには、ストリームに次のようなメッセージを送信します:
+
+```json
+{
+ type: 'subNote',
+ body: {
+ id: 'xxxxxxxxxxxxxxxx'
+ }
+}
+```
+
+ここで、
+* `id`にキャプチャしたい投稿の`id`を設定します。
+
+このメッセージを送信すると、Misskeyにキャプチャを要請したことになり、以後、その投稿に関するイベントが流れてくるようになります。
+
+例えば投稿にリアクションが付いたとすると、次のようなメッセージが流れてきます:
+
+```json
+{
+ type: 'noteUpdated',
+ body: {
+ id: 'xxxxxxxxxxxxxxxx',
+ type: 'reacted',
+ body: {
+ reaction: 'like',
+ userId: 'yyyyyyyyyyyyyyyy'
+ }
+ }
+}
+```
+
+ここで、
+* `body`内の`id`に、イベントを発生させた投稿のIDが設定されます。
+* `body`内の`type`に、イベントの種類が設定されます。
+* `body`内の`body`に、イベントの詳細が設定されます。
+
+#### イベントの種類
+
+##### `reacted`
+その投稿にリアクションがされた時に発生します。
+
+* `reaction`に、リアクションの種類が設定されます。
+* `userId`に、リアクションを行ったユーザーのIDが設定されます。
+
+例:
+```json
+{
+ type: 'noteUpdated',
+ body: {
+ id: 'xxxxxxxxxxxxxxxx',
+ type: 'reacted',
+ body: {
+ reaction: 'like',
+ userId: 'yyyyyyyyyyyyyyyy'
+ }
+ }
+}
+```
+
+##### `deleted`
+その投稿が削除された時に発生します。
+
+* `deletedAt`に、削除日時が設定されます。
+
+例:
+```json
+{
+ type: 'noteUpdated',
+ body: {
+ id: 'xxxxxxxxxxxxxxxx',
+ type: 'deleted',
+ body: {
+ deletedAt: '2018-10-22T02:17:09.703Z'
+ }
+ }
+}
+```
+
+##### `pollVoted`
+その投稿に添付されたアンケートに投票された時に発生します。
+
+* `choice`に、選択肢IDが設定されます。
+* `userId`に、投票を行ったユーザーのIDが設定されます。
+
+例:
+```json
+{
+ type: 'noteUpdated',
+ body: {
+ id: 'xxxxxxxxxxxxxxxx',
+ type: 'pollVoted',
+ body: {
+ choice: 2,
+ userId: 'yyyyyyyyyyyyyyyy'
+ }
+ }
+}
+```
+
+### 投稿のキャプチャを解除する
+
+その投稿がもう画面に表示されなくなったりして、その投稿に関するイベントをもう受け取る必要がなくなったときは、キャプチャの解除を申請してください。
+
+次のメッセージを送信します:
+
+```json
+{
+ type: 'unsubNote',
+ body: {
+ id: 'xxxxxxxxxxxxxxxx'
+ }
+}
+```
+
+ここで、
+* `id`にキャプチャを解除したい投稿の`id`を設定します。
+
+このメッセージを送信すると、以後、その投稿に関するイベントは流れてこないようになります。
+
+# チャンネル一覧
+## `main`
+アカウントに関する基本的な情報が流れてきます。このチャンネルにパラメータはありません。
+
+### 流れてくるイベント一覧
+
+#### `renote`
+自分の投稿がRenoteされた時に発生するイベントです。自分自身の投稿をRenoteしたときは発生しません。
+
+#### `mention`
+誰かからメンションされたときに発生するイベントです。
+
+#### `readAllNotifications`
+自分宛ての通知がすべて既読になったことを表すイベントです。このイベントを利用して、「通知があることを示すアイコン」のようなものをオフにしたりする等のケースが想定されます。
+
+#### `meUpdated`
+自分の情報が更新されたことを表すイベントです。
+
+#### `follow`
+自分が誰かをフォローしたときに発生するイベントです。
+
+#### `unfollow`
+自分が誰かのフォローを解除したときに発生するイベントです。
+
+#### `followed`
+自分が誰かにフォローされたときに発生するイベントです。
+
+## `homeTimeline`
+ホームタイムラインの投稿情報が流れてきます。このチャンネルにパラメータはありません。
+
+### 流れてくるイベント一覧
+
+#### `note`
+タイムラインに新しい投稿が流れてきたときに発生するイベントです。
+
+## `localTimeline`
+ローカルタイムラインの投稿情報が流れてきます。このチャンネルにパラメータはありません。
+
+### 流れてくるイベント一覧
+
+#### `note`
+ローカルタイムラインに新しい投稿が流れてきたときに発生するイベントです。
+
+## `hybridTimeline`
+ソーシャルタイムラインの投稿情報が流れてきます。このチャンネルにパラメータはありません。
+
+### 流れてくるイベント一覧
+
+#### `note`
+ソーシャルタイムラインに新しい投稿が流れてきたときに発生するイベントです。
+
+## `globalTimeline`
+グローバルタイムラインの投稿情報が流れてきます。このチャンネルにパラメータはありません。
+
+### 流れてくるイベント一覧
+
+#### `note`
+グローバルタイムラインに新しい投稿が流れてきたときに発生するイベントです。
diff --git a/src/docs/ug-CN/theme.md b/src/docs/ug-CN/theme.md
new file mode 100644
index 0000000000..4e52ee8cd7
--- /dev/null
+++ b/src/docs/ug-CN/theme.md
@@ -0,0 +1,68 @@
+# テーマ
+
+テーマを設定して、Misskeyクライアントの見た目を変更できます。
+
+## テーマの設定
+設定 > テーマ
+
+## テーマを作成する
+テーマコードはJSON5で記述されたテーマオブジェクトです。 テーマは以下のようなオブジェクトです。
+``` js
+{
+ id: '17587283-dd92-4a2c-a22c-be0637c9e22a',
+
+ name: 'Danboard',
+ author: 'syuilo',
+
+ base: 'light',
+
+ props: {
+ accent: 'rgb(218, 141, 49)',
+ bg: 'rgb(218, 212, 190)',
+ fg: 'rgb(115, 108, 92)',
+ panel: 'rgb(236, 232, 220)',
+ renote: 'rgb(100, 152, 106)',
+ link: 'rgb(100, 152, 106)',
+ mention: '@accent',
+ hashtag: 'rgb(100, 152, 106)',
+ header: 'rgba(239, 227, 213, 0.75)',
+ navBg: 'rgb(216, 206, 182)',
+ inputBorder: 'rgba(0, 0, 0, 0.1)',
+ },
+}
+
+```
+
+* `id` ... テーマの一意なID。UUIDをおすすめします。
+* `name` ... テーマ名
+* `author` ... テーマの作者
+* `desc` ... テーマの説明(オプション)
+* `base` ... 明るいテーマか、暗いテーマか
+ * `light`にすると明るいテーマになり、`dark`にすると暗いテーマになります。
+ * テーマはここで設定されたベーステーマを継承します。
+* `props` ... テーマのスタイル定義。これから説明します。
+
+### テーマのスタイル定義
+`props`下にはテーマのスタイルを定義します。 キーがCSSの変数名になり、バリューで中身を指定します。 なお、この`props`オブジェクトはベーステーマから継承されます。 ベーステーマは、このテーマの`base`が`light`なら[_light.json5](https://github.com/syuilo/misskey/blob/develop/src/client/themes/_light.json5)で、`dark`なら[_dark.json5](https://github.com/syuilo/misskey/blob/develop/src/client/themes/_dark.json5)です。 つまり、このテーマ内の`props`に`panel`というキーが無くても、そこにはベーステーマの`panel`があると見なされます。
+
+#### バリューで使える構文
+* 16進数で表された色
+ * 例: `#00ff00`
+* `rgb(r, g, b)`形式で表された色
+ * 例: `rgb(0, 255, 0)`
+* `rgb(r, g, b, a)`形式で表された透明度を含む色
+ * 例: `rgba(0, 255, 0, 0.5)`
+* 他のキーの値の参照
+ * `@{キー名}`と書くと他のキーの値の参照になります。`{キー名}`は参照したいキーの名前に置き換えます。
+ * 例: `@panel`
+* 定数(後述)の参照
+ * `${定数名}`と書くと定数の参照になります。`{定数名}`は参照したい定数の名前に置き換えます。
+ * 例: `$main`
+* 関数(後述)
+ * `:{関数名}<{引数}<{色}`
+
+#### 定数
+「CSS変数として出力はしたくないが、他のCSS変数の値として使いまわしたい」値があるときは、定数を使うと便利です。 キー名を`$`で始めると、そのキーはCSS変数として出力されません。
+
+#### 関数
+wip
diff --git a/src/docs/ug-CN/timelines.md b/src/docs/ug-CN/timelines.md
new file mode 100644
index 0000000000..36ba61bd2d
--- /dev/null
+++ b/src/docs/ug-CN/timelines.md
@@ -0,0 +1,15 @@
+# タイムラインの比較
+
+https://docs.google.com/spreadsheets/d/1lxQ2ugKrhz58Bg96HTDK_2F98BUritkMyIiBkOByjHA/edit?usp=sharing
+
+## ホーム
+自分のフォローしているユーザーの投稿
+
+## ローカル
+全てのローカルユーザーの「ホーム」指定されていない投稿
+
+## ソーシャル
+自分のフォローしているユーザーの投稿と、全てのローカルユーザーの「ホーム」指定されていない投稿
+
+## グローバル
+全てのローカルユーザーの「ホーム」指定されていない投稿と、サーバーに届いた全てのリモートユーザーの「ホーム」指定されていない投稿
diff --git a/src/docs/uk-UA/aiscript.md b/src/docs/uk-UA/aiscript.md
new file mode 100644
index 0000000000..1cbbf71e5d
--- /dev/null
+++ b/src/docs/uk-UA/aiscript.md
@@ -0,0 +1,4 @@
+# AiScript
+
+## Функції
+デフォルトで値渡しです。
diff --git a/src/docs/uk-UA/api.md b/src/docs/uk-UA/api.md
new file mode 100644
index 0000000000..76019b6145
--- /dev/null
+++ b/src/docs/uk-UA/api.md
@@ -0,0 +1,58 @@
+# Misskey API
+
+MisskeyAPIを使ってMisskeyクライアント、Misskey連携Webサービス、Bot等(以下「アプリケーション」と呼びます)を開発できます。 ストリーミングAPIもあるので、リアルタイム性のあるアプリケーションを作ることも可能です。
+
+APIを使い始めるには、まずアクセストークンを取得する必要があります。 このドキュメントでは、アクセストークンを取得する手順を説明した後、基本的なAPIの使い方を説明します。
+
+## アクセストークンの取得
+基本的に、APIはリクエストにはアクセストークンが必要となります。 APIにリクエストするのが自分自身なのか、不特定の利用者に使ってもらうアプリケーションなのかによって取得手順は異なります。
+
+* 前者の場合: [「自分自身のアクセストークンを手動発行する」](#自分自身のアクセストークンを手動発行する)に進む
+* 後者の場合: [「アプリケーション利用者にアクセストークンの発行をリクエストする」](#アプリケーション利用者にアクセストークンの発行をリクエストする)に進む
+
+### 自分自身のアクセストークンを手動発行する
+「設定 > API」で、自分のアクセストークンを発行できます。
+
+[「APIの使い方」へ進む](#APIの使い方)
+
+### アプリケーション利用者にアクセストークンの発行をリクエストする
+アプリケーション利用者のアクセストークンを取得するには、以下の手順で発行をリクエストします。
+
+#### Step 1
+
+UUIDを生成する。以後これをセッションIDと呼びます。
+
+> このセッションIDは毎回生成し、使いまわさないようにしてください。
+
+#### Step 2
+
+`{_URL_}/miauth/{session}`をユーザーのブラウザで表示させる。`{session}`の部分は、セッションIDに置き換えてください。
+> 例: `{_URL_}/miauth/c1f6d42b-468b-4fd2-8274-e58abdedef6f`
+
+表示する際、URLにクエリパラメータとしていくつかのオプションを設定できます:
+* `name` ... アプリケーション名
+ * > 例: `MissDeck`
+* `icon` ... アプリケーションのアイコン画像URL
+ * > 例: `https://missdeck.example.com/icon.png`
+* `callback` ... 認証が終わった後にリダイレクトするURL
+ * > 例: `https://missdeck.example.com/callback`
+ * リダイレクト時には、`session`というクエリパラメータでセッションIDが付きます
+* `permission` ... アプリケーションが要求する権限
+ * > 例: `write:notes,write:following,read:drive`
+ * 要求する権限を`,`で区切って列挙します
+ * どのような権限があるかは[APIリファレンス](/api-doc)で確認できます
+
+#### Step 3
+ユーザーが発行を許可した後、`{_URL_}/api/miauth/{session}/check`にPOSTリクエストすると、レスポンスとしてアクセストークンを含むJSONが返ります。
+
+レスポンスに含まれるプロパティ:
+* `token` ... ユーザーのアクセストークン
+* `user` ... ユーザーの情報
+
+[「APIの使い方」へ進む](#APIの使い方)
+
+## APIの使い方
+**APIはすべてPOSTで、リクエスト/レスポンスともにJSON形式です。RESTではありません。** アクセストークンは、`i`というパラメータ名でリクエストに含めます。
+
+* [APIリファレンス](/api-doc)
+* [ストリーミングAPI](./stream)
diff --git a/src/docs/uk-UA/create-plugin.md b/src/docs/uk-UA/create-plugin.md
new file mode 100644
index 0000000000..5c60b47800
--- /dev/null
+++ b/src/docs/uk-UA/create-plugin.md
@@ -0,0 +1,74 @@
+# プラグインの作成
+Misskey Webクライアントのプラグイン機能を使うと、クライアントを拡張し、様々な機能を追加できます。 ここではプラグインの作成にあたってのメタデータ定義や、AiScript APIリファレンスを掲載します。
+
+## Метадані
+プラグインは、AiScriptのメタデータ埋め込み機能を使って、デフォルトとしてプラグインのメタデータを定義する必要があります。 メタデータは次のプロパティを含むオブジェクトです。
+
+### name
+プラグイン名
+
+### author
+プラグイン作者
+
+### version
+プラグインバージョン。数値を指定してください。
+
+### description
+プラグインの説明
+
+### permissions
+プラグインが要求する権限。MisskeyAPIにリクエストする際に用いられます。
+
+### config
+プラグインの設定情報を表すオブジェクト。 キーに設定名、値に以下のプロパティを含めます。
+
+#### type
+設定値の種類を表す文字列。以下から選択します。 string number boolean
+
+#### label
+ユーザーに表示する設定名
+
+#### description
+設定の説明
+
+#### default
+設定のデフォルト値
+
+## APIリファレンス
+AiScript標準で組み込まれているAPIは掲載しません。
+
+### Mk:dialog(title text type)
+ダイアログを表示します。typeには以下の値が設定できます。 info success warn error question 省略すると info になります。
+
+### Mk:confirm(title text type)
+確認ダイアログを表示します。typeには以下の値が設定できます。 info success warn error question 省略すると question になります。 ユーザーが"OK"を選択した場合は true を、"キャンセル"を選択した場合は false が返ります。
+
+### Mk:api(endpoint params)
+Misskey APIにリクエストします。第一引数にエンドポイント名、第二引数にパラメータオブジェクトを渡します。
+
+### Mk:save(key value)
+任意の値に任意の名前を付けて永続化します。永続化した値は、AiScriptコンテキストが終了しても残り、Mk:loadで読み取ることができます。
+
+### Mk:load(key)
+Mk:saveで永続化した指定の名前の値を読み取ります。
+
+### Plugin:register_post_form_action(title fn)
+投稿フォームにアクションを追加します。第一引数にアクション名、第二引数にアクションが選択された際のコールバック関数を渡します。 コールバック関数には、第一引数に投稿フォームオブジェクトが渡されます。
+
+### Plugin:register_note_action(title fn)
+ノートメニューに項目を追加します。第一引数に項目名、第二引数に項目が選択された際のコールバック関数を渡します。 コールバック関数には、第一引数に対象のノートオブジェクトが渡されます。
+
+### Plugin:register_user_action(title fn)
+ユーザーメニューに項目を追加します。第一引数に項目名、第二引数に項目が選択された際のコールバック関数を渡します。 コールバック関数には、第一引数に対象のユーザーオブジェクトが渡されます。
+
+### Plugin:register_note_view_interruptor(fn)
+UIに表示されるノート情報を書き換えます。 コールバック関数には、第一引数に対象のノートオブジェクトが渡されます。 コールバック関数の返り値でノートが書き換えられます。
+
+### Plugin:register_note_post_interruptor(fn)
+ノート投稿時にノート情報を書き換えます。 コールバック関数には、第一引数に対象のノートオブジェクトが渡されます。 コールバック関数の返り値でノートが書き換えられます。
+
+### Plugin:open_url(url)
+第一引数に渡されたURLをブラウザの新しいタブで開きます。
+
+### Plugin:config
+プラグインの設定が格納されるオブジェクト。プラグイン定義のconfigで設定したキーで値が入ります。
diff --git a/src/docs/uk-UA/custom-emoji.md b/src/docs/uk-UA/custom-emoji.md
new file mode 100644
index 0000000000..2a130cb1d9
--- /dev/null
+++ b/src/docs/uk-UA/custom-emoji.md
@@ -0,0 +1,2 @@
+# Кастомні емоджі
+カスタム絵文字は、インスタンスで用意された画像を絵文字のように使える機能です。 ノート、リアクション、チャット、自己紹介、名前などの場所で使うことができます。 カスタム絵文字をそれらの場所で使うには、絵文字ピッカーボタン(ある場合)を押すか、`:`を入力して絵文字サジェストを表示します。 テキスト内に`:foo:`のような形式の文字列が見つかると、`foo`の部分がカスタム絵文字名と解釈され、表示時には対応したカスタム絵文字に置き換わります。
diff --git a/src/docs/uk-UA/deck.md b/src/docs/uk-UA/deck.md
new file mode 100644
index 0000000000..acb80815c6
--- /dev/null
+++ b/src/docs/uk-UA/deck.md
@@ -0,0 +1,18 @@
+# Дек
+
+デッキは利用可能なUIのひとつです。「カラム」と呼ばれるビューを複数並べて表示させることで、カスタマイズ性が高く、情報量の多いUIが構築できることが特徴です。
+
+## カラムの追加
+デッキの背景を右クリックし、「カラムを追加」して任意のカラムを追加できます。
+
+## カラムの移動
+カラムは、ドラッグアンドドロップで他のカラムと位置を入れ替えることが出来るほか、カラムメニュー(カラムのヘッダー右クリック)から位置を移動させることもできます。
+
+## カラムの水平分割
+カラムは左右だけでなく、上下に並べることもできます。 カラムメニューを開き、「左に重ねる」を選択すると、左のカラムの下に現在のカラムが移動します。 上下分割を解除するには、カラムメニューの「右に出す」を選択します。
+
+## カラムの設定
+カラムメニューの「編集」を選択するとカラムの設定を編集できます。カラムの名前を変えたり、幅を変えたりできます。
+
+## デッキの設定
+デッキに関する設定は、[settings/deck](/settings/deck)で行えます。
diff --git a/src/docs/uk-UA/follow.md b/src/docs/uk-UA/follow.md
new file mode 100644
index 0000000000..db2a4c3318
--- /dev/null
+++ b/src/docs/uk-UA/follow.md
@@ -0,0 +1,2 @@
+# Підписки
+ユーザーをフォローすると、タイムラインにそのユーザーの投稿が表示されるようになります。ただし、他のユーザーに対する返信は含まれません。 ユーザーをフォローするには、ユーザーページの「フォロー」ボタンをクリックします。フォローを解除するには、もう一度クリックします。
diff --git a/src/docs/uk-UA/keyboard-shortcut.md b/src/docs/uk-UA/keyboard-shortcut.md
new file mode 100644
index 0000000000..7105fc4199
--- /dev/null
+++ b/src/docs/uk-UA/keyboard-shortcut.md
@@ -0,0 +1,68 @@
+# キーボードショートカット
+
+## Глобальна
+これらのショートカットは基本的にどこでも使えます。
+<table>
+ <thead>
+ <tr><th>ショートカット</th><th>効果</th><th>由来</th></tr>
+ </thead>
+ <tbody>
+ <tr><td><kbd class="key">P</kbd>, <kbd class="key">N</kbd></td><td>新規投稿</td><td><b>P</b>ost, <b>N</b>ew, <b>N</b>ote</td></tr>
+ <tr><td><kbd class="key">T</kbd></td><td>タイムラインの最も新しい投稿にフォーカス</td><td><b>T</b>imeline, <b>T</b>op</td></tr>
+ <tr><td><kbd class="group"><kbd class="key">Shift</kbd> + <kbd class="key">N</kbd></kbd></td><td>通知を表示/隠す</td><td><b>N</b>otifications</td></tr>
+ <tr><td><kbd class="key">S</kbd></td><td>Пошук</td><td><b>S</b>earch</td></tr>
+ <tr><td><kbd class="key">H</kbd>, <kbd class="key">?</kbd></td><td>ヘルプを表示</td><td><b>H</b>elp</td></tr>
+ </tbody>
+</table>
+
+## 投稿にフォーカスされた状態
+
+<table>
+ <thead>
+ <tr><th>ショートカット</th><th>効果</th><th>由来</th></tr>
+ </thead>
+ <tbody>
+ <tr><td><kbd class="key">↑</kbd>, <kbd class="key">K</kbd>, <kbd class="group"><kbd class="key">Shift</kbd> + <kbd class="key">Tab</kbd></kbd></td><td>上の投稿にフォーカスを移動</td><td>-</td></tr>
+ <tr><td><kbd class="key">↓</kbd>, <kbd class="key">J</kbd>, <kbd class="key">Tab</kbd></td><td>下の投稿にフォーカスを移動</td><td>-</td></tr>
+ <tr><td><kbd class="key">R</kbd></td><td>返信フォームを開く</td><td><b>R</b>eply</td></tr>
+ <tr><td><kbd class="key">Q</kbd></td><td>Renoteフォームを開く</td><td><b>Q</b>uote</td></tr>
+ <tr><td><kbd class="group"><kbd class="key">Ctrl</kbd> + <kbd class="key">Q</kbd></kbd></td><td>即刻Renoteする(フォームを開かずに)</td><td>-</td></tr>
+ <tr><td><kbd class="key">E</kbd>, <kbd class="key">A</kbd>, <kbd class="key">+</kbd></td><td>リアクションフォームを開く</td><td><b>E</b>mote, re<b>A</b>ction</td></tr>
+ <tr><td><kbd class="key">0</kbd>~<kbd class="key">9</kbd></td><td>数字に対応したリアクションをする(対応については後述)</td><td>-</td></tr>
+ <tr><td><kbd class="key">F</kbd>, <kbd class="key">B</kbd></td><td>お気に入りに登録</td><td><b>F</b>avorite, <b>B</b>ookmark</td></tr>
+ <tr><td><kbd class="key">Del</kbd>, <kbd class="group"><kbd class="key">Ctrl</kbd> + <kbd class="key">D</kbd></kbd></td><td>投稿を削除</td><td><b>D</b>elete</tr>
+ <tr><td><kbd class="key">M</kbd>, <kbd class="key">O</kbd></td><td>投稿に対するメニューを開く</td><td><b>M</b>ore, <b>O</b>ther</td></tr>
+ <tr><td><kbd class="key">S</kbd></td><td>CWで隠された部分を表示 or 隠す</td><td><b>S</b>how, <b>S</b>ee</td></tr>
+ <tr><td><kbd class="key">Esc</kbd></td><td>フォーカスを外す</td><td>-</td></tr>
+ </tbody>
+</table>
+
+## Renoteフォーム
+
+<table>
+ <thead>
+ <tr><th>ショートカット</th><th>効果</th><th>由来</th></tr>
+ </thead>
+ <tbody>
+ <tr><td><kbd class="key">Enter</kbd></td><td>Renoteする</td><td>-</td></tr>
+ <tr><td><kbd class="key">Q</kbd></td><td>フォームを展開する</td><td><b>Q</b>uote</td></tr>
+ <tr><td><kbd class="key">Esc</kbd></td><td>フォームを閉じる</td><td>-</td></tr>
+ </tbody>
+</table>
+
+## リアクションフォーム
+デフォルトで「👍」にフォーカスが当たっている状態です。
+<table>
+ <thead>
+ <tr><th>ショートカット</th><th>効果</th><th>由来</th></tr>
+ </thead>
+ <tbody>
+ <tr><td><kbd class="key">↑</kbd>, <kbd class="key">K</kbd></td><td>上のリアクションにフォーカスを移動</td><td>-</td></tr>
+ <tr><td><kbd class="key">↓</kbd>, <kbd class="key">J</kbd></td><td>下のリアクションにフォーカスを移動</td><td>-</td></tr>
+ <tr><td><kbd class="key">←</kbd>, <kbd class="key">H</kbd>, <kbd class="group"><kbd class="key">Shift</kbd> + <kbd class="key">Tab</kbd></kbd></td><td>左のリアクションにフォーカスを移動</td><td>-</td></tr>
+ <tr><td><kbd class="key">→</kbd>, <kbd class="key">L</kbd>, <kbd class="key">Tab</kbd></td><td>右のリアクションにフォーカスを移動</td><td>-</td></tr>
+ <tr><td><kbd class="key">Enter</kbd>, <kbd class="key">Space</kbd>, <kbd class="key">+</kbd></td><td>リアクション確定</td><td>-</td></tr>
+ <tr><td><kbd class="key">0</kbd>~<kbd class="key">9</kbd></td><td>数字に対応したリアクションで確定</td><td>-</td></tr>
+ <tr><td><kbd class="key">Esc</kbd></td><td>リアクションするのをやめる</td><td>-</td></tr>
+ </tbody>
+</table>
diff --git a/src/docs/uk-UA/mfm.md b/src/docs/uk-UA/mfm.md
new file mode 100644
index 0000000000..e237287acc
--- /dev/null
+++ b/src/docs/uk-UA/mfm.md
@@ -0,0 +1,2 @@
+# MFM
+MFMは、Misskey Flavored Markdownの略で、Misskeyの様々な場所で使用できる専用のマークアップ言語です。 MFMで使用可能な構文は[MFMチートシート](/mfm-cheat-sheet)で確認できます。
diff --git a/src/docs/uk-UA/mute.md b/src/docs/uk-UA/mute.md
new file mode 100644
index 0000000000..da3cfcc368
--- /dev/null
+++ b/src/docs/uk-UA/mute.md
@@ -0,0 +1,13 @@
+# Ігнорувати
+
+ユーザーをミュートすると、そのユーザーに関する次のコンテンツがMisskeyに表示されなくなります:
+
+* タイムラインや投稿の検索結果内の、そのユーザーの投稿(およびそれらの投稿に対する返信やRenote)
+* そのユーザーからの通知
+* メッセージ履歴一覧内の、そのユーザーとのメッセージ履歴
+
+ユーザーをミュートするには、対象のユーザーのユーザーページに表示されている「ミュート」ボタンを押します。
+
+ミュートを行ったことは相手に通知されず、ミュートされていることを知ることもできません。
+
+設定>ミュート から、自分がミュートしているユーザー一覧を確認することができます。
diff --git a/src/docs/uk-UA/pages.md b/src/docs/uk-UA/pages.md
new file mode 100644
index 0000000000..55cd74544b
--- /dev/null
+++ b/src/docs/uk-UA/pages.md
@@ -0,0 +1,10 @@
+# Pages
+
+## Змінні
+変数を使うことで動的なページを作成できます。テキスト内で <b>{ 変数名 }</b> と書くとそこに変数の値を埋め込めます。例えば <b>Hello { thing } world!</b> というテキストで、変数(thing)の値が <b>ai</b> だった場合、テキストは <b>Hello ai world!</b> になります。
+
+変数の評価(値を算出すること)は上から下に行われるので、ある変数の中で自分より下の変数を参照することはできません。例えば上から <b>A、B、C</b> と3つの変数を定義したとき、<b>C</b>の中で<b>A</b>や<b>B</b>を参照することはできますが、<b>A</b>の中で<b>B</b>や<b>C</b>を参照することはできません。
+
+ユーザーからの入力を受け取るには、ページに「ユーザー入力」ブロックを設置し、「変数名」に入力を格納したい変数名を設定します(変数は自動で作成されます)。その変数を使ってユーザー入力に応じた動作を行えます。
+
+関数を使うと、値の算出処理を再利用可能な形にまとめることができます。関数を作るには、「関数」タイプの変数を作成します。関数にはスロット(引数)を設定することができ、スロットの値は関数内で変数として利用可能です。また、関数を引数に取る関数(高階関数と呼ばれます)も存在します。関数は予め定義しておくほかに、このような高階関数のスロットに即席でセットすることもできます。
diff --git a/src/docs/uk-UA/reaction.md b/src/docs/uk-UA/reaction.md
new file mode 100644
index 0000000000..2b4dcd5867
--- /dev/null
+++ b/src/docs/uk-UA/reaction.md
@@ -0,0 +1,11 @@
+# Реакції
+他の人のノートに、絵文字を付けて簡単にあなたの反応を伝えられる機能です。 リアクションするには、ノートの + アイコンをクリックしてピッカーを表示し、絵文字を選択します。 リアクションには[カスタム絵文字](./custom-emoji)も使用できます。
+
+## リアクションピッカーのカスタマイズ
+ピッカーに表示される絵文字を自分好みにカスタマイズすることができます。 設定の「リアクション」で設定します。
+
+## リモート投稿へのリアクションについて
+リアクションはMisskeyオリジナルの機能であるため、リモートインスタンスがMisskeyでない限りは、ほとんどの場合「Like」としてアクティビティが送信されます。一般的にはLikeは「お気に入り」として実装されているようです。 また、相手がMisskeyであったとしても、カスタム絵文字リアクションは伝わらず、自動的に「👍」等にフォールバックされます。
+
+## リモートからのリアクションについて
+リモートから「Like」アクティビティを受信したとき、Misskeyでは「👍」のリアクションとして解釈されます。
diff --git a/src/docs/uk-UA/reversi-bot.md b/src/docs/uk-UA/reversi-bot.md
new file mode 100644
index 0000000000..ae49801193
--- /dev/null
+++ b/src/docs/uk-UA/reversi-bot.md
@@ -0,0 +1,160 @@
+# MisskeyリバーシBotの開発
+Misskeyのリバーシ機能に対応したBotの開発方法をここに記します。
+
+1. `games/reversi`ストリームに以下のパラメータを付けて接続する:
+ * `i`: botアカウントのAPIキー
+
+2. 対局への招待が来たら、ストリームから`invited`イベントが流れてくる
+ * イベントの中身に、`parent`という名前で対局へ誘ってきたユーザーの情報が含まれている
+
+3. `games/reversi/match`へ、`user_id`として`parent`の`id`が含まれたリクエストを送信する
+
+4. 上手くいくとゲーム情報が返ってくるので、`games/reversi-game`ストリームへ、以下のパラメータを付けて接続する:
+ * `i`: botアカウントのAPIキー
+ * `game`: `game`の`id`
+
+5. この間、相手がゲームの設定を変更するとその都度`update-settings`イベントが流れてくるので、必要であれば何かしらの処理を行う
+
+6. 設定に満足したら、`{ type: 'accept' }`メッセージをストリームに送信する
+
+7. ゲームが開始すると、`started`イベントが流れてくる
+ * イベントの中身にはゲーム情報が含まれている
+
+8. 石を打つには、ストリームに`{ type: 'set', pos: <位置> }`を送信する(位置の計算方法は後述)
+
+9. 相手または自分が石を打つと、ストリームから`set`イベントが流れてくる
+ * `color`として石の色が含まれている
+ * `pos`として位置情報が含まれている
+
+## 位置の計算法
+8x8のマップを考える場合、各マスの位置(インデックスと呼びます)は次のようになっています:
+```
++--+--+--+--+--+--+--+--+
+| 0| 1| 2| 3| 4| 5| 6| 7|
++--+--+--+--+--+--+--+--+
+| 8| 9|10|11|12|13|14|15|
++--+--+--+--+--+--+--+--+
+|16|17|18|19|20|21|22|23|
+...
+```
+
+### X,Y座標 から インデックス に変換する
+```
+pos = x + (y * mapWidth)
+```
+`mapWidth`は、ゲーム情報の`map`から、次のようにして計算できます:
+```
+mapWidth = map[0].length
+```
+
+### インデックス から X,Y座標 に変換する
+```
+x = pos % mapWidth
+y = Math.floor(pos / mapWidth)
+```
+
+## マップ情報
+マップ情報は、ゲーム情報の`map`に入っています。 文字列の配列になっており、ひとつひとつの文字がマス情報を表しています。 それをもとにマップのデザインを知る事が出来ます:
+* `(スペース)` ... マス無し
+* `-` ... マス
+* `b` ... 初期配置される黒石
+* `w` ... 初期配置される白石
+
+例えば、4*4の次のような単純なマップがあるとします:
+```text
++---+---+---+---+
+| | | | |
++---+---+---+---+
+| | ○ | ● | |
++---+---+---+---+
+| | ● | ○ | |
++---+---+---+---+
+| | | | |
++---+---+---+---+
+```
+
+この場合、マップデータはこのようになります:
+```javascript
+['----', '-wb-', '-bw-', '----']
+```
+
+## ユーザーにフォームを提示して対話可能Botを作成する
+ユーザーとのコミュニケーションを行うため、ゲームの設定画面でユーザーにフォームを提示することができます。 例えば、Botの強さをユーザーが設定できるようにする、といったシナリオが考えられます。
+
+フォームを提示するには、`reversi-game`ストリームに次のメッセージを送信します:
+```javascript
+{
+ type: 'init-form',
+ body: [フォームコントロールの配列]
+}
+```
+
+フォームコントロールの配列については今から説明します。 フォームコントロールは、次のようなオブジェクトです:
+```javascript
+{
+ id: 'switch1',
+ type: 'switch',
+ label: 'Enable hoge',
+ value: false
+}
+```
+`id` ... コントロールのID。 `type` ... コントロールの種類。後述します。 `label` ... コントロールと一緒に表記するテキスト。 `value` ... コントロールのデフォルト値。
+
+### フォームの操作を受け取る
+ユーザーがフォームを操作すると、ストリームから`update-form`イベントが流れてきます。 イベントの中身には、コントロールのIDと、ユーザーが設定した値が含まれています。 例えば、上で示したスイッチをユーザーがオンにしたとすると、次のイベントが流れてきます:
+```javascript
+{
+ id: 'switch1',
+ value: true
+}
+```
+
+### フォームコントロールの種類
+#### Перемикач
+type: `switch` スイッチを表示します。何かの機能をオン/オフさせたい場合に有用です。
+
+##### プロパティ
+`label` ... スイッチに表記するテキスト。
+
+#### ラジオボタン
+type: `radio` ラジオボタンを表示します。選択肢を提示するのに有用です。例えば、Botの強さを設定させるなどです。
+
+##### プロパティ
+`items` ... ラジオボタンの選択肢。例:
+```javascript
+items: [{
+ label: '弱',
+ value: 1
+}, {
+ label: '中',
+ value: 2
+}, {
+ label: '強',
+ value: 3
+}]
+```
+
+#### スライダー
+type: `slider` スライダーを表示します。
+
+##### プロパティ
+`min` ... スライダーの下限。 `max` ... スライダーの上限。 `step` ... 入力欄で刻むステップ値。
+
+#### テキストボックス
+type: `textbox` テキストボックスを表示します。ユーザーになにか入力させる一般的な用途に利用できます。
+
+## ユーザーにメッセージを表示する
+設定画面でユーザーと対話する、フォーム以外のもうひとつの方法がこれです。ユーザーになにかメッセージを表示することができます。 例えば、ユーザーがBotの対応していないモードやマップを選択したとき、警告を表示するなどです。 メッセージを表示するには、次のメッセージをストリームに送信します:
+```javascript
+{
+ type: 'message',
+ body: {
+ text: 'メッセージ内容',
+ type: 'メッセージの種類'
+ }
+}
+```
+メッセージの種類: `success`, `info`, `warning`, `error`。
+
+## 投了する
+投了をするには、<a href="./api/endpoints/games/reversi/games/surrender">このエンドポイント</a>にリクエストします。
diff --git a/src/docs/uk-UA/stream.md b/src/docs/uk-UA/stream.md
new file mode 100644
index 0000000000..734291c870
--- /dev/null
+++ b/src/docs/uk-UA/stream.md
@@ -0,0 +1,354 @@
+# ストリーミングAPI
+
+ストリーミングAPIを使うと、リアルタイムで様々な情報(例えばタイムラインに新しい投稿が流れてきた、メッセージが届いた、フォローされた、など)を受け取ったり、様々な操作を行ったりすることができます。
+
+## ストリームに接続する
+
+ストリーミングAPIを利用するには、まずMisskeyサーバーに**websocket**接続する必要があります。
+
+以下のURLに、`i`というパラメータ名で認証情報を含めて、websocket接続してください。例:
+```
+%WS_URL%/streaming?i=xxxxxxxxxxxxxxx
+```
+
+認証情報は、自分のAPIキーや、アプリケーションからストリームに接続する際はユーザーのアクセストークンのことを指します。
+
+<div class="ui info">
+ <p><i class="fas fa-info-circle"></i> 認証情報の取得については、<a href="./api">こちらのドキュメント</a>をご確認ください。</p>
+</div>
+
+---
+
+認証情報は省略することもできますが、その場合非ログインでの利用ということになり、受信できる情報や可能な操作は限られます。例:
+
+```
+%WS_URL%/streaming
+```
+
+---
+
+ストリームに接続すると、後述するAPI操作や、投稿の購読を行ったりすることができます。 しかしまだこの段階では、例えばタイムラインへの新しい投稿を受信したりすることはできません。 それを行うには、ストリーム上で、後述する**チャンネル**に接続する必要があります。
+
+**ストリームでのやり取りはすべてJSONです。**
+
+## Канали
+MisskeyのストリーミングAPIにはチャンネルという概念があります。これは、送受信する情報を分離するための仕組みです。 Misskeyのストリームに接続しただけでは、まだリアルタイムでタイムラインの投稿を受信したりはできません。 ストリーム上でチャンネルに接続することで、様々な情報を受け取ったり情報を送信したりすることができるようになります。
+
+### チャンネルに接続する
+チャンネルに接続するには、次のようなデータをJSONでストリームに送信します:
+
+```json
+{
+ type: 'connect',
+ body: {
+ channel: 'xxxxxxxx',
+ id: 'foobar',
+ params: {
+ ...
+ }
+ }
+}
+```
+
+ここで、
+* `channel`には接続したいチャンネル名を設定します。チャンネルの種類については後述します。
+* `id`にはそのチャンネルとやり取りするための任意のIDを設定します。ストリームでは様々なメッセージが流れるので、そのメッセージがどのチャンネルからのものなのか識別する必要があるからです。このIDは、UUIDや、乱数のようなもので構いません。
+* `params`はチャンネルに接続する際のパラメータです。チャンネルによって接続時に必要とされるパラメータは異なります。パラメータ不要のチャンネルに接続する際は、このプロパティは省略可能です。
+
+<div class="ui info">
+ <p><i class="fas fa-info-circle"></i> IDはチャンネルごとではなく「チャンネルの接続ごと」です。なぜなら、同じチャンネルに異なるパラメータで複数接続するケースもあるからです。</p>
+</div>
+
+### チャンネルからのメッセージを受け取る
+例えばタイムラインのチャンネルなら、新しい投稿があった時にメッセージを発します。そのメッセージを受け取ることで、タイムラインに新しい投稿がされたことをリアルタイムで知ることができます。
+
+チャンネルがメッセージを発すると、次のようなデータがJSONでストリームに流れてきます:
+```json
+{
+ type: 'channel',
+ body: {
+ id: 'foobar',
+ type: 'something',
+ body: {
+ some: 'thing'
+ }
+ }
+}
+```
+
+ここで、
+* `id`には前述したそのチャンネルに接続する際に設定したIDが設定されています。これで、このメッセージがどのチャンネルからのものなのか知ることができます。
+* `type`にはメッセージの種類が設定されます。チャンネルによって、どのような種類のメッセージが流れてくるかは異なります。
+* `body`にはメッセージの内容が設定されます。チャンネルによって、どのような内容のメッセージが流れてくるかは異なります。
+
+### チャンネルに向けてメッセージを送信する
+チャンネルによっては、メッセージを受け取るだけでなく、こちらから何かメッセージを送信し、何らかの操作を行える場合があります。
+
+チャンネルにメッセージを送信するには、次のようなデータをJSONでストリームに送信します:
+```json
+{
+ type: 'channel',
+ body: {
+ id: 'foobar',
+ type: 'something',
+ body: {
+ some: 'thing'
+ }
+ }
+}
+```
+
+ここで、
+* `id`には前述したそのチャンネルに接続する際に設定したIDを設定します。これで、このメッセージがどのチャンネルに向けたものなのか識別させることができます。
+* `type`にはメッセージの種類を設定します。チャンネルによって、どのような種類のメッセージを受け付けるかは異なります。
+* `body`にはメッセージの内容を設定します。チャンネルによって、どのような内容のメッセージを受け付けるかは異なります。
+
+### チャンネルから切断する
+チャンネルから切断するには、次のようなデータをJSONでストリームに送信します:
+
+```json
+{
+ type: 'disconnect',
+ body: {
+ id: 'foobar'
+ }
+}
+```
+
+ここで、
+* `id`には前述したそのチャンネルに接続する際に設定したIDを設定します。
+
+## ストリームを経由してAPIリクエストする
+
+ストリームを経由してAPIリクエストすると、HTTPリクエストを発生させずにAPIを利用できます。そのため、コードを簡潔にできたり、パフォーマンスの向上を見込めるかもしれません。
+
+ストリームを経由してAPIリクエストするには、次のようなデータをJSONでストリームに送信します:
+```json
+{
+ type: 'api',
+ body: {
+ id: 'xxxxxxxxxxxxxxxx',
+ endpoint: 'notes/create',
+ data: {
+ text: 'yee haw!'
+ }
+ }
+}
+```
+
+ここで、
+* `id`には、APIのレスポンスを識別するための、APIリクエストごとの一意なIDを設定する必要があります。UUIDや、簡単な乱数のようなもので構いません。
+* `endpoint`には、あなたがリクエストしたいAPIのエンドポイントを指定します。
+* `data`には、エンドポイントのパラメータを含めます。
+
+<div class="ui info">
+ <p><i class="fas fa-info-circle"></i> APIのエンドポイントやパラメータについてはAPIリファレンスをご確認ください。</p>
+</div>
+
+### レスポンスの受信
+
+APIへリクエストすると、レスポンスがストリームから次のような形式で流れてきます。
+
+```json
+{
+ type: 'api:xxxxxxxxxxxxxxxx',
+ body: {
+ ...
+ }
+}
+```
+
+ここで、
+* `xxxxxxxxxxxxxxxx`の部分には、リクエストの際に設定された`id`が含まれています。これにより、どのリクエストに対するレスポンスなのか判別することができます。
+* `body`には、レスポンスが含まれています。
+
+## 投稿のキャプチャ
+
+Misskeyは投稿のキャプチャと呼ばれる仕組みを提供しています。これは、指定した投稿のイベントをストリームで受け取る機能です。
+
+例えばタイムラインを取得してユーザーに表示したとします。ここで誰かがそのタイムラインに含まれるどれかの投稿に対してリアクションしたとします。
+
+しかし、クライアントからするとある投稿にリアクションが付いたことなどは知る由がないため、リアルタイムでリアクションをタイムライン上の投稿に反映して表示するといったことができません。
+
+この問題を解決するために、Misskeyは投稿のキャプチャ機構を用意しています。投稿をキャプチャすると、その投稿に関するイベントを受け取ることができるため、リアルタイムでリアクションを反映させたりすることが可能になります。
+
+### 投稿をキャプチャする
+
+投稿をキャプチャするには、ストリームに次のようなメッセージを送信します:
+
+```json
+{
+ type: 'subNote',
+ body: {
+ id: 'xxxxxxxxxxxxxxxx'
+ }
+}
+```
+
+ここで、
+* `id`にキャプチャしたい投稿の`id`を設定します。
+
+このメッセージを送信すると、Misskeyにキャプチャを要請したことになり、以後、その投稿に関するイベントが流れてくるようになります。
+
+例えば投稿にリアクションが付いたとすると、次のようなメッセージが流れてきます:
+
+```json
+{
+ type: 'noteUpdated',
+ body: {
+ id: 'xxxxxxxxxxxxxxxx',
+ type: 'reacted',
+ body: {
+ reaction: 'like',
+ userId: 'yyyyyyyyyyyyyyyy'
+ }
+ }
+}
+```
+
+ここで、
+* `body`内の`id`に、イベントを発生させた投稿のIDが設定されます。
+* `body`内の`type`に、イベントの種類が設定されます。
+* `body`内の`body`に、イベントの詳細が設定されます。
+
+#### イベントの種類
+
+##### `reacted`
+その投稿にリアクションがされた時に発生します。
+
+* `reaction`に、リアクションの種類が設定されます。
+* `userId`に、リアクションを行ったユーザーのIDが設定されます。
+
+例:
+```json
+{
+ type: 'noteUpdated',
+ body: {
+ id: 'xxxxxxxxxxxxxxxx',
+ type: 'reacted',
+ body: {
+ reaction: 'like',
+ userId: 'yyyyyyyyyyyyyyyy'
+ }
+ }
+}
+```
+
+##### `deleted`
+その投稿が削除された時に発生します。
+
+* `deletedAt`に、削除日時が設定されます。
+
+例:
+```json
+{
+ type: 'noteUpdated',
+ body: {
+ id: 'xxxxxxxxxxxxxxxx',
+ type: 'deleted',
+ body: {
+ deletedAt: '2018-10-22T02:17:09.703Z'
+ }
+ }
+}
+```
+
+##### `pollVoted`
+その投稿に添付されたアンケートに投票された時に発生します。
+
+* `choice`に、選択肢IDが設定されます。
+* `userId`に、投票を行ったユーザーのIDが設定されます。
+
+例:
+```json
+{
+ type: 'noteUpdated',
+ body: {
+ id: 'xxxxxxxxxxxxxxxx',
+ type: 'pollVoted',
+ body: {
+ choice: 2,
+ userId: 'yyyyyyyyyyyyyyyy'
+ }
+ }
+}
+```
+
+### 投稿のキャプチャを解除する
+
+その投稿がもう画面に表示されなくなったりして、その投稿に関するイベントをもう受け取る必要がなくなったときは、キャプチャの解除を申請してください。
+
+次のメッセージを送信します:
+
+```json
+{
+ type: 'unsubNote',
+ body: {
+ id: 'xxxxxxxxxxxxxxxx'
+ }
+}
+```
+
+ここで、
+* `id`にキャプチャを解除したい投稿の`id`を設定します。
+
+このメッセージを送信すると、以後、その投稿に関するイベントは流れてこないようになります。
+
+# チャンネル一覧
+## `main`
+アカウントに関する基本的な情報が流れてきます。このチャンネルにパラメータはありません。
+
+### 流れてくるイベント一覧
+
+#### `renote`
+自分の投稿がRenoteされた時に発生するイベントです。自分自身の投稿をRenoteしたときは発生しません。
+
+#### `mention`
+誰かからメンションされたときに発生するイベントです。
+
+#### `readAllNotifications`
+自分宛ての通知がすべて既読になったことを表すイベントです。このイベントを利用して、「通知があることを示すアイコン」のようなものをオフにしたりする等のケースが想定されます。
+
+#### `meUpdated`
+自分の情報が更新されたことを表すイベントです。
+
+#### `follow`
+自分が誰かをフォローしたときに発生するイベントです。
+
+#### `unfollow`
+自分が誰かのフォローを解除したときに発生するイベントです。
+
+#### `followed`
+自分が誰かにフォローされたときに発生するイベントです。
+
+## `homeTimeline`
+ホームタイムラインの投稿情報が流れてきます。このチャンネルにパラメータはありません。
+
+### 流れてくるイベント一覧
+
+#### `note`
+タイムラインに新しい投稿が流れてきたときに発生するイベントです。
+
+## `localTimeline`
+ローカルタイムラインの投稿情報が流れてきます。このチャンネルにパラメータはありません。
+
+### 流れてくるイベント一覧
+
+#### `note`
+ローカルタイムラインに新しい投稿が流れてきたときに発生するイベントです。
+
+## `hybridTimeline`
+ソーシャルタイムラインの投稿情報が流れてきます。このチャンネルにパラメータはありません。
+
+### 流れてくるイベント一覧
+
+#### `note`
+ソーシャルタイムラインに新しい投稿が流れてきたときに発生するイベントです。
+
+## `globalTimeline`
+グローバルタイムラインの投稿情報が流れてきます。このチャンネルにパラメータはありません。
+
+### 流れてくるイベント一覧
+
+#### `note`
+グローバルタイムラインに新しい投稿が流れてきたときに発生するイベントです。
diff --git a/src/docs/uk-UA/theme.md b/src/docs/uk-UA/theme.md
new file mode 100644
index 0000000000..df1e33a920
--- /dev/null
+++ b/src/docs/uk-UA/theme.md
@@ -0,0 +1,68 @@
+# Тема
+
+テーマを設定して、Misskeyクライアントの見た目を変更できます。
+
+## テーマの設定
+設定 > テーマ
+
+## テーマを作成する
+テーマコードはJSON5で記述されたテーマオブジェクトです。 テーマは以下のようなオブジェクトです。
+``` js
+{
+ id: '17587283-dd92-4a2c-a22c-be0637c9e22a',
+
+ name: 'Danboard',
+ author: 'syuilo',
+
+ base: 'light',
+
+ props: {
+ accent: 'rgb(218, 141, 49)',
+ bg: 'rgb(218, 212, 190)',
+ fg: 'rgb(115, 108, 92)',
+ panel: 'rgb(236, 232, 220)',
+ renote: 'rgb(100, 152, 106)',
+ link: 'rgb(100, 152, 106)',
+ mention: '@accent',
+ hashtag: 'rgb(100, 152, 106)',
+ header: 'rgba(239, 227, 213, 0.75)',
+ navBg: 'rgb(216, 206, 182)',
+ inputBorder: 'rgba(0, 0, 0, 0.1)',
+ },
+}
+
+```
+
+* `id` ... テーマの一意なID。UUIDをおすすめします。
+* `name` ... テーマ名
+* `author` ... テーマの作者
+* `desc` ... テーマの説明(オプション)
+* `base` ... 明るいテーマか、暗いテーマか
+ * `light`にすると明るいテーマになり、`dark`にすると暗いテーマになります。
+ * テーマはここで設定されたベーステーマを継承します。
+* `props` ... テーマのスタイル定義。これから説明します。
+
+### テーマのスタイル定義
+`props`下にはテーマのスタイルを定義します。 キーがCSSの変数名になり、バリューで中身を指定します。 なお、この`props`オブジェクトはベーステーマから継承されます。 ベーステーマは、このテーマの`base`が`light`なら[_light.json5](https://github.com/syuilo/misskey/blob/develop/src/client/themes/_light.json5)で、`dark`なら[_dark.json5](https://github.com/syuilo/misskey/blob/develop/src/client/themes/_dark.json5)です。 つまり、このテーマ内の`props`に`panel`というキーが無くても、そこにはベーステーマの`panel`があると見なされます。
+
+#### バリューで使える構文
+* 16進数で表された色
+ * 例: `#00ff00`
+* `rgb(r, g, b)`形式で表された色
+ * 例: `rgb(0, 255, 0)`
+* `rgb(r, g, b, a)`形式で表された透明度を含む色
+ * 例: `rgba(0, 255, 0, 0.5)`
+* 他のキーの値の参照
+ * `@{キー名}`と書くと他のキーの値の参照になります。`{キー名}`は参照したいキーの名前に置き換えます。
+ * 例: `@panel`
+* 定数(後述)の参照
+ * `${定数名}`と書くと定数の参照になります。`{定数名}`は参照したい定数の名前に置き換えます。
+ * 例: `$main`
+* 関数(後述)
+ * `:{関数名}<{引数}<{色}`
+
+#### 定数
+「CSS変数として出力はしたくないが、他のCSS変数の値として使いまわしたい」値があるときは、定数を使うと便利です。 キー名を`$`で始めると、そのキーはCSS変数として出力されません。
+
+#### Функції
+wip
diff --git a/src/docs/uk-UA/timelines.md b/src/docs/uk-UA/timelines.md
new file mode 100644
index 0000000000..92cf394d6e
--- /dev/null
+++ b/src/docs/uk-UA/timelines.md
@@ -0,0 +1,15 @@
+# タイムラインの比較
+
+https://docs.google.com/spreadsheets/d/1lxQ2ugKrhz58Bg96HTDK_2F98BUritkMyIiBkOByjHA/edit?usp=sharing
+
+## Домівка
+自分のフォローしているユーザーの投稿
+
+## Локальна
+全てのローカルユーザーの「ホーム」指定されていない投稿
+
+## Соціальна
+自分のフォローしているユーザーの投稿と、全てのローカルユーザーの「ホーム」指定されていない投稿
+
+## Глобальна
+全てのローカルユーザーの「ホーム」指定されていない投稿と、サーバーに届いた全てのリモートユーザーの「ホーム」指定されていない投稿
diff --git a/src/docs/zh-CN/aiscript.md b/src/docs/zh-CN/aiscript.md
new file mode 100644
index 0000000000..0747cf8751
--- /dev/null
+++ b/src/docs/zh-CN/aiscript.md
@@ -0,0 +1,4 @@
+# AiScript
+
+## 函数
+传递默认值。
diff --git a/src/docs/zh-CN/api.md b/src/docs/zh-CN/api.md
new file mode 100644
index 0000000000..4a67622e30
--- /dev/null
+++ b/src/docs/zh-CN/api.md
@@ -0,0 +1,58 @@
+# Misskey API
+
+您可以使用Misskey API来开发Misskey客户端、与Misskey链接的Web服务、Bot等应用(以下称为“应用程序”)。 另外还有一个流式API,因此还可以用来创建实时性的应用程序。
+
+开始使用API前​​,您首先需要获取访问令牌。 本文档将引导您完成获取访问令牌的步骤,然后介绍API的基本使用方法。
+
+## 访问令牌的获取
+总的来说,API请求需要访问令牌。 获取方式则根据请求的API或者非特定用户所使用的应用程序而有所不同。
+
+* 对于前者:转到[“手动发放自己的访问令牌”](#自分自身のアクセストークンを手動発行する)
+* 对于后者:转到[“请求应用程序用户发放访问令牌”](#アプリケーション利用者にアクセストークンの発行をリクエストする)
+
+### 手动发放自己的访问令牌
+您可以在“设置 > API”中发放自己的访问令牌。
+
+[转到“API使用方法”](#APIの使い方)
+
+### 请求应用程序用户发放访问令牌
+要获取应用程序用户的访问令牌,请按照以下步骤请求发放。
+
+#### Step 1
+
+生成UUID。以下将其称为会话ID。
+
+> 此会话ID需要每次重新生成,请勿重复使用。
+
+#### Step 2
+
+在用户的浏览器中显示`{_URL_}/miauth/{session}`。将`{session}`的部分替换为会话ID。
+> 例: `{_URL_}/miauth/c1f6d42b-468b-4fd2-8274-e58abdedef6f`
+
+显示时,可以在URL中设置一些选项作为查询参数:
+* `name` ... 应用程序名称
+ * > 例: `MissDeck`
+* `icon` ... 应用程序图标URL
+ * > 例: `https://missdeck.example.com/icon.png`
+* `callback` ... 认证后重定向的URL
+ * > 例: `https://missdeck.example.com/callback`
+ * 重定向时,会话ID将添加查询参数`session`
+* `permission` ... 应用程序要求的权限
+ * > 例: `write:notes,write:following,read:drive`
+ * 要求的权限需要以`,`分隔
+ * 您可以在[API参考](/api-doc)中确认您所拥有的权限。
+
+#### Step 3
+用户允许发行后,对`{_URL_}/api/miauth/{session}/check`的POST请求所返回的是一个包含访问令牌的JSON格式的响应。
+
+响应中包含的属性:
+* `token` ... 用户的访问令牌
+* `user` ... 用户信息
+
+[转到“API使用方法”](#APIの使い方)
+
+## API使用方法
+**所有API均为POST,并且请求/响应均为JSON格式。不是REST。** 访问令牌包含在请求中,参数名为`i`。
+
+* [API 参考](/api-doc)
+* [流式API](./stream)
diff --git a/src/docs/zh-CN/create-plugin.md b/src/docs/zh-CN/create-plugin.md
new file mode 100644
index 0000000000..2e06db7d38
--- /dev/null
+++ b/src/docs/zh-CN/create-plugin.md
@@ -0,0 +1,74 @@
+# 插件开发
+Misskey Web客户端插件功能使您可以扩展客户端并添加各种功能。 我们在这里给出用于创建插件的元数据定义和AiScript API参考。
+
+## 元数据
+插件必须使用AiScript的元数据嵌入功能将插件的元数据定义为默认值。 元数据是一个包含以下属性的对象:
+
+### name
+插件名称
+
+### author
+插件作者
+
+### version
+插件版本。请使用数字。
+
+### description
+插件说明
+
+### permissions
+插件要求的权限。在发送Misskey API请求时需要使用。
+
+### config
+表示插件设置信息的对象。 在键名中包含设置名称,在键值中包含以下属性。
+
+#### type
+代表设置值的类型的字符串。从下列项中选择: string number boolean
+
+#### label
+显示给用户的设置名称
+
+#### description
+设置说明
+
+#### default
+设置的默认值
+
+## API 参考
+AiScript标准的内置API不会发布。
+
+### Mk:dialog(title text type)
+显示一个对话框。type可以设置为以下值: info success warn error question 默认值为info。
+
+### Mk:confirm(title text type)
+显示确认对话框。type可以设置为以下值: info success warn error question 默认值为question。 如果用户选择“OK”,则返回true;如果用户选择“取消”,则返回false。
+
+### Mk:api(endpoint params)
+Misskey API请求在第一个参数中传递终端名称,在第二个参数中传递参数对象。
+
+### Mk:save(key value)
+给任何名称赋任何值并使其持久化。所谓的持久化的值,指的是该值即使在AiScript上下文结束后仍然保留,并且可以通过Mk:load读取。
+
+### Mk:load(key)
+读取由Mk:save生成的持久化的值。
+
+### Plugin:register_post_form_action(title fn)
+将操作添加到发布表单。第一个参数是操作名,在第二个参数中选择操作时传入回调函数。 帖子表单对象作为第一个参数传给回调函数。
+
+### Plugin:register_note_action(title fn)
+将项目添加到帖子菜单。第一个参数是项目名,在第二个参数中选择项目时传入回调函数。 目标项目对象作为第一个参数传给回调函数。
+
+### Plugin:register_user_action(title fn)
+将项目添加到用户菜单。第一个参数是项目名,在第二个参数中选择项目时传入回调函数。 目标用户对象作为第一个参数传给回调函数。
+
+### Plugin:register_note_view_interruptor(fn)
+改写显示在UI上的帖子信息。 目标帖子对象作为第一个参数传给回调函数。 该帖子将会使用回调函数的返回值进行改写。
+
+### Plugin:register_note_post_interruptor(fn)
+发贴时改写帖子信息。 目标帖子对象作为第一个参数传给回调函数。 该帖子将会使用回调函数的返回值进行改写。
+
+### Plugin:open_url(url)
+在浏览器的新标签页中打开第一个参数传入的URL。
+
+### Plugin:config
+存储插件设置的对象。该值是通过插件定义的配置中设置的键值来传入的。
diff --git a/src/docs/zh-CN/custom-emoji.md b/src/docs/zh-CN/custom-emoji.md
new file mode 100644
index 0000000000..9fc18a70fc
--- /dev/null
+++ b/src/docs/zh-CN/custom-emoji.md
@@ -0,0 +1,2 @@
+# 自定义表情符号
+カスタム絵文字は、インスタンスで用意された画像を絵文字のように使える機能です。 ノート、リアクション、チャット、自己紹介、名前などの場所で使うことができます。 カスタム絵文字をそれらの場所で使うには、絵文字ピッカーボタン(ある場合)を押すか、`:`を入力して絵文字サジェストを表示します。 テキスト内に`:foo:`のような形式の文字列が見つかると、`foo`の部分がカスタム絵文字名と解釈され、表示時には対応したカスタム絵文字に置き換わります。
diff --git a/src/docs/zh-CN/deck.md b/src/docs/zh-CN/deck.md
new file mode 100644
index 0000000000..73e9efdaaf
--- /dev/null
+++ b/src/docs/zh-CN/deck.md
@@ -0,0 +1,18 @@
+# Deck
+
+デッキは利用可能なUIのひとつです。「カラム」と呼ばれるビューを複数並べて表示させることで、カスタマイズ性が高く、情報量の多いUIが構築できることが特徴です。
+
+## カラムの追加
+デッキの背景を右クリックし、「カラムを追加」して任意のカラムを追加できます。
+
+## カラムの移動
+カラムは、ドラッグアンドドロップで他のカラムと位置を入れ替えることが出来るほか、カラムメニュー(カラムのヘッダー右クリック)から位置を移動させることもできます。
+
+## カラムの水平分割
+カラムは左右だけでなく、上下に並べることもできます。 カラムメニューを開き、「左に重ねる」を選択すると、左のカラムの下に現在のカラムが移動します。 上下分割を解除するには、カラムメニューの「右に出す」を選択します。
+
+## カラムの設定
+カラムメニューの「編集」を選択するとカラムの設定を編集できます。カラムの名前を変えたり、幅を変えたりできます。
+
+## デッキの設定
+デッキに関する設定は、[settings/deck](/settings/deck)で行えます。
diff --git a/src/docs/zh-CN/follow.md b/src/docs/zh-CN/follow.md
new file mode 100644
index 0000000000..115a2786f6
--- /dev/null
+++ b/src/docs/zh-CN/follow.md
@@ -0,0 +1,2 @@
+# 关注中
+ユーザーをフォローすると、タイムラインにそのユーザーの投稿が表示されるようになります。ただし、他のユーザーに対する返信は含まれません。 ユーザーをフォローするには、ユーザーページの「フォロー」ボタンをクリックします。フォローを解除するには、もう一度クリックします。
diff --git a/src/docs/zh-CN/keyboard-shortcut.md b/src/docs/zh-CN/keyboard-shortcut.md
new file mode 100644
index 0000000000..07edd2a5cd
--- /dev/null
+++ b/src/docs/zh-CN/keyboard-shortcut.md
@@ -0,0 +1,68 @@
+# キーボードショートカット
+
+## 全局
+これらのショートカットは基本的にどこでも使えます。
+<table>
+ <thead>
+ <tr><th>ショートカット</th><th>効果</th><th>由来</th></tr>
+ </thead>
+ <tbody>
+ <tr><td><kbd class="key">P</kbd>, <kbd class="key">N</kbd></td><td>新規投稿</td><td><b>P</b>ost, <b>N</b>ew, <b>N</b>ote</td></tr>
+ <tr><td><kbd class="key">T</kbd></td><td>タイムラインの最も新しい投稿にフォーカス</td><td><b>T</b>imeline, <b>T</b>op</td></tr>
+ <tr><td><kbd class="group"><kbd class="key">Shift</kbd> + <kbd class="key">N</kbd></kbd></td><td>通知を表示/隠す</td><td><b>N</b>otifications</td></tr>
+ <tr><td><kbd class="key">S</kbd></td><td>搜索</td><td><b>S</b>earch</td></tr>
+ <tr><td><kbd class="key">H</kbd>, <kbd class="key">?</kbd></td><td>ヘルプを表示</td><td><b>H</b>elp</td></tr>
+ </tbody>
+</table>
+
+## 投稿にフォーカスされた状態
+
+<table>
+ <thead>
+ <tr><th>ショートカット</th><th>効果</th><th>由来</th></tr>
+ </thead>
+ <tbody>
+ <tr><td><kbd class="key">↑</kbd>, <kbd class="key">K</kbd>, <kbd class="group"><kbd class="key">Shift</kbd> + <kbd class="key">Tab</kbd></kbd></td><td>上の投稿にフォーカスを移動</td><td>-</td></tr>
+ <tr><td><kbd class="key">↓</kbd>, <kbd class="key">J</kbd>, <kbd class="key">Tab</kbd></td><td>下の投稿にフォーカスを移動</td><td>-</td></tr>
+ <tr><td><kbd class="key">R</kbd></td><td>返信フォームを開く</td><td><b>R</b>eply</td></tr>
+ <tr><td><kbd class="key">Q</kbd></td><td>Renoteフォームを開く</td><td><b>Q</b>uote</td></tr>
+ <tr><td><kbd class="group"><kbd class="key">Ctrl</kbd> + <kbd class="key">Q</kbd></kbd></td><td>即刻Renoteする(フォームを開かずに)</td><td>-</td></tr>
+ <tr><td><kbd class="key">E</kbd>, <kbd class="key">A</kbd>, <kbd class="key">+</kbd></td><td>リアクションフォームを開く</td><td><b>E</b>mote, re<b>A</b>ction</td></tr>
+ <tr><td><kbd class="key">0</kbd>~<kbd class="key">9</kbd></td><td>数字に対応したリアクションをする(対応については後述)</td><td>-</td></tr>
+ <tr><td><kbd class="key">F</kbd>, <kbd class="key">B</kbd></td><td>お気に入りに登録</td><td><b>F</b>avorite, <b>B</b>ookmark</td></tr>
+ <tr><td><kbd class="key">Del</kbd>, <kbd class="group"><kbd class="key">Ctrl</kbd> + <kbd class="key">D</kbd></kbd></td><td>投稿を削除</td><td><b>D</b>elete</tr>
+ <tr><td><kbd class="key">M</kbd>, <kbd class="key">O</kbd></td><td>投稿に対するメニューを開く</td><td><b>M</b>ore, <b>O</b>ther</td></tr>
+ <tr><td><kbd class="key">S</kbd></td><td>CWで隠された部分を表示 or 隠す</td><td><b>S</b>how, <b>S</b>ee</td></tr>
+ <tr><td><kbd class="key">Esc</kbd></td><td>フォーカスを外す</td><td>-</td></tr>
+ </tbody>
+</table>
+
+## Renoteフォーム
+
+<table>
+ <thead>
+ <tr><th>ショートカット</th><th>効果</th><th>由来</th></tr>
+ </thead>
+ <tbody>
+ <tr><td><kbd class="key">Enter</kbd></td><td>Renoteする</td><td>-</td></tr>
+ <tr><td><kbd class="key">Q</kbd></td><td>フォームを展開する</td><td><b>Q</b>uote</td></tr>
+ <tr><td><kbd class="key">Esc</kbd></td><td>フォームを閉じる</td><td>-</td></tr>
+ </tbody>
+</table>
+
+## リアクションフォーム
+デフォルトで「👍」にフォーカスが当たっている状態です。
+<table>
+ <thead>
+ <tr><th>ショートカット</th><th>効果</th><th>由来</th></tr>
+ </thead>
+ <tbody>
+ <tr><td><kbd class="key">↑</kbd>, <kbd class="key">K</kbd></td><td>上のリアクションにフォーカスを移動</td><td>-</td></tr>
+ <tr><td><kbd class="key">↓</kbd>, <kbd class="key">J</kbd></td><td>下のリアクションにフォーカスを移動</td><td>-</td></tr>
+ <tr><td><kbd class="key">←</kbd>, <kbd class="key">H</kbd>, <kbd class="group"><kbd class="key">Shift</kbd> + <kbd class="key">Tab</kbd></kbd></td><td>左のリアクションにフォーカスを移動</td><td>-</td></tr>
+ <tr><td><kbd class="key">→</kbd>, <kbd class="key">L</kbd>, <kbd class="key">Tab</kbd></td><td>右のリアクションにフォーカスを移動</td><td>-</td></tr>
+ <tr><td><kbd class="key">Enter</kbd>, <kbd class="key">Space</kbd>, <kbd class="key">+</kbd></td><td>リアクション確定</td><td>-</td></tr>
+ <tr><td><kbd class="key">0</kbd>~<kbd class="key">9</kbd></td><td>数字に対応したリアクションで確定</td><td>-</td></tr>
+ <tr><td><kbd class="key">Esc</kbd></td><td>リアクションするのをやめる</td><td>-</td></tr>
+ </tbody>
+</table>
diff --git a/src/docs/zh-CN/mfm.md b/src/docs/zh-CN/mfm.md
new file mode 100644
index 0000000000..e237287acc
--- /dev/null
+++ b/src/docs/zh-CN/mfm.md
@@ -0,0 +1,2 @@
+# MFM
+MFMは、Misskey Flavored Markdownの略で、Misskeyの様々な場所で使用できる専用のマークアップ言語です。 MFMで使用可能な構文は[MFMチートシート](/mfm-cheat-sheet)で確認できます。
diff --git a/src/docs/zh-CN/mute.md b/src/docs/zh-CN/mute.md
new file mode 100644
index 0000000000..502e04ea80
--- /dev/null
+++ b/src/docs/zh-CN/mute.md
@@ -0,0 +1,13 @@
+# 屏蔽
+
+ユーザーをミュートすると、そのユーザーに関する次のコンテンツがMisskeyに表示されなくなります:
+
+* タイムラインや投稿の検索結果内の、そのユーザーの投稿(およびそれらの投稿に対する返信やRenote)
+* そのユーザーからの通知
+* メッセージ履歴一覧内の、そのユーザーとのメッセージ履歴
+
+ユーザーをミュートするには、対象のユーザーのユーザーページに表示されている「ミュート」ボタンを押します。
+
+ミュートを行ったことは相手に通知されず、ミュートされていることを知ることもできません。
+
+設定>ミュート から、自分がミュートしているユーザー一覧を確認することができます。
diff --git a/src/docs/zh-CN/pages.md b/src/docs/zh-CN/pages.md
new file mode 100644
index 0000000000..d0d20dcbef
--- /dev/null
+++ b/src/docs/zh-CN/pages.md
@@ -0,0 +1,10 @@
+# Pages
+
+## 变量
+変数を使うことで動的なページを作成できます。テキスト内で <b>{ 変数名 }</b> と書くとそこに変数の値を埋め込めます。例えば <b>Hello { thing } world!</b> というテキストで、変数(thing)の値が <b>ai</b> だった場合、テキストは <b>Hello ai world!</b> になります。
+
+変数の評価(値を算出すること)は上から下に行われるので、ある変数の中で自分より下の変数を参照することはできません。例えば上から <b>A、B、C</b> と3つの変数を定義したとき、<b>C</b>の中で<b>A</b>や<b>B</b>を参照することはできますが、<b>A</b>の中で<b>B</b>や<b>C</b>を参照することはできません。
+
+ユーザーからの入力を受け取るには、ページに「ユーザー入力」ブロックを設置し、「変数名」に入力を格納したい変数名を設定します(変数は自動で作成されます)。その変数を使ってユーザー入力に応じた動作を行えます。
+
+関数を使うと、値の算出処理を再利用可能な形にまとめることができます。関数を作るには、「関数」タイプの変数を作成します。関数にはスロット(引数)を設定することができ、スロットの値は関数内で変数として利用可能です。また、関数を引数に取る関数(高階関数と呼ばれます)も存在します。関数は予め定義しておくほかに、このような高階関数のスロットに即席でセットすることもできます。
diff --git a/src/docs/zh-CN/reaction.md b/src/docs/zh-CN/reaction.md
new file mode 100644
index 0000000000..89fc8ba8be
--- /dev/null
+++ b/src/docs/zh-CN/reaction.md
@@ -0,0 +1,11 @@
+# 回应
+他の人のノートに、絵文字を付けて簡単にあなたの反応を伝えられる機能です。 リアクションするには、ノートの + アイコンをクリックしてピッカーを表示し、絵文字を選択します。 リアクションには[カスタム絵文字](./custom-emoji)も使用できます。
+
+## リアクションピッカーのカスタマイズ
+ピッカーに表示される絵文字を自分好みにカスタマイズすることができます。 設定の「リアクション」で設定します。
+
+## リモート投稿へのリアクションについて
+リアクションはMisskeyオリジナルの機能であるため、リモートインスタンスがMisskeyでない限りは、ほとんどの場合「Like」としてアクティビティが送信されます。一般的にはLikeは「お気に入り」として実装されているようです。 また、相手がMisskeyであったとしても、カスタム絵文字リアクションは伝わらず、自動的に「👍」等にフォールバックされます。
+
+## リモートからのリアクションについて
+リモートから「Like」アクティビティを受信したとき、Misskeyでは「👍」のリアクションとして解釈されます。
diff --git a/src/docs/zh-CN/reversi-bot.md b/src/docs/zh-CN/reversi-bot.md
new file mode 100644
index 0000000000..c89ec0cbe3
--- /dev/null
+++ b/src/docs/zh-CN/reversi-bot.md
@@ -0,0 +1,160 @@
+# MisskeyリバーシBotの開発
+Misskeyのリバーシ機能に対応したBotの開発方法をここに記します。
+
+1. `games/reversi`ストリームに以下のパラメータを付けて接続する:
+ * `i`: botアカウントのAPIキー
+
+2. 対局への招待が来たら、ストリームから`invited`イベントが流れてくる
+ * イベントの中身に、`parent`という名前で対局へ誘ってきたユーザーの情報が含まれている
+
+3. `games/reversi/match`へ、`user_id`として`parent`の`id`が含まれたリクエストを送信する
+
+4. 上手くいくとゲーム情報が返ってくるので、`games/reversi-game`ストリームへ、以下のパラメータを付けて接続する:
+ * `i`: botアカウントのAPIキー
+ * `game`: `game`の`id`
+
+5. この間、相手がゲームの設定を変更するとその都度`update-settings`イベントが流れてくるので、必要であれば何かしらの処理を行う
+
+6. 設定に満足したら、`{ type: 'accept' }`メッセージをストリームに送信する
+
+7. ゲームが開始すると、`started`イベントが流れてくる
+ * イベントの中身にはゲーム情報が含まれている
+
+8. 石を打つには、ストリームに`{ type: 'set', pos: <位置> }`を送信する(位置の計算方法は後述)
+
+9. 相手または自分が石を打つと、ストリームから`set`イベントが流れてくる
+ * `color`として石の色が含まれている
+ * `pos`として位置情報が含まれている
+
+## 位置の計算法
+8x8のマップを考える場合、各マスの位置(インデックスと呼びます)は次のようになっています:
+```
++--+--+--+--+--+--+--+--+
+| 0| 1| 2| 3| 4| 5| 6| 7|
++--+--+--+--+--+--+--+--+
+| 8| 9|10|11|12|13|14|15|
++--+--+--+--+--+--+--+--+
+|16|17|18|19|20|21|22|23|
+...
+```
+
+### X,Y座標 から インデックス に変換する
+```
+pos = x + (y * mapWidth)
+```
+`mapWidth`は、ゲーム情報の`map`から、次のようにして計算できます:
+```
+mapWidth = map[0].length
+```
+
+### インデックス から X,Y座標 に変換する
+```
+x = pos % mapWidth
+y = Math.floor(pos / mapWidth)
+```
+
+## マップ情報
+マップ情報は、ゲーム情報の`map`に入っています。 文字列の配列になっており、ひとつひとつの文字がマス情報を表しています。 それをもとにマップのデザインを知る事が出来ます:
+* `(スペース)` ... マス無し
+* `-` ... マス
+* `b` ... 初期配置される黒石
+* `w` ... 初期配置される白石
+
+例えば、4*4の次のような単純なマップがあるとします:
+```text
++---+---+---+---+
+| | | | |
++---+---+---+---+
+| | ○ | ● | |
++---+---+---+---+
+| | ● | ○ | |
++---+---+---+---+
+| | | | |
++---+---+---+---+
+```
+
+この場合、マップデータはこのようになります:
+```javascript
+['----', '-wb-', '-bw-', '----']
+```
+
+## ユーザーにフォームを提示して対話可能Botを作成する
+ユーザーとのコミュニケーションを行うため、ゲームの設定画面でユーザーにフォームを提示することができます。 例えば、Botの強さをユーザーが設定できるようにする、といったシナリオが考えられます。
+
+フォームを提示するには、`reversi-game`ストリームに次のメッセージを送信します:
+```javascript
+{
+ type: 'init-form',
+ body: [フォームコントロールの配列]
+}
+```
+
+フォームコントロールの配列については今から説明します。 フォームコントロールは、次のようなオブジェクトです:
+```javascript
+{
+ id: 'switch1',
+ type: 'switch',
+ label: 'Enable hoge',
+ value: false
+}
+```
+`id` ... コントロールのID。 `type` ... コントロールの種類。後述します。 `label` ... コントロールと一緒に表記するテキスト。 `value` ... コントロールのデフォルト値。
+
+### フォームの操作を受け取る
+ユーザーがフォームを操作すると、ストリームから`update-form`イベントが流れてきます。 イベントの中身には、コントロールのIDと、ユーザーが設定した値が含まれています。 例えば、上で示したスイッチをユーザーがオンにしたとすると、次のイベントが流れてきます:
+```javascript
+{
+ id: 'switch1',
+ value: true
+}
+```
+
+### フォームコントロールの種類
+#### 开关
+type: `switch` スイッチを表示します。何かの機能をオン/オフさせたい場合に有用です。
+
+##### プロパティ
+`label` ... スイッチに表記するテキスト。
+
+#### ラジオボタン
+type: `radio` ラジオボタンを表示します。選択肢を提示するのに有用です。例えば、Botの強さを設定させるなどです。
+
+##### プロパティ
+`items` ... ラジオボタンの選択肢。例:
+```javascript
+items: [{
+ label: '弱',
+ value: 1
+}, {
+ label: '中',
+ value: 2
+}, {
+ label: '強',
+ value: 3
+}]
+```
+
+#### スライダー
+type: `slider` スライダーを表示します。
+
+##### プロパティ
+`min` ... スライダーの下限。 `max` ... スライダーの上限。 `step` ... 入力欄で刻むステップ値。
+
+#### テキストボックス
+type: `textbox` テキストボックスを表示します。ユーザーになにか入力させる一般的な用途に利用できます。
+
+## ユーザーにメッセージを表示する
+設定画面でユーザーと対話する、フォーム以外のもうひとつの方法がこれです。ユーザーになにかメッセージを表示することができます。 例えば、ユーザーがBotの対応していないモードやマップを選択したとき、警告を表示するなどです。 メッセージを表示するには、次のメッセージをストリームに送信します:
+```javascript
+{
+ type: 'message',
+ body: {
+ text: 'メッセージ内容',
+ type: 'メッセージの種類'
+ }
+}
+```
+メッセージの種類: `success`, `info`, `warning`, `error`。
+
+## 投了する
+投了をするには、<a href="./api/endpoints/games/reversi/games/surrender">このエンドポイント</a>にリクエストします。
diff --git a/src/docs/zh-CN/stream.md b/src/docs/zh-CN/stream.md
new file mode 100644
index 0000000000..91d4d0e928
--- /dev/null
+++ b/src/docs/zh-CN/stream.md
@@ -0,0 +1,354 @@
+# 流式API
+
+ストリーミングAPIを使うと、リアルタイムで様々な情報(例えばタイムラインに新しい投稿が流れてきた、メッセージが届いた、フォローされた、など)を受け取ったり、様々な操作を行ったりすることができます。
+
+## ストリームに接続する
+
+ストリーミングAPIを利用するには、まずMisskeyサーバーに**websocket**接続する必要があります。
+
+以下のURLに、`i`というパラメータ名で認証情報を含めて、websocket接続してください。例:
+```
+%WS_URL%/streaming?i=xxxxxxxxxxxxxxx
+```
+
+認証情報は、自分のAPIキーや、アプリケーションからストリームに接続する際はユーザーのアクセストークンのことを指します。
+
+<div class="ui info">
+ <p><i class="fas fa-info-circle"></i> 認証情報の取得については、<a href="./api">こちらのドキュメント</a>をご確認ください。</p>
+</div>
+
+---
+
+認証情報は省略することもできますが、その場合非ログインでの利用ということになり、受信できる情報や可能な操作は限られます。例:
+
+```
+%WS_URL%/streaming
+```
+
+---
+
+ストリームに接続すると、後述するAPI操作や、投稿の購読を行ったりすることができます。 しかしまだこの段階では、例えばタイムラインへの新しい投稿を受信したりすることはできません。 それを行うには、ストリーム上で、後述する**チャンネル**に接続する必要があります。
+
+**ストリームでのやり取りはすべてJSONです。**
+
+## 频道
+MisskeyのストリーミングAPIにはチャンネルという概念があります。これは、送受信する情報を分離するための仕組みです。 Misskeyのストリームに接続しただけでは、まだリアルタイムでタイムラインの投稿を受信したりはできません。 ストリーム上でチャンネルに接続することで、様々な情報を受け取ったり情報を送信したりすることができるようになります。
+
+### チャンネルに接続する
+チャンネルに接続するには、次のようなデータをJSONでストリームに送信します:
+
+```json
+{
+ type: 'connect',
+ body: {
+ channel: 'xxxxxxxx',
+ id: 'foobar',
+ params: {
+ ...
+ }
+ }
+}
+```
+
+ここで、
+* `channel`には接続したいチャンネル名を設定します。チャンネルの種類については後述します。
+* `id`にはそのチャンネルとやり取りするための任意のIDを設定します。ストリームでは様々なメッセージが流れるので、そのメッセージがどのチャンネルからのものなのか識別する必要があるからです。このIDは、UUIDや、乱数のようなもので構いません。
+* `params`はチャンネルに接続する際のパラメータです。チャンネルによって接続時に必要とされるパラメータは異なります。パラメータ不要のチャンネルに接続する際は、このプロパティは省略可能です。
+
+<div class="ui info">
+ <p><i class="fas fa-info-circle"></i> IDはチャンネルごとではなく「チャンネルの接続ごと」です。なぜなら、同じチャンネルに異なるパラメータで複数接続するケースもあるからです。</p>
+</div>
+
+### チャンネルからのメッセージを受け取る
+例えばタイムラインのチャンネルなら、新しい投稿があった時にメッセージを発します。そのメッセージを受け取ることで、タイムラインに新しい投稿がされたことをリアルタイムで知ることができます。
+
+チャンネルがメッセージを発すると、次のようなデータがJSONでストリームに流れてきます:
+```json
+{
+ type: 'channel',
+ body: {
+ id: 'foobar',
+ type: 'something',
+ body: {
+ some: 'thing'
+ }
+ }
+}
+```
+
+ここで、
+* `id`には前述したそのチャンネルに接続する際に設定したIDが設定されています。これで、このメッセージがどのチャンネルからのものなのか知ることができます。
+* `type`にはメッセージの種類が設定されます。チャンネルによって、どのような種類のメッセージが流れてくるかは異なります。
+* `body`にはメッセージの内容が設定されます。チャンネルによって、どのような内容のメッセージが流れてくるかは異なります。
+
+### チャンネルに向けてメッセージを送信する
+チャンネルによっては、メッセージを受け取るだけでなく、こちらから何かメッセージを送信し、何らかの操作を行える場合があります。
+
+チャンネルにメッセージを送信するには、次のようなデータをJSONでストリームに送信します:
+```json
+{
+ type: 'channel',
+ body: {
+ id: 'foobar',
+ type: 'something',
+ body: {
+ some: 'thing'
+ }
+ }
+}
+```
+
+ここで、
+* `id`には前述したそのチャンネルに接続する際に設定したIDを設定します。これで、このメッセージがどのチャンネルに向けたものなのか識別させることができます。
+* `type`にはメッセージの種類を設定します。チャンネルによって、どのような種類のメッセージを受け付けるかは異なります。
+* `body`にはメッセージの内容を設定します。チャンネルによって、どのような内容のメッセージを受け付けるかは異なります。
+
+### チャンネルから切断する
+チャンネルから切断するには、次のようなデータをJSONでストリームに送信します:
+
+```json
+{
+ type: 'disconnect',
+ body: {
+ id: 'foobar'
+ }
+}
+```
+
+ここで、
+* `id`には前述したそのチャンネルに接続する際に設定したIDを設定します。
+
+## ストリームを経由してAPIリクエストする
+
+ストリームを経由してAPIリクエストすると、HTTPリクエストを発生させずにAPIを利用できます。そのため、コードを簡潔にできたり、パフォーマンスの向上を見込めるかもしれません。
+
+ストリームを経由してAPIリクエストするには、次のようなデータをJSONでストリームに送信します:
+```json
+{
+ type: 'api',
+ body: {
+ id: 'xxxxxxxxxxxxxxxx',
+ endpoint: 'notes/create',
+ data: {
+ text: 'yee haw!'
+ }
+ }
+}
+```
+
+ここで、
+* `id`には、APIのレスポンスを識別するための、APIリクエストごとの一意なIDを設定する必要があります。UUIDや、簡単な乱数のようなもので構いません。
+* `endpoint`には、あなたがリクエストしたいAPIのエンドポイントを指定します。
+* `data`には、エンドポイントのパラメータを含めます。
+
+<div class="ui info">
+ <p><i class="fas fa-info-circle"></i> APIのエンドポイントやパラメータについてはAPIリファレンスをご確認ください。</p>
+</div>
+
+### レスポンスの受信
+
+APIへリクエストすると、レスポンスがストリームから次のような形式で流れてきます。
+
+```json
+{
+ type: 'api:xxxxxxxxxxxxxxxx',
+ body: {
+ ...
+ }
+}
+```
+
+ここで、
+* `xxxxxxxxxxxxxxxx`の部分には、リクエストの際に設定された`id`が含まれています。これにより、どのリクエストに対するレスポンスなのか判別することができます。
+* `body`には、レスポンスが含まれています。
+
+## 投稿のキャプチャ
+
+Misskeyは投稿のキャプチャと呼ばれる仕組みを提供しています。これは、指定した投稿のイベントをストリームで受け取る機能です。
+
+例えばタイムラインを取得してユーザーに表示したとします。ここで誰かがそのタイムラインに含まれるどれかの投稿に対してリアクションしたとします。
+
+しかし、クライアントからするとある投稿にリアクションが付いたことなどは知る由がないため、リアルタイムでリアクションをタイムライン上の投稿に反映して表示するといったことができません。
+
+この問題を解決するために、Misskeyは投稿のキャプチャ機構を用意しています。投稿をキャプチャすると、その投稿に関するイベントを受け取ることができるため、リアルタイムでリアクションを反映させたりすることが可能になります。
+
+### 投稿をキャプチャする
+
+投稿をキャプチャするには、ストリームに次のようなメッセージを送信します:
+
+```json
+{
+ type: 'subNote',
+ body: {
+ id: 'xxxxxxxxxxxxxxxx'
+ }
+}
+```
+
+ここで、
+* `id`にキャプチャしたい投稿の`id`を設定します。
+
+このメッセージを送信すると、Misskeyにキャプチャを要請したことになり、以後、その投稿に関するイベントが流れてくるようになります。
+
+例えば投稿にリアクションが付いたとすると、次のようなメッセージが流れてきます:
+
+```json
+{
+ type: 'noteUpdated',
+ body: {
+ id: 'xxxxxxxxxxxxxxxx',
+ type: 'reacted',
+ body: {
+ reaction: 'like',
+ userId: 'yyyyyyyyyyyyyyyy'
+ }
+ }
+}
+```
+
+ここで、
+* `body`内の`id`に、イベントを発生させた投稿のIDが設定されます。
+* `body`内の`type`に、イベントの種類が設定されます。
+* `body`内の`body`に、イベントの詳細が設定されます。
+
+#### イベントの種類
+
+##### `reacted`
+その投稿にリアクションがされた時に発生します。
+
+* `reaction`に、リアクションの種類が設定されます。
+* `userId`に、リアクションを行ったユーザーのIDが設定されます。
+
+例:
+```json
+{
+ type: 'noteUpdated',
+ body: {
+ id: 'xxxxxxxxxxxxxxxx',
+ type: 'reacted',
+ body: {
+ reaction: 'like',
+ userId: 'yyyyyyyyyyyyyyyy'
+ }
+ }
+}
+```
+
+##### `deleted`
+その投稿が削除された時に発生します。
+
+* `deletedAt`に、削除日時が設定されます。
+
+例:
+```json
+{
+ type: 'noteUpdated',
+ body: {
+ id: 'xxxxxxxxxxxxxxxx',
+ type: 'deleted',
+ body: {
+ deletedAt: '2018-10-22T02:17:09.703Z'
+ }
+ }
+}
+```
+
+##### `pollVoted`
+その投稿に添付されたアンケートに投票された時に発生します。
+
+* `choice`に、選択肢IDが設定されます。
+* `userId`に、投票を行ったユーザーのIDが設定されます。
+
+例:
+```json
+{
+ type: 'noteUpdated',
+ body: {
+ id: 'xxxxxxxxxxxxxxxx',
+ type: 'pollVoted',
+ body: {
+ choice: 2,
+ userId: 'yyyyyyyyyyyyyyyy'
+ }
+ }
+}
+```
+
+### 投稿のキャプチャを解除する
+
+その投稿がもう画面に表示されなくなったりして、その投稿に関するイベントをもう受け取る必要がなくなったときは、キャプチャの解除を申請してください。
+
+次のメッセージを送信します:
+
+```json
+{
+ type: 'unsubNote',
+ body: {
+ id: 'xxxxxxxxxxxxxxxx'
+ }
+}
+```
+
+ここで、
+* `id`にキャプチャを解除したい投稿の`id`を設定します。
+
+このメッセージを送信すると、以後、その投稿に関するイベントは流れてこないようになります。
+
+# チャンネル一覧
+## `main`
+アカウントに関する基本的な情報が流れてきます。このチャンネルにパラメータはありません。
+
+### 流れてくるイベント一覧
+
+#### `renote`
+自分の投稿がRenoteされた時に発生するイベントです。自分自身の投稿をRenoteしたときは発生しません。
+
+#### `mention`
+誰かからメンションされたときに発生するイベントです。
+
+#### `readAllNotifications`
+自分宛ての通知がすべて既読になったことを表すイベントです。このイベントを利用して、「通知があることを示すアイコン」のようなものをオフにしたりする等のケースが想定されます。
+
+#### `meUpdated`
+自分の情報が更新されたことを表すイベントです。
+
+#### `follow`
+自分が誰かをフォローしたときに発生するイベントです。
+
+#### `unfollow`
+自分が誰かのフォローを解除したときに発生するイベントです。
+
+#### `followed`
+自分が誰かにフォローされたときに発生するイベントです。
+
+## `homeTimeline`
+ホームタイムラインの投稿情報が流れてきます。このチャンネルにパラメータはありません。
+
+### 流れてくるイベント一覧
+
+#### `note`
+タイムラインに新しい投稿が流れてきたときに発生するイベントです。
+
+## `localTimeline`
+ローカルタイムラインの投稿情報が流れてきます。このチャンネルにパラメータはありません。
+
+### 流れてくるイベント一覧
+
+#### `note`
+ローカルタイムラインに新しい投稿が流れてきたときに発生するイベントです。
+
+## `hybridTimeline`
+ソーシャルタイムラインの投稿情報が流れてきます。このチャンネルにパラメータはありません。
+
+### 流れてくるイベント一覧
+
+#### `note`
+ソーシャルタイムラインに新しい投稿が流れてきたときに発生するイベントです。
+
+## `globalTimeline`
+グローバルタイムラインの投稿情報が流れてきます。このチャンネルにパラメータはありません。
+
+### 流れてくるイベント一覧
+
+#### `note`
+グローバルタイムラインに新しい投稿が流れてきたときに発生するイベントです。
diff --git a/src/docs/zh-CN/theme.md b/src/docs/zh-CN/theme.md
new file mode 100644
index 0000000000..041625867a
--- /dev/null
+++ b/src/docs/zh-CN/theme.md
@@ -0,0 +1,68 @@
+# 主题
+
+テーマを設定して、Misskeyクライアントの見た目を変更できます。
+
+## テーマの設定
+設定 > テーマ
+
+## テーマを作成する
+テーマコードはJSON5で記述されたテーマオブジェクトです。 テーマは以下のようなオブジェクトです。
+``` js
+{
+ id: '17587283-dd92-4a2c-a22c-be0637c9e22a',
+
+ name: 'Danboard',
+ author: 'syuilo',
+
+ base: 'light',
+
+ props: {
+ accent: 'rgb(218, 141, 49)',
+ bg: 'rgb(218, 212, 190)',
+ fg: 'rgb(115, 108, 92)',
+ panel: 'rgb(236, 232, 220)',
+ renote: 'rgb(100, 152, 106)',
+ link: 'rgb(100, 152, 106)',
+ mention: '@accent',
+ hashtag: 'rgb(100, 152, 106)',
+ header: 'rgba(239, 227, 213, 0.75)',
+ navBg: 'rgb(216, 206, 182)',
+ inputBorder: 'rgba(0, 0, 0, 0.1)',
+ },
+}
+
+```
+
+* `id` ... テーマの一意なID。UUIDをおすすめします。
+* `name` ... テーマ名
+* `author` ... テーマの作者
+* `desc` ... テーマの説明(オプション)
+* `base` ... 明るいテーマか、暗いテーマか
+ * `light`にすると明るいテーマになり、`dark`にすると暗いテーマになります。
+ * テーマはここで設定されたベーステーマを継承します。
+* `props` ... テーマのスタイル定義。これから説明します。
+
+### テーマのスタイル定義
+`props`下にはテーマのスタイルを定義します。 キーがCSSの変数名になり、バリューで中身を指定します。 なお、この`props`オブジェクトはベーステーマから継承されます。 ベーステーマは、このテーマの`base`が`light`なら[_light.json5](https://github.com/syuilo/misskey/blob/develop/src/client/themes/_light.json5)で、`dark`なら[_dark.json5](https://github.com/syuilo/misskey/blob/develop/src/client/themes/_dark.json5)です。 つまり、このテーマ内の`props`に`panel`というキーが無くても、そこにはベーステーマの`panel`があると見なされます。
+
+#### バリューで使える構文
+* 16進数で表された色
+ * 例: `#00ff00`
+* `rgb(r, g, b)`形式で表された色
+ * 例: `rgb(0, 255, 0)`
+* `rgb(r, g, b, a)`形式で表された透明度を含む色
+ * 例: `rgba(0, 255, 0, 0.5)`
+* 他のキーの値の参照
+ * `@{キー名}`と書くと他のキーの値の参照になります。`{キー名}`は参照したいキーの名前に置き換えます。
+ * 例: `@panel`
+* 定数(後述)の参照
+ * `${定数名}`と書くと定数の参照になります。`{定数名}`は参照したい定数の名前に置き換えます。
+ * 例: `$main`
+* 関数(後述)
+ * `:{関数名}<{引数}<{色}`
+
+#### 常量
+「CSS変数として出力はしたくないが、他のCSS変数の値として使いまわしたい」値があるときは、定数を使うと便利です。 キー名を`$`で始めると、そのキーはCSS変数として出力されません。
+
+#### 函数
+wip
diff --git a/src/docs/zh-CN/timelines.md b/src/docs/zh-CN/timelines.md
new file mode 100644
index 0000000000..3ac1e114d0
--- /dev/null
+++ b/src/docs/zh-CN/timelines.md
@@ -0,0 +1,15 @@
+# タイムラインの比較
+
+https://docs.google.com/spreadsheets/d/1lxQ2ugKrhz58Bg96HTDK_2F98BUritkMyIiBkOByjHA/edit?usp=sharing
+
+## 首页
+自分のフォローしているユーザーの投稿
+
+## 本地
+全てのローカルユーザーの「ホーム」指定されていない投稿
+
+## 社交
+自分のフォローしているユーザーの投稿と、全てのローカルユーザーの「ホーム」指定されていない投稿
+
+## 全局
+全てのローカルユーザーの「ホーム」指定されていない投稿と、サーバーに届いた全てのリモートユーザーの「ホーム」指定されていない投稿
diff --git a/src/docs/zh-TW/aiscript.md b/src/docs/zh-TW/aiscript.md
new file mode 100644
index 0000000000..461478ddda
--- /dev/null
+++ b/src/docs/zh-TW/aiscript.md
@@ -0,0 +1,4 @@
+# AiScript
+
+## 函数
+用於傳遞預設值。
diff --git a/src/docs/zh-TW/api.md b/src/docs/zh-TW/api.md
new file mode 100644
index 0000000000..fed2458046
--- /dev/null
+++ b/src/docs/zh-TW/api.md
@@ -0,0 +1,58 @@
+# Misskey API
+
+使用MisskeyAPI以開發Misskey客戶端、Misskey連接的網路服務平台及機器人等(以下簡稱 「應用程式」)。 此外,還有串流媒體API,讓使用者建立具有實時性的應用程式。
+
+要開始使用API​​,你首先需要獲得一個存取權杖。 本說明文件將介紹獲得存取權杖的步驟,及解釋基本的API使用方法。
+
+## 取得存取權杖
+基本的に、APIはリクエストにはアクセストークンが必要となります。 APIにリクエストするのが自分自身なのか、不特定の利用者に使ってもらうアプリケーションなのかによって取得手順は異なります。
+
+* 前者の場合: [「自分自身のアクセストークンを手動発行する」](#自分自身のアクセストークンを手動発行する)に進む
+* 後者の場合: [「アプリケーション利用者にアクセストークンの発行をリクエストする」](#アプリケーション利用者にアクセストークンの発行をリクエストする)に進む
+
+### 自分自身のアクセストークンを手動発行する
+「設定 > API」で、自分のアクセストークンを発行できます。
+
+[「APIの使い方」へ進む](#API使用方法)
+
+### アプリケーション利用者にアクセストークンの発行をリクエストする
+アプリケーション利用者のアクセストークンを取得するには、以下の手順で発行をリクエストします。
+
+#### 步驟1
+
+UUIDを生成する。以後これをセッションIDと呼びます。
+
+> このセッションIDは毎回生成し、使いまわさないようにしてください。
+
+#### 步驟2
+
+`{_URL_}/miauth/{session}`をユーザーのブラウザで表示させる。`{session}`の部分は、セッションIDに置き換えてください。
+> 例: `{_URL_}/miauth/c1f6d42b-468b-4fd2-8274-e58abdedef6f`
+
+表示する際、URLにクエリパラメータとしていくつかのオプションを設定できます:
+* `name` ... アプリケーション名
+ * > 例: `MissDeck`
+* `icon` ... アプリケーションのアイコン画像URL
+ * > 例: `https://missdeck.example.com/icon.png`
+* `callback` ... 認証が終わった後にリダイレクトするURL
+ * > 例: `https://missdeck.example.com/callback`
+ * リダイレクト時には、`session`というクエリパラメータでセッションIDが付きます
+* `permission` ... アプリケーションが要求する権限
+ * > 例: `write:notes,write:following,read:drive`
+ * 要求する権限を`,`で区切って列挙します
+ * どのような権限があるかは[APIリファレンス](/api-doc)で確認できます
+
+#### 步驟3
+ユーザーが発行を許可した後、`{_URL_}/api/miauth/{session}/check`にPOSTリクエストすると、レスポンスとしてアクセストークンを含むJSONが返ります。
+
+レスポンスに含まれるプロパティ:
+* `token` ... ユーザーのアクセストークン
+* `user` ... ユーザーの情報
+
+[「APIの使い方」へ進む](#API使用方法)
+
+## API使用方法
+**APIはすべてPOSTで、リクエスト/レスポンスともにJSON形式です。RESTではありません。** アクセストークンは、`i`というパラメータ名でリクエストに含めます。
+
+* [API 參考](/api-doc)
+* [串流媒體API](./stream)
diff --git a/src/docs/zh-TW/create-plugin.md b/src/docs/zh-TW/create-plugin.md
new file mode 100644
index 0000000000..d02832c847
--- /dev/null
+++ b/src/docs/zh-TW/create-plugin.md
@@ -0,0 +1,74 @@
+# プラグインの作成
+Misskey Webクライアントのプラグイン機能を使うと、クライアントを拡張し、様々な機能を追加できます。 ここではプラグインの作成にあたってのメタデータ定義や、AiScript APIリファレンスを掲載します。
+
+## 元資料(Metadata)
+プラグインは、AiScriptのメタデータ埋め込み機能を使って、デフォルトとしてプラグインのメタデータを定義する必要があります。 メタデータは次のプロパティを含むオブジェクトです。
+
+### name
+プラグイン名
+
+### author
+プラグイン作者
+
+### version
+プラグインバージョン。数値を指定してください。
+
+### description
+プラグインの説明
+
+### permissions
+プラグインが要求する権限。MisskeyAPIにリクエストする際に用いられます。
+
+### config
+プラグインの設定情報を表すオブジェクト。 キーに設定名、値に以下のプロパティを含めます。
+
+#### type
+設定値の種類を表す文字列。以下から選択します。 string number boolean
+
+#### label
+ユーザーに表示する設定名
+
+#### description
+設定の説明
+
+#### default
+設定のデフォルト値
+
+## API 參考
+AiScript標準で組み込まれているAPIは掲載しません。
+
+### Mk:dialog(title text type)
+ダイアログを表示します。typeには以下の値が設定できます。 info success warn error question 省略すると info になります。
+
+### Mk:confirm(title text type)
+確認ダイアログを表示します。typeには以下の値が設定できます。 info success warn error question 省略すると question になります。 ユーザーが"OK"を選択した場合は true を、"キャンセル"を選択した場合は false が返ります。
+
+### Mk:api(endpoint params)
+Misskey APIにリクエストします。第一引数にエンドポイント名、第二引数にパラメータオブジェクトを渡します。
+
+### Mk:save(key value)
+任意の値に任意の名前を付けて永続化します。永続化した値は、AiScriptコンテキストが終了しても残り、Mk:loadで読み取ることができます。
+
+### Mk:load(key)
+Mk:saveで永続化した指定の名前の値を読み取ります。
+
+### Plugin:register_post_form_action(title fn)
+投稿フォームにアクションを追加します。第一引数にアクション名、第二引数にアクションが選択された際のコールバック関数を渡します。 コールバック関数には、第一引数に投稿フォームオブジェクトが渡されます。
+
+### Plugin:register_note_action(title fn)
+ノートメニューに項目を追加します。第一引数に項目名、第二引数に項目が選択された際のコールバック関数を渡します。 コールバック関数には、第一引数に対象のノートオブジェクトが渡されます。
+
+### Plugin:register_user_action(title fn)
+ユーザーメニューに項目を追加します。第一引数に項目名、第二引数に項目が選択された際のコールバック関数を渡します。 コールバック関数には、第一引数に対象のユーザーオブジェクトが渡されます。
+
+### Plugin:register_note_view_interruptor(fn)
+UIに表示されるノート情報を書き換えます。 コールバック関数には、第一引数に対象のノートオブジェクトが渡されます。 コールバック関数の返り値でノートが書き換えられます。
+
+### Plugin:register_note_post_interruptor(fn)
+ノート投稿時にノート情報を書き換えます。 コールバック関数には、第一引数に対象のノートオブジェクトが渡されます。 コールバック関数の返り値でノートが書き換えられます。
+
+### Plugin:open_url(url)
+第一引数に渡されたURLをブラウザの新しいタブで開きます。
+
+### Plugin:config
+プラグインの設定が格納されるオブジェクト。プラグイン定義のconfigで設定したキーで値が入ります。
diff --git a/src/docs/zh-TW/custom-emoji.md b/src/docs/zh-TW/custom-emoji.md
new file mode 100644
index 0000000000..193cf3eb48
--- /dev/null
+++ b/src/docs/zh-TW/custom-emoji.md
@@ -0,0 +1,2 @@
+# 自訂表情符號
+カスタム絵文字は、インスタンスで用意された画像を絵文字のように使える機能です。 ノート、リアクション、チャット、自己紹介、名前などの場所で使うことができます。 カスタム絵文字をそれらの場所で使うには、絵文字ピッカーボタン(ある場合)を押すか、`:`を入力して絵文字サジェストを表示します。 テキスト内に`:foo:`のような形式の文字列が見つかると、`foo`の部分がカスタム絵文字名と解釈され、表示時には対応したカスタム絵文字に置き換わります。
diff --git a/src/docs/zh-TW/deck.md b/src/docs/zh-TW/deck.md
new file mode 100644
index 0000000000..2e61618436
--- /dev/null
+++ b/src/docs/zh-TW/deck.md
@@ -0,0 +1,18 @@
+# 多欄模式
+
+デッキは利用可能なUIのひとつです。「カラム」と呼ばれるビューを複数並べて表示させることで、カスタマイズ性が高く、情報量の多いUIが構築できることが特徴です。
+
+## カラムの追加
+デッキの背景を右クリックし、「カラムを追加」して任意のカラムを追加できます。
+
+## カラムの移動
+カラムは、ドラッグアンドドロップで他のカラムと位置を入れ替えることが出来るほか、カラムメニュー(カラムのヘッダー右クリック)から位置を移動させることもできます。
+
+## カラムの水平分割
+カラムは左右だけでなく、上下に並べることもできます。 カラムメニューを開き、「左に重ねる」を選択すると、左のカラムの下に現在のカラムが移動します。 上下分割を解除するには、カラムメニューの「右に出す」を選択します。
+
+## カラムの設定
+カラムメニューの「編集」を選択するとカラムの設定を編集できます。カラムの名前を変えたり、幅を変えたりできます。
+
+## デッキの設定
+デッキに関する設定は、[settings/deck](/settings/deck)で行えます。
diff --git a/src/docs/zh-TW/follow.md b/src/docs/zh-TW/follow.md
new file mode 100644
index 0000000000..03d6d40f88
--- /dev/null
+++ b/src/docs/zh-TW/follow.md
@@ -0,0 +1,2 @@
+# 追隨中
+當你追隨其他使用者時,你的時間軸上將出現他們的箋文。但是,他們對其他用戶的回覆不會被顯示。 若要追隨一個使用者,請點選其使用者頁面上的「追隨」按鈕。若要解除追隨,請再次點選該按鈕。
diff --git a/src/docs/zh-TW/keyboard-shortcut.md b/src/docs/zh-TW/keyboard-shortcut.md
new file mode 100644
index 0000000000..a33a28c60e
--- /dev/null
+++ b/src/docs/zh-TW/keyboard-shortcut.md
@@ -0,0 +1,68 @@
+# キーボードショートカット
+
+## 全域
+これらのショートカットは基本的にどこでも使えます。
+<table>
+ <thead>
+ <tr><th>快速鍵</th><th>功能</th><th>由來</th></tr>
+ </thead>
+ <tbody>
+ <tr><td><kbd class="key">P</kbd>, <kbd class="key">N</kbd></td><td>新規投稿</td><td><b>P</b>ost, <b>N</b>ew, <b>N</b>ote</td></tr>
+ <tr><td><kbd class="key">T</kbd></td><td>タイムラインの最も新しい投稿にフォーカス</td><td><b>T</b>imeline, <b>T</b>op</td></tr>
+ <tr><td><kbd class="group"><kbd class="key">Shift</kbd> + <kbd class="key">N</kbd></kbd></td><td>通知を表示/隠す</td><td><b>N</b>otifications</td></tr>
+ <tr><td><kbd class="key">S</kbd></td><td>搜尋</td><td><b>S</b>earch</td></tr>
+ <tr><td><kbd class="key">H</kbd>, <kbd class="key">?</kbd></td><td>ヘルプを表示</td><td><b>H</b>elp</td></tr>
+ </tbody>
+</table>
+
+## 投稿にフォーカスされた状態
+
+<table>
+ <thead>
+ <tr><th>快速鍵</th><th>功能</th><th>由來</th></tr>
+ </thead>
+ <tbody>
+ <tr><td><kbd class="key">↑</kbd>, <kbd class="key">K</kbd>, <kbd class="group"><kbd class="key">Shift</kbd> + <kbd class="key">Tab</kbd></kbd></td><td>上の投稿にフォーカスを移動</td><td>-</td></tr>
+ <tr><td><kbd class="key">↓</kbd>, <kbd class="key">J</kbd>, <kbd class="key">Tab</kbd></td><td>下の投稿にフォーカスを移動</td><td>-</td></tr>
+ <tr><td><kbd class="key">R</kbd></td><td>返信フォームを開く</td><td><b>R</b>eply</td></tr>
+ <tr><td><kbd class="key">Q</kbd></td><td>Renoteフォームを開く</td><td><b>Q</b>uote</td></tr>
+ <tr><td><kbd class="group"><kbd class="key">Ctrl</kbd> + <kbd class="key">Q</kbd></kbd></td><td>即刻Renoteする(フォームを開かずに)</td><td>-</td></tr>
+ <tr><td><kbd class="key">E</kbd>, <kbd class="key">A</kbd>, <kbd class="key">+</kbd></td><td>リアクションフォームを開く</td><td><b>E</b>mote, re<b>A</b>ction</td></tr>
+ <tr><td><kbd class="key">0</kbd>~<kbd class="key">9</kbd></td><td>数字に対応したリアクションをする(対応については後述)</td><td>-</td></tr>
+ <tr><td><kbd class="key">F</kbd>, <kbd class="key">B</kbd></td><td>お気に入りに登録</td><td><b>F</b>avorite, <b>B</b>ookmark</td></tr>
+ <tr><td><kbd class="key">Del</kbd>, <kbd class="group"><kbd class="key">Ctrl</kbd> + <kbd class="key">D</kbd></kbd></td><td>投稿を削除</td><td><b>D</b>elete</tr>
+ <tr><td><kbd class="key">M</kbd>, <kbd class="key">O</kbd></td><td>投稿に対するメニューを開く</td><td><b>M</b>ore, <b>O</b>ther</td></tr>
+ <tr><td><kbd class="key">S</kbd></td><td>CWで隠された部分を表示 or 隠す</td><td><b>S</b>how, <b>S</b>ee</td></tr>
+ <tr><td><kbd class="key">Esc</kbd></td><td>フォーカスを外す</td><td>-</td></tr>
+ </tbody>
+</table>
+
+## Renoteフォーム
+
+<table>
+ <thead>
+ <tr><th>快速鍵</th><th>功能</th><th>由來</th></tr>
+ </thead>
+ <tbody>
+ <tr><td><kbd class="key">Enter</kbd></td><td>Renoteする</td><td>-</td></tr>
+ <tr><td><kbd class="key">Q</kbd></td><td>フォームを展開する</td><td><b>Q</b>uote</td></tr>
+ <tr><td><kbd class="key">Esc</kbd></td><td>フォームを閉じる</td><td>-</td></tr>
+ </tbody>
+</table>
+
+## リアクションフォーム
+デフォルトで「👍」にフォーカスが当たっている状態です。
+<table>
+ <thead>
+ <tr><th>快速鍵</th><th>功能</th><th>由來</th></tr>
+ </thead>
+ <tbody>
+ <tr><td><kbd class="key">↑</kbd>, <kbd class="key">K</kbd></td><td>上のリアクションにフォーカスを移動</td><td>-</td></tr>
+ <tr><td><kbd class="key">↓</kbd>, <kbd class="key">J</kbd></td><td>下のリアクションにフォーカスを移動</td><td>-</td></tr>
+ <tr><td><kbd class="key">←</kbd>, <kbd class="key">H</kbd>, <kbd class="group"><kbd class="key">Shift</kbd> + <kbd class="key">Tab</kbd></kbd></td><td>左のリアクションにフォーカスを移動</td><td>-</td></tr>
+ <tr><td><kbd class="key">→</kbd>, <kbd class="key">L</kbd>, <kbd class="key">Tab</kbd></td><td>右のリアクションにフォーカスを移動</td><td>-</td></tr>
+ <tr><td><kbd class="key">Enter</kbd>, <kbd class="key">Space</kbd>, <kbd class="key">+</kbd></td><td>リアクション確定</td><td>-</td></tr>
+ <tr><td><kbd class="key">0</kbd>~<kbd class="key">9</kbd></td><td>数字に対応したリアクションで確定</td><td>-</td></tr>
+ <tr><td><kbd class="key">Esc</kbd></td><td>リアクションするのをやめる</td><td>-</td></tr>
+ </tbody>
+</table>
diff --git a/src/docs/zh-TW/mfm.md b/src/docs/zh-TW/mfm.md
new file mode 100644
index 0000000000..e237287acc
--- /dev/null
+++ b/src/docs/zh-TW/mfm.md
@@ -0,0 +1,2 @@
+# MFM
+MFMは、Misskey Flavored Markdownの略で、Misskeyの様々な場所で使用できる専用のマークアップ言語です。 MFMで使用可能な構文は[MFMチートシート](/mfm-cheat-sheet)で確認できます。
diff --git a/src/docs/zh-TW/mute.md b/src/docs/zh-TW/mute.md
new file mode 100644
index 0000000000..7d17ef4328
--- /dev/null
+++ b/src/docs/zh-TW/mute.md
@@ -0,0 +1,13 @@
+# 靜音
+
+ユーザーをミュートすると、そのユーザーに関する次のコンテンツがMisskeyに表示されなくなります:
+
+* タイムラインや投稿の検索結果内の、そのユーザーの投稿(およびそれらの投稿に対する返信やRenote)
+* そのユーザーからの通知
+* メッセージ履歴一覧内の、そのユーザーとのメッセージ履歴
+
+ユーザーをミュートするには、対象のユーザーのユーザーページに表示されている「ミュート」ボタンを押します。
+
+ミュートを行ったことは相手に通知されず、ミュートされていることを知ることもできません。
+
+設定>ミュート から、自分がミュートしているユーザー一覧を確認することができます。
diff --git a/src/docs/zh-TW/pages.md b/src/docs/zh-TW/pages.md
new file mode 100644
index 0000000000..7e88aa9a47
--- /dev/null
+++ b/src/docs/zh-TW/pages.md
@@ -0,0 +1,10 @@
+# Pages
+
+## 變數
+変数を使うことで動的なページを作成できます。テキスト内で <b>{ 変数名 }</b> と書くとそこに変数の値を埋め込めます。例えば <b>Hello { thing } world!</b> というテキストで、変数(thing)の値が <b>ai</b> だった場合、テキストは <b>Hello ai world!</b> になります。
+
+変数の評価(値を算出すること)は上から下に行われるので、ある変数の中で自分より下の変数を参照することはできません。例えば上から <b>A、B、C</b> と3つの変数を定義したとき、<b>C</b>の中で<b>A</b>や<b>B</b>を参照することはできますが、<b>A</b>の中で<b>B</b>や<b>C</b>を参照することはできません。
+
+ユーザーからの入力を受け取るには、ページに「ユーザー入力」ブロックを設置し、「変数名」に入力を格納したい変数名を設定します(変数は自動で作成されます)。その変数を使ってユーザー入力に応じた動作を行えます。
+
+関数を使うと、値の算出処理を再利用可能な形にまとめることができます。関数を作るには、「関数」タイプの変数を作成します。関数にはスロット(引数)を設定することができ、スロットの値は関数内で変数として利用可能です。また、関数を引数に取る関数(高階関数と呼ばれます)も存在します。関数は予め定義しておくほかに、このような高階関数のスロットに即席でセットすることもできます。
diff --git a/src/docs/zh-TW/reaction.md b/src/docs/zh-TW/reaction.md
new file mode 100644
index 0000000000..f807f9cd21
--- /dev/null
+++ b/src/docs/zh-TW/reaction.md
@@ -0,0 +1,11 @@
+# 反應
+他の人のノートに、絵文字を付けて簡単にあなたの反応を伝えられる機能です。 リアクションするには、ノートの + アイコンをクリックしてピッカーを表示し、絵文字を選択します。 リアクションには[カスタム絵文字](./custom-emoji)も使用できます。
+
+## リアクションピッカーのカスタマイズ
+ピッカーに表示される絵文字を自分好みにカスタマイズすることができます。 設定の「リアクション」で設定します。
+
+## リモート投稿へのリアクションについて
+リアクションはMisskeyオリジナルの機能であるため、リモートインスタンスがMisskeyでない限りは、ほとんどの場合「Like」としてアクティビティが送信されます。一般的にはLikeは「お気に入り」として実装されているようです。 また、相手がMisskeyであったとしても、カスタム絵文字リアクションは伝わらず、自動的に「👍」等にフォールバックされます。
+
+## リモートからのリアクションについて
+リモートから「Like」アクティビティを受信したとき、Misskeyでは「👍」のリアクションとして解釈されます。
diff --git a/src/docs/zh-TW/reversi-bot.md b/src/docs/zh-TW/reversi-bot.md
new file mode 100644
index 0000000000..987b24971c
--- /dev/null
+++ b/src/docs/zh-TW/reversi-bot.md
@@ -0,0 +1,160 @@
+# MisskeyリバーシBotの開発
+Misskeyのリバーシ機能に対応したBotの開発方法をここに記します。
+
+1. `games/reversi`ストリームに以下のパラメータを付けて接続する:
+ * `i`: botアカウントのAPIキー
+
+2. 対局への招待が来たら、ストリームから`invited`イベントが流れてくる
+ * イベントの中身に、`parent`という名前で対局へ誘ってきたユーザーの情報が含まれている
+
+3. `games/reversi/match`へ、`user_id`として`parent`の`id`が含まれたリクエストを送信する
+
+4. 上手くいくとゲーム情報が返ってくるので、`games/reversi-game`ストリームへ、以下のパラメータを付けて接続する:
+ * `i`: botアカウントのAPIキー
+ * `game`: `game`の`id`
+
+5. この間、相手がゲームの設定を変更するとその都度`update-settings`イベントが流れてくるので、必要であれば何かしらの処理を行う
+
+6. 設定に満足したら、`{ type: 'accept' }`メッセージをストリームに送信する
+
+7. ゲームが開始すると、`started`イベントが流れてくる
+ * イベントの中身にはゲーム情報が含まれている
+
+8. 石を打つには、ストリームに`{ type: 'set', pos: <位置> }`を送信する(位置の計算方法は後述)
+
+9. 相手または自分が石を打つと、ストリームから`set`イベントが流れてくる
+ * `color`として石の色が含まれている
+ * `pos`として位置情報が含まれている
+
+## 位置の計算法
+8x8のマップを考える場合、各マスの位置(インデックスと呼びます)は次のようになっています:
+```
++--+--+--+--+--+--+--+--+
+| 0| 1| 2| 3| 4| 5| 6| 7|
++--+--+--+--+--+--+--+--+
+| 8| 9|10|11|12|13|14|15|
++--+--+--+--+--+--+--+--+
+|16|17|18|19|20|21|22|23|
+...
+```
+
+### X,Y座標 から インデックス に変換する
+```
+pos = x + (y * mapWidth)
+```
+`mapWidth`は、ゲーム情報の`map`から、次のようにして計算できます:
+```
+mapWidth = map[0].length
+```
+
+### インデックス から X,Y座標 に変換する
+```
+x = pos % mapWidth
+y = Math.floor(pos / mapWidth)
+```
+
+## マップ情報
+マップ情報は、ゲーム情報の`map`に入っています。 文字列の配列になっており、ひとつひとつの文字がマス情報を表しています。 それをもとにマップのデザインを知る事が出来ます:
+* `(スペース)` ... マス無し
+* `-` ... マス
+* `b` ... 初期配置される黒石
+* `w` ... 初期配置される白石
+
+例えば、4*4の次のような単純なマップがあるとします:
+```text
++---+---+---+---+
+| | | | |
++---+---+---+---+
+| | ○ | ● | |
++---+---+---+---+
+| | ● | ○ | |
++---+---+---+---+
+| | | | |
++---+---+---+---+
+```
+
+この場合、マップデータはこのようになります:
+```javascript
+['----', '-wb-', '-bw-', '----']
+```
+
+## ユーザーにフォームを提示して対話可能Botを作成する
+ユーザーとのコミュニケーションを行うため、ゲームの設定画面でユーザーにフォームを提示することができます。 例えば、Botの強さをユーザーが設定できるようにする、といったシナリオが考えられます。
+
+フォームを提示するには、`reversi-game`ストリームに次のメッセージを送信します:
+```javascript
+{
+ type: 'init-form',
+ body: [フォームコントロールの配列]
+}
+```
+
+フォームコントロールの配列については今から説明します。 フォームコントロールは、次のようなオブジェクトです:
+```javascript
+{
+ id: 'switch1',
+ type: 'switch',
+ label: 'Enable hoge',
+ value: false
+}
+```
+`id` ... コントロールのID。 `type` ... コントロールの種類。後述します。 `label` ... コントロールと一緒に表記するテキスト。 `value` ... コントロールのデフォルト値。
+
+### フォームの操作を受け取る
+ユーザーがフォームを操作すると、ストリームから`update-form`イベントが流れてきます。 イベントの中身には、コントロールのIDと、ユーザーが設定した値が含まれています。 例えば、上で示したスイッチをユーザーがオンにしたとすると、次のイベントが流れてきます:
+```javascript
+{
+ id: 'switch1',
+ value: true
+}
+```
+
+### フォームコントロールの種類
+#### 開關
+type: `switch` スイッチを表示します。何かの機能をオン/オフさせたい場合に有用です。
+
+##### プロパティ
+`label` ... スイッチに表記するテキスト。
+
+#### ラジオボタン
+type: `radio` ラジオボタンを表示します。選択肢を提示するのに有用です。例えば、Botの強さを設定させるなどです。
+
+##### プロパティ
+`items` ... ラジオボタンの選択肢。例:
+```javascript
+items: [{
+ label: '弱',
+ value: 1
+}, {
+ label: '中',
+ value: 2
+}, {
+ label: '強',
+ value: 3
+}]
+```
+
+#### スライダー
+type: `slider` スライダーを表示します。
+
+##### プロパティ
+`min` ... スライダーの下限。 `max` ... スライダーの上限。 `step` ... 入力欄で刻むステップ値。
+
+#### テキストボックス
+type: `textbox` テキストボックスを表示します。ユーザーになにか入力させる一般的な用途に利用できます。
+
+## ユーザーにメッセージを表示する
+設定画面でユーザーと対話する、フォーム以外のもうひとつの方法がこれです。ユーザーになにかメッセージを表示することができます。 例えば、ユーザーがBotの対応していないモードやマップを選択したとき、警告を表示するなどです。 メッセージを表示するには、次のメッセージをストリームに送信します:
+```javascript
+{
+ type: 'message',
+ body: {
+ text: 'メッセージ内容',
+ type: 'メッセージの種類'
+ }
+}
+```
+メッセージの種類: `success`, `info`, `warning`, `error`。
+
+## 投了する
+投了をするには、<a href="./api/endpoints/games/reversi/games/surrender">このエンドポイント</a>にリクエストします。
diff --git a/src/docs/zh-TW/stream.md b/src/docs/zh-TW/stream.md
new file mode 100644
index 0000000000..67171ec1fb
--- /dev/null
+++ b/src/docs/zh-TW/stream.md
@@ -0,0 +1,354 @@
+# 串流媒體API
+
+ストリーミングAPIを使うと、リアルタイムで様々な情報(例えばタイムラインに新しい投稿が流れてきた、メッセージが届いた、フォローされた、など)を受け取ったり、様々な操作を行ったりすることができます。
+
+## ストリームに接続する
+
+ストリーミングAPIを利用するには、まずMisskeyサーバーに**websocket**接続する必要があります。
+
+以下のURLに、`i`というパラメータ名で認証情報を含めて、websocket接続してください。例:
+```
+%WS_URL%/streaming?i=xxxxxxxxxxxxxxx
+```
+
+認証情報は、自分のAPIキーや、アプリケーションからストリームに接続する際はユーザーのアクセストークンのことを指します。
+
+<div class="ui info">
+ <p><i class="fas fa-info-circle"></i> 認証情報の取得については、<a href="./api">こちらのドキュメント</a>をご確認ください。</p>
+</div>
+
+---
+
+認証情報は省略することもできますが、その場合非ログインでの利用ということになり、受信できる情報や可能な操作は限られます。例:
+
+```
+%WS_URL%/streaming
+```
+
+---
+
+ストリームに接続すると、後述するAPI操作や、投稿の購読を行ったりすることができます。 しかしまだこの段階では、例えばタイムラインへの新しい投稿を受信したりすることはできません。 それを行うには、ストリーム上で、後述する**チャンネル**に接続する必要があります。
+
+**ストリームでのやり取りはすべてJSONです。**
+
+## 頻道
+MisskeyのストリーミングAPIにはチャンネルという概念があります。これは、送受信する情報を分離するための仕組みです。 Misskeyのストリームに接続しただけでは、まだリアルタイムでタイムラインの投稿を受信したりはできません。 ストリーム上でチャンネルに接続することで、様々な情報を受け取ったり情報を送信したりすることができるようになります。
+
+### チャンネルに接続する
+チャンネルに接続するには、次のようなデータをJSONでストリームに送信します:
+
+```json
+{
+ type: 'connect',
+ body: {
+ channel: 'xxxxxxxx',
+ id: 'foobar',
+ params: {
+ ...
+ }
+ }
+}
+```
+
+ここで、
+* `channel`には接続したいチャンネル名を設定します。チャンネルの種類については後述します。
+* `id`にはそのチャンネルとやり取りするための任意のIDを設定します。ストリームでは様々なメッセージが流れるので、そのメッセージがどのチャンネルからのものなのか識別する必要があるからです。このIDは、UUIDや、乱数のようなもので構いません。
+* `params`はチャンネルに接続する際のパラメータです。チャンネルによって接続時に必要とされるパラメータは異なります。パラメータ不要のチャンネルに接続する際は、このプロパティは省略可能です。
+
+<div class="ui info">
+ <p><i class="fas fa-info-circle"></i> IDはチャンネルごとではなく「チャンネルの接続ごと」です。なぜなら、同じチャンネルに異なるパラメータで複数接続するケースもあるからです。</p>
+</div>
+
+### チャンネルからのメッセージを受け取る
+例えばタイムラインのチャンネルなら、新しい投稿があった時にメッセージを発します。そのメッセージを受け取ることで、タイムラインに新しい投稿がされたことをリアルタイムで知ることができます。
+
+チャンネルがメッセージを発すると、次のようなデータがJSONでストリームに流れてきます:
+```json
+{
+ type: 'channel',
+ body: {
+ id: 'foobar',
+ type: 'something',
+ body: {
+ some: 'thing'
+ }
+ }
+}
+```
+
+ここで、
+* `id`には前述したそのチャンネルに接続する際に設定したIDが設定されています。これで、このメッセージがどのチャンネルからのものなのか知ることができます。
+* `type`にはメッセージの種類が設定されます。チャンネルによって、どのような種類のメッセージが流れてくるかは異なります。
+* `body`にはメッセージの内容が設定されます。チャンネルによって、どのような内容のメッセージが流れてくるかは異なります。
+
+### チャンネルに向けてメッセージを送信する
+チャンネルによっては、メッセージを受け取るだけでなく、こちらから何かメッセージを送信し、何らかの操作を行える場合があります。
+
+チャンネルにメッセージを送信するには、次のようなデータをJSONでストリームに送信します:
+```json
+{
+ type: 'channel',
+ body: {
+ id: 'foobar',
+ type: 'something',
+ body: {
+ some: 'thing'
+ }
+ }
+}
+```
+
+ここで、
+* `id`には前述したそのチャンネルに接続する際に設定したIDを設定します。これで、このメッセージがどのチャンネルに向けたものなのか識別させることができます。
+* `type`にはメッセージの種類を設定します。チャンネルによって、どのような種類のメッセージを受け付けるかは異なります。
+* `body`にはメッセージの内容を設定します。チャンネルによって、どのような内容のメッセージを受け付けるかは異なります。
+
+### チャンネルから切断する
+チャンネルから切断するには、次のようなデータをJSONでストリームに送信します:
+
+```json
+{
+ type: 'disconnect',
+ body: {
+ id: 'foobar'
+ }
+}
+```
+
+ここで、
+* `id`には前述したそのチャンネルに接続する際に設定したIDを設定します。
+
+## ストリームを経由してAPIリクエストする
+
+ストリームを経由してAPIリクエストすると、HTTPリクエストを発生させずにAPIを利用できます。そのため、コードを簡潔にできたり、パフォーマンスの向上を見込めるかもしれません。
+
+ストリームを経由してAPIリクエストするには、次のようなデータをJSONでストリームに送信します:
+```json
+{
+ type: 'api',
+ body: {
+ id: 'xxxxxxxxxxxxxxxx',
+ endpoint: 'notes/create',
+ data: {
+ text: 'yee haw!'
+ }
+ }
+}
+```
+
+ここで、
+* `id`には、APIのレスポンスを識別するための、APIリクエストごとの一意なIDを設定する必要があります。UUIDや、簡単な乱数のようなもので構いません。
+* `endpoint`には、あなたがリクエストしたいAPIのエンドポイントを指定します。
+* `data`には、エンドポイントのパラメータを含めます。
+
+<div class="ui info">
+ <p><i class="fas fa-info-circle"></i> APIのエンドポイントやパラメータについてはAPIリファレンスをご確認ください。</p>
+</div>
+
+### レスポンスの受信
+
+APIへリクエストすると、レスポンスがストリームから次のような形式で流れてきます。
+
+```json
+{
+ type: 'api:xxxxxxxxxxxxxxxx',
+ body: {
+ ...
+ }
+}
+```
+
+ここで、
+* `xxxxxxxxxxxxxxxx`の部分には、リクエストの際に設定された`id`が含まれています。これにより、どのリクエストに対するレスポンスなのか判別することができます。
+* `body`には、レスポンスが含まれています。
+
+## 投稿のキャプチャ
+
+Misskeyは投稿のキャプチャと呼ばれる仕組みを提供しています。これは、指定した投稿のイベントをストリームで受け取る機能です。
+
+例えばタイムラインを取得してユーザーに表示したとします。ここで誰かがそのタイムラインに含まれるどれかの投稿に対してリアクションしたとします。
+
+しかし、クライアントからするとある投稿にリアクションが付いたことなどは知る由がないため、リアルタイムでリアクションをタイムライン上の投稿に反映して表示するといったことができません。
+
+この問題を解決するために、Misskeyは投稿のキャプチャ機構を用意しています。投稿をキャプチャすると、その投稿に関するイベントを受け取ることができるため、リアルタイムでリアクションを反映させたりすることが可能になります。
+
+### 投稿をキャプチャする
+
+投稿をキャプチャするには、ストリームに次のようなメッセージを送信します:
+
+```json
+{
+ type: 'subNote',
+ body: {
+ id: 'xxxxxxxxxxxxxxxx'
+ }
+}
+```
+
+ここで、
+* `id`にキャプチャしたい投稿の`id`を設定します。
+
+このメッセージを送信すると、Misskeyにキャプチャを要請したことになり、以後、その投稿に関するイベントが流れてくるようになります。
+
+例えば投稿にリアクションが付いたとすると、次のようなメッセージが流れてきます:
+
+```json
+{
+ type: 'noteUpdated',
+ body: {
+ id: 'xxxxxxxxxxxxxxxx',
+ type: 'reacted',
+ body: {
+ reaction: 'like',
+ userId: 'yyyyyyyyyyyyyyyy'
+ }
+ }
+}
+```
+
+ここで、
+* `body`内の`id`に、イベントを発生させた投稿のIDが設定されます。
+* `body`内の`type`に、イベントの種類が設定されます。
+* `body`内の`body`に、イベントの詳細が設定されます。
+
+#### イベントの種類
+
+##### `reacted`
+その投稿にリアクションがされた時に発生します。
+
+* `reaction`に、リアクションの種類が設定されます。
+* `userId`に、リアクションを行ったユーザーのIDが設定されます。
+
+例:
+```json
+{
+ type: 'noteUpdated',
+ body: {
+ id: 'xxxxxxxxxxxxxxxx',
+ type: 'reacted',
+ body: {
+ reaction: 'like',
+ userId: 'yyyyyyyyyyyyyyyy'
+ }
+ }
+}
+```
+
+##### `deleted`
+その投稿が削除された時に発生します。
+
+* `deletedAt`に、削除日時が設定されます。
+
+例:
+```json
+{
+ type: 'noteUpdated',
+ body: {
+ id: 'xxxxxxxxxxxxxxxx',
+ type: 'deleted',
+ body: {
+ deletedAt: '2018-10-22T02:17:09.703Z'
+ }
+ }
+}
+```
+
+##### `pollVoted`
+その投稿に添付されたアンケートに投票された時に発生します。
+
+* `choice`に、選択肢IDが設定されます。
+* `userId`に、投票を行ったユーザーのIDが設定されます。
+
+例:
+```json
+{
+ type: 'noteUpdated',
+ body: {
+ id: 'xxxxxxxxxxxxxxxx',
+ type: 'pollVoted',
+ body: {
+ choice: 2,
+ userId: 'yyyyyyyyyyyyyyyy'
+ }
+ }
+}
+```
+
+### 投稿のキャプチャを解除する
+
+その投稿がもう画面に表示されなくなったりして、その投稿に関するイベントをもう受け取る必要がなくなったときは、キャプチャの解除を申請してください。
+
+次のメッセージを送信します:
+
+```json
+{
+ type: 'unsubNote',
+ body: {
+ id: 'xxxxxxxxxxxxxxxx'
+ }
+}
+```
+
+ここで、
+* `id`にキャプチャを解除したい投稿の`id`を設定します。
+
+このメッセージを送信すると、以後、その投稿に関するイベントは流れてこないようになります。
+
+# チャンネル一覧
+## `main`
+アカウントに関する基本的な情報が流れてきます。このチャンネルにパラメータはありません。
+
+### 流れてくるイベント一覧
+
+#### `renote`
+自分の投稿がRenoteされた時に発生するイベントです。自分自身の投稿をRenoteしたときは発生しません。
+
+#### `mention`
+誰かからメンションされたときに発生するイベントです。
+
+#### `readAllNotifications`
+自分宛ての通知がすべて既読になったことを表すイベントです。このイベントを利用して、「通知があることを示すアイコン」のようなものをオフにしたりする等のケースが想定されます。
+
+#### `meUpdated`
+自分の情報が更新されたことを表すイベントです。
+
+#### `follow`
+自分が誰かをフォローしたときに発生するイベントです。
+
+#### `unfollow`
+自分が誰かのフォローを解除したときに発生するイベントです。
+
+#### `followed`
+自分が誰かにフォローされたときに発生するイベントです。
+
+## `homeTimeline`
+ホームタイムラインの投稿情報が流れてきます。このチャンネルにパラメータはありません。
+
+### 流れてくるイベント一覧
+
+#### `note`
+タイムラインに新しい投稿が流れてきたときに発生するイベントです。
+
+## `localTimeline`
+ローカルタイムラインの投稿情報が流れてきます。このチャンネルにパラメータはありません。
+
+### 流れてくるイベント一覧
+
+#### `note`
+ローカルタイムラインに新しい投稿が流れてきたときに発生するイベントです。
+
+## `hybridTimeline`
+ソーシャルタイムラインの投稿情報が流れてきます。このチャンネルにパラメータはありません。
+
+### 流れてくるイベント一覧
+
+#### `note`
+ソーシャルタイムラインに新しい投稿が流れてきたときに発生するイベントです。
+
+## `globalTimeline`
+グローバルタイムラインの投稿情報が流れてきます。このチャンネルにパラメータはありません。
+
+### 流れてくるイベント一覧
+
+#### `note`
+グローバルタイムラインに新しい投稿が流れてきたときに発生するイベントです。
diff --git a/src/docs/zh-TW/theme.md b/src/docs/zh-TW/theme.md
new file mode 100644
index 0000000000..b6be9154a4
--- /dev/null
+++ b/src/docs/zh-TW/theme.md
@@ -0,0 +1,68 @@
+# 外觀主題
+
+テーマを設定して、Misskeyクライアントの見た目を変更できます。
+
+## テーマの設定
+設定 > テーマ
+
+## テーマを作成する
+テーマコードはJSON5で記述されたテーマオブジェクトです。 テーマは以下のようなオブジェクトです。
+``` js
+{
+ id: '17587283-dd92-4a2c-a22c-be0637c9e22a',
+
+ name: 'Danboard',
+ author: 'syuilo',
+
+ base: 'light',
+
+ props: {
+ accent: 'rgb(218, 141, 49)',
+ bg: 'rgb(218, 212, 190)',
+ fg: 'rgb(115, 108, 92)',
+ panel: 'rgb(236, 232, 220)',
+ renote: 'rgb(100, 152, 106)',
+ link: 'rgb(100, 152, 106)',
+ mention: '@accent',
+ hashtag: 'rgb(100, 152, 106)',
+ header: 'rgba(239, 227, 213, 0.75)',
+ navBg: 'rgb(216, 206, 182)',
+ inputBorder: 'rgba(0, 0, 0, 0.1)',
+ },
+}
+
+```
+
+* `id` ... テーマの一意なID。UUIDをおすすめします。
+* `name` ... テーマ名
+* `author` ... テーマの作者
+* `desc` ... テーマの説明(オプション)
+* `base` ... 明るいテーマか、暗いテーマか
+ * `light`にすると明るいテーマになり、`dark`にすると暗いテーマになります。
+ * テーマはここで設定されたベーステーマを継承します。
+* `props` ... テーマのスタイル定義。これから説明します。
+
+### テーマのスタイル定義
+`props`下にはテーマのスタイルを定義します。 キーがCSSの変数名になり、バリューで中身を指定します。 なお、この`props`オブジェクトはベーステーマから継承されます。 ベーステーマは、このテーマの`base`が`light`なら[_light.json5](https://github.com/syuilo/misskey/blob/develop/src/client/themes/_light.json5)で、`dark`なら[_dark.json5](https://github.com/syuilo/misskey/blob/develop/src/client/themes/_dark.json5)です。 つまり、このテーマ内の`props`に`panel`というキーが無くても、そこにはベーステーマの`panel`があると見なされます。
+
+#### バリューで使える構文
+* 16進数で表された色
+ * 例: `#00ff00`
+* `rgb(r, g, b)`形式で表された色
+ * 例: `rgb(0, 255, 0)`
+* `rgb(r, g, b, a)`形式で表された透明度を含む色
+ * 例: `rgba(0, 255, 0, 0.5)`
+* 他のキーの値の参照
+ * `@{キー名}`と書くと他のキーの値の参照になります。`{キー名}`は参照したいキーの名前に置き換えます。
+ * 例: `@panel`
+* 定数(後述)の参照
+ * `${定数名}`と書くと定数の参照になります。`{定数名}`は参照したい定数の名前に置き換えます。
+ * 例: `$main`
+* 関数(後述)
+ * `:{関数名}<{引数}<{色}`
+
+#### 常數
+「CSS変数として出力はしたくないが、他のCSS変数の値として使いまわしたい」値があるときは、定数を使うと便利です。 キー名を`$`で始めると、そのキーはCSS変数として出力されません。
+
+#### 函数
+wip
diff --git a/src/docs/zh-TW/timelines.md b/src/docs/zh-TW/timelines.md
new file mode 100644
index 0000000000..892bfa2015
--- /dev/null
+++ b/src/docs/zh-TW/timelines.md
@@ -0,0 +1,15 @@
+# 不同時間軸之間的分別
+
+https://docs.google.com/spreadsheets/d/1lxQ2ugKrhz58Bg96HTDK_2F98BUritkMyIiBkOByjHA/edit?usp=sharing
+
+## 首頁
+自分のフォローしているユーザーの投稿
+
+## 本地
+全てのローカルユーザーの「ホーム」指定されていない投稿
+
+## 社群
+自分のフォローしているユーザーの投稿と、全てのローカルユーザーの「ホーム」指定されていない投稿
+
+## 全域
+全てのローカルユーザーの「ホーム」指定されていない投稿と、サーバーに届いた全てのリモートユーザーの「ホーム」指定されていない投稿