From 498f6e9be2728e961b842053e0c9191ca40274b2 Mon Sep 17 00:00:00 2001 From: syuilo Date: Mon, 28 Dec 2020 21:45:08 +0900 Subject: [PATCH] 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) --- locales/de-DE.yml | 13 +- locales/en-US.yml | 11 + locales/es-ES.yml | 47 ++++ locales/fr-FR.yml | 1 + locales/ja-KS.yml | 45 ++++ locales/ko-KR.yml | 1 + locales/ru-RU.yml | 16 ++ locales/uk-UA.yml | 133 +++++++++- locales/zh-CN.yml | 27 +- locales/zh-TW.yml | 90 +++++-- src/docs/ar-SA/aiscript.md | 4 + src/docs/ar-SA/api.md | 58 +++++ src/docs/ar-SA/create-plugin.md | 74 ++++++ src/docs/ar-SA/custom-emoji.md | 2 + src/docs/ar-SA/deck.md | 18 ++ src/docs/ar-SA/follow.md | 2 + src/docs/ar-SA/keyboard-shortcut.md | 68 +++++ src/docs/ar-SA/mfm.md | 2 + src/docs/ar-SA/mute.md | 13 + src/docs/ar-SA/pages.md | 10 + src/docs/ar-SA/reaction.md | 11 + src/docs/ar-SA/reversi-bot.md | 160 ++++++++++++ src/docs/ar-SA/stream.md | 354 ++++++++++++++++++++++++++ src/docs/ar-SA/theme.md | 68 +++++ src/docs/ar-SA/timelines.md | 15 ++ src/docs/cs-CZ/aiscript.md | 4 + src/docs/cs-CZ/api.md | 58 +++++ src/docs/cs-CZ/create-plugin.md | 74 ++++++ src/docs/cs-CZ/custom-emoji.md | 2 + src/docs/cs-CZ/deck.md | 18 ++ src/docs/cs-CZ/follow.md | 2 + src/docs/cs-CZ/keyboard-shortcut.md | 68 +++++ src/docs/cs-CZ/mfm.md | 2 + src/docs/cs-CZ/mute.md | 13 + src/docs/cs-CZ/pages.md | 10 + src/docs/cs-CZ/reaction.md | 11 + src/docs/cs-CZ/reversi-bot.md | 160 ++++++++++++ src/docs/cs-CZ/stream.md | 354 ++++++++++++++++++++++++++ src/docs/cs-CZ/theme.md | 68 +++++ src/docs/cs-CZ/timelines.md | 15 ++ src/docs/da-DK/aiscript.md | 4 + src/docs/da-DK/api.md | 58 +++++ src/docs/da-DK/create-plugin.md | 74 ++++++ src/docs/da-DK/custom-emoji.md | 2 + src/docs/da-DK/deck.md | 18 ++ src/docs/da-DK/follow.md | 2 + src/docs/da-DK/keyboard-shortcut.md | 68 +++++ src/docs/da-DK/mfm.md | 2 + src/docs/da-DK/mute.md | 13 + src/docs/da-DK/pages.md | 10 + src/docs/da-DK/reaction.md | 11 + src/docs/da-DK/reversi-bot.md | 160 ++++++++++++ src/docs/da-DK/stream.md | 354 ++++++++++++++++++++++++++ src/docs/da-DK/theme.md | 68 +++++ src/docs/da-DK/timelines.md | 15 ++ src/docs/de-DE/aiscript.md | 4 + src/docs/de-DE/api.md | 58 +++++ src/docs/de-DE/create-plugin.md | 74 ++++++ src/docs/de-DE/custom-emoji.md | 2 + src/docs/de-DE/deck.md | 18 ++ src/docs/de-DE/follow.md | 2 + src/docs/de-DE/keyboard-shortcut.md | 68 +++++ src/docs/de-DE/mfm.md | 2 + src/docs/de-DE/mute.md | 13 + src/docs/de-DE/pages.md | 10 + src/docs/de-DE/reaction.md | 11 + src/docs/de-DE/reversi-bot.md | 160 ++++++++++++ src/docs/de-DE/stream.md | 354 ++++++++++++++++++++++++++ src/docs/de-DE/theme.md | 68 +++++ src/docs/de-DE/timelines.md | 15 ++ src/docs/en-US/aiscript.md | 4 + src/docs/en-US/api.md | 58 +++++ src/docs/en-US/create-plugin.md | 74 ++++++ src/docs/en-US/custom-emoji.md | 2 + src/docs/en-US/deck.md | 18 ++ src/docs/en-US/follow.md | 2 + src/docs/en-US/keyboard-shortcut.md | 68 +++++ src/docs/en-US/mfm.md | 2 + src/docs/en-US/mute.md | 13 + src/docs/en-US/pages.md | 10 + src/docs/en-US/reaction.md | 11 + src/docs/en-US/reversi-bot.md | 160 ++++++++++++ src/docs/en-US/stream.md | 354 ++++++++++++++++++++++++++ src/docs/en-US/theme.md | 68 +++++ src/docs/en-US/timelines.md | 15 ++ src/docs/es-ES/aiscript.md | 4 + src/docs/es-ES/api.md | 58 +++++ src/docs/es-ES/create-plugin.md | 74 ++++++ src/docs/es-ES/custom-emoji.md | 2 + src/docs/es-ES/deck.md | 18 ++ src/docs/es-ES/follow.md | 2 + src/docs/es-ES/keyboard-shortcut.md | 68 +++++ src/docs/es-ES/mfm.md | 2 + src/docs/es-ES/mute.md | 13 + src/docs/es-ES/pages.md | 10 + src/docs/es-ES/reaction.md | 11 + src/docs/es-ES/reversi-bot.md | 160 ++++++++++++ src/docs/es-ES/stream.md | 354 ++++++++++++++++++++++++++ src/docs/es-ES/theme.md | 68 +++++ src/docs/es-ES/timelines.md | 15 ++ src/docs/fr-FR/aiscript.md | 4 + src/docs/fr-FR/api.md | 58 +++++ src/docs/fr-FR/create-plugin.md | 74 ++++++ src/docs/fr-FR/custom-emoji.md | 2 + src/docs/fr-FR/deck.md | 18 ++ src/docs/fr-FR/follow.md | 2 + src/docs/fr-FR/keyboard-shortcut.md | 68 +++++ src/docs/fr-FR/mfm.md | 2 + src/docs/fr-FR/mute.md | 13 + src/docs/fr-FR/pages.md | 10 + src/docs/fr-FR/reaction.md | 11 + src/docs/fr-FR/reversi-bot.md | 160 ++++++++++++ src/docs/fr-FR/stream.md | 354 ++++++++++++++++++++++++++ src/docs/fr-FR/theme.md | 68 +++++ src/docs/fr-FR/timelines.md | 15 ++ src/docs/ja-KS/aiscript.md | 4 + src/docs/ja-KS/api.md | 58 +++++ src/docs/ja-KS/create-plugin.md | 74 ++++++ src/docs/ja-KS/custom-emoji.md | 2 + src/docs/ja-KS/deck.md | 18 ++ src/docs/ja-KS/follow.md | 2 + src/docs/ja-KS/keyboard-shortcut.md | 68 +++++ src/docs/ja-KS/mfm.md | 2 + src/docs/ja-KS/mute.md | 13 + src/docs/ja-KS/pages.md | 10 + src/docs/ja-KS/reaction.md | 11 + src/docs/ja-KS/reversi-bot.md | 160 ++++++++++++ src/docs/ja-KS/stream.md | 354 ++++++++++++++++++++++++++ src/docs/ja-KS/theme.md | 68 +++++ src/docs/ja-KS/timelines.md | 15 ++ src/docs/kab-KAB/aiscript.md | 4 + src/docs/kab-KAB/api.md | 58 +++++ src/docs/kab-KAB/create-plugin.md | 74 ++++++ src/docs/kab-KAB/custom-emoji.md | 2 + src/docs/kab-KAB/deck.md | 18 ++ src/docs/kab-KAB/follow.md | 2 + src/docs/kab-KAB/keyboard-shortcut.md | 68 +++++ src/docs/kab-KAB/mfm.md | 2 + src/docs/kab-KAB/mute.md | 13 + src/docs/kab-KAB/pages.md | 10 + src/docs/kab-KAB/reaction.md | 11 + src/docs/kab-KAB/reversi-bot.md | 160 ++++++++++++ src/docs/kab-KAB/stream.md | 354 ++++++++++++++++++++++++++ src/docs/kab-KAB/theme.md | 68 +++++ src/docs/kab-KAB/timelines.md | 15 ++ src/docs/kn-IN/aiscript.md | 4 + src/docs/kn-IN/api.md | 58 +++++ src/docs/kn-IN/create-plugin.md | 74 ++++++ src/docs/kn-IN/custom-emoji.md | 2 + src/docs/kn-IN/deck.md | 18 ++ src/docs/kn-IN/follow.md | 2 + src/docs/kn-IN/keyboard-shortcut.md | 68 +++++ src/docs/kn-IN/mfm.md | 2 + src/docs/kn-IN/mute.md | 13 + src/docs/kn-IN/pages.md | 10 + src/docs/kn-IN/reaction.md | 11 + src/docs/kn-IN/reversi-bot.md | 160 ++++++++++++ src/docs/kn-IN/stream.md | 354 ++++++++++++++++++++++++++ src/docs/kn-IN/theme.md | 68 +++++ src/docs/kn-IN/timelines.md | 15 ++ src/docs/ko-KR/aiscript.md | 4 + src/docs/ko-KR/api.md | 58 +++++ src/docs/ko-KR/create-plugin.md | 74 ++++++ src/docs/ko-KR/custom-emoji.md | 2 + src/docs/ko-KR/deck.md | 18 ++ src/docs/ko-KR/follow.md | 2 + src/docs/ko-KR/keyboard-shortcut.md | 68 +++++ src/docs/ko-KR/mfm.md | 2 + src/docs/ko-KR/mute.md | 13 + src/docs/ko-KR/pages.md | 10 + src/docs/ko-KR/reaction.md | 11 + src/docs/ko-KR/reversi-bot.md | 160 ++++++++++++ src/docs/ko-KR/stream.md | 354 ++++++++++++++++++++++++++ src/docs/ko-KR/theme.md | 68 +++++ src/docs/ko-KR/timelines.md | 15 ++ src/docs/nl-NL/aiscript.md | 4 + src/docs/nl-NL/api.md | 58 +++++ src/docs/nl-NL/create-plugin.md | 74 ++++++ src/docs/nl-NL/custom-emoji.md | 2 + src/docs/nl-NL/deck.md | 18 ++ src/docs/nl-NL/follow.md | 2 + src/docs/nl-NL/keyboard-shortcut.md | 68 +++++ src/docs/nl-NL/mfm.md | 2 + src/docs/nl-NL/mute.md | 13 + src/docs/nl-NL/pages.md | 10 + src/docs/nl-NL/reaction.md | 11 + src/docs/nl-NL/reversi-bot.md | 160 ++++++++++++ src/docs/nl-NL/stream.md | 354 ++++++++++++++++++++++++++ src/docs/nl-NL/theme.md | 68 +++++ src/docs/nl-NL/timelines.md | 15 ++ src/docs/no-NO/aiscript.md | 4 + src/docs/no-NO/api.md | 58 +++++ src/docs/no-NO/create-plugin.md | 74 ++++++ src/docs/no-NO/custom-emoji.md | 2 + src/docs/no-NO/deck.md | 18 ++ src/docs/no-NO/follow.md | 2 + src/docs/no-NO/keyboard-shortcut.md | 68 +++++ src/docs/no-NO/mfm.md | 2 + src/docs/no-NO/mute.md | 13 + src/docs/no-NO/pages.md | 10 + src/docs/no-NO/reaction.md | 11 + src/docs/no-NO/reversi-bot.md | 160 ++++++++++++ src/docs/no-NO/stream.md | 354 ++++++++++++++++++++++++++ src/docs/no-NO/theme.md | 68 +++++ src/docs/no-NO/timelines.md | 15 ++ src/docs/pl-PL/aiscript.md | 4 + src/docs/pl-PL/api.md | 58 +++++ src/docs/pl-PL/create-plugin.md | 74 ++++++ src/docs/pl-PL/custom-emoji.md | 2 + src/docs/pl-PL/deck.md | 18 ++ src/docs/pl-PL/follow.md | 2 + src/docs/pl-PL/keyboard-shortcut.md | 68 +++++ src/docs/pl-PL/mfm.md | 2 + src/docs/pl-PL/mute.md | 13 + src/docs/pl-PL/pages.md | 10 + src/docs/pl-PL/reaction.md | 11 + src/docs/pl-PL/reversi-bot.md | 160 ++++++++++++ src/docs/pl-PL/stream.md | 354 ++++++++++++++++++++++++++ src/docs/pl-PL/theme.md | 68 +++++ src/docs/pl-PL/timelines.md | 15 ++ src/docs/pt-PT/aiscript.md | 4 + src/docs/pt-PT/api.md | 58 +++++ src/docs/pt-PT/create-plugin.md | 74 ++++++ src/docs/pt-PT/custom-emoji.md | 2 + src/docs/pt-PT/deck.md | 18 ++ src/docs/pt-PT/follow.md | 2 + src/docs/pt-PT/keyboard-shortcut.md | 68 +++++ src/docs/pt-PT/mfm.md | 2 + src/docs/pt-PT/mute.md | 13 + src/docs/pt-PT/pages.md | 10 + src/docs/pt-PT/reaction.md | 11 + src/docs/pt-PT/reversi-bot.md | 160 ++++++++++++ src/docs/pt-PT/stream.md | 354 ++++++++++++++++++++++++++ src/docs/pt-PT/theme.md | 68 +++++ src/docs/pt-PT/timelines.md | 15 ++ src/docs/ru-RU/aiscript.md | 4 + src/docs/ru-RU/api.md | 58 +++++ src/docs/ru-RU/create-plugin.md | 74 ++++++ src/docs/ru-RU/custom-emoji.md | 2 + src/docs/ru-RU/deck.md | 18 ++ src/docs/ru-RU/follow.md | 2 + src/docs/ru-RU/keyboard-shortcut.md | 68 +++++ src/docs/ru-RU/mfm.md | 2 + src/docs/ru-RU/mute.md | 13 + src/docs/ru-RU/pages.md | 10 + src/docs/ru-RU/reaction.md | 11 + src/docs/ru-RU/reversi-bot.md | 160 ++++++++++++ src/docs/ru-RU/stream.md | 354 ++++++++++++++++++++++++++ src/docs/ru-RU/theme.md | 68 +++++ src/docs/ru-RU/timelines.md | 15 ++ src/docs/ug-CN/aiscript.md | 4 + src/docs/ug-CN/api.md | 58 +++++ src/docs/ug-CN/create-plugin.md | 74 ++++++ src/docs/ug-CN/custom-emoji.md | 2 + src/docs/ug-CN/deck.md | 18 ++ src/docs/ug-CN/follow.md | 2 + src/docs/ug-CN/keyboard-shortcut.md | 68 +++++ src/docs/ug-CN/mfm.md | 2 + src/docs/ug-CN/mute.md | 13 + src/docs/ug-CN/pages.md | 10 + src/docs/ug-CN/reaction.md | 11 + src/docs/ug-CN/reversi-bot.md | 160 ++++++++++++ src/docs/ug-CN/stream.md | 354 ++++++++++++++++++++++++++ src/docs/ug-CN/theme.md | 68 +++++ src/docs/ug-CN/timelines.md | 15 ++ src/docs/uk-UA/aiscript.md | 4 + src/docs/uk-UA/api.md | 58 +++++ src/docs/uk-UA/create-plugin.md | 74 ++++++ src/docs/uk-UA/custom-emoji.md | 2 + src/docs/uk-UA/deck.md | 18 ++ src/docs/uk-UA/follow.md | 2 + src/docs/uk-UA/keyboard-shortcut.md | 68 +++++ src/docs/uk-UA/mfm.md | 2 + src/docs/uk-UA/mute.md | 13 + src/docs/uk-UA/pages.md | 10 + src/docs/uk-UA/reaction.md | 11 + src/docs/uk-UA/reversi-bot.md | 160 ++++++++++++ src/docs/uk-UA/stream.md | 354 ++++++++++++++++++++++++++ src/docs/uk-UA/theme.md | 68 +++++ src/docs/uk-UA/timelines.md | 15 ++ src/docs/zh-CN/aiscript.md | 4 + src/docs/zh-CN/api.md | 58 +++++ src/docs/zh-CN/create-plugin.md | 74 ++++++ src/docs/zh-CN/custom-emoji.md | 2 + src/docs/zh-CN/deck.md | 18 ++ src/docs/zh-CN/follow.md | 2 + src/docs/zh-CN/keyboard-shortcut.md | 68 +++++ src/docs/zh-CN/mfm.md | 2 + src/docs/zh-CN/mute.md | 13 + src/docs/zh-CN/pages.md | 10 + src/docs/zh-CN/reaction.md | 11 + src/docs/zh-CN/reversi-bot.md | 160 ++++++++++++ src/docs/zh-CN/stream.md | 354 ++++++++++++++++++++++++++ src/docs/zh-CN/theme.md | 68 +++++ src/docs/zh-CN/timelines.md | 15 ++ src/docs/zh-TW/aiscript.md | 4 + src/docs/zh-TW/api.md | 58 +++++ src/docs/zh-TW/create-plugin.md | 74 ++++++ src/docs/zh-TW/custom-emoji.md | 2 + src/docs/zh-TW/deck.md | 18 ++ src/docs/zh-TW/follow.md | 2 + src/docs/zh-TW/keyboard-shortcut.md | 68 +++++ src/docs/zh-TW/mfm.md | 2 + src/docs/zh-TW/mute.md | 13 + src/docs/zh-TW/pages.md | 10 + src/docs/zh-TW/reaction.md | 11 + src/docs/zh-TW/reversi-bot.md | 160 ++++++++++++ src/docs/zh-TW/stream.md | 354 ++++++++++++++++++++++++++ src/docs/zh-TW/theme.md | 68 +++++ src/docs/zh-TW/timelines.md | 15 ++ 310 files changed, 17534 insertions(+), 30 deletions(-) create mode 100644 src/docs/ar-SA/aiscript.md create mode 100644 src/docs/ar-SA/api.md create mode 100644 src/docs/ar-SA/create-plugin.md create mode 100644 src/docs/ar-SA/custom-emoji.md create mode 100644 src/docs/ar-SA/deck.md create mode 100644 src/docs/ar-SA/follow.md create mode 100644 src/docs/ar-SA/keyboard-shortcut.md create mode 100644 src/docs/ar-SA/mfm.md create mode 100644 src/docs/ar-SA/mute.md create mode 100644 src/docs/ar-SA/pages.md create mode 100644 src/docs/ar-SA/reaction.md create mode 100644 src/docs/ar-SA/reversi-bot.md create mode 100644 src/docs/ar-SA/stream.md create mode 100644 src/docs/ar-SA/theme.md create mode 100644 src/docs/ar-SA/timelines.md create mode 100644 src/docs/cs-CZ/aiscript.md create mode 100644 src/docs/cs-CZ/api.md create mode 100644 src/docs/cs-CZ/create-plugin.md create mode 100644 src/docs/cs-CZ/custom-emoji.md create mode 100644 src/docs/cs-CZ/deck.md create mode 100644 src/docs/cs-CZ/follow.md create mode 100644 src/docs/cs-CZ/keyboard-shortcut.md create mode 100644 src/docs/cs-CZ/mfm.md create mode 100644 src/docs/cs-CZ/mute.md create mode 100644 src/docs/cs-CZ/pages.md create mode 100644 src/docs/cs-CZ/reaction.md create mode 100644 src/docs/cs-CZ/reversi-bot.md create mode 100644 src/docs/cs-CZ/stream.md create mode 100644 src/docs/cs-CZ/theme.md create mode 100644 src/docs/cs-CZ/timelines.md create mode 100644 src/docs/da-DK/aiscript.md create mode 100644 src/docs/da-DK/api.md create mode 100644 src/docs/da-DK/create-plugin.md create mode 100644 src/docs/da-DK/custom-emoji.md create mode 100644 src/docs/da-DK/deck.md create mode 100644 src/docs/da-DK/follow.md create mode 100644 src/docs/da-DK/keyboard-shortcut.md create mode 100644 src/docs/da-DK/mfm.md create mode 100644 src/docs/da-DK/mute.md create mode 100644 src/docs/da-DK/pages.md create mode 100644 src/docs/da-DK/reaction.md create mode 100644 src/docs/da-DK/reversi-bot.md create mode 100644 src/docs/da-DK/stream.md create mode 100644 src/docs/da-DK/theme.md create mode 100644 src/docs/da-DK/timelines.md create mode 100644 src/docs/de-DE/aiscript.md create mode 100644 src/docs/de-DE/api.md create mode 100644 src/docs/de-DE/create-plugin.md create mode 100644 src/docs/de-DE/custom-emoji.md create mode 100644 src/docs/de-DE/deck.md create mode 100644 src/docs/de-DE/follow.md create mode 100644 src/docs/de-DE/keyboard-shortcut.md create mode 100644 src/docs/de-DE/mfm.md create mode 100644 src/docs/de-DE/mute.md create mode 100644 src/docs/de-DE/pages.md create mode 100644 src/docs/de-DE/reaction.md create mode 100644 src/docs/de-DE/reversi-bot.md create mode 100644 src/docs/de-DE/stream.md create mode 100644 src/docs/de-DE/theme.md create mode 100644 src/docs/de-DE/timelines.md create mode 100644 src/docs/en-US/aiscript.md create mode 100644 src/docs/en-US/api.md create mode 100644 src/docs/en-US/create-plugin.md create mode 100644 src/docs/en-US/custom-emoji.md create mode 100644 src/docs/en-US/deck.md create mode 100644 src/docs/en-US/follow.md create mode 100644 src/docs/en-US/keyboard-shortcut.md create mode 100644 src/docs/en-US/mfm.md create mode 100644 src/docs/en-US/mute.md create mode 100644 src/docs/en-US/pages.md create mode 100644 src/docs/en-US/reaction.md create mode 100644 src/docs/en-US/reversi-bot.md create mode 100644 src/docs/en-US/stream.md create mode 100644 src/docs/en-US/theme.md create mode 100644 src/docs/en-US/timelines.md create mode 100644 src/docs/es-ES/aiscript.md create mode 100644 src/docs/es-ES/api.md create mode 100644 src/docs/es-ES/create-plugin.md create mode 100644 src/docs/es-ES/custom-emoji.md create mode 100644 src/docs/es-ES/deck.md create mode 100644 src/docs/es-ES/follow.md create mode 100644 src/docs/es-ES/keyboard-shortcut.md create mode 100644 src/docs/es-ES/mfm.md create mode 100644 src/docs/es-ES/mute.md create mode 100644 src/docs/es-ES/pages.md create mode 100644 src/docs/es-ES/reaction.md create mode 100644 src/docs/es-ES/reversi-bot.md create mode 100644 src/docs/es-ES/stream.md create mode 100644 src/docs/es-ES/theme.md create mode 100644 src/docs/es-ES/timelines.md create mode 100644 src/docs/fr-FR/aiscript.md create mode 100644 src/docs/fr-FR/api.md create mode 100644 src/docs/fr-FR/create-plugin.md create mode 100644 src/docs/fr-FR/custom-emoji.md create mode 100644 src/docs/fr-FR/deck.md create mode 100644 src/docs/fr-FR/follow.md create mode 100644 src/docs/fr-FR/keyboard-shortcut.md create mode 100644 src/docs/fr-FR/mfm.md create mode 100644 src/docs/fr-FR/mute.md create mode 100644 src/docs/fr-FR/pages.md create mode 100644 src/docs/fr-FR/reaction.md create mode 100644 src/docs/fr-FR/reversi-bot.md create mode 100644 src/docs/fr-FR/stream.md create mode 100644 src/docs/fr-FR/theme.md create mode 100644 src/docs/fr-FR/timelines.md create mode 100644 src/docs/ja-KS/aiscript.md create mode 100644 src/docs/ja-KS/api.md create mode 100644 src/docs/ja-KS/create-plugin.md create mode 100644 src/docs/ja-KS/custom-emoji.md create mode 100644 src/docs/ja-KS/deck.md create mode 100644 src/docs/ja-KS/follow.md create mode 100644 src/docs/ja-KS/keyboard-shortcut.md create mode 100644 src/docs/ja-KS/mfm.md create mode 100644 src/docs/ja-KS/mute.md create mode 100644 src/docs/ja-KS/pages.md create mode 100644 src/docs/ja-KS/reaction.md create mode 100644 src/docs/ja-KS/reversi-bot.md create mode 100644 src/docs/ja-KS/stream.md create mode 100644 src/docs/ja-KS/theme.md create mode 100644 src/docs/ja-KS/timelines.md create mode 100644 src/docs/kab-KAB/aiscript.md create mode 100644 src/docs/kab-KAB/api.md create mode 100644 src/docs/kab-KAB/create-plugin.md create mode 100644 src/docs/kab-KAB/custom-emoji.md create mode 100644 src/docs/kab-KAB/deck.md create mode 100644 src/docs/kab-KAB/follow.md create mode 100644 src/docs/kab-KAB/keyboard-shortcut.md create mode 100644 src/docs/kab-KAB/mfm.md create mode 100644 src/docs/kab-KAB/mute.md create mode 100644 src/docs/kab-KAB/pages.md create mode 100644 src/docs/kab-KAB/reaction.md create mode 100644 src/docs/kab-KAB/reversi-bot.md create mode 100644 src/docs/kab-KAB/stream.md create mode 100644 src/docs/kab-KAB/theme.md create mode 100644 src/docs/kab-KAB/timelines.md create mode 100644 src/docs/kn-IN/aiscript.md create mode 100644 src/docs/kn-IN/api.md create mode 100644 src/docs/kn-IN/create-plugin.md create mode 100644 src/docs/kn-IN/custom-emoji.md create mode 100644 src/docs/kn-IN/deck.md create mode 100644 src/docs/kn-IN/follow.md create mode 100644 src/docs/kn-IN/keyboard-shortcut.md create mode 100644 src/docs/kn-IN/mfm.md create mode 100644 src/docs/kn-IN/mute.md create mode 100644 src/docs/kn-IN/pages.md create mode 100644 src/docs/kn-IN/reaction.md create mode 100644 src/docs/kn-IN/reversi-bot.md create mode 100644 src/docs/kn-IN/stream.md create mode 100644 src/docs/kn-IN/theme.md create mode 100644 src/docs/kn-IN/timelines.md create mode 100644 src/docs/ko-KR/aiscript.md create mode 100644 src/docs/ko-KR/api.md create mode 100644 src/docs/ko-KR/create-plugin.md create mode 100644 src/docs/ko-KR/custom-emoji.md create mode 100644 src/docs/ko-KR/deck.md create mode 100644 src/docs/ko-KR/follow.md create mode 100644 src/docs/ko-KR/keyboard-shortcut.md create mode 100644 src/docs/ko-KR/mfm.md create mode 100644 src/docs/ko-KR/mute.md create mode 100644 src/docs/ko-KR/pages.md create mode 100644 src/docs/ko-KR/reaction.md create mode 100644 src/docs/ko-KR/reversi-bot.md create mode 100644 src/docs/ko-KR/stream.md create mode 100644 src/docs/ko-KR/theme.md create mode 100644 src/docs/ko-KR/timelines.md create mode 100644 src/docs/nl-NL/aiscript.md create mode 100644 src/docs/nl-NL/api.md create mode 100644 src/docs/nl-NL/create-plugin.md create mode 100644 src/docs/nl-NL/custom-emoji.md create mode 100644 src/docs/nl-NL/deck.md create mode 100644 src/docs/nl-NL/follow.md create mode 100644 src/docs/nl-NL/keyboard-shortcut.md create mode 100644 src/docs/nl-NL/mfm.md create mode 100644 src/docs/nl-NL/mute.md create mode 100644 src/docs/nl-NL/pages.md create mode 100644 src/docs/nl-NL/reaction.md create mode 100644 src/docs/nl-NL/reversi-bot.md create mode 100644 src/docs/nl-NL/stream.md create mode 100644 src/docs/nl-NL/theme.md create mode 100644 src/docs/nl-NL/timelines.md create mode 100644 src/docs/no-NO/aiscript.md create mode 100644 src/docs/no-NO/api.md create mode 100644 src/docs/no-NO/create-plugin.md create mode 100644 src/docs/no-NO/custom-emoji.md create mode 100644 src/docs/no-NO/deck.md create mode 100644 src/docs/no-NO/follow.md create mode 100644 src/docs/no-NO/keyboard-shortcut.md create mode 100644 src/docs/no-NO/mfm.md create mode 100644 src/docs/no-NO/mute.md create mode 100644 src/docs/no-NO/pages.md create mode 100644 src/docs/no-NO/reaction.md create mode 100644 src/docs/no-NO/reversi-bot.md create mode 100644 src/docs/no-NO/stream.md create mode 100644 src/docs/no-NO/theme.md create mode 100644 src/docs/no-NO/timelines.md create mode 100644 src/docs/pl-PL/aiscript.md create mode 100644 src/docs/pl-PL/api.md create mode 100644 src/docs/pl-PL/create-plugin.md create mode 100644 src/docs/pl-PL/custom-emoji.md create mode 100644 src/docs/pl-PL/deck.md create mode 100644 src/docs/pl-PL/follow.md create mode 100644 src/docs/pl-PL/keyboard-shortcut.md create mode 100644 src/docs/pl-PL/mfm.md create mode 100644 src/docs/pl-PL/mute.md create mode 100644 src/docs/pl-PL/pages.md create mode 100644 src/docs/pl-PL/reaction.md create mode 100644 src/docs/pl-PL/reversi-bot.md create mode 100644 src/docs/pl-PL/stream.md create mode 100644 src/docs/pl-PL/theme.md create mode 100644 src/docs/pl-PL/timelines.md create mode 100644 src/docs/pt-PT/aiscript.md create mode 100644 src/docs/pt-PT/api.md create mode 100644 src/docs/pt-PT/create-plugin.md create mode 100644 src/docs/pt-PT/custom-emoji.md create mode 100644 src/docs/pt-PT/deck.md create mode 100644 src/docs/pt-PT/follow.md create mode 100644 src/docs/pt-PT/keyboard-shortcut.md create mode 100644 src/docs/pt-PT/mfm.md create mode 100644 src/docs/pt-PT/mute.md create mode 100644 src/docs/pt-PT/pages.md create mode 100644 src/docs/pt-PT/reaction.md create mode 100644 src/docs/pt-PT/reversi-bot.md create mode 100644 src/docs/pt-PT/stream.md create mode 100644 src/docs/pt-PT/theme.md create mode 100644 src/docs/pt-PT/timelines.md create mode 100644 src/docs/ru-RU/aiscript.md create mode 100644 src/docs/ru-RU/api.md create mode 100644 src/docs/ru-RU/create-plugin.md create mode 100644 src/docs/ru-RU/custom-emoji.md create mode 100644 src/docs/ru-RU/deck.md create mode 100644 src/docs/ru-RU/follow.md create mode 100644 src/docs/ru-RU/keyboard-shortcut.md create mode 100644 src/docs/ru-RU/mfm.md create mode 100644 src/docs/ru-RU/mute.md create mode 100644 src/docs/ru-RU/pages.md create mode 100644 src/docs/ru-RU/reaction.md create mode 100644 src/docs/ru-RU/reversi-bot.md create mode 100644 src/docs/ru-RU/stream.md create mode 100644 src/docs/ru-RU/theme.md create mode 100644 src/docs/ru-RU/timelines.md create mode 100644 src/docs/ug-CN/aiscript.md create mode 100644 src/docs/ug-CN/api.md create mode 100644 src/docs/ug-CN/create-plugin.md create mode 100644 src/docs/ug-CN/custom-emoji.md create mode 100644 src/docs/ug-CN/deck.md create mode 100644 src/docs/ug-CN/follow.md create mode 100644 src/docs/ug-CN/keyboard-shortcut.md create mode 100644 src/docs/ug-CN/mfm.md create mode 100644 src/docs/ug-CN/mute.md create mode 100644 src/docs/ug-CN/pages.md create mode 100644 src/docs/ug-CN/reaction.md create mode 100644 src/docs/ug-CN/reversi-bot.md create mode 100644 src/docs/ug-CN/stream.md create mode 100644 src/docs/ug-CN/theme.md create mode 100644 src/docs/ug-CN/timelines.md create mode 100644 src/docs/uk-UA/aiscript.md create mode 100644 src/docs/uk-UA/api.md create mode 100644 src/docs/uk-UA/create-plugin.md create mode 100644 src/docs/uk-UA/custom-emoji.md create mode 100644 src/docs/uk-UA/deck.md create mode 100644 src/docs/uk-UA/follow.md create mode 100644 src/docs/uk-UA/keyboard-shortcut.md create mode 100644 src/docs/uk-UA/mfm.md create mode 100644 src/docs/uk-UA/mute.md create mode 100644 src/docs/uk-UA/pages.md create mode 100644 src/docs/uk-UA/reaction.md create mode 100644 src/docs/uk-UA/reversi-bot.md create mode 100644 src/docs/uk-UA/stream.md create mode 100644 src/docs/uk-UA/theme.md create mode 100644 src/docs/uk-UA/timelines.md create mode 100644 src/docs/zh-CN/aiscript.md create mode 100644 src/docs/zh-CN/api.md create mode 100644 src/docs/zh-CN/create-plugin.md create mode 100644 src/docs/zh-CN/custom-emoji.md create mode 100644 src/docs/zh-CN/deck.md create mode 100644 src/docs/zh-CN/follow.md create mode 100644 src/docs/zh-CN/keyboard-shortcut.md create mode 100644 src/docs/zh-CN/mfm.md create mode 100644 src/docs/zh-CN/mute.md create mode 100644 src/docs/zh-CN/pages.md create mode 100644 src/docs/zh-CN/reaction.md create mode 100644 src/docs/zh-CN/reversi-bot.md create mode 100644 src/docs/zh-CN/stream.md create mode 100644 src/docs/zh-CN/theme.md create mode 100644 src/docs/zh-CN/timelines.md create mode 100644 src/docs/zh-TW/aiscript.md create mode 100644 src/docs/zh-TW/api.md create mode 100644 src/docs/zh-TW/create-plugin.md create mode 100644 src/docs/zh-TW/custom-emoji.md create mode 100644 src/docs/zh-TW/deck.md create mode 100644 src/docs/zh-TW/follow.md create mode 100644 src/docs/zh-TW/keyboard-shortcut.md create mode 100644 src/docs/zh-TW/mfm.md create mode 100644 src/docs/zh-TW/mute.md create mode 100644 src/docs/zh-TW/pages.md create mode 100644 src/docs/zh-TW/reaction.md create mode 100644 src/docs/zh-TW/reversi-bot.md create mode 100644 src/docs/zh-TW/stream.md create mode 100644 src/docs/zh-TW/theme.md create mode 100644 src/docs/zh-TW/timelines.md diff --git a/locales/de-DE.yml b/locales/de-DE.yml index ea73f1d09..609698b72 100644 --- a/locales/de-DE.yml +++ b/locales/de-DE.yml @@ -243,7 +243,7 @@ nUsersRead: "Von {n} gelesen" agreeTo: "Ich stimme {0} zu" tos: "Nutzungsbedingungen" start: "Anfangen" -home: "Startseite" +home: "Home" remoteUserCaution: "Diese Informationen sind möglicherweise veraltet, da der Benutzer von einer anderen Instanz stammt." activity: "Aktivität" images: "Bilder" @@ -663,6 +663,13 @@ experimentalFeatures: "Experimentelle Funktionalitäten" developer: "Entwickler" makeExplorable: "Benutzerkonto in \"Erkunden\" sichtbar machen" makeExplorableDescription: "Wenn diese Option deaktiviert ist, ist dein Benutzerkonto nicht im \"Erkunden\"-Bereich sichtbar." +showGapBetweenNotesInTimeline: "Abstände zwischen Notizen auf der Chronik anzeigen" +duplicate: "Duplizieren" +left: "Links" +center: "Mitte" +wide: "Breit" +narrow: "Schmal" +reloadToApplySetting: "Einstellungen treten nach einer Aktualisierung der Seite in Kraft. Jetzt aktualisieren?" _aboutMisskey: about: "Misskey ist Open-Source-Software die von syuilo seit 2014 entwickelt wird." contributors: "Hauptmitwirkende" @@ -983,6 +990,7 @@ _widgets: federation: "Föderation" postForm: "Neue Notiz anfertigen" slideshow: "Diashow" + button: "Knopf" _cw: hide: "Ausblenden" show: "Mehr anzeigen" @@ -1465,6 +1473,8 @@ _notification: _deck: alwaysShowMainColumn: "Hauptspalte immer zeigen" columnAlign: "Spalten ausrichten" + columnMargin: "Spaltenabstand" + columnHeaderHeight: "Spaltenkopfhöhe" addColumn: "Spalte hinzufügen" swapLeft: "Nach links verschieben" swapRight: "Nach rechts verschieben" @@ -1473,6 +1483,7 @@ _deck: stackLeft: "Nach links stapeln" popRight: "Nach rechts vom Stapel nehmen" _columns: + main: "Hauptspalte" widgets: "Widgets" notifications: "Benachrichtigungen" tl: "Chronik" diff --git a/locales/en-US.yml b/locales/en-US.yml index 899514f87..2313c64ed 100644 --- a/locales/en-US.yml +++ b/locales/en-US.yml @@ -663,6 +663,13 @@ experimentalFeatures: "Experimental features" developer: "Developer" makeExplorable: "Make account visible in \"Explore\"" makeExplorableDescription: "If you turn this off, your account will not show up in the \"Explore\" section." +showGapBetweenNotesInTimeline: "Show a gap between posts on the timeline" +duplicate: "Duplicate" +left: "Left" +center: "Center" +wide: "Wide" +narrow: "Narrow" +reloadToApplySetting: "Settings will be applied upon page reload. Reload now?" _aboutMisskey: about: "Misskey is open-source software being developed by syuilo since 2014." contributors: "Main contributors" @@ -983,6 +990,7 @@ _widgets: federation: "Federation" postForm: "Compose a note" slideshow: "Slideshow" + button: "Button" _cw: hide: "Hide" show: "Load more" @@ -1465,6 +1473,8 @@ _notification: _deck: alwaysShowMainColumn: "Always show main column" columnAlign: "Align columns" + columnMargin: "Margin between columns" + columnHeaderHeight: " Column header height" addColumn: "Add column" swapLeft: "Swap to left" swapRight: "Swap to right" @@ -1473,6 +1483,7 @@ _deck: stackLeft: "Stack on the left" popRight: "Pop to the right" _columns: + main: "Main" widgets: "Widgets" notifications: "Notifications" tl: "Timeline" diff --git a/locales/es-ES.yml b/locales/es-ES.yml index 9002daa33..58b7cb6c6 100644 --- a/locales/es-ES.yml +++ b/locales/es-ES.yml @@ -33,6 +33,9 @@ addUser: "Agregar usuario" favorite: "Favorito" favorites: "Favoritos" unfavorite: "Quitar de favoritos" +favorited: "Añadido a favoritos" +alreadyFavorited: "Ya había sido añadido a favoritos" +cantFavorite: "No fue añadido a favoritos" pin: "Fijar" unpin: "Desfijar" copyContent: "Copiar contenido" @@ -87,6 +90,9 @@ followRequestPending: "Solicitudes de seguimiento pendientes" enterEmoji: "Ingresar emojis" renote: "Renotar" unrenote: "Quitar renota" +renoted: "Renotado" +cantRenote: "No se puede renotar este post" +cantReRenote: "No se puede renotar una renota" quote: "Citar" pinnedNote: "Nota fijada" you: "Tú" @@ -95,6 +101,7 @@ sensitive: "Marcado como sensible" add: "Agregar" reaction: "Reacción" reactionSettingDescription: "Asigne sus reacción favoritas que desean anclar en el selector de reacciones." +reactionSettingDescription2: "Arrastre para reordenar, click para borrar, apriete la tecla + para añadir." rememberNoteVisibility: "Recordar visibilidad" attachCancel: "Quitar adjunto" markAsSensitive: "Marcar como sensible" @@ -124,7 +131,9 @@ settingGuide: "Configuración sugerida" cacheRemoteFiles: "Mantener en cache los archivos remotos" cacheRemoteFilesDescription: "Si desactiva esta configuración, Los archivos remotos se cargarán desde el link directo sin usar la caché. Con eso se puede ahorrar almacenamiento del servidor, pero eso aumentará el tráfico al no crear miniaturas." flagAsBot: "Esta cuenta es un bot" +flagAsBotDescription: "En caso de que esta cuenta fuera usada por un programa, active esta opción. Al hacerlo, esta opción servirá para otros desarrolladores para evitar cadenas infinitas de reacciones, y ajustará los sistemas internos de Misskey para que trate a esta cuenta como un bot." flagAsCat: "Esta cuenta es un gato" +flagAsCatDescription: "En caso de que declare que esta cuenta es de un gato, active esta opción." autoAcceptFollowed: "Aceptar automáticamente las solicitudes de seguimiento de los usuarios que sigues" addAcount: "Agregar cuenta" loginFailed: "Error al iniciar sesión." @@ -215,6 +224,7 @@ remove: "Borrar" removed: "Borrado" removeAreYouSure: "¿Desea borrar \"{x}\"?" deleteAreYouSure: "¿Desea borrar \"{x}\"?" +resetAreYouSure: "¿Desea reestablecer?" saved: "Guardado" messaging: "Chat" upload: "Subir" @@ -314,6 +324,9 @@ bannerUrl: "URL de la imagen del banner" basicInfo: "Información básica" pinnedUsers: "Usuarios fijados" pinnedUsersDescription: "Describir los usuarios que quiere fijar en la página \"Descubrir\" separados por una linea nueva" +pinnedPages: "Páginas fijadas" +pinnedPagesDescription: "Describa las rutas de las páginas que desea fijar a la página principal de la instancia, separadas por lineas nuevas" +pinnedClipId: "Id del clip fijado" pinnedNotes: "Nota fijada" hcaptcha: "hCaptcha" enableHcaptcha: "Habilitar hCaptcha" @@ -429,6 +442,7 @@ useOsNativeEmojis: "Usa los emojis nativos de la plataforma" youHaveNoGroups: "Sin grupos" joinOrCreateGroup: "Obtenga una invitación para unirse al grupos o puede crear su propio grupo." noHistory: "No hay datos en el historial" +signinHistory: "Historial de ingresos" disableAnimatedMfm: "Deshabilitar MFM que tiene animaciones" doing: "Voy en camino" category: "Categoría" @@ -481,6 +495,7 @@ none: "Ninguna" showInPage: "Mostrar en la página" popout: "Popout" volume: "Volumen" +masterVolume: "Volumen principal" details: "Detalles" chooseEmoji: "Elije un emoji" unableToProcess: "La operación no se puede llevar a cabo" @@ -538,6 +553,9 @@ useBlurEffectForModal: "Usar efecto borroso en modales" useFullReactionPicker: "Reacción" width: "Ancho" height: "Altura" +large: "Grande" +medium: "Mediano" +small: "Pequeño" generateAccessToken: "Generar token de acceso" permission: "Permisos" enableAll: "Activar todo" @@ -550,6 +568,8 @@ useStarForReactionFallback: "En caso de que los emojis de reacciones no sean cla emailConfig: "Configuración del servidor de correos" enableEmail: "Activar el envío de correos electrónicos" emailConfigInfo: "Usar en caso de validación de correo electrónico y pedido de contraseña" +email: "Correo" +emailAddress: "Correo electrónico" smtpConfig: "Configuración del servidor SMTP" smtpHost: "Host" smtpPort: "Puerto" @@ -581,6 +601,7 @@ regenerateLoginTokenDescription: "Regenerar el token usado internamente durante setMultipleBySeparatingWithSpace: "Puedes añadir mas de uno, separado por espacios." fileIdOrUrl: "Id del archivo o URL" chatOpenBehavior: "Comportamiento al abrir el chat" +behavior: "Comportamiento" sample: "Muestra" abuseReports: "Reportes" reportAbuse: "Reportar" @@ -599,7 +620,32 @@ random: "Aleatorio" system: "Sistema" switchUi: "Cambiar interfaz de usuario" desktop: "Escritorio" +clip: "Clip" +createNew: "Crear" +optional: "Opcional" +createNewClip: "Crear clip nuevo" public: "Público" +i18nInfo: "Misskey está siendo traducido a varios idiomas gracias a voluntarios. Se puede colaborar traduciendo en {link}" +manageAccessTokens: "Administrar tokens de acceso" +accountInfo: "Información de la Cuenta" +notesCount: "Cantidad de notas" +repliesCount: "Cantidad de respuestas hechas" +renotesCount: "Cantidad de renotas hechas" +repliedCount: "Cantidad de respuestas recibidas" +renotedCount: "Cantidad de renotas recibidas" +followingCount: "Cantidad de seguidos" +followersCount: "Cantidad de seguidores" +sentReactionsCount: "Cantidad de reacciones hechas" +receivedReactionsCount: "Cantidad de reacciones recibidas" +pollVotesCount: "Cantidad de votaciones hechas" +pollVotedCount: "Cantidad de votaciones recibidas" +yes: "Si" +no: "No" +driveFilesCount: "Cantidad de archivos en el drive" +driveUsage: "Uso del drive" +noCrawle: "Rechazar indexación del crawler" +noCrawleDescription: "Pedir a los motores de búsqueda que no indexen tu perfil, notas, páginas, etc." +clips: "Clip" _mfm: cheatSheet: "Hoja de referencia de MFM" intro: "MFM es un lenguaje de marcado dedicado que se puede usar en varios lugares dentro de Misskey. Aquí puede ver una lista de sintaxis disponibles en MFM." @@ -871,6 +917,7 @@ _widgets: digitalClock: "Reloj digital" federation: "Federación" postForm: "Formulario" + button: "Botón" _cw: hide: "Ocultar" show: "Ver más" diff --git a/locales/fr-FR.yml b/locales/fr-FR.yml index f7c36b373..e707ef0f0 100644 --- a/locales/fr-FR.yml +++ b/locales/fr-FR.yml @@ -762,6 +762,7 @@ _widgets: digitalClock: "Horloge numérique" federation: "Fédération" postForm: "Formulaire à publier" + button: "Bouton" _cw: hide: "Masquer" show: "Afficher plus …" diff --git a/locales/ja-KS.yml b/locales/ja-KS.yml index 4b9fa8162..ba44e615c 100644 --- a/locales/ja-KS.yml +++ b/locales/ja-KS.yml @@ -33,6 +33,9 @@ addUser: "ユーザーを追加や" favorite: "お気に入り" favorites: "お気に入り" unfavorite: "やっぱ気に入らん" +favorited: "お気に入りに登録したで" +alreadyFavorited: "もうお気に入りに入れとるがな。" +cantFavorite: "アカン、お気に入り登録できへんかったで。" pin: "ピン留めしとく" unpin: "やっぱピン留めせん" copyContent: "内容をコピー" @@ -87,6 +90,9 @@ followRequestPending: "フォロー許してくれるん待っとる" enterEmoji: "絵文字を入れてや" renote: "Renote" unrenote: "Renoteやめる" +renoted: "Renoteしたで。" +cantRenote: "この投稿はRenoteできへんらしい。" +cantReRenote: "すまん、今このRenoteにRenoteはできへんのや。" quote: "引用" pinnedNote: "ピン留めされとるノート" you: "あんた" @@ -95,6 +101,7 @@ sensitive: "ちょっとアカンやつやで" add: "増やす" reaction: "リアクション" reactionSettingDescription: "リアクションピッカーに出しとくリアクションを選んでや。" +reactionSettingDescription2: "ドラッグして並び替え、クリックして削除、+を押すと追加できるで。" rememberNoteVisibility: "公開範囲覚えといて" attachCancel: "やっぱ添付やめてくれん?" markAsSensitive: "ちょっとこれはアカン" @@ -124,7 +131,9 @@ settingGuide: "ええ感じの設定" cacheRemoteFiles: "リモートのファイルをキャッシュする" cacheRemoteFilesDescription: "この設定を切っとくと、リモートファイルをキャッシュせず直リンクするようになってしまうんやで? サーバーのストレージは節約できるんやけど、かわりにサムネイルが作られんくなるから通信量が増えるで?" flagAsBot: "Botやで" +flagAsBotDescription: "もしこのアカウントがプログラムによって運用されるんやったら、このフラグをオンにしてたのむで。オンにすると、反応の連鎖を防ぐためのフラグとして他の開発者に役立ったり、Misskeyのシステム上での扱いがBotに合ったもんになるんやで。" flagAsCat: "Catやで" +flagAsCatDescription: "ワレ、猫ちゃんならこのフラグをつけてみ?" autoAcceptFollowed: "フォローしとるユーザーからのフォローリクエストには勝手に許可しとくで。" addAcount: "アカウント追加" loginFailed: "ログインに失敗してしもうた…" @@ -215,6 +224,7 @@ remove: "ほかす" removed: "削除したで!" removeAreYouSure: "「{x}」はなおしてしもてええか?" deleteAreYouSure: "「{x}」はなおしてしもてええか?" +resetAreYouSure: "リセットしてええん?" saved: "保存したで!" messaging: "チャット" upload: "アップロード" @@ -314,6 +324,7 @@ bannerUrl: "バナー画像のURL" basicInfo: "基本情報" pinnedUsers: "ピン留めしたユーザー" pinnedUsersDescription: "「みつける」ページとかにピン留めしたいユーザーをここに書けばええんやで。他ん人との名前は改行で区切ればええんやで。" +pinnedPages: "ピン留めページ" pinnedNotes: "ピン留めされとるノート" hcaptcha: "hCaptcha(キャプチャ)" enableHcaptcha: "hCaptcha(キャプチャ)をつけとく" @@ -404,9 +415,42 @@ quoteQuestion: "引用として添付してもええか?" noMessagesYet: "まだチャットはあらへんで" newMessageExists: "新しいメッセージがきたで" onlyOneFileCanBeAttached: "すまん、メッセージに添付できるファイルはひとつだけなんや。" +signinRequired: "ログインしてくれへん?" invitations: "来てや" invitationCode: "招待コード" checking: "確認しとるで" +available: "利用できる\n" +unavailable: "利用できん" +usernameInvalidFormat: "a~z、A~Z、0~9、_が使えるで" +tooShort: "短すぎやろ!" +tooLong: "長すぎやろ!" +weakPassword: "弱いパスワード" +normalPassword: "普通のパスワード" +strongPassword: "ええ感じのパスワード" +passwordMatched: "よし!一致や!" +passwordNotMatched: "一致しとらんで?" +signinWith: "{x}でログイン" +or: "それか" +uiLanguage: "UIの表示言語" +groupInvited: "グループに招待されとるで" +aboutX: "{x}について" +useOsNativeEmojis: "OSネイティブの絵文字を使う" +youHaveNoGroups: "グループがあらへんねぇ。" +noHistory: "履歴はあらへんねぇ。" +signinHistory: "ログイン履歴" +doing: "やっとるがな" +category: "カテゴリ" +tags: "タグ" +docSource: "このドキュメントのソース" +createAccount: "アカウントを作成" +existingAcount: "既存のアカウント" +regenerate: "再生成" +fontSize: "フォントサイズ" +noFollowRequests: "フォロー申請はあらへんで" +openImageInNewTab: "画像を新しいタブで開く" +dashboard: "ダッシュボード" +local: "ローカル" +remote: "リモート" smtpHost: "ホスト" smtpUser: "ユーザー名" smtpPass: "パスワード" @@ -501,6 +545,7 @@ _pages: array: "リスト" _notification: youWereFollowed: "フォローされたで" + youWereInvitedToGroup: "グループに招待されとるで" _types: follow: "フォロー" mention: "メンション" diff --git a/locales/ko-KR.yml b/locales/ko-KR.yml index 555a34b2d..82e4d28e9 100644 --- a/locales/ko-KR.yml +++ b/locales/ko-KR.yml @@ -834,6 +834,7 @@ _widgets: digitalClock: "디지털 시계" federation: "연합" postForm: "글 입력란" + button: "버튼" _cw: hide: "숨기기" show: "더 보기" diff --git a/locales/ru-RU.yml b/locales/ru-RU.yml index 84f32635c..e9cef4bde 100644 --- a/locales/ru-RU.yml +++ b/locales/ru-RU.yml @@ -33,6 +33,9 @@ addUser: "Добавить пользователя" favorite: "В избранное" favorites: "Избранное" unfavorite: "Убрать из избранного" +favorited: "Добавлено в избранное." +alreadyFavorited: "Уже есть в избранном." +cantFavorite: "Не удалось добавить в избранное." pin: "Закрепить в профиле" unpin: "Открепить от профиля" copyContent: "Скопировать содержимое" @@ -87,6 +90,9 @@ followRequestPending: "Нерассмотренный запрос на подп enterEmoji: "Введите эмодзи" renote: "Репост" unrenote: "Отмена репоста" +renoted: "Репост совершён." +cantRenote: "Это нельзя репостить." +cantReRenote: "Невозможно репостить репост." quote: "Цитата" pinnedNote: "Закреплённая заметка" you: "Вы" @@ -655,6 +661,12 @@ useSystemFont: "Использовать шрифт, предлагаемый с clips: "Памятки" experimentalFeatures: "Экспериментальные функции" developer: "Разработчик" +makeExplorable: "Опубликовать профиль в «Обзоре»." +makeExplorableDescription: "Если выключить, ваш профиль не будет показан в разделе «Обзор»." +showGapBetweenNotesInTimeline: "Показывать разделитель между заметками в ленте" +duplicate: "Дубликат" +left: "Влево" +center: "По центру" _aboutMisskey: about: "Misskey — программа с открытым исходным кодом, которую разрабатывает syuilo с 2014 года." contributors: "Основные соавторы" @@ -975,6 +987,7 @@ _widgets: federation: "Федерация" postForm: "Форма отправки" slideshow: "Показ слайдов" + button: "Кнопка" _cw: hide: "Спрятать" show: "Показать еще" @@ -1457,6 +1470,8 @@ _notification: _deck: alwaysShowMainColumn: "Всегда показывать главную колонку" columnAlign: "Выравнивание колонок" + columnMargin: "Расстояние между колонками" + columnHeaderHeight: "Высота заголовка колонки" addColumn: "Добавить колонку" swapLeft: "Переставить левее" swapRight: "Переставить правее" @@ -1465,6 +1480,7 @@ _deck: stackLeft: "В столбик влево" popRight: "Из столбика вправо" _columns: + main: "Основная" widgets: "Виджеты" notifications: "Уведомления" tl: "Лента" diff --git a/locales/uk-UA.yml b/locales/uk-UA.yml index 5a5e9e241..1c919b15e 100644 --- a/locales/uk-UA.yml +++ b/locales/uk-UA.yml @@ -741,8 +741,10 @@ _theme: divider: "Розділювач" _sfx: note: "Нотатки" + noteMy: "Мої нотатки" notification: "Сповіщення" chat: "Чати" + chatBg: "Чати (фон)" _ago: unknown: "Невідомо" future: "Майбутнє" @@ -767,39 +769,153 @@ _tutorial: _2fa: registerKey: "Зареєструвати новий ключ безпеки" _permissions: + "read:account": "Переглядати дані профілю" "write:account": "Змінити дані акаунту" "read:blocks": "Переглянути список заблокованих" "write:blocks": "Редагувати список заблокованих" "read:drive": "Переглянути вміст Диска" + "write:drive": "Змінювати вміст Диска" + "read:favorites": "Переглядати обране" + "write:favorites": "Змінювати обране" + "read:following": "Переглядати підписки" + "write:following": "Змінювати підписки" + "read:messaging": "Переглядати повідомлення" + "write:messaging": "Створювати та видаляти повідомлення" + "read:mutes": "Переглядати список ігнорованих" + "write:mutes": "Змінювати список ігнорованих" + "write:notes": "Писати і видаляти нотатки" + "read:notifications": "Переглядати сповіщення" + "read:reactions": "Переглядати реакції" + "write:reactions": "Змінювати реакції" + "write:votes": "Голосувати в опитуваннях" + "read:pages": "Переглядати сторінки" + "write:pages": "Змінювати і видаляти сторінки" + "read:page-likes": "Переглядати вподобання сторінок" + "write:page-likes": "Змінювати вподобання сторінок" + "read:user-groups": "Переглядати групи користувача" + "write:user-groups": "Змінювати групи користувача" + "read:channels": "Переглядати канали" + "write:channels": "Змінювати канали" +_auth: + shareAccess: "Ви хочете надати \"{name}\" доступ до цього акаунту?" + shareAccessAsk: "Ви впевнені, що хочете надати цій програмі доступ до вашого акаунту?" + denied: "У доступі відмовлено" _antennaSources: + all: "Всі нотатки" homeTimeline: "Нотатки тих, на кого ви підписані" +_weekday: + sunday: "Неділя" + monday: "Понеділок" + tuesday: "Вівторок" + wednesday: "Середа" + thursday: "Четвер" + friday: "П'ятниця" + saturday: "Субота" _widgets: notifications: "Сповіщення" timeline: "Стрічка" + calendar: "Календар" + trends: "Тенденції" + clock: "Годинник" + rss: "RSS-читач" activity: "Активність" + photos: "Фото" + digitalClock: "Цифровий годинник" federation: "Федіверс" postForm: "Створення нотатки" + slideshow: "Слайд-шоу" + button: "Кнопка" _cw: + hide: "Сховати" show: "Показати більше" + chars: "{count} символів" + files: "{count} файлів" _poll: + noOnlyOneChoice: "Потрібні принаймні два варіанти." + noMore: "Більше варіантів додати не можна" + canMultipleVote: "Можна вибрати кілька варіантів" + expiration: "Опитування закінчується" + infinite: "Ніколи" + deadlineDate: "Дата закінчення" deadlineTime: "г" + duration: "Тривалість" + votesCount: "{n} голосів" + totalVotes: "Всього {n} голосів" + vote: "Голосувати" + showResult: "Переглянути результати" + voted: "Проголосовано" + closed: "Завершено" + remainingDays: "Залишилось {d} днів {h} годин" + remainingHours: "Залишилось {h} годин {m} хвилин" + remainingMinutes: "Залишилось {m} хвилин {s} секунд" + remainingSeconds: "Залишилось {s} секунд" _visibility: + public: "Публічний" + publicDescription: "Для всіх користувачів" home: "Домівка" + homeDescription: "Лише на домашній стрічці" followers: "Підписники" - localOnly: "Лише локально" + followersDescription: "Тільки для підписників" + specified: "Особисто" + specifiedDescription: "Лише для певних користувачів" + localOnly: "Локально" + localOnlyDescription: "Приховано для віддалених користувачів" _postForm: replyPlaceholder: "Відповідь на цю нотатку..." + quotePlaceholder: "Прокоментуйте цю нотатку..." + channelPlaceholder: "Опублікувати в каналі" + _placeholders: + a: "Чим займаєтесь?" + b: "Що відбувається навколо вас?" + c: "Що у вас на думці?" + d: "Що ви хочете висловити?" + e: "Напишіть тут, будь ласка..." + f: "Чекаю коли ви напишете..." _profile: name: "Ім'я" username: "Ім'я користувача" + description: "Про себе" + youCanIncludeHashtags: "Ви також можете включити хештеги у свій опис." + metadata: "Додаткова інформація" + metadataEdit: "Редагувати додаткову інформацію" + metadataDescription: "Ви можете вказати до чотирьох пунктів додаткової інформації у своєму профілі." + metadataLabel: "Назва" + metadataContent: "Вміст" + changeAvatar: "Змінити аватар" + changeBanner: "Змінити банер" _exportOrImport: + allNotes: "Всі нотатки" followingList: "Підписки" muteList: "Ігнорувати" blockingList: "Заблокувати" userLists: "Списки" +_charts: + federationInstancesTotal: "Загальна кількість федеративних інстансів" + usersTotal: "Загальна кількість користувачів" + activeUsers: "Активні користувачі" + notesTotal: "Загальна кількість нотаток" + filesIncDec: "Зміни кількості файлів" + filesTotal: "Загальна кількість файлів" +_instanceCharts: + requests: "Запити" + usersTotal: "Сумарна кількість користувачів" + notesTotal: "Сумарна кількість нотаток" + cacheSizeTotal: "Сумарний розмір кешу" + filesTotal: "Сумарна кількість файлів" _timelines: home: "Домівка" + local: "Локальна" + social: "Соціальна" + global: "Глобальна" _rooms: + roomOf: "Кімната {user}" + addFurniture: "Розмістити меблі" + translate: "Пересунути" + rotate: "Обертати" + exit: "Назад" + remove: "Видалити" + clear: "Видалити все" + leaveConfirm: "Є незбережені зміни. Ви дійсно хочете вийти?" chooseImage: "Виберіть зображення" roomType: "Тип кімнати" carpetColor: "Колір килима" @@ -826,6 +942,7 @@ _rooms: book: "Книга" book2: "Книга 2" piano: "Піаніно" + facial-tissue: "Серветки" server: "Сервер" moon: "Місяць" corkboard: "Коркова дошка" @@ -834,6 +951,20 @@ _rooms: keyboard: "Клавіатура" carpet-stripe: "Смугастий килим" mat: "Мат" + color-box: "Книжкова полиця" + wall-clock: "Настінний годинник" + photoframe: "Фоторамка" + cube: "Куб" + tv: "Телевізор" + pinguin: "Пінгвін" + rubik-cube: "Кубик Рубіка" + poster-h: "Плакат (горизонтальний)" + poster-v: "Плакат (вертикальний)" + sofa: "Диван" + spiral: "Гвинтові сходи" + bin: "Смітник" + holo-display: "Голографічний дисплей" + energy-drink: "Енергетичний напій" doll-ai: "Лялька Аі-тян" banknote: "Пачка грошей" _pages: diff --git a/locales/zh-CN.yml b/locales/zh-CN.yml index f4c862aee..97299a130 100644 --- a/locales/zh-CN.yml +++ b/locales/zh-CN.yml @@ -11,7 +11,7 @@ ok: "OK" gotIt: "我明白了" cancel: "取消" enterUsername: "输入用户名" -renotedBy: "{user} 转贴了" +renotedBy: "{user} 转发了" noNotes: "没有帖文" noNotifications: "无通知" instance: "实例" @@ -33,6 +33,9 @@ addUser: "添加用户" favorite: "收藏" favorites: "收藏" unfavorite: "取消收藏" +favorited: "已加入收藏夹。" +alreadyFavorited: "收藏夹中已存在。" +cantFavorite: "无法添加到收藏夹。" pin: "置顶" unpin: "取消置顶" copyContent: "复制内容" @@ -87,6 +90,9 @@ followRequestPending: "发送关注申请" enterEmoji: "输入表情符号" renote: "转发" unrenote: "取消转发" +renoted: "已转发。" +cantRenote: "该帖子无法转发。" +cantReRenote: "转发无法被再次转发。" quote: "引用" pinnedNote: "已置顶的帖子" you: "您" @@ -116,7 +122,7 @@ selectAntenna: "天线选择" selectWidget: "选择小工具" editWidgets: "编辑小工具" editWidgetsExit: "完成编辑" -customEmojis: "自定义Emoji" +customEmojis: "自定义表情符号" emoji: "表情符号" emojiName: "表情符号名称" emojiUrl: "表情符号地址" @@ -533,7 +539,7 @@ poll: "调查问卷" useCw: "隐藏内容" enablePlayer: "打开播放器" disablePlayer: "关闭播放器" -expandTweet: "展开推文" +expandTweet: "展开贴文" themeEditor: "主题编辑器" description: "描述" author: "作者" @@ -655,6 +661,15 @@ useSystemFont: "使用系统默认字体" clips: "片段" experimentalFeatures: "实验性功能" developer: "开发者" +makeExplorable: "使账号可见。" +makeExplorableDescription: "关闭时,账号不会显示在\"发现\"中。" +showGapBetweenNotesInTimeline: "时间线上的帖子分开显示。" +duplicate: "复制" +left: "左" +center: "中央" +wide: "宽" +narrow: "窄" +reloadToApplySetting: "页面刷新后设置才会生效。是否现在刷新页面?" _aboutMisskey: about: "Misskey是由syuilo于2014年开发的开源软件。" contributors: "主要贡献者" @@ -775,7 +790,7 @@ _wordMute: muteWords: "禁用词" muteWordsDescription: "使用空格分隔表示AND逻辑,使用换行符分隔表示OR逻辑。" muteWordsDescription2: "将关键字用斜线括起来表示正则表达式。" - softDescription: "隐藏时间轴中指定条件的帖文。" + softDescription: "隐藏时间线中指定条件的帖文。" hardDescription: "防止将具有指定条件的帖文添加到时间线。 即使您更改条件,未添加的帖文也会被排除在外。" soft: "软屏蔽" hard: "硬屏蔽" @@ -975,6 +990,7 @@ _widgets: federation: "联邦宇宙" postForm: "投稿窗口" slideshow: "幻灯片展示" + button: "按钮" _cw: hide: "隐藏" show: "查看更多" @@ -1457,6 +1473,8 @@ _notification: _deck: alwaysShowMainColumn: "总是显示主列" columnAlign: "列对齐" + columnMargin: "列间距" + columnHeaderHeight: "列标题高度" addColumn: "添加列" swapLeft: "向左移动" swapRight: "向右移动" @@ -1465,6 +1483,7 @@ _deck: stackLeft: "向左折叠" popRight: "向右弹出" _columns: + main: "主列" widgets: "小工具" notifications: "通知" tl: "时间线" diff --git a/locales/zh-TW.yml b/locales/zh-TW.yml index 194bf0f18..b1a0f94db 100644 --- a/locales/zh-TW.yml +++ b/locales/zh-TW.yml @@ -12,7 +12,7 @@ gotIt: "知道了" cancel: "取消" enterUsername: "輸入使用者名稱" renotedBy: "{user} 轉發了" -noNotes: "貼文不可用。" +noNotes: "箋文不可用。" noNotifications: "沒有通知" instance: "實例" settings: "設定" @@ -63,8 +63,8 @@ exportRequested: "已請求匯出。這可能會花一點時間。結束後檔 importRequested: "已請求匯入。這可能會花一點時間" lists: "清單" noLists: "沒有清單" -note: "貼文" -notes: "筆記" +note: "箋文" +notes: "箋文" following: "追隨中" followers: "追隨者" followsYou: "追隨你的人" @@ -86,6 +86,7 @@ followRequestPending: "追隨許可批准中" enterEmoji: "輸入表情符號" renote: "轉發貼文" unrenote: "取消轉發貼文" +renoted: "轉發成功" quote: "引用" pinnedNote: "已置頂的貼文" you: "您" @@ -289,7 +290,7 @@ tosUrl: "服務條款URL" thisYear: "今年" thisMonth: "本月" today: "本日" -dayX: "{day}天" +dayX: "{day}日" monthX: "{month}月" yearX: "{year}年" pages: "頁面" @@ -330,6 +331,7 @@ antennaKeywords: "包含關鍵字" antennaExcludeKeywords: "排除關鍵字" antennaKeywordsDescription: "用空格分隔指定AND、用換行符分隔指定OR" notifyAntenna: "通知我有新的貼文" +withFileAntenna: "僅帶有附件的箋文" serviceworker: "ServiceWorker" enableServiceworker: "開啟 ServiceWorker" antennaUsersDescription: "指定用換行符分隔的用戶名" @@ -393,7 +395,7 @@ text: "文字" enable: "啟用" next: "下一步" retype: "重新輸入" -noteOf: "{user}的貼文" +noteOf: "{user}的箋文" inviteToGroup: "邀請至群組" maxNoteTextLength: "貼文的字數限制" quoteAttached: "引用" @@ -459,7 +461,9 @@ objectStorageUseSSL: "使用SSL" objectStorageUseProxy: "使用網路代理" serverLogs: "伺服器日誌" deleteAll: "刪除所有記錄" +newNoteRecived: "有新的箋文" sounds: "音效" +listen: "聆聽" none: "無" showInPage: "在頁面中顯示" volume: "音量" @@ -515,6 +519,9 @@ deck: "多欄模式" undeck: "取消多欄模式" width: "寬度" height: "高度" +large: "大" +medium: "中" +small: "小" permission: "權限" enableAll: "啟用全部" disableAll: "停用全部" @@ -525,6 +532,8 @@ useStarForReactionFallback: "以★代替未知的表情符號" emailConfig: "電子郵件伺服器設定" enableEmail: "啟用發送電郵功能" emailConfigInfo: "用於確認電郵地址及密碼重置" +email: "電子郵件" +emailAddress: "電郵地址" smtpConfig: "SMTP伺服器設定" smtpHost: "主機" smtpPort: "端口" @@ -545,19 +554,46 @@ create: "新增" notificationSetting: "通知設定" other: "其他" regenerateLoginTokenDescription: "再生用於登入的內部權杖。一般情況下是不需要這樣做的。一旦再生,所有裝置將會被登出。" +behavior: "行為" sample: "範例 " abuseReports: "檢舉" reportAbuse: "檢舉" reportAbuseOf: "檢舉{name}" +fillAbuseReportDescription: "請填寫檢舉的詳細理由。可以的話,請附上針對的URL網址。" send: "發送" openInNewTab: "在新分頁中開啟" +instanceTicker: "箋文的實例資訊" random: "隨機" system: "系統" +switchUi: "切換界面" +optional: "可選" public: "公開" +notesCount: "箋文數量" +repliesCount: "回覆數量\n" +renotesCount: "轉發數量" +repliedCount: "回覆數量" +yes: "確定" +no: "取消" +driveFilesCount: "雲端硬碟檔案數量" +driveUsage: "雲端硬碟使用量" +noCrawleDescription: "請求網路搜尋引擎不要索引你的個人資料頁、箋文及頁面等。" +lockedAccountInfo: "即使你通過了追隨者請求,除非你將筆記的公開範圍設定為 「追隨者」,否則任何人都能看見你的箋文。" +noteFavoritesCount: "收藏箋文的數目" +contact: "聯絡人" +clips: "標籤" +experimentalFeatures: "測試中的功能" +developer: "開發者" +showGapBetweenNotesInTimeline: "分開顯示時間線上的箋文。" +_aboutMisskey: + about: "Misskey是由syuilo於2014年開發的開源軟件。" + contributors: "主要貢獻者" _mfm: mention: "提及" hashtag: "#tag" + url: "URL" link: "鏈接" + bold: "粗體" + center: "置中" quote: "引用" emoji: "自訂表情符號" search: "搜尋" @@ -598,7 +634,8 @@ _sidebar: hide: "隱藏" _wordMute: muteWords: "加入靜音文字" - mutedNotes: "已靜音的貼文" + softDescription: "隱藏時間軸中指定條件的箋文。" + mutedNotes: "已靜音的箋文" _theme: constant: "常數" defaultValue: "預設值" @@ -623,8 +660,8 @@ _theme: infoWarnBg: "警告背景" infoWarnFg: "警告字元" _sfx: - note: "貼文" - noteMy: "我的貼文" + note: "箋文" + noteMy: "我的箋文" notification: "通知" chat: "傳送訊息" channel: "頻道通知" @@ -643,7 +680,7 @@ _time: second: "秒" minute: "分鐘" hour: "小時" - day: "天" + day: "日" _tutorial: title: "Misskey使用方法" step1_1: "歡迎!" @@ -656,7 +693,7 @@ _tutorial: step3_3: "輸入完內容後,按視窗右上角的按鈕來發文" step3_4: "不知道該寫什麼內容嗎?試試看「開始使用Misskey了」如何。" step4_1: "筆記發出去了嗎?" - step4_2: "如果你的貼文有顯示在時間軸上,就代表已經發文成功。" + step4_2: "如果你的箋文出現在時間軸上,就代表發文成功。" step5_1: "現在試試看追隨其他人來讓你的時間軸變得更生動吧。" step5_2: "你可以在{featured}上看到受歡迎的貼文,你也可以選擇從列表中追隨你喜歡的人,或者在{explore}上找到熱門使用者。" step5_3: "想要追隨其他人,只要點擊他們的頭像並按「追隨」即可。" @@ -680,7 +717,7 @@ _permissions: "write:messaging": "撰寫或刪除私人訊息" "read:mutes": "顯示已靜音列表" "write:mutes": "編輯已靜音列表" - "write:notes": "撰寫或刪除貼文" + "write:notes": "撰寫或刪除箋文" "read:notifications": "查看通知" "write:notifications": "編輯通知" "read:reactions": "查看反應" @@ -697,11 +734,11 @@ _permissions: _auth: shareAccess: "要授權「“{name}”」存取您的帳戶嗎?" _antennaSources: - all: "全部貼文" - homeTimeline: "來自已追隨使用者的貼文" - users: "來自特定使用者的貼文" - userList: "來自特定清單中的貼文" - userGroup: "來自特定群組的貼文" + all: "全部箋文" + homeTimeline: "來自已追隨使用者的箋文" + users: "來自特定使用者的箋文" + userList: "來自特定清單中的箋文" + userGroup: "來自特定群組的箋文" _weekday: sunday: "週日" monday: "週一" @@ -722,6 +759,7 @@ _widgets: photos: "照片" digitalClock: "電子時鐘" federation: "聯邦宇宙" + button: "按鈕" _cw: hide: "隱藏" show: "瀏覽更多" @@ -751,7 +789,7 @@ _visibility: localOnly: "僅限本地" localOnlyDescription: "對遠端使用者隱藏" _postForm: - replyPlaceholder: "回覆此貼文..." + replyPlaceholder: "回覆此箋文..." quotePlaceholder: "引用此貼文..." channelPlaceholder: "發佈到頻道" _placeholders: @@ -769,7 +807,7 @@ _profile: metadataLabel: "標籤" metadataContent: "内容" _exportOrImport: - allNotes: "全部貼文" + allNotes: "全部箋文" followingList: "追隨中" muteList: "靜音" blockingList: "封鎖" @@ -778,10 +816,10 @@ _charts: usersIncDec: "使用者増減" usersTotal: "使用者合共" activeUsers: "活躍使用者" - notesIncDec: "貼文増減" - localNotesIncDec: "本地貼文増減" - remoteNotesIncDec: "非本地貼文的數目增减" - notesTotal: "貼文合共" + notesIncDec: "箋文増減" + localNotesIncDec: "本地箋文増減" + remoteNotesIncDec: "遠端箋文數目增减" + notesTotal: "箋文合共" filesIncDec: "檔案増減" filesTotal: "累計檔案" storageUsageIncDec: "儲存空間的増減" @@ -790,8 +828,8 @@ _instanceCharts: requests: "請求" users: "使用者増減" usersTotal: "總計使用者" - notes: "貼文増減" - notesTotal: "累計貼文" + notes: "箋文増減" + notesTotal: "累計箋文" ff: "追隨/追隨者的増減" ffTotal: "追隨/追隨者累計" cacheSize: "增加或減少快取用量" @@ -904,6 +942,10 @@ _pages: id: "畫布ID" width: "寬度" height: "高度" + note: "嵌式箋文" + _note: + id: "箋文ID" + detailed: "顯示詳細內容" switch: "開關" _switch: name: "變數名稱" diff --git a/src/docs/ar-SA/aiscript.md b/src/docs/ar-SA/aiscript.md new file mode 100644 index 000000000..6c28b446e --- /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 000000000..76019b614 --- /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 000000000..a6cba6388 --- /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 000000000..b86b191d1 --- /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 000000000..8057e262f --- /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 000000000..9b6562be9 --- /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 000000000..8ca24ad41 --- /dev/null +++ b/src/docs/ar-SA/keyboard-shortcut.md @@ -0,0 +1,68 @@ +# キーボードショートカット + +## الشامل +これらのショートカットは基本的にどこでも使えます。 + + + + + + + + + + + +
ショートカット効果由来
P, N新規投稿Post, New, Note
Tタイムラインの最も新しい投稿にフォーカスTimeline, Top
Shift + N通知を表示/隠すNotifications
SالبحثSearch
H, ?ヘルプを表示Help
+ +## 投稿にフォーカスされた状態 + + + + + + + + + + + + + + + + + + + +
ショートカット効果由来
, K, Shift + Tab上の投稿にフォーカスを移動-
, J, Tab下の投稿にフォーカスを移動-
R返信フォームを開くReply
QRenoteフォームを開くQuote
Ctrl + Q即刻Renoteする(フォームを開かずに)-
E, A, +リアクションフォームを開くEmote, reAction
0~9数字に対応したリアクションをする(対応については後述)-
F, Bお気に入りに登録Favorite, Bookmark
Del, Ctrl + D投稿を削除Delete
M, O投稿に対するメニューを開くMore, Other
SCWで隠された部分を表示 or 隠すShow, See
Escフォーカスを外す-
+ +## Renoteフォーム + + + + + + + + + + +
ショートカット効果由来
EnterRenoteする-
Qフォームを展開するQuote
Escフォームを閉じる-
+ +## リアクションフォーム +デフォルトで「👍」にフォーカスが当たっている状態です。 + + + + + + + + + + + + + +
ショートカット効果由来
, K上のリアクションにフォーカスを移動-
, J下のリアクションにフォーカスを移動-
, H, Shift + Tab左のリアクションにフォーカスを移動-
, L, Tab右のリアクションにフォーカスを移動-
Enter, Space, +リアクション確定-
0~9数字に対応したリアクションで確定-
Escリアクションするのをやめる-
diff --git a/src/docs/ar-SA/mfm.md b/src/docs/ar-SA/mfm.md new file mode 100644 index 000000000..e237287ac --- /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 000000000..c04ebcfd7 --- /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 000000000..a7311b95e --- /dev/null +++ b/src/docs/ar-SA/pages.md @@ -0,0 +1,10 @@ +# Pages + +## 変数 +変数を使うことで動的なページを作成できます。テキスト内で { 変数名 } と書くとそこに変数の値を埋め込めます。例えば Hello { thing } world! というテキストで、変数(thing)の値が ai だった場合、テキストは Hello ai world! になります。 + +変数の評価(値を算出すること)は上から下に行われるので、ある変数の中で自分より下の変数を参照することはできません。例えば上から A、B、C と3つの変数を定義したとき、Cの中でABを参照することはできますが、Aの中でBCを参照することはできません。 + +ユーザーからの入力を受け取るには、ページに「ユーザー入力」ブロックを設置し、「変数名」に入力を格納したい変数名を設定します(変数は自動で作成されます)。その変数を使ってユーザー入力に応じた動作を行えます。 + +関数を使うと、値の算出処理を再利用可能な形にまとめることができます。関数を作るには、「関数」タイプの変数を作成します。関数にはスロット(引数)を設定することができ、スロットの値は関数内で変数として利用可能です。また、関数を引数に取る関数(高階関数と呼ばれます)も存在します。関数は予め定義しておくほかに、このような高階関数のスロットに即席でセットすることもできます。 diff --git a/src/docs/ar-SA/reaction.md b/src/docs/ar-SA/reaction.md new file mode 100644 index 000000000..bd096799e --- /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 000000000..7ab2a7212 --- /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`。 + +## 投了する +投了をするには、このエンドポイントにリクエストします。 diff --git a/src/docs/ar-SA/stream.md b/src/docs/ar-SA/stream.md new file mode 100644 index 000000000..9011c37c5 --- /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キーや、アプリケーションからストリームに接続する際はユーザーのアクセストークンのことを指します。 + +
+

認証情報の取得については、こちらのドキュメントをご確認ください。

+
+ +--- + +認証情報は省略することもできますが、その場合非ログインでの利用ということになり、受信できる情報や可能な操作は限られます。例: + +``` +%WS_URL%/streaming +``` + +--- + +ストリームに接続すると、後述するAPI操作や、投稿の購読を行ったりすることができます。 しかしまだこの段階では、例えばタイムラインへの新しい投稿を受信したりすることはできません。 それを行うには、ストリーム上で、後述する**チャンネル**に接続する必要があります。 + +**ストリームでのやり取りはすべてJSONです。** + +## チャンネル +MisskeyのストリーミングAPIにはチャンネルという概念があります。これは、送受信する情報を分離するための仕組みです。 Misskeyのストリームに接続しただけでは、まだリアルタイムでタイムラインの投稿を受信したりはできません。 ストリーム上でチャンネルに接続することで、様々な情報を受け取ったり情報を送信したりすることができるようになります。 + +### チャンネルに接続する +チャンネルに接続するには、次のようなデータをJSONでストリームに送信します: + +```json +{ + type: 'connect', + body: { + channel: 'xxxxxxxx', + id: 'foobar', + params: { + ... + } + } +} +``` + +ここで、 +* `channel`には接続したいチャンネル名を設定します。チャンネルの種類については後述します。 +* `id`にはそのチャンネルとやり取りするための任意のIDを設定します。ストリームでは様々なメッセージが流れるので、そのメッセージがどのチャンネルからのものなのか識別する必要があるからです。このIDは、UUIDや、乱数のようなもので構いません。 +* `params`はチャンネルに接続する際のパラメータです。チャンネルによって接続時に必要とされるパラメータは異なります。パラメータ不要のチャンネルに接続する際は、このプロパティは省略可能です。 + +
+

IDはチャンネルごとではなく「チャンネルの接続ごと」です。なぜなら、同じチャンネルに異なるパラメータで複数接続するケースもあるからです。

+
+ +### チャンネルからのメッセージを受け取る +例えばタイムラインのチャンネルなら、新しい投稿があった時にメッセージを発します。そのメッセージを受け取ることで、タイムラインに新しい投稿がされたことをリアルタイムで知ることができます。 + +チャンネルがメッセージを発すると、次のようなデータが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`には、エンドポイントのパラメータを含めます。 + +
+

APIのエンドポイントやパラメータについてはAPIリファレンスをご確認ください。

+
+ +### レスポンスの受信 + +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 000000000..8e24a1cbc --- /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 000000000..21ebf4cf9 --- /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 000000000..6c28b446e --- /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 000000000..76019b614 --- /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 000000000..0d2fa1917 --- /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 000000000..ed2e92be1 --- /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 000000000..8057e262f --- /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 000000000..3c1ea7bbe --- /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 000000000..957ca838c --- /dev/null +++ b/src/docs/cs-CZ/keyboard-shortcut.md @@ -0,0 +1,68 @@ +# キーボードショートカット + +## グローバル +これらのショートカットは基本的にどこでも使えます。 + + + + + + + + + + + +
ショートカット効果由来
P, N新規投稿Post, New, Note
Tタイムラインの最も新しい投稿にフォーカスTimeline, Top
Shift + N通知を表示/隠すNotifications
S検索Search
H, ?ヘルプを表示Help
+ +## 投稿にフォーカスされた状態 + + + + + + + + + + + + + + + + + + + +
ショートカット効果由来
, K, Shift + Tab上の投稿にフォーカスを移動-
, J, Tab下の投稿にフォーカスを移動-
R返信フォームを開くReply
QRenoteフォームを開くQuote
Ctrl + Q即刻Renoteする(フォームを開かずに)-
E, A, +リアクションフォームを開くEmote, reAction
0~9数字に対応したリアクションをする(対応については後述)-
F, Bお気に入りに登録Favorite, Bookmark
Del, Ctrl + D投稿を削除Delete
M, O投稿に対するメニューを開くMore, Other
SCWで隠された部分を表示 or 隠すShow, See
Escフォーカスを外す-
+ +## Renoteフォーム + + + + + + + + + + +
ショートカット効果由来
EnterRenoteする-
Qフォームを展開するQuote
Escフォームを閉じる-
+ +## リアクションフォーム +デフォルトで「👍」にフォーカスが当たっている状態です。 + + + + + + + + + + + + + +
ショートカット効果由来
, K上のリアクションにフォーカスを移動-
, J下のリアクションにフォーカスを移動-
, H, Shift + Tab左のリアクションにフォーカスを移動-
, L, Tab右のリアクションにフォーカスを移動-
Enter, Space, +リアクション確定-
0~9数字に対応したリアクションで確定-
Escリアクションするのをやめる-
diff --git a/src/docs/cs-CZ/mfm.md b/src/docs/cs-CZ/mfm.md new file mode 100644 index 000000000..e237287ac --- /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 000000000..6a9608662 --- /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 000000000..a7311b95e --- /dev/null +++ b/src/docs/cs-CZ/pages.md @@ -0,0 +1,10 @@ +# Pages + +## 変数 +変数を使うことで動的なページを作成できます。テキスト内で { 変数名 } と書くとそこに変数の値を埋め込めます。例えば Hello { thing } world! というテキストで、変数(thing)の値が ai だった場合、テキストは Hello ai world! になります。 + +変数の評価(値を算出すること)は上から下に行われるので、ある変数の中で自分より下の変数を参照することはできません。例えば上から A、B、C と3つの変数を定義したとき、Cの中でABを参照することはできますが、Aの中でBCを参照することはできません。 + +ユーザーからの入力を受け取るには、ページに「ユーザー入力」ブロックを設置し、「変数名」に入力を格納したい変数名を設定します(変数は自動で作成されます)。その変数を使ってユーザー入力に応じた動作を行えます。 + +関数を使うと、値の算出処理を再利用可能な形にまとめることができます。関数を作るには、「関数」タイプの変数を作成します。関数にはスロット(引数)を設定することができ、スロットの値は関数内で変数として利用可能です。また、関数を引数に取る関数(高階関数と呼ばれます)も存在します。関数は予め定義しておくほかに、このような高階関数のスロットに即席でセットすることもできます。 diff --git a/src/docs/cs-CZ/reaction.md b/src/docs/cs-CZ/reaction.md new file mode 100644 index 000000000..c26ead75b --- /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 000000000..7ab2a7212 --- /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`。 + +## 投了する +投了をするには、このエンドポイントにリクエストします。 diff --git a/src/docs/cs-CZ/stream.md b/src/docs/cs-CZ/stream.md new file mode 100644 index 000000000..9011c37c5 --- /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キーや、アプリケーションからストリームに接続する際はユーザーのアクセストークンのことを指します。 + +
+

認証情報の取得については、こちらのドキュメントをご確認ください。

+
+ +--- + +認証情報は省略することもできますが、その場合非ログインでの利用ということになり、受信できる情報や可能な操作は限られます。例: + +``` +%WS_URL%/streaming +``` + +--- + +ストリームに接続すると、後述するAPI操作や、投稿の購読を行ったりすることができます。 しかしまだこの段階では、例えばタイムラインへの新しい投稿を受信したりすることはできません。 それを行うには、ストリーム上で、後述する**チャンネル**に接続する必要があります。 + +**ストリームでのやり取りはすべてJSONです。** + +## チャンネル +MisskeyのストリーミングAPIにはチャンネルという概念があります。これは、送受信する情報を分離するための仕組みです。 Misskeyのストリームに接続しただけでは、まだリアルタイムでタイムラインの投稿を受信したりはできません。 ストリーム上でチャンネルに接続することで、様々な情報を受け取ったり情報を送信したりすることができるようになります。 + +### チャンネルに接続する +チャンネルに接続するには、次のようなデータをJSONでストリームに送信します: + +```json +{ + type: 'connect', + body: { + channel: 'xxxxxxxx', + id: 'foobar', + params: { + ... + } + } +} +``` + +ここで、 +* `channel`には接続したいチャンネル名を設定します。チャンネルの種類については後述します。 +* `id`にはそのチャンネルとやり取りするための任意のIDを設定します。ストリームでは様々なメッセージが流れるので、そのメッセージがどのチャンネルからのものなのか識別する必要があるからです。このIDは、UUIDや、乱数のようなもので構いません。 +* `params`はチャンネルに接続する際のパラメータです。チャンネルによって接続時に必要とされるパラメータは異なります。パラメータ不要のチャンネルに接続する際は、このプロパティは省略可能です。 + +
+

IDはチャンネルごとではなく「チャンネルの接続ごと」です。なぜなら、同じチャンネルに異なるパラメータで複数接続するケースもあるからです。

+
+ +### チャンネルからのメッセージを受け取る +例えばタイムラインのチャンネルなら、新しい投稿があった時にメッセージを発します。そのメッセージを受け取ることで、タイムラインに新しい投稿がされたことをリアルタイムで知ることができます。 + +チャンネルがメッセージを発すると、次のようなデータが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`には、エンドポイントのパラメータを含めます。 + +
+

APIのエンドポイントやパラメータについてはAPIリファレンスをご確認ください。

+
+ +### レスポンスの受信 + +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 000000000..4e52ee8cd --- /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 000000000..36ba61bd2 --- /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 000000000..6c28b446e --- /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 000000000..76019b614 --- /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 000000000..0d2fa1917 --- /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 000000000..ed2e92be1 --- /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 000000000..8057e262f --- /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 000000000..3c1ea7bbe --- /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 000000000..957ca838c --- /dev/null +++ b/src/docs/da-DK/keyboard-shortcut.md @@ -0,0 +1,68 @@ +# キーボードショートカット + +## グローバル +これらのショートカットは基本的にどこでも使えます。 + + + + + + + + + + + +
ショートカット効果由来
P, N新規投稿Post, New, Note
Tタイムラインの最も新しい投稿にフォーカスTimeline, Top
Shift + N通知を表示/隠すNotifications
S検索Search
H, ?ヘルプを表示Help
+ +## 投稿にフォーカスされた状態 + + + + + + + + + + + + + + + + + + + +
ショートカット効果由来
, K, Shift + Tab上の投稿にフォーカスを移動-
, J, Tab下の投稿にフォーカスを移動-
R返信フォームを開くReply
QRenoteフォームを開くQuote
Ctrl + Q即刻Renoteする(フォームを開かずに)-
E, A, +リアクションフォームを開くEmote, reAction
0~9数字に対応したリアクションをする(対応については後述)-
F, Bお気に入りに登録Favorite, Bookmark
Del, Ctrl + D投稿を削除Delete
M, O投稿に対するメニューを開くMore, Other
SCWで隠された部分を表示 or 隠すShow, See
Escフォーカスを外す-
+ +## Renoteフォーム + + + + + + + + + + +
ショートカット効果由来
EnterRenoteする-
Qフォームを展開するQuote
Escフォームを閉じる-
+ +## リアクションフォーム +デフォルトで「👍」にフォーカスが当たっている状態です。 + + + + + + + + + + + + + +
ショートカット効果由来
, K上のリアクションにフォーカスを移動-
, J下のリアクションにフォーカスを移動-
, H, Shift + Tab左のリアクションにフォーカスを移動-
, L, Tab右のリアクションにフォーカスを移動-
Enter, Space, +リアクション確定-
0~9数字に対応したリアクションで確定-
Escリアクションするのをやめる-
diff --git a/src/docs/da-DK/mfm.md b/src/docs/da-DK/mfm.md new file mode 100644 index 000000000..e237287ac --- /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 000000000..6a9608662 --- /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 000000000..a7311b95e --- /dev/null +++ b/src/docs/da-DK/pages.md @@ -0,0 +1,10 @@ +# Pages + +## 変数 +変数を使うことで動的なページを作成できます。テキスト内で { 変数名 } と書くとそこに変数の値を埋め込めます。例えば Hello { thing } world! というテキストで、変数(thing)の値が ai だった場合、テキストは Hello ai world! になります。 + +変数の評価(値を算出すること)は上から下に行われるので、ある変数の中で自分より下の変数を参照することはできません。例えば上から A、B、C と3つの変数を定義したとき、Cの中でABを参照することはできますが、Aの中でBCを参照することはできません。 + +ユーザーからの入力を受け取るには、ページに「ユーザー入力」ブロックを設置し、「変数名」に入力を格納したい変数名を設定します(変数は自動で作成されます)。その変数を使ってユーザー入力に応じた動作を行えます。 + +関数を使うと、値の算出処理を再利用可能な形にまとめることができます。関数を作るには、「関数」タイプの変数を作成します。関数にはスロット(引数)を設定することができ、スロットの値は関数内で変数として利用可能です。また、関数を引数に取る関数(高階関数と呼ばれます)も存在します。関数は予め定義しておくほかに、このような高階関数のスロットに即席でセットすることもできます。 diff --git a/src/docs/da-DK/reaction.md b/src/docs/da-DK/reaction.md new file mode 100644 index 000000000..c26ead75b --- /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 000000000..7ab2a7212 --- /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`。 + +## 投了する +投了をするには、このエンドポイントにリクエストします。 diff --git a/src/docs/da-DK/stream.md b/src/docs/da-DK/stream.md new file mode 100644 index 000000000..9011c37c5 --- /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キーや、アプリケーションからストリームに接続する際はユーザーのアクセストークンのことを指します。 + +
+

認証情報の取得については、こちらのドキュメントをご確認ください。

+
+ +--- + +認証情報は省略することもできますが、その場合非ログインでの利用ということになり、受信できる情報や可能な操作は限られます。例: + +``` +%WS_URL%/streaming +``` + +--- + +ストリームに接続すると、後述するAPI操作や、投稿の購読を行ったりすることができます。 しかしまだこの段階では、例えばタイムラインへの新しい投稿を受信したりすることはできません。 それを行うには、ストリーム上で、後述する**チャンネル**に接続する必要があります。 + +**ストリームでのやり取りはすべてJSONです。** + +## チャンネル +MisskeyのストリーミングAPIにはチャンネルという概念があります。これは、送受信する情報を分離するための仕組みです。 Misskeyのストリームに接続しただけでは、まだリアルタイムでタイムラインの投稿を受信したりはできません。 ストリーム上でチャンネルに接続することで、様々な情報を受け取ったり情報を送信したりすることができるようになります。 + +### チャンネルに接続する +チャンネルに接続するには、次のようなデータをJSONでストリームに送信します: + +```json +{ + type: 'connect', + body: { + channel: 'xxxxxxxx', + id: 'foobar', + params: { + ... + } + } +} +``` + +ここで、 +* `channel`には接続したいチャンネル名を設定します。チャンネルの種類については後述します。 +* `id`にはそのチャンネルとやり取りするための任意のIDを設定します。ストリームでは様々なメッセージが流れるので、そのメッセージがどのチャンネルからのものなのか識別する必要があるからです。このIDは、UUIDや、乱数のようなもので構いません。 +* `params`はチャンネルに接続する際のパラメータです。チャンネルによって接続時に必要とされるパラメータは異なります。パラメータ不要のチャンネルに接続する際は、このプロパティは省略可能です。 + +
+

IDはチャンネルごとではなく「チャンネルの接続ごと」です。なぜなら、同じチャンネルに異なるパラメータで複数接続するケースもあるからです。

+
+ +### チャンネルからのメッセージを受け取る +例えばタイムラインのチャンネルなら、新しい投稿があった時にメッセージを発します。そのメッセージを受け取ることで、タイムラインに新しい投稿がされたことをリアルタイムで知ることができます。 + +チャンネルがメッセージを発すると、次のようなデータが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`には、エンドポイントのパラメータを含めます。 + +
+

APIのエンドポイントやパラメータについてはAPIリファレンスをご確認ください。

+
+ +### レスポンスの受信 + +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 000000000..4e52ee8cd --- /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 000000000..36ba61bd2 --- /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 000000000..7725f61ee --- /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 000000000..76019b614 --- /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 000000000..ee9678685 --- /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 000000000..beb3370e1 --- /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 000000000..73e9efdaa --- /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 000000000..ab1b86197 --- /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 000000000..d00a3e4f6 --- /dev/null +++ b/src/docs/de-DE/keyboard-shortcut.md @@ -0,0 +1,68 @@ +# キーボードショートカット + +## Global +これらのショートカットは基本的にどこでも使えます。 + + + + + + + + + + + +
ショートカット効果由来
P, N新規投稿Post, New, Note
Tタイムラインの最も新しい投稿にフォーカスTimeline, Top
Shift + N通知を表示/隠すNotifications
SSuchenSearch
H, ?ヘルプを表示Help
+ +## 投稿にフォーカスされた状態 + + + + + + + + + + + + + + + + + + + +
ショートカット効果由来
, K, Shift + Tab上の投稿にフォーカスを移動-
, J, Tab下の投稿にフォーカスを移動-
R返信フォームを開くReply
QRenoteフォームを開くQuote
Ctrl + Q即刻Renoteする(フォームを開かずに)-
E, A, +リアクションフォームを開くEmote, reAction
0~9数字に対応したリアクションをする(対応については後述)-
F, Bお気に入りに登録Favorite, Bookmark
Del, Ctrl + D投稿を削除Delete
M, O投稿に対するメニューを開くMore, Other
SCWで隠された部分を表示 or 隠すShow, See
Escフォーカスを外す-
+ +## Renoteフォーム + + + + + + + + + + +
ショートカット効果由来
EnterRenoteする-
Qフォームを展開するQuote
Escフォームを閉じる-
+ +## リアクションフォーム +デフォルトで「👍」にフォーカスが当たっている状態です。 + + + + + + + + + + + + + +
ショートカット効果由来
, K上のリアクションにフォーカスを移動-
, J下のリアクションにフォーカスを移動-
, H, Shift + Tab左のリアクションにフォーカスを移動-
, L, Tab右のリアクションにフォーカスを移動-
Enter, Space, +リアクション確定-
0~9数字に対応したリアクションで確定-
Escリアクションするのをやめる-
diff --git a/src/docs/de-DE/mfm.md b/src/docs/de-DE/mfm.md new file mode 100644 index 000000000..e237287ac --- /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 000000000..5b1c99cd9 --- /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 000000000..60f04b9de --- /dev/null +++ b/src/docs/de-DE/pages.md @@ -0,0 +1,10 @@ +# Pages + +## Variablen +変数を使うことで動的なページを作成できます。テキスト内で { 変数名 } と書くとそこに変数の値を埋め込めます。例えば Hello { thing } world! というテキストで、変数(thing)の値が ai だった場合、テキストは Hello ai world! になります。 + +変数の評価(値を算出すること)は上から下に行われるので、ある変数の中で自分より下の変数を参照することはできません。例えば上から A、B、C と3つの変数を定義したとき、Cの中でABを参照することはできますが、Aの中でBCを参照することはできません。 + +ユーザーからの入力を受け取るには、ページに「ユーザー入力」ブロックを設置し、「変数名」に入力を格納したい変数名を設定します(変数は自動で作成されます)。その変数を使ってユーザー入力に応じた動作を行えます。 + +関数を使うと、値の算出処理を再利用可能な形にまとめることができます。関数を作るには、「関数」タイプの変数を作成します。関数にはスロット(引数)を設定することができ、スロットの値は関数内で変数として利用可能です。また、関数を引数に取る関数(高階関数と呼ばれます)も存在します。関数は予め定義しておくほかに、このような高階関数のスロットに即席でセットすることもできます。 diff --git a/src/docs/de-DE/reaction.md b/src/docs/de-DE/reaction.md new file mode 100644 index 000000000..12537af7f --- /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 000000000..3ffb1ee24 --- /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`。 + +## 投了する +投了をするには、このエンドポイントにリクエストします。 diff --git a/src/docs/de-DE/stream.md b/src/docs/de-DE/stream.md new file mode 100644 index 000000000..0fe76149b --- /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キーや、アプリケーションからストリームに接続する際はユーザーのアクセストークンのことを指します。 + +
+

認証情報の取得については、こちらのドキュメントをご確認ください。

+
+ +--- + +認証情報は省略することもできますが、その場合非ログインでの利用ということになり、受信できる情報や可能な操作は限られます。例: + +``` +%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`はチャンネルに接続する際のパラメータです。チャンネルによって接続時に必要とされるパラメータは異なります。パラメータ不要のチャンネルに接続する際は、このプロパティは省略可能です。 + +
+

IDはチャンネルごとではなく「チャンネルの接続ごと」です。なぜなら、同じチャンネルに異なるパラメータで複数接続するケースもあるからです。

+
+ +### チャンネルからのメッセージを受け取る +例えばタイムラインのチャンネルなら、新しい投稿があった時にメッセージを発します。そのメッセージを受け取ることで、タイムラインに新しい投稿がされたことをリアルタイムで知ることができます。 + +チャンネルがメッセージを発すると、次のようなデータが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`には、エンドポイントのパラメータを含めます。 + +
+

APIのエンドポイントやパラメータについてはAPIリファレンスをご確認ください。

+
+ +### レスポンスの受信 + +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 000000000..c3e10ce56 --- /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 000000000..01bf294d5 --- /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 000000000..fb125a89e --- /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 000000000..76019b614 --- /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 000000000..ec17b9518 --- /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 000000000..2bef4a563 --- /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 000000000..73e9efdaa --- /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 000000000..3e71012b5 --- /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 000000000..84ec552cd --- /dev/null +++ b/src/docs/en-US/keyboard-shortcut.md @@ -0,0 +1,68 @@ +# キーボードショートカット + +## Global +これらのショートカットは基本的にどこでも使えます。 + + + + + + + + + + + +
ショートカット効果由来
P, N新規投稿Post, New, Note
Tタイムラインの最も新しい投稿にフォーカスTimeline, Top
Shift + N通知を表示/隠すNotifications
SSearchSearch
H, ?ヘルプを表示Help
+ +## 投稿にフォーカスされた状態 + + + + + + + + + + + + + + + + + + + +
ショートカット効果由来
, K, Shift + Tab上の投稿にフォーカスを移動-
, J, Tab下の投稿にフォーカスを移動-
R返信フォームを開くReply
QRenoteフォームを開くQuote
Ctrl + Q即刻Renoteする(フォームを開かずに)-
E, A, +リアクションフォームを開くEmote, reAction
0~9数字に対応したリアクションをする(対応については後述)-
F, Bお気に入りに登録Favorite, Bookmark
Del, Ctrl + D投稿を削除Delete
M, O投稿に対するメニューを開くMore, Other
SCWで隠された部分を表示 or 隠すShow, See
Escフォーカスを外す-
+ +## Renoteフォーム + + + + + + + + + + +
ショートカット効果由来
EnterRenoteする-
Qフォームを展開するQuote
Escフォームを閉じる-
+ +## リアクションフォーム +デフォルトで「👍」にフォーカスが当たっている状態です。 + + + + + + + + + + + + + +
ショートカット効果由来
, K上のリアクションにフォーカスを移動-
, J下のリアクションにフォーカスを移動-
, H, Shift + Tab左のリアクションにフォーカスを移動-
, L, Tab右のリアクションにフォーカスを移動-
Enter, Space, +リアクション確定-
0~9数字に対応したリアクションで確定-
Escリアクションするのをやめる-
diff --git a/src/docs/en-US/mfm.md b/src/docs/en-US/mfm.md new file mode 100644 index 000000000..e237287ac --- /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 000000000..306beee57 --- /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 000000000..7fc6ee29c --- /dev/null +++ b/src/docs/en-US/pages.md @@ -0,0 +1,10 @@ +# Pages + +## Variables +変数を使うことで動的なページを作成できます。テキスト内で { 変数名 } と書くとそこに変数の値を埋め込めます。例えば Hello { thing } world! というテキストで、変数(thing)の値が ai だった場合、テキストは Hello ai world! になります。 + +変数の評価(値を算出すること)は上から下に行われるので、ある変数の中で自分より下の変数を参照することはできません。例えば上から A、B、C と3つの変数を定義したとき、Cの中でABを参照することはできますが、Aの中でBCを参照することはできません。 + +ユーザーからの入力を受け取るには、ページに「ユーザー入力」ブロックを設置し、「変数名」に入力を格納したい変数名を設定します(変数は自動で作成されます)。その変数を使ってユーザー入力に応じた動作を行えます。 + +関数を使うと、値の算出処理を再利用可能な形にまとめることができます。関数を作るには、「関数」タイプの変数を作成します。関数にはスロット(引数)を設定することができ、スロットの値は関数内で変数として利用可能です。また、関数を引数に取る関数(高階関数と呼ばれます)も存在します。関数は予め定義しておくほかに、このような高階関数のスロットに即席でセットすることもできます。 diff --git a/src/docs/en-US/reaction.md b/src/docs/en-US/reaction.md new file mode 100644 index 000000000..917556e84 --- /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 000000000..f1be888cb --- /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`。 + +## 投了する +投了をするには、このエンドポイントにリクエストします。 diff --git a/src/docs/en-US/stream.md b/src/docs/en-US/stream.md new file mode 100644 index 000000000..07c4f42cf --- /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キーや、アプリケーションからストリームに接続する際はユーザーのアクセストークンのことを指します。 + +
+

認証情報の取得については、こちらのドキュメントをご確認ください。

+
+ +--- + +認証情報は省略することもできますが、その場合非ログインでの利用ということになり、受信できる情報や可能な操作は限られます。例: + +``` +%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`はチャンネルに接続する際のパラメータです。チャンネルによって接続時に必要とされるパラメータは異なります。パラメータ不要のチャンネルに接続する際は、このプロパティは省略可能です。 + +
+

IDはチャンネルごとではなく「チャンネルの接続ごと」です。なぜなら、同じチャンネルに異なるパラメータで複数接続するケースもあるからです。

+
+ +### チャンネルからのメッセージを受け取る +例えばタイムラインのチャンネルなら、新しい投稿があった時にメッセージを発します。そのメッセージを受け取ることで、タイムラインに新しい投稿がされたことをリアルタイムで知ることができます。 + +チャンネルがメッセージを発すると、次のようなデータが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`には、エンドポイントのパラメータを含めます。 + +
+

APIのエンドポイントやパラメータについてはAPIリファレンスをご確認ください。

+
+ +### レスポンスの受信 + +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 000000000..10b419cfb --- /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 000000000..ec5fa1a77 --- /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 000000000..9dc4f1c97 --- /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 000000000..76019b614 --- /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 000000000..46db70220 --- /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 000000000..842db20f0 --- /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 000000000..73e9efdaa --- /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 000000000..474cc594f --- /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 000000000..27162c6b2 --- /dev/null +++ b/src/docs/es-ES/keyboard-shortcut.md @@ -0,0 +1,68 @@ +# キーボードショートカット + +## Global +これらのショートカットは基本的にどこでも使えます。 + + + + + + + + + + + +
ショートカット効果由来
P, N新規投稿Post, New, Note
Tタイムラインの最も新しい投稿にフォーカスTimeline, Top
Shift + N通知を表示/隠すNotifications
SBuscarSearch
H, ?ヘルプを表示Help
+ +## 投稿にフォーカスされた状態 + + + + + + + + + + + + + + + + + + + +
ショートカット効果由来
, K, Shift + Tab上の投稿にフォーカスを移動-
, J, Tab下の投稿にフォーカスを移動-
R返信フォームを開くReply
QRenoteフォームを開くQuote
Ctrl + Q即刻Renoteする(フォームを開かずに)-
E, A, +リアクションフォームを開くEmote, reAction
0~9数字に対応したリアクションをする(対応については後述)-
F, Bお気に入りに登録Favorite, Bookmark
Del, Ctrl + D投稿を削除Delete
M, O投稿に対するメニューを開くMore, Other
SCWで隠された部分を表示 or 隠すShow, See
Escフォーカスを外す-
+ +## Renoteフォーム + + + + + + + + + + +
ショートカット効果由来
EnterRenoteする-
Qフォームを展開するQuote
Escフォームを閉じる-
+ +## リアクションフォーム +デフォルトで「👍」にフォーカスが当たっている状態です。 + + + + + + + + + + + + + +
ショートカット効果由来
, K上のリアクションにフォーカスを移動-
, J下のリアクションにフォーカスを移動-
, H, Shift + Tab左のリアクションにフォーカスを移動-
, L, Tab右のリアクションにフォーカスを移動-
Enter, Space, +リアクション確定-
0~9数字に対応したリアクションで確定-
Escリアクションするのをやめる-
diff --git a/src/docs/es-ES/mfm.md b/src/docs/es-ES/mfm.md new file mode 100644 index 000000000..e237287ac --- /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 000000000..331e5cc10 --- /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 000000000..7fc6ee29c --- /dev/null +++ b/src/docs/es-ES/pages.md @@ -0,0 +1,10 @@ +# Pages + +## Variables +変数を使うことで動的なページを作成できます。テキスト内で { 変数名 } と書くとそこに変数の値を埋め込めます。例えば Hello { thing } world! というテキストで、変数(thing)の値が ai だった場合、テキストは Hello ai world! になります。 + +変数の評価(値を算出すること)は上から下に行われるので、ある変数の中で自分より下の変数を参照することはできません。例えば上から A、B、C と3つの変数を定義したとき、Cの中でABを参照することはできますが、Aの中でBCを参照することはできません。 + +ユーザーからの入力を受け取るには、ページに「ユーザー入力」ブロックを設置し、「変数名」に入力を格納したい変数名を設定します(変数は自動で作成されます)。その変数を使ってユーザー入力に応じた動作を行えます。 + +関数を使うと、値の算出処理を再利用可能な形にまとめることができます。関数を作るには、「関数」タイプの変数を作成します。関数にはスロット(引数)を設定することができ、スロットの値は関数内で変数として利用可能です。また、関数を引数に取る関数(高階関数と呼ばれます)も存在します。関数は予め定義しておくほかに、このような高階関数のスロットに即席でセットすることもできます。 diff --git a/src/docs/es-ES/reaction.md b/src/docs/es-ES/reaction.md new file mode 100644 index 000000000..ac10a52f5 --- /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 000000000..1019fa447 --- /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`。 + +## 投了する +投了をするには、このエンドポイントにリクエストします。 diff --git a/src/docs/es-ES/stream.md b/src/docs/es-ES/stream.md new file mode 100644 index 000000000..c32579c14 --- /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キーや、アプリケーションからストリームに接続する際はユーザーのアクセストークンのことを指します。 + +
+

認証情報の取得については、こちらのドキュメントをご確認ください。

+
+ +--- + +認証情報は省略することもできますが、その場合非ログインでの利用ということになり、受信できる情報や可能な操作は限られます。例: + +``` +%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`はチャンネルに接続する際のパラメータです。チャンネルによって接続時に必要とされるパラメータは異なります。パラメータ不要のチャンネルに接続する際は、このプロパティは省略可能です。 + +
+

IDはチャンネルごとではなく「チャンネルの接続ごと」です。なぜなら、同じチャンネルに異なるパラメータで複数接続するケースもあるからです。

+
+ +### チャンネルからのメッセージを受け取る +例えばタイムラインのチャンネルなら、新しい投稿があった時にメッセージを発します。そのメッセージを受け取ることで、タイムラインに新しい投稿がされたことをリアルタイムで知ることができます。 + +チャンネルがメッセージを発すると、次のようなデータが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`には、エンドポイントのパラメータを含めます。 + +
+

APIのエンドポイントやパラメータについてはAPIリファレンスをご確認ください。

+
+ +### レスポンスの受信 + +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 000000000..b6490106d --- /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 000000000..d2ee592fd --- /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 000000000..cd29b4eba --- /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 000000000..76019b614 --- /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 000000000..540909de4 --- /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 000000000..01840868e --- /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 000000000..73e9efdaa --- /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 000000000..93c8428e2 --- /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 000000000..35bebbcde --- /dev/null +++ b/src/docs/fr-FR/keyboard-shortcut.md @@ -0,0 +1,68 @@ +# キーボードショートカット + +## Global +これらのショートカットは基本的にどこでも使えます。 + + + + + + + + + + + +
ショートカット効果由来
P, N新規投稿Post, New, Note
Tタイムラインの最も新しい投稿にフォーカスTimeline, Top
Shift + N通知を表示/隠すNotifications
SRechercherSearch
H, ?ヘルプを表示Help
+ +## 投稿にフォーカスされた状態 + + + + + + + + + + + + + + + + + + + +
ショートカット効果由来
, K, Shift + Tab上の投稿にフォーカスを移動-
, J, Tab下の投稿にフォーカスを移動-
R返信フォームを開くReply
QRenoteフォームを開くQuote
Ctrl + Q即刻Renoteする(フォームを開かずに)-
E, A, +リアクションフォームを開くEmote, reAction
0~9数字に対応したリアクションをする(対応については後述)-
F, Bお気に入りに登録Favorite, Bookmark
Del, Ctrl + D投稿を削除Delete
M, O投稿に対するメニューを開くMore, Other
SCWで隠された部分を表示 or 隠すShow, See
Escフォーカスを外す-
+ +## Renoteフォーム + + + + + + + + + + +
ショートカット効果由来
EnterRenoteする-
Qフォームを展開するQuote
Escフォームを閉じる-
+ +## リアクションフォーム +デフォルトで「👍」にフォーカスが当たっている状態です。 + + + + + + + + + + + + + +
ショートカット効果由来
, K上のリアクションにフォーカスを移動-
, J下のリアクションにフォーカスを移動-
, H, Shift + Tab左のリアクションにフォーカスを移動-
, L, Tab右のリアクションにフォーカスを移動-
Enter, Space, +リアクション確定-
0~9数字に対応したリアクションで確定-
Escリアクションするのをやめる-
diff --git a/src/docs/fr-FR/mfm.md b/src/docs/fr-FR/mfm.md new file mode 100644 index 000000000..e237287ac --- /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 000000000..051dddfa9 --- /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 000000000..7fc6ee29c --- /dev/null +++ b/src/docs/fr-FR/pages.md @@ -0,0 +1,10 @@ +# Pages + +## Variables +変数を使うことで動的なページを作成できます。テキスト内で { 変数名 } と書くとそこに変数の値を埋め込めます。例えば Hello { thing } world! というテキストで、変数(thing)の値が ai だった場合、テキストは Hello ai world! になります。 + +変数の評価(値を算出すること)は上から下に行われるので、ある変数の中で自分より下の変数を参照することはできません。例えば上から A、B、C と3つの変数を定義したとき、Cの中でABを参照することはできますが、Aの中でBCを参照することはできません。 + +ユーザーからの入力を受け取るには、ページに「ユーザー入力」ブロックを設置し、「変数名」に入力を格納したい変数名を設定します(変数は自動で作成されます)。その変数を使ってユーザー入力に応じた動作を行えます。 + +関数を使うと、値の算出処理を再利用可能な形にまとめることができます。関数を作るには、「関数」タイプの変数を作成します。関数にはスロット(引数)を設定することができ、スロットの値は関数内で変数として利用可能です。また、関数を引数に取る関数(高階関数と呼ばれます)も存在します。関数は予め定義しておくほかに、このような高階関数のスロットに即席でセットすることもできます。 diff --git a/src/docs/fr-FR/reaction.md b/src/docs/fr-FR/reaction.md new file mode 100644 index 000000000..d0df05530 --- /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 000000000..8c9483105 --- /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`。 + +## 投了する +投了をするには、このエンドポイントにリクエストします。 diff --git a/src/docs/fr-FR/stream.md b/src/docs/fr-FR/stream.md new file mode 100644 index 000000000..04dad6679 --- /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キーや、アプリケーションからストリームに接続する際はユーザーのアクセストークンのことを指します。 + +
+

認証情報の取得については、こちらのドキュメントをご確認ください。

+
+ +--- + +認証情報は省略することもできますが、その場合非ログインでの利用ということになり、受信できる情報や可能な操作は限られます。例: + +``` +%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`はチャンネルに接続する際のパラメータです。チャンネルによって接続時に必要とされるパラメータは異なります。パラメータ不要のチャンネルに接続する際は、このプロパティは省略可能です。 + +
+

IDはチャンネルごとではなく「チャンネルの接続ごと」です。なぜなら、同じチャンネルに異なるパラメータで複数接続するケースもあるからです。

+
+ +### チャンネルからのメッセージを受け取る +例えばタイムラインのチャンネルなら、新しい投稿があった時にメッセージを発します。そのメッセージを受け取ることで、タイムラインに新しい投稿がされたことをリアルタイムで知ることができます。 + +チャンネルがメッセージを発すると、次のようなデータが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`には、エンドポイントのパラメータを含めます。 + +
+

APIのエンドポイントやパラメータについてはAPIリファレンスをご確認ください。

+
+ +### レスポンスの受信 + +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 000000000..9c706c826 --- /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 000000000..c674db824 --- /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 000000000..6c28b446e --- /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 000000000..76019b614 --- /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 000000000..0d2fa1917 --- /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 000000000..ed2e92be1 --- /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 000000000..8057e262f --- /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 000000000..3c1ea7bbe --- /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 000000000..8469098cf --- /dev/null +++ b/src/docs/ja-KS/keyboard-shortcut.md @@ -0,0 +1,68 @@ +# キーボードショートカット + +## グローバル +これらのショートカットは基本的にどこでも使えます。 + + + + + + + + + + + +
ショートカット効果由来
P, N新規投稿Post, New, Note
Tタイムラインの最も新しい投稿にフォーカスTimeline, Top
Shift + N通知を表示/隠すNotifications
S探すSearch
H, ?ヘルプを表示Help
+ +## 投稿にフォーカスされた状態 + + + + + + + + + + + + + + + + + + + +
ショートカット効果由来
, K, Shift + Tab上の投稿にフォーカスを移動-
, J, Tab下の投稿にフォーカスを移動-
R返信フォームを開くReply
QRenoteフォームを開くQuote
Ctrl + Q即刻Renoteする(フォームを開かずに)-
E, A, +リアクションフォームを開くEmote, reAction
0~9数字に対応したリアクションをする(対応については後述)-
F, Bお気に入りに登録Favorite, Bookmark
Del, Ctrl + D投稿を削除Delete
M, O投稿に対するメニューを開くMore, Other
SCWで隠された部分を表示 or 隠すShow, See
Escフォーカスを外す-
+ +## Renoteフォーム + + + + + + + + + + +
ショートカット効果由来
EnterRenoteする-
Qフォームを展開するQuote
Escフォームを閉じる-
+ +## リアクションフォーム +デフォルトで「👍」にフォーカスが当たっている状態です。 + + + + + + + + + + + + + +
ショートカット効果由来
, K上のリアクションにフォーカスを移動-
, J下のリアクションにフォーカスを移動-
, H, Shift + Tab左のリアクションにフォーカスを移動-
, L, Tab右のリアクションにフォーカスを移動-
Enter, Space, +リアクション確定-
0~9数字に対応したリアクションで確定-
Escリアクションするのをやめる-
diff --git a/src/docs/ja-KS/mfm.md b/src/docs/ja-KS/mfm.md new file mode 100644 index 000000000..e237287ac --- /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 000000000..6a9608662 --- /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 000000000..a7311b95e --- /dev/null +++ b/src/docs/ja-KS/pages.md @@ -0,0 +1,10 @@ +# Pages + +## 変数 +変数を使うことで動的なページを作成できます。テキスト内で { 変数名 } と書くとそこに変数の値を埋め込めます。例えば Hello { thing } world! というテキストで、変数(thing)の値が ai だった場合、テキストは Hello ai world! になります。 + +変数の評価(値を算出すること)は上から下に行われるので、ある変数の中で自分より下の変数を参照することはできません。例えば上から A、B、C と3つの変数を定義したとき、Cの中でABを参照することはできますが、Aの中でBCを参照することはできません。 + +ユーザーからの入力を受け取るには、ページに「ユーザー入力」ブロックを設置し、「変数名」に入力を格納したい変数名を設定します(変数は自動で作成されます)。その変数を使ってユーザー入力に応じた動作を行えます。 + +関数を使うと、値の算出処理を再利用可能な形にまとめることができます。関数を作るには、「関数」タイプの変数を作成します。関数にはスロット(引数)を設定することができ、スロットの値は関数内で変数として利用可能です。また、関数を引数に取る関数(高階関数と呼ばれます)も存在します。関数は予め定義しておくほかに、このような高階関数のスロットに即席でセットすることもできます。 diff --git a/src/docs/ja-KS/reaction.md b/src/docs/ja-KS/reaction.md new file mode 100644 index 000000000..c26ead75b --- /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 000000000..7ab2a7212 --- /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`。 + +## 投了する +投了をするには、このエンドポイントにリクエストします。 diff --git a/src/docs/ja-KS/stream.md b/src/docs/ja-KS/stream.md new file mode 100644 index 000000000..9011c37c5 --- /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キーや、アプリケーションからストリームに接続する際はユーザーのアクセストークンのことを指します。 + +
+

認証情報の取得については、こちらのドキュメントをご確認ください。

+
+ +--- + +認証情報は省略することもできますが、その場合非ログインでの利用ということになり、受信できる情報や可能な操作は限られます。例: + +``` +%WS_URL%/streaming +``` + +--- + +ストリームに接続すると、後述するAPI操作や、投稿の購読を行ったりすることができます。 しかしまだこの段階では、例えばタイムラインへの新しい投稿を受信したりすることはできません。 それを行うには、ストリーム上で、後述する**チャンネル**に接続する必要があります。 + +**ストリームでのやり取りはすべてJSONです。** + +## チャンネル +MisskeyのストリーミングAPIにはチャンネルという概念があります。これは、送受信する情報を分離するための仕組みです。 Misskeyのストリームに接続しただけでは、まだリアルタイムでタイムラインの投稿を受信したりはできません。 ストリーム上でチャンネルに接続することで、様々な情報を受け取ったり情報を送信したりすることができるようになります。 + +### チャンネルに接続する +チャンネルに接続するには、次のようなデータをJSONでストリームに送信します: + +```json +{ + type: 'connect', + body: { + channel: 'xxxxxxxx', + id: 'foobar', + params: { + ... + } + } +} +``` + +ここで、 +* `channel`には接続したいチャンネル名を設定します。チャンネルの種類については後述します。 +* `id`にはそのチャンネルとやり取りするための任意のIDを設定します。ストリームでは様々なメッセージが流れるので、そのメッセージがどのチャンネルからのものなのか識別する必要があるからです。このIDは、UUIDや、乱数のようなもので構いません。 +* `params`はチャンネルに接続する際のパラメータです。チャンネルによって接続時に必要とされるパラメータは異なります。パラメータ不要のチャンネルに接続する際は、このプロパティは省略可能です。 + +
+

IDはチャンネルごとではなく「チャンネルの接続ごと」です。なぜなら、同じチャンネルに異なるパラメータで複数接続するケースもあるからです。

+
+ +### チャンネルからのメッセージを受け取る +例えばタイムラインのチャンネルなら、新しい投稿があった時にメッセージを発します。そのメッセージを受け取ることで、タイムラインに新しい投稿がされたことをリアルタイムで知ることができます。 + +チャンネルがメッセージを発すると、次のようなデータが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`には、エンドポイントのパラメータを含めます。 + +
+

APIのエンドポイントやパラメータについてはAPIリファレンスをご確認ください。

+
+ +### レスポンスの受信 + +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 000000000..4e52ee8cd --- /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 000000000..36ba61bd2 --- /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 000000000..6c28b446e --- /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 000000000..76019b614 --- /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 000000000..0d2fa1917 --- /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 000000000..ed2e92be1 --- /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 000000000..8057e262f --- /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 000000000..500073a4b --- /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 000000000..3b15afa68 --- /dev/null +++ b/src/docs/kab-KAB/keyboard-shortcut.md @@ -0,0 +1,68 @@ +# キーボードショートカット + +## グローバル +これらのショートカットは基本的にどこでも使えます。 + + + + + + + + + + + +
ショートカット効果由来
P, N新規投稿Post, New, Note
Tタイムラインの最も新しい投稿にフォーカスTimeline, Top
Shift + N通知を表示/隠すNotifications
SNadiSearch
H, ?ヘルプを表示Help
+ +## 投稿にフォーカスされた状態 + + + + + + + + + + + + + + + + + + + +
ショートカット効果由来
, K, Shift + Tab上の投稿にフォーカスを移動-
, J, Tab下の投稿にフォーカスを移動-
R返信フォームを開くReply
QRenoteフォームを開くQuote
Ctrl + Q即刻Renoteする(フォームを開かずに)-
E, A, +リアクションフォームを開くEmote, reAction
0~9数字に対応したリアクションをする(対応については後述)-
F, Bお気に入りに登録Favorite, Bookmark
Del, Ctrl + D投稿を削除Delete
M, O投稿に対するメニューを開くMore, Other
SCWで隠された部分を表示 or 隠すShow, See
Escフォーカスを外す-
+ +## Renoteフォーム + + + + + + + + + + +
ショートカット効果由来
EnterRenoteする-
Qフォームを展開するQuote
Escフォームを閉じる-
+ +## リアクションフォーム +デフォルトで「👍」にフォーカスが当たっている状態です。 + + + + + + + + + + + + + +
ショートカット効果由来
, K上のリアクションにフォーカスを移動-
, J下のリアクションにフォーカスを移動-
, H, Shift + Tab左のリアクションにフォーカスを移動-
, L, Tab右のリアクションにフォーカスを移動-
Enter, Space, +リアクション確定-
0~9数字に対応したリアクションで確定-
Escリアクションするのをやめる-
diff --git a/src/docs/kab-KAB/mfm.md b/src/docs/kab-KAB/mfm.md new file mode 100644 index 000000000..e237287ac --- /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 000000000..6a9608662 --- /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 000000000..a7311b95e --- /dev/null +++ b/src/docs/kab-KAB/pages.md @@ -0,0 +1,10 @@ +# Pages + +## 変数 +変数を使うことで動的なページを作成できます。テキスト内で { 変数名 } と書くとそこに変数の値を埋め込めます。例えば Hello { thing } world! というテキストで、変数(thing)の値が ai だった場合、テキストは Hello ai world! になります。 + +変数の評価(値を算出すること)は上から下に行われるので、ある変数の中で自分より下の変数を参照することはできません。例えば上から A、B、C と3つの変数を定義したとき、Cの中でABを参照することはできますが、Aの中でBCを参照することはできません。 + +ユーザーからの入力を受け取るには、ページに「ユーザー入力」ブロックを設置し、「変数名」に入力を格納したい変数名を設定します(変数は自動で作成されます)。その変数を使ってユーザー入力に応じた動作を行えます。 + +関数を使うと、値の算出処理を再利用可能な形にまとめることができます。関数を作るには、「関数」タイプの変数を作成します。関数にはスロット(引数)を設定することができ、スロットの値は関数内で変数として利用可能です。また、関数を引数に取る関数(高階関数と呼ばれます)も存在します。関数は予め定義しておくほかに、このような高階関数のスロットに即席でセットすることもできます。 diff --git a/src/docs/kab-KAB/reaction.md b/src/docs/kab-KAB/reaction.md new file mode 100644 index 000000000..c26ead75b --- /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 000000000..7ab2a7212 --- /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`。 + +## 投了する +投了をするには、このエンドポイントにリクエストします。 diff --git a/src/docs/kab-KAB/stream.md b/src/docs/kab-KAB/stream.md new file mode 100644 index 000000000..9011c37c5 --- /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キーや、アプリケーションからストリームに接続する際はユーザーのアクセストークンのことを指します。 + +
+

認証情報の取得については、こちらのドキュメントをご確認ください。

+
+ +--- + +認証情報は省略することもできますが、その場合非ログインでの利用ということになり、受信できる情報や可能な操作は限られます。例: + +``` +%WS_URL%/streaming +``` + +--- + +ストリームに接続すると、後述するAPI操作や、投稿の購読を行ったりすることができます。 しかしまだこの段階では、例えばタイムラインへの新しい投稿を受信したりすることはできません。 それを行うには、ストリーム上で、後述する**チャンネル**に接続する必要があります。 + +**ストリームでのやり取りはすべてJSONです。** + +## チャンネル +MisskeyのストリーミングAPIにはチャンネルという概念があります。これは、送受信する情報を分離するための仕組みです。 Misskeyのストリームに接続しただけでは、まだリアルタイムでタイムラインの投稿を受信したりはできません。 ストリーム上でチャンネルに接続することで、様々な情報を受け取ったり情報を送信したりすることができるようになります。 + +### チャンネルに接続する +チャンネルに接続するには、次のようなデータをJSONでストリームに送信します: + +```json +{ + type: 'connect', + body: { + channel: 'xxxxxxxx', + id: 'foobar', + params: { + ... + } + } +} +``` + +ここで、 +* `channel`には接続したいチャンネル名を設定します。チャンネルの種類については後述します。 +* `id`にはそのチャンネルとやり取りするための任意のIDを設定します。ストリームでは様々なメッセージが流れるので、そのメッセージがどのチャンネルからのものなのか識別する必要があるからです。このIDは、UUIDや、乱数のようなもので構いません。 +* `params`はチャンネルに接続する際のパラメータです。チャンネルによって接続時に必要とされるパラメータは異なります。パラメータ不要のチャンネルに接続する際は、このプロパティは省略可能です。 + +
+

IDはチャンネルごとではなく「チャンネルの接続ごと」です。なぜなら、同じチャンネルに異なるパラメータで複数接続するケースもあるからです。

+
+ +### チャンネルからのメッセージを受け取る +例えばタイムラインのチャンネルなら、新しい投稿があった時にメッセージを発します。そのメッセージを受け取ることで、タイムラインに新しい投稿がされたことをリアルタイムで知ることができます。 + +チャンネルがメッセージを発すると、次のようなデータが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`には、エンドポイントのパラメータを含めます。 + +
+

APIのエンドポイントやパラメータについてはAPIリファレンスをご確認ください。

+
+ +### レスポンスの受信 + +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 000000000..4e52ee8cd --- /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 000000000..36ba61bd2 --- /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 000000000..6c28b446e --- /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 000000000..76019b614 --- /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 000000000..0d2fa1917 --- /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 000000000..ed2e92be1 --- /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 000000000..8057e262f --- /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 000000000..3c1ea7bbe --- /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 000000000..e8ba41571 --- /dev/null +++ b/src/docs/kn-IN/keyboard-shortcut.md @@ -0,0 +1,68 @@ +# キーボードショートカット + +## グローバル +これらのショートカットは基本的にどこでも使えます。 + + + + + + + + + + + +
ショートカット効果由来
P, N新規投稿Post, New, Note
Tタイムラインの最も新しい投稿にフォーカスTimeline, Top
Shift + N通知を表示/隠すNotifications
SಹುಡುಕುSearch
H, ?ヘルプを表示Help
+ +## 投稿にフォーカスされた状態 + + + + + + + + + + + + + + + + + + + +
ショートカット効果由来
, K, Shift + Tab上の投稿にフォーカスを移動-
, J, Tab下の投稿にフォーカスを移動-
R返信フォームを開くReply
QRenoteフォームを開くQuote
Ctrl + Q即刻Renoteする(フォームを開かずに)-
E, A, +リアクションフォームを開くEmote, reAction
0~9数字に対応したリアクションをする(対応については後述)-
F, Bお気に入りに登録Favorite, Bookmark
Del, Ctrl + D投稿を削除Delete
M, O投稿に対するメニューを開くMore, Other
SCWで隠された部分を表示 or 隠すShow, See
Escフォーカスを外す-
+ +## Renoteフォーム + + + + + + + + + + +
ショートカット効果由来
EnterRenoteする-
Qフォームを展開するQuote
Escフォームを閉じる-
+ +## リアクションフォーム +デフォルトで「👍」にフォーカスが当たっている状態です。 + + + + + + + + + + + + + +
ショートカット効果由来
, K上のリアクションにフォーカスを移動-
, J下のリアクションにフォーカスを移動-
, H, Shift + Tab左のリアクションにフォーカスを移動-
, L, Tab右のリアクションにフォーカスを移動-
Enter, Space, +リアクション確定-
0~9数字に対応したリアクションで確定-
Escリアクションするのをやめる-
diff --git a/src/docs/kn-IN/mfm.md b/src/docs/kn-IN/mfm.md new file mode 100644 index 000000000..e237287ac --- /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 000000000..6a9608662 --- /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 000000000..a7311b95e --- /dev/null +++ b/src/docs/kn-IN/pages.md @@ -0,0 +1,10 @@ +# Pages + +## 変数 +変数を使うことで動的なページを作成できます。テキスト内で { 変数名 } と書くとそこに変数の値を埋め込めます。例えば Hello { thing } world! というテキストで、変数(thing)の値が ai だった場合、テキストは Hello ai world! になります。 + +変数の評価(値を算出すること)は上から下に行われるので、ある変数の中で自分より下の変数を参照することはできません。例えば上から A、B、C と3つの変数を定義したとき、Cの中でABを参照することはできますが、Aの中でBCを参照することはできません。 + +ユーザーからの入力を受け取るには、ページに「ユーザー入力」ブロックを設置し、「変数名」に入力を格納したい変数名を設定します(変数は自動で作成されます)。その変数を使ってユーザー入力に応じた動作を行えます。 + +関数を使うと、値の算出処理を再利用可能な形にまとめることができます。関数を作るには、「関数」タイプの変数を作成します。関数にはスロット(引数)を設定することができ、スロットの値は関数内で変数として利用可能です。また、関数を引数に取る関数(高階関数と呼ばれます)も存在します。関数は予め定義しておくほかに、このような高階関数のスロットに即席でセットすることもできます。 diff --git a/src/docs/kn-IN/reaction.md b/src/docs/kn-IN/reaction.md new file mode 100644 index 000000000..c26ead75b --- /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 000000000..7ab2a7212 --- /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`。 + +## 投了する +投了をするには、このエンドポイントにリクエストします。 diff --git a/src/docs/kn-IN/stream.md b/src/docs/kn-IN/stream.md new file mode 100644 index 000000000..9011c37c5 --- /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キーや、アプリケーションからストリームに接続する際はユーザーのアクセストークンのことを指します。 + +
+

認証情報の取得については、こちらのドキュメントをご確認ください。

+
+ +--- + +認証情報は省略することもできますが、その場合非ログインでの利用ということになり、受信できる情報や可能な操作は限られます。例: + +``` +%WS_URL%/streaming +``` + +--- + +ストリームに接続すると、後述するAPI操作や、投稿の購読を行ったりすることができます。 しかしまだこの段階では、例えばタイムラインへの新しい投稿を受信したりすることはできません。 それを行うには、ストリーム上で、後述する**チャンネル**に接続する必要があります。 + +**ストリームでのやり取りはすべてJSONです。** + +## チャンネル +MisskeyのストリーミングAPIにはチャンネルという概念があります。これは、送受信する情報を分離するための仕組みです。 Misskeyのストリームに接続しただけでは、まだリアルタイムでタイムラインの投稿を受信したりはできません。 ストリーム上でチャンネルに接続することで、様々な情報を受け取ったり情報を送信したりすることができるようになります。 + +### チャンネルに接続する +チャンネルに接続するには、次のようなデータをJSONでストリームに送信します: + +```json +{ + type: 'connect', + body: { + channel: 'xxxxxxxx', + id: 'foobar', + params: { + ... + } + } +} +``` + +ここで、 +* `channel`には接続したいチャンネル名を設定します。チャンネルの種類については後述します。 +* `id`にはそのチャンネルとやり取りするための任意のIDを設定します。ストリームでは様々なメッセージが流れるので、そのメッセージがどのチャンネルからのものなのか識別する必要があるからです。このIDは、UUIDや、乱数のようなもので構いません。 +* `params`はチャンネルに接続する際のパラメータです。チャンネルによって接続時に必要とされるパラメータは異なります。パラメータ不要のチャンネルに接続する際は、このプロパティは省略可能です。 + +
+

IDはチャンネルごとではなく「チャンネルの接続ごと」です。なぜなら、同じチャンネルに異なるパラメータで複数接続するケースもあるからです。

+
+ +### チャンネルからのメッセージを受け取る +例えばタイムラインのチャンネルなら、新しい投稿があった時にメッセージを発します。そのメッセージを受け取ることで、タイムラインに新しい投稿がされたことをリアルタイムで知ることができます。 + +チャンネルがメッセージを発すると、次のようなデータが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`には、エンドポイントのパラメータを含めます。 + +
+

APIのエンドポイントやパラメータについてはAPIリファレンスをご確認ください。

+
+ +### レスポンスの受信 + +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 000000000..4e52ee8cd --- /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 000000000..36ba61bd2 --- /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 000000000..794ee8ece --- /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 000000000..76019b614 --- /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 000000000..1562060d7 --- /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 000000000..6aa3a0fe4 --- /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 000000000..87c95d45b --- /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 000000000..197aee13c --- /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 000000000..074431e1e --- /dev/null +++ b/src/docs/ko-KR/keyboard-shortcut.md @@ -0,0 +1,68 @@ +# キーボードショートカット + +## 글로벌 +これらのショートカットは基本的にどこでも使えます。 + + + + + + + + + + + +
ショートカット効果由来
P, N新規投稿Post, New, Note
Tタイムラインの最も新しい投稿にフォーカスTimeline, Top
Shift + N通知を表示/隠すNotifications
S검색Search
H, ?ヘルプを表示Help
+ +## 投稿にフォーカスされた状態 + + + + + + + + + + + + + + + + + + + +
ショートカット効果由来
, K, Shift + Tab上の投稿にフォーカスを移動-
, J, Tab下の投稿にフォーカスを移動-
R返信フォームを開くReply
QRenoteフォームを開くQuote
Ctrl + Q即刻Renoteする(フォームを開かずに)-
E, A, +リアクションフォームを開くEmote, reAction
0~9数字に対応したリアクションをする(対応については後述)-
F, Bお気に入りに登録Favorite, Bookmark
Del, Ctrl + D投稿を削除Delete
M, O投稿に対するメニューを開くMore, Other
SCWで隠された部分を表示 or 隠すShow, See
Escフォーカスを外す-
+ +## Renoteフォーム + + + + + + + + + + +
ショートカット効果由来
EnterRenoteする-
Qフォームを展開するQuote
Escフォームを閉じる-
+ +## リアクションフォーム +デフォルトで「👍」にフォーカスが当たっている状態です。 + + + + + + + + + + + + + +
ショートカット効果由来
, K上のリアクションにフォーカスを移動-
, J下のリアクションにフォーカスを移動-
, H, Shift + Tab左のリアクションにフォーカスを移動-
, L, Tab右のリアクションにフォーカスを移動-
Enter, Space, +リアクション確定-
0~9数字に対応したリアクションで確定-
Escリアクションするのをやめる-
diff --git a/src/docs/ko-KR/mfm.md b/src/docs/ko-KR/mfm.md new file mode 100644 index 000000000..e237287ac --- /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 000000000..89195bb10 --- /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 000000000..54bc85371 --- /dev/null +++ b/src/docs/ko-KR/pages.md @@ -0,0 +1,10 @@ +# Pages + +## 변수 +変数を使うことで動的なページを作成できます。テキスト内で { 変数名 } と書くとそこに変数の値を埋め込めます。例えば Hello { thing } world! というテキストで、変数(thing)の値が ai だった場合、テキストは Hello ai world! になります。 + +変数の評価(値を算出すること)は上から下に行われるので、ある変数の中で自分より下の変数を参照することはできません。例えば上から A、B、C と3つの変数を定義したとき、Cの中でABを参照することはできますが、Aの中でBCを参照することはできません。 + +ユーザーからの入力を受け取るには、ページに「ユーザー入力」ブロックを設置し、「変数名」に入力を格納したい変数名を設定します(変数は自動で作成されます)。その変数を使ってユーザー入力に応じた動作を行えます。 + +関数を使うと、値の算出処理を再利用可能な形にまとめることができます。関数を作るには、「関数」タイプの変数を作成します。関数にはスロット(引数)を設定することができ、スロットの値は関数内で変数として利用可能です。また、関数を引数に取る関数(高階関数と呼ばれます)も存在します。関数は予め定義しておくほかに、このような高階関数のスロットに即席でセットすることもできます。 diff --git a/src/docs/ko-KR/reaction.md b/src/docs/ko-KR/reaction.md new file mode 100644 index 000000000..b8227839b --- /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 000000000..aef450f2d --- /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`。 + +## 投了する +投了をするには、このエンドポイントにリクエストします。 diff --git a/src/docs/ko-KR/stream.md b/src/docs/ko-KR/stream.md new file mode 100644 index 000000000..1ff7d4c3e --- /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キーや、アプリケーションからストリームに接続する際はユーザーのアクセストークンのことを指します。 + +
+

認証情報の取得については、こちらのドキュメントをご確認ください。

+
+ +--- + +認証情報は省略することもできますが、その場合非ログインでの利用ということになり、受信できる情報や可能な操作は限られます。例: + +``` +%WS_URL%/streaming +``` + +--- + +ストリームに接続すると、後述するAPI操作や、投稿の購読を行ったりすることができます。 しかしまだこの段階では、例えばタイムラインへの新しい投稿を受信したりすることはできません。 それを行うには、ストリーム上で、後述する**チャンネル**に接続する必要があります。 + +**ストリームでのやり取りはすべてJSONです。** + +## 채널 +MisskeyのストリーミングAPIにはチャンネルという概念があります。これは、送受信する情報を分離するための仕組みです。 Misskeyのストリームに接続しただけでは、まだリアルタイムでタイムラインの投稿を受信したりはできません。 ストリーム上でチャンネルに接続することで、様々な情報を受け取ったり情報を送信したりすることができるようになります。 + +### チャンネルに接続する +チャンネルに接続するには、次のようなデータをJSONでストリームに送信します: + +```json +{ + type: 'connect', + body: { + channel: 'xxxxxxxx', + id: 'foobar', + params: { + ... + } + } +} +``` + +ここで、 +* `channel`には接続したいチャンネル名を設定します。チャンネルの種類については後述します。 +* `id`にはそのチャンネルとやり取りするための任意のIDを設定します。ストリームでは様々なメッセージが流れるので、そのメッセージがどのチャンネルからのものなのか識別する必要があるからです。このIDは、UUIDや、乱数のようなもので構いません。 +* `params`はチャンネルに接続する際のパラメータです。チャンネルによって接続時に必要とされるパラメータは異なります。パラメータ不要のチャンネルに接続する際は、このプロパティは省略可能です。 + +
+

IDはチャンネルごとではなく「チャンネルの接続ごと」です。なぜなら、同じチャンネルに異なるパラメータで複数接続するケースもあるからです。

+
+ +### チャンネルからのメッセージを受け取る +例えばタイムラインのチャンネルなら、新しい投稿があった時にメッセージを発します。そのメッセージを受け取ることで、タイムラインに新しい投稿がされたことをリアルタイムで知ることができます。 + +チャンネルがメッセージを発すると、次のようなデータが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`には、エンドポイントのパラメータを含めます。 + +
+

APIのエンドポイントやパラメータについてはAPIリファレンスをご確認ください。

+
+ +### レスポンスの受信 + +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 000000000..856580e60 --- /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 000000000..ecaaa644a --- /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 000000000..6c28b446e --- /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 000000000..76019b614 --- /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 000000000..0d2fa1917 --- /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 000000000..ed2e92be1 --- /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 000000000..8057e262f --- /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 000000000..3c1ea7bbe --- /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 000000000..957ca838c --- /dev/null +++ b/src/docs/nl-NL/keyboard-shortcut.md @@ -0,0 +1,68 @@ +# キーボードショートカット + +## グローバル +これらのショートカットは基本的にどこでも使えます。 + + + + + + + + + + + +
ショートカット効果由来
P, N新規投稿Post, New, Note
Tタイムラインの最も新しい投稿にフォーカスTimeline, Top
Shift + N通知を表示/隠すNotifications
S検索Search
H, ?ヘルプを表示Help
+ +## 投稿にフォーカスされた状態 + + + + + + + + + + + + + + + + + + + +
ショートカット効果由来
, K, Shift + Tab上の投稿にフォーカスを移動-
, J, Tab下の投稿にフォーカスを移動-
R返信フォームを開くReply
QRenoteフォームを開くQuote
Ctrl + Q即刻Renoteする(フォームを開かずに)-
E, A, +リアクションフォームを開くEmote, reAction
0~9数字に対応したリアクションをする(対応については後述)-
F, Bお気に入りに登録Favorite, Bookmark
Del, Ctrl + D投稿を削除Delete
M, O投稿に対するメニューを開くMore, Other
SCWで隠された部分を表示 or 隠すShow, See
Escフォーカスを外す-
+ +## Renoteフォーム + + + + + + + + + + +
ショートカット効果由来
EnterRenoteする-
Qフォームを展開するQuote
Escフォームを閉じる-
+ +## リアクションフォーム +デフォルトで「👍」にフォーカスが当たっている状態です。 + + + + + + + + + + + + + +
ショートカット効果由来
, K上のリアクションにフォーカスを移動-
, J下のリアクションにフォーカスを移動-
, H, Shift + Tab左のリアクションにフォーカスを移動-
, L, Tab右のリアクションにフォーカスを移動-
Enter, Space, +リアクション確定-
0~9数字に対応したリアクションで確定-
Escリアクションするのをやめる-
diff --git a/src/docs/nl-NL/mfm.md b/src/docs/nl-NL/mfm.md new file mode 100644 index 000000000..e237287ac --- /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 000000000..6a9608662 --- /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 000000000..a7311b95e --- /dev/null +++ b/src/docs/nl-NL/pages.md @@ -0,0 +1,10 @@ +# Pages + +## 変数 +変数を使うことで動的なページを作成できます。テキスト内で { 変数名 } と書くとそこに変数の値を埋め込めます。例えば Hello { thing } world! というテキストで、変数(thing)の値が ai だった場合、テキストは Hello ai world! になります。 + +変数の評価(値を算出すること)は上から下に行われるので、ある変数の中で自分より下の変数を参照することはできません。例えば上から A、B、C と3つの変数を定義したとき、Cの中でABを参照することはできますが、Aの中でBCを参照することはできません。 + +ユーザーからの入力を受け取るには、ページに「ユーザー入力」ブロックを設置し、「変数名」に入力を格納したい変数名を設定します(変数は自動で作成されます)。その変数を使ってユーザー入力に応じた動作を行えます。 + +関数を使うと、値の算出処理を再利用可能な形にまとめることができます。関数を作るには、「関数」タイプの変数を作成します。関数にはスロット(引数)を設定することができ、スロットの値は関数内で変数として利用可能です。また、関数を引数に取る関数(高階関数と呼ばれます)も存在します。関数は予め定義しておくほかに、このような高階関数のスロットに即席でセットすることもできます。 diff --git a/src/docs/nl-NL/reaction.md b/src/docs/nl-NL/reaction.md new file mode 100644 index 000000000..c26ead75b --- /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 000000000..7ab2a7212 --- /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`。 + +## 投了する +投了をするには、このエンドポイントにリクエストします。 diff --git a/src/docs/nl-NL/stream.md b/src/docs/nl-NL/stream.md new file mode 100644 index 000000000..9011c37c5 --- /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キーや、アプリケーションからストリームに接続する際はユーザーのアクセストークンのことを指します。 + +
+

認証情報の取得については、こちらのドキュメントをご確認ください。

+
+ +--- + +認証情報は省略することもできますが、その場合非ログインでの利用ということになり、受信できる情報や可能な操作は限られます。例: + +``` +%WS_URL%/streaming +``` + +--- + +ストリームに接続すると、後述するAPI操作や、投稿の購読を行ったりすることができます。 しかしまだこの段階では、例えばタイムラインへの新しい投稿を受信したりすることはできません。 それを行うには、ストリーム上で、後述する**チャンネル**に接続する必要があります。 + +**ストリームでのやり取りはすべてJSONです。** + +## チャンネル +MisskeyのストリーミングAPIにはチャンネルという概念があります。これは、送受信する情報を分離するための仕組みです。 Misskeyのストリームに接続しただけでは、まだリアルタイムでタイムラインの投稿を受信したりはできません。 ストリーム上でチャンネルに接続することで、様々な情報を受け取ったり情報を送信したりすることができるようになります。 + +### チャンネルに接続する +チャンネルに接続するには、次のようなデータをJSONでストリームに送信します: + +```json +{ + type: 'connect', + body: { + channel: 'xxxxxxxx', + id: 'foobar', + params: { + ... + } + } +} +``` + +ここで、 +* `channel`には接続したいチャンネル名を設定します。チャンネルの種類については後述します。 +* `id`にはそのチャンネルとやり取りするための任意のIDを設定します。ストリームでは様々なメッセージが流れるので、そのメッセージがどのチャンネルからのものなのか識別する必要があるからです。このIDは、UUIDや、乱数のようなもので構いません。 +* `params`はチャンネルに接続する際のパラメータです。チャンネルによって接続時に必要とされるパラメータは異なります。パラメータ不要のチャンネルに接続する際は、このプロパティは省略可能です。 + +
+

IDはチャンネルごとではなく「チャンネルの接続ごと」です。なぜなら、同じチャンネルに異なるパラメータで複数接続するケースもあるからです。

+
+ +### チャンネルからのメッセージを受け取る +例えばタイムラインのチャンネルなら、新しい投稿があった時にメッセージを発します。そのメッセージを受け取ることで、タイムラインに新しい投稿がされたことをリアルタイムで知ることができます。 + +チャンネルがメッセージを発すると、次のようなデータが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`には、エンドポイントのパラメータを含めます。 + +
+

APIのエンドポイントやパラメータについてはAPIリファレンスをご確認ください。

+
+ +### レスポンスの受信 + +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 000000000..4e52ee8cd --- /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 000000000..36ba61bd2 --- /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 000000000..6c28b446e --- /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 000000000..76019b614 --- /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 000000000..0d2fa1917 --- /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 000000000..ed2e92be1 --- /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 000000000..8057e262f --- /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 000000000..3c1ea7bbe --- /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 000000000..957ca838c --- /dev/null +++ b/src/docs/no-NO/keyboard-shortcut.md @@ -0,0 +1,68 @@ +# キーボードショートカット + +## グローバル +これらのショートカットは基本的にどこでも使えます。 + + + + + + + + + + + +
ショートカット効果由来
P, N新規投稿Post, New, Note
Tタイムラインの最も新しい投稿にフォーカスTimeline, Top
Shift + N通知を表示/隠すNotifications
S検索Search
H, ?ヘルプを表示Help
+ +## 投稿にフォーカスされた状態 + + + + + + + + + + + + + + + + + + + +
ショートカット効果由来
, K, Shift + Tab上の投稿にフォーカスを移動-
, J, Tab下の投稿にフォーカスを移動-
R返信フォームを開くReply
QRenoteフォームを開くQuote
Ctrl + Q即刻Renoteする(フォームを開かずに)-
E, A, +リアクションフォームを開くEmote, reAction
0~9数字に対応したリアクションをする(対応については後述)-
F, Bお気に入りに登録Favorite, Bookmark
Del, Ctrl + D投稿を削除Delete
M, O投稿に対するメニューを開くMore, Other
SCWで隠された部分を表示 or 隠すShow, See
Escフォーカスを外す-
+ +## Renoteフォーム + + + + + + + + + + +
ショートカット効果由来
EnterRenoteする-
Qフォームを展開するQuote
Escフォームを閉じる-
+ +## リアクションフォーム +デフォルトで「👍」にフォーカスが当たっている状態です。 + + + + + + + + + + + + + +
ショートカット効果由来
, K上のリアクションにフォーカスを移動-
, J下のリアクションにフォーカスを移動-
, H, Shift + Tab左のリアクションにフォーカスを移動-
, L, Tab右のリアクションにフォーカスを移動-
Enter, Space, +リアクション確定-
0~9数字に対応したリアクションで確定-
Escリアクションするのをやめる-
diff --git a/src/docs/no-NO/mfm.md b/src/docs/no-NO/mfm.md new file mode 100644 index 000000000..e237287ac --- /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 000000000..6a9608662 --- /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 000000000..a7311b95e --- /dev/null +++ b/src/docs/no-NO/pages.md @@ -0,0 +1,10 @@ +# Pages + +## 変数 +変数を使うことで動的なページを作成できます。テキスト内で { 変数名 } と書くとそこに変数の値を埋め込めます。例えば Hello { thing } world! というテキストで、変数(thing)の値が ai だった場合、テキストは Hello ai world! になります。 + +変数の評価(値を算出すること)は上から下に行われるので、ある変数の中で自分より下の変数を参照することはできません。例えば上から A、B、C と3つの変数を定義したとき、Cの中でABを参照することはできますが、Aの中でBCを参照することはできません。 + +ユーザーからの入力を受け取るには、ページに「ユーザー入力」ブロックを設置し、「変数名」に入力を格納したい変数名を設定します(変数は自動で作成されます)。その変数を使ってユーザー入力に応じた動作を行えます。 + +関数を使うと、値の算出処理を再利用可能な形にまとめることができます。関数を作るには、「関数」タイプの変数を作成します。関数にはスロット(引数)を設定することができ、スロットの値は関数内で変数として利用可能です。また、関数を引数に取る関数(高階関数と呼ばれます)も存在します。関数は予め定義しておくほかに、このような高階関数のスロットに即席でセットすることもできます。 diff --git a/src/docs/no-NO/reaction.md b/src/docs/no-NO/reaction.md new file mode 100644 index 000000000..c26ead75b --- /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 000000000..7ab2a7212 --- /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`。 + +## 投了する +投了をするには、このエンドポイントにリクエストします。 diff --git a/src/docs/no-NO/stream.md b/src/docs/no-NO/stream.md new file mode 100644 index 000000000..9011c37c5 --- /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キーや、アプリケーションからストリームに接続する際はユーザーのアクセストークンのことを指します。 + +
+

認証情報の取得については、こちらのドキュメントをご確認ください。

+
+ +--- + +認証情報は省略することもできますが、その場合非ログインでの利用ということになり、受信できる情報や可能な操作は限られます。例: + +``` +%WS_URL%/streaming +``` + +--- + +ストリームに接続すると、後述するAPI操作や、投稿の購読を行ったりすることができます。 しかしまだこの段階では、例えばタイムラインへの新しい投稿を受信したりすることはできません。 それを行うには、ストリーム上で、後述する**チャンネル**に接続する必要があります。 + +**ストリームでのやり取りはすべてJSONです。** + +## チャンネル +MisskeyのストリーミングAPIにはチャンネルという概念があります。これは、送受信する情報を分離するための仕組みです。 Misskeyのストリームに接続しただけでは、まだリアルタイムでタイムラインの投稿を受信したりはできません。 ストリーム上でチャンネルに接続することで、様々な情報を受け取ったり情報を送信したりすることができるようになります。 + +### チャンネルに接続する +チャンネルに接続するには、次のようなデータをJSONでストリームに送信します: + +```json +{ + type: 'connect', + body: { + channel: 'xxxxxxxx', + id: 'foobar', + params: { + ... + } + } +} +``` + +ここで、 +* `channel`には接続したいチャンネル名を設定します。チャンネルの種類については後述します。 +* `id`にはそのチャンネルとやり取りするための任意のIDを設定します。ストリームでは様々なメッセージが流れるので、そのメッセージがどのチャンネルからのものなのか識別する必要があるからです。このIDは、UUIDや、乱数のようなもので構いません。 +* `params`はチャンネルに接続する際のパラメータです。チャンネルによって接続時に必要とされるパラメータは異なります。パラメータ不要のチャンネルに接続する際は、このプロパティは省略可能です。 + +
+

IDはチャンネルごとではなく「チャンネルの接続ごと」です。なぜなら、同じチャンネルに異なるパラメータで複数接続するケースもあるからです。

+
+ +### チャンネルからのメッセージを受け取る +例えばタイムラインのチャンネルなら、新しい投稿があった時にメッセージを発します。そのメッセージを受け取ることで、タイムラインに新しい投稿がされたことをリアルタイムで知ることができます。 + +チャンネルがメッセージを発すると、次のようなデータが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`には、エンドポイントのパラメータを含めます。 + +
+

APIのエンドポイントやパラメータについてはAPIリファレンスをご確認ください。

+
+ +### レスポンスの受信 + +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 000000000..4e52ee8cd --- /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 000000000..36ba61bd2 --- /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 000000000..6c28b446e --- /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 000000000..76019b614 --- /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 000000000..0d2fa1917 --- /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 000000000..ed2e92be1 --- /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 000000000..8057e262f --- /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 000000000..3c1ea7bbe --- /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 000000000..c2c138928 --- /dev/null +++ b/src/docs/pl-PL/keyboard-shortcut.md @@ -0,0 +1,68 @@ +# キーボードショートカット + +## グローバル +これらのショートカットは基本的にどこでも使えます。 + + + + + + + + + + + +
ショートカット効果由来
P, N新規投稿Post, New, Note
Tタイムラインの最も新しい投稿にフォーカスTimeline, Top
Shift + N通知を表示/隠すNotifications
SSzukajSearch
H, ?ヘルプを表示Help
+ +## 投稿にフォーカスされた状態 + + + + + + + + + + + + + + + + + + + +
ショートカット効果由来
, K, Shift + Tab上の投稿にフォーカスを移動-
, J, Tab下の投稿にフォーカスを移動-
R返信フォームを開くReply
QRenoteフォームを開くQuote
Ctrl + Q即刻Renoteする(フォームを開かずに)-
E, A, +リアクションフォームを開くEmote, reAction
0~9数字に対応したリアクションをする(対応については後述)-
F, Bお気に入りに登録Favorite, Bookmark
Del, Ctrl + D投稿を削除Delete
M, O投稿に対するメニューを開くMore, Other
SCWで隠された部分を表示 or 隠すShow, See
Escフォーカスを外す-
+ +## Renoteフォーム + + + + + + + + + + +
ショートカット効果由来
EnterRenoteする-
Qフォームを展開するQuote
Escフォームを閉じる-
+ +## リアクションフォーム +デフォルトで「👍」にフォーカスが当たっている状態です。 + + + + + + + + + + + + + +
ショートカット効果由来
, K上のリアクションにフォーカスを移動-
, J下のリアクションにフォーカスを移動-
, H, Shift + Tab左のリアクションにフォーカスを移動-
, L, Tab右のリアクションにフォーカスを移動-
Enter, Space, +リアクション確定-
0~9数字に対応したリアクションで確定-
Escリアクションするのをやめる-
diff --git a/src/docs/pl-PL/mfm.md b/src/docs/pl-PL/mfm.md new file mode 100644 index 000000000..e237287ac --- /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 000000000..6a9608662 --- /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 000000000..a7311b95e --- /dev/null +++ b/src/docs/pl-PL/pages.md @@ -0,0 +1,10 @@ +# Pages + +## 変数 +変数を使うことで動的なページを作成できます。テキスト内で { 変数名 } と書くとそこに変数の値を埋め込めます。例えば Hello { thing } world! というテキストで、変数(thing)の値が ai だった場合、テキストは Hello ai world! になります。 + +変数の評価(値を算出すること)は上から下に行われるので、ある変数の中で自分より下の変数を参照することはできません。例えば上から A、B、C と3つの変数を定義したとき、Cの中でABを参照することはできますが、Aの中でBCを参照することはできません。 + +ユーザーからの入力を受け取るには、ページに「ユーザー入力」ブロックを設置し、「変数名」に入力を格納したい変数名を設定します(変数は自動で作成されます)。その変数を使ってユーザー入力に応じた動作を行えます。 + +関数を使うと、値の算出処理を再利用可能な形にまとめることができます。関数を作るには、「関数」タイプの変数を作成します。関数にはスロット(引数)を設定することができ、スロットの値は関数内で変数として利用可能です。また、関数を引数に取る関数(高階関数と呼ばれます)も存在します。関数は予め定義しておくほかに、このような高階関数のスロットに即席でセットすることもできます。 diff --git a/src/docs/pl-PL/reaction.md b/src/docs/pl-PL/reaction.md new file mode 100644 index 000000000..c26ead75b --- /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 000000000..7ab2a7212 --- /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`。 + +## 投了する +投了をするには、このエンドポイントにリクエストします。 diff --git a/src/docs/pl-PL/stream.md b/src/docs/pl-PL/stream.md new file mode 100644 index 000000000..9011c37c5 --- /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キーや、アプリケーションからストリームに接続する際はユーザーのアクセストークンのことを指します。 + +
+

認証情報の取得については、こちらのドキュメントをご確認ください。

+
+ +--- + +認証情報は省略することもできますが、その場合非ログインでの利用ということになり、受信できる情報や可能な操作は限られます。例: + +``` +%WS_URL%/streaming +``` + +--- + +ストリームに接続すると、後述するAPI操作や、投稿の購読を行ったりすることができます。 しかしまだこの段階では、例えばタイムラインへの新しい投稿を受信したりすることはできません。 それを行うには、ストリーム上で、後述する**チャンネル**に接続する必要があります。 + +**ストリームでのやり取りはすべてJSONです。** + +## チャンネル +MisskeyのストリーミングAPIにはチャンネルという概念があります。これは、送受信する情報を分離するための仕組みです。 Misskeyのストリームに接続しただけでは、まだリアルタイムでタイムラインの投稿を受信したりはできません。 ストリーム上でチャンネルに接続することで、様々な情報を受け取ったり情報を送信したりすることができるようになります。 + +### チャンネルに接続する +チャンネルに接続するには、次のようなデータをJSONでストリームに送信します: + +```json +{ + type: 'connect', + body: { + channel: 'xxxxxxxx', + id: 'foobar', + params: { + ... + } + } +} +``` + +ここで、 +* `channel`には接続したいチャンネル名を設定します。チャンネルの種類については後述します。 +* `id`にはそのチャンネルとやり取りするための任意のIDを設定します。ストリームでは様々なメッセージが流れるので、そのメッセージがどのチャンネルからのものなのか識別する必要があるからです。このIDは、UUIDや、乱数のようなもので構いません。 +* `params`はチャンネルに接続する際のパラメータです。チャンネルによって接続時に必要とされるパラメータは異なります。パラメータ不要のチャンネルに接続する際は、このプロパティは省略可能です。 + +
+

IDはチャンネルごとではなく「チャンネルの接続ごと」です。なぜなら、同じチャンネルに異なるパラメータで複数接続するケースもあるからです。

+
+ +### チャンネルからのメッセージを受け取る +例えばタイムラインのチャンネルなら、新しい投稿があった時にメッセージを発します。そのメッセージを受け取ることで、タイムラインに新しい投稿がされたことをリアルタイムで知ることができます。 + +チャンネルがメッセージを発すると、次のようなデータが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`には、エンドポイントのパラメータを含めます。 + +
+

APIのエンドポイントやパラメータについてはAPIリファレンスをご確認ください。

+
+ +### レスポンスの受信 + +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 000000000..4e52ee8cd --- /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 000000000..36ba61bd2 --- /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 000000000..6c28b446e --- /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 000000000..76019b614 --- /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 000000000..0d2fa1917 --- /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 000000000..ed2e92be1 --- /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 000000000..8057e262f --- /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 000000000..3c1ea7bbe --- /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 000000000..957ca838c --- /dev/null +++ b/src/docs/pt-PT/keyboard-shortcut.md @@ -0,0 +1,68 @@ +# キーボードショートカット + +## グローバル +これらのショートカットは基本的にどこでも使えます。 + + + + + + + + + + + +
ショートカット効果由来
P, N新規投稿Post, New, Note
Tタイムラインの最も新しい投稿にフォーカスTimeline, Top
Shift + N通知を表示/隠すNotifications
S検索Search
H, ?ヘルプを表示Help
+ +## 投稿にフォーカスされた状態 + + + + + + + + + + + + + + + + + + + +
ショートカット効果由来
, K, Shift + Tab上の投稿にフォーカスを移動-
, J, Tab下の投稿にフォーカスを移動-
R返信フォームを開くReply
QRenoteフォームを開くQuote
Ctrl + Q即刻Renoteする(フォームを開かずに)-
E, A, +リアクションフォームを開くEmote, reAction
0~9数字に対応したリアクションをする(対応については後述)-
F, Bお気に入りに登録Favorite, Bookmark
Del, Ctrl + D投稿を削除Delete
M, O投稿に対するメニューを開くMore, Other
SCWで隠された部分を表示 or 隠すShow, See
Escフォーカスを外す-
+ +## Renoteフォーム + + + + + + + + + + +
ショートカット効果由来
EnterRenoteする-
Qフォームを展開するQuote
Escフォームを閉じる-
+ +## リアクションフォーム +デフォルトで「👍」にフォーカスが当たっている状態です。 + + + + + + + + + + + + + +
ショートカット効果由来
, K上のリアクションにフォーカスを移動-
, J下のリアクションにフォーカスを移動-
, H, Shift + Tab左のリアクションにフォーカスを移動-
, L, Tab右のリアクションにフォーカスを移動-
Enter, Space, +リアクション確定-
0~9数字に対応したリアクションで確定-
Escリアクションするのをやめる-
diff --git a/src/docs/pt-PT/mfm.md b/src/docs/pt-PT/mfm.md new file mode 100644 index 000000000..e237287ac --- /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 000000000..6a9608662 --- /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 000000000..a7311b95e --- /dev/null +++ b/src/docs/pt-PT/pages.md @@ -0,0 +1,10 @@ +# Pages + +## 変数 +変数を使うことで動的なページを作成できます。テキスト内で { 変数名 } と書くとそこに変数の値を埋め込めます。例えば Hello { thing } world! というテキストで、変数(thing)の値が ai だった場合、テキストは Hello ai world! になります。 + +変数の評価(値を算出すること)は上から下に行われるので、ある変数の中で自分より下の変数を参照することはできません。例えば上から A、B、C と3つの変数を定義したとき、Cの中でABを参照することはできますが、Aの中でBCを参照することはできません。 + +ユーザーからの入力を受け取るには、ページに「ユーザー入力」ブロックを設置し、「変数名」に入力を格納したい変数名を設定します(変数は自動で作成されます)。その変数を使ってユーザー入力に応じた動作を行えます。 + +関数を使うと、値の算出処理を再利用可能な形にまとめることができます。関数を作るには、「関数」タイプの変数を作成します。関数にはスロット(引数)を設定することができ、スロットの値は関数内で変数として利用可能です。また、関数を引数に取る関数(高階関数と呼ばれます)も存在します。関数は予め定義しておくほかに、このような高階関数のスロットに即席でセットすることもできます。 diff --git a/src/docs/pt-PT/reaction.md b/src/docs/pt-PT/reaction.md new file mode 100644 index 000000000..c26ead75b --- /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 000000000..7ab2a7212 --- /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`。 + +## 投了する +投了をするには、このエンドポイントにリクエストします。 diff --git a/src/docs/pt-PT/stream.md b/src/docs/pt-PT/stream.md new file mode 100644 index 000000000..9011c37c5 --- /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キーや、アプリケーションからストリームに接続する際はユーザーのアクセストークンのことを指します。 + +
+

認証情報の取得については、こちらのドキュメントをご確認ください。

+
+ +--- + +認証情報は省略することもできますが、その場合非ログインでの利用ということになり、受信できる情報や可能な操作は限られます。例: + +``` +%WS_URL%/streaming +``` + +--- + +ストリームに接続すると、後述するAPI操作や、投稿の購読を行ったりすることができます。 しかしまだこの段階では、例えばタイムラインへの新しい投稿を受信したりすることはできません。 それを行うには、ストリーム上で、後述する**チャンネル**に接続する必要があります。 + +**ストリームでのやり取りはすべてJSONです。** + +## チャンネル +MisskeyのストリーミングAPIにはチャンネルという概念があります。これは、送受信する情報を分離するための仕組みです。 Misskeyのストリームに接続しただけでは、まだリアルタイムでタイムラインの投稿を受信したりはできません。 ストリーム上でチャンネルに接続することで、様々な情報を受け取ったり情報を送信したりすることができるようになります。 + +### チャンネルに接続する +チャンネルに接続するには、次のようなデータをJSONでストリームに送信します: + +```json +{ + type: 'connect', + body: { + channel: 'xxxxxxxx', + id: 'foobar', + params: { + ... + } + } +} +``` + +ここで、 +* `channel`には接続したいチャンネル名を設定します。チャンネルの種類については後述します。 +* `id`にはそのチャンネルとやり取りするための任意のIDを設定します。ストリームでは様々なメッセージが流れるので、そのメッセージがどのチャンネルからのものなのか識別する必要があるからです。このIDは、UUIDや、乱数のようなもので構いません。 +* `params`はチャンネルに接続する際のパラメータです。チャンネルによって接続時に必要とされるパラメータは異なります。パラメータ不要のチャンネルに接続する際は、このプロパティは省略可能です。 + +
+

IDはチャンネルごとではなく「チャンネルの接続ごと」です。なぜなら、同じチャンネルに異なるパラメータで複数接続するケースもあるからです。

+
+ +### チャンネルからのメッセージを受け取る +例えばタイムラインのチャンネルなら、新しい投稿があった時にメッセージを発します。そのメッセージを受け取ることで、タイムラインに新しい投稿がされたことをリアルタイムで知ることができます。 + +チャンネルがメッセージを発すると、次のようなデータが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`には、エンドポイントのパラメータを含めます。 + +
+

APIのエンドポイントやパラメータについてはAPIリファレンスをご確認ください。

+
+ +### レスポンスの受信 + +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 000000000..4e52ee8cd --- /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 000000000..36ba61bd2 --- /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 000000000..c8d3d44b6 --- /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 000000000..76019b614 --- /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 000000000..f5baa2764 --- /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 000000000..6d20e36c1 --- /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 000000000..7b109dc4f --- /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 000000000..dde28b9c9 --- /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 000000000..6ec2dd92c --- /dev/null +++ b/src/docs/ru-RU/keyboard-shortcut.md @@ -0,0 +1,68 @@ +# キーボードショートカット + +## Всеобщая +これらのショートカットは基本的にどこでも使えます。 + + + + + + + + + + + +
ショートカット効果由来
P, N新規投稿Post, New, Note
Tタイムラインの最も新しい投稿にフォーカスTimeline, Top
Shift + N通知を表示/隠すNotifications
SПоискSearch
H, ?ヘルプを表示Help
+ +## 投稿にフォーカスされた状態 + + + + + + + + + + + + + + + + + + + +
ショートカット効果由来
, K, Shift + Tab上の投稿にフォーカスを移動-
, J, Tab下の投稿にフォーカスを移動-
R返信フォームを開くReply
QRenoteフォームを開くQuote
Ctrl + Q即刻Renoteする(フォームを開かずに)-
E, A, +リアクションフォームを開くEmote, reAction
0~9数字に対応したリアクションをする(対応については後述)-
F, Bお気に入りに登録Favorite, Bookmark
Del, Ctrl + D投稿を削除Delete
M, O投稿に対するメニューを開くMore, Other
SCWで隠された部分を表示 or 隠すShow, See
Escフォーカスを外す-
+ +## Renoteフォーム + + + + + + + + + + +
ショートカット効果由来
EnterRenoteする-
Qフォームを展開するQuote
Escフォームを閉じる-
+ +## リアクションフォーム +デフォルトで「👍」にフォーカスが当たっている状態です。 + + + + + + + + + + + + + +
ショートカット効果由来
, K上のリアクションにフォーカスを移動-
, J下のリアクションにフォーカスを移動-
, H, Shift + Tab左のリアクションにフォーカスを移動-
, L, Tab右のリアクションにフォーカスを移動-
Enter, Space, +リアクション確定-
0~9数字に対応したリアクションで確定-
Escリアクションするのをやめる-
diff --git a/src/docs/ru-RU/mfm.md b/src/docs/ru-RU/mfm.md new file mode 100644 index 000000000..e237287ac --- /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 000000000..78a4bf3eb --- /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 000000000..ea7b15c31 --- /dev/null +++ b/src/docs/ru-RU/pages.md @@ -0,0 +1,10 @@ +# Pages + +## Переменные +変数を使うことで動的なページを作成できます。テキスト内で { 変数名 } と書くとそこに変数の値を埋め込めます。例えば Hello { thing } world! というテキストで、変数(thing)の値が ai だった場合、テキストは Hello ai world! になります。 + +変数の評価(値を算出すること)は上から下に行われるので、ある変数の中で自分より下の変数を参照することはできません。例えば上から A、B、C と3つの変数を定義したとき、Cの中でABを参照することはできますが、Aの中でBCを参照することはできません。 + +ユーザーからの入力を受け取るには、ページに「ユーザー入力」ブロックを設置し、「変数名」に入力を格納したい変数名を設定します(変数は自動で作成されます)。その変数を使ってユーザー入力に応じた動作を行えます。 + +関数を使うと、値の算出処理を再利用可能な形にまとめることができます。関数を作るには、「関数」タイプの変数を作成します。関数にはスロット(引数)を設定することができ、スロットの値は関数内で変数として利用可能です。また、関数を引数に取る関数(高階関数と呼ばれます)も存在します。関数は予め定義しておくほかに、このような高階関数のスロットに即席でセットすることもできます。 diff --git a/src/docs/ru-RU/reaction.md b/src/docs/ru-RU/reaction.md new file mode 100644 index 000000000..7b315d7ec --- /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 000000000..16eb25a60 --- /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`。 + +## 投了する +投了をするには、このエンドポイントにリクエストします。 diff --git a/src/docs/ru-RU/stream.md b/src/docs/ru-RU/stream.md new file mode 100644 index 000000000..ca58db7b8 --- /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キーや、アプリケーションからストリームに接続する際はユーザーのアクセストークンのことを指します。 + +
+

認証情報の取得については、こちらのドキュメントをご確認ください。

+
+ +--- + +認証情報は省略することもできますが、その場合非ログインでの利用ということになり、受信できる情報や可能な操作は限られます。例: + +``` +%WS_URL%/streaming +``` + +--- + +ストリームに接続すると、後述するAPI操作や、投稿の購読を行ったりすることができます。 しかしまだこの段階では、例えばタイムラインへの新しい投稿を受信したりすることはできません。 それを行うには、ストリーム上で、後述する**チャンネル**に接続する必要があります。 + +**ストリームでのやり取りはすべてJSONです。** + +## Каналы +MisskeyのストリーミングAPIにはチャンネルという概念があります。これは、送受信する情報を分離するための仕組みです。 Misskeyのストリームに接続しただけでは、まだリアルタイムでタイムラインの投稿を受信したりはできません。 ストリーム上でチャンネルに接続することで、様々な情報を受け取ったり情報を送信したりすることができるようになります。 + +### チャンネルに接続する +チャンネルに接続するには、次のようなデータをJSONでストリームに送信します: + +```json +{ + type: 'connect', + body: { + channel: 'xxxxxxxx', + id: 'foobar', + params: { + ... + } + } +} +``` + +ここで、 +* `channel`には接続したいチャンネル名を設定します。チャンネルの種類については後述します。 +* `id`にはそのチャンネルとやり取りするための任意のIDを設定します。ストリームでは様々なメッセージが流れるので、そのメッセージがどのチャンネルからのものなのか識別する必要があるからです。このIDは、UUIDや、乱数のようなもので構いません。 +* `params`はチャンネルに接続する際のパラメータです。チャンネルによって接続時に必要とされるパラメータは異なります。パラメータ不要のチャンネルに接続する際は、このプロパティは省略可能です。 + +
+

IDはチャンネルごとではなく「チャンネルの接続ごと」です。なぜなら、同じチャンネルに異なるパラメータで複数接続するケースもあるからです。

+
+ +### チャンネルからのメッセージを受け取る +例えばタイムラインのチャンネルなら、新しい投稿があった時にメッセージを発します。そのメッセージを受け取ることで、タイムラインに新しい投稿がされたことをリアルタイムで知ることができます。 + +チャンネルがメッセージを発すると、次のようなデータが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`には、エンドポイントのパラメータを含めます。 + +
+

APIのエンドポイントやパラメータについてはAPIリファレンスをご確認ください。

+
+ +### レスポンスの受信 + +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 000000000..6ab7b5466 --- /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 000000000..dd6ca37c6 --- /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 000000000..6c28b446e --- /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 000000000..76019b614 --- /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 000000000..0d2fa1917 --- /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 000000000..ed2e92be1 --- /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 000000000..8057e262f --- /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 000000000..3c1ea7bbe --- /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 000000000..04ba792aa --- /dev/null +++ b/src/docs/ug-CN/keyboard-shortcut.md @@ -0,0 +1,68 @@ +# キーボードショートカット + +## グローバル +これらのショートカットは基本的にどこでも使えます。 + + + + + + + + + + + +
ショートカット効果由来
P, N新規投稿Post, New, Note
Tタイムラインの最も新しい投稿にフォーカスTimeline, Top
Shift + N通知を表示/隠すNotifications
SئىزدەشSearch
H, ?ヘルプを表示Help
+ +## 投稿にフォーカスされた状態 + + + + + + + + + + + + + + + + + + + +
ショートカット効果由来
, K, Shift + Tab上の投稿にフォーカスを移動-
, J, Tab下の投稿にフォーカスを移動-
R返信フォームを開くReply
QRenoteフォームを開くQuote
Ctrl + Q即刻Renoteする(フォームを開かずに)-
E, A, +リアクションフォームを開くEmote, reAction
0~9数字に対応したリアクションをする(対応については後述)-
F, Bお気に入りに登録Favorite, Bookmark
Del, Ctrl + D投稿を削除Delete
M, O投稿に対するメニューを開くMore, Other
SCWで隠された部分を表示 or 隠すShow, See
Escフォーカスを外す-
+ +## Renoteフォーム + + + + + + + + + + +
ショートカット効果由来
EnterRenoteする-
Qフォームを展開するQuote
Escフォームを閉じる-
+ +## リアクションフォーム +デフォルトで「👍」にフォーカスが当たっている状態です。 + + + + + + + + + + + + + +
ショートカット効果由来
, K上のリアクションにフォーカスを移動-
, J下のリアクションにフォーカスを移動-
, H, Shift + Tab左のリアクションにフォーカスを移動-
, L, Tab右のリアクションにフォーカスを移動-
Enter, Space, +リアクション確定-
0~9数字に対応したリアクションで確定-
Escリアクションするのをやめる-
diff --git a/src/docs/ug-CN/mfm.md b/src/docs/ug-CN/mfm.md new file mode 100644 index 000000000..e237287ac --- /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 000000000..6a9608662 --- /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 000000000..a7311b95e --- /dev/null +++ b/src/docs/ug-CN/pages.md @@ -0,0 +1,10 @@ +# Pages + +## 変数 +変数を使うことで動的なページを作成できます。テキスト内で { 変数名 } と書くとそこに変数の値を埋め込めます。例えば Hello { thing } world! というテキストで、変数(thing)の値が ai だった場合、テキストは Hello ai world! になります。 + +変数の評価(値を算出すること)は上から下に行われるので、ある変数の中で自分より下の変数を参照することはできません。例えば上から A、B、C と3つの変数を定義したとき、Cの中でABを参照することはできますが、Aの中でBCを参照することはできません。 + +ユーザーからの入力を受け取るには、ページに「ユーザー入力」ブロックを設置し、「変数名」に入力を格納したい変数名を設定します(変数は自動で作成されます)。その変数を使ってユーザー入力に応じた動作を行えます。 + +関数を使うと、値の算出処理を再利用可能な形にまとめることができます。関数を作るには、「関数」タイプの変数を作成します。関数にはスロット(引数)を設定することができ、スロットの値は関数内で変数として利用可能です。また、関数を引数に取る関数(高階関数と呼ばれます)も存在します。関数は予め定義しておくほかに、このような高階関数のスロットに即席でセットすることもできます。 diff --git a/src/docs/ug-CN/reaction.md b/src/docs/ug-CN/reaction.md new file mode 100644 index 000000000..c26ead75b --- /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 000000000..7ab2a7212 --- /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`。 + +## 投了する +投了をするには、このエンドポイントにリクエストします。 diff --git a/src/docs/ug-CN/stream.md b/src/docs/ug-CN/stream.md new file mode 100644 index 000000000..9011c37c5 --- /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キーや、アプリケーションからストリームに接続する際はユーザーのアクセストークンのことを指します。 + +
+

認証情報の取得については、こちらのドキュメントをご確認ください。

+
+ +--- + +認証情報は省略することもできますが、その場合非ログインでの利用ということになり、受信できる情報や可能な操作は限られます。例: + +``` +%WS_URL%/streaming +``` + +--- + +ストリームに接続すると、後述するAPI操作や、投稿の購読を行ったりすることができます。 しかしまだこの段階では、例えばタイムラインへの新しい投稿を受信したりすることはできません。 それを行うには、ストリーム上で、後述する**チャンネル**に接続する必要があります。 + +**ストリームでのやり取りはすべてJSONです。** + +## チャンネル +MisskeyのストリーミングAPIにはチャンネルという概念があります。これは、送受信する情報を分離するための仕組みです。 Misskeyのストリームに接続しただけでは、まだリアルタイムでタイムラインの投稿を受信したりはできません。 ストリーム上でチャンネルに接続することで、様々な情報を受け取ったり情報を送信したりすることができるようになります。 + +### チャンネルに接続する +チャンネルに接続するには、次のようなデータをJSONでストリームに送信します: + +```json +{ + type: 'connect', + body: { + channel: 'xxxxxxxx', + id: 'foobar', + params: { + ... + } + } +} +``` + +ここで、 +* `channel`には接続したいチャンネル名を設定します。チャンネルの種類については後述します。 +* `id`にはそのチャンネルとやり取りするための任意のIDを設定します。ストリームでは様々なメッセージが流れるので、そのメッセージがどのチャンネルからのものなのか識別する必要があるからです。このIDは、UUIDや、乱数のようなもので構いません。 +* `params`はチャンネルに接続する際のパラメータです。チャンネルによって接続時に必要とされるパラメータは異なります。パラメータ不要のチャンネルに接続する際は、このプロパティは省略可能です。 + +
+

IDはチャンネルごとではなく「チャンネルの接続ごと」です。なぜなら、同じチャンネルに異なるパラメータで複数接続するケースもあるからです。

+
+ +### チャンネルからのメッセージを受け取る +例えばタイムラインのチャンネルなら、新しい投稿があった時にメッセージを発します。そのメッセージを受け取ることで、タイムラインに新しい投稿がされたことをリアルタイムで知ることができます。 + +チャンネルがメッセージを発すると、次のようなデータが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`には、エンドポイントのパラメータを含めます。 + +
+

APIのエンドポイントやパラメータについてはAPIリファレンスをご確認ください。

+
+ +### レスポンスの受信 + +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 000000000..4e52ee8cd --- /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 000000000..36ba61bd2 --- /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 000000000..1cbbf71e5 --- /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 000000000..76019b614 --- /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 000000000..5c60b4780 --- /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 000000000..2a130cb1d --- /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 000000000..acb80815c --- /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 000000000..db2a4c331 --- /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 000000000..7105fc419 --- /dev/null +++ b/src/docs/uk-UA/keyboard-shortcut.md @@ -0,0 +1,68 @@ +# キーボードショートカット + +## Глобальна +これらのショートカットは基本的にどこでも使えます。 + + + + + + + + + + + +
ショートカット効果由来
P, N新規投稿Post, New, Note
Tタイムラインの最も新しい投稿にフォーカスTimeline, Top
Shift + N通知を表示/隠すNotifications
SПошукSearch
H, ?ヘルプを表示Help
+ +## 投稿にフォーカスされた状態 + + + + + + + + + + + + + + + + + + + +
ショートカット効果由来
, K, Shift + Tab上の投稿にフォーカスを移動-
, J, Tab下の投稿にフォーカスを移動-
R返信フォームを開くReply
QRenoteフォームを開くQuote
Ctrl + Q即刻Renoteする(フォームを開かずに)-
E, A, +リアクションフォームを開くEmote, reAction
0~9数字に対応したリアクションをする(対応については後述)-
F, Bお気に入りに登録Favorite, Bookmark
Del, Ctrl + D投稿を削除Delete
M, O投稿に対するメニューを開くMore, Other
SCWで隠された部分を表示 or 隠すShow, See
Escフォーカスを外す-
+ +## Renoteフォーム + + + + + + + + + + +
ショートカット効果由来
EnterRenoteする-
Qフォームを展開するQuote
Escフォームを閉じる-
+ +## リアクションフォーム +デフォルトで「👍」にフォーカスが当たっている状態です。 + + + + + + + + + + + + + +
ショートカット効果由来
, K上のリアクションにフォーカスを移動-
, J下のリアクションにフォーカスを移動-
, H, Shift + Tab左のリアクションにフォーカスを移動-
, L, Tab右のリアクションにフォーカスを移動-
Enter, Space, +リアクション確定-
0~9数字に対応したリアクションで確定-
Escリアクションするのをやめる-
diff --git a/src/docs/uk-UA/mfm.md b/src/docs/uk-UA/mfm.md new file mode 100644 index 000000000..e237287ac --- /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 000000000..da3cfcc36 --- /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 000000000..55cd74544 --- /dev/null +++ b/src/docs/uk-UA/pages.md @@ -0,0 +1,10 @@ +# Pages + +## Змінні +変数を使うことで動的なページを作成できます。テキスト内で { 変数名 } と書くとそこに変数の値を埋め込めます。例えば Hello { thing } world! というテキストで、変数(thing)の値が ai だった場合、テキストは Hello ai world! になります。 + +変数の評価(値を算出すること)は上から下に行われるので、ある変数の中で自分より下の変数を参照することはできません。例えば上から A、B、C と3つの変数を定義したとき、Cの中でABを参照することはできますが、Aの中でBCを参照することはできません。 + +ユーザーからの入力を受け取るには、ページに「ユーザー入力」ブロックを設置し、「変数名」に入力を格納したい変数名を設定します(変数は自動で作成されます)。その変数を使ってユーザー入力に応じた動作を行えます。 + +関数を使うと、値の算出処理を再利用可能な形にまとめることができます。関数を作るには、「関数」タイプの変数を作成します。関数にはスロット(引数)を設定することができ、スロットの値は関数内で変数として利用可能です。また、関数を引数に取る関数(高階関数と呼ばれます)も存在します。関数は予め定義しておくほかに、このような高階関数のスロットに即席でセットすることもできます。 diff --git a/src/docs/uk-UA/reaction.md b/src/docs/uk-UA/reaction.md new file mode 100644 index 000000000..2b4dcd586 --- /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 000000000..ae4980119 --- /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`。 + +## 投了する +投了をするには、このエンドポイントにリクエストします。 diff --git a/src/docs/uk-UA/stream.md b/src/docs/uk-UA/stream.md new file mode 100644 index 000000000..734291c87 --- /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キーや、アプリケーションからストリームに接続する際はユーザーのアクセストークンのことを指します。 + +
+

認証情報の取得については、こちらのドキュメントをご確認ください。

+
+ +--- + +認証情報は省略することもできますが、その場合非ログインでの利用ということになり、受信できる情報や可能な操作は限られます。例: + +``` +%WS_URL%/streaming +``` + +--- + +ストリームに接続すると、後述するAPI操作や、投稿の購読を行ったりすることができます。 しかしまだこの段階では、例えばタイムラインへの新しい投稿を受信したりすることはできません。 それを行うには、ストリーム上で、後述する**チャンネル**に接続する必要があります。 + +**ストリームでのやり取りはすべてJSONです。** + +## Канали +MisskeyのストリーミングAPIにはチャンネルという概念があります。これは、送受信する情報を分離するための仕組みです。 Misskeyのストリームに接続しただけでは、まだリアルタイムでタイムラインの投稿を受信したりはできません。 ストリーム上でチャンネルに接続することで、様々な情報を受け取ったり情報を送信したりすることができるようになります。 + +### チャンネルに接続する +チャンネルに接続するには、次のようなデータをJSONでストリームに送信します: + +```json +{ + type: 'connect', + body: { + channel: 'xxxxxxxx', + id: 'foobar', + params: { + ... + } + } +} +``` + +ここで、 +* `channel`には接続したいチャンネル名を設定します。チャンネルの種類については後述します。 +* `id`にはそのチャンネルとやり取りするための任意のIDを設定します。ストリームでは様々なメッセージが流れるので、そのメッセージがどのチャンネルからのものなのか識別する必要があるからです。このIDは、UUIDや、乱数のようなもので構いません。 +* `params`はチャンネルに接続する際のパラメータです。チャンネルによって接続時に必要とされるパラメータは異なります。パラメータ不要のチャンネルに接続する際は、このプロパティは省略可能です。 + +
+

IDはチャンネルごとではなく「チャンネルの接続ごと」です。なぜなら、同じチャンネルに異なるパラメータで複数接続するケースもあるからです。

+
+ +### チャンネルからのメッセージを受け取る +例えばタイムラインのチャンネルなら、新しい投稿があった時にメッセージを発します。そのメッセージを受け取ることで、タイムラインに新しい投稿がされたことをリアルタイムで知ることができます。 + +チャンネルがメッセージを発すると、次のようなデータが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`には、エンドポイントのパラメータを含めます。 + +
+

APIのエンドポイントやパラメータについてはAPIリファレンスをご確認ください。

+
+ +### レスポンスの受信 + +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 000000000..df1e33a92 --- /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 000000000..92cf394d6 --- /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 000000000..0747cf875 --- /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 000000000..4a67622e3 --- /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 000000000..2e06db7d3 --- /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 000000000..9fc18a70f --- /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 000000000..73e9efdaa --- /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 000000000..115a2786f --- /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 000000000..07edd2a5c --- /dev/null +++ b/src/docs/zh-CN/keyboard-shortcut.md @@ -0,0 +1,68 @@ +# キーボードショートカット + +## 全局 +これらのショートカットは基本的にどこでも使えます。 + + + + + + + + + + + +
ショートカット効果由来
P, N新規投稿Post, New, Note
Tタイムラインの最も新しい投稿にフォーカスTimeline, Top
Shift + N通知を表示/隠すNotifications
S搜索Search
H, ?ヘルプを表示Help
+ +## 投稿にフォーカスされた状態 + + + + + + + + + + + + + + + + + + + +
ショートカット効果由来
, K, Shift + Tab上の投稿にフォーカスを移動-
, J, Tab下の投稿にフォーカスを移動-
R返信フォームを開くReply
QRenoteフォームを開くQuote
Ctrl + Q即刻Renoteする(フォームを開かずに)-
E, A, +リアクションフォームを開くEmote, reAction
0~9数字に対応したリアクションをする(対応については後述)-
F, Bお気に入りに登録Favorite, Bookmark
Del, Ctrl + D投稿を削除Delete
M, O投稿に対するメニューを開くMore, Other
SCWで隠された部分を表示 or 隠すShow, See
Escフォーカスを外す-
+ +## Renoteフォーム + + + + + + + + + + +
ショートカット効果由来
EnterRenoteする-
Qフォームを展開するQuote
Escフォームを閉じる-
+ +## リアクションフォーム +デフォルトで「👍」にフォーカスが当たっている状態です。 + + + + + + + + + + + + + +
ショートカット効果由来
, K上のリアクションにフォーカスを移動-
, J下のリアクションにフォーカスを移動-
, H, Shift + Tab左のリアクションにフォーカスを移動-
, L, Tab右のリアクションにフォーカスを移動-
Enter, Space, +リアクション確定-
0~9数字に対応したリアクションで確定-
Escリアクションするのをやめる-
diff --git a/src/docs/zh-CN/mfm.md b/src/docs/zh-CN/mfm.md new file mode 100644 index 000000000..e237287ac --- /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 000000000..502e04ea8 --- /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 000000000..d0d20dcbe --- /dev/null +++ b/src/docs/zh-CN/pages.md @@ -0,0 +1,10 @@ +# Pages + +## 变量 +変数を使うことで動的なページを作成できます。テキスト内で { 変数名 } と書くとそこに変数の値を埋め込めます。例えば Hello { thing } world! というテキストで、変数(thing)の値が ai だった場合、テキストは Hello ai world! になります。 + +変数の評価(値を算出すること)は上から下に行われるので、ある変数の中で自分より下の変数を参照することはできません。例えば上から A、B、C と3つの変数を定義したとき、Cの中でABを参照することはできますが、Aの中でBCを参照することはできません。 + +ユーザーからの入力を受け取るには、ページに「ユーザー入力」ブロックを設置し、「変数名」に入力を格納したい変数名を設定します(変数は自動で作成されます)。その変数を使ってユーザー入力に応じた動作を行えます。 + +関数を使うと、値の算出処理を再利用可能な形にまとめることができます。関数を作るには、「関数」タイプの変数を作成します。関数にはスロット(引数)を設定することができ、スロットの値は関数内で変数として利用可能です。また、関数を引数に取る関数(高階関数と呼ばれます)も存在します。関数は予め定義しておくほかに、このような高階関数のスロットに即席でセットすることもできます。 diff --git a/src/docs/zh-CN/reaction.md b/src/docs/zh-CN/reaction.md new file mode 100644 index 000000000..89fc8ba8b --- /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 000000000..c89ec0cbe --- /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`。 + +## 投了する +投了をするには、このエンドポイントにリクエストします。 diff --git a/src/docs/zh-CN/stream.md b/src/docs/zh-CN/stream.md new file mode 100644 index 000000000..91d4d0e92 --- /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キーや、アプリケーションからストリームに接続する際はユーザーのアクセストークンのことを指します。 + +
+

認証情報の取得については、こちらのドキュメントをご確認ください。

+
+ +--- + +認証情報は省略することもできますが、その場合非ログインでの利用ということになり、受信できる情報や可能な操作は限られます。例: + +``` +%WS_URL%/streaming +``` + +--- + +ストリームに接続すると、後述するAPI操作や、投稿の購読を行ったりすることができます。 しかしまだこの段階では、例えばタイムラインへの新しい投稿を受信したりすることはできません。 それを行うには、ストリーム上で、後述する**チャンネル**に接続する必要があります。 + +**ストリームでのやり取りはすべてJSONです。** + +## 频道 +MisskeyのストリーミングAPIにはチャンネルという概念があります。これは、送受信する情報を分離するための仕組みです。 Misskeyのストリームに接続しただけでは、まだリアルタイムでタイムラインの投稿を受信したりはできません。 ストリーム上でチャンネルに接続することで、様々な情報を受け取ったり情報を送信したりすることができるようになります。 + +### チャンネルに接続する +チャンネルに接続するには、次のようなデータをJSONでストリームに送信します: + +```json +{ + type: 'connect', + body: { + channel: 'xxxxxxxx', + id: 'foobar', + params: { + ... + } + } +} +``` + +ここで、 +* `channel`には接続したいチャンネル名を設定します。チャンネルの種類については後述します。 +* `id`にはそのチャンネルとやり取りするための任意のIDを設定します。ストリームでは様々なメッセージが流れるので、そのメッセージがどのチャンネルからのものなのか識別する必要があるからです。このIDは、UUIDや、乱数のようなもので構いません。 +* `params`はチャンネルに接続する際のパラメータです。チャンネルによって接続時に必要とされるパラメータは異なります。パラメータ不要のチャンネルに接続する際は、このプロパティは省略可能です。 + +
+

IDはチャンネルごとではなく「チャンネルの接続ごと」です。なぜなら、同じチャンネルに異なるパラメータで複数接続するケースもあるからです。

+
+ +### チャンネルからのメッセージを受け取る +例えばタイムラインのチャンネルなら、新しい投稿があった時にメッセージを発します。そのメッセージを受け取ることで、タイムラインに新しい投稿がされたことをリアルタイムで知ることができます。 + +チャンネルがメッセージを発すると、次のようなデータが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`には、エンドポイントのパラメータを含めます。 + +
+

APIのエンドポイントやパラメータについてはAPIリファレンスをご確認ください。

+
+ +### レスポンスの受信 + +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 000000000..041625867 --- /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 000000000..3ac1e114d --- /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 000000000..461478ddd --- /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 000000000..fed245804 --- /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 000000000..d02832c84 --- /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 000000000..193cf3eb4 --- /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 000000000..2e6161843 --- /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 000000000..03d6d40f8 --- /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 000000000..a33a28c60 --- /dev/null +++ b/src/docs/zh-TW/keyboard-shortcut.md @@ -0,0 +1,68 @@ +# キーボードショートカット + +## 全域 +これらのショートカットは基本的にどこでも使えます。 + + + + + + + + + + + +
快速鍵功能由來
P, N新規投稿Post, New, Note
Tタイムラインの最も新しい投稿にフォーカスTimeline, Top
Shift + N通知を表示/隠すNotifications
S搜尋Search
H, ?ヘルプを表示Help
+ +## 投稿にフォーカスされた状態 + + + + + + + + + + + + + + + + + + + +
快速鍵功能由來
, K, Shift + Tab上の投稿にフォーカスを移動-
, J, Tab下の投稿にフォーカスを移動-
R返信フォームを開くReply
QRenoteフォームを開くQuote
Ctrl + Q即刻Renoteする(フォームを開かずに)-
E, A, +リアクションフォームを開くEmote, reAction
0~9数字に対応したリアクションをする(対応については後述)-
F, Bお気に入りに登録Favorite, Bookmark
Del, Ctrl + D投稿を削除Delete
M, O投稿に対するメニューを開くMore, Other
SCWで隠された部分を表示 or 隠すShow, See
Escフォーカスを外す-
+ +## Renoteフォーム + + + + + + + + + + +
快速鍵功能由來
EnterRenoteする-
Qフォームを展開するQuote
Escフォームを閉じる-
+ +## リアクションフォーム +デフォルトで「👍」にフォーカスが当たっている状態です。 + + + + + + + + + + + + + +
快速鍵功能由來
, K上のリアクションにフォーカスを移動-
, J下のリアクションにフォーカスを移動-
, H, Shift + Tab左のリアクションにフォーカスを移動-
, L, Tab右のリアクションにフォーカスを移動-
Enter, Space, +リアクション確定-
0~9数字に対応したリアクションで確定-
Escリアクションするのをやめる-
diff --git a/src/docs/zh-TW/mfm.md b/src/docs/zh-TW/mfm.md new file mode 100644 index 000000000..e237287ac --- /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 000000000..7d17ef432 --- /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 000000000..7e88aa9a4 --- /dev/null +++ b/src/docs/zh-TW/pages.md @@ -0,0 +1,10 @@ +# Pages + +## 變數 +変数を使うことで動的なページを作成できます。テキスト内で { 変数名 } と書くとそこに変数の値を埋め込めます。例えば Hello { thing } world! というテキストで、変数(thing)の値が ai だった場合、テキストは Hello ai world! になります。 + +変数の評価(値を算出すること)は上から下に行われるので、ある変数の中で自分より下の変数を参照することはできません。例えば上から A、B、C と3つの変数を定義したとき、Cの中でABを参照することはできますが、Aの中でBCを参照することはできません。 + +ユーザーからの入力を受け取るには、ページに「ユーザー入力」ブロックを設置し、「変数名」に入力を格納したい変数名を設定します(変数は自動で作成されます)。その変数を使ってユーザー入力に応じた動作を行えます。 + +関数を使うと、値の算出処理を再利用可能な形にまとめることができます。関数を作るには、「関数」タイプの変数を作成します。関数にはスロット(引数)を設定することができ、スロットの値は関数内で変数として利用可能です。また、関数を引数に取る関数(高階関数と呼ばれます)も存在します。関数は予め定義しておくほかに、このような高階関数のスロットに即席でセットすることもできます。 diff --git a/src/docs/zh-TW/reaction.md b/src/docs/zh-TW/reaction.md new file mode 100644 index 000000000..f807f9cd2 --- /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 000000000..987b24971 --- /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`。 + +## 投了する +投了をするには、このエンドポイントにリクエストします。 diff --git a/src/docs/zh-TW/stream.md b/src/docs/zh-TW/stream.md new file mode 100644 index 000000000..67171ec1f --- /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キーや、アプリケーションからストリームに接続する際はユーザーのアクセストークンのことを指します。 + +
+

認証情報の取得については、こちらのドキュメントをご確認ください。

+
+ +--- + +認証情報は省略することもできますが、その場合非ログインでの利用ということになり、受信できる情報や可能な操作は限られます。例: + +``` +%WS_URL%/streaming +``` + +--- + +ストリームに接続すると、後述するAPI操作や、投稿の購読を行ったりすることができます。 しかしまだこの段階では、例えばタイムラインへの新しい投稿を受信したりすることはできません。 それを行うには、ストリーム上で、後述する**チャンネル**に接続する必要があります。 + +**ストリームでのやり取りはすべてJSONです。** + +## 頻道 +MisskeyのストリーミングAPIにはチャンネルという概念があります。これは、送受信する情報を分離するための仕組みです。 Misskeyのストリームに接続しただけでは、まだリアルタイムでタイムラインの投稿を受信したりはできません。 ストリーム上でチャンネルに接続することで、様々な情報を受け取ったり情報を送信したりすることができるようになります。 + +### チャンネルに接続する +チャンネルに接続するには、次のようなデータをJSONでストリームに送信します: + +```json +{ + type: 'connect', + body: { + channel: 'xxxxxxxx', + id: 'foobar', + params: { + ... + } + } +} +``` + +ここで、 +* `channel`には接続したいチャンネル名を設定します。チャンネルの種類については後述します。 +* `id`にはそのチャンネルとやり取りするための任意のIDを設定します。ストリームでは様々なメッセージが流れるので、そのメッセージがどのチャンネルからのものなのか識別する必要があるからです。このIDは、UUIDや、乱数のようなもので構いません。 +* `params`はチャンネルに接続する際のパラメータです。チャンネルによって接続時に必要とされるパラメータは異なります。パラメータ不要のチャンネルに接続する際は、このプロパティは省略可能です。 + +
+

IDはチャンネルごとではなく「チャンネルの接続ごと」です。なぜなら、同じチャンネルに異なるパラメータで複数接続するケースもあるからです。

+
+ +### チャンネルからのメッセージを受け取る +例えばタイムラインのチャンネルなら、新しい投稿があった時にメッセージを発します。そのメッセージを受け取ることで、タイムラインに新しい投稿がされたことをリアルタイムで知ることができます。 + +チャンネルがメッセージを発すると、次のようなデータが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`には、エンドポイントのパラメータを含めます。 + +
+

APIのエンドポイントやパラメータについてはAPIリファレンスをご確認ください。

+
+ +### レスポンスの受信 + +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 000000000..b6be9154a --- /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 000000000..892bfa201 --- /dev/null +++ b/src/docs/zh-TW/timelines.md @@ -0,0 +1,15 @@ +# 不同時間軸之間的分別 + +https://docs.google.com/spreadsheets/d/1lxQ2ugKrhz58Bg96HTDK_2F98BUritkMyIiBkOByjHA/edit?usp=sharing + +## 首頁 +自分のフォローしているユーザーの投稿 + +## 本地 +全てのローカルユーザーの「ホーム」指定されていない投稿 + +## 社群 +自分のフォローしているユーザーの投稿と、全てのローカルユーザーの「ホーム」指定されていない投稿 + +## 全域 +全てのローカルユーザーの「ホーム」指定されていない投稿と、サーバーに届いた全てのリモートユーザーの「ホーム」指定されていない投稿